From 21a62630815a685cd2663a5427488dc9e7ba0765 Mon Sep 17 00:00:00 2001 From: Marcus Kammer Date: Mon, 6 Mar 2023 11:43:03 +0100 Subject: [PATCH] Update info --- info/python311.info | 474234 +++++++++++++++++++++++++++++++++++++++++ info/sbcl.info-1.gz | Bin 0 -> 88616 bytes info/sbcl.info-2.gz | Bin 0 -> 68604 bytes info/sbcl.info.gz | Bin 0 -> 8248 bytes 4 files changed, 474234 insertions(+) create mode 100644 info/python311.info create mode 100644 info/sbcl.info-1.gz create mode 100644 info/sbcl.info-2.gz create mode 100644 info/sbcl.info.gz diff --git a/info/python311.info b/info/python311.info new file mode 100644 index 00000000..23df6d1c --- /dev/null +++ b/info/python311.info @@ -0,0 +1,474234 @@ +This is python.info, produced by makeinfo version 7.0.2 from +python.texi. + + Python 3.11.0, March 03, 2023 + + unknown + + Copyright © 2001-2023, Python Software Foundation + +INFO-DIR-SECTION Miscellaneous +START-INFO-DIR-ENTRY +* python: (python.info). One line description of project +END-INFO-DIR-ENTRY + + + Generated by Sphinx 4.5.0. + + +File: python.info, Node: Top, Next: What’s New in Python, Up: (dir) + +Python +****** + + Python 3.11.0, March 03, 2023 + + unknown + + Copyright © 2001-2023, Python Software Foundation + +* 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:: +* Distributing Python Modules:: +* Installing Python Modules:: +* Python HOWTOs:: +* Python Frequently Asked Questions:: +* Glossary:: +* About these documents:: +* Dealing with Bugs:: +* Copyright:: +* History and License:: +* Distributing Python Modules (Legacy version): Distributing Python Modules Legacy version. +* Installing Python Modules (Legacy version): Installing Python Modules Legacy version. +* Python Module Index:: +* Index:: + + — The Detailed Node Listing — + +What’s New in Python + +* 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.11 + +* Summary – Release highlights:: +* New Features:: +* New Features Related to Type Hints:: +* Other Language Changes:: +* Other CPython Implementation Changes:: +* New Modules:: +* Improved Modules:: +* Optimizations:: +* Faster CPython:: +* CPython bytecode changes:: +* Deprecated:: +* Pending Removal in Python 3.12: Pending Removal in Python 3 12. +* Removed:: +* Porting to Python 3.11: Porting to Python 3 11. +* Build Changes:: +* C API Changes:: + +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:: +* contextlib:: +* dataclasses:: +* datetime:: +* enum:: +* fractions:: +* functools:: +* hashlib:: +* IDLE and idlelib:: +* inspect:: +* locale:: +* logging:: +* math:: +* operator:: +* os:: +* pathlib:: +* re:: +* shutil:: +* socket:: +* sqlite3:: +* string:: +* sys:: +* sysconfig:: +* threading:: +* time:: +* traceback:: +* typing:: +* tkinter:: +* unicodedata:: +* unittest:: +* venv:: +* warnings:: +* zipfile:: +* fcntl:: + +Faster CPython + +* Faster Startup:: +* Faster Runtime:: +* Misc:: +* FAQ:: +* About:: + +Faster Startup + +* Frozen imports / Static code objects:: + +Faster Runtime + +* Cheaper, lazy Python frames: Cheaper lazy Python frames. +* Inlined Python function calls:: +* PEP 659; Specializing Adaptive Interpreter: PEP 659 Specializing Adaptive Interpreter. + +C API Changes + +* New Features: New Features<2>. +* Porting to Python 3.11: Porting to Python 3 11<2>. +* Deprecated: Deprecated<2>. +* Pending Removal in Python 3.12: Pending Removal in Python 3 12<2>. +* Removed: Removed<2>. + +What’s New In Python 3.10 + +* Summary – Release highlights: Summary – Release highlights<2>. +* New Features: New Features<3>. +* New Features Related to Type Hints: New Features Related to Type Hints<2>. +* Other Language Changes: Other Language Changes<2>. +* New Modules: New Modules<2>. +* Improved Modules: Improved Modules<2>. +* Optimizations: Optimizations<2>. +* Deprecated: Deprecated<3>. +* Removed: Removed<3>. +* Porting to Python 3.10: Porting to Python 3 10. +* CPython bytecode changes: CPython bytecode changes<2>. +* Build Changes: Build Changes<2>. +* C API Changes: C API Changes<2>. + +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<2>. +* argparse:: +* array:: +* asynchat, asyncore, smtpd: asynchat asyncore smtpd. +* base64:: +* bdb:: +* bisect:: +* codecs:: +* collections.abc: collections abc. +* contextlib: contextlib<2>. +* curses:: +* dataclasses: dataclasses<2>. +* distutils:: +* doctest:: +* encodings:: +* enum: enum<2>. +* fileinput:: +* faulthandler:: +* gc:: +* glob:: +* hashlib: hashlib<2>. +* hmac:: +* IDLE and idlelib: IDLE and idlelib<2>. +* importlib.metadata: importlib metadata. +* inspect: inspect<2>. +* itertools:: +* linecache:: +* os: os<2>. +* os.path: os path. +* pathlib: pathlib<2>. +* platform:: +* pprint:: +* py_compile:: +* pyclbr:: +* shelve:: +* statistics:: +* site:: +* socket: socket<2>. +* ssl:: +* sqlite3: sqlite3<2>. +* sys: sys<2>. +* _thread:: +* threading: threading<2>. +* traceback: traceback<2>. +* types:: +* typing: typing<2>. +* unittest: unittest<2>. +* urllib.parse: urllib parse. +* xml:: +* zipimport:: + +dataclasses + +* __slots__:: +* Keyword-only fields:: + +Porting to Python 3.10 + +* Changes in the Python syntax:: +* Changes in the Python API:: +* Changes in the C API:: + +C API Changes + +* PEP 652; Maintaining the Stable ABI: PEP 652 Maintaining the Stable ABI. +* New Features: New Features<4>. +* Porting to Python 3.10: Porting to Python 3 10<2>. +* Deprecated: Deprecated<4>. +* Removed: Removed<4>. + +What’s New In Python 3.9 + +* Summary – Release highlights: Summary – Release highlights<3>. +* You should check for DeprecationWarning in your code:: +* New Features: New Features<5>. +* Other Language Changes: Other Language Changes<3>. +* New Modules: New Modules<3>. +* Improved Modules: Improved Modules<3>. +* Optimizations: Optimizations<3>. +* Deprecated: Deprecated<5>. +* Removed: Removed<5>. +* Porting to Python 3.9: Porting to Python 3 9. +* Build Changes: Build Changes<3>. +* C API Changes: C API Changes<3>. +* 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. + +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:: + +Improved Modules + +* ast:: +* asyncio: asyncio<3>. +* compileall:: +* concurrent.futures: concurrent futures. +* curses: curses<2>. +* datetime: datetime<2>. +* distutils: distutils<2>. +* fcntl: fcntl<2>. +* ftplib:: +* gc: gc<2>. +* hashlib: hashlib<3>. +* http:: +* IDLE and idlelib: IDLE and idlelib<3>. +* imaplib:: +* importlib:: +* inspect: inspect<3>. +* ipaddress:: +* math: math<2>. +* multiprocessing:: +* nntplib:: +* os: os<3>. +* pathlib: pathlib<3>. +* pdb:: +* poplib:: +* pprint: pprint<2>. +* pydoc:: +* random:: +* signal:: +* smtplib:: +* socket: socket<3>. +* time: time<2>. +* sys: sys<3>. +* tracemalloc:: +* typing: typing<3>. +* unicodedata: unicodedata<2>. +* venv: venv<2>. +* xml: xml<2>. + +Porting to Python 3.9 + +* Changes in the Python API: Changes in the Python API<2>. +* Changes in the C API: Changes in the C API<2>. +* CPython bytecode changes: CPython bytecode changes<3>. + +C API Changes + +* New Features: New Features<6>. +* Porting to Python 3.9: Porting to Python 3 9<2>. +* Removed: Removed<6>. + +Notable changes in Python 3.9.1 + +* typing: typing<4>. +* 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>. + +What’s New In Python 3.8 + +* Summary – Release highlights: Summary – Release highlights<4>. +* New Features: New Features<7>. +* Other Language Changes: Other Language Changes<4>. +* New Modules: New Modules<4>. +* Improved Modules: Improved Modules<4>. +* Optimizations: Optimizations<4>. +* Build and C API Changes:: +* Deprecated: Deprecated<6>. +* 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.8: Notable changes in Python 3 8 8. +* Notable changes in Python 3.8.12: Notable changes in Python 3 8 12. + +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<2>. +* asyncio: asyncio<4>. +* builtins:: +* collections:: +* cProfile:: +* csv:: +* curses: curses<3>. +* ctypes:: +* datetime: datetime<3>. +* functools: functools<2>. +* gc: gc<3>. +* gettext:: +* gzip:: +* IDLE and idlelib: IDLE and idlelib<4>. +* inspect: inspect<4>. +* io:: +* itertools: itertools<2>. +* json.tool: json tool. +* logging: logging<2>. +* math: math<3>. +* mmap:: +* multiprocessing: multiprocessing<2>. +* os: os<4>. +* os.path: os path<2>. +* pathlib: pathlib<4>. +* pickle:: +* plistlib:: +* pprint: pprint<3>. +* py_compile: py_compile<2>. +* shlex:: +* shutil: shutil<2>. +* socket: socket<4>. +* ssl: ssl<2>. +* statistics: statistics<2>. +* sys: sys<4>. +* tarfile:: +* threading: threading<3>. +* tokenize:: +* tkinter: tkinter<2>. +* time: time<3>. +* typing: typing<5>. +* unicodedata: unicodedata<3>. +* unittest: unittest<3>. +* venv: venv<3>. +* weakref:: +* xml: xml<3>. +* xmlrpc:: + +Porting to Python 3.8 + +* Changes in Python behavior:: +* Changes in the Python API: Changes in the Python API<3>. +* Changes in the C API: Changes in the C API<3>. +* CPython bytecode changes: CPython bytecode changes<4>. +* Demos and Tools:: + +What’s New In Python 3.7 + +* Summary – Release Highlights:: +* New Features: New Features<8>. +* Other Language Changes: Other Language Changes<5>. +* New Modules: New Modules<5>. +* Improved Modules: Improved Modules<5>. +* C API Changes: C API Changes<4>. +* Build Changes: Build Changes<4>. +* Optimizations: Optimizations<5>. +* Other CPython Implementation Changes: Other CPython Implementation Changes<2>. +* Deprecated Python Behavior:: +* Deprecated Python modules, 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. + +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:: +* dataclasses: dataclasses<3>. +* importlib.resources: importlib resources. + +Improved Modules + +* argparse: argparse<2>. +* asyncio: asyncio<5>. +* binascii:: +* calendar:: +* collections: collections<2>. +* compileall: compileall<2>. +* concurrent.futures: concurrent futures<2>. +* contextlib: contextlib<3>. +* cProfile: cProfile<2>. +* crypt:: +* datetime: datetime<4>. +* dbm:: +* decimal:: +* dis:: +* distutils: distutils<3>. +* enum: enum<3>. +* functools: functools<3>. +* gc: gc<4>. +* hmac: hmac<2>. +* http.client: http client. +* http.server: http server. +* idlelib and IDLE:: +* importlib: importlib<2>. +* io: io<2>. +* ipaddress: ipaddress<2>. +* itertools: itertools<3>. +* locale: locale<2>. +* logging: logging<3>. +* math: math<4>. +* mimetypes:: +* msilib:: +* multiprocessing: multiprocessing<3>. +* os: os<5>. +* pathlib: pathlib<5>. +* pdb: pdb<2>. +* py_compile: py_compile<3>. +* pydoc: pydoc<2>. +* queue:: +* re: re<2>. +* signal: signal<2>. +* socket: socket<5>. +* socketserver:: +* sqlite3: sqlite3<3>. +* ssl: ssl<3>. +* string: string<2>. +* subprocess:: +* sys: sys<5>. +* time: time<4>. +* tkinter: tkinter<3>. +* tracemalloc: tracemalloc<2>. +* types: types<2>. +* unicodedata: unicodedata<4>. +* unittest: unittest<4>. +* unittest.mock: unittest mock. +* urllib.parse: urllib parse<3>. +* uu:: +* uuid:: +* warnings: warnings<2>. +* xml.etree: xml etree. +* xmlrpc.server: xmlrpc server. +* zipapp:: +* zipfile: zipfile<2>. + +Deprecated Python modules, functions and methods + +* aifc:: +* asyncio: asyncio<6>. +* collections: collections<3>. +* dbm: dbm<2>. +* enum: enum<4>. +* gettext: gettext<2>. +* importlib: importlib<3>. +* locale: locale<3>. +* macpath:: +* threading: threading<4>. +* socket: socket<6>. +* ssl: ssl<4>. +* sunau:: +* sys: sys<6>. +* wave:: + +Porting to Python 3.7 + +* Changes in Python Behavior:: +* Changes in the Python API: Changes in the Python API<4>. +* Changes in the C API: Changes in the C API<4>. +* CPython bytecode changes: CPython bytecode changes<5>. +* Windows-only Changes: Windows-only Changes<2>. +* Other CPython implementation changes:: + +What’s New In Python 3.6 + +* Summary – Release highlights: Summary – Release highlights<5>. +* New Features: New Features<9>. +* Other Language Changes: Other Language Changes<6>. +* New Modules: New Modules<6>. +* Improved Modules: Improved Modules<6>. +* Optimizations: Optimizations<6>. +* Build and C API Changes: Build and C API Changes<2>. +* Other Improvements:: +* Deprecated: Deprecated<7>. +* Removed: Removed<7>. +* 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. + +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<2>. +* ast: ast<3>. +* asyncio: asyncio<7>. +* binascii: binascii<2>. +* cmath:: +* collections: collections<4>. +* concurrent.futures: concurrent futures<3>. +* contextlib: contextlib<4>. +* datetime: datetime<5>. +* decimal: decimal<2>. +* distutils: distutils<4>. +* email:: +* encodings: encodings<2>. +* enum: enum<5>. +* faulthandler: faulthandler<2>. +* fileinput: fileinput<2>. +* hashlib: hashlib<4>. +* http.client: http client<2>. +* idlelib and IDLE: idlelib and IDLE<2>. +* importlib: importlib<4>. +* inspect: inspect<5>. +* json:: +* logging: logging<4>. +* math: math<5>. +* multiprocessing: multiprocessing<4>. +* os: os<6>. +* pathlib: pathlib<6>. +* pdb: pdb<3>. +* pickle: pickle<2>. +* pickletools:: +* pydoc: pydoc<3>. +* random: random<2>. +* re: re<3>. +* readline:: +* rlcompleter:: +* shlex: shlex<2>. +* site: site<2>. +* sqlite3: sqlite3<4>. +* socket: socket<7>. +* socketserver: socketserver<2>. +* ssl: ssl<5>. +* statistics: statistics<3>. +* struct:: +* subprocess: subprocess<2>. +* sys: sys<7>. +* telnetlib:: +* time: time<5>. +* timeit:: +* tkinter: tkinter<4>. +* traceback: traceback<3>. +* tracemalloc: tracemalloc<3>. +* typing: typing<6>. +* unicodedata: unicodedata<5>. +* unittest.mock: unittest mock<2>. +* urllib.request: urllib request. +* urllib.robotparser: urllib robotparser. +* venv: venv<4>. +* warnings: warnings<3>. +* winreg:: +* winsound:: +* xmlrpc.client: xmlrpc client. +* zipfile: zipfile<3>. +* zlib:: + +Deprecated + +* New Keywords:: +* Deprecated Python behavior:: +* Deprecated Python modules, functions and methods: Deprecated Python modules functions and methods<2>. +* 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<3>. +* distutils: distutils<5>. +* grp:: +* importlib: importlib<5>. +* os: os<7>. +* re: re<4>. +* ssl: ssl<6>. +* tkinter: tkinter<5>. +* venv: venv<5>. + +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<5>. +* Changes in the C API: Changes in the C API<5>. +* CPython bytecode changes: CPython bytecode changes<6>. + +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<6>. +* New Features: New Features<10>. +* Other Language Changes: Other Language Changes<7>. +* New Modules: New Modules<7>. +* Improved Modules: Improved Modules<7>. +* Other module-level changes:: +* Optimizations: Optimizations<7>. +* Build and C API Changes: Build and C API Changes<3>. +* Deprecated: Deprecated<8>. +* Removed: Removed<8>. +* 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<7>. +* zipapp: zipapp<2>. + +Improved Modules + +* argparse: argparse<3>. +* asyncio: asyncio<8>. +* bz2:: +* cgi:: +* cmath: cmath<2>. +* code:: +* collections: collections<5>. +* collections.abc: collections abc<3>. +* compileall: compileall<3>. +* concurrent.futures: concurrent futures<4>. +* configparser:: +* contextlib: contextlib<5>. +* csv: csv<2>. +* curses: curses<4>. +* dbm: dbm<4>. +* difflib:: +* distutils: distutils<6>. +* doctest: doctest<2>. +* email: email<2>. +* enum: enum<6>. +* faulthandler: faulthandler<3>. +* functools: functools<4>. +* glob: glob<2>. +* gzip: gzip<2>. +* heapq:: +* http: http<2>. +* http.client: http client<3>. +* idlelib and IDLE: idlelib and IDLE<3>. +* imaplib: imaplib<2>. +* imghdr:: +* importlib: importlib<6>. +* inspect: inspect<6>. +* io: io<3>. +* ipaddress: ipaddress<3>. +* json: json<2>. +* linecache: linecache<2>. +* locale: locale<4>. +* logging: logging<5>. +* lzma:: +* math: math<6>. +* multiprocessing: multiprocessing<5>. +* operator: operator<2>. +* os: os<8>. +* pathlib: pathlib<7>. +* pickle: pickle<3>. +* poplib: poplib<2>. +* re: re<5>. +* readline: readline<2>. +* selectors:: +* shutil: shutil<3>. +* signal: signal<3>. +* smtpd:: +* smtplib: smtplib<2>. +* sndhdr:: +* socket: socket<8>. +* ssl: ssl<7>. +* sqlite3: sqlite3<5>. +* subprocess: subprocess<3>. +* sys: sys<8>. +* sysconfig: sysconfig<2>. +* tarfile: tarfile<2>. +* threading: threading<5>. +* time: time<6>. +* timeit: timeit<2>. +* tkinter: tkinter<6>. +* traceback: traceback<4>. +* types: types<3>. +* unicodedata: unicodedata<6>. +* unittest: unittest<5>. +* unittest.mock: unittest mock<3>. +* urllib:: +* wsgiref:: +* xmlrpc: xmlrpc<2>. +* xml.sax: xml sax. +* zipfile: zipfile<4>. + +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, 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<6>. +* Changes in the C API: Changes in the C API<6>. + +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<2>. +* New Features: New Features<11>. +* New Modules: New Modules<8>. +* Improved Modules: Improved Modules<8>. +* CPython Implementation Changes:: +* Deprecated: Deprecated<9>. +* Removed: Removed<9>. +* 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<8>. + +PEP 453: Explicit Bootstrapping of PIP in Python Installations + +* Bootstrapping pip By Default:: +* Documentation Changes:: + +New Modules + +* asyncio: asyncio<9>. +* ensurepip:: +* enum: enum<7>. +* pathlib: pathlib<8>. +* selectors: selectors<2>. +* statistics: statistics<4>. +* tracemalloc: tracemalloc<4>. + +Improved Modules + +* abc:: +* aifc: aifc<2>. +* argparse: argparse<4>. +* audioop:: +* base64: base64<2>. +* collections: collections<6>. +* colorsys:: +* contextlib: contextlib<6>. +* dbm: dbm<5>. +* dis: dis<2>. +* doctest: doctest<3>. +* email: email<3>. +* filecmp:: +* functools: functools<5>. +* gc: gc<5>. +* glob: glob<3>. +* hashlib: hashlib<5>. +* hmac: hmac<3>. +* html:: +* http: http<3>. +* idlelib and IDLE: idlelib and IDLE<4>. +* importlib: importlib<7>. +* inspect: inspect<7>. +* ipaddress: ipaddress<4>. +* logging: logging<6>. +* marshal:: +* mmap: mmap<2>. +* multiprocessing: multiprocessing<6>. +* operator: operator<3>. +* os: os<9>. +* pdb: pdb<4>. +* pickle: pickle<4>. +* plistlib: plistlib<2>. +* poplib: poplib<3>. +* pprint: pprint<4>. +* pty:: +* pydoc: pydoc<4>. +* re: re<6>. +* resource:: +* select:: +* shelve: shelve<2>. +* shutil: shutil<4>. +* smtpd: smtpd<2>. +* smtplib: smtplib<3>. +* socket: socket<9>. +* sqlite3: sqlite3<6>. +* ssl: ssl<8>. +* stat:: +* struct: struct<2>. +* subprocess: subprocess<4>. +* sunau: sunau<2>. +* sys: sys<9>. +* tarfile: tarfile<3>. +* textwrap:: +* threading: threading<6>. +* traceback: traceback<5>. +* types: types<4>. +* urllib: urllib<2>. +* unittest: unittest<6>. +* venv: venv<6>. +* wave: wave<2>. +* weakref: weakref<2>. +* xml.etree: xml etree<2>. +* zipfile: zipfile<5>. + +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<7>. +* Changes in the C API: Changes in the C API<7>. + +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<7>. +* 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<9>. +* A Finer-Grained Import Lock:: +* Builtin functions and types:: +* New Modules: New Modules<9>. +* Improved Modules: Improved Modules<9>. +* Optimizations: Optimizations<8>. +* Build and C API Changes: Build and C API Changes<4>. +* Deprecated: Deprecated<10>. +* 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<4>. +* ipaddress: ipaddress<5>. +* lzma: lzma<2>. + +Improved Modules + +* abc: abc<2>. +* array: array<3>. +* base64: base64<3>. +* binascii: binascii<3>. +* bz2: bz2<2>. +* codecs: codecs<2>. +* collections: collections<7>. +* contextlib: contextlib<7>. +* crypt: crypt<2>. +* curses: curses<5>. +* datetime: datetime<6>. +* decimal: decimal<3>. +* email: email<4>. +* ftplib: ftplib<2>. +* functools: functools<6>. +* gc: gc<6>. +* hmac: hmac<4>. +* http: http<4>. +* html: html<2>. +* imaplib: imaplib<3>. +* inspect: inspect<8>. +* io: io<4>. +* itertools: itertools<4>. +* logging: logging<7>. +* math: math<7>. +* mmap: mmap<3>. +* multiprocessing: multiprocessing<7>. +* nntplib: nntplib<2>. +* os: os<10>. +* pdb: pdb<5>. +* pickle: pickle<5>. +* pydoc: pydoc<5>. +* re: re<7>. +* sched:: +* select: select<2>. +* shlex: shlex<3>. +* shutil: shutil<5>. +* signal: signal<4>. +* smtpd: smtpd<3>. +* smtplib: smtplib<4>. +* socket: socket<10>. +* socketserver: socketserver<3>. +* sqlite3: sqlite3<7>. +* ssl: ssl<9>. +* stat: stat<2>. +* struct: struct<3>. +* subprocess: subprocess<5>. +* sys: sys<10>. +* tarfile: tarfile<4>. +* tempfile:: +* textwrap: textwrap<2>. +* threading: threading<7>. +* time: time<7>. +* types: types<5>. +* unittest: unittest<7>. +* urllib: urllib<3>. +* webbrowser:: +* xml.etree.ElementTree: xml etree ElementTree. +* zlib: zlib<2>. + +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, 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<10>. +* New, Improved, and Deprecated Modules: New Improved and Deprecated Modules. +* Multi-threading:: +* Optimizations: Optimizations<9>. +* 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<5>. +* elementtree:: +* functools: functools<7>. +* itertools: itertools<5>. +* collections: collections<8>. +* threading: threading<8>. +* datetime and time:: +* math: math<8>. +* abc: abc<3>. +* io: io<5>. +* reprlib:: +* logging: logging<8>. +* csv: csv<3>. +* contextlib: contextlib<8>. +* decimal and fractions:: +* ftp:: +* popen:: +* select: select<3>. +* gzip and zipfile:: +* tarfile: tarfile<5>. +* hashlib: hashlib<6>. +* ast: ast<4>. +* os: os<11>. +* shutil: shutil<6>. +* sqlite3: sqlite3<8>. +* html: html<3>. +* socket: socket<11>. +* ssl: ssl<10>. +* nntp:: +* certificates:: +* imaplib: imaplib<4>. +* http.client: http client<4>. +* unittest: unittest<8>. +* random: random<3>. +* poplib: poplib<4>. +* asyncore: asyncore<2>. +* tempfile: tempfile<2>. +* inspect: inspect<9>. +* pydoc: pydoc<6>. +* dis: dis<3>. +* dbm: dbm<6>. +* ctypes: ctypes<2>. +* site: site<3>. +* sysconfig: sysconfig<3>. +* pdb: pdb<6>. +* configparser: configparser<2>. +* urllib.parse: urllib parse<4>. +* 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<11>. +* New, Improved, and Deprecated Modules: New Improved and Deprecated Modules<2>. +* Optimizations: Optimizations<10>. +* 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<12>. +* 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<11>. + +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<13>. +* 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<12>. +* 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<14>. +* New, Improved, 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<13>. + +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<15>. +* New, Improved, 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<14>. + +New, Improved, and Deprecated Modules + +* cookielib:: +* doctest: doctest<4>. + +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<16>. +* New, Improved, 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<15>. + +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:: +* 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 3.11.0 final: Python 3 11 0 final. +* Python 3.11.0 release candidate 2: Python 3 11 0 release candidate 2. +* Python 3.11.0 release candidate 1: Python 3 11 0 release candidate 1. +* Python 3.11.0 beta 5: Python 3 11 0 beta 5. +* Python 3.11.0 beta 4: Python 3 11 0 beta 4. +* Python 3.11.0 beta 3: Python 3 11 0 beta 3. +* Python 3.11.0 beta 2: Python 3 11 0 beta 2. +* 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 3.11.0 final + +* Security:: +* Core and Builtins:: +* Library:: +* Documentation: Documentation<2>. +* Tests:: +* Build:: +* Windows:: +* macOS:: + +Python 3.11.0 release candidate 2 + +* Security: Security<2>. +* Core and Builtins: Core and Builtins<2>. +* Library: Library<2>. +* Documentation: Documentation<3>. +* Tests: Tests<2>. +* Build: Build<2>. +* Windows: Windows<2>. + +Python 3.11.0 release candidate 1 + +* Core and Builtins: Core and Builtins<3>. +* Library: Library<3>. +* Documentation: Documentation<4>. +* Tests: Tests<3>. +* Build: Build<3>. +* Windows: Windows<3>. +* IDLE: IDLE<3>. +* C API:: + +Python 3.11.0 beta 5 + +* Core and Builtins: Core and Builtins<4>. +* Library: Library<4>. +* Tests: Tests<4>. +* Build: Build<4>. +* Windows: Windows<4>. +* C API: C API<2>. + +Python 3.11.0 beta 4 + +* Security: Security<3>. +* Core and Builtins: Core and Builtins<5>. +* Library: Library<5>. +* Documentation: Documentation<5>. +* Tests: Tests<5>. +* Build: Build<5>. +* Windows: Windows<5>. +* Tools/Demos:: +* C API: C API<3>. + +Python 3.11.0 beta 3 + +* Core and Builtins: Core and Builtins<6>. +* Build: Build<6>. + +Python 3.11.0 beta 2 + +* Core and Builtins: Core and Builtins<7>. +* Library: Library<6>. +* Documentation: Documentation<6>. +* Tests: Tests<6>. +* Build: Build<7>. +* Windows: Windows<6>. +* C API: C API<4>. + +Python 3.11.0 beta 1 + +* Security: Security<4>. +* Core and Builtins: Core and Builtins<8>. +* Library: Library<7>. +* Documentation: Documentation<7>. +* Tests: Tests<7>. +* Build: Build<8>. +* Windows: Windows<7>. +* macOS: macOS<2>. +* Tools/Demos: Tools/Demos<2>. +* C API: C API<5>. + +Python 3.11.0 alpha 7 + +* Core and Builtins: Core and Builtins<9>. +* Library: Library<8>. +* Documentation: Documentation<8>. +* Tests: Tests<8>. +* Build: Build<9>. +* Windows: Windows<8>. +* macOS: macOS<3>. +* Tools/Demos: Tools/Demos<3>. +* C API: C API<6>. + +Python 3.11.0 alpha 6 + +* Core and Builtins: Core and Builtins<10>. +* Library: Library<9>. +* Documentation: Documentation<9>. +* Tests: Tests<9>. +* Build: Build<10>. +* Windows: Windows<9>. +* IDLE: IDLE<4>. +* C API: C API<7>. + +Python 3.11.0 alpha 5 + +* Core and Builtins: Core and Builtins<11>. +* Library: Library<10>. +* Documentation: Documentation<10>. +* Tests: Tests<10>. +* Build: Build<11>. +* Windows: Windows<10>. +* macOS: macOS<4>. +* IDLE: IDLE<5>. +* C API: C API<8>. + +Python 3.11.0 alpha 4 + +* Core and Builtins: Core and Builtins<12>. +* Library: Library<11>. +* Documentation: Documentation<11>. +* Tests: Tests<11>. +* Build: Build<12>. +* Windows: Windows<11>. +* macOS: macOS<5>. +* C API: C API<9>. + +Python 3.11.0 alpha 3 + +* Core and Builtins: Core and Builtins<13>. +* Library: Library<12>. +* Documentation: Documentation<12>. +* Tests: Tests<12>. +* Build: Build<13>. +* Windows: Windows<12>. +* macOS: macOS<6>. +* C API: C API<10>. + +Python 3.11.0 alpha 2 + +* Core and Builtins: Core and Builtins<14>. +* Library: Library<13>. +* Documentation: Documentation<13>. +* Tests: Tests<13>. +* Build: Build<14>. +* Windows: Windows<13>. +* macOS: macOS<7>. +* IDLE: IDLE<6>. +* C API: C API<11>. + +Python 3.11.0 alpha 1 + +* Security: Security<5>. +* Core and Builtins: Core and Builtins<15>. +* Library: Library<14>. +* Documentation: Documentation<14>. +* Tests: Tests<14>. +* Build: Build<15>. +* Windows: Windows<14>. +* macOS: macOS<8>. +* IDLE: IDLE<7>. +* Tools/Demos: Tools/Demos<4>. +* C API: C API<12>. + +Python 3.10.0 beta 1 + +* Security: Security<6>. +* Core and Builtins: Core and Builtins<16>. +* Library: Library<15>. +* Documentation: Documentation<15>. +* Tests: Tests<15>. +* Build: Build<16>. +* Windows: Windows<15>. +* macOS: macOS<9>. +* IDLE: IDLE<8>. +* C API: C API<13>. + +Python 3.10.0 alpha 7 + +* Security: Security<7>. +* Core and Builtins: Core and Builtins<17>. +* Library: Library<16>. +* Documentation: Documentation<16>. +* Tests: Tests<16>. +* Build: Build<17>. +* Windows: Windows<16>. +* IDLE: IDLE<9>. +* C API: C API<14>. + +Python 3.10.0 alpha 6 + +* Security: Security<8>. +* Core and Builtins: Core and Builtins<18>. +* Library: Library<17>. +* Documentation: Documentation<17>. +* Tests: Tests<17>. +* Build: Build<18>. +* Windows: Windows<17>. +* macOS: macOS<10>. +* IDLE: IDLE<10>. +* C API: C API<15>. + +Python 3.10.0 alpha 5 + +* Security: Security<9>. +* Core and Builtins: Core and Builtins<19>. +* Library: Library<18>. +* Documentation: Documentation<18>. +* Tests: Tests<18>. +* Build: Build<19>. +* Windows: Windows<18>. +* macOS: macOS<11>. +* IDLE: IDLE<11>. +* C API: C API<16>. + +Python 3.10.0 alpha 4 + +* Core and Builtins: Core and Builtins<20>. +* Library: Library<19>. +* Documentation: Documentation<19>. +* Tests: Tests<19>. +* Build: Build<20>. +* macOS: macOS<12>. +* Tools/Demos: Tools/Demos<5>. +* C API: C API<17>. + +Python 3.10.0 alpha 3 + +* Security: Security<10>. +* Core and Builtins: Core and Builtins<21>. +* Library: Library<20>. +* Documentation: Documentation<20>. +* Tests: Tests<20>. +* Build: Build<21>. +* Windows: Windows<19>. +* macOS: macOS<13>. +* IDLE: IDLE<12>. +* Tools/Demos: Tools/Demos<6>. +* C API: C API<18>. + +Python 3.10.0 alpha 2 + +* Security: Security<11>. +* Core and Builtins: Core and Builtins<22>. +* Library: Library<21>. +* Documentation: Documentation<21>. +* Tests: Tests<21>. +* Build: Build<22>. +* Windows: Windows<20>. +* macOS: macOS<14>. +* IDLE: IDLE<13>. +* C API: C API<19>. + +Python 3.10.0 alpha 1 + +* Security: Security<12>. +* Core and Builtins: Core and Builtins<23>. +* Library: Library<22>. +* Documentation: Documentation<22>. +* Tests: Tests<22>. +* Build: Build<23>. +* Windows: Windows<21>. +* macOS: macOS<15>. +* IDLE: IDLE<14>. +* C API: C API<20>. + +Python 3.9.0 beta 1 + +* Security: Security<13>. +* Core and Builtins: Core and Builtins<24>. +* Library: Library<23>. +* Documentation: Documentation<23>. +* Tests: Tests<23>. +* Build: Build<24>. +* Windows: Windows<22>. +* macOS: macOS<16>. +* Tools/Demos: Tools/Demos<7>. +* C API: C API<21>. + +Python 3.9.0 alpha 6 + +* Security: Security<14>. +* Core and Builtins: Core and Builtins<25>. +* Library: Library<24>. +* Documentation: Documentation<24>. +* Tests: Tests<24>. +* Build: Build<25>. +* Windows: Windows<23>. +* macOS: macOS<17>. +* IDLE: IDLE<15>. +* Tools/Demos: Tools/Demos<8>. +* C API: C API<22>. + +Python 3.9.0 alpha 5 + +* Security: Security<15>. +* Core and Builtins: Core and Builtins<26>. +* Library: Library<25>. +* Documentation: Documentation<25>. +* Tests: Tests<25>. +* Build: Build<26>. +* Windows: Windows<24>. +* macOS: macOS<18>. +* IDLE: IDLE<16>. +* Tools/Demos: Tools/Demos<9>. +* C API: C API<23>. + +Python 3.9.0 alpha 4 + +* Security: Security<16>. +* Core and Builtins: Core and Builtins<27>. +* Library: Library<26>. +* Documentation: Documentation<26>. +* Tests: Tests<26>. +* Build: Build<27>. +* Windows: Windows<25>. +* IDLE: IDLE<17>. +* C API: C API<24>. + +Python 3.9.0 alpha 3 + +* Core and Builtins: Core and Builtins<28>. +* Library: Library<27>. +* Documentation: Documentation<27>. +* Build: Build<28>. +* IDLE: IDLE<18>. +* C API: C API<25>. + +Python 3.9.0 alpha 2 + +* Security: Security<17>. +* Core and Builtins: Core and Builtins<29>. +* Library: Library<28>. +* Documentation: Documentation<28>. +* Tests: Tests<27>. +* Build: Build<29>. +* Windows: Windows<26>. +* macOS: macOS<19>. +* IDLE: IDLE<19>. +* C API: C API<26>. + +Python 3.9.0 alpha 1 + +* Security: Security<18>. +* Core and Builtins: Core and Builtins<30>. +* Library: Library<29>. +* Documentation: Documentation<29>. +* Tests: Tests<28>. +* Build: Build<30>. +* Windows: Windows<27>. +* macOS: macOS<20>. +* IDLE: IDLE<20>. +* Tools/Demos: Tools/Demos<10>. +* C API: C API<27>. + +Python 3.8.0 beta 1 + +* Security: Security<19>. +* Core and Builtins: Core and Builtins<31>. +* Library: Library<30>. +* Documentation: Documentation<30>. +* Tests: Tests<29>. +* Build: Build<31>. +* Windows: Windows<28>. +* macOS: macOS<21>. +* IDLE: IDLE<21>. +* Tools/Demos: Tools/Demos<11>. +* C API: C API<28>. + +Python 3.8.0 alpha 4 + +* Security: Security<20>. +* Core and Builtins: Core and Builtins<32>. +* Library: Library<31>. +* Documentation: Documentation<31>. +* Tests: Tests<30>. +* Build: Build<32>. +* Windows: Windows<29>. +* macOS: macOS<22>. +* IDLE: IDLE<22>. +* Tools/Demos: Tools/Demos<12>. +* C API: C API<29>. + +Python 3.8.0 alpha 3 + +* Security: Security<21>. +* Core and Builtins: Core and Builtins<33>. +* Library: Library<32>. +* Documentation: Documentation<32>. +* Tests: Tests<31>. +* Build: Build<33>. +* Windows: Windows<30>. +* IDLE: IDLE<23>. +* Tools/Demos: Tools/Demos<13>. +* C API: C API<30>. + +Python 3.8.0 alpha 2 + +* Core and Builtins: Core and Builtins<34>. +* Library: Library<33>. +* Documentation: Documentation<33>. +* Tests: Tests<32>. +* Windows: Windows<31>. +* IDLE: IDLE<24>. + +Python 3.8.0 alpha 1 + +* Security: Security<22>. +* Core and Builtins: Core and Builtins<35>. +* Library: Library<34>. +* Documentation: Documentation<34>. +* Tests: Tests<33>. +* Build: Build<34>. +* Windows: Windows<32>. +* macOS: macOS<23>. +* IDLE: IDLE<25>. +* Tools/Demos: Tools/Demos<14>. +* C API: C API<31>. + +Python 3.7.0 final + +* Library: Library<35>. +* C API: C API<32>. + +Python 3.7.0 release candidate 1 + +* Core and Builtins: Core and Builtins<36>. +* Library: Library<36>. +* Documentation: Documentation<35>. +* Build: Build<35>. +* Windows: Windows<33>. +* IDLE: IDLE<26>. + +Python 3.7.0 beta 5 + +* Core and Builtins: Core and Builtins<37>. +* Library: Library<37>. +* Documentation: Documentation<36>. +* Tests: Tests<34>. +* Build: Build<36>. +* macOS: macOS<24>. +* IDLE: IDLE<27>. + +Python 3.7.0 beta 4 + +* Core and Builtins: Core and Builtins<38>. +* Library: Library<38>. +* Documentation: Documentation<37>. +* Tests: Tests<35>. +* Build: Build<37>. +* Windows: Windows<34>. +* macOS: macOS<25>. +* IDLE: IDLE<28>. +* Tools/Demos: Tools/Demos<15>. + +Python 3.7.0 beta 3 + +* Security: Security<23>. +* Core and Builtins: Core and Builtins<39>. +* Library: Library<39>. +* Documentation: Documentation<38>. +* Tests: Tests<36>. +* Build: Build<38>. +* Windows: Windows<35>. +* macOS: macOS<26>. +* IDLE: IDLE<29>. +* Tools/Demos: Tools/Demos<16>. +* C API: C API<33>. + +Python 3.7.0 beta 2 + +* Security: Security<24>. +* Core and Builtins: Core and Builtins<40>. +* Library: Library<40>. +* Documentation: Documentation<39>. +* Tests: Tests<37>. +* Build: Build<39>. +* Windows: Windows<36>. +* macOS: macOS<27>. +* IDLE: IDLE<30>. +* Tools/Demos: Tools/Demos<17>. + +Python 3.7.0 beta 1 + +* Core and Builtins: Core and Builtins<41>. +* Library: Library<41>. +* Documentation: Documentation<40>. +* Tests: Tests<38>. +* Build: Build<40>. +* Windows: Windows<37>. +* macOS: macOS<28>. +* C API: C API<34>. + +Python 3.7.0 alpha 4 + +* Core and Builtins: Core and Builtins<42>. +* Library: Library<42>. +* Documentation: Documentation<41>. +* Tests: Tests<39>. +* Windows: Windows<38>. +* Tools/Demos: Tools/Demos<18>. +* C API: C API<35>. + +Python 3.7.0 alpha 3 + +* Core and Builtins: Core and Builtins<43>. +* Library: Library<43>. +* Documentation: Documentation<42>. +* Tests: Tests<40>. +* Build: Build<41>. +* Windows: Windows<39>. +* macOS: macOS<29>. +* IDLE: IDLE<31>. +* Tools/Demos: Tools/Demos<19>. +* C API: C API<36>. + +Python 3.7.0 alpha 2 + +* Core and Builtins: Core and Builtins<44>. +* Library: Library<44>. +* Documentation: Documentation<43>. +* Build: Build<42>. +* IDLE: IDLE<32>. +* C API: C API<37>. + +Python 3.7.0 alpha 1 + +* Security: Security<25>. +* Core and Builtins: Core and Builtins<45>. +* Library: Library<45>. +* Documentation: Documentation<44>. +* Tests: Tests<41>. +* Build: Build<43>. +* Windows: Windows<40>. +* IDLE: IDLE<33>. +* Tools/Demos: Tools/Demos<20>. +* C API: C API<38>. + +Python 3.6.6 release candidate 1 + +* Core and Builtins: Core and Builtins<46>. +* Library: Library<46>. +* Documentation: Documentation<45>. +* Tests: Tests<42>. +* Build: Build<44>. +* Windows: Windows<41>. +* macOS: macOS<30>. +* IDLE: IDLE<34>. +* Tools/Demos: Tools/Demos<21>. +* C API: C API<39>. + +Python 3.6.5 final + +* Tests: Tests<43>. +* Build: Build<45>. + +Python 3.6.5 release candidate 1 + +* Security: Security<26>. +* Core and Builtins: Core and Builtins<47>. +* Library: Library<47>. +* Documentation: Documentation<46>. +* Tests: Tests<44>. +* Build: Build<46>. +* Windows: Windows<42>. +* macOS: macOS<31>. +* IDLE: IDLE<35>. +* Tools/Demos: Tools/Demos<22>. +* C API: C API<40>. + +Python 3.6.4 release candidate 1 + +* Core and Builtins: Core and Builtins<48>. +* Library: Library<48>. +* Documentation: Documentation<47>. +* Tests: Tests<45>. +* Build: Build<47>. +* Windows: Windows<43>. +* macOS: macOS<32>. +* IDLE: IDLE<36>. +* Tools/Demos: Tools/Demos<23>. +* C API: C API<41>. + +Python 3.6.3 final + +* Library: Library<49>. +* Build: Build<48>. + +Python 3.6.3 release candidate 1 + +* Security: Security<27>. +* Core and Builtins: Core and Builtins<49>. +* Library: Library<50>. +* Documentation: Documentation<48>. +* Tests: Tests<46>. +* Build: Build<49>. +* Windows: Windows<44>. +* IDLE: IDLE<37>. +* Tools/Demos: Tools/Demos<24>. + +Python 3.6.2 release candidate 2 + +* Security: Security<28>. + +Python 3.6.2 release candidate 1 + +* Security: Security<29>. +* Core and Builtins: Core and Builtins<50>. +* Library: Library<51>. +* IDLE: IDLE<38>. +* C API: C API<42>. +* Build: Build<50>. +* Documentation: Documentation<49>. +* Tools/Demos: Tools/Demos<25>. +* Tests: Tests<47>. +* Windows: Windows<45>. + +Python 3.6.1 final + +* Core and Builtins: Core and Builtins<51>. +* Build: Build<51>. + +Python 3.6.1 release candidate 1 + +* Core and Builtins: Core and Builtins<52>. +* Library: Library<52>. +* IDLE: IDLE<39>. +* Windows: Windows<46>. +* C API: C API<43>. +* Documentation: Documentation<50>. +* Tests: Tests<48>. +* Build: Build<52>. + +Python 3.6.0 release candidate 2 + +* Core and Builtins: Core and Builtins<53>. +* Tools/Demos: Tools/Demos<26>. +* Windows: Windows<47>. +* Build: Build<53>. + +Python 3.6.0 release candidate 1 + +* Core and Builtins: Core and Builtins<54>. +* Library: Library<53>. +* C API: C API<44>. +* Documentation: Documentation<51>. +* Tools/Demos: Tools/Demos<27>. + +Python 3.6.0 beta 4 + +* Core and Builtins: Core and Builtins<55>. +* Library: Library<54>. +* Documentation: Documentation<52>. +* Tests: Tests<49>. +* Build: Build<54>. + +Python 3.6.0 beta 3 + +* Core and Builtins: Core and Builtins<56>. +* Library: Library<55>. +* Windows: Windows<48>. +* Build: Build<55>. +* Tests: Tests<50>. + +Python 3.6.0 beta 2 + +* Core and Builtins: Core and Builtins<57>. +* Library: Library<56>. +* Windows: Windows<49>. +* C API: C API<45>. +* Build: Build<56>. +* Tests: Tests<51>. + +Python 3.6.0 beta 1 + +* Core and Builtins: Core and Builtins<58>. +* Library: Library<57>. +* IDLE: IDLE<40>. +* C API: C API<46>. +* Tests: Tests<52>. +* Build: Build<57>. +* Tools/Demos: Tools/Demos<28>. +* Windows: Windows<50>. + +Python 3.6.0 alpha 4 + +* Core and Builtins: Core and Builtins<59>. +* Library: Library<58>. +* IDLE: IDLE<41>. +* Tests: Tests<53>. +* Windows: Windows<51>. +* Build: Build<58>. + +Python 3.6.0 alpha 3 + +* Security: Security<30>. +* Core and Builtins: Core and Builtins<60>. +* Library: Library<59>. +* IDLE: IDLE<42>. +* C API: C API<47>. +* Build: Build<59>. +* Tools/Demos: Tools/Demos<29>. +* Documentation: Documentation<53>. +* Tests: Tests<54>. + +Python 3.6.0 alpha 2 + +* Security: Security<31>. +* Core and Builtins: Core and Builtins<61>. +* Library: Library<60>. +* IDLE: IDLE<43>. +* Documentation: Documentation<54>. +* Tests: Tests<55>. +* Windows: Windows<52>. +* Build: Build<60>. +* C API: C API<48>. +* Tools/Demos: Tools/Demos<30>. + +Python 3.6.0 alpha 1 + +* Security: Security<32>. +* Core and Builtins: Core and Builtins<62>. +* Library: Library<61>. +* IDLE: IDLE<44>. +* Documentation: Documentation<55>. +* Tests: Tests<56>. +* Build: Build<61>. +* Windows: Windows<53>. +* Tools/Demos: Tools/Demos<31>. +* C API: C API<49>. + +Python 3.5.5 release candidate 1 + +* Security: Security<33>. +* Core and Builtins: Core and Builtins<63>. +* Library: Library<62>. + +Python 3.5.4 final + +* Library: Library<63>. + +Python 3.5.4 release candidate 1 + +* Security: Security<34>. +* Core and Builtins: Core and Builtins<64>. +* Library: Library<64>. +* Documentation: Documentation<56>. +* Tests: Tests<57>. +* Build: Build<62>. +* Windows: Windows<54>. +* C API: C API<50>. + +Python 3.5.3 release candidate 1 + +* Security: Security<35>. +* Core and Builtins: Core and Builtins<65>. +* Library: Library<65>. +* IDLE: IDLE<45>. +* C API: C API<51>. +* Documentation: Documentation<57>. +* Tests: Tests<58>. +* Tools/Demos: Tools/Demos<32>. +* Windows: Windows<55>. +* Build: Build<63>. + +Python 3.5.2 final + +* Core and Builtins: Core and Builtins<66>. +* Tests: Tests<59>. +* IDLE: IDLE<46>. + +Python 3.5.2 release candidate 1 + +* Security: Security<36>. +* Core and Builtins: Core and Builtins<67>. +* Library: Library<66>. +* IDLE: IDLE<47>. +* Documentation: Documentation<58>. +* Tests: Tests<60>. +* Build: Build<64>. +* Windows: Windows<56>. +* Tools/Demos: Tools/Demos<33>. + +Python 3.5.1 final + +* Core and Builtins: Core and Builtins<68>. +* Windows: Windows<57>. + +Python 3.5.1 release candidate 1 + +* Core and Builtins: Core and Builtins<69>. +* Library: Library<67>. +* IDLE: IDLE<48>. +* Documentation: Documentation<59>. +* Tests: Tests<61>. +* Build: Build<65>. +* Windows: Windows<58>. +* Tools/Demos: Tools/Demos<34>. + +Python 3.5.0 final + +* Build: Build<66>. + +Python 3.5.0 release candidate 4 + +* Library: Library<68>. +* Build: Build<67>. + +Python 3.5.0 release candidate 3 + +* Core and Builtins: Core and Builtins<70>. +* Library: Library<69>. + +Python 3.5.0 release candidate 2 + +* Core and Builtins: Core and Builtins<71>. +* Library: Library<70>. + +Python 3.5.0 release candidate 1 + +* Core and Builtins: Core and Builtins<72>. +* Library: Library<71>. +* IDLE: IDLE<49>. +* Documentation: Documentation<60>. +* Tests: Tests<62>. + +Python 3.5.0 beta 4 + +* Core and Builtins: Core and Builtins<73>. +* Library: Library<72>. +* Build: Build<68>. + +Python 3.5.0 beta 3 + +* Core and Builtins: Core and Builtins<74>. +* Library: Library<73>. +* Tests: Tests<63>. +* Documentation: Documentation<61>. +* Build: Build<69>. + +Python 3.5.0 beta 2 + +* Core and Builtins: Core and Builtins<75>. +* Library: Library<74>. + +Python 3.5.0 beta 1 + +* Core and Builtins: Core and Builtins<76>. +* Library: Library<75>. +* IDLE: IDLE<50>. +* Tests: Tests<64>. +* Documentation: Documentation<62>. +* Tools/Demos: Tools/Demos<35>. + +Python 3.5.0 alpha 4 + +* Core and Builtins: Core and Builtins<77>. +* Library: Library<76>. +* Build: Build<70>. +* Tests: Tests<65>. +* Tools/Demos: Tools/Demos<36>. +* C API: C API<52>. + +Python 3.5.0 alpha 3 + +* Core and Builtins: Core and Builtins<78>. +* Library: Library<77>. +* Build: Build<71>. +* Tests: Tests<66>. +* Tools/Demos: Tools/Demos<37>. + +Python 3.5.0 alpha 2 + +* Core and Builtins: Core and Builtins<79>. +* Library: Library<78>. +* Build: Build<72>. +* C API: C API<53>. +* Windows: Windows<59>. + +Python 3.5.0 alpha 1 + +* Core and Builtins: Core and Builtins<80>. +* Library: Library<79>. +* IDLE: IDLE<51>. +* Build: Build<73>. +* C API: C API<54>. +* Documentation: Documentation<63>. +* Tests: Tests<67>. +* Tools/Demos: Tools/Demos<38>. +* Windows: Windows<60>. + +The Python Tutorial + +* Whetting Your Appetite:: +* Using the Python Interpreter:: +* An Informal Introduction to Python:: +* More Control Flow Tools:: +* Data Structures:: +* Modules:: +* 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:: +* Strings:: +* Lists:: + +More Control Flow Tools + +* if Statements:: +* for Statements:: +* The range() Function: The range Function. +* break and continue Statements, and else Clauses on Loops: break and continue Statements and 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:: +* Using Python on Unix platforms:: +* Configure Python:: +* Using Python on Windows:: +* Using Python on a Mac:: +* Editors and IDEs:: + +Command line and environment + +* Command line:: +* Environment variables:: + +Command line + +* Interface options:: +* Generic options:: +* Miscellaneous options:: +* Options you shouldn’t use:: + +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 OpenSolaris:: + +Configure Python + +* Configure Options:: +* Python Build System:: +* Compiler and linker flags:: + +Configure Options + +* General Options:: +* WebAssembly Options:: +* Install Options:: +* Performance options:: +* Python Debug Build:: +* Debug options:: +* Linker options:: +* Libraries options:: +* Security Options:: +* macOS Options:: +* Cross Compiling Options:: + +Python Build System + +* Main files of the build system:: +* Main build steps:: +* Main Makefile targets:: +* C extensions:: + +Compiler and linker flags + +* Preprocessor flags:: +* Compiler flags:: +* Linker flags:: + +Using Python on Windows + +* The full installer:: +* The Microsoft Store package:: +* The nuget.org packages: The nuget org packages. +* The embeddable package:: +* Alternative bundles:: +* Configuring Python:: +* UTF-8 mode:: +* Python Launcher for Windows:: +* Finding modules:: +* Additional modules:: +* Compiling Python on Windows:: +* Other Platforms:: + +The full installer + +* Installation steps:: +* Removing the MAX_PATH Limitation:: +* Installing Without UI:: +* Installing Without Downloading:: +* Modifying an install:: + +The Microsoft Store package + +* Known issues:: + +Known issues + +* Redirection of local data, registry, and temporary paths: Redirection of local data registry and temporary paths. + +The embeddable package + +* Python Application:: +* Embedding Python:: + +Configuring Python + +* Excursus; Setting environment variables: Excursus Setting environment variables. +* Finding the Python executable:: + +Python Launcher for Windows + +* Getting started:: +* Shebang Lines:: +* 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:: + +Additional modules + +* PyWin32:: +* cx_Freeze:: + +Using Python on a Mac + +* Getting and Installing MacPython:: +* The IDE:: +* Installing Additional Python Packages:: +* GUI Programming on the Mac:: +* Distributing Python Applications on the Mac:: +* Other Resources:: + +Getting and Installing MacPython + +* How to run a Python script:: +* Running scripts with a GUI:: +* Configuration:: + +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:: + +Lexical analysis + +* Line structure:: +* Other tokens:: +* Identifiers and keywords:: +* Literals:: +* Operators:: +* Delimiters:: + +Line structure + +* Logical lines:: +* Physical lines:: +* Comments:: +* Encoding declarations:: +* Explicit line joining:: +* Implicit line joining:: +* Blank lines:: +* Indentation:: +* Whitespace between tokens:: + +Identifiers and keywords + +* Keywords:: +* Soft Keywords:: +* Reserved classes of identifiers:: + +Literals + +* String and Bytes literals:: +* String literal concatenation:: +* Formatted string literals:: +* Numeric literals:: +* Integer literals:: +* Floating point literals:: +* Imaginary literals:: + +Data model + +* Objects, values and types: Objects values and types. +* The standard type hierarchy:: +* Special method names:: +* Coroutines:: + +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:: +* Special method lookup:: + +Customizing attribute access + +* Customizing module attribute access:: +* Implementing Descriptors:: +* Invoking Descriptors:: +* __slots__: __slots__<2>. + +__slots__ + +* Notes on using __slots__:: + +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>. + +Naming and binding + +* Binding of names:: +* Resolution of names:: +* Builtins and restricted execution:: +* Interaction with dynamic features:: + +The import system + +* importlib: importlib<8>. +* 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 spec:: +* Import-related module attributes:: +* module.__path__: module __path__. +* 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 + +* Identifiers (Names): Identifiers Names. +* Literals: Literals<2>. +* Parenthesized forms:: +* Displays for lists, sets and dictionaries: Displays for lists sets and dictionaries. +* List displays:: +* Set displays:: +* Dictionary displays:: +* Generator expressions:: +* Yield expressions:: + +Yield expressions + +* Generator-iterator methods:: +* Examples:: +* Asynchronous generator functions:: +* Asynchronous generator-iterator methods:: + +Primaries + +* Attribute references:: +* Subscriptions:: +* Slicings:: +* Calls:: + +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:: + +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>. + +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:: + +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:: +* 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:: +* Concurrent Execution:: +* Networking and Interprocess Communication:: +* Internet Data Handling:: +* Structured Markup Processing Tools:: +* Internet Protocols and Support:: +* Multimedia Services:: +* Internationalization:: +* Program Frameworks:: +* 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:: +* Superseded Modules:: +* Security Considerations: Security Considerations<4>. + +Introduction + +* Notes on availability:: + +Notes on availability + +* WebAssembly platforms:: + +Built-in Constants + +* Constants added by the site module:: + +Built-in Types + +* Truth Value Testing:: +* Boolean Operations — and, or, not: Boolean Operations — and or not. +* Comparisons: Comparisons<2>. +* Numeric Types — int, float, complex: Numeric Types — int float complex. +* Iterator Types:: +* Sequence Types — list, tuple, range: Sequence Types — list tuple range. +* Text Sequence Type — str:: +* Binary Sequence Types — bytes, bytearray, memoryview: Binary Sequence Types — bytes bytearray memoryview. +* Set Types — set, frozenset: Set Types — set frozenset. +* Mapping Types — dict:: +* Context Manager Types:: +* Type Annotation Types — Generic Alias, 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:: +* 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>. +* printf-style String Formatting:: + +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<2>. +* Classes and Class Instances:: +* Functions:: +* Methods:: +* Code Objects:: +* Type Objects:: +* The Null Object:: +* The Ellipsis Object:: +* The NotImplemented Object:: +* Boolean Values:: +* 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:: + +Text Processing Services + +* string — Common string operations:: +* 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:: +* Helper functions:: + +Format String Syntax + +* Format Specification Mini-Language:: +* Format examples:: + +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:: + +readline — GNU readline interface + +* Init file:: +* Line buffer:: +* History file:: +* History list:: +* Startup hooks:: +* Completion:: +* Example:: + +rlcompleter — Completion function for GNU readline + +* Completer Objects:: + +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:: +* Classes: Classes<2>. + +Format Strings + +* Byte Order, Size, and Alignment: Byte Order Size and Alignment. +* Format Characters:: +* Examples: Examples<2>. + +codecs — Codec registry and base classes + +* Codec Base Classes:: +* Encodings and Unicode:: +* Standard Encodings:: +* Python Specific Encodings:: +* 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:: +* 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:: + +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:: +* 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 + +* PrettyPrinter Objects:: +* Example: Example<3>. + +reprlib — Alternate repr() implementation + +* Repr Objects:: +* Subclassing Repr Objects:: + +enum — Support for enumerations + +* Module Contents: Module Contents<2>. +* Data Types: Data Types<2>. +* 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 implementors:: + +Notes for type implementors + +* Adding More Numeric ABCs:: +* Implementing the arithmetic operations:: + +math — Mathematical functions + +* Number-theoretic and representation functions:: +* Power and logarithmic functions:: +* Trigonometric functions:: +* Angular conversion:: +* Hyperbolic functions:: +* Special functions:: +* Constants: Constants<2>. + +cmath — Mathematical functions for complex numbers + +* Conversions to and from polar coordinates:: +* Power and logarithmic functions: Power and logarithmic functions<2>. +* 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:: +* Real-valued distributions:: +* Alternative Generator:: +* Notes on Reproducibility:: +* Examples: Examples<4>. +* Recipes: Recipes<2>. + +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:: + +NormalDist objects + +* NormalDist Examples and Recipes:: + +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. +* fileinput — Iterate over lines from multiple input streams:: +* 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:: +* Pure paths:: +* Concrete paths:: +* Correspondence to tools in the os module:: + +Pure paths + +* General properties:: +* Operators: Operators<2>. +* Accessing individual parts:: +* Methods and properties:: + +Concrete paths + +* Methods: Methods<2>. + +filecmp — File and Directory Comparisons + +* The dircmp class:: + +tempfile — Generate temporary files and directories + +* Examples: Examples<5>. +* Deprecated functions and variables:: + +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, Functions, and Other Objects: Custom Reduction for Types Functions and Other Objects. +* Out-of-band Buffers:: +* Restricting Globals:: +* Performance: Performance<2>. +* Examples: Examples<6>. + +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.gnu — GNU’s reinterpretation of dbm: dbm gnu — GNU’s reinterpretation of dbm. +* dbm.ndbm — Interface based on ndbm: dbm ndbm — Interface based on ndbm. +* 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<6>. +* SQLite and Python types:: +* Default adapters and converters:: + +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 adapt custom Python types to SQLite values + +* How to write adaptable objects:: +* How to register adapter callables:: + +Explanation + +* Transaction control:: + +Data Compression and Archiving + +* 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:: + +gzip — Support for gzip files + +* Examples of usage:: +* Command Line Interface:: + +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:: +* Compressing and decompressing data in memory:: +* Miscellaneous: Miscellaneous<2>. +* Specifying custom filter chains:: +* Examples: Examples<7>. + +zipfile — Work with ZIP archives + +* ZipFile Objects:: +* Path Objects:: +* PyZipFile Objects:: +* ZipInfo Objects:: +* Command-Line Interface:: +* Decompression pitfalls:: + +Command-Line Interface + +* Command-line options:: + +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:: +* Command-Line Interface: Command-Line Interface<2>. +* Examples: Examples<8>. +* Supported tar formats:: +* Unicode issues:: + +Command-Line Interface + +* Command-line options: Command-line options<2>. + +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<3>. +* Dialects and Formatting Parameters:: +* Reader Objects:: +* Writer Objects:: +* Examples: Examples<9>. + +configparser — Configuration file parser + +* Quick Start:: +* Supported Datatypes:: +* Fallback Values:: +* Supported INI File Structure:: +* Interpolation of values:: +* Mapping Protocol Access:: +* Customizing Parser Behaviour:: +* Legacy API Examples:: +* ConfigParser Objects:: +* RawConfigParser Objects:: +* Exceptions: Exceptions<7>. + +tomllib — Parse TOML files + +* Examples: Examples<10>. +* Conversion Table:: + +netrc — netrc file processing + +* netrc Objects:: + +plistlib — Generate and parse Apple .plist files + +* Examples: Examples<11>. + +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:: +* SHAKE variable length digests:: +* File hashing:: +* Key derivation:: +* BLAKE2:: + +BLAKE2 + +* Creating hash objects:: +* Constants: Constants<5>. +* Examples: Examples<12>. +* 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:: +* argparse — Parser for command-line options, arguments and sub-commands: argparse — Parser for command-line options arguments and sub-commands. +* getopt — C-style parser for command line options:: +* logging — Logging facility for Python:: +* logging.config — Logging configuration: logging config — Logging configuration. +* logging.handlers — Logging handlers: logging handlers — Logging handlers. +* getpass — Portable password input:: +* 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. +* 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, Command Line Arguments, 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 + +* Linux extended attributes:: + +io — Core tools for working with streams + +* Overview: Overview<2>. +* Text Encoding:: +* High-level Module Interface:: +* Class hierarchy:: +* 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<4>. +* Clock ID Constants:: +* Timezone Constants:: + +argparse — Parser for command-line options, arguments and sub-commands + +* Core Functionality:: +* Quick Links for add_argument(): Quick Links for add_argument. +* Example: Example<7>. +* ArgumentParser objects:: +* The add_argument() method: The add_argument method. +* The parse_args() method: The parse_args method. +* Other utilities:: +* Upgrading optparse code:: + +Example + +* Creating a parser:: +* Adding arguments:: +* Parsing arguments:: + +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:: + +The add_argument() method + +* name or flags:: +* action:: +* nargs:: +* const:: +* default:: +* type:: +* choices:: +* required:: +* help:: +* metavar:: +* dest:: +* 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 + +* Sub-commands:: +* FileType objects:: +* Argument groups:: +* Mutual exclusion:: +* Parser defaults:: +* Printing help:: +* Partial parsing:: +* Customizing file parsing:: +* Exiting methods:: +* Intermixed parsing:: + +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:: +* Access to external objects:: +* Access to internal objects:: +* Import resolution and custom importers:: + +logging.handlers — Logging handlers + +* StreamHandler:: +* FileHandler:: +* NullHandler:: +* WatchedFileHandler:: +* BaseRotatingHandler:: +* RotatingFileHandler:: +* TimedRotatingFileHandler:: +* SocketHandler:: +* DatagramHandler:: +* SysLogHandler:: +* NTEventLogHandler:: +* SMTPHandler:: +* MemoryHandler:: +* HTTPHandler:: +* QueueHandler:: +* QueueListener:: + +curses — Terminal handling for character-cell displays + +* Functions: Functions<5>. +* 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<6>. +* Panel Objects:: + +platform — Access to underlying platform’s identifying data + +* Cross Platform:: +* Java Platform:: +* Windows Platform:: +* macOS Platform:: +* Unix Platforms:: +* Linux Platforms:: + +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, continued: Calling functions continued. +* 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 alignment and byte order:: +* Bit fields in structures and unions:: +* Arrays:: +* Pointers:: +* Type conversions:: +* Incomplete Types:: +* Callback functions:: +* Accessing values exported from dlls:: +* Surprises:: +* Variable-sized data types:: + +ctypes reference + +* Finding shared libraries:: +* Loading shared libraries:: +* Foreign functions:: +* Function prototypes:: +* Utility functions:: +* Data types:: +* Fundamental data types: Fundamental data types<2>. +* Structured data types:: +* Arrays and pointers:: + +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. +* subprocess — Subprocess management:: +* sched — Event scheduler:: +* queue — A synchronized queue class:: +* contextvars — Context Variables:: +* _thread — Low-level threading API:: + +threading — Thread-based parallelism + +* Thread-Local Data:: +* Thread Objects:: +* Lock Objects:: +* RLock Objects:: +* Condition Objects:: +* Semaphore Objects:: +* Event Objects:: +* Timer Objects:: +* Barrier Objects:: +* Using locks, conditions, and semaphores in the with statement: Using locks conditions and semaphores in the with statement. + +Semaphore Objects + +* Semaphore Example:: + +multiprocessing — Process-based parallelism + +* Introduction: Introduction<7>. +* Reference: Reference<2>. +* Programming guidelines:: +* Examples: Examples<13>. + +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 + +* Process and exceptions:: +* Pipes and Queues:: +* Miscellaneous: Miscellaneous<3>. +* 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:: + +Listeners and Clients + +* Address Formats:: + +Programming guidelines + +* All start methods:: +* The spawn and forkserver start methods:: + +concurrent.futures — Launching parallel tasks + +* Executor Objects:: +* ThreadPoolExecutor:: +* ProcessPoolExecutor:: +* Future Objects:: +* Module Functions:: +* Exception classes:: + +ThreadPoolExecutor + +* ThreadPoolExecutor Example:: + +ProcessPoolExecutor + +* ProcessPoolExecutor Example:: + +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<8>. + +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(), os.popen2(), os.popen3(): Replacing os popen os popen2 os popen3. +* Replacing functions from the popen2 module:: + +Notes + +* Converting an argument sequence to a string on Windows:: +* Disabling use of vfork() or posix_spawn(): Disabling use of vfork or posix_spawn. + +sched — Event scheduler + +* Scheduler Objects:: + +queue — A synchronized queue class + +* Queue Objects:: +* SimpleQueue Objects:: + +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<10>. +* Event Loop:: +* Futures:: +* Transports and Protocols:: +* Policies:: +* Platform Support:: +* Extending:: +* High-level API Index:: +* Low-level API Index:: +* Developing with asyncio:: + +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:: +* Shielding From Cancellation:: +* Timeouts:: +* Waiting Primitives:: +* Running in Threads:: +* Scheduling From Other Threads:: +* Introspection:: +* Task Object:: + +Streams + +* StreamReader:: +* StreamWriter:: +* Examples: Examples<14>. + +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<15>. + +Queues + +* Queue:: +* Priority Queue:: +* LIFO Queue:: +* Exceptions: Exceptions<9>. +* Examples: Examples<16>. + +Event Loop + +* Event Loop Methods:: +* Callback Handles:: +* Server Objects:: +* Event Loop Implementations:: +* Examples: Examples<17>. + +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:: +* Examples: Examples<18>. + +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:: +* Process Watchers:: +* Custom Policies:: + +Platform Support + +* All Platforms:: +* Windows: Windows<61>. +* macOS: macOS<33>. + +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<11>. + +Low-level API Index + +* Obtaining the Event Loop:: +* Event Loop Methods: Event Loop Methods<2>. +* Transports: Transports<2>. +* Protocols: Protocols<2>. +* 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:: + +socket — Low-level networking interface + +* Socket families:: +* Module contents:: +* Socket Objects:: +* Notes on socket timeouts:: +* Example: Example<8>. + +Module contents + +* Exceptions: Exceptions<12>. +* Constants: Constants<8>. +* Functions: Functions<7>. + +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, Constants, and Exceptions: Functions Constants and Exceptions. +* SSL Sockets:: +* SSL Contexts:: +* Certificates:: +* Examples: Examples<19>. +* Notes on non-blocking sockets:: +* Memory BIO Support: Memory BIO Support<2>. +* SSL session:: +* Security considerations: Security considerations<2>. +* TLS 1.3: TLS 1 3. + +Functions, Constants, and Exceptions + +* Socket creation:: +* Context creation:: +* Exceptions: Exceptions<13>. +* 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<8>. +* Classes: Classes<3>. +* Examples: Examples<20>. + +signal — Set handlers for asynchronous events + +* General rules:: +* Module contents: Module contents<2>. +* Examples: Examples<21>. +* 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, Base32, Base64, 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<14>. +* Standard Compliance and Interoperability:: +* Command Line Interface: Command Line Interface<2>. + +Standard Compliance and Interoperability + +* Character Encodings:: +* Infinite and NaN Number Values:: +* Repeated Names Within an Object:: +* Top-level Non-Object, Non-Array Values: Top-level Non-Object Non-Array Values. +* Implementation Limitations:: + +Command Line Interface + +* Command line options: Command line options<2>. + +mailbox — Manipulate mailboxes in various formats + +* Mailbox objects:: +* Message objects:: +* Exceptions: Exceptions<15>. +* Examples: Examples<22>. + +Mailbox objects + +* Maildir:: +* mbox:: +* MH:: +* Babyl:: +* MMDF:: + +Message objects + +* MaildirMessage:: +* mboxMessage:: +* MHMessage:: +* BabylMessage:: +* MMDFMessage:: + +mimetypes — Map filenames to MIME types + +* MimeTypes Objects:: + +base64 — Base16, Base32, Base64, Base85 Data Encodings + +* 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<23>. + +XML Processing Modules + +* XML vulnerabilities:: +* The defusedxml Package:: + +xml.etree.ElementTree — The ElementTree XML API + +* Tutorial: Tutorial<2>. +* XPath support:: +* Reference: Reference<3>. +* XInclude support:: +* Reference: Reference<4>. + +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<9>. +* Supported XPath syntax:: + +Reference + +* Functions: Functions<8>. + +XInclude support + +* Example: Example<10>. + +Reference + +* Functions: Functions<9>. +* Element Objects:: +* ElementTree Objects:: +* QName Objects:: +* TreeBuilder Objects:: +* XMLParser Objects:: +* XMLPullParser Objects:: +* Exceptions: Exceptions<16>. + +xml.dom — The Document Object Model API + +* Module Contents: Module Contents<4>. +* 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<17>. + +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<11>. +* 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 4122:: +* 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 + +* 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<24>. + +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<25>. +* Legacy interface:: +* urllib.request Restrictions: urllib request Restrictions. + +urllib.parse — Parse URLs into components + +* URL Parsing:: +* Parsing ASCII Encoded Bytes:: +* Structured Parse Results:: +* URL Quoting:: + +http — HTTP modules + +* HTTP status codes:: +* HTTP methods:: + +http.client — HTTP protocol client + +* HTTPConnection Objects:: +* HTTPResponse Objects:: +* Examples: Examples<26>. +* HTTPMessage Objects:: + +ftplib — FTP protocol client + +* FTP Objects:: +* FTP_TLS Objects:: + +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 4122 + +* Example: Example<12>. + +socketserver — A framework for network servers + +* Server Creation Notes:: +* Server Objects: Server Objects<2>. +* Request Handler Objects:: +* Examples: Examples<27>. + +Examples + +* socketserver.TCPServer Example: socketserver TCPServer Example. +* socketserver.UDPServer Example: socketserver UDPServer Example. +* Asynchronous Mixins:: + +http.server — HTTP servers + +* Security Considerations: Security Considerations<3>. + +http.cookies — HTTP state management + +* Cookie Objects:: +* Morsel Objects:: +* Example: Example<13>. + +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<28>. + +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<3>. + +Operators + +* Comparison operators:: +* Arithmetic operators:: + +IP Network definitions + +* Prefix, net mask and host mask: Prefix net mask and host mask. +* Network objects:: +* Operators: Operators<4>. + +Operators + +* Logical operators:: +* Iteration:: +* Networks as containers of addresses:: + +Interface objects + +* Operators: Operators<5>. + +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, details, hints, tips and caveats: Background details hints tips and caveats. +* For extension writers and programs that embed Python:: +* Access to message catalogs:: + +Program Frameworks + +* turtle — Turtle graphics:: +* cmd — Support for line-oriented command interpreters:: +* shlex — Simple lexical analysis:: + +turtle — Turtle graphics + +* Introduction: Introduction<9>. +* Overview of available Turtle and Screen methods:: +* Methods of RawTurtle/Turtle and corresponding functions:: +* Methods of TurtleScreen/Screen and corresponding functions:: +* Public classes:: +* 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. + +Overview of available Turtle and Screen methods + +* Turtle methods:: +* Methods of TurtleScreen/Screen:: + +Methods of RawTurtle/Turtle and corresponding functions + +* Turtle motion:: +* Tell Turtle’s state:: +* Settings for measurement:: +* Pen control:: +* 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, 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:: + +cmd — Support for line-oriented command interpreters + +* Cmd Objects:: +* Cmd Example:: + +shlex — Simple lexical analysis + +* shlex Objects:: +* Parsing Rules:: +* Improved Compatibility with Shells:: + +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. +* tkinter.tix — Extension widgets for Tk: tkinter tix — Extension widgets for Tk. +* IDLE: IDLE<52>. + +tkinter — Python interface to Tcl/Tk + +* Architecture:: +* Tkinter Modules:: +* Tkinter Life Preserver:: +* Threading model:: +* Handy Reference:: +* File Handlers:: + +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:: + +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.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:: + +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:: +* 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<2>. +* ttk.Treeview: ttk Treeview. + +Ttk Styling + +* Layouts:: + +tkinter.tix — Extension widgets for Tk + +* Using Tix:: +* Tix Widgets:: +* Tix Commands:: + +Tix Widgets + +* Basic Widgets:: +* File Selectors:: +* Hierarchical ListBox:: +* Tabular ListBox:: +* Manager Widgets:: +* Image Types:: +* Miscellaneous Widgets:: +* Form Geometry Manager:: + +IDLE + +* Menus:: +* Editing and Navigation:: +* Startup and Code Execution:: +* Help and Preferences:: +* idlelib:: + +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:: +* Code Context:: +* Shell window:: +* Text colors:: + +Startup and Code Execution + +* Command line usage:: +* 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:: + +Development Tools + +* typing — Support for type hints:: +* pydoc — Documentation generator and online help system:: +* Python Development Mode:: +* Effects of the Python Development Mode:: +* ResourceWarning Example:: +* Bad file descriptor error example:: +* 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. +* 2to3 — Automated Python 2 to 3 code translation:: +* 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 + +* Relevant PEPs:: +* Type aliases:: +* NewType:: +* Callable:: +* Generics:: +* User-defined generic types:: +* The Any type:: +* Nominal vs structural subtyping:: +* Module contents: Module contents<3>. +* Deprecation Timeline of Major Features:: + +Module contents + +* Special typing primitives:: +* Generic concrete collections:: +* Abstract Base Classes:: +* Protocols: Protocols<3>. +* Functions and decorators:: +* Introspection helpers:: +* Constant:: + +Special typing primitives + +* Special types:: +* Special forms:: +* Building generic types:: +* Other special directives:: + +Generic concrete collections + +* Corresponding to built-in types:: +* Corresponding to types in collections:: +* Other concrete types:: + +Abstract Base Classes + +* Corresponding to collections in collections.abc: Corresponding to collections in collections abc. +* Corresponding to other types in collections.abc: Corresponding to other types in collections abc. +* Asynchronous programming:: +* Context manager types:: + +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. +* 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:: +* DocTestRunner objects:: +* OutputChecker objects:: + +unittest — Unit testing framework + +* Basic example:: +* Command-Line Interface: Command-Line Interface<3>. +* 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<3>. + +Classes and functions + +* Test cases:: +* Grouping tests:: +* Loading and running tests:: + +Test cases + +* Deprecated aliases:: + +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:: + +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:: + +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:: + +2to3 — Automated Python 2 to 3 code translation + +* Using 2to3:: +* Fixers:: +* lib2to3 — 2to3’s library:: + +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:: +* Fault handler state:: +* Dumping the tracebacks after a timeout:: +* Dumping the traceback on a user signal:: +* Issue with file descriptors:: +* Example: Example<14>. + +pdb — The Python Debugger + +* 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<4>. +* Examples: Examples<29>. + +trace — Trace or track Python statement execution + +* Command-Line Usage:: +* Programmatic Interface:: + +Command-Line Usage + +* Main options:: +* Modifiers:: +* Filters:: + +tracemalloc — Trace memory allocations + +* Examples: Examples<30>. +* 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<10>. +* DomainFilter:: +* Filter:: +* Frame:: +* Snapshot:: +* Statistic:: +* StatisticDiff:: +* Trace:: +* Traceback:: + +Software Packaging and Distribution + +* distutils — Building and installing Python modules:: +* ensurepip — Bootstrapping the pip installer:: +* venv — Creation of virtual environments:: +* zipapp — Manage executable Python zip archives:: + +ensurepip — Bootstrapping the pip installer + +* Command line interface:: +* Module API:: + +venv — Creation of virtual environments + +* Creating virtual environments:: +* API: API<2>. +* An example of extending EnvBuilder:: + +zipapp — Manage executable Python zip archives + +* Basic Example:: +* Command-Line Interface: Command-Line Interface<5>. +* Python API:: +* Examples: Examples<31>. +* Specifying the Interpreter:: +* Creating Standalone Applications with zipapp:: +* The Python Zip Application Archive Format:: + +Creating Standalone Applications with zipapp + +* Making a Windows executable:: +* Caveats:: + +Python Runtime Services + +* sys — System-specific parameters and functions:: +* 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:: +* site — Site-specific configuration hook:: + +sysconfig — Provide access to Python’s configuration information + +* Configuration variables:: +* Installation paths:: +* Other functions: Other functions<3>. +* Using sysconfig as a script:: + +__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:: + +The Warnings Filter + +* Describing Warning Filters:: +* Default Warning Filter:: +* Overriding the default filter:: + +dataclasses — Data Classes + +* Module contents: Module contents<4>. +* 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<2>. +* Single use, 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 + +* TracebackException Objects:: +* StackSummary Objects:: +* FrameSummary Objects:: +* Traceback Examples:: + +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 and Coroutines:: +* Code Objects Bit Flags:: +* Command Line Interface: Command Line Interface<3>. + +site — Site-specific configuration hook + +* Readline configuration:: +* Module contents: Module contents<5>. +* Command Line Interface: Command Line Interface<4>. + +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 – Resources: importlib resources – Resources. +* Deprecated functions:: +* importlib.resources.abc – Abstract base classes for resources: importlib resources abc – Abstract base classes for resources. +* Using importlib.metadata: Using importlib 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<32>. + +modulefinder — Find modules used by a script + +* Example usage of ModuleFinder:: + +importlib — The implementation of import + +* Introduction: Introduction<10>. +* Functions: Functions<11>. +* 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<33>. + +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. + +Using importlib.metadata + +* Overview: Overview<3>. +* Functional API:: +* Distributions:: +* Extending the search algorithm:: + +Functional API + +* Entry points:: +* Distribution metadata:: +* Distribution versions:: +* Distribution files:: +* Distribution requirements:: +* Package distributions:: + +The initialization of the sys.path module search path + +* Virtual environments: Virtual environments<2>. +* _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:: +* Command-Line Usage: Command-Line Usage<2>. + +Node classes + +* Literals: Literals<3>. +* Variables:: +* Expressions: Expressions<2>. +* Statements:: +* Control flow:: +* Pattern matching:: +* 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:: + +tokenize — Tokenizer for Python source + +* Tokenizing Input:: +* Command-Line Usage: Command-Line Usage<3>. +* Examples: Examples<34>. + +pyclbr — Python module browser support + +* Function Objects:: +* Class Objects: Class Objects<2>. + +py_compile — Compile Python source files + +* Command-Line Interface: Command-Line Interface<6>. + +compileall — Byte-compile Python libraries + +* Command-line use:: +* Public functions:: + +dis — Disassembler for Python bytecode + +* Bytecode analysis:: +* Analysis functions:: +* Python Bytecode Instructions:: +* Opcode collections:: + +pickletools — Tools for pickle developers + +* Command line usage: Command line usage<2>. +* Programmatic Interface: Programmatic Interface<2>. + +Command line usage + +* Command line options: Command line options<3>. + +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<12>. +* Constants: Constants<10>. +* Registry Handle Objects:: + +Constants + +* HKEY_* Constants:: +* Access Rights:: +* Value Types:: + +Access Rights + +* 64-bit Specific:: + +Unix Specific Services + +* 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:: + +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<35>. + +Examples + +* Simple example:: + +Superseded 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:: +* 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:: +* optparse — Parser for command line options:: +* 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:: + +asynchat — Asynchronous socket command/response handler + +* asynchat Example:: + +asyncore — Asynchronous socket handler + +* asyncore Example basic HTTP client:: +* asyncore Example basic echo server:: + +cgi — Common Gateway Interface support + +* Introduction: Introduction<11>. +* Using the cgi module:: +* Higher Level Interface:: +* Functions: Functions<13>. +* Caring about security:: +* Installing your CGI script on a Unix system:: +* Testing your CGI script:: +* Debugging CGI scripts:: +* Common problems and solutions:: + +crypt — Function to check Unix passwords + +* Hashing Methods:: +* Module Attributes:: +* Module Functions: Module Functions<2>. +* Examples: Examples<36>. + +imp — Access the import internals + +* Examples: Examples<37>. + +msilib — Read and write Microsoft Installer files + +* Database Objects:: +* View Objects:: +* Summary Information Objects:: +* Record Objects:: +* Errors:: +* CAB Objects:: +* Directory Objects:: +* Features: Features<3>. +* GUI classes:: +* Precomputed tables:: + +nntplib — NNTP protocol client + +* NNTP Objects:: +* Utility functions: Utility functions<2>. + +NNTP Objects + +* Attributes:: +* Methods: Methods<3>. + +optparse — Parser for command line options + +* Background:: +* Tutorial: Tutorial<3>. +* Reference Guide:: +* Option Callbacks:: +* Extending optparse:: + +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: Parsing arguments<2>. +* Querying and manipulating your option parser:: +* Conflicts between options:: +* Cleanup: Cleanup<2>. +* 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:: + +ossaudiodev — Access to OSS-compatible audio devices + +* Audio Device Objects:: +* Mixer Device Objects:: + +pipes — Interface to shell pipelines + +* Template Objects:: + +smtpd — SMTP Server + +* SMTPServer Objects:: +* DebuggingServer Objects:: +* PureProxy Objects:: +* SMTPChannel Objects:: + +sunau — Read and write Sun AU files + +* AU_read Objects:: +* AU_write Objects:: + +telnetlib — Telnet client + +* Telnet Objects:: +* Telnet Example:: + +xdrlib — Encode and decode XDR data + +* Packer Objects:: +* Unpacker Objects:: +* Exceptions: Exceptions<18>. + +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 distutils:: +* Distributing your extension modules:: + +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<12>. +* C API Stability:: +* The Very High Level Layer:: +* Reference Counting:: +* Exception Handling:: +* Utilities: Utilities<2>. +* Abstract Objects Layer:: +* Concrete Objects Layer:: +* Initialization, Finalization, and Threads: Initialization Finalization and Threads. +* Python Initialization Configuration:: +* Memory Management:: +* Object Implementation Support:: +* API and ABI Versioning:: + +Introduction + +* Coding standards:: +* Include Files:: +* Useful macros:: +* Objects, Types and Reference Counts: Objects Types and Reference Counts. +* Exceptions: Exceptions<19>. +* Embedding Python: Embedding Python<2>. +* Debugging Builds:: + +Objects, Types and Reference Counts + +* Reference Counts: Reference Counts<2>. +* Types:: + +Reference Counts + +* Reference Count Details:: + +C API Stability + +* Stable Application Binary Interface:: +* Platform Considerations:: +* Contents of Limited API:: + +Stable Application Binary Interface + +* Limited API Scope and Performance:: +* Limited API Caveats:: + +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:: +* Standard Exceptions:: +* Standard Warning Categories:: + +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:: +* Reflection:: +* Codec registry and support functions:: + +Parsing arguments and building values + +* Parsing arguments: Parsing arguments<3>. +* 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:: + +Abstract Objects Layer + +* Object Protocol:: +* Call Protocol:: +* Number Protocol:: +* Sequence Protocol:: +* Mapping Protocol:: +* Iterator Protocol:: +* Buffer Protocol:: +* Old 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, format: readonly format. +* shape, strides, suboffsets: shape strides suboffsets. +* contiguity requests:: +* compound requests:: + +Complex arrays + +* NumPy-style; shape and strides: NumPy-style shape and strides. +* PIL-style; shape, 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:: + +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:: +* Pack functions:: +* Unpack functions:: +* Complex Number Objects:: + +Floating Point Objects + +* Pack and 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:: + +Unicode Objects + +* Unicode Type:: +* Unicode Character Properties:: +* Creating and accessing Unicode strings:: +* Deprecated Py_UNICODE APIs:: +* 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:: +* Methods & Slots:: + +Container Objects + +* Dictionary Objects:: +* Set Objects:: + +Function Objects + +* Function Objects: Function Objects<3>. +* Instance Method Objects:: +* Method Objects: Method Objects<2>. +* Cell Objects:: +* Code Objects: Code Objects<2>. + +Other Objects + +* File Objects:: +* Module Objects:: +* Iterator Objects:: +* Descriptor Objects:: +* Slice Objects:: +* Ellipsis Object:: +* MemoryView objects:: +* Weak Reference Objects: Weak Reference Objects<2>. +* Capsules: Capsules<2>. +* Frame Objects:: +* Generator Objects:: +* Coroutine Objects: Coroutine Objects<2>. +* Context Variables Objects:: +* DateTime Objects: DateTime Objects<2>. +* Objects for Type Hinting:: + +Module Objects + +* Initializing C modules:: +* Module lookup:: + +Initializing C modules + +* Single-phase initialization:: +* Multi-phase initialization:: +* Low-level module creation functions:: +* Support functions:: + +Initialization, Finalization, and Threads + +* Before Python Initialization:: +* Global configuration variables:: +* Initializing and finalizing the interpreter:: +* Process-wide parameters:: +* Thread State and the Global Interpreter Lock:: +* Sub-interpreter support:: +* Asynchronous Notifications:: +* Profiling and Tracing:: +* Advanced Debugger Support:: +* Thread Local Storage Support:: + +Thread State and the Global Interpreter Lock + +* Releasing the GIL from extension code:: +* Non-Python created threads:: +* Cautions about fork(): Cautions about fork. +* High-level API:: +* Low-level API:: + +Sub-interpreter support + +* Bugs and caveats:: + +Thread Local Storage Support + +* Thread Specific Storage (TSS) API: Thread Specific Storage TSS API. +* Thread Local Storage (TLS) API: Thread Local Storage TLS API. + +Thread Specific Storage (TSS) API + +* Dynamic Allocation:: +* Methods: Methods<4>. + +Python Initialization Configuration + +* Example: Example<17>. +* PyWideStringList:: +* PyStatus:: +* PyPreConfig:: +* Preinitialize Python with PyPreConfig:: +* PyConfig:: +* Initialization with PyConfig:: +* Isolated Configuration:: +* Python Configuration:: +* Python Path Configuration:: +* Py_RunMain(): Py_RunMain. +* Py_GetArgcArgv(): Py_GetArgcArgv. +* Multi-Phase Initialization Private Provisional API:: + +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:: +* tracemalloc C API:: +* Examples: Examples<38>. + +The pymalloc allocator + +* Customize pymalloc Arena Allocator:: + +Object Implementation Support + +* Allocating Objects on the Heap:: +* Common Object Structures:: +* Type Objects: Type Objects<3>. +* Number Object Structures:: +* Mapping Object Structures:: +* Sequence Object Structures:: +* Buffer Object Structures:: +* Async Object Structures:: +* Slot Type typedefs:: +* Examples: Examples<39>. +* Supporting Cyclic Garbage Collection:: + +Common Object Structures + +* Base object types and macros:: +* Implementing functions and methods:: +* Accessing attributes of extension types:: + +Type Objects + +* Quick Reference:: +* PyTypeObject Definition:: +* PyObject Slots:: +* PyVarObject Slots:: +* PyTypeObject Slots:: +* Static Types:: +* Heap Types:: + +Quick Reference + +* “tp slots”:: +* sub-slots:: +* slot typedefs:: + +Supporting Cyclic Garbage Collection + +* Controlling the Garbage Collector State:: + +Distributing Python Modules + +* Key terms:: +* Open source licensing and collaboration:: +* Installing the tools:: +* Reading the Python Packaging User Guide:: +* How do I…?:: + +How do I…? + +* … choose a name for my project?:: +* … create and distribute binary extensions?:: + +Installing Python Modules + +* Key terms: Key terms<2>. +* Basic usage:: +* How do I …?:: +* Common installation issues:: + +How do I …? + +* … install pip in versions of Python prior to Python 3.4?: … install pip in versions of Python prior to Python 3 4?. +* … 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 + +* Porting Python 2 Code to Python 3:: +* Porting Extension Modules to Python 3:: +* Curses Programming with Python:: +* Descriptor HowTo Guide:: +* Enum HOWTO:: +* Functional Programming HOWTO:: +* Logging HOWTO:: +* Logging Cookbook:: +* Regular Expression HOWTO:: +* Socket Programming HOWTO:: +* Sorting HOW TO:: +* Unicode HOWTO:: +* HOWTO Fetch Internet Resources Using The urllib Package:: +* Argparse Tutorial:: +* An introduction to the ipaddress module:: +* Argument Clinic How-To:: +* Instrumenting CPython with DTrace and SystemTap:: +* Annotations Best Practices:: +* Isolating Extension Modules:: + +Porting Python 2 Code to Python 3 + +* The Short Explanation:: +* Details:: + +Details + +* Drop support for Python 2.6 and older: Drop support for Python 2 6 and older. +* Make sure you specify the proper version support in your setup.py file: Make sure you specify the proper version support in your setup py file. +* Have good test coverage:: +* Learn the differences between Python 2 & 3:: +* Update your code:: +* Prevent compatibility regressions:: +* Check which dependencies block your transition:: +* Update your setup.py file to denote Python 3 compatibility: Update your setup py file to denote Python 3 compatibility. +* Use continuous integration to stay compatible:: +* Consider using optional static type checking:: + +Update your code + +* Division:: +* Text versus binary data:: +* Use feature detection instead of version detection:: + +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 HowTo 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__:: + +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:: +* Pickling:: +* Functional API: Functional API<2>. +* Derived Enumerations:: +* When to use __new__() vs. __init__(): When to use __new__ vs __init__. +* How are Enums different?:: +* Subclassing EnumType:: + +Derived Enumerations + +* IntEnum:: +* StrEnum:: +* IntFlag:: +* Flag:: +* Others:: + +When to use __new__() vs. __init__() + +* Finer Points:: + +Finer Points + +* Supported __dunder__ names: Supported __dunder__ names<2>. +* Supported _sunder_ names: Supported _sunder_ names<2>. +* _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 different? + +* Enum Classes:: +* Enum Members (aka instances): Enum Members aka instances. +* Omitting values:: +* OrderedEnum:: +* DuplicateFreeEnum:: +* 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<13>. +* Iterators: Iterators<2>. +* Generator expressions and list comprehensions:: +* Generators: Generators<2>. +* Built-in functions:: +* 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:: + +Basic Logging Tutorial + +* When to use logging:: +* A simple example:: +* Logging to a file:: +* Logging from multiple modules:: +* 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 - a ZeroMQ example:: +* Subclassing QueueListener - a ZeroMQ 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, 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:: +* Patterns to avoid:: +* Other resources:: + +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:: + +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<14>. +* 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: Search and Replace<2>. + +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 HOW TO + +* Sorting Basics:: +* Key Functions:: +* Operator Module Functions:: +* Ascending and Descending:: +* Sort Stability and Complex Sorts:: +* Decorate-Sort-Undecorate:: +* Comparison Functions:: +* Odds and Ends: Odds and Ends<2>. + +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<15>. +* 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:: + +Argparse Tutorial + +* Concepts:: +* The basics:: +* Introducing Positional arguments:: +* Introducing Optional arguments:: +* Combining Positional and Optional arguments:: +* Getting a little more advanced:: +* Conclusion:: + +Introducing Optional arguments + +* Short options:: + +Getting a little more advanced + +* Conflicting options:: + +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:: + +Argument Clinic How-To + +* The Goals Of Argument Clinic:: +* Basic Concepts And Usage:: +* Converting Your First Function:: +* Advanced Topics:: + +Advanced Topics + +* Symbolic default values:: +* Renaming the C functions and variables generated by Argument Clinic:: +* Converting functions using PyArg_UnpackTuple:: +* Optional Groups:: +* Using real Argument Clinic converters, instead of “legacy converters”: Using real Argument Clinic converters instead of “legacy converters”. +* Py_buffer:: +* Advanced converters:: +* Parameter default values:: +* The NULL default value:: +* Expressions specified as default values:: +* Using a return converter:: +* Cloning existing functions:: +* Calling Python code:: +* Using a “self converter”:: +* Using a “defining class” converter:: +* Writing a custom converter:: +* Writing a custom return converter:: +* METH_O and METH_NOARGS:: +* tp_new and tp_init functions:: +* Changing and redirecting Clinic’s output:: +* The #ifdef trick:: +* Using Argument Clinic in Python files:: + +Instrumenting CPython with DTrace and SystemTap + +* Enabling the static markers:: +* Static DTrace probes:: +* Static SystemTap markers:: +* Available static markers:: +* SystemTap Tapsets:: +* Examples: Examples<40>. + +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, Getters and Setters: Module State Access from Slot Methods Getters and Setters. +* Lifetime of the Module State:: + +Open Issues + +* Per-Class Scope:: +* Lossless Conversion to Heap Types:: + +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<3>. + +General Questions + +* Is there a source code level debugger with breakpoints, single-stepping, etc.?: Is there a source code level debugger with breakpoints single-stepping etc ?. +* 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?:: + +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 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 ; how do I get z?: __import__ ‘x y z’ returns ; how do I get z?. +* When I edit an imported module and reimport it, 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, 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, regex.py, 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, 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?:: +* How can I mimic CGI form submission (METHOD=POST)?: How can I mimic CGI form submission METHOD=POST ?. +* 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, 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?:: + +About these documents + +* 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 + +* PSF LICENSE AGREEMENT FOR PYTHON 3.11.0: PSF LICENSE AGREEMENT FOR PYTHON 3 11 0. +* 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 3.11.0 DOCUMENTATION: ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON 3 11 0 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:: +* expat:: +* libffi:: +* zlib: zlib<3>. +* cfuhash:: +* libmpdec:: +* W3C C14N test suite:: + +Distributing Python Modules (Legacy version) + +* An Introduction to Distutils:: +* Writing the Setup Script:: +* Writing the Setup Configuration File:: +* Creating a Source Distribution:: +* Creating Built Distributions:: +* Distutils Examples:: +* Extending Distutils:: +* Command Reference:: +* API Reference:: + +An Introduction to Distutils + +* Concepts & Terminology:: +* A Simple Example: A Simple Example<2>. +* General Python terminology:: +* Distutils-specific terminology:: + +Writing the Setup Script + +* Listing whole packages:: +* Listing individual modules:: +* Describing extension modules:: +* Relationships between Distributions and Packages:: +* Installing Scripts:: +* Installing Package Data:: +* Installing Additional Files:: +* Additional meta-data:: +* Debugging the setup script:: + +Describing extension modules + +* Extension names and packages:: +* Extension source files:: +* Preprocessor options:: +* Library options:: +* Other options:: + +Creating a Source Distribution + +* Specifying the files to distribute:: +* Manifest-related options:: + +Creating Built Distributions + +* Creating RPM packages:: +* Cross-compiling on Windows:: + +Cross-compiling on Windows + +* The Postinstallation script:: + +Distutils Examples + +* Pure Python distribution (by module): Pure Python distribution by module. +* Pure Python distribution (by package): Pure Python distribution by package. +* Single extension module:: +* Checking a package:: +* Reading the metadata:: + +Extending Distutils + +* Integrating new commands:: +* Adding new distribution types:: + +Command Reference + +* Installing modules; the install command family: Installing modules the install command family. +* Creating a source distribution; the sdist command: Creating a source distribution the sdist command. + +Installing modules: the install command family + +* install_data:: +* install_scripts:: + +API Reference + +* distutils.core — Core Distutils functionality: distutils core — Core Distutils functionality. +* distutils.ccompiler — CCompiler base class: distutils ccompiler — CCompiler base class. +* distutils.unixccompiler — Unix C Compiler: distutils unixccompiler — Unix C Compiler. +* distutils.msvccompiler — Microsoft Compiler: distutils msvccompiler — Microsoft Compiler. +* distutils.bcppcompiler — Borland Compiler: distutils bcppcompiler — Borland Compiler. +* distutils.cygwincompiler — Cygwin Compiler: distutils cygwincompiler — Cygwin Compiler. +* distutils.archive_util — Archiving utilities: distutils archive_util — Archiving utilities. +* distutils.dep_util — Dependency checking: distutils dep_util — Dependency checking. +* distutils.dir_util — Directory tree operations: distutils dir_util — Directory tree operations. +* distutils.file_util — Single file operations: distutils file_util — Single file operations. +* distutils.util — Miscellaneous other utility functions: distutils util — Miscellaneous other utility functions. +* distutils.dist — The Distribution class: distutils dist — The Distribution class. +* distutils.extension — The Extension class: distutils extension — The Extension class. +* distutils.debug — Distutils debug mode: distutils debug — Distutils debug mode. +* distutils.errors — Distutils exceptions: distutils errors — Distutils exceptions. +* distutils.fancy_getopt — Wrapper around the standard getopt module: distutils fancy_getopt — Wrapper around the standard getopt module. +* distutils.filelist — The FileList class: distutils filelist — The FileList class. +* distutils.log — Simple PEP 282-style logging: distutils log — Simple PEP 282-style logging. +* distutils.spawn — Spawn a sub-process: distutils spawn — Spawn a sub-process. +* distutils.sysconfig — System configuration information: distutils sysconfig — System configuration information. +* distutils.text_file — The TextFile class: distutils text_file — The TextFile class. +* distutils.version — Version number classes: distutils version — Version number classes. +* distutils.cmd — Abstract base class for Distutils commands: distutils cmd — Abstract base class for Distutils commands. +* Creating a new Distutils command:: +* distutils.command — Individual Distutils commands: distutils command — Individual Distutils commands. +* distutils.command.bdist — Build a binary installer: distutils command bdist — Build a binary installer. +* distutils.command.bdist_packager — Abstract base class for packagers: distutils command bdist_packager — Abstract base class for packagers. +* distutils.command.bdist_dumb — Build a “dumb” installer: distutils command bdist_dumb — Build a “dumb” installer. +* distutils.command.bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM: distutils command bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM. +* distutils.command.sdist — Build a source distribution: distutils command sdist — Build a source distribution. +* distutils.command.build — Build all files of a package: distutils command build — Build all files of a package. +* distutils.command.build_clib — Build any C libraries in a package: distutils command build_clib — Build any C libraries in a package. +* distutils.command.build_ext — Build any extensions in a package: distutils command build_ext — Build any extensions in a package. +* distutils.command.build_py — Build the .py/.pyc files of a package: distutils command build_py — Build the py/ pyc files of a package. +* distutils.command.build_scripts — Build the scripts of a package: distutils command build_scripts — Build the scripts of a package. +* distutils.command.clean — Clean a package build area: distutils command clean — Clean a package build area. +* distutils.command.config — Perform package configuration: distutils command config — Perform package configuration. +* distutils.command.install — Install a package: distutils command install — Install a package. +* distutils.command.install_data — Install data files from a package: distutils command install_data — Install data files from a package. +* distutils.command.install_headers — Install C/C++ header files from a package: distutils command install_headers — Install C/C++ header files from a package. +* distutils.command.install_lib — Install library files from a package: distutils command install_lib — Install library files from a package. +* distutils.command.install_scripts — Install script files from a package: distutils command install_scripts — Install script files from a package. +* distutils.command.register — Register a module with the Python Package Index: distutils command register — Register a module with the Python Package Index. +* distutils.command.check — Check the meta-data of a package: distutils command check — Check the meta-data of a package. + +Installing Python Modules (Legacy version) + +* Introduction: Introduction<16>. +* Standard Build and Install:: +* Alternate Installation:: +* Custom Installation:: +* Distutils Configuration Files:: +* Building Extensions; Tips and Tricks: Building Extensions Tips and Tricks. + +Introduction + +* Distutils based source distributions:: + +Standard Build and Install + +* Platform variations:: +* Splitting the job up:: +* How building works:: +* How installation works:: + +Alternate Installation + +* Alternate installation; the user scheme: Alternate installation the user scheme. +* Alternate installation; the home scheme: Alternate installation the home scheme. +* Alternate installation; Unix (the prefix scheme): Alternate installation Unix the prefix scheme. +* Alternate installation; Windows (the prefix scheme): Alternate installation Windows the prefix scheme. + +Custom Installation + +* Modifying Python’s Search Path:: + +Distutils Configuration Files + +* Location and names of config files:: +* Syntax of config files:: + +Building Extensions: Tips and Tricks + +* Tweaking compiler/linker flags:: +* Using non-Microsoft compilers on Windows:: + +Using non-Microsoft compilers on Windows + +* Borland/CodeGear C++:: +* GNU C / Cygwin / MinGW:: + +GNU C / Cygwin / MinGW + +* Older Versions of Python and MinGW:: + + + +File: python.info, Node: What’s New in Python, Next: The Python Tutorial, Prev: Top, Up: Top + +1 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.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:: + + +File: python.info, Node: What’s New In Python 3 11, Next: What’s New In Python 3 10, Up: What’s New in Python + +1.1 What’s New In Python 3.11 +============================= + + +Release: 3.11.0 + + +Date: March 03, 2023 + +This article explains the new features in Python 3.11, compared to 3.10. + +For full details, see the *note changelog: 158. + +* Menu: + +* Summary – Release highlights:: +* New Features:: +* New Features Related to Type Hints:: +* Other Language Changes:: +* Other CPython Implementation Changes:: +* New Modules:: +* Improved Modules:: +* Optimizations:: +* Faster CPython:: +* CPython bytecode changes:: +* Deprecated:: +* Pending Removal in Python 3.12: Pending Removal in Python 3 12. +* Removed:: +* Porting to Python 3.11: Porting to Python 3 11. +* Build Changes:: +* C API Changes:: + + +File: python.info, Node: Summary – Release highlights, Next: New Features, Up: What’s New In Python 3 11 + +1.1.1 Summary – Release highlights +---------------------------------- + + * Python 3.11 is between 10-60% faster than Python 3.10. On average, + we measured a 1.25x speedup on the standard benchmark suite. See + *note Faster CPython: 15b. for details. + +New syntax features: + + * *note PEP 654; Exception Groups and except*: 15c. + +New built-in features: + + * *note PEP 678; Exceptions can be enriched with notes: 15d. + +New standard library modules: + + * PEP 680(1): *note tomllib: 11b. — Support for parsing TOML(2) in + the Standard Library + +Interpreter improvements: + + * *note PEP 657; Fine-grained error locations in tracebacks: 15e. + + * New *note -P: 15f. command line option and *note PYTHONSAFEPATH: + 160. environment variable to *note disable automatically prepending + potentially unsafe paths: 161. to *note sys.path: 162. + +New typing features: + + * *note PEP 646; Variadic generics: 163. + + * *note PEP 655; Marking individual TypedDict items as required or + not-required: 164. + + * *note PEP 673; Self type: 165. + + * *note PEP 675; Arbitrary literal string type: 166. + + * *note PEP 681; Data class transforms: 167. + +Important deprecations, removals and restrictions: + + * PEP 594(3): *note Many legacy standard library modules have been + deprecated: 168. and will be removed in Python 3.13 + + * PEP 624(4): *note Py_UNICODE encoder APIs have been removed: 169. + + * PEP 670(5): *note Macros converted to static inline functions: 16a. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0680/ + + (2) https://toml.io/ + + (3) https://peps.python.org/pep-0594/ + + (4) https://peps.python.org/pep-0624/ + + (5) https://peps.python.org/pep-0670/ + + +File: python.info, Node: New Features, Next: New Features Related to Type Hints, Prev: Summary – Release highlights, Up: What’s New In Python 3 11 + +1.1.2 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. + + +File: python.info, Node: PEP 657 Fine-grained error locations in tracebacks, Next: PEP 654 Exception Groups and except*, Up: New Features + +1.1.2.1 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: + + Traceback (most recent call last): + File "distance.py", line 11, in + 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' + +Previous versions of the interpreter would point to just the line, +making it ambiguous which object was ‘None’. These enhanced errors can +also be helpful when dealing with deeply nested *note dict: 16e. objects +and multiple function calls: + + Traceback (most recent call last): + File "query.py", line 37, in + 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 + +As well as complex arithmetic expressions: + + Traceback (most recent call last): + File "calculation.py", line 54, in + result = (x / y / z) * (a / b / c) + ~~~~~~^~~ + ZeroDivisionError: division by zero + +Additionally, the information used by the enhanced traceback feature is +made available via a general API, that can be used to correlate *note +bytecode: 16f. *note instructions: 170. with source code location. This +information can be retrieved using: + + - The *note codeobject.co_positions(): 171. method in Python. + + - The *note PyCode_Addr2Location(): 172. function in the C API. + +See PEP 657(1) for more details. (Contributed by Pablo Galindo, Batuhan +Taskaya and Ammar Askar in bpo-43950(2).) + + Note: This feature requires storing column positions in *note Code + Objects: 173, 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 *note -X no_debug_ranges: 174. + command line option or the *note PYTHONNODEBUGRANGES: 175. + environment variable. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0657/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43950 + + +File: python.info, Node: PEP 654 Exception Groups and except*, Next: PEP 678 Exceptions can be enriched with notes, Prev: PEP 657 Fine-grained error locations in tracebacks, Up: New Features + +1.1.2.2 PEP 654: Exception Groups and ‘except*’ +............................................... + +PEP 654(1) introduces language features that enable a program to raise +and handle multiple unrelated exceptions simultaneously. The builtin +types *note ExceptionGroup: 177. and *note BaseExceptionGroup: 178. make +it possible to group exceptions and raise them together, and the new +*note except*: 179. syntax generalizes *note except: 17a. to match +subgroups of exception groups. + +See PEP 654(2) for more details. + +(Contributed by Irit Katriel in bpo-45292(3). PEP written by Irit +Katriel, Yury Selivanov and Guido van Rossum.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0654/ + + (2) https://peps.python.org/pep-0654/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45292 + + +File: python.info, Node: PEP 678 Exceptions can be enriched with notes, Next: Windows py exe launcher improvements, Prev: PEP 654 Exception Groups and except*, Up: New Features + +1.1.2.3 PEP 678: Exceptions can be enriched with notes +...................................................... + +The *note add_note(): 17c. method is added to *note BaseException: 17d. +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 PEP 678(1) for more details. + +(Contributed by Irit Katriel in bpo-45607(2). PEP written by Zac +Hatfield-Dodds.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0678/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45607 + + +File: python.info, Node: Windows py exe launcher improvements, Prev: PEP 678 Exceptions can be enriched with notes, Up: New Features + +1.1.2.4 Windows ‘py.exe’ launcher improvements +.............................................. + +The copy of the *note Python Launcher for Windows: 180. included with +Python 3.11 has been significantly updated. It now supports company/tag +syntax as defined in PEP 514(1) using the ‘-V:/’ argument +instead of the limited ‘-.’. This allows launching +distributions other than ‘PythonCore’, the one hosted on python.org(2). + +When using ‘-V:’ selectors, either company or tag can be omitted, but +all installs will be searched. For example, ‘-V:OtherPython/’ will +select the “best” tag registered for ‘OtherPython’, while ‘-V:3.11’ or +‘-V:/3.11’ will select the “best” distribution with tag ‘3.11’. + +When using the legacy ‘-’, ‘-.’, +‘--’ or ‘-.-’ arguments, all +existing behaviour should be preserved from past versions, and only +releases from ‘PythonCore’ will be selected. However, the ‘-64’ suffix +now implies “not 32-bit” (not necessarily x86-64), as there are multiple +supported 64-bit platforms. 32-bit runtimes are detected by checking +the runtime’s tag for a ‘-32’ suffix. All releases of Python since 3.5 +have included this in their 32-bit builds. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0514/ + + (2) https://python.org + + +File: python.info, Node: New Features Related to Type Hints, Next: Other Language Changes, Prev: New Features, Up: What’s New In Python 3 11 + +1.1.3 New Features Related to Type Hints +---------------------------------------- + +This section covers major changes affecting PEP 484(1) type hints and +the *note typing: 123. 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:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + +File: python.info, Node: PEP 646 Variadic generics, Next: PEP 655 Marking individual TypedDict items as required or not-required, Up: New Features Related to Type Hints + +1.1.3.1 PEP 646: Variadic generics +.................................. + +PEP 484(1) previously introduced *note TypeVar: 185, enabling creation +of generics parameterised with a single type. PEP 646(2) adds *note +TypeVarTuple: 186, enabling parameterisation with an `arbitrary' number +of types. In other words, a *note TypeVarTuple: 186. 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 PEP 646(3) for more details. + +(Contributed by Matthew Rahtz in bpo-43224(4), with contributions by +Serhiy Storchaka and Jelle Zijlstra. PEP written by Mark Mendoza, +Matthew Rahtz, Pradeep Kumar Srinivasan, and Vincent Siles.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0646/ + + (3) https://peps.python.org/pep-0646/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43224 + + +File: python.info, Node: PEP 655 Marking individual TypedDict items as required or not-required, Next: PEP 673 Self type, Prev: PEP 646 Variadic generics, Up: New Features Related to Type Hints + +1.1.3.2 PEP 655: Marking individual ‘TypedDict’ items as required or not-required +................................................................................. + +*note Required: 188. and *note NotRequired: 189. provide a +straightforward way to mark whether individual items in a *note +TypedDict: 18a. must be present. Previously, this was only possible +using inheritance. + +All fields are still required by default, unless the `total' parameter +is set to ‘False’, in which case all fields are still not-required by +default. For example, the following specifies a ‘TypedDict’ with one +required and one not-required key: + + 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) + +The following definition is equivalent: + + class Movie(TypedDict, total=False): + title: Required[str] + year: int + +See PEP 655(1) for more details. + +(Contributed by David Foster and Jelle Zijlstra in bpo-47087(2). PEP +written by David Foster.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0655/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=47087 + + +File: python.info, Node: PEP 673 Self type, Next: PEP 675 Arbitrary literal string type, Prev: PEP 655 Marking individual TypedDict items as required or not-required, Up: New Features Related to Type Hints + +1.1.3.3 PEP 673: ‘Self’ type +............................ + +The new *note Self: 18c. annotation provides a simple and intuitive way +to annotate methods that return an instance of their class. This +behaves the same as the *note TypeVar: 185.-based approach specified in +PEP 484(1), but is more concise and easier to follow. + +Common use cases include alternative constructors provided as *note +classmethod: 18d.s, and *note __enter__(): 18e. methods that return +‘self’: + + class MyLock: + def __enter__(self) -> Self: + self.lock() + return self + + ... + + class MyInt: + @classmethod + def fromhex(cls, s: str) -> Self: + return cls(int(s, 16)) + + ... + +*note Self: 18c. can also be used to annotate method parameters or +attributes of the same type as their enclosing class. + +See PEP 673(2) for more details. + +(Contributed by James Hilton-Balfe in bpo-46534(3). PEP written by +Pradeep Kumar Srinivasan and James Hilton-Balfe.) + + ---------- Footnotes ---------- + + (1) +https://peps.python.org/pep-0484/#annotating-instance-and-class-methods + + (2) https://peps.python.org/pep-0673/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46534 + + +File: python.info, Node: PEP 675 Arbitrary literal string type, Next: PEP 681 Data class transforms, Prev: PEP 673 Self type, Up: New Features Related to Type Hints + +1.1.3.4 PEP 675: Arbitrary literal string type +.............................................. + +The new *note LiteralString: 190. 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: + + 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}" + ) + +See PEP 675(1) for more details. + +(Contributed by Jelle Zijlstra in bpo-47088(2). PEP written by Pradeep +Kumar Srinivasan and Graham Bleaney.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0675/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=47088 + + +File: python.info, Node: PEP 681 Data class transforms, Next: PEP 563 may not be the future, Prev: PEP 675 Arbitrary literal string type, Up: New Features Related to Type Hints + +1.1.3.5 PEP 681: Data class transforms +...................................... + +*note dataclass_transform: 192. may be used to decorate a class, +metaclass, or a function that is itself a decorator. The presence of +‘@dataclass_transform()’ tells a static type checker that the decorated +object performs runtime “magic” that transforms a class, giving it *note +dataclass: 193.-like behaviors. + +For 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") + +See PEP 681(1) for more details. + +(Contributed by Jelle Zijlstra in gh-91860(2). PEP written by Erik De +Bonte and Eric Traut.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0681/ + + (2) https://github.com/python/cpython/issues/91860 + + +File: python.info, Node: PEP 563 may not be the future, Prev: PEP 681 Data class transforms, Up: New Features Related to Type Hints + +1.1.3.6 PEP 563 may not be the future +..................................... + +PEP 563(1) Postponed Evaluation of Annotations (the ‘from __future__ +import annotations’ *note future statement: 196.) that was originally +planned for release in Python 3.10 has been put on hold indefinitely. +See this message from the Steering Council(2) for more information. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0563/ + + (2) +https://mail.python.org/archives/list/python-dev@python.org/message/VIZEBX5EYMSYIJNDBF6DMUMZOCWHARSO/ + + +File: python.info, Node: Other Language Changes, Next: Other CPython Implementation Changes, Prev: New Features Related to Type Hints, Up: What’s New In Python 3 11 + +1.1.4 Other Language Changes +---------------------------- + + * Starred unpacking expressions can now be used in *note for: 199. + statements. (See bpo-46725(1) for more details.) + + * Asynchronous *note comprehensions: 19a. are now allowed inside + comprehensions in *note asynchronous functions: 19b. Outer + comprehensions implicitly become asynchronous in this case. + (Contributed by Serhiy Storchaka in bpo-33346(2).) + + * A *note TypeError: 19c. is now raised instead of an *note + AttributeError: 19d. in *note with: 19e. statements and *note + contextlib.ExitStack.enter_context(): 19f. for objects that do not + support the *note context manager: 1a0. protocol, and in *note + async with: 1a1. statements and *note + contextlib.AsyncExitStack.enter_async_context(): 1a2. for objects + not supporting the *note asynchronous context manager: 1a3. + protocol. (Contributed by Serhiy Storchaka in bpo-12022(3) and + bpo-44471(4).) + + * Added *note object.__getstate__(): 1a4, which provides the default + implementation of the ‘__getstate__()’ method. *note copy: 24.ing + and *note pickle: c7.ing instances of subclasses of builtin types + *note bytearray: 1a5, *note set: 1a6, *note frozenset: 1a7, *note + collections.OrderedDict: 1a8, *note collections.deque: 1a9, *note + weakref.WeakSet: 1aa, and *note datetime.tzinfo: 1ab. now copies + and pickles instance attributes implemented as *note slots: 1ac. + (Contributed by Serhiy Storchaka in bpo-26579(5).) + + * Added a *note -P: 15f. command line option and a *note + PYTHONSAFEPATH: 160. environment variable, which disable the + automatic prepending to *note sys.path: 162. of the script’s + directory when running a script, or the current directory when + using *note -c: 1ad. and *note -m: 1ae. This ensures only stdlib + and installed modules are picked up by *note import: 1af, and + avoids unintentionally or maliciously shadowing modules with those + in a local (and typically user-writable) directory. (Contributed + by Victor Stinner in gh-57684(6).) + + * A ‘"z"’ option was added to the *note Format Specification + Mini-Language: 1b0. that coerces negative to positive zero after + rounding to the format precision. See PEP 682(7) for more details. + (Contributed by John Belmonte in gh-90153(8).) + + * Bytes are no longer accepted on *note sys.path: 162. 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 *note -b: + 1b1. and *note sys.path_importer_cache: 1b2. when there is a + mixture of *note str: 1b3. and *note bytes: 1b4. keys. + (Contributed by Thomas Grainger in gh-91181(9).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46725 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33346 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=12022 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=44471 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26579 + + (6) https://github.com/python/cpython/issues/57684 + + (7) https://peps.python.org/pep-0682/ + + (8) https://github.com/python/cpython/issues/90153 + + (9) https://github.com/python/cpython/issues/91181 + + +File: python.info, Node: Other CPython Implementation Changes, Next: New Modules, Prev: Other Language Changes, Up: What’s New In Python 3 11 + +1.1.5 Other CPython Implementation Changes +------------------------------------------ + + * The special methods *note __complex__(): 1b7. for *note complex: + 1b8. and *note __bytes__(): 1b9. for *note bytes: 1b4. are + implemented to support the *note typing.SupportsComplex: 1ba. and + *note typing.SupportsBytes: 1bb. protocols. (Contributed by Mark + Dickinson and Dong-hee Na in bpo-24234(1).) + + * ‘siphash13’ is added as a new internal hashing algorithm. It has + similar security properties as ‘siphash24’, but it is slightly + faster for long inputs. *note str: 1b3, *note bytes: 1b4, and some + other types now use it as the default algorithm for *note hash(): + 1bc. PEP 552(2) *note hash-based .pyc files: 1bd. now use + ‘siphash13’ too. (Contributed by Inada Naoki in bpo-29410(3).) + + * When an active exception is re-raised by a *note raise: 1be. + statement with no parameters, the traceback attached to this + exception is now always ‘sys.exc_info()[1].__traceback__’. This + means that changes made to the traceback in the current *note + except: 17a. clause are reflected in the re-raised exception. + (Contributed by Irit Katriel in bpo-45711(4).) + + * The interpreter state’s representation of handled exceptions (aka + ‘exc_info’ or ‘_PyErr_StackItem’) now only has the ‘exc_value’ + field; ‘exc_type’ and ‘exc_traceback’ have been removed, as they + can be derived from ‘exc_value’. (Contributed by Irit Katriel in + bpo-45711(5).) + + * A new *note command line option: 1bf, ‘AppendPath’, has been added + for the Windows installer. It behaves similarly to ‘PrependPath’, + but appends the install and scripts directories instead of + prepending them. (Contributed by Bastian Neuburger in + bpo-44934(6).) + + * The *note PyConfig.module_search_paths_set: 1c0. field must now be + set to ‘1’ for initialization to use *note + PyConfig.module_search_paths: 1c1. to initialize *note sys.path: + 162. Otherwise, initialization will recalculate the path and + replace any values added to ‘module_search_paths’. + + * The output of the *note –help: 1c2. option now fits in 50 lines/80 + columns. Information about *note Python environment variables: + 1c3. and *note -X: 174. options is now available using the + respective *note –help-env: 1c4. and *note –help-xoptions: 1c5. + flags, and with the new *note –help-all: 1c6. (Contributed by Éric + Araujo in bpo-46142(7).) + + * Converting between *note int: 1c7. and *note str: 1b3. in bases + other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such + as base 10 (decimal) now raises a *note ValueError: 1c8. 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 CVE-2020-10735(8). This limit can be + configured or disabled by environment variable, command line flag, + or *note sys: f9. APIs. See the *note integer string conversion + length limitation: 1c9. documentation. The default limit is 4300 + digits in string form. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24234 + + (2) https://peps.python.org/pep-0552/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29410 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=44934 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46142 + + (8) https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735 + + +File: python.info, Node: New Modules, Next: Improved Modules, Prev: Other CPython Implementation Changes, Up: What’s New In Python 3 11 + +1.1.6 New Modules +----------------- + + * *note tomllib: 11b.: For parsing TOML(1). See PEP 680(2) for more + details. (Contributed by Taneli Hukkinen in bpo-40059(3).) + + * *note wsgiref.types: 13a.: WSGI(4)-specific types for static type + checking. (Contributed by Sebastian Rittau in bpo-42012(5).) + + ---------- Footnotes ---------- + + (1) https://toml.io/ + + (2) https://peps.python.org/pep-0680/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40059 + + (4) https://peps.python.org/pep-3333/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42012 + + +File: python.info, Node: Improved Modules, Next: Optimizations, Prev: New Modules, Up: What’s New In Python 3 11 + +1.1.7 Improved Modules +---------------------- + +* Menu: + +* asyncio:: +* contextlib:: +* dataclasses:: +* datetime:: +* enum:: +* fractions:: +* functools:: +* hashlib:: +* IDLE and idlelib:: +* inspect:: +* locale:: +* logging:: +* math:: +* operator:: +* os:: +* pathlib:: +* re:: +* shutil:: +* socket:: +* sqlite3:: +* string:: +* sys:: +* sysconfig:: +* threading:: +* time:: +* traceback:: +* typing:: +* tkinter:: +* unicodedata:: +* unittest:: +* venv:: +* warnings:: +* zipfile:: +* fcntl:: + + +File: python.info, Node: asyncio, Next: contextlib, Up: Improved Modules + +1.1.7.1 asyncio +............... + + * Added the *note TaskGroup: 1d0. class, an *note asynchronous + context manager: 1d1. holding a group of tasks that will wait for + all of them upon exit. For new code this is recommended over using + *note create_task(): 1d2. and *note gather(): 1d3. directly. + (Contributed by Yury Selivanov and others in gh-90908(1).) + + * Added *note timeout(): 1d4, an asynchronous context manager for + setting a timeout on asynchronous operations. For new code this is + recommended over using *note wait_for(): 1d5. directly. + (Contributed by Andrew Svetlov in gh-90927(2).) + + * Added the *note Runner: 1d6. class, which exposes the machinery + used by *note run(): 1d7. (Contributed by Andrew Svetlov in + gh-91218(3).) + + * Added the *note Barrier: 1d8. class to the synchronization + primitives in the asyncio library, and the related *note + BrokenBarrierError: 1d9. exception. (Contributed by Yves Duprat + and Andrew Svetlov in gh-87518(4).) + + * Added keyword argument `all_errors' to *note + asyncio.loop.create_connection(): 1da. so that multiple connection + errors can be raised as an *note ExceptionGroup: 177. + + * Added the *note asyncio.StreamWriter.start_tls(): 1db. method for + upgrading existing stream-based connections to TLS. (Contributed by + Ian Good in bpo-34975(5).) + + * Added raw datagram socket functions to the event loop: *note + sock_sendto(): 1dc, *note sock_recvfrom(): 1dd. and *note + sock_recvfrom_into(): 1de. These have implementations in *note + SelectorEventLoop: 1df. and *note ProactorEventLoop: 1e0. + (Contributed by Alex Grönholm in bpo-46805(6).) + + * Added *note cancelling(): 1e1. and *note uncancel(): 1e2. methods + to *note Task: 1e3. These are primarily intended for internal use, + notably by *note TaskGroup: 1d0. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/90908 + + (2) https://github.com/python/cpython/issues/90927 + + (3) https://github.com/python/cpython/issues/91218 + + (4) https://github.com/python/cpython/issues/87518 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=34975 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46805 + + +File: python.info, Node: contextlib, Next: dataclasses, Prev: asyncio, Up: Improved Modules + +1.1.7.2 contextlib +.................. + +Added non parallel-safe *note chdir(): 1e5. context manager to change +the current working directory and then restore it on exit. Simple +wrapper around *note chdir(): 1e6. (Contributed by Filipe Laíns in +bpo-25625(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25625 + + +File: python.info, Node: dataclasses, Next: datetime, Prev: contextlib, Up: Improved Modules + +1.1.7.3 dataclasses +................... + + * Change field default mutability check, allowing only defaults which + are *note hashable: 1e8. instead of any object which is not an + instance of *note dict: 16e, *note list: 1e9. or *note set: 1a6. + (Contributed by Eric V. Smith in bpo-44674(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44674 + + +File: python.info, Node: datetime, Next: enum, Prev: dataclasses, Up: Improved Modules + +1.1.7.4 datetime +................ + + * Add *note datetime.UTC: 1eb, a convenience alias for *note + datetime.timezone.utc: 1ec. (Contributed by Kabir Kwatra in + gh-91973(1).) + + * *note datetime.date.fromisoformat(): 1ed, *note + datetime.time.fromisoformat(): 1ee. and *note + datetime.datetime.fromisoformat(): 1ef. 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(2).) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/91973 + + (2) https://github.com/python/cpython/issues/80010 + + +File: python.info, Node: enum, Next: fractions, Prev: datetime, Up: Improved Modules + +1.1.7.5 enum +............ + + * Renamed ‘EnumMeta’ to *note EnumType: 1f2. (‘EnumMeta’ kept as an + alias). + + * Added *note StrEnum: 1f3, with members that can be used as (and + must be) strings. + + * Added ‘ReprEnum’, which only modifies the *note __repr__(): 1f4. of + members while returning their literal values (rather than names) + for *note __str__(): 1f5. and *note __format__(): 1f6. (used by + *note str(): 1b3, *note format(): 1f7. and *note f-string: 1f8.s). + + * Changed *note IntEnum: 1f9, *note IntFlag: 1fa. and *note StrEnum: + 1f3. to now inherit from ‘ReprEnum’, so their *note str(): 1b3. + output now matches *note format(): 1f7. (both ‘str(AnIntEnum.ONE)’ + and ‘format(AnIntEnum.ONE)’ return ‘'1'’, whereas before + ‘str(AnIntEnum.ONE)’ returned ‘'AnIntEnum.ONE'’. + + * Changed *note Enum.__format__(): 1fb. (the default for *note + format(): 1f7, *note str.format(): 1fc. and *note f-string: 1f8.s) + of enums with mixed-in types (e.g. *note int: 1c7, *note str: + 1b3.) to also include the class name in the output, not just the + member’s key. This matches the existing behavior of *note + enum.Enum.__str__(): 1fd, returning e.g. ‘'AnEnum.MEMBER'’ for an + enum ‘AnEnum(str, Enum)’ instead of just ‘'MEMBER'’. + + * Added a new `boundary' class parameter to *note Flag: 1fe. enums + and the *note FlagBoundary: 1ff. enum with its options, to control + how to handle out-of-range flag values. + + * Added the *note verify(): 200. enum decorator and the *note + EnumCheck: 201. enum with its options, to check enum classes + against several specific constraints. + + * Added the *note member(): 202. and *note nonmember(): 203. + decorators, to ensure the decorated object is/is not converted to + an enum member. + + * Added the *note property(): 204. decorator, which works like *note + property(): 205. except for enums. Use this instead of *note + types.DynamicClassAttribute(): 206. + + * Added the ‘global_enum()’ enum decorator, which adjusts *note + __repr__(): 1f4. and *note __str__(): 1f5. to show values as + members of their module rather than the enum class. For example, + ‘'re.ASCII'’ for the *note ASCII: 207. member of *note + re.RegexFlag: 208. rather than ‘'RegexFlag.ASCII'’. + + * Enhanced *note Flag: 1fe. to support *note len(): 209, iteration + and *note in: 20a./*note not in: 20b. on its members. For example, + the following now works: ‘len(AFlag(3)) == 2 and list(AFlag(3)) == + (AFlag.ONE, AFlag.TWO)’ + + * Changed *note Enum: 20c. and *note Flag: 1fe. so that members are + now defined before *note __init_subclass__(): 20d. is called; *note + dir(): 20e. now includes methods, etc., from mixed-in data types. + + * Changed *note Flag: 1fe. to only consider primary values (power of + two) canonical while composite values (‘3’, ‘6’, ‘10’, etc.) are + considered aliases; inverted flags are coerced to their positive + equivalent. + + +File: python.info, Node: fractions, Next: functools, Prev: enum, Up: Improved Modules + +1.1.7.6 fractions +................. + + * Support PEP 515(1)-style initialization of *note Fraction: 210. + from string. (Contributed by Sergey B Kirpichev in bpo-44258(2).) + + * *note Fraction: 210. now implements an ‘__int__’ method, so that an + ‘isinstance(some_fraction, typing.SupportsInt)’ check passes. + (Contributed by Mark Dickinson in bpo-44547(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0515/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=44258 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44547 + + +File: python.info, Node: functools, Next: hashlib, Prev: fractions, Up: Improved Modules + +1.1.7.7 functools +................. + + * *note functools.singledispatch(): 212. now supports *note + types.UnionType: 213. and *note typing.Union: 214. as annotations + to the dispatch argument.: + + >>> 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) + ... + + (Contributed by Yurii Karabas in bpo-46014(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46014 + + +File: python.info, Node: hashlib, Next: IDLE and idlelib, Prev: functools, Up: Improved Modules + +1.1.7.8 hashlib +............... + + * *note hashlib.blake2b(): 216. and *note hashlib.blake2s(): 217. now + prefer libb2(1) over Python’s vendored copy. (Contributed by + Christian Heimes in bpo-47095(2).) + + * The internal ‘_sha3’ module with SHA3 and SHAKE algorithms now uses + `tiny_sha3' instead of the `Keccak Code Package' to reduce code and + binary size. The *note hashlib: 88. module prefers optimized SHA3 + and SHAKE implementations from OpenSSL. The change affects only + installations without OpenSSL support. (Contributed by Christian + Heimes in bpo-47098(3).) + + * Add *note hashlib.file_digest(): 218, a helper function for + efficient hashing of files or file-like objects. (Contributed by + Christian Heimes in gh-89313(4).) + + ---------- Footnotes ---------- + + (1) https://www.blake2.net/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=47095 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=47098 + + (4) https://github.com/python/cpython/issues/89313 + + +File: python.info, Node: IDLE and idlelib, Next: inspect, Prev: hashlib, Up: Improved Modules + +1.1.7.9 IDLE and idlelib +........................ + + * Apply syntax highlighting to ‘.pyi’ files. (Contributed by Alex + Waygood and Terry Jan Reedy in bpo-45447(1).) + + * Include prompts when saving Shell with inputs and outputs. + (Contributed by Terry Jan Reedy in gh-95191(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45447 + + (2) https://github.com/python/cpython/issues/95191 + + +File: python.info, Node: inspect, Next: locale, Prev: IDLE and idlelib, Up: Improved Modules + +1.1.7.10 inspect +................ + + * Add *note getmembers_static(): 21c. to return all members without + triggering dynamic lookup via the descriptor protocol. + (Contributed by Weipeng Hong in bpo-30533(1).) + + * Add *note ismethodwrapper(): 21d. for checking if the type of an + object is a *note MethodWrapperType: 21e. (Contributed by Hakan + Çelik in bpo-29418(2).) + + * Change the frame-related functions in the *note inspect: 9e. module + to return new *note FrameInfo: 21f. and *note Traceback: 220. class + instances (backwards compatible with the previous *note named + tuple: 221.-like interfaces) that includes the extended PEP 657(3) + position information (end line number, column and end column). The + affected functions are: + + * *note inspect.getframeinfo(): 222. + + * *note inspect.getouterframes(): 223. + + * *note inspect.getinnerframes(): 224, + + * *note inspect.stack(): 225. + + * *note inspect.trace(): 226. + + (Contributed by Pablo Galindo in gh-88116(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30533 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29418 + + (3) https://peps.python.org/pep-0657/ + + (4) https://github.com/python/cpython/issues/88116 + + +File: python.info, Node: locale, Next: logging, Prev: inspect, Up: Improved Modules + +1.1.7.11 locale +............... + + * Add *note locale.getencoding(): 228. to get the current locale + encoding. It is similar to ‘locale.getpreferredencoding(False)’ + but ignores the *note Python UTF-8 Mode: 229. + + +File: python.info, Node: logging, Next: math, Prev: locale, Up: Improved Modules + +1.1.7.12 logging +................ + + * Added *note getLevelNamesMapping(): 22c. to return a mapping from + logging level names (e.g. ‘'CRITICAL'’) to the values of their + corresponding *note Logging Levels: 22d. (e.g. ‘50’, by default). + (Contributed by Andrei Kulakovin in gh-88024(1).) + + * Added a ‘createSocket()’ method to *note SysLogHandler: 22e, to + match *note SocketHandler.createSocket(): 22f. 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(2).) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/88024 + + (2) https://github.com/python/cpython/issues/88457 + + +File: python.info, Node: math, Next: operator, Prev: logging, Up: Improved Modules + +1.1.7.13 math +............. + + * Add *note math.exp2(): 231.: return 2 raised to the power of x. + (Contributed by Gideon Mitchell in bpo-45917(1).) + + * Add *note math.cbrt(): 232.: return the cube root of x. + (Contributed by Ajith Ramachandran in bpo-44357(2).) + + * The behaviour of two *note math.pow(): 233. corner cases was + changed, for consistency with the IEEE 754 specification. The + operations ‘math.pow(0.0, -math.inf)’ and ‘math.pow(-0.0, + -math.inf)’ now return ‘inf’. Previously they raised *note + ValueError: 1c8. (Contributed by Mark Dickinson in bpo-44339(3).) + + * The *note math.nan: 234. value is now always available. + (Contributed by Victor Stinner in bpo-46917(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45917 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=44357 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44339 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46917 + + +File: python.info, Node: operator, Next: os, Prev: math, Up: Improved Modules + +1.1.7.14 operator +................. + + * A new function ‘operator.call’ has been added, such that + ‘operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)’. + (Contributed by Antony Lee in bpo-44019(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44019 + + +File: python.info, Node: os, Next: pathlib, Prev: operator, Up: Improved Modules + +1.1.7.15 os +........... + + * On Windows, *note os.urandom(): 237. now uses ‘BCryptGenRandom()’, + instead of ‘CryptGenRandom()’ which is deprecated. (Contributed by + Dong-hee Na in bpo-44611(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44611 + + +File: python.info, Node: pathlib, Next: re, Prev: os, Up: Improved Modules + +1.1.7.16 pathlib +................ + + * *note glob(): 239. and *note rglob(): 23a. return only directories + if `pattern' ends with a pathname components separator: *note sep: + 23b. or *note altsep: 23c. (Contributed by Eisuke Kawasima in + bpo-22276(1) and bpo-33392(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22276 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33392 + + +File: python.info, Node: re, Next: shutil, Prev: pathlib, Up: Improved Modules + +1.1.7.17 re +........... + + * Atomic grouping (‘(?>...)’) and possessive quantifiers (‘*+’, ‘++’, + ‘?+’, ‘{m,n}+’) are now supported in regular expressions. + (Contributed by Jeffrey C. Jacobs and Serhiy Storchaka in + bpo-433030(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=433030 + + +File: python.info, Node: shutil, Next: socket, Prev: re, Up: Improved Modules + +1.1.7.18 shutil +............... + + * Add optional parameter `dir_fd' in *note shutil.rmtree(): 23f. + (Contributed by Serhiy Storchaka in bpo-46245(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46245 + + +File: python.info, Node: socket, Next: sqlite3, Prev: shutil, Up: Improved Modules + +1.1.7.19 socket +............... + + * Add CAN Socket support for NetBSD. (Contributed by Thomas Klausner + in bpo-30512(1).) + + * *note create_connection(): 241. has an option to raise, in case of + failure to connect, an *note ExceptionGroup: 177. containing all + errors instead of only raising the last error. (Contributed by + Irit Katriel in bpo-29980(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30512 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29980 + + +File: python.info, Node: sqlite3, Next: string, Prev: socket, Up: Improved Modules + +1.1.7.20 sqlite3 +................ + + * You can now disable the authorizer by passing *note None: 243. to + *note set_authorizer(): 244. (Contributed by Erlend E. Aasland in + bpo-44491(1).) + + * Collation name *note create_collation(): 245. can now contain any + Unicode character. Collation names with invalid characters now + raise *note UnicodeEncodeError: 246. instead of *note + sqlite3.ProgrammingError: 247. (Contributed by Erlend E. Aasland + in bpo-44688(2).) + + * *note sqlite3: ef. exceptions now include the SQLite extended error + code as *note sqlite_errorcode: 248. and the SQLite error name as + *note sqlite_errorname: 249. (Contributed by Aviv Palivoda, Daniel + Shahaf, and Erlend E. Aasland in bpo-16379(3) and bpo-24139(4).) + + * Add *note setlimit(): 24a. and *note getlimit(): 24b. to *note + sqlite3.Connection: 24c. for setting and getting SQLite limits by + connection basis. (Contributed by Erlend E. Aasland in + bpo-45243(5).) + + * *note sqlite3: ef. now sets *note sqlite3.threadsafety: 24d. based + on the default threading mode the underlying SQLite library has + been compiled with. (Contributed by Erlend E. Aasland in + bpo-45613(6).) + + * *note sqlite3: ef. C callbacks now use unraisable exceptions if + callback tracebacks are enabled. Users can now register an *note + unraisable hook handler: 24e. to improve their debug experience. + (Contributed by Erlend E. Aasland in bpo-45828(7).) + + * Fetch across rollback no longer raises *note InterfaceError: 24f. + Instead we leave it to the SQLite library to handle these cases. + (Contributed by Erlend E. Aasland in bpo-44092(8).) + + * Add *note serialize(): 250. and *note deserialize(): 251. to *note + sqlite3.Connection: 24c. for serializing and deserializing + databases. (Contributed by Erlend E. Aasland in bpo-41930(9).) + + * Add *note create_window_function(): 252. to *note + sqlite3.Connection: 24c. for creating aggregate window functions. + (Contributed by Erlend E. Aasland in bpo-34916(10).) + + * Add *note blobopen(): 253. to *note sqlite3.Connection: 24c. *note + sqlite3.Blob: 254. allows incremental I/O operations on blobs. + (Contributed by Aviv Palivoda and Erlend E. Aasland in + bpo-24905(11).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44491 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=44688 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16379 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24139 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45243 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45613 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45828 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=44092 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41930 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=34916 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=24905 + + +File: python.info, Node: string, Next: sys, Prev: sqlite3, Up: Improved Modules + +1.1.7.21 string +............... + + * Add *note get_identifiers(): 257. and *note is_valid(): 258. to + *note string.Template: 259, which respectively return all valid + placeholders, and whether any invalid placeholders are present. + (Contributed by Ben Kehoe in gh-90465(1).) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/90465 + + +File: python.info, Node: sys, Next: sysconfig, Prev: string, Up: Improved Modules + +1.1.7.22 sys +............ + + * *note sys.exc_info(): 25b. now derives the ‘type’ and ‘traceback’ + fields from the ‘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 ‘exc_info()’. + (Contributed by Irit Katriel in bpo-45711(1).) + + * Add *note sys.exception(): 25c. which returns the active exception + instance (equivalent to ‘sys.exc_info()[1]’). (Contributed by Irit + Katriel in bpo-46328(2).) + + * Add the *note sys.flags.safe_path: 25d. flag. (Contributed by + Victor Stinner in gh-57684(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46328 + + (3) https://github.com/python/cpython/issues/57684 + + +File: python.info, Node: sysconfig, Next: threading, Prev: sys, Up: Improved Modules + +1.1.7.23 sysconfig +.................. + + * Three new *note installation schemes: 25f. (`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 *note + sysconfig.get_preferred_scheme(): 260. Third party code that + creates new virtual environments should use the new `venv' + installation scheme to determine the paths, as does *note venv: + 12f. (Contributed by Miro Hrončok in bpo-45413(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45413 + + +File: python.info, Node: threading, Next: time, Prev: sysconfig, Up: Improved Modules + +1.1.7.24 threading +.................. + + * On Unix, if the ‘sem_clockwait()’ function is available in the C + library (glibc 2.30 and newer), the *note threading.Lock.acquire(): + 262. method now uses the monotonic clock (*note + time.CLOCK_MONOTONIC: 263.) for the timeout, rather than using the + system clock (*note time.CLOCK_REALTIME: 264.), to not be affected + by system clock changes. (Contributed by Victor Stinner in + bpo-41710(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41710 + + +File: python.info, Node: time, Next: traceback, Prev: threading, Up: Improved Modules + +1.1.7.25 time +............. + + * On Unix, *note time.sleep(): 266. now uses the ‘clock_nanosleep()’ + or ‘nanosleep()’ function, if available, which has a resolution of + 1 nanosecond (10^-9 seconds), rather than using ‘select()’ which + has a resolution of 1 microsecond (10^-6 seconds). (Contributed by + Benjamin Szőke and Victor Stinner in bpo-21302(1).) + + * On Windows 8.1 and newer, *note time.sleep(): 266. now uses a + waitable timer based on high-resolution timers(2) which has a + resolution of 100 nanoseconds (10^-7 seconds). Previously, it had + a resolution of 1 millisecond (10^-3 seconds). (Contributed by + Benjamin Szőke, Dong-hee Na, Eryk Sun and Victor Stinner in + bpo-21302(3) and bpo-45429(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21302 + + (2) +https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/high-resolution-timers + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21302 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45429 + + +File: python.info, Node: traceback, Next: typing, Prev: time, Up: Improved Modules + +1.1.7.26 traceback +.................. + + * Add *note traceback.StackSummary.format_frame_summary(): 268. to + allow users to override which frames appear in the traceback, and + how they are formatted. (Contributed by Ammar Askar in + bpo-44569(1).) + + * Add *note traceback.TracebackException.print(): 269, which prints + the formatted *note TracebackException: 26a. instance to a file. + (Contributed by Irit Katriel in bpo-33809(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44569 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33809 + + +File: python.info, Node: typing, Next: tkinter, Prev: traceback, Up: Improved Modules + +1.1.7.27 typing +............... + +For major changes, see *note New Features Related to Type Hints: 181. + + * Add *note typing.assert_never(): 26c. and *note typing.Never: 26d. + *note typing.assert_never(): 26c. is useful for asking a type + checker to confirm that a line of code is not reachable. At + runtime, it raises an *note AssertionError: 26e. (Contributed by + Jelle Zijlstra in gh-90633(1).) + + * Add *note typing.reveal_type(): 26f. 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(2).) + + * Add *note typing.assert_type(): 270. 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(3).) + + * *note typing.TypedDict: 18a. types can now be generic. + (Contributed by Samodya Abeysiriwardane in gh-89026(4).) + + * *note NamedTuple: 271. types can now be generic. (Contributed by + Serhiy Storchaka in bpo-43923(5).) + + * Allow subclassing of *note typing.Any: 272. This is useful for + avoiding type checker errors related to highly dynamic class, such + as mocks. (Contributed by Shantanu Jain in gh-91154(6).) + + * The *note typing.final(): 273. decorator now sets the ‘__final__’ + attributed on the decorated object. (Contributed by Jelle Zijlstra + in gh-90500(7).) + + * The *note typing.get_overloads(): 274. function can be used for + introspecting the overloads of a function. *note + typing.clear_overloads(): 275. can be used to clear all registered + overloads of a function. (Contributed by Jelle Zijlstra in + gh-89263(8).) + + * The ‘__init__()’ method of *note Protocol: 276. subclasses is now + preserved. (Contributed by Adrian Garcia Badarasco in + gh-88970(9).) + + * The representation of empty tuple types (‘Tuple[()]’) is + simplified. This affects introspection, e.g. + ‘get_args(Tuple[()])’ now evaluates to ‘()’ instead of ‘((),)’. + (Contributed by Serhiy Storchaka in gh-91137(10).) + + * Loosen runtime requirements for type annotations by removing the + callable check in the private ‘typing._type_check’ function. + (Contributed by Gregory Beauregard in gh-90802(11).) + + * *note typing.get_type_hints(): 277. now supports evaluating strings + as forward references in *note PEP 585 generic aliases: 278. + (Contributed by Niklas Rosenstein in gh-85542(12).) + + * *note typing.get_type_hints(): 277. no longer adds *note Optional: + 279. to parameters with ‘None’ as a default. (Contributed by + Nikita Sobolev in gh-90353(13).) + + * *note typing.get_type_hints(): 277. now supports evaluating bare + stringified *note ClassVar: 27a. annotations. (Contributed by + Gregory Beauregard in gh-90711(14).) + + * *note typing.no_type_check(): 27b. 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(15).) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/90633 + + (2) https://github.com/python/cpython/issues/90572 + + (3) https://github.com/python/cpython/issues/90638 + + (4) https://github.com/python/cpython/issues/89026 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43923 + + (6) https://github.com/python/cpython/issues/91154 + + (7) https://github.com/python/cpython/issues/90500 + + (8) https://github.com/python/cpython/issues/89263 + + (9) https://github.com/python/cpython/issues/88970 + + (10) https://github.com/python/cpython/issues/91137 + + (11) https://github.com/python/cpython/issues/90802 + + (12) https://github.com/python/cpython/issues/85542 + + (13) https://github.com/python/cpython/issues/90353 + + (14) https://github.com/python/cpython/issues/90711 + + (15) https://github.com/python/cpython/issues/90729 + + +File: python.info, Node: tkinter, Next: unicodedata, Prev: typing, Up: Improved Modules + +1.1.7.28 tkinter +................ + + * Added method ‘info_patchlevel()’ which returns the exact version of + the Tcl library as a named tuple similar to *note sys.version_info: + 27d. (Contributed by Serhiy Storchaka in gh-91827(1).) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/91827 + + +File: python.info, Node: unicodedata, Next: unittest, Prev: tkinter, Up: Improved Modules + +1.1.7.29 unicodedata +.................... + + * The Unicode database has been updated to version 14.0.0. + (Contributed by Benjamin Peterson in bpo-45190(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45190 + + +File: python.info, Node: unittest, Next: venv, Prev: unicodedata, Up: Improved Modules + +1.1.7.30 unittest +................. + + * Added methods *note enterContext(): 280. and *note + enterClassContext(): 281. of class *note TestCase: 282, method + *note enterAsyncContext(): 283. of class *note + IsolatedAsyncioTestCase: 284. and function *note + unittest.enterModuleContext(): 285. (Contributed by Serhiy + Storchaka in bpo-45046(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45046 + + +File: python.info, Node: venv, Next: warnings, Prev: unittest, Up: Improved Modules + +1.1.7.31 venv +............. + + * When new Python virtual environments are created, the `venv' *note + sysconfig installation scheme: 25f. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45413 + + +File: python.info, Node: warnings, Next: zipfile, Prev: venv, Up: Improved Modules + +1.1.7.32 warnings +................. + + * *note warnings.catch_warnings(): 288. now accepts arguments for + *note warnings.simplefilter(): 289, providing a more concise way to + locally ignore warnings or convert them to errors. (Contributed by + Zac Hatfield-Dodds in bpo-47074(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=47074 + + +File: python.info, Node: zipfile, Next: fcntl, Prev: warnings, Up: Improved Modules + +1.1.7.33 zipfile +................ + + * Added support for specifying member name encoding for reading + metadata in a *note ZipFile: 28c.’s directory and file headers. + (Contributed by Stephen J. Turnbull and Serhiy Storchaka in + bpo-28080(1).) + + * Added *note ZipFile.mkdir(): 28d. for creating new directories + inside ZIP archives. (Contributed by Sam Ezeh in gh-49083(2).) + + * Added *note stem: 28e, *note suffix: 28f. and *note suffixes: 290. + to *note zipfile.Path: 291. (Contributed by Miguel Brito in + gh-88261(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28080 + + (2) https://github.com/python/cpython/issues/49083 + + (3) https://github.com/python/cpython/issues/88261 + + +File: python.info, Node: fcntl, Prev: zipfile, Up: Improved Modules + +1.1.7.34 fcntl +.............. + + * On FreeBSD, the ‘F_DUP2FD’ and ‘F_DUP2FD_CLOEXEC’ flags + respectively are supported, the former equals to ‘dup2’ usage while + the latter set the ‘FD_CLOEXEC’ flag in addition. + + +File: python.info, Node: Optimizations, Next: Faster CPython, Prev: Improved Modules, Up: What’s New In Python 3 11 + +1.1.8 Optimizations +------------------- + +This section covers specific optimizations independent of the *note +Faster CPython: 15b. project, which is covered in its own section. + + * The compiler now optimizes simple *note printf-style % formatting: + 295. on string literals containing only the format codes ‘%s’, ‘%r’ + and ‘%a’ and makes it as fast as a corresponding *note f-string: + 1f8. expression. (Contributed by Serhiy Storchaka in + bpo-28307(1).) + + * Integer division (‘//’) is better tuned for optimization by + compilers. It is now around 20% faster on x86-64 when dividing an + *note int: 1c7. by a value smaller than ‘2**30’. (Contributed by + Gregory P. Smith and Tim Peters in gh-90564(2).) + + * *note sum(): 296. is now nearly 30% faster for integers smaller + than ‘2**30’. (Contributed by Stefan Behnel in gh-68264(3).) + + * Resizing lists is streamlined for the common case, speeding up + ‘list.append()’ by ≈15% and simple *note list comprehension: 297.s + by up to 20-30% (Contributed by Dennis Sweeney in gh-91165(4).) + + * Dictionaries don’t store hash values when all keys are Unicode + objects, decreasing *note dict: 16e. size. For example, + ‘sys.getsizeof(dict.fromkeys("abcdefg"))’ is reduced from 352 bytes + to 272 bytes (23% smaller) on 64-bit platforms. (Contributed by + Inada Naoki in bpo-46845(5).) + + * Using *note asyncio.DatagramProtocol: 298. 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(6).) + + * *note math: af. functions *note comb(): 299. and *note perm(): 29a. + are now ≈10 times faster for large arguments (with a larger speedup + for larger `k'). (Contributed by Serhiy Storchaka in + bpo-37295(7).) + + * The *note statistics: f2. functions *note mean(): 29b, *note + variance(): 29c. and *note stdev(): 29d. now consume iterators in + one pass rather than converting them to a *note list: 1e9. first. + This is twice as fast and can save substantial memory. + (Contributed by Raymond Hettinger in gh-90415(8).) + + * *note unicodedata.normalize(): 29e. now normalizes pure-ASCII + strings in constant time. (Contributed by Dong-hee Na in + bpo-44987(9).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28307 + + (2) https://github.com/python/cpython/issues/90564 + + (3) https://github.com/python/cpython/issues/68264 + + (4) https://github.com/python/cpython/issues/91165 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46845 + + (6) https://github.com/python/cpython/issues/91487 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37295 + + (8) https://github.com/python/cpython/issues/90415 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=44987 + + +File: python.info, Node: Faster CPython, Next: CPython bytecode changes, Prev: Optimizations, Up: What’s New In Python 3 11 + +1.1.9 Faster CPython +-------------------- + +CPython 3.11 is on average 25% faster(1) than CPython 3.10 when measured +with the pyperformance(2) benchmark suite, and compiled with GCC on +Ubuntu Linux. Depending on your workload, the speedup could be up to +10-60% faster. + +This project focuses on two major areas in Python: faster startup and +faster runtime. Other optimizations not under this project are listed +in *note Optimizations: 293. + +* Menu: + +* Faster Startup:: +* Faster Runtime:: +* Misc:: +* FAQ:: +* About:: + + ---------- Footnotes ---------- + + (1) https://github.com/faster-cpython/ideas#published-results + + (2) https://github.com/python/pyperformance + + +File: python.info, Node: Faster Startup, Next: Faster Runtime, Up: Faster CPython + +1.1.9.1 Faster Startup +...................... + +* Menu: + +* Frozen imports / Static code objects:: + + +File: python.info, Node: Frozen imports / Static code objects, Up: Faster Startup + +1.1.9.2 Frozen imports / Static code objects +............................................ + +Python caches bytecode in the *note __pycache__: 2a4. directory to speed +up module loading. + +Previously in 3.10, Python module execution looked like this: + + Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate + +In Python 3.11, the core modules essential for Python startup are +“frozen”. This means that their code objects (and bytecode) are +statically allocated by the interpreter. This reduces the steps in +module execution process to this: + + Statically allocated code object -> Evaluate + +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 numerous +issues.) + + +File: python.info, Node: Faster Runtime, Next: Misc, Prev: Faster Startup, Up: Faster CPython + +1.1.9.3 Faster Runtime +...................... + +* Menu: + +* Cheaper, lazy Python frames: Cheaper lazy Python frames. +* Inlined Python function calls:: +* PEP 659; Specializing Adaptive Interpreter: PEP 659 Specializing Adaptive Interpreter. + + +File: python.info, Node: Cheaper lazy Python frames, Next: Inlined Python function calls, Up: Faster Runtime + +1.1.9.4 Cheaper, lazy Python frames +................................... + +Python frames are created whenever Python calls a Python function. This +frame holds execution information. The following are new frame +optimizations: + + - Streamlined the frame creation process. + + - Avoided memory allocation by generously re-using frame space on the + C stack. + + - Streamlined the internal frame struct to contain only essential + information. Frames previously held extra debugging and memory + management information. + +Old-style frame objects are now created only when requested by debuggers +or by Python introspection functions such as ‘sys._getframe’ or +‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44590 + + +File: python.info, Node: Inlined Python function calls, Next: PEP 659 Specializing Adaptive Interpreter, Prev: Cheaper lazy Python frames, Up: Faster Runtime + +1.1.9.5 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. This speeds up +most of such calls. In simple recursive functions like fibonacci or +factorial, a 1.7x speedup was observed. This also means recursive +functions can recurse significantly deeper (if the user increases the +recursion limit). We measured a 1-3% improvement in pyperformance. + +(Contributed by Pablo Galindo and Mark Shannon in bpo-45256(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45256 + + +File: python.info, Node: PEP 659 Specializing Adaptive Interpreter, Prev: Inlined Python function calls, Up: Faster Runtime + +1.1.9.6 PEP 659: Specializing Adaptive Interpreter +.................................................. + +PEP 659(1) 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 bytecode. + +The specializer will also combine certain common instruction pairs into +one superinstruction. This reduces the overhead during execution. + +Python will only specialize when it sees code that is “hot” (executed +multiple times). This prevents Python from wasting time for 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. This allows +specialization to adapt to new circumstances. + +(PEP written by Mark Shannon, with ideas inspired by Stefan Brunthaler. +See PEP 659(2) for more information. Implementation by Mark Shannon and +Brandt Bucher, with additional help from Irit Katriel and Dennis +Sweeney.) + +Operation Form Specialization Operation speedup (up Contributor(s) + to) + +--------------------------------------------------------------------------------------------------------------------------------------------------------- + +Binary operations ‘x+x; x*x; x-x;’ Binary add, multiply and subtract for common types such 10% Mark Shannon, + as ‘int’, ‘float’, and ‘str’ take custom fast paths for Dong-hee Na, Brandt + their underlying types. Bucher, Dennis + Sweeney + + +Subscript ‘a[i]’ Subscripting container types such as ‘list’, ‘tuple’ and 10-25% Irit Katriel, Mark + ‘dict’ directly index the underlying data structures. Shannon + + Subscripting custom ‘__getitem__’ is also inlined similar + to *note Inlined Python function calls: 2a9. + + +Store subscript ‘a[i] = z’ Similar to subscripting specialization above. 10-25% Dennis Sweeney + + +Calls ‘f(arg)’ ‘C(arg)’ Calls to common builtin (C) functions and types such as 20% Mark Shannon, Ken Jin + ‘len’ and ‘str’ directly call their underlying C version. + This avoids going through the internal calling + convention. + + +Load global ‘print’ ‘len’ The object’s index in the globals/builtins namespace is (3) Mark Shannon +variable cached. Loading globals and builtins require zero + namespace lookups. + + +Load attribute ‘o.attr’ Similar to loading global variables. The attribute’s (4) Mark Shannon + index inside the class/object’s namespace is cached. In + most cases, attribute loading will require zero namespace + lookups. + + +Load methods for ‘o.meth()’ The actual address of the method is cached. Method 10-20% Ken Jin, Mark Shannon +call loading now has no namespace lookups – even for classes + with long inheritance chains. + + +Store attribute ‘o.attr = z’ Similar to load attribute optimization. 2% in pyperformance Mark Shannon + + +Unpack Sequence ‘*seq’ Specialized for common containers such as ‘list’ and 8% Brandt Bucher + ‘tuple’. Avoids internal calling convention. + + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0659/ + + (2) https://peps.python.org/pep-0659/ + + (3) A similar optimization already existed since Python 3.8. 3.11 +specializes for more forms and reduces some overhead. + + (4) A similar optimization already existed since Python 3.10. 3.11 +specializes for more forms. Furthermore, all attribute loads should be +sped up by bpo-45947 +(https://bugs.python.org/issue?@action=redirect&bpo=45947). + + +File: python.info, Node: Misc, Next: FAQ, Prev: Faster Runtime, Up: Faster CPython + +1.1.9.7 Misc +............ + + * 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(1) and + bpo-40116(2).) + + * 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(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45340 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40116 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + +File: python.info, Node: FAQ, Next: About, Prev: Misc, Up: Faster CPython + +1.1.9.8 FAQ +........... + + Q: How should I write my code to utilize these speedups? + + A: You don’t have to change your code. Write Pythonic code that follows common best practices. The Faster CPython project optimizes for common code patterns we observe. + + + Q: Will CPython 3.11 use more memory? + + A: Maybe not. We don’t expect memory use to exceed 20% more than 3.10. This is offset by memory optimizations for frame objects and object dictionaries as mentioned above. + + + Q: I don’t see any speedups in my workload. Why? + + A: 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 speedup. 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! + + + Q: Is there a JIT compiler? + + A: No. We’re still exploring other optimizations. + + +File: python.info, Node: About, Prev: FAQ, Up: Faster CPython + +1.1.9.9 About +............. + +Faster CPython explores optimizations for *note CPython: 2b4. 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. + + +File: python.info, Node: CPython bytecode changes, Next: Deprecated, Prev: Faster CPython, Up: What’s New In Python 3 11 + +1.1.10 CPython bytecode changes +------------------------------- + + * The bytecode now contains inline cache entries, which take the form + of *note CACHE: 2b7. 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. + + * Replaced all numeric ‘BINARY_*’ and ‘INPLACE_*’ instructions with a + single *note BINARY_OP: 2b8. implementation. + + * Replaced the three call instructions: ‘CALL_FUNCTION’, + ‘CALL_FUNCTION_KW’ and ‘CALL_METHOD’ with *note PUSH_NULL: 2b9, + *note PRECALL: 2ba, *note CALL: 2bb, and *note KW_NAMES: 2bc. This + decouples the argument shifting for methods from the handling of + keyword arguments and allows better specialization of calls. + + * Removed ‘COPY_DICT_WITHOUT_KEYS’ and ‘GEN_START’. + + * *note MATCH_CLASS: 2bd. and *note MATCH_KEYS: 2be. no longer push + an additional boolean value indicating whether the match succeeded + or failed. Instead, they indicate failure with *note None: 243. + (where a tuple of extracted values would otherwise be). + + * Replace several stack manipulation instructions (‘DUP_TOP’, + ‘DUP_TOP_TWO’, ‘ROT_TWO’, ‘ROT_THREE’, ‘ROT_FOUR’, and ‘ROT_N’) + with new *note COPY: 2bf. and *note SWAP: 2c0. instructions. + + * Replaced ‘JUMP_IF_NOT_EXC_MATCH’ by *note CHECK_EXC_MATCH: 2c1. + which performs the check but does not jump. + + * Replaced ‘JUMP_IF_NOT_EG_MATCH’ by *note CHECK_EG_MATCH: 2c2. which + performs the check but does not jump. + + * Replaced ‘JUMP_ABSOLUTE’ by the relative *note JUMP_BACKWARD: 2c3. + + * Added *note JUMP_BACKWARD_NO_INTERRUPT: 2c4, which is used in + certain loops where it is undesirable to handle interrupts. + + * Replaced ‘POP_JUMP_IF_TRUE’ and ‘POP_JUMP_IF_FALSE’ by the relative + *note POP_JUMP_FORWARD_IF_TRUE: 2c5, *note + POP_JUMP_BACKWARD_IF_TRUE: 2c6, *note POP_JUMP_FORWARD_IF_FALSE: + 2c7. and *note POP_JUMP_BACKWARD_IF_FALSE: 2c8. + + * Added *note POP_JUMP_FORWARD_IF_NOT_NONE: 2c9, *note + POP_JUMP_BACKWARD_IF_NOT_NONE: 2ca, *note POP_JUMP_FORWARD_IF_NONE: + 2cb. and *note POP_JUMP_BACKWARD_IF_NONE: 2cc. opcodes to speed up + conditional jumps. + + * *note JUMP_IF_TRUE_OR_POP: 2cd. and *note JUMP_IF_FALSE_OR_POP: + 2ce. are now relative rather than absolute. + + * *note RESUME: 2cf. has been added. It is a no-op. Performs + internal tracing, debugging and optimization checks. + + +File: python.info, Node: Deprecated, Next: Pending Removal in Python 3 12, Prev: CPython bytecode changes, Up: What’s New In Python 3 11 + +1.1.11 Deprecated +----------------- + +This section lists Python APIs that have been deprecated in Python 3.11. + +Deprecated C APIs are *note listed separately: 2d3. + + * Chaining *note classmethod: 18d. descriptors (introduced in + bpo-19072(1)) is now deprecated. It can no longer be used to wrap + other descriptors such as *note property: 205. The core design of + this feature was flawed and caused a number of downstream problems. + To “pass-through” a *note classmethod: 18d, consider using the + ‘__wrapped__’ attribute that was added in Python 3.10. + (Contributed by Raymond Hettinger in gh-89519(2).) + + * Octal escapes in string and bytes literals with value larger than + ‘0o377’ now produce *note DeprecationWarning: 2d4. In a future + Python version they will be a *note SyntaxWarning: 2d5. and + eventually a *note SyntaxError: 2d6. (Contributed by Serhiy + Storchaka in gh-81548(3).) + + * The *note lib2to3: a5. package and ‘2to3’ tool are now deprecated + and may not be able to parse Python 3.10 or newer. See the PEP + 617(4) (New PEG parser for CPython). (Contributed by Victor + Stinner in bpo-40360(5).) + + * Undocumented modules ‘sre_compile’, ‘sre_constants’ and ‘sre_parse’ + are now deprecated. (Contributed by Serhiy Storchaka in + bpo-47152(6).) + + * ‘webbrowser.MacOSX’ is deprecated and will be removed in Python + 3.13. It is untested and undocumented and also not used by + webbrowser itself. (Contributed by Dong-hee Na in bpo-42255(7).) + + * The behavior of returning a value from a *note TestCase: 282. and + *note IsolatedAsyncioTestCase: 284. test methods (other than the + default ‘None’ value), is now deprecated. + + * Deprecated the following *note unittest: 125. functions, scheduled + for removal in Python 3.13: + + * ‘unittest.findTestCases()’ + + * ‘unittest.makeSuite()’ + + * ‘unittest.getTestCaseNames()’ + + Use *note TestLoader: 2d7. method instead: + + * *note unittest.TestLoader.loadTestsFromModule(): 2d8. + + * *note unittest.TestLoader.loadTestsFromTestCase(): 2d9. + + * *note unittest.TestLoader.getTestCaseNames(): 2da. + + (Contributed by Erlend E. Aasland in bpo-5846(8).) + + * The ‘turtle.RawTurtle.settiltangle()’ is deprecated since Python + 3.1, it now emits a deprecation warning and will be removed in + Python 3.13. Use ‘turtle.RawTurtle.tiltangle()’ instead (it was + earlier incorrectly marked as deprecated, its docstring is now + corrected). (Contributed by Hugo van Kemenade in bpo-45837(9).) + + * The delegation of *note int(): 1c7. to ‘__trunc__()’ is now + deprecated. Calling ‘int(a)’ when ‘type(a)’ implements + ‘__trunc__()’ but not ‘__int__()’ or ‘__index__()’ now raises a + *note DeprecationWarning: 2d4. (Contributed by Zackery Spytz in + bpo-44977(10).) + + * The following have been deprecated in *note configparser: 21. since + Python 3.2. Their deprecation warnings have now been updated to + note they will removed in Python 3.12: + + * the ‘configparser.SafeConfigParser’ class + + * the ‘configparser.ParsingError.filename’ property + + * the ‘configparser.RawConfigParser.readfp()’ method + + (Contributed by Hugo van Kemenade in bpo-45173(11).) + + * ‘configparser.LegacyInterpolation’ has been deprecated in the + docstring since Python 3.2. It now emits a *note + DeprecationWarning: 2d4. and will be removed in Python 3.13. Use + *note configparser.BasicInterpolation: 2db. or *note + configparser.ExtendedInterpolation: 2dc. instead. (Contributed by + Hugo van Kemenade in bpo-46607(12).) + + * The *note locale.getdefaultlocale(): 2dd. function is deprecated + and will be removed in Python 3.13. Use *note locale.setlocale(): + 2de, *note locale.getpreferredencoding(False): 2df. and *note + locale.getlocale(): 2e0. functions instead. (Contributed by Victor + Stinner in gh-90817(13).) + + * The *note locale.resetlocale(): 2e1. function is deprecated and + will be removed in Python 3.13. Use + ‘locale.setlocale(locale.LC_ALL, "")’ instead. (Contributed by + Victor Stinner in gh-90817(14).) + + * PEP 594(15) led to the deprecations of the following modules which + are slated for removal in Python 3.13: + + * *note aifc: 4. + + * *note audioop: c. + + * *note cgi: 14. + + * *note cgitb: 15. + + * *note chunk: 16. + + * *note crypt: 27. + + * *note imghdr: 95. + + * *note mailcap: ad. + + * *note msilib: b3. + + * *note nis: bd. + + * *note nntplib: be. + + * *note ossaudiodev: c4. + + * *note pipes: c9. + + * *note sndhdr: eb. + + * *note spwd: ee. + + * *note sunau: f7. + + * *note telnetlib: fe. + + * *note uu: 12d. + + * *note xdrlib: 13d. + + (Contributed by Brett Cannon in bpo-47061(16) and Victor Stinner in + gh-68966(17).) + + * The *note asynchat: 8, *note asyncore: a. and *note smtpd: e9. + modules have been deprecated since at least Python 3.6. Their + documentation and deprecation warnings have now been updated to + note they will removed in Python 3.12. (Contributed by Hugo van + Kemenade in bpo-47022(18).) + + * More strict rules will be applied now applied for numerical group + references and group names in regular expressions in future Python + versions. Only sequence of ASCII digits will be now accepted as a + numerical reference. The group name in bytes patterns and + replacement strings could only contain ASCII letters and digits and + underscore. For now, a deprecation warning is raised for such + syntax. (Contributed by Serhiy Storchaka in gh-91760(19).) + + * *note typing.Text: 2e2, 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 *note str: 1b3. instead wherever possible. + (Contributed by Alex Waygood in gh-92332(20).) + + * The keyword argument syntax for constructing *note TypedDict: 18a. + types is now deprecated. Support will be removed in Python 3.13. + (Contributed by Jingchen Ye in gh-90224(21).) + + * The ‘re.template()’ function and the corresponding ‘re.TEMPLATE’ + and ‘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(22).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19072 + + (2) https://github.com/python/cpython/issues/89519 + + (3) https://github.com/python/cpython/issues/81548 + + (4) https://peps.python.org/pep-0617/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40360 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=47152 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42255 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=5846 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45837 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=44977 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45173 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=46607 + + (13) https://github.com/python/cpython/issues/90817 + + (14) https://github.com/python/cpython/issues/90817 + + (15) https://peps.python.org/pep-0594/ + + (16) https://bugs.python.org/issue?@action=redirect&bpo=47061 + + (17) https://github.com/python/cpython/issues/68966 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=47022 + + (19) https://github.com/python/cpython/issues/91760 + + (20) https://github.com/python/cpython/issues/92332 + + (21) https://github.com/python/cpython/issues/90224 + + (22) https://github.com/python/cpython/issues/92728 + + +File: python.info, Node: Pending Removal in Python 3 12, Next: Removed, Prev: Deprecated, Up: What’s New In Python 3 11 + +1.1.12 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 *note listed separately: 2e6. + + * *note pkgutil.ImpImporter: 2e7. + + * *note pkgutil.ImpLoader: 2e8. + + * *note PYTHONTHREADDEBUG: 2e9. + + * *note importlib.find_loader(): 2ea. + + * *note importlib.util.module_for_loader(): 2eb. + + * ‘importlib.util.set_loader_wrapper()’ + + * ‘importlib.util.set_package_wrapper()’ + + * *note importlib.abc.Loader.module_repr(): 2ec. + + * ‘importlib.abc.Loadermodule_repr()’ + + * *note importlib.abc.MetaPathFinder.find_module(): 2ed. + + * *note importlib.abc.MetaPathFinder.find_module(): 2ed. + + * *note importlib.abc.PathEntryFinder.find_loader(): 2ee. + + * *note importlib.abc.PathEntryFinder.find_module(): 2ef. + + * ‘importlib.machinery.BuiltinImporter.find_module()’ + + * ‘importlib.machinery.BuiltinLoader.module_repr()’ + + * *note importlib.machinery.FileFinder.find_loader(): 2f0. + + * ‘importlib.machinery.FileFinder.find_module()’ + + * ‘importlib.machinery.FrozenImporter.find_module()’ + + * ‘importlib.machinery.FrozenLoader.module_repr()’ + + * *note importlib.machinery.PathFinder.find_module(): 2f1. + + * ‘importlib.machinery.WindowsRegistryFinder.find_module()’ + + * *note pathlib.Path.link_to(): 2f2. + + * The entire *note distutils namespace: 2f3. + + * ‘cgi.log()’ + + * ‘sqlite3.OptimizedUnicode()’ + + * ‘sqlite3.enable_shared_cache()’ + + +File: python.info, Node: Removed, Next: Porting to Python 3 11, Prev: Pending Removal in Python 3 12, Up: What’s New In Python 3 11 + +1.1.13 Removed +-------------- + +This section lists Python APIs that have been removed in Python 3.12. + +Removed C APIs are *note listed separately: 2f7. + + * Removed the ‘@asyncio.coroutine()’ *note decorator: 2f8. enabling + legacy generator-based coroutines to be compatible with *note + async: 2f9. / *note await: 2fa. code. The function has been + deprecated since Python 3.8 and the removal was initially scheduled + for Python 3.10. Use *note async def: 19b. instead. (Contributed + by Illia Volochii in bpo-43216(1).) + + * Removed ‘asyncio.coroutines.CoroWrapper’ used for wrapping legacy + generator-based coroutine objects in the debug mode. (Contributed + by Illia Volochii in bpo-43216(2).) + + * Due to significant security concerns, the `reuse_address' parameter + of *note asyncio.loop.create_datagram_endpoint(): 2fb, disabled in + Python 3.9, is now entirely removed. This is because of the + behavior of the socket option ‘SO_REUSEADDR’ in UDP. (Contributed + by Hugo van Kemenade in bpo-45129(3).) + + * Removed the ‘binhex’ module, deprecated in Python 3.9. Also + removed the related, similarly-deprecated *note binascii: f. + functions: + + * ‘binascii.a2b_hqx()’ + + * ‘binascii.b2a_hqx()’ + + * ‘binascii.rlecode_hqx()’ + + * ‘binascii.rldecode_hqx()’ + + The *note binascii.crc_hqx(): 2fc. function remains available. + + (Contributed by Victor Stinner in bpo-45085(4).) + + * Removed the *note distutils: 37. ‘bdist_msi’ command deprecated in + Python 3.9. Use ‘bdist_wheel’ (wheel packages) instead. + (Contributed by Hugo van Kemenade in bpo-45124(5).) + + * Removed the *note __getitem__(): 2fd. methods of *note + xml.dom.pulldom.DOMEventStream: 2fe, *note + wsgiref.util.FileWrapper: 2ff. and *note fileinput.FileInput: 300, + deprecated since Python 3.9. (Contributed by Hugo van Kemenade in + bpo-45132(6).) + + * Removed the deprecated *note gettext: 83. functions ‘lgettext()’, + ‘ldgettext()’, ‘lngettext()’ and ‘ldngettext()’. Also removed the + ‘bind_textdomain_codeset()’ function, the + ‘NullTranslations.output_charset()’ and + ‘NullTranslations.set_output_charset()’ methods, and the `codeset' + parameter of ‘translation()’ and ‘install()’, since they are only + used for the ‘l*gettext()’ functions. (Contributed by Dong-hee Na + and Serhiy Storchaka in bpo-44235(7).) + + * Removed from the *note inspect: 9e. module: + + * The ‘getargspec()’ function, deprecated since Python 3.0; use + *note inspect.signature(): 301. or *note + inspect.getfullargspec(): 302. instead. + + * The ‘formatargspec()’ function, deprecated since Python 3.5; + use the *note inspect.signature(): 301. function or the *note + inspect.Signature: 303. object directly. + + * The undocumented ‘Signature.from_builtin()’ and + ‘Signature.from_function()’ methods, deprecated since Python + 3.5; use the *note Signature.from_callable(): 304. method + instead. + + (Contributed by Hugo van Kemenade in bpo-45320(8).) + + * Removed the *note __class_getitem__(): 305. method from *note + pathlib.PurePath: 306, because it was not used and added by mistake + in previous versions. (Contributed by Nikita Sobolev in + bpo-46483(9).) + + * Removed the ‘MailmanProxy’ class in the *note smtpd: e9. module, as + it is unusable without the external ‘mailman’ package. + (Contributed by Dong-hee Na in bpo-35800(10).) + + * Removed the deprecated ‘split()’ method of ‘_tkinter.TkappType’. + (Contributed by Erlend E. Aasland in bpo-38371(11).) + + * Removed namespace package support from *note unittest: 125. + discovery. It was introduced in Python 3.4 but has been broken + since Python 3.7. (Contributed by Inada Naoki in bpo-23882(12).) + + * Removed the undocumented private ‘float.__set_format__()’ method, + previously known as ‘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(13).) + + * The ‘--experimental-isolated-subinterpreters’ configure flag (and + corresponding ‘EXPERIMENTAL_ISOLATED_SUBINTERPRETERS’ macro) have + been removed. + + * Pynche(14) — The Pythonically Natural Color and Hue Editor — has + been moved out of ‘Tools/scripts’ and is being developed + independently(15) from the Python source tree. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43216 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43216 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45129 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45085 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45124 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45132 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=44235 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45320 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46483 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35800 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38371 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=23882 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=46852 + + (14) https://pypi.org/project/pynche/ + + (15) https://gitlab.com/warsaw/pynche/-/tree/main + + +File: python.info, Node: Porting to Python 3 11, Next: Build Changes, Prev: Removed, Up: What’s New In Python 3 11 + +1.1.14 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 *note listed separately: 30a. + + * *note open(): 30b, *note io.open(): 30c, *note codecs.open(): 30d. + and *note fileinput.FileInput: 300. no longer accept ‘'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 ‘'U'’ flag has been deprecated since Python 3.3. The + *note newline parameter: 30e. to these functions controls how + universal newlines work. (Contributed by Victor Stinner in + bpo-37330(1).) + + * *note ast.AST: 30f. node positions are now validated when provided + to *note compile(): 310. and other related functions. If invalid + positions are detected, a *note ValueError: 1c8. will be raised. + (Contributed by Pablo Galindo in gh-93351(2)) + + * Prohibited passing non-*note concurrent.futures.ThreadPoolExecutor: + 311. executors to *note asyncio.loop.set_default_executor(): 312. + following a deprecation in Python 3.8. (Contributed by Illia + Volochii in bpo-43234(3).) + + * *note calendar: 13.: The *note calendar.LocaleTextCalendar: 313. + and *note calendar.LocaleHTMLCalendar: 314. classes now use *note + locale.getlocale(): 2e0, instead of using *note + locale.getdefaultlocale(): 2dd, if no locale is specified. + (Contributed by Victor Stinner in bpo-46659(4).) + + * The *note pdb: c6. module now reads the ‘.pdbrc’ configuration file + with the ‘'UTF-8'’ encoding. (Contributed by Srinivas Reddy + Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) in bpo-41137(5).) + + * The `population' parameter of *note random.sample(): 315. must be a + sequence, and automatic conversion of *note set: 1a6.s to *note + list: 1e9.s is no longer supported. Also, if the sample size is + larger than the population size, a *note ValueError: 1c8. is + raised. (Contributed by Raymond Hettinger in bpo-40465(6).) + + * The `random' optional parameter of *note random.shuffle(): 316. was + removed. It was previously an arbitrary random function to use for + the shuffle; now, *note random.random(): 317. (its previous + default) will always be used. + + * In *note re: da. *note Regular Expression Syntax: 318, global + inline flags (e.g. ‘(?i)’) can now only be used at the start of + regular expressions. Using them elsewhere has been deprecated + since Python 3.6. (Contributed by Serhiy Storchaka in + bpo-47066(7).) + + * In the *note re: da. 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(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37330 + + (2) https://github.com/python/cpython/issues/93351 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43234 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46659 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41137 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40465 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=47066 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35859 + + +File: python.info, Node: Build Changes, Next: C API Changes, Prev: Porting to Python 3 11, Up: What’s New In Python 3 11 + +1.1.15 Build Changes +-------------------- + + * CPython now has PEP 11(1) Tier 3 support(2) for cross compiling to + the WebAssembly(3) platforms Emscripten(4) + (‘wasm32-unknown-emscripten’, i.e. Python in the browser) and + WebAssembly System Interface (WASI)(5) (‘wasm32-unknown-wasi’). + The effort is inspired by previous work like Pyodide(6). 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(7) and WASI contributed by Christian Heimes in + gh-90473(8); platforms promoted in gh-95085(9)) + + * Building Python now requires: + + * A C11(10) compiler. Optional C11 features(11) are not + required. (Contributed by Victor Stinner in bpo-46656(12).) + + * Support for IEEE 754(13) floating point numbers. (Contributed + by Victor Stinner in bpo-46917(14).) + + * Support for floating point Not-a-Number (NaN)(15), as the + ‘Py_NO_NAN’ macro has been removed. (Contributed by Victor + Stinner in bpo-46656(16).) + + * A C99(17) ‘’ header file providing the ‘copysign()’, + ‘hypot()’, ‘isfinite()’, ‘isinf()’, ‘isnan()’, and ‘round()’ + functions (contributed by Victor Stinner in bpo-45440(18)); + and a ‘NAN’ constant or the ‘__builtin_nan()’ function + (Contributed by Victor Stinner in bpo-46640(19)). + + * The *note tkinter: 10e. package now requires Tcl/Tk(20) version + 8.5.12 or newer. (Contributed by Serhiy Storchaka in + bpo-46996(21).) + + * Build dependencies, compiler flags, and linker flags for most + stdlib extension modules are now detected by ‘configure’. libffi, + libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk, and + uuid flags are detected by pkg-config(22) (when available). *note + tkinter: 10e. now requires a pkg-config command to detect + development settings for Tcl/Tk(23) headers and libraries. + (Contributed by Christian Heimes and Erlend Egeberg Aasland in + bpo-45847(24), bpo-45747(25), and bpo-45763(26).) + + * libpython is no longer linked against libcrypt. (Contributed by + Mike Gilbert in bpo-45433(27).) + + * CPython can now be built with the ThinLTO(28) option via passing + ‘thin’ to *note –with-lto: 31b, i.e. ‘--with-lto=thin’. + (Contributed by Dong-hee Na and Brett Holman in bpo-44340(29).) + + * Freelists for object structs can now be disabled. A new + ‘configure’ option ‘--without-freelists’ can be used to disable all + freelists except empty tuple singleton. (Contributed by Christian + Heimes in bpo-45522(30).) + + * ‘Modules/Setup’ and ‘Modules/makesetup’ have been improved and tied + up. Extension modules can now be built through ‘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(31), bpo-45570(32), bpo-45571(33), and + bpo-43974(34).) + + Note: Use the environment variables ‘TCLTK_CFLAGS’ and + ‘TCLTK_LIBS’ to manually specify the location of Tcl/Tk + headers and libraries. The ‘configure’ options + ‘--with-tcltk-includes’ and ‘--with-tcltk-libs’ have been + removed. + + On RHEL 7 and CentOS 7 the development packages do not provide + ‘tcl.pc’ and ‘tk.pc’; use ‘TCLTK_LIBS="-ltk8.5 -ltkstub8.5 + -ltcl8.5"’. The directory ‘Misc/rhel7’ contains ‘.pc’ files + and instructions on how to build Python with RHEL 7’s and + CentOS 7’s Tcl/Tk and OpenSSL. + + * CPython will now use 30-bit digits by default for the Python *note + int: 1c7. implementation. Previously, the default was to use + 30-bit digits on platforms with ‘SIZEOF_VOID_P >= 8’, and 15-bit + digits otherwise. It’s still possible to explicitly request use of + 15-bit digits via either the *note –enable-big-digits: 31c. option + to the configure script or (for Windows) the ‘PYLONG_BITS_IN_DIGIT’ + variable in ‘PC/pyconfig.h’, but this option may be removed at some + point in the future. (Contributed by Mark Dickinson in + bpo-45569(35).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0011/ + + (2) https://peps.python.org/pep-0011/#tier-3 + + (3) https://webassembly.org/ + + (4) https://emscripten.org/ + + (5) https://wasi.dev/ + + (6) https://pyodide.org/ + + (7) https://github.com/python/cpython/issues/84461 + + (8) https://github.com/python/cpython/issues/90473 + + (9) https://github.com/python/cpython/issues/95085 + + (10) https://en.cppreference.com/w/c/11 + + (11) +https://en.wikipedia.org/wiki/C11_(C_standard_revision)#Optional_features + + (12) https://bugs.python.org/issue?@action=redirect&bpo=46656 + + (13) https://en.wikipedia.org/wiki/IEEE_754 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=46917 + + (15) https://en.wikipedia.org/wiki/NaN#Floating_point + + (16) https://bugs.python.org/issue?@action=redirect&bpo=46656 + + (17) https://en.cppreference.com/w/c/99 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=45440 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=46640 + + (20) https://www.tcl.tk + + (21) https://bugs.python.org/issue?@action=redirect&bpo=46996 + + (22) https://www.freedesktop.org/wiki/Software/pkg-config/ + + (23) https://www.tcl.tk + + (24) https://bugs.python.org/issue?@action=redirect&bpo=45847 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=45747 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=45763 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=45433 + + (28) https://clang.llvm.org/docs/ThinLTO.html + + (29) https://bugs.python.org/issue?@action=redirect&bpo=44340 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=45522 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=45548 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=45570 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=45571 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=43974 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=45569 + + +File: python.info, Node: C API Changes, Prev: Build Changes, Up: What’s New In Python 3 11 + +1.1.16 C API Changes +-------------------- + +* Menu: + +* New Features: New Features<2>. +* Porting to Python 3.11: Porting to Python 3 11<2>. +* Deprecated: Deprecated<2>. +* Pending Removal in Python 3.12: Pending Removal in Python 3 12<2>. +* Removed: Removed<2>. + + +File: python.info, Node: New Features<2>, Next: Porting to Python 3 11<2>, Up: C API Changes + +1.1.16.1 New Features +..................... + + * Add a new *note PyType_GetName(): 321. function to get type’s short + name. (Contributed by Hai Shi in bpo-42035(1).) + + * Add a new *note PyType_GetQualName(): 322. function to get type’s + qualified name. (Contributed by Hai Shi in bpo-42035(2).) + + * Add new *note PyThreadState_EnterTracing(): 323. and *note + PyThreadState_LeaveTracing(): 324. functions to the limited C API + to suspend and resume tracing and profiling. (Contributed by + Victor Stinner in bpo-43760(3).) + + * Added the *note Py_Version: 325. constant which bears the same + value as *note PY_VERSION_HEX: 326. (Contributed by Gabriele N. + Tornetta in bpo-43931(4).) + + * *note Py_buffer: 327. and APIs are now part of the limited API and + the stable ABI: + + * *note PyObject_CheckBuffer(): 328. + + * *note PyObject_GetBuffer(): 329. + + * *note PyBuffer_GetPointer(): 32a. + + * *note PyBuffer_SizeFromFormat(): 32b. + + * *note PyBuffer_ToContiguous(): 32c. + + * *note PyBuffer_FromContiguous(): 32d. + + * ‘PyBuffer_CopyData()’ + + * *note PyBuffer_IsContiguous(): 32e. + + * *note PyBuffer_FillContiguousStrides(): 32f. + + * *note PyBuffer_FillInfo(): 330. + + * *note PyBuffer_Release(): 331. + + * *note PyMemoryView_FromBuffer(): 332. + + * *note bf_getbuffer: 333. and *note bf_releasebuffer: 334. type + slots + + (Contributed by Christian Heimes in bpo-45459(5).) + + * Added the *note PyType_GetModuleByDef: 335. function, used to get + the module in which a method was defined, in cases where this + information is not available directly (via *note PyCMethod: 336.). + (Contributed by Petr Viktorin in bpo-46613(6).) + + * Add new functions to pack and unpack C double (serialize and + deserialize): *note PyFloat_Pack2(): 337, *note PyFloat_Pack4(): + 338, *note PyFloat_Pack8(): 339, *note PyFloat_Unpack2(): 33a, + *note PyFloat_Unpack4(): 33b. and *note PyFloat_Unpack8(): 33c. + (Contributed by Victor Stinner in bpo-46906(7).) + + * Add new functions to get frame object attributes: *note + PyFrame_GetBuiltins(): 33d, *note PyFrame_GetGenerator(): 33e, + *note PyFrame_GetGlobals(): 33f, *note PyFrame_GetLasti(): 340. + + * Added two new functions to get and set the active exception + instance: *note PyErr_GetHandledException(): 341. and *note + PyErr_SetHandledException(): 342. These are alternatives to *note + PyErr_SetExcInfo(): 343. and *note PyErr_GetExcInfo(): 344. which + work with the legacy 3-tuple representation of exceptions. + (Contributed by Irit Katriel in bpo-46343(8).) + + * Added the *note PyConfig.safe_path: 345. member. (Contributed by + Victor Stinner in gh-57684(9).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42035 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42035 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43760 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43931 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45459 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46613 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46906 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46343 + + (9) https://github.com/python/cpython/issues/57684 + + +File: python.info, Node: Porting to Python 3 11<2>, Next: Deprecated<2>, Prev: New Features<2>, Up: C API Changes + +1.1.16.2 Porting to Python 3.11 +............................... + + * Some macros have been converted to static inline functions to avoid + macro pitfalls(1). 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 PEP 670(2) for more details. + (Contributed by Victor Stinner and Erlend E. Aasland in + gh-89653(3).) + + * *note PyErr_SetExcInfo(): 343. no longer uses the ‘type’ and + ‘traceback’ arguments, the interpreter now derives those values + from the exception instance (the ‘value’ argument). The function + still steals references of all three arguments. (Contributed by + Irit Katriel in bpo-45711(4).) + + * *note PyErr_GetExcInfo(): 344. now derives the ‘type’ and + ‘traceback’ fields of the result from the exception instance (the + ‘value’ field). (Contributed by Irit Katriel in bpo-45711(5).) + + * *note _frozen: 347. has a new ‘is_package’ field to indicate + whether or not the frozen module is a package. Previously, a + negative value in the ‘size’ field was the indicator. Now only + non-negative values be used for ‘size’. (Contributed by Kumar + Aditya in bpo-46608(6).) + + * *note _PyFrameEvalFunction(): 348. now takes ‘_PyInterpreterFrame*’ + as its second parameter, instead of ‘PyFrameObject*’. See PEP + 523(7) for more details of how to use this function pointer type. + + * *note PyCode_New(): 349. and *note PyCode_NewWithPosOnlyArgs(): + 34a. now take an additional ‘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 ‘replace’ method. + + * *note PyCodeObject: 34b. no longer has the ‘co_code’, + ‘co_varnames’, ‘co_cellvars’ and ‘co_freevars’ fields. Instead, + use *note PyCode_GetCode(): 34c, *note PyCode_GetVarnames(): 34d, + *note PyCode_GetCellvars(): 34e. and *note PyCode_GetFreevars(): + 34f. respectively to access them via the C API. (Contributed by + Brandt Bucher in bpo-46841(8) and Ken Jin in gh-92154(9) and + gh-94936(10).) + + * The old trashcan macros + (‘Py_TRASHCAN_SAFE_BEGIN’/‘Py_TRASHCAN_SAFE_END’) are now + deprecated. They should be replaced by the new macros + ‘Py_TRASHCAN_BEGIN’ and ‘Py_TRASHCAN_END’. + + A tp_dealloc function that has the old macros, such as: + + static void + mytype_dealloc(mytype *p) + { + PyObject_GC_UnTrack(p); + Py_TRASHCAN_SAFE_BEGIN(p); + ... + Py_TRASHCAN_SAFE_END + } + + should migrate to the new macros as follows: + + static void + mytype_dealloc(mytype *p) + { + PyObject_GC_UnTrack(p); + Py_TRASHCAN_BEGIN(p, mytype_dealloc) + ... + Py_TRASHCAN_END + } + + Note that ‘Py_TRASHCAN_BEGIN’ has a second argument 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 ‘mypy’ codebase): + + #if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 8 + # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) + # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END + #else + # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) + # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) + #endif + + * The *note PyType_Ready(): 350. function now raises an error if a + type is defined with the *note Py_TPFLAGS_HAVE_GC: 351. flag set + but has no traverse function (*note PyTypeObject.tp_traverse: + 352.). (Contributed by Victor Stinner in bpo-44263(11).) + + * Heap types with the *note Py_TPFLAGS_IMMUTABLETYPE: 353. flag can + now inherit the PEP 590(12) vectorcall protocol. Previously, this + was only possible for *note static types: 354. (Contributed by + Erlend E. Aasland in bpo-43908(13)) + + * Since *note Py_TYPE(): 355. is changed to a inline static function, + ‘Py_TYPE(obj) = new_type’ must be replaced with ‘Py_SET_TYPE(obj, + new_type)’: see the *note Py_SET_TYPE(): 356. function (available + since Python 3.9). For backward compatibility, this macro can be + used: + + #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 + + (Contributed by Victor Stinner in bpo-39573(14).) + + * Since *note Py_SIZE(): 357. is changed to a inline static function, + ‘Py_SIZE(obj) = new_size’ must be replaced with ‘Py_SET_SIZE(obj, + new_size)’: see the *note Py_SET_SIZE(): 358. function (available + since Python 3.9). For backward compatibility, this macro can be + used: + + #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 + + (Contributed by Victor Stinner in bpo-39573(15).) + + * ‘’ no longer includes the header files ‘’, + ‘’, ‘’ and ‘’ when the ‘Py_LIMITED_API’ + macro is set to ‘0x030b0000’ (Python 3.11) or higher. C extensions + should explicitly include the header files after ‘#include + ’. (Contributed by Victor Stinner in bpo-45434(16).) + + * The non-limited API files ‘cellobject.h’, ‘classobject.h’, + ‘code.h’, ‘context.h’, ‘funcobject.h’, ‘genobject.h’ and + ‘longintrepr.h’ have been moved to the ‘Include/cpython’ directory. + Moreover, the ‘eval.h’ header file was removed. These files must + not be included directly, as they are already included in + ‘Python.h’: *note Include Files: 359. If they have been included + directly, consider including ‘Python.h’ instead. (Contributed by + Victor Stinner in bpo-35134(17).) + + * The ‘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(18).) + + * The following frame functions and type are now directly available + with ‘#include ’, it’s no longer needed to add ‘#include + ’: + + * ‘PyFrame_Check()’ + + * *note PyFrame_GetBack(): 35a. + + * *note PyFrame_GetBuiltins(): 33d. + + * *note PyFrame_GetGenerator(): 33e. + + * *note PyFrame_GetGlobals(): 33f. + + * *note PyFrame_GetLasti(): 340. + + * *note PyFrame_GetLocals(): 35b. + + * ‘PyFrame_Type’ + + (Contributed by Victor Stinner in gh-93937(19).) + + * The *note PyFrameObject: 35d. structure members have been removed + from the public C API. + + While the documentation notes that the *note PyFrameObject: 35d. + 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. + + *note PyFrameObject: 35d. fields: + + * ‘f_back’: use *note PyFrame_GetBack(): 35a. + + * ‘f_blockstack’: removed. + + * ‘f_builtins’: use *note PyFrame_GetBuiltins(): 33d. + + * ‘f_code’: use *note PyFrame_GetCode(): 35e. + + * ‘f_gen’: use *note PyFrame_GetGenerator(): 33e. + + * ‘f_globals’: use *note PyFrame_GetGlobals(): 33f. + + * ‘f_iblock’: removed. + + * ‘f_lasti’: use *note PyFrame_GetLasti(): 340. Code using + ‘f_lasti’ with ‘PyCode_Addr2Line()’ should use *note + PyFrame_GetLineNumber(): 35f. instead; it may be faster. + + * ‘f_lineno’: use *note PyFrame_GetLineNumber(): 35f. + + * ‘f_locals’: use *note PyFrame_GetLocals(): 35b. + + * ‘f_stackdepth’: removed. + + * ‘f_state’: no public API (renamed to ‘f_frame.f_state’). + + * ‘f_trace’: no public API. + + * ‘f_trace_lines’: use ‘PyObject_GetAttrString((PyObject*)frame, + "f_trace_lines")’. + + * ‘f_trace_opcodes’: use + ‘PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")’. + + * ‘f_localsplus’: no public API (renamed to + ‘f_frame.localsplus’). + + * ‘f_valuestack’: removed. + + The Python frame object is now created lazily. A side effect is + that the ‘f_back’ member must not be accessed directly, since its + value is now also computed lazily. The *note PyFrame_GetBack(): + 35a. function must be called instead. + + Debuggers that accessed the ‘f_locals’ directly `must' call *note + PyFrame_GetLocals(): 35b. instead. They no longer need to call + ‘PyFrame_FastToLocalsWithError()’ or ‘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 ‘PyFrame_GetCode()’ on Python 3.8 and older: + + #if PY_VERSION_HEX < 0x030900B1 + static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) + { + Py_INCREF(frame->f_code); + return frame->f_code; + } + #endif + + Code defining ‘PyFrame_GetBack()’ on Python 3.8 and older: + + #if PY_VERSION_HEX < 0x030900B1 + static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) + { + Py_XINCREF(frame->f_back); + return frame->f_back; + } + #endif + + Or use the pythoncapi_compat project(20) to get these two functions + on older Python versions. + + * Changes of the *note PyThreadState: 360. structure members: + + * ‘frame’: removed, use *note PyThreadState_GetFrame(): 361. + (function added to Python 3.9 by bpo-40429(21)). Warning: the + function returns a *note strong reference: 362, need to call + *note Py_XDECREF(): 363. + + * ‘tracing’: changed, use *note PyThreadState_EnterTracing(): + 323. and *note PyThreadState_LeaveTracing(): 324. (functions + added to Python 3.11 by bpo-43760(22)). + + * ‘recursion_depth’: removed, use ‘(tstate->recursion_limit - + tstate->recursion_remaining)’ instead. + + * ‘stackcheck_counter’: removed. + + Code defining ‘PyThreadState_GetFrame()’ on Python 3.8 and older: + + #if PY_VERSION_HEX < 0x030900B1 + static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) + { + Py_XINCREF(tstate->frame); + return tstate->frame; + } + #endif + + Code defining ‘PyThreadState_EnterTracing()’ and + ‘PyThreadState_LeaveTracing()’ on Python 3.10 and older: + + #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 + + Or use the pythoncapi_compat project(23) to get these functions on + old Python functions. + + * Distributors are encouraged to build Python with the optimized + Blake2 library libb2(24). + + * The *note PyConfig.module_search_paths_set: 1c0. field must now be + set to 1 for initialization to use *note + PyConfig.module_search_paths: 1c1. to initialize *note sys.path: + 162. Otherwise, initialization will recalculate the path and + replace any values added to ‘module_search_paths’. + + * ‘PyConfig_Read()’ no longer calculates the initial search path, and + will not fill any values into *note PyConfig.module_search_paths: + 1c1. To calculate default paths and then modify them, finish + initialization and use *note PySys_GetObject(): 364. to retrieve + *note sys.path: 162. as a Python list object and modify it + directly. + + ---------- Footnotes ---------- + + (1) https://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html + + (2) https://peps.python.org/pep-0670/ + + (3) https://github.com/python/cpython/issues/89653 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46608 + + (7) https://peps.python.org/pep-0523/ + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (9) https://github.com/python/cpython/issues/92154 + + (10) https://github.com/python/cpython/issues/94936 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=44263 + + (12) https://peps.python.org/pep-0590/ + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43908 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=45434 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=46007 + + (19) https://github.com/python/cpython/issues/93937 + + (20) https://github.com/python/pythoncapi_compat + + (21) https://bugs.python.org/issue?@action=redirect&bpo=40429 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=43760 + + (23) https://github.com/python/pythoncapi_compat + + (24) https://www.blake2.net/ + + +File: python.info, Node: Deprecated<2>, Next: Pending Removal in Python 3 12<2>, Prev: Porting to Python 3 11<2>, Up: C API Changes + +1.1.16.3 Deprecated +................... + + * Deprecate the following functions to configure the Python + initialization: + + * *note PySys_AddWarnOptionUnicode(): 366. + + * *note PySys_AddWarnOption(): 367. + + * *note PySys_AddXOption(): 368. + + * ‘PySys_HasWarnOptions()’ + + * *note PySys_SetArgvEx(): 369. + + * *note PySys_SetArgv(): 36a. + + * *note PySys_SetPath(): 36b. + + * *note Py_SetPath(): 36c. + + * *note Py_SetProgramName(): 36d. + + * *note Py_SetPythonHome(): 36e. + + * *note Py_SetStandardStreamEncoding(): 36f. + + * ‘_Py_SetProgramFullPath()’ + + Use the new *note PyConfig: 370. API of the *note Python + Initialization Configuration: 371. instead ( PEP 587(1)). + (Contributed by Victor Stinner in gh-88279(2).) + + * Deprecate the ‘ob_shash’ member of the *note PyBytesObject: 372. + Use *note PyObject_Hash(): 373. instead. (Contributed by Inada + Naoki in bpo-46864(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0587/ + + (2) https://github.com/python/cpython/issues/88279 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46864 + + +File: python.info, Node: Pending Removal in Python 3 12<2>, Next: Removed<2>, Prev: Deprecated<2>, Up: C API Changes + +1.1.16.4 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. + + * *note PyUnicode_AS_DATA(): 375. + + * *note PyUnicode_AS_UNICODE(): 376. + + * *note PyUnicode_AsUnicodeAndSize(): 377. + + * *note PyUnicode_AsUnicode(): 378. + + * *note PyUnicode_FromUnicode(): 379. + + * *note PyUnicode_GET_DATA_SIZE(): 37a. + + * *note PyUnicode_GET_SIZE(): 37b. + + * *note PyUnicode_GetSize(): 37c. + + * ‘PyUnicode_IS_COMPACT()’ + + * ‘PyUnicode_IS_READY()’ + + * *note PyUnicode_READY(): 37d. + + * ‘Py_UNICODE_WSTR_LENGTH()’ + + * ‘_PyUnicode_AsUnicode()’ + + * *note PyUnicode_WCHAR_KIND: 37e. + + * *note PyUnicodeObject: 37f. + + * ‘PyUnicode_InternImmortal()’ + + +File: python.info, Node: Removed<2>, Prev: Pending Removal in Python 3 12<2>, Up: C API Changes + +1.1.16.5 Removed +................ + + * ‘PyFrame_BlockSetup()’ and ‘PyFrame_BlockPop()’ have been removed. + (Contributed by Mark Shannon in bpo-40222(1).) + + * Remove the following math macros using the ‘errno’ variable: + + * ‘Py_ADJUST_ERANGE1()’ + + * ‘Py_ADJUST_ERANGE2()’ + + * ‘Py_OVERFLOWED()’ + + * ‘Py_SET_ERANGE_IF_OVERFLOW()’ + + * ‘Py_SET_ERRNO_ON_MATH_ERROR()’ + + (Contributed by Victor Stinner in bpo-45412(2).) + + * Remove ‘Py_UNICODE_COPY()’ and ‘Py_UNICODE_FILL()’ macros, + deprecated since Python 3.3. Use ‘PyUnicode_CopyCharacters()’ or + ‘memcpy()’ (‘wchar_t*’ string), and ‘PyUnicode_Fill()’ functions + instead. (Contributed by Victor Stinner in bpo-41123(3).) + + * Remove the ‘pystrhex.h’ header file. It only contains private + functions. C extensions should only include the main ‘’ + header file. (Contributed by Victor Stinner in bpo-45434(4).) + + * Remove the ‘Py_FORCE_DOUBLE()’ macro. It was used by the + ‘Py_IS_INFINITY()’ macro. (Contributed by Victor Stinner in + bpo-45440(5).) + + * The following items are no longer available when *note + Py_LIMITED_API: 381. is defined: + + * *note PyMarshal_WriteLongToFile(): 382. + + * *note PyMarshal_WriteObjectToFile(): 383. + + * *note PyMarshal_ReadObjectFromString(): 384. + + * *note PyMarshal_WriteObjectToString(): 385. + + * the ‘Py_MARSHAL_VERSION’ macro + + These are not part of the *note limited API: 386. + + (Contributed by Victor Stinner in bpo-45474(6).) + + * Exclude *note PyWeakref_GET_OBJECT(): 387. from the limited C API. + It never worked since the ‘PyWeakReference’ structure is opaque in + the limited C API. (Contributed by Victor Stinner in bpo-35134(7).) + + * Remove the ‘PyHeapType_GET_MEMBERS()’ macro. It was exposed in the + public C API by mistake, it must only be used by Python internally. + Use the ‘PyTypeObject.tp_members’ member instead. (Contributed by + Victor Stinner in bpo-40170(8).) + + * Remove the ‘HAVE_PY_SET_53BIT_PRECISION’ macro (moved to the + internal C API). (Contributed by Victor Stinner in bpo-45412(9).) + + * Remove the *note Py_UNICODE: 388. 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: + + * ‘PyUnicode_Encode()’ + + * ‘PyUnicode_EncodeASCII()’ + + * ‘PyUnicode_EncodeLatin1()’ + + * ‘PyUnicode_EncodeUTF7()’ + + * ‘PyUnicode_EncodeUTF8()’ + + * ‘PyUnicode_EncodeUTF16()’ + + * ‘PyUnicode_EncodeUTF32()’ + + * ‘PyUnicode_EncodeUnicodeEscape()’ + + * ‘PyUnicode_EncodeRawUnicodeEscape()’ + + * ‘PyUnicode_EncodeCharmap()’ + + * ‘PyUnicode_TranslateCharmap()’ + + * ‘PyUnicode_EncodeDecimal()’ + + * ‘PyUnicode_TransformDecimalToASCII()’ + + See PEP 624(10) for details and migration guidance(11). + (Contributed by Inada Naoki in bpo-44029(12).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40222 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45412 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41123 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45434 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45440 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45474 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45412 + + (10) https://peps.python.org/pep-0624/ + + (11) https://peps.python.org/pep-0624/#alternative-apis + + (12) https://bugs.python.org/issue?@action=redirect&bpo=44029 + + +File: python.info, Node: What’s New In Python 3 10, Next: What’s New In Python 3 9, Prev: What’s New In Python 3 11, Up: What’s New in Python + +1.2 What’s New In Python 3.10 +============================= + + +Release: 3.11.0 + + +Date: March 03, 2023 + + +Editor: Pablo Galindo Salgado + +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 +*note changelog: 158. + +* Menu: + +* Summary – Release highlights: Summary – Release highlights<2>. +* New Features: New Features<3>. +* New Features Related to Type Hints: New Features Related to Type Hints<2>. +* Other Language Changes: Other Language Changes<2>. +* New Modules: New Modules<2>. +* Improved Modules: Improved Modules<2>. +* Optimizations: Optimizations<2>. +* Deprecated: Deprecated<3>. +* Removed: Removed<3>. +* Porting to Python 3.10: Porting to Python 3 10. +* CPython bytecode changes: CPython bytecode changes<2>. +* Build Changes: Build Changes<2>. +* C API Changes: C API Changes<2>. + + +File: python.info, Node: Summary – Release highlights<2>, Next: New Features<3>, Up: What’s New In Python 3 10 + +1.2.1 Summary – Release highlights +---------------------------------- + +New syntax features: + + * PEP 634(1), Structural Pattern Matching: Specification + + * PEP 635(2), Structural Pattern Matching: Motivation and Rationale + + * PEP 636(3), Structural Pattern Matching: Tutorial + + * bpo-12782(4), Parenthesized context managers are now officially + allowed. + +New features in the standard library: + + * PEP 618(5), Add Optional Length-Checking To zip. + +Interpreter improvements: + + * PEP 626(6), Precise line numbers for debugging and other tools. + +New typing features: + + * PEP 604(7), Allow writing union types as X | Y + + * PEP 613(8), Explicit Type Aliases + + * PEP 612(9), Parameter Specification Variables + +Important deprecations, removals or restrictions: + + * PEP 644(10), Require OpenSSL 1.1.1 or newer + + * PEP 632(11), Deprecate distutils module. + + * PEP 623(12), Deprecate and prepare for the removal of the wstr + member in PyUnicodeObject. + + * PEP 624(13), Remove Py_UNICODE encoder APIs + + * PEP 597(14), Add optional EncodingWarning + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0634/ + + (2) https://peps.python.org/pep-0635/ + + (3) https://peps.python.org/pep-0636/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=12782 + + (5) https://peps.python.org/pep-0618/ + + (6) https://peps.python.org/pep-0626/ + + (7) https://peps.python.org/pep-0604/ + + (8) https://peps.python.org/pep-0613/ + + (9) https://peps.python.org/pep-0612/ + + (10) https://peps.python.org/pep-0644/ + + (11) https://peps.python.org/pep-0632/ + + (12) https://peps.python.org/pep-0623/ + + (13) https://peps.python.org/pep-0624/ + + (14) https://peps.python.org/pep-0597/ + + +File: python.info, Node: New Features<3>, Next: New Features Related to Type Hints<2>, Prev: Summary – Release highlights<2>, Up: What’s New In Python 3 10 + +1.2.2 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:: + + +File: python.info, Node: Parenthesized context managers, Next: Better error messages, Up: New Features<3> + +1.2.2.1 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: + + with (CtxManager() as example): + ... + + with ( + CtxManager1(), + CtxManager2() + ): + ... + + with (CtxManager1() as example, + CtxManager2()): + ... + + with (CtxManager1(), + CtxManager2() as example): + ... + + with ( + CtxManager1() as example1, + CtxManager2() as example2 + ): + ... + +it is also possible to use a trailing comma at the end of the enclosed +group: + + with ( + CtxManager1() as example1, + CtxManager2() as example2, + CtxManager3() as example3, + ): + ... + +This new syntax uses the non LL(1) capacities of the new parser. Check +PEP 617(1) for more details. + +(Contributed by Guido van Rossum, Pablo Galindo and Lysandros Nikolaou +in bpo-12782(2) and bpo-40334(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0617/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=12782 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40334 + + +File: python.info, Node: Better error messages, Next: PEP 626 Precise line numbers for debugging and other tools, Prev: Parenthesized context managers, Up: New Features<3> + +1.2.2.2 Better error messages +............................. + +* Menu: + +* SyntaxErrors:: +* IndentationErrors:: +* AttributeErrors:: +* NameErrors:: + + +File: python.info, Node: SyntaxErrors, Next: IndentationErrors, Up: Better error messages + +1.2.2.3 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 ‘{‘): + + 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() + +Previous versions of the interpreter reported confusing places as the +location of the syntax error: + + File "example.py", line 3 + some_other_code = foo() + ^ + SyntaxError: invalid syntax + +but in Python 3.10 a more informative error is emitted: + + 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 + +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(1) and Batuhan Taskaya in +bpo-40176(2).) + +*note SyntaxError: 2d6. 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): + + >>> foo(x, z for z in range(10), t, w) + File "", line 1 + foo(x, z for z in range(10), t, w) + ^ + SyntaxError: Generator expression must be parenthesized + +now Python 3.10 will display the exception as: + + >>> foo(x, z for z in range(10), t, w) + File "", line 1 + foo(x, z for z in range(10), t, w) + ^^^^^^^^^^^^^^^^^^^^ + SyntaxError: Generator expression must be parenthesized + +This improvement was contributed by Pablo Galindo in bpo-43914(3). + +A considerable amount of new specialized messages for *note SyntaxError: +2d6. exceptions have been incorporated. Some of the most notable ones +are as follows: + + * Missing ‘:’ before blocks: + + >>> if rocket.position > event_horizon + File "", line 1 + if rocket.position > event_horizon + ^ + SyntaxError: expected ':' + + (Contributed by Pablo Galindo in bpo-42997(4).) + + * Unparenthesised tuples in comprehensions targets: + + >>> {x,y for x,y in zip('abcd', '1234')} + File "", line 1 + {x,y for x,y in zip('abcd', '1234')} + ^ + SyntaxError: did you forget parentheses around the comprehension target? + + (Contributed by Pablo Galindo in bpo-43017(5).) + + * Missing commas in collection literals and between expressions: + + >>> items = { + ... x: 1, + ... y: 2 + ... z: 3, + File "", line 3 + y: 2 + ^ + SyntaxError: invalid syntax. Perhaps you forgot a comma? + + (Contributed by Pablo Galindo in bpo-43822(6).) + + * Multiple Exception types without parentheses: + + >>> try: + ... build_dyson_sphere() + ... except NotEnoughScienceError, NotEnoughResourcesError: + File "", line 3 + except NotEnoughScienceError, NotEnoughResourcesError: + ^ + SyntaxError: multiple exception types must be parenthesized + + (Contributed by Pablo Galindo in bpo-43149(7).) + + * Missing ‘:’ and values in dictionary literals: + + >>> values = { + ... x: 1, + ... y: 2, + ... z: + ... } + File "", line 4 + z: + ^ + SyntaxError: expression expected after dictionary key and ':' + + >>> values = {x:1, y:2, z w:3} + File "", line 1 + values = {x:1, y:2, z w:3} + ^ + SyntaxError: ':' expected after dictionary key + + (Contributed by Pablo Galindo in bpo-43823(8).) + + * ‘try’ blocks without ‘except’ or ‘finally’ blocks: + + >>> try: + ... x = 2 + ... something = 3 + File "", line 3 + something = 3 + ^^^^^^^^^ + SyntaxError: expected 'except' or 'finally' block + + (Contributed by Pablo Galindo in bpo-44305(9).) + + * Usage of ‘=’ instead of ‘==’ in comparisons: + + >>> if rocket.position = event_horizon: + File "", line 1 + if rocket.position = event_horizon: + ^ + SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='? + + (Contributed by Pablo Galindo in bpo-43797(10).) + + * Usage of ‘*’ in f-strings: + + >>> f"Black holes {*all_black_holes} and revelations" + File "", line 1 + (*all_black_holes) + ^ + SyntaxError: f-string: cannot use starred expression here + + (Contributed by Pablo Galindo in bpo-41064(11).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42864 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40176 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43914 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42997 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43017 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43822 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43149 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43823 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=44305 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43797 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=41064 + + +File: python.info, Node: IndentationErrors, Next: AttributeErrors, Prev: SyntaxErrors, Up: Better error messages + +1.2.2.4 IndentationErrors +......................... + +Many *note IndentationError: 393. exceptions now have more context +regarding what kind of block was expecting an indentation, including the +location of the statement: + + >>> def foo(): + ... if lel: + ... x = 2 + File "", line 3 + x = 2 + ^ + IndentationError: expected an indented block after 'if' statement in line 2 + + +File: python.info, Node: AttributeErrors, Next: NameErrors, Prev: IndentationErrors, Up: Better error messages + +1.2.2.5 AttributeErrors +....................... + +When printing *note AttributeError: 19d, ‘PyErr_Display()’ will offer +suggestions of similar attribute names in the object that the exception +was raised from: + + >>> collections.namedtoplo + Traceback (most recent call last): + File "", line 1, in + AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple? + +(Contributed by Pablo Galindo in bpo-38530(1).) + + Warning: Notice this won’t work if ‘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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38530 + + +File: python.info, Node: NameErrors, Prev: AttributeErrors, Up: Better error messages + +1.2.2.6 NameErrors +.................. + +When printing *note NameError: 396. raised by the interpreter, +‘PyErr_Display()’ will offer suggestions of similar variable names in +the function that the exception was raised from: + + >>> schwarzschild_black_hole = None + >>> schwarschild_black_hole + Traceback (most recent call last): + File "", line 1, in + NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole? + +(Contributed by Pablo Galindo in bpo-38530(1).) + + Warning: Notice this won’t work if ‘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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38530 + + +File: python.info, Node: PEP 626 Precise line numbers for debugging and other tools, Next: PEP 634 Structural Pattern Matching, Prev: Better error messages, Up: New Features<3> + +1.2.2.7 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 ‘f_lineno’ attribute of frame objects will always contain the +expected line number. + +The ‘co_lnotab’ attribute of 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 ‘co_lines()’ method instead. + + +File: python.info, Node: PEP 634 Structural Pattern Matching, Next: Optional EncodingWarning and encoding="locale" option, Prev: PEP 626 Precise line numbers for debugging and other tools, Up: New Features<3> + +1.2.2.8 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:: + + +File: python.info, Node: Syntax and operations, Next: Declarative approach, Up: PEP 634 Structural Pattern Matching + +1.2.2.9 Syntax and operations +............................. + +The generic syntax of pattern matching is: + + match subject: + case : + + case : + + case : + + case _: + + +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: + + 1. using data with type and shape (the ‘subject’) + + 2. evaluating the ‘subject’ in the ‘match’ statement + + 3. comparing the subject with each pattern in a ‘case’ statement + from top to bottom until a match is confirmed. + + 4. executing the action associated with the pattern of the + confirmed match + + 5. If an exact match is not confirmed, the last case, a wildcard + ‘_’, 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. + + +File: python.info, Node: Declarative approach, Next: Simple pattern match to a literal, Prev: Syntax and operations, Up: PEP 634 Structural Pattern Matching + +1.2.2.10 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. + + +File: python.info, Node: Simple pattern match to a literal, Next: Patterns with a literal and variable, Prev: Declarative approach, Up: PEP 634 Structural Pattern Matching + +1.2.2.11 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, ‘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: + + 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" + +If the above function is passed a ‘status’ of 418, “I’m a teapot” is +returned. If the above function is passed a ‘status’ of 500, the case +statement with ‘_’ will match as a wildcard, and “Something’s wrong with +the internet” is returned. Note the last block: the variable name, ‘_’, +acts as a `wildcard' and insures the subject will always match. The use +of ‘_’ is optional. + +You can combine several literals in a single pattern using ‘|’ (“or”): + + case 401 | 403 | 404: + return "Not allowed" + +* Menu: + +* Behavior without the wildcard:: + + +File: python.info, Node: Behavior without the wildcard, Up: Simple pattern match to a literal + +1.2.2.12 Behavior without the wildcard +...................................... + +If we modify the above example by removing the last case block, the +example becomes: + + def http_error(status): + match status: + case 400: + return "Bad request" + case 404: + return "Not found" + case 418: + return "I'm a teapot" + +Without the use of ‘_’ in a case statement, a match may not exist. If +no match exists, the behavior is a no-op. For example, if ‘status’ of +500 is passed, a no-op occurs. + + +File: python.info, Node: Patterns with a literal and variable, Next: Patterns and classes, Prev: Simple pattern match to a literal, Up: PEP 634 Structural Pattern Matching + +1.2.2.13 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: + + # 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") + +The first pattern has two literals, ‘(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 (‘point’). The fourth pattern captures two values, which +makes it conceptually similar to the unpacking assignment ‘(x, y) = +point’. + + +File: python.info, Node: Patterns and classes, Next: Nested patterns, Prev: Patterns with a literal and variable, Up: PEP 634 Structural Pattern Matching + +1.2.2.14 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 class attributes +into variables: + + class Point: + x: int + y: int + + 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") + +* Menu: + +* Patterns with positional parameters:: + + +File: python.info, Node: Patterns with positional parameters, Up: Patterns and classes + +1.2.2.15 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 +‘__match_args__’ special attribute in your classes. If it’s set to +(“x”, “y”), the following patterns are all equivalent (and all bind the +‘y’ attribute to the ‘var’ variable): + + Point(1, var) + Point(1, y=var) + Point(x=1, y=var) + Point(y=var, x=1) + + +File: python.info, Node: Nested patterns, Next: Complex patterns and the wildcard, Prev: Patterns and classes, Up: PEP 634 Structural Pattern Matching + +1.2.2.16 Nested patterns +........................ + +Patterns can be arbitrarily nested. For example, if our data is a short +list of points, it could be matched like this: + + 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.") + + +File: python.info, Node: Complex patterns and the wildcard, Next: Guard, Prev: Nested patterns, Up: PEP 634 Structural Pattern Matching + +1.2.2.17 Complex patterns and the wildcard +.......................................... + +To this point, the examples have used ‘_’ alone in the last case +statement. A wildcard can be used in more complex patterns, such as +‘('error', code, _)’. For example: + + match test_variable: + case ('warning', code, 40): + print("A warning has been received.") + case ('error', code, _): + print(f"An error {code} occurred.") + +In the above case, ‘test_variable’ will match for (‘error’, code, 100) +and (‘error’, code, 800). + + +File: python.info, Node: Guard, Next: Other Key Features, Prev: Complex patterns and the wildcard, Up: PEP 634 Structural Pattern Matching + +1.2.2.18 Guard +.............. + +We can add an ‘if’ clause to a pattern, known as a “guard”. If the +guard is false, ‘match’ goes on to try the next case block. Note that +value capture happens before the guard is evaluated: + + 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.") + + +File: python.info, Node: Other Key Features, Prev: Guard, Up: PEP 634 Structural Pattern Matching + +1.2.2.19 Other Key Features +........................... + +Several other key features: + + - 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. + + - Sequence patterns support wildcards: ‘[x, y, *rest]’ and ‘(x, y, + *rest)’ work similar to wildcards in unpacking assignments. The + name after ‘*’ may also be ‘_’, so ‘(x, y, *_)’ matches a sequence + of at least two items without binding the remaining items. + + - Mapping patterns: ‘{"bandwidth": b, "latency": l}’ captures the + ‘"bandwidth"’ and ‘"latency"’ values from a dict. Unlike sequence + patterns, extra keys are ignored. A wildcard ‘**rest’ is also + supported. (But ‘**_’ would be redundant, so is not allowed.) + + - Subpatterns may be captured using the ‘as’ keyword: + + case (Point(x1, y1), Point(x2, y2) as p2): ... + + This binds x1, y1, x2, y2 like you would expect without the ‘as’ + clause, and p2 to the entire second item of the subject. + + - Most literals are compared by equality. However, the singletons + ‘True’, ‘False’ and ‘None’ are compared by identity. + + - 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: + + from enum import Enum + class Color(Enum): + RED = 0 + GREEN = 1 + BLUE = 2 + + 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 :(") + +For the full specification see PEP 634(1). Motivation and rationale are +in PEP 635(2), and a longer tutorial is in PEP 636(3). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0634/ + + (2) https://peps.python.org/pep-0635/ + + (3) https://peps.python.org/pep-0636/ + + +File: python.info, Node: Optional EncodingWarning and encoding="locale" option, Prev: PEP 634 Structural Pattern Matching, Up: New Features<3> + +1.2.2.20 Optional ‘EncodingWarning’ and ‘encoding="locale"’ option +.................................................................. + +The default encoding of ‘TextIOWrapper’ and *note open(): 30b. is +platform and locale dependent. Since UTF-8 is used on most Unix +platforms, omitting ‘encoding’ option when opening UTF-8 files (e.g. +JSON, YAML, TOML, Markdown) is a very common bug. For example: + + # BUG: "rb" mode or encoding="utf-8" should be used. + with open("data.json") as f: + data = json.load(f) + +To find this type of bug, an optional ‘EncodingWarning’ is added. It is +emitted when *note sys.flags.warn_default_encoding: 25d. is true and +locale-specific default encoding is used. + +‘-X warn_default_encoding’ option and *note PYTHONWARNDEFAULTENCODING: +3a6. are added to enable the warning. + +See *note Text Encoding: 3a7. for more information. + + +File: python.info, Node: New Features Related to Type Hints<2>, Next: Other Language Changes<2>, Prev: New Features<3>, Up: What’s New In Python 3 10 + +1.2.3 New Features Related to Type Hints +---------------------------------------- + +This section covers major changes affecting PEP 484(1) type hints and +the *note typing: 123. 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + +File: python.info, Node: PEP 604 New Type Union Operator, Next: PEP 612 Parameter Specification Variables, Up: New Features Related to Type Hints<2> + +1.2.3.1 PEP 604: New Type Union Operator +........................................ + +A new type union operator was introduced which enables the syntax ‘X | +Y’. This provides a cleaner way of expressing ‘either type X or type Y’ +instead of using *note typing.Union: 214, especially in type hints. + +In previous versions of Python, to apply a type hint for functions +accepting arguments of multiple types, *note typing.Union: 214. was +used: + + def square(number: Union[int, float]) -> Union[int, float]: + return number ** 2 + +Type hints can now be written in a more succinct manner: + + def square(number: int | float) -> int | float: + return number ** 2 + +This new syntax is also accepted as the second argument to *note +isinstance(): 3ab. and *note issubclass(): 3ac.: + + >>> isinstance(1, int | str) + True + +See *note Union Type: 3ad. and PEP 604(1) for more details. + +(Contributed by Maggie Moss and Philippe Prados in bpo-41428(2), with +additions by Yurii Karabas and Serhiy Storchaka in bpo-44490(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0604/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41428 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44490 + + +File: python.info, Node: PEP 612 Parameter Specification Variables, Next: PEP 613 TypeAlias, Prev: PEP 604 New Type Union Operator, Up: New Features Related to Type Hints<2> + +1.2.3.2 PEP 612: Parameter Specification Variables +.................................................. + +Two new options to improve the information provided to static type +checkers for PEP 484(1)‘s ‘Callable’ have been added to the *note +typing: 123. 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 *note typing.ParamSpec: 3af. +Previously, there was no easy way to type annotate dependency of +parameter types in such a precise manner. + +The second option is the new ‘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 *note typing.Concatenate: +3b0. + +See *note typing.Callable: 3b1, *note typing.ParamSpec: 3af, *note +typing.Concatenate: 3b0, *note typing.ParamSpecArgs: 3b2, *note +typing.ParamSpecKwargs: 3b3, and PEP 612(2) for more details. + +(Contributed by Ken Jin in bpo-41559(3), with minor enhancements by +Jelle Zijlstra in bpo-43783(4). PEP written by Mark Mendoza.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0612/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41559 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43783 + + +File: python.info, Node: PEP 613 TypeAlias, Next: PEP 647 User-Defined Type Guards, Prev: PEP 612 Parameter Specification Variables, Up: New Features Related to Type Hints<2> + +1.2.3.3 PEP 613: TypeAlias +.......................... + +PEP 484(1) 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: + + StrCache = 'Cache[str]' # a type alias + LOG_PREFIX = 'LOG[DEBUG]' # a module constant + +Now the *note typing: 123. module has a special value ‘TypeAlias’ which +lets you declare type aliases more explicitly: + + StrCache: TypeAlias = 'Cache[str]' # a type alias + LOG_PREFIX = 'LOG[DEBUG]' # a module constant + +See PEP 613(2) for more details. + +(Contributed by Mikhail Golubev in bpo-41923(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0613/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41923 + + +File: python.info, Node: PEP 647 User-Defined Type Guards, Prev: PEP 613 TypeAlias, Up: New Features Related to Type Hints<2> + +1.2.3.4 PEP 647: User-Defined Type Guards +......................................... + +‘TypeGuard’ has been added to the *note typing: 123. module to annotate +type guard functions and improve information provided to static type +checkers during type narrowing. For more information, please see +‘TypeGuard’‘s documentation, and PEP 647(1). + +(Contributed by Ken Jin and Guido van Rossum in bpo-43766(2). PEP +written by Eric Traut.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0647/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43766 + + +File: python.info, Node: Other Language Changes<2>, Next: New Modules<2>, Prev: New Features Related to Type Hints<2>, Up: What’s New In Python 3 10 + +1.2.4 Other Language Changes +---------------------------- + + * The *note int: 1c7. type has a new method *note int.bit_count(): + 3b7, 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(1).) + + * The views returned by *note dict.keys(): 3b8, *note dict.values(): + 3b9. and *note dict.items(): 3ba. now all have a ‘mapping’ + attribute that gives a *note types.MappingProxyType: 3bb. object + wrapping the original dictionary. (Contributed by Dennis Sweeney + in bpo-40890(2).) + + * PEP 618(3): The *note zip(): 3bc. function now has an optional + ‘strict’ flag, used to require that all the iterables have an equal + length. + + * Builtin and extension functions that take integer arguments no + longer accept *note Decimal: 3bd.s, *note Fraction: 210.s and other + objects that can be converted to integers only with a loss (e.g. + that have the *note __int__(): 3be. method but do not have the + *note __index__(): 3bf. method). (Contributed by Serhiy Storchaka + in bpo-37999(4).) + + * If *note object.__ipow__(): 3c0. returns *note NotImplemented: 3c1, + the operator will correctly fall back to *note object.__pow__(): + 3c2. and *note object.__rpow__(): 3c3. as expected. (Contributed + by Alex Shkop in bpo-38302(5).) + + * Assignment expressions can now be used unparenthesized within set + literals and set comprehensions, as well as in sequence indexes + (but not slices). + + * Functions have a new ‘__builtins__’ attribute which is used to look + for builtin symbols when a function is executed, instead of looking + into ‘__globals__['__builtins__']’. The attribute is initialized + from ‘__globals__["__builtins__"]’ if it exists, else from the + current builtins. (Contributed by Mark Shannon in bpo-42990(6).) + + * Two new builtin functions – *note aiter(): 3c4. and *note anext(): + 3c5. have been added to provide asynchronous counterparts to *note + iter(): 3c6. and *note next(): 3c7, respectively. (Contributed by + Joshua Bronson, Daniel Pope, and Justin Wang in bpo-31861(7).) + + * Static methods (*note @staticmethod: 3c8.) and class methods (*note + @classmethod: 18d.) now inherit the method attributes + (‘__module__’, ‘__name__’, ‘__qualname__’, ‘__doc__’, + ‘__annotations__’) and have a new ‘__wrapped__’ attribute. + Moreover, static methods are now callable as regular functions. + (Contributed by Victor Stinner in bpo-43682(8).) + + * Annotations for complex targets (everything beside ‘simple name’ + targets defined by PEP 526(9)) no longer cause any runtime effects + with ‘from __future__ import annotations’. (Contributed by Batuhan + Taskaya in bpo-42737(10).) + + * Class and module objects now lazy-create empty annotations dicts on + demand. The annotations dicts are stored in the object’s + ‘__dict__’ for backwards compatibility. This improves the best + practices for working with ‘__annotations__’; for more information, + please see *note Annotations Best Practices: 3c9. (Contributed by + Larry Hastings in bpo-43901(11).) + + * Annotations consist of ‘yield’, ‘yield from’, ‘await’ or named + expressions are now forbidden under ‘from __future__ import + annotations’ due to their side effects. (Contributed by Batuhan + Taskaya in bpo-42725(12).) + + * Usage of unbound variables, ‘super()’ and other expressions that + might alter the processing of symbol table as annotations are now + rendered effectless under ‘from __future__ import annotations’. + (Contributed by Batuhan Taskaya in bpo-42725(13).) + + * Hashes of NaN values of both *note float: 3ca. type and *note + decimal.Decimal: 3bd. type now depend on object identity. + Formerly, they always hashed to ‘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(14).) + + * A *note SyntaxError: 2d6. (instead of a *note NameError: 396.) will + be raised when deleting the *note __debug__: 3cb. constant. + (Contributed by Dong-hee Na in bpo-45000(15).) + + * *note SyntaxError: 2d6. exceptions now have ‘end_lineno’ and + ‘end_offset’ attributes. They will be ‘None’ if not determined. + (Contributed by Pablo Galindo in bpo-43914(16).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29882 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40890 + + (3) https://peps.python.org/pep-0618/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37999 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38302 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42990 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31861 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43682 + + (9) https://peps.python.org/pep-0526/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42737 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43901 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42725 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=42725 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=43475 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=45000 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=43914 + + +File: python.info, Node: New Modules<2>, Next: Improved Modules<2>, Prev: Other Language Changes<2>, Up: What’s New In Python 3 10 + +1.2.5 New Modules +----------------- + + * None yet. + + +File: python.info, Node: Improved Modules<2>, Next: Optimizations<2>, Prev: New Modules<2>, Up: What’s New In Python 3 10 + +1.2.6 Improved Modules +---------------------- + +* Menu: + +* asyncio: asyncio<2>. +* argparse:: +* array:: +* asynchat, asyncore, smtpd: asynchat asyncore smtpd. +* base64:: +* bdb:: +* bisect:: +* codecs:: +* collections.abc: collections abc. +* contextlib: contextlib<2>. +* curses:: +* dataclasses: dataclasses<2>. +* distutils:: +* doctest:: +* encodings:: +* enum: enum<2>. +* fileinput:: +* faulthandler:: +* gc:: +* glob:: +* hashlib: hashlib<2>. +* hmac:: +* IDLE and idlelib: IDLE and idlelib<2>. +* importlib.metadata: importlib metadata. +* inspect: inspect<2>. +* itertools:: +* linecache:: +* os: os<2>. +* os.path: os path. +* pathlib: pathlib<2>. +* platform:: +* pprint:: +* py_compile:: +* pyclbr:: +* shelve:: +* statistics:: +* site:: +* socket: socket<2>. +* ssl:: +* sqlite3: sqlite3<2>. +* sys: sys<2>. +* _thread:: +* threading: threading<2>. +* traceback: traceback<2>. +* types:: +* typing: typing<2>. +* unittest: unittest<2>. +* urllib.parse: urllib parse. +* xml:: +* zipimport:: + + +File: python.info, Node: asyncio<2>, Next: argparse, Up: Improved Modules<2> + +1.2.6.1 asyncio +............... + +Add missing ‘connect_accepted_socket()’ method. (Contributed by Alex +Grönholm in bpo-41332(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41332 + + +File: python.info, Node: argparse, Next: array, Prev: asyncio<2>, Up: Improved Modules<2> + +1.2.6.2 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9694 + + +File: python.info, Node: array, Next: asynchat asyncore smtpd, Prev: argparse, Up: Improved Modules<2> + +1.2.6.3 array +............. + +The *note index(): 3d1. method of *note array.array: 3d2. now has +optional `start' and `stop' parameters. (Contributed by Anders +Lorentsen and Zackery Spytz in bpo-31956(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31956 + + +File: python.info, Node: asynchat asyncore smtpd, Next: base64, Prev: array, Up: Improved Modules<2> + +1.2.6.4 asynchat, asyncore, smtpd +................................. + +These modules have been marked as deprecated in their module +documentation since Python 3.6. An import-time *note +DeprecationWarning: 2d4. has now been added to all three of these +modules. + + +File: python.info, Node: base64, Next: bdb, Prev: asynchat asyncore smtpd, Up: Improved Modules<2> + +1.2.6.5 base64 +.............. + +Add *note base64.b32hexencode(): 3d5. and *note base64.b32hexdecode(): +3d6. to support the Base32 Encoding with Extended Hex Alphabet. + + +File: python.info, Node: bdb, Next: bisect, Prev: base64, Up: Improved Modules<2> + +1.2.6.6 bdb +........... + +Add ‘clearBreakpoints()’ to reset all set breakpoints. (Contributed by +Irit Katriel in bpo-24160(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24160 + + +File: python.info, Node: bisect, Next: codecs, Prev: bdb, Up: Improved Modules<2> + +1.2.6.7 bisect +.............. + +Added the possibility of providing a `key' function to the APIs in the +*note bisect: 10. module. (Contributed by Raymond Hettinger in +bpo-4356(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4356 + + +File: python.info, Node: codecs, Next: collections abc, Prev: bisect, Up: Improved Modules<2> + +1.2.6.8 codecs +.............. + +Add a *note codecs.unregister(): 3da. function to unregister a codec +search function. (Contributed by Hai Shi in bpo-41842(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41842 + + +File: python.info, Node: collections abc, Next: contextlib<2>, Prev: codecs, Up: Improved Modules<2> + +1.2.6.9 collections.abc +....................... + +The ‘__args__’ of the *note parameterized generic: 278. for *note +collections.abc.Callable: 3dc. are now consistent with *note +typing.Callable: 3b1. *note collections.abc.Callable: 3dc. generic now +flattens type parameters, similar to what *note typing.Callable: 3b1. +currently does. This means that ‘collections.abc.Callable[[int, str], +str]’ will have ‘__args__’ of ‘(int, str, str)’; previously this was +‘([int, str], str)’. To allow this change, *note types.GenericAlias: +3dd. can now be subclassed, and a subclass will be returned when +subscripting the *note collections.abc.Callable: 3dc. type. Note that a +*note TypeError: 19c. may be raised for invalid forms of parameterizing +*note collections.abc.Callable: 3dc. which may have passed silently in +Python 3.9. (Contributed by Ken Jin in bpo-42195(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42195 + + +File: python.info, Node: contextlib<2>, Next: curses, Prev: collections abc, Up: Improved Modules<2> + +1.2.6.10 contextlib +................... + +Add a *note contextlib.aclosing(): 3df. context manager to safely close +async generators and objects representing asynchronously released +resources. (Contributed by Joongi Kim and John Belmonte in +bpo-41229(1).) + +Add asynchronous context manager support to *note +contextlib.nullcontext(): 3e0. (Contributed by Tom Gringauz in +bpo-41543(2).) + +Add ‘AsyncContextDecorator’, for supporting usage of async context +managers as decorators. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41229 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41543 + + +File: python.info, Node: curses, Next: dataclasses<2>, Prev: contextlib<2>, Up: Improved Modules<2> + +1.2.6.11 curses +............... + +The extended color functions added in ncurses 6.1 will be used +transparently by *note curses.color_content(): 3e2, *note +curses.init_color(): 3e3, *note curses.init_pair(): 3e4, and *note +curses.pair_content(): 3e5. A new function, *note +curses.has_extended_color_support(): 3e6, indicates whether extended +color support is provided by the underlying ncurses library. +(Contributed by Jeffrey Kintscher and Hans Petter Jansson in +bpo-36982(1).) + +The ‘BUTTON5_*’ constants are now exposed in the *note curses: 2a. +module if they are provided by the underlying curses library. +(Contributed by Zackery Spytz in bpo-39273(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36982 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39273 + + +File: python.info, Node: dataclasses<2>, Next: distutils, Prev: curses, Up: Improved Modules<2> + +1.2.6.12 dataclasses +.................... + +* Menu: + +* __slots__:: +* Keyword-only fields:: + + +File: python.info, Node: __slots__, Next: Keyword-only fields, Up: dataclasses<2> + +1.2.6.13 __slots__ +.................. + +Added ‘slots’ parameter in *note dataclasses.dataclass(): 193. +decorator. (Contributed by Yurii Karabas in bpo-42269(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42269 + + +File: python.info, Node: Keyword-only fields, Prev: __slots__, Up: dataclasses<2> + +1.2.6.14 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: + + from dataclasses import dataclass + + @dataclass(kw_only=True) + class Birthday: + name: str + birthday: datetime.date + +Both ‘name’ and ‘birthday’ are keyword-only parameters to the generated +__init__ method. + +You can specify keyword-only on a per-field basis: + + from dataclasses import dataclass, field + + @dataclass + class Birthday: + name: str + birthday: datetime.date = field(kw_only=True) + +Here only ‘birthday’ is keyword-only. If you set ‘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: + + from dataclasses import dataclass, KW_ONLY + + @dataclass + class Point: + x: float + y: float + _: KW_ONLY + z: float = 0.0 + t: float = 0.0 + +Here, ‘z’ and ‘t’ are keyword-only parameters, while ‘x’ and ‘y’ are +not. (Contributed by Eric V. Smith in bpo-43532(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43532 + + +File: python.info, Node: distutils, Next: doctest, Prev: dataclasses<2>, Up: Improved Modules<2> + +1.2.6.15 distutils +.................. + +The entire ‘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 ‘setuptools’ and +‘packaging’, and most other commonly used APIs are available elsewhere +in the standard library (such as *note platform: cb, *note shutil: e6, +*note subprocess: f6. or *note sysconfig: fa.). There are no plans to +migrate any other functionality from ‘distutils’, and applications that +are using other functions should plan to make private copies of the +code. Refer to PEP 632(1) for discussion. + +The ‘bdist_wininst’ command deprecated in Python 3.8 has been removed. +The ‘bdist_wheel’ command is now recommended to distribute binary +packages on Windows. (Contributed by Victor Stinner in bpo-42802(2).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0632/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42802 + + +File: python.info, Node: doctest, Next: encodings, Prev: distutils, Up: Improved Modules<2> + +1.2.6.16 doctest +................ + +When a module does not define ‘__loader__’, fall back to +‘__spec__.loader’. (Contributed by Brett Cannon in bpo-42133(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42133 + + +File: python.info, Node: encodings, Next: enum<2>, Prev: doctest, Up: Improved Modules<2> + +1.2.6.17 encodings +.................. + +‘encodings.normalize_encoding()’ now ignores non-ASCII characters. +(Contributed by Hai Shi in bpo-39337(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39337 + + +File: python.info, Node: enum<2>, Next: fileinput, Prev: encodings, Up: Improved Modules<2> + +1.2.6.18 enum +............. + +‘Enum’ ‘__repr__()’ now returns ‘enum_name.member_name’ and ‘__str__()’ +now returns ‘member_name’. Stdlib enums available as module constants +have a *note repr(): 3ee. of ‘module_name.member_name’. (Contributed by +Ethan Furman in bpo-40066(1).) + +Add *note enum.StrEnum: 1f3. for enums where all members are strings. +(Contributed by Ethan Furman in bpo-41816(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40066 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41816 + + +File: python.info, Node: fileinput, Next: faulthandler, Prev: enum<2>, Up: Improved Modules<2> + +1.2.6.19 fileinput +.................. + +Add `encoding' and `errors' parameters in *note fileinput.input(): 3f0. +and *note fileinput.FileInput: 300. (Contributed by Inada Naoki in +bpo-43712(1).) + +*note fileinput.hook_compressed(): 3f1. now returns ‘TextIOWrapper’ +object when `mode' is “r” and file is compressed, like uncompressed +files. (Contributed by Inada Naoki in bpo-5758(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43712 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5758 + + +File: python.info, Node: faulthandler, Next: gc, Prev: fileinput, Up: Improved Modules<2> + +1.2.6.20 faulthandler +..................... + +The *note faulthandler: 78. module now detects if a fatal error occurs +during a garbage collector collection. (Contributed by Victor Stinner +in bpo-44466(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44466 + + +File: python.info, Node: gc, Next: glob, Prev: faulthandler, Up: Improved Modules<2> + +1.2.6.21 gc +........... + +Add audit hooks for *note gc.get_objects(): 3f4, *note +gc.get_referrers(): 3f5. and *note gc.get_referents(): 3f6. +(Contributed by Pablo Galindo in bpo-43439(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43439 + + +File: python.info, Node: glob, Next: hashlib<2>, Prev: gc, Up: Improved Modules<2> + +1.2.6.22 glob +............. + +Add the `root_dir' and `dir_fd' parameters in *note glob(): 3f8. and +*note iglob(): 3f9. which allow to specify the root directory for +searching. (Contributed by Serhiy Storchaka in bpo-38144(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38144 + + +File: python.info, Node: hashlib<2>, Next: hmac, Prev: glob, Up: Improved Modules<2> + +1.2.6.23 hashlib +................ + +The hashlib module requires OpenSSL 1.1.1 or newer. (Contributed by +Christian Heimes in PEP 644(1) and bpo-43669(2).) + +The hashlib module has preliminary support for OpenSSL 3.0.0. +(Contributed by Christian Heimes in bpo-38820(3) and other issues.) + +The pure-Python fallback of *note pbkdf2_hmac(): 3fb. 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(4).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0644/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43669 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38820 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43880 + + +File: python.info, Node: hmac, Next: IDLE and idlelib<2>, Prev: hashlib<2>, Up: Improved Modules<2> + +1.2.6.24 hmac +............. + +The hmac module now uses OpenSSL’s HMAC implementation internally. +(Contributed by Christian Heimes in bpo-40645(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40645 + + +File: python.info, Node: IDLE and idlelib<2>, Next: importlib metadata, Prev: hmac, Up: Improved Modules<2> + +1.2.6.25 IDLE and idlelib +......................... + +Make IDLE invoke *note sys.excepthook(): 3fe. (when started without +‘-n’). User hooks were previously ignored. (Contributed by Ken Hilton +in bpo-43008(1).) + +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(2).) 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(3).) + +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(4).) + +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(5).) + +Highlight the new *note soft keywords: 3ff. *note match: 400, *note +case: 400, and *note _: 401. in pattern-matching statements. However, +this highlighting is not perfect and will be incorrect in some rare +cases, including some ‘_’-s in ‘case’ patterns. (Contributed by Tal +Einat in bpo-44010(6).) + +New in 3.10 maintenance releases. + +Apply syntax highlighting to ‘.pyi’ files. (Contributed by Alex Waygood +and Terry Jan Reedy in bpo-45447(7).) + +Include prompts when saving Shell with inputs and outputs. (Contributed +by Terry Jan Reedy in gh-95191(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43008 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40468 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33962 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37903 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=37892 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=44010 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45447 + + (8) https://github.com/python/cpython/issues/95191 + + +File: python.info, Node: importlib metadata, Next: inspect<2>, Prev: IDLE and idlelib<2>, Up: Improved Modules<2> + +1.2.6.26 importlib.metadata +........................... + +Feature parity with ‘importlib_metadata’ 4.6 (history(1)). + +*note importlib.metadata entry points: 403. now provide a nicer +experience for selecting entry points by group and name through a new +‘importlib.metadata.EntryPoints’ class. See the Compatibility Note in +the docs for more info on the deprecation and usage. + +Added ‘importlib.metadata.packages_distributions()’ for resolving +top-level Python modules and packages to their +‘importlib.metadata.Distribution’. + + ---------- Footnotes ---------- + + (1) https://importlib-metadata.readthedocs.io/en/latest/history.html + + +File: python.info, Node: inspect<2>, Next: itertools, Prev: importlib metadata, Up: Improved Modules<2> + +1.2.6.27 inspect +................ + +When a module does not define ‘__loader__’, fall back to +‘__spec__.loader’. (Contributed by Brett Cannon in bpo-42133(1).) + +Add *note inspect.get_annotations(): 405, 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. *note +inspect.get_annotations(): 405. can also correctly un-stringize +stringized annotations. *note inspect.get_annotations(): 405. 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 *note Annotations Best Practices: 3c9. +Relatedly, *note inspect.signature(): 301, *note +inspect.Signature.from_callable(): 304, and +‘inspect.Signature.from_function()’ now call *note +inspect.get_annotations(): 405. to retrieve annotations. This means +*note inspect.signature(): 301. and *note +inspect.Signature.from_callable(): 304. can also now un-stringize +stringized annotations. (Contributed by Larry Hastings in +bpo-43817(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42133 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43817 + + +File: python.info, Node: itertools, Next: linecache, Prev: inspect<2>, Up: Improved Modules<2> + +1.2.6.28 itertools +.................. + +Add *note itertools.pairwise(): 407. (Contributed by Raymond Hettinger +in bpo-38200(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38200 + + +File: python.info, Node: linecache, Next: os<2>, Prev: itertools, Up: Improved Modules<2> + +1.2.6.29 linecache +.................. + +When a module does not define ‘__loader__’, fall back to +‘__spec__.loader’. (Contributed by Brett Cannon in bpo-42133(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42133 + + +File: python.info, Node: os<2>, Next: os path, Prev: linecache, Up: Improved Modules<2> + +1.2.6.30 os +........... + +Add *note os.cpu_count(): 40a. support for VxWorks RTOS. (Contributed by +Peixing Xin in bpo-41440(1).) + +Add a new function *note os.eventfd(): 40b. and related helpers to wrap +the ‘eventfd2’ syscall on Linux. (Contributed by Christian Heimes in +bpo-41001(2).) + +Add *note os.splice(): 40c. 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(3).) + +Add *note O_EVTONLY: 40d, *note O_FSYNC: 40e, *note O_SYMLINK: 40f. and +*note O_NOFOLLOW_ANY: 410. for macOS. (Contributed by Dong-hee Na in +bpo-43106(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41440 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41001 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41625 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43106 + + +File: python.info, Node: os path, Next: pathlib<2>, Prev: os<2>, Up: Improved Modules<2> + +1.2.6.31 os.path +................ + +*note os.path.realpath(): 412. now accepts a `strict' keyword-only +argument. When set to ‘True’, *note OSError: 413. is raised if a path +doesn’t exist or a symlink loop is encountered. (Contributed by Barney +Gale in bpo-43757(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43757 + + +File: python.info, Node: pathlib<2>, Next: platform, Prev: os path, Up: Improved Modules<2> + +1.2.6.32 pathlib +................ + +Add slice support to *note PurePath.parents: 415. (Contributed by +Joshua Cannon in bpo-35498(1).) + +Add negative indexing support to *note PurePath.parents: 415. +(Contributed by Yaroslav Pankovych in bpo-21041(2).) + +Add *note Path.hardlink_to: 416. method that supersedes *note link_to(): +2f2. The new method has the same argument order as *note symlink_to(): +417. (Contributed by Barney Gale in bpo-39950(3).) + +*note pathlib.Path.stat(): 418. and *note chmod(): 419. now accept a +`follow_symlinks' keyword-only argument for consistency with +corresponding functions in the *note os: c2. module. (Contributed by +Barney Gale in bpo-39906(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35498 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21041 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39950 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39906 + + +File: python.info, Node: platform, Next: pprint, Prev: pathlib<2>, Up: Improved Modules<2> + +1.2.6.33 platform +................. + +Add *note platform.freedesktop_os_release(): 41b. to retrieve operation +system identification from freedesktop.org os-release(1) standard file. +(Contributed by Christian Heimes in bpo-28468(2).) + + ---------- Footnotes ---------- + + (1) https://www.freedesktop.org/software/systemd/man/os-release.html + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28468 + + +File: python.info, Node: pprint, Next: py_compile, Prev: platform, Up: Improved Modules<2> + +1.2.6.34 pprint +............... + +*note pprint.pprint(): 41d. now accepts a new ‘underscore_numbers’ +keyword argument. (Contributed by sblondon in bpo-42914(1).) + +*note pprint: cf. can now pretty-print *note dataclasses.dataclass: 193. +instances. (Contributed by Lewis Gaul in bpo-43080(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42914 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43080 + + +File: python.info, Node: py_compile, Next: pyclbr, Prev: pprint, Up: Improved Modules<2> + +1.2.6.35 py_compile +................... + +Add ‘--quiet’ option to command-line interface of *note py_compile: d4. +(Contributed by Gregory Schevchenko in bpo-38731(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38731 + + +File: python.info, Node: pyclbr, Next: shelve, Prev: py_compile, Up: Improved Modules<2> + +1.2.6.36 pyclbr +............... + +Add an ‘end_lineno’ attribute to the ‘Function’ and ‘Class’ objects in +the tree returned by ‘pyclbr.readline()’ and ‘pyclbr.readline_ex()’. It +matches the existing (start) ‘lineno’. (Contributed by Aviral +Srivastava in bpo-38307(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38307 + + +File: python.info, Node: shelve, Next: statistics, Prev: pyclbr, Up: Improved Modules<2> + +1.2.6.37 shelve +............... + +The *note shelve: e4. module now uses *note pickle.DEFAULT_PROTOCOL: +421. by default instead of *note pickle: c7. protocol ‘3’ when creating +shelves. (Contributed by Zackery Spytz in bpo-34204(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34204 + + +File: python.info, Node: statistics, Next: site, Prev: shelve, Up: Improved Modules<2> + +1.2.6.38 statistics +................... + +Add *note covariance(): 423, Pearson’s *note correlation(): 424, and +simple *note linear_regression(): 425. functions. (Contributed by +Tymoteusz Wołodźko in bpo-38490(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38490 + + +File: python.info, Node: site, Next: socket<2>, Prev: statistics, Up: Improved Modules<2> + +1.2.6.39 site +............. + +When a module does not define ‘__loader__’, fall back to +‘__spec__.loader’. (Contributed by Brett Cannon in bpo-42133(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42133 + + +File: python.info, Node: socket<2>, Next: ssl, Prev: site, Up: Improved Modules<2> + +1.2.6.40 socket +............... + +The exception *note socket.timeout: 428. is now an alias of *note +TimeoutError: 429. (Contributed by Christian Heimes in bpo-42413(1).) + +Add option to create MPTCP sockets with ‘IPPROTO_MPTCP’ (Contributed by +Rui Cunha in bpo-43571(2).) + +Add ‘IP_RECVTOS’ option to receive the type of service (ToS) or DSCP/ECN +fields (Contributed by Georg Sauthoff in bpo-44077(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42413 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43571 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44077 + + +File: python.info, Node: ssl, Next: sqlite3<2>, Prev: socket<2>, Up: Improved Modules<2> + +1.2.6.41 ssl +............ + +The ssl module requires OpenSSL 1.1.1 or newer. (Contributed by +Christian Heimes in PEP 644(1) and bpo-43669(2).) + +The ssl module has preliminary support for OpenSSL 3.0.0 and new option +*note OP_IGNORE_UNEXPECTED_EOF: 42b. (Contributed by Christian Heimes +in bpo-38820(3), bpo-43794(4), bpo-43788(5), bpo-43791(6), bpo-43799(7), +bpo-43920(8), bpo-43789(9), and bpo-43811(10).) + +Deprecated function and use of deprecated constants now result in a +*note DeprecationWarning: 2d4. *note ssl.SSLContext.options: 42c. has +*note OP_NO_SSLv2: 42d. and *note OP_NO_SSLv3: 42e. set by default and +therefore cannot warn about setting the flag again. The *note +deprecation section: 42f. has a list of deprecated features. +(Contributed by Christian Heimes in bpo-43880(11).) + +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. *note SSLContext: 430. defaults to minimum protocol version +TLS 1.2. Settings are based on Hynek Schlawack’s research. +(Contributed by Christian Heimes in bpo-43998(12).) + +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 *note ssl.get_server_certificate(): +431. function. (Contributed by Zackery Spytz in bpo-31870(13).) + +The ssl module uses heap-types and multi-phase initialization. +(Contributed by Christian Heimes in bpo-42333(14).) + +A new verify flag *note VERIFY_X509_PARTIAL_CHAIN: 432. has been added. +(Contributed by l0x in bpo-40849(15).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0644/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43669 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38820 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43794 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43788 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43791 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43799 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43920 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43789 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43811 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43880 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=43998 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31870 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=42333 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=40849 + + +File: python.info, Node: sqlite3<2>, Next: sys<2>, Prev: ssl, Up: Improved Modules<2> + +1.2.6.42 sqlite3 +................ + +Add audit events for ‘connect/handle()’, *note enable_load_extension(): +434, and *note load_extension(): 435. (Contributed by Erlend E. Aasland +in bpo-43762(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43762 + + +File: python.info, Node: sys<2>, Next: _thread, Prev: sqlite3<2>, Up: Improved Modules<2> + +1.2.6.43 sys +............ + +Add *note sys.orig_argv: 437. attribute: the list of the original +command line arguments passed to the Python executable. (Contributed by +Victor Stinner in bpo-23427(1).) + +Add *note sys.stdlib_module_names: 438, containing the list of the +standard library module names. (Contributed by Victor Stinner in +bpo-42955(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23427 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42955 + + +File: python.info, Node: _thread, Next: threading<2>, Prev: sys<2>, Up: Improved Modules<2> + +1.2.6.44 _thread +................ + +*note _thread.interrupt_main(): 43a. now takes an optional signal number +to simulate (the default is still *note signal.SIGINT: 43b.). +(Contributed by Antoine Pitrou in bpo-43356(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43356 + + +File: python.info, Node: threading<2>, Next: traceback<2>, Prev: _thread, Up: Improved Modules<2> + +1.2.6.45 threading +.................. + +Add *note threading.gettrace(): 43d. and *note threading.getprofile(): +43e. to retrieve the functions set by *note threading.settrace(): 43f. +and *note threading.setprofile(): 440. respectively. (Contributed by +Mario Corchero in bpo-42251(1).) + +Add *note threading.__excepthook__: 441. to allow retrieving the +original value of *note threading.excepthook(): 442. in case it is set +to a broken or a different value. (Contributed by Mario Corchero in +bpo-42308(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42251 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42308 + + +File: python.info, Node: traceback<2>, Next: types, Prev: threading<2>, Up: Improved Modules<2> + +1.2.6.46 traceback +.................. + +The *note format_exception(): 444, *note format_exception_only(): 445, +and *note print_exception(): 446. functions can now take an exception +object as a positional-only argument. (Contributed by Zackery Spytz and +Matthias Bussonnier in bpo-26389(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26389 + + +File: python.info, Node: types, Next: typing<2>, Prev: traceback<2>, Up: Improved Modules<2> + +1.2.6.47 types +.............. + +Reintroduce the *note types.EllipsisType: 448, *note types.NoneType: +449. and *note types.NotImplementedType: 44a. classes, providing a new +set of types readily interpretable by type checkers. (Contributed by +Bas van Beek in bpo-41810(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41810 + + +File: python.info, Node: typing<2>, Next: unittest<2>, Prev: types, Up: Improved Modules<2> + +1.2.6.48 typing +............... + +For major changes, see *note New Features Related to Type Hints: 3a8. + +The behavior of *note typing.Literal: 44c. was changed to conform with +PEP 586(1) and to match the behavior of static type checkers specified +in the PEP. + + 1. ‘Literal’ now de-duplicates parameters. + + 2. Equality comparisons between ‘Literal’ objects are now order + independent. + + 3. ‘Literal’ comparisons now respect types. For example, ‘Literal[0] + == Literal[False]’ previously evaluated to ‘True’. It is now + ‘False’. To support this change, the internally used type cache + now supports differentiating types. + + 4. ‘Literal’ objects will now raise a *note TypeError: 19c. exception + during equality comparisons if any of their parameters are not + *note hashable: 1e8. Note that declaring ‘Literal’ with unhashable + parameters will not throw an error: + + >>> from typing import Literal + >>> Literal[{0}] + >>> Literal[{0}] == Literal[{False}] + Traceback (most recent call last): + File "", line 1, in + TypeError: unhashable type: 'set' + +(Contributed by Yurii Karabas in bpo-42345(2).) + +Add new function *note typing.is_typeddict(): 44d. to introspect if an +annotation is a *note typing.TypedDict: 18a. (Contributed by Patrick +Reader in bpo-41792(3).) + +Subclasses of ‘typing.Protocol’ which only have data variables declared +will now raise a ‘TypeError’ when checked with ‘isinstance’ unless they +are decorated with ‘runtime_checkable()’. Previously, these checks +passed silently. Users should decorate their subclasses with the +‘runtime_checkable()’ decorator if they want runtime protocols. +(Contributed by Yurii Karabas in bpo-38908(4).) + +Importing from the ‘typing.io’ and ‘typing.re’ submodules will now emit +*note DeprecationWarning: 2d4. 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 +*note typing: 123. instead. (Contributed by Sebastian Rittau in +bpo-38291(5).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0586/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42345 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41792 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38908 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38291 + + +File: python.info, Node: unittest<2>, Next: urllib parse, Prev: typing<2>, Up: Improved Modules<2> + +1.2.6.49 unittest +................. + +Add new method *note assertNoLogs(): 44f. to complement the existing +*note assertLogs(): 450. (Contributed by Kit Yan Choi in bpo-39385(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39385 + + +File: python.info, Node: urllib parse, Next: xml, Prev: unittest<2>, Up: Improved Modules<2> + +1.2.6.50 urllib.parse +..................... + +Python versions earlier than Python 3.10 allowed using both ‘;’ and ‘&’ +as query parameter separators in *note urllib.parse.parse_qs(): 452. and +*note urllib.parse.parse_qsl(): 453. Due to security concerns, and to +conform with newer W3C recommendations, this has been changed to allow +only a single separator key, with ‘&’ as the default. This change also +affects *note cgi.parse(): 454. and *note cgi.parse_multipart(): 455. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42967 + + +File: python.info, Node: xml, Next: zipimport, Prev: urllib parse, Up: Improved Modules<2> + +1.2.6.51 xml +............ + +Add a *note LexicalHandler: 457. class to the *note xml.sax.handler: +147. module. (Contributed by Jonathan Gossage and Zackery Spytz in +bpo-35018(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35018 + + +File: python.info, Node: zipimport, Prev: xml, Up: Improved Modules<2> + +1.2.6.52 zipimport +.................. + +Add methods related to PEP 451(1): *note find_spec(): 459, *note +zipimport.zipimporter.create_module(): 45a, and *note +zipimport.zipimporter.exec_module(): 45b. (Contributed by Brett Cannon +in bpo-42131(2).) + +Add *note invalidate_caches(): 45c. method. (Contributed by Desmond +Cheong in bpo-14678(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0451/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42131 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=14678 + + +File: python.info, Node: Optimizations<2>, Next: Deprecated<3>, Prev: Improved Modules<2>, Up: What’s New In Python 3 10 + +1.2.7 Optimizations +------------------- + + * Constructors *note str(): 1b3, *note bytes(): 1b4. and *note + bytearray(): 1a5. are now faster (around 30–40% for small objects). + (Contributed by Serhiy Storchaka in bpo-41334(1).) + + * The *note runpy: df. module now imports fewer modules. The + ‘python3 -m module-name’ command startup time is 1.4x faster in + average. On Linux, ‘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(2) and + bpo-41718(3).) + + * The ‘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(4) and Guido van Rossum in bpo-42927(5), + based on ideas implemented originally in PyPy and MicroPython.) + + * When building Python with *note –enable-optimizations: 45e. now + ‘-fno-semantic-interposition’ is added to both the compile and link + line. This speeds builds of the Python interpreter created with + *note –enable-shared: 45f. with ‘gcc’ by up to 30%. See this + article(6) for more details. (Contributed by Victor Stinner and + Pablo Galindo in bpo-38980(7).) + + * Use a new output buffer management code for *note bz2: 12. / *note + lzma: ab. / *note zlib: 14f. modules, and add ‘.readall()’ function + to ‘_compression.DecompressReader’ class. bz2 decompression is now + 1.09x ~ 1.17x faster, lzma decompression 1.20x ~ 1.32x faster, + ‘GzipFile.read(-1)’ 1.11x ~ 1.18x faster. (Contributed by Ma Lin, + reviewed by Gregory P. Smith, in bpo-41486(8)) + + * 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(9).) + + * Substring search functions such as ‘str1 in str2’ and + ‘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(10)) + + * Add micro-optimizations to ‘_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(11).) + + * The following built-in functions now support the faster PEP 590(12) + vectorcall calling convention: *note map(): 460, *note filter(): + 461, *note reversed(): 462, *note bool(): 463. and *note float(): + 3ca. (Contributed by Dong-hee Na and Jeroen Demeyer in + bpo-43575(13), bpo-43287(14), bpo-41922(15), bpo-41873(16) and + bpo-41870(17).) + + * ‘BZ2File’ performance is improved by removing internal ‘RLock’. + This makes ‘BZ2File’ thread unsafe in the face of multiple + simultaneous readers or writers, just like its equivalent classes + in *note gzip: 87. and *note lzma: ab. have always been. + (Contributed by Inada Naoki in bpo-43785(18).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41334 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41006 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41718 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42093 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42927 + + (6) +https://developers.redhat.com/blog/2020/06/25/red-hat-enterprise-linux-8-2-brings-faster-python-3-8-run-speeds/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38980 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41486 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42202 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41972 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43452 + + (12) https://peps.python.org/pep-0590/ + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43575 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=43287 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=41922 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=41873 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=41870 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=43785 + + +File: python.info, Node: Deprecated<3>, Next: Removed<3>, Prev: Optimizations<2>, Up: What’s New In Python 3 10 + +1.2.8 Deprecated +---------------- + + * Currently Python accepts numeric literals immediately followed by + keywords, for example ‘0in x’, ‘1or x’, ‘0if 1else 2’. It allows + confusing and ambiguous expressions like ‘[0x1for x in y]’ (which + can be interpreted as ‘[0x1 for x in y]’ or ‘[0x1f or x in y]’). + Starting in this release, a deprecation warning is raised if the + numeric literal is immediately followed by one of keywords *note + and: 465, *note else: 466, *note for: 199, *note if: 467, *note in: + 20a, *note is: 468. and *note or: 469. In future releases it will + be changed to syntax warning, and finally to syntax error. + (Contributed by Serhiy Storchaka in bpo-43833(1).) + + * 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, *note find_loader(): 2ee./*note + find_module(): 46a. (superseded by ‘find_spec()’), *note + load_module(): 46b. (superseded by *note exec_module(): 46c.), + *note module_repr(): 2ec. (which the import system takes care of + for you), the ‘__package__’ attribute (superseded by + ‘__spec__.parent’), the ‘__loader__’ attribute (superseded by + ‘__spec__.loader’), and the ‘__cached__’ attribute (superseded by + ‘__spec__.cached’) will slowly be removed (as well as other classes + and methods in *note importlib: 97.). *note ImportWarning: 46d. + and/or *note DeprecationWarning: 2d4. will be raised as appropriate + to help identify code which needs updating during this transition. + + * The entire ‘distutils’ namespace is deprecated, to be removed in + Python 3.12. Refer to the *note module changes: 2f3. section for + more information. + + * Non-integer arguments to *note random.randrange(): 46e. are + deprecated. The *note ValueError: 1c8. is deprecated in favor of a + *note TypeError: 19c. (Contributed by Serhiy Storchaka and Raymond + Hettinger in bpo-37319(2).) + + * The various ‘load_module()’ methods of *note importlib: 97. have + been documented as deprecated since Python 3.6, but will now also + trigger a *note DeprecationWarning: 2d4. Use *note exec_module(): + 46c. instead. (Contributed by Brett Cannon in bpo-26131(3).) + + * ‘zimport.zipimporter.load_module()’ has been deprecated in + preference for *note exec_module(): 45b. (Contributed by Brett + Cannon in bpo-26131(4).) + + * The use of *note load_module(): 46b. by the import system now + triggers an *note ImportWarning: 46d. as *note exec_module(): 46c. + is preferred. (Contributed by Brett Cannon in bpo-26131(5).) + + * The use of *note importlib.abc.MetaPathFinder.find_module(): 2ed. + and *note importlib.abc.PathEntryFinder.find_module(): 2ef. by the + import system now trigger an *note ImportWarning: 46d. as *note + importlib.abc.MetaPathFinder.find_spec(): 46f. and *note + importlib.abc.PathEntryFinder.find_spec(): 470. are preferred, + respectively. You can use *note importlib.util.spec_from_loader(): + 471. to help in porting. (Contributed by Brett Cannon in + bpo-42134(6).) + + * The use of *note importlib.abc.PathEntryFinder.find_loader(): 2ee. + by the import system now triggers an *note ImportWarning: 46d. as + *note importlib.abc.PathEntryFinder.find_spec(): 470. is preferred. + You can use *note importlib.util.spec_from_loader(): 471. to help + in porting. (Contributed by Brett Cannon in bpo-43672(7).) + + * The various implementations of *note + importlib.abc.MetaPathFinder.find_module(): 2ed. ( + ‘importlib.machinery.BuiltinImporter.find_module()’, + ‘importlib.machinery.FrozenImporter.find_module()’, + ‘importlib.machinery.WindowsRegistryFinder.find_module()’, *note + importlib.machinery.PathFinder.find_module(): 2f1, *note + importlib.abc.MetaPathFinder.find_module(): 2ed. ), *note + importlib.abc.PathEntryFinder.find_module(): 2ef. ( + ‘importlib.machinery.FileFinder.find_module()’ ), and *note + importlib.abc.PathEntryFinder.find_loader(): 2ee. ( *note + importlib.machinery.FileFinder.find_loader(): 2f0. ) now raise + *note DeprecationWarning: 2d4. 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(8).) + + * *note importlib.abc.Finder: 472. is deprecated (including its sole + method, *note find_module(): 46a.). Both *note + importlib.abc.MetaPathFinder: 473. and *note + importlib.abc.PathEntryFinder: 474. 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(9).) + + * The deprecations of *note imp: 96, *note importlib.find_loader(): + 2ea, ‘importlib.util.set_package_wrapper()’, + ‘importlib.util.set_loader_wrapper()’, *note + importlib.util.module_for_loader(): 2eb, *note pkgutil.ImpImporter: + 2e7, and *note pkgutil.ImpLoader: 2e8. have all been updated to + list Python 3.12 as the slated version of removal (they began + raising *note DeprecationWarning: 2d4. in previous versions of + Python). (Contributed by Brett Cannon in bpo-43720(10).) + + * The import system now uses the ‘__spec__’ attribute on modules + before falling back on *note module_repr(): 2ec. for a module’s + ‘__repr__()’ method. Removal of the use of ‘module_repr()’ is + scheduled for Python 3.12. (Contributed by Brett Cannon in + bpo-42137(11).) + + * *note importlib.abc.Loader.module_repr(): 2ec, + ‘importlib.machinery.FrozenLoader.module_repr()’, and + ‘importlib.machinery.BuiltinLoader.module_repr()’ are deprecated + and slated for removal in Python 3.12. (Contributed by Brett + Cannon in bpo-42136(12).) + + * ‘sqlite3.OptimizedUnicode’ has been undocumented and obsolete since + Python 3.3, when it was made an alias to *note str: 1b3. It is now + deprecated, scheduled for removal in Python 3.12. (Contributed by + Erlend E. Aasland in bpo-42264(13).) + + * *note asyncio.get_event_loop(): 475. now emits a deprecation + warning if there is no running event loop. In the future it will + be an alias of *note get_running_loop(): 476. *note asyncio: 9. + functions which implicitly create *note Future: 477. or *note Task: + 1e3. objects now emit a deprecation warning if there is no running + event loop and no explicit `loop' argument is passed: *note + ensure_future(): 478, *note wrap_future(): 479, *note gather(): + 1d3, *note shield(): 47a, *note as_completed(): 47b. and + constructors of *note Future: 477, *note Task: 1e3, *note + StreamReader: 47c, ‘StreamReaderProtocol’. (Contributed by Serhiy + Storchaka in bpo-39529(14).) + + * The undocumented built-in function ‘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(15) for more details. If a shared cache must be used, open + the database in URI mode using the ‘cache=shared’ query parameter. + (Contributed by Erlend E. Aasland in bpo-24464(16).) + + * The following ‘threading’ methods are now deprecated: + + * ‘threading.currentThread’ => *note threading.current_thread(): + 47d. + + * ‘threading.activeCount’ => *note threading.active_count(): + 47e. + + * ‘threading.Condition.notifyAll’ => *note + threading.Condition.notify_all(): 47f. + + * ‘threading.Event.isSet’ => *note threading.Event.is_set(): + 480. + + * ‘threading.Thread.setName’ => *note threading.Thread.name: + 481. + + * ‘threading.thread.getName’ => *note threading.Thread.name: + 481. + + * ‘threading.Thread.isDaemon’ => *note threading.Thread.daemon: + 482. + + * ‘threading.Thread.setDaemon’ => *note threading.Thread.daemon: + 482. + + (Contributed by Jelle Zijlstra in gh-87889(17).) + + * *note pathlib.Path.link_to(): 2f2. is deprecated and slated for + removal in Python 3.12. Use *note pathlib.Path.hardlink_to(): 416. + instead. (Contributed by Barney Gale in bpo-39950(18).) + + * ‘cgi.log()’ is deprecated and slated for removal in Python 3.12. + (Contributed by Inada Naoki in bpo-41139(19).) + + * The following *note ssl: f0. features have been deprecated since + Python 3.6, Python 3.7, or OpenSSL 1.1.0 and will be removed in + 3.11: + + * *note OP_NO_SSLv2: 42d, *note OP_NO_SSLv3: 42e, *note + OP_NO_TLSv1: 483, *note OP_NO_TLSv1_1: 484, *note + OP_NO_TLSv1_2: 485, and *note OP_NO_TLSv1_3: 486. are replaced + by ‘sslSSLContext.minimum_version’ and + ‘sslSSLContext.maximum_version’. + + * *note PROTOCOL_SSLv2: 487, *note PROTOCOL_SSLv3: 488, *note + PROTOCOL_SSLv23: 489, *note PROTOCOL_TLSv1: 48a, *note + PROTOCOL_TLSv1_1: 48b, *note PROTOCOL_TLSv1_2: 48c, and *note + PROTOCOL_TLS: 48d. are deprecated in favor of *note + PROTOCOL_TLS_CLIENT: 48e. and *note PROTOCOL_TLS_SERVER: 48f. + + * *note wrap_socket(): 490. is replaced by *note + ssl.SSLContext.wrap_socket(): 491. + + * *note match_hostname(): 492. + + * *note RAND_pseudo_bytes(): 493, ‘RAND_egd()’ + + * NPN features like *note ssl.SSLSocket.selected_npn_protocol(): + 494. and *note ssl.SSLContext.set_npn_protocols(): 495. are + replaced by ALPN. + + * The threading debug ( *note PYTHONTHREADDEBUG: 2e9. environment + variable) is deprecated in Python 3.10 and will be removed in + Python 3.12. This feature requires a *note debug build of Python: + 496. (Contributed by Victor Stinner in bpo-44584(20).) + + * Importing from the ‘typing.io’ and ‘typing.re’ submodules will now + emit *note DeprecationWarning: 2d4. These submodules will be + removed in a future version of Python. Anything belonging to these + submodules should be imported directly from *note typing: 123. + instead. (Contributed by Sebastian Rittau in bpo-38291(21).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43833 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37319 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26131 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26131 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26131 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42134 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43672 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42135 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42135 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43720 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42137 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42136 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=42264 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39529 + + (15) https://sqlite.org/c3ref/enable_shared_cache.html + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24464 + + (17) https://github.com/python/cpython/issues/87889 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=39950 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=41139 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=44584 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=38291 + + +File: python.info, Node: Removed<3>, Next: Porting to Python 3 10, Prev: Deprecated<3>, Up: What’s New In Python 3 10 + +1.2.9 Removed +------------- + + * Removed special methods ‘__int__’, ‘__float__’, ‘__floordiv__’, + ‘__mod__’, ‘__divmod__’, ‘__rfloordiv__’, ‘__rmod__’ and + ‘__rdivmod__’ of the *note complex: 1b8. class. They always raised + a *note TypeError: 19c. (Contributed by Serhiy Storchaka in + bpo-41974(1).) + + * The ‘ParserBase.error()’ method from the private and undocumented + ‘_markupbase’ module has been removed. *note + html.parser.HTMLParser: 499. is the only subclass of ‘ParserBase’ + and its ‘error()’ implementation was already removed in Python 3.5. + (Contributed by Berker Peksag in bpo-31844(2).) + + * Removed the ‘unicodedata.ucnhash_CAPI’ attribute which was an + internal PyCapsule object. The related private + ‘_PyUnicode_Name_CAPI’ structure was moved to the internal C API. + (Contributed by Victor Stinner in bpo-42157(3).) + + * Removed the ‘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 + ‘node.h’, ‘parser.h’, ‘graminit.h’ and ‘grammar.h’. + + * Removed the Public C API functions + ‘PyParser_SimpleParseStringFlags’, + ‘PyParser_SimpleParseStringFlagsFilename’, + ‘PyParser_SimpleParseFileFlags’ and ‘PyNode_Compile’ that were + deprecated in 3.9 due to the switch to the new PEG parser. + + * Removed the ‘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 + Dong-hee Na and Terry J. Reedy in bpo-42299(4).) + + * Removed the ‘PyModule_GetWarningsModule()’ function that was + useless now due to the _warnings module was converted to a builtin + module in 2.6. (Contributed by Hai Shi in bpo-42599(5).) + + * Remove deprecated aliases to *note Collections Abstract Base + Classes: 49a. from the *note collections: 1c. module. (Contributed + by Victor Stinner in bpo-37324(6).) + + * The ‘loop’ parameter has been removed from most of *note asyncio: + 9.‘s *note high-level API: 49b. following deprecation in Python + 3.8. The motivation behind this change is multifold: + + 1. This simplifies the high-level API. + + 2. 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. + + 3. Event loop passing is error-prone especially when dealing with + loops running in different threads. + + Note that the low-level API will still accept ‘loop’. See *note + Changes in the Python API: 49c. for examples of how to replace + existing code. + + (Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and + Kyle Stanley in bpo-42392(7).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41974 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31844 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42157 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42299 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42599 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37324 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42392 + + +File: python.info, Node: Porting to Python 3 10, Next: CPython bytecode changes<2>, Prev: Removed<3>, Up: What’s New In Python 3 10 + +1.2.10 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 C API:: + + +File: python.info, Node: Changes in the Python syntax, Next: Changes in the Python API, Up: Porting to Python 3 10 + +1.2.10.1 Changes in the Python syntax +..................................... + + * Deprecation warning is now emitted when compiling previously valid + syntax if the numeric literal is immediately followed by a keyword + (like in ‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43833 + + +File: python.info, Node: Changes in the Python API, Next: Changes in the C API, Prev: Changes in the Python syntax, Up: Porting to Python 3 10 + +1.2.10.2 Changes in the Python API +.................................. + + * The `etype' parameters of the *note format_exception(): 444, *note + format_exception_only(): 445, and *note print_exception(): 446. + functions in the *note traceback: 11d. module have been renamed to + `exc'. (Contributed by Zackery Spytz and Matthias Bussonnier in + bpo-26389(1).) + + * *note atexit: b.: At Python exit, if a callback registered with + *note atexit.register(): 4a0. 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(2).) + + * *note collections.abc.Callable: 3dc. generic now flattens type + parameters, similar to what *note typing.Callable: 3b1. currently + does. This means that ‘collections.abc.Callable[[int, str], str]’ + will have ‘__args__’ of ‘(int, str, str)’; previously this was + ‘([int, str], str)’. Code which accesses the arguments via *note + typing.get_args(): 4a1. or ‘__args__’ need to account for this + change. Furthermore, *note TypeError: 19c. may be raised for + invalid forms of parameterizing *note collections.abc.Callable: + 3dc. which may have passed silently in Python 3.9. (Contributed by + Ken Jin in bpo-42195(3).) + + * *note socket.htons(): 4a2. and *note socket.ntohs(): 4a3. now raise + *note OverflowError: 4a4. instead of *note DeprecationWarning: 2d4. + if the given parameter will not fit in a 16-bit unsigned integer. + (Contributed by Erlend E. Aasland in bpo-42393(4).) + + * The ‘loop’ parameter has been removed from most of *note asyncio: + 9.‘s *note high-level API: 49b. following deprecation in Python + 3.8. + + A coroutine that currently looks like this: + + async def foo(loop): + await asyncio.sleep(1, loop=loop) + + Should be replaced with this: + + async def foo(): + await asyncio.sleep(1) + + If ‘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 *note + asyncio.run_coroutine_threadsafe(): 4a5. instead. + + (Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and + Kyle Stanley in bpo-42392(5).) + + * The *note types.FunctionType: 4a6. constructor now inherits the + current builtins if the `globals' dictionary has no + ‘"__builtins__"’ key, rather than using ‘{"None": None}’ as + builtins: same behavior as *note eval(): 4a7. and *note exec(): + 4a8. functions. Defining a function with ‘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(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26389 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42639 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42195 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42393 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42392 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42990 + + +File: python.info, Node: Changes in the C API, Prev: Changes in the Python API, Up: Porting to Python 3 10 + +1.2.10.3 Changes in the C API +............................. + + * The C API functions ‘PyParser_SimpleParseStringFlags’, + ‘PyParser_SimpleParseStringFlagsFilename’, + ‘PyParser_SimpleParseFileFlags’, ‘PyNode_Compile’ and the type used + by these functions, ‘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, *note Py_CompileString(): 4aa. The resulting code + object can then be evaluated using, for example, *note + PyEval_EvalCode(): 4ab. + + Specifically: + + * A call to ‘PyParser_SimpleParseStringFlags’ followed by + ‘PyNode_Compile’ can be replaced by calling *note + Py_CompileString(): 4aa. + + * There is no direct replacement for + ‘PyParser_SimpleParseFileFlags’. To compile code from a ‘FILE + *’ argument, you will need to read the file in C and pass the + resulting buffer to *note Py_CompileString(): 4aa. + + * To compile a file given a ‘char *’ filename, explicitly open + the file, read it and compile the result. One way to do this + is using the *note io: 9f. module with *note + PyImport_ImportModule(): 4ac, *note PyObject_CallMethod(): + 4ad, *note PyBytes_AsString(): 4ae. and *note + Py_CompileString(): 4aa, as sketched below. (Declarations and + error handling are omitted.) + + 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); + + * For ‘FrameObject’ objects, the ‘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 + *note PyCode_Addr2Line(): 4af. for example). Notice as well + that the ‘f_lasti’ member of ‘FrameObject’ objects is not + considered stable: please use *note PyFrame_GetLineNumber(): + 35f. instead. + + +File: python.info, Node: CPython bytecode changes<2>, Next: Build Changes<2>, Prev: Porting to Python 3 10, Up: What’s New In Python 3 10 + +1.2.11 CPython bytecode changes +------------------------------- + + * The ‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42202 + + +File: python.info, Node: Build Changes<2>, Next: C API Changes<2>, Prev: CPython bytecode changes<2>, Up: What’s New In Python 3 10 + +1.2.12 Build Changes +-------------------- + + * PEP 644(1): Python now requires OpenSSL 1.1.1 or newer. OpenSSL + 1.0.2 is no longer supported. (Contributed by Christian Heimes in + bpo-43669(2).) + + * The C99 functions ‘snprintf()’ and ‘vsnprintf()’ are now required + to build Python. (Contributed by Victor Stinner in bpo-36020(3).) + + * *note sqlite3: ef. requires SQLite 3.7.15 or higher. (Contributed + by Sergey Fedoseev and Erlend E. Aasland in bpo-40744(4) and + bpo-40810(5).) + + * The *note atexit: b. module must now always be built as a built-in + module. (Contributed by Victor Stinner in bpo-42639(6).) + + * Add *note –disable-test-modules: 4b2. option to the ‘configure’ + script: don’t build nor install test modules. (Contributed by + Xavier de Gaye, Thomas Petazzoni and Peixing Xin in bpo-27640(7).) + + * Add *note –with-wheel-pkg-dir=PATH option: 4b3. to the + ‘./configure’ script. If specified, the *note ensurepip: 75. + module looks for ‘setuptools’ and ‘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 ‘/usr/share/python-wheels/’ directory and don’t install the + ‘ensurepip._bundled’ package. + + (Contributed by Victor Stinner in bpo-42856(8).) + + * Add a new *note configure –without-static-libpython option: 4b4. to + not build the ‘libpythonMAJOR.MINOR.a’ static library and not + install the ‘python.o’ object file. + + (Contributed by Victor Stinner in bpo-43103(9).) + + * The ‘configure’ script now uses the ‘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 + ‘--with-tcltk-includes’ and ‘--with-tcltk-libs’ configuration + options. (Contributed by Manolis Stamatogiannakis in + bpo-42603(10).) + + * Add *note –with-openssl-rpath: 4b5. option to ‘configure’ script. + The option simplifies building Python with a custom OpenSSL + installation, e.g. ‘./configure --with-openssl=/path/to/openssl + --with-openssl-rpath=auto’. (Contributed by Christian Heimes in + bpo-43466(11).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0644/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43669 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36020 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40744 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40810 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42639 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27640 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42856 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43103 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42603 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43466 + + +File: python.info, Node: C API Changes<2>, Prev: Build Changes<2>, Up: What’s New In Python 3 10 + +1.2.13 C API Changes +-------------------- + +* Menu: + +* PEP 652; Maintaining the Stable ABI: PEP 652 Maintaining the Stable ABI. +* New Features: New Features<4>. +* Porting to Python 3.10: Porting to Python 3 10<2>. +* Deprecated: Deprecated<4>. +* Removed: Removed<4>. + + +File: python.info, Node: PEP 652 Maintaining the Stable ABI, Next: New Features<4>, Up: C API Changes<2> + +1.2.13.1 PEP 652: Maintaining the Stable ABI +............................................ + +The Stable ABI (Application Binary Interface) for extension modules or +embedding Python is now explicitly defined. *note C API Stability: 4b8. +describes C API and ABI stability guarantees along with best practices +for using the Stable ABI. + +(Contributed by Petr Viktorin in PEP 652(1) and bpo-43795(2).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0652/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43795 + + +File: python.info, Node: New Features<4>, Next: Porting to Python 3 10<2>, Prev: PEP 652 Maintaining the Stable ABI, Up: C API Changes<2> + +1.2.13.2 New Features +..................... + + * The result of *note PyNumber_Index(): 4ba. now always has exact + type *note int: 1c7. Previously, the result could have been an + instance of a subclass of ‘int’. (Contributed by Serhiy Storchaka + in bpo-40792(1).) + + * Add a new *note orig_argv: 4bb. member to the *note PyConfig: 370. + structure: the list of the original command line arguments passed + to the Python executable. (Contributed by Victor Stinner in + bpo-23427(2).) + + * The *note PyDateTime_DATE_GET_TZINFO(): 4bc. and *note + PyDateTime_TIME_GET_TZINFO(): 4bd. macros have been added for + accessing the ‘tzinfo’ attributes of *note datetime.datetime: 4be. + and *note datetime.time: 4bf. objects. (Contributed by Zackery + Spytz in bpo-30155(3).) + + * Add a *note PyCodec_Unregister(): 4c0. function to unregister a + codec search function. (Contributed by Hai Shi in bpo-41842(4).) + + * The *note PyIter_Send(): 4c1. function was added to allow sending + value into iterator without raising ‘StopIteration’ exception. + (Contributed by Vladimir Matveev in bpo-41756(5).) + + * Add *note PyUnicode_AsUTF8AndSize(): 4c2. to the limited C API. + (Contributed by Alex Gaynor in bpo-41784(6).) + + * Add *note PyModule_AddObjectRef(): 4c3. function: similar to *note + PyModule_AddObject(): 4c4. but don’t steal a reference to the value + on success. (Contributed by Victor Stinner in bpo-1635741(7).) + + * Add *note Py_NewRef(): 4c5. and *note Py_XNewRef(): 4c6. functions + to increment the reference count of an object and return the + object. (Contributed by Victor Stinner in bpo-42262(8).) + + * The *note PyType_FromSpecWithBases(): 4c7. and *note + PyType_FromModuleAndSpec(): 4c8. functions now accept a single + class as the `bases' argument. (Contributed by Serhiy Storchaka in + bpo-42423(9).) + + * The *note PyType_FromModuleAndSpec(): 4c8. function now accepts + NULL ‘tp_doc’ slot. (Contributed by Hai Shi in bpo-41832(10).) + + * The *note PyType_GetSlot(): 4c9. function can accept *note static + types: 354. (Contributed by Hai Shi and Petr Viktorin in + bpo-41073(11).) + + * Add a new *note PySet_CheckExact(): 4ca. function to the C-API to + check if an object is an instance of *note set: 1a6. but not an + instance of a subtype. (Contributed by Pablo Galindo in + bpo-43277(12).) + + * Add *note PyErr_SetInterruptEx(): 4cb. which allows passing a + signal number to simulate. (Contributed by Antoine Pitrou in + bpo-43356(13).) + + * The limited C API is now supported if *note Python is built in + debug mode: 496. (if the ‘Py_DEBUG’ macro is defined). In the + limited C API, the *note Py_INCREF(): 4cc. and *note Py_DECREF(): + 4cd. functions are now implemented as opaque function calls, rather + than accessing directly the *note PyObject.ob_refcnt: 4ce. member, + if Python is built in debug mode and the ‘Py_LIMITED_API’ macro + targets Python 3.10 or newer. It became possible to support the + limited C API in debug mode because the *note PyObject: 4cf. + structure is the same in release and debug mode since Python 3.8 + (see bpo-36465(14)). + + The limited C API is still not supported in the *note + –with-trace-refs: 4d0. special build (‘Py_TRACE_REFS’ macro). + (Contributed by Victor Stinner in bpo-43688(15).) + + * Add the *note Py_Is(x, y): 4d1. function to test if the `x' object + is the `y' object, the same as ‘x is y’ in Python. Add also the + *note Py_IsNone(): 4d2, *note Py_IsTrue(): 4d3, *note Py_IsFalse(): + 4d4. functions to test if an object is, respectively, the ‘None’ + singleton, the ‘True’ singleton or the ‘False’ singleton. + (Contributed by Victor Stinner in bpo-43753(16).) + + * Add new functions to control the garbage collector from C code: + *note PyGC_Enable(): 4d5, *note PyGC_Disable(): 4d6, *note + PyGC_IsEnabled(): 4d7. These functions allow to activate, + deactivate and query the state of the garbage collector from C code + without having to import the *note gc: 80. module. + + * Add a new ‘Py_TPFLAGS_DISALLOW_INSTANTIATION’ type flag to disallow + creating type instances. (Contributed by Victor Stinner in + bpo-43916(17).) + + * Add a new ‘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(18).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40792 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23427 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30155 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41842 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41756 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41784 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42262 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42423 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41832 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=41073 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=43277 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43356 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=36465 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=43688 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=43753 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=43916 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=43908 + + +File: python.info, Node: Porting to Python 3 10<2>, Next: Deprecated<4>, Prev: New Features<4>, Up: C API Changes<2> + +1.2.13.3 Porting to Python 3.10 +............................... + + * The ‘PY_SSIZE_T_CLEAN’ macro must now be defined to use *note + PyArg_ParseTuple(): 4d9. and *note Py_BuildValue(): 4da. formats + which use ‘#’: ‘es#’, ‘et#’, ‘s#’, ‘u#’, ‘y#’, ‘z#’, ‘U#’ and ‘Z#’. + See *note Parsing arguments and building values: 4db. and the PEP + 353(1). (Contributed by Victor Stinner in bpo-40943(2).) + + * Since *note Py_REFCNT(): 4dc. is changed to the inline static + function, ‘Py_REFCNT(obj) = new_refcnt’ must be replaced with + ‘Py_SET_REFCNT(obj, new_refcnt)’: see *note Py_SET_REFCNT(): 4dd. + (available since Python 3.9). For backward compatibility, this + macro can be used: + + #if PY_VERSION_HEX < 0x030900A4 + # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) + #endif + + (Contributed by Victor Stinner in bpo-39573(3).) + + * Calling *note PyDict_GetItem(): 4de. without *note GIL: 4df. held + had been allowed for historical reason. It is no longer allowed. + (Contributed by Victor Stinner in bpo-40839(4).) + + * ‘PyUnicode_FromUnicode(NULL, size)’ and + ‘PyUnicode_FromStringAndSize(NULL, size)’ raise + ‘DeprecationWarning’ now. Use *note PyUnicode_New(): 4e0. to + allocate Unicode object without initial data. (Contributed by + Inada Naoki in bpo-36346(5).) + + * The private ‘_PyUnicode_Name_CAPI’ structure of the PyCapsule API + ‘unicodedata.ucnhash_CAPI’ has been moved to the internal C API. + (Contributed by Victor Stinner in bpo-42157(6).) + + * *note Py_GetPath(): 4e1, *note Py_GetPrefix(): 4e2, *note + Py_GetExecPrefix(): 4e3, *note Py_GetProgramFullPath(): 4e4, *note + Py_GetPythonHome(): 4e5. and *note Py_GetProgramName(): 4e6. + functions now return ‘NULL’ if called before *note Py_Initialize(): + 4e7. (before Python is initialized). Use the new *note Python + Initialization Configuration API: 371. to get the *note Python Path + Configuration.: 4e8. (Contributed by Victor Stinner in + bpo-42260(7).) + + * *note PyList_SET_ITEM(): 4e9, *note PyTuple_SET_ITEM(): 4ea. and + *note PyCell_SET(): 4eb. macros can no longer be used as l-value or + r-value. For example, ‘x = PyList_SET_ITEM(a, b, c)’ and + ‘PyList_SET_ITEM(a, b, c) = x’ now fail with a compiler error. It + prevents bugs like ‘if (PyList_SET_ITEM (a, b, c) < 0) ...’ test. + (Contributed by Zackery Spytz and Victor Stinner in bpo-30459(8).) + + * The non-limited API files ‘odictobject.h’, ‘parser_interface.h’, + ‘picklebufobject.h’, ‘pyarena.h’, ‘pyctype.h’, ‘pydebug.h’, + ‘pyfpe.h’, and ‘pytime.h’ have been moved to the ‘Include/cpython’ + directory. These files must not be included directly, as they are + already included in ‘Python.h’: *note Include Files: 359. If they + have been included directly, consider including ‘Python.h’ instead. + (Contributed by Nicholas Sim in bpo-35134(9).) + + * Use the ‘Py_TPFLAGS_IMMUTABLETYPE’ type flag to create immutable + type objects. Do not rely on ‘Py_TPFLAGS_HEAPTYPE’ to decide if a + type object is mutable or not; check if ‘Py_TPFLAGS_IMMUTABLETYPE’ + is set instead. (Contributed by Victor Stinner and Erlend E. + Aasland in bpo-43908(10).) + + * The undocumented function ‘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(11).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0353/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40943 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40839 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36346 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42157 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42260 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30459 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43908 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=26241 + + +File: python.info, Node: Deprecated<4>, Next: Removed<4>, Prev: Porting to Python 3 10<2>, Up: C API Changes<2> + +1.2.13.4 Deprecated +................... + + * The ‘PyUnicode_InternImmortal()’ function is now deprecated and + will be removed in Python 3.12: use *note + PyUnicode_InternInPlace(): 4ed. instead. (Contributed by Victor + Stinner in bpo-41692(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41692 + + +File: python.info, Node: Removed<4>, Prev: Deprecated<4>, Up: C API Changes<2> + +1.2.13.5 Removed +................ + + * Removed ‘Py_UNICODE_str*’ functions manipulating ‘Py_UNICODE*’ + strings. (Contributed by Inada Naoki in bpo-41123(1).) + + * ‘Py_UNICODE_strlen’: use *note PyUnicode_GetLength(): + 4ef. or *note PyUnicode_GET_LENGTH: 4f0. + + * ‘Py_UNICODE_strcat’: use *note + PyUnicode_CopyCharacters(): 4f1. or *note + PyUnicode_FromFormat(): 4f2. + + * ‘Py_UNICODE_strcpy’, ‘Py_UNICODE_strncpy’: use *note + PyUnicode_CopyCharacters(): 4f1. or *note + PyUnicode_Substring(): 4f3. + + * ‘Py_UNICODE_strcmp’: use *note PyUnicode_Compare(): 4f4. + + * ‘Py_UNICODE_strncmp’: use *note PyUnicode_Tailmatch(): + 4f5. + + * ‘Py_UNICODE_strchr’, ‘Py_UNICODE_strrchr’: use *note + PyUnicode_FindChar(): 4f6. + + * Removed ‘PyUnicode_GetMax()’. Please migrate to new ( PEP 393(2)) + APIs. (Contributed by Inada Naoki in bpo-41103(3).) + + * Removed ‘PyLong_FromUnicode()’. Please migrate to *note + PyLong_FromUnicodeObject(): 4f7. (Contributed by Inada Naoki in + bpo-41103(4).) + + * Removed ‘PyUnicode_AsUnicodeCopy()’. Please use *note + PyUnicode_AsUCS4Copy(): 4f8. or *note PyUnicode_AsWideCharString(): + 4f9. (Contributed by Inada Naoki in bpo-41103(5).) + + * Removed ‘_Py_CheckRecursionLimit’ variable: it has been replaced by + ‘ceval.recursion_limit’ of the *note PyInterpreterState: 4fa. + structure. (Contributed by Victor Stinner in bpo-41834(6).) + + * Removed undocumented macros ‘Py_ALLOW_RECURSION’ and + ‘Py_END_ALLOW_RECURSION’ and the ‘recursion_critical’ field of the + *note PyInterpreterState: 4fa. structure. (Contributed by Serhiy + Storchaka in bpo-41936(7).) + + * Removed the undocumented ‘PyOS_InitInterrupts()’ function. + Initializing Python already implicitly installs signal handlers: + see *note PyConfig.install_signal_handlers: 4fb. (Contributed by + Victor Stinner in bpo-41713(8).) + + * Remove the ‘PyAST_Validate()’ function. It is no longer possible + to build a AST object (‘mod_ty’ type) with the public C API. The + function was already excluded from the limited C API ( PEP 384(9)). + (Contributed by Victor Stinner in bpo-43244(10).) + + * Remove the ‘symtable.h’ header file and the undocumented functions: + + * ‘PyST_GetScope()’ + + * ‘PySymtable_Build()’ + + * ‘PySymtable_BuildObject()’ + + * ‘PySymtable_Free()’ + + * ‘Py_SymtableString()’ + + * ‘Py_SymtableStringObject()’ + + The ‘Py_SymtableString()’ function was part the stable ABI by + mistake but it could not be used, because the ‘symtable.h’ header + file was excluded from the limited C API. + + Use Python *note symtable: f8. module instead. (Contributed by + Victor Stinner in bpo-43244(11).) + + * Remove *note PyOS_ReadlineFunctionPointer(): 4fc. from the limited + C API headers and from ‘python3.dll’, the library that provides the + stable ABI on Windows. Since the function takes a ‘FILE*’ + argument, its ABI stability cannot be guaranteed. (Contributed by + Petr Viktorin in bpo-43868(12).) + + * Remove ‘ast.h’, ‘asdl.h’, and ‘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 ‘Py’ + and so could create names conflicts. For example, ‘Python-ast.h’ + defined a ‘Yield’ macro which was conflict with the ‘Yield’ name + used by the Windows ‘’ header. Use the Python *note + ast: 7. module instead. (Contributed by Victor Stinner in + bpo-43244(13).) + + * Remove the compiler and parser functions using ‘struct _mod’ type, + because the public AST C API was removed: + + * ‘PyAST_Compile()’ + + * ‘PyAST_CompileEx()’ + + * ‘PyAST_CompileObject()’ + + * ‘PyFuture_FromAST()’ + + * ‘PyFuture_FromASTObject()’ + + * ‘PyParser_ASTFromFile()’ + + * ‘PyParser_ASTFromFileObject()’ + + * ‘PyParser_ASTFromFilename()’ + + * ‘PyParser_ASTFromString()’ + + * ‘PyParser_ASTFromStringObject()’ + + These functions were undocumented and excluded from the limited C + API. (Contributed by Victor Stinner in bpo-43244(14).) + + * Remove the ‘pyarena.h’ header file with functions: + + * ‘PyArena_New()’ + + * ‘PyArena_Free()’ + + * ‘PyArena_Malloc()’ + + * ‘PyArena_AddPyObject()’ + + 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(15).) + + * The ‘PyThreadState.use_tracing’ member has been removed to optimize + Python. (Contributed by Mark Shannon in bpo-43760(16).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41123 + + (2) https://peps.python.org/pep-0393/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41103 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41103 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41103 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41834 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41936 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41713 + + (9) https://peps.python.org/pep-0384/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=43868 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=43760 + + +File: python.info, Node: What’s New In Python 3 9, Next: What’s New In Python 3 8, Prev: What’s New In Python 3 10, Up: What’s New in Python + +1.3 What’s New In Python 3.9 +============================ + + +Release: 3.11.0 + + +Date: March 03, 2023 + + +Editor: Łukasz Langa + +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 *note changelog: 158. + +See also +........ + +PEP 596(1) - Python 3.9 Release Schedule + +* Menu: + +* Summary – Release highlights: Summary – Release highlights<3>. +* You should check for DeprecationWarning in your code:: +* New Features: New Features<5>. +* Other Language Changes: Other Language Changes<3>. +* New Modules: New Modules<3>. +* Improved Modules: Improved Modules<3>. +* Optimizations: Optimizations<3>. +* Deprecated: Deprecated<5>. +* Removed: Removed<5>. +* Porting to Python 3.9: Porting to Python 3 9. +* Build Changes: Build Changes<3>. +* C API Changes: C API Changes<3>. +* 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0596/ + + +File: python.info, Node: Summary – Release highlights<3>, Next: You should check for DeprecationWarning in your code, Up: What’s New In Python 3 9 + +1.3.1 Summary – Release highlights +---------------------------------- + +New syntax features: + + * PEP 584(1), union operators added to ‘dict’; + + * PEP 585(2), type hinting generics in standard collections; + + * PEP 614(3), relaxed grammar restrictions on decorators. + +New built-in features: + + * PEP 616(4), string methods to remove prefixes and suffixes. + +New features in the standard library: + + * PEP 593(5), flexible function and variable annotations; + + * *note os.pidfd_open(): 500. added that allows process management + without races and signals. + +Interpreter improvements: + + * PEP 573(6), fast access to module state from methods of C extension + types; + + * PEP 617(7), CPython now uses a new parser based on PEG; + + * a number of Python builtins (range, tuple, set, frozenset, list, + dict) are now sped up using PEP 590(8) vectorcall; + + * garbage collection does not block on resurrected objects; + + * a number of Python modules (‘_abc’, *note audioop: c, ‘_bz2’, + ‘_codecs’, ‘_contextvars’, ‘_crypt’, ‘_functools’, ‘_json’, + ‘_locale’, *note math: af, *note operator: c0, *note resource: dd, + *note time: 10c, ‘_weakref’) now use multiphase initialization as + defined by PEP 489; + + * a number of standard library modules (*note audioop: c, *note ast: + 7, *note grp: 86, ‘_hashlib’, *note pwd: d3, ‘_posixsubprocess’, + *note random: d9, *note select: e2, *note struct: f5, *note + termios: 100, *note zlib: 14f.) are now using the stable ABI + defined by PEP 384. + +New library modules: + + * PEP 615(9), the IANA Time Zone Database is now present in the + standard library in the *note zoneinfo: 150. module; + + * an implementation of a topological sort of a graph is now provided + in the new *note graphlib: 85. module. + +Release process changes: + + * PEP 602(10), CPython adopts an annual release cycle. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0584/ + + (2) https://peps.python.org/pep-0585/ + + (3) https://peps.python.org/pep-0614/ + + (4) https://peps.python.org/pep-0616/ + + (5) https://peps.python.org/pep-0593/ + + (6) https://peps.python.org/pep-0573/ + + (7) https://peps.python.org/pep-0617/ + + (8) https://peps.python.org/pep-0590/ + + (9) https://peps.python.org/pep-0615/ + + (10) https://peps.python.org/pep-0602/ + + +File: python.info, Node: You should check for DeprecationWarning in your code, Next: New Features<5>, Prev: Summary – Release highlights<3>, Up: What’s New In Python 3 9 + +1.3.2 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 *note +DeprecationWarning: 2d4. warning for several years. For example, using +‘collections.Mapping’ instead of ‘collections.abc.Mapping’ emits a *note +DeprecationWarning: 2d4. since Python 3.3, released in 2012. + +Test your application with the *note -W: 502. ‘default’ command-line +option to see *note DeprecationWarning: 2d4. and *note +PendingDeprecationWarning: 503, or even with *note -W: 502. ‘error’ to +treat them as errors. *note Warnings Filter: 504. 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 *note Abstract Base Classes: 49a. in the *note collections: +1c. module, like ‘collections.Mapping’ alias to *note +collections.abc.Mapping: 505, 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 *note Python Development +Mode: 506. 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 *note Removed: 507. section. + + +File: python.info, Node: New Features<5>, Next: Other Language Changes<3>, Prev: You should check for DeprecationWarning in your code, Up: What’s New In Python 3 9 + +1.3.3 New Features +------------------ + +* Menu: + +* Dictionary Merge & Update Operators:: +* New String Methods to Remove Prefixes and Suffixes:: +* Type Hinting Generics in Standard Collections:: +* New Parser:: + + +File: python.info, Node: Dictionary Merge & Update Operators, Next: New String Methods to Remove Prefixes and Suffixes, Up: New Features<5> + +1.3.3.1 Dictionary Merge & Update Operators +........................................... + +Merge (‘|’) and update (‘|=’) operators have been added to the built-in +*note dict: 16e. class. Those complement the existing ‘dict.update’ and +‘{**d1, **d2}’ methods of merging dictionaries. + +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'} + +See PEP 584(1) for a full description. (Contributed by Brandt Bucher in +bpo-36144(2).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0584/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + +File: python.info, Node: New String Methods to Remove Prefixes and Suffixes, Next: Type Hinting Generics in Standard Collections, Prev: Dictionary Merge & Update Operators, Up: New Features<5> + +1.3.3.2 New String Methods to Remove Prefixes and Suffixes +.......................................................... + +*note str.removeprefix(prefix): 50b. and *note str.removesuffix(suffix): +50c. have been added to easily remove an unneeded prefix or a suffix +from a string. Corresponding ‘bytes’, ‘bytearray’, and +‘collections.UserString’ methods have also been added. See PEP 616(1) +for a full description. (Contributed by Dennis Sweeney in +bpo-39939(2).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0616/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39939 + + +File: python.info, Node: Type Hinting Generics in Standard Collections, Next: New Parser, Prev: New String Methods to Remove Prefixes and Suffixes, Up: New Features<5> + +1.3.3.3 Type Hinting Generics in Standard Collections +..................................................... + +In type annotations you can now use built-in collection types such as +‘list’ and ‘dict’ as generic types instead of importing the +corresponding capitalized types (e.g. ‘List’ or ‘Dict’) from ‘typing’. +Some other types in the standard library are also now generic, for +example ‘queue.Queue’. + +Example: + + def greet_all(names: list[str]) -> None: + for name in names: + print("Hello", name) + +See PEP 585(1) for more details. (Contributed by Guido van Rossum, +Ethan Smith, and Batuhan Taşkaya in bpo-39481(2).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39481 + + +File: python.info, Node: New Parser, Prev: Type Hinting Generics in Standard Collections, Up: New Features<5> + +1.3.3.4 New Parser +.................. + +Python 3.9 uses a new parser, based on PEG(1) instead of LL(1)(2). 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 *note ast: 7. 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 ‘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 (‘-X oldparser’) or an +environment variable (‘PYTHONOLDPARSER=1’). + +See PEP 617(3) for more details. (Contributed by Guido van Rossum, +Pablo Galindo and Lysandros Nikolaou in bpo-40334(4).) + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Parsing_expression_grammar + + (2) https://en.wikipedia.org/wiki/LL_parser + + (3) https://peps.python.org/pep-0617/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40334 + + +File: python.info, Node: Other Language Changes<3>, Next: New Modules<3>, Prev: New Features<5>, Up: What’s New In Python 3 9 + +1.3.4 Other Language Changes +---------------------------- + + * *note __import__(): 510. now raises *note ImportError: 511. instead + of *note ValueError: 1c8, which used to occur when a relative + import went past its top-level package. (Contributed by Ngalim + Siregar in bpo-37444(1).) + + * Python now gets the absolute path of the script filename specified + on the command line (ex: ‘python3 script.py’): the ‘__file__’ + attribute of the *note __main__: 1. module became an absolute path, + rather than a relative path. These paths now remain valid after + the current directory is changed by *note os.chdir(): 1e6. As a + side effect, the traceback also displays the absolute path for + *note __main__: 1. module frames in this case. (Contributed by + Victor Stinner in bpo-20443(2).) + + * In the *note Python Development Mode: 506. and in *note debug + build: 496, the `encoding' and `errors' arguments are now checked + for string encoding and decoding operations. Examples: *note + open(): 30b, *note str.encode(): 512. and *note bytes.decode(): + 513. + + 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(3).) + + * ‘"".replace("", s, n)’ now returns ‘s’ instead of an empty string + for all non-zero ‘n’. It is now consistent with ‘"".replace("", + s)’. There are similar changes for *note bytes: 1b4. and *note + bytearray: 1a5. objects. (Contributed by Serhiy Storchaka in + bpo-28029(4).) + + * Any valid expression can now be used as a *note decorator: 2f8. + Previously, the grammar was much more restrictive. See PEP 614(5) + for details. (Contributed by Brandt Bucher in bpo-39702(6).) + + * Improved help for the *note typing: 123. module. Docstrings are + now shown for all special forms and special generic aliases (like + ‘Union’ and ‘List’). Using *note help(): 514. with generic alias + like ‘List[int]’ will show the help for the correspondent concrete + type (‘list’ in this case). (Contributed by Serhiy Storchaka in + bpo-40257(7).) + + * Parallel running of *note aclose(): 515. / *note asend(): 516. / + *note athrow(): 517. is now prohibited, and ‘ag_running’ now + reflects the actual running status of the async generator. + (Contributed by Yury Selivanov in bpo-30773(8).) + + * Unexpected errors in calling the ‘__iter__’ method are no longer + masked by ‘TypeError’ in the *note in: 20a. operator and functions + *note contains(): 518, *note indexOf(): 519. and *note countOf(): + 51a. of the *note operator: c0. module. (Contributed by Serhiy + Storchaka in bpo-40824(9).) + + * Unparenthesized lambda expressions can no longer be the expression + part in an ‘if’ clause in comprehensions and generator expressions. + See bpo-41848(10) and bpo-43755(11) for details. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37444 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20443 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37388 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28029 + + (5) https://peps.python.org/pep-0614/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39702 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40257 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30773 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40824 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41848 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43755 + + +File: python.info, Node: New Modules<3>, Next: Improved Modules<3>, Prev: Other Language Changes<3>, Up: What’s New In Python 3 9 + +1.3.5 New Modules +----------------- + +* Menu: + +* zoneinfo:: +* graphlib:: + + +File: python.info, Node: zoneinfo, Next: graphlib, Up: New Modules<3> + +1.3.5.1 zoneinfo +................ + +The *note zoneinfo: 150. module brings support for the IANA time zone +database to the standard library. It adds *note zoneinfo.ZoneInfo: 51d, +a concrete *note datetime.tzinfo: 1ab. implementation backed by the +system’s time zone data. + +Example: + + >>> from zoneinfo import ZoneInfo + >>> from datetime import datetime, timedelta + + >>> # Daylight saving time + >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles")) + >>> print(dt) + 2020-10-31 12:00:00-07:00 + >>> dt.tzname() + 'PDT' + + >>> # Standard time + >>> dt += timedelta(days=7) + >>> print(dt) + 2020-11-07 12:00:00-08:00 + >>> print(dt.tzname()) + PST + +As a fall-back source of data for platforms that don’t ship the IANA +database, the tzdata(1) module was released as a first-party package – +distributed via PyPI and maintained by the CPython core team. + +See also +........ + +PEP 615(2) – Support for the IANA Time Zone Database in the Standard Library + + PEP written and implemented by Paul Ganssle + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/tzdata/ + + (2) https://peps.python.org/pep-0615/ + + +File: python.info, Node: graphlib, Prev: zoneinfo, Up: New Modules<3> + +1.3.5.2 graphlib +................ + +A new module, *note graphlib: 85, was added that contains the *note +graphlib.TopologicalSorter: 51f. class to offer functionality to perform +topological sorting of graphs. (Contributed by Pablo Galindo, Tim +Peters and Larry Hastings in bpo-17005(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17005 + + +File: python.info, Node: Improved Modules<3>, Next: Optimizations<3>, Prev: New Modules<3>, Up: What’s New In Python 3 9 + +1.3.6 Improved Modules +---------------------- + +* Menu: + +* ast:: +* asyncio: asyncio<3>. +* compileall:: +* concurrent.futures: concurrent futures. +* curses: curses<2>. +* datetime: datetime<2>. +* distutils: distutils<2>. +* fcntl: fcntl<2>. +* ftplib:: +* gc: gc<2>. +* hashlib: hashlib<3>. +* http:: +* IDLE and idlelib: IDLE and idlelib<3>. +* imaplib:: +* importlib:: +* inspect: inspect<3>. +* ipaddress:: +* math: math<2>. +* multiprocessing:: +* nntplib:: +* os: os<3>. +* pathlib: pathlib<3>. +* pdb:: +* poplib:: +* pprint: pprint<2>. +* pydoc:: +* random:: +* signal:: +* smtplib:: +* socket: socket<3>. +* time: time<2>. +* sys: sys<3>. +* tracemalloc:: +* typing: typing<3>. +* unicodedata: unicodedata<2>. +* venv: venv<2>. +* xml: xml<2>. + + +File: python.info, Node: ast, Next: asyncio<3>, Up: Improved Modules<3> + +1.3.6.1 ast +........... + +Added the `indent' option to *note dump(): 522. which allows it to +produce a multiline indented output. (Contributed by Serhiy Storchaka +in bpo-37995(1).) + +Added *note ast.unparse(): 523. as a function in the *note ast: 7. +module that can be used to unparse an *note ast.AST: 30f. object and +produce a string with code that would produce an equivalent *note +ast.AST: 30f. object when parsed. (Contributed by Pablo Galindo and +Batuhan Taskaya in bpo-38870(2).) + +Added docstrings to AST nodes that contains the ASDL signature used to +construct that node. (Contributed by Batuhan Taskaya in bpo-39638(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37995 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38870 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39638 + + +File: python.info, Node: asyncio<3>, Next: compileall, Prev: ast, Up: Improved Modules<3> + +1.3.6.2 asyncio +............... + +Due to significant security concerns, the `reuse_address' parameter of +*note asyncio.loop.create_datagram_endpoint(): 2fb. is no longer +supported. This is because of the behavior of the socket option +‘SO_REUSEADDR’ in UDP. For more details, see the documentation for +‘loop.create_datagram_endpoint()’. (Contributed by Kyle Stanley, +Antoine Pitrou, and Yury Selivanov in bpo-37228(1).) + +Added a new *note coroutine: 525. *note shutdown_default_executor(): +526. that schedules a shutdown for the default executor that waits on +the *note ThreadPoolExecutor: 311. to finish closing. Also, *note +asyncio.run(): 1d7. has been updated to use the new *note coroutine: +525. (Contributed by Kyle Stanley in bpo-34037(2).) + +Added *note asyncio.PidfdChildWatcher: 527, a Linux-specific child +watcher implementation that polls process file descriptors. +(bpo-38692(3)) + +Added a new *note coroutine: 525. *note asyncio.to_thread(): 528. 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 *note run_in_executor(): 529. that can directly take keyword +arguments. (Contributed by Kyle Stanley and Yury Selivanov in +bpo-32309(4).) + +When cancelling the task due to a timeout, *note asyncio.wait_for(): +1d5. 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(5).) + +*note asyncio: 9. now raises ‘TyperError’ when calling incompatible +methods with an *note ssl.SSLSocket: 52a. socket. (Contributed by Ido +Michael in bpo-37404(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37228 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34037 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38692 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32309 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32751 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37404 + + +File: python.info, Node: compileall, Next: concurrent futures, Prev: asyncio<3>, Up: Improved Modules<3> + +1.3.6.3 compileall +.................. + +Added new possibility to use hardlinks for duplicated ‘.pyc’ files: +`hardlink_dupes' parameter and –hardlink-dupes command line option. +(Contributed by Lumír ‘Frenzy’ Balhar in bpo-40495(1).) + +Added new options for path manipulation in resulting ‘.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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40495 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38112 + + +File: python.info, Node: concurrent futures, Next: curses<2>, Prev: compileall, Up: Improved Modules<3> + +1.3.6.4 concurrent.futures +.......................... + +Added a new `cancel_futures' parameter to *note +concurrent.futures.Executor.shutdown(): 52d. 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(1).) + +Removed daemon threads from *note ThreadPoolExecutor: 311. and *note +ProcessPoolExecutor: 52e. This improves compatibility with +subinterpreters and predictability in their shutdown processes. +(Contributed by Kyle Stanley in bpo-39812(2).) + +Workers in *note ProcessPoolExecutor: 52e. 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(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39349 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39812 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39207 + + +File: python.info, Node: curses<2>, Next: datetime<2>, Prev: concurrent futures, Up: Improved Modules<3> + +1.3.6.5 curses +.............. + +Added *note curses.get_escdelay(): 530, *note curses.set_escdelay(): +531, *note curses.get_tabsize(): 532, and *note curses.set_tabsize(): +533. functions. (Contributed by Anthony Sottile in bpo-38312(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38312 + + +File: python.info, Node: datetime<2>, Next: distutils<2>, Prev: curses<2>, Up: Improved Modules<3> + +1.3.6.6 datetime +................ + +The *note isocalendar(): 535. of *note datetime.date: 536. and *note +isocalendar(): 537. of *note datetime.datetime: 4be. methods now returns +a *note namedtuple(): 538. instead of a *note tuple: 539. (Contributed +by Dong-hee Na in bpo-24416(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24416 + + +File: python.info, Node: distutils<2>, Next: fcntl<2>, Prev: datetime<2>, Up: Improved Modules<3> + +1.3.6.7 distutils +................. + +The ‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40698 + + +File: python.info, Node: fcntl<2>, Next: ftplib, Prev: distutils<2>, Up: Improved Modules<3> + +1.3.6.8 fcntl +............. + +Added constants ‘F_OFD_GETLK’, ‘F_OFD_SETLK’ and ‘F_OFD_SETLKW’. +(Contributed by Dong-hee Na in bpo-38602(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38602 + + +File: python.info, Node: ftplib, Next: gc<2>, Prev: fcntl<2>, Up: Improved Modules<3> + +1.3.6.9 ftplib +.............. + +*note FTP: 53d. and *note FTP_TLS: 53e. now raise a *note ValueError: +1c8. if the given timeout for their constructor is zero to prevent the +creation of a non-blocking socket. (Contributed by Dong-hee Na in +bpo-39259(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + +File: python.info, Node: gc<2>, Next: hashlib<3>, Prev: ftplib, Up: Improved Modules<3> + +1.3.6.10 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(1).) + +Added a new function *note gc.is_finalized(): 540. to check if an object +has been finalized by the garbage collector. (Contributed by Pablo +Galindo in bpo-39322(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38379 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39322 + + +File: python.info, Node: hashlib<3>, Next: http, Prev: gc<2>, Up: Improved Modules<3> + +1.3.6.11 hashlib +................ + +The *note hashlib: 88. module can now use SHA3 hashes and SHAKE XOF from +OpenSSL when available. (Contributed by Christian Heimes in +bpo-37630(1).) + +Builtin hash modules can now be disabled with ‘./configure +--without-builtin-hashlib-hashes’ or selectively enabled with e.g. +‘./configure --with-builtin-hashlib-hashes=sha3,blake2’ to force use of +OpenSSL based implementation. (Contributed by Christian Heimes in +bpo-40479(2)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37630 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40479 + + +File: python.info, Node: http, Next: IDLE and idlelib<3>, Prev: hashlib<3>, Up: Improved Modules<3> + +1.3.6.12 http +............. + +HTTP status codes ‘103 EARLY_HINTS’, ‘418 IM_A_TEAPOT’ and ‘425 +TOO_EARLY’ are added to *note http.HTTPStatus: 543. (Contributed by +Dong-hee Na in bpo-39509(1) and Ross Rhodes in bpo-39507(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39509 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39507 + + +File: python.info, Node: IDLE and idlelib<3>, Next: imaplib, Prev: http, Up: Improved Modules<3> + +1.3.6.13 IDLE and idlelib +......................... + +Added option to toggle cursor blink off. (Contributed by Zackery Spytz +in bpo-4603(1).) + +Escape key now closes IDLE completion windows. (Contributed by Johnny +Najera in bpo-38944(2).) + +Added keywords to module name completion list. (Contributed by Terry J. +Reedy in bpo-37765(3).) + +New in 3.9 maintenance releases + +Make IDLE invoke *note sys.excepthook(): 3fe. (when started without +‘-n’). User hooks were previously ignored. (Contributed by Ken Hilton +in bpo-43008(4).) + +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(5).) 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(6).) + +Apply syntax highlighting to ‘.pyi’ files. (Contributed by Alex Waygood +and Terry Jan Reedy in bpo-45447(7).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4603 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38944 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37765 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43008 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40468 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33962 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45447 + + +File: python.info, Node: imaplib, Next: importlib, Prev: IDLE and idlelib<3>, Up: Improved Modules<3> + +1.3.6.14 imaplib +................ + +*note IMAP4: 546. and *note IMAP4_SSL: 547. now have an optional +`timeout' parameter for their constructors. Also, the *note open(): +548. method now has an optional `timeout' parameter with this change. +The overridden methods of *note IMAP4_SSL: 547. and *note IMAP4_stream: +549. were applied to this change. (Contributed by Dong-hee Na in +bpo-38615(1).) + +*note imaplib.IMAP4.unselect(): 54a. is added. *note +imaplib.IMAP4.unselect(): 54a. frees server’s resources associated with +the selected mailbox and returns the server to the authenticated state. +This command performs the same actions as *note imaplib.IMAP4.close(): +54b, except that no messages are permanently removed from the currently +selected mailbox. (Contributed by Dong-hee Na in bpo-40375(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38615 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40375 + + +File: python.info, Node: importlib, Next: inspect<3>, Prev: imaplib, Up: Improved Modules<3> + +1.3.6.15 importlib +.................. + +To improve consistency with import statements, *note +importlib.util.resolve_name(): 54d. now raises *note ImportError: 511. +instead of *note ValueError: 1c8. for invalid relative import attempts. +(Contributed by Ngalim Siregar in bpo-37444(1).) + +Import loaders which publish immutable module objects can now publish +immutable packages in addition to individual modules. (Contributed by +Dino Viehland in bpo-39336(2).) + +Added *note importlib.resources.files(): 54e. function with support for +subdirectories in package data, matching backport in +‘importlib_resources’ version 1.5. (Contributed by Jason R. Coombs in +bpo-39791(3).) + +Refreshed ‘importlib.metadata’ from ‘importlib_metadata’ version 1.6.1. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37444 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39336 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39791 + + +File: python.info, Node: inspect<3>, Next: ipaddress, Prev: importlib, Up: Improved Modules<3> + +1.3.6.16 inspect +................ + +*note inspect.BoundArguments.arguments: 550. is changed from +‘OrderedDict’ to regular dict. (Contributed by Inada Naoki in +bpo-36350(1) and bpo-39775(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36350 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39775 + + +File: python.info, Node: ipaddress, Next: math<2>, Prev: inspect<3>, Up: Improved Modules<3> + +1.3.6.17 ipaddress +.................. + +*note ipaddress: a0. now supports IPv6 Scoped Addresses (IPv6 address +with suffix ‘%’). + +Scoped IPv6 addresses can be parsed using *note ipaddress.IPv6Address: +552. If present, scope zone ID is available through the *note scope_id: +553. attribute. (Contributed by Oleksandr Pavliuk in bpo-34788(1).) + +Starting with Python 3.9.5 the *note ipaddress: a0. module no longer +accepts any leading zeros in IPv4 address strings. (Contributed by +Christian Heimes in bpo-36384(2)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34788 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36384 + + +File: python.info, Node: math<2>, Next: multiprocessing, Prev: ipaddress, Up: Improved Modules<3> + +1.3.6.18 math +............. + +Expanded the *note math.gcd(): 555. function to handle multiple +arguments. Formerly, it only supported two arguments. (Contributed by +Serhiy Storchaka in bpo-39648(1).) + +Added *note math.lcm(): 556.: return the least common multiple of +specified arguments. (Contributed by Mark Dickinson, Ananthakrishnan +and Serhiy Storchaka in bpo-39479(2) and bpo-39648(3).) + +Added *note math.nextafter(): 557.: return the next floating-point value +after `x' towards `y'. (Contributed by Victor Stinner in bpo-39288(4).) + +Added *note math.ulp(): 558.: return the value of the least significant +bit of a float. (Contributed by Victor Stinner in bpo-39310(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39648 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39479 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39648 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39288 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39310 + + +File: python.info, Node: multiprocessing, Next: nntplib, Prev: math<2>, Up: Improved Modules<3> + +1.3.6.19 multiprocessing +........................ + +The *note multiprocessing.SimpleQueue: 55a. class has a new *note +close(): 55b. method to explicitly close the queue. (Contributed by +Victor Stinner in bpo-30966(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30966 + + +File: python.info, Node: nntplib, Next: os<3>, Prev: multiprocessing, Up: Improved Modules<3> + +1.3.6.20 nntplib +................ + +*note NNTP: 55d. and *note NNTP_SSL: 55e. now raise a *note ValueError: +1c8. if the given timeout for their constructor is zero to prevent the +creation of a non-blocking socket. (Contributed by Dong-hee Na in +bpo-39259(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + +File: python.info, Node: os<3>, Next: pathlib<3>, Prev: nntplib, Up: Improved Modules<3> + +1.3.6.21 os +........... + +Added *note CLD_KILLED: 560. and *note CLD_STOPPED: 561. for ‘si_code’. +(Contributed by Dong-hee Na in bpo-38493(1).) + +Exposed the Linux-specific *note os.pidfd_open(): 500. (bpo-38692(2)) +and *note os.P_PIDFD: 562. (bpo-38713(3)) for process management with +file descriptors. + +The *note os.unsetenv(): 563. function is now also available on Windows. +(Contributed by Victor Stinner in bpo-39413(4).) + +The *note os.putenv(): 564. and *note os.unsetenv(): 563. functions are +now always available. (Contributed by Victor Stinner in bpo-39395(5).) + +Added *note os.waitstatus_to_exitcode(): 565. function: convert a wait +status to an exit code. (Contributed by Victor Stinner in +bpo-40094(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38493 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38692 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38713 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39413 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39395 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40094 + + +File: python.info, Node: pathlib<3>, Next: pdb, Prev: os<3>, Up: Improved Modules<3> + +1.3.6.22 pathlib +................ + +Added *note pathlib.Path.readlink(): 567. which acts similarly to *note +os.readlink(): 568. (Contributed by Girts Folkmanis in bpo-30618(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30618 + + +File: python.info, Node: pdb, Next: poplib, Prev: pathlib<3>, Up: Improved Modules<3> + +1.3.6.23 pdb +............ + +On Windows now *note Pdb: 56a. supports ‘~/.pdbrc’. (Contributed by Tim +Hopper and Dan Lidral-Porter in bpo-20523(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20523 + + +File: python.info, Node: poplib, Next: pprint<2>, Prev: pdb, Up: Improved Modules<3> + +1.3.6.24 poplib +............... + +*note POP3: 56c. and *note POP3_SSL: 56d. now raise a *note ValueError: +1c8. if the given timeout for their constructor is zero to prevent the +creation of a non-blocking socket. (Contributed by Dong-hee Na in +bpo-39259(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + +File: python.info, Node: pprint<2>, Next: pydoc, Prev: poplib, Up: Improved Modules<3> + +1.3.6.25 pprint +............... + +*note pprint: cf. can now pretty-print *note types.SimpleNamespace: 56f. +(Contributed by Carl Bordum Hansen in bpo-37376(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37376 + + +File: python.info, Node: pydoc, Next: random, Prev: pprint<2>, Up: Improved Modules<3> + +1.3.6.26 pydoc +.............. + +The documentation string is now shown not only for class, function, +method etc, but for any object that has its own ‘__doc__’ attribute. +(Contributed by Serhiy Storchaka in bpo-40257(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40257 + + +File: python.info, Node: random, Next: signal, Prev: pydoc, Up: Improved Modules<3> + +1.3.6.27 random +............... + +Added a new ‘random.Random.randbytes’ method: generate random bytes. +(Contributed by Victor Stinner in bpo-40286(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40286 + + +File: python.info, Node: signal, Next: smtplib, Prev: random, Up: Improved Modules<3> + +1.3.6.28 signal +............... + +Exposed the Linux-specific *note signal.pidfd_send_signal(): 573. for +sending to signals to a process using a file descriptor instead of a +pid. (bpo-38712(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38712 + + +File: python.info, Node: smtplib, Next: socket<3>, Prev: signal, Up: Improved Modules<3> + +1.3.6.29 smtplib +................ + +*note SMTP: 575. and *note SMTP_SSL: 576. now raise a *note ValueError: +1c8. if the given timeout for their constructor is zero to prevent the +creation of a non-blocking socket. (Contributed by Dong-hee Na in +bpo-39259(1).) + +*note LMTP: 577. constructor now has an optional `timeout' parameter. +(Contributed by Dong-hee Na in bpo-39329(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39329 + + +File: python.info, Node: socket<3>, Next: time<2>, Prev: smtplib, Up: Improved Modules<3> + +1.3.6.30 socket +............... + +The *note socket: ec. module now exports the *note CAN_RAW_JOIN_FILTERS: +579. constant on Linux 4.1 and greater. (Contributed by Stefan +Tatschner and Zackery Spytz in bpo-25780(1).) + +The socket module now supports the *note CAN_J1939: 57a. protocol on +platforms that support it. (Contributed by Karl Ding in bpo-40291(2).) + +The socket module now has the *note socket.send_fds(): 57b. and *note +socket.recv_fds(): 57c. functions. (Contributed by Joannah Nanjekye, +Shinya Okano and Victor Stinner in bpo-28724(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25780 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40291 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28724 + + +File: python.info, Node: time<2>, Next: sys<3>, Prev: socket<3>, Up: Improved Modules<3> + +1.3.6.31 time +............. + +On AIX, *note thread_time(): 57e. is now implemented with +‘thread_cputime()’ which has nanosecond resolution, rather than +‘clock_gettime(CLOCK_THREAD_CPUTIME_ID)’ which has a resolution of 10 +milliseconds. (Contributed by Batuhan Taskaya in bpo-40192(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40192 + + +File: python.info, Node: sys<3>, Next: tracemalloc, Prev: time<2>, Up: Improved Modules<3> + +1.3.6.32 sys +............ + +Added a new *note sys.platlibdir: 580. 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 ‘"lib"’ on most platforms. On Fedora and SuSE, it is equal to +‘"lib64"’ on 64-bit platforms. (Contributed by Jan Matějek, Matěj Cepl, +Charalampos Stratakis and Victor Stinner in bpo-1294959(1).) + +Previously, *note sys.stderr: 581. was block-buffered when +non-interactive. Now ‘stderr’ defaults to always being line-buffered. +(Contributed by Jendrik Seipp in bpo-13601(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1294959 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13601 + + +File: python.info, Node: tracemalloc, Next: typing<3>, Prev: sys<3>, Up: Improved Modules<3> + +1.3.6.33 tracemalloc +.................... + +Added *note tracemalloc.reset_peak(): 583. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40630 + + +File: python.info, Node: typing<3>, Next: unicodedata<2>, Prev: tracemalloc, Up: Improved Modules<3> + +1.3.6.34 typing +............... + +PEP 593(1) introduced an *note typing.Annotated: 585. type to decorate +existing types with context-specific metadata and new ‘include_extras’ +parameter to *note typing.get_type_hints(): 277. to access the metadata +at runtime. (Contributed by Till Varoquaux and Konstantin Kashin.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0593/ + + +File: python.info, Node: unicodedata<2>, Next: venv<2>, Prev: typing<3>, Up: Improved Modules<3> + +1.3.6.35 unicodedata +.................... + +The Unicode database has been updated to version 13.0.0. +(bpo-39926(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39926 + + +File: python.info, Node: venv<2>, Next: xml<2>, Prev: unicodedata<2>, Up: Improved Modules<3> + +1.3.6.36 venv +............. + +The activation scripts provided by *note venv: 12f. now all specify +their prompt customization consistently by always using the value +specified by ‘__VENV_PROMPT__’. Previously some scripts unconditionally +used ‘__VENV_PROMPT__’, others only if it happened to be set (which was +the default case), and one used ‘__VENV_NAME__’ instead. (Contributed +by Brett Cannon in bpo-37663(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37663 + + +File: python.info, Node: xml<2>, Prev: venv<2>, Up: Improved Modules<3> + +1.3.6.37 xml +............ + +White space characters within attributes are now preserved when +serializing *note xml.etree.ElementTree: 142. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39011 + + +File: python.info, Node: Optimizations<3>, Next: Deprecated<5>, Prev: Improved Modules<3>, Up: What’s New In Python 3 9 + +1.3.7 Optimizations +------------------- + + * Optimized the idiom for assignment a temporary variable in + comprehensions. Now ‘for y in [expr]’ in comprehensions is as fast + as a simple assignment ‘y = expr’. For example: + + sums = [s for s in [0] for x in data for s in [s + x]] + + Unlike the ‘:=’ operator this idiom does not leak a variable to the + outer scope. + + (Contributed by Serhiy Storchaka in bpo-32856(1).) + + * 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(2).) + + * Optimized the *note subprocess: f6. module on FreeBSD using + ‘closefrom()’. (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, + Kubilay Kocak and Victor Stinner in bpo-38061(3).) + + * *note PyLong_FromDouble(): 58a. is now up to 1.87x faster for + values that fit into long. (Contributed by Sergey Fedoseev in + bpo-37986(4).) + + * A number of Python builtins (*note range: 58b, *note tuple: 539, + *note set: 1a6, *note frozenset: 1a7, *note list: 1e9, *note dict: + 16e.) are now sped up by using PEP 590(5) vectorcall protocol. + (Contributed by Dong-hee Na, Mark Shannon, Jeroen Demeyer and Petr + Viktorin in bpo-37207(6).) + + * Optimized ‘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(7).) + + * Python’s small object allocator (‘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(8).) + + * *note floor division: 58c. of float operation now has a better + performance. Also the message of *note ZeroDivisionError: 58d. for + this operation is updated. (Contributed by Dong-hee Na in + bpo-39434(9).) + + * Decoding short ASCII strings with UTF-8 and ascii codecs is now + about 15% faster. (Contributed by Inada Naoki in bpo-37348(10).) + +Here’s a summary of performance improvements from Python 3.4 through +Python 3.9: + + 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 + +These results were generated from the variable access benchmark script +at: ‘Tools/scripts/var_access_benchmark.py’. The benchmark script +displays timings in nanoseconds. The benchmarks were measured on an +Intel® Core™ i7-4960HQ processor(11) running the macOS 64-bit builds +found at python.org(12). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32856 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40010 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38061 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37986 + + (5) https://peps.python.org/pep-0590/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=8425 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37257 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39434 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37348 + + (11) +https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html + + (12) https://www.python.org/downloads/mac-osx/ + + +File: python.info, Node: Deprecated<5>, Next: Removed<5>, Prev: Optimizations<3>, Up: What’s New In Python 3 9 + +1.3.8 Deprecated +---------------- + + * The distutils ‘bdist_msi’ command is now deprecated, use + ‘bdist_wheel’ (wheel packages) instead. (Contributed by Hugo van + Kemenade in bpo-39586(1).) + + * Currently *note math.factorial(): 58f. accepts *note float: 3ca. + instances with non-negative integer values (like ‘5.0’). It raises + a *note ValueError: 1c8. for non-integral and negative floats. It + is now deprecated. In future Python versions it will raise a *note + TypeError: 19c. for all floats. (Contributed by Serhiy Storchaka + in bpo-37315(2).) + + * The ‘parser’ and ‘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 *note ast: 7. module. + + * The Public C API functions ‘PyParser_SimpleParseStringFlags()’, + ‘PyParser_SimpleParseStringFlagsFilename()’, + ‘PyParser_SimpleParseFileFlags()’ and ‘PyNode_Compile()’ are + deprecated and will be removed in Python 3.10 together with the old + parser. + + * Using *note NotImplemented: 3c1. in a boolean context has been + deprecated, as it is almost exclusively the result of incorrect + rich comparator implementations. It will be made a *note + TypeError: 19c. in a future version of Python. (Contributed by + Josh Rosenberg in bpo-35712(3).) + + * The *note random: d9. 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 *note None: 243, *note int: + 1c7, *note float: 3ca, *note str: 1b3, *note bytes: 1b4, and *note + bytearray: 1a5. + + * Opening the *note GzipFile: 590. 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(4).) + + * Deprecated the ‘split()’ method of ‘_tkinter.TkappType’ in favour + of the ‘splitlist()’ method which has more consistent and + predicable behavior. (Contributed by Serhiy Storchaka in + bpo-38371(5).) + + * The explicit passing of coroutine objects to *note asyncio.wait(): + 591. has been deprecated and will be removed in version 3.11. + (Contributed by Yury Selivanov and Kyle Stanley in bpo-34790(6).) + + * binhex4 and hexbin4 standards are now deprecated. The ‘binhex’ + module and the following *note binascii: f. functions are now + deprecated: + + * ‘b2a_hqx()’, ‘a2b_hqx()’ + + * ‘rlecode_hqx()’, ‘rledecode_hqx()’ + + (Contributed by Victor Stinner in bpo-39353(7).) + + * *note ast: 7. classes ‘slice’, ‘Index’ and ‘ExtSlice’ are + considered deprecated and will be removed in future Python + versions. ‘value’ itself should be used instead of ‘Index(value)’. + ‘Tuple(slices, Load())’ should be used instead of + ‘ExtSlice(slices)’. (Contributed by Serhiy Storchaka in + bpo-34822(8).) + + * *note ast: 7. classes ‘Suite’, ‘Param’, ‘AugLoad’ and ‘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(9) and bpo-39969(10) and Serhiy Storchaka in + bpo-39988(11).) + + * The *note PyEval_InitThreads(): 592. and *note + PyEval_ThreadsInitialized(): 593. functions are now deprecated and + will be removed in Python 3.11. Calling *note + PyEval_InitThreads(): 592. now does nothing. The *note GIL: 4df. + is initialized by *note Py_Initialize(): 4e7. since Python 3.7. + (Contributed by Victor Stinner in bpo-39877(12).) + + * Passing ‘None’ as the first argument to the *note shlex.split(): + 594. function has been deprecated. (Contributed by Zackery Spytz + in bpo-33262(13).) + + * ‘smtpd.MailmanProxy()’ is now deprecated as it is unusable without + an external module, ‘mailman’. (Contributed by Samuel Colvin in + bpo-35800(14).) + + * The *note lib2to3: a5. module now emits a *note + PendingDeprecationWarning: 503. Python 3.9 switched to a PEG + parser (see PEP 617(15)), and Python 3.10 may include new language + syntax that is not parsable by lib2to3’s LL(1) parser. The + ‘lib2to3’ module may be removed from the standard library in a + future Python version. Consider third-party alternatives such as + LibCST(16) or parso(17). (Contributed by Carl Meyer in + bpo-40360(18).) + + * The `random' parameter of *note random.shuffle(): 316. has been + deprecated. (Contributed by Raymond Hettinger in bpo-40465(19)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39586 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37315 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35712 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28286 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38371 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=34790 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39353 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=34822 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39639 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39969 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=39988 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=39877 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=33262 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=35800 + + (15) https://peps.python.org/pep-0617/ + + (16) https://libcst.readthedocs.io/ + + (17) https://parso.readthedocs.io/ + + (18) https://bugs.python.org/issue?@action=redirect&bpo=40360 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=40465 + + +File: python.info, Node: Removed<5>, Next: Porting to Python 3 9, Prev: Deprecated<5>, Up: What’s New In Python 3 9 + +1.3.9 Removed +------------- + + * The erroneous version at ‘unittest.mock.__version__’ has been + removed. + + * *note nntplib.NNTP: 55d.: ‘xpath()’ and ‘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 ‘xgtitle()’, please use *note + nntplib.NNTP.descriptions(): 596. or *note + nntplib.NNTP.description(): 597. instead. (Contributed by Dong-hee + Na in bpo-39366(1).) + + * *note array.array: 3d2.: ‘tostring()’ and ‘fromstring()’ methods + have been removed. They were aliases to ‘tobytes()’ and + ‘frombytes()’, deprecated since Python 3.2. (Contributed by Victor + Stinner in bpo-38916(2).) + + * The undocumented ‘sys.callstats()’ function has been removed. + Since Python 3.7, it was deprecated and always returned *note None: + 243. It required a special build option ‘CALL_PROFILE’ which was + already removed in Python 3.7. (Contributed by Victor Stinner in + bpo-37414(3).) + + * The ‘sys.getcheckinterval()’ and ‘sys.setcheckinterval()’ functions + have been removed. They were deprecated since Python 3.2. Use + *note sys.getswitchinterval(): 598. and *note + sys.setswitchinterval(): 599. instead. (Contributed by Victor + Stinner in bpo-37392(4).) + + * The C function ‘PyImport_Cleanup()’ has been removed. It was + documented as: “Empty the module table. For internal use only.” + (Contributed by Victor Stinner in bpo-36710(5).) + + * ‘_dummy_thread’ and ‘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(6).) + + * ‘aifc.openfp()’ alias to ‘aifc.open()’, ‘sunau.openfp()’ alias to + ‘sunau.open()’, and ‘wave.openfp()’ alias to *note wave.open(): + 59a. have been removed. They were deprecated since Python 3.7. + (Contributed by Victor Stinner in bpo-37320(7).) + + * The ‘isAlive()’ method of *note threading.Thread: 59b. has been + removed. It was deprecated since Python 3.8. Use *note + is_alive(): 59c. instead. (Contributed by Dong-hee Na in + bpo-37804(8).) + + * Methods ‘getchildren()’ and ‘getiterator()’ of classes *note + ElementTree: 59d. and *note Element: 59e. in the *note ElementTree: + 142. module have been removed. They were deprecated in Python 3.2. + Use ‘iter(x)’ or ‘list(x)’ instead of ‘x.getchildren()’ and + ‘x.iter()’ or ‘list(x.iter())’ instead of ‘x.getiterator()’. + (Contributed by Serhiy Storchaka in bpo-36543(9).) + + * The old *note plistlib: cc. API has been removed, it was deprecated + since Python 3.4. Use the *note load(): 59f, *note loads(): 5a0, + *note dump(): 5a1, and *note dumps(): 5a2. functions. + Additionally, the `use_builtin_types' parameter was removed, + standard *note bytes: 1b4. objects are always used instead. + (Contributed by Jon Janzen in bpo-36409(10).) + + * The C function ‘PyGen_NeedsFinalizing’ has been removed. It was + not documented, tested, or used anywhere within CPython after the + implementation of PEP 442(11). Patch by Joannah Nanjekye. + (Contributed by Joannah Nanjekye in bpo-15088(12)) + + * ‘base64.encodestring()’ and ‘base64.decodestring()’, aliases + deprecated since Python 3.1, have been removed: use *note + base64.encodebytes(): 5a3. and *note base64.decodebytes(): 5a4. + instead. (Contributed by Victor Stinner in bpo-39351(13).) + + * ‘fractions.gcd()’ function has been removed, it was deprecated + since Python 3.5 (bpo-22486(14)): use *note math.gcd(): 555. + instead. (Contributed by Victor Stinner in bpo-39350(15).) + + * The `buffering' parameter of *note bz2.BZ2File: 5a5. has been + removed. Since Python 3.0, it was ignored and using it emitted a + *note DeprecationWarning: 2d4. Pass an open file object to control + how the file is opened. (Contributed by Victor Stinner in + bpo-39357(16).) + + * The `encoding' parameter of *note json.loads(): 5a6. has been + removed. As of Python 3.1, it was deprecated and ignored; using it + has emitted a *note DeprecationWarning: 2d4. since Python 3.8. + (Contributed by Inada Naoki in bpo-39377(17)) + + * ‘with (await asyncio.lock):’ and ‘with (yield from asyncio.lock):’ + statements are not longer supported, use ‘async with lock’ instead. + The same is correct for ‘asyncio.Condition’ and + ‘asyncio.Semaphore’. (Contributed by Andrew Svetlov in + bpo-34793(18).) + + * The ‘sys.getcounts()’ function, the ‘-X showalloccount’ command + line option and the ‘show_alloc_count’ field of the C structure + *note PyConfig: 370. have been removed. They required a special + Python build by defining ‘COUNT_ALLOCS’ macro. (Contributed by + Victor Stinner in bpo-39489(19).) + + * The ‘_field_types’ attribute of the *note typing.NamedTuple: 271. + class has been removed. It was deprecated since Python 3.8. Use + the ‘__annotations__’ attribute instead. (Contributed by Serhiy + Storchaka in bpo-40182(20).) + + * The ‘symtable.SymbolTable.has_exec()’ method has been removed. It + was deprecated since 2006, and only returning ‘False’ when it’s + called. (Contributed by Batuhan Taskaya in bpo-40208(21)) + + * The ‘asyncio.Task.current_task()’ and ‘asyncio.Task.all_tasks()’ + have been removed. They were deprecated since Python 3.7 and you + can use *note asyncio.current_task(): 5a7. and *note + asyncio.all_tasks(): 5a8. instead. (Contributed by Rémi Lapeyre in + bpo-40967(22)) + + * The ‘unescape()’ method in the *note html.parser.HTMLParser: 499. + class has been removed (it was deprecated since Python 3.4). *note + html.unescape(): 5a9. should be used for converting character + references to the corresponding unicode characters. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39366 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38916 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37414 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37392 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36710 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37312 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37320 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37804 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36543 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36409 + + (11) https://peps.python.org/pep-0442/ + + (12) https://bugs.python.org/issue?@action=redirect&bpo=15088 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39351 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=22486 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=39350 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=39357 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=39377 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=34793 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=39489 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=40182 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=40208 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=40967 + + +File: python.info, Node: Porting to Python 3 9, Next: Build Changes<3>, Prev: Removed<5>, Up: What’s New In Python 3 9 + +1.3.10 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<2>. +* Changes in the C API: Changes in the C API<2>. +* CPython bytecode changes: CPython bytecode changes<3>. + + +File: python.info, Node: Changes in the Python API<2>, Next: Changes in the C API<2>, Up: Porting to Python 3 9 + +1.3.10.1 Changes in the Python API +.................................. + + * *note __import__(): 510. and *note importlib.util.resolve_name(): + 54d. now raise *note ImportError: 511. where it previously raised + *note ValueError: 1c8. Callers catching the specific exception + type and supporting both Python 3.9 and earlier versions will need + to catch both using ‘except (ImportError, ValueError):’. + + * The *note venv: 12f. activation scripts no longer special-case when + ‘__VENV_PROMPT__’ is set to ‘""’. + + * The *note select.epoll.unregister(): 5ac. method no longer ignores + the *note EBADF: 5ad. error. (Contributed by Victor Stinner in + bpo-39239(1).) + + * The `compresslevel' parameter of *note bz2.BZ2File: 5a5. became + keyword-only, since the `buffering' parameter has been removed. + (Contributed by Victor Stinner in bpo-39357(2).) + + * Simplified AST for subscription. Simple indices will be + represented by their value, extended slices will be represented as + tuples. ‘Index(value)’ will return a ‘value’ itself, + ‘ExtSlice(slices)’ will return ‘Tuple(slices, Load())’. + (Contributed by Serhiy Storchaka in bpo-34822(3).) + + * The *note importlib: 97. module now ignores the *note PYTHONCASEOK: + 5ae. environment variable when the *note -E: 5af. or *note -I: 5b0. + command line options are being used. + + * The `encoding' parameter has been added to the classes *note + ftplib.FTP: 53d. and *note ftplib.FTP_TLS: 53e. as a keyword-only + parameter, and the default encoding is changed from Latin-1 to + UTF-8 to follow RFC 2640(4). + + * *note asyncio.loop.shutdown_default_executor(): 526. has been added + to *note AbstractEventLoop: 5b1, meaning alternative event loops + that inherit from it should have this method defined. (Contributed + by Kyle Stanley in bpo-34037(5).) + + * The constant values of future flags in the *note __future__: 0. + module is updated in order to prevent collision with compiler + flags. Previously ‘PyCF_ALLOW_TOP_LEVEL_AWAIT’ was clashing with + ‘CO_FUTURE_DIVISION’. (Contributed by Batuhan Taskaya in + bpo-39562(6)) + + * ‘array('u')’ now uses ‘wchar_t’ as C type instead of ‘Py_UNICODE’. + This change doesn’t affect to its behavior because ‘Py_UNICODE’ is + alias of ‘wchar_t’ since Python 3.3. (Contributed by Inada Naoki + in bpo-34538(7).) + + * The *note logging.getLogger(): 5b2. 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'’. (Contributed by Vinay Sajip + in bpo-37742(8).) + + * Division handling of *note PurePath: 306. now returns + ‘NotImplemented’ instead of raising a *note TypeError: 19c. when + passed something other than an instance of ‘str’ or *note PurePath: + 306. This allows creating compatible classes that don’t inherit + from those mentioned types. (Contributed by Roger Aiudi in + bpo-34775(9)). + + * Starting with Python 3.9.5 the *note ipaddress: a0. 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 *note + socket.inet_aton(): 5b3. treats leading zeros as octal notatation. + glibc implementation of modern *note inet_pton(): 5b4. does not + accept any leading zeros. (Contributed by Christian Heimes in + bpo-36384(10)). + + * *note codecs.lookup(): 5b5. now normalizes the encoding name the + same way as ‘encodings.normalize_encoding()’, except that *note + codecs.lookup(): 5b5. also converts the name to lower case. For + example, ‘"latex+latin1"’ encoding name is now normalized to + ‘"latex_latin1"’. (Contributed by Jordon Xu in bpo-37751(11).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39239 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39357 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=34822 + + (4) https://datatracker.ietf.org/doc/html/rfc2640.html + + (5) https://bugs.python.org/issue?@action=redirect&bpo=34037 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39562 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=34538 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37742 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=34775 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36384 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37751 + + +File: python.info, Node: Changes in the C API<2>, Next: CPython bytecode changes<3>, Prev: Changes in the Python API<2>, Up: Porting to Python 3 9 + +1.3.10.2 Changes in the C API +............................. + + * Instances of *note heap-allocated types: 5b7. (such as those + created with *note PyType_FromSpec(): 5b8. 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 *note tp_traverse: 352. function, ensure that all custom + ‘tp_traverse’ functions of heap-allocated types visit the object’s + type. + + Example: + + int + foo_traverse(foo_struct *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 + } + + If your traverse function delegates to ‘tp_traverse’ of its base + class (or another type), ensure that ‘Py_TYPE(self)’ is visited + only once. Note that only *note heap type: 5b7. are expected to + visit the type in ‘tp_traverse’. + + For example, if your ‘tp_traverse’ function includes: + + base->tp_traverse(self, visit, arg) + + then add: + + #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 + + (See bpo-35810(1) and bpo-40217(2) for more information.) + + * The functions ‘PyEval_CallObject’, ‘PyEval_CallFunction’, + ‘PyEval_CallMethod’ and ‘PyEval_CallObjectWithKeywords’ are + deprecated. Use *note PyObject_Call(): 5b9. and its variants + instead. (See more details in bpo-29548(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35810 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40217 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29548 + + +File: python.info, Node: CPython bytecode changes<3>, Prev: Changes in the C API<2>, Up: Porting to Python 3 9 + +1.3.10.3 CPython bytecode changes +................................. + + * The *note LOAD_ASSERTION_ERROR: 5bb. opcode was added for handling + the *note assert: 5bc. statement. Previously, the assert statement + would not work correctly if the *note AssertionError: 26e. + exception was being shadowed. (Contributed by Zackery Spytz in + bpo-34880(1).) + + * The *note COMPARE_OP: 5bd. opcode was split into four distinct + instructions: + + * ‘COMPARE_OP’ for rich comparisons + + * ‘IS_OP’ for ‘is’ and ‘is not’ tests + + * ‘CONTAINS_OP’ for ‘in’ and ‘not in’ tests + + * ‘JUMP_IF_NOT_EXC_MATCH’ for checking exceptions in + ‘try-except’ statements. + + (Contributed by Mark Shannon in bpo-39156(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34880 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39156 + + +File: python.info, Node: Build Changes<3>, Next: C API Changes<3>, Prev: Porting to Python 3 9, Up: What’s New In Python 3 9 + +1.3.11 Build Changes +-------------------- + + * Added ‘--with-platlibdir’ option to the ‘configure’ script: name of + the platform-specific library directory, stored in the new *note + sys.platlibdir: 580. attribute. See *note sys.platlibdir: 580. + attribute for more information. (Contributed by Jan Matějek, Matěj + Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959(1).) + + * The ‘COUNT_ALLOCS’ special build macro has been removed. + (Contributed by Victor Stinner in bpo-39489(2).) + + * On non-Windows platforms, the ‘setenv()’ and ‘unsetenv()’ functions + are now required to build Python. (Contributed by Victor Stinner + in bpo-39395(3).) + + * On non-Windows platforms, creating ‘bdist_wininst’ installers is + now officially unsupported. (See bpo-10945(4) for more details.) + + * When building Python on macOS from source, ‘_tkinter’ now links + with non-system Tcl and Tk frameworks if they are installed in + ‘/Library/Frameworks’, as had been the case on older releases of + macOS. If a macOS SDK is explicitly configured, by using *note + –enable-universalsdk: 5bf. or ‘-isysroot’, only the SDK itself is + searched. The default behavior can still be overridden with + ‘--with-tcltk-includes’ and ‘--with-tcltk-libs’. (Contributed by + Ned Deily in bpo-34956(5).) + + * Python can now be built for Windows 10 ARM64. (Contributed by + Steve Dower in bpo-33125(6).) + + * Some individual tests are now skipped when ‘--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 ‘./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(7) and + bpo-37707(8) for more details.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1294959 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39489 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39395 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=10945 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=34956 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33125 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36044 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37707 + + +File: python.info, Node: C API Changes<3>, Next: Notable changes in Python 3 9 1, Prev: Build Changes<3>, Up: What’s New In Python 3 9 + +1.3.12 C API Changes +-------------------- + +* Menu: + +* New Features: New Features<6>. +* Porting to Python 3.9: Porting to Python 3 9<2>. +* Removed: Removed<6>. + + +File: python.info, Node: New Features<6>, Next: Porting to Python 3 9<2>, Up: C API Changes<3> + +1.3.12.1 New Features +..................... + + * PEP 573(1): Added *note PyType_FromModuleAndSpec(): 4c8. to + associate a module with a class; *note PyType_GetModule(): 5c2. and + *note PyType_GetModuleState(): 5c3. to retrieve the module and its + state; and *note PyCMethod: 336. and ‘METH_METHOD’ to allow a + method to access the class it was defined in. (Contributed by + Marcel Plch and Petr Viktorin in bpo-38787(2).) + + * Added *note PyFrame_GetCode(): 35e. function: get a frame code. + Added *note PyFrame_GetBack(): 35a. function: get the frame next + outer frame. (Contributed by Victor Stinner in bpo-40421(3).) + + * Added *note PyFrame_GetLineNumber(): 35f. to the limited C API. + (Contributed by Victor Stinner in bpo-40421(4).) + + * Added *note PyThreadState_GetInterpreter(): 5c4. and *note + PyInterpreterState_Get(): 5c5. functions to get the interpreter. + Added *note PyThreadState_GetFrame(): 361. function to get the + current frame of a Python thread state. Added *note + PyThreadState_GetID(): 5c6. function: get the unique identifier of + a Python thread state. (Contributed by Victor Stinner in + bpo-39947(5).) + + * Added a new public *note PyObject_CallNoArgs(): 5c7. 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(6).) + + * Changes in the limited C API (if ‘Py_LIMITED_API’ macro is + defined): + + * Provide *note Py_EnterRecursiveCall(): 5c8. and *note + Py_LeaveRecursiveCall(): 5c9. 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 ‘PyThreadState.recursion_depth’ field (the + structure is opaque in the limited C API). + + * ‘PyObject_INIT()’ and ‘PyObject_INIT_VAR()’ become regular + “opaque” function to hide implementation details. + + (Contributed by Victor Stinner in bpo-38644(7) and bpo-39542(8).) + + * The *note PyModule_AddType(): 5ca. function is added to help adding + a type to a module. (Contributed by Dong-hee Na in bpo-40024(9).) + + * Added the functions *note PyObject_GC_IsTracked(): 5cb. and *note + PyObject_GC_IsFinalized(): 5cc. 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(10).) + + * Added ‘_PyObject_FunctionStr()’ to get a user-friendly string + representation of a function-like object. (Patch by Jeroen Demeyer + in bpo-37645(11).) + + * Added *note PyObject_CallOneArg(): 5cd. for calling an object with + one positional argument (Patch by Jeroen Demeyer in bpo-37483(12).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0573/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38787 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40421 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40421 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37194 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38644 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39542 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40024 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=40241 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37645 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=37483 + + +File: python.info, Node: Porting to Python 3 9<2>, Next: Removed<6>, Prev: New Features<6>, Up: C API Changes<3> + +1.3.12.2 Porting to Python 3.9 +.............................. + + * ‘PyInterpreterState.eval_frame’ ( PEP 523(1)) now requires a new + mandatory `tstate' parameter (‘PyThreadState*’). (Contributed by + Victor Stinner in bpo-38500(2).) + + * Extension modules: *note m_traverse: 5cf, *note m_clear: 5d0. and + *note m_free: 5d1. functions of *note PyModuleDef: 5d2. 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 (*note Py_mod_exec: 5d3. + function). More precisely, these functions are not called if *note + m_size: 5d4. is greater than 0 and the module state (as returned by + *note PyModule_GetState(): 5d5.) is ‘NULL’. + + Extension modules without module state (‘m_size <= 0’) are not + affected. + + * If *note Py_AddPendingCall(): 5d6. 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(3).) + + * The Windows registry is no longer used to initialize *note + sys.path: 162. when the ‘-E’ option is used (if *note + PyConfig.use_environment: 5d7. is set to ‘0’). This is significant + when embedding Python on Windows. (Contributed by Zackery Spytz in + bpo-8901(4).) + + * The global variable *note PyStructSequence_UnnamedField: 5d8. is + now a constant and refers to a constant string. (Contributed by + Serhiy Storchaka in bpo-38650(5).) + + * The ‘PyGC_Head’ structure is now opaque. It is only defined in the + internal C API (‘pycore_gc.h’). (Contributed by Victor Stinner in + bpo-40241(6).) + + * The ‘Py_UNICODE_COPY’, ‘Py_UNICODE_FILL’, ‘PyUnicode_WSTR_LENGTH’, + *note PyUnicode_FromUnicode(): 379, *note PyUnicode_AsUnicode(): + 378, ‘_PyUnicode_AsUnicode’, and *note + PyUnicode_AsUnicodeAndSize(): 377. are marked as deprecated in C. + They have been deprecated by PEP 393(7) since Python 3.3. + (Contributed by Inada Naoki in bpo-36346(8).) + + * The *note Py_FatalError(): 5d9. function is replaced with a macro + which logs automatically the name of the current function, unless + the ‘Py_LIMITED_API’ macro is defined. (Contributed by Victor + Stinner in bpo-39882(9).) + + * The vectorcall protocol now requires that the caller passes only + strings as keyword names. (See bpo-37540(10) for more + information.) + + * Implementation details of a number of macros and functions are now + hidden: + + * *note PyObject_IS_GC(): 5da. macro was converted to a + function. + + * The ‘PyObject_NEW()’ macro becomes an alias to the *note + PyObject_New(): 5db. macro, and the ‘PyObject_NEW_VAR()’ macro + becomes an alias to the *note PyObject_NewVar(): 5dc. macro. + They no longer access directly the *note + PyTypeObject.tp_basicsize: 5dd. member. + + * ‘PyObject_GET_WEAKREFS_LISTPTR()’ macro was converted to a + function: the macro accessed directly the *note + PyTypeObject.tp_weaklistoffset: 5de. member. + + * *note PyObject_CheckBuffer(): 328. macro was converted to a + function: the macro accessed directly the *note + PyTypeObject.tp_as_buffer: 5df. member. + + * *note PyIndex_Check(): 5e0. is now always declared as an + opaque function to hide implementation details: removed the + ‘PyIndex_Check()’ macro. The macro accessed directly the + *note PyTypeObject.tp_as_number: 5e1. member. + + (See bpo-40170(11) for more details.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0523/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38500 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39984 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8901 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38650 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40241 + + (7) https://peps.python.org/pep-0393/ + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36346 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39882 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37540 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + +File: python.info, Node: Removed<6>, Prev: Porting to Python 3 9<2>, Up: C API Changes<3> + +1.3.12.3 Removed +................ + + * Excluded ‘PyFPE_START_PROTECT()’ and ‘PyFPE_END_PROTECT()’ macros + of ‘pyfpe.h’ from the limited C API. (Contributed by Victor Stinner + in bpo-38835(1).) + + * The ‘tp_print’ slot of *note PyTypeObject: 5e3. 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(2).) + + * Changes in the limited C API (if ‘Py_LIMITED_API’ macro is + defined): + + * Excluded the following functions from the limited C API: + + * ‘PyThreadState_DeleteCurrent()’ (Contributed by Joannah + Nanjekye in bpo-37878(3).) + + * ‘_Py_CheckRecursionLimit’ + + * ‘_Py_NewReference()’ + + * ‘_Py_ForgetReference()’ + + * ‘_PyTraceMalloc_NewReference()’ + + * ‘_Py_GetRefTotal()’ + + * The trashcan mechanism which never worked in the limited + C API. + + * ‘PyTrash_UNWIND_LEVEL’ + + * ‘Py_TRASHCAN_BEGIN_CONDITION’ + + * ‘Py_TRASHCAN_BEGIN’ + + * ‘Py_TRASHCAN_END’ + + * ‘Py_TRASHCAN_SAFE_BEGIN’ + + * ‘Py_TRASHCAN_SAFE_END’ + + * Moved following functions and definitions to the internal C + API: + + * ‘_PyDebug_PrintTotalRefs()’ + + * ‘_Py_PrintReferences()’ + + * ‘_Py_PrintReferenceAddresses()’ + + * ‘_Py_tracemalloc_config’ + + * ‘_Py_AddToAllObjects()’ (specific to ‘Py_TRACE_REFS’ + build) + + (Contributed by Victor Stinner in bpo-38644(4) and bpo-39542(5).) + + * Removed ‘_PyRuntime.getframe’ hook and removed + ‘_PyThreadState_GetFrame’ macro which was an alias to + ‘_PyRuntime.getframe’. They were only exposed by the internal C + API. Removed also ‘PyThreadFrameGetter’ type. (Contributed by + Victor Stinner in bpo-39946(6).) + + * Removed the following functions from the C API. Call *note + PyGC_Collect(): 5e4. explicitly to clear all free lists. + (Contributed by Inada Naoki and Victor Stinner in bpo-37340(7), + bpo-38896(8) and bpo-40428(9).) + + * ‘PyAsyncGen_ClearFreeLists()’ + + * ‘PyContext_ClearFreeList()’ + + * ‘PyDict_ClearFreeList()’ + + * ‘PyFloat_ClearFreeList()’ + + * ‘PyFrame_ClearFreeList()’ + + * ‘PyList_ClearFreeList()’ + + * ‘PyMethod_ClearFreeList()’ and ‘PyCFunction_ClearFreeList()’: + the free lists of bound method objects have been removed. + + * ‘PySet_ClearFreeList()’: the set free list has been removed in + Python 3.4. + + * ‘PyTuple_ClearFreeList()’ + + * ‘PyUnicode_ClearFreeList()’: the Unicode free list has been + removed in Python 3.3. + + * Removed ‘_PyUnicode_ClearStaticStrings()’ function. (Contributed + by Victor Stinner in bpo-39465(10).) + + * Removed ‘Py_UNICODE_MATCH’. It has been deprecated by PEP 393(11), + and broken since Python 3.3. The *note PyUnicode_Tailmatch(): 4f5. + function can be used instead. (Contributed by Inada Naoki in + bpo-36346(12).) + + * Cleaned header files of interfaces defined but with no + implementation. The public API symbols being removed are: + ‘_PyBytes_InsertThousandsGroupingLocale’, + ‘_PyBytes_InsertThousandsGrouping’, ‘_Py_InitializeFromArgs’, + ‘_Py_InitializeFromWideArgs’, ‘_PyFloat_Repr’, ‘_PyFloat_Digits’, + ‘_PyFloat_DigitsInit’, ‘PyFrame_ExtendStack’, + ‘_PyAIterWrapper_Type’, ‘PyNullImporter_Type’, ‘PyCmpWrapper_Type’, + ‘PySortWrapper_Type’, ‘PyNoArgsFunction’. (Contributed by Pablo + Galindo Salgado in bpo-39372(13).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38835 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36974 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37878 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38644 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39542 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39946 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37340 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38896 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40428 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39465 + + (11) https://peps.python.org/pep-0393/ + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36346 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39372 + + +File: python.info, Node: Notable changes in Python 3 9 1, Next: Notable changes in Python 3 9 2, Prev: C API Changes<3>, Up: What’s New In Python 3 9 + +1.3.13 Notable changes in Python 3.9.1 +-------------------------------------- + +* Menu: + +* typing: typing<4>. +* macOS 11.0 (Big Sur) and Apple Silicon Mac support: macOS 11 0 Big Sur and Apple Silicon Mac support. + + +File: python.info, Node: typing<4>, Next: macOS 11 0 Big Sur and Apple Silicon Mac support, Up: Notable changes in Python 3 9 1 + +1.3.13.1 typing +............... + +The behavior of *note typing.Literal: 44c. was changed to conform with +PEP 586(1) and to match the behavior of static type checkers specified +in the PEP. + + 1. ‘Literal’ now de-duplicates parameters. + + 2. Equality comparisons between ‘Literal’ objects are now order + independent. + + 3. ‘Literal’ comparisons now respect types. For example, ‘Literal[0] + == Literal[False]’ previously evaluated to ‘True’. It is now + ‘False’. To support this change, the internally used type cache + now supports differentiating types. + + 4. ‘Literal’ objects will now raise a *note TypeError: 19c. exception + during equality comparisons if any of their parameters are not + *note hashable: 1e8. Note that declaring ‘Literal’ with mutable + parameters will not throw an error: + + >>> from typing import Literal + >>> Literal[{0}] + >>> Literal[{0}] == Literal[{False}] + Traceback (most recent call last): + File "", line 1, in + TypeError: unhashable type: 'set' + +(Contributed by Yurii Karabas in bpo-42345(2).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0586/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42345 + + +File: python.info, Node: macOS 11 0 Big Sur and Apple Silicon Mac support, Prev: typing<4>, Up: Notable changes in Python 3 9 1 + +1.3.13.2 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 ‘ARM64’ +architecture). A new universal build variant, ‘universal2’, is now +available to natively support both ‘ARM64’ and ‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41100 + + +File: python.info, Node: Notable changes in Python 3 9 2, Prev: Notable changes in Python 3 9 1, Up: What’s New In Python 3 9 + +1.3.14 Notable changes in Python 3.9.2 +-------------------------------------- + +* Menu: + +* collections.abc: collections abc<2>. +* urllib.parse: urllib parse<2>. + + +File: python.info, Node: collections abc<2>, Next: urllib parse<2>, Up: Notable changes in Python 3 9 2 + +1.3.14.1 collections.abc +........................ + +*note collections.abc.Callable: 3dc. generic now flattens type +parameters, similar to what *note typing.Callable: 3b1. currently does. +This means that ‘collections.abc.Callable[[int, str], str]’ will have +‘__args__’ of ‘(int, str, str)’; previously this was ‘([int, str], +str)’. To allow this change, *note types.GenericAlias: 3dd. can now be +subclassed, and a subclass will be returned when subscripting the *note +collections.abc.Callable: 3dc. type. Code which accesses the arguments +via *note typing.get_args(): 4a1. or ‘__args__’ need to account for this +change. A *note DeprecationWarning: 2d4. may be emitted for invalid +forms of parameterizing *note collections.abc.Callable: 3dc. which may +have passed silently in Python 3.9.1. This *note DeprecationWarning: +2d4. will become a *note TypeError: 19c. in Python 3.10. (Contributed +by Ken Jin in bpo-42195(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42195 + + +File: python.info, Node: urllib parse<2>, Prev: collections abc<2>, Up: Notable changes in Python 3 9 2 + +1.3.14.2 urllib.parse +..................... + +Earlier Python versions allowed using both ‘;’ and ‘&’ as query +parameter separators in *note urllib.parse.parse_qs(): 452. and *note +urllib.parse.parse_qsl(): 453. Due to security concerns, and to conform +with newer W3C recommendations, this has been changed to allow only a +single separator key, with ‘&’ as the default. This change also affects +*note cgi.parse(): 454. and *note cgi.parse_multipart(): 455. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42967 + + +File: python.info, Node: What’s New In Python 3 8, Next: What’s New In Python 3 7, Prev: What’s New In Python 3 9, Up: What’s New in Python + +1.4 What’s New In Python 3.8 +============================ + + +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 +*note changelog: 158. + +* Menu: + +* Summary – Release highlights: Summary – Release highlights<4>. +* New Features: New Features<7>. +* Other Language Changes: Other Language Changes<4>. +* New Modules: New Modules<4>. +* Improved Modules: Improved Modules<4>. +* Optimizations: Optimizations<4>. +* Build and C API Changes:: +* Deprecated: Deprecated<6>. +* 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.8: Notable changes in Python 3 8 8. +* Notable changes in Python 3.8.12: Notable changes in Python 3 8 12. + + +File: python.info, Node: Summary – Release highlights<4>, Next: New Features<7>, Up: What’s New In Python 3 8 + +1.4.1 Summary – Release highlights +---------------------------------- + + +File: python.info, Node: New Features<7>, Next: Other Language Changes<4>, Prev: Summary – Release highlights<4>, Up: What’s New In Python 3 8 + +1.4.2 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:: + + +File: python.info, Node: Assignment expressions, Next: Positional-only parameters, Up: New Features<7> + +1.4.2.1 Assignment expressions +.............................. + +There is new syntax ‘:=’ 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(1). + +In this example, the assignment expression helps avoid calling *note +len(): 209. twice: + + if (n := len(a)) > 10: + print(f"List is too long ({n} elements, expected <= 10)") + +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: + + discount = 0.0 + if (mo := re.search(r'(\d+)% discount', advertisement)): + discount = float(mo.group(1)) / 100.0 + +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: + + # Loop over fixed length blocks + while (block := f.read(256)) != '': + process(block) + +Another motivating use case arises in list comprehensions where a value +computed in a filtering condition is also needed in the expression body: + + [clean_name.title() for name in names + if (clean_name := normalize('NFC', name)) in allowed_names] + +Try to limit use of the walrus operator to clean cases that reduce +complexity and improve readability. + +See PEP 572(2) for a full description. + +(Contributed by Emily Morehouse in bpo-35224(3).) + + ---------- Footnotes ---------- + + (1) +https://en.wikipedia.org/wiki/Walrus#/media/File:Pacific_Walrus_-_Bull_(8247646168).jpg + + (2) https://peps.python.org/pep-0572/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35224 + + +File: python.info, Node: Positional-only parameters, Next: Parallel filesystem cache for compiled bytecode files, Prev: Assignment expressions, Up: New Features<7> + +1.4.2.2 Positional-only parameters +.................................. + +There is a new function parameter syntax ‘/’ to indicate that some +function parameters must be specified positionally and cannot be used as +keyword arguments. This is the same notation shown by ‘help()’ for C +functions annotated with Larry Hastings’ Argument Clinic(1) 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: + + def f(a, b, /, c, d, *, e, f): + print(a, b, c, d, e, f) + +The following is a valid call: + + f(10, 20, 30, d=40, e=50, f=60) + +However, these are invalid calls: + + 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 + +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 *note divmod(): 5f1. function does not accept keyword +arguments: + + def divmod(a, b, /): + "Emulate the built in divmod() function" + return (a // b, a % b) + +Another use case is to preclude keyword arguments when the parameter +name is not helpful. For example, the builtin *note len(): 209. +function has the signature ‘len(obj, /)’. This precludes awkward calls +such as: + + len(obj='hello') # The "obj" keyword argument impairs readability + +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 *note statistics: f2. module, +the parameter name `dist' may be changed in the future. This was made +possible with the following function specification: + + def quantiles(dist, /, *, n=4, method='exclusive') + ... + +Since the parameters to the left of ‘/’ are not exposed as possible +keywords, the parameters names remain available for use in ‘**kwargs’: + + >>> 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} + +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 *note collections: 1c. module: + + class Counter(dict): + + def __init__(self, iterable=None, /, **kwds): + # Note "iterable" is a possible keyword argument + +See PEP 570(2) for a full description. + +(Contributed by Pablo Galindo in bpo-36540(3).) + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3/howto/clinic.html + + (2) https://peps.python.org/pep-0570/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36540 + + +File: python.info, Node: Parallel filesystem cache for compiled bytecode files, Next: Debug build uses the same ABI as release build, Prev: Positional-only parameters, Up: New Features<7> + +1.4.2.3 Parallel filesystem cache for compiled bytecode files +............................................................. + +The new *note PYTHONPYCACHEPREFIX: 5f3. setting (also available as *note +-X: 174. ‘pycache_prefix’) configures the implicit bytecode cache to use +a separate parallel filesystem tree, rather than the default +‘__pycache__’ subdirectories within each source directory. + +The location of the cache is reported in *note sys.pycache_prefix: 5f4. +(*note None: 243. indicates the default location in ‘__pycache__’ +subdirectories). + +(Contributed by Carl Meyer in bpo-33499(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33499 + + +File: python.info, Node: Debug build uses the same ABI as release build, Next: f-strings support = for self-documenting expressions and debugging, Prev: Parallel filesystem cache for compiled bytecode files, Up: New Features<7> + +1.4.2.4 Debug build uses the same ABI as release build +...................................................... + +Python now uses the same ABI whether it’s built in release or debug +mode. 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. + +Release builds and *note debug builds: 496. are now ABI compatible: +defining the ‘Py_DEBUG’ macro no longer implies the ‘Py_TRACE_REFS’ +macro, which introduces the only ABI incompatibility. The +‘Py_TRACE_REFS’ macro, which adds the ‘sys.getobjects()’ function and +the *note PYTHONDUMPREFS: 5f6. environment variable, can be set using +the new *note ./configure –with-trace-refs: 4d0. build option. +(Contributed by Victor Stinner in bpo-36465(1).) + +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(2).) + +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(3).) + +To embed Python into an application, a new ‘--embed’ option must be +passed to ‘python3-config --libs --embed’ to get ‘-lpython3.8’ (link the +application to libpython). To support both 3.8 and older, try +‘python3-config --libs --embed’ first and fallback to ‘python3-config +--libs’ (without ‘--embed’) if the previous command fails. + +Add a pkg-config ‘python-3.8-embed’ module to embed Python into an +application: ‘pkg-config python-3.8-embed --libs’ includes +‘-lpython3.8’. To support both 3.8 and older, try ‘pkg-config +python-X.Y-embed --libs’ first and fallback to ‘pkg-config python-X.Y +--libs’ (without ‘--embed’) if the previous command fails (replace ‘X.Y’ +with the Python version). + +On the other hand, ‘pkg-config python3.8 --libs’ no longer contains +‘-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(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36465 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21536 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36722 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36721 + + +File: python.info, Node: f-strings support = for self-documenting expressions and debugging, Next: PEP 578 Python Runtime Audit Hooks, Prev: Debug build uses the same ABI as release build, Up: New Features<7> + +1.4.2.5 f-strings support ‘=’ for self-documenting expressions and debugging +............................................................................ + +Added an ‘=’ specifier to *note f-string: 1f8.s. An f-string such as +‘f'{expr=}'’ will expand to the text of the expression, an equal sign, +then the representation of the evaluated expression. For example: + + >>> user = 'eric_idle' + >>> member_since = date(1975, 7, 31) + >>> f'{user=} {member_since=}' + "user='eric_idle' member_since=datetime.date(1975, 7, 31)" + +The usual *note f-string format specifiers: 5f9. allow more control over +how the result of the expression is displayed: + + >>> delta = date.today() - member_since + >>> f'{user=!s} {delta.days=:,d}' + 'user=eric_idle delta.days=16,075' + +The ‘=’ specifier will display the whole expression so that calculations +can be shown: + + >>> print(f'{theta=} {cos(radians(theta))=:.3f}') + theta=30 cos(radians(theta))=0.866 + +(Contributed by Eric V. Smith and Larry Hastings in bpo-36817(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36817 + + +File: python.info, Node: PEP 578 Python Runtime Audit Hooks, Next: PEP 587 Python Initialization Configuration, Prev: f-strings support = for self-documenting expressions and debugging, Up: New Features<7> + +1.4.2.6 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 PEP 578(1) for full details. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0578/ + + +File: python.info, Node: PEP 587 Python Initialization Configuration, Next: PEP 590 Vectorcall a fast calling protocol for CPython, Prev: PEP 578 Python Runtime Audit Hooks, Up: New Features<7> + +1.4.2.7 PEP 587: Python Initialization Configuration +.................................................... + +The PEP 587(1) adds a new C API to configure the Python Initialization +providing finer control on the whole configuration and better error +reporting. + +New structures: + + * *note PyConfig: 370. + + * *note PyPreConfig: 5fc. + + * *note PyStatus: 5fd. + + * *note PyWideStringList: 5fe. + +New functions: + + * ‘PyConfig_Clear()’ + + * ‘PyConfig_InitIsolatedConfig()’ + + * ‘PyConfig_InitPythonConfig()’ + + * ‘PyConfig_Read()’ + + * ‘PyConfig_SetArgv()’ + + * ‘PyConfig_SetBytesArgv()’ + + * ‘PyConfig_SetBytesString()’ + + * ‘PyConfig_SetString()’ + + * ‘PyPreConfig_InitIsolatedConfig()’ + + * ‘PyPreConfig_InitPythonConfig()’ + + * ‘PyStatus_Error()’ + + * ‘PyStatus_Exception()’ + + * ‘PyStatus_Exit()’ + + * ‘PyStatus_IsError()’ + + * ‘PyStatus_IsExit()’ + + * ‘PyStatus_NoMemory()’ + + * ‘PyStatus_Ok()’ + + * ‘PyWideStringList_Append()’ + + * ‘PyWideStringList_Insert()’ + + * *note Py_BytesMain(): 5ff. + + * ‘Py_ExitStatusException()’ + + * *note Py_InitializeFromConfig(): 600. + + * *note Py_PreInitialize(): 601. + + * *note Py_PreInitializeFromArgs(): 602. + + * *note Py_PreInitializeFromBytesArgs(): 603. + + * *note Py_RunMain(): 604. + +This PEP also adds ‘_PyRuntimeState.preconfig’ (*note PyPreConfig: 5fc. +type) and ‘PyInterpreterState.config’ (*note PyConfig: 370. type) fields +to these internal structures. ‘PyInterpreterState.config’ becomes the +new reference configuration, replacing global configuration variables +and other private variables. + +See *note Python Initialization Configuration: 371. for the +documentation. + +See PEP 587(2) for a full description. + +(Contributed by Victor Stinner in bpo-36763(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0587/ + + (2) https://peps.python.org/pep-0587/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36763 + + +File: python.info, Node: PEP 590 Vectorcall a fast calling protocol for CPython, Next: Pickle protocol 5 with out-of-band data buffers, Prev: PEP 587 Python Initialization Configuration, Up: New Features<7> + +1.4.2.8 PEP 590: Vectorcall: a fast calling protocol for CPython +................................................................ + +*note The Vectorcall Protocol: 606. is added to the Python/C API. It is +meant to formalize existing optimizations which were already done for +various classes. Any *note static type: 354. implementing a callable +can use this protocol. + +This is currently provisional. The aim is to make it fully public in +Python 3.9. + +See PEP 590(1) for a full description. + +(Contributed by Jeroen Demeyer, Mark Shannon and Petr Viktorin in +bpo-36974(2).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0590/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36974 + + +File: python.info, Node: Pickle protocol 5 with out-of-band data buffers, Prev: PEP 590 Vectorcall a fast calling protocol for CPython, Up: New Features<7> + +1.4.2.9 Pickle protocol 5 with out-of-band data buffers +....................................................... + +When *note pickle: c7. 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 *note pickle: c7. protocol 5 introduces support for out-of-band +buffers where PEP 3118(1)-compatible data can be transmitted separately +from the main pickle stream, at the discretion of the communication +layer. + +See PEP 574(2) for a full description. + +(Contributed by Antoine Pitrou in bpo-36785(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3118/ + + (2) https://peps.python.org/pep-0574/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36785 + + +File: python.info, Node: Other Language Changes<4>, Next: New Modules<4>, Prev: New Features<7>, Up: What’s New In Python 3 8 + +1.4.3 Other Language Changes +---------------------------- + + * A *note continue: 609. statement was illegal in the *note finally: + 60a. clause due to a problem with the implementation. In Python + 3.8 this restriction was lifted. (Contributed by Serhiy Storchaka + in bpo-32489(1).) + + * The *note bool: 463, *note int: 1c7, and *note fractions.Fraction: + 210. types now have an *note as_integer_ratio(): 60b. method like + that found in *note float: 3ca. and *note decimal.Decimal: 3bd. + This minor API extension makes it possible to write ‘numerator, + denominator = x.as_integer_ratio()’ and have it work across + multiple numeric types. (Contributed by Lisa Roach in bpo-33073(2) + and Raymond Hettinger in bpo-37819(3).) + + * Constructors of *note int: 1c7, *note float: 3ca. and *note + complex: 1b8. will now use the *note __index__(): 3bf. special + method, if available and the corresponding method *note __int__(): + 3be, *note __float__(): 60c. or *note __complex__(): 1b7. is not + available. (Contributed by Serhiy Storchaka in bpo-20092(4).) + + * Added support of ‘\N{name}’ escapes in *note regular expressions: + da.: + + >>> notice = 'Copyright © 2019' + >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})') + >>> int(copyright_year_pattern.search(notice).group(1)) + 2019 + + (Contributed by Jonathan Eunice and Serhiy Storchaka in + bpo-30688(5).) + + * Dict and dictviews are now iterable in reversed insertion order + using *note reversed(): 462. (Contributed by Rémi Lapeyre in + bpo-33462(6).) + + * The syntax allowed for keyword names in function calls was further + restricted. In particular, ‘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(7).) + + * Generalized iterable unpacking in *note yield: 60d. and *note + return: 60e. statements no longer requires enclosing parentheses. + This brings the `yield' and `return' syntax into better agreement + with normal assignment syntax: + + >>> def parse(family): + lastname, *members = family.split() + return lastname.upper(), *members + + >>> parse('simpsons homer marge bart lisa maggie') + ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie') + + (Contributed by David Cuthbert and Jordan Chapman in bpo-32117(8).) + + * When a comma is missed in code such as ‘[(10, 20) (30, 40)]’, the + compiler displays a *note SyntaxWarning: 2d5. with a helpful + suggestion. This improves on just having a *note TypeError: 19c. + indicating that the first tuple was not callable. (Contributed by + Serhiy Storchaka in bpo-15248(9).) + + * Arithmetic operations between subclasses of *note datetime.date: + 536. or *note datetime.datetime: 4be. and *note datetime.timedelta: + 60f. 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 *note + datetime.timedelta: 60f. arithmetic, such as *note astimezone(): + 610. (Contributed by Paul Ganssle in bpo-32417(10).) + + * When the Python interpreter is interrupted by Ctrl-C (SIGINT) and + the resulting *note KeyboardInterrupt: 611. 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(11).) + + * Some advanced styles of programming require updating the *note + types.CodeType: 612. 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 ‘replace()’ method makes + it possible to create a clone with a few altered parameters. + + Here’s an example that alters the *note statistics.mean(): 29b. + function to prevent the `data' parameter from being used as a + keyword argument: + + >>> 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' + + (Contributed by Victor Stinner in bpo-37032(12).) + + * For integers, the three-argument form of the *note pow(): 613. + 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 ‘-1’, and a + suitable power of that inverse for other negative exponents. For + example, to compute the modular multiplicative inverse(13) of 38 + modulo 137, write: + + >>> pow(38, -1, 137) + 119 + >>> 119 * 38 % 137 + 1 + + Modular inverses arise in the solution of linear Diophantine + equations(14). For example, to find integer solutions for ‘4258𝑥 + + 147𝑦 = 369’, first rewrite as ‘4258𝑥 ≡ 369 (mod 147)’ then solve: + + >>> x = 369 * pow(4258, -1, 147) % 147 + >>> y = (4258 * x - 369) // -147 + >>> 4258 * x + 147 * y + 369 + + (Contributed by Mark Dickinson in bpo-36027(15).) + + * Dict comprehensions have been synced-up with dict literals so that + the key is computed first and the value second: + + >>> # 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 + + The guaranteed execution order is helpful with assignment + expressions because variables assigned in the key expression will + be available in the value expression: + + >>> 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'} + + (Contributed by Jörn Heissler in bpo-35224(16).) + + * The *note object.__reduce__(): 614. 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 ‘(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 ‘__setstate__()’ method. + (Contributed by Pierre Glaser and Olivier Grisel in bpo-35900(17).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32489 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33073 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37819 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20092 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30688 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33462 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=34641 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32117 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=15248 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32417 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1054041 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=37032 + + (13) https://en.wikipedia.org/wiki/Modular_multiplicative_inverse + + (14) https://en.wikipedia.org/wiki/Diophantine_equation + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36027 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=35224 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=35900 + + +File: python.info, Node: New Modules<4>, Next: Improved Modules<4>, Prev: Other Language Changes<4>, Up: What’s New In Python 3 8 + +1.4.4 New Modules +----------------- + + * The new *note importlib.metadata: 9a. 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: + + >>> # 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')] + + (Contributed by Barry Warsaw and Jason R. Coombs in bpo-34632(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34632 + + +File: python.info, Node: Improved Modules<4>, Next: Optimizations<4>, Prev: New Modules<4>, Up: What’s New In Python 3 8 + +1.4.5 Improved Modules +---------------------- + +* Menu: + +* ast: ast<2>. +* asyncio: asyncio<4>. +* builtins:: +* collections:: +* cProfile:: +* csv:: +* curses: curses<3>. +* ctypes:: +* datetime: datetime<3>. +* functools: functools<2>. +* gc: gc<3>. +* gettext:: +* gzip:: +* IDLE and idlelib: IDLE and idlelib<4>. +* inspect: inspect<4>. +* io:: +* itertools: itertools<2>. +* json.tool: json tool. +* logging: logging<2>. +* math: math<3>. +* mmap:: +* multiprocessing: multiprocessing<2>. +* os: os<4>. +* os.path: os path<2>. +* pathlib: pathlib<4>. +* pickle:: +* plistlib:: +* pprint: pprint<3>. +* py_compile: py_compile<2>. +* shlex:: +* shutil: shutil<2>. +* socket: socket<4>. +* ssl: ssl<2>. +* statistics: statistics<2>. +* sys: sys<4>. +* tarfile:: +* threading: threading<3>. +* tokenize:: +* tkinter: tkinter<2>. +* time: time<3>. +* typing: typing<5>. +* unicodedata: unicodedata<3>. +* unittest: unittest<3>. +* venv: venv<3>. +* weakref:: +* xml: xml<3>. +* xmlrpc:: + + +File: python.info, Node: ast<2>, Next: asyncio<4>, Up: Improved Modules<4> + +1.4.5.1 ast +........... + +AST nodes now have ‘end_lineno’ and ‘end_col_offset’ attributes, which +give the precise location of the end of the node. (This only applies to +nodes that have ‘lineno’ and ‘col_offset’ attributes.) + +New function *note ast.get_source_segment(): 618. returns the source +code for a specific AST node. + +(Contributed by Ivan Levkivskyi in bpo-33416(1).) + +The *note ast.parse(): 619. function has some new flags: + + * ‘type_comments=True’ causes it to return the text of PEP 484(2) and + PEP 526(3) type comments associated with certain AST nodes; + + * ‘mode='func_type'’ can be used to parse PEP 484(4) “signature type + comments” (returned for function definition AST nodes); + + * ‘feature_version=(3, N)’ allows specifying an earlier Python 3 + version. For example, ‘feature_version=(3, 4)’ will treat *note + async: 2f9. and *note await: 2fa. as non-reserved words. + +(Contributed by Guido van Rossum in bpo-35766(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33416 + + (2) https://peps.python.org/pep-0484/ + + (3) https://peps.python.org/pep-0526/ + + (4) https://peps.python.org/pep-0484/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35766 + + +File: python.info, Node: asyncio<4>, Next: builtins, Prev: ast<2>, Up: Improved Modules<4> + +1.4.5.2 asyncio +............... + +*note asyncio.run(): 1d7. has graduated from the provisional to stable +API. This function can be used to execute a *note coroutine: 525. and +return the result while automatically managing the event loop. For +example: + + import asyncio + + async def main(): + await asyncio.sleep(0) + return 42 + + asyncio.run(main()) + +This is `roughly' equivalent to: + + 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() + +The actual implementation is significantly more complex. Thus, *note +asyncio.run(): 1d7. should be the preferred way of running asyncio +programs. + +(Contributed by Yury Selivanov in bpo-32314(1).) + +Running ‘python -m asyncio’ launches a natively async REPL. This allows +rapid experimentation with code that has a top-level *note await: 2fa. +There is no longer a need to directly call ‘asyncio.run()’ which would +spawn a new event loop on every invocation: + + $ 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 + +(Contributed by Yury Selivanov in bpo-37028(2).) + +The exception *note asyncio.CancelledError: 61b. now inherits from *note +BaseException: 17d. rather than *note Exception: 61c. and no longer +inherits from *note concurrent.futures.CancelledError: 61d. +(Contributed by Yury Selivanov in bpo-32528(3).) + +On Windows, the default event loop is now *note ProactorEventLoop: 1e0. +(Contributed by Victor Stinner in bpo-34687(4).) + +*note ProactorEventLoop: 1e0. now also supports UDP. (Contributed by +Adam Meily and Andrew Svetlov in bpo-29883(5).) + +*note ProactorEventLoop: 1e0. can now be interrupted by *note +KeyboardInterrupt: 611. (“CTRL+C”). (Contributed by Vladimir Matveev in +bpo-23057(6).) + +Added *note asyncio.Task.get_coro(): 61e. for getting the wrapped +coroutine within an *note asyncio.Task: 1e3. (Contributed by Alex +Grönholm in bpo-36999(7).) + +Asyncio tasks can now be named, either by passing the ‘name’ keyword +argument to *note asyncio.create_task(): 1d2. or the *note +create_task(): 61f. event loop method, or by calling the *note +set_name(): 620. method on the task object. The task name is visible in +the ‘repr()’ output of *note asyncio.Task: 1e3. and can also be +retrieved using the *note get_name(): 621. method. (Contributed by Alex +Grönholm in bpo-34270(8).) + +Added support for Happy Eyeballs(9) to *note +asyncio.loop.create_connection(): 1da. 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(10).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32314 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37028 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32528 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=34687 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29883 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23057 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36999 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=34270 + + (9) https://en.wikipedia.org/wiki/Happy_Eyeballs + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33530 + + +File: python.info, Node: builtins, Next: collections, Prev: asyncio<4>, Up: Improved Modules<4> + +1.4.5.3 builtins +................ + +The *note compile(): 310. built-in has been improved to accept the +‘ast.PyCF_ALLOW_TOP_LEVEL_AWAIT’ flag. With this new flag passed, *note +compile(): 310. will allow top-level ‘await’, ‘async for’ and ‘async +with’ constructs that are usually considered invalid syntax. +Asynchronous code object marked with the ‘CO_COROUTINE’ flag may then be +returned. (Contributed by Matthias Bussonnier in bpo-34616(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34616 + + +File: python.info, Node: collections, Next: cProfile, Prev: builtins, Up: Improved Modules<4> + +1.4.5.4 collections +................... + +The *note _asdict(): 624. method for *note collections.namedtuple(): +538. now returns a *note dict: 16e. instead of a *note +collections.OrderedDict: 1a8. This works because regular dicts have +guaranteed ordering since Python 3.7. If the extra features of +‘OrderedDict’ are required, the suggested remediation is to cast the +result to the desired type: ‘OrderedDict(nt._asdict())’. (Contributed +by Raymond Hettinger in bpo-35864(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35864 + + +File: python.info, Node: cProfile, Next: csv, Prev: collections, Up: Improved Modules<4> + +1.4.5.5 cProfile +................ + +The *note cProfile.Profile: 626. class can now be used as a context +manager. Profile a block of code by running: + + import cProfile + + with cProfile.Profile() as profiler: + # code to be profiled + ... + +(Contributed by Scott Sanderson in bpo-29235(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29235 + + +File: python.info, Node: csv, Next: curses<3>, Prev: cProfile, Up: Improved Modules<4> + +1.4.5.6 csv +........... + +The *note csv.DictReader: 628. now returns instances of *note dict: 16e. +instead of a *note collections.OrderedDict: 1a8. The tool is now faster +and uses less memory while still preserving the field order. +(Contributed by Michael Selik in bpo-34003(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34003 + + +File: python.info, Node: curses<3>, Next: ctypes, Prev: csv, Up: Improved Modules<4> + +1.4.5.7 curses +.............. + +Added a new variable holding structured version information for the +underlying ncurses library: *note ncurses_version: 62a. (Contributed by +Serhiy Storchaka in bpo-31680(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31680 + + +File: python.info, Node: ctypes, Next: datetime<3>, Prev: curses<3>, Up: Improved Modules<4> + +1.4.5.8 ctypes +.............. + +On Windows, *note CDLL: 62c. and subclasses now accept a `winmode' +parameter to specify flags for the underlying ‘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 *note +add_dll_directory(): 62d. (Contributed by Steve Dower in bpo-36085(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36085 + + +File: python.info, Node: datetime<3>, Next: functools<2>, Prev: ctypes, Up: Improved Modules<4> + +1.4.5.9 datetime +................ + +Added new alternate constructors *note datetime.date.fromisocalendar(): +62f. and *note datetime.datetime.fromisocalendar(): 630, which construct +‘date’ and *note datetime: 2f. objects respectively from ISO year, week +number, and weekday; these are the inverse of each class’s ‘isocalendar’ +method. (Contributed by Paul Ganssle in bpo-36004(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36004 + + +File: python.info, Node: functools<2>, Next: gc<3>, Prev: datetime<3>, Up: Improved Modules<4> + +1.4.5.10 functools +.................. + +*note functools.lru_cache(): 632. can now be used as a straight +decorator rather than as a function returning a decorator. So both of +these are now supported: + + @lru_cache + def f(x): + ... + + @lru_cache(maxsize=256) + def f(x): + ... + +(Contributed by Raymond Hettinger in bpo-36772(1).) + +Added a new *note functools.cached_property(): 633. decorator, for +computed properties cached for the life of the instance. + + 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) + +(Contributed by Carl Meyer in bpo-21145(2)) + +Added a new *note functools.singledispatchmethod(): 634. decorator that +converts methods into *note generic functions: 635. using *note single +dispatch: 636.: + + 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] + +(Contributed by Ethan Smith in bpo-32380(3)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36772 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21145 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32380 + + +File: python.info, Node: gc<3>, Next: gettext, Prev: functools<2>, Up: Improved Modules<4> + +1.4.5.11 gc +........... + +*note get_objects(): 3f4. can now receive an optional `generation' +parameter indicating a generation to get objects from. (Contributed by +Pablo Galindo in bpo-36016(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36016 + + +File: python.info, Node: gettext, Next: gzip, Prev: gc<3>, Up: Improved Modules<4> + +1.4.5.12 gettext +................ + +Added *note pgettext(): 639. and its variants. (Contributed by Franz +Glasner, Éric Araujo, and Cheryl Sabella in bpo-2504(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2504 + + +File: python.info, Node: gzip, Next: IDLE and idlelib<4>, Prev: gettext, Up: Improved Modules<4> + +1.4.5.13 gzip +............. + +Added the `mtime' parameter to *note gzip.compress(): 63b. for +reproducible output. (Contributed by Guo Ci Teo in bpo-34898(1).) + +A *note BadGzipFile: 63c. exception is now raised instead of *note +OSError: 413. for certain types of invalid or corrupt gzip files. +(Contributed by Filip Gruszczyński, Michele Orrù, and Zackery Spytz in +bpo-6584(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34898 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=6584 + + +File: python.info, Node: IDLE and idlelib<4>, Next: inspect<4>, Prev: gzip, Up: Improved Modules<4> + +1.4.5.14 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(1).) + +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(2) and +bpo-37627(3).) + +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(4).) + +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(5).) + +New in 3.8.1: + +Add option to toggle cursor blink off. (Contributed by Zackery Spytz in +bpo-4603(6).) + +Escape key now closes IDLE completion windows. (Contributed by Johnny +Najera in bpo-38944(7).) + +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(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1529353 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5680 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37627 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17535 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=13153 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=4603 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38944 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37765 + + +File: python.info, Node: inspect<4>, Next: io, Prev: IDLE and idlelib<4>, Up: Improved Modules<4> + +1.4.5.15 inspect +................ + +The *note inspect.getdoc(): 63f. function can now find docstrings for +‘__slots__’ if that attribute is a *note dict: 16e. where the values are +docstrings. This provides documentation options similar to what we +already have for *note property(): 205, *note classmethod(): 18d, and +*note staticmethod(): 3c8.: + + 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) + +(Contributed by Raymond Hettinger in bpo-36326(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36326 + + +File: python.info, Node: io, Next: itertools<2>, Prev: inspect<4>, Up: Improved Modules<4> + +1.4.5.16 io +........... + +In development mode (*note -X: 174. ‘env’) and in *note debug build: +496, the *note io.IOBase: 641. finalizer now logs the exception if the +‘close()’ method fails. The exception is ignored silently by default in +release build. (Contributed by Victor Stinner in bpo-18748(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18748 + + +File: python.info, Node: itertools<2>, Next: json tool, Prev: io, Up: Improved Modules<4> + +1.4.5.17 itertools +.................. + +The *note itertools.accumulate(): 643. function added an option +`initial' keyword argument to specify an initial value: + + >>> from itertools import accumulate + >>> list(accumulate([10, 5, 30, 15], initial=1000)) + [1000, 1010, 1015, 1045, 1060] + +(Contributed by Lisa Roach in bpo-34659(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34659 + + +File: python.info, Node: json tool, Next: logging<2>, Prev: itertools<2>, Up: Improved Modules<4> + +1.4.5.18 json.tool +.................. + +Add option ‘--json-lines’ to parse every input line as a separate JSON +object. (Contributed by Weipeng Hong in bpo-31553(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31553 + + +File: python.info, Node: logging<2>, Next: math<3>, Prev: json tool, Up: Improved Modules<4> + +1.4.5.19 logging +................ + +Added a `force' keyword argument to *note logging.basicConfig(): 646. +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 Dong-hee Na, and +reviewed by Vinay Sajip in bpo-33897(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33897 + + +File: python.info, Node: math<3>, Next: mmap, Prev: logging<2>, Up: Improved Modules<4> + +1.4.5.20 math +............. + +Added new function *note math.dist(): 648. for computing Euclidean +distance between two points. (Contributed by Raymond Hettinger in +bpo-33089(1).) + +Expanded the *note math.hypot(): 649. function to handle multiple +dimensions. Formerly, it only supported the 2-D case. (Contributed by +Raymond Hettinger in bpo-33089(2).) + +Added new function, *note math.prod(): 64a, as analogous function to +*note sum(): 296. that returns the product of a ‘start’ value (default: +1) times an iterable of numbers: + + >>> prior = 0.8 + >>> likelihoods = [0.625, 0.84, 0.30] + >>> math.prod(likelihoods, start=prior) + 0.126 + +(Contributed by Pablo Galindo in bpo-35606(3).) + +Added two new combinatoric functions *note math.perm(): 29a. and *note +math.comb(): 299.: + + >>> 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 + +(Contributed by Yash Aggarwal, Keller Fuchs, Serhiy Storchaka, and +Raymond Hettinger in bpo-37128(4), bpo-37178(5), and bpo-35431(6).) + +Added a new function *note math.isqrt(): 64b. for computing accurate +integer square roots without conversion to floating point. The new +function supports arbitrarily large integers. It is faster than +‘floor(sqrt(n))’ but slower than *note math.sqrt(): 64c.: + + >>> r = 650320427 + >>> s = r ** 2 + >>> isqrt(s - 1) # correct + 650320426 + >>> floor(sqrt(s - 1)) # incorrect + 650320427 + +(Contributed by Mark Dickinson in bpo-36887(7).) + +The function *note math.factorial(): 58f. no longer accepts arguments +that are not int-like. (Contributed by Pablo Galindo in bpo-33083(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33089 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33089 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35606 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37128 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=37178 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35431 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36887 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33083 + + +File: python.info, Node: mmap, Next: multiprocessing<2>, Prev: math<3>, Up: Improved Modules<4> + +1.4.5.21 mmap +............. + +The *note mmap.mmap: 64e. class now has an *note madvise(): 64f. method +to access the ‘madvise()’ system call. (Contributed by Zackery Spytz in +bpo-32941(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32941 + + +File: python.info, Node: multiprocessing<2>, Next: os<4>, Prev: mmap, Up: Improved Modules<4> + +1.4.5.22 multiprocessing +........................ + +Added new *note multiprocessing.shared_memory: ba. module. (Contributed +by Davin Potts in bpo-35813(1).) + +On macOS, the `spawn' start method is now used by default. (Contributed +by Victor Stinner in bpo-33725(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35813 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33725 + + +File: python.info, Node: os<4>, Next: os path<2>, Prev: multiprocessing<2>, Up: Improved Modules<4> + +1.4.5.23 os +........... + +Added new function *note add_dll_directory(): 62d. on Windows for +providing additional search paths for native dependencies when importing +extension modules or loading DLLs using *note ctypes: 29. (Contributed +by Steve Dower in bpo-36085(1).) + +A new *note os.memfd_create(): 652. function was added to wrap the +‘memfd_create()’ syscall. (Contributed by Zackery Spytz and Christian +Heimes in bpo-26836(2).) + +On Windows, much of the manual logic for handling reparse points +(including symlinks and directory junctions) has been delegated to the +operating system. Specifically, *note os.stat(): 653. will now traverse +anything supported by the operating system, while *note os.lstat(): 654. +will only open reparse points that identify as “name surrogates” while +others are opened as for *note os.stat(): 653. In all cases, +‘stat_result.st_mode’ will only have ‘S_IFLNK’ set for symbolic links +and not other kinds of reparse points. To identify other kinds of +reparse point, check the new ‘stat_result.st_reparse_tag’ attribute. + +On Windows, *note os.readlink(): 568. is now able to read directory +junctions. Note that *note islink(): 655. will return ‘False’ for +directory junctions, and so code that checks ‘islink’ first will +continue to treat junctions as directories, while code that handles +errors from *note os.readlink(): 568. may now treat junctions as links. + +(Contributed by Steve Dower in bpo-37834(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36085 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26836 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37834 + + +File: python.info, Node: os path<2>, Next: pathlib<4>, Prev: os<4>, Up: Improved Modules<4> + +1.4.5.24 os.path +................ + +*note os.path: c3. functions that return a boolean result like *note +exists(): 657, *note lexists(): 658, *note isdir(): 659, *note isfile(): +65a, *note islink(): 655, and *note ismount(): 65b. now return ‘False’ +instead of raising *note ValueError: 1c8. or its subclasses *note +UnicodeEncodeError: 246. and *note UnicodeDecodeError: 65c. for paths +that contain characters or bytes unrepresentable at the OS level. +(Contributed by Serhiy Storchaka in bpo-33721(1).) + +*note expanduser(): 65d. on Windows now prefers the ‘USERPROFILE’ +environment variable and does not use ‘HOME’, which is not normally set +for regular user accounts. (Contributed by Anthony Sottile in +bpo-36264(2).) + +*note isdir(): 659. on Windows no longer returns ‘True’ for a link to a +non-existent directory. + +*note realpath(): 412. on Windows now resolves reparse points, including +symlinks and directory junctions. + +(Contributed by Steve Dower in bpo-37834(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33721 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36264 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37834 + + +File: python.info, Node: pathlib<4>, Next: pickle, Prev: os path<2>, Up: Improved Modules<4> + +1.4.5.25 pathlib +................ + +*note pathlib.Path: 65f. methods that return a boolean result like *note +exists(): 660, *note is_dir(): 661, *note is_file(): 662, *note +is_mount(): 663, *note is_symlink(): 664, *note is_block_device(): 665, +*note is_char_device(): 666, *note is_fifo(): 667, *note is_socket(): +668. now return ‘False’ instead of raising *note ValueError: 1c8. or its +subclass *note UnicodeEncodeError: 246. for paths that contain +characters unrepresentable at the OS level. (Contributed by Serhiy +Storchaka in bpo-33721(1).) + +Added *note pathlib.Path.link_to(): 2f2. which creates a hard link +pointing to a path. (Contributed by Joannah Nanjekye in bpo-26978(2)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33721 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26978 + + +File: python.info, Node: pickle, Next: plistlib, Prev: pathlib<4>, Up: Improved Modules<4> + +1.4.5.26 pickle +............... + +*note pickle: c7. extensions subclassing the C-optimized *note Pickler: +66a. can now override the pickling logic of functions and classes by +defining the special *note reducer_override(): 66b. method. +(Contributed by Pierre Glaser and Olivier Grisel in bpo-35900(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35900 + + +File: python.info, Node: plistlib, Next: pprint<3>, Prev: pickle, Up: Improved Modules<4> + +1.4.5.27 plistlib +................. + +Added new *note plistlib.UID: 66d. and enabled support for reading and +writing NSKeyedArchiver-encoded binary plists. (Contributed by Jon +Janzen in bpo-26707(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26707 + + +File: python.info, Node: pprint<3>, Next: py_compile<2>, Prev: plistlib, Up: Improved Modules<4> + +1.4.5.28 pprint +............... + +The *note pprint: cf. 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, *note pprint.pp(): +66f. that is like *note pprint.pprint(): 41d. but with `sort_dicts' +defaulting to ‘False’: + + >>> 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'} + +(Contributed by Rémi Lapeyre in bpo-30670(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30670 + + +File: python.info, Node: py_compile<2>, Next: shlex, Prev: pprint<3>, Up: Improved Modules<4> + +1.4.5.29 py_compile +................... + +*note py_compile.compile(): 671. now supports silent mode. (Contributed +by Joannah Nanjekye in bpo-22640(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22640 + + +File: python.info, Node: shlex, Next: shutil<2>, Prev: py_compile<2>, Up: Improved Modules<4> + +1.4.5.30 shlex +.............. + +The new *note shlex.join(): 673. function acts as the inverse of *note +shlex.split(): 594. (Contributed by Bo Bayles in bpo-32102(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32102 + + +File: python.info, Node: shutil<2>, Next: socket<4>, Prev: shlex, Up: Improved Modules<4> + +1.4.5.31 shutil +............... + +*note shutil.copytree(): 675. now accepts a new ‘dirs_exist_ok’ keyword +argument. (Contributed by Josh Bronson in bpo-20849(1).) + +*note shutil.make_archive(): 676. 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 +*note tarfile: fd. module. (Contributed by C.A.M. Gerlach in +bpo-30661(2).) + +*note shutil.rmtree(): 23f. on Windows now removes directory junctions +without recursively removing their contents first. (Contributed by +Steve Dower in bpo-37834(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20849 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30661 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37834 + + +File: python.info, Node: socket<4>, Next: ssl<2>, Prev: shutil<2>, Up: Improved Modules<4> + +1.4.5.32 socket +............... + +Added *note create_server(): 678. and *note has_dualstack_ipv6(): 679. +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(1).) + +The *note socket.if_nameindex(): 67a, *note socket.if_nametoindex(): +67b, and *note socket.if_indextoname(): 67c. functions have been +implemented on Windows. (Contributed by Zackery Spytz in bpo-37007(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17561 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37007 + + +File: python.info, Node: ssl<2>, Next: statistics<2>, Prev: socket<4>, Up: Improved Modules<4> + +1.4.5.33 ssl +............ + +Added *note post_handshake_auth: 67e. to enable and *note +verify_client_post_handshake(): 67f. to initiate TLS 1.3 post-handshake +authentication. (Contributed by Christian Heimes in bpo-34670(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34670 + + +File: python.info, Node: statistics<2>, Next: sys<4>, Prev: ssl<2>, Up: Improved Modules<4> + +1.4.5.34 statistics +................... + +Added *note statistics.fmean(): 681. as a faster, floating point variant +of *note statistics.mean(): 29b. (Contributed by Raymond Hettinger and +Steven D’Aprano in bpo-35904(1).) + +Added *note statistics.geometric_mean(): 682. (Contributed by Raymond +Hettinger in bpo-27181(2).) + +Added *note statistics.multimode(): 683. that returns a list of the most +common values. (Contributed by Raymond Hettinger in bpo-35892(3).) + +Added *note statistics.quantiles(): 684. that divides data or a +distribution in to equiprobable intervals (e.g. quartiles, deciles, or +percentiles). (Contributed by Raymond Hettinger in bpo-36546(4).) + +Added *note statistics.NormalDist: 685, a tool for creating and +manipulating normal distributions of a random variable. (Contributed by +Raymond Hettinger in bpo-36018(5).) + + >>> 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] + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35904 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27181 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35892 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36546 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36018 + + +File: python.info, Node: sys<4>, Next: tarfile, Prev: statistics<2>, Up: Improved Modules<4> + +1.4.5.35 sys +............ + +Add new *note sys.unraisablehook(): 24e. 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 (*note gc.collect(): 687.). (Contributed by Victor +Stinner in bpo-36829(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36829 + + +File: python.info, Node: tarfile, Next: threading<3>, Prev: sys<4>, Up: Improved Modules<4> + +1.4.5.36 tarfile +................ + +The *note tarfile: fd. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36268 + + +File: python.info, Node: threading<3>, Next: tokenize, Prev: tarfile, Up: Improved Modules<4> + +1.4.5.37 threading +.................. + +Add a new *note threading.excepthook(): 442. function which handles +uncaught *note threading.Thread.run(): 68a. exception. It can be +overridden to control how uncaught *note threading.Thread.run(): 68a. +exceptions are handled. (Contributed by Victor Stinner in +bpo-1230540(1).) + +Add a new *note threading.get_native_id(): 68b. function and a *note +native_id: 68c. attribute to the *note threading.Thread: 59b. 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 *note get_native_id: 68b. for more information. +(Contributed by Jake Tesler in bpo-36084(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1230540 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36084 + + +File: python.info, Node: tokenize, Next: tkinter<2>, Prev: threading<3>, Up: Improved Modules<4> + +1.4.5.38 tokenize +................. + +The *note tokenize: 11a. module now implicitly emits a ‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33899 + + +File: python.info, Node: tkinter<2>, Next: time<3>, Prev: tokenize, Up: Improved Modules<4> + +1.4.5.39 tkinter +................ + +Added methods ‘selection_from()’, ‘selection_present()’, +‘selection_range()’ and ‘selection_to()’ in the ‘tkinter.Spinbox’ class. +(Contributed by Juliette Monsel in bpo-34829(1).) + +Added method ‘moveto()’ in the ‘tkinter.Canvas’ class. (Contributed by +Juliette Monsel in bpo-23831(2).) + +The ‘tkinter.PhotoImage’ class now has ‘transparency_get()’ and +‘transparency_set()’ methods. (Contributed by Zackery Spytz in +bpo-25451(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34829 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23831 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25451 + + +File: python.info, Node: time<3>, Next: typing<5>, Prev: tkinter<2>, Up: Improved Modules<4> + +1.4.5.40 time +............. + +Added new clock *note CLOCK_UPTIME_RAW: 690. for macOS 10.12. +(Contributed by Joannah Nanjekye in bpo-35702(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35702 + + +File: python.info, Node: typing<5>, Next: unicodedata<3>, Prev: time<3>, Up: Improved Modules<4> + +1.4.5.41 typing +............... + +The *note typing: 123. module incorporates several new features: + + * A dictionary type with per-key types. See PEP 589(1) and *note + typing.TypedDict: 18a. TypedDict uses only string keys. By + default, every key is required to be present. Specify + “total=False” to allow keys to be optional: + + class Location(TypedDict, total=False): + lat_long: tuple + grid_square: str + xy_coordinate: tuple + + * Literal types. See PEP 586(2) and *note typing.Literal: 44c. + Literal types indicate that a parameter or return value is + constrained to one or more specific literal values: + + def get_status(port: int) -> Literal['connected', 'disconnected']: + ... + + * “Final” variables, functions, methods and classes. See PEP 591(3), + *note typing.Final: 692. and *note typing.final(): 273. The final + qualifier instructs a static type checker to restrict subclassing, + overriding, or reassignment: + + pi: Final[float] = 3.1415926536 + + * Protocol definitions. See PEP 544(4), *note typing.Protocol: 276. + and *note typing.runtime_checkable(): 693. Simple ABCs like *note + typing.SupportsInt: 694. are now ‘Protocol’ subclasses. + + * New protocol class *note typing.SupportsIndex: 695. + + * New functions *note typing.get_origin(): 696. and *note + typing.get_args(): 4a1. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0589/ + + (2) https://peps.python.org/pep-0586/ + + (3) https://peps.python.org/pep-0591/ + + (4) https://peps.python.org/pep-0544/ + + +File: python.info, Node: unicodedata<3>, Next: unittest<3>, Prev: typing<5>, Up: Improved Modules<4> + +1.4.5.42 unicodedata +.................... + +The *note unicodedata: 124. module has been upgraded to use the Unicode +12.1.0(1) release. + +New function *note is_normalized(): 698. 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(2) and bpo-37966(3)). + + ---------- Footnotes ---------- + + (1) https://blog.unicode.org/2019/05/unicode-12-1-en.html + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32285 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37966 + + +File: python.info, Node: unittest<3>, Next: venv<3>, Prev: unicodedata<3>, Up: Improved Modules<4> + +1.4.5.43 unittest +................. + +Added *note AsyncMock: 69a. to support an asynchronous version of *note +Mock: 69b. Appropriate new assert functions for testing have been added +as well. (Contributed by Lisa Roach in bpo-26467(1)). + +Added *note addModuleCleanup(): 69c. and *note addClassCleanup(): 69d. +to unittest to support cleanups for ‘setUpModule()’ and *note +setUpClass(): 69e. (Contributed by Lisa Roach in bpo-24412(2).) + +Several mock assert functions now also print a list of actual calls upon +failure. (Contributed by Petter Strandmark in bpo-35047(3).) + +*note unittest: 125. module gained support for coroutines to be used as +test cases with *note unittest.IsolatedAsyncioTestCase: 284. +(Contributed by Andrew Svetlov in bpo-32972(4).) + +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() + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26467 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24412 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35047 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32972 + + +File: python.info, Node: venv<3>, Next: weakref, Prev: unittest<3>, Up: Improved Modules<4> + +1.4.5.44 venv +............. + +*note venv: 12f. now includes an ‘Activate.ps1’ script on all platforms +for activating virtual environments under PowerShell Core 6.1. +(Contributed by Brett Cannon in bpo-32718(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32718 + + +File: python.info, Node: weakref, Next: xml<3>, Prev: venv<3>, Up: Improved Modules<4> + +1.4.5.45 weakref +................ + +The proxy objects returned by *note weakref.proxy(): 6a1. now support +the matrix multiplication operators ‘@’ and ‘@=’ in addition to the +other numeric operators. (Contributed by Mark Dickinson in +bpo-36669(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36669 + + +File: python.info, Node: xml<3>, Next: xmlrpc, Prev: weakref, Up: Improved Modules<4> + +1.4.5.46 xml +............ + +As mitigation against DTD and external entity retrieval, the *note +xml.dom.minidom: 140. and *note xml.sax: 146. modules no longer process +external entities by default. (Contributed by Christian Heimes in +bpo-17239(1).) + +The ‘.find*()’ methods in the *note xml.etree.ElementTree: 142. module +support wildcard searches like ‘{*}tag’ which ignores the namespace and +‘{namespace}*’ which returns all tags in the given namespace. +(Contributed by Stefan Behnel in bpo-28238(2).) + +The *note xml.etree.ElementTree: 142. module provides a new function +‘–xml.etree.ElementTree.canonicalize()’ that implements C14N 2.0. +(Contributed by Stefan Behnel in bpo-13611(3).) + +The target object of *note xml.etree.ElementTree.XMLParser: 6a3. can +receive namespace declaration events through the new callback methods +‘start_ns()’ and ‘end_ns()’. Additionally, the *note +xml.etree.ElementTree.TreeBuilder: 6a4. 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(4) and bpo-36673(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17239 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28238 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13611 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36676 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36673 + + +File: python.info, Node: xmlrpc, Prev: xml<3>, Up: Improved Modules<4> + +1.4.5.47 xmlrpc +............... + +*note xmlrpc.client.ServerProxy: 6a6. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35153 + + +File: python.info, Node: Optimizations<4>, Next: Build and C API Changes, Prev: Improved Modules<4>, Up: What’s New In Python 3 8 + +1.4.6 Optimizations +------------------- + + * The *note subprocess: f6. module can now use the *note + os.posix_spawn(): 6a8. 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: + + * `close_fds' is false; + + * `preexec_fn', `pass_fds', `cwd' and `start_new_session' + parameters are not set; + + * the `executable' path contains a directory. + + (Contributed by Joannah Nanjekye and Victor Stinner in + bpo-35537(1).) + + * *note shutil.copyfile(): 6a9, *note shutil.copy(): 6aa, *note + shutil.copy2(): 6ab, *note shutil.copytree(): 675. and *note + shutil.move(): 6ac. 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 + “‘outfd.write(infd.read())’”. On Windows *note shutil.copyfile(): + 6a9. uses a bigger default buffer size (1 MiB instead of 16 KiB) + and a *note memoryview(): 6ad.-based variant of *note + shutil.copyfileobj(): 6ae. 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 *note Platform-dependent efficient copy operations: + 6af. section. (Contributed by Giampaolo Rodolà in bpo-33671(2).) + + * *note shutil.copytree(): 675. uses *note os.scandir(): 6b0. + function and all copy functions depending from it use cached *note + os.stat(): 653. 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 *note os.stat(): 653. + syscalls is reduced by 38% making *note shutil.copytree(): 675. + especially faster on network filesystems. (Contributed by + Giampaolo Rodolà in bpo-33695(3).) + + * The default protocol in the *note pickle: c7. 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. + + * Removed one *note Py_ssize_t: 6b1. member from ‘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(4).) + + * *note uuid.UUID: 6b2. now uses ‘__slots__’ to reduce its memory + footprint. (Contributed by Wouter Bolsterlee and Tal Einat in + bpo-30977(5)) + + * Improved performance of *note operator.itemgetter(): 6b3. 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(6).) + + * Sped-up field lookups in *note collections.namedtuple(): 538. 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(7).) + + * The *note list: 1e9. constructor does not overallocate the internal + item buffer if the input iterable has a known length (the input + implements ‘__len__’). This makes the created list 12% smaller on + average. (Contributed by Raymond Hettinger and Pablo Galindo in + bpo-33234(8).) + + * 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(9).) + + * 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(10), bpo-35582(11) and bpo-36127(12).) + + * ‘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(13).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35537 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33671 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33695 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33597 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30977 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35664 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32492 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33234 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36012 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=23867 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35582 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36127 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26219 + + +File: python.info, Node: Build and C API Changes, Next: Deprecated<6>, Prev: Optimizations<4>, Up: What’s New In Python 3 8 + +1.4.7 Build and C API Changes +----------------------------- + + * Default *note sys.abiflags: 6b5. became an empty string: the ‘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(1).) + + Example of changes: + + * Only ‘python3.8’ program is installed, ‘python3.8m’ program is + gone. + + * Only ‘python3.8-config’ script is installed, + ‘python3.8m-config’ script is gone. + + * The ‘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 + ‘.cpython-37m-x86_64-linux-gnu.so’ became + ‘.cpython-38-x86_64-linux-gnu.so’ in Python 3.8. + + * The header files have been reorganized to better separate the + different kinds of APIs: + + * ‘Include/*.h’ should be the portable public stable C API. + + * ‘Include/cpython/*.h’ should be the unstable C API specific to + CPython; public API, with some private API prefixed by ‘_Py’ + or ‘_PY’. + + * ‘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 ‘make + install’. + + (Contributed by Victor Stinner in bpo-35134(2) and bpo-35081(3), + work initiated by Eric Snow in Python 3.7.) + + * 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: + + * *note Py_INCREF(): 4cc, *note Py_DECREF(): 4cd. + + * *note Py_XINCREF(): 6b6, *note Py_XDECREF(): 363. + + * ‘PyObject_INIT()’, ‘PyObject_INIT_VAR()’ + + * Private functions: ‘_PyObject_GC_TRACK()’, + ‘_PyObject_GC_UNTRACK()’, ‘_Py_Dealloc()’ + + (Contributed by Victor Stinner in bpo-35059(4).) + + * The ‘PyByteArray_Init()’ and ‘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(5).) + + * The result of ‘PyExceptionClass_Name()’ is now of type ‘const char + *’ rather of ‘char *’. (Contributed by Serhiy Storchaka in + bpo-33818(6).) + + * The duality of ‘Modules/Setup.dist’ and ‘Modules/Setup’ has been + removed. Previously, when updating the CPython source tree, one + had to manually copy ‘Modules/Setup.dist’ (inside the source tree) + to ‘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 ‘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(7).) + + * Functions that convert Python number to C integer like *note + PyLong_AsLong(): 6b7. and argument parsing functions like *note + PyArg_ParseTuple(): 4d9. with integer converting format units like + ‘'i'’ will now use the *note __index__(): 3bf. special method + instead of *note __int__(): 3be, if available. The deprecation + warning will be emitted for objects with the ‘__int__()’ method but + without the ‘__index__()’ method (like *note Decimal: 3bd. and + *note Fraction: 210.). *note PyNumber_Check(): 6b8. will now + return ‘1’ for objects implementing ‘__index__()’. *note + PyNumber_Long(): 6b9, *note PyNumber_Float(): 6ba. and *note + PyFloat_AsDouble(): 6bb. also now use the ‘__index__()’ method if + available. (Contributed by Serhiy Storchaka in bpo-36048(8) and + bpo-20092(9).) + + * Heap-allocated type objects will now increase their reference count + in *note PyObject_Init(): 6bc. (and its parallel macro + ‘PyObject_INIT’) instead of in *note PyType_GenericAlloc(): 6bd. + Types that modify instance allocation or deallocation may need to + be adjusted. (Contributed by Eddie Elizondo in bpo-35810(10).) + + * The new function *note PyCode_NewWithPosOnlyArgs(): 34a. allows to + create code objects like *note PyCode_New(): 349, but with an extra + `posonlyargcount' parameter for indicating the number of + positional-only arguments. (Contributed by Pablo Galindo in + bpo-37221(11).) + + * *note Py_SetPath(): 36c. now sets *note sys.executable: 6be. to the + program full path (*note Py_GetProgramFullPath(): 4e4.) rather than + to the program name (*note Py_GetProgramName(): 4e6.). + (Contributed by Victor Stinner in bpo-38234(12).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36707 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35081 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35059 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35713 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33818 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32430 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36048 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=20092 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35810 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37221 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38234 + + +File: python.info, Node: Deprecated<6>, Next: API and Feature Removals, Prev: Build and C API Changes, Up: What’s New In Python 3 8 + +1.4.8 Deprecated +---------------- + + * The distutils ‘bdist_wininst’ command is now deprecated, use + ‘bdist_wheel’ (wheel packages) instead. (Contributed by Victor + Stinner in bpo-37481(1).) + + * Deprecated methods ‘getchildren()’ and ‘getiterator()’ in the *note + ElementTree: 142. module now emit a *note DeprecationWarning: 2d4. + instead of *note PendingDeprecationWarning: 503. They will be + removed in Python 3.9. (Contributed by Serhiy Storchaka in + bpo-29209(2).) + + * Passing an object that is not an instance of *note + concurrent.futures.ThreadPoolExecutor: 311. to *note + loop.set_default_executor(): 312. is deprecated and will be + prohibited in Python 3.9. (Contributed by Elvis Pranskevichus in + bpo-34075(3).) + + * The ‘__getitem__()’ methods of *note + xml.dom.pulldom.DOMEventStream: 2fe, *note + wsgiref.util.FileWrapper: 2ff. and *note fileinput.FileInput: 300. + 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(4).) + + * The *note typing.NamedTuple: 271. class has deprecated the + ‘_field_types’ attribute in favor of the ‘__annotations__’ + attribute which has the same information. (Contributed by Raymond + Hettinger in bpo-36320(5).) + + * *note ast: 7. classes ‘Num’, ‘Str’, ‘Bytes’, ‘NameConstant’ and + ‘Ellipsis’ are considered deprecated and will be removed in future + Python versions. *note Constant: 6c0. should be used instead. + (Contributed by Serhiy Storchaka in bpo-32892(6).) + + * *note ast.NodeVisitor: 6c1. methods ‘visit_Num()’, ‘visit_Str()’, + ‘visit_Bytes()’, ‘visit_NameConstant()’ and ‘visit_Ellipsis()’ are + deprecated now and will not be called in future Python versions. + Add the ‘visit_Constant()’ method to handle all constant nodes. + (Contributed by Serhiy Storchaka in bpo-36917(7).) + + * The ‘asyncio.coroutine()’ *note decorator: 2f8. is deprecated and + will be removed in version 3.10. Instead of ‘@asyncio.coroutine’, + use *note async def: 19b. instead. (Contributed by Andrew Svetlov + in bpo-36921(8).) + + * In *note asyncio: 9, the explicit passing of a `loop' argument has + been deprecated and will be removed in version 3.10 for the + following: *note asyncio.sleep(): 6c2, *note asyncio.gather(): 1d3, + *note asyncio.shield(): 47a, *note asyncio.wait_for(): 1d5, *note + asyncio.wait(): 591, *note asyncio.as_completed(): 47b, *note + asyncio.Task: 1e3, *note asyncio.Lock: 6c3, *note asyncio.Event: + 6c4, *note asyncio.Condition: 6c5, *note asyncio.Semaphore: 6c6, + *note asyncio.BoundedSemaphore: 6c7, *note asyncio.Queue: 6c8, + *note asyncio.create_subprocess_exec(): 6c9, and *note + asyncio.create_subprocess_shell(): 6ca. + + * The explicit passing of coroutine objects to *note asyncio.wait(): + 591. has been deprecated and will be removed in version 3.11. + (Contributed by Yury Selivanov in bpo-34790(9).) + + * The following functions and methods are deprecated in the *note + gettext: 83. module: ‘lgettext()’, ‘ldgettext()’, ‘lngettext()’ and + ‘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 ‘bind_textdomain_codeset()’, methods ‘output_charset()’ + and ‘set_output_charset()’, and the `codeset' parameter of + functions *note translation(): 6cb. and *note install(): 6cc. are + also deprecated, since they are only used for the ‘l*gettext()’ + functions. (Contributed by Serhiy Storchaka in bpo-33710(10).) + + * The ‘isAlive()’ method of *note threading.Thread: 59b. has been + deprecated. (Contributed by Dong-hee Na in bpo-35283(11).) + + * Many builtin and extension functions that take integer arguments + will now emit a deprecation warning for *note Decimal: 3bd.s, *note + Fraction: 210.s and any other objects that can be converted to + integers only with a loss (e.g. that have the *note __int__(): + 3be. method but do not have the *note __index__(): 3bf. method). + In future version they will be errors. (Contributed by Serhiy + Storchaka in bpo-36048(12).) + + * Deprecated passing the following arguments as keyword arguments: + + - `func' in *note functools.partialmethod(): 6cd, *note + weakref.finalize(): 6ce, *note profile.Profile.runcall(): 6cf, + ‘cProfile.Profile.runcall()’, *note bdb.Bdb.runcall(): 6d0, + *note trace.Trace.runfunc(): 6d1. and *note curses.wrapper(): + 6d2. + + - `function' in *note unittest.TestCase.addCleanup(): 6d3. + + - `fn' in the *note submit(): 6d4. method of *note + concurrent.futures.ThreadPoolExecutor: 311. and *note + concurrent.futures.ProcessPoolExecutor: 52e. + + - `callback' in *note contextlib.ExitStack.callback(): 6d5, + ‘contextlib.AsyncExitStack.callback()’ and *note + contextlib.AsyncExitStack.push_async_callback(): 6d6. + + - `c' and `typeid' in the ‘create()’ method of + ‘multiprocessing.managers.Server’ and + ‘multiprocessing.managers.SharedMemoryServer’. + + - `obj' in *note weakref.finalize(): 6ce. + + In future releases of Python, they will be *note positional-only: + 6d7. (Contributed by Serhiy Storchaka in bpo-36492(13).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37481 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29209 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=34075 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=9372 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36320 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32892 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36917 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36921 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=34790 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33710 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35283 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36048 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=36492 + + +File: python.info, Node: API and Feature Removals, Next: Porting to Python 3 8, Prev: Deprecated<6>, Up: What’s New In Python 3 8 + +1.4.9 API and Feature Removals +------------------------------ + +The following features and APIs have been removed from Python 3.8: + + * Starting with Python 3.3, importing ABCs from *note collections: + 1c. was deprecated, and importing should be done from *note + collections.abc: 1d. Being able to import from collections was + marked for removal in 3.8, but has been delayed to 3.9. (See + bpo-36952(1).) + + * The ‘macpath’ module, deprecated in Python 3.7, has been removed. + (Contributed by Victor Stinner in bpo-35471(2).) + + * The function ‘platform.popen()’ has been removed, after having been + deprecated since Python 3.3: use *note os.popen(): 6d9. instead. + (Contributed by Victor Stinner in bpo-35345(3).) + + * The function ‘time.clock()’ has been removed, after having been + deprecated since Python 3.3: use *note time.perf_counter(): 6da. or + *note time.process_time(): 6db. instead, depending on your + requirements, to have well-defined behavior. (Contributed by + Matthias Bussonnier in bpo-36895(4).) + + * The ‘pyvenv’ script has been removed in favor of ‘python3.8 -m + venv’ to help eliminate confusion as to what Python interpreter the + ‘pyvenv’ script is tied to. (Contributed by Brett Cannon in + bpo-25427(5).) + + * ‘parse_qs’, ‘parse_qsl’, and ‘escape’ are removed from the *note + cgi: 14. module. They are deprecated in Python 3.2 or older. They + should be imported from the ‘urllib.parse’ and ‘html’ modules + instead. + + * ‘filemode’ function is removed from the *note tarfile: fd. module. + It is not documented and deprecated since Python 3.3. + + * The *note XMLParser: 6a3. constructor no longer accepts the `html' + argument. It never had an effect and was deprecated in Python 3.4. + All other parameters are now *note keyword-only: 6dc. (Contributed + by Serhiy Storchaka in bpo-29209(6).) + + * Removed the ‘doctype()’ method of *note XMLParser: 6a3. + (Contributed by Serhiy Storchaka in bpo-29209(7).) + + * “unicode_internal” codec is removed. (Contributed by Inada Naoki + in bpo-36297(8).) + + * The ‘Cache’ and ‘Statement’ objects of the *note sqlite3: ef. + module are not exposed to the user. (Contributed by Aviv Palivoda + in bpo-30262(9).) + + * The ‘bufsize’ keyword argument of *note fileinput.input(): 3f0. and + *note fileinput.FileInput(): 300. which was ignored and deprecated + since Python 3.6 has been removed. bpo-36952(10) (Contributed by + Matthias Bussonnier.) + + * The functions ‘sys.set_coroutine_wrapper()’ and + ‘sys.get_coroutine_wrapper()’ deprecated in Python 3.7 have been + removed; bpo-36933(11) (Contributed by Matthias Bussonnier.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36952 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35471 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35345 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36895 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25427 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29209 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29209 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36297 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=30262 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36952 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=36933 + + +File: python.info, Node: Porting to Python 3 8, Next: Notable changes in Python 3 8 1, Prev: API and Feature Removals, Up: What’s New In Python 3 8 + +1.4.10 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<3>. +* Changes in the C API: Changes in the C API<3>. +* CPython bytecode changes: CPython bytecode changes<4>. +* Demos and Tools:: + + +File: python.info, Node: Changes in Python behavior, Next: Changes in the Python API<3>, Up: Porting to Python 3 8 + +1.4.10.1 Changes in Python behavior +................................... + + * Yield expressions (both ‘yield’ and ‘yield from’ clauses) are now + disallowed in comprehensions and generator expressions (aside from + the iterable expression in the leftmost ‘for’ clause). + (Contributed by Serhiy Storchaka in bpo-10544(1).) + + * The compiler now produces a *note SyntaxWarning: 2d5. when identity + checks (‘is’ and ‘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 (‘==’ and ‘!=’) instead. + (Contributed by Serhiy Storchaka in bpo-34850(2).) + + * 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(3).) + + * Removed ‘__str__’ implementations from builtin types *note bool: + 463, *note int: 1c7, *note float: 3ca, *note complex: 1b8. and few + classes from the standard library. They now inherit ‘__str__()’ + from *note object: 6df. As result, defining the ‘__repr__()’ + method in the subclass of these classes will affect their string + representation. (Contributed by Serhiy Storchaka in bpo-36793(4).) + + * On AIX, *note sys.platform: 6e0. doesn’t contain the major version + anymore. It is always ‘'aix'’, instead of ‘'aix3'’ .. ‘'aix7'’. + Since older Python versions include the version number, so it is + recommended to always use ‘sys.platform.startswith('aix')’. + (Contributed by M. Felt in bpo-36588(5).) + + * *note PyEval_AcquireLock(): 6e1. and *note PyEval_AcquireThread(): + 6e2. now terminate the current thread if called while the + interpreter is finalizing, making them consistent with *note + PyEval_RestoreThread(): 6e3, *note Py_END_ALLOW_THREADS(): 6e4, and + *note PyGILState_Ensure(): 6e5. If this behavior is not desired, + guard the call by checking ‘_Py_IsFinalizing()’ or + ‘sys.is_finalizing()’. (Contributed by Joannah Nanjekye in + bpo-36475(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10544 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34850 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35459 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36793 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36588 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36475 + + +File: python.info, Node: Changes in the Python API<3>, Next: Changes in the C API<3>, Prev: Changes in Python behavior, Up: Porting to Python 3 8 + +1.4.10.2 Changes in the Python API +.................................. + + * The *note os.getcwdb(): 6e7. function now uses the UTF-8 encoding + on Windows, rather than the ANSI code page: see PEP 529(1) for the + rationale. The function is no longer deprecated on Windows. + (Contributed by Victor Stinner in bpo-37412(2).) + + * *note subprocess.Popen: 6e8. can now use *note os.posix_spawn(): + 6a8. in some cases for better performance. On Windows Subsystem + for Linux and QEMU User Emulation, the ‘Popen’ constructor using + *note os.posix_spawn(): 6a8. no longer raises an exception on + errors like “missing program”. Instead the child process fails + with a non-zero ‘returncode’. (Contributed by Joannah Nanjekye and + Victor Stinner in bpo-35537(3).) + + * The `preexec_fn' argument of * *note subprocess.Popen: 6e8. is no + longer compatible with subinterpreters. The use of the parameter + in a subinterpreter now raises *note RuntimeError: 6e9. + (Contributed by Eric Snow in bpo-34651(4), modified by Christian + Heimes in bpo-37951(5).) + + * The ‘imap.IMAP4.logout()’ method no longer silently ignores + arbitrary exceptions. (Contributed by Victor Stinner in + bpo-36348(6).) + + * The function ‘platform.popen()’ has been removed, after having been + deprecated since Python 3.3: use *note os.popen(): 6d9. instead. + (Contributed by Victor Stinner in bpo-35345(7).) + + * The *note statistics.mode(): 6ea. 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(8).) + + * The *note selection(): 6eb. method of the *note + tkinter.ttk.Treeview: 6ec. class no longer takes arguments. Using + it with arguments for changing the selection was deprecated in + Python 3.6. Use specialized methods like *note selection_set(): + 6ed. for changing the selection. (Contributed by Serhiy Storchaka + in bpo-31508(9).) + + * The ‘writexml()’, ‘toxml()’ and ‘toprettyxml()’ methods of *note + xml.dom.minidom: 140, and the ‘write()’ method of ‘xml.etree’, now + preserve the attribute order specified by the user. (Contributed + by Diego Rojas and Raymond Hettinger in bpo-34160(10).) + + * A *note dbm.dumb: 31. database opened with flags ‘'r'’ is now + read-only. *note dbm.dumb.open(): 6ee. with flags ‘'r'’ and ‘'w'’ + no longer creates a database if it does not exist. (Contributed by + Serhiy Storchaka in bpo-32749(11).) + + * The ‘doctype()’ method defined in a subclass of *note XMLParser: + 6a3. will no longer be called and will emit a *note RuntimeWarning: + 6ef. instead of a *note DeprecationWarning: 2d4. Define the *note + doctype(): 6f0. method on a target for handling an XML doctype + declaration. (Contributed by Serhiy Storchaka in bpo-29209(12).) + + * A *note RuntimeError: 6e9. is now raised when the custom metaclass + doesn’t provide the ‘__classcell__’ entry in the namespace passed + to ‘type.__new__’. A *note DeprecationWarning: 2d4. was emitted in + Python 3.6–3.7. (Contributed by Serhiy Storchaka in + bpo-23722(13).) + + * The ‘cProfile.Profile’ class can now be used as a context manager. + (Contributed by Scott Sanderson in bpo-29235(14).) + + * *note shutil.copyfile(): 6a9, *note shutil.copy(): 6aa, *note + shutil.copy2(): 6ab, *note shutil.copytree(): 675. and *note + shutil.move(): 6ac. use platform-specific “fast-copy” syscalls (see + *note Platform-dependent efficient copy operations: 6af. section). + + * *note shutil.copyfile(): 6a9. default buffer size on Windows was + changed from 16 KiB to 1 MiB. + + * The ‘PyGC_Head’ struct has changed completely. All code that + touched the struct member should be rewritten. (See + bpo-33597(15).) + + * The *note PyInterpreterState: 4fa. struct has been moved into the + “internal” header files (specifically + Include/internal/pycore_pystate.h). An opaque ‘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(16).) + + * The *note mmap.flush(): 6f1. method now returns ‘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(17).) + + * *note xml.dom.minidom: 140. and *note xml.sax: 146. modules no + longer process external entities by default. (Contributed by + Christian Heimes in bpo-17239(18).) + + * Deleting a key from a read-only *note dbm: 30. database (*note + dbm.dumb: 31, *note dbm.gnu: 32. or *note dbm.ndbm: 33.) raises + ‘error’ (*note dbm.dumb.error: 6f2, *note dbm.gnu.error: 6f3. or + *note dbm.ndbm.error: 6f4.) instead of *note KeyError: 6f5. + (Contributed by Xiang Zhang in bpo-33106(19).) + + * Simplified AST for literals. All constants will be represented as + *note ast.Constant: 6c0. instances. Instantiating old classes + ‘Num’, ‘Str’, ‘Bytes’, ‘NameConstant’ and ‘Ellipsis’ will return an + instance of ‘Constant’. (Contributed by Serhiy Storchaka in + bpo-32892(20).) + + * *note expanduser(): 65d. on Windows now prefers the ‘USERPROFILE’ + environment variable and does not use ‘HOME’, which is not normally + set for regular user accounts. (Contributed by Anthony Sottile in + bpo-36264(21).) + + * The exception *note asyncio.CancelledError: 61b. now inherits from + *note BaseException: 17d. rather than *note Exception: 61c. and no + longer inherits from *note concurrent.futures.CancelledError: 61d. + (Contributed by Yury Selivanov in bpo-32528(22).) + + * The function *note asyncio.wait_for(): 1d5. now correctly waits for + cancellation when using an instance of *note asyncio.Task: 1e3. + Previously, upon reaching `timeout', it was cancelled and + immediately returned. (Contributed by Elvis Pranskevichus in + bpo-32751(23).) + + * The function *note asyncio.BaseTransport.get_extra_info(): 6f6. now + returns a safe to use socket object when ‘socket’ is passed to the + `name' parameter. (Contributed by Yury Selivanov in + bpo-37027(24).) + + * *note asyncio.BufferedProtocol: 6f7. has graduated to the stable + API. + + * DLL dependencies for extension modules and DLLs loaded with *note + ctypes: 29. on Windows are now resolved more securely. Only the + system paths, the directory containing the DLL or PYD file, and + directories added with *note add_dll_directory(): 62d. are searched + for load-time dependencies. Specifically, ‘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 *note + add_dll_directory(): 62d. 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(25).) + + * 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(26).) + + * *note types.CodeType: 612. has a new parameter in the second + position of the constructor (`posonlyargcount') to support + positional-only arguments defined in PEP 570(27). The first + argument (`argcount') now represents the total number of positional + arguments (including positional-only arguments). The new + ‘replace()’ method of *note types.CodeType: 612. can be used to + make the code future-proof. + + * The parameter ‘digestmod’ for *note hmac.new(): 6f9. no longer uses + the MD5 digest by default. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0529/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37412 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35537 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=34651 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=37951 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36348 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35345 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35892 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31508 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=34160 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32749 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=29209 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29235 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=33597 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=35886 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=2122 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=17239 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=33106 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32892 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=36264 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32528 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32751 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=37027 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=36085 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=36623 + + (27) https://peps.python.org/pep-0570/ + + +File: python.info, Node: Changes in the C API<3>, Next: CPython bytecode changes<4>, Prev: Changes in the Python API<3>, Up: Porting to Python 3 8 + +1.4.10.3 Changes in the C API +............................. + + * The *note PyCompilerFlags: 6fb. structure got a new + `cf_feature_version' field. It should be initialized to + ‘PY_MINOR_VERSION’. The field is ignored by default, and is used + if and only if ‘PyCF_ONLY_AST’ flag is set in `cf_flags'. + (Contributed by Guido van Rossum in bpo-35766(1).) + + * The ‘PyEval_ReInitThreads()’ function has been removed from the C + API. It should not be called explicitly: use *note + PyOS_AfterFork_Child(): 6fc. instead. (Contributed by Victor + Stinner in bpo-36728(2).) + + * On Unix, C extensions are no longer linked to libpython except on + Android and Cygwin. When Python is embedded, ‘libpython’ must not + be loaded with ‘RTLD_LOCAL’, but ‘RTLD_GLOBAL’ instead. + Previously, using ‘RTLD_LOCAL’, it was already not possible to load + C extensions which were not linked to ‘libpython’, like C + extensions of the standard library built by the ‘*shared*’ section + of ‘Modules/Setup’. (Contributed by Victor Stinner in + bpo-21536(3).) + + * Use of ‘#’ variants of formats in parsing or building value (e.g. + *note PyArg_ParseTuple(): 4d9, *note Py_BuildValue(): 4da, *note + PyObject_CallFunction(): 6fd, etc.) without ‘PY_SSIZE_T_CLEAN’ + defined raises ‘DeprecationWarning’ now. It will be removed in + 3.10 or 4.0. Read *note Parsing arguments and building values: + 4db. for detail. (Contributed by Inada Naoki in bpo-36381(4).) + + * Instances of heap-allocated types (such as those created with *note + PyType_FromSpec(): 5b8.) hold a reference to their type object. + Increasing the reference count of these type objects has been moved + from *note PyType_GenericAlloc(): 6bd. to the more low-level + functions, *note PyObject_Init(): 6bc. and ‘PyObject_INIT()’. This + makes types created through *note PyType_FromSpec(): 5b8. behave + like other classes in managed code. + + *note Statically allocated types: 354. 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: + + * Remove *note Py_INCREF: 4cc. on the type object after + allocating an instance - if any. This may happen after + calling *note PyObject_New(): 5db, *note PyObject_NewVar(): + 5dc, *note PyObject_GC_New(): 6fe, *note PyObject_GC_NewVar(): + 6ff, or any other custom allocator that uses *note + PyObject_Init(): 6bc. or ‘PyObject_INIT()’. + + 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; + } + + * Ensure that all custom ‘tp_dealloc’ functions of + heap-allocated types decrease the type’s reference count. + + 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 + } + + (Contributed by Eddie Elizondo in bpo-35810(5).) + + * The *note Py_DEPRECATED(): 700. macro has been implemented for + MSVC. The macro now must be placed before the symbol name. + + Example: + + Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void); + + (Contributed by Zackery Spytz in bpo-33407(6).) + + * The interpreter does not pretend to support binary compatibility of + extension types across feature releases, anymore. A *note + PyTypeObject: 701. exported by a third-party extension module is + supposed to have all the slots expected in the current Python + version, including *note tp_finalize: 702. (*note + Py_TPFLAGS_HAVE_FINALIZE: 703. is not checked anymore before + reading *note tp_finalize: 702.). + + (Contributed by Antoine Pitrou in bpo-32388(7).) + + * The functions ‘PyNode_AddChild()’ and ‘PyParser_AddToken()’ now + accept two additional ‘int’ arguments `end_lineno' and + `end_col_offset'. + + * The ‘libpython38.a’ file to allow MinGW tools to link directly + against ‘python38.dll’ is no longer included in the regular Windows + distribution. If you require this file, it may be generated with + the ‘gendef’ and ‘dlltool’ tools, which are part of the MinGW + binutils package: + + gendef - python38.dll > tmp.def + dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a + + The location of an installed ‘pythonXY.dll’ will depend on the + installation options and the version and language of Windows. See + *note Using Python on Windows: 704. for more information. The + resulting library should be placed in the same directory as + ‘pythonXY.lib’, which is generally the ‘libs’ directory under your + Python installation. + + (Contributed by Steve Dower in bpo-37351(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35766 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36728 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21536 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36381 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35810 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33407 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32388 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37351 + + +File: python.info, Node: CPython bytecode changes<4>, Next: Demos and Tools, Prev: Changes in the C API<3>, Up: Porting to Python 3 8 + +1.4.10.4 CPython bytecode changes +................................. + + * 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 *note break: 706, *note + continue: 609. and *note return: 60e. + + Removed opcodes ‘BREAK_LOOP’, ‘CONTINUE_LOOP’, ‘SETUP_LOOP’ and + ‘SETUP_EXCEPT’. Added new opcodes ‘ROT_FOUR’, ‘BEGIN_FINALLY’, + ‘CALL_FINALLY’ and ‘POP_FINALLY’. Changed the behavior of + ‘END_FINALLY’ and ‘WITH_CLEANUP_START’. + + (Contributed by Mark Shannon, Antoine Pitrou and Serhiy Storchaka + in bpo-17611(1).) + + * Added new opcode *note END_ASYNC_FOR: 707. for handling exceptions + raised when awaiting a next item in an *note async for: 708. loop. + (Contributed by Serhiy Storchaka in bpo-33041(2).) + + * The *note MAP_ADD: 709. 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 PEP 572(3). (Contributed by Jörn + Heissler in bpo-35224(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17611 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33041 + + (3) https://peps.python.org/pep-0572/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35224 + + +File: python.info, Node: Demos and Tools, Prev: CPython bytecode changes<4>, Up: Porting to Python 3 8 + +1.4.10.5 Demos and Tools +........................ + +Added a benchmark script for timing various ways to access variables: +‘Tools/scripts/var_access_benchmark.py’. (Contributed by Raymond +Hettinger in bpo-35884(1).) + +Here’s a summary of performance improvements since Python 3.3: + + 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 + +The benchmarks were measured on an Intel® Core™ i7-4960HQ processor(2) +running the macOS 64-bit builds found at python.org(3). The benchmark +script displays timings in nanoseconds. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35884 + + (2) +https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html + + (3) https://www.python.org/downloads/mac-osx/ + + +File: python.info, Node: Notable changes in Python 3 8 1, Next: Notable changes in Python 3 8 8, Prev: Porting to Python 3 8, Up: What’s New In Python 3 8 + +1.4.11 Notable changes in Python 3.8.1 +-------------------------------------- + +Due to significant security concerns, the `reuse_address' parameter of +*note asyncio.loop.create_datagram_endpoint(): 2fb. is no longer +supported. This is because of the behavior of the socket option +‘SO_REUSEADDR’ in UDP. For more details, see the documentation for +‘loop.create_datagram_endpoint()’. (Contributed by Kyle Stanley, +Antoine Pitrou, and Yury Selivanov in bpo-37228(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37228 + + +File: python.info, Node: Notable changes in Python 3 8 8, Next: Notable changes in Python 3 8 12, Prev: Notable changes in Python 3 8 1, Up: What’s New In Python 3 8 + +1.4.12 Notable changes in Python 3.8.8 +-------------------------------------- + +Earlier Python versions allowed using both ‘;’ and ‘&’ as query +parameter separators in *note urllib.parse.parse_qs(): 452. and *note +urllib.parse.parse_qsl(): 453. Due to security concerns, and to conform +with newer W3C recommendations, this has been changed to allow only a +single separator key, with ‘&’ as the default. This change also affects +*note cgi.parse(): 454. and *note cgi.parse_multipart(): 455. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42967 + + +File: python.info, Node: Notable changes in Python 3 8 12, Prev: Notable changes in Python 3 8 8, Up: What’s New In Python 3 8 + +1.4.13 Notable changes in Python 3.8.12 +--------------------------------------- + +Starting with Python 3.8.12 the *note ipaddress: a0. 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 *note socket.inet_aton(): 5b3. treats +leading zeros as octal notation. glibc implementation of modern *note +inet_pton(): 5b4. does not accept any leading zeros. + +(Originally contributed by Christian Heimes in bpo-36384(1), and +backported to 3.8 by Achraf Merzouki.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36384 + + +File: python.info, Node: What’s New In Python 3 7, Next: What’s New In Python 3 6, Prev: What’s New In Python 3 8, Up: What’s New in Python + +1.5 What’s New In Python 3.7 +============================ + + +Editor: Elvis Pranskevichus <> + +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 +*note changelog: 158. + +* Menu: + +* Summary – Release Highlights:: +* New Features: New Features<8>. +* Other Language Changes: Other Language Changes<5>. +* New Modules: New Modules<5>. +* Improved Modules: Improved Modules<5>. +* C API Changes: C API Changes<4>. +* Build Changes: Build Changes<4>. +* Optimizations: Optimizations<5>. +* Other CPython Implementation Changes: Other CPython Implementation Changes<2>. +* Deprecated Python Behavior:: +* Deprecated Python modules, 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. + + +File: python.info, Node: Summary – Release Highlights, Next: New Features<8>, Up: What’s New In Python 3 7 + +1.5.1 Summary – Release Highlights +---------------------------------- + +New syntax features: + + * *note PEP 563: 711, postponed evaluation of type annotations. + +Backwards incompatible syntax changes: + + * *note async: 2f9. and *note await: 2fa. are now reserved keywords. + +New library modules: + + * *note contextvars: 23.: *note PEP 567 – Context Variables: 712. + + * *note dataclasses: 2e.: *note PEP 557 – Data Classes: 713. + + * *note importlib.resources: 714. + +New built-in features: + + * *note PEP 553: 715, the new *note breakpoint(): 716. function. + +Python data model improvements: + + * *note PEP 562: 717, customization of access to module attributes. + + * *note PEP 560: 718, core support for typing module and generic + types. + + * the insertion-order preservation nature of *note dict: 719. objects + has been declared(1) to be an official part of the Python language + spec. + +Significant improvements in the standard library: + + * The *note asyncio: 9. module has received new features, significant + *note usability and performance improvements: 71a. + + * The *note time: 10c. module gained support for *note functions with + nanosecond resolution: 71b. + +CPython implementation improvements: + + * Avoiding the use of ASCII as a default text encoding: + + * *note PEP 538: 71c, legacy C locale coercion + + * *note PEP 540: 71d, forced UTF-8 runtime mode + + * *note PEP 552: 71e, deterministic .pycs + + * *note New Python Development Mode: 71f. + + * *note PEP 565: 720, improved *note DeprecationWarning: 2d4. + handling + +C API improvements: + + * *note PEP 539: 721, new C API for thread-local storage + +Documentation improvements: + + * *note PEP 545: 722, Python documentation translations + + * New documentation translations: Japanese(2), French(3), and + Korean(4). + +This release features notable performance improvements in many areas. +The *note Optimizations: 723. section lists them in detail. + +For a list of changes that may affect compatibility with previous Python +releases please refer to the *note Porting to Python 3.7: 724. section. + + ---------- Footnotes ---------- + + (1) +https://mail.python.org/pipermail/python-dev/2017-December/151283.html + + (2) https://docs.python.org/ja/ + + (3) https://docs.python.org/fr/ + + (4) https://docs.python.org/ko/ + + +File: python.info, Node: New Features<8>, Next: Other Language Changes<5>, Prev: Summary – Release Highlights, Up: What’s New In Python 3 7 + +1.5.2 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. + + +File: python.info, Node: PEP 563 Postponed Evaluation of Annotations, Next: PEP 538 Legacy C Locale Coercion, Up: New Features<8> + +1.5.2.1 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 PEP 3107(1) and +refined further in PEP 526(2): + + * 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 + + * annotating source code had adverse effects on startup time of + Python programs. + +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 *note +typing.get_type_hints(): 277. 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: + + class C: + @classmethod + def from_string(cls, source: str) -> C: + ... + + def validate_b(self, obj: B) -> bool: + ... + + class B: + ... + +Since this change breaks compatibility, the new behavior needs to be +enabled on a per-module basis in Python 3.7 using a *note __future__: 0. +import: + + from __future__ import annotations + +It will become the default in Python 3.10. + +See also +........ + +PEP 563(3) – Postponed evaluation of annotations + + PEP written and implemented by Łukasz Langa. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3107/ + + (2) https://peps.python.org/pep-0526/ + + (3) https://peps.python.org/pep-0563/ + + +File: python.info, Node: PEP 538 Legacy C Locale Coercion, Next: PEP 540 Forced UTF-8 Runtime Mode, Prev: PEP 563 Postponed Evaluation of Annotations, Up: New Features<8> + +1.5.2.2 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. + +PEP 538(1) 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 *note PYTHONCOERCECLOCALE: +728. environment variable. Automatically setting ‘LC_CTYPE’ this way +means that both the core interpreter and locale-aware C extensions (such +as *note readline: db.) will assume the use of UTF-8 as the default text +encoding, rather than ASCII. + +The platform support definition in PEP 11(2) 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 *note stdin: 729. +and *note stdout: 72a. is now ‘surrogateescape’ (rather than ‘strict’) +when using any of the defined coercion target locales (currently +‘C.UTF-8’, ‘C.utf8’, and ‘UTF-8’). The default error handler for *note +stderr: 581. continues to be ‘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 *note stderr: 581.) can be requested by setting +‘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 PEP 538(3)’s locale coercion has the benefit of also affecting +extension modules (such as GNU ‘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 *note PEP 540; Forced UTF-8 Runtime +Mode: 71d. + +See also +........ + +PEP 538(4) – Coercing the legacy C locale to a UTF-8 based locale + + PEP written and implemented by Nick Coghlan. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0538/ + + (2) https://peps.python.org/pep-0011/ + + (3) https://peps.python.org/pep-0538/ + + (4) https://peps.python.org/pep-0538/ + + +File: python.info, Node: PEP 540 Forced UTF-8 Runtime Mode, Next: PEP 553 Built-in breakpoint, Prev: PEP 538 Legacy C Locale Coercion, Up: New Features<8> + +1.5.2.3 PEP 540: Forced UTF-8 Runtime Mode +.......................................... + +The new *note -X: 174. ‘utf8’ command line option and *note PYTHONUTF8: +72c. environment variable can be used to enable the *note Python UTF-8 +Mode: 229. + +When in UTF-8 mode, CPython ignores the locale settings, and uses the +UTF-8 encoding by default. The error handlers for *note sys.stdin: 729. +and *note sys.stdout: 72a. streams are set to ‘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 PEP 540(1)’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 ‘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 +*note PEP 540; Forced UTF-8 Runtime Mode: 71d.). + +The UTF-8 mode is enabled by default when the locale is ‘C’ or ‘POSIX’, +and the PEP 538(2) locale coercion feature fails to change it to a UTF-8 +based alternative (whether that failure is due to +‘PYTHONCOERCECLOCALE=0’ being set, ‘LC_ALL’ being set, or the lack of a +suitable target locale). + +See also +........ + +PEP 540(3) – Add a new UTF-8 mode + + PEP written and implemented by Victor Stinner + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0540/ + + (2) https://peps.python.org/pep-0538/ + + (3) https://peps.python.org/pep-0540/ + + +File: python.info, Node: PEP 553 Built-in breakpoint, Next: PEP 539 New C API for Thread-Local Storage, Prev: PEP 540 Forced UTF-8 Runtime Mode, Up: New Features<8> + +1.5.2.4 PEP 553: Built-in ‘breakpoint()’ +........................................ + +Python 3.7 includes the new built-in *note breakpoint(): 716. function +as an easy and consistent way to enter the Python debugger. + +Built-in ‘breakpoint()’ calls *note sys.breakpointhook(): 72e. By +default, the latter imports *note pdb: c6. and then calls +‘pdb.set_trace()’, but by binding ‘sys.breakpointhook()’ to the function +of your choosing, ‘breakpoint()’ can enter any debugger. Additionally, +the environment variable *note PYTHONBREAKPOINT: 72f. can be set to the +callable of your debugger of choice. Set ‘PYTHONBREAKPOINT=0’ to +completely disable built-in ‘breakpoint()’. + +See also +........ + +PEP 553(1) – Built-in breakpoint() + + PEP written and implemented by Barry Warsaw + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0553/ + + +File: python.info, Node: PEP 539 New C API for Thread-Local Storage, Next: PEP 562 Customization of Access to Module Attributes, Prev: PEP 553 Built-in breakpoint, Up: New Features<8> + +1.5.2.5 PEP 539: New C API for Thread-Local Storage +................................................... + +While Python provides a C API for thread-local storage support; the +existing *note Thread Local Storage (TLS) API: 731. 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. + +PEP 539(1) changes this by providing a new *note Thread Specific Storage +(TSS) API: 732. 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 *note Py_tss_t: 733. 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. + +See also +........ + +PEP 539(2) – A New C-API for Thread-Local Storage in CPython + + PEP written by Erik M. Bray; implementation by Masayuki Yamamoto. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0539/ + + (2) https://peps.python.org/pep-0539/ + + +File: python.info, Node: PEP 562 Customization of Access to Module Attributes, Next: PEP 564 New Time Functions With Nanosecond Resolution, Prev: PEP 539 New C API for Thread-Local Storage, Up: New Features<8> + +1.5.2.6 PEP 562: Customization of Access to Module Attributes +............................................................. + +Python 3.7 allows defining ‘__getattr__()’ on modules and will call it +whenever a module attribute is otherwise not found. Defining +‘__dir__()’ on modules is now also allowed. + +A typical example of where this may be useful is module attribute +deprecation and lazy loading. + +See also +........ + +PEP 562(1) – Module ‘__getattr__’ and ‘__dir__’ + + PEP written and implemented by Ivan Levkivskyi + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0562/ + + +File: python.info, Node: PEP 564 New Time Functions With Nanosecond Resolution, Next: PEP 565 Show DeprecationWarning in __main__, Prev: PEP 562 Customization of Access to Module Attributes, Up: New Features<8> + +1.5.2.7 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 *note time.time(): +736. function and its variants. To avoid loss of precision, PEP 564(1) +adds six new “nanosecond” variants of the existing timer functions to +the *note time: 10c. module: + + * *note time.clock_gettime_ns(): 737. + + * *note time.clock_settime_ns(): 738. + + * *note time.monotonic_ns(): 739. + + * *note time.perf_counter_ns(): 73a. + + * *note time.process_time_ns(): 73b. + + * *note time.time_ns(): 73c. + +The new functions return the number of nanoseconds as an integer value. + +Measurements(2) show that on Linux and Windows the resolution of *note +time.time_ns(): 73c. is approximately 3 times better than that of *note +time.time(): 736. + +See also +........ + +PEP 564(3) – Add new time functions with nanosecond resolution + + PEP written and implemented by Victor Stinner + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0564/ + + (2) +https://peps.python.org/pep-0564/#annex-clocks-resolution-in-python + + (3) https://peps.python.org/pep-0564/ + + +File: python.info, Node: PEP 565 Show DeprecationWarning in __main__, Next: PEP 560 Core Support for typing module and Generic Types, Prev: PEP 564 New Time Functions With Nanosecond Resolution, Up: New Features<8> + +1.5.2.8 PEP 565: Show DeprecationWarning in ‘__main__’ +...................................................... + +The default handling of *note DeprecationWarning: 2d4. 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 *note __main__: 1. +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: + + * *note FutureWarning: 73e.: always displayed by default, recommended + for warnings intended to be seen by application end users (e.g. + for deprecated application configuration settings). + + * *note DeprecationWarning: 2d4.: displayed by default only in *note + __main__: 1. 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. + + * *note PendingDeprecationWarning: 503.: displayed by default only + when running tests, intended for cases where a future version + upgrade will change the warning category to *note + DeprecationWarning: 2d4. or *note FutureWarning: 73e. + +Previously both *note DeprecationWarning: 2d4. and *note +PendingDeprecationWarning: 503. 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. + +See also +........ + +PEP 565(1) – Show DeprecationWarning in ‘__main__’ + + PEP written and implemented by Nick Coghlan + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0565/ + + +File: python.info, Node: PEP 560 Core Support for typing module and Generic Types, Next: PEP 552 Hash-based pyc Files, Prev: PEP 565 Show DeprecationWarning in __main__, Up: New Features<8> + +1.5.2.9 PEP 560: Core Support for ‘typing’ module and Generic Types +................................................................... + +Initially PEP 484(1) was designed in such way that it would not +introduce `any' changes to the core CPython interpreter. Now type hints +and the *note typing: 123. module are extensively used by the community, +so this restriction is removed. The PEP introduces two special methods +‘__class_getitem__()’ and ‘__mro_entries__’, these methods are now used +by most classes and special constructs in *note typing: 123. 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 *note typing: 123. module are fixed. + +See also +........ + +PEP 560(2) – Core support for typing module and generic types + + PEP written and implemented by Ivan Levkivskyi + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0560/ + + +File: python.info, Node: PEP 552 Hash-based pyc Files, Next: PEP 545 Python Documentation Translations, Prev: PEP 560 Core Support for typing module and Generic Types, Up: New Features<8> + +1.5.2.10 PEP 552: Hash-based .pyc Files +....................................... + +Python has traditionally checked the up-to-dateness of bytecode cache +files (i.e., ‘.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(1) and content-based build systems. + +PEP 552(2) extends the pyc format to allow the hash of the source file +to be used for invalidation instead of the source timestamp. Such +‘.pyc’ files are called “hash-based”. By default, Python still uses +timestamp-based invalidation and does not generate hash-based ‘.pyc’ +files at runtime. Hash-based ‘.pyc’ files may be generated with *note +py_compile: d4. or *note compileall: 1f. + +Hash-based ‘.pyc’ files come in two variants: checked and unchecked. +Python validates checked hash-based ‘.pyc’ files against the +corresponding source files at runtime but doesn’t do so for unchecked +hash-based pycs. Unchecked hash-based ‘.pyc’ files are a useful +performance optimization for environments where a system external to +Python (e.g., the build system) is responsible for keeping ‘.pyc’ files +up-to-date. + +See *note Cached bytecode invalidation: 1bd. for more information. + +See also +........ + +PEP 552(3) – Deterministic pycs + + PEP written and implemented by Benjamin Peterson + + ---------- Footnotes ---------- + + (1) https://reproducible-builds.org/ + + (2) https://peps.python.org/pep-0552/ + + (3) https://peps.python.org/pep-0552/ + + +File: python.info, Node: PEP 545 Python Documentation Translations, Next: Python Development Mode -X dev, Prev: PEP 552 Hash-based pyc Files, Up: New Features<8> + +1.5.2.11 PEP 545: Python Documentation Translations +................................................... + +PEP 545(1) describes the process of creating and maintaining Python +documentation translations. + +Three new translations have been added: + + - Japanese: ‘https://docs.python.org/ja/’ + + - French: ‘https://docs.python.org/fr/’ + + - Korean: ‘https://docs.python.org/ko/’ + +See also +........ + +PEP 545(2) – Python Documentation Translations + + PEP written and implemented by Julien Palard, Inada Naoki, and + Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0545/ + + (2) https://peps.python.org/pep-0545/ + + +File: python.info, Node: Python Development Mode -X dev, Prev: PEP 545 Python Documentation Translations, Up: New Features<8> + +1.5.2.12 Python Development Mode (-X dev) +......................................... + +The new *note -X: 174. ‘dev’ command line option or the new *note +PYTHONDEVMODE: 743. environment variable can be used to enable *note +Python Development Mode: 506. When in development mode, Python performs +additional runtime checks that are too expensive to be enabled by +default. See *note Python Development Mode: 506. documentation for the +full description. + + +File: python.info, Node: Other Language Changes<5>, Next: New Modules<5>, Prev: New Features<8>, Up: What’s New In Python 3 7 + +1.5.3 Other Language Changes +---------------------------- + + * An *note await: 2fa. expression and comprehensions containing an + *note async for: 708. clause were illegal in the expressions in + *note formatted string literals: 5f9. due to a problem with the + implementation. In Python 3.7 this restriction was lifted. + + * 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(1) and bpo-18896(2).) + + * *note bytes.fromhex(): 745. and *note bytearray.fromhex(): 746. now + ignore all ASCII whitespace, not only spaces. (Contributed by + Robert Xiao in bpo-28927(3).) + + * *note str: 1b3, *note bytes: 1b4, and *note bytearray: 1a5. gained + support for the new *note isascii(): 747. method, which can be used + to test if a string or bytes contain only the ASCII characters. + (Contributed by INADA Naoki in bpo-32677(4).) + + * *note ImportError: 511. now displays module name and module + ‘__file__’ path when ‘from ... import ...’ fails. (Contributed by + Matthias Bussonnier in bpo-29546(5).) + + * Circular imports involving absolute imports with binding a + submodule to a name are now supported. (Contributed by Serhiy + Storchaka in bpo-30024(6).) + + * ‘object.__format__(x, '')’ is now equivalent to ‘str(x)’ rather + than ‘format(str(self), '')’. (Contributed by Serhiy Storchaka in + bpo-28974(7).) + + * In order to better support dynamic creation of stack traces, *note + types.TracebackType: 748. can now be instantiated from Python code, + and the ‘tb_next’ attribute on *note tracebacks: 749. is now + writable. (Contributed by Nathaniel J. Smith in bpo-30579(8).) + + * When using the *note -m: 1ae. switch, ‘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(9).) + + * The new *note -X: 174. ‘importtime’ option or the *note + PYTHONPROFILEIMPORTTIME: 74a. environment variable can be used to + show the timing of each module import. (Contributed by Inada Naoki + in bpo-31415(10).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12844 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18896 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28927 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32677 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29546 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30024 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28974 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30579 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33053 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31415 + + +File: python.info, Node: New Modules<5>, Next: Improved Modules<5>, Prev: Other Language Changes<5>, Up: What’s New In Python 3 7 + +1.5.4 New Modules +----------------- + +* Menu: + +* contextvars:: +* dataclasses: dataclasses<3>. +* importlib.resources: importlib resources. + + +File: python.info, Node: contextvars, Next: dataclasses<3>, Up: New Modules<5> + +1.5.4.1 contextvars +................... + +The new *note contextvars: 23. module and a set of *note new C APIs: +74d. introduce support for `context variables'. Context variables are +conceptually similar to thread-local variables. Unlike TLS, context +variables support asynchronous code correctly. + +The *note asyncio: 9. and *note decimal: 34. 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. + +See also +........ + +PEP 567(1) – Context Variables + + PEP written and implemented by Yury Selivanov + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0567/ + + +File: python.info, Node: dataclasses<3>, Next: importlib resources, Prev: contextvars, Up: New Modules<5> + +1.5.4.2 dataclasses +................... + +The new *note dataclass(): 193. 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 +*note __repr__(): 1f4, *note __eq__(): 74f, and *note __hash__(): 750. +are generated automatically. + +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)" + +See also +........ + +PEP 557(1) – Data Classes + + PEP written and implemented by Eric V. Smith + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0557/ + + +File: python.info, Node: importlib resources, Prev: dataclasses<3>, Up: New Modules<5> + +1.5.4.3 importlib.resources +........................... + +The new *note importlib.resources: 9b. 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 ‘get_resource_reader()’ function which returns a +‘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(1). + +See also +........ + +importlib_resources(2) – a PyPI backport for earlier Python versions. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32248 + + (2) https://importlib-resources.readthedocs.io/en/latest/ + + +File: python.info, Node: Improved Modules<5>, Next: C API Changes<4>, Prev: New Modules<5>, Up: What’s New In Python 3 7 + +1.5.5 Improved Modules +---------------------- + +* Menu: + +* argparse: argparse<2>. +* asyncio: asyncio<5>. +* binascii:: +* calendar:: +* collections: collections<2>. +* compileall: compileall<2>. +* concurrent.futures: concurrent futures<2>. +* contextlib: contextlib<3>. +* cProfile: cProfile<2>. +* crypt:: +* datetime: datetime<4>. +* dbm:: +* decimal:: +* dis:: +* distutils: distutils<3>. +* enum: enum<3>. +* functools: functools<3>. +* gc: gc<4>. +* hmac: hmac<2>. +* http.client: http client. +* http.server: http server. +* idlelib and IDLE:: +* importlib: importlib<2>. +* io: io<2>. +* ipaddress: ipaddress<2>. +* itertools: itertools<3>. +* locale: locale<2>. +* logging: logging<3>. +* math: math<4>. +* mimetypes:: +* msilib:: +* multiprocessing: multiprocessing<3>. +* os: os<5>. +* pathlib: pathlib<5>. +* pdb: pdb<2>. +* py_compile: py_compile<3>. +* pydoc: pydoc<2>. +* queue:: +* re: re<2>. +* signal: signal<2>. +* socket: socket<5>. +* socketserver:: +* sqlite3: sqlite3<3>. +* ssl: ssl<3>. +* string: string<2>. +* subprocess:: +* sys: sys<5>. +* time: time<4>. +* tkinter: tkinter<3>. +* tracemalloc: tracemalloc<2>. +* types: types<2>. +* unicodedata: unicodedata<4>. +* unittest: unittest<4>. +* unittest.mock: unittest mock. +* urllib.parse: urllib parse<3>. +* uu:: +* uuid:: +* warnings: warnings<2>. +* xml.etree: xml etree. +* xmlrpc.server: xmlrpc server. +* zipapp:: +* zipfile: zipfile<2>. + + +File: python.info, Node: argparse<2>, Next: asyncio<5>, Up: Improved Modules<5> + +1.5.5.1 argparse +................ + +The new *note ArgumentParser.parse_intermixed_args(): 754. method allows +intermixing options and positional arguments. (Contributed by paul.j3 +in bpo-14191(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14191 + + +File: python.info, Node: asyncio<5>, Next: binascii, Prev: argparse<2>, Up: Improved Modules<5> + +1.5.5.2 asyncio +............... + +The *note asyncio: 9. module has received many new features, usability +and *note performance improvements: 756. Notable changes include: + + * The new *note provisional: 757. *note asyncio.run(): 1d7. 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(1).) + + * asyncio gained support for *note contextvars: 23. *note + loop.call_soon(): 758, *note loop.call_soon_threadsafe(): 759, + *note loop.call_later(): 75a, *note loop.call_at(): 75b, and *note + Future.add_done_callback(): 75c. have a new optional keyword-only + `context' parameter. *note Tasks: 1e3. now track their context + automatically. See PEP 567(2) for more details. (Contributed by + Yury Selivanov in bpo-32436(3).) + + * The new *note asyncio.create_task(): 1d2. function has been added + as a shortcut to ‘asyncio.get_event_loop().create_task()’. + (Contributed by Andrew Svetlov in bpo-32311(4).) + + * The new *note loop.start_tls(): 75d. method can be used to upgrade + an existing connection to TLS. (Contributed by Yury Selivanov in + bpo-23749(5).) + + * The new *note loop.sock_recv_into(): 75e. 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(6).) + + * The new *note asyncio.current_task(): 5a7. function returns the + currently running *note Task: 1e3. instance, and the new *note + asyncio.all_tasks(): 5a8. function returns a set of all existing + ‘Task’ instances in a given loop. The ‘Task.current_task()’ and + ‘Task.all_tasks()’ methods have been deprecated. (Contributed by + Andrew Svetlov in bpo-32250(7).) + + * The new `provisional' *note BufferedProtocol: 6f7. class allows + implementing streaming protocols with manual control over the + receive buffer. (Contributed by Yury Selivanov in bpo-32251(8).) + + * The new *note asyncio.get_running_loop(): 476. function returns the + currently running loop, and raises a *note RuntimeError: 6e9. if no + loop is running. This is in contrast with *note + asyncio.get_event_loop(): 475, which will `create' a new event loop + if none is running. (Contributed by Yury Selivanov in + bpo-32269(9).) + + * The new *note StreamWriter.wait_closed(): 75f. coroutine method + allows waiting until the stream writer is closed. The new *note + StreamWriter.is_closing(): 760. method can be used to determine if + the writer is closing. (Contributed by Andrew Svetlov in + bpo-32391(10).) + + * The new *note loop.sock_sendfile(): 761. coroutine method allows + sending files using *note os.sendfile: 762. when possible. + (Contributed by Andrew Svetlov in bpo-32410(11).) + + * The new *note Future.get_loop(): 763. and ‘Task.get_loop()’ methods + return the instance of the loop on which a task or a future were + created. *note Server.get_loop(): 764. allows doing the same for + *note asyncio.Server: 765. objects. (Contributed by Yury Selivanov + in bpo-32415(12) and Srinivas Reddy Thatiparthy in bpo-32418(13).) + + * It is now possible to control how instances of *note + asyncio.Server: 765. begin serving. Previously, the server would + start serving immediately when created. The new `start_serving' + keyword argument to *note loop.create_server(): 766. and *note + loop.create_unix_server(): 767, as well as *note + Server.start_serving(): 768, and *note Server.serve_forever(): 769. + can be used to decouple server instantiation and serving. The new + *note Server.is_serving(): 76a. method returns ‘True’ if the server + is serving. *note Server: 765. objects are now asynchronous + context managers: + + srv = await loop.create_server(...) + + async with srv: + # some code + + # At this point, srv is closed and no longer accepts new connections. + + (Contributed by Yury Selivanov in bpo-32662(14).) + + * Callback objects returned by *note loop.call_later(): 75a. gained + the new *note when(): 76b. method which returns an absolute + scheduled callback timestamp. (Contributed by Andrew Svetlov in + bpo-32741(15).) + + * The *note loop.create_datagram_endpoint(): 2fb. method gained + support for Unix sockets. (Contributed by Quentin Dawans in + bpo-31245(16).) + + * The *note asyncio.open_connection(): 76c, *note + asyncio.start_server(): 76d. functions, *note + loop.create_connection(): 1da, *note loop.create_server(): 766, + *note loop.create_accepted_socket(): 76e. methods and their + corresponding UNIX socket variants now accept the + `ssl_handshake_timeout' keyword argument. (Contributed by Neil + Aspinall in bpo-29970(17).) + + * The new *note Handle.cancelled(): 76f. method returns ‘True’ if the + callback was cancelled. (Contributed by Marat Sharafutdinov in + bpo-31943(18).) + + * The asyncio source has been converted to use the *note async: + 2f9./*note await: 2fa. syntax. (Contributed by Andrew Svetlov in + bpo-32193(19).) + + * The new *note ReadTransport.is_reading(): 770. method can be used + to determine the reading state of the transport. Additionally, + calls to *note ReadTransport.resume_reading(): 771. and *note + ReadTransport.pause_reading(): 772. are now idempotent. + (Contributed by Yury Selivanov in bpo-32356(20).) + + * Loop methods which accept socket paths now support passing *note + path-like objects: 773. (Contributed by Yury Selivanov in + bpo-32066(21).) + + * In *note asyncio: 9. TCP sockets on Linux are now created with + ‘TCP_NODELAY’ flag set by default. (Contributed by Yury Selivanov + and Victor Stinner in bpo-27456(22).) + + * Exceptions occurring in cancelled tasks are no longer logged. + (Contributed by Yury Selivanov in bpo-30508(23).) + + * New ‘WindowsSelectorEventLoopPolicy’ and + ‘WindowsProactorEventLoopPolicy’ classes. (Contributed by Yury + Selivanov in bpo-33792(24).) + +Several ‘asyncio’ APIs have been *note deprecated: 774. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32314 + + (2) https://peps.python.org/pep-0567/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32436 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32311 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23749 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31819 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32250 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32251 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32269 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32391 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32410 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32415 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32418 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32662 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=32741 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=31245 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=29970 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31943 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=32193 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32356 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32066 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=27456 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=30508 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=33792 + + +File: python.info, Node: binascii, Next: calendar, Prev: asyncio<5>, Up: Improved Modules<5> + +1.5.5.3 binascii +................ + +The *note b2a_uu(): 776. function now accepts an optional `backtick' +keyword argument. When it’s true, zeros are represented by ‘'`'’ +instead of spaces. (Contributed by Xiang Zhang in bpo-30103(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30103 + + +File: python.info, Node: calendar, Next: collections<2>, Prev: binascii, Up: Improved Modules<5> + +1.5.5.4 calendar +................ + +The *note HTMLCalendar: 778. class has new class attributes which ease +the customization of CSS classes in the produced HTML calendar. +(Contributed by Oz Tiram in bpo-30095(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30095 + + +File: python.info, Node: collections<2>, Next: compileall<2>, Prev: calendar, Up: Improved Modules<5> + +1.5.5.5 collections +................... + +‘collections.namedtuple()’ now supports default values. (Contributed by +Raymond Hettinger in bpo-32320(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32320 + + +File: python.info, Node: compileall<2>, Next: concurrent futures<2>, Prev: collections<2>, Up: Improved Modules<5> + +1.5.5.6 compileall +.................. + +*note compileall.compile_dir(): 77b. learned the new `invalidation_mode' +parameter, which can be used to enable *note hash-based .pyc +invalidation: 71e. The invalidation mode can also be specified on the +command line using the new ‘--invalidation-mode’ argument. (Contributed +by Benjamin Peterson in bpo-31650(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31650 + + +File: python.info, Node: concurrent futures<2>, Next: contextlib<3>, Prev: compileall<2>, Up: Improved Modules<5> + +1.5.5.7 concurrent.futures +.......................... + +*note ProcessPoolExecutor: 52e. and *note ThreadPoolExecutor: 311. now +support the new `initializer' and `initargs' constructor arguments. +(Contributed by Antoine Pitrou in bpo-21423(1).) + +The *note ProcessPoolExecutor: 52e. can now take the multiprocessing +context via the new `mp_context' argument. (Contributed by Thomas +Moreau in bpo-31540(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21423 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31540 + + +File: python.info, Node: contextlib<3>, Next: cProfile<2>, Prev: concurrent futures<2>, Up: Improved Modules<5> + +1.5.5.8 contextlib +.................. + +The new *note nullcontext(): 3e0. is a simpler and faster no-op context +manager than *note ExitStack: 77e. (Contributed by Jesse-Bakker in +bpo-10049(1).) + +The new *note asynccontextmanager(): 77f, *note +AbstractAsyncContextManager: 780, and *note AsyncExitStack: 781. have +been added to complement their synchronous counterparts. (Contributed +by Jelle Zijlstra in bpo-29679(2) and bpo-30241(3), and by Alexander +Mohr and Ilya Kulakov in bpo-29302(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10049 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29679 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30241 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29302 + + +File: python.info, Node: cProfile<2>, Next: crypt, Prev: contextlib<3>, Up: Improved Modules<5> + +1.5.5.9 cProfile +................ + +The *note cProfile: 26. command line now accepts ‘-m module_name’ as an +alternative to script path. (Contributed by Sanyam Khurana in +bpo-21862(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21862 + + +File: python.info, Node: crypt, Next: datetime<4>, Prev: cProfile<2>, Up: Improved Modules<5> + +1.5.5.10 crypt +.............. + +The *note crypt: 27. module now supports the Blowfish hashing method. +(Contributed by Serhiy Storchaka in bpo-31664(1).) + +The *note mksalt(): 784. function now allows specifying the number of +rounds for hashing. (Contributed by Serhiy Storchaka in bpo-31702(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31664 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31702 + + +File: python.info, Node: datetime<4>, Next: dbm, Prev: crypt, Up: Improved Modules<5> + +1.5.5.11 datetime +................. + +The new *note datetime.fromisoformat(): 1ef. method constructs a *note +datetime: 4be. object from a string in one of the formats output by +*note datetime.isoformat(): 786. (Contributed by Paul Ganssle in +bpo-15873(1).) + +The *note tzinfo: 1ab. class now supports sub-minute offsets. +(Contributed by Alexander Belopolsky in bpo-5288(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15873 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5288 + + +File: python.info, Node: dbm, Next: decimal, Prev: datetime<4>, Up: Improved Modules<5> + +1.5.5.12 dbm +............ + +*note dbm.dumb: 31. now supports reading read-only files and no longer +writes the index file when it is not changed. + + +File: python.info, Node: decimal, Next: dis, Prev: dbm, Up: Improved Modules<5> + +1.5.5.13 decimal +................ + +The *note decimal: 34. module now uses *note context variables: 712. to +store the decimal context. (Contributed by Yury Selivanov in +bpo-32630(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32630 + + +File: python.info, Node: dis, Next: distutils<3>, Prev: decimal, Up: Improved Modules<5> + +1.5.5.14 dis +............ + +The *note dis(): 78a. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11822 + + +File: python.info, Node: distutils<3>, Next: enum<3>, Prev: dis, Up: Improved Modules<5> + +1.5.5.15 distutils +.................. + +‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11913 + + +File: python.info, Node: enum<3>, Next: functools<3>, Prev: distutils<3>, Up: Improved Modules<5> + +1.5.5.16 enum +............. + +The *note Enum: 20c. learned the new ‘_ignore_’ class property, which +allows listing the names of properties which should not become enum +members. (Contributed by Ethan Furman in bpo-31801(1).) + +In Python 3.8, attempting to check for non-Enum objects in ‘Enum’ +classes will raise a *note TypeError: 19c. (e.g. ‘1 in Color’); +similarly, attempting to check for non-Flag objects in a ‘Flag’ member +will raise *note TypeError: 19c. (e.g. ‘1 in Perm.RW’); currently, both +operations return *note False: 78d. instead and are deprecated. +(Contributed by Ethan Furman in bpo-33217(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31801 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33217 + + +File: python.info, Node: functools<3>, Next: gc<4>, Prev: enum<3>, Up: Improved Modules<5> + +1.5.5.17 functools +.................. + +*note functools.singledispatch(): 212. now supports registering +implementations using type annotations. (Contributed by Łukasz Langa in +bpo-32227(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32227 + + +File: python.info, Node: gc<4>, Next: hmac<2>, Prev: functools<3>, Up: Improved Modules<5> + +1.5.5.18 gc +........... + +The new *note gc.freeze(): 790. function allows freezing all objects +tracked by the garbage collector and excluding them from future +collections. This can be used before a POSIX ‘fork()’ call to make the +GC copy-on-write friendly or to speed up collection. The new *note +gc.unfreeze(): 791. functions reverses this operation. Additionally, +*note gc.get_freeze_count(): 792. can be used to obtain the number of +frozen objects. (Contributed by Li Zekun in bpo-31558(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31558 + + +File: python.info, Node: hmac<2>, Next: http client, Prev: gc<4>, Up: Improved Modules<5> + +1.5.5.19 hmac +............. + +The *note hmac: 8a. module now has an optimized one-shot *note digest(): +794. function, which is up to three times faster than ‘HMAC()’. +(Contributed by Christian Heimes in bpo-32433(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32433 + + +File: python.info, Node: http client, Next: http server, Prev: hmac<2>, Up: Improved Modules<5> + +1.5.5.20 http.client +.................... + +*note HTTPConnection: 796. and *note HTTPSConnection: 797. now support +the new `blocksize' argument for improved upload throughput. +(Contributed by Nir Soffer in bpo-31945(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31945 + + +File: python.info, Node: http server, Next: idlelib and IDLE, Prev: http client, Up: Improved Modules<5> + +1.5.5.21 http.server +.................... + +*note SimpleHTTPRequestHandler: 799. now supports the HTTP +‘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(1).) + +*note SimpleHTTPRequestHandler: 799. accepts the new `directory' +argument, in addition to the new ‘--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(2).) + +The new *note ThreadingHTTPServer: 79a. class uses threads to handle +requests using ‘ThreadingMixin’. It is used when ‘http.server’ is run +with ‘-m’. (Contributed by Julien Palard in bpo-31639(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29654 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28707 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31639 + + +File: python.info, Node: idlelib and IDLE, Next: importlib<2>, Prev: http server, Up: Improved Modules<5> + +1.5.5.22 idlelib and IDLE +......................... + +Multiple fixes for autocompletion. (Contributed by Louie Lu in +bpo-15786(1).) + +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(2).) + +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(3).) The sample can be +edited to include other characters. (Contributed by Serhiy Storchaka in +bpo-31860(4).) + +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(5).) + +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(6), bpo-33768(7), and bpo-33679(8).) + +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(9).) + +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(10).) + +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(11) and bpo-37627(12).) + +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(13).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15786 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1612262 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13802 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31860 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27099 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33642 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33768 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33679 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33656 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=1529353 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=5680 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=37627 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=17535 + + +File: python.info, Node: importlib<2>, Next: io<2>, Prev: idlelib and IDLE, Up: Improved Modules<5> + +1.5.5.23 importlib +.................. + +The ‘importlib.abc.ResourceReader’ ABC was introduced to support the +loading of resources from packages. See also *note importlib.resources: +714. (Contributed by Barry Warsaw, Brett Cannon in bpo-32248(1).) + +*note importlib.reload(): 79d. now raises *note ModuleNotFoundError: +79e. if the module lacks a spec. (Contributed by Garvit Khatri in +bpo-29851(2).) + +‘importlib.find_spec()’ now raises *note ModuleNotFoundError: 79e. +instead of *note AttributeError: 19d. if the specified parent module is +not a package (i.e. lacks a ‘__path__’ attribute). (Contributed by +Milan Oberkirch in bpo-30436(3).) + +The new ‘importlib.source_hash()’ can be used to compute the hash of the +passed source. A *note hash-based .pyc file: 71e. embeds the value +returned by this function. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32248 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29851 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30436 + + +File: python.info, Node: io<2>, Next: ipaddress<2>, Prev: importlib<2>, Up: Improved Modules<5> + +1.5.5.24 io +........... + +The new *note TextIOWrapper.reconfigure(): 7a0. method can be used to +reconfigure the text stream with the new settings. (Contributed by +Antoine Pitrou in bpo-30526(1) and INADA Naoki in bpo-15216(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30526 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=15216 + + +File: python.info, Node: ipaddress<2>, Next: itertools<3>, Prev: io<2>, Up: Improved Modules<5> + +1.5.5.25 ipaddress +.................. + +The new ‘subnet_of()’ and ‘supernet_of()’ methods of *note +ipaddress.IPv6Network: 7a2. and *note ipaddress.IPv4Network: 7a3. can be +used for network containment tests. (Contributed by Michel Albert and +Cheryl Sabella in bpo-20825(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20825 + + +File: python.info, Node: itertools<3>, Next: locale<2>, Prev: ipaddress<2>, Up: Improved Modules<5> + +1.5.5.26 itertools +.................. + +*note itertools.islice(): 7a5. now accepts *note integer-like objects: +3bf. as start, stop, and slice arguments. (Contributed by Will Roberts +in bpo-30537(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30537 + + +File: python.info, Node: locale<2>, Next: logging<3>, Prev: itertools<3>, Up: Improved Modules<5> + +1.5.5.27 locale +............... + +The new `monetary' argument to *note locale.format_string(): 7a7. can be +used to make the conversion use monetary thousands separators and +grouping strings. (Contributed by Garvit in bpo-10379(1).) + +The *note locale.getpreferredencoding(): 2df. function now always +returns ‘'UTF-8'’ on Android or when in the *note forced UTF-8 mode: +71d. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10379 + + +File: python.info, Node: logging<3>, Next: math<4>, Prev: locale<2>, Up: Improved Modules<5> + +1.5.5.28 logging +................ + +*note Logger: 7a9. instances can now be pickled. (Contributed by Vinay +Sajip in bpo-30520(1).) + +The new *note StreamHandler.setStream(): 7aa. method can be used to +replace the logger stream after handler creation. (Contributed by Vinay +Sajip in bpo-30522(2).) + +It is now possible to specify keyword arguments to handler constructors +in configuration passed to *note logging.config.fileConfig(): 7ab. +(Contributed by Preston Landers in bpo-31080(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30520 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30522 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31080 + + +File: python.info, Node: math<4>, Next: mimetypes, Prev: logging<3>, Up: Improved Modules<5> + +1.5.5.29 math +............. + +The new *note math.remainder(): 7ad. function implements the IEEE +754-style remainder operation. (Contributed by Mark Dickinson in +bpo-29962(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29962 + + +File: python.info, Node: mimetypes, Next: msilib, Prev: math<4>, Up: Improved Modules<5> + +1.5.5.30 mimetypes +.................. + +The MIME type of .bmp has been changed from ‘'image/x-ms-bmp'’ to +‘'image/bmp'’. (Contributed by Nitish Chandra in bpo-22589(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22589 + + +File: python.info, Node: msilib, Next: multiprocessing<3>, Prev: mimetypes, Up: Improved Modules<5> + +1.5.5.31 msilib +............... + +The new *note Database.Close(): 7b0. method can be used to close the MSI +database. (Contributed by Berker Peksag in bpo-20486(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20486 + + +File: python.info, Node: multiprocessing<3>, Next: os<5>, Prev: msilib, Up: Improved Modules<5> + +1.5.5.32 multiprocessing +........................ + +The new *note Process.close(): 7b2. method explicitly closes the process +object and releases all resources associated with it. *note ValueError: +1c8. is raised if the underlying process is still running. (Contributed +by Antoine Pitrou in bpo-30596(1).) + +The new *note Process.kill(): 7b3. method can be used to terminate the +process using the ‘SIGKILL’ signal on Unix. (Contributed by Vitor +Pereira in bpo-30794(2).) + +Non-daemonic threads created by *note Process: 7b4. are now joined on +process exit. (Contributed by Antoine Pitrou in bpo-18966(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30596 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30794 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18966 + + +File: python.info, Node: os<5>, Next: pathlib<5>, Prev: multiprocessing<3>, Up: Improved Modules<5> + +1.5.5.33 os +........... + +*note os.fwalk(): 7b6. now accepts the `path' argument as *note bytes: +1b4. (Contributed by Serhiy Storchaka in bpo-28682(1).) + +*note os.scandir(): 6b0. gained support for *note file descriptors: 7b7. +(Contributed by Serhiy Storchaka in bpo-25996(2).) + +The new *note register_at_fork(): 7b8. function allows registering +Python callbacks to be executed at process fork. (Contributed by +Antoine Pitrou in bpo-16500(3).) + +Added *note os.preadv(): 7b9. (combine the functionality of *note +os.readv(): 7ba. and *note os.pread(): 7bb.) and *note os.pwritev(): +7bc. functions (combine the functionality of *note os.writev(): 7bd. and +*note os.pwrite(): 7be.). (Contributed by Pablo Galindo in +bpo-31368(4).) + +The mode argument of *note os.makedirs(): 7bf. no longer affects the +file permission bits of newly created intermediate-level directories. +(Contributed by Serhiy Storchaka in bpo-19930(5).) + +*note os.dup2(): 7c0. now returns the new file descriptor. Previously, +‘None’ was always returned. (Contributed by Benjamin Peterson in +bpo-32441(6).) + +The structure returned by *note os.stat(): 653. now contains the *note +st_fstype: 7c1. attribute on Solaris and its derivatives. (Contributed +by Jesús Cea Avión in bpo-32659(7).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28682 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25996 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16500 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31368 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=19930 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32441 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32659 + + +File: python.info, Node: pathlib<5>, Next: pdb<2>, Prev: os<5>, Up: Improved Modules<5> + +1.5.5.34 pathlib +................ + +The new *note Path.is_mount(): 663. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30897 + + +File: python.info, Node: pdb<2>, Next: py_compile<3>, Prev: pathlib<5>, Up: Improved Modules<5> + +1.5.5.35 pdb +............ + +*note pdb.set_trace(): 7c4. 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(1).) + +*note pdb: c6. command line now accepts ‘-m module_name’ as an +alternative to script file. (Contributed by Mario Corchero in +bpo-32206(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31389 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32206 + + +File: python.info, Node: py_compile<3>, Next: pydoc<2>, Prev: pdb<2>, Up: Improved Modules<5> + +1.5.5.36 py_compile +................... + +*note py_compile.compile(): 671. – and by extension, *note compileall: +1f. – now respects the ‘SOURCE_DATE_EPOCH’ environment variable by +unconditionally creating ‘.pyc’ files for hash-based validation. This +allows for guaranteeing reproducible builds(1) of ‘.pyc’ files when they +are created eagerly. (Contributed by Bernhard M. Wiedemann in +bpo-29708(2).) + + ---------- Footnotes ---------- + + (1) https://reproducible-builds.org/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29708 + + +File: python.info, Node: pydoc<2>, Next: queue, Prev: py_compile<3>, Up: Improved Modules<5> + +1.5.5.37 pydoc +.............. + +The pydoc server can now bind to an arbitrary hostname specified by the +new ‘-n’ command-line argument. (Contributed by Feanil Patel in +bpo-31128(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31128 + + +File: python.info, Node: queue, Next: re<2>, Prev: pydoc<2>, Up: Improved Modules<5> + +1.5.5.38 queue +.............. + +The new *note SimpleQueue: 7c8. class is an unbounded FIFO queue. +(Contributed by Antoine Pitrou in bpo-14976(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14976 + + +File: python.info, Node: re<2>, Next: signal<2>, Prev: queue, Up: Improved Modules<5> + +1.5.5.39 re +........... + +The flags *note re.ASCII: 207, *note re.LOCALE: 7ca. and ‘re.UNICODE’ +can be set within the scope of a group. (Contributed by Serhiy +Storchaka in bpo-31690(1).) + +*note re.split(): 7cb. now supports splitting on a pattern like ‘r'\b'’, +‘'^$'’ or ‘(?=-)’ that matches an empty string. (Contributed by Serhiy +Storchaka in bpo-25054(2).) + +Regular expressions compiled with the *note re.LOCALE: 7ca. 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(3).) + +*note FutureWarning: 73e. 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(4).) + +Compiled regular expression and match objects can now be copied using +*note copy.copy(): 7cc. and *note copy.deepcopy(): 7cd. (Contributed by +Serhiy Storchaka in bpo-10076(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31690 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25054 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30215 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30349 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=10076 + + +File: python.info, Node: signal<2>, Next: socket<5>, Prev: re<2>, Up: Improved Modules<5> + +1.5.5.40 signal +............... + +The new `warn_on_full_buffer' argument to the *note +signal.set_wakeup_fd(): 7cf. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30050 + + +File: python.info, Node: socket<5>, Next: socketserver, Prev: signal<2>, Up: Improved Modules<5> + +1.5.5.41 socket +............... + +The new *note socket.getblocking(): 7d1. method returns ‘True’ if the +socket is in blocking mode and ‘False’ otherwise. (Contributed by Yury +Selivanov in bpo-32373(1).) + +The new *note socket.close(): 7d2. function closes the passed socket +file descriptor. This function should be used instead of *note +os.close(): 7d3. for better compatibility across platforms. +(Contributed by Christian Heimes in bpo-32454(2).) + +The *note socket: ec. module now exposes the ‘socket.TCP_CONGESTION’ +(Linux 2.6.13), ‘socket.TCP_USER_TIMEOUT’ (Linux 2.6.37), and +‘socket.TCP_NOTSENT_LOWAT’ (Linux 3.12) constants. (Contributed by Omar +Sandoval in bpo-26273(3) and Nathaniel J. Smith in bpo-29728(4).) + +Support for *note socket.AF_VSOCK: 7d4. sockets has been added to allow +communication between virtual machines and their hosts. (Contributed by +Cathy Avery in bpo-27584(5).) + +Sockets now auto-detect family, type and protocol from file descriptor +by default. (Contributed by Christian Heimes in bpo-28134(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32373 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32454 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26273 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29728 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27584 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28134 + + +File: python.info, Node: socketserver, Next: sqlite3<3>, Prev: socket<5>, Up: Improved Modules<5> + +1.5.5.42 socketserver +..................... + +‘socketserver.ThreadingMixIn.server_close()’ now waits until all +non-daemon threads complete. ‘socketserver.ForkingMixIn.server_close()’ +now waits until all child processes complete. + +Add a new ‘socketserver.ForkingMixIn.block_on_close’ class attribute to +*note socketserver.ForkingMixIn: 7d6. and *note +socketserver.ThreadingMixIn: 7d7. classes. Set the class attribute to +‘False’ to get the pre-3.7 behaviour. + + +File: python.info, Node: sqlite3<3>, Next: ssl<3>, Prev: socketserver, Up: Improved Modules<5> + +1.5.5.43 sqlite3 +................ + +*note sqlite3.Connection: 24c. now exposes the *note backup(): 7d9. +method when the underlying SQLite library is at version 3.6.11 or +higher. (Contributed by Lele Gaifax in bpo-27645(1).) + +The `database' argument of *note sqlite3.connect(): 7da. now accepts any +*note path-like object: 773, instead of just a string. (Contributed by +Anders Lorentsen in bpo-31843(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27645 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31843 + + +File: python.info, Node: ssl<3>, Next: string<2>, Prev: sqlite3<3>, Up: Improved Modules<5> + +1.5.5.44 ssl +............ + +The *note ssl: f0. module now uses OpenSSL’s builtin API instead of +*note match_hostname(): 492. 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 *note +SSLCertVerificationError: 7dc. and aborts the handshake with a proper +TLS Alert message. The new exception contains additional information. +Host name validation can be customized with *note +SSLContext.hostname_checks_common_name: 7dd. (Contributed by Christian +Heimes in bpo-31399(1).) + + 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 *note Platform + Support Removals: 7de. for more details). The ssl module is mostly + compatible with LibreSSL 2.7.2 and newer. + +The ‘ssl’ module no longer sends IP addresses in SNI TLS extension. +(Contributed by Christian Heimes in bpo-32185(2).) + +*note match_hostname(): 492. no longer supports partial wildcards like +‘www*.example.org’. (Contributed by Mandeep Singh in bpo-23033(3) and +Christian Heimes in bpo-31399(4).) + +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 updates. +Default cipher suite selection can be configured at compile time. +(Contributed by Christian Heimes in bpo-31429(5).) + +Validation of server certificates containing internationalized domain +names (IDNs) is now supported. As part of this change, the *note +SSLSocket.server_hostname: 7df. attribute now stores the expected +hostname in A-label form (‘"xn--pythn-mua.org"’), rather than the +U-label form (‘"pythön.org"’). (Contributed by Nathaniel J. Smith and +Christian Heimes in bpo-28414(6).) + +The ‘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 *note TLS 1.3: 7e0. (Contributed by Christian Heimes +in bpo-32947(7), bpo-20995(8), bpo-29136(9), bpo-30622(10) and +bpo-33618(11)) + +*note SSLSocket: 52a. and *note SSLObject: 7e1. no longer have a public +constructor. Direct instantiation was never a documented and supported +feature. Instances must be created with *note SSLContext: 430. methods +*note wrap_socket(): 491. and *note wrap_bio(): 7e2. (Contributed by +Christian Heimes in bpo-32951(12)) + +OpenSSL 1.1 APIs for setting the minimum and maximum TLS protocol +version are available as *note SSLContext.minimum_version: 7e3. and +*note SSLContext.maximum_version: 7e4. Supported protocols are +indicated by several new flags, such as *note HAS_TLSv1_1: 7e5. +(Contributed by Christian Heimes in bpo-32609(13).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31399 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32185 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23033 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31399 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31429 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28414 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32947 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=20995 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=29136 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=30622 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33618 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32951 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32609 + + +File: python.info, Node: string<2>, Next: subprocess, Prev: ssl<3>, Up: Improved Modules<5> + +1.5.5.45 string +............... + +*note string.Template: 259. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1198569 + + +File: python.info, Node: subprocess, Next: sys<5>, Prev: string<2>, Up: Improved Modules<5> + +1.5.5.46 subprocess +................... + +The *note subprocess.run(): 7e8. function accepts the new +`capture_output' keyword argument. When true, stdout and stderr will be +captured. This is equivalent to passing *note subprocess.PIPE: 7e9. as +`stdout' and `stderr' arguments. (Contributed by Bo Bayles in +bpo-32102(1).) + +The ‘subprocess.run’ function and the *note subprocess.Popen: 6e8. +constructor now accept the `text' keyword argument as an alias to +`universal_newlines'. (Contributed by Andrew Clegg in bpo-31756(2).) + +On Windows the default for `close_fds' was changed from ‘False’ to +‘True’ when redirecting the standard handles. It’s now possible to set +`close_fds' to true when redirecting the standard handles. See *note +subprocess.Popen: 6e8. This means that `close_fds' now defaults to +‘True’ on all supported platforms. (Contributed by Segev Finer in +bpo-19764(3).) + +The subprocess module is now more graceful when handling *note +KeyboardInterrupt: 611. during *note subprocess.call(): 7ea, *note +subprocess.run(): 7e8, or in a *note Popen: 6e8. context manager. It +now waits a short amount of time for the child to exit, before +continuing the handling of the ‘KeyboardInterrupt’ exception. +(Contributed by Gregory P. Smith in bpo-25942(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32102 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31756 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19764 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25942 + + +File: python.info, Node: sys<5>, Next: time<4>, Prev: subprocess, Up: Improved Modules<5> + +1.5.5.47 sys +............ + +The new *note sys.breakpointhook(): 72e. hook function is called by the +built-in *note breakpoint(): 716. (Contributed by Barry Warsaw in +bpo-31353(1).) + +On Android, the new *note sys.getandroidapilevel(): 7ec. returns the +build-time Android API version. (Contributed by Victor Stinner in +bpo-28740(2).) + +The new *note sys.get_coroutine_origin_tracking_depth(): 7ed. function +returns the current coroutine origin tracking depth, as set by the new +*note sys.set_coroutine_origin_tracking_depth(): 7ee. *note asyncio: 9. +has been converted to use this new API instead of the deprecated +‘sys.set_coroutine_wrapper()’. (Contributed by Nathaniel J. Smith in +bpo-32591(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31353 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28740 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32591 + + +File: python.info, Node: time<4>, Next: tkinter<3>, Prev: sys<5>, Up: Improved Modules<5> + +1.5.5.48 time +............. + +PEP 564(1) adds six new functions with nanosecond resolution to the +*note time: 10c. module: + + * *note time.clock_gettime_ns(): 737. + + * *note time.clock_settime_ns(): 738. + + * *note time.monotonic_ns(): 739. + + * *note time.perf_counter_ns(): 73a. + + * *note time.process_time_ns(): 73b. + + * *note time.time_ns(): 73c. + +New clock identifiers have been added: + + * *note time.CLOCK_BOOTTIME: 7f0. (Linux): Identical to *note + time.CLOCK_MONOTONIC: 263, except it also includes any time that + the system is suspended. + + * *note time.CLOCK_PROF: 7f1. (FreeBSD, NetBSD and OpenBSD): + High-resolution per-process CPU timer. + + * *note time.CLOCK_UPTIME: 7f2. (FreeBSD, OpenBSD): Time whose + absolute value is the time the system has been running and not + suspended, providing accurate uptime measurement. + +The new *note time.thread_time(): 57e. and *note time.thread_time_ns(): +7f3. functions can be used to get per-thread CPU time measurements. +(Contributed by Antoine Pitrou in bpo-32025(2).) + +The new *note time.pthread_getcpuclockid(): 7f4. function returns the +clock ID of the thread-specific CPU-time clock. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0564/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32025 + + +File: python.info, Node: tkinter<3>, Next: tracemalloc<2>, Prev: time<4>, Up: Improved Modules<5> + +1.5.5.49 tkinter +................ + +The new *note tkinter.ttk.Spinbox: 7f6. class is now available. +(Contributed by Alan Moore in bpo-32585(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32585 + + +File: python.info, Node: tracemalloc<2>, Next: types<2>, Prev: tkinter<3>, Up: Improved Modules<5> + +1.5.5.50 tracemalloc +.................... + +*note tracemalloc.Traceback: 7f8. behaves more like regular tracebacks, +sorting the frames from oldest to most recent. *note +Traceback.format(): 7f9. now accepts negative `limit', truncating the +result to the ‘abs(limit)’ oldest frames. To get the old behaviour, use +the new `most_recent_first' argument to ‘Traceback.format()’. +(Contributed by Jesse Bakker in bpo-32121(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32121 + + +File: python.info, Node: types<2>, Next: unicodedata<4>, Prev: tracemalloc<2>, Up: Improved Modules<5> + +1.5.5.51 types +.............. + +The new *note WrapperDescriptorType: 7fb, *note MethodWrapperType: 21e, +*note MethodDescriptorType: 7fc, and *note ClassMethodDescriptorType: +7fd. classes are now available. (Contributed by Manuel Krebber and +Guido van Rossum in bpo-29377(1), and Serhiy Storchaka in bpo-32265(2).) + +The new *note types.resolve_bases(): 7fe. function resolves MRO entries +dynamically as specified by PEP 560(3). (Contributed by Ivan Levkivskyi +in bpo-32717(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29377 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32265 + + (3) https://peps.python.org/pep-0560/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32717 + + +File: python.info, Node: unicodedata<4>, Next: unittest<4>, Prev: types<2>, Up: Improved Modules<5> + +1.5.5.52 unicodedata +.................... + +The internal *note unicodedata: 124. database has been upgraded to use +Unicode 11(1). (Contributed by Benjamin Peterson.) + + ---------- Footnotes ---------- + + (1) https://www.unicode.org/versions/Unicode11.0.0/ + + +File: python.info, Node: unittest<4>, Next: unittest mock, Prev: unicodedata<4>, Up: Improved Modules<5> + +1.5.5.53 unittest +................. + +The new ‘-k’ command-line option allows filtering tests by a name +substring or a Unix shell-like pattern. For example, ‘python -m +unittest -k foo’ runs ‘foo_tests.SomeTest.test_something’, +‘bar_tests.SomeTest.test_foo’, but not +‘bar_tests.FooTest.test_something’. (Contributed by Jonas Haag in +bpo-32071(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32071 + + +File: python.info, Node: unittest mock, Next: urllib parse<3>, Prev: unittest<4>, Up: Improved Modules<5> + +1.5.5.54 unittest.mock +...................... + +The *note sentinel: 802. attributes now preserve their identity when +they are *note copied: 24. or *note pickled: c7. (Contributed by Serhiy +Storchaka in bpo-20804(1).) + +The new *note seal(): 803. function allows sealing *note Mock: 69b. +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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20804 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30541 + + +File: python.info, Node: urllib parse<3>, Next: uu, Prev: unittest mock, Up: Improved Modules<5> + +1.5.5.55 urllib.parse +..................... + +*note urllib.parse.quote(): 805. has been updated from RFC 2396(1) to +RFC 3986(2), adding ‘~’ to the set of characters that are never quoted +by default. (Contributed by Christian Theune and Ratnadeep Debnath in +bpo-16285(3).) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2396.html + + (2) https://datatracker.ietf.org/doc/html/rfc3986.html + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16285 + + +File: python.info, Node: uu, Next: uuid, Prev: urllib parse<3>, Up: Improved Modules<5> + +1.5.5.56 uu +........... + +The *note uu.encode(): 807. function now accepts an optional `backtick' +keyword argument. When it’s true, zeros are represented by ‘'`'’ +instead of spaces. (Contributed by Xiang Zhang in bpo-30103(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30103 + + +File: python.info, Node: uuid, Next: warnings<2>, Prev: uu, Up: Improved Modules<5> + +1.5.5.57 uuid +............. + +The new *note UUID.is_safe: 809. attribute relays information from the +platform about whether generated UUIDs are generated with a +multiprocessing-safe method. (Contributed by Barry Warsaw in +bpo-22807(1).) + +*note uuid.getnode(): 80a. now prefers universally administered MAC +addresses over locally administered MAC addresses. This makes a better +guarantee for global uniqueness of UUIDs returned from *note +uuid.uuid1(): 80b. If only locally administered MAC addresses are +available, the first such one found is returned. (Contributed by Barry +Warsaw in bpo-32107(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22807 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32107 + + +File: python.info, Node: warnings<2>, Next: xml etree, Prev: uuid, Up: Improved Modules<5> + +1.5.5.58 warnings +................. + +The initialization of the default warnings filters has changed as +follows: + + * warnings enabled via command line options (including those for + *note -b: 1b1. and the new CPython-specific *note -X: 174. ‘dev’ + option) are always passed to the warnings machinery via the *note + sys.warnoptions: 80d. attribute. + + * warnings filters enabled via the command line or the environment + now have the following order of precedence: + + * the ‘BytesWarning’ filter for *note -b: 1b1. (or ‘-bb’) + + * any filters specified with the *note -W: 502. option + + * any filters specified with the *note PYTHONWARNINGS: 80e. + environment variable + + * any other CPython specific filters (e.g. the ‘default’ + filter added for the new ‘-X dev’ mode) + + * any implicit filters defined directly by the warnings + machinery + + * in *note CPython debug builds: 496, all warnings are now displayed + by default (the implicit filter list is empty) + +(Contributed by Nick Coghlan and Victor Stinner in bpo-20361(1), +bpo-32043(2), and bpo-32230(3).) + +Deprecation warnings are once again shown by default in single-file +scripts and at the interactive prompt. See *note PEP 565; Show +DeprecationWarning in __main__: 720. for details. (Contributed by Nick +Coghlan in bpo-31975(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20361 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32043 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32230 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31975 + + +File: python.info, Node: xml etree, Next: xmlrpc server, Prev: warnings<2>, Up: Improved Modules<5> + +1.5.5.59 xml.etree +.................. + +*note ElementPath: 810. predicates in the ‘find()’ methods can now +compare text of the current node with ‘[. = "text"]’, not only text in +children. Predicates also allow adding spaces for better readability. +(Contributed by Stefan Behnel in bpo-31648(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31648 + + +File: python.info, Node: xmlrpc server, Next: zipapp, Prev: xml etree, Up: Improved Modules<5> + +1.5.5.60 xmlrpc.server +...................... + +‘SimpleXMLRPCDispatcher.register_function’ can now be used as a +decorator. (Contributed by Xiang Zhang in bpo-7769(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7769 + + +File: python.info, Node: zipapp, Next: zipfile<2>, Prev: xmlrpc server, Up: Improved Modules<5> + +1.5.5.61 zipapp +............... + +Function *note create_archive(): 813. 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(1).) + +Function *note create_archive(): 813. now accepts an optional +`compressed' argument to generate a compressed archive. A command line +option ‘--compress’ has also been added to support compression. +(Contributed by Zhiming Wang in bpo-31638(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31072 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31638 + + +File: python.info, Node: zipfile<2>, Prev: zipapp, Up: Improved Modules<5> + +1.5.5.62 zipfile +................ + +*note ZipFile: 28c. now accepts the new `compresslevel' parameter to +control the compression level. (Contributed by Bo Bayles in +bpo-21417(1).) + +Subdirectories in archives created by ‘ZipFile’ are now stored in +alphabetical order. (Contributed by Bernhard M. Wiedemann in +bpo-30693(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21417 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30693 + + +File: python.info, Node: C API Changes<4>, Next: Build Changes<4>, Prev: Improved Modules<5>, Up: What’s New In Python 3 7 + +1.5.6 C API Changes +------------------- + +A new API for thread-local storage has been implemented. See *note PEP +539; New C API for Thread-Local Storage: 721. for an overview and *note +Thread Specific Storage (TSS) API: 732. for a complete reference. +(Contributed by Masayuki Yamamoto in bpo-25658(1).) + +The new *note context variables: 712. functionality exposes a number of +*note new C APIs: 74d. + +The new *note PyImport_GetModule(): 816. function returns the previously +imported module with the given name. (Contributed by Eric Snow in +bpo-28411(2).) + +The new ‘Py_RETURN_RICHCOMPARE’ macro eases writing rich comparison +functions. (Contributed by Petr Victorin in bpo-23699(3).) + +The new *note Py_UNREACHABLE: 817. macro can be used to mark unreachable +code paths. (Contributed by Barry Warsaw in bpo-31338(4).) + +The *note tracemalloc: 11e. now exposes a C API through the new *note +PyTraceMalloc_Track(): 818. and *note PyTraceMalloc_Untrack(): 819. +functions. (Contributed by Victor Stinner in bpo-30054(5).) + +The new ‘import__find__load__start()’ and ‘import__find__load__done()’ +static markers can be used to trace module imports. (Contributed by +Christian Heimes in bpo-31574(6).) + +The fields ‘name’ and ‘doc’ of structures *note PyMemberDef: 81a, *note +PyGetSetDef: 81b, *note PyStructSequence_Field: 81c, *note +PyStructSequence_Desc: 81d, and ‘wrapperbase’ are now of type ‘const +char *’ rather of ‘char *’. (Contributed by Serhiy Storchaka in +bpo-28761(7).) + +The result of *note PyUnicode_AsUTF8AndSize(): 4c2. and *note +PyUnicode_AsUTF8(): 81e. is now of type ‘const char *’ rather of ‘char +*’. (Contributed by Serhiy Storchaka in bpo-28769(8).) + +The result of *note PyMapping_Keys(): 81f, *note PyMapping_Values(): +820. and *note PyMapping_Items(): 821. is now always a list, rather than +a list or a tuple. (Contributed by Oren Milman in bpo-28280(9).) + +Added functions *note PySlice_Unpack(): 822. and *note +PySlice_AdjustIndices(): 823. (Contributed by Serhiy Storchaka in +bpo-27867(10).) + +*note PyOS_AfterFork(): 824. is deprecated in favour of the new +functions *note PyOS_BeforeFork(): 825, *note PyOS_AfterFork_Parent(): +826. and *note PyOS_AfterFork_Child(): 6fc. (Contributed by Antoine +Pitrou in bpo-16500(11).) + +The ‘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(12) and bpo-30697(13). + +Added C API support for timezones with timezone constructors *note +PyTimeZone_FromOffset(): 827. and *note PyTimeZone_FromOffsetAndName(): +828, and access to the UTC singleton with *note PyDateTime_TimeZone_UTC: +829. Contributed by Paul Ganssle in bpo-10381(14). + +The type of results of ‘PyThread_start_new_thread()’ and +‘PyThread_get_thread_ident()’, and the `id' parameter of *note +PyThreadState_SetAsyncExc(): 82a. changed from long to unsigned long. +(Contributed by Serhiy Storchaka in bpo-6532(15).) + +*note PyUnicode_AsWideCharString(): 4f9. now raises a *note ValueError: +1c8. if the second argument is ‘NULL’ and the wchar_t* string contains +null characters. (Contributed by Serhiy Storchaka in bpo-30708(16).) + +Changes to the startup sequence and the management of dynamic memory +allocators mean that the long documented requirement to call *note +Py_Initialize(): 4e7. 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 *note Porting to Python 3.7: 724. +section in this document and the *note Before Python Initialization: +82b. section in the C API documentation for more details. + +The new *note PyInterpreterState_GetID(): 82c. returns the unique ID for +a given interpreter. (Contributed by Eric Snow in bpo-29102(17).) + +*note Py_DecodeLocale(): 82d, *note Py_EncodeLocale(): 82e. now use the +UTF-8 encoding when the *note UTF-8 mode: 71d. is enabled. (Contributed +by Victor Stinner in bpo-29240(18).) + +*note PyUnicode_DecodeLocaleAndSize(): 82f. and *note +PyUnicode_EncodeLocale(): 830. now use the current locale encoding for +‘surrogateescape’ error handler. (Contributed by Victor Stinner in +bpo-29240(19).) + +The `start' and `end' parameters of *note PyUnicode_FindChar(): 4f6. are +now adjusted to behave like string slices. (Contributed by Xiang Zhang +in bpo-28822(20).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25658 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28411 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23699 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31338 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30054 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31574 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28761 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28769 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28280 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27867 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=16500 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=22898 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=30697 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=10381 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=6532 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=30708 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=29102 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=29240 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=29240 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=28822 + + +File: python.info, Node: Build Changes<4>, Next: Optimizations<5>, Prev: C API Changes<4>, Up: What’s New In Python 3 7 + +1.5.7 Build Changes +------------------- + +Support for building ‘--without-threads’ has been removed. The *note +threading: 10b. module is now always available. (Contributed by Antoine +Pitrou in bpo-31370(1).). + +A full copy of libffi is no longer bundled for use when building the +*note _ctypes: 29. module on non-OSX UNIX platforms. An installed copy +of libffi is now required when building ‘_ctypes’ on such platforms. +(Contributed by Zachary Ware in bpo-27979(2).) + +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 ‘py +-3.6’), NuGet is used to download a copy of 32-bit Python for this +purpose. (Contributed by Zachary Ware in bpo-30450(3).) + +The *note ssl: f0. 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31370 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27979 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30450 + + +File: python.info, Node: Optimizations<5>, Next: Other CPython Implementation Changes<2>, Prev: Build Changes<4>, Up: What’s New In Python 3 7 + +1.5.8 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 ‘METH_FASTCALL’ convention. (Contributed by Victor Stinner in +bpo-29300(1), bpo-29507(2), bpo-29452(3), and bpo-29286(4).) + +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(5), and Ivan Levkivskyi in bpo-31333(6).) + +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(7).) The *note asyncio: 9. module received +a number of notable optimizations for commonly used functions: + + * The *note asyncio.get_event_loop(): 475. function has been + reimplemented in C to make it up to 15 times faster. (Contributed + by Yury Selivanov in bpo-32296(8).) + + * *note asyncio.Future: 477. callback management has been optimized. + (Contributed by Yury Selivanov in bpo-32348(9).) + + * *note asyncio.gather(): 1d3. is now up to 15% faster. (Contributed + by Yury Selivanov in bpo-32355(10).) + + * *note asyncio.sleep(): 6c2. is now up to 2 times faster when the + `delay' argument is zero or negative. (Contributed by Andrew + Svetlov in bpo-32351(11).) + + * The performance overhead of asyncio debug mode has been reduced. + (Contributed by Antoine Pitrou in bpo-31970(12).) + +As a result of *note PEP 560 work: 718, the import time of *note typing: +123. has been reduced by a factor of 7, and many typing operations are +now faster. (Contributed by Ivan Levkivskyi in bpo-32226(13).) + +*note sorted(): 833. and *note list.sort(): 834. have been optimized for +common cases to be up to 40-75% faster. (Contributed by Elliot +Gorokhovsky in bpo-28685(14).) + +*note dict.copy(): 835. is now up to 5.5 times faster. (Contributed by +Yury Selivanov in bpo-31179(15).) + +*note hasattr(): 836. and *note getattr(): 837. are now about 4 times +faster when `name' is not found and `obj' does not override *note +object.__getattr__(): 838. or *note object.__getattribute__(): 839. +(Contributed by INADA Naoki in bpo-32544(16).) + +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(17).) + +The *note collections.namedtuple(): 538. 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(18).) + +‘date.fromordinal()’ and ‘date.fromtimestamp()’ are now up to 30% faster +in the common case. (Contributed by Paul Ganssle in bpo-32403(19).) + +The *note os.fwalk(): 7b6. function is now up to 2 times faster thanks +to the use of *note os.scandir(): 6b0. (Contributed by Serhiy Storchaka +in bpo-25996(20).) + +The speed of the *note shutil.rmtree(): 23f. function has been improved +by 20–40% thanks to the use of the *note os.scandir(): 6b0. function. +(Contributed by Serhiy Storchaka in bpo-28564(21).) + +Optimized case-insensitive matching and searching of *note regular +expressions: da. Searching some patterns can now be up to 20 times +faster. (Contributed by Serhiy Storchaka in bpo-30285(22).) + +*note re.compile(): 83a. now converts ‘flags’ parameter to int object if +it is ‘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(23).) + +The *note modify(): 83b. methods of classes *note +selectors.EpollSelector: 83c, *note selectors.PollSelector: 83d. and +*note selectors.DevpollSelector: 83e. may be around 10% faster under +heavy loads. (Contributed by Giampaolo Rodola’ in bpo-30014(24)) + +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(25) and +bpo-11549(26).) + +Most functions and methods in *note abc: 3. have been rewritten in C. +This makes creation of abstract base classes, and calling *note +isinstance(): 3ab. and *note issubclass(): 3ac. 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(27)) + +Significant speed improvements to alternate constructors for *note +datetime.date: 536. and *note datetime.datetime: 4be. by using fast-path +constructors when not constructing subclasses. (Contributed by Paul +Ganssle in bpo-32403(28)) + +The speed of comparison of *note array.array: 3d2. 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(29).) + +The *note math.erf(): 83f. and *note math.erfc(): 840. functions now use +the (faster) C library implementation on most platforms. (Contributed +by Serhiy Storchaka in bpo-26121(30).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29300 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29507 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29452 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29286 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29585 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31333 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26110 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32296 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32348 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32355 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32351 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31970 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32226 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28685 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31179 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=32544 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=24821 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28638 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=32403 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=25996 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28564 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30285 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31671 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=30014 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=29469 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=11549 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=31333 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=32403 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=24700 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=26121 + + +File: python.info, Node: Other CPython Implementation Changes<2>, Next: Deprecated Python Behavior, Prev: Optimizations<5>, Up: What’s New In Python 3 7 + +1.5.9 Other CPython Implementation Changes +------------------------------------------ + + * Trace hooks may now opt out of receiving the ‘line’ and opt into + receiving the ‘opcode’ events from the interpreter by setting the + corresponding new ‘f_trace_lines’ and ‘f_trace_opcodes’ attributes + on the frame being traced. (Contributed by Nick Coghlan in + bpo-31344(1).) + + * Fixed some consistency problems with namespace package module + attributes. Namespace module objects now have an ‘__file__’ that + is set to ‘None’ (previously unset), and their ‘__spec__.origin’ is + also set to ‘None’ (previously the string ‘"namespace"’). See + bpo-32305(2). Also, the namespace module object’s + ‘__spec__.loader’ is set to the same value as ‘__loader__’ + (previously, the former was set to ‘None’). See bpo-32303(3). + + * The *note locals(): 842. dictionary now displays in the lexical + order that variables were defined. Previously, the order was + undefined. (Contributed by Raymond Hettinger in bpo-32690(4).) + + * The *note distutils: 37. ‘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(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31344 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32305 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32303 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32690 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32304 + + +File: python.info, Node: Deprecated Python Behavior, Next: Deprecated Python modules functions and methods, Prev: Other CPython Implementation Changes<2>, Up: What’s New In Python 3 7 + +1.5.10 Deprecated Python Behavior +--------------------------------- + +Yield expressions (both ‘yield’ and ‘yield from’ clauses) are now +deprecated in comprehensions and generator expressions (aside from the +iterable expression in the leftmost ‘for’ clause). This ensures that +comprehensions always immediately return a container of the appropriate +type (rather than potentially returning a *note generator iterator: 844. +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 *note DeprecationWarning: 2d4. when +compiled, in Python 3.8 this will be a *note SyntaxError: 2d6. +(Contributed by Serhiy Storchaka in bpo-10544(1).) + +Returning a subclass of *note complex: 1b8. from *note +object.__complex__(): 1b7. is deprecated and will be an error in future +Python versions. This makes ‘__complex__()’ consistent with *note +object.__int__(): 3be. and *note object.__float__(): 60c. (Contributed +by Serhiy Storchaka in bpo-28894(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10544 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28894 + + +File: python.info, Node: Deprecated Python modules functions and methods, Next: Deprecated functions and types of the C API, Prev: Deprecated Python Behavior, Up: What’s New In Python 3 7 + +1.5.11 Deprecated Python modules, functions and methods +------------------------------------------------------- + +* Menu: + +* aifc:: +* asyncio: asyncio<6>. +* collections: collections<3>. +* dbm: dbm<2>. +* enum: enum<4>. +* gettext: gettext<2>. +* importlib: importlib<3>. +* locale: locale<3>. +* macpath:: +* threading: threading<4>. +* socket: socket<6>. +* ssl: ssl<4>. +* sunau:: +* sys: sys<6>. +* wave:: + + +File: python.info, Node: aifc, Next: asyncio<6>, Up: Deprecated Python modules functions and methods + +1.5.11.1 aifc +............. + +‘aifc.openfp()’ has been deprecated and will be removed in Python 3.9. +Use *note aifc.open(): 847. instead. (Contributed by Brian Curtin in +bpo-31985(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31985 + + +File: python.info, Node: asyncio<6>, Next: collections<3>, Prev: aifc, Up: Deprecated Python modules functions and methods + +1.5.11.2 asyncio +................ + +Support for directly ‘await’-ing instances of *note asyncio.Lock: 6c3. +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(1).) + +The ‘asyncio.Task.current_task()’ and ‘asyncio.Task.all_tasks()’ methods +have been deprecated. (Contributed by Andrew Svetlov in bpo-32250(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32253 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32250 + + +File: python.info, Node: collections<3>, Next: dbm<2>, Prev: asyncio<6>, Up: Deprecated Python modules functions and methods + +1.5.11.3 collections +.................... + +In Python 3.8, the abstract base classes in *note collections.abc: 1d. +will no longer be exposed in the regular *note collections: 1c. module. +This will help create a clearer distinction between the concrete classes +and the abstract base classes. (Contributed by Serhiy Storchaka in +bpo-25988(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25988 + + +File: python.info, Node: dbm<2>, Next: enum<4>, Prev: collections<3>, Up: Deprecated Python modules functions and methods + +1.5.11.4 dbm +............ + +*note dbm.dumb: 31. 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 ‘'r'’ and +‘'w'’ modes (this will be an error in future Python releases). +(Contributed by Serhiy Storchaka in bpo-28847(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28847 + + +File: python.info, Node: enum<4>, Next: gettext<2>, Prev: dbm<2>, Up: Deprecated Python modules functions and methods + +1.5.11.5 enum +............. + +In Python 3.8, attempting to check for non-Enum objects in ‘Enum’ +classes will raise a *note TypeError: 19c. (e.g. ‘1 in Color’); +similarly, attempting to check for non-Flag objects in a ‘Flag’ member +will raise *note TypeError: 19c. (e.g. ‘1 in Perm.RW’); currently, both +operations return *note False: 78d. instead. (Contributed by Ethan +Furman in bpo-33217(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33217 + + +File: python.info, Node: gettext<2>, Next: importlib<3>, Prev: enum<4>, Up: Deprecated Python modules functions and methods + +1.5.11.6 gettext +................ + +Using non-integer value for selecting a plural form in *note gettext: +83. is now deprecated. It never correctly worked. (Contributed by +Serhiy Storchaka in bpo-28692(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28692 + + +File: python.info, Node: importlib<3>, Next: locale<3>, Prev: gettext<2>, Up: Deprecated Python modules functions and methods + +1.5.11.7 importlib +.................. + +Methods *note MetaPathFinder.find_module(): 2ed. (replaced by *note +MetaPathFinder.find_spec(): 46f.) and *note +PathEntryFinder.find_loader(): 2ee. (replaced by *note +PathEntryFinder.find_spec(): 470.) both deprecated in Python 3.4 now +emit *note DeprecationWarning: 2d4. (Contributed by Matthias Bussonnier +in bpo-29576(1)) + +The *note importlib.abc.ResourceLoader: 84e. ABC has been deprecated in +favour of ‘importlib.abc.ResourceReader’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29576 + + +File: python.info, Node: locale<3>, Next: macpath, Prev: importlib<3>, Up: Deprecated Python modules functions and methods + +1.5.11.8 locale +............... + +*note locale.format(): 850. has been deprecated, use *note +locale.format_string(): 7a7. instead. (Contributed by Garvit in +bpo-10379(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10379 + + +File: python.info, Node: macpath, Next: threading<4>, Prev: locale<3>, Up: Deprecated Python modules functions and methods + +1.5.11.9 macpath +................ + +The ‘macpath’ is now deprecated and will be removed in Python 3.8. +(Contributed by Chi Hsuan Yen in bpo-9850(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9850 + + +File: python.info, Node: threading<4>, Next: socket<6>, Prev: macpath, Up: Deprecated Python modules functions and methods + +1.5.11.10 threading +................... + +‘dummy_threading’ and ‘_dummy_thread’ have been deprecated. It is no +longer possible to build Python with threading disabled. Use *note +threading: 10b. instead. (Contributed by Antoine Pitrou in +bpo-31370(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31370 + + +File: python.info, Node: socket<6>, Next: ssl<4>, Prev: threading<4>, Up: Deprecated Python modules functions and methods + +1.5.11.11 socket +................ + +The silent argument value truncation in *note socket.htons(): 4a2. and +*note socket.ntohs(): 4a3. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28332 + + +File: python.info, Node: ssl<4>, Next: sunau, Prev: socket<6>, Up: Deprecated Python modules functions and methods + +1.5.11.12 ssl +............. + +*note ssl.wrap_socket(): 490. is deprecated. Use *note +ssl.SSLContext.wrap_socket(): 491. instead. (Contributed by Christian +Heimes in bpo-28124(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28124 + + +File: python.info, Node: sunau, Next: sys<6>, Prev: ssl<4>, Up: Deprecated Python modules functions and methods + +1.5.11.13 sunau +............... + +‘sunau.openfp()’ has been deprecated and will be removed in Python 3.9. +Use *note sunau.open(): 856. instead. (Contributed by Brian Curtin in +bpo-31985(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31985 + + +File: python.info, Node: sys<6>, Next: wave, Prev: sunau, Up: Deprecated Python modules functions and methods + +1.5.11.14 sys +............. + +Deprecated ‘sys.set_coroutine_wrapper()’ and +‘sys.get_coroutine_wrapper()’. + +The undocumented ‘sys.callstats()’ function has been deprecated and will +be removed in a future Python version. (Contributed by Victor Stinner +in bpo-28799(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28799 + + +File: python.info, Node: wave, Prev: sys<6>, Up: Deprecated Python modules functions and methods + +1.5.11.15 wave +.............. + +‘wave.openfp()’ has been deprecated and will be removed in Python 3.9. +Use *note wave.open(): 59a. instead. (Contributed by Brian Curtin in +bpo-31985(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31985 + + +File: python.info, Node: Deprecated functions and types of the C API, Next: Platform Support Removals, Prev: Deprecated Python modules functions and methods, Up: What’s New In Python 3 7 + +1.5.12 Deprecated functions and types of the C API +-------------------------------------------------- + +Function *note PySlice_GetIndicesEx(): 85a. is deprecated and replaced +with a macro if ‘Py_LIMITED_API’ is not set or set to a value in the +range between ‘0x03050400’ and ‘0x03060000’ (not inclusive), or is +‘0x03060100’ or higher. (Contributed by Serhiy Storchaka in +bpo-27867(1).) + +*note PyOS_AfterFork(): 824. has been deprecated. Use *note +PyOS_BeforeFork(): 825, *note PyOS_AfterFork_Parent(): 826. or *note +PyOS_AfterFork_Child(): 6fc. instead. (Contributed by Antoine Pitrou in +bpo-16500(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27867 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16500 + + +File: python.info, Node: Platform Support Removals, Next: API and Feature Removals<2>, Prev: Deprecated functions and types of the C API, Up: What’s New In Python 3 7 + +1.5.13 Platform Support Removals +-------------------------------- + + * FreeBSD 9 and older are no longer officially supported. + + * For full Unicode support, including within extension modules, *nix + platforms are now expected to provide at least one of ‘C.UTF-8’ + (full locale), ‘C.utf8’ (full locale) or ‘UTF-8’ (‘LC_CTYPE’-only + locale) as an alternative to the legacy ‘ASCII’-based ‘C’ locale. + + * 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(1) provides an example of using + the SSL compatibility testing infrastructure(2) in CPython’s test + suite to build and link against OpenSSL 1.1.0 rather than an + outdated system provided OpenSSL. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/blob/v3.7.13/.travis.yml + + (2) +https://github.com/python/cpython/tree/3.11/Tools/ssl/multissltests.py + + +File: python.info, Node: API and Feature Removals<2>, Next: Module Removals, Prev: Platform Support Removals, Up: What’s New In Python 3 7 + +1.5.14 API and Feature Removals +------------------------------- + +The following features and APIs have been removed from Python 3.7: + + * The ‘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. + + * Unknown escapes consisting of ‘'\'’ and an ASCII letter in + replacement templates for *note re.sub(): 85d. were deprecated in + Python 3.5, and will now cause an error. + + * Removed support of the `exclude' argument in *note + tarfile.TarFile.add(): 85e. It was deprecated in Python 2.7 and + 3.2. Use the `filter' argument instead. + + * The ‘splitunc()’ function in the ‘ntpath’ module was deprecated in + Python 3.1, and has now been removed. Use the *note splitdrive(): + 85f. function instead. + + * *note collections.namedtuple(): 538. no longer supports the + `verbose' parameter or ‘_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(1).) + + * Functions *note bool(): 463, *note float(): 3ca, *note list(): 1e9. + and *note tuple(): 539. no longer take keyword arguments. The + first argument of *note int(): 1c7. can now be passed only as + positional argument. + + * Removed previously deprecated in Python 2.4 classes ‘Plist’, ‘Dict’ + and ‘_InternalDict’ in the *note plistlib: cc. 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. + + * The ‘asyncio.windows_utils.socketpair()’ function has been removed. + Use the *note socket.socketpair(): 860. function instead, it is + available on all platforms since Python 3.5. + ‘asyncio.windows_utils.socketpair’ was just an alias to + ‘socket.socketpair’ on Python 3.5 and newer. + + * *note asyncio: 9. no longer exports the *note selectors: e3. and + ‘_overlapped’ modules as ‘asyncio.selectors’ and + ‘asyncio._overlapped’. Replace ‘from asyncio import selectors’ + with ‘import selectors’. + + * Direct instantiation of *note ssl.SSLSocket: 52a. and *note + ssl.SSLObject: 7e1. objects is now prohibited. The constructors + were never documented, tested, or designed as public constructors. + Users were supposed to use *note ssl.wrap_socket(): 490. or *note + ssl.SSLContext: 430. (Contributed by Christian Heimes in + bpo-32951(2).) + + * The unused *note distutils: 37. ‘install_misc’ command has been + removed. (Contributed by Eric N. Vander Weele in bpo-29218(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28638 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32951 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29218 + + +File: python.info, Node: Module Removals, Next: Windows-only Changes, Prev: API and Feature Removals<2>, Up: What’s New In Python 3 7 + +1.5.15 Module Removals +---------------------- + +The ‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29137 + + +File: python.info, Node: Windows-only Changes, Next: Porting to Python 3 7, Prev: Module Removals, Up: What’s New In Python 3 7 + +1.5.16 Windows-only Changes +--------------------------- + +The python launcher, (py.exe), can accept 32 & 64 bit specifiers +`without' having to specify a minor version as well. So ‘py -3-32’ and +‘py -3-64’ become valid as well as ‘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(1).) + +The launcher can be run as ‘py -0’ to produce a list of the installed +pythons, `with default marked with an asterisk'. Running ‘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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30291 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30362 + + +File: python.info, Node: Porting to Python 3 7, Next: Notable changes in Python 3 7 1, Prev: Windows-only Changes, Up: What’s New In Python 3 7 + +1.5.17 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<4>. +* Changes in the C API: Changes in the C API<4>. +* CPython bytecode changes: CPython bytecode changes<5>. +* Windows-only Changes: Windows-only Changes<2>. +* Other CPython implementation changes:: + + +File: python.info, Node: Changes in Python Behavior, Next: Changes in the Python API<4>, Up: Porting to Python 3 7 + +1.5.17.1 Changes in Python Behavior +................................... + + * *note async: 2f9. and *note await: 2fa. names are now reserved + keywords. Code using these names as identifiers will now raise a + *note SyntaxError: 2d6. (Contributed by Jelle Zijlstra in + bpo-30406(1).) + + * PEP 479(2) is enabled for all code in Python 3.7, meaning that + *note StopIteration: 865. exceptions raised directly or indirectly + in coroutines and generators are transformed into *note + RuntimeError: 6e9. exceptions. (Contributed by Yury Selivanov in + bpo-32670(3).) + + * *note object.__aiter__(): 866. methods can no longer be declared as + asynchronous. (Contributed by Yury Selivanov in bpo-31709(4).) + + * Due to an oversight, earlier Python versions erroneously accepted + the following syntax: + + f(1 for x in [1],) + + class C(1 for x in [1]): + pass + + Python 3.7 now correctly raises a *note SyntaxError: 2d6, 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(5) and bpo-32023(6).) + + * When using the *note -m: 1ae. switch, the initial working directory + is now added to *note sys.path: 162, 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 ‘os.getcwd()’ + or ‘os.path.dirname(__main__.__file__)’, depending on why the code + was checking for the empty string in the first place). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30406 + + (2) https://peps.python.org/pep-0479/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32670 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31709 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32012 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32023 + + +File: python.info, Node: Changes in the Python API<4>, Next: Changes in the C API<4>, Prev: Changes in Python Behavior, Up: Porting to Python 3 7 + +1.5.17.2 Changes in the Python API +.................................. + + * ‘socketserver.ThreadingMixIn.server_close()’ now waits until all + non-daemon threads complete. Set the new + ‘socketserver.ThreadingMixIn.block_on_close’ class attribute to + ‘False’ to get the pre-3.7 behaviour. (Contributed by Victor + Stinner in bpo-31233(1) and bpo-33540(2).) + + * ‘socketserver.ForkingMixIn.server_close()’ now waits until all + child processes complete. Set the new + ‘socketserver.ForkingMixIn.block_on_close’ class attribute to + ‘False’ to get the pre-3.7 behaviour. (Contributed by Victor + Stinner in bpo-31151(3) and bpo-33540(4).) + + * The *note locale.localeconv(): 868. function now temporarily sets + the ‘LC_CTYPE’ locale to the value of ‘LC_NUMERIC’ in some cases. + (Contributed by Victor Stinner in bpo-31900(5).) + + * *note pkgutil.walk_packages(): 869. now raises a *note ValueError: + 1c8. if `path' is a string. Previously an empty list was returned. + (Contributed by Sanyam Khurana in bpo-24744(6).) + + * A format string argument for *note string.Formatter.format(): 86a. + is now *note positional-only: 6d7. Passing it as a keyword + argument was deprecated in Python 3.5. (Contributed by Serhiy + Storchaka in bpo-29193(7).) + + * Attributes *note key: 86b, *note value: 86c. and *note coded_value: + 86d. of class *note http.cookies.Morsel: 86e. are now read-only. + Assigning to them was deprecated in Python 3.5. Use the *note + set(): 86f. method for setting them. (Contributed by Serhiy + Storchaka in bpo-29192(8).) + + * The `mode' argument of *note os.makedirs(): 7bf. 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 ‘makedirs()’. (Contributed by Serhiy + Storchaka in bpo-19930(9).) + + * The *note struct.Struct.format: 870. type is now *note str: 1b3. + instead of *note bytes: 1b4. (Contributed by Victor Stinner in + bpo-21071(10).) + + * *note parse_multipart(): 455. now accepts the `encoding' and + `errors' arguments and returns the same results as ‘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(11).) + + * Due to internal changes in *note socket: ec, calling *note + socket.fromshare(): 871. on a socket created by *note socket.share: + 872. in older Python versions is not supported. + + * ‘repr’ for *note BaseException: 17d. has changed to not include the + trailing comma. Most exceptions are affected by this change. + (Contributed by Serhiy Storchaka in bpo-30399(12).) + + * ‘repr’ for *note datetime.timedelta: 60f. has changed to include + the keyword arguments in the output. (Contributed by Utkarsh + Upadhyay in bpo-30302(13).) + + * Because *note shutil.rmtree(): 23f. is now implemented using the + *note os.scandir(): 6b0. function, the user specified handler + `onerror' is now called with the first argument ‘os.scandir’ + instead of ‘os.listdir’ when listing the directory is failed. + + * Support for nested sets and set operations in regular expressions + as in Unicode Technical Standard #18(14) might be added in the + future. This would change the syntax. To facilitate this future + change a *note FutureWarning: 73e. will be raised in ambiguous + cases for the time being. That include sets starting with a + literal ‘'['’ or containing literal character sequences ‘'--'’, + ‘'&&'’, ‘'~~'’, and ‘'||'’. To avoid a warning, escape them with a + backslash. (Contributed by Serhiy Storchaka in bpo-30349(15).) + + * The result of splitting a string on a *note regular expression: da. + that could match an empty string has been changed. For example + splitting on ‘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 ‘r'\s+'’. A + *note FutureWarning: 73e. 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 ‘'a\n\n'’, the pattern + ‘r'(?m)^\s*?$'’ will not only match empty strings at positions 2 + and 3, but also the string ‘'\n'’ at positions 2–3. To match only + blank lines, the pattern should be rewritten as + ‘r'(?m)^[^\S\n]*$'’. + + *note re.sub(): 85d. now replaces empty matches adjacent to a + previous non-empty match. For example ‘re.sub('x*', '-', 'abxd')’ + returns now ‘'-a-b--d-'’ instead of ‘'-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(16) and + bpo-32308(17).) + + * Change *note re.escape(): 873. to only escape regex special + characters instead of escaping all characters other than ASCII + letters, numbers, and ‘'_'’. (Contributed by Serhiy Storchaka in + bpo-29995(18).) + + * *note tracemalloc.Traceback: 7f8. frames are now sorted from oldest + to most recent to be more consistent with *note traceback: 11d. + (Contributed by Jesse Bakker in bpo-32121(19).) + + * On OSes that support *note socket.SOCK_NONBLOCK: 874. or *note + socket.SOCK_CLOEXEC: 875. bit flags, the *note socket.type: 876. no + longer has them applied. Therefore, checks like ‘if sock.type == + socket.SOCK_STREAM’ work as expected on all platforms. + (Contributed by Yury Selivanov in bpo-32331(20).) + + * On Windows the default for the `close_fds' argument of *note + subprocess.Popen: 6e8. was changed from *note False: 78d. to *note + True: 877. when redirecting the standard handles. If you + previously depended on handles being inherited when using *note + subprocess.Popen: 6e8. with standard io redirection, you will have + to pass ‘close_fds=False’ to preserve the previous behaviour, or + use *note STARTUPINFO.lpAttributeList: 878. + + * *note importlib.machinery.PathFinder.invalidate_caches(): 879. – + which implicitly affects *note importlib.invalidate_caches(): 87a. + – now deletes entries in *note sys.path_importer_cache: 1b2. which + are set to ‘None’. (Contributed by Brett Cannon in bpo-33169(21).) + + * In *note asyncio: 9, *note loop.sock_recv(): 87b, *note + loop.sock_sendall(): 87c, *note loop.sock_accept(): 87d, *note + loop.getaddrinfo(): 87e, *note loop.getnameinfo(): 87f. have been + changed to be proper coroutine methods to match their + documentation. Previously, these methods returned *note + asyncio.Future: 477. instances. (Contributed by Yury Selivanov in + bpo-32327(22).) + + * *note asyncio.Server.sockets: 880. now returns a copy of the + internal list of server sockets, instead of returning it directly. + (Contributed by Yury Selivanov in bpo-32662(23).) + + * *note Struct.format: 870. is now a *note str: 1b3. instance instead + of a *note bytes: 1b4. instance. (Contributed by Victor Stinner in + bpo-21071(24).) + + * *note argparse: 5. subparsers can now be made mandatory by passing + ‘required=True’ to *note ArgumentParser.add_subparsers(): 881. + (Contributed by Anthony Sottile in bpo-26510(25).) + + * *note ast.literal_eval(): 882. is now stricter. Addition and + subtraction of arbitrary numbers are no longer allowed. + (Contributed by Serhiy Storchaka in bpo-31778(26).) + + * *note Calendar.itermonthdates: 883. 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 *note Calendar.itermonthdays3: 884. and + *note Calendar.itermonthdays4: 885. can be used. The new methods + return tuples and are not restricted by the range supported by + *note datetime.date: 536. (Contributed by Alexander Belopolsky in + bpo-28292(27).) + + * *note collections.ChainMap: 886. now preserves the order of the + underlying mappings. (Contributed by Raymond Hettinger in + bpo-32792(28).) + + * The ‘submit()’ method of *note + concurrent.futures.ThreadPoolExecutor: 311. and *note + concurrent.futures.ProcessPoolExecutor: 52e. now raises a *note + RuntimeError: 6e9. if called during interpreter shutdown. + (Contributed by Mark Nemec in bpo-33097(29).) + + * The *note configparser.ConfigParser: 887. constructor now uses + ‘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(30).) + + * Several undocumented internal imports were removed. One example is + that ‘os.errno’ is no longer available; use ‘import errno’ directly + instead. Note that such undocumented internal imports may be + removed any time without notice, even in micro version releases. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31233 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33540 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31151 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33540 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31900 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24744 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29193 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29192 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=19930 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21071 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=29979 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=30399 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=30302 + + (14) https://unicode.org/reports/tr18/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=30349 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=25054 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32308 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=29995 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=32121 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32331 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=33169 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32327 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32662 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=21071 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=26510 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=31778 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=28292 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=32792 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=33097 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=23835 + + +File: python.info, Node: Changes in the C API<4>, Next: CPython bytecode changes<5>, Prev: Changes in the Python API<4>, Up: Porting to Python 3 7 + +1.5.17.3 Changes in the C API +............................. + +The function *note PySlice_GetIndicesEx(): 85a. is considered unsafe for +resizable sequences. If the slice indices are not instances of *note +int: 1c7, but objects that implement the ‘__index__()’ method, the +sequence can be resized after passing its length to +‘PySlice_GetIndicesEx()’. This can lead to returning indices out of the +length of the sequence. For avoiding possible problems use new +functions *note PySlice_Unpack(): 822. and *note +PySlice_AdjustIndices(): 823. (Contributed by Serhiy Storchaka in +bpo-27867(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27867 + + +File: python.info, Node: CPython bytecode changes<5>, Next: Windows-only Changes<2>, Prev: Changes in the C API<4>, Up: Porting to Python 3 7 + +1.5.17.4 CPython bytecode changes +................................. + +There are two new opcodes: *note LOAD_METHOD: 88a. and ‘CALL_METHOD’. +(Contributed by Yury Selivanov and INADA Naoki in bpo-26110(1).) + +The ‘STORE_ANNOTATION’ opcode has been removed. (Contributed by Mark +Shannon in bpo-32550(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26110 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32550 + + +File: python.info, Node: Windows-only Changes<2>, Next: Other CPython implementation changes, Prev: CPython bytecode changes<5>, Up: Porting to Python 3 7 + +1.5.17.5 Windows-only Changes +............................. + +The file used to override *note sys.path: 162. is now called +‘._pth’ instead of ‘'sys.path'’. See *note Finding +modules: 88c. for more information. (Contributed by Steve Dower in +bpo-28137(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28137 + + +File: python.info, Node: Other CPython implementation changes, Prev: Windows-only Changes<2>, Up: Porting to Python 3 7 + +1.5.17.6 Other CPython implementation changes +............................................. + +In preparation for potential future changes to the public CPython +runtime initialization API (see PEP 432(1) 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(2), and +further updated by Nick, Eric, and Victor Stinner in a number of other +issues). Some known details affected: + + * *note PySys_AddWarnOptionUnicode(): 366. is not currently usable by + embedding applications due to the requirement to create a Unicode + object prior to calling ‘Py_Initialize’. Use *note + PySys_AddWarnOption(): 367. instead. + + * warnings filters added by an embedding application with *note + PySys_AddWarnOption(): 367. should now more consistently take + precedence over the default filters set by the interpreter + +Due to changes in the way the default warnings filters are configured, +setting *note Py_BytesWarningFlag: 88e. to a value greater than one is +no longer sufficient to both emit *note BytesWarning: 88f. 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 +‘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 ‘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(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0432/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22257 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25612 + + +File: python.info, Node: Notable changes in Python 3 7 1, Next: Notable changes in Python 3 7 2, Prev: Porting to Python 3 7, Up: What’s New In Python 3 7 + +1.5.18 Notable changes in Python 3.7.1 +-------------------------------------- + +Starting in 3.7.1, *note Py_Initialize(): 4e7. now consistently reads +and respects all of the same environment settings as *note Py_Main(): +891. (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(1)). If this behavior is unwanted, set *note +Py_IgnoreEnvironmentFlag: 892. to 1 before calling *note +Py_Initialize(): 4e7. + +In 3.7.1 the C API for Context Variables *note was updated: 893. to use +*note PyObject: 4cf. pointers. See also bpo-34762(2). + +In 3.7.1 the *note tokenize: 11a. module now implicitly emits a +‘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(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34247 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34762 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33899 + + +File: python.info, Node: Notable changes in Python 3 7 2, Next: Notable changes in Python 3 7 6, Prev: Notable changes in Python 3 7 1, Up: What’s New In Python 3 7 + +1.5.19 Notable changes in Python 3.7.2 +-------------------------------------- + +In 3.7.2, *note venv: 12f. on Windows no longer copies the original +binaries, but creates redirector scripts named ‘python.exe’ and +‘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. + + +File: python.info, Node: Notable changes in Python 3 7 6, Next: Notable changes in Python 3 7 10, Prev: Notable changes in Python 3 7 2, Up: What’s New In Python 3 7 + +1.5.20 Notable changes in Python 3.7.6 +-------------------------------------- + +Due to significant security concerns, the `reuse_address' parameter of +*note asyncio.loop.create_datagram_endpoint(): 2fb. is no longer +supported. This is because of the behavior of the socket option +‘SO_REUSEADDR’ in UDP. For more details, see the documentation for +‘loop.create_datagram_endpoint()’. (Contributed by Kyle Stanley, +Antoine Pitrou, and Yury Selivanov in bpo-37228(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37228 + + +File: python.info, Node: Notable changes in Python 3 7 10, Prev: Notable changes in Python 3 7 6, Up: What’s New In Python 3 7 + +1.5.21 Notable changes in Python 3.7.10 +--------------------------------------- + +Earlier Python versions allowed using both ‘;’ and ‘&’ as query +parameter separators in *note urllib.parse.parse_qs(): 452. and *note +urllib.parse.parse_qsl(): 453. Due to security concerns, and to conform +with newer W3C recommendations, this has been changed to allow only a +single separator key, with ‘&’ as the default. This change also affects +*note cgi.parse(): 454. and *note cgi.parse_multipart(): 455. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42967 + + +File: python.info, Node: What’s New In Python 3 6, Next: What’s New In Python 3 5, Prev: What’s New In Python 3 7, Up: What’s New in Python + +1.6 What’s New In Python 3.6 +============================ + + +Editors: Elvis Pranskevichus <>, Yury Selivanov +<> + +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(1) for +a full list of changes. + +See also +........ + +PEP 494(2) - Python 3.6 Release Schedule + +* Menu: + +* Summary – Release highlights: Summary – Release highlights<5>. +* New Features: New Features<9>. +* Other Language Changes: Other Language Changes<6>. +* New Modules: New Modules<6>. +* Improved Modules: Improved Modules<6>. +* Optimizations: Optimizations<6>. +* Build and C API Changes: Build and C API Changes<2>. +* Other Improvements:: +* Deprecated: Deprecated<7>. +* Removed: Removed<7>. +* 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. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3.6/whatsnew/changelog.html + + (2) https://peps.python.org/pep-0494/ + + +File: python.info, Node: Summary – Release highlights<5>, Next: New Features<9>, Up: What’s New In Python 3 6 + +1.6.1 Summary – Release highlights +---------------------------------- + +New syntax features: + + * *note PEP 498: 89a, formatted string literals. + + * *note PEP 515: 89b, underscores in numeric literals. + + * *note PEP 526: 89c, syntax for variable annotations. + + * *note PEP 525: 89d, asynchronous generators. + + * *note PEP 530: 89e.: asynchronous comprehensions. + +New library modules: + + * *note secrets: e1.: *note PEP 506 – Adding A Secrets Module To The + Standard Library: 89f. + +CPython implementation improvements: + + * The *note dict: 719. type has been reimplemented to use a *note + more compact representation: 8a0. based on a proposal by Raymond + Hettinger(1) and similar to the PyPy dict implementation(2). This + resulted in dictionaries using 20% to 25% less memory when compared + to Python 3.5. + + * Customization of class creation has been simplified with the *note + new protocol: 8a1. + + * The class attribute definition order is *note now preserved: 8a2. + + * The order of elements in ‘**kwargs’ now *note corresponds to the + order: 8a3. in which keyword arguments were passed to the function. + + * DTrace and SystemTap *note probing support: 8a4. has been added. + + * The new *note PYTHONMALLOC: 8a5. environment variable can now be + used to debug the interpreter memory allocation and access errors. + +Significant improvements in the standard library: + + * The *note asyncio: 9. module has received new features, significant + usability and performance improvements, and a fair amount of bug + fixes. Starting with Python 3.6 the ‘asyncio’ module is no longer + provisional and its API is considered stable. + + * A new *note file system path protocol: 8a6. has been implemented to + support *note path-like objects: 773. All standard library + functions operating on paths have been updated to work with the new + protocol. + + * The *note datetime: 2f. module has gained support for *note Local + Time Disambiguation: 8a7. + + * The *note typing: 123. module received a number of *note + improvements: 8a8. + + * The *note tracemalloc: 11e. module has been significantly reworked + and is now used to provide better output for *note ResourceWarning: + 8a9. as well as provide better diagnostics for memory allocation + errors. See the *note PYTHONMALLOC section: 8a5. for more + information. + +Security improvements: + + * The new *note secrets: e1. 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. + + * On Linux, *note os.urandom(): 237. now blocks until the system + urandom entropy pool is initialized to increase the security. See + the PEP 524(3) for the rationale. + + * The *note hashlib: 88. and *note ssl: f0. modules now support + OpenSSL 1.1.0. + + * The default settings and feature set of the *note ssl: f0. module + have been improved. + + * The *note hashlib: 88. module received support for the BLAKE2, + SHA-3 and SHAKE hash algorithms and the *note scrypt(): 8aa. key + derivation function. + +Windows improvements: + + * *note PEP 528: 8ab. and *note PEP 529: 8ac, Windows filesystem and + console encoding changed to UTF-8. + + * The ‘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. + + * ‘python.exe’ and ‘pythonw.exe’ have been marked as long-path aware, + which means that the 260 character path limit may no longer apply. + See *note removing the MAX_PATH limitation: 8ad. for details. + + * A ‘._pth’ file can be added to force isolated mode and fully + specify all search paths to avoid registry and environment lookup. + See *note the documentation: 88c. for more information. + + * A ‘python36.zip’ file now works as a landmark to infer *note + PYTHONHOME: 8ae. See *note the documentation: 88c. for more + information. + + ---------- Footnotes ---------- + + (1) +https://mail.python.org/pipermail/python-dev/2012-December/123028.html + + (2) +https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html + + (3) https://peps.python.org/pep-0524/ + + +File: python.info, Node: New Features<9>, Next: Other Language Changes<6>, Prev: Summary – Release highlights<5>, Up: What’s New In Python 3 6 + +1.6.2 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:: + + +File: python.info, Node: PEP 498 Formatted string literals, Next: PEP 526 Syntax for variable annotations, Up: New Features<9> + +1.6.2.1 PEP 498: Formatted string literals +.......................................... + +PEP 498(1) introduces a new kind of string literals: `f-strings', or +*note formatted string literals: 5f9. + +Formatted string literals are prefixed with ‘'f'’ and are similar to the +format strings accepted by *note str.format(): 1fc. They contain +replacement fields surrounded by curly braces. The replacement fields +are expressions, which are evaluated at run time, and then formatted +using the *note format(): 1f7. protocol: + + >>> 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' + +See also +........ + +PEP 498(2) – Literal String Interpolation. + + PEP written and implemented by Eric V. Smith. + +*note Feature documentation: 5f9. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0498/ + + (2) https://peps.python.org/pep-0498/ + + +File: python.info, Node: PEP 526 Syntax for variable annotations, Next: PEP 515 Underscores in Numeric Literals, Prev: PEP 498 Formatted string literals, Up: New Features<9> + +1.6.2.2 PEP 526: Syntax for variable annotations +................................................ + +PEP 484(1) 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: + + primes: List[int] = [] + + captain: str # Note: no initial value! + + class Starship: + stats: Dict[str, int] = {} + +Just as for function annotations, the Python interpreter does not attach +any particular meaning to variable annotations and only stores them in +the ‘__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 ‘__annotations__’ attribute. + +See also +........ + +PEP 526(2) – Syntax for variable annotations. + + PEP written by Ryan Gonzalez, Philip House, Ivan Levkivskyi, Lisa + Roach, and Guido van Rossum. Implemented by Ivan Levkivskyi. + +Tools that use or will use the new syntax: mypy(3), pytype(4), PyCharm, +etc. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0526/ + + (3) http://www.mypy-lang.org/ + + (4) https://github.com/google/pytype + + +File: python.info, Node: PEP 515 Underscores in Numeric Literals, Next: PEP 525 Asynchronous Generators, Prev: PEP 526 Syntax for variable annotations, Up: New Features<9> + +1.6.2.3 PEP 515: Underscores in Numeric Literals +................................................ + +PEP 515(1) adds the ability to use underscores in numeric literals for +improved readability. For example: + + >>> 1_000_000_000_000_000 + 1000000000000000 + >>> 0x_FF_FF_FF_FF + 4294967295 + +Single underscores are allowed between digits and after any base +specifier. Leading, trailing, or multiple underscores in a row are not +allowed. + +The *note string formatting: 1b0. language also now has support for the +‘'_'’ option to signal the use of an underscore for a thousands +separator for floating point presentation types and for integer +presentation type ‘'d'’. For integer presentation types ‘'b'’, ‘'o'’, +‘'x'’, and ‘'X'’, underscores will be inserted every 4 digits: + + >>> '{:_}'.format(1000000) + '1_000_000' + >>> '{:_x}'.format(0xFFFFFFFF) + 'ffff_ffff' + +See also +........ + +PEP 515(2) – Underscores in Numeric Literals + + PEP written by Georg Brandl and Serhiy Storchaka. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0515/ + + (2) https://peps.python.org/pep-0515/ + + +File: python.info, Node: PEP 525 Asynchronous Generators, Next: PEP 530 Asynchronous Comprehensions, Prev: PEP 515 Underscores in Numeric Literals, Up: New Features<9> + +1.6.2.4 PEP 525: Asynchronous Generators +........................................ + +PEP 492(1) introduced support for native coroutines and ‘async’ / +‘await’ syntax to Python 3.5. A notable limitation of the Python 3.5 +implementation is that it was not possible to use ‘await’ and ‘yield’ in +the same function body. In Python 3.6 this restriction has been lifted, +making it possible to define `asynchronous generators': + + 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) + +The new syntax allows for faster and more concise code. + +See also +........ + +PEP 525(2) – Asynchronous Generators + + PEP written and implemented by Yury Selivanov. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0492/ + + (2) https://peps.python.org/pep-0525/ + + +File: python.info, Node: PEP 530 Asynchronous Comprehensions, Next: PEP 487 Simpler customization of class creation, Prev: PEP 525 Asynchronous Generators, Up: New Features<9> + +1.6.2.5 PEP 530: Asynchronous Comprehensions +............................................ + +PEP 530(1) adds support for using ‘async for’ in list, set, dict +comprehensions and generator expressions: + + result = [i async for i in aiter() if i % 2] + +Additionally, ‘await’ expressions are supported in all kinds of +comprehensions: + + result = [await fun() for fun in funcs if await condition()] + +See also +........ + +PEP 530(2) – Asynchronous Comprehensions + + PEP written and implemented by Yury Selivanov. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0530/ + + (2) https://peps.python.org/pep-0530/ + + +File: python.info, Node: PEP 487 Simpler customization of class creation, Next: PEP 487 Descriptor Protocol Enhancements, Prev: PEP 530 Asynchronous Comprehensions, Up: New Features<9> + +1.6.2.6 PEP 487: Simpler customization of class creation +........................................................ + +It is now possible to customize subclass creation without using a +metaclass. The new ‘__init_subclass__’ classmethod will be called on +the base class whenever a new subclass is created: + + class PluginBase: + subclasses = [] + + def __init_subclass__(cls, **kwargs): + super().__init_subclass__(**kwargs) + cls.subclasses.append(cls) + + class Plugin1(PluginBase): + pass + + class Plugin2(PluginBase): + pass + +In order to allow zero-argument *note super(): 8b7. calls to work +correctly from *note __init_subclass__(): 20d. implementations, custom +metaclasses must ensure that the new ‘__classcell__’ namespace entry is +propagated to ‘type.__new__’ (as described in *note Creating the class +object: 8b8.). + +See also +........ + +PEP 487(1) – Simpler customization of class creation + + PEP written and implemented by Martin Teichmann. + +*note Feature documentation: 8b9. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0487/ + + +File: python.info, Node: PEP 487 Descriptor Protocol Enhancements, Next: PEP 519 Adding a file system path protocol, Prev: PEP 487 Simpler customization of class creation, Up: New Features<9> + +1.6.2.7 PEP 487: Descriptor Protocol Enhancements +................................................. + +PEP 487(1) extends the descriptor protocol to include the new optional +*note __set_name__(): 8bc. 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: + + 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() + +See also +........ + +PEP 487(2) – Simpler customization of class creation + + PEP written and implemented by Martin Teichmann. + +*note Feature documentation: 8bd. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0487/ + + (2) https://peps.python.org/pep-0487/ + + +File: python.info, Node: PEP 519 Adding a file system path protocol, Next: PEP 495 Local Time Disambiguation, Prev: PEP 487 Descriptor Protocol Enhancements, Up: New Features<9> + +1.6.2.8 PEP 519: Adding a file system path protocol +................................................... + +File system paths have historically been represented as *note str: 1b3. +or *note bytes: 1b4. 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 *note int: 1c7. 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 *note pathlib: c5. from working with pre-existing +code, including Python’s standard library. + +To fix this situation, a new interface represented by *note os.PathLike: +8bf. has been defined. By implementing the *note __fspath__(): 8c0. +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 *note str: +1b3. or *note bytes: 1b4. object. This means an object is considered +*note path-like: 773. if it implements *note os.PathLike: 8bf. or is a +*note str: 1b3. or *note bytes: 1b4. object which represents a file +system path. Code can use *note os.fspath(): 8c1, *note os.fsdecode(): +8c2, or *note os.fsencode(): 8c3. to explicitly get a *note str: 1b3. +and/or *note bytes: 1b4. representation of a path-like object. + +The built-in *note open(): 30b. function has been updated to accept +*note os.PathLike: 8bf. objects, as have all relevant functions in the +*note os: c2. and *note os.path: c3. modules, and most other functions +and classes in the standard library. The *note os.DirEntry: 8c4. class +and relevant classes in *note pathlib: c5. have also been updated to +implement *note os.PathLike: 8bf. + +The hope is that updating the fundamental functions for operating on +file system paths will lead to third-party code to implicitly support +all *note path-like objects: 773. without any code changes, or at least +very minimal ones (e.g. calling *note os.fspath(): 8c1. at the +beginning of code before operating on a path-like object). + +Here are some examples of how the new interface allows for *note +pathlib.Path: 65f. to be used more easily and transparently with +pre-existing code: + + >>> 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' + +(Implemented by Brett Cannon, Ethan Furman, Dusty Phillips, and Jelle +Zijlstra.) + +See also +........ + +PEP 519(1) – Adding a file system path protocol + + PEP written by Brett Cannon and Koos Zevenhoven. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0519/ + + +File: python.info, Node: PEP 495 Local Time Disambiguation, Next: PEP 529 Change Windows filesystem encoding to UTF-8, Prev: PEP 519 Adding a file system path protocol, Up: New Features<9> + +1.6.2.9 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. + +PEP 495(1) adds the new `fold' attribute to instances of *note +datetime.datetime: 4be. and *note datetime.time: 4bf. classes to +differentiate between two moments in time for which local times are the +same: + + >>> 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 + +The values of the *note fold: 8c6. attribute have the value ‘0’ for all +instances except those that represent the second (chronologically) +moment in time in an ambiguous case. + +See also +........ + +PEP 495(2) – Local Time Disambiguation + + PEP written by Alexander Belopolsky and Tim Peters, implementation + by Alexander Belopolsky. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0495/ + + (2) https://peps.python.org/pep-0495/ + + +File: python.info, Node: PEP 529 Change Windows filesystem encoding to UTF-8, Next: PEP 528 Change Windows console encoding to UTF-8, Prev: PEP 495 Local Time Disambiguation, Up: New Features<9> + +1.6.2.10 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 *note sys.getfilesystemencoding(): 8c8, which now defaults +to ‘'utf-8'’. + +Applications that do not use str to represent paths should use *note +os.fsencode(): 8c3. and *note os.fsdecode(): 8c2. to ensure their bytes +are correctly encoded. To revert to the previous behaviour, set *note +PYTHONLEGACYWINDOWSFSENCODING: 8c9. or call *note +sys._enablelegacywindowsfsencoding(): 8ca. + +See PEP 529(1) for more information and discussion of code modifications +that may be required. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0529/ + + +File: python.info, Node: PEP 528 Change Windows console encoding to UTF-8, Next: PEP 520 Preserving Class Attribute Definition Order, Prev: PEP 529 Change Windows filesystem encoding to UTF-8, Up: New Features<9> + +1.6.2.11 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. ‘sys.stdin’, +‘sys.stdout’ and ‘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 *note PYTHONLEGACYWINDOWSSTDIO: 8cc. + +See also +........ + +PEP 528(1) – Change Windows console encoding to UTF-8 + + PEP written and implemented by Steve Dower. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0528/ + + +File: python.info, Node: PEP 520 Preserving Class Attribute Definition Order, Next: PEP 468 Preserving Keyword Argument Order, Prev: PEP 528 Change Windows console encoding to UTF-8, Up: New Features<9> + +1.6.2.12 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 *note __dict__: 8ce. attribute. + +Also, the effective default class `execution' namespace (returned from +*note type.__prepare__(): 8cf.) is now an insertion-order-preserving +mapping. + +See also +........ + +PEP 520(1) – Preserving Class Attribute Definition Order + + PEP written and implemented by Eric Snow. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0520/ + + +File: python.info, Node: PEP 468 Preserving Keyword Argument Order, Next: New dict implementation, Prev: PEP 520 Preserving Class Attribute Definition Order, Up: New Features<9> + +1.6.2.13 PEP 468: Preserving Keyword Argument Order +................................................... + +‘**kwargs’ in a function signature is now guaranteed to be an +insertion-order-preserving mapping. + +See also +........ + +PEP 468(1) – Preserving Keyword Argument Order + + PEP written and implemented by Eric Snow. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0468/ + + +File: python.info, Node: New dict implementation, Next: PEP 523 Adding a frame evaluation API to CPython, Prev: PEP 468 Preserving Keyword Argument Order, Up: New Features<9> + +1.6.2.14 New dict implementation +................................ + +The *note dict: 719. type now uses a “compact” representation based on a +proposal by Raymond Hettinger(1) which was first implemented by PyPy(2). +The memory usage of the new *note dict(): 16e. 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(3). Idea originally suggested +by Raymond Hettinger(4).) + + ---------- Footnotes ---------- + + (1) +https://mail.python.org/pipermail/python-dev/2012-December/123028.html + + (2) +https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27350 + + (4) +https://mail.python.org/pipermail/python-dev/2012-December/123028.html + + +File: python.info, Node: PEP 523 Adding a frame evaluation API to CPython, Next: PYTHONMALLOC environment variable, Prev: New dict implementation, Up: New Features<9> + +1.6.2.15 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. + +PEP 523(1) 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. + +See also +........ + +PEP 523(2) – Adding a frame evaluation API to CPython + + PEP written by Brett Cannon and Dino Viehland. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0523/ + + (2) https://peps.python.org/pep-0523/ + + +File: python.info, Node: PYTHONMALLOC environment variable, Next: DTrace and SystemTap probing support, Prev: PEP 523 Adding a frame evaluation API to CPython, Up: New Features<9> + +1.6.2.16 PYTHONMALLOC environment variable +.......................................... + +The new *note PYTHONMALLOC: 8d5. 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 ‘PYTHONMALLOC=debug’. Effects of +debug hooks: + + * Newly allocated memory is filled with the byte ‘0xCB’ + + * Freed memory is filled with the byte ‘0xDB’ + + * Detect violations of the Python memory allocator API. For example, + *note PyObject_Free(): 8d6. called on a memory block allocated by + *note PyMem_Malloc(): 8d7. + + * Detect writes before the start of a buffer (buffer underflows) + + * Detect writes after the end of a buffer (buffer overflows) + + * Check that the *note GIL: 8d8. is held when allocator functions of + ‘PYMEM_DOMAIN_OBJ’ (ex: *note PyObject_Malloc(): 8d9.) and + ‘PYMEM_DOMAIN_MEM’ (ex: *note PyMem_Malloc(): 8d7.) domains are + called. + +Checking if the GIL is held is also a new feature of Python 3.6. + +See the *note PyMem_SetupDebugHooks(): 8da. function for debug hooks on +Python memory allocators. + +It is now also possible to force the usage of the ‘malloc()’ allocator +of the C library for all Python memory allocations using +‘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 *note +tracemalloc: 11e. module to get the traceback where a memory block was +allocated. + +Example of fatal error on buffer overflow using ‘python3.6 -X +tracemalloc=5’ (store 5 frames in traces): + + 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__ + ... + +(Contributed by Victor Stinner in bpo-26516(1) and bpo-26564(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26516 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26564 + + +File: python.info, Node: DTrace and SystemTap probing support, Prev: PYTHONMALLOC environment variable, Up: New Features<9> + +1.6.2.17 DTrace and SystemTap probing support +............................................. + +Python can now be built ‘--with-dtrace’ which enables static markers for +the following events in the interpreter: + + * function call/return + + * garbage collection started/finished + + * line of code executed. + +This can be used to instrument running interpreters in production, +without the need to recompile specific *note debug builds: 496. or +providing application-specific profiling/debugging code. + +More details in *note Instrumenting CPython with DTrace and SystemTap: +8dc. + +The current implementation is tested on Linux and macOS. Additional +markers may be added in the future. + +(Contributed by Łukasz Langa in bpo-21590(1), based on patches by Jesús +Cea Avión, David Malcolm, and Nikhil Benesch.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21590 + + +File: python.info, Node: Other Language Changes<6>, Next: New Modules<6>, Prev: New Features<9>, Up: What’s New In Python 3 6 + +1.6.3 Other Language Changes +---------------------------- + +Some smaller changes made to the core Python language are: + + * A ‘global’ or ‘nonlocal’ statement must now textually appear before + the first use of the affected name in the same scope. Previously + this was a *note SyntaxWarning: 2d5. + + * It is now possible to set a *note special method: 8de. to ‘None’ to + indicate that the corresponding operation is not available. For + example, if a class sets ‘__iter__()’ to ‘None’, the class is not + iterable. (Contributed by Andrew Barnert and Ivan Levkivskyi in + bpo-25958(1).) + + * Long sequences of repeated traceback lines are now abbreviated as + ‘"[Previous line repeated {count} more times]"’ (see *note + traceback: 8df. for an example). (Contributed by Emanuel Barry in + bpo-26823(2).) + + * Import now raises the new exception *note ModuleNotFoundError: 79e. + (subclass of *note ImportError: 511.) 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(3).) + + * Class methods relying on zero-argument ‘super()’ will now work + correctly when called from metaclass methods during class creation. + (Contributed by Martin Teichmann in bpo-23722(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25958 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26823 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=15767 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + +File: python.info, Node: New Modules<6>, Next: Improved Modules<6>, Prev: Other Language Changes<6>, Up: What’s New In Python 3 6 + +1.6.4 New Modules +----------------- + +* Menu: + +* secrets:: + + +File: python.info, Node: secrets, Up: New Modules<6> + +1.6.4.1 secrets +............... + +The main purpose of the new *note secrets: e1. 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. + + Warning: Note that the pseudo-random generators in the *note + random: d9. module should `NOT' be used for security purposes. Use + *note secrets: e1. on Python 3.6+ and *note os.urandom(): 237. on + Python 3.5 and earlier. + +See also +........ + +PEP 506(1) – Adding A Secrets Module To The Standard Library + + PEP written and implemented by Steven D’Aprano. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0506/ + + +File: python.info, Node: Improved Modules<6>, Next: Optimizations<6>, Prev: New Modules<6>, Up: What’s New In Python 3 6 + +1.6.5 Improved Modules +---------------------- + +* Menu: + +* array: array<2>. +* ast: ast<3>. +* asyncio: asyncio<7>. +* binascii: binascii<2>. +* cmath:: +* collections: collections<4>. +* concurrent.futures: concurrent futures<3>. +* contextlib: contextlib<4>. +* datetime: datetime<5>. +* decimal: decimal<2>. +* distutils: distutils<4>. +* email:: +* encodings: encodings<2>. +* enum: enum<5>. +* faulthandler: faulthandler<2>. +* fileinput: fileinput<2>. +* hashlib: hashlib<4>. +* http.client: http client<2>. +* idlelib and IDLE: idlelib and IDLE<2>. +* importlib: importlib<4>. +* inspect: inspect<5>. +* json:: +* logging: logging<4>. +* math: math<5>. +* multiprocessing: multiprocessing<4>. +* os: os<6>. +* pathlib: pathlib<6>. +* pdb: pdb<3>. +* pickle: pickle<2>. +* pickletools:: +* pydoc: pydoc<3>. +* random: random<2>. +* re: re<3>. +* readline:: +* rlcompleter:: +* shlex: shlex<2>. +* site: site<2>. +* sqlite3: sqlite3<4>. +* socket: socket<7>. +* socketserver: socketserver<2>. +* ssl: ssl<5>. +* statistics: statistics<3>. +* struct:: +* subprocess: subprocess<2>. +* sys: sys<7>. +* telnetlib:: +* time: time<5>. +* timeit:: +* tkinter: tkinter<4>. +* traceback: traceback<3>. +* tracemalloc: tracemalloc<3>. +* typing: typing<6>. +* unicodedata: unicodedata<5>. +* unittest.mock: unittest mock<2>. +* urllib.request: urllib request. +* urllib.robotparser: urllib robotparser. +* venv: venv<4>. +* warnings: warnings<3>. +* winreg:: +* winsound:: +* xmlrpc.client: xmlrpc client. +* zipfile: zipfile<3>. +* zlib:: + + +File: python.info, Node: array<2>, Next: ast<3>, Up: Improved Modules<6> + +1.6.5.1 array +............. + +Exhausted iterators of *note array.array: 3d2. 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(1). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26492 + + +File: python.info, Node: ast<3>, Next: asyncio<7>, Prev: array<2>, Up: Improved Modules<6> + +1.6.5.2 ast +........... + +The new *note ast.Constant: 6c0. 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(1). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26146 + + +File: python.info, Node: asyncio<7>, Next: binascii<2>, Prev: ast<3>, Up: Improved Modules<6> + +1.6.5.3 asyncio +............... + +Starting with Python 3.6 the ‘asyncio’ module is no longer provisional +and its API is considered stable. + +Notable changes in the *note asyncio: 9. module since Python 3.5.0 (all +backported to 3.5.x due to the provisional status): + + * The *note get_event_loop(): 475. function has been changed to + always return the currently running loop when called from + coroutines and callbacks. (Contributed by Yury Selivanov in + bpo-28613(1).) + + * The *note ensure_future(): 478. function and all functions that use + it, such as *note loop.run_until_complete(): 8e6, now accept all + kinds of *note awaitable objects: 8e7. (Contributed by Yury + Selivanov.) + + * New *note run_coroutine_threadsafe(): 4a5. function to submit + coroutines to event loops from other threads. (Contributed by + Vincent Michel.) + + * New *note Transport.is_closing(): 8e8. method to check if the + transport is closing or closed. (Contributed by Yury Selivanov.) + + * The *note loop.create_server(): 766. method can now accept a list + of hosts. (Contributed by Yann Sionneau.) + + * New *note loop.create_future(): 8e9. method to create Future + objects. This allows alternative event loop implementations, such + as uvloop(2), to provide a faster *note asyncio.Future: 477. + implementation. (Contributed by Yury Selivanov in bpo-27041(3).) + + * New *note loop.get_exception_handler(): 8ea. method to get the + current exception handler. (Contributed by Yury Selivanov in + bpo-27040(4).) + + * New *note StreamReader.readuntil(): 8eb. method to read data from + the stream until a separator bytes sequence appears. (Contributed + by Mark Korenberg.) + + * The performance of *note StreamReader.readexactly(): 8ec. has been + improved. (Contributed by Mark Korenberg in bpo-28370(5).) + + * The *note loop.getaddrinfo(): 87e. method is optimized to avoid + calling the system ‘getaddrinfo’ function if the address is already + resolved. (Contributed by A. Jesse Jiryu Davis.) + + * The *note loop.stop(): 8ed. 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(6).) + + * ‘Future.set_exception’ will now raise *note TypeError: 19c. when + passed an instance of the *note StopIteration: 865. exception. + (Contributed by Chris Angelico in bpo-26221(7).) + + * New *note loop.connect_accepted_socket(): 76e. 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(8).) + + * ‘TCP_NODELAY’ flag is now set for all TCP transports by default. + (Contributed by Yury Selivanov in bpo-27456(9).) + + * New *note loop.shutdown_asyncgens(): 8ee. to properly close pending + asynchronous generators before closing the loop. (Contributed by + Yury Selivanov in bpo-28003(10).) + + * *note Future: 477. and *note Task: 1e3. 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(11) and bpo-28544(12).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28613 + + (2) https://github.com/MagicStack/uvloop + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27041 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27040 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28370 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25593 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26221 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27392 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=27456 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28003 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=26081 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28544 + + +File: python.info, Node: binascii<2>, Next: cmath, Prev: asyncio<7>, Up: Improved Modules<6> + +1.6.5.4 binascii +................ + +The *note b2a_base64(): 8f0. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25357 + + +File: python.info, Node: cmath, Next: collections<4>, Prev: binascii<2>, Up: Improved Modules<6> + +1.6.5.5 cmath +............. + +The new *note cmath.tau: 8f2. (`τ') constant has been added. +(Contributed by Lisa Roach in bpo-12345(1), see PEP 628(2) for details.) + +New constants: *note cmath.inf: 8f3. and *note cmath.nan: 8f4. to match +*note math.inf: 8f5. and *note math.nan: 234, and also *note cmath.infj: +8f6. and *note cmath.nanj: 8f7. to match the format used by complex +repr. (Contributed by Mark Dickinson in bpo-23229(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12345 + + (2) https://peps.python.org/pep-0628/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23229 + + +File: python.info, Node: collections<4>, Next: concurrent futures<3>, Prev: cmath, Up: Improved Modules<6> + +1.6.5.6 collections +................... + +The new *note Collection: 8f9. abstract base class has been added to +represent sized iterable container classes. (Contributed by Ivan +Levkivskyi, docs by Neil Girdhar in bpo-27598(1).) + +The new *note Reversible: 8fa. abstract base class represents iterable +classes that also provide the ‘__reversed__()’ method. (Contributed by +Ivan Levkivskyi in bpo-25987(2).) + +The new *note AsyncGenerator: 8fb. abstract base class represents +asynchronous generators. (Contributed by Yury Selivanov in +bpo-28720(3).) + +The *note namedtuple(): 538. function now accepts an optional keyword +argument `module', which, when specified, is used for the ‘__module__’ +attribute of the returned named tuple class. (Contributed by Raymond +Hettinger in bpo-17941(4).) + +The `verbose' and `rename' arguments for *note namedtuple(): 538. are +now keyword-only. (Contributed by Raymond Hettinger in bpo-25628(5).) + +Recursive *note collections.deque: 1a9. instances can now be pickled. +(Contributed by Serhiy Storchaka in bpo-26482(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27598 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25987 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28720 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17941 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25628 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=26482 + + +File: python.info, Node: concurrent futures<3>, Next: contextlib<4>, Prev: collections<4>, Up: Improved Modules<6> + +1.6.5.7 concurrent.futures +.......................... + +The *note ThreadPoolExecutor: 311. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27664 + + +File: python.info, Node: contextlib<4>, Next: datetime<5>, Prev: concurrent futures<3>, Up: Improved Modules<6> + +1.6.5.8 contextlib +.................. + +The *note contextlib.AbstractContextManager: 8fe. class has been added +to provide an abstract base class for context managers. It provides a +sensible default implementation for ‘__enter__()’ which returns ‘self’ +and leaves ‘__exit__()’ an abstract method. A matching class has been +added to the *note typing: 123. module as *note typing.ContextManager: +8ff. (Contributed by Brett Cannon in bpo-25609(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25609 + + +File: python.info, Node: datetime<5>, Next: decimal<2>, Prev: contextlib<4>, Up: Improved Modules<6> + +1.6.5.9 datetime +................ + +The *note datetime: 4be. and *note time: 4bf. classes have the new +‘fold’ attribute used to disambiguate local time when necessary. Many +functions in the *note datetime: 2f. have been updated to support local +time disambiguation. See *note Local Time Disambiguation: 8a7. section +for more information. (Contributed by Alexander Belopolsky in +bpo-24773(1).) + +The *note datetime.strftime(): 901. and *note date.strftime(): 902. +methods now support ISO 8601 date directives ‘%G’, ‘%u’ and ‘%V’. +(Contributed by Ashley Anderson in bpo-12006(2).) + +The *note datetime.isoformat(): 786. 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(3).) + +The *note datetime.combine(): 903. now accepts an optional `tzinfo' +argument. (Contributed by Alexander Belopolsky in bpo-27661(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24773 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=12006 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19475 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27661 + + +File: python.info, Node: decimal<2>, Next: distutils<4>, Prev: datetime<5>, Up: Improved Modules<6> + +1.6.5.10 decimal +................ + +New *note Decimal.as_integer_ratio(): 905. method that returns a pair +‘(n, d)’ of integers that represent the given *note Decimal: 3bd. +instance as a fraction, in lowest terms and with a positive denominator: + + >>> Decimal('-3.14').as_integer_ratio() + (-157, 50) + +(Contributed by Stefan Krah amd Mark Dickinson in bpo-25928(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25928 + + +File: python.info, Node: distutils<4>, Next: email, Prev: decimal<2>, Up: Improved Modules<6> + +1.6.5.11 distutils +.................. + +The ‘default_format’ attribute has been removed from +‘distutils.command.sdist.sdist’ and the ‘formats’ attribute defaults to +‘['gztar']’. Although not anticipated, any code relying on the presence +of ‘default_format’ may need to be adapted. See bpo-27819(1) for more +details. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27819 + + +File: python.info, Node: email, Next: encodings<2>, Prev: distutils<4>, Up: Improved Modules<6> + +1.6.5.12 email +.............. + +The new email API, enabled via the `policy' keyword to various +constructors, is no longer provisional. The *note email: 64. +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(1).) + +The *note email.mime: 6e. classes now all accept an optional `policy' +keyword. (Contributed by Berker Peksag in bpo-27331(2).) + +The *note DecodedGenerator: 908. now supports the `policy' keyword. + +There is a new *note policy: 70. attribute, *note message_factory: 909, +that controls what class is used by default when the parser creates new +message objects. For the *note email.policy.compat32: 90a. policy this +is *note Message: 90b, for the new policies it is *note EmailMessage: +90c. (Contributed by R. David Murray in bpo-20476(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24277 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27331 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20476 + + +File: python.info, Node: encodings<2>, Next: enum<5>, Prev: email, Up: Improved Modules<6> + +1.6.5.13 encodings +.................. + +On Windows, added the ‘'oem'’ encoding to use ‘CP_OEMCP’, and the +‘'ansi'’ alias for the existing ‘'mbcs'’ encoding, which uses the +‘CP_ACP’ code page. (Contributed by Steve Dower in bpo-27959(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27959 + + +File: python.info, Node: enum<5>, Next: faulthandler<2>, Prev: encodings<2>, Up: Improved Modules<6> + +1.6.5.14 enum +............. + +Two new enumeration base classes have been added to the *note enum: 76. +module: *note Flag: 1fe. and ‘IntFlags’. Both are used to define +constants that can be combined using the bitwise operators. +(Contributed by Ethan Furman in bpo-23591(1).) + +Many standard library modules have been updated to use the ‘IntFlags’ +class for their constants. + +The new *note enum.auto: 90f. value can be used to assign values to enum +members automatically: + + >>> from enum import Enum, auto + >>> class Color(Enum): + ... red = auto() + ... blue = auto() + ... green = auto() + ... + >>> list(Color) + [, , ] + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23591 + + +File: python.info, Node: faulthandler<2>, Next: fileinput<2>, Prev: enum<5>, Up: Improved Modules<6> + +1.6.5.15 faulthandler +..................... + +On Windows, the *note faulthandler: 78. module now installs a handler +for Windows exceptions: see *note faulthandler.enable(): 911. +(Contributed by Victor Stinner in bpo-23848(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23848 + + +File: python.info, Node: fileinput<2>, Next: hashlib<4>, Prev: faulthandler<2>, Up: Improved Modules<6> + +1.6.5.16 fileinput +.................. + +*note hook_encoded(): 913. now supports the `errors' argument. +(Contributed by Joseph Hackman in bpo-25788(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25788 + + +File: python.info, Node: hashlib<4>, Next: http client<2>, Prev: fileinput<2>, Up: Improved Modules<6> + +1.6.5.17 hashlib +................ + +*note hashlib: 88. supports OpenSSL 1.1.0. The minimum recommend +version is 1.0.2. (Contributed by Christian Heimes in bpo-26470(1).) + +BLAKE2 hash functions were added to the module. *note blake2b(): 216. +and *note blake2s(): 217. are always available and support the full +feature set of BLAKE2. (Contributed by Christian Heimes in bpo-26798(2) +based on code by Dmitry Chestnykh and Samuel Neves. Documentation +written by Dmitry Chestnykh.) + +The SHA-3 hash functions ‘sha3_224()’, ‘sha3_256()’, ‘sha3_384()’, +‘sha3_512()’, and SHAKE hash functions ‘shake_128()’ and ‘shake_256()’ +were added. (Contributed by Christian Heimes in bpo-16113(3). Keccak +Code Package by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van +Assche, and Ronny Van Keer.) + +The password-based key derivation function *note scrypt(): 8aa. is now +available with OpenSSL 1.1.0 and newer. (Contributed by Christian +Heimes in bpo-27928(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26470 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26798 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16113 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27928 + + +File: python.info, Node: http client<2>, Next: idlelib and IDLE<2>, Prev: hashlib<4>, Up: Improved Modules<6> + +1.6.5.18 http.client +.................... + +*note HTTPConnection.request(): 916. and *note endheaders(): 917. both +now support chunked encoding request bodies. (Contributed by Demian +Brecht and Rolf Krahl in bpo-12319(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12319 + + +File: python.info, Node: idlelib and IDLE<2>, Next: importlib<4>, Prev: http client<2>, Up: Improved Modules<6> + +1.6.5.19 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(1). 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(2).) + +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(3).) + +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(4).) + +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(5).) The sample can be +edited to include other characters. (Contributed by Serhiy Storchaka in +bpo-31860(6).) + +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(7), bpo-33768(8), and bpo-33679(9).) + +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(10).) + +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(11).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24225 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=15786 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1612262 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27099 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=13802 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31860 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33642 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33768 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33679 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33656 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1529353 + + +File: python.info, Node: importlib<4>, Next: inspect<5>, Prev: idlelib and IDLE<2>, Up: Improved Modules<6> + +1.6.5.20 importlib +.................. + +Import now raises the new exception *note ModuleNotFoundError: 79e. +(subclass of *note ImportError: 511.) when it cannot find a module. +Code that current checks for ‘ImportError’ (in try-except) will still +work. (Contributed by Eric Snow in bpo-15767(1).) + +*note importlib.util.LazyLoader: 91a. now calls *note create_module(): +91b. on the wrapped loader, removing the restriction that *note +importlib.machinery.BuiltinImporter: 91c. and *note +importlib.machinery.ExtensionFileLoader: 91d. couldn’t be used with +*note importlib.util.LazyLoader: 91a. + +*note importlib.util.cache_from_source(): 91e, *note +importlib.util.source_from_cache(): 91f, and *note +importlib.util.spec_from_file_location(): 920. now accept a *note +path-like object: 773. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15767 + + +File: python.info, Node: inspect<5>, Next: json, Prev: importlib<4>, Up: Improved Modules<6> + +1.6.5.21 inspect +................ + +The *note inspect.signature(): 301. function now reports the implicit +‘.0’ parameters generated by the compiler for comprehension and +generator expression scopes as if they were positional-only parameters +called ‘implicit0’. (Contributed by Jelle Zijlstra in bpo-19611(1).) + +To reduce code churn when upgrading from Python 2.7 and the legacy +‘inspect.getargspec()’ API, the previously documented deprecation of +*note inspect.getfullargspec(): 302. has been reversed. While this +function is convenient for single/source Python 2/3 code bases, the +richer *note inspect.signature(): 301. interface remains the recommended +approach for new code. (Contributed by Nick Coghlan in bpo-27172(2)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19611 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27172 + + +File: python.info, Node: json, Next: logging<4>, Prev: inspect<5>, Up: Improved Modules<6> + +1.6.5.22 json +............. + +*note json.load(): 923. and *note json.loads(): 5a6. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17909 + + +File: python.info, Node: logging<4>, Next: math<5>, Prev: json, Up: Improved Modules<6> + +1.6.5.23 logging +................ + +The new *note WatchedFileHandler.reopenIfNeeded(): 925. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24884 + + +File: python.info, Node: math<5>, Next: multiprocessing<4>, Prev: logging<4>, Up: Improved Modules<6> + +1.6.5.24 math +............. + +The tau (`τ') constant has been added to the *note math: af. and *note +cmath: 17. modules. (Contributed by Lisa Roach in bpo-12345(1), see PEP +628(2) for details.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12345 + + (2) https://peps.python.org/pep-0628/ + + +File: python.info, Node: multiprocessing<4>, Next: os<6>, Prev: math<5>, Up: Improved Modules<6> + +1.6.5.25 multiprocessing +........................ + +*note Proxy Objects: 928. returned by *note multiprocessing.Manager(): +929. can now be nested. (Contributed by Davin Potts in bpo-6766(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6766 + + +File: python.info, Node: os<6>, Next: pathlib<6>, Prev: multiprocessing<4>, Up: Improved Modules<6> + +1.6.5.26 os +........... + +See the summary of *note PEP 519: 8a6. for details on how the *note os: +c2. and *note os.path: c3. modules now support *note path-like objects: +773. + +*note scandir(): 6b0. now supports *note bytes: 1b4. paths on Windows. + +A new *note close(): 92b. method allows explicitly closing a *note +scandir(): 6b0. iterator. The *note scandir(): 6b0. iterator now +supports the *note context manager: 1a0. protocol. If a ‘scandir()’ +iterator is neither exhausted nor explicitly closed a *note +ResourceWarning: 8a9. will be emitted in its destructor. (Contributed +by Serhiy Storchaka in bpo-25994(1).) + +On Linux, *note os.urandom(): 237. now blocks until the system urandom +entropy pool is initialized to increase the security. See the PEP +524(2) for the rationale. + +The Linux ‘getrandom()’ syscall (get random bytes) is now exposed as the +new *note os.getrandom(): 92c. function. (Contributed by Victor +Stinner, part of the PEP 524(3)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25994 + + (2) https://peps.python.org/pep-0524/ + + (3) https://peps.python.org/pep-0524/ + + +File: python.info, Node: pathlib<6>, Next: pdb<3>, Prev: os<6>, Up: Improved Modules<6> + +1.6.5.27 pathlib +................ + +*note pathlib: c5. now supports *note path-like objects: 773. +(Contributed by Brett Cannon in bpo-27186(1).) + +See the summary of *note PEP 519: 8a6. for details. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + +File: python.info, Node: pdb<3>, Next: pickle<2>, Prev: pathlib<6>, Up: Improved Modules<6> + +1.6.5.28 pdb +............ + +The *note Pdb: 56a. class constructor has a new optional `readrc' +argument to control whether ‘.pdbrc’ files should be read. + + +File: python.info, Node: pickle<2>, Next: pickletools, Prev: pdb<3>, Up: Improved Modules<6> + +1.6.5.29 pickle +............... + +Objects that need ‘__new__’ called with keyword arguments can now be +pickled using *note pickle protocols: 930. older than protocol version +4. Protocol version 4 already supports this case. (Contributed by +Serhiy Storchaka in bpo-24164(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24164 + + +File: python.info, Node: pickletools, Next: pydoc<3>, Prev: pickle<2>, Up: Improved Modules<6> + +1.6.5.30 pickletools +.................... + +*note pickletools.dis(): 932. now outputs the implicit memo index for +the ‘MEMOIZE’ opcode. (Contributed by Serhiy Storchaka in +bpo-25382(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25382 + + +File: python.info, Node: pydoc<3>, Next: random<2>, Prev: pickletools, Up: Improved Modules<6> + +1.6.5.31 pydoc +.............. + +The *note pydoc: d6. module has learned to respect the ‘MANPAGER’ +environment variable. (Contributed by Matthias Klose in bpo-8637(1).) + +*note help(): 514. and *note pydoc: d6. can now list named tuple fields +in the order they were defined rather than alphabetically. (Contributed +by Raymond Hettinger in bpo-24879(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8637 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24879 + + +File: python.info, Node: random<2>, Next: re<3>, Prev: pydoc<3>, Up: Improved Modules<6> + +1.6.5.32 random +............... + +The new *note choices(): 935. function returns a list of elements of +specified size from the given population with optional weights. +(Contributed by Raymond Hettinger in bpo-18844(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18844 + + +File: python.info, Node: re<3>, Next: readline, Prev: random<2>, Up: Improved Modules<6> + +1.6.5.33 re +........... + +Added support of modifier spans in regular expressions. Examples: +‘'(?i:p)ython'’ matches ‘'python'’ and ‘'Python'’, but not ‘'PYTHON'’; +‘'(?i)g(?-i:v)r'’ matches ‘'GvR'’ and ‘'gvr'’, but not ‘'GVR'’. +(Contributed by Serhiy Storchaka in bpo-433028(1).) + +Match object groups can be accessed by ‘__getitem__’, which is +equivalent to ‘group()’. So ‘mo['name']’ is now equivalent to +‘mo.group('name')’. (Contributed by Eric Smith in bpo-24454(2).) + +‘Match’ objects now support *note index-like objects: 3bf. as group +indices. (Contributed by Jeroen Demeyer and Xiang Zhang in +bpo-27177(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=433028 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24454 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27177 + + +File: python.info, Node: readline, Next: rlcompleter, Prev: re<3>, Up: Improved Modules<6> + +1.6.5.34 readline +................. + +Added *note set_auto_history(): 938. to enable or disable automatic +addition of input to the history list. (Contributed by Tyler Crompton +in bpo-26870(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26870 + + +File: python.info, Node: rlcompleter, Next: shlex<2>, Prev: readline, Up: Improved Modules<6> + +1.6.5.35 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(1) +and bpo-25209(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25011 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25209 + + +File: python.info, Node: shlex<2>, Next: site<2>, Prev: rlcompleter, Up: Improved Modules<6> + +1.6.5.36 shlex +.............. + +The *note shlex: 93b. has much *note improved shell compatibility: 93c. +through the new `punctuation_chars' argument to control which characters +are treated as punctuation. (Contributed by Vinay Sajip in +bpo-1521950(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1521950 + + +File: python.info, Node: site<2>, Next: sqlite3<4>, Prev: shlex<2>, Up: Improved Modules<6> + +1.6.5.37 site +............. + +When specifying paths to add to *note sys.path: 162. in a ‘.pth’ file, +you may now specify file paths on top of directories (e.g. zip files). +(Contributed by Wolfgang Langner in bpo-26587(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26587 + + +File: python.info, Node: sqlite3<4>, Next: socket<7>, Prev: site<2>, Up: Improved Modules<6> + +1.6.5.38 sqlite3 +................ + +*note sqlite3.Cursor.lastrowid: 93f. now supports the ‘REPLACE’ +statement. (Contributed by Alex LordThorsen in bpo-16864(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16864 + + +File: python.info, Node: socket<7>, Next: socketserver<2>, Prev: sqlite3<4>, Up: Improved Modules<6> + +1.6.5.39 socket +............... + +The *note ioctl(): 941. function now supports the *note +SIO_LOOPBACK_FAST_PATH: 942. control code. (Contributed by Daniel +Stokes in bpo-26536(1).) + +The *note getsockopt(): 943. constants ‘SO_DOMAIN’, ‘SO_PROTOCOL’, +‘SO_PEERSEC’, and ‘SO_PASSSEC’ are now supported. (Contributed by +Christian Heimes in bpo-26907(2).) + +The *note setsockopt(): 944. now supports the ‘setsockopt(level, +optname, None, optlen: int)’ form. (Contributed by Christian Heimes in +bpo-27744(3).) + +The socket module now supports the address family *note AF_ALG: 945. to +interface with Linux Kernel crypto API. ‘ALG_*’, ‘SOL_ALG’ and *note +sendmsg_afalg(): 946. were added. (Contributed by Christian Heimes in +bpo-27744(4) with support from Victor Stinner.) + +New Linux constants ‘TCP_USER_TIMEOUT’ and ‘TCP_CONGESTION’ were added. +(Contributed by Omar Sandoval, bpo-26273(5)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26536 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26907 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27744 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27744 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26273 + + +File: python.info, Node: socketserver<2>, Next: ssl<5>, Prev: socket<7>, Up: Improved Modules<6> + +1.6.5.40 socketserver +..................... + +Servers based on the *note socketserver: ed. module, including those +defined in *note http.server: 92, *note xmlrpc.server: 14b. and *note +wsgiref.simple_server: 139, now support the *note context manager: 1a0. +protocol. (Contributed by Aviv Palivoda in bpo-26404(1).) + +The ‘wfile’ attribute of *note StreamRequestHandler: 948. classes now +implements the *note io.BufferedIOBase: 949. writable interface. In +particular, calling *note write(): 94a. is now guaranteed to send the +data in full. (Contributed by Martin Panter in bpo-26721(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26404 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26721 + + +File: python.info, Node: ssl<5>, Next: statistics<3>, Prev: socketserver<2>, Up: Improved Modules<6> + +1.6.5.41 ssl +............ + +*note ssl: f0. supports OpenSSL 1.1.0. The minimum recommend version is +1.0.2. (Contributed by Christian Heimes in bpo-26470(1).) + +3DES has been removed from the default cipher suites and ChaCha20 +Poly1305 cipher suites have been added. (Contributed by Christian +Heimes in bpo-27850(2) and bpo-27766(3).) + +*note SSLContext: 430. has better default configuration for options and +ciphers. (Contributed by Christian Heimes in bpo-28043(4).) + +SSL session can be copied from one client-side connection to another +with the new *note SSLSession: 94c. class. TLS session resumption can +speed up the initial handshake, reduce latency and improve performance +(Contributed by Christian Heimes in bpo-19500(5) based on a draft by +Alex Warhawk.) + +The new *note get_ciphers(): 94d. method can be used to get a list of +enabled ciphers in order of cipher priority. + +All constants and flags have been converted to *note IntEnum: 1f9. and +‘IntFlags’. (Contributed by Christian Heimes in bpo-28025(6).) + +Server and client-side specific TLS protocols for *note SSLContext: 430. +were added. (Contributed by Christian Heimes in bpo-28085(7).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26470 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27850 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27766 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28043 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=19500 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28025 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28085 + + +File: python.info, Node: statistics<3>, Next: struct, Prev: ssl<5>, Up: Improved Modules<6> + +1.6.5.42 statistics +................... + +A new *note harmonic_mean(): 94f. function has been added. (Contributed +by Steven D’Aprano in bpo-27181(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27181 + + +File: python.info, Node: struct, Next: subprocess<2>, Prev: statistics<3>, Up: Improved Modules<6> + +1.6.5.43 struct +............... + +*note struct: f5. now supports IEEE 754 half-precision floats via the +‘'e'’ format specifier. (Contributed by Eli Stevens, Mark Dickinson in +bpo-11734(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11734 + + +File: python.info, Node: subprocess<2>, Next: sys<7>, Prev: struct, Up: Improved Modules<6> + +1.6.5.44 subprocess +................... + +*note subprocess.Popen: 6e8. destructor now emits a *note +ResourceWarning: 8a9. warning if the child process is still running. +Use the context manager protocol (‘with proc: ...’) or explicitly call +the *note wait(): 952. method to read the exit status of the child +process. (Contributed by Victor Stinner in bpo-26741(1).) + +The *note subprocess.Popen: 6e8. 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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26741 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=6135 + + +File: python.info, Node: sys<7>, Next: telnetlib, Prev: subprocess<2>, Up: Improved Modules<6> + +1.6.5.45 sys +............ + +The new *note getfilesystemencodeerrors(): 954. function returns the +name of the error mode used to convert between Unicode filenames and +bytes filenames. (Contributed by Steve Dower in bpo-27781(1).) + +On Windows the return value of the *note getwindowsversion(): 955. +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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27781 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27932 + + +File: python.info, Node: telnetlib, Next: time<5>, Prev: sys<7>, Up: Improved Modules<6> + +1.6.5.46 telnetlib +.................. + +*note Telnet: 957. is now a context manager (contributed by Stéphane +Wirtel in bpo-25485(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25485 + + +File: python.info, Node: time<5>, Next: timeit, Prev: telnetlib, Up: Improved Modules<6> + +1.6.5.47 time +............. + +The *note struct_time: 959. attributes ‘tm_gmtoff’ and ‘tm_zone’ are now +available on all platforms. + + +File: python.info, Node: timeit, Next: tkinter<4>, Prev: time<5>, Up: Improved Modules<6> + +1.6.5.48 timeit +............... + +The new *note Timer.autorange(): 95b. convenience method has been added +to call *note Timer.timeit(): 95c. repeatedly so that the total run time +is greater or equal to 200 milliseconds. (Contributed by Steven +D’Aprano in bpo-6422(1).) + +*note timeit: 10d. now warns when there is substantial (4x) variance +between best and worst times. (Contributed by Serhiy Storchaka in +bpo-23552(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6422 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23552 + + +File: python.info, Node: tkinter<4>, Next: traceback<3>, Prev: timeit, Up: Improved Modules<6> + +1.6.5.49 tkinter +................ + +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. (Contributed by +Serhiy Storchaka in bpo-22115(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22115 + + +File: python.info, Node: traceback<3>, Next: tracemalloc<3>, Prev: tkinter<4>, Up: Improved Modules<6> + +1.6.5.50 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: + + >>> def f(): f() + ... + >>> f() + Traceback (most recent call last): + File "", line 1, in + File "", line 1, in f + File "", line 1, in f + File "", line 1, in f + [Previous line repeated 995 more times] + RecursionError: maximum recursion depth exceeded + +(Contributed by Emanuel Barry in bpo-26823(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26823 + + +File: python.info, Node: tracemalloc<3>, Next: typing<6>, Prev: traceback<3>, Up: Improved Modules<6> + +1.6.5.51 tracemalloc +.................... + +The *note tracemalloc: 11e. module now supports tracing memory +allocations in multiple different address spaces. + +The new *note DomainFilter: 960. filter class has been added to filter +block traces by their address space (domain). + +(Contributed by Victor Stinner in bpo-26588(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26588 + + +File: python.info, Node: typing<6>, Next: unicodedata<5>, Prev: tracemalloc<3>, Up: Improved Modules<6> + +1.6.5.52 typing +............... + +Since the *note typing: 123. module is *note provisional: 757, all +changes introduced in Python 3.6 have also been backported to Python +3.5.x. + +The *note typing: 123. module has a much improved support for generic +type aliases. For example ‘Dict[str, Tuple[S, T]]’ is now a valid type +annotation. (Contributed by Guido van Rossum in Github #195(1).) + +The *note typing.ContextManager: 8ff. class has been added for +representing *note contextlib.AbstractContextManager: 8fe. (Contributed +by Brett Cannon in bpo-25609(2).) + +The *note typing.Collection: 962. class has been added for representing +*note collections.abc.Collection: 8f9. (Contributed by Ivan Levkivskyi +in bpo-27598(3).) + +The *note typing.ClassVar: 27a. type construct has been added to mark +class variables. As introduced in PEP 526(4), 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(5).) + +A new *note TYPE_CHECKING: 963. constant that is assumed to be ‘True’ by +the static type checkers, but is ‘False’ at runtime. (Contributed by +Guido van Rossum in Github #230(6).) + +A new *note NewType(): 964. helper function has been added to create +lightweight distinct types for annotations: + + from typing import NewType + + UserId = NewType('UserId', int) + some_id = UserId(524313) + +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(7).) + + ---------- Footnotes ---------- + + (1) https://github.com/python/typing/pull/195 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25609 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27598 + + (4) https://peps.python.org/pep-0526/ + + (5) https://github.com/python/typing/pull/280 + + (6) https://github.com/python/typing/issues/230 + + (7) https://github.com/python/typing/issues/189 + + +File: python.info, Node: unicodedata<5>, Next: unittest mock<2>, Prev: typing<6>, Up: Improved Modules<6> + +1.6.5.53 unicodedata +.................... + +The *note unicodedata: 124. module now uses data from Unicode 9.0.0(1). +(Contributed by Benjamin Peterson.) + + ---------- Footnotes ---------- + + (1) https://unicode.org/versions/Unicode9.0.0/ + + +File: python.info, Node: unittest mock<2>, Next: urllib request, Prev: unicodedata<5>, Up: Improved Modules<6> + +1.6.5.54 unittest.mock +...................... + +The *note Mock: 69b. class has the following improvements: + + * Two new methods, *note Mock.assert_called(): 967. and *note + Mock.assert_called_once(): 968. to check if the mock object was + called. (Contributed by Amit Saha in bpo-26323(1).) + + * The *note Mock.reset_mock(): 969. method now has two optional + keyword only arguments: `return_value' and `side_effect'. + (Contributed by Kushal Das in bpo-21271(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26323 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21271 + + +File: python.info, Node: urllib request, Next: urllib robotparser, Prev: unittest mock<2>, Up: Improved Modules<6> + +1.6.5.55 urllib.request +....................... + +If a HTTP request has a file or iterable body (other than a bytes +object) but no ‘Content-Length’ header, rather than throwing an error, +‘AbstractHTTPHandler’ now falls back to use chunked transfer encoding. +(Contributed by Demian Brecht and Rolf Krahl in bpo-12319(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12319 + + +File: python.info, Node: urllib robotparser, Next: venv<4>, Prev: urllib request, Up: Improved Modules<6> + +1.6.5.56 urllib.robotparser +........................... + +*note RobotFileParser: 96c. now supports the ‘Crawl-delay’ and +‘Request-rate’ extensions. (Contributed by Nikolay Bogoychev in +bpo-16099(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16099 + + +File: python.info, Node: venv<4>, Next: warnings<3>, Prev: urllib robotparser, Up: Improved Modules<6> + +1.6.5.57 venv +............. + +*note venv: 12f. accepts a new parameter ‘--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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22829 + + +File: python.info, Node: warnings<3>, Next: winreg, Prev: venv<4>, Up: Improved Modules<6> + +1.6.5.58 warnings +................. + +A new optional `source' parameter has been added to the *note +warnings.warn_explicit(): 96f. function: the destroyed object which +emitted a *note ResourceWarning: 8a9. A `source' attribute has also +been added to ‘warnings.WarningMessage’ (contributed by Victor Stinner +in bpo-26568(1) and bpo-26567(2)). + +When a *note ResourceWarning: 8a9. warning is logged, the *note +tracemalloc: 11e. module is now used to try to retrieve the traceback +where the destroyed object was allocated. + +Example with the script ‘example.py’: + + import warnings + + def func(): + return open(__file__) + + f = func() + f = None + +Output of the command ‘python3.6 -Wd -X tracemalloc=5 example.py’: + + 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() + +The “Object allocated at” traceback is new and is only displayed if +*note tracemalloc: 11e. is tracing Python memory allocations and if the +*note warnings: 130. module was already imported. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26568 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26567 + + +File: python.info, Node: winreg, Next: winsound, Prev: warnings<3>, Up: Improved Modules<6> + +1.6.5.59 winreg +............... + +Added the 64-bit integer type *note REG_QWORD: 971. (Contributed by +Clement Rouault in bpo-23026(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23026 + + +File: python.info, Node: winsound, Next: xmlrpc client, Prev: winreg, Up: Improved Modules<6> + +1.6.5.60 winsound +................. + +Allowed keyword arguments to be passed to *note Beep: 973, *note +MessageBeep: 974, and *note PlaySound: 975. (bpo-27982(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27982 + + +File: python.info, Node: xmlrpc client, Next: zipfile<3>, Prev: winsound, Up: Improved Modules<6> + +1.6.5.61 xmlrpc.client +...................... + +The *note xmlrpc.client: 14a. module now supports unmarshalling +additional data types used by the Apache XML-RPC implementation for +numerics and ‘None’. (Contributed by Serhiy Storchaka in bpo-26885(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26885 + + +File: python.info, Node: zipfile<3>, Next: zlib, Prev: xmlrpc client, Up: Improved Modules<6> + +1.6.5.62 zipfile +................ + +A new *note ZipInfo.from_file(): 978. class method allows making a *note +ZipInfo: 979. instance from a filesystem file. A new *note +ZipInfo.is_dir(): 97a. method can be used to check if the *note ZipInfo: +979. instance represents a directory. (Contributed by Thomas Kluyver in +bpo-26039(1).) + +The *note ZipFile.open(): 97b. 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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26039 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26039 + + +File: python.info, Node: zlib, Prev: zipfile<3>, Up: Improved Modules<6> + +1.6.5.63 zlib +............. + +The *note compress(): 97d. and *note decompress(): 97e. functions now +accept keyword arguments. (Contributed by Aviv Palivoda in bpo-26243(1) +and Xiang Zhang in bpo-16764(2) respectively.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26243 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16764 + + +File: python.info, Node: Optimizations<6>, Next: Build and C API Changes<2>, Prev: Improved Modules<6>, Up: What’s New In Python 3 6 + +1.6.6 Optimizations +------------------- + + * 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(1) and bpo-28050(2).) + + * The *note asyncio.Future: 477. class now has an optimized C + implementation. (Contributed by Yury Selivanov and INADA Naoki in + bpo-26081(3).) + + * The *note asyncio.Task: 1e3. class now has an optimized C + implementation. (Contributed by Yury Selivanov in bpo-28544(4).) + + * Various implementation improvements in the *note typing: 123. + module (such as caching of generic types) allow up to 30 times + performance improvements and reduced memory footprint. + + * The ASCII decoder is now up to 60 times as fast for error handlers + ‘surrogateescape’, ‘ignore’ and ‘replace’ (Contributed by Victor + Stinner in bpo-24870(5)). + + * The ASCII and the Latin1 encoders are now up to 3 times as fast for + the error handler ‘surrogateescape’ (Contributed by Victor Stinner + in bpo-25227(6)). + + * The UTF-8 encoder is now up to 75 times as fast for error handlers + ‘ignore’, ‘replace’, ‘surrogateescape’, ‘surrogatepass’ + (Contributed by Victor Stinner in bpo-25267(7)). + + * The UTF-8 decoder is now up to 15 times as fast for error handlers + ‘ignore’, ‘replace’ and ‘surrogateescape’ (Contributed by Victor + Stinner in bpo-25301(8)). + + * ‘bytes % args’ is now up to 2 times faster. (Contributed by Victor + Stinner in bpo-25349(9)). + + * ‘bytearray % args’ is now between 2.5 and 5 times faster. + (Contributed by Victor Stinner in bpo-25399(10)). + + * Optimize *note bytes.fromhex(): 745. and *note bytearray.fromhex(): + 746.: they are now between 2x and 3.5x faster. (Contributed by + Victor Stinner in bpo-25401(11)). + + * Optimize ‘bytes.replace(b'', b'.')’ and ‘bytearray.replace(b'', + b'.')’: up to 80% faster. (Contributed by Josh Snider in + bpo-26574(12)). + + * Allocator functions of the *note PyMem_Malloc(): 8d7. domain + (‘PYMEM_DOMAIN_MEM’) now use the *note pymalloc memory allocator: + 980. instead of ‘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 ‘malloc()’ for larger memory blocks. + (Contributed by Victor Stinner in bpo-26249(13)). + + * *note pickle.load(): 981. and *note pickle.loads(): 982. are now up + to 10% faster when deserializing many small objects (Contributed by + Victor Stinner in bpo-27056(14)). + + * Passing *note keyword arguments: 983. to a function has an overhead + in comparison with passing *note positional arguments: 984. Now in + extension functions implemented with using Argument Clinic this + overhead is significantly decreased. (Contributed by Serhiy + Storchaka in bpo-27574(15)). + + * Optimized *note glob(): 3f8. and *note iglob(): 3f9. functions in + the *note glob: 84. module; they are now about 3–6 times faster. + (Contributed by Serhiy Storchaka in bpo-25596(16)). + + * Optimized globbing in *note pathlib: c5. by using *note + os.scandir(): 6b0.; it is now about 1.5–4 times faster. + (Contributed by Serhiy Storchaka in bpo-26032(17)). + + * *note xml.etree.ElementTree: 142. parsing, iteration and deepcopy + performance has been significantly improved. (Contributed by + Serhiy Storchaka in bpo-25638(18), bpo-25873(19), and + bpo-25869(20).) + + * Creation of *note fractions.Fraction: 210. instances from floats + and decimals is now 2 to 3 times faster. (Contributed by Serhiy + Storchaka in bpo-25971(21).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26647 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28050 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26081 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28544 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24870 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25227 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=25267 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=25301 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25349 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=25399 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25401 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26574 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26249 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=27056 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=27574 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=25596 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=26032 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=25638 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=25873 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=25869 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=25971 + + +File: python.info, Node: Build and C API Changes<2>, Next: Other Improvements, Prev: Optimizations<6>, Up: What’s New In Python 3 6 + +1.6.7 Build and C API Changes +----------------------------- + + * 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 ‘PY_LONG_LONG’. For more information, + see PEP 7(1) and bpo-17884(2). + + * 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(3). + + * The ‘--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(4).) + + * The *note GIL: 8d8. must now be held when allocator functions of + ‘PYMEM_DOMAIN_OBJ’ (ex: *note PyObject_Malloc(): 8d9.) and + ‘PYMEM_DOMAIN_MEM’ (ex: *note PyMem_Malloc(): 8d7.) domains are + called. + + * New *note Py_FinalizeEx(): 986. API which indicates if flushing + buffered data failed. (Contributed by Martin Panter in + bpo-5319(5).) + + * *note PyArg_ParseTupleAndKeywords(): 987. now supports *note + positional-only parameters: 6d7. Positional-only parameters are + defined by empty names. (Contributed by Serhiy Storchaka in + bpo-26282(6)). + + * ‘PyTraceback_Print’ method now abbreviates long sequences of + repeated lines as ‘"[Previous line repeated {count} more times]"’. + (Contributed by Emanuel Barry in bpo-26823(7).) + + * The new *note PyErr_SetImportErrorSubclass(): 988. function allows + for specifying a subclass of *note ImportError: 511. to raise. + (Contributed by Eric Snow in bpo-15767(8).) + + * The new *note PyErr_ResourceWarning(): 989. function can be used to + generate a *note ResourceWarning: 8a9. providing the source of the + resource allocation. (Contributed by Victor Stinner in + bpo-26567(9).) + + * The new *note PyOS_FSPath(): 98a. function returns the file system + representation of a *note path-like object: 773. (Contributed by + Brett Cannon in bpo-27186(10).) + + * The *note PyUnicode_FSConverter(): 98b. and *note + PyUnicode_FSDecoder(): 98c. functions will now accept *note + path-like objects: 773. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0007/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17884 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26865 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26359 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=5319 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=26282 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26823 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=15767 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26567 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + +File: python.info, Node: Other Improvements, Next: Deprecated<7>, Prev: Build and C API Changes<2>, Up: What’s New In Python 3 6 + +1.6.8 Other Improvements +------------------------ + + * When *note –version: 98e. (short form: *note -V: 98f.) is supplied + twice, Python prints *note sys.version: 990. for detailed + information. + + $ ./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)] + + +File: python.info, Node: Deprecated<7>, Next: Removed<7>, Prev: Other Improvements, Up: What’s New In Python 3 6 + +1.6.9 Deprecated +---------------- + +* Menu: + +* New Keywords:: +* Deprecated Python behavior:: +* Deprecated Python modules, functions and methods: Deprecated Python modules functions and methods<2>. +* Deprecated functions and types of the C API: Deprecated functions and types of the C API<2>. +* Deprecated Build Options:: + + +File: python.info, Node: New Keywords, Next: Deprecated Python behavior, Up: Deprecated<7> + +1.6.9.1 New Keywords +.................... + +‘async’ and ‘await’ are not recommended to be used as variable, class, +function or module names. Introduced by PEP 492(1) in Python 3.5, they +will become proper keywords in Python 3.7. Starting in Python 3.6, the +use of ‘async’ or ‘await’ as names will generate a *note +DeprecationWarning: 2d4. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0492/ + + +File: python.info, Node: Deprecated Python behavior, Next: Deprecated Python modules functions and methods<2>, Prev: New Keywords, Up: Deprecated<7> + +1.6.9.2 Deprecated Python behavior +.................................. + +Raising the *note StopIteration: 865. exception inside a generator will +now generate a *note DeprecationWarning: 2d4, and will trigger a *note +RuntimeError: 6e9. in Python 3.7. See *note PEP 479; Change +StopIteration handling inside generators: 994. for details. + +The ‘__aiter__()’ method is now expected to return an asynchronous +iterator directly instead of returning an awaitable as previously. +Doing the former will trigger a *note DeprecationWarning: 2d4. Backward +compatibility will be removed in Python 3.7. (Contributed by Yury +Selivanov in bpo-27243(1).) + +A backslash-character pair that is not a valid escape sequence now +generates a *note DeprecationWarning: 2d4. Although this will +eventually become a *note SyntaxError: 2d6, that will not be for several +Python releases. (Contributed by Emanuel Barry in bpo-27364(2).) + +When performing a relative import, falling back on ‘__name__’ and +‘__path__’ from the calling module when ‘__spec__’ or ‘__package__’ are +not defined now raises an *note ImportWarning: 46d. (Contributed by +Rose Ames in bpo-25791(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27243 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27364 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25791 + + +File: python.info, Node: Deprecated Python modules functions and methods<2>, Next: Deprecated functions and types of the C API<2>, Prev: Deprecated Python behavior, Up: Deprecated<7> + +1.6.9.3 Deprecated Python modules, functions and methods +........................................................ + +* Menu: + +* asynchat:: +* asyncore:: +* dbm: dbm<3>. +* distutils: distutils<5>. +* grp:: +* importlib: importlib<5>. +* os: os<7>. +* re: re<4>. +* ssl: ssl<6>. +* tkinter: tkinter<5>. +* venv: venv<5>. + + +File: python.info, Node: asynchat, Next: asyncore, Up: Deprecated Python modules functions and methods<2> + +1.6.9.4 asynchat +................ + +The *note asynchat: 8. has been deprecated in favor of *note asyncio: 9. +(Contributed by Mariatta in bpo-25002(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25002 + + +File: python.info, Node: asyncore, Next: dbm<3>, Prev: asynchat, Up: Deprecated Python modules functions and methods<2> + +1.6.9.5 asyncore +................ + +The *note asyncore: a. has been deprecated in favor of *note asyncio: 9. +(Contributed by Mariatta in bpo-25002(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25002 + + +File: python.info, Node: dbm<3>, Next: distutils<5>, Prev: asyncore, Up: Deprecated Python modules functions and methods<2> + +1.6.9.6 dbm +........... + +Unlike other *note dbm: 30. implementations, the *note dbm.dumb: 31. +module creates databases with the ‘'rw'’ mode and allows modifying the +database opened with the ‘'r'’ mode. This behavior is now deprecated +and will be removed in 3.8. (Contributed by Serhiy Storchaka in +bpo-21708(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21708 + + +File: python.info, Node: distutils<5>, Next: grp, Prev: dbm<3>, Up: Deprecated Python modules functions and methods<2> + +1.6.9.7 distutils +................. + +The undocumented ‘extra_path’ argument to the ‘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(1) for details. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27919 + + +File: python.info, Node: grp, Next: importlib<5>, Prev: distutils<5>, Up: Deprecated Python modules functions and methods<2> + +1.6.9.8 grp +........... + +The support of non-integer arguments in *note getgrgid(): 99b. has been +deprecated. (Contributed by Serhiy Storchaka in bpo-26129(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26129 + + +File: python.info, Node: importlib<5>, Next: os<7>, Prev: grp, Up: Deprecated Python modules functions and methods<2> + +1.6.9.9 importlib +................. + +The *note importlib.machinery.SourceFileLoader.load_module(): 99d. and +*note importlib.machinery.SourcelessFileLoader.load_module(): 99e. +methods are now deprecated. They were the only remaining +implementations of *note importlib.abc.Loader.load_module(): 46b. in +*note importlib: 97. that had not been deprecated in previous versions +of Python in favour of *note importlib.abc.Loader.exec_module(): 46c. + +The *note importlib.machinery.WindowsRegistryFinder: 99f. class is now +deprecated. As of 3.6.0, it is still added to *note sys.meta_path: 9a0. +by default (on Windows), but this may change in future releases. + + +File: python.info, Node: os<7>, Next: re<4>, Prev: importlib<5>, Up: Deprecated Python modules functions and methods<2> + +1.6.9.10 os +........... + +Undocumented support of general *note bytes-like objects: 9a2. as paths +in *note os: c2. functions, *note compile(): 310. and similar functions +is now deprecated. (Contributed by Serhiy Storchaka in bpo-25791(1) and +bpo-26754(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25791 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26754 + + +File: python.info, Node: re<4>, Next: ssl<6>, Prev: os<7>, Up: Deprecated Python modules functions and methods<2> + +1.6.9.11 re +........... + +Support for inline flags ‘(?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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22493 + + +File: python.info, Node: ssl<6>, Next: tkinter<5>, Prev: re<4>, Up: Deprecated Python modules functions and methods<2> + +1.6.9.12 ssl +............ + +OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported. +In the future the *note ssl: f0. module will require at least OpenSSL +1.0.2 or 1.1.0. + +SSL-related arguments like ‘certfile’, ‘keyfile’ and ‘check_hostname’ in +*note ftplib: 7e, *note http.client: 8f, *note imaplib: 94, *note +poplib: cd, and *note smtplib: ea. have been deprecated in favor of +‘context’. (Contributed by Christian Heimes in bpo-28022(1).) + +A couple of protocols and functions of the *note ssl: f0. 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(2) and +bpo-26470(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28022 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28022 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26470 + + +File: python.info, Node: tkinter<5>, Next: venv<5>, Prev: ssl<6>, Up: Deprecated Python modules functions and methods<2> + +1.6.9.13 tkinter +................ + +The *note tkinter.tix: 117. module is now deprecated. *note tkinter: +10e. users should use *note tkinter.ttk: 118. instead. + + +File: python.info, Node: venv<5>, Prev: tkinter<5>, Up: Deprecated Python modules functions and methods<2> + +1.6.9.14 venv +............. + +The ‘pyvenv’ script has been deprecated in favour of ‘python3 -m venv’. +This prevents confusion as to what Python interpreter ‘pyvenv’ is +connected to and thus what Python interpreter will be used by the +virtual environment. (Contributed by Brett Cannon in bpo-25154(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25154 + + +File: python.info, Node: Deprecated functions and types of the C API<2>, Next: Deprecated Build Options, Prev: Deprecated Python modules functions and methods<2>, Up: Deprecated<7> + +1.6.9.15 Deprecated functions and types of the C API +.................................................... + +Undocumented functions ‘PyUnicode_AsEncodedObject()’, +‘PyUnicode_AsDecodedObject()’, ‘PyUnicode_AsEncodedUnicode()’ and +‘PyUnicode_AsDecodedUnicode()’ are deprecated now. Use the *note +generic codec based API: 9a8. instead. + + +File: python.info, Node: Deprecated Build Options, Prev: Deprecated functions and types of the C API<2>, Up: Deprecated<7> + +1.6.9.16 Deprecated Build Options +................................. + +The ‘--with-system-ffi’ configure flag is now on by default on non-macOS +UNIX platforms. It may be disabled by using ‘--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 ‘--with-system-ffi’ flag when building their system +Python. + + +File: python.info, Node: Removed<7>, Next: Porting to Python 3 6, Prev: Deprecated<7>, Up: What’s New In Python 3 6 + +1.6.10 Removed +-------------- + +* Menu: + +* API and Feature Removals: API and Feature Removals<3>. + + +File: python.info, Node: API and Feature Removals<3>, Up: Removed<7> + +1.6.10.1 API and Feature Removals +................................. + + * Unknown escapes consisting of ‘'\'’ and an ASCII letter in regular + expressions will now cause an error. In replacement templates for + *note re.sub(): 85d. they are still allowed, but deprecated. The + *note re.LOCALE: 7ca. flag can now only be used with binary + patterns. + + * ‘inspect.getmoduleinfo()’ was removed (was deprecated since CPython + 3.3). *note inspect.getmodulename(): 9ac. should be used for + obtaining the module name for a given path. (Contributed by Yury + Selivanov in bpo-13248(1).) + + * ‘traceback.Ignore’ class and ‘traceback.usage’, + ‘traceback.modname’, ‘traceback.fullmodname’, + ‘traceback.find_lines_from_code’, ‘traceback.find_lines’, + ‘traceback.find_strings’, ‘traceback.find_executable_lines’ methods + were removed from the *note traceback: 11d. module. They were + undocumented methods deprecated since Python 3.2 and equivalent + functionality is available from private methods. + + * The ‘tk_menuBar()’ and ‘tk_bindForTraversal()’ dummy methods in + *note tkinter: 10e. widget classes were removed (corresponding Tk + commands were obsolete since Tk 4.0). + + * The *note open(): 97b. method of the *note zipfile.ZipFile: 28c. + class no longer supports the ‘'U'’ mode (was deprecated since + Python 3.4). Use *note io.TextIOWrapper: 9ad. for reading + compressed text files in *note universal newlines: 9ae. mode. + + * The undocumented ‘IN’, ‘CDROM’, ‘DLFCN’, ‘TYPES’, ‘CDIO’, and + ‘STROPTS’ modules have been removed. They had been available in + the platform specific ‘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(2). + + * The deprecated ‘asynchat.fifo’ class has been removed. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13248 + + (2) +https://github.com/python/cpython/blob/v3.6.15/Tools/scripts/h2py.py + + +File: python.info, Node: Porting to Python 3 6, Next: Notable changes in Python 3 6 2, Prev: Removed<7>, Up: What’s New In Python 3 6 + +1.6.11 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<5>. +* Changes in the C API: Changes in the C API<5>. +* CPython bytecode changes: CPython bytecode changes<6>. + + +File: python.info, Node: Changes in ‘python’ Command Behavior, Next: Changes in the Python API<5>, Up: Porting to Python 3 6 + +1.6.11.1 Changes in ‘python’ Command Behavior +............................................. + + * 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’. + (Contributed by Serhiy Storchaka in bpo-23034(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23034 + + +File: python.info, Node: Changes in the Python API<5>, Next: Changes in the C API<5>, Prev: Changes in ‘python’ Command Behavior, Up: Porting to Python 3 6 + +1.6.11.2 Changes in the Python API +.................................. + + * *note open(): 30b. will no longer allow combining the ‘'U'’ mode + flag with ‘'+'’. (Contributed by Jeff Balogh and John O’Connor in + bpo-2091(1).) + + * *note sqlite3: ef. no longer implicitly commits an open transaction + before DDL statements. + + * On Linux, *note os.urandom(): 237. now blocks until the system + urandom entropy pool is initialized to increase the security. + + * When *note importlib.abc.Loader.exec_module(): 46c. is defined, + *note importlib.abc.Loader.create_module(): 91b. must also be + defined. + + * *note PyErr_SetImportError(): 9b2. now sets *note TypeError: 19c. + when its `msg' argument is not set. Previously only ‘NULL’ was + returned. + + * The format of the ‘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 + ‘frame.f_lineno’, ‘PyFrame_GetLineNumber()’ or ‘PyCode_Addr2Line()’ + are not affected. Functions directly decoding ‘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 ‘Objects/lnotab_notes.txt’ for the + ‘co_lnotab’ format and how to decode it, and see the PEP 511(2) for + the rationale. + + * The functions in the *note compileall: 1f. module now return + booleans instead of ‘1’ or ‘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 + ‘1’ or ‘0’. See bpo-25768(3). + + * Reading the ‘port’ attribute of *note urllib.parse.urlsplit(): 9b3. + and *note urlparse(): 9b4. results now raises *note ValueError: + 1c8. for out-of-range values, rather than returning *note None: + 243. See bpo-20059(4). + + * The *note imp: 96. module now raises a *note DeprecationWarning: + 2d4. instead of *note PendingDeprecationWarning: 503. + + * The following modules have had missing APIs added to their + ‘__all__’ attributes to match the documented APIs: *note calendar: + 13, *note cgi: 14, *note csv: 28, *note ElementTree: 142, *note + enum: 76, *note fileinput: 7b, *note ftplib: 7e, *note logging: a8, + *note mailbox: ac, *note mimetypes: b0, *note optparse: c1, *note + plistlib: cc, *note smtpd: e9, *note subprocess: f6, *note tarfile: + fd, *note threading: 10b. and *note wave: 131. This means they + will export new symbols when ‘import *’ is used. (Contributed by + Joel Taddei and Jacek Kołodziej in bpo-23883(5).) + + * When performing a relative import, if ‘__package__’ does not + compare equal to ‘__spec__.parent’ then *note ImportWarning: 46d. + is raised. (Contributed by Brett Cannon in bpo-25791(6).) + + * When a relative import is performed and no parent package is known, + then *note ImportError: 511. will be raised. Previously, *note + SystemError: 9b5. could be raised. (Contributed by Brett Cannon in + bpo-18018(7).) + + * Servers based on the *note socketserver: ed. module, including + those defined in *note http.server: 92, *note xmlrpc.server: 14b. + and *note wsgiref.simple_server: 139, now only catch exceptions + derived from *note Exception: 61c. Therefore if a request handler + raises an exception like *note SystemExit: 9b6. or *note + KeyboardInterrupt: 611, *note handle_error(): 9b7. is no longer + called, and the exception will stop a single-threaded server. + (Contributed by Martin Panter in bpo-23430(8).) + + * *note spwd.getspnam(): 9b8. now raises a *note PermissionError: + 9b9. instead of *note KeyError: 6f5. if the user doesn’t have + privileges. + + * The *note socket.socket.close(): 9ba. method now raises an + exception if an error (e.g. ‘EBADF’) was reported by the + underlying system call. (Contributed by Martin Panter in + bpo-26685(9).) + + * The `decode_data' argument for the *note smtpd.SMTPChannel: 9bb. + and *note smtpd.SMTPServer: 9bc. constructors is now ‘False’ by + default. This means that the argument passed to *note + process_message(): 9bd. is now a bytes object by default, and + ‘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. + + * All optional arguments of the *note dump(): 9be, *note dumps(): + 9bf, *note load(): 923. and *note loads(): 5a6. functions and *note + JSONEncoder: 9c0. and *note JSONDecoder: 9c1. class constructors in + the *note json: a2. module are now *note keyword-only: 6dc. + (Contributed by Serhiy Storchaka in bpo-18726(10).) + + * Subclasses of *note type: 9c2. which don’t override ‘type.__new__’ + may no longer use the one-argument form to get the type of an + object. + + * As part of PEP 487(11), the handling of keyword arguments passed to + *note type: 9c2. (other than the metaclass hint, ‘metaclass’) is + now consistently delegated to *note object.__init_subclass__(): + 20d. This means that ‘type.__new__()’ and ‘type.__init__()’ both + now accept arbitrary keyword arguments, but *note + object.__init_subclass__(): 20d. (which is called from + ‘type.__new__()’) will reject them by default. Custom metaclasses + accepting additional keyword arguments will need to adjust their + calls to ‘type.__new__()’ (whether direct or via *note super: 8b7.) + accordingly. + + * In ‘distutils.command.sdist.sdist’, the ‘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 ‘setup.cfg’ file containing + the following: + + [sdist] + formats=zip + + This behavior has also been backported to earlier Python versions + by Setuptools 26.0.0. + + * In the *note urllib.request: 12a. module and the *note + http.client.HTTPConnection.request(): 916. 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(12).) + + * The *note DictReader: 628. now returns rows of type *note + OrderedDict: 1a8. (Contributed by Steve Holden in bpo-27842(13).) + + * The *note crypt.METHOD_CRYPT: 9c3. will no longer be added to + ‘crypt.methods’ if unsupported by the platform. (Contributed by + Victor Stinner in bpo-25287(14).) + + * The `verbose' and `rename' arguments for *note namedtuple(): 538. + are now keyword-only. (Contributed by Raymond Hettinger in + bpo-25628(15).) + + * On Linux, *note ctypes.util.find_library(): 9c4. now looks in + ‘LD_LIBRARY_PATH’ for shared libraries. (Contributed by Vinay + Sajip in bpo-9998(16).) + + * The *note imaplib.IMAP4: 546. class now handles flags containing + the ‘']'’ character in messages sent from the server to improve + real-world compatibility. (Contributed by Lita Cho in + bpo-21815(17).) + + * The ‘mmap.write()’ function now returns the number of bytes written + like other write methods. (Contributed by Jakub Stasiak in + bpo-26335(18).) + + * The *note pkgutil.iter_modules(): 9c5. and *note + pkgutil.walk_packages(): 869. functions now return *note + ModuleInfo: 9c6. named tuples. (Contributed by Ramchandra Apte in + bpo-17211(19).) + + * *note re.sub(): 85d. 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(20).) + + * *note zipfile.ZipFile: 28c. will now raise *note + NotImplementedError: 9c7. for unrecognized compression values. + Previously a plain *note RuntimeError: 6e9. was raised. + Additionally, calling *note ZipFile: 28c. methods on a closed + ZipFile or calling the *note write(): 9c8. method on a ZipFile + created with mode ‘'r'’ will raise a *note ValueError: 1c8. + Previously, a *note RuntimeError: 6e9. was raised in those + scenarios. + + * when custom metaclasses are combined with zero-argument *note + super(): 8b7. or direct references from methods to the implicit + ‘__class__’ closure variable, the implicit ‘__classcell__’ + namespace entry must now be passed up to ‘type.__new__’ for + initialisation. Failing to do so will result in a *note + DeprecationWarning: 2d4. in Python 3.6 and a *note RuntimeError: + 6e9. in Python 3.8. + + * With the introduction of *note ModuleNotFoundError: 79e, import + system consumers may start expecting import system replacements to + raise that more specific exception when appropriate, rather than + the less-specific *note ImportError: 511. To provide future + compatibility with such consumers, implementors of alternative + import systems that completely replace *note __import__(): 510. + will need to update their implementations to raise the new subclass + when a module can’t be found at all. Implementors 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2091 + + (2) https://peps.python.org/pep-0511/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25768 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20059 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23883 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25791 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=18018 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=23430 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26685 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=18726 + + (11) https://peps.python.org/pep-0487/ + + (12) https://bugs.python.org/issue?@action=redirect&bpo=12319 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27842 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=25287 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=25628 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=9998 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=21815 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=26335 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=17211 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=25953 + + +File: python.info, Node: Changes in the C API<5>, Next: CPython bytecode changes<6>, Prev: Changes in the Python API<5>, Up: Porting to Python 3 6 + +1.6.11.3 Changes in the C API +............................. + + * The *note PyMem_Malloc(): 8d7. allocator family now uses the *note + pymalloc allocator: 980. rather than the system ‘malloc()’. + Applications calling *note PyMem_Malloc(): 8d7. without holding the + GIL can now crash. Set the *note PYTHONMALLOC: 8d5. environment + variable to ‘debug’ to validate the usage of memory allocators in + your application. See bpo-26249(1). + + * *note Py_Exit(): 9ca. (and the main interpreter) now override the + exit status with 120 if flushing buffered data failed. See + bpo-5319(2). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26249 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5319 + + +File: python.info, Node: CPython bytecode changes<6>, Prev: Changes in the C API<5>, Up: Porting to Python 3 6 + +1.6.11.4 CPython bytecode changes +................................. + +There have been several major changes to the *note bytecode: 16f. in +Python 3.6. + + * 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(1) and + bpo-28050(2).) + + * The new *note FORMAT_VALUE: 9cc. and *note BUILD_STRING: 9cd. + opcodes as part of the *note formatted string literal: 89a. + implementation. (Contributed by Eric Smith in bpo-25483(3) and + Serhiy Storchaka in bpo-27078(4).) + + * The new *note BUILD_CONST_KEY_MAP: 9ce. opcode to optimize the + creation of dictionaries with constant keys. (Contributed by + Serhiy Storchaka in bpo-27140(5).) + + * The function call opcodes have been heavily reworked for better + performance and simpler implementation. The *note MAKE_FUNCTION: + 9cf, ‘CALL_FUNCTION’, ‘CALL_FUNCTION_KW’ and + ‘BUILD_MAP_UNPACK_WITH_CALL’ opcodes have been modified, the new + *note CALL_FUNCTION_EX: 9d0. and ‘BUILD_TUPLE_UNPACK_WITH_CALL’ + have been added, and ‘CALL_FUNCTION_VAR’, ‘CALL_FUNCTION_VAR_KW’ + and ‘MAKE_CLOSURE’ opcodes have been removed. (Contributed by + Demur Rumed in bpo-27095(6), and Serhiy Storchaka in bpo-27213(7), + bpo-28257(8).) + + * The new *note SETUP_ANNOTATIONS: 9d1. and ‘STORE_ANNOTATION’ + opcodes have been added to support the new *note variable + annotation: 9d2. syntax. (Contributed by Ivan Levkivskyi in + bpo-27985(9).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26647 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28050 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25483 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27078 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27140 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27095 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27213 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28257 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=27985 + + +File: python.info, Node: Notable changes in Python 3 6 2, Next: Notable changes in Python 3 6 4, Prev: Porting to Python 3 6, Up: What’s New In Python 3 6 + +1.6.12 Notable changes in Python 3.6.2 +-------------------------------------- + +* Menu: + +* New make regen-all build target:: +* Removal of make touch build target:: + + +File: python.info, Node: New make regen-all build target, Next: Removal of make touch build target, Up: Notable changes in Python 3 6 2 + +1.6.12.1 New ‘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 ‘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(1) for details. + +(Contributed by Victor Stinner in bpo-23404(2).) + +New in version 3.6.2. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Makefile.pre.in + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + +File: python.info, Node: Removal of make touch build target, Prev: New make regen-all build target, Up: Notable changes in Python 3 6 2 + +1.6.12.2 Removal of ‘make touch’ build target +............................................. + +The ‘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 ‘make regen-all’ target. + +(Contributed by Victor Stinner in bpo-23404(1).) + +Changed in version 3.6.2. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + +File: python.info, Node: Notable changes in Python 3 6 4, Next: Notable changes in Python 3 6 5, Prev: Notable changes in Python 3 6 2, Up: What’s New In Python 3 6 + +1.6.13 Notable changes in Python 3.6.4 +-------------------------------------- + +The ‘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(1) and bpo-30697(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22898 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30697 + + +File: python.info, Node: Notable changes in Python 3 6 5, Next: Notable changes in Python 3 6 7, Prev: Notable changes in Python 3 6 4, Up: What’s New In Python 3 6 + +1.6.14 Notable changes in Python 3.6.5 +-------------------------------------- + +The *note locale.localeconv(): 868. function now sets temporarily the +‘LC_CTYPE’ locale to the ‘LC_NUMERIC’ locale in some cases. +(Contributed by Victor Stinner in bpo-31900(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31900 + + +File: python.info, Node: Notable changes in Python 3 6 7, Next: Notable changes in Python 3 6 10, Prev: Notable changes in Python 3 6 5, Up: What’s New In Python 3 6 + +1.6.15 Notable changes in Python 3.6.7 +-------------------------------------- + +In 3.6.7 the *note tokenize: 11a. module now implicitly emits a +‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33899 + + +File: python.info, Node: Notable changes in Python 3 6 10, Next: Notable changes in Python 3 6 13, Prev: Notable changes in Python 3 6 7, Up: What’s New In Python 3 6 + +1.6.16 Notable changes in Python 3.6.10 +--------------------------------------- + +Due to significant security concerns, the `reuse_address' parameter of +*note asyncio.loop.create_datagram_endpoint(): 2fb. is no longer +supported. This is because of the behavior of the socket option +‘SO_REUSEADDR’ in UDP. For more details, see the documentation for +‘loop.create_datagram_endpoint()’. (Contributed by Kyle Stanley, +Antoine Pitrou, and Yury Selivanov in bpo-37228(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37228 + + +File: python.info, Node: Notable changes in Python 3 6 13, Prev: Notable changes in Python 3 6 10, Up: What’s New In Python 3 6 + +1.6.17 Notable changes in Python 3.6.13 +--------------------------------------- + +Earlier Python versions allowed using both ‘;’ and ‘&’ as query +parameter separators in *note urllib.parse.parse_qs(): 452. and *note +urllib.parse.parse_qsl(): 453. Due to security concerns, and to conform +with newer W3C recommendations, this has been changed to allow only a +single separator key, with ‘&’ as the default. This change also affects +*note cgi.parse(): 454. and *note cgi.parse_multipart(): 455. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42967 + + +File: python.info, Node: What’s New In Python 3 5, Next: What’s New In Python 3 4, Prev: What’s New In Python 3 6, Up: What’s New in Python + +1.7 What’s New In Python 3.5 +============================ + + +Editors: Elvis Pranskevichus <>, Yury Selivanov +<> + +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(1) +for a full list of changes. + +See also +........ + +PEP 478(2) - Python 3.5 Release Schedule + +* Menu: + +* Summary – Release highlights: Summary – Release highlights<6>. +* New Features: New Features<10>. +* Other Language Changes: Other Language Changes<7>. +* New Modules: New Modules<7>. +* Improved Modules: Improved Modules<7>. +* Other module-level changes:: +* Optimizations: Optimizations<7>. +* Build and C API Changes: Build and C API Changes<3>. +* Deprecated: Deprecated<8>. +* Removed: Removed<8>. +* Porting to Python 3.5: Porting to Python 3 5. +* Notable changes in Python 3.5.4: Notable changes in Python 3 5 4. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3.5/whatsnew/changelog.html + + (2) https://peps.python.org/pep-0478/ + + +File: python.info, Node: Summary – Release highlights<6>, Next: New Features<10>, Up: What’s New In Python 3 5 + +1.7.1 Summary – Release highlights +---------------------------------- + +New syntax features: + + * *note PEP 492: 9de, coroutines with async and await syntax. + + * *note PEP 465: 9df, a new matrix multiplication operator: ‘a @ b’. + + * *note PEP 448: 9e0, additional unpacking generalizations. + +New library modules: + + * *note typing: 123.: *note PEP 484 – Type Hints: 9e1. + + * *note zipapp: 14c.: *note PEP 441 Improving Python ZIP Application + Support: 9e2. + +New built-in features: + + * ‘bytes % args’, ‘bytearray % args’: *note PEP 461: 9e3. – Adding + ‘%’ formatting to bytes and bytearray. + + * New *note bytes.hex(): 9e4, *note bytearray.hex(): 9e5. and *note + memoryview.hex(): 9e6. methods. (Contributed by Arnon Yaari in + bpo-9951(1).) + + * *note memoryview: 6ad. now supports tuple indexing (including + multi-dimensional). (Contributed by Antoine Pitrou in + bpo-23632(2).) + + * Generators have a new ‘gi_yieldfrom’ attribute, which returns the + object being iterated by ‘yield from’ expressions. (Contributed by + Benno Leslie and Yury Selivanov in bpo-24450(3).) + + * A new *note RecursionError: 9e7. exception is now raised when + maximum recursion depth is reached. (Contributed by Georg Brandl + in bpo-19235(4).) + +CPython implementation improvements: + + * When the ‘LC_TYPE’ locale is the POSIX locale (‘C’ locale), *note + sys.stdin: 729. and *note sys.stdout: 72a. now use the + ‘surrogateescape’ error handler, instead of the ‘strict’ error + handler. (Contributed by Victor Stinner in bpo-19977(5).) + + * ‘.pyo’ files are no longer used and have been replaced by a more + flexible scheme that includes the optimization level explicitly in + ‘.pyc’ name. (See *note PEP 488 overview: 9e8.) + + * Builtin and extension modules are now initialized in a multi-phase + process, which is similar to how Python modules are loaded. (See + *note PEP 489 overview: 9e9.) + +Significant improvements in the standard library: + + * *note collections.OrderedDict: 1a8. is now *note implemented in C: + 9ea, which makes it 4 to 100 times faster. + + * The *note ssl: f0. module gained *note support for Memory BIO: 9eb, + which decouples SSL protocol handling from network IO. + + * The new *note os.scandir(): 6b0. function provides a *note better + and significantly faster way: 9ec. of directory traversal. + + * *note functools.lru_cache(): 632. has been mostly *note + reimplemented in C: 9ed, yielding much better performance. + + * The new *note subprocess.run(): 7e8. function provides a *note + streamlined way to run subprocesses: 9ee. + + * The *note traceback: 11d. module has been significantly *note + enhanced: 9ef. for improved performance and developer convenience. + +Security improvements: + + * SSLv3 is now disabled throughout the standard library. It can + still be enabled by instantiating a *note ssl.SSLContext: 430. + manually. (See bpo-22638(6) for more details; this change was + backported to CPython 3.4 and 2.7.) + + * HTTP cookie parsing is now stricter, in order to protect against + potential injection attacks. (Contributed by Antoine Pitrou in + bpo-22796(7).) + +Windows improvements: + + * A new installer for Windows has replaced the old MSI. See *note + Using Python on Windows: 704. for more information. + + * Windows builds now use Microsoft Visual C++ 14.0, and extension + modules should use the same. + +Please read on for a comprehensive list of user-facing changes, +including many other smaller improvements, CPython optimizations, +deprecations, and potential porting issues. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9951 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23632 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24450 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19235 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=19977 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22638 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=22796 + + +File: python.info, Node: New Features<10>, Next: Other Language Changes<7>, Prev: Summary – Release highlights<6>, Up: What’s New In Python 3 5 + +1.7.2 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. + + +File: python.info, Node: PEP 492 - Coroutines with async and await syntax, Next: PEP 465 - A dedicated infix operator for matrix multiplication, Up: New Features<10> + +1.7.2.1 PEP 492 - Coroutines with async and await syntax +........................................................ + +PEP 492(1) greatly improves support for asynchronous programming in +Python by adding *note awaitable objects: 8e7, *note coroutine +functions: 9f2, *note asynchronous iteration: 9f3, and *note +asynchronous context managers: 1a3. + +Coroutine functions are declared using the new *note async def: 19b. +syntax: + + >>> async def coro(): + ... return 'spam' + +Inside a coroutine function, the new *note await: 2fa. expression can be +used to suspend coroutine execution until the result is available. Any +object can be `awaited', as long as it implements the *note awaitable: +8e7. protocol by defining the ‘__await__()’ method. + +PEP 492 also adds *note async for: 708. statement for convenient +iteration over asynchronous iterables. + +An example of a rudimentary HTTP client written using the new syntax: + + 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'', b'' + ])) + + 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() + +Similarly to asynchronous iteration, there is a new syntax for +asynchronous context managers. The following script: + + 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() + +will output: + + 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 + +Note that both *note async for: 708. and *note async with: 1a1. can only +be used inside a coroutine function declared with *note async def: 19b. + +Coroutine functions are intended to be run inside a compatible event +loop, such as the *note asyncio loop: 9f4. + + Note: + Changed in version 3.5.2: Starting with CPython 3.5.2, ‘__aiter__’ + can directly return *note asynchronous iterators: 9f5. Returning + an *note awaitable: 8e7. object will result in a *note + PendingDeprecationWarning: 503. + + See more details in the *note Asynchronous Iterators: 9f6. + documentation section. + +See also +........ + +PEP 492(2) – Coroutines with async and await syntax + + PEP written and implemented by Yury Selivanov. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0492/ + + (2) https://peps.python.org/pep-0492/ + + +File: python.info, Node: PEP 465 - A dedicated infix operator for matrix multiplication, Next: PEP 448 - Additional Unpacking Generalizations, Prev: PEP 492 - Coroutines with async and await syntax, Up: New Features<10> + +1.7.2.2 PEP 465 - A dedicated infix operator for matrix multiplication +...................................................................... + +PEP 465(1) adds the ‘@’ infix operator for matrix multiplication. +Currently, no builtin Python types implement the new operator, however, +it can be implemented by defining ‘__matmul__()’, ‘__rmatmul__()’, and +‘__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 ‘@’ allows +writing cleaner code: + + S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r) + +instead of: + + S = dot((dot(H, beta) - r).T, + dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r)) + +NumPy 1.10 has support for the new operator: + + >>> 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.]) + +See also +........ + +PEP 465(2) – A dedicated infix operator for matrix multiplication + + PEP written by Nathaniel J. Smith; implemented by Benjamin + Peterson. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0465/ + + (2) https://peps.python.org/pep-0465/ + + +File: python.info, Node: PEP 448 - Additional Unpacking Generalizations, Next: PEP 461 - percent formatting support for bytes and bytearray, Prev: PEP 465 - A dedicated infix operator for matrix multiplication, Up: New Features<10> + +1.7.2.3 PEP 448 - Additional Unpacking Generalizations +...................................................... + +PEP 448(1) extends the allowed uses of the ‘*’ iterable unpacking +operator and ‘**’ dictionary unpacking operator. It is now possible to +use an arbitrary number of unpackings in *note function calls: 9f9.: + + >>> 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 + +Similarly, tuple, list, set, and dictionary displays allow multiple +unpackings (see *note Expression lists: 9fa. and *note Dictionary +displays: 9fb.): + + >>> *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} + +See also +........ + +PEP 448(2) – Additional Unpacking Generalizations + + PEP written by Joshua Landau; implemented by Neil Girdhar, Thomas + Wouters, and Joshua Landau. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0448/ + + (2) https://peps.python.org/pep-0448/ + + +File: python.info, Node: PEP 461 - percent formatting support for bytes and bytearray, Next: PEP 484 - Type Hints, Prev: PEP 448 - Additional Unpacking Generalizations, Up: New Features<10> + +1.7.2.4 PEP 461 - percent formatting support for bytes and bytearray +.................................................................... + +PEP 461(1) adds support for the ‘%’ *note interpolation operator: 9fd. +to *note bytes: 1b4. and *note bytearray: 1a5. + +While interpolation is usually thought of as a string operation, there +are cases where interpolation on ‘bytes’ or ‘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: + + >>> b'Hello %b!' % b'World' + b'Hello World!' + + >>> b'x=%i y=%f' % (1, 2.5) + b'x=1 y=2.500000' + +Unicode is not allowed for ‘%b’, but it is accepted by ‘%a’ (equivalent +of ‘repr(obj).encode('ascii', 'backslashreplace')’): + + >>> b'Hello %b!' % 'World' + Traceback (most recent call last): + File "", line 1, in + TypeError: %b requires bytes, or an object that implements __bytes__, not 'str' + + >>> b'price: %a' % '10€' + b"price: '10\\u20ac'" + +Note that ‘%s’ and ‘%r’ conversion types, although supported, should +only be used in codebases that need compatibility with Python 2. + +See also +........ + +PEP 461(2) – Adding % formatting to bytes and bytearray + + PEP written by Ethan Furman; implemented by Neil Schemenauer and + Ethan Furman. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0461/ + + (2) https://peps.python.org/pep-0461/ + + +File: python.info, Node: PEP 484 - Type Hints, Next: PEP 471 - os scandir function – a better and faster directory iterator, Prev: PEP 461 - percent formatting support for bytes and bytearray, Up: New Features<10> + +1.7.2.5 PEP 484 - Type Hints +............................ + +Function annotation syntax has been a Python feature since version 3.0 ( +PEP 3107(1)), 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. + +PEP 484(2) introduces a *note provisional module: 757. 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: + + def greeting(name: str) -> str: + return 'Hello ' + name + +While these annotations are available at runtime through the usual +‘__annotations__’ attribute, `no automatic type checking happens at +runtime'. Instead, it is assumed that a separate off-line type checker +(e.g. mypy(3)) will be used for on-demand source code analysis. + +The type system supports unions, generic types, and a special type named +*note Any: 272. which is consistent with (i.e. assignable to and from) +all types. + +See also +........ + + * *note typing: 123. module documentation + + * + PEP 484(4) – Type Hints + + PEP written by Guido van Rossum, Jukka Lehtosalo, and Łukasz + Langa; implemented by Guido van Rossum. + + * + PEP 483(5) – The Theory of Type Hints + + PEP written by Guido van Rossum + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3107/ + + (2) https://peps.python.org/pep-0484/ + + (3) http://mypy-lang.org + + (4) https://peps.python.org/pep-0484/ + + (5) https://peps.python.org/pep-0483/ + + +File: python.info, Node: PEP 471 - os scandir function – a better and faster directory iterator, Next: PEP 475 Retry system calls failing with EINTR, Prev: PEP 484 - Type Hints, Up: New Features<10> + +1.7.2.6 PEP 471 - os.scandir() function – a better and faster directory iterator +................................................................................ + +PEP 471(1) adds a new directory iteration function, *note os.scandir(): +6b0, to the standard library. Additionally, *note os.walk(): a00. is +now implemented using ‘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 *note +os.stat(): 653. required to walk a directory tree. + +Additionally, ‘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 *note os.scandir(): 6b0. to +display all the files (excluding directories) in the given `path' that +don’t start with ‘'.'’. The *note entry.is_file(): a01. call will +generally not make an additional system call: + + for entry in os.scandir(path): + if not entry.name.startswith('.') and entry.is_file(): + print(entry.name) + +See also +........ + +PEP 471(2) – os.scandir() function – a better and faster directory iterator + + PEP written and implemented by Ben Hoyt with the help of Victor + Stinner. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0471/ + + (2) https://peps.python.org/pep-0471/ + + +File: python.info, Node: PEP 475 Retry system calls failing with EINTR, Next: PEP 479 Change StopIteration handling inside generators, Prev: PEP 471 - os scandir function – a better and faster directory iterator, Up: New Features<10> + +1.7.2.7 PEP 475: Retry system calls failing with EINTR +...................................................... + +An *note errno.EINTR: a04. error code is returned whenever a system +call, that is waiting for I/O, is interrupted by a signal. Previously, +Python would raise *note InterruptedError: a05. in such cases. This +meant that, when writing a Python application, the developer had two +choices: + + 1. Ignore the ‘InterruptedError’. + + 2. Handle the ‘InterruptedError’ and attempt to restart the + interrupted system call at every call site. + +The first option makes an application fail intermittently. The second +option adds a large amount of boilerplate that makes the code nearly +unreadable. Compare: + + print("Hello World") + +and: + + while True: + try: + print("Hello World") + break + except InterruptedError: + continue + +PEP 475(1) implements automatic retry of system calls on ‘EINTR’. This +removes the burden of dealing with ‘EINTR’ or *note InterruptedError: +a05. 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: + + * *note open(): 30b. and *note io.open(): 30c.; + + * functions of the *note faulthandler: 78. module; + + * *note os: c2. functions: *note fchdir(): a06, *note fchmod(): a07, + *note fchown(): a08, *note fdatasync(): a09, *note fstat(): a0a, + *note fstatvfs(): a0b, *note fsync(): a0c, *note ftruncate(): a0d, + *note mkfifo(): a0e, *note mknod(): a0f, *note open(): a10, *note + posix_fadvise(): a11, *note posix_fallocate(): a12, *note pread(): + 7bb, *note pwrite(): 7be, *note read(): a13, *note readv(): 7ba, + *note sendfile(): 762, *note wait3(): a14, *note wait4(): a15, + *note wait(): a16, *note waitid(): a17, *note waitpid(): a18, *note + write(): a19, *note writev(): 7bd.; + + * special cases: *note os.close(): 7d3. and *note os.dup2(): 7c0. now + ignore *note EINTR: a04. errors; the syscall is not retried (see + the PEP for the rationale); + + * *note select: e2. functions: *note devpoll.poll(): a1a, *note + epoll.poll(): a1b, *note kqueue.control(): a1c, *note poll.poll(): + a1d, *note select(): a1e.; + + * methods of the *note socket: a1f. class: *note accept(): a20, *note + connect(): a21. (except for non-blocking sockets), *note recv(): + a22, *note recvfrom(): a23, *note recvmsg(): a24, *note send(): + a25, *note sendall(): a26, *note sendmsg(): a27, *note sendto(): + a28.; + + * *note signal.sigtimedwait(): a29. and *note signal.sigwaitinfo(): + a2a.; + + * *note time.sleep(): 266. + +See also +........ + +PEP 475(2) – 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). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0475/ + + (2) https://peps.python.org/pep-0475/ + + +File: python.info, Node: PEP 479 Change StopIteration handling inside generators, Next: PEP 485 A function for testing approximate equality, Prev: PEP 475 Retry system calls failing with EINTR, Up: New Features<10> + +1.7.2.8 PEP 479: Change StopIteration handling inside generators +................................................................ + +The interaction of generators and *note StopIteration: 865. in Python +3.4 and earlier was sometimes surprising, and could conceal obscure +bugs. Previously, ‘StopIteration’ raised accidentally inside a +generator function was interpreted as the end of the iteration by the +loop construct driving the generator. + +PEP 479(1) changes the behavior of generators: when a ‘StopIteration’ +exception is raised inside a generator, it is replaced with a *note +RuntimeError: 6e9. before it exits the generator frame. The main goal +of this change is to ease debugging in the situation where an unguarded +*note next(): 3c7. call raises ‘StopIteration’ and causes the iteration +controlled by the generator to terminate silently. This is particularly +pernicious in combination with the ‘yield from’ construct. + +This is a backwards incompatible change, so to enable the new behavior, +a *note __future__: a2c. import is necessary: + + >>> from __future__ import generator_stop + + >>> def gen(): + ... next(iter([])) + ... yield + ... + >>> next(gen()) + Traceback (most recent call last): + File "", line 2, in gen + StopIteration + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "", line 1, in + RuntimeError: generator raised StopIteration + +Without a ‘__future__’ import, a *note PendingDeprecationWarning: 503. +will be raised whenever a *note StopIteration: 865. exception is raised +inside a generator. + +See also +........ + +PEP 479(2) – Change StopIteration handling inside generators + + PEP written by Chris Angelico and Guido van Rossum. Implemented by + Chris Angelico, Yury Selivanov and Nick Coghlan. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0479/ + + (2) https://peps.python.org/pep-0479/ + + +File: python.info, Node: PEP 485 A function for testing approximate equality, Next: PEP 486 Make the Python Launcher aware of virtual environments, Prev: PEP 479 Change StopIteration handling inside generators, Up: New Features<10> + +1.7.2.9 PEP 485: A function for testing approximate equality +............................................................ + +PEP 485(1) adds the *note math.isclose(): a2f. and *note +cmath.isclose(): a30. 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 ‘isclose’ arguments, relative to the larger absolute +value: + + >>> 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 + +It is also possible to compare two values using absolute tolerance, +which must be a non-negative value: + + >>> 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 + +See also +........ + +PEP 485(2) – A function for testing approximate equality + + PEP written by Christopher Barker; implemented by Chris Barker and + Tal Einat. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0485/ + + (2) https://peps.python.org/pep-0485/ + + +File: python.info, Node: PEP 486 Make the Python Launcher aware of virtual environments, Next: PEP 488 Elimination of PYO files, Prev: PEP 485 A function for testing approximate equality, Up: New Features<10> + +1.7.2.10 PEP 486: Make the Python Launcher aware of virtual environments +........................................................................ + +PEP 486(1) makes the Windows launcher (see PEP 397(2)) aware of an +active virtual environment. When the default interpreter would be used +and the ‘VIRTUAL_ENV’ environment variable is set, the interpreter in +the virtual environment will be used. + +See also +........ + +PEP 486(3) – Make the Python Launcher aware of virtual environments + + PEP written and implemented by Paul Moore. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0486/ + + (2) https://peps.python.org/pep-0397/ + + (3) https://peps.python.org/pep-0486/ + + +File: python.info, Node: PEP 488 Elimination of PYO files, Next: PEP 489 Multi-phase extension module initialization, Prev: PEP 486 Make the Python Launcher aware of virtual environments, Up: New Features<10> + +1.7.2.11 PEP 488: Elimination of PYO files +.......................................... + +PEP 488(1) does away with the concept of ‘.pyo’ files. This means that +‘.pyc’ files represent both unoptimized and optimized bytecode. To +prevent the need to constantly regenerate bytecode files, ‘.pyc’ files +now have an optional ‘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 *note -O: a34. or *note -OO: a35. +Consequently, bytecode files generated from *note -O: a34, and *note +-OO: a35. may now exist simultaneously. *note +importlib.util.cache_from_source(): 91e. has an updated API to help with +this change. + +See also +........ + +PEP 488(2) – Elimination of PYO files + + PEP written and implemented by Brett Cannon. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0488/ + + (2) https://peps.python.org/pep-0488/ + + +File: python.info, Node: PEP 489 Multi-phase extension module initialization, Prev: PEP 488 Elimination of PYO files, Up: New Features<10> + +1.7.2.12 PEP 489: Multi-phase extension module initialization +............................................................. + +PEP 489(1) updates extension module initialization to take advantage of +the two step module loading mechanism introduced by PEP 451(2) 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. + +See also +........ + +PEP 489(3) – Multi-phase extension module initialization + + PEP written by Petr Viktorin, Stefan Behnel, and Nick Coghlan; + implemented by Petr Viktorin. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0489/ + + (2) https://peps.python.org/pep-0451/ + + (3) https://peps.python.org/pep-0489/ + + +File: python.info, Node: Other Language Changes<7>, Next: New Modules<7>, Prev: New Features<10>, Up: What’s New In Python 3 5 + +1.7.3 Other Language Changes +---------------------------- + +Some smaller changes made to the core Python language are: + + * Added the ‘"namereplace"’ error handlers. The ‘"backslashreplace"’ + error handlers now work with decoding and translating. + (Contributed by Serhiy Storchaka in bpo-19676(1) and bpo-22286(2).) + + * The *note -b: 1b1. option now affects comparisons of *note bytes: + 1b4. with *note int: 1c7. (Contributed by Serhiy Storchaka in + bpo-23681(3).) + + * New Kazakh ‘kz1048’ and Tajik ‘koi8_t’ *note codecs: a38. + (Contributed by Serhiy Storchaka in bpo-22682(4) and bpo-22681(5).) + + * Property docstrings are now writable. This is especially useful + for *note collections.namedtuple(): 538. docstrings. (Contributed + by Berker Peksag in bpo-24064(6).) + + * Circular imports involving relative imports are now supported. + (Contributed by Brett Cannon and Antoine Pitrou in bpo-17636(7).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19676 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22286 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23681 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22682 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22681 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24064 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=17636 + + +File: python.info, Node: New Modules<7>, Next: Improved Modules<7>, Prev: Other Language Changes<7>, Up: What’s New In Python 3 5 + +1.7.4 New Modules +----------------- + +* Menu: + +* typing: typing<7>. +* zipapp: zipapp<2>. + + +File: python.info, Node: typing<7>, Next: zipapp<2>, Up: New Modules<7> + +1.7.4.1 typing +.............. + +The new *note typing: 123. *note provisional: 757. module provides +standard definitions and tools for function type annotations. See *note +Type Hints: 9e1. for more information. + + +File: python.info, Node: zipapp<2>, Prev: typing<7>, Up: New Modules<7> + +1.7.4.2 zipapp +.............. + +The new *note zipapp: 14c. module (specified in PEP 441(1)) provides an +API and command line tool for creating executable Python Zip +Applications, which were introduced in Python 2.6 in bpo-1739468(2), 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 ‘__main__.py’ file, into a directory ‘myapp’ +and running: + + $ python -m zipapp myapp + $ python myapp.pyz + +The module implementation has been contributed by Paul Moore in +bpo-23491(3). + +See also +........ + +PEP 441(4) – Improving Python ZIP Application Support + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0441/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1739468 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23491 + + (4) https://peps.python.org/pep-0441/ + + +File: python.info, Node: Improved Modules<7>, Next: Other module-level changes, Prev: New Modules<7>, Up: What’s New In Python 3 5 + +1.7.5 Improved Modules +---------------------- + +* Menu: + +* argparse: argparse<3>. +* asyncio: asyncio<8>. +* bz2:: +* cgi:: +* cmath: cmath<2>. +* code:: +* collections: collections<5>. +* collections.abc: collections abc<3>. +* compileall: compileall<3>. +* concurrent.futures: concurrent futures<4>. +* configparser:: +* contextlib: contextlib<5>. +* csv: csv<2>. +* curses: curses<4>. +* dbm: dbm<4>. +* difflib:: +* distutils: distutils<6>. +* doctest: doctest<2>. +* email: email<2>. +* enum: enum<6>. +* faulthandler: faulthandler<3>. +* functools: functools<4>. +* glob: glob<2>. +* gzip: gzip<2>. +* heapq:: +* http: http<2>. +* http.client: http client<3>. +* idlelib and IDLE: idlelib and IDLE<3>. +* imaplib: imaplib<2>. +* imghdr:: +* importlib: importlib<6>. +* inspect: inspect<6>. +* io: io<3>. +* ipaddress: ipaddress<3>. +* json: json<2>. +* linecache: linecache<2>. +* locale: locale<4>. +* logging: logging<5>. +* lzma:: +* math: math<6>. +* multiprocessing: multiprocessing<5>. +* operator: operator<2>. +* os: os<8>. +* pathlib: pathlib<7>. +* pickle: pickle<3>. +* poplib: poplib<2>. +* re: re<5>. +* readline: readline<2>. +* selectors:: +* shutil: shutil<3>. +* signal: signal<3>. +* smtpd:: +* smtplib: smtplib<2>. +* sndhdr:: +* socket: socket<8>. +* ssl: ssl<7>. +* sqlite3: sqlite3<5>. +* subprocess: subprocess<3>. +* sys: sys<8>. +* sysconfig: sysconfig<2>. +* tarfile: tarfile<2>. +* threading: threading<5>. +* time: time<6>. +* timeit: timeit<2>. +* tkinter: tkinter<6>. +* traceback: traceback<4>. +* types: types<3>. +* unicodedata: unicodedata<6>. +* unittest: unittest<5>. +* unittest.mock: unittest mock<3>. +* urllib:: +* wsgiref:: +* xmlrpc: xmlrpc<2>. +* xml.sax: xml sax. +* zipfile: zipfile<4>. + + +File: python.info, Node: argparse<3>, Next: asyncio<8>, Up: Improved Modules<7> + +1.7.5.1 argparse +................ + +The *note ArgumentParser: a3e. class now allows disabling *note +abbreviated usage: a3f. of long options by setting *note allow_abbrev: +a40. to ‘False’. (Contributed by Jonathan Paugh, Steven Bethard, paul +j3 and Daniel Eriksson in bpo-14910(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14910 + + +File: python.info, Node: asyncio<8>, Next: bz2, Prev: argparse<3>, Up: Improved Modules<7> + +1.7.5.2 asyncio +............... + +Since the *note asyncio: 9. module is *note provisional: 757, all +changes introduced in Python 3.5 have also been backported to Python +3.4.x. + +Notable changes in the *note asyncio: 9. module since Python 3.4.0: + + * New debugging APIs: *note loop.set_debug(): a42. and *note + loop.get_debug(): a43. methods. (Contributed by Victor Stinner.) + + * The proactor event loop now supports SSL. (Contributed by Antoine + Pitrou and Victor Stinner in bpo-22560(1).) + + * A new *note loop.is_closed(): a44. method to check if the event + loop is closed. (Contributed by Victor Stinner in bpo-21326(2).) + + * A new *note loop.create_task(): 61f. to conveniently create and + schedule a new *note Task: 1e3. for a coroutine. The ‘create_task’ + method is also used by all asyncio functions that wrap coroutines + into tasks, such as *note asyncio.wait(): 591, *note + asyncio.gather(): 1d3, etc. (Contributed by Victor Stinner.) + + * A new *note transport.get_write_buffer_limits(): a45. method to + inquire for `high-' and `low-' water limits of the flow control. + (Contributed by Victor Stinner.) + + * The ‘async()’ function is deprecated in favor of *note + ensure_future(): 478. (Contributed by Yury Selivanov.) + + * New *note loop.set_task_factory(): a46. and *note + loop.get_task_factory(): a47. methods to customize the task factory + that *note loop.create_task(): 61f. method uses. (Contributed by + Yury Selivanov.) + + * New *note Queue.join(): a48. and *note Queue.task_done(): a49. + queue methods. (Contributed by Victor Stinner.) + + * The ‘JoinableQueue’ class was removed, in favor of the *note + asyncio.Queue: 6c8. class. (Contributed by Victor Stinner.) + +Updates in 3.5.1: + + * The *note ensure_future(): 478. function and all functions that use + it, such as *note loop.run_until_complete(): 8e6, now accept all + kinds of *note awaitable objects: 8e7. (Contributed by Yury + Selivanov.) + + * New *note run_coroutine_threadsafe(): 4a5. function to submit + coroutines to event loops from other threads. (Contributed by + Vincent Michel.) + + * New *note Transport.is_closing(): 8e8. method to check if the + transport is closing or closed. (Contributed by Yury Selivanov.) + + * The *note loop.create_server(): 766. method can now accept a list + of hosts. (Contributed by Yann Sionneau.) + +Updates in 3.5.2: + + * New *note loop.create_future(): 8e9. method to create Future + objects. This allows alternative event loop implementations, such + as uvloop(3), to provide a faster *note asyncio.Future: 477. + implementation. (Contributed by Yury Selivanov.) + + * New *note loop.get_exception_handler(): 8ea. method to get the + current exception handler. (Contributed by Yury Selivanov.) + + * New *note StreamReader.readuntil(): 8eb. method to read data from + the stream until a separator bytes sequence appears. (Contributed + by Mark Korenberg.) + + * The *note loop.create_connection(): 1da. and *note + loop.create_server(): 766. methods are optimized to avoid calling + the system ‘getaddrinfo’ function if the address is already + resolved. (Contributed by A. Jesse Jiryu Davis.) + + * The *note loop.sock_connect(sock, address): a4a. no longer requires + the `address' to be resolved prior to the call. (Contributed by A. + Jesse Jiryu Davis.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22560 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21326 + + (3) https://github.com/MagicStack/uvloop + + +File: python.info, Node: bz2, Next: cgi, Prev: asyncio<8>, Up: Improved Modules<7> + +1.7.5.3 bz2 +........... + +The *note BZ2Decompressor.decompress: a4c. method now accepts an +optional `max_length' argument to limit the maximum size of decompressed +data. (Contributed by Nikolaus Rath in bpo-15955(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15955 + + +File: python.info, Node: cgi, Next: cmath<2>, Prev: bz2, Up: Improved Modules<7> + +1.7.5.4 cgi +........... + +The ‘FieldStorage’ class now supports the *note context manager: 1a0. +protocol. (Contributed by Berker Peksag in bpo-20289(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20289 + + +File: python.info, Node: cmath<2>, Next: code, Prev: cgi, Up: Improved Modules<7> + +1.7.5.5 cmath +............. + +A new function *note isclose(): a30. provides a way to test for +approximate equality. (Contributed by Chris Barker and Tal Einat in +bpo-24270(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24270 + + +File: python.info, Node: code, Next: collections<5>, Prev: cmath<2>, Up: Improved Modules<7> + +1.7.5.6 code +............ + +The *note InteractiveInterpreter.showtraceback(): a50. method now prints +the full chained traceback, just like the interactive interpreter. +(Contributed by Claudiu Popa in bpo-17442(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17442 + + +File: python.info, Node: collections<5>, Next: collections abc<3>, Prev: code, Up: Improved Modules<7> + +1.7.5.7 collections +................... + +The *note OrderedDict: 1a8. class is now implemented in C, which makes +it 4 to 100 times faster. (Contributed by Eric Snow in bpo-16991(1).) + +‘OrderedDict.items()’, ‘OrderedDict.keys()’, ‘OrderedDict.values()’ +views now support *note reversed(): 462. iteration. (Contributed by +Serhiy Storchaka in bpo-19505(2).) + +The *note deque: 1a9. class now defines *note index(): a52, *note +insert(): a53, and *note copy(): a54, and supports the ‘+’ and ‘*’ +operators. This allows deques to be recognized as a *note +MutableSequence: a55. and improves their substitutability for lists. +(Contributed by Raymond Hettinger in bpo-23704(3).) + +Docstrings produced by *note namedtuple(): 538. can now be updated: + + Point = namedtuple('Point', ['x', 'y']) + Point.__doc__ += ': Cartesian coodinate' + Point.x.__doc__ = 'abscissa' + Point.y.__doc__ = 'ordinate' + +(Contributed by Berker Peksag in bpo-24064(4).) + +The *note UserString: a56. class now implements the ‘__getnewargs__()’, +‘__rmod__()’, *note casefold(): a57, *note format_map(): a58, *note +isprintable(): a59, and *note maketrans(): a5a. methods to match the +corresponding methods of *note str: 1b3. (Contributed by Joe Jevnik in +bpo-22189(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16991 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19505 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23704 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24064 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22189 + + +File: python.info, Node: collections abc<3>, Next: compileall<3>, Prev: collections<5>, Up: Improved Modules<7> + +1.7.5.8 collections.abc +....................... + +The ‘Sequence.index()’ method now accepts `start' and `stop' arguments +to match the corresponding methods of *note tuple: 539, *note list: 1e9, +etc. (Contributed by Devin Jeanpierre in bpo-23086(1).) + +A new *note Generator: a5c. abstract base class. (Contributed by Stefan +Behnel in bpo-24018(2).) + +New *note Awaitable: a5d, *note Coroutine: a5e, *note AsyncIterator: +a5f, and *note AsyncIterable: a60. abstract base classes. (Contributed +by Yury Selivanov in bpo-24184(3).) + +For earlier Python versions, a backport of the new ABCs is available in +an external PyPI package(4). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23086 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24018 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24184 + + (4) https://pypi.org/project/backports_abc + + +File: python.info, Node: compileall<3>, Next: concurrent futures<4>, Prev: collections abc<3>, Up: Improved Modules<7> + +1.7.5.9 compileall +.................. + +A new *note compileall: 1f. option, ‘-j N’, allows running `N' workers +simultaneously to perform parallel bytecode compilation. The *note +compile_dir(): 77b. function has a corresponding ‘workers’ parameter. +(Contributed by Claudiu Popa in bpo-16104(1).) + +Another new option, ‘-r’, allows controlling the maximum recursion level +for subdirectories. (Contributed by Claudiu Popa in bpo-19628(2).) + +The ‘-q’ command line option can now be specified more than once, in +which case all output, including errors, will be suppressed. The +corresponding ‘quiet’ parameter in *note compile_dir(): 77b, *note +compile_file(): a62, and *note compile_path(): a63. can now accept an +integer value indicating the level of output suppression. (Contributed +by Thomas Kluyver in bpo-21338(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16104 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19628 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21338 + + +File: python.info, Node: concurrent futures<4>, Next: configparser, Prev: compileall<3>, Up: Improved Modules<7> + +1.7.5.10 concurrent.futures +........................... + +The *note Executor.map(): a65. method now accepts a `chunksize' argument +to allow batching of tasks to improve performance when *note +ProcessPoolExecutor(): 52e. is used. (Contributed by Dan O’Reilly in +bpo-11271(1).) + +The number of workers in the *note ThreadPoolExecutor: 311. constructor +is optional now. The default value is 5 times the number of CPUs. +(Contributed by Claudiu Popa in bpo-21527(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11271 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21527 + + +File: python.info, Node: configparser, Next: contextlib<5>, Prev: concurrent futures<4>, Up: Improved Modules<7> + +1.7.5.11 configparser +..................... + +*note configparser: 21. now provides a way to customize the conversion +of values by specifying a dictionary of converters in the *note +ConfigParser: 887. constructor, or by defining them as methods in +‘ConfigParser’ subclasses. Converters defined in a parser instance are +inherited by its section proxies. + +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'] + +(Contributed by Łukasz Langa in bpo-18159(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18159 + + +File: python.info, Node: contextlib<5>, Next: csv<2>, Prev: configparser, Up: Improved Modules<7> + +1.7.5.12 contextlib +................... + +The new *note redirect_stderr(): a68. *note context manager: 1a0. +(similar to *note redirect_stdout(): a69.) makes it easier for utility +scripts to handle inflexible APIs that write their output to *note +sys.stderr: 581. and don’t provide any options to redirect it: + + >>> import contextlib, io, logging + >>> f = io.StringIO() + >>> with contextlib.redirect_stderr(f): + ... logging.warning('warning') + ... + >>> f.getvalue() + 'WARNING:root:warning\n' + +(Contributed by Berker Peksag in bpo-22389(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22389 + + +File: python.info, Node: csv<2>, Next: curses<4>, Prev: contextlib<5>, Up: Improved Modules<7> + +1.7.5.13 csv +............ + +The *note writerow(): a6b. method now supports arbitrary iterables, not +just sequences. (Contributed by Serhiy Storchaka in bpo-23171(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23171 + + +File: python.info, Node: curses<4>, Next: dbm<4>, Prev: csv<2>, Up: Improved Modules<7> + +1.7.5.14 curses +............... + +The new *note update_lines_cols(): a6d. function updates the ‘LINES’ and +‘COLS’ environment variables. This is useful for detecting manual +screen resizing. (Contributed by Arnon Yaari in bpo-4254(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4254 + + +File: python.info, Node: dbm<4>, Next: difflib, Prev: curses<4>, Up: Improved Modules<7> + +1.7.5.15 dbm +............ + +*note dumb.open: 6ee. always creates a new database when the flag has +the value ‘"n"’. (Contributed by Claudiu Popa in bpo-18039(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18039 + + +File: python.info, Node: difflib, Next: distutils<6>, Prev: dbm<4>, Up: Improved Modules<7> + +1.7.5.16 difflib +................ + +The charset of HTML documents generated by *note HtmlDiff.make_file(): +a70. can now be customized by using a new `charset' keyword-only +argument. The default charset of HTML document changed from +‘"ISO-8859-1"’ to ‘"utf-8"’. (Contributed by Berker Peksag in +bpo-2052(1).) + +The *note diff_bytes(): a71. 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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2052 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17445 + + +File: python.info, Node: distutils<6>, Next: doctest<2>, Prev: difflib, Up: Improved Modules<7> + +1.7.5.17 distutils +.................. + +Both the ‘build’ and ‘build_ext’ commands now accept a ‘-j’ option to +enable parallel building of extension modules. (Contributed by Antoine +Pitrou in bpo-5309(1).) + +The *note distutils: 37. module now supports ‘xz’ compression, and can +be enabled by passing ‘xztar’ as an argument to ‘bdist --format’. +(Contributed by Serhiy Storchaka in bpo-16314(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5309 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16314 + + +File: python.info, Node: doctest<2>, Next: email<2>, Prev: distutils<6>, Up: Improved Modules<7> + +1.7.5.18 doctest +................ + +The *note DocTestSuite(): a74. function returns an empty *note +unittest.TestSuite: a75. if `module' contains no docstrings, instead of +raising *note ValueError: 1c8. (Contributed by Glenn Jones in +bpo-15916(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15916 + + +File: python.info, Node: email<2>, Next: enum<6>, Prev: doctest<2>, Up: Improved Modules<7> + +1.7.5.19 email +.............. + +A new policy option *note Policy.mangle_from_: a77. controls whether or +not lines that start with ‘"From "’ in email bodies are prefixed with a +‘">"’ character by generators. The default is ‘True’ for *note +compat32: 90a. and ‘False’ for all other policies. (Contributed by +Milan Oberkirch in bpo-20098(1).) + +A new *note Message.get_content_disposition(): a78. method provides easy +access to a canonical value for the ‘Content-Disposition’ header. +(Contributed by Abhilash Raj in bpo-21083(2).) + +A new policy option *note EmailPolicy.utf8: a79. can be set to ‘True’ to +encode email headers using the UTF-8 charset instead of using encoded +words. This allows ‘Messages’ to be formatted according to RFC 6532(3) +and used with an SMTP server that supports the RFC 6531(4) ‘SMTPUTF8’ +extension. (Contributed by R. David Murray in bpo-24211(5).) + +The *note mime.text.MIMEText: a7a. constructor now accepts a *note +charset.Charset: a7b. instance. (Contributed by Claude Paroz and Berker +Peksag in bpo-16324(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20098 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21083 + + (3) https://datatracker.ietf.org/doc/html/rfc6532.html + + (4) https://datatracker.ietf.org/doc/html/rfc6531.html + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24211 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=16324 + + +File: python.info, Node: enum<6>, Next: faulthandler<3>, Prev: email<2>, Up: Improved Modules<7> + +1.7.5.20 enum +............. + +The *note Enum: 20c. callable has a new parameter `start' to specify the +initial number of enum values if only `names' are provided: + + >>> Animal = enum.Enum('Animal', 'cat dog', start=10) + >>> Animal.cat + + >>> Animal.dog + + +(Contributed by Ethan Furman in bpo-21706(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21706 + + +File: python.info, Node: faulthandler<3>, Next: functools<4>, Prev: enum<6>, Up: Improved Modules<7> + +1.7.5.21 faulthandler +..................... + +The *note enable(): 911, *note register(): a7e, *note dump_traceback(): +a7f. and *note dump_traceback_later(): a80. functions now accept file +descriptors in addition to file-like objects. (Contributed by Wei Wu in +bpo-23566(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23566 + + +File: python.info, Node: functools<4>, Next: glob<2>, Prev: faulthandler<3>, Up: Improved Modules<7> + +1.7.5.22 functools +.................. + +Most of the *note lru_cache(): 632. machinery is now implemented in C, +making it significantly faster. (Contributed by Matt Joiner, Alexey +Kachayev, and Serhiy Storchaka in bpo-14373(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14373 + + +File: python.info, Node: glob<2>, Next: gzip<2>, Prev: functools<4>, Up: Improved Modules<7> + +1.7.5.23 glob +............. + +The *note iglob(): 3f9. and *note glob(): 3f8. functions now support +recursive search in subdirectories, using the ‘"**"’ pattern. +(Contributed by Serhiy Storchaka in bpo-13968(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13968 + + +File: python.info, Node: gzip<2>, Next: heapq, Prev: glob<2>, Up: Improved Modules<7> + +1.7.5.24 gzip +............. + +The `mode' argument of the *note GzipFile: 590. constructor now accepts +‘"x"’ to request exclusive creation. (Contributed by Tim Heaney in +bpo-19222(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19222 + + +File: python.info, Node: heapq, Next: http<2>, Prev: gzip<2>, Up: Improved Modules<7> + +1.7.5.25 heapq +.............. + +Element comparison in *note merge(): a85. can now be customized by +passing a *note key function: a86. in a new optional `key' keyword +argument, and a new optional `reverse' keyword argument can be used to +reverse element comparison: + + >>> 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'] + +(Contributed by Raymond Hettinger in bpo-13742(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13742 + + +File: python.info, Node: http<2>, Next: http client<3>, Prev: heapq, Up: Improved Modules<7> + +1.7.5.26 http +............. + +A new *note HTTPStatus: 543. enum that defines a set of HTTP status +codes, reason phrases and long descriptions written in English. +(Contributed by Demian Brecht in bpo-21793(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21793 + + +File: python.info, Node: http client<3>, Next: idlelib and IDLE<3>, Prev: http<2>, Up: Improved Modules<7> + +1.7.5.27 http.client +.................... + +*note HTTPConnection.getresponse(): a89. now raises a *note +RemoteDisconnected: a8a. exception when a remote server connection is +closed unexpectedly. Additionally, if a *note ConnectionError: a8b. (of +which ‘RemoteDisconnected’ is a subclass) is raised, the client socket +is now closed automatically, and will reconnect on the next request: + + 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 + +(Contributed by Martin Panter in bpo-3566(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=3566 + + +File: python.info, Node: idlelib and IDLE<3>, Next: imaplib<2>, Prev: http client<3>, Up: Improved Modules<7> + +1.7.5.28 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 ‘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. + + +File: python.info, Node: imaplib<2>, Next: imghdr, Prev: idlelib and IDLE<3>, Up: Improved Modules<7> + +1.7.5.29 imaplib +................ + +The *note IMAP4: 546. class now supports the *note context manager: 1a0. +protocol. When used in a *note with: 19e. statement, the IMAP4 ‘LOGOUT’ +command will be called automatically at the end of the block. +(Contributed by Tarek Ziadé and Serhiy Storchaka in bpo-4972(1).) + +The *note imaplib: 94. module now supports RFC 5161(2) (ENABLE +Extension) and RFC 6855(3) (UTF-8 Support) via the *note IMAP4.enable(): +a8e. method. A new *note IMAP4.utf8_enabled: a8f. attribute tracks +whether or not RFC 6855(4) support is enabled. (Contributed by Milan +Oberkirch, R. David Murray, and Maciej Szulik in bpo-21800(5).) + +The *note imaplib: 94. 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(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4972 + + (2) https://datatracker.ietf.org/doc/html/rfc5161.html + + (3) https://datatracker.ietf.org/doc/html/rfc6855.html + + (4) https://datatracker.ietf.org/doc/html/rfc6855.html + + (5) https://bugs.python.org/issue?@action=redirect&bpo=21800 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21800 + + +File: python.info, Node: imghdr, Next: importlib<6>, Prev: imaplib<2>, Up: Improved Modules<7> + +1.7.5.30 imghdr +............... + +The *note what(): a91. function now recognizes the OpenEXR(1) format +(contributed by Martin Vignali and Claudiu Popa in bpo-20295(2)), and +the WebP(3) format (contributed by Fabrice Aneche and Claudiu Popa in +bpo-20197(4).) + + ---------- Footnotes ---------- + + (1) https://www.openexr.com + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20295 + + (3) https://en.wikipedia.org/wiki/WebP + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20197 + + +File: python.info, Node: importlib<6>, Next: inspect<6>, Prev: imghdr, Up: Improved Modules<7> + +1.7.5.31 importlib +.................. + +The *note util.LazyLoader: 91a. class allows for lazy loading of modules +in applications where startup time is important. (Contributed by Brett +Cannon in bpo-17621(1).) + +The *note abc.InspectLoader.source_to_code(): a93. method is now a +static method. This makes it easier to initialize a module object with +code compiled from a string by running ‘exec(code, module.__dict__)’. +(Contributed by Brett Cannon in bpo-21156(2).) + +The new *note util.module_from_spec(): a94. function is now the +preferred way to create a new module. As opposed to creating a *note +types.ModuleType: a95. 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(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17621 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21156 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20383 + + +File: python.info, Node: inspect<6>, Next: io<3>, Prev: importlib<6>, Up: Improved Modules<7> + +1.7.5.32 inspect +................ + +Both the *note Signature: 303. and *note Parameter: a97. classes are now +picklable and hashable. (Contributed by Yury Selivanov in bpo-20726(1) +and bpo-20334(2).) + +A new *note BoundArguments.apply_defaults(): a98. method provides a way +to set default values for missing arguments: + + >>> def foo(a, b='ham', *args): pass + >>> ba = inspect.signature(foo).bind('spam') + >>> ba.apply_defaults() + >>> ba.arguments + OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())]) + +(Contributed by Yury Selivanov in bpo-24190(3).) + +A new class method *note Signature.from_callable(): 304. makes +subclassing of *note Signature: 303. easier. (Contributed by Yury +Selivanov and Eric Snow in bpo-17373(4).) + +The *note signature(): 301. function now accepts a `follow_wrapped' +optional keyword argument, which, when set to ‘False’, disables +automatic following of ‘__wrapped__’ links. (Contributed by Yury +Selivanov in bpo-20691(5).) + +A set of new functions to inspect *note coroutine functions: 9f2. and +*note coroutine objects: 525. has been added: *note iscoroutine(): a99, +*note iscoroutinefunction(): a9a, *note isawaitable(): a9b, *note +getcoroutinelocals(): a9c, and *note getcoroutinestate(): a9d. +(Contributed by Yury Selivanov in bpo-24017(6) and bpo-24400(7).) + +The *note stack(): 225, *note trace(): 226, *note getouterframes(): 223, +and *note getinnerframes(): 224. functions now return a list of named +tuples. (Contributed by Daniel Shahaf in bpo-16808(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20726 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20334 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24190 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17373 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=20691 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24017 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24400 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=16808 + + +File: python.info, Node: io<3>, Next: ipaddress<3>, Prev: inspect<6>, Up: Improved Modules<7> + +1.7.5.33 io +........... + +A new *note BufferedIOBase.readinto1(): a9f. method, that uses at most +one call to the underlying raw stream’s *note RawIOBase.read(): aa0. or +*note RawIOBase.readinto(): aa1. methods. (Contributed by Nikolaus Rath +in bpo-20578(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20578 + + +File: python.info, Node: ipaddress<3>, Next: json<2>, Prev: io<3>, Up: Improved Modules<7> + +1.7.5.34 ipaddress +.................. + +Both the *note IPv4Network: 7a3. and *note IPv6Network: 7a2. classes now +accept an ‘(address, netmask)’ tuple argument, so as to easily construct +network objects from existing addresses: + + >>> 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') + +(Contributed by Peter Moody and Antoine Pitrou in bpo-16531(1).) + +A new ‘reverse_pointer’ attribute for the *note IPv4Network: 7a3. and +*note IPv6Network: 7a2. classes returns the name of the reverse DNS PTR +record: + + >>> 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' + +(Contributed by Leon Weber in bpo-20480(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16531 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20480 + + +File: python.info, Node: json<2>, Next: linecache<2>, Prev: ipaddress<3>, Up: Improved Modules<7> + +1.7.5.35 json +............. + +The *note json.tool: a3. command line interface now preserves the order +of keys in JSON objects passed in input. The new ‘--sort-keys’ option +can be used to sort the keys alphabetically. (Contributed by Berker +Peksag in bpo-21650(1).) + +JSON decoder now raises *note JSONDecodeError: aa4. instead of *note +ValueError: 1c8. to provide better context information about the error. +(Contributed by Serhiy Storchaka in bpo-19361(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21650 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19361 + + +File: python.info, Node: linecache<2>, Next: locale<4>, Prev: json<2>, Up: Improved Modules<7> + +1.7.5.36 linecache +.................. + +A new *note lazycache(): aa6. function can be used to capture +information about a non-file-based module to permit getting its lines +later via *note getline(): aa7. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17911 + + +File: python.info, Node: locale<4>, Next: logging<5>, Prev: linecache<2>, Up: Improved Modules<7> + +1.7.5.37 locale +............... + +A new *note delocalize(): aa9. function can be used to convert a string +into a normalized number string, taking the ‘LC_NUMERIC’ settings into +account: + + >>> 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' + +(Contributed by Cédric Krier in bpo-13918(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13918 + + +File: python.info, Node: logging<5>, Next: lzma, Prev: locale<4>, Up: Improved Modules<7> + +1.7.5.38 logging +................ + +All logging methods (*note Logger: 7a9. *note log(): aab, *note +exception(): aac, *note critical(): aad, *note debug(): aae, etc.), now +accept exception instances as an `exc_info' argument, in addition to +boolean values and exception tuples: + + >>> import logging + >>> try: + ... 1/0 + ... except ZeroDivisionError as ex: + ... logging.error('exception', exc_info=ex) + ERROR:root:exception + +(Contributed by Yury Selivanov in bpo-20537(1).) + +The *note handlers.HTTPHandler: aaf. class now accepts an optional *note +ssl.SSLContext: 430. instance to configure SSL settings used in an HTTP +connection. (Contributed by Alex Gaynor in bpo-22788(2).) + +The *note handlers.QueueListener: ab0. class now takes a +`respect_handler_level' keyword argument which, if set to ‘True’, will +pass messages to handlers taking handler levels into account. +(Contributed by Vinay Sajip.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20537 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22788 + + +File: python.info, Node: lzma, Next: math<6>, Prev: logging<5>, Up: Improved Modules<7> + +1.7.5.39 lzma +............. + +The *note LZMADecompressor.decompress(): ab2. method now accepts an +optional `max_length' argument to limit the maximum size of decompressed +data. (Contributed by Martin Panter in bpo-15955(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15955 + + +File: python.info, Node: math<6>, Next: multiprocessing<5>, Prev: lzma, Up: Improved Modules<7> + +1.7.5.40 math +............. + +Two new constants have been added to the *note math: af. module: *note +inf: 8f5. and *note nan: 234. (Contributed by Mark Dickinson in +bpo-23185(1).) + +A new function *note isclose(): a2f. provides a way to test for +approximate equality. (Contributed by Chris Barker and Tal Einat in +bpo-24270(2).) + +A new *note gcd(): 555. function has been added. The ‘fractions.gcd()’ +function is now deprecated. (Contributed by Mark Dickinson and Serhiy +Storchaka in bpo-22486(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23185 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24270 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22486 + + +File: python.info, Node: multiprocessing<5>, Next: operator<2>, Prev: math<6>, Up: Improved Modules<7> + +1.7.5.41 multiprocessing +........................ + +*note sharedctypes.synchronized(): ab5. objects now support the *note +context manager: 1a0. protocol. (Contributed by Charles-François Natali +in bpo-21565(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21565 + + +File: python.info, Node: operator<2>, Next: os<8>, Prev: multiprocessing<5>, Up: Improved Modules<7> + +1.7.5.42 operator +................. + +*note attrgetter(): ab7, *note itemgetter(): 6b3, and *note +methodcaller(): ab8. objects now support pickling. (Contributed by Josh +Rosenberg and Serhiy Storchaka in bpo-22955(1).) + +New *note matmul(): ab9. and *note imatmul(): aba. functions to perform +matrix multiplication. (Contributed by Benjamin Peterson in +bpo-21176(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22955 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21176 + + +File: python.info, Node: os<8>, Next: pathlib<7>, Prev: operator<2>, Up: Improved Modules<7> + +1.7.5.43 os +........... + +The new *note scandir(): 6b0. function returning an iterator of *note +DirEntry: 8c4. objects has been added. If possible, *note scandir(): +6b0. 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(1).) + +On Windows, a new *note stat_result.st_file_attributes: abc. attribute +is now available. It corresponds to the ‘dwFileAttributes’ member of +the ‘BY_HANDLE_FILE_INFORMATION’ structure returned by +‘GetFileInformationByHandle()’. (Contributed by Ben Hoyt in +bpo-21719(2).) + +The *note urandom(): 237. function now uses the ‘getrandom()’ syscall on +Linux 3.17 or newer, and ‘getentropy()’ on OpenBSD 5.6 and newer, +removing the need to use ‘/dev/urandom’ and avoiding failures due to +potential file descriptor exhaustion. (Contributed by Victor Stinner in +bpo-22181(3).) + +New *note get_blocking(): abd. and *note set_blocking(): abe. functions +allow getting and setting a file descriptor’s blocking mode (*note +O_NONBLOCK: abf.) (Contributed by Victor Stinner in bpo-22054(4).) + +The *note truncate(): ac0. and *note ftruncate(): a0d. functions are now +supported on Windows. (Contributed by Steve Dower in bpo-23668(5).) + +There is a new *note os.path.commonpath(): ac1. function returning the +longest common sub-path of each passed pathname. Unlike the *note +os.path.commonprefix(): ac2. function, it always returns a valid path: + + >>> os.path.commonprefix(['/usr/lib', '/usr/local/lib']) + '/usr/l' + + >>> os.path.commonpath(['/usr/lib', '/usr/local/lib']) + '/usr' + +(Contributed by Rafik Draoui and Serhiy Storchaka in bpo-10395(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22524 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21719 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22181 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22054 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23668 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=10395 + + +File: python.info, Node: pathlib<7>, Next: pickle<3>, Prev: os<8>, Up: Improved Modules<7> + +1.7.5.44 pathlib +................ + +The new *note Path.samefile(): ac4. method can be used to check whether +the path points to the same file as another path, which can be either +another *note Path: 65f. object, or a string: + + >>> import pathlib + >>> p1 = pathlib.Path('/etc/hosts') + >>> p2 = pathlib.Path('/etc/../etc/hosts') + >>> p1.samefile(p2) + True + +(Contributed by Vajrasky Kok and Antoine Pitrou in bpo-19775(1).) + +The *note Path.mkdir(): ac5. method now accepts a new optional +`exist_ok' argument to match ‘mkdir -p’ and *note os.makedirs(): 7bf. +functionality. (Contributed by Berker Peksag in bpo-21539(2).) + +There is a new *note Path.expanduser(): ac6. method to expand ‘~’ and +‘~user’ prefixes. (Contributed by Serhiy Storchaka and Claudiu Popa in +bpo-19776(3).) + +A new *note Path.home(): ac7. class method can be used to get a *note +Path: 65f. instance representing the user’s home directory. +(Contributed by Victor Salgado and Mayank Tripathi in bpo-19777(4).) + +New *note Path.write_text(): ac8, *note Path.read_text(): ac9, *note +Path.write_bytes(): aca, *note Path.read_bytes(): acb. methods to +simplify read/write operations on files. + +The following code snippet will create or rewrite existing file +‘~/spam42’: + + >>> import pathlib + >>> p = pathlib.Path('~/spam42') + >>> p.expanduser().write_text('ham') + 3 + +(Contributed by Christopher Welborn in bpo-20218(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19775 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21539 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19776 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19777 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=20218 + + +File: python.info, Node: pickle<3>, Next: poplib<2>, Prev: pathlib<7>, Up: Improved Modules<7> + +1.7.5.45 pickle +............... + +Nested objects, such as unbound methods or nested classes, can now be +pickled using *note pickle protocols: 930. older than protocol version +4. Protocol version 4 already supports these cases. (Contributed by +Serhiy Storchaka in bpo-23611(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23611 + + +File: python.info, Node: poplib<2>, Next: re<5>, Prev: pickle<3>, Up: Improved Modules<7> + +1.7.5.46 poplib +............... + +A new *note POP3.utf8(): ace. command enables RFC 6856(1) +(Internationalized Email) support, if a POP server supports it. +(Contributed by Milan OberKirch in bpo-21804(2).) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc6856.html + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21804 + + +File: python.info, Node: re<5>, Next: readline<2>, Prev: poplib<2>, Up: Improved Modules<7> + +1.7.5.47 re +........... + +References and conditional references to groups with fixed length are +now allowed in lookbehind assertions: + + >>> 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'> + +(Contributed by Serhiy Storchaka in bpo-9179(1).) + +The number of capturing groups in regular expressions is no longer +limited to 100. (Contributed by Serhiy Storchaka in bpo-22437(2).) + +The *note sub(): 85d. and *note subn(): ad0. functions now replace +unmatched groups with empty strings instead of raising an exception. +(Contributed by Serhiy Storchaka in bpo-1519638(3).) + +The *note re.error: ad1. exceptions have new attributes, *note msg: ad2, +*note pattern: ad3, *note pos: ad4, *note lineno: ad5, and *note colno: +ad6, that provide better context information about the error: + + >>> re.compile(""" + ... (?x) + ... .++ + ... """) + Traceback (most recent call last): + ... + sre_constants.error: multiple repeat at position 16 (line 3, column 7) + +(Contributed by Serhiy Storchaka in bpo-22578(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9179 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22437 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1519638 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22578 + + +File: python.info, Node: readline<2>, Next: selectors, Prev: re<5>, Up: Improved Modules<7> + +1.7.5.48 readline +................. + +A new *note append_history_file(): ad8. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22940 + + +File: python.info, Node: selectors, Next: shutil<3>, Prev: readline<2>, Up: Improved Modules<7> + +1.7.5.49 selectors +.................. + +The new *note DevpollSelector: 83e. supports efficient ‘/dev/poll’ +polling on Solaris. (Contributed by Giampaolo Rodola’ in bpo-18931(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18931 + + +File: python.info, Node: shutil<3>, Next: signal<3>, Prev: selectors, Up: Improved Modules<7> + +1.7.5.50 shutil +............... + +The *note move(): 6ac. function now accepts a `copy_function' argument, +allowing, for example, the *note copy(): 6aa. function to be used +instead of the default *note copy2(): 6ab. if there is a need to ignore +file metadata when moving. (Contributed by Claudiu Popa in +bpo-19840(1).) + +The *note make_archive(): 676. function now supports the `xztar' format. +(Contributed by Serhiy Storchaka in bpo-5411(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19840 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5411 + + +File: python.info, Node: signal<3>, Next: smtpd, Prev: shutil<3>, Up: Improved Modules<7> + +1.7.5.51 signal +............... + +On Windows, the *note set_wakeup_fd(): 7cf. function now also supports +socket handles. (Contributed by Victor Stinner in bpo-22018(1).) + +Various ‘SIG*’ constants in the *note signal: e7. module have been +converted into *note Enums: 76. This allows meaningful names to be +printed during debugging, instead of integer “magic numbers”. +(Contributed by Giampaolo Rodola’ in bpo-21076(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22018 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21076 + + +File: python.info, Node: smtpd, Next: smtplib<2>, Prev: signal<3>, Up: Improved Modules<7> + +1.7.5.52 smtpd +.............. + +Both the *note SMTPServer: 9bc. and *note SMTPChannel: 9bb. classes now +accept a `decode_data' keyword argument to determine if the ‘DATA’ +portion of the SMTP transaction is decoded using the ‘"utf-8"’ codec or +is instead provided to the *note SMTPServer.process_message(): 9bd. +method as a byte string. The default is ‘True’ for backward +compatibility reasons, but will change to ‘False’ in Python 3.6. If +`decode_data' is set to ‘False’, the ‘process_message’ method must be +prepared to accept keyword arguments. (Contributed by Maciej Szulik in +bpo-19662(1).) + +The *note SMTPServer: 9bc. class now advertises the ‘8BITMIME’ extension +( RFC 6152(2)) if `decode_data' has been set ‘True’. If the client +specifies ‘BODY=8BITMIME’ on the ‘MAIL’ command, it is passed to *note +SMTPServer.process_message(): 9bd. via the `mail_options' keyword. +(Contributed by Milan Oberkirch and R. David Murray in bpo-21795(3).) + +The *note SMTPServer: 9bc. class now also supports the ‘SMTPUTF8’ +extension ( RFC 6531(4): Internationalized Email). If the client +specified ‘SMTPUTF8 BODY=8BITMIME’ on the ‘MAIL’ command, they are +passed to *note SMTPServer.process_message(): 9bd. via the +`mail_options' keyword. It is the responsibility of the +‘process_message’ method to correctly handle the ‘SMTPUTF8’ data. +(Contributed by Milan Oberkirch in bpo-21725(5).) + +It is now possible to provide, directly or via name resolution, IPv6 +addresses in the *note SMTPServer: 9bc. constructor, and have it +successfully connect. (Contributed by Milan Oberkirch in bpo-14758(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19662 + + (2) https://datatracker.ietf.org/doc/html/rfc6152.html + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21795 + + (4) https://datatracker.ietf.org/doc/html/rfc6531.html + + (5) https://bugs.python.org/issue?@action=redirect&bpo=21725 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=14758 + + +File: python.info, Node: smtplib<2>, Next: sndhdr, Prev: smtpd, Up: Improved Modules<7> + +1.7.5.53 smtplib +................ + +A new *note SMTP.auth(): ade. method provides a convenient way to +implement custom authentication mechanisms. (Contributed by Milan +Oberkirch in bpo-15014(1).) + +The *note SMTP.set_debuglevel(): adf. method now accepts an additional +debuglevel (2), which enables timestamps in debug messages. +(Contributed by Gavin Chappell and Maciej Szulik in bpo-16914(2).) + +Both the *note SMTP.sendmail(): ae0. and *note SMTP.send_message(): ae1. +methods now support RFC 6531(3) (SMTPUTF8). (Contributed by Milan +Oberkirch and R. David Murray in bpo-22027(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15014 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16914 + + (3) https://datatracker.ietf.org/doc/html/rfc6531.html + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22027 + + +File: python.info, Node: sndhdr, Next: socket<8>, Prev: smtplib<2>, Up: Improved Modules<7> + +1.7.5.54 sndhdr +............... + +The *note what(): ae3. and *note whathdr(): ae4. functions now return a +*note namedtuple(): 538. (Contributed by Claudiu Popa in bpo-18615(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18615 + + +File: python.info, Node: socket<8>, Next: ssl<7>, Prev: sndhdr, Up: Improved Modules<7> + +1.7.5.55 socket +............... + +Functions with timeouts now use a monotonic clock, instead of a system +clock. (Contributed by Victor Stinner in bpo-22043(1).) + +A new *note socket.sendfile(): ae6. method allows sending a file over a +socket by using the high-performance *note os.sendfile(): 762. function +on UNIX, resulting in uploads being from 2 to 3 times faster than when +using plain *note socket.send(): a25. (Contributed by Giampaolo Rodola’ +in bpo-17552(2).) + +The *note socket.sendall(): a26. 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(3).) + +The `backlog' argument of the *note socket.listen(): ae7. method is now +optional. By default it is set to *note SOMAXCONN: ae8. or to ‘128’, +whichever is less. (Contributed by Charles-François Natali in +bpo-21455(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22043 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17552 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23853 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21455 + + +File: python.info, Node: ssl<7>, Next: sqlite3<5>, Prev: socket<8>, Up: Improved Modules<7> + +1.7.5.56 ssl +............ + +* Menu: + +* Memory BIO Support:: +* Application-Layer Protocol Negotiation Support:: +* Other Changes:: + + +File: python.info, Node: Memory BIO Support, Next: Application-Layer Protocol Negotiation Support, Up: ssl<7> + +1.7.5.57 Memory BIO Support +........................... + +(Contributed by Geert Jansen in bpo-21965(1).) + +The new *note SSLObject: 7e1. class has been added to provide SSL +protocol support for cases when the network I/O capabilities of *note +SSLSocket: 52a. are not necessary or are suboptimal. ‘SSLObject’ +represents an SSL protocol instance, but does not implement any network +I/O methods, and instead provides a memory buffer interface. The new +*note MemoryBIO: aeb. 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 *note SSLSocket: +52a.’s readiness model (“select/poll”) is inefficient. + +A new *note SSLContext.wrap_bio(): 7e2. method can be used to create a +new ‘SSLObject’ instance. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21965 + + +File: python.info, Node: Application-Layer Protocol Negotiation Support, Next: Other Changes, Prev: Memory BIO Support, Up: ssl<7> + +1.7.5.58 Application-Layer Protocol Negotiation Support +....................................................... + +(Contributed by Benjamin Peterson in bpo-20188(1).) + +Where OpenSSL support is present, the *note ssl: f0. module now +implements the `Application-Layer Protocol Negotiation' TLS extension as +described in RFC 7301(2). + +The new *note SSLContext.set_alpn_protocols(): aed. can be used to +specify which protocols a socket should advertise during the TLS +handshake. + +The new *note SSLSocket.selected_alpn_protocol(): aee. returns the +protocol that was selected during the TLS handshake. The *note +HAS_ALPN: aef. flag indicates whether ALPN support is present. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20188 + + (2) https://datatracker.ietf.org/doc/html/rfc7301.html + + +File: python.info, Node: Other Changes, Prev: Application-Layer Protocol Negotiation Support, Up: ssl<7> + +1.7.5.59 Other Changes +...................... + +There is a new *note SSLSocket.version(): af1. method to query the +actual protocol version in use. (Contributed by Antoine Pitrou in +bpo-20421(1).) + +The *note SSLSocket: 52a. class now implements a ‘SSLSocket.sendfile()’ +method. (Contributed by Giampaolo Rodola’ in bpo-17552(2).) + +The ‘SSLSocket.send()’ method now raises either the *note +ssl.SSLWantReadError: af2. or *note ssl.SSLWantWriteError: af3. +exception on a non-blocking socket if the operation would block. +Previously, it would return ‘0’. (Contributed by Nikolaus Rath in +bpo-20951(3).) + +The *note cert_time_to_seconds(): af4. function now interprets the input +time as UTC and not as local time, per RFC 5280(4). Additionally, the +return value is always an *note int: 1c7. (Contributed by Akira Li in +bpo-19940(5).) + +New ‘SSLObject.shared_ciphers()’ and *note SSLSocket.shared_ciphers(): +af5. methods return the list of ciphers sent by the client during the +handshake. (Contributed by Benjamin Peterson in bpo-23186(6).) + +The *note SSLSocket.do_handshake(): af6, *note SSLSocket.read(): af7, +‘SSLSocket.shutdown()’, and *note SSLSocket.write(): af8. methods of the +*note SSLSocket: 52a. 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(7).) + +The *note match_hostname(): 492. function now supports matching of IP +addresses. (Contributed by Antoine Pitrou in bpo-23239(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20421 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17552 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20951 + + (4) https://datatracker.ietf.org/doc/html/rfc5280.html + + (5) https://bugs.python.org/issue?@action=redirect&bpo=19940 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23186 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23853 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=23239 + + +File: python.info, Node: sqlite3<5>, Next: subprocess<3>, Prev: ssl<7>, Up: Improved Modules<7> + +1.7.5.60 sqlite3 +................ + +The *note Row: afa. class now fully supports the sequence protocol, in +particular *note reversed(): 462. iteration and slice indexing. +(Contributed by Claudiu Popa in bpo-10203(1); by Lucas Sinclair, Jessica +McKellar, and Serhiy Storchaka in bpo-13583(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10203 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13583 + + +File: python.info, Node: subprocess<3>, Next: sys<8>, Prev: sqlite3<5>, Up: Improved Modules<7> + +1.7.5.61 subprocess +................... + +The new *note run(): 7e8. function has been added. It runs the +specified command and returns a *note CompletedProcess: afc. 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(1).) + +Examples: + + >>> 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') + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23342 + + +File: python.info, Node: sys<8>, Next: sysconfig<2>, Prev: subprocess<3>, Up: Improved Modules<7> + +1.7.5.62 sys +............ + +A new ‘set_coroutine_wrapper()’ function allows setting a global hook +that will be called whenever a *note coroutine object: 525. is created +by an *note async def: 19b. function. A corresponding +‘get_coroutine_wrapper()’ can be used to obtain a currently set wrapper. +Both functions are *note provisional: 757, and are intended for +debugging purposes only. (Contributed by Yury Selivanov in +bpo-24017(1).) + +A new *note is_finalizing(): afe. function can be used to check if the +Python interpreter is *note shutting down: aff. (Contributed by Antoine +Pitrou in bpo-22696(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24017 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22696 + + +File: python.info, Node: sysconfig<2>, Next: tarfile<2>, Prev: sys<8>, Up: Improved Modules<7> + +1.7.5.63 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23437 + + +File: python.info, Node: tarfile<2>, Next: threading<5>, Prev: sysconfig<2>, Up: Improved Modules<7> + +1.7.5.64 tarfile +................ + +The `mode' argument of the *note open(): b02. function now accepts ‘"x"’ +to request exclusive creation. (Contributed by Berker Peksag in +bpo-21717(1).) + +The *note TarFile.extractall(): b03. and *note TarFile.extract(): b04. +methods now take a keyword argument `numeric_owner'. If set to ‘True’, +the extracted files and directories will be owned by the numeric ‘uid’ +and ‘gid’ from the tarfile. If set to ‘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(2).) + +The *note TarFile.list(): b05. now accepts an optional `members' keyword +argument that can be set to a subset of the list returned by *note +TarFile.getmembers(): b06. (Contributed by Serhiy Storchaka in +bpo-21549(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21717 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23193 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21549 + + +File: python.info, Node: threading<5>, Next: time<6>, Prev: tarfile<2>, Up: Improved Modules<7> + +1.7.5.65 threading +.................. + +Both the *note Lock.acquire(): 262. and *note RLock.acquire(): b08. +methods now use a monotonic clock for timeout management. (Contributed +by Victor Stinner in bpo-22043(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22043 + + +File: python.info, Node: time<6>, Next: timeit<2>, Prev: threading<5>, Up: Improved Modules<7> + +1.7.5.66 time +............. + +The *note monotonic(): b0a. function is now always available. +(Contributed by Victor Stinner in bpo-22043(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22043 + + +File: python.info, Node: timeit<2>, Next: tkinter<6>, Prev: time<6>, Up: Improved Modules<7> + +1.7.5.67 timeit +............... + +A new command line option ‘-u’ or ‘--unit=U’ can be used to specify the +time unit for the timer output. Supported options are ‘usec’, ‘msec’, +or ‘sec’. (Contributed by Julian Gindi in bpo-18983(1).) + +The *note timeit(): b0c. function has a new `globals' parameter for +specifying the namespace in which the code will be running. +(Contributed by Ben Roberts in bpo-2527(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18983 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=2527 + + +File: python.info, Node: tkinter<6>, Next: traceback<4>, Prev: timeit<2>, Up: Improved Modules<7> + +1.7.5.68 tkinter +................ + +The ‘tkinter._fix’ module used for setting up the Tcl/Tk environment on +Windows has been replaced by a private function in the ‘_tkinter’ module +which makes no permanent changes to environment variables. (Contributed +by Zachary Ware in bpo-20035(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20035 + + +File: python.info, Node: traceback<4>, Next: types<3>, Prev: tkinter<6>, Up: Improved Modules<7> + +1.7.5.69 traceback +.................. + +New *note walk_stack(): b0f. and *note walk_tb(): b10. functions to +conveniently traverse frame and traceback objects. (Contributed by +Robert Collins in bpo-17911(1).) + +New lightweight classes: *note TracebackException: 26a, *note +StackSummary: b11, and *note FrameSummary: b12. (Contributed by Robert +Collins in bpo-17911(2).) + +Both the *note print_tb(): b13. and *note print_stack(): b14. functions +now support negative values for the `limit' argument. (Contributed by +Dmitry Kazakov in bpo-22619(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17911 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17911 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22619 + + +File: python.info, Node: types<3>, Next: unicodedata<6>, Prev: traceback<4>, Up: Improved Modules<7> + +1.7.5.70 types +.............. + +A new *note coroutine(): b16. function to transform *note generator: +844. and *note generator-like: a5c. objects into *note awaitables: 8e7. +(Contributed by Yury Selivanov in bpo-24017(1).) + +A new type called *note CoroutineType: b17, which is used for *note +coroutine: 525. objects created by *note async def: 19b. functions. +(Contributed by Yury Selivanov in bpo-24400(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24017 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24400 + + +File: python.info, Node: unicodedata<6>, Next: unittest<5>, Prev: types<3>, Up: Improved Modules<7> + +1.7.5.71 unicodedata +.................... + +The *note unicodedata: 124. module now uses data from Unicode 8.0.0(1). + + ---------- Footnotes ---------- + + (1) https://unicode.org/versions/Unicode8.0.0/ + + +File: python.info, Node: unittest<5>, Next: unittest mock<3>, Prev: unicodedata<6>, Up: Improved Modules<7> + +1.7.5.72 unittest +................. + +The *note TestLoader.loadTestsFromModule(): 2d8. method now accepts a +keyword-only argument `pattern' which is passed to ‘load_tests’ as the +third argument. Found packages are now checked for ‘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(1).) + +Unittest discovery errors now are exposed in the *note +TestLoader.errors: b1a. attribute of the *note TestLoader: 2d7. +instance. (Contributed by Robert Collins in bpo-19746(2).) + +A new command line option ‘--locals’ to show local variables in +tracebacks. (Contributed by Robert Collins in bpo-22936(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16662 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19746 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22936 + + +File: python.info, Node: unittest mock<3>, Next: urllib, Prev: unittest<5>, Up: Improved Modules<7> + +1.7.5.73 unittest.mock +...................... + +The *note Mock: 69b. class has the following improvements: + + * The class constructor has a new `unsafe' parameter, which causes + mock objects to raise *note AttributeError: 19d. on attribute names + starting with ‘"assert"’. (Contributed by Kushal Das in + bpo-21238(1).) + + * A new *note Mock.assert_not_called(): b1c. method to check if the + mock object was called. (Contributed by Kushal Das in + bpo-21262(2).) + +The *note MagicMock: b1d. class now supports ‘__truediv__()’, +‘__divmod__()’ and ‘__matmul__()’ operators. (Contributed by Johannes +Baiter in bpo-20968(3), and Håkan Lövdahl in bpo-23581(4) and +bpo-23568(5).) + +It is no longer necessary to explicitly pass ‘create=True’ to the *note +patch(): b1e. function when patching builtin names. (Contributed by +Kushal Das in bpo-17660(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21238 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21262 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20968 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23581 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23568 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17660 + + +File: python.info, Node: urllib, Next: wsgiref, Prev: unittest mock<3>, Up: Improved Modules<7> + +1.7.5.74 urllib +............... + +A new *note request.HTTPPasswordMgrWithPriorAuth: b20. class allows HTTP +Basic Authentication credentials to be managed so as to eliminate +unnecessary ‘401’ response handling, or to unconditionally send +credentials on the first request in order to communicate with servers +that return a ‘404’ response instead of a ‘401’ if the ‘Authorization’ +header is not sent. (Contributed by Matej Cepl in bpo-19494(1) and +Akshit Khurana in bpo-7159(2).) + +A new `quote_via' argument for the *note parse.urlencode(): b21. +function provides a way to control the encoding of query parts if +needed. (Contributed by Samwyse and Arnon Yaari in bpo-13866(3).) + +The *note request.urlopen(): b22. function accepts an *note +ssl.SSLContext: 430. object as a `context' argument, which will be used +for the HTTPS connection. (Contributed by Alex Gaynor in bpo-22366(4).) + +The *note parse.urljoin(): b23. was updated to use the RFC 3986(5) +semantics for the resolution of relative URLs, rather than RFC 1808(6) +and RFC 2396(7). (Contributed by Demian Brecht and Senthil Kumaran in +bpo-22118(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19494 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=7159 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13866 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22366 + + (5) https://datatracker.ietf.org/doc/html/rfc3986.html + + (6) https://datatracker.ietf.org/doc/html/rfc1808.html + + (7) https://datatracker.ietf.org/doc/html/rfc2396.html + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22118 + + +File: python.info, Node: wsgiref, Next: xmlrpc<2>, Prev: urllib, Up: Improved Modules<7> + +1.7.5.75 wsgiref +................ + +The `headers' argument of the *note headers.Headers: b25. class +constructor is now optional. (Contributed by Pablo Torres Navarrete and +SilentGhost in bpo-5800(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5800 + + +File: python.info, Node: xmlrpc<2>, Next: xml sax, Prev: wsgiref, Up: Improved Modules<7> + +1.7.5.76 xmlrpc +............... + +The *note client.ServerProxy: 6a6. class now supports the *note context +manager: 1a0. protocol. (Contributed by Claudiu Popa in bpo-20627(1).) + +The *note client.ServerProxy: 6a6. constructor now accepts an optional +*note ssl.SSLContext: 430. instance. (Contributed by Alex Gaynor in +bpo-22960(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20627 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22960 + + +File: python.info, Node: xml sax, Next: zipfile<4>, Prev: xmlrpc<2>, Up: Improved Modules<7> + +1.7.5.77 xml.sax +................ + +SAX parsers now support a character stream of the *note +xmlreader.InputSource: b28. object. (Contributed by Serhiy Storchaka in +bpo-2175(1).) + +*note parseString(): b29. now accepts a *note str: 1b3. instance. +(Contributed by Serhiy Storchaka in bpo-10590(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2175 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10590 + + +File: python.info, Node: zipfile<4>, Prev: xml sax, Up: Improved Modules<7> + +1.7.5.78 zipfile +................ + +ZIP output can now be written to unseekable streams. (Contributed by +Serhiy Storchaka in bpo-23252(1).) + +The `mode' argument of *note ZipFile.open(): 97b. method now accepts +‘"x"’ to request exclusive creation. (Contributed by Serhiy Storchaka +in bpo-21717(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23252 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21717 + + +File: python.info, Node: Other module-level changes, Next: Optimizations<7>, Prev: Improved Modules<7>, Up: What’s New In Python 3 5 + +1.7.6 Other module-level changes +-------------------------------- + +Many functions in the *note mmap: b1, *note ossaudiodev: c4, *note +socket: ec, *note ssl: f0, and *note codecs: 1a. modules now accept +writable *note bytes-like objects: 9a2. (Contributed by Serhiy +Storchaka in bpo-23001(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23001 + + +File: python.info, Node: Optimizations<7>, Next: Build and C API Changes<3>, Prev: Other module-level changes, Up: What’s New In Python 3 5 + +1.7.7 Optimizations +------------------- + +The *note os.walk(): a00. 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 *note os.scandir(): 6b0. function, which exposes file information +from the underlying ‘readdir’ or ‘FindFirstFile’/‘FindNextFile’ system +calls. (Contributed by Ben Hoyt with help from Victor Stinner in +bpo-23605(1).) + +Construction of ‘bytes(int)’ (filled by zero bytes) is faster and uses +less memory for large objects. ‘calloc()’ is used instead of ‘malloc()’ +to allocate memory for these objects. (Contributed by Victor Stinner in +bpo-21233(2).) + +Some operations on *note ipaddress: a0. *note IPv4Network: 7a3. and +*note IPv6Network: 7a2. have been massively sped up, such as *note +subnets(): b2d, *note supernet(): b2e, *note summarize_address_range(): +b2f, *note collapse_addresses(): b30. The speed up can range from 3 to +15 times. (Contributed by Antoine Pitrou, Michel Albert, and Markus in +bpo-21486(3), bpo-21487(4), bpo-20826(5), bpo-23266(6).) + +Pickling of *note ipaddress: a0. objects was optimized to produce +significantly smaller output. (Contributed by Serhiy Storchaka in +bpo-23133(7).) + +Many operations on *note io.BytesIO: b31. are now 50% to 100% faster. +(Contributed by Serhiy Storchaka in bpo-15381(8) and David Wilson in +bpo-22003(9).) + +The *note marshal.dumps(): b32. 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(10) and bpo-23344(11).) + +The UTF-32 encoder is now 3 to 7 times faster. (Contributed by Serhiy +Storchaka in bpo-15027(12).) + +Regular expressions are now parsed up to 10% faster. (Contributed by +Serhiy Storchaka in bpo-19380(13).) + +The *note json.dumps(): 9bf. function was optimized to run with +‘ensure_ascii=False’ as fast as with ‘ensure_ascii=True’. (Contributed +by Naoki Inada in bpo-23206(14).) + +The *note PyObject_IsInstance(): b33. and *note PyObject_IsSubclass(): +b34. functions have been sped up in the common case that the second +argument has *note type: 9c2. as its metaclass. (Contributed Georg +Brandl by in bpo-22540(15).) + +Method caching was slightly improved, yielding up to 5% performance +improvement in some benchmarks. (Contributed by Antoine Pitrou in +bpo-22847(16).) + +Objects from the *note random: d9. module now use 50% less memory on +64-bit builds. (Contributed by Serhiy Storchaka in bpo-23488(17).) + +The *note property(): 205. getter calls are up to 25% faster. +(Contributed by Joe Jevnik in bpo-23910(18).) + +Instantiation of *note fractions.Fraction: 210. is now up to 30% faster. +(Contributed by Stefan Behnel in bpo-22464(19).) + +String methods *note find(): b35, *note rfind(): b36, *note split(): +b37, *note partition(): b38. and the *note in: 20a. string operator are +now significantly faster for searching 1-character substrings. +(Contributed by Serhiy Storchaka in bpo-23573(20).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23605 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21233 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21486 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21487 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=20826 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23266 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23133 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=15381 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=22003 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=20416 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23344 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=15027 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=19380 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=23206 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=22540 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=22847 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=23488 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=23910 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=22464 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23573 + + +File: python.info, Node: Build and C API Changes<3>, Next: Deprecated<8>, Prev: Optimizations<7>, Up: What’s New In Python 3 5 + +1.7.8 Build and C API Changes +----------------------------- + +New ‘calloc’ functions were added: + + * *note PyMem_RawCalloc(): b3a, + + * *note PyMem_Calloc(): b3b, + + * *note PyObject_Calloc(): b3c. + +(Contributed by Victor Stinner in bpo-21233(1).) + +New encoding/decoding helper functions: + + * *note Py_DecodeLocale(): 82d. (replaced ‘_Py_char2wchar()’), + + * *note Py_EncodeLocale(): 82e. (replaced ‘_Py_wchar2char()’). + +(Contributed by Victor Stinner in bpo-18395(2).) + +A new *note PyCodec_NameReplaceErrors(): b3d. function to replace the +unicode encode error with ‘\N{...}’ escapes. (Contributed by Serhiy +Storchaka in bpo-19676(3).) + +A new *note PyErr_FormatV(): b3e. function similar to *note +PyErr_Format(): b3f, but accepts a ‘va_list’ argument. (Contributed by +Antoine Pitrou in bpo-18711(4).) + +A new ‘PyExc_RecursionError’ exception. (Contributed by Georg Brandl in +bpo-19235(5).) + +New *note PyModule_FromDefAndSpec(): b40, *note +PyModule_FromDefAndSpec2(): b41, and *note PyModule_ExecDef(): b42. +functions introduced by PEP 489(6) – multi-phase extension module +initialization. (Contributed by Petr Viktorin in bpo-24268(7).) + +New *note PyNumber_MatrixMultiply(): b43. and *note +PyNumber_InPlaceMatrixMultiply(): b44. functions to perform matrix +multiplication. (Contributed by Benjamin Peterson in bpo-21176(8). See +also PEP 465(9) for details.) + +The *note PyTypeObject.tp_finalize: 702. 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(10). + +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): + + * On Linux, extension module filenames end with + ‘.cpython-m--.pyd’: + + * ‘’ is the major number of the Python version; for + Python 3.5 this is ‘3’. + + * ‘’ is the minor number of the Python version; for + Python 3.5 this is ‘5’. + + * ‘’ is the hardware architecture the extension + module was built to run on. It’s most commonly either ‘i386’ + for 32-bit Intel platforms or ‘x86_64’ for 64-bit Intel (and + AMD) platforms. + + * ‘’ is always ‘linux-gnu’, except for extensions built to + talk to the 32-bit ABI on 64-bit platforms, in which case it + is ‘linux-gnu32’ (and ‘’ will be ‘x86_64’). + + * On Windows, extension module filenames end with + ‘.cp-.pyd’: + + * ‘’ is the major number of the Python version; for + Python 3.5 this is ‘3’. + + * ‘’ is the minor number of the Python version; for + Python 3.5 this is ‘5’. + + * ‘’ is the platform the extension module was built + for, either ‘win32’ for Win32, ‘win_amd64’ for Win64, + ‘win_ia64’ for Windows Itanium 64, and ‘win_arm’ for Windows + on ARM. + + * If built in debug mode, ‘’ will be ‘_d’, otherwise it + will be blank. + + * On OS X platforms, extension module filenames now end with + ‘-darwin.so’. + + * On all other platforms, extension module filenames are the same as + they were with Python 3.4. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21233 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18395 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19676 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18711 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=19235 + + (6) https://peps.python.org/pep-0489/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24268 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=21176 + + (9) https://peps.python.org/pep-0465/ + + (10) https://www.visualstudio.com/ + + +File: python.info, Node: Deprecated<8>, Next: Removed<8>, Prev: Build and C API Changes<3>, Up: What’s New In Python 3 5 + +1.7.9 Deprecated +---------------- + +* Menu: + +* New Keywords: New Keywords<2>. +* Deprecated Python Behavior: Deprecated Python Behavior<2>. +* Unsupported Operating Systems:: +* Deprecated Python modules, functions and methods: Deprecated Python modules functions and methods<3>. + + +File: python.info, Node: New Keywords<2>, Next: Deprecated Python Behavior<2>, Up: Deprecated<8> + +1.7.9.1 New Keywords +.................... + +‘async’ and ‘await’ are not recommended to be used as variable, class, +function or module names. Introduced by PEP 492(1) in Python 3.5, they +will become proper keywords in Python 3.7. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0492/ + + +File: python.info, Node: Deprecated Python Behavior<2>, Next: Unsupported Operating Systems, Prev: New Keywords<2>, Up: Deprecated<8> + +1.7.9.2 Deprecated Python Behavior +.................................. + +Raising the *note StopIteration: 865. exception inside a generator will +now generate a silent *note PendingDeprecationWarning: 503, which will +become a non-silent deprecation warning in Python 3.6 and will trigger a +*note RuntimeError: 6e9. in Python 3.7. See *note PEP 479; Change +StopIteration handling inside generators: 994. for details. + + +File: python.info, Node: Unsupported Operating Systems, Next: Deprecated Python modules functions and methods<3>, Prev: Deprecated Python Behavior<2>, Up: Deprecated<8> + +1.7.9.3 Unsupported Operating Systems +..................................... + +Windows XP is no longer supported by Microsoft, thus, per PEP 11(1), +CPython 3.5 is no longer officially supported on this OS. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0011/ + + +File: python.info, Node: Deprecated Python modules functions and methods<3>, Prev: Unsupported Operating Systems, Up: Deprecated<8> + +1.7.9.4 Deprecated Python modules, functions and methods +........................................................ + +The ‘formatter’ module has now graduated to full deprecation and is +still slated for removal in Python 3.6. + +The ‘asyncio.async()’ function is deprecated in favor of *note +ensure_future(): 478. + +The *note smtpd: e9. module has in the past always decoded the DATA +portion of email messages using the ‘utf-8’ codec. This can now be +controlled by the new `decode_data' keyword to *note SMTPServer: 9bc. +The default value is ‘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 *note key: 86b, *note value: 86c. and +*note coded_value: 86d. of *note http.cookies.Morsel: 86e. objects is +deprecated. Use the *note set(): 86f. method instead. In addition, the +undocumented `LegalChars' parameter of *note set(): 86f. is deprecated, +and is now ignored. + +Passing a format string as keyword argument `format_string' to the *note +format(): 86a. method of the *note string.Formatter: b4a. class has been +deprecated. (Contributed by Serhiy Storchaka in bpo-23671(1).) + +The ‘platform.dist()’ and ‘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(2).) + +The previously undocumented ‘from_function’ and ‘from_builtin’ methods +of *note inspect.Signature: 303. are deprecated. Use the new *note +Signature.from_callable(): 304. method instead. (Contributed by Yury +Selivanov in bpo-24248(3).) + +The ‘inspect.getargspec()’ function is deprecated and scheduled to be +removed in Python 3.6. (See bpo-20438(4) for details.) + +The *note inspect: 9e. *note getfullargspec(): 302, *note getcallargs(): +b4b, and ‘formatargspec()’ functions are deprecated in favor of the +*note inspect.signature(): 301. API. (Contributed by Yury Selivanov in +bpo-20438(5).) + +*note getargvalues(): b4c. and *note formatargvalues(): b4d. functions +were inadvertently marked as deprecated with the release of Python +3.5.0. + +Use of *note re.LOCALE: 7ca. flag with str patterns or *note re.ASCII: +207. is now deprecated. (Contributed by Serhiy Storchaka in +bpo-22407(6).) + +Use of unrecognized special sequences consisting of ‘'\'’ 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(7).) + +The undocumented and unofficial `use_load_tests' default argument of the +*note unittest.TestLoader.loadTestsFromModule(): 2d8. method now is +deprecated and ignored. (Contributed by Robert Collins and Barry A. +Warsaw in bpo-16662(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23671 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1322 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24248 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20438 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=20438 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22407 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23622 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=16662 + + +File: python.info, Node: Removed<8>, Next: Porting to Python 3 5, Prev: Deprecated<8>, Up: What’s New In Python 3 5 + +1.7.10 Removed +-------------- + +* Menu: + +* API and Feature Removals: API and Feature Removals<4>. + + +File: python.info, Node: API and Feature Removals<4>, Up: Removed<8> + +1.7.10.1 API and Feature Removals +................................. + +The following obsolete and previously deprecated APIs and features have +been removed: + + * The ‘__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 ‘__version__’ string was not + updated in the last few releases. + + * The internal ‘Netrc’ class in the *note ftplib: 7e. module was + deprecated in 3.4, and has now been removed. (Contributed by Matt + Chaput in bpo-6623(1).) + + * The concept of ‘.pyo’ files has been removed. + + * The JoinableQueue class in the provisional *note asyncio: 9. module + was deprecated in 3.4.4 and is now removed. (Contributed by A. + Jesse Jiryu Davis in bpo-23464(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6623 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23464 + + +File: python.info, Node: Porting to Python 3 5, Next: Notable changes in Python 3 5 4, Prev: Removed<8>, Up: What’s New In Python 3 5 + +1.7.11 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<6>. +* Changes in the C API: Changes in the C API<6>. + + +File: python.info, Node: Changes in Python behavior<2>, Next: Changes in the Python API<6>, Up: Porting to Python 3 5 + +1.7.11.1 Changes in Python behavior +................................... + + * Due to an oversight, earlier Python versions erroneously accepted + the following syntax: + + f(1 for x in [1], *args) + f(1 for x in [1], **kwargs) + + Python 3.5 now correctly raises a *note SyntaxError: 2d6, as + generator expressions must be put in parentheses if not a sole + argument to a function. + + +File: python.info, Node: Changes in the Python API<6>, Next: Changes in the C API<6>, Prev: Changes in Python behavior<2>, Up: Porting to Python 3 5 + +1.7.11.2 Changes in the Python API +.................................. + + * PEP 475(1): System calls are now retried when interrupted by a + signal instead of raising *note InterruptedError: a05. if the + Python signal handler does not raise an exception. + + * Before Python 3.5, a *note datetime.time: 4bf. 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(2) for full details. + + * The ‘ssl.SSLSocket.send()’ method now raises either *note + ssl.SSLWantReadError: af2. or *note ssl.SSLWantWriteError: af3. on + a non-blocking socket if the operation would block. Previously, it + would return ‘0’. (Contributed by Nikolaus Rath in bpo-20951(3).) + + * The ‘__name__’ attribute of generators is now set from the function + name, instead of being set from the code name. Use + ‘gen.gi_code.co_name’ to retrieve the code name. Generators also + have a new ‘__qualname__’ attribute, the qualified name, which is + now used for the representation of a generator (‘repr(gen)’). + (Contributed by Victor Stinner in bpo-21205(4).) + + * The deprecated “strict” mode and argument of *note HTMLParser: 499, + ‘HTMLParser.error()’, and the ‘HTMLParserError’ exception have been + removed. (Contributed by Ezio Melotti in bpo-15114(5).) The + `convert_charrefs' argument of *note HTMLParser: 499. is now ‘True’ + by default. (Contributed by Berker Peksag in bpo-21047(6).) + + * 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 *note bytes-like object: 9a2. is + required, not ‘sometype’”. (Contributed by Ezio Melotti in + bpo-16518(7).) + + * If the current directory is set to a directory that no longer + exists then *note FileNotFoundError: b53. will no longer be raised + and instead *note find_spec(): b54. will return ‘None’ `without' + caching ‘None’ in *note sys.path_importer_cache: 1b2, which is + different than the typical case (bpo-22834(8)). + + * HTTP status code and messages from *note http.client: 8f. and *note + http.server: 92. were refactored into a common *note HTTPStatus: + 543. enum. The values in *note http.client: 8f. and *note + http.server: 92. remain available for backwards compatibility. + (Contributed by Demian Brecht in bpo-21793(9).) + + * When an import loader defines + ‘importlib.machinery.Loader.exec_module()’ it is now expected to + also define ‘create_module()’ (raises a *note DeprecationWarning: + 2d4. now, will be an error in Python 3.6). If the loader inherits + from *note importlib.abc.Loader: b55. then there is nothing to do, + else simply define ‘create_module()’ to return ‘None’. + (Contributed by Brett Cannon in bpo-23014(10).) + + * The *note re.split(): 7cb. function always ignored empty pattern + matches, so the ‘"x*"’ pattern worked the same as ‘"x+"’, and the + ‘"\b"’ pattern never worked. Now *note re.split(): 7cb. raises a + warning if the pattern could match an empty string. For + compatibility, use patterns that never match an empty string (e.g. + ‘"x+"’ instead of ‘"x*"’). Patterns that could only match an empty + string (such as ‘"\b"’) now raise an error. (Contributed by Serhiy + Storchaka in bpo-22818(11).) + + * The *note http.cookies.Morsel: 86e. dict-like interface has been + made self consistent: morsel comparison now takes the *note key: + 86b. and *note value: 86c. into account, *note copy(): b56. now + results in a *note Morsel: 86e. instance rather than a *note dict: + 16e, and *note update(): b57. will now raise an exception if any of + the keys in the update dictionary are invalid. In addition, the + undocumented `LegalChars' parameter of *note set(): 86f. is + deprecated and is now ignored. (Contributed by Demian Brecht in + bpo-2211(12).) + + * PEP 488(13) has removed ‘.pyo’ files from Python and introduced the + optional ‘opt-’ tag in ‘.pyc’ file names. The *note + importlib.util.cache_from_source(): 91e. has gained an + `optimization' parameter to help control the ‘opt-’ tag. Because + of this, the `debug_override' parameter of the function is now + deprecated. ‘.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 ‘.pyo’ files from previous versions of Python + are invalid regardless of this PEP. + + * The *note socket: ec. module now exports the *note + CAN_RAW_FD_FRAMES: b58. constant on linux 3.6 and greater. + + * The *note ssl.cert_time_to_seconds(): af4. function now interprets + the input time as UTC and not as local time, per RFC 5280(14). + Additionally, the return value is always an *note int: 1c7. + (Contributed by Akira Li in bpo-19940(15).) + + * The ‘pygettext.py’ Tool now uses the standard +NNNN format for + timezones in the POT-Creation-Date header. + + * The *note smtplib: ea. module now uses *note sys.stderr: 581. + instead of the previous module-level ‘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. + + * The *note str.startswith(): b59. and *note str.endswith(): b5a. + methods no longer return ‘True’ when finding the empty string and + the indexes are completely out of range. (Contributed by Serhiy + Storchaka in bpo-24284(16).) + + * The *note inspect.getdoc(): 63f. 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 *note pydoc: d6. module and the *note + help(): 514. function. (Contributed by Serhiy Storchaka in + bpo-15582(17).) + + * Nested *note functools.partial(): b5b. calls are now flattened. If + you were relying on the previous behavior, you can now either add + an attribute to a *note functools.partial(): b5b. object or you can + create a subclass of *note functools.partial(): b5b. (Contributed + by Alexander Belopolsky in bpo-7830(18).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0475/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13936 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20951 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21205 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=15114 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21047 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=16518 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22834 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=21793 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=23014 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=22818 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=2211 + + (13) https://peps.python.org/pep-0488/ + + (14) https://datatracker.ietf.org/doc/html/rfc5280.html + + (15) https://bugs.python.org/issue?@action=redirect&bpo=19940 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24284 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=15582 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=7830 + + +File: python.info, Node: Changes in the C API<6>, Prev: Changes in the Python API<6>, Up: Porting to Python 3 5 + +1.7.11.3 Changes in the C API +............................. + + * The undocumented ‘format’ member of the (non-public) + ‘PyMemoryViewObject’ structure has been removed. All extensions + relying on the relevant parts in ‘memoryobject.h’ must be rebuilt. + + * The ‘PyMemAllocator’ structure was renamed to *note + PyMemAllocatorEx: b5d. and a new ‘calloc’ field was added. + + * Removed non-documented macro ‘PyObject_REPR’ which leaked + references. Use format character ‘%R’ in *note + PyUnicode_FromFormat(): 4f2.-like functions to format the *note + repr(): 3ee. of the object. (Contributed by Serhiy Storchaka in + bpo-22453(1).) + + * Because the lack of the ‘__module__’ attribute breaks pickling and + introspection, a deprecation warning is now raised for builtin + types without the ‘__module__’ attribute. This would be an + AttributeError in the future. (Contributed by Serhiy Storchaka in + bpo-20204(2).) + + * As part of the PEP 492(3) implementation, the ‘tp_reserved’ slot of + *note PyTypeObject: 701. was replaced with a ‘tp_as_async’ slot. + Refer to *note Coroutine Objects: b5e. for new types, structures + and functions. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22453 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20204 + + (3) https://peps.python.org/pep-0492/ + + +File: python.info, Node: Notable changes in Python 3 5 4, Prev: Porting to Python 3 5, Up: What’s New In Python 3 5 + +1.7.12 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>. + + +File: python.info, Node: New make regen-all build target<2>, Next: Removal of make touch build target<2>, Up: Notable changes in Python 3 5 4 + +1.7.12.1 New ‘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 ‘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(1) for details. + +(Contributed by Victor Stinner in bpo-23404(2).) + +New in version 3.5.4. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Makefile.pre.in + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + +File: python.info, Node: Removal of make touch build target<2>, Prev: New make regen-all build target<2>, Up: Notable changes in Python 3 5 4 + +1.7.12.2 Removal of ‘make touch’ build target +............................................. + +The ‘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 ‘make regen-all’ target. + +(Contributed by Victor Stinner in bpo-23404(1).) + +Changed in version 3.5.4. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + +File: python.info, Node: What’s New In Python 3 4, Next: What’s New In Python 3 3, Prev: What’s New In Python 3 5, Up: What’s New in Python + +1.8 What’s New In Python 3.4 +============================ + + +Author: R. David Murray <> (Editor) + +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(1). + +See also +........ + +PEP 429(2) – Python 3.4 Release Schedule + +* Menu: + +* Summary – Release Highlights: Summary – Release Highlights<2>. +* New Features: New Features<11>. +* New Modules: New Modules<8>. +* Improved Modules: Improved Modules<8>. +* CPython Implementation Changes:: +* Deprecated: Deprecated<9>. +* Removed: Removed<9>. +* Porting to Python 3.4: Porting to Python 3 4. +* Changed in 3.4.3: Changed in 3 4 3. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3.4/whatsnew/changelog.html + + (2) https://peps.python.org/pep-0429/ + + +File: python.info, Node: Summary – Release Highlights<2>, Next: New Features<11>, Up: What’s New In Python 3 4 + +1.8.1 Summary – Release Highlights +---------------------------------- + +New syntax features: + + * No new syntax features were added in Python 3.4. + +Other new features: + + * *note pip should always be available: b65. ( PEP 453(1)). + + * *note Newly created file descriptors are non-inheritable: b66. ( + PEP 446(2)). + + * command line option for *note isolated mode: b67. (bpo-16499(3)). + + * *note improvements in the handling of codecs: b68. that are not + text encodings (multiple issues). + + * *note A ModuleSpec Type: b69. for the Import System ( PEP 451(4)). + (Affects importer authors.) + + * The *note marshal: ae. format has been made *note more compact and + efficient: b6a. (bpo-16475(5)). + +New library modules: + + * *note asyncio: 9.: *note New provisional API for asynchronous IO: + b6b. ( PEP 3156(6)). + + * *note ensurepip: 75.: *note Bootstrapping the pip installer: b6c. ( + PEP 453(7)). + + * *note enum: 76.: *note Support for enumeration types: b6d. ( PEP + 435(8)). + + * *note pathlib: c5.: *note Object-oriented filesystem paths: b6e. ( + PEP 428(9)). + + * *note selectors: e3.: *note High-level and efficient I/O + multiplexing: b6f, built upon the *note select: e2. module + primitives (part of PEP 3156(10)). + + * *note statistics: f2.: A basic *note numerically stable statistics + library: b70. ( PEP 450(11)). + + * *note tracemalloc: 11e.: *note Trace Python memory allocations: + b71. ( PEP 454(12)). + +Significantly improved library modules: + + * *note Single-dispatch generic functions: b72. in *note functools: + 7f. ( PEP 443(13)). + + * New *note pickle: c7. *note protocol 4: b73. ( PEP 3154(14)). + + * *note multiprocessing: b5. now has *note an option to avoid using + os.fork on Unix: b74. (bpo-8713(15)). + + * *note email: 64. has a new submodule, *note contentmanager: 66, and + a new *note Message: 90b. subclass (‘EmailMessage’) that *note + simplify MIME handling: b75. (bpo-18891(16)). + + * The *note inspect: 9e. and *note pydoc: d6. modules are now capable + of correct introspection of a much wider variety of callable + objects, which improves the output of the Python *note help(): 514. + system. + + * The *note ipaddress: a0. module API has been declared stable + +Security improvements: + + * *note Secure and interchangeable hash algorithm: b76. ( PEP + 456(17)). + + * *note Make newly created file descriptors non-inheritable: b66. ( + PEP 446(18)) to avoid leaking file descriptors to child processes. + + * New command line option for *note isolated mode: b67, + (bpo-16499(19)). + + * *note multiprocessing: b5. now has *note an option to avoid using + os.fork on Unix: b74. `spawn' and `forkserver' are more secure + because they avoid sharing data with child processes. + + * *note multiprocessing: b5. child processes on Windows no longer + inherit all of the parent’s inheritable handles, only the necessary + ones. + + * A new *note hashlib.pbkdf2_hmac(): 3fb. function provides the + PKCS#5 password-based key derivation function 2(20). + + * *note TLSv1.1 and TLSv1.2 support: b77. for *note ssl: f0. + + * *note Retrieving certificates from the Windows system cert store + support: b78. for *note ssl: f0. + + * *note Server-side SNI (Server Name Indication) support: b79. for + *note ssl: f0. + + * The *note ssl.SSLContext: 430. class has a *note lot of + improvements: b7a. + + * All modules in the standard library that support SSL now support + server certificate verification, including hostname matching (*note + ssl.match_hostname(): 492.) and CRLs (Certificate Revocation lists, + see *note ssl.SSLContext.load_verify_locations(): b7b.). + +CPython implementation improvements: + + * *note Safe object finalization: b7c. ( PEP 442(21)). + + * Leveraging PEP 442(22), in most cases *note module globals are no + longer set to None during finalization: b7c. (bpo-18214(23)). + + * *note Configurable memory allocators: b7d. ( PEP 445(24)). + + * *note Argument Clinic: b7e. ( PEP 436(25)). + +Please read on for a comprehensive list of user-facing changes, +including many other smaller improvements, CPython optimizations, +deprecations, and potential porting issues. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0453/ + + (2) https://peps.python.org/pep-0446/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16499 + + (4) https://peps.python.org/pep-0451/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=16475 + + (6) https://peps.python.org/pep-3156/ + + (7) https://peps.python.org/pep-0453/ + + (8) https://peps.python.org/pep-0435/ + + (9) https://peps.python.org/pep-0428/ + + (10) https://peps.python.org/pep-3156/ + + (11) https://peps.python.org/pep-0450/ + + (12) https://peps.python.org/pep-0454/ + + (13) https://peps.python.org/pep-0443/ + + (14) https://peps.python.org/pep-3154/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=8713 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=18891 + + (17) https://peps.python.org/pep-0456/ + + (18) https://peps.python.org/pep-0446/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=16499 + + (20) https://en.wikipedia.org/wiki/PBKDF2 + + (21) https://peps.python.org/pep-0442/ + + (22) https://peps.python.org/pep-0442/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=18214 + + (24) https://peps.python.org/pep-0445/ + + (25) https://peps.python.org/pep-0436/ + + +File: python.info, Node: New Features<11>, Next: New Modules<8>, Prev: Summary – Release Highlights<2>, Up: What’s New In Python 3 4 + +1.8.2 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<8>. + + +File: python.info, Node: PEP 453 Explicit Bootstrapping of PIP in Python Installations, Next: PEP 446 Newly Created File Descriptors Are Non-Inheritable, Up: New Features<11> + +1.8.2.1 PEP 453: Explicit Bootstrapping of PIP in Python Installations +...................................................................... + +* Menu: + +* Bootstrapping pip By Default:: +* Documentation Changes:: + + +File: python.info, Node: Bootstrapping pip By Default, Next: Documentation Changes, Up: PEP 453 Explicit Bootstrapping of PIP in Python Installations + +1.8.2.2 Bootstrapping pip By Default +.................................... + +The new *note ensurepip: 75. module (defined in PEP 453(1)) provides a +standard cross-platform mechanism to bootstrap the pip installer into +Python installations and virtual environments. The version of ‘pip’ +included with Python 3.4.0 is ‘pip’ 1.5.4, and future 3.4.x maintenance +releases will update the bundled version to the latest version of ‘pip’ +that is available at the time of creating the release candidate. + +By default, the commands ‘pipX’ and ‘pipX.Y’ will be installed on all +platforms (where X.Y stands for the version of the Python installation), +along with the ‘pip’ Python package and its dependencies. On Windows +and in virtual environments on all platforms, the unversioned ‘pip’ +command will also be installed. On other platforms, the system wide +unversioned ‘pip’ command typically refers to the separately installed +Python 2 version. + +The ‘pyvenv’ command line utility and the *note venv: 12f. module make +use of the *note ensurepip: 75. module to make ‘pip’ readily available +in virtual environments. When using the command line utility, ‘pip’ is +installed by default, while when using the *note venv: 12f. module *note +API: b82. installation of ‘pip’ must be requested explicitly. + +For CPython *note source builds on POSIX systems: b83, the ‘make +install’ and ‘make altinstall’ commands bootstrap ‘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 ‘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 ‘PATH’ modifications to have ‘pip’ available +from the command line by default, otherwise it can still be accessed +through the Python launcher for Windows as ‘py -m pip’. + +As discussed in the PEP(2), 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). + + Note: To avoid conflicts between parallel Python 2 and Python 3 + installations, only the versioned ‘pip3’ and ‘pip3.4’ commands are + bootstrapped by default when ‘ensurepip’ is invoked directly - the + ‘--default-pip’ option is needed to also request the unversioned + ‘pip’ command. ‘pyvenv’ and the Windows installer ensure that the + unqualified ‘pip’ command is made available in those environments, + and ‘pip’ can always be invoked via the ‘-m’ switch rather than + directly to avoid ambiguity on systems with multiple Python + installations. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0453/ + + (2) +https://peps.python.org/pep-0453/#recommendations-for-downstream-distributors + + +File: python.info, Node: Documentation Changes, Prev: Bootstrapping pip By Default, Up: PEP 453 Explicit Bootstrapping of PIP in Python Installations + +1.8.2.3 Documentation Changes +............................. + +As part of this change, the *note Installing Python Modules: b85. and +*note Distributing Python Modules: b86. 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(1) and +the documentation of the individual projects. + +However, as this migration is currently still incomplete, the legacy +versions of those guides remaining available as *note Installing Python +Modules (Legacy version): b87. and *note Distributing Python Modules +(Legacy version): b88. + +See also +........ + +PEP 453(2) – 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. + + ---------- Footnotes ---------- + + (1) https://packaging.python.org + + (2) https://peps.python.org/pep-0453/ + + +File: python.info, Node: PEP 446 Newly Created File Descriptors Are Non-Inheritable, Next: Improvements to Codec Handling, Prev: PEP 453 Explicit Bootstrapping of PIP in Python Installations, Up: New Features<11> + +1.8.2.4 PEP 446: Newly Created File Descriptors Are Non-Inheritable +................................................................... + +PEP 446(1) makes newly created file descriptors *note non-inheritable: +b8a. 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: + + * *note os.get_inheritable(): b8b, *note os.set_inheritable(): b8c. + + * *note os.get_handle_inheritable(): b8d, *note + os.set_handle_inheritable(): b8e. + + * *note socket.socket.get_inheritable(): b8f, *note + socket.socket.set_inheritable(): b90. + +See also +........ + +PEP 446(2) – Make newly created file descriptors non-inheritable + + PEP written and implemented by Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0446/ + + (2) https://peps.python.org/pep-0446/ + + +File: python.info, Node: Improvements to Codec Handling, Next: PEP 451 A ModuleSpec Type for the Import System, Prev: PEP 446 Newly Created File Descriptors Are Non-Inheritable, Up: New Features<11> + +1.8.2.5 Improvements to Codec Handling +...................................... + +Since it was first introduced, the *note codecs: 1a. 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 *note +str: 1b3, *note bytes: 1b4. and *note bytearray: 1a5. types, has +historically obscured that fact. + +As a key step in clarifying the situation, the *note codecs.encode(): +b92. and *note codecs.decode(): b93. convenience functions are now +properly documented in Python 2.7, 3.3 and 3.4. These functions have +existed in the *note codecs: 1a. 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 *note str: 1b3, *note bytes: 1b4. and +*note bytearray: 1a5, the *note codecs: 1a. convenience functions +support arbitrary codecs in both Python 2 and Python 3, rather than +being limited to Unicode text encodings (in Python 3) or ‘basestring’ +<-> ‘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: + + >>> b"abcdef".decode("hex") + Traceback (most recent call last): + File "", line 1, in + LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs + + >>> "hello".encode("rot13") + Traceback (most recent call last): + File "", line 1, in + 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 "", line 1, in + LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs + +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: + + >>> 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 "", line 1, in + 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 "", line 1, in + TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface) + +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: + + >>> from codecs import encode, decode + >>> encode(b"hello", "hex") + b'68656c6c6f' + >>> decode(b"68656c6c6f", "hex") + b'hello' + +The binary and text transforms provided in the standard library are +detailed in *note Binary Transforms: b94. and *note Text Transforms: +b95. + +(Contributed by Nick Coghlan in bpo-7475(1), bpo-17827(2), bpo-17828(3) +and bpo-19619(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7475 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17827 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=17828 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19619 + + +File: python.info, Node: PEP 451 A ModuleSpec Type for the Import System, Next: Other Language Changes<8>, Prev: Improvements to Codec Handling, Up: New Features<11> + +1.8.2.6 PEP 451: A ModuleSpec Type for the Import System +........................................................ + +PEP 451(1) 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(2). + +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 *note Deprecated: b97. section for a list of +methods that should be replaced and their replacements. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0451/ + + (2) +https://mail.python.org/pipermail/python-dev/2013-November/130111.html + + +File: python.info, Node: Other Language Changes<8>, Prev: PEP 451 A ModuleSpec Type for the Import System, Up: New Features<11> + +1.8.2.7 Other Language Changes +.............................. + +Some smaller changes made to the core Python language are: + + * Unicode database updated to UCD version 6.3. + + * *note min(): b99. and *note max(): b9a. 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(1).) + + * Module objects are now *note weakly referenceable: b9b. + + * Module ‘__file__’ attributes (and related values) should now always + contain absolute paths by default, with the sole exception of + ‘__main__.__file__’ when a script has been executed directly using + a relative path. (Contributed by Brett Cannon in bpo-18416(2).) + + * All the UTF-* codecs (except UTF-7) now reject surrogates during + both encoding and decoding unless the ‘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(3).) + + * New German EBCDIC *note codec: a38. ‘cp273’. (Contributed by + Michael Bierenfeld and Andrew Kuchling in bpo-1097797(4).) + + * New Ukrainian *note codec: a38. ‘cp1125’. (Contributed by Serhiy + Storchaka in bpo-19668(5).) + + * *note bytes: 1b4.join() and *note bytearray: 1a5.join() now accept + arbitrary buffer objects as arguments. (Contributed by Antoine + Pitrou in bpo-15958(6).) + + * The *note int: 1c7. constructor now accepts any object that has an + ‘__index__’ method for its `base' argument. (Contributed by Mark + Dickinson in bpo-16772(7).) + + * Frame objects now have a *note clear(): b9c. method that clears all + references to local variables from the frame. (Contributed by + Antoine Pitrou in bpo-17934(8).) + + * *note memoryview: 6ad. is now registered as a *note Sequence: 1d, + and supports the *note reversed(): 462. builtin. (Contributed by + Nick Coghlan and Claudiu Popa in bpo-18690(9) and bpo-19078(10).) + + * Signatures reported by *note help(): 514. have been modified and + improved in several cases as a result of the introduction of + Argument Clinic and other changes to the *note inspect: 9e. and + *note pydoc: d6. modules. + + * *note __length_hint__(): b9d. is now part of the formal language + specification (see PEP 424(11)). (Contributed by Armin Ronacher in + bpo-16148(12).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18111 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18416 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=12892 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1097797 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=19668 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=15958 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=16772 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=17934 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=18690 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=19078 + + (11) https://peps.python.org/pep-0424/ + + (12) https://bugs.python.org/issue?@action=redirect&bpo=16148 + + +File: python.info, Node: New Modules<8>, Next: Improved Modules<8>, Prev: New Features<11>, Up: What’s New In Python 3 4 + +1.8.3 New Modules +----------------- + +* Menu: + +* asyncio: asyncio<9>. +* ensurepip:: +* enum: enum<7>. +* pathlib: pathlib<8>. +* selectors: selectors<2>. +* statistics: statistics<4>. +* tracemalloc: tracemalloc<4>. + + +File: python.info, Node: asyncio<9>, Next: ensurepip, Up: New Modules<8> + +1.8.3.1 asyncio +............... + +The new *note asyncio: 9. module (defined in PEP 3156(1)) 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 *note provisional API: 757. + +See also +........ + +PEP 3156(2) – Asynchronous IO Support Rebooted: the “asyncio” Module + + PEP written and implementation led by Guido van Rossum. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3156/ + + (2) https://peps.python.org/pep-3156/ + + +File: python.info, Node: ensurepip, Next: enum<7>, Prev: asyncio<9>, Up: New Modules<8> + +1.8.3.2 ensurepip +................. + +The new *note ensurepip: 75. module is the primary infrastructure for +the PEP 453(1) 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 ‘pip’ if the automated bootstrapping into an +installation or virtual environment was declined. + +*note ensurepip: 75. includes a bundled copy of ‘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). +‘ensurepip’ does not access the internet. If the installation has +internet access, after ‘ensurepip’ is run the bundled ‘pip’ can be used +to upgrade ‘pip’ to a more recent release than the bundled one. (Note +that such an upgraded version of ‘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 ‘pip’ is already +installed, it does nothing. It also has an ‘--upgrade’ option that will +cause it to install the bundled copy of ‘pip’ if the existing installed +version of ‘pip’ is older than the bundled copy. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0453/ + + +File: python.info, Node: enum<7>, Next: pathlib<8>, Prev: ensurepip, Up: New Modules<8> + +1.8.3.3 enum +............ + +The new *note enum: 76. module (defined in PEP 435(1)) provides a +standard implementation of enumeration types, allowing other modules +(such as *note socket: ec.) to provide more informative error messages +and better debugging support by replacing opaque integer constants with +backwards compatible enumeration values. + +See also +........ + +PEP 435(2) – Adding an Enum type to the Python standard library + + PEP written by Barry Warsaw, Eli Bendersky and Ethan Furman, + implemented by Ethan Furman. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0435/ + + (2) https://peps.python.org/pep-0435/ + + +File: python.info, Node: pathlib<8>, Next: selectors<2>, Prev: enum<7>, Up: New Modules<8> + +1.8.3.4 pathlib +............... + +The new *note pathlib: c5. 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 *note provisional API: 757. + +See also +........ + +PEP 428(1) – The pathlib module – object-oriented filesystem paths + + PEP written and implemented by Antoine Pitrou. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0428/ + + +File: python.info, Node: selectors<2>, Next: statistics<4>, Prev: pathlib<8>, Up: New Modules<8> + +1.8.3.5 selectors +................. + +The new *note selectors: e3. module (created as part of implementing PEP +3156(1)) allows high-level and efficient I/O multiplexing, built upon +the *note select: e2. module primitives. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3156/ + + +File: python.info, Node: statistics<4>, Next: tracemalloc<4>, Prev: selectors<2>, Up: New Modules<8> + +1.8.3.6 statistics +.................. + +The new *note statistics: f2. module (defined in PEP 450(1)) 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. + +See also +........ + +PEP 450(2) – Adding A Statistics Module To The Standard Library + + PEP written and implemented by Steven D’Aprano + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0450/ + + (2) https://peps.python.org/pep-0450/ + + +File: python.info, Node: tracemalloc<4>, Prev: statistics<4>, Up: New Modules<8> + +1.8.3.7 tracemalloc +................... + +The new *note tracemalloc: 11e. module (defined in PEP 454(1)) is a +debug tool to trace memory blocks allocated by Python. It provides the +following information: + + * Trace where an object was allocated + + * Statistics on allocated memory blocks per filename and per line + number: total size, number and average size of allocated memory + blocks + + * Compute the differences between two snapshots to detect memory + leaks + +See also +........ + +PEP 454(2) – Add a new tracemalloc module to trace Python memory allocations + + PEP written and implemented by Victor Stinner + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0454/ + + (2) https://peps.python.org/pep-0454/ + + +File: python.info, Node: Improved Modules<8>, Next: CPython Implementation Changes, Prev: New Modules<8>, Up: What’s New In Python 3 4 + +1.8.4 Improved Modules +---------------------- + +* Menu: + +* abc:: +* aifc: aifc<2>. +* argparse: argparse<4>. +* audioop:: +* base64: base64<2>. +* collections: collections<6>. +* colorsys:: +* contextlib: contextlib<6>. +* dbm: dbm<5>. +* dis: dis<2>. +* doctest: doctest<3>. +* email: email<3>. +* filecmp:: +* functools: functools<5>. +* gc: gc<5>. +* glob: glob<3>. +* hashlib: hashlib<5>. +* hmac: hmac<3>. +* html:: +* http: http<3>. +* idlelib and IDLE: idlelib and IDLE<4>. +* importlib: importlib<7>. +* inspect: inspect<7>. +* ipaddress: ipaddress<4>. +* logging: logging<6>. +* marshal:: +* mmap: mmap<2>. +* multiprocessing: multiprocessing<6>. +* operator: operator<3>. +* os: os<9>. +* pdb: pdb<4>. +* pickle: pickle<4>. +* plistlib: plistlib<2>. +* poplib: poplib<3>. +* pprint: pprint<4>. +* pty:: +* pydoc: pydoc<4>. +* re: re<6>. +* resource:: +* select:: +* shelve: shelve<2>. +* shutil: shutil<4>. +* smtpd: smtpd<2>. +* smtplib: smtplib<3>. +* socket: socket<9>. +* sqlite3: sqlite3<6>. +* ssl: ssl<8>. +* stat:: +* struct: struct<2>. +* subprocess: subprocess<4>. +* sunau: sunau<2>. +* sys: sys<9>. +* tarfile: tarfile<3>. +* textwrap:: +* threading: threading<6>. +* traceback: traceback<5>. +* types: types<4>. +* urllib: urllib<2>. +* unittest: unittest<6>. +* venv: venv<6>. +* wave: wave<2>. +* weakref: weakref<2>. +* xml.etree: xml etree<2>. +* zipfile: zipfile<5>. + + +File: python.info, Node: abc, Next: aifc<2>, Up: Improved Modules<8> + +1.8.4.1 abc +........... + +New function *note abc.get_cache_token(): ba8. 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(1).) + +New class *note ABC: ba9. has *note ABCMeta: baa. as its meta class. +Using ‘ABC’ as a base class has essentially the same effect as +specifying ‘metaclass=abc.ABCMeta’, but is simpler to type and easier to +read. (Contributed by Bruno Dupuis in bpo-16049(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16832 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16049 + + +File: python.info, Node: aifc<2>, Next: argparse<4>, Prev: abc, Up: Improved Modules<8> + +1.8.4.2 aifc +............ + +The *note getparams(): bac. method now returns a namedtuple rather than +a plain tuple. (Contributed by Claudiu Popa in bpo-17818(1).) + +*note aifc.open(): 847. now supports the context management protocol: +when used in a *note with: 19e. block, the *note close(): bad. method of +the returned object will be called automatically at the end of the +block. (Contributed by Serhiy Storchacha in bpo-16486(2).) + +The *note writeframesraw(): bae. and *note writeframes(): baf. methods +now accept any *note bytes-like object: 9a2. (Contributed by Serhiy +Storchaka in bpo-8311(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17818 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16486 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=8311 + + +File: python.info, Node: argparse<4>, Next: audioop, Prev: aifc<2>, Up: Improved Modules<8> + +1.8.4.3 argparse +................ + +The *note FileType: bb1. class now accepts `encoding' and `errors' +arguments, which are passed through to *note open(): 30b. (Contributed +by Lucas Maystre in bpo-11175(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11175 + + +File: python.info, Node: audioop, Next: base64<2>, Prev: argparse<4>, Up: Improved Modules<8> + +1.8.4.4 audioop +............... + +*note audioop: c. now supports 24-bit samples. (Contributed by Serhiy +Storchaka in bpo-12866(1).) + +New *note byteswap(): bb3. function converts big-endian samples to +little-endian and vice versa. (Contributed by Serhiy Storchaka in +bpo-19641(2).) + +All *note audioop: c. functions now accept any *note bytes-like object: +9a2. Strings are not accepted: they didn’t work before, now they raise +an error right away. (Contributed by Serhiy Storchaka in bpo-16685(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12866 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19641 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16685 + + +File: python.info, Node: base64<2>, Next: collections<6>, Prev: audioop, Up: Improved Modules<8> + +1.8.4.5 base64 +.............. + +The encoding and decoding functions in *note base64: d. now accept any +*note bytes-like object: 9a2. in cases where it previously required a +*note bytes: 1b4. or *note bytearray: 1a5. instance. (Contributed by +Nick Coghlan in bpo-17839(1).) + +New functions *note a85encode(): bb5, *note a85decode(): bb6, *note +b85encode(): bb7, and *note b85decode(): bb8. provide the ability to +encode and decode binary data from and to ‘Ascii85’ and the +git/mercurial ‘Base85’ formats, respectively. The ‘a85’ functions have +options that can be used to make them compatible with the variants of +the ‘Ascii85’ encoding, including the Adobe variant. (Contributed by +Martin Morrison, the Mercurial project, Serhiy Storchaka, and Antoine +Pitrou in bpo-17618(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17839 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17618 + + +File: python.info, Node: collections<6>, Next: colorsys, Prev: base64<2>, Up: Improved Modules<8> + +1.8.4.6 collections +................... + +The *note ChainMap.new_child(): bba. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16613 + + +File: python.info, Node: colorsys, Next: contextlib<6>, Prev: collections<6>, Up: Improved Modules<8> + +1.8.4.7 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14323 + + +File: python.info, Node: contextlib<6>, Next: dbm<5>, Prev: colorsys, Up: Improved Modules<8> + +1.8.4.8 contextlib +.................. + +The new *note contextlib.suppress: bbd. context manager helps to clarify +the intent of code that deliberately suppresses exceptions from a single +statement. (Contributed by Raymond Hettinger in bpo-15806(1) and Zero +Piraeus in bpo-19266(2).) + +The new *note contextlib.redirect_stdout(): a69. context manager makes +it easier for utility scripts to handle inflexible APIs that write their +output to *note sys.stdout: 72a. and don’t provide any options to +redirect it. Using the context manager, the *note sys.stdout: 72a. +output can be redirected to any other stream or, in conjunction with +*note io.StringIO: bbe, 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 *note sys.stdout: +72a. (Contributed by Raymond Hettinger in bpo-15805(3).) + +The *note contextlib: 22. documentation has also been updated to include +a *note discussion: bbf. of the differences between single use, reusable +and reentrant context managers. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15806 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19266 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=15805 + + +File: python.info, Node: dbm<5>, Next: dis<2>, Prev: contextlib<6>, Up: Improved Modules<8> + +1.8.4.9 dbm +........... + +*note dbm.open(): bc1. objects now support the context management +protocol. When used in a *note with: 19e. statement, the ‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19282 + + +File: python.info, Node: dis<2>, Next: doctest<3>, Prev: dbm<5>, Up: Improved Modules<8> + +1.8.4.10 dis +............ + +Functions *note show_code(): bc3, *note dis(): 78a, *note distb(): bc4, +and *note disassemble(): bc5. now accept a keyword-only `file' argument +that controls where they write their output. + +The *note dis: 36. module is now built around an *note Instruction: bc6. +class that provides object oriented access to the details of each +individual bytecode operation. + +A new method, *note get_instructions(): bc7, 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 *note dis: +36. module itself. For example: + + >>> import dis + >>> for instr in dis.get_instructions(lambda x: x + 1): + ... print(instr.opname) + LOAD_FAST + LOAD_CONST + BINARY_ADD + RETURN_VALUE + +The various display tools in the *note dis: 36. module have been +rewritten to use these new components. + +In addition, a new application-friendly class *note Bytecode: bc8. +provides an object-oriented API for inspecting bytecode in both in +human-readable form and for iterating over instructions. The *note +Bytecode: bc8. constructor takes the same arguments that +‘get_instruction()’ does (plus an optional `current_offset'), and the +resulting object can be iterated to produce *note Instruction: bc6. +objects. But it also has a *note dis: bc9. method, equivalent to +calling *note dis: 78a. on the constructor argument, but returned as a +multi-line string: + + >>> 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'] + +*note Bytecode: bc8. also has a class method, *note from_traceback(): +bca, that provides the ability to manipulate a traceback (that is, +‘print(Bytecode.from_traceback(tb).dis())’ is equivalent to +‘distb(tb)’). + +(Contributed by Nick Coghlan, Ryan Kelly and Thomas Kluyver in +bpo-11816(1) and Claudiu Popa in bpo-17916(2).) + +New function *note stack_effect(): bcb. 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(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11816 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17916 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19722 + + +File: python.info, Node: doctest<3>, Next: email<3>, Prev: dis<2>, Up: Improved Modules<8> + +1.8.4.11 doctest +................ + +A new *note option flag: bcd, *note FAIL_FAST: bce, halts test running +as soon as the first failure is detected. (Contributed by R. David +Murray and Daniel Urban in bpo-16522(1).) + +The *note doctest: 63. command line interface now uses *note argparse: +5, and has two new options, ‘-o’ and ‘-f’. ‘-o’ allows *note doctest +options: bcd. to be specified on the command line, and ‘-f’ is a +shorthand for ‘-o FAIL_FAST’ (to parallel the similar option supported +by the *note unittest: 125. CLI). (Contributed by R. David Murray in +bpo-11390(2).) + +*note doctest: 63. will now find doctests in extension module ‘__doc__’ +strings. (Contributed by Zachary Ware in bpo-3158(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16522 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=11390 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=3158 + + +File: python.info, Node: email<3>, Next: filecmp, Prev: doctest<3>, Up: Improved Modules<8> + +1.8.4.12 email +.............. + +*note as_string(): bd0. now accepts a `policy' argument to override the +default policy of the message when generating a string representation of +it. This means that ‘as_string’ can now be used in more circumstances, +instead of having to create and use a *note generator: 69. in order to +pass formatting parameters to its ‘flatten’ method. (Contributed by R. +David Murray in bpo-18600(1).) + +New method *note as_bytes(): bd1. added to produce a bytes +representation of the message in a fashion similar to how ‘as_string’ +produces a string representation. It does not accept the `maxheaderlen' +argument, but does accept the `unixfrom' and `policy' arguments. The +*note Message: 90b. *note __bytes__(): bd2. method calls it, meaning +that ‘bytes(mymsg)’ will now produce the intuitive result: a bytes +object containing the fully formatted message. (Contributed by R. David +Murray in bpo-18600(2).) + +The *note Message.set_param(): bd3. 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 ‘False’. (Contributed by R. David Murray +in bpo-18891(3).) A pair of new subclasses of *note Message: 90b. have +been added (*note EmailMessage: 90c. and *note MIMEPart: bd4.), along +with a new sub-module, *note contentmanager: 66. and a new *note policy: +70. attribute *note content_manager: bd5. All documentation is +currently in the new module, which is being added as part of email’s new +*note provisional API: 757. 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 *note contentmanager: +66. documentation and the *note email; Examples: bd6. 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(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18600 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18600 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18891 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18891 + + +File: python.info, Node: filecmp, Next: functools<5>, Prev: email<3>, Up: Improved Modules<8> + +1.8.4.13 filecmp +................ + +A new *note clear_cache(): bd8. function provides the ability to clear +the *note filecmp: 7a. comparison cache, which uses *note os.stat(): +653. 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(1).) + +New module attribute *note DEFAULT_IGNORES: bd9. provides the list of +directories that are used as the default value for the `ignore' +parameter of the *note dircmp(): bda. function. (Contributed by Eli +Bendersky in bpo-15442(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18149 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=15442 + + +File: python.info, Node: functools<5>, Next: gc<5>, Prev: filecmp, Up: Improved Modules<8> + +1.8.4.14 functools +.................. + +The new *note partialmethod(): 6cd. descriptor brings partial argument +application to descriptors, just as *note partial(): b5b. provides for +normal callables. The new descriptor also makes it easier to get +arbitrary callables (including *note partial(): b5b. instances) to +behave like normal instance methods when included in a class definition. +(Contributed by Alon Horev and Nick Coghlan in bpo-4331(1).) The new +*note singledispatch(): 212. 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. + +See also +........ + +PEP 443(2) – Single-dispatch generic functions + + PEP written and implemented by Łukasz Langa. + +*note total_ordering(): bdc. now supports a return value of *note +NotImplemented: 3c1. from the underlying comparison function. +(Contributed by Katie Miller in bpo-10042(3).) + +A pure-python version of the *note partial(): b5b. 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(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4331 + + (2) https://peps.python.org/pep-0443/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=10042 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=12428 + + +File: python.info, Node: gc<5>, Next: glob<3>, Prev: functools<5>, Up: Improved Modules<8> + +1.8.4.15 gc +........... + +New function *note get_stats(): bde. returns a list of three +per-generation dictionaries containing the collections statistics since +interpreter startup. (Contributed by Antoine Pitrou in bpo-16351(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16351 + + +File: python.info, Node: glob<3>, Next: hashlib<5>, Prev: gc<5>, Up: Improved Modules<8> + +1.8.4.16 glob +............. + +A new function *note escape(): be0. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8402 + + +File: python.info, Node: hashlib<5>, Next: hmac<3>, Prev: glob<3>, Up: Improved Modules<8> + +1.8.4.17 hashlib +................ + +A new *note hashlib.pbkdf2_hmac(): 3fb. function provides the PKCS#5 +password-based key derivation function 2(1). (Contributed by Christian +Heimes in bpo-18582(2).) + +The *note name: be2. attribute of *note hashlib: 88. hash objects is now +a formally supported interface. It has always existed in CPython’s +*note hashlib: 88. (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(3).) + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/PBKDF2 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18582 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18532 + + +File: python.info, Node: hmac<3>, Next: html, Prev: hashlib<5>, Up: Improved Modules<8> + +1.8.4.18 hmac +............. + +*note hmac: 8a. now accepts ‘bytearray’ as well as ‘bytes’ for the `key' +argument to the *note new(): 6f9. function, and the `msg' parameter to +both the *note new(): 6f9. function and the *note update(): be4. method +now accepts any type supported by the *note hashlib: 88. module. +(Contributed by Jonas Borgström in bpo-18240(1).) + +The `digestmod' argument to the *note hmac.new(): 6f9. function may now +be any hash digest name recognized by *note hashlib: 88. In addition, +the current behavior in which the value of `digestmod' defaults to ‘MD5’ +is deprecated: in a future version of Python there will be no default +value. (Contributed by Christian Heimes in bpo-17276(2).) + +With the addition of *note block_size: be5. and *note name: be6. +attributes (and the formal documentation of the *note digest_size: be7. +attribute), the *note hmac: 8a. module now conforms fully to the PEP +247(3) API. (Contributed by Christian Heimes in bpo-18775(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18240 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17276 + + (3) https://peps.python.org/pep-0247/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18775 + + +File: python.info, Node: html, Next: http<3>, Prev: hmac<3>, Up: Improved Modules<8> + +1.8.4.19 html +............. + +New function *note unescape(): 5a9. function converts HTML5 character +references to the corresponding Unicode characters. (Contributed by +Ezio Melotti in bpo-2927(1).) + +*note HTMLParser: 499. accepts a new keyword argument `convert_charrefs' +that, when ‘True’, automatically converts all character references. For +backward-compatibility, its value defaults to ‘False’, but it will +change to ‘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(2).) + +The `strict' argument of *note HTMLParser: 499. is now deprecated. +(Contributed by Ezio Melotti in bpo-15114(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2927 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13633 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=15114 + + +File: python.info, Node: http<3>, Next: idlelib and IDLE<4>, Prev: html, Up: Improved Modules<8> + +1.8.4.20 http +............. + +*note send_error(): bea. 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 ‘error_message_format’ attribute +and sent as the body of the error response. (Contributed by Karl Cow in +bpo-12921(1).) + +The *note http.server: 92. *note command line interface: beb. now has a +‘-b/--bind’ option that causes the server to listen on a specific +address. (Contributed by Malte Swart in bpo-17764(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12921 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17764 + + +File: python.info, Node: idlelib and IDLE<4>, Next: importlib<7>, Prev: http<3>, Up: Improved Modules<8> + +1.8.4.21 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 ‘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. + + +File: python.info, Node: importlib<7>, Next: inspect<7>, Prev: idlelib and IDLE<4>, Up: Improved Modules<8> + +1.8.4.22 importlib +.................. + +The *note InspectLoader: bee. ABC defines a new method, *note +source_to_code(): a93. that accepts source data and a path and returns a +code object. The default implementation is equivalent to ‘compile(data, +path, 'exec', dont_inherit=True)’. (Contributed by Eric Snow and Brett +Cannon in bpo-15627(1).) + +*note InspectLoader: bee. also now has a default implementation for the +*note get_code(): bef. method. However, it will normally be desirable +to override the default implementation for performance reasons. +(Contributed by Brett Cannon in bpo-18072(2).) + +The *note reload(): 79d. function has been moved from *note imp: 96. to +*note importlib: 97. as part of the *note imp: 96. module deprecation. +(Contributed by Berker Peksag in bpo-18193(3).) + +*note importlib.util: 9d. now has a *note MAGIC_NUMBER: bf0. attribute +providing access to the bytecode version number. This replaces the +*note get_magic(): bf1. function in the deprecated *note imp: 96. +module. (Contributed by Brett Cannon in bpo-18192(4).) + +New *note importlib.util: 9d. functions *note cache_from_source(): 91e. +and *note source_from_cache(): 91f. replace the same-named functions in +the deprecated *note imp: 96. module. (Contributed by Brett Cannon in +bpo-18194(5).) + +The *note importlib: 97. bootstrap ‘NamespaceLoader’ now conforms to the +*note InspectLoader: bee. ABC, which means that ‘runpy’ and ‘python -m’ +can now be used with namespace packages. (Contributed by Brett Cannon +in bpo-18058(6).) + +*note importlib.util: 9d. has a new function *note decode_source(): bf2. +that decodes source from bytes using universal newline processing. This +is useful for implementing *note InspectLoader.get_source(): bf3. +methods. + +*note importlib.machinery.ExtensionFileLoader: 91d. now has a *note +get_filename(): bf4. method. This was inadvertently omitted in the +original implementation. (Contributed by Eric Snow in bpo-19152(7).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15627 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18072 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18193 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18192 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=18194 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=18058 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=19152 + + +File: python.info, Node: inspect<7>, Next: ipaddress<4>, Prev: importlib<7>, Up: Improved Modules<8> + +1.8.4.23 inspect +................ + +The *note inspect: 9e. module now offers a basic *note command line +interface: bf6. to quickly display source code and other information for +modules, classes and functions. (Contributed by Claudiu Popa and Nick +Coghlan in bpo-18626(1).) + +*note unwrap(): bf7. makes it easy to unravel wrapper function chains +created by *note functools.wraps(): bf8. (and any other API that sets +the ‘__wrapped__’ attribute on a wrapper function). (Contributed by +Daniel Urban, Aaron Iles and Nick Coghlan in bpo-13266(2).) + +As part of the implementation of the new *note enum: 76. module, the +*note inspect: 9e. module now has substantially better support for +custom ‘__dir__’ methods and dynamic class attributes provided through +metaclasses. (Contributed by Ethan Furman in bpo-18929(3) and +bpo-19030(4).) + +*note getfullargspec(): 302. and ‘getargspec()’ now use the *note +signature(): 301. API. This allows them to support a much broader range +of callables, including those with ‘__signature__’ attributes, those +with metadata provided by argument clinic, *note functools.partial(): +b5b. objects and more. Note that, unlike *note signature(): 301, these +functions still ignore ‘__wrapped__’ attributes, and report the already +bound first argument for bound methods, so it is still necessary to +update your code to use *note signature(): 301. directly if those +features are desired. (Contributed by Yury Selivanov in bpo-17481(5).) + +*note signature(): 301. 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(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18626 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13266 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18929 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19030 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=17481 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17159 + + +File: python.info, Node: ipaddress<4>, Next: logging<6>, Prev: inspect<7>, Up: Improved Modules<8> + +1.8.4.24 ipaddress +.................. + +*note ipaddress: a0. was added to the standard library in Python 3.3 as +a *note provisional API: 757. With the release of Python 3.4, this +qualification has been removed: *note ipaddress: a0. is now considered a +stable API, covered by the normal standard library requirements to +maintain backwards compatibility. + +A new *note is_global: bfa. property is ‘True’ if an address is globally +routeable. (Contributed by Peter Moody in bpo-17400(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17400 + + +File: python.info, Node: logging<6>, Next: marshal, Prev: ipaddress<4>, Up: Improved Modules<8> + +1.8.4.25 logging +................ + +The *note TimedRotatingFileHandler: bfc. 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(1).) + +*note SocketHandler: bfd. and *note DatagramHandler: bfe. now support +Unix domain sockets (by setting `port' to ‘None’). (Contributed by +Vinay Sajip in commit ce46195b56a9.) + +*note fileConfig(): 7ab. now accepts a *note +configparser.RawConfigParser: bff. 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 +*note fileConfig(): 7ab. (Contributed by Vinay Sajip in bpo-16110(2).) + +Logging configuration data received from a socket via the *note +logging.config.listen(): c00. 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(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9556 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16110 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=15452 + + +File: python.info, Node: marshal, Next: mmap<2>, Prev: logging<6>, Up: Improved Modules<8> + +1.8.4.26 marshal +................ + +The default *note marshal: ae. 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 ‘.pyc’ files and the amount of memory a module occupies in memory +when it is loaded from a ‘.pyc’ (or ‘.pyo’) file. (Contributed by +Kristján Valur Jónsson in bpo-16475(1), with additional speedups by +Antoine Pitrou in bpo-19219(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16475 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19219 + + +File: python.info, Node: mmap<2>, Next: multiprocessing<6>, Prev: marshal, Up: Improved Modules<8> + +1.8.4.27 mmap +............. + +mmap objects are now *note weakly referenceable: b9b. (Contributed by +Valerie Lambert in bpo-4885(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4885 + + +File: python.info, Node: multiprocessing<6>, Next: operator<3>, Prev: mmap<2>, Up: Improved Modules<8> + +1.8.4.28 multiprocessing +........................ + +On Unix two new *note start methods: c04, ‘spawn’ and ‘forkserver’, have +been added for starting processes using *note multiprocessing: b5. +These make the mixing of processes with threads more robust, and the +‘spawn’ method matches the semantics that multiprocessing has always +used on Windows. New function *note get_all_start_methods(): c05. +reports all start methods available on the platform, *note +get_start_method(): c06. reports the current start method, and *note +set_start_method(): c07. sets the start method. (Contributed by Richard +Oudkerk in bpo-8713(1).) + +*note multiprocessing: b5. also now has the concept of a ‘context’, +which determines how child processes are created. New function *note +get_context(): c08. returns a context that uses a specified start +method. It has the same API as the *note multiprocessing: b5. module +itself, so you can use it to create *note Pool: c09.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(2).) + +Except when using the old `fork' start method, child processes no longer +inherit unneeded handles/file descriptors from their parents (part of +bpo-8713(3)). + +*note multiprocessing: b5. now relies on *note runpy: df. (which +implements the ‘-m’ switch) to initialise ‘__main__’ appropriately in +child processes when using the ‘spawn’ or ‘forkserver’ start methods. +This resolves some edge cases where combining multiprocessing, the ‘-m’ +command line switch, and explicit relative imports could cause obscure +failures in child processes. (Contributed by Nick Coghlan in +bpo-19946(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8713 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18999 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=8713 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19946 + + +File: python.info, Node: operator<3>, Next: os<9>, Prev: multiprocessing<6>, Up: Improved Modules<8> + +1.8.4.29 operator +................. + +New function *note length_hint(): c0b. provides an implementation of the +specification for how the *note __length_hint__(): b9d. special method +should be used, as part of the PEP 424(1) formal specification of this +language feature. (Contributed by Armin Ronacher in bpo-16148(2).) + +There is now a pure-python version of the *note operator: c0. module +available for reference and for use by alternate implementations of +Python. (Contributed by Zachary Ware in bpo-16694(3).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0424/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16148 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16694 + + +File: python.info, Node: os<9>, Next: pdb<4>, Prev: operator<3>, Up: Improved Modules<8> + +1.8.4.30 os +........... + +There are new functions to get and set the *note inheritable flag: b8a. +of a file descriptor (*note os.get_inheritable(): b8b, *note +os.set_inheritable(): b8c.) or a Windows handle (*note +os.get_handle_inheritable(): b8d, *note os.set_handle_inheritable(): +b8e.). + +New function *note cpu_count(): 40a. reports the number of CPUs +available on the platform on which Python is running (or ‘None’ if the +count can’t be determined). The *note multiprocessing.cpu_count(): c0d. +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(1).) + +*note os.path.samestat(): c0e. is now available on the Windows platform +(and the *note os.path.samefile(): c0f. implementation is now shared +between Unix and Windows). (Contributed by Brian Curtin in +bpo-11939(2).) + +*note os.path.ismount(): 65b. now recognizes volumes mounted below a +drive root on Windows. (Contributed by Tim Golden in bpo-9035(3).) + +*note os.open(): a10. supports two new flags on platforms that provide +them, *note O_PATH: c10. (un-opened file descriptor), and *note +O_TMPFILE: c11. (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(4) and +Benjamin Peterson, respectively.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17914 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=11939 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=9035 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18673 + + +File: python.info, Node: pdb<4>, Next: pickle<4>, Prev: os<9>, Up: Improved Modules<8> + +1.8.4.31 pdb +............ + +*note pdb: c6. has been enhanced to handle generators, *note yield: 60d, +and ‘yield from’ in a more useful fashion. This is especially helpful +when debugging *note asyncio: 9. based programs. (Contributed by Andrew +Svetlov and Xavier de Gaye in bpo-16596(1).) + +The ‘print’ command has been removed from *note pdb: c6, restoring +access to the Python *note print(): c13. function from the pdb command +line. Python2’s ‘pdb’ did not have a ‘print’ command; instead, entering +‘print’ executed the ‘print’ statement. In Python3 ‘print’ was +mistakenly made an alias for the pdb *note p: c14. command. ‘p’, +however, prints the ‘repr’ of its argument, not the ‘str’ like the +Python2 ‘print’ command did. Worse, the Python3 ‘pdb print’ command +shadowed the Python3 ‘print’ function, making it inaccessible at the +‘pdb’ prompt. (Contributed by Connor Osborn in bpo-18764(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16596 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18764 + + +File: python.info, Node: pickle<4>, Next: plistlib<2>, Prev: pdb<4>, Up: Improved Modules<8> + +1.8.4.32 pickle +............... + +*note pickle: c7. 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 ‘__new__()’ method takes keyword-only arguments. It also +provides some efficiency improvements. + +See also +........ + +PEP 3154(1) – Pickle protocol 4 + + PEP written by Antoine Pitrou and implemented by Alexandre + Vassalotti. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3154/ + + +File: python.info, Node: plistlib<2>, Next: poplib<3>, Prev: pickle<4>, Up: Improved Modules<8> + +1.8.4.33 plistlib +................. + +*note plistlib: cc. now has an API that is similar to the standard +pattern for stdlib serialization protocols, with new *note load(): 59f, +*note dump(): 5a1, *note loads(): 5a0, and *note dumps(): 5a2. +functions. (The older API is now deprecated.) In addition to the +already supported XML plist format (*note FMT_XML: c17.), it also now +supports the binary plist format (*note FMT_BINARY: c18.). (Contributed +by Ronald Oussoren and others in bpo-14455(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14455 + + +File: python.info, Node: poplib<3>, Next: pprint<4>, Prev: plistlib<2>, Up: Improved Modules<8> + +1.8.4.34 poplib +............... + +Two new methods have been added to *note poplib: cd.: *note capa(): c1a, +which returns the list of capabilities advertised by the POP server, and +*note stls(): c1b, 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4473 + + +File: python.info, Node: pprint<4>, Next: pty, Prev: poplib<3>, Up: Improved Modules<8> + +1.8.4.35 pprint +............... + +The *note pprint: cf. module’s *note PrettyPrinter: c1d. class and its +*note pformat(): c1e, and *note pprint(): 41d. functions have a new +option, `compact', that controls how the output is formatted. Currently +setting `compact' to ‘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(1).) + +Long strings are now wrapped using Python’s normal line continuation +syntax. (Contributed by Antoine Pitrou in bpo-17150(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19132 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17150 + + +File: python.info, Node: pty, Next: pydoc<4>, Prev: pprint<4>, Up: Improved Modules<8> + +1.8.4.36 pty +............ + +*note pty.spawn(): c20. now returns the status value from *note +os.waitpid(): a18. on the child process, instead of ‘None’. +(Contributed by Gregory P. Smith.) + + +File: python.info, Node: pydoc<4>, Next: re<6>, Prev: pty, Up: Improved Modules<8> + +1.8.4.37 pydoc +.............. + +The *note pydoc: d6. module is now based directly on the *note +inspect.signature(): 301. introspection API, allowing it to provide +signature information for a wider variety of callable objects. This +change also means that ‘__wrapped__’ attributes are now taken into +account when displaying help information. (Contributed by Larry +Hastings in bpo-19674(1).) + +The *note pydoc: d6. module no longer displays the ‘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(2).) + +In addition to the changes that have been made to *note pydoc: d6. +directly, its handling of custom ‘__dir__’ methods and various +descriptor behaviours has also been improved substantially by the +underlying changes in the *note inspect: 9e. module. + +As the *note help(): 514. builtin is based on *note pydoc: d6, the above +changes also affect the behaviour of *note help(): 514. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19674 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20710 + + +File: python.info, Node: re<6>, Next: resource, Prev: pydoc<4>, Up: Improved Modules<8> + +1.8.4.38 re +........... + +New *note fullmatch(): c23. function and ‘regex.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 ‘$’ characters get lost during code changes or the +addition of alternatives to an existing regular expression. +(Contributed by Matthew Barnett in bpo-16203(1).) + +The repr of *note regex objects: c24. now includes the pattern and the +flags; the repr of *note match objects: c25. now includes the start, +end, and the part of the string that matched. (Contributed by Hugo +Lopes Tavares and Serhiy Storchaka in bpo-13592(2) and bpo-17087(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16203 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13592 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=17087 + + +File: python.info, Node: resource, Next: select, Prev: re<6>, Up: Improved Modules<8> + +1.8.4.39 resource +................. + +New *note prlimit(): c27. 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(1).) + +On Linux kernel version 2.6.36 or later, there are also some new Linux +specific constants: *note RLIMIT_MSGQUEUE: c28, *note RLIMIT_NICE: c29, +*note RLIMIT_RTPRIO: c2a, *note RLIMIT_RTTIME: c2b, and *note +RLIMIT_SIGPENDING: c2c. (Contributed by Christian Heimes in +bpo-19324(2).) + +On FreeBSD version 9 and later, there some new FreeBSD specific +constants: *note RLIMIT_SBSIZE: c2d, *note RLIMIT_SWAP: c2e, and *note +RLIMIT_NPTS: c2f. (Contributed by Claudiu Popa in bpo-19343(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16595 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19324 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19343 + + +File: python.info, Node: select, Next: shelve<2>, Prev: resource, Up: Improved Modules<8> + +1.8.4.40 select +............... + +*note epoll: c31. objects now support the context management protocol. +When used in a *note with: 19e. statement, the *note close(): c32. +method will be called automatically at the end of the block. +(Contributed by Serhiy Storchaka in bpo-16488(1).) + +*note devpoll: c33. objects now have *note fileno(): c34. and *note +close(): c35. methods, as well as a new attribute *note closed: c36. +(Contributed by Victor Stinner in bpo-18794(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16488 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18794 + + +File: python.info, Node: shelve<2>, Next: shutil<4>, Prev: select, Up: Improved Modules<8> + +1.8.4.41 shelve +............... + +*note Shelf: c38. instances may now be used in *note with: 19e. +statements, and will be automatically closed at the end of the ‘with’ +block. (Contributed by Filip Gruszczyński in bpo-13896(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13896 + + +File: python.info, Node: shutil<4>, Next: smtpd<2>, Prev: shelve<2>, Up: Improved Modules<8> + +1.8.4.42 shutil +............... + +*note copyfile(): 6a9. now raises a specific *note Error: c3a. subclass, +*note SameFileError: c3b, 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1492704 + + +File: python.info, Node: smtpd<2>, Next: smtplib<3>, Prev: shutil<4>, Up: Improved Modules<8> + +1.8.4.43 smtpd +.............. + +The *note SMTPServer: 9bc. and *note SMTPChannel: 9bb. classes now +accept a `map' keyword argument which, if specified, is passed in to +*note asynchat.async_chat: c3d. as its `map' argument. This allows an +application to avoid affecting the global socket map. (Contributed by +Vinay Sajip in bpo-11959(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11959 + + +File: python.info, Node: smtplib<3>, Next: socket<9>, Prev: smtpd<2>, Up: Improved Modules<8> + +1.8.4.44 smtplib +................ + +*note SMTPException: c3f. is now a subclass of *note OSError: 413, 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2118 + + +File: python.info, Node: socket<9>, Next: sqlite3<6>, Prev: smtplib<3>, Up: Improved Modules<8> + +1.8.4.45 socket +............... + +The socket module now supports the *note CAN_BCM: c41. protocol on +platforms that support it. (Contributed by Brian Thorne in +bpo-15359(1).) + +Socket objects have new methods to get or set their *note inheritable +flag: b8a, *note get_inheritable(): b8f. and *note set_inheritable(): +b90. + +The ‘socket.AF_*’ and ‘socket.SOCK_*’ constants are now enumeration +values using the new *note enum: 76. module. This allows meaningful +names to be printed during debugging, instead of integer “magic +numbers”. + +The *note AF_LINK: c42. constant is now available on BSD and OSX. + +*note inet_pton(): 5b4. and *note inet_ntop(): c43. are now supported on +Windows. (Contributed by Atsuo Ishimoto in bpo-7171(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15359 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=7171 + + +File: python.info, Node: sqlite3<6>, Next: ssl<8>, Prev: socket<9>, Up: Improved Modules<8> + +1.8.4.46 sqlite3 +................ + +A new boolean parameter to the *note connect(): 7da. function, `uri', +can be used to indicate that the `database' parameter is a ‘uri’ (see +the SQLite URI documentation(1)). (Contributed by poq in bpo-13773(2).) + + ---------- Footnotes ---------- + + (1) https://www.sqlite.org/uri.html + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13773 + + +File: python.info, Node: ssl<8>, Next: stat, Prev: sqlite3<6>, Up: Improved Modules<8> + +1.8.4.47 ssl +............ + +*note PROTOCOL_TLSv1_1: 48b. and *note PROTOCOL_TLSv1_2: 48c. (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(1).) New +function *note create_default_context(): c46. provides a standard way to +obtain an *note SSLContext: 430. whose settings are intended to be a +reasonable balance between compatibility and security. These settings +are more stringent than the defaults provided by the *note SSLContext: +430. 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 *note create_default_context(): c46. to obtain an *note +SSLContext: 430. 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(2).) + +*note SSLContext: 430. method *note load_verify_locations(): b7b. +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(3).) + +New function *note get_default_verify_paths(): c47. returns a named +tuple of the paths and environment variables that the *note +set_default_verify_paths(): c48. method uses to set OpenSSL’s default +‘cafile’ and ‘capath’. This can be an aid in debugging default +verification issues. (Contributed by Christian Heimes in bpo-18143(4).) + +*note SSLContext: 430. has a new method, *note cert_store_stats(): c49, +that reports the number of loaded ‘X.509’ certs, ‘X.509 CA’ certs, and +certificate revocation lists (‘crl’s), as well as a *note +get_ca_certs(): c4a. method that returns a list of the loaded ‘CA’ +certificates. (Contributed by Christian Heimes in bpo-18147(5).) + +If OpenSSL 0.9.8 or later is available, *note SSLContext: 430. has a new +attribute *note verify_flags: c4b. that can be used to control the +certificate verification process by setting it to some combination of +the new constants *note VERIFY_DEFAULT: c4c, *note +VERIFY_CRL_CHECK_LEAF: c4d, *note VERIFY_CRL_CHECK_CHAIN: c4e, or *note +VERIFY_X509_STRICT: c4f. OpenSSL does not do any CRL verification by +default. (Contributed by Christien Heimes in bpo-8813(6).) + +New *note SSLContext: 430. method *note load_default_certs(): c50. 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 (‘purpose=’*note +SERVER_AUTH: c51.) for a client to use to verify a server, and +certificates for a server to use in verifying client certificates +(‘purpose=’*note CLIENT_AUTH: c52.). (Contributed by Christian Heimes +in bpo-19292(7).) Two new windows-only functions, *note +enum_certificates(): c53. and *note enum_crls(): c54. provide the +ability to retrieve certificates, certificate information, and CRLs from +the Windows cert store. (Contributed by Christian Heimes in +bpo-17134(8).) Support for server-side SNI (Server Name Indication) +using the new *note ssl.SSLContext.set_servername_callback(): c55. +method. (Contributed by Daniel Black in bpo-8109(9).) + +The dictionary returned by *note SSLSocket.getpeercert(): c56. contains +additional ‘X509v3’ extension items: ‘crlDistributionPoints’, +‘calIssuers’, and ‘OCSP’ URIs. (Contributed by Christian Heimes in +bpo-18379(10).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16692 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19689 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18138 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18143 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=18147 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=8813 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=19292 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=17134 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=8109 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=18379 + + +File: python.info, Node: stat, Next: struct<2>, Prev: ssl<8>, Up: Improved Modules<8> + +1.8.4.48 stat +............. + +The *note stat: f1. module is now backed by a C implementation in +‘_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(1).) + +The module supports new *note ST_MODE: c58. flags, *note S_IFDOOR: c59, +*note S_IFPORT: c5a, and *note S_IFWHT: c5b. (Contributed by Christian +Hiemes in bpo-11016(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11016 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=11016 + + +File: python.info, Node: struct<2>, Next: subprocess<4>, Prev: stat, Up: Improved Modules<8> + +1.8.4.49 struct +............... + +New function *note iter_unpack: c5d. and a new *note +struct.Struct.iter_unpack(): c5e. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17804 + + +File: python.info, Node: subprocess<4>, Next: sunau<2>, Prev: struct<2>, Up: Improved Modules<8> + +1.8.4.50 subprocess +................... + +*note check_output(): c60. now accepts an `input' argument that can be +used to provide the contents of ‘stdin’ for the command that is run. +(Contributed by Zack Weinberg in bpo-16624(1).) + +‘getstatus()’ and *note getstatusoutput(): c61. now work on Windows. +This change was actually inadvertently made in 3.3.4. (Contributed by +Tim Golden in bpo-10197(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16624 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10197 + + +File: python.info, Node: sunau<2>, Next: sys<9>, Prev: subprocess<4>, Up: Improved Modules<8> + +1.8.4.51 sunau +.............. + +The ‘getparams()’ method now returns a namedtuple rather than a plain +tuple. (Contributed by Claudiu Popa in bpo-18901(1).) + +*note sunau.open(): 856. now supports the context management protocol: +when used in a *note with: 19e. block, the ‘close’ method of the +returned object will be called automatically at the end of the block. +(Contributed by Serhiy Storchaka in bpo-18878(2).) + +*note AU_write.setsampwidth(): c63. now supports 24 bit samples, thus +adding support for writing 24 sample using the module. (Contributed by +Serhiy Storchaka in bpo-19261(3).) + +The *note writeframesraw(): c64. and *note writeframes(): c65. methods +now accept any *note bytes-like object: 9a2. (Contributed by Serhiy +Storchaka in bpo-8311(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18901 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18878 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19261 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8311 + + +File: python.info, Node: sys<9>, Next: tarfile<3>, Prev: sunau<2>, Up: Improved Modules<8> + +1.8.4.52 sys +............ + +New function *note sys.getallocatedblocks(): c67. returns the current +number of blocks allocated by the interpreter. (In CPython with the +default ‘--with-pymalloc’ setting, this is allocations made through the +*note PyObject_Malloc(): 8d9. API.) This can be useful for tracking +memory leaks, especially if automated via a test suite. (Contributed by +Antoine Pitrou in bpo-13390(1).) + +When the Python interpreter starts in *note interactive mode: c68, it +checks for an *note __interactivehook__: c69. attribute on the *note +sys: f9. module. If the attribute exists, its value is called with no +arguments just before interactive mode is started. The check is made +after the *note PYTHONSTARTUP: c6a. file is read, so it can be set +there. The *note site: e8. module *note sets it: c6b. to a function +that enables tab completion and history saving (in ‘~/.python-history’) +if the platform supports *note readline: db. If you do not want this +(new) behavior, you can override it in *note PYTHONSTARTUP: c6a, +‘sitecustomize’, or ‘usercustomize’ by deleting this attribute from +*note sys: f9. (or setting it to some other callable). (Contributed by +Éric Araujo and Antoine Pitrou in bpo-5845(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13390 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5845 + + +File: python.info, Node: tarfile<3>, Next: textwrap, Prev: sys<9>, Up: Improved Modules<8> + +1.8.4.53 tarfile +................ + +The *note tarfile: fd. module now supports a simple *note Command-Line +Interface: c6d. when called as a script directly or via ‘-m’. This can +be used to create and extract tarfile archives. (Contributed by Berker +Peksag in bpo-13477(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13477 + + +File: python.info, Node: textwrap, Next: threading<6>, Prev: tarfile<3>, Up: Improved Modules<8> + +1.8.4.54 textwrap +................. + +The *note TextWrapper: c6f. class has two new attributes/constructor +arguments: *note max_lines: c70, which limits the number of lines in the +output, and *note placeholder: c71, 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 +*note shorten(): c72. 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, ‘[...]’). (Contributed by Antoine +Pitrou and Serhiy Storchaka in bpo-18585(1) and bpo-18725(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18585 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18725 + + +File: python.info, Node: threading<6>, Next: traceback<5>, Prev: textwrap, Up: Improved Modules<8> + +1.8.4.55 threading +.................. + +The *note Thread: 59b. object representing the main thread can be +obtained from the new *note main_thread(): c74. function. In normal +conditions this will be the thread from which the Python interpreter was +started. (Contributed by Andrew Svetlov in bpo-18882(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18882 + + +File: python.info, Node: traceback<5>, Next: types<4>, Prev: threading<6>, Up: Improved Modules<8> + +1.8.4.56 traceback +.................. + +A new *note traceback.clear_frames(): c76. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1565525 + + +File: python.info, Node: types<4>, Next: urllib<2>, Prev: traceback<5>, Up: Improved Modules<8> + +1.8.4.57 types +.............. + +A new *note DynamicClassAttribute(): 206. 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' ‘__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 ‘Enum’ for an example). (Contributed by Ethan Furman in +bpo-19030(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19030 + + +File: python.info, Node: urllib<2>, Next: unittest<6>, Prev: types<4>, Up: Improved Modules<8> + +1.8.4.58 urllib +............... + +*note urllib.request: 12a. now supports ‘data:’ URLs via the *note +DataHandler: c79. class. (Contributed by Mathias Panzenböck in +bpo-16423(1).) + +The http method that will be used by a *note Request: c7a. class can now +be specified by setting a *note method: c7b. class attribute on the +subclass. (Contributed by Jason R Coombs in bpo-18978(2).) + +*note Request: c7a. objects are now reusable: if the *note full_url: +c7c. or *note data: c7d. attributes are modified, all relevant internal +properties are updated. This means, for example, that it is now +possible to use the same *note Request: c7a. object in more than one +*note OpenerDirector.open(): c7e. call with different `data' arguments, +or to modify a *note Request: c7a.‘s ‘url’ rather than recomputing it +from scratch. There is also a new *note remove_header(): c7f. method +that can be used to remove headers from a *note Request: c7a. +(Contributed by Alexey Kachayev in bpo-16464(3), Daniel Wozniak in +bpo-17485(4), and Damien Brecht and Senthil Kumaran in bpo-17272(5).) + +*note HTTPError: c80. objects now have a *note headers: c81. attribute +that provides access to the HTTP response headers associated with the +error. (Contributed by Berker Peksag in bpo-15701(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16423 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18978 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16464 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17485 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=17272 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=15701 + + +File: python.info, Node: unittest<6>, Next: venv<6>, Prev: urllib<2>, Up: Improved Modules<8> + +1.8.4.59 unittest +................. + +The *note TestCase: 282. class has a new method, *note subTest(): c83, +that produces a context manager whose *note with: 19e. block becomes a +“sub-test”. This context manager allows a test method to dynamically +generate subtests by, say, calling the ‘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: + + class NumbersTest(unittest.TestCase): + def test_even(self): + for i in range(6): + with self.subTest(i=i): + self.assertEqual(i % 2, 0) + +will result in six subtests, each identified in the unittest verbose +output with a label consisting of the variable name ‘i’ and a particular +value for that variable (‘i=0’, ‘i=1’, etc). See *note Distinguishing +test iterations using subtests: c84. for the full version of this +example. (Contributed by Antoine Pitrou in bpo-16997(1).) + +*note unittest.main(): c85. 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(2).) + +If *note SkipTest: c86. 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(3).) + +*note discover(): c87. now sorts the discovered files to provide +consistent test ordering. (Contributed by Martin Melin and Jeff Ramnani +in bpo-16709(4).) + +*note TestSuite: a75. 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 *note TestSuite: a75. subclass that +defines a custom ‘_removeTestAtIndex’ method. (Contributed by Tom +Wardill, Matt McClure, and Andrew Svetlov in bpo-11798(5).) + +A new test assertion context-manager, *note assertLogs(): 450, will +ensure that a given block of code emits a log message using the *note +logging: a8. module. By default the message can come from any logger +and have a priority of ‘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 *note LogRecord: c88.s +and/or formatted messages that were logged. (Contributed by Antoine +Pitrou in bpo-18937(6).) + +Test discovery now works with namespace packages (Contributed by Claudiu +Popa in bpo-17457(7).) + +*note unittest.mock: 126. 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(8).) + +‘mock_open()’ objects now have ‘readline’ and ‘readlines’ methods. +(Contributed by Toshio Kuratomi in bpo-17467(9).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16997 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=15132 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16935 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=16709 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=11798 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=18937 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=17457 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=17015 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=17467 + + +File: python.info, Node: venv<6>, Next: wave<2>, Prev: unittest<6>, Up: Improved Modules<8> + +1.8.4.60 venv +............. + +*note venv: 12f. now includes activation scripts for the ‘csh’ and +‘fish’ shells. (Contributed by Andrew Svetlov in bpo-15417(1).) + +*note EnvBuilder: c8a. and the *note create(): c8b. convenience function +take a new keyword argument `with_pip', which defaults to ‘False’, that +controls whether or not *note EnvBuilder: c8a. ensures that ‘pip’ is +installed in the virtual environment. (Contributed by Nick Coghlan in +bpo-19552(2) as part of the PEP 453(3) implementation.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15417 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19552 + + (3) https://peps.python.org/pep-0453/ + + +File: python.info, Node: wave<2>, Next: weakref<2>, Prev: venv<6>, Up: Improved Modules<8> + +1.8.4.61 wave +............. + +The ‘getparams()’ method now returns a namedtuple rather than a plain +tuple. (Contributed by Claudiu Popa in bpo-17487(1).) + +*note wave.open(): 59a. now supports the context management protocol. +(Contributed by Claudiu Popa in bpo-17616(2).) + +*note wave: 131. can now *note write output to unseekable files: c8d. +(Contributed by David Jones, Guilherme Polo, and Serhiy Storchaka in +bpo-5202(3).) + +The *note writeframesraw(): c8e. and *note writeframes(): c8f. methods +now accept any *note bytes-like object: 9a2. (Contributed by Serhiy +Storchaka in bpo-8311(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17487 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17616 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=5202 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8311 + + +File: python.info, Node: weakref<2>, Next: xml etree<2>, Prev: wave<2>, Up: Improved Modules<8> + +1.8.4.62 weakref +................ + +New *note WeakMethod: c91. class simulates weak references to bound +methods. (Contributed by Antoine Pitrou in bpo-14631(1).) + +New *note finalize: 6ce. 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(2).) + +The callback, if any, associated with a *note ref: c92. is now exposed +via the *note __callback__: c93. attribute. (Contributed by Mark +Dickinson in bpo-17643(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14631 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=15528 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=17643 + + +File: python.info, Node: xml etree<2>, Next: zipfile<5>, Prev: weakref<2>, Up: Improved Modules<8> + +1.8.4.63 xml.etree +.................. + +A new parser, *note XMLPullParser: c95, allows a non-blocking +applications to parse XML documents. An example can be seen at *note +Pull API for non-blocking parsing: c96. (Contributed by Antoine Pitrou +in bpo-17741(1).) + +The *note xml.etree.ElementTree: 142. *note tostring(): c97. and *note +tostringlist(): c98. functions, and the *note ElementTree: 59d. *note +write(): c99. method, now have a `short_empty_elements' *note +keyword-only parameter: 6dc. providing control over whether elements +with no content are written in abbreviated (‘’) or expanded +(‘’) form. (Contributed by Ariel Poliak and Serhiy Storchaka +in bpo-14377(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17741 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=14377 + + +File: python.info, Node: zipfile<5>, Prev: xml etree<2>, Up: Improved Modules<8> + +1.8.4.64 zipfile +................ + +The *note writepy(): c9b. method of the *note PyZipFile: c9c. 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(1).) + +The `allowZip64' parameter to *note ZipFile: 28c. and ‘PyZipfile’ is now +‘True’ by default. (Contributed by William Mallard in bpo-17201(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19274 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17201 + + +File: python.info, Node: CPython Implementation Changes, Next: Deprecated<9>, Prev: Improved Modules<8>, Up: What’s New In Python 3 4 + +1.8.5 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:: + + +File: python.info, Node: PEP 445 Customization of CPython Memory Allocators, Next: PEP 442 Safe Object Finalization, Up: CPython Implementation Changes + +1.8.5.1 PEP 445: Customization of CPython Memory Allocators +........................................................... + +PEP 445(1) adds new C level interfaces to customize memory allocation in +the CPython interpreter. + +See also +........ + +PEP 445(2) – Add new APIs to customize Python memory allocators + + PEP written and implemented by Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0445/ + + (2) https://peps.python.org/pep-0445/ + + +File: python.info, Node: PEP 442 Safe Object Finalization, Next: PEP 456 Secure and Interchangeable Hash Algorithm, Prev: PEP 445 Customization of CPython Memory Allocators, Up: CPython Implementation Changes + +1.8.5.2 PEP 442: Safe Object Finalization +......................................... + +PEP 442(1) removes the current limitations and quirks of object +finalization in CPython. With it, objects with ‘__del__()’ methods, as +well as generators with *note finally: 60a. 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 +*note None: 243. 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 ‘__del__’ methods, that have plagued Python since the cyclic +GC was first introduced. + +See also +........ + +PEP 442(2) – Safe object finalization + + PEP written and implemented by Antoine Pitrou. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0442/ + + (2) https://peps.python.org/pep-0442/ + + +File: python.info, Node: PEP 456 Secure and Interchangeable Hash Algorithm, Next: PEP 436 Argument Clinic, Prev: PEP 442 Safe Object Finalization, Up: CPython Implementation Changes + +1.8.5.3 PEP 456: Secure and Interchangeable Hash Algorithm +.......................................................... + +PEP 456(1) 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(2) 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 *note sys.hash_info: ca1. named +tuple to describe the hash algorithm in use by the currently executing +binary. Otherwise, the PEP does not alter any existing CPython APIs. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0456/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=14621 + + +File: python.info, Node: PEP 436 Argument Clinic, Next: Other Build and C API Changes, Prev: PEP 456 Secure and Interchangeable Hash Algorithm, Up: CPython Implementation Changes + +1.8.5.4 PEP 436: Argument Clinic +................................ + +“Argument Clinic” ( PEP 436(1)) 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 *note pydoc: d6. and *note inspect: +9e. 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. + + 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. + +See also +........ + +PEP 436(2) – The Argument Clinic DSL + + PEP written and implemented by Larry Hastings. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0436/ + + (2) https://peps.python.org/pep-0436/ + + +File: python.info, Node: Other Build and C API Changes, Next: Other Improvements<2>, Prev: PEP 436 Argument Clinic, Up: CPython Implementation Changes + +1.8.5.5 Other Build and C API Changes +..................................... + + * The new *note PyType_GetSlot(): 4c9. 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(1).) + + * The new *note Py_SetStandardStreamEncoding(): 36f. + 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(2).) + + * Most Python C APIs that don’t mutate string arguments are now + correctly marked as accepting ‘const char *’ rather than ‘char *’. + (Contributed by Serhiy Storchaka in bpo-1772673(3).) + + * A new shell version of ‘python-config’ can be used even when a + python interpreter is not available (for example, in cross + compilation scenarios). + + * *note PyUnicode_FromFormat(): 4f2. now supports width and precision + specifications for ‘%s’, ‘%A’, ‘%U’, ‘%V’, ‘%S’, and ‘%R’. + (Contributed by Ysj Ray and Victor Stinner in bpo-7330(4).) + + * New function *note PyStructSequence_InitType2(): ca4. supplements + the existing *note PyStructSequence_InitType(): ca5. function. The + difference is that it returns ‘0’ on success and ‘-1’ on failure. + + * 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(5).) + + * The Windows build now uses Address Space Layout Randomization(6) + and Data Execution Prevention(7). (Contributed by Christian Heimes + in bpo-16632(8).) + + * New function *note PyObject_LengthHint(): ca6. is the C API + equivalent of *note operator.length_hint(): c0b. (Contributed by + Armin Ronacher in bpo-16148(9).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17162 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16129 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1772673 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=7330 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=18596 + + (6) https://en.wikipedia.org/wiki/Address_space_layout_randomization + + (7) https://en.wikipedia.org/wiki/Data_Execution_Prevention + + (8) https://bugs.python.org/issue?@action=redirect&bpo=16632 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=16148 + + +File: python.info, Node: Other Improvements<2>, Next: Significant Optimizations, Prev: Other Build and C API Changes, Up: CPython Implementation Changes + +1.8.5.6 Other Improvements +.......................... + + * The *note python: ca9. command has a new *note option: caa, ‘-I’, + which causes it to run in “isolated mode”, which means that *note + sys.path: 162. contains neither the script’s directory nor the + user’s ‘site-packages’ directory, and all ‘PYTHON*’ environment + variables are ignored (it implies both ‘-s’ and ‘-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 ‘#!’ line of system scripts. (Contributed by Christian Heimes + in bpo-16499(1).) + + * Tab-completion is now enabled by default in the interactive + interpreter on systems that support *note readline: db. History is + also enabled by default, and is written to (and read from) the file + ‘~/.python-history’. (Contributed by Antoine Pitrou and Éric + Araujo in bpo-5845(2).) + + * Invoking the Python interpreter with ‘--version’ now outputs the + version to standard output instead of standard error + (bpo-18338(3)). Similar changes were made to *note argparse: 5. + (bpo-18920(4)) and other modules that have script-like invocation + capabilities (bpo-18922(5)). + + * The CPython Windows installer now adds ‘.py’ to the ‘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 ‘.py’ extension. (Contributed by Paul Moore in + bpo-18569(6).) + + * A new ‘make’ target coverage-report(7) will build python, run the + test suite, and generate an HTML coverage report for the C codebase + using ‘gcov’ and lcov(8). + + * The ‘-R’ option to the *note python regression test suite: cab. now + also checks for memory allocation leaks, using *note + sys.getallocatedblocks(): c67. (Contributed by Antoine Pitrou in + bpo-13390(9).) + + * ‘python -m’ now works with namespace packages. + + * The *note stat: f1. 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. + + * Loading multiple python modules from a single OS module (‘.so’, + ‘.dll’) now works correctly (previously it silently returned the + first python module in the file). (Contributed by Václav Šmilauer + in bpo-16421(10).) + + * A new opcode, *note LOAD_CLASSDEREF: cac, has been added to fix a + bug in the loading of free variables in class bodies that could be + triggered by certain uses of *note __prepare__: 8cf. (Contributed + by Benjamin Peterson in bpo-17853(11).) + + * A number of MemoryError-related crashes were identified and fixed + by Victor Stinner using his PEP 445(12)-based ‘pyfailmalloc’ tool + (bpo-18408(13), bpo-18520(14)). + + * The ‘pyvenv’ command now accepts a ‘--copies’ option to use copies + rather than symlinks even on systems where symlinks are the + default. (Contributed by Vinay Sajip in bpo-18807(15).) + + * The ‘pyvenv’ command also accepts a ‘--without-pip’ option to + suppress the otherwise-automatic bootstrapping of pip into the + virtual environment. (Contributed by Nick Coghlan in bpo-19552(16) + as part of the PEP 453(17) implementation.) + + * The encoding name is now optional in the value set for the *note + PYTHONIOENCODING: cad. environment variable. This makes it + possible to set just the error handler, without changing the + default encoding. (Contributed by Serhiy Storchaka in + bpo-18818(18).) + + * The *note bz2: 12, *note lzma: ab, and *note gzip: 87. module + ‘open’ functions now support ‘x’ (exclusive creation) mode. + (Contributed by Tim Heaney and Vajrasky Kok in bpo-19201(19), + bpo-19222(20), and bpo-19223(21).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16499 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5845 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18338 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18920 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=18922 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=18569 + + (7) +https://devguide.python.org/coverage/#measuring-coverage-of-c-code-with-gcov-and-lcov + + (8) https://ltp.sourceforge.net/coverage/lcov.php + + (9) https://bugs.python.org/issue?@action=redirect&bpo=13390 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=16421 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=17853 + + (12) https://peps.python.org/pep-0445/ + + (13) https://bugs.python.org/issue?@action=redirect&bpo=18408 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=18520 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=18807 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=19552 + + (17) https://peps.python.org/pep-0453/ + + (18) https://bugs.python.org/issue?@action=redirect&bpo=18818 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=19201 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=19222 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=19223 + + +File: python.info, Node: Significant Optimizations, Prev: Other Improvements<2>, Up: CPython Implementation Changes + +1.8.5.7 Significant Optimizations +................................. + + * The UTF-32 decoder is now 3x to 4x faster. (Contributed by Serhiy + Storchaka in bpo-14625(1).) + + * 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(2).) + + * The interpreter starts about 30% faster. A couple of measures lead + to the speedup. The interpreter loads fewer modules on startup, + e.g. the *note re: da, *note collections: 1c. and *note locale: + a7. 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(3), bpo-19218(4), + bpo-19209(5), bpo-19205(6) and bpo-9548(7).) + + * *note bz2.BZ2File: 5a5. is now as fast or faster than the Python2 + version for most cases. *note lzma.LZMAFile: caf. has also been + optimized. (Contributed by Serhiy Storchaka and Nadeem Vawda in + bpo-16034(8).) + + * *note random.getrandbits(): cb0. is 20%-40% faster for small + integers (the most common use case). (Contributed by Serhiy + Storchaka in bpo-16674(9).) + + * 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(10).) + + * A performance issue in ‘io.FileIO.readall()’ has been solved. This + particularly affects Windows, and significantly speeds up the case + of piping significant amounts of data through *note subprocess: f6. + (Contributed by Richard Oudkerk in bpo-15758(11).) + + * *note html.escape(): cb1. is now 10x faster. (Contributed by Matt + Bryant in bpo-18020(12).) + + * On Windows, the native ‘VirtualAlloc’ is now used instead of the + CRT ‘malloc’ in ‘obmalloc’. Artificial benchmarks show about a 3% + memory savings. + + * *note os.urandom(): 237. 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(13).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14625 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18771 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19219 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19218 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=19209 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=19205 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=9548 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=16034 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=16674 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=15596 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=15758 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=18020 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=18756 + + +File: python.info, Node: Deprecated<9>, Next: Removed<9>, Prev: CPython Implementation Changes, Up: What’s New In Python 3 4 + +1.8.6 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 +*note DeprecationWarning: 2d4. when the interpreter is run with +deprecation warnings enabled (for example, by using ‘-Wd’). + +* Menu: + +* Deprecations in the Python API:: +* Deprecated Features:: + + +File: python.info, Node: Deprecations in the Python API, Next: Deprecated Features, Up: Deprecated<9> + +1.8.6.1 Deprecations in the Python API +...................................... + + * As mentioned in *note PEP 451; A ModuleSpec Type for the Import + System: b69, a number of *note importlib: 97. methods and functions + are deprecated: *note importlib.find_loader(): 2ea. is replaced by + *note importlib.util.find_spec(): cb4.; *note + importlib.machinery.PathFinder.find_module(): 2f1. is replaced by + *note importlib.machinery.PathFinder.find_spec(): cb5.; *note + importlib.abc.MetaPathFinder.find_module(): 2ed. is replaced by + *note importlib.abc.MetaPathFinder.find_spec(): 46f.; *note + importlib.abc.PathEntryFinder.find_loader(): 2ee. and *note + find_module(): 2ef. are replaced by *note + importlib.abc.PathEntryFinder.find_spec(): 470.; all of the + ‘xxxLoader’ ABC ‘load_module’ methods (*note + importlib.abc.Loader.load_module(): 46b, *note + importlib.abc.InspectLoader.load_module(): cb6, *note + importlib.abc.FileLoader.load_module(): cb7, *note + importlib.abc.SourceLoader.load_module(): cb8.) should no longer be + implemented, instead loaders should implement an ‘exec_module’ + method (*note importlib.abc.Loader.exec_module(): 46c, *note + importlib.abc.InspectLoader.exec_module(): cb9. *note + importlib.abc.SourceLoader.exec_module(): cba.) and let the import + system take care of the rest; and *note + importlib.abc.Loader.module_repr(): 2ec, *note + importlib.util.module_for_loader(): 2eb, *note + importlib.util.set_loader(): cbb, and *note + importlib.util.set_package(): cbc. are no longer needed because + their functions are now handled automatically by the import system. + + * The *note imp: 96. module is pending deprecation. To keep + compatibility with Python 2/3 code bases, the module’s removal is + currently not scheduled. + + * The ‘formatter’ module is pending deprecation and is slated for + removal in Python 3.6. + + * ‘MD5’ as the default `digestmod' for the *note hmac.new(): 6f9. + function is deprecated. Python 3.6 will require an explicit digest + name or constructor as `digestmod' argument. + + * The internal ‘Netrc’ class in the *note ftplib: 7e. module has been + documented as deprecated in its docstring for quite some time. It + now emits a *note DeprecationWarning: 2d4. and will be removed + completely in Python 3.5. + + * The undocumented `endtime' argument to *note + subprocess.Popen.wait(): 952. should not have been exposed and is + hopefully not in use; it is deprecated and will mostly likely be + removed in Python 3.5. + + * The `strict' argument of *note HTMLParser: 499. is deprecated. + + * The *note plistlib: cc. ‘readPlist()’, ‘writePlist()’, + ‘readPlistFromBytes()’, and ‘writePlistToBytes()’ functions are + deprecated in favor of the corresponding new functions *note + load(): 59f, *note dump(): 5a1, *note loads(): 5a0, and *note + dumps(): 5a2. ‘Data()’ is deprecated in favor of just using the + *note bytes: 1b4. constructor. + + * The *note sysconfig: fa. key ‘SO’ is deprecated, it has been + replaced by ‘EXT_SUFFIX’. + + * The ‘U’ mode accepted by various ‘open’ functions is deprecated. + In Python3 it does not do anything useful, and should be replaced + by appropriate uses of *note io.TextIOWrapper: 9ad. (if needed) and + its `newline' argument. + + * The `parser' argument of *note xml.etree.ElementTree.iterparse(): + cbd. has been deprecated, as has the `html' argument of *note + XMLParser(): 6a3. To prepare for the removal of the latter, all + arguments to ‘XMLParser’ should be passed by keyword. + + +File: python.info, Node: Deprecated Features, Prev: Deprecations in the Python API, Up: Deprecated<9> + +1.8.6.2 Deprecated Features +........................... + + * Running *note IDLE: cbf. with the ‘-n’ flag (no subprocess) is + deprecated. However, the feature will not be removed until + bpo-18823(1) is resolved. + + * The site module adding a “site-python” directory to sys.path, if it + exists, is deprecated (bpo-19375(2)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18823 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19375 + + +File: python.info, Node: Removed<9>, Next: Porting to Python 3 4, Prev: Deprecated<9>, Up: What’s New In Python 3 4 + +1.8.7 Removed +------------- + +* Menu: + +* Operating Systems No Longer Supported:: +* API and Feature Removals: API and Feature Removals<5>. +* Code Cleanups:: + + +File: python.info, Node: Operating Systems No Longer Supported, Next: API and Feature Removals<5>, Up: Removed<9> + +1.8.7.1 Operating Systems No Longer Supported +............................................. + +Support for the following operating systems has been removed from the +source and build tools: + + * OS/2 (bpo-16135(1)). + + * Windows 2000 (changeset e52df05b496a). + + * Windows systems where ‘COMSPEC’ points to ‘command.com’ + (bpo-14470(2)). + + * VMS (bpo-16136(3)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16135 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=14470 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=16136 + + +File: python.info, Node: API and Feature Removals<5>, Next: Code Cleanups, Prev: Operating Systems No Longer Supported, Up: Removed<9> + +1.8.7.2 API and Feature Removals +................................ + +The following obsolete and previously deprecated APIs and features have +been removed: + + * The unmaintained ‘Misc/TextMate’ and ‘Misc/vim’ directories have + been removed (see the devguide(1) for suggestions on what to use + instead). + + * The ‘SO’ makefile macro is removed (it was replaced by the + ‘SHLIB_SUFFIX’ and ‘EXT_SUFFIX’ macros) (bpo-16754(2)). + + * The ‘PyThreadState.tick_counter’ field has been removed; its value + has been meaningless since Python 3.2, when the “new GIL” was + introduced (bpo-19199(3)). + + * ‘PyLoader’ and ‘PyPycLoader’ have been removed from *note + importlib: 97. (Contributed by Taras Lyapun in bpo-15641(4).) + + * The `strict' argument to *note HTTPConnection: 796. and *note + HTTPSConnection: 797. has been removed. HTTP 0.9-style “Simple + Responses” are no longer supported. + + * The deprecated *note urllib.request.Request: c7a. getter and setter + methods ‘add_data’, ‘has_data’, ‘get_data’, ‘get_type’, ‘get_host’, + ‘get_selector’, ‘set_proxy’, ‘get_origin_req_host’, and + ‘is_unverifiable’ have been removed (use direct attribute access + instead). + + * Support for loading the deprecated ‘TYPE_INT64’ has been removed + from *note marshal: ae. (Contributed by Dan Riti in bpo-15480(5).) + + * *note inspect.Signature: 303.: positional-only parameters are now + required to have a valid name. + + * *note object.__format__(): 1f6. no longer accepts non-empty format + strings, it now raises a *note TypeError: 19c. 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 *note + TypeError: 19c. if you are using an ‘'s'’ format code with objects + that do not have a __format__ method that handles it. See + bpo-7994(6) for background. + + * ‘difflib.SequenceMatcher.isbjunk()’ and + ‘difflib.SequenceMatcher.isbpopular()’ were deprecated in 3.2, and + have now been removed: use ‘x in sm.bjunk’ and ‘x in sm.bpopular’, + where `sm' is a *note SequenceMatcher: cc3. object (bpo-13248(7)). + + ---------- Footnotes ---------- + + (1) https://devguide.python.org + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16754 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19199 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=15641 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=15480 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=7994 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=13248 + + +File: python.info, Node: Code Cleanups, Prev: API and Feature Removals<5>, Up: Removed<9> + +1.8.7.3 Code Cleanups +..................... + + * The unused and undocumented internal ‘Scanner’ class has been + removed from the *note pydoc: d6. module. + + * The private and effectively unused ‘_gestalt’ module has been + removed, along with the private *note platform: cb. functions + ‘_mac_ver_lookup’, ‘_mac_ver_gstalt’, and ‘_bcd2str’, which would + only have ever been called on badly broken OSX systems (see + bpo-18393(1)). + + * The hardcoded copies of certain *note stat: f1. constants that were + included in the *note tarfile: fd. module namespace have been + removed. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18393 + + +File: python.info, Node: Porting to Python 3 4, Next: Changed in 3 4 3, Prev: Removed<9>, Up: What’s New In Python 3 4 + +1.8.8 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<7>. +* Changes in the C API: Changes in the C API<7>. + + +File: python.info, Node: Changes in ‘python’ Command Behavior<2>, Next: Changes in the Python API<7>, Up: Porting to Python 3 4 + +1.8.8.1 Changes in ‘python’ Command Behavior +............................................ + + * In a posix shell, setting the ‘PATH’ environment variable to an + empty value is equivalent to not setting it at all. However, + setting *note PYTHONPATH: cc7. to an empty value was `not' + equivalent to not setting it at all: setting *note PYTHONPATH: cc7. + to an empty value was equivalent to setting it to ‘.’, which leads + to confusion when reasoning by analogy to how ‘PATH’ works. The + behavior now conforms to the posix convention for ‘PATH’. + + * The [X refs, Y blocks] output of a debug (‘--with-pydebug’) build + of the CPython interpreter is now off by default. It can be + re-enabled using the ‘-X showrefcount’ option. (Contributed by + Ezio Melotti in bpo-17323(1).) + + * The python command and most stdlib scripts (as well as *note + argparse: 5.) now output ‘--version’ information to ‘stdout’ + instead of ‘stderr’ (for issue list see *note Other Improvements: + ca8. above). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17323 + + +File: python.info, Node: Changes in the Python API<7>, Next: Changes in the C API<7>, Prev: Changes in ‘python’ Command Behavior<2>, Up: Porting to Python 3 4 + +1.8.8.2 Changes in the Python API +................................. + + * The ABCs defined in *note importlib.abc: 98. now either raise the + appropriate exception or return a default value instead of raising + *note NotImplementedError: 9c7. blindly. This will only affect + code calling *note super(): 8b7. and falling through all the way to + the ABCs. For compatibility, catch both *note NotImplementedError: + 9c7. or the appropriate exception as needed. + + * The module type now initializes the *note __package__: cc9. and + *note __loader__: cca. attributes to ‘None’ by default. To + determine if these attributes were set in a backwards-compatible + fashion, use e.g. ‘getattr(module, '__loader__', None) is not + None’. (bpo-17115(1).) + + * *note importlib.util.module_for_loader(): 2eb. now sets + ‘__loader__’ and ‘__package__’ unconditionally to properly support + reloading. If this is not desired then you will need to set these + attributes manually. You can use ‘importlib.util.module_to_load()’ + for module management. + + * Import now resets relevant attributes (e.g. ‘__name__’, + ‘__loader__’, ‘__package__’, ‘__file__’, ‘__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(2)). + + * Frozen packages no longer set ‘__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 ‘hasattr(module, '__path__')’ + (bpo-18065(3)). + + * Frozen modules no longer define a ‘__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 ‘__spec__.location’ is set to ‘'frozen'’, check if the + loader is a subclass of *note importlib.machinery.FrozenImporter: + ccb, or if Python 2 compatibility is necessary you can use + ‘imp.is_frozen()’. + + * *note py_compile.compile(): 671. now raises *note FileExistsError: + ccc. 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. + + * *note importlib.abc.SourceLoader.get_source(): ccd. no longer + raises *note ImportError: 511. when the source code being loaded + triggers a *note SyntaxError: 2d6. or *note UnicodeDecodeError: + 65c. As *note ImportError: 511. 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. + + * *note functools.update_wrapper(): cce. and *note functools.wraps(): + bf8. now correctly set the ‘__wrapped__’ attribute to the function + being wrapped, even if that function also had its ‘__wrapped__’ + attribute set. This means ‘__wrapped__’ attributes now correctly + link a stack of decorated functions rather than every ‘__wrapped__’ + attribute in the chain referring to the innermost function. + Introspection libraries that assumed the previous behaviour was + intentional can use *note inspect.unwrap(): bf7. to access the + first function in the chain that has no ‘__wrapped__’ attribute. + + * *note inspect.getfullargspec(): 302. has been reimplemented on top + of *note inspect.signature(): 301. 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 *note inspect.getfullargspec(): + 302. will fail on non-Python callables may need to be adjusted + accordingly. + + * *note importlib.machinery.PathFinder: ccf. now passes on the + current working directory to objects in *note sys.path_hooks: cd0. + for the empty string. This results in *note + sys.path_importer_cache: 1b2. never containing ‘''’, thus iterating + through *note sys.path_importer_cache: 1b2. based on *note + sys.path: 162. will not find all keys. A module’s ‘__file__’ when + imported in the current working directory will also now have an + absolute path, including when using ‘-m’ with the interpreter + (except for ‘__main__.__file__’ when a script has been executed + directly using a relative path) (Contributed by Brett Cannon in + bpo-18416(4)). is specified on the command-line) (bpo-18416(5)). + + * The removal of the `strict' argument to *note HTTPConnection: 796. + and *note HTTPSConnection: 797. 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. + + * Strings between ‘from __future__ import ...’ statements now + `always' raise a *note SyntaxError: 2d6. 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(6)). + + * *note ssl.SSLSocket.getpeercert(): c56. and *note + ssl.SSLSocket.do_handshake(): af6. now raise an *note OSError: 413. + with ‘ENOTCONN’ when the ‘SSLSocket’ is not connected, instead of + the previous behavior of raising an *note AttributeError: 19d. In + addition, *note getpeercert(): c56. will raise a *note ValueError: + 1c8. if the handshake has not yet been done. + + * *note base64.b32decode(): cd1. now raises a *note binascii.Error: + cd2. when the input string contains non-b32-alphabet characters, + instead of a *note TypeError: 19c. This particular *note + TypeError: 19c. was missed when the other *note TypeError: 19c.s + were converted. (Contributed by Serhiy Storchaka in bpo-18011(7).) + Note: this change was also inadvertently applied in Python 3.3.3. + + * The ‘file’ attribute is now automatically closed when the creating + ‘cgi.FieldStorage’ instance is garbage collected. If you were + pulling the file object out separately from the ‘cgi.FieldStorage’ + instance and not keeping the instance alive, then you should either + store the entire ‘cgi.FieldStorage’ instance or read the contents + of the file before the ‘cgi.FieldStorage’ instance is garbage + collected. + + * Calling ‘read’ or ‘write’ on a closed SSL socket now raises an + informative *note ValueError: 1c8. rather than the previous more + mysterious *note AttributeError: 19d. (bpo-9177(8)). + + * *note slice.indices(): cd3. no longer produces an *note + OverflowError: 4a4. for huge values. As a consequence of this fix, + *note slice.indices(): cd3. now raises a *note ValueError: 1c8. if + given a negative length; previously it returned nonsense values + (bpo-14794(9)). + + * The *note complex: 1b8. constructor, unlike the *note cmath: 17. + functions, was incorrectly accepting *note float: 3ca. values if an + object’s ‘__complex__’ special method returned one. This now + raises a *note TypeError: 19c. (bpo-16290(10).) + + * The *note int: 1c7. constructor in 3.2 and 3.3 erroneously accepts + *note float: 3ca. values for the `base' parameter. It is unlikely + anyone was doing this, but if so, it will now raise a *note + TypeError: 19c. (bpo-16772(11)). + + * 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(12)). + + * Stale thread states are now cleared after *note fork(): cd4. 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(13).) + + * Parameter names in ‘__annotations__’ dicts are now mangled + properly, similarly to ‘__kwdefaults__’. (Contributed by Yury + Selivanov in bpo-20625(14).) + + * *note hashlib.hash.name: be2. 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(15)). + + * Because *note unittest.TestSuite: a75. now drops references to + tests after they are run, test harnesses that re-use a *note + TestSuite: a75. 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 *note + unittest: 125. is designed to provide. However, if the lack of + isolation is considered acceptable, the old behavior can be + restored by creating a *note TestSuite: a75. subclass that defines + a ‘_removeTestAtIndex’ method that does nothing (see *note + TestSuite.__iter__(): cd5.) (bpo-11798(16)). + + * *note unittest: 125. now uses *note argparse: 5. 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. + + * The *note re.split(): 7cb, *note re.findall(): cd6, and *note + re.sub(): 85d. functions, and the ‘group()’ and ‘groups()’ methods + of ‘match’ objects now always return a `bytes' object when the + string to be matched is a *note bytes-like object: 9a2. Previously + the return type matched the input type, so if your code was + depending on the return value being, say, a ‘bytearray’, you will + need to change your code. + + * *note audioop: c. functions now raise an error immediately if + passed string input, instead of failing randomly later on + (bpo-16685(17)). + + * The new `convert_charrefs' argument to *note HTMLParser: 499. + currently defaults to ‘False’ for backward compatibility, but will + eventually be changed to default to ‘True’. It is recommended that + you add this keyword, with the appropriate value, to any *note + HTMLParser: 499. calls in your code (bpo-13633(18)). + + * Since the `digestmod' argument to the *note hmac.new(): 6f9. + function will in the future have no default, all calls to *note + hmac.new(): 6f9. should be changed to explicitly specify a + `digestmod' (bpo-17276(19)). + + * Calling *note sysconfig.get_config_var(): cd7. with the ‘SO’ key, + or looking ‘SO’ up in the results of a call to *note + sysconfig.get_config_vars(): cd8. is deprecated. This key should + be replaced by ‘EXT_SUFFIX’ or ‘SHLIB_SUFFIX’, depending on the + context (bpo-19555(20)). + + * Any calls to ‘open’ functions that specify ‘U’ should be modified. + ‘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 *note TextIOWrapper: 9ad. to + use its `newline' argument (bpo-15204(21)). + + * If you use ‘pyvenv’ in a script and desire that pip `not' be + installed, you must add ‘--without-pip’ to your command invocation. + + * The default behavior of *note json.dump(): 9be. and *note + json.dumps(): 9bf. 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(22)). + + * *note doctest: 63. now looks for doctests in extension module + ‘__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(23)). + + * The *note collections.abc: 1d. 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 *note collections: + 1c. automatically imports *note collections.abc: 1d. If your + program depended on the (undocumented) implicit import, you will + need to add an explicit ‘import collections.abc’ (bpo-20784(24)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17115 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19413 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18065 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18416 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=18416 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17434 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=18011 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=9177 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=14794 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=16290 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=16772 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=16967 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=17094 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=20625 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=18532 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=11798 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=16685 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=13633 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=17276 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=19555 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=15204 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=16333 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=3158 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=20784 + + +File: python.info, Node: Changes in the C API<7>, Prev: Changes in the Python API<7>, Up: Porting to Python 3 4 + +1.8.8.3 Changes in the C API +............................ + + * *note PyEval_EvalFrameEx(): cda, *note PyObject_Repr(): cdb, and + *note PyObject_Str(): cdc, 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 *note PyErr_Fetch(): cdd. or is being + deliberately replaced with a different exception), an explicit + *note PyErr_Clear(): cde. 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. + + * *note PyErr_SetImportError(): 9b2. now sets *note TypeError: 19c. + when its `msg' argument is not set. Previously only ‘NULL’ was + returned with no exception set. + + * The result of the *note PyOS_ReadlineFunctionPointer: 4fc. callback + must now be a string allocated by *note PyMem_RawMalloc(): cdf. or + *note PyMem_RawRealloc(): ce0, or ‘NULL’ if an error occurred, + instead of a string allocated by *note PyMem_Malloc(): 8d7. or + *note PyMem_Realloc(): ce1. (bpo-16742(1)) + + * *note PyThread_set_key_value(): ce2. 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-‘NULL’ pointer). + + * The ‘f_tstate’ (thread state) field of the *note PyFrameObject: + 35d. structure has been removed to fix a bug: see bpo-14432(2) for + the rationale. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16742 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=14432 + + +File: python.info, Node: Changed in 3 4 3, Prev: Porting to Python 3 4, Up: What’s New In Python 3 4 + +1.8.9 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. + + +File: python.info, Node: PEP 476 Enabling certificate verification by default for stdlib http clients, Up: Changed in 3 4 3 + +1.8.9.1 PEP 476: Enabling certificate verification by default for stdlib http clients +..................................................................................... + +*note http.client: 8f. and modules which use it, such as *note +urllib.request: 12a. and *note xmlrpc.client: 14a, 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: + + 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) + + +File: python.info, Node: What’s New In Python 3 3, Next: What’s New In Python 3 2, Prev: What’s New In Python 3 4, Up: What’s New in Python + +1.9 What’s New In Python 3.3 +============================ + +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(1). + +See also +........ + +PEP 398(2) - Python 3.3 Release Schedule + +* Menu: + +* Summary – Release highlights: Summary – Release highlights<7>. +* 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<9>. +* A Finer-Grained Import Lock:: +* Builtin functions and types:: +* New Modules: New Modules<9>. +* Improved Modules: Improved Modules<9>. +* Optimizations: Optimizations<8>. +* Build and C API Changes: Build and C API Changes<4>. +* Deprecated: Deprecated<10>. +* Porting to Python 3.3: Porting to Python 3 3. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/3.3/whatsnew/changelog.html + + (2) https://peps.python.org/pep-0398/ + + +File: python.info, Node: Summary – Release highlights<7>, Next: PEP 405 Virtual Environments, Up: What’s New In Python 3 3 + +1.9.1 Summary – Release highlights +---------------------------------- + +New syntax features: + + * New ‘yield from’ expression for *note generator delegation: ce9. + + * The ‘u'unicode'’ syntax is accepted again for *note str: 1b3. + objects. + +New library modules: + + * *note faulthandler: 78. (helps debugging low-level crashes) + + * *note ipaddress: a0. (high-level objects representing IP addresses + and masks) + + * *note lzma: ab. (compress data using the XZ / LZMA algorithm) + + * *note unittest.mock: 126. (replace parts of your system under test + with mock objects) + + * *note venv: 12f. (Python *note virtual environments: cea, as in the + popular ‘virtualenv’ package) + +New built-in features: + + * Reworked *note I/O exception hierarchy: ceb. + +Implementation improvements: + + * Rewritten *note import machinery: cec. based on *note importlib: + 97. + + * More compact *note unicode strings: ced. + + * More compact *note attribute dictionaries: cee. + +Significantly Improved Library Modules: + + * C Accelerator for the *note decimal: cef. module. + + * Better unicode handling in the *note email: cf0. module (*note + provisional: cf1.). + +Security improvements: + + * Hash randomization is switched on by default. + +Please read on for a comprehensive list of user-facing changes. + + +File: python.info, Node: PEP 405 Virtual Environments, Next: PEP 420 Implicit Namespace Packages, Prev: Summary – Release highlights<7>, Up: What’s New In Python 3 3 + +1.9.2 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 +‘virtualenv’ third-party package, but benefit from tighter integration +with the interpreter core. + +This PEP adds the *note venv: 12f. module for programmatic access, and +the ‘pyvenv’ script for command-line access and administration. The +Python interpreter checks for a ‘pyvenv.cfg’, file whose existence +signals the base of a virtual environment’s directory tree. + +See also +........ + +PEP 405(1) - Python Virtual Environments + + PEP written by Carl Meyer; implementation by Carl Meyer and Vinay + Sajip + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0405/ + + +File: python.info, Node: PEP 420 Implicit Namespace Packages, Next: PEP 3118 New memoryview implementation and buffer protocol documentation, Prev: PEP 405 Virtual Environments, Up: What’s New In Python 3 3 + +1.9.3 PEP 420: Implicit Namespace Packages +------------------------------------------ + +Native support for package directories that don’t require ‘__init__.py’ +marker files and can automatically span multiple path segments (inspired +by various third party approaches to namespace packages, as described in +PEP 420(1)) + +See also +........ + +PEP 420(2) - Implicit Namespace Packages + + PEP written by Eric V. Smith; implementation by Eric V. Smith and + Barry Warsaw + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0420/ + + (2) https://peps.python.org/pep-0420/ + + +File: python.info, Node: PEP 3118 New memoryview implementation and buffer protocol documentation, Next: PEP 393 Flexible String Representation, Prev: PEP 420 Implicit Namespace Packages, Up: What’s New In Python 3 3 + +1.9.4 PEP 3118: New memoryview implementation and buffer protocol documentation +------------------------------------------------------------------------------- + +The implementation of PEP 3118(1) 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:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3118/ + + +File: python.info, Node: Features, Next: API changes, Up: PEP 3118 New memoryview implementation and buffer protocol documentation + +1.9.4.1 Features +................ + + * All native single character format specifiers in struct module + syntax (optionally prefixed with ‘@’) are now supported. + + * With some restrictions, the cast() method allows changing of format + and shape of C-contiguous arrays. + + * Multi-dimensional list representations are supported for any array + type. + + * Multi-dimensional comparisons are supported for any array type. + + * One-dimensional memoryviews of hashable (read-only) types with + formats B, b or c are now hashable. (Contributed by Antoine Pitrou + in bpo-13411(1).) + + * 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13411 + + +File: python.info, Node: API changes, Prev: Features, Up: PEP 3118 New memoryview implementation and buffer protocol documentation + +1.9.4.2 API changes +................... + + * The maximum number of dimensions is officially limited to 64. + + * The representation of empty shape, strides and suboffsets is now an + empty tuple instead of ‘None’. + + * 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. + + * 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. + + * For further changes see *note Build and C API Changes: cf8. and + *note Porting C code: cf9. + +(Contributed by Stefan Krah in bpo-10181(1).) + +See also +........ + +PEP 3118(2) - Revising the Buffer Protocol + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10181 + + (2) https://peps.python.org/pep-3118/ + + +File: python.info, Node: PEP 393 Flexible String Representation, Next: PEP 397 Python Launcher for Windows, Prev: PEP 3118 New memoryview implementation and buffer protocol documentation, Up: What’s New In Python 3 3 + +1.9.5 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, PEP 393(1) 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:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + +File: python.info, Node: Functionality, Next: Performance and resource usage, Up: PEP 393 Flexible String Representation + +1.9.5.1 Functionality +..................... + +Changes introduced by PEP 393(1) are the following: + + * Python now always supports the full range of Unicode code points, + including non-BMP ones (i.e. from ‘U+0000’ to ‘U+10FFFF’). The + distinction between narrow and wide builds no longer exists and + Python now behaves like a wide build, even under Windows. + + * With the death of narrow builds, the problems specific to narrow + builds have also been fixed, for example: + + * *note len(): 209. now always returns 1 for non-BMP characters, + so ‘len('\U0010FFFF') == 1’; + + * surrogate pairs are not recombined in string literals, so + ‘'\uDBFF\uDFFF' != '\U0010FFFF'’; + + * indexing or slicing non-BMP characters returns the expected + value, so ‘'\U0010FFFF'[0]’ now returns ‘'\U0010FFFF'’ and not + ‘'\uDBFF'’; + + * all other functions in the standard library now correctly + handle non-BMP code points. + + * The value of *note sys.maxunicode: cfc. is now always ‘1114111’ + (‘0x10FFFF’ in hexadecimal). The ‘PyUnicode_GetMax()’ function + still returns either ‘0xFFFF’ or ‘0x10FFFF’ for backward + compatibility, and it should not be used with the new Unicode API + (see bpo-13054(2)). + + * The ‘./configure’ flag ‘--with-wide-unicode’ has been removed. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13054 + + +File: python.info, Node: Performance and resource usage, Prev: Functionality, Up: PEP 393 Flexible String Representation + +1.9.5.2 Performance and resource usage +...................................... + +The storage of Unicode strings now depends on the highest code point in +the string: + + * pure ASCII and Latin1 strings (‘U+0000-U+00FF’) use 1 byte per code + point; + + * BMP strings (‘U+0000-U+FFFF’) use 2 bytes per code point; + + * non-BMP strings (‘U+10000-U+10FFFF’) use 4 bytes per code point. + +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). + +See also +........ + +PEP 393(1) - Flexible String Representation + + PEP written by Martin von Löwis; implementation by Torsten Becker + and Martin von Löwis. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + +File: python.info, Node: PEP 397 Python Launcher for Windows, Next: PEP 3151 Reworking the OS and IO exception hierarchy, Prev: PEP 393 Flexible String Representation, Up: What’s New In Python 3 3 + +1.9.6 PEP 397: Python Launcher for Windows +------------------------------------------ + +The Python 3.3 Windows installer now includes a ‘py’ launcher +application that can be used to launch Python applications in a version +independent fashion. + +This launcher is invoked implicitly when double-clicking ‘*.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 +‘py’ application. Running ‘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 ‘-3’ to request +Python 3 when Python 2 is also installed, or ‘-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(1).) + +See also +........ + +PEP 397(2) - Python Launcher for Windows + + PEP written by Mark Hammond and Martin v. Löwis; implementation by + Vinay Sajip. + +Launcher documentation: *note Python Launcher for Windows: 180. + +Installer PATH modification: *note Finding the Python executable: d00. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=3561 + + (2) https://peps.python.org/pep-0397/ + + +File: python.info, Node: PEP 3151 Reworking the OS and IO exception hierarchy, Next: PEP 380 Syntax for Delegating to a Subgenerator, Prev: PEP 397 Python Launcher for Windows, Up: What’s New In Python 3 3 + +1.9.7 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 *note OSError: 413, *note IOError: d02, *note +EnvironmentError: d03, *note WindowsError: d04, ‘mmap.error’, *note +socket.error: d05. or *note select.error: d06. All these exception +types are now only one: *note OSError: 413. 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 ‘errno’ attribute (or ‘args[0]’) for a particular +constant from the *note errno: 77. module, you can catch the adequate +*note OSError: 413. subclass. The available subclasses are the +following: + + * *note BlockingIOError: d07. + + * *note ChildProcessError: d08. + + * *note ConnectionError: a8b. + + * *note FileExistsError: ccc. + + * *note FileNotFoundError: b53. + + * *note InterruptedError: a05. + + * *note IsADirectoryError: d09. + + * *note NotADirectoryError: d0a. + + * *note PermissionError: 9b9. + + * *note ProcessLookupError: d0b. + + * *note TimeoutError: 429. + +And the *note ConnectionError: a8b. itself has finer-grained subclasses: + + * *note BrokenPipeError: d0c. + + * *note ConnectionAbortedError: d0d. + + * *note ConnectionRefusedError: d0e. + + * *note ConnectionResetError: d0f. + +Thanks to the new exceptions, common usages of the *note errno: 77. can +now be avoided. For example, the following code written for Python 3.2: + + 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 + +can now be written without the *note errno: 77. import and without +manual inspection of exception attributes: + + 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") + +See also +........ + +PEP 3151(1) - Reworking the OS and IO Exception Hierarchy + + PEP written and implemented by Antoine Pitrou + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3151/ + + +File: python.info, Node: PEP 380 Syntax for Delegating to a Subgenerator, Next: PEP 409 Suppressing exception context, Prev: PEP 3151 Reworking the OS and IO exception hierarchy, Up: What’s New In Python 3 3 + +1.9.8 PEP 380: Syntax for Delegating to a Subgenerator +------------------------------------------------------ + +PEP 380 adds the ‘yield from’ expression, allowing a *note generator: +d11. to delegate part of its operations to another generator. This +allows a section of code containing *note yield: 60d. 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 +‘yield from’ expression actually allows delegation to arbitrary +subiterators. + +For simple iterators, ‘yield from iterable’ is essentially just a +shortened form of ‘for item in iterable: yield item’: + + >>> 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] + +However, unlike an ordinary loop, ‘yield from’ allows subgenerators to +receive sent and thrown values directly from the calling scope, and +return a final value to the outer generator: + + >>> 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] + +The main principle driving this change is to allow even generators that +are designed to be used with the ‘send’ and ‘throw’ methods to be split +into multiple subgenerators as easily as a single large function can be +split into multiple subfunctions. + +See also +........ + +PEP 380(1) - 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 + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0380/ + + +File: python.info, Node: PEP 409 Suppressing exception context, Next: PEP 414 Explicit Unicode literals, Prev: PEP 380 Syntax for Delegating to a Subgenerator, Up: What’s New In Python 3 3 + +1.9.9 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: + + >>> 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 "", line 1, in + File "", line 8, in __getattr__ + AttributeError: x + +Without the ‘from None’ suffix to suppress the cause, the original +exception would be displayed by default: + + >>> 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 "", line 6, in __getattr__ + KeyError: 'x' + + During handling of the above exception, another exception occurred: + + Traceback (most recent call last): + File "", line 1, in + File "", line 8, in __getattr__ + AttributeError: x + +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): + + >>> try: + ... D({}).x + ... except AttributeError as exc: + ... print(repr(exc.__context__)) + ... + KeyError('x',) + +See also +........ + +PEP 409(1) - Suppressing exception context + + PEP written by Ethan Furman; implemented by Ethan Furman and Nick + Coghlan. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0409/ + + +File: python.info, Node: PEP 414 Explicit Unicode literals, Next: PEP 3155 Qualified name for classes and functions, Prev: PEP 409 Suppressing exception context, Up: What’s New In Python 3 3 + +1.9.10 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 “‘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). + +See also +........ + +PEP 414(1) - Explicit Unicode literals + + PEP written by Armin Ronacher. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0414/ + + +File: python.info, Node: PEP 3155 Qualified name for classes and functions, Next: PEP 412 Key-Sharing Dictionary, Prev: PEP 414 Explicit Unicode literals, Up: What’s New In Python 3 3 + +1.9.11 PEP 3155: Qualified name for classes and functions +--------------------------------------------------------- + +Functions and class objects have a new ‘__qualname__’ attribute +representing the “path” from the module top-level to their definition. +For global functions and classes, this is the same as ‘__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: + + >>> class C: + ... def meth(self): + ... pass + >>> C.meth.__name__ + 'meth' + >>> C.meth.__qualname__ + 'C.meth' + +Example with nested classes: + + >>> 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' + +Example with nested functions: + + >>> def outer(): + ... def inner(): + ... pass + ... return inner + ... + >>> outer().__name__ + 'inner' + >>> outer().__qualname__ + 'outer..inner' + +The string representation of those objects is also changed to include +the new, more precise information: + + >>> str(C.D) + "" + >>> str(C.D.meth) + '' + +See also +........ + +PEP 3155(1) - Qualified name for classes and functions + + PEP written and implemented by Antoine Pitrou. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3155/ + + +File: python.info, Node: PEP 412 Key-Sharing Dictionary, Next: PEP 362 Function Signature Object, Prev: PEP 3155 Qualified name for classes and functions, Up: What’s New In Python 3 3 + +1.9.12 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. + +See also +........ + +PEP 412(1) - Key-Sharing Dictionary + + PEP written and implemented by Mark Shannon. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0412/ + + +File: python.info, Node: PEP 362 Function Signature Object, Next: PEP 421 Adding sys implementation, Prev: PEP 412 Key-Sharing Dictionary, Up: What’s New In Python 3 3 + +1.9.13 PEP 362: Function Signature Object +----------------------------------------- + +A new function *note inspect.signature(): 301. makes introspection of +python callables easy and straightforward. A broad range of callables +is supported: python functions, decorated or not, classes, and *note +functools.partial(): b5b. objects. New classes *note inspect.Signature: +303, *note inspect.Parameter: a97. and *note inspect.BoundArguments: +d17. 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. + +See also +........ + +PEP 362(1): - Function Signature Object + + PEP written by Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon + Seo; implemented by Yury Selivanov. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0362/ + + +File: python.info, Node: PEP 421 Adding sys implementation, Next: Using importlib as the Implementation of Import, Prev: PEP 362 Function Signature Object, Up: What’s New In Python 3 3 + +1.9.14 PEP 421: Adding sys.implementation +----------------------------------------- + +A new attribute on the *note sys: f9. module exposes details specific to +the implementation of the currently running interpreter. The initial +set of attributes on *note sys.implementation: d19. are ‘name’, +‘version’, ‘hexversion’, and ‘cache_tag’. + +The intention of ‘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, +‘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 ‘cache_tag’. As +of Python 3.3, ‘sys.implementation.cache_tag’ is used by *note +importlib: 97. to support PEP 3147(1) compliance. Any Python +implementation that uses ‘importlib’ for its built-in import system may +use ‘cache_tag’ to control the caching behavior for modules. + +* Menu: + +* SimpleNamespace:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + +File: python.info, Node: SimpleNamespace, Up: PEP 421 Adding sys implementation + +1.9.14.1 SimpleNamespace +........................ + +The implementation of ‘sys.implementation’ also introduces a new type to +Python: *note types.SimpleNamespace: 56f. In contrast to a +mapping-based namespace, like *note dict: 16e, ‘SimpleNamespace’ is +attribute-based, like *note object: 6df. However, unlike ‘object’, +‘SimpleNamespace’ instances are writable. This means that you can add, +remove, and modify the namespace through normal attribute access. + +See also +........ + +PEP 421(1) - Adding sys.implementation + + PEP written and implemented by Eric Snow. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0421/ + + +File: python.info, Node: Using importlib as the Implementation of Import, Next: Other Language Changes<9>, Prev: PEP 421 Adding sys implementation, Up: What’s New In Python 3 3 + +1.9.15 Using importlib as the Implementation of Import +------------------------------------------------------ + +bpo-2377(1) - Replace __import__ w/ importlib.__import__ bpo-13959(2) - +Re-implement parts of *note imp: 96. in pure Python bpo-14605(3) - Make +import machinery explicit bpo-14646(4) - Require loaders set __loader__ +and __package__ + +The *note __import__(): 510. function is now powered by *note +importlib.__import__(): d1c. This work leads to the completion of +“phase 2” of PEP 302(5). 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 *note Porting Python code: d1d. section of this document. + +* Menu: + +* New APIs:: +* Visible Changes:: + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2377 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13959 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=14605 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=14646 + + (5) https://peps.python.org/pep-0302/ + + +File: python.info, Node: New APIs, Next: Visible Changes, Up: Using importlib as the Implementation of Import + +1.9.15.1 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 *note importlib: +97. package. + +The abstract base classes defined in *note importlib.abc: 98. have been +expanded to properly delineate between *note meta path finders: d1f. and +*note path entry finders: d20. by introducing *note +importlib.abc.MetaPathFinder: 473. and *note +importlib.abc.PathEntryFinder: 474, respectively. The old ABC of *note +importlib.abc.Finder: 472. is now only provided for +backwards-compatibility and does not enforce any method requirements. + +In terms of finders, *note importlib.machinery.FileFinder: d21. exposes +the mechanism used to search for source and bytecode files of a module. +Previously this class was an implicit member of *note sys.path_hooks: +cd0. + +For loaders, the new abstract base class *note importlib.abc.FileLoader: +d22. helps write a loader that uses the file system as the storage +mechanism for a module’s code. The loader for source files (*note +importlib.machinery.SourceFileLoader: d23.), sourceless bytecode files +(*note importlib.machinery.SourcelessFileLoader: d24.), and extension +modules (*note importlib.machinery.ExtensionFileLoader: 91d.) are now +available for direct use. + +*note ImportError: 511. now has ‘name’ and ‘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 *note importlib.invalidate_caches(): 87a. function will now call the +method with the same name on all finders cached in *note +sys.path_importer_cache: 1b2. to help clean up any stored state as +necessary. + + +File: python.info, Node: Visible Changes, Prev: New APIs, Up: Using importlib as the Implementation of Import + +1.9.15.2 Visible Changes +........................ + +For potential required changes to code, see the *note Porting Python +code: d1d. section. + +Beyond the expanse of what *note importlib: 97. now exposes, there are +other visible changes to import. The biggest is that *note +sys.meta_path: 9a0. and *note sys.path_hooks: cd0. 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 ‘__loader__’ attribute, +storing the loader used to create the module. PEP 302(1) 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 ‘__package__’ attribute from +PEP 366(2). Once again, import itself is already setting this on all +loaders from *note importlib: 97. and import itself is setting the +attribute post-load. + +‘None’ is now inserted into *note sys.path_importer_cache: 1b2. when no +finder can be found on *note sys.path_hooks: cd0. Since *note +imp.NullImporter: d26. is not directly exposed on *note sys.path_hooks: +cd0. 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 *note Porting Python code: d1d. section of this document. + +(Implementation by Brett Cannon) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0302/ + + (2) https://peps.python.org/pep-0366/ + + +File: python.info, Node: Other Language Changes<9>, Next: A Finer-Grained Import Lock, Prev: Using importlib as the Implementation of Import, Up: What’s New In Python 3 3 + +1.9.16 Other Language Changes +----------------------------- + +Some smaller changes made to the core Python language are: + + * Added support for Unicode name aliases and named sequences. Both + *note unicodedata.lookup(): d28. and ‘'\N{...}'’ now resolve name + aliases, and *note unicodedata.lookup(): d28. resolves named + sequences too. + + (Contributed by Ezio Melotti in bpo-12753(1).) + + * Unicode database updated to UCD version 6.1.0 + + * Equality comparisons on *note range(): 58b. objects now return a + result reflecting the equality of the underlying sequences + generated by those range objects. (bpo-13201(2)) + + * The ‘count()’, ‘find()’, ‘rfind()’, ‘index()’ and ‘rindex()’ + methods of *note bytes: 1b4. and *note bytearray: 1a5. objects now + accept an integer between 0 and 255 as their first argument. + + (Contributed by Petri Lehtinen in bpo-12170(3).) + + * The ‘rjust()’, ‘ljust()’, and ‘center()’ methods of *note bytes: + 1b4. and *note bytearray: 1a5. now accept a *note bytearray: 1a5. + for the ‘fill’ argument. (Contributed by Petri Lehtinen in + bpo-12380(4).) + + * New methods have been added to *note list: 1e9. and *note + bytearray: 1a5.: ‘copy()’ and ‘clear()’ (bpo-10516(5)). + Consequently, *note MutableSequence: a55. now also defines a + ‘clear()’ method (bpo-11388(6)). + + * Raw bytes literals can now be written ‘rb"..."’ as well as + ‘br"..."’. + + (Contributed by Antoine Pitrou in bpo-13748(7).) + + * *note dict.setdefault(): d29. 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(8).) + + * The error messages produced when a function call does not match the + function signature have been significantly improved. + + (Contributed by Benjamin Peterson.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12753 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13201 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=12170 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=12380 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=10516 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=11388 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=13748 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=13521 + + +File: python.info, Node: A Finer-Grained Import Lock, Next: Builtin functions and types, Prev: Other Language Changes<9>, Up: What’s New In Python 3 3 + +1.9.17 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 +*note PyImport_ImportModuleNoBlock(): d2b. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9260 + + +File: python.info, Node: Builtin functions and types, Next: New Modules<9>, Prev: A Finer-Grained Import Lock, Up: What’s New In Python 3 3 + +1.9.18 Builtin functions and types +---------------------------------- + + * *note open(): 30b. 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 *note os.O_CLOEXEC: d2d. for example. The ‘'x'’ mode + was added: open for exclusive creation, failing if the file already + exists. + + * *note print(): c13.: added the `flush' keyword argument. If the + `flush' keyword argument is true, the stream is forcibly flushed. + + * *note hash(): 1bc.: hash randomization is enabled by default, see + *note object.__hash__(): 750. and *note PYTHONHASHSEED: d2e. + + * The *note str: 1b3. type gets a new *note casefold(): a57. method: + return a casefolded copy of the string, casefolded strings may be + used for caseless matching. For example, ‘'ß'.casefold()’ returns + ‘'ss'’. + + * 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(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4966 + + +File: python.info, Node: New Modules<9>, Next: Improved Modules<9>, Prev: Builtin functions and types, Up: What’s New In Python 3 3 + +1.9.19 New Modules +------------------ + +* Menu: + +* faulthandler: faulthandler<4>. +* ipaddress: ipaddress<5>. +* lzma: lzma<2>. + + +File: python.info, Node: faulthandler<4>, Next: ipaddress<5>, Up: New Modules<9> + +1.9.19.1 faulthandler +..................... + +This new debug module *note faulthandler: 78. 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 *note +faulthandler.enable(): 911. to install fault handlers for the ‘SIGSEGV’, +‘SIGFPE’, ‘SIGABRT’, ‘SIGBUS’, and ‘SIGILL’ signals. You can also +enable them at startup by setting the *note PYTHONFAULTHANDLER: d31. +environment variable or by using *note -X: 174. ‘faulthandler’ command +line option. + +Example of a segmentation fault on Linux: + + $ 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 "", line 1 in + Segmentation fault + + +File: python.info, Node: ipaddress<5>, Next: lzma<2>, Prev: faulthandler<4>, Up: New Modules<9> + +1.9.19.2 ipaddress +.................. + +The new *note ipaddress: a0. 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 PEP 3144(1).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3144/ + + +File: python.info, Node: lzma<2>, Prev: ipaddress<5>, Up: New Modules<9> + +1.9.19.3 lzma +............. + +The newly added *note lzma: ab. module provides data compression and +decompression using the LZMA algorithm, including support for the ‘.xz’ +and ‘.lzma’ file formats. + +(Contributed by Nadeem Vawda and Per Øyvind Karlsen in bpo-6715(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6715 + + +File: python.info, Node: Improved Modules<9>, Next: Optimizations<8>, Prev: New Modules<9>, Up: What’s New In Python 3 3 + +1.9.20 Improved Modules +----------------------- + +* Menu: + +* abc: abc<2>. +* array: array<3>. +* base64: base64<3>. +* binascii: binascii<3>. +* bz2: bz2<2>. +* codecs: codecs<2>. +* collections: collections<7>. +* contextlib: contextlib<7>. +* crypt: crypt<2>. +* curses: curses<5>. +* datetime: datetime<6>. +* decimal: decimal<3>. +* email: email<4>. +* ftplib: ftplib<2>. +* functools: functools<6>. +* gc: gc<6>. +* hmac: hmac<4>. +* http: http<4>. +* html: html<2>. +* imaplib: imaplib<3>. +* inspect: inspect<8>. +* io: io<4>. +* itertools: itertools<4>. +* logging: logging<7>. +* math: math<7>. +* mmap: mmap<3>. +* multiprocessing: multiprocessing<7>. +* nntplib: nntplib<2>. +* os: os<10>. +* pdb: pdb<5>. +* pickle: pickle<5>. +* pydoc: pydoc<5>. +* re: re<7>. +* sched:: +* select: select<2>. +* shlex: shlex<3>. +* shutil: shutil<5>. +* signal: signal<4>. +* smtpd: smtpd<3>. +* smtplib: smtplib<4>. +* socket: socket<10>. +* socketserver: socketserver<3>. +* sqlite3: sqlite3<7>. +* ssl: ssl<9>. +* stat: stat<2>. +* struct: struct<3>. +* subprocess: subprocess<5>. +* sys: sys<10>. +* tarfile: tarfile<4>. +* tempfile:: +* textwrap: textwrap<2>. +* threading: threading<7>. +* time: time<7>. +* types: types<5>. +* unittest: unittest<7>. +* urllib: urllib<3>. +* webbrowser:: +* xml.etree.ElementTree: xml etree ElementTree. +* zlib: zlib<2>. + + +File: python.info, Node: abc<2>, Next: array<3>, Up: Improved Modules<9> + +1.9.20.1 abc +............ + +Improved support for abstract base classes containing descriptors +composed with abstract methods. The recommended approach to declaring +abstract descriptors is now to provide ‘__isabstractmethod__’ as a +dynamically updated property. The built-in descriptors have been +updated accordingly. + + * *note abc.abstractproperty: d36. has been deprecated, use + *note property: 205. with *note abc.abstractmethod(): d37. + instead. + + * *note abc.abstractclassmethod: d38. has been deprecated, use + *note classmethod: 18d. with *note abc.abstractmethod(): d37. + instead. + + * *note abc.abstractstaticmethod: d39. has been deprecated, use + *note staticmethod: 3c8. with *note abc.abstractmethod(): d37. + instead. + +(Contributed by Darren Dale in bpo-11610(1).) + +*note abc.ABCMeta.register(): d3a. now returns the registered subclass, +which means it can now be used as a class decorator (bpo-10868(2)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11610 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10868 + + +File: python.info, Node: array<3>, Next: base64<3>, Prev: abc<2>, Up: Improved Modules<9> + +1.9.20.2 array +.............. + +The *note array: 6. module supports the long long type using ‘q’ and ‘Q’ +type codes. + +(Contributed by Oren Tirosh and Hirokazu Yamamoto in bpo-1172711(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1172711 + + +File: python.info, Node: base64<3>, Next: binascii<3>, Prev: array<3>, Up: Improved Modules<9> + +1.9.20.3 base64 +............... + +ASCII-only Unicode strings are now accepted by the decoding functions of +the *note base64: d. modern interface. For example, +‘base64.b64decode('YWJj')’ returns ‘b'abc'’. (Contributed by Catalin +Iacob in bpo-13641(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13641 + + +File: python.info, Node: binascii<3>, Next: bz2<2>, Prev: base64<3>, Up: Improved Modules<9> + +1.9.20.4 binascii +................. + +In addition to the binary objects they normally accept, the ‘a2b_’ +functions now all also accept ASCII-only strings as input. (Contributed +by Antoine Pitrou in bpo-13637(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13637 + + +File: python.info, Node: bz2<2>, Next: codecs<2>, Prev: binascii<3>, Up: Improved Modules<9> + +1.9.20.5 bz2 +............ + +The *note bz2: 12. module has been rewritten from scratch. In the +process, several new features have been added: + + * New *note bz2.open(): d3f. function: open a bzip2-compressed file + in binary or text mode. + + * *note bz2.BZ2File: 5a5. 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(1).) + + * *note bz2.BZ2File: 5a5. and *note bz2.decompress(): d40. can now + decompress multi-stream inputs (such as those produced by the + ‘pbzip2’ tool). *note bz2.BZ2File: 5a5. can now also be used to + create this type of file, using the ‘'a'’ (append) mode. + + (Contributed by Nir Aides in bpo-1625(2).) + + * *note bz2.BZ2File: 5a5. now implements all of the *note + io.BufferedIOBase: 949. API, except for the ‘detach()’ and + ‘truncate()’ methods. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5863 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1625 + + +File: python.info, Node: codecs<2>, Next: collections<7>, Prev: bz2<2>, Up: Improved Modules<9> + +1.9.20.6 codecs +............... + +The *note mbcs: 73. codec has been rewritten to handle correctly +‘replace’ and ‘ignore’ error handlers on all Windows versions. The +*note mbcs: 73. codec now supports all error handlers, instead of only +‘replace’ to encode and ‘ignore’ to decode. + +A new Windows-only codec has been added: ‘cp65001’ (bpo-13216(1)). It +is the Windows code page 65001 (Windows UTF-8, ‘CP_UTF8’). For example, +it is used by ‘sys.stdout’ if the console output code page is set to +cp65001 (e.g., using ‘chcp 65001’ command). + +Multibyte CJK decoders now resynchronize faster. They only ignore the +first byte of an invalid byte sequence. For example, +‘b'\xff\n'.decode('gb2312', 'replace')’ now returns a ‘\n’ after the +replacement character. + +(bpo-12016(2)) + +Incremental CJK codec encoders are no longer reset at each call to their +encode() methods. For example: + + >>> import codecs + >>> encoder = codecs.getincrementalencoder('hz')('strict') + >>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.') + b'~{NpJ)l6HK!#~} Bye.' + +This example gives ‘b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'’ with older +Python versions. + +(bpo-12100(3)) + +The ‘unicode_internal’ codec has been deprecated. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13216 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=12016 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=12100 + + +File: python.info, Node: collections<7>, Next: contextlib<7>, Prev: codecs<2>, Up: Improved Modules<9> + +1.9.20.7 collections +.................... + +Addition of a new *note ChainMap: 886. class to allow treating a number +of mappings as a single unit. (Written by Raymond Hettinger for +bpo-11089(1), made public in bpo-11297(2).) + +The abstract base classes have been moved in a new *note +collections.abc: 1d. module, to better differentiate between the +abstract and the concrete collections classes. Aliases for ABCs are +still present in the *note collections: 1c. module to preserve existing +imports. (bpo-11085(3)) + +The *note Counter: d43. class now supports the unary ‘+’ and ‘-’ +operators, as well as the in-place operators ‘+=’, ‘-=’, ‘|=’, and ‘&=’. +(Contributed by Raymond Hettinger in bpo-13121(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11089 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=11297 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=11085 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13121 + + +File: python.info, Node: contextlib<7>, Next: crypt<2>, Prev: collections<7>, Up: Improved Modules<9> + +1.9.20.8 contextlib +................... + +*note ExitStack: 77e. now provides a solid foundation for programmatic +manipulation of context managers and similar cleanup functionality. +Unlike the previous ‘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 ‘__init__’ +method (for example, file objects) or in their ‘__enter__’ method (for +example, synchronisation objects from the *note threading: 10b. module). + +(bpo-13585(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13585 + + +File: python.info, Node: crypt<2>, Next: curses<5>, Prev: contextlib<7>, Up: Improved Modules<9> + +1.9.20.9 crypt +.............. + +Addition of salt and modular crypt format (hashing method) and the *note +mksalt(): 784. function to the *note crypt: 27. module. + +(bpo-10924(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10924 + + +File: python.info, Node: curses<5>, Next: datetime<6>, Prev: crypt<2>, Up: Improved Modules<9> + +1.9.20.10 curses +................ + + * If the *note curses: 2a. module is linked to the ncursesw + library, use Unicode functions when Unicode strings or + characters are passed (e.g. ‘waddwstr()’), and bytes + functions otherwise (e.g. ‘waddstr()’). + + * Use the locale encoding instead of ‘utf-8’ to encode Unicode + strings. + + * ‘curses.window’ has a new *note curses.window.encoding: d47. + attribute. + + * The ‘curses.window’ class has a new *note get_wch(): d48. + method to get a wide character + + * The *note curses: 2a. module has a new *note unget_wch(): d49. + function to push a wide character so the next *note get_wch(): + d48. will return it + +(Contributed by Iñigo Serna in bpo-6755(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6755 + + +File: python.info, Node: datetime<6>, Next: decimal<3>, Prev: curses<5>, Up: Improved Modules<9> + +1.9.20.11 datetime +.................. + + * Equality comparisons between naive and aware *note datetime: + 4be. instances now return *note False: 78d. instead of raising + *note TypeError: 19c. (bpo-15006(1)). + + * New *note datetime.datetime.timestamp(): d4b. method: Return + POSIX timestamp corresponding to the *note datetime: 4be. + instance. + + * The *note datetime.datetime.strftime(): 901. method supports + formatting years older than 1000. + + * The *note datetime.datetime.astimezone(): 610. method can now + be called without arguments to convert datetime instance to + the system timezone. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15006 + + +File: python.info, Node: decimal<3>, Next: email<4>, Prev: datetime<6>, Up: Improved Modules<9> + +1.9.20.12 decimal +................. + +bpo-7652(1) - integrate fast native decimal arithmetic. + + C-module and libmpdec written by Stefan Krah. + +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 ‘https://www.bytereef.org/mpdecimal/quickstart.html’. + + decimal.py _decimal speedup + + --------------------------------------------------------------------- + + pi 42.02s 0.345s 120x + + + telco 172.19s 5.68s 30x + + + psycopg 3.57s 0.29s 12x + + +* Menu: + +* Features: Features<2>. +* API changes: API changes<2>. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7652 + + +File: python.info, Node: Features<2>, Next: API changes<2>, Up: decimal<3> + +1.9.20.13 Features +.................. + + * The *note FloatOperation: d4e. signal optionally enables stricter + semantics for mixing floats and Decimals. + + * If Python is compiled without threads, the C version automatically + disables the expensive thread local context machinery. In this + case, the variable *note HAVE_THREADS: d4f. is set to ‘False’. + + +File: python.info, Node: API changes<2>, Prev: Features<2>, Up: decimal<3> + +1.9.20.14 API changes +..................... + + * The C module has the following context limits, depending on the + machine architecture: + + 32-bit 64-bit + + ------------------------------------------------------------------------------------- + + ‘MAX_PREC’ ‘425000000’ ‘999999999999999999’ + + + ‘MAX_EMAX’ ‘425000000’ ‘999999999999999999’ + + + ‘MIN_EMIN’ ‘-425000000’ ‘-999999999999999999’ + + + * In the context templates (*note DefaultContext: d51, *note + BasicContext: d52. and *note ExtendedContext: d53.) the magnitude + of ‘Emax’ and ‘Emin’ has changed to ‘999999’. + + * The *note Decimal: 3bd. 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 *note InvalidOperation: d54. is raised and the + result is NaN. In the latter case it is always possible to use + *note create_decimal(): d55. in order to obtain a rounded or + inexact value. + + * The power function in decimal.py is always correctly rounded. In + the C version, it is defined in terms of the correctly rounded + *note exp(): d56. and *note ln(): d57. functions, but the final + result is only “almost always correctly rounded”. + + * In the C version, the context dictionary containing the signals is + a *note MutableMapping: d58. For speed reasons, ‘flags’ and + ‘traps’ always refer to the same *note MutableMapping: d58. that + the context was initialized with. If a new signal dictionary is + assigned, ‘flags’ and ‘traps’ are updated with the new values, but + they do not reference the RHS dictionary. + + * Pickling a *note Context: d59. produces a different output in order + to have a common interchange format for the Python and C versions. + + * The order of arguments in the *note Context: d59. constructor has + been changed to match the order displayed by *note repr(): 3ee. + + * The ‘watchexp’ parameter in the *note quantize(): d5a. method is + deprecated. + + +File: python.info, Node: email<4>, Next: ftplib<2>, Prev: decimal<3>, Up: Improved Modules<9> + +1.9.20.15 email +............... + +* Menu: + +* Policy Framework:: +* Provisional Policy with New Header API:: +* Other API Changes:: + + +File: python.info, Node: Policy Framework, Next: Provisional Policy with New Header API, Up: email<4> + +1.9.20.16 Policy Framework +.......................... + +The email package now has a *note policy: 70. framework. A *note +Policy: d5d. is an object with several methods and properties that +control how the email package behaves. The primary policy for Python +3.3 is the *note Compat32: d5e. policy, which provides backward +compatibility with the email package in Python 3.2. A ‘policy’ can be +specified when an email message is parsed by a *note parser: 6f, or when +a *note Message: 90b. object is created, or when an email is serialized +using a *note generator: 69. Unless overridden, a policy passed to a +‘parser’ is inherited by all the ‘Message’ object and sub-objects +created by the ‘parser’. By default a ‘generator’ will use the policy +of the ‘Message’ object it is serializing. The default policy is *note +compat32: 90a. + +The minimum set of controls implemented by all ‘policy’ objects are: + + max_line_length The maximum length, excluding the linesep character(s), + individual lines may have when a ‘Message’ is serialized. + Defaults to 78. + + + linesep The character used to separate individual lines when a + ‘Message’ is serialized. Defaults to ‘\n’. + + + cte_type ‘7bit’ or ‘8bit’. ‘8bit’ applies only to a ‘Bytes’ + ‘generator’, and means that non-ASCII may be used where + allowed by the protocol (or where it exists in the + original input). + + + raise_on_defect Causes a ‘parser’ to raise error when defects are + encountered instead of adding them to the ‘Message’ + object’s ‘defects’ list. + + +A new policy instance, with new settings, is created using the *note +clone(): d5f. method of policy objects. ‘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 +‘\r\n’ linesep characters like this: + + mypolicy = compat32.clone(linesep='\r\n') + +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 ‘linesep='\r\n'’ in all the places you call a ‘generator’, you +can specify it once, when you set the policy used by the ‘parser’ or the +‘Message’, whichever your program uses to create ‘Message’ objects. On +the other hand, if you need to generate messages in multiple forms, you +can still specify the parameters in the appropriate ‘generator’ call. +Or you can have custom policy instances for your different cases, and +pass those in when you create the ‘generator’. + + +File: python.info, Node: Provisional Policy with New Header API, Next: Other API Changes, Prev: Policy Framework, Up: email<4> + +1.9.20.17 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 *note provisional policy: cf1. +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 *note EmailPolicy: d61, and add the +following additional controls: + + refold_source Controls whether or not headers parsed by a + *note parser: 6f. are refolded by the + *note generator: 69. It can be ‘none’, ‘long’, or ‘all’. + The default is ‘long’, which means that source headers + with a line longer than ‘max_line_length’ get refolded. + ‘none’ means no line get refolded, and ‘all’ means that + all lines get refolded. + + + header_factory A callable that take a ‘name’ and ‘value’ and produces a + custom header object. + + +The ‘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 ‘Message’ object is an object produced by the ‘header_factory’, +and any time you set a header on a ‘Message’ it becomes an object +produced by ‘header_factory’. All such header objects have a ‘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: + + >>> m = Message(policy=SMTP) + >>> m['To'] = 'Éric ' + >>> m['to'] + 'Éric ' + >>> 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?= + Date: Fri, 25 May 2012 21:44:27 -0400 + +You will note that the unicode display name is automatically encoded as +‘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 *note email.header: 6a. *note decode_header(): +d62. or *note make_header(): d63. functions. + +You can also create addresses from parts: + + >>> 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?= + Date: Fri, 25 May 2012 21:44:27 -0400 + cc: pals: Bob , Sally ;, Bonzo + +Decoding to unicode is done automatically: + + >>> m2 = message_from_string(str(m)) + >>> m2['to'] + 'Éric ' + +When you parse a message, you can use the ‘addresses’ and ‘groups’ +attributes of the header objects to access the groups and individual +addresses: + + >>> 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'),)) + +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. + + +File: python.info, Node: Other API Changes, Prev: Provisional Policy with New Header API, Up: email<4> + +1.9.20.18 Other API Changes +........................... + +New *note BytesHeaderParser: d65, added to the *note parser: 6f. module +to complement *note HeaderParser: d66. and complete the Bytes API. + +New utility functions: + + * *note format_datetime(): d67.: given a *note datetime: 4be, + produce a string formatted for use in an email header. + + * *note parsedate_to_datetime(): d68.: given a date string from + an email header, convert it into an aware *note datetime: 4be, + or a naive *note datetime: 4be. if the offset is ‘-0000’. + + * *note localtime(): d69.: With no argument, returns the current + local time as an aware *note datetime: 4be. using the local + *note timezone: d6a. Given an aware *note datetime: 4be, + converts it into an aware *note datetime: 4be. using the local + *note timezone: d6a. + + +File: python.info, Node: ftplib<2>, Next: functools<6>, Prev: email<4>, Up: Improved Modules<9> + +1.9.20.19 ftplib +................ + + * *note ftplib.FTP: 53d. now accepts a ‘source_address’ keyword + argument to specify the ‘(host, port)’ to use as the source address + in the bind call when creating the outgoing socket. (Contributed + by Giampaolo Rodolà in bpo-8594(1).) + + * The *note FTP_TLS: 53e. class now provides a new *note ccc(): d6c. + 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(2).) + + * Added *note ftplib.FTP.mlsd(): d6d. method which provides a + parsable directory listing format and deprecates *note + ftplib.FTP.nlst(): d6e. and *note ftplib.FTP.dir(): d6f. + (Contributed by Giampaolo Rodolà in bpo-11072(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8594 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=12139 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=11072 + + +File: python.info, Node: functools<6>, Next: gc<6>, Prev: ftplib<2>, Up: Improved Modules<9> + +1.9.20.20 functools +................... + +The *note functools.lru_cache(): 632. decorator now accepts a ‘typed’ +keyword argument (that defaults to ‘False’ to ensure that it caches +values of different types that compare equal in separate cache slots. +(Contributed by Raymond Hettinger in bpo-13227(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13227 + + +File: python.info, Node: gc<6>, Next: hmac<4>, Prev: functools<6>, Up: Improved Modules<9> + +1.9.20.21 gc +............ + +It is now possible to register callbacks invoked by the garbage +collector before and after collection using the new *note callbacks: +d72. list. + + +File: python.info, Node: hmac<4>, Next: http<4>, Prev: gc<6>, Up: Improved Modules<9> + +1.9.20.22 hmac +.............. + +A new *note compare_digest(): d74. function has been added to prevent +side channel attacks on digests through timing analysis. (Contributed +by Nick Coghlan and Christian Heimes in bpo-15061(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15061 + + +File: python.info, Node: http<4>, Next: html<2>, Prev: hmac<4>, Up: Improved Modules<9> + +1.9.20.23 http +.............. + +*note http.server.BaseHTTPRequestHandler: d76. now buffers the headers +and writes them all at once when *note end_headers(): d77. is called. A +new method *note flush_headers(): d78. can be used to directly manage +when the accumulated headers are sent. (Contributed by Andrew Schaaf in +bpo-3709(1).) + +*note http.server: 92. now produces valid ‘HTML 4.01 strict’ output. +(Contributed by Ezio Melotti in bpo-13295(2).) + +*note http.client.HTTPResponse: d79. now has a *note readinto(): d7a. +method, which means it can be used as an *note io.RawIOBase: d7b. class. +(Contributed by John Kuhn in bpo-13464(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=3709 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13295 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13464 + + +File: python.info, Node: html<2>, Next: imaplib<3>, Prev: http<4>, Up: Improved Modules<9> + +1.9.20.24 html +.............. + +*note html.parser.HTMLParser: 499. is now able to parse broken markup +without raising errors, therefore the `strict' argument of the +constructor and the ‘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(1), and +bpo-14538(2), bpo-13993(3), bpo-13960(4), bpo-13358(5), bpo-1745761(6), +bpo-755670(7), bpo-13357(8), bpo-12629(9), bpo-1200313(10), +bpo-670664(11), bpo-13273(12), bpo-12888(13), bpo-7311(14).) + +A new *note html5: d7d. dictionary that maps HTML5 named character +references to the equivalent Unicode character(s) (e.g. ‘html5['gt;'] +== '>'’) has been added to the *note html.entities: 8c. module. The +dictionary is now also used by *note HTMLParser: 499. (Contributed by +Ezio Melotti in bpo-11113(15) and bpo-15156(16).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15114 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=14538 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13993 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13960 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=13358 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1745761 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=755670 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=13357 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=12629 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=1200313 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=670664 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=13273 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=12888 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=7311 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=11113 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=15156 + + +File: python.info, Node: imaplib<3>, Next: inspect<8>, Prev: html<2>, Up: Improved Modules<9> + +1.9.20.25 imaplib +................. + +The *note IMAP4_SSL: 547. constructor now accepts an SSLContext +parameter to control parameters of the secure channel. + +(Contributed by Sijin Joseph in bpo-8808(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8808 + + +File: python.info, Node: inspect<8>, Next: io<4>, Prev: imaplib<3>, Up: Improved Modules<9> + +1.9.20.26 inspect +................. + +A new *note getclosurevars(): d80. 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(1).) + +A new *note getgeneratorlocals(): d81. 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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13062 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=15153 + + +File: python.info, Node: io<4>, Next: itertools<4>, Prev: inspect<8>, Up: Improved Modules<9> + +1.9.20.27 io +............ + +The *note open(): 30c. function has a new ‘'x'’ mode that can be used to +exclusively create a new file, and raise a *note FileExistsError: ccc. +if the file already exists. It is based on the C11 ‘x’ mode to fopen(). + +(Contributed by David Townshend in bpo-12760(1).) + +The constructor of the *note TextIOWrapper: 9ad. class has a new +`write_through' optional argument. If `write_through' is ‘True’, calls +to ‘write()’ are guaranteed not to be buffered: any data written on the +*note TextIOWrapper: 9ad. object is immediately handled to its +underlying binary buffer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12760 + + +File: python.info, Node: itertools<4>, Next: logging<7>, Prev: io<4>, Up: Improved Modules<9> + +1.9.20.28 itertools +................... + +*note accumulate(): 643. now takes an optional ‘func’ argument for +providing a user-supplied binary function. + + +File: python.info, Node: logging<7>, Next: math<7>, Prev: itertools<4>, Up: Improved Modules<9> + +1.9.20.29 logging +................. + +The *note basicConfig(): 646. function now supports an optional +‘handlers’ argument taking an iterable of handlers to be added to the +root logger. + +A class level attribute ‘append_nul’ has been added to *note +SysLogHandler: 22e. to allow control of the appending of the ‘NUL’ +(‘\000’) byte to syslog records, since for some daemons it is required +while for others it is passed through to the log. + + +File: python.info, Node: math<7>, Next: mmap<3>, Prev: logging<7>, Up: Improved Modules<9> + +1.9.20.30 math +.............. + +The *note math: af. module has a new function, *note log2(): d86, which +returns the base-2 logarithm of `x'. + +(Written by Mark Dickinson in bpo-11888(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11888 + + +File: python.info, Node: mmap<3>, Next: multiprocessing<7>, Prev: math<7>, Up: Improved Modules<9> + +1.9.20.31 mmap +.............. + +The *note read(): d88. method is now more compatible with other +file-like objects: if the argument is omitted or specified as ‘None’, it +returns the bytes from the current file position to the end of the +mapping. (Contributed by Petri Lehtinen in bpo-12021(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12021 + + +File: python.info, Node: multiprocessing<7>, Next: nntplib<2>, Prev: mmap<3>, Up: Improved Modules<9> + +1.9.20.32 multiprocessing +......................... + +The new *note multiprocessing.connection.wait(): d8a. function allows +polling multiple objects (such as connections, sockets and pipes) with a +timeout. (Contributed by Richard Oudkerk in bpo-12328(1).) + +‘multiprocessing.Connection’ objects can now be transferred over +multiprocessing connections. (Contributed by Richard Oudkerk in +bpo-4892(2).) + +*note multiprocessing.Process: 7b4. now accepts a ‘daemon’ keyword +argument to override the default behavior of inheriting the ‘daemon’ +flag from the parent process (bpo-6064(3)). + +New attribute *note multiprocessing.Process.sentinel: d8b. allows a +program to wait on multiple *note Process: 7b4. objects at one time +using the appropriate OS primitives (for example, *note select: e2. on +posix systems). + +New methods *note multiprocessing.pool.Pool.starmap(): d8c. and *note +starmap_async(): d8d. provide *note itertools.starmap(): d8e. +equivalents to the existing *note multiprocessing.pool.Pool.map(): d8f. +and *note map_async(): d90. functions. (Contributed by Hynek Schlawack +in bpo-12708(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12328 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=4892 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=6064 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=12708 + + +File: python.info, Node: nntplib<2>, Next: os<10>, Prev: multiprocessing<7>, Up: Improved Modules<9> + +1.9.20.33 nntplib +................. + +The *note nntplib.NNTP: 55d. class now supports the context management +protocol to unconditionally consume *note socket.error: d05. exceptions +and to close the NNTP connection when done: + + >>> 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') + >>> + +(Contributed by Giampaolo Rodolà in bpo-9795(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9795 + + +File: python.info, Node: os<10>, Next: pdb<5>, Prev: nntplib<2>, Up: Improved Modules<9> + +1.9.20.34 os +............ + + * The *note os: c2. module has a new *note pipe2(): d93. function + that makes it possible to create a pipe with *note O_CLOEXEC: d2d. + or *note O_NONBLOCK: abf. flags set atomically. This is especially + useful to avoid race conditions in multi-threaded programs. + + * The *note os: c2. module has a new *note sendfile(): 762. 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. *note sendfile(): 762. 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(1).) + + * 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(2), bpo-10755(3) and + bpo-14626(4)). + + - The *note os: c2. module has a new *note fwalk(): 7b6. + function similar to *note walk(): a00. except that it also + yields file descriptors referring to the directories visited. + This is especially useful to avoid symlink races. + + - The following functions get new optional `dir_fd' (*note paths + relative to directory descriptors: d94.) and/or + `follow_symlinks' (*note not following symlinks: d95.): *note + access(): d96, *note chflags(): d97, *note chmod(): d98, *note + chown(): d99, *note link(): d9a, *note lstat(): 654, *note + mkdir(): d9b, *note mkfifo(): a0e, *note mknod(): a0f, *note + open(): a10, *note readlink(): 568, *note remove(): d9c, *note + rename(): d9d, *note replace(): d9e, *note rmdir(): d9f, *note + stat(): 653, *note symlink(): da0, *note unlink(): da1, *note + utime(): da2. Platform support for using these parameters can + be checked via the sets *note os.supports_dir_fd: da3. and + ‘os.supports_follows_symlinks’. + + - The following functions now support a file descriptor for + their path argument: *note chdir(): 1e6, *note chmod(): d98, + *note chown(): d99, *note execve(): da4, *note listdir(): da5, + *note pathconf(): da6, *note exists(): 657, *note stat(): 653, + *note statvfs(): da7, *note utime(): da2. Platform support + for this can be checked via the *note os.supports_fd: da8. + set. + + * *note access(): d96. accepts an ‘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 + *note supports_effective_ids: da9. set. + + * The *note os: c2. module has two new functions: *note + getpriority(): daa. and *note setpriority(): dab. They can be used + to get or set process niceness/priority in a fashion similar to + *note os.nice(): dac. but extended to all processes instead of just + the current one. + + (Patch submitted by Giampaolo Rodolà in bpo-10784(5).) + + * The new *note os.replace(): d9e. function allows cross-platform + renaming of a file with overwriting the destination. With *note + os.rename(): d9d, an existing destination file is overwritten under + POSIX, but raises an error under Windows. (Contributed by Antoine + Pitrou in bpo-8828(6).) + + * The stat family of functions (*note stat(): 653, *note fstat(): + a0a, and *note lstat(): 654.) now support reading a file’s + timestamps with nanosecond precision. Symmetrically, *note + utime(): da2. can now write file timestamps with nanosecond + precision. (Contributed by Larry Hastings in bpo-14127(7).) + + * The new *note os.get_terminal_size(): dad. function queries the + size of the terminal attached to a file descriptor. See also *note + shutil.get_terminal_size(): dae. (Contributed by Zbigniew + Jędrzejewski-Szmek in bpo-13609(8).) + + * New functions to support Linux extended attributes (bpo-12720(9)): + *note getxattr(): daf, *note listxattr(): db0, *note removexattr(): + db1, *note setxattr(): db2. + + * New interface to the scheduler. These functions control how a + process is allocated CPU time by the operating system. New + functions: *note sched_get_priority_max(): db3, *note + sched_get_priority_min(): db4, *note sched_getaffinity(): db5, + *note sched_getparam(): db6, *note sched_getscheduler(): db7, *note + sched_rr_get_interval(): db8, *note sched_setaffinity(): db9, *note + sched_setparam(): dba, *note sched_setscheduler(): dbb, *note + sched_yield(): dbc, + + * New functions to control the file system: + + * *note posix_fadvise(): a11.: Announces an intention to access + data in a specific pattern thus allowing the kernel to make + optimizations. + + * *note posix_fallocate(): a12.: Ensures that enough disk space + is allocated for a file. + + * *note sync(): dbd.: Force write of everything to disk. + + * Additional new posix functions: + + * *note lockf(): dbe.: Apply, test or remove a POSIX lock on an + open file descriptor. + + * *note pread(): 7bb.: Read from a file descriptor at an offset, + the file offset remains unchanged. + + * *note pwrite(): 7be.: Write to a file descriptor from an + offset, leaving the file offset unchanged. + + * *note readv(): 7ba.: Read from a file descriptor into a number + of writable buffers. + + * *note truncate(): ac0.: Truncate the file corresponding to + `path', so that it is at most `length' bytes in size. + + * *note waitid(): a17.: Wait for the completion of one or more + child processes. + + * *note writev(): 7bd.: Write the contents of `buffers' to a + file descriptor, where `buffers' is an arbitrary sequence of + buffers. + + * *note getgrouplist(): dbf. (bpo-9344(10)): Return list of + group ids that specified user belongs to. + + * *note times(): dc0. and *note uname(): dc1.: Return type changed + from a tuple to a tuple-like object with named attributes. + + * Some platforms now support additional constants for the *note + lseek(): dc2. function, such as ‘os.SEEK_HOLE’ and ‘os.SEEK_DATA’. + + * New constants *note RTLD_LAZY: dc3, *note RTLD_NOW: dc4, *note + RTLD_GLOBAL: dc5, *note RTLD_LOCAL: dc6, *note RTLD_NODELETE: dc7, + *note RTLD_NOLOAD: dc8, and *note RTLD_DEEPBIND: dc9. are available + on platforms that support them. These are for use with the *note + sys.setdlopenflags(): dca. function, and supersede the similar + constants defined in *note ctypes: 29. and ‘DLFCN’. (Contributed + by Victor Stinner in bpo-13226(11).) + + * *note os.symlink(): da0. now accepts (and ignores) the + ‘target_is_directory’ keyword argument on non-Windows platforms, to + ease cross-platform support. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10882 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=4761 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=10755 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=14626 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=10784 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=8828 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=14127 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=13609 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=12720 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=9344 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=13226 + + +File: python.info, Node: pdb<5>, Next: pickle<5>, Prev: os<10>, Up: Improved Modules<9> + +1.9.20.35 pdb +............. + +Tab-completion is now available not only for command names, but also +their arguments. For example, for the ‘break’ command, function and +file names are completed. + +(Contributed by Georg Brandl in bpo-14210(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14210 + + +File: python.info, Node: pickle<5>, Next: pydoc<5>, Prev: pdb<5>, Up: Improved Modules<9> + +1.9.20.36 pickle +................ + +*note pickle.Pickler: 66a. objects now have an optional *note +dispatch_table: dcd. attribute allowing per-pickler reduction functions +to be set. + +(Contributed by Richard Oudkerk in bpo-14166(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14166 + + +File: python.info, Node: pydoc<5>, Next: re<7>, Prev: pickle<5>, Up: Improved Modules<9> + +1.9.20.37 pydoc +............... + +The Tk GUI and the ‘serve()’ function have been removed from the *note +pydoc: d6. module: ‘pydoc -g’ and ‘serve()’ have been deprecated in +Python 3.2. + + +File: python.info, Node: re<7>, Next: sched, Prev: pydoc<5>, Up: Improved Modules<9> + +1.9.20.38 re +............ + +*note str: 1b3. regular expressions now support ‘\u’ and ‘\U’ escapes. + +(Contributed by Serhiy Storchaka in bpo-3665(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=3665 + + +File: python.info, Node: sched, Next: select<2>, Prev: re<7>, Up: Improved Modules<9> + +1.9.20.39 sched +............... + + * *note run(): dd1. 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 *note scheduler: dd2. in + non-blocking applications. (Contributed by Giampaolo Rodolà in + bpo-13449(1).) + + * *note scheduler: dd2. class can now be safely used in + multi-threaded environments. (Contributed by Josiah Carlson and + Giampaolo Rodolà in bpo-8684(2).) + + * `timefunc' and `delayfunct' parameters of *note scheduler: dd2. + class constructor are now optional and defaults to *note + time.time(): 736. and *note time.sleep(): 266. respectively. + (Contributed by Chris Clark in bpo-13245(3).) + + * *note enter(): dd3. and *note enterabs(): dd4. `argument' parameter + is now optional. (Contributed by Chris Clark in bpo-13245(4).) + + * *note enter(): dd3. and *note enterabs(): dd4. now accept a + `kwargs' parameter. (Contributed by Chris Clark in bpo-13245(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13449 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=8684 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13245 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13245 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=13245 + + +File: python.info, Node: select<2>, Next: shlex<3>, Prev: sched, Up: Improved Modules<9> + +1.9.20.40 select +................ + +Solaris and derivative platforms have a new class *note select.devpoll: +c33. for high performance asynchronous sockets via ‘/dev/poll’. +(Contributed by Jesús Cea Avión in bpo-6397(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6397 + + +File: python.info, Node: shlex<3>, Next: shutil<5>, Prev: select<2>, Up: Improved Modules<9> + +1.9.20.41 shlex +............... + +The previously undocumented helper function ‘quote’ from the *note +pipes: c9. modules has been moved to the *note shlex: e5. module and +documented. *note quote(): dd7. properly escapes all characters in a +string that might be otherwise given special meaning by the shell. + + +File: python.info, Node: shutil<5>, Next: signal<4>, Prev: shlex<3>, Up: Improved Modules<9> + +1.9.20.42 shutil +................ + + * New functions: + + * *note disk_usage(): dd9.: provides total, used and free disk + space statistics. (Contributed by Giampaolo Rodolà in + bpo-12442(1).) + + * *note chown(): dda.: 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(2).) + + * *note shutil.get_terminal_size(): dae.: returns the size of + the terminal window to which the interpreter is attached. + (Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609(3).) + + * *note copy2(): 6ab. and *note copystat(): ddb. 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(4) and bpo-15238(5).) + + * Several functions now take an optional ‘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(6).) + + * When copying files to a different file system, *note move(): 6ac. + now handles symlinks the way the posix ‘mv’ command does, + recreating the symlink rather than copying the target file + contents. (Contributed by Jonathan Niehof in bpo-9993(7).) *note + move(): 6ac. now also returns the ‘dst’ argument as its result. + + * *note rmtree(): 23f. is now resistant to symlink attacks on + platforms which support the new ‘dir_fd’ parameter in *note + os.open(): a10. and *note os.unlink(): da1. (Contributed by Martin + von Löwis and Hynek Schlawack in bpo-4489(8).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12442 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=12191 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13609 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=14127 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=15238 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=12715 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=9993 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=4489 + + +File: python.info, Node: signal<4>, Next: smtpd<3>, Prev: shutil<5>, Up: Improved Modules<9> + +1.9.20.43 signal +................ + + * The *note signal: e7. module has new functions: + + * *note pthread_sigmask(): ddd.: fetch and/or change the signal + mask of the calling thread (Contributed by Jean-Paul Calderone + in bpo-8407(1)); + + * *note pthread_kill(): dde.: send a signal to a thread; + + * *note sigpending(): ddf.: examine pending functions; + + * *note sigwait(): de0.: wait a signal; + + * *note sigwaitinfo(): a2a.: wait for a signal, returning + detailed information about it; + + * *note sigtimedwait(): a29.: like *note sigwaitinfo(): a2a. but + with a timeout. + + * 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. + + * *note signal.signal(): de1. and *note signal.siginterrupt(): de2. + raise an OSError, instead of a RuntimeError: OSError has an errno + attribute. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8407 + + +File: python.info, Node: smtpd<3>, Next: smtplib<4>, Prev: signal<4>, Up: Improved Modules<9> + +1.9.20.44 smtpd +............... + +The *note smtpd: e9. module now supports RFC 5321(1) (extended SMTP) and +RFC 1870(2) (size extension). Per the standard, these extensions are +enabled if and only if the client initiates the session with an ‘EHLO’ +command. + +(Initial ‘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(3)) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc5321.html + + (2) https://datatracker.ietf.org/doc/html/rfc1870.html + + (3) https://bugs.python.org/issue?@action=redirect&bpo=8739 + + +File: python.info, Node: smtplib<4>, Next: socket<10>, Prev: smtpd<3>, Up: Improved Modules<9> + +1.9.20.45 smtplib +................. + +The *note SMTP: 575, *note SMTP_SSL: 576, and *note LMTP: 577. classes +now accept a ‘source_address’ keyword argument to specify the ‘(host, +port)’ to use as the source address in the bind call when creating the +outgoing socket. (Contributed by Paulo Scardine in bpo-11281(1).) + +*note SMTP: 575. now supports the context management protocol, allowing +an ‘SMTP’ instance to be used in a ‘with’ statement. (Contributed by +Giampaolo Rodolà in bpo-11289(2).) + +The *note SMTP_SSL: 576. constructor and the *note starttls(): de5. +method now accept an SSLContext parameter to control parameters of the +secure channel. (Contributed by Kasun Herath in bpo-8809(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11281 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=11289 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=8809 + + +File: python.info, Node: socket<10>, Next: socketserver<3>, Prev: smtplib<4>, Up: Improved Modules<9> + +1.9.20.46 socket +................ + + * The *note socket: a1f. class now exposes additional methods to + process ancillary data when supported by the underlying platform: + + * *note sendmsg(): a27. + + * *note recvmsg(): a24. + + * *note recvmsg_into(): de7. + + (Contributed by David Watson in bpo-6560(1), based on an earlier + patch by Heiko Wundram) + + * The *note socket: a1f. class now supports the PF_CAN protocol + family (‘https://en.wikipedia.org/wiki/Socketcan’), on Linux + (‘https://lwn.net/Articles/253425’). + + (Contributed by Matthias Fuchs, updated by Tiago Gonçalves in + bpo-10141(2).) + + * The *note socket: a1f. class now supports the PF_RDS protocol + family (‘https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets’ + and ‘https://oss.oracle.com/projects/rds/’). + + * The *note socket: a1f. class now supports the ‘PF_SYSTEM’ protocol + family on OS X. (Contributed by Michael Goderbauer in + bpo-13777(3).) + + * New function *note sethostname(): de8. allows the hostname to be + set on Unix systems if the calling process has sufficient + privileges. (Contributed by Ross Lagerwall in bpo-10866(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6560 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10141 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13777 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=10866 + + +File: python.info, Node: socketserver<3>, Next: sqlite3<7>, Prev: socket<10>, Up: Improved Modules<9> + +1.9.20.47 socketserver +...................... + +*note BaseServer: dea. now has an overridable method *note +service_actions(): deb. that is called by the *note serve_forever(): +dec. method in the service loop. *note ForkingMixIn: 7d6. now uses this +to clean up zombie child processes. (Contributed by Justin Warkentin in +bpo-11109(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11109 + + +File: python.info, Node: sqlite3<7>, Next: ssl<9>, Prev: socketserver<3>, Up: Improved Modules<9> + +1.9.20.48 sqlite3 +................. + +New *note sqlite3.Connection: 24c. method *note set_trace_callback(): +dee. can be used to capture a trace of all sql commands processed by +sqlite. (Contributed by Torsten Landschoff in bpo-11688(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11688 + + +File: python.info, Node: ssl<9>, Next: stat<2>, Prev: sqlite3<7>, Up: Improved Modules<9> + +1.9.20.49 ssl +............. + + * The *note ssl: f0. module has two new random generation functions: + + * *note RAND_bytes(): df0.: generate cryptographically strong + pseudo-random bytes. + + * *note RAND_pseudo_bytes(): 493.: generate pseudo-random bytes. + + (Contributed by Victor Stinner in bpo-12049(1).) + + * The *note ssl: f0. 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(2).) + + * *note load_cert_chain(): df1. now accepts a `password' argument to + be used if the private key is encrypted. (Contributed by Adam + Simpkins in bpo-12803(3).) + + * Diffie-Hellman key exchange, both regular and Elliptic Curve-based, + is now supported through the *note load_dh_params(): df2. and *note + set_ecdh_curve(): df3. methods. (Contributed by Antoine Pitrou in + bpo-13626(4) and bpo-13627(5).) + + * SSL sockets have a new *note get_channel_binding(): df4. method + allowing the implementation of certain authentication mechanisms + such as SCRAM-SHA-1-PLUS. (Contributed by Jacek Konieczny in + bpo-12551(6).) + + * You can query the SSL compression algorithm used by an SSL socket, + thanks to its new *note compression(): df5. method. The new + attribute *note OP_NO_COMPRESSION: df6. can be used to disable + compression. (Contributed by Antoine Pitrou in bpo-13634(7).) + + * Support has been added for the Next Protocol Negotiation extension + using the *note ssl.SSLContext.set_npn_protocols(): 495. method. + (Contributed by Colin Marc in bpo-14204(8).) + + * SSL errors can now be introspected more easily thanks to *note + library: df7. and *note reason: df8. attributes. (Contributed by + Antoine Pitrou in bpo-14837(9).) + + * The *note get_server_certificate(): 431. function now supports + IPv6. (Contributed by Charles-François Natali in bpo-11811(10).) + + * New attribute *note OP_CIPHER_SERVER_PREFERENCE: df9. allows + setting SSLv3 server sockets to use the server’s cipher ordering + preference rather than the client’s (bpo-13635(11)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12049 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=11183 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=12803 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13626 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=13627 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=12551 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=13634 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=14204 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=14837 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=11811 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=13635 + + +File: python.info, Node: stat<2>, Next: struct<3>, Prev: ssl<9>, Up: Improved Modules<9> + +1.9.20.50 stat +.............. + +The undocumented tarfile.filemode function has been moved to *note +stat.filemode(): dfb. It can be used to convert a file’s mode to a +string of the form ‘-rwxrwxrwx’. + +(Contributed by Giampaolo Rodolà in bpo-14807(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14807 + + +File: python.info, Node: struct<3>, Next: subprocess<5>, Prev: stat<2>, Up: Improved Modules<9> + +1.9.20.51 struct +................ + +The *note struct: f5. module now supports ‘ssize_t’ and ‘size_t’ via the +new codes ‘n’ and ‘N’, respectively. (Contributed by Antoine Pitrou in +bpo-3163(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=3163 + + +File: python.info, Node: subprocess<5>, Next: sys<10>, Prev: struct<3>, Up: Improved Modules<9> + +1.9.20.52 subprocess +.................... + +Command strings can now be bytes objects on posix platforms. +(Contributed by Victor Stinner in bpo-8513(1).) + +A new constant *note DEVNULL: dfe. allows suppressing output in a +platform-independent fashion. (Contributed by Ross Lagerwall in +bpo-5870(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8513 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5870 + + +File: python.info, Node: sys<10>, Next: tarfile<4>, Prev: subprocess<5>, Up: Improved Modules<9> + +1.9.20.53 sys +............. + +The *note sys: f9. module has a new *note thread_info: e00. *note named +tuple: 221. holding information about the thread implementation +(bpo-11223(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=11223 + + +File: python.info, Node: tarfile<4>, Next: tempfile, Prev: sys<10>, Up: Improved Modules<9> + +1.9.20.54 tarfile +................. + +*note tarfile: fd. now supports ‘lzma’ encoding via the *note lzma: ab. +module. (Contributed by Lars Gustäbel in bpo-5689(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5689 + + +File: python.info, Node: tempfile, Next: textwrap<2>, Prev: tarfile<4>, Up: Improved Modules<9> + +1.9.20.55 tempfile +.................. + +*note tempfile.SpooledTemporaryFile: e03.’s ‘truncate()’ method now +accepts a ‘size’ parameter. (Contributed by Ryan Kelly in bpo-9957(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9957 + + +File: python.info, Node: textwrap<2>, Next: threading<7>, Prev: tempfile, Up: Improved Modules<9> + +1.9.20.56 textwrap +.................. + +The *note textwrap: 10a. module has a new *note indent(): e05. that +makes it straightforward to add a common prefix to selected lines in a +block of text (bpo-13857(1)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13857 + + +File: python.info, Node: threading<7>, Next: time<7>, Prev: textwrap<2>, Up: Improved Modules<9> + +1.9.20.57 threading +................... + +*note threading.Condition: e07, *note threading.Semaphore: e08, *note +threading.BoundedSemaphore: e09, *note threading.Event: e0a, and *note +threading.Timer: e0b, 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(1).) + +The *note threading.Thread: 59b. constructor now accepts a ‘daemon’ +keyword argument to override the default behavior of inheriting the +‘daemon’ flag value from the parent thread (bpo-6064(2)). + +The formerly private function ‘_thread.get_ident’ is now available as +the public function *note threading.get_ident(): e0c. This eliminates +several cases of direct access to the ‘_thread’ module in the stdlib. +Third party code that used ‘_thread.get_ident’ should likewise be +changed to use the new public interface. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10968 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=6064 + + +File: python.info, Node: time<7>, Next: types<5>, Prev: threading<7>, Up: Improved Modules<9> + +1.9.20.58 time +.............. + +The PEP 418(1) added new functions to the *note time: 10c. module: + + * *note get_clock_info(): e0e.: Get information on a clock. + + * *note monotonic(): b0a.: Monotonic clock (cannot go backward), not + affected by system clock updates. + + * *note perf_counter(): 6da.: Performance counter with the highest + available resolution to measure a short duration. + + * *note process_time(): 6db.: Sum of the system and user CPU time of + the current process. + +Other new functions: + + * *note clock_getres(): e0f, *note clock_gettime(): e10. and *note + clock_settime(): e11. functions with ‘CLOCK_xxx’ constants. + (Contributed by Victor Stinner in bpo-10278(2).) + +To improve cross platform consistency, *note sleep(): 266. now raises a +*note ValueError: 1c8. when passed a negative sleep value. Previously +this was an error on posix, but produced an infinite sleep on Windows. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0418/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10278 + + +File: python.info, Node: types<5>, Next: unittest<7>, Prev: time<7>, Up: Improved Modules<9> + +1.9.20.59 types +............... + +Add a new *note types.MappingProxyType: 3bb. class: Read-only proxy of a +mapping. (bpo-14386(1)) + +The new functions *note types.new_class(): e13. and *note +types.prepare_class(): e14. provide support for PEP 3115(2) compliant +dynamic type creation. (bpo-14588(3)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14386 + + (2) https://peps.python.org/pep-3115/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=14588 + + +File: python.info, Node: unittest<7>, Next: urllib<3>, Prev: types<5>, Up: Improved Modules<9> + +1.9.20.60 unittest +.................. + +*note assertRaises(): e16, *note assertRaisesRegex(): e17, *note +assertWarns(): e18, and *note assertWarnsRegex(): e19. now accept a +keyword argument `msg' when used as context managers. (Contributed by +Ezio Melotti and Winston Ewert in bpo-10775(1).) + +*note unittest.TestCase.run(): e1a. now returns the *note TestResult: +e1b. object. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10775 + + +File: python.info, Node: urllib<3>, Next: webbrowser, Prev: unittest<7>, Up: Improved Modules<9> + +1.9.20.61 urllib +................ + +The *note Request: c7a. class, now accepts a `method' argument used by +*note get_method(): e1d. to determine what HTTP method should be used. +For example, this will send a ‘'HEAD'’ request: + + >>> urlopen(Request('https://www.python.org', method='HEAD')) + +(bpo-1673007(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1673007 + + +File: python.info, Node: webbrowser, Next: xml etree ElementTree, Prev: urllib<3>, Up: Improved Modules<9> + +1.9.20.62 webbrowser +.................... + +The *note webbrowser: 133. module supports more “browsers”: Google +Chrome (named ‘chrome’, ‘chromium’, ‘chrome-browser’ or +‘chromium-browser’ depending on the version and operating system), and +the generic launchers ‘xdg-open’, from the FreeDesktop.org project, and +‘gvfs-open’, which is the default URI handler for GNOME 3. (The former +contributed by Arnaud Calmettes in bpo-13620(1), the latter by Matthias +Klose in bpo-14493(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13620 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=14493 + + +File: python.info, Node: xml etree ElementTree, Next: zlib<2>, Prev: webbrowser, Up: Improved Modules<9> + +1.9.20.63 xml.etree.ElementTree +............................... + +The *note xml.etree.ElementTree: 142. module now imports its C +accelerator by default; there is no longer a need to explicitly import +‘xml.etree.cElementTree’ (this module stays for backwards compatibility, +but is now deprecated). In addition, the ‘iter’ family of methods of +*note Element: 59e. has been optimized (rewritten in C). The module’s +documentation has also been greatly improved with added examples and a +more detailed reference. + + +File: python.info, Node: zlib<2>, Prev: xml etree ElementTree, Up: Improved Modules<9> + +1.9.20.64 zlib +.............. + +New attribute *note zlib.Decompress.eof: e21. makes it possible to +distinguish between a properly formed compressed stream and an +incomplete or truncated one. (Contributed by Nadeem Vawda in +bpo-12646(1).) + +New attribute *note zlib.ZLIB_RUNTIME_VERSION: e22. reports the version +string of the underlying ‘zlib’ library that is loaded at runtime. +(Contributed by Torsten Landschoff in bpo-12306(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12646 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=12306 + + +File: python.info, Node: Optimizations<8>, Next: Build and C API Changes<4>, Prev: Improved Modules<9>, Up: What’s New In Python 3 3 + +1.9.21 Optimizations +-------------------- + +Major performance enhancements have been added: + + * Thanks to PEP 393(1), some operations on Unicode strings have been + optimized: + + * the memory footprint is divided by 2 to 4 depending on the + text + + * encode an ASCII string to UTF-8 doesn’t need to encode + characters anymore, the UTF-8 representation is shared with + the ASCII representation + + * the UTF-8 encoder has been optimized + + * repeating a single ASCII letter and getting a substring of an + ASCII string is 4 times faster + + * UTF-8 is now 2x to 4x faster. UTF-16 encoding is now up to 10x + faster. + + (Contributed by Serhiy Storchaka, bpo-14624(2), bpo-14738(3) and + bpo-15026(4).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=14624 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=14738 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=15026 + + +File: python.info, Node: Build and C API Changes<4>, Next: Deprecated<10>, Prev: Optimizations<8>, Up: What’s New In Python 3 3 + +1.9.22 Build and C API Changes +------------------------------ + +Changes to Python’s build process and to the C API include: + + * New PEP 3118(1) related function: + + * *note PyMemoryView_FromMemory(): e24. + + * PEP 393(2) added new Unicode types, macros and functions: + + * High-level API: + + * *note PyUnicode_CopyCharacters(): 4f1. + + * *note PyUnicode_FindChar(): 4f6. + + * *note PyUnicode_GetLength(): 4ef, *note + PyUnicode_GET_LENGTH: 4f0. + + * *note PyUnicode_New(): 4e0. + + * *note PyUnicode_Substring(): 4f3. + + * *note PyUnicode_ReadChar(): e25, *note + PyUnicode_WriteChar(): e26. + + * Low-level API: + + * *note Py_UCS1: e27, *note Py_UCS2: e28, *note Py_UCS4: + e29. types + + * *note PyASCIIObject: e2a. and *note + PyCompactUnicodeObject: e2b. structures + + * *note PyUnicode_READY: 37d. + + * *note PyUnicode_FromKindAndData(): e2c. + + * *note PyUnicode_AsUCS4(): e2d, *note + PyUnicode_AsUCS4Copy(): 4f8. + + * *note PyUnicode_DATA: e2e, *note PyUnicode_1BYTE_DATA: + e2f, *note PyUnicode_2BYTE_DATA: e30, *note + PyUnicode_4BYTE_DATA: e31. + + * *note PyUnicode_KIND: e32. with ‘PyUnicode_Kind’ enum: + *note PyUnicode_WCHAR_KIND: 37e, *note + PyUnicode_1BYTE_KIND: e33, *note PyUnicode_2BYTE_KIND: + e34, *note PyUnicode_4BYTE_KIND: e35. + + * *note PyUnicode_READ: e36, *note PyUnicode_READ_CHAR: + e37, *note PyUnicode_WRITE: e38. + + * *note PyUnicode_MAX_CHAR_VALUE: e39. + + * *note PyArg_ParseTuple: 4d9. now accepts a *note bytearray: 1a5. + for the ‘c’ format (bpo-12380(3)). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3118/ + + (2) https://peps.python.org/pep-0393/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=12380 + + +File: python.info, Node: Deprecated<10>, Next: Porting to Python 3 3, Prev: Build and C API Changes<4>, Up: What’s New In Python 3 3 + +1.9.23 Deprecated +----------------- + +* Menu: + +* Unsupported Operating Systems: Unsupported Operating Systems<2>. +* Deprecated Python modules, 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:: + + +File: python.info, Node: Unsupported Operating Systems<2>, Next: Deprecated Python modules functions and methods<4>, Up: Deprecated<10> + +1.9.23.1 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 ‘COMSPEC’ to ‘command.com’ +are no longer supported due to maintenance burden. + +OSF support, which was deprecated in 3.2, has been completely removed. + + +File: python.info, Node: Deprecated Python modules functions and methods<4>, Next: Deprecated functions and types of the C API<3>, Prev: Unsupported Operating Systems<2>, Up: Deprecated<10> + +1.9.23.2 Deprecated Python modules, functions and methods +......................................................... + + * Passing a non-empty string to ‘object.__format__()’ is deprecated, + and will produce a *note TypeError: 19c. in Python 3.4 + (bpo-9856(1)). + + * The ‘unicode_internal’ codec has been deprecated because of the PEP + 393(2), use UTF-8, UTF-16 (‘utf-16-le’ or ‘utf-16-be’), or UTF-32 + (‘utf-32-le’ or ‘utf-32-be’) + + * *note ftplib.FTP.nlst(): d6e. and *note ftplib.FTP.dir(): d6f.: use + *note ftplib.FTP.mlsd(): d6d. + + * ‘platform.popen()’: use the *note subprocess: f6. module. Check + especially the *note Replacing Older Functions with the subprocess + Module: e3d. section (bpo-11377(3)). + + * bpo-13374(4): The Windows bytes API has been deprecated in the + *note os: c2. module. Use Unicode filenames, instead of bytes + filenames, to not depend on the ANSI code page anymore and to + support any filename. + + * bpo-13988(5): The ‘xml.etree.cElementTree’ module is deprecated. + The accelerator is used automatically whenever available. + + * The behaviour of ‘time.clock()’ depends on the platform: use the + new *note time.perf_counter(): 6da. or *note time.process_time(): + 6db. function instead, depending on your requirements, to have a + well defined behaviour. + + * The ‘os.stat_float_times()’ function is deprecated. + + * *note abc: 3. module: + + * *note abc.abstractproperty: d36. has been deprecated, use + *note property: 205. with *note abc.abstractmethod(): d37. + instead. + + * *note abc.abstractclassmethod: d38. has been deprecated, use + *note classmethod: 18d. with *note abc.abstractmethod(): d37. + instead. + + * *note abc.abstractstaticmethod: d39. has been deprecated, use + *note staticmethod: 3c8. with *note abc.abstractmethod(): d37. + instead. + + * *note importlib: 97. package: + + * *note importlib.abc.SourceLoader.path_mtime(): e3e. is now + deprecated in favour of *note + importlib.abc.SourceLoader.path_stats(): e3f. as bytecode + files now store both the modification time and size of the + source file the bytecode file was compiled from. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9856 + + (2) https://peps.python.org/pep-0393/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=11377 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13374 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=13988 + + +File: python.info, Node: Deprecated functions and types of the C API<3>, Next: Deprecated features, Prev: Deprecated Python modules functions and methods<4>, Up: Deprecated<10> + +1.9.23.3 Deprecated functions and types of the C API +.................................................... + +The *note Py_UNICODE: 388. has been deprecated by PEP 393(1) and will be +removed in Python 4. All functions using this type are deprecated: + +Unicode functions and methods using *note Py_UNICODE: 388. and *note +Py_UNICODE: 388.* types: + + * *note PyUnicode_FromUnicode: 379.: use *note + PyUnicode_FromWideChar(): e41. or *note + PyUnicode_FromKindAndData(): e2c. + + * *note PyUnicode_AS_UNICODE: 376, *note PyUnicode_AsUnicode(): 378, + *note PyUnicode_AsUnicodeAndSize(): 377.: use *note + PyUnicode_AsWideCharString(): 4f9. + + * *note PyUnicode_AS_DATA: 375.: use *note PyUnicode_DATA: e2e. with + *note PyUnicode_READ: e36. and *note PyUnicode_WRITE: e38. + + * *note PyUnicode_GET_SIZE: 37b, *note PyUnicode_GetSize(): 37c.: use + *note PyUnicode_GET_LENGTH: 4f0. or *note PyUnicode_GetLength(): + 4ef. + + * *note PyUnicode_GET_DATA_SIZE: 37a.: use ‘PyUnicode_GET_LENGTH(str) + * PyUnicode_KIND(str)’ (only work on ready strings) + + * ‘PyUnicode_AsUnicodeCopy()’: use *note PyUnicode_AsUCS4Copy(): 4f8. + or *note PyUnicode_AsWideCharString(): 4f9. + + * ‘PyUnicode_GetMax()’ + +Functions and macros manipulating Py_UNICODE* strings: + + * ‘Py_UNICODE_strlen’: use *note PyUnicode_GetLength(): 4ef. or *note + PyUnicode_GET_LENGTH: 4f0. + + * ‘Py_UNICODE_strcat’: use *note PyUnicode_CopyCharacters(): 4f1. or + *note PyUnicode_FromFormat(): 4f2. + + * ‘Py_UNICODE_strcpy’, ‘Py_UNICODE_strncpy’, ‘Py_UNICODE_COPY’: use + *note PyUnicode_CopyCharacters(): 4f1. or *note + PyUnicode_Substring(): 4f3. + + * ‘Py_UNICODE_strcmp’: use *note PyUnicode_Compare(): 4f4. + + * ‘Py_UNICODE_strncmp’: use *note PyUnicode_Tailmatch(): 4f5. + + * ‘Py_UNICODE_strchr’, ‘Py_UNICODE_strrchr’: use *note + PyUnicode_FindChar(): 4f6. + + * ‘Py_UNICODE_FILL’: use *note PyUnicode_Fill(): e42. + + * ‘Py_UNICODE_MATCH’ + +Encoders: + + * ‘PyUnicode_Encode()’: use ‘PyUnicode_AsEncodedObject()’ + + * ‘PyUnicode_EncodeUTF7()’ + + * ‘PyUnicode_EncodeUTF8()’: use *note PyUnicode_AsUTF8(): 81e. or + *note PyUnicode_AsUTF8String(): e43. + + * ‘PyUnicode_EncodeUTF32()’ + + * ‘PyUnicode_EncodeUTF16()’ + + * ‘PyUnicode_EncodeUnicodeEscape()’ use *note + PyUnicode_AsUnicodeEscapeString(): e44. + + * ‘PyUnicode_EncodeRawUnicodeEscape()’ use *note + PyUnicode_AsRawUnicodeEscapeString(): e45. + + * ‘PyUnicode_EncodeLatin1()’: use *note PyUnicode_AsLatin1String(): + e46. + + * ‘PyUnicode_EncodeASCII()’: use *note PyUnicode_AsASCIIString(): + e47. + + * ‘PyUnicode_EncodeCharmap()’ + + * ‘PyUnicode_TranslateCharmap()’ + + * ‘PyUnicode_EncodeMBCS()’: use *note PyUnicode_AsMBCSString(): e48. + or *note PyUnicode_EncodeCodePage(): e49. (with ‘CP_ACP’ code_page) + + * ‘PyUnicode_EncodeDecimal()’, ‘PyUnicode_TransformDecimalToASCII()’ + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + +File: python.info, Node: Deprecated features, Prev: Deprecated functions and types of the C API<3>, Up: Deprecated<10> + +1.9.23.4 Deprecated features +............................ + +The *note array: 6. module’s ‘'u'’ format code is now deprecated and +will be removed in Python 4 together with the rest of the (*note +Py_UNICODE: 388.) API. + + +File: python.info, Node: Porting to Python 3 3, Prev: Deprecated<10>, Up: What’s New In Python 3 3 + +1.9.24 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:: + + +File: python.info, Node: Porting Python code, Next: Porting C code, Up: Porting to Python 3 3 + +1.9.24.1 Porting Python code +............................ + + * Hash randomization is enabled by default. Set the *note + PYTHONHASHSEED: d2e. environment variable to ‘0’ to disable hash + randomization. See also the *note object.__hash__(): 750. method. + + * bpo-12326(1): 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. + + * bpo-13847(2), bpo-14180(3): *note time: 10c. and *note datetime: + 2f.: *note OverflowError: 4a4. is now raised instead of *note + ValueError: 1c8. if a timestamp is out of range. *note OSError: + 413. is now raised if C functions ‘gmtime()’ or ‘localtime()’ + failed. + + * 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 *note + importlib.invalidate_caches(): 87a. to clear out the cache for the + finders to notice the new file. + + * *note ImportError: 511. 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. + + * The `index' argument to *note __import__(): 510. now defaults to 0 + instead of -1 and no longer support negative values. It was an + oversight when PEP 328(4) 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 *note + importlib.import_module(): e4d. rather than call *note + __import__(): 510. directly. + + * *note __import__(): 510. no longer allows one to use an index value + other than 0 for top-level modules. E.g. ‘__import__('sys', + level=1)’ is now an error. + + * Because *note sys.meta_path: 9a0. and *note sys.path_hooks: cd0. + now have finders on them by default, you will most likely want to + use ‘list.insert()’ instead of ‘list.append()’ to add to those + lists. + + * Because ‘None’ is now inserted into *note sys.path_importer_cache: + 1b2, 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 ‘None’ `and' *note imp.NullImporter: d26. to be + backwards-compatible. This will lead to extra overhead on older + versions of Python that re-insert ‘None’ into *note + sys.path_importer_cache: 1b2. where it represents the use of + implicit finders, but semantically it should not change anything. + + * *note importlib.abc.Finder: 472. no longer specifies a + ‘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 ‘find_loader()’ first, though, in the case of working + with *note path entry finders: d20. + + * *note pkgutil: ca. has been converted to use *note importlib: 97. + internally. This eliminates many edge cases where the old + behaviour of the PEP 302(5) import emulation failed to match the + behaviour of the real import system. The import emulation itself + is still present, but is now deprecated. The *note + pkgutil.iter_importers(): e4e. and *note pkgutil.walk_packages(): + 869. functions special case the standard import hooks so they are + still supported even though they do not provide the non-standard + ‘iter_modules()’ method. + + * A longstanding RFC-compliance bug (bpo-1079(6)) in the parsing done + by *note email.header.decode_header(): d62. has been fixed. Code + that uses the standard idiom to convert encoded headers into + unicode (‘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 + ‘ASCII’ sections is now included in the ‘ASCII’ section. Code that + builds headers using ‘make_header’ should also continue to work + without change, since ‘make_header’ continues to add whitespace + between ‘ASCII’ and non-‘ASCII’ sections if it is not already + present in the input strings. + + * *note email.utils.formataddr(): e4f. now does the correct content + transfer encoding when passed non-‘ASCII’ display names. Any code + that depended on the previous buggy behavior that preserved the + non-‘ASCII’ unicode in the formatted output string will need to be + changed (bpo-1690608(7)). + + * *note poplib.POP3.quit(): e50. may now raise protocol errors like + all other ‘poplib’ methods. Code that assumes ‘quit’ does not + raise *note poplib.error_proto: e51. errors may need to be changed + if errors on ‘quit’ are encountered by a particular application + (bpo-11291(8)). + + * The ‘strict’ argument to *note email.parser.Parser: e52, deprecated + since Python 2.4, has finally been removed. + + * The deprecated method ‘unittest.TestCase.assertSameElements’ has + been removed. + + * The deprecated variable ‘time.accept2dyear’ has been removed. + + * The deprecated ‘Context._clamp’ attribute has been removed from the + *note decimal: 34. module. It was previously replaced by the + public attribute ‘clamp’. (See bpo-8540(9).) + + * The undocumented internal helper class ‘SSLFakeFile’ has been + removed from *note smtplib: ea, since its functionality has long + been provided directly by *note socket.socket.makefile(): e53. + + * Passing a negative value to *note time.sleep(): 266. on Windows now + raises an error instead of sleeping forever. It has always raised + an error on posix. + + * The ‘ast.__version__’ constant has been removed. If you need to + make decisions affected by the AST version, use *note + sys.version_info: 27d. to make the decision. + + * Code that used to work around the fact that the *note threading: + 10b. module used factory functions by subclassing the private + classes will need to change to subclass the now-public classes. + + * 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(10)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=12326 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=13847 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=14180 + + (4) https://peps.python.org/pep-0328/ + + (5) https://peps.python.org/pep-0302/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1079 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=1690608 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=11291 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=8540 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=13550 + + +File: python.info, Node: Porting C code, Next: Building C extensions, Prev: Porting Python code, Up: Porting to Python 3 3 + +1.9.24.2 Porting C code +....................... + + * In the course of changes to the buffer API the undocumented + ‘smalltable’ member of the *note Py_buffer: 327. structure has been + removed and the layout of the ‘PyMemoryViewObject’ has changed. + + All extensions relying on the relevant parts in ‘memoryobject.h’ or + ‘object.h’ must be rebuilt. + + * Due to *note PEP 393: ced, the *note Py_UNICODE: 388. 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 PEP 393(1), you have to + convert your code to the new *note Unicode API: e54. + + However, if you only have been using high-level functions such as + *note PyUnicode_Concat(): e55, *note PyUnicode_Join(): e56. or + *note PyUnicode_FromFormat(): 4f2, your code will automatically + take advantage of the new unicode representations. + + * *note PyImport_GetMagicNumber(): e57. now returns ‘-1’ upon + failure. + + * As a negative value for the `level' argument to *note __import__(): + 510. is no longer valid, the same now holds for *note + PyImport_ImportModuleLevel(): e58. This also means that the value + of `level' used by *note PyImport_ImportModuleEx(): e59. is now ‘0’ + instead of ‘-1’. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + +File: python.info, Node: Building C extensions, Next: Command Line Switch Changes, Prev: Porting C code, Up: Porting to Python 3 3 + +1.9.24.3 Building C extensions +.............................. + + * The range of possible file names for C extensions has been + narrowed. Very rarely used spellings have been suppressed: under + POSIX, files named ‘xxxmodule.so’, ‘xxxmodule.abi3.so’ and + ‘xxxmodule.cpython-*.so’ are no longer recognized as implementing + the ‘xxx’ module. If you had been generating such files, you have + to switch to the other spellings (i.e., remove the ‘module’ string + from the file names). + + (implemented in bpo-14040(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14040 + + +File: python.info, Node: Command Line Switch Changes, Prev: Building C extensions, Up: Porting to Python 3 3 + +1.9.24.4 Command Line Switch Changes +.................................... + + * The -Q command-line flag and related artifacts have been removed. + Code checking sys.flags.division_warning will need updating. + + (bpo-10998(1), contributed by Éric Araujo.) + + * When ‘python’ is started with *note -S: e5c, ‘import site’ will no + longer add site-specific paths to the module search paths. In + previous versions, it did. + + (bpo-11591(2), contributed by Carl Meyer with editions by Éric + Araujo.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10998 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=11591 + + +File: python.info, Node: What’s New In Python 3 2, Next: What’s New In Python 3 1, Prev: What’s New In Python 3 3, Up: What’s New in Python + +1.10 What’s New In Python 3.2 +============================= + + +Author: Raymond Hettinger + +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(1) file. + +See also +........ + +PEP 392(2) - 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<10>. +* New, Improved, and Deprecated Modules: New Improved and Deprecated Modules. +* Multi-threading:: +* Optimizations: Optimizations<9>. +* 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. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/blob/076ca6c3c8df3030307e548d9be792ce3c1c6eea/Misc/NEWS + + (2) https://peps.python.org/pep-0392/ + + +File: python.info, Node: PEP 384 Defining a Stable ABI, Next: PEP 389 Argparse Command Line Parsing Module, Up: What’s New In Python 3 2 + +1.10.1 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. + +See also +........ + +PEP 384(1) - Defining a Stable ABI + + PEP written by Martin von Löwis. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0384/ + + +File: python.info, Node: PEP 389 Argparse Command Line Parsing Module, Next: PEP 391 Dictionary Based Configuration for Logging, Prev: PEP 384 Defining a Stable ABI, Up: What’s New In Python 3 2 + +1.10.2 PEP 389: Argparse Command Line Parsing Module +---------------------------------------------------- + +A new module for command line parsing, *note argparse: 5, was introduced +to overcome the limitations of *note optparse: c1. 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 +*note argparse: 5. 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: + + 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') + +Example of calling the parser on a command string: + + >>> 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' + +Example of the parser’s automatically generated help: + + >>> 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 + +An especially nice *note argparse: 5. feature is the ability to define +subparsers, each with their own argument patterns and help displays: + + 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) + + $ ./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 + +See also +........ + +PEP 389(1) - New Command Line Parsing Module + + PEP written by Steven Bethard. + +*note Upgrading optparse code: e61. for details on the differences from +*note optparse: c1. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0389/ + + +File: python.info, Node: PEP 391 Dictionary Based Configuration for Logging, Next: PEP 3148 The concurrent futures module, Prev: PEP 389 Argparse Command Line Parsing Module, Up: What’s New In Python 3 2 + +1.10.3 PEP 391: Dictionary Based Configuration for Logging +---------------------------------------------------------- + +The *note logging: a8. 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 ‘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 *note +logging.config.dictConfig(): e63. 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: + + {"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"]}} + +If that dictionary is stored in a file called ‘conf.json’, it can be +loaded and called with code like this: + + >>> 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 + +See also +........ + +PEP 391(1) - Dictionary Based Configuration for Logging + + PEP written by Vinay Sajip. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0391/ + + +File: python.info, Node: PEP 3148 The concurrent futures module, Next: PEP 3147 PYC Repository Directories, Prev: PEP 391 Dictionary Based Configuration for Logging, Up: What’s New In Python 3 2 + +1.10.4 PEP 3148: The ‘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 *note concurrent.futures: 20. was inspired by the +`java.util.concurrent' package. In that model, a running call and its +result are represented by a *note Future: e65. 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: *note +submit(): 6d4. for scheduling a callable and returning a *note Future: +e65. object; *note map(): a65. for scheduling many asynchronous calls at +a time, and *note shutdown(): 52d. for freeing resources. The class is +a *note context manager: 1a0. and can be used in a *note with: 19e. +statement to assure that resources are automatically released when +currently pending futures are done executing. + +A simple of example of *note ThreadPoolExecutor: 311. is a launch of +four parallel threads for copying files: + + 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') + +See also +........ + +PEP 3148(1) - Futures – Execute Computations Asynchronously + + PEP written by Brian Quinlan. + +*note Code for Threaded Parallel URL reads: e66, an example using +threads to fetch multiple web pages in parallel. + +*note Code for computing prime numbers in parallel: e67, an example +demonstrating *note ProcessPoolExecutor: 52e. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3148/ + + +File: python.info, Node: PEP 3147 PYC Repository Directories, Next: PEP 3149 ABI Version Tagged so Files, Prev: PEP 3148 The concurrent futures module, Up: What’s New In Python 3 2 + +1.10.5 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: + + * Imported modules now have a *note __cached__: e69. attribute which + stores the name of the actual file that was imported: + + >>> import collections + >>> collections.__cached__ + 'c:/py32/lib/__pycache__/collections.cpython-32.pyc' + + * The tag that is unique to each interpreter is accessible from the + *note imp: 96. module: + + >>> import imp + >>> imp.get_tag() + 'cpython-32' + + * 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 *note imp: 96. module: + + >>> 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' + + * The *note py_compile: d4. and *note compileall: 1f. modules have + been updated to reflect the new naming convention and target + directory. The command-line invocation of `compileall' has new + options: ‘-i’ for specifying a list of files and directories to + compile and ‘-b’ which causes bytecode files to be written to their + legacy location rather than `__pycache__'. + + * The *note importlib.abc: 98. module has been updated with new *note + abstract base classes: e6a. for loading bytecode files. The + obsolete ABCs, ‘PyLoader’ and ‘PyPycLoader’, have been deprecated + (instructions on how to stay Python 3.1 compatible are included + with the documentation). + +See also +........ + +PEP 3147(1) - PYC Repository Directories + + PEP written by Barry Warsaw. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + +File: python.info, Node: PEP 3149 ABI Version Tagged so Files, Next: PEP 3333 Python Web Server Gateway Interface v1 0 1, Prev: PEP 3147 PYC Repository Directories, Up: What’s New In Python 3 2 + +1.10.6 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: + + /usr/share/pyshared/foo.cpython-32m.so + /usr/share/pyshared/foo.cpython-33md.so + +In Python itself, the tags are accessible from functions in the *note +sysconfig: fa. module: + + >>> 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' + +See also +........ + +PEP 3149(1) - ABI Version Tagged .so Files + + PEP written by Barry Warsaw. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3149/ + + +File: python.info, Node: PEP 3333 Python Web Server Gateway Interface v1 0 1, Next: Other Language Changes<10>, Prev: PEP 3149 ABI Version Tagged so Files, Up: What’s New In Python 3 2 + +1.10.7 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 *note str: 1b3. 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 *note str: 1b3. 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 ‘start_response()’ function. They must +follow RFC 2616(1) with respect to encoding. That is, they must either +be `ISO-8859-1' characters or use RFC 2047(2) MIME encoding. + +For developers porting WSGI applications from Python 2, here are the +salient points: + + * If the app already used strings for headers in Python 2, no change + is needed. + + * 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 + ‘h.encode('utf-8')’ now needs to convert from bytes to native + strings using ‘h.encode('utf-8').decode('latin-1')’. + + * Values yielded by an application or sent using the ‘write()’ method + must be byte strings. The ‘start_response()’ function and environ + must use native strings. The two cannot be mixed. + +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 *note wsgiref: 136. module has a +new function, *note wsgiref.handlers.read_environ(): e6d. for +transcoding CGI variables from *note os.environ: e6e. into native +strings and returning a new dictionary. + +See also +........ + +PEP 3333(3) - Python Web Server Gateway Interface v1.0.1 + + PEP written by Phillip Eby. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2616.html + + (2) https://datatracker.ietf.org/doc/html/rfc2047.html + + (3) https://peps.python.org/pep-3333/ + + +File: python.info, Node: Other Language Changes<10>, Next: New Improved and Deprecated Modules, Prev: PEP 3333 Python Web Server Gateway Interface v1 0 1, Up: What’s New In Python 3 2 + +1.10.8 Other Language Changes +----------------------------- + +Some smaller changes made to the core Python language are: + + * String formatting for *note format(): 1f7. and *note str.format(): + 1fc. 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. + + >>> format(20, '#o') + '0o24' + >>> format(12.34, '#5.0f') + ' 12.' + + (Suggested by Mark Dickinson and implemented by Eric Smith in + bpo-7094(1).) + + * There is also a new *note str.format_map(): a58. method that + extends the capabilities of the existing *note str.format(): 1fc. + method by accepting arbitrary *note mapping: e70. objects. This + new method makes it possible to use string formatting with any of + Python’s many dictionary-like objects such as *note defaultdict: + e71, *note Shelf: c38, *note ConfigParser: 887, or *note dbm: 30. + It is also useful with custom *note dict: 16e. subclasses that + normalize keys before look-up or that supply a ‘__missing__()’ + method for unknown keys: + + >>> 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 , welcome to ' + + (Suggested by Raymond Hettinger and implemented by Eric Smith in + bpo-6081(2).) + + * The interpreter can now be started with a quiet option, ‘-q’, to + prevent the copyright and version information from being displayed + in the interactive mode. The option can be introspected using the + *note sys.flags: 25d. attribute: + + $ 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) + + (Contributed by Marcin Wojdyr in bpo-1772833(3)). + + * The *note hasattr(): 836. function works by calling *note + getattr(): 837. and detecting whether an exception is raised. This + technique allows it to detect methods created dynamically by + ‘__getattr__()’ or ‘__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 *note AttributeError: 19d. and let + other exceptions pass through: + + >>> 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 + + (Discovered by Yury Selivanov and fixed by Benjamin Peterson; + bpo-9666(4).) + + * The *note str(): 1b3. of a float or complex number is now the same + as its *note repr(): 3ee. Previously, the *note str(): 1b3. form + was shorter but that just caused confusion and is no longer needed + now that the shortest possible *note repr(): 3ee. is displayed by + default: + + >>> import math + >>> repr(math.pi) + '3.141592653589793' + >>> str(math.pi) + '3.141592653589793' + + (Proposed and implemented by Mark Dickinson; bpo-9337(5).) + + * *note memoryview: 6ad. objects now have a *note release(): e72. + 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. + + >>> with memoryview(b'abcdefgh') as v: + ... print(v.tolist()) + [97, 98, 99, 100, 101, 102, 103, 104] + + (Added by Antoine Pitrou; bpo-9757(6).) + + * Previously it was illegal to delete a name from the local namespace + if it occurs as a free variable in a nested block: + + def outer(x): + def inner(): + return x + inner() + del x + + This is now allowed. Remember that the target of an *note except: + 17a. clause is cleared, so this code which used to work with Python + 2.6, raised a *note SyntaxError: 2d6. with Python 3.1 and now works + again: + + def f(): + def print_error(): + print(e) + try: + something + except Exception as e: + print_error() + # implicit "del e" here + + (See bpo-4617(7).) + + * The internal ‘structsequence’ tool now creates subclasses of tuple. + This means that C structures like those returned by *note + os.stat(): 653, *note time.gmtime(): e73, and *note + sys.version_info: 27d. now work like a *note named tuple: 221. 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: + + >>> import sys + >>> isinstance(sys.version_info, tuple) + True + >>> 'Version %d.%d.%d %s(%d)' % sys.version_info + 'Version 3.2.0 final(0)' + + (Suggested by Arfrever Frehtes Taifersar Arahesis and implemented + by Benjamin Peterson in bpo-8413(8).) + + * Warnings are now easier to control using the *note PYTHONWARNINGS: + 80e. environment variable as an alternative to using ‘-W’ at the + command line: + + $ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::' + + (Suggested by Barry Warsaw and implemented by Philip Jenvey in + bpo-7301(9).) + + * A new warning category, *note ResourceWarning: 8a9, 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 *note + warnings: 130. module, or on the command line. + + A *note ResourceWarning: 8a9. is issued at interpreter shutdown if + the *note gc.garbage: e74. list isn’t empty, and if *note + gc.DEBUG_UNCOLLECTABLE: e75. is set, all uncollectable objects are + printed. This is meant to make the programmer aware that their + code contains object finalization issues. + + A *note ResourceWarning: 8a9. is also issued when a *note file + object: e76. 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: + + $ python -q -Wdefault + >>> f = open("foo", "wb") + >>> del f + __main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'> + + (Added by Antoine Pitrou and Georg Brandl in bpo-10093(10) and + bpo-477863(11).) + + * *note range: 58b. objects now support `index' and `count' methods. + This is part of an effort to make more objects fully implement the + ‘collections.Sequence’ *note abstract base class: e6a. As a + result, the language will have a more uniform API. In addition, + *note range: 58b. objects now support slicing and negative indices, + even with values larger than *note sys.maxsize: e77. This makes + `range' more interoperable with lists: + + >>> 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) + + (Contributed by Daniel Stutzbach in bpo-9213(12), by Alexander + Belopolsky in bpo-2690(13), and by Nick Coghlan in bpo-10889(14).) + + * The *note callable(): e78. builtin function from Py2.x was + resurrected. It provides a concise, readable alternative to using + an *note abstract base class: e6a. in an expression like + ‘isinstance(x, collections.Callable)’: + + >>> callable(max) + True + >>> callable(20) + False + + (See bpo-10518(15).) + + * 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. + + (Required extensive work by Victor Stinner in bpo-9425(16).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7094 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=6081 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1772833 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=9666 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=9337 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=9757 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=4617 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=8413 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=7301 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=10093 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=477863 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=9213 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=2690 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=10889 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=10518 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=9425 + + +File: python.info, Node: New Improved and Deprecated Modules, Next: Multi-threading, Prev: Other Language Changes<10>, Up: What’s New In Python 3 2 + +1.10.9 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 *note email: 64. package, +*note mailbox: ac. module, and *note nntplib: be. 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 *note context manager: 1a0. to +support convenient and reliable resource clean-up using a *note with: +19e. statement. + +* Menu: + +* email: email<5>. +* elementtree:: +* functools: functools<7>. +* itertools: itertools<5>. +* collections: collections<8>. +* threading: threading<8>. +* datetime and time:: +* math: math<8>. +* abc: abc<3>. +* io: io<5>. +* reprlib:: +* logging: logging<8>. +* csv: csv<3>. +* contextlib: contextlib<8>. +* decimal and fractions:: +* ftp:: +* popen:: +* select: select<3>. +* gzip and zipfile:: +* tarfile: tarfile<5>. +* hashlib: hashlib<6>. +* ast: ast<4>. +* os: os<11>. +* shutil: shutil<6>. +* sqlite3: sqlite3<8>. +* html: html<3>. +* socket: socket<11>. +* ssl: ssl<10>. +* nntp:: +* certificates:: +* imaplib: imaplib<4>. +* http.client: http client<4>. +* unittest: unittest<8>. +* random: random<3>. +* poplib: poplib<4>. +* asyncore: asyncore<2>. +* tempfile: tempfile<2>. +* inspect: inspect<9>. +* pydoc: pydoc<6>. +* dis: dis<3>. +* dbm: dbm<6>. +* ctypes: ctypes<2>. +* site: site<3>. +* sysconfig: sysconfig<3>. +* pdb: pdb<6>. +* configparser: configparser<2>. +* urllib.parse: urllib parse<4>. +* mailbox:: +* turtledemo:: + + +File: python.info, Node: email<5>, Next: elementtree, Up: New Improved and Deprecated Modules + +1.10.9.1 email +.............. + +The usability of the *note email: 64. 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 *note +bytes: 1b4. rather than *note str: 1b3. 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. + + * New functions *note message_from_bytes(): e7b. and *note + message_from_binary_file(): e7c, and new classes *note + BytesFeedParser: e7d. and *note BytesParser: e7e. allow binary + message data to be parsed into model objects. + + * Given bytes input to the model, *note get_payload(): e7f. will by + default decode a message body that has a + ‘Content-Transfer-Encoding’ of `8bit' using the charset specified + in the MIME headers and return the resulting string. + + * Given bytes input to the model, *note Generator: e80. will convert + message bodies that have a ‘Content-Transfer-Encoding’ of `8bit' to + instead have a `7bit' ‘Content-Transfer-Encoding’. + + Headers with unencoded non-ASCII bytes are deemed to be RFC + 2047(1)-encoded using the `unknown-8bit' character set. + + * A new class *note BytesGenerator: e81. 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 + ‘Content-Transfer-Encoding’ of `8bit'. + + * The *note smtplib: ea. *note SMTP: 575. class now accepts a byte + string for the `msg' argument to the *note sendmail(): ae0. method, + and a new method, *note send_message(): ae1. accepts a *note + Message: 90b. object and can optionally obtain the `from_addr' and + `to_addrs' addresses directly from the object. + +(Proposed and implemented by R. David Murray, bpo-4661(2) and +bpo-10321(3).) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2047.html + + (2) https://bugs.python.org/issue?@action=redirect&bpo=4661 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=10321 + + +File: python.info, Node: elementtree, Next: functools<7>, Prev: email<5>, Up: New Improved and Deprecated Modules + +1.10.9.2 elementtree +.................... + +The *note xml.etree.ElementTree: 142. package and its +‘xml.etree.cElementTree’ counterpart have been updated to version 1.3. + +Several new and useful functions and methods have been added: + + * *note xml.etree.ElementTree.fromstringlist(): e83. which builds an + XML document from a sequence of fragments + + * *note xml.etree.ElementTree.register_namespace(): e84. for + registering a global namespace prefix + + * *note xml.etree.ElementTree.tostringlist(): c98. for string + representation including all sublists + + * *note xml.etree.ElementTree.Element.extend(): e85. for appending a + sequence of zero or more elements + + * *note xml.etree.ElementTree.Element.iterfind(): e86. searches an + element and subelements + + * *note xml.etree.ElementTree.Element.itertext(): e87. creates a text + iterator over an element and its subelements + + * *note xml.etree.ElementTree.TreeBuilder.end(): e88. closes the + current element + + * *note xml.etree.ElementTree.TreeBuilder.doctype(): 6f0. handles a + doctype declaration + +Two methods have been deprecated: + + * ‘xml.etree.ElementTree.getchildren()’ use ‘list(elem)’ instead. + + * ‘xml.etree.ElementTree.getiterator()’ use ‘Element.iter’ instead. + +For details of the update, see Introducing ElementTree(1) on Fredrik +Lundh’s website. + +(Contributed by Florent Xicluna and Fredrik Lundh, bpo-6472(2).) + + ---------- Footnotes ---------- + + (1) +https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm + + (2) https://bugs.python.org/issue?@action=redirect&bpo=6472 + + +File: python.info, Node: functools<7>, Next: itertools<5>, Prev: elementtree, Up: New Improved and Deprecated Modules + +1.10.9.3 functools +.................. + + * The *note functools: 7f. module includes a new decorator for + caching function calls. *note functools.lru_cache(): 632. 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: + + >>> 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] + + >>> for name in user_requests: + ... get_phone_number(name) # cached lookup + + To help with choosing an effective cache size, the wrapped function + is instrumented for tracking cache statistics: + + >>> get_phone_number.cache_info() + CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300) + + If the phonelist table gets updated, the outdated contents of the + cache can be cleared with: + + >>> get_phone_number.cache_clear() + + (Contributed by Raymond Hettinger and incorporating design ideas + from Jim Baker, Miki Tebeka, and Nick Coghlan; see recipe + 498245(1), recipe 577479(2), bpo-10586(3), and bpo-10593(4).) + + * The *note functools.wraps(): bf8. decorator now adds a + ‘__wrapped__’ attribute pointing to the original callable function. + This allows wrapped functions to be introspected. It also copies + ‘__annotations__’ if defined. And now it also gracefully skips + over missing attributes such as ‘__doc__’ which might not be + defined for the wrapped callable. + + In the above example, the cache can be removed by recovering the + original function: + + >>> get_phone_number = get_phone_number.__wrapped__ # uncached function + + (By Nick Coghlan and Terrence Cole; bpo-9567(5), bpo-3445(6), and + bpo-8814(7).) + + * To help write classes with rich comparison methods, a new decorator + *note functools.total_ordering(): bdc. will use existing equality + and inequality methods to fill in the remaining methods. + + For example, supplying `__eq__' and `__lt__' will enable *note + total_ordering(): bdc. to fill-in `__le__', `__gt__' and `__ge__': + + @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())) + + With the `total_ordering' decorator, the remaining comparison + methods are filled in automatically. + + (Contributed by Raymond Hettinger.) + + * To aid in porting programs from Python 2, the *note + functools.cmp_to_key(): e8a. function converts an old-style + comparison function to modern *note key function: a86.: + + >>> # locale-aware sort order + >>> sorted(iterable, key=cmp_to_key(locale.strcoll)) + + For sorting examples and a brief sorting tutorial, see the Sorting + HowTo(8) tutorial. + + (Contributed by Raymond Hettinger.) + + ---------- Footnotes ---------- + + (1) https://code.activestate.com/recipes/498245 + + (2) https://code.activestate.com/recipes/577479 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=10586 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=10593 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=9567 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=3445 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=8814 + + (8) https://wiki.python.org/moin/HowTo/Sorting/ + + +File: python.info, Node: itertools<5>, Next: collections<8>, Prev: functools<7>, Up: New Improved and Deprecated Modules + +1.10.9.4 itertools +.................. + + * The *note itertools: a1. module has a new *note accumulate(): 643. + function modeled on APL’s `scan' operator and Numpy’s `accumulate' + function: + + >>> from itertools import accumulate + >>> list(accumulate([8, 2, 50])) + [8, 10, 60] + + >>> 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] + + For an example using *note accumulate(): 643, see the *note + examples for the random module: e8c. + + (Contributed by Raymond Hettinger and incorporating design + suggestions from Mark Dickinson.) + + +File: python.info, Node: collections<8>, Next: threading<8>, Prev: itertools<5>, Up: New Improved and Deprecated Modules + +1.10.9.5 collections +.................... + + * The *note collections.Counter: d43. class now has two forms of + in-place subtraction, the existing `-=' operator for saturating + subtraction(1) and the new *note subtract(): e8e. method for + regular subtraction. The former is suitable for multisets(2) which + only have positive counts, and the latter is more suitable for use + cases that allow negative counts: + + >>> from collections import Counter + >>> tally = Counter(dogs=5, cats=3) + >>> tally -= Counter(dogs=2, cats=8) # saturating subtraction + >>> tally + Counter({'dogs': 3}) + + >>> tally = Counter(dogs=5, cats=3) + >>> tally.subtract(dogs=2, cats=8) # regular subtraction + >>> tally + Counter({'dogs': 3, 'cats': -5}) + + (Contributed by Raymond Hettinger.) + + * The *note collections.OrderedDict: 1a8. class has a new method + *note move_to_end(): e8f. 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 ‘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. + + >>> 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'] + + (Contributed by Raymond Hettinger.) + + * The *note collections.deque: 1a9. class grew two new methods *note + count(): e90. and *note reverse(): e91. that make them more + substitutable for *note list: 1e9. objects: + + >>> 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']) + + (Contributed by Raymond Hettinger.) + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Saturation_arithmetic + + (2) https://en.wikipedia.org/wiki/Multiset + + +File: python.info, Node: threading<8>, Next: datetime and time, Prev: collections<8>, Up: New Improved and Deprecated Modules + +1.10.9.6 threading +.................. + +The *note threading: 10b. module has a new *note Barrier: e93. +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(1) which is defined for only two threads. + +Implemented as a two-phase cyclic barrier, *note Barrier: e93. 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: + + 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() + +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 *note +threading.Thread.join(): e94, 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 *note BrokenBarrierError: e95. +exception is raised: + + 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) + +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(2) 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(3), +`section 3.6'. + +(Contributed by Kristján Valur Jónsson with an API review by Jeffrey +Yasskin in bpo-8777(4).) + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Synchronous_rendezvous + + (2) +https://osl.cs.illinois.edu/media/papers/karmani-2009-barrier_synchronization_pattern.pdf + + (3) https://greenteapress.com/semaphores/LittleBookOfSemaphores.pdf + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8777 + + +File: python.info, Node: datetime and time, Next: math<8>, Prev: threading<8>, Up: New Improved and Deprecated Modules + +1.10.9.7 datetime and time +.......................... + + * The *note datetime: 2f. module has a new type *note timezone: d6a. + that implements the *note tzinfo: 1ab. interface by returning a + fixed UTC offset and timezone name. This makes it easier to create + timezone-aware datetime objects: + + >>> from datetime import datetime, timezone + + >>> datetime.now(timezone.utc) + datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc) + + >>> 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) + + * Also, *note timedelta: 60f. objects can now be multiplied by *note + float: 3ca. and divided by *note float: 3ca. and *note int: 1c7. + objects. And *note timedelta: 60f. objects can now divide one + another. + + * The *note datetime.date.strftime(): 902. method is no longer + restricted to years after 1900. The new supported year range is + from 1000 to 9999 inclusive. + + * Whenever a two-digit year is used in a time tuple, the + interpretation has been governed by ‘time.accept2dyear’. The + default is ‘True’ which means that for a two-digit year, the + century is guessed according to the POSIX rules governing the ‘%y’ + strptime format. + + Starting with Py3.2, use of the century guessing heuristic will + emit a *note DeprecationWarning: 2d4. Instead, it is recommended + that ‘time.accept2dyear’ be set to ‘False’ so that large date + ranges can be used without guesswork: + + >>> 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' + + Several functions now have significantly expanded date ranges. + When ‘time.accept2dyear’ is false, the *note time.asctime(): e97. + function will accept any year that fits in a C int, while the *note + time.mktime(): e98. and *note time.strftime(): e99. functions will + accept the full range supported by the corresponding operating + system functions. + +(Contributed by Alexander Belopolsky and Victor Stinner in +bpo-1289118(1), bpo-5094(2), bpo-6641(3), bpo-2706(4), bpo-1777412(5), +bpo-8013(6), and bpo-10827(7).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1289118 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5094 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=6641 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=2706 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=1777412 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=8013 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=10827 + + +File: python.info, Node: math<8>, Next: abc<3>, Prev: datetime and time, Up: New Improved and Deprecated Modules + +1.10.9.8 math +............. + +The *note math: af. module has been updated with six new functions +inspired by the C99 standard. + +The *note isfinite(): e9b. function provides a reliable and fast way to +detect special values. It returns ‘True’ for regular numbers and +‘False’ for `Nan' or `Infinity': + + >>> from math import isfinite + >>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))] + [True, True, False, False] + +The *note expm1(): e9c. function computes ‘e**x-1’ for small values of +`x' without incurring the loss of precision that usually accompanies the +subtraction of nearly equal quantities: + + >>> from math import expm1 + >>> expm1(0.013671875) # more accurate way to compute e**x-1 for a small x + 0.013765762467652909 + +The *note erf(): 83f. function computes a probability integral or +Gaussian error function(1). The complementary error function, *note +erfc(): 840, is ‘1 - erf(x)’: + + >>> 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 + +The *note gamma(): e9d. function is a continuous extension of the +factorial function. See ‘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 *note lgamma(): +e9e. function for computing the natural logarithm of the gamma function: + + >>> from math import gamma, lgamma + >>> gamma(7.0) # six factorial + 720.0 + >>> lgamma(801.0) # log(800 factorial) + 4551.950730698041 + +(Contributed by Mark Dickinson.) + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Error_function + + +File: python.info, Node: abc<3>, Next: io<5>, Prev: math<8>, Up: New Improved and Deprecated Modules + +1.10.9.9 abc +............ + +The *note abc: 3. module now supports *note abstractclassmethod(): d38. +and *note abstractstaticmethod(): d39. + +These tools make it possible to define an *note abstract base class: +e6a. that requires a particular *note classmethod(): 18d. or *note +staticmethod(): 3c8. to be implemented: + + class Temperature(metaclass=abc.ABCMeta): + @abc.abstractclassmethod + def from_fahrenheit(cls, t): + ... + @abc.abstractclassmethod + def from_celsius(cls, t): + ... + +(Patch submitted by Daniel Urban; bpo-5867(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5867 + + +File: python.info, Node: io<5>, Next: reprlib, Prev: abc<3>, Up: New Improved and Deprecated Modules + +1.10.9.10 io +............ + +The *note io.BytesIO: b31. has a new method, *note getbuffer(): ea1, +which provides functionality similar to *note memoryview(): 6ad. 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: + + >>> 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' + +(Contributed by Antoine Pitrou in bpo-5506(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5506 + + +File: python.info, Node: reprlib, Next: logging<8>, Prev: io<5>, Up: New Improved and Deprecated Modules + +1.10.9.11 reprlib +................. + +When writing a ‘__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 *note list: 1e9. and *note +set: 1a6. handle self-reference by displaying “…” in the recursive part +of the representation string. + +To help write such ‘__repr__()’ methods, the *note reprlib: dc. module +has a new decorator, *note recursive_repr(): ea3, for detecting +recursive calls to ‘__repr__()’ and substituting a placeholder string +instead: + + >>> 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'> + +(Contributed by Raymond Hettinger in bpo-9826(1) and bpo-9840(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9826 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=9840 + + +File: python.info, Node: logging<8>, Next: csv<3>, Prev: reprlib, Up: New Improved and Deprecated Modules + +1.10.9.12 logging +................. + +In addition to dictionary-based configuration described above, the *note +logging: a8. package has many other improvements. + +The logging documentation has been augmented by a *note basic tutorial: +ea5, an *note advanced tutorial: ea6, and a *note cookbook: ea7. of +logging recipes. These documents are the fastest way to learn about +logging. + +The *note logging.basicConfig(): 646. 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 *note str.format(): 1fc. style, or can be set to “$” for the +shell-style formatting provided by *note string.Template: 259. The +following three configurations are equivalent: + + >>> 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") + +If no configuration is set-up before a logging event occurs, there is +now a default configuration using a *note StreamHandler: ea8. directed +to *note sys.stderr: 581. for events of ‘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 ‘logging.raiseExceptions’. The new default handler is stored +in *note logging.lastResort: ea9. + +The use of filters has been simplified. Instead of creating a *note +Filter: eaa. object, the predicate can be any Python callable that +returns ‘True’ or ‘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. + + +File: python.info, Node: csv<3>, Next: contextlib<8>, Prev: logging<8>, Up: New Improved and Deprecated Modules + +1.10.9.13 csv +............. + +The *note csv: 28. module now supports a new dialect, *note +unix_dialect: eac, which applies quoting for all fields and a +traditional Unix style with ‘'\n'’ as the line terminator. The +registered dialect name is ‘unix’. + +The *note csv.DictWriter: ead. has a new method, *note writeheader(): +eae. for writing-out an initial row to document the field names: + + >>> 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" + +(New dialect suggested by Jay Talbot in bpo-5975(1), and the new method +suggested by Ed Abraham in bpo-1537721(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5975 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1537721 + + +File: python.info, Node: contextlib<8>, Next: decimal and fractions, Prev: csv<3>, Up: New Improved and Deprecated Modules + +1.10.9.14 contextlib +.................... + +There is a new and slightly mind-blowing tool *note ContextDecorator: +eb0. that is helpful for creating a *note context manager: 1a0. that +does double duty as a function decorator. + +As a convenience, this new functionality is used by *note +contextmanager(): eb1. 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 *note with: 19e. 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 *note contextmanager(): eb1. provides both +capabilities in a single definition: + + 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) + +Formerly, this would have only been usable as a context manager: + + with track_entry_and_exit('widget loader'): + print('Some time consuming activity goes here') + load_widget() + +Now, it can be used as a decorator as well: + + @track_entry_and_exit('widget loader') + def activity(): + print('Some time consuming activity goes here') + load_widget() + +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 *note with: 19e. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9110 + + +File: python.info, Node: decimal and fractions, Next: ftp, Prev: contextlib<8>, Up: New Improved and Deprecated Modules + +1.10.9.15 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(1)): + + assert hash(Fraction(3, 2)) == hash(1.5) == \ + hash(Decimal("1.5")) == hash(complex(1.5, 0)) + +Some of the hashing details are exposed through a new attribute, *note +sys.hash_info: ca1, 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: + + >>> sys.hash_info + sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003) + +An early decision to limit the inter-operability of various numeric +types has been relaxed. It is still unsupported (and ill-advised) to +have implicit mixing in arithmetic expressions such as ‘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. + + * The *note decimal.Decimal: 3bd. constructor now accepts *note + float: 3ca. objects directly so there in no longer a need to use + the *note from_float(): eb3. method (bpo-8257(2)). + + * Mixed type comparisons are now fully supported so that *note + Decimal: 3bd. objects can be directly compared with *note float: + 3ca. and *note fractions.Fraction: 210. (bpo-2531(3) and + bpo-8188(4)). + +Similar changes were made to *note fractions.Fraction: 210. so that the +*note from_float(): eb4. and *note from_decimal(): eb5. methods are no +longer needed (bpo-8294(5)): + + >>> from decimal import Decimal + >>> from fractions import Fraction + >>> Decimal(1.1) + Decimal('1.100000000000000088817841970012523233890533447265625') + >>> Fraction(1.1) + Fraction(2476979795053773, 2251799813685248) + +Another useful change for the *note decimal: 34. module is that the +‘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(6)). + +(Contributed by Mark Dickinson and Raymond Hettinger.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8188 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=8257 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=2531 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8188 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=8294 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=8540 + + +File: python.info, Node: ftp, Next: popen, Prev: decimal and fractions, Up: New Improved and Deprecated Modules + +1.10.9.16 ftp +............. + +The *note ftplib.FTP: 53d. class now supports the context management +protocol to unconditionally consume *note socket.error: d05. exceptions +and to close the FTP connection when done: + + >>> 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 + +Other file-like objects such as *note mmap.mmap: 64e. and *note +fileinput.input(): 3f0. also grew auto-closing context managers: + + with fileinput.input(files=('log1.txt', 'log2.txt')) as f: + for line in f: + process(line) + +(Contributed by Tarek Ziadé and Giampaolo Rodolà in bpo-4972(1), and by +Georg Brandl in bpo-8046(2) and bpo-1286(3).) + +The *note FTP_TLS: 53e. class now accepts a `context' parameter, which +is a *note ssl.SSLContext: 430. object allowing bundling SSL +configuration options, certificates and private keys into a single +(potentially long-lived) structure. + +(Contributed by Giampaolo Rodolà; bpo-8806(4).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4972 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=8046 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1286 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8806 + + +File: python.info, Node: popen, Next: select<3>, Prev: ftp, Up: New Improved and Deprecated Modules + +1.10.9.17 popen +............... + +The *note os.popen(): 6d9. and *note subprocess.Popen(): 6e8. functions +now support *note with: 19e. statements for auto-closing of the file +descriptors. + +(Contributed by Antoine Pitrou and Brian Curtin in bpo-7461(1) and +bpo-10554(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7461 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10554 + + +File: python.info, Node: select<3>, Next: gzip and zipfile, Prev: popen, Up: New Improved and Deprecated Modules + +1.10.9.18 select +................ + +The *note select: e2. module now exposes a new, constant attribute, +*note PIPE_BUF: eb9, which gives the minimum number of bytes which are +guaranteed not to block when *note select.select(): a1e. says a pipe is +ready for writing. + + >>> import select + >>> select.PIPE_BUF + 512 + +(Available on Unix systems. Patch by Sébastien Sablé in bpo-9862(1)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9862 + + +File: python.info, Node: gzip and zipfile, Next: tarfile<5>, Prev: select<3>, Up: New Improved and Deprecated Modules + +1.10.9.19 gzip and zipfile +.......................... + +*note gzip.GzipFile: 590. now implements the *note io.BufferedIOBase: +949. *note abstract base class: e6a. (except for ‘truncate()’). It also +has a *note peek(): ebb. method and supports unseekable as well as +zero-padded file objects. + +The *note gzip: 87. module also gains the *note compress(): 63b. and +*note decompress(): ebc. functions for easier in-memory compression and +decompression. Keep in mind that text needs to be encoded as *note +bytes: 1b4. before compressing and decompressing: + + >>> 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' + +(Contributed by Anand B. Pillai in bpo-3488(1); and by Antoine Pitrou, +Nir Aides and Brian Curtin in bpo-9962(2), bpo-1675951(3), bpo-7471(4) +and bpo-2846(5).) + +Also, the ‘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 *note io.BufferedReader: +ebd. 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(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=3488 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=9962 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1675951 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=7471 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=2846 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=7610 + + +File: python.info, Node: tarfile<5>, Next: hashlib<6>, Prev: gzip and zipfile, Up: New Improved and Deprecated Modules + +1.10.9.20 tarfile +................. + +The *note TarFile: ebf. class can now be used as a context manager. In +addition, its *note add(): 85e. 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 *note keyword argument: 983. The user-supplied +filter function accepts a *note TarInfo: ec0. object and returns an +updated *note TarInfo: ec0. object, or if it wants the file to be +excluded, the function can return ‘None’: + + >>> 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 + +(Proposed by Tarek Ziadé and implemented by Lars Gustäbel in +bpo-6856(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6856 + + +File: python.info, Node: hashlib<6>, Next: ast<4>, Prev: tarfile<5>, Up: New Improved and Deprecated Modules + +1.10.9.21 hashlib +................. + +The *note hashlib: 88. module has two new constant attributes listing +the hashing algorithms guaranteed to be present in all implementations +and those available on the current implementation: + + >>> 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'} + +(Suggested by Carl Chenet in bpo-7418(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7418 + + +File: python.info, Node: ast<4>, Next: os<11>, Prev: hashlib<6>, Up: New Improved and Deprecated Modules + +1.10.9.22 ast +............. + +The *note ast: 7. module has a wonderful a general-purpose tool for +safely evaluating expression strings using the Python literal syntax. +The *note ast.literal_eval(): 882. function serves as a secure +alternative to the builtin *note eval(): 4a7. function which is easily +abused. Python 3.2 adds *note bytes: 1b4. and *note set: 1a6. literals +to the list of supported types: strings, bytes, numbers, tuples, lists, +dicts, sets, booleans, and ‘None’. + + >>> 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> + +(Implemented by Benjamin Peterson and Georg Brandl.) + + +File: python.info, Node: os<11>, Next: shutil<6>, Prev: ast<4>, Up: New Improved and Deprecated Modules + +1.10.9.23 os +............ + +Different operating systems use various encodings for filenames and +environment variables. The *note os: c2. module provides two new +functions, *note fsencode(): 8c3. and *note fsdecode(): 8c2, for +encoding and decoding filenames: + + >>> import os + >>> filename = 'Sehenswürdigkeiten' + >>> os.fsencode(filename) + b'Sehensw\xc3\xbcrdigkeiten' + +Some operating systems allow direct access to encoded bytes in the +environment. If so, the *note os.supports_bytes_environ: ec4. constant +will be true. + +For direct access to encoded environment variables (if available), use +the new *note os.getenvb(): ec5. function or use *note os.environb: ec6. +which is a bytes version of *note os.environ: e6e. + +(Contributed by Victor Stinner.) + + +File: python.info, Node: shutil<6>, Next: sqlite3<8>, Prev: os<11>, Up: New Improved and Deprecated Modules + +1.10.9.24 shutil +................ + +The *note shutil.copytree(): 675. function has two new options: + + * `ignore_dangling_symlinks': when ‘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. + + * `copy_function': is a callable that will be used to copy files. + *note shutil.copy2(): 6ab. is used by default. + +(Contributed by Tarek Ziadé.) + +In addition, the *note shutil: e6. module now supports *note archiving +operations: ec8. 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 *note make_archive(): 676. and *note +unpack_archive(): ec9. By default, both operate on the current +directory (which can be set by *note os.chdir(): 1e6.) 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). + + >>> 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' + ... ) + +(Contributed by Tarek Ziadé.) + + +File: python.info, Node: sqlite3<8>, Next: html<3>, Prev: shutil<6>, Up: New Improved and Deprecated Modules + +1.10.9.25 sqlite3 +................. + +The *note sqlite3: ef. module was updated to pysqlite version 2.6.0. It +has two new capabilities. + + * The ‘sqlite3.Connection.in_transit’ attribute is true if there is + an active transaction for uncommitted changes. + + * The *note sqlite3.Connection.enable_load_extension(): 434. and + *note sqlite3.Connection.load_extension(): 435. methods allows you + to load SQLite extensions from “.so” files. One well-known + extension is the fulltext-search extension distributed with SQLite. + +(Contributed by R. David Murray and Shashwat Anand; bpo-8845(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8845 + + +File: python.info, Node: html<3>, Next: socket<11>, Prev: sqlite3<8>, Up: New Improved and Deprecated Modules + +1.10.9.26 html +.............. + +A new *note html: 8b. module was introduced with only a single function, +*note escape(): cb1, which is used for escaping reserved characters from +HTML markup: + + >>> import html + >>> html.escape('x > 2 && x < 7') + 'x > 2 && x < 7' + + +File: python.info, Node: socket<11>, Next: ssl<10>, Prev: html<3>, Up: New Improved and Deprecated Modules + +1.10.9.27 socket +................ + +The *note socket: ec. module has two new improvements. + + * Socket objects now have a *note detach(): ecd. 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(1).) + + * *note socket.create_connection(): 241. now supports the context + management protocol to unconditionally consume *note socket.error: + d05. exceptions and to close the socket when done. (Contributed by + Giampaolo Rodolà; bpo-9794(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8524 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=9794 + + +File: python.info, Node: ssl<10>, Next: nntp, Prev: socket<11>, Up: New Improved and Deprecated Modules + +1.10.9.28 ssl +............. + +The *note ssl: f0. module added a number of features to satisfy common +requirements for secure (encrypted, authenticated) internet connections: + + * A new class, *note SSLContext: 430, serves as a container for + persistent SSL data, such as protocol settings, certificates, + private keys, and various other options. It includes a *note + wrap_socket(): 491. for creating an SSL socket from an SSL context. + + * A new function, *note ssl.match_hostname(): 492, supports server + identity verification for higher-level protocols by implementing + the rules of HTTPS (from RFC 2818(1)) which are also suitable for + other protocols. + + * The *note ssl.wrap_socket(): 490. constructor function now takes a + `ciphers' argument. The `ciphers' string lists the allowed + encryption algorithms using the format described in the OpenSSL + documentation(2). + + * When linked against recent versions of OpenSSL, the *note ssl: f0. + 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 *note ssl.SSLContext.wrap_socket(): 491. + + * Various options have been added to the *note ssl: f0. module, such + as *note OP_NO_SSLv2: 42d. which disables the insecure and obsolete + SSLv2 protocol. + + * 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. + + * The version of OpenSSL being used is now accessible using the + module attributes *note ssl.OPENSSL_VERSION: ecf. (a string), *note + ssl.OPENSSL_VERSION_INFO: ed0. (a 5-tuple), and *note + ssl.OPENSSL_VERSION_NUMBER: ed1. (an integer). + +(Contributed by Antoine Pitrou in bpo-8850(3), bpo-1589(4), bpo-8322(5), +bpo-5639(6), bpo-4870(7), bpo-8484(8), and bpo-8321(9).) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2818.html + + (2) +https://www.openssl.org/docs/man1.0.2/man1/ciphers.html#CIPHER-LIST-FORMAT + + (3) https://bugs.python.org/issue?@action=redirect&bpo=8850 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1589 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=8322 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=5639 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=4870 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=8484 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=8321 + + +File: python.info, Node: nntp, Next: certificates, Prev: ssl<10>, Up: New Improved and Deprecated Modules + +1.10.9.29 nntp +.............. + +The *note nntplib: be. 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 *note +nntplib.NNTP_SSL: 55e.) and explicit (using *note +nntplib.NNTP.starttls(): ed3.) TLS has also been added. + +(Contributed by Antoine Pitrou in bpo-9360(1) and Andrew Vant in +bpo-1926(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9360 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1926 + + +File: python.info, Node: certificates, Next: imaplib<4>, Prev: nntp, Up: New Improved and Deprecated Modules + +1.10.9.30 certificates +...................... + +*note http.client.HTTPSConnection: 797, *note +urllib.request.HTTPSHandler: ed5. and *note urllib.request.urlopen(): +b22. 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9003 + + +File: python.info, Node: imaplib<4>, Next: http client<4>, Prev: certificates, Up: New Improved and Deprecated Modules + +1.10.9.31 imaplib +................. + +Support for explicit TLS on standard IMAP4 connections has been added +through the new *note imaplib.IMAP4.starttls: ed7. method. + +(Contributed by Lorenzo M. Catucci and Antoine Pitrou, bpo-4471(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4471 + + +File: python.info, Node: http client<4>, Next: unittest<8>, Prev: imaplib<4>, Up: New Improved and Deprecated Modules + +1.10.9.32 http.client +..................... + +There were a number of small API improvements in the *note http.client: +8f. module. The old-style HTTP 0.9 simple responses are no longer +supported and the `strict' parameter is deprecated in all classes. + +The *note HTTPConnection: 796. and *note HTTPSConnection: 797. 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 +*note HTTPSConnection: 797. + +The *note request(): 916. method on connection objects allowed an +optional `body' argument so that a *note file object: e76. could be used +to supply the content of the request. Conveniently, the `body' argument +now also accepts an *note iterable: ed9. object so long as it includes +an explicit ‘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 +*note set_tunnel(): eda. method that sets the host and port for HTTP +Connect tunneling. + +To match the behavior of *note http.server: 92, 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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10980 + + +File: python.info, Node: unittest<8>, Next: random<3>, Prev: http client<4>, Up: New Improved and Deprecated Modules + +1.10.9.33 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. + + * The command-line call ‘python -m unittest’ can now accept file + paths instead of module names for running specific tests + (bpo-10620(1)). 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 ‘-t’ + option, a pattern for matching files with ‘-p’, and a directory to + start discovery with ‘-s’: + + $ python -m unittest discover -s my_proj_dir -p _test.py + + (Contributed by Michael Foord.) + + * Experimentation at the interactive prompt is now easier because the + ‘unittest.case.TestCase’ class can now be instantiated without + arguments: + + >>> from unittest import TestCase + >>> TestCase().assertEqual(pow(2, 3), 8) + + (Contributed by Michael Foord.) + + * The *note unittest: 125. module has two new methods, *note + assertWarns(): e18. and *note assertWarnsRegex(): e19. to verify + that a given warning type is triggered by the code under test: + + with self.assertWarns(DeprecationWarning): + legacy_function('XYZ') + + (Contributed by Antoine Pitrou, bpo-9754(2).) + + Another new method, *note assertCountEqual(): edc. 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): + + def test_anagram(self): + self.assertCountEqual('algorithm', 'logarithm') + + (Contributed by Raymond Hettinger.) + + * 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 + *note maxDiff: edd. attribute that sets maximum length of diffs + displayed. + + * In addition, the method names in the module have undergone a number + of clean-ups. + + For example, *note assertRegex(): ede. is the new name for + ‘assertRegexpMatches()’ which was misnamed because the test uses + *note re.search(): edf, not *note re.match(): ee0. 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 *note + re: da. module, and it has unambiguous camel-casing. + + (Contributed by Raymond Hettinger and implemented by Ezio Melotti.) + + * To improve consistency, some long-standing method aliases are being + deprecated in favor of the preferred names: + + Old Name Preferred Name + + ----------------------------------------------------------------------- + + ‘assert_()’ *note assertTrue(): ee1. + + + ‘assertEquals()’ *note assertEqual(): ee2. + + + ‘assertNotEquals()’ *note assertNotEqual(): ee3. + + + ‘assertAlmostEquals()’ *note assertAlmostEqual(): ee4. + + + ‘assertNotAlmostEquals()’ *note assertNotAlmostEqual(): ee5. + + + Likewise, the ‘TestCase.fail*’ methods deprecated in Python 3.1 are + expected to be removed in Python 3.3. Also see the *note + Deprecated aliases: ee6. section in the *note unittest: 125. + documentation. + + (Contributed by Ezio Melotti; bpo-9424(3).) + + * The ‘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 + ‘TestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1})’ + would fail. + + (Contributed by Raymond Hettinger.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10620 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=9754 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=9424 + + +File: python.info, Node: random<3>, Next: poplib<4>, Prev: unittest<8>, Up: New Improved and Deprecated Modules + +1.10.9.34 random +................ + +The integer methods in the *note random: d9. module now do a better job +of producing uniform distributions. Previously, they computed +selections with ‘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 ‘0 <= x < n’. The functions and methods affected are +*note randrange(): 46e, *note randint(): ee8, *note choice(): ee9, *note +shuffle(): 316. and *note sample(): 315. + +(Contributed by Raymond Hettinger; bpo-9025(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9025 + + +File: python.info, Node: poplib<4>, Next: asyncore<2>, Prev: random<3>, Up: New Improved and Deprecated Modules + +1.10.9.35 poplib +................ + +*note POP3_SSL: 56d. class now accepts a `context' parameter, which is a +*note ssl.SSLContext: 430. object allowing bundling SSL configuration +options, certificates and private keys into a single (potentially +long-lived) structure. + +(Contributed by Giampaolo Rodolà; bpo-8807(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8807 + + +File: python.info, Node: asyncore<2>, Next: tempfile<2>, Prev: poplib<4>, Up: New Improved and Deprecated Modules + +1.10.9.36 asyncore +.................. + +*note asyncore.dispatcher: eec. now provides a *note handle_accepted(): +eed. method returning a ‘(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 *note +handle_accept(): eee. and avoids the user to call *note accept(): eef. +directly. + +(Contributed by Giampaolo Rodolà; bpo-6706(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6706 + + +File: python.info, Node: tempfile<2>, Next: inspect<9>, Prev: asyncore<2>, Up: New Improved and Deprecated Modules + +1.10.9.37 tempfile +.................. + +The *note tempfile: ff. module has a new context manager, *note +TemporaryDirectory: ef1. which provides easy deterministic cleanup of +temporary directories: + + with tempfile.TemporaryDirectory() as tmpdirname: + print('created temporary dir:', tmpdirname) + +(Contributed by Neil Schemenauer and Nick Coghlan; bpo-5178(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5178 + + +File: python.info, Node: inspect<9>, Next: pydoc<6>, Prev: tempfile<2>, Up: New Improved and Deprecated Modules + +1.10.9.38 inspect +................. + + * The *note inspect: 9e. module has a new function *note + getgeneratorstate(): ef3. to easily identify the current state of a + generator-iterator: + + >>> 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' + + (Contributed by Rodolpho Eckhardt and Nick Coghlan, bpo-10220(1).) + + * To support lookups without the possibility of activating a dynamic + attribute, the *note inspect: 9e. module has a new function, *note + getattr_static(): ef4. Unlike *note hasattr(): 836, this is a true + read-only search, guaranteed not to change state while it is + searching: + + >>> class A: + ... @property + ... def f(self): + ... print('Running') + ... return 10 + ... + >>> a = A() + >>> getattr(a, 'f') + Running + 10 + >>> inspect.getattr_static(a, 'f') + + + (Contributed by Michael Foord.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10220 + + +File: python.info, Node: pydoc<6>, Next: dis<3>, Prev: inspect<9>, Up: New Improved and Deprecated Modules + +1.10.9.39 pydoc +............... + +The *note pydoc: d6. module now provides a much-improved web server +interface, as well as a new command-line option ‘-b’ to automatically +open a browser window to display that server: + + $ pydoc3.2 -b + +(Contributed by Ron Adam; bpo-2001(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2001 + + +File: python.info, Node: dis<3>, Next: dbm<6>, Prev: pydoc<6>, Up: New Improved and Deprecated Modules + +1.10.9.40 dis +............. + +The *note dis: 36. module gained two new functions for inspecting code, +*note code_info(): ef7. and *note show_code(): bc3. 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: + + >>> 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 + +In addition, the *note dis(): 78a. function now accepts string arguments +so that the common idiom ‘dis(compile(s, '', 'eval'))’ can be shortened +to ‘dis(s)’: + + >>> 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 + +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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9147 + + +File: python.info, Node: dbm<6>, Next: ctypes<2>, Prev: dis<3>, Up: New Improved and Deprecated Modules + +1.10.9.41 dbm +............. + +All database modules now support the ‘get()’ and ‘setdefault()’ methods. + +(Suggested by Ray Allen in bpo-9523(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9523 + + +File: python.info, Node: ctypes<2>, Next: site<3>, Prev: dbm<6>, Up: New Improved and Deprecated Modules + +1.10.9.42 ctypes +................ + +A new type, *note ctypes.c_ssize_t: efa. represents the C ‘ssize_t’ +datatype. + + +File: python.info, Node: site<3>, Next: sysconfig<3>, Prev: ctypes<2>, Up: New Improved and Deprecated Modules + +1.10.9.43 site +.............. + +The *note site: e8. module has three new functions useful for reporting +on the details of a given Python installation. + + * *note getsitepackages(): efc. lists all global site-packages + directories. + + * *note getuserbase(): efd. reports on the user’s base directory + where data can be stored. + + * *note getusersitepackages(): efe. reveals the user-specific + site-packages directory path. + + >>> 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' + +Conveniently, some of site’s functionality is accessible directly from +the command-line: + + $ python -m site --user-base + /Users/raymondhettinger/.local + $ python -m site --user-site + /Users/raymondhettinger/.local/lib/python3.2/site-packages + +(Contributed by Tarek Ziadé in bpo-6693(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6693 + + +File: python.info, Node: sysconfig<3>, Next: pdb<6>, Prev: site<3>, Up: New Improved and Deprecated Modules + +1.10.9.44 sysconfig +................... + +The new *note sysconfig: fa. 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: + + * *note get_platform(): f00. returning values like `linux-i586' or + `macosx-10.6-ppc'. + + * *note get_python_version(): f01. returns a Python version string + such as “3.2”. + +It also provides access to the paths and variables corresponding to one +of seven named schemes used by *note distutils: 37. Those include +`posix_prefix', `posix_home', `posix_user', `nt', `nt_user', `os2', +`os2_home': + + * *note get_paths(): f02. makes a dictionary containing installation + paths for the current installation scheme. + + * *note get_config_vars(): cd8. returns a dictionary of platform + specific variables. + +There is also a convenient command-line interface: + + 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" + +(Moved out of Distutils by Tarek Ziadé.) + + +File: python.info, Node: pdb<6>, Next: configparser<2>, Prev: sysconfig<3>, Up: New Improved and Deprecated Modules + +1.10.9.45 pdb +............. + +The *note pdb: c6. debugger module gained a number of usability +improvements: + + * ‘pdb.py’ now has a ‘-c’ option that executes commands as given in a + ‘.pdbrc’ script file. + + * A ‘.pdbrc’ script file can contain ‘continue’ and ‘next’ commands + that continue debugging. + + * The ‘Pdb’ class constructor now accepts a `nosigint' argument. + + * New commands: ‘l(list)’, ‘ll(long list)’ and ‘source’ for listing + source code. + + * New commands: ‘display’ and ‘undisplay’ for showing or hiding the + value of an expression if it has changed. + + * New command: ‘interact’ for starting an interactive interpreter + containing the global and local names found in the current scope. + + * Breakpoints can be cleared by breakpoint number. + +(Contributed by Georg Brandl, Antonio Cuni and Ilya Sandler.) + + +File: python.info, Node: configparser<2>, Next: urllib parse<4>, Prev: pdb<6>, Up: New Improved and Deprecated Modules + +1.10.9.46 configparser +...................... + +The *note configparser: 21. module was modified to improve usability and +predictability of the default parser and its supported INI syntax. The +old ‘ConfigParser’ class was removed in favor of ‘SafeConfigParser’ +which has in turn been renamed to *note ConfigParser: 887. 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: + + >>> 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)' + +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 *note ExtendedInterpolation: 2dc.: + + >>> 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' + +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.) + + +File: python.info, Node: urllib parse<4>, Next: mailbox, Prev: configparser<2>, Up: New Improved and Deprecated Modules + +1.10.9.47 urllib.parse +...................... + +A number of usability improvements were made for the *note urllib.parse: +129. module. + +The *note urlparse(): 9b4. function now supports IPv6(1) addresses as +described in RFC 2732(2): + + >>> 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='', + query='', + fragment='') + +The *note urldefrag(): f06. function now returns a *note named tuple: +221.: + + >>> 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' + +And, the *note urlencode(): b21. 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 *note quote_plus(): f07. for encoding: + + >>> urllib.parse.urlencode([ + ... ('type', 'telenovela'), + ... ('name', '¿Dónde Está Elisa?')], + ... encoding='latin-1') + 'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F' + +As detailed in *note Parsing ASCII Encoded Bytes: f08, all the *note +urllib.parse: 129. 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: + + >>> 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'', query=b'', fragment=b'') + +(Work by Nick Coghlan, Dan Mahn, and Senthil Kumaran in bpo-2987(3), +bpo-5468(4), and bpo-9873(5).) + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/IPv6 + + (2) https://datatracker.ietf.org/doc/html/rfc2732.html + + (3) https://bugs.python.org/issue?@action=redirect&bpo=2987 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=5468 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=9873 + + +File: python.info, Node: mailbox, Next: turtledemo, Prev: urllib parse<4>, Up: New Improved and Deprecated Modules + +1.10.9.48 mailbox +................. + +Thanks to a concerted effort by R. David Murray, the *note mailbox: ac. +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 *note bytes: 1b4. because various parts of a +message may have different encodings. + +The solution harnessed the *note email: 64. package’s binary support for +parsing arbitrary email messages. In addition, the solution required a +number of API changes. + +As expected, the *note add(): f0a. method for *note mailbox.Mailbox: +f0b. objects now accepts binary input. + +*note StringIO: bbe. 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 *note get_file(): f0c. +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 *note +get_bytes(): f0d. method that returns a *note bytes: 1b4. representation +of a message corresponding to a given `key'. + +It is still possible to get non-binary output using the old API’s *note +get_string(): f0e. method, but that approach is not very useful. +Instead, it is best to extract messages from a *note Message: f0f. +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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=9124 + + +File: python.info, Node: turtledemo, Prev: mailbox, Up: New Improved and Deprecated Modules + +1.10.9.49 turtledemo +.................... + +The demonstration code for the *note turtle: 120. module was moved from +the `Demo' directory to main library. It includes over a dozen sample +scripts with lively displays. Being on *note sys.path: 162, it can now +be run directly from the command-line: + + $ python -m turtledemo + +(Moved from the Demo directory by Alexander Belopolsky in bpo-10199(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10199 + + +File: python.info, Node: Multi-threading, Next: Optimizations<9>, Prev: New Improved and Deprecated Modules, Up: What’s New In Python 3 2 + +1.10.10 Multi-threading +----------------------- + + * The mechanism for serializing execution of concurrently running + Python threads (generally known as the *note GIL: 4df. 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 *note sys.setswitchinterval(): 599. + It currently defaults to 5 milliseconds. + + Additional details about the implementation can be read from a + python-dev mailing-list message(1) (however, “priority requests” as + exposed in this message have not been kept for inclusion). + + (Contributed by Antoine Pitrou.) + + * Regular and recursive locks now accept an optional `timeout' + argument to their *note acquire(): 262. method. (Contributed by + Antoine Pitrou; bpo-7316(2).) + + * Similarly, *note threading.Semaphore.acquire(): f12. also gained a + `timeout' argument. (Contributed by Torsten Landschoff; + bpo-850728(3).) + + * 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 + ‘Ctrl+C’ in most shells). (Contributed by Reid Kleckner; + bpo-8844(4).) + + ---------- Footnotes ---------- + + (1) +https://mail.python.org/pipermail/python-dev/2009-October/093321.html + + (2) https://bugs.python.org/issue?@action=redirect&bpo=7316 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=850728 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8844 + + +File: python.info, Node: Optimizations<9>, Next: Unicode, Prev: Multi-threading, Up: What’s New In Python 3 2 + +1.10.11 Optimizations +--------------------- + +A number of small performance enhancements have been added: + + * Python’s peephole optimizer now recognizes patterns such ‘x in {1, + 2, 3}’ as being a test for membership in a set of constants. The + optimizer recasts the *note set: 1a6. as a *note frozenset: 1a7. + 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: + + extension = name.rpartition('.')[2] + if extension in {'xml', 'html', 'xhtml', 'css'}: + handle(name) + + (Patch and additional tests contributed by Dave Malcolm; + bpo-6690(1)). + + * Serializing and unserializing data using the *note pickle: c7. + module is now several times faster. + + (Contributed by Alexandre Vassalotti, Antoine Pitrou and the + Unladen Swallow team in bpo-9410(2) and bpo-3873(3).) + + * The Timsort algorithm(4) used in *note list.sort(): 834. and *note + sorted(): 833. now runs faster and uses less memory when called + with a *note key function: a86. 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(5).) + + * 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 ‘sort_keys’ + argument is true. + + (Contributed by Antoine Pitrou in bpo-7451(6) and by Raymond + Hettinger and Antoine Pitrou in bpo-10314(7).) + + * Recursive locks (created with the *note threading.RLock(): f14. + 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(8).) + + * The fast-search algorithm in stringlib is now used by the + ‘split()’, ‘rsplit()’, ‘splitlines()’ and ‘replace()’ methods on + *note bytes: 1b4, *note bytearray: 1a5. and *note str: 1b3. + objects. Likewise, the algorithm is also used by ‘rfind()’, + ‘rindex()’, ‘rsplit()’ and ‘rpartition()’. + + (Patch by Florent Xicluna in bpo-7622(9) and bpo-7462(10).) + + * Integer to string conversions now work two “digits” at a time, + reducing the number of division and modulo operations. + + (bpo-6713(11) by Gawain Bolton, Mark Dickinson, and Victor + Stinner.) + +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(12)). The ‘array.repeat()’ method has a faster +implementation (bpo-1569291(13) by Alexander Belopolsky). The +‘BaseHTTPRequestHandler’ has more efficient buffering (bpo-3709(14) by +Andrew Schaaf). The *note operator.attrgetter(): ab7. function has been +sped-up (bpo-10160(15) by Christos Georgiou). And ‘ConfigParser’ loads +multi-line arguments a bit faster (bpo-7113(16) by Łukasz Langa). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6690 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=9410 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=3873 + + (4) https://en.wikipedia.org/wiki/Timsort + + (5) https://bugs.python.org/issue?@action=redirect&bpo=9915 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=7451 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=10314 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=3001 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=7622 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=7462 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=6713 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=8685 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=1569291 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=3709 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=10160 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=7113 + + +File: python.info, Node: Unicode, Next: Codecs, Prev: Optimizations<9>, Up: What’s New In Python 3 2 + +1.10.12 Unicode +--------------- + +Python has been updated to Unicode 6.0.0(1). The update to the standard +adds over 2,000 new characters including emoji(2) 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(3). + + ---------- Footnotes ---------- + + (1) https://unicode.org/versions/Unicode6.0.0/ + + (2) https://en.wikipedia.org/wiki/Emoji + + (3) https://www.unicode.org/versions/Unicode6.0.0/#Database_Changes + + +File: python.info, Node: Codecs, Next: Documentation, Prev: Unicode, Up: What’s New In Python 3 2 + +1.10.13 Codecs +-------------- + +Support was added for `cp720' Arabic DOS encoding (bpo-1616979(1)). + +MBCS encoding no longer ignores the error handler argument. In the +default strict mode, it raises an *note UnicodeDecodeError: 65c. when it +encounters an undecodable byte sequence and an *note UnicodeEncodeError: +246. for an unencodable character. + +The MBCS codec supports ‘'strict'’ and ‘'ignore'’ error handlers for +decoding, and ‘'strict'’ and ‘'replace'’ for encoding. + +To emulate Python3.1 MBCS encoding, select the ‘'ignore'’ handler for +decoding and the ‘'replace'’ handler for encoding. + +On Mac OS X, Python decodes command line arguments with ‘'utf-8'’ rather +than the locale encoding. + +By default, *note tarfile: fd. uses ‘'utf-8'’ encoding on Windows +(instead of ‘'mbcs'’) and the ‘'surrogateescape'’ error handler on all +operating systems. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1616979 + + +File: python.info, Node: Documentation, Next: IDLE, Prev: Codecs, Up: What’s New In Python 3 2 + +1.10.14 Documentation +--------------------- + +The documentation continues to be improved. + + * A table of quick links has been added to the top of lengthy + sections such as *note Built-in Functions: f18. In the case of + *note itertools: a1, 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. + + * 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 *note + functools: 7f. module documentation has a quick link at the top + labeled: + + `Source code' Lib/functools.py(1). + + (Contributed by Raymond Hettinger; see rationale(2).) + + * The docs now contain more examples and recipes. In particular, + *note re: da. module has an extensive section, *note Regular + Expression Examples: f19. Likewise, the *note itertools: a1. + module continues to be updated with new *note Itertools Recipes: + f1a. + + * The *note datetime: 2f. 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(3).) + + * The unmaintained ‘Demo’ directory has been removed. Some demos + were integrated into the documentation, some were moved to the + ‘Tools/demo’ directory, and others were removed altogether. + + (Contributed by Georg Brandl in bpo-7962(4).) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/functools.py + + (2) +https://rhettinger.wordpress.com/2011/01/28/open-your-source-more/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=9528 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=7962 + + +File: python.info, Node: IDLE, Next: Code Repository, Prev: Documentation, Up: What’s New In Python 3 2 + +1.10.15 IDLE +------------ + + * The format menu now has an option to clean source files by + stripping trailing whitespace. + + (Contributed by Raymond Hettinger; bpo-5150(1).) + + * 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(2).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5150 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=6075 + + +File: python.info, Node: Code Repository, Next: Build and C API Changes<5>, Prev: IDLE, Up: What’s New In Python 3 2 + +1.10.16 Code Repository +----------------------- + +In addition to the existing Subversion code repository at +‘https://svn.python.org’ there is now a Mercurial(1) repository at +‘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 PEP 385(2) for details. + +To learn to use the new version control system, see the Quick Start(3) +or the Guide to Mercurial Workflows(4). + + ---------- Footnotes ---------- + + (1) https://www.mercurial-scm.org/ + + (2) https://peps.python.org/pep-0385/ + + (3) https://www.mercurial-scm.org/wiki/QuickStart + + (4) https://www.mercurial-scm.org/guide + + +File: python.info, Node: Build and C API Changes<5>, Next: Porting to Python 3 2, Prev: Code Repository, Up: What’s New In Python 3 2 + +1.10.17 Build and C API Changes +------------------------------- + +Changes to Python’s build process and to the C API include: + + * The `idle', `pydoc' and `2to3' scripts are now installed with a + version-specific suffix on ‘make altinstall’ (bpo-10679(1)). + + * 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 *note + unicodedata.numeric(): f1e. now returns the correct value for large + code points, and *note repr(): 3ee. may consider more characters as + printable. + + (Reported by Bupjoe Lee and fixed by Amaury Forgeot D’Arc; + bpo-5127(2).) + + * 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 ‘--without-computed-gotos’. + + (Contributed by Antoine Pitrou; bpo-9203(3).) + + * The option ‘--with-wctype-functions’ was removed. The built-in + unicode database is now used for all functions. + + (Contributed by Amaury Forgeot D’Arc; bpo-9210(4).) + + * Hash values are now values of a new type, ‘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, *note set: 1a6. and *note + dict: 16e. can now hold more than ‘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(5).) + + * A new macro ‘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(6)). + + * A new C API function *note PySys_SetArgvEx(): 369. allows an + embedded interpreter to set *note sys.argv: f1f. without also + modifying *note sys.path: 162. (bpo-5753(7)). + + * ‘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(8)). + + * There is a new function *note PyLong_AsLongLongAndOverflow(): f20. + which is analogous to *note PyLong_AsLongAndOverflow(): f21. They + both serve to convert Python *note int: 1c7. into a native + fixed-width type while providing detection of cases where the + conversion won’t fit (bpo-7767(9)). + + * The *note PyUnicode_CompareWithASCIIString(): f22. function now + returns `not equal' if the Python string is `NUL' terminated. + + * There is a new function *note PyErr_NewExceptionWithDoc(): f23. + that is like *note PyErr_NewException(): f24. but allows a + docstring to be specified. This lets C exceptions have the same + self-documenting capabilities as their pure Python counterparts + (bpo-7033(10)). + + * When compiled with the ‘--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(11)). + + * Removed the ‘O?’ format from the `PyArg_Parse' functions. The + format is no longer used and it had never been documented + (bpo-8837(12)). + +There were a number of other small changes to the C-API. See the +Misc/NEWS(13) file for a complete list. + +Also, there were a number of updates to the Mac OS X build, see +Mac/BuildScript/README.txt(14) 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(15). See +‘https://www.python.org/download/mac/tcltk/’ for additional details. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10679 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5127 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=9203 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=9210 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=9778 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=2443 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=5753 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=8276 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=7767 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=7033 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=2422 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=8837 + + (13) https://github.com/python/cpython/blob/v3.2.6/Misc/NEWS + + (14) +https://github.com/python/cpython/blob/v3.2.6/Mac/BuildScript/README.txt + + (15) https://www.activestate.com/activetcl/downloads + + +File: python.info, Node: Porting to Python 3 2, Prev: Build and C API Changes<5>, Up: What’s New In Python 3 2 + +1.10.18 Porting to Python 3.2 +----------------------------- + +This section lists previously described changes and other bugfixes that +may require changes to your code: + + * The *note configparser: 21. module has a number of clean-ups. The + major change is to replace the old ‘ConfigParser’ class with + long-standing preferred alternative ‘SafeConfigParser’. In + addition there are a number of smaller incompatibilities: + + * The interpolation syntax is now validated on *note get(): f26. + and *note set(): f27. operations. In the default + interpolation scheme, only two tokens with percent signs are + valid: ‘%(name)s’ and ‘%%’, the latter being an escaped + percent sign. + + * The *note set(): f27. and *note add_section(): f28. methods + now verify that values are actual strings. Formerly, + unsupported types could be introduced unintentionally. + + * Duplicate sections or options from a single source now raise + either *note DuplicateSectionError: f29. or *note + DuplicateOptionError: f2a. Formerly, duplicates would + silently overwrite a previous entry. + + * Inline comments are now disabled by default so now the `;' + character can be safely used in values. + + * 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. + + * ‘""’ is now a valid value and is no longer automatically + converted to an empty string. For empty strings, use ‘"option + ="’ in a line. + + * The *note nntplib: be. module was reworked extensively, meaning + that its APIs are often incompatible with the 3.1 APIs. + + * *note bytearray: 1a5. objects can no longer be used as filenames; + instead, they should be converted to *note bytes: 1b4. + + * The ‘array.tostring()’ and ‘array.fromstring()’ have been renamed + to ‘array.tobytes()’ and ‘array.frombytes()’ for clarity. The old + names have been deprecated. (See bpo-8990(1).) + + * ‘PyArg_Parse*()’ functions: + + * “t#” format has been removed: use “s#” or “s*” instead + + * “w” and “w#” formats has been removed: use “w*” instead + + * The ‘PyCObject’ type, deprecated in 3.1, has been removed. To wrap + opaque C pointers in Python objects, the *note PyCapsule: f2b. 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. + + * The ‘sys.setfilesystemencoding()’ function was removed because it + had a flawed design. + + * The *note random.seed(): f2c. 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', ‘random.seed(s, version=1)’. + + * The previously deprecated ‘string.maketrans()’ function has been + removed in favor of the static methods *note bytes.maketrans(): + f2d. and *note bytearray.maketrans(): f2e. This change solves the + confusion around which types were supported by the *note string: + f3. module. Now, *note str: 1b3, *note bytes: 1b4, and *note + bytearray: 1a5. each have their own `maketrans' and `translate' + methods with intermediate translation tables of the appropriate + type. + + (Contributed by Georg Brandl; bpo-5675(2).) + + * The previously deprecated ‘contextlib.nested()’ function has been + removed in favor of a plain *note with: 19e. 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: + + with open('mylog.txt') as infile, open('a.out', 'w') as outfile: + for line in infile: + if '' in line: + outfile.write(line) + + (Contributed by Georg Brandl and Mattias Brändström; appspot issue + 53094(3).) + + * *note struct.pack(): f2f. now only allows bytes for the ‘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 ‘struct.pack('<6sHHBBB', 'GIF87a', x, y)’ should be + rewritten with to use bytes instead of text, + ‘struct.pack('<6sHHBBB', b'GIF87a', x, y)’. + + (Discovered by David Beazley and fixed by Victor Stinner; + bpo-10783(4).) + + * The *note xml.etree.ElementTree: 142. class now raises an *note + xml.etree.ElementTree.ParseError: f30. when a parse fails. + Previously it raised an *note xml.parsers.expat.ExpatError: f31. + + * The new, longer *note str(): 1b3. value on floats may break + doctests which rely on the old output format. + + * In *note subprocess.Popen: 6e8, the default value for `close_fds' + is now ‘True’ under Unix; under Windows, it is ‘True’ if the three + standard streams are set to ‘None’, ‘False’ otherwise. Previously, + `close_fds' was always ‘False’ by default, which produced difficult + to solve bugs or race conditions when open file descriptors would + leak into the child process. + + * Support for legacy HTTP 0.9 has been removed from *note + urllib.request: 12a. and *note http.client: 8f. Such support is + still present on the server side (in *note http.server: 92.). + + (Contributed by Antoine Pitrou, bpo-10711(5).) + + * SSL sockets in timeout mode now raise *note socket.timeout: 428. + when a timeout occurs, rather than a generic *note SSLError: f32. + + (Contributed by Antoine Pitrou, bpo-10272(6).) + + * The misleading functions *note PyEval_AcquireLock(): 6e1. and *note + PyEval_ReleaseLock(): f33. have been officially deprecated. The + thread-state aware APIs (such as *note PyEval_SaveThread(): f34. + and *note PyEval_RestoreThread(): 6e3.) should be used instead. + + * Due to security risks, ‘asyncore.handle_accept()’ has been + deprecated, and a new function, ‘asyncore.handle_accepted()’, was + added to replace it. + + (Contributed by Giampaolo Rodola in bpo-6706(7).) + + * Due to the new *note GIL: 4df. implementation, *note + PyEval_InitThreads(): 592. cannot be called before *note + Py_Initialize(): 4e7. anymore. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8990 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5675 + + (3) https://codereview.appspot.com/53094 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=10783 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=10711 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=10272 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=6706 + + +File: python.info, Node: What’s New In Python 3 1, Next: What’s New In Python 3 0, Prev: What’s New In Python 3 2, Up: What’s New in Python + +1.11 What’s New In Python 3.1 +============================= + + +Author: Raymond Hettinger + +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<11>. +* New, Improved, and Deprecated Modules: New Improved and Deprecated Modules<2>. +* Optimizations: Optimizations<10>. +* IDLE: IDLE<2>. +* Build and C API Changes: Build and C API Changes<6>. +* Porting to Python 3.1: Porting to Python 3 1. + + +File: python.info, Node: PEP 372 Ordered Dictionaries, Next: PEP 378 Format Specifier for Thousands Separator, Up: What’s New In Python 3 1 + +1.11.1 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 +*note collections.OrderedDict: 1a8. 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 *note configparser: 21. module uses them by default. This +lets configuration files be read, modified, and then written back in +their original order. The `_asdict()' method for *note +collections.namedtuple(): 538. now returns an ordered dictionary with +the values appearing in the same order as the underlying tuple indices. +The *note json: a2. 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(1). + +See also +........ + +PEP 372(2) - Ordered Dictionaries + + PEP written by Armin Ronacher and Raymond Hettinger. + Implementation written by Raymond Hettinger. + + ---------- Footnotes ---------- + + (1) https://pyyaml.org/ + + (2) https://peps.python.org/pep-0372/ + + +File: python.info, Node: PEP 378 Format Specifier for Thousands Separator, Next: Other Language Changes<11>, Prev: PEP 372 Ordered Dictionaries, Up: What’s New In Python 3 1 + +1.11.2 PEP 378: Format Specifier for Thousands Separator +-------------------------------------------------------- + +The built-in *note format(): 1f7. function and the *note str.format(): +1fc. 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: + + >>> 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' + +The supported types are *note int: 1c7, *note float: 3ca, *note complex: +1b8. and *note decimal.Decimal: 3bd. + +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. + +See also +........ + +PEP 378(1) - Format Specifier for Thousands Separator + + PEP written by Raymond Hettinger and implemented by Eric Smith and + Mark Dickinson. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0378/ + + +File: python.info, Node: Other Language Changes<11>, Next: New Improved and Deprecated Modules<2>, Prev: PEP 378 Format Specifier for Thousands Separator, Up: What’s New In Python 3 1 + +1.11.3 Other Language Changes +----------------------------- + +Some smaller changes made to the core Python language are: + + * Directories and zip archives containing a ‘__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(1).) + + * The *note int(): 1c7. type gained a ‘bit_length’ method that + returns the number of bits necessary to represent its argument in + binary: + + >>> n = 37 + >>> bin(37) + '0b100101' + >>> n.bit_length() + 6 + >>> n = 2**123-1 + >>> n.bit_length() + 123 + >>> (n+1).bit_length() + 124 + + (Contributed by Fredrik Johansson, Victor Stinner, Raymond + Hettinger, and Mark Dickinson; bpo-3439(2).) + + * The fields in *note format(): 1f7. strings can now be automatically + numbered: + + >>> 'Sir {} of {}'.format('Gallahad', 'Camelot') + 'Sir Gallahad of Camelot' + + Formerly, the string would have required numbered fields such as: + ‘'Sir {0} of {1}'’. + + (Contributed by Eric Smith; bpo-5237(3).) + + * The ‘string.maketrans()’ function is deprecated and is replaced by + new static methods, *note bytes.maketrans(): f2d. and *note + bytearray.maketrans(): f2e. This change solves the confusion + around which types were supported by the *note string: f3. module. + Now, *note str: 1b3, *note bytes: 1b4, and *note bytearray: 1a5. + each have their own `maketrans' and `translate' methods with + intermediate translation tables of the appropriate type. + + (Contributed by Georg Brandl; bpo-5675(4).) + + * The syntax of the *note with: 19e. statement now allows multiple + context managers in a single statement: + + >>> with open('mylog.txt') as infile, open('a.out', 'w') as outfile: + ... for line in infile: + ... if '' in line: + ... outfile.write(line) + + With the new syntax, the ‘contextlib.nested()’ function is no + longer needed and is now deprecated. + + (Contributed by Georg Brandl and Mattias Brändström; appspot issue + 53094(5).) + + * ‘round(x, n)’ now returns an integer if `x' is an integer. + Previously it returned a float: + + >>> round(1123, -2) + 1100 + + (Contributed by Mark Dickinson; bpo-4707(6).) + + * 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 ‘1.1’ which does + not have an exact equivalent in binary floating point. Since there + is no exact equivalent, an expression like ‘float('1.1')’ evaluates + to the nearest representable value which is ‘0x1.199999999999ap+0’ + in hex or ‘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 ‘repr(1.1)’ was computed as + ‘format(1.1, '.17g')’ which evaluated to ‘'1.1000000000000001'’. + The advantage of using 17 digits was that it relied on IEEE-754 + guarantees to assure that ‘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 ‘repr(1.1)’ is smarter and returns ‘'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 ‘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(7)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1739468 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=3439 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=5237 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=5675 + + (5) https://codereview.appspot.com/53094 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=4707 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=1580 + + +File: python.info, Node: New Improved and Deprecated Modules<2>, Next: Optimizations<10>, Prev: Other Language Changes<11>, Up: What’s New In Python 3 1 + +1.11.4 New, Improved, and Deprecated Modules +-------------------------------------------- + + * Added a *note collections.Counter: d43. class to support convenient + counting of unique items in a sequence or iterable: + + >>> Counter(['red', 'blue', 'red', 'green', 'blue', 'blue']) + Counter({'blue': 3, 'red': 2, 'green': 1}) + + (Contributed by Raymond Hettinger; bpo-1696199(1).) + + * Added a new module, *note tkinter.ttk: 118. 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(2).) + + * The *note gzip.GzipFile: 590. and *note bz2.BZ2File: 5a5. classes + now support the context management protocol: + + >>> # Automatically close file after writing + >>> with gzip.GzipFile(filename, "wb") as f: + ... f.write(b"xxx") + + (Contributed by Antoine Pitrou.) + + * The *note decimal: 34. module now supports methods for creating a + decimal object from a binary *note float: 3ca. The conversion is + exact but can sometimes be surprising: + + >>> Decimal.from_float(1.1) + Decimal('1.100000000000000088817841970012523233890533447265625') + + 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.) + + * The *note itertools: a1. module grew two new functions. The *note + itertools.combinations_with_replacement(): f3b. function is one of + four for generating combinatorics including permutations and + Cartesian products. The *note itertools.compress(): f3c. function + mimics its namesake from APL. Also, the existing *note + itertools.count(): f3d. function now has an optional `step' + argument and can accept any type of counting sequence including + *note fractions.Fraction: 210. and *note decimal.Decimal: 3bd.: + + >>> [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)] + + (Contributed by Raymond Hettinger.) + + * *note collections.namedtuple(): 538. 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: + + >>> 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)] + + (Contributed by Raymond Hettinger; bpo-1818(3).) + + * The *note re.sub(): 85d, *note re.subn(): ad0. and *note + re.split(): 7cb. functions now accept a flags parameter. + + (Contributed by Gregory Smith.) + + * The *note logging: a8. module now implements a simple *note + logging.NullHandler: f3e. 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”: + + >>> h = logging.NullHandler() + >>> logging.getLogger("foo").addHandler(h) + + (Contributed by Vinay Sajip; bpo-4384(4)). + + * The *note runpy: df. module which supports the ‘-m’ command line + switch now supports the execution of packages by looking for and + executing a ‘__main__’ submodule when a package name is supplied. + + (Contributed by Andi Vajda; bpo-4195(5).) + + * The *note pdb: c6. module can now access and display source code + loaded via *note zipimport: 14e. (or any other conformant PEP + 302(6) loader). + + (Contributed by Alexander Belopolsky; bpo-4201(7).) + + * *note functools.partial: b5b. objects can now be pickled. + + (Suggested by Antoine Pitrou and Jesse Noller. Implemented by Jack + Diederich; bpo-5228(8).) + + * Add *note pydoc: d6. help topics for symbols so that ‘help('@')’ + works as expected in the interactive environment. + + (Contributed by David Laban; bpo-4739(9).) + + * The *note unittest: 125. 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: + + 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): + ... + + Also, tests for exceptions have been builtout to work with context + managers using the *note with: 19e. statement: + + def test_division_by_zero(self): + with self.assertRaises(ZeroDivisionError): + x / 0 + + In addition, several new assertion methods were added including + ‘assertSetEqual()’, ‘assertDictEqual()’, + ‘assertDictContainsSubset()’, ‘assertListEqual()’, + ‘assertTupleEqual()’, ‘assertSequenceEqual()’, + ‘assertRaisesRegexp()’, ‘assertIsNone()’, and ‘assertIsNotNone()’. + + (Contributed by Benjamin Peterson and Antoine Pitrou.) + + * The *note io: 9f. module has three new constants for the ‘seek()’ + method ‘SEEK_SET’, ‘SEEK_CUR’, and ‘SEEK_END’. + + * The *note sys.version_info: 27d. tuple is now a named tuple: + + >>> sys.version_info + sys.version_info(major=3, minor=1, micro=0, releaselevel='alpha', serial=2) + + (Contributed by Ross Light; bpo-4285(10).) + + * The *note nntplib: be. and *note imaplib: 94. modules now support + IPv6. + + (Contributed by Derek Morr; bpo-1655(11) and bpo-1664(12).) + + * The *note pickle: c7. 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, ‘__builtin__.set’ + in Python 2 is called ‘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: + + >>> 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.' + + 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(13).) + + * A new module, *note importlib: 97. was added. It provides a + complete, portable, pure Python reference implementation of the + *note import: 1af. statement and its counterpart, the *note + __import__(): 510. function. It represents a substantial step + forward in documenting and defining the actions that take place + during imports. + + (Contributed by Brett Cannon.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1696199 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=2983 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1818 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=4384 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=4195 + + (6) https://peps.python.org/pep-0302/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=4201 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=5228 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=4739 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=4285 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1655 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=1664 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=6137 + + +File: python.info, Node: Optimizations<10>, Next: IDLE<2>, Prev: New Improved and Deprecated Modules<2>, Up: What’s New In Python 3 1 + +1.11.5 Optimizations +-------------------- + +Major performance enhancements have been added: + + * The new I/O library (as defined in PEP 3116(1)) 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 ‘_pyio’ module. + + (Contributed by Amaury Forgeot d’Arc and Antoine Pitrou.) + + * 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(2).) + + * Enabling a configure option named ‘--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(3)). + + * 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(4).) + + * The *note json: a2. module now has a C extension to substantially + improve its performance. In addition, the API was modified so that + json works only with *note str: 1b3, not with *note bytes: 1b4. + That change makes the module closely match the JSON + specification(5) which is defined in terms of Unicode. + + (Contributed by Bob Ippolito and converted to Py3.1 by Antoine + Pitrou and Benjamin Peterson; bpo-4136(6).) + + * 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(7).) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3116/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=4688 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=4753 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=4868 + + (5) http://json.org/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=4136 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=5084 + + +File: python.info, Node: IDLE<2>, Next: Build and C API Changes<6>, Prev: Optimizations<10>, Up: What’s New In Python 3 1 + +1.11.6 IDLE +----------- + + * IDLE’s format menu now provides an option to strip trailing + whitespace from a source file. + + (Contributed by Roger D. Serwy; bpo-5150(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5150 + + +File: python.info, Node: Build and C API Changes<6>, Next: Porting to Python 3 1, Prev: IDLE<2>, Up: What’s New In Python 3 1 + +1.11.7 Build and C API Changes +------------------------------ + +Changes to Python’s build process and to the C API include: + + * Integers are now stored internally either in base ‘2**15’ or in + base ‘2**30’, the base being determined at build time. Previously, + they were always stored in base ‘2**15’. Using base ‘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 ‘2**30’ on 64-bit machines and base + ‘2**15’ on 32-bit machines; on Unix, there’s a new configure option + ‘--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 *note sys.int_info: f42. 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: + + >>> import sys + >>> sys.int_info + sys.int_info(bits_per_digit=30, sizeof_digit=4) + + (Contributed by Mark Dickinson; bpo-4258(1).) + + * The *note PyLong_AsUnsignedLongLong(): f43. function now handles a + negative `pylong' by raising *note OverflowError: 4a4. instead of + *note TypeError: 19c. + + (Contributed by Mark Dickinson and Lisandro Dalcrin; bpo-5175(2).) + + * Deprecated ‘PyNumber_Int()’. Use *note PyNumber_Long(): 6b9. + instead. + + (Contributed by Mark Dickinson; bpo-4910(3).) + + * Added a new *note PyOS_string_to_double(): f44. function to replace + the deprecated functions ‘PyOS_ascii_strtod()’ and + ‘PyOS_ascii_atof()’. + + (Contributed by Mark Dickinson; bpo-5914(4).) + + * Added *note PyCapsule: f2b. as a replacement for the ‘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(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4258 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5175 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=4910 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=5914 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=5630 + + +File: python.info, Node: Porting to Python 3 1, Prev: Build and C API Changes<6>, Up: What’s New In Python 3 1 + +1.11.8 Porting to Python 3.1 +---------------------------- + +This section lists previously described changes and other bugfixes that +may require changes to your code: + + * The new floating point string representations can break existing + doctests. For example: + + def e(): + '''Compute the base of natural logarithms. + + >>> e() + 2.7182818284590451 + + ''' + return sum(1/math.factorial(x) for x in reversed(range(30))) + + doctest.testmod() + + ********************************************************************** + Failed example: + e() + Expected: + 2.7182818284590451 + Got: + 2.718281828459045 + ********************************************************************** + + * 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 ‘False’. See the discussion above for more + details. + + +File: python.info, Node: What’s New In Python 3 0, Next: What’s New in Python 2 7, Prev: What’s New In Python 3 1, Up: What’s New in Python + +1.12 What’s New In Python 3.0 +============================= + + +Author: Guido van Rossum + +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 ‘Misc/NEWS’ file in the +source distribution contains a wealth of detailed information about +every small thing that was changed. + +* 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. + + +File: python.info, Node: Common Stumbling Blocks, Next: Overview Of Syntax Changes, Up: What’s New In Python 3 0 + +1.12.1 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. + + +File: python.info, Node: Print Is A Function, Next: Views And Iterators Instead Of Lists, Up: Common Stumbling Blocks + +1.12.1.1 Print Is A Function +............................ + +The ‘print’ statement has been replaced with a *note print(): c13. +function, with keyword arguments to replace most of the special syntax +of the old ‘print’ statement ( PEP 3105(1)). Examples: + + 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)! + +You can also customize the separator between items, e.g.: + + print("There are <", 2**32, "> possibilities!", sep="") + +which produces: + + There are <4294967296> possibilities! + +Note: + + * The *note print(): c13. function doesn’t support the “softspace” + feature of the old ‘print’ statement. For example, in Python 2.x, + ‘print "A\n", "B"’ would write ‘"A\nB\n"’; but in Python 3.0, + ‘print("A\n", "B")’ writes ‘"A\n B\n"’. + + * Initially, you’ll be finding yourself typing the old ‘print x’ a + lot in interactive mode. Time to retrain your fingers to type + ‘print(x)’ instead! + + * When using the ‘2to3’ source-to-source conversion tool, all ‘print’ + statements are automatically converted to *note print(): c13. + function calls, so this is mostly a non-issue for larger projects. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3105/ + + +File: python.info, Node: Views And Iterators Instead Of Lists, Next: Ordering Comparisons, Prev: Print Is A Function, Up: Common Stumbling Blocks + +1.12.1.2 Views And Iterators Instead Of Lists +............................................. + +Some well-known APIs no longer return lists: + + * *note dict: 16e. methods *note dict.keys(): 3b8, *note + dict.items(): 3ba. and *note dict.values(): 3b9. return “views” + instead of lists. For example, this no longer works: ‘k = + d.keys(); k.sort()’. Use ‘k = sorted(d)’ instead (this works in + Python 2.5 too and is just as efficient). + + * Also, the ‘dict.iterkeys()’, ‘dict.iteritems()’ and + ‘dict.itervalues()’ methods are no longer supported. + + * *note map(): 460. and *note filter(): 461. return iterators. If + you really need a list and the input sequences are all of equal + length, a quick fix is to wrap *note map(): 460. in *note list(): + 1e9, e.g. ‘list(map(...))’, but a better fix is often to use a + list comprehension (especially when the original code uses *note + lambda: f4b.), or rewriting the code so it doesn’t need a list at + all. Particularly tricky is *note map(): 460. invoked for the side + effects of the function; the correct transformation is to use a + regular *note for: 199. loop (since creating a list would just be + wasteful). + + If the input sequences are not of equal length, *note map(): 460. + will stop at the termination of the shortest of the sequences. For + full compatibility with *note map(): 460. from Python 2.x, also + wrap the sequences in *note itertools.zip_longest(): f4c, e.g. + ‘map(func, *sequences)’ becomes ‘list(map(func, + itertools.zip_longest(*sequences)))’. + + * *note range(): 58b. now behaves like ‘xrange()’ used to behave, + except it works with values of arbitrary size. The latter no + longer exists. + + * *note zip(): 3bc. now returns an iterator. + + +File: python.info, Node: Ordering Comparisons, Next: Integers, Prev: Views And Iterators Instead Of Lists, Up: Common Stumbling Blocks + +1.12.1.3 Ordering Comparisons +............................. + +Python 3.0 has simplified the rules for ordering comparisons: + + * The ordering comparison operators (‘<’, ‘<=’, ‘>=’, ‘>’) raise a + TypeError exception when the operands don’t have a meaningful + natural ordering. Thus, expressions like ‘1 < ''’, ‘0 > None’ or + ‘len <= len’ are no longer valid, and e.g. ‘None < None’ raises + *note TypeError: 19c. instead of returning ‘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 ‘==’ and ‘!=’ operators: objects of different + incomparable types always compare unequal to each other. + + * ‘builtin.sorted()’ and *note list.sort(): 834. 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”. + + * The ‘cmp()’ function should be treated as gone, and the ‘__cmp__()’ + special method is no longer supported. Use ‘__lt__()’ for sorting, + ‘__eq__()’ with ‘__hash__()’, and other rich comparisons as needed. + (If you really need the ‘cmp()’ functionality, you could use the + expression ‘(a > b) - (a < b)’ as the equivalent for ‘cmp(a, b)’.) + + +File: python.info, Node: Integers, Next: Text Vs Data Instead Of Unicode Vs 8-bit, Prev: Ordering Comparisons, Up: Common Stumbling Blocks + +1.12.1.4 Integers +................. + + * PEP 237(1): Essentially, ‘long’ renamed to *note int: 1c7. That + is, there is only one built-in integral type, named *note int: + 1c7.; but it behaves mostly like the old ‘long’ type. + + * PEP 238(2): An expression like ‘1/2’ returns a float. Use ‘1//2’ + to get the truncating behavior. (The latter syntax has existed for + years, at least since Python 2.2.) + + * The ‘sys.maxint’ constant was removed, since there is no longer a + limit to the value of integers. However, *note sys.maxsize: e77. + 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 ‘sys.maxint’ in previous releases on + the same platform (assuming the same build options). + + * The *note repr(): 3ee. of a long integer doesn’t include the + trailing ‘L’ anymore, so code that unconditionally strips that + character will chop off the last digit instead. (Use *note str(): + 1b3. instead.) + + * Octal literals are no longer of the form ‘0720’; use ‘0o720’ + instead. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0237/ + + (2) https://peps.python.org/pep-0238/ + + +File: python.info, Node: Text Vs Data Instead Of Unicode Vs 8-bit, Prev: Integers, Up: Common Stumbling Blocks + +1.12.1.5 Text Vs. Data Instead Of Unicode Vs. 8-bit +................................................... + +Everything you thought you knew about binary data and Unicode has +changed. + + * 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 *note str: 1b3, the type used to hold data is *note + bytes: 1b4. The biggest difference with the 2.x situation is that + any attempt to mix text and data in Python 3.0 raises *note + TypeError: 19c, 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 *note + UnicodeDecodeError: 65c. if it contained non-ASCII values. This + value-specific behavior has caused numerous sad faces over the + years. + + * 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 ‘unicode’ for all + unencoded text, and *note str: 1b3. for binary or encoded data + only. Then the ‘2to3’ tool will do most of the work for you. + + * You can no longer use ‘u"..."’ literals for Unicode text. However, + you must use ‘b"..."’ literals for binary data. + + * As the *note str: 1b3. and *note bytes: 1b4. types cannot be mixed, + you must always explicitly convert between them. Use *note + str.encode(): 512. to go from *note str: 1b3. to *note bytes: 1b4, + and *note bytes.decode(): 513. to go from *note bytes: 1b4. to + *note str: 1b3. You can also use ‘bytes(s, encoding=...)’ and + ‘str(b, encoding=...)’, respectively. + + * Like *note str: 1b3, the *note bytes: 1b4. type is immutable. + There is a separate `mutable' type to hold buffered binary data, + *note bytearray: 1a5. Nearly all APIs that accept *note bytes: + 1b4. also accept *note bytearray: 1a5. The mutable API is based on + ‘collections.MutableSequence’. + + * All backslashes in raw string literals are interpreted literally. + This means that ‘'\U'’ and ‘'\u'’ escapes in raw strings are not + treated specially. For example, ‘r'\u20ac'’ is a string of 6 + characters in Python 3.0, whereas in 2.6, ‘ur'\u20ac'’ was the + single “euro” character. (Of course, this change only affects raw + string literals; the euro character is ‘'\u20ac'’ in Python 3.0.) + + * The built-in ‘basestring’ abstract type was removed. Use *note + str: 1b3. instead. The *note str: 1b3. and *note bytes: 1b4. types + don’t have functionality enough in common to warrant a shared base + class. The ‘2to3’ tool (see below) replaces every occurrence of + ‘basestring’ with *note str: 1b3. + + * Files opened as text files (still the default mode for *note + open(): 30b.) always use an encoding to map between strings (in + memory) and bytes (on disk). Binary files (opened with a ‘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 ‘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 *note codecs: 1a. module. + + * The initial values of *note sys.stdin: 729, *note sys.stdout: 72a. + and *note sys.stderr: 581. are now unicode-only text files (i.e., + they are instances of *note io.TextIOBase: f50.). To read and + write bytes data with these streams, you need to use their *note + io.TextIOBase.buffer: f51. attribute. + + * 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. *note open(): 30b. and many functions + in the *note os: c2. module) that take filenames accept *note + bytes: 1b4. objects as well as strings, and a few APIs have a way + to ask for a *note bytes: 1b4. return value. Thus, *note + os.listdir(): da5. returns a list of *note bytes: 1b4. instances if + the argument is a *note bytes: 1b4. instance, and *note + os.getcwdb(): 6e7. returns the current working directory as a *note + bytes: 1b4. instance. Note that when *note os.listdir(): da5. + returns a list of strings, filenames that cannot be decoded + properly are omitted rather than raising *note UnicodeError: f52. + + * Some system APIs like *note os.environ: e6e. and *note sys.argv: + f1f. can also present problems when the bytes made available by the + system is not interpretable using the default encoding. Setting + the ‘LANG’ variable and rerunning the program is probably the best + approach. + + * PEP 3138(1): The *note repr(): 3ee. 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. + + * PEP 3120(2): The default source encoding is now UTF-8. + + * PEP 3131(3): Non-ASCII letters are now allowed in identifiers. + (However, the standard library remains ASCII-only with the + exception of contributor names in comments.) + + * The ‘StringIO’ and ‘cStringIO’ modules are gone. Instead, import + the *note io: 9f. module and use *note io.StringIO: bbe. or *note + io.BytesIO: b31. for text and data respectively. + + * See also the *note Unicode HOWTO: f53, which was updated for Python + 3.0. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3138/ + + (2) https://peps.python.org/pep-3120/ + + (3) https://peps.python.org/pep-3131/ + + +File: python.info, Node: Overview Of Syntax Changes, Next: Changes Already Present In Python 2 6, Prev: Common Stumbling Blocks, Up: What’s New In Python 3 0 + +1.12.2 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:: + + +File: python.info, Node: New Syntax, Next: Changed Syntax, Up: Overview Of Syntax Changes + +1.12.2.1 New Syntax +................... + + * PEP 3107(1): 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 ‘__annotations__’ attribute. The intent is to encourage + experimentation through metaclasses, decorators or frameworks. + + * PEP 3102(2): Keyword-only arguments. Named parameters occurring + after ‘*args’ in the parameter list `must' be specified using + keyword syntax in the call. You can also use a bare ‘*’ in the + parameter list to indicate that you don’t accept a variable-length + argument list, but you do have keyword-only arguments. + + * 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. + + * PEP 3104(3): *note nonlocal: f56. statement. Using ‘nonlocal x’ + you can now assign directly to a variable in an outer (but + non-global) scope. ‘nonlocal’ is a new reserved word. + + * PEP 3132(4): Extended Iterable Unpacking. You can now write things + like ‘a, b, *rest = some_sequence’. And even ‘*rest, a = stuff’. + The ‘rest’ object is always a (possibly empty) list; the right-hand + side may be any iterable. Example: + + (a, *rest, b) = range(5) + + This sets `a' to ‘0’, `b' to ‘4’, and `rest' to ‘[1, 2, 3]’. + + * Dictionary comprehensions: ‘{k: v for k, v in stuff}’ means the + same thing as ‘dict(stuff)’ but is more flexible. (This is PEP + 274(5) vindicated. :-) + + * Set literals, e.g. ‘{1, 2}’. Note that ‘{}’ is an empty + dictionary; use ‘set()’ for an empty set. Set comprehensions are + also supported; e.g., ‘{x for x in stuff}’ means the same thing as + ‘set(stuff)’ but is more flexible. + + * New octal literals, e.g. ‘0o720’ (already in 2.6). The old octal + literals (‘0720’) are gone. + + * New binary literals, e.g. ‘0b1010’ (already in 2.6), and there is + a new corresponding built-in function, *note bin(): f57. + + * Bytes literals are introduced with a leading ‘b’ or ‘B’, and there + is a new corresponding built-in function, *note bytes(): 1b4. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3107/ + + (2) https://peps.python.org/pep-3102/ + + (3) https://peps.python.org/pep-3104/ + + (4) https://peps.python.org/pep-3132/ + + (5) https://peps.python.org/pep-0274/ + + +File: python.info, Node: Changed Syntax, Next: Removed Syntax, Prev: New Syntax, Up: Overview Of Syntax Changes + +1.12.2.2 Changed Syntax +....................... + + * PEP 3109(1) and PEP 3134(2): new *note raise: 1be. statement + syntax: ‘raise [EXPR [from EXPR]]’. See below. + + * ‘as’ and *note with: 19e. are now reserved words. (Since 2.6, + actually.) + + * ‘True’, ‘False’, and ‘None’ are reserved words. (2.6 partially + enforced the restrictions on ‘None’ already.) + + * Change from *note except: 17a. `exc', `var' to ‘except’ `exc' ‘as’ + `var'. See PEP 3110(3). + + * PEP 3115(4): New Metaclass Syntax. Instead of: + + class C: + __metaclass__ = M + ... + + you must now use: + + class C(metaclass=M): + ... + + The module-global ‘__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 *note object: 6df.) + + * List comprehensions no longer support the syntactic form ‘[... for + VAR in ITEM1, ITEM2, ...]’. Use ‘[... for VAR in (ITEM1, ITEM2, + ...)]’ instead. Also note that list comprehensions have different + semantics: they are closer to syntactic sugar for a generator + expression inside a *note list(): 1e9. constructor, and in + particular the loop control variables are no longer leaked into the + surrounding scope. + + * The `ellipsis' (‘...’) can be used as an atomic expression + anywhere. (Previously it was only allowed in slices.) Also, it + `must' now be spelled as ‘...’. (Previously it could also be + spelled as ‘. . .’, by a mere accident of the grammar.) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3109/ + + (2) https://peps.python.org/pep-3134/ + + (3) https://peps.python.org/pep-3110/ + + (4) https://peps.python.org/pep-3115/ + + +File: python.info, Node: Removed Syntax, Prev: Changed Syntax, Up: Overview Of Syntax Changes + +1.12.2.3 Removed Syntax +....................... + + * PEP 3113(1): Tuple parameter unpacking removed. You can no longer + write ‘def foo(a, (b, c)): ...’. Use ‘def foo(a, b_c): b, c = b_c’ + instead. + + * Removed backticks (use *note repr(): 3ee. instead). + + * Removed ‘<>’ (use ‘!=’ instead). + + * Removed keyword: *note exec(): 4a8. is no longer a keyword; it + remains as a function. (Fortunately the function syntax was also + accepted in 2.x.) Also note that *note exec(): 4a8. no longer + takes a stream argument; instead of ‘exec(f)’ you can use + ‘exec(f.read())’. + + * Integer literals no longer support a trailing ‘l’ or ‘L’. + + * String literals no longer support a leading ‘u’ or ‘U’. + + * The *note from: f5a. `module' *note import: 1af. ‘*’ syntax is only + allowed at the module level, no longer inside functions. + + * The only acceptable syntax for relative imports is ‘from .[MODULE] + import NAME’. All *note import: 1af. forms not starting with ‘.’ + are interpreted as absolute imports. ( PEP 328(2)) + + * Classic classes are gone. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3113/ + + (2) https://peps.python.org/pep-0328/ + + +File: python.info, Node: Changes Already Present In Python 2 6, Next: Library Changes, Prev: Overview Of Syntax Changes, Up: What’s New In Python 3 0 + +1.12.3 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 *note What’s New in Python 2.6: f5c. +should be consulted for longer descriptions. + + * *note PEP 343; The ‘with’ statement: f5d. The *note with: 19e. + statement is now a standard feature and no longer needs to be + imported from the *note __future__: 0. Also check out *note + Writing Context Managers: f5e. and *note The contextlib module: + f5f. + + * *note PEP 366; Explicit Relative Imports From a Main Module: f60. + This enhances the usefulness of the *note -m: 1ae. option when the + referenced module lives in a package. + + * *note PEP 370; Per-user site-packages Directory: f61. + + * *note PEP 371; The multiprocessing Package: f62. + + * *note PEP 3101; Advanced String Formatting: f63. Note: the 2.6 + description mentions the *note format(): 1f7. method for both 8-bit + and Unicode strings. In 3.0, only the *note str: 1b3. type (text + strings with Unicode support) supports this method; the *note + bytes: 1b4. type does not. The plan is to eventually make this the + only API for string formatting, and to start deprecating the ‘%’ + operator in Python 3.1. + + * *note PEP 3105; print As a Function: f64. This is now a standard + feature and no longer needs to be imported from *note __future__: + 0. More details were given above. + + * *note PEP 3110; Exception-Handling Changes: f65. The *note except: + 17a. `exc' ‘as’ `var' syntax is now standard and ‘except’ `exc', + `var' is no longer supported. (Of course, the ‘as’ `var' part is + still optional.) + + * *note PEP 3112; Byte Literals: f66. The ‘b"..."’ string literal + notation (and its variants like ‘b'...'’, ‘b"""..."""’, and + ‘br"..."’) now produces a literal of type *note bytes: 1b4. + + * *note PEP 3116; New I/O Library: f67. The *note io: 9f. module is + now the standard way of doing file I/O. The built-in *note open(): + 30b. function is now an alias for *note io.open(): 30c. and has + additional keyword arguments `encoding', `errors', `newline' and + `closefd'. Also note that an invalid `mode' argument now raises + *note ValueError: 1c8, not *note IOError: d02. The binary file + object underlying a text file object can be accessed as ‘f.buffer’ + (but beware that the text object maintains a buffer of itself in + order to speed up the encoding and decoding operations). + + * *note PEP 3118; Revised Buffer Protocol: f68. The old builtin + ‘buffer()’ is now really gone; the new builtin *note memoryview(): + 6ad. provides (mostly) similar functionality. + + * *note PEP 3119; Abstract Base Classes: f69. The *note abc: 3. + module and the ABCs defined in the *note collections: 1c. module + plays a somewhat more prominent role in the language now, and + built-in collection types like *note dict: 16e. and *note list: + 1e9. conform to the ‘collections.MutableMapping’ and + ‘collections.MutableSequence’ ABCs, respectively. + + * *note PEP 3127; Integer Literal Support and Syntax: f6a. As + mentioned above, the new octal literal notation is the only one + supported, and binary literals have been added. + + * *note PEP 3129; Class Decorators: f6b. + + * *note PEP 3141; A Type Hierarchy for Numbers: f6c. The *note + numbers: bf. module is another new use of ABCs, defining Python’s + “numeric tower”. Also note the new *note fractions: 7d. module + which implements *note numbers.Rational: f6d. + + +File: python.info, Node: Library Changes, Next: PEP 3101 A New Approach To String Formatting, Prev: Changes Already Present In Python 2 6, Up: What’s New In Python 3 0 + +1.12.4 Library Changes +---------------------- + +Due to time constraints, this document does not exhaustively cover the +very extensive changes to the standard library. PEP 3108(1) is the +reference for the major changes to the library. Here’s a capsule +review: + + * Many old modules were removed. Some, like ‘gopherlib’ (no longer + used) and ‘md5’ (replaced by *note hashlib: 88.), were already + deprecated by PEP 4(2). Others were removed as a result of the + removal of support for various platforms such as Irix, BeOS and Mac + OS 9 (see PEP 11(3)). Some modules were also selected for removal + in Python 3.0 due to lack of use or because a better replacement + exists. See PEP 3108(4) for an exhaustive list. + + * The ‘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 + ‘https://www.jcea.es/programacion/pybsddb.htm’. + + * Some modules were renamed because their old name disobeyed PEP + 8(5), or for various other reasons. Here’s the list: + + Old Name New Name + + -------------------------------------------------------- + + _winreg winreg + + + ConfigParser configparser + + + copy_reg copyreg + + + Queue queue + + + SocketServer socketserver + + + markupbase _markupbase + + + repr reprlib + + + test.test_support test.support + + + * 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, *note pickle: c7. and + ‘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 *note pickle: c7. / ‘cPickle’ pair received this + treatment. The *note profile: d0. module is on the list for 3.1. + The ‘StringIO’ module has been turned into a class in the *note io: + 9f. module. + + * Some related modules have been grouped into packages, and usually + the submodule names have been simplified. The resulting new + packages are: + + * *note dbm: 30. (‘anydbm’, ‘dbhash’, *note dbm: 30, ‘dumbdbm’, + ‘gdbm’, ‘whichdb’). + + * *note html: 8b. (‘HTMLParser’, ‘htmlentitydefs’). + + * *note http: 8e. (‘httplib’, ‘BaseHTTPServer’, ‘CGIHTTPServer’, + ‘SimpleHTTPServer’, ‘Cookie’, ‘cookielib’). + + * *note tkinter: 10e. (all ‘Tkinter’-related modules except + *note turtle: 120.). The target audience of *note turtle: + 120. doesn’t really care about *note tkinter: 10e. Also note + that as of Python 2.6, the functionality of *note turtle: 120. + has been greatly enhanced. + + * *note urllib: 127. (*note urllib: 127, ‘urllib2’, ‘urlparse’, + ‘robotparse’). + + * ‘xmlrpc’ (‘xmlrpclib’, ‘DocXMLRPCServer’, + ‘SimpleXMLRPCServer’). + +Some other changes to standard library modules, not covered by PEP +3108(6): + + * Killed ‘sets’. Use the built-in *note set(): 1a6. class. + + * Cleanup of the *note sys: f9. module: removed ‘sys.exitfunc()’, + ‘sys.exc_clear()’, ‘sys.exc_type’, ‘sys.exc_value’, + ‘sys.exc_traceback’. (Note that *note sys.last_type: f6f. etc. + remain.) + + * Cleanup of the *note array.array: 3d2. type: the ‘read()’ and + ‘write()’ methods are gone; use ‘fromfile()’ and ‘tofile()’ + instead. Also, the ‘'c'’ typecode for array is gone – use either + ‘'b'’ for bytes or ‘'u'’ for Unicode characters. + + * Cleanup of the *note operator: c0. module: removed + ‘sequenceIncludes()’ and ‘isCallable()’. + + * Cleanup of the ‘thread’ module: ‘acquire_lock()’ and + ‘release_lock()’ are gone; use ‘acquire()’ and ‘release()’ instead. + + * Cleanup of the *note random: d9. module: removed the ‘jumpahead()’ + API. + + * The ‘new’ module is gone. + + * The functions ‘os.tmpnam()’, ‘os.tempnam()’ and ‘os.tmpfile()’ have + been removed in favor of the *note tempfile: ff. module. + + * The *note tokenize: 11a. module has been changed to work with + bytes. The main entry point is now *note tokenize.tokenize(): f70, + instead of generate_tokens. + + * ‘string.letters’ and its friends (‘string.lowercase’ and + ‘string.uppercase’) are gone. Use *note string.ascii_letters: f71. + etc. instead. (The reason for the removal is that + ‘string.letters’ and friends had locale-specific behavior, which is + a bad idea for such attractively named global “constants”.) + + * Renamed module ‘__builtin__’ to *note builtins: 11. (removing the + underscores, adding an ‘s’). The ‘__builtins__’ variable found in + most global namespaces is unchanged. To modify a builtin, you + should use *note builtins: 11, not ‘__builtins__’! + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3108/ + + (2) https://peps.python.org/pep-0004/ + + (3) https://peps.python.org/pep-0011/ + + (4) https://peps.python.org/pep-3108/ + + (5) https://peps.python.org/pep-0008/ + + (6) https://peps.python.org/pep-3108/ + + +File: python.info, Node: PEP 3101 A New Approach To String Formatting, Next: Changes To Exceptions, Prev: Library Changes, Up: What’s New In Python 3 0 + +`PEP 3101': A New Approach To String Formatting + + * A new system for built-in string formatting operations replaces the + ‘%’ string formatting operator. (However, the ‘%’ operator is + still supported; it will be deprecated in Python 3.1 and removed + from the language at some later time.) Read PEP 3101(1) for the + full scoop. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3101/ + + +File: python.info, Node: Changes To Exceptions, Next: Miscellaneous Other Changes, Prev: PEP 3101 A New Approach To String Formatting, Up: What’s New In Python 3 0 + +1.12.6 Changes To Exceptions +---------------------------- + +The APIs for raising and catching exception have been cleaned up and new +powerful features added: + + * PEP 352(1): All exceptions must be derived (directly or indirectly) + from *note BaseException: 17d. This is the root of the exception + hierarchy. This is not new as a recommendation, but the + `requirement' to inherit from *note BaseException: 17d. 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. + + * Almost all exceptions should actually derive from *note Exception: + 61c.; *note BaseException: 17d. should only be used as a base class + for exceptions that should only be handled at the top level, such + as *note SystemExit: 9b6. or *note KeyboardInterrupt: 611. The + recommended idiom for handling all exceptions except for this + latter category is to use *note except: 17a. *note Exception: 61c. + + * ‘StandardError’ was removed. + + * Exceptions no longer behave as sequences. Use the ‘args’ attribute + instead. + + * PEP 3109(2): Raising exceptions. You must now use ‘raise + EXCEPTION(ARGS)’ instead of ‘raise EXCEPTION, ARGS’. Additionally, + you can no longer explicitly specify a traceback; instead, if you + `have' to do this, you can assign directly to the ‘__traceback__’ + attribute (see below). + + * PEP 3110(3): Catching exceptions. You must now use ‘except + SOMEEXCEPTION as VARIABLE’ instead of ‘except SOMEEXCEPTION, + VARIABLE’. Moreover, the `variable' is explicitly deleted when the + *note except: 17a. block is left. + + * PEP 3134(4): Exception chaining. There are two cases: implicit + chaining and explicit chaining. Implicit chaining happens when an + exception is raised in an *note except: 17a. or *note finally: 60a. + 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 + ‘__context__’ attribute of the secondary exception. Explicit + chaining is invoked with this syntax: + + raise SecondaryException() from primary_exception + + (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 + ‘__cause__’ attribute of the secondary exception. The traceback + printed when an unhandled exception occurs walks the chain of + ‘__cause__’ and ‘__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.) + + * PEP 3134(5): Exception objects now store their traceback as the + ‘__traceback__’ attribute. This means that an exception object now + contains all the information pertaining to an exception, and there + are fewer reasons to use *note sys.exc_info(): 25b. (though the + latter is not removed). + + * A few exception messages are improved when Windows fails to load an + extension module. For example, ‘error code 193’ is now ‘%1 is not + a valid Win32 application’. Strings now deal with non-English + locales. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0352/ + + (2) https://peps.python.org/pep-3109/ + + (3) https://peps.python.org/pep-3110/ + + (4) https://peps.python.org/pep-3134/ + + (5) https://peps.python.org/pep-3134/ + + +File: python.info, Node: Miscellaneous Other Changes, Next: Build and C API Changes<7>, Prev: Changes To Exceptions, Up: What’s New In Python 3 0 + +1.12.7 Miscellaneous Other Changes +---------------------------------- + +* Menu: + +* Operators And Special Methods:: +* Builtins:: + + +File: python.info, Node: Operators And Special Methods, Next: Builtins, Up: Miscellaneous Other Changes + +1.12.7.1 Operators And Special Methods +...................................... + + * ‘!=’ now returns the opposite of ‘==’, unless ‘==’ returns *note + NotImplemented: 3c1. + + * 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. + + * ‘__getslice__()’, ‘__setslice__()’ and ‘__delslice__()’ were + killed. The syntax ‘a[i:j]’ now translates to + ‘a.__getitem__(slice(i, j))’ (or ‘__setitem__()’ or + ‘__delitem__()’, when used as an assignment or deletion target, + respectively). + + * PEP 3114(1): the standard *note next(): 3c7. method has been + renamed to *note __next__(): f76. + + * The ‘__oct__()’ and ‘__hex__()’ special methods are removed – *note + oct(): f77. and *note hex(): f78. use ‘__index__()’ now to convert + the argument to an integer. + + * Removed support for ‘__members__’ and ‘__methods__’. + + * The function attributes named ‘func_X’ have been renamed to use the + ‘__X__’ form, freeing up these names in the function attribute + namespace for user-defined attributes. To wit, ‘func_closure’, + ‘func_code’, ‘func_defaults’, ‘func_dict’, ‘func_doc’, + ‘func_globals’, ‘func_name’ were renamed to ‘__closure__’, + ‘__code__’, ‘__defaults__’, *note __dict__: 8ce, ‘__doc__’, + ‘__globals__’, *note __name__: f79, respectively. + + * ‘__nonzero__()’ is now ‘__bool__()’. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3114/ + + +File: python.info, Node: Builtins, Prev: Operators And Special Methods, Up: Miscellaneous Other Changes + +1.12.7.2 Builtins +................. + + * PEP 3135(1): New *note super(): 8b7. You can now invoke *note + super(): 8b7. without arguments and (assuming this is in a regular + instance method defined inside a *note class: f7b. statement) the + right class and instance will automatically be chosen. With + arguments, the behavior of *note super(): 8b7. is unchanged. + + * PEP 3111(2): ‘raw_input()’ was renamed to *note input(): f7c. That + is, the new *note input(): f7c. function reads a line from *note + sys.stdin: 729. and returns it with the trailing newline stripped. + It raises *note EOFError: f7d. if the input is terminated + prematurely. To get the old behavior of *note input(): f7c, use + ‘eval(input())’. + + * A new built-in function *note next(): 3c7. was added to call the + *note __next__(): f76. method on an object. + + * The *note round(): f7e. 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, ‘round(2.5)’ + now returns ‘2’ rather than ‘3’.) ‘round(x[, n])’ now delegates to + ‘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 ‘x’ when called with two arguments. + + * Moved ‘intern()’ to *note sys.intern(): f7f. + + * Removed: ‘apply()’. Instead of ‘apply(f, args)’ use ‘f(*args)’. + + * Removed *note callable(): e78. Instead of ‘callable(f)’ you can + use ‘isinstance(f, collections.Callable)’. The + ‘operator.isCallable()’ function is also gone. + + * Removed ‘coerce()’. This function no longer serves a purpose now + that classic classes are gone. + + * Removed ‘execfile()’. Instead of ‘execfile(fn)’ use + ‘exec(open(fn).read())’. + + * Removed the ‘file’ type. Use *note open(): 30b. There are now + several different kinds of streams that open can return in the + *note io: 9f. module. + + * Removed ‘reduce()’. Use *note functools.reduce(): f80. if you + really need it; however, 99 percent of the time an explicit *note + for: 199. loop is more readable. + + * Removed ‘reload()’. Use *note imp.reload(): f81. + + * Removed. ‘dict.has_key()’ – use the *note in: 20a. operator + instead. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3135/ + + (2) https://peps.python.org/pep-3111/ + + +File: python.info, Node: Build and C API Changes<7>, Next: Performance, Prev: Miscellaneous Other Changes, Up: What’s New In Python 3 0 + +1.12.8 Build and C API Changes +------------------------------ + +Due to time constraints, here is a `very' incomplete list of changes to +the C API. + + * Support for several platforms was dropped, including but not + limited to Mac OS 9, BeOS, RISCOS, Irix, and Tru64. + + * PEP 3118(1): New Buffer API. + + * PEP 3121(2): Extension Module Initialization & Finalization. + + * PEP 3123(3): Making *note PyObject_HEAD: f83. conform to standard + C. + + * No more C API support for restricted execution. + + * ‘PyNumber_Coerce()’, ‘PyNumber_CoerceEx()’, ‘PyMember_Get()’, and + ‘PyMember_Set()’ C APIs are removed. + + * New C API *note PyImport_ImportModuleNoBlock(): d2b, works like + *note PyImport_ImportModule(): 4ac. but won’t block on the import + lock (returning an error instead). + + * Renamed the boolean conversion C-level slot and method: + ‘nb_nonzero’ is now ‘nb_bool’. + + * Removed ‘METH_OLDARGS’ and ‘WITH_CYCLE_GC’ from the C API. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3118/ + + (2) https://peps.python.org/pep-3121/ + + (3) https://peps.python.org/pep-3123/ + + +File: python.info, Node: Performance, Next: Porting To Python 3 0, Prev: Build and C API Changes<7>, Up: What’s New In Python 3 0 + +1.12.9 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! + + +File: python.info, Node: Porting To Python 3 0, Prev: Performance, Up: What’s New In Python 3 0 + +1.12.10 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: + + 0. (Prerequisite:) Start with excellent test coverage. + + 1. 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. + + 2. (Still using 2.6:) Turn on the ‘-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. + + 3. Run the ‘2to3’ source-to-source translator over your source code + tree. (See *note 2to3 — Automated Python 2 to 3 code translation: + f86. for more on this tool.) Run the result of the translation + under Python 3.0. Manually fix up any remaining issues, fixing + problems until all tests pass again. + +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 ‘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 ‘2to3’ translator +again, rather than editing the 3.0 version of the source code. + +For porting C extensions to Python 3.0, please see *note Porting +Extension Modules to Python 3: f87. + + +File: python.info, Node: What’s New in Python 2 7, Next: What’s New in Python 2 6, Prev: What’s New In Python 3 0, Up: What’s New in Python + +1.13 What’s New in Python 2.7 +============================= + + +Author: A.M. Kuchling (amk at amk.ca) + +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 *note Decimal: 3bd. class. There are some useful +additions to the standard library, such as a greatly enhanced *note +unittest: 125. module, the *note argparse: 5. module for parsing +command-line options, convenient *note OrderedDict: 1a8. and *note +Counter: d43. classes in the *note collections: 1c. 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 +‘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 ‘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<12>. +* 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:: + + +File: python.info, Node: The Future for Python 2 x, Next: Changes to the Handling of Deprecation Warnings, Up: What’s New in Python 2 7 + +1.13.1 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 PEP 373(1). + +Some key consequences of the long-term significance of 2.7 are: + + * 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). + + * 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(2) provides + guidance on downloading and installing software from the Python + Package Index. + + * 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 *note New Features Added to + Python 2.7 Maintenance Releases: f8c. section below. + +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 *note Porting +Python 2 Code to Python 3: f8d. HOWTO guide. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0373/ + + (2) https://packaging.python.org + + +File: python.info, Node: Changes to the Handling of Deprecation Warnings, Next: Python 3 1 Features, Prev: The Future for Python 2 x, Up: What’s New in Python 2 7 + +1.13.2 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. *note DeprecationWarning: 2d4. 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(1).) + +In previous releases, *note DeprecationWarning: 2d4. 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. +*note DeprecationWarning: 2d4. 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 *note DeprecationWarning: 2d4. messages by +running Python with the *note -Wdefault: 502. (short form: *note -Wd: +502.) switch, or by setting the *note PYTHONWARNINGS: 80e. environment +variable to ‘"default"’ (or ‘"d"’) before running Python. Python code +can also re-enable them by calling ‘warnings.simplefilter('default')’. + +The ‘unittest’ module also automatically reenables deprecation warnings +when running tests. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7319 + + +File: python.info, Node: Python 3 1 Features, Next: PEP 372 Adding an Ordered Dictionary to collections, Prev: Changes to the Handling of Deprecation Warnings, Up: What’s New in Python 2 7 + +1.13.3 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: + + * The syntax for set literals (‘{1,2,3}’ is a mutable set). + + * Dictionary and set comprehensions (‘{i: i*2 for i in range(3)}’). + + * Multiple context managers in a single *note with: 19e. statement. + + * A new version of the *note io: 9f. library, rewritten in C for + performance. + + * The ordered-dictionary type described in *note PEP 372; Adding an + Ordered Dictionary to collections: f90. + + * The new ‘","’ format specifier described in *note PEP 378; Format + Specifier for Thousands Separator: f91. + + * The *note memoryview: 6ad. object. + + * A small subset of the *note importlib: 97. module, *note described + below: f92. + + * The *note repr(): 3ee. of a float ‘x’ is shorter in many cases: + it’s now based on the shortest decimal string that’s guaranteed to + round back to ‘x’. As in previous versions of Python, it’s + guaranteed that ‘float(repr(x))’ recovers ‘x’. + + * Float-to-string and string-to-float conversions are correctly + rounded. The *note round(): f7e. function is also now correctly + rounded. + + * The *note PyCapsule: f2b. type, used to provide a C API for + extension modules. + + * The *note PyLong_AsLongAndOverflow(): f21. C API function. + +Other new Python3-mode warnings include: + + * ‘operator.isCallable()’ and ‘operator.sequenceIncludes()’, which + are not supported in 3.x, now trigger warnings. + + * The ‘-3’ switch now automatically enables the ‘-Qwarn’ switch that + causes warnings about using classic division with integers and long + integers. + + +File: python.info, Node: PEP 372 Adding an Ordered Dictionary to collections, Next: PEP 378 Format Specifier for Thousands Separator<2>, Prev: Python 3 1 Features, Up: What’s New in Python 2 7 + +1.13.4 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 *note OrderedDict: 1a8. class in the *note collections: +1c. module. + +The *note OrderedDict: 1a8. 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: + + >>> from collections import OrderedDict + >>> d = OrderedDict([('first', 1), + ... ('second', 2), + ... ('third', 3)]) + >>> d.items() + [('first', 1), ('second', 2), ('third', 3)] + +If a new entry overwrites an existing entry, the original insertion +position is left unchanged: + + >>> d['second'] = 4 + >>> d.items() + [('first', 1), ('second', 4), ('third', 3)] + +Deleting an entry and reinserting it will move it to the end: + + >>> del d['second'] + >>> d['second'] = 5 + >>> d.items() + [('first', 1), ('third', 3), ('second', 5)] + +The *note popitem(): f94. method has an optional `last' argument that +defaults to ‘True’. If `last' is true, the most recently added key is +returned and removed; if it’s false, the oldest key is selected: + + >>> 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) + +Comparing two ordered dictionaries checks both the keys and values, and +requires that the insertion order was the same: + + >>> 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 + +Comparing an *note OrderedDict: 1a8. with a regular dictionary ignores +the insertion order and just compares the keys and values. + +How does the *note OrderedDict: 1a8. 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. + + * The ‘ConfigParser’ module uses them by default, meaning that + configuration files can now be read, modified, and then written + back in their original order. + + * The *note _asdict(): 624. method for *note + collections.namedtuple(): 538. now returns an ordered dictionary + with the values appearing in the same order as the underlying tuple + indices. + + * The *note json: a2. module’s *note JSONDecoder: 9c1. class + constructor was extended with an `object_pairs_hook' parameter to + allow ‘OrderedDict’ instances to be built by the decoder. Support + was also added for third-party tools like PyYAML(1). + +See also +........ + +PEP 372(2) - Adding an ordered dictionary to collections + + PEP written by Armin Ronacher and Raymond Hettinger; implemented by + Raymond Hettinger. + + ---------- Footnotes ---------- + + (1) https://pyyaml.org/ + + (2) https://peps.python.org/pep-0372/ + + +File: python.info, Node: PEP 378 Format Specifier for Thousands Separator<2>, Next: PEP 389 The argparse Module for Parsing Command Lines, Prev: PEP 372 Adding an Ordered Dictionary to collections, Up: What’s New in Python 2 7 + +1.13.5 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 *note locale: a7. +module, which can use different separators (“,” in North America, “.” in +Europe) and different grouping sizes, but *note locale: a7. 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 *note str.format(): 1fc. method. When +formatting a floating-point number, simply include a comma between the +width and the precision: + + >>> '{:20,.2f}'.format(18446744073709551616.0) + '18,446,744,073,709,551,616.00' + +When formatting an integer, include the comma after the width: + + >>> '{:20,d}'.format(18446744073709551616) + '18,446,744,073,709,551,616' + +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 *note locale: a7. +module, but it’s easier to use. + +See also +........ + +PEP 378(1) - Format Specifier for Thousands Separator + + PEP written by Raymond Hettinger; implemented by Eric Smith. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0378/ + + +File: python.info, Node: PEP 389 The argparse Module for Parsing Command Lines, Next: PEP 391 Dictionary-Based Configuration For Logging, Prev: PEP 378 Format Specifier for Thousands Separator<2>, Up: What’s New in Python 2 7 + +1.13.6 PEP 389: The argparse Module for Parsing Command Lines +------------------------------------------------------------- + +The *note argparse: 5. module for parsing command-line arguments was +added as a more powerful replacement for the *note optparse: c1. module. + +This means Python now supports three different modules for parsing +command-line arguments: *note getopt: 81, *note optparse: c1, and *note +argparse: 5. The *note getopt: 81. module closely resembles the C +library’s ‘getopt()’ function, so it remains useful if you’re writing a +Python prototype that will eventually be rewritten in C. *note optparse: +c1. 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 *note argparse: 5. API consistent with *note +optparse: c1.’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 *note argparse: 5. +instead of *note optparse: c1. + +Here’s an 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__ + +Unless you override it, ‘-h’ and ‘--help’ switches are automatically +added, and produce neatly formatted output: + + -> ./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 + +As with *note optparse: c1, the command-line switches and arguments are +returned as an object with attributes named by the `dest' parameters: + + -> ./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']} + +*note argparse: 5. has much fancier validation than *note optparse: c1.; +you can specify an exact number of arguments as an integer, 0 or more +arguments by passing ‘'*'’, 1 or more by passing ‘'+'’, or an optional +argument with ‘'?'’. A top-level parser can contain sub-parsers to +define subcommands that have different sets of switches, as in ‘svn +commit’, ‘svn checkout’, etc. You can specify an argument’s type as +*note FileType: bb1, which will automatically open files for you and +understands that ‘'-'’ means standard input or output. + +See also +........ + +*note argparse: 5. documentation + + The documentation page of the argparse module. + +*note Upgrading optparse code: e61. + + Part of the Python documentation, describing how to convert code + that uses *note optparse: c1. + +PEP 389(1) - argparse - New Command Line Parsing Module + + PEP written and implemented by Steven Bethard. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0389/ + + +File: python.info, Node: PEP 391 Dictionary-Based Configuration For Logging, Next: PEP 3106 Dictionary Views, Prev: PEP 389 The argparse Module for Parsing Command Lines, Up: What’s New in Python 2 7 + +1.13.7 PEP 391: Dictionary-Based Configuration For Logging +---------------------------------------------------------- + +The *note logging: a8. 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. *note logging: a8. +also supports a ‘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 ‘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 *note Configuration functions: f98. + +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 ‘network.log’ file that will be +rotated once the log reaches 1MB. + + 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') + +Three smaller enhancements to the *note logging: a8. module, all +implemented by Vinay Sajip, are: + + * The *note SysLogHandler: 22e. class now supports syslogging over + TCP. The constructor has a `socktype' parameter giving the type of + socket to use, either *note socket.SOCK_DGRAM: f99. for UDP or + *note socket.SOCK_STREAM: f9a. for TCP. The default protocol + remains UDP. + + * *note Logger: 7a9. instances gained a *note getChild(): f9b. method + that retrieves a descendant logger using a relative path. For + example, once you retrieve a logger by doing ‘log = + getLogger('app')’, calling ‘log.getChild('network.listen')’ is + equivalent to ‘getLogger('app.network.listen')’. + + * The *note LoggerAdapter: f9c. class gained an ‘isEnabledFor()’ + method that takes a `level' and returns whether the underlying + logger would process a message of that level of importance. + +See also +........ + +PEP 391(1) - Dictionary-Based Configuration For Logging + + PEP written and implemented by Vinay Sajip. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0391/ + + +File: python.info, Node: PEP 3106 Dictionary Views, Next: PEP 3137 The memoryview Object, Prev: PEP 391 Dictionary-Based Configuration For Logging, Up: What’s New in Python 2 7 + +1.13.8 PEP 3106: Dictionary Views +--------------------------------- + +The dictionary methods *note keys(): 3b8, *note values(): 3b9, and *note +items(): 3ba. 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 *note keys(): 3b8, +*note values(): 3b9, and *note items(): 3ba. in Python 2.7 because too +much code would break. Instead the 3.x versions were added under the +new names ‘viewkeys()’, ‘viewvalues()’, and ‘viewitems()’. + + >>> 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]) + +Views can be iterated over, but the key and item views also behave like +sets. The ‘&’ operator performs intersection, and ‘|’ performs a union: + + >>> 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]) + +The view keeps track of the dictionary and its contents change as the +dictionary is modified: + + >>> vk = d.viewkeys() + >>> vk + dict_keys([0, 130, 10, ..., 250]) + >>> d[260] = '&' + >>> vk + dict_keys([0, 130, 260, 10, ..., 250]) + +However, note that you can’t add or remove keys while you’re iterating +over the view: + + >>> for k in vk: + ... d[k*2] = k + ... + Traceback (most recent call last): + File "", line 1, in + RuntimeError: dictionary changed size during iteration + +You can use the view methods in Python 2.x code, and the 2to3 converter +will change them to the standard *note keys(): 3b8, *note values(): 3b9, +and *note items(): 3ba. methods. + +See also +........ + +PEP 3106(1) - Revamping dict.keys(), .values() and .items() + + PEP written by Guido van Rossum. Backported to 2.7 by Alexandre + Vassalotti; bpo-1967(2). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3106/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1967 + + +File: python.info, Node: PEP 3137 The memoryview Object, Next: Other Language Changes<12>, Prev: PEP 3106 Dictionary Views, Up: What’s New in Python 2 7 + +1.13.9 PEP 3137: The memoryview Object +-------------------------------------- + +The *note memoryview: 6ad. object provides a view of another object’s +memory content that matches the *note bytes: 1b4. type’s interface. + + >>> import string + >>> m = memoryview(string.letters) + >>> m + + >>> 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 + + +The content of the view can be converted to a string of bytes or a list +of integers: + + >>> m2.tobytes() + 'abcdefghijklmnopqrstuvwxyz' + >>> m2.tolist() + [97, 98, 99, 100, 101, 102, 103, ... 121, 122] + >>> + +*note memoryview: 6ad. objects allow modifying the underlying object if +it’s a mutable object. + + >>> m2[0] = 75 + Traceback (most recent call last): + File "", line 1, in + 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') + >>> + +See also +........ + +PEP 3137(1) - 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(2). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3137/ + + (2) https://bugs.python.org/issue?@action=redirect&bpo=2396 + + +File: python.info, Node: Other Language Changes<12>, Next: New and Improved Modules, Prev: PEP 3137 The memoryview Object, Up: What’s New in Python 2 7 + +1.13.10 Other Language Changes +------------------------------ + +Some smaller changes made to the core Python language are: + + * 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. ‘{}’ continues to represent an + empty dictionary; use ‘set()’ for an empty set. + + >>> {1, 2, 3, 4, 5} + set([1, 2, 3, 4, 5]) + >>> set() # empty set + set([]) + >>> {} # empty dict + {} + + Backported by Alexandre Vassalotti; bpo-2335(1). + + * Dictionary and set comprehensions are another feature backported + from 3.x, generalizing list/generator comprehensions to use the + literal syntax for sets and dictionaries. + + >>> {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(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa']) + + Backported by Alexandre Vassalotti; bpo-2333(2). + + * The *note with: 19e. 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 ‘with’ + statement. This means that: + + with A() as a, B() as b: + ... suite of statements ... + + is equivalent to: + + with A() as a: + with B() as b: + ... suite of statements ... + + The ‘contextlib.nested()’ function provides a very similar + function, so it’s no longer necessary and has been deprecated. + + (Proposed in ‘https://codereview.appspot.com/53094’; implemented by + Georg Brandl.) + + * Conversions between floating-point numbers and strings are now + correctly rounded on most platforms. These conversions occur in + many different places: *note str(): 1b3. on floats and complex + numbers; the *note float: 3ca. and *note complex: 1b8. + constructors; numeric formatting; serializing and deserializing + floats and complex numbers using the *note marshal: ae, *note + pickle: c7. and *note json: a2. modules; parsing of float and + imaginary literals in Python code; and *note Decimal: 3bd.-to-float + conversion. + + Related to this, the *note repr(): 3ee. 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. + + 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 *note sys.float_repr_style: fa0, which will be ‘short’ if + the new code is in use and ‘legacy’ if it isn’t. + + Implemented by Eric Smith and Mark Dickinson, using David Gay’s + ‘dtoa.c’ library; bpo-7117(3). + + * 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: + + >>> n = 295147905179352891391 + >>> float(n) + 2.9514790517935283e+20 + >>> n - long(float(n)) + 65535L + + Python 2.7’s floating-point result is larger, but much closer to + the true value: + + >>> n = 295147905179352891391 + >>> float(n) + 2.9514790517935289e+20 + >>> n - long(float(n)) + -1L + + (Implemented by Mark Dickinson; bpo-3166(4).) + + Integer division is also more accurate in its rounding behaviours. + (Also implemented by Mark Dickinson; bpo-1811(5).) + + * Implicit coercion for complex numbers has been removed; the + interpreter will no longer ever attempt to call a ‘__coerce__()’ + method on complex objects. (Removed by Meador Inge and Mark + Dickinson; bpo-5211(6).) + + * The *note str.format(): 1fc. method now supports automatic + numbering of the replacement fields. This makes using *note + str.format(): 1fc. more closely resemble using ‘%s’ formatting: + + >>> '{}:{}:{}'.format(2009, 04, 'Sunday') + '2009:4:Sunday' + >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') + '2009:4:Sunday' + + The auto-numbering takes the fields from left to right, so the + first ‘{...}’ specifier will use the first argument to *note + str.format(): 1fc, 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(7).) + + Complex numbers now correctly support usage with *note format(): + 1f7, 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 ‘1.5+3j’ output. (Contributed by Eric + Smith; bpo-1588(8) and bpo-7988(9).) + + 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(10).) + + A low-level change: the *note object.__format__(): 1f6. method now + triggers a *note PendingDeprecationWarning: 503. if it’s passed a + format string, because the ‘__format__()’ method for *note object: + 6df. 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(11).) + + * The *note int(): 1c7. and ‘long()’ types gained a ‘bit_length’ + method that returns the number of bits necessary to represent its + argument in binary: + + >>> n = 37 + >>> bin(n) + '0b100101' + >>> n.bit_length() + 6 + >>> n = 2**123-1 + >>> n.bit_length() + 123 + >>> (n+1).bit_length() + 124 + + (Contributed by Fredrik Johansson and Victor Stinner; + bpo-3439(12).) + + * The *note import: 1af. statement will no longer try an absolute + import if a relative import (e.g. ‘from .os import sep’) fails. + This fixes a bug, but could possibly break certain ‘import’ + statements that were only working by accident. (Fixed by Meador + Inge; bpo-7902(13).) + + * It’s now possible for a subclass of the built-in ‘unicode’ type to + override the ‘__unicode__()’ method. (Implemented by Victor + Stinner; bpo-1583863(14).) + + * The *note bytearray: 1a5. type’s *note translate(): fa1. method now + accepts ‘None’ as its first argument. (Fixed by Georg Brandl; + bpo-4759(15).) + + * When using ‘@classmethod’ and ‘@staticmethod’ to wrap methods as + class or static methods, the wrapper object now exposes the wrapped + function as their ‘__func__’ attribute. (Contributed by Amaury + Forgeot d’Arc, after a suggestion by George Sakkis; bpo-5982(16).) + + * When a restricted set of attributes were set using ‘__slots__’, + deleting an unset attribute would not raise *note AttributeError: + 19d. as you would expect. Fixed by Benjamin Peterson; + bpo-7604(17).) + + * 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(18); CP858 contributed by Tim Hatch in + bpo-8016(19).) + + * The ‘file’ object will now set the ‘filename’ attribute on the + *note IOError: d02. exception when trying to open a directory on + POSIX platforms (noted by Jan Kaliszewski; bpo-4764(20)), 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(21)). + + * The Python tokenizer now translates line endings itself, so the + *note compile(): 310. built-in function now accepts code using any + line-ending convention. Additionally, it no longer requires that + the code end in a newline. + + * Extra parentheses in function definitions are illegal in Python + 3.x, meaning that you get a syntax error from ‘def f((x)): pass’. + In Python3-warning mode, Python 2.7 will now warn about this odd + usage. (Noted by James Lingard; bpo-7362(22).) + + * 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(23).) + + * 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(24)). + +* Menu: + +* Interpreter Changes:: +* Optimizations: Optimizations<11>. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2335 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=2333 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=7117 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=3166 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=1811 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=5211 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=5237 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=1588 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=7988 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=3382 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=7994 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=3439 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=7902 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=1583863 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=4759 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=5982 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=7604 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=1616979 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=8016 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=4764 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=5677 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=7362 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=8268 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=7140 + + +File: python.info, Node: Interpreter Changes, Next: Optimizations<11>, Up: Other Language Changes<12> + +1.13.10.1 Interpreter Changes +............................. + +A new environment variable, *note PYTHONWARNINGS: 80e, allows +controlling warnings. It should be set to a string containing warning +settings, equivalent to those used with the *note -W: 502. switch, +separated by commas. (Contributed by Brian Curtin; bpo-7301(1).) + +For example, the following setting will print warnings every time they +occur, but turn warnings from the ‘Cookie’ module into an error. (The +exact syntax for setting an environment variable varies across operating +systems and shells.) + + export PYTHONWARNINGS=all,error:::Cookie:0 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=7301 + + +File: python.info, Node: Optimizations<11>, Prev: Interpreter Changes, Up: Other Language Changes<12> + +1.13.10.2 Optimizations +....................... + +Several performance enhancements have been added: + + * A new opcode was added to perform the initial setup for *note with: + 19e. statements, looking up the ‘__enter__()’ and ‘__exit__()’ + methods. (Contributed by Benjamin Peterson.) + + * 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(1).) + + * 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(2).) + + * Long integers are now stored internally either in base ‘2**15’ or + in base ‘2**30’, the base being determined at build time. + Previously, they were always stored in base ‘2**15’. Using base + ‘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 ‘2**30’ on 64-bit machines + and base ‘2**15’ on 32-bit machines; on Unix, there’s a new + configure option ‘--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 ‘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: + + >>> import sys + >>> sys.long_info + sys.long_info(bits_per_digit=30, sizeof_digit=4) + + (Contributed by Mark Dickinson; bpo-4258(3).) + + 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(4).) + + * 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(5).) + Bitwise operations are also significantly faster (initial patch by + Gregory Smith; bpo-1087418(6)). + + * The implementation of ‘%’ 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 ‘%’ with + strings, such as templating libraries. (Implemented by Collin + Winter; bpo-5176(7).) + + * List comprehensions with an ‘if’ condition are compiled into faster + bytecode. (Patch by Antoine Pitrou, back-ported to 2.7 by Jeffrey + Yasskin; bpo-4715(8).) + + * 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(9).) + + * The ‘split()’, ‘replace()’, ‘rindex()’, ‘rpartition()’, and + ‘rsplit()’ methods of string-like types (strings, Unicode strings, + and *note bytearray: 1a5. 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(10) and bpo-7622(11).) + + * The *note pickle: c7. and ‘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(12).) + + * The ‘cPickle’ module now special-cases dictionaries, nearly halving + the time required to pickle them. (Contributed by Collin Winter; + bpo-5670(13).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4074 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=4688 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=4258 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=5260 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=5512 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1087418 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=5176 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=4715 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=6713 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=7462 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=7622 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=5084 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=5670 + + +File: python.info, Node: New and Improved Modules, Next: Build and C API Changes<8>, Prev: Other Language Changes<12>, Up: What’s New in Python 2 7 + +1.13.11 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 ‘Misc/NEWS’ +file in the source tree for a more complete list of changes, or look +through the Subversion logs for all the details. + + * The *note bdb: e. module’s base debugging class *note Bdb: fa6. + gained a feature for skipping modules. The constructor now takes + an iterable containing glob-style patterns such as ‘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(1).) + + * The *note binascii: f. module now supports the buffer API, so it + can be used with *note memoryview: 6ad. instances and other similar + buffer objects. (Backported from 3.x by Florent Xicluna; + bpo-7703(2).) + + * Updated module: the ‘bsddb’ module has been updated from + 4.7.2devel9 to version 4.8.4 of the pybsddb package(3). 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(4). The pybsddb changelog can be read + at ‘https://hg.jcea.es/pybsddb/file/tip/ChangeLog’.) + + * The *note bz2: 12. module’s *note BZ2File: 5a5. now supports the + context management protocol, so you can write ‘with + bz2.BZ2File(...) as f:’. (Contributed by Hagen Fürstenau; + bpo-3860(5).) + + * New class: the *note Counter: d43. class in the *note collections: + 1c. module is useful for tallying data. *note Counter: d43. + instances behave mostly like dictionaries but return zero for + missing keys instead of raising a *note KeyError: 6f5.: + + >>> 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 + + There are three additional *note Counter: d43. methods. *note + most_common(): fa7. returns the N most common elements and their + counts. *note elements(): fa8. returns an iterator over the + contained elements, repeating each element as many times as its + count. *note subtract(): e8e. takes an iterable and subtracts one + for each element instead of adding; if the argument is a dictionary + or another ‘Counter’, the counts are subtracted. + + >>> 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 + + Contributed by Raymond Hettinger; bpo-1696199(6). + + New class: *note OrderedDict: 1a8. is described in the earlier + section *note PEP 372; Adding an Ordered Dictionary to collections: + f90. + + New method: The *note deque: 1a9. data type now has a *note + count(): e90. method that returns the number of contained elements + equal to the supplied argument `x', and a *note reverse(): e91. + method that reverses the elements of the deque in-place. *note + deque: 1a9. also exposes its maximum length as the read-only *note + maxlen: fa9. attribute. (Both features added by Raymond + Hettinger.) + + The *note namedtuple: 538. 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: + + >>> from collections import namedtuple + >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) + >>> T._fields + ('field1', '_1', '_2', 'field2') + + (Added by Raymond Hettinger; bpo-1818(7).) + + Finally, the ‘Mapping’ abstract base class now returns *note + NotImplemented: 3c1. if a mapping is compared to another type that + isn’t a ‘Mapping’. (Fixed by Daniel Stutzbach; bpo-8729(8).) + + * Constructors for the parsing classes in the ‘ConfigParser’ module + now take an `allow_no_value' parameter, defaulting to false; if + true, options without values will be allowed. For 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' + + (Contributed by Mats Kindahl; bpo-7005(9).) + + * Deprecated function: ‘contextlib.nested()’, which allows handling + more than one context manager with a single *note with: 19e. + statement, has been deprecated, because the ‘with’ statement now + supports multiple context managers. + + * The ‘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(10).) + + * The *note copy: 24. module’s *note deepcopy(): 7cd. function will + now correctly copy bound instance methods. (Implemented by Robert + Collins; bpo-1515(11).) + + * The *note ctypes: 29. module now always converts ‘None’ to a C + ‘NULL’ pointer for arguments declared as pointers. (Changed by + Thomas Heller; bpo-4606(12).) The underlying libffi library(13) + has been updated to version 3.0.9, containing various fixes for + different platforms. (Updated by Matthias Klose; bpo-8142(14).) + + * New method: the *note datetime: 2f. module’s *note timedelta: 60f. + class gained a *note total_seconds(): faa. method that returns the + number of seconds in the duration. (Contributed by Brian Quinlan; + bpo-5788(15).) + + * New method: the *note Decimal: 3bd. class gained a *note + from_float(): eb3. class method that performs an exact conversion + of a floating-point number to a *note Decimal: 3bd. 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, + ‘Decimal.from_float(0.1)’ returns + ‘Decimal('0.1000000000000000055511151231257827021181583404541015625')’. + (Implemented by Raymond Hettinger; bpo-4796(16).) + + Comparing instances of *note Decimal: 3bd. 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 ‘Decimal’ and floating-point in other operations such as + addition, since you should be explicitly choosing how to convert + between float and *note Decimal: 3bd. (Fixed by Mark Dickinson; + bpo-2531(17).) + + The constructor for *note Decimal: 3bd. now accepts floating-point + numbers (added by Raymond Hettinger; bpo-8257(18)) and non-European + Unicode characters such as Arabic-Indic digits (contributed by Mark + Dickinson; bpo-6595(19)). + + Most of the methods of the *note Context: d59. class now accept + integers as well as *note Decimal: 3bd. instances; the only + exceptions are the *note canonical(): fab. and *note + is_canonical(): fac. methods. (Patch by Juan José Conti; + bpo-7633(20).) + + When using *note Decimal: 3bd. instances with a string’s *note + format(): 1fc. 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(21).) + + Comparisons involving a signaling NaN value (or ‘sNAN’) now signal + ‘InvalidOperation’ instead of silently returning a true or false + value depending on the comparison operator. Quiet NaN values (or + ‘NaN’) are now hashable. (Fixed by Mark Dickinson; bpo-7279(22).) + + * The *note difflib: 35. module now produces output that is more + compatible with modern ‘diff’/‘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(23).) + + * The Distutils ‘sdist’ command now always regenerates the ‘MANIFEST’ + file, since even if the ‘MANIFEST.in’ or ‘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(24).) + + * The *note doctest: 63. module’s ‘IGNORE_EXCEPTION_DETAIL’ flag will + now ignore the name of the module containing the exception being + tested. (Patch by Lennart Regebro; bpo-7490(25).) + + * The *note email: 64. module’s *note Message: 90b. class will now + accept a Unicode-valued payload, automatically converting the + payload to the encoding specified by ‘output_charset’. (Added by + R. David Murray; bpo-1368247(26).) + + * The *note Fraction: 210. class now accepts a single float or *note + Decimal: 3bd. instance, or two rational numbers, as arguments to + its constructor. (Implemented by Mark Dickinson; rationals added + in bpo-5812(27), and float/decimal in bpo-8294(28).) + + Ordering comparisons (‘<’, ‘<=’, ‘>’, ‘>=’) between fractions and + complex numbers now raise a *note TypeError: 19c. This fixes an + oversight, making the *note Fraction: 210. match the other numeric + types. + + * New class: *note FTP_TLS: 53e. in the *note ftplib: 7e. module + provides secure FTP connections using TLS encapsulation of + authentication as well as subsequent control and data transfers. + (Contributed by Giampaolo Rodola; bpo-2054(29).) + + The *note storbinary(): fad. method for binary uploads can now + restart uploads thanks to an added `rest' parameter (patch by Pablo + Mouzo; bpo-6845(30).) + + * New class decorator: *note total_ordering(): bdc. in the *note + functools: 7f. module takes a class that defines an ‘__eq__()’ + method and one of ‘__lt__()’, ‘__le__()’, ‘__gt__()’, or + ‘__ge__()’, and generates the missing comparison methods. Since + the ‘__cmp__()’ method is being deprecated in Python 3.x, this + decorator makes it easier to define ordered classes. (Added by + Raymond Hettinger; bpo-5479(31).) + + New function: *note cmp_to_key(): e8a. 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 *note sorted(): 833, *note min(): b99. and *note max(): b9a, + etc. The primary intended use is to help with making code + compatible with Python 3.x. (Added by Raymond Hettinger.) + + * New function: the *note gc: 80. module’s *note is_tracked(): fae. + returns true if a given instance is tracked by the garbage + collector, false otherwise. (Contributed by Antoine Pitrou; + bpo-4688(32).) + + * The *note gzip: 87. module’s *note GzipFile: 590. now supports the + context management protocol, so you can write ‘with + gzip.GzipFile(...) as f:’ (contributed by Hagen Fürstenau; + bpo-3860(33)), and it now implements the *note io.BufferedIOBase: + 949. ABC, so you can wrap it with *note io.BufferedReader: ebd. for + faster processing (contributed by Nir Aides; bpo-7471(34)). 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(35).) + + Files in gzip format can be padded with trailing zero bytes; the + *note gzip: 87. module will now consume these trailing bytes. + (Fixed by Tadek Pietraszek and Brian Curtin; bpo-2846(36).) + + * New attribute: the *note hashlib: 88. module now has an + ‘algorithms’ attribute containing a tuple naming the supported + algorithms. In Python 2.7, ‘hashlib.algorithms’ contains ‘('md5', + 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')’. (Contributed by + Carl Chenet; bpo-7418(37).) + + * The default ‘HTTPResponse’ class used by the ‘httplib’ module now + supports buffering, resulting in much faster reading of HTTP + responses. (Contributed by Kristján Valur Jónsson; bpo-4879(38).) + + The ‘HTTPConnection’ and ‘HTTPSConnection’ classes now support a + `source_address' parameter, a ‘(host, port)’ 2-tuple giving the + source address that will be used for the connection. (Contributed + by Eldon Ziegler; bpo-3972(39).) + + * The ‘ihooks’ module now supports relative imports. Note that + ‘ihooks’ is an older module for customizing imports, superseded by + the ‘imputil’ module added in Python 2.0. (Relative import support + added by Neil Schemenauer.) + + * The *note imaplib: 94. module now supports IPv6 addresses. + (Contributed by Derek Morr; bpo-1655(40).) + + * New function: the *note inspect: 9e. module’s *note getcallargs(): + b4b. 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: + + >>> 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) + + Contributed by George Sakkis; bpo-3135(41). + + * Updated module: The *note io: 9f. 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 ‘_pyio’ module. + + One minor resulting change: the *note io.TextIOBase: f50. class now + has an ‘errors’ attribute giving the error setting used for + encoding and decoding errors (one of ‘'strict'’, ‘'replace'’, + ‘'ignore'’). + + The *note io.FileIO: faf. class now raises an *note OSError: 413. + when passed an invalid file descriptor. (Implemented by Benjamin + Peterson; bpo-4991(42).) The *note truncate(): fb0. 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(43).) + + * New function: ‘itertools.compress(data, selectors)’ takes two + iterators. Elements of `data' are returned if the corresponding + value in `selectors' is true: + + itertools.compress('ABCDEF', [1,0,1,0,1,1]) => + A, C, E, F + + New function: ‘itertools.combinations_with_replacement(iter, r)’ + returns all the possible `r'-length combinations of elements from + the iterable `iter'. Unlike *note combinations(): fb1, individual + elements can be repeated in the generated combinations: + + itertools.combinations_with_replacement('abc', 2) => + ('a', 'a'), ('a', 'b'), ('a', 'c'), + ('b', 'b'), ('b', 'c'), ('c', 'c') + + Note that elements are treated as unique depending on their + position in the input, not their actual values. + + The *note itertools.count(): f3d. function now has a `step' + argument that allows incrementing by values other than 1. *note + count(): f3d. also now allows keyword arguments, and using + non-integer values such as floats or *note Decimal: 3bd. instances. + (Implemented by Raymond Hettinger; bpo-5032(44).) + + *note itertools.combinations(): fb1. and *note itertools.product(): + fb2. previously raised *note ValueError: 1c8. 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(45).) + + * Updated module: The *note json: a2. 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(46).) + + To support the new *note collections.OrderedDict: 1a8. type, *note + json.load(): 923. 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(47).) + + * The *note mailbox: ac. module’s *note Maildir: fb3. 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(48), + bpo-6896(49).) + + * New functions: the *note math: af. module gained *note erf(): 83f. + and *note erfc(): 840. for the error function and the complementary + error function, *note expm1(): e9c. which computes ‘e**x - 1’ with + more precision than using *note exp(): fb4. and subtracting 1, + *note gamma(): e9d. for the Gamma function, and *note lgamma(): + e9e. for the natural log of the Gamma function. (Contributed by + Mark Dickinson and nirinA raseliarison; bpo-3366(50).) + + * The *note multiprocessing: b5. module’s ‘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(51).) + + The ‘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 ‘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(52).) + + * The *note nntplib: be. module now supports IPv6 addresses. + (Contributed by Derek Morr; bpo-1664(53).) + + * New functions: the *note os: c2. module wraps the following POSIX + system calls: *note getresgid(): fb5. and *note getresuid(): fb6, + which return the real, effective, and saved GIDs and UIDs; *note + setresgid(): fb7. and *note setresuid(): fb8, which set real, + effective, and saved GIDs and UIDs to new values; *note + initgroups(): fb9, which initialize the group access list for the + current process. (GID/UID functions contributed by Travis H.; + bpo-6508(54). Support for initgroups added by Jean-Paul Calderone; + bpo-7333(55).) + + The *note os.fork(): cd4. function now re-initializes the import + lock in the child process; this fixes problems on Solaris when + *note fork(): cd4. is called from a thread. (Fixed by Zsolt + Cserna; bpo-7242(56).) + + * In the *note os.path: c3. module, the *note normpath(): fba. and + *note abspath(): fbb. functions now preserve Unicode; if their + input path is a Unicode string, the return value is also a Unicode + string. (*note normpath(): fba. fixed by Matt Giuca in + bpo-5827(57); *note abspath(): fbb. fixed by Ezio Melotti in + bpo-3426(58).) + + * The *note pydoc: d6. module now has help for the various symbols + that Python uses. You can now do ‘help('<<')’ or ‘help('@')’, for + example. (Contributed by David Laban; bpo-4739(59).) + + * The *note re: da. module’s *note split(): 7cb, *note sub(): 85d, + and *note subn(): ad0. now accept an optional `flags' argument, for + consistency with the other functions in the module. (Added by + Gregory P. Smith.) + + * New function: *note run_path(): fbc. in the *note runpy: df. module + will execute the code at a provided `path' argument. `path' can be + the path of a Python source file (‘example.py’), a compiled + bytecode file (‘example.pyc’), a directory (‘./package/’), or a zip + archive (‘example.zip’). If a directory or zip path is provided, + it will be added to the front of ‘sys.path’ and the module *note + __main__: 1. will be imported. It’s expected that the directory or + zip contains a ‘__main__.py’; if it doesn’t, some other + ‘__main__.py’ might be imported from a location later in + ‘sys.path’. This makes more of the machinery of *note runpy: df. + available to scripts that want to mimic the way Python’s command + line processes an explicit path name. (Added by Nick Coghlan; + bpo-6816(60).) + + * New function: in the *note shutil: e6. module, *note + make_archive(): 676. 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é.) + + *note shutil: e6.’s *note copyfile(): 6a9. and *note copytree(): + 675. functions now raise a ‘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(61).) + + * The *note signal: e7. 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(62).) + + * New functions: in the *note site: e8. module, three new functions + return various site- and user-specific paths. *note + getsitepackages(): efc. returns a list containing all global + site-packages directories, *note getusersitepackages(): efe. + returns the path of the user’s site-packages directory, and *note + getuserbase(): efd. returns the value of the ‘USER_BASE’ + environment variable, giving the path to a directory that can be + used to store data. (Contributed by Tarek Ziadé; bpo-6693(63).) + + The *note site: e8. module now reports exceptions occurring when + the ‘sitecustomize’ module is imported, and will no longer catch + and swallow the *note KeyboardInterrupt: 611. exception. (Fixed by + Victor Stinner; bpo-3137(64).) + + * The *note create_connection(): 241. function gained a + `source_address' parameter, a ‘(host, port)’ 2-tuple giving the + source address that will be used for the connection. (Contributed + by Eldon Ziegler; bpo-3972(65).) + + The *note recv_into(): fbd. and *note recvfrom_into(): fbe. methods + will now write into objects that support the buffer API, most + usefully the *note bytearray: 1a5. and *note memoryview: 6ad. + objects. (Implemented by Antoine Pitrou; bpo-8104(66).) + + * The ‘SocketServer’ module’s ‘TCPServer’ class now supports socket + timeouts and disabling the Nagle algorithm. The + ‘disable_nagle_algorithm’ class attribute defaults to ‘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 ‘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, ‘handle_timeout()’ will be + called and ‘handle_request()’ will return. (Contributed by + Kristján Valur Jónsson; bpo-6192(67) and bpo-6267(68).) + + * Updated module: the *note sqlite3: ef. module has been updated to + version 2.6.0 of the pysqlite package(69). Version 2.6.0 includes + a number of bugfixes, and adds the ability to load SQLite + extensions from shared libraries. Call the + ‘enable_load_extension(True)’ method to enable extensions, and then + call *note load_extension(): 435. to load a particular shared + library. (Updated by Gerhard Häring.) + + * The *note ssl: f0. module’s *note SSLSocket: 52a. objects now + support the buffer API, which fixed a test suite failure (fix by + Antoine Pitrou; bpo-7133(70)) and automatically set OpenSSL’s + ‘SSL_MODE_AUTO_RETRY’, which will prevent an error code being + returned from ‘recv()’ operations that trigger an SSL renegotiation + (fix by Antoine Pitrou; bpo-8222(71)). + + The *note ssl.wrap_socket(): 490. 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(72). (Added by Antoine Pitrou; + bpo-8322(73).) + + 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(74).) + + The version of OpenSSL being used is now available as the module + attributes *note ssl.OPENSSL_VERSION: ecf. (a string), *note + ssl.OPENSSL_VERSION_INFO: ed0. (a 5-tuple), and *note + ssl.OPENSSL_VERSION_NUMBER: ed1. (an integer). (Added by Antoine + Pitrou; bpo-8321(75).) + + * The *note struct: f5. module will no longer silently ignore + overflow errors when a value is too large for a particular integer + format code (one of ‘bBhHiIlLqQ’); it now always raises a *note + struct.error: fbf. exception. (Changed by Mark Dickinson; + bpo-1523(76).) The *note pack(): f2f. function will also attempt + to use ‘__index__()’ to convert and pack non-integers before trying + the ‘__int__()’ method or reporting an error. (Changed by Mark + Dickinson; bpo-8300(77).) + + * New function: the *note subprocess: f6. module’s *note + check_output(): c60. 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 *note CalledProcessError: + fc0. exception otherwise. + + >>> 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 + + (Contributed by Gregory P. Smith.) + + The *note subprocess: f6. module will now retry its internal system + calls on receiving an ‘EINTR’ signal. (Reported by several people; + final patch by Gregory P. Smith in bpo-1068268(78).) + + * New function: *note is_declared_global(): fc1. in the *note + symtable: f8. module returns true for variables that are explicitly + declared to be global, false for ones that are implicitly global. + (Contributed by Jeremy Hylton.) + + * The *note syslog: fb. module will now use the value of + ‘sys.argv[0]’ as the identifier instead of the previous default + value of ‘'python'’. (Changed by Sean Reifschneider; + bpo-8451(79).) + + * The ‘sys.version_info’ value is now a named tuple, with attributes + named ‘major’, ‘minor’, ‘micro’, ‘releaselevel’, and ‘serial’. + (Contributed by Ross Light; bpo-4285(80).) + + *note sys.getwindowsversion(): 955. also returns a named tuple, + with attributes named ‘major’, ‘minor’, ‘build’, *note platform: + cb, ‘service_pack’, ‘service_pack_major’, ‘service_pack_minor’, + ‘suite_mask’, and ‘product_type’. (Contributed by Brian Curtin; + bpo-7766(81).) + + * The *note tarfile: fd. 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(82).) + + *note tarfile: fd. now supports filtering the *note TarInfo: ec0. + objects being added to a tar file. When you call *note add(): 85e, + you may supply an optional `filter' argument that’s a callable. + The `filter' callable will be passed the *note TarInfo: ec0. for + every file being added, and can modify and return it. If the + callable returns ‘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(83).) The *note TarFile: ebf. class also + now supports the context management protocol. (Added by Lars + Gustäbel; bpo-7232(84).) + + * The *note wait(): fc2. method of the *note threading.Event: e0a. + class now returns the internal flag on exit. This means the method + will usually return true because *note wait(): fc2. 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(85).) + + * The Unicode database provided by the *note unicodedata: 124. module + is now used internally to determine which characters are numeric, + whitespace, or represent line breaks. The database also includes + information from the ‘Unihan.txt’ data file (patch by Anders + Chrigström and Amaury Forgeot d’Arc; bpo-1571184(86)) and has been + updated to version 5.2.0 (updated by Florent Xicluna; + bpo-8024(87)). + + * The ‘urlparse’ module’s ‘urlsplit()’ now handles unknown URL + schemes in a fashion compliant with RFC 3986(88): if the URL is of + the form ‘"://..."’, the text before the ‘://’ 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: + + >>> import urlparse + >>> urlparse.urlsplit('invented://host/filename?query') + ('invented', '', '//host/filename?query', '', '') + + Python 2.7 (and Python 2.6.5) will return: + + >>> import urlparse + >>> urlparse.urlsplit('invented://host/filename?query') + ('invented', 'host', '/filename?query', '', '') + + (Python 2.7 actually produces slightly different output, since it + returns a named tuple instead of a standard tuple.) + + The ‘urlparse’ module also supports IPv6 literal addresses as + defined by RFC 2732(89) (contributed by Senthil Kumaran; + bpo-2987(90)). + + >>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') + ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', + path='/foo', params='', query='', fragment='') + + * New class: the *note WeakSet: 1aa. class in the *note weakref: 132. + 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.) + + * The ElementTree library, ‘xml.etree’, no longer escapes ampersands + and angle brackets when outputting an XML processing instruction + (which looks like ‘’) or comment + (which looks like ‘’). (Patch by Neil Muller; + bpo-2746(91).) + + * The XML-RPC client and server, provided by the ‘xmlrpclib’ and + ‘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 ‘encode_threshold’ attribute of + ‘SimpleXMLRPCRequestHandler’, which contains a size in bytes; + responses larger than this will be compressed. (Contributed by + Kristján Valur Jónsson; bpo-6267(92).) + + * The *note zipfile: 14d. module’s *note ZipFile: 28c. now supports + the context management protocol, so you can write ‘with + zipfile.ZipFile(...) as f:’. (Contributed by Brian Curtin; + bpo-5511(93).) + + *note zipfile: 14d. now also supports archiving empty directories + and extracts them correctly. (Fixed by Kuba Wieczorek; + bpo-4710(94).) Reading files out of an archive is faster, and + interleaving *note read(): fc3. and ‘readline()’ now works + correctly. (Contributed by Nir Aides; bpo-7610(95).) + + The *note is_zipfile(): fc4. function now accepts a file object, in + addition to the path names accepted in earlier versions. + (Contributed by Gabriel Genellina; bpo-4756(96).) + + The *note writestr(): fc5. method now has an optional + `compress_type' parameter that lets you override the default + compression method specified in the *note ZipFile: 28c. + constructor. (Contributed by Ronald Oussoren; bpo-6003(97).) + +* 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5142 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=7703 + + (3) https://www.jcea.es/programacion/pybsddb.htm + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8156 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=3860 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1696199 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=1818 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=8729 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=7005 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=3924 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1515 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=4606 + + (13) https://sourceware.org/libffi/ + + (14) https://bugs.python.org/issue?@action=redirect&bpo=8142 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=5788 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=4796 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=2531 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=8257 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=6595 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=7633 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=6857 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=7279 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=7585 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=8688 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=7490 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=1368247 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=5812 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=8294 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=2054 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=6845 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=5479 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=4688 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=3860 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=7471 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=4272 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=2846 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=7418 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=4879 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=3972 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=1655 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=3135 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=4991 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=6939 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=5032 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=4816 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=4136 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=5381 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=1607951 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=6896 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=3366 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=5585 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=6963 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=1664 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=6508 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=7333 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=7242 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=5827 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=3426 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=4739 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=6816 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=3002 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=8354 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=6693 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=3137 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=3972 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=8104 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=6192 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=6267 + + (69) https://github.com/ghaering/pysqlite + + (70) https://bugs.python.org/issue?@action=redirect&bpo=7133 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=8222 + + (72) https://www.openssl.org/docs/man1.0.2/man1/ciphers.html + + (73) https://bugs.python.org/issue?@action=redirect&bpo=8322 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=8484 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=8321 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=1523 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=8300 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=1068268 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=8451 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=4285 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=7766 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=7357 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=6856 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=7232 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=1674032 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=1571184 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=8024 + + (88) https://datatracker.ietf.org/doc/html/rfc3986.html + + (89) https://datatracker.ietf.org/doc/html/rfc2732.html + + (90) https://bugs.python.org/issue?@action=redirect&bpo=2987 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=2746 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=6267 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=5511 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=4710 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=7610 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=4756 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=6003 + + +File: python.info, Node: New module importlib, Next: New module sysconfig, Up: New and Improved Modules + +1.13.11.1 New module: importlib +............................... + +Python 3.1 includes the *note importlib: 97. package, a +re-implementation of the logic underlying Python’s *note import: 1af. +statement. *note importlib: 97. is useful for implementors 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 *note importlib: 97. package, but instead has a tiny subset +that contains a single function, *note import_module(): e4d. + +‘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 ‘.’ character, +such as ‘..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. *note import_module(): e4d. both +inserts the imported module into ‘sys.modules’ and returns the module +object. + +Here are some examples: + + >>> from importlib import import_module + >>> anydbm = import_module('anydbm') # Standard absolute import + >>> anydbm + + >>> # Relative import + >>> file_util = import_module('..file_util', 'distutils.command') + >>> file_util + + +*note importlib: 97. was implemented by Brett Cannon and introduced in +Python 3.1. + + +File: python.info, Node: New module sysconfig, Next: ttk Themed Widgets for Tk, Prev: New module importlib, Up: New and Improved Modules + +1.13.11.2 New module: sysconfig +............................... + +The *note sysconfig: fa. module has been pulled out of the Distutils +package, becoming a new top-level module in its own right. *note +sysconfig: fa. 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: + + * *note get_config_var(): cd7. returns variables from Python’s + Makefile and the ‘pyconfig.h’ file. + + * *note get_config_vars(): cd8. returns a dictionary containing all + of the configuration variables. + + * *note get_path(): fc8. returns the configured path for a particular + type of module: the standard library, site-specific modules, + platform-specific modules, etc. + + * *note is_python_build(): fc9. returns true if you’re running a + binary from a Python source tree, and false otherwise. + +Consult the *note sysconfig: fa. documentation for more details and for +a complete list of functions. + +The Distutils package and *note sysconfig: fa. are now maintained by +Tarek Ziadé, who has also started a Distutils2 package (source +repository at ‘https://hg.python.org/distutils2/’) for developing a +next-generation version of Distutils. + + +File: python.info, Node: ttk Themed Widgets for Tk, Next: Updated module unittest, Prev: New module sysconfig, Up: New and Improved Modules + +1.13.11.3 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 ‘ttk’ module documentation. You may also wish +to read the Tcl/Tk manual page describing the Ttk theme engine, +available at ‘https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htm’. Some +screenshots of the Python/Ttk code in use are at +‘https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wiki’. + +The ‘ttk’ module was written by Guilherme Polo and added in bpo-2983(1). +An alternate version called ‘Tile.py’, written by Martin Franklin and +maintained by Kevin Walzer, was proposed for inclusion in bpo-2618(2), +but the authors argued that Guilherme Polo’s work was more +comprehensive. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2983 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=2618 + + +File: python.info, Node: Updated module unittest, Next: Updated module ElementTree 1 3, Prev: ttk Themed Widgets for Tk, Up: New and Improved Modules + +1.13.11.4 Updated module: unittest +.................................. + +The *note unittest: 125. 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 ‘unittest2’ package, from +‘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(1) or nose(2), but provides a +simple way to run tests kept within a set of package directories. For +example, the following command will search the ‘test/’ subdirectory for +any importable test files named ‘test*.py’: + + python -m unittest discover -s test + +Consult the *note unittest: 125. module documentation for more details. +(Developed in bpo-6001(3).) + +The *note main(): c85. function supports some other new options: + + * *note -b: fcd. or ‘--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. + + * *note -c: fce. or ‘--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 *note + removeHandler(): fcf. decorator that can be used to mark tests that + should have the control-C handling disabled. + + * *note -f: fd0. or ‘--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(4).) + +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 *note SkipTest: c86. exception to skip a test +(bpo-1034053(5)). + +The error messages for *note assertEqual(): ee2, *note assertTrue(): +ee1, and *note assertFalse(): fd1. failures now provide more +information. If you set the *note longMessage: fd2. attribute of your +*note TestCase: 282. 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(6).) + +The *note assertRaises(): e16. method now returns a context handler when +called without providing a callable object to run. For example, you can +write this: + + with self.assertRaises(KeyError): + {}['foo'] + +(Implemented by Antoine Pitrou; bpo-4444(7).) + +Module- and class-level setup and teardown fixtures are now supported. +Modules can contain ‘setUpModule()’ and ‘tearDownModule()’ functions. +Classes can have *note setUpClass(): 69e. and *note tearDownClass(): +fd3. methods that must be defined as class methods (using ‘@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 *note addCleanup(): 6d3. and *note doCleanups(): fd4. were +added. *note addCleanup(): 6d3. lets you add cleanup functions that +will be called unconditionally (after *note setUp(): fd5. if *note +setUp(): fd5. fails, otherwise after *note tearDown(): fd6.). This +allows for much simpler resource allocation and deallocation during +tests (bpo-5679(8)). + +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 *note unittest: 125. + + * *note assertIsNone(): fd7. and *note assertIsNotNone(): fd8. take + one expression and verify that the result is or is not ‘None’. + + * *note assertIs(): fd9. and *note assertIsNot(): fda. take two + values and check whether the two values evaluate to the same object + or not. (Added by Michael Foord; bpo-2578(9).) + + * *note assertIsInstance(): fdb. and *note assertNotIsInstance(): + fdc. 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(10).) + + * *note assertGreater(): fdd, *note assertGreaterEqual(): fde, *note + assertLess(): fdf, and *note assertLessEqual(): fe0. compare two + quantities. + + * *note assertMultiLineEqual(): fe1. 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 *note assertEqual(): + ee2. + + * ‘assertRegexpMatches()’ and ‘assertNotRegexpMatches()’ checks + whether the first argument is a string matching or not matching the + regular expression provided as the second argument (bpo-8038(11)). + + * ‘assertRaisesRegexp()’ checks whether a particular exception is + raised, and then also checks that the string representation of the + exception matches the provided regular expression. + + * *note assertIn(): fe2. and *note assertNotIn(): fe3. tests whether + `first' is or is not in `second'. + + * ‘assertItemsEqual()’ tests whether two provided sequences contain + the same elements. + + * *note assertSetEqual(): fe4. compares whether two sets are equal, + and only reports the differences between the sets in case of error. + + * Similarly, *note assertListEqual(): fe5. and *note + assertTupleEqual(): fe6. 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 *note assertEqual(): ee2. More generally, *note + assertSequenceEqual(): fe7. compares two sequences and can + optionally check whether both sequences are of a particular type. + + * *note assertDictEqual(): fe8. compares two dictionaries and reports + the differences; it’s now used by default when you compare two + dictionaries using *note assertEqual(): ee2. + ‘assertDictContainsSubset()’ checks whether all of the key/value + pairs in `first' are found in `second'. + + * *note assertAlmostEqual(): ee4. and *note assertNotAlmostEqual(): + ee5. 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. + + * *note loadTestsFromName(): fe9. properly honors the *note + suiteClass: fea. attribute of the *note TestLoader: 2d7. (Fixed by + Mark Roddy; bpo-6866(12).) + + * A new hook lets you extend the *note assertEqual(): ee2. method to + handle new data types. The *note addTypeEqualityFunc(): feb. + 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. + +*note unittest.main(): c85. now takes an optional ‘exit’ argument. If +false, *note main(): c85. doesn’t call *note sys.exit(): fec, allowing +*note main(): c85. to be used from the interactive interpreter. +(Contributed by J. Pablo Fernández; bpo-3379(13).) + +*note TestResult: e1b. has new *note startTestRun(): fed. and *note +stopTestRun(): fee. methods that are called immediately before and after +a test run. (Contributed by Robert Collins; bpo-5728(14).) + +With all these changes, the ‘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. + +See also +........ + +‘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.) + + ---------- Footnotes ---------- + + (1) https://pytest.org + + (2) https://nose.readthedocs.io/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=6001 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=8074 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=1034053 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=5663 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=4444 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=5679 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=2578 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=7031 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=8038 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=6866 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=3379 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=5728 + + +File: python.info, Node: Updated module ElementTree 1 3, Prev: Updated module unittest, Up: New and Improved Modules + +1.13.11.5 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: + + * The various parsing functions now take a `parser' keyword argument + giving an *note XMLParser: 6a3. instance that will be used. This + makes it possible to override the file’s internal encoding: + + p = ET.XMLParser(encoding='utf-8') + t = ET.XML("""""", parser=p) + + Errors in parsing XML now raise a ‘ParseError’ exception, whose + instances have a ‘position’ attribute containing a (`line', + `column') tuple giving the location of the problem. + + * ElementTree’s code for converting trees to a string has been + significantly reworked, making it roughly twice as fast in many + cases. The *note ElementTree.write(): c99. and ‘Element.write()’ + methods now have a `method' parameter that can be “xml” (the + default), “html”, or “text”. HTML mode will output empty elements + as ‘’ instead of ‘’, and text mode will skip + over elements and only output the text chunks. If you set the + ‘tag’ attribute of an element to ‘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 ‘xmlns:’ + 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 ‘default_namespace’ attribute and can + register new prefixes with *note register_namespace(): e84. In XML + mode, you can use the true/false `xml_declaration' parameter to + suppress the XML declaration. + + * New *note Element: 59e. method: *note extend(): e85. 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: + + from xml.etree import ElementTree as ET + + t = ET.XML(""" + 1 2 3 + """) + new = ET.XML('') + new.extend(t) + + # Outputs 1... + print ET.tostring(new) + + * New ‘Element’ method: *note iter(): ff1. yields the children of the + element as a generator. It’s also possible to write ‘for child in + elem:’ to loop over an element’s children. The existing method + ‘getiterator()’ is now deprecated, as is ‘getchildren()’ which + constructs and returns a list of children. + + * New ‘Element’ method: *note itertext(): e87. yields all chunks of + text that are descendants of the element. For example: + + t = ET.XML(""" + 1 2 3 + """) + + # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] + print list(t.itertext()) + + * Deprecated: using an element as a Boolean (i.e., ‘if elem:’) would + return true if the element had any children, or false if there were + no children. This behaviour is confusing – ‘None’ is false, but so + is a childless element? – so it will now trigger a *note + FutureWarning: 73e. In your code, you should be explicit: write + ‘len(elem) != 0’ if you’re interested in the number of children, or + ‘elem is not None’. + +Fredrik Lundh develops ElementTree and produced the 1.3 version; you can +read his article describing 1.3 at +‘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(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=6472 + + +File: python.info, Node: Build and C API Changes<8>, Next: Other Changes and Fixes, Prev: New and Improved Modules, Up: What’s New in Python 2 7 + +1.13.12 Build and C API Changes +------------------------------- + +Changes to Python’s build process and to the C API include: + + * The latest release of the GNU Debugger, GDB 7, can be scripted + using Python(1). When you begin debugging an executable program P, + GDB will look for a file named ‘P-gdb.py’ and automatically read + it. Dave Malcolm contributed a ‘python-gdb.py’ that adds a number + of commands useful when debugging Python itself. For example, + ‘py-up’ and ‘py-down’ go up or down one Python stack frame, which + usually corresponds to several C stack frames. ‘py-print’ prints + the value of a Python variable, and ‘py-bt’ prints the Python stack + trace. (Added as a result of bpo-8032(2).) + + * If you use the ‘.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(3).) + + * *note Py_AddPendingCall(): 5d6. 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(4).) + + * New function: *note PyCode_NewEmpty(): ff3. 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 *note PyCode_New(): 349, which had many + more arguments. (Added by Jeffrey Yasskin.) + + * New function: *note PyErr_NewExceptionWithDoc(): f23. creates a new + exception class, just as the existing *note PyErr_NewException(): + f24. does, but takes an extra ‘char *’ argument containing the + docstring for the new exception class. (Added by ‘lekma’ on the + Python bug tracker; bpo-7033(5).) + + * New function: *note PyFrame_GetLineNumber(): 35f. 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.) + + * New functions: *note PyLong_AsLongAndOverflow(): f21. and *note + PyLong_AsLongLongAndOverflow(): f20. 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(6) and + bpo-7767(7).) + + * New function: stemming from the rewrite of string-to-float + conversion, a new *note PyOS_string_to_double(): f44. function was + added. The old ‘PyOS_ascii_strtod()’ and ‘PyOS_ascii_atof()’ + functions are now deprecated. + + * New function: *note PySys_SetArgvEx(): 369. sets the value of + ‘sys.argv’ and can optionally update ‘sys.path’ to include the + directory containing the script named by ‘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, *note PySys_SetArgv(): 36a, + would always update ‘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 ‘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 *note PySys_SetArgv(): 36a. and carefully + consider whether the application should be using *note + PySys_SetArgvEx(): 369. with `updatepath' set to false. + + Security issue reported as CVE-2008-5983(8); discussed in + bpo-5753(9), and fixed by Antoine Pitrou. + + * New macros: the Python header files now define the following + macros: ‘Py_ISALNUM’, ‘Py_ISALPHA’, ‘Py_ISDIGIT’, ‘Py_ISLOWER’, + ‘Py_ISSPACE’, ‘Py_ISUPPER’, ‘Py_ISXDIGIT’, ‘Py_TOLOWER’, and + ‘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(10).) + + * Removed function: ‘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(11).) + + * New format codes: the ‘PyFormat_FromString()’, + ‘PyFormat_FromStringV()’, and *note PyErr_Format(): b3f. functions + now accept ‘%lld’ and ‘%llu’ format codes for displaying C’s long + long types. (Contributed by Mark Dickinson; bpo-7228(12).) + + * The complicated interaction between threads and process forking has + been changed. Previously, the child process created by *note + os.fork(): cd4. might fail because the child is created with only a + single thread running, the thread performing the *note os.fork(): + cd4. 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 *note + os.fork(): cd4, and will also clean up any locks created using the + *note threading: 10b. module. C extension modules that have + internal locks, or that call ‘fork()’ themselves, will not benefit + from this clean-up. + + (Fixed by Thomas Wouters; bpo-1590864(13).) + + * The *note Py_Finalize(): ff4. function now calls the internal + ‘threading._shutdown()’ function; this prevents some exceptions + from being raised when an interpreter shuts down. (Patch by Adam + Olsen; bpo-1722344(14).) + + * When using the *note PyMemberDef: 81a. structure to define + attributes of a type, Python will no longer let you try to delete + or set a ‘T_STRING_INPLACE’ attribute. + + * Global symbols defined by the *note ctypes: 29. module are now + prefixed with ‘Py’, or with ‘_ctypes’. (Implemented by Thomas + Heller; bpo-3102(15).) + + * New configure option: the ‘--with-system-expat’ switch allows + building the ‘pyexpat’ module to use the system Expat library. + (Contributed by Arfrever Frehtes Taifersar Arahesis; bpo-7609(16).) + + * New configure option: the ‘--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(17).) + + * New configure option: you can now supply an empty string to + ‘--with-dbmliborder=’ in order to disable all of the various DBM + modules. (Added by Arfrever Frehtes Taifersar Arahesis; + bpo-6491(18).) + + * The ‘configure’ script now checks for floating-point rounding bugs + on certain 32-bit Intel chips and defines a ‘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(19).) + + ‘configure’ also now sets a ‘LDCXXSHARED’ Makefile variable for + supporting C++ linking. (Contributed by Arfrever Frehtes Taifersar + Arahesis; bpo-1222585(20).) + + * The build process now creates the necessary files for pkg-config + support. (Contributed by Clinton Roy; bpo-3585(21).) + + * The build process now supports Subversion 1.7. (Contributed by + Arfrever Frehtes Taifersar Arahesis; bpo-6094(22).) + +* 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. + + ---------- Footnotes ---------- + + (1) https://sourceware.org/gdb/current/onlinedocs/gdb/Python.html + + (2) https://bugs.python.org/issue?@action=redirect&bpo=8032 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=3632 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=4293 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=7033 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=7528 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=7767 + + (8) https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=5753 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=5793 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=8276 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=7228 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=1590864 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=1722344 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=3102 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=7609 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=2422 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=6491 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=2937 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=1222585 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=3585 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=6094 + + +File: python.info, Node: Capsules, Next: Port-Specific Changes Windows, Up: Build and C API Changes<8> + +1.13.12.1 Capsules +.................. + +Python 3.1 adds a new C datatype, *note PyCapsule: f2b, for providing a +C API to an extension module. A capsule is essentially the holder of a +C ‘void *’ pointer, and is made available as a module attribute; for +example, the *note socket: ec. module’s API is exposed as ‘socket.CAPI’, +and *note unicodedata: 124. exposes ‘ucnhash_CAPI’. Other extensions +can import the module, access its dictionary to get the capsule object, +and then get the ‘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, ‘PyCObject’, but +it doesn’t provide type safety. Evil code written in pure Python could +cause a segmentation fault by taking a ‘PyCObject’ from module A and +somehow substituting it for the ‘PyCObject’ in module B. Capsules know +their own name, and getting the pointer requires providing the name: + + void *vtable; + + if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") { + PyErr_SetString(PyExc_ValueError, "argument type invalid"); + return NULL; + } + + vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI"); + +You are assured that ‘vtable’ points to whatever you’re expecting. If a +different capsule was passed in, *note PyCapsule_IsValid(): ff7. would +detect the mismatched name and return false. Refer to *note Providing a +C API for an Extension Module: ff8. for more information on using these +objects. + +Python 2.7 now uses capsules internally to provide various +extension-module APIs, but the ‘PyCObject_AsVoidPtr()’ was modified to +handle capsules, preserving compile-time compatibility with the +‘CObject’ interface. Use of ‘PyCObject_AsVoidPtr()’ will signal a *note +PendingDeprecationWarning: 503, which is silent by default. + +Implemented in Python 3.1 and backported to 2.7 by Larry Hastings; +discussed in bpo-5630(1). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5630 + + +File: python.info, Node: Port-Specific Changes Windows, Next: Port-Specific Changes Mac OS X, Prev: Capsules, Up: Build and C API Changes<8> + +1.13.12.2 Port-Specific Changes: Windows +........................................ + + * The *note msvcrt: b4. module now contains some constants from the + ‘crtassem.h’ header file: ‘CRT_ASSEMBLY_VERSION’, + ‘VC_ASSEMBLY_PUBLICKEYTOKEN’, and ‘LIBRARIES_ASSEMBLY_NAME_PREFIX’. + (Contributed by David Cournapeau; bpo-4365(1).) + + * The ‘_winreg’ module for accessing the registry now implements the + ‘CreateKeyEx()’ and ‘DeleteKeyEx()’ functions, extended versions of + previously supported functions that take several extra arguments. + The ‘DisableReflectionKey()’, ‘EnableReflectionKey()’, and + ‘QueryReflectionKey()’ were also tested and documented. + (Implemented by Brian Curtin: bpo-7347(2).) + + * The new ‘_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(3).) + + * The *note os.kill(): ffa. function now works on Windows. The + signal value can be the constants ‘CTRL_C_EVENT’, + ‘CTRL_BREAK_EVENT’, or any integer. The first two constants will + send ‘Control-C’ and ‘Control-Break’ keystroke events to + subprocesses; any other value will use the ‘TerminateProcess()’ + API. (Contributed by Miki Tebeka; bpo-1220212(4).) + + * The *note os.listdir(): da5. function now correctly fails for an + empty path. (Fixed by Hirokazu Yamamoto; bpo-5913(5).) + + * The ‘mimelib’ module will now read the MIME database from the + Windows registry when initializing. (Patch by Gabriel Genellina; + bpo-4969(6).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4365 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=7347 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=3582 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1220212 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=5913 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=4969 + + +File: python.info, Node: Port-Specific Changes Mac OS X, Next: Port-Specific Changes FreeBSD, Prev: Port-Specific Changes Windows, Up: Build and C API Changes<8> + +1.13.12.3 Port-Specific Changes: Mac OS X +......................................... + + * The path ‘/Library/Python/2.7/site-packages’ is now appended to + ‘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(1).) + + Changed in version 2.7.13: As of 2.7.13, this change was + removed. ‘/Library/Python/2.7/site-packages’, the + site-packages directory used by the Apple-supplied system + Python 2.7 is no longer appended to ‘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(2)) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=4865 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28440 + + +File: python.info, Node: Port-Specific Changes FreeBSD, Prev: Port-Specific Changes Mac OS X, Up: Build and C API Changes<8> + +1.13.12.4 Port-Specific Changes: FreeBSD +........................................ + + * FreeBSD 7.1’s ‘SO_SETFIB’ constant, used with + ‘getsockopt()’/‘setsockopt()’ to select an alternate routing table, + is now available in the *note socket: ec. module. (Added by Kyle + VanderBeek; bpo-8235(1).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=8235 + + +File: python.info, Node: Other Changes and Fixes, Next: Porting to Python 2 7, Prev: Build and C API Changes<8>, Up: What’s New in Python 2 7 + +1.13.13 Other Changes and Fixes +------------------------------- + + * Two benchmark scripts, ‘iobench’ and ‘ccbench’, were added to the + ‘Tools’ directory. ‘iobench’ measures the speed of the built-in + file I/O objects returned by *note open(): 30b. while performing + various operations, and ‘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. + + * The ‘Tools/i18n/msgfmt.py’ script now understands plural forms in + ‘.po’ files. (Fixed by Martin von Löwis; bpo-5464(1).) + + * When importing a module from a ‘.pyc’ or ‘.pyo’ file with an + existing ‘.py’ counterpart, the ‘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(2).) + + * The ‘regrtest.py’ script now takes a ‘--randseed=’ switch that + takes an integer that will be used as the random seed for the ‘-r’ + option that executes tests in random order. The ‘-r’ option also + reports the seed that was used (Added by Collin Winter.) + + * Another ‘regrtest.py’ switch is ‘-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 ‘-R’ switch + which is known to produce long runtimes. (Added by Antoine Pitrou, + bpo-6152(3).) This can also be used with a new ‘-F’ switch that + runs selected tests in a loop until they fail. (Added by Antoine + Pitrou; bpo-7312(4).) + + * When executed as a script, the ‘py_compile.py’ module now accepts + ‘'-'’ as an argument, which will read standard input for the list + of filenames to be compiled. (Contributed by Piotr Ożarowski; + bpo-8233(5).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5464 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1180193 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=6152 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=7312 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=8233 + + +File: python.info, Node: Porting to Python 2 7, Next: New Features Added to Python 2 7 Maintenance Releases, Prev: Other Changes and Fixes, Up: What’s New in Python 2 7 + +1.13.14 Porting to Python 2.7 +----------------------------- + +This section lists previously described changes and other bugfixes that +may require changes to your code: + + * The *note range(): 58b. function processes its arguments more + consistently; it will now call ‘__int__()’ on non-float, + non-integer arguments that are supplied to it. (Fixed by Alexander + Belopolsky; bpo-1533(1).) + + * The string *note format(): 1f7. method changed the default + precision used for floating-point and complex numbers from 6 + decimal places to 12, which matches the precision used by *note + str(): 1b3. (Changed by Eric Smith; bpo-5920(2).) + + * Because of an optimization for the *note with: 19e. statement, the + special methods ‘__enter__()’ and ‘__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 *note + object: 6df.) and C extension types. (bpo-6101(3).) + + * Due to a bug in Python 2.6, the `exc_value' parameter to + ‘__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(4).) + + * When a restricted set of attributes were set using ‘__slots__’, + deleting an unset attribute would not raise *note AttributeError: + 19d. as you would expect. Fixed by Benjamin Peterson; + bpo-7604(5).) + +In the standard library: + + * Operations with *note datetime: 4be. instances that resulted in a + year falling outside the supported range didn’t always raise *note + OverflowError: 4a4. 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(6).) + + * When using *note Decimal: 3bd. instances with a string’s *note + format(): 1f7. 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(7).) + + Comparisons involving a signaling NaN value (or ‘sNAN’) now signal + *note InvalidOperation: d54. instead of silently returning a true + or false value depending on the comparison operator. Quiet NaN + values (or ‘NaN’) are now hashable. (Fixed by Mark Dickinson; + bpo-7279(8).) + + * The ElementTree library, ‘xml.etree’, no longer escapes ampersands + and angle brackets when outputting an XML processing instruction + (which looks like ‘’) or comment + (which looks like ‘’). (Patch by Neil Muller; + bpo-2746(9).) + + * The ‘readline()’ method of ‘StringIO’ objects now does nothing when + a negative length is requested, as other file-like objects do. + (bpo-7348(10)). + + * The *note syslog: fb. module will now use the value of + ‘sys.argv[0]’ as the identifier instead of the previous default + value of ‘'python'’. (Changed by Sean Reifschneider; + bpo-8451(11).) + + * The *note tarfile: fd. 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(12).) + + * The ‘urlparse’ module’s ‘urlsplit()’ now handles unknown URL + schemes in a fashion compliant with RFC 3986(13): if the URL is of + the form ‘"://..."’, the text before the ‘://’ 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: + + >>> import urlparse + >>> urlparse.urlsplit('invented://host/filename?query') + ('invented', '', '//host/filename?query', '', '') + + Python 2.7 (and Python 2.6.5) will return: + + >>> import urlparse + >>> urlparse.urlsplit('invented://host/filename?query') + ('invented', 'host', '/filename?query', '', '') + + (Python 2.7 actually produces slightly different output, since it + returns a named tuple instead of a standard tuple.) + +For C extensions: + + * C extensions that use integer format codes with the ‘PyArg_Parse*’ + family of functions will now raise a *note TypeError: 19c. + exception instead of triggering a *note DeprecationWarning: 2d4. + (bpo-5080(14)). + + * Use the new *note PyOS_string_to_double(): f44. function instead of + the old ‘PyOS_ascii_strtod()’ and ‘PyOS_ascii_atof()’ functions, + which are now deprecated. + +For applications that embed Python: + + * The *note PySys_SetArgvEx(): 369. function was added, letting + applications close a security hole when the existing *note + PySys_SetArgv(): 36a. function was used. Check whether you’re + calling *note PySys_SetArgv(): 36a. and carefully consider whether + the application should be using *note PySys_SetArgvEx(): 369. with + `updatepath' set to false. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1533 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=5920 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=6101 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=7853 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=7604 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=7150 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=6857 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=7279 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=2746 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=7348 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=8451 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=7357 + + (13) https://datatracker.ietf.org/doc/html/rfc3986.html + + (14) https://bugs.python.org/issue?@action=redirect&bpo=5080 + + +File: python.info, Node: New Features Added to Python 2 7 Maintenance Releases, Next: Acknowledgements, Prev: Porting to Python 2 7, Up: What’s New in Python 2 7 + +1.13.15 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 ‘-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>. + + +File: python.info, Node: Two new environment variables for debug mode, Next: PEP 434 IDLE Enhancement Exception for All Branches, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.1 Two new environment variables for debug mode +...................................................... + +In debug mode, the ‘[xxx refs]’ statistic is not written by default, the +‘PYTHONSHOWREFCOUNT’ environment variable now must also be set. +(Contributed by Victor Stinner; bpo-31733(1).) + +When Python is compiled with ‘COUNT_ALLOC’ defined, allocation counts +are no longer dumped by default anymore: the ‘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(2).) + +New in version 2.7.15. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31733 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31692 + + +File: python.info, Node: PEP 434 IDLE Enhancement Exception for All Branches, Next: PEP 466 Network Security Enhancements for Python 2 7, Prev: Two new environment variables for debug mode, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.2 PEP 434: IDLE Enhancement Exception for All Branches +.............................................................. + +PEP 434(1) 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0434/ + + +File: python.info, Node: PEP 466 Network Security Enhancements for Python 2 7, Next: PEP 477 Backport ensurepip PEP 453 to Python 2 7, Prev: PEP 434 IDLE Enhancement Exception for All Branches, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.3 PEP 466: Network Security Enhancements for Python 2.7 +............................................................... + +PEP 466(1) 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. + +PEP 466(2) related features added in Python 2.7.7: + + * *note hmac.compare_digest(): d74. was backported from Python 3 to + make a timing attack resistant comparison operation available to + Python 2 applications. (Contributed by Alex Gaynor; bpo-21306(3).) + + * OpenSSL 1.0.1g was upgraded in the official Windows installers + published on python.org. (Contributed by Zachary Ware; + bpo-21462(4).) + +PEP 466(5) related features added in Python 2.7.8: + + * *note hashlib.pbkdf2_hmac(): 3fb. 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(6).) + + * OpenSSL 1.0.1h was upgraded for the official Windows installers + published on python.org. (contributed by Zachary Ware in + bpo-21671(7) for CVE-2014-0224) + +PEP 466(8) related features added in Python 2.7.9: + + * Most of Python 3.4’s *note ssl: f0. module was backported. This + means *note ssl: f0. now supports Server Name Indication, TLS1.x + settings, access to the platform certificate store, the *note + SSLContext: 430. class, and other features. (Contributed by Alex + Gaynor and David Reid; bpo-21308(9).) + + Refer to the “Version added: 2.7.9” notes in the module + documentation for specific details. + + * *note os.urandom(): 237. was changed to cache a file descriptor to + ‘/dev/urandom’ instead of reopening ‘/dev/urandom’ on every call. + (Contributed by Alex Gaynor; bpo-21305(10).) + + * *note hashlib.algorithms_guaranteed: 1003. and *note + hashlib.algorithms_available: 1004. 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(11)) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0466/ + + (2) https://peps.python.org/pep-0466/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21306 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21462 + + (5) https://peps.python.org/pep-0466/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21304 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=21671 + + (8) https://peps.python.org/pep-0466/ + + (9) https://bugs.python.org/issue?@action=redirect&bpo=21308 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21305 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=21307 + + +File: python.info, Node: PEP 477 Backport ensurepip PEP 453 to Python 2 7, Next: PEP 476 Enabling certificate verification by default for stdlib http clients<2>, Prev: PEP 466 Network Security Enhancements for Python 2 7, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.4 PEP 477: Backport ensurepip (PEP 453) to Python 2.7 +............................................................. + +PEP 477(1) approves the inclusion of the PEP 453(2) 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>. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0477/ + + (2) https://peps.python.org/pep-0453/ + + +File: python.info, Node: Bootstrapping pip By Default<2>, Next: Documentation Changes<2>, Up: PEP 477 Backport ensurepip PEP 453 to Python 2 7 + +1.13.15.5 Bootstrapping pip By Default +...................................... + +The new *note ensurepip: 75. module (defined in PEP 453(1)) provides a +standard cross-platform mechanism to bootstrap the pip installer into +Python installations. The version of ‘pip’ included with Python 2.7.9 +is ‘pip’ 1.5.6, and future 2.7.x maintenance releases will update the +bundled version to the latest version of ‘pip’ that is available at the +time of creating the release candidate. + +By default, the commands ‘pip’, ‘pipX’ and ‘pipX.Y’ will be installed on +all platforms (where X.Y stands for the version of the Python +installation), along with the ‘pip’ Python package and its dependencies. + +For CPython *note source builds on POSIX systems: b83, the ‘make +install’ and ‘make altinstall’ commands do not bootstrap ‘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 ‘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 ‘PATH’ modifications to have ‘pip’ available +from the command line by default, otherwise it can still be accessed +through the Python launcher for Windows as ‘py -m pip’. + +As discussed in the PEP(2), 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). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0453/ + + (2) +https://peps.python.org/pep-0477/#disabling-ensurepip-by-downstream-distributors + + +File: python.info, Node: Documentation Changes<2>, Prev: Bootstrapping pip By Default<2>, Up: PEP 477 Backport ensurepip PEP 453 to Python 2 7 + +1.13.15.6 Documentation Changes +............................... + +As part of this change, the *note Installing Python Modules: b85. and +*note Distributing Python Modules: b86. 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(1) and +the documentation of the individual projects. + +However, as this migration is currently still incomplete, the legacy +versions of those guides remaining available as *note Installing Python +Modules (Legacy version): b87. and *note Distributing Python Modules +(Legacy version): b88. + +See also +........ + +PEP 453(2) – 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. + + ---------- Footnotes ---------- + + (1) https://packaging.python.org + + (2) https://peps.python.org/pep-0453/ + + +File: python.info, Node: PEP 476 Enabling certificate verification by default for stdlib http clients<2>, Next: PEP 493 HTTPS verification migration tools for Python 2 7, Prev: PEP 477 Backport ensurepip PEP 453 to Python 2 7, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.7 PEP 476: Enabling certificate verification by default for stdlib http clients +....................................................................................... + +PEP 476(1) updated ‘httplib’ and modules which use it, such as ‘urllib2’ +and ‘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: + + 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) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0476/ + + +File: python.info, Node: PEP 493 HTTPS verification migration tools for Python 2 7, Next: New make regen-all build target<3>, Prev: PEP 476 Enabling certificate verification by default for stdlib http clients<2>, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.8 PEP 493: HTTPS verification migration tools for Python 2.7 +.................................................................... + +PEP 493(1) 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 +‘PYTHONHTTPSVERIFY’ environment variable may be set to ‘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 +‘ssl._https_verify_certificates()’ function can be used to adjust the +default behaviour at runtime. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0493/ + + +File: python.info, Node: New make regen-all build target<3>, Next: Removal of make touch build target<3>, Prev: PEP 493 HTTPS verification migration tools for Python 2 7, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.9 New ‘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 ‘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(1) for details. + +(Contributed by Victor Stinner in bpo-23404(2).) + +New in version 2.7.14. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Makefile.pre.in + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + +File: python.info, Node: Removal of make touch build target<3>, Prev: New make regen-all build target<3>, Up: New Features Added to Python 2 7 Maintenance Releases + +1.13.15.10 Removal of ‘make touch’ build target +............................................... + +The ‘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 ‘make regen-all’ target. + +(Contributed by Victor Stinner in bpo-23404(1).) + +Changed in version 2.7.14. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + +File: python.info, Node: Acknowledgements, Prev: New Features Added to Python 2 7 Maintenance Releases, Up: What’s New in Python 2 7 + +1.13.16 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. + + +File: python.info, Node: What’s New in Python 2 6, Next: What’s New in Python 2 5, Prev: What’s New in Python 2 7, Up: What’s New in Python + +1.14 What’s New in Python 2.6 +============================= + + +Author: A.M. Kuchling (amk at amk.ca) + +This article explains the new features in Python 2.6, released on +October 1, 2008. The release schedule is described in PEP 361(1). + +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 ‘future_builtins’ module and a ‘-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 *note multiprocessing: b5. and *note json: a2. 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. + +* 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<13>. +* 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>. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0361/ + + +File: python.info, Node: Python 3 0, Next: Changes to the Development Process, Up: What’s New in Python 2 6 + +1.14.1 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: + + * A ‘__complex__()’ method for converting objects to a complex + number. + + * Alternate syntax for catching exceptions: ‘except TypeError as + exc’. + + * The addition of *note functools.reduce(): f80. as a synonym for the + built-in ‘reduce()’ function. + +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 *note +bin(): f57. have simply been added to Python 2.6, but existing builtins +haven’t been changed; instead, the ‘future_builtins’ module has versions +with the new 3.0 semantics. Code written to be compatible with 3.0 can +do ‘from future_builtins import hex, map’ as necessary. + +A new command-line switch, ‘-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 +‘sys.py3kwarning’, and to C extension code as ‘Py_Py3kWarningFlag’. + +See also +........ + +The 3xxx series of PEPs, which contains proposals for Python 3.0. PEP +3000(1) describes the development process for Python 3.0. Start with +PEP 3100(2) that describes the general goals for Python 3.0, and then +explore the higher-numbered PEPS that propose specific features. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3000/ + + (2) https://peps.python.org/pep-3100/ + + +File: python.info, Node: Changes to the Development Process, Next: PEP 343 The ‘with’ statement, Prev: Python 3 0, Up: What’s New in Python 2 6 + +1.14.2 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. + + +File: python.info, Node: New Issue Tracker Roundup, Next: New Documentation Format reStructuredText Using Sphinx, Up: Changes to the Development Process + +1.14.2.1 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(1), Launchpad(2), Roundup(3), and +Trac(4). 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 ‘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(5) 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 +‘https://svn.python.org/view/tracker/importer/’ and may be useful to +other projects wishing to move from SourceForge to Roundup. + +See also +........ + +‘https://bugs.python.org’ + + The Python bug tracker. + +‘https://bugs.jython.org’: + + The Jython bug tracker. + +‘https://roundup.sourceforge.io/’ + + Roundup downloads and documentation. + +‘https://svn.python.org/view/tracker/importer/’ + + Martin von Löwis’s conversion scripts. + + ---------- Footnotes ---------- + + (1) https://www.atlassian.com/software/jira/ + + (2) https://launchpad.net/ + + (3) https://roundup.sourceforge.io/ + + (4) https://trac.edgewall.org/ + + (5) http://www.upfrontsoftware.co.za + + +File: python.info, Node: New Documentation Format reStructuredText Using Sphinx, Prev: New Issue Tracker Roundup, Up: Changes to the Development Process + +1.14.2.2 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 +‘http://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(1)) have adopted +Sphinx as their documentation tool. + +See also +........ + +Documenting Python(2) + + Describes how to write for Python’s documentation. + +Sphinx(3) + + Documentation and code for the Sphinx toolchain. + +Docutils(4) + + The underlying reStructuredText parser and toolset. + + ---------- Footnotes ---------- + + (1) https://www.sphinx-doc.org/en/master/examples.html + + (2) https://devguide.python.org/documenting/ + + (3) http://sphinx-doc.org/ + + (4) https://docutils.sourceforge.io + + +File: python.info, Node: PEP 343 The ‘with’ statement, Next: PEP 366 Explicit Relative Imports From a Main Module, Prev: Changes to the Development Process, Up: What’s New in Python 2 6 + +1.14.3 PEP 343: The ‘with’ statement +------------------------------------ + +The previous version, Python 2.5, added the ‘*note with: 19e.’ statement +as an optional feature, to be enabled by a ‘from __future__ import +with_statement’ directive. In 2.6 the statement no longer needs to be +specially enabled; this means that ‘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 +‘‘with’’ statement from Python 2.5, you can skip this section. + +The ‘*note with: 19e.’ statement clarifies code that previously would +use ‘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 ‘*note with: 19e.’ statement is a control-flow structure whose basic +structure is: + + with expression [as variable]: + with-block + +The expression is evaluated, and it should result in an object that +supports the context management protocol (that is, has ‘__enter__()’ and +‘__exit__()’ methods). + +The object’s ‘__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 +‘__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 ‘*note with: 19e.’ statement. File objects are +one example: + + with open('/etc/passwd', 'r') as f: + for line in f: + print line + ... more processing code ... + +After this statement has executed, the file object in `f' will have been +automatically closed, even if the *note for: 199. loop raised an +exception part-way through the block. + + Note: In this case, `f' is the same object created by *note open(): + 30b, because ‘file.__enter__()’ returns `self'. + +The *note threading: 10b. module’s locks and condition variables also +support the ‘*note with: 19e.’ statement: + + lock = threading.Lock() + with lock: + # Critical section of code + ... + +The lock is acquired before the block is executed and always released +once the block is complete. + +The ‘localcontext()’ function in the *note decimal: 34. module makes it +easy to save and restore the current decimal context, which encapsulates +the desired precision and rounding characteristics for computations: + + 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() + +* Menu: + +* Writing Context Managers:: +* The contextlib module:: + + +File: python.info, Node: Writing Context Managers, Next: The contextlib module, Up: PEP 343 The ‘with’ statement + +1.14.3.1 Writing Context Managers +................................. + +Under the hood, the ‘*note with: 19e.’ statement is fairly complicated. +Most people will only use ‘‘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: + + * The expression is evaluated and should result in an object called a + “context manager”. The context manager must have ‘__enter__()’ and + ‘__exit__()’ methods. + + * The context manager’s ‘__enter__()’ method is called. The value + returned is assigned to `VAR'. If no ‘as VAR’ clause is present, + the value is simply discarded. + + * The code in `BLOCK' is executed. + + * If `BLOCK' raises an exception, the context manager’s ‘__exit__()’ + method is called with three arguments, the exception details + (‘type, value, traceback’, the same values returned by *note + sys.exc_info(): 25b, which can also be ‘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 ‘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 ‘*note with: 19e.’ statement will never realize anything went + wrong. + + * If `BLOCK' didn’t raise an exception, the ‘__exit__()’ method is + still called, but `type', `value', and `traceback' are all ‘None’. + +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: + + db_connection = DatabaseConnection() + with db_connection as cursor: + cursor.execute('insert into ...') + cursor.execute('delete from ...') + # ... more operations ... + +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 ‘DatabaseConnection’ that I’ll assume: + + 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" + +The ‘__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 +‘as cursor’ to their ‘*note with: 19e.’ statement to bind the cursor to +a variable name. + + class DatabaseConnection: + ... + def __enter__(self): + # Code to start a new transaction + cursor = self.cursor() + return cursor + +The ‘__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 ‘None’. ‘None’ is false, so the +exception will be re-raised automatically. If you wished, you could be +more explicit and add a *note return: 60e. statement at the marked +location. + + 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 + + +File: python.info, Node: The contextlib module, Prev: Writing Context Managers, Up: PEP 343 The ‘with’ statement + +1.14.3.2 The contextlib module +.............................. + +The *note contextlib: 22. module provides some functions and a decorator +that are useful when writing objects for use with the ‘*note with: 19e.’ +statement. + +The decorator is called ‘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 *note yield: 60d. +will be executed as the ‘__enter__()’ method, and the value yielded will +be the method’s return value that will get bound to the variable in the +‘*note with: 19e.’ statement’s ‘as’ clause, if any. The code after the +‘yield’ will be executed in the ‘__exit__()’ method. Any exception +raised in the block will be raised by the ‘yield’ statement. + +Using this decorator, our database example from the previous section +could be written as: + + 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: + ... + +The *note contextlib: 22. module also has a ‘nested(mgr1, mgr2, ...)’ +function that combines a number of context managers so you don’t need to +write nested ‘*note with: 19e.’ statements. In this example, the single +‘‘with’’ statement both starts a database transaction and acquires a +thread lock: + + lock = threading.Lock() + with nested (db_transaction(db), lock) as (cursor, locked): + ... + +Finally, the ‘closing()’ function returns its argument so that it can be +bound to a variable, and calls the argument’s ‘.close()’ method at the +end of the block. + + 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) + +See also +........ + +PEP 343(1) - 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 ‘*note with: 19e.’ statement, which can be + helpful in learning how the statement works. + +The documentation for the *note contextlib: 22. module. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0343/ + + +File: python.info, Node: PEP 366 Explicit Relative Imports From a Main Module, Next: PEP 370 Per-user site-packages Directory, Prev: PEP 343 The ‘with’ statement, Up: What’s New in Python 2 6 + +1.14.4 PEP 366: Explicit Relative Imports From a Main Module +------------------------------------------------------------ + +Python’s *note -m: 1ae. 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 *note __package__: cc9. attribute to +modules. When this attribute is present, relative imports will be +relative to the value of this attribute instead of the *note __name__: +1019. attribute. + +PEP 302-style importers can then set *note __package__: cc9. as +necessary. The *note runpy: df. module that implements the *note -m: +1ae. switch now does this, so relative imports will now work correctly +in scripts running from inside a package. + + +File: python.info, Node: PEP 370 Per-user site-packages Directory, Next: PEP 371 The multiprocessing Package, Prev: PEP 366 Explicit Relative Imports From a Main Module, Up: What’s New in Python 2 6 + +1.14.5 PEP 370: Per-user ‘site-packages’ Directory +-------------------------------------------------- + +When you run Python, the module search path ‘sys.path’ usually includes +a directory whose path ends in ‘"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: + + * Unix and Mac OS X: ‘~/.local/’ + + * Windows: ‘%APPDATA%/Python’ + +Within this directory, there will be version-specific subdirectories, +such as ‘lib/python2.6/site-packages’ on Unix/Mac OS and +‘Python26/site-packages’ on Windows. + +If you don’t like the default directory, it can be overridden by an +environment variable. *note PYTHONUSERBASE: 101b. 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 ‘APPDATA’ environment variable. You can also modify the +‘site.py’ file for your Python installation. + +The feature can be disabled entirely by running Python with the *note +-s: 101c. option or setting the *note PYTHONNOUSERSITE: 101d. +environment variable. + +See also +........ + +PEP 370(1) - Per-user ‘site-packages’ Directory + + PEP written and implemented by Christian Heimes. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0370/ + + +File: python.info, Node: PEP 371 The multiprocessing Package, Next: PEP 3101 Advanced String Formatting, Prev: PEP 370 Per-user site-packages Directory, Up: What’s New in Python 2 6 + +1.14.6 PEP 371: The ‘multiprocessing’ Package +--------------------------------------------- + +The new *note multiprocessing: b5. 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 *note multiprocessing: b5. module started out as an exact emulation +of the *note threading: 10b. 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 +‘Process’, which is passed a callable object and a collection of +arguments. The ‘start()’ method sets the callable running in a +subprocess, after which you can call the ‘is_alive()’ method to check +whether the subprocess is still running and the ‘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. + + 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 + +A *note Queue: 101f. is used to communicate the result of the factorial. +The *note Queue: 101f. 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 *note Queue: 101f, 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, ‘Pool’ and ‘Manager’, provide higher-level +interfaces. ‘Pool’ will create a fixed number of worker processes, and +requests can then be distributed to the workers by calling ‘apply()’ or +‘apply_async()’ to add a single request, and *note map(): 460. or +‘map_async()’ to add a number of requests. The following code uses a +‘Pool’ to spread requests across 5 worker processes and retrieve a list +of results: + + 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 + +This produces the following output: + + 1 + 39916800 + 51090942171709440000 + 8222838654177922817725562880000000 + 33452526613163807108170062053440751665152000000000 + ... + +The other high-level interface, the ‘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 *note dict(): 16e. method; the worker processes then insert +values into the dictionary. (Locking is not done for you automatically, +which doesn’t matter in this example. ‘Manager’’s methods also include +‘Lock()’, ‘RLock()’, and ‘Semaphore()’ to create shared locks.) + + 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 + +This will produce the output: + + 1 1 + 11 39916800 + 21 51090942171709440000 + 31 8222838654177922817725562880000000 + 41 33452526613163807108170062053440751665152000000000 + 51 15511187532873822802242430164693032110632597200169861120000... + +See also +........ + +The documentation for the *note multiprocessing: b5. module. + +PEP 371(1) - Addition of the multiprocessing package + + PEP written by Jesse Noller and Richard Oudkerk; implemented by + Richard Oudkerk and Jesse Noller. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0371/ + + +File: python.info, Node: PEP 3101 Advanced String Formatting, Next: PEP 3105 print As a Function, Prev: PEP 371 The multiprocessing Package, Up: What’s New in Python 2 6 + +1.14.7 PEP 3101: Advanced String Formatting +------------------------------------------- + +In Python 3.0, the ‘%’ operator is supplemented by a more powerful +string formatting method, *note format(): 1f7. Support for the *note +str.format(): 1fc. method has been backported to Python 2.6. + +In 2.6, both 8-bit and Unicode strings have a ‘.format()’ method that +treats the string as a template and takes the arguments to be formatted. +The formatting template uses curly brackets (‘{’, ‘}’) as special +characters: + + >>> # 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' + +Curly brackets can be escaped by doubling them: + + >>> "Empty dict: {{}}".format() + "Empty dict: {}" + +Field names can be integers indicating positional arguments, such as +‘{0}’, ‘{1}’, etc. or names of keyword arguments. You can also supply +compound field names that read attributes or access dictionary keys: + + >>> 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' + +Note that when using dictionary-style notation such as ‘[.mp4]’, you +don’t need to put any quotation marks around the string; it will look up +the value using ‘.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: + + >>> # 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' + +Format specifiers can reference other fields through nesting: + + >>> fmt = '{0:{1}}' + >>> width = 15 + >>> fmt.format('Invoice #1234', width) + 'Invoice #1234 ' + >>> width = 35 + >>> fmt.format('Invoice #1234', width) + 'Invoice #1234 ' + +The alignment of a field within the desired width can be specified: + +Character Effect + +---------------------------------------------------------------------- + +< (default) Left-align + + +> Right-align + + +^ Center + + += (For numeric types only) Pad after the sign. + + +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: + + >>> '{0:g}'.format(3.75) + '3.75' + >>> '{0:e}'.format(3.75) + '3.750000e+00' + +A variety of presentation types are available. Consult the 2.6 +documentation for a *note complete list: 1021.; here’s a sample: + +‘b’ Binary. Outputs the number in base 2. + + +‘c’ Character. Converts the integer to the corresponding Unicode character + before printing. + + +‘d’ Decimal Integer. Outputs the number in base 10. + + +‘o’ Octal format. Outputs the number in base 8. + + +‘x’ Hex format. Outputs the number in base 16, using lower-case letters for + the digits above 9. + + +‘e’ Exponent notation. Prints the number in scientific notation using the + letter ‘e’ to indicate the exponent. + + +‘g’ 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. + + +‘n’ 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. + + +‘%’ Percentage. Multiplies the number by 100 and displays in fixed (‘f’) + format, followed by a percent sign. + + +Classes and types can define a ‘__format__()’ method to control how +they’re formatted. It receives a single argument, the format specifier: + + def __format__(self, format_spec): + if isinstance(format_spec, unicode): + return unicode(str(self)) + else: + return str(self) + +There’s also a *note format(): 1f7. builtin that will format a single +value. It calls the type’s ‘__format__()’ method with the provided +specifier: + + >>> format(75.6564, '.2f') + '75.66' + +See also +........ + +*note Format String Syntax: 1021. + + The reference documentation for format fields. + +PEP 3101(1) - Advanced String Formatting + + PEP written by Talin. Implemented by Eric Smith. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3101/ + + +File: python.info, Node: PEP 3105 print As a Function, Next: PEP 3110 Exception-Handling Changes, Prev: PEP 3101 Advanced String Formatting, Up: What’s New in Python 2 6 + +1.14.8 PEP 3105: ‘print’ As a Function +-------------------------------------- + +The ‘print’ statement becomes the *note print(): c13. function in Python +3.0. Making *note print(): c13. a function makes it possible to replace +the function by doing ‘def print(...)’ or importing a new function from +somewhere else. + +Python 2.6 has a ‘__future__’ import that removes ‘print’ as language +syntax, letting you use the functional form instead. For example: + + >>> from __future__ import print_function + >>> print('# of entries', len(dictionary), file=sys.stderr) + +The signature of the new function is: + + def print(*args, sep=' ', end='\n', file=None) + +The parameters are: + + * `args': positional arguments whose values will be printed out. + + * `sep': the separator, which will be printed between arguments. + + * `end': the ending text, which will be printed after all of the + arguments have been output. + + * `file': the file object to which the output will be sent. + +See also +........ + +PEP 3105(1) - Make print a function + + PEP written by Georg Brandl. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3105/ + + +File: python.info, Node: PEP 3110 Exception-Handling Changes, Next: PEP 3112 Byte Literals, Prev: PEP 3105 print As a Function, Up: What’s New in Python 2 6 + +1.14.9 PEP 3110: Exception-Handling Changes +------------------------------------------- + +One error that Python programmers occasionally make is writing the +following code: + + try: + ... + except TypeError, ValueError: # Wrong! + ... + +The author is probably trying to catch both *note TypeError: 19c. and +*note ValueError: 1c8. exceptions, but this code actually does something +different: it will catch *note TypeError: 19c. and bind the resulting +exception object to the local name ‘"ValueError"’. The *note +ValueError: 1c8. exception will not be caught at all. The correct code +specifies a tuple of exceptions: + + try: + ... + except (TypeError, ValueError): + ... + +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 ‘exc’, you must write: + + try: + ... + except TypeError as exc: + ... + +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. + +See also +........ + +PEP 3110(1) - Catching Exceptions in Python 3000 + + PEP written and implemented by Collin Winter. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3110/ + + +File: python.info, Node: PEP 3112 Byte Literals, Next: PEP 3116 New I/O Library, Prev: PEP 3110 Exception-Handling Changes, Up: What’s New in Python 2 6 + +1.14.10 PEP 3112: Byte Literals +------------------------------- + +Python 3.0 adopts Unicode as the language’s fundamental string type and +denotes 8-bit literals differently, either as ‘b'string'’ or using a +*note bytes: 1b4. constructor. For future compatibility, Python 2.6 +adds *note bytes: 1b4. as a synonym for the *note str: 1b3. type, and it +also supports the ‘b''’ notation. + +The 2.6 *note str: 1b3. differs from 3.0’s *note bytes: 1b4. type in +various ways; most notably, the constructor is completely different. In +3.0, ‘bytes([65, 66, 67])’ is 3 elements long, containing the bytes +representing ‘ABC’; in 2.6, ‘bytes([65, 66, 67])’ returns the 12-byte +string representing the *note str(): 1b3. of the list. + +The primary use of *note bytes: 1b4. in 2.6 will be to write tests of +object type such as ‘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 *note bytes: +1b4. or *note str: 1b3. to represent your intention exactly, and the +resulting code will also be correct in Python 3.0. + +There’s also a ‘__future__’ import that causes all string literals to +become Unicode strings. This means that ‘\u’ escape sequences can be +used to include Unicode characters: + + from __future__ import unicode_literals + + s = ('\u751f\u3080\u304e\u3000\u751f\u3054' + '\u3081\u3000\u751f\u305f\u307e\u3054') + + print len(s) # 12 Unicode characters + +At the C level, Python 3.0 will rename the existing 8-bit string type, +called ‘PyStringObject’ in Python 2.x, to *note PyBytesObject: 372. +Python 2.6 uses ‘#define’ to support using the names *note +PyBytesObject(): 372, *note PyBytes_Check(): 1025, *note +PyBytes_FromStringAndSize(): 1026, and all the other functions and +macros used with strings. + +Instances of the *note bytes: 1b4. type are immutable just as strings +are. A new *note bytearray: 1a5. type stores a mutable sequence of +bytes: + + >>> 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' + +Byte arrays support most of the methods of string types, such as +‘startswith()’/‘endswith()’, ‘find()’/‘rfind()’, and some of the methods +of lists, such as ‘append()’, ‘pop()’, and ‘reverse()’. + + >>> b = bytearray('ABC') + >>> b.append('d') + >>> b.append(ord('e')) + >>> b + bytearray(b'ABCde') + +There’s also a corresponding C API, with *note PyByteArray_FromObject(): +1027, *note PyByteArray_FromStringAndSize(): 1028, and various other +functions. + +See also +........ + +PEP 3112(1) - Bytes literals in Python 3000 + + PEP written by Jason Orendorff; backported to 2.6 by Christian + Heimes. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3112/ + + +File: python.info, Node: PEP 3116 New I/O Library, Next: PEP 3118 Revised Buffer Protocol, Prev: PEP 3112 Byte Literals, Up: What’s New in Python 2 6 + +1.14.11 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 ‘read()’ and ‘write()’, but they may not +support *note readline(): db, for example. Python 3.0 introduces a +layered I/O library in the *note io: 9f. 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 *note +io: 9f. module: + + * ‘RawIOBase’ defines raw I/O operations: ‘read()’, ‘readinto()’, + ‘write()’, ‘seek()’, ‘tell()’, ‘truncate()’, and ‘close()’. Most + of the methods of this class will often map to a single system + call. There are also ‘readable()’, ‘writable()’, and ‘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. + + * ‘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 + ‘RawIOBase’, and adds a ‘raw’ attribute holding the underlying raw + object. + + There are five concrete classes implementing this ABC. + ‘BufferedWriter’ and ‘BufferedReader’ are for objects that support + write-only or read-only usage that have a ‘seek()’ method for + random access. ‘BufferedRandom’ objects support read and write + access upon the same underlying stream, and ‘BufferedRWPair’ is for + objects such as TTYs that have both read and write operations + acting upon unconnected streams of data. The ‘BytesIO’ class + supports reading, writing, and seeking over an in-memory buffer. + + * ‘TextIOBase’: Provides functions for reading and writing strings + (remember, strings will be Unicode in Python 3.0), and supporting + *note universal newlines: 9ae. ‘TextIOBase’ defines the *note + readline(): db. method and supports iteration upon objects. + + There are two concrete implementations. ‘TextIOWrapper’ wraps a + buffered I/O object, supporting all of the methods for text I/O and + adding a ‘buffer’ attribute for access to the underlying object. + ‘StringIO’ simply buffers everything in memory without ever writing + anything to disk. + + (In Python 2.6, *note io.StringIO: bbe. is implemented in pure + Python, so it’s pretty slow. You should therefore stick with the + existing ‘StringIO’ module or ‘cStringIO’ for now. At some point + Python 3.0’s *note io: 9f. module will be rewritten into C for + speed, and perhaps the C implementation will be backported to the + 2.x releases.) + +In Python 2.6, the underlying implementations haven’t been restructured +to build on top of the *note io: 9f. 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. + +See also +........ + +PEP 3116(1) - 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3116/ + + +File: python.info, Node: PEP 3118 Revised Buffer Protocol, Next: PEP 3119 Abstract Base Classes, Prev: PEP 3116 New I/O Library, Up: What’s New in Python 2 6 + +1.14.12 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 *note re: da. 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 ‘PyObject_GetBuffer(PyObject +*obj, Py_buffer *view, int flags)’, which takes an object and a set of +flags, and fills in the ‘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 ‘PyBuffer_Release(Py_buffer *view)’ +to indicate that the external caller is done. + +The `flags' argument to *note PyObject_GetBuffer(): 329. specifies +constraints upon the memory returned. Some examples are: + + * ‘PyBUF_WRITABLE’ indicates that the memory must be writable. + + * ‘PyBUF_LOCK’ requests a read-only or exclusive lock on the + memory. + + * ‘PyBUF_C_CONTIGUOUS’ and ‘PyBUF_F_CONTIGUOUS’ requests a + C-contiguous (last dimension varies the fastest) or + Fortran-contiguous (first dimension varies the fastest) array + layout. + +Two new argument codes for *note PyArg_ParseTuple(): 4d9, ‘s*’ and ‘z*’, +return locked buffer objects for a parameter. + +See also +........ + +PEP 3118(1) - Revising the buffer protocol + + PEP written by Travis Oliphant and Carl Banks; implemented by + Travis Oliphant. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3118/ + + +File: python.info, Node: PEP 3119 Abstract Base Classes, Next: PEP 3127 Integer Literal Support and Syntax, Prev: PEP 3118 Revised Buffer Protocol, Up: What’s New in Python 2 6 + +1.14.13 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 *note abc: 3. module +containing a metaclass called ‘ABCMeta’, special handling of this +metaclass by the *note isinstance(): 3ab. and *note issubclass(): 3ac. +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 ‘obj[1]’ +works. Does it imply that setting items with ‘obj[2] = value’ works? +Or that the object will have ‘keys()’, ‘values()’, and ‘items()’ +methods? What about the iterative variants such as ‘iterkeys()’? *note +copy(): 24. and ‘update()’? Iterating over the object with *note +iter(): 3c6.? + +The Python 2.6 *note collections: 1c. module includes a number of +different ABCs that represent these distinctions. ‘Iterable’ indicates +that a class defines ‘__iter__()’, and ‘Container’ means the class +defines a ‘__contains__()’ method and therefore supports ‘x in y’ +expressions. The basic dictionary interface of getting items, setting +items, and ‘keys()’, ‘values()’, and ‘items()’, is defined by the +‘MutableMapping’ ABC. + +You can derive your own classes from a particular ABC to indicate they +support that ABC’s interface: + + import collections + + class Storage(collections.MutableMapping): + ... + +Alternatively, you could write the class without deriving from the +desired ABC and instead register the class by calling the ABC’s +‘register()’ method: + + import collections + + class Storage: + ... + + collections.MutableMapping.register(Storage) + +For classes that you write, deriving from the ABC is probably clearer. +The ‘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 +‘PrintableType’ ABC, it’s legal to do: + + # Register Python's types + PrintableType.register(int) + PrintableType.register(float) + PrintableType.register(str) + +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: + + def func(d): + if not isinstance(d, collections.MutableMapping): + raise ValueError("Mapping object expected, not %r" % d) + +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 ‘abc.ABCMeta’ as the metaclass in a +class definition: + + 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): + ... + +In the ‘Drawable’ ABC above, the ‘draw_doubled()’ method renders the +object at twice its size and can be implemented in terms of other +methods described in ‘Drawable’. Classes implementing this ABC +therefore don’t need to provide their own implementation of +‘draw_doubled()’, though they can do so. An implementation of ‘draw()’ +is necessary, though; the ABC can’t provide a useful generic +implementation. + +You can apply the ‘@abstractmethod’ decorator to methods such as +‘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: + + >>> class Circle(Drawable): + ... pass + ... + >>> c = Circle() + Traceback (most recent call last): + File "", line 1, in + TypeError: Can't instantiate abstract class Circle with abstract methods draw + >>> + +Abstract data attributes can be declared using the ‘@abstractproperty’ +decorator: + + from abc import abstractproperty + ... + + @abstractproperty + def readonly(self): + return self._x + +Subclasses must then define a ‘readonly()’ property. + +See also +........ + +PEP 3119(1) - 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3119/ + + +File: python.info, Node: PEP 3127 Integer Literal Support and Syntax, Next: PEP 3129 Class Decorators, Prev: PEP 3119 Abstract Base Classes, Up: What’s New in Python 2 6 + +1.14.14 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”: + + >>> 0o21, 2*8 + 1 + (17, 17) + >>> 0b101111 + 47 + +The *note oct(): f77. builtin still returns numbers prefixed with a +leading zero, and a new *note bin(): f57. builtin returns the binary +representation for a number: + + >>> oct(42) + '052' + >>> future_builtins.oct(42) + '0o52' + >>> bin(173) + '0b10101101' + +The *note int(): 1c7. and ‘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): + + >>> int ('0o52', 0) + 42 + >>> int('1101', 2) + 13 + >>> int('0b1101', 2) + 13 + >>> int('0b1101', 0) + 13 + +See also +........ + +PEP 3127(1) - Integer Literal Support and Syntax + + PEP written by Patrick Maupin; backported to 2.6 by Eric Smith. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3127/ + + +File: python.info, Node: PEP 3129 Class Decorators, Next: PEP 3141 A Type Hierarchy for Numbers, Prev: PEP 3127 Integer Literal Support and Syntax, Up: What’s New in Python 2 6 + +1.14.15 PEP 3129: Class Decorators +---------------------------------- + +Decorators have been extended from functions to classes. It’s now legal +to write: + + @foo + @bar + class A: + pass + +This is equivalent to: + + class A: + pass + + A = foo(bar(A)) + +See also +........ + +PEP 3129(1) - Class Decorators + + PEP written by Collin Winter. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3129/ + + +File: python.info, Node: PEP 3141 A Type Hierarchy for Numbers, Next: Other Language Changes<13>, Prev: PEP 3129 Class Decorators, Up: What’s New in Python 2 6 + +1.14.16 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 +*note numbers: bf. module. + +The most general ABC is ‘Number’. It defines no operations at all, and +only exists to allow checking if an object is a number by doing +‘isinstance(obj, Number)’. + +‘Complex’ is a subclass of ‘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 ‘Complex’. + +‘Real’ further derives from ‘Complex’, and adds operations that only +work on real numbers: ‘floor()’, ‘trunc()’, rounding, taking the +remainder mod N, floor division, and comparisons. + +‘Rational’ numbers derive from ‘Real’, have ‘numerator’ and +‘denominator’ properties, and can be converted to floats. Python 2.6 +adds a simple rational-number class, ‘Fraction’, in the *note fractions: +7d. module. (It’s called ‘Fraction’ instead of ‘Rational’ to avoid a +name clash with *note numbers.Rational: f6d.) + +‘Integral’ numbers derive from ‘Rational’, and can be shifted left and +right with ‘<<’ and ‘>>’, combined using bitwise operations such as ‘&’ +and ‘|’, and can be used as array indexes and slice boundaries. + +In Python 3.0, the PEP slightly redefines the existing builtins *note +round(): f7e, *note math.floor(): 102f, *note math.ceil(): 1030, and +adds a new one, *note math.trunc(): 1031, that’s been backported to +Python 2.6. *note math.trunc(): 1031. rounds toward zero, returning the +closest ‘Integral’ that’s between the function’s argument and zero. + +See also +........ + +PEP 3141(1) - A Type Hierarchy for Numbers + + PEP written by Jeffrey Yasskin. + +Scheme’s numerical tower(2), from the Guile manual. + +Scheme’s number datatypes(3) from the R5RS Scheme specification. + +* Menu: + +* The fractions Module:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3141/ + + (2) +https://www.gnu.org/software/guile/manual/html_node/Numerical-Tower.html#Numerical-Tower + + (3) +https://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.2 + + +File: python.info, Node: The fractions Module, Up: PEP 3141 A Type Hierarchy for Numbers + +1.14.16.1 The ‘fractions’ Module +................................ + +To fill out the hierarchy of numeric types, the *note fractions: 7d. +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 ‘2/3’ that floating-point numbers can +only approximate. + +The ‘Fraction’ constructor takes two ‘Integral’ values that will be the +numerator and denominator of the resulting fraction. + + >>> 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) + +For converting floating-point numbers to rationals, the float type now +has an ‘as_integer_ratio()’ method that returns the numerator and +denominator for a fraction that evaluates to the same floating-point +value: + + >>> (2.5) .as_integer_ratio() + (5, 2) + >>> (3.1415) .as_integer_ratio() + (7074029114692207L, 2251799813685248L) + >>> (1./3) .as_integer_ratio() + (6004799503160661L, 18014398509481984L) + +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 *note fractions: 7d. module is based upon an implementation by +Sjoerd Mullender that was in Python’s ‘Demo/classes/’ directory for a +long time. This implementation was significantly updated by Jeffrey +Yasskin. + + +File: python.info, Node: Other Language Changes<13>, Next: New and Improved Modules<2>, Prev: PEP 3141 A Type Hierarchy for Numbers, Up: What’s New in Python 2 6 + +1.14.17 Other Language Changes +------------------------------ + +Some smaller changes made to the core Python language are: + + * Directories and zip archives containing a ‘__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(1).) + + * The *note hasattr(): 836. function was catching and ignoring all + errors, under the assumption that they meant a ‘__getattr__()’ + method was failing somehow and the return value of *note hasattr(): + 836. would therefore be ‘False’. This logic shouldn’t be applied + to *note KeyboardInterrupt: 611. and *note SystemExit: 9b6, + however; Python 2.6 will no longer discard such exceptions when + *note hasattr(): 836. encounters them. (Fixed by Benjamin + Peterson; bpo-2196(2).) + + * When calling a function using the ‘**’ syntax to provide keyword + arguments, you are no longer required to use a Python dictionary; + any mapping will now work: + + >>> def f(**kw): + ... print sorted(kw) + ... + >>> ud=UserDict.UserDict() + >>> ud['a'] = 1 + >>> ud['b'] = 'string' + >>> f(**ud) + ['a', 'b'] + + (Contributed by Alexander Belopolsky; bpo-1686487(3).) + + It’s also become legal to provide keyword arguments after a ‘*args’ + argument to a function call. + + >>> def f(*args, **kw): + ... print args, kw + ... + >>> f(1,2,3, *(4,5,6), keyword=13) + (1, 2, 3, 4, 5, 6) {'keyword': 13} + + Previously this would have been a syntax error. (Contributed by + Amaury Forgeot d’Arc; bpo-3473(4).) + + * A new builtin, ‘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 *note StopIteration: 865. exception will be raised. + (Backported in bpo-2719(5).) + + * Tuples now have ‘index()’ and ‘count()’ methods matching the list + type’s ‘index()’ and ‘count()’ methods: + + >>> t = (0,1,2,3,4,0,1,2) + >>> t.index(3) + 3 + >>> t.count(0) + 2 + + (Contributed by Raymond Hettinger) + + * The built-in types now have improved support for extended slicing + syntax, accepting various combinations of ‘(start, stop, step)’. + Previously, the support was partial and certain corner cases + wouldn’t work. (Implemented by Thomas Wouters.) + + * Properties now have three attributes, ‘getter’, ‘setter’ and + ‘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: + + 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 + + * Several methods of the built-in set types now accept multiple + iterables: ‘intersection()’, ‘intersection_update()’, ‘union()’, + ‘update()’, ‘difference()’ and ‘difference_update()’. + + >>> s=set('1234567890') + >>> s.intersection('abc123', 'cdf246') # Intersection between all inputs + set(['2']) + >>> s.difference('246', '789') + set(['1', '0', '3', '5']) + + (Contributed by Raymond Hettinger.) + + * Many floating-point features were added. The *note float(): 3ca. + function will now turn the string ‘nan’ into an IEEE 754 Not A + Number value, and ‘+inf’ and ‘-inf’ into positive or negative + infinity. This works on any platform with IEEE 754 semantics. + (Contributed by Christian Heimes; bpo-1635(6).) + + Other functions in the *note math: af. module, ‘isinf()’ and + ‘isnan()’, return true if their floating-point argument is infinite + or Not A Number. (bpo-1640(7)) + + Conversion functions were added to convert floating-point numbers + into hexadecimal strings (bpo-3008(8)). These functions convert + floats to and from a string representation without introducing + rounding errors from the conversion between decimal and binary. + Floats have a *note hex(): f78. method that returns a string + representation, and the ‘float.fromhex()’ method converts a string + back into a number: + + >>> a = 3.75 + >>> a.hex() + '0x1.e000000000000p+1' + >>> float.fromhex('0x1.e000000000000p+1') + 3.75 + >>> b=1./3 + >>> b.hex() + '0x1.5555555555555p-2' + + * A numerical nicety: when creating a complex number from two floats + on systems that support signed zeros (-0 and +0), the *note + complex(): 1b8. constructor will now preserve the sign of the zero. + (Fixed by Mark T. Dickinson; bpo-1507(9).) + + * Classes that inherit a ‘__hash__()’ method from a parent class can + set ‘__hash__ = None’ to indicate that the class isn’t hashable. + This will make ‘hash(obj)’ raise a *note TypeError: 19c. and the + class will not be indicated as implementing the ‘Hashable’ ABC. + + You should do this when you’ve defined a ‘__cmp__()’ or ‘__eq__()’ + method that compares objects by their value rather than by + identity. All objects have a default hash method that uses + ‘id(obj)’ as the hash value. There’s no tidy way to remove the + ‘__hash__()’ method inherited from a parent class, so assigning + ‘None’ was implemented as an override. At the C level, extensions + can set ‘tp_hash’ to *note PyObject_HashNotImplemented(): 1034. + (Fixed by Nick Coghlan and Amaury Forgeot d’Arc; bpo-2235(10).) + + * The *note GeneratorExit: 1035. exception now subclasses *note + BaseException: 17d. instead of *note Exception: 61c. This means + that an exception handler that does ‘except Exception:’ will not + inadvertently catch *note GeneratorExit: 1035. (Contributed by + Chad Austin; bpo-1537(11).) + + * Generator objects now have a ‘gi_code’ attribute that refers to the + original code object backing the generator. (Contributed by Collin + Winter; bpo-1473257(12).) + + * The *note compile(): 310. built-in function now accepts keyword + arguments as well as positional parameters. (Contributed by Thomas + Wouters; bpo-1444529(13).) + + * The *note complex(): 1b8. constructor now accepts strings + containing parenthesized complex numbers, meaning that + ‘complex(repr(cplx))’ will now round-trip values. For example, + ‘complex('(3+4j)')’ now returns the value (3+4j). + (bpo-1491866(14)) + + * The string ‘translate()’ method now accepts ‘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(15).) + + * The built-in *note dir(): 20e. function now checks for a + ‘__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 *note + dir(): 20e. produces. Objects that have ‘__getattr__()’ or + ‘__getattribute__()’ methods can use this to advertise + pseudo-attributes they will honor. (bpo-1591665(16)) + + * Instance method objects have new attributes for the object and + function comprising the method; the new synonym for ‘im_self’ is + ‘__self__’, and ‘im_func’ is also available as ‘__func__’. The old + names are still supported in Python 2.6, but are gone in 3.0. + + * An obscure change: when you use the *note locals(): 842. function + inside a *note class: f7b. statement, the resulting dictionary no + longer returns free variables. (Free variables, in this case, are + variables referenced in the ‘class’ statement that aren’t + attributes of the class.) + +* Menu: + +* Optimizations: Optimizations<12>. +* Interpreter Changes: Interpreter Changes<2>. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1739468 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=2196 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1686487 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=3473 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=2719 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1635 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=1640 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=3008 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=1507 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=2235 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1537 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=1473257 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=1444529 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=1491866 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=1193128 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=1591665 + + +File: python.info, Node: Optimizations<12>, Next: Interpreter Changes<2>, Up: Other Language Changes<13> + +1.14.17.1 Optimizations +....................... + + * The *note warnings: 130. 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(1).) + + * 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(2).) + + 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 + ‘Py_TPFLAGS_HAVE_VERSION_TAG’ to the module’s ‘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 + ‘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(3) for some discussion.) + + * 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(4).) + + * All of the functions in the *note struct: f5. module have been + rewritten in C, thanks to work at the Need For Speed sprint. + (Contributed by Raymond Hettinger.) + + * 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.) + + * Unicode strings now use faster code for detecting whitespace and + line breaks; this speeds up the ‘split()’ method by about 25% and + ‘splitlines()’ by 35%. (Contributed by Antoine Pitrou.) Memory + usage is reduced by using pymalloc for the Unicode string’s data. + + * The ‘with’ statement now stores the ‘__exit__()’ method on the + stack, producing a small speedup. (Implemented by Jeffrey + Yasskin.) + + * 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1631171 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1700288 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1878 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1819 + + +File: python.info, Node: Interpreter Changes<2>, Prev: Optimizations<12>, Up: Other Language Changes<13> + +1.14.17.2 Interpreter Changes +............................. + +Two command-line options have been reserved for use by other Python +implementations. The *note -J: 1039. switch has been reserved for use +by Jython for Jython-specific options, such as switches that are passed +to the underlying JVM. *note -X: 174. 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 ‘.pyc’ or ‘.pyo’ files by +supplying the *note -B: 103a. switch to the Python interpreter, or by +setting the *note PYTHONDONTWRITEBYTECODE: 103b. environment variable +before running the interpreter. This setting is available to Python +programs as the ‘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 *note PYTHONIOENCODING: cad. environment +variable before running the interpreter. The value should be a string +in the form ‘’ or ‘:’. The `encoding' +part specifies the encoding’s name, e.g. ‘utf-8’ or ‘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.) + + +File: python.info, Node: New and Improved Modules<2>, Next: Deprecations and Removals, Prev: Other Language Changes<13>, Up: What’s New in Python 2 6 + +1.14.18 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 ‘Misc/NEWS’ +file in the source tree for a more complete list of changes, or look +through the Subversion logs for all the details. + + * The *note asyncore: a. and *note asynchat: 8. modules are being + actively maintained again, and a number of patches and bugfixes + were applied. (Maintained by Josiah Carlson; see bpo-1736190(1) + for one patch.) + + * The ‘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(2). 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 ‘bsddb.dbshelve’ module now uses the highest pickling protocol + available, instead of restricting itself to protocol 1. + (Contributed by W. Barnes.) + + * The *note cgi: 14. 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(3).) + + The ‘parse_qs()’ and ‘parse_qsl()’ functions have been relocated + from the *note cgi: 14. module to the ‘urlparse’ module. The + versions still available in the *note cgi: 14. module will trigger + *note PendingDeprecationWarning: 503. messages in 2.6 + (bpo-600362(4)). + + * The *note cmath: 17. module underwent extensive revision, + contributed by Mark Dickinson and Christian Heimes. Five new + functions were added: + + * ‘polar()’ converts a complex number to polar form, returning + the modulus and argument of the complex number. + + * ‘rect()’ does the opposite, turning a modulus, argument pair + back into the corresponding complex number. + + * ‘phase()’ returns the argument (also called the angle) of a + complex number. + + * ‘isnan()’ returns True if either the real or imaginary part of + its argument is a NaN. + + * ‘isinf()’ returns True if either the real or imaginary part of + its argument is infinite. + + The revisions also improved the numerical soundness of the *note + cmath: 17. 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(5) for the + details. The branch cuts for ‘asinh()’, ‘atanh()’: and ‘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 *note cmath: 17. module now handles IEEE + 754 special values and floating-point exceptions in a manner + consistent with Annex ‘G’ of the C99 standard. + + * A new data type in the *note collections: 1c. module: + ‘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: + + >>> 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) + + Several places in the standard library that returned tuples have + been modified to return ‘namedtuple’ instances. For example, the + ‘Decimal.as_tuple()’ method now returns a named tuple with ‘sign’, + ‘digits’, and ‘exponent’ fields. + + (Contributed by Raymond Hettinger.) + + * Another change to the *note collections: 1c. module is that the + ‘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. + + >>> 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) + + (Contributed by Raymond Hettinger.) + + * The ‘Cookie’ module’s ‘Morsel’ objects now support an ‘httponly’ + attribute. In some browsers. cookies with this attribute set + cannot be accessed or manipulated by JavaScript code. (Contributed + by Arvin Schnell; bpo-1638033(6).) + + * A new window method in the *note curses: 2a. module, ‘chgat()’, + changes the display attributes for a certain number of characters + on a single line. (Contributed by Fabian Kreutz.) + + # Boldface text starting at y=0,x=21 + # and affecting the rest of the line. + stdscr.chgat(0, 21, curses.A_BOLD) + + The ‘Textbox’ class in the *note curses.textpad: 2d. 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 ‘Textbox’ instance. + + * The *note datetime: 2f. module’s ‘strftime()’ methods now support a + ‘%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(7).) + + * The *note decimal: 34. module was updated to version 1.66 of the + General Decimal Specification(8). New features include some + methods for some basic mathematical functions such as ‘exp()’ and + ‘log10()’: + + >>> Decimal(1).exp() + Decimal("2.718281828459045235360287471") + >>> Decimal("2.7182818").ln() + Decimal("0.9999999895305022877376682436") + >>> Decimal(1000).log10() + Decimal("3") + + The ‘as_tuple()’ method of ‘Decimal’ objects now returns a named + tuple with ‘sign’, ‘digits’, and ‘exponent’ fields. + + (Implemented by Facundo Batista and Mark Dickinson. Named tuple + support added by Raymond Hettinger.) + + * The *note difflib: 35. module’s ‘SequenceMatcher’ class now returns + named tuples representing matches, with ‘a’, ‘b’, and ‘size’ + attributes. (Contributed by Raymond Hettinger.) + + * An optional ‘timeout’ parameter, specifying a timeout measured in + seconds, was added to the *note ftplib.FTP: 53d. class constructor + as well as the ‘connect()’ method. (Added by Facundo Batista.) + Also, the ‘FTP’ class’s ‘storbinary()’ and ‘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(9).) + + * The ‘reduce()’ built-in function is also available in the *note + functools: 7f. module. In Python 3.0, the builtin has been dropped + and ‘reduce()’ is only available from *note functools: 7f.; + currently there are no plans to drop the builtin in the 2.x series. + (Patched by Christian Heimes; bpo-1739906(10).) + + * When possible, the *note getpass: 82. module will now use + ‘/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.) + + * The *note glob.glob(): 3f8. function can now return Unicode + filenames if a Unicode path was used and Unicode filenames are + matched within the directory. (bpo-1001604(11)) + + * A new function in the *note heapq: 89. module, ‘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: + + >>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16])) + [1, 2, 3, 5, 8, 9, 16] + + Another new function, ‘heappushpop(heap, item)’, pushes `item' onto + `heap', then pops off and returns the smallest item. This is more + efficient than making a call to ‘heappush()’ and then ‘heappop()’. + + *note heapq: 89. is now implemented to only use less-than + comparison, instead of the less-than-or-equal comparison it + previously used. This makes *note heapq: 89.’s usage of a type + match the *note list.sort(): 834. method. (Contributed by Raymond + Hettinger.) + + * An optional ‘timeout’ parameter, specifying a timeout measured in + seconds, was added to the ‘httplib.HTTPConnection’ and + ‘HTTPSConnection’ class constructors. (Added by Facundo Batista.) + + * Most of the *note inspect: 9e. module’s functions, such as + ‘getmoduleinfo()’ and ‘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 ‘isgenerator()’, + ‘isgeneratorfunction()’, and ‘isabstract()’. + + * The *note itertools: a1. module gained several new functions. + + ‘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: + + >>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5])) + ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5)) + + ‘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. + + >>> 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)] + + 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: + + >>> 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)] + + With two iterables, `2N'-tuples are returned. + + >>> 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)] + + ‘combinations(iterable, r)’ returns sub-sequences of length `r' + from the elements of `iterable'. + + >>> 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')] + + ‘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. + + >>> 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)] + + ‘itertools.chain(*iterables)’ is an existing function in *note + itertools: a1. that gained a new constructor in Python 2.6. + ‘itertools.chain.from_iterable(iterable)’ takes a single iterable + that should return other iterables. ‘chain()’ will then return all + the elements of the first iterable, then all the elements of the + second, and so on. + + >>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]])) + [1, 2, 3, 4, 5, 6] + + (All contributed by Raymond Hettinger.) + + * The *note logging: a8. module’s ‘FileHandler’ class and its + subclasses ‘WatchedFileHandler’, ‘RotatingFileHandler’, and + ‘TimedRotatingFileHandler’ now have an optional `delay' parameter + to their constructors. If `delay' is true, opening of the log file + is deferred until the first ‘emit()’ call is made. (Contributed by + Vinay Sajip.) + + ‘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. + + * Several new functions were added to the *note math: af. module: + + * *note isinf(): 103d. and *note isnan(): 103e. determine + whether a given float is a (positive or negative) infinity or + a NaN (Not a Number), respectively. + + * *note copysign(): 103f. copies the sign bit of an IEEE 754 + number, returning the absolute value of `x' combined with the + sign bit of `y'. For example, ‘math.copysign(1, -0.0)’ + returns -1.0. (Contributed by Christian Heimes.) + + * *note factorial(): 58f. computes the factorial of a number. + (Contributed by Raymond Hettinger; bpo-2138(12).) + + * *note fsum(): 1040. 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(13).) + + * *note acosh(): 1041, *note asinh(): 1042. and *note atanh(): + 1043. compute the inverse hyperbolic functions. + + * *note log1p(): 1044. returns the natural logarithm of `1+x' + (base `e'). + + * ‘trunc()’ rounds a number toward zero, returning the closest + ‘Integral’ that’s between the function’s argument and zero. + Added as part of the backport of *note PEP 3141’s type + hierarchy for numbers: f6c. + + * The *note math: af. 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, ‘sqrt(-1.)’ + should now give a *note ValueError: 1c8. across almost all + platforms, while ‘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 *note + ValueError: 1c8. Where Annex ‘F’ of the C99 standard recommends + signaling ‘overflow’, Python will raise *note OverflowError: 4a4. + (See bpo-711019(14) and bpo-1640(15).) + + (Contributed by Christian Heimes and Mark Dickinson.) + + * *note mmap: 64e. objects now have a ‘rfind()’ method that searches + for a substring beginning at the end of the string and searching + backwards. The ‘find()’ method also gained an `end' parameter + giving an index at which to stop searching. (Contributed by John + Lenton.) + + * The *note operator: c0. module gained a ‘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: + + >>> # 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' + + (Contributed by Georg Brandl, after a suggestion by Gregory + Petrosyan.) + + The ‘attrgetter()’ function now accepts dotted names and performs + the corresponding attribute lookups: + + >>> inst_name = operator.attrgetter( + ... '__class__.__name__') + >>> inst_name('') + 'str' + >>> inst_name(help) + '_Helper' + + (Contributed by Georg Brandl, after a suggestion by Barry Warsaw.) + + * The *note os: c2. module now wraps several new system calls. + ‘fchmod(fd, mode)’ and ‘fchown(fd, uid, gid)’ change the mode and + ownership of an opened file, and ‘lchmod(path, mode)’ changes the + mode of a symlink. (Contributed by Georg Brandl and Christian + Heimes.) + + ‘chflags()’ and ‘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 *note stat: + f1. module; some possible values include ‘UF_IMMUTABLE’ to signal + the file may not be changed and ‘UF_APPEND’ to indicate that data + can only be appended to the file. (Contributed by M. Levinson.) + + ‘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 *note subprocess: f6. + module to make starting processes faster. (Contributed by Georg + Brandl; bpo-1663329(16).) + + * The ‘os.environ’ object’s ‘clear()’ method will now unset the + environment variables using *note os.unsetenv(): 563. in addition + to clearing the object’s keys. (Contributed by Martin Horcicka; + bpo-1181(17).) + + * The *note os.walk(): a00. function now has a ‘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(18)) + + * In the *note os.path: c3. module, the ‘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, ‘os.path.splitext('.ipython')’ now returns ‘('.ipython', + '')’ instead of ‘('', '.ipython')’. (bpo-1115886(19)) + + A new function, ‘os.path.relpath(path, start='.')’, returns a + relative path from the ‘start’ path, if it’s supplied, or from the + current working directory to the destination ‘path’. (Contributed + by Richard Barran; bpo-1339796(20).) + + On Windows, *note os.path.expandvars(): 1045. 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(21).) + + * The Python debugger provided by the *note pdb: c6. 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(22).) + + * The *note pdb.post_mortem(): 1046. function, used to begin + debugging a traceback, will now use the traceback returned by *note + sys.exc_info(): 25b. if no traceback is supplied. (Contributed by + Facundo Batista; bpo-1106316(23).) + + * The *note pickletools: c8. module now has an ‘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.) + + * A ‘get_data()’ function was added to the *note pkgutil: ca. module + that returns the contents of resource files included with an + installed Python package. For example: + + >>> import pkgutil + >>> print pkgutil.get_data('test', 'exception_hierarchy.txt') + BaseException + +-- SystemExit + +-- KeyboardInterrupt + +-- GeneratorExit + +-- Exception + +-- StopIteration + +-- StandardError + ... + + (Contributed by Paul Moore; bpo-2439(24).) + + * The ‘pyexpat’ module’s ‘Parser’ objects now allow setting their + ‘buffer_size’ attribute to change the size of the buffer used to + hold character data. (Contributed by Achim Gaedke; bpo-1137(25).) + + * The ‘Queue’ module now provides queue variants that retrieve + entries in different orders. The ‘PriorityQueue’ class stores + queued items in a heap and retrieves them in priority order, and + ‘LifoQueue’ retrieves the most recently added entries first, + meaning that it behaves like a stack. (Contributed by Raymond + Hettinger.) + + * The *note random: d9. module’s ‘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 + ‘Random’ objects can’t be unpickled correctly on earlier versions + of Python. (Contributed by Shawn Ligocki; bpo-1727780(26).) + + The new ‘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(27).) + + * Long regular expression searches carried out by the *note re: da. + module will check for signals being delivered, so time-consuming + searches can now be interrupted. (Contributed by Josh Hoyt and + Ralf Schmitt; bpo-846388(28).) + + 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(29).) + + * The *note rlcompleter: de. module’s ‘Completer.complete()’ method + will now ignore exceptions triggered while evaluating a name. + (Fixed by Lorenz Quack; bpo-2250(30).) + + * The *note sched: e0. module’s ‘scheduler’ instances now have a + read-only *note queue: d7. attribute that returns the contents of + the scheduler’s queue, represented as a list of named tuples with + the fields ‘(time, priority, action, argument)’. (Contributed by + Raymond Hettinger; bpo-1861(31).) + + * The *note select: e2. module now has wrapper functions for the + Linux ‘epoll()’ and BSD ‘kqueue()’ system calls. ‘modify()’ method + was added to the existing ‘poll’ objects; ‘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(32).) + + * The *note shutil.copytree(): 675. 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 *note shutil: e6. module also provides an ‘ignore_patterns()’ + function for use with this new parameter. ‘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 ‘.svn’ directories and Emacs backup files, which + have names ending with ‘~’: + + shutil.copytree('Doc/library', '/tmp/library', + ignore=shutil.ignore_patterns('*~', '.svn')) + + (Contributed by Tarek Ziadé; bpo-2663(33).) + + * 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 *note signal: e7. + module can now make this more efficient. Calling + ‘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, *note PySignal_SetWakeupFd(): + 1047, 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 ‘set_wakeup_fd()’, and the readable + descriptor will be added to the list of descriptors monitored by + the event loop via ‘select()’ or ‘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(34).) + + The ‘siginterrupt()’ function is now available from Python code, + and allows changing whether signals can interrupt system calls or + not. (Contributed by Ralf Schmitt.) + + The ‘setitimer()’ and ‘getitimer()’ functions have also been added + (where they’re available). ‘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(35).) + + * The *note smtplib: ea. module now supports SMTP over SSL thanks to + the addition of the ‘SMTP_SSL’ class. This class supports an + interface identical to the existing ‘SMTP’ class. (Contributed by + Monty Taylor.) Both class constructors also have an optional + ‘timeout’ parameter that specifies a timeout for the initial + connection attempt, measured in seconds. (Contributed by Facundo + Batista.) + + An implementation of the LMTP protocol ( RFC 2033(36)) 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(37).) + + ‘SMTP.starttls()’ now complies with RFC 3207(38) and forgets any + knowledge obtained from the server not obtained from the TLS + negotiation itself. (Patch contributed by Bill Fenner; + bpo-829951(39).) + + * The *note socket: ec. module now supports TIPC + (‘http://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(40).) + + A new function, ‘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 ‘create_connection()’ instead of + ‘socket(socket.AF_INET, ...)’ may be all that’s required to make + your code work with IPv6. + + * The base classes in the ‘SocketServer’ module now support calling a + ‘handle_timeout()’ method after a span of inactivity specified by + the server’s ‘timeout’ attribute. (Contributed by Michael + Pomraning.) The ‘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(41), bpo-1193577(42).) + + * The *note sqlite3: ef. module, maintained by Gerhard Häring, has + been updated from version 2.3.2 in Python 2.5 to version 2.4.1. + + * The *note struct: f5. module now supports the C99 _Bool type, using + the format character ‘'?'’. (Contributed by David Remahl.) + + * The ‘Popen’ objects provided by the *note subprocess: f6. module + now have ‘terminate()’, ‘kill()’, and ‘send_signal()’ methods. On + Windows, ‘send_signal()’ only supports the ‘SIGTERM’ signal, and + all these methods are aliases for the Win32 API function + ‘TerminateProcess()’. (Contributed by Christian Heimes.) + + * A new variable in the *note sys: f9. module, ‘float_info’, is an + object containing information derived from the ‘float.h’ file about + the platform’s floating-point support. Attributes of this object + include ‘mant_dig’ (number of digits in the mantissa), ‘epsilon’ + (smallest difference between 1.0 and the next largest value + representable), and several others. (Contributed by Christian + Heimes; bpo-1534(43).) + + Another new variable, ‘dont_write_bytecode’, controls whether + Python writes any ‘.pyc’ or ‘.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 *note -B: + 103a. switch to the Python interpreter, or by setting the *note + PYTHONDONTWRITEBYTECODE: 103b. 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 ‘sys.flags’. For example, the ‘verbose’ attribute is + true if Python was executed in verbose mode, ‘debug’ is true in + debugging mode, etc. These attributes are all read-only. + (Contributed by Christian Heimes.) + + A new function, ‘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 ‘__sizeof__()’ method to return the object’s + size. (Contributed by Robert Schuppenies; bpo-2898(44).) + + It’s now possible to determine the current profiler and tracer + functions by calling *note sys.getprofile(): 1048. and *note + sys.gettrace(): 1049. (Contributed by Georg Brandl; bpo-1648(45).) + + * The *note tarfile: fd. 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 ‘format’ parameter to open a file using a + different format: + + tar = tarfile.open("output.tar", "w", + format=tarfile.PAX_FORMAT) + + The new ‘encoding’ and ‘errors’ parameters specify an encoding and + an error handling scheme for character conversions. ‘'strict'’, + ‘'ignore'’, and ‘'replace'’ are the three standard ways Python can + handle errors,; ‘'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 ‘TarFile.add()’ method now accepts an ‘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 ‘add()’ + and to the names of files in recursively added directories. + + (All changes contributed by Lars Gustäbel). + + * An optional ‘timeout’ parameter was added to the *note + telnetlib.Telnet: 957. class constructor, specifying a timeout + measured in seconds. (Added by Facundo Batista.) + + * The *note tempfile.NamedTemporaryFile: 104a. class usually deletes + the temporary file it created when the file is closed. This + behaviour can now be changed by passing ‘delete=False’ to the + constructor. (Contributed by Damien Miller; bpo-1537850(46).) + + A new class, ‘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 ‘NamedTemporaryFile’ and ‘SpooledTemporaryFile’ classes both + work as context managers, so you can write ‘with + tempfile.NamedTemporaryFile() as tmp: ...’. (Contributed by + Alexander Belopolsky; bpo-2021(47).) + + * The ‘test.test_support’ module gained a number of context managers + useful for writing tests. ‘EnvironmentVarGuard()’ is a context + manager that temporarily changes environment variables and + automatically restores them to their old values. + + Another context manager, ‘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: + + with test_support.TransientResource(IOError, + errno=errno.ETIMEDOUT): + f = urllib.urlopen('https://sf.net') + ... + + Finally, ‘check_warnings()’ resets the ‘warning’ module’s warning + filters and returns an object that will record all warning messages + triggered (bpo-3781(48)): + + 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" + + (Contributed by Brett Cannon.) + + * The *note textwrap: 10a. module can now preserve existing + whitespace at the beginnings and ends of the newly created lines by + specifying ‘drop_whitespace=False’ as an argument: + + >>> 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. + >>> + + (Contributed by Dwayne Bailey; bpo-1581073(49).) + + * The *note threading: 10b. module API is being changed to use + properties such as ‘daemon’ instead of ‘setDaemon()’ and + ‘isDaemon()’ methods, and some methods have been renamed to use + underscores instead of camel-case; for example, the ‘activeCount()’ + method is renamed to ‘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 *note threading: 10b. module’s ‘Thread’ objects gained an + ‘ident’ property that returns the thread’s identifier, a nonzero + integer. (Contributed by Gregory P. Smith; bpo-2871(50).) + + * The *note timeit: 10d. 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 ‘Timer’ instances: + ‘repeat(stmt, setup, time, repeat, number)’ and ‘timeit(stmt, + setup, time, number)’ create an instance and call the corresponding + method. (Contributed by Erik Demaine; bpo-1533909(51).) + + * The ‘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(52).) + + * The *note turtle: 120. module for turtle graphics was greatly + enhanced by Gregor Lingl. New features in the module include: + + * Better animation of turtle movement and rotation. + + * Control over turtle movement using the new ‘delay()’, + ‘tracer()’, and ‘speed()’ methods. + + * The ability to set new shapes for the turtle, and to define a + new coordinate system. + + * Turtles now have an ‘undo()’ method that can roll back + actions. + + * Simple support for reacting to input events such as mouse and + keyboard activity, making it possible to write simple games. + + * A ‘turtle.cfg’ file can be used to customize the starting + appearance of the turtle’s screen. + + * The module’s docstrings can be replaced by new docstrings that + have been translated into another language. + + (bpo-1513695(53)) + + * An optional ‘timeout’ parameter was added to the ‘urllib.urlopen()’ + function and the ‘urllib.ftpwrapper’ class constructor, as well as + the ‘urllib2.urlopen()’ function. The parameter specifies a + timeout measured in seconds. For example: + + >>> u = urllib2.urlopen("http://slow.example.com", + timeout=3) + Traceback (most recent call last): + ... + urllib2.URLError: + >>> + + (Added by Facundo Batista.) + + * The Unicode database provided by the *note unicodedata: 124. module + has been updated to version 5.1.0. (Updated by Martin von Löwis; + bpo-3811(54).) + + * The *note warnings: 130. module’s ‘formatwarning()’ and + ‘showwarning()’ gained an optional `line' argument that can be used + to supply the line of source code. (Added as part of + bpo-1631171(55), which re-implemented part of the *note warnings: + 130. module in C code.) + + A new function, ‘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(56)). + + * The XML-RPC ‘SimpleXMLRPCServer’ and ‘DocXMLRPCServer’ classes can + now be prevented from immediately opening and binding to their + socket by passing ‘False’ as the `bind_and_activate' constructor + parameter. This can be used to modify the instance’s + ‘allow_reuse_address’ attribute before calling the ‘server_bind()’ + and ‘server_activate()’ methods to open the socket and begin + listening for connections. (Contributed by Peter Parente; + bpo-1599845(57).) + + ‘SimpleXMLRPCServer’ also has a ‘_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.) + + * The ‘xmlrpclib’ module no longer automatically converts *note + datetime.date: 536. and *note datetime.time: 4bf. to the + ‘xmlrpclib.DateTime’ type; the conversion semantics were not + necessarily correct for all applications. Code using ‘xmlrpclib’ + should convert ‘date’ and *note time: 4bf. instances. + (bpo-1330538(58)) The code can also handle dates before 1900 + (contributed by Ralf Schmitt; bpo-2014(59)) and 64-bit integers + represented by using ‘’ in XML-RPC responses (contributed by + Riku Lindblad; bpo-2985(60)). + + * The *note zipfile: 14d. module’s ‘ZipFile’ class now has + ‘extract()’ and ‘extractall()’ methods that will unpack a single + file or all the files in the archive to the current directory, or + to a specified directory: + + 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() + + (Contributed by Alan McIntyre; bpo-467924(61).) + + The *note open(): 30b, ‘read()’ and ‘extract()’ methods can now + take either a filename or a ‘ZipInfo’ object. This is useful when + an archive accidentally contains a duplicated filename. + (Contributed by Graham Horler; bpo-1775025(62).) + + Finally, *note zipfile: 14d. now supports using Unicode filenames + for archived files. (Contributed by Alexey Borzenkov; + bpo-1734346(63).) + +* 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:: + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1736190 + + (2) https://www.jcea.es/programacion/pybsddb.htm + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1817 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=600362 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=1381 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1638033 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=1158 + + (8) http://speleotrove.com/decimal/decarith.html + + (9) https://bugs.python.org/issue?@action=redirect&bpo=1221598 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=1739906 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1001604 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=2138 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=2819 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=711019 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=1640 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=1663329 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=1181 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=1273829 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=1115886 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=1339796 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=957650 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=1393667 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=1106316 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=2439 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=1137 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=1727780 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=1681432 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=846388 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=3487 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=2250 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=1861 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=1657 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=2663 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=1583 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=2240 + + (36) https://datatracker.ietf.org/doc/html/rfc2033.html + + (37) https://bugs.python.org/issue?@action=redirect&bpo=957003 + + (38) https://datatracker.ietf.org/doc/html/rfc3207.html + + (39) https://bugs.python.org/issue?@action=redirect&bpo=829951 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=1646 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=742598 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=1193577 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=1534 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=2898 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=1648 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=1537850 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=2021 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=3781 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=1581073 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=2871 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=1533909 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=2906 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=1513695 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=3811 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=1631171 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=3781 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=1599845 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=1330538 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=2014 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=2985 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=467924 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=1775025 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=1734346 + + +File: python.info, Node: The ast module, Next: The future_builtins module, Up: New and Improved Modules<2> + +1.14.18.1 The ‘ast’ module +.......................... + +The *note ast: 7. 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 ‘parse()’ function takes an expression and returns an AST. The +‘dump()’ function outputs a representation of a tree, suitable for +debugging: + + import ast + + t = ast.parse(""" + d = {} + for i in 'abcdefghijklm': + d[i + i] = ord(i) - ord('a') + 1 + print d + """) + print ast.dump(t) + +This outputs a deeply nested tree: + + 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) + ]) + +The ‘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 *note eval(): 4a7. call, ‘literal_eval()’ will +handle it safely: + + >>> 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 + +The module also includes ‘NodeVisitor’ and ‘NodeTransformer’ classes for +traversing and modifying an AST, and functions for common +transformations such as changing line numbers. + + +File: python.info, Node: The future_builtins module, Next: The json module JavaScript Object Notation, Prev: The ast module, Up: New and Improved Modules<2> + +1.14.18.2 The ‘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 ‘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: + + * ‘ascii(obj)’: equivalent to *note repr(): 3ee. In Python 3.0, + *note repr(): 3ee. will return a Unicode string, while *note + ascii(): 104d. will return a pure ASCII bytestring. + + * ‘filter(predicate, iterable)’, ‘map(func, iterable1, ...)’: the 3.0 + versions return iterators, unlike the 2.x builtins which return + lists. + + * ‘hex(value)’, ‘oct(value)’: instead of calling the ‘__hex__()’ or + ‘__oct__()’ methods, these versions will call the ‘__index__()’ + method and convert the result to hexadecimal or octal. *note + oct(): f77. will use the new ‘0o’ notation for its result. + + +File: python.info, Node: The json module JavaScript Object Notation, Next: The plistlib module A Property-List Parser, Prev: The future_builtins module, Up: New and Improved Modules<2> + +1.14.18.3 The ‘json’ module: JavaScript Object Notation +....................................................... + +The new *note json: a2. 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 ‘http://www.json.org’. + +*note json: a2. comes with support for decoding and encoding most +built-in Python types. The following example encodes and decodes a +dictionary: + + >>> 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} + +It’s also possible to write your own decoders and encoders to support +more types. Pretty-printing of the JSON strings is also supported. + +*note json: a2. (originally called simplejson) was written by Bob +Ippolito. + + +File: python.info, Node: The plistlib module A Property-List Parser, Next: ctypes Enhancements, Prev: The json module JavaScript Object Notation, Up: New and Improved Modules<2> + +1.14.18.4 The ‘plistlib’ module: A Property-List Parser +....................................................... + +The ‘.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 *note plistlib: cc. module has +been promoted to the standard library. + +Using the module is simple: + + import sys + import plistlib + import datetime + + # Create data structure + data_struct = dict(lastAccessed=datetime.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) + + +File: python.info, Node: ctypes Enhancements, Next: Improved SSL Support, Prev: The plistlib module A Property-List Parser, Up: New and Improved Modules<2> + +1.14.18.5 ctypes Enhancements +............................. + +Thomas Heller continued to maintain and enhance the *note ctypes: 29. +module. + +*note ctypes: 29. now supports a ‘c_bool’ datatype that represents the +C99 ‘bool’ type. (Contributed by David Remahl; bpo-1649190(1).) + +The *note ctypes: 29. string, buffer and array types have improved +support for extended slicing syntax, where various combinations of +‘(start, stop, step)’ are supplied. (Implemented by Thomas Wouters.) + +All *note ctypes: 29. data types now support ‘from_buffer()’ and +‘from_buffer_copy()’ methods that create a ctypes instance based on a +provided buffer object. ‘from_buffer_copy()’ copies the contents of the +object, while ‘from_buffer()’ will share the same memory area. + +A new calling convention tells *note ctypes: 29. to clear the ‘errno’ or +Win32 LastError variables at the outset of each wrapped call. +(Implemented by Thomas Heller; bpo-1798(2).) + +You can now retrieve the Unix ‘errno’ variable after a function call. +When creating a wrapped function, you can supply ‘use_errno=True’ as a +keyword parameter to the ‘DLL()’ function and then call the module-level +methods ‘set_errno()’ and ‘get_errno()’ to set and retrieve the error +value. + +The Win32 LastError variable is similarly supported by the ‘DLL()’, +‘OleDLL()’, and ‘WinDLL()’ functions. You supply ‘use_last_error=True’ +as a keyword parameter and then call the module-level methods +‘set_last_error()’ and ‘get_last_error()’. + +The ‘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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1649190 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1798 + + +File: python.info, Node: Improved SSL Support, Prev: ctypes Enhancements, Up: New and Improved Modules<2> + +1.14.18.6 Improved SSL Support +.............................. + +Bill Janssen made extensive improvements to Python 2.6’s support for the +Secure Sockets Layer by adding a new module, *note ssl: f0, that’s built +atop the OpenSSL(1) 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 *note socket: ec. 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 *note ssl.wrap_socket(): 490. +function. It’s possible to specify whether a certificate is required, +and to obtain certificate info by calling the ‘getpeercert()’ method. + +See also +........ + +The documentation for the *note ssl: f0. module. + + ---------- Footnotes ---------- + + (1) https://www.openssl.org/ + + +File: python.info, Node: Deprecations and Removals, Next: Build and C API Changes<9>, Prev: New and Improved Modules<2>, Up: What’s New in Python 2 6 + +1.14.19 Deprecations and Removals +--------------------------------- + + * String exceptions have been removed. Attempting to use them raises + a *note TypeError: 19c. + + * Changes to the *note Exception: 61c. interface as dictated by PEP + 352(1) continue to be made. For 2.6, the ‘message’ attribute is + being deprecated in favor of the ‘args’ attribute. + + * (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: ‘audiodev’, ‘bgenlocations’, + ‘buildtools’, ‘bundlebuilder’, ‘Canvas’, ‘compiler’, ‘dircache’, + ‘dl’, ‘fpformat’, ‘gensuitemodule’, ‘ihooks’, ‘imageop’, ‘imgfile’, + ‘linuxaudiodev’, ‘mhlib’, ‘mimetools’, ‘multifile’, ‘new’, ‘pure’, + ‘statvfs’, ‘sunaudiodev’, ‘test.testall’, and ‘toaiff’. + + * The ‘gopherlib’ module has been removed. + + * The ‘MimeWriter’ module and ‘mimify’ module have been deprecated; + use the *note email: 64. package instead. + + * The ‘md5’ module has been deprecated; use the *note hashlib: 88. + module instead. + + * The ‘posixfile’ module has been deprecated; *note fcntl.lockf(): + 1053. provides better locking. + + * The ‘popen2’ module has been deprecated; use the *note subprocess: + f6. module. + + * The ‘rgbimg’ module has been removed. + + * The ‘sets’ module has been deprecated; it’s better to use the + built-in *note set: 1a6. and *note frozenset: 1a7. types. + + * The ‘sha’ module has been deprecated; use the *note hashlib: 88. + module instead. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0352/ + + +File: python.info, Node: Build and C API Changes<9>, Next: Porting to Python 2 6, Prev: Deprecations and Removals, Up: What’s New in Python 2 6 + +1.14.20 Build and C API Changes +------------------------------- + +Changes to Python’s build process and to the C API include: + + * Python now must be compiled with C89 compilers (after 19 years!). + This means that the Python source tree has dropped its own + implementations of ‘memmove()’ and ‘strerror()’, which are in the + C89 standard library. + + * Python 2.6 can be built with Microsoft Visual Studio 2008 (version + 9.0), and this is the new default compiler. See the ‘PCbuild’ + directory for the build files. (Implemented by Christian Heimes.) + + * On Mac OS X, Python 2.6 can be compiled as a 4-way universal build. + The ‘configure’ script can take a + ‘--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.) + + * The BerkeleyDB module now has a C API object, available as + ‘bsddb.db.api’. This object can be used by other C extensions that + wish to use the ‘bsddb’ module for their own purposes. + (Contributed by Duncan Grisby.) + + * The new buffer interface, previously described in *note the PEP + 3118 section: 102a, adds *note PyObject_GetBuffer(): 329. and *note + PyBuffer_Release(): 331, as well as a few other functions. + + * 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 + ‘PyFile_IncUseCount()’ and ‘PyFile_DecUseCount()’ functions. File + objects can’t be closed unless the reference count is zero. + ‘PyFile_IncUseCount()’ should be called while the GIL is still + held, before carrying out an I/O operation using the ‘FILE *’ + pointer, and ‘PyFile_DecUseCount()’ should be called immediately + after the GIL is re-acquired. (Contributed by Antoine Pitrou and + Gregory P. Smith.) + + * Importing modules simultaneously in two different threads no longer + deadlocks; it will now raise an *note ImportError: 511. A new API + function, *note PyImport_ImportModuleNoBlock(): d2b, will look for + a module in ‘sys.modules’ first, then try to import it after + acquiring an import lock. If the import lock is held by another + thread, an *note ImportError: 511. is raised. (Contributed by + Christian Heimes.) + + * Several functions return information about the platform’s + floating-point support. *note PyFloat_GetMax(): 1055. returns the + maximum representable floating point value, and *note + PyFloat_GetMin(): 1056. returns the minimum positive value. *note + PyFloat_GetInfo(): 1057. returns an object containing more + information from the ‘float.h’ file, such as ‘"mant_dig"’ (number + of digits in the mantissa), ‘"epsilon"’ (smallest difference + between 1.0 and the next largest value representable), and several + others. (Contributed by Christian Heimes; bpo-1534(1).) + + * C functions and methods that use *note PyComplex_AsCComplex(): + 1058. will now accept arguments that have a ‘__complex__()’ method. + In particular, the functions in the *note cmath: 17. module will + now accept objects with this method. This is a backport of a + Python 3.0 change. (Contributed by Mark Dickinson; + bpo-1675423(2).) + + * Python’s C API now includes two functions for case-insensitive + string comparisons, ‘PyOS_stricmp(char*, char*)’ and + ‘PyOS_strnicmp(char*, char*, Py_ssize_t)’. (Contributed by + Christian Heimes; bpo-1635(3).) + + * Many C extensions define their own little macro for adding integers + and strings to the module’s dictionary in the ‘init*’ function. + Python 2.6 finally defines standard macros for adding values to a + module, *note PyModule_AddStringMacro: 1059. and *note + PyModule_AddIntMacro(): 105a. (Contributed by Christian Heimes.) + + * Some macros were renamed in both 3.0 and 2.6 to make it clearer + that they are macros, not functions. ‘Py_Size()’ became *note + Py_SIZE(): 357, ‘Py_Type()’ became *note Py_TYPE(): 355, and + ‘Py_Refcnt()’ became *note Py_REFCNT(): 4dc. The mixed-case macros + are still available in Python 2.6 for backward compatibility. + (bpo-1629(4)) + + * 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(5).) + + * 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 ‘free_list’, the counter is always named + ‘numfree’, and a macro ‘Py_MAXFREELIST’ is always + defined. + + * A new Makefile target, “make patchcheck”, prepares the Python + source tree for making a patch: it fixes trailing whitespace in all + modified ‘.py’ files, checks whether the documentation has been + changed, and reports whether the ‘Misc/ACKS’ and ‘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.) + +* 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1534 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1675423 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1635 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1629 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=1530959 + + +File: python.info, Node: Port-Specific Changes Windows<2>, Next: Port-Specific Changes Mac OS X<2>, Up: Build and C API Changes<9> + +1.14.20.1 Port-Specific Changes: Windows +........................................ + + * The support for Windows 95, 98, ME and NT4 has been dropped. + Python 2.6 requires at least Windows 2000 SP4. + + * 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 + ‘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.) + + * The *note msvcrt: b4. module now supports both the normal and wide + char variants of the console I/O API. The ‘getwch()’ function reads + a keypress and returns a Unicode value, as does the ‘getwche()’ + function. The ‘putwch()’ function takes a Unicode character and + writes it to the console. (Contributed by Christian Heimes.) + + * *note os.path.expandvars(): 1045. 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(1).) + + * The *note socket: ec. module’s socket objects now have an ‘ioctl()’ + method that provides a limited interface to the ‘WSAIoctl()’ system + interface. + + * The ‘_winreg’ module now has a function, + ‘ExpandEnvironmentStrings()’, that expands environment variable + references such as ‘%NAME%’ in an input string. The handle objects + provided by this module now support the context protocol, so they + can be used in *note with: 19e. statements. (Contributed by + Christian Heimes.) + + ‘_winreg’ also has better support for x64 systems, exposing the + ‘DisableReflectionKey()’, ‘EnableReflectionKey()’, and + ‘QueryReflectionKey()’ functions, which enable and disable registry + reflection for 32-bit processes running on 64-bit systems. + (bpo-1753245(2)) + + * The *note msilib: b3. module’s ‘Record’ object gained + ‘GetInteger()’ and ‘GetString()’ methods that return field values + as an integer or a string. (Contributed by Floris Bruynooghe; + bpo-2125(3).) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=957650 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1753245 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=2125 + + +File: python.info, Node: Port-Specific Changes Mac OS X<2>, Next: Port-Specific Changes IRIX, Prev: Port-Specific Changes Windows<2>, Up: Build and C API Changes<9> + +1.14.20.2 Port-Specific Changes: Mac OS X +......................................... + + * When compiling a framework build of Python, you can now specify the + framework name to be used by providing the ‘--with-framework-name=’ + option to the ‘configure’ script. + + * The ‘macfs’ module has been removed. This in turn required the + ‘macostools.touched()’ function to be removed because it depended + on the ‘macfs’ module. (bpo-1490190(1)) + + * Many other Mac OS modules have been deprecated and will be removed + in Python 3.0: ‘_builtinSuites’, ‘aepack’, ‘aetools’, ‘aetypes’, + ‘applesingle’, ‘appletrawmain’, ‘appletrunner’, ‘argvemulator’, + ‘Audio_mac’, ‘autoGIL’, ‘Carbon’, ‘cfmfile’, ‘CodeWarrior’, + ‘ColorPicker’, ‘EasyDialogs’, ‘Explorer’, ‘Finder’, ‘FrameWork’, + ‘findertools’, ‘ic’, ‘icglue’, ‘icopen’, ‘macerrors’, ‘MacOS’, + ‘macfs’, ‘macostools’, ‘macresource’, ‘MiniAEFrame’, ‘Nav’, + ‘Netscape’, ‘OSATerminology’, ‘pimp’, ‘PixMapWrapper’, ‘StdSuites’, + ‘SystemEvents’, ‘Terminal’, and ‘terminalcommand’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1490190 + + +File: python.info, Node: Port-Specific Changes IRIX, Prev: Port-Specific Changes Mac OS X<2>, Up: Build and C API Changes<9> + +1.14.20.3 Port-Specific Changes: IRIX +..................................... + +A number of old IRIX-specific modules were deprecated and will be +removed in Python 3.0: ‘al’ and ‘AL’, ‘cd’, ‘cddb’, ‘cdplayer’, ‘CL’ and +‘cl’, ‘DEVICE’, ‘ERRNO’, ‘FILE’, ‘FL’ and ‘fl’, ‘flp’, ‘fm’, ‘GET’, +‘GLWS’, ‘GL’ and ‘gl’, ‘IN’, ‘IOCTL’, ‘jpeg’, ‘panelparser’, ‘readcd’, +‘SV’ and ‘sv’, ‘torgb’, ‘videoreader’, and ‘WAIT’. + + +File: python.info, Node: Porting to Python 2 6, Next: Acknowledgements<2>, Prev: Build and C API Changes<9>, Up: What’s New in Python 2 6 + +1.14.21 Porting to Python 2.6 +----------------------------- + +This section lists previously described changes and other bugfixes that +may require changes to your code: + + * Classes that aren’t supposed to be hashable should set ‘__hash__ = + None’ in their definitions to indicate the fact. + + * String exceptions have been removed. Attempting to use them raises + a *note TypeError: 19c. + + * The ‘__init__()’ method of *note collections.deque: 1a9. now clears + any existing contents of the deque before adding elements from the + iterable. This change makes the behavior match ‘list.__init__()’. + + * *note object.__init__(): 105f. previously accepted arbitrary + arguments and keyword arguments, ignoring them. In Python 2.6, + this is no longer allowed and will result in a *note TypeError: + 19c. This will affect ‘__init__()’ methods that end up calling the + corresponding method on *note object: 6df. (perhaps through using + *note super(): 8b7.). See bpo-1683368(1) for discussion. + + * The ‘Decimal’ constructor now accepts leading and trailing + whitespace when passed a string. Previously it would raise an + ‘InvalidOperation’ exception. On the other hand, the + ‘create_decimal()’ method of ‘Context’ objects now explicitly + disallows extra whitespace, raising a ‘ConversionSyntax’ exception. + + * Due to an implementation accident, if you passed a file path to the + built-in *note __import__(): 510. 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 *note ImportError: 511. + + * C API: the *note PyImport_Import(): 1060. and *note + PyImport_ImportModule(): 4ac. functions now default to absolute + imports, not relative imports. This will affect C extensions that + import other modules. + + * C API: extension data types that shouldn’t be hashable should + define their ‘tp_hash’ slot to *note PyObject_HashNotImplemented(): + 1034. + + * The *note socket: ec. module exception *note socket.error: d05. now + inherits from *note IOError: d02. Previously it wasn’t a subclass + of ‘StandardError’ but now it is, through *note IOError: d02. + (Implemented by Gregory P. Smith; bpo-1706815(2).) + + * The ‘xmlrpclib’ module no longer automatically converts *note + datetime.date: 536. and *note datetime.time: 4bf. to the + ‘xmlrpclib.DateTime’ type; the conversion semantics were not + necessarily correct for all applications. Code using ‘xmlrpclib’ + should convert ‘date’ and *note time: 4bf. instances. + (bpo-1330538(3)) + + * (3.0-warning mode) The *note Exception: 61c. class now warns when + accessed using slicing or index access; having *note Exception: + 61c. behave like a tuple is being phased out. + + * (3.0-warning mode) inequality comparisons between two dictionaries + or two objects that don’t implement comparison methods are reported + as warnings. ‘dict1 == dict2’ still works, but ‘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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1683368 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1706815 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1330538 + + +File: python.info, Node: Acknowledgements<2>, Prev: Porting to Python 2 6, Up: What’s New in Python 2 6 + +1.14.22 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. + + +File: python.info, Node: What’s New in Python 2 5, Next: What’s New in Python 2 4, Prev: What’s New in Python 2 6, Up: What’s New in Python + +1.15 What’s New in Python 2.5 +============================= + + +Author: A.M. Kuchling + +This article explains the new features in Python 2.5. The final release +of Python 2.5 is scheduled for August 2006; PEP 356(1) 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 +(‘xml.etree’), the SQLite database module (‘sqlite’), and the *note +ctypes: 29. 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 *note PEP 308; Conditional +Expressions: 1065. The new ‘*note with: 19e.’ statement will make +writing cleanup code easier (section *note PEP 343; The ‘with’ +statement: 1066.). Values can now be passed into generators (section +*note PEP 342; New Generator Features: 1067.). Imports are now visible +as either absolute or relative (section *note PEP 328; Absolute and +Relative Imports: 1068.). Some corner cases of exception handling are +handled better (section *note PEP 341; Unified try/except/finally: +1069.). 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 ‘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. + +* 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<14>. +* New, Improved, 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>. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0356/ + + +File: python.info, Node: PEP 308 Conditional Expressions, Next: PEP 309 Partial Function Application, Up: What’s New in Python 2 5 + +1.15.1 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: + + if condition: + x = true_value + else: + x = false_value + +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 +‘cond ? true_v : false_v’, ‘if cond then true_v else false_v’, and 16 +other variations. + +Guido van Rossum eventually chose a surprising syntax: + + x = true_value if condition else false_value + +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 ‘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: + + contents = ((doc + '\n') if doc else '') + +I read the above statement as meaning “here `contents' is usually +assigned a value of ‘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: + + # First version -- no parens + level = 1 if logging else 0 + + # Second version -- with parens + level = (1 if logging else 0) + +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 PEP 308(1) for some examples. If you put parentheses +around your conditional expressions, you won’t run into this case. + +See also +........ + +PEP 308(2) - Conditional Expressions + + PEP written by Guido van Rossum and Raymond D. Hettinger; + implemented by Thomas Wouters. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0308/ + + (2) https://peps.python.org/pep-0308/ + + +File: python.info, Node: PEP 309 Partial Function Application, Next: PEP 314 Metadata for Python Software Packages v1 1, Prev: PEP 308 Conditional Expressions, Up: What’s New in Python 2 5 + +1.15.2 PEP 309: Partial Function Application +-------------------------------------------- + +The *note functools: 7f. module is intended to contain tools for +functional-style programming. + +One useful tool in this module is the ‘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 ‘f(a, b, c)’; you +could create a new function ‘g(b, c)’ that was equivalent to ‘f(1, b, +c)’. This is called “partial function application”. + +‘partial()’ takes the arguments ‘(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: + + 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') + +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 ‘open_item()’ method, where the first argument has been provided. + + ... + 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) ) + +Another function in the *note functools: 7f. module is the +‘update_wrapper(wrapper, wrapped)’ function that helps you write +well-behaved decorators. ‘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: + + def my_decorator(f): + def wrapper(*args, **kwds): + print 'Calling decorated function' + return f(*args, **kwds) + functools.update_wrapper(wrapper, f) + return wrapper + +‘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: + + def my_decorator(f): + @functools.wraps(f) + def wrapper(*args, **kwds): + print 'Calling decorated function' + return f(*args, **kwds) + return wrapper + +See also +........ + +PEP 309(1) - Partial Function Application + + PEP proposed and written by Peter Harris; implemented by Hye-Shik + Chang and Nick Coghlan, with adaptations by Raymond Hettinger. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0309/ + + +File: python.info, Node: PEP 314 Metadata for Python Software Packages v1 1, Next: PEP 328 Absolute and Relative Imports, Prev: PEP 309 Partial Function Application, Up: What’s New in Python 2 5 + +1.15.3 PEP 314: Metadata for Python Software Packages v1.1 +---------------------------------------------------------- + +Some simple dependency support was added to Distutils. The ‘setup()’ +function now has ‘requires’, ‘provides’, and ‘obsoletes’ keyword +parameters. When you build a source distribution using the ‘sdist’ +command, the dependency information will be recorded in the ‘PKG-INFO’ +file. + +Another new keyword parameter is ‘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. + + 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), + ) + +Another new enhancement to the Python package index at +‘https://pypi.org’ is storing source and binary archives for a package. +The new ‘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 ‘sdist’ Distutils command. Once that works, you +can run ‘python setup.py upload’ to add your package to the PyPI +archive. Optionally you can GPG-sign the package by supplying the +‘--sign’ and ‘--identity’ options. + +Package uploading was implemented by Martin von Löwis and Richard Jones. + +See also +........ + +PEP 314(1) - 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0314/ + + +File: python.info, Node: PEP 328 Absolute and Relative Imports, Next: PEP 338 Executing Modules as Scripts, Prev: PEP 314 Metadata for Python Software Packages v1 1, Up: What’s New in Python 2 5 + +1.15.4 PEP 328: Absolute and Relative Imports +--------------------------------------------- + +The simpler part of PEP 328(1) was implemented in Python 2.4: +parentheses could now be used to enclose the names imported from a +module using the ‘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: + + pkg/ + pkg/__init__.py + pkg/main.py + pkg/string.py + +This defines a package named ‘pkg’ containing the ‘pkg.main’ and +‘pkg.string’ submodules. + +Consider the code in the ‘main.py’ module. What happens if it executes +the statement ‘import string’? In Python 2.4 and earlier, it will first +look in the package’s directory to perform a relative import, finds +‘pkg/string.py’, imports the contents of that file as the ‘pkg.string’ +module, and that module is bound to the name ‘string’ in the ‘pkg.main’ +module’s namespace. + +That’s fine if ‘pkg.string’ was what you wanted. But what if you wanted +Python’s standard *note string: f3. module? There’s no clean way to +ignore ‘pkg.string’ and look for the standard module; generally you had +to look at the contents of ‘sys.modules’, which is slightly unclean. +Holger Krekel’s ‘py.std’ package provides a tidier way to perform +imports from the standard library, ‘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, *note string: f3. +or ‘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 *note import: 1af.’s behaviour to absolute +imports using a ‘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, +‘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 ‘from pkg import string’ +in your code. + +Relative imports are still possible by adding a leading period to the +module name when using the ‘from ... import’ form: + + # Import names from pkg.string + from .string import name1, name2 + # Import pkg.string + from . import string + +This imports the *note string: f3. module relative to the current +package, so in ‘pkg.main’ this will import `name1' and `name2' from +‘pkg.string’. Additional leading periods perform the relative import +starting from the parent of the current package. For example, code in +the ‘A.B.C’ module can do: + + from . import D # Imports A.B.D + from .. import E # Imports A.E + from ..F import G # Imports A.F.G + +Leading periods cannot be used with the ‘import modname’ form of the +import statement, only the ‘from ... import’ form. + +See also +........ + +PEP 328(2) - Imports: Multi-Line and Absolute/Relative + + PEP written by Aahz; implemented by Thomas Wouters. + +‘https://pylib.readthedocs.io/’ + + The py library by Holger Krekel, which contains the ‘py.std’ + package. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0328/ + + (2) https://peps.python.org/pep-0328/ + + +File: python.info, Node: PEP 338 Executing Modules as Scripts, Next: PEP 341 Unified try/except/finally, Prev: PEP 328 Absolute and Relative Imports, Up: What’s New in Python 2 5 + +1.15.5 PEP 338: Executing Modules as Scripts +-------------------------------------------- + +The *note -m: 1ae. 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, *note runpy: df. + +The *note runpy: df. module implements a more sophisticated import +mechanism so that it’s now possible to run modules in a package such as +‘pychecker.checker’. The module also supports alternative import +mechanisms such as the *note zipimport: 14e. module. This means you can +add a .zip archive’s path to ‘sys.path’ and then use the *note -m: 1ae. +switch to execute code from the archive. + +See also +........ + +PEP 338(1) - Executing modules as scripts + + PEP written and implemented by Nick Coghlan. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0338/ + + +File: python.info, Node: PEP 341 Unified try/except/finally, Next: PEP 342 New Generator Features, Prev: PEP 338 Executing Modules as Scripts, Up: What’s New in Python 2 5 + +1.15.6 PEP 341: Unified try/except/finally +------------------------------------------ + +Until Python 2.5, the *note try: 1073. statement came in two flavours. +You could use a *note finally: 60a. block to ensure that code is always +executed, or one or more *note except: 17a. blocks to catch specific +exceptions. You couldn’t combine both ‘except’ blocks and a ‘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 *note except: 17a. blocks and a *note +finally: 60a. block, and this clarified what the statement should mean. +In Python 2.5, you can now write: + + try: + block-1 ... + except Exception1: + handler-1 ... + except Exception2: + handler-2 ... + else: + else-block + finally: + final-block + +The code in `block-1' is executed. If the code raises an exception, the +various *note except: 17a. blocks are tested: if the exception is of +class ‘Exception1’, `handler-1' is executed; otherwise if it’s of class +‘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. + +See also +........ + +PEP 341(1) - Unifying try-except and try-finally + + PEP written by Georg Brandl; implementation by Thomas Lee. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0341/ + + +File: python.info, Node: PEP 342 New Generator Features, Next: PEP 343 The ‘with’ statement<2>, Prev: PEP 341 Unified try/except/finally, Up: What’s New in Python 2 5 + +1.15.7 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: + + def counter (maximum): + i = 0 + while i < maximum: + yield i + i += 1 + +When you call ‘counter(10)’, the result is an iterator that returns the +values from 0 up to 9. On encountering the *note yield: 60d. 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 *note next(): 3c7. method, picking up +after the ‘yield’ statement. + +In Python 2.3, *note yield: 60d. was a statement; it didn’t return any +value. In 2.5, ‘yield’ is now an expression, returning a value that can +be assigned to a variable or otherwise operated on: + + val = (yield i) + +I recommend that you always put parentheses around a *note yield: 60d. +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. + +( PEP 342(1) explains the exact rules, which are that a *note yield: +60d.-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 ‘val = yield i’ but have to use parentheses when +there’s an operation, as in ‘val = (yield i) + 12’.) + +Values are sent into a generator by calling its ‘send(value)’ method. +The generator’s code is then resumed and the *note yield: 60d. +expression returns the specified `value'. If the regular *note next(): +3c7. method is called, the ‘yield’ returns *note None: 243. + +Here’s the previous example, modified to allow changing the value of the +internal counter. + + 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 + +And here’s an example of changing the counter: + + >>> 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 + +*note yield: 60d. will usually return *note None: 243, so you should +always check for this case. Don’t just use its value in expressions +unless you’re sure that the ‘send()’ method will be the only method used +to resume your generator function. + +In addition to ‘send()’, there are two other new methods on generators: + + * ‘throw(type, value=None, traceback=None)’ is used to raise an + exception inside the generator; the exception is raised by the + *note yield: 60d. expression where the generator’s execution is + paused. + + * ‘close()’ raises a new *note GeneratorExit: 1035. exception inside + the generator to terminate the iteration. On receiving this + exception, the generator’s code must either raise *note + GeneratorExit: 1035. or *note StopIteration: 865. Catching the + *note GeneratorExit: 1035. exception and returning a value is + illegal and will trigger a *note RuntimeError: 6e9.; if the + function raises some other exception, that exception is propagated + to the caller. ‘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 *note GeneratorExit: 1035. + occurs, I suggest using a ‘try: ... finally:’ suite instead of + catching *note GeneratorExit: 1035. + +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 *note return: 60e. statement), but +coroutines can be entered, exited, and resumed at many different points +(the *note yield: 60d. statements). We’ll have to figure out patterns +for using coroutines effectively in Python. + +The addition of the ‘close()’ method has one side effect that isn’t +obvious. ‘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 ‘try...finally’ +statements in generators can now be guaranteed to work; the *note +finally: 60a. clause will now always get a chance to run. The syntactic +restriction that you couldn’t mix *note yield: 60d. statements with a +‘try...finally’ suite has therefore been removed. This seems like a +minor bit of language trivia, but using generators and ‘try...finally’ +is actually necessary in order to implement the *note with: 19e. +statement described by PEP 343(2). I’ll look at this new statement in +the following section. + +Another even more esoteric effect of this change: previously, the +‘gi_frame’ attribute of a generator was always a frame object. It’s now +possible for ‘gi_frame’ to be ‘None’ once the generator has been +exhausted. + +See also +........ + +PEP 342(3) - 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 PEP 288(4) by + Raymond Hettinger and PEP 325(5) by Samuele Pedroni. + +‘https://en.wikipedia.org/wiki/Coroutine’ + + The Wikipedia entry for coroutines. + +‘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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0342/ + + (2) https://peps.python.org/pep-0343/ + + (3) https://peps.python.org/pep-0342/ + + (4) https://peps.python.org/pep-0288/ + + (5) https://peps.python.org/pep-0325/ + + +File: python.info, Node: PEP 343 The ‘with’ statement<2>, Next: PEP 352 Exceptions as New-Style Classes, Prev: PEP 342 New Generator Features, Up: What’s New in Python 2 5 + +1.15.8 PEP 343: The ‘with’ statement +------------------------------------ + +The ‘*note with: 19e.’ statement clarifies code that previously would +use ‘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 ‘*note with: 19e.’ statement is a new control-flow structure whose +basic structure is: + + with expression [as variable]: + with-block + +The expression is evaluated, and it should result in an object that +supports the context management protocol (that is, has ‘__enter__()’ and +‘__exit__()’ methods. + +The object’s ‘__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 +‘__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: + + from __future__ import with_statement + +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 ‘*note with: 19e.’ statement. File objects are +one example: + + with open('/etc/passwd', 'r') as f: + for line in f: + print line + ... more processing code ... + +After this statement has executed, the file object in `f' will have been +automatically closed, even if the *note for: 199. loop raised an +exception part-way through the block. + + Note: In this case, `f' is the same object created by *note open(): + 30b, because ‘file.__enter__()’ returns `self'. + +The *note threading: 10b. module’s locks and condition variables also +support the ‘*note with: 19e.’ statement: + + lock = threading.Lock() + with lock: + # Critical section of code + ... + +The lock is acquired before the block is executed and always released +once the block is complete. + +The new ‘localcontext()’ function in the *note decimal: 34. module makes +it easy to save and restore the current decimal context, which +encapsulates the desired precision and rounding characteristics for +computations: + + 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() + +* Menu: + +* Writing Context Managers: Writing Context Managers<2>. +* The contextlib module: The contextlib module<2>. + + +File: python.info, Node: Writing Context Managers<2>, Next: The contextlib module<2>, Up: PEP 343 The ‘with’ statement<2> + +1.15.8.1 Writing Context Managers +................................. + +Under the hood, the ‘*note with: 19e.’ statement is fairly complicated. +Most people will only use ‘‘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: + + * The expression is evaluated and should result in an object called a + “context manager”. The context manager must have ‘__enter__()’ and + ‘__exit__()’ methods. + + * The context manager’s ‘__enter__()’ method is called. The value + returned is assigned to `VAR'. If no ‘'as VAR'’ clause is present, + the value is simply discarded. + + * The code in `BLOCK' is executed. + + * If `BLOCK' raises an exception, the ‘__exit__(type, value, + traceback)’ is called with the exception details, the same values + returned by *note sys.exc_info(): 25b. The method’s return value + controls whether the exception is re-raised: any false value + re-raises the exception, and ‘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 ‘*note with: 19e.’ + statement will never realize anything went wrong. + + * If `BLOCK' didn’t raise an exception, the ‘__exit__()’ method is + still called, but `type', `value', and `traceback' are all ‘None’. + +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: + + db_connection = DatabaseConnection() + with db_connection as cursor: + cursor.execute('insert into ...') + cursor.execute('delete from ...') + # ... more operations ... + +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 ‘DatabaseConnection’ that I’ll assume: + + 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" + +The ‘__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 +‘as cursor’ to their ‘*note with: 19e.’ statement to bind the cursor to +a variable name. + + class DatabaseConnection: + ... + def __enter__ (self): + # Code to start a new transaction + cursor = self.cursor() + return cursor + +The ‘__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 ‘None’. ‘None’ is false, so the +exception will be re-raised automatically. If you wished, you could be +more explicit and add a *note return: 60e. statement at the marked +location. + + 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 + + +File: python.info, Node: The contextlib module<2>, Prev: Writing Context Managers<2>, Up: PEP 343 The ‘with’ statement<2> + +1.15.8.2 The contextlib module +.............................. + +The new *note contextlib: 22. module provides some functions and a +decorator that are useful for writing objects for use with the ‘*note +with: 19e.’ statement. + +The decorator is called ‘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 *note yield: 60d. +will be executed as the ‘__enter__()’ method, and the value yielded will +be the method’s return value that will get bound to the variable in the +‘*note with: 19e.’ statement’s ‘as’ clause, if any. The code after the +*note yield: 60d. will be executed in the ‘__exit__()’ method. Any +exception raised in the block will be raised by the ‘yield’ statement. + +Our database example from the previous section could be written using +this decorator as: + + 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: + ... + +The *note contextlib: 22. module also has a ‘nested(mgr1, mgr2, ...)’ +function that combines a number of context managers so you don’t need to +write nested ‘*note with: 19e.’ statements. In this example, the single +‘‘with’’ statement both starts a database transaction and acquires a +thread lock: + + lock = threading.Lock() + with nested (db_transaction(db), lock) as (cursor, locked): + ... + +Finally, the ‘closing(object)’ function returns `object' so that it can +be bound to a variable, and calls ‘object.close’ at the end of the +block. + + 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) + +See also +........ + +PEP 343(1) - 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 ‘*note with: 19e.’ statement, which can be + helpful in learning how the statement works. + +The documentation for the *note contextlib: 22. module. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0343/ + + +File: python.info, Node: PEP 352 Exceptions as New-Style Classes, Next: PEP 353 Using ssize_t as the index type, Prev: PEP 343 The ‘with’ statement<2>, Up: What’s New in Python 2 5 + +1.15.9 PEP 352: Exceptions as New-Style Classes +----------------------------------------------- + +Exception classes can now be new-style classes, not just classic +classes, and the built-in *note Exception: 61c. class and all the +standard built-in exceptions (*note NameError: 396, *note ValueError: +1c8, etc.) are now new-style classes. + +The inheritance hierarchy for exceptions has been rearranged a bit. In +2.5, the inheritance relationships are: + + BaseException # New in Python 2.5 + |- KeyboardInterrupt + |- SystemExit + |- Exception + |- (all other current built-in exceptions) + +This rearrangement was done because people often want to catch all +exceptions that indicate program errors. *note KeyboardInterrupt: 611. +and *note SystemExit: 9b6. aren’t errors, though, and usually represent +an explicit action such as the user hitting ‘Control-C’ or code calling +*note sys.exit(): fec. A bare ‘except:’ will catch all exceptions, so +you commonly need to list *note KeyboardInterrupt: 611. and *note +SystemExit: 9b6. in order to re-raise them. The usual pattern is: + + try: + ... + except (KeyboardInterrupt, SystemExit): + raise + except: + # Log error... + # Continue running program... + +In Python 2.5, you can now write ‘except Exception’ to achieve the same +result, catching all the exceptions that usually indicate errors but +leaving *note KeyboardInterrupt: 611. and *note SystemExit: 9b6. alone. +As in previous versions, a bare ‘except:’ still catches all exceptions. + +The goal for Python 3.0 is to require any class raised as an exception +to derive from *note BaseException: 17d. or some descendant of *note +BaseException: 17d, 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 *note Exception: 61c. now. It’s +been suggested that the bare ‘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 ‘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. + +See also +........ + +PEP 352(1) - Required Superclass for Exceptions + + PEP written by Brett Cannon and Guido van Rossum; implemented by + Brett Cannon. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0352/ + + +File: python.info, Node: PEP 353 Using ssize_t as the index type, Next: PEP 357 The ‘__index__’ method, Prev: PEP 352 Exceptions as New-Style Classes, Up: What’s New in Python 2 5 + +1.15.10 PEP 353: Using ssize_t as the index type +------------------------------------------------ + +A wide-ranging change to Python’s C API, using a new *note Py_ssize_t: +6b1. 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 ‘2**31 - 1’ = 2147483647 items. (There are actually a few different +programming models that 64-bit C compilers can use – see +‘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 *note PyObject: 4cf. 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 +*note Py_ssize_t: 6b1. to store their size. Functions such as *note +PyList_Size(): 107e. now return *note Py_ssize_t: 6b1. Code in +extension modules may therefore need to have some variables changed to +*note Py_ssize_t: 6b1. + +The *note PyArg_ParseTuple(): 4d9. and *note Py_BuildValue(): 4da. +functions have a new conversion code, ‘n’, for *note Py_ssize_t: 6b1. +*note PyArg_ParseTuple(): 4d9.’s ‘s#’ and ‘t#’ still output int by +default, but you can define the macro ‘PY_SSIZE_T_CLEAN’ before +including ‘Python.h’ to make them return *note Py_ssize_t: 6b1. + +PEP 353(1) has a section on conversion guidelines that extension authors +should read to learn about supporting 64-bit platforms. + +See also +........ + +PEP 353(2) - Using ssize_t as the index type + + PEP written and implemented by Martin von Löwis. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0353/ + + (2) https://peps.python.org/pep-0353/ + + +File: python.info, Node: PEP 357 The ‘__index__’ method, Next: Other Language Changes<14>, Prev: PEP 353 Using ssize_t as the index type, Up: What’s New in Python 2 5 + +1.15.11 PEP 357: The ‘__index__’ method +--------------------------------------- + +The NumPy developers had a problem that could only be solved by adding a +new special method, ‘__index__()’. When using slice notation, as in +‘[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 ‘__int__()’ method because that +method is also used to implement coercion to integers. If slicing used +‘__int__()’, floating-point numbers would also become legal slice +indexes and that’s clearly an undesirable behaviour. + +Instead, a new special method called ‘__index__()’ was added. It takes +no arguments and returns an integer giving the slice index to use. For +example: + + class C: + def __index__ (self): + return self.value + +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 +*note TypeError: 19c. if this requirement isn’t met. + +A corresponding ‘nb_index’ slot was added to the C-level *note +PyNumberMethods: 1081. structure to let C extensions implement this +protocol. ‘PyNumber_Index(obj)’ can be used in extension code to call +the ‘__index__()’ function and retrieve its result. + +See also +........ + +PEP 357(1) - Allowing Any Object to be Used for Slicing + + PEP written and implemented by Travis Oliphant. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0357/ + + +File: python.info, Node: Other Language Changes<14>, Next: New Improved and Removed Modules, Prev: PEP 357 The ‘__index__’ method, Up: What’s New in Python 2 5 + +1.15.12 Other Language Changes +------------------------------ + +Here are all of the changes that Python 2.5 makes to the core Python +language. + + * The *note dict: 16e. 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 + ‘__missing__(key)’ method will be called. This hook is used to + implement the new ‘defaultdict’ class in the *note collections: 1c. + module. The following example defines a dictionary that returns + zero for any missing key: + + 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 + + * Both 8-bit and Unicode strings have new ‘partition(sep)’ and + ‘rpartition(sep)’ methods that simplify a common use case. + + The ‘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. ‘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. ‘rpartition(sep)’ also returns a 3-tuple but + starts searching from the end of the string; the ‘r’ stands for + ‘reverse’. + + Some examples: + + >>> ('http://www.python.org').partition('://') + ('http', '://', 'www.python.org') + >>> ('file:/usr/share/doc/index.html').partition('://') + ('file:/usr/share/doc/index.html', '', '') + >>> (u'Subject: a quick question').partition(':') + (u'Subject', u':', u' a quick question') + >>> 'www.python.org'.rpartition('.') + ('www.python', '.', 'org') + >>> 'www.python.org'.rpartition(':') + ('', '', 'www.python.org') + + (Implemented by Fredrik Lundh following a suggestion by Raymond + Hettinger.) + + * The ‘startswith()’ and ‘endswith()’ methods of string types now + accept tuples of strings to check for. + + def is_image_file (filename): + return filename.endswith(('.gif', '.jpg', '.tiff')) + + (Implemented by Georg Brandl following a suggestion by Tom Lynn.) + + * The *note min(): b99. and *note max(): b9a. built-in functions + gained a ‘key’ keyword parameter analogous to the ‘key’ argument + for ‘sort()’. This parameter supplies a function that takes a + single argument and is called for every value in the list; *note + min(): b99./*note max(): b9a. 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: + + L = ['medium', 'longest', 'short'] + # Prints 'longest' + print max(L, key=len) + # Prints 'short', because lexicographically 'short' has the largest value + print max(L) + + (Contributed by Steven Bethard and Raymond Hettinger.) + + * Two new built-in functions, *note any(): 1084. and *note all(): + 1085, evaluate whether an iterator contains any true or false + values. *note any(): 1084. returns *note True: 877. if any value + returned by the iterator is true; otherwise it will return *note + False: 78d. *note all(): 1085. returns *note True: 877. only if + all of the values returned by the iterator evaluate as true. + (Suggested by Guido van Rossum, and implemented by Raymond + Hettinger.) + + * The result of a class’s ‘__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 *note + id(): 1086. built-in was changed to always return non-negative + numbers, and users often seem to use ‘id(self)’ in ‘__hash__()’ + methods (though this is discouraged). + + * 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 PEP 263(1) for how to + declare a module’s encoding; for example, you might add a line like + this near the top of the source file: + + # -*- coding: latin1 -*- + + * A new warning, *note UnicodeWarning: 1087, 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: + + >>> 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 + + Previously this would raise a *note UnicodeDecodeError: 65c. + exception, but in 2.5 this could result in puzzling problems when + accessing a dictionary. If you looked up ‘unichr(128)’ and + ‘chr(128)’ was being used as a key, you’d get a *note + UnicodeDecodeError: 65c. exception. Other changes in 2.5 resulted + in this exception being raised instead of suppressed by the code in + ‘dictobject.c’ that implements dictionaries. + + Raising an exception for such a comparison is strictly correct, but + the change might have broken code, so instead *note UnicodeWarning: + 1087. was introduced. + + (Implemented by Marc-André Lemburg.) + + * One error that Python programmers sometimes make is forgetting to + include an ‘__init__.py’ module in a package directory. Debugging + this mistake can be confusing, and usually requires running Python + with the *note -v: 1088. switch to log all the paths searched. In + Python 2.5, a new *note ImportWarning: 46d. warning is triggered + when an import would have picked up a directory as a package but no + ‘__init__.py’ was found. This warning is silently ignored by + default; provide the *note -Wd: 502. option when running the Python + executable to display the warning message. (Implemented by Thomas + Wouters.) + + * The list of base classes in a class definition can now be empty. + As an example, this is now legal: + + class C(): + pass + + (Implemented by Brett Cannon.) + +* Menu: + +* Interactive Interpreter Changes:: +* Optimizations: Optimizations<13>. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0263/ + + +File: python.info, Node: Interactive Interpreter Changes, Next: Optimizations<13>, Up: Other Language Changes<14> + +1.15.12.1 Interactive Interpreter Changes +......................................... + +In the interactive interpreter, ‘quit’ and ‘exit’ have long been strings +so that new users get a somewhat helpful message when they try to quit: + + >>> quit + 'Use Ctrl-D (i.e. EOF) to exit.' + +In Python 2.5, ‘quit’ and ‘exit’ are now objects that still produce +string representations of themselves, but are also callable. Newbies +who try ‘quit()’ or ‘exit()’ will now exit the interpreter as they +expect. (Implemented by Georg Brandl.) + +The Python executable now accepts the standard long options *note –help: +1c2. and *note –version: 98e.; on Windows, it also accepts the *note /?: +108b. option for displaying a help message. (Implemented by Georg +Brandl.) + + +File: python.info, Node: Optimizations<13>, Prev: Interactive Interpreter Changes, Up: Other Language Changes<14> + +1.15.12.2 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. + + * When they were introduced in Python 2.4, the built-in *note set: + 1a6. and *note frozenset: 1a7. 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.) + + * 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.) + + * The ‘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.) + + * It’s now illegal to mix iterating over a file with ‘for line in + file’ and calling the file object’s ‘read()’/*note readline(): + db./‘readlines()’ methods. Iteration uses an internal buffer and + the ‘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 *note ValueError: 1c8. from the ‘read*()’ method. (Implemented + by Thomas Wouters.) + + * The *note struct: f5. 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.) + + * The *note re: da. module got a 1 or 2% speedup by switching to + Python’s allocator functions instead of the system’s ‘malloc()’ and + ‘free()’. (Contributed by Jack Diederich at the NeedForSpeed + sprint.) + + * The code generator’s peephole optimizer now performs simple + constant folding in expressions. If you write something like ‘a = + 2+3’, the code generator will do the arithmetic and produce code + corresponding to ‘a = 5’. (Proposed and implemented by Raymond + Hettinger.) + + * 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.) + + * 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.) + + * Importing now caches the paths tried, recording whether they exist + or not so that the interpreter makes fewer ‘open()’ and ‘stat()’ + calls on startup. (Contributed by Martin von Löwis and Georg + Brandl.) + + +File: python.info, Node: New Improved and Removed Modules, Next: Build and C API Changes<10>, Prev: Other Language Changes<14>, Up: What’s New in Python 2 5 + +1.15.13 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 ‘Misc/NEWS’ file in the +source tree for a more complete list of changes, or look through the SVN +logs for all the details. + + * The *note audioop: c. module now supports the a-LAW encoding, and + the code for u-LAW encoding has been improved. (Contributed by + Lars Immisch.) + + * The *note codecs: 1a. module gained support for incremental codecs. + The ‘codec.lookup()’ function now returns a ‘CodecInfo’ instance + instead of a tuple. ‘CodecInfo’ instances behave like a 4-tuple to + preserve backward compatibility but also have the attributes + ‘encode’, ‘decode’, ‘incrementalencoder’, ‘incrementaldecoder’, + ‘streamwriter’, and ‘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 *note codecs: 1a. module documentation for details. (Designed + and implemented by Walter Dörwald.) + + * The *note collections: 1c. module gained a new type, ‘defaultdict’, + that subclasses the standard *note dict: 16e. 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 ‘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 *note list(): 1e9. or *note + int(): 1c7. For example, you can make an index of words based on + their initial letter like this: + + 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) + + Printing ‘index’ results in the following output: + + defaultdict(, {'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']} + + (Contributed by Guido van Rossum.) + + * The ‘deque’ double-ended queue type supplied by the *note + collections: 1c. module now has a ‘remove(value)’ method that + removes the first occurrence of `value' in the queue, raising *note + ValueError: 1c8. if the value isn’t found. (Contributed by Raymond + Hettinger.) + + * New module: The *note contextlib: 22. module contains helper + functions for use with the new ‘*note with: 19e.’ statement. See + section *note The contextlib module: 1078. for more about this + module. + + * New module: The *note cProfile: 26. module is a C implementation of + the existing *note profile: d0. module that has much lower + overhead. The module’s interface is the same as *note profile: + d0.: you run ‘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 + *note profile: d0. module’s interface, will continue to be + maintained in future versions of Python. (Contributed by Armin + Rigo.) + + Also, the *note pstats: d1. 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 ‘Stats’ constructor. + (Contributed by Skip Montanaro.) + + * The *note csv: 28. 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 ‘csv.field_size_limit(new_limit)’ function; omitting + the `new_limit' argument will return the currently set limit. The + ‘reader’ class now has a ‘line_num’ attribute that counts the + number of physical lines read from the source; records can span + multiple physical lines, so ‘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.) + + * The *note datetime: 4be. class in the *note datetime: 2f. module + now has a ‘strptime(string, format)’ method for parsing date + strings, contributed by Josh Spoerri. It uses the same format + characters as *note time.strptime(): 1090. and *note + time.strftime(): e99.: + + from datetime import datetime + + ts = datetime.strptime('10:13:15 2006-03-07', + '%H:%M:%S %Y-%m-%d') + + * The ‘SequenceMatcher.get_matching_blocks()’ method in the *note + difflib: 35. 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.) + + * The *note doctest: 63. module gained a ‘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 ‘testfile()’ function and + the ‘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.) + + * The *note email: 64. package has been updated to version 4.0. + (Contributed by Barry Warsaw.) + + * The *note fileinput: 7b. module was made more flexible. Unicode + filenames are now supported, and a `mode' parameter that defaults + to ‘"r"’ was added to the *note input(): f7c. function to allow + opening files in binary or *note universal newlines: 9ae. mode. + Another new parameter, `openhook', lets you use a function other + than *note open(): 30b. to open the input files. Once you’re + iterating over the set of files, the ‘FileInput’ object’s new + ‘fileno()’ returns the file descriptor for the currently opened + file. (Contributed by Georg Brandl.) + + * In the *note gc: 80. module, the new ‘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 *note gc.collect(): + 687. function now takes an optional `generation' argument of 0, 1, + or 2 to specify which generation to collect. (Contributed by Barry + Warsaw.) + + * The ‘nsmallest()’ and ‘nlargest()’ functions in the *note heapq: + 89. module now support a ‘key’ keyword parameter similar to the one + provided by the *note min(): b99./*note max(): b9a. functions and + the ‘sort()’ methods. For 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'] + + (Contributed by Raymond Hettinger.) + + * The *note itertools.islice(): 7a5. function now accepts ‘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: + + s = slice(5) # Create slice object + itertools.islice(iterable, s.start, s.stop, s.step) + + (Contributed by Raymond Hettinger.) + + * The *note format(): 1f7. function in the *note locale: a7. module + has been modified and two new functions were added, + ‘format_string()’ and ‘currency()’. + + The *note format(): 1f7. 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 ‘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 + ‘format_string()’ function that works like *note format(): 1f7. but + also supports mixing %char specifiers with arbitrary text. + + A new ‘currency()’ function was also added that formats a number + according to the current locale’s settings. + + (Contributed by Georg Brandl.) + + * The *note mailbox: ac. module underwent a massive rewrite to add + the capability to modify mailboxes in addition to reading them. A + new set of classes that include ‘mbox’, ‘MH’, and ‘Maildir’ are + used to read mailboxes, and have an ‘add(message)’ method to add + messages, ‘remove(key)’ to remove messages, and ‘lock()’/‘unlock()’ + to lock/unlock the mailbox. The following example converts a + maildir-format mailbox into an mbox-format one: + + 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) + + (Contributed by Gregory K. Johnson. Funding was provided by + Google’s 2005 Summer of Code.) + + * New module: the *note msilib: b3. module allows creating Microsoft + Installer ‘.msi’ files and CAB files. Some support for reading the + ‘.msi’ database is also included. (Contributed by Martin von + Löwis.) + + * The *note nis: bd. module now supports accessing domains other than + the system default domain by supplying a `domain' argument to the + *note nis.match(): 1091. and *note nis.maps(): 1092. functions. + (Contributed by Ben Bell.) + + * The *note operator: c0. module’s ‘itemgetter()’ and ‘attrgetter()’ + functions now support multiple fields. A call such as + ‘operator.attrgetter('a', 'b')’ will return a function that + retrieves the ‘a’ and ‘b’ attributes. Combining this new feature + with the ‘sort()’ method’s ‘key’ parameter lets you easily sort + lists using multiple fields. (Contributed by Raymond Hettinger.) + + * The *note optparse: c1. module was updated to version 1.5.1 of the + Optik library. The ‘OptionParser’ class gained an ‘epilog’ + attribute, a string that will be printed after the help message, + and a ‘destroy()’ method to break reference cycles created by the + object. (Contributed by Greg Ward.) + + * The *note os: c2. module underwent several changes. The + ‘stat_float_times’ variable now defaults to true, meaning that + *note os.stat(): 653. will now return time values as floats. (This + doesn’t necessarily mean that *note os.stat(): 653. will return + times that are precise to fractions of a second; not all systems + support such precision.) + + Constants named *note os.SEEK_SET: 1093, *note os.SEEK_CUR: 1094, + and *note os.SEEK_END: 1095. have been added; these are the + parameters to the *note os.lseek(): dc2. function. Two new + constants for locking are *note os.O_SHLOCK: 1096. and *note + os.O_EXLOCK: 1097. + + Two new functions, ‘wait3()’ and ‘wait4()’, were added. They’re + similar the ‘waitpid()’ function which waits for a child process to + exit and returns a tuple of the process ID and its exit status, but + ‘wait3()’ and ‘wait4()’ return additional information. ‘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 *note + resource.getrusage(): 1098. function. ‘wait4(pid)’ does take a + process ID. (Contributed by Chad J. Schroeder.) + + On FreeBSD, the *note os.stat(): 653. function now returns times + with nanosecond resolution, and the returned object now has + ‘st_gen’ and ‘st_birthtime’. The ‘st_flags’ attribute is also + available, if the platform supports it. (Contributed by Antti + Louko and Diego Pettenò.) + + * The Python debugger provided by the *note pdb: c6. module can now + store lists of commands to execute when a breakpoint is reached and + execution stops. Once breakpoint #1 has been created, enter + ‘commands 1’ and enter a series of commands to be executed, + finishing the list with ‘end’. The command list can include + commands that resume execution, such as ‘continue’ or ‘next’. + (Contributed by Grégoire Dooms.) + + * The *note pickle: c7. and ‘cPickle’ modules no longer accept a + return value of ‘None’ from the ‘__reduce__()’ method; the method + must return a tuple of arguments instead. The ability to return + ‘None’ was deprecated in Python 2.4, so this completes the removal + of the feature. + + * The *note pkgutil: ca. module, containing various utility functions + for finding packages, was enhanced to support PEP 302(1)’s import + hooks and now also works for packages stored in ZIP-format + archives. (Contributed by Phillip J. Eby.) + + * The pybench benchmark suite by Marc-André Lemburg is now included + in the ‘Tools/pybench’ directory. The pybench suite is an + improvement on the commonly used ‘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 ‘pystone.py’ does. + + * The ‘pyexpat’ module now uses version 2.0 of the Expat parser. + (Contributed by Trent Mick.) + + * The *note Queue: 101f. class provided by the ‘Queue’ module gained + two new methods. ‘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, + ‘task_done()’, to signal that processing for an item has been + completed. (Contributed by Raymond Hettinger.) + + * The old ‘regex’ and ‘regsub’ modules, which have been deprecated + ever since Python 2.0, have finally been deleted. Other deleted + modules: ‘statcache’, ‘tzparse’, ‘whrandom’. + + * Also deleted: the ‘lib-old’ directory, which includes ancient + modules such as ‘dircmp’ and ‘ni’, was removed. ‘lib-old’ wasn’t + on the default ‘sys.path’, so unless your programs explicitly added + the directory to ‘sys.path’, this removal shouldn’t affect your + code. + + * The *note rlcompleter: de. module is no longer dependent on + importing the *note readline: db. module and therefore now works on + non-Unix platforms. (Patch from Robert Kiendl.) + + * The ‘SimpleXMLRPCServer’ and ‘DocXMLRPCServer’ classes now have a + ‘rpc_paths’ attribute that constrains XML-RPC operations to a + limited set of URL paths; the default is to allow only ‘'/'’ and + ‘'/RPC2'’. Setting ‘rpc_paths’ to ‘None’ or an empty tuple + disables this path checking. + + * The *note socket: ec. module now supports ‘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 + ‘https://www.linuxjournal.com/article/7356’. In Python code, + netlink addresses are represented as a tuple of 2 integers, ‘(pid, + group_mask)’. + + Two new methods on socket objects, ‘recv_into(buffer)’ and + ‘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 ‘getfamily()’, ‘gettype()’, and + ‘getproto()’ accessor methods to retrieve the family, type, and + protocol values for the socket. + + * New module: the *note spwd: ee. module provides functions for + accessing the shadow password database on systems that support + shadow passwords. + + * The *note struct: f5. is now faster because it compiles format + strings into ‘Struct’ objects with ‘pack()’ and ‘unpack()’ methods. + This is similar to how the *note re: da. module lets you create + compiled regular expression objects. You can still use the + module-level ‘pack()’ and ‘unpack()’ functions; they’ll create + ‘Struct’ objects and cache them. Or you can use ‘Struct’ instances + directly: + + s = struct.Struct('ih3s') + + data = s.pack(1972, 187, 'abc') + year, number, name = s.unpack(data) + + You can also pack and unpack data to and from buffer objects + directly using the ‘pack_into(buffer, offset, v1, v2, ...)’ and + ‘unpack_from(buffer, offset)’ methods. This lets you store data + directly into an array or a memory-mapped file. + + (‘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.) + + * The Python developers switched from CVS to Subversion during the + 2.5 development process. Information about the exact build version + is available as the ‘sys.subversion’ variable, a 3-tuple of + ‘(interpreter-name, branch-name, revision-range)’. For example, at + the time of writing my copy of 2.5 was reporting ‘('CPython', + 'trunk', '45313:45315')’. + + This information is also available to C extensions via the *note + Py_GetBuildInfo(): 1099. function that returns a string of build + information like this: ‘"trunk:45355:45356M, Apr 13 2006, + 07:42:19"’. (Contributed by Barry Warsaw.) + + * Another new function, *note sys._current_frames(): 109a, 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.) + + * The ‘TarFile’ class in the *note tarfile: fd. module now has an + ‘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 ‘'r|*'’. (Contributed by Lars + Gustäbel.) + + * The *note threading: 10b. module now lets you set the stack size + used when new threads are created. The ‘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.) + + * The *note unicodedata: 124. 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 *note + unicodedata.ucd_3_2_0: 109b. + + * New module: the *note uuid: 12e. module generates universally + unique identifiers (UUIDs) according to RFC 4122(2). The RFC + defines several different UUID versions that are generated from a + starting string, from system properties, or purely randomly. This + module contains a ‘UUID’ class and functions named ‘uuid1()’, + ‘uuid3()’, ‘uuid4()’, and ‘uuid5()’ to generate different versions + of UUID. (Version 2 UUIDs are not specified in RFC 4122(3) and are + not supported by this module.) + + >>> 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') + + (Contributed by Ka-Ping Yee.) + + * The *note weakref: 132. module’s ‘WeakKeyDictionary’ and + ‘WeakValueDictionary’ types gained new methods for iterating over + the weak references contained in the dictionary. ‘iterkeyrefs()’ + and ‘keyrefs()’ methods were added to ‘WeakKeyDictionary’, and + ‘itervaluerefs()’ and ‘valuerefs()’ were added to + ‘WeakValueDictionary’. (Contributed by Fred L. Drake, Jr.) + + * The *note webbrowser: 133. module received a number of + enhancements. It’s now usable as a script with ‘python -m + webbrowser’, taking a URL as the argument; there are a number of + switches to control the behaviour (‘-n’ for a new browser window, + ‘-t’ for a new tab). New module-level functions, ‘open_new()’ and + ‘open_new_tab()’, were added to support this. The module’s *note + open(): 30b. 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.) + + * The ‘xmlrpclib’ module now supports returning *note datetime: 4be. + objects for the XML-RPC date type. Supply ‘use_datetime=True’ to + the ‘loads()’ function or the ‘Unmarshaller’ class to enable this + feature. (Contributed by Skip Montanaro.) + + * The *note zipfile: 14d. 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.) + + * The *note zlib: 14f. module’s ‘Compress’ and ‘Decompress’ objects + now support a *note copy(): 24. method that makes a copy of the + object’s internal state and returns a new ‘Compress’ or + ‘Decompress’ object. (Contributed by Chris AtLee.) + +* Menu: + +* The ctypes package:: +* The ElementTree package:: +* The hashlib package:: +* The sqlite3 package:: +* The wsgiref package:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0302/ + + (2) https://datatracker.ietf.org/doc/html/rfc4122.html + + (3) https://datatracker.ietf.org/doc/html/rfc4122.html + + +File: python.info, Node: The ctypes package, Next: The ElementTree package, Up: New Improved and Removed Modules + +1.15.13.1 The ctypes package +............................ + +The *note ctypes: 29. package, written by Thomas Heller, has been added +to the standard library. *note ctypes: 29. lets you call arbitrary +functions in shared libraries or DLLs. Long-time users may remember the +‘dl’ module, which provides functions for loading shared libraries and +calling functions in them. The *note ctypes: 29. package is much +fancier. + +To load a shared library or DLL, you must create an instance of the +‘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 ‘CDLL’ object. + + import ctypes + + libc = ctypes.CDLL('libc.so.6') + result = libc.printf("Line of output\n") + +Type constructors for the various C types are provided: ‘c_int()’, +‘c_float()’, ‘c_double()’, ‘c_char_p()’ (equivalent to char*), and so +forth. Unlike Python’s types, the C versions are all mutable; you can +assign to their ‘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 ‘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 ‘create_string_buffer()’: + + s = "this is a string" + buf = ctypes.create_string_buffer(s) + libc.strfry(buf) + +C functions are assumed to return integers, but you can set the +‘restype’ attribute of the function object to change this: + + >>> libc.atof('2.71828') + -1783957616 + >>> libc.atof.restype = ctypes.c_double + >>> libc.atof('2.71828') + 2.71828 + +*note ctypes: 29. also provides a wrapper for Python’s C API as the +‘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 ‘py_object()’ +type constructor that will create a *note PyObject: 4cf.* pointer. A +simple usage: + + import ctypes + + d = {} + ctypes.pythonapi.PyObject_SetItem(ctypes.py_object(d), + ctypes.py_object("abc"), ctypes.py_object(1)) + # d is now {'abc', 1}. + +Don’t forget to use ‘py_object()’; if it’s omitted you end up with a +segmentation fault. + +*note ctypes: 29. has been around for a while, but people still write +and distribution hand-coded extension modules because you can’t rely on +*note ctypes: 29. being present. Perhaps developers will begin to write +Python wrappers atop a library accessed through *note ctypes: 29. +instead of extension modules, now that *note ctypes: 29. is included +with core Python. + +See also +........ + +‘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. + +The documentation for the *note ctypes: 29. module. + + +File: python.info, Node: The ElementTree package, Next: The hashlib package, Prev: The ctypes package, Up: New Improved and Removed Modules + +1.15.13.2 The ElementTree package +................................. + +A subset of Fredrik Lundh’s ElementTree library for processing XML has +been added to the standard library as ‘xml.etree’. The available +modules are ‘ElementTree’, ‘ElementPath’, and ‘ElementInclude’ from +ElementTree 1.2.6. The ‘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 +‘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 ‘text’ and ‘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 ‘TextNode’.) + +The most commonly used parsing function is ‘parse()’, that takes either +a string (assumed to contain a filename) or a file-like object and +returns an ‘ElementTree’ instance: + + 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) + +Once you have an ‘ElementTree’ instance, you can call its ‘getroot()’ +method to get the root ‘Element’ node. + +There’s also an ‘XML()’ function that takes a string literal and returns +an ‘Element’ node (not an ‘ElementTree’). This function provides a tidy +way to incorporate XML fragments, approaching the convenience of an XML +literal: + + svg = ET.XML(""" + """) + svg.set('height', '320px') + svg.append(elem1) + +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. + +Operation Result + +------------------------------------------------------------------------------------- + +‘elem[n]’ Returns n’th child element. + + +‘elem[m:n]’ Returns list of m’th through n’th child + elements. + + +‘len(elem)’ Returns number of child elements. + + +‘list(elem)’ Returns list of child elements. + + +‘elem.append(elem2)’ Adds `elem2' as a child. + + +‘elem.insert(index, elem2)’ Inserts `elem2' at the specified location. + + +‘del elem[n]’ Deletes n’th child element. + + +‘elem.keys()’ Returns list of attribute names. + + +‘elem.get(name)’ Returns value of attribute `name'. + + +‘elem.set(name, value)’ Sets new value for attribute `name'. + + +‘elem.attrib’ Retrieves the dictionary containing + attributes. + + +‘del elem.attrib[name]’ Deletes attribute `name'. + + +Comments and processing instructions are also represented as ‘Element’ +nodes. To check if a node is a comment or processing instructions: + + if elem.tag is ET.Comment: + ... + elif elem.tag is ET.ProcessingInstruction: + ... + +To generate XML output, you should call the ‘ElementTree.write()’ +method. Like ‘parse()’, it can take either a string or a file-like +object: + + # Encoding is US-ASCII + tree.write('output.xml') + + # Encoding is UTF-8 + f = open('output.xml', 'w') + tree.write(f, encoding='utf-8') + +(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. + +See also +........ + +‘https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm’ + + Official documentation for ElementTree. + + +File: python.info, Node: The hashlib package, Next: The sqlite3 package, Prev: The ElementTree package, Up: New Improved and Removed Modules + +1.15.13.3 The hashlib package +............................. + +A new *note hashlib: 88. module, written by Gregory P. Smith, has been +added to replace the ‘md5’ and ‘sha’ modules. *note hashlib: 88. 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 ‘md5’ and ‘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. + + # 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 + +Once a hash object has been created, its methods are the same as before: +‘update(string)’ hashes the specified string into the current digest +state, ‘digest()’ and ‘hexdigest()’ return the digest value as a binary +string or a string of hex digits, and *note copy(): 24. returns a new +hashing object with the same digest state. + +See also +........ + +The documentation for the *note hashlib: 88. module. + + +File: python.info, Node: The sqlite3 package, Next: The wsgiref package, Prev: The hashlib package, Up: New Improved and Removed Modules + +1.15.13.4 The sqlite3 package +............................. + +The pysqlite module (‘https://www.pysqlite.org’), a wrapper for the +SQLite embedded database, has been added to the standard library under +the package name *note sqlite3: ef. + +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 PEP 249(1). + +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 ‘Connection’ object that +represents the database. Here the data will be stored in the +‘/tmp/example’ file: + + conn = sqlite3.connect('/tmp/example') + +You can also supply the special name ‘:memory:’ to create a database in +RAM. + +Once you have a ‘Connection’, you can create a ‘Cursor’ object and call +its ‘execute()’ method to perform SQL commands: + + c = conn.cursor() + + # Create table + c.execute('''create table stocks + (date text, trans text, symbol text, + qty real, price real)''') + + # Insert a row of data + c.execute("""insert into stocks + values ('2006-01-05','BUY','RHAT',100,35.14)""") + +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 ‘?’ 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 ‘execute()’ method. +(Other database modules may use a different placeholder, such as ‘%s’ or +‘:1’.) For 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) + +To retrieve data after executing a SELECT statement, you can either +treat the cursor as an iterator, call the cursor’s ‘fetchone()’ method +to retrieve a single matching row, or call ‘fetchall()’ to get a list of +the matching rows. + +This example uses the iterator form: + + >>> 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) + >>> + +For more information about the SQL dialect supported by SQLite, see +‘https://www.sqlite.org’. + +See also +........ + +‘https://www.pysqlite.org’ + + The pysqlite web page. + +‘https://www.sqlite.org’ + + The SQLite web page; the documentation describes the syntax and the + available data types for the supported SQL dialect. + +The documentation for the *note sqlite3: ef. module. + +PEP 249(2) - Database API Specification 2.0 + + PEP written by Marc-André Lemburg. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0249/ + + (2) https://peps.python.org/pep-0249/ + + +File: python.info, Node: The wsgiref package, Prev: The sqlite3 package, Up: New Improved and Removed Modules + +1.15.13.5 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 PEP 333(1). The *note wsgiref: 136. package is a reference +implementation of the WSGI specification. + +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: + + from wsgiref import simple_server + + wsgi_app = ... + + host = '' + port = 8000 + httpd = simple_server.make_server(host, port, wsgi_app) + httpd.serve_forever() + +See also +........ + +‘https://web.archive.org/web/20160331090247/http://wsgi.readthedocs.org/en/latest/’ + + A central web site for WSGI-related resources. + +PEP 333(2) - Python Web Server Gateway Interface v1.0 + + PEP written by Phillip J. Eby. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0333/ + + (2) https://peps.python.org/pep-0333/ + + +File: python.info, Node: Build and C API Changes<10>, Next: Porting to Python 2 5, Prev: New Improved and Removed Modules, Up: What’s New in Python 2 5 + +1.15.14 Build and C API Changes +------------------------------- + +Changes to Python’s build process and to the C API include: + + * 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 + PEP 347(1). + + * 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 ‘https://scan.coverity.com’ for the + statistics. + + * The largest change to the C API came from PEP 353(2), which + modifies the interpreter to use a *note Py_ssize_t: 6b1. type + definition instead of int. See the earlier section *note PEP 353; + Using ssize_t as the index type: 107c. for a discussion of this + change. + + * 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 + *note compile(): 310. built-in and specifying ‘_ast.PyCF_ONLY_AST’ + as the value of the `flags' parameter: + + from _ast import PyCF_ONLY_AST + ast = compile("""a=0 + for i in range(10): + a += i + """, "", 'exec', PyCF_ONLY_AST) + + assignment = ast.body[0] + for_loop = ast.body[1] + + No official documentation has been written for the AST code yet, + but PEP 339(3) discusses the design. To start learning about the + code, read the definition of the various AST nodes in + ‘Parser/Python.asdl’. A Python script reads this file and + generates a set of C structure definitions in + ‘Include/Python-ast.h’. The ‘PyParser_ASTFromString()’ and + ‘PyParser_ASTFromFile()’, defined in ‘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 + ‘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. + + * 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, + *note PyMem_Malloc(): 8d7, *note PyMem_Realloc(): ce1, and *note + PyMem_Free(): 10a8. are one family that allocates raw memory, while + *note PyObject_Malloc(): 8d9, *note PyObject_Realloc(): 10a9, and + *note PyObject_Free(): 8d6. are another family that’s supposed to + be used for creating Python objects. + + Previously these different families all reduced to the platform’s + ‘malloc()’ and ‘free()’ functions. This meant it didn’t matter if + you got things wrong and allocated memory with the ‘PyMem()’ + function but freed it with the *note PyObject(): 4cf. 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. + + * The built-in set types now have an official C API. Call *note + PySet_New(): 10aa. and *note PyFrozenSet_New(): 10ab. to create a + new set, *note PySet_Add(): 10ac. and *note PySet_Discard(): 10ad. + to add and remove elements, and *note PySet_Contains(): 10ae. and + *note PySet_Size(): 10af. to examine the set’s state. (Contributed + by Raymond Hettinger.) + + * C code can now obtain information about the exact revision of the + Python interpreter by calling the *note Py_GetBuildInfo(): 1099. + function that returns a string of build information like this: + ‘"trunk:45355:45356M, Apr 13 2006, 07:42:19"’. (Contributed by + Barry Warsaw.) + + * 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. ‘Py_LOCAL(type)’ declares the function as returning a value + of the specified `type' and uses a fast-calling qualifier. + ‘Py_LOCAL_INLINE(type)’ does the same thing and also requests the + function be inlined. If ‘PY_LOCAL_AGGRESSIVE()’ is defined before + ‘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.) + + * ‘PyErr_NewException(name, base, dict)’ can now accept a tuple of + base classes as its `base' argument. (Contributed by Georg + Brandl.) + + * The ‘PyErr_Warn()’ function for issuing warnings is now deprecated + in favour of ‘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 *note PyErr_WarnEx(): 10b0, 2 is the function above that, + and so forth. (Added by Neal Norwitz.) + + * 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.) + + * The ‘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: + + range = PyObject_CallFunction((PyObject*) &PyRange_Type, "lll", + start, stop, step); + +* Menu: + +* Port-Specific Changes:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0347/ + + (2) https://peps.python.org/pep-0353/ + + (3) https://peps.python.org/pep-0339/ + + +File: python.info, Node: Port-Specific Changes, Up: Build and C API Changes<10> + +1.15.14.1 Port-Specific Changes +............................... + + * MacOS X (10.3 and higher): dynamic loading of modules now uses the + ‘dlopen()’ function instead of MacOS-specific functions. + + * MacOS X: an ‘--enable-universalsdk’ switch was added to the + ‘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(1).) + + * Windows: ‘.dll’ is no longer supported as a filename extension for + extension modules. ‘.pyd’ is now the only filename extension that + will be searched for. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=2573 + + +File: python.info, Node: Porting to Python 2 5, Next: Acknowledgements<3>, Prev: Build and C API Changes<10>, Up: What’s New in Python 2 5 + +1.15.15 Porting to Python 2.5 +----------------------------- + +This section lists previously described changes that may require changes +to your code: + + * 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. + + * Previously, the ‘gi_frame’ attribute of a generator was always a + frame object. Because of the PEP 342(1) changes described in + section *note PEP 342; New Generator Features: 1067, it’s now + possible for ‘gi_frame’ to be ‘None’. + + * A new warning, *note UnicodeWarning: 1087, 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 *note UnicodeDecodeError: + 65c. exception. + + * Library: the *note csv: 28. 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. + + * Library: the *note locale: a7. module’s *note format(): 1f7. + 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. + + * Library: The *note pickle: c7. and ‘cPickle’ modules no longer + accept a return value of ‘None’ from the ‘__reduce__()’ method; the + method must return a tuple of arguments instead. The modules also + no longer accept the deprecated `bin' keyword parameter. + + * Library: The ‘SimpleXMLRPCServer’ and ‘DocXMLRPCServer’ classes now + have a ‘rpc_paths’ attribute that constrains XML-RPC operations to + a limited set of URL paths; the default is to allow only ‘'/'’ and + ‘'/RPC2'’. Setting ‘rpc_paths’ to ‘None’ or an empty tuple + disables this path checking. + + * C API: Many functions now use *note Py_ssize_t: 6b1. 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 *note PEP 353; Using + ssize_t as the index type: 107c. for a discussion of this change. + + * C API: The obmalloc changes mean that you must be careful to not + mix usage of the ‘PyMem_*’ and ‘PyObject_*’ families of functions. + Memory allocated with one family’s ‘*_Malloc’ must be freed with + the corresponding family’s ‘*_Free’ function. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0342/ + + +File: python.info, Node: Acknowledgements<3>, Prev: Porting to Python 2 5, Up: What’s New in Python 2 5 + +1.15.16 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. + + +File: python.info, Node: What’s New in Python 2 4, Next: What’s New in Python 2 3, Prev: What’s New in Python 2 5, Up: What’s New in Python + +1.16 What’s New in Python 2.4 +============================= + + +Author: A.M. Kuchling + +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. + +* 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<15>. +* New, Improved, 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>. + + +File: python.info, Node: PEP 218 Built-In Set Objects, Next: PEP 237 Unifying Long Integers and Integers, Up: What’s New in Python 2 4 + +1.16.1 PEP 218: Built-In Set Objects +------------------------------------ + +Python 2.3 introduced the ‘sets’ module. C implementations of set data +types have now been added to the Python core as two new built-in types, +‘set(iterable)’ and ‘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. + + >>> 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']) + >>> ''.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']) + +The *note frozenset(): 1a7. type is an immutable version of *note set(): +1a6. Since it is immutable and hashable, it may be used as a dictionary +key or as a member of another set. + +The ‘sets’ module remains in the standard library, and may be useful if +you wish to subclass the ‘Set’ or ‘ImmutableSet’ classes. There are +currently no plans to deprecate the module. + +See also +........ + +PEP 218(1) - Adding a Built-In Set Object Type + + Originally proposed by Greg Wilson and ultimately implemented by + Raymond Hettinger. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0218/ + + +File: python.info, Node: PEP 237 Unifying Long Integers and Integers, Next: PEP 289 Generator Expressions, Prev: PEP 218 Built-In Set Objects, Up: What’s New in Python 2 4 + +1.16.2 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 *note +FutureWarning: 73e. 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, ‘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. + +See also +........ + +PEP 237(1) - Unifying Long Integers and Integers + + Original PEP written by Moshe Zadka and GvR. The changes for 2.4 + were implemented by Kalle Svensson. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0237/ + + +File: python.info, Node: PEP 289 Generator Expressions, Next: PEP 292 Simpler String Substitutions, Prev: PEP 237 Unifying Long Integers and Integers, Up: What’s New in Python 2 4 + +1.16.3 PEP 289: Generator Expressions +------------------------------------- + +The iterator feature introduced in Python 2.2 and the *note itertools: +a1. 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: + + links = [link for link in get_all_links() if not link.followed] + for link in links: + ... + +instead of + + for link in get_all_links(): + if link.followed: + continue + ... + +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: + + links = (link for link in get_all_links() if not link.followed) + for link in links: + ... + +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: + + print sum(obj.count for obj in list_all_objects()) + +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. + +See also +........ + +PEP 289(1) - Generator Expressions + + Proposed by Raymond Hettinger and implemented by Jiwon Seo with + early efforts steered by Hye-Shik Chang. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0289/ + + +File: python.info, Node: PEP 292 Simpler String Substitutions, Next: PEP 318 Decorators for Functions and Methods, Prev: PEP 289 Generator Expressions, Up: What’s New in Python 2 4 + +1.16.4 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 ‘%’ operator: + + >>> '%(page)i: %(title)s' % {'page':2, 'title': 'The Best of Times'} + '2: The Best of Times' + +When writing the template string, it can be easy to forget the ‘i’ or +‘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” *note ValueError: 1c8, 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 ‘Template’ class to the *note string: f3. module that +uses ‘$’ to indicate a substitution: + + >>> import string + >>> t = string.Template('$page: $title') + >>> t.substitute({'page':2, 'title': 'The Best of Times'}) + '2: The Best of Times' + +If a key is missing from the dictionary, the ‘substitute()’ method will +raise a *note KeyError: 6f5. There’s also a ‘safe_substitute()’ method +that ignores missing keys: + + >>> t = string.Template('$page: $title') + >>> t.safe_substitute({'page':3}) + '3: $title' + +See also +........ + +PEP 292(1) - Simpler String Substitutions + + Written and implemented by Barry Warsaw. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0292/ + + +File: python.info, Node: PEP 318 Decorators for Functions and Methods, Next: PEP 322 Reverse Iteration, Prev: PEP 292 Simpler String Substitutions, Up: What’s New in Python 2 4 + +1.16.5 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 +*note def: 10bd. statement in the usual way, and pass the resulting +method to a *note staticmethod(): 3c8. or *note classmethod(): 18d. +function that would wrap up the function as a method of the new type. +Your code would look like this: + + class C: + def meth (cls): + ... + + meth = classmethod(meth) # Rebind name to wrapped-up class method + +If the method was very long, it would be easy to miss or forget the +*note classmethod(): 18d. 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 *note classmethod(): 18d, *note staticmethod(): 3c8, 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 ‘'@'’ character as an +indicator. Using the new syntax, the example above would be written: + + class C: + + @classmethod + def meth (cls): + ... + +The ‘@classmethod’ is shorthand for the ‘meth=classmethod(meth)’ +assignment. More generally, if you have the following: + + @A + @B + @C + def f (): + ... + +It’s equivalent to the following pre-decorator code: + + def f(): ... + f = A(B(C(f))) + +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 ‘@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: + + >>> def deco(func): + ... func.attr = 'decorated' + ... return func + ... + >>> @deco + ... def f(): pass + ... + >>> f + + >>> f.attr + 'decorated' + >>> + +As a slightly more realistic example, the following decorator checks +that the supplied argument is an integer: + + 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 + +An example in PEP 318(1) 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, ‘@A @B +@C(args)’ becomes: + + def f(): ... + _deco = C(args) + f = A(B(_deco(f))) + +Getting this right can be slightly brain-bending, but it’s not too +difficult. + +A small related change makes the ‘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. + +See also +........ + +PEP 318(2) - 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. + +‘https://wiki.python.org/moin/PythonDecoratorLibrary’ + + This Wiki page contains several examples of decorators. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0318/ + + (2) https://peps.python.org/pep-0318/ + + +File: python.info, Node: PEP 322 Reverse Iteration, Next: PEP 324 New subprocess Module, Prev: PEP 318 Decorators for Functions and Methods, Up: What’s New in Python 2 4 + +1.16.6 PEP 322: Reverse Iteration +--------------------------------- + +A new built-in function, ‘reversed(seq)’, takes a sequence and returns +an iterator that loops over the elements of the sequence in reverse +order. + + >>> for i in reversed(xrange(1,4)): + ... print i + ... + 3 + 2 + 1 + +Compared to extended slicing, such as ‘range(1,4)[::-1]’, *note +reversed(): 462. is easier to read, runs faster, and uses substantially +less memory. + +Note that *note reversed(): 462. only accepts sequences, not arbitrary +iterators. If you want to reverse an iterator, first convert it to a +list with *note list(): 1e9. + + >>> input = open('/etc/passwd', 'r') + >>> for line in reversed(list(input)): + ... print line + ... + root:*:0:0:System Administrator:/var/root:/bin/tcsh + ... + +See also +........ + +PEP 322(1) - Reverse Iteration + + Written and implemented by Raymond Hettinger. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0322/ + + +File: python.info, Node: PEP 324 New subprocess Module, Next: PEP 327 Decimal Data Type, Prev: PEP 322 Reverse Iteration, Up: What’s New in Python 2 4 + +1.16.7 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. +‘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 ‘popen2’ module offers +classes that can capture standard output and standard error from the +subprocess, but the naming is confusing. The *note subprocess: f6. +module cleans this up, providing a unified interface that offers all the +features you might need. + +Instead of ‘popen2’’s collection of classes, *note subprocess: f6. +contains a single class called ‘Popen’ whose constructor supports a +number of different keyword arguments. + + 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): + +`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 *note os.system(): 10c0. 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 ‘subprocess.PIPE’ to create +a pipe between the subprocess and the parent. + +The constructor has a number of handy options: + + * `close_fds' requests that all file descriptors be closed before + running the subprocess. + + * `cwd' specifies the working directory in which the subprocess will + be executed (defaulting to whatever the parent’s working directory + is). + + * `env' is a dictionary specifying environment variables. + + * `preexec_fn' is a function that gets called before the child is + started. + + * `universal_newlines' opens the child’s input and output using + Python’s *note universal newlines: 9ae. feature. + +Once you’ve created the ‘Popen’ instance, you can call its ‘wait()’ +method to pause until the subprocess has exited, ‘poll()’ to check if +it’s exited without pausing, or ‘communicate(data)’ to send the string +`data' to the subprocess’s standard input. ‘communicate(data)’ then +reads any data that the subprocess has sent to its standard output or +standard error, returning a tuple ‘(stdout_data, stderr_data)’. + +‘call()’ is a shortcut that passes its arguments along to the ‘Popen’ +constructor, waits for the command to complete, and returns the status +code of the subprocess. It can serve as a safer analog to *note +os.system(): 10c0.: + + sts = subprocess.call(['dpkg', '-i', '/tmp/new-package.deb']) + if sts == 0: + # Success + ... + else: + # dpkg returned an error + ... + +The command is invoked without use of the shell. If you really do want +to use the shell, you can add ‘shell=True’ as a keyword argument and +provide a string instead of a sequence: + + sts = subprocess.call('dpkg -i /tmp/new-package.deb', shell=True) + +The PEP takes various examples of shell and Python code and shows how +they’d be translated into Python code that uses *note subprocess: f6. +Reading this section of the PEP is highly recommended. + +See also +........ + +PEP 324(1) - subprocess - New process module + + Written and implemented by Peter Åstrand, with assistance from + Fredrik Lundh and others. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0324/ + + +File: python.info, Node: PEP 327 Decimal Data Type, Next: PEP 328 Multi-line Imports, Prev: PEP 324 New subprocess Module, Up: What’s New in Python 2 4 + +1.16.8 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 ‘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:: + + +File: python.info, Node: Why is Decimal needed?, Next: The Decimal type, Up: PEP 327 Decimal Data Type + +1.16.8.1 Why is Decimal needed? +............................... + +The limitations arise from the representation used for floating-point +numbers. FP numbers are made up of three components: + + * The sign, which is positive or negative. + + * The mantissa, which is a single-digit binary number followed by a + fractional part. For example, ‘1.01’ in base-2 notation is ‘1 + + 0/2 + 1/4’, or 1.25 in decimal notation. + + * The exponent, which tells where the decimal point is located in the + number represented. + +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 +‘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: + + >>> 1.1 + 1.1000000000000001 + +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 ‘Decimal’ type was created. + + +File: python.info, Node: The Decimal type, Next: The Context type, Prev: Why is Decimal needed?, Up: PEP 327 Decimal Data Type + +1.16.8.2 The ‘Decimal’ type +........................... + +A new module, *note decimal: 34, was added to Python’s standard library. +It contains two classes, ‘Decimal’ and ‘Context’. ‘Decimal’ instances +represent numbers, and ‘Context’ instances are used to wrap up various +settings such as the precision and default rounding mode. + +‘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. ‘Decimal’ instances can be created from integers or +strings: + + >>> import decimal + >>> decimal.Decimal(1972) + Decimal("1972") + >>> decimal.Decimal("1.1") + Decimal("1.1") + +You can also provide tuples containing the sign, the mantissa +represented as a tuple of decimal digits, and the exponent: + + >>> decimal.Decimal((1, (1, 4, 7, 5), -2)) + Decimal("-14.75") + +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 ‘Decimal’ +constructor: + + >>> f = 1.1 + >>> decimal.Decimal(str(f)) + Decimal("1.1") + >>> decimal.Decimal('%.12f' % f) + Decimal("1.100000000000") + +Once you have ‘Decimal’ instances, you can perform the usual +mathematical operations on them. One limitation: exponentiation +requires an integer exponent: + + >>> 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) + +You can combine ‘Decimal’ instances with integers, but not with +floating-point numbers: + + >>> 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. + >>> + +‘Decimal’ numbers can be used with the *note math: af. and *note cmath: +17. 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 ‘Decimal’. + + >>> import math, cmath + >>> d = decimal.Decimal('123456789012.345') + >>> math.sqrt(d) + 351364.18288201344 + >>> cmath.sqrt(-d) + 351364.18288201344j + +‘Decimal’ instances have a ‘sqrt()’ method that returns a ‘Decimal’, but +if you need other things such as trigonometric functions you’ll have to +implement them. + + >>> d.sqrt() + Decimal("351364.1828820134592177245001") + + +File: python.info, Node: The Context type, Prev: The Decimal type, Up: PEP 327 Decimal Data Type + +1.16.8.3 The ‘Context’ type +........................... + +Instances of the ‘Context’ class encapsulate several settings for +decimal operations: + + * ‘prec’ is the precision, the number of decimal places. + + * ‘rounding’ specifies the rounding mode. The *note decimal: 34. + module has constants for the various possibilities: ‘ROUND_DOWN’, + ‘ROUND_CEILING’, ‘ROUND_HALF_EVEN’, and various others. + + * ‘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. + +There’s a thread-local default context available by calling +‘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: + + >>> 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") + +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: + + >>> 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") + >>> + +The ‘Context’ instance also has various methods for formatting numbers +such as ‘to_eng_string()’ and ‘to_sci_string()’. + +For more information, see the documentation for the *note decimal: 34. +module, which includes a quick-start tutorial and a reference. + +See also +........ + +PEP 327(1) - Decimal Data Type + + Written by Facundo Batista and implemented by Facundo Batista, Eric + Price, Raymond Hettinger, Aahz, and Tim Peters. + +‘http://www.lahey.com/float.htm’ + + The article uses Fortran code to illustrate many of the problems + that floating-point inaccuracy can cause. + +‘http://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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0327/ + + +File: python.info, Node: PEP 328 Multi-line Imports, Next: PEP 331 Locale-Independent Float/String Conversions, Prev: PEP 327 Decimal Data Type, Up: What’s New in Python 2 4 + +1.16.9 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 ‘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: + + from SimpleXMLRPCServer import SimpleXMLRPCServer,\ + SimpleXMLRPCRequestHandler,\ + CGIXMLRPCRequestHandler,\ + resolve_dotted_attribute + +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: + + from SimpleXMLRPCServer import (SimpleXMLRPCServer, + SimpleXMLRPCRequestHandler, + CGIXMLRPCRequestHandler, + resolve_dotted_attribute) + +The PEP also proposes that all *note import: 1af. statements be absolute +imports, with a leading ‘.’ 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. + +See also +........ + +PEP 328(1) - Imports: Multi-Line and Absolute/Relative + + Written by Aahz. Multi-line imports were implemented by Dima + Dorfman. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0328/ + + +File: python.info, Node: PEP 331 Locale-Independent Float/String Conversions, Next: Other Language Changes<15>, Prev: PEP 328 Multi-line Imports, Up: What’s New in Python 2 4 + +1.16.10 PEP 331: Locale-Independent Float/String Conversions +------------------------------------------------------------ + +The *note locale: a7. 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 ‘'C'’ locale. Often +this was because the code was using the C library’s ‘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: + + * ‘PyOS_ascii_strtod(str, ptr)’ and ‘PyOS_ascii_atof(str, ptr)’ both + convert a string to a C double. + + * ‘PyOS_ascii_formatd(buffer, buf_len, format, d)’ converts a double + to an ASCII string. + +The code for these functions came from the GLib library +(‘https://developer.gnome.org/glib/stable/’), whose developers kindly +relicensed the relevant functions and donated them to the Python +Software Foundation. The *note locale: a7. module can now change the +numeric locale, letting extensions such as GTK+ produce the correct +results. + +See also +........ + +PEP 331(1) - Locale-Independent Float/String Conversions + + Written by Christian R. Reis, and implemented by Gustavo Carneiro. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0331/ + + +File: python.info, Node: Other Language Changes<15>, Next: New Improved and Deprecated Modules<3>, Prev: PEP 331 Locale-Independent Float/String Conversions, Up: What’s New in Python 2 4 + +1.16.11 Other Language Changes +------------------------------ + +Here are all of the changes that Python 2.4 makes to the core Python +language. + + * Decorators for functions and methods were added ( PEP 318(1)). + + * Built-in *note set(): 1a6. and *note frozenset(): 1a7. types were + added ( PEP 218(2)). Other new built-ins include the + ‘reversed(seq)’ function ( PEP 322(3)). + + * Generator expressions were added ( PEP 289(4)). + + * Certain numeric expressions no longer return values restricted to + 32 or 64 bits ( PEP 237(5)). + + * You can now put parentheses around the list of names in a ‘from + module import names’ statement ( PEP 328(6)). + + * The *note dict.update(): 10c8. method now accepts the same argument + forms as the *note dict: 16e. constructor. This includes any + mapping, any iterable of key/value pairs, and keyword arguments. + (Contributed by Raymond Hettinger.) + + * The string methods ‘ljust()’, ‘rjust()’, and ‘center()’ now take an + optional argument for specifying a fill character other than a + space. (Contributed by Raymond Hettinger.) + + * Strings also gained an ‘rsplit()’ method that works like the + ‘split()’ method but splits from the end of the string. + (Contributed by Sean Reifschneider.) + + >>> 'www.python.org'.split('.', 1) + ['www', 'python.org'] + 'www.python.org'.rsplit('.', 1) + ['www.python', 'org'] + + * Three keyword parameters, `cmp', `key', and `reverse', were added + to the ‘sort()’ method of lists. These parameters make some common + usages of ‘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 ‘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: + + >>> 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'] + + 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 ‘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 + ‘lower()’ method. + + For simple key functions and comparison functions, it is often + possible to avoid a *note lambda: f4b. expression by using an + unbound method instead. For example, the above case-insensitive + sort is best written as: + + >>> L.sort(key=str.lower) + >>> L + ['A', 'b', 'c', 'D'] + + Finally, the `reverse' parameter takes a Boolean value. If the + value is true, the list will be sorted into reverse order. Instead + of ‘L.sort(); L.reverse()’, you can now write + ‘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 ‘sort()’ contributed by Raymond Hettinger.) + + * There is a new built-in function ‘sorted(iterable)’ that works like + the in-place *note list.sort(): 834. method but can be used in + expressions. The differences are: + + * the input may be any iterable; + + * a newly formed copy is sorted, leaving the original intact; and + + * the expression returns the new sorted copy + + >>> 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 + + (Contributed by Raymond Hettinger.) + + * Integer operations will no longer trigger an ‘OverflowWarning’. + The ‘OverflowWarning’ warning will disappear in Python 2.5. + + * The interpreter gained a new switch, *note -m: 1ae, that takes a + name, searches for the corresponding module on ‘sys.path’, and runs + the module as a script. For example, you can now run the Python + profiler with ‘python -m profile’. (Contributed by Nick Coghlan.) + + * The ‘eval(expr, globals, locals)’ and ‘execfile(filename, globals, + locals)’ functions and the ‘exec’ statement now accept any mapping + type for the `locals' parameter. Previously this had to be a + regular Python dictionary. (Contributed by Raymond Hettinger.) + + * The *note zip(): 3bc. built-in function and ‘itertools.izip()’ now + return an empty list if called with no arguments. Previously they + raised a *note TypeError: 19c. exception. This makes them more + suitable for use with variable length argument lists: + + >>> def transpose(array): + ... return zip(*array) + ... + >>> transpose([(1,2,3), (4,5,6)]) + [(1, 4), (2, 5), (3, 6)] + >>> transpose([]) + [] + + (Contributed by Raymond Hettinger.) + + * Encountering a failure while importing a module no longer leaves a + partially initialized module object in ‘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.) + + * *note None: 243. is now a constant; code that binds a new value to + the name ‘None’ is now a syntax error. (Contributed by Raymond + Hettinger.) + +* Menu: + +* Optimizations: Optimizations<14>. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0318/ + + (2) https://peps.python.org/pep-0218/ + + (3) https://peps.python.org/pep-0322/ + + (4) https://peps.python.org/pep-0289/ + + (5) https://peps.python.org/pep-0237/ + + (6) https://peps.python.org/pep-0328/ + + +File: python.info, Node: Optimizations<14>, Up: Other Language Changes<15> + +1.16.11.1 Optimizations +....................... + + * 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 ‘keys()’, + ‘values()’, ‘items()’, ‘iterkeys()’, ‘itervalues()’, and + ‘iteritems()’. (Contributed by Raymond Hettinger.) + + * 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 ‘realloc()’. List comprehensions also + benefit. ‘list.extend()’ was also optimized and no longer converts + its argument into a temporary list before extending the base list. + (Contributed by Raymond Hettinger.) + + * *note list(): 1e9, *note tuple(): 539, *note map(): 460, *note + filter(): 461, and *note zip(): 3bc. now run several times faster + with non-sequence arguments that supply a ‘__len__()’ method. + (Contributed by Raymond Hettinger.) + + * The methods ‘list.__getitem__()’, ‘dict.__getitem__()’, and + ‘dict.__contains__()’ are now implemented as ‘method_descriptor’ + objects rather than ‘wrapper_descriptor’ objects. This form of + access doubles their performance and makes them more suitable for + use as arguments to functionals: ‘map(mydict.__getitem__, + keylist)’. (Contributed by Raymond Hettinger.) + + * Added a new opcode, ‘LIST_APPEND’, that simplifies the generated + bytecode for list comprehensions and speeds them up by about a + third. (Contributed by Raymond Hettinger.) + + * The peephole bytecode optimizer has been improved to produce + shorter, faster bytecode; remarkably, the resulting bytecode is + more readable. (Enhanced by Raymond Hettinger.) + + * String concatenations in statements of the form ‘s = s + "abc"’ and + ‘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 ‘join()’ method of strings is still recommended when you want + to efficiently glue a large number of strings together. + (Contributed by Armin Rigo.) + +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.) + + +File: python.info, Node: New Improved and Deprecated Modules<3>, Next: Build and C API Changes<11>, Prev: Other Language Changes<15>, Up: What’s New in Python 2 4 + +1.16.12 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 ‘Misc/NEWS’ file in +the source tree for a more complete list of changes, or look through the +CVS logs for all the details. + + * The *note asyncore: a. module’s ‘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. + + * The *note base64: d. module now has more complete RFC 3548(1) + support for Base64, Base32, and Base16 encoding and decoding, + including optional case folding and optional alternative alphabets. + (Contributed by Barry Warsaw.) + + * The *note bisect: 10. module now has an underlying C implementation + for improved performance. (Contributed by Dmitry Vasiliev.) + + * The CJKCodecs collections of East Asian codecs, maintained by + Hye-Shik Chang, was integrated into 2.4. The new encodings are: + + * Chinese (PRC): gb2312, gbk, gb18030, big5hkscs, hz + + * Chinese (ROC): big5, cp950 + + * + 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 + + * Korean: cp949, euc-kr, johab, iso-2022-kr + + * Some other new encodings were added: HP Roman8, ISO_8859-11, + ISO_8859-16, PCTP-154, and TIS-620. + + * The UTF-8 and UTF-16 codecs now cope better with receiving partial + input. Previously the ‘StreamReader’ class would try to read more + data, making it impossible to resume decoding from the stream. The + ‘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.) + + * There is a new *note collections: 1c. module for various + specialized collection datatypes. Currently it contains just one + type, ‘deque’, a double-ended queue that supports efficiently + adding and removing elements from either end: + + >>> 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 + + Several modules, such as the ‘Queue’ and *note threading: 10b. + modules, now take advantage of *note collections.deque: 1a9. for + improved performance. (Contributed by Raymond Hettinger.) + + * The ‘ConfigParser’ classes have been enhanced slightly. The + ‘read()’ method now returns a list of the files that were + successfully parsed, and the *note set(): 1a6. method raises *note + TypeError: 19c. if passed a `value' argument that isn’t a string. + (Contributed by John Belmonte and David Goodger.) + + * The *note curses: 2a. module now supports the ncurses extension + ‘use_default_colors()’. On platforms where the terminal supports + transparency, this makes it possible to use a transparent + background. (Contributed by Jörg Lehmann.) + + * The *note difflib: 35. module now includes an ‘HtmlDiff’ class that + creates an HTML table showing a side by side comparison of two + versions of a text. (Contributed by Dan Gass.) + + * The *note email: 64. 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 + ‘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 + ‘defect’ attribute of the message. (Developed by Anthony Baxter, + Barry Warsaw, Thomas Wouters, and others.) + + * The *note heapq: 89. 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 ‘nlargest()’ and ‘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.) + + * The ‘httplib’ module now contains constants for HTTP status codes + defined in various HTTP-related RFC documents. Constants have + names such as ‘OK’, ‘CREATED’, ‘CONTINUE’, and ‘MOVED_PERMANENTLY’; + use pydoc to get a full list. (Contributed by Andrew Eland.) + + * The *note imaplib: 94. module now supports IMAP’s THREAD command + (contributed by Yves Dionne) and new ‘deleteacl()’ and ‘myrights()’ + methods (contributed by Arnaud Mazin). + + * The *note itertools: a1. module gained a ‘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. + ‘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 + ‘groupby()’ is to return consecutive runs of odd or even numbers. + + >>> 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] + >>> + + ‘groupby()’ is typically used with sorted input. The logic for + ‘groupby()’ is similar to the Unix ‘uniq’ filter which makes it + handy for eliminating, counting, or identifying duplicate elements: + + >>> 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)] + + (Contributed by Hye-Shik Chang.) + + * *note itertools: a1. also gained a function named ‘tee(iterator, + N)’ that returns `N' independent iterators that replicate + `iterator'. If `N' is omitted, the default is 2. + + >>> L = [1,2,3] + >>> i1, i2 = itertools.tee(L) + >>> i1,i2 + (, ) + >>> list(i1) # Run the first iterator to exhaustion + [1, 2, 3] + >>> list(i2) # Run the second iterator to exhaustion + [1, 2, 3] + + Note that ‘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 *note list(): + 1e9. instead. When the iterators track closely with one another, + ‘tee()’ is ideal. Possible applications include bookmarking, + windowing, or lookahead iterators. (Contributed by Raymond + Hettinger.) + + * A number of functions were added to the *note locale: a7. module, + such as ‘bind_textdomain_codeset()’ to specify a particular + encoding and a family of ‘l*gettext()’ functions that return + messages in the chosen encoding. (Contributed by Gustavo + Niemeyer.) + + * Some keyword arguments were added to the *note logging: a8. + package’s ‘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: + + import logging + logging.basicConfig(filename='/var/log/application.log', + level=0, # Log all messages + format='%(levelname):%(process):%(thread):%(message)') + + Other additions to the *note logging: a8. package include a + ‘log(level, msg)’ convenience method, as well as a + ‘TimedRotatingFileHandler’ class that rotates its log files at a + timed interval. The module already had ‘RotatingFileHandler’, + which rotated logs once the file exceeded a certain size. Both + classes derive from a new ‘BaseRotatingHandler’ class that can be + used to implement other rotating handlers. + + (Changes implemented by Vinay Sajip.) + + * The *note marshal: ae. 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 ‘.pyc’ files + significantly smaller. (Contributed by Martin von Löwis.) + + * The *note nntplib: be. module’s ‘NNTP’ class gained ‘description()’ + and ‘descriptions()’ methods to retrieve newsgroup descriptions for + a single group or for a range of groups. (Contributed by Jürgen A. + Erhard.) + + * Two new functions were added to the *note operator: c0. module, + ‘attrgetter(attr)’ and ‘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 *note map(): 460. or *note sorted(): 833. For + 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)] + + (Contributed by Raymond Hettinger.) + + * The *note optparse: c1. module was updated in various ways. The + module now passes its messages through *note gettext.gettext(): + 10cb, making it possible to internationalize Optik’s help and error + messages. Help messages for options can now include the string + ‘'%default'’, which will be replaced by the option’s default value. + (Contributed by Greg Ward.) + + * The long-term plan is to deprecate the ‘rfc822’ module in some + future Python release in favor of the *note email: 64. package. To + this end, the ‘email.Utils.formatdate()’ function has been changed + to make it usable as a replacement for ‘rfc822.formatdate()’. You + may want to write new e-mail processing code with this in mind. + (Change implemented by Anthony Baxter.) + + * A new ‘urandom(n)’ function was added to the *note os: c2. module, + returning a string containing `n' bytes of random data. This + function provides access to platform-specific sources of randomness + such as ‘/dev/urandom’ on Linux or the Windows CryptoAPI. + (Contributed by Trevor Perrin.) + + * Another new function: ‘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 ‘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.) + + * A new ‘getsid()’ function was added to the *note posix: ce. module + that underlies the *note os: c2. module. (Contributed by J. + Raynor.) + + * The *note poplib: cd. module now supports POP over SSL. + (Contributed by Hector Urtubia.) + + * The *note profile: d0. module can now profile C extension + functions. (Contributed by Nick Bastin.) + + * The *note random: d9. module has a new method called + ‘getrandbits(N)’ that returns a long integer `N' bits in length. + The existing ‘randrange()’ method now uses ‘getrandbits()’ where + appropriate, making generation of arbitrarily large random numbers + more efficient. (Contributed by Raymond Hettinger.) + + * The regular expression language accepted by the *note re: da. + module was extended with simple conditional expressions, written as + ‘(?(group)A|B)’. `group' is either a numeric group ID or a group + name defined with ‘(?P...)’ 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.) + + * The *note re: da. 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 ‘a’ + characters against the expression ‘(a|b)+’, one stack frame was + consumed per character. Python 2.3 tried to check for stack + overflow and raise a *note RuntimeError: 6e9. 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. + + * The *note signal: e7. module now performs tighter error-checking on + the parameters to the *note signal.signal(): de1. function. For + example, you can’t set a handler on the ‘SIGKILL’ signal; previous + versions of Python would quietly accept this, but 2.4 will raise a + *note RuntimeError: 6e9. exception. + + * Two new functions were added to the *note socket: ec. module. + ‘socketpair()’ returns a pair of connected sockets and + ‘getservbyport(port)’ looks up the service name for a given port + number. (Contributed by Dave Cole and Barry Warsaw.) + + * The ‘sys.exitfunc()’ function has been deprecated. Code should be + using the existing *note atexit: b. module, which correctly handles + calling multiple exit functions. Eventually ‘sys.exitfunc()’ will + become a purely internal interface, accessed only by *note atexit: + b. + + * The *note tarfile: fd. module now generates GNU-format tar files by + default. (Contributed by Lars Gustäbel.) + + * The *note threading: 10b. module now has an elegantly simple way to + support thread-local data. The module contains a ‘local’ class + whose attribute values are local to different threads. + + import threading + + data = threading.local() + data.number = 42 + data.url = ('www.python.org', 80) + + Other threads can assign and retrieve their own values for the + ‘number’ and ‘url’ attributes. You can subclass ‘local’ to + initialize attributes or to add methods. (Contributed by Jim + Fulton.) + + * The *note timeit: 10d. module now automatically disables periodic + garbage collection during the timing loop. This change makes + consecutive timings more comparable. (Contributed by Raymond + Hettinger.) + + * The *note weakref: 132. 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.) + + * The ‘xmlrpclib’ module now supports a multi-call extension for + transmitting multiple XML-RPC calls in a single HTTP operation. + (Contributed by Brian Quinlan.) + + * The ‘mpz’, ‘rotor’, and ‘xreadlines’ modules have been removed. + +* Menu: + +* cookielib:: +* doctest: doctest<4>. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc3548.html + + +File: python.info, Node: cookielib, Next: doctest<4>, Up: New Improved and Deprecated Modules<3> + +1.16.12.1 cookielib +................... + +The ‘cookielib’ library supports client-side handling for HTTP cookies, +mirroring the ‘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. + +‘urllib2’ has been changed to interact with ‘cookielib’: +‘HTTPCookieProcessor’ manages a cookie jar that is used when accessing +URLs. + +This module was contributed by John J. Lee. + + +File: python.info, Node: doctest<4>, Prev: cookielib, Up: New Improved and Deprecated Modules<3> + +1.16.12.2 doctest +................. + +The *note doctest: 63. module underwent considerable refactoring thanks +to Edward Loper and Tim Peters. Testing can still be as simple as +running *note doctest.testmod(): 10ce, but the refactorings allow +customizing the module’s operation in various ways + +The new ‘DocTestFinder’ class extracts the tests from a given object’s +docstrings: + + 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) + +The new ‘DocTestRunner’ class then runs individual tests and can produce +a summary of the results: + + runner = doctest.DocTestRunner() + for t in tests: + tried, failed = runner.run(t) + + runner.summarize(verbose=1) + +The above example produces the following output: + + 1 items passed all tests: + 2 tests in f + 2 tests in 1 items. + 2 passed and 0 failed. + Test passed. + +‘DocTestRunner’ uses an instance of the ‘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 ‘OutputChecker’. + +The default output checker provides a number of handy features. For +example, with the *note doctest.ELLIPSIS: 10cf. option flag, an ellipsis +(‘...’) in the expected output matches any substring, making it easier +to accommodate outputs that vary in minor ways: + + def o (n): + """>>> o(1) + <__main__.C instance at 0x...> + >>> + """ + +Another special string, ‘’, matches a blank line: + + def p (n): + """>>> p(1) + + >>> + """ + +Another new capability is producing a diff-style display of the output +by specifying the *note doctest.REPORT_UDIFF: 10d0. (unified diffs), +*note doctest.REPORT_CDIFF: 10d1. (context diffs), or *note +doctest.REPORT_NDIFF: 10d2. (delta-style) option flags. For 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 + +Running the above function’s tests with *note doctest.REPORT_UDIFF: +10d0. specified, you get the following output: + + ********************************************************************** + 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 + ********************************************************************** + + +File: python.info, Node: Build and C API Changes<11>, Next: Porting to Python 2 4, Prev: New Improved and Deprecated Modules<3>, Up: What’s New in Python 2 4 + +1.16.13 Build and C API Changes +------------------------------- + +Some of the changes to Python’s build process and to the C API are: + + * Three new convenience macros were added for common return values + from extension functions: *note Py_RETURN_NONE: 10d4, *note + Py_RETURN_TRUE: 10d5, and *note Py_RETURN_FALSE: 10d6. + (Contributed by Brett Cannon.) + + * Another new macro, *note Py_CLEAR: 10d7, decreases the reference + count of `obj' and sets `obj' to the null pointer. (Contributed by + Jim Fulton.) + + * A new function, ‘PyTuple_Pack(N, obj1, obj2, ..., objN)’, + constructs tuples from a variable length argument list of Python + objects. (Contributed by Raymond Hettinger.) + + * A new function, ‘PyDict_Contains(d, k)’, implements fast dictionary + lookups without masking exceptions raised during the look-up + process. (Contributed by Raymond Hettinger.) + + * The Py_IS_NAN(X) macro returns 1 if its float or double argument + `X' is a NaN. (Contributed by Tim Peters.) + + * C code can avoid unnecessary locking by using the new *note + PyEval_ThreadsInitialized(): 593. function to tell if any thread + operations have been performed. If this function returns false, no + lock operations are needed. (Contributed by Nick Coghlan.) + + * A new function, *note PyArg_VaParseTupleAndKeywords(): 10d8, is the + same as *note PyArg_ParseTupleAndKeywords(): 987. but takes a + ‘va_list’ instead of a number of arguments. (Contributed by Greg + Chapman.) + + * A new method flag, ‘METH_COEXISTS’, allows a function defined in + slots to co-exist with a *note PyCFunction: 10d9. having the same + name. This can halve the access time for a method such as + ‘set.__contains__()’. (Contributed by Raymond Hettinger.) + + * Python can now be built with additional profiling for the + interpreter itself, intended as an aid to people developing the + Python core. Providing ‘--enable-profiling’ to the ‘configure’ + script will let you profile the interpreter with ‘gprof’, and + providing the ‘--with-tsc’ switch enables profiling using the + Pentium’s Time-Stamp-Counter register. Note that the ‘--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.) + + * The ‘tracebackobject’ type has been renamed to ‘PyTracebackObject’. + +* Menu: + +* Port-Specific Changes: Port-Specific Changes<2>. + + +File: python.info, Node: Port-Specific Changes<2>, Up: Build and C API Changes<11> + +1.16.13.1 Port-Specific Changes +............................... + + * The Windows port now builds under MSVC++ 7.1 as well as version 6. + (Contributed by Martin von Löwis.) + + +File: python.info, Node: Porting to Python 2 4, Next: Acknowledgements<4>, Prev: Build and C API Changes<11>, Up: What’s New in Python 2 4 + +1.16.14 Porting to Python 2.4 +----------------------------- + +This section lists previously described changes that may require changes +to your code: + + * Left shifts and hexadecimal/octal constants that are too large no + longer trigger a *note FutureWarning: 73e. and return a value + limited to 32 or 64 bits; instead they return a long integer. + + * Integer operations will no longer trigger an ‘OverflowWarning’. + The ‘OverflowWarning’ warning will disappear in Python 2.5. + + * The *note zip(): 3bc. built-in function and ‘itertools.izip()’ now + return an empty list instead of raising a *note TypeError: 19c. + exception if called with no arguments. + + * You can no longer compare the ‘date’ and *note datetime: 4be. + instances provided by the *note datetime: 2f. module. Two + instances of different classes will now always be unequal, and + relative comparisons (‘<’, ‘>’) will raise a *note TypeError: 19c. + + * ‘dircache.listdir()’ now passes exceptions to the caller instead of + returning empty lists. + + * ‘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. + + * *note fcntl.ioctl(): 10dc. now warns if the `mutate' argument is + omitted and relevant. + + * The *note tarfile: fd. module now generates GNU-format tar files by + default. + + * Encountering a failure while importing a module no longer leaves a + partially initialized module object in ‘sys.modules’. + + * *note None: 243. is now a constant; code that binds a new value to + the name ‘None’ is now a syntax error. + + * The ‘signals.signal()’ function now raises a *note RuntimeError: + 6e9. exception for certain illegal values; previously these errors + would pass silently. For example, you can no longer set a handler + on the ‘SIGKILL’ signal. + + +File: python.info, Node: Acknowledgements<4>, Prev: Porting to Python 2 4, Up: What’s New in Python 2 4 + +1.16.15 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. + + +File: python.info, Node: What’s New in Python 2 3, Next: What’s New in Python 2 2, Prev: What’s New in Python 2 4, Up: What’s New in Python + +1.17 What’s New in Python 2.3 +============================= + + +Author: A.M. Kuchling + +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 *note sum(): 296. and *note enumerate(): 10e1. The +*note in: 20a. operator can now be used for substring searches (e.g. +‘"ab" in "abc"’ returns *note True: 877.). + +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. + +* 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<16>. +* New, Improved, 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>. + + +File: python.info, Node: PEP 218 A Standard Set Datatype, Next: PEP 255 Simple Generators, Up: What’s New in Python 2 3 + +1.17.1 PEP 218: A Standard Set Datatype +--------------------------------------- + +The new ‘sets’ module contains an implementation of a set datatype. The +‘Set’ class is for mutable sets, sets that can have members added and +removed. The ‘ImmutableSet’ class is for sets that can’t be modified, +and instances of ‘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: + + >>> 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]) + >>> + +The union and intersection of sets can be computed with the ‘union()’ +and ‘intersection()’ methods; an alternative notation uses the bitwise +operators ‘&’ and ‘|’. Mutable sets also have in-place versions of +these methods, ‘union_update()’ and ‘intersection_update()’. + + >>> 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]) + >>> + +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 (‘^’), and an in-place version with the ungainly name +‘symmetric_difference_update()’. + + >>> 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]) + >>> + +There are also ‘issubset()’ and ‘issuperset()’ methods for checking +whether one set is a subset or superset of another: + + >>> S1 = sets.Set([1,2,3]) + >>> S2 = sets.Set([2,3]) + >>> S2.issubset(S1) + True + >>> S1.issubset(S2) + False + >>> S1.issuperset(S2) + True + >>> + +See also +........ + +PEP 218(1) - Adding a Built-In Set Object Type + + PEP written by Greg V. Wilson. Implemented by Greg V. Wilson, Alex + Martelli, and GvR. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0218/ + + +File: python.info, Node: PEP 255 Simple Generators, Next: PEP 263 Source Code Encodings, Prev: PEP 218 A Standard Set Datatype, Up: What’s New in Python 2 3 + +1.17.2 PEP 255: Simple Generators +--------------------------------- + +In Python 2.2, generators were added as an optional feature, to be +enabled by a ‘from __future__ import generators’ directive. In 2.3 +generators no longer need to be specially enabled, and are now always +present; this means that *note yield: 60d. 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 *note return: 60e. +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: + + def generate_ints(N): + for i in range(N): + yield i + +A new keyword, *note yield: 60d, was introduced for generators. Any +function containing a ‘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 *note yield: 60d. statement, the generator +outputs the value of ‘i’, similar to a *note return: 60e. statement. +The big difference between ‘yield’ and a ‘return’ statement is that on +reaching a ‘yield’ the generator’s state of execution is suspended and +local variables are preserved. On the next call to the generator’s +‘.next()’ method, the function will resume executing immediately after +the ‘yield’ statement. (For complicated reasons, the ‘yield’ statement +isn’t allowed inside the *note try: 1073. block of a ‘try’…‘finally’ +statement; read PEP 255(1) for a full explanation of the interaction +between ‘yield’ and exceptions.) + +Here’s a sample usage of the ‘generate_ints()’ generator: + + >>> gen = generate_ints(3) + >>> gen + + >>> 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 + +You could equally write ‘for i in generate_ints(5)’, or ‘a,b,c = +generate_ints(3)’. + +Inside a generator function, the *note return: 60e. 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. +‘return’ with a value, such as ‘return 5’, is a syntax error inside a +generator function. The end of the generator’s results can also be +indicated by raising *note StopIteration: 865. 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 ‘self.count’ to 0, and having the *note next(): 3c7. method +increment ‘self.count’ and return it. However, for a moderately +complicated generator, writing a corresponding class would be much +messier. ‘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. + + # 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 + +Two other examples in ‘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 (‘https://www.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 +‘https://www.cs.arizona.edu/icon/docs/ipd266.htm’ gives an idea of what +this looks like: + + sentence := "Store it in the neighboring harbor" + if (i := find("or", sentence)) > 5 then write(i) + +In Icon the ‘find()’ function returns the indexes at which the substring +“or” is found: 3, 23, 33. In the *note if: 467. statement, ‘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. + +See also +........ + +PEP 255(2) - 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0255/ + + (2) https://peps.python.org/pep-0255/ + + +File: python.info, Node: PEP 263 Source Code Encodings, Next: PEP 273 Importing Modules from ZIP Archives, Prev: PEP 255 Simple Generators, Up: What’s New in Python 2 3 + +1.17.3 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: + + #!/usr/bin/env python + # -*- coding: UTF-8 -*- + +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 *note +DeprecationWarning: 2d4. 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. + +See also +........ + +PEP 263(1) - Defining Python Source Code Encodings + + Written by Marc-André Lemburg and Martin von Löwis; implemented by + Suzuki Hisao and Martin von Löwis. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0263/ + + +File: python.info, Node: PEP 273 Importing Modules from ZIP Archives, Next: PEP 277 Unicode file name support for Windows NT, Prev: PEP 263 Source Code Encodings, Up: What’s New in Python 2 3 + +1.17.4 PEP 273: Importing Modules from ZIP Archives +--------------------------------------------------- + +The new *note zipimport: 14e. 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 ‘sys.path’. For 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' + >>> + +An entry in ‘sys.path’ can now be the filename of a ZIP archive. The +ZIP archive can contain any kind of files, but only files named ‘*.py’, +‘*.pyc’, or ‘*.pyo’ can be imported. If an archive only contains ‘*.py’ +files, Python will not attempt to modify the archive by adding the +corresponding ‘*.pyc’ file, meaning that if a ZIP archive doesn’t +contain ‘*.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 ‘/tmp/example.zip/lib/’ would only +import from the ‘lib/’ subdirectory within the archive. + +See also +........ + +PEP 273(1) - Import Modules from Zip Archives + + Written by James C. Ahlstrom, who also provided an implementation. + Python 2.3 follows the specification in PEP 273(2), but uses an + implementation written by Just van Rossum that uses the import + hooks described in PEP 302(3). See section *note PEP 302; New + Import Hooks: 10e8. for a description of the new import hooks. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0273/ + + (2) https://peps.python.org/pep-0273/ + + (3) https://peps.python.org/pep-0302/ + + +File: python.info, Node: PEP 277 Unicode file name support for Windows NT, Next: PEP 278 Universal Newline Support, Prev: PEP 273 Importing Modules from ZIP Archives, Up: What’s New in Python 2 3 + +1.17.5 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 *note open(): 30b. built-in function. If a +Unicode string is passed to *note os.listdir(): da5, Python now returns +a list of Unicode strings. A new function, ‘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 ‘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 +*note UnicodeError: f52. to be raised. Applications can test whether +arbitrary Unicode strings are supported as file names by checking *note +os.path.supports_unicode_filenames: 10ea, a Boolean value. + +Under MacOS, *note os.listdir(): da5. may now return Unicode filenames. + +See also +........ + +PEP 277(1) - Unicode file name support for Windows NT + + Written by Neil Hodgson; implemented by Neil Hodgson, Martin von + Löwis, and Mark Hammond. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0277/ + + +File: python.info, Node: PEP 278 Universal Newline Support, Next: PEP 279 enumerate, Prev: PEP 277 Unicode file name support for Windows NT, Up: What’s New in Python 2 3 + +1.17.6 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 ‘'U'’ or ‘'rU'’ will open a file for reading in *note +universal newlines: 9ae. mode. All three line ending conventions will +be translated to a ‘'\n'’ in the strings returned by the various file +methods such as ‘read()’ and *note readline(): db. + +Universal newline support is also used when importing modules and when +executing a file with the ‘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 +‘--without-universal-newlines’ switch when running Python’s ‘configure’ +script. + +See also +........ + +PEP 278(1) - Universal Newline Support + + Written and implemented by Jack Jansen. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0278/ + + +File: python.info, Node: PEP 279 enumerate, Next: PEP 282 The logging Package, Prev: PEP 278 Universal Newline Support, Up: What’s New in Python 2 3 + +1.17.7 PEP 279: enumerate() +--------------------------- + +A new built-in function, *note enumerate(): 10e1, will make certain +loops a bit clearer. ‘enumerate(thing)’, where `thing' is either an +iterator or a sequence, returns an iterator that will return ‘(0, +thing[0])’, ‘(1, thing[1])’, ‘(2, thing[2])’, and so forth. + +A common idiom to change every element of a list looks like this: + + for i in range(len(L)): + item = L[i] + # ... compute some result based on item ... + L[i] = result + +This can be rewritten using *note enumerate(): 10e1. as: + + for i, item in enumerate(L): + # ... compute some result based on item ... + L[i] = result + +See also +........ + +PEP 279(1) - The enumerate() built-in function + + Written and implemented by Raymond D. Hettinger. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0279/ + + +File: python.info, Node: PEP 282 The logging Package, Next: PEP 285 A Boolean Type, Prev: PEP 279 enumerate, Up: What’s New in Python 2 3 + +1.17.8 PEP 282: The logging Package +----------------------------------- + +A standard package for writing logs, *note logging: a8, 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 ‘Logger’ class is the primary class. Most application code will +deal with one or more ‘Logger’ objects, each one used by a particular +subsystem of the application. Each ‘Logger’ is identified by a name, +and names are organized into a hierarchy using ‘.’ as the component +separator. For example, you might have ‘Logger’ instances named +‘server’, ‘server.auth’ and ‘server.network’. The latter two instances +are below ‘server’ in the hierarchy. This means that if you turn up the +verbosity for ‘server’ or direct ‘server’ messages to a different +handler, the changes will also apply to records logged to ‘server.auth’ +and ‘server.network’. There’s also a root ‘Logger’ that’s the parent of +all other loggers. + +For simple uses, the *note logging: a8. package contains some +convenience functions that always use the root log: + + 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') + +This produces the following output: + + WARNING:root:Warning:config file server.conf not found + ERROR:root:Error occurred + CRITICAL:root:Critical error -- shutting down + +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 +‘setLevel()’ method on the root logger. + +Notice the ‘warning()’ call’s use of string formatting operators; all of +the functions for logging messages take the arguments ‘(msg, arg1, arg2, +...)’ and log the string resulting from ‘msg % (arg1, arg2, ...)’. + +There’s also an ‘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'. + + def f(): + try: 1/0 + except: logging.exception('Problem recorded') + + f() + +This produces the following output: + + 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 + +Slightly more advanced programs will use a logger other than the root +logger. The ‘getLogger(name)’ function is used to get a particular log, +creating it if it doesn’t exist yet. ‘getLogger(None)’ returns the root +logger. + + log = logging.getLogger('server') + ... + log.info('Listening on port %i', port) + ... + log.critical('Disk full') + ... + +Log records are usually propagated up the hierarchy, so a message logged +to ‘server.auth’ is also seen by ‘server’ and ‘root’, but a ‘Logger’ can +prevent this by setting its ‘propagate’ attribute to *note False: 78d. + +There are more classes provided by the *note logging: a8. package that +can be customized. When a ‘Logger’ instance is told to log a message, +it creates a ‘LogRecord’ instance that is sent to any number of +different ‘Handler’ instances. Loggers and handlers can also have an +attached list of filters, and each filter can cause the ‘LogRecord’ to +be ignored or can modify the record before passing it along. When +they’re finally output, ‘LogRecord’ instances are converted to text by a +‘Formatter’ class. All of these classes can be replaced by your own +specially written classes. + +With all of these features the *note logging: a8. 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 PEP 282(1) will +also be helpful. + +See also +........ + +PEP 282(2) - A Logging System + + Written by Vinay Sajip and Trent Mick; implemented by Vinay Sajip. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0282/ + + (2) https://peps.python.org/pep-0282/ + + +File: python.info, Node: PEP 285 A Boolean Type, Next: PEP 293 Codec Error Handling Callbacks, Prev: PEP 282 The logging Package, Up: What’s New in Python 2 3 + +1.17.9 PEP 285: A Boolean Type +------------------------------ + +A Boolean type was added to Python 2.3. Two new constants were added to +the ‘__builtin__’ module, *note True: 877. and *note False: 78d. (*note +True: 877. and *note False: 78d. 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 *note bool: 463.; the +constructor for it takes any Python value and converts it to *note True: +877. or *note False: 78d. + + >>> bool(1) + True + >>> bool(0) + False + >>> bool([]) + False + >>> bool( (1,) ) + True + +Most of the standard library modules and built-in functions have been +changed to return Booleans. + + >>> obj = [] + >>> hasattr(obj, 'append') + True + >>> isinstance(obj, list) + True + >>> isinstance(obj, tuple) + False + +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 ‘return 1’, you might wonder whether the ‘1’ represents a +Boolean truth value, an index, or a coefficient that multiplies some +other quantity. If the statement is ‘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 +*note if: 467. statement always evaluate to a Boolean result. Python is +not this strict and never will be, as PEP 285(1) explicitly says. This +means you can still use any expression in an ‘if’ statement, even ones +that evaluate to a list or tuple or some random object. The Boolean +type is a subclass of the *note int: 1c7. class so that arithmetic using +a Boolean still works. + + >>> True + 1 + 2 + >>> False + 1 + 1 + >>> False * 75 + 0 + >>> True * 75 + 75 + +To sum up *note True: 877. and *note False: 78d. in a sentence: they’re +alternative ways to spell the integer values 1 and 0, with the single +difference that *note str(): 1b3. and *note repr(): 3ee. return the +strings ‘'True'’ and ‘'False'’ instead of ‘'1'’ and ‘'0'’. + +See also +........ + +PEP 285(2) - Adding a bool type + + Written and implemented by GvR. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0285/ + + (2) https://peps.python.org/pep-0285/ + + +File: python.info, Node: PEP 293 Codec Error Handling Callbacks, Next: PEP 301 Package Index and Metadata for Distutils, Prev: PEP 285 A Boolean Type, Up: What’s New in Python 2 3 + +1.17.10 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 *note UnicodeError: +f52.), “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 *note +codecs.register_error(): 10f2, and codecs then can access the error +handler with *note codecs.lookup_error(): 10f3. 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. + +See also +........ + +PEP 293(1) - Codec Error Handling Callbacks + + Written and implemented by Walter Dörwald. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0293/ + + +File: python.info, Node: PEP 301 Package Index and Metadata for Distutils, Next: PEP 302 New Import Hooks, Prev: PEP 293 Codec Error Handling Callbacks, Up: What’s New in Python 2 3 + +1.17.11 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 ‘register’ command. +Running ‘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 ‘https://pypi.org’. + +To make the catalog a bit more useful, a new optional `classifiers' +keyword argument has been added to the Distutils ‘setup()’ function. A +list of Trove(1)-style strings can be supplied to help classify the +software. + +Here’s an example ‘setup.py’ with classifiers, written to be compatible +with older versions of the Distutils: + + 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) + +The full list of classifiers can be obtained by running ‘python setup.py +register --list-classifiers’. + +See also +........ + +PEP 301(2) - Package Index and Metadata for Distutils + + Written and implemented by Richard Jones. + + ---------- Footnotes ---------- + + (1) http://catb.org/~esr/trove/ + + (2) https://peps.python.org/pep-0301/ + + +File: python.info, Node: PEP 302 New Import Hooks, Next: PEP 305 Comma-separated Files, Prev: PEP 301 Package Index and Metadata for Distutils, Up: What’s New in Python 2 3 + +1.17.12 PEP 302: New Import Hooks +--------------------------------- + +While it’s been possible to write custom import hooks ever since the +‘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 +‘imputil’ and ‘iu’ modules, but none of them has ever gained much +acceptance, and none of them were easily usable from C code. + +PEP 302(1) borrows ideas from its predecessors, especially from Gordon +McMillan’s ‘iu’ module. Three new items are added to the *note sys: f9. +module: + + * ‘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 *note ImportError: 511. exception if it + can’t handle this path. + + * ‘sys.path_importer_cache’ caches importer objects for each path, so + ‘sys.path_hooks’ will only need to be traversed once for each path. + + * ‘sys.meta_path’ is a list of importer objects that will be + traversed before ‘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. + +Importer objects must have a single method, ‘find_module(fullname, +path=None)’. `fullname' will be a module or package name, e.g. +‘string’ or ‘distutils.core’. ‘find_module()’ must return a loader +object that has a single method, ‘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 PEP 302(2) for the full details): + + for mp in sys.meta_path: + loader = mp(fullname) + if loader is not None: + = 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) + = loader.load_module(fullname) + + # Not found! + raise ImportError + +See also +........ + +PEP 302(3) - New Import Hooks + + Written by Just van Rossum and Paul Moore. Implemented by Just van + Rossum. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0302/ + + (2) https://peps.python.org/pep-0302/ + + (3) https://peps.python.org/pep-0302/ + + +File: python.info, Node: PEP 305 Comma-separated Files, Next: PEP 307 Pickle Enhancements, Prev: PEP 302 New Import Hooks, Up: What’s New in Python 2 3 + +1.17.13 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: + + Costs,150,200,3.95 + +Read a line and call ‘line.split(',')’: what could be simpler? But toss +in string data that can contain commas, and things get more complicated: + + "Costs",150,200,3.95,"Includes taxes, shipping, and sundry items" + +A big ugly regular expression can parse this, but using the new *note +csv: 28. package is much simpler: + + import csv + + input = open('datafile', 'rb') + reader = csv.reader(input) + for line in reader: + print line + +The ‘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 *note csv.writer: 10f9. class will generate +comma-separated files from a succession of tuples or lists, quoting +strings that contain the delimiter. + +See also +........ + +PEP 305(1) - CSV File API + + Written and implemented by Kevin Altis, Dave Cole, Andrew McNamara, + Skip Montanaro, Cliff Wells. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0305/ + + +File: python.info, Node: PEP 307 Pickle Enhancements, Next: Extended Slices, Prev: PEP 305 Comma-separated Files, Up: What’s New in Python 2 3 + +1.17.14 PEP 307: Pickle Enhancements +------------------------------------ + +The *note pickle: c7. and ‘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; PEP +307(1) 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 *note +pickle.dumps(): 10fc. 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, *note +pickle.HIGHEST_PROTOCOL: 10fd, can be used to select the fanciest +protocol available. + +Unpickling is no longer considered a safe operation. 2.2’s *note +pickle: c7. provided hooks for trying to prevent unsafe classes from +being unpickled (specifically, a ‘__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: +‘__getstate__()’, ‘__setstate__()’, and ‘__getnewargs__()’. Consult PEP +307(2) 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. + +See also +........ + +PEP 307(3) - Extensions to the pickle protocol + + Written and implemented by Guido van Rossum and Tim Peters. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0307/ + + (2) https://peps.python.org/pep-0307/ + + (3) https://peps.python.org/pep-0307/ + + +File: python.info, Node: Extended Slices, Next: Other Language Changes<16>, Prev: PEP 307 Pickle Enhancements, Up: What’s New in Python 2 3 + +1.17.15 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: ‘L[1:10:2]’, ‘L[:-1:1]’, ‘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 +*note TypeError: 19c. 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: + + >>> L = range(10) + >>> L[::2] + [0, 2, 4, 6, 8] + +Negative values also work to make a copy of the same list in reverse +order: + + >>> L[::-1] + [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] + +This also works for tuples, arrays, and strings: + + >>> s='abcd' + >>> s[::2] + 'ac' + >>> s[::-1] + 'dcba' + +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: + + >>> a = range(3) + >>> a + [0, 1, 2] + >>> a[1:3] = [4, 5, 6] + >>> a + [0, 4, 5, 6] + +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: + + >>> 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 "", line 1, in ? + ValueError: attempt to assign sequence of size 3 to extended slice of size 2 + +Deletion is more straightforward: + + >>> a = range(4) + >>> a + [0, 1, 2, 3] + >>> a[::2] + [0, 2] + >>> del a[::2] + >>> a + [1, 3] + +One can also now pass slice objects to the ‘__getitem__()’ methods of +the built-in sequences: + + >>> range(10).__getitem__(slice(0, 5, 2)) + [0, 2, 4] + +Or use slice objects directly in subscripts: + + >>> range(10)[slice(0, 5, 2)] + [0, 2, 4] + +To simplify implementing sequences that support extended slicing, slice +objects now have a method ‘indices(length)’ which, given the length of a +sequence, returns a ‘(start, stop, step)’ tuple that can be passed +directly to *note range(): 58b. ‘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: + + 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) + +From this example you can also see that the built-in *note slice: 1100. +object is now the type object for the slice type, and is no longer a +function. This is consistent with Python 2.2, where *note int: 1c7, +*note str: 1b3, etc., underwent the same change. + + +File: python.info, Node: Other Language Changes<16>, Next: New Improved and Deprecated Modules<4>, Prev: Extended Slices, Up: What’s New in Python 2 3 + +1.17.16 Other Language Changes +------------------------------ + +Here are all of the changes that Python 2.3 makes to the core Python +language. + + * The *note yield: 60d. statement is now always a keyword, as + described in section *note PEP 255; Simple Generators: 10e4. of + this document. + + * A new built-in function *note enumerate(): 10e1. was added, as + described in section *note PEP 279; enumerate(): 10ed. of this + document. + + * Two new constants, *note True: 877. and *note False: 78d. were + added along with the built-in *note bool: 463. type, as described + in section *note PEP 285; A Boolean Type: 10f0. of this document. + + * The *note int(): 1c7. type constructor will now return a long + integer instead of raising an *note OverflowError: 4a4. when a + string or floating-point number is too large to fit into an + integer. This can lead to the paradoxical result that + ‘isinstance(int(expression), int)’ is false, but that seems + unlikely to cause problems in practice. + + * Built-in types now support the extended slicing syntax, as + described in section *note Extended Slices: 10ff. of this document. + + * A new built-in function, ‘sum(iterable, start=0)’, adds up the + numeric items in the iterable object and returns their sum. *note + sum(): 296. only accepts numbers, meaning that you can’t use it to + concatenate a bunch of strings. (Contributed by Alex Martelli.) + + * ‘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. + + * ‘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. + + * Dictionaries have a new method, ‘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 *note + KeyError: 6f5. raised if it isn’t. + + >>> 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 + {} + >>> + + There’s also a new class method, ‘dict.fromkeys(iterable, value)’, + that creates a dictionary with keys taken from the supplied + iterator `iterable' and all values set to `value', defaulting to + ‘None’. + + (Patches contributed by Raymond Hettinger.) + + Also, the *note dict(): 16e. constructor now accepts keyword + arguments to simplify creating small dictionaries: + + >>> dict(red=1, blue=2, green=3, black=4) + {'blue': 2, 'black': 4, 'green': 3, 'red': 1} + + (Contributed by Just van Rossum.) + + * The *note assert: 5bc. statement no longer checks the ‘__debug__’ + flag, so you can no longer disable assertions by assigning to + ‘__debug__’. Running Python with the *note -O: a34. switch will + still generate code that doesn’t execute any assertions. + + * 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 ‘new’ module can be deprecated in a future Python version, + because you can now use the type objects available in the *note + types: 122. module.) For example, you can create a new module + object with the following code: + + >>> import types + >>> m = types.ModuleType('abc','docstring') + >>> m + + >>> m.__doc__ + 'docstring' + + * A new warning, *note PendingDeprecationWarning: 503. 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 *note + -Walways;;PendingDeprecationWarning;;: 502. on the command line or + use *note warnings.filterwarnings(): 1102. + + * The process of deprecating string-based exceptions, as in ‘raise + "Error occurred"’, has begun. Raising a string will now trigger + *note PendingDeprecationWarning: 503. + + * Using ‘None’ as a variable name will now result in a *note + SyntaxWarning: 2d5. warning. In a future version of Python, ‘None’ + may finally become a keyword. + + * The ‘xreadlines()’ method of file objects, introduced in Python + 2.1, is no longer necessary because files now behave as their own + iterator. ‘xreadlines()’ was originally introduced as a faster way + to loop over all the lines in a file, but now you can simply write + ‘for line in file_obj’. File objects also have a new read-only + ‘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. + + * 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"(1). + To understand the motivation for this change, read Michele + Simionato’s article "Python 2.3 Method Resolution Order"(2), or + read the thread on python-dev starting with the message at + ‘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. + + * 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 ‘sys.setcheckinterval(N)’. The limit can be retrieved with + the new ‘sys.getcheckinterval()’ function. + + * 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 ‘'.'’ in front of the type name. For example, in + Python 2.2, if you created a socket and printed its ‘__class__’, + you’d get this output: + + >>> s = socket.socket() + >>> s.__class__ + + + In 2.3, you get this: + + >>> s.__class__ + + + * One of the noted incompatibilities between old- and new-style + classes has been removed: you can now assign to the *note __name__: + f79. and *note __bases__: 1103. attributes of new-style classes. + There are some restrictions on what can be assigned to *note + __bases__: 1103. along the lines of those relating to assigning to + an instance’s *note __class__: 1104. attribute. + +* Menu: + +* String Changes:: +* Optimizations: Optimizations<15>. + + ---------- Footnotes ---------- + + (1) https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.19.3910 + + (2) http://www.phyast.pitt.edu/~micheles/mro.html + + +File: python.info, Node: String Changes, Next: Optimizations<15>, Up: Other Language Changes<16> + +1.17.16.1 String Changes +........................ + + * The *note in: 20a. operator now works differently for strings. + Previously, when evaluating ‘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 ‘X in Y’ will return *note True: + 877. if `X' is a substring of `Y'. If `X' is the empty string, the + result is always *note True: 877. + + >>> 'ab' in 'abcd' + True + >>> 'ad' in 'abcd' + False + >>> '' in 'abcd' + True + + Note that this doesn’t tell you where the substring starts; if you + need that information, use the ‘find()’ string method. + + * The ‘strip()’, ‘lstrip()’, and ‘rstrip()’ string methods now have + an optional argument for specifying the characters to strip. The + default is still to remove all whitespace characters: + + >>> ' abc '.strip() + 'abc' + >>> '><><><>'.strip('<>') + 'abc' + >>> '><><><>\n'.strip('<>') + 'abc<><><>\n' + >>> u'\u4000\u4001abc\u4000'.strip(u'\u4000') + u'\u4001abc' + >>> + + (Suggested by Simon Brunning and implemented by Walter Dörwald.) + + * The ‘startswith()’ and ‘endswith()’ string methods now accept + negative numbers for the `start' and `end' parameters. + + * Another new string method is ‘zfill()’, originally a function in + the *note string: f3. module. ‘zfill()’ pads a numeric string with + zeros on the left until it’s the specified width. Note that the + ‘%’ operator is still more flexible and powerful than ‘zfill()’. + + >>> '45'.zfill(4) + '0045' + >>> '12345'.zfill(4) + '12345' + >>> 'goofy'.zfill(6) + '0goofy' + + (Contributed by Walter Dörwald.) + + * A new type object, ‘basestring’, has been added. Both 8-bit + strings and Unicode strings inherit from this type, so + ‘isinstance(obj, basestring)’ will return *note True: 877. for + either kind of string. It’s a completely abstract type, so you + can’t create ‘basestring’ instances. + + * 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.) + + +File: python.info, Node: Optimizations<15>, Prev: String Changes, Up: Other Language Changes<16> + +1.17.16.2 Optimizations +....................... + + * The creation of new-style class instances has been made much + faster; they’re now faster than classic classes! + + * The ‘sort()’ method of list objects has been extensively rewritten + by Tim Peters, and the implementation is significantly faster. + + * 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*n) required for the grade-school + multiplication algorithm. (Original patch by Christopher A. Craig, + and significantly reworked by Tim Peters.) + + * The ‘SET_LINENO’ opcode is now gone. This may provide a small + speed increase, depending on your compiler’s idiosyncrasies. See + section *note Other Changes and Fixes: 1107. for a longer + explanation. (Removed by Michael Hudson.) + + * ‘xrange()’ objects now have their own iterator, making ‘for i in + xrange(n)’ slightly faster than ‘for i in range(n)’. (Patch by + Raymond Hettinger.) + + * 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.) + +The net result of the 2.3 optimizations is that Python 2.3 runs the +pystone benchmark around 25% faster than Python 2.2. + + +File: python.info, Node: New Improved and Deprecated Modules<4>, Next: Pymalloc A Specialized Object Allocator, Prev: Other Language Changes<16>, Up: What’s New in Python 2 3 + +1.17.17 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 ‘Misc/NEWS’ file in +the source tree for a more complete list of changes, or look through the +CVS logs for all the details. + + * The *note array: 6. module now supports arrays of Unicode + characters using the ‘'u'’ format character. Arrays also now + support using the ‘+=’ assignment operator to add another array’s + contents, and the ‘*=’ assignment operator to repeat an array. + (Contributed by Jason Orendorff.) + + * The ‘bsddb’ module has been replaced by version 4.1.6 of the + PyBSDDB(1) package, providing a more complete interface to the + transactional features of the BerkeleyDB library. + + The old version of the module has been renamed to ‘bsddb185’ and is + no longer built automatically; you’ll have to edit ‘Modules/Setup’ + to enable it. Note that the new ‘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 ‘db2pickle.py’ and + ‘pickle2db.py’ which you will find in the distribution’s + ‘Tools/scripts’ directory. If you’ve already been using the + PyBSDDB package and importing it as ‘bsddb3’, you will have to + change your ‘import’ statements to import it as ‘bsddb’. + + * The new *note bz2: 12. module is an interface to the bz2 data + compression library. bz2-compressed data is usually smaller than + corresponding *note zlib: 14f.-compressed data. (Contributed by + Gustavo Niemeyer.) + + * A set of standard date/time types has been added in the new *note + datetime: 2f. module. See the following section for more details. + + * The Distutils ‘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 + ‘sampmodule.c’ includes the header file ‘sample.h’, you would + create the ‘Extension’ object like this: + + ext = Extension("samp", + sources=["sampmodule.c"], + depends=["sample.h"]) + + Modifying ‘sample.h’ would then cause the module to be recompiled. + (Contributed by Jeremy Hylton.) + + * Other minor changes to Distutils: it now checks for the *note CC: + 1109, *note CFLAGS: 110a, ‘CPP’, *note LDFLAGS: 110b, and *note + CPPFLAGS: 110c. environment variables, using them to override the + settings in Python’s configuration (contributed by Robert Weber). + + * Previously the *note doctest: 63. module would only search the + docstrings of public methods and functions for test cases, but it + now also examines private ones as well. The ‘DocTestSuite()’ + function creates a *note unittest.TestSuite: a75. object from a set + of *note doctest: 63. tests. + + * The new ‘gc.get_referents(object)’ function returns a list of all + the objects referenced by `object'. + + * The *note getopt: 81. module gained a new function, ‘gnu_getopt()’, + that supports the same arguments as the existing *note getopt(): + 81. function but uses GNU-style scanning mode. The existing *note + getopt(): 81. 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: + + >>> getopt.getopt(['-f', 'filename', 'output', '-v'], 'f:v') + ([('-f', 'filename')], ['output', '-v']) + >>> getopt.gnu_getopt(['-f', 'filename', 'output', '-v'], 'f:v') + ([('-f', 'filename'), ('-v', '')], ['output']) + + (Contributed by Peter Åstrand.) + + * The *note grp: 86, *note pwd: d3, and *note resource: dd. modules + now return enhanced tuples: + + >>> import grp + >>> g = grp.getgrnam('amk') + >>> g.gr_name, g.gr_gid + ('amk', 500) + + * The *note gzip: 87. module can now handle files exceeding 2 GiB. + + * The new *note heapq: 89. 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', ‘heap[k] <= heap[2*k+1]’ and ‘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(lg n). (See + ‘https://xlinux.nist.gov/dads//HTML/priorityque.html’ for more + information about the priority queue data structure.) + + The *note heapq: 89. module provides ‘heappush()’ and ‘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: + + >>> 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] + + (Contributed by Kevin O’Connor.) + + * The IDLE integrated development environment has been updated using + the code from the IDLEfork project + (‘http://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 ‘reload()’ + operations. IDLE’s core code has been incorporated into the + standard library as the *note idlelib: 93. package. + + * The *note imaplib: 94. module now supports IMAP over SSL. + (Contributed by Piers Lauder and Tino Lange.) + + * The *note itertools: a1. contains a number of useful functions for + use with iterators, inspired by various functions provided by the + ML and Haskell languages. For example, + ‘itertools.ifilter(predicate, iterator)’ returns all elements in + the iterator for which the function ‘predicate()’ returns *note + True: 877, and ‘itertools.repeat(obj, N)’ returns ‘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.) + + * Two new functions in the *note math: af. module, ‘degrees(rads)’ + and ‘radians(degs)’, convert between radians and degrees. Other + functions in the *note math: af. module such as *note math.sin(): + 110d. and *note math.cos(): 110e. have always required input values + measured in radians. Also, an optional `base' argument was added + to *note math.log(): 110f. to make it easier to compute logarithms + for bases other than ‘e’ and ‘10’. (Contributed by Raymond + Hettinger.) + + * Several new POSIX functions (‘getpgid()’, ‘killpg()’, ‘lchown()’, + ‘loadavg()’, ‘major()’, ‘makedev()’, ‘minor()’, and ‘mknod()’) were + added to the *note posix: ce. module that underlies the *note os: + c2. module. (Contributed by Gustavo Niemeyer, Geert Jansen, and + Denis S. Otkidach.) + + * In the *note os: c2. module, the ‘*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 *note + time.time(): 736. + + During testing, it was found that some applications will break if + time stamps are floats. For compatibility, when using the tuple + interface of the ‘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 + ‘os.stat_float_times()’ is invoked to enable float return values: + + >>> os.stat("/tmp").st_mtime + 1034791200 + >>> os.stat_float_times(True) + >>> os.stat("/tmp").st_mtime + 1034791200.6335014 + + 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. + + * The *note optparse: c1. 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. + + * The old and never-documented ‘linuxaudiodev’ module has been + deprecated, and a new version named *note ossaudiodev: c4. 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.) + + * The new *note platform: cb. 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.) + + * The parser objects provided by the ‘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 ‘buffer_text’ attribute to *note True: 877. + will enable buffering. + + * The ‘sample(population, k)’ function was added to the *note random: + d9. module. `population' is a sequence or ‘xrange’ object + containing the elements of a population, and ‘sample()’ chooses `k' + elements from the population without replacing chosen elements. + `k' can be any value up to ‘len(population)’. For 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 "", 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] + + The *note random: d9. 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.) + + * The *note readline: db. module also gained a number of new + functions: ‘get_history_item()’, ‘get_current_history_length()’, + and ‘redisplay()’. + + * The ‘rexec’ and ‘Bastion’ modules have been declared dead, and + attempts to import them will fail with a *note RuntimeError: 6e9. + New-style classes provide new ways to break out of the restricted + execution environment provided by ‘rexec’, and no one has interest + in fixing them or time to do so. If you have applications using + ‘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 ‘rexec’ module in + those versions. To repeat: if you’re using ‘rexec’, stop using it + immediately.) + + * The ‘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. + + * The *note shutil: e6. module gained a ‘move(src, dest)’ function + that recursively moves a file or directory to a new location. + + * Support for more advanced POSIX signal handling was added to the + *note signal: e7. but then removed again as it proved impossible to + make it work reliably across platforms. + + * The *note socket: ec. module now supports timeouts. You can call + the ‘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 *note + socket.timeout: 428. exception. + + The original timeout implementation was by Tim O’Malley. Michael + Gilfix integrated it into the Python *note socket: ec. 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.) + + * On Windows, the *note socket: ec. module now ships with Secure + Sockets Layer (SSL) support. + + * The value of the C ‘PYTHON_API_VERSION’ macro is now exposed at the + Python level as ‘sys.api_version’. The current exception can be + cleared by calling the new ‘sys.exc_clear()’ function. + + * The new *note tarfile: fd. module allows reading from and writing + to ‘tar’-format archive files. (Contributed by Lars Gustäbel.) + + * The new *note textwrap: 10a. module contains functions for wrapping + strings containing paragraphs of text. The ‘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 ‘fill(text, + width)’ function returns a single string, reformatted to fit into + lines no longer than the chosen width. (As you can guess, ‘fill()’ + is built on top of ‘wrap()’. For 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. + >>> + + The module also contains a ‘TextWrapper’ class that actually + implements the text wrapping strategy. Both the ‘TextWrapper’ + class and the ‘wrap()’ and ‘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.) + + * The ‘thread’ and *note threading: 10b. modules now have companion + modules, ‘dummy_thread’ and ‘dummy_threading’, that provide a + do-nothing implementation of the ‘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: + + try: + import threading as _threading + except ImportError: + import dummy_threading as _threading + + In this example, ‘_threading’ is used as the module name to make it + clear that the module being used is not necessarily the actual + *note threading: 10b. module. Code can call functions and use + classes in ‘_threading’ whether or not threads are supported, + avoiding an *note if: 467. 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. + + * The *note time: 10c. module’s ‘strptime()’ function has long been + an annoyance because it uses the platform C library’s ‘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. + + * The new *note timeit: 10d. module helps measure how long snippets + of Python code take to execute. The ‘timeit.py’ file can be run + directly from the command line, or the module’s ‘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 ‘unicode()’ + function: + + 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] + + * The ‘Tix’ module has received various bug fixes and updates for the + current version of the Tix package. + + * The ‘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, + ‘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 ‘Tkinter’ will now + raise an exception on such an access so that you can at least find + out about the problem. See + ‘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.) + + * Calling Tcl methods through ‘_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 ‘_tkinter.Tcl_Obj’ object if no Python equivalent exists. + This behavior can be controlled through the ‘wantobjects()’ method + of ‘tkapp’ objects. + + When using ‘_tkinter’ through the ‘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 ‘wantobjects’ variable in the ‘Tkinter’ + module to false before creating the first ‘tkapp’ object. + + import Tkinter + Tkinter.wantobjects = 0 + + Any breakage caused by this change should be reported as a bug. + + * The ‘UserDict’ module has a new ‘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 *note + shelve: e4. module. + + Adding the mix-in as a superclass provides the full dictionary + interface whenever the class defines ‘__getitem__()’, + ‘__setitem__()’, ‘__delitem__()’, and ‘keys()’. For 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'] + + (Contributed by Raymond Hettinger.) + + * The DOM implementation in *note xml.dom.minidom: 140. can now + generate XML output in a particular encoding by providing an + optional encoding argument to the ‘toxml()’ and ‘toprettyxml()’ + methods of DOM nodes. + + * The ‘xmlrpclib’ module now supports an XML-RPC extension for + handling nil data values such as Python’s ‘None’. Nil values are + always supported on unmarshalling an XML-RPC response. To generate + requests containing ‘None’, you must supply a true value for the + `allow_none' parameter when creating a ‘Marshaller’ instance. + + * The new ‘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.) + + * 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. + + >{}>{}> u"www.Alliancefrançaise.nu".encode("idna") + 'www.xn--alliancefranaise-npb.nu' + + The *note socket: ec. 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 ‘httplib’ and *note ftplib: 7e.) also support Unicode host + names; ‘httplib’ also sends HTTP ‘Host’ headers using the ACE + version of the domain name. *note urllib: 127. supports Unicode + URLs with non-ASCII host names as long as the ‘path’ part of the + URL is ASCII only. + + To implement this change, the *note stringprep: f4. module, the + ‘mkstringprep’ tool and the ‘punycode’ encoding have been added. + +* Menu: + +* Date/Time Type:: +* The optparse Module:: + + ---------- Footnotes ---------- + + (1) https://pybsddb.sourceforge.net + + +File: python.info, Node: Date/Time Type, Next: The optparse Module, Up: New Improved and Deprecated Modules<4> + +1.17.17.1 Date/Time Type +........................ + +Date and time types suitable for expressing timestamps were added as the +*note datetime: 2f. 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: ‘date’, representing a day, month, and +year; *note time: 4bf, consisting of hour, minute, and second; and *note +datetime: 4be, which contains all the attributes of both ‘date’ and +*note time: 4bf. There’s also a ‘timedelta’ class representing +differences between two points in time, and time zone logic is +implemented by classes inheriting from the abstract ‘tzinfo’ class. + +You can create instances of ‘date’ and *note time: 4bf. by either +supplying keyword arguments to the appropriate constructor, e.g. +‘datetime.date(year=1972, month=10, day=15)’, or by using one of a +number of class methods. For example, the ‘date.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: + + >>> import datetime + >>> now = datetime.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' + +The ‘replace()’ method allows modifying one or more fields of a ‘date’ +or *note datetime: 4be. instance, returning a new instance: + + >>> d = datetime.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) + >>> + +Instances can be compared, hashed, and converted to strings (the result +is the same as that of ‘isoformat()’). ‘date’ and *note datetime: 4be. +instances can be subtracted from each other, and added to ‘timedelta’ +instances. The largest missing feature is that there’s no standard +library support for parsing strings and getting back a ‘date’ or *note +datetime: 4be. + +For more information, refer to the module’s reference documentation. +(Contributed by Tim Peters.) + + +File: python.info, Node: The optparse Module, Prev: Date/Time Type, Up: New Improved and Deprecated Modules<4> + +1.17.17.2 The optparse Module +............................. + +The *note getopt: 81. module provides simple parsing of command-line +arguments. The new *note optparse: c1. module (originally named Optik) +provides more elaborate command-line parsing that follows the Unix +conventions, automatically creates the output for ‘--help’, and can +perform different actions for different options. + +You start by creating an instance of ‘OptionParser’ and telling it what +your program’s options are. + + 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') + +Parsing a command line is then done by calling the ‘parse_args()’ +method. + + options, args = op.parse_args(sys.argv[1:]) + print options + print args + +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. + + $ ./python opt.py -i data arg1 + + ['arg1'] + $ ./python opt.py --input=data --length=4 + + [] + $ + +The help message is automatically generated for you: + + $ ./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 + $ + +See the module’s documentation for more details. + +Optik was written by Greg Ward, with suggestions from the readers of the +Getopt SIG. + + +File: python.info, Node: Pymalloc A Specialized Object Allocator, Next: Build and C API Changes<12>, Prev: New Improved and Deprecated Modules<4>, Up: What’s New in Python 2 3 + +1.17.18 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 ‘malloc()’ and to have less memory overhead for +allocation patterns typical of Python programs. The allocator uses C’s +‘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 ‘--with-pymalloc’ option to the ‘configure’ script. In +2.3, pymalloc has had further enhancements and is now enabled by +default; you’ll have to supply ‘--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 ‘malloc()’ and +‘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 ‘malloc()’ and ‘free()’ any more, and +calling the wrong function to free memory may get you a core dump. For +example, if memory was allocated using *note PyObject_Malloc(): 8d9, it +has to be freed using *note PyObject_Free(): 8d6, not ‘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. + + * To allocate and free an undistinguished chunk of memory use the + “raw memory” family: *note PyMem_Malloc(): 8d7, *note + PyMem_Realloc(): ce1, and *note PyMem_Free(): 10a8. + + * The “object memory” family is the interface to the pymalloc + facility described above and is biased towards a large number of + “small” allocations: *note PyObject_Malloc(): 8d9, *note + PyObject_Realloc(): 10a9, and *note PyObject_Free(): 8d6. + + * To allocate and free Python objects, use the “object” family *note + PyObject_New(): 5db, *note PyObject_NewVar(): 5dc, and *note + PyObject_Del(): 1114. + +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 ‘configure’ with ‘--with-pydebug’. + +To aid extension writers, a header file ‘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. + +See also +........ + +‘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 ‘Objects/obmalloc.c’ in the Python + source code. The above link points to the file within the + python.org SVN browser. + + +File: python.info, Node: Build and C API Changes<12>, Next: Other Changes and Fixes<2>, Prev: Pymalloc A Specialized Object Allocator, Up: What’s New in Python 2 3 + +1.17.19 Build and C API Changes +------------------------------- + +Changes to Python’s build process and to the C API include: + + * 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 ‘--with-cycle-gc’ + switch to ‘configure’ has been removed. + + * Python can now optionally be built as a shared library + (‘libpython2.3.so’) by supplying ‘--enable-shared’ when running + Python’s ‘configure’ script. (Contributed by Ondrej Palkovsky.) + + * The ‘DL_EXPORT’ and ‘DL_IMPORT’ macros are now deprecated. + Initialization functions for Python extension modules should now be + declared using the new macro ‘PyMODINIT_FUNC’, while the Python + core will generally use the ‘PyAPI_FUNC’ and ‘PyAPI_DATA’ macros. + + * The interpreter can be compiled without any docstrings for the + built-in functions and modules by supplying ‘--without-doc-strings’ + to the ‘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.) + + * The ‘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 *note METH_NOARGS: 1116. 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 ‘PyArg_ParseTuple(args, "")’ instead, + but this will be slower than using *note METH_NOARGS: 1116. + + * *note PyArg_ParseTuple(): 4d9. accepts new format characters for + various sizes of unsigned integers: ‘B’ for unsigned char, ‘H’ for + unsigned short int, ‘I’ for unsigned int, and ‘K’ for unsigned long + long. + + * A new function, ‘PyObject_DelItemString(mapping, char *key)’ was + added as shorthand for ‘PyObject_DelItem(mapping, + PyString_New(key))’. + + * File objects now manage their internal string buffer differently, + increasing it exponentially when needed. This results in the + benchmark tests in ‘Lib/test/test_bufio.py’ speeding up + considerably (from 57 seconds to 1.7 seconds, according to one + measurement). + + * It’s now possible to define class and static methods for a C + extension type by setting either the *note METH_CLASS: 1117. or + *note METH_STATIC: 1118. flags in a method’s *note PyMethodDef: + 1119. structure. + + * 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. + + * If you dynamically allocate type objects in your extension, you + should be aware of a change in the rules relating to the + ‘__module__’ and *note __name__: f79. attributes. In summary, you + will want to ensure the type’s dictionary contains a ‘'__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. + +* Menu: + +* Port-Specific Changes: Port-Specific Changes<3>. + + +File: python.info, Node: Port-Specific Changes<3>, Up: Build and C API Changes<12> + +1.17.19.1 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; ‘fork()’ and *note fcntl(): 79. 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 ‘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 +(‘http://www.atheos.cx/’), GNU/Hurd, and OpenVMS. + + +File: python.info, Node: Other Changes and Fixes<2>, Next: Porting to Python 2 3, Prev: Build and C API Changes<12>, Up: What’s New in Python 2 3 + +1.17.20 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: + + * If the *note PYTHONINSPECT: 111c. 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 *note -i: + 111d. 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. + + * The ‘regrtest.py’ script now provides a way to allow “all resources + except `foo'.” A resource name passed to the ‘-u’ option can now be + prefixed with a hyphen (‘'-'’) to mean “remove this resource.” For + example, the option ‘‘-uall,-bsddb’’ could be used to enable the + use of all resources except ‘bsddb’. + + * The tools used to build the documentation now work under Cygwin as + well as Unix. + + * The ‘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., *note pdb: c6.). 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 ‘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 *note -O: a34. + + C extensions that access the ‘f_lineno’ field of frame objects + should instead call ‘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 + ‘f_lineno’ attribute of frame objects, changing the line that will + be executed next. A ‘jump’ command has been added to the *note + pdb: c6. debugger taking advantage of this new feature. + (Implemented by Richie Hindle.) + + +File: python.info, Node: Porting to Python 2 3, Next: Acknowledgements<5>, Prev: Other Changes and Fixes<2>, Up: What’s New in Python 2 3 + +1.17.21 Porting to Python 2.3 +----------------------------- + +This section lists previously described changes that may require changes +to your code: + + * *note yield: 60d. is now always a keyword; if it’s used as a + variable name in your code, a different name must be chosen. + + * For strings `X' and `Y', ‘X in Y’ now works if `X' is more than one + character long. + + * The *note int(): 1c7. type constructor will now return a long + integer instead of raising an *note OverflowError: 4a4. when a + string or floating-point number is too large to fit into an + integer. + + * 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 *note PEP 263; + Source Code Encodings: 10e6. for more information. + + * Calling Tcl methods through ‘_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 ‘_tkinter.Tcl_Obj’ object if no Python equivalent exists. + + * Large octal and hex literals such as ‘0xffffffff’ now trigger a + *note FutureWarning: 73e. 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 ‘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 ‘~(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 ‘0xffffffffL &~(1L<<31)’. + + * You can no longer disable assertions by assigning to ‘__debug__’. + + * The Distutils ‘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 ‘get_distutil_options()’ function in your + ‘setup.py’ and only uses the new keywords with a version of the + Distutils that supports them: + + from distutils import core + + kw = {'sources': 'foo.c', ...} + if hasattr(core, 'get_distutil_options'): + kw['depends'] = ['foo.h'] + ext = Extension(**kw) + + * Using ‘None’ as a variable name will now result in a *note + SyntaxWarning: 2d5. warning. + + * Names of extension types defined by the modules included with + Python now contain the module and a ‘'.'’ in front of the type + name. + + +File: python.info, Node: Acknowledgements<5>, Prev: Porting to Python 2 3, Up: What’s New in Python 2 3 + +1.17.22 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. + + +File: python.info, Node: What’s New in Python 2 2, Next: What’s New in Python 2 1, Prev: What’s New in Python 2 3, Up: What’s New in Python + +1.18 What’s New in Python 2.2 +============================= + + +Author: A.M. Kuchling + +* 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>. + + +File: python.info, Node: Introduction, Next: PEPs 252 and 253 Type and Class Changes, Up: What’s New in Python 2 2 + +1.18.1 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(1) and the Python Reference Manual(2). If +you want to understand the complete implementation and design rationale +for a change, refer to the PEP for a particular new feature. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/2.2/lib/lib.html + + (2) https://docs.python.org/2.2/ref/ref.html + + +File: python.info, Node: PEPs 252 and 253 Type and Class Changes, Next: PEP 234 Iterators, Prev: Introduction, Up: What’s New in Python 2 2 + +1.18.2 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 ‘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 ‘UserList’ instance. + +Python 2.2 fixes this, and in the process adds some exciting new +capabilities. A brief summary: + + * 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. + + * It’s now possible to define static and class methods, in addition + to the instance methods available in previous versions of Python. + + * 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 ‘__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. + + * 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. + +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 *note Related +Links: 1125, “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:: + + +File: python.info, Node: Old and New Classes, Next: Descriptors, Up: PEPs 252 and 253 Type and Class Changes + +1.18.2.1 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 *note object: 6df, the base class for all +built-in types, has also been added so if no built-in type is suitable, +you can just subclass *note object: 6df.: + + class C(object): + def __init__ (self): + ... + ... + +This means that *note class: f7b. 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 +‘__metaclass__’ — see PEP 253(1) for the details — but it’s easier to +just subclass *note object: 6df.) + +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 *note int(): 1c7, *note float(): 3ca, and *note str(): 1b3. In +2.2, they aren’t functions any more, but type objects that behave as +factories when called. + + >>> int + + >>> int('123') + 123 + +To make the set of types complete, new type objects such as *note +dict(): 16e. and ‘file()’ have been added. Here’s a more interesting +example, adding a ‘lock()’ method to file objects: + + class LockableFile(file): + def lock (self, operation, length=0, start=0, whence=0): + import fcntl + return fcntl.lockf(self.fileno(), operation, + length, start, whence) + +The now-obsolete ‘posixfile’ module contained a class that emulated all +of a file object’s methods and also added a ‘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 ‘LockableFile’. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0253/ + + +File: python.info, Node: Descriptors, Next: Multiple Inheritance The Diamond Rule, Prev: Old and New Classes, Up: PEPs 252 and 253 Type and Class Changes + +1.18.2.2 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 ‘__members__’ and +‘__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 *note __dict__: 8ce. of an object, but +when class inheritance or an arbitrary ‘__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: + + * *note __name__: f79. is the attribute’s name. + + * ‘__doc__’ is the attribute’s docstring. + + * ‘__get__(object)’ is a method that retrieves the attribute value + from `object'. + + * ‘__set__(object, value)’ sets the attribute on `object' to `value'. + + * ‘__delete__(object, value)’ deletes the `value' attribute of + `object'. + +For example, when you write ‘obj.x’, the steps that Python actually +performs are: + + descriptor = obj.__class__.x + descriptor.__get__(obj) + +For methods, ‘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: + + class C(object): + def f(arg1, arg2): + ... + f = staticmethod(f) + + def g(cls, arg1, arg2): + ... + g = classmethod(g) + +The *note staticmethod(): 3c8. function takes the function ‘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 (‘def static f’, ‘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: + + 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) + +Note that a person using the new ‘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 +‘eiffelmethod()’ or the ZODB or whatever, but most users will just write +code on top of the resulting libraries and ignore the implementation +details. + + +File: python.info, Node: Multiple Inheritance The Diamond Rule, Next: Attribute Access, Prev: Descriptors, Up: PEPs 252 and 253 Type and Class Changes + +1.18.2.3 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 PEP 253(1) by Guido van Rossum): + + class A: + ^ ^ def save(self): ... + / \ + / \ + / \ + / \ + class B class C: + ^ ^ def save(self): ... + \ / + \ / + \ / + \ / + class D + +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 ‘D.save()’ will search the classes ‘D’, ‘B’, and then ‘A’, +where ‘save()’ would be found and returned. ‘C.save()’ would never be +found at all. This is bad, because if ‘C’’s ‘save()’ method is saving +some internal state specific to ‘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.) + + 1. 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 [‘D’, ‘B’, ‘A’, ‘C’, + ‘A’]. + + 2. 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 [‘D’, ‘B’, ‘C’, ‘A’] after dropping + duplicates. + +Following this rule, referring to ‘D.save()’ will return ‘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, *note super(): +8b7, provides a way to get at a class’s superclasses without having to +reimplement Python’s algorithm. The most commonly used form will be +‘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, ‘D’’s ‘save()’ method would look +like this: + + class D (B,C): + def save (self): + # Call superclass .save() + super(D, self).save() + # Save D's private information here + ... + +*note super(): 8b7. can also return unbound superclass objects when +called as ‘super(class)’ or ‘super(class1, class2)’, but this probably +won’t often be useful. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0253/ + + +File: python.info, Node: Attribute Access, Next: Related Links, Prev: Multiple Inheritance The Diamond Rule, Up: PEPs 252 and 253 Type and Class Changes + +1.18.2.4 Attribute Access +......................... + +A fair number of sophisticated Python classes define hooks for attribute +access using ‘__getattr__()’; most commonly this is done for +convenience, to make code more readable by automatically mapping an +attribute access such as ‘obj.parent’ into a method call such as +‘obj.get_parent’. Python 2.2 adds some new ways of controlling +attribute access. + +First, ‘__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 ‘obj.foo’ and no attribute named ‘foo’ is +found in the instance’s dictionary. + +New-style classes also support a new method, +‘__getattribute__(attr_name)’. The difference between the two methods +is that ‘__getattribute__()’ is `always' called whenever any attribute +is accessed, while the old ‘__getattr__()’ is only called if ‘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 ‘__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 *note __dict__: 8ce. ‘__getattr__()’ methods also end up being +called by Python when it checks for other methods such as ‘__repr__()’ +or ‘__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. + +*note property: 205. 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 ‘size’ attribute that’s computed, but +also settable, you could write: + + 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") + +That is certainly clearer and easier to write than a pair of +‘__getattr__()’/‘__setattr__()’ methods that check for the ‘size’ +attribute and handle it specially while retrieving all other attributes +from the instance’s *note __dict__: 8ce. Accesses to ‘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 *note __slots__: 112a. 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 +‘obj.new_attr=1’. A new-style class can define a class attribute named +*note __slots__: 112a. to limit the legal attributes to a particular set +of names. An example will make this clear: + + >>> 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 "", line 1, in ? + AttributeError: 'C' object has no attribute 'newattr' + +Note how you get an *note AttributeError: 19d. on the attempt to assign +to an attribute not listed in *note __slots__: 112a. + + +File: python.info, Node: Related Links, Prev: Attribute Access, Up: PEPs 252 and 253 Type and Class Changes + +1.18.2.5 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? + +‘https://docs.python.org/dev/howto/descriptor.html’ 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, PEP 252(1) and PEP 253(2). PEP +252(3) is titled “Making Types Look More Like Classes”, and covers the +descriptor API. PEP 253(4) is titled “Subtyping Built-in Types”, and +describes the changes to type objects that make it possible to subtype +built-in objects. PEP 253(5) 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 ‘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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0252/ + + (2) https://peps.python.org/pep-0253/ + + (3) https://peps.python.org/pep-0252/ + + (4) https://peps.python.org/pep-0253/ + + (5) https://peps.python.org/pep-0253/ + + +File: python.info, Node: PEP 234 Iterators, Next: PEP 255 Simple Generators<2>, Prev: PEPs 252 and 253 Type and Class Changes, Up: What’s New in Python 2 2 + +1.18.3 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 ‘for item in obj’ +work is to define a ‘__getitem__()’ method that looks something like +this: + + def __getitem__(self, index): + return + +‘__getitem__()’ is more properly used to define an indexing operation on +an object so that you can write ‘obj[5]’ to retrieve the sixth element. +It’s a bit misleading when you’re using this only to support *note for: +199. 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 ‘__getitem__()’ calls will be made +with `index' incrementing by one each time. In other words, the +presence of the ‘__getitem__()’ method doesn’t mean that using ‘file[5]’ +to randomly access the sixth element will work, though it really should. + +In Python 2.2, iteration can be implemented separately, and +‘__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, ‘iter(obj)’ or ‘iter(C, sentinel)’, is used to get an +iterator. ‘iter(obj)’ returns an iterator for the object `obj', while +‘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 ‘__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 ‘self’. In particular, iterators +will usually be their own iterators. Extension types implemented in C +can implement a *note tp_iter: 112d. function in order to return an +iterator, and extension types that want to behave as iterators can +define a *note tp_iternext: 112e. function. + +So, after all this, what do iterators actually do? They have one +required method, *note next(): 3c7, which takes no arguments and returns +the next value. When there are no more values to be returned, calling +*note next(): 3c7. should raise the *note StopIteration: 865. exception. + + >>> L = [1,2,3] + >>> i = iter(L) + >>> print i + + >>> i.next() + 1 + >>> i.next() + 2 + >>> i.next() + 3 + >>> i.next() + Traceback (most recent call last): + File "", line 1, in ? + StopIteration + >>> + +In 2.2, Python’s *note for: 199. statement no longer expects a sequence; +it expects something for which *note iter(): 3c6. will return an +iterator. For backward compatibility and convenience, an iterator is +automatically constructed for sequences that don’t implement +‘__iter__()’ or a *note tp_iter: 112d. slot, so ‘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: + + >>> L = [1,2,3] + >>> i = iter(L) + >>> a,b,c = i + >>> a,b,c + (1, 2, 3) + +Iterator support has been added to some of Python’s basic types. +Calling *note iter(): 3c6. on a dictionary will return an iterator which +loops over its keys: + + >>> 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 + +That’s just the default behaviour. If you want to iterate over keys, +values, or key/value pairs, you can explicitly call the ‘iterkeys()’, +‘itervalues()’, or ‘iteritems()’ methods to get an appropriate iterator. +In a minor related change, the *note in: 20a. operator now works on +dictionaries, so ‘key in dict’ is now equivalent to ‘dict.has_key(key)’. + +Files also provide an iterator, which calls the *note readline(): db. +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: + + for line in file: + # do something for each line + ... + +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 *note next(): 3c7. method. + +See also +........ + +PEP 234(1) - Iterators + + Written by Ka-Ping Yee and GvR; implemented by the Python Labs + crew, mostly by GvR and Tim Peters. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0234/ + + +File: python.info, Node: PEP 255 Simple Generators<2>, Next: PEP 237 Unifying Long Integers and Integers<2>, Prev: PEP 234 Iterators, Up: What’s New in Python 2 2 + +1.18.4 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 *note return: 60e. +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: + + def generate_ints(N): + for i in range(N): + yield i + +A new keyword, *note yield: 60d, was introduced for generators. Any +function containing a ‘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 ‘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 *note yield: 60d. statement, the generator +outputs the value of ‘i’, similar to a *note return: 60e. statement. +The big difference between ‘yield’ and a ‘return’ statement is that on +reaching a ‘yield’ the generator’s state of execution is suspended and +local variables are preserved. On the next call to the generator’s +‘next()’ method, the function will resume executing immediately after +the ‘yield’ statement. (For complicated reasons, the ‘yield’ statement +isn’t allowed inside the ‘try’ block of a *note try: 1073.…*note +finally: 60a. statement; read PEP 255(1) for a full explanation of the +interaction between ‘yield’ and exceptions.) + +Here’s a sample usage of the ‘generate_ints()’ generator: + + >>> gen = generate_ints(3) + >>> gen + + >>> gen.next() + 0 + >>> gen.next() + 1 + >>> gen.next() + 2 + >>> gen.next() + Traceback (most recent call last): + File "", line 1, in ? + File "", line 2, in generate_ints + StopIteration + +You could equally write ‘for i in generate_ints(5)’, or ‘a,b,c = +generate_ints(3)’. + +Inside a generator function, the *note return: 60e. 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. +‘return’ with a value, such as ‘return 5’, is a syntax error inside a +generator function. The end of the generator’s results can also be +indicated by raising *note StopIteration: 865. 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 ‘self.count’ to 0, and having the *note next(): 3c7. method +increment ‘self.count’ and return it. However, for a moderately +complicated generator, writing a corresponding class would be much +messier. ‘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. + + # 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 + +Two other examples in ‘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 (‘https://www.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 +‘https://www.cs.arizona.edu/icon/docs/ipd266.htm’ gives an idea of what +this looks like: + + sentence := "Store it in the neighboring harbor" + if (i := find("or", sentence)) > 5 then write(i) + +In Icon the ‘find()’ function returns the indexes at which the substring +“or” is found: 3, 23, 33. In the *note if: 467. statement, ‘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. + +See also +........ + +PEP 255(2) - 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0255/ + + (2) https://peps.python.org/pep-0255/ + + +File: python.info, Node: PEP 237 Unifying Long Integers and Integers<2>, Next: PEP 238 Changing the Division Operator, Prev: PEP 255 Simple Generators<2>, Up: What’s New in Python 2 2 + +1.18.5 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 ‘2**32’ bytes, the ‘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 ‘'abc'[1L:]’ would +raise a *note TypeError: 19c. 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 *note OverflowError: 4a4. will now +return a long integer as their result. For example: + + >>> 1234567890123 + 1234567890123L + >>> 2 ** 64 + 18446744073709551616L + +In most cases, integers and long integers will now be treated +identically. You can still distinguish them with the *note type(): 9c2. +built-in function, but that’s rarely needed. + +See also +........ + +PEP 237(1) - Unifying Long Integers and Integers + + Written by Moshe Zadka and Guido van Rossum. Implemented mostly by + Guido van Rossum. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0237/ + + +File: python.info, Node: PEP 238 Changing the Division Operator, Next: Unicode Changes, Prev: PEP 237 Unifying Long Integers and Integers<2>, Up: What’s New in Python 2 2 + +1.18.6 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, ‘/’, 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, ‘3/2’ is 1, not 1.5, and ‘(-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 ‘comp.lang.python’. I won’t argue for +either side here and will stick to describing what’s implemented in 2.2. +Read PEP 238(1) 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 PEP 238(2). “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 ‘/’ +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 ‘/’; 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: + + * A new operator, ‘//’, is the floor division operator. (Yes, we + know it looks like C++’s comment symbol.) ‘//’ `always' performs + floor division no matter what the types of its operands are, so ‘1 + // 2’ is 0 and ‘1.0 // 2.0’ is also 0.0. + + ‘//’ is always available in Python 2.2; you don’t need to enable it + using a ‘__future__’ statement. + + * By including a ‘from __future__ import division’ in a module, the + ‘/’ operator will be changed to return the result of true division, + so ‘1/2’ is 0.5. Without the ‘__future__’ statement, ‘/’ still + means classic division. The default meaning of ‘/’ will not change + until Python 3.0. + + * Classes can define methods called ‘__truediv__()’ and + ‘__floordiv__()’ to overload the two division operators. At the C + level, there are also slots in the *note PyNumberMethods: 1081. + structure so extension types can define the two operators. + + * Python 2.2 supports some command-line arguments for testing whether + code will work with the changed division semantics. Running python + with ‘-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. + +See also +........ + +PEP 238(3) - Changing the Division Operator + + Written by Moshe Zadka and Guido van Rossum. Implemented by Guido + van Rossum.. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0238/ + + (2) https://peps.python.org/pep-0238/ + + (3) https://peps.python.org/pep-0238/ + + +File: python.info, Node: Unicode Changes, Next: PEP 227 Nested Scopes, Prev: PEP 238 Changing the Division Operator, Up: What’s New in Python 2 2 + +1.18.7 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 ‘--enable-unicode=ucs4’ to the +configure script. (It’s also possible to specify ‘--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 ‘unichr()’ function is expanded accordingly. Using +an interpreter compiled to use UCS-2 (a “narrow Python”), values greater +than 65535 will still cause ‘unichr()’ to raise a *note ValueError: 1c8. +exception. This is all described in PEP 261(1), “Support for ‘wide’ +Unicode characters”; consult it for further details. + +Another change is simpler to explain. Since their introduction, Unicode +strings have supported an ‘encode()’ method to convert the string to a +selected encoding such as UTF-8 or Latin-1. A symmetric +‘decode([*encoding*])’ method has been added to 8-bit strings (though +not to Unicode strings) in 2.2. ‘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 *note +zlib: 14f. module: + + >>> 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 + M2&5R92!I=F5R8F]S92P*86YD(')E<&5T:71I=F4@=&5X="X* + + end + >>> "sheesh".encode('rot-13') + 'furrfu' + +To convert a class instance to Unicode, a ‘__unicode__()’ method can be +defined by a class, analogous to ‘__str__()’. + +‘encode()’, ‘decode()’, and ‘__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. + +See also +........ + +PEP 261(2) - Support for ‘wide’ Unicode characters + + Written by Paul Prescod. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0261/ + + (2) https://peps.python.org/pep-0261/ + + +File: python.info, Node: PEP 227 Nested Scopes, Next: New and Improved Modules<3>, Prev: Unicode Changes, Up: What’s New in Python 2 2 + +1.18.8 PEP 227: Nested Scopes +----------------------------- + +In Python 2.1, statically nested scopes were added as an optional +feature, to be enabled by a ‘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: + + def f(): + ... + def g(value): + ... + return g(value-1) + 1 + ... + +The function ‘g()’ will always raise a *note NameError: 396. exception, +because the binding of the name ‘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 *note lambda: f4b. expression +clumsier, and this was a problem in practice. In code which uses +‘lambda’ you can often find local variables being copied by passing them +as the default values of arguments. + + 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 + +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 +‘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 *note def: 10bd, *note class: f7b, or +*note import: 1af. 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 ‘from module import *’ and +‘exec’ statements have been made illegal inside a function scope under +certain conditions. The Python reference manual has said all along that +‘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. ‘from module import *’ and ‘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 *note lambda: f4b. expressions with +free variables, the compiler will flag this by raising a *note +SyntaxError: 2d6. exception. + +To make the preceding explanation a bit clearer, here’s an example: + + x = 1 + def f(): + # The next line is a syntax error + exec 'x=2' + def g(): + return x + +Line 4 containing the ‘exec’ statement is a syntax error, since ‘exec’ +would define a new local variable named ‘x’ whose value should be +accessed by ‘g()’. + +This shouldn’t be much of a limitation, since ‘exec’ is rarely used in +most Python code (and when it is used, it’s often a sign of a poor +design anyway). + +See also +........ + +PEP 227(1) - Statically Nested Scopes + + Written and implemented by Jeremy Hylton. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0227/ + + +File: python.info, Node: New and Improved Modules<3>, Next: Interpreter Changes and Fixes, Prev: PEP 227 Nested Scopes, Up: What’s New in Python 2 2 + +1.18.9 New and Improved Modules +------------------------------- + + * The ‘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: + + 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)'}, ... ] + + The ‘SimpleXMLRPCServer’ module makes it easy to create + straightforward XML-RPC servers. See + ‘http://xmlrpc.scripting.com/’ for more information about XML-RPC. + + * The new *note hmac: 8a. module implements the HMAC algorithm + described by RFC 2104(1). (Contributed by Gerhard Häring.) + + * Several functions that originally returned lengthy tuples now + return pseudo-sequences that still behave like tuples but also have + mnemonic attributes such as memberst_mtime or ‘tm_year’. The + enhanced functions include *note stat(): f1, ‘fstat()’, + ‘statvfs()’, and ‘fstatvfs()’ in the *note os: c2. module, and + ‘localtime()’, ‘gmtime()’, and ‘strptime()’ in the *note time: 10c. + module. + + For example, to obtain a file’s size using the old tuples, you’d + end up writing something like ‘file_size = + os.stat(filename)[stat.ST_SIZE]’, but now this can be written more + clearly as ‘file_size = os.stat(filename).st_size’. + + The original patch for this feature was contributed by Nick + Mathewson. + + * 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.) + + * The *note socket: ec. module can be compiled to support IPv6; + specify the ‘--enable-ipv6’ option to Python’s configure script. + (Contributed by Jun-ichiro “itojun” Hagino.) + + * Two new format characters were added to the *note struct: f5. + module for 64-bit integers on platforms that support the C long + long type. ‘q’ is for a signed 64-bit integer, and ‘Q’ is for an + unsigned one. The value is returned in Python’s long integer type. + (Contributed by Tim Peters.) + + * In the interpreter’s interactive mode, there’s a new built-in + function *note help(): 514. that uses the *note pydoc: d6. module + introduced in Python 2.1 to provide interactive help. + ‘help(object)’ displays any available help text about `object'. + *note help(): 514. 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 *note pydoc: d6. module.) + + * Various bugfixes and performance improvements have been made to the + SRE engine underlying the *note re: da. module. For example, the + *note re.sub(): 85d. and *note re.split(): 7cb. functions have been + rewritten in C. Another contributed patch speeds up certain Unicode + character ranges by a factor of two, and a new ‘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.) + + * The *note smtplib: ea. module now supports RFC 2487(2), “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. *note smtplib: ea. also supports SMTP authentication. + (Contributed by Gerhard Häring.) + + * The *note imaplib: 94. module, maintained by Piers Lauder, has + support for several new extensions: the NAMESPACE extension defined + in RFC 2342(3), SORT, GETACL and SETACL. (Contributed by Anthony + Baxter and Michel Pelletier.) + + * The ‘rfc822’ module’s parsing of email addresses is now compliant + with RFC 2822(4), an update to RFC 822(5). (The module’s name is + `not' going to be changed to ‘rfc2822’.) A new package, *note + email: 64, has also been added for parsing and generating e-mail + messages. (Contributed by Barry Warsaw, and arising out of his + work on Mailman.) + + * The *note difflib: 35. module now contains a new ‘Differ’ class for + producing human-readable lists of changes (a “delta”) between two + sequences of lines of text. There are also two generator + functions, ‘ndiff()’ and ‘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.) + + * New constants ‘ascii_letters’, ‘ascii_lowercase’, and + ‘ascii_uppercase’ were added to the *note string: f3. module. + There were several modules in the standard library that used + ‘string.letters’ to mean the ranges A-Za-z, but that assumption is + incorrect when locales are in use, because ‘string.letters’ varies + depending on the set of legal characters defined by the current + locale. The buggy modules have all been fixed to use + ‘ascii_letters’ instead. (Reported by an unknown person; fixed by + Fred L. Drake, Jr.) + + * The *note mimetypes: b0. module now makes it easier to use + alternative MIME-type databases by the addition of a ‘MimeTypes’ + class, which takes a list of filenames to be parsed. (Contributed + by Fred L. Drake, Jr.) + + * A ‘Timer’ class was added to the *note threading: 10b. module that + allows scheduling an activity to happen at some future time. + (Contributed by Itamar Shtull-Trauring.) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2104.html + + (2) https://datatracker.ietf.org/doc/html/rfc2487.html + + (3) https://datatracker.ietf.org/doc/html/rfc2342.html + + (4) https://datatracker.ietf.org/doc/html/rfc2822.html + + (5) https://datatracker.ietf.org/doc/html/rfc822.html + + +File: python.info, Node: Interpreter Changes and Fixes, Next: Other Changes and Fixes<3>, Prev: New and Improved Modules<3>, Up: What’s New in Python 2 2 + +1.18.10 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. + + * 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, *note + PyEval_SetProfile(): 1136. and *note PyEval_SetTrace(): 1137. The + existing *note sys.setprofile(): 1138. and *note sys.settrace(): + 1139. functions still exist, and have simply been changed to use + the new C-level interface. (Contributed by Fred L. Drake, Jr.) + + * Another low-level API, primarily of interest to implementors of + Python debuggers and development tools, was added. *note + PyInterpreterState_Head(): 113a. and *note + PyInterpreterState_Next(): 113b. let a caller walk through all the + existing interpreter objects; *note + PyInterpreterState_ThreadHead(): 113c. and *note + PyThreadState_Next(): 113d. allow looping over all the thread + states for a given interpreter. (Contributed by David Beazley.) + + * 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: + + * Rename ‘Py_TPFLAGS_GC()’ to ‘PyTPFLAGS_HAVE_GC()’. + + * + Use *note PyObject_GC_New(): 6fe. or *note PyObject_GC_NewVar(): 6ff. to allocate + + objects, and *note PyObject_GC_Del(): 113e. to deallocate + them. + + * + Rename ‘PyObject_GC_Init()’ to *note PyObject_GC_Track(): 113f. and + + ‘PyObject_GC_Fini()’ to *note PyObject_GC_UnTrack(): 1140. + + * Remove ‘PyGC_HEAD_SIZE()’ from object size calculations. + + * Remove calls to ‘PyObject_AS_GC()’ and ‘PyObject_FROM_GC()’. + + * A new ‘et’ format sequence was added to *note PyArg_ParseTuple(): + 4d9.; ‘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 ‘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.) + + * A different argument parsing function, *note PyArg_UnpackTuple(): + 1141, 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 + *note PyObject: 4cf.* variables that will be filled in with + argument values. + + * Two new flags *note METH_NOARGS: 1116. and *note METH_O: 1142. 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 *note METH_VARARGS: 1143. Also, the old ‘METH_OLDARGS’ + style of writing C methods is now officially deprecated. + + * Two new wrapper functions, *note PyOS_snprintf(): 1144. and *note + PyOS_vsnprintf(): 1145. were added to provide cross-platform + implementations for the relatively new ‘snprintf()’ and + ‘vsnprintf()’ C lib APIs. In contrast to the standard ‘sprintf()’ + and ‘vsprintf()’ functions, the Python versions check the bounds of + the buffer used to protect against buffer overruns. (Contributed + by M.-A. Lemburg.) + + * The *note _PyTuple_Resize(): 1146. 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. + + +File: python.info, Node: Other Changes and Fixes<3>, Next: Acknowledgements<6>, Prev: Interpreter Changes and Fixes, Up: What’s New in Python 2 2 + +1.18.11 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: + + * 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 ‘--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 + ‘/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 ‘setup.py’. + People who want to experiment with these modules can uncomment them + manually. + + * Keyword arguments passed to built-in functions that don’t take them + now cause a *note TypeError: 19c. exception to be raised, with the + message “`function' takes no keyword arguments”. + + * 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 *note ReferenceError: 1148. exception has + therefore moved from the *note weakref: 132. module to become a + built-in exception. + + * A new script, ‘Tools/scripts/cleanfuture.py’ by Tim Peters, + automatically removes obsolete ‘__future__’ statements from Python + source code. + + * An additional `flags' argument has been added to the built-in + function *note compile(): 310, so the behaviour of ‘__future__’ + statements can now be correctly observed in simulated shells, such + as those presented by IDLE and other development environments. + This is described in PEP 264(1). (Contributed by Michael Hudson.) + + * 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. + + * 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 + ‘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.) + + * Large file support is now enabled on Windows. (Contributed by Tim + Peters.) + + * The ‘Tools/scripts/ftpmirror.py’ script now parses a ‘.netrc’ file, + if you have one. (Contributed by Mike Romberg.) + + * Some features of the object returned by the ‘xrange()’ function are + now deprecated, and trigger warnings when they’re accessed; they’ll + disappear in Python 2.3. ‘xrange’ objects tried to pretend they + were full sequence types by supporting slicing, sequence + multiplication, and the *note in: 20a. operator, but these features + were rarely used and therefore buggy. The ‘tolist()’ method and + the ‘start’, ‘stop’, and ‘step’ attributes are also being + deprecated. At the C level, the fourth argument to the + ‘PyRange_New()’ function, ‘repeat’, has also been deprecated. + + * 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. + + * 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…) + + * 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.) + + * Files ending in ‘.pyw’ can now be imported on Windows. ‘.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.) + + * On platforms where Python uses the C ‘dlopen()’ function to load + extension modules, it’s now possible to set the flags used by + ‘dlopen()’ using the *note sys.getdlopenflags(): 1149. and *note + sys.setdlopenflags(): dca. functions. (Contributed by Bram Stolk.) + + * The *note pow(): 613. built-in function no longer supports 3 + arguments when floating-point numbers are supplied. ‘pow(x, y, z)’ + returns ‘(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 ‘pow(2.0, 8.0, 7.0)’ will now raise a + *note TypeError: 19c. exception. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0264/ + + +File: python.info, Node: Acknowledgements<6>, Prev: Other Changes and Fixes<3>, Up: What’s New in Python 2 2 + +1.18.12 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. + + +File: python.info, Node: What’s New in Python 2 1, Next: What’s New in Python 2 0, Prev: What’s New in Python 2 2, Up: What’s New in Python + +1.19 What’s New in Python 2.1 +============================= + + +Author: A.M. Kuchling + +* 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>. + + +File: python.info, Node: Introduction<2>, Next: PEP 227 Nested Scopes<2>, Up: What’s New in Python 2 1 + +1.19.1 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. + + +File: python.info, Node: PEP 227 Nested Scopes<2>, Next: PEP 236 __future__ Directives, Prev: Introduction<2>, Up: What’s New in Python 2 1 + +1.19.2 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: + + def f(): + ... + def g(value): + ... + return g(value-1) + 1 + ... + +The function ‘g()’ will always raise a *note NameError: 396. exception, +because the binding of the name ‘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 *note lambda: f4b. expression +clumsier, and this was a problem in practice. In code which uses *note +lambda: f4b. you can often find local variables being copied by passing +them as the default values of arguments. + + 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 + +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 +‘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 *note def: 10bd, *note class: f7b, or +*note import: 1af. 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 ‘from module import *’ and +‘exec’ statements have been made illegal inside a function scope under +certain conditions. The Python reference manual has said all along that +‘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. ‘from module import *’ and ‘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 *note lambda: f4b. expressions with +free variables, the compiler will flag this by raising a *note +SyntaxError: 2d6. exception. + +To make the preceding explanation a bit clearer, here’s an example: + + x = 1 + def f(): + # The next line is a syntax error + exec 'x=2' + def g(): + return x + +Line 4 containing the ‘exec’ statement is a syntax error, since ‘exec’ +would define a new local variable named ‘x’ whose value should be +accessed by ‘g()’. + +This shouldn’t be much of a limitation, since ‘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 +PEP 236(1). (See the following section for further discussion of PEP +236(2).) 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. + +See also +........ + +PEP 227(3) - Statically Nested Scopes + + Written and implemented by Jeremy Hylton. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0236/ + + (2) https://peps.python.org/pep-0236/ + + (3) https://peps.python.org/pep-0227/ + + +File: python.info, Node: PEP 236 __future__ Directives, Next: PEP 207 Rich Comparisons, Prev: PEP 227 Nested Scopes<2>, Up: What’s New in Python 2 1 + +1.19.3 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 ‘from...import’ statement using the reserved module +name *note __future__: 0. Nested scopes can be enabled by the following +statement: + + from __future__ import nested_scopes + +While it looks like a normal *note import: 1af. 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 ‘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. + +See also +........ + +PEP 236(1) - Back to the *note __future__: 0. + + Written by Tim Peters, and primarily implemented by Jeremy Hylton. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0236/ + + +File: python.info, Node: PEP 207 Rich Comparisons, Next: PEP 230 Warning Framework, Prev: PEP 236 __future__ Directives, Up: What’s New in Python 2 1 + +1.19.4 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 ‘__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 ‘<’, +‘<=’, ‘>’, ‘>=’, ‘==’, and ‘!=’ operations. The new magic method names +are: + +Operation Method name + +------------------------------------- + +‘<’ ‘__lt__()’ + + +‘<=’ ‘__le__()’ + + +‘>’ ‘__gt__()’ + + +‘>=’ ‘__ge__()’ + + +‘==’ ‘__eq__()’ + + +‘!=’ ‘__ne__()’ + + +(The magic methods are named after the corresponding Fortran operators +‘.LT.’. ‘.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 ‘method(self, other)’, where +‘self’ will be the object on the left-hand side of the operator, while +‘other’ will be the object on the right-hand side. For example, the +expression ‘A < B’ will cause ‘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 ‘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 ‘"<"’, ‘"<="’, +‘">"’, ‘">="’, ‘"=="’, or ‘"!="’. If called without the optional third +argument, ‘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 ‘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 PEP 207(1), or to 2.1’s C API documentation, for the +full list of related functions. + +See also +........ + +PEP 207(2) - Rich Comparisons + + Written by Guido van Rossum, heavily based on earlier work by David + Ascher, and implemented by Guido van Rossum. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0207/ + + (2) https://peps.python.org/pep-0207/ + + +File: python.info, Node: PEP 230 Warning Framework, Next: PEP 229 New Build System, Prev: PEP 207 Rich Comparisons, Up: What’s New in Python 2 1 + +1.19.5 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 *note warnings: 130. 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 ‘regex’ module is deprecated, so +importing it causes a warning to be printed: + + >>> import regex + __main__:1: DeprecationWarning: the regex module + is deprecated; please use the re module + >>> + +Warnings can be issued by calling the *note warnings.warn(): 1152. +function: + + warnings.warn("feature X no longer supported") + +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 +‘regex’ module and not want to spare the time to convert it to use the +*note re: da. module right now. The warning can be suppressed by +calling + + import warnings + warnings.filterwarnings(action = 'ignore', + message='.*regex module is deprecated', + category=DeprecationWarning, + module = '__main__') + +This adds a filter that will apply only to warnings of the class *note +DeprecationWarning: 2d4. triggered in the *note __main__: 1. module, and +applies a regular expression to only match the message about the ‘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. + +See also +........ + +PEP 5(1) - 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. + +PEP 230(2) - Warning Framework + + Written and implemented by Guido van Rossum. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0005/ + + (2) https://peps.python.org/pep-0230/ + + +File: python.info, Node: PEP 229 New Build System, Next: PEP 205 Weak References, Prev: PEP 230 Warning Framework, Up: What’s New in Python 2 1 + +1.19.6 PEP 229: New Build System +-------------------------------- + +When compiling Python, the user had to go in and edit the +‘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 ‘Modules/Setup’ file in order to enable +modules, a ‘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 ‘Modules/Setup’, the ‘setup.py’ +script won’t attempt to compile that module and will defer to the +‘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 +‘Python/’, ‘Parser/’, ‘Objects/’, and ‘Modules/’ subdirectories. This +makes building Python faster and also makes hacking the Makefiles +clearer and simpler. + +See also +........ + +PEP 229(1) - Using Distutils to Build Python + + Written and implemented by A.M. Kuchling. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0229/ + + +File: python.info, Node: PEP 205 Weak References, Next: PEP 232 Function Attributes, Prev: PEP 229 New Build System, Up: What’s New in Python 2 1 + +1.19.7 PEP 205: Weak References +------------------------------- + +Weak references, available through the *note weakref: 132. 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 ‘f(x)’ by storing the function’s argument and its +result in a dictionary: + + _cache = {} + def memoize(x): + if _cache.has_key(x): + return _cache[x] + + retval = f(x) + + # Cache the returned object + _cache[x] = retval + + return retval + +This version works for simple things such as integers, but it has a side +effect; the ‘_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 ‘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 ‘wr = +weakref.ref(obj)’. The object being referred to is returned by calling +the weak reference as if it were a function: ‘wr()’. It will return the +referenced object, or ‘None’ if the object no longer exists. + +This makes it possible to write a ‘memoize()’ function whose cache +doesn’t keep objects alive, by storing weak references in the cache. + + _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 + +The *note weakref: 132. 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 +‘weakref.ReferenceError’ exception to be raised. + + proxy = weakref.proxy(obj) + proxy.attr # Equivalent to obj.attr + proxy.meth() # Equivalent to obj.meth() + del obj + proxy.attr # raises weakref.ReferenceError + +See also +........ + +PEP 205(1) - Weak References + + Written and implemented by Fred L. Drake, Jr. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0205/ + + +File: python.info, Node: PEP 232 Function Attributes, Next: PEP 235 Importing Modules on Case-Insensitive Platforms, Prev: PEP 205 Weak References, Up: What’s New in Python 2 1 + +1.19.8 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 ‘__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: + + def f(): pass + + f.publish = 1 + f.secure = 1 + f.grammar = "A ::= B (C D)*" + +The dictionary containing attributes can be accessed as the function’s +*note __dict__: 8ce. Unlike the *note __dict__: 8ce. attribute of class +instances, in functions you can actually assign a new dictionary to +*note __dict__: 8ce, though the new value is restricted to a regular +Python dictionary; you `can’t' be tricky and set it to a ‘UserDict’ +instance, or any other random object that behaves like a mapping. + +See also +........ + +PEP 232(1) - Function Attributes + + Written and implemented by Barry Warsaw. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0232/ + + +File: python.info, Node: PEP 235 Importing Modules on Case-Insensitive Platforms, Next: PEP 217 Interactive Display Hook, Prev: PEP 232 Function Attributes, Up: What’s New in Python 2 1 + +1.19.9 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 ‘FILE.PY’ and ‘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 *note import: 1af. 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 *note +ImportError: 511. if no such file is found, so ‘import file’ will not +import a module named ‘FILE.PY’. Case-insensitive matching can be +requested by setting the *note PYTHONCASEOK: 5ae. environment variable +before starting the Python interpreter. + + +File: python.info, Node: PEP 217 Interactive Display Hook, Next: PEP 208 New Coercion Model, Prev: PEP 235 Importing Modules on Case-Insensitive Platforms, Up: What’s New in Python 2 1 + +1.19.10 PEP 217: Interactive Display Hook +----------------------------------------- + +When using the Python interpreter interactively, the output of commands +is displayed using the built-in *note repr(): 3ee. function. In Python +2.1, the variable *note sys.displayhook(): 1158. can be set to a +callable object which will be called instead of *note repr(): 3ee. For +example, you can set it to a special pretty-printing function: + + >>> # 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, ] + >>> + +See also +........ + +PEP 217(1) - Display Hook for Interactive Use + + Written and implemented by Moshe Zadka. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0217/ + + +File: python.info, Node: PEP 208 New Coercion Model, Next: PEP 241 Metadata in Python Packages, Prev: PEP 217 Interactive Display Hook, Up: What’s New in Python 2 1 + +1.19.11 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 ‘Py_TPFLAGS_CHECKTYPES’ in +their ‘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 ‘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 +‘Py_NotImplemented’, then a *note TypeError: 19c. will be raised. +Numeric methods written in Python can also return ‘Py_NotImplemented’, +causing the interpreter to act as if the method did not exist (perhaps +raising a *note TypeError: 19c, perhaps trying another object’s numeric +methods). + +See also +........ + +PEP 208(1) - 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0208/ + + +File: python.info, Node: PEP 241 Metadata in Python Packages, Next: New and Improved Modules<4>, Prev: PEP 208 New Coercion Model, Up: What’s New in Python 2 1 + +1.19.12 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 ‘www.vex.net/parnassus/’ (retired in February 2009, +available in the Internet Archive Wayback Machine(1)) 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 ‘sdist’ command will include a file named +‘PKG-INFO’ containing information about the package such as its name, +version, and author (metadata, in cataloguing terminology). PEP 241(2) +contains the full list of fields that can be present in the ‘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 ‘sdist’ and ‘bdist_*’ commands could support an ‘upload’ +option that would automatically upload your package to a catalog server. + +You can start creating packages containing ‘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 PEP 241(3), as well as various +bugfixes and enhancements. It will be available from the Distutils SIG +at ‘https://www.python.org/community/sigs/current/distutils-sig/’. + +See also +........ + +PEP 241(4) - Metadata for Python Software Packages + + Written and implemented by A.M. Kuchling. + +PEP 243(5) - Module Repository Upload Mechanism + + Written by Sean Reifschneider, this draft PEP describes a proposed + mechanism for uploading Python packages to a central server. + + ---------- Footnotes ---------- + + (1) +https://web.archive.org/web/20090130140102/http://www.vex.net/parnassus/ + + (2) https://peps.python.org/pep-0241/ + + (3) https://peps.python.org/pep-0241/ + + (4) https://peps.python.org/pep-0241/ + + (5) https://peps.python.org/pep-0243/ + + +File: python.info, Node: New and Improved Modules<4>, Next: Other Changes and Fixes<4>, Prev: PEP 241 Metadata in Python Packages, Up: What’s New in Python 2 1 + +1.19.13 New and Improved Modules +-------------------------------- + + * Ka-Ping Yee contributed two new modules: ‘inspect.py’, a module for + getting information about live Python code, and ‘pydoc.py’, a + module for interactively converting docstrings to HTML or text. As + a bonus, ‘Tools/scripts/pydoc’, which is now automatically + installed, uses ‘pydoc.py’ to display documentation given a Python + module, package, or class name. For example, ‘pydoc xml.dom’ + displays the following: + + 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: + ... + + ‘pydoc’ also includes a Tk-based interactive help browser. ‘pydoc’ + quickly becomes addictive; try it out! + + * Two different modules for unit testing were added to the standard + library. The *note doctest: 63. 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 ‘http://pyunit.sourceforge.net/’ + for more information about PyUnit. + + * The *note difflib: 35. module contains a class, ‘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 ‘diff’ program, and + in fact the sample program ‘Tools/scripts/ndiff.py’ demonstrates + how to write such a script. + + * *note curses.panel: 2c, 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. + + * The PyXML package has gone through a few releases since Python 2.0, + and Python 2.1 includes an updated version of the *note xml: 13e. + 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 ‘minidom’ module. + + * Ping also contributed another hook for handling uncaught + exceptions. *note sys.excepthook(): 3fe. can be set to a callable + object. When an exception isn’t caught by any *note try: + 1073.…*note except: 17a. blocks, the exception will be passed to + *note sys.excepthook(): 3fe, 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. + + * Various functions in the *note time: 10c. module, such as + ‘asctime()’ and ‘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, ‘time.asctime()’ can be used, instead of the lengthier + ‘time.asctime(time.localtime(time.time()))’ that was previously + required. + + This change was proposed and implemented by Thomas Wouters. + + * The *note ftplib: 7e. 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 *note ftplib: 7e. 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 ‘set_pasv(0)’ on FTP objects to disable passive mode. + + * Support for raw socket access has been added to the *note socket: + ec. module, contributed by Grant Edwards. + + * The *note pstats: d1. 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. + + * A new implementation-dependent function, ‘sys._getframe([depth])’, + has been added to return a given frame object from the current call + stack. *note sys._getframe(): 115c. 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, ‘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. + + +File: python.info, Node: Other Changes and Fixes<4>, Next: Acknowledgements<7>, Prev: New and Improved Modules<4>, Up: What’s New in Python 2 1 + +1.19.14 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: + + * A specialized object allocator is now optionally available, that + should be faster than the system ‘malloc()’ and have less memory + overhead. The allocator uses C’s ‘malloc()’ function to get large + pools of memory, and then fulfills smaller memory requests from + these pools. It can be enabled by providing the ‘--with-pymalloc’ + option to the ‘configure’ script; see ‘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 ‘malloc()’ and ‘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 ‘malloc()’ and ‘free()’ any more, + and calling the wrong function to free memory will get you a core + dump. For example, if memory was allocated using ‘PyMem_New()’, it + has to be freed using ‘PyMem_Del()’, not ‘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. + + * 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 *note readline(): db. + 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 ‘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, ‘xreadlines()’, is + similar to the existing ‘xrange()’ built-in. ‘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 ‘readlines()’ method does. You’d + use it like this: + + for line in sys.stdin.xreadlines(): + # ... do something for each line ... + ... + + For a fuller discussion of the line I/O changes, see the python-dev + summary for January 1–15, 2001 at + ‘https://mail.python.org/pipermail/python-dev/2001-January/’. + + * A new method, ‘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. ‘D.popitem()’ + removes a random ‘(key, value)’ pair from the dictionary ‘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. + + * Modules can now control which names are imported when ‘from module + import *’ is used, by defining an ‘__all__’ attribute containing a + list of names that will be imported. One common complaint is that + if the module imports other modules such as *note sys: f9. or *note + string: f3, ‘from module import *’ will add them to the importing + module’s namespace. To fix this, simply list the public names in + ‘__all__’: + + # List public names + __all__ = ['Database', 'open'] + + 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. + + * Applying *note repr(): 3ee. to strings previously used octal + escapes for non-printable characters; for example, a newline was + ‘'\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 ‘\n’, ‘\t’, + ‘\r’ escapes for the appropriate characters, and implemented this + new formatting. + + * 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. + + * C extensions which import other modules have been changed to use + ‘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. + + * The size of the Unicode character database was shrunk by another + 340K thanks to Fredrik Lundh. + + * Some new ports were contributed: MacOS X (by Steven Majewski), + Cygwin (by Jason Tishler); RISCOS (by Dietmar Schwertberger); + Unixware 7 (by Billy G. Allie). + +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. + + +File: python.info, Node: Acknowledgements<7>, Prev: Other Changes and Fixes<4>, Up: What’s New in Python 2 1 + +1.19.15 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. + + +File: python.info, Node: What’s New in Python 2 0, Next: Changelog, Prev: What’s New in Python 2 1, Up: What’s New in Python + +1.20 What’s New in Python 2.0 +============================= + + +Author: A.M. Kuchling and Moshe Zadka + +* 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:: +* IDLE Improvements:: +* Deleted and Deprecated Modules:: +* Acknowledgements: Acknowledgements<8>. + + +File: python.info, Node: Introduction<3>, Next: What About Python 1 6?, Up: What’s New in Python 2 0 + +1.20.1 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. + + +File: python.info, Node: What About Python 1 6?, Next: New Development Process, Prev: Introduction<3>, Up: What’s New in Python 2 0 + +1.20.2 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. + + +File: python.info, Node: New Development Process, Next: Unicode<2>, Prev: What About Python 1 6?, Up: What’s New in Python 2 0 + +1.20.3 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 +‘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 PEP 1(1), “PEP Purpose and +Guidelines”: + + 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. + +Read the rest of PEP 1(2) 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 ‘https://peps.python.org/’. As of September +2000, there are 25 PEPS, ranging from PEP 201(3), “Lockstep Iteration”, +to PEP 225, “Elementwise/Objectwise Operators”. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0001/ + + (2) https://peps.python.org/pep-0001/ + + (3) https://peps.python.org/pep-0201/ + + +File: python.info, Node: Unicode<2>, Next: List Comprehensions, Prev: New Development Process, Up: What’s New in Python 2 0 + +1.20.4 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 PEP 100(1), “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 ‘u"string"’. +Arbitrary Unicode characters can be written using a new escape sequence, +‘\uHHHH’, where `HHHH' is a 4-digit hexadecimal number from 0000 to +FFFF. The existing ‘\xHHHH’ escape sequence can also be used, and octal +escapes can be used for characters up to U+01FF, which is represented by +‘\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 ‘encode( [encoding] )’ method that returns an +8-bit string in the desired encoding. Encodings are named by strings, +such as ‘'ascii'’, ‘'utf-8'’, ‘'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 +‘sys.setdefaultencoding(encoding)’ function in a customized version of +‘site.py’. + +Combining 8-bit and Unicode strings always coerces to Unicode, using the +default ASCII encoding; the result of ‘'a' + u'bc'’ is ‘u'abc'’. + +New built-in functions have been added, and existing built-ins modified +to support Unicode: + + * ‘unichr(ch)’ returns a Unicode string 1 character long, containing + the character `ch'. + + * ‘ord(u)’, where `u' is a 1-character regular or Unicode string, + returns the number of the character as an integer. + + * ‘unicode(string [, encoding] [, errors] )’ creates a Unicode string + from an 8-bit string. ‘encoding’ is a string naming the encoding + to use. The ‘errors’ parameter specifies the treatment of + characters that are invalid for the current encoding; passing + ‘'strict'’ as the value causes an exception to be raised on any + encoding error, while ‘'ignore'’ causes errors to be silently + ignored and ‘'replace'’ uses U+FFFD, the official replacement + character, in case of any problems. + + * The ‘exec’ statement, and various built-ins such as ‘eval()’, + ‘getattr()’, and ‘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.) + +A new module, *note unicodedata: 124, provides an interface to Unicode +character properties. For example, ‘unicodedata.category(u'A')’ returns +the 2-character string ‘Lu’, the ‘L’ denoting it’s a letter, and ‘u’ +meaning that it’s uppercase. ‘unicodedata.bidirectional(u'\u0660')’ +returns ‘AN’, meaning that U+0660 is an Arabic number. + +The *note codecs: 1a. 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 ‘codecs.lookup(encoding)’ function, +which returns a 4-element tuple: ‘(encode_func, decode_func, +stream_reader, stream_writer)’. + + * `encode_func' is a function that takes a Unicode string, and + returns a 2-tuple ‘(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. + + * `decode_func' is the opposite of `encode_func', taking an 8-bit + string and returning a 2-tuple ‘(ustring, length)’, consisting of + the resulting Unicode string `ustring' and the integer `length' + telling how much of the 8-bit string was consumed. + + * `stream_reader' is a class that supports decoding input from a + stream. `stream_reader(file_obj)' returns an object that supports + the ‘read()’, *note readline(): db, and ‘readlines()’ methods. + These methods will all translate from the given encoding and return + Unicode strings. + + * `stream_writer', similarly, is a class that supports encoding + output to a stream. `stream_writer(file_obj)' returns an object + that supports the ‘write()’ and ‘writelines()’ methods. These + methods expect Unicode strings, translating them to the given + encoding on output. + +For example, the following code writes a Unicode string into a file, +encoding it as UTF-8: + + 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() + +The following code would then read UTF-8 input from the file: + + input = UTF8_streamreader( open( '/tmp/output', 'rb') ) + print repr(input.read()) + input.close() + +Unicode-aware regular expressions are available through the *note re: +da. module, which has a new underlying implementation called SRE written +by Fredrik Lundh of Secret Labs AB. + +A ‘-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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0100/ + + +File: python.info, Node: List Comprehensions, Next: Augmented Assignment, Prev: Unicode<2>, Up: What’s New in Python 2 0 + +1.20.5 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 *note map(): 460. and *note filter(): 461. 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: + + # 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) + +Because of Python’s scoping rules, a default argument is used so that +the anonymous function created by the *note lambda: f4b. expression +knows what substring is being searched for. List comprehensions make +this cleaner: + + sublist = [ s for s in L if string.find(s, S) != -1 ] + +List comprehensions have the form: + + [ expression for expr in sequence1 + for expr2 in sequence2 ... + for exprN in sequenceN + if condition ] + +The ‘for’…‘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 ‘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: + + for expr1 in sequence1: + for expr2 in sequence2: + ... + for exprN in sequenceN: + if (condition): + # Append the value of + # the expression to the + # resulting list. + +This means that when there are multiple ‘for’…‘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: + + 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)] + +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: + + # Syntax error + [ x,y for x in seq1 for y in seq2] + # Correct + [ (x,y) for x in seq1 for y in seq2] + +The idea of list comprehensions originally comes from the functional +programming language Haskell (‘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. + + +File: python.info, Node: Augmented Assignment, Next: String Methods, Prev: List Comprehensions, Up: What’s New in Python 2 0 + +1.20.6 Augmented Assignment +--------------------------- + +Augmented assignment operators, another long-requested feature, have +been added to Python 2.0. Augmented assignment operators include ‘+=’, +‘-=’, ‘*=’, and so forth. For example, the statement ‘a += 2’ +increments the value of the variable ‘a’ by 2, equivalent to the +slightly lengthier ‘a = a + 2’. + +The full list of supported assignment operators is ‘+=’, ‘-=’, ‘*=’, +‘/=’, ‘%=’, ‘**=’, ‘&=’, ‘|=’, ‘^=’, ‘>>=’, and ‘<<=’. Python classes +can override the augmented assignment operators by defining methods +named ‘__iadd__()’, ‘__isub__()’, etc. For example, the following +‘Number’ class stores a number and supports using += to create a new +instance with an incremented value. + + 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 + +The ‘__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 ‘awk’, C++, +Java, Perl, and PHP also support them. The augmented assignment patch +was implemented by Thomas Wouters. + + +File: python.info, Node: String Methods, Next: Garbage Collection of Cycles, Prev: Augmented Assignment, Up: What’s New in Python 2 0 + +1.20.7 String Methods +--------------------- + +Until now string-manipulation functionality was in the *note string: f3. +module, which was usually a front-end for the ‘strop’ module written in +C. The addition of Unicode posed a difficulty for the ‘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 +‘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. + + >>> 'andrew'.capitalize() + 'Andrew' + >>> 'hostname'.replace('os', 'linux') + 'hlinuxtname' + >>> 'moshe'.find('sh') + 2 + +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 *note string: f3. 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 ‘startswith()’ and +‘endswith()’. ‘s.startswith(t)’ is equivalent to ‘s[:len(t)] == t’, +while ‘s.endswith(t)’ is equivalent to ‘s[-len(t):] == t’. + +One other method which deserves special mention is ‘join()’. The +‘join()’ method of a string receives one parameter, a sequence of +strings, and is equivalent to the ‘string.join()’ function from the old +*note string: f3. module, with the arguments reversed. In other words, +‘s.join(seq)’ is equivalent to the old ‘string.join(seq, s)’. + + +File: python.info, Node: Garbage Collection of Cycles, Next: Other Core Changes, Prev: String Methods, Up: What’s New in Python 2 0 + +1.20.8 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: + + instance = SomeClass() + instance.myself = instance + +After the above two lines of code have been executed, the reference +count of ‘instance’ is 2; one reference is from the variable named +‘'instance'’, and the other is from the ‘myself’ attribute of the +instance. + +If the next line of code is ‘del instance’, what happens? The reference +count of ‘instance’ is decreased by 1, so it has a reference count of 1; +the reference in the ‘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 *note gc: 80. 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 +‘--without-cycle-gc’ switch when running the ‘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”. + + +File: python.info, Node: Other Core Changes, Next: Porting to 2 0, Prev: Garbage Collection of Cycles, Up: What’s New in Python 2 0 + +1.20.9 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:: + + +File: python.info, Node: Minor Language Changes, Next: Changes to Built-in Functions, Up: Other Core Changes + +1.20.9.1 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 ‘apply()’ built-in function: ‘apply(f, +args, kw)’ calls the function ‘f()’ with the argument tuple `args' and +the keyword arguments in the dictionary `kw'. ‘apply()’ is the same in +2.0, but thanks to a patch from Greg Ewing, ‘f(*args, **kw)’ is a +shorter and clearer way to achieve the same effect. This syntax is +symmetrical with the syntax for defining functions: + + def f(*args, **kw): + # args is a tuple of positional args, + # kw is a dictionary of keyword args + ... + +The ‘print’ statement can now have its output directed to a file-like +object by following the ‘print’ with ‘>> file’, similar to the +redirection operator in Unix shells. Previously you’d either have to +use the ‘write()’ method of the file-like object, which lacks the +convenience and simplicity of ‘print’, or you could assign a new value +to ‘sys.stdout’ and then restore the old value. For sending output to +standard error, it’s much easier to write this: + + print >> sys.stderr, "Warning: action field not supplied" + +Modules can now be renamed on importing them, using the syntax ‘import +module as name’ or ‘from module import name as othername’. The patch +was submitted by Thomas Wouters. + +A new format style is available when using the ‘%’ operator; ‘%r’ will +insert the *note repr(): 3ee. of its argument. This was also added from +symmetry considerations, this time for symmetry with the existing ‘%s’ +format style, which inserts the *note str(): 1b3. of its argument. For +example, ‘'%r %s' % ('abc', 'abc')’ returns a string containing ‘'abc' +abc’. + +Previously there was no way to implement a class that overrode Python’s +built-in *note in: 20a. operator and implemented a custom version. ‘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 *note IndexError: 116b. is encountered. Moshe +Zadka contributed a patch which adds a ‘__contains__()’ magic method for +providing a custom implementation for ‘in’. Additionally, new built-in +objects written in C can define what ‘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: + + a = [] + b = [] + a.append(a) + b.append(b) + +The comparison ‘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 ‘cmp(a,b)’ would always produce +an answer, even if a user-defined ‘__cmp__()’ method encountered an +error, since the resulting exception would simply be silently swallowed. + +Work has been done on porting Python to 64-bit Windows on the Itanium +processor, mostly by Trent Mick of ActiveState. (Confusingly, +‘sys.platform’ is still ‘'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 +‘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 *note NameError: 396. 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 ‘print’ statement +in both 1.5.2 and 2.0; in 1.5.2 a *note NameError: 396. exception is +raised, while 2.0 raises a new *note UnboundLocalError: 116c. exception. +*note UnboundLocalError: 116c. is a subclass of *note NameError: 396, so +any existing code that expects *note NameError: 396. to be raised should +still work. + + def f(): + print "i=",i + i = i + 1 + f() + +Two new exceptions, *note TabError: 116d. and *note IndentationError: +393, have been introduced. They’re both subclasses of *note +SyntaxError: 2d6, and are raised when Python code is found to be +improperly indented. + + +File: python.info, Node: Changes to Built-in Functions, Prev: Minor Language Changes, Up: Other Core Changes + +1.20.9.2 Changes to Built-in Functions +...................................... + +A new built-in, ‘zip(seq1, seq2, ...)’, has been added. *note zip(): +3bc. returns a list of tuples where each tuple contains the i-th element +from each of the argument sequences. The difference between *note +zip(): 3bc. and ‘map(None, seq1, seq2)’ is that *note map(): 460. pads +the sequences with ‘None’ if the sequences aren’t all of the same +length, while *note zip(): 3bc. truncates the returned list to the +length of the shortest argument sequence. + +The *note int(): 1c7. and ‘long()’ functions now accept an optional +“base” parameter when the first argument is a string. ‘int('123', 10)’ +returns 123, while ‘int('123', 16)’ returns 291. ‘int(123, 16)’ raises +a *note TypeError: 19c. 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 *note sys: f9. module. ‘sys.version_info’ is a tuple ‘(major, +minor, micro, level, serial)’ For example, in a hypothetical 2.0.1beta1, +‘sys.version_info’ would be ‘(2, 0, 1, 'beta', 1)’. `level' is a string +such as ‘"alpha"’, ‘"beta"’, or ‘"final"’ for a final release. + +Dictionaries have an odd new method, ‘setdefault(key, default)’, which +behaves similarly to the existing ‘get()’ method. However, if the key +is missing, ‘setdefault()’ both returns the value of `default' as +‘get()’ would do, and also inserts it into the dictionary as the value +for `key'. Thus, the following lines of code: + + if dict.has_key( key ): return dict[key] + else: + dict[key] = [] + return dict[key] + +can be reduced to a single ‘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 *note +sys.getrecursionlimit(): 116f. and *note sys.setrecursionlimit(): 1170. +The default value is 1000, and a rough maximum value for a given +platform can be found by running a new script, +‘Misc/find_recursionlimit.py’. + + +File: python.info, Node: Porting to 2 0, Next: Extending/Embedding Changes, Prev: Other Core Changes, Up: What’s New in Python 2 0 + +1.20.10 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 ‘append()’ and ‘insert()’. In earlier versions of Python, if +‘L’ is a list, ‘L.append( 1,2 )’ appends the tuple ‘(1,2)’ to the list. +In Python 2.0 this causes a *note TypeError: 19c. 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: ‘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 ‘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 ‘Objects/listobject.c’ and define the +preprocessor symbol ‘NO_STRICT_LIST_APPEND’ to preserve the old +behaviour; this isn’t recommended. + +Some of the functions in the *note socket: ec. module are still +forgiving in this way. For example, ‘socket.connect( ('hostname', 25) +)()’ is the correct form, passing a tuple representing an IP address, +but ‘socket.connect( 'hostname', 25 )()’ also works. +‘socket.connect_ex()’ and ‘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 *note socket: ec. +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 ‘\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 ‘\x123456’ was equivalent to +‘\x56’. + +The *note AttributeError: 19d. and *note NameError: 396. exceptions have +a more friendly error message, whose text will be something like ‘'Spam' +instance has no attribute 'eggs'’ or ‘name 'eggs' is not defined’. +Previously the error message was just the missing attribute name ‘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 ‘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 *note +TypeError: 19c. 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; ‘3L * +'abc'’ produces ‘abcabcabc’, and ‘(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 ‘seek()’ method of file objects, +and in the formats supported by the ‘%’ operator (‘%d’, ‘%i’, ‘%x’, +etc.). For example, ‘"%d" % 2L**64’ will produce the string +‘18446744073709551616’. + +The subtlest long integer change of all is that the *note str(): 1b3. of +a long integer no longer has a trailing ‘L’ character, though *note +repr(): 3ee. 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 ‘str(longval)[:-1]’ and +assumes the ‘L’ is there, will now lose the final digit. + +Taking the *note repr(): 3ee. of a float now uses a different formatting +precision than *note str(): 1b3. *note repr(): 3ee. uses ‘%.17g’ format +string for C’s ‘sprintf()’, while *note str(): 1b3. uses ‘%.12g’ as +before. The effect is that *note repr(): 3ee. may occasionally show +more decimal places than *note str(): 1b3, for certain numbers. For +example, the number 8.1 can’t be represented exactly in binary, so +‘repr(8.1)’ is ‘'8.0999999999999996'’, while str(8.1) is ‘'8.1'’. + +The ‘-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 ‘exceptions’ module containing the +standard exceptions was translated from Python to a built-in C module, +written by Barry Warsaw and Fredrik Lundh. + + +File: python.info, Node: Extending/Embedding Changes, Next: Distutils Making Modules Easy to Install, Prev: Porting to 2 0, Up: What’s New in Python 2 0 + +1.20.11 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 +*note isinstance(): 3ab. and *note issubclass(): 3ac. This means you no +longer have to remember to write code such as ‘if type(obj) == +myExtensionClass’, but can use the more natural ‘if isinstance(obj, +myExtensionClass)’. + +The ‘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. ‘importdl.c’ is now quite small, and +platform-specific code has been moved into a bunch of +‘Python/dynload_*.c’ files. Another cleanup: there were also a number +of ‘my*.h’ files in the Include/ directory that held various portability +hacks; they’ve been merged into a single file, ‘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 ‘malloc()’. For documentation, read the +comments in ‘Include/pymem.h’ and ‘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 ‘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 +‘2**16’ to ‘2**32’. + +Three new convenience functions intended for adding constants to a +module’s dictionary at module initialization time were added: +‘PyModule_AddObject()’, ‘PyModule_AddIntConstant()’, and +‘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. ‘PyOS_getsig()’ +gets a signal handler and ‘PyOS_setsig()’ will set a new handler. + + +File: python.info, Node: Distutils Making Modules Easy to Install, Next: XML Modules, Prev: Extending/Embedding Changes, Up: What’s New in Python 2 0 + +1.20.12 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 *note distutils: 37. 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 “‘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 ‘setup.py’ script. +For the simple case, when the software contains only .py files, a +minimal ‘setup.py’ can be just a few lines long: + + from distutils.core import setup + setup (name = "foo", version = "1.0", + py_modules = ["module1", "module2"]) + +The ‘setup.py’ file isn’t much more complicated if the software consists +of a few packages: + + from distutils.core import setup + setup (name = "foo", version = "1.0", + packages = ["package", "package.subpackage"]) + +A C extension can be the most complicated case; here’s an example taken +from the PyXML package: + + 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 ] ) + +The Distutils can also take care of creating source and binary +distributions. The “sdist” command, run by “‘python setup.py sdist’’, +builds a source distribution such as ‘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 ‘.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. + + +File: python.info, Node: XML Modules, Next: Module changes, Prev: Distutils Making Modules Easy to Install, Up: What’s New in Python 2 0 + +1.20.13 XML Modules +------------------- + +Python 1.5.2 included a simple XML parser in the form of the ‘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 ‘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 *note +xml: 13e. 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:: + + +File: python.info, Node: SAX2 Support, Next: DOM Support, Up: XML Modules + +1.20.13.1 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 ‘startElement()’ and +‘endElement()’ methods are called for every starting and end tag +encountered by the parser, the ‘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 +‘hamlet.xml’ using it: + + 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' ) + +For more information, consult the Python documentation, or the XML HOWTO +at ‘http://pyxml.sourceforge.net/topics/howto/xml-howto.html’. + + +File: python.info, Node: DOM Support, Next: Relationship to PyXML, Prev: SAX2 Support, Up: XML Modules + +1.20.13.2 DOM Support +..................... + +The Document Object Model is a tree-based representation for an XML +document. A top-level ‘Document’ instance is the root of the tree, and +has a single child which is the top-level ‘Element’ instance. This +‘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 ‘’…‘’ to a file. + +The DOM implementation included with Python lives in the *note +xml.dom.minidom: 140. module. It’s a lightweight implementation of the +Level 1 DOM with support for XML namespaces. The ‘parse()’ and +‘parseString()’ convenience functions are provided for generating a DOM +tree: + + from xml.dom import minidom + doc = minidom.parse('hamlet.xml') + +‘doc’ is a ‘Document’ instance. ‘Document’, like all the other DOM +classes such as ‘Element’ and ‘Text’, is a subclass of the ‘Node’ base +class. All the nodes in a DOM tree therefore support certain common +methods, such as ‘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, ‘Element’ and ‘Document’ +instances have a method to find all child elements with a given tag +name. Continuing from the previous 2-line example: + + perslist = doc.getElementsByTagName( 'PERSONA' ) + print perslist[0].toxml() + print perslist[1].toxml() + +For the `Hamlet' XML file, the above few lines output: + + CLAUDIUS, king of Denmark. + HAMLET, son to the late, and nephew to the present king. + +The root element of the document is available as ‘doc.documentElement’, +and its children can be easily modified by deleting, adding, or removing +nodes: + + 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] ) + +Again, I will refer you to the Python documentation for a complete +listing of the different ‘Node’ classes and their various methods. + + +File: python.info, Node: Relationship to PyXML, Prev: DOM Support, Up: XML Modules + +1.20.13.3 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 +‘https://www.python.org/community/sigs/current/xml-sig’. The PyXML +distribution also used the package name ‘xml’. If you’ve written +programs that used PyXML, you’re probably wondering about its +compatibility with the 2.0 *note xml: 13e. package. + +The answer is that Python 2.0’s *note xml: 13e. 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 *note xml: 13e. 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: + + * 4DOM, a full DOM implementation from FourThought, Inc. + + * The xmlproc validating parser, written by Lars Marius Garshol. + + * The ‘sgmlop’ parser accelerator module, written by Fredrik Lundh. + + +File: python.info, Node: Module changes, Next: New modules, Prev: XML Modules, Up: What’s New in Python 2 0 + +1.20.14 Module changes +---------------------- + +Lots of improvements and bugfixes were made to Python’s extensive +standard library; some of the affected modules include *note readline: +db, ‘ConfigParser’, *note cgi: 14, *note calendar: 13, *note posix: ce, +*note readline: db, ‘xmllib’, *note aifc: 4, ‘chunk, wave’, *note +random: d9, *note shelve: e4, and *note nntplib: be. Consult the CVS +logs for the exact patch-by-patch details. + +Brian Gallew contributed OpenSSL support for the *note socket: ec. +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 ‘Modules/Setup’ to include SSL support, which adds an +additional function to the *note socket: ec. module: ‘socket.ssl(socket, +keyfile, certfile)’, which takes a socket object and returns an SSL +socket. The ‘httplib’ and *note urllib: 127. modules were also changed +to support ‘https://’ URLs, though no one has implemented FTP or SMTP +over SSL. + +The ‘httplib’ module has been rewritten by Greg Stein to support +HTTP/1.1. Backward compatibility with the 1.5 version of ‘httplib’ is +provided, though using HTTP/1.1 features such as pipelining will require +rewriting code to use a different set of interfaces. + +The ‘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 +‘create_line’ and ‘create_polygon’ much faster, especially when using +lots of coordinates. + +The *note curses: 2a. 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 +*note re: da. 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. + + +File: python.info, Node: New modules, Next: IDLE Improvements, Prev: Module changes, Up: What’s New in Python 2 0 + +1.20.15 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. + + * *note atexit: b.: For registering functions to be called before the + Python interpreter exits. Code that currently sets ‘sys.exitfunc’ + directly should be changed to use the *note atexit: b. module + instead, importing *note atexit: b. and calling *note + atexit.register(): 4a0. with the function to be called on exit. + (Contributed by Skip Montanaro.) + + * *note codecs: 1a, ‘encodings’, *note unicodedata: 124.: Added as + part of the new Unicode support. + + * *note filecmp: 7a.: Supersedes the old ‘cmp’, ‘cmpcache’ and + ‘dircmp’ modules, which have now become deprecated. (Contributed + by Gordon MacMillan and Moshe Zadka.) + + * *note gettext: 83.: 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.) + + * ‘linuxaudiodev’: Support for the ‘/dev/audio’ device on Linux, a + twin to the existing ‘sunaudiodev’ module. (Contributed by Peter + Bosch, with fixes by Jeremy Hylton.) + + * *note mmap: b1.: 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 *note re: da. + module. (Contributed by Sam Rushing, with some extensions by A.M. + Kuchling.) + + * ‘pyexpat’: An interface to the Expat XML parser. (Contributed by + Paul Prescod.) + + * ‘robotparser’: Parse a ‘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 ‘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.) + + * *note tabnanny: fc.: A module/script to check Python source code + for ambiguous indentation. (Contributed by Tim Peters.) + + * ‘UserString’: A base class useful for deriving objects that behave + like strings. + + * *note webbrowser: 133.: 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 *note urllib: 127. which added similar functionality, but + the final module comes from code originally implemented by Fred + Drake as ‘Tools/idle/BrowserControl.py’, and adapted for the + standard library by Fred.) + + * ‘_winreg’: An interface to the Windows registry. ‘_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. ‘_winreg’ was written by Bill Tutt and Mark + Hammond. + + * *note zipfile: 14d.: A module for reading and writing ZIP-format + archives. These are archives produced by ‘PKZIP’ on DOS/Windows or + ‘zip’ on Unix, not to be confused with ‘gzip’-format files (which + are supported by the *note gzip: 87. module) (Contributed by James + C. Ahlstrom.) + + * ‘imputil’: A module that provides a simpler way for writing + customized import hooks, in comparison to the existing ‘ihooks’ + module. (Implemented by Greg Stein, with much discussion on + python-dev along the way.) + + +File: python.info, Node: IDLE Improvements, Next: Deleted and Deprecated Modules, Prev: New modules, Up: What’s New in Python 2 0 + +1.20.16 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: + + * UI improvements and optimizations, especially in the area of syntax + highlighting and auto-indentation. + + * The class browser now shows more information, such as the top level + functions in a module. + + * Tab width is now a user settable option. When opening an existing + Python file, IDLE automatically detects the indentation + conventions, and adapts. + + * There is now support for calling browsers on various platforms, + used to open the Python documentation in a browser. + + * IDLE now has a command line, which is largely similar to the + vanilla Python interpreter. + + * Call tips were added in many places. + + * IDLE can now be installed as a package. + + * In the editor window, there is now a line/column bar at the bottom. + + * Three new keystroke commands: Check module (‘Alt-F5’), Import + module (‘F5’) and Run script (‘Ctrl-F5’). + + +File: python.info, Node: Deleted and Deprecated Modules, Next: Acknowledgements<8>, Prev: IDLE Improvements, Up: What’s New in Python 2 0 + +1.20.17 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 ‘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 ‘lib-old’ subdirectory: +‘cmp’, ‘cmpcache’, ‘dircmp’, ‘dump’, ‘find’, ‘grep’, ‘packmail’, ‘poly’, +‘util’, ‘whatsound’, ‘zmod’. If you have code which relies on a module +that’s been moved to ‘lib-old’, you can simply add that directory to +‘sys.path’ to get them back, but you’re encouraged to update any code +that uses these modules. + + +File: python.info, Node: Acknowledgements<8>, Prev: Deleted and Deprecated Modules, Up: What’s New in Python 2 0 + +1.20.18 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. + +The “Changelog” is an HTML version of the file built(1) from the +contents of the Misc/NEWS.d(2) directory tree, which contains `all' +nontrivial changes to Python for the current version. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/blurb + + (2) https://github.com/python/cpython/tree/3.11/Misc/NEWS.d + + +File: python.info, Node: Changelog, Prev: What’s New in Python 2 0, Up: What’s New in Python + +1.21 Changelog +============== + +* Menu: + +* Python 3.11.0 final: Python 3 11 0 final. +* Python 3.11.0 release candidate 2: Python 3 11 0 release candidate 2. +* Python 3.11.0 release candidate 1: Python 3 11 0 release candidate 1. +* Python 3.11.0 beta 5: Python 3 11 0 beta 5. +* Python 3.11.0 beta 4: Python 3 11 0 beta 4. +* Python 3.11.0 beta 3: Python 3 11 0 beta 3. +* Python 3.11.0 beta 2: Python 3 11 0 beta 2. +* 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. + + +File: python.info, Node: Python 3 11 0 final, Next: Python 3 11 0 release candidate 2, Up: Changelog + +1.21.1 Python 3.11.0 final +-------------------------- + +`Release date: 2022-10-24' + +* Menu: + +* Security:: +* Core and Builtins:: +* Library:: +* Documentation: Documentation<2>. +* Tests:: +* Build:: +* Windows:: +* macOS:: + + +File: python.info, Node: Security, Next: Core and Builtins, Up: Python 3 11 0 final + +1.21.1.1 Security +................. + + - gh-97616(1): Fix multiplying a list by an integer (‘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. + + - gh-97514(2): On Linux the *note multiprocessing: b5. 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 *note “forkserver” + start method: c04. is affected. + + Abstract sockets have no permissions and could allow any user on + the system in the same network namespace(3) (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 CVE-2022-42919(4). + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/97616 + + (2) https://github.com/python/cpython/issues/97514 + + (3) https://man7.org/linux/man-pages/man7/network_namespaces.7.html + + (4) https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-42919 + + +File: python.info, Node: Core and Builtins, Next: Library, Prev: Security, Up: Python 3 11 0 final + +1.21.1.2 Core and Builtins +.......................... + + - gh-97002(1): 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. + + - gh-97752(2): Fix possible data corruption or crashes when accessing + the ‘f_back’ member of newly-created generator or coroutine frames. + + - gh-96975(3): Fix a crash occurring when *note PyEval_GetFrame(): + 1182. is called while the topmost Python frame is in a + partially-initialized state. + + - gh-96848(4): Fix command line parsing: reject *note -X + int_max_str_digits: 174. option with no value (invalid) when the + *note PYTHONINTMAXSTRDIGITS: 1183. environment variable is set to a + valid limit. Patch by Victor Stinner. + + - gh-96821(5): Fix undefined behaviour in ‘_testcapimodule.c’. + + - gh-95778(6): When *note ValueError: 1c8. is raised if an integer is + larger than the limit, mention the *note + sys.set_int_max_str_digits(): 1184. function in the error message. + Patch by Victor Stinner. + + - gh-96587(7): Correctly raise ‘SyntaxError’ on exception groups ( + PEP 654(8)) on python versions prior to 3.11 + + - bpo-42316(9): Document some places where an assignment expression + needs parentheses. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/97002 + + (2) https://github.com/python/cpython/issues/97752 + + (3) https://github.com/python/cpython/issues/96975 + + (4) https://github.com/python/cpython/issues/96848 + + (5) https://github.com/python/cpython/issues/96821 + + (6) https://github.com/python/cpython/issues/95778 + + (7) https://github.com/python/cpython/issues/96587 + + (8) https://peps.python.org/pep-0654/ + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42316 + + +File: python.info, Node: Library, Next: Documentation<2>, Prev: Core and Builtins, Up: Python 3 11 0 final + +1.21.1.3 Library +................ + + - gh-98331(1): Update the bundled copies of pip and setuptools to + versions 22.3 and 65.5.0 respectively. + + - gh-90985(2): Earlier in 3.11 we deprecated + ‘asyncio.Task.cancel("message")’. We realized we were too harsh, + and have undeprecated it. + + - gh-97545(3): Make Semaphore run faster. + + - gh-96865(4): 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 -> + + - gh-90155(5): Fix broken *note asyncio.Semaphore: 6c6. when acquire + is cancelled. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/98331 + + (2) https://github.com/python/cpython/issues/90985 + + (3) https://github.com/python/cpython/issues/97545 + + (4) https://github.com/python/cpython/issues/96865 + + (5) https://github.com/python/cpython/issues/90155 + + +File: python.info, Node: Documentation<2>, Next: Tests, Prev: Library, Up: Python 3 11 0 final + +1.21.1.4 Documentation +...................... + + - gh-97741(1): Fix ‘!’ in c domain ref target syntax via a ‘conf.py’ + patch, so it works as intended to disable ref target resolution. + + - gh-93031(2): Update tutorial introduction output to use 3.10+ + SyntaxError invalid range. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/97741 + + (2) https://github.com/python/cpython/issues/93031 + + +File: python.info, Node: Tests, Next: Build, Prev: Documentation<2>, Up: Python 3 11 0 final + +1.21.1.5 Tests +.............. + + - gh-95027(1): On Windows, when the Python test suite is run with the + ‘-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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95027 + + +File: python.info, Node: Build, Next: Windows, Prev: Tests, Up: Python 3 11 0 final + +1.21.1.6 Build +.............. + + - gh-96729(1): Ensure that Windows releases built with + ‘Tools\msi\buildrelease.bat’ are upgradable to and from official + Python releases. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/96729 + + +File: python.info, Node: Windows, Next: macOS, Prev: Build, Up: Python 3 11 0 final + +1.21.1.7 Windows +................ + + - gh-98360(1): Fixes *note multiprocessing: b5. spawning child + processes on Windows from a virtual environment to ensure that + child processes that also use *note multiprocessing: b5. to spawn + more children will recognize that they are in a virtual + environment. + + - gh-98414(2): Fix ‘py.exe’ launcher handling of ‘-V:/’ + option when default preferences have been set in environment + variables or configuration files. + + - gh-90989(3): Clarify some text in the Windows installer. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/98360 + + (2) https://github.com/python/cpython/issues/98414 + + (3) https://github.com/python/cpython/issues/90989 + + +File: python.info, Node: macOS, Prev: Windows, Up: Python 3 11 0 final + +1.21.1.8 macOS +.............. + + - gh-97897(1): The macOS 13 SDK includes support for the ‘mkfifoat’ + and ‘mknodat’ system calls. Using the ‘dir_fd’ option with either + *note os.mkfifo(): a0e. or *note os.mknod(): a0f. 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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/97897 + + +File: python.info, Node: Python 3 11 0 release candidate 2, Next: Python 3 11 0 release candidate 1, Prev: Python 3 11 0 final, Up: Changelog + +1.21.2 Python 3.11.0 release candidate 2 +---------------------------------------- + +`Release date: 2022-09-11' + +* Menu: + +* Security: Security<2>. +* Core and Builtins: Core and Builtins<2>. +* Library: Library<2>. +* Documentation: Documentation<3>. +* Tests: Tests<2>. +* Build: Build<2>. +* Windows: Windows<2>. + + +File: python.info, Node: Security<2>, Next: Core and Builtins<2>, Up: Python 3 11 0 release candidate 2 + +1.21.2.1 Security +................. + + - gh-95778(1): Converting between *note int: 1c7. and *note str: 1b3. + in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or + 32 such as base 10 (decimal) now raises a *note ValueError: 1c8. 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 CVE-2020-10735(2). + + This new limit can be configured or disabled by environment + variable, command line flag, or *note sys: f9. APIs. See the *note + integer string conversion length limitation: 1c9. documentation. + The default limit is 4300 digits in string form. + + Patch by Gregory P. Smith [Google] and Christian Heimes [Red Hat] + with feedback from Victor Stinner, Thomas Wouters, Steve Dower, Ned + Deily, and Mark Dickinson. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95778 + + (2) https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735 + + +File: python.info, Node: Core and Builtins<2>, Next: Library<2>, Prev: Security<2>, Up: Python 3 11 0 release candidate 2 + +1.21.2.2 Core and Builtins +.......................... + + - gh-96678(1): Fix case of undefined behavior in ceval.c + + - gh-96641(2): Do not expose ‘KeyWrapper’ in ‘_functools’. + + - gh-96636(3): Ensure that tracing, ‘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 ‘__del__’ method + or interrupt. + + - gh-96572(4): Fix use after free in trace refs build mode. Patch by + Kumar Aditya. + + - gh-96611(5): When loading a file with invalid UTF-8 inside a + multi-line string, a correct SyntaxError is emitted. + + - gh-96612(6): Make sure that incomplete frames do not show up in + tracemalloc traces. + + - gh-96569(7): Remove two cases of undefined behavior, by adding NULL + checks. + + - gh-96582(8): Fix possible ‘NULL’ pointer dereference in + ‘_PyThread_CurrentFrames’. Patch by Kumar Aditya. + + - gh-96352(9): Fix *note AttributeError: 19d. missing ‘name’ and + ‘obj’ attributes in *note object.__getattribute__(): 839. Patch by + Philip Georgi. + + - gh-96268(10): Loading a file with invalid UTF-8 will now report the + broken character at the correct location. + + - gh-96187(11): Fixed a bug that caused ‘_PyCode_GetExtra’ to return + garbage for negative indexes. Patch by Pablo Galindo + + - gh-96071(12): Fix a deadlock in *note PyGILState_Ensure(): 6e5. + when allocating new thread state. Patch by Kumar Aditya. + + - gh-96046(13): *note PyType_Ready(): 350. now initializes + ‘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. + + - gh-95818(14): Skip over incomplete frames in *note + PyThreadState_GetFrame(): 361. + + - gh-95876(15): Fix format string in + ‘_PyPegen_raise_error_known_location’ that can lead to memory + corruption on some 64bit systems. The function was building a + tuple with ‘i’ (int) instead of ‘n’ (Py_ssize_t) for Py_ssize_t + arguments. + + - gh-95605(16): Fix misleading contents of error message when + converting an all-whitespace string to *note float: 3ca. + + - gh-94996(17): *note ast.parse(): 619. will no longer parse function + definitions with positional-only params when passed + ‘feature_version’ less than ‘(3, 8)’. Patch by Shantanu Jain. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/96678 + + (2) https://github.com/python/cpython/issues/96641 + + (3) https://github.com/python/cpython/issues/96636 + + (4) https://github.com/python/cpython/issues/96572 + + (5) https://github.com/python/cpython/issues/96611 + + (6) https://github.com/python/cpython/issues/96612 + + (7) https://github.com/python/cpython/issues/96569 + + (8) https://github.com/python/cpython/issues/96582 + + (9) https://github.com/python/cpython/issues/96352 + + (10) https://github.com/python/cpython/issues/96268 + + (11) https://github.com/python/cpython/issues/96187 + + (12) https://github.com/python/cpython/issues/96071 + + (13) https://github.com/python/cpython/issues/96046 + + (14) https://github.com/python/cpython/issues/95818 + + (15) https://github.com/python/cpython/issues/95876 + + (16) https://github.com/python/cpython/issues/95605 + + (17) https://github.com/python/cpython/issues/94996 + + +File: python.info, Node: Library<2>, Next: Documentation<3>, Prev: Core and Builtins<2>, Up: Python 3 11 0 release candidate 2 + +1.21.2.3 Library +................ + + - gh-96700(1): Fix incorrect error message in the *note io: 9f. + module. + + - gh-96652(2): Fix the faulthandler implementation of + ‘faulthandler.register(signal, chain=True)’ if the ‘sigaction()’ + function is not available: don’t call the previous signal handler + if it’s NULL. Patch by Victor Stinner. + + - gh-68163(3): Correct conversion of *note numbers.Rational: f6d.’s + to *note float: 3ca. + + - gh-96385(4): Fix ‘TypeVarTuple.__typing_prepare_subst__’. + ‘TypeError’ was not raised when using more than one ‘TypeVarTuple’, + like ‘[*T, *V]’ in type alias substitutions. + + - gh-90467(5): Fix ‘asyncio.streams.StreamReaderProtocol’ to keep a + strong reference to the created task, so that it’s not garbage + collected + + - gh-96159(6): Fix a performance regression in logging + TimedRotatingFileHandler. Only check for special files when the + rollover time has passed. + + - gh-96175(7): Fix unused ‘localName’ parameter in the ‘Attr’ class + in *note xml.dom.minidom: 140. + + - gh-96125(8): Fix incorrect condition that causes + ‘sys.thread_info.name’ to be wrong on pthread platforms. + + - gh-95463(9): Remove an incompatible change from bpo-28080(10) that + caused a regression that ignored the utf8 in ‘ZipInfo.flag_bits’. + Patch by Pablo Galindo. + + - gh-95899(11): Fix *note asyncio.Runner: 1d6. to call *note + asyncio.set_event_loop(): 118f. only once to avoid calling *note + attach_loop(): 1190. multiple times on child watchers. Patch by + Kumar Aditya. + + - gh-95736(12): Fix *note unittest.IsolatedAsyncioTestCase: 284. to + set event loop before calling setup functions. Patch by Kumar + Aditya. + + - gh-95704(13): When a task catches *note asyncio.CancelledError: + 61b. and raises some other error, the other error should generally + not silently be suppressed. + + - gh-95231(14): Fail gracefully if *note EPERM: 1191. or *note + ENOSYS: 1192. is raised when loading *note crypt: 27. methods. + This may happen when trying to load ‘MD5’ on a Linux kernel with + FIPS (Federal Information Processing Standard) enabled. + + - gh-74116(15): Allow *note asyncio.StreamWriter.drain(): 1193. to be + awaited concurrently by multiple tasks. Patch by Kumar Aditya. + + - gh-92986(16): Fix *note ast.unparse(): 523. when ‘ImportFrom.level’ + is None + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/96700 + + (2) https://github.com/python/cpython/issues/96652 + + (3) https://github.com/python/cpython/issues/68163 + + (4) https://github.com/python/cpython/issues/96385 + + (5) https://github.com/python/cpython/issues/90467 + + (6) https://github.com/python/cpython/issues/96159 + + (7) https://github.com/python/cpython/issues/96175 + + (8) https://github.com/python/cpython/issues/96125 + + (9) https://github.com/python/cpython/issues/95463 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28080 + + (11) https://github.com/python/cpython/issues/95899 + + (12) https://github.com/python/cpython/issues/95736 + + (13) https://github.com/python/cpython/issues/95704 + + (14) https://github.com/python/cpython/issues/95231 + + (15) https://github.com/python/cpython/issues/74116 + + (16) https://github.com/python/cpython/issues/92986 + + +File: python.info, Node: Documentation<3>, Next: Tests<2>, Prev: Library<2>, Up: Python 3 11 0 release candidate 2 + +1.21.2.4 Documentation +...................... + + - gh-96098(1): Improve discoverability of the higher level + concurrent.futures module by providing clearer links from the lower + level threading and multiprocessing modules. + + - gh-95957(2): 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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/96098 + + (2) https://github.com/python/cpython/issues/95957 + + +File: python.info, Node: Tests<2>, Next: Build<2>, Prev: Documentation<3>, Up: Python 3 11 0 release candidate 2 + +1.21.2.5 Tests +.............. + + - gh-95243(1): 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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95243 + + +File: python.info, Node: Build<2>, Next: Windows<2>, Prev: Tests<2>, Up: Python 3 11 0 release candidate 2 + +1.21.2.6 Build +.............. + + - gh-94682(1): Build and test with OpenSSL 1.1.1q + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94682 + + +File: python.info, Node: Windows<2>, Prev: Build<2>, Up: Python 3 11 0 release candidate 2 + +1.21.2.7 Windows +................ + + - gh-96577(1): Fixes a potential buffer overrun in *note msilib: b3. + + - gh-96559(2): Fixes the Windows launcher not using the compatible + interpretation of default tags found in configuration files when no + tag was passed to the command. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/96577 + + (2) https://github.com/python/cpython/issues/96559 + + +File: python.info, Node: Python 3 11 0 release candidate 1, Next: Python 3 11 0 beta 5, Prev: Python 3 11 0 release candidate 2, Up: Changelog + +1.21.3 Python 3.11.0 release candidate 1 +---------------------------------------- + +`Release date: 2022-08-05' + +* Menu: + +* Core and Builtins: Core and Builtins<3>. +* Library: Library<3>. +* Documentation: Documentation<4>. +* Tests: Tests<3>. +* Build: Build<3>. +* Windows: Windows<3>. +* IDLE: IDLE<3>. +* C API:: + + +File: python.info, Node: Core and Builtins<3>, Next: Library<3>, Up: Python 3 11 0 release candidate 1 + +1.21.3.1 Core and Builtins +.......................... + + - gh-95150(1): 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. + + - gh-95355(2): ‘_PyPegen_Parser_New’ now properly detects token + memory allocation errors. Patch by Honglin Zhu. + + - gh-90081(3): Run Python code in tracer/profiler function at full + speed. Fixes slowdown in earlier versions of 3.11. + + - gh-95324(4): Emit a warning in debug mode if an object does not + call *note PyObject_GC_UnTrack(): 1140. before deallocation. Patch + by Pablo Galindo. + + - gh-95185(5): Prevented crashes in the AST constructor when + compiling some absurdly long expressions like ‘"+0"*1000000’. + *note RecursionError: 9e7. is now raised instead. Patch by Pablo + Galindo + + - gh-93351(6): *note ast.AST: 30f. node positions are now validated + when provided to *note compile(): 310. and other related functions. + If invalid positions are detected, a *note ValueError: 1c8. will be + raised. + + - gh-94938(7): Fix error detection in some builtin functions when + keyword argument name is an instance of a str subclass with + overloaded ‘__eq__’ and ‘__hash__’. Previously it could cause + SystemError or other undesired behavior. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95150 + + (2) https://github.com/python/cpython/issues/95355 + + (3) https://github.com/python/cpython/issues/90081 + + (4) https://github.com/python/cpython/issues/95324 + + (5) https://github.com/python/cpython/issues/95185 + + (6) https://github.com/python/cpython/issues/93351 + + (7) https://github.com/python/cpython/issues/94938 + + +File: python.info, Node: Library<3>, Next: Documentation<4>, Prev: Core and Builtins<3>, Up: Python 3 11 0 release candidate 1 + +1.21.3.2 Library +................ + + - gh-95609(1): Update bundled pip to 22.2.2. + + - gh-95289(2): Fix *note asyncio.TaskGroup: 1d0. to propagate + exception when *note asyncio.CancelledError: 61b. was replaced with + another exception by a context manger. Patch by Kumar Aditya and + Guido van Rossum. + + - gh-95339(3): Update bundled pip to 22.2.1. + + - gh-95045(4): Fix GC crash when deallocating ‘_lsprof.Profiler’ by + untracking it before calling any callbacks. Patch by Kumar Aditya. + + - gh-95097(5): Fix *note asyncio.run(): 1d7. for *note asyncio.Task: + 1e3. implementations without *note uncancel(): 1e2. method. Patch + by Kumar Aditya. + + - gh-93899(6): Fix check for existence of *note os.EFD_CLOEXEC: 119b, + *note os.EFD_NONBLOCK: 119c. and *note os.EFD_SEMAPHORE: 119d. + flags on older kernel versions where these flags are not present. + Patch by Kumar Aditya. + + - gh-95166(7): Fix *note concurrent.futures.Executor.map(): a65. to + cancel the currently waiting on future on an error - e.g. + TimeoutError or KeyboardInterrupt. + + - gh-95109(8): Ensure that timeouts scheduled with *note + asyncio.Timeout: 119e. that have already expired are delivered + promptly. + + - gh-91810(9): Suppress writing an XML declaration in open files in + ‘ElementTree.write()’ with ‘encoding='unicode'’ and + ‘xml_declaration=None’. + + - gh-91447(10): Fix findtext in the xml module to only give an empty + string when the text attribute is set to None. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95609 + + (2) https://github.com/python/cpython/issues/95289 + + (3) https://github.com/python/cpython/issues/95339 + + (4) https://github.com/python/cpython/issues/95045 + + (5) https://github.com/python/cpython/issues/95097 + + (6) https://github.com/python/cpython/issues/93899 + + (7) https://github.com/python/cpython/issues/95166 + + (8) https://github.com/python/cpython/issues/95109 + + (9) https://github.com/python/cpython/issues/91810 + + (10) https://github.com/python/cpython/issues/91447 + + +File: python.info, Node: Documentation<4>, Next: Tests<3>, Prev: Library<3>, Up: Python 3 11 0 release candidate 1 + +1.21.3.3 Documentation +...................... + + - gh-91207(1): Fix stylesheet not working in Windows CHM htmlhelp + docs and add warning that they are deprecated. Contributed by + C.A.M. Gerlach. + + - gh-95451(2): Update library documentation with *note availability + information: 11a0. on WebAssembly platforms ‘wasm32-emscripten’ and + ‘wasm32-wasi’. + + - gh-95415(3): Use consistent syntax for platform availability. The + directive now supports a content body and emits a warning when it + encounters an unknown platform. + + - gh-86128(4): Document a limitation in ThreadPoolExecutor where its + exit handler is executed before any handlers in atexit. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/91207 + + (2) https://github.com/python/cpython/issues/95451 + + (3) https://github.com/python/cpython/issues/95415 + + (4) https://github.com/python/cpython/issues/86128 + + +File: python.info, Node: Tests<3>, Next: Build<3>, Prev: Documentation<4>, Up: Python 3 11 0 release candidate 1 + +1.21.3.4 Tests +.............. + + - gh-95573(1): Lib/test/test_asyncio/test_ssl.py(2) exposed a bug in + the macOS kernel where intense concurrent load on non-blocking + sockets occasionally causes *note errno.ENOBUFS: 11a2. (“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. + + - gh-95280(3): Fix problem with ‘test_ssl’ ‘test_get_ciphers’ on + systems that require perfect forward secrecy (PFS) ciphers. + + - gh-94675(4): Add a regression test for *note re: da. exponentional + slowdown when using rjsmin. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95573 + + (2) +https://github.com/python/cpython/tree/3.11/Lib/test/test_asyncio/test_ssl.py + + (3) https://github.com/python/cpython/issues/95280 + + (4) https://github.com/python/cpython/issues/94675 + + +File: python.info, Node: Build<3>, Next: Windows<3>, Prev: Tests<3>, Up: Python 3 11 0 release candidate 1 + +1.21.3.5 Build +.............. + + - gh-94801(1): Fix a regression in ‘configure’ script that caused + some header checks to ignore custom ‘CPPFLAGS’. The regression was + introduced in gh-94802(2). + + - gh-95145(3): wasm32-wasi builds no longer depend on WASIX’s pthread + stubs. Python now has its own stubbed pthread API. + + - gh-95174(4): Python now detects missing ‘dup’ function in WASI and + works around some missing *note errno: 77, *note select: e2, and + *note socket: ec. constants. + + - gh-95174(5): Python now skips missing *note socket: ec. functions + and methods on WASI. WASI can only create sockets from existing fd + / accept and has no netdb. + + - gh-95085(6): Platforms ‘wasm32-unknown-emscripten’ and + ‘wasm32-unknown-wasi’ have been promoted to PEP 11(7) tier 3 + platform support. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94801 + + (2) https://github.com/python/cpython/issues/94802 + + (3) https://github.com/python/cpython/issues/95145 + + (4) https://github.com/python/cpython/issues/95174 + + (5) https://github.com/python/cpython/issues/95174 + + (6) https://github.com/python/cpython/issues/95085 + + (7) https://peps.python.org/pep-0011/ + + +File: python.info, Node: Windows<3>, Next: IDLE<3>, Prev: Build<3>, Up: Python 3 11 0 release candidate 1 + +1.21.3.6 Windows +................ + + - gh-95656(1): Enable the *note enable_load_extension(): 434. *note + sqlite3: ef. API. + + - gh-95587(2): Fixes some issues where the Windows installer would + incorrectly detect certain features of an existing install when + upgrading. + + - gh-94399(3): Restores the behaviour of *note Python Launcher for + Windows: 180. for ‘/usr/bin/env’ shebang lines, which will now + search ‘PATH’ for an executable matching the given command. If + none is found, the usual search process is used. + + - gh-95445(4): Fixes the unsuccessful removal of the HTML document + directory when uninstalling with Windows msi. + + - gh-95359(5): Fix *note Python Launcher for Windows: 180. handling + of ‘py.ini’ commands (it was incorrectly expecting a ‘py_’ prefix + on keys) and crashes when reading per-user configuration file. + + - gh-95285(6): Fix *note Python Launcher for Windows: 180. handling + of command lines where it is only passed a short executable name. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95656 + + (2) https://github.com/python/cpython/issues/95587 + + (3) https://github.com/python/cpython/issues/94399 + + (4) https://github.com/python/cpython/issues/95445 + + (5) https://github.com/python/cpython/issues/95359 + + (6) https://github.com/python/cpython/issues/95285 + + +File: python.info, Node: IDLE<3>, Next: C API, Prev: Windows<3>, Up: Python 3 11 0 release candidate 1 + +1.21.3.7 IDLE +............. + + - gh-65802(1): Document handling of extensions in Save As dialogs. + + - gh-95191(2): Include prompts when saving Shell (interactive input + and output). + + - gh-95511(3): Fix the Shell context menu copy-with-prompts bug of + copying an extra line when one selects whole lines. + + - gh-95471(4): In the Edit menu, move ‘Select All’ and add a new + separator. + + - gh-95411(5): Enable using IDLE’s module browser with .pyw files. + + - gh-89610(6): Add .pyi as a recognized extension for IDLE on macOS. + This allows opening stub files by double clicking on them in the + Finder. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/65802 + + (2) https://github.com/python/cpython/issues/95191 + + (3) https://github.com/python/cpython/issues/95511 + + (4) https://github.com/python/cpython/issues/95471 + + (5) https://github.com/python/cpython/issues/95411 + + (6) https://github.com/python/cpython/issues/89610 + + +File: python.info, Node: C API, Prev: IDLE<3>, Up: Python 3 11 0 release candidate 1 + +1.21.3.8 C API +.............. + + - gh-92678(1): Restore the 3.10 behavior for multiple inheritance of + C extension classes that store their dictionary at the end of the + struct. + + - gh-94936(2): Added *note PyCode_GetVarnames(): 34d, *note + PyCode_GetCellvars(): 34e. and *note PyCode_GetFreevars(): 34f. for + accessing ‘co_varnames’, ‘co_cellvars’ and ‘co_freevars’ + respectively via the C API. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/92678 + + (2) https://github.com/python/cpython/issues/94936 + + +File: python.info, Node: Python 3 11 0 beta 5, Next: Python 3 11 0 beta 4, Prev: Python 3 11 0 release candidate 1, Up: Changelog + +1.21.4 Python 3.11.0 beta 5 +--------------------------- + +`Release date: 2022-07-25' + +* Menu: + +* Core and Builtins: Core and Builtins<4>. +* Library: Library<4>. +* Tests: Tests<4>. +* Build: Build<4>. +* Windows: Windows<4>. +* C API: C API<2>. + + +File: python.info, Node: Core and Builtins<4>, Next: Library<4>, Up: Python 3 11 0 beta 5 + +1.21.4.1 Core and Builtins +.......................... + + - gh-93351(1): *note ast.AST: 30f. node positions are now validated + when provided to *note compile(): 310. and other related functions. + If invalid positions are detected, a *note ValueError: 1c8. will be + raised. + + - gh-94438(2): Fix an issue that caused extended opcode arguments and + some conditional pops to be ignored when calculating valid jump + targets for assignments to the ‘f_lineno’ attribute of frame + objects. In some cases, this could cause inconsistent internal + state, resulting in a hard crash of the interpreter. + + - gh-95060(3): Undocumented ‘PyCode_Addr2Location’ function now + properly returns when ‘addrq’ argument is less than zero. + + - gh-95113(4): Replace all ‘EXTENDED_ARG_QUICK’ instructions with + basic *note EXTENDED_ARG: 11a9. 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. + + - gh-91409(5): Fix incorrect source location info caused by certain + optimizations in the bytecode compiler. + + - gh-94036(6): Fix incorrect source location info for some multi-line + attribute accesses and method calls. + + - gh-94739(7): Allow jumping within, out of, and across exception + handlers in the debugger. + + - gh-94949(8): *note ast.parse(): 619. will no longer parse + parenthesized context managers when passed ‘feature_version’ less + than ‘(3, 9)’. Patch by Shantanu Jain. + + - gh-94947(9): *note ast.parse(): 619. will no longer parse + assignment expressions when passed ‘feature_version’ less than ‘(3, + 8)’. Patch by Shantanu Jain. + + - gh-91256(10): Ensures the program name is known for help text + during interpreter startup. + + - gh-94869(11): Fix the column offsets for some expressions in + multi-line f-strings *note ast: 7. nodes. Patch by Pablo Galindo. + + - gh-94822(12): Fix an issue where lookups of metaclass descriptors + may be ignored when an identically-named attribute also exists on + the class itself. + + - gh-91153(13): Fix an issue where a *note bytearray: 1a5. item + assignment could crash if it’s resized by the new value’s + ‘__index__()’ method. + + - gh-90699(14): Fix reference counting bug in ‘bool.__repr__()’. + Patch by Kumar Aditya. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/93351 + + (2) https://github.com/python/cpython/issues/94438 + + (3) https://github.com/python/cpython/issues/95060 + + (4) https://github.com/python/cpython/issues/95113 + + (5) https://github.com/python/cpython/issues/91409 + + (6) https://github.com/python/cpython/issues/94036 + + (7) https://github.com/python/cpython/issues/94739 + + (8) https://github.com/python/cpython/issues/94949 + + (9) https://github.com/python/cpython/issues/94947 + + (10) https://github.com/python/cpython/issues/91256 + + (11) https://github.com/python/cpython/issues/94869 + + (12) https://github.com/python/cpython/issues/94822 + + (13) https://github.com/python/cpython/issues/91153 + + (14) https://github.com/python/cpython/issues/90699 + + +File: python.info, Node: Library<4>, Next: Tests<4>, Prev: Core and Builtins<4>, Up: Python 3 11 0 beta 5 + +1.21.4.2 Library +................ + + - gh-95087(1): Fix IndexError in parsing invalid date in the *note + email: 64. module. + + - gh-95199(2): Upgrade bundled setuptools to 63.2.0. + + - gh-95194(3): Upgrade bundled pip to 22.2. + + - gh-95132(4): Fix a *note sqlite3: ef. regression where ‘*args’ and + ‘**kwds’ were incorrectly relayed from *note connect(): 7da. to the + *note Connection: 24c. factory. The regression was introduced in + 3.11a1 with PR 24421 (gh-85128(5)). Patch by Erlend E. Aasland.‘ + + - gh-93157(6): Fix *note fileinput: 7b. module didn’t support + ‘errors’ option when ‘inplace’ is true. + + - gh-95105(7): ‘wsgiref.types.InputStream.__iter__()’ should return + ‘Iterator[bytes]’, not ‘Iterable[bytes]’. Patch by Shantanu Jain. + + - gh-94857(8): Fix refleak in ‘_io.TextIOWrapper.reconfigure’. Patch + by Kumar Aditya. + + - gh-94821(9): Fix binding of unix socket to empty address on Linux + to use an available address from the abstract namespace, instead of + “0”. + + - gh-89988(10): Fix memory leak in *note pickle.Pickler: 66a. when + looking up ‘dispatch_table’. Patch by Kumar Aditya. + + - bpo-47025(11): Drop support for *note bytes: 1b4. on *note + sys.path: 162. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95087 + + (2) https://github.com/python/cpython/issues/95199 + + (3) https://github.com/python/cpython/issues/95194 + + (4) https://github.com/python/cpython/issues/95132 + + (5) https://github.com/python/cpython/issues/85128 + + (6) https://github.com/python/cpython/issues/93157 + + (7) https://github.com/python/cpython/issues/95105 + + (8) https://github.com/python/cpython/issues/94857 + + (9) https://github.com/python/cpython/issues/94821 + + (10) https://github.com/python/cpython/issues/89988 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=47025 + + +File: python.info, Node: Tests<4>, Next: Build<4>, Prev: Library<4>, Up: Python 3 11 0 beta 5 + +1.21.4.3 Tests +.............. + + - gh-95212(1): Make multiprocessing test case + ‘test_shared_memory_recreate’ parallel-safe. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/95212 + + +File: python.info, Node: Build<4>, Next: Windows<4>, Prev: Tests<4>, Up: Python 3 11 0 beta 5 + +1.21.4.4 Build +.............. + + - gh-94847(1): Fixed ‘_decimal’ module build issue on GCC when + compiling with LTO and pydebug. Debug builds no longer force + inlining of functions. + + - gh-94841(2): Fix the possible performance regression of *note + PyObject_Free(): 8d6. compiled with MSVC version 1932. + + - gh-94801(3): ‘configure’ now uses custom flags like ‘ZLIB_CFLAGS’ + and ‘ZLIB_LIBS’ when searching for headers and libraries. + + - gh-94773(4): ‘deepfreeze.py’ now supports code object with + frozensets that contain incompatible, unsortable types. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94847 + + (2) https://github.com/python/cpython/issues/94841 + + (3) https://github.com/python/cpython/issues/94801 + + (4) https://github.com/python/cpython/issues/94773 + + +File: python.info, Node: Windows<4>, Next: C API<2>, Prev: Build<4>, Up: Python 3 11 0 beta 5 + +1.21.4.5 Windows +................ + + - gh-90844(1): Allow virtual environments to correctly launch when + they have spaces in the path. + + - gh-94772(2): Fix incorrect handling of shebang lines in py.exe + launcher + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/90844 + + (2) https://github.com/python/cpython/issues/94772 + + +File: python.info, Node: C API<2>, Prev: Windows<4>, Up: Python 3 11 0 beta 5 + +1.21.4.6 C API +.............. + + - gh-92678(1): Adds unstable C-API functions + ‘_PyObject_VisitManagedDict’ and ‘_PyObject_ClearManagedDict’ to + allow C extensions to allow the VM to manage their object’s + dictionaries. + + - gh-94930(2): Fix ‘SystemError’ raised when *note + PyArg_ParseTupleAndKeywords(): 987. is used with ‘#’ in ‘(...)’ but + without ‘PY_SSIZE_T_CLEAN’ defined. + + - gh-94864(3): Fix ‘PyArg_Parse*’ with deprecated format units “u” + and “Z”. It returned 1 (success) when warnings are turned into + exceptions. + + - gh-94731(4): 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. ‘-Wold-style-cast `` or + ``-Wzero-as-null-pointer-constant’ options for ‘g++’. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/92678 + + (2) https://github.com/python/cpython/issues/94930 + + (3) https://github.com/python/cpython/issues/94864 + + (4) https://github.com/python/cpython/issues/94731 + + +File: python.info, Node: Python 3 11 0 beta 4, Next: Python 3 11 0 beta 3, Prev: Python 3 11 0 beta 5, Up: Changelog + +1.21.5 Python 3.11.0 beta 4 +--------------------------- + +`Release date: 2022-07-11' + +* Menu: + +* Security: Security<3>. +* Core and Builtins: Core and Builtins<5>. +* Library: Library<5>. +* Documentation: Documentation<5>. +* Tests: Tests<5>. +* Build: Build<5>. +* Windows: Windows<5>. +* Tools/Demos:: +* C API: C API<3>. + + +File: python.info, Node: Security<3>, Next: Core and Builtins<5>, Up: Python 3 11 0 beta 4 + +1.21.5.1 Security +................. + + - gh-87389(1): *note http.server: 92.: Fix an open redirection + vulnerability in the HTTP server when an URI path starts with ‘//’. + Vulnerability discovered, and initial fix proposed, by Hamza Avvan. + + - gh-79096(2): LWPCookieJar and MozillaCookieJar create files with + file mode 600 instead of 644 (Microsoft Windows is not affected) + + - gh-92888(3): Fix ‘memoryview’ use after free when accessing the + backing buffer in certain cases. + + - gh-68966(4): 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). + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/87389 + + (2) https://github.com/python/cpython/issues/79096 + + (3) https://github.com/python/cpython/issues/92888 + + (4) https://github.com/python/cpython/issues/68966 + + +File: python.info, Node: Core and Builtins<5>, Next: Library<5>, Prev: Security<3>, Up: Python 3 11 0 beta 4 + +1.21.5.2 Core and Builtins +.......................... + + - gh-94694(1): 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. + + - gh-93252(2): Fix an issue that caused internal frames to outlive + failed Python function calls, possibly resulting in memory leaks or + hard interpreter crashes. + + - gh-94215(3): 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. + + - gh-92228(4): 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. + + - gh-94485(5): Line number of a module’s ‘RESUME’ instruction is set + to 0 as specified in PEP 626(6). + + - gh-94438(7): Account for instructions that can push NULL to the + stack when setting line number in a frame. Prevents some + (unlikely) crashes. + + - gh-91719(8): Reload ‘opcode’ when raising ‘unknown opcode error’ in + the interpreter main loop, for C compilers to generate dispatching + code independently. + + - gh-94329(9): Compile and run code with unpacking of extremely large + sequences (1000s of elements). Such code failed to compile. It + now compiles and runs correctly. + + - gh-94360(10): Fixed a tokenizer crash when reading encoded files + with syntax errors from ‘stdin’ with non utf-8 encoded text. Patch + by Pablo Galindo + + - gh-88116(11): Fix an issue when reading line numbers from code + objects if the encoded line numbers are close to ‘INT_MIN’. Patch + by Pablo Galindo + + - gh-94262(12): 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. + + - gh-94192(13): Fix error for dictionary literals with invalid + expression as value. + + - gh-93883(14): Revise the display strategy of traceback enhanced + error locations. The indicators are only shown when the location + doesn’t span the whole line. + + - gh-94021(15): Fix unreachable code warning in + ‘Python/specialize.c’. + + - gh-93516(16): Store offset of first traceable instruction in code + object to avoid having to recompute it for each instruction when + tracing. + + - gh-93516(17): Lazily create a table mapping bytecode offsets to + line numbers to speed up calculation of line numbers when tracing. + + - gh-89828(18): *note types.GenericAlias: 3dd. no longer relays the + ‘__class__’ attribute. For example, ‘isinstance(list[int], type)’ + no longer returns ‘True’. + + - gh-93671(19): Fix some exponential backtrace case happening with + deeply nested sequence patterns in match statements. Patch by + Pablo Galindo + + - gh-93662(20): Make sure that the end column offsets are correct in + multi-line method calls. Previously, the end column could precede + the column offset. + + - gh-93461(21): *note importlib.invalidate_caches(): 87a. now drops + entries from *note sys.path_importer_cache: 1b2. with a relative + path as name. This solves a caching issue when a process changes + its current working directory. + + ‘FileFinder’ no longer inserts a dot in the path, e.g. + ‘/egg/./spam’ is now ‘/egg/spam’. + + - gh-93418(22): Fixed an assert where an f-string has an equal sign + ‘=’ following an expression, but there’s no trailing brace. For + example, f”{i=”. + + - gh-93382(23): Cache the result of *note PyCode_GetCode(): 34c. + function to restore the O(1) lookup of the ‘co_code’ attribute. + + - gh-93354(24): 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. + + - gh-93021(25): Fix the ‘__text_signature__’ for ‘__get__()’ methods + implemented in C. Patch by Jelle Zijlstra. + + - gh-92930(26): Fixed a crash in ‘_pickle.c’ from mutating + collections during ‘__reduce__’ or ‘persistent_id’. + + - gh-92914(27): Always round the allocated size for lists up to the + nearest even number. + + - gh-92858(28): Improve error message for some suites with syntax + error before ‘:’ + + - bpo-46142(29): Make ‘--help’ output shorter by moving some info to + the new ‘--help-env’ and ‘--help-xoptions’ command-line options. + Also add ‘--help-all’ option to print complete usage. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94694 + + (2) https://github.com/python/cpython/issues/93252 + + (3) https://github.com/python/cpython/issues/94215 + + (4) https://github.com/python/cpython/issues/92228 + + (5) https://github.com/python/cpython/issues/94485 + + (6) https://peps.python.org/pep-0626/ + + (7) https://github.com/python/cpython/issues/94438 + + (8) https://github.com/python/cpython/issues/91719 + + (9) https://github.com/python/cpython/issues/94329 + + (10) https://github.com/python/cpython/issues/94360 + + (11) https://github.com/python/cpython/issues/88116 + + (12) https://github.com/python/cpython/issues/94262 + + (13) https://github.com/python/cpython/issues/94192 + + (14) https://github.com/python/cpython/issues/93883 + + (15) https://github.com/python/cpython/issues/94021 + + (16) https://github.com/python/cpython/issues/93516 + + (17) https://github.com/python/cpython/issues/93516 + + (18) https://github.com/python/cpython/issues/89828 + + (19) https://github.com/python/cpython/issues/93671 + + (20) https://github.com/python/cpython/issues/93662 + + (21) https://github.com/python/cpython/issues/93461 + + (22) https://github.com/python/cpython/issues/93418 + + (23) https://github.com/python/cpython/issues/93382 + + (24) https://github.com/python/cpython/issues/93354 + + (25) https://github.com/python/cpython/issues/93021 + + (26) https://github.com/python/cpython/issues/92930 + + (27) https://github.com/python/cpython/issues/92914 + + (28) https://github.com/python/cpython/issues/92858 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=46142 + + +File: python.info, Node: Library<5>, Next: Documentation<5>, Prev: Core and Builtins<5>, Up: Python 3 11 0 beta 4 + +1.21.5.3 Library +................ + + - gh-94736(1): Fix crash when deallocating an instance of a subclass + of ‘_multiprocessing.SemLock’. Patch by Kumar Aditya. + + - gh-94637(2): ‘SSLContext.set_default_verify_paths()’ now releases + the GIL around ‘SSL_CTX_set_default_verify_paths’ call. The + function call performs I/O and CPU intensive work. + + - gh-94607(3): Fix subclassing complex generics with type variables + in *note typing: 123. Previously an error message saying ‘Some + type variables ... are not listed in Generic[...]’ was shown. + *note typing: 123. no longer populates ‘__parameters__’ with the + ‘__parameters__’ of a Python class. + + - gh-93910(4): The ability to access the other values of an enum on + an enum (e.g. ‘Color.RED.BLUE’) has been restored in order to fix + a performance regression. + + - gh-93896(5): Fix *note asyncio.run(): 1d7. and *note + unittest.IsolatedAsyncioTestCase: 284. to always the set event loop + as it was done in Python 3.10 and earlier. Patch by Kumar Aditya. + + - gh-94510(6): Re-entrant calls to *note sys.setprofile(): 1138. and + *note sys.settrace(): 1139. now raise *note RuntimeError: 6e9. + Patch by Pablo Galindo. + + - gh-92336(7): Fix bug where *note linecache.getline(): aa7. fails on + bad files with *note UnicodeDecodeError: 65c. or *note SyntaxError: + 2d6. It now returns an empty string as per the documentation. + + - gh-94398(8): Once a *note asyncio.TaskGroup: 1d0. 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. + + - gh-94254(9): Fixed types of *note struct: f5. module to be + immutable. Patch by Kumar Aditya. + + - gh-94207(10): Made ‘_struct.Struct’ GC-tracked in order to fix a + reference leak in the ‘_struct’ module. + + - gh-91742(11): Fix *note pdb: c6. crash after jump caused by a null + pointer dereference. Patch by Kumar Aditya. + + - gh-94101(12): Manual instantiation of *note ssl.SSLSession: 94c. + objects is no longer allowed as it lead to misconfigured instances + that crashed the interpreter when attributes where accessed on + them. + + - gh-84753(13): *note inspect.iscoroutinefunction(): a9a, *note + inspect.isgeneratorfunction(): 11b3, and *note + inspect.isasyncgenfunction(): 11b4. now properly return ‘True’ for + duck-typed function-like objects like instances of *note + unittest.mock.AsyncMock: 69a. + + This makes *note inspect.iscoroutinefunction(): a9a. consistent + with the behavior of ‘asyncio.iscoroutinefunction()’. Patch by + Mehdi ABAAKOUK. + + - gh-94028(14): Fix a regression in the *note sqlite3: ef. 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. + + - gh-93820(15): Pickle *note enum.Flag: 1fe. by name. + + - gh-93847(16): Fix repr of enum of generic aliases. + + - gh-91404(17): Revert the *note re: da. memory leak when a match is + terminated by a signal or memory allocation failure as the + implemented fix caused a major performance regression. + + - gh-83499(18): Fix double closing of file description in *note + tempfile: ff. + + - gh-93820(19): Fixed a regression when *note copy.copy(): 7cc.-ing + *note enum.Flag: 1fe. with multiple flag members. + + - gh-79512(20): Fixed names and ‘__module__’ value of *note weakref: + 132. classes *note ReferenceType: 11b5, *note ProxyType: 11b6, + *note CallableProxyType: 11b7. It makes them pickleable. + + - gh-91389(21): Fix an issue where *note dis: 36. utilities could + report missing or incorrect position information in the presence of + ‘CACHE’ entries. + + - gh-93626(22): Set ‘__future__.annotations’ to have a ‘None’ + mandatoryRelease to indicate that it is currently ‘TBD’. + + - gh-90473(23): Emscripten and WASI have no home directory and cannot + provide PEP 370(24) user site directory. + + - gh-90494(25): *note copy.copy(): 7cc. and *note copy.deepcopy(): + 7cd. now always raise a TypeError if ‘__reduce__()’ returns a tuple + with length 6 instead of silently ignore the 6th item or produce + incorrect result. + + - gh-90549(26): 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). + + - gh-93521(27): Fixed a case where dataclasses would try to add + ‘__weakref__’ into the ‘__slots__’ for a dataclass that specified + ‘weakref_slot=True’ when it was already defined in one of its + bases. This resulted in a ‘TypeError’ upon the new class being + created. + + - gh-79579(28): *note sqlite3: ef. now correctly detects DML queries + with leading comments. Patch by Erlend E. Aasland. + + - gh-93421(29): Update *note sqlite3.Cursor.rowcount: 11b8. when a + DML statement has run to completion. This fixes the row count for + SQL queries like ‘UPDATE ... RETURNING’. Patch by Erlend E. + Aasland. + + - gh-91162(30): Support splitting of unpacked arbitrary-length tuple + over ‘TypeVar’ and ‘TypeVarTuple’ parameters. For example: + + * ‘A[T, *Ts][*tuple[int, ...]]’ -> ‘A[int, *tuple[int, ...]]’ + + * ‘A[*Ts, T][*tuple[int, ...]]’ -> ‘A[*tuple[int, ...], int]’ + + - gh-93353(31): Fix the *note importlib.resources.as_file(): 11b9. + context manager to remove the temporary file if destroyed late + during Python finalization: keep a local reference to the *note + os.remove(): d9c. function. Patch by Victor Stinner. + + - gh-83658(32): Make ‘multiprocessing.Pool’ raise an exception if + ‘maxtasksperchild’ is not ‘None’ or a positive int. + + - gh-93156(33): Accessing the *note pathlib.PurePath.parents: 415. + sequence of an absolute path using negative index values produced + incorrect results. + + - gh-74696(34): *note shutil.make_archive(): 676. no longer + temporarily changes the current working directory during creation + of standard ‘.zip’ or tar archives. + + - gh-89973(35): Fix *note re.error: ad1. raised in *note fnmatch: 7c. + if the pattern contains a character range with upper bound lower + than lower bound (e.g. ‘[c-a]’). Now such ranges are interpreted + as empty ranges. + + - gh-92932(36): Now *note dis(): 78a. and *note get_instructions(): + bc7. handle operand values for instructions prefixed by + ‘EXTENDED_ARG_QUICK’. Patch by Sam Gross and Dong-hee Na. + + - gh-91577(37): Move imports in ‘SharedMemory’ methods to module + level so that they can be executed late in python finalization. + + - gh-91456(38): 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. + + - bpo-47231(39): Fixed an issue with inconsistent trailing slashes in + tarfile longname directories. + + - bpo-46755(40): In ‘QueueHandler’, clear ‘stack_info’ from + ‘LogRecord’ to prevent stack trace from being written twice. + + - bpo-46197(41): Fix *note ensurepip: 75. environment isolation for + subprocess running ‘pip’. + + - bpo-45924(42): Fix *note asyncio: 9. incorrect traceback when + future’s exception is raised multiple times. Patch by Kumar + Aditya. + + - bpo-34828(43): *note sqlite3.Connection.iterdump(): 11ba. now + handles databases that use ‘AUTOINCREMENT’ in one or more tables. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94736 + + (2) https://github.com/python/cpython/issues/94637 + + (3) https://github.com/python/cpython/issues/94607 + + (4) https://github.com/python/cpython/issues/93910 + + (5) https://github.com/python/cpython/issues/93896 + + (6) https://github.com/python/cpython/issues/94510 + + (7) https://github.com/python/cpython/issues/92336 + + (8) https://github.com/python/cpython/issues/94398 + + (9) https://github.com/python/cpython/issues/94254 + + (10) https://github.com/python/cpython/issues/94207 + + (11) https://github.com/python/cpython/issues/91742 + + (12) https://github.com/python/cpython/issues/94101 + + (13) https://github.com/python/cpython/issues/84753 + + (14) https://github.com/python/cpython/issues/94028 + + (15) https://github.com/python/cpython/issues/93820 + + (16) https://github.com/python/cpython/issues/93847 + + (17) https://github.com/python/cpython/issues/91404 + + (18) https://github.com/python/cpython/issues/83499 + + (19) https://github.com/python/cpython/issues/93820 + + (20) https://github.com/python/cpython/issues/79512 + + (21) https://github.com/python/cpython/issues/91389 + + (22) https://github.com/python/cpython/issues/93626 + + (23) https://github.com/python/cpython/issues/90473 + + (24) https://peps.python.org/pep-0370/ + + (25) https://github.com/python/cpython/issues/90494 + + (26) https://github.com/python/cpython/issues/90549 + + (27) https://github.com/python/cpython/issues/93521 + + (28) https://github.com/python/cpython/issues/79579 + + (29) https://github.com/python/cpython/issues/93421 + + (30) https://github.com/python/cpython/issues/91162 + + (31) https://github.com/python/cpython/issues/93353 + + (32) https://github.com/python/cpython/issues/83658 + + (33) https://github.com/python/cpython/issues/93156 + + (34) https://github.com/python/cpython/issues/74696 + + (35) https://github.com/python/cpython/issues/89973 + + (36) https://github.com/python/cpython/issues/92932 + + (37) https://github.com/python/cpython/issues/91577 + + (38) https://github.com/python/cpython/issues/91456 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=47231 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=46755 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=46197 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=45924 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=34828 + + +File: python.info, Node: Documentation<5>, Next: Tests<5>, Prev: Library<5>, Up: Python 3 11 0 beta 4 + +1.21.5.4 Documentation +...................... + + - gh-94321(1): Document the PEP 246(2) style protocol type *note + sqlite3.PrepareProtocol: 11bc. + + - gh-61162(3): Clarify *note sqlite3: ef. behavior when *note How to + use the connection context manager: 11bd. + + - gh-87260(4): Align *note sqlite3: ef. argument specs with the + actual implementation. + + - gh-86986(5): The minimum Sphinx version required to build the + documentation is now 3.2. + + - gh-88831(6): Augmented documentation of asyncio.create_task(). + Clarified the need to keep strong references to tasks and added a + code snippet detailing how to to this. + + - bpo-47161(7): Document that *note pathlib.PurePath: 306. does not + collapse initial double slashes because they denote UNC paths. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94321 + + (2) https://peps.python.org/pep-0246/ + + (3) https://github.com/python/cpython/issues/61162 + + (4) https://github.com/python/cpython/issues/87260 + + (5) https://github.com/python/cpython/issues/86986 + + (6) https://github.com/python/cpython/issues/88831 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=47161 + + +File: python.info, Node: Tests<5>, Next: Build<5>, Prev: Documentation<5>, Up: Python 3 11 0 beta 4 + +1.21.5.5 Tests +.............. + + - gh-91330(1): Added more tests for *note dataclasses: 2e. to cover + behavior with data descriptor-based fields. + + - gh-94208(2): ‘test_ssl’ is now checking for supported TLS version + and protocols in more tests. + + - gh-94315(3): Tests now check for DAC override capability instead of + relying on *note os.geteuid(): 11bf. + + - gh-93951(4): In test_bdb.StateTestCase.test_skip, avoid including + auxiliary importers. + + - gh-93957(5): Provide nicer error reporting from subprocesses in + test_venv.EnsurePipTest.test_with_pip. + + - gh-84461(6): ‘run_tests.py’ now handles cross compiling env vars + correctly and pass ‘HOSTRUNNER’ to regression tests. + + - gh-93616(7): ‘test_modulefinder’ now creates a temporary directory + in ‘ModuleFinderTest.setUp()’ instead of module scope. + + - gh-93575(8): Fix issue with test_unicode test_raiseMemError. The + test case now use ‘test.support.calcobjsize’ to calculate size of + PyUnicode structs. *note sys.getsizeof(): 11c0. may return + different size when string has UTF-8 memory. + + - gh-90473(9): WASI does not have a ‘chmod(2)’ syscall. *note + os.chmod(): d98. is now a dummy function on WASI. Skip all tests + that depend on working *note os.chmod(): d98. + + - gh-90473(10): Skip tests on WASI that require symlinks with + absolute paths. + + - gh-57539(11): Increase calendar test coverage for + ‘calendar.LocaleTextCalendar.formatweekday()’. + + - gh-90473(12): Skip symlink tests on WASI. wasmtime uses + ‘openat2(2)’ with ‘RESOLVE_BENEATH’ flag, which prevents symlinks + with absolute paths. + + - gh-89858(13): Fix ‘test_embed’ for out-of-tree builds. Patch by + Kumar Aditya. + + - gh-92886(14): Fixing tests that fail when running with + optimizations (‘-O’) in ‘test_imaplib.py’. + + - gh-92886(15): Fixing tests that fail when running with + optimizations (‘-O’) in ‘test_zipimport.py’ + + - bpo-47016(16): Create a GitHub Actions workflow for verifying + bundled pip and setuptools. Patch by Illia Volochii and Adam + Turner. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/91330 + + (2) https://github.com/python/cpython/issues/94208 + + (3) https://github.com/python/cpython/issues/94315 + + (4) https://github.com/python/cpython/issues/93951 + + (5) https://github.com/python/cpython/issues/93957 + + (6) https://github.com/python/cpython/issues/84461 + + (7) https://github.com/python/cpython/issues/93616 + + (8) https://github.com/python/cpython/issues/93575 + + (9) https://github.com/python/cpython/issues/90473 + + (10) https://github.com/python/cpython/issues/90473 + + (11) https://github.com/python/cpython/issues/57539 + + (12) https://github.com/python/cpython/issues/90473 + + (13) https://github.com/python/cpython/issues/89858 + + (14) https://github.com/python/cpython/issues/92886 + + (15) https://github.com/python/cpython/issues/92886 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=47016 + + +File: python.info, Node: Build<5>, Next: Windows<5>, Prev: Tests<5>, Up: Python 3 11 0 beta 4 + +1.21.5.6 Build +.............. + + - gh-94404(1): ‘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. + + - gh-93584(2): Address race condition in ‘Makefile’ when installing a + PGO build. All ‘test’ and ‘install’ targets now depend on ‘all’ + target. + + - gh-93491(3): ‘configure’ now detects and reports PEP 11(4) support + tiers. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94404 + + (2) https://github.com/python/cpython/issues/93584 + + (3) https://github.com/python/cpython/issues/93491 + + (4) https://peps.python.org/pep-0011/ + + +File: python.info, Node: Windows<5>, Next: Tools/Demos, Prev: Build<5>, Up: Python 3 11 0 beta 4 + +1.21.5.7 Windows +................ + + - gh-93824(1): Drag and drop of files onto Python files in Windows + Explorer has been enabled for Windows ARM64. + + - bpo-42658(2): Support native Windows case-insensitive path + comparisons by using ‘LCMapStringEx’ instead of *note str.lower(): + 11c3. in ‘ntpath.normcase()’. Add ‘LCMapStringEx’ to the ‘_winapi’ + module. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/93824 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42658 + + +File: python.info, Node: Tools/Demos, Next: C API<3>, Prev: Windows<5>, Up: Python 3 11 0 beta 4 + +1.21.5.8 Tools/Demos +.................... + + - gh-94538(1): Fix Argument Clinic output to custom file + destinations. Patch by Erlend E. Aasland. + + - gh-94430(2): Allow parameters named ‘module’ and ‘self’ with custom + C names in Argument Clinic. Patch by Erlend E. Aasland + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/94538 + + (2) https://github.com/python/cpython/issues/94430 + + +File: python.info, Node: C API<3>, Prev: Tools/Demos, Up: Python 3 11 0 beta 4 + +1.21.5.9 C API +.............. + + - gh-93937(1): The following frame functions and type are now + directly available with ‘#include ’, it’s no longer + needed to add ‘#include ’: + + * ‘PyFrame_Check()’ + + * *note PyFrame_GetBack(): 35a. + + * *note PyFrame_GetBuiltins(): 33d. + + * *note PyFrame_GetGenerator(): 33e. + + * *note PyFrame_GetGlobals(): 33f. + + * *note PyFrame_GetLasti(): 340. + + * *note PyFrame_GetLocals(): 35b. + + * ‘PyFrame_Type’ + + Patch by Victor Stinner. + + - gh-91321(2): Fix the compatibility of the Python C API with C++ + older than C++11. Patch by Victor Stinner. + + - gh-91731(3): Avoid defining the ‘static_assert’ when compiling with + C++ 11, where this is a keyword and redefining it can lead to + undefined behavior. Patch by Pablo Galindo + + - gh-93442(4): 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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/93937 + + (2) https://github.com/python/cpython/issues/91321 + + (3) https://github.com/python/cpython/issues/91731 + + (4) https://github.com/python/cpython/issues/93442 + + +File: python.info, Node: Python 3 11 0 beta 3, Next: Python 3 11 0 beta 2, Prev: Python 3 11 0 beta 4, Up: Changelog + +1.21.6 Python 3.11.0 beta 3 +--------------------------- + +`Release date: 2022-06-01' + +* Menu: + +* Core and Builtins: Core and Builtins<6>. +* Build: Build<6>. + + +File: python.info, Node: Core and Builtins<6>, Next: Build<6>, Up: Python 3 11 0 beta 3 + +1.21.6.1 Core and Builtins +.......................... + + - gh-93359(1): Ensure that custom *note ast: 7. nodes without + explicit end positions can be compiled. Patch by Pablo Galindo. + + - gh-93345(2): Fix a crash in substitution of a ‘TypeVar’ in nested + generic alias after ‘TypeVarTuple’. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/93359 + + (2) https://github.com/python/cpython/issues/93345 + + +File: python.info, Node: Build<6>, Prev: Core and Builtins<6>, Up: Python 3 11 0 beta 3 + +1.21.6.2 Build +.............. + + - gh-69093(1): Fix ‘Modules/Setup.stdlib.in’ rule for ‘_sqlite3’ + extension. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/69093 + + +File: python.info, Node: Python 3 11 0 beta 2, Next: Python 3 11 0 beta 1, Prev: Python 3 11 0 beta 3, Up: Changelog + +1.21.7 Python 3.11.0 beta 2 +--------------------------- + +`Release date: 2022-05-30' + +* Menu: + +* Core and Builtins: Core and Builtins<7>. +* Library: Library<6>. +* Documentation: Documentation<6>. +* Tests: Tests<6>. +* Build: Build<7>. +* Windows: Windows<6>. +* C API: C API<4>. + + +File: python.info, Node: Core and Builtins<7>, Next: Library<6>, Up: Python 3 11 0 beta 2 + +1.21.7.1 Core and Builtins +.......................... + + - gh-84694(1): The ‘--experimental-isolated-subinterpreters’ + configure option and ‘EXPERIMENTAL_ISOLATED_SUBINTERPRETERS’ macro + have been removed. + + - gh-91924(2): Fix ‘__lltrace__’ debug feature if the stdout encoding + is not UTF-8. Patch by Victor Stinner. + + - gh-93061(3): Backward jumps after ‘async for’ loops are no longer + given dubious line numbers. + + - gh-93065(4): Fix contextvars HAMT implementation to handle + iteration over deep trees. + + The bug was discovered and fixed by Eli Libman. See + MagicStack/immutables#84(5) for more details. + + - gh-90473(6): Decrease default recursion limit on WASI to address + limited call stack size. + + - gh-92804(7): Fix memory leak in ‘memoryview’ iterator as it was not + finalized at exit. Patch by Kumar Aditya. + + - gh-92236(8): Remove spurious “LINE” event when starting a generator + or coroutine, visible tracing functions implemented in C. + + - gh-92619(9): 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). + + - gh-92261(10): Fix hang when trying to iterate over a + ‘typing.Union’. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/84694 + + (2) https://github.com/python/cpython/issues/91924 + + (3) https://github.com/python/cpython/issues/93061 + + (4) https://github.com/python/cpython/issues/93065 + + (5) https://github.com/MagicStack/immutables/issues/84 + + (6) https://github.com/python/cpython/issues/90473 + + (7) https://github.com/python/cpython/issues/92804 + + (8) https://github.com/python/cpython/issues/92236 + + (9) https://github.com/python/cpython/issues/92619 + + (10) https://github.com/python/cpython/issues/92261 + + +File: python.info, Node: Library<6>, Next: Documentation<6>, Prev: Core and Builtins<7>, Up: Python 3 11 0 beta 2 + +1.21.7.2 Library +................ + + - gh-93297(1): Make asyncio task groups prevent child tasks from + being GCed + + - gh-90817(2): The *note locale.resetlocale(): 2e1. function is + deprecated and will be removed in Python 3.13. Use + ‘locale.setlocale(locale.LC_ALL, "")’ instead. Patch by Victor + Stinner. + + - gh-92728(3): The ‘re.template()’ function and the corresponding + ‘re.TEMPLATE’ and ‘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. + + - gh-93044(4): No longer convert the database argument of *note + sqlite3.connect(): 7da. to bytes before passing it to the factory. + + - gh-93010(5): In a very special case, the email package tried to + append the nonexistent ‘InvalidHeaderError’ to the defect list. It + should have been ‘InvalidHeaderDefect’. + + - gh-92675(6): Fix ‘venv.ensure_directories()’ to accept *note + pathlib.Path: 65f. arguments in addition to *note str: 1b3. paths. + Patch by David Foster. + + - gh-87901(7): Removed the ‘encoding’ argument from *note os.popen(): + 6d9. that was added in 3.11b1. + + - gh-91922(8): Fix function ‘sqlite.connect()’ and the + ‘sqlite.Connection’ constructor on non-UTF-8 locales. Also, they + now support bytes paths non-decodable with the current FS encoding. + + - gh-92839(9): Fixed crash resulting from calling bisect.insort() or + bisect.insort_left() with the key argument not equal to None. + + - gh-90473(10): *note subprocess: f6. now fails early on Emscripten + and WASI platforms to work around missing *note os.pipe(): 11cc. on + WASI. + + - gh-92671(11): Fixed *note ast.unparse(): 523. for empty tuples in + the assignment target context. + + - gh-91581(12): *note utcfromtimestamp(): 11cd. no longer attempts to + resolve ‘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 + *note datetime.min: 11ce. Patch by Paul Ganssle. + + - gh-92550(13): Fix *note pathlib.Path.rglob(): 23a. for empty + pattern. + + - gh-92530(14): Fix an issue that occurred after interrupting *note + threading.Condition.notify(): 11cf. + + - gh-92531(15): The statistics.median_grouped() function now always + return a float. Formerly, it did not convert the input type when + for sequences of length one. + + - gh-91810(16): *note ElementTree: 59d. method *note write(): c99. + and function *note tostring(): c97. now use the text file’s + encoding (“UTF-8” if not available) instead of locale encoding in + XML declaration when ‘encoding="unicode"’ is specified. + + - gh-90622(17): Worker processes for *note + concurrent.futures.ProcessPoolExecutor: 52e. are no longer spawned + on demand (a feature added in 3.9) when the multiprocessing context + start method is ‘"fork"’ as that can lead to deadlocks in the child + processes due to a fork happening while threads are running. + + - gh-91581(18): Remove an unhandled error case in the C + implementation of calls to *note datetime.fromtimestamp: 11d0. 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. + + - bpo-39064(19): *note zipfile.ZipFile: 28c. now raises *note + zipfile.BadZipFile: 11d1. instead of ‘ValueError’ when reading a + corrupt zip file in which the central directory offset is negative. + + - bpo-45393(20): Fix the formatting for ‘await x’ and ‘not x’ in the + operator precedence table when using the *note help(): 514. system. + + - bpo-28249(21): Set *note doctest.DocTest.lineno: 11d2. to ‘None’ + when object does not have ‘__doc__’. + + - bpo-45046(22): Add support of context managers in *note unittest: + 125.: methods *note enterContext(): 280. and *note + enterClassContext(): 281. of class *note TestCase: 282, method + *note enterAsyncContext(): 283. of class *note + IsolatedAsyncioTestCase: 284. and function *note + unittest.enterModuleContext(): 285. + + - bpo-42627(23): Fix incorrect parsing of Windows registry proxy + settings + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/93297 + + (2) https://github.com/python/cpython/issues/90817 + + (3) https://github.com/python/cpython/issues/92728 + + (4) https://github.com/python/cpython/issues/93044 + + (5) https://github.com/python/cpython/issues/93010 + + (6) https://github.com/python/cpython/issues/92675 + + (7) https://github.com/python/cpython/issues/87901 + + (8) https://github.com/python/cpython/issues/91922 + + (9) https://github.com/python/cpython/issues/92839 + + (10) https://github.com/python/cpython/issues/90473 + + (11) https://github.com/python/cpython/issues/92671 + + (12) https://github.com/python/cpython/issues/91581 + + (13) https://github.com/python/cpython/issues/92550 + + (14) https://github.com/python/cpython/issues/92530 + + (15) https://github.com/python/cpython/issues/92531 + + (16) https://github.com/python/cpython/issues/91810 + + (17) https://github.com/python/cpython/issues/90622 + + (18) https://github.com/python/cpython/issues/91581 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=39064 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=45393 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28249 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45046 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=42627 + + +File: python.info, Node: Documentation<6>, Next: Tests<6>, Prev: Library<6>, Up: Python 3 11 0 beta 2 + +1.21.7.3 Documentation +...................... + + - gh-86438(1): Clarify that *note -W: 502. and *note PYTHONWARNINGS: + 80e. are matched literally and case-insensitively, rather than as + regular expressions, in *note warnings: 130. + + - gh-92240(2): Added release dates for “What’s New in Python 3.X” for + 3.0, 3.1, 3.2, 3.8 and 3.10 + + - bpo-40838(3): Document that *note inspect.getdoc(): 63f, *note + inspect.getmodule(): 11d4, and *note inspect.getsourcefile(): 11d5. + might return ‘None’. + + - bpo-38056(4): Overhaul the *note Error Handlers: 11d6. + documentation in *note codecs: 1a. + + - bpo-13553(5): Document tkinter.Tk args. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/86438 + + (2) https://github.com/python/cpython/issues/92240 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40838 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38056 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=13553 + + +File: python.info, Node: Tests<6>, Next: Build<7>, Prev: Documentation<6>, Up: Python 3 11 0 beta 2 + +1.21.7.4 Tests +.............. + + - gh-92670(1): Skip + ‘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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/92670 + + +File: python.info, Node: Build<7>, Next: Windows<6>, Prev: Tests<6>, Up: Python 3 11 0 beta 2 + +1.21.7.5 Build +.............. + + - gh-90473(1): Disable pymalloc and increase stack size on + ‘wasm32-wasi’. + + - bpo-34449(2): Drop invalid compiler switch ‘-fPIC’ for HP aCC on + HP-UX. Patch by Michael Osipov. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/90473 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34449 + + +File: python.info, Node: Windows<6>, Next: C API<4>, Prev: Build<7>, Up: Python 3 11 0 beta 2 + +1.21.7.6 Windows +................ + + - gh-92817(1): Ensures that ‘py.exe’ will prefer an active virtual + environment over default tags specified with environment variables + or through a ‘py.ini’ file. + + - gh-92984(2): Explicitly disable incremental linking for non-Debug + builds + + - gh-92841(3): *note asyncio: 9. no longer throws ‘RuntimeError: + Event loop is closed’ on interpreter exit after asynchronous socket + activity. Patch by Oleg Iarygin. + + - bpo-46907(4): Update Windows installer to use SQLite 3.38.4. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/92817 + + (2) https://github.com/python/cpython/issues/92984 + + (3) https://github.com/python/cpython/issues/92841 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46907 + + +File: python.info, Node: C API<4>, Prev: Windows<6>, Up: Python 3 11 0 beta 2 + +1.21.7.7 C API +.............. + + - gh-92898(1): Fix C++ compiler warnings when casting function + arguments to ‘PyObject*’. Patch by Serge Guelton. + + - gh-92913(2): Ensures changes to *note PyConfig.module_search_paths: + 1c1. are ignored unless *note PyConfig.module_search_paths_set: + 1c0. is set + + - gh-92781(3): 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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/92898 + + (2) https://github.com/python/cpython/issues/92913 + + (3) https://github.com/python/cpython/issues/92781 + + +File: python.info, Node: Python 3 11 0 beta 1, Next: Python 3 11 0 alpha 7, Prev: Python 3 11 0 beta 2, Up: Changelog + +1.21.8 Python 3.11.0 beta 1 +--------------------------- + +`Release date: 2022-05-06' + +* Menu: + +* Security: Security<4>. +* Core and Builtins: Core and Builtins<8>. +* Library: Library<7>. +* Documentation: Documentation<7>. +* Tests: Tests<7>. +* Build: Build<8>. +* Windows: Windows<7>. +* macOS: macOS<2>. +* Tools/Demos: Tools/Demos<2>. +* C API: C API<5>. + + +File: python.info, Node: Security<4>, Next: Core and Builtins<8>, Up: Python 3 11 0 beta 1 + +1.21.8.1 Security +................. + + - gh-57684(1): Add the *note -P: 15f. command line option and the + *note PYTHONSAFEPATH: 160. environment variable to not prepend a + potentially unsafe path to *note sys.path: 162. Patch by Victor + Stinner. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/57684 + + +File: python.info, Node: Core and Builtins<8>, Next: Library<7>, Prev: Security<4>, Up: Python 3 11 0 beta 1 + +1.21.8.2 Core and Builtins +.......................... + + - gh-89519(1): Chaining classmethod descriptors (introduced in + bpo-19072(2)) 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. + + - gh-92345(3): ‘pymain_run_python()’ now imports ‘readline’ and + ‘rlcompleter’ before sys.path is extended to include the current + working directory of an interactive interpreter. Non-interactive + interpreters are not affected. + + - bpo-43857(4): Improve the *note AttributeError: 19d. message when + deleting a missing attribute. Patch by Géry Ogam. + + - gh-92245(5): Make sure that PEP 523 is respected in all cases. In + 3.11a7, specialization may have prevented Python-to-Python calls + respecting PEP 523. + + - gh-92203(6): Add a closure keyword-only parameter to 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 None, and it must be None if the code object + doesn’t refer to any free variables. + + - gh-91173(7): Disable frozen modules in debug builds. Patch by + Kumar Aditya. + + - gh-92114(8): Improve error message when subscript a type with + ‘__class_getitem__’ set to ‘None’. + + - gh-92112(9): Fix crash triggered by an evil custom ‘mro()’ on a + metaclass. + + - gh-92063(10): The ‘PRECALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS’ + instruction now ensures methods are called only on objects of the + correct type. + + - gh-92031(11): Deoptimize statically allocated code objects during + ‘Py_FINALIZE()’ so that future ‘_PyCode_Quicken’ calls always start + with unquickened code. + + - gh-92036(12): 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. + + - gh-92032(13): The interpreter can now autocomplete soft keywords, + as of now ‘match’, ‘case’, and ‘_’ (wildcard pattern) from PEP + 634(14). + + - gh-87999(15): The warning emitted by the Python parser for a + numeric literal immediately followed by keyword has been changed + from deprecation warning to syntax warning. + + - gh-91869(16): Fix an issue where specialized opcodes with extended + arguments could produce incorrect tracing output or lead to + assertion failures. + + - gh-91603(17): Speed up *note types.UnionType: 213. instantiation. + Based on patch provided by Yurii Karabas. + + - gh-89373(18): If Python is built in debug mode, Python now ensures + that deallocator functions leave the current exception unchanged. + Patch by Victor Stinner. + + - gh-91632(19): Fix a minor memory leak at exit: release the memory + of the ‘generic_alias_iterator’ type. Patch by Dong-hee Na. + + - gh-81548(20): Octal escapes with value larger than ‘0o377’ now + produce a *note DeprecationWarning: 2d4. In a future Python + version they will be a *note SyntaxWarning: 2d5. and eventually a + *note SyntaxError: 2d6. + + - bpo-43950(21): Use a single compact table for line starts, ends and + column offsets. Reduces memory consumption for location info by + half + + - gh-91102(22): Use Argument Clinic for ‘EncodingMap’. Patch by Oleg + Iarygin. + + - gh-91636(23): Fixed a crash in a garbage-collection edge-case, in + which a ‘PyFunction_Type.tp_clear’ function could leave a python + function object in an inconsistent state. + + - gh-91603(24): Speed up *note isinstance(): 3ab. and *note + issubclass(): 3ac. checks for *note types.UnionType: 213. Patch by + Yurii Karabas. + + - gh-91625(25): Fixed a bug in which adaptive opcodes ignored any + preceding ‘EXTENDED_ARG’s on specialization failure. + + - gh-78607(26): The LLTRACE special build now looks for the name + ‘__lltrace__’ defined in module globals, rather than the name + ‘__ltrace__’, which had been introduced as a typo. + + - gh-91576(27): Speed up iteration of ascii strings by 50%. Patch by + Kumar Aditya. + + - gh-89279(28): Improve interpreter performance on Windows by + inlining a few specific macros. + + - gh-91502(29): Add a new ‘_PyFrame_IsEntryFrame()’ API function, to + check if a *note PyFrameObject: 35d. is an entry frame. Patch by + Pablo Galindo. + + - gh-91266(30): Refactor the ‘bytearray’ strip methods ‘strip’, + ‘lstrip’ and ‘rstrip’ to use a common implementation. + + - gh-91479(31): Replaced the ‘__note__’ field of *note BaseException: + 17d. (added in an earlier version of 3.11) with the final design of + PEP 678(32). Namely, *note BaseException: 17d. gets an + ‘add_note()’ method, and its ‘__notes__’ field is created when + necessary. + + - gh-46055(33): Speed up right shift of negative integers, by + removing unnecessary creation of temporaries. Original patch by + Xinhang Xu, reworked by Mark Dickinson. + + - gh-91462(34): 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. + + - gh-89455(35): Fixed an uninitialized bool value in the traceback + printing code path that was introduced by the initial bpo-45292(36) + exception groups work. + + - gh-91421(37): Fix a potential integer overflow in _Py_DecodeUTF8Ex. + + - gh-91428(38): Add ‘static const char *const _PyOpcode_OpName[256] = + {...};’ to ‘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. + + - bpo-47120(39): Make ‘POP_JUMP_IF_TRUE’, ‘POP_JUMP_IF_FALSE’, + ‘POP_JUMP_IF_NONE’ and ‘POP_JUMP_IF_NOT_NONE’ virtual, mapping to + new relative jump opcodes. + + - bpo-45317(40): Add internal documentation explaining design of new + (for 3.11) frame stack. + + - bpo-47197(41): ctypes used to mishandle ‘void’ return types, so + that for instance a function declared like ‘ctypes.CFUNCTYPE(None, + ctypes.c_int)’ would be called with signature ‘int f(int)’ instead + of ‘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. + + - bpo-47120(42): Make opcodes *note JUMP_IF_TRUE_OR_POP: 2cd. and + *note JUMP_IF_FALSE_OR_POP: 2ce. relative rather than absolute. + + - bpo-47177(43): Replace the ‘f_lasti’ member of the internal + ‘_PyInterpreterFrame’ structure with a ‘prev_instr’ pointer, which + reduces overhead in the main interpreter loop. The ‘f_lasti’ + attribute of Python-layer frame objects is preserved for + backward-compatibility. + + - bpo-46961(44): Integer mod/remainder operations, including the + three-argument form of *note pow(): 613, now consistently return + ints from the global small integer cache when applicable. + + - bpo-46962(45): Classes and functions that unconditionally declared + their docstrings ignoring the ‘--without-doc-strings’ compilation + flag no longer do so. + + The classes affected are ‘ctypes.UnionType’, *note + pickle.PickleBuffer: 11de, ‘testcapi.RecursingInfinitelyError’, and + *note types.GenericAlias: 3dd. + + The functions affected are 24 methods in *note ctypes: 29. + + Patch by Oleg Iarygin. + + - bpo-46942(46): Use Argument Clinic for the *note types.MethodType: + 11df. constructor. Patch by Oleg Iarygin. + + - bpo-46764(47): Fix wrapping bound methods with @classmethod + + - bpo-43464(48): Optimize ‘set.intersection()’ for non-set arguments. + + - bpo-46721(49): Optimize ‘set.issuperset()’ for non-set argument. + + - bpo-46509(50): Add type-specialized versions of the ‘Py_DECREF()’, + and use them for ‘float’, ‘int’, ‘str’, ‘bool’, and ‘None’ to avoid + pointer-chasing at runtime where types are known at C compile time. + + - bpo-46045(51): Do not use POSIX semaphores on NetBSD + + - bpo-36819(52): Fix crashes in built-in encoders with error handlers + that return position less or equal than the starting position of + non-encodable characters. + + - bpo-34093(53): ‘marshal.dumps()’ uses ‘FLAG_REF’ for all interned + strings. This makes output more deterministic and helps + reproducible build. + + - bpo-26579(54): Added ‘object.__getstate__’ which provides the + default implementation of the ‘__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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/89519 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19072 + + (3) https://github.com/python/cpython/issues/92345 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43857 + + (5) https://github.com/python/cpython/issues/92245 + + (6) https://github.com/python/cpython/issues/92203 + + (7) https://github.com/python/cpython/issues/91173 + + (8) https://github.com/python/cpython/issues/92114 + + (9) https://github.com/python/cpython/issues/92112 + + (10) https://github.com/python/cpython/issues/92063 + + (11) https://github.com/python/cpython/issues/92031 + + (12) https://github.com/python/cpython/issues/92036 + + (13) https://github.com/python/cpython/issues/92032 + + (14) https://peps.python.org/pep-0634/ + + (15) https://github.com/python/cpython/issues/87999 + + (16) https://github.com/python/cpython/issues/91869 + + (17) https://github.com/python/cpython/issues/91603 + + (18) https://github.com/python/cpython/issues/89373 + + (19) https://github.com/python/cpython/issues/91632 + + (20) https://github.com/python/cpython/issues/81548 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=43950 + + (22) https://github.com/python/cpython/issues/91102 + + (23) https://github.com/python/cpython/issues/91636 + + (24) https://github.com/python/cpython/issues/91603 + + (25) https://github.com/python/cpython/issues/91625 + + (26) https://github.com/python/cpython/issues/78607 + + (27) https://github.com/python/cpython/issues/91576 + + (28) https://github.com/python/cpython/issues/89279 + + (29) https://github.com/python/cpython/issues/91502 + + (30) https://github.com/python/cpython/issues/91266 + + (31) https://github.com/python/cpython/issues/91479 + + (32) https://peps.python.org/pep-0678/ + + (33) https://github.com/python/cpython/issues/46055 + + (34) https://github.com/python/cpython/issues/91462 + + (35) https://github.com/python/cpython/issues/89455 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=45292 + + (37) https://github.com/python/cpython/issues/91421 + + (38) https://github.com/python/cpython/issues/91428 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=47120 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=45317 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=47197 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=47120 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=47177 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=46961 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=46962 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=46942 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=46764 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=43464 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=46721 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=46509 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=46045 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=36819 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=34093 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=26579 + + +File: python.info, Node: Library<7>, Next: Documentation<7>, Prev: Core and Builtins<8>, Up: Python 3 11 0 beta 1 + +1.21.8.3 Library +................ + + - gh-87901(1): Add the `encoding' parameter to *note os.popen(): 6d9. + + - gh-90997(2): Fix an issue where *note dis: 36. utilities may + interpret populated inline cache entries as valid instructions. + + - gh-92332(3): Deprecate *note typing.Text: 2e2. (removal of the + class is currently not planned). Patch by Alex Waygood. + + - Deprecate nested classes in enum definitions becoming members – in + 3.13 they will be normal classes; add ‘member’ and ‘nonmember’ + functions to allow control over results now. + + - gh-92356(4): Fixed a performance regression in ctypes function + calls. + + - gh-90997(5): Show the actual named values stored in inline caches + when ‘show_caches=True’ is passed to *note dis: 36. utilities. + + - gh-92301(6): Prefer ‘close_range()’ to iterating over procfs for + file descriptor closing in *note subprocess: f6. for better + performance. + + - gh-67248(7): Sort the miscellaneous topics in Cmd.do_help() + + - gh-92210(8): Port ‘socket.__init__’ to Argument Clinic. Patch by + Cinder. + + - gh-80010(9): Add support for generalized ISO 8601 parsing to *note + datetime.datetime.fromisoformat(): 1ef, *note + datetime.date.fromisoformat(): 1ed. and *note + datetime.time.fromisoformat(): 1ee. Patch by Paul Ganssle. + + - gh-92118(10): Fix a 3.11 regression in *note contextmanager(): eb1, + which caused it to propagate exceptions with incorrect tracebacks. + + - gh-90887(11): Adding ‘COPYFILE_STAT’, ‘COPYFILE_ACL’ and + ‘COPYFILE_XATTR’ constants for ‘os.fcopyfile()’ available in macOs. + + - gh-91215(12): For @dataclass, add weakref_slot. Default is False. + If True, and if slots=True, add a slot named “__weakref__”, which + will allow instances to be weakref’d. Contributed by Eric V. Smith + + - gh-85984(13): New function os.login_tty() for Unix. + + - gh-92128(14): Add *note __class_getitem__(): 305. to *note + logging.LoggerAdapter: f9c. and *note logging.StreamHandler: ea8, + allowing them to be parameterized at runtime. Patch by Alex + Waygood. + + - gh-92049(15): Forbid pickling constants ‘re._constants.SUCCESS’ + etc. Previously, pickling did not fail, but the result could not + be unpickled. + + - gh-92062(16): *note inspect.Parameter: a97. now raises *note + ValueError: 1c8. if ‘name’ is a keyword, in addition to the + existing check that it is an identifier. + + - gh-87390(17): Add an ‘__unpacked__’ attribute to *note + types.GenericAlias: 3dd. Patch by Jelle Zijlstra. + + - gh-88089(18): Add support for generic *note typing.NamedTuple: 271. + + - gh-91996(19): New http.HTTPMethod enum to represent all the + available HTTP request methods in a convenient way + + - gh-91984(20): Modified test strings in test_argparse.py to not + contain trailing spaces before end of line. + + - gh-91952(21): Add ‘encoding="locale"’ support to + ‘TextIOWrapper.reconfigure()’. + + - gh-91954(22): Add `encoding' and `errors' arguments to *note + subprocess.getoutput(): 11e1. and *note + subprocess.getstatusoutput(): c61. + + - bpo-47029(23): Always close the read end of the pipe used by *note + multiprocessing.Queue: 11e2. `after' the last write of buffered + data to the write end of the pipe to avoid *note BrokenPipeError: + d0c. at garbage collection and at *note + multiprocessing.Queue.close(): 11e3. calls. Patch by Géry Ogam. + + - gh-91928(24): Add *note datetime.UTC: 1eb. alias for *note + datetime.timezone.utc: 1ec. + + Patch by Kabir Kwatra. + + - gh-68966(25): The *note mailcap: ad. module is now deprecated and + will be removed in Python 3.13. See PEP 594(26) for the rationale + and the *note mimetypes: b0. module for an alternative. Patch by + Victor Stinner. + + - gh-91401(27): Provide a way to disable *note subprocess: f6. use of + ‘vfork()’ just in case it is ever needed and document the existing + mechanism for ‘posix_spawn()’. + + - gh-64783(28): Fix *note signal.NSIG: 11e4. value on FreeBSD to + accept signal numbers greater than 32, like ‘signal.SIGRTMIN’ and + ‘signal.SIGRTMAX’. Patch by Victor Stinner. + + - gh-91910(29): Add missing f prefix to f-strings in error messages + from the *note multiprocessing: b5. and *note asyncio: 9. modules. + + - gh-91860(30): Add *note typing.dataclass_transform(): 192, + implementing PEP 681(31). Patch by Jelle Zijlstra. + + - gh-91832(32): Add ‘required’ attribute to *note argparse.Action: + 11e5. repr output. + + - gh-91827(33): In the *note tkinter: 10e. module add method + ‘info_patchlevel()’ which returns the exact version of the Tcl + library as a named tuple similar to *note sys.version_info: 27d. + + - gh-84461(34): Add *note –enable-wasm-pthreads: 11e6. to enable + pthreads support for WASM builds. ‘Emscripten/node’ no longer has + threading enabled by default. Include additional file systems. + + - gh-91821(35): Fix unstable ‘test_from_tuple’ test in + ‘test_decimal.py’. + + - gh-91217(36): Deprecate the xdrlib module. + + - gh-91217(37): Deprecate the uu module. + + - gh-91760(38): 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. + + - gh-84461(39): Add provisional *note sys._emscripten_info: 11e7. + named tuple with build-time and run-time information about + Emscripten platform. + + - gh-90623(40): *note signal.raise_signal(): 11e8. and *note + os.kill(): ffa. now check immediately for pending signals. Patch + by Victor Stinner. + + - gh-91734(41): Fix OSS audio support on Solaris. + + - gh-90633(42): Include the passed value in the exception thrown by + *note typing.assert_never(): 26c. Patch by Jelle Zijlstra. + + - gh-91700(43): Compilation of regular expression containing a + conditional expression ‘(?(group)...)’ now raises an appropriate + *note re.error: ad1. if the group number refers to not defined + group. Previously an internal RuntimeError was raised. + + - gh-91231(44): Add an optional keyword `shutdown_timeout' parameter + to the ‘multiprocessing.BaseManager’ constructor. Kill the process + if terminate() takes longer than the timeout. Patch by Victor + Stinner. + + - gh-91621(45): Fix *note typing.get_type_hints(): 277. for *note + collections.abc.Callable: 3dc. Patch by Shantanu Jain. + + - gh-90568(46): Parsing ‘\N’ escapes of Unicode Named Character + Sequences in a *note regular expression: da. raises now *note + re.error: ad1. instead of ‘TypeError’. + + - gh-91670(47): Remove deprecated ‘SO’ config variable in *note + sysconfig: fa. + + - gh-91217(48): Deprecate the telnetlib module. + + - gh-91217(49): Deprecate the sunau module. + + - gh-91217(50): Deprecate the spwd module. + + - gh-91217(51): Deprecate the sndhdr module, as well as inline needed + functionality for ‘email.mime.MIMEAudio’. + + - gh-91616(52): *note re: da. module, fix *note fullmatch(): 11e9. + mismatch when using Atomic Grouping or Possessive Quantifiers. + + - gh-91217(53): Deprecate the ‘pipes’ module. + + - gh-91217(54): Deprecate the ossaudiodev module. + + - bpo-47256(55): *note re: da. module, limit the maximum capturing + group to 1,073,741,823 in 64-bit build, this increases the depth of + backtracking. + + - gh-91217(56): Deprecate the nis module. + + - gh-91595(57): Fix the comparison of character and integer inside + ‘Tools.gdb.libpython.write_repr()’. Patch by Yu Liu. + + - gh-74166(58): Add option to raise all errors from *note + create_connection(): 241. in an *note ExceptionGroup: 177. when it + fails to create a connection. The default remains to raise only + the last error that had occurred when multiple addresses were + tried. + + - gh-91487(59): Optimize asyncio UDP speed, over 100 times faster + when transferring a large file. + + - gh-91575(60): Update case-insensitive matching in the *note re: da. + module to the latest Unicode version. + + - gh-90622(61): In ‘concurrent.futures.process.ProcessPoolExecutor’ + disallow the “fork” multiprocessing start method when the new + ‘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 ‘mp_context’ was supplied. + + - gh-89022(62): In *note sqlite3: ef, ‘SQLITE_MISUSE’ result codes + are now mapped to *note InterfaceError: 24f. instead of *note + ProgrammingError: 247. Also, more accurate exceptions are raised + when binding parameters fail. Patch by Erlend E. Aasland. + + - gh-91526(63): Stop calling ‘os.device_encoding(file.fileno())’ in + ‘TextIOWrapper’. It was complex, never documented, and didn’t work + for most cases. (Patch by Inada Naoki.) + + - gh-88116(64): Change the frame-related functions in the *note + inspect: 9e. module to return a regular object (that is backwards + compatible with the old tuple-like interface) that include the + extended PEP 657(65) position information (end line number, column + and end column). The affected functions are: *note + inspect.getframeinfo(): 222, *note inspect.getouterframes(): 223, + *note inspect.getinnerframes(): 224, *note inspect.stack(): 225. + and *note inspect.trace(): 226. Patch by Pablo Galindo. + + - gh-69093(66): Add indexing and slicing support to *note + sqlite3.Blob: 254. Patch by Aviv Palivoda and Erlend E. Aasland. + + - gh-69093(67): Add *note context manager: 1a0. support to *note + sqlite3.Blob: 254. Patch by Aviv Palivoda and Erlend E. Aasland. + + - gh-91217(68): Deprecate nntplib. + + - gh-91217(69): Deprecate msilib. + + - gh-91404(70): Improve the performance of *note re: da. matching by + using computed gotos (or “threaded code”) on supported platforms + and removing expensive pointer indirections. + + - gh-91217(71): Deprecate the imghdr module. + + - gh-91217(72): Deprecate the crypt module. + + - gh-91276(73): Make space for longer opcodes in *note dis: 36. + output. + + - bpo-47000(74): Make ‘TextIOWrapper’ uses locale encoding when + ‘encoding="locale"’ is specified even in UTF-8 mode. + + - gh-91230(75): *note warnings.catch_warnings(): 288. now accepts + arguments for *note warnings.simplefilter(): 289, providing a more + concise way to locally ignore warnings or convert them to errors. + + - gh-91217(76): Deprecate the chunk module. + + - Add the ‘TCP_CONNECTION_INFO’ option (available on macOS) to *note + socket: ec. + + - bpo-47260(77): Fix ‘os.closerange()’ potentially being a no-op in a + Linux seccomp sandbox. + + - bpo-47087(78): Implement ‘typing.Required’ and ‘typing.NotRequired’ + ( PEP 655(79)). Patch by David Foster and Jelle Zijlstra. + + - bpo-47061(80): Deprecate cgi and cgitb. + + - bpo-47061(81): Deprecate audioop. + + - bpo-47000(82): Add *note locale.getencoding(): 228. to get the + current locale encoding. It is similar to + ‘locale.getpreferredencoding(False)’ but ignores the *note Python + UTF-8 Mode: 229. + + - bpo-42012(83): Add *note wsgiref.types: 13a, containing + WSGI-specific types for static type checking. + + - bpo-47227(84): Suppress expression chaining for more *note re: da. + parsing errors. + + - bpo-47211(85): Remove undocumented and never working function + ‘re.template()’ and flag ‘re.TEMPLATE’. This was later reverted in + 3.11.0b2 and deprecated instead. + + - bpo-47135(86): *note decimal.localcontext(): 11ea. now accepts + context attributes via keyword arguments + + - bpo-43323(87): Fix errors in the *note email: 64. module if the + charset itself contains undecodable/unencodable characters. + + - bpo-46841(88): Disassembly of quickened code. + + - bpo-46681(89): Forward gzip.compress() compresslevel to zlib. + + - bpo-45100(90): Add *note typing.get_overloads(): 274. and *note + typing.clear_overloads(): 275. Patch by Jelle Zijlstra. + + - bpo-44807(91): *note typing.Protocol: 276. no longer silently + replaces ‘__init__()’ methods defined on subclasses. Patch by + Adrian Garcia Badaracco. + + - bpo-46787(92): Fix *note concurrent.futures.ProcessPoolExecutor: + 52e. exception memory leak + + - bpo-46720(93): Add support for path-like objects to *note + multiprocessing.set_executable(): 11eb. for Windows to be on a par + with Unix-like systems. Patch by Géry Ogam. + + - bpo-46696(94): Add ‘SO_INCOMING_CPU’ constant to *note socket: ec. + + - bpo-46053(95): Fix OSS audio support on NetBSD. + + - bpo-45639(96): ‘image/avif’ and ‘image/webp’ were added to *note + mimetypes: b0. + + - bpo-46285(97): Add command-line option ‘-p’/‘--protocol’ to module + *note http.server: 92. 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 *note http.server: + 92.). Patch by Géry Ogam. + + - bpo-44791(98): Accept ellipsis as the last argument of *note + typing.Concatenate: 3b0. + + - bpo-46547(99): Remove variables leaking into ‘pydoc.Helper’ class + namespace. + + - bpo-46415(100): Fix ipaddress.ip_{address,interface,network} + raising TypeError instead of ValueError if given invalid tuple as + address parameter. + + - bpo-46075(101): ‘CookieJar’ with ‘DefaultCookiePolicy’ now can + process cookies from localhost with domain=localhost explicitly + specified in Set-Cookie header. + + - bpo-45995(102): 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. + + - bpo-26175(103): Fully implement the *note io.BufferedIOBase: 949. + or *note io.TextIOBase: f50. interface for *note + tempfile.SpooledTemporaryFile: e03. objects. This lets them work + correctly with higher-level layers (like compression modules). + Patch by Carey Metcalfe. + + - bpo-45138(104): Fix a regression in the *note sqlite3: ef. trace + callback where bound parameters were not expanded in the passed + statement string. The regression was introduced in Python 3.10 by + bpo-40318(105). Patch by Erlend E. Aasland. + + - bpo-44863(106): Allow *note TypedDict: 18a. subclasses to also + include *note Generic: 11ec. as a base class in class based syntax. + Thereby allowing the user to define a generic ‘TypedDict’, just + like a user-defined generic but with ‘TypedDict’ semantics. + + - bpo-44587(107): Fix BooleanOptionalAction to not automatically add + a default string. If a default string is desired, use a formatter + to add it. + + - bpo-43827(108): All positional-or-keyword parameters to + ‘ABCMeta.__new__’ are now positional-only to avoid conflicts with + keyword arguments to be passed to ‘__init_subclass__()’. + + - bpo-43218(109): Prevent creation of a venv whose path contains the + PATH separator. This could affect the usage of the activate + script. Patch by Dustin Rodrigues. + + - bpo-38435(110): Add a ‘process_group’ parameter to *note + subprocess.Popen: 6e8. to help move more things off of the unsafe + ‘preexec_fn’ parameter. + + - bpo-42066(111): Fix cookies getting sorted in + ‘CookieJar.__iter__()’ which is an extra behavior and not mentioned + in RFC 2965 or Netscape cookie protocol. Now the cookies in + ‘CookieJar’ follows the order of the ‘Set-Cookie’ header. Patch by + Iman Kermani. + + - bpo-40617(112): Add *note create_window_function(): 252. to *note + sqlite3.Connection: 24c. for creating aggregate window functions. + Patch by Erlend E. Aasland. + + - bpo-40676(113): Convert *note csv: 28. to use Argument Clinic for + *note csv.field_size_limit(): 11ed, *note csv.get_dialect(): 11ee, + *note csv.unregister_dialect(): 11ef. and *note + csv.list_dialects(): 11f0. + + - bpo-39716(114): Raise an ArgumentError when the same subparser name + is added twice to an *note argparse.ArgumentParser: a3e. This is + consistent with the (default) behavior when the same option string + is added twice to an ArgumentParser. + + - bpo-36073(115): Raise *note ProgrammingError: 247. instead of + segfaulting on recursive usage of cursors in *note sqlite3: ef. + converters. Patch by Sergey Fedoseev. + + - bpo-34975(116): Adds a ‘start_tls()’ method to ‘StreamWriter’, + which upgrades the connection with TLS using the given *note + SSLContext: 430. + + - bpo-22276(117): *note Path: 65f. methods *note glob(): 239. and + *note rglob(): 23a. return only directories if `pattern' ends with + a pathname components separator (‘/’ or *note sep: 23b.). Patch by + Eisuke Kawashima. + + - bpo-24905(118): Add *note blobopen(): 253. to *note + sqlite3.Connection: 24c. *note sqlite3.Blob: 254. allows + incremental I/O operations on blobs. Patch by Aviv Palivoda and + Erlend E. Aasland. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/87901 + + (2) https://github.com/python/cpython/issues/90997 + + (3) https://github.com/python/cpython/issues/92332 + + (4) https://github.com/python/cpython/issues/92356 + + (5) https://github.com/python/cpython/issues/90997 + + (6) https://github.com/python/cpython/issues/92301 + + (7) https://github.com/python/cpython/issues/67248 + + (8) https://github.com/python/cpython/issues/92210 + + (9) https://github.com/python/cpython/issues/80010 + + (10) https://github.com/python/cpython/issues/92118 + + (11) https://github.com/python/cpython/issues/90887 + + (12) https://github.com/python/cpython/issues/91215 + + (13) https://github.com/python/cpython/issues/85984 + + (14) https://github.com/python/cpython/issues/92128 + + (15) https://github.com/python/cpython/issues/92049 + + (16) https://github.com/python/cpython/issues/92062 + + (17) https://github.com/python/cpython/issues/87390 + + (18) https://github.com/python/cpython/issues/88089 + + (19) https://github.com/python/cpython/issues/91996 + + (20) https://github.com/python/cpython/issues/91984 + + (21) https://github.com/python/cpython/issues/91952 + + (22) https://github.com/python/cpython/issues/91954 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=47029 + + (24) https://github.com/python/cpython/issues/91928 + + (25) https://github.com/python/cpython/issues/68966 + + (26) https://peps.python.org/pep-0594/ + + (27) https://github.com/python/cpython/issues/91401 + + (28) https://github.com/python/cpython/issues/64783 + + (29) https://github.com/python/cpython/issues/91910 + + (30) https://github.com/python/cpython/issues/91860 + + (31) https://peps.python.org/pep-0681/ + + (32) https://github.com/python/cpython/issues/91832 + + (33) https://github.com/python/cpython/issues/91827 + + (34) https://github.com/python/cpython/issues/84461 + + (35) https://github.com/python/cpython/issues/91821 + + (36) https://github.com/python/cpython/issues/91217 + + (37) https://github.com/python/cpython/issues/91217 + + (38) https://github.com/python/cpython/issues/91760 + + (39) https://github.com/python/cpython/issues/84461 + + (40) https://github.com/python/cpython/issues/90623 + + (41) https://github.com/python/cpython/issues/91734 + + (42) https://github.com/python/cpython/issues/90633 + + (43) https://github.com/python/cpython/issues/91700 + + (44) https://github.com/python/cpython/issues/91231 + + (45) https://github.com/python/cpython/issues/91621 + + (46) https://github.com/python/cpython/issues/90568 + + (47) https://github.com/python/cpython/issues/91670 + + (48) https://github.com/python/cpython/issues/91217 + + (49) https://github.com/python/cpython/issues/91217 + + (50) https://github.com/python/cpython/issues/91217 + + (51) https://github.com/python/cpython/issues/91217 + + (52) https://github.com/python/cpython/issues/91616 + + (53) https://github.com/python/cpython/issues/91217 + + (54) https://github.com/python/cpython/issues/91217 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=47256 + + (56) https://github.com/python/cpython/issues/91217 + + (57) https://github.com/python/cpython/issues/91595 + + (58) https://github.com/python/cpython/issues/74166 + + (59) https://github.com/python/cpython/issues/91487 + + (60) https://github.com/python/cpython/issues/91575 + + (61) https://github.com/python/cpython/issues/90622 + + (62) https://github.com/python/cpython/issues/89022 + + (63) https://github.com/python/cpython/issues/91526 + + (64) https://github.com/python/cpython/issues/88116 + + (65) https://peps.python.org/pep-0657/ + + (66) https://github.com/python/cpython/issues/69093 + + (67) https://github.com/python/cpython/issues/69093 + + (68) https://github.com/python/cpython/issues/91217 + + (69) https://github.com/python/cpython/issues/91217 + + (70) https://github.com/python/cpython/issues/91404 + + (71) https://github.com/python/cpython/issues/91217 + + (72) https://github.com/python/cpython/issues/91217 + + (73) https://github.com/python/cpython/issues/91276 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=47000 + + (75) https://github.com/python/cpython/issues/91230 + + (76) https://github.com/python/cpython/issues/91217 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=47260 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=47087 + + (79) https://peps.python.org/pep-0655/ + + (80) https://bugs.python.org/issue?@action=redirect&bpo=47061 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=47061 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=47000 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=42012 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=47227 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=47211 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=47135 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=43323 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=46681 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=45100 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=44807 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=46787 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=46720 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=46696 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=46053 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=45639 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=46285 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=44791 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=46547 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=46415 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=46075 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=45995 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=26175 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=45138 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=40318 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=44863 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=44587 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=43827 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=43218 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=38435 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=42066 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=40617 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=40676 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=39716 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=36073 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=34975 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=22276 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=24905 + + +File: python.info, Node: Documentation<7>, Next: Tests<7>, Prev: Library<7>, Up: Python 3 11 0 beta 1 + +1.21.8.4 Documentation +...................... + + - gh-91888(1): Add a new ‘gh’ role to the documentation to link to + GitHub issues. + + - gh-91783(2): Document security issues concerning the use of the + function *note shutil.unpack_archive(): ec9. + + - gh-91547(3): Remove “Undocumented modules” page. + + - gh-91298(4): In ‘importlib.resources.abc’, refined the + documentation of the Traversable Protocol, applying changes from + importlib_resources 5.7.1. + + - bpo-44347(5): Clarify the meaning of `dirs_exist_ok', a kwarg of + *note shutil.copytree(): 675. + + - bpo-36329(6): Remove ‘make -C Doc serve’ in favour of ‘make -C Doc + htmlview’ + + - bpo-47189(7): Add a What’s New in Python 3.11 entry for the Faster + CPython project. Documentation by Ken Jin and Kumar Aditya. + + - bpo-38668(8): Update the introduction to documentation for *note + os.path: c3. to remove warnings that became irrelevant after the + implementations of PEP 383(9) and PEP 529(10). + + - bpo-47115(11): The documentation now lists which members of C + structs are part of the *note Limited API/Stable ABI: 4b8. + + - bpo-46962(12): All docstrings in code snippets are now wrapped into + ‘PyDoc_STR()’ to follow the guideline of PEP 7’s Documentation + Strings paragraph(13). Patch by Oleg Iarygin. + + - bpo-26792(14): Improve the docstrings of *note runpy.run_module(): + 11f2. and *note runpy.run_path(): fbc. Original patch by Andrew + Brezovsky. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/91888 + + (2) https://github.com/python/cpython/issues/91783 + + (3) https://github.com/python/cpython/issues/91547 + + (4) https://github.com/python/cpython/issues/91298 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=44347 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36329 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=47189 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38668 + + (9) https://peps.python.org/pep-0383/ + + (10) https://peps.python.org/pep-0529/ + + (11) https://bugs.python.org/issue?@action=redirect&bpo=47115 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=46962 + + (13) https://www.python.org/dev/peps/pep-0007/#documentation-strings + + (14) https://bugs.python.org/issue?@action=redirect&bpo=26792 + + +File: python.info, Node: Tests<7>, Next: Build<8>, Prev: Documentation<7>, Up: Python 3 11 0 beta 1 + +1.21.8.5 Tests +.............. + + - gh-92169(1): Use ‘warnings_helper.import_deprecated()’ to import + deprecated modules uniformly in tests. Patch by Hugo van Kemenade. + + - gh-84461(2): When multiprocessing is enabled, libregrtest can now + use a Python executable other than ‘sys.executable’ via the + ‘--python’ flag. + + - gh-91904(3): Fix initialization of ‘PYTHONREGRTEST_UNICODE_GUARD’ + which prevented running regression tests on non-UTF-8 locale. + + - gh-91752(4): Added @requires_zlib to + test.test_tools.test_freeze.TestFreeze. + + - gh-91607(5): Fix ‘test_concurrent_futures’ to test the correct + multiprocessing start method context in several cases where the + test logic mixed this up. + + - bpo-40280(6): Threading tests are now skipped on WASM targets + without pthread support. + + - bpo-47109(7): Test for ‘ctypes.macholib.dyld’, + ‘ctypes.macholib.dylib’, and ‘ctypes.macholib.framework’ are + brought from manual pre-*note unittest: 125. times to ‘ctypes.test’ + location and structure. Patch by Oleg Iarygin. + + - bpo-29890(8): Add tests for *note ipaddress.IPv4Interface: 11f4. + and *note ipaddress.IPv6Interface: 11f5. construction with tuple + arguments. Original patch and tests by louisom. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/92169 + + (2) https://github.com/python/cpython/issues/84461 + + (3) https://github.com/python/cpython/issues/91904 + + (4) https://github.com/python/cpython/issues/91752 + + (5) https://github.com/python/cpython/issues/91607 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=47109 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29890 + + +File: python.info, Node: Build<8>, Next: Windows<7>, Prev: Tests<7>, Up: Python 3 11 0 beta 1 + +1.21.8.6 Build +.............. + + - gh-89452(1): gdbm-compat is now preferred over ndbm if both are + available on the system. This allows avoiding the problematic + ndbm.h on macOS. + + - gh-91731(2): Python is now built with ‘-std=c11’ compiler option, + rather than ‘-std=c99’. Patch by Victor Stinner. + + - bpo-47152(3): Add script and make target for generating + ‘sre_constants.h’. + + - bpo-47103(4): Windows ‘PGInstrument’ builds now copy a required DLL + into the output directory, making it easier to run the profile + stage of a PGO build. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/89452 + + (2) https://github.com/python/cpython/issues/91731 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=47152 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=47103 + + +File: python.info, Node: Windows<7>, Next: macOS<2>, Prev: Build<8>, Up: Python 3 11 0 beta 1 + +1.21.8.7 Windows +................ + + - bpo-46907(1): Update Windows installer to use SQLite 3.38.3. + + - bpo-47239(2): Fixed –list and –list-paths output for *note Python + Launcher for Windows: 180. when used in an active virtual + environment. + + - bpo-46907(3): Update Windows installer to use SQLite 3.38.2. + + - bpo-46785(4): Fix race condition between *note os.stat(): 653. and + unlinking a file on Windows, by using errors codes returned by + ‘FindFirstFileW()’ when appropriate in ‘win32_xstat_impl’. + + - bpo-40859(5): Update Windows build to use xz-5.2.5 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46907 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=47239 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46907 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46785 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40859 + + +File: python.info, Node: macOS<2>, Next: Tools/Demos<2>, Prev: Windows<7>, Up: Python 3 11 0 beta 1 + +1.21.8.8 macOS +.............. + + - bpo-46907(1): Update macOS installer to SQLite 3.38.4. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46907 + + +File: python.info, Node: Tools/Demos<2>, Next: C API<5>, Prev: macOS<2>, Up: Python 3 11 0 beta 1 + +1.21.8.9 Tools/Demos +.................... + + - gh-91583(1): Fix regression in the code generated by Argument + Clinic for functions with the ‘defining_class’ parameter. + + - gh-91575(2): Add script ‘Tools/scripts/generate_re_casefix.py’ and + the make target ‘regen-re’ for generating additional data for + case-insensitive matching according to the current Unicode version. + + - gh-91551(3): Remove the ancient Pynche color editor. It has moved + to ‘https://gitlab.com/warsaw/pynche’ + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/91583 + + (2) https://github.com/python/cpython/issues/91575 + + (3) https://github.com/python/cpython/issues/91551 + + +File: python.info, Node: C API<5>, Prev: Tools/Demos<2>, Up: Python 3 11 0 beta 1 + +1.21.8.10 C API +............... + + - gh-88279(1): Deprecate the C functions: *note PySys_SetArgv(): 36a, + *note PySys_SetArgvEx(): 369, *note PySys_SetPath(): 36b. Patch by + Victor Stinner. + + - gh-92154(2): Added the *note PyCode_GetCode(): 34c. function. This + function does the equivalent of the Python code + ‘getattr(code_object, 'co_code')’. + + - gh-92173(3): Fix the ‘closure’ argument to *note + PyEval_EvalCodeEx(): 11fb. + + - gh-91320(4): Fix C++ compiler warnings about “old-style cast” (‘g++ + -Wold-style-cast’) in the Python C API. Use C++ + ‘reinterpret_cast<>’ and ‘static_cast<>’ casts when the Python C + API is used in C++. Patch by Victor Stinner. + + - gh-80527(5): Mark functions as deprecated by PEP 623(6): *note + PyUnicode_AS_DATA(): 375, *note PyUnicode_AS_UNICODE(): 376, *note + PyUnicode_GET_DATA_SIZE(): 37a, *note PyUnicode_GET_SIZE(): 37b. + Patch by Victor Stinner. + + - gh-91768(7): *note Py_REFCNT(): 4dc, *note Py_TYPE(): 355, *note + Py_SIZE(): 357. and *note Py_IS_TYPE(): 11fc. functions argument + type is now ‘PyObject*’, rather than ‘const PyObject*’. Patch by + Victor Stinner. + + - gh-91020(8): Add ‘PyBytes_Type.tp_alloc’ to initialize + ‘PyBytesObject.ob_shash’ for bytes subclasses. + + - bpo-40421(9): Add ‘PyFrame_GetLasti’ C-API function to access frame + object’s ‘f_lasti’ attribute safely from C code. + + - bpo-35134(10): Remove the ‘Include/code.h’ header file. C + extensions should only include the main ‘’ header file. + Patch by Victor Stinner. + + - bpo-47169(11): *note PyOS_CheckStack(): 11fd. is now exported in + the Stable ABI on Windows. + + - bpo-47169(12): ‘PyThread_get_thread_native_id()’ is excluded from + the stable ABI on platforms where it doesn’t exist (like Solaris). + + - bpo-46343(13): Added *note PyErr_GetHandledException(): 341. and + *note PyErr_SetHandledException(): 342. as simpler alternatives to + *note PyErr_GetExcInfo(): 344. and *note PyErr_SetExcInfo(): 343. + + They are included in the stable ABI. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/issues/88279 + + (2) https://github.com/python/cpython/issues/92154 + + (3) https://github.com/python/cpython/issues/92173 + + (4) https://github.com/python/cpython/issues/91320 + + (5) https://github.com/python/cpython/issues/80527 + + (6) https://peps.python.org/pep-0623/ + + (7) https://github.com/python/cpython/issues/91768 + + (8) https://github.com/python/cpython/issues/91020 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40421 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=47169 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=47169 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=46343 + + +File: python.info, Node: Python 3 11 0 alpha 7, Next: Python 3 11 0 alpha 6, Prev: Python 3 11 0 beta 1, Up: Changelog + +1.21.9 Python 3.11.0 alpha 7 +---------------------------- + +`Release date: 2022-04-05' + +* Menu: + +* Core and Builtins: Core and Builtins<9>. +* Library: Library<8>. +* Documentation: Documentation<8>. +* Tests: Tests<8>. +* Build: Build<9>. +* Windows: Windows<8>. +* macOS: macOS<3>. +* Tools/Demos: Tools/Demos<3>. +* C API: C API<6>. + + +File: python.info, Node: Core and Builtins<9>, Next: Library<8>, Up: Python 3 11 0 alpha 7 + +1.21.9.1 Core and Builtins +.......................... + + - bpo-47212(1): Raise *note IndentationError: 393. instead of *note + SyntaxError: 2d6. for a bare ‘except’ with no following indent. + Improve *note SyntaxError: 2d6. locations for an un-parenthesized + generator used as arguments. Patch by Matthieu Dartiailh. + + - bpo-47186(2): Replace ‘JUMP_IF_NOT_EG_MATCH’ by *note + CHECK_EG_MATCH: 2c2. + jump. + + - bpo-47176(3): 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. + + - bpo-47186(4): Replace ‘JUMP_IF_NOT_EXC_MATCH’ by *note + CHECK_EXC_MATCH: 2c1. + jump. + + - bpo-47120(5): Replace the absolute jump opcode ‘JUMP_NO_INTERRUPT’ + by the relative *note JUMP_BACKWARD_NO_INTERRUPT: 2c4. + + - bpo-46841(6): Avoid unnecessary allocations when comparing code + objects. + + - bpo-47182(7): Fix a crash when using a named unicode character like + ‘"\N{digit nine}"’ after the main interpreter has been initialized + a second time. + + - bpo-47162(8): 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 + ‘PY_CALL_TRAMPOLINE’ to enable call trampolines. + + - bpo-46775(9): Some Windows system error codes(>= 10000) are now + mapped into the correct errno and may now raise a subclass of *note + OSError: 413. Patch by Dong-hee Na. + + - bpo-47129(10): Improve error messages in f-string syntax errors + concerning empty expressions. + + - bpo-47117(11): Fix a crash if we fail to decode characters in + interactive mode if the tokenizer buffers are uninitialized. Patch + by Pablo Galindo. + + - bpo-47127(12): Speed up calls to c functions with keyword arguments + by 25% with specialization. Patch by Kumar Aditya. + + - bpo-47120(13): Replaced ‘JUMP_ABSOLUTE’ by the relative jump *note + JUMP_BACKWARD: 2c3. + + - bpo-42197(14): ‘PyFrame_FastToLocalsWithError()’ and + ‘PyFrame_LocalsToFast()’ are no longer called during profiling nor + tracing. C code can access the ‘f_locals’ attribute of *note + PyFrameObject: 35d. by calling *note PyFrame_GetLocals(): 35b. + + - bpo-47070(15): Improve performance of ‘array_inplace_repeat’ by + reducing the number of invocations of ‘memcpy’. Refactor the + ‘repeat’ and inplace ‘repeat’ methods of ‘array’, ‘bytes’, + ‘bytearray’ and ‘unicodeobject’ to use the common + ‘_PyBytes_Repeat’. + + - bpo-47053(16): Reduce de-optimization in the specialized + ‘BINARY_OP_INPLACE_ADD_UNICODE’ opcode. + + - bpo-47045(17): Remove the ‘f_state’ field from the + _PyInterpreterFrame struct. Add the ‘owner’ field to the + _PyInterpreterFrame struct to make ownership explicit to simplify + clearing and deallocing frames and generators. + + - bpo-46968(18): Check for the existence of the “sys/auxv.h” header + in *note faulthandler: 78. to avoid compilation problems in systems + where this header doesn’t exist. Patch by Pablo Galindo + + - bpo-46329(19): Use low bit of ‘LOAD_GLOBAL’ to indicate whether to + push a ‘NULL’ before the global. Helps streamline the call + sequence a bit. + + - bpo-46841(20): Quicken bytecode in-place by storing it as part of + the corresponding ‘PyCodeObject’. + + - bpo-47012(21): Speed up iteration of *note bytes: 1b4. and *note + bytearray: 1a5. by 30%. Patch by Kumar Aditya. + + - bpo-47009(22): Improved the performance of ‘list.append()’ and list + comprehensions by optimizing for the common case, where no resize + is needed. Patch by Dennis Sweeney. + + - bpo-47005(23): Improve performance of ‘bytearray_repeat’ and + ‘bytearray_irepeat’ by reducing the number of invocations of + ‘memcpy’. + + - bpo-46829(24): Deprecate passing a message into *note + asyncio.Future.cancel(): 1200. and *note asyncio.Task.cancel(): + 1201. + + - bpo-46993(25): Speed up *note bytearray: 1a5. creation from *note + list: 1e9. and *note tuple: 539. by 40%. Patch by Kumar Aditya. + + - bpo-39829(26): Removed the ‘__len__()’ call when initializing a + list and moved initializing to ‘list_extend’. Patch by Jeremiah + Pascual. + + - bpo-46944(27): Speed up throwing exception in generator with *note + METH_FASTCALL: 1202. calling convention. Patch by Kumar Aditya. + + - bpo-46841(28): Modify *note STORE_SUBSCR: 1203. to use an inline + cache entry (rather than its oparg) as an adaptive counter. + + - bpo-46841(29): Use inline caching for *note PRECALL: 2ba. and *note + CALL: 2bb, and remove the internal machinery for managing the (now + unused) non-inline caches. + + - bpo-46881(30): Statically allocate and initialize the latin1 + characters. + + - bpo-46838(31): Improve syntax errors for incorrect function + definitions. Patch by Pablo Galindo + + - bpo-43721(32): Fix docstrings of ‘getter’, ‘setter’, and ‘deleter’ + to clarify that they create a new copy of the property. + + - bpo-43224(33): Make grammar changes required for PEP 646. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=47212 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=47186 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=47176 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=47186 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=47120 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=47182 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=47162 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46775 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=47129 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=47117 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=47127 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=47120 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=42197 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=47070 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=47053 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=47045 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=46968 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=46329 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=47012 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=47009 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=47005 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=46829 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=46993 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=39829 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=46944 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=46881 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=46838 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=43721 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=43224 + + +File: python.info, Node: Library<8>, Next: Documentation<8>, Prev: Core and Builtins<9>, Up: Python 3 11 0 alpha 7 + +1.21.9.2 Library +................ + + - bpo-47208(1): Allow vendors to override ‘CTYPES_MAX_ARGCOUNT’. + + - bpo-23689(2): *note re: da. module: fix memory leak when a match is + terminated by a signal or memory allocation failure. Patch by Ma + Lin. + + - bpo-47167(3): Allow overriding a future compliance check in *note + asyncio.Task: 1e3. + + - bpo-47151(4): 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. + + - bpo-47152(5): Convert the *note re: da. module into a package. + Deprecate modules ‘sre_compile’, ‘sre_constants’ and ‘sre_parse’. + + - bpo-4833(6): Add ‘ZipFile.mkdir()’ + + - bpo-27929(7): Fix *note asyncio.loop.sock_connect(): a4a. to only + resolve names for *note socket.AF_INET: 1205. or *note + socket.AF_INET6: 1206. families. Resolution may not make sense for + other families, like ‘socket.AF_BLUETOOTH’ and *note + socket.AF_UNIX: 1207. + + - bpo-14265(8): Adds the fully qualified test name to unittest output + + - bpo-47061(9): Deprecate the aifc module. + + - bpo-39622(10): Handle Ctrl+C in asyncio programs to interrupt the + main task. + + - bpo-47101(11): *note hashlib.algorithms_available: 1004. 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. + + - bpo-47099(12): All ‘URLError’ exception messages raised in *note + urllib.request.URLopener: 1208. now contain a colon between ‘ftp + error’ and the rest of the message. Previously, ‘open_ftp()’ + missed the colon. Patch by Oleg Iarygin. + + - bpo-47099(13): Exception chaining is changed from + ‘Exception.with_traceback()’/*note sys.exc_info(): 25b. to PEP + 3134(14). Patch by Oleg Iarygin. + + - bpo-47095(15): *note hashlib: 88.’s internal ‘_blake2’ module now + prefers ‘libb2’ from ‘https://www.blake2.net/’ over Python’s + vendored copy of blake2. + + - bpo-47098(16): The Keccak Code Package for *note hashlib: 88.’s + internal ‘_sha3’ module has been replaced with tiny_sha3. The + module is used as fallback when Python is built without OpenSSL. + + - bpo-47088(17): Implement *note typing.LiteralString: 190, part of + PEP 675(18). Patch by Jelle Zijlstra. + + - bpo-42885(19): Optimize *note re.search(): edf, *note re.split(): + 7cb, *note re.findall(): cd6, *note re.finditer(): 1209. and *note + re.sub(): 85d. for regular expressions starting with ‘\A’ or ‘^’. + + - bpo-23691(20): Protect the *note re.finditer(): 1209. iterator from + re-entering. + + - bpo-47067(21): Optimize calling ‘GenericAlias’ objects by using PEP + 590(22) ‘vectorcall’ and by replacing ‘PyObject_SetAttrString’ with + ‘PyObject_SetAttr’. + + - bpo-28080(23): Add the `metadata_encoding' parameter in the *note + zipfile.ZipFile: 28c. constructor and the ‘--metadata-encoding’ + option in the *note zipfile: 14d. CLI to allow reading zipfiles + using non-standard codecs to encode the filenames within the + archive. + + - bpo-47000(24): Make *note io.text_encoding(): 120a. returns “utf-8” + when UTF-8 mode is enabled. + + - bpo-42369(25): Fix thread safety of ‘zipfile._SharedFile.tell()’ to + avoid a “zipfile.BadZipFile: Bad CRC-32 for file” exception when + reading a ‘ZipFile’ from multiple threads. + + - bpo-38256(26): Fix *note binascii.crc32(): 120b. 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 *note binascii.crc32(): 120b. release the GIL when + computing on larger inputs as *note zlib.crc32(): 120c. and *note + hashlib: 88. do. + + This also boosts performance on Windows as it now uses the zlib + crc32 implementation for *note binascii.crc32(): 120b. 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. + + - bpo-47066(27): Global inline flags (e.g. ‘(?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. + + - bpo-39394(28): A warning about inline flags not at the start of the + regular expression now contains the position of the flag. + + - bpo-433030(29): Add support of atomic grouping (‘(?>...)’) and + possessive quantifiers (‘*+’, ‘++’, ‘?+’, ‘{m,n}+’) in *note + regular expressions: da. + + - bpo-47062(30): Implement *note asyncio.Runner: 1d6. context + manager. + + - bpo-46382(31): *note dataclass(): 193. ‘slots=True’ now correctly + omits slots already defined in base classes. Patch by Arie + Bovenberg. + + - bpo-47057(32): Use FASTCALL convention for ‘FutureIter.throw()’ + + - bpo-47061(33): Deprecate the various modules listed by PEP 594(34): + + aifc, asynchat, asyncore, audioop, cgi, cgitb, chunk, crypt, + imghdr, msilib, nntplib, nis, ossaudiodev, pipes, smtpd, sndhdr, + spwd, sunau, telnetlib, uu, xdrlib + + - bpo-34790(35): Remove passing coroutine objects to *note + asyncio.wait(): 591. + + - bpo-47039(36): Normalize ‘repr()’ of asyncio future and task + objects. + + - bpo-2604(37): Fix bug where doctests using globals would fail when + run multiple times. + + - bpo-45150(38): Add *note hashlib.file_digest(): 218. helper for + efficient hashing of file object. + + - bpo-34861(39): Made cumtime the default sorting key for cProfile + + - bpo-45997(40): Fix *note asyncio.Semaphore: 6c6. re-aquiring FIFO + order. + + - bpo-47022(41): The *note asynchat: 8, *note asyncore: a. and *note + smtpd: e9. 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 ( PEP 594(42)). + + - bpo-43253(43): Fix a crash when closing transports where the + underlying socket handle is already invalid on the Proactor event + loop. + + - bpo-40280(44): *note select.select(): a1e. now passes ‘NULL’ to + ‘select’ for each empty fdset. + + - bpo-47004(45): Apply bugfixes from importlib_metadata 4.11.3, + including bugfix for EntryPoint.extras, which was returning match + objects and not the extras strings. + + - bpo-46998(46): Allow subclassing of *note typing.Any: 272. Patch + by Shantanu Jain. + + - bpo-46995(47): Deprecate missing *note asyncio.Task.set_name(): + 620. for third-party task implementations, schedule making it + mandatory in Python 3.13. + + - bpo-46994(48): Accept explicit contextvars.Context in *note + asyncio.create_task(): 1d2. and *note asyncio.loop.create_task(): + 61f. + + - bpo-46981(49): ‘typing.get_args(typing.Tuple[()])’ now returns ‘()’ + instead of ‘((),)’. + + - bpo-46968(50): Add ‘os.sysconf_names['SC_MINSIGSTKSZ']’. + + - bpo-46985(51): Upgrade pip wheel bundled with ensurepip (pip + 22.0.4) + + - bpo-46968(52): *note faulthandler: 78.: On Linux 5.14 and newer, + dynamically determine size of signal handler stack size CPython + allocates using ‘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. + + - bpo-46917(53): The *note math.nan: 234. value is now always + available. Patch by Victor Stinner. + + - bpo-46955(54): Expose ‘asyncio.base_events.Server’ as *note + asyncio.Server: 765. Patch by Stefan Zabka. + + - bpo-23325(55): The *note signal: e7. module no longer assumes that + *note SIG_IGN: 120d. and *note SIG_DFL: 120e. are small int + singletons. + + - bpo-46932(56): Update bundled libexpat to 2.4.7 + + - bpo-46933(57): The *note pwd: d3. module is now optional. *note + os.path.expanduser(): 65d. returns the path when the *note pwd: d3. + module is not available. + + - bpo-40059(58): PEP 680(59), the *note tomllib: 11b. module. Adds + support for parsing TOML. + + - bpo-464471(60): *note asyncio.timeout(): 1d4. and *note + asyncio.timeout_at(): 120f. context managers added. Patch by Tin + Tvrtković and Andrew Svetlov. + + - bpo-46805(61): Added raw datagram socket functions for asyncio: + ‘sock_sendto()’, ‘sock_recvfrom()’ and ‘sock_recvfrom_into()’. + + - bpo-46644(62): No longer require valid typeforms to be callable. + This allows *note typing.Annotated: 585. to wrap *note + typing.ParamSpecArgs: 3b2. and ‘dataclasses.InitVar’. Patch by + Gregory Beauregard. + + - bpo-46581(63): Brings ‘ParamSpec’ propagation for ‘GenericAlias’ in + line with ‘Concatenate’ (and others). + + - bpo-45413(64): Define `posix_venv' and `nt_venv' *note sysconfig + installation schemes: 25f. 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 *note + venv: 12f. 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, *note + sysconfig.get_default_scheme(): 1210. and *note + sysconfig.get_preferred_scheme(): 260. with ‘key="prefix"’ returns + `venv'. + + - bpo-43224(65): Implement support for PEP 646 in typing.py. + + - bpo-43224(66): Allow unpacking types.GenericAlias objects, e.g. + ‘*tuple[int, str]’. + + - bpo-46557(67): 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. + + - bpo-41370(68): *note typing.get_type_hints(): 277. now supports + evaluating strings as forward references in *note PEP 585 generic + aliases: 278. + + - bpo-46607(69): Add *note DeprecationWarning: 2d4. to + ‘LegacyInterpolation’, deprecated in the docstring since Python + 3.2. Will be removed in Python 3.13. Use ‘BasicInterpolation’ or + ‘ExtendedInterpolation’ instead. + + - bpo-26120(70): *note pydoc: d6. now excludes __future__ imports + from the module’s data items. + + - bpo-46480(71): Add *note typing.assert_type(): 270. Patch by Jelle + Zijlstra. + + - bpo-46421(72): Fix a unittest issue where if the command was + invoked as ‘python -m unittest’ and the filename(s) began with a + dot (.), a ‘ValueError’ is returned. + + - bpo-46245(73): Add optional parameter `dir_fd' in *note + shutil.rmtree(): 23f. + + - bpo-22859(74): ‘usageExit()’ is marked deprecated, to be removed in + 3.13. + + - bpo-46170(75): Improve the error message when you try to subclass + an instance of *note typing.NewType: 964. + + - bpo-40296(76): Fix supporting generic aliases in *note pydoc: d6. + + - bpo-20392(77): Fix inconsistency with uppercase file extensions in + ‘MimeTypes.guess_type()’. Patch by Kumar Aditya. + + - bpo-46030(78): Add ‘LOCAL_CREDS’, ‘LOCAL_CREDS_PERSISTENT’ and + ‘SCM_CREDS2’ FreeBSD constants to the socket module. + + - bpo-44439(79): Fix ‘.write()’ method of a member file in ‘ZipFile’, + when the input data is an object that supports the buffer protocol, + the file length may be wrong. + + - bpo-45171(80): Fix handling of the ‘stacklevel’ argument to logging + functions in the *note logging: a8. module so that it is consistent + across all logging functions and, as advertised, similar to the + ‘stacklevel’ argument used in *note warn(): 1152. + + - bpo-24959(81): Fix bug where *note unittest: 125. sometimes drops + frames from tracebacks of exceptions raised in tests. + + - bpo-44859(82): Raise more accurate and PEP 249(83) compatible + exceptions in *note sqlite3: ef. + + * Raise *note InterfaceError: 24f. instead of *note + ProgrammingError: 247. for ‘SQLITE_MISUSE’ errors. + + * Don’t overwrite *note BufferError: 1211. with *note + ValueError: 1c8. when conversion to BLOB fails. + + * Raise *note ProgrammingError: 247. instead of *note Warning: + 1212. if user tries to *note execute(): 1213. more than one + SQL statement. + + * Raise *note ProgrammingError: 247. instead of *note + ValueError: 1c8. if an SQL query contains null characters. + + - bpo-44493(84): 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. + + - bpo-41930(85): Add *note serialize(): 250. and *note deserialize(): + 251. support to *note sqlite3: ef. Patch by Erlend E. Aasland. + + - bpo-33178(86): Added *note ctypes.BigEndianUnion: 1214. and *note + ctypes.LittleEndianUnion: 1215. classes, as originally documented + in the library docs but not yet implemented. + + - bpo-43352(87): Add an Barrier object in synchronization primitives + of `asyncio' Lib in order to be consistant with Barrier from + `threading' and `multiprocessing' libs* + + - bpo-35859(88): *note re: da. module, fix a few bugs about capturing + group. In rare cases, capturing group gets an incorrect string. + Patch by Ma Lin. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=47208 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23689 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=47167 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=47151 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=47152 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=4833 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27929 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=14265 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=47061 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39622 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=47101 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=47099 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=47099 + + (14) https://peps.python.org/pep-3134/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=47095 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=47098 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=47088 + + (18) https://peps.python.org/pep-0675/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=42885 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23691 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=47067 + + (22) https://peps.python.org/pep-0590/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=28080 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=47000 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=42369 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=38256 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=47066 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=39394 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=433030 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=47062 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=46382 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=47057 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=47061 + + (34) https://peps.python.org/pep-0594/ + + (35) https://bugs.python.org/issue?@action=redirect&bpo=34790 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=47039 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=2604 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=45150 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=34861 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=45997 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=47022 + + (42) https://peps.python.org/pep-0594/ + + (43) https://bugs.python.org/issue?@action=redirect&bpo=43253 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=47004 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=46998 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=46995 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=46994 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=46981 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=46968 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=46985 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=46968 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=46917 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=46955 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=23325 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=46932 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=46933 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=40059 + + (59) https://peps.python.org/pep-0680/ + + (60) https://bugs.python.org/issue?@action=redirect&bpo=464471 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=46805 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=46644 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=46581 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=45413 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=43224 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=43224 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=46557 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=41370 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=46607 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=26120 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=46480 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=46421 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=46245 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=22859 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=46170 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=40296 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=20392 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=46030 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=44439 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=45171 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=24959 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=44859 + + (83) https://peps.python.org/pep-0249/ + + (84) https://bugs.python.org/issue?@action=redirect&bpo=44493 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=41930 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=33178 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=43352 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=35859 + + +File: python.info, Node: Documentation<8>, Next: Tests<8>, Prev: Library<8>, Up: Python 3 11 0 alpha 7 + +1.21.9.3 Documentation +...................... + + - bpo-45099(1): Document internal *note asyncio: 9. API. + + - bpo-47126(2): Update PEP URLs to PEP 676(3)’s new canonical form. + + - bpo-47040(4): Clarified the old Python versions compatiblity note + of *note binascii.crc32(): 120b. / *note zlib.adler32(): 1217. / + *note zlib.crc32(): 120c. functions. + + - bpo-46033(5): Clarify ‘for’ statement execution in its doc. + + - bpo-45790(6): Adjust inaccurate phrasing in *note Defining + Extension Types; Tutorial: 1218. about the ‘ob_base’ field and the + macros used to access its contents. + + - bpo-42340(7): Document that in some circumstances *note + KeyboardInterrupt: 611. may cause the code to enter an inconsistent + state. Provided a sample workaround to avoid it if needed. + + - bpo-41233(8): Link the errnos referenced in + ‘Doc/library/exceptions.rst’ to their respective section in + ‘Doc/library/errno.rst’, and vice versa. Previously this was only + done for EINTR and InterruptedError. Patch by Yan “yyyyyyyan” + Orestes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45099 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=47126 + + (3) https://peps.python.org/pep-0676/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=47040 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46033 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45790 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42340 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41233 + + +File: python.info, Node: Tests<8>, Next: Build<9>, Prev: Documentation<8>, Up: Python 3 11 0 alpha 7 + +1.21.9.4 Tests +.............. + + - bpo-47205(1): Skip test for *note sched_getaffinity(): db5. and + *note sched_setaffinity(): db9. error case on FreeBSD. + + - bpo-46126(2): Restore ‘descriptions’ when running tests internally. + + - bpo-47104(3): Rewrite *note asyncio.to_thread(): 528. tests to use + *note unittest.IsolatedAsyncioTestCase: 284. + + - bpo-40280(4): The test suite is now passing on the Emscripten + platform. All fork, socket, and subprocess-based tests are + skipped. + + - bpo-47037(5): Skip ‘strftime("%4Y")’ feature test on Windows. It + can cause an assertion error in debug builds. + + - bpo-46587(6): Skip tests if platform’s ‘strftime’ does not support + non-portable glibc extensions. + + - bpo-47015(7): A test case for *note os.sendfile(): 762. is + converted from deprecated *note asyncore: a. (see PEP 594(8)) to + *note asyncio: 9. Patch by Oleg Iarygin. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=47205 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46126 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=47104 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=47037 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46587 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=47015 + + (8) https://peps.python.org/pep-0594/ + + +File: python.info, Node: Build<9>, Next: Windows<8>, Prev: Tests<8>, Up: Python 3 11 0 alpha 7 + +1.21.9.5 Build +.............. + + - bpo-40280(1): Add configure option *note + –enable-wasm-dynamic-linking: 121b. to enable ‘dlopen’ and + MAIN_MODULE / SIDE_MODULE on ‘wasm32-emscripten’. + + - bpo-46023(2): ‘makesetup’ now detects and skips all duplicated + module definitions. The first entry wins. + + - bpo-40280(3): Add SOABI ‘wasm32-emscripten’ for Emscripten and + ‘wasm32-wasi’ for WASI on 32bit WASM as well as ‘wasm64’ counter + parts. + + - bpo-47032(4): Ensure Windows install builds fail correctly with a + non-zero exit code when part of the build fails. + + - bpo-47024(5): Update OpenSSL to 1.1.1n for macOS installers and all + Windows builds. + + - bpo-46996(6): The *note tkinter: 10e. package now requires Tcl/Tk + version 8.5.12 or newer. + + - bpo-46973(7): Add ‘regen-configure’ make target to regenerate + configure script with Christian’s container image + ‘quay.io/tiran/cpython_autoconf:269’. + + - bpo-46917(8): Building Python now requires support of IEEE 754 + floating point numbers. Patch by Victor Stinner. + + - bpo-45774(9): ‘configure’ now verifies that all SQLite C APIs + needed for the *note sqlite3: ef. extension module are found. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46023 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=47032 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=47024 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46996 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46973 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46917 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45774 + + +File: python.info, Node: Windows<8>, Next: macOS<3>, Prev: Build<9>, Up: Python 3 11 0 alpha 7 + +1.21.9.6 Windows +................ + + - bpo-47194(1): Update ‘zlib’ to v1.2.12 to resolve CVE-2018-25032. + + - bpo-47171(2): Enables installing the ‘py.exe’ launcher on Windows + ARM64. + + - bpo-46566(3): Upgraded *note Python Launcher for Windows: 180. to + support a new ‘-V:company/tag’ argument for full PEP 514(4) support + and to detect ARM64 installs. The ‘-64’ suffix on arguments is + deprecated, but still selects any non-32-bit install. Setting + ‘PYLAUNCHER_ALLOW_INSTALL’ and specifying a version that is not + installed will attempt to install the requested version from the + Microsoft Store. + + - bpo-47086(5): The installer for Windows now includes documentation + as loose HTML files rather than a single compiled ‘.chm’ file. + + - bpo-46907(6): Update Windows installer to use SQLite 3.38.1. + + - bpo-44549(7): Update bzip2 to 1.0.8 in Windows builds to mitigate + CVE-2016-3189 and CVE-2019-12900 + + - bpo-46948(8): Prevent CVE-2022-26488 by ensuring the Add to PATH + option in the Windows installer uses the correct path when being + repaired. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=47194 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=47171 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46566 + + (4) https://peps.python.org/pep-0514/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=47086 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46907 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=44549 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46948 + + +File: python.info, Node: macOS<3>, Next: Tools/Demos<3>, Prev: Windows<8>, Up: Python 3 11 0 alpha 7 + +1.21.9.7 macOS +.............. + + - bpo-46890(1): Fix a regression in the setting of + ‘sys._base_executable’ in framework builds, and thereby fix a + regression in *note venv: 12f. virtual environments with such + builds. + + - bpo-46907(2): Update macOS installer to SQLite 3.38.1. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46890 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46907 + + +File: python.info, Node: Tools/Demos<3>, Next: C API<6>, Prev: macOS<3>, Up: Python 3 11 0 alpha 7 + +1.21.9.8 Tools/Demos +.................... + + - bpo-40280(1): Replace Emscripten’s limited shell with Katie Bell’s + browser-ui REPL from python-wasm project. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + +File: python.info, Node: C API<6>, Prev: Tools/Demos<3>, Up: Python 3 11 0 alpha 7 + +1.21.9.9 C API +.............. + + - bpo-40421(1): Add ‘PyFrame_GetBuiltins’, ‘PyFrame_GetGenerator’ and + ‘PyFrame_GetGlobals’ C-API functions to access frame object + attributes safely from C code. + + - bpo-46850(2): Move the private ‘_PyFrameEvalFunction’ type, and + private ‘_PyInterpreterState_GetEvalFrameFunc()’ and + ‘_PyInterpreterState_SetEvalFrameFunc()’ functions to the internal + C API. The ‘_PyFrameEvalFunction’ callback function type now uses + the ‘_PyInterpreterFrame’ type which is part of the internal C API. + Patch by Victor Stinner. + + - bpo-46850(3): Move the private undocumented + ‘_PyEval_EvalFrameDefault()’ function to the internal C API. The + function now uses the ‘_PyInterpreterFrame’ type which is part of + the internal C API. Patch by Victor Stinner. + + - bpo-46850(4): Remove the private undocumented function + ‘_PyEval_CallTracing()’ from the C API. Call the public *note + sys.call_tracing(): 1220. function instead. Patch by Victor + Stinner. + + - bpo-46850(5): Remove the private undocumented function + ‘_PyEval_GetCoroutineOriginTrackingDepth()’ from the C API. Call + the public *note sys.get_coroutine_origin_tracking_depth(): 7ed. + function instead. Patch by Victor Stinner. + + - bpo-46850(6): Remove the following private undocumented functions + from the C API: + + * ‘_PyEval_GetAsyncGenFirstiter()’ + + * ‘_PyEval_GetAsyncGenFinalizer()’ + + * ‘_PyEval_SetAsyncGenFirstiter()’ + + * ‘_PyEval_SetAsyncGenFinalizer()’ + + Call the public *note sys.get_asyncgen_hooks(): 1221. and *note + sys.set_asyncgen_hooks(): 1222. functions instead. Patch by Victor + Stinner. + + - bpo-46987(7): Remove private functions ‘_PySys_GetObjectId()’ and + ‘_PySys_SetObjectId()’. Patch by Dong-hee Na. + + - bpo-46906(8): Add new functions to pack and unpack C double + (serialize and deserialize): *note PyFloat_Pack2(): 337, *note + PyFloat_Pack4(): 338, *note PyFloat_Pack8(): 339, *note + PyFloat_Unpack2(): 33a, *note PyFloat_Unpack4(): 33b. and *note + PyFloat_Unpack8(): 33c. Patch by Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40421 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46850 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46850 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46850 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46850 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46850 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46987 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46906 + + +File: python.info, Node: Python 3 11 0 alpha 6, Next: Python 3 11 0 alpha 5, Prev: Python 3 11 0 alpha 7, Up: Changelog + +1.21.10 Python 3.11.0 alpha 6 +----------------------------- + +`Release date: 2022-03-07' + +* Menu: + +* Core and Builtins: Core and Builtins<10>. +* Library: Library<9>. +* Documentation: Documentation<9>. +* Tests: Tests<9>. +* Build: Build<10>. +* Windows: Windows<9>. +* IDLE: IDLE<4>. +* C API: C API<7>. + + +File: python.info, Node: Core and Builtins<10>, Next: Library<9>, Up: Python 3 11 0 alpha 6 + +1.21.10.1 Core and Builtins +........................... + + - bpo-46940(1): Avoid overriding *note AttributeError: 19d. metadata + information for nested attribute access calls. Patch by Pablo + Galindo. + + - bpo-46927(2): Include the type’s name in the error message for + subscripting non-generic types. + + - bpo-46921(3): Support vectorcall for ‘super()’. Patch by Ken Jin. + + - bpo-46841(4): Fix incorrect handling of inline cache entries when + specializing *note BINARY_OP: 2b8. + + - bpo-46841(5): Use an oparg to simplify the construction of helpful + error messages in *note GET_AWAITABLE: 1225. + + - bpo-46903(6): Make sure that str subclasses can be used as + attribute names for instances with virtual dictionaries. Fixes + regression in 3.11alpha + + - bpo-46841(7): Add more detailed specialization failure stats for + *note COMPARE_OP: 5bd. followed by *note EXTENDED_ARG: 11a9. + + - bpo-46891(8): Fix bug introduced during 3.11alpha where subclasses + of ‘types.ModuleType’ with ‘__slots__’ were not initialized + correctly, resulting in an interpreter crash. + + - bpo-46841(9): Use inline caching for *note LOAD_ATTR: 1226, *note + LOAD_METHOD: 88a, and *note STORE_ATTR: 1227. + + - bpo-46841(10): Use inline cache for *note BINARY_SUBSCR: 1228. + + - bpo-46841(11): Use inline caching for *note COMPARE_OP: 5bd. + + - bpo-46864(12): Deprecate ‘PyBytesObject.ob_shash’. It will be + removed in Python 3.13. + + - bpo-46841(13): Use inline caching for *note UNPACK_SEQUENCE: 1229. + + - bpo-46845(14): Reduces dict size by removing hash value from hash + table when all inserted keys are Unicode. For example, + ‘sys.getsizeof(dict.fromkeys("abcdefg"))’ becomes 272 bytes from + 352 bytes on 64bit platform. + + - bpo-46841(15): Use inline cache for *note LOAD_GLOBAL: 122a. + + - bpo-46852(16): Rename the private undocumented + ‘float.__set_format__()’ method to ‘float.__setformat__()’ to fix a + typo introduced in Python 3.7. The method is only used by + test_float. Patch by Victor Stinner. + + - bpo-46852(17): Remove the undocumented private + ‘float.__set_format__()’ method, previously known as + ‘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. + + - bpo-40116(18): Fix regression that dict.update(other) may don’t + respect iterate order of other when other is key sharing dict. + + - bpo-46712(19): Share global string identifiers in deep-frozen + modules. + + - bpo-46430(20): Fix memory leak in interned strings of deep-frozen + modules. + + - bpo-46841(21): Store *note BINARY_OP: 2b8. caches inline using a + new *note CACHE: 2b7. instruction. + + - bpo-45107(22): Specialize ‘LOAD_METHOD’ for instances with a dict. + + - bpo-44337(23): Reduce the memory usage of specialized *note + LOAD_ATTR: 1226. and *note STORE_ATTR: 1227. instructions. + + - bpo-46729(24): Add number of sub-exceptions to + ‘BaseException.__str__()’. + + - bpo-45885(25): Don’t un-adapt *note COMPARE_OP: 5bd. when + collecting specialization stats. + + - bpo-46329(26): Fix specialization stats gathering for *note + PRECALL: 2ba. instructions. + + - bpo-46794(27): Bump up the libexpat version into 2.4.6 + + - bpo-46823(28): Implement a specialized combined opcode + ‘LOAD_FAST__LOAD_ATTR_INSTANCE_VALUE’. Patch by Dennis Sweeney. + + - bpo-46820(29): Fix parsing a numeric literal immediately (without + spaces) followed by “not in” keywords, like in ‘1not in x’. Now + the parser only emits a warning, not a syntax error. + + - bpo-46329(30): Move ‘KW_NAMES’ before ‘PRECALL’ instruction in call + sequence. Change ‘operand’ of ‘CALL’ to match ‘PRECALL’ for easier + specialization. + + - bpo-46808(31): Remove the ‘NEXT_BLOCK’ macro from compile.c, and + make the compiler automatically generate implicit blocks when they + are needed. + + - bpo-46329(32): Add ‘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. ‘PRECALL_FUNCTION’ and + ‘PRECALL_METHOD’ are merged into a single ‘PRECALL’ instruction. + + There is no change in semantics. + + - bpo-46762(33): 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. + + - bpo-46730(34): 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. + + - bpo-46724(35): Make sure that all backwards jumps use the + ‘JUMP_ABSOLUTE’ instruction, rather than ‘JUMP_FORWARD’ with an + argument of ‘(2**32)+offset’. + + - bpo-46732(36): Correct the docstring for the ‘__bool__()’ method. + Patch by Jelle Zijlstra. + + - bpo-46072(37): Add more detailed specialization failure statistics + for *note BINARY_OP: 2b8. + + - bpo-46707(38): Avoid potential exponential backtracking when + producing some syntax errors involving lots of brackets. Patch by + Pablo Galindo. + + - bpo-46323(39): *note ctypes: 29. now allocates memory on the stack + instead of on the heap to pass arguments while calling a Python + callback function. Patch by Dong-hee Na. + + - bpo-45923(40): Add a quickened form of *note RESUME: 2cf. that + skips quickening checks. + + - bpo-46702(41): Specialize *note UNPACK_SEQUENCE: 1229. for *note + tuple: 539. and *note list: 1e9. unpackings. + + - bpo-46072(42): Opcode pair stats are now gathered with + ‘--enable-pystats’. Defining ‘DYNAMIC_EXECUTION_PROFILE’ or + ‘DXPAIRS’ no longer has any effect. + + - bpo-46675(43): Allow more than 16 items in a split dict before it + is combined. The limit is now 254. + + - bpo-40479(44): Add a missing call to ‘va_end()’ in + ‘Modules/_hashopenssl.c’. + + - bpo-46323(45): Use *note PyObject_Vectorcall(): 122b. while calling + ctypes callback function. Patch by Dong-hee Na. + + - bpo-46615(46): When iterating over sets internally in + ‘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. + + - bpo-45828(47): The bytecode compiler now attempts to apply runtime + stack manipulations at compile-time (whenever it is feasible to do + so). + + - bpo-30496(48): Fixed a minor portability issue in the + implementation of *note PyLong_FromLong(): 122c, and added a fast + path for single-digit integers to *note PyLong_FromLongLong(): + 122d. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46940 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46927 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46921 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46903 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46891 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=46864 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=46845 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=46852 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=46852 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=40116 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=46712 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=46430 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=46841 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45107 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=44337 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=46729 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=45885 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=46329 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=46794 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=46823 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=46820 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=46329 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=46808 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=46329 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=46762 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=46730 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=46724 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=46732 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=46072 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=46707 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=46323 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=45923 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=46702 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=46072 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=46675 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=40479 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=46323 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=46615 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=45828 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=30496 + + +File: python.info, Node: Library<9>, Next: Documentation<9>, Prev: Core and Builtins<10>, Up: Python 3 11 0 alpha 6 + +1.21.10.2 Library +................. + + - bpo-25707(1): Fixed a file leak in *note + xml.etree.ElementTree.iterparse(): cbd. when the iterator is not + exhausted. Patch by Jacob Walls. + + - bpo-46877(2): Export *note unittest.doModuleCleanups(): 122f. in + *note unittest: 125. Patch by Kumar Aditya. + + - bpo-46848(3): For performance, use the optimized string-searching + implementations from *note find(): 1230. and *note rfind(): 1231. + for ‘find()’ and ‘rfind()’. + + - bpo-46736(4): *note SimpleHTTPRequestHandler: 799. now uses HTML5 + grammar. Patch by Dong-hee Na. + + - bpo-44886(5): Inherit asyncio proactor datagram transport from + *note asyncio.DatagramTransport: 1232. + + - bpo-46827(6): Support UDP sockets in *note + asyncio.loop.sock_connect(): a4a. for selector-based event loops. + Patch by Thomas Grainger. + + - bpo-46811(7): Make test suite support Expat >=2.4.5 + + - bpo-46252(8): Raise *note TypeError: 19c. if *note ssl.SSLSocket: + 52a. is passed to transport-based APIs. + + - bpo-46784(9): Fix libexpat symbols collisions with user dynamically + loaded or statically linked libexpat in embedded Python. + + - bpo-46786(10): The HTML serialisation in xml.etree.ElementTree now + writes ‘embed’, ‘source’, ‘track’ and ‘wbr’ as empty tags, as + defined in HTML 5. + + - bpo-39327(11): *note shutil.rmtree(): 23f. can now work with + VirtualBox shared folders when running from the guest + operating-system. + + - bpo-45390(12): Propagate *note asyncio.CancelledError: 61b. message + from inner task to outer awaiter. + + - bpo-46756(13): Fix a bug in *note + urllib.request.HTTPPasswordMgr.find_user_password(): 1233. and + *note + urllib.request.HTTPPasswordMgrWithPriorAuth.is_authenticated(): + 1234. which allowed to bypass authorization. For example, access + to URI ‘example.org/foobar’ was allowed if the user was authorized + for URI ‘example.org/foo’. + + - bpo-46737(14): *note random.gauss(): 1235. and *note + random.normalvariate(): 1236. now have default arguments. + + - bpo-46752(15): 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(). + + - bpo-46724(16): Fix *note dis: 36. behavior on negative jump + offsets. + + - bpo-46333(17): The ‘__repr__()’ method of *note typing.ForwardRef: + 1237. now includes the ‘module’ parameter of *note + typing.ForwardRef: 1237. when it is set. + + - bpo-46643(18): In *note typing.get_type_hints(): 277, support + evaluating stringified ‘ParamSpecArgs’ and ‘ParamSpecKwargs’ + annotations. Patch by Gregory Beauregard. + + - bpo-45863(19): When the *note tarfile: fd. 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. + + - bpo-46066(20): Deprecate kwargs-based syntax for *note + typing.TypedDict: 18a. definitions. It had confusing semantics + when specifying totality, and was largely unused. Patch by + Jingchen Ye. + + - bpo-46676(21): Make *note typing.ParamSpec: 3af. args and kwargs + equal to themselves. Patch by Gregory Beauregard. + + - bpo-46323(22): ‘ctypes.CFUNCTYPE()’ and ‘ctypes.WINFUNCTYPE()’ now + fail to create the type if its ‘_argtypes_’ member contains too + many arguments. Previously, the error was only raised when calling + a function. Patch by Victor Stinner. + + - bpo-46672(23): Fix ‘NameError’ in *note asyncio.gather(): 1d3. when + initial type check fails. + + - bpo-46659(24): The *note calendar.LocaleTextCalendar: 313. and + *note calendar.LocaleHTMLCalendar: 314. classes now use *note + locale.getlocale(): 2e0, instead of using *note + locale.getdefaultlocale(): 2dd, if no locale is specified. Patch + by Victor Stinner. + + - bpo-46659(25): The *note locale.getdefaultlocale(): 2dd. function + is deprecated and will be removed in Python 3.13. Use *note + locale.setlocale(): 2de, *note locale.getpreferredencoding(False): + 2df. and *note locale.getlocale(): 2e0. functions instead. Patch + by Victor Stinner. + + - bpo-46655(26): In *note typing.get_type_hints(): 277, support + evaluating bare stringified ‘TypeAlias’ annotations. Patch by + Gregory Beauregard. + + - bpo-45948(27): Fixed a discrepancy in the C implementation of the + *note xml.etree.ElementTree: 142. module. Now, instantiating an + *note xml.etree.ElementTree.XMLParser: 6a3. with a ‘target=None’ + keyword provides a default *note xml.etree.ElementTree.TreeBuilder: + 6a4. target as the Python implementation does. + + - bpo-46626(28): Expose Linux’s ‘IP_BIND_ADDRESS_NO_PORT’ option in + *note socket: ec. + + - bpo-46521(29): Fix a bug in the *note codeop: 1b. module that was + incorrectly identifying invalid code involving string quotes as + valid code. + + - bpo-46571(30): Improve *note typing.no_type_check(): 27b. + + Now it does not modify external classes and functions. We also now + correctly mark classmethods as not to be type checked. + + - bpo-46400(31): expat: Update libexpat from 2.4.1 to 2.4.4 + + - bpo-46556(32): Deprecate undocumented support for using a *note + pathlib.Path: 65f. object as a context manager. + + - bpo-46534(33): Implement PEP 673(34) *note typing.Self: 18c. Patch + by James Hilton-Balfe. + + - bpo-46522(35): Make various module ‘__getattr__’ AttributeErrors + more closely match a typical AttributeError + + - bpo-46475(36): Add *note typing.Never: 26d. and *note + typing.assert_never(): 26c. Patch by Jelle Zijlstra. + + - bpo-46333(37): The ‘__eq__()’ and ‘__hash__()’ methods of *note + typing.ForwardRef: 1237. now honor the ‘module’ parameter of *note + typing.ForwardRef: 1237. Forward references from different modules + are now differentiated. + + - bpo-46246(38): Add missing ‘__slots__’ to + ‘importlib.metadata.DeprecatedList’. Patch by Arie Bovenberg. + + - bpo-46232(39): The *note ssl: f0. module now handles certificates + with bit strings in DN correctly. + + - bpo-46195(40): *note typing.get_type_hints(): 277. no longer adds + ‘Optional’ to parameters with ‘None’ as a default. This aligns to + changes to PEP 484 in ‘https://github.com/python/peps/pull/689’ + + - bpo-31369(41): Add *note RegexFlag: 208. to ‘re.__all__’ and + documented it. Add ‘NOFLAG’ to indicate no flags being set. + + - bpo-45898(42): *note ctypes: 29. no longer defines ‘ffi_type_*’ + symbols in ‘cfield.c’. The symbols have been provided by libffi + for over a decade. + + - bpo-44953(43): Calling ‘operator.itemgetter’ objects and + ‘operator.attrgetter’ objects is now faster due to use of the + vectorcall calling convention. + + - bpo-44289(44): Fix an issue with *note is_tarfile(): 1238. method + when using `fileobj' argument: position in the `fileobj' was + advanced forward which made it unreadable with *note + tarfile.TarFile.open(): 1239. + + - bpo-44011(45): Reimplement SSL/TLS support in asyncio, borrow the + implementation from uvloop library. + + - bpo-41086(46): Make the *note configparser.ConfigParser: 887. + constructor raise *note TypeError: 19c. if the ‘interpolation’ + parameter is not of type ‘configparser.Interpolation’ + + - bpo-29418(47): Implement *note inspect.ismethodwrapper(): 21d. and + fix *note inspect.isroutine(): 123a. for cases where methodwrapper + is given. Patch by Hakan Çelik. + + - bpo-14156(48): 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 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25707 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46877 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46848 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46736 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=44886 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46827 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46811 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46252 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46784 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=46786 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=39327 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45390 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=46756 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=46737 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=46752 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=46724 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=46333 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=46643 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45863 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=46066 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=46676 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=46323 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=46672 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=46659 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=46659 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=46655 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=45948 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=46626 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=46521 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=46571 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=46400 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=46556 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=46534 + + (34) https://peps.python.org/pep-0673/ + + (35) https://bugs.python.org/issue?@action=redirect&bpo=46522 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=46475 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=46333 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=46246 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=46232 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=46195 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=31369 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=45898 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=44953 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=44289 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=44011 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=41086 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=29418 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=14156 + + +File: python.info, Node: Documentation<9>, Next: Tests<9>, Prev: Library<9>, Up: Python 3 11 0 alpha 6 + +1.21.10.3 Documentation +....................... + + - bpo-42238(1): ‘Doc/tools/rstlint.py’ has moved to its own + repository and is now packaged on PyPI as ‘sphinx-lint’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42238 + + +File: python.info, Node: Tests<9>, Next: Build<10>, Prev: Documentation<9>, Up: Python 3 11 0 alpha 6 + +1.21.10.4 Tests +............... + + - bpo-46913(1): 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. + + - bpo-46760(2): Remove bytecode offsets from expected values in + test.test_dis module. Reduces the obstacles to modifying the VM or + compiler. + + - bpo-46708(3): Prevent default asyncio event loop policy + modification warning after ‘test_asyncio’ execution. + + - bpo-46678(4): The function ‘make_legacy_pyc’ in + ‘Lib/test/support/import_helper.py’ no longer fails when + ‘PYTHONPYCACHEPREFIX’ is set to a directory on a different device + from where tempfiles are stored. + + - bpo-46623(5): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46913 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46760 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46708 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46678 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46623 + + +File: python.info, Node: Build<10>, Next: Windows<9>, Prev: Tests<9>, Up: Python 3 11 0 alpha 6 + +1.21.10.5 Build +............... + + - bpo-46860(1): Respect ‘--with-suffix’ when building on + case-insensitive file systems. + + - bpo-46656(2): Building Python now requires a C11 compiler. + Optional C11 features are not required. Patch by Victor Stinner. + + - bpo-46656(3): Building Python now requires support for floating + point Not-a-Number (NaN): remove the ‘Py_NO_NAN’ macro. Patch by + by Victor Stinner. + + - bpo-46640(4): Building Python now requires a C99 ‘’ header + file providing a ‘NAN’ constant, or the ‘__builtin_nan()’ built-in + function. Patch by Victor Stinner. + + - bpo-46608(5): Exclude marshalled-frozen data if deep-freezing to + save 300 KB disk space. This includes adding a new ‘is_package’ + field to *note _frozen: 347. Patch by Kumar Aditya. + + - bpo-40280(6): 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 cound 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. + + - bpo-46430(7): Intern strings in deep-frozen modules. Patch by + Kumar Aditya. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46860 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46656 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46656 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46640 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46608 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46430 + + +File: python.info, Node: Windows<9>, Next: IDLE<4>, Prev: Build<10>, Up: Python 3 11 0 alpha 6 + +1.21.10.6 Windows +................. + + - bpo-46744(1): The default all users install directory for ARM64 is + now under the native ‘Program Files’ folder, rather than ‘Program + Files (Arm)’ which is intended for ARM (32-bit) files. + + - bpo-46567(2): Adds Tcl and Tk support for Windows ARM64. This also + adds IDLE to the installation. + + - bpo-46638(3): 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). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46744 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46567 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46638 + + +File: python.info, Node: IDLE<4>, Next: C API<7>, Prev: Windows<9>, Up: Python 3 11 0 alpha 6 + +1.21.10.7 IDLE +.............. + + - bpo-46630(1): Make query dialogs on Windows start with a cursor in + the entry box. + + - bpo-45447(2): Apply IDLE syntax highlighting to ‘pyi’ files. Patch + by Alex Waygood and Terry Jan Reedy. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46630 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45447 + + +File: python.info, Node: C API<7>, Prev: IDLE<4>, Up: Python 3 11 0 alpha 6 + +1.21.10.8 C API +............... + + - bpo-46748(1): Python’s public headers no longer import + ‘’, leaving code that embedd/extends Python free to + define ‘bool’, ‘true’ and ‘false’. + + - bpo-46836(2): Move the *note PyFrameObject: 35d. type definition + (‘struct _frame’) to the internal C API ‘pycore_frame.h’ header + file. Patch by Victor Stinner. + + - bpo-45459(3): Rename ‘Include/buffer.h’ header file to + ‘Include/pybuffer.h’ to avoid conflits with projects having an + existing ‘buffer.h’ header file. Patch by Victor Stinner. + + - bpo-45412(4): Remove the ‘HAVE_PY_SET_53BIT_PRECISION’ macro (moved + to the internal C API). Patch by Victor Stinner. + + - bpo-46613(5): Added function *note PyType_GetModuleByDef(): 335, + which allows accesss to module state when a method’s defining class + is not available. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46748 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46836 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45459 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45412 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46613 + + +File: python.info, Node: Python 3 11 0 alpha 5, Next: Python 3 11 0 alpha 4, Prev: Python 3 11 0 alpha 6, Up: Changelog + +1.21.11 Python 3.11.0 alpha 5 +----------------------------- + +`Release date: 2022-02-03' + +* Menu: + +* Core and Builtins: Core and Builtins<11>. +* Library: Library<10>. +* Documentation: Documentation<10>. +* Tests: Tests<10>. +* Build: Build<11>. +* Windows: Windows<10>. +* macOS: macOS<4>. +* IDLE: IDLE<5>. +* C API: C API<8>. + + +File: python.info, Node: Core and Builtins<11>, Next: Library<10>, Up: Python 3 11 0 alpha 5 + +1.21.11.1 Core and Builtins +........................... + + - bpo-45773(1): Remove two invalid “peephole” optimizations from the + bytecode compiler. + + - bpo-46564(2): Do not create frame objects when creating *note + super: 8b7. object. Patch by Kumar Aditya. + + - bpo-45885(3): Added more fined-grained specialization failure stats + regarding the ‘COMPARE_OP’ bytecode. + + - bpo-44977(4): The delegation of *note int(): 1c7. to ‘__trunc__()’ + is now deprecated. Calling ‘int(a)’ when ‘type(a)’ implements + ‘__trunc__()’ but not ‘__int__()’ or ‘__index__()’ now raises a + *note DeprecationWarning: 2d4. + + - bpo-46458(5): Reorder code emitted by the compiler for a *note try: + 1073.-*note except: 17a. block so that the *note else: 466. block’s + code immediately follows the *note try: 1073. body (without a + jump). This is more optimal for the happy path. + + - bpo-46527(6): Allow passing ‘iterable’ as a keyword argument to + *note enumerate(): 10e1. again. Patch by Jelle Zijlstra. + + - bpo-46528(7): Replace several stack manipulation instructions + (‘DUP_TOP’, ‘DUP_TOP_TWO’, ‘ROT_TWO’, ‘ROT_THREE’, ‘ROT_FOUR’, and + ‘ROT_N’) with new *note COPY: 2bf. and *note SWAP: 2c0. + instructions. + + - bpo-46329(8): Use two or three bytecodes to implement most calls. + + Calls without named arguments are implemented as a sequence of two + instructions: ‘PRECALL; CALL’. Calls with named arguments are + implemented as a sequence of three instructions: ‘PRECALL; + KW_NAMES; CALL’. There are two different ‘PRECALL’ instructions: + ‘PRECALL_FUNTION’ and ‘PRECALL_METHOD’. The latter pairs with + ‘LOAD_METHOD’. + + This partition into pre-call and call allows better specialization, + and thus better performance ultimately. + + There is no change in semantics. + + - bpo-46503(9): Fix an assert when parsing some invalid N escape + sequences in f-strings. + + - bpo-46431(10): Improve error message on invalid calls to + ‘BaseExceptionGroup.__new__()’. + + - bpo-46476(11): Fix memory leak in code objects generated by + deepfreeze. Patch by Kumar Aditya. + + - bpo-46481(12): Speed up calls to ‘weakref.ref.__call__()’ by using + the PEP 590(13) ‘vectorcall’ calling convention. Patch by Dong-hee + Na. + + - bpo-46417(14): Fix a race condition on setting a type ‘__bases__’ + attribute: the internal function ‘add_subclass()’ now gets the + ‘PyTypeObject.tp_subclasses’ member after calling *note + PyWeakref_NewRef(): 1243. which can trigger a garbage collection + which can indirectly modify ‘PyTypeObject.tp_subclasses’. Patch by + Victor Stinner. + + - bpo-46417(15): ‘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. + + - bpo-43683(16): 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 ‘YIELD_VALUE’ instruction. + + - bpo-46407(17): Optimize some modulo operations in + ‘Objects/longobject.c’. Patch by Jeremiah Vivian. + + - bpo-46409(18): Add new ‘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 ‘JUMP_NO_INTERRUPT’ bytecode that acts like + ‘JUMP_ABSOLUTE’, but does not check for interrupts. + + - bpo-46406(19): The integer division ‘//’ 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 ‘2**30’. + + - bpo-46383(20): Fix invalid signature of ‘_zoneinfo’’s ‘module_free’ + function to resolve a crash on wasm32-emscripten platform. + + - bpo-46361(21): Ensure that “small” integers created by *note + int.from_bytes(): 1244. and *note decimal.Decimal: 3bd. are + properly cached. + + - bpo-46161(22): Fix the class building error when the arguments are + constants and CALL_FUNCTION_EX is used. + + - bpo-46028(23): Fixes calculation of ‘sys._base_executable’ when + inside a virtual environment that uses symlinks with different + binary names than the base environment provides. + + - bpo-46091(24): Correctly calculate indentation levels for lines + with whitespace character that are ended by line continuation + characters. Patch by Pablo Galindo + + - bpo-30512(25): Add CAN Socket support for NetBSD. + + - bpo-46045(26): Do not use POSIX semaphores on NetBSD + + - bpo-44024(27): Improve the exc:*note TypeError: 19c. message for + non-string second arguments passed to the built-in functions *note + getattr(): 837. and *note hasattr(): 836. Patch by Géry Ogam. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45773 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46564 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45885 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=44977 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46458 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46527 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46528 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46329 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46503 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=46431 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=46476 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=46481 + + (13) https://peps.python.org/pep-0590/ + + (14) https://bugs.python.org/issue?@action=redirect&bpo=46417 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=46417 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=43683 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=46407 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=46409 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=46406 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=46383 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=46361 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=46161 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=46028 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=46091 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=30512 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=46045 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=44024 + + +File: python.info, Node: Library<10>, Next: Documentation<10>, Prev: Core and Builtins<11>, Up: Python 3 11 0 alpha 5 + +1.21.11.2 Library +................. + + - bpo-46624(1): Restore support for non-integer arguments of *note + random.randrange(): 46e. and *note random.randint(): ee8. + + - bpo-46591(2): Make the IDLE doc URL on the About IDLE dialog + clickable. + + - bpo-46565(3): Remove loop variables that are leaking into modules’ + namespaces. + + - bpo-46553(4): In *note typing.get_type_hints(): 277, support + evaluating bare stringified ‘ClassVar’ annotations. Patch by + Gregory Beauregard. + + - bpo-46544(5): Don’t leak ‘x’ & ‘uspace’ intermediate vars in *note + textwrap.TextWrapper: c6f. + + - bpo-46487(6): Add the ‘get_write_buffer_limits’ method to + ‘asyncio.transports.WriteTransport’ and to the SSL transport. + + - bpo-45173(7): Note the configparser deprecations will be removed in + Python 3.12. + + - bpo-45162(8): The deprecated *note unittest: 125. APIs removed in + 3.11a1 have been temporarily restored to be removed in 3.12 while + cleanups in external projects go in. + + - bpo-46539(9): In *note typing.get_type_hints(): 277, support + evaluating stringified ‘ClassVar’ and ‘Final’ annotations inside + ‘Annotated’. Patch by Gregory Beauregard. + + - bpo-46510(10): Add missing test for *note types.TracebackType: 748. + and *note types.FrameType: 1246. Calculate them directly from the + caught exception without calling *note sys.exc_info(): 25b. + + - bpo-46491(11): Allow *note typing.Annotated: 585. to wrap *note + typing.Final: 692. and *note typing.ClassVar: 27a. Patch by + Gregory Beauregard. + + - bpo-46483(12): Remove *note __class_getitem__(): 305. from *note + pathlib.PurePath: 306. as this class was not supposed to be + generic. + + - bpo-46436(13): Fix command-line option ‘-d’/‘--directory’ in module + *note http.server: 92. which is ignored when combined with + command-line option ‘--cgi’. Patch by Géry Ogam. + + - bpo-41403(14): Make ‘mock.patch()’ raise a *note TypeError: 19c. + with a relevant error message on invalid arg. Previously it + allowed a cryptic *note AttributeError: 19d. to escape. + + - bpo-46474(15): In ‘importlib.metadata.EntryPoint.pattern’, avoid + potential REDoS by limiting ambiguity in consecutive whitespace. + + - bpo-46474(16): Removed private method from + ‘importlib.metadata.Path’. Sync with importlib_metadata 4.10.0. + + - bpo-46470(17): Remove unused branch from + ‘typing._remove_dups_flatten’ + + - bpo-46469(18): *note asyncio: 9. generic classes now return *note + types.GenericAlias: 3dd. in ‘__class_getitem__’ instead of the same + class. + + - bpo-41906(19): Support passing filter instances in the ‘filters’ + values of ‘handlers’ and ‘loggers’ in the dictionary passed to + *note logging.config.dictConfig(): e63. + + - bpo-46422(20): Use ‘dis.Positions’ in ‘dis.Instruction’ instead of + a regular ‘tuple’. + + - bpo-46434(21): *note pdb: c6. now gracefully handles ‘help’ when + ‘__doc__’ is missing, for example when run with pregenerated + optimized ‘.pyc’ files. + + - bpo-43869(22): 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. + + - bpo-46414(23): Add *note typing.reveal_type(): 26f. Patch by Jelle + Zijlstra. + + - bpo-40280(24): *note subprocess: f6. now imports Windows-specific + imports when ‘msvcrt’ module is available, and POSIX-specific + imports on all other platforms. This gives a clean exception when + ‘_posixsubprocess’ is not available (e.g. Emscripten browser + target). + + - bpo-40066(25): ‘IntEnum’, ‘IntFlag’, and ‘StrEnum’ use the mixed-in + type for their ‘str()’ and ‘format()’ output. + + - bpo-46316(26): Optimize *note pathlib.Path.iterdir(): 1247. by + removing an unnecessary check for special entries. + + - bpo-29688(27): Document *note pathlib.Path.absolute(): 1248. (which + has always existed). + + - bpo-43012(28): The pathlib module’s obsolete and internal + ‘_Accessor’ class has been removed to prepare the terrain for + upcoming enhancements to the module. + + - bpo-46258(29): Speed up *note math.isqrt(): 64b. for small positive + integers by replacing two division steps with a lookup table. + + - bpo-46242(30): Improve error message when creating a new *note + enum.Enum: 20c. type subclassing an existing ‘Enum’ with + ‘_member_names_’ using *note enum.Enum.__call__(): 1249. + + - bpo-43118(31): Fix a bug in *note inspect.signature(): 301. that + was causing it to fail on some subclasses of classes with a + ‘__text_signature__’ referencing module globals. Patch by Weipeng + Hong. + + - bpo-26552(32): Fixed case where failing *note + asyncio.ensure_future(): 478. did not close the coroutine. Patch + by Kumar Aditya. + + - bpo-21987(33): Fix an issue with *note tarfile.TarFile.getmember(): + 124a. getting a directory name with a trailing slash. + + - bpo-46124(34): Update *note zoneinfo: 150. to rely on + importlib.resources traversable API. + + - bpo-46103(35): Now *note inspect.getmembers(): 124b. only gets + ‘__bases__’ attribute from class type. Patch by Weipeng Hong. + + - bpo-46080(36): Fix exception in argparse help text generation if a + ‘argparse.BooleanOptionalAction’ argument’s default is + ‘argparse.SUPPRESS’ and it has ‘help’ specified. Patch by Felix + Fontein. + + - bpo-44791(37): Fix substitution of *note ParamSpec: 3af. in *note + Concatenate: 3b0. with different parameter expressions. + Substitution with a list of types returns now a tuple of types. + Substitution with ‘Concatenate’ returns now a ‘Concatenate’ with + concatenated lists of arguments. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46624 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46591 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46565 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46553 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46544 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46487 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45173 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45162 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46539 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=46510 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=46491 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=46483 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=46436 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=41403 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=46474 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=46474 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=46470 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=46469 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=41906 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=46422 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=46434 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=43869 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=46414 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=40066 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=46316 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=29688 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=43012 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=46258 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=46242 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=43118 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=26552 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=21987 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=46124 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=46103 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=46080 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=44791 + + +File: python.info, Node: Documentation<10>, Next: Tests<10>, Prev: Library<10>, Up: Python 3 11 0 alpha 5 + +1.21.11.3 Documentation +....................... + + - bpo-46463(1): Fixes ‘escape4chm.py’ script used when building the + CHM documentation file + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46463 + + +File: python.info, Node: Tests<10>, Next: Build<11>, Prev: Documentation<10>, Up: Python 3 11 0 alpha 5 + +1.21.11.4 Tests +............... + + - bpo-43478(1): Mocks can no longer be provided as the specs for + other Mocks. As a result, an already-mocked object cannot be + passed to ‘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. + + - bpo-46616(2): Ensures ‘test_importlib.test_windows’ cleans up + registry keys after completion. + + - bpo-44359(3): test_ftplib now silently ignores socket errors to + prevent logging unhandled threading exceptions. Patch by Victor + Stinner. + + - bpo-46600(4): Fix test_gdb.test_pycfunction() for Python built with + ‘clang -Og’. Tolerate inlined functions in the gdb traceback. + Patch by Victor Stinner. + + - bpo-46542(5): Fix a Python crash in test_lib2to3 when using Python + built in debug mode: limit the recursion limit. Patch by Victor + Stinner. + + - bpo-46576(6): 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. + + - bpo-46542(7): Fix ‘test_json’ tests checking for *note + RecursionError: 9e7.: modify these tests to use + ‘support.infinite_recursion()’. Patch by Victor Stinner. + + - bpo-13886(8): 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 intented to test the + readline module. Patch by Victor Stinner. + + - bpo-40280(9): Add ‘test.support.requires_fork()’ decorators to mark + tests that require a working *note os.fork(): cd4. + + - bpo-40280(10): Add ‘test.support.requires_subprocess()’ decorator + to mark tests which require working *note subprocess: f6. module or + ‘os.spawn*’. The wasm32-emscripten platform has no support for + processes. + + - bpo-46126(11): Disable ‘descriptions’ when running tests + internally. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43478 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46616 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44359 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46600 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46542 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46576 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46542 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=13886 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=46126 + + +File: python.info, Node: Build<11>, Next: Windows<10>, Prev: Tests<10>, Up: Python 3 11 0 alpha 5 + +1.21.11.5 Build +............... + + - bpo-46602(1): 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. + + - bpo-46600(2): Fix the test checking if the C compiler supports + ‘-Og’ option in the ‘./configure’ script to also use ‘-Og’ on clang + which supports it. Patch by Victor Stinner. + + - bpo-38472(3): 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. + + - bpo-46513(4): ‘configure’ no longer uses ‘AC_C_CHAR_UNSIGNED’ macro + and ‘pyconfig.h’ no longer defines reserved symbol + ‘__CHAR_UNSIGNED__’. + + - bpo-46471(5): Use global singletons for single byte bytes objects + in deepfreeze. + + - bpo-46443(6): Deepfreeze now uses cached small integers as it saves + some space for common small integers. + + - bpo-46429(7): Merge all deep-frozen files into one for space + savings. Patch by Kumar Aditya. + + - bpo-45569(8): 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 ‘--enable-big-digits=15’ option to the + ‘configure’ script, or by defining ‘PYLONG_BITS_IN_DIGIT’ in + ‘pyconfig.h’. + + - bpo-45925(9): Update Windows installer to use SQLite 3.37.2. + + - bpo-43112(10): Detect musl libc as a separate SOABI (tagged as + ‘linux-musl’). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46602 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46600 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38472 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46513 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46471 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46443 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46429 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45569 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45925 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43112 + + +File: python.info, Node: Windows<10>, Next: macOS<4>, Prev: Build<11>, Up: Python 3 11 0 alpha 5 + +1.21.11.6 Windows +................. + + - bpo-33125(1): The traditional EXE/MSI based installer for Windows + is now available for ARM64 + + - bpo-46362(2): 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. + + - bpo-44934(3): The installer now offers a command-line only option + to add the installation directory to the end of ‘PATH’ instead of + at the start. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33125 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46362 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44934 + + +File: python.info, Node: macOS<4>, Next: IDLE<5>, Prev: Windows<10>, Up: Python 3 11 0 alpha 5 + +1.21.11.7 macOS +............... + + - bpo-45925(1): Update macOS installer to SQLite 3.37.2. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45925 + + +File: python.info, Node: IDLE<5>, Next: C API<8>, Prev: macOS<4>, Up: Python 3 11 0 alpha 5 + +1.21.11.8 IDLE +.............. + + - bpo-45296(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45296 + + +File: python.info, Node: C API<8>, Prev: IDLE<5>, Up: Python 3 11 0 alpha 5 + +1.21.11.9 C API +............... + + - bpo-40170(1): Remove the ‘PyHeapType_GET_MEMBERS()’ macro. It was + exposed in the public C API by mistake, it must only be used by + Python internally. Use the ‘PyTypeObject.tp_members’ member + instead. Patch by Victor Stinner. + + - bpo-40170(2): Move _Py_GetAllocatedBlocks() and + _PyObject_DebugMallocStats() private functions to the internal C + API. Patch by Victor Stinner. + + - bpo-46433(3): The internal function _PyType_GetModuleByDef now + correctly handles inheritance patterns involving static types. + + - bpo-45459(4): *note Py_buffer: 327. and various ‘Py_buffer’ related + functions are now part of the limited API and stable ABI. + + - bpo-14916(5): Fixed bug in the tokenizer that prevented + ‘PyRun_InteractiveOne’ from parsing from the provided FD. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46433 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45459 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=14916 + + +File: python.info, Node: Python 3 11 0 alpha 4, Next: Python 3 11 0 alpha 3, Prev: Python 3 11 0 alpha 5, Up: Changelog + +1.21.12 Python 3.11.0 alpha 4 +----------------------------- + +`Release date: 2022-01-13' + +* Menu: + +* Core and Builtins: Core and Builtins<12>. +* Library: Library<11>. +* Documentation: Documentation<11>. +* Tests: Tests<11>. +* Build: Build<12>. +* Windows: Windows<11>. +* macOS: macOS<5>. +* C API: C API<9>. + + +File: python.info, Node: Core and Builtins<12>, Next: Library<11>, Up: Python 3 11 0 alpha 4 + +1.21.12.1 Core and Builtins +........................... + + - bpo-46070(1): *note Py_EndInterpreter(): 1255. now explicitly + untracks all objects currently tracked by the GC. Previously, if an + object was used later by another interpreter, calling *note + PyObject_GC_UnTrack(): 1140. on the object crashed if the previous + or the next object of the ‘PyGC_Head’ structure became a dangling + pointer. Patch by Victor Stinner. + + - bpo-46347(2): Fix memory leak in PyEval_EvalCodeEx. + + - bpo-46339(3): 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 + + - bpo-46331(4): Do not set line number of instruction storing + doc-string. Fixes regression introduced in 3.11 alpha. + + - bpo-46314(5): Remove spurious “call” event when creating a lambda + function that was accidentally introduced in 3.11a4. + + - bpo-46289(6): ASDL declaration of ‘FormattedValue’ has changed to + reflect ‘conversion’ field is not optional. + + - bpo-46297(7): Fixed an interpreter crash on bootup with multiple + PythonPaths set in the Windows registry. Patch by Derzsi Dániel. + + - bpo-46237(8): Fix the line number of tokenizer errors inside + f-strings. Patch by Pablo Galindo. + + - bpo-46263(9): We always expect the “use_frozen_modules” config to + be set, now that getpath.c was rewritten in pure Python and the + logic improved. + + - bpo-46006(10): Fix a regression when a type method like + ‘__init__()’ is modified in a subinterpreter. Fix a regression in + ‘_PyUnicode_EqualToASCIIId()’ and type ‘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. + + - bpo-45923(11): 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. + + - bpo-46208(12): Fix the regression of os.path.normpath(“A/../../B”) + not returning expected “../B” but “B”. + + - bpo-46240(13): 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 + + - bpo-46009(14): Remove the ‘GEN_START’ opcode. + + - bpo-46235(15): Certain sequence multiplication operations like ‘[0] + * 1_000’ are now faster due to reference-counting optimizations. + Patch by Dennis Sweeney. + + - bpo-46221(16): *note PREP_RERAISE_STAR: 1256. no longer pushes + ‘lasti’ to the stack. + + - bpo-46202(17): Remove ‘POP_EXCEPT_AND_RERAISE’ and replace it by an + equivalent sequence of other opcodes. + + - bpo-46085(18): Fix iterator cache mechanism of ‘OrderedDict’. + + - bpo-46055(19): Speed up shifting operation involving integers less + than ‘PyLong_BASE’. Patch by Xinhang Xu. + + - bpo-46110(20): Add a maximum recursion check to the PEG parser to + avoid stack overflow. Patch by Pablo Galindo + + - bpo-46107(21): Fix bug where ‘ExceptionGroup.split()’ and + ‘ExceptionGroup.subgroup()’ did not copy the exception group’s + ‘__note__’ field to the parts. + + - bpo-45711(22): The interpreter state’s representation of handled + exceptions (a.k.a exc_info, or _PyErr_StackItem) now has only the + ‘exc_value’ field, ‘exc_type’ and ‘exc_traceback’ have been removed + as their values can be derived from ‘exc_value’. + + - bpo-44525(23): Replace the four call bytecode instructions which + one pre-call instruction and two call instructions. + + Removes ‘CALL_FUNCTION’, ‘CALL_FUNCTION_KW’, ‘CALL_METHOD’ and + ‘CALL_METHOD_KW’. + + Adds ‘CALL_NO_KW’ and ‘CALL_KW’ call instructions, and + ‘PRECALL_METHOD’ prefix for pairing with ‘LOAD_METHOD’. + + - bpo-46039(24): Remove the ‘YIELD_FROM’ instruction and replace it + with the ‘SEND’ instruction which performs the same operation, but + without the loop. + + - bpo-45635(25): The code called from ‘_PyErr_Display()’ was + refactored to improve error handling. It now exits immediately + upon an unrecoverable error. + + - bpo-46054(26): Fix parser error when parsing non-utf8 characters in + source files. Patch by Pablo Galindo. + + - bpo-46042(27): Improve the location of the caret in *note + SyntaxError: 2d6. exceptions emitted by the symbol table. Patch by + Pablo Galindo. + + - bpo-46049(28): Ensure ‘._pth’ files work as intended on platforms + other than Windows. + + - bpo-46048(29): Fixes parsing of ‘._pth’ files on startup so that + single-character paths are correctly read. + + - bpo-37971(30): Fix a bug where the line numbers given in a + traceback when a decorator application raised an exception were + wrong. + + - bpo-46031(31): Add ‘POP_JUMP_IF_NOT_NONE’ and ‘POP_JUMP_IF_NONE’ + opcodes to speed up conditional jumps. + + - bpo-45654(32): Deepfreeze *note runpy: df, patch by Kumar Aditya. + + - bpo-46025(33): Fix a crash in the *note atexit: b. module involving + functions that unregister themselves before raising exceptions. + Patch by Pablo Galindo. + + - bpo-46000(34): Improve compatibility of the *note curses: 2a. + module with NetBSD curses. + + - bpo-44525(35): Specialize the CALL_FUNCTION instruction for calls + to builtin types with a single argument. Speeds up ‘range(x)’, + ‘list(x)’, and specifically ‘type(obj)’. + + - bpo-42918(36): Fix bug where the built-in *note compile(): 310. + function did not always raise a *note SyntaxError: 2d6. when passed + multiple statements in ‘single’ mode. Patch by Weipeng Hong. + + - bpo-45953(37): 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. + + - bpo-45292(38): Complete the PEP 654(39) implementation: add + ‘except*’. + + - bpo-43413(40): Revert changes in ‘set.__init__’. Subclass of *note + set: 1a6. needs to define a ‘__init__()’ method if it defines a + ‘__new__()’ method with additional keyword parameters. + + - bpo-43931(41): Added the *note Py_Version: 325. constant which + bears the same value as *note PY_VERSION_HEX: 326. Patch by + Gabriele N. Tornetta. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46070 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46347 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46339 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46331 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46314 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46289 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46297 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46237 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46263 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=46006 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45923 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=46208 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=46240 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=46009 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=46235 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=46221 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=46202 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=46085 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=46055 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=46110 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=46107 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=44525 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=46039 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=45635 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=46054 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=46042 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=46049 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=46048 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=37971 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=46031 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=45654 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=46025 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=46000 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=44525 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=42918 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=45953 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=45292 + + (39) https://peps.python.org/pep-0654/ + + (40) https://bugs.python.org/issue?@action=redirect&bpo=43413 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=43931 + + +File: python.info, Node: Library<11>, Next: Documentation<11>, Prev: Core and Builtins<12>, Up: Python 3 11 0 alpha 4 + +1.21.12.2 Library +................. + + - bpo-46342(1): The ‘@typing.final’ decorator now sets the + ‘__final__’ attribute on the decorated object to allow runtime + introspection. Patch by Jelle Zijlstra. + + - bpo-46328(2): Added the *note sys.exception(): 25c. method which + returns the active exception instance. + + - bpo-46307(3): Add *note string.Template.is_valid(): 258. and *note + string.Template.get_identifiers(): 257. methods. + + - bpo-46306(4): Assume that *note types.CodeType: 612. always has + ‘types.CodeType.co_firstlineno’ in *note doctest: 63. + + - bpo-40479(5): Fix *note hashlib: 88. `usedforsecurity' option to + work correctly with OpenSSL 3.0.0 in FIPS mode. + + - bpo-46070(6): Fix possible segfault when importing the *note + asyncio: 9. module from different sub-interpreters in parallel. + Patch by Erlend E. Aasland. + + - bpo-46244(7): Removed ‘__slots__’ from *note typing.ParamSpec: 3af. + and *note typing.TypeVar: 185. They served no purpose. Patch by + Arie Bovenberg. + + - bpo-46278(8): Reflect ‘context’ argument in + ‘AbstractEventLoop.call_*()’ methods. Loop implementations already + support it. + + - bpo-46269(9): Remove special-casing of ‘__new__’ in *note + enum.Enum.__dir__(): 1258. + + - bpo-46266(10): Improve day constants in *note calendar: 13. + + Now all constants (‘MONDAY’ … ‘SUNDAY’) are documented, tested, and + added to ‘__all__’. + + - bpo-46257(11): 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. + + - bpo-41011(12): Added two new variables to `pyvenv.cfg' which is + generated by *note venv: 12f. module: `executable' for the + executable and `command' for the command line used to create the + environment. + + - bpo-46239(13): Improve error message when importing + ‘asyncio.windows_events’ on non-Windows. + + - bpo-46238(14): Reuse ‘_winapi’ constants in + ‘asyncio.windows_events’. + + - bpo-46222(15): Adding ‘SF_NOCACHE’ sendfile constant for FreeBSD + for the posixmodule. + + - bpo-37295(16): Add fast path for ‘0 <= k <= n <= 67’ for *note + math.comb(): 299. + + - bpo-46176(17): Adding the ‘MAP_STACK’ constant for the mmap module. + + - bpo-43424(18): Deprecate ‘webbrowser.MacOSXOSAScript._name’ and use + ‘name’ instead. + + - bpo-45321(19): Added missing error codes to module + ‘xml.parsers.expat.errors’. + + - bpo-46125(20): Refactor tests to test traversable API directly. + Includes changes from importlib 5.4.0. + + - bpo-46118(21): Moved importlib.resources and its related + functionality to a package. + + - bpo-37578(22): Add `include_hidden' parameter to *note glob(): 3f8. + and *note iglob(): 3f9. to match hidden files and directories when + using special characters like ‘*’, ‘**’, ‘?’ and ‘[]’. + + - bpo-20369(23): *note concurrent.futures.wait(): 1259. no longer + blocks forever when given duplicate Futures. Patch by Kumar + Aditya. + + - bpo-46105(24): Honor spec when generating requirement specs with + urls and extras (importlib_metadata 4.8.3). + + - bpo-44893(25): 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. + + - bpo-22815(26): Print unexpected successes together with failures + and errors in summary in *note unittest.TextTestResult: 125a. + + - bpo-22047(27): Calling ‘add_argument_group()’ on an argument group + is deprecated. Calling ‘add_argument_group()’ or + ‘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. + + - bpo-26952(28): *note argparse: 5. raises *note ValueError: 1c8. + with clear message when trying to render usage for an empty + mutually exclusive group. Previously it raised a cryptic *note + IndexError: 116b. + + - bpo-45615(29): Functions in the *note traceback: 11d. module raise + *note TypeError: 19c. rather than *note AttributeError: 19d. when + an exception argument is not of type *note BaseException: 17d. + + - bpo-16594(30): Add allow allow_reuse_port flag in socketserver. + + - bpo-27718(31): Fix help for the *note signal: e7. module. Some + functions (e.g. ‘signal()’ and ‘getsignal()’) were omitted. + + - bpo-46032(32): The ‘registry()’ method of *note + functools.singledispatch(): 212. 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. ‘typing.List[int]’) or caused an error at calling + time (e.g. ‘list[int]’). + + - bpo-46014(33): Add ability to use ‘typing.Union’ and + ‘types.UnionType’ as dispatch argument to + ‘functools.singledispatch’. Patch provided by Yurii Karabas. + + - bpo-27062(34): Add ‘__all__’ to *note inspect: 9e, patch by Kumar + Aditya. + + - bpo-46018(35): Ensure that *note math.expm1(): e9c. does not raise + on underflow. + + - bpo-46016(36): Adding ‘F_DUP2FD’ and ‘F_DUP2FD_CLOEXEC’ constants + from FreeBSD into the fcntl module. + + - bpo-45755(37): *note typing: 123. generic aliases now reveal the + class attributes of the original generic class when passed to + ‘dir()’. This was the behavior up to Python 3.6, but was changed + in 3.7-3.9. + + - bpo-45874(38): The empty query string, consisting of no query + arguments, is now handled correctly in ‘urllib.parse.parse_qsl’. + This caused problems before when strict parsing was enabled. + + - bpo-44674(39): 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. + + - bpo-23882(40): Remove namespace package (PEP 420) support from + unittest discovery. It was introduced in Python 3.4 but has been + broken since Python 3.7. + + - bpo-25066(41): Added a ‘__repr__()’ method to *note + multiprocessing.Event: 125b. objects, patch by Kumar Aditya. + + - bpo-45643(42): Added *note signal.SIGSTKFLT: 125c. on platforms + where this signal is defined. + + - bpo-44092(43): Fetch across rollback no longer raises *note + InterfaceError: 24f. Instead we leave it to the SQLite library to + handle these cases. Patch by Erlend E. Aasland. + + - bpo-42413(44): Replace ‘concurrent.futures.TimeoutError’ and + ‘asyncio.TimeoutError’ with builtin *note TimeoutError: 429, keep + these names as deprecated aliases. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46342 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46328 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46307 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46306 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40479 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46070 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46244 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46278 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46269 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=46266 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=46257 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=41011 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=46239 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=46238 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=46222 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=37295 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=46176 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=43424 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45321 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=46125 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=46118 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=37578 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=20369 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=46105 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=44893 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=22815 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=22047 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=26952 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=45615 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=16594 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=27718 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=46032 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=46014 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=27062 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=46018 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=46016 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=45755 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=45874 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=44674 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=23882 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=25066 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=45643 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=44092 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=42413 + + +File: python.info, Node: Documentation<11>, Next: Tests<11>, Prev: Library<11>, Up: Python 3 11 0 alpha 4 + +1.21.12.3 Documentation +....................... + + - bpo-46196(1): Document method *note cmd.Cmd.columnize(): 125e. + + - bpo-46120(2): State that ‘|’ is preferred for readability over + ‘Union’ in the *note typing: 123. docs. + + - bpo-46109(3): Extracted ‘importlib.resources’ and + ‘importlib.resources.abc’ documentation into separate files. + + - bpo-19737(4): Update the documentation for the *note globals(): + 125f. function. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46196 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46120 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46109 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19737 + + +File: python.info, Node: Tests<11>, Next: Build<12>, Prev: Documentation<11>, Up: Python 3 11 0 alpha 4 + +1.21.12.4 Tests +............... + + - bpo-46296(1): Add a test case for *note enum: 76. with ‘_use_args_ + == True’ and ‘_member_type_ == object’. + + - bpo-46205(2): Fix hang in runtest_mp due to race condition + + - bpo-46263(3): Fix test_capi on FreeBSD 14-dev: instruct jemalloc to + not fill freed memory with junk byte. + + - bpo-46262(4): Cover ‘ValueError’ path in tests for + ‘enum.Flag._missing_()’. + + - bpo-46150(5): Now ‘fakename’ in + ‘test_pathlib.PosixPathTest.test_expanduser’ is checked to be + non-existent. + + - bpo-46129(6): Rewrite ‘asyncio.locks’ tests with *note + unittest.IsolatedAsyncioTestCase: 284. usage. + + - bpo-23819(7): Fixed *note asyncio: 9. tests in python optimized + mode. Patch by Kumar Aditya. + + - bpo-46114(8): Fix test case for OpenSSL 3.0.1 version. OpenSSL 3.0 + uses ‘0xMNN00PP0L’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46296 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46205 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=46263 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46262 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46150 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46129 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23819 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46114 + + +File: python.info, Node: Build<12>, Next: Windows<11>, Prev: Tests<11>, Up: Python 3 11 0 alpha 4 + +1.21.12.5 Build +............... + + - bpo-44133(1): When Python is configured with *note + –without-static-libpython: 4b4, the Python static library + (libpython.a) is no longer built. Patch by Victor Stinner. + + - bpo-44133(2): When Python is built without *note –enable-shared: + 45f, the ‘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 ‘Py_FrozenMain()’ function. Patch by + Victor Stinner. + + - bpo-40280(3): The ‘configure’ script has a new option + ‘--with-emscripten-target’ to select browser or node as Emscripten + build target. + + - bpo-46315(4): Added and fixed ‘#ifdef HAVE_FEATURE’ checks for + functionality that is not available on WASI platform. + + - bpo-45723(5): Fixed a regression in ‘configure’ check for *note + select.epoll(): c31. + + - bpo-46263(6): ‘configure’ no longer sets ‘MULTIARCH’ on FreeBSD + platforms. + + - bpo-46106(7): Updated OpenSSL to 1.1.1m in Windows builds, macOS + installer builds, and CI. Patch by Kumar Aditya. + + - bpo-46088(8): Automatically detect or install bootstrap Python + runtime when building from Visual Studio. + + - bpo-46072(9): Add a –with-pystats configure option to turn on + internal statistics gathering. + + - bpo-40280(10): A new directory ‘Tools/wasm’ contains + WebAssembly-related helpers like ‘config.site’ override for + wasm32-emscripten, wasm assets generator to bundle the stdlib, and + a README. + + - bpo-46023(11): ‘makesetup’ no longer builds extensions that have + been marked as `disabled'. This allows users to disable modules in + ‘Modules/Setup.local’. + + - bpo-45949(12): Use pure Python ‘freeze_module’ for all but + importlib bootstrap files. ‘--with-freeze-module’ ‘configure’ + option is no longer needed for cross builds. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44133 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=44133 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=46315 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45723 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=46263 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=46106 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=46088 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=46072 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=46023 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45949 + + +File: python.info, Node: Windows<11>, Next: macOS<5>, Prev: Build<12>, Up: Python 3 11 0 alpha 4 + +1.21.12.6 Windows +................. + + - bpo-46217(1): Removed parameter that is unsupported on Windows 8.1 + and early Windows 10 and may have caused build or runtime failures. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46217 + + +File: python.info, Node: macOS<5>, Next: C API<9>, Prev: Windows<11>, Up: Python 3 11 0 alpha 4 + +1.21.12.7 macOS +............... + + - bpo-40477(1): The Python Launcher app for macOS now properly + launches scripts and, if necessary, the Terminal app when running + on recent macOS releases. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40477 + + +File: python.info, Node: C API<9>, Prev: macOS<5>, Up: Python 3 11 0 alpha 4 + +1.21.12.8 C API +............... + + - bpo-46236(1): Fix a bug in *note PyFunction_GetAnnotations(): 1265. + that caused it to return a ‘tuple’ instead of a ‘dict’. + + - bpo-46140(2): *note PyBuffer_GetPointer(): 32a, *note + PyBuffer_FromContiguous(): 32d, *note PyBuffer_ToContiguous(): 32c. + and *note PyMemoryView_FromBuffer(): 332. now take buffer info by + ‘const Py_buffer *’ instead of ‘Py_buffer *’, as they do not need + mutability. *note PyBuffer_FromContiguous(): 32d. also now takes + the source buffer as ‘const void *’, and similarly *note + PyBuffer_GetPointer(): 32a. takes the strides as ‘const Py_ssize_t + *’. + + - bpo-45855(3): Document that the `no_block' argument to *note + PyCapsule_Import(): 1266. is a no-op now. + + - bpo-45855(4): Replaced deprecated usage of *note + PyImport_ImportModuleNoBlock(): d2b. with *note + PyImport_ImportModule(): 4ac. in stdlib modules. Patch by Kumar + Aditya. + + - bpo-46007(5): The ‘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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46236 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46140 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45855 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45855 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=46007 + + +File: python.info, Node: Python 3 11 0 alpha 3, Next: Python 3 11 0 alpha 2, Prev: Python 3 11 0 alpha 4, Up: Changelog + +1.21.13 Python 3.11.0 alpha 3 +----------------------------- + +`Release date: 2021-12-08' + +* Menu: + +* Core and Builtins: Core and Builtins<13>. +* Library: Library<12>. +* Documentation: Documentation<12>. +* Tests: Tests<12>. +* Build: Build<13>. +* Windows: Windows<12>. +* macOS: macOS<6>. +* C API: C API<10>. + + +File: python.info, Node: Core and Builtins<13>, Next: Library<12>, Up: Python 3 11 0 alpha 3 + +1.21.13.1 Core and Builtins +........................... + + - bpo-46009(1): 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 + ‘gen_func().send(0)’ is equivalent to + ‘gen_func().throw(TypeError(...)’ which exhausts the generator. In + 3.10.2 onward, the behavior has been reverted to that of 3.9. + + - bpo-46004(2): Fix the *note SyntaxError: 2d6. location for errors + involving for loops with invalid targets. Patch by Pablo Galindo + + - bpo-45711(3): ‘_PyErr_ChainStackItem()’ no longer normalizes + ‘exc_info’ (including setting the traceback on the exception + instance) because ‘exc_info’ is always normalized. + + - bpo-45607(4): The ‘__note__’ field was added to *note + BaseException: 17d. It is ‘None’ by default but can be set to a + string which is added to the exception’s traceback. + + - bpo-45947(5): 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. + + - bpo-45915(6): ‘is_valid_fd’ now uses faster ‘fcntl(fd, F_GETFD)’ on + Linux, macOS, and Windows. + + - bpo-44530(7): Reverts a change to the ‘code.__new__’ *note audit + event: 1269. from an earlier prerelease. + + - bpo-42268(8): Fail the configure step if the selected compiler + doesn’t support memory sanitizer. Patch by Pablo Galindo + + - bpo-45711(9): The three values of ‘exc_info’ are now always + consistent with each other. In particular, the ‘type’ and + ‘traceback’ fields are now derived from the exception instance. + This impacts the return values of *note sys.exc_info(): 25b. and + *note PyErr_GetExcInfo(): 344. if the exception instance is + modified while the exception is handled, as well as *note + PyErr_SetExcInfo(): 343, which now ignores the ‘type’ and + ‘traceback’ arguments provided to it. + + - bpo-45727(10): 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 + + - bpo-45885(11): Specialized the ‘COMPARE_OP’ opcode using the PEP + 659 machinery. + + - bpo-45786(12): Allocate space for the interpreter frame in the + frame object, to avoid an additional allocation when the frame + object outlives the frame activation. + + - bpo-45614(13): Fix *note traceback: 11d. display for exceptions + with invalid module name. + + - bpo-45813(14): Fix crash when calling coro.cr_frame.clear() after + coroutine has been freed. + + - bpo-45811(15): Improve the tokenizer errors when encountering + invisible control characters in the parser. Patch by Pablo Galindo + + - bpo-45848(16): Allow the parser to obtain error lines directly from + encoded files. Patch by Pablo Galindo + + - bpo-45709(17): Restore behavior from 3.10 when tracing an exception + raised within a with statement. + + - bpo-44525(18): Adds new *note COPY_FREE_VARS: 126a. opcode, to make + copying of free variables from function to frame explicit. Helps + optimization of calls to Python function. + + - bpo-45829(19): Specialize *note BINARY_SUBSCR: 1228. for classes + with a ‘__getitem__’ method implemented in Python + + - bpo-45826(20): Fixed a crash when calling ‘.with_traceback(None)’ + on ‘NameError’. This occurs internally in + ‘unittest.TestCase.assertRaises()’. + + - bpo-45822(21): Fixed a bug in the parser that was causing it to not + respect PEP 263(22) coding cookies when no flags are provided. + Patch by Pablo Galindo + + - bpo-45820(23): Fix a segfault when the parser fails without reading + any input. Patch by Pablo Galindo + + - bpo-45636(24): Simplify the implementation of *note BINARY_OP: 2b8. + by indexing into an array of function pointers (rather than + switching on the oparg). + + - bpo-42540(25): Fix crash when *note os.fork(): cd4. is called with + an active non-default memory allocator. + + - bpo-45738(26): Fix computation of error location for invalid + continuation characters in the parser. Patch by Pablo Galindo. + + - bpo-45636(27): Remove an existing “fast path” for old-style string + formatting, since it no longer appears to have any measurable + impact. + + - bpo-45753(28): Make recursion checks a bit more efficient by + tracking amount of calls left before overflow. + + - bpo-45773(29): Fix a compiler hang when attempting to optimize + certain jump patterns. + + - bpo-45764(30): The parser now gives a better error message when + leaving out the opening parenthesis ‘(’ after a ‘def’-statement: + + >>> def f: + File "", line 1 + def f: + ^ + SyntaxError: expected '(' + + - bpo-45609(31): Specialized the ‘STORE_SUBSCR’ opcode using the PEP + 659 machinery. + + - bpo-45636(32): Replace all numeric ‘BINARY_*’ and ‘INPLACE_*’ + instructions with a single *note BINARY_OP: 2b8. implementation. + + - bpo-45582(33): Path calculation (known as ‘getpath’) has been + reimplemented as a frozen Python module. This should have no + visible impact, but may affect calculation of all paths referenced + in *note sys: f9. and *note sysconfig: fa. + + - bpo-45450(34): Improve the syntax error message for parenthesized + arguments. Patch by Pablo Galindo. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46009 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=46004 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45607 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45947 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45915 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=44530 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42268 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45727 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45885 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45786 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=45614 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=45813 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=45811 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=45848 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=45709 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=44525 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45829 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=45826 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=45822 + + (22) https://peps.python.org/pep-0263/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=45820 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=45636 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=42540 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=45738 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=45636 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=45753 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=45773 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=45764 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=45609 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=45636 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=45582 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=45450 + + +File: python.info, Node: Library<12>, Next: Documentation<12>, Prev: Core and Builtins<13>, Up: Python 3 11 0 alpha 3 + +1.21.13.2 Library +................. + + - bpo-27946(1): Fix possible crash when getting an attribute of + class:*note xml.etree.ElementTree.Element: 59e. simultaneously with + replacing the ‘attrib’ dict. + + - bpo-45711(2): Make *note asyncio: 9. normalize exceptions as soon + as they are captured with *note PyErr_Fetch(): cdd, and before they + are stored as an exc_info triplet. This brings *note asyncio: 9. + in line with the rest of the codebase, where an exc_info triplet is + always normalized. + + - bpo-23819(3): Replaced asserts with exceptions in asyncio, patch by + Kumar Aditya. + + - bpo-13236(4): *note unittest.TextTestResult: 125a. and *note + unittest.TextTestRunner: 126c. flush now the output stream more + often. + + - bpo-45917(5): Added *note math.exp2(): 231.:, which returns 2 + raised to the power of x. + + - bpo-37658(6): Fix issue when on certain conditions + ‘asyncio.wait_for()’ may allow a coroutine to complete + successfully, but fail to return the result, potentially causing + memory leaks or other issues. + + - bpo-45876(7): 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 + + - bpo-44649(8): Handle dataclass(slots=True) with a field that has + default a default value, but for which init=False. + + - bpo-45803(9): Added missing kw_only parameter to + dataclasses.make_dataclass(). + + - bpo-45837(10): The ‘turtle.RawTurtle.settiltangle()’ is deprecated + since Python 3.1, it now emits a deprecation warning and will be + removed in Python 3.13. + + Use ‘turtle.RawTurtle.tiltangle()’ instead. + + ‘turtle.RawTurtle.tiltangle()’ was earlier incorrectly marked as + deprecated, its docstring has been corrected. + + Patch by Hugo van Kemenade. + + - bpo-45831(11): *note faulthandler: 78. 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. + + - bpo-45828(12): ‘sqlite’ C callbacks now use unraisable exceptions + if callback tracebacks are enabled. Patch by Erlend E. Aasland. + + - bpo-41735(13): Fix thread lock in ‘zlib.Decompress.flush()’ method + before ‘PyObject_GetBuffer’. + + - bpo-45235(14): 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. + + - bpo-45754(15): Fix a regression in Python 3.11a1 and 3.11a2 where + *note sqlite3: ef. incorrectly would use ‘SQLITE_LIMIT_LENGTH’ when + checking SQL statement lengths. Now, ‘SQLITE_LIMIT_SQL_LENGTH’ is + used. Patch by Erlend E. Aasland. + + - bpo-45766(16): Added `proportional' option to *note + statistics.linear_regression(): 425. + + - bpo-45765(17): In importlib.metadata, fix distribution discovery + for an empty path. + + - bpo-45757(18): Fix bug where *note dis: 36. produced an incorrect + oparg when *note EXTENDED_ARG: 11a9. is followed by an opcode that + does not use its argument. + + - bpo-45644(19): In-place JSON file formatting using ‘python3 -m + json.tool infile infile’ now works correctly, previously it left + the file empty. Patch by Chris Wesseling. + + - bpo-45703(20): When a namespace package is imported before another + module from the same namespace is created/installed in a different + *note sys.path: 162. location while the program is running, calling + the *note importlib.invalidate_caches(): 87a. function will now + also guarantee the new module is noticed. + + - bpo-45535(21): Improve output of ‘dir()’ with Enums. + + - bpo-45664(22): Fix *note types.resolve_bases(): 7fe. and *note + types.new_class(): e13. for *note types.GenericAlias: 3dd. instance + as a base. + + - bpo-45663(23): Fix *note dataclasses.is_dataclass(): 126d. for + dataclasses which are subclasses of *note types.GenericAlias: 3dd. + + - bpo-45662(24): Fix the repr of ‘dataclasses.InitVar’ with a type + alias to the built-in class, e.g. ‘InitVar[list[int]]’. + + - bpo-43137(25): Launch GNOME web browsers via gio tool instead of + obsolete gvfs-open + + - bpo-45429(26): On Windows, *note time.sleep(): 266. now uses a + waitable timer which supports high-resolution timers. Patch by + Dong-hee Na and Eryk Sun. + + - bpo-37295(27): Optimize *note math.comb(): 299. and *note + math.perm(): 29a. + + - bpo-45514(28): Deprecated legacy functions in *note + importlib.resources: 9b. + + - bpo-45507(29): Add tests for truncated/missing trailers in + gzip.decompress implementation. + + - bpo-45359(30): Implement PEP 585(31) for *note + graphlib.TopologicalSorter: 51f. + + - bpo-44733(32): Add ‘max_tasks_per_child’ to *note + concurrent.futures.ProcessPoolExecutor: 52e. This allows users to + specify the maximum number of tasks a single process should execute + before the process needs to be restarted. + + - bpo-28806(33): 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. + + - bpo-43498(34): Avoid a possible `“RuntimeError: dictionary changed + size during iteration”' when adjusting the process count of + ‘ProcessPoolExecutor’. + + - bpo-42158(35): Add MIME types for N-quads, N-triples, Notation3 and + TriG to ‘mimetypes’. + + - bpo-30533(36): Add *note inspect.getmembers_static(): 21c. , it + return all members without triggering dynamic lookup via the + descriptor protocol. Patch by Weipeng Hong. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27946 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45711 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23819 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13236 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45917 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37658 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45876 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=44649 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45803 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45837 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45831 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45828 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=41735 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=45235 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=45754 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=45766 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=45765 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=45757 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45644 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=45703 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=45535 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45664 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=45663 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=45662 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=43137 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=45429 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=37295 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=45514 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=45507 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=45359 + + (31) https://peps.python.org/pep-0585/ + + (32) https://bugs.python.org/issue?@action=redirect&bpo=44733 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=28806 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=43498 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=42158 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30533 + + +File: python.info, Node: Documentation<12>, Next: Tests<12>, Prev: Library<12>, Up: Python 3 11 0 alpha 3 + +1.21.13.3 Documentation +....................... + + - bpo-42238(1): ‘make -C Doc suspicious’ will be removed soon in + favor of ‘make -C Doc check’, mark it as deprecated. + + - bpo-45840(2): Improve cross-references in the documentation for the + data model. + + - bpo-45640(3): 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. + + - bpo-45788(4): Link doc for sys.prefix to sysconfig doc on + installation paths. + + - bpo-45772(5): ‘socket.socket’ documentation is corrected to a class + from a function. + + - bpo-45392(6): Update the docstring of the *note type: 9c2. built-in + to remove a redundant line and to mention keyword arguments for the + constructor. + + - bpo-45250(7): Update the documentation to note that CPython does + not consistently require iterators to define ‘__iter__’. + + - bpo-25381(8): In the extending chapter of the extending doc, update + a paragraph about the global variables containing exception + information. + + - bpo-43905(9): Expanded *note astuple(): 126f. and *note asdict(): + 1270. docs, warning about deepcopy being applied and providing a + workaround. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42238 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45840 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45640 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45788 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45772 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45392 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45250 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=25381 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43905 + + +File: python.info, Node: Tests<12>, Next: Build<13>, Prev: Documentation<12>, Up: Python 3 11 0 alpha 3 + +1.21.13.4 Tests +............... + + - bpo-45695(1): Out-of-tree builds with a read-only source directory + are now tested by CI. + + - bpo-19460(2): Add new Test for + ‘Lib/email/mime/nonmultipart.py::MIMENonMultipart’. + + - bpo-45835(3): Fix race condition in test_queue tests with multiple + “feeder” threads. + + - bpo-45783(4): The test for the freeze tool now handles file moves + and deletions. + + - bpo-45745(5): Remove the ‘--findleaks’ command line option of + regrtest: use the ‘--fail-env-changed’ option instead. Since + Python 3.7, it was a deprecated alias to the ‘--fail-env-changed’ + option. + + - bpo-45701(6): Add tests with ‘tuple’ type with *note + functools.lru_cache(): 632. to ‘test_functools’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45695 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19460 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45835 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45783 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45745 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45701 + + +File: python.info, Node: Build<13>, Next: Windows<12>, Prev: Tests<12>, Up: Python 3 11 0 alpha 3 + +1.21.13.5 Build +............... + + - bpo-44035(1): CI now verifies that autoconf files have been + regenerated with a current and unpatched autoconf package. + + - bpo-45950(2): The build system now uses a ‘_bootstrap_python’ + interpreter for freezing and deepfreezing again. To speed up build + process the build tools ‘_bootstrap_python’ and ‘_freeze_module’ + are no longer build with LTO. + + - bpo-45881(3): The ‘configure’ script now accepts + ‘--with-build-python’ and ‘--with-freeze-module’ options to make + cross compiling easier. + + - bpo-40280(4): Emscripten platform now uses ‘.wasm’ suffix by + default. + + - bpo-40280(5): Disable unusable core extension modules on + WASM/Emscripten targets. + + - bpo-40280(6): ‘configure’ now checks for socket ‘shutdown’ + function. The check makes it possible to disable ‘SYS_shutdown’ + with ‘ac_cv_func_shutdown=no’ in CONFIG_SITE. + + - bpo-40280(7): ‘configure’ now checks for functions ‘fork1, getegid, + geteuid, getgid, getppid, getuid, opendir, pipe, system, wait, + ttyname’. + + - bpo-33393(8): Update ‘config.guess’ to 2021-06-03 and ‘config.sub’ + to 2021-08-14. ‘Makefile’ now has an ‘update-config’ target to + make updating more convenient. + + - bpo-45866(9): ‘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 ” header Patch by Victor + Stinner. + + - bpo-40280(10): ‘configure’ now accepts machine ‘wasm32’ or ‘wasm64’ + and OS ‘wasi’ or ‘emscripten’ for cross building, e.g. + ‘wasm32-unknown-emscripten’, ‘wasm32-wasi’, or + ‘wasm32-unknown-wasi’. + + - bpo-41498(11): Python now compiles on platforms without ‘sigset_t’. + Several functions in *note signal: e7. are not available when + ‘sigset_t’ is missing. + + Based on patch by Roman Yurchak for pyodide. + + - bpo-45881(12): ‘setup.py’ now uses ‘CC’ from environment first to + discover multiarch and cross compile paths. + + - bpo-45886(13): The ‘_freeze_module’ program path can now be + overridden on the command line, e.g. ‘make + FREEZE_MODULE=../x86_64/Program/_freeze_module’. + + - bpo-45873(14): Get rid of the ‘_bootstrap_python’ build step. The + deepfreeze.py script is now run using ‘$(PYTHON_FOR_REGEN)’ which + can be Python 3.7 or newer (on Windows, 3.8 or newer). + + - bpo-45847(15): Port builtin hashlib extensions to ‘PY_STDLIB_MOD’ + macro and ‘addext()’. + + - bpo-45723(16): Add ‘autoconf’ helpers for saving and restoring + environment variables: + + * ‘SAVE_ENV’: Save ‘$CFLAGS’, ‘$LDFLAGS’, ‘$LIBS’, and + ‘$CPPFLAGS’. + + * ‘RESTORE_ENV’: Restore ‘$CFLAGS’, ‘$LDFLAGS’, ‘$LIBS’, and + ‘$CPPFLAGS’. + + * ‘WITH_SAVE_ENV([SCRIPT])’: Run ‘SCRIPT’ wrapped with + ‘SAVE_ENV’ and ‘RESTORE_ENV’. + + Patch by Erlend E. Aasland. + + - bpo-45573(17): Mandatory core modules, that are required to + bootstrap Python, are now in ‘Modules/Setup.bootstrap’. + + - bpo-45573(18): ‘configure’ now creates ‘Modules/Setup.stdlib’ with + conditionally enabled/disabled extension module lines. The file is + not used, yet. + + - bpo-45573(19): ‘configure’ now uses a unified format to set state, + compiler flags, and linker flags in Makefile. The new macro + ‘PY_STDLIB_MOD’ sets three variables that are consumed by + ‘Modules/Setup’ and ‘setup.py’. + + - bpo-45816(20): Python now supports building with Visual Studio 2022 + (MSVC v143, VS Version 17.0). Patch by Jeremiah Vivian. + + - bpo-45800(21): Settings for ‘pyexpat’ C extension are now detected + by ‘configure’. The bundled ‘expat’ library is built in + ‘Makefile’. + + - bpo-45798(22): Settings for *note decimal: 34. internal C extension + are now detected by ‘configure’. The bundled ‘libmpdec’ library is + built in ‘Makefile’. + + - bpo-45723(23): ‘configure’ has a new option ‘--with-pkg-config’ to + disable or require pkg-config. + + - bpo-45774(24): The build dependencies for *note sqlite3: ef. are + now detected by ‘configure’ and ‘pkg-config’. Patch by Erlend E. + Aasland. + + - bpo-45763(25): The build dependencies for *note zlib: 14f, *note + bz2: 12, and *note lzma: ab. are now detected by ‘configure’. + + - bpo-45747(26): gdbm and dbm build dependencies are now detected by + ‘configure’. + + - bpo-45743(27): On macOS, the build system no longer passes + ‘search_paths_first’ to the linker. The flag has been the default + since Xcode 4 / macOS 10.6. + + - bpo-45723(28): ‘configure.ac’ is now compatible with autoconf 2.71. + Deprecated checks ‘STDC_HEADERS’ and ‘AC_HEADER_TIME’ have been + removed. + + - bpo-45723(29): ‘configure’ now prints a warning when pkg-config is + missing. + + - bpo-45731(30): ‘configure --enable-loadable-sqlite-extensions’ is + now handled by new ‘PY_SQLITE_ENABLE_LOAD_EXTENSION’ macro instead + of logic in setup.py. + + - bpo-45723(31): configure.ac now uses custom helper macros and + ‘AC_CACHE_CHECK’ to simplify and speed up configure runs. + + - bpo-45696(32): 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. + + - bpo-45561(33): Run smelly.py tool from $(srcdir). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44035 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45950 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45881 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33393 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45866 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=40280 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=41498 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45881 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=45886 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=45873 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=45847 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=45723 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=45573 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=45573 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45573 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=45816 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=45800 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45798 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=45723 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=45774 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=45763 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=45747 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=45743 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=45723 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=45723 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=45731 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=45723 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=45696 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=45561 + + +File: python.info, Node: Windows<12>, Next: macOS<6>, Prev: Build<13>, Up: Python 3 11 0 alpha 3 + +1.21.13.6 Windows +................. + + - bpo-46105(1): Fixed calculation of *note sys.path: 162. in a venv + on Windows. + + - bpo-45901(2): When installed through the Microsoft Store and set as + the default app for ‘*.py’ files, command line arguments will now + be passed to Python when invoking a script without explicitly + launching Python (that is, ‘script.py args’ rather than ‘python + script.py args’). + + - bpo-45616(3): 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. + + - bpo-45850(4): Implement changes to build with deep-frozen modules + on Windows. Note that we now require Python 3.10 as the + “bootstrap” or “host” Python. + + - bpo-45732(5): Updates bundled Tcl/Tk to 8.6.12. + + - bpo-45720(6): Internal reference to ‘shlwapi.dll’ was dropped to + help improve startup time. This DLL will no longer be loaded at + the start of every Python process. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=46105 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45901 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45616 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45850 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45732 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45720 + + +File: python.info, Node: macOS<6>, Next: C API<10>, Prev: Windows<12>, Up: Python 3 11 0 alpha 3 + +1.21.13.7 macOS +............... + + - bpo-45732(1): Update python.org macOS installer to use Tcl/Tk + 8.6.12. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45732 + + +File: python.info, Node: C API<10>, Prev: macOS<6>, Up: Python 3 11 0 alpha 3 + +1.21.13.8 C API +............... + + - bpo-39026(1): Fix Python.h to build C extensions with Xcode: remove + a relative include from ‘Include/cpython/pystate.h’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39026 + + +File: python.info, Node: Python 3 11 0 alpha 2, Next: Python 3 11 0 alpha 1, Prev: Python 3 11 0 alpha 3, Up: Changelog + +1.21.14 Python 3.11.0 alpha 2 +----------------------------- + +`Release date: 2021-11-05' + +* Menu: + +* Core and Builtins: Core and Builtins<14>. +* Library: Library<13>. +* Documentation: Documentation<13>. +* Tests: Tests<13>. +* Build: Build<14>. +* Windows: Windows<13>. +* macOS: macOS<7>. +* IDLE: IDLE<6>. +* C API: C API<11>. + + +File: python.info, Node: Core and Builtins<14>, Next: Library<13>, Up: Python 3 11 0 alpha 2 + +1.21.14.1 Core and Builtins +........................... + + - bpo-45716(1): Improve the *note SyntaxError: 2d6. message when + using ‘True’, ‘None’ or ‘False’ as keywords in a function call. + Patch by Pablo Galindo. + + - bpo-45688(2): *note sys.stdlib_module_names: 438. now contains the + macOS-specific module ‘_scproxy’. + + - bpo-45379(3): Clarify *note ImportError: 511. message when we try + to explicitly import a frozen module but frozen modules are + disabled. + + - bpo-44525(4): Specialize simple calls to Python functions (no + starargs, keyowrd dict, or closure) + + - bpo-45530(5): 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 *note Value + comparisons: 1278. 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. + + - bpo-45526(6): 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. + + - bpo-30570(7): Fixed a crash in ‘issubclass()’ from infinite + recursion when searching pathological ‘__bases__’ tuples. + + - bpo-45521(8): 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. + + - bpo-45494(9): Fix parser crash when reporting errors involving + invalid continuation characters. Patch by Pablo Galindo. + + - bpo-45445(10): Python now fails to initialize if it finds an + invalid *note -X: 174. option in the command line. Patch by Pablo + Galindo. + + - bpo-45340(11): 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. + + - bpo-45408(12): Fix a crash in the parser when reporting tokenizer + errors that occur at the same time unclosed parentheses are + detected. Patch by Pablo Galindo. + + - bpo-29410(13): Add SipHash13 for string hash algorithm and use it + by default. + + - bpo-45385(14): Fix reference leak from descr_check. Patch by + Dong-hee Na. + + - bpo-45367(15): Specialized the ‘BINARY_MULTIPLY’ opcode to + ‘BINARY_MULTIPLY_INT’ and ‘BINARY_MULTIPLY_FLOAT’ using the PEP 659 + machinery. + + - bpo-21736(16): Frozen stdlib modules now have ‘__file__’ to the .py + file they would otherwise be loaded from, if possible. For + packages, ‘__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 ‘__file__’ is not guaranteed to + exist. None of this affects non-stdlib frozen modules nor, for + now, frozen modules imported using ‘PyImport_ImportFrozenModule()’. + Also, at the moment ‘co_filename’ is not updated for the module. + + - bpo-45020(17): For frozen stdlib modules, record the original + module name as ‘module.__spec__.loader_state.origname’. If the + value is different than ‘module.__spec__.name’ then the module was + defined as an alias in Tools/scripts/freeze_modules.py. If it is + ‘None’ then the module comes from a source file outside the stdlib. + + - bpo-45324(18): 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. + + - bpo-45292(19): Implement PEP 654(20). Add *note ExceptionGroup: + 177. and *note BaseExceptionGroup: 178. Update traceback display + code. + + - bpo-40116(21): 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. + + - bpo-44050(22): Extensions that indicate they use global state (by + setting ‘m_size’ to -1) can again be used in multiple interpreters. + This reverts to behavior of Python 3.8. + + - bpo-44525(23): Setup initial specialization infrastructure for the + ‘CALL_FUNCTION’ opcode. Implemented initial specializations for C + function calls: + + * ‘CALL_FUNCTION_BUILTIN_O’ for ‘METH_O’ flag. + + * ‘CALL_FUNCTION_BUILTIN_FAST’ for ‘METH_FASTCALL’ flag without + keywords. + + * ‘CALL_FUNCTION_LEN’ for ‘len(o)’. + + * ‘CALL_FUNCTION_ISINSTANCE’ for ‘isinstance(o, t)’. + + - bpo-44511(24): Improve the generated bytecode for class and mapping + patterns. + + - bpo-43706(25): Speed up calls to ‘enumerate()’ by using the PEP + 590(26) ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45716 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45688 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45379 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=44525 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45530 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45526 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=30570 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45521 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45494 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45445 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45340 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45408 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=29410 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=45385 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=45367 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=21736 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=45020 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=45324 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45292 + + (20) https://peps.python.org/pep-0654/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=40116 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=44050 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=44525 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=44511 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=43706 + + (26) https://peps.python.org/pep-0590/ + + +File: python.info, Node: Library<13>, Next: Documentation<13>, Prev: Core and Builtins<14>, Up: Python 3 11 0 alpha 2 + +1.21.14.2 Library +................. + + - bpo-45679(1): Fix caching of multi-value *note typing.Literal: 44c. + ‘Literal[True, 2]’ is no longer equal to ‘Literal[1, 2]’. + + - bpo-42064(2): Convert *note sqlite3: ef. to multi-phase + initialisation (PEP 489). Patches by Erlend E. Aasland. + + - bpo-45438(3): Fix typing.Signature string representation for + generic builtin types. + + - bpo-45613(4): *note sqlite3: ef. now sets *note + sqlite3.threadsafety: 24d. based on the default threading mode the + underlying SQLite library has been compiled with. Patch by Erlend + E. Aasland. + + - bpo-45574(5): Fix warning about ‘print_escape’ being unused. + + - bpo-45581(6): *note sqlite3.connect(): 7da. now correctly raises + *note MemoryError: 127a. if the underlying SQLite API signals + memory error. Patch by Erlend E. Aasland. + + - bpo-45557(7): pprint.pprint() now handles underscore_numbers + correctly. Previously it was always setting it to False. + + - bpo-44019(8): Add *note operator.call(): 127b. to + ‘operator.__all__’. Patch by Kreusada. + + - bpo-42174(9): *note shutil.get_terminal_size(): dae. now falls back + to sane values if the column or line count are 0. + + - bpo-35673(10): Improve the introspectability of the ‘__loader__’ + attribute for namespace packages. + ‘importlib.machinery.NamespaceLoader’ is now public, and implements + the *note importlib.abc.InspectLoader: bee. interface. + ‘_NamespaceLoader’ is kept for backward compatibility. + + - bpo-45515(11): Add references to *note zoneinfo: 150. in the *note + datetime: 2f. documentation, mostly replacing outdated references + to ‘dateutil.tz’. Change by Paul Ganssle. + + - bpo-45475(12): Reverted optimization of iterating *note + gzip.GzipFile: 590, *note bz2.BZ2File: 5a5, and *note + lzma.LZMAFile: caf. (see bpo-43787(13)) because it caused + regression when user iterate them without having reference of them. + Patch by Inada Naoki. + + - bpo-45489(14): Update *note ForwardRef: 1237. to support ‘|’ + operator. Patch by Dong-hee Na. + + - bpo-42222(15): Removed deprecated support for float arguments in + `randrange()'. + + - bpo-45428(16): Fix a regression in py_compile when reading + filenames from standard input. + + - bpo-45467(17): Fix incremental decoder and stream reader in the + “raw-unicode-escape” codec. Previously they failed if the escape + sequence was split. + + - bpo-45461(18): Fix incremental decoder and stream reader in the + “unicode-escape” codec. Previously they failed if the escape + sequence was split. + + - bpo-45239(19): Fixed *note email.utils.parsedate_tz(): 127c. + crashing with *note UnboundLocalError: 116c. on certain invalid + input instead of returning ‘None’. Patch by Ben Hoyt. + + - bpo-45417(20): Fix quadratic behaviour in the enum module: Creation + of enum classes with a lot of entries was quadratic. + + - bpo-45249(21): Fix the behaviour of *note traceback.print_exc(): + 127d. when displaying the caret when the ‘end_offset’ in the + exception is set to 0. Patch by Pablo Galindo + + - bpo-45416(22): Fix use of *note asyncio.Condition: 6c5. with + explicit *note asyncio.Lock: 6c3. objects, which was a regression + due to removal of explicit loop arguments. Patch by Joongi Kim. + + - bpo-20028(23): Empty escapechar/quotechar is not allowed when + initializing *note csv.Dialect: 127e. Patch by Vajrasky Kok and + Dong-hee Na. + + - bpo-44904(24): Fix bug in the *note doctest: 63. module that caused + it to fail if a docstring included an example with a ‘classmethod’ + ‘property’. Patch by Alex Waygood. + + - bpo-45406(25): Make *note inspect.getmodule(): 11d4. catch + ‘FileNotFoundError’ raised by :’func:‘inspect.getabsfile’, and + return ‘None’ to indicate that the module could not be determined. + + - bpo-45411(26): Add extensions for files containing subtitles - .srt + & .vtt - to the mimetypes.py module. + + - bpo-10716(27): Migrated pydoc to HTML5 (without changing the look + of it). Side effect is to update xmlrpc’s ‘ServerHTMLDoc’ which + now uses the CSS too. cgitb now relies less on pydoc (as it can’t + use the CSS file). + + - bpo-27580(28): Add support of null characters in *note csv: 28. + + - bpo-45262(29): 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 + + - bpo-45386(30): Make *note xmlrpc.client: 14a. more robust to C + runtimes where the underlying C ‘strftime’ function results in a + ‘ValueError’ when testing for year formatting options. + + - bpo-20028(31): Improve error message of *note csv.Dialect: 127e. + when initializing. Patch by Vajrasky Kok and Dong-hee Na. + + - bpo-45343(32): Update bundled pip to 21.2.4 and setuptools to + 58.1.0 + + - bpo-45328(33): Fixed *note http.client.HTTPConnection: 796. to work + properly in OSs that don’t support the ‘TCP_NODELAY’ socket option. + + - bpo-45243(34): Add *note setlimit(): 24a. and *note getlimit(): + 24b. to *note sqlite3.Connection: 24c. for setting and getting + SQLite limits by connection basis. Patch by Erlend E. Aasland. + + - bpo-45320(35): Removed from the *note inspect: 9e. module: + + * + the ‘getargspec’ function, deprecated since Python 3.0; + + use *note inspect.signature(): 301. or *note + inspect.getfullargspec(): 302. instead. + + * the ‘formatargspec’ function, deprecated since Python 3.5; use + the *note inspect.signature(): 301. function and ‘Signature’ + object directly. + + * the undocumented ‘Signature.from_callable’ and + ‘Signature.from_function’ functions, deprecated since Python + 3.5; use the *note Signature.from_callable(): 304. method + instead. + + Patch by Hugo van Kemenade. + + - bpo-45192(36): Fix the ‘tempfile._infer_return_type’ function so + that the ‘dir’ argument of the *note tempfile: ff. functions + accepts an object implementing the ‘os.PathLike’ protocol. + + Patch by Kyungmin Lee. + + - bpo-45160(37): When tracing a tkinter variable used by a ttk + OptionMenu, callbacks are no longer made twice. + + - bpo-25625(38): Added non parallel-safe *note chdir(): 1e5. context + manager to change the current working directory and then restore it + on exit. Simple wrapper around *note chdir(): 1e6. + + - bpo-24139(39): Add support for SQLite extended result codes in + *note sqlite3.Error: 127f. Patch by Erlend E. Aasland. + + - bpo-24444(40): Fixed an error raised in *note argparse: 5. help + display when help for an option is set to 1+ blank spaces or when + `choices' arg is an empty container. + + - bpo-44547(41): Implement ‘Fraction.__int__’, so that a *note + fractions.Fraction: 210. instance ‘f’ passes an ‘isinstance(f, + typing.SupportsInt)’ check. + + - bpo-40321(42): Adds support for HTTP 308 redirects to *note urllib: + 127. See RFC 7538(43) for details. Patch by Jochem + Schulenklopper. + + - bpo-41374(44): Ensure that ‘socket.TCP_*’ constants are exposed on + Cygwin 3.1.6 and greater. + + - bpo-35970(45): Add help flag to the base64 module’s command line + interface. Patch contributed by Robert Kuska. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45679 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42064 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45438 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45613 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45574 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45581 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45557 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=44019 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42174 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35673 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45515 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45475 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43787 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=45489 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=42222 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=45428 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=45467 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=45461 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45239 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=45417 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=45249 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45416 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=20028 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=44904 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=45406 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=45411 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=10716 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=27580 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=45262 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=45386 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=20028 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=45343 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=45328 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=45243 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=45320 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=45192 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=45160 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=25625 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=24139 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=24444 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=44547 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=40321 + + (43) https://datatracker.ietf.org/doc/html/rfc7538.html + + (44) https://bugs.python.org/issue?@action=redirect&bpo=41374 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=35970 + + +File: python.info, Node: Documentation<13>, Next: Tests<13>, Prev: Library<13>, Up: Python 3 11 0 alpha 2 + +1.21.14.3 Documentation +....................... + + - bpo-45726(1): Improve documentation for *note + functools.singledispatch(): 212. and *note + functools.singledispatchmethod: 634. + + - bpo-45680(2): Amend the docs on ‘GenericAlias’ objects to clarify + that non-container classes can also implement ‘__class_getitem__’. + Patch contributed by Alex Waygood. + + - bpo-45618(3): Update Sphinx version used to build the documentation + to 4.2.0. Patch by Maciej Olko. + + - bpo-45655(4): Add a new “relevant PEPs” section to the top of the + documentation for the ‘typing’ module. Patch by Alex Waygood. + + - bpo-45604(5): Add ‘level’ argument to + ‘multiprocessing.log_to_stderr’ function docs. + + - bpo-45516(6): Add protocol description to the + ‘importlib.abc.TraversableResources’ documentation. + + - bpo-45464(7): Mention in the documentation of *note Built-in + Exceptions: 1281. that inheriting from multiple exception types in + a single subclass is not recommended due to possible memory layout + incompatibility. + + - bpo-45449(8): Add note about PEP 585(9) in *note collections.abc: + 1d. + + - bpo-45516(10): Add protocol description to the + ‘importlib.abc.Traversable’ documentation. + + - bpo-20692(11): Add Programming FAQ entry explaining that int + literal attribute access requires either a space after or + parentheses around the literal. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45726 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45680 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45618 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45655 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45604 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45516 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45464 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45449 + + (9) https://peps.python.org/pep-0585/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45516 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=20692 + + +File: python.info, Node: Tests<13>, Next: Build<14>, Prev: Documentation<13>, Up: Python 3 11 0 alpha 2 + +1.21.14.4 Tests +............... + + - bpo-45678(1): Add tests for scenarios in which *note + functools.singledispatchmethod: 634. is stacked on top of a method + that has already been wrapped by two other decorators. Patch by + Alex Waygood. + + - bpo-45578(2): Add tests for *note dis.distb(): bc4. + + - bpo-45678(3): Add tests to ensure that + ‘functools.singledispatchmethod’ correctly wraps the attributes of + the target function. + + - bpo-45668(4): PGO tests now pass when Python is built without test + extension modules. + + - bpo-45577(5): Add subtests for all ‘pickle’ protocols in + ‘test_zoneinfo’. + + - bpo-45566(6): Fix ‘test_frozen_pickle’ in ‘test_dataclasses’ to + check all ‘pickle’ versions. + + - bpo-43592(7): ‘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. + + - bpo-39679(8): Add more test cases for + ‘@functools.singledispatchmethod’ when combined with ‘@classmethod’ + or ‘@staticmethod’. + + - bpo-45410(9): 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. + + - bpo-45402(10): 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. + + - bpo-45403(11): Fix test_sys.test_stdlib_dir() when Python is built + outside the source tree: compare normalized paths. Patch by Victor + Stinner. + + - bpo-45400(12): 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. + + - bpo-10572(13): Rename *note sqlite3: ef. tests from ‘test_sqlite’ + to ‘test_sqlite3’, and relocate them to ‘Lib/test/test_sqlite3’. + Patch by Erlend E. Aasland. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45678 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45578 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45678 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45668 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45577 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45566 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43592 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39679 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45410 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45402 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45403 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45400 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=10572 + + +File: python.info, Node: Build<14>, Next: Windows<13>, Prev: Tests<13>, Up: Python 3 11 0 alpha 2 + +1.21.14.5 Build +............... + + - bpo-43158(1): ‘setup.py’ now uses values from configure script to + build the ‘_uuid’ extension module. Configure now detects + util-linux’s ‘libuuid’, too. + + - bpo-45666(2): Fix warning of ‘swprintf’ and ‘%s’ usage in + ‘_testembed.c’ + + - bpo-45548(3): ‘Modules/Setup’ and ‘Modules/makesetup’ have been + improved. The ‘Setup’ file now contains working rules for all + extensions. Outdated comments have been removed. Rules defined by + ‘makesetup’ track dependencies correctly. + + - bpo-45548(4): The *note math: af. and *note cmath: 17. + implementation now require a C99 compatible ‘libm’ and no longer + ship with workarounds for missing acosh, asinh, atanh, expm1, and + log1p functions. + + - bpo-45595(5): ‘setup.py’ and ‘makesetup’ now track build + dependencies on all Python header files and module specific header + files. + + - bpo-45571(6): ‘Modules/Setup’ now use ‘PY_CFLAGS_NODIST’ instead of + ‘PY_CFLAGS’ to compile shared modules. + + - bpo-45570(7): ‘pyexpat’ and ‘_elementtree’ no longer define + obsolete macros ‘HAVE_EXPAT_CONFIG_H’ and ‘USE_PYEXPAT_CAPI’. + ‘XML_POOR_ENTROPY’ is now defined in ‘expat_config.h’. + + - bpo-43974(8): ‘setup.py’ no longer defines ‘Py_BUILD_CORE_MODULE’. + Instead every module, that uses the internal API, defines the + macro. + + - bpo-45548(9): Fill in missing entries in Modules/Setup. + + - bpo-45532(10): Update *note sys.version: 990. to use ‘main’ as + fallback information. Patch by Jeong YunWon. + + - bpo-45536(11): The ‘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. + + - bpo-45221(12): Fixed regression in handling of ‘LDFLAGS’ and + ‘CPPFLAGS’ options where ‘argparse.parse_known_args()’ could + interpret an option as one of the built-in command line argument, + for example ‘-h’ for help. + + - bpo-45440(13): Building Python now requires a C99 ‘’ header + file providing the following functions: ‘copysign()’, ‘hypot()’, + ‘isfinite()’, ‘isinf()’, ‘isnan()’, ‘round()’. Patch by Victor + Stinner. + + - bpo-45405(14): Prevent ‘internal configure error’ when running + ‘configure’ with recent versions of non-Apple clang. Patch by + David Bohman. + + - bpo-45433(15): Avoid linking libpython with libcrypt. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43158 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45666 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45548 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45548 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45595 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45571 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45570 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43974 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45548 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45532 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45536 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45221 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=45440 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=45405 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=45433 + + +File: python.info, Node: Windows<13>, Next: macOS<7>, Prev: Build<14>, Up: Python 3 11 0 alpha 2 + +1.21.14.6 Windows +................. + + - bpo-43652(1): Update Tcl/Tk to 8.6.11, actually this time. The + previous update incorrectly included 8.6.10. + + - bpo-45337(2): 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. + + - bpo-43851(3): Build SQLite ‘SQLITE_OMIT_AUTOINIT’ on Windows. + Patch by Erlend E. Aasland. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43652 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45337 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43851 + + +File: python.info, Node: macOS<7>, Next: IDLE<6>, Prev: Windows<13>, Up: Python 3 11 0 alpha 2 + +1.21.14.7 macOS +............... + + - bpo-44828(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44828 + + +File: python.info, Node: IDLE<6>, Next: C API<11>, Prev: macOS<7>, Up: Python 3 11 0 alpha 2 + +1.21.14.8 IDLE +.............. + + - bpo-45495(1): Add context keywords ‘case’ and ‘match’ to + completions list. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45495 + + +File: python.info, Node: C API<11>, Prev: IDLE<6>, Up: Python 3 11 0 alpha 2 + +1.21.14.9 C API +............... + + - bpo-29103(1): *note PyType_FromSpec*: 4c8. 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. + + - bpo-45522(2): The internal freelists for frame, float, list, dict, + async generators, and context objects can now be disabled. + + - bpo-35134(3): Exclude *note PyWeakref_GET_OBJECT(): 387. from the + limited C API. It never worked since the ‘PyWeakReference’ + structure is opaque in the limited C API. + + - bpo-35081(4): Move the ‘interpreteridobject.h’ header file from + ‘Include/’ to ‘Include/internal/’. It only provides private + functions. Patch by Victor Stinner. + + - bpo-35134(5): The non-limited API files ‘cellobject.h’, + ‘classobject.h’, ‘context.h’, ‘funcobject.h’, ‘genobject.h’ and + ‘longintrepr.h’ have been moved to the ‘Include/cpython’ directory. + Moreover, the ‘eval.h’ header file was removed. These files must + not be included directly, as they are already included in + ‘Python.h’: *note Include Files: 359. If they have been included + directly, consider including ‘Python.h’ instead. Patch by Victor + Stinner. + + - bpo-45474(6): The following items are no longer available when + ‘Py_LIMITED_API’ is defined: + + * *note PyMarshal_WriteLongToFile(): 382. + + * *note PyMarshal_WriteObjectToFile(): 383. + + * *note PyMarshal_ReadObjectFromString(): 384. + + * *note PyMarshal_WriteObjectToString(): 385. + + * the ‘Py_MARSHAL_VERSION’ macro + + These are not part of the *note limited API: 386. + + Patch by Victor Stinner. + + - bpo-45434(7): Remove the ‘pystrhex.h’ header file. It only + contains private functions. C extensions should only include the + main ‘’ header file. Patch by Victor Stinner. + + - bpo-45440(8): Remove the ‘Py_FORCE_DOUBLE()’ macro. It was used by + the ‘Py_IS_INFINITY()’ macro. Patch by Victor Stinner. + + - bpo-45434(9): ‘’ no longer includes the header files + ‘’, ‘’, ‘’ and ‘’ when the + ‘Py_LIMITED_API’ macro is set to ‘0x030b0000’ (Python 3.11) or + higher. C extensions should explicitly include the header files + after ‘#include ’. Patch by Victor Stinner. + + - bpo-41123(10): Remove ‘Py_UNICODE_COPY()’ and ‘Py_UNICODE_FILL()’ + macros, deprecated since Python 3.3. Use + ‘PyUnicode_CopyCharacters()’ or ‘memcpy()’ (‘wchar_t*’ string), and + ‘PyUnicode_Fill()’ functions instead. Patch by Victor Stinner. + + - bpo-45412(11): Remove the following math macros using the ‘errno’ + variable: + + * ‘Py_ADJUST_ERANGE1()’ + + * ‘Py_ADJUST_ERANGE2()’ + + * ‘Py_OVERFLOWED()’ + + * ‘Py_SET_ERANGE_IF_OVERFLOW()’ + + * ‘Py_SET_ERRNO_ON_MATH_ERROR()’ + + Patch by Victor Stinner. + + - bpo-45395(12): Custom frozen modules (the array set to + ‘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. + + - bpo-43760(13): Add new *note PyThreadState_EnterTracing(): 323, and + *note PyThreadState_LeaveTracing(): 324. functions to the limited C + API to suspend and resume tracing and profiling. Patch by Victor + Stinner. + + - bpo-44220(14): *note PyStructSequence_UnnamedField: 5d8. is added + to the Stable ABI. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29103 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45522 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35081 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45474 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45434 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45440 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45434 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41123 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45412 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45395 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43760 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=44220 + + +File: python.info, Node: Python 3 11 0 alpha 1, Next: Python 3 10 0 beta 1, Prev: Python 3 11 0 alpha 2, Up: Changelog + +1.21.15 Python 3.11.0 alpha 1 +----------------------------- + +`Release date: 2021-10-05' + +* Menu: + +* Security: Security<5>. +* Core and Builtins: Core and Builtins<15>. +* Library: Library<14>. +* Documentation: Documentation<14>. +* Tests: Tests<14>. +* Build: Build<15>. +* Windows: Windows<14>. +* macOS: macOS<8>. +* IDLE: IDLE<7>. +* Tools/Demos: Tools/Demos<4>. +* C API: C API<12>. + + +File: python.info, Node: Security<5>, Next: Core and Builtins<15>, Up: Python 3 11 0 alpha 1 + +1.21.15.1 Security +.................. + + - bpo-42278(1): Replaced usage of *note tempfile.mktemp(): 128a. with + *note TemporaryDirectory: ef1. to avoid a potential race condition. + + - bpo-44600(2): Fix incorrect line numbers while tracing some failed + patterns in *note match: 400. statements. Patch by Charles + Burkland. + + - bpo-41180(3): Add auditing events to the *note marshal: ae. module, + and stop raising ‘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 ‘.pyc’ files. + + - bpo-44394(4): Update the vendored copy of libexpat to 2.4.1 (from + 2.2.8) to get the fix for the CVE-2013-0340 “Billion Laughs” + vulnerability. This copy is most used on Windows and macOS. + + - bpo-43124(5): Made the internal ‘putcmd’ function in *note smtplib: + ea. sanitize input for presence of ‘\r’ and ‘\n’ characters to + avoid (unlikely) command injection. + + - bpo-44022(6): *note http.client: 8f. now avoids infinitely reading + potential HTTP headers after a ‘100 Continue’ status response from + the server. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42278 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=44600 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41180 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=44394 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43124 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=44022 + + +File: python.info, Node: Core and Builtins<15>, Next: Library<14>, Prev: Security<5>, Up: Python 3 11 0 alpha 1 + +1.21.15.2 Core and Builtins +........................... + + - bpo-43760(1): 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. + + - bpo-45061(2): 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. + + - bpo-24076(3): sum() was further optimised for summing up single + digit integers. + + - bpo-45190(4): Update Unicode databases to Unicode 14.0.0. + + - bpo-45167(5): Fix deepcopying of *note types.GenericAlias: 3dd. + objects. + + - bpo-45155(6): *note int.to_bytes(): 128c. and *note + int.from_bytes(): 1244. now take a default value of ‘"big"’ for the + ‘byteorder’ argument. *note int.to_bytes(): 128c. also takes a + default value of ‘1’ for the ‘length’ argument. + + - bpo-44219(7): Release the GIL while performing ‘isatty’ system + calls on arbitrary file descriptors. In particular, this affects + *note os.isatty(): 128d, *note os.device_encoding(): 128e. and + *note io.TextIOWrapper: 9ad. By extension, *note io.open(): 30c. + in text mode is also affected. This change solves a deadlock in + *note os.isatty(): 128d. Patch by Vincent Michel in bpo-44219(8). + + - bpo-44959(9): Added fallback to extension modules with ‘.sl’ suffix + on HP-UX + + - bpo-45121(10): Fix issue where ‘Protocol.__init__’ raises + ‘RecursionError’ when it’s called directly or via ‘super()’. Patch + provided by Yurii Karabas. + + - bpo-44348(11): The deallocator function of the *note BaseException: + 17d. type now uses the trashcan mechanism to prevent stack + overflow. For example, when a *note RecursionError: 9e7. instance + is raised, it can be linked to another RecursionError through the + ‘__context__’ attribute or the ‘__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. + + - bpo-45123(12): Fix PyAiter_Check to only check for the __anext__ + presence (not for __aiter__). Rename PyAiter_Check to + PyAIter_Check, PyObject_GetAiter -> PyObject_GetAIter. + + - bpo-1514420(13): Interpreter no longer attempts to open files with + names in angle brackets (like “” or “”) when + formatting an exception. + + - bpo-41031(14): Match C and Python code formatting of unprintable + exceptions and exceptions in the *note __main__: 1. module. + + - bpo-37330(15): *note open(): 30b, *note io.open(): 30c, *note + codecs.open(): 30d. and *note fileinput.FileInput: 300. no longer + accept ‘'U'’ (“universal newline”) in the file mode. This flag was + deprecated since Python 3.3. Patch by Victor Stinner. + + - bpo-45083(16): 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 *note + traceback: 11d. module was using qualname already). + + - bpo-34561(17): List sorting now uses the merge-ordering strategy + from Munro and Wild’s ‘powersort()’. Unlike the former strategy, + this is provably near-optimal in the entropy of the distribution of + run lengths. Most uses of ‘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. + + - bpo-45056(18): Compiler now removes trailing unused constants from + co_consts. + + - bpo-45020(19): 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). + + - bpo-45012(20): In *note posix: ce, release GIL during ‘stat()’, + ‘lstat()’, and ‘fstatat()’ syscalls made by *note + os.DirEntry.stat(): 128f. Patch by Stanisław Skonieczny. + + - bpo-45018(21): Fixed pickling of range iterators that iterated for + over ‘2**32’ times. + + - bpo-45000(22): A *note SyntaxError: 2d6. is now raised when trying + to delete *note __debug__: 3cb. Patch by Dong-hee Na. + + - bpo-44963(23): Implement ‘send()’ and ‘throw()’ methods for + ‘anext_awaitable’ objects. Patch by Pablo Galindo. + + - bpo-44962(24): 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 + + - bpo-24234(25): Implement the ‘__bytes__()’ special method on the + *note bytes: 1b4. type, so a bytes object ‘b’ passes an + ‘isinstance(b, typing.SupportsBytes)’ check. + + - bpo-24234(26): Implement the ‘__complex__()’ special method on the + *note complex: 1b8. type, so a complex number ‘z’ passes an + ‘isinstance(z, typing.SupportsComplex)’ check. + + - bpo-44954(27): Fixed a corner case bug where the result of + ‘float.fromhex('0x.8p-1074')’ was rounded the wrong way. + + - bpo-44947(28): Refine the syntax error for trailing commas in + import statements. Patch by Pablo Galindo. + + - bpo-44945(29): Specialize the BINARY_ADD instruction using the PEP + 659 machinery. Adds five new instructions: + + * BINARY_ADD_ADAPTIVE + + * BINARY_ADD_FLOAT + + * BINARY_ADD_INT + + * BINARY_ADD_UNICODE + + * BINARY_ADD_UNICODE_INPLACE_FAST + + - bpo-44929(30): Fix some edge cases of ‘enum.Flag’ string + representation in the REPL. Patch by Pablo Galindo. + + - bpo-44914(31): 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. + + - bpo-44698(32): Restore behaviour of complex exponentiation with + integer-valued exponent of type *note float: 3ca. or *note complex: + 1b8. + + - bpo-44895(33): A debug variable ‘PYTHONDUMPREFSFILE’ is added for + creating a dump file which is generated by *note –with-trace-refs: + 4d0. Patch by Dong-hee Na. + + - bpo-44900(34): Add five superinstructions for PEP 659 quickening: + + * LOAD_FAST LOAD_FAST + + * STORE_FAST LOAD_FAST + + * LOAD_FAST LOAD_CONST + + * LOAD_CONST LOAD_FAST + + * STORE_FAST STORE_FAST + + - bpo-44889(35): Initial implementation of adaptive specialization of + ‘LOAD_METHOD’. The following specialized forms were added: + + * ‘LOAD_METHOD_CACHED’ + + * ‘LOAD_METHOD_MODULE’ + + * ‘LOAD_METHOD_CLASS’ + + - bpo-44890(36): Specialization stats are always collected in debug + builds. + + - bpo-44885(37): Correct the ast locations of f-strings with format + specs and repeated expressions. Patch by Pablo Galindo + + - bpo-44878(38): Remove the loop from the bytecode interpreter. All + instructions end with a DISPATCH macro, so the loop is now + redundant. + + - bpo-44878(39): Remove switch statement for interpreter loop when + using computed gotos. This makes sure that we only have one + dispatch table in the interpreter. + + - bpo-44874(40): Deprecate the old trashcan macros + (‘Py_TRASHCAN_SAFE_BEGIN’/‘Py_TRASHCAN_SAFE_END’). They should be + replaced by the new macros ‘Py_TRASHCAN_BEGIN’ and + ‘Py_TRASHCAN_END’. + + - bpo-44872(41): Use new trashcan macros (Py_TRASHCAN_BEGIN/END) in + frameobject.c instead of the old ones (Py_TRASHCAN_SAFE_BEGIN/END). + + - bpo-33930(42): Fix segmentation fault with deep recursion when + cleaning method objects. Patch by Augusto Goulart and Pablo + Galindo. + + - bpo-25782(43): Fix bug where ‘PyErr_SetObject’ hangs when the + current exception has a cycle in its context chain. + + - bpo-44856(44): Fix reference leaks in the error paths of + ‘update_bases()’ and ‘__build_class__’. Patch by Pablo Galindo. + + - bpo-44826(45): Initial implementation of adaptive specialization of + STORE_ATTR + + Three specialized forms of STORE_ATTR are added: + + * STORE_ATTR_SLOT + + * STORE_ATTR_SPLIT_KEYS + + * STORE_ATTR_WITH_HINT + + - bpo-44838(46): Fixed a bug that was causing the parser to raise an + incorrect custom *note SyntaxError: 2d6. for invalid ‘if’ + expressions. Patch by Pablo Galindo. + + - bpo-44821(47): Create instance dictionaries (__dict__) eagerly, to + improve regularity of object layout and assist specialization. + + - bpo-44792(48): Improve syntax errors for if expressions. Patch by + Miguel Brito + + - bpo-34013(49): 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 + + - bpo-44732(50): Rename ‘types.Union’ to ‘types.UnionType’. + + - bpo-44725(51): Expose specialization stats in python via + ‘_opcode.get_specialization_stats()’. + + - bpo-44717(52): Improve AttributeError on circular imports of + submodules. + + - bpo-44698(53): Fix undefined behaviour in complex object + exponentiation. + + - bpo-44653(54): Support *note typing: 123. types in parameter + substitution in the union type. + + - bpo-44676(55): Add ability to serialise ‘types.Union’ objects. + Patch provided by Yurii Karabas. + + - bpo-44633(56): Parameter substitution of the union type with wrong + types now raises ‘TypeError’ instead of returning ‘NotImplemented’. + + - bpo-44661(57): Update ‘property_descr_set’ to use vectorcall if + possible. Patch by Dong-hee Na. + + - bpo-44662(58): Add ‘__module__’ to ‘types.Union’. This also fixes + ‘types.Union’ issues with ‘typing.Annotated’. Patch provided by + Yurii Karabas. + + - bpo-44655(59): Include the name of the type in unset __slots__ + attribute errors. Patch by Pablo Galindo + + - bpo-44655(60): Don’t include a missing attribute with the same name + as the failing one when offering suggestions for missing + attributes. Patch by Pablo Galindo + + - bpo-44646(61): Fix the hash of the union type: it no longer depends + on the order of arguments. + + - bpo-44636(62): Collapse union of equal types. E.g. the result of + ‘int | int’ is now ‘int’. Fix comparison of the union type with + non-hashable objects. E.g. ‘int | str == {}’ no longer raises a + TypeError. + + - bpo-44611(63): On Windows, *note os.urandom(): 237.: uses + BCryptGenRandom API instead of CryptGenRandom API which is + deprecated from Microsoft Windows API. Patch by Dong-hee Na. + + - bpo-44635(64): Convert ‘None’ to ‘type(None)’ in the union type + constructor. + + - bpo-26280(65): Implement adaptive specialization for BINARY_SUBSCR + + Three specialized forms of BINARY_SUBSCR are added: + + * BINARY_SUBSCR_LIST_INT + + * BINARY_SUBSCR_TUPLE_INT + + * BINARY_SUBSCR_DICT + + - bpo-44589(66): Mapping patterns in ‘match’ statements with two or + more equal literal keys will now raise a *note SyntaxError: 2d6. at + compile-time. + + - bpo-44606(67): Fix ‘__instancecheck__’ and ‘__subclasscheck__’ for + the union type. + + - bpo-42073(68): The ‘@classmethod’ decorator can now wrap other + classmethod-like descriptors. + + - bpo-41972(69): Tuned the string-searching algorithm of fastsearch.h + to have a shorter inner loop for most cases. + + - bpo-44590(70): 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. + + - bpo-44584(71): The threading debug ( *note PYTHONTHREADDEBUG: 2e9. + 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. + + - bpo-43895(72): 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. + + - bpo-44490(73): *note typing: 123. now searches for type parameters + in ‘types.Union’ objects. ‘get_type_hints’ will also properly + resolve annotations with nested ‘types.Union’ objects. Patch + provided by Yurii Karabas. + + - bpo-43950(74): 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 PEP 657(75). + + - bpo-44562(76): Remove uses of *note PyObject_GC_Del(): 113e. in + error path when initializing *note types.GenericAlias: 3dd. + + - bpo-41486(77): 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. + + - bpo-43908(78): Heap types with the *note Py_TPFLAGS_IMMUTABLETYPE: + 353. flag can now inherit the PEP 590(79) vectorcall protocol. + Previously, this was only possible for *note static types: 354. + Patch by Erlend E. Aasland. + + - bpo-44553(80): Implement GC methods for ‘types.Union’ to break + reference cycles and prevent memory leaks. + + - bpo-44490(81): Add ‘__parameters__’ attribute and ‘__getitem__’ + operator to ‘types.Union’. Patch provided by Yurii Karabas. + + - bpo-44523(82): Remove the pass-through for *note hash(): 1bc. of + *note weakref.proxy: 6a1. objects to prevent unintended + consequences when the original referred object dies while the proxy + is part of a hashable object. Patch by Pablo Galindo. + + - bpo-44483(83): Fix a crash in ‘types.Union’ objects when creating a + union of an object with bad ‘__module__’ field. + + - bpo-44486(84): Modules will always have a dictionary, even when + created by ‘types.ModuleType.__new__()’ + + - bpo-44472(85): Fix ltrace functionality when exceptions are raised. + Patch by Pablo Galindo + + - bpo-12022(86): A *note TypeError: 19c. is now raised instead of an + *note AttributeError: 19d. in *note with: 19e. and *note async + with: 1a1. statements for objects which do not support the *note + context manager: 1a0. or *note asynchronous context manager: 1a3. + protocols correspondingly. + + - bpo-44297(87): Make sure that the line number is set when entering + a comprehension scope. Ensures that backtraces inclusing generator + expressions show the correct line number. + + - bpo-44456(88): Improve the syntax error when mixing positional and + keyword patterns. Patch by Pablo Galindo. + + - bpo-44409(89): Fix error location information for tokenizer errors + raised on initialization of the tokenizer. Patch by Pablo Galindo. + + - bpo-44396(90): Fix a possible crash in the tokenizer when raising + syntax errors for unclosed strings. Patch by Pablo Galindo. + + - bpo-44376(91): Exact integer exponentiation (like ‘i**2’ or ‘pow(i, + 2)’) with a small exponent is much faster, due to reducing overhead + in such cases. + + - bpo-44313(92): Directly imported objects and modules (through + import and from import statements) don’t generate + ‘LOAD_METHOD’/‘CALL_METHOD’ for directly accessed objects on their + namespace. They now use the regular ‘LOAD_ATTR’/‘CALL_FUNCTION’. + + - bpo-44338(93): Implement adaptive specialization for LOAD_GLOBAL + + Two specialized forms of LOAD_GLOBAL are added: + + * LOAD_GLOBAL_MODULE + + * LOAD_GLOBAL_BUILTIN + + - bpo-44368(94): Improve syntax errors for invalid “as” targets. + Patch by Pablo Galindo + + - bpo-44349(95): Fix an edge case when displaying text from files + with encoding in syntax errors. Patch by Pablo Galindo. + + - bpo-44337(96): Initial implementation of adaptive specialization of + LOAD_ATTR + + Four specialized forms of LOAD_ATTR are added: + + * LOAD_ATTR_SLOT + + * LOAD_ATTR_SPLIT_KEYS + + * LOAD_ATTR_WITH_HINT + + * LOAD_ATTR_MODULE + + - bpo-44335(97): Fix a regression when identifying incorrect + characters in syntax errors. Patch by Pablo Galindo + + - bpo-43693(98): 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. + + - bpo-44317(99): Improve tokenizer error with improved locations. + Patch by Pablo Galindo. + + - bpo-44304(100): Fix a crash in the *note sqlite3: ef. module that + happened when the garbage collector clears ‘sqlite.Statement’ + objects. Patch by Pablo Galindo + + - bpo-44305(101): Improve error message for ‘try’ blocks without + ‘except’ or ‘finally’ blocks. Patch by Pablo Galindo. + + - bpo-43413(102): Constructors of subclasses of some builtin classes + (e.g. *note tuple: 539, *note list: 1e9, *note frozenset: 1a7.) no + longer accept arbitrary keyword arguments. [reverted in 3.11a4] + Subclass of *note set: 1a6. can now define a ‘__new__()’ method + with additional keyword parameters without overriding also + ‘__init__()’. + + - bpo-43667(103): Improve Unicode support in non-UTF locales on + Oracle Solaris. This issue does not affect other Solaris systems. + + - bpo-43693(104): 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. + + - bpo-44232(105): Fix a regression in *note type(): 9c2. when a + metaclass raises an exception. The C function ‘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. + + - bpo-44201(106): 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 + + - bpo-43693(107): ‘PyCodeObject’ gained ‘co_fastlocalnames’ and + ‘co_fastlocalkinds’ as the authoritative source of fast locals + info. Marshaled code objects have changed accordingly. + + - bpo-44184(108): Fix a crash at Python exit when a deallocator + function removes the last strong reference to a heap type. Patch + by Victor Stinner. + + - bpo-44187(109): Implement quickening in the interpreter. This + offers no advantages as yet, but is an enabler of future + optimizations. See PEP 659 for full explanation. + + - bpo-44180(110): 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 + + - bpo-44168(111): Fix error message in the parser involving keyword + arguments with invalid expressions. Patch by Pablo Galindo + + - bpo-44156(112): String caches in ‘compile.c’ are now subinterpreter + compatible. + + - bpo-44143(113): Fixed a crash in the parser that manifest when + raising tokenizer errors when an existing exception was present. + Patch by Pablo Galindo. + + - bpo-44032(114): Move ‘fast’ locals and other variables from the + frame object to a per-thread datastack. + + - bpo-44114(115): Fix incorrect dictkeys_reversed and + dictitems_reversed function signatures in C code, which broke + webassembly builds. + + - bpo-44110(116): Improve ‘str.__getitem__()’ error message + + - bpo-26110(117): Add ‘CALL_METHOD_KW’ opcode to speed up method + calls with keyword arguments. Idea originated from PyPy. A side + effect is executing ‘CALL_METHOD’ is now branchless in the + evaluation loop. + + - bpo-28307(118): 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. + + - bpo-43149(119): Correct the syntax error message regarding multiple + exception types to not refer to “exception groups”. Patch by Pablo + Galindo + + - bpo-43822(120): The parser will prioritize tokenizer errors over + custom syntax errors when raising exceptions. Patch by Pablo + Galindo. + + - bpo-40222(121): “Zero cost” exception handling. + + * Uses a lookup table to determine how to handle exceptions. + + * Removes SETUP_FINALLY and POP_TOP block instructions, + eliminating the runtime overhead of try statements. + + * Reduces the size of the frame object by about 60%. + + Patch by Mark Shannon + + - bpo-43918(122): Document the signature and ‘default’ argument in + the docstring of the new ‘anext’ builtin. + + - bpo-43833(123): 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. + + - bpo-43879(124): Add native_thread_id to PyThreadState. Patch by + Gabriele N. Tornetta. + + - bpo-43693(125): 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. + + - bpo-17792(126): More accurate error messages for access of unbound + locals or free vars. + + - bpo-28146(127): Fix a confusing error message in *note + str.format(): 1fc. + + - bpo-11105(128): When compiling *note ast.AST: 30f. objects with + recursive references through *note compile(): 310, the interpreter + doesn’t crash anymore instead it raises a *note RecursionError: + 9e7. + + - bpo-39091(129): Fix crash when using passing a non-exception to a + generator’s ‘throw()’ method. Patch by Noah Oxer + + - bpo-33346(130): Asynchronous comprehensions are now allowed inside + comprehensions in asynchronous functions. Outer comprehensions + implicitly become asynchronous. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43760 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45061 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24076 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45190 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45167 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45155 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=44219 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=44219 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=44959 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45121 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=44348 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45123 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=1514420 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=41031 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=37330 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=45083 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=34561 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=45056 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45020 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=45012 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=45018 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45000 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=44963 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=44962 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=24234 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=24234 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=44954 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=44947 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=44945 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=44929 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=44914 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=44698 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=44895 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=44900 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=44889 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=44890 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=44885 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=44878 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=44878 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=44874 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=44872 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=33930 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=25782 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=44856 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=44826 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=44838 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=44821 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=44792 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=34013 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=44732 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=44725 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=44717 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=44698 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=44653 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=44676 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=44633 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=44661 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=44662 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=44655 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=44655 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=44646 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=44636 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=44611 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=44635 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=26280 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=44589 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=44606 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=42073 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=41972 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=44590 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=44584 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=43895 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=44490 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=43950 + + (75) https://peps.python.org/pep-0657/ + + (76) https://bugs.python.org/issue?@action=redirect&bpo=44562 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=41486 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=43908 + + (79) https://peps.python.org/pep-0590/ + + (80) https://bugs.python.org/issue?@action=redirect&bpo=44553 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=44490 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=44523 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=44483 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=44486 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=44472 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=12022 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=44297 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=44456 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=44409 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=44396 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=44376 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=44313 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=44338 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=44368 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=44349 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=44337 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=44335 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=43693 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=44317 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=44304 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=44305 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=43413 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=43667 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=43693 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=44232 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=44201 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=43693 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=44184 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=44187 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=44180 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=44168 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=44156 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=44143 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=44032 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=44114 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=44110 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=26110 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=28307 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=43149 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=43822 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=40222 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=43918 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=43833 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=43879 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=43693 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=17792 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=28146 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=11105 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=39091 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=33346 + + +File: python.info, Node: Library<14>, Next: Documentation<14>, Prev: Core and Builtins<15>, Up: Python 3 11 0 alpha 1 + +1.21.15.3 Library +................. + + - bpo-45371(1): Fix clang rpath issue in *note distutils: 37. The + UnixCCompiler now uses correct clang option to add a runtime + library directory (rpath) to a shared library. + + - bpo-45329(2): Fix freed memory access in ‘pyexpat.xmlparser’ when + building it with an installed expat library <= 2.2.0. + + - bpo-41710(3): On Unix, if the ‘sem_clockwait()’ function is + available in the C library (glibc 2.30 and newer), the *note + threading.Lock.acquire(): 262. method now uses the monotonic clock + (*note time.CLOCK_MONOTONIC: 263.) for the timeout, rather than + using the system clock (*note time.CLOCK_REALTIME: 264.), to not be + affected by system clock changes. Patch by Victor Stinner. + + - bpo-1596321(4): Fix the ‘threading._shutdown()’ function when the + *note threading: 10b. module was imported first from a thread + different than the main thread: no longer log an error at Python + exit. + + - bpo-45274(5): Fix a race condition in the *note Thread.join(): e94. + method of the *note threading: 10b. 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. + + - bpo-21302(6): In Unix operating systems, *note time.sleep(): 266. + now uses the ‘nanosleep()’ function, if ‘clock_nanosleep()’ is not + available but ‘nanosleep()’ is available. ‘nanosleep()’ allows to + sleep with nanosecond precision. + + - bpo-21302(7): On Windows, *note time.sleep(): 266. now uses a + waitable timer which has a resolution of 100 nanoseconds (10^-7 + seconds). Previously, it had a resolution of 1 millisecond (10^-3 + seconds). Patch by Benjamin Szőke and Victor Stinner. + + - bpo-45238(8): Fix ‘unittest.IsolatedAsyncioTestCase.debug()’: it + runs now asynchronous methods and callbacks. + + - bpo-36674(9): *note unittest.TestCase.debug(): 1291. raises now a + *note unittest.SkipTest: c86. if the class or the test method are + decorated with the skipping decorator. + + - bpo-45235(10): Fix an issue where argparse would not preserve + values in a provided namespace when using a subparser with + defaults. + + - bpo-45183(11): 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(). + + - bpo-45234(12): Fixed a regression in *note copyfile(): 6a9, *note + copy(): 6aa, *note copy2(): 6ab. raising *note FileNotFoundError: + b53. when source is a directory, which should raise *note + IsADirectoryError: d09. + + - bpo-45228(13): Fix stack buffer overflow in parsing J1939 network + address. + + - bpo-45225(14): use map function instead of genexpr in capwords. + + - bpo-42135(15): Fix typo: ‘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. + + - bpo-20524(16): Improves error messages on ‘.format()’ operation for + ‘str’, ‘float’, ‘int’, and ‘complex’. New format now shows the + problematic pattern and the object type. + + - bpo-45168(17): Change *note dis.dis(): 78a. output to omit op arg + values that cannot be resolved due to ‘co_consts’, ‘co_names’ etc + not being provided. Previously the oparg itself was repeated in + the value field, which is not useful and can be confusing. + + - bpo-21302(18): In Unix operating systems, *note time.sleep(): 266. + now uses the ‘clock_nanosleep()’ function, if available, which + allows to sleep for an interval specified with nanosecond + precision. + + - bpo-45173(19): Remove from the *note configparser: 21. module: the + ‘SafeConfigParser’ class, the ‘filename’ property of the + ‘ParsingError’ class, the ‘readfp()’ method of the ‘ConfigParser’ + class, deprecated since Python 3.2. + + Patch by Hugo van Kemenade. + + - bpo-44987(20): Pure ASCII strings are now normalized in constant + time by *note unicodedata.normalize(): 29e. Patch by Dong-hee Na. + + - bpo-35474(21): Calling *note mimetypes.guess_all_extensions(): + 1292. with ‘strict=False’ no longer affects the result of the + following call with ‘strict=True’. Also, mutating the returned + list no longer affects the global state. + + - bpo-45166(22): *note typing.get_type_hints(): 277. now works with + *note Final: 692. wrapped in *note ForwardRef: 1237. + + - bpo-45162(23): Remove many old deprecated *note unittest: 125. + features: + + * “‘fail*’” and “‘assert*’” aliases of *note TestCase: 282. + methods. + + * Broken from start *note TestCase: 282. method + ‘assertDictContainsSubset()’. + + * Ignored ‘ + TestLoader.loadTestsFromModule()’ parameter `use_load_tests'. + + * Old alias ‘_TextTestResult’ of *note TextTestResult: 125a. + + - bpo-38371(24): Remove the deprecated ‘split()’ method of + ‘_tkinter.TkappType’. Patch by Erlend E. Aasland. + + - bpo-20499(25): Improve the speed and accuracy of + statistics.pvariance(). + + - bpo-45132(26): Remove ‘__getitem__()’ methods of *note + xml.dom.pulldom.DOMEventStream: 2fe, *note + wsgiref.util.FileWrapper: 2ff. and *note fileinput.FileInput: 300, + deprecated since Python 3.9. + + Patch by Hugo van Kemenade. + + - bpo-45129(27): Due to significant security concerns, the + `reuse_address' parameter of *note + asyncio.loop.create_datagram_endpoint(): 2fb, disabled in Python + 3.9, is now entirely removed. This is because of the behavior of + the socket option ‘SO_REUSEADDR’ in UDP. + + Patch by Hugo van Kemenade. + + - bpo-45124(28): The ‘bdist_msi’ command, deprecated in Python 3.9, + is now removed. + + Use ‘bdist_wheel’ (wheel packages) instead. + + Patch by Hugo van Kemenade. + + - bpo-30856(29): *note unittest.TestResult: e1b. methods *note + addFailure(): 1293, *note addError(): 1294, *note addSkip(): 1295. + and *note addSubTest(): 1296. 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. + + - bpo-45034(30): Changes how error is formatted for ‘struct.pack’ + with ‘'H'’ and ‘'h'’ modes and too large / small numbers. Now it + shows the actual numeric limits, while previously it was showing + arithmetic expressions. + + - bpo-25894(31): *note unittest: 125. 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. + + - bpo-45081(32): Fix issue when dataclasses that inherit from + ‘typing.Protocol’ subclasses have wrong ‘__init__’. Patch provided + by Yurii Karabas. + + - bpo-45085(33): The ‘binhex’ module, deprecated in Python 3.9, is + now removed. The following *note binascii: f. functions, + deprecated in Python 3.9, are now also removed: + + * ‘a2b_hqx()’, ‘b2a_hqx()’; + + * ‘rlecode_hqx()’, ‘rledecode_hqx()’. + + The *note binascii.crc_hqx(): 2fc. function remains available. + + Patch by Victor Stinner. + + - bpo-40360(34): The *note lib2to3: a5. package is now deprecated and + may not be able to parse Python 3.10 or newer. See the PEP 617(35) + (New PEG parser for CPython). Patch by Victor Stinner. + + - bpo-45075(36): Rename ‘traceback.StackSummary.format_frame()’ to + *note traceback.StackSummary.format_frame_summary(): 268. This + method was added for 3.11 so it was not released yet. + + Updated code and docs to better distinguish frame and FrameSummary. + + - bpo-31299(37): Add option to completely drop frames from a + traceback by returning ‘None’ from a ‘format_frame()’ override. + + - bpo-41620(38): *note run(): e1a. now always return a *note + TestResult: e1b. instance. Previously it returned ‘None’ if the + test class or method was decorated with a skipping decorator. + + - bpo-45021(39): Fix a potential deadlock at shutdown of forked + children when using *note concurrent.futures: 20. module + + - bpo-43913(40): Fix bugs in cleaning up classes and modules in *note + unittest: 125.: + + * Functions registered with *note addModuleCleanup(): 69c. were + not called unless the user defines ‘tearDownModule()’ in their + test module. + + * Functions registered with *note addClassCleanup(): 69d. were + not called if ‘tearDownClass’ is set to ‘None’. + + * Buffering in *note TestResult: e1b. did not work with + functions registered with ‘addClassCleanup()’ and + ‘addModuleCleanup()’. + + * Errors in functions registered with ‘addClassCleanup()’ and + ‘addModuleCleanup()’ were not handled correctly in buffered + and debug modes. + + * Errors in ‘setUpModule()’ and functions registered with + ‘addModuleCleanup()’ were reported in wrong order. + + * And several lesser bugs. + + - bpo-45030(41): Fix integer overflow in pickling and copying the + range iterator. + + - bpo-45001(42): Made email date parsing more robust against + malformed input, namely a whitespace-only ‘Date:’ header. Patch by + Wouter Bolsterlee. + + - bpo-45010(43): Remove support of special method ‘__div__’ in *note + unittest.mock: 126. It is not used in Python 3. + + - bpo-39218(44): Improve accuracy of variance calculations by using + ‘x*x’ instead of ‘x**2’. + + - bpo-43613(45): Improve the speed of *note gzip.compress(): 63b. and + *note gzip.decompress(): ebc. by compressing and decompressing at + once in memory instead of in a streamed fashion. + + - bpo-37596(46): Ensure that *note set: 1a6. and *note frozenset: + 1a7. objects are always *note marshalled: ae. reproducibly. + + - bpo-44019(47): A new function ‘operator.call’ has been added, such + that ‘operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)’. + + - bpo-42255(48): ‘webbrowser.MacOSX’ is deprecated and will be + removed in Python 3.13. It is untested and undocumented and also + not used by webbrowser itself. Patch by Dong-hee Na. + + - bpo-44955(49): Method *note stopTestRun(): fee. is now always + called in pair with method *note startTestRun(): fed. for *note + TestResult: e1b. objects implicitly created in *note run(): e1a. + Previously it was not called for test methods and classes decorated + with a skipping decorator. + + - bpo-39039(50): tarfile.open raises *note ReadError: 1297. when a + zlib error occurs during file extraction. + + - bpo-44935(51): *note subprocess: f6. on Solaris now also uses *note + os.posix_spawn(): 6a8. for better performance. + + - bpo-44911(52): *note IsolatedAsyncioTestCase: 284. will no longer + throw an exception while cancelling leaked tasks. Patch by Bar + Harel. + + - bpo-41322(53): Added ‘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). + + - bpo-44524(54): Make exception message more useful when subclass + from typing special form alias. Patch provided by Yurii Karabas. + + - bpo-38956(55): ‘argparse.BooleanOptionalAction’’s default value is + no longer printed twice when used with *note + argparse.ArgumentDefaultsHelpFormatter: 1298. + + - bpo-44860(56): Fix the ‘posix_user’ scheme in *note sysconfig: fa. + to not depend on *note sys.platlibdir: 580. + + - bpo-44859(57): Improve error handling in *note sqlite3: ef. and + raise more accurate exceptions. + + * *note MemoryError: 127a. is now raised instead of *note + sqlite3.Warning: 1212. when memory is not enough for encoding + a statement to UTF-8 in ‘Connection.__call__()’ and + ‘Cursor.execute()’. + + * ‘UnicodEncodeError’ is now raised instead of *note + sqlite3.Warning: 1212. when the statement contains surrogate + characters in ‘Connection.__call__()’ and ‘Cursor.execute()’. + + * *note TypeError: 19c. is now raised instead of *note + ValueError: 1c8. for non-string script argument in + ‘Cursor.executescript()’. + + * *note ValueError: 1c8. is now raised for script containing the + null character instead of truncating it in + ‘Cursor.executescript()’. + + * Correctly handle exceptions raised when getting boolean value + of the result of the progress handler. + + * Add many tests covering different corner cases. + + - bpo-44581(58): Upgrade bundled pip to 21.2.3 and setuptools to + 57.4.0 + + - bpo-44849(59): Fix the *note os.set_inheritable(): b8c. function on + FreeBSD 14 for file descriptor opened with the *note O_PATH: c10. + flag: ignore the *note EBADF: 5ad. error on ‘ioctl()’, fallback on + the ‘fcntl()’ implementation. Patch by Victor Stinner. + + - bpo-44605(60): The @functools.total_ordering() decorator now works + with metaclasses. + + - bpo-44524(61): Fixed an issue wherein the ‘__name__’ and + ‘__qualname__’ attributes of subscribed specialforms could be + ‘None’. + + - bpo-44839(62): *note MemoryError: 127a. raised in user-defined + functions will now produce a ‘MemoryError’ in *note sqlite3: ef. + *note OverflowError: 4a4. will now be converted to *note DataError: + 1299. Previously *note OperationalError: 129a. was produced in + these cases. + + - bpo-44822(63): *note sqlite3: ef. user-defined functions and + aggregators returning *note strings: 1b3. with embedded NUL + characters are no longer truncated. Patch by Erlend E. Aasland. + + - bpo-44801(64): Ensure that the *note ParamSpec: 3af. variable in + Callable can only be substituted with a parameters expression (a + list of types, an ellipsis, ParamSpec or Concatenate). + + - bpo-44806(65): Non-protocol subclasses of *note typing.Protocol: + 276. ignore now the ‘__init__’ method inherited from protocol base + classes. + + - bpo-27275(66): *note collections.OrderedDict.popitem(): f94. and + ‘collections.OrderedDict.pop()’ no longer call ‘__getitem__’ and + ‘__delitem__’ methods of the OrderedDict subclasses. + + - bpo-44793(67): Fix checking the number of arguments when subscribe + a generic type with ‘ParamSpec’ parameter. + + - bpo-44784(68): In importlib.metadata tests, override warnings + behavior under expected DeprecationWarnings (importlib_metadata + 4.6.3). + + - bpo-44667(69): The *note tokenize.tokenize(): f70. doesn’t + incorrectly generate a ‘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 ‘NL’ token. Patch by Pablo + Galindo + + - bpo-44771(70): Added ‘importlib.simple’ module implementing + adapters from a low-level resources reader interface to a + ‘TraversableResources’ interface. Legacy API (‘path’, ‘contents’, + …) is now supported entirely by the ‘.files()’ API with a + compatibility shim supplied for resource loaders without that + functionality. Feature parity with ‘importlib_resources’ 5.2. + + - bpo-44752(71): ‘rcompleter’ does not call *note getattr(): 837. on + *note property: 205. objects to avoid the side-effect of evaluating + the corresponding method. + + - bpo-44747(72): Refactor usage of ‘sys._getframe’ in ‘typing’ + module. Patch provided by Yurii Karabas. + + - bpo-42378(73): Fixes the issue with log file being overwritten when + *note logging.FileHandler: 129b. is used in *note atexit: b. with + `filemode' set to ‘'w'’. Note this will cause the message in + `atexit' not being logged if the log stream is already closed due + to shutdown of logging. + + - bpo-44720(74): ‘weakref.proxy’ objects referencing non-iterators + now raise ‘TypeError’ rather than dereferencing the null + ‘tp_iternext’ slot and crashing. + + - bpo-44704(75): The implementation of ‘collections.abc.Set._hash()’ + now matches that of ‘frozenset.__hash__()’. + + - bpo-44666(76): Fixed issue in *note compileall.compile_file(): a62. + when ‘sys.stdout’ is redirected. Patch by Stefan Hölzl. + + - bpo-44688(77): *note sqlite3.Connection.create_collation(): 245. + now accepts non-ASCII collation names. Patch by Erlend E. Aasland. + + - bpo-44690(78): Adopt `binacii.a2b_base64'’s strict mode in + `base64.b64decode'. + + - bpo-42854(79): Fixed a bug in the ‘_ssl’ module that was throwing + *note OverflowError: 4a4. when using ‘_ssl._SSLSocket.write()’ and + ‘_ssl._SSLSocket.read()’ for a big value of the ‘len’ parameter. + Patch by Pablo Galindo + + - bpo-44686(80): Replace ‘unittest.mock._importer’ with + ‘pkgutil.resolve_name’. + + - bpo-44353(81): Make ‘NewType.__call__’ faster by implementing it in + C. Patch provided by Yurii Karabas. + + - bpo-44682(82): Change the *note pdb: c6. `commands' directive to + disallow setting commands for an invalid breakpoint and to display + an appropriate error. + + - bpo-44353(83): Refactor ‘typing.NewType’ from function into + callable class. Patch provided by Yurii Karabas. + + - bpo-44678(84): Added a separate error message for discontinuous + padding in `binascii.a2b_base64' strict mode. + + - bpo-44524(85): Add missing ‘__name__’ and ‘__qualname__’ attributes + to ‘typing’ module classes. Patch provided by Yurii Karabas. + + - bpo-40897(86): Give priority to using the current class constructor + in *note inspect.signature(): 301. Patch by Weipeng Hong. + + - bpo-44638(87): Add a reference to the zipp project and hint as to + how to use it. + + - bpo-44648(88): Fixed wrong error being thrown by *note + inspect.getsource(): 129c. when examining a class in the + interactive session. Instead of *note TypeError: 19c, it should be + *note OSError: 413. with appropriate error message. + + - bpo-44608(89): Fix memory leak in ‘_tkinter._flatten()’ if it is + called with a sequence or set, but not list or tuple. + + - bpo-44594(90): Fix an edge case of ‘ExitStack’ and ‘AsyncExitStack’ + exception chaining. They will now match ‘with’ block behavior when + ‘__context__’ is explicitly set to ‘None’ when the exception is in + flight. + + - bpo-42799(91): In *note fnmatch: 7c, the cache size for compiled + regex patterns (*note functools.lru_cache(): 632.) was bumped up + from 256 to 32768, affecting functions: *note fnmatch.fnmatch(): + 129d, *note fnmatch.fnmatchcase(): 129e, *note fnmatch.filter(): + 129f. + + - bpo-41928(92): Update *note shutil.copyfile(): 6a9. to raise *note + FileNotFoundError: b53. instead of confusing *note + IsADirectoryError: d09. when a path ending with a ‘os.path.sep’ + does not exist; *note shutil.copy(): 6aa. and *note shutil.copy2(): + 6ab. are also affected. + + - bpo-44569(93): Added the ‘StackSummary.format_frame()’ function in + *note traceback: 11d. This allows users to customize the way + individual lines are formatted in tracebacks without + re-implementing logic to handle recursive tracebacks. + + - bpo-44566(94): handle StopIteration subclass raised from + @contextlib.contextmanager generator + + - bpo-44558(95): Make the implementation consistency of *note + indexOf(): 519. between C and Python versions. Patch by Dong-hee + Na. + + - bpo-41249(96): Fixes ‘TypedDict’ to work with + ‘typing.get_type_hints()’ and postponed evaluation of annotations + across modules. + + - bpo-44554(97): Refactor argument processing in ‘pdb.main()’ to + simplify detection of errors in input loading and clarify behavior + around module or script invocation. + + - bpo-34798(98): Break up paragraph about *note pprint.PrettyPrinter: + c1d. construction parameters to make it easier to read. + + - bpo-44539(99): Added support for recognizing JPEG files without + JFIF or Exif markers. + + - bpo-44461(100): Fix bug with *note pdb: c6.’s handling of import + error due to a package which does not have a ‘__main__’ module + + - bpo-43625(101): Fix a bug in the detection of CSV file headers by + *note csv.Sniffer.has_header(): 12a0. and improve documentation of + same. + + - bpo-44516(102): Update vendored pip to 21.1.3 + + - bpo-42892(103): Fixed an exception thrown while parsing a malformed + multipart email by *note email.message.EmailMessage: 90c. + + - bpo-44468(104): *note typing.get_type_hints(): 277. now finds + annotations in classes and base classes with unexpected + ‘__module__’. Previously, it skipped those MRO elements. + + - bpo-44491(105): Allow clearing the *note sqlite3: ef. authorizer + callback by passing *note None: 243. to *note set_authorizer(): + 244. Patch by Erlend E. Aasland. + + - bpo-43977(106): Set the proper *note Py_TPFLAGS_MAPPING: 12a1. and + *note Py_TPFLAGS_SEQUENCE: 12a2. flags for subclasses created + before a parent has been registered as a *note + collections.abc.Mapping: 505. or *note collections.abc.Sequence: + 12a3. + + - bpo-44482(107): Fix very unlikely resource leak in *note glob: 84. + in alternate Python implementations. + + - bpo-44466(108): The *note faulthandler: 78. module now detects if a + fatal error occurs during a garbage collector collection. Patch by + Victor Stinner. + + - bpo-44471(109): A *note TypeError: 19c. is now raised instead of an + *note AttributeError: 19d. in *note + contextlib.ExitStack.enter_context(): 19f. and *note + contextlib.AsyncExitStack.enter_async_context(): 1a2. for objects + which do not support the *note context manager: 1a0. or *note + asynchronous context manager: 1a3. protocols correspondingly. + + - bpo-44404(110): *note tkinter: 10e.’s ‘after()’ method now supports + callables without the ‘__name__’ attribute. + + - bpo-41546(111): Make *note pprint: cf. (like the builtin ‘print’) + not attempt to write to ‘stdout’ when it is ‘None’. + + - bpo-44458(112): ‘BUFFER_BLOCK_SIZE’ is now declared static, to + avoid linking collisions when bz2, lmza or zlib are statically + linked. + + - bpo-44464(113): Remove exception for flake8 in deprecated + importlib.metadata interfaces. Sync with importlib_metadata 4.6. + + - bpo-44446(114): Take into account that ‘lineno’ might be ‘None’ in + *note traceback.FrameSummary: b12. + + - bpo-44439(115): Fix in ‘bz2.BZ2File.write()’ / + ‘lzma.LZMAFile.write()’ methods, when the input data is an object + that supports the buffer protocol, the file length may be wrong. + + - bpo-44434(116): _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. + + - bpo-42972(117): The _thread.RLock type now fully implement the GC + protocol: add a traverse function and the *note Py_TPFLAGS_HAVE_GC: + 351. flag. Patch by Victor Stinner. + + - bpo-44422(118): The *note threading.enumerate(): 12a4. function now + uses a reentrant lock to prevent a hang on reentrant call. Patch + by Victor Stinner. + + - bpo-38291(119): Importing typing.io or typing.re now prints a + ‘DeprecationWarning’. + + - bpo-37880(120): argparse actions store_const and append_const each + receive a default value of None when the ‘const’ kwarg is not + provided. Previously, this raised a *note TypeError: 19c. + + - bpo-44389(121): Fix deprecation of *note ssl.OP_NO_TLSv1_3: 486. + + - bpo-27827(122): ‘pathlib.PureWindowsPath.is_reserved()’ now + identifies a greater range of reserved filenames, including those + with trailing spaces or colons. + + - bpo-44395(123): Fix ‘as_string()’ to pass unixfrom properly. Patch + by Dong-hee Na. + + - bpo-34266(124): Handle exceptions from parsing the arg of *note + pdb: c6.’s run/restart command. + + - bpo-44362(125): Improve *note ssl: f0. module’s deprecation + messages, error reporting, and documentation for deprecations. + + - bpo-44342(126): [Enum] Change pickling from by-value to by-name. + + - bpo-44356(127): [Enum] Allow multiple data-type mixins if they are + all the same. + + - bpo-44351(128): Restore back ‘parse_makefile()’ in *note + distutils.sysconfig: 5e. because it behaves differently than the + similar implementation in *note sysconfig: fa. + + - bpo-35800(129): ‘smtpd.MailmanProxy’ is now removed as it is + unusable without an external module, ‘mailman’. Patch by Dong-hee + Na. + + - bpo-44357(130): Added a function that returns cube root of the + given number *note math.cbrt(): 232. + + - bpo-44339(131): Change ‘math.pow(±0.0, -math.inf)’ to return ‘inf’ + instead of raising ‘ValueError’. This brings the special-case + handling of ‘math.pow’ into compliance with the IEEE 754 standard. + + - bpo-44242(132): Remove missing flag check from Enum creation and + move into a ‘verify’ decorator. + + - bpo-44246(133): In ‘importlib.metadata’, restore compatibility in + the result from ‘Distribution.entry_points’ (‘EntryPoints’) to + honor expectations in older implementations and issuing deprecation + warnings for these cases: A. ‘EntryPoints’ objects are once again + mutable, allowing for ‘sort()’ and other list-based mutation + operations. Avoid deprecation warnings by casting to a mutable + sequence (e.g. ‘list(dist.entry_points).sort()’). B. + ‘EntryPoints’ results once again allow for access by index. To + avoid deprecation warnings, cast the result to a Sequence first + (e.g. ‘tuple(dist.entry_points)[0]’). + + - bpo-44246(134): 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. + + - bpo-43858(135): Added a function that returns a copy of a dict of + logging levels: *note logging.getLevelNamesMapping(): 22c. + + - bpo-44260(136): The *note random.Random: 12a5. constructor no + longer reads system entropy without need. + + - bpo-44254(137): On Mac, give turtledemo button text a color that + works on both light or dark background. Programmers cannot control + the latter. + + - bpo-44258(138): Support PEP 515 for Fraction’s initialization from + string. + + - bpo-44235(139): Remove deprecated functions in the *note gettext: + 83. Patch by Dong-hee Na. + + - bpo-38693(140): Prefer f-strings to ‘.format’ in + importlib.resources. + + - bpo-33693(141): Importlib.metadata now prefers f-strings to + .format. + + - bpo-44241(142): Incorporate minor tweaks from importlib_metadata + 4.1: SimplePath protocol, support for Metadata 2.2. + + - bpo-43216(143): Remove the ‘@asyncio.coroutine’ *note decorator: + 2f8. enabling legacy generator-based coroutines to be compatible + with async/await code; remove ‘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. + + - bpo-44210(144): Make importlib.metadata._meta.PackageMetadata + public. + + - bpo-43643(145): Declare readers.MultiplexedPath.name as a property + per the spec. + + - bpo-27334(146): The *note sqlite3: ef. context manager now performs + a rollback (thus releasing the database lock) if commit failed. + Patch by Luca Citi and Erlend E. Aasland. + + - bpo-4928(147): Documented existing behavior on POSIX: + NamedTemporaryFiles are not deleted when creating process is killed + with SIGKILL + + - bpo-44154(148): Optimize *note fractions.Fraction: 210. pickling + for large components. + + - bpo-33433(149): For IPv4 mapped IPv6 addresses ( RFC 4291(150) + Section 2.5.5.2), the *note ipaddress.IPv6Address.is_private: 12a6. + check is deferred to the mapped IPv4 address. This solves a bug + where public mapped IPv4 addresses were considered private by the + IPv6 check. + + - bpo-44150(151): Add optional `weights' argument to + statistics.fmean(). + + - bpo-44142(152): *note ast.unparse(): 523. will now drop the + redundant parentheses when tuples used as assignment targets (e.g + in for loops). + + - bpo-44145(153): *note hmac: 8a. computations were not releasing the + GIL while calling the OpenSSL ‘HMAC_Update’ C API (a new feature in + 3.9). This unintentionally prevented parallel computation as other + *note hashlib: 88. algorithms support. + + - bpo-44095(154): *note zipfile.Path: 291. now supports *note + zipfile.Path.stem: 28e, *note zipfile.Path.suffixes: 290, and *note + zipfile.Path.suffix: 28f. attributes. + + - bpo-44077(155): 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 ‘socket.IP_RECVTOS’. + + - bpo-37788(156): Fix a reference leak when a Thread object is never + joined. + + - bpo-38908(157): Subclasses of ‘typing.Protocol’ which only have + data variables declared will now raise a ‘TypeError’ when checked + with ‘isinstance’ unless they are decorated with + ‘runtime_checkable()’. Previously, these checks passed silently. + Patch provided by Yurii Karabas. + + - bpo-44098(158): ‘typing.ParamSpec’ will no longer be found in the + ‘__parameters__’ of most *note typing: 123. generics except in + valid use locations specified by PEP 612(159). This prevents + incorrect usage like ‘typing.List[P][int]’. This change means + incorrect usage which may have passed silently in 3.10 beta 1 and + earlier will now error. + + - bpo-44089(160): Allow subclassing ‘csv.Error’ in 3.10 (it was + allowed in 3.9 and earlier but was disallowed in early versions of + 3.10). + + - bpo-44081(161): *note ast.unparse(): 523. now doesn’t use redundant + spaces to separate ‘lambda’ and the ‘:’ if there are no parameters. + + - bpo-44061(162): Fix regression in previous release when calling + *note pkgutil.iter_modules(): 9c5. with a list of *note + pathlib.Path: 65f. objects + + - bpo-44059(163): Register the SerenityOS Browser in the *note + webbrowser: 133. module. + + - bpo-36515(164): The *note hashlib: 88. module no longer does + unaligned memory accesses when compiled for ARM platforms. + + - bpo-40465(165): Remove random module features deprecated in Python + 3.9. + + - bpo-44018(166): random.seed() no longer mutates bytearray inputs. + + - bpo-38352(167): Add ‘IO’, ‘BinaryIO’, ‘TextIO’, ‘Match’, and + ‘Pattern’ to ‘typing.__all__’. Patch by Jelle Zijlstra. + + - bpo-44002(168): *note urllib.parse: 129. now uses + ‘functool.lru_cache()’ for its internal URL splitting and quoting + caches instead of rolling its own like its the ’90s. + + The undocumented internal *note urllib.parse: 129. ‘Quoted’ class + API is now deprecated, for removal in 3.14. + + - bpo-43972(169): When *note http.server.SimpleHTTPRequestHandler: + 799. sends a ‘301 (Moved Permanently)’ for a directory path not + ending with ‘/’, add a ‘Content-Length: 0’ header. This improves + the behavior for certain clients. + + - bpo-28528(170): Fix a bug in *note pdb: c6. where ‘checkline()’ + raises *note AttributeError: 19d. if it is called after ‘reset()’. + + - bpo-43853(171): Improved string handling for *note sqlite3: ef. + user-defined functions and aggregates: + + * It is now possible to pass strings with embedded null + characters to UDFs + + * Conversion failures now correctly raise *note MemoryError: + 127a. + + Patch by Erlend E. Aasland. + + - bpo-43666(172): AIX: ‘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. + + - bpo-43650(173): Fix *note MemoryError: 127a. in *note + shutil.unpack_archive(): ec9. which fails inside + ‘shutil._unpack_zipfile()’ on large files. Patch by Igor + Bolshakov. + + - bpo-43612(174): *note zlib.compress(): 97d. 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 ‘zlib.compressobj’. It also provides a + faster alternative to ‘gzip.compress’ when wbits=31 is used. + + - bpo-43392(175): ‘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 *note importlib.import_module(): e4d. and *note + importlib.__import__(): d1c. + + - bpo-43318(176): Fix a bug where *note pdb: c6. does not always echo + cleared breakpoints. + + - bpo-43234(177): Prohibit passing non-*note + concurrent.futures.ThreadPoolExecutor: 311. executors to + ‘loop.set_default_executor()’ following a deprecation in Python + 3.8. Patch by Illia Volochii. + + - bpo-43232(178): Prohibit previously deprecated potentially + disruptive operations on ‘asyncio.trsock.TransportSocket’. Patch + by Illia Volochii. + + - bpo-30077(179): Added support for Apple’s aifc/sowt + pseudo-compression + + - bpo-42971(180): Add definition of ‘errno.EQFULL’ for platforms that + define this constant (such as macOS). + + - bpo-43086(181): Added a new optional ‘strict_mode’ parameter to + `binascii.a2b_base64'. When ‘scrict_mode’ is set to ‘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. + + - bpo-43024(182): Improve the help signature of *note + traceback.print_exception(): 446, *note + traceback.format_exception(): 444. and *note + traceback.format_exception_only(): 445. + + - bpo-33809(183): Add the *note traceback.TracebackException.print(): + 269. method which prints the formatted exception information. + + - bpo-42862(184): *note sqlite3: ef. now utilizes *note + functools.lru_cache(): 632. 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. + + - bpo-41818(185): Soumendra Ganguly: add termios.tcgetwinsize(), + termios.tcsetwinsize(). + + - bpo-40497(186): *note subprocess.check_output(): c60. now raises + *note ValueError: 1c8. when the invalid keyword argument `check' is + passed by user code. Previously such use would fail later with a + *note TypeError: 19c. Patch by Rémi Lapeyre. + + - bpo-37449(187): ‘ensurepip’ now uses ‘importlib.resources.files()’ + traversable APIs + + - bpo-40956(188): Use Argument Clinic in *note sqlite3: ef. Patches + by Erlend E. Aasland. + + - bpo-41730(189): ‘DeprecationWarning’ is now raised when importing + *note tkinter.tix: 117, which has been deprecated in documentation + since Python 3.6. + + - bpo-20684(190): Remove unused ‘_signature_get_bound_param’ function + from *note inspect: 9e. - by Anthony Sottile. + + - bpo-41402(191): Fix *note email.message.EmailMessage.set_content(): + 12a7. when called with binary data and ‘7bit’ content transfer + encoding. + + - bpo-32695(192): The `compresslevel' and `preset' keyword arguments + of *note tarfile.open(): b02. are now both documented and tested. + + - bpo-41137(193): Use utf-8 encoding while reading .pdbrc files. + Patch by Srinivas Reddy Thatiparthy + + - bpo-24391(194): Improved reprs of *note threading: 10b. + synchronization objects: *note Semaphore: e08, *note + BoundedSemaphore: e09, *note Event: e0a. and *note Barrier: e93. + + - bpo-5846(195): Deprecated the following *note unittest: 125. + functions, scheduled for removal in Python 3.13: + + * ‘findTestCases()’ + + * ‘makeSuite()’ + + * ‘getTestCaseNames()’ + + Use *note TestLoader: 2d7. methods instead: + + * *note unittest.TestLoader.loadTestsFromModule(): 2d8. + + * *note unittest.TestLoader.loadTestsFromTestCase(): 2d9. + + * *note unittest.TestLoader.getTestCaseNames(): 2da. + + Patch by Erlend E. Aasland. + + - bpo-40563(196): Support pathlike objects on dbm/shelve. Patch by + Hakan Çelik and Henry-Joseph Audéoud. + + - bpo-34990(197): Fixed a Y2k38 bug in the compileall module where it + would fail to compile files with a modification time after the year + 2038. + + - bpo-39549(198): 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. + + - bpo-37022(199): *note pdb: c6. now displays exceptions from + ‘repr()’ with its ‘p’ and ‘pp’ commands. + + - bpo-38840(200): Fix ‘test___all__’ on platforms lacking a shared + memory implementation. + + - bpo-39359(201): Add one missing check that the password is a bytes + object for an encrypted zipfile. + + - bpo-38741(202): *note configparser: 21.: using ‘]’ inside a section + header will no longer cut the section name short at the ‘]’ + + - bpo-38415(203): Added missing behavior to *note + contextlib.asynccontextmanager(): 77f. to match *note + contextlib.contextmanager(): eb1. so decorated functions can + themselves be decorators. + + - bpo-30256(204): Pass multiprocessing BaseProxy argument + ‘manager_owned’ through AutoProxy. + + - bpo-27513(205): *note email.utils.getaddresses(): 12a8. now accepts + *note email.header.Header: 12a9. objects along with string values. + Patch by Zackery Spytz. + + - bpo-16379(206): Add SQLite error code and name to *note sqlite3: + ef. exceptions. Patch by Aviv Palivoda, Daniel Shahaf, and Erlend + E. Aasland. + + - bpo-26228(207): pty.spawn no longer hangs on FreeBSD, macOS, and + Solaris. + + - bpo-33349(208): lib2to3 now recognizes async generators everywhere. + + - bpo-29298(209): Fix ‘TypeError’ when required subparsers without + ‘dest’ do not receive arguments. Patch by Anthony Sottile. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45371 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45329 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41710 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1596321 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45274 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21302 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=21302 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45238 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36674 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=45235 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45183 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=45234 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=45228 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=45225 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=42135 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=20524 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=45168 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=21302 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=45173 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=44987 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=35474 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=45166 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=45162 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=38371 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=20499 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=45132 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=45129 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=45124 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30856 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=45034 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=25894 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=45081 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=45085 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=40360 + + (35) https://peps.python.org/pep-0617/ + + (36) https://bugs.python.org/issue?@action=redirect&bpo=45075 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=31299 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=41620 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=45021 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=43913 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=45030 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=45001 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=45010 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=39218 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=43613 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=37596 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=44019 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=42255 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=44955 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=39039 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=44935 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=44911 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=41322 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=44524 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=38956 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=44860 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=44859 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=44581 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=44849 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=44605 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=44524 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=44839 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=44822 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=44801 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=44806 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=27275 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=44793 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=44784 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=44667 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=44771 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=44752 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=44747 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=42378 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=44720 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=44704 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=44666 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=44688 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=44690 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=42854 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=44686 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=44353 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=44682 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=44353 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=44678 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=44524 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=40897 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=44638 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=44648 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=44608 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=44594 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=42799 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=41928 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=44569 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=44566 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=44558 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=41249 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=44554 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=34798 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=44539 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=44461 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=43625 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=44516 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=42892 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=44468 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=44491 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=43977 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=44482 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=44466 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=44471 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=44404 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=41546 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=44458 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=44464 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=44446 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=44439 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=44434 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=42972 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=44422 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=38291 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=37880 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=44389 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=27827 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=44395 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=34266 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=44362 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=44342 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=44356 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=44351 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=35800 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=44357 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=44339 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=44242 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=44246 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=44246 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=43858 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=44260 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=44254 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=44258 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=44235 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=38693 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=33693 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=44241 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=43216 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=44210 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=43643 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=27334 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=4928 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=44154 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=33433 + + (150) https://datatracker.ietf.org/doc/html/rfc4291.html + + (151) https://bugs.python.org/issue?@action=redirect&bpo=44150 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=44142 + + (153) https://bugs.python.org/issue?@action=redirect&bpo=44145 + + (154) https://bugs.python.org/issue?@action=redirect&bpo=44095 + + (155) https://bugs.python.org/issue?@action=redirect&bpo=44077 + + (156) https://bugs.python.org/issue?@action=redirect&bpo=37788 + + (157) https://bugs.python.org/issue?@action=redirect&bpo=38908 + + (158) https://bugs.python.org/issue?@action=redirect&bpo=44098 + + (159) https://peps.python.org/pep-0612/ + + (160) https://bugs.python.org/issue?@action=redirect&bpo=44089 + + (161) https://bugs.python.org/issue?@action=redirect&bpo=44081 + + (162) https://bugs.python.org/issue?@action=redirect&bpo=44061 + + (163) https://bugs.python.org/issue?@action=redirect&bpo=44059 + + (164) https://bugs.python.org/issue?@action=redirect&bpo=36515 + + (165) https://bugs.python.org/issue?@action=redirect&bpo=40465 + + (166) https://bugs.python.org/issue?@action=redirect&bpo=44018 + + (167) https://bugs.python.org/issue?@action=redirect&bpo=38352 + + (168) https://bugs.python.org/issue?@action=redirect&bpo=44002 + + (169) https://bugs.python.org/issue?@action=redirect&bpo=43972 + + (170) https://bugs.python.org/issue?@action=redirect&bpo=28528 + + (171) https://bugs.python.org/issue?@action=redirect&bpo=43853 + + (172) https://bugs.python.org/issue?@action=redirect&bpo=43666 + + (173) https://bugs.python.org/issue?@action=redirect&bpo=43650 + + (174) https://bugs.python.org/issue?@action=redirect&bpo=43612 + + (175) https://bugs.python.org/issue?@action=redirect&bpo=43392 + + (176) https://bugs.python.org/issue?@action=redirect&bpo=43318 + + (177) https://bugs.python.org/issue?@action=redirect&bpo=43234 + + (178) https://bugs.python.org/issue?@action=redirect&bpo=43232 + + (179) https://bugs.python.org/issue?@action=redirect&bpo=30077 + + (180) https://bugs.python.org/issue?@action=redirect&bpo=42971 + + (181) https://bugs.python.org/issue?@action=redirect&bpo=43086 + + (182) https://bugs.python.org/issue?@action=redirect&bpo=43024 + + (183) https://bugs.python.org/issue?@action=redirect&bpo=33809 + + (184) https://bugs.python.org/issue?@action=redirect&bpo=42862 + + (185) https://bugs.python.org/issue?@action=redirect&bpo=41818 + + (186) https://bugs.python.org/issue?@action=redirect&bpo=40497 + + (187) https://bugs.python.org/issue?@action=redirect&bpo=37449 + + (188) https://bugs.python.org/issue?@action=redirect&bpo=40956 + + (189) https://bugs.python.org/issue?@action=redirect&bpo=41730 + + (190) https://bugs.python.org/issue?@action=redirect&bpo=20684 + + (191) https://bugs.python.org/issue?@action=redirect&bpo=41402 + + (192) https://bugs.python.org/issue?@action=redirect&bpo=32695 + + (193) https://bugs.python.org/issue?@action=redirect&bpo=41137 + + (194) https://bugs.python.org/issue?@action=redirect&bpo=24391 + + (195) https://bugs.python.org/issue?@action=redirect&bpo=5846 + + (196) https://bugs.python.org/issue?@action=redirect&bpo=40563 + + (197) https://bugs.python.org/issue?@action=redirect&bpo=34990 + + (198) https://bugs.python.org/issue?@action=redirect&bpo=39549 + + (199) https://bugs.python.org/issue?@action=redirect&bpo=37022 + + (200) https://bugs.python.org/issue?@action=redirect&bpo=38840 + + (201) https://bugs.python.org/issue?@action=redirect&bpo=39359 + + (202) https://bugs.python.org/issue?@action=redirect&bpo=38741 + + (203) https://bugs.python.org/issue?@action=redirect&bpo=38415 + + (204) https://bugs.python.org/issue?@action=redirect&bpo=30256 + + (205) https://bugs.python.org/issue?@action=redirect&bpo=27513 + + (206) https://bugs.python.org/issue?@action=redirect&bpo=16379 + + (207) https://bugs.python.org/issue?@action=redirect&bpo=26228 + + (208) https://bugs.python.org/issue?@action=redirect&bpo=33349 + + (209) https://bugs.python.org/issue?@action=redirect&bpo=29298 + + +File: python.info, Node: Documentation<14>, Next: Tests<14>, Prev: Library<14>, Up: Python 3 11 0 alpha 1 + +1.21.15.4 Documentation +....................... + + - bpo-45216(1): Remove extra documentation listing methods in + ‘difflib’. It was rendering twice in pydoc and was outdated in + some places. + + - bpo-45024(2): *note collections.abc: 1d. 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 *note special + method: 12ab.s. Patch by Raymond Hettinger. + + - bpo-44957(3): Promote PEP 604 union syntax by using it where + possible. Also, mention ‘X | Y’ more prominently in section about + ‘Union’ and mention ‘X | None’ at all in section about ‘Optional’. + + - bpo-16580(4): Added code equivalents for the *note int.to_bytes(): + 128c. and *note int.from_bytes(): 1244. methods, as well as tests + ensuring that these code equivalents are valid. + + - bpo-44903(5): Removed the 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’. + + - bpo-33479(6): Tkinter documentation has been greatly expanded with + new “Architecture” and “Threading model” sections. + + - bpo-36700(7): *note base64: d. RFC references were updated to point + to RFC 4648(8); a section was added to point users to the new + “security considerations” section of the RFC. + + - bpo-44740(9): Replaced occurrences of uppercase “Web” and + “Internet” with lowercase versions per the 2016 revised Associated + Press Style Book. + + - bpo-44693(10): Update the definition of __future__ in the glossary + by replacing the confusing word “pseudo-module” with a more + accurate description. + + - bpo-35183(11): Add typical examples to os.path.splitext docs + + - bpo-30511(12): Clarify that *note shutil.make_archive(): 676. is + not thread-safe due to reliance on changing the current working + directory. + + - bpo-44561(13): 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”. + + - bpo-44651(14): Delete entry “coercion” in Doc/glossary.rst for its + outdated definition. + + - bpo-42958(15): Updated the docstring and docs of *note + filecmp.cmp(): 12ac. to be more accurate and less confusing + especially in respect to `shallow' arg. + + - bpo-44631(16): Refactored the ‘repr()’ code of the ‘_Environ’ (os + module). + + - bpo-44613(17): importlib.metadata is no longer provisional. + + - bpo-44558(18): Match the docstring and python implementation of + *note countOf(): 51a. to the behavior of its c implementation. + + - bpo-44544(19): List all kwargs for *note textwrap.wrap(): 12ad, + *note textwrap.fill(): 12ae, and *note textwrap.shorten(): c72. + Now, there are nav links to attributes of ‘TextWrap’, which makes + navigation much easier while minimizing duplication in the + documentation. + + - bpo-38062(20): Clarify that atexit uses equality comparisons + internally. + + - bpo-40620(21): Convert examples in tutorial controlflow.rst section + 4.3 to be interpreter-demo style. + + - bpo-43066(22): Added a warning to *note zipfile: 14d. docs: + filename arg with a leading slash may cause archive to be + un-openable on Windows systems. + + - bpo-39452(23): Rewrote ‘Doc/library/__main__.rst’. Broadened scope + of the document to explicitly discuss and differentiate between + ‘__main__.py’ in packages versus the ‘__name__ == '__main__'’ + expression (and the idioms that surround it). + + - bpo-13814(24): In the Design FAQ, answer “Why don’t generators + support the with statement?” + + - bpo-27752(25): Documentation of csv.Dialect is more descriptive. + + - bpo-44453(26): Fix documentation for the return type of *note + sysconfig.get_path(): fc8. + + - bpo-44392(27): Added a new section in the C API documentation for + types used in type hinting. Documented ‘Py_GenericAlias’ and + ‘Py_GenericAliasType’. + + - bpo-38291(28): Mark ‘typing.io’ and ‘typing.re’ as deprecated since + Python 3.8 in the documentation. They were never properly + supported by type checkers. + + - bpo-44322(29): Document that SyntaxError args have a details tuple + and that details are adjusted for errors in f-string field + replacement expressions. + + - bpo-42392(30): Document the deprecation and removal of the ‘loop’ + parameter for many functions and classes in *note asyncio: 9. + + - bpo-44195(31): Corrected references to ‘TraversableResources’ in + docs. There is no ‘TraversableReader’. + + - bpo-41963(32): Document that ‘ConfigParser’ strips off comments + when reading configuration files. + + - bpo-44072(33): Correct where in the numeric ABC hierarchy ‘**’ + support is added, i.e., in numbers.Complex, not numbers.Integral. + + - bpo-43558(34): Add the remark to *note dataclasses: 2e. + documentation that the ‘__init__()’ of any base class has to be + called in ‘__post_init__()’, along with a code example. + + - bpo-44025(35): Clarify when ‘_’ in match statements is a keyword, + and when not. + + - bpo-41706(36): Fix docs about how methods like ‘__add__’ are + invoked when evaluating operator expressions. + + - bpo-41621(37): Document that *note collections.defaultdict: e71. + parameter ‘default_factory’ defaults to None and is + positional-only. + + - bpo-41576(38): document BaseException in favor of bare except + + - bpo-21760(39): The description for __file__ fixed. Patch by Furkan + Onder + + - bpo-39498(40): Add a “Security Considerations” index which links to + standard library modules that have explicitly documented security + considerations. + + - bpo-33479(41): 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, + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45216 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45024 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44957 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=16580 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=44903 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33479 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36700 + + (8) https://datatracker.ietf.org/doc/html/rfc4648.html + + (9) https://bugs.python.org/issue?@action=redirect&bpo=44740 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=44693 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35183 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=30511 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=44561 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=44651 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=42958 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=44631 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=44613 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=44558 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=44544 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=38062 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=40620 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=43066 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=39452 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=13814 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=27752 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=44453 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=44392 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=38291 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=44322 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=42392 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=44195 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=41963 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=44072 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=43558 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=44025 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=41706 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=41621 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=41576 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=21760 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=39498 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=33479 + + +File: python.info, Node: Tests<14>, Next: Build<15>, Prev: Documentation<14>, Up: Python 3 11 0 alpha 1 + +1.21.15.5 Tests +............... + + - bpo-40173(1): Fix *note + test.support.import_helper.import_fresh_module(): 12b0. + + - bpo-45280(2): Add a test case for empty *note typing.NamedTuple: + 271. + + - bpo-45269(3): Cover case when invalid ‘markers’ type is supplied to + ‘c_make_encoder’. + + - bpo-45128(4): Fix ‘test_multiprocessing_fork’ failure due to + ‘test_logging’ and ‘sys.modules’ manipulation. + + - bpo-45209(5): Fix ‘UserWarning: resource_tracker’ warning in + ‘_test_multiprocessing._TestSharedMemory.test_shared_memory_cleaned_after_process_termination’ + + - bpo-45185(6): Enables ‘TestEnumerations’ test cases in ‘test_ssl’ + suite. + + - bpo-45195(7): 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. + + - bpo-45156(8): Fixes infinite loop on *note unittest.mock.seal(): + 803. of mocks created by ‘create_autospec()’. + + - bpo-45125(9): Improves pickling tests and docs of ‘SharedMemory’ + and ‘SharableList’ objects. + + - bpo-44860(10): Update ‘test_sysconfig.test_user_similar()’ for the + posix_user scheme: ‘platlib’ doesn’t use *note sys.platlibdir: 580. + Patch by Victor Stinner. + + - bpo-45052(11): + ‘WithProcessesTestSharedMemory.test_shared_memory_basics’ test was + ignored, because ‘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 ‘size’ of ‘SharedMemory’ is not ever guaranteed to be the + same. It is decided by the platform. + + - bpo-44895(12): 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. + + - bpo-45042(13): Fixes that test classes decorated with + ‘@hashlib_helper.requires_hashdigest’ were skipped all the time. + + - bpo-25130(14): Add calls of *note gc.collect(): 687. in tests to + support PyPy. + + - bpo-45011(15): Made tests relying on the ‘_asyncio’ C extension + module optional to allow running on alternative Python + implementations. Patch by Serhiy Storchaka. + + - bpo-44949(16): 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. + + - bpo-44891(17): Tests were added to clarify *note id(): 1086. is + preserved when ‘obj * 1’ is used on *note str: 1b3. and *note + bytes: 1b4. objects. Patch by Nikita Sobolev. + + - bpo-44852(18): Add ability to wholesale silence DeprecationWarnings + while running the regression test suite. + + - bpo-40928(19): Notify users running test_decimal regression tests + on macOS of potential harmless “malloc can’t allocate region” + messages spewed by test_decimal. + + - bpo-44734(20): Fixed floating point precision issue in turtle + tests. + + - bpo-44708(21): Regression tests, when run with -w, are now + re-running only the affected test methods instead of re-running the + entire test file. + + - bpo-42095(22): Added interop tests for Apple plists: generate plist + files with Python plistlib and parse with Apple plutil; and the + other way round. + + - bpo-44647(23): 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. + + - bpo-44515(24): Adjust recently added contextlib tests to avoid + assuming the use of a refcounted GC + + - bpo-44287(25): Fix asyncio test_popen() of test_windows_utils by + using a longer timeout. Use military grade battle-tested *note + test.support.SHORT_TIMEOUT: 12b1. 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. + + - bpo-44451(26): Reset ‘DeprecationWarning’ filters in + ‘test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index’ + to avoid ‘StopIteration’ error if ‘DeprecationWarnings’ are + ignored. + + - bpo-44363(27): Account for address sanitizer in test_capi. + test_capi now passes when run GCC address sanitizer. + + - bpo-44364(28): Add non integral tests for *note math.sqrt(): 64c. + function. + + - bpo-43921(29): Fix test_ssl.test_wrong_cert_tls13(): use + ‘suppress_ragged_eofs=False’, since ‘read()’ can raise *note + ssl.SSLEOFError: 12b2. on Windows. Patch by Victor Stinner. + + - bpo-43921(30): Fix test_pha_required_nocert() of test_ssl: catch + two more EOF cases (when the ‘recv()’ method returns an empty + string). Patch by Victor Stinner. + + - bpo-44131(31): Add test_frozenmain to test_embed to test the + ‘Py_FrozenMain()’ C function. Patch by Victor Stinner. + + - bpo-31904(32): Ignore error string case in test_file_not_exists(). + + - bpo-42083(33): Add test to check that ‘PyStructSequence_NewType’ + accepts a ‘PyStructSequence_Desc’ with ‘doc’ field set to ‘NULL’. + + - bpo-35753(34): Fix crash in doctest when doctest parses modules + that include unwrappable functions by skipping those functions. + + - bpo-30256(35): Add test for nested queues when using + ‘multiprocessing’ shared objects ‘AutoProxy[Queue]’ inside + ‘ListProxy’ and ‘DictProxy’ + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40173 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45280 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45269 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45128 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45209 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45185 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=45195 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=45156 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=45125 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=44860 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=45052 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=44895 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=45042 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=25130 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=45011 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=44949 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=44891 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=44852 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=40928 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=44734 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=44708 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=42095 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=44647 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=44515 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=44287 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=44451 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=44363 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=44364 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=43921 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=43921 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=44131 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=42083 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=35753 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=30256 + + +File: python.info, Node: Build<15>, Next: Windows<14>, Prev: Tests<14>, Up: Python 3 11 0 alpha 1 + +1.21.15.6 Build +............... + + - bpo-45220(1): Avoid building with the Windows 11 SDK previews + automatically. This may be overridden by setting the + ‘DefaultWindowsSDKVersion’ environment variable before building. + + - bpo-45020(2): 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. + + - bpo-45188(3): 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. + + - bpo-45163(4): Fixes Haiku platform build. + + - bpo-45067(5): The ncurses function extended_color_content was + introduced in 2017 + + (‘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. + + - bpo-45019(6): 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. + + - bpo-44340(7): Add support for building with clang thin lto via + –with-lto=thin/full. Patch by Dong-hee Na and Brett Holman. + + - bpo-44535(8): Enable building using a Visual Studio 2022 install on + Windows. + + - bpo-43298(9): Improved error message when building without a + Windows SDK installed. + + - bpo-44381(10): The Windows build now accepts + ‘EnableControlFlowGuard’ set to ‘guard’ to enable CFG. + + - bpo-41282(11): Fix broken ‘make install’ that caused standard + library extension modules to be unnecessarily and incorrectly + rebuilt during the install phase of cpython. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45220 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45020 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45188 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45163 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45067 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=45019 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=44340 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=44535 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43298 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=44381 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=41282 + + +File: python.info, Node: Windows<14>, Next: macOS<8>, Prev: Build<15>, Up: Python 3 11 0 alpha 1 + +1.21.15.7 Windows +................. + + - bpo-45375(1): Fixes an assertion failure due to searching for the + standard library in unnormalised paths. + + - bpo-45022(2): Update Windows release to include libffi 3.4.2 + + - bpo-45007(3): Update to OpenSSL 1.1.1l in Windows build + + - bpo-44848(4): Upgrade Windows installer to use SQLite 3.36.0. + + - bpo-44572(5): Avoid consuming standard input in the *note platform: + cb. module + + - bpo-44582(6): Accelerate speed of *note mimetypes: b0. + initialization using a native implementation of the registry scan. + + - bpo-41299(7): Fix 16 milliseconds jitter when using timeouts in + *note threading: 10b, such as with *note threading.Lock.acquire(): + 262. or *note threading.Condition.wait(): 12b5. + + - bpo-42686(8): Build *note sqlite3: ef. with math functions enabled. + Patch by Erlend E. Aasland. + + - bpo-40263(9): This is a follow-on bug from + ‘https://bugs.python.org/issue26903’. Once that is applied we run + into an off-by-one assertion problem. The assert was not correct. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45375 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45022 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45007 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=44848 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=44572 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=44582 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41299 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42686 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40263 + + +File: python.info, Node: macOS<8>, Next: IDLE<7>, Prev: Windows<14>, Up: Python 3 11 0 alpha 1 + +1.21.15.8 macOS +............... + + - bpo-45007(1): Update macOS installer builds to use OpenSSL 1.1.1l. + + - bpo-34602(2): When building CPython on macOS with ‘./configure + --with-undefined-behavior-sanitizer --with-pydebug’, the stack size + is now quadrupled to allow for the entire test suite to pass. + + - bpo-44848(3): Update macOS installer to use SQLite 3.36.0. + + - bpo-44689(4): *note ctypes.util.find_library(): 9c4. 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, + ‘find_library’ was not able to find macOS system libraries when + running on Big Sur due to changes in how system libraries are + stored. + + - bpo-41972(5): The framework build’s user header path in sysconfig + is changed to add a ‘pythonX.Y’ component to match distutils’s + behavior. + + - bpo-43109(6): Allow –with-lto configure option to work with + Apple-supplied Xcode or Command Line Tools. + + - bpo-34932(7): Add socket.TCP_KEEPALIVE support for macOS. Patch by + Shane Harvey. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45007 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34602 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44848 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=44689 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41972 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43109 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=34932 + + +File: python.info, Node: IDLE<7>, Next: Tools/Demos<4>, Prev: macOS<8>, Up: Python 3 11 0 alpha 1 + +1.21.15.9 IDLE +.............. + + - bpo-45296(1): On Windows, change exit/quit message to suggest + Ctrl-D, which works, instead of , which does not + work in IDLE. + + - bpo-45193(2): Make completion boxes appear on Ubuntu again. + + - bpo-40128(3): 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. + + - bpo-33962(4): Move the indent space setting from the Font tab to + the new Windows tab. Patch by Mark Roseman and Terry Jan Reedy. + + - bpo-40468(5): 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. + + - bpo-41611(6): Avoid uncaught exceptions in + ‘AutoCompleteWindow.winconfig_event()’. + + - bpo-41611(7): Fix IDLE sometimes freezing upon tab-completion on + macOS. + + - bpo-44010(8): Highlight the new *note match: 400. statement’s *note + soft keywords: 3ff.: *note match: 400, *note case: 400, and *note + _: 401. However, this highlighting is not perfect and will be + incorrect in some rare cases, including some ‘_’-s in ‘case’ + patterns. + + - bpo-44026(9): Include interpreter’s typo fix suggestions in message + line for NameErrors and AttributeErrors. Patch by E. Paine. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=45296 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=45193 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40128 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33962 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40468 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41611 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41611 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=44010 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=44026 + + +File: python.info, Node: Tools/Demos<4>, Next: C API<12>, Prev: IDLE<7>, Up: Python 3 11 0 alpha 1 + +1.21.15.10 Tools/Demos +...................... + + - bpo-44786(1): Fix a warning in regular expression in the c-analyzer + script. + + - bpo-44967(2): pydoc now returns a non-zero status code when a + module cannot be found. + + - bpo-44978(3): Allow the Argument Clinic tool to handle + ‘__complex__’ special methods. + + - bpo-43425(4): 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 Dong-hee Na + + - bpo-44074(5): Make patchcheck automatically detect the correct base + branch name (previously it was hardcoded to ‘master’) + + - bpo-20291(6): Added support for variadic positional parameters in + Argument Clinic. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44786 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=44967 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44978 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43425 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=44074 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=20291 + + +File: python.info, Node: C API<12>, Prev: Tools/Demos<4>, Up: Python 3 11 0 alpha 1 + +1.21.15.11 C API +................ + + - bpo-41710(1): The PyThread_acquire_lock_timed() function now clamps + the timeout if it is too large, rather than aborting the process. + Patch by Victor Stinner. + + - bpo-44687(2): ‘BufferedReader.peek()’ no longer raises *note + ValueError: 1c8. when the entire file has already been buffered. + + - bpo-45116(3): Add the *note Py_ALWAYS_INLINE: 12ba. 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. + + - bpo-45094(4): Add the *note Py_NO_INLINE: 12bb. macro to disable + inlining on a function. Patch by Victor Stinner. + + - bpo-45061(5): Add a deallocator to the *note bool: 463. type to + detect refcount bugs in C extensions which call + ‘Py_DECREF(Py_True);’ or ‘Py_DECREF(Py_False);’ by mistake. Patch + by Victor Stinner. + + - bpo-42035(6): Add a new *note PyType_GetQualName(): 322. function + to get type’s qualified name. + + - bpo-41103(7): Reverts removal of the old buffer protocol because + they are part of stable ABI. + + - bpo-44751(8): Remove ‘crypt.h’ include from the public ‘Python.h’ + header. + + - bpo-42747(9): The ‘Py_TPFLAGS_HAVE_VERSION_TAG’ type flag now does + nothing. The ‘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. + + - bpo-44530(10): Added the ‘co_qualname’ to the ‘PyCodeObject’ + structure to propagate the qualified name from the compiler to code + objects. + + Patch by Gabriele N. Tornetta + + - bpo-44441(11): *note Py_RunMain(): 604. now resets + ‘PyImport_Inittab’ to its initial value at exit. It must be + possible to call *note PyImport_AppendInittab(): 12bc. or *note + PyImport_ExtendInittab(): 12bd. at each Python initialization. + Patch by Victor Stinner. + + - bpo-39947(12): 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: + + * _PyTrash_deposit_object() + + * _PyTrash_destroy_chain() + + * _PyTrash_thread_deposit_object() + + * _PyTrash_thread_destroy_chain() + + The trashcan C API was never usable with the limited C API, since + old trashcan macros accessed directly *note PyThreadState: 360. + members like ‘_tstate->trash_delete_nesting’, whereas the *note + PyThreadState: 360. structure is opaque in the limited C API. + + Exclude also the ‘PyTrash_UNWIND_LEVEL’ constant from the C API. + + Patch by Victor Stinner. + + - bpo-40939(13): Removed documentation for the removed ‘PyParser_*’ C + API. + + - bpo-43795(14): The list in *note Contents of Limited API: 386. now + shows the public name *note PyFrameObject: 35d. rather than + ‘_frame’. The non-existing entry ‘_node’ no longer appears in the + list. + + - bpo-44378(15): *note Py_IS_TYPE(): 11fc. no longer uses *note + Py_TYPE(): 355. to avoid a compiler warning: no longer cast ‘const + PyObject*’ to ‘PyObject*’. Patch by Victor Stinner. + + - bpo-39573(16): Convert the *note Py_TYPE(): 355. and *note + Py_SIZE(): 357. macros to static inline functions. The *note + Py_SET_TYPE(): 356. and *note Py_SET_SIZE(): 358. functions must + now be used to set an object type and size. Patch by Victor + Stinner. + + - bpo-44263(17): The *note PyType_Ready(): 350. function now raises + an error if a type is defined with the *note Py_TPFLAGS_HAVE_GC: + 351. flag set but has no traverse function (*note + PyTypeObject.tp_traverse: 352.). Patch by Victor Stinner. + + - bpo-43795(18): The undocumented function ‘Py_FrozenMain()’ is + removed from the Limited API. + + - bpo-44113(19): Deprecate the following functions to configure the + Python initialization: + + * *note PySys_AddWarnOptionUnicode(): 366. + + * *note PySys_AddWarnOption(): 367. + + * *note PySys_AddXOption(): 368. + + * ‘PySys_HasWarnOptions()’ + + * *note Py_SetPath(): 36c. + + * *note Py_SetProgramName(): 36d. + + * *note Py_SetPythonHome(): 36e. + + * *note Py_SetStandardStreamEncoding(): 36f. + + * ‘_Py_SetProgramFullPath()’ + + Use the new *note PyConfig: 370. API of the *note Python + Initialization Configuration: 371. instead ( PEP 587(20)). + + - bpo-44094(21): Remove ‘PyErr_SetFromErrnoWithUnicodeFilename()’, + ‘PyErr_SetFromWindowsErrWithUnicodeFilename()’, and + ‘PyErr_SetExcFromWindowsErrWithUnicodeFilename()’. They are not + documented and have been deprecated since Python 3.3. + + - bpo-43795(22): *note PyCodec_Unregister(): 4c0. is now properly + exported as a function in the Windows Stable ABI DLL. + + - bpo-44029(23): Remove deprecated ‘Py_UNICODE’ APIs: + ‘PyUnicode_Encode’, ‘PyUnicode_EncodeUTF7’, ‘PyUnicode_EncodeUTF8’, + ‘PyUnicode_EncodeUTF16’, ‘PyUnicode_EncodeUTF32’, + ‘PyUnicode_EncodeLatin1’, ‘PyUnicode_EncodeMBCS’, + ‘PyUnicode_EncodeDecimal’, ‘PyUnicode_EncodeRawUnicodeEscape’, + ‘PyUnicode_EncodeCharmap’, ‘PyUnicode_EncodeUnicodeEscape’, + ‘PyUnicode_TransformDecimalToASCII’, ‘PyUnicode_TranslateCharmap’, + ‘PyUnicodeEncodeError_Create’, ‘PyUnicodeTranslateError_Create’. + See PEP 393(24) and PEP 624(25) for reference. + + - bpo-42035(26): Add a new *note PyType_GetName(): 321. function to + get type’s short name. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41710 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=44687 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=45116 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=45094 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=45061 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42035 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41103 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=44751 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42747 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=44530 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=44441 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=40939 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=43795 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=44378 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=44263 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=43795 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=44113 + + (20) https://peps.python.org/pep-0587/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=44094 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=43795 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=44029 + + (24) https://peps.python.org/pep-0393/ + + (25) https://peps.python.org/pep-0624/ + + (26) https://bugs.python.org/issue?@action=redirect&bpo=42035 + + +File: python.info, Node: Python 3 10 0 beta 1, Next: Python 3 10 0 alpha 7, Prev: Python 3 11 0 alpha 1, Up: Changelog + +1.21.16 Python 3.10.0 beta 1 +---------------------------- + +`Release date: 2021-05-03' + +* Menu: + +* Security: Security<6>. +* Core and Builtins: Core and Builtins<16>. +* Library: Library<15>. +* Documentation: Documentation<15>. +* Tests: Tests<15>. +* Build: Build<16>. +* Windows: Windows<15>. +* macOS: macOS<9>. +* IDLE: IDLE<8>. +* C API: C API<13>. + + +File: python.info, Node: Security<6>, Next: Core and Builtins<16>, Up: Python 3 10 0 beta 1 + +1.21.16.1 Security +.................. + + - bpo-43434(1): Creating *note sqlite3.Connection: 24c. objects now + also produces ‘sqlite3.connect’ and ‘sqlite3.connect/handle’ *note + auditing events: 12c0. Previously these events were only produced + by *note sqlite3.connect(): 7da. calls. Patch by Erlend E. + Aasland. + + - bpo-43998(2): The *note ssl: f0. 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. *note + SSLContext: 430. defaults to minimum protocol version TLS 1.2. + Settings are based on Hynek Schlawack’s research. + + - bpo-43882(3): 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 + *note urllib.parse(): 129. now removes ASCII newlines and tabs from + URLs, preventing such attacks. + + - bpo-43472(4): Ensures interpreter-level audit hooks receive the + ‘cpython.PyInterpreterState_New’ event when called through the + ‘_xxsubinterpreters’ module. + + - bpo-43362(5): Fix invalid free in _sha3 module. The issue was + introduced in 3.10.0a1. Python 3.9 and earlier are not affected. + + - bpo-43762(6): Add audit events for ‘sqlite3.connect/handle()’, + *note sqlite3.Connection.enable_load_extension(): 434, and *note + sqlite3.Connection.load_extension(): 435. Patch by Erlend E. + Aasland. + + - bpo-43756(7): Add new audit event ‘glob.glob/2’ to incorporate the + new `root_dir' and `dir_fd' arguments added to *note glob.glob(): + 3f8. and *note glob.iglob(): 3f9. + + - bpo-36384(8): *note ipaddress: a0. 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 *note socket.inet_aton(): 5b3. treats leading + zeros as octal notation. glibc implementation of modern *note + inet_pton(): 5b4. does not accept any leading zeros. For a while + the *note ipaddress: a0. module used to accept ambiguous leading + zeros. + + - bpo-43075(9): Fix Regular Expression Denial of Service (ReDoS) + vulnerability in *note urllib.request.AbstractBasicAuthHandler: + 12c1. 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. + + - bpo-42800(10): Audit hooks are now fired for frame.f_code, + traceback.tb_frame, and generator code/frame attribute access. + + - bpo-37363(11): Add audit events to the *note http.client: 8f. + module. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43434 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43998 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43882 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43472 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43362 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43762 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43756 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36384 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43075 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42800 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37363 + + +File: python.info, Node: Core and Builtins<16>, Next: Library<15>, Prev: Security<6>, Up: Python 3 10 0 beta 1 + +1.21.16.2 Core and Builtins +........................... + + - bpo-43977(1): Prevent classes being both a sequence and a mapping + when pattern matching. + + - bpo-43977(2): Use *note tp_flags: 12c3. on the class object to + determine if the subject is a sequence or mapping when pattern + matching. Avoids the need to import *note collections.abc: 1d. + when pattern matching. + + - bpo-43892(3): Restore proper validation of complex literal value + patterns when parsing ‘match’ blocks. + + - bpo-43933(4): Set frame.f_lineno to the line number of the ‘with’ + kweyword when executing the call to ‘__exit__’. + + - bpo-43933(5): 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. + + - bpo-43963(6): Importing the ‘_signal’ module in a subinterpreter + has no longer side effects. + + - bpo-42739(7): 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 + ‘PyLineTable_InitAddressRange’. This makes the handling of line + number tables more robust in some circumstances. + + - bpo-43908(8): Make *note re: da. types immutable. Patch by Erlend + E. Aasland. + + - bpo-43908(9): Make the *note array.array: 3d2. type immutable. + Patch by Erlend E. Aasland. + + - bpo-43901(10): 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. + + - bpo-43892(11): Match patterns now use new dedicated AST nodes + (‘MatchValue’, ‘MatchSingleton’, ‘MatchSequence’, ‘MatchStar’, + ‘MatchMapping’, ‘MatchClass’) rather than reusing expression AST + nodes. ‘MatchAs’ and ‘MatchOr’ are now defined as pattern nodes + rather than as expression nodes. Patch by Nick Coghlan. + + - bpo-42725(12): Usage of ‘await’/‘yield’/‘yield from’ and named + expressions within an annotation is now forbidden when PEP 563 is + activated. + + - bpo-43754(13): When performing structural pattern matching ( PEP + 634(14)), captured names are now left unbound until the `entire' + pattern has matched successfully. + + - bpo-42737(15): Annotations for complex targets (everything beside + simple names) no longer cause any runtime effects with ‘from + __future__ import annotations’. + + - bpo-43914(16): *note SyntaxError: 2d6. exceptions raised by the + interpreter will highlight the full error range of the expression + that consistutes the syntax error itself, instead of just where the + problem is detected. Patch by Pablo Galindo. + + - bpo-38605(17): Revert making ‘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: + ‘https://mail.python.org/archives/list/python-dev@python.org/thread/CLVXXPQ2T2LQ5MP2Y53VVQFCXYWQJHKZ/’. + Patch by Pablo Galindo. + + - bpo-43475(18): 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. + + - bpo-43859(19): Improve the error message for *note + IndentationError: 393. exceptions. Patch by Pablo Galindo + + - bpo-41323(20): Constant tuple folding in bytecode optimizer now + reuses tuple in constant table. + + - bpo-43846(21): Data stack usage is much reduced for large literal + and call expressions. + + - bpo-38530(22): When printing *note NameError: 396. raised by the + interpreter, ‘PyErr_Display()’ will offer suggestions of similar + variable names in the function that the exception was raised from. + Patch by Pablo Galindo + + - bpo-43823(23): Improve syntax errors for invalid dictionary + literals. Patch by Pablo Galindo. + + - bpo-43822(24): Improve syntax errors in the parser for missing + commas between expressions. Patch by Pablo Galindo. + + - bpo-43798(25): *note ast.alias: 12c4. nodes now include source + location metadata attributes e.g. lineno, col_offset. + + - bpo-43797(26): Improve ‘SyntaxError’ error messages for invalid + comparisons. Patch by Pablo Galindo. + + - bpo-43760(27): Move the flag for checking whether tracing is + enabled to the C stack, from the heap. Should speed up dispatch in + the interpreter. + + - bpo-43682(28): Static methods (*note @staticmethod: 3c8.) and class + methods (*note @classmethod: 18d.) now inherit the method + attributes (‘__module__’, ‘__name__’, ‘__qualname__’, ‘__doc__’, + ‘__annotations__’) and have a new ‘__wrapped__’ attribute. Patch + by Victor Stinner. + + - bpo-43751(29): Fixed a bug where ‘anext(ait, default)’ would + erroneously return None. + + - bpo-42128(30): *note __match_args__: 12c5. is no longer allowed to + be a list. + + - bpo-43683(31): Add GEN_START opcode. Marks start of generator, + including async, or coroutine and handles sending values to a newly + created generator or coroutine. + + - bpo-43105(32): Importlib now resolves relative paths when creating + module spec objects from file locations. + + - bpo-43682(33): Static methods (*note @staticmethod: 3c8.) are now + callable as regular functions. Patch by Victor Stinner. + + - bpo-42609(34): Prevented crashes in the AST validator and optimizer + when compiling some absurdly long expressions like ‘"+0"*1000000’. + *note RecursionError: 9e7. is now raised instead. + + - bpo-38530(35): When printing *note AttributeError: 19d, + ‘PyErr_Display()’ will offer suggestions of similar attribute names + in the object that the exception was raised from. Patch by Pablo + Galindo + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43977 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43977 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43892 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43933 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43933 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43963 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42739 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43908 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43908 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43901 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43892 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42725 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43754 + + (14) https://peps.python.org/pep-0634/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=42737 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=43914 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=38605 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=43475 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=43859 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=41323 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=43846 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=38530 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=43823 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=43822 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=43798 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=43797 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=43760 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=43682 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=43751 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=42128 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=43683 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=43105 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=43682 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=42609 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=38530 + + +File: python.info, Node: Library<15>, Next: Documentation<15>, Prev: Core and Builtins<16>, Up: Python 3 10 0 beta 1 + +1.21.16.3 Library +................. + + - bpo-44015(1): In @dataclass(), raise a TypeError if KW_ONLY is + specified more than once. + + - bpo-25478(2): Added a `total()' method to collections.Counter() to + compute the sum of the counts. + + - bpo-43733(3): Change *note netrc.netrc: 12c7. to use UTF-8 encoding + before using locale encoding. + + - bpo-43979(4): Removed an unnecessary list comprehension before + looping from *note urllib.parse.parse_qsl(): 453. Patch by + Christoph Zwerschke and Dong-hee Na. + + - bpo-43993(5): Update bundled pip to 21.1.1. + + - bpo-43957(6): [Enum] Deprecate ‘TypeError’ when non-member is used + in a containment check; In 3.12 ‘True’ or ‘False’ will be returned + instead, and containment will return ‘True’ if the value is either + a member of that enum or one of its members’ value. + + - bpo-42904(7): For backwards compatibility with previous minor + versions of Python, if *note typing.get_type_hints(): 277. receives + no namespace dictionary arguments, *note typing.get_type_hints(): + 277. will search through the global then local namespaces during + evaluation of stringized type annotations (string forward + references) inside a class. + + - bpo-43945(8): [Enum] Deprecate non-standard mixin format() + behavior: in 3.12 the enum member, not the member’s value, will be + used for format() calls. + + - bpo-41139(9): Deprecate undocumented ‘cgi.log()’ API. + + - bpo-43937(10): Fixed the *note turtle: 120. module working with + non-default root window. + + - bpo-43930(11): Update bundled pip to 21.1 and setuptools to 56.0.0 + + - bpo-43907(12): 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. + + - bpo-43926(13): In ‘importlib.metadata’, provide a uniform interface + to ‘Description’, allow for any field to be encoded with multiline + values, remove continuation lines from multiline values, and add a + ‘.json’ property for easy access to the PEP 566 JSON-compatible + form. Sync with ‘importlib_metadata 4.0’. + + - bpo-43920(14): OpenSSL 3.0.0: *note load_verify_locations(): b7b. + now returns a consistent error message when cadata contains no + valid certificate. + + - bpo-43607(15): *note urllib: 127. can now convert Windows paths + with ‘\\?\’ prefixes into URL paths. + + - bpo-43817(16): Add *note inspect.get_annotations(): 405, 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. *note inspect.get_annotations(): 405. can also correctly + un-stringize stringized annotations. + + *note inspect.signature(): 301, ‘inspect.from_callable()’, and + ‘inspect.from_function()’ now call *note inspect.get_annotations(): + 405. to retrieve annotations. This means *note + inspect.signature(): 301. and ‘inspect.from_callable()’ can now + un-stringize stringized annotations, too. + + - bpo-43284(17): 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. + + - bpo-42854(18): The *note ssl: f0. module now uses ‘SSL_read_ex’ and + ‘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. + + - bpo-42333(19): Port ‘_ssl’ extension module to multiphase + initialization. + + - bpo-43880(20): *note ssl: f0. 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. + + - bpo-41559(21): PEP 612(22) is now implemented purely in Python; + builtin ‘types.GenericAlias’ objects no longer include + ‘typing.ParamSpec’ in ‘__parameters__’ (with the exception of + ‘collections.abc.Callable’‘s ‘GenericAlias’). This means + previously invalid uses of ‘ParamSpec’ (such as ‘list[P]’) which + worked in earlier versions of Python 3.10 alpha, will now raise + ‘TypeError’ during substitution. + + - bpo-43867(23): The *note multiprocessing: b5. ‘Server’ class now + explicitly catches *note SystemExit: 9b6. and closes the client + connection in this case. It happens when the + ‘Server.serve_client()’ method reaches the end of file (EOF). + + - bpo-40443(24): Remove unused imports: pyclbr no longer uses copy, + and typing no longer uses ast. Patch by Victor Stinner. + + - bpo-43820(25): Remove an unneeded copy of the namespace passed to + dataclasses.make_dataclass(). + + - bpo-43787(26): Add ‘__iter__()’ method to *note bz2.BZ2File: 5a5, + *note gzip.GzipFile: 590, and *note lzma.LZMAFile: caf. It makes + iterating them about 2x faster. Patch by Inada Naoki. + + - bpo-43680(27): 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(). + + - bpo-43680(28): The Python ‘_pyio.open()’ function becomes a static + method to behave as *note io.open(): 30c. 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, ‘_pyio.OpenWrapper()’ becomes a simple alias to + ‘_pyio.open()’. Patch by Victor Stinner. + + - bpo-41515(29): Fix *note KeyError: 6f5. raised in *note + typing.get_type_hints(): 277. due to synthetic modules that don’t + appear in ‘sys.modules’. + + - bpo-43776(30): When *note subprocess.Popen: 6e8. args are provided + as a string or as *note pathlib.Path: 65f, the Popen instance repr + now shows the right thing. + + - bpo-42248(31): [Enum] ensure exceptions raised in ‘_missing__’ are + released + + - bpo-43744(32): fix issue with enum member name matching the start + of a private variable name + + - bpo-43772(33): Fixed the return value of ‘TypeVar.__ror__’. Patch + by Jelle Zijlstra. + + - bpo-43764(34): Add match_args parameter to @dataclass decorator to + allow suppression of __match_args__ generation. + + - bpo-43799(35): OpenSSL 3.0.0: define ‘OPENSSL_API_COMPAT’ 1.1.1 to + suppress deprecation warnings. Python requires OpenSSL 1.1.1 APIs. + + - bpo-43478(36): 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 ‘autospec=True’ or be the subject of a + ‘create_autospec(...)’ call. This can uncover bugs in tests since + these Mock-derived Mocks will always pass certain tests (e.g. + *note isinstance(): 3ab.) and builtin assert functions (e.g. + assert_called_once_with) will unconditionally pass. + + - bpo-43794(37): Add *note ssl.OP_IGNORE_UNEXPECTED_EOF: 42b. + constants (OpenSSL 3.0.0) + + - bpo-43785(38): Improve ‘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 *note gzip: 87. and *note lzma: ab. have + always been. Patch by Inada Naoki. + + - bpo-43789(39): OpenSSL 3.0.0: Don’t call the password callback + function a second time when first call has signaled an error + condition. + + - bpo-43788(40): The header files for *note ssl: f0. error codes are + now OpenSSL version-specific. Exceptions will now show correct + reason and library codes. The ‘make_ssl_data.py’ script has been + rewritten to use OpenSSL’s text file with error codes. + + - bpo-43766(41): Implement PEP 647(42) in the *note typing: 123. + module by adding ‘TypeGuard’. + + - bpo-25264(43): *note os.path.realpath(): 412. now accepts a + `strict' keyword-only argument. When set to ‘True’, *note OSError: + 413. is raised if a path doesn’t exist or a symlink loop is + encountered. + + - bpo-43780(44): In ‘importlib.metadata’, incorporate changes from + importlib_metadata 3.10: Add mtime-based caching during + distribution discovery. Flagged use of dict result from + ‘entry_points()’ as deprecated. + + - The ‘P.args’ and ‘P.kwargs’ attributes of *note typing.ParamSpec: + 3af. are now instances of the new classes *note + typing.ParamSpecArgs: 3b2. and *note typing.ParamSpecKwargs: 3b3, + which enables a more useful ‘repr()’. Patch by Jelle Zijlstra. + + - bpo-43731(45): Add an ‘encoding’ parameter ‘logging.fileConfig()’. + + - bpo-43712(46): Add ‘encoding’ and ‘errors’ parameters to *note + fileinput.input(): 3f0. and *note fileinput.FileInput: 300. + + - bpo-38659(47): A ‘simple_enum’ decorator is added to the ‘enum’ + module to convert a normal class into an Enum. ‘test_simple_enum’ + added to test simple enums against a corresponding normal Enum. + Standard library modules updated to use ‘simple_enum’. + + - bpo-43764(48): Fix an issue where *note __match_args__: 12c5. + generation could fail for some *note dataclasses: 2e. + + - bpo-43752(49): Fix *note sqlite3: ef. regression for zero-sized + blobs with converters, where ‘b""’ was returned instead of ‘None’. + The regression was introduced by PR 24723. Patch by Erlend E. + Aasland. + + - bpo-43655(50): *note tkinter: 10e. dialog windows are now + recognized as dialogs by window managers on macOS and X Window. + + - bpo-43723(51): The following ‘threading’ methods are now deprecated + and should be replaced: + + - ‘currentThread’ => *note threading.current_thread(): 47d. + + - ‘activeCount’ => *note threading.active_count(): 47e. + + - ‘Condition.notifyAll’ => *note + threading.Condition.notify_all(): 47f. + + - ‘Event.isSet’ => *note threading.Event.is_set(): 480. + + - ‘Thread.setName’ => *note threading.Thread.name: 481. + + - ‘thread.getName’ => *note threading.Thread.name: 481. + + - ‘Thread.isDaemon’ => *note threading.Thread.daemon: 482. + + - ‘Thread.setDaemon’ => *note threading.Thread.daemon: 482. + + Patch by Jelle Zijlstra. + + - bpo-2135(52): Deprecate find_module() and find_loader() + implementations in importlib and zipimport. + + - bpo-43534(53): *note turtle.textinput(): 12c8. and *note + turtle.numinput(): 12c9. create now a transient window working on + behalf of the canvas window. + + - bpo-43532(54): Add the ability to specify keyword-only fields to + dataclasses. These fields will become keyword-only arguments to + the generated __init__. + + - bpo-43522(55): Fix problem with *note hostname_checks_common_name: + 7dd. OpenSSL does not copy hostflags from `struct SSL_CTX' to + `struct SSL'. + + - bpo-8978(56): Improve error message for *note tarfile.open(): b02. + when *note lzma: ab. / *note bz2: 12. are unavailable. Patch by + Anthony Sottile. + + - bpo-42967(57): Allow *note bytes: 1b4. ‘separator’ argument in + ‘urllib.parse.parse_qs’ and ‘urllib.parse.parse_qsl’ when parsing + *note str: 1b3. query strings. Previously, this raised a + ‘TypeError’. + + - bpo-43296(58): Improve *note sqlite3: ef. error handling: + ‘sqlite3_value_blob()’ errors that set ‘SQLITE_NOMEM’ now raise + *note MemoryError: 127a. Patch by Erlend E. Aasland. + + - bpo-43312(59): New functions *note + sysconfig.get_preferred_scheme(): 260. and *note + sysconfig.get_default_scheme(): 1210. are added to query a platform + for its preferred “user”, “home”, and “prefix” (default) scheme + names. + + - bpo-43265(60): Improve *note sqlite3.Connection.backup(): 7d9. + error handling. The error message for non-existent target database + names is now ‘unknown database ’ instead of ‘SQL + logic error’. Patch by Erlend E. Aasland. + + - bpo-41282(61): Install schemes in *note distutils.command.install: + 49. are now loaded from *note sysconfig: fa. + + - bpo-41282(62): *note distutils.sysconfig: 5e. has been merged to + *note sysconfig: fa. + + - bpo-43176(63): Fixed processing of a dataclass that inherits from a + frozen dataclass with no fields. It is now correctly detected as + an error. + + - bpo-43080(64): *note pprint: cf. now has support for *note + dataclasses.dataclass: 193. Patch by Lewis Gaul. + + - bpo-39950(65): Add *note pathlib.Path.hardlink_to(): 416. method + that supersedes ‘link_to()’. The new method has the same argument + order as ‘symlink_to()’. + + - bpo-42904(66): *note typing.get_type_hints(): 277. now checks the + local namespace of a class when evaluating PEP 563(67) annotations + inside said class. + + - bpo-42269(68): Add ‘slots’ parameter to ‘dataclasses.dataclass’ + decorator to automatically generate ‘__slots__’ for class. Patch + provided by Yurii Karabas. + + - bpo-39529(69): Deprecated use of *note asyncio.get_event_loop(): + 475. without running event loop. Emit deprecation warning for + *note asyncio: 9. functions which implicitly create a *note Future: + 477. or *note Task: 1e3. objects if there is no running event loop + and no explicit `loop' argument is passed: *note ensure_future(): + 478, *note wrap_future(): 479, *note gather(): 1d3, *note shield(): + 47a, *note as_completed(): 47b. and constructors of *note Future: + 477, *note Task: 1e3, *note StreamReader: 47c, + ‘StreamReaderProtocol’. + + - bpo-18369(70): Certificate and PrivateKey classes were added to the + ssl module. Certificates and keys can now be loaded from memory + buffer, too. + + - bpo-41486(71): Use a new output buffer management code for *note + bz2: 12. / *note lzma: ab. / *note zlib: 14f. modules, and add + ‘.readall()’ function to ‘_compression.DecompressReader’ class. + These bring some performance improvements. Patch by Ma Lin. + + - bpo-31870(72): The *note ssl.get_server_certificate(): 431. + function now has a `timeout' parameter. + + - bpo-41735(73): Fix thread locks in zlib module may go wrong in rare + case. Patch by Ma Lin. + + - bpo-36470(74): Fix dataclasses with ‘InitVar’s and *note replace(): + 12ca. Patch by Claudiu Popa. + + - bpo-40849(75): Expose X509_V_FLAG_PARTIAL_CHAIN ssl flag + + - bpo-35114(76): *note ssl.RAND_status(): 12cb. now returns a boolean + value (as documented) instead of ‘1’ or ‘0’. + + - bpo-39906(77): *note pathlib.Path.stat(): 418. and *note chmod(): + 419. now accept a `follow_symlinks' keyword-only argument for + consistency with corresponding functions in the *note os: c2. + module. + + - bpo-39899(78): *note os.path.expanduser(): 65d. now refuses to + guess Windows home directories if the basename of current user’s + home directory does not match their username. + + *note pathlib.Path.expanduser(): ac6. and *note home(): ac7. now + consistently raise *note RuntimeError: 6e9. exception when a home + directory cannot be resolved. Previously a *note KeyError: 6f5. + exception could be raised on Windows when the ‘"USERNAME"’ + environment variable was unset. + + - bpo-36076(79): Added SNI support to *note + ssl.get_server_certificate(): 431. + + - bpo-38490(80): Covariance, Pearson’s correlation, and simple linear + regression functionality was added to statistics module. Patch by + Tymoteusz Wołodźko. + + - bpo-33731(81): Provide a locale.localize() function, which converts + a normalized number string into a locale format. + + - bpo-32745(82): Fix a regression in the handling of ctypes’ *note + ctypes.c_wchar_p: 12cc. type: embedded null characters would cause + a *note ValueError: 1c8. to be raised. Patch by Zackery Spytz. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=44015 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25478 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43733 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43979 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43993 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43957 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42904 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43945 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41139 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43937 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43930 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=43907 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43926 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=43920 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=43607 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=43817 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=43284 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=42854 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=42333 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=43880 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=41559 + + (22) https://peps.python.org/pep-0612/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=43867 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=40443 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=43820 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=43787 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=43680 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=43680 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=41515 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=43776 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=42248 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=43744 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=43772 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=43764 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=43799 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=43478 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=43794 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=43785 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=43789 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=43788 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=43766 + + (42) https://peps.python.org/pep-0647/ + + (43) https://bugs.python.org/issue?@action=redirect&bpo=25264 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=43780 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=43731 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=43712 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=38659 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=43764 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=43752 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=43655 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=43723 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=2135 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=43534 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=43532 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=43522 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=8978 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=42967 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=43296 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=43312 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=43265 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=41282 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=41282 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=43176 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=43080 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=39950 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=42904 + + (67) https://peps.python.org/pep-0563/ + + (68) https://bugs.python.org/issue?@action=redirect&bpo=42269 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=39529 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=18369 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=41486 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=31870 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=41735 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=36470 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=40849 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=35114 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=39906 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=39899 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=36076 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=38490 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=33731 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=32745 + + +File: python.info, Node: Documentation<15>, Next: Tests<15>, Prev: Library<15>, Up: Python 3 10 0 beta 1 + +1.21.16.4 Documentation +....................... + + - bpo-43987(1): Add “Annotations Best Practices” document as a new + HOWTO. + + - bpo-43977(2): Document the new *note Py_TPFLAGS_MAPPING: 12a1. and + *note Py_TPFLAGS_SEQUENCE: 12a2. type flags. + + - bpo-43959(3): The documentation on the PyContextVar C-API was + clarified. + + - bpo-43938(4): Update dataclasses documentation to express that + FrozenInstanceError is derived from AttributeError. + + - bpo-43778(5): Fix the Sphinx glossary_search extension: create the + _static/ sub-directory if it doesn’t exist. + + - bpo-43755(6): Update documentation to reflect that unparenthesized + lambda expressions can no longer be the expression part in an ‘if’ + clause in comprehensions and generator expressions since Python + 3.9. + + - bpo-43739(7): Fixing the example code in + Doc/extending/extending.rst to declare and initialize the pmodule + variable to be of the right type. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43987 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43977 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43959 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43938 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43778 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43755 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43739 + + +File: python.info, Node: Tests<15>, Next: Build<16>, Prev: Documentation<15>, Up: Python 3 10 0 beta 1 + +1.21.16.5 Tests +............... + + - bpo-43961(1): Fix test_logging.test_namer_rotator_inheritance() on + Windows: use *note os.replace(): d9e. rather than *note + os.rename(): d9d. Patch by Victor Stinner. + + - bpo-43842(2): 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. + + - bpo-43843(3): ‘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 *note + threading.excepthook(): 442. Use ‘--fail-env-changed’ option to + mark the test as failed. Patch by Victor Stinner. + + - bpo-43811(4): Tests multiple OpenSSL versions on GitHub Actions. + Use ccache to speed up testing. + + - bpo-43791(5): OpenSSL 3.0.0: Disable testing of legacy protocols + TLS 1.0 and 1.1. Tests are failing with + TLSV1_ALERT_INTERNAL_ERROR. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43961 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43842 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43843 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43811 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43791 + + +File: python.info, Node: Build<16>, Next: Windows<15>, Prev: Tests<15>, Up: Python 3 10 0 beta 1 + +1.21.16.6 Build +............... + + - bpo-43567(1): Improved generated code refresh + (AST/tokens/opcodes/keywords) on Windows. + + - bpo-43669(2): Implement PEP 644(3). Python now requires OpenSSL + 1.1.1 or newer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43567 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43669 + + (3) https://peps.python.org/pep-0644/ + + +File: python.info, Node: Windows<15>, Next: macOS<9>, Prev: Build<16>, Up: Python 3 10 0 beta 1 + +1.21.16.7 Windows +................. + + - bpo-35306(1): Adds additional arguments to *note os.startfile(): + 12d1. function. + + - bpo-43538(2): Avoid raising errors from *note + pathlib.Path.exists(): 660. when passed an invalid filename. + + - bpo-38822(3): Fixed *note os.stat(): 653. failing on inaccessible + directories with a trailing slash, rather than falling back to the + parent directory’s metadata. This implicitly affected *note + os.path.exists(): 657. and *note os.path.isdir(): 659. + + - bpo-26227(4): Fixed decoding of host names in *note + socket.gethostbyaddr(): 12d2. and *note socket.gethostbyname_ex(): + 12d3. + + - bpo-40432(5): 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. + + - bpo-43745(6): Actually updates Windows release to OpenSSL 1.1.1k. + Earlier releases were mislabelled and actually included 1.1.1i + again. + + - bpo-43652(7): Update Tcl and Tk to 8.6.11 in Windows installer. + + - bpo-43492(8): Upgrade Windows installer to use SQLite 3.35.5. + + - bpo-30555(9): Fix ‘WindowsConsoleIO’ errors in the presence of fd + redirection. Patch by Segev Finer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35306 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43538 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38822 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26227 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40432 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43745 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43652 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43492 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=30555 + + +File: python.info, Node: macOS<9>, Next: IDLE<8>, Prev: Windows<15>, Up: Python 3 10 0 beta 1 + +1.21.16.8 macOS +............... + + - bpo-42119(1): Fix check for macOS SDK paths when building Python. + Narrow search to match contents of SDKs, namely only files in + ‘/System/Library’, ‘/System/IOSSupport’, and ‘/usr’ other than + ‘/usr/local’. Previously, anything under ‘/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 + ‘/System’. Paths in ‘/Library’ were also incorrectly treated as + SDK locations. + + - bpo-43568(2): Drop support for MACOSX_DEPLOYMENT_TARGET < 10.3 + + - bpo-44009(3): 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. + + - bpo-43851(4): Build SQLite with ‘SQLITE_OMIT_AUTOINIT’ on macOS. + Patch by Erlend E. Aasland. + + - bpo-43492(5): Update macOS installer to use SQLite 3.35.4. + + - bpo-42235(6): ‘Mac/BuildScript/build-installer.py’ will now use + “–enable-optimizations” and ‘--with-lto’ when building on macOS + 10.15 or later. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42119 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43568 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=44009 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43851 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43492 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42235 + + +File: python.info, Node: IDLE<8>, Next: C API<13>, Prev: macOS<9>, Up: Python 3 10 0 beta 1 + +1.21.16.9 IDLE +.............. + + - bpo-37903(1): 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. + + - bpo-43981(2): Fix reference leak in test_sidebar and test_squeezer. + Patches by Terry Jan Reedy and Pablo Galindo + + - bpo-37892(3): Indent IDLE Shell input with spaces instead of tabs + + - bpo-43655(4): IDLE dialog windows are now recognized as dialogs by + window managers on macOS and X Window. + + - bpo-37903(5): IDLE’s shell now shows prompts in a separate + side-bar. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37903 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43981 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37892 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43655 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=37903 + + +File: python.info, Node: C API<13>, Prev: IDLE<8>, Up: Python 3 10 0 beta 1 + +1.21.16.10 C API +................ + + - bpo-43916(1): Add a new ‘Py_TPFLAGS_DISALLOW_INSTANTIATION’ type + flag to disallow creating type instances. Patch by Victor Stinner. + + - bpo-43774(2): Remove the now unused ‘PYMALLOC_DEBUG’ macro. Debug + hooks on memory allocators are now installed by default if Python + is built in debug mode (if ‘Py_DEBUG’ macro is defined). Moreover, + they can now be used on Python build in release mode (ex: using + ‘PYTHONMALLOC=debug’ environment variable). + + - bpo-43962(3): _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. + + - bpo-28254(4): Add new C-API functions to control the state of the + garbage collector: *note PyGC_Enable(): 4d5, *note PyGC_Disable(): + 4d6, *note PyGC_IsEnabled(): 4d7, corresponding to the functions in + the *note gc: 80. module. + + - bpo-43908(5): Introduce *note Py_TPFLAGS_IMMUTABLETYPE: 353. flag + for immutable type objects, and modify *note PyType_Ready(): 350. + to set it for static types. Patch by Erlend E. Aasland. + + - bpo-43795(6): *note PyMem_Calloc(): b3b. is now available in the + limited C API (‘Py_LIMITED_API’). + + - bpo-43868(7): *note PyOS_ReadlineFunctionPointer(): 4fc. is no + longer exported by limited C API headers and by ‘python3.dll’ on + Windows. Like any function that takes ‘FILE*’, it is not part of + the stable ABI. + + - bpo-43795(8): Stable ABI and limited API definitions are generated + from a central manifest ( PEP 652(9)). + + - bpo-43753(10): Add the *note Py_Is(x, y): 4d1. function to test if + the `x' object is the `y' object, the same as ‘x is y’ in Python. + Add also the *note Py_IsNone(): 4d2, *note Py_IsTrue(): 4d3, *note + Py_IsFalse(): 4d4. functions to test if an object is, respectively, + the ‘None’ singleton, the ‘True’ singleton or the ‘False’ + singleton. Patch by Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43916 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43774 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43962 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28254 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43908 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43795 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43868 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43795 + + (9) https://peps.python.org/pep-0652/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43753 + + +File: python.info, Node: Python 3 10 0 alpha 7, Next: Python 3 10 0 alpha 6, Prev: Python 3 10 0 beta 1, Up: Changelog + +1.21.17 Python 3.10.0 alpha 7 +----------------------------- + +`Release date: 2021-04-05' + +* Menu: + +* Security: Security<7>. +* Core and Builtins: Core and Builtins<17>. +* Library: Library<16>. +* Documentation: Documentation<16>. +* Tests: Tests<16>. +* Build: Build<17>. +* Windows: Windows<16>. +* IDLE: IDLE<9>. +* C API: C API<14>. + + +File: python.info, Node: Security<7>, Next: Core and Builtins<17>, Up: Python 3 10 0 alpha 7 + +1.21.17.1 Security +.................. + + - bpo-42988(1): CVE-2021-3426: Remove the ‘getfile’ feature of the + *note pydoc: d6. 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. + + - bpo-43285(2): *note ftplib: 7e. 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 + ‘trust_server_pasv_ipv4_address’ attribute on their *note + ftplib.FTP: 53d. instances to ‘True’ to re-enable it. + + - bpo-43439(3): Add audit hooks for *note gc.get_objects(): 3f4, + *note gc.get_referrers(): 3f5. and *note gc.get_referents(): 3f6. + Patch by Pablo Galindo. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42988 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43285 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43439 + + +File: python.info, Node: Core and Builtins<17>, Next: Library<16>, Prev: Security<7>, Up: Python 3 10 0 alpha 7 + +1.21.17.2 Core and Builtins +........................... + + - bpo-27129(1): Update CPython bytecode magic number. + + - bpo-43672(2): Raise ImportWarning when calling find_loader(). + + - bpo-43660(3): Fix crash that happens when replacing ‘sys.stderr’ + with a callable that can remove the object while an exception is + being printed. Patch by Pablo Galindo. + + - bpo-27129(4): The bytecode interpreter uses instruction, rather + byte, offsets internally. This reduces the number of EXTENDED_ARG + instructions needed and streamlines instruction dispatch a bit. + + - bpo-40645(5): Fix reference leak in the ‘_hashopenssl’ extension. + Patch by Pablo Galindo. + + - bpo-42134(6): Calls to find_module() by the import system now raise + ImportWarning. + + - bpo-41064(7): Improve the syntax error for invalid usage of double + starred elements (‘**’) in f-strings. Patch by Pablo Galindo. + + - bpo-43575(8): Speed up calls to ‘map()’ by using the PEP 590(9) + ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + - bpo-42137(10): The import system now prefers using ‘__spec__’ for + ‘ModuleType.__repr__’ over ‘module_repr()’. + + - bpo-43452(11): Added micro-optimizations to ‘_PyType_Lookup()’ to + improve cache lookup performance in the common case of cache hits. + + - bpo-43555(12): Report the column offset for *note SyntaxError: 2d6. + for invalid line continuation characters. Patch by Pablo Galindo. + + - bpo-43517(13): Fix misdetection of circular imports when using + ‘from pkg.mod import attr’, which caused false positives in + non-trivial multi-threaded code. + + - bpo-43497(14): Emit SyntaxWarnings for assertions with tuple + constants, this is a regression introduced in python3.7 + + - bpo-39316(15): 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. + + - bpo-35883(16): Python no longer fails at startup with a fatal error + if a command line argument contains an invalid Unicode character. + The *note Py_DecodeLocale(): 82d. function now escapes byte + sequences which would be decoded as Unicode characters outside the + [U+0000; U+10ffff] range. + + - bpo-43410(17): Fix a bug that was causing the parser to crash when + emitting syntax errors when reading input from stdin. Patch by + Pablo Galindo + + - bpo-43406(18): Fix a possible race condition where + ‘PyErr_CheckSignals’ tries to execute a non-Python signal handler. + + - bpo-42128(19): Add ‘__match_args__’ to ‘structsequence’ based + classes. Patch by Pablo Galindo. + + - bpo-43390(20): CPython now sets the ‘SA_ONSTACK’ flag in + ‘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 ‘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. + + - bpo-43287(21): Speed up calls to ‘filter()’ by using the PEP + 590(22) ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + - bpo-37448(23): 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: + ‘-DWITH_PYMALLOC_RADIX_TREE=0’. + + Co-authored-by: Tim Peters <> + + - bpo-29988(24): 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 ‘__exit__()’ is always called in with + statements, even for interrupts. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27129 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43672 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43660 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27129 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40645 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42134 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41064 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43575 + + (9) https://peps.python.org/pep-0590/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42137 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43452 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=43555 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43517 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=43497 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=39316 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=35883 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=43410 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=43406 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=42128 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=43390 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=43287 + + (22) https://peps.python.org/pep-0590/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=37448 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=29988 + + +File: python.info, Node: Library<16>, Next: Documentation<16>, Prev: Core and Builtins<17>, Up: Python 3 10 0 alpha 7 + +1.21.17.3 Library +................. + + - bpo-43720(1): Document various stdlib deprecations in imp, pkgutil, + and importlib.util for removal in Python 3.12. + + - bpo-43433(2): *note xmlrpc.client.ServerProxy: 6a6. no longer + ignores query and fragment in the URL of the server. + + - bpo-31956(3): The *note index(): 3d1. method of *note array.array: + 3d2. now has optional `start' and `stop' parameters. + + - bpo-40066(4): Enum: adjust ‘repr()’ to show only enum and member + name (not value, nor angle brackets) and ‘str()’ to show only + member name. Update and improve documentation to match. + + - bpo-42136(5): Deprecate all module_repr() methods found in + importlib as their use is being phased out by Python 3.12. + + - bpo-35930(6): Raising an exception raised in a “future” instance + will create reference cycles. + + - bpo-41369(7): Finish updating the vendored libmpdec to version + 2.5.1. Patch by Stefan Krah. + + - bpo-43422(8): Revert the _decimal C API which was added in + bpo-41324(9). + + - bpo-43577(10): Fix deadlock when using *note ssl.SSLContext: 430. + debug callback with *note ssl.SSLContext.sni_callback(): 12db. + + - bpo-43571(11): It’s now possible to create MPTCP sockets with + IPPROTO_MPTCP + + - bpo-43542(12): ‘image/heic’ and ‘image/heif’ were added to *note + mimetypes: b0. + + - bpo-40645(13): The *note hmac: 8a. module now uses OpenSSL’s HMAC + implementation when digestmod argument is a hash name or builtin + hash function. + + - bpo-43510(14): Implement PEP 597(15): Add ‘EncodingWarning’ + warning, ‘-X warn_default_encoding’ option, *note + PYTHONWARNDEFAULTENCODING: 3a6. environment variable and + ‘encoding="locale"’ argument value. + + - bpo-43521(16): ‘ast.unparse’ can now render NaNs and empty sets. + + - bpo-42914(17): *note pprint.pprint(): 41d. gains a new boolean + ‘underscore_numbers’ optional argument to emit integers with + thousands separated by an underscore character for improved + readability (for example ‘1_000_000’ instead of ‘1000000’). + + - bpo-41361(18): *note rotate(): 12dc. calls are now slightly faster + due to faster argument parsing. + + - bpo-43423(19): ‘subprocess.communicate()’ no longer raises an + IndexError when there is an empty stdout or stderr IO buffer during + a timeout on Windows. + + - bpo-27820(20): 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. + + - bpo-43445(21): Add frozen modules to *note sys.stdlib_module_names: + 438. For example, add ‘"_frozen_importlib"’ and + ‘"_frozen_importlib_external"’ names. + + - bpo-43245(22): Add keyword arguments support to + ‘ChainMap.new_child()’. + + - bpo-29982(23): Add optional parameter `ignore_cleanup_errors' to + *note tempfile.TemporaryDirectory(): ef1. and allow multiple + ‘cleanup()’ attempts. Contributed by C.A.M. Gerlach. + + - bpo-43428(24): Include changes from importlib_metadata 3.7(25): + + Performance enhancements to distribution discovery. + + ‘entry_points’ only returns unique distributions. + + Introduces new ‘EntryPoints’ object for containing a set of entry + points with convenience methods for selecting entry points by group + or name. ‘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. + + - bpo-43332(26): Improves the networking efficiency of *note + http.client: 8f. when using a proxy via ‘set_tunnel()’. Fewer + small send calls are made during connection setup. + + - bpo-43420(27): Improve performance of *note fractions.Fraction: + 210. arithmetics for large components. Contributed by Sergey B. + Kirpichev. + + - bpo-43356(28): Allow passing a signal number to + ‘_thread.interrupt_main()’. + + - bpo-43399(29): Fix ‘ElementTree.extend’ not working on iterators + when using the Python implementation + + - bpo-43369(30): Improve *note sqlite3: ef. error handling: If + ‘sqlite3_column_text()’ and ‘sqlite3_column_blob()’ set + ‘SQLITE_NOMEM’, *note MemoryError: 127a. is now raised. Patch by + Erlend E. Aasland. + + - bpo-43368(31): Fix a regression introduced in PR 24562, where an + empty bytestring was fetched as ‘None’ instead of ‘b''’ in *note + sqlite3: ef. Patch by Mariusz Felisiak. + + - bpo-41282(32): Fixed stacklevel of ‘DeprecationWarning’ emitted + from ‘import distutils’. + + - bpo-42129(33): ‘importlib.resources’ now honors namespace packages, + merging resources from each location in the namespace as introduced + in ‘importlib_resources’ 3.2 and including incidental changes + through 5.0.3. + + - bpo-43295(34): *note datetime.datetime.strptime(): 12dd. now raises + ‘ValueError’ instead of ‘IndexError’ when matching ‘'z'’ with the + ‘%z’ format specifier. + + - bpo-43125(35): Return empty string if base64mime.body_encode + receive empty bytes + + - bpo-43084(36): *note curses.window.enclose(): 12de. returns now + ‘True’ or ‘False’ (as was documented) instead of ‘1’ or ‘0’. + + - bpo-42994(37): Add MIME types for opus, AAC, 3gpp and 3gpp2 + + - bpo-14678(38): Add an invalidate_caches() method to the + zipimport.zipimporter class to support + importlib.invalidate_caches(). Patch by Desmond Cheong. + + - bpo-42782(39): Fail fast in *note shutil.move(): 6ac. to avoid + creating destination directories on failure. + + - bpo-40066(40): Enum’s *note repr(): 3ee. and *note str(): 1b3. have + changed: *note repr(): 3ee. is now `EnumClass.MemberName' and *note + str(): 1b3. is `MemberName'. Additionally, stdlib Enum’s whose + contents are available as module attributes, such as + ‘RegexFlag.IGNORECASE’, have their *note repr(): 3ee. as + `module.name', e.g. *note re.IGNORECASE: 12df. + + - bpo-26053(41): Fixed bug where the *note pdb: c6. interactive run + command echoed the args from the shell command line, even if those + have been overridden at the pdb prompt. + + - bpo-24160(42): Fixed bug where breakpoints did not persist across + multiple debugger sessions in *note pdb: c6.’s interactive mode. + + - bpo-40701(43): When the *note tempfile.tempdir: 12e0. 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 *note tempfile.gettempdir(): + 12e1. and *note tempfile.gettempdirb(): 12e2. functions `always' + return ‘str’ and ‘bytes’ respectively. + + - bpo-39342(44): Expose ‘X509_V_FLAG_ALLOW_PROXY_CERTS’ as *note + VERIFY_ALLOW_PROXY_CERTS: 12e3. to allow proxy certificate + validation as explained in + ‘https://www.openssl.org/docs/man1.1.1/man7/proxy-certificates.html’. + + - bpo-31861(45): Add builtins.aiter and builtins.anext. Patch by + Joshua Bronson (@jab), Daniel Pope (@lordmauve), and Justin Wang + (@justin39). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43720 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43433 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31956 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40066 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42136 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35930 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41369 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43422 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41324 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43577 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43571 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=43542 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=40645 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=43510 + + (15) https://peps.python.org/pep-0597/ + + (16) https://bugs.python.org/issue?@action=redirect&bpo=43521 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=42914 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=41361 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=43423 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=27820 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=43445 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=43245 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=29982 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=43428 + + (25) +https://importlib-metadata.readthedocs.io/en/latest/history.html#v3-7-0 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=43332 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=43420 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=43356 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=43399 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=43369 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=43368 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=41282 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=42129 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=43295 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=43125 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=43084 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=42994 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=14678 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=42782 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=40066 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=26053 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=24160 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=40701 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=39342 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=31861 + + +File: python.info, Node: Documentation<16>, Next: Tests<16>, Prev: Library<16>, Up: Python 3 10 0 alpha 7 + +1.21.17.4 Documentation +....................... + + - bpo-43199(1): Answer “Why is there no goto?” in the Design and + History FAQ. + + - bpo-43407(2): Clarified that a result from *note time.monotonic(): + b0a, *note time.perf_counter(): 6da, *note time.process_time(): + 6db, or *note time.thread_time(): 57e. can be compared with the + result from any following call to the same function - not just the + next immediate call. + + - bpo-43354(3): Fix type documentation for ‘Fault.faultCode’; the + type has to be ‘int’ instead of ‘str’. + + - bpo-41933(4): Clarified wording of s * n in the Common Sequence + Operations + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43199 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43407 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43354 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41933 + + +File: python.info, Node: Tests<16>, Next: Build<17>, Prev: Documentation<16>, Up: Python 3 10 0 alpha 7 + +1.21.17.5 Tests +............... + + - bpo-37945(1): Fix test_getsetlocale_issue1813() of test_locale: + skip the test if ‘setlocale()’ fails. Patch by Victor Stinner. + + - bpo-41561(2): Add workaround for Ubuntu’s custom OpenSSL security + level policy. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37945 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41561 + + +File: python.info, Node: Build<17>, Next: Windows<16>, Prev: Tests<16>, Up: Python 3 10 0 alpha 7 + +1.21.17.6 Build +............... + + - bpo-43179(1): Introduce and correctly use ALIGNOF_X in place of + SIZEOF_X for alignment-related code in optimized string routines. + Patch by Jessica Clarke. + + - bpo-43631(2): Update macOS, Windows, and CI to OpenSSL 1.1.1k. + + - bpo-43617(3): Improve configure.ac: Check for presence of + autoconf-archive package and remove our copies of M4 macros. + + - bpo-43466(4): The ‘configure’ script now supports + ‘--with-openssl-rpath’ option. + + - bpo-43372(5): Use ‘_freeze_importlib’ to generate code for the + ‘__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(6), commit 877df851. + Update the code and the expected code sizes in ctypes + test_frozentable. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43179 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43631 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43617 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43466 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43372 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42246 + + +File: python.info, Node: Windows<16>, Next: IDLE<9>, Prev: Build<17>, Up: Python 3 10 0 alpha 7 + +1.21.17.7 Windows +................. + + - bpo-43440(1): Build *note sqlite3: ef. with the ‘R*Tree’ module + enabled. Patch by Erlend E. Aasland. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43440 + + +File: python.info, Node: IDLE<9>, Next: C API<14>, Prev: Windows<16>, Up: Python 3 10 0 alpha 7 + +1.21.17.8 IDLE +.............. + + - bpo-42225(1): Document that IDLE can fail on Unix either from + misconfigured IP masquerade rules or failure displaying complex + colored (non-ascii) characters. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42225 + + +File: python.info, Node: C API<14>, Prev: IDLE<9>, Up: Python 3 10 0 alpha 7 + +1.21.17.9 C API +............... + + - bpo-43688(1): The limited C API is now supported if Python is built + in debug mode (if the ‘Py_DEBUG’ macro is defined). In the limited + C API, the *note Py_INCREF(): 4cc. and *note Py_DECREF(): 4cd. + functions are now implemented as opaque function calls, rather than + accessing directly the *note PyObject.ob_refcnt: 4ce. member, if + Python is built in debug mode and the ‘Py_LIMITED_API’ macro + targets Python 3.10 or newer. It became possible to support the + limited C API in debug mode because the *note PyObject: 4cf. + structure is the same in release and debug mode since Python 3.8 + (see bpo-36465(2)). + + The limited C API is still not supported in the ‘--with-trace-refs’ + special build (‘Py_TRACE_REFS’ macro). + + Patch by Victor Stinner. + + - bpo-43244(3): Remove the ‘pyarena.h’ header file with functions: + + * ‘PyArena_New()’ + + * ‘PyArena_Free()’ + + * ‘PyArena_Malloc()’ + + * ‘PyArena_AddPyObject()’ + + These functions were undocumented, excluded from the limited C API, + and were only used internally by the compiler. Patch by Victor + Stinner. + + - bpo-43244(4): Remove the compiler and parser functions using + ‘struct _mod’ type, because the public AST C API was removed: + + * ‘PyAST_Compile()’ + + * ‘PyAST_CompileEx()’ + + * ‘PyAST_CompileObject()’ + + * ‘PyFuture_FromAST()’ + + * ‘PyFuture_FromASTObject()’ + + * ‘PyParser_ASTFromFile()’ + + * ‘PyParser_ASTFromFileObject()’ + + * ‘PyParser_ASTFromFilename()’ + + * ‘PyParser_ASTFromString()’ + + * ‘PyParser_ASTFromStringObject()’ + + These functions were undocumented and excluded from the limited C + API. Patch by Victor Stinner. + + - bpo-43244(5): Remove ‘ast.h’, ‘asdl.h’, and ‘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 ‘Py’ and so could create names conflicts. For example, + ‘Python-ast.h’ defined a ‘Yield’ macro which was conflict with the + ‘Yield’ name used by the Windows ‘’ header. Use the + Python *note ast: 7. module instead. Patch by Victor Stinner. + + - bpo-43541(6): Fix a ‘PyEval_EvalCodeEx()’ regression: fix reference + counting on builtins. Patch by Victor Stinner. + + - bpo-43244(7): Remove the ‘symtable.h’ header file and the + undocumented functions: + + * ‘PyST_GetScope()’ + + * ‘PySymtable_Build()’ + + * ‘PySymtable_BuildObject()’ + + * ‘PySymtable_Free()’ + + * ‘Py_SymtableString()’ + + * ‘Py_SymtableStringObject()’ + + The ‘Py_SymtableString()’ function was part the stable ABI by + mistake but it could not be used, because the ‘symtable.h’ header + file was excluded from the limited C API. + + The Python *note symtable: f8. module remains available and is + unchanged. + + Patch by Victor Stinner. + + - bpo-43244(8): Remove the ‘PyAST_Validate()’ function. It is no + longer possible to build a AST object (‘mod_ty’ type) with the + public C API. The function was already excluded from the limited C + API ( PEP 384(9)). Patch by Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43688 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36465 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43541 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43244 + + (9) https://peps.python.org/pep-0384/ + + +File: python.info, Node: Python 3 10 0 alpha 6, Next: Python 3 10 0 alpha 5, Prev: Python 3 10 0 alpha 7, Up: Changelog + +1.21.18 Python 3.10.0 alpha 6 +----------------------------- + +`Release date: 2021-03-01' + +* Menu: + +* Security: Security<8>. +* Core and Builtins: Core and Builtins<18>. +* Library: Library<17>. +* Documentation: Documentation<17>. +* Tests: Tests<17>. +* Build: Build<18>. +* Windows: Windows<17>. +* macOS: macOS<10>. +* IDLE: IDLE<10>. +* C API: C API<15>. + + +File: python.info, Node: Security<8>, Next: Core and Builtins<18>, Up: Python 3 10 0 alpha 6 + +1.21.18.1 Security +.................. + + - bpo-42967(1): Fix web cache poisoning vulnerability by defaulting + the query args separator to ‘&’, and allowing the user to choose a + custom separator. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42967 + + +File: python.info, Node: Core and Builtins<18>, Next: Library<17>, Prev: Security<8>, Up: Python 3 10 0 alpha 6 + +1.21.18.2 Core and Builtins +........................... + + - bpo-43321(1): Fix ‘SystemError’ raised when ‘PyArg_Parse*()’ is + used with ‘#’ but without ‘PY_SSIZE_T_CLEAN’ defined. + + - bpo-36346(2): ‘PyArg_Parse*()’ functions now emits + ‘DeprecationWarning’ when ‘u’ or ‘Z’ format is used. See PEP + 623(3) for detail. + + - bpo-43277(4): Add a new *note PySet_CheckExact(): 4ca. function to + the C-API to check if an object is an instance of *note set: 1a6. + but not an instance of a subtype. Patch by Pablo Galindo. + + - bpo-42990(5): The *note types.FunctionType: 4a6. constructor now + inherits the current builtins if the `globals' dictionary has no + ‘"__builtins__"’ key, rather than using ‘{"None": None}’ as + builtins: same behavior as *note eval(): 4a7. and *note exec(): + 4a8. functions. Defining a function with ‘def function(...): ...’ + in Python is not affected, globals cannot be overridden with this + syntax: it also inherits the current builtins. Patch by Victor + Stinner. + + - bpo-42990(6): Functions have a new ‘__builtins__’ attribute which + is used to look for builtin symbols when a function is executed, + instead of looking into ‘__globals__['__builtins__']’. Patch by + Mark Shannon and Victor Stinner. + + - bpo-43149(7): Improve the error message in the parser for exception + groups without parentheses. Patch by Pablo Galindo. + + - bpo-43121(8): Fixed an incorrect *note SyntaxError: 2d6. message + for missing comma in literals. Patch by Pablo Galindo. + + - bpo-42819(9): *note readline: db.: 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 ‘readline.read_init_file()’. The Python REPL has not + implemented bracketed paste support. Also, bracketed mode writes + the ‘"\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 ‘readline.parse_and_bind("set + enable-bracketed-paste on")’. Patch by Dustin Rodrigues. + + - bpo-42808(10): Simple calls to ‘type(object)’ are now faster due to + the ‘vectorcall’ calling convention. Patch by Dennis Sweeney. + + - bpo-42217(11): Make the compiler merges same co_code and + co_linetable objects in a module like already did for co_consts. + + - bpo-41972(12): Substring search functions such as ‘str1 in str2’ + and ‘str2.find(str1)’ now sometimes use the “Two-Way” string + comparison algorithm to avoid quadratic behavior on long strings. + + - bpo-42128(13): Implement PEP 634(14) (structural pattern matching). + Patch by Brandt Bucher. + + - bpo-40692(15): In the *note concurrent.futures.ProcessPoolExecutor: + 52e, validate that ‘multiprocess.synchronize()’ is available on a + given platform and rely on that check in the *note + concurrent.futures: 20. test suite so we can run tests that are + unrelated to ‘ProcessPoolExecutor’ on those platforms. + + - bpo-38302(16): If *note object.__ipow__(): 3c0. returns *note + NotImplemented: 3c1, the operator will correctly fall back to *note + object.__pow__(): 3c2. and *note object.__rpow__(): 3c3. as + expected. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43321 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36346 + + (3) https://peps.python.org/pep-0623/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43277 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42990 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42990 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=43149 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43121 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42819 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42808 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42217 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=41972 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=42128 + + (14) https://peps.python.org/pep-0634/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=40692 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=38302 + + +File: python.info, Node: Library<17>, Next: Documentation<17>, Prev: Core and Builtins<18>, Up: Python 3 10 0 alpha 6 + +1.21.18.3 Library +................. + + - bpo-43316(1): The ‘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. + + - bpo-43317(2): Set the chunk size for the ‘gzip’ module main + function to io.DEFAULT_BUFFER_SIZE. This is slightly faster than + the 1024 bytes constant that was used previously. + + - bpo-43146(3): Handle None in single-arg versions of *note + print_exception(): 446. and *note format_exception(): 444. + + - bpo-43260(4): Fix TextIOWrapper can not flush internal buffer + forever after very large text is written. + + - bpo-43258(5): Prevent needless allocation of *note sqlite3: ef. + aggregate function context when no rows match an aggregate query. + Patch by Erlend E. Aasland. + + - bpo-43251(6): Improve *note sqlite3: ef. error handling: + ‘sqlite3_column_name()’ failures now result in *note MemoryError: + 127a. Patch by Erlend E. Aasland. + + - bpo-40956(7): Fix segfault in *note sqlite3.Connection.backup(): + 7d9. if no argument was provided. The regression was introduced by + PR 23838. Patch by Erlend E. Aasland. + + - bpo-43172(8): The readline module now passes its tests when built + directly against libedit. Existing irreconcilable API differences + remain in *note readline.get_begidx(): 12ee. and *note + readline.get_endidx(): 12ef. behavior based on libreadline vs + libedit use. + + - bpo-43163(9): Fix a bug in *note codeop: 1b. that was causing it to + not ask for more input when multi-line snippets have unclosed + parentheses. Patch by Pablo Galindo + + - bpo-43162(10): deprecate unsupported ability to access enum members + as attributes of other enum members + + - bpo-43146(11): Fix recent regression in None argument handling in + *note traceback: 11d. module functions. + + - bpo-43102(12): The namedtuple __new__ method had its __builtins__ + set to None instead of an actual dictionary. This created problems + for introspection tools. + + - bpo-43106(13): Added *note O_EVTONLY: 40d, *note O_FSYNC: 40e, + *note O_SYMLINK: 40f. and *note O_NOFOLLOW_ANY: 410. for macOS. + Patch by Dong-hee Na. + + - bpo-42960(14): Adds *note resource.RLIMIT_KQUEUES: 12f0. constant + from FreeBSD to the *note resource: dd. module. + + - bpo-42151(15): Make the pure Python implementation of *note + xml.etree.ElementTree: 142. behave the same as the C implementation + (‘_elementree’) regarding default attribute values (by not setting + ‘specified_attributes=1’). + + - bpo-29753(16): In ctypes, now packed bitfields are calculated + properly and the first item of packed bitfields is now shrank + correctly. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43316 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43317 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=43146 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43260 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=43258 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43251 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40956 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=43172 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43163 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=43162 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=43146 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=43102 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=43106 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=42960 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=42151 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=29753 + + +File: python.info, Node: Documentation<17>, Next: Tests<17>, Prev: Library<17>, Up: Python 3 10 0 alpha 6 + +1.21.18.4 Documentation +....................... + + - bpo-27646(1): Clarify that ‘yield from ’ works with any + iterable, not just iterators. + + - bpo-36346(2): Update some deprecated unicode APIs which are + documented as “will be removed in 4.0” to “3.12”. See PEP 623(3) + for detail. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27646 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36346 + + (3) https://peps.python.org/pep-0623/ + + +File: python.info, Node: Tests<17>, Next: Build<18>, Prev: Documentation<17>, Up: Python 3 10 0 alpha 6 + +1.21.18.5 Tests +............... + + - bpo-43288(1): Fix test_importlib to correctly skip Unicode file + tests if the filesystem does not support them. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43288 + + +File: python.info, Node: Build<18>, Next: Windows<17>, Prev: Tests<17>, Up: Python 3 10 0 alpha 6 + +1.21.18.6 Build +............... + + - bpo-43174(1): Windows build now uses ‘/utf-8’ compiler option. + + - bpo-43103(2): Add a new configure ‘--without-static-libpython’ + option to not build the ‘libpythonMAJOR.MINOR.a’ static library and + not install the ‘python.o’ object file. + + - bpo-13501(3): The configure script can now use `libedit' instead of + `readline' with the command line option ‘--with-readline=editline’. + + - bpo-42603(4): 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 + ‘/{System/,}Library/Frameworks’. If both exist and the latter is + preferred, the appropriate ‘--with-tcltk-*’ configuration options + need to be explicitly set. + + - bpo-39448(5): Add the “regen-frozen” makefile target that + regenerates the code for the frozen ‘__hello__’ module. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43174 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43103 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13501 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42603 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39448 + + +File: python.info, Node: Windows<17>, Next: macOS<10>, Prev: Build<18>, Up: Python 3 10 0 alpha 6 + +1.21.18.7 Windows +................. + + - bpo-43155(1): ‘PyCMethod_New()’ is now present in ‘python3.lib’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43155 + + +File: python.info, Node: macOS<10>, Next: IDLE<10>, Prev: Windows<17>, Up: Python 3 10 0 alpha 6 + +1.21.18.8 macOS +............... + + - bpo-41837(1): Update macOS installer build to use OpenSSL 1.1.1j. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41837 + + +File: python.info, Node: IDLE<10>, Next: C API<15>, Prev: macOS<10>, Up: Python 3 10 0 alpha 6 + +1.21.18.9 IDLE +.............. + + - bpo-43283(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43283 + + +File: python.info, Node: C API<15>, Prev: IDLE<10>, Up: Python 3 10 0 alpha 6 + +1.21.18.10 C API +................ + + - bpo-43278(1): Always put compiler and system information on the + first line of the REPL welcome message. + + - bpo-43270(2): Remove the private ‘_PyErr_OCCURRED()’ macro: use the + public *note PyErr_Occurred(): 12f8. function instead. + + - bpo-35134(3): 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: *note Include Files: 359. + + - bpo-35134(4): 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: *note Include Files: 359. + + - bpo-40170(5): ‘PyExceptionClass_Name()’ is now always declared as a + function, in order to hide implementation details. The macro + accessed *note PyTypeObject.tp_name: 12f9. directly. Patch by + Erlend E. Aasland. + + - bpo-43239(6): The ‘PyCFunction_New()’ function is now exported in + the ABI when compiled with ‘-fvisibility=hidden’. + + - bpo-40170(7): *note PyIter_Check(): 12fa. is now always declared as + a function, in order to hide implementation details. The macro + accessed *note PyTypeObject.tp_iternext: 112e. directly. Patch by + Erlend E. Aasland. + + - bpo-40170(8): Convert *note PyDescr_IsData(): 12fb. macro to a + function to hide implementation details: The macro accessed *note + PyTypeObject.tp_descr_set: 12fc. directly. Patch by Erlend E. + Aasland. + + - bpo-43181(9): Convert *note PyObject_TypeCheck(): 12fd. macro to a + static inline function. Patch by Erlend E. Aasland. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43278 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43270 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=43239 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=43181 + + +File: python.info, Node: Python 3 10 0 alpha 5, Next: Python 3 10 0 alpha 4, Prev: Python 3 10 0 alpha 6, Up: Changelog + +1.21.19 Python 3.10.0 alpha 5 +----------------------------- + +`Release date: 2021-02-02' + +* Menu: + +* Security: Security<9>. +* Core and Builtins: Core and Builtins<19>. +* Library: Library<18>. +* Documentation: Documentation<18>. +* Tests: Tests<18>. +* Build: Build<19>. +* Windows: Windows<18>. +* macOS: macOS<11>. +* IDLE: IDLE<11>. +* C API: C API<16>. + + +File: python.info, Node: Security<9>, Next: Core and Builtins<19>, Up: Python 3 10 0 alpha 5 + +1.21.19.1 Security +.................. + + - bpo-42938(1): Avoid static buffers when computing the repr of *note + ctypes.c_double: 1300. and *note ctypes.c_longdouble: 1301. values. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42938 + + +File: python.info, Node: Core and Builtins<19>, Next: Library<18>, Prev: Security<9>, Up: Python 3 10 0 alpha 5 + +1.21.19.2 Core and Builtins +........................... + + - bpo-42990(1): Refactor the ‘PyEval_’ family of functions. + + * An new function ‘_PyEval_Vector’ is added to simplify calls to + Python from C. + + * ‘_PyEval_EvalCodeWithName’ is removed + + * ‘PyEval_EvalCodeEx’ is retained as part of the API, but is not + used internally + + - bpo-38631(2): Replace *note Py_FatalError(): 5d9. calls in the + compiler with regular *note SystemError: 9b5. exceptions. Patch by + Victor Stinner. + + - bpo-42997(3): Improve error message for missing “:” before blocks. + Patch by Pablo Galindo. + + - bpo-43017(4): Improve error message in the parser when using + un-parenthesised tuples in comprehensions. Patch by Pablo Galindo. + + - bpo-42986(5): Fix parser crash when reporting syntax errors in + f-string with newlines. Patch by Pablo Galindo. + + - bpo-40176(6): Syntax errors for unterminated string literals now + point to the start of the string instead of reporting EOF/EOL. + + - bpo-42927(7): The inline cache for ‘LOAD_ATTR’ now also optimizes + access to attributes defined by ‘__slots__’. This makes reading + such attribute up to 30% faster. + + - bpo-42864(8): Improve error messages in the parser when parentheses + are not closed. Patch by Pablo Galindo. + + - bpo-42924(9): Fix ‘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 + ‘bytearray’ to a shorter byte string). + + - bpo-42882(10): Fix the ‘_PyUnicode_FromId()’ function + (_Py_IDENTIFIER(var) API) when *note Py_Initialize(): 4e7. / *note + Py_Finalize(): ff4. is called multiple times: preserve + ‘_PyRuntime.unicode_ids.next_index’ value. + + - bpo-42827(11): Fix a crash when working out the error line of a + *note SyntaxError: 2d6. in some multi-line expressions. + + - bpo-42823(12): frame.f_lineno is correct even if frame.f_trace is + set to True + + - bpo-37324(13): Remove deprecated aliases to *note Collections + Abstract Base Classes: 49a. from the *note collections: 1c. module. + + - bpo-41994(14): Fixed possible leak in ‘import’ when ‘sys.modules’ + is not a ‘dict’. + + - bpo-27772(15): In string formatting, preceding the `width' field by + ‘'0'’ no longer affects the default alignment for strings. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42990 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38631 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42997 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43017 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42986 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40176 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42927 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42864 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42924 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42882 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42827 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42823 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=37324 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=41994 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=27772 + + +File: python.info, Node: Library<18>, Next: Documentation<18>, Prev: Core and Builtins<19>, Up: Python 3 10 0 alpha 5 + +1.21.19.3 Library +................. + + - bpo-43108(1): Fixed a reference leak in the *note curses: 2a. + module. Patch by Pablo Galindo + + - bpo-43077(2): Update the bundled pip to 21.0.1 and setuptools to + 52.0.0. + + - bpo-41282(3): Deprecate ‘distutils’ in documentation and add + warning on import. + + - bpo-43014(4): Improve performance of *note tokenize: 11a. by + 20-30%. Patch by Anthony Sottile. + + - bpo-42323(5): Fix *note math.nextafter(): 557. for NaN on AIX. + + - bpo-42955(6): Add *note sys.stdlib_module_names: 438, containing + the list of the standard library module names. Patch by Victor + Stinner. + + - bpo-42944(7): Fix ‘random.Random.sample’ when ‘counts’ argument is + not ‘None’. + + - bpo-42934(8): Use *note TracebackException: 26a.’s new ‘compact’ + param in *note TestResult: e1b. to reduce time and memory consumed + by traceback formatting. + + - bpo-42931(9): Add ‘randbytes()’ to ‘random.__all__’. + + - bpo-38250(10): [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. + + - bpo-42877(11): Added the ‘compact’ parameter to the constructor of + *note traceback.TracebackException: 26a. to reduce time and memory + for use cases that only need to call ‘TracebackException.format()’ + and ‘TracebackException.format_exception_only()’. + + - bpo-42923(12): The *note Py_FatalError(): 5d9. function and the + *note faulthandler: 78. module now dump the list of extension + modules on a fatal error. + + - bpo-42848(13): Removed recursion from *note TracebackException: + 26a. to allow it to handle long exception chains. + + - bpo-42901(14): [Enum] move member creation from ‘EnumMeta.__new__’ + to ‘_proto_member.__set_name__’, allowing members to be created and + visible in ‘__init_subclass__’. + + - bpo-42780(15): Fix os.set_inheritable() for O_PATH file descriptors + on Linux. + + - bpo-42866(16): Fix a reference leak in the ‘getcodec()’ function of + CJK codecs. Patch by Victor Stinner. + + - bpo-42846(17): 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 ( PEP + 489(18)). Patch by Victor Stinner. + + - bpo-42851(19): remove __init_subclass__ support for Enum members + + - bpo-42834(20): Make internal caches of the ‘_json’ module + compatible with subinterpreters. + + - bpo-41748(21): Fix HTMLParser parsing rules for element attributes + containing commas with spaces. Patch by Karl Dubost. + + - bpo-40810(22): Require SQLite 3.7.15 or newer. Patch by Erlend E. + Aasland. + + - bpo-1635741(23): Convert the _multibytecodec extension module (CJK + codecs) to multi-phase initialization ( PEP 489(24)). Patch by + Erlend E. Aasland. + + - bpo-42802(25): The distutils ‘bdist_wininst’ command deprecated in + Python 3.8 has been removed. The distutils ‘bdist_wheel’ command + is now recommended to distribute binary packages on Windows. + + - bpo-24464(26): The undocumented built-in function + ‘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. + + - bpo-42384(27): Make pdb populate sys.path[0] exactly the same as + regular python execution. + + - bpo-42383(28): Fix pdb: previously pdb would fail to restart the + debugging target if it was specified using a relative path and the + current directory changed. + + - bpo-42005(29): Fix CLI of *note cProfile: 26. and *note profile: + d0. to catch *note BrokenPipeError: d0c. + + - bpo-41604(30): Don’t decrement the reference count of the previous + user_ptr when set_panel_userptr fails. + + - bpo-41149(31): Allow executing callables that have a boolean value + of ‘False’ when passed to ‘Threading.thread’ as the target. Patch + contributed by Barney Stratford. + + - bpo-38307(32): 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. + + - bpo-39273(33): The ‘BUTTON5_*’ constants are now exposed in the + *note curses: 2a. module if available. + + - bpo-33289(34): Correct call to *note tkinter.colorchooser: 10f. to + return RGB triplet of ints instead of floats. Patch by Cheryl + Sabella. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43108 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43077 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41282 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=43014 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42323 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42955 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42944 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42934 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42931 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38250 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42877 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42923 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=42848 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=42901 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=42780 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=42866 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=42846 + + (18) https://peps.python.org/pep-0489/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=42851 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=42834 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=41748 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=40810 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (24) https://peps.python.org/pep-0489/ + + (25) https://bugs.python.org/issue?@action=redirect&bpo=42802 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=24464 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=42384 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=42383 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=42005 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=41604 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=41149 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=38307 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=39273 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=33289 + + +File: python.info, Node: Documentation<18>, Next: Tests<18>, Prev: Library<18>, Up: Python 3 10 0 alpha 5 + +1.21.19.4 Documentation +....................... + + - bpo-40304(1): Fix doc for type(name, bases, dict). Patch by Boris + Verkhovskiy and Éric Araujo. + + - bpo-42811(2): Updated importlib.utils.resolve_name() doc to use + __spec__.parent instead of __package__. (Thanks Yair Frid.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40304 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42811 + + +File: python.info, Node: Tests<18>, Next: Build<19>, Prev: Documentation<18>, Up: Python 3 10 0 alpha 5 + +1.21.19.5 Tests +............... + + - bpo-40823(1): Use ‘unittest.TestLoader().loadTestsFromTestCase()’ + instead of ‘unittest.makeSuite()’ in *note sqlite3: ef. tests. + Patch by Erlend E. Aasland. + + - bpo-40810(2): In *note sqlite3: ef, fix ‘CheckTraceCallbackContent’ + for SQLite pre 3.7.15. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40823 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40810 + + +File: python.info, Node: Build<19>, Next: Windows<18>, Prev: Tests<18>, Up: Python 3 10 0 alpha 5 + +1.21.19.6 Build +............... + + - bpo-43031(1): Pass ‘--timeout=$(TESTTIMEOUT)’ option to the default + profile task ‘./python -m test --pgo’ command. + + - bpo-36143(2): ‘make regen-all’ now also runs ‘regen-keyword’. + Patch by Victor Stinner. + + - bpo-42874(3): 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). + + - bpo-31904(4): Add library search path by wr-cc in + add_cross_compiling_paths() for VxWorks. + + - bpo-42856(5): Add ‘--with-wheel-pkg-dir=PATH’ option to the + ‘./configure’ script. If specified, the *note ensurepip: 75. + module looks for ‘setuptools’ and ‘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 ‘/usr/share/python-wheels/’ directory and don’t install the + ‘ensurepip._bundled’ package. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43031 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36143 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42874 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42856 + + +File: python.info, Node: Windows<18>, Next: macOS<11>, Prev: Build<19>, Up: Python 3 10 0 alpha 5 + +1.21.19.7 Windows +................. + + - bpo-41837(1): Updated Windows installer to include OpenSSL 1.1.1i + + - bpo-42584(2): Upgrade Windows installer to use SQLite 3.34.0. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41837 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42584 + + +File: python.info, Node: macOS<11>, Next: IDLE<11>, Prev: Windows<18>, Up: Python 3 10 0 alpha 5 + +1.21.19.8 macOS +............... + + - bpo-42504(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42504 + + +File: python.info, Node: IDLE<11>, Next: C API<16>, Prev: macOS<11>, Up: Python 3 10 0 alpha 5 + +1.21.19.9 IDLE +.............. + + - bpo-43008(1): Make IDLE invoke *note sys.excepthook(): 3fe. in + normal, 2-process mode. Patch by Ken Hilton. + + - bpo-33065(2): Fix problem debugging user classes with __repr__ + method. + + - bpo-23544(3): Disable Debug=>Stack Viewer when user code is running + or Debugger is active, to prevent hang or crash. Patch by Zackery + Spytz. + + - bpo-32631(4): Finish zzdummy example extension module: make menu + entries work; add docstrings and tests with 100% coverage. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=43008 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33065 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23544 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32631 + + +File: python.info, Node: C API<16>, Prev: IDLE<11>, Up: Python 3 10 0 alpha 5 + +1.21.19.10 C API +................ + + - bpo-42979(1): When Python is built in debug mode (with C + assertions), calling a type slot like ‘sq_length’ (‘__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. + + - bpo-43030(2): Fixed a compiler warning in *note + Py_UNICODE_ISSPACE(): 130b. on platforms with signed ‘wchar_t’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42979 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=43030 + + +File: python.info, Node: Python 3 10 0 alpha 4, Next: Python 3 10 0 alpha 3, Prev: Python 3 10 0 alpha 5, Up: Changelog + +1.21.20 Python 3.10.0 alpha 4 +----------------------------- + +`Release date: 2021-01-04' + +* Menu: + +* Core and Builtins: Core and Builtins<20>. +* Library: Library<19>. +* Documentation: Documentation<19>. +* Tests: Tests<19>. +* Build: Build<20>. +* macOS: macOS<12>. +* Tools/Demos: Tools/Demos<5>. +* C API: C API<17>. + + +File: python.info, Node: Core and Builtins<20>, Next: Library<19>, Up: Python 3 10 0 alpha 4 + +1.21.20.1 Core and Builtins +........................... + + - bpo-42814(1): Fix undefined behavior in + ‘Objects/genericaliasobject.c’. + + - bpo-42806(2): Fix the column offsets for f-strings *note ast: 7. + nodes surrounded by parentheses and for nodes that spawn multiple + lines. Patch by Pablo Galindo. + + - bpo-40631(3): Fix regression where a single parenthesized starred + expression was a valid assignment target. + + - bpo-27794(4): Improve the error message for failed writes/deletes + to property objects. When possible, the attribute name is now + shown. Patch provided by Yurii Karabas. + + - bpo-42745(5): Make the type attribute lookup cache per-interpreter. + Patch by Victor Stinner. + + - bpo-42246(6): Jumps to jumps are not eliminated when it would break + PEP 626. + + - bpo-42246(7): Make sure that the ‘f_lasti’ and ‘f_lineno’ + attributes of a frame are set correctly when an exception is raised + or re-raised. Required for PEP 626. + + - bpo-32381(8): The coding cookie (ex: ‘# coding: latin1’) is now + ignored in the command passed to the *note -c: 1ad. command line + option. Patch by Victor Stinner. + + - bpo-30858(9): Improve error location in expressions that contain + assignments. Patch by Pablo Galindo and Lysandros Nikolaou. + + - bpo-42615(10): Remove jump commands made redundant by the deletion + of unreachable bytecode blocks + + - bpo-42639(11): Make the *note atexit: b. module state + per-interpreter. It is now safe have more than one *note atexit: + b. module instance. Patch by Dong-hee Na and Victor Stinner. + + - bpo-32381(12): Fix encoding name when running a ‘.pyc’ file on + Windows: *note PyRun_SimpleFileExFlags(): 130e. now uses the + correct encoding to decode the filename. + + - bpo-42195(13): The ‘__args__’ of the parameterized generics for + *note typing.Callable: 3b1. and *note collections.abc.Callable: + 3dc. are now consistent. The ‘__args__’ for *note + collections.abc.Callable: 3dc. are now flattened while *note + typing.Callable: 3b1.’s have not changed. To allow this change, + *note types.GenericAlias: 3dd. can now be subclassed and + ‘collections.abc.Callable’’s ‘__class_getitem__’ will now return a + subclass of ‘types.GenericAlias’. Tests for typing were also + updated to not subclass things like ‘Callable[..., T]’ as that is + not a valid base class. Finally, both ‘Callable’s no longer + validate their ‘argtypes’, in ‘Callable[[argtypes], resulttype]’ to + prepare for PEP 612(14). Patch by Ken Jin. + + - bpo-40137(15): Convert functools module to use *note + PyType_FromModuleAndSpec(): 4c8. + + - bpo-40077(16): Convert *note array: 6. to use heap types, and + establish module state for these. + + - bpo-42008(17): Fix _random.Random() seeding. + + - bpo-1635741(18): Port the ‘pyexpat’ extension module to multi-phase + initialization ( PEP 489(19)). + + - bpo-40521(20): Make the Unicode dictionary of interned strings + compatible with subinterpreters. Patch by Victor Stinner. + + - bpo-39465(21): Make ‘_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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42814 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42806 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40631 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27794 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42745 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42246 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=42246 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32381 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=30858 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42615 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42639 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32381 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=42195 + + (14) https://peps.python.org/pep-0612/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=40137 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=40077 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=42008 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (19) https://peps.python.org/pep-0489/ + + (20) https://bugs.python.org/issue?@action=redirect&bpo=40521 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=39465 + + +File: python.info, Node: Library<19>, Next: Documentation<19>, Prev: Core and Builtins<20>, Up: Python 3 10 0 alpha 4 + +1.21.20.2 Library +................. + + - bpo-42257(1): Handle empty string in variable executable in + platform.libc_ver() + + - bpo-42772(2): randrange() now raises a TypeError when step is + specified without a stop argument. Formerly, it silently ignored + the step argument. + + - bpo-42759(3): Fixed equality comparison of ‘tkinter.Variable’ and + *note tkinter.font.Font: 1310. Objects which belong to different + Tcl interpreters are now always different, even if they have the + same name. + + - bpo-42756(4): Configure LMTP Unix-domain socket to use socket + global default timeout when a timeout is not explicitly provided. + + - bpo-23328(5): Allow / character in username, password fields on + _PROXY envars. + + - bpo-42740(6): *note typing.get_args(): 4a1. and *note + typing.get_origin(): 696. now support PEP 604(7) union types and + PEP 612(8) additions to ‘Callable’. + + - bpo-42655(9): *note subprocess: f6. `extra_groups' is now correctly + passed into setgroups() system call. + + - bpo-42727(10): ‘EnumMeta.__prepare__’ now accepts ‘**kwds’ to + properly support ‘__init_subclass__’ + + - bpo-38308(11): Add optional `weights' to + `statistics.harmonic_mean()'. + + - bpo-42721(12): When simple query dialogs (*note + tkinter.simpledialog: 116.), message boxes (*note + tkinter.messagebox: 114.) or color choose dialog (*note + tkinter.colorchooser: 10f.) are created without arguments `master' + and `parent', and the default root window is not yet created, and + ‘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. + + - bpo-25246(13): Optimized *note collections.deque.remove(): 1311. + + - bpo-35728(14): Added a root parameter to *note + tkinter.font.nametofont(): 1312. + + - bpo-15303(15): *note tkinter: 10e. supports now widgets with + boolean value False. + + - bpo-42681(16): Fixed range checks for color and pair numbers in + *note curses: 2a. + + - bpo-42685(17): Improved placing of simple query windows in Tkinter + (such as *note tkinter.simpledialog.askinteger(): 1313.). They are + now centered at the center of the parent window if it is specified + and shown, otherwise at the center of the screen. + + - bpo-9694(18): Argparse help no longer uses the confusing phrase, + “optional arguments”. It uses “options” instead. + + - bpo-1635741(19): Port the *note _thread: 2. extension module to the + multiphase initialization API ( PEP 489(20)) and convert its static + types to heap types. + + - bpo-37961(21): Fix crash in ‘tracemalloc.Traceback.__repr__()’ + (regressed in Python 3.9). + + - bpo-42630(22): *note tkinter: 10e. functions and constructors which + need a default root window raise now *note RuntimeError: 6e9. with + descriptive message instead of obscure *note AttributeError: 19d. + or *note NameError: 396. if it is not created yet or cannot be + created automatically. + + - bpo-42639(23): ‘atexit._run_exitfuncs()’ now logs callback + exceptions using *note sys.unraisablehook: 24e, rather than logging + them directly into *note sys.stderr: 581. and raise the last + exception. + + - bpo-42644(24): ‘logging.disable’ will now validate the types and + value of its parameter. It also now accepts strings representing + the levels (as does ‘loging.setLevel’) instead of only the + numerical values. + + - bpo-42639(25): At Python exit, if a callback registered with *note + atexit.register(): 4a0. fails, its exception is now logged. + Previously, only some exceptions were logged, and the last + exception was always silently ignored. + + - bpo-36541(26): Fixed lib2to3.pgen2 to be able to parse PEP-570 + positional only argument syntax. + + - bpo-42382(27): In ‘importlib.metadata’: - ‘EntryPoint’ objects now + expose a ‘.dist’ object referencing the ‘Distribution’ when + constructed from a ‘Distribution’. - Add support for package + discovery under package normalization rules. - The object returned + by ‘metadata()’ now has a formally defined protocol called + ‘PackageMetadata’ with declared support for the ‘.get_all()’ + method. - Synced with importlib_metadata 3.3. + + - bpo-41877(28): A check is added against misspellings of autospect, + auto_spec and set_spec being passed as arguments to patch, + patch.object and create_autospec. + + - bpo-39717(29): [tarfile] update nested exception raising to use + ‘from None’ or ‘from e’ + + - bpo-41877(30): 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. + + - bpo-41559(31): Implemented PEP 612(32): added ‘ParamSpec’ and + ‘Concatenate’ to *note typing: 123. Patch by Ken Jin. + + - bpo-42385(33): StrEnum: fix _generate_next_value_ to return a str + + - bpo-31904(34): Define THREAD_STACK_SIZE for VxWorks. + + - bpo-34750(35): [Enum] ‘_EnumDict.update()’ is now supported + + - bpo-42517(36): Enum: private names do not become members / do not + generate errors – they remain normal attributes + + - bpo-42678(37): ‘Enum’: call ‘__init_subclass__’ after members have + been added + + - bpo-28964(38): *note ast.literal_eval(): 882. adds line number + information (if available) in error message for malformed nodes. + + - bpo-42470(39): *note random.sample(): 315. no longer warns on a + sequence which is also a set. + + - bpo-31904(40): ‘posixpath.expanduser()’ returns the input `path' + unchanged if user home directory is None on VxWorks. + + - bpo-42388(41): Fix subprocess.check_output(…, input=None) behavior + when text=True to be consistent with that of the documentation and + universal_newlines=True. + + - bpo-34463(42): Fixed discrepancy between *note traceback: 11d. and + the interpreter in formatting of SyntaxError with lineno not set + (*note traceback: 11d. was changed to match interpreter). + + - bpo-42393(43): Raise *note OverflowError: 4a4. instead of silent + truncation in *note socket.ntohs(): 4a3. and *note socket.htons(): + 4a2. Silent truncation was deprecated in Python 3.7. Patch by + Erlend E. Aasland + + - bpo-42222(44): Harmonized *note random.randrange(): 46e. argument + handling to match *note range(): 58b. + + * The integer test and conversion in ‘randrange()’ now uses + *note operator.index(): 1314. + + * Non-integer arguments to ‘randrange()’ are deprecated. + + * The ‘ValueError’ is deprecated in favor of a ‘TypeError’. + + * It now runs a little faster than before. + + (Contributed by Raymond Hettinger and Serhiy Storchaka.) + + - bpo-42163(45): Restore compatibility for ‘uname_result’ around + deepcopy and _replace. + + - bpo-42090(46): ‘zipfile.Path.joinpath’ now accepts arbitrary + arguments, same as ‘pathlib.Path.joinpath’. + + - bpo-1635741(47): Port the _csv module to the multi-phase + initialization API ( PEP 489(48)). + + - bpo-42059(49): *note typing.TypedDict: 18a. types created using the + alternative call-style syntax now correctly respect the ‘total’ + keyword argument when setting their ‘__required_keys__’ and + ‘__optional_keys__’ class attributes. + + - bpo-41960(50): Add ‘globalns’ and ‘localns’ parameters to the *note + inspect.signature(): 301. and *note + inspect.Signature.from_callable(): 304. + + - bpo-41907(51): fix ‘format()’ behavior for ‘IntFlag’ + + - bpo-41891(52): Ensure asyncio.wait_for waits for task completion + + - bpo-24792(53): Fixed bug where ‘zipimporter’ sometimes reports an + incorrect cause of import errors. + + - bpo-31904(54): Fix site and sysconfig modules for VxWorks RTOS + which has no home directories. + + - bpo-41462(55): Add *note os.set_blocking(): abe. support for + VxWorks RTOS. + + - bpo-40219(56): Lowered ‘tkinter.ttk.LabeledScale’ dummy widget to + prevent hiding part of the content label. + + - bpo-37193(57): Fixed memory leak in ‘socketserver.ThreadingMixIn’ + introduced in Python 3.7. + + - bpo-39068(58): Fix initialization race condition in ‘a85encode()’ + and ‘b85encode()’ in *note base64: d. Patch by Brandon Stansbury. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42257 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42772 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42759 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42756 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23328 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42740 + + (7) https://peps.python.org/pep-0604/ + + (8) https://peps.python.org/pep-0612/ + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42655 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42727 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38308 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42721 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25246 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=35728 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=15303 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=42681 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=42685 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=9694 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (20) https://peps.python.org/pep-0489/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=37961 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=42630 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=42639 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=42644 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=42639 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=36541 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=42382 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=41877 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=39717 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=41877 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=41559 + + (32) https://peps.python.org/pep-0612/ + + (33) https://bugs.python.org/issue?@action=redirect&bpo=42385 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=34750 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=42517 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=42678 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=28964 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=42470 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=42388 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=34463 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=42393 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=42222 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=42163 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=42090 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (48) https://peps.python.org/pep-0489/ + + (49) https://bugs.python.org/issue?@action=redirect&bpo=42059 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=41960 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=41907 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=41891 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=24792 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=41462 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=40219 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=37193 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=39068 + + +File: python.info, Node: Documentation<19>, Next: Tests<19>, Prev: Library<19>, Up: Python 3 10 0 alpha 4 + +1.21.20.3 Documentation +....................... + + - bpo-17140(1): Add documentation for the *note + multiprocessing.pool.ThreadPool: 1316. class. + + - bpo-34398(2): Prominently feature listings from the glossary in + documentation search results. Patch by Ammar Askar. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17140 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34398 + + +File: python.info, Node: Tests<19>, Next: Build<20>, Prev: Documentation<19>, Up: Python 3 10 0 alpha 4 + +1.21.20.4 Tests +............... + + - bpo-42794(1): Update test_nntplib to use official group name of + news.aioe.org for testing. Patch by Dong-hee Na. + + - bpo-31904(2): Skip some asyncio tests on VxWorks. + + - bpo-42641(3): Enhance ‘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. + + - bpo-31904(4): Skip some tests in _test_all_chown_common() on + VxWorks. + + - bpo-42199(5): Fix bytecode helper assertNotInBytecode. + + - bpo-41443(6): Add more attribute checking in test_posix.py + + - bpo-31904(7): Disable os.popen and impacted tests on VxWorks + + - bpo-41439(8): Port test_ssl and test_uuid to VxWorks RTOS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42794 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42641 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42199 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41443 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41439 + + +File: python.info, Node: Build<20>, Next: macOS<12>, Prev: Tests<19>, Up: Python 3 10 0 alpha 4 + +1.21.20.5 Build +............... + + - bpo-42692(1): Fix __builtin_available check on older compilers. + Patch by Joshua Root. + + - bpo-27640(2): Added ‘--disable-test-modules’ option to the + ‘configure’ script: don’t build nor install test modules. Patch by + Xavier de Gaye, Thomas Petazzoni and Peixing Xin. + + - bpo-42604(3): 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”. + + - bpo-42598(4): Fix implicit function declarations in configure which + could have resulted in incorrect configuration checks. Patch + contributed by Joshua Root. + + - bpo-31904(5): Enable libpython3.so for VxWorks. + + - bpo-29076(6): Add fish shell support to macOS installer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42692 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27640 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42604 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42598 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29076 + + +File: python.info, Node: macOS<12>, Next: Tools/Demos<5>, Prev: Build<20>, Up: Python 3 10 0 alpha 4 + +1.21.20.6 macOS +............... + + - bpo-42361(1): Update macOS installer build to use Tcl/Tk 8.6.11 + (rc2, expected to be final release). + + - bpo-41837(2): Update macOS installer build to use OpenSSL 1.1.1i. + + - bpo-42584(3): Update macOS installer to use SQLite 3.34.0. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42361 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41837 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42584 + + +File: python.info, Node: Tools/Demos<5>, Next: C API<17>, Prev: macOS<12>, Up: Python 3 10 0 alpha 4 + +1.21.20.7 Tools/Demos +..................... + + - bpo-42726(1): Fixed Python 3 compatibility issue with + gdb/libpython.py handling of attribute dictionaries. + + - bpo-42613(2): Fix ‘freeze.py’ tool to use the prope config and + library directories. Patch by Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42726 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42613 + + +File: python.info, Node: C API<17>, Prev: Tools/Demos<5>, Up: Python 3 10 0 alpha 4 + +1.21.20.8 C API +............... + + - bpo-42591(1): Export the ‘Py_FrozenMain()’ function: fix a Python + 3.9.0 regression. Python 3.9 uses ‘-fvisibility=hidden’ and the + function was not exported explicitly and so not exported. + + - bpo-32381(2): Remove the private ‘_Py_fopen()’ function which is no + longer needed. Use ‘_Py_wfopen()’ or ‘_Py_fopen_obj()’ instead. + Patch by Victor Stinner. + + - bpo-1635741(3): Port *note resource: dd. extension module to module + state + + - bpo-42111(4): Update the ‘xxlimited’ module to be a better example + of how to use the limited C API. + + - bpo-40052(5): Fix an alignment build warning/error in function + ‘PyVectorcall_Function()’. Patch by Andreas Schneider, Antoine + Pitrou and Petr Viktorin. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42591 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32381 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42111 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40052 + + +File: python.info, Node: Python 3 10 0 alpha 3, Next: Python 3 10 0 alpha 2, Prev: Python 3 10 0 alpha 4, Up: Changelog + +1.21.21 Python 3.10.0 alpha 3 +----------------------------- + +`Release date: 2020-12-07' + +* Menu: + +* Security: Security<10>. +* Core and Builtins: Core and Builtins<21>. +* Library: Library<20>. +* Documentation: Documentation<20>. +* Tests: Tests<20>. +* Build: Build<21>. +* Windows: Windows<19>. +* macOS: macOS<13>. +* IDLE: IDLE<12>. +* Tools/Demos: Tools/Demos<6>. +* C API: C API<18>. + + +File: python.info, Node: Security<10>, Next: Core and Builtins<21>, Up: Python 3 10 0 alpha 3 + +1.21.21.1 Security +.................. + + - bpo-40791(1): Add ‘volatile’ to the accumulator variable in + ‘hmac.compare_digest’, making constant-time-defeating optimizations + less likely. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40791 + + +File: python.info, Node: Core and Builtins<21>, Next: Library<20>, Prev: Security<10>, Up: Python 3 10 0 alpha 3 + +1.21.21.2 Core and Builtins +........................... + + - bpo-42576(1): ‘types.GenericAlias’ will now raise a ‘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. + + - bpo-42536(2): Several built-in and standard library types now + ensure that their internal result tuples are always tracked by the + *note garbage collector: 131f.: + + - *note collections.OrderedDict.items(): 1a8. + + - *note dict.items(): 3ba. + + - *note enumerate(): 10e1. + + - *note functools.reduce(): f80. + + - *note itertools.combinations(): fb1. + + - *note itertools.combinations_with_replacement(): f3b. + + - *note itertools.permutations(): 1320. + + - *note itertools.product(): fb2. + + - *note itertools.zip_longest(): f4c. + + - *note zip(): 3bc. + + Previously, they could have become untracked by a prior garbage + collection. Patch by Brandt Bucher. + + - bpo-42500(3): Improve handling of exceptions near recursion limit. + Converts a number of Fatal Errors in RecursionErrors. + + - bpo-42246(4): PEP 626: After a return, the f_lineno attribute of a + frame is always the last line executed. + + - bpo-42435(5): Speed up comparison of bytes objects with non-bytes + objects when option *note -b: 1b1. is specified. Speed up + comparison of bytarray objects with non-buffer object. + + - bpo-1635741(6): Port the ‘_warnings’ extension module to the + multi-phase initialization API ( PEP 489(7)). Patch by Victor + Stinner. + + - bpo-41686(8): On Windows, the ‘SIGINT’ event, + ‘_PyOS_SigintEvent()’, is now created even if Python is configured + to not install signal handlers (if *note + PyConfig.install_signal_handlers: 4fb. equals to 0, or + ‘Py_InitializeEx(0)’). + + - bpo-42381(9): Allow assignment expressions in set literals and set + comprehensions as per PEP 572. Patch by Pablo Galindo. + + - bpo-42202(10): Change function parameters annotations internal + representation to tuple of strings. Patch provided by Yurii + Karabas. + + - bpo-42374(11): Fix a regression introduced by the new parser, where + an unparenthesized walrus operator was not allowed within generator + expressions. + + - bpo-42316(12): Allow an unparenthesized walrus in subscript + indexes. + + - bpo-42349(13): Make sure that the compiler front-end produces a + well-formed control flow graph. Be be more aggressive in the + compiler back-end, as it is now safe to do so. + + - bpo-42296(14): 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. + + - bpo-42332(15): *note types.GenericAlias: 3dd. objects can now be + the targets of weakrefs. + + - bpo-42282(16): Optimise constant subexpressions that appear as part + of named expressions (previously the AST optimiser did not descend + into named expressions). Patch by Nick Coghlan. + + - bpo-42266(17): 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. + + - bpo-40077(18): Convert *note queue: d7. to use heap types. + + - bpo-42246(19): Improved accuracy of line tracing events and + f_lineno attribute of Frame objects. See PEP 626 for details. + + - bpo-40077(20): Convert *note mmap: b1. to use heap types. + + - bpo-42233(21): Allow ‘GenericAlias’ objects to use *note union type + expressions: 3ad. This allows expressions like ‘list[int] | + dict[float, str]’ where previously a ‘TypeError’ would have been + thrown. This also fixes union type expressions not de-duplicating + ‘GenericAlias’ objects. (Contributed by Ken Jin in bpo-42233(22).) + + - bpo-26131(23): The import system triggers a *note ImportWarning: + 46d. when it falls back to using ‘load_module()’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42576 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42536 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42500 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42246 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42435 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (7) https://peps.python.org/pep-0489/ + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41686 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42381 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42202 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42374 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42316 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=42349 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=42296 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=42332 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=42282 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=42266 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=40077 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=42246 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=40077 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=42233 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=42233 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=26131 + + +File: python.info, Node: Library<20>, Next: Documentation<20>, Prev: Core and Builtins<21>, Up: Python 3 10 0 alpha 3 + +1.21.21.3 Library +................. + + - bpo-5054(1): 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. + + - bpo-42562(2): Fix issue when dis failed to parse function that has + no line numbers. Patch provided by Yurii Karabas. + + - bpo-17735(3): ‘inspect.findsource()’ now raises *note OSError: 413. + instead of *note IndexError: 116b. when ‘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. + + - bpo-42116(4): Fix handling of trailing comments by *note + inspect.getsource(): 129c. + + - bpo-42532(5): Remove unexpected call of ‘__bool__’ when passing a + ‘spec_arg’ argument to a Mock. + + - bpo-38200(6): Added itertools.pairwise() + + - bpo-41818(7): Fix test_master_read() so that it succeeds on all + platforms that either raise OSError or return b”” upon reading from + master. + + - bpo-42487(8): ChainMap.__iter__ no longer calls __getitem__ on + underlying maps + + - bpo-42482(9): *note TracebackException: 26a. 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. + + - bpo-41818(10): Make test_openpty() avoid unexpected success due to + number of rows and/or number of columns being == 0. + + - bpo-42392(11): Remove loop parameter from ‘asyncio.subprocess’ and + ‘asyncio.tasks’ functions. Patch provided by Yurii Karabas. + + - bpo-42392(12): Remove loop parameter from ‘asyncio.open_connection’ + and ‘asyncio.start_server’ functions. Patch provided by Yurii + Karabas. + + - bpo-28468(13): Add *note platform.freedesktop_os_release(): 41b. + function to parse freedesktop.org ‘os-release’ files. + + - bpo-42299(14): Removed the ‘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 Dong-hee Na and and Terry J. Reedy. + + - bpo-26131(15): Deprecate zipimport.zipimporter.load_module() in + favour of exec_module(). + + - bpo-41818(16): 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. + + - bpo-42392(17): Remove loop parameter from ‘__init__’ in all + ‘asyncio.locks’ and ‘asyncio.Queue’ classes. Patch provided by + Yurii Karabas. + + - bpo-15450(18): Make *note filecmp.dircmp: bda. respect subclassing. + Now the *note filecmp.dircmp.subdirs: 1322. behaves as expected + when subclassing dircmp. + + - bpo-42413(19): The exception *note socket.timeout: 428. is now an + alias of *note TimeoutError: 429. + + - bpo-31904(20): Support signal module on VxWorks. + + - bpo-42406(21): We fixed an issue in ‘pickle.whichmodule’ in which + importing *note multiprocessing: b5. could change the how pickle + identifies which module an object belongs to, potentially breaking + the unpickling of those objects. + + - bpo-42403(22): Simplify the *note importlib: 97. external bootstrap + code: ‘importlib._bootstrap_external’ now uses regular imports to + import builtin modules. When it is imported, the builtin *note + __import__(): 510. function is already fully working and so can be + used to import builtin modules like *note sys: f9. Patch by Victor + Stinner. + + - bpo-1635741(23): Convert _sre module types to heap types (PEP 384). + Patch by Erlend E. Aasland. + + - bpo-42375(24): subprocess module update for DragonFlyBSD support. + + - bpo-41713(25): Port the ‘_signal’ extension module to the + multi-phase initialization API ( PEP 489(26)). Patch by Victor + Stinner and Mohamed Koubaa. + + - bpo-37205(27): *note time.time(): 736, *note time.perf_counter(): + 6da. and *note time.monotonic(): b0a. functions can no longer fail + with a Python fatal error, instead raise a regular Python exception + on failure. + + - bpo-42328(28): Fixed *note tkinter.ttk.Style.map(): 1323. The + function accepts now the representation of the default state as + empty sequence (as returned by ‘Style.map()’). The structure of + the result is now the same on all platform and does not depend on + the value of ‘wantobjects’. + + - bpo-42345(29): Fix various issues with ‘typing.Literal’ parameter + handling (flatten, deduplicate, use type to cache key). Patch + provided by Yurii Karabas. + + - bpo-37205(30): *note time.perf_counter(): 6da. on Windows and *note + time.monotonic(): b0a. 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 *note time.perf_counter_ns(): + 73a. and *note time.monotonic_ns(): 739. added in Python 3.7 to + avoid this precision loss. + + - bpo-42318(31): Fixed support of non-BMP characters in *note + tkinter: 10e. on macOS. + + - bpo-42350(32): Fix the *note threading.Thread: 59b. 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. + + - bpo-42333(33): Port _ssl extension module to heap types. + + - bpo-42014(34): The ‘onerror’ callback from ‘shutil.rmtree’ now + receives correct function when ‘os.open’ fails. + + - bpo-42237(35): Fix *note os.sendfile(): 762. on illumos. + + - bpo-42308(36): Add *note threading.__excepthook__: 441. to allow + retrieving the original value of *note threading.excepthook(): 442. + in case it is set to a broken or a different value. Patch by Mario + Corchero. + + - bpo-42131(37): 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(). + + - bpo-41877(38): 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. + + - bpo-42264(39): ‘sqlite3.OptimizedUnicode’ has been undocumented and + obsolete since Python 3.3, when it was made an alias to *note str: + 1b3. It is now deprecated, scheduled for removal in Python 3.12. + + - bpo-42251(40): Added *note threading.gettrace(): 43d. and *note + threading.getprofile(): 43e. to retrieve the functions set by *note + threading.settrace(): 43f. and *note threading.setprofile(): 440. + respectively. Patch by Mario Corchero. + + - bpo-42249(41): Fixed writing binary Plist files larger than 4 GiB. + + - bpo-42236(42): On Unix, the *note os.device_encoding(): 128e. + function now returns ‘'UTF-8'’ rather than the device encoding if + the *note Python UTF-8 Mode: 229. is enabled. + + - bpo-41754(43): webbrowser: Ignore `NotADirectoryError' when calling + ‘xdg-settings’. + + - bpo-42183(44): 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. + + - bpo-42140(45): Improve asyncio.wait function to create the futures + set just one time. + + - bpo-42133(46): Update various modules in the stdlib to fall back on + ‘__spec__.loader’ when *note __loader__: cca. isn’t defined on a + module. + + - bpo-26131(47): The ‘load_module()’ methods found in importlib now + trigger a DeprecationWarning. + + - bpo-39825(48): Windows: Change + ‘sysconfig.get_config_var('EXT_SUFFIX')’ to the expected full + ‘platform_tag.extension’ format. Previously it was hard-coded to + ‘.pyd’, now it is compatible with ‘distutils.sysconfig’ and will + result in something like ‘.cp38-win_amd64.pyd’. This brings + windows into conformance with the other platforms. + + - bpo-26389(49): The *note traceback.format_exception(): 444, *note + traceback.format_exception_only(): 445, and *note + traceback.print_exception(): 446. functions can now take an + exception object as a positional-only argument. + + - bpo-41889(50): Enum: fix regression involving inheriting a multiply + inherited enum + + - bpo-41861(51): Convert *note sqlite3: ef. to use heap types (PEP + 384). Patch by Erlend E. Aasland. + + - bpo-40624(52): Added support for the XPath ‘!=’ operator in + xml.etree + + - bpo-28850(53): Fix *note pprint.PrettyPrinter.format(): 1324. + overrides being ignored for contents of small containers. The + ‘pprint._safe_repr()’ function was removed. + + - bpo-41625(54): Expose the ‘splice()’ as *note os.splice(): 40c. in + the *note os: c2. module. Patch by Pablo Galindo + + - bpo-34215(55): Clarify the error message for *note + asyncio.IncompleteReadError: 1325. when ‘expected’ is ‘None’. + + - bpo-41543(56): Add async context manager support for + contextlib.nullcontext. + + - bpo-21041(57): *note pathlib.PurePath.parents: 415. now supports + negative indexing. Patch contributed by Yaroslav Pankovych. + + - bpo-41332(58): Added missing connect_accepted_socket() method to + ‘asyncio.AbstractEventLoop’. + + - bpo-12800(59): 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. + + - bpo-40968(60): *note urllib.request: 12a. and *note http.client: + 8f. now send ‘http/1.1’ ALPN extension during TLS handshake when no + custom context is supplied. + + - bpo-41001(61): Add func:*note os.eventfd: 40b. to provide a low + level interface for Linux’s event notification file descriptor. + + - bpo-40816(62): Add AsyncContextDecorator to contextlib to support + async context manager as a decorator. + + - bpo-40550(63): Fix time-of-check/time-of-action issue in + subprocess.Popen.send_signal. + + - bpo-39411(64): Add an ‘is_async’ identifier to *note pyclbr: d5.’s + ‘Function’ objects. Patch by Batuhan Taskaya + + - bpo-35498(65): Add slice support to *note pathlib.PurePath.parents: + 415. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5054 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42562 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=17735 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42116 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42532 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38200 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41818 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42487 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42482 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41818 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42392 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42392 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28468 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=42299 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=26131 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=41818 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=42392 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=15450 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=42413 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=42406 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=42403 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=42375 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=41713 + + (26) https://peps.python.org/pep-0489/ + + (27) https://bugs.python.org/issue?@action=redirect&bpo=37205 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=42328 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=42345 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=37205 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=42318 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=42350 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=42333 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=42014 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=42237 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=42308 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=42131 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=41877 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=42264 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=42251 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=42249 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=42236 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=41754 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=42183 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=42140 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=42133 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=26131 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=39825 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=26389 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=41889 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=41861 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=40624 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=28850 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=41625 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=34215 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=41543 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=21041 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=41332 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=12800 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=40968 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=41001 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=40816 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=40550 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=39411 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=35498 + + +File: python.info, Node: Documentation<20>, Next: Tests<20>, Prev: Library<20>, Up: Python 3 10 0 alpha 3 + +1.21.21.4 Documentation +....................... + + - bpo-42238(1): Tentative to deprecate ‘make suspicious’ by first + removing it from the CI and documentation builds, but keeping it + around for manual uses. + + - bpo-42153(2): Fix the URL for the IMAP protocol documents. + + - bpo-41028(3): Language and version switchers, previously maintained + in every cpython branches, are now handled by docsbuild-script. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42238 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42153 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41028 + + +File: python.info, Node: Tests<20>, Next: Build<21>, Prev: Documentation<20>, Up: Python 3 10 0 alpha 3 + +1.21.21.5 Tests +............... + + - bpo-41473(1): Re-enable test_gdb on gdb 9.2 and newer: + ‘https://bugzilla.redhat.com/show_bug.cgi?id=1866884’ bug is fixed + in gdb 10.1. + + - bpo-42553(2): Fix ‘test_asyncio.test_call_later()’ race condition: + don’t measure asyncio performance in the ‘call_later()’ unit test. + The test failed randomly on the CI. + + - bpo-31904(3): Fix test_netrc on VxWorks: create temporary + directories using temp_cwd(). + + - bpo-31904(4): skip test_getaddrinfo_ipv6_scopeid_symbolic and + test_getnameinfo_ipv6_scopeid_symbolic on VxWorks + + - bpo-31904(5): skip test_test of test_mailcap on VxWorks + + - bpo-31904(6): add shell requirement for test_pipes + + - bpo-31904(7): skip some tests related to fifo on VxWorks + + - bpo-31904(8): Fix test_doctest.py failures for VxWorks. + + - bpo-40754(9): Include ‘_testinternalcapi’ module in Windows + installer for test suite + + - bpo-41561(10): test_ssl: skip test_min_max_version_mismatch when + TLS 1.0 is not available + + - bpo-31904(11): Fix os module failures for VxWorks RTOS. + + - bpo-31904(12): Fix fifo test cases for VxWorks RTOS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41473 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42553 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40754 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41561 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + +File: python.info, Node: Build<21>, Next: Windows<19>, Prev: Tests<20>, Up: Python 3 10 0 alpha 3 + +1.21.21.6 Build +............... + + - bpo-31904(1): remove libnet dependency from detect_socket() for + VxWorks + + - bpo-42398(2): 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. + + - bpo-41617(3): Fix building ‘pycore_bitutils.h’ internal header on + old clang version without ‘__builtin_bswap16()’ (ex: Xcode 4.6.3 on + Mac OS X 10.7). Patch by Joshua Root and Victor Stinner. + + - bpo-38823(4): It is no longer possible to build the ‘_ctypes’ + extension module without ‘wchar_t’ type: remove ‘CTYPES_UNICODE’ + macro. Anyway, the ‘wchar_t’ type is required to build Python. + Patch by Victor Stinner. + + - bpo-42087(5): Support was removed for AIX 5.3 and below. See + bpo-40680(6). + + - bpo-40998(7): Addressed three compiler warnings found by undefined + behavior sanitizer (ubsan). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42398 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41617 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38823 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42087 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40680 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40998 + + +File: python.info, Node: Windows<19>, Next: macOS<13>, Prev: Build<21>, Up: Python 3 10 0 alpha 3 + +1.21.21.7 Windows +................. + + - bpo-42120(1): Remove macro definition of ‘copysign’ (to + ‘_copysign’) in headers. + + - bpo-38506(2): The Windows launcher now properly handles Python 3.10 + when listing installed Python versions. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42120 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38506 + + +File: python.info, Node: macOS<13>, Next: IDLE<12>, Prev: Windows<19>, Up: Python 3 10 0 alpha 3 + +1.21.21.8 macOS +............... + + - bpo-42504(1): Fix build on macOS Big Sur when + MACOSX_DEPLOYMENT_TARGET=11 + + - bpo-41116(2): Ensure distutils.unixxcompiler.find_library_file can + find system provided libraries on macOS 11. + + - bpo-41100(3): 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. + + - bpo-42232(4): Added Darwin specific madvise options to mmap module. + + - bpo-38443(5): The ‘--enable-universalsdk’ and + ‘--with-universal-archs’ options for the configure script now check + that the specified architectures can be used. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42504 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41116 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41100 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42232 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38443 + + +File: python.info, Node: IDLE<12>, Next: Tools/Demos<6>, Prev: macOS<13>, Up: Python 3 10 0 alpha 3 + +1.21.21.9 IDLE +.............. + + - bpo-42508(1): Keep IDLE running on macOS. Remove obsolete + workaround that prevented running files with shortcuts when using + new universal2 installers built on macOS 11. + + - bpo-42426(2): Fix reporting offset of the RE error in searchengine. + + - bpo-42415(3): Get docstrings for IDLE calltips more often by using + inspect.getdoc. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42508 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42426 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42415 + + +File: python.info, Node: Tools/Demos<6>, Next: C API<18>, Prev: IDLE<12>, Up: Python 3 10 0 alpha 3 + +1.21.21.10 Tools/Demos +...................... + + - bpo-42212(1): 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. + + - bpo-36310(2): Allow ‘Tools/i18n/pygettext.py’ to detect calls to + ‘gettext’ in f-strings. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42212 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36310 + + +File: python.info, Node: C API<18>, Prev: Tools/Demos<6>, Up: Python 3 10 0 alpha 3 + +1.21.21.11 C API +................ + + - bpo-42423(1): The *note PyType_FromSpecWithBases(): 4c7. and *note + PyType_FromModuleAndSpec(): 4c8. functions now accept a single + class as the `bases' argument. + + - bpo-1635741(2): Port *note select: e2. extension module to + multiphase initialization ( PEP 489(3)). + + - bpo-1635741(4): Port _posixsubprocess extension module to + multiphase initialization ( PEP 489(5)). + + - bpo-1635741(6): Port _posixshmem extension module to multiphase + initialization ( PEP 489(7)) + + - bpo-1635741(8): Port _struct extension module to multiphase + initialization ( PEP 489(9)) + + - bpo-1635741(10): Port *note spwd: ee. extension module to + multiphase initialization ( PEP 489(11)) + + - bpo-1635741(12): Port *note gc: 80. extension module to multiphase + initialization ( PEP 489(13)) + + - bpo-1635741(14): Port _queue extension module to multiphase + initialization ( PEP 489(15)) + + - bpo-39573(16): Convert *note Py_TYPE(): 355. and *note Py_SIZE(): + 357. 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: ‘Py_TYPE(obj) = + type;’ and ‘Py_SIZE(obj) = size;’. + + - bpo-1635741(17): Port *note symtable: f8. extension module to + multiphase initialization ( PEP 489(18)) + + - bpo-1635741(19): Port *note grp: 86. and *note pwd: d3. extension + modules to multiphase initialization ( PEP 489(20)) + + - bpo-1635741(21): Port _random extension module to multiphase + initialization ( PEP 489(22)) + + - bpo-1635741(23): Port _hashlib extension module to multiphase + initialization ( PEP 489(24)) + + - bpo-41713(25): Removed the undocumented ‘PyOS_InitInterrupts()’ + function. Initializing Python already implicitly installs signal + handlers: see *note PyConfig.install_signal_handlers: 4fb. Patch + by Victor Stinner. + + - bpo-40170(26): The ‘Py_TRASHCAN_BEGIN’ macro no longer accesses + PyTypeObject attributes, but now can get the condition by calling + the new private ‘_PyTrash_cond()’ function which hides + implementation details. + + - bpo-42260(27): *note Py_GetPath(): 4e1, *note Py_GetPrefix(): 4e2, + *note Py_GetExecPrefix(): 4e3, *note Py_GetProgramFullPath(): 4e4, + *note Py_GetPythonHome(): 4e5. and *note Py_GetProgramName(): 4e6. + functions now return ‘NULL’ if called before *note Py_Initialize(): + 4e7. (before Python is initialized). Use the new *note Python + Initialization Configuration API: 371. to get the *note Python Path + Configuration.: 4e8. Patch by Victor Stinner. + + - bpo-42260(28): The ‘PyConfig_Read()’ function now only parses *note + PyConfig.argv: 132e. arguments once: *note PyConfig.parse_argv: + 132f. is set to ‘2’ after arguments are parsed. Since Python + arguments are strippped from *note PyConfig.argv: 132e, parsing + arguments twice would parse the application options as Python + options. + + - bpo-42262(29): Added *note Py_NewRef(): 4c5. and *note + Py_XNewRef(): 4c6. functions to increment the reference count of an + object and return the object. Patch by Victor Stinner. + + - bpo-42260(30): When *note Py_Initialize(): 4e7. is called twice, + the second call now updates more *note sys: f9. attributes for the + configuration, rather than only *note sys.argv: f1f. Patch by + Victor Stinner. + + - bpo-41832(31): The *note PyType_FromModuleAndSpec(): 4c8. function + now accepts NULL ‘tp_doc’ slot. + + - bpo-1635741(32): Added *note PyModule_AddObjectRef(): 4c3. + function: similar to *note PyModule_AddObject(): 4c4. but don’t + steal a reference to the value on success. Patch by Victor + Stinner. + + - bpo-42171(33): The ‘METH_FASTCALL’ calling convention is added to + the limited API. The functions *note PyModule_AddType(): 5ca, *note + PyType_FromModuleAndSpec(): 4c8, *note PyType_GetModule(): 5c2. and + *note PyType_GetModuleState(): 5c3. are added to the limited API on + Windows. + + - bpo-42085(34): Add dedicated entry to PyAsyncMethods for sending + values + + - bpo-41073(35): *note PyType_GetSlot(): 4c9. can now accept static + types. + + - bpo-30459(36): *note PyList_SET_ITEM(): 4e9, *note + PyTuple_SET_ITEM(): 4ea. and *note PyCell_SET(): 4eb. macros can no + longer be used as l-value or r-value. For example, ‘x = + PyList_SET_ITEM(a, b, c)’ and ‘PyList_SET_ITEM(a, b, c) = x’ now + fail with a compiler error. It prevents bugs like ‘if + (PyList_SET_ITEM (a, b, c) < 0) ...’ test. Patch by Zackery Spytz + and Victor Stinner. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42423 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (3) https://peps.python.org/pep-0489/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (5) https://peps.python.org/pep-0489/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (7) https://peps.python.org/pep-0489/ + + (8) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (9) https://peps.python.org/pep-0489/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (11) https://peps.python.org/pep-0489/ + + (12) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (13) https://peps.python.org/pep-0489/ + + (14) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (15) https://peps.python.org/pep-0489/ + + (16) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (18) https://peps.python.org/pep-0489/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (20) https://peps.python.org/pep-0489/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (22) https://peps.python.org/pep-0489/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (24) https://peps.python.org/pep-0489/ + + (25) https://bugs.python.org/issue?@action=redirect&bpo=41713 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=42260 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=42260 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=42262 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=42260 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=41832 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=42171 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=42085 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=41073 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30459 + + +File: python.info, Node: Python 3 10 0 alpha 2, Next: Python 3 10 0 alpha 1, Prev: Python 3 10 0 alpha 3, Up: Changelog + +1.21.22 Python 3.10.0 alpha 2 +----------------------------- + +`Release date: 2020-11-03' + +* Menu: + +* Security: Security<11>. +* Core and Builtins: Core and Builtins<22>. +* Library: Library<21>. +* Documentation: Documentation<21>. +* Tests: Tests<21>. +* Build: Build<22>. +* Windows: Windows<20>. +* macOS: macOS<14>. +* IDLE: IDLE<13>. +* C API: C API<19>. + + +File: python.info, Node: Security<11>, Next: Core and Builtins<22>, Up: Python 3 10 0 alpha 2 + +1.21.22.1 Security +.................. + + - bpo-42103(1): Prevented potential DoS attack via CPU and RAM + exhaustion when processing malformed Apple Property List files in + binary format. + + - bpo-42051(2): The *note plistlib: cc. 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42103 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42051 + + +File: python.info, Node: Core and Builtins<22>, Next: Library<21>, Prev: Security<11>, Up: Python 3 10 0 alpha 2 + +1.21.22.2 Core and Builtins +........................... + + - bpo-42236(1): If the ‘nl_langinfo(CODESET)’ function returns an + empty string, Python now uses UTF-8 as the filesystem encoding. + Patch by Victor Stinner. + + - bpo-42218(2): 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. + + - bpo-42214(3): Fixed a possible crash in the PEG parser when + checking for the ‘!=’ token in the ‘barry_as_flufl’ rule. Patch by + Pablo Galindo. + + - bpo-42206(4): Propagate and raise the errors caused by + ‘PyAST_Validate()’ in the parser. + + - bpo-41796(5): The *note ast: 7. module internal state is now per + interpreter. Patch by Victor Stinner. + + - bpo-42143(6): Fix handling of errors during creation of + ‘PyFunctionObject’, which resulted in operations on uninitialized + memory. Patch by Yonatan Goldschmidt. + + - bpo-41659(7): Fix a bug in the parser, where a curly brace + following a ‘primary’ didn’t fail immediately. This led to invalid + expressions like ‘a {b}’ to throw a *note SyntaxError: 2d6. with a + wrong offset, or invalid expressions ending with a curly brace like + ‘a {’ to not fail immediately in the REPL. + + - bpo-42150(8): Fix possible buffer overflow in the new parser when + checking for continuation lines. Patch by Pablo Galindo. + + - bpo-42123(9): 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. + + - bpo-42093(10): The ‘LOAD_ATTR’ instruction now uses new “per opcode + cache” mechanism and it is about 36% faster now. Patch by Pablo + Galindo and Yury Selivanov. + + - bpo-42030(11): 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. + + - bpo-41984(12): The garbage collector now tracks all user-defined + classes. Patch by Brandt Bucher. + + - bpo-41993(13): Fixed potential issues with removing not completely + initialized module from ‘sys.modules’ when import fails. + + - bpo-41979(14): Star-unpacking is now allowed for with item’s + targets in the PEG parser. + + - bpo-41974(15): Removed special methods ‘__int__’, ‘__float__’, + ‘__floordiv__’, ‘__mod__’, ‘__divmod__’, ‘__rfloordiv__’, + ‘__rmod__’ and ‘__rdivmod__’ of the *note complex: 1b8. class. + They always raised a *note TypeError: 19c. + + - bpo-41902(16): Micro optimization when compute *note sq_item: 1333. + and *note mp_subscript: 1334. of *note range: 58b. Patch by + Dong-hee Na. + + - bpo-41894(17): 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. + + - bpo-41902(18): Micro optimization for range.index if step is 1. + Patch by Dong-hee Na. + + - bpo-41435(19): Add *note sys._current_exceptions(): 1335. 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. + + - bpo-38605(20): Enable ‘from __future__ import annotations’ ( PEP + 563(21)) by default. The values found in ‘__annotations__’ dicts + are now strings, e.g. ‘{"x": "int"}’ instead of ‘{"x": int}’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42236 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42218 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42214 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=42206 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41796 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42143 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41659 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42150 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42123 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=42093 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=42030 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=41984 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=41993 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=41979 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=41974 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=41902 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=41894 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=41902 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=41435 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=38605 + + (21) https://peps.python.org/pep-0563/ + + +File: python.info, Node: Library<21>, Next: Documentation<21>, Prev: Core and Builtins<22>, Up: Python 3 10 0 alpha 2 + +1.21.22.3 Library +................. + + - bpo-35455(1): On Solaris, *note thread_time(): 57e. is now + implemented with ‘gethrvtime()’ because + ‘clock_gettime(CLOCK_THREAD_CPUTIME_ID)’ is not always available. + Patch by Jakub Kulik. + + - bpo-42233(2): The *note repr(): 3ee. of *note typing: 123. types + containing *note Generic Alias Types: 278. previously did not show + the parameterized types in the ‘GenericAlias’. They have now been + changed to do so. + + - bpo-29566(3): ‘binhex.binhex()’ consistently writes macOS 9 line + endings. + + - bpo-26789(4): The *note logging.FileHandler: 129b. class now keeps + a reference to the builtin *note open(): 30b. function to be able + to open or reopen the file during Python finalization. Fix errors + like: ‘NameError: name 'open' is not defined’. Patch by Victor + Stinner. + + - bpo-42157(5): Removed the ‘unicodedata.ucnhash_CAPI’ attribute + which was an internal PyCapsule object. The related private + ‘_PyUnicode_Name_CAPI’ structure was moved to the internal C API. + Patch by Victor Stinner. + + - bpo-42157(6): Convert the *note unicodedata: 124. extension module + to the multiphase initialization API ( PEP 489(7)) and convert the + ‘unicodedata.UCD’ static type to a heap type. Patch by Mohamed + Koubaa and Victor Stinner. + + - bpo-42146(8): Fix memory leak in *note subprocess.Popen(): 6e8. in + case an uid (gid) specified in ‘user’ (‘group’, ‘extra_groups’) + overflows ‘uid_t’ (‘gid_t’). + + - bpo-42103(9): ‘InvalidFileException’ and *note RecursionError: 9e7. + are now the only errors caused by loading malformed binary Plist + file (previously ValueError and TypeError could be raised in some + specific cases). + + - bpo-41490(10): In ‘importlib.resources’, ‘.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. + + - bpo-41052(11): Pickling heap types implemented in C with protocols + 0 and 1 raises now an error instead of producing incorrect data. + + - bpo-42089(12): In ‘importlib.metadata.PackageNotFoundError’, make + reference to the package metadata being missing to improve the user + experience. + + - bpo-41491(13): plistlib: fix parsing XML plists with hexadecimal + integer values + + - bpo-42065(14): Fix an incorrectly formatted error from + ‘_codecs.charmap_decode()’ when called with a mapped value outside + the range of valid Unicode code points. PR by Max Bernstein. + + - bpo-41966(15): Fix pickling pure Python *note datetime.time: 4bf. + subclasses. Patch by Dean Inwood. + + - bpo-19270(16): *note sched.scheduler.cancel(): 1337. will now + cancel the correct event, if two events with same priority are + scheduled for the same time. Patch by Bar Harel. + + - bpo-28660(17): *note textwrap.wrap(): 12ad. now attempts to break + long words after hyphens when ‘break_long_words=True’ and + ‘break_on_hyphens=True’. + + - bpo-35823(18): Use ‘vfork()’ instead of ‘fork()’ for *note + subprocess.Popen(): 6e8. on Linux to improve performance in cases + where it is deemed safe. + + - bpo-42043(19): Add support for ‘zipfile.Path’ inheritance. + ‘zipfile.Path.is_file()’ now returns False for non-existent names. + ‘zipfile.Path’ objects now expose a ‘.filename’ attribute and rely + on that to resolve ‘.name’ and ‘.parent’ when the ‘Path’ object is + at the root of the zipfile. + + - bpo-42021(20): Fix possible ref leaks in *note sqlite3: ef. module + init. + + - bpo-39101(21): Fixed tests using IsolatedAsyncioTestCase from + hanging on BaseExceptions. + + - bpo-41976(22): Fixed a bug that was causing *note + ctypes.util.find_library(): 9c4. to return ‘None’ when triying to + locate a library in an environment when gcc>=9 is available and + ‘ldconfig’ is not. Patch by Pablo Galindo + + - bpo-41943(23): Fix bug where TestCase.assertLogs doesn’t correctly + filter messages by level. + + - bpo-41923(24): Implement PEP 613(25), introducing *note + typing.TypeAlias: 1338. annotation. + + - bpo-41905(26): 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. + + - bpo-23706(27): Added `newline' parameter to + ‘pathlib.Path.write_text()’. + + - bpo-41876(28): Tkinter font class repr uses font name + + - bpo-41831(29): ‘str()’ for the ‘type’ attribute of the + ‘tkinter.Event’ object always returns now the numeric code returned + by Tk instead of the name of the event type. + + - bpo-39337(30): ‘encodings.normalize_encoding()’ now ignores + non-ASCII characters. + + - bpo-41747(31): Ensure all methods that generated from *note + dataclasses.dataclass(): 193. objects now have the proper + ‘__qualname__’ attribute referring to the class they belong to. + Patch by Batuhan Taskaya. + + - bpo-30681(32): Handle exceptions caused by unparsable date headers + when using email “default” policy. Patch by Tim Bell, Georges Toth + + - bpo-41586(33): Add F_SETPIPE_SZ and F_GETPIPE_SZ to fcntl module. + Allow setting pipesize on subprocess.Popen. + + - bpo-41229(34): Add ‘contextlib.aclosing’ for deterministic cleanup + of async generators which is analogous to ‘contextlib.closing’ for + non-async generators. Patch by Joongi Kim and John Belmonte. + + - bpo-16396(35): Allow ‘ctypes.wintypes’ to be imported on + non-Windows systems. + + - bpo-4356(36): Add a key function to the bisect module. + + - bpo-40592(37): *note shutil.which(): 1339. now ignores empty + entries in ‘PATHEXT’ instead of treating them as a match. + + - bpo-40492(38): Fix ‘--outfile’ for *note cProfile: 26. / *note + profile: d0. not writing the output file in the original directory + when the program being profiled changes the working directory. PR + by Anthony Sottile. + + - bpo-34204(39): The *note shelve: e4. module now uses *note + pickle.DEFAULT_PROTOCOL: 421. by default instead of *note pickle: + c7. protocol ‘3’. + + - bpo-27321(40): Fixed KeyError exception when flattening an email to + a string attempts to replace a non-existent + Content-Transfer-Encoding header. + + - bpo-38976(41): The *note http.cookiejar: 90. 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35455 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42233 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29566 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26789 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=42157 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=42157 + + (7) https://peps.python.org/pep-0489/ + + (8) https://bugs.python.org/issue?@action=redirect&bpo=42146 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=42103 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41490 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=41052 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=42089 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=41491 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=42065 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=41966 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=19270 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28660 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=35823 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=42043 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=42021 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=39101 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=41976 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=41943 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=41923 + + (25) https://peps.python.org/pep-0613/ + + (26) https://bugs.python.org/issue?@action=redirect&bpo=41905 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=23706 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=41876 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=41831 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=39337 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=41747 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=30681 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=41586 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=41229 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=16396 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=4356 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=40592 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=40492 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=34204 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=27321 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=38976 + + +File: python.info, Node: Documentation<21>, Next: Tests<21>, Prev: Library<21>, Up: Python 3 10 0 alpha 2 + +1.21.22.4 Documentation +....................... + + - bpo-42061(1): Document __format__ functionality for IP addresses. + + - bpo-41910(2): Document the default implementation of *note + object.__eq__: 74f. + + - bpo-42010(3): Clarify that subscription expressions are also valid + for certain *note classes: 133b. and *note types: 133c. in the + standard library, and for user-defined classes and types if the + classmethod ‘__class_getitem__()’ is provided. + + - bpo-41805(4): Documented *note generic alias type: 278. and *note + types.GenericAlias: 3dd. Also added an entry in glossary for *note + generic types: 133d. + + - bpo-39693(5): Fix tarfile’s extractfile documentation + + - bpo-39416(6): Document some restrictions on the default string + representations of numeric classes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42061 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41910 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=42010 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41805 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39693 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39416 + + +File: python.info, Node: Tests<21>, Next: Build<22>, Prev: Documentation<21>, Up: Python 3 10 0 alpha 2 + +1.21.22.5 Tests +............... + + - bpo-41739(1): Fix + test_logging.test_race_between_set_target_and_flush(): the test now + waits until all threads complete to avoid leaking running threads. + + - bpo-41970(2): Avoid a test failure in ‘test_lib2to3’ if the module + has already imported at the time the test executes. Patch by Pablo + Galindo. + + - bpo-41944(3): Tests for CJK codecs no longer call ‘eval()’ on + content received via HTTP. + + - bpo-41306(4): Fixed a failure in ‘test_tk.test_widgets.ScaleTest’ + happening when executing the test with Tk 8.6.10. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41739 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41970 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41944 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41306 + + +File: python.info, Node: Build<22>, Next: Windows<20>, Prev: Tests<21>, Up: Python 3 10 0 alpha 2 + +1.21.22.6 Build +............... + + - bpo-38980(1): Add ‘-fno-semantic-interposition’ to both the compile + and link line when building with ‘--enable-optimizations’. Patch + by Victor Stinner and Pablo Galindo. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38980 + + +File: python.info, Node: Windows<20>, Next: macOS<14>, Prev: Build<22>, Up: Python 3 10 0 alpha 2 + +1.21.22.7 Windows +................. + + - bpo-38439(1): Updates the icons for IDLE in the Windows Store + package. + + - bpo-38252(2): Use 8-byte step to detect ASCII sequence in 64-bit + Windows build. + + - bpo-39107(3): Update Tcl and Tk to 8.6.10 in Windows installer. + + - bpo-41557(4): Update Windows installer to use SQLite 3.33.0. + + - bpo-38324(5): Avoid Unicode errors when accessing certain locale + data on Windows. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38439 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38252 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39107 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41557 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38324 + + +File: python.info, Node: macOS<14>, Next: IDLE<13>, Prev: Windows<20>, Up: Python 3 10 0 alpha 2 + +1.21.22.8 macOS +............... + + - bpo-41471(1): Ignore invalid prefix lengths in system proxy + excludes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41471 + + +File: python.info, Node: IDLE<13>, Next: C API<19>, Prev: macOS<14>, Up: Python 3 10 0 alpha 2 + +1.21.22.9 IDLE +.............. + + - bpo-33987(1): Mostly finish using ttk widgets, mainly for editor, + settings, and searches. Some patches by Mark Roseman. + + - bpo-40511(2): 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. + + - bpo-38439(3): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33987 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40511 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38439 + + +File: python.info, Node: C API<19>, Prev: IDLE<13>, Up: Python 3 10 0 alpha 2 + +1.21.22.10 C API +................ + + - bpo-42157(1): The private ‘_PyUnicode_Name_CAPI’ structure of the + PyCapsule API ‘unicodedata.ucnhash_CAPI’ has been moved to the + internal C API. Patch by Victor Stinner. + + - bpo-42015(2): Fix potential crash in deallocating method objects + when dynamically allocated ‘PyMethodDef’’s lifetime is managed + through the ‘self’ argument of a ‘PyCFunction’. + + - bpo-40423(3): The *note subprocess: f6. module and ‘os.closerange’ + will now use the ‘close_range(low, high, flags)’ syscall when it is + available for more efficient closing of ranges of descriptors. + + - bpo-41845(4): *note PyObject_GenericGetDict(): 1344. is available + again in the limited API when targeting 3.10 or later. + + - bpo-40422(5): Add ‘_Py_closerange’ function to provide performant + closing of a range of file descriptors. + + - bpo-41986(6): ‘Py_FileSystemDefaultEncodeErrors’ and ‘Py_UTF8Mode’ + are available again in limited API. + + - bpo-41756(7): Add ‘PyIter_Send’ function to allow sending value + into generator/coroutine/iterator without raising StopIteration + exception to signal return. + + - bpo-41784(8): Added ‘PyUnicode_AsUTF8AndSize’ to the limited C API. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=42157 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=42015 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40423 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41845 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40422 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41986 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41756 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41784 + + +File: python.info, Node: Python 3 10 0 alpha 1, Next: Python 3 9 0 beta 1, Prev: Python 3 10 0 alpha 2, Up: Changelog + +1.21.23 Python 3.10.0 alpha 1 +----------------------------- + +`Release date: 2020-10-05' + +* Menu: + +* Security: Security<12>. +* Core and Builtins: Core and Builtins<23>. +* Library: Library<22>. +* Documentation: Documentation<22>. +* Tests: Tests<22>. +* Build: Build<23>. +* Windows: Windows<21>. +* macOS: macOS<15>. +* IDLE: IDLE<14>. +* C API: C API<20>. + + +File: python.info, Node: Security<12>, Next: Core and Builtins<23>, Up: Python 3 10 0 alpha 1 + +1.21.23.1 Security +.................. + + - bpo-41304(1): Fixes ‘python3x._pth’ being ignored on Windows, + caused by the fix for bpo-29778(2) (CVE-2020-15801). + + - bpo-41162(3): Audit hooks are now cleared later during finalization + to avoid missing events. + + - bpo-29778(4): Ensure ‘python3.dll’ is loaded from correct locations + when Python is embedded (CVE-2020-15523). + + - bpo-41004(5): 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). + + - bpo-39603(6): Prevent http header injection by rejecting control + characters in http.client.putrequest(…). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41304 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29778 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41162 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29778 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41004 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39603 + + +File: python.info, Node: Core and Builtins<23>, Next: Library<22>, Prev: Security<12>, Up: Python 3 10 0 alpha 1 + +1.21.23.2 Core and Builtins +........................... + + - bpo-41909(1): Fixed stack overflow in *note issubclass(): 3ac. and + *note isinstance(): 3ab. when getting the ‘__bases__’ attribute + leads to infinite recursion. + + - bpo-41922(2): Speed up calls to ‘reversed()’ by using the PEP + 590(3) ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + - bpo-41873(4): Calls to ‘float()’ are now faster due to the + ‘vectorcall’ calling convention. Patch by Dennis Sweeney. + + - bpo-41870(5): Speed up calls to ‘bool()’ by using the PEP 590(6) + ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + - bpo-1635741(7): Port the ‘_bisect’ module to the multi-phase + initialization API ( PEP 489(8)). + + - bpo-39934(9): Correctly count control blocks in ‘except’ in + compiler. Ensures that a syntax error, rather a fatal error, + occurs for deeply nested, named exception handlers. + + - bpo-41780(10): Fix ‘__dir__()’ of *note types.GenericAlias: 3dd. + Patch by Batuhan Taskaya. + + - bpo-1635741(11): Port the ‘_lsprof’ extension module to multi-phase + initialization ( PEP 489(12)). + + - bpo-1635741(13): Port the *note cmath: 17. extension module to + multi-phase initialization ( PEP 489(14)). + + - bpo-1635741(15): Port the ‘_scproxy’ extension module to + multi-phase initialization ( PEP 489(16)). + + - bpo-1635741(17): Port the *note termios: 100. extension module to + multi-phase initialization ( PEP 489(18)). + + - bpo-1635741(19): Convert the ‘_sha256’ extension module types to + heap types. + + - bpo-41690(20): Fix a possible stack overflow in the parser when + parsing functions and classes with a huge amount of arguments. + Patch by Pablo Galindo. + + - bpo-1635741(21): Port the ‘_overlapped’ extension module to + multi-phase initialization ( PEP 489(22)). + + - bpo-1635741(23): Port the ‘_curses_panel’ extension module to + multi-phase initialization ( PEP 489(24)). + + - bpo-1635741(25): Port the ‘_opcode’ extension module to multi-phase + initialization ( PEP 489(26)). + + - bpo-41681(27): Fixes the wrong error description in the error + raised by using 2 ‘,’ in format string in f-string and *note + str.format(): 1fc. + + - bpo-41675(28): The implementation of *note signal.siginterrupt(): + de2. now uses ‘sigaction()’ (if it is available in the system) + instead of the deprecated ‘siginterrupt()’. Patch by Pablo + Galindo. + + - bpo-41670(29): Prevent line trace being skipped on platforms not + compiled with ‘USE_COMPUTED_GOTOS’. Fixes issue where some lines + nested within a try-except block were not being traced on Windows. + + - bpo-41654(30): Fix a crash that occurred when destroying subclasses + of *note MemoryError: 127a. Patch by Pablo Galindo. + + - bpo-1635741(31): Port the *note zlib: 14f. extension module to + multi-phase initialization ( PEP 489(32)). + + - bpo-41631(33): The ‘_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 + ‘__import__()’ function to implement lazy import, whereas Python + expected that ‘import _ast’ always return a fully initialized + ‘_ast’ module. + + - bpo-40077(34): Convert ‘_operator’ to use *note PyType_FromSpec(): + 5b8. + + - bpo-1653741(35): Port ‘_sha3’ to multi-phase init. Convert static + types to heap types. + + - bpo-1635741(36): Port the ‘_blake2’ extension module to the + multi-phase initialization API ( PEP 489(37)). + + - bpo-41533(38): Free the stack allocated in ‘va_build_stack’ if + ‘do_mkstack’ fails and the stack is not a ‘small_stack’. + + - bpo-41531(39): Fix a bug that was dropping keys when compiling dict + literals with more than 0xFFFF elements. Patch by Pablo Galindo. + + - bpo-41525(40): The output of ‘python --help’ contains now only + ASCII characters. + + - bpo-1635741(41): Port the ‘_sha1’, ‘_sha512’, and ‘_md5’ extension + modules to multi-phase initialization API ( PEP 489(42)). + + - bpo-41431(43): Optimize ‘dict_merge()’ for copying dict (e.g. + ‘dict(d)’ and ‘{}.update(d)’). + + - bpo-41428(44): Implement PEP 604. This supports (int | str) etc. + in place of Union[str, int]. + + - bpo-41340(45): Removed fallback implementation for ‘strdup’. + + - bpo-38156(46): Handle interrupts that come after EOF correctly in + ‘PyOS_StdioReadline’. + + - bpo-41342(47): *note round(): f7e. with integer argument is now + faster (9–60%). + + - bpo-41334(48): Constructors *note str(): 1b3, *note bytes(): 1b4. + and *note bytearray(): 1a5. are now faster (around 30–40% for small + objects). + + - bpo-41295(49): 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. + + - bpo-41323(50): Bytecode optimizations are performed directly on the + control flow graph. This will result in slightly more compact code + objects in some circumstances. + + - bpo-41247(51): Always cache the running loop holder when running + ‘asyncio.set_running_loop’. + + - bpo-41252(52): Fix incorrect refcounting in _ssl.c’s + ‘_servername_callback()’. + + - bpo-1635741(53): Port *note multiprocessing: b5. to multi-phase + initialization + + - bpo-1635741(54): Port ‘winapi’ to multiphase initialization + + - bpo-41215(55): 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. + + - bpo-41218(56): 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. + + - bpo-1635741(57): Port *note faulthandler: 78. to multiphase + initialization. + + - bpo-1635741(58): Port ‘sha256’ to multiphase initialization + + - bpo-41175(59): Guard against a NULL pointer dereference within + bytearrayobject triggered by the ‘bytearray() + bytearray()’ + operation. + + - bpo-41100(60): add arm64 to the allowable Mac OS arches in + mpdecimal.h + + - bpo-41094(61): Fix decoding errors with audit when open files with + non-ASCII names on non-UTF-8 locale. + + - bpo-39960(62): The “hackcheck” that prevents sneaking around a + type’s __setattr__() by calling the superclass method was rewritten + to allow C implemented heap types. + + - bpo-41084(63): Prefix the error message with ‘f-string: ‘, when + parsing an f-string expression which throws a *note SyntaxError: + 2d6. + + - bpo-40521(64): Empty frozensets are no longer singletons. + + - bpo-41076(65): 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. + + - bpo-41056(66): 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) + + - bpo-41061(67): Fix incorrect expressions and asserts in hashtable + code and tests. + + - bpo-41052(68): Opt out serialization/deserialization for + _random.Random + + - bpo-40939(69): Rename ‘PyPegen*’ functions to ‘PyParser*’, so that + we can remove the old set of ‘PyParser*’ functions that were using + the old parser, but keep everything backwards-compatible. + + - bpo-35975(70): 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. + + - bpo-40939(71): Remove the remaining files from the old parser and + the ‘symbol’ module. + + - bpo-40077(72): Convert ‘_bz2’ to use *note PyType_FromSpec(): 5b8. + + - bpo-41006(73): The ‘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. + + - bpo-40636(74): *note zip(): 3bc. now supports PEP 618(75)’s + ‘strict’ parameter, which raises a *note ValueError: 1c8. if the + arguments are exhausted at different lengths. Patch by Brandt + Bucher. + + - bpo-1635741(76): Port ‘_gdbm’ to multiphase initialization. + + - bpo-40985(77): Fix a bug that caused the *note SyntaxError: 2d6. + 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. + + - bpo-40958(78): Fix a possible buffer overflow in the PEG parser + when gathering information for emitting syntax errors. Patch by + Pablo Galindo. + + - bpo-1635741(79): Port ‘_dbm’ to multiphase initialization. + + - bpo-40957(80): Fix refleak in _Py_fopen_obj() when PySys_Audit() + fails + + - bpo-40950(81): Add a state to the *note nis: bd. module ( PEP + 3121(82)) and apply the multiphase initialization. Patch by + Dong-hee Na. + + - bpo-40947(83): The Python *note Path Configuration: 4e8. now takes + *note PyConfig.platlibdir: 1348. in account. + + - bpo-40939(84): Remove the old parser, the ‘parser’ module and all + associated support code, command-line options and environment + variables. Patch by Pablo Galindo. + + - bpo-40847(85): 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 ‘NEWLINE’ token was emitted. The + old parser was working around the issue, but the new parser threw a + *note SyntaxError: 2d6. for valid input due to this. For example, + an empty line following a line continuation character was + interpreted as a *note SyntaxError: 2d6. + + - bpo-40890(86): Each dictionary view now has a ‘mapping’ attribute + that provides a *note types.MappingProxyType: 3bb. wrapping the + original dictionary. Patch contributed by Dennis Sweeney. + + - bpo-40889(87): Improved the performance of symmetric difference + operations on dictionary item views. Patch by Dennis Sweeney. + + - bpo-40904(88): Fix possible segfault in the new PEG parser when + parsing f-string containing yield statements with no value + (‘f"{yield}"’). Patch by Pablo Galindo + + - bpo-40903(89): Fixed a possible segfault in the new PEG parser when + producing error messages for invalid assignments of the form + ‘p=p=’. Patch by Pablo Galindo + + - bpo-40880(90): Fix invalid memory read in the new parser when + checking newlines in string literals. Patch by Pablo Galindo. + + - bpo-40883(91): Fix memory leak in when parsing f-strings in the new + parser. Patch by Pablo Galindo + + - bpo-40870(92): Raise *note ValueError: 1c8. when validating custom + AST’s where the constants ‘True’, ‘False’ and ‘None’ are used + within a *note ast.Name: 1349. node. + + - bpo-40854(93): Allow overriding *note sys.platlibdir: 580. via a + new *note PYTHONPLATLIBDIR: 134a. environment variable. + + - bpo-40826(94): Fix GIL usage in ‘PyOS_Readline()’: lock the GIL to + set an exception and pass the Python thread state when checking if + there is a pending signal. + + - bpo-1635741(95): Port *note fcntl: 79. to multiphase + initialization. + + - bpo-19468(96): Delete unnecessary instance check in + importlib.reload(). Patch by Furkan Önder. + + - bpo-40824(97): Unexpected errors in calling the ‘__iter__’ method + are no longer masked by ‘TypeError’ in the *note in: 20a. operator + and functions *note contains(): 518, *note indexOf(): 519. and + *note countOf(): 51a. of the *note operator: c0. module. + + - bpo-40792(98): Attributes ‘start’, ‘stop’ and ‘step’ of the *note + range: 58b. object now always has exact type *note int: 1c7. + Previously, they could have been an instance of a subclass of + ‘int’. + + - bpo-40780(99): Fix a corner case where g-style string formatting of + a float failed to remove trailing zeros. + + - bpo-38964(100): When there’s a *note SyntaxError: 2d6. in the + expression part of an fstring, the filename attribute of the *note + SyntaxError: 2d6. gets correctly set to the name of the file the + fstring resides in. + + - bpo-40750(101): Support the “-d” debug flag in the new PEG parser. + Patch by Pablo Galindo + + - bpo-40217(102): Instances of types created with *note + PyType_FromSpecWithBases(): 4c7. 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. + + - bpo-39573(103): *note Py_TYPE(): 355. is changed to the inline + static function. Patch by Dong-hee Na. + + - bpo-40696(104): Fix a hang that can arise after *note + generator.throw(): 134b. due to a cycle in the exception context + chain. + + - bpo-40521(105): Each interpreter now its has own free lists, + singletons and caches: + + * Free lists: float, tuple, list, dict, frame, context, + asynchronous generator, MemoryError. + + * Singletons: empty tuple, empty bytes string, empty Unicode + string, single byte character, single Unicode (latin1) + character. + + * Slice cache. + + They are no longer shared by all interpreters. + + - bpo-40679(106): Certain *note TypeError: 19c. messages about + missing or extra arguments now include the function’s *note + qualified name: 134c. Patch by Dennis Sweeney. + + - bpo-29590(107): Make the stack trace correct after calling *note + generator.throw(): 134b. on a generator that has yielded from a + ‘yield from’. + + - bpo-4022(108): Improve performance of generators by not raising + internal StopIteration. + + - bpo-1635741(109): Port *note mmap: b1. to multiphase + initialization. + + - bpo-1635741(110): Port ‘_lzma’ to multiphase initialization. + + - bpo-37999(111): Builtin and extension functions that take integer + arguments no longer accept *note Decimal: 3bd.s, *note Fraction: + 210.s and other objects that can be converted to integers only with + a loss (e.g. that have the *note __int__(): 3be. method but do not + have the *note __index__(): 3bf. method). + + - bpo-29882(112): Add *note int.bit_count(): 3b7, counting the number + of ones in the binary representation of an integer. Patch by + Niklas Fiekas. + + - bpo-36982(113): Use ncurses extended color functions when available + to support terminals with 256 colors, and add the new function + *note curses.has_extended_color_support(): 3e6. to indicate whether + extended color support is provided by the underlying ncurses + library. + + - bpo-19569(114): Add the private macros ‘_Py_COMP_DIAG_PUSH’, + ‘_Py_COMP_DIAG_IGNORE_DEPR_DECLS’, and ‘_Py_COMP_DIAG_POP’. + + - bpo-26680(115): The int type now supports the x.is_integer() method + for compatibility with float. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41909 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41922 + + (3) https://peps.python.org/pep-0590/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41873 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41870 + + (6) https://peps.python.org/pep-0590/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (8) https://peps.python.org/pep-0489/ + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39934 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41780 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (12) https://peps.python.org/pep-0489/ + + (13) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (14) https://peps.python.org/pep-0489/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (16) https://peps.python.org/pep-0489/ + + (17) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (18) https://peps.python.org/pep-0489/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=41690 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (22) https://peps.python.org/pep-0489/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (24) https://peps.python.org/pep-0489/ + + (25) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (26) https://peps.python.org/pep-0489/ + + (27) https://bugs.python.org/issue?@action=redirect&bpo=41681 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=41675 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=41670 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=41654 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (32) https://peps.python.org/pep-0489/ + + (33) https://bugs.python.org/issue?@action=redirect&bpo=41631 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=40077 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=1653741 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (37) https://peps.python.org/pep-0489/ + + (38) https://bugs.python.org/issue?@action=redirect&bpo=41533 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=41531 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=41525 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (42) https://peps.python.org/pep-0489/ + + (43) https://bugs.python.org/issue?@action=redirect&bpo=41431 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=41428 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=41340 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=38156 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=41342 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=41334 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=41295 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=41323 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=41247 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=41252 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=41215 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=41218 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=41175 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=41100 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=41094 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=39960 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=41084 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=40521 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=41076 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=41056 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=41061 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=41052 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=40939 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=35975 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=40939 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=40077 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=41006 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=40636 + + (75) https://peps.python.org/pep-0618/ + + (76) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=40985 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=40958 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=40957 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=40950 + + (82) https://peps.python.org/pep-3121/ + + (83) https://bugs.python.org/issue?@action=redirect&bpo=40947 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=40939 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=40847 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=40890 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=40889 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=40904 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=40903 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=40880 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=40883 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=40870 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=40854 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=40826 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=19468 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=40824 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=40792 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=40780 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=38964 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=40750 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=40217 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=40696 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=40521 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=40679 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=29590 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=4022 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=37999 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=29882 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=36982 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=19569 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=26680 + + +File: python.info, Node: Library<22>, Next: Documentation<22>, Prev: Core and Builtins<23>, Up: Python 3 10 0 alpha 1 + +1.21.23.3 Library +................. + + - bpo-41900(1): C14N 2.0 serialisation in xml.etree.ElementTree + failed for unprefixed attributes when a default namespace was + defined. + + - bpo-41887(2): Strip leading spaces and tabs on *note + ast.literal_eval(): 882. Also document stripping of spaces and + tabs for *note eval(): 4a7. + + - bpo-41773(3): Note in documentation that *note random.choices(): + 935. doesn’t support non-finite weights, raise *note ValueError: + 1c8. when given non-finite weights. + + - bpo-41840(4): Fix a bug in the *note symtable: f8. module that was + causing module-scope global variables to not be reported as both + local and global. Patch by Pablo Galindo. + + - bpo-41842(5): Add *note codecs.unregister(): 3da. function to + unregister a codec search function. + + - bpo-40564(6): In ‘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. + + - bpo-40670(7): More reliable validation of statements in *note + timeit.Timer: 134e. It now accepts “empty” statements (only + whitespaces and comments) and rejects misindentent statements. + + - bpo-41833(8): The *note threading.Thread: 59b. constructor now uses + the target name if the `target' argument is specified but the + `name' argument is omitted. + + - bpo-41817(9): fix ‘tkinter.EventType’ Enum so all members are + strings, and none are tuples + + - bpo-41810(10): *note types.EllipsisType: 448, *note + types.NotImplementedType: 44a. and *note types.NoneType: 449. have + been reintroduced, providing a new set of types readily + interpretable by static type checkers. + + - bpo-41815(11): Fix SQLite3 segfault when backing up closed + database. Patch contributed by Peter David McCormick. + + - bpo-41816(12): StrEnum added: it ensures that all members are + already strings or string candidates + + - bpo-41517(13): fix bug allowing Enums to be extended via multiple + inheritance + + - bpo-39587(14): use the correct mix-in data type when constructing + Enums + + - bpo-41792(15): 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’ + + - bpo-41789(16): Honor *note object: 6df. overrides in ‘Enum’ class + creation (specifically, ‘__str__’, ‘__repr__’, ‘__format__’, and + ‘__reduce_ex__’). + + - bpo-32218(17): *note enum.Flag: 1fe. and *note enum.IntFlag: 1fa. + members are now iterable + + - bpo-39651(18): Fix a race condition in the ‘call_soon_threadsafe()’ + method of ‘asyncio.ProactorEventLoop’: do nothing if the self-pipe + socket has been closed. + + - bpo-1635741(19): Port the ‘mashal’ extension module to the + multi-phase initialization API ( PEP 489(20)). + + - bpo-1635741(21): Port the ‘_string’ extension module to the + multi-phase initialization API ( PEP 489(22)). + + - bpo-41732(23): Added an *note iterator: 134f. to *note memoryview: + 6ad. + + - bpo-41720(24): Fixed ‘turtle.Vec2D.__rmul__()’ for arguments which + are not int or float. + + - bpo-41696(25): Fix handling of debug mode in *note asyncio.run(): + 1d7. This allows setting ‘PYTHONASYNCIODEBUG’ or ‘-X dev’ to + enable asyncio debug mode when using *note asyncio.run(): 1d7. + + - bpo-41687(26): Fix implementation of sendfile to be compatible with + Solaris. + + - bpo-41662(27): No longer override exceptions raised in ‘__len__()’ + of a sequence of parameters in *note sqlite3: ef. with *note + ProgrammingError: 247. + + - bpo-39010(28): Restarting a ‘ProactorEventLoop’ on Windows no + longer logs spurious ‘ConnectionResetErrors’. + + - bpo-41638(29): *note ProgrammingError: 247. message for absent + parameter in *note sqlite3: ef. contains now the name of the + parameter instead of its index when parameters are supplied as a + dict. + + - bpo-41662(30): Fixed crash when mutate list of parameters during + iteration in *note sqlite3: ef. + + - bpo-41513(31): Improved the accuracy of math.hypot(). Internally, + each step is computed with extra precision so that the result is + now almost always correctly rounded. + + - bpo-41609(32): The pdb whatis command correctly reports instance + methods as ‘Method’ rather than ‘Function’. + + - bpo-39994(33): Fixed pprint’s handling of dict subclasses that + override __repr__. + + - bpo-32751(34): When cancelling the task due to a timeout, *note + asyncio.wait_for(): 1d5. will now wait until the cancellation is + complete also in the case when `timeout' is <= 0, like it does with + positive timeouts. + + - bpo-37658(35): *note asyncio.wait_for(): 1d5. now properly handles + races between cancellation of itself and the completion of the + wrapped awaitable. + + - bpo-40782(36): Change the method + asyncio.AbstractEventLoop.run_in_executor to not be a coroutine. + + - bpo-41520(37): Fix *note codeop: 1b. regression that prevented + turning compile warnings into errors. + + - bpo-41528(38): turtle uses math module functions to convert degrees + to radians and vice versa and to calculate vector norm + + - bpo-41513(39): Minor algorithmic improvement to math.hypot() and + math.dist() giving small gains in speed and accuracy. + + - bpo-41503(40): Fixed a race between setTarget and flush in + logging.handlers.MemoryHandler. + + - bpo-41497(41): Fix potential UnicodeDecodeError in dis module. + + - bpo-41467(42): On Windows, fix asyncio ‘recv_into()’ return value + when the socket/pipe is closed (*note BrokenPipeError: d0c.): + return ‘0’ rather than an empty byte string (‘b''’). + + - bpo-41425(43): Make tkinter doc example runnable. + + - bpo-41421(44): 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. + + - bpo-41440(45): Add *note os.cpu_count(): 40a. support for VxWorks + RTOS. + + - bpo-41316(46): Fix the *note tarfile: fd. module to write only + basename of TAR file to GZIP compression header. + + - bpo-41384(47): Raise TclError instead of TypeError when an unknown + option is passed to tkinter.OptionMenu. + + - bpo-41317(48): Use add_done_callback() in + asyncio.loop.sock_accept() to unsubscribe reader early on + cancellation. + + - bpo-41364(49): Reduce import overhead of *note uuid: 12e. + + - bpo-35328(50): Set the environment variable ‘VIRTUAL_ENV_PROMPT’ at + *note venv: 12f. activation. + + - bpo-41341(51): Recursive evaluation of *note typing.ForwardRef: + 1237. in ‘get_type_hints’. + + - bpo-41344(52): Prevent creating ‘shared_memory.SharedMemory’ + objects with ‘size=0’. + + - bpo-41333(53): ‘collections.OrderedDict.pop()’ is now 2 times + faster. + + - bpo-41288(54): Unpickling invalid NEWOBJ_EX opcode with the C + implementation raises now UnpicklingError instead of crashing. + + - bpo-39017(55): Avoid infinite loop when reading specially crafted + TAR files using the tarfile module (CVE-2019-20907). + + - bpo-41273(56): Speed up any transport using + ‘_ProactorReadPipeTransport’ by calling ‘recv_into’ instead of + ‘recv’, thus not creating a new buffer for each ‘recv’ call in the + transport’s read loop. + + - bpo-41235(57): Fix the error handling in *note + ssl.SSLContext.load_dh_params(): df2. + + - bpo-41207(58): In distutils.spawn, restore expectation that + DistutilsExecError is raised when the command is not found. + + - bpo-29727(59): Register *note array.array: 3d2. as a *note + MutableSequence: a55. Patch by Pablo Galindo. + + - bpo-39168(60): Remove the ‘__new__’ method of *note typing.Generic: + 11ec. + + - bpo-41194(61): Fix a crash in the ‘_ast’ module: it can no longer + be loaded more than once. It now uses a global state rather than a + module state. + + - bpo-41195(62): Add read-only ssl.SSLContext.security_level + attribute to retrieve the context’s security level. + + - bpo-41193(63): The ‘write_history()’ atexit function of the + readline completer now ignores any *note OSError: 413. to ignore + error if the filesystem is read-only, instead of only ignoring + *note FileNotFoundError: b53. and *note PermissionError: 9b9. + + - bpo-41182(64): selector: use DefaultSelector based upon + implementation + + - bpo-41161(65): The decimal module now requires libmpdec-2.5.0. + Users of –with-system-libmpdec should update their system library. + + - bpo-40874(66): The decimal module now requires libmpdec-2.5.0. + + - bpo-41138(67): Fixed the *note trace: 11c. module CLI for Python + source files with non-UTF-8 encoding. + + - bpo-31082(68): Use the term “iterable” in the docstring for *note + functools.reduce(): f80. + + - bpo-40521(69): Remove freelist from collections.deque(). + + - bpo-31938(70): Fix default-value signatures of several functions in + the *note select: e2. module - by Anthony Sottile. + + - bpo-41068(71): Fixed reading files with non-ASCII names from ZIP + archive directly after writing them. + + - bpo-41058(72): ‘pdb.find_function()’ now correctly determines the + source file encoding. + + - bpo-41056(73): Invalid file descriptor values are now prevented + from being passed to os.fpathconf. (discovered by Coverity) + + - bpo-41056(74): Fix a NULL pointer dereference within the ssl module + during a MemoryError in the keylog callback. (discovered by + Coverity) + + - bpo-41056(75): Fixed an instance where a MemoryError within the + zoneinfo module might not be reported or not reported at its + source. (found by Coverity) + + - bpo-41048(76): *note mimetypes.read_mime_types(): 1350. function + reads the rule file using UTF-8 encoding, not the locale encoding. + Patch by Srinivas Reddy Thatiparthy. + + - bpo-41043(77): Fixed the use of *note glob(): 3f8. in the stdlib: + literal part of the path is now always correctly escaped. + + - bpo-41025(78): Fixed an issue preventing the C implementation of + *note zoneinfo.ZoneInfo: 51d. from being subclassed. + + - bpo-35018(79): Add the *note xml.sax.handler.LexicalHandler: 457. + class that is present in other SAX XML implementations. + + - bpo-41002(80): Improve performance of HTTPResponse.read with a + given amount. Patch by Bruce Merry. + + - bpo-40448(81): *note ensurepip: 75. now disables the use of ‘pip’ + cache when installing the bundled versions of ‘pip’ and + ‘setuptools’. Patch by Krzysztof Konopko. + + - bpo-40967(82): Removed ‘asyncio.Task.current_task()’ and + ‘asyncio.Task.all_tasks()’. Patch contributed by Rémi Lapeyre. + + - bpo-40924(83): Ensure ‘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. + + - bpo-40955(84): Fix a minor memory leak in *note subprocess: f6. + module when extra_groups was specified. + + - bpo-40855(85): The standard deviation and variance functions in the + statistics module were ignoring their mu and xbar arguments. + + - bpo-40939(86): Use the new PEG parser when generating the stdlib + *note keyword: a4. module. + + - bpo-23427(87): Add *note sys.orig_argv: 437. attribute: the list of + the original command line arguments passed to the Python + executable. + + - bpo-33689(88): 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. + + - bpo-40884(89): Added a ‘defaults’ parameter to *note + logging.Formatter: 1351, to allow specifying default values for + custom fields. Patch by Asaf Alon and Bar Harel. + + - bpo-40876(90): Clarify error message in the *note csv: 28. module. + + - bpo-39791(91): Refresh importlib.metadata from importlib_metadata + 1.6.1. + + - bpo-40807(92): Stop codeop._maybe_compile, used by + code.InteractiveInterpreter (and IDLE). from emitting each warning + three times. + + - bpo-32604(93): Fix reference leak in the *note select: e2. module + when the module is imported in a subinterpreter. + + - bpo-39791(94): Built-in loaders (SourceFileLoader and ZipImporter) + now supply ‘TraversableResources’ implementations for + ‘ResourceReader’, and the fallback function has been removed. + + - bpo-39314(95): ‘rlcompleter.Completer’ and the standard Python + shell now close the parenthesis for functions that take no + arguments. Patch contributed by Rémi Lapeyre. + + - bpo-17005(96): The topological sort functionality that was + introduced initially in the *note functools: 7f. module has been + moved to a new *note graphlib: 85. module to better accommodate the + new tools and keep the original scope of the *note functools: 7f. + module. Patch by Pablo Galindo + + - bpo-40834(97): Fix truncate when sending str object + with_xxsubinterpreters.channel_send. + + - bpo-40755(98): Add rich comparisons to collections.Counter(). + + - bpo-26407(99): Unexpected errors in calling the ‘__iter__’ method + are no longer masked by ‘TypeError’ in *note csv.reader(): 1352, + ‘csv.writer.writerow()’ and ‘csv.writer.writerows()’. + + - bpo-39384(100): Fixed email.contentmanager to allow set_content() + to set a null string. + + - bpo-40744(101): The *note sqlite3: ef. 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. + + - bpo-40777(102): Initialize PyDateTime_IsoCalendarDateType.tp_base + at run-time to avoid errors on some compilers. + + - bpo-38488(103): Update ensurepip to install pip 20.1.1 and + setuptools 47.1.0. + + - bpo-40792(104): The result of *note operator.index(): 1314. now + always has exact type *note int: 1c7. Previously, the result could + have been an instance of a subclass of ‘int’. + + - bpo-40767(105): *note webbrowser: 133. now properly finds the + default browser in pure Wayland systems by checking the + WAYLAND_DISPLAY environment variable. Patch contributed by Jérémy + Attali. + + - bpo-40791(106): ‘hashlib.compare_digest()’ uses OpenSSL’s + ‘CRYPTO_memcmp()’ function when OpenSSL is available. + + - bpo-40795(107): *note ctypes: 29. 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 + *note PyErr_Print(): 1353. + + - bpo-16995(108): Add *note base64.b32hexencode(): 3d5. and *note + base64.b32hexdecode(): 3d6. to support the Base32 Encoding with + Extended Hex Alphabet. + + - bpo-30008(109): Fix *note ssl: f0. code to be compatible with + OpenSSL 1.1.x builds that use ‘no-deprecated’ and ‘--api=1.1.0’. + + - bpo-30064(110): Fix asyncio ‘loop.sock_*’ race condition issue + + - bpo-40759(111): Deprecate the ‘symbol’ module. + + - bpo-40756(112): The second argument (extra) of + ‘LoggerAdapter.__init__’ now defaults to None. + + - bpo-37129(113): Add a new *note os.RWF_APPEND: 1354. flag for *note + os.pwritev(): 7bc. + + - bpo-40737(114): Fix possible reference leak for *note sqlite3: ef. + initialization. + + - bpo-40726(115): Handle cases where the ‘end_lineno’ is ‘None’ on + *note ast.increment_lineno(): 1355. + + - bpo-40698(116): *note distutils: 37. upload creates SHA2-256 and + Blake2b-256 digests. MD5 digests is skipped if platform blocks + MD5. + + - bpo-40695(117): *note hashlib: 88. no longer falls back to builtin + hash implementations when OpenSSL provides a hash digest and the + algorithm is blocked by security policy. + + - bpo-9216(118): func:*note hashlib.new: 1356. passed + ‘usedforsecurity’ to OpenSSL EVP constructor ‘_hashlib.new()’. + test_hashlib and test_smtplib handle strict security policy better. + + - bpo-40614(119): *note ast.parse(): 619. will not parse self + documenting expressions in f-strings when passed ‘feature_version’ + is less than ‘(3, 8)’. + + - bpo-40626(120): 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. + + - bpo-25920(121): On macOS, when building Python for macOS 10.4 and + older, which wasn’t the case for python.org macOS installer, *note + socket.getaddrinfo(): 1357. no longer uses an internal lock to + prevent race conditions when calling ‘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 *note socket.getaddrinfo(): 1357. The lock was + also used on FreeBSD older than 5.3, OpenBSD older than 201311 and + NetBSD older than 4. + + - bpo-40671(122): Prepare ‘_hashlib’ for PEP 489(123) and use *note + PyModule_AddType(): 5ca. + + - bpo-32309(124): Added a new *note coroutine: 525. *note + asyncio.to_thread(): 528. 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 *note + run_in_executor(): 529. that can directly take keyword arguments. + + - bpo-36543(125): Restored the deprecated ‘xml.etree.cElementTree’ + module. + + - bpo-40611(126): *note MAP_POPULATE: 1358. constant has now been + added to the list of exported *note mmap: b1. module flags. + + - bpo-39881(127): PEP 554 for use in the test suite. (Patch By + Joannah Nanjekye) + + - bpo-13097(128): ‘ctypes’ now raises an ‘ArgumentError’ when a + callback is invoked with more than 1024 arguments. + + - bpo-39385(129): A new test assertion context-manager, + ‘unittest.assertNoLogs()’ will ensure a given block of code emits + no log messages using the logging module. Contributed by Kit Yan + Choi. + + - bpo-23082(130): Updated the error message and docs of + PurePath.relative_to() to better reflect the function behaviour. + + - bpo-40318(131): Use SQLite3 trace v2 API, if it is available. + + - bpo-40105(132): ZipFile truncates files to avoid corruption when a + shorter comment is provided in append (“a”) mode. Patch by Jan + Mazur. + + - bpo-40084(133): Fix ‘Enum.__dir__’: dir(Enum.member) now includes + attributes as well as methods. + + - bpo-31122(134): ssl.wrap_socket() now raises ssl.SSLEOFError rather + than OSError when peer closes connection during TLS negotiation + + - bpo-39728(135): fix default ‘_missing_’ so a duplicate *note + ValueError: 1c8. is not set as the ‘__context__’ of the original + *note ValueError: 1c8. + + - bpo-39244(136): Fixed + ‘multiprocessing.context.get_all_start_methods’ to properly return + the default method first on macOS. + + - bpo-39040(137): Fix parsing of invalid mime headers parameters by + collapsing whitespace between encoded words in a bare-quote-string. + + - bpo-38731(138): Add ‘--quiet’ option to command-line interface of + *note py_compile: d4. Patch by Gregory Schevchenko. + + - bpo-35714(139): *note struct.error: fbf. is now raised if there is + a null character in a *note struct: f5. format string. + + - bpo-38144(140): Added the `root_dir' and `dir_fd' parameters in + *note glob.glob(): 3f8. + + - bpo-26543(141): Fix ‘IMAP4.noop()’ when debug mode is enabled (ex: + ‘imaplib.Debug = 3’). + + - bpo-12178(142): *note csv.writer(): 10f9. now correctly escapes + `escapechar' when input contains `escapechar'. Patch by Catalin + Iacob, Berker Peksag, and Itay Elbirt. + + - bpo-36290(143): AST nodes are now raising *note TypeError: 19c. on + conflicting keyword arguments. Patch contributed by Rémi Lapeyre. + + - bpo-33944(144): Added site.py site-packages tracing in verbose + mode. + + - bpo-35078(145): 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 + + - bpo-29620(146): *note assertWarns(): e18. no longer raises a + ‘RuntimeException’ when accessing a module’s ‘__warningregistry__’ + causes importation of a new module, or when a new module is + imported in another thread. Patch by Kernc. + + - bpo-31844(147): Remove ‘ParserBase.error()’ method from the private + and undocumented ‘_markupbase’ module. *note + html.parser.HTMLParser: 499. is the only subclass of ‘ParserBase’ + and its ‘error()’ implementation was deprecated in Python 3.4 and + removed in Python 3.5. + + - bpo-34226(148): Fix *note cgi.parse_multipart: 455. without + content_length. Patch by Roger Duran + + - bpo-33660(149): Fix pathlib.PosixPath to resolve a relative path + located on the root directory properly. + + - bpo-28557(150): Improve the error message for a misbehaving + ‘rawio.readinto’ + + - bpo-26680(151): The d.is_integer() method is added to the Decimal + type, for compatibility with other number types. + + - bpo-26680(152): The x.is_integer() method is incorporated into the + abstract types of the numeric tower, Real, Rational and Integral, + with appropriate default implementations. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41900 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41887 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41773 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41840 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41842 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40564 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40670 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41833 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41817 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41810 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=41815 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=41816 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=41517 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39587 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=41792 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=41789 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32218 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=39651 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (20) https://peps.python.org/pep-0489/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (22) https://peps.python.org/pep-0489/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=41732 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=41720 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=41696 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=41687 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=41662 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=39010 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=41638 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=41662 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=41513 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=41609 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=39994 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=32751 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=37658 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=40782 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=41520 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=41528 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=41513 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=41503 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=41497 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=41467 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=41425 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=41421 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=41440 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=41316 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=41384 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=41317 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=41364 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=35328 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=41341 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=41344 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=41333 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=41288 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=39017 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=41273 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=41235 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=41207 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=29727 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=39168 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=41194 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=41195 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=41193 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=41182 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=41161 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=40874 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=41138 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=31082 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=40521 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=31938 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=41068 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=41058 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=41056 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=41056 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=41056 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=41048 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=41043 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=41025 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=35018 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=41002 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=40448 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=40967 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=40924 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=40955 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=40855 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=40939 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=23427 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=33689 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=40884 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=40876 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=39791 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=40807 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=32604 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=39791 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=39314 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=17005 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=40834 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=40755 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=26407 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=39384 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=40744 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=40777 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=38488 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=40792 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=40767 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=40791 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=40795 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=16995 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=30008 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=30064 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=40759 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=40756 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=37129 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=40737 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=40726 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=40698 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=40695 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=9216 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=40614 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=40626 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=25920 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=40671 + + (123) https://peps.python.org/pep-0489/ + + (124) https://bugs.python.org/issue?@action=redirect&bpo=32309 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=36543 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=40611 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=39881 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=13097 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=39385 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=23082 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=40318 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=40105 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=40084 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=31122 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=39728 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=39244 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=39040 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=38731 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=35714 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=38144 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=26543 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=12178 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=36290 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=33944 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=35078 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=29620 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=31844 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=34226 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=33660 + + (150) https://bugs.python.org/issue?@action=redirect&bpo=28557 + + (151) https://bugs.python.org/issue?@action=redirect&bpo=26680 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=26680 + + +File: python.info, Node: Documentation<22>, Next: Tests<22>, Prev: Library<22>, Up: Python 3 10 0 alpha 1 + +1.21.23.4 Documentation +....................... + + - bpo-41428(1): Add documentation for PEP 604(2) (Allow writing union + types as ‘X | Y’). + + - bpo-41774(3): In Programming FAQ “Sequences (Tuples/Lists)” + section, add “How do you remove multiple items from a list”. + + - bpo-35293(4): Fix RemovedInSphinx40Warning when building the + documentation. Patch by Dong-hee Na. + + - bpo-37149(5): 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. + + - bpo-41726(6): Update the refcounts info of + ‘PyType_FromModuleAndSpec’. + + - bpo-41624(7): Fix the signature of *note typing.Coroutine: 135a. + + - bpo-40204(8): Enable Sphinx 3.2 ‘c_allow_pre_v3’ option and disable + ‘c_warn_on_allowed_pre_v3’ option to make the documentation + compatible with Sphinx 2 and Sphinx 3. + + - bpo-41045(9): Add documentation for debug feature of f-strings. + + - bpo-41314(10): Changed the release when ‘from __future__ import + annotations’ becomes the default from ‘4.0’ to ‘3.10’ (following a + change in PEP 563). + + - bpo-40979(11): Refactored typing.rst, arranging more than 70 + classes, functions, and decorators into new sub-sections. + + - bpo-40552(12): Fix in tutorial section 4.2. Code snippet is now + correct. + + - bpo-39883(13): 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. + + - bpo-37703(14): Updated Documentation to comprehensively elaborate + on the behaviour of gather.cancel() + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41428 + + (2) https://peps.python.org/pep-0604/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41774 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35293 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=37149 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41726 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41624 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40204 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41045 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41314 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40979 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=40552 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39883 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=37703 + + +File: python.info, Node: Tests<22>, Next: Build<23>, Prev: Documentation<22>, Up: Python 3 10 0 alpha 1 + +1.21.23.5 Tests +............... + + - bpo-41939(1): Fix test_site.test_license_exists_at_url(): call + ‘urllib.request.urlcleanup()’ to reset the global + ‘urllib.request._opener’. Patch by Victor Stinner. + + - bpo-41731(2): Make test_cmd_line_script pass with option ‘-vv’. + + - bpo-41602(3): Add tests for SIGINT handling in the runpy module. + + - bpo-41521(4): *note test.support: 102.: Rename ‘blacklist’ + parameter of *note check__all__(): 135c. to ‘not_exported’. + + - bpo-41477(5): Make ctypes optional in test_genericalias. + + - bpo-41085(6): Fix integer overflow in the *note + array.array.index(): 3d1. method on 64-bit Windows for index larger + than ‘2**31’. + + - bpo-41069(7): ‘test.support.TESTFN’ and the current directory for + tests when run via ‘test.regrtest’ contain now non-ascii characters + if possible. + + - bpo-38377(8): On Linux, skip tests using multiprocessing if the + current user cannot create a file in ‘/dev/shm/’ directory. Add + the *note skip_if_broken_multiprocessing_synchronize(): 135d. + function to the *note test.support: 102. module. + + - bpo-41009(9): Fix use of + ‘support.require_{linux|mac|freebsd}_version()’ decorators as class + decorator. + + - bpo-41003(10): Fix ‘test_copyreg’ when ‘numpy’ is installed: + ‘test.pickletester’ now saves/restores warnings filters when + importing ‘numpy’, to ignore filters installed by ‘numpy’. + + - bpo-40964(11): Disable remote *note imaplib: 94. tests, host + cyrus.andrew.cmu.edu is blocking incoming connections. + + - bpo-40927(12): Fix test_binhex when run twice: it now uses + import_fresh_module() to ensure that it raises DeprecationWarning + each time. + + - bpo-17258(13): Skip some *note multiprocessing: b5. tests when MD5 + hash digest is blocked. + + - bpo-31904(14): Increase LOOPBACK_TIMEOUT to 10 for VxWorks RTOS. + + - bpo-38169(15): Increase code coverage for SharedMemory and + ShareableList + + - bpo-34401(16): Make test_gdb properly run on HP-UX. Patch by + Michael Osipov. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41939 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41731 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41602 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41521 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41477 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41085 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41069 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38377 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41009 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41003 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40964 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=40927 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=17258 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=38169 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=34401 + + +File: python.info, Node: Build<23>, Next: Windows<21>, Prev: Tests<22>, Up: Python 3 10 0 alpha 1 + +1.21.23.6 Build +............... + + - bpo-38249(1): Update *note Py_UNREACHABLE: 817. to use + __builtin_unreachable() if only the compiler is able to use it. + Patch by Dong-hee Na. + + - bpo-41617(2): Fix ‘pycore_bitutils.h’ header file to support old + clang versions: ‘__builtin_bswap16()’ is not available in LLVM + clang 3.0. + + - bpo-40204(3): Pin Sphinx version to 2.3.1 in ‘Doc/Makefile’. + + - bpo-36020(4): The C99 functions ‘snprintf()’ and ‘vsnprintf()’ are + now required to build Python. + + - bpo-40684(5): ‘make install’ now uses the ‘PLATLIBDIR’ variable for + the destination ‘lib-dynload/’ directory when ‘./configure + --with-platlibdir’ is used. + + - bpo-40683(6): Fixed an issue where the *note zoneinfo: 150. module + and its tests were not included when Python is installed with + ‘make’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38249 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41617 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40204 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36020 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40684 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40683 + + +File: python.info, Node: Windows<21>, Next: macOS<15>, Prev: Build<23>, Up: Python 3 10 0 alpha 1 + +1.21.23.7 Windows +................. + + - bpo-41744(1): Fixes automatic import of props file when using the + Nuget package. + + - bpo-41627(2): The user site directory for 32-bit now includes a + ‘-32’ suffix to distinguish it from the 64-bit interpreter’s + directory. + + - bpo-41526(3): Fixed layout of final page of the installer by + removing the special thanks to Mark Hammond (with his permission). + + - bpo-41492(4): Fixes the description that appears in UAC prompts. + + - bpo-40948(5): Improve post-install message to direct people to the + “py” command. + + - bpo-41412(6): The installer will now fail to install on Windows 7 + and Windows 8. Further, the UCRT dependency is now always + downloaded on demand. + + - bpo-40741(7): Update Windows release to include SQLite 3.32.3. + + - bpo-41142(8): *note msilib: b3. now supports creating CAB files + with non-ASCII file path and adding files with non-ASCII file path + to them. + + - bpo-41074(9): Fixed support of non-ASCII names in functions *note + msilib.OpenDatabase(): 1360. and *note msilib.init_database(): + 1361. and non-ASCII SQL in method *note msilib.Database.OpenView(): + 1362. + + - bpo-41039(10): Stable ABI redirection DLL (python3.dll) now uses + ‘#pragma comment(linker)’ for re-exporting. + + - bpo-40164(11): Updates Windows OpenSSL to 1.1.1g + + - bpo-39631(12): Changes the registered MIME type for ‘.py’ files on + Windows to ‘text/x-python’ instead of ‘text/plain’. + + - bpo-40677(13): Manually define IO_REPARSE_TAG_APPEXECLINK in case + some old Windows SDK doesn’t have it. + + - bpo-37556(14): Extend py.exe help to mention overrides via venv, + shebang, environmental variables & ini files. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41744 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41627 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41526 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41492 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40948 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41412 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40741 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41142 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41074 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41039 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40164 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=39631 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=40677 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=37556 + + +File: python.info, Node: macOS<15>, Next: IDLE<14>, Prev: Windows<21>, Up: Python 3 10 0 alpha 1 + +1.21.23.8 macOS +............... + + - bpo-41557(1): Update macOS installer to use SQLite 3.33.0. + + - bpo-39580(2): Avoid opening Finder window if running installer from + the command line. Patch contributed by Rick Heil. + + - bpo-41100(3): 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. + + - bpo-40741(4): Update macOS installer to use SQLite 3.32.3. + + - bpo-41005(5): fixed an XDG settings issue not allowing macos to + open browser in webbrowser.py + + - bpo-40741(6): Update macOS installer to use SQLite 3.32.2. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41557 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39580 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41100 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40741 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41005 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40741 + + +File: python.info, Node: IDLE<14>, Next: C API<20>, Prev: macOS<15>, Up: Python 3 10 0 alpha 1 + +1.21.23.9 IDLE +.............. + + - bpo-41775(1): Use ‘IDLE Shell’ as shell title + + - bpo-35764(2): Rewrite the Calltips doc section. + + - bpo-40181(3): In calltips, stop reminding that ‘/’ marks the end of + positional-only arguments. + + - bpo-41468(4): Improve IDLE run crash error message (which users + should never see). + + - bpo-41373(5): 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. + + - bpo-41300(6): Save files with non-ascii chars. Fix regression + released in 3.9.0b4 and 3.8.4. + + - bpo-37765(7): Add keywords to module name completion list. Rewrite + Completions section of IDLE doc. + + - bpo-41152(8): The encoding of ‘stdin’, ‘stdout’ and ‘stderr’ in + IDLE is now always UTF-8. + + - bpo-41144(9): Make Open Module open a special module such as + os.path. + + - bpo-39885(10): Make context menu Cut and Copy work again when + right-clicking within a selection. + + - bpo-40723(11): Make test_idle pass when run after import. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41775 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35764 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40181 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41468 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41373 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41300 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37765 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=41152 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=41144 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39885 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40723 + + +File: python.info, Node: C API<20>, Prev: IDLE<14>, Up: Python 3 10 0 alpha 1 + +1.21.23.10 C API +................ + + - bpo-41936(1): Removed undocumented macros ‘Py_ALLOW_RECURSION’ and + ‘Py_END_ALLOW_RECURSION’ and the ‘recursion_critical’ field of the + *note PyInterpreterState: 4fa. structure. + + - bpo-41692(2): The ‘PyUnicode_InternImmortal()’ function is now + deprecated and will be removed in Python 3.12: use *note + PyUnicode_InternInPlace(): 4ed. instead. Patch by Victor Stinner. + + - bpo-41842(3): Add *note PyCodec_Unregister(): 4c0. function to + unregister a codec search function. + + - bpo-41834(4): Remove the ‘_Py_CheckRecursionLimit’ variable: it has + been replaced by ‘ceval.recursion_limit’ of the *note + PyInterpreterState: 4fa. structure. Patch by Victor Stinner. + + - bpo-41689(5): Types created with *note PyType_FromSpec(): 5b8. now + make any signature in their ‘tp_doc’ slot accessible from + ‘__text_signature__’. + + - bpo-41524(6): Fix bug in PyOS_mystrnicmp and PyOS_mystricmp that + incremented pointers beyond the end of a string. + + - bpo-41324(7): 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. + + - bpo-30155(8): Add *note PyDateTime_DATE_GET_TZINFO(): 4bc. and + *note PyDateTime_TIME_GET_TZINFO(): 4bd. macros for accessing the + ‘tzinfo’ attributes of *note datetime.datetime: 4be. and *note + datetime.time: 4bf. objects. + + - bpo-40170(9): Revert *note PyType_HasFeature(): 1366. change: it + reads again directly the *note PyTypeObject.tp_flags: 12c3. member + when the limited C API is not used, rather than always calling + *note PyType_GetFlags(): 1367. which hides implementation details. + + - bpo-41123(10): Remove ‘PyUnicode_AsUnicodeCopy’. + + - bpo-41123(11): Removed ‘PyLong_FromUnicode()’. + + - bpo-41123(12): Removed ‘PyUnicode_GetMax()’. + + - bpo-41123(13): Removed ‘Py_UNICODE_str*’ functions manipulating + ‘Py_UNICODE*’ strings. + + - bpo-41103(14): ‘PyObject_AsCharBuffer()’, + ‘PyObject_AsReadBuffer()’, ‘PyObject_CheckReadBuffer()’, and + ‘PyObject_AsWriteBuffer()’ are removed. Please migrate to new + buffer protocol; *note PyObject_GetBuffer(): 329. and *note + PyBuffer_Release(): 331. + + - bpo-36346(15): Raises DeprecationWarning for + ‘PyUnicode_FromUnicode(NULL, size)’ and + ‘PyUnicode_FromStringAndSize(NULL, size)’ with ‘size > 0’. + + - bpo-36346(16): Mark ‘Py_UNICODE_COPY’, ‘Py_UNICODE_FILL’, + ‘PyUnicode_WSTR_LENGTH’, ‘PyUnicode_FromUnicode’, + ‘PyUnicode_AsUnicode’, and ‘PyUnicode_AsUnicodeAndSize’ as + deprecated in C. Remove ‘Py_UNICODE_MATCH’ which was deprecated and + broken since Python 3.3. + + - bpo-40989(17): The ‘PyObject_INIT()’ and ‘PyObject_INIT_VAR()’ + macros become aliases to, respectively, *note PyObject_Init(): 6bc. + and *note PyObject_InitVar(): 1368. functions. + + - bpo-36020(18): On Windows, ‘#include "pyerrors.h"’ no longer + defines ‘snprintf’ and ‘vsnprintf’ macros. + + - bpo-40943(19): The ‘PY_SSIZE_T_CLEAN’ macro must now be defined to + use *note PyArg_ParseTuple(): 4d9. and *note Py_BuildValue(): 4da. + formats which use ‘#’: ‘es#’, ‘et#’, ‘s#’, ‘u#’, ‘y#’, ‘z#’, ‘U#’ + and ‘Z#’. See *note Parsing arguments and building values: 4db. + and the PEP 353(20). + + - bpo-40910(21): Export explicitly the *note Py_GetArgcArgv(): 1369. + function to the C API and document the function. Previously, it + was exported implicitly which no longer works since Python is built + with ‘-fvisibility=hidden’. + + - bpo-40724(22): Allow defining buffer slots in type specs. + + - bpo-40679(23): Fix a ‘_PyEval_EvalCode()’ crash if `qualname' + argument is NULL. + + - bpo-40839(24): Calling *note PyDict_GetItem(): 4de. without *note + GIL: 4df. held had been allowed for historical reason. It is no + longer allowed. + + - bpo-40826(25): ‘PyOS_InterruptOccurred()’ now fails with a fatal + error if it is called with the GIL released. + + - bpo-40792(26): The result of *note PyNumber_Index(): 4ba. now + always has exact type *note int: 1c7. Previously, the result could + have been an instance of a subclass of ‘int’. + + - bpo-39573(27): Convert *note Py_REFCNT(): 4dc. and *note Py_SIZE(): + 357. macros to static inline functions. They cannot be used as + l-value anymore: use *note Py_SET_REFCNT(): 4dd. and *note + Py_SET_SIZE(): 358. to set an object reference count and size. + This change is backward incompatible on purpose, to prepare the C + API for an opaque *note PyObject: 4cf. structure. + + - bpo-40703(28): The PyType_FromSpec*() functions no longer overwrite + the type’s “__module__” attribute if it is set via “Py_tp_members” + or “Py_tp_getset”. + + - bpo-39583(29): Remove superfluous “extern C” declarations from + ‘Include/cpython/*.h’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=41936 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=41692 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=41842 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=41834 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=41689 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=41524 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=41324 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30155 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=41123 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=41123 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=41123 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=41123 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=41103 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36346 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=36346 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=40989 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=36020 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=40943 + + (20) https://peps.python.org/pep-0353/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=40910 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=40724 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=40679 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=40839 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=40826 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=40792 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=40703 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=39583 + + +File: python.info, Node: Python 3 9 0 beta 1, Next: Python 3 9 0 alpha 6, Prev: Python 3 10 0 alpha 1, Up: Changelog + +1.21.24 Python 3.9.0 beta 1 +--------------------------- + +`Release date: 2020-05-19' + +* Menu: + +* Security: Security<13>. +* Core and Builtins: Core and Builtins<24>. +* Library: Library<23>. +* Documentation: Documentation<23>. +* Tests: Tests<23>. +* Build: Build<24>. +* Windows: Windows<22>. +* macOS: macOS<16>. +* Tools/Demos: Tools/Demos<7>. +* C API: C API<21>. + + +File: python.info, Node: Security<13>, Next: Core and Builtins<24>, Up: Python 3 9 0 beta 1 + +1.21.24.1 Security +.................. + + - bpo-40501(1): *note uuid: 12e. no longer uses *note ctypes: 29. to + load ‘libuuid’ or ‘rpcrt4.dll’ at runtime. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40501 + + +File: python.info, Node: Core and Builtins<24>, Next: Library<23>, Prev: Security<13>, Up: Python 3 9 0 beta 1 + +1.21.24.2 Core and Builtins +........................... + + - bpo-40663(1): Correctly generate annotations where parentheses are + omitted but required (e.g: ‘Type[(str, int, *other))]’. + + - bpo-40596(2): Fixed *note str.isidentifier(): 136d. for + non-canonicalized strings containing non-BMP characters on Windows. + + - bpo-40593(3): Improved syntax errors for invalid characters in + source code. + + - bpo-40585(4): Fixed a bug when using *note + codeop.compile_command(): 136e. that was causing exceptions to be + swallowed with the new parser. Patch by Pablo Galindo + + - bpo-40566(5): Apply PEP 573(6) to *note abc: 3. + + - bpo-40502(7): Initialize ‘n->n_col_offset’. (Patch by Joannah + Nanjekye) + + - bpo-40527(8): Fix command line argument parsing: no longer write + errors multiple times into stderr. + + - bpo-1635741(9): Port *note errno: 77. to multiphase initialization + ( PEP 489(10)). + + - bpo-40523(11): Add pass-throughs for *note hash(): 1bc. and *note + reversed(): 462. to *note weakref.proxy: 6a1. objects. Patch by + Pablo Galindo. + + - bpo-1635741(12): Port *note syslog: fb. to multiphase + initialization ( PEP 489(13)). + + - bpo-40246(14): Reporting a specialised error message for invalid + string prefixes, which was introduced in bpo-40246(15), is being + reverted due to backwards compatibility concerns for strings that + immediately follow a reserved keyword without whitespace between + them. Constructs like ‘bg="#d00" if clear else"#fca"’ were failing + to parse, which is not an acceptable breakage on such short notice. + + - bpo-40417(16): Fix imp module deprecation warning when + PyImport_ReloadModule is called. Patch by Robert Rouhani. + + - bpo-40408(17): Fixed support of nested type variables in + GenericAlias (e.g. ‘list[list[T]]’). + + - bpo-1635741(18): Port _stat module to multiphase initialization ( + PEP 489(19)). + + - bpo-29587(20): Enable implicit exception chaining when calling + *note generator.throw(): 134b. + + - bpo-40328(21): Add tools for generating mappings headers for + CJKCodecs. + + - bpo-40228(22): Setting frame.f_lineno is now robust w.r.t. changes + in the source-to-bytecode compiler + + - bpo-38880(23): Added the ability to list interpreters associated + with channel ends in the internal subinterpreters module. + + - bpo-37986(24): Improve performance of *note PyLong_FromDouble(): + 58a. for values that fit into long. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40663 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40596 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40593 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40585 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40566 + + (6) https://peps.python.org/pep-0573/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40502 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40527 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (10) https://peps.python.org/pep-0489/ + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40523 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (13) https://peps.python.org/pep-0489/ + + (14) https://bugs.python.org/issue?@action=redirect&bpo=40246 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=40246 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=40417 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=40408 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (19) https://peps.python.org/pep-0489/ + + (20) https://bugs.python.org/issue?@action=redirect&bpo=29587 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=40328 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=40228 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=38880 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=37986 + + +File: python.info, Node: Library<23>, Next: Documentation<23>, Prev: Core and Builtins<24>, Up: Python 3 9 0 beta 1 + +1.21.24.3 Library +................. + + - bpo-40662(1): Fixed *note ast.get_source_segment(): 618. for ast + nodes that have incomplete location information. Patch by Irit + Katriel. + + - bpo-40665(2): Convert *note bisect: 10. to use Argument Clinic. + + - bpo-40536(3): Added the *note available_timezones(): 1370. function + to the *note zoneinfo: 150. module. Patch by Paul Ganssle. + + - bpo-40645(4): The ‘hmac.HMAC’ exposes internal implementation + details. The attributes ‘digest_cons’, ‘inner’, and ‘outer’ are + deprecated and will be removed in the future. + + - bpo-40645(5): The internal module ‘_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. + + - bpo-40637(6): Builtin hash modules can now be disabled or + selectively enabled with ‘configure + --with-builtin-hashlib-hashes=sha3,blake1’ or + ‘--without-builtin-hashlib-hashes’. + + - bpo-37630(7): The *note hashlib: 88. module can now use SHA3 hashes + and SHAKE XOF from OpenSSL when available. + + - bpo-40479(8): The *note hashlib: 88. now compiles with OpenSSL + 3.0.0-alpha2. + + - bpo-40257(9): Revert changes to *note inspect.getdoc(): 63f. + + - bpo-40607(10): When cancelling a task due to timeout, *note + asyncio.wait_for(): 1d5. will now propagate the exception if an + error happens during cancellation. Patch by Roman Skurikhin. + + - bpo-40612(11): 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. + + - bpo-40597(12): If text content lines are longer than + policy.max_line_length, always use a content-encoding to make sure + they are wrapped. + + - bpo-40571(13): Added functools.cache() as a simpler, more + discoverable way to access the unbounded cache variant of + lru_cache(maxsize=None). + + - bpo-40503(14): PEP 615(15), the *note zoneinfo: 150. module. Adds + support for the IANA time zone database. + + - bpo-40397(16): Removed attributes ‘__args__’ and ‘__parameters__’ + from special generic aliases like ‘typing.List’ (not subscripted). + + - bpo-40549(17): Convert posixmodule.c (“posix” or “nt” module) to + the multiphase initialization (PEP 489). + + - bpo-31033(18): Add a ‘msg’ argument to ‘Future.cancel()’ and + ‘Task.cancel()’. + + - bpo-40541(19): Added an optional `counts' parameter to + random.sample(). + + - bpo-40515(20): The *note ssl: f0. and *note hashlib: 88. 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. + + - bpo-31033(21): When a *note asyncio.Task: 1e3. is cancelled, the + exception traceback now chains all the way back to where the task + was first interrupted. + + - bpo-40504(22): *note functools.lru_cache(): 632. objects can now be + the targets of weakrefs. + + - bpo-40559(23): Fix possible memory leak in the C implementation of + *note asyncio.Task: 1e3. + + - bpo-40480(24): ‘fnmatch.fnmatch()’ could take exponential time in + the presence of multiple ‘*’ pattern characters. This was repaired + by generating more elaborate regular expressions to avoid futile + backtracking. + + - bpo-40495(25): *note compileall: 1f. is now able to use hardlinks + to prevent duplicates in a case when ‘.pyc’ files for different + optimization levels have the same content. + + - bpo-40457(26): The ssl module now support OpenSSL builds without + TLS 1.0 and 1.1 methods. + + - bpo-40355(27): Improve error reporting in *note ast.literal_eval(): + 882. in the presence of malformed *note ast.Dict: 1371. nodes + instead of silently ignoring any non-conforming elements. Patch by + Curtis Bucher. + + - bpo-40465(28): Deprecated the optional `random' argument to + `random.shuffle()'. + + - bpo-40459(29): *note platform.win32_ver(): 1372. now produces + correct `ptype' strings instead of empty strings. + + - bpo-39435(30): The first argument of *note pickle.loads(): 982. is + now positional-only. + + - bpo-39305(31): Update *note nntplib: be. to merge *note + nntplib.NNTP: 55d. and ‘nntplib._NNTPBase’. Patch by Dong-hee Na. + + - bpo-32494(32): Update *note dbm.gnu: 32. to use gdbm_count if + possible when calling *note len(): 209. Patch by Dong-hee Na. + + - bpo-40453(33): Add ‘isolated=True’ keyword-only parameter to + ‘_xxsubinterpreters.create()’. An isolated subinterpreter cannot + spawn threads, spawn a child process or call ‘os.fork()’. + + - bpo-40286(34): Remove ‘_random.Random.randbytes()’: the C + implementation of ‘randbytes()’. Implement the method in Python to + ease subclassing: ‘randbytes()’ now directly reuses + ‘getrandbits()’. + + - bpo-40394(35): Added default arguments to *note + difflib.SequenceMatcher.find_longest_match(): 1373. + + - bpo-39995(36): Fix a race condition in + concurrent.futures._ThreadWakeup: access to _ThreadWakeup is now + protected with the shutdown lock. + + - bpo-30966(37): ‘Process.shutdown(wait=True)’ of *note + concurrent.futures: 20. now closes explicitly the result queue. + + - bpo-30966(38): Add a new *note close(): 55b. method to the *note + SimpleQueue: 55a. class to explicitly close the queue. + + - bpo-39966(39): Revert bpo-25597(40). *note + unittest.mock.MagicMock: b1d. with wraps’ set uses default return + values for magic methods. + + - bpo-39791(41): Added ‘files()’ function to importlib.resources with + support for subdirectories in package data, matching backport in + importlib_resources 1.5. + + - bpo-40375(42): *note imaplib.IMAP4.unselect(): 54a. is added. + Patch by Dong-hee Na. + + - bpo-40389(43): ‘repr()’ now returns ‘typing.Optional[T]’ when + called for ‘typing.Union’ of two types, one of which is ‘NoneType’. + + - bpo-40291(44): Add support for CAN_J1939 sockets (available on + Linux 5.4+) + + - bpo-40273(45): *note types.MappingProxyType: 3bb. is now + reversible. + + - bpo-39075(46): The repr for *note types.SimpleNamespace: 56f. is + now insertion ordered rather than alphabetical. + + - bpo-40192(47): On AIX, *note thread_time(): 57e. is now implemented + with ‘thread_cputime()’ which has nanosecond resolution, rather + than ‘clock_gettime(CLOCK_THREAD_CPUTIME_ID)’ which has a + resolution of 10 milliseconds. Patch by Batuhan Taskaya. + + - bpo-40025(48): Raise TypeError when _generate_next_value_ is + defined after members. Patch by Ethan Onstott. + + - bpo-39058(49): 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. + + - bpo-24416(50): The ‘isocalendar()’ methods of *note datetime.date: + 536. and *note datetime.datetime: 4be. now return a *note named + tuple: 221. instead of a *note tuple: 539. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40662 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40665 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40536 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40645 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40645 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40637 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37630 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40479 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40257 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=40607 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40612 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=40597 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=40571 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=40503 + + (15) https://peps.python.org/pep-0615/ + + (16) https://bugs.python.org/issue?@action=redirect&bpo=40397 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=40549 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31033 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=40541 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=40515 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31033 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=40504 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=40559 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=40480 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=40495 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=40457 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=40355 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=40465 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=40459 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=39435 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=39305 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=32494 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=40453 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=40286 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=40394 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=39995 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=30966 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=30966 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=39966 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=25597 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=39791 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=40375 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=40389 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=40291 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=40273 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=39075 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=40192 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=40025 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=39058 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=24416 + + +File: python.info, Node: Documentation<23>, Next: Tests<23>, Prev: Library<23>, Up: Python 3 9 0 beta 1 + +1.21.24.4 Documentation +....................... + + - bpo-34790(1): Add version of removal for explicit passing of coros + to *note asyncio.wait(): 591.’s documentation + + - bpo-40561(2): Provide docstrings for webbrowser open functions. + + - bpo-40499(3): Mention that *note asyncio.wait(): 591. requires a + non-empty set of awaitables. + + - bpo-39705(4): 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. + + - bpo-39435(5): Fix an incorrect signature for *note pickle.loads(): + 982. in the docs + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34790 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40561 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40499 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39705 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39435 + + +File: python.info, Node: Tests<23>, Next: Build<24>, Prev: Documentation<23>, Up: Python 3 9 0 beta 1 + +1.21.24.5 Tests +............... + + - bpo-40055(1): distutils.tests now saves/restores warnings filters + to leave them unchanged. Importing tests imports docutils which + imports pkg_resources which adds a warnings filter. + + - bpo-40436(2): test_gdb and test.pythoninfo now check gdb command + exit code. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40055 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40436 + + +File: python.info, Node: Build<24>, Next: Windows<22>, Prev: Tests<23>, Up: Python 3 9 0 beta 1 + +1.21.24.6 Build +............... + + - bpo-40653(1): Move _dirnameW out of HAVE_SYMLINK to fix a potential + compiling issue. + + - bpo-40514(2): Add ‘--with-experimental-isolated-subinterpreters’ + build option to ‘configure’: better isolate subinterpreters, + experimental build mode. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40653 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40514 + + +File: python.info, Node: Windows<22>, Next: macOS<16>, Prev: Build<24>, Up: Python 3 9 0 beta 1 + +1.21.24.7 Windows +................. + + - bpo-40650(1): Include winsock2.h in pytime.c for timeval. + + - bpo-40458(2): Increase reserved stack space to prevent overflow + crash on Windows. + + - bpo-39148(3): Add IPv6 support to *note asyncio: 9. datagram + endpoints in ProactorEventLoop. Change the raised exception for + unknown address families to ValueError as it’s not coming from + Windows API. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40650 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40458 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39148 + + +File: python.info, Node: macOS<16>, Next: Tools/Demos<7>, Prev: Windows<22>, Up: Python 3 9 0 beta 1 + +1.21.24.8 macOS +............... + + - bpo-34956(1): When building Python on macOS from source, ‘_tkinter’ + now links with non-system Tcl and Tk frameworks if they are + installed in ‘/Library/Frameworks’, as had been the case on older + releases of macOS. If a macOS SDK is explicitly configured, by + using ‘--enable-universalsdk=’ or ‘-isysroot’, only the SDK itself + is searched. The default behavior can still be overridden with + ‘--with-tcltk-includes’ and ‘--with-tcltk-libs’. + + - bpo-35569(2): Expose RFC 3542 IPv6 socket options. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34956 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35569 + + +File: python.info, Node: Tools/Demos<7>, Next: C API<21>, Prev: macOS<16>, Up: Python 3 9 0 beta 1 + +1.21.24.9 Tools/Demos +..................... + + - bpo-40479(1): Update multissltest helper to test with latest + OpenSSL 1.0.2, 1.1.0, 1.1.1, and 3.0.0-alpha. + + - bpo-40431(2): Fix a syntax typo in ‘turtledemo’ that now raises a + ‘SyntaxError’. + + - bpo-40163(3): Fix multissltest tool. OpenSSL has changed download + URL for old releases. The multissltest tool now tries to download + from current and old download URLs. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40479 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40431 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40163 + + +File: python.info, Node: C API<21>, Prev: Tools/Demos<7>, Up: Python 3 9 0 beta 1 + +1.21.24.10 C API +................ + + - bpo-39465(1): Remove the ‘_PyUnicode_ClearStaticStrings()’ function + from the C API. + + - bpo-38787(2): 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. + + - bpo-40545(3): Declare ‘_PyErr_GetTopmostException()’ with + ‘PyAPI_FUNC()’ to properly export the function in the C API. The + function remains private (‘_Py’) prefix. + + - bpo-40412(4): Nullify inittab_copy during finalization, preventing + future interpreter initializations in an embedded situation from + crashing. Patch by Gregory Szorc. + + - bpo-40429(5): The *note PyThreadState_GetFrame(): 361. function now + returns a strong reference to the frame. + + - bpo-40428(6): Remove the following functions from the C API. Call + *note PyGC_Collect(): 5e4. explicitly to free all free lists. + + * ‘PyAsyncGen_ClearFreeLists()’ + + * ‘PyContext_ClearFreeList()’ + + * ‘PyDict_ClearFreeList()’ + + * ‘PyFloat_ClearFreeList()’ + + * ‘PyFrame_ClearFreeList()’ + + * ‘PyList_ClearFreeList()’ + + * ‘PySet_ClearFreeList()’ + + * ‘PyTuple_ClearFreeList()’ + + - bpo-40421(7): New *note PyFrame_GetBack(): 35a. function: get the + frame next outer frame. + + - bpo-40421(8): New *note PyFrame_GetCode(): 35e. function: return a + borrowed reference to the frame code. + + - bpo-40217(9): Ensure that instances of types created with *note + PyType_FromSpecWithBases(): 4c7. will visit its class object when + traversing references in the garbage collector (implemented as an + extension of the provided *note tp_traverse: 352.). Patch by Pablo + Galindo. + + - bpo-38787(10): Module C state is now accessible from C-defined heap + type methods ( PEP 573(11)). Patch by Marcel Plch and Petr + Viktorin. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39465 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38787 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40545 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40412 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40429 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40428 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40421 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40421 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40217 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38787 + + (11) https://peps.python.org/pep-0573/ + + +File: python.info, Node: Python 3 9 0 alpha 6, Next: Python 3 9 0 alpha 5, Prev: Python 3 9 0 beta 1, Up: Changelog + +1.21.25 Python 3.9.0 alpha 6 +---------------------------- + +`Release date: 2020-04-27' + +* Menu: + +* Security: Security<14>. +* Core and Builtins: Core and Builtins<25>. +* Library: Library<24>. +* Documentation: Documentation<24>. +* Tests: Tests<24>. +* Build: Build<25>. +* Windows: Windows<23>. +* macOS: macOS<17>. +* IDLE: IDLE<15>. +* Tools/Demos: Tools/Demos<8>. +* C API: C API<22>. + + +File: python.info, Node: Security<14>, Next: Core and Builtins<25>, Up: Python 3 9 0 alpha 6 + +1.21.25.1 Security +.................. + + - bpo-40121(1): Fixes audit events raised on creating a new socket. + + - bpo-39073(2): Disallow CR or LF in email.headerregistry.Address + arguments to guard against header injection attacks. + + - bpo-39503(3): CVE-2020-8492: The *note AbstractBasicAuthHandler: + 12c1. class of the *note urllib.request: 12a. 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40121 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39073 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39503 + + +File: python.info, Node: Core and Builtins<25>, Next: Library<24>, Prev: Security<14>, Up: Python 3 9 0 alpha 6 + +1.21.25.2 Core and Builtins +........................... + + - bpo-40313(1): Improve the performance of bytes.hex(). + + - bpo-40334(2): Switch to a new parser, based on PEG. For more + details see PEP 617. To temporarily switch back to the old parser, + use ‘-X oldparser’ or ‘PYTHONOLDPARSER=1’. In Python 3.10 we will + remove the old parser completely, including the ‘parser’ module + (already deprecated) and anything that depends on it. + + - bpo-40267(3): Fix the tokenizer to display the correct error + message, when there is a SyntaxError on the last input character + and no newline follows. It used to be ‘unexpected EOF while + parsing’, while it should be ‘invalid syntax’. + + - bpo-39522(4): Correctly unparse explicit ‘u’ prefix for strings + when postponed evaluation for annotations activated. Patch by + Batuhan Taskaya. + + - bpo-40246(5): Report a specialized error message, ‘invalid string + prefix’, when the tokenizer encounters a string with an invalid + prefix. + + - bpo-40082(6): Fix the signal handler: it now always uses the main + interpreter, rather than trying to get the current Python thread + state. + + - bpo-37388(7): 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(). + + - bpo-40077(8): Fix possible refleaks in ‘_json’, memo of + PyScannerObject should be traversed. + + - bpo-37207(9): Speed up calls to ‘dict()’ by using the PEP 590(10) + ‘vectorcall’ calling convention. + + - bpo-40141(11): Add column and line information to ‘ast.keyword’ + nodes. Patch by Pablo Galindo. + + - bpo-1635741(12): Port *note resource: dd. to multiphase + initialization ( PEP 489(13)). + + - bpo-1635741(14): Port *note math: af. to multiphase initialization + ( PEP 489(15)). + + - bpo-1635741(16): Port _uuid module to multiphase initialization ( + PEP 489(17)). + + - bpo-40077(18): Convert json module to use *note PyType_FromSpec(): + 5b8. + + - bpo-40067(19): Improve the error message for multiple star + expressions in an assignment. Patch by Furkan Onder + + - bpo-1635741(20): Port _functools module to multiphase + initialization (PEP 489). Patch by Paulo Henrique Silva. + + - bpo-1635741(21): Port operator module to multiphase initialization + (PEP 489). Patch by Paulo Henrique Silva. + + - bpo-20526(22): Fix *note PyThreadState_Clear(): 137e. + ‘PyThreadState.frame’ is a borrowed reference, not a strong + reference: ‘PyThreadState_Clear()’ must not call + ‘Py_CLEAR(tstate->frame)’. + + - bpo-1635741(23): Port time module to multiphase initialization ( + PEP 489(24)). Patch by Paulo Henrique Silva. + + - bpo-1635741(25): Port _weakref extension module to multiphase + initialization ( PEP 489(26)). + + - bpo-40020(27): Fix a leak and subsequent crash in parsetok.c caused + by realloc misuse on a rare codepath. + + - bpo-39939(28): Added str.removeprefix and str.removesuffix methods + and corresponding bytes, bytearray, and collections.UserString + methods to remove affixes from a string if present. See PEP + 616(29) for a full description. Patch by Dennis Sweeney. + + - bpo-39481(30): Implement PEP 585. This supports list[int], + tuple[str, …] etc. + + - bpo-32894(31): Support unparsing of infinity numbers in postponed + annotations. Patch by Batuhan Taşkaya. + + - bpo-37207(32): Speed up calls to ‘list()’ by using the PEP 590(33) + ‘vectorcall’ calling convention. Patch by Mark Shannon. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40313 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40334 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40267 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39522 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40246 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40082 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37388 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40077 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (10) https://peps.python.org/pep-0590/ + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40141 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (13) https://peps.python.org/pep-0489/ + + (14) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (15) https://peps.python.org/pep-0489/ + + (16) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (17) https://peps.python.org/pep-0489/ + + (18) https://bugs.python.org/issue?@action=redirect&bpo=40077 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=40067 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=20526 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (24) https://peps.python.org/pep-0489/ + + (25) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (26) https://peps.python.org/pep-0489/ + + (27) https://bugs.python.org/issue?@action=redirect&bpo=40020 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=39939 + + (29) https://peps.python.org/pep-0616/ + + (30) https://bugs.python.org/issue?@action=redirect&bpo=39481 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=32894 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (33) https://peps.python.org/pep-0590/ + + +File: python.info, Node: Library<24>, Next: Documentation<24>, Prev: Core and Builtins<25>, Up: Python 3 9 0 alpha 6 + +1.21.25.3 Library +................. + + - bpo-40398(1): *note typing.get_args(): 4a1. now always returns an + empty tuple for special generic aliases. + + - bpo-40396(2): Functions *note typing.get_origin(): 696, *note + typing.get_args(): 4a1. and *note typing.get_type_hints(): 277. + support now generic aliases like ‘list[int]’. + + - bpo-38061(3): Optimize the *note subprocess: f6. module on FreeBSD + using ‘closefrom()’. A single ‘close(fd)’ syscall is cheap, but + when ‘sysconf(_SC_OPEN_MAX)’ is high, the loop calling ‘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): + ‘https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274’ + + - bpo-38061(4): On FreeBSD, ‘os.closerange(fd_low, fd_high)’ now + calls ‘closefrom(fd_low)’ if `fd_high' is greater than or equal to + ‘sysconf(_SC_OPEN_MAX)’. + + Initial patch by Ed Maste (emaste), Conrad Meyer (cem), Kyle Evans + (kevans) and Kubilay Kocak (koobs): + ‘https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242274’ + + - bpo-40360(5): The *note lib2to3: a5. module is pending deprecation + due to PEP 617(6). + + - bpo-40138(7): Fix the Windows implementation of *note os.waitpid(): + a18. for exit code larger than ‘INT_MAX >> 8’. The exit status is + now interpreted as an unsigned number. + + - bpo-39942(8): Set “__main__” as the default module name when + “__name__” is missing in *note typing.TypeVar: 185. Patch by + Weipeng Hong. + + - bpo-40275(9): The *note logging: a8. package is now imported lazily + in *note unittest: 125. only when the *note assertLogs(): 450. + assertion is used. + + - bpo-40275(10): The *note asyncio: 9. package is now imported lazily + in *note unittest: 125. only when the *note + IsolatedAsyncioTestCase: 284. class is used. + + - bpo-40330(11): In ‘ShareableList.__setitem__()’, check the size of + a new string item after encoding it to utf-8, not before. + + - bpo-40148(12): Added ‘pathlib.Path.with_stem()’ to create a new + Path with the stem replaced. + + - bpo-40325(13): Deprecated support for set objects in + random.sample(). + + - bpo-40257(14): Improved help for the *note typing: 123. module. + Docstrings are now shown for all special forms and special generic + aliases (like ‘Union’ and ‘List’). Using ‘help()’ with generic + alias like ‘List[int]’ will show the help for the correspondent + concrete type (‘list’ in this case). + + - bpo-40257(15): func:*note inspect.getdoc: 63f. 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 *note pydoc: d6. the documentation string is now shown not only + for class, function, method etc, but for any object that has its + own ‘__doc__’ attribute. + + - bpo-40287(16): Fixed ‘SpooledTemporaryFile.seek()’ to return the + position. + + - bpo-40290(17): Added zscore() to statistics.NormalDist(). + + - bpo-40282(18): Allow ‘random.getrandbits(0)’ to succeed and to + return 0. + + - bpo-40286(19): Add *note random.randbytes(): 1380. function and + ‘random.Random.randbytes()’ method to generate random bytes. + + - bpo-40277(20): *note collections.namedtuple(): 538. now provides a + human-readable repr for its field accessors. + + - bpo-40270(21): The included copy of sqlite3 on Windows is now + compiled with the json extension. This allows the use of functions + such as ‘json_object’. + + - bpo-29255(22): Wait in ‘KqueueSelector.select’ when no fds are + registered + + - bpo-40260(23): Ensure *note modulefinder: b2. uses *note + io.open_code(): 1381. and respects coding comments. + + - bpo-40234(24): Allow again to spawn daemon threads in + subinterpreters (revert change which denied them). + + - bpo-39207(25): Workers in *note ProcessPoolExecutor: 52e. 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. + + - bpo-40091(26): 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. + + - bpo-40149(27): Implement traverse and clear slots in _abc._abc_data + type. + + - bpo-40208(28): Remove deprecated ‘symtable.SymbolTable.has_exec()’. + + - bpo-40196(29): Fix a bug in the *note symtable: f8. module that was + causing incorrectly report global variables as local. Patch by + Pablo Galindo. + + - bpo-40190(30): Add support for ‘_SC_AIX_REALMEM’ to + ‘posix.sysconf()’. + + - bpo-40182(31): Removed the ‘_field_types’ attribute of the *note + typing.NamedTuple: 271. class. + + - bpo-36517(32): Multiple inheritance with *note typing.NamedTuple: + 271. now raises an error instead of silently ignoring other types. + + - bpo-40126(33): Fixed reverting multiple patches in unittest.mock. + Patcher’s ‘__exit__()’ is now never called if its ‘__enter__()’ is + failed. Returning true from ‘__exit__()’ silences now the + exception. + + - bpo-40094(34): 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.” + + - bpo-40108(35): Improve the error message when triying to import a + module using *note runpy: df. and incorrently use the “.py” + extension at the end of the module name. Patch by Pablo Galindo. + + - bpo-40094(36): Add *note os.waitstatus_to_exitcode(): 565. + function: convert a wait status to an exit code. + + - bpo-40089(37): 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. + + - bpo-40089(38): Add a private ‘_at_fork_reinit()’ method to + ‘_thread.Lock’, ‘_thread.RLock’, *note threading.RLock: f14. and + *note threading.Condition: e07. classes: reinitialize the lock at + fork in the child process, reset the lock to the unlocked state. + Rename also the private ‘_reset_internal_locks()’ method of *note + threading.Event: e0a. to ‘_at_fork_reinit()’. + + - bpo-25780(39): Expose *note CAN_RAW_JOIN_FILTERS: 579. in the *note + socket: ec. module. + + - bpo-39503(40): *note AbstractBasicAuthHandler: 12c1. of *note + urllib.request: 12a. now parses all WWW-Authenticate HTTP headers + and accepts multiple challenges per header: use the realm of the + first Basic challenge. + + - bpo-39812(41): Removed daemon threads from *note + concurrent.futures: 20. by adding an internal + ‘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. + + - bpo-40050(42): Fix ‘importlib._bootstrap_external’: avoid creating + a new ‘winreg’ builtin module if it’s already available in *note + sys.modules: 1382, and remove redundant imports. + + - bpo-40014(43): Fix ‘os.getgrouplist()’: if ‘getgrouplist()’ + function fails because the group list is too small, retry with a + larger group list. On failure, the glibc implementation of + ‘getgrouplist()’ sets ‘ngroups’ to the total number of groups. For + other implementations, double the group list size. + + - bpo-40017(44): Add *note time.CLOCK_TAI: 1383. constant if the + operating system support it. + + - bpo-40016(45): In re docstring, clarify the relationship between + inline and argument compile flags. + + - bpo-39953(46): Update internal table of OpenSSL error codes in the + ‘ssl’ module. + + - bpo-36144(47): Added PEP 584(48) operators to *note + weakref.WeakValueDictionary: 1384. + + - bpo-36144(49): Added PEP 584(50) operators to *note + weakref.WeakKeyDictionary: 1385. + + - bpo-38891(51): Fix linear runtime behaviour of the ‘__getitem__’ + and ‘__setitem__’ methods in *note + multiprocessing.shared_memory.ShareableList: 1386. This avoids + quadratic performance when iterating a ‘ShareableList’. Patch by + Thomas Krennwallner. + + - bpo-39682(52): Remove undocumented support for `closing' a *note + pathlib.Path: 65f. object via its context manager. The context + manager magic methods remain, but they are now a no-op, making + ‘Path’ objects immutable. + + - bpo-36144(53): Added PEP 584(54) operators (‘|’ and ‘|=’) to *note + collections.ChainMap: 886. + + - bpo-39011(55): Normalization of line endings in ElementTree + attributes was removed, as line endings which were replaced by + entity numbers should be preserved in original form. + + - bpo-38410(56): Properly handle *note sys.audit(): 1387. failures in + *note sys.set_asyncgen_hooks(): 1222. + + - bpo-36541(57): lib2to3 now recognizes named assignment expressions + (the walrus operator, ‘:=’) + + - bpo-35967(58): In platform, delay the invocation of ‘uname -p’ + until the processor attribute is requested. + + - bpo-35113(59): *note inspect.getsource(): 129c. 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. + + - bpo-33262(60): Deprecate passing None as an argument for *note + shlex.split(): 594.’s ‘s’ parameter. Patch by Zackery Spytz. + + - bpo-31758(61): Prevent crashes when using an uninitialized + ‘_elementtree.XMLParser’ object. Patch by Oren Milman. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40398 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40396 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38061 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38061 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40360 + + (6) https://peps.python.org/pep-0617/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40138 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39942 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=40275 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=40275 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=40330 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=40148 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=40325 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=40257 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=40257 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=40287 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=40290 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=40282 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=40286 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=40277 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=40270 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=29255 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=40260 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=40234 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=39207 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=40091 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=40149 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=40208 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=40196 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=40190 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=40182 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=36517 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=40126 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=40094 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=40108 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=40094 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=40089 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=40089 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=25780 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=39503 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=39812 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=40050 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=40014 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=40017 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=40016 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=39953 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (48) https://peps.python.org/pep-0584/ + + (49) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (50) https://peps.python.org/pep-0584/ + + (51) https://bugs.python.org/issue?@action=redirect&bpo=38891 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=39682 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (54) https://peps.python.org/pep-0584/ + + (55) https://bugs.python.org/issue?@action=redirect&bpo=39011 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=38410 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=36541 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=35967 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=35113 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=33262 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=31758 + + +File: python.info, Node: Documentation<24>, Next: Tests<24>, Prev: Library<24>, Up: Python 3 9 0 alpha 6 + +1.21.25.4 Documentation +....................... + + - bpo-27635(1): The pickle documentation incorrectly claimed that + ‘__new__’ isn’t called by default when unpickling. + + - bpo-39879(2): Updated *note Data model: 1389. docs to include *note + dict(): 16e. insertion order preservation. Patch by Furkan Onder + and Samy Lahfa. + + - bpo-38387(3): Document *note PyDoc_STRVAR: 138a. macro in the C-API + reference. + + - bpo-13743(4): Some methods within xml.dom.minidom.Element class are + now better documented. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27635 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39879 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38387 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13743 + + +File: python.info, Node: Tests<24>, Next: Build<25>, Prev: Documentation<24>, Up: Python 3 9 0 alpha 6 + +1.21.25.5 Tests +............... + + - bpo-31904(1): Set expected default encoding in + test_c_locale_coercion.py for VxWorks RTOS. + + - bpo-40162(2): Update Travis CI configuration to OpenSSL 1.1.1f. + + - bpo-40146(3): Update OpenSSL to 1.1.1f in Azure Pipelines. + + - bpo-40094(4): Add *note test.support.wait_process(): 138c. + function. + + - bpo-40003(5): ‘test.bisect_cmd’ now copies Python command line + options like ‘-O’ or ‘-W’. Moreover, emit a warning if + ‘test.bisect_cmd’ is used with ‘-w’/‘--verbose2’ option. + + - bpo-39380(6): Add the encoding in *note ftplib.FTP: 53d. and *note + ftplib.FTP_TLS: 53e. to the constructor as keyword-only and change + the default from ‘latin-1’ to ‘utf-8’ to follow RFC 2640(7). + + - bpo-39793(8): Use the same domain when testing ‘make_msgid’. Patch + by Batuhan Taskaya. + + - bpo-1812(9): Fix newline handling in doctest.testfile when loading + from a package whose loader has a get_data method. Patch by Peter + Donis. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40162 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40146 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40094 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40003 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39380 + + (7) https://datatracker.ietf.org/doc/html/rfc2640.html + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39793 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=1812 + + +File: python.info, Node: Build<25>, Next: Windows<23>, Prev: Tests<24>, Up: Python 3 9 0 alpha 6 + +1.21.25.6 Build +............... + + - bpo-38360(1): Support single-argument form of macOS -isysroot flag. + + - bpo-40158(2): Fix CPython MSBuild Properties in NuGet Package + (build/native/python.props) + + - bpo-38527(3): Fix configure check on Solaris for “float word + ordering”: sometimes, the correct “grep” command was not being + used. Patch by Arnon Yaari. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38360 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40158 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38527 + + +File: python.info, Node: Windows<23>, Next: macOS<17>, Prev: Build<25>, Up: Python 3 9 0 alpha 6 + +1.21.25.7 Windows +................. + + - bpo-40164(1): Updates Windows to OpenSSL 1.1.1f + + - bpo-8901(2): Ignore the Windows registry when the ‘-E’ option is + used. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40164 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=8901 + + +File: python.info, Node: macOS<17>, Next: IDLE<15>, Prev: Windows<23>, Up: Python 3 9 0 alpha 6 + +1.21.25.8 macOS +............... + + - bpo-38329(1): 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. + + - bpo-40164(2): Update macOS installer builds to use OpenSSL 1.1.1g. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38329 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40164 + + +File: python.info, Node: IDLE<15>, Next: Tools/Demos<8>, Prev: macOS<17>, Up: Python 3 9 0 alpha 6 + +1.21.25.9 IDLE +.............. + + - bpo-38439(1): Add a 256×256 pixel IDLE icon to support more modern + environments. Created by Andrew Clover. Delete the unused macOS + idle.icns icon file. + + - bpo-38689(2): IDLE will no longer freeze when inspect.signature + fails when fetching a calltip. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38439 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38689 + + +File: python.info, Node: Tools/Demos<8>, Next: C API<22>, Prev: IDLE<15>, Up: Python 3 9 0 alpha 6 + +1.21.25.10 Tools/Demos +...................... + + - bpo-40385(1): Removed the checkpyc.py tool. Please see compileall + without force mode as a potential alternative. + + - bpo-40179(2): Fixed translation of ‘#elif’ in Argument Clinic. + + - bpo-40094(3): Fix ‘which.py’ script exit code: it now uses *note + os.waitstatus_to_exitcode(): 565. to convert *note os.system(): + 10c0. exit status into an exit code. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40385 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40179 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40094 + + +File: python.info, Node: C API<22>, Prev: Tools/Demos<8>, Up: Python 3 9 0 alpha 6 + +1.21.25.11 C API +................ + + - bpo-40241(1): Move the ‘PyGC_Head’ structure to the internal C API. + + - bpo-40170(2): Convert *note PyObject_IS_GC(): 5da. macro to a + function to hide implementation details. + + - bpo-40241(3): Add the functions *note PyObject_GC_IsTracked(): 5cb. + and *note PyObject_GC_IsFinalized(): 5cc. 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. + + - bpo-40170(4): The ‘PyObject_NEW()’ macro becomes an alias to the + *note PyObject_New(): 5db. macro, and the ‘PyObject_NEW_VAR()’ + macro becomes an alias to the *note PyObject_NewVar(): 5dc. macro, + to hide implementation details. They no longer access directly the + *note PyTypeObject.tp_basicsize: 5dd. member. + + - bpo-40170(5): *note PyType_HasFeature(): 1366. now always calls + *note PyType_GetFlags(): 1367. to hide implementation details. + Previously, it accessed directly the *note PyTypeObject.tp_flags: + 12c3. member when the limited C API was not used. + + - bpo-40170(6): Convert the ‘PyObject_GET_WEAKREFS_LISTPTR()’ macro + to a function to hide implementation details: the macro accessed + directly to the *note PyTypeObject.tp_weaklistoffset: 5de. member. + + - bpo-40170(7): Convert *note PyObject_CheckBuffer(): 328. macro to a + function to hide implementation details: the macro accessed + directly the *note PyTypeObject.tp_as_buffer: 5df. member. + + - bpo-40170(8): Always declare *note PyIndex_Check(): 5e0. as an + opaque function to hide implementation details: remove + ‘PyIndex_Check()’ macro. The macro accessed directly the *note + PyTypeObject.tp_as_number: 5e1. member. + + - bpo-39947(9): Add *note PyThreadState_GetID(): 5c6. function: get + the unique identifier of a Python thread state. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40241 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=40241 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=40170 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + +File: python.info, Node: Python 3 9 0 alpha 5, Next: Python 3 9 0 alpha 4, Prev: Python 3 9 0 alpha 6, Up: Changelog + +1.21.26 Python 3.9.0 alpha 5 +---------------------------- + +`Release date: 2020-03-23' + +* Menu: + +* Security: Security<15>. +* Core and Builtins: Core and Builtins<26>. +* Library: Library<25>. +* Documentation: Documentation<25>. +* Tests: Tests<25>. +* Build: Build<26>. +* Windows: Windows<24>. +* macOS: macOS<18>. +* IDLE: IDLE<16>. +* Tools/Demos: Tools/Demos<9>. +* C API: C API<23>. + + +File: python.info, Node: Security<15>, Next: Core and Builtins<26>, Up: Python 3 9 0 alpha 5 + +1.21.26.1 Security +.................. + + - bpo-38576(1): Disallow control characters in hostnames in + http.client, addressing CVE-2019-18348. Such potentially malicious + header injection URLs now cause a InvalidURL to be raised. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38576 + + +File: python.info, Node: Core and Builtins<26>, Next: Library<25>, Prev: Security<15>, Up: Python 3 9 0 alpha 5 + +1.21.26.2 Core and Builtins +........................... + + - bpo-40010(1): Optimize pending calls in multithreaded applications. + If a thread different than the main thread schedules a pending call + (*note Py_AddPendingCall(): 5d6.), 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. + + - bpo-1635741(2): Port _weakref extension module to multiphase + initialization ( PEP 489(3)). + + - bpo-1635741(4): Port _collections module to multiphase + initialization ( PEP 489(5)). + + - bpo-40010(6): 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. + + - bpo-39984(7): If *note Py_AddPendingCall(): 5d6. 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. + + - bpo-1635741(8): Port _heapq module to multiphase initialization. + + - bpo-1635741(9): Port itertools module to multiphase initialization + ( PEP 489(10)). + + - bpo-37207(11): Speed up calls to ‘frozenset()’ by using the PEP + 590(12) ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + - bpo-39984(13): subinterpreters: Move + ‘_PyRuntimeState.ceval.tracing_possible’ to + ‘PyInterpreterState.ceval.tracing_possible’: each interpreter now + has its own variable. + + - bpo-37207(14): Speed up calls to ‘set()’ by using the PEP 590(15) + ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + - bpo-1635741(16): Port _statistics module to multiphase + initialization ( PEP 489(17)). + + - bpo-39968(18): Use inline function to replace extension modules’ + get_module_state macros. + + - bpo-39965(19): Correctly raise ‘SyntaxError’ if `await' is used + inside non-async functions and ‘PyCF_ALLOW_TOP_LEVEL_AWAIT’ is set + (like in the asyncio REPL). Patch by Pablo Galindo. + + - bpo-39562(20): Allow executing asynchronous comprehensions on the + top level when the ‘PyCF_ALLOW_TOP_LEVEL_AWAIT’ flag is given. + Patch by Batuhan Taskaya. + + - bpo-37207(21): Speed up calls to ‘tuple()’ by using the PEP 590(22) + ‘vectorcall’ calling convention. Patch by Dong-hee Na. + + - bpo-38373(23): 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. + + - bpo-39926(24): Update Unicode database to Unicode version 13.0.0. + + - bpo-19466(25): 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. + + - bpo-38894(26): Fix a bug that was causing incomplete results when + calling ‘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. + + - bpo-39877(27): Fix *note PyEval_RestoreThread(): 6e3. random crash + at exit with daemon threads. It now accesses the ‘_PyRuntime’ + variable directly instead of using ‘tstate->interp->runtime’, since + ‘tstate’ can be a dangling pointer after *note Py_Finalize(): ff4. + has been called. Moreover, the daemon thread now exits before + trying to take the GIL. + + - bpo-39871(28): Fix a possible *note SystemError: 9b5. in + ‘math.{atan2,copysign,remainder}()’ when the first argument cannot + be converted to a *note float: 3ca. Patch by Zackery Spytz. + + - bpo-39776(29): 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). + + - bpo-39778(30): Fixed a crash due to incorrect handling of weak + references in ‘collections.OrderedDict’ classes. Patch by Pablo + Galindo. + + - bpo-1635741(31): Port audioop extension module to multiphase + initialization ( PEP 489(32)). + + - bpo-39702(33): Relax *note decorator: 2f8. grammar restrictions to + allow any valid expression ( PEP 614(34)). + + - bpo-38091(35): Tweak import deadlock detection code to not deadlock + itself. + + - bpo-1635741(36): Port _locale extension module to multiphase + initialization ( PEP 489(37)). + + - bpo-39087(38): Optimize *note PyUnicode_AsUTF8(): 81e. and *note + PyUnicode_AsUTF8AndSize(): 4c2. slightly when they need to create + internal UTF-8 cache. + + - bpo-39520(39): Fix unparsing of ext slices with no items + (‘foo[:,]’). Patch by Batuhan Taskaya. + + - bpo-39220(40): Do not optimize annotations if ‘from __future__ + import annotations’ is used. Patch by Pablo Galindo. + + - bpo-35712(41): Using *note NotImplemented: 3c1. in a boolean + context has been deprecated. Patch contributed by Josh Rosenberg. + + - bpo-22490(42): Don’t leak environment variable + ‘__PYVENV_LAUNCHER__’ into the interpreter session on macOS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40010 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (3) https://peps.python.org/pep-0489/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (5) https://peps.python.org/pep-0489/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=40010 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39984 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (10) https://peps.python.org/pep-0489/ + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (12) https://peps.python.org/pep-0590/ + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39984 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (15) https://peps.python.org/pep-0590/ + + (16) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (17) https://peps.python.org/pep-0489/ + + (18) https://bugs.python.org/issue?@action=redirect&bpo=39968 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=39965 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=39562 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (22) https://peps.python.org/pep-0590/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=38373 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=39926 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=19466 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=38894 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=39877 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=39871 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=39776 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=39778 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (32) https://peps.python.org/pep-0489/ + + (33) https://bugs.python.org/issue?@action=redirect&bpo=39702 + + (34) https://peps.python.org/pep-0614/ + + (35) https://bugs.python.org/issue?@action=redirect&bpo=38091 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (37) https://peps.python.org/pep-0489/ + + (38) https://bugs.python.org/issue?@action=redirect&bpo=39087 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=39520 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=39220 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=35712 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=22490 + + +File: python.info, Node: Library<25>, Next: Documentation<25>, Prev: Core and Builtins<26>, Up: Python 3 9 0 alpha 5 + +1.21.26.3 Library +................. + + - bpo-39830(1): Add *note zipfile.Path: 291. to ‘__all__’ in the + *note zipfile: 14d. module. + + - bpo-40000(2): Improved error messages for validation of + ‘ast.Constant’ nodes. Patch by Batuhan Taskaya. + + - bpo-39999(3): ‘__module__’ of the AST node classes is now set to + “ast” instead of “_ast”. Added docstrings for dummy AST node + classes and deprecated attributes. + + - bpo-39991(4): *note uuid.getnode(): 80a. now skips IPv6 addresses + with the same string length than a MAC address (17 characters): + only use MAC addresses. + + - bpo-39988(5): Deprecated ‘ast.AugLoad’ and ‘ast.AugStore’ node + classes because they are no longer used. + + - bpo-39656(6): Ensure ‘bin/python3.#’ is always present in virtual + environments on POSIX platforms - by Anthony Sottile. + + - bpo-39969(7): Deprecated ‘ast.Param’ node class because it’s no + longer used. Patch by Batuhan Taskaya. + + - bpo-39360(8): Ensure all workers exit when finalizing a + ‘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 ‘multiprocessing.Pool.terminate’. + Patch by Batuhan Taskaya and Pablo Galindo. + + - bpo-35370(9): sys.settrace(), sys.setprofile() and + _lsprof.Profiler.enable() now properly report *note PySys_Audit(): + 1397. error if “sys.setprofile” or “sys.settrace” audit event is + denied. + + - bpo-39936(10): 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. + + - bpo-36144(11): *note collections.OrderedDict: 1a8. now implements + ‘|’ and ‘|=’ ( PEP 584(12)). + + - bpo-39652(13): The column name found in + ‘sqlite3.Cursor.description’ is now truncated on the first ‘[’ only + if the PARSE_COLNAMES option is set. + + - bpo-39915(14): Ensure *note + unittest.mock.AsyncMock.await_args_list: 1398. has call objects in + the order of awaited arguments instead of using *note + unittest.mock.Mock.call_args: 1399. which has the last value of the + call. Patch by Karthikeyan Singaravelan. + + - bpo-36144(15): Updated *note os.environ: e6e. and *note + os.environb: ec6. to support PEP 584(16)’s merge (‘|’) and update + (‘|=’) operators. + + - bpo-38662(17): The ‘ensurepip’ module now invokes ‘pip’ via the + ‘runpy’ module. Hence it is no longer tightly coupled with the + internal API of the bundled ‘pip’ version, allowing easier updates + to a newer ‘pip’ version both internally and for distributors. + + - bpo-38075(18): Fix the ‘random.Random.seed()’ method when a *note + bool: 463. is passed as the seed. + + - bpo-39916(19): More reliable use of ‘os.scandir()’ in + ‘Path.glob()’. It no longer emits a ResourceWarning when + interrupted. + + - bpo-39850(20): *note multiprocessing: b5. now supports abstract + socket addresses (if abstract sockets are supported in the running + platform). When creating arbitrary addresses (like when + default-constructing *note multiprocessing.connection.Listener: + 139a. 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. + + - bpo-36287(21): *note ast.dump(): 522. 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. ‘Constant.kind’ is set to ‘None’). + + - bpo-39889(22): Fixed *note ast.unparse(): 523. for extended slices + containing a single element (e.g. ‘a[i:j,]’). Remove redundant + tuples when index with a tuple (e.g. ‘a[i, j]’). + + - bpo-39828(23): Fix *note json.tool: a3. to catch *note + BrokenPipeError: d0c. Patch by Dong-hee Na. + + - bpo-13487(24): Avoid a possible `“RuntimeError: dictionary changed + size during iteration”' from *note inspect.getmodule(): 11d4. when + it tried to loop through *note sys.modules: 1382. + + - bpo-39674(25): Revert “bpo-37330(26): 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. + + - bpo-28577(27): 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. + + - bpo-39826(28): Add getConnection method to logging HTTPHandler to + enable custom connections. + + - bpo-39763(29): Reimplement ‘distutils.spawn.spawn()’ function with + the *note subprocess: f6. module. + + - bpo-39794(30): Add –without-decimal-contextvar build option. This + enables a thread-local rather than a coroutine local context. + + - bpo-36144(31): *note collections.defaultdict: e71. now implements + ‘|’ ( PEP 584(32)). + + - bpo-39517(33): Fix runpy.run_path() when using pathlike objects + + - bpo-39775(34): Change ‘inspect.Signature.parameters’ back to + ‘collections.OrderedDict’. This was changed to ‘dict’ in Python + 3.9.0a4. + + - bpo-39678(35): Refactor queue_manager in *note + concurrent.futures.ProcessPoolExecutor: 52e. to make it easier to + maintain. + + - bpo-39764(36): Fix AttributeError when calling get_stack on a + PyAsyncGenObject Task + + - bpo-39769(37): The *note compileall.compile_dir(): 77b. function’s + `ddir' parameter and the compileall command line flag ‘-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. + + - bpo-36144(38): *note types.MappingProxyType: 3bb. objects now + support the merge (‘|’) operator from PEP 584(39). + + - bpo-38691(40): The *note importlib: 97. module now ignores the + *note PYTHONCASEOK: 5ae. environment variable when the *note -E: + 5af. or *note -I: 5b0. command line options are being used. + + - bpo-39719(41): Remove ‘tempfile.SpooledTemporaryFile.softspace()’ + as files no longer have the ‘softspace’ attribute in Python 3. + Patch by Shantanu. + + - bpo-39667(42): Improve pathlib.Path compatibility on zipfile.Path + and correct performance degradation as found in zipp 3.0. + + - bpo-39638(43): Keep ASDL signatures in the docstrings for ‘AST’ + nodes. Patch by Batuhan Taskaya + + - bpo-39639(44): Deprecated ‘ast.Suite’ node class because it’s no + longer used. Patch by Batuhan Taskaya. + + - bpo-39609(45): Add thread_name_prefix to default asyncio executor + + - bpo-39548(46): Fix handling of header in *note + urllib.request.AbstractDigestAuthHandler: 139b. when the optional + ‘qop’ parameter is not present. + + - bpo-39509(47): HTTP status codes ‘103 EARLY_HINTS’ and ‘425 + TOO_EARLY’ are added to *note http.HTTPStatus: 543. Patch by + Dong-hee Na. + + - bpo-39507(48): Adding HTTP status 418 “I’m a Teapot” to HTTPStatus + in http library. Patch by Ross Rhodes. + + - bpo-39495(49): Remove default value from `attrs' parameter of *note + xml.etree.ElementTree.TreeBuilder.start(): 139c. for consistency + between Python and C implementations. + + - bpo-38971(50): 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. + + - bpo-38641(51): Added starred expressions support to ‘return’ and + ‘yield’ statements for ‘lib2to3’. Patch by Vlad Emelianov. + + - bpo-37534(52): 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: + ‘https://www.w3.org/TR/xml/#sec-prolog-dtd’). + + - bpo-34788(53): Add support for scoped IPv6 addresses to *note + ipaddress: a0. Patch by Oleksandr Pavliuk. + + - bpo-34822(54): Simplified AST for subscription. Simple indices are + now represented by their value, extended slices are represented as + tuples. *note ast: 7. classes ‘Index’ and ‘ExtSlice’ are + considered deprecated and will be removed in future Python + versions. In the meantime, ‘Index(value)’ now returns a ‘value’ + itself, ‘ExtSlice(slices)’ returns ‘Tuple(slices, Load())’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39830 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=40000 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39999 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39991 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39988 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39656 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39969 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39360 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35370 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39936 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (12) https://peps.python.org/pep-0584/ + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39652 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39915 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (16) https://peps.python.org/pep-0584/ + + (17) https://bugs.python.org/issue?@action=redirect&bpo=38662 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=38075 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=39916 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=39850 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=36287 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=39889 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=39828 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=13487 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=39674 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=37330 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=28577 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=39826 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=39763 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=39794 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (32) https://peps.python.org/pep-0584/ + + (33) https://bugs.python.org/issue?@action=redirect&bpo=39517 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=39775 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=39678 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=39764 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=39769 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (39) https://peps.python.org/pep-0584/ + + (40) https://bugs.python.org/issue?@action=redirect&bpo=38691 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=39719 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=39667 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=39638 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=39639 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=39609 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=39548 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=39509 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=39507 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=39495 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=38971 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=38641 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=37534 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=34788 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=34822 + + +File: python.info, Node: Documentation<25>, Next: Tests<25>, Prev: Library<25>, Up: Python 3 9 0 alpha 5 + +1.21.26.4 Documentation +....................... + + - bpo-39868(1): Updated the Language Reference for PEP 572(2). + + - bpo-13790(3): Change ‘string’ to ‘specification’ in format doc. + + - bpo-17422(4): The language reference no longer restricts default + class namespaces to dicts only. + + - bpo-39530(5): Fix misleading documentation about mixed-type numeric + comparisons. + + - bpo-39718(6): Update *note token: 119. documentation to reflect + additions in Python 3.8 + + - bpo-39677(7): Changed operand name of `MAKE_FUNCTION' from `argc' + to `flags' for module *note dis: 36. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39868 + + (2) https://peps.python.org/pep-0572/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13790 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17422 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39530 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39718 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39677 + + +File: python.info, Node: Tests<25>, Next: Build<26>, Prev: Documentation<25>, Up: Python 3 9 0 alpha 5 + +1.21.26.5 Tests +............... + + - bpo-40019(1): test_gdb now skips tests if it detects that gdb + failed to read debug information because the Python binary is + optimized. + + - bpo-27807(2): ‘test_site.test_startup_imports()’ is now skipped if + a path of *note sys.path: 162. contains a ‘.pth’ file. + + - bpo-26067(3): Do not fail test_shutil test_chown test when uid or + gid of user cannot be resolved to a name. + + - bpo-39855(4): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40019 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27807 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26067 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39855 + + +File: python.info, Node: Build<26>, Next: Windows<24>, Prev: Tests<25>, Up: Python 3 9 0 alpha 5 + +1.21.26.6 Build +............... + + - bpo-39761(1): Fix build with DTrace but without additional DFLAGS. + + - bpo-39763(2): setup.py now uses a basic implementation of the *note + subprocess: f6. module if the *note subprocess: f6. module is not + available: before required C extension modules are built. + + - bpo-1294959(3): Add ‘--with-platlibdir’ option to the configure + script: name of the platform-specific library directory, stored in + the new *note sys.platlibdir: 580. attribute. It is used to build + the path of platform-specific extension modules and the path of the + standard library. It is equal to ‘"lib"’ on most platforms. On + Fedora and SuSE, it is equal to ‘"lib64"’ on 64-bit platforms. + Patch by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor + Stinner. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39761 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39763 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1294959 + + +File: python.info, Node: Windows<24>, Next: macOS<18>, Prev: Build<26>, Up: Python 3 9 0 alpha 5 + +1.21.26.7 Windows +................. + + - bpo-39930(1): Ensures the required ‘vcruntime140.dll’ is included + in install packages. + + - bpo-39847(2): Avoid hang when computer is hibernated whilst waiting + for a mutex (for lock-related objects from *note threading: 10b.) + around 49-day uptime. + + - bpo-38597(3): *note distutils: 37. will no longer statically link + ‘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. + + - bpo-38380(4): Update Windows builds to use SQLite 3.31.1 + + - bpo-39789(5): Update Windows release build machines to Visual + Studio 2019 (MSVC 14.2). + + - bpo-34803(6): Package for nuget.org now includes repository + reference and bundled icon image. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39930 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39847 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38597 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38380 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39789 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=34803 + + +File: python.info, Node: macOS<18>, Next: IDLE<16>, Prev: Windows<24>, Up: Python 3 9 0 alpha 5 + +1.21.26.8 macOS +............... + + - bpo-38380(1): Update macOS builds to use SQLite 3.31.1 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38380 + + +File: python.info, Node: IDLE<16>, Next: Tools/Demos<9>, Prev: macOS<18>, Up: Python 3 9 0 alpha 5 + +1.21.26.9 IDLE +.............. + + - bpo-27115(1): For ‘Go to Line’, use a Query box subclass with IDLE + standard behavior and improved error checking. + + - bpo-39885(2): Since clicking to get an IDLE context menu moves the + cursor, any text selection should be and now is cleared. + + - bpo-39852(3): Edit “Go to line” now clears any selection, + preventing accidental deletion. It also updates Ln and Col on the + status bar. + + - bpo-39781(4): Selecting code context lines no longer causes a jump. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27115 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39885 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39852 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39781 + + +File: python.info, Node: Tools/Demos<9>, Next: C API<23>, Prev: IDLE<16>, Up: Python 3 9 0 alpha 5 + +1.21.26.10 Tools/Demos +...................... + + - bpo-36184(1): 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. + + - bpo-38080(2): Added support to fix ‘getproxies’ in the + ‘lib2to3.fixes.fix_urllib’ module. Patch by José Roberto Meza + Cabrera. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36184 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38080 + + +File: python.info, Node: C API<23>, Prev: Tools/Demos<9>, Up: Python 3 9 0 alpha 5 + +1.21.26.11 C API +................ + + - bpo-40024(1): Add *note PyModule_AddType(): 5ca. helper function: + add a type to a module. Patch by Dong-hee Na. + + - bpo-39946(2): Remove ‘_PyRuntime.getframe’ hook and remove + ‘_PyThreadState_GetFrame’ macro which was an alias to + ‘_PyRuntime.getframe’. They were only exposed by the internal C + API. Remove also ‘PyThreadFrameGetter’ type. + + - bpo-39947(3): Add *note PyThreadState_GetFrame(): 361. function: + get the current frame of a Python thread state. + + - bpo-37207(4): Add _PyArg_NoKwnames helper function. Patch by + Dong-hee Na. + + - bpo-39947(5): Add *note PyThreadState_GetInterpreter(): 5c4.: get + the interpreter of a Python thread state. + + - bpo-39947(6): Add *note PyInterpreterState_Get(): 5c5. function to + the limited C API. + + - bpo-35370(7): If *note PySys_Audit(): 1397. fails in *note + PyEval_SetProfile(): 1136. or *note PyEval_SetTrace(): 1137, log + the error as an unraisable exception. + + - bpo-39947(8): 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. + + - bpo-39947(9): 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. + + - bpo-39884(10): *note PyDescr_NewMethod(): 13a5. and + ‘PyCFunction_NewEx()’ now include the method name in the + SystemError “bad call flags” error message to ease debug. + + - bpo-39877(11): Deprecated *note PyEval_InitThreads(): 592. and + *note PyEval_ThreadsInitialized(): 593. Calling *note + PyEval_InitThreads(): 592. now does nothing. + + - bpo-38249(12): *note Py_UNREACHABLE: 817. is now implemented with + ‘__builtin_unreachable()’ and analogs in release mode. + + - bpo-38643(13): *note PyNumber_ToBase(): 13a6. now raises a *note + SystemError: 9b5. instead of crashing when called with invalid + base. + + - bpo-39882(14): The *note Py_FatalError(): 5d9. function is replaced + with a macro which logs automatically the name of the current + function, unless the ‘Py_LIMITED_API’ macro is defined. + + - bpo-39824(15): Extension modules: *note m_traverse: 5cf, *note + m_clear: 5d0. and *note m_free: 5d1. functions of *note + PyModuleDef: 5d2. 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 + (*note Py_mod_exec: 5d3. function). More precisely, these + functions are not called if *note m_size: 5d4. is greater than 0 + and the module state (as returned by *note PyModule_GetState(): + 5d5.) is ‘NULL’. + + Extension modules without module state (‘m_size <= 0’) are not + affected. + + - bpo-38913(16): Fixed segfault in ‘Py_BuildValue()’ called with a + format containing “#” and undefined PY_SSIZE_T_CLEAN whwn an + exception is set. + + - bpo-38500(17): Add a private API to get and set the frame + evaluation function: add *note + _PyInterpreterState_GetEvalFrameFunc(): 13a7. and *note + _PyInterpreterState_SetEvalFrameFunc(): 13a8. C functions. The + *note _PyFrameEvalFunction: 348. function type now takes a `tstate' + parameter. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=40024 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39946 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35370 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39947 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39884 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=39877 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38249 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=38643 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39882 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=39824 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=38913 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=38500 + + +File: python.info, Node: Python 3 9 0 alpha 4, Next: Python 3 9 0 alpha 3, Prev: Python 3 9 0 alpha 5, Up: Changelog + +1.21.27 Python 3.9.0 alpha 4 +---------------------------- + +`Release date: 2020-02-25' + +* Menu: + +* Security: Security<16>. +* Core and Builtins: Core and Builtins<27>. +* Library: Library<26>. +* Documentation: Documentation<26>. +* Tests: Tests<26>. +* Build: Build<27>. +* Windows: Windows<25>. +* IDLE: IDLE<17>. +* C API: C API<24>. + + +File: python.info, Node: Security<16>, Next: Core and Builtins<27>, Up: Python 3 9 0 alpha 4 + +1.21.27.1 Security +.................. + + - bpo-39184(1): Add audit events to functions in *note fcntl: 79, + *note msvcrt: b4, *note os: c2, *note resource: dd, *note shutil: + e6, *note signal: e7. and *note syslog: fb. + + - bpo-39401(2): Avoid unsafe DLL load at startup on Windows 7 and + earlier. + + - bpo-39184(3): Add audit events to command execution functions in os + and pty modules. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39184 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39401 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39184 + + +File: python.info, Node: Core and Builtins<27>, Next: Library<26>, Prev: Security<16>, Up: Python 3 9 0 alpha 4 + +1.21.27.2 Core and Builtins +........................... + + - bpo-39382(1): Fix a use-after-free in the single inheritance path + of ‘issubclass()’, when the ‘__bases__’ of an object has a single + reference, and so does its first item. Patch by Yonatan + Goldschmidt. + + - bpo-39573(2): Update clinic tool to use *note Py_IS_TYPE(): 11fc. + Patch by Dong-hee Na. + + - bpo-39619(3): Enable use of *note os.chroot(): 13ac. on HP-UX + systems. + + - bpo-39573(4): Add *note Py_IS_TYPE(): 11fc. static inline function + to check whether the object `o' type is `type'. + + - bpo-39606(5): Fix regression caused by fix for bpo-39386(6), that + prevented calling ‘aclose’ on an async generator that had already + been closed or exhausted. + + - bpo-39579(7): Change the ending column offset of ‘Attribute’ nodes + constructed in ‘ast_for_dotted_name’ to point at the end of the + current node and not at the end of the last ‘NAME’ node. + + - bpo-1635741(8): Port _crypt extension module to multiphase + initialization ( PEP 489(9)). + + - bpo-1635741(10): Port _contextvars extension module to multiphase + initialization ( PEP 489(11)). + + - bpo-39510(12): Fix segfault in ‘readinto()’ method on closed + BufferedReader. + + - bpo-39502(13): Fix *note time.localtime(): 13ad. on 64-bit AIX to + support years before 1902 and after 2038. Patch by M Felt. + + - bpo-39492(14): Fix a reference cycle in the C Pickler that was + preventing the garbage collection of deleted, pickled objects. + + - bpo-39453(15): Fixed a possible crash in ‘list.__contains__()’ when + a list is changed during comparing items. Patch by Dong-hee Na. + + - bpo-39434(16): *note floor division: 58c. of float operation now + has a better performance. Also the message of *note + ZeroDivisionError: 58d. for this operation is updated. Patch by + Dong-hee Na. + + - bpo-1635741(17): Port _codecs extension module to multiphase + initialization ( PEP 489(18)). + + - bpo-1635741(19): Port _bz2 extension module to multiphase + initialization ( PEP 489(20)). + + - bpo-1635741(21): Port _abc extension module to multiphase + initialization ( PEP 489(22)). + + - bpo-39320(23): Replace two complex bytecodes for building dicts + with two simpler ones. The new bytecodes ‘DICT_MERGE’ and + ‘DICT_UPDATE’ have been added The old bytecodes ‘BUILD_MAP_UNPACK’ + and ‘BUILD_MAP_UNPACK_WITH_CALL’ have been removed. + + - bpo-39219(24): Syntax errors raised in the tokenizer now always set + correct “text” and “offset” attributes. + + - bpo-36051(25): Drop the GIL during large ‘bytes.join’ operations. + Patch by Bruce Merry. + + - bpo-38960(26): Fix DTrace build issues on FreeBSD. Patch by David + Carlier. + + - bpo-37207(27): Speed up calls to ‘range()’ by about 30%, by using + the PEP 590 ‘vectorcall’ calling convention. Patch by Mark + Shannon. + + - bpo-36144(28): *note dict: 16e. (and *note collections.UserDict: + 13ae.) objects now support PEP 584’s merge (‘|’) and update (‘|=’) + operators. Patch by Brandt Bucher. + + - bpo-32856(29): Optimized the idiom for assignment a temporary + variable in comprehensions. Now ‘for y in [expr]’ in + comprehensions is as fast as a simple assignment ‘y = expr’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39382 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39619 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39606 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39386 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39579 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (9) https://peps.python.org/pep-0489/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (11) https://peps.python.org/pep-0489/ + + (12) https://bugs.python.org/issue?@action=redirect&bpo=39510 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39502 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39492 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=39453 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=39434 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (18) https://peps.python.org/pep-0489/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (20) https://peps.python.org/pep-0489/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (22) https://peps.python.org/pep-0489/ + + (23) https://bugs.python.org/issue?@action=redirect&bpo=39320 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=39219 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=36051 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=38960 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=36144 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=32856 + + +File: python.info, Node: Library<26>, Next: Documentation<26>, Prev: Core and Builtins<27>, Up: Python 3 9 0 alpha 4 + +1.21.27.3 Library +................. + + - bpo-30566(1): Fix *note IndexError: 116b. when trying to decode an + invalid string with punycode codec. + + - bpo-39649(2): Remove obsolete check for ‘__args__’ in + bdb.Bdb.format_stack_entry. + + - bpo-39648(3): Expanded *note math.gcd(): 555. and *note math.lcm(): + 556. to handle multiple arguments. + + - bpo-39681(4): Fix a regression where the C pickle module wouldn’t + allow unpickling from a file-like object that doesn’t expose a + readinto() method. + + - bpo-35950(5): Raise *note io.UnsupportedOperation: 13b0. in + ‘io.BufferedReader.truncate()’ when it is called on a read-only + *note io.BufferedReader: ebd. instance. + + - bpo-39479(6): Add *note math.lcm(): 556. function: least common + multiple. + + - bpo-39674(7): Revert “Do not expose abstract collection classes in + the collections module” change (bpo-25988(8)). 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. + + - bpo-39104(9): Fix hanging ProcessPoolExcutor on + ‘shutdown(wait=False)’ when a task has failed pickling. + + - bpo-39627(10): Fixed TypedDict totality check for inherited keys. + + - bpo-39474(11): Fixed starting position of AST for expressions like + ‘(a)(b)’, ‘(a)[b]’ and ‘(a).b’. + + - bpo-21016(12): The *note pydoc: d6. and *note trace: 11c. modules + now use the *note sysconfig: fa. module to get the path to the + Python standard library, to support uncommon installation path like + ‘/usr/lib64/python3.9/’ on Fedora. Patch by Jan Matějek. + + - bpo-39590(13): Collections.deque now holds strong references during + deque.__contains__ and deque.count, fixing crashes. + + - bpo-39586(14): The distutils ‘bdist_msi’ command is deprecated in + Python 3.9, use ‘bdist_wheel’ (wheel packages) instead. + + - bpo-39595(15): 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(16). + + - bpo-39350(17): Fix regression in *note fractions.Fraction: 210. if + the numerator and/or the denominator is an *note int: 1c7. + subclass. The *note math.gcd(): 555. function is now used to + normalize the `numerator' and `denominator'. *note math.gcd(): + 555. always return a *note int: 1c7. type. Previously, the GCD + type depended on `numerator' and `denominator'. + + - bpo-39567(18): Added audit for *note os.walk(): a00, *note + os.fwalk(): 7b6, *note pathlib.Path.glob(): 239. and *note + pathlib.Path.rglob(): 23a. + + - bpo-39559(19): Remove unused, undocumented argument ‘getters’ from + *note uuid.getnode(): 80a. + + - bpo-38149(20): *note sys.audit(): 1387. is now called only once per + call of *note glob.glob(): 3f8. and *note glob.iglob(): 3f9. + + - bpo-39546(21): Fix a regression in *note ArgumentParser: a3e. where + ‘allow_abbrev=False’ was ignored for long options that used a + prefix character other than “-“. + + - bpo-39450(22): Striped whitespace from docstring before returning + it from ‘unittest.case.shortDescription()’. + + - bpo-12915(23): A new function ‘resolve_name’ has been added to the + ‘pkgutil’ module. This resolves a string of the form ‘'a.b.c.d'’ + or ‘'a.b:c.d'’ to an object. In the example, ‘a.b’ is a + package/module and ‘c.d’ is an object within that package/module + reached via recursive attribute access. + + - bpo-39353(24): The *note binascii.crc_hqx(): 2fc. function is no + longer deprecated. + + - bpo-39493(25): Mark ‘typing.IO.closed’ as a property + + - bpo-39491(26): Add *note typing.Annotated: 585. and + ‘include_extras’ parameter to *note typing.get_type_hints(): 277. + as part of PEP 593(27). Patch by Till Varoquaux, documentation by + Till Varoquaux and Konstantin Kashin. + + - bpo-39485(28): Fix a bug in *note unittest.mock.create_autospec(): + 13b1. that would complain about the wrong number of arguments for + custom descriptors defined in an extension module returning + functions. + + - bpo-38932(29): Mock fully resets child objects on reset_mock(). + Patch by Vegard Stikbakke + + - bpo-39082(30): Allow AsyncMock to correctly patch static/class + methods + + - bpo-39432(31): Implement PEP-489 algorithm for non-ascii “PyInit_…” + symbol names in distutils to make it export the correct init symbol + also on Windows. + + - bpo-18819(32): Omit ‘devmajor’ and ‘devminor’ fields for non-device + files in *note tarfile: fd. archives, enabling bit-for-bit + compatibility with GNU ‘tar(1)’. + + - bpo-39349(33): Added a new `cancel_futures' parameter to *note + concurrent.futures.Executor.shutdown(): 52d. that cancels all + pending futures which have not started running, instead of waiting + for them to complete before shutting down the executor. + + - bpo-39274(34): ‘bool(fraction.Fraction)’ now returns a boolean even + if (numerator != 0) does not return a boolean (ex: numpy number). + + - bpo-34793(35): Remove support for ‘with (await asyncio.lock):’ and + ‘with (yield from asyncio.lock):’. The same is correct for + ‘asyncio.Condition’ and ‘asyncio.Semaphore’. + + - bpo-25597(36): Ensure, if ‘wraps’ is supplied to *note + unittest.mock.MagicMock: b1d, it is used to calculate return values + for the magic methods instead of using the default return values. + Patch by Karthikeyan Singaravelan. + + - bpo-36350(37): *note inspect.Signature.parameters: 13b2. and *note + inspect.BoundArguments.arguments: 550. are now dicts instead of + OrderedDicts. Patch contributed by Rémi Lapeyre. + + - bpo-35727(38): Fix sys.exit() and sys.exit(None) exit code + propagation when used in multiprocessing.Process. + + - bpo-32173(39): * Add ‘lazycache’ function to ‘__all__’. * Use + *note dict.clear: 13b3. to clear the cache. * Refactoring + ‘getline’ function and ‘checkcache’ function. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30566 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39649 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39648 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39681 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35950 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39479 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39674 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=25988 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39104 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39627 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=39474 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=21016 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39590 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39586 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=39595 + + (16) +https://importlib-metadata.readthedocs.io/en/latest/changelog%20(links).html#v1-5-0 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=39350 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=39567 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=39559 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=38149 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=39546 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=39450 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=12915 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=39353 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=39493 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=39491 + + (27) https://peps.python.org/pep-0593/ + + (28) https://bugs.python.org/issue?@action=redirect&bpo=39485 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=38932 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=39082 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=39432 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=18819 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=39349 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=39274 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=34793 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=25597 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=36350 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=35727 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=32173 + + +File: python.info, Node: Documentation<26>, Next: Tests<26>, Prev: Library<26>, Up: Python 3 9 0 alpha 4 + +1.21.27.4 Documentation +....................... + + - bpo-17422(1): The language reference now specifies restrictions on + class namespaces. Adapted from a patch by Ethan Furman. + + - bpo-39572(2): Updated documentation of ‘total’ flag of ‘TypedDict’. + + - bpo-39654(3): In pyclbr doc, update ‘class’ to ‘module’ where + appropriate and add readmodule comment. Patch by Hakan Çelik. + + - bpo-39153(4): Clarify refcounting semantics for the following + functions: - PyObject_SetItem - PyMapping_SetItemString - + PyDict_SetItem - PyDict_SetItemString + + - bpo-39392(5): Explain that when filling with turtle, overlap + regions may be left unfilled. + + - bpo-39369(6): 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. + + - bpo-9056(7): Include subsection in TOC for PDF version of docs. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17422 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39572 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39654 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39153 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39392 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39369 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=9056 + + +File: python.info, Node: Tests<26>, Next: Build<27>, Prev: Documentation<26>, Up: Python 3 9 0 alpha 4 + +1.21.27.5 Tests +............... + + - bpo-38325(1): Skip tests on non-BMP characters of + test_winconsoleio. + + - bpo-39502(2): Skip test_zipfile.test_add_file_after_2107() if *note + time.localtime(): 13ad. fails with *note OverflowError: 4a4. It is + the case on AIX 6.1 for example. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38325 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39502 + + +File: python.info, Node: Build<27>, Next: Windows<25>, Prev: Tests<26>, Up: Python 3 9 0 alpha 4 + +1.21.27.6 Build +............... + + - bpo-39489(1): Remove ‘COUNT_ALLOCS’ special build. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39489 + + +File: python.info, Node: Windows<25>, Next: IDLE<17>, Prev: Build<27>, Up: Python 3 9 0 alpha 4 + +1.21.27.7 Windows +................. + + - bpo-39553(1): Delete unused code related to SxS manifests. + + - bpo-39439(2): Honor the Python path when a virtualenv is active on + Windows. + + - bpo-39393(3): Improve the error message when attempting to load a + DLL with unresolved dependencies. + + - bpo-38883(4): *note home(): ac7. and *note expanduser(): ac6. on + Windows now prefer ‘USERPROFILE’ and no longer use ‘HOME’, which is + not normally set for regular user accounts. This makes them again + behave like *note os.path.expanduser(): 65d, which was changed to + ignore ‘HOME’ in 3.8, see bpo-36264(5). + + - bpo-39185(6): The build.bat script has additional options for + very-quiet output (-q) and very-verbose output (-vv) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39553 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39439 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39393 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38883 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36264 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39185 + + +File: python.info, Node: IDLE<17>, Next: C API<24>, Prev: Windows<25>, Up: Python 3 9 0 alpha 4 + +1.21.27.8 IDLE +.............. + + - bpo-39663(1): Add tests for pyparse find_good_parse_start(). + + - bpo-39600(2): In the font configuration window, remove duplicated + font names. + + - bpo-30780(3): Add remaining configdialog tests for buttons and + highlights and keys tabs. + + - bpo-39388(4): IDLE Settings Cancel button now cancels pending + changes + + - bpo-38792(5): Close an IDLE shell calltip if a *note + KeyboardInterrupt: 611. or shell restart occurs. Patch by Zackery + Spytz. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39663 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39600 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30780 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39388 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38792 + + +File: python.info, Node: C API<24>, Prev: IDLE<17>, Up: Python 3 9 0 alpha 4 + +1.21.27.9 C API +............... + + - bpo-35081(1): Move the ‘bytes_methods.h’ header file to the + internal C API as ‘pycore_bytes_methods.h’: it only contains + private symbols (prefixed by ‘_Py’), except of the + ‘PyDoc_STRVAR_shared()’ macro. + + - bpo-35081(2): Move the ‘dtoa.h’ header file to the internal C API + as ‘pycore_dtoa.h’: it only contains private functions (prefixed by + ‘_Py’). The *note math: af. and *note cmath: 17. modules must now + be compiled with the ‘Py_BUILD_CORE’ macro defined. + + - bpo-39573(3): Add *note Py_SET_SIZE(): 358. function to set the + size of an object. + + - bpo-39500(4): *note PyUnicode_IsIdentifier(): 13ba. does not call + *note Py_FatalError(): 5d9. anymore if the string is not ready. + + - bpo-39573(5): Add *note Py_SET_TYPE(): 356. function to set the + type of an object. + + - bpo-39573(6): Add a *note Py_SET_REFCNT(): 4dd. function to set the + reference counter of an object. + + - bpo-39542(7): Convert *note PyType_HasFeature(): 1366, *note + PyType_Check(): 13bb. and *note PyType_CheckExact(): 13bc. macros + to static inline functions. + + - bpo-39542(8): In the limited C API, ‘PyObject_INIT()’ and + ‘PyObject_INIT_VAR()’ are now defined as aliases to *note + PyObject_Init(): 6bc. and *note PyObject_InitVar(): 1368. 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: ‘_Py_NewReference()’, ‘_Py_ForgetReference()’, + ‘_PyTraceMalloc_NewReference()’ and ‘_Py_GetRefTotal()’. + + - bpo-39542(9): 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. + + - bpo-39511(10): The *note PyThreadState_Clear(): 137e. function now + calls the ‘PyThreadState.on_delete’ callback. Previously, that + happened in *note PyThreadState_Delete(): 13bd. + + - bpo-38076(11): Fix to clear the interpreter state only after + clearing module globals to guarantee module state access from C + Extensions during runtime destruction + + - bpo-39245(12): The Vectorcall API (PEP 590) was made public, adding + the functions ‘PyObject_Vectorcall’, ‘PyObject_VectorcallMethod’, + ‘PyVectorcall_Function’, ‘PyObject_CallOneArg’, + ‘PyObject_CallMethodNoArgs’, ‘PyObject_CallMethodOneArg’, + ‘PyObject_FastCallDict’, and the flag ‘Py_TPFLAGS_HAVE_VECTORCALL’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35081 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35081 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39500 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39573 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39542 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39542 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39542 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39511 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38076 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=39245 + + +File: python.info, Node: Python 3 9 0 alpha 3, Next: Python 3 9 0 alpha 2, Prev: Python 3 9 0 alpha 4, Up: Changelog + +1.21.28 Python 3.9.0 alpha 3 +---------------------------- + +`Release date: 2020-01-24' + +* Menu: + +* Core and Builtins: Core and Builtins<28>. +* Library: Library<27>. +* Documentation: Documentation<27>. +* Build: Build<28>. +* IDLE: IDLE<18>. +* C API: C API<25>. + + +File: python.info, Node: Core and Builtins<28>, Next: Library<27>, Up: Python 3 9 0 alpha 3 + +1.21.28.1 Core and Builtins +........................... + + - bpo-39427(1): Document all possibilities for the ‘-X’ options in + the command line help section. Patch by Pablo Galindo. + + - bpo-39421(2): Fix possible crashes when operating with the + functions in the *note heapq: 89. module and custom comparison + operators. + + - bpo-39386(3): Prevent double awaiting of async iterator. + + - bpo-17005(4): Add ‘functools.TopologicalSorter’ to the *note + functools: 7f. module to offers functionality to perform + topological sorting of graphs. Patch by Pablo Galindo, Tim Peters + and Larry Hastings. + + - bpo-39320(5): Replace four complex bytecodes for building sequences + with three simpler ones. + + The following four bytecodes have been removed: + + * BUILD_LIST_UNPACK + + * BUILD_TUPLE_UNPACK + + * BUILD_SET_UNPACK + + * BUILD_TUPLE_UNPACK_WITH_CALL + + The following three bytecodes have been added: + + * LIST_TO_TUPLE + + * LIST_EXTEND + + * SET_UPDATE + + - bpo-39336(6): Import loaders which publish immutable module objects + can now publish immutable packages in addition to individual + modules. + + - bpo-39322(7): Added a new function *note gc.is_finalized(): 540. to + check if an object has been finalized by the garbage collector. + Patch by Pablo Galindo. + + - bpo-39048(8): Improve the displayed error message when incorrect + types are passed to ‘async with’ statements by looking up the + ‘__aenter__()’ special method before the ‘__aexit__()’ special + method when entering an asynchronous context manager. Patch by + Géry Ogam. + + - bpo-39235(9): Fix AST end location for lone generator expression in + function call, e.g. f(i for i in a). + + - bpo-39209(10): Correctly handle multi-line tokens in interactive + mode. Patch by Pablo Galindo. + + - bpo-1635741(11): Port _json extension module to multiphase + initialization ( PEP 489(12)). + + - bpo-39216(13): Fix constant folding optimization for positional + only arguments - by Anthony Sottile. + + - bpo-39215(14): Fix ‘SystemError’ when nested function has + annotation on positional-only argument - by Anthony Sottile. + + - bpo-39200(15): Correct the error message when calling the *note + min(): b99. or *note max(): b9a. with no arguments. Patch by + Dong-hee Na. + + - bpo-39200(16): Correct the error message when trying to construct + *note range: 58b. objects with no arguments. Patch by Pablo + Galindo. + + - bpo-39166(17): Fix incorrect line execution reporting in trace + functions when tracing the last iteration of asynchronous for + loops. Patch by Pablo Galindo. + + - bpo-39114(18): Fix incorrect line execution reporting in trace + functions when tracing exception handlers with name binding. Patch + by Pablo Galindo. + + - bpo-39156(19): Split the COMPARE_OP bytecode instruction into four + distinct instructions. + + * COMPARE_OP for rich comparisons + + * IS_OP for ‘is’ and ‘is not’ tests + + * CONTAINS_OP for ‘in’ and ‘is not’ tests + + * JUMP_IF_NOT_EXC_MATCH for checking exceptions in ‘try-except’ + statements. + + This improves the clarity of the interpreter and should provide a + modest speedup. + + - bpo-38588(20): Fix possible crashes in dict and list when calling + *note PyObject_RichCompareBool(): 13c0. + + - bpo-13601(21): By default, ‘sys.stderr’ is line-buffered now, even + if ‘stderr’ is redirected to a file. You can still make + ‘sys.stderr’ unbuffered by passing the *note -u: 13c1. command-line + option or setting the *note PYTHONUNBUFFERED: 13c2. environment + variable. + + (Contributed by Jendrik Seipp in bpo-13601(22).) + + - bpo-38610(23): Fix possible crashes in several list methods by + holding strong references to list elements when calling *note + PyObject_RichCompareBool(): 13c0. + + - bpo-32021(24): Include brotli .br encoding in mimetypes + encodings_map + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39427 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39421 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39386 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17005 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39320 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39336 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=39322 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39048 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39235 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39209 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=1635741 + + (12) https://peps.python.org/pep-0489/ + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39216 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39215 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=39200 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=39200 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=39166 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=39114 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=39156 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=38588 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=13601 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=13601 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=38610 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=32021 + + +File: python.info, Node: Library<27>, Next: Documentation<27>, Prev: Core and Builtins<28>, Up: Python 3 9 0 alpha 3 + +1.21.28.2 Library +................. + + - bpo-39430(1): Fixed race condition in lazy imports in *note + tarfile: fd. + + - bpo-39413(2): The *note os.unsetenv(): 563. function is now also + available on Windows. + + - bpo-39390(3): Fixed a regression with the ‘ignore’ callback of + *note shutil.copytree(): 675. The argument types are now str and + List[str] again. + + - bpo-39395(4): The *note os.putenv(): 564. and *note os.unsetenv(): + 563. functions are now always available. + + - bpo-39406(5): If ‘setenv()’ C function is available, *note + os.putenv(): 564. is now implemented with ‘setenv()’ instead of + ‘putenv()’, so Python doesn’t have to handle the environment + variable memory. + + - bpo-39396(6): Fix ‘math.nextafter(-0.0, +0.0)’ on AIX 7.1. + + - bpo-29435(7): Allow *note tarfile.is_tarfile(): 1238. to be used + with file and file-like objects, like *note zipfile.is_zipfile(): + fc4. Patch by William Woodruff. + + - bpo-39377(8): Removed ‘encoding’ option from *note json.loads(): + 5a6. It has been deprecated since Python 3.1. + + - bpo-39389(9): Write accurate compression level metadata in *note + gzip: 87. archives, rather than always signaling maximum + compression. + + - bpo-39366(10): The previously deprecated ‘xpath()’ and ‘xgtitle()’ + methods of *note nntplib.NNTP: 55d. have been removed. + + - bpo-39357(11): Remove the `buffering' parameter of *note + bz2.BZ2File: 5a5. Since Python 3.0, it was ignored and using it + was emitting *note DeprecationWarning: 2d4. Pass an open file + object, to control how the file is opened. The `compresslevel' + parameter becomes keyword-only. + + - bpo-39353(12): Deprecate binhex4 and hexbin4 standards. Deprecate + the ‘binhex’ module and the following *note binascii: f. functions: + ‘b2a_hqx()’, ‘a2b_hqx()’, ‘rlecode_hqx()’, ‘rledecode_hqx()’, *note + crc_hqx(): 2fc. + + - bpo-39351(13): Remove ‘base64.encodestring()’ and + ‘base64.decodestring()’, aliases deprecated since Python 3.1: use + *note base64.encodebytes(): 5a3. and *note base64.decodebytes(): + 5a4. instead. + + - bpo-39350(14): Remove ‘fractions.gcd()’ function, deprecated since + Python 3.5 (bpo-22486(15)): use *note math.gcd(): 555. instead. + + - bpo-39329(16): *note LMTP: 577. constructor now has an optional + `timeout' parameter. Patch by Dong-hee Na. + + - bpo-39313(17): Add a new ‘exec_function’ option (`–exec-function' + in the CLI) to ‘RefactoringTool’ for making ‘exec’ a function. + Patch by Batuhan Taskaya. + + - bpo-39259(18): *note FTP_TLS: 53e. and *note FTP_TLS: 53e. now + raise a *note ValueError: 1c8. if the given timeout for their + constructor is zero to prevent the creation of a non-blocking + socket. Patch by Dong-hee Na. + + - bpo-39259(19): *note SMTP: 575. and *note SMTP_SSL: 576. now raise + a *note ValueError: 1c8. if the given timeout for their constructor + is zero to prevent the creation of a non-blocking socket. Patch by + Dong-hee Na. + + - bpo-39310(20): Add *note math.ulp(): 558.: return the value of the + least significant bit of a float. + + - bpo-39297(21): Improved performance of importlib.metadata + distribution discovery and resilients to inaccessible sys.path + entries (importlib_metadata v1.4.0). + + - bpo-39259(22): *note NNTP: 55d. and *note NNTP_SSL: 55e. now raise + a *note ValueError: 1c8. if the given timeout for their constructor + is zero to prevent the creation of a non-blocking socket. Patch by + Dong-hee Na. + + - bpo-38901(23): 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. + + - bpo-39288(24): Add *note math.nextafter(): 557.: return the next + floating-point value after `x' towards `y'. + + - bpo-39259(25): *note POP3: 56c. and *note POP3_SSL: 56d. now raise + a *note ValueError: 1c8. if the given timeout for their constructor + is zero to prevent the creation of a non-blocking socket. Patch by + Dong-hee Na. + + - bpo-39242(26): Updated the Gmane domain from news.gmane.org to + news.gmane.io which is used for examples of *note NNTP: 55d. news + reader server and nntplib tests. + + - bpo-35292(27): Proxy the ‘SimpleHTTPRequestHandler.guess_type’ to + *note mimetypes.guess_type: 13c4. so the *note mimetypes.init: + 13c5. is called lazily to avoid unnecessary costs when *note + http.server: 92. module is imported. + + - bpo-39239(28): The *note select.epoll.unregister(): 5ac. method no + longer ignores the *note EBADF: 5ad. error. + + - bpo-38907(29): In http.server script, restore binding to IPv4 on + Windows. + + - bpo-39152(30): Fix ttk.Scale.configure([name]) to return + configuration tuple for name or all options. Giovanni Lombardo + contributed part of the patch. + + - bpo-39198(31): If an exception were to be thrown in + ‘Logger.isEnabledFor’ (say, by asyncio timeouts or stopit) , the + *note logging: a8. global lock may not be released appropriately, + resulting in deadlock. This change wraps that block of code with + ‘try...finally’ to ensure the lock is released. + + - bpo-39191(32): Perform a check for running loop before starting a + new task in ‘loop.run_until_complete()’ to fail fast; it prevents + the side effect of new task spawning before exception raising. + + - bpo-38871(33): Correctly parenthesize filter-based statements that + contain lambda expressions in mod:*note lib2to3: a5. Patch by + Dong-hee Na. + + - bpo-39142(34): 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. + + - bpo-39158(35): ast.literal_eval() now supports empty sets. + + - bpo-39129(36): Fix import path for ‘asyncio.TimeoutError’ + + - bpo-39057(37): ‘urllib.request.proxy_bypass_environment()’ now + ignores leading dots and no longer ignores a trailing newline. + + - bpo-39056(38): Fixed handling invalid warning category in the -W + option. No longer import the re module if it is not needed. + + - bpo-39055(39): *note base64.b64decode(): 13c6. with ‘validate=True’ + raises now a binascii.Error if the input ends with a single ‘\n’. + + - bpo-21600(40): Fix ‘mock.patch.stopall()’ to stop active patches + that were created with ‘mock.patch.dict()’. + + - bpo-39019(41): Implement dummy ‘__class_getitem__’ for *note + tempfile.SpooledTemporaryFile: e03. + + - bpo-39019(42): Implement dummy ‘__class_getitem__’ for + ‘subprocess.Popen’, ‘subprocess.CompletedProcess’ + + - bpo-38914(43): Adjusted the wording of the warning issued by + distutils’ ‘check’ command when the ‘author’ and ‘maintainer’ + fields are supplied but no corresponding e-mail field + (‘author_email’ or ‘maintainer_email’) is found. The wording now + reflects the fact that these fields are suggested, but not + required. Patch by Juergen Gmach. + + - bpo-38878(44): Fixed __subclasshook__ of *note os.PathLike: 8bf. to + return a correct result upon inheritance. Patch by Bar Harel. + + - bpo-38615(45): *note IMAP4: 546. and *note IMAP4_SSL: 547. now have + an optional `timeout' parameter for their constructors. Also, the + *note open(): 548. method now has an optional `timeout' parameter + with this change. The overridden methods of *note IMAP4_SSL: 547. + and *note IMAP4_stream: 549. were applied to this change. Patch by + Dong-hee Na. + + - bpo-35182(46): Fixed ‘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. + + - bpo-38630(47): On Unix, *note subprocess.Popen.send_signal(): 13c7. + now polls the process status. Polling reduces the risk of sending + a signal to the wrong process if the process completed, the *note + subprocess.Popen.returncode: 13c8. attribute is still ‘None’, and + the pid has been reassigned (recycled) to a new different process. + + - bpo-38536(48): Removes trailing space in formatted currency with + ‘international=True’ and a locale with symbol following value. + E.g. ‘locale.currency(12.34, international=True)’ returned ‘'12,34 + EUR '’ instead of ‘'12,34 EUR'’. + + - bpo-38473(49): Use signature from inner mock for autospecced + methods attached with ‘unittest.mock.attach_mock()’. Patch by + Karthikeyan Singaravelan. + + - bpo-38361(50): Fixed an issue where ‘ident’ could include a leading + path separator when *note syslog.openlog(): 13c9. was called + without arguments. + + - bpo-38293(51): Add *note copy.copy(): 7cc. and *note + copy.deepcopy(): 7cd. support to *note property(): 205. objects. + + - bpo-37958(52): Added the pstats.Stats.get_profile_dict() method to + return the profile data as a StatsProfile instance. + + - bpo-28367(53): Termios magic constants for the following baud + rates: - B500000 - B576000 - B921600 - B1000000 - B1152000 - + B1500000 - B2000000 - B2500000 - B3000000 - B3500000 - B4000000 + Patch by Andrey Smirnov + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39430 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39413 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39390 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=39395 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39406 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=39396 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29435 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=39377 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=39389 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=39366 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=39357 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=39353 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=39351 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=39350 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=22486 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=39329 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=39313 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=39310 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=39297 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=38901 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=39288 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=39259 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=39242 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=35292 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=39239 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=38907 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=39152 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=39198 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=39191 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=38871 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=39142 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=39158 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=39129 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=39057 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=39056 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=39055 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=21600 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=39019 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=39019 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=38914 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=38878 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=38615 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=35182 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=38630 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=38536 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=38473 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=38361 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=38293 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=37958 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=28367 + + +File: python.info, Node: Documentation<27>, Next: Build<28>, Prev: Library<27>, Up: Python 3 9 0 alpha 3 + +1.21.28.3 Documentation +....................... + + - bpo-39381(1): Mention in docs that *note asyncio.get_event_loop(): + 475. implicitly creates new event loop only if called from the main + thread. + + - bpo-38918(2): Add an entry for ‘__module__’ in the “function” & + “method” sections of the inspect docs types and members table(3) + + - bpo-3530(4): In the *note ast: 7. module documentation, fix a + misleading ‘NodeTransformer’ example and add advice on when to use + the ‘fix_missing_locations’ function. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39381 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38918 + + (3) https://docs.python.org/3/library/inspect.html#types-and-members + + (4) https://bugs.python.org/issue?@action=redirect&bpo=3530 + + +File: python.info, Node: Build<28>, Next: IDLE<18>, Prev: Documentation<27>, Up: Python 3 9 0 alpha 3 + +1.21.28.4 Build +............... + + - bpo-39395(1): On non-Windows platforms, the ‘setenv()’ and + ‘unsetenv()’ functions are now required to build Python. + + - bpo-39160(2): Updated the documentation in ‘/configure --help’ to + show default values, reference documentation where required and add + additional explanation where needed. + + - bpo-39144(3): The ctags and etags build targets both include + Modules/_ctypes and Python standard library source files. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39395 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39160 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39144 + + +File: python.info, Node: IDLE<18>, Next: C API<25>, Prev: Build<28>, Up: Python 3 9 0 alpha 3 + +1.21.28.5 IDLE +.............. + + - bpo-39050(1): Make IDLE Settings dialog Help button work again. + + - bpo-34118(2): Tag memoryview, range, and tuple as classes, the same + as list, etcetera, in the library manual built-in functions list. + + - bpo-32989(3): Add tests for editor newline_and_indent_event method. + Remove dead code from pyparse find_good_parse_start method. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39050 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34118 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32989 + + +File: python.info, Node: C API<25>, Prev: IDLE<18>, Up: Python 3 9 0 alpha 3 + +1.21.28.6 C API +............... + + - bpo-39372(1): Clean header files of interfaces defined but with no + implementation. The public API symbols being removed are: + ‘_PyBytes_InsertThousandsGroupingLocale’, + ‘_PyBytes_InsertThousandsGrouping’, ‘_Py_InitializeFromArgs’, + ‘_Py_InitializeFromWideArgs’, ‘_PyFloat_Repr’, ‘_PyFloat_Digits’, + ‘_PyFloat_DigitsInit’, ‘PyFrame_ExtendStack’, + ‘_PyAIterWrapper_Type’, ‘PyNullImporter_Type’, ‘PyCmpWrapper_Type’, + ‘PySortWrapper_Type’, ‘PyNoArgsFunction’. + + - bpo-39164(2): Add a private ‘_PyErr_GetExcInfo()’ function to + retrieve exception information of the specified Python thread + state. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39372 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39164 + + +File: python.info, Node: Python 3 9 0 alpha 2, Next: Python 3 9 0 alpha 1, Prev: Python 3 9 0 alpha 3, Up: Changelog + +1.21.29 Python 3.9.0 alpha 2 +---------------------------- + +`Release date: 2019-12-18' + +* Menu: + +* Security: Security<17>. +* Core and Builtins: Core and Builtins<29>. +* Library: Library<28>. +* Documentation: Documentation<28>. +* Tests: Tests<27>. +* Build: Build<29>. +* Windows: Windows<26>. +* macOS: macOS<19>. +* IDLE: IDLE<19>. +* C API: C API<26>. + + +File: python.info, Node: Security<17>, Next: Core and Builtins<29>, Up: Python 3 9 0 alpha 2 + +1.21.29.1 Security +.................. + + - bpo-38945(1): 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. + + - bpo-37228(2): Due to significant security concerns, the + `reuse_address' parameter of *note + asyncio.loop.create_datagram_endpoint(): 2fb. is no longer + supported. This is because of the behavior of ‘SO_REUSEADDR’ in + UDP. For more details, see the documentation for + ‘loop.create_datagram_endpoint()’. (Contributed by Kyle Stanley, + Antoine Pitrou, and Yury Selivanov in bpo-37228(3).) + + - bpo-38804(4): Fixes a ReDoS vulnerability in *note http.cookiejar: + 90. Patch by Ben Caller. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38945 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37228 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37228 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38804 + + +File: python.info, Node: Core and Builtins<29>, Next: Library<28>, Prev: Security<17>, Up: Python 3 9 0 alpha 2 + +1.21.29.2 Core and Builtins +........................... + + - bpo-39028(1): Slightly improve the speed of keyword argument + parsing with many kwargs by strengthening the assumption that + kwargs are interned strings. + + - bpo-39080(2): 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. + + - bpo-39031(3): 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. + + - bpo-20443(4): 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. + + - bpo-39008(5): *note PySys_Audit(): 1397. now requires ‘Py_ssize_t’ + to be used for size arguments in the format string, regardless of + whether ‘PY_SSIZE_T_CLEAN’ was defined at include time. + + - bpo-38673(6): In REPL mode, don’t switch to PS2 if the line starts + with comment or whitespace. Based on work by Batuhan Taşkaya. + + - bpo-38922(7): Calling ‘replace’ on a code object now raises the + ‘code.__new__’ audit event. + + - bpo-38920(8): Add audit hooks for when *note sys.excepthook(): 3fe. + and *note sys.unraisablehook(): 24e. are invoked. + + - bpo-38892(9): Improve documentation for audit events table and + functions. + + - bpo-38852(10): Set the thread stack size to 8 Mb for debug builds + on android platforms. + + - bpo-38858(11): 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 ‘NSMALLNEGINTS’ and ‘NSMALLPOSINTS’ macros: macros + should now be modified manually in ‘pycore_pystate.h’ header file. + + - bpo-36854(12): The garbage collector state becomes per interpreter + (‘PyInterpreterState.gc’), rather than being global + (‘_PyRuntimeState.gc’). + + - bpo-38835(13): The ‘PyFPE_START_PROTECT()’ and + ‘PyFPE_END_PROTECT()’ macros are empty: they have been doing + nothing for the last year, so stop using them. + + - bpo-38328(14): Sped up the creation time of constant *note list: + 1e9. and *note set: 1a6. displays. Patch by Brandt Bucher. + + - bpo-38707(15): ‘MainThread.native_id’ is now correctly reset in + child processes spawned using *note multiprocessing.Process: 7b4, + instead of retaining the parent’s value. + + - bpo-38629(16): Added ‘__floor__’ and ‘__ceil__’ methods to float + object. Patch by Batuhan Taşkaya. + + - bpo-27145(17): int + int and int - int operators can now return + small integer singletons. Patch by hongweipeng. + + - bpo-38021(18): Provide a platform tag for AIX that is sufficient + for PEP425 binary distribution identification. Patch by Michael + Felt. + + - bpo-35409(19): Ignore GeneratorExit exceptions when throwing an + exception into the aclose coroutine of an asynchronous generator. + + - bpo-33387(20): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39028 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39080 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39031 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20443 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=39008 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38673 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38922 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38920 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38892 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38852 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38858 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36854 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=38835 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=38328 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=38707 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=38629 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=27145 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=38021 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=35409 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=33387 + + +File: python.info, Node: Library<28>, Next: Documentation<28>, Prev: Core and Builtins<29>, Up: Python 3 9 0 alpha 2 + +1.21.29.3 Library +................. + + - bpo-39033(1): Fix *note NameError: 396. in *note zipimport: 14e. + Patch by Karthikeyan Singaravelan. + + - bpo-39022(2): Update importlib.metadata to include improvements + from importlib_metadata 1.3 including better serialization of + EntryPoints and improved documentation for custom finders. + + - bpo-39006(3): Fix asyncio when the ssl module is missing: only + check for ssl.SSLSocket instance if the ssl module is available. + + - bpo-38708(4): Fix a potential IndexError in email parser when + parsing an empty msg-id. + + - bpo-38698(5): Add a new ‘InvalidMessageID’ token to email parser to + represent invalid Message-ID headers. Also, add defects when there + is remaining value after parsing the header. + + - bpo-38994(6): Implement ‘__class_getitem__’ for ‘os.PathLike’, + ‘pathlib.Path’. + + - bpo-38979(7): Return class from ‘ContextVar.__class_getitem__’ to + simplify subclassing. + + - bpo-38978(8): Implement ‘__class_getitem__’ on asyncio objects + (Future, Task, Queue). Patch by Batuhan Taskaya. + + - bpo-38916(9): *note array.array: 3d2.: Remove ‘tostring()’ and + ‘fromstring()’ methods. They were aliases to ‘tobytes()’ and + ‘frombytes()’, deprecated since Python 3.2. + + - bpo-38986(10): Make repr of C accelerated TaskWakeupMethWrapper the + same as of pure Python version. + + - bpo-38982(11): Fix asyncio ‘PidfdChildWatcher’: handle ‘waitpid()’ + error. If ‘waitpid()’ is called elsewhere, ‘waitpid()’ call fails + with *note ChildProcessError: d08.: use return code 255 in this + case, and log a warning. It ensures that the pidfd file descriptor + is closed if this error occurs. + + - bpo-38529(12): Drop too noisy asyncio warning about deletion of a + stream without explicit ‘.close()’ call. + + - bpo-27413(13): Added ability to pass through ‘ensure_ascii’ options + to json.dumps in the ‘json.tool’ command-line interface. + + - bpo-38634(14): The *note readline: db. module now detects if Python + is linked to libedit at runtime on all platforms. Previously, the + check was only done on macOS. + + - bpo-33684(15): Fix ‘json.tool’ failed to read a JSON file with + non-ASCII characters when locale encoding is not UTF-8. + + - bpo-38698(16): 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 *note UnboundLocalError: 116c. + on parsing an invalid value. Patch by Claudiu Popa. + + - bpo-38927(17): Use ‘python -m pip’ instead of ‘pip’ to upgrade + dependencies in venv. + + - bpo-26730(18): Fix ‘SpooledTemporaryFile.rollover()’ might corrupt + the file when it is in text mode. Patch by Serhiy Storchaka. + + - bpo-38881(19): random.choices() now raises a ValueError when all + the weights are zero. + + - bpo-38876(20): Raise pickle.UnpicklingError when loading an item + from memo for invalid input. + + The previous code was raising a *note KeyError: 6f5. 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 ‘BINGET’ or + ‘LONG_BINGET’ load from the memo, leading to a *note KeyError: 6f5. + as the determined index was bogus. Patch by Claudiu Popa + + - bpo-38688(21): Calling func:*note shutil.copytree: 675. 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. + + - bpo-38863(22): Improve ‘is_cgi()’ function in *note http.server: + 92, which enables processing the case that cgi directory is a child + of another directory other than root. + + - bpo-37838(23): *note typing.get_type_hints(): 277. properly handles + functions decorated with *note functools.wraps(): bf8. + + - bpo-38870(24): Expose *note ast.unparse(): 523. as a function of + the *note ast: 7. module that can be used to unparse an *note + ast.AST: 30f. object and produce a string with code that would + produce an equivalent *note ast.AST: 30f. object when parsed. + Patch by Pablo Galindo and Batuhan Taskaya. + + - bpo-38859(25): 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. + + - bpo-38857(26): 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. + + - bpo-38834(27): *note typing.TypedDict: 18a. subclasses now track + which keys are optional using the ‘__required_keys__’ and + ‘__optional_keys__’ attributes, to enable runtime validation by + downstream projects. Patch by Zac Hatfield-Dodds. + + - bpo-38821(28): Fix unhandled exceptions in *note argparse: 5. when + internationalizing error messages for arguments with ‘nargs’ set to + special (non-integer) values. Patch by Federico Bond. + + - bpo-38820(29): Make Python compatible with OpenSSL 3.0.0. *note + ssl.SSLSocket.getpeercert(): c56. no longer returns IPv6 addresses + with a trailing new line. + + - bpo-38811(30): Fix an unhandled exception in *note pathlib: c5. + when *note os.link(): d9a. is missing. Patch by Toke + Høiland-Jørgensen. + + - bpo-38686(31): Added support for multiple ‘qop’ values in *note + urllib.request.AbstractDigestAuthHandler: 139b. + + - bpo-38712(32): Add the Linux-specific *note + signal.pidfd_send_signal(): 573. function, which allows sending a + signal to a process identified by a file descriptor rather than a + pid. + + - bpo-38348(33): Add ‘-i’ and ‘--indent’ (indentation level), and + ‘--no-type-comments’ (type comments) command line options to ast + parsing tool. + + - bpo-37523(34): Change ‘zipfile.ZipExtFile’ to raise ‘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. + + - bpo-38045(35): Improve the performance of ‘enum._decompose()’ in + *note enum: 76. Patch by hongweipeng. + + - bpo-36820(36): 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 ‘__traceback__’ attribute. + Patch by Mario Corchero. + + - bpo-36406(37): Handle namespace packages in *note doctest: 63. + Patch by Karthikeyan Singaravelan. + + - bpo-34776(38): Fix dataclasses to support forward references in + type annotations + + - bpo-20928(39): ElementTree supports recursive XInclude processing. + Patch by Stefan Behnel. + + - bpo-29636(40): Add whitespace options for formatting JSON with the + ‘json.tool’ CLI. The following mutually exclusive options are now + supported: ‘--indent’ for setting the indent level in spaces; + ‘--tab’ for indenting with tabs; ‘--no-indent’ for suppressing + newlines; and ‘--compact’ for suppressing all whitespace. The + default behavior remains the same as ‘--indent=4’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39033 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=39022 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=39006 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38708 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38698 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38994 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38979 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38978 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38916 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38986 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38982 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38529 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27413 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=38634 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=33684 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=38698 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=38927 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=26730 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=38881 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=38876 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=38688 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=38863 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=37838 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=38870 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=38859 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=38857 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=38834 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=38821 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=38820 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=38811 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=38686 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=38712 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=38348 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=37523 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=38045 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=36820 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=36406 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=34776 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=20928 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=29636 + + +File: python.info, Node: Documentation<28>, Next: Tests<27>, Prev: Library<28>, Up: Python 3 9 0 alpha 2 + +1.21.29.4 Documentation +....................... + + - bpo-38928(1): Correct when venv’s ‘upgrade_dependencies()’ and + ‘--upgrade-deps’ are added. + + - bpo-38899(2): Update documentation to state that to activate + virtual environments under fish one should use ‘source’, not ‘’ as + documented at + ‘https://fishshell.com/docs/current/commands.html#source’. + + - bpo-22377(3): Improves documentation of the values that *note + datetime.datetime.strptime(): 12dd. accepts for ‘%Z’. Patch by + Karl Dubost. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38928 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38899 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22377 + + +File: python.info, Node: Tests<27>, Next: Build<29>, Prev: Documentation<28>, Up: Python 3 9 0 alpha 2 + +1.21.29.5 Tests +............... + + - bpo-38546(1): 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. + + - bpo-38546(2): Multiprocessing and concurrent.futures tests now stop + the resource tracker process when tests complete. + + - bpo-38614(3): Replace hardcoded timeout constants in tests with new + *note test.support: 102. constants: *note LOOPBACK_TIMEOUT: 13d4, + *note INTERNET_TIMEOUT: 13d5, *note SHORT_TIMEOUT: 12b1. and *note + LONG_TIMEOUT: 13d6. It becomes easier to adjust these four timeout + constants for all tests at once, rather than having to adjust every + single test file. + + - bpo-38547(4): 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. + + - bpo-38992(5): Fix a test for *note math.fsum(): 1040. that was + failing due to constant folding. + + - bpo-38991(6): *note test.support: 102.: ‘run_python_until_end()’, + ‘assert_python_ok()’ and ‘assert_python_failure()’ functions no + longer strip whitespaces from stderr. Remove + ‘test.support.strip_python_stderr()’ function. + + - bpo-38965(7): Fix test_faulthandler on GCC 10. Use the “volatile” + keyword in ‘faulthandler._stack_overflow()’ to prevent tail call + optimization on any compiler, rather than relying on compiler + specific pragma. + + - bpo-38875(8): test_capi: trashcan tests now require the test “cpu” + resource. + + - bpo-38841(9): Skip asyncio + test_create_datagram_endpoint_existing_sock_unix on platforms + lacking a functional bind() for named unix domain sockets. + + - bpo-38692(10): Skip the test_posix.test_pidfd_open() test if + ‘os.pidfd_open()’ fails with a *note PermissionError: 9b9. This + situation can happen in a Linux sandbox using a syscall whitelist + which doesn’t allow the ‘pidfd_open()’ syscall yet. + + - bpo-38839(11): Fix some unused functions in tests. Patch by Adam + Johnson. + + - bpo-38669(12): Raise *note TypeError: 19c. when passing target as a + string with *note unittest.mock.patch.object(): 13d7. + + - bpo-37957(13): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38546 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38546 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38614 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38547 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38992 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38991 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38965 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38875 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38841 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38692 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38839 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38669 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=37957 + + +File: python.info, Node: Build<29>, Next: Windows<26>, Prev: Tests<27>, Up: Python 3 9 0 alpha 2 + +1.21.29.6 Build +............... + + - bpo-37404(1): *note asyncio: 9. now raises ‘TyperError’ when + calling incompatible methods with an *note ssl.SSLSocket: 52a. + socket. Patch by Ido Michael. + + - bpo-36500(2): Added an optional “regen” project to the Visual + Studio solution that will regenerate all grammar, tokens, and + opcodes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37404 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36500 + + +File: python.info, Node: Windows<26>, Next: macOS<19>, Prev: Build<29>, Up: Python 3 9 0 alpha 2 + +1.21.29.7 Windows +................. + + - bpo-39007(1): Add auditing events to functions in *note winreg: + 134. + + - bpo-33125(2): Add support for building and releasing Windows ARM64 + packages. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=39007 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33125 + + +File: python.info, Node: macOS<19>, Next: IDLE<19>, Prev: Windows<26>, Up: Python 3 9 0 alpha 2 + +1.21.29.8 macOS +............... + + - bpo-37931(1): 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 ‘import posix’. Patch + by Benoît Hudson. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37931 + + +File: python.info, Node: IDLE<19>, Next: C API<26>, Prev: macOS<19>, Up: Python 3 9 0 alpha 2 + +1.21.29.9 IDLE +.............. + + - bpo-38944(1): Escape key now closes IDLE completion windows. Patch + by Johnny Najera. + + - bpo-38943(2): Fix IDLE autocomplete windows not always appearing on + some systems. Patch by Johnny Najera. + + - bpo-38862(3): ‘Strip Trailing Whitespace’ on the Format menu + removes extra newlines at the end of non-shell files. + + - bpo-38636(4): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38944 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38943 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38862 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38636 + + +File: python.info, Node: C API<26>, Prev: IDLE<19>, Up: Python 3 9 0 alpha 2 + +1.21.29.10 C API +................ + + - bpo-38896(1): Remove ‘PyUnicode_ClearFreeList()’ function: the + Unicode free list has been removed in Python 3.3. + + - bpo-37340(2): Remove ‘PyMethod_ClearFreeList()’ and + ‘PyCFunction_ClearFreeList()’ functions: the free lists of bound + method objects have been removed. + + - bpo-38835(3): Exclude ‘PyFPE_START_PROTECT()’ and + ‘PyFPE_END_PROTECT()’ macros of ‘pyfpe.h’ from ‘Py_LIMITED_API’ + (stable API). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38896 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37340 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38835 + + +File: python.info, Node: Python 3 9 0 alpha 1, Next: Python 3 8 0 beta 1, Prev: Python 3 9 0 alpha 2, Up: Changelog + +1.21.30 Python 3.9.0 alpha 1 +---------------------------- + +`Release date: 2019-11-19' + +* Menu: + +* Security: Security<18>. +* Core and Builtins: Core and Builtins<30>. +* Library: Library<29>. +* Documentation: Documentation<29>. +* Tests: Tests<28>. +* Build: Build<30>. +* Windows: Windows<27>. +* macOS: macOS<20>. +* IDLE: IDLE<20>. +* Tools/Demos: Tools/Demos<10>. +* C API: C API<27>. + + +File: python.info, Node: Security<18>, Next: Core and Builtins<30>, Up: Python 3 9 0 alpha 1 + +1.21.30.1 Security +.................. + + - bpo-38722(1): *note runpy: df. now uses *note io.open_code(): 1381. + to open code files. Patch by Jason Killen. + + - bpo-38622(2): Add additional audit events for the *note ctypes: 29. + module. + + - bpo-38418(3): Fixes audit event for *note os.system(): 10c0. to be + named ‘os.system’. + + - bpo-38243(4): Escape the server title of *note + xmlrpc.server.DocXMLRPCServer: 13df. when rendering the document + page as HTML. (Contributed by Dong-hee Na in bpo-38243(5).) + + - bpo-38174(6): Update vendorized expat library version to 2.2.8, + which resolves CVE-2019-15903. + + - bpo-37764(7): 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. + + - bpo-37461(8): Fix an infinite loop when parsing specially crafted + email headers. Patch by Abhilash Raj. + + - bpo-37363(9): Adds audit events for the range of supported run + commands (see *note Command line and environment: 13e0.). + + - bpo-37463(10): 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’. + + - bpo-37363(11): Adds audit events for *note ensurepip: 75, *note + ftplib: 7e, *note glob: 84, *note imaplib: 94, *note nntplib: be, + *note pdb: c6, *note poplib: cd, *note shutil: e6, *note smtplib: + ea, *note sqlite3: ef, *note subprocess: f6, *note telnetlib: fe, + *note tempfile: ff. and *note webbrowser: 133, as well as *note + os.listdir(): da5, *note os.scandir(): 6b0. and *note breakpoint(): + 716. + + - bpo-37364(12): *note io.open_code(): 1381. is now used when reading + ‘.pth’ files. + + - bpo-34631(13): Updated OpenSSL to 1.1.1c in Windows installer + + - bpo-34155(14): Fix parsing of invalid email addresses with more + than one ‘@’ (e.g. a@b@c.com.) to not return the part before 2nd + ‘@’ as valid email address. Patch by maxking & jpic. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38722 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38622 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38418 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38243 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38243 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38174 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37764 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37461 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=37363 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37463 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37363 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=37364 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=34631 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=34155 + + +File: python.info, Node: Core and Builtins<30>, Next: Library<29>, Prev: Security<18>, Up: Python 3 9 0 alpha 1 + +1.21.30.2 Core and Builtins +........................... + + - bpo-38631(1): Replace ‘Py_FatalError()’ call with a regular *note + RuntimeError: 6e9. exception in ‘float.__getformat__()’. + + - bpo-38639(2): Optimized *note math.floor(): 102f, *note + math.ceil(): 1030. and *note math.trunc(): 1031. for floats. + + - bpo-38640(3): 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. + + - bpo-38613(4): Optimized some set operations (e.g. ‘|’, ‘^’, and + ‘-’) of ‘dict_keys’. ‘d.keys() | other’ was slower than ‘set(d) | + other’ but they are almost same performance for now. + + - bpo-28029(5): ‘"".replace("", s, n)’ now returns ‘s’ instead of an + empty string for all non-zero ‘n’. There are similar changes for + *note bytes: 1b4. and *note bytearray: 1a5. objects. + + - bpo-38535(6): Fixed line numbers and column offsets for AST nodes + for calls without arguments in decorators. + + - bpo-38525(7): Fix a segmentation fault when using reverse iterators + of empty ‘dict’ objects. Patch by Dong-hee Na and Inada Naoki. + + - bpo-38465(8): *note bytearray: 1a5, *note array: 3d2. and *note + mmap: 64e. objects allow now to export more than ‘2**31’ buffers at + a time. + + - bpo-38469(9): 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. + + - bpo-38437(10): Activate the ‘GC_DEBUG’ macro for debug builds of + the interpreter (when ‘Py_DEBUG’ is set). Patch by Pablo Galindo. + + - bpo-38379(11): 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. + + - bpo-38379(12): 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 ‘collect()’ and ‘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. + + - bpo-38392(13): In debug mode, *note PyObject_GC_Track(): 113f. now + calls ‘tp_traverse()’ of the object type to ensure that the object + is valid: test that objects visited by ‘tp_traverse()’ are valid. + + - bpo-38210(14): Remove unnecessary intersection and update set + operation in dictview with empty set. (Contributed by Dong-hee Na + in bpo-38210(15).) + + - bpo-38402(16): Check the error from the system’s underlying ‘crypt’ + or ‘crypt_r’. + + - bpo-37474(17): On FreeBSD, Python no longer calls + ‘fedisableexcept()’ at startup to control the floating point + control mode. The call became useless since FreeBSD 6: it became + the default mode. + + - bpo-38006(18): 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. + + - bpo-38317(19): Fix warnings options priority: + ‘PyConfig.warnoptions’ has the highest priority, as stated in the + PEP 587(20). + + - bpo-38310(21): Predict ‘BUILD_MAP_UNPACK_WITH_CALL’ -> + ‘CALL_FUNCTION_EX’ opcode pairs in the main interpreter loop. + Patch by Brandt Bucher. + + - bpo-36871(22): 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. + + - bpo-11410(23): 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. + + - bpo-38219(24): Optimized the *note dict: 16e. constructor and the + *note update(): 10c8. method for the case when the argument is a + dict. + + - bpo-38236(25): Python now dumps path configuration if it fails to + import the Python codecs of the filesystem and stdio encodings. + + - bpo-38013(26): Allow to call ‘async_generator_athrow().throw(...)’ + even for non-started async generator helper. It fixes annoying + warning at the end of *note asyncio.run(): 1d7. call. + + - bpo-38124(27): Fix an off-by-one error in PyState_AddModule that + could cause out-of-bounds memory access. + + - bpo-38116(28): The select module is now PEP-384 compliant and no + longer has static state + + - bpo-38113(29): ast module updated to PEP-384 and all statics + removed + + - bpo-38076(30): The struct module is now PEP-384 compatible + + - bpo-38075(31): The random module is now PEP-384 compatible + + - bpo-38074(32): zlib module made PEP-384 compatible + + - bpo-38073(33): Make pwd extension module PEP-384 compatible + + - bpo-38072(34): grp module made PEP-384 compatible + + - bpo-38069(35): Make _posixsubprocess PEP-384 compatible + + - bpo-38071(36): Make termios extension module PEP-384 compatible + + - bpo-38005(37): Fixed comparing and creating of InterpreterID and + ChannelID. + + - bpo-36946(38): Fix possible signed integer overflow when handling + slices. Patch by hongweipeng. + + - bpo-37994(39): Fixed silencing arbitrary errors if an attribute + lookup fails in several sites. Only AttributeError should be + silenced. + + - bpo-8425(40): 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ù). + + - bpo-37966(41): The implementation of *note is_normalized(): 698. + has been greatly sped up on strings that aren’t normalized, by + implementing the full normalization-quick-check algorithm from the + Unicode standard. + + - bpo-37947(42): Adjust correctly the recursion level in the symtable + generation for named expressions. Patch by Pablo Galindo. + + - bpo-37812(43): The ‘CHECK_SMALL_INT’ macro used inside + ‘Object/longobject.c’ has been replaced with an explicit ‘return’ + at each call site. + + - bpo-37751(44): Fix *note codecs.lookup(): 5b5. to normalize the + encoding name the same way than ‘encodings.normalize_encoding()’, + except that *note codecs.lookup(): 5b5. also converts the name to + lower case. + + - bpo-37830(45): Fixed compilation of *note break: 706. and *note + continue: 609. in the *note finally: 60a. block when the + corresponding *note try: 1073. block contains *note return: 60e. + with a non-constant value. + + - bpo-20490(46): Improve import error message for partially + initialized module on circular ‘from’ imports - by Anthony Sottile. + + - bpo-37840(47): Fix handling of negative indices in *note sq_item: + 1333. of *note bytearray: 1a5. Patch by Sergey Fedoseev. + + - bpo-37802(48): Slightly improve performance of *note + PyLong_FromUnsignedLong(): 13e2, *note + PyLong_FromUnsignedLongLong(): 13e3. and *note PyLong_FromSize_t(): + 13e4. Patch by Sergey Fedoseev. + + - bpo-37409(49): 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. + + - bpo-32912(50): Reverted bpo-32912(51): emitting *note + SyntaxWarning: 2d5. instead of *note DeprecationWarning: 2d4. for + invalid escape sequences in string and bytes literals. + + - bpo-37757(52): PEP 572(53): As described in the PEP, assignment + expressions now raise *note SyntaxError: 2d6. when their + interaction with comprehension scoping results in an ambiguous + target scope. + + The ‘TargetScopeError’ subclass originally proposed by the PEP has + been removed in favour of just raising regular syntax errors for + the disallowed cases. + + - bpo-36279(54): Fix potential use of uninitialized memory in *note + os.wait3(): a14. + + - bpo-36311(55): Decoding bytes objects larger than 2GiB is faster + and no longer fails when a multibyte characters spans a chunk + boundary. + + - bpo-34880(56): The *note assert: 5bc. statement now works properly + if the *note AssertionError: 26e. exception is being shadowed. + Patch by Zackery Spytz. + + - bpo-37340(57): Removed object cache (‘free_list’) for bound method + objects. Temporary bound method objects are less used than before + thanks to the ‘LOAD_METHOD’ opcode and the + ‘_PyObject_VectorcallMethod’ C API. + + - bpo-37648(58): Fixed minor inconsistency in ‘list.__contains__()’, + ‘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 + ‘==’. + + - bpo-37444(59): Update differing exception between + ‘builtins.__import__()’ and *note importlib.__import__(): d1c. + + - bpo-37619(60): When adding a wrapper descriptor from one class to a + different class (for example, setting ‘__add__ = str.__add__’ on an + ‘int’ subclass), an exception is correctly raised when the operator + is called. + + - bpo-37593(61): Swap the positions of the `posonlyargs' and `args' + parameters in the constructor of ‘ast.parameters’ nodes. + + - bpo-37543(62): Optimized pymalloc for non PGO build. + + - bpo-37537(63): Compute allocated pymalloc blocks inside + _Py_GetAllocatedBlocks(). This slows down _Py_GetAllocatedBlocks() + but gives a small speedup to _PyObject_Malloc() and + _PyObject_Free(). + + - bpo-37467(64): Fix *note sys.excepthook(): 3fe. and + ‘PyErr_Display()’ if a filename is a bytes string. For example, + for a SyntaxError exception where the filename attribute is a bytes + string. + + - bpo-37433(65): Fix ‘SyntaxError’ indicator printing too many spaces + for multi-line strings - by Anthony Sottile. + + - bpo-37417(66): ‘bytearray.extend()’ now correctly handles errors + that arise during iteration. Patch by Brandt Bucher. + + - bpo-37414(67): The undocumented ‘sys.callstats()’ function has been + removed. Since Python 3.7, it was deprecated and always returned + ‘None’. It required a special build option ‘CALL_PROFILE’ which + was already removed in Python 3.7. + + - bpo-37392(68): Remove ‘sys.getcheckinterval()’ and + ‘sys.setcheckinterval()’ functions. They were deprecated since + Python 3.2. Use *note sys.getswitchinterval(): 598. and *note + sys.setswitchinterval(): 599. instead. Remove also + ‘check_interval’ field of the ‘PyInterpreterState’ structure. + + - bpo-37388(69): In development mode and in debug build, `encoding' + and `errors' arguments are now checked on string encoding and + decoding operations. Examples: *note open(): 30b, *note + str.encode(): 512. and *note bytes.decode(): 513. + + 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. + + - bpo-37348(70): Optimized decoding short ASCII string with UTF-8 and + ascii codecs. ‘b"foo".decode()’ is about 15% faster. Patch by + Inada Naoki. + + - bpo-24214(71): Improved support of the surrogatepass error handler + in the UTF-8 and UTF-16 incremental decoders. + + - bpo-37330(72): *note open(): 30b, *note io.open(): 30c, *note + codecs.open(): 30d. and *note fileinput.FileInput: 300. no longer + accept ‘'U'’ (“universal newline”) in the file mode. This flag was + deprecated since Python 3.3. + + - bpo-35224(73): Reverse evaluation order of key: value in dict + comprehensions as proposed in PEP 572. I.e. in ‘{k: v for ...}’, + ‘k’ will be evaluated before ‘v’. + + - bpo-37316(74): Fix the *note PySys_Audit(): 1397. call in *note + mmap.mmap: 64e. + + - bpo-37300(75): Remove an unnecessary Py_XINCREF in classobject.c. + + - bpo-37269(76): Fix a bug in the peephole optimizer that was not + treating correctly constant conditions with binary operators. + Patch by Pablo Galindo. + + - bpo-20443(77): 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. + + - bpo-37257(78): Python’s small object allocator (‘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. + + - bpo-37231(79): The dispatching of type slots to special methods + (for example calling ‘__mul__’ when doing ‘x * y’) has been made + faster. + + - bpo-36974(80): Implemented separate vectorcall functions for every + calling convention of builtin functions and methods. This improves + performance for calls. + + - bpo-37213(81): Handle correctly negative line offsets in the + peephole optimizer. Patch by Pablo Galindo. + + - bpo-37219(82): Remove erroneous optimization for empty set + differences. + + - bpo-15913(83): Implement *note PyBuffer_SizeFromFormat(): 32b. + function (previously documented but not implemented): call *note + struct.calcsize(): 13e5. Patch by Joannah Nanjekye. + + - bpo-36922(84): Slot functions optimize any callable with + ‘Py_TPFLAGS_METHOD_DESCRIPTOR’ instead of only instances of + ‘function’. + + - bpo-36974(85): The slot ‘tp_vectorcall_offset’ is inherited + unconditionally to support ‘super().__call__()’ when the base class + uses vectorcall. + + - bpo-37160(86): *note threading.get_native_id(): 68b. now also + supports NetBSD. + + - bpo-37077(87): Add *note threading.get_native_id(): 68b. support + for AIX. Patch by M. Felt + + - bpo-36781(88): *note sum(): 296. has been optimized for boolean + values. + + - bpo-34556(89): Add ‘--upgrade-deps’ to venv module. Patch by + Cooper Ry Lees + + - bpo-20523(90): ‘pdb.Pdb’ supports ~/.pdbrc in Windows 7. Patch by + Tim Hopper and Dan Lidral-Porter. + + - bpo-35551(91): 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. + + - bpo-19072(92): The *note classmethod: 18d. decorator can now wrap + other descriptors such as property objects. Adapted from a patch + written by Graham Dumpleton. + + - bpo-27575(93): Improve speed of dictview intersection by directly + using set intersection logic. Patch by David Su. + + - bpo-30773(94): Prohibit parallel running of aclose() / asend() / + athrow(). Fix ag_running to reflect the actual running status of + the AG. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38631 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38639 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38640 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38613 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28029 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38535 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38525 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38465 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38469 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38437 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38379 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38379 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=38392 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=38210 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=38210 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=38402 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=37474 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=38006 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=38317 + + (20) https://peps.python.org/pep-0587/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=38310 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=36871 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=11410 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=38219 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=38236 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=38013 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=38124 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=38116 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=38113 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=38076 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=38075 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=38074 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=38073 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=38072 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=38069 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=38071 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=38005 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=36946 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=37994 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=8425 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=37966 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=37947 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=37812 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=37751 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=37830 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=20490 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=37840 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=37802 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=37409 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=32912 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=32912 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=37757 + + (53) https://peps.python.org/pep-0572/ + + (54) https://bugs.python.org/issue?@action=redirect&bpo=36279 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=36311 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=34880 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=37340 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=37648 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=37444 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=37619 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=37593 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=37543 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=37537 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=37467 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=37433 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=37417 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=37414 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=37392 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=37388 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=37348 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=24214 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=37330 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=35224 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=37316 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=37300 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=37269 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=20443 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=37257 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=37231 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=36974 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=37213 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=37219 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=15913 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=36922 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=36974 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=37160 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=37077 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=36781 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=34556 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=20523 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=35551 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=19072 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=27575 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=30773 + + +File: python.info, Node: Library<29>, Next: Documentation<29>, Prev: Core and Builtins<30>, Up: Python 3 9 0 alpha 1 + +1.21.30.3 Library +................. + + - bpo-36589(1): The *note curses.update_lines_cols(): a6d. function + now returns ‘None’ instead of ‘1’ on success. + + - bpo-38807(2): Update *note TypeError: 19c. messages for *note + os.path.join(): 13e7. to include *note os.PathLike: 8bf. objects as + acceptable input types. + + - bpo-38724(3): Add a repr for ‘subprocess.Popen’ objects. Patch by + Andrey Doroschenko. + + - bpo-38786(4): pydoc now recognizes and parses HTTPS URLs. Patch by + python273. + + - bpo-38785(5): Prevent asyncio from crashing if parent ‘__init__’ is + not called from a constructor of object derived from + ‘asyncio.Future’. + + - bpo-38723(6): *note pdb: c6. now uses *note io.open_code(): 1381. + to trigger auditing events. + + - bpo-27805(7): Allow opening pipes and other non-seekable files in + append mode with *note open(): 30b. + + - bpo-38438(8): Simplify the *note argparse: 5. usage message for + ‘nargs="*"’. + + - bpo-38761(9): WeakSet is now registered as a + collections.abc.MutableSet. + + - bpo-38716(10): 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. + + - bpo-38713(11): Add *note os.P_PIDFD: 562. constant, which may be + passed to *note os.waitid(): a17. to wait on a Linux process file + descriptor. + + - bpo-38692(12): Add *note asyncio.PidfdChildWatcher: 527, a + Linux-specific child watcher implementation that polls process file + descriptors. + + - bpo-38692(13): Expose the Linux ‘pidfd_open’ syscall as *note + os.pidfd_open(): 500. + + - bpo-38602(14): Added constants ‘F_OFD_GETLK’, ‘F_OFD_SETLK’ and + ‘F_OFD_SETLKW’ to the *note fcntl: 79. module. Patch by Dong-hee + Na. + + - bpo-38334(15): Fixed seeking backward on an encrypted + ‘zipfile.ZipExtFile’. + + - bpo-38312(16): Add *note curses.get_escdelay(): 530, *note + curses.set_escdelay(): 531, *note curses.get_tabsize(): 532, and + *note curses.set_tabsize(): 533. functions - by Anthony Sottile. + + - bpo-38586(17): Now *note fileConfig(): 7ab. correctly sets the + .name of handlers loaded. + + - bpo-38565(18): Add new cache_parameters() method for + functools.lru_cache() to better support pickling. + + - bpo-34679(19): asynci.ProactorEventLoop.close() now only calls + signal.set_wakeup_fd() in the main thread. + + - bpo-31202(20): The case the result of ‘pathlib.WindowsPath.glob()’ + matches now the case of the pattern for literal parts. + + - bpo-36321(21): Remove misspelled attribute. The 3.8 changelog + noted that this would be removed in 3.9. + + - bpo-38521(22): Fixed erroneous equality comparison in + statistics.NormalDist(). + + - bpo-38493(23): Added *note CLD_KILLED: 560. and *note CLD_STOPPED: + 561. for ‘si_code’. Patch by Dong-hee Na. + + - bpo-38478(24): Fixed a bug in ‘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. + + - bpo-33604(25): Fixed *note hmac.new: 6f9. and ‘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. + + - bpo-38378(26): Parameters `out' and `in' of *note os.sendfile(): + 762. was renamed to `out_fd' and `in_fd'. + + - bpo-38417(27): Added support for setting the umask in the child + process to the subprocess module on POSIX systems. + + - bpo-38449(28): Revert PR 15522, which introduces a regression in + *note mimetypes.guess_type(): 13c4. due to improper handling of + filenames as urls. + + - bpo-38431(29): Fix ‘__repr__’ method for ‘dataclasses.InitVar’ to + support typing objects, patch by Samuel Colvin. + + - bpo-38109(30): Add missing *note stat.S_IFDOOR: c59, *note + stat.S_IFPORT: c5a, *note stat.S_IFWHT: c5b, *note stat.S_ISDOOR(): + 13e8, *note stat.S_ISPORT(): 13e9, and *note stat.S_ISWHT(): 13ea. + values to the Python implementation of *note stat: f1. + + - bpo-38422(31): Clarify docstrings of pathlib suffix(es) + + - bpo-38405(32): Nested subclasses of *note typing.NamedTuple: 271. + are now pickleable. + + - bpo-38332(33): Prevent *note KeyError: 6f5. thrown by + ‘_encoded_words.decode()’ when given an encoded-word with invalid + content-type encoding from propagating all the way to + ‘email.message.get()’. + + - bpo-38371(34): Deprecated the ‘split()’ method in + ‘_tkinter.TkappType’ in favour of the ‘splitlist()’ method which + has more consistent and predicable behavior. + + - bpo-38341(35): Add *note smtplib.SMTPNotSupportedError: 13eb. to + the *note smtplib: ea. exported names. + + - bpo-38319(36): sendfile() used in socket and shutil modules was + raising OverflowError for files >= 2GiB on 32-bit architectures. + (patch by Giampaolo Rodola) + + - bpo-38242(37): Revert the new asyncio Streams API + + - bpo-13153(38): 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). + + - bpo-38019(39): Correctly handle pause/resume reading of closed + asyncio unix pipe. + + - bpo-38163(40): 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). + + - bpo-38161(41): Removes _AwaitEvent from AsyncMock. + + - bpo-38216(42): Allow the rare code that wants to send invalid http + requests from the *note http.client: 8f. library a way to do so. + The fixes for bpo-30458(43) led to breakage for some projects that + were relying on this ability to test their own behavior in the face + of bad requests. + + - bpo-28286(44): Deprecate opening *note GzipFile: 590. for writing + implicitly. Always specify the `mode' argument for writing. + + - bpo-38108(45): Any synchronous magic methods on an AsyncMock now + return a MagicMock. Any asynchronous magic methods on a MagicMock + now return an AsyncMock. + + - bpo-38265(46): Update the `length' parameter of *note os.pread(): + 7bb. to accept *note Py_ssize_t: 6b1. instead of int. + + - bpo-38112(47): *note compileall: 1f. has a higher default recursion + limit and new command-line arguments for path manipulation, + symlinks handling, and multiple optimization levels. + + - bpo-38248(48): asyncio: Fix inconsistent immediate Task + cancellation + + - bpo-38237(49): The arguments for the builtin pow function are more + descriptive. They can now also be passed in as keywords. + + - bpo-34002(50): Improve efficiency in parts of email package by + changing while-pop to a for loop, using isdisjoint instead of set + intersections. + + - bpo-38191(51): Constructors of *note NamedTuple: 271. and *note + TypedDict: 18a. types now accept arbitrary keyword argument names, + including “cls”, “self”, “typename”, “_typename”, “fields” and + “_fields”. + + - bpo-38155(52): Add ‘__all__’ to *note datetime: 2f. Patch by Tahia + Khan. + + - bpo-38185(53): Fixed case-insensitive string comparison in *note + sqlite3.Row: afa. indexing. + + - bpo-38136(54): 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. + + - bpo-37828(55): Fix default mock name in *note + unittest.mock.Mock.assert_called(): 967. exceptions. Patch by + Abraham Toriz Cruz. + + - bpo-38175(56): Fix a memory leak in comparison of *note + sqlite3.Row: afa. objects. + + - bpo-33936(57): _hashlib no longer calls obsolete OpenSSL + initialization function with OpenSSL 1.1.0+. + + - bpo-34706(58): Preserve subclassing in + inspect.Signature.from_callable. + + - bpo-38153(59): 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. + + - bpo-38115(60): 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. + + - bpo-38148(61): Add slots to *note asyncio: 9. transport classes, + which can reduce memory usage. + + - bpo-38142(62): The _hashlib OpenSSL wrapper extension module is now + PEP-384 compliant. + + - bpo-9216(63): hashlib constructors now support usedforsecurity flag + to signal that a hashing algorithm is not used in a security + context. + + - bpo-36991(64): Fixes a potential incorrect AttributeError exception + escaping ZipFile.extract() in some unsupported input error + situations. + + - bpo-38134(65): Remove obsolete copy of PBKDF2_HMAC_fast. All + supported OpenSSL versions contain a fast implementation. + + - bpo-38132(66): 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. + + - bpo-38008(67): Fix parent class check in protocols to correctly + identify the module that provides a builtin protocol, instead of + assuming they all come from the *note collections.abc: 1d. module + + - bpo-34037(68): For *note asyncio: 9, add a new coroutine + ‘loop.shutdown_default_executor()’. The new coroutine provides an + API to schedule an executor shutdown that waits on the threadpool + to finish closing. Also, *note asyncio.run(): 1d7. has been + updated to utilize the new coroutine. Patch by Kyle Stanley. + + - bpo-37405(69): Fixed regression bug for socket.getsockname() for + non-CAN_ISOTP AF_CAN address family sockets by returning a 1-tuple + instead of string. + + - bpo-38121(70): Update parameter names on functions in + importlib.metadata matching the changes in the 0.22 release of + importlib_metadata. + + - bpo-38110(71): The os.closewalk() implementation now uses the libc + fdwalk() API on platforms where it is available. + + - bpo-38093(72): Fixes AsyncMock so it doesn’t crash when used with + AsyncContextManagers or AsyncIterators. + + - bpo-37488(73): Add warning to ‘datetime.utctimetuple()’, + ‘datetime.utcnow()’ and ‘datetime.utcfromtimestamp()’ . + + - bpo-35640(74): Allow passing a *note path-like object: 773. as + ‘directory’ argument to the *note + http.server.SimpleHTTPRequestHandler: 799. class. Patch by Géry + Ogam. + + - bpo-38086(75): Update importlib.metadata with changes from + importlib_metadata 0.21(76). + + - bpo-37251(77): Remove ‘__code__’ check in AsyncMock that + incorrectly evaluated function specs as async objects but failed to + evaluate classes with ‘__await__’ but no ‘__code__’ attribute + defined as async objects. + + - bpo-38037(78): Fix reference counters in the *note signal: e7. + module. + + - bpo-38066(79): Hide internal asyncio.Stream methods: feed_eof(), + feed_data(), set_exception() and set_transport(). + + - bpo-38059(80): inspect.py now uses sys.exit() instead of exit() + + - bpo-38049(81): Added command-line interface for the *note ast: 7. + module. + + - bpo-37953(82): In *note typing: 123, improved the ‘__hash__’ and + ‘__eq__’ methods for ‘ForwardReferences’. + + - bpo-38026(83): Fixed *note inspect.getattr_static(): ef4. used + ‘isinstance’ while it should avoid dynamic lookup. + + - bpo-35923(84): Update *note importlib.machinery.BuiltinImporter: + 91c. to use ‘loader._ORIGIN’ instead of a hardcoded value. Patch + by Dong-hee Na. + + - bpo-38010(85): In ‘importlib.metadata’ sync with + ‘importlib_metadata’ 0.20, clarifying behavior of ‘files()’ and + fixing issue where only one requirement was returned for + ‘requires()’ on ‘dist-info’ packages. + + - bpo-38006(86): 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. + + - bpo-37995(87): Added the `indent' option to *note ast.dump(): 522. + which allows it to produce a multiline indented output. + + - bpo-34410(88): Fixed a crash in the ‘tee()’ iterator when re-enter + it. RuntimeError is now raised in this case. + + - bpo-37140(89): 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. + + - bpo-37587(90): ‘_json.scanstring’ is now up to 3x faster when there + are many backslash escaped characters in the JSON string. + + - bpo-37834(91): Prevent shutil.rmtree exception when built on + non-Windows system without fd system call support, like older + versions of macOS. + + - bpo-10978(92): Semaphores and BoundedSemaphores can now release + more than one waiting thread at a time. + + - bpo-37972(93): Subscripts to the *note unittest.mock.call: 13ec. + objects now receive the same chaining mechanism as any other custom + attributes, so that the following usage no longer raises a *note + TypeError: 19c.: + + call().foo().__getitem__(‘bar’) + + Patch by blhsing + + - bpo-37965(94): Fix C compiler warning caused by + distutils.ccompiler.CCompiler.has_function. + + - bpo-37964(95): Add ‘F_GETPATH’ command to *note fcntl: 79. + + - bpo-37960(96): ‘repr()’ of buffered and text streams now silences + only expected exceptions when get the value of “name” and “mode” + attributes. + + - bpo-37961(97): Add a ‘total_nframe’ field to the traces collected + by the tracemalloc module. This field indicates the original + number of frames before it was truncated. + + - bpo-37951(98): Most features of the subprocess module now work + again in subinterpreters. Only `preexec_fn' is restricted in + subinterpreters. + + - bpo-36205(99): Fix the rusage implementation of time.process_time() + to correctly report the sum of the system and user CPU time. + + - bpo-37950(100): Fix *note ast.dump(): 522. when call with + incompletely initialized node. + + - bpo-34679(101): Restores instantiation of Windows IOCP event loops + from the non-main thread. + + - bpo-36917(102): Add default implementation of the + ‘ast.NodeVisitor.visit_Constant()’ method which emits a deprecation + warning and calls corresponding methody ‘visit_Num()’, + ‘visit_Str()’, etc. + + - bpo-37798(103): Update test_statistics.py to verify that the + statistics module works well for both C and Python implementations. + Patch by Dong-hee Na + + - bpo-26589(104): Added a new status code to the http module: 451 + UNAVAILABLE_FOR_LEGAL_REASONS + + - bpo-37915(105): Fix a segmentation fault that appeared when + comparing instances of ‘datetime.timezone’ and ‘datetime.tzinfo’ + objects. Patch by Pablo Galindo. + + - bpo-32554(106): Deprecate having random.seed() call hash on + arbitrary types. + + - bpo-9938(107): Add optional keyword argument ‘exit_on_error’ for + ‘ArgumentParser’. + + - bpo-37851(108): The *note faulthandler: 78. module no longer + allocates its alternative stack at Python startup. Now the stack + is only allocated at the first faulthandler usage. + + - bpo-32793(109): Fix a duplicated debug message when *note + smtplib.SMTP.connect(): 13ed. is called. + + - bpo-37885(110): venv: Don’t generate unset variable warning on + deactivate. + + - bpo-37868(111): 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. + + - bpo-37811(112): Fix ‘socket’ module’s ‘socket.connect(address)’ + function being unable to establish connection in case of + interrupted system call. The problem was observed on all OSes + which ‘poll(2)’ system call can take only non-negative integers and + -1 as a timeout value. + + - bpo-37863(113): Optimizations for Fraction.__hash__ suggested by + Tim Peters. + + - bpo-21131(114): Fix ‘faulthandler.register(chain=True)’ stack. + faulthandler now allocates a dedicated stack of ‘SIGSTKSZ*2’ bytes, + instead of just ‘SIGSTKSZ’ bytes. Calling the previous signal + handler in faulthandler signal handler uses more than ‘SIGSTKSZ’ + bytes of stack memory on some platforms. + + - bpo-37798(115): Add C fastpath for statistics.NormalDist.inv_cdf() + Patch by Dong-hee Na + + - bpo-37804(116): Remove the deprecated method + ‘threading.Thread.isAlive()’. Patch by Dong-hee Na. + + - bpo-37819(117): Add Fraction.as_integer_ratio() to match the + corresponding methods in bool, int, float, and decimal. + + - bpo-14465(118): Add an xml.etree.ElementTree.indent() function for + pretty-printing XML trees. Contributed by Stefan Behnel. + + - bpo-37810(119): Fix *note difflib: 35. ‘?’ hint in diff output when + dealing with tabs. Patch by Anthony Sottile. + + - bpo-37772(120): In ‘zipfile.Path’, when adding implicit dirs, + ensure that ancestral directories are added and that duplicates are + excluded. + + - bpo-18578(121): Renamed and documented ‘test.bytecode_helper’ as + *note test.support.bytecode_helper: 103. Patch by Joannah + Nanjekye. + + - bpo-37785(122): Fix xgettext warnings in *note argparse: 5. + + - bpo-34488(123): ‘writelines()’ method of *note io.BytesIO: b31. is + now slightly faster when many small lines are passed. Patch by + Sergey Fedoseev. + + - bpo-37449(124): *note ensurepip: 75. now uses *note + importlib.resources.read_binary(): 13ee. to read data instead of + *note pkgutil.get_data(): 13ef. Patch by Joannah Nanjekye. + + - bpo-28292(125): 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. + + - bpo-18049(126): 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 + + - bpo-37742(127): 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’. + + - bpo-37738(128): Fix the implementation of curses ‘addch(str, + color_pair)’: pass the color pair to ‘setcchar()’, instead of + always passing 0 as the color pair. + + - bpo-37723(129): Fix performance regression on regular expression + parsing with huge character sets. Patch by Yann Vaginay. + + - bpo-35943(130): The function *note PyImport_GetModule(): 816. now + ensures any module it returns is fully initialized. Patch by + Joannah Nanjekye. + + - bpo-32178(131): Fix IndexError in *note email: 64. package when + trying to parse invalid address fields starting with ‘:’. + + - bpo-37268(132): The ‘parser’ module is deprecated and will be + removed in future versions of Python. + + - bpo-11953(133): Completing WSA* error codes in *note socket: ec. + + - bpo-37685(134): Fixed comparisons of *note datetime.timedelta: 60f. + and *note datetime.timezone: d6a. + + - bpo-37697(135): Synchronize ‘importlib.metadata’ with + importlib_metadata 0.19(136), improving handling of EGG-INFO files + and fixing a crash when entry point names contained colons. + + - bpo-37695(137): Correct *note curses.unget_wch(): d49. error + message. Patch by Anthony Sottile. + + - bpo-37689(138): Add ‘is_relative_to()’ in ‘PurePath’ to determine + whether or not one path is relative to another. + + - bpo-29553(139): Fixed *note argparse.ArgumentParser.format_usage(): + 13f0. for mutually exclusive groups. Patch by Andrew Nester. + + - bpo-37691(140): Let math.dist() accept coordinates as sequences (or + iterables) rather than just tuples. + + - bpo-37685(141): Fixed ‘__eq__’, ‘__lt__’ etc implementations in + some classes. They now return *note NotImplemented: 3c1. for + unsupported type of the other operand. This allows the other + operand to play role (for example the equality comparison with + *note ANY: 13f1. will return ‘True’). + + - bpo-37354(142): Make Activate.ps1 Powershell script static to allow + for signing it. + + - bpo-37664(143): Update wheels bundled with ensurepip (pip 19.2.3 + and setuptools 41.2.0) + + - bpo-37663(144): Bring consistency to venv shell activation scripts + by always using __VENV_PROMPT__. + + - bpo-37642(145): Allowed the pure Python implementation of *note + datetime.timezone: d6a. 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 + + - bpo-36161(146): In *note posix: ce, use ‘ttyname_r’ instead of + ‘ttyname’ for thread safety. + + - bpo-36324(147): Make internal attributes for + statistics.NormalDist() private. + + - bpo-37555(148): Fix ‘NonCallableMock._call_matcher’ returning tuple + instead of ‘_Call’ object when ‘self._spec_signature’ exists. + Patch by Elizabeth Uselton + + - bpo-29446(149): Make ‘from tkinter import *’ import only the + expected objects. + + - bpo-16970(150): Adding a value error when an invalid value in + passed to nargs Patch by Robert Leenders + + - bpo-34443(151): Exceptions from *note enum: 76. now use the + ‘__qualname’ of the enum class in the exception message instead of + the ‘__name__’. + + - bpo-37491(152): Fix ‘IndexError’ when parsing email headers with + unexpectedly ending bare-quoted string value. Patch by Abhilash + Raj. + + - bpo-37587(153): Make json.loads faster for long strings. (Patch by + Marco Paolini) + + - bpo-18378(154): Recognize “UTF-8” as a valid value for LC_CTYPE in + locale._parse_localename. + + - bpo-37579(155): Return *note NotImplemented: 3c1. in Python + implementation of ‘__eq__’ for *note timedelta: 60f. and *note + time: 4bf. when the other object being compared is not of the same + type to match C implementation. Patch by Karthikeyan Singaravelan. + + - bpo-21478(156): Record calls to parent when autospecced object is + attached to a mock using ‘unittest.mock.attach_mock()’. Patch by + Karthikeyan Singaravelan. + + - bpo-37531(157): “python3 -m test -jN –timeout=TIMEOUT” now kills a + worker process if it runs longer than `TIMEOUT' seconds. + + - bpo-37482(158): Fix serialization of display name in originator or + destination address fields with both encoded words and special + chars. + + - bpo-36993(159): Improve error reporting for corrupt zip files with + bad zip64 extra data. Patch by Daniel Hillier. + + - bpo-37502(160): pickle.loads() no longer raises TypeError when the + buffers argument is set to None + + - bpo-37520(161): Correct behavior for zipfile.Path.parent when the + path object identifies a subdirectory. + + - bpo-18374(162): Fix the ‘.col_offset’ attribute of nested *note + ast.BinOp: 13f2. instances which had a too large value in some + situations. + + - bpo-37424(163): Fixes a possible hang when using a timeout on *note + subprocess.run(): 7e8. 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. + + - bpo-37421(164): Fix ‘multiprocessing.util.get_temp_dir()’ + finalizer: clear also the ‘tempdir’ configuration of the current + process, so next call to ‘get_temp_dir()’ will create a new + temporary directory, rather than reusing the removed temporary + directory. + + - bpo-37481(165): The distutils ‘bdist_wininst’ command is deprecated + in Python 3.8, use ‘bdist_wheel’ (wheel packages) instead. + + - bpo-37479(166): When ‘Enum.__str__’ is overridden in a derived + class, the override will be used by ‘Enum.__format__’ regardless of + whether mixin classes are present. + + - bpo-37440(167): http.client now enables TLS 1.3 post-handshake + authentication for default context or if a cert_file is passed to + HTTPSConnection. + + - bpo-37437(168): Update vendorized expat version to 2.2.7. + + - bpo-37428(169): 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. + + - bpo-37420(170): *note os.sched_setaffinity(): db9. now correctly + handles errors that arise during iteration over its ‘mask’ + argument. Patch by Brandt Bucher. + + - bpo-37412(171): The *note os.getcwdb(): 6e7. function now uses the + UTF-8 encoding on Windows, rather than the ANSI code page: see PEP + 529(172) for the rationale. The function is no longer deprecated + on Windows. + + - bpo-37406(173): The sqlite3 module now raises TypeError, rather + than ValueError, if operation argument type is not str: execute(), + executemany() and calling a connection. + + - bpo-29412(174): Fix IndexError in parsing a header value ending + unexpectedly. Patch by Abhilash Raj. + + - bpo-36546(175): 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. + + - bpo-37394(176): Fix a bug that was causing the *note queue: d7. + module to fail if the accelerator module was not available. Patch + by Pablo Galindo. + + - bpo-37376(177): *note pprint: cf. now has support for *note + types.SimpleNamespace: 56f. Patch by Carl Bordum Hansen. + + - bpo-26967(178): An *note ArgumentParser: a3e. with + ‘allow_abbrev=False’ no longer disables grouping of short flags, + such as ‘-vv’, but only disables abbreviation of long flags as + documented. Patch by Zac Hatfield-Dodds. + + - bpo-37212(179): *note unittest.mock.call(): 13ec. now preserves the + order of keyword arguments in repr output. Patch by Karthikeyan + Singaravelan. + + - bpo-37372(180): Fix error unpickling datetime.time objects from + Python 2 with seconds>=24. Patch by Justin Blanchard. + + - bpo-37345(181): Add formal support for UDPLITE sockets. Support + was present before, but it is now easier to detect support with + ‘hasattr(socket, 'IPPROTO_UDPLITE')’ and there are constants + defined for each of the values needed: ‘socket.IPPROTO_UDPLITE’, + ‘UDPLITE_SEND_CSCOV’, and ‘UDPLITE_RECV_CSCOV’. Patch by Gabe + Appleton. + + - bpo-37358(182): Optimized ‘functools.partial’ by using vectorcall. + + - bpo-37347(183): *note sqlite3.Connection.create_aggregate(): 13f3, + *note sqlite3.Connection.create_function(): 13f4, *note + sqlite3.Connection.set_authorizer(): 244, *note + sqlite3.Connection.set_progress_handler(): 13f5. *note + sqlite3.Connection.set_trace_callback(): dee. 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. + + - bpo-37163(184): The `obj' argument of *note dataclasses.replace(): + 12ca. is positional-only now. + + - bpo-37085(185): Add the optional Linux SocketCAN Broadcast Manager + constants, used as flags to configure the BCM behaviour, in the + socket module. Patch by Karl Ding. + + - bpo-37328(186): ‘HTMLParser.unescape’ is removed. It was + undocumented and deprecated since Python 3.4. + + - bpo-37305(187): Add .webmanifest -> application/manifest+json to + list of recognized file types and content type headers + + - bpo-37320(188): ‘aifc.openfp()’ alias to ‘aifc.open()’, + ‘sunau.openfp()’ alias to ‘sunau.open()’, and ‘wave.openfp()’ alias + to ‘wave.open()’ have been removed. They were deprecated since + Python 3.7. + + - bpo-37315(189): Deprecated accepting floats with integral value + (like ‘5.0’) in *note math.factorial(): 58f. + + - bpo-37312(190): ‘_dummy_thread’ and ‘dummy_threading’ modules have + been removed. These modules were deprecated since Python 3.7 which + requires threading support. + + - bpo-33972(191): Email with single part but content-type set to + ‘multipart/*’ doesn’t raise AttributeError anymore. + + - bpo-37280(192): Use threadpool for reading from file for sendfile + fallback mode. + + - bpo-37279(193): Fix asyncio sendfile support when sendfile sends + extra data in fallback mode. + + - bpo-19865(194): *note ctypes.create_unicode_buffer(): 13f6. now + also supports non-BMP characters on platforms with 16-bit ‘wchar_t’ + (for example, Windows and AIX). + + - bpo-37266(195): 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. + + - bpo-37210(196): Allow pure Python implementation of *note pickle: + c7. to work even when the C ‘_pickle’ module is unavailable. + + - bpo-21872(197): Fix *note lzma: ab.: 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. + + - bpo-35922(198): Fix ‘RobotFileParser.crawl_delay()’ and + ‘RobotFileParser.request_rate()’ to return ‘None’ rather than raise + *note AttributeError: 19d. when no relevant rule is defined in the + robots.txt file. Patch by Rémi Lapeyre. + + - bpo-35766(199): Change the format of feature_version to be a + (major, minor) tuple. + + - bpo-36607(200): Eliminate *note RuntimeError: 6e9. raised by *note + asyncio.all_tasks(): 5a8. if internal tasks weak set is changed by + another thread during iteration. + + - bpo-18748(201): ‘_pyio.IOBase’ destructor now does nothing if + getting the ‘closed’ attribute fails to better mimic ‘_io.IOBase’ + finalizer. + + - bpo-36402(202): 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. + + - bpo-37206(203): Default values which cannot be represented as + Python objects no longer improperly represented as ‘None’ in + function signatures. + + - bpo-37111(204): Added ‘encoding’ and ‘errors’ keyword parameters to + ‘logging.basicConfig’. + + - bpo-12144(205): Ensure cookies with ‘expires’ attribute are handled + in ‘CookieJar.make_cookies()’. + + - bpo-34886(206): Fix an unintended ValueError from *note + subprocess.run(): 7e8. when checking for conflicting *note input: + f7c. and ‘stdin’ or ‘capture_output’ and ‘stdout’ or ‘stderr’ args + when they were explicitly provided but with *note None: 243. values + within a passed in ‘**kwargs’ dict rather than as passed directly + by name. Patch contributed by Rémi Lapeyre. + + - bpo-37173(207): The exception message for ‘inspect.getfile()’ now + correctly reports the passed class rather than the builtins module. + + - bpo-37178(208): Give math.perm() a one argument form that means the + same as math.factorial(). + + - bpo-37178(209): For math.perm(n, k), let k default to n, giving the + same result as factorial. + + - bpo-37165(210): Converted _collections._count_elements to use the + Argument Clinic. + + - bpo-34767(211): Do not always create a *note collections.deque: + 1a9. in *note asyncio.Lock: 6c3. + + - bpo-37158(212): Speed-up statistics.fmean() by switching from a + function to a generator. + + - bpo-34282(213): Remove ‘Enum._convert’ method, deprecated in 3.8. + + - bpo-37150(214): ‘argparse._ActionsContainer.add_argument’ now + throws error, if someone accidentally pass FileType class object + instead of instance of FileType as *note type: 9c2. argument + + - bpo-28724(215): The socket module now has the *note + socket.send_fds(): 57b. and ‘socket.recv.fds()’ methods. + Contributed by Joannah Nanjekye, Shinya Okano and Victor Stinner. + + - bpo-35621(216): Support running asyncio subprocesses when execution + event loop in a thread on UNIX. + + - bpo-36520(217): Lengthy email headers with UTF-8 characters are now + properly encoded when they are folded. Patch by Jeffrey Kintscher. + + - bpo-30835(218): 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. + + - bpo-31163(219): pathlib.Path instance’s rename and replace methods + now return the new Path instance. + + - bpo-25068(220): *note urllib.request.ProxyHandler: 13f7. now + lowercases the keys of the passed dictionary. + + - bpo-26185(221): Fix *note repr(): 3ee. on empty ‘ZipInfo’ object. + Patch by Mickaël Schoentgen. + + - bpo-21315(222): 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. + + - bpo-31904(223): Port test_datetime to VxWorks: skip zoneinfo tests + on VxWorks + + - bpo-35805(224): Add parser for Message-ID header and add it to + default HeaderRegistry. This should prevent folding of Message-ID + using RFC 2048 encoded words. + + - bpo-36871(225): Ensure method signature is used instead of + constructor signature of a class while asserting mock object + against method calls. Patch by Karthikeyan Singaravelan. + + - bpo-35070(226): posix.getgrouplist() now works correctly when the + user belongs to NGROUPS_MAX supplemental groups. Patch by Jeffrey + Kintscher. + + - bpo-31783(227): Fix race condition in ThreadPoolExecutor when + worker threads are created during interpreter shutdown. + + - bpo-36582(228): Fix ‘UserString.encode()’ to correctly return + ‘bytes’ rather than a ‘UserString’ instance. + + - bpo-32424(229): Deprecate xml.etree.ElementTree.Element.copy() in + favor of copy.copy(). + + Patch by Gordon P. Hemsley + + - bpo-36564(230): 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 + + - bpo-36543(231): Removed methods Element.getchildren(), + Element.getiterator() and ElementTree.getiterator() and the + xml.etree.cElementTree module. + + - bpo-36409(232): Remove the old plistlib API deprecated in Python + 3.4 + + - bpo-36302(233): distutils sorts source file lists so that Extension + .so files build more reproducibly by default + + - bpo-36250(234): Ignore ‘ValueError’ from ‘signal’ with + ‘interaction’ in non-main thread. + + - bpo-36046(235): Added ‘user’, ‘group’ and ‘extra_groups’ parameters + to the subprocess.Popen constructor. Patch by Patrick McLean. + + - bpo-32627(236): Fix compile error when ‘_uuid’ headers conflicting + included. + + - bpo-35800(237): Deprecate ‘smtpd.MailmanProxy’ ready for future + removal. + + - bpo-35168(238): *note shlex.shlex.punctuation_chars: 13f8. is now a + read-only property. + + - bpo-8538(239): Add support for boolean actions like ‘--foo’ and + ‘--no-foo’ to argparse. Patch contributed by Rémi Lapeyre. + + - bpo-20504(240): Fixes a bug in *note cgi: 14. module when a + multipart/form-data request has no ‘Content-Length’ header. + + - bpo-25988(241): The abstract base classes in *note collections.abc: + 1d. no longer are exposed in the regular *note collections: 1c. + module. + + - bpo-11122(242): Distutils won’t check for rpmbuild in specified + paths only. + + - bpo-34775(243): 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. + + - bpo-34749(244): *note binascii.a2b_base64(): 13f9. is now up to 2 + times faster. Patch by Sergey Fedoseev. + + - bpo-34519(245): Add additional aliases for HP Roman 8. Patch by + Michael Osipov. + + - bpo-28009(246): 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. + + - bpo-30618(247): Add *note readlink(): 567. Patch by Girts + Folkmanis. + + - bpo-32498(248): Made *note urllib.parse.unquote(): 13fa. accept + bytes in addition to strings. Patch by Stein Karlsen. + + - bpo-33348(249): lib2to3 now recognizes expressions after ‘*’ and + ‘**’ like in ‘f(*[] or [])’. + + - bpo-32689(250): Update *note shutil.move(): 6ac. function to allow + for Path objects to be used as source argument. Patch by Emily + Morehouse and Maxwell “5.13b” McKinnon. + + - bpo-32820(251): Added __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. + + - bpo-27657(252): 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”). + + - bpo-4963(253): Fixed non-deterministic behavior related to + mimetypes extension mapping and module reinitialization. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36589 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38807 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38724 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38786 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38785 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38723 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27805 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38438 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38761 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38716 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38713 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38692 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=38692 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=38602 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=38334 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=38312 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=38586 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=38565 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=34679 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31202 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=36321 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=38521 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=38493 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=38478 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=33604 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=38378 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=38417 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=38449 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=38431 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=38109 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=38422 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=38405 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=38332 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=38371 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=38341 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=38319 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=38242 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=13153 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=38019 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=38163 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=38161 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=38216 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=30458 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=28286 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=38108 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=38265 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=38112 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=38248 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=38237 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=34002 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=38191 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=38155 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=38185 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=38136 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=37828 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=38175 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=33936 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=34706 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=38153 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=38115 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=38148 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=38142 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=9216 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=36991 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=38134 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=38132 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=38008 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=34037 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=37405 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=38121 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=38110 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=38093 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=37488 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=35640 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=38086 + + (76) +https://gitlab.com/python-devs/importlib_metadata/blob/0.21/importlib_metadata/docs/changelog.rst + + (77) https://bugs.python.org/issue?@action=redirect&bpo=37251 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=38037 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=38066 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=38059 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=38049 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=37953 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=38026 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=35923 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=38010 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=38006 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=37995 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=34410 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=37140 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=37587 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=37834 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=10978 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=37972 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=37965 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=37964 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=37960 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=37961 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=37951 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=36205 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=37950 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=34679 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=36917 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=37798 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=26589 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=37915 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=32554 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=9938 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=37851 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=32793 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=37885 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=37868 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=37811 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=37863 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=21131 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=37798 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=37804 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=37819 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=14465 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=37810 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=37772 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=18578 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=37785 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=34488 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=37449 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=28292 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=18049 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=37742 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=37738 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=37723 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=35943 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=32178 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=37268 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=11953 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=37685 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=37697 + + (136) +https://gitlab.com/python-devs/importlib_metadata/-/milestones/20 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=37695 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=37689 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=29553 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=37691 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=37685 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=37354 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=37664 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=37663 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=37642 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=36161 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=36324 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=37555 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=29446 + + (150) https://bugs.python.org/issue?@action=redirect&bpo=16970 + + (151) https://bugs.python.org/issue?@action=redirect&bpo=34443 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=37491 + + (153) https://bugs.python.org/issue?@action=redirect&bpo=37587 + + (154) https://bugs.python.org/issue?@action=redirect&bpo=18378 + + (155) https://bugs.python.org/issue?@action=redirect&bpo=37579 + + (156) https://bugs.python.org/issue?@action=redirect&bpo=21478 + + (157) https://bugs.python.org/issue?@action=redirect&bpo=37531 + + (158) https://bugs.python.org/issue?@action=redirect&bpo=37482 + + (159) https://bugs.python.org/issue?@action=redirect&bpo=36993 + + (160) https://bugs.python.org/issue?@action=redirect&bpo=37502 + + (161) https://bugs.python.org/issue?@action=redirect&bpo=37520 + + (162) https://bugs.python.org/issue?@action=redirect&bpo=18374 + + (163) https://bugs.python.org/issue?@action=redirect&bpo=37424 + + (164) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (165) https://bugs.python.org/issue?@action=redirect&bpo=37481 + + (166) https://bugs.python.org/issue?@action=redirect&bpo=37479 + + (167) https://bugs.python.org/issue?@action=redirect&bpo=37440 + + (168) https://bugs.python.org/issue?@action=redirect&bpo=37437 + + (169) https://bugs.python.org/issue?@action=redirect&bpo=37428 + + (170) https://bugs.python.org/issue?@action=redirect&bpo=37420 + + (171) https://bugs.python.org/issue?@action=redirect&bpo=37412 + + (172) https://peps.python.org/pep-0529/ + + (173) https://bugs.python.org/issue?@action=redirect&bpo=37406 + + (174) https://bugs.python.org/issue?@action=redirect&bpo=29412 + + (175) https://bugs.python.org/issue?@action=redirect&bpo=36546 + + (176) https://bugs.python.org/issue?@action=redirect&bpo=37394 + + (177) https://bugs.python.org/issue?@action=redirect&bpo=37376 + + (178) https://bugs.python.org/issue?@action=redirect&bpo=26967 + + (179) https://bugs.python.org/issue?@action=redirect&bpo=37212 + + (180) https://bugs.python.org/issue?@action=redirect&bpo=37372 + + (181) https://bugs.python.org/issue?@action=redirect&bpo=37345 + + (182) https://bugs.python.org/issue?@action=redirect&bpo=37358 + + (183) https://bugs.python.org/issue?@action=redirect&bpo=37347 + + (184) https://bugs.python.org/issue?@action=redirect&bpo=37163 + + (185) https://bugs.python.org/issue?@action=redirect&bpo=37085 + + (186) https://bugs.python.org/issue?@action=redirect&bpo=37328 + + (187) https://bugs.python.org/issue?@action=redirect&bpo=37305 + + (188) https://bugs.python.org/issue?@action=redirect&bpo=37320 + + (189) https://bugs.python.org/issue?@action=redirect&bpo=37315 + + (190) https://bugs.python.org/issue?@action=redirect&bpo=37312 + + (191) https://bugs.python.org/issue?@action=redirect&bpo=33972 + + (192) https://bugs.python.org/issue?@action=redirect&bpo=37280 + + (193) https://bugs.python.org/issue?@action=redirect&bpo=37279 + + (194) https://bugs.python.org/issue?@action=redirect&bpo=19865 + + (195) https://bugs.python.org/issue?@action=redirect&bpo=37266 + + (196) https://bugs.python.org/issue?@action=redirect&bpo=37210 + + (197) https://bugs.python.org/issue?@action=redirect&bpo=21872 + + (198) https://bugs.python.org/issue?@action=redirect&bpo=35922 + + (199) https://bugs.python.org/issue?@action=redirect&bpo=35766 + + (200) https://bugs.python.org/issue?@action=redirect&bpo=36607 + + (201) https://bugs.python.org/issue?@action=redirect&bpo=18748 + + (202) https://bugs.python.org/issue?@action=redirect&bpo=36402 + + (203) https://bugs.python.org/issue?@action=redirect&bpo=37206 + + (204) https://bugs.python.org/issue?@action=redirect&bpo=37111 + + (205) https://bugs.python.org/issue?@action=redirect&bpo=12144 + + (206) https://bugs.python.org/issue?@action=redirect&bpo=34886 + + (207) https://bugs.python.org/issue?@action=redirect&bpo=37173 + + (208) https://bugs.python.org/issue?@action=redirect&bpo=37178 + + (209) https://bugs.python.org/issue?@action=redirect&bpo=37178 + + (210) https://bugs.python.org/issue?@action=redirect&bpo=37165 + + (211) https://bugs.python.org/issue?@action=redirect&bpo=34767 + + (212) https://bugs.python.org/issue?@action=redirect&bpo=37158 + + (213) https://bugs.python.org/issue?@action=redirect&bpo=34282 + + (214) https://bugs.python.org/issue?@action=redirect&bpo=37150 + + (215) https://bugs.python.org/issue?@action=redirect&bpo=28724 + + (216) https://bugs.python.org/issue?@action=redirect&bpo=35621 + + (217) https://bugs.python.org/issue?@action=redirect&bpo=36520 + + (218) https://bugs.python.org/issue?@action=redirect&bpo=30835 + + (219) https://bugs.python.org/issue?@action=redirect&bpo=31163 + + (220) https://bugs.python.org/issue?@action=redirect&bpo=25068 + + (221) https://bugs.python.org/issue?@action=redirect&bpo=26185 + + (222) https://bugs.python.org/issue?@action=redirect&bpo=21315 + + (223) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (224) https://bugs.python.org/issue?@action=redirect&bpo=35805 + + (225) https://bugs.python.org/issue?@action=redirect&bpo=36871 + + (226) https://bugs.python.org/issue?@action=redirect&bpo=35070 + + (227) https://bugs.python.org/issue?@action=redirect&bpo=31783 + + (228) https://bugs.python.org/issue?@action=redirect&bpo=36582 + + (229) https://bugs.python.org/issue?@action=redirect&bpo=32424 + + (230) https://bugs.python.org/issue?@action=redirect&bpo=36564 + + (231) https://bugs.python.org/issue?@action=redirect&bpo=36543 + + (232) https://bugs.python.org/issue?@action=redirect&bpo=36409 + + (233) https://bugs.python.org/issue?@action=redirect&bpo=36302 + + (234) https://bugs.python.org/issue?@action=redirect&bpo=36250 + + (235) https://bugs.python.org/issue?@action=redirect&bpo=36046 + + (236) https://bugs.python.org/issue?@action=redirect&bpo=32627 + + (237) https://bugs.python.org/issue?@action=redirect&bpo=35800 + + (238) https://bugs.python.org/issue?@action=redirect&bpo=35168 + + (239) https://bugs.python.org/issue?@action=redirect&bpo=8538 + + (240) https://bugs.python.org/issue?@action=redirect&bpo=20504 + + (241) https://bugs.python.org/issue?@action=redirect&bpo=25988 + + (242) https://bugs.python.org/issue?@action=redirect&bpo=11122 + + (243) https://bugs.python.org/issue?@action=redirect&bpo=34775 + + (244) https://bugs.python.org/issue?@action=redirect&bpo=34749 + + (245) https://bugs.python.org/issue?@action=redirect&bpo=34519 + + (246) https://bugs.python.org/issue?@action=redirect&bpo=28009 + + (247) https://bugs.python.org/issue?@action=redirect&bpo=30618 + + (248) https://bugs.python.org/issue?@action=redirect&bpo=32498 + + (249) https://bugs.python.org/issue?@action=redirect&bpo=33348 + + (250) https://bugs.python.org/issue?@action=redirect&bpo=32689 + + (251) https://bugs.python.org/issue?@action=redirect&bpo=32820 + + (252) https://bugs.python.org/issue?@action=redirect&bpo=27657 + + (253) https://bugs.python.org/issue?@action=redirect&bpo=4963 + + +File: python.info, Node: Documentation<29>, Next: Tests<28>, Prev: Library<29>, Up: Python 3 9 0 alpha 1 + +1.21.30.4 Documentation +....................... + + - bpo-21767(1): Explicitly mention abc support in + functools.singledispatch + + - bpo-38816(2): Provides more details about the interaction between + ‘fork()’ and CPython’s runtime, focusing just on the C-API. This + includes cautions about where ‘fork()’ should and shouldn’t be + called. + + - bpo-38351(3): Modernize *note email: 64. examples from %-formatting + to f-strings. + + - bpo-38778(4): Document the fact that *note RuntimeError: 6e9. is + raised if *note os.fork(): cd4. is called in a subinterpreter. + + - bpo-38592(5): Add Brazilian Portuguese to the language switcher at + Python Documentation website. + + - bpo-38294(6): Add list of no-longer-escaped chars to re.escape + documentation + + - bpo-38053(7): Modernized the plistlib documentation + + - bpo-26868(8): Fix example usage of *note PyModule_AddObject(): 4c4. + to properly handle errors. + + - bpo-36797(9): Fix a dead link in the distutils API Reference. + + - bpo-37977(10): Warn more strongly and clearly about pickle + insecurity + + - bpo-37979(11): Added a link to dateutil.parser.isoparse in the + datetime.fromisoformat documentation. Patch by Paul Ganssle + + - bpo-12707(12): 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 + + - bpo-37937(13): Mention ‘frame.f_trace’ in *note sys.settrace(): + 1139. docs. + + - bpo-37878(14): Make *note PyThreadState_DeleteCurrent(): 13fc. + Internal. + + - bpo-37759(15): Beginning edits to Whatsnew 3.8 + + - bpo-37726(16): Stop recommending getopt in the tutorial for command + line argument parsing and promote argparse. + + - bpo-32910(17): Remove implementation-specific behaviour of how + venv’s Deactivate works. + + - bpo-37256(18): Fix wording of arguments for ‘Request’ in *note + urllib.request: 12a. + + - bpo-37284(19): Add a brief note to indicate that any new + ‘sys.implementation’ required attributes must go through the PEP + process. + + - bpo-30088(20): Documented that *note mailbox.Maildir: fb3. + constructor doesn’t attempt to verify the maildir folder layout + correctness. Patch by Sviatoslav Sydorenko. + + - bpo-37521(21): Fix *note importlib: 97. 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. + + - bpo-37456(22): Slash (‘/’) is now part of syntax. + + - bpo-37487(23): Fix PyList_GetItem index description to include 0. + + - bpo-37149(24): Replace the dead link to the Tkinter 8.5 reference + by John Shipman, New Mexico Tech, with a link to the archive.org + copy. + + - bpo-37478(25): Added possible exceptions to the description of + os.chdir(). + + - bpo-34903(26): Documented that in *note + datetime.datetime.strptime(): 12dd, the leading zero in some + two-digit formats is optional. Patch by Mike Gleen. + + - bpo-36260(27): Add decompression pitfalls to zipfile module + documentation. + + - bpo-37004(28): 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. + + - bpo-36960(29): Restructured the *note datetime: 2f. docs in the + interest of making them more user-friendly and improving + readability. Patch by Brad Solomon. + + - bpo-36487(30): Make C-API docs clear about what the “main” + interpreter is. + + - bpo-23460(31): The documentation for decimal string formatting + using the ‘:g’ specifier has been updated to reflect the correct + exponential notation cutoff point. Original patch contributed by + Tuomas Suutari. + + - bpo-35803(32): Document and test that ‘tempfile’ functions may + accept a *note path-like object: 773. for the ‘dir’ argument. + Patch by Anthony Sottile. + + - bpo-33944(33): Added a note about the intended use of code in .pth + files. + + - bpo-34293(34): Fix the Doc/Makefile regarding PAPER environment + variable and PDF builds + + - bpo-25237(35): Add documentation for tkinter modules + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21767 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38816 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38351 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38778 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38592 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38294 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38053 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26868 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36797 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37977 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37979 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=12707 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=37937 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=37878 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=37759 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=37726 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32910 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=37256 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=37284 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=30088 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=37521 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=37456 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=37487 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=37149 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=37478 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=34903 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=36260 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=37004 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=36960 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=36487 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=23460 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=35803 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=33944 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=34293 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=25237 + + +File: python.info, Node: Tests<28>, Next: Build<30>, Prev: Documentation<29>, Up: Python 3 9 0 alpha 1 + +1.21.30.5 Tests +............... + + - bpo-38614(1): Fix test_communicate() of + test_asyncio.test_subprocess: use ‘support.LONG_TIMEOUT’ (5 + minutes), instead of just 1 minute. + + - bpo-38614(2): Add timeout constants to *note test.support: 102.: + *note LOOPBACK_TIMEOUT: 13d4, *note INTERNET_TIMEOUT: 13d5, *note + SHORT_TIMEOUT: 12b1. and *note LONG_TIMEOUT: 13d6. + + - bpo-38502(3): test.regrtest now uses process groups in the + multiprocessing mode (-jN command line option) if process groups + are available: if *note os.setsid(): 13fe. and *note os.killpg(): + 13ff. functions are available. + + - bpo-35998(4): 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. + + - bpo-38470(5): Fix ‘test_compileall.test_compile_dir_maxlevels()’ on + Windows without long path support: only create 3 subdirectories + instead of between 20 and 100 subdirectories. + + - bpo-37531(6): On timeout, regrtest no longer attempts to call + ‘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. + + - bpo-38239(7): Fix test_gdb for Link Time Optimization (LTO) builds. + + - bpo-38275(8): 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. + + - bpo-38271(9): 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. + + - bpo-38270(10): 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. + + - bpo-37123(11): 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. + + - bpo-38212(12): Multiprocessing tests: increase + test_queue_feeder_donot_stop_onexc() timeout from 1 to 60 seconds. + + - bpo-38117(13): Test with OpenSSL 1.1.1d + + - bpo-38018(14): Increase code coverage for + multiprocessing.shared_memory. + + - bpo-37805(15): Add tests for json.dump(…, skipkeys=True). Patch by + Dong-hee Na. + + - bpo-37531(16): 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(). + + - bpo-37876(17): Add tests for ROT-13 codec. + + - bpo-36833(18): Added tests for PyDateTime_xxx_GET_xxx() macros of + the C API of the *note datetime: 2f. module. Patch by Joannah + Nanjekye. + + - bpo-37558(19): Fix + test_shared_memory_cleaned_after_process_termination name handling + + - bpo-37526(20): Add ‘test.support.catch_threading_exception()’: + context manager catching *note threading.Thread: 59b. exception + using *note threading.excepthook(): 442. + + - bpo-37421(21): test_concurrent_futures now explicitly stops the + ForkServer instance if it’s running. + + - bpo-37421(22): 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. + + - bpo-37421(23): 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. + + - bpo-37421(24): test_concurrent_futures now cleans up + multiprocessing to remove immediately temporary directories created + by multiprocessing.util.get_temp_dir(). + + - bpo-37421(25): test_winconsoleio doesn’t leak a temporary file + anymore: use tempfile.TemporaryFile() to remove it when the test + completes. + + - bpo-37421(26): multiprocessing tests now explicitly call + ‘_run_finalizers()’ to immediately remove temporary directories + created by tests. + + - bpo-37421(27): urllib.request tests now call *note urlcleanup(): + 1400. to remove temporary files created by ‘urlretrieve()’ tests + and to clear the ‘_opener’ global variable set by ‘urlopen()’ and + functions calling indirectly ‘urlopen()’. + + - bpo-37472(28): Remove ‘Lib/test/outstanding_bugs.py’. + + - bpo-37199(29): Fix test failures when IPv6 is unavailable or + disabled. + + - bpo-19696(30): Replace deprecated method “random.choose” with + “random.choice” in “test_pkg_import.py”. + + - bpo-37335(31): Remove no longer necessary code from c locale + coercion tests + + - bpo-37421(32): Fix test_shutil to no longer leak temporary files. + + - bpo-37411(33): Fix test_wsgiref.testEnviron() to no longer depend + on the environment variables (don’t fail if “X” variable is set). + + - bpo-37400(34): Fix test_os.test_chown(): use os.getgroups() rather + than grp.getgrall() to get groups. Rename also the test to + test_chown_gid(). + + - bpo-37359(35): Add –cleanup option to python3 -m test to remove + ‘test_python_*’ directories of previous failed jobs. Add “make + cleantest” to run ‘python3 -m test --cleanup’. + + - bpo-37362(36): 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. + + - bpo-35998(37): Avoid TimeoutError in test_asyncio: + test_start_tls_server_1() + + - bpo-37278(38): Fix test_asyncio ProactorLoopCtrlC: join the thread + to prevent leaking a running thread and leaking a reference. + + - bpo-37261(39): Fix *note test.support.catch_unraisable_exception(): + 1401.: its __exit__() method now ignores unraisable exception + raised when clearing its ‘unraisable’ attribute. + + - bpo-37069(40): regrtest now uses *note sys.unraisablehook(): 24e. + to mark a test as “environment altered” (ENV_CHANGED) if it emits + an “unraisable exception”. Moreover, regrtest logs a warning in + this case. + + Use ‘python3 -m test --fail-env-changed’ to catch unraisable + exceptions in tests. + + - bpo-37252(41): Fix assertions in ‘test_close’ and + ‘test_events_mask_overflow’ devpoll tests. + + - bpo-37169(42): Rewrite ‘_PyObject_IsFreed()’ unit tests. + + - bpo-37153(43): ‘test_venv.test_multiprocessing()’ now explicitly + calls ‘pool.terminate()’ to wait until the pool completes. + + - bpo-34001(44): Make test_ssl pass with LibreSSL. LibreSSL handles + minimum and maximum TLS version differently than OpenSSL. + + - bpo-36919(45): Make ‘test_source_encoding.test_issue2301’ + implementation independent. The test will work now for both + CPython and IronPython. + + - bpo-30202(46): Update ‘test.test_importlib.test_abc’ to test + ‘find_spec()’. + + - bpo-28009(47): 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 + + - bpo-34596(48): Fallback to a default reason when *note + unittest.skip(): 1402. is uncalled. Patch by Naitree Zhu. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38614 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38614 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38502 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35998 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38470 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37531 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38239 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38275 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38271 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38270 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37123 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38212 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=38117 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=38018 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=37805 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=37531 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=37876 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=36833 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=37558 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=37526 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=37472 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=37199 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=19696 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=37335 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=37421 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=37411 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=37400 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=37359 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=37362 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=35998 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=37278 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=37261 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=37069 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=37252 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=37169 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=37153 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=34001 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=36919 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=30202 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=28009 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=34596 + + +File: python.info, Node: Build<30>, Next: Windows<27>, Prev: Tests<28>, Up: Python 3 9 0 alpha 1 + +1.21.30.6 Build +............... + + - bpo-38809(1): On Windows, build scripts will now recognize and use + python.exe from an active virtual env. + + - bpo-38684(2): Fix _hashlib build when Blake2 is disabled, but + OpenSSL supports it. + + - bpo-38468(3): Misc/python-config.in now uses ‘getvar()’ for all + still existing *note sysconfig.get_config_var(): cd7. calls. Patch + by Joannah Nanjekye. + + - bpo-37415(4): Fix stdatomic.h header check for ICC compiler: the + ICC implementation lacks atomic_uintptr_t type which is needed by + Python. + + - bpo-38301(5): In Solaris family, we must be sure to use + ‘-D_REENTRANT’. Patch by Jesús Cea Avión. + + - bpo-36002(6): Locate ‘llvm-profdata’ and ‘llvm-ar’ binaries using + ‘AC_PATH_TOOL’ rather than ‘AC_PATH_TARGET_TOOL’. + + - bpo-37936(7): The ‘.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. + + - bpo-37760(8): The ‘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 *note + str: 1b3. and by the *note unicodedata: 124. module, now handles + each character’s data as a ‘dataclass’ with named attributes, + rather than a length-18 list of different fields. + + - bpo-37936(9): The ‘.gitignore’ file no longer applies to any files + that are in fact tracked in the Git repository. Patch by Greg + Price. + + - bpo-37725(10): 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”. + + - bpo-37707(11): 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. + + - bpo-36044(12): 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. + + - bpo-37468(13): ‘make install’ no longer installs ‘wininst-*.exe’ + files used by distutils bdist_wininst: bdist_wininst only works on + Windows. + + - bpo-37189(14): Many ‘PyRun_XXX()’ functions like *note + PyRun_String(): 1404. were no longer exported in ‘libpython38.dll’ + by mistake. Export them again to fix the ABI compatibility. + + - bpo-25361(15): Enables use of SSE2 instructions in Windows 32-bit + build. + + - bpo-36210(16): 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 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38809 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38684 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38468 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37415 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38301 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36002 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37936 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37760 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=37936 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37725 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37707 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36044 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=37468 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=37189 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=25361 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=36210 + + +File: python.info, Node: Windows<27>, Next: macOS<20>, Prev: Build<30>, Up: Python 3 9 0 alpha 1 + +1.21.30.7 Windows +................. + + - bpo-38589(1): Fixes HTML Help shortcut when Windows is not + installed to C drive + + - bpo-38453(2): Ensure ntpath.realpath() correctly resolves relative + paths. + + - bpo-38519(3): Restores the internal C headers that were missing + from the nuget.org and Microsoft Store packages. + + - bpo-38492(4): Remove ‘pythonw.exe’ dependency on the Microsoft C++ + runtime. + + - bpo-38344(5): Fix error message in activate.bat + + - bpo-38359(6): Ensures ‘pyw.exe’ launcher reads correct registry + key. + + - bpo-38355(7): Fixes ‘ntpath.realpath’ failing on ‘sys.executable’. + + - bpo-38117(8): Update bundled OpenSSL to 1.1.1d + + - bpo-38092(9): Reduce overhead when using multiprocessing in a + Windows virtual environment. + + - bpo-38133(10): Allow py.exe launcher to locate installations from + the Microsoft Store and improve display of active virtual + environments. + + - bpo-38114(11): The ‘pip.ini’ is no longer included in the Nuget + package. + + - bpo-32592(12): Set Windows 8 as the minimum required version for + API support + + - bpo-36634(13): *note os.cpu_count(): 40a. now returns active + processors rather than maximum processors. + + - bpo-36634(14): venv activate.bat now works when the existing + variables contain double quote characters. + + - bpo-38081(15): Prevent error calling *note os.path.realpath(): 412. + on ‘'NUL'’. + + - bpo-38087(16): Fix case sensitivity in test_pathlib and + test_ntpath. + + - bpo-38088(17): Fixes distutils not finding vcruntime140.dll with + only the v142 toolset installed. + + - bpo-37283(18): Ensure command-line and unattend.xml setting + override previously detected states in Windows installer. + + - bpo-38030(19): Fixes *note os.stat(): 653. failing for block + devices on Windows + + - bpo-38020(20): Fixes potential crash when calling *note + os.readlink(): 568. (or indirectly through *note realpath(): 412.) + on a file that is not a supported link. + + - bpo-37705(21): Improve the implementation of ‘winerror_to_errno()’. + + - bpo-37549(22): *note os.dup(): 1406. no longer fails for standard + streams on Windows 7. + + - bpo-1311(23): The ‘nul’ file on Windows now returns True from *note + exists(): 657. and a valid result from *note os.stat(): 653. with + ‘S_IFCHR’ set. + + - bpo-9949(24): Enable support for following symlinks in + ‘os.realpath()’. + + - bpo-37834(25): Treat all name surrogate reparse points on Windows + in *note os.lstat(): 654. and other reparse points as regular files + in *note os.stat(): 653. + + - bpo-36266(26): Add the module name in the formatted error message + when DLL load fail happens during module import in + ‘_PyImport_FindSharedFuncptrWindows()’. Patch by Srinivas + Nyayapati. + + - bpo-25172(27): Trying to import the *note crypt: 27. module on + Windows will result in an *note ImportError: 511. with a message + explaining that the module isn’t supported on Windows. On other + platforms, if the underlying ‘_crypt’ module is not available, the + ImportError will include a message explaining the problem. + + - bpo-37778(28): Fixes the icons used for file associations to the + Microsoft Store package. + + - bpo-37734(29): Fix use of registry values to launch Python from + Microsoft Store app. + + - bpo-37702(30): Fix memory leak on Windows in creating an SSLContext + object or running urllib.request.urlopen(’‘https://’…’). + + - bpo-37672(31): Switch Windows Store package’s pip to use bundled + ‘pip.ini’ instead of ‘PIP_USER’ variable. + + - bpo-10945(32): Officially drop support for creating bdist_wininst + installers on non-Windows systems. + + - bpo-37445(33): Include the ‘FORMAT_MESSAGE_IGNORE_INSERTS’ flag in + ‘FormatMessageW()’ calls. + + - bpo-37369(34): Fixes path for *note sys.executable: 6be. when + running from the Microsoft Store. + + - bpo-37380(35): Don’t collect unfinished processes with + ‘subprocess._active’ on Windows to cleanup later. Patch by Ruslan + Kuprieiev. + + - bpo-37351(36): Removes libpython38.a from standard Windows + distribution. + + - bpo-35360(37): Update Windows builds to use SQLite 3.28.0. + + - bpo-37267(38): On Windows, *note os.dup(): 1406. no longer creates + an inheritable fd when handling a character file. + + - bpo-36779(39): Ensure ‘time.tzname’ is correct on Windows when the + active code page is set to CP_UTF7 or CP_UTF8. + + - bpo-32587(40): Make *note winreg.REG_MULTI_SZ: 1407. support + zero-length strings. + + - bpo-28269(41): Replace use of ‘strcasecmp()’ for the system + function ‘_stricmp()’. Patch by Minmin Gong. + + - bpo-36590(42): Add native Bluetooth RFCOMM support to socket + module. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38589 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38453 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38519 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38492 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38344 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38359 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38355 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38117 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38092 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38133 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38114 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32592 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=36634 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=36634 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=38081 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=38087 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=38088 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=37283 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=38030 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=38020 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=37705 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=37549 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=1311 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=9949 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=37834 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=36266 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=25172 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=37778 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=37734 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=37702 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=37672 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=10945 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=37445 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=37369 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=37380 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=37351 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=35360 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=37267 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=36779 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=32587 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=28269 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=36590 + + +File: python.info, Node: macOS<20>, Next: IDLE<20>, Prev: Windows<27>, Up: Python 3 9 0 alpha 1 + +1.21.30.8 macOS +............... + + - bpo-38117(1): Updated OpenSSL to 1.1.1d in macOS installer. + + - bpo-38089(2): Move Azure Pipelines to latest VM versions and make + macOS tests optional + + - bpo-18049(3): 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. + + - bpo-34602(4): 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. + + - bpo-35360(5): Update macOS installer to use SQLite 3.28.0. + + - bpo-34631(6): Updated OpenSSL to 1.1.1c in macOS installer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38117 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38089 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18049 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=34602 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35360 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=34631 + + +File: python.info, Node: IDLE<20>, Next: Tools/Demos<10>, Prev: macOS<20>, Up: Python 3 9 0 alpha 1 + +1.21.30.9 IDLE +.............. + + - bpo-26353(1): Stop adding newline when saving an IDLE shell window. + + - bpo-4630(2): 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. + + - bpo-38598(3): Do not try to compile IDLE shell or output windows + + - bpo-36698(4): 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 ‘errors’ field to the + standard streams. + + - bpo-35379(5): 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. + + - bpo-38183(6): 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. + + - bpo-38077(7): 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. + + - bpo-38041(8): 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. + + - bpo-35771(9): To avoid occasional spurious test_idle failures on + slower machines, increase the ‘hover_delay’ in test_tooltip. + + - bpo-37824(10): Properly handle user input warnings in IDLE shell. + Cease turning SyntaxWarnings into SyntaxErrors. + + - bpo-37929(11): IDLE Settings dialog now closes properly when there + is no shell window. + + - bpo-37902(12): Add mousewheel scrolling for IDLE module, path, and + stack browsers. Patch by George Zhang. + + - bpo-37849(13): Fixed completions list appearing too high or low + when shown above the current line. + + - bpo-36419(14): Refactor IDLE autocomplete and improve testing. + + - bpo-37748(15): Reorder the Run menu. Put the most common choice, + Run Module, at the top. + + - bpo-37692(16): Improve highlight config sample with example shell + interaction and better labels for shell elements. + + - bpo-37628(17): Settings dialog no longer expands with font size. + + - bpo-37627(18): Initialize the Customize Run dialog with the command + line arguments most recently entered before. The user can + optionally edit before submitting them. + + - bpo-33610(19): Fix code context not showing the correct context + when first toggled on. + + - bpo-37530(20): Optimize code context to reduce unneeded background + activity. Font and highlight changes now occur along with text + changes instead of after a random delay. + + - bpo-27452(21): Cleanup ‘config.py’ by inlining ‘RemoveFile’ and + simplifying the handling of ‘file’ in ‘CreateConfigHandlers’. + + - bpo-37325(22): Fix tab focus traversal order for help source and + custom run dialogs. + + - bpo-37321(23): Both subprocess connection error messages now refer + to the ‘Startup failure’ section of the IDLE doc. + + - bpo-17535(24): Add optional line numbers for IDLE editor windows. + Windows open without line numbers unless set otherwise in the + General tab of the configuration dialog. + + - bpo-26806(25): 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. + + - bpo-37177(26): Properly ‘attach’ search dialogs to their main + window so that they behave like other dialogs and do not get hidden + behind their main window. + + - bpo-37039(27): 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. + + - bpo-35763(28): Make calltip reminder about ‘/’ meaning + positional-only less obtrusive by only adding it when there is room + on the first line. + + - bpo-5680(29): 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. + + - bpo-36390(30): Gather Format menu functions into format.py. + Combine paragraph.py, rstrip.py, and format methods from editor.py. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26353 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=4630 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38598 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36698 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35379 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=38183 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38077 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38041 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35771 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37824 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=37929 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=37902 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=37849 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=36419 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=37748 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=37692 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=37628 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=37627 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=33610 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=37530 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=27452 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=37325 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=37321 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=17535 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=26806 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=37177 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=37039 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=35763 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=5680 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=36390 + + +File: python.info, Node: Tools/Demos<10>, Next: C API<27>, Prev: IDLE<20>, Up: Python 3 9 0 alpha 1 + +1.21.30.10 Tools/Demos +...................... + + - bpo-38118(1): Update Valgrind suppression file to ignore a false + alarm in *note PyUnicode_Decode(): 140b. when using GCC builtin + strcmp(). + + - bpo-38347(2): pathfix.py: Assume all files that end on ‘.py’ are + Python scripts when working recursively. + + - bpo-37803(3): pdb’s ‘--help’ and ‘--version’ long options now work. + + - bpo-37942(4): Improve ArgumentClinic converter for floats. + + - bpo-37704(5): Remove ‘Tools/scripts/h2py.py’: use cffi to access a + C API in Python. + + - bpo-37675(6): 2to3 now works when run from a zipped standard + library. + + - bpo-37034(7): Argument Clinic now uses the argument name on errors + with keyword-only argument instead of their position. Patch + contributed by Rémi Lapeyre. + + - bpo-37064(8): Add option -k to pathscript.py script: preserve + shebang flags. Add option -a to pathscript.py script: add flags. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38118 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38347 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37803 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37942 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=37704 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=37675 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37034 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37064 + + +File: python.info, Node: C API<27>, Prev: Tools/Demos<10>, Up: Python 3 9 0 alpha 1 + +1.21.30.11 C API +................ + + - bpo-37633(1): Re-export some function compatibility wrappers for + macros in ‘pythonrun.h’. + + - bpo-38644(2): Provide *note Py_EnterRecursiveCall(): 5c8. and *note + Py_LeaveRecursiveCall(): 5c9. 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 + ‘PyThreadState.recursion_depth’ field. Remove + ‘_Py_CheckRecursionLimit’ from the stable ABI. + + - bpo-38650(3): The global variable *note + PyStructSequence_UnnamedField: 5d8. is now a constant and refers to + a constant string. + + - bpo-38540(4): Fixed possible leak in *note PyArg_Parse(): 140d. and + similar functions for format units ‘"es#"’ and ‘"et#"’ when the + macro ‘PY_SSIZE_T_CLEAN’ is not defined. + + - bpo-38395(5): Fix a crash in *note weakref.proxy: 6a1. 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. + + - bpo-36389(6): The ‘_PyObject_CheckConsistency()’ function is now + also available in release mode. For example, it can be used to + debug a crash in the ‘visit_decref()’ function of the GC. + + - bpo-38266(7): Revert the removal of PyThreadState_DeleteCurrent() + with documentation. + + - bpo-38303(8): Update audioop extension module to use the stable ABI + (PEP-384). Patch by Tyler Kieft. + + - bpo-38234(9): *note Py_SetPath(): 36c. now sets *note + sys.executable: 6be. to the program full path (*note + Py_GetProgramFullPath(): 4e4.) rather than to the program name + (*note Py_GetProgramName(): 4e6.). + + - bpo-38234(10): Python ignored arguments passed to *note + Py_SetPath(): 36c, *note Py_SetPythonHome(): 36e. and *note + Py_SetProgramName(): 36d.: fix Python initialization to use + specified arguments. + + - bpo-38205(11): The *note Py_UNREACHABLE(): 817. macro now calls + *note Py_FatalError(): 5d9. + + - bpo-38140(12): Make dict and weakref offsets opaque for C heap + types by passing the offsets through PyMemberDef + + - bpo-15088(13): The C function ‘PyGen_NeedsFinalizing’ has been + removed. It was not documented, tested or used anywhere within + CPython after the implementation of PEP 442(14). Patch by Joannah + Nanjekye. (Patch by Joannah Nanjekye) + + - bpo-36763(15): Options added by ‘PySys_AddXOption()’ are now + handled the same way than ‘PyConfig.xoptions’ and command line ‘-X’ + options. + + - bpo-37926(16): Fix a crash in ‘PySys_SetArgvEx(0, NULL, 0)’. + + - bpo-37879(17): Fix subtype_dealloc to suppress the type decref when + the base type is a C heap type + + - bpo-37645(18): Add ‘_PyObject_FunctionStr()’ to get a user-friendly + string representation of a function-like object. Patch by Jeroen + Demeyer. + + - bpo-29548(19): The functions ‘PyEval_CallObject’, + ‘PyEval_CallFunction’, ‘PyEval_CallMethod’ and + ‘PyEval_CallObjectWithKeywords’ are deprecated. Use *note + PyObject_Call(): 5b9. and its variants instead. + + - bpo-37151(20): ‘PyCFunction_Call’ is now a deprecated alias of + *note PyObject_Call(): 5b9. + + - bpo-37540(21): The vectorcall protocol now requires that the caller + passes only strings as keyword names. + + - bpo-37207(22): The vectorcall protocol is now enabled for ‘type’ + objects: set ‘tp_vectorcall’ to a vectorcall function to be used + instead of ‘tp_new’ and ‘tp_init’ when calling the class itself. + + - bpo-21120(23): Exclude Python-ast.h, ast.h and asdl.h from the + limited API. + + - bpo-37483(24): Add new function ‘_PyObject_CallOneArg’ for calling + an object with one positional argument. + + - bpo-36763(25): Add ‘PyConfig_SetWideStringList()’ function. + + - bpo-37337(26): Add fast functions for calling methods: + ‘_PyObject_VectorcallMethod()’, ‘_PyObject_CallMethodNoArgs()’ and + ‘_PyObject_CallMethodOneArg()’. + + - bpo-28805(27): The *note METH_FASTCALL: 1202. calling convention + has been documented. + + - bpo-37221(28): The new function *note PyCode_NewWithPosOnlyArgs(): + 34a. allows to create code objects like *note PyCode_New(): 349, + but with an extra `posonlyargcount' parameter for indicating the + number of positonal-only arguments. + + - bpo-37215(29): Fix dtrace issue introduce by bpo-36842(30) + + - bpo-37194(31): Add a new public *note PyObject_CallNoArgs(): 5c7. + 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, + ‘PyObject_CallFunctionObjArgs(func, NULL)’ allocates 960 bytes on + the stack per call, whereas ‘PyObject_CallNoArgs(func)’ only + allocates 624 bytes per call. + + - bpo-37170(32): Fix the cast on error in *note + PyLong_AsUnsignedLongLongMask(): 140e. + + - bpo-35381(33): Convert posixmodule.c statically allocated types + ‘DirEntryType’ and ‘ScandirIteratorType’ to heap-allocated types. + + - bpo-34331(34): Use singular/plural noun in error message when + instantiating an abstract class with non-overriden abstract + method(s). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37633 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=38644 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=38650 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=38540 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=38395 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36389 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=38266 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=38303 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=38234 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=38234 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=38205 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=38140 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=15088 + + (14) https://peps.python.org/pep-0442/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36763 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=37926 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=37879 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=37645 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=29548 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=37151 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=37540 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=37207 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=21120 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=37483 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=36763 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=37337 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=28805 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=37221 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=37215 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=36842 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=37194 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=37170 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=35381 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=34331 + + +File: python.info, Node: Python 3 8 0 beta 1, Next: Python 3 8 0 alpha 4, Prev: Python 3 9 0 alpha 1, Up: Changelog + +1.21.31 Python 3.8.0 beta 1 +--------------------------- + +`Release date: 2019-06-04' + +* Menu: + +* Security: Security<19>. +* Core and Builtins: Core and Builtins<31>. +* Library: Library<30>. +* Documentation: Documentation<30>. +* Tests: Tests<29>. +* Build: Build<31>. +* Windows: Windows<28>. +* macOS: macOS<21>. +* IDLE: IDLE<21>. +* Tools/Demos: Tools/Demos<11>. +* C API: C API<28>. + + +File: python.info, Node: Security<19>, Next: Core and Builtins<31>, Up: Python 3 8 0 beta 1 + +1.21.31.1 Security +.................. + + - bpo-35907(1): CVE-2019-9948: Avoid file reading by disallowing + ‘local-file://’ and ‘local_file://’ URL schemes in + ‘URLopener().open()’ and ‘URLopener().retrieve()’ of *note + urllib.request: 12a. + + - bpo-33529(2): Prevent fold function used in email header encoding + from entering infinite loop when there are too many non-ASCII + characters in a header. + + - bpo-33164(3): Updated blake2 implementation which uses secure + memset implementation provided by platform. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35907 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33529 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33164 + + +File: python.info, Node: Core and Builtins<31>, Next: Library<30>, Prev: Security<19>, Up: Python 3 8 0 beta 1 + +1.21.31.2 Core and Builtins +........................... + + - bpo-35814(1): Allow unpacking in the right hand side of annotated + assignments. In particular, ‘t: Tuple[int, ...] = x, y, *z’ is now + allowed. + + - bpo-37126(2): All structseq objects are now tracked by the garbage + collector. Patch by Pablo Galindo. + + - bpo-37122(3): 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. + + - bpo-20092(4): Constructors of *note int: 1c7, *note float: 3ca. and + *note complex: 1b8. will now use the *note __index__(): 3bf. + special method, if available and the corresponding method *note + __int__(): 3be, *note __float__(): 60c. or *note __complex__(): + 1b7. is not available. + + - bpo-37087(5): Add native thread ID (TID) support to OpenBSD. + + - bpo-26219(6): Implemented per opcode cache mechanism and + ‘LOAD_GLOBAL’ instruction use it. ‘LOAD_GLOBAL’ is now about 40% + faster. Contributed by Yury Selivanov, and Inada Naoki. + + - bpo-37072(7): Fix crash in PyAST_FromNodeObject() when flags is + NULL. + + - bpo-37029(8): Freeing a great many small objects could take time + quadratic in the number of arenas, due to using linear search to + keep ‘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. + + - bpo-26423(9): Fix possible overflow in ‘wrap_lenfunc()’ when + ‘sizeof(long) < sizeof(Py_ssize_t)’ (e.g., 64-bit Windows). + + - bpo-37050(10): 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). + + - bpo-22385(11): The *note bytes.hex: 9e4, *note bytearray.hex: 9e5, + and *note memoryview.hex: 9e6. methods as well as the *note + binascii.hexlify: 1412. and ‘b2a_hex’ functions now have the + ability to include an optional separator between hex bytes. This + functionality was inspired by MicroPython’s hexlify implementation. + + - bpo-26836(12): Add *note os.memfd_create(): 652. + + - bpo-37032(13): Added new ‘replace()’ method to the code type (*note + types.CodeType: 612.). + + - bpo-37007(14): Implement *note socket.if_nameindex(): 67a, *note + socket.if_nametoindex(): 67b, and *note socket.if_indextoname(): + 67c. on Windows. + + - bpo-36829(15): *note PyErr_WriteUnraisable(): 1413. now creates a + traceback object if there is no current traceback. Moreover, call + *note PyErr_NormalizeException(): 1414. and *note + PyException_SetTraceback(): 1415. to normalize the exception value. + Ignore any error. + + - bpo-36878(16): Only accept text after ‘# type: ignore’ if the first + character is ASCII. This is to disallow things like ‘# type: + ignoreé’. + + - bpo-36878(17): Store text appearing after a ‘# type: ignore’ + comment in the AST. For example a type ignore like ‘# type: + ignore[E1000]’ will have the string ‘"[E1000]"’ stored in its AST + node. + + - bpo-2180(18): Treat line continuation at EOF as a ‘SyntaxError’ by + Anthony Sottile. + + - bpo-36907(19): Fix a crash when calling a C function with a keyword + dict (‘f(**kwargs)’) and changing the dict ‘kwargs’ while that + function is running. + + - bpo-36946(20): Fix possible signed integer overflow when handling + slices. + + - bpo-36826(21): Add NamedExpression kind support to ast_unparse.c + + - bpo-1875(22): A *note SyntaxError: 2d6. 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. + + - bpo-36027(23): Allow computation of modular inverses via + three-argument ‘pow’: the second argument is now permitted to be + negative in the case where the first and third arguments are + relatively prime. + + - bpo-36861(24): Update the Unicode database to version 12.1.0. + + - bpo-28866(25): Avoid caching attributes of classes which type + defines mro() to avoid a hard cache invalidation problem. + + - bpo-36851(26): The ‘FrameType’ stack is now correctly cleaned up if + the execution ends with a return and the stack is not empty. + + - bpo-34616(27): The ‘compile()’ builtin functions now support the + ‘ast.PyCF_ALLOW_TOP_LEVEL_AWAIT’ flag, which allow to compile + sources that contains top-level ‘await’, ‘async with’ or ‘async + for’. This is useful to evaluate async-code from with an already + async functions; for example in a custom REPL. + + - bpo-36842(28): Implement PEP 578, adding sys.audit, io.open_code + and related APIs. + + - bpo-27639(29): Correct return type for UserList slicing operations. + Patch by Michael Blahay, Erick Cervantes, and vaultah + + - bpo-36737(30): Move PyRuntimeState.warnings into per-interpreter + state (via “module state”). + + - bpo-36793(31): Removed ‘__str__’ implementations from builtin types + *note bool: 463, *note int: 1c7, *note float: 3ca, *note complex: + 1b8. and few classes from the standard library. They now inherit + ‘__str__()’ from *note object: 6df. + + - bpo-36817(32): Add a ‘=’ feature f-strings for debugging. This can + precede ‘!s’, ‘!r’, or ‘!a’. It produces the text of the + expression, followed by an equal sign, followed by the repr of the + value of the expression. So ‘f'{3*9+15=}'’ would be equal to the + string ‘'3*9+15=42'’. If ‘=’ is specified, the default conversion + is set to ‘!r’, unless a format spec is given, in which case the + formatting behavior is unchanged, and __format__ will be used. + + - bpo-24048(33): Save the live exception during import.c’s + ‘remove_module()’. + + - bpo-27987(34): 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. + + - bpo-36601(35): A long-since-meaningless check for ‘getpid() == + main_pid’ was removed from Python’s internal C signal handler. + + - bpo-36594(36): Fix incorrect use of ‘%p’ in format strings. Patch + by Zackery Spytz. + + - bpo-36045(37): builtins.help() now prefixes ‘async’ for async + functions + + - bpo-36084(38): Add native thread ID (TID) to threading.Thread + objects (supported platforms: Windows, FreeBSD, Linux, macOS) + + - bpo-36035(39): Added fix for broken symlinks in combination with + pathlib + + - bpo-35983(40): Added new trashcan macros to deal with a double + deallocation that could occur when the ‘tp_dealloc’ of a subclass + calls the ‘tp_dealloc’ of a base class and that base class uses the + trashcan mechanism. Patch by Jeroen Demeyer. + + - bpo-20602(41): Do not clear *note sys.flags: 25d. and *note + sys.float_info: 1416. during shutdown. Patch by Zackery Spytz. + + - bpo-26826(42): Expose ‘copy_file_range()’ as a low level API in the + *note os: c2. module. + + - bpo-32388(43): Remove cross-version binary compatibility + requirement in tp_flags. + + - bpo-31862(44): Port binascii to PEP 489 multiphase initialization. + Patch by Marcel Plch. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35814 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37126 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37122 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20092 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=37087 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=26219 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=37072 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=37029 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26423 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37050 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=22385 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26836 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=37032 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=37007 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36829 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=36878 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=36878 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=2180 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=36907 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=36946 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=36826 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=1875 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=36027 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=36861 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=28866 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=36851 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=34616 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=36842 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=27639 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=36737 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=36793 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=36817 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=24048 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=27987 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=36601 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=36594 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=36045 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=36084 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=36035 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=35983 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=20602 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=26826 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=32388 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=31862 + + +File: python.info, Node: Library<30>, Next: Documentation<30>, Prev: Core and Builtins<31>, Up: Python 3 8 0 beta 1 + +1.21.31.3 Library +................. + + - bpo-37128(1): Added *note math.perm(): 29a. + + - bpo-37120(2): Add SSLContext.num_tickets to control the number of + TLSv1.3 session tickets. + + - bpo-12202(3): Fix the error handling in *note + msilib.SummaryInformation.GetProperty(): 1418. Patch by Zackery + Spytz. + + - bpo-26835(4): The fcntl module now contains file sealing constants + for sealing of memfds. + + - bpo-29262(5): Add ‘get_origin()’ and ‘get_args()’ introspection + helpers to ‘typing’ module. + + - bpo-12639(6): *note msilib.Directory.start_component(): 1419. no + longer fails if `keyfile' is not ‘None’. + + - bpo-36999(7): Add the ‘asyncio.Task.get_coro()’ method to publicly + expose the tasks’s coroutine object. + + - bpo-35246(8): Make *note asyncio.create_subprocess_exec(): 6c9. + accept path-like arguments. + + - bpo-35279(9): Change default `max_workers' of ‘ThreadPoolExecutor’ + from ‘cpu_count() * 5’ to ‘min(32, cpu_count() + 4)’. Previous + value was unreasonably large on many cores machines. + + - bpo-37076(10): *note _thread.start_new_thread(): 141a. now logs + uncaught exception raised by the function using *note + sys.unraisablehook(): 24e, rather than *note sys.excepthook(): 3fe, + so the hook gets access to the function which raised the exception. + + - bpo-33725(11): On macOS, the *note multiprocessing: b5. module now + uses `spawn' start method by default. + + - bpo-37054(12): Fix destructor ‘_pyio.BytesIO’ and + ‘_pyio.TextIOWrapper’: initialize their ‘_buffer’ attribute as soon + as possible (in the class body), because it’s used by ‘__del__()’ + which calls ‘close()’. + + - bpo-37058(13): PEP 544: Add ‘Protocol’ and ‘@runtime_checkable’ to + the ‘typing’ module. + + - bpo-36933(14): The functions ‘sys.set_coroutine_wrapper’ and + ‘sys.get_coroutine_wrapper’ that were deprecated and marked for + removal in 3.8 have been removed. + + - bpo-37047(15): Handle late binding and attribute access in *note + unittest.mock.AsyncMock: 69a. setup for autospeccing. Document + newly implemented async methods in *note unittest.mock.MagicMock: + b1d. + + - bpo-37049(16): PEP 589: Add ‘TypedDict’ to the ‘typing’ module. + + - bpo-37046(17): PEP 586: Add ‘Literal’ to the ‘typing’ module. + + - bpo-37045(18): PEP 591: Add ‘Final’ qualifier and ‘@final’ + decorator to the ‘typing’ module. + + - bpo-37035(19): 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. + + - bpo-37001(20): *note symtable.symtable(): 141b. now accepts the + same input types for source code as the built-in *note compile(): + 310. function. Patch by Dino Viehland. + + - bpo-37028(21): Implement asyncio REPL + + - bpo-37027(22): Return safe to use proxy socket object from + transport.get_extra_info(‘socket’) + + - bpo-32528(23): 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. + + - bpo-1230540(24): Add a new *note threading.excepthook(): 442. + function which handles uncaught *note threading.Thread.run(): 68a. + exception. It can be overridden to control how uncaught *note + threading.Thread.run(): 68a. exceptions are handled. + + - bpo-36996(25): Handle *note unittest.mock.patch(): b1e. used as a + decorator on async functions. + + - bpo-37008(26): Add support for calling *note next(): 3c7. with the + mock resulting from *note unittest.mock.mock_open(): 141c. + + - bpo-27737(27): Allow whitespace only header encoding in + ‘email.header’ - by Batuhan Taskaya + + - bpo-36969(28): PDB command ‘args’ now display positional only + arguments. Patch contributed by Rémi Lapeyre. + + - bpo-36969(29): PDB command ‘args’ now display keyword only + arguments. Patch contributed by Rémi Lapeyre. + + - bpo-36983(30): Add missing names to ‘typing.__all__’: ‘ChainMap’, + ‘ForwardRef’, ‘OrderedDict’ - by Anthony Sottile. + + - bpo-36972(31): Add SupportsIndex protocol to the typing module to + allow type checking to detect classes that can be passed to *note + hex(): f78, *note oct(): f77. and *note bin(): f57. + + - bpo-32972(32): Implement ‘unittest.IsolatedAsyncioTestCase’ to help + testing asyncio-based code. + + - bpo-36952(33): *note fileinput.input(): 3f0. and *note + fileinput.FileInput: 300. `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. + + - bpo-36952(34): Starting with Python 3.3, importing ABCs from *note + collections: 1c. is deprecated, and import should be done from + *note collections.abc: 1d. Still being able to import from *note + collections: 1c. was marked for removal in 3.8, but has been + delayed to 3.9; documentation and ‘DeprecationWarning’ clarified. + + - bpo-36949(35): Implement __repr__ for WeakSet objects. + + - bpo-36948(36): Fix *note NameError: 396. in *note + urllib.request.URLopener.retrieve(): 141d. Patch by Karthikeyan + Singaravelan. + + - bpo-33524(37): 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). + + - bpo-24564(38): *note shutil.copystat(): ddb. now ignores *note + errno.EINVAL: 141e. on *note os.setxattr(): db2. which may occur + when copying files on filesystems without extended attributes + support. + + Original patch by Giampaolo Rodola, updated by Ying Wang. + + - bpo-36888(39): Python child processes can now access the status of + their parent process using multiprocessing.process.parent_process + + - bpo-36921(40): Deprecate ‘@coroutine’ for sake of ‘async def’. + + - bpo-25652(41): Fix bug in ‘__rmod__’ of ‘UserString’ - by Batuhan + Taskaya. + + - bpo-36916(42): Remove a message about an unhandled exception in a + task when writer.write() is used without await and writer.drain() + fails with an exception. + + - bpo-36889(43): Introduce ‘asyncio.Stream’ class that merges *note + asyncio.StreamReader: 47c. and *note asyncio.StreamWriter: 141f. + functionality. ‘asyncio.Stream’ can work in readonly, writeonly + and readwrite modes. Provide ‘asyncio.connect()’, + ‘asyncio.connect_unix()’, ‘asyncio.connect_read_pipe()’ and + ‘asyncio.connect_write_pipe()’ factories to open ‘asyncio.Stream’ + connections. Provide ‘asyncio.StreamServer’ and ‘UnixStreamServer’ + to serve servers with asyncio.Stream API. Modify *note + asyncio.create_subprocess_shell(): 6ca. and *note + asyncio.create_subprocess_exec(): 6c9. to use ‘asyncio.Stream’ + instead of deprecated ‘StreamReader’ and ‘StreamWriter’. Deprecate + *note asyncio.StreamReader: 47c. and *note asyncio.StreamWriter: + 141f. Deprecate usage of private classes, e.g. + ‘asyncio.FlowControlMixing’ and ‘asyncio.StreamReaderProtocol’ + outside of asyncio package. + + - bpo-36845(44): Added validation of integer prefixes to the + construction of IP networks and interfaces in the ipaddress module. + + - bpo-23378(45): Add an extend action to argparser. + + - bpo-36867(46): Fix a bug making a SharedMemoryManager instance and + its parent process use two separate resource_tracker processes. + + - bpo-23896(47): Adds a grammar to lib2to3.pygram that contains exec + as a function not as statement. + + - bpo-36895(48): The function ‘time.clock()’ was deprecated in 3.3 in + favor of ‘time.perf_counter()’ and marked for removal in 3.8, it + has removed. + + - bpo-35545(49): Fix asyncio discarding IPv6 scopes when ensuring + hostname resolutions internally + + - bpo-36887(50): Add new function *note math.isqrt(): 64b. to compute + integer square roots. + + - bpo-34632(51): Introduce the ‘importlib.metadata’ module with + (provisional) support for reading metadata from third-party + packages. + + - bpo-36878(52): When using ‘type_comments=True’ in *note ast.parse: + 619, treat ‘# 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 ‘# type: ignore[E1000]’. + + - bpo-36778(53): ‘cp65001’ encoding (Windows code page 65001) becomes + an alias to ‘utf_8’ encoding. + + - bpo-36867(54): The multiprocessing.resource_tracker replaces the + multiprocessing.semaphore_tracker module. Other than semaphores, + resource_tracker also tracks shared_memory segments. + + - bpo-30262(55): The ‘Cache’ and ‘Statement’ objects of the *note + sqlite3: ef. module are not exposed to the user. Patch by Aviv + Palivoda. + + - bpo-24538(56): In *note shutil.copystat(): ddb, first copy extended + file attributes and then file permissions, since extended + attributes can only be set on the destination while it is still + writeable. + + - bpo-36829(57): Add new *note sys.unraisablehook(): 24e. 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 (*note + gc.collect(): 687.). + + - bpo-36832(58): Introducing ‘zipfile.Path’, a pathlib-compatible + wrapper for traversing zip files. + + - bpo-36814(59): Fix an issue where os.posix_spawnp() would + incorrectly raise a TypeError when file_actions is None. + + - bpo-33110(60): Handle exceptions raised by functions added by + concurrent.futures add_done_callback correctly when the Future has + already completed. + + - bpo-26903(61): Limit ‘max_workers’ in ‘ProcessPoolExecutor’ to 61 + to work around a WaitForMultipleObjects limitation. + + - bpo-36813(62): Fix *note QueueListener: ab0. to call + ‘queue.task_done()’ upon stopping. Patch by Bar Harel. + + - bpo-36806(63): Forbid creation of asyncio stream objects like + StreamReader, StreamWriter, Process, and their protocols outside of + asyncio package. + + - bpo-36802(64): Provide both sync and async calls for + StreamWriter.write() and StreamWriter.close() + + - bpo-36801(65): Properly handle SSL connection closing in asyncio + StreamWriter.drain() call. + + - bpo-36785(66): Implement PEP 574 (pickle protocol 5 with + out-of-band buffers). + + - bpo-36772(67): functools.lru_cache() can now be used as a straight + decorator in addition to its existing usage as a function that + returns a decorator. + + - bpo-6584(68): Add a *note BadGzipFile: 63c. exception to the *note + gzip: 87. module. + + - bpo-36748(69): Optimized write buffering in C implementation of + ‘TextIOWrapper’. Writing ASCII string to ‘TextIOWrapper’ with + ascii, latin1, or utf-8 encoding is about 20% faster. Patch by + Inada Naoki. + + - bpo-8138(70): Don’t mark ‘wsgiref.simple_server.SimpleServer’ as + multi-threaded since ‘wsgiref.simple_server.WSGIServer’ is + single-threaded. + + - bpo-22640(71): *note py_compile.compile(): 671. now supports silent + mode. Patch by Joannah Nanjekye + + - bpo-29183(72): Fix double exceptions in *note + wsgiref.handlers.BaseHandler: 1420. by calling its ‘close()’ method + only when no exception is raised. + + - bpo-36548(73): Improved the repr of regular expression flags. + + - bpo-36542(74): The signature of Python functions can now be + overridden by specifying the ‘__text_signature__’ attribute. + + - bpo-36533(75): 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. + + - bpo-35252(76): Throw a TypeError instead of an AssertionError when + using an invalid type annotation with singledispatch. + + - bpo-35900(77): 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 ‘__setstate__’ method. + + - bpo-35900(78): enable custom reduction callback registration for + functions and classes in _pickle.c, using the new Pickler’s + attribute ‘reducer_override’ + + - bpo-36368(79): Fix a bug crashing SharedMemoryManager instances in + interactive sessions after a ctrl-c (KeyboardInterrupt) was sent + + - bpo-31904(80): Fix mmap fail for VxWorks + + - bpo-27497(81): *note csv.DictWriter.writeheader(): eae. now returns + the return value of the underlying ‘csv.Writer.writerow()’ method. + Patch contributed by Ashish Nitin Patil. + + - bpo-36239(82): Parsing .mo files now ignores comments starting and + ending with #-#-#-#-#. + + - bpo-26707(83): 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. + + - bpo-31904(84): Add posix module support for VxWorks. + + - bpo-35125(85): Asyncio: Remove inner callback on outer cancellation + in shield + + - bpo-35721(86): Fix ‘asyncio.SelectorEventLoop.subprocess_exec()’ + leaks file descriptors if ‘Popen’ fails and called with + ‘stdin=subprocess.PIPE’. Patch by Niklas Fiekas. + + - bpo-31855(87): *note unittest.mock.mock_open(): 141c. results now + respects the argument of read([size]). Patch contributed by Rémi + Lapeyre. + + - bpo-35431(88): Implement *note math.comb(): 299. 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. + + - bpo-26660(89): Fixed permission errors in *note TemporaryDirectory: + ef1. clean up. Previously ‘TemporaryDirectory.cleanup()’ failed + when non-writeable or non-searchable files or directories were + created inside a temporary directory. + + - bpo-34271(90): 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. + + - bpo-26467(91): Added AsyncMock to support using unittest to mock + asyncio coroutines. Patch by Lisa Roach. + + - bpo-33569(92): dataclasses.InitVar: Exposes the type used to create + the init var. + + - bpo-34424(93): Fix serialization of messages containing encoded + strings when the policy.linesep is set to a multi-character string. + Patch by Jens Troeger. + + - bpo-34303(94): Performance of *note functools.reduce(): f80. is + slightly improved. Patch by Sergey Fedoseev. + + - bpo-33361(95): Fix a bug in *note codecs.StreamRecoder: 1421. where + seeking might leave old data in a buffer and break subsequent read + calls. Patch by Ammar Askar. + + - bpo-22454(96): The *note shlex: e5. module now exposes *note + shlex.join(): 673, the inverse of *note shlex.split(): 594. Patch + by Bo Bayles. + + - bpo-31922(97): + ‘asyncio.AbstractEventLoop.create_datagram_endpoint()’: Do not + connect UDP socket when broadcast is allowed. This allows to + receive replies after a UDP broadcast. + + - bpo-24882(98): Change ThreadPoolExecutor to use existing idle + threads before spinning up new ones. + + - bpo-31961(99): Added support for bytes and path-like objects in + *note subprocess.Popen(): 6e8. on Windows. The `args' parameter + now accepts a *note path-like object: 773. if `shell' is ‘False’ + and a sequence containing bytes and path-like objects. The + `executable' parameter now accepts a bytes and *note path-like + object: 773. The `cwd' parameter now accepts a bytes object. + Based on patch by Anders Lorentsen. + + - bpo-33123(100): *note pathlib.Path.unlink: 1422. now accepts a + `missing_ok' parameter to avoid a *note FileNotFoundError: b53. + from being raised. Patch by Robert Buchholz. + + - bpo-32941(101): Allow *note mmap.mmap: 64e. objects to access the + madvise() system call (through *note mmap.mmap.madvise(): 64f.). + + - bpo-22102(102): 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. + + - bpo-32515(103): trace.py can now run modules via python3 -m trace + -t –module module_name + + - bpo-32299(104): Changed *note unittest.mock.patch.dict(): 1423. to + return the patched dictionary when used as context manager. Patch + by Vadim Tsander. + + - bpo-27141(105): Added a ‘__copy__()’ to ‘collections.UserList’ and + ‘collections.UserDict’ in order to correctly implement shallow + copying of the objects. Patch by Bar Harel. + + - bpo-31829(106): ‘\r’, ‘\0’ and ‘\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. + + - bpo-23395(107): ‘_thread.interrupt_main()’ now avoids setting the + Python error status if the ‘SIGINT’ signal is ignored or not + handled by Python. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37128 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37120 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=12202 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26835 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29262 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=12639 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36999 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35246 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35279 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=37076 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33725 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=37054 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=37058 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=36933 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=37047 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=37049 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=37046 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=37045 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=37035 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=37001 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=37028 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=37027 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32528 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=1230540 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=36996 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=37008 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=27737 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=36969 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=36969 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=36983 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=36972 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=32972 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=36952 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=36952 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=36949 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=36948 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=33524 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=24564 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=36888 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=36921 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=25652 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=36916 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=36889 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=36845 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=23378 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=36867 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=23896 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=36895 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=35545 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=36887 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=34632 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=36878 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=36778 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=36867 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=30262 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=24538 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=36829 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=36832 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=36814 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=33110 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=26903 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=36813 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=36806 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=36802 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=36801 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=36785 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=36772 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=6584 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=36748 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=8138 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=22640 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=29183 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=36548 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=36542 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=36533 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=35252 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=35900 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=35900 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=36368 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=27497 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=36239 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=26707 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=35125 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=35721 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=31855 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=35431 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=26660 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=34271 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=26467 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=33569 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=34424 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=34303 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=33361 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=22454 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=31922 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=24882 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=31961 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=33123 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=32941 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=22102 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=32515 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=32299 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=27141 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=31829 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=23395 + + +File: python.info, Node: Documentation<30>, Next: Tests<29>, Prev: Library<30>, Up: Python 3 8 0 beta 1 + +1.21.31.4 Documentation +....................... + + - bpo-36896(1): Clarify that some types have unstable constructor + signature between Python versions. + + - bpo-36686(2): Improve documentation of the stdin, stdout, and + stderr arguments of the ‘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. + + - bpo-36984(3): Improve version added references in ‘typing’ module - + by Anthony Sottile. + + - bpo-36868(4): What’s new now mentions + SSLContext.hostname_checks_common_name instead of + SSLContext.host_flags. + + - bpo-35924(5): Add a note to the ‘curses.addstr()’ documentation to + warn that multiline strings can cause segfaults because of an + ncurses bug. + + - bpo-36783(6): Added C API Documentation for Time_FromTimeAndFold + and PyDateTime_FromDateAndTimeAndFold as per PEP 495. Patch by + Edison Abahurire. + + - bpo-36797(7): 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. + + - bpo-22865(8): Add detail to the documentation on the *note + pty.spawn: c20. function. + + - bpo-35397(9): Remove deprecation and document + urllib.parse.unwrap(). Patch contributed by Rémi Lapeyre. + + - bpo-32995(10): Added the context variable in glossary. + + - bpo-33519(11): Clarify that *note copy(): 24. is not part of the + ‘MutableSequence’ ABC. + + - bpo-33482(12): Make ‘codecs.StreamRecoder.writelines’ take a list + of bytes. + + - bpo-25735(13): Added documentation for func factorial to indicate + that returns integer values + + - bpo-20285(14): 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.) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36896 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36686 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36984 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36868 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35924 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36783 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36797 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22865 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35397 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32995 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33519 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=33482 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25735 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=20285 + + +File: python.info, Node: Tests<29>, Next: Build<31>, Prev: Documentation<30>, Up: Python 3 8 0 beta 1 + +1.21.31.5 Tests +............... + + - bpo-37069(1): Modify test_coroutines, test_cprofile, + test_generators, test_raise, test_ssl and test_yield_from to use + *note test.support.catch_unraisable_exception(): 1401. rather than + *note test.support.captured_stderr(): 1426. + + - bpo-37098(2): Fix test_memfd_create on older Linux Kernels. + + - bpo-37081(3): Test with OpenSSL 1.1.1c + + - bpo-36829(4): Add *note test.support.catch_unraisable_exception(): + 1401.: context manager catching unraisable exception using *note + sys.unraisablehook(): 24e. + + - bpo-36915(5): 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). + + - bpo-36719(6): “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. + + - bpo-36816(7): Update Lib/test/selfsigned_pythontestdotnet.pem to + match self-signed.pythontest.net’s new TLS certificate. + + - bpo-35925(8): 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. + + - bpo-36782(9): Add tests for several C API functions in the *note + datetime: 2f. module. Patch by Edison Abahurire. + + - bpo-36342(10): Fix test_multiprocessing in test_venv if platform + lacks functioning sem_open. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37069 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=37098 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37081 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36829 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36915 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36719 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36816 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35925 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36782 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36342 + + +File: python.info, Node: Build<31>, Next: Windows<28>, Prev: Tests<29>, Up: Python 3 8 0 beta 1 + +1.21.31.6 Build +............... + + - bpo-36721(1): To embed Python into an application, a new ‘--embed’ + option must be passed to ‘python3-config --libs --embed’ to get + ‘-lpython3.8’ (link the application to libpython). To support both + 3.8 and older, try ‘python3-config --libs --embed’ first and + fallback to ‘python3-config --libs’ (without ‘--embed’) if the + previous command fails. + + Add a pkg-config ‘python-3.8-embed’ module to embed Python into an + application: ‘pkg-config python-3.8-embed --libs’ includes + ‘-lpython3.8’. To support both 3.8 and older, try ‘pkg-config + python-X.Y-embed --libs’ first and fallback to ‘pkg-config + python-X.Y --libs’ (without ‘--embed’) if the previous command + fails (replace ‘X.Y’ with the Python version). + + On the other hand, ‘pkg-config python3.8 --libs’ no longer contains + ‘-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. + + - bpo-36786(2): “make install” now runs compileall in parallel. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36721 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36786 + + +File: python.info, Node: Windows<28>, Next: macOS<21>, Prev: Build<31>, Up: Python 3 8 0 beta 1 + +1.21.31.7 Windows +................. + + - bpo-36965(1): include of STATUS_CONTROL_C_EXIT without depending on + MSC compiler + + - bpo-35926(2): Update to OpenSSL 1.1.1b for Windows. + + - bpo-29883(3): Add Windows support for UDP transports for the + Proactor Event Loop. Patch by Adam Meily. + + - bpo-33407(4): The *note Py_DEPRECATED(): 700. macro has been + implemented for MSVC. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36965 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35926 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29883 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33407 + + +File: python.info, Node: macOS<21>, Next: IDLE<21>, Prev: Windows<28>, Up: Python 3 8 0 beta 1 + +1.21.31.8 macOS +............... + + - bpo-36231(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36231 + + +File: python.info, Node: IDLE<21>, Next: Tools/Demos<11>, Prev: macOS<21>, Up: Python 3 8 0 beta 1 + +1.21.31.9 IDLE +.............. + + - bpo-35610(1): Replace now redundant .context_use_ps1 with + .prompt_last_line. This finishes change started in bpo-31858(2). + + - bpo-37038(3): Make idlelib.run runnable; add test clause. + + - bpo-36958(4): Print any argument other than None or int passed to + SystemExit or sys.exit(). + + - bpo-36807(5): When saving a file, call os.fsync() so bits are + flushed to e.g. USB drive. + + - bpo-32411(6): In browser.py, remove extraneous sorting by line + number since dictionary was created in line number order. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35610 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31858 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=37038 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36958 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36807 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32411 + + +File: python.info, Node: Tools/Demos<11>, Next: C API<28>, Prev: IDLE<21>, Up: Python 3 8 0 beta 1 + +1.21.31.10 Tools/Demos +...................... + + - bpo-37053(1): Handle strings like u”bar” correctly in + Tools/parser/unparse.py. Patch by Chih-Hsuan Yen. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=37053 + + +File: python.info, Node: C API<28>, Prev: Tools/Demos<11>, Up: Python 3 8 0 beta 1 + +1.21.31.11 C API +................ + + - bpo-36763(1): Implement the PEP 587(2) “Python Initialization + Configuration”. + + - bpo-36379(3): Fix crashes when attempting to use the `modulo' + parameter when ‘__ipow__’ is implemented in C. + + - bpo-37107(4): Update *note PyObject_CallMethodObjArgs(): 142d. and + ‘_PyObject_CallMethodIdObjArgs’ to use ‘_PyObject_GetMethod’ to + avoid creating a bound method object in many cases. Patch by + Michael J. Sullivan. + + - bpo-36974(5): Implement PEP 590(6): Vectorcall: a fast calling + protocol for CPython. This is a new protocol to optimize calls of + custom callable objects. + + - bpo-36763(7): ‘Py_Main()’ now returns the exitcode rather than + calling ‘Py_Exit(exitcode)’ when calling ‘PyErr_Print()’ if the + current exception type is ‘SystemExit’. + + - bpo-36922(8): Add new type flag ‘Py_TPFLAGS_METHOD_DESCRIPTOR’ for + objects behaving like unbound methods. These are objects + supporting the optimization given by the + ‘LOAD_METHOD’/‘CALL_METHOD’ opcodes. See PEP 590. + + - bpo-36728(9): The ‘PyEval_ReInitThreads()’ function has been + removed from the C API. It should not be called explicitly: use + *note PyOS_AfterFork_Child(): 6fc. instead. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36763 + + (2) https://peps.python.org/pep-0587/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36379 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=37107 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36974 + + (6) https://peps.python.org/pep-0590/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36763 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36922 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36728 + + +File: python.info, Node: Python 3 8 0 alpha 4, Next: Python 3 8 0 alpha 3, Prev: Python 3 8 0 beta 1, Up: Changelog + +1.21.32 Python 3.8.0 alpha 4 +---------------------------- + +`Release date: 2019-05-06' + +* Menu: + +* Security: Security<20>. +* Core and Builtins: Core and Builtins<32>. +* Library: Library<31>. +* Documentation: Documentation<31>. +* Tests: Tests<30>. +* Build: Build<32>. +* Windows: Windows<29>. +* macOS: macOS<22>. +* IDLE: IDLE<22>. +* Tools/Demos: Tools/Demos<12>. +* C API: C API<29>. + + +File: python.info, Node: Security<20>, Next: Core and Builtins<32>, Up: Python 3 8 0 alpha 4 + +1.21.32.1 Security +.................. + + - bpo-36742(1): Fixes mishandling of pre-normalization characters in + urlsplit(). + + - bpo-30458(2): Address 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. + + - bpo-35755(3): *note shutil.which(): 1339. now uses + ‘os.confstr("CS_PATH")’ if available and if the ‘PATH’ environment + variable is not set. Remove also the current directory from + ‘posixpath.defpath’. On Unix, *note shutil.which(): 1339. and the + *note subprocess: f6. module no longer search the executable in the + current directory if the ‘PATH’ environment variable is not set. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36742 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30458 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35755 + + +File: python.info, Node: Core and Builtins<32>, Next: Library<31>, Prev: Security<20>, Up: Python 3 8 0 alpha 4 + +1.21.32.2 Core and Builtins +........................... + + - bpo-36722(1): In debug build, import now also looks for C + extensions compiled in release mode and for C extensions compiled + in the stable ABI. + + - bpo-32849(2): Fix Python Initialization code on FreeBSD to detect + properly when stdin file descriptor (fd 0) is invalid. + + - bpo-36623(3): Remove parser headers and related function + declarations that lack implementations after the removal of pgen. + + - bpo-20180(4): ‘dict.pop()’ is now up to 33% faster thanks to + Argument Clinic. Patch by Inada Naoki. + + - bpo-36611(5): Debug memory allocators: disable serialno field by + default from debug hooks on Python memory allocators to reduce the + memory footprint by 5%. Enable *note tracemalloc: 11e. 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 ‘PYMEM_DEBUG_SERIALNO’ defined to get back the + field. + + - bpo-36588(6): On AIX, *note sys.platform: 6e0. doesn’t contain the + major version anymore. Always return ‘'aix'’, instead of ‘'aix3'’ + .. ‘'aix7'’. Since older Python versions include the version + number, it is recommended to always use + ‘sys.platform.startswith('aix')’. Contributed by M. Felt. + + - bpo-36549(7): Change str.capitalize to use titlecase for the first + character instead of uppercase. + + - bpo-36540(8): Implement PEP 570(9) (Python positional-only + parameters). Patch by Pablo Galindo. + + - bpo-36475(10): *note PyEval_AcquireLock(): 6e1. and *note + PyEval_AcquireThread(): 6e2. now terminate the current thread if + called while the interpreter is finalizing, making them consistent + with *note PyEval_RestoreThread(): 6e3, *note + Py_END_ALLOW_THREADS(): 6e4, and *note PyGILState_Ensure(): 6e5. + + - bpo-36504(11): Fix signed integer overflow in _ctypes.c’s + ‘PyCArrayType_new()’. + + - bpo-20844(12): Fix running script with encoding cookie and LF line + ending may fail on Windows. + + - bpo-24214(13): Fixed support of the surrogatepass error handler in + the UTF-8 incremental decoder. + + - bpo-36452(14): Changing ‘dict’ keys during iteration of the dict + itself, ‘keys()’, ‘values()’, or ‘items()’ will now be detected in + certain corner cases where keys are deleted/added so that the + number of keys isn’t changed. A *note RuntimeError: 6e9. will be + raised after ‘len(dict)’ iterations. Contributed by Thomas Perl. + + - bpo-36459(15): Fix a possible double ‘PyMem_FREE()’ due to + tokenizer.c’s ‘tok_nextc()’. + + - bpo-36433(16): Fixed TypeError message in classmethoddescr_call. + + - bpo-36430(17): Fix a possible reference leak in *note + itertools.count(): f3d. + + - bpo-36440(18): Include node names in ‘ParserError’ messages, + instead of numeric IDs. Patch by A. Skrobov. + + - bpo-36143(19): Regenerate *note keyword: a4. from the Grammar and + Tokens file using pgen. Patch by Pablo Galindo. + + - bpo-18372(20): Add missing *note PyObject_GC_Track(): 113f. calls + in the *note pickle: c7. module. Patch by Zackery Spytz. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36722 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32849 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36623 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20180 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36611 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36588 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36549 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36540 + + (9) https://peps.python.org/pep-0570/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36475 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=36504 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=20844 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=24214 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=36452 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36459 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=36433 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=36430 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=36440 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=36143 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=18372 + + +File: python.info, Node: Library<31>, Next: Documentation<31>, Prev: Core and Builtins<32>, Up: Python 3 8 0 alpha 4 + +1.21.32.3 Library +................. + + - bpo-35952(1): Fix pythoninfo when the compiler is missing. + + - bpo-28238(2): The ‘.find*()’ methods of xml.etree.ElementTree can + now search for wildcards like ‘{*}tag’ and ‘{ns}*’ that match a tag + in any namespace or all tags in a namespace. Patch by Stefan + Behnel. + + - bpo-26978(3): ‘pathlib.path.link_to()’ is now implemented. It + creates a hard link pointing to a path. + + - bpo-1613500(4): *note fileinput.FileInput: 300. now uses the input + file mode to correctly set the output file mode (previously it was + hardcoded to ‘'w'’) when ‘inplace=True’ is passed to its + constructor. + + - bpo-36734(5): Fix compilation of ‘faulthandler.c’ on HP-UX. + Initialize ‘stack_t current_stack’ to zero using ‘memset()’. + + - bpo-13611(6): The xml.etree.ElementTree packages gained support for + C14N 2.0 serialisation. Patch by Stefan Behnel. + + - bpo-36669(7): Add missing matrix multiplication operator support to + weakref.proxy. + + - bpo-36676(8): 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. + + - bpo-36673(9): The TreeBuilder and XMLPullParser in + xml.etree.ElementTree gained support for parsing comments and + processing instructions. Patch by Stefan Behnel. + + - bpo-36650(10): The C version of functools.lru_cache() was treating + calls with an empty ‘**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. + + - bpo-28552(11): Fix *note distutils.sysconfig: 5e. if *note + sys.executable: 6be. is ‘None’ or an empty string: use *note + os.getcwd(): 1432. to initialize ‘project_base’. Fix also the + distutils build command: don’t use *note sys.executable: 6be. if it + is ‘None’ or an empty string. + + - bpo-35755(12): *note shutil.which(): 1339. and + ‘distutils.spawn.find_executable()’ now use ‘os.confstr("CS_PATH")’ + if available instead of *note os.defpath: 1433, if the ‘PATH’ + environment variable is not set. Moreover, don’t use + ‘os.confstr("CS_PATH")’ nor *note os.defpath: 1433. if the ‘PATH’ + environment variable is set to an empty string. + + - bpo-25430(13): improve performance of ‘IPNetwork.__contains__()’ + + - bpo-30485(14): 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. + + - bpo-36613(15): Fix *note asyncio: 9. wait() not removing callback + if exception + + - bpo-36598(16): Fix ‘isinstance’ check for Mock objects with spec + when the code is executed under tracing. Patch by Karthikeyan + Singaravelan. + + - bpo-18748(17): In development mode (*note -X: 174. ‘dev’) and in + debug build, the *note io.IOBase: 641. destructor now logs + ‘close()’ exceptions. These exceptions are silent by default in + release mode. + + - bpo-36575(18): The ‘_lsprof’ module now uses internal timer same to + ‘time.perf_counter()’ by default. ‘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 + ‘perf_counter()’ is monotonic. Patch by Inada Naoki. + + - bpo-33461(19): ‘json.loads’ now emits ‘DeprecationWarning’ when + ‘encoding’ option is specified. Patch by Matthias Bussonnier. + + - bpo-36559(20): The random module now prefers the lean internal + _sha512 module over hashlib for seed(version=2) to optimize import + time. + + - bpo-17561(21): Set backlog=None as the default for + socket.create_server. + + - bpo-34373(22): Fix *note time.mktime(): e98. error handling on AIX + for year before 1970. + + - bpo-36232(23): Improve error message when trying to open existing + DBM database that actually doesn’t exist. Patch by Marco Rougeth. + + - bpo-36546(24): Add statistics.quantiles() + + - bpo-36050(25): Optimized ‘http.client.HTTPResponse.read()’ for + large response. Patch by Inada Naoki. + + - bpo-36522(26): If `debuglevel' is set to >0 in *note http.client: + 8f, print all values for headers with multiple values for the same + header name. Patch by Matt Houglum. + + - bpo-36492(27): 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. + + - bpo-27181(28): Add statistics.geometric_mean(). + + - bpo-30427(29): ‘os.path.normcase()’ relies on ‘os.fspath()’ to + check the type of its argument. Redundant checks have been removed + from its ‘posixpath.normcase()’ and ‘ntpath.normcase()’ + implementations. Patch by Wolfgang Maier. + + - bpo-36385(30): 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. + + - bpo-36434(31): Errors during writing to a ZIP file no longer + prevent to properly close it. + + - bpo-36407(32): Fixed wrong indentation writing for CDATA section in + xml.dom.minidom. Patch by Vladimir Surjaninov. + + - bpo-36326(33): inspect.getdoc() can now find docstrings for member + objects when __slots__ is a dictionary. + + - bpo-36366(34): Calling ‘stop()’ on an unstarted or stopped *note + unittest.mock.patch(): b1e. object will now return *note None: 243. + instead of raising *note RuntimeError: 6e9, making the method + idempotent. Patch by Karthikeyan Singaravelan. + + - bpo-36348(35): The ‘imap.IMAP4.logout()’ method no longer ignores + silently arbitrary exceptions. + + - bpo-31904(36): Add time module support and fix test_time faiures + for VxWorks. + + - bpo-36227(37): Added support for keyword arguments + ‘default_namespace’ and ‘xml_declaration’ in functions + ElementTree.tostring() and ElementTree.tostringlist(). + + - bpo-36004(38): Added new alternate constructors *note + datetime.date.fromisocalendar(): 62f. and *note + datetime.datetime.fromisocalendar(): 630, which construct date + objects from ISO year, week number and weekday; these are the + inverse of each class’s ‘isocalendar’ method. Patch by Paul + Ganssle. + + - bpo-35936(39): *note modulefinder: b2. no longer depends on the + deprecated *note imp: 96. module, and the initializer for *note + modulefinder.ModuleFinder: 1434. now has immutable default + arguments. Patch by Brandt Bucher. + + - bpo-35376(40): *note modulefinder: b2. correctly handles modules + that have the same name as a bad package. Patch by Brandt Bucher. + + - bpo-17396(41): *note modulefinder: b2. no longer crashes when + encountering syntax errors in followed imports. Patch by Brandt + Bucher. + + - bpo-35934(42): Added *note create_server(): 678. and *note + has_dualstack_ipv6(): 679. 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(43).) + + - bpo-23078(44): Add support for *note classmethod(): 18d. and *note + staticmethod(): 3c8. to *note unittest.mock.create_autospec(): + 13b1. Initial patch by Felipe Ochoa. + + - bpo-35416(45): Fix potential resource warnings in distutils. Patch + by Mickaël Schoentgen. + + - bpo-25451(46): Add transparency methods to ‘tkinter.PhotoImage’. + Patch by Zackery Spytz. + + - bpo-35082(47): Don’t return deleted attributes when calling dir on + a *note unittest.mock.Mock: 69b. + + - bpo-34547(48): *note wsgiref.handlers.BaseHandler: 1420. now + handles abrupt client connection terminations gracefully. Patch by + Petter Strandmark. + + - bpo-31658(49): *note xml.sax.parse(): 1435. now supports *note + path-like: 773. Patch by Mickaël Schoentgen. + + - bpo-34139(50): Remove stale unix datagram socket before binding + + - bpo-33530(51): Implemented Happy Eyeballs in + ‘asyncio.create_connection()’. Added two new arguments, + `happy_eyeballs_delay' and `interleave', to specify Happy Eyeballs + behavior. + + - bpo-33291(52): Do not raise AttributeError when calling the inspect + functions isgeneratorfunction, iscoroutinefunction, + isasyncgenfunction on a method created from an arbitrary callable. + Instead, return False. + + - bpo-31310(53): Fix the multiprocessing.semaphore_tracker so it is + reused by child processes + + - bpo-31292(54): Fix ‘setup.py check --restructuredtext’ for files + containing ‘include’ directives. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35952 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28238 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26978 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=1613500 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36734 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=13611 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36669 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36676 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36673 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36650 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28552 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=35755 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25430 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=30485 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36613 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=36598 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=18748 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=36575 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=33461 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=36559 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=17561 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=34373 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=36232 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=36546 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=36050 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=36522 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=36492 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=27181 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30427 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=36385 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=36434 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=36407 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=36326 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=36366 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=36348 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=36227 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=36004 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=35936 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=35376 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=17396 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=35934 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=17561 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=23078 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=35416 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=25451 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=35082 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=34547 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=31658 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=34139 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=33530 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=33291 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=31310 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=31292 + + +File: python.info, Node: Documentation<31>, Next: Tests<30>, Prev: Library<31>, Up: Python 3 8 0 alpha 4 + +1.21.32.4 Documentation +....................... + + - bpo-36625(1): Remove obsolete comments from docstrings in + fractions.Fraction + + - bpo-30840(2): Document relative imports + + - bpo-36523(3): Add docstring for io.IOBase.writelines(). + + - bpo-36425(4): New documentation translation: Simplified Chinese(5). + + - bpo-36345(6): Avoid the duplication of code from + ‘Tools/scripts/serve.py’ in using the ‘literalinclude’ directive + for the basic wsgiref-based web server in the documentation of + *note wsgiref: 136. Contributed by Stéphane Wirtel. + + - bpo-36345(7): Using the code of the ‘Tools/scripts/serve.py’ script + as an example in the *note wsgiref: 136. documentation. + Contributed by Stéphane Wirtel. + + - bpo-36157(8): Added Documention for PyInterpreterState_Main(). + + - bpo-33043(9): 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. + + - bpo-35581(10): @typing.type_check_only now allows type stubs to + mark functions and classes not available during runtime. + + - bpo-33832(11): Add glossary entry for ‘magic method’. + + - bpo-32913(12): Added re.Match.groupdict example to regex HOWTO. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36625 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30840 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36523 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36425 + + (5) https://docs.python.org/zh-cn/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36345 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36345 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36157 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33043 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35581 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33832 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32913 + + +File: python.info, Node: Tests<30>, Next: Build<32>, Prev: Documentation<31>, Up: Python 3 8 0 alpha 4 + +1.21.32.5 Tests +............... + + - bpo-36719(1): regrtest now always detects uncollectable objects. + Previously, the check was only enabled by ‘--findleaks’. The check + now also works with ‘-jN/--multiprocess N’. ‘--findleaks’ becomes + a deprecated alias to ‘--fail-env-changed’. + + - bpo-36725(2): 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. + + - bpo-36454(3): 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. + + - bpo-32424(4): Improve test coverage for xml.etree.ElementTree. + Patch by Gordon P. Hemsley. + + - bpo-32424(5): Fix typo in test_cyclic_gc() test for + xml.etree.ElementTree. Patch by Gordon P. Hemsley. + + - bpo-36635(6): Add a new ‘_testinternalcapi’ module to test the + internal C API. + + - bpo-36629(7): Fix ‘test_imap4_host_default_value()’ of + ‘test_imaplib’: catch also *note errno.ENETUNREACH: 1438. error. + + - bpo-36611(8): Fix ‘test_sys.test_getallocatedblocks()’ when *note + tracemalloc: 11e. is enabled. + + - bpo-36560(9): 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. + + - bpo-36565(10): Fix reference hunting (‘python3 -m test -R 3:3’) + when Python has no built-in abc module. + + - bpo-31904(11): Port test_resource to VxWorks: skip tests cases + setting RLIMIT_FSIZE and RLIMIT_CPU. + + - bpo-31904(12): Fix test_tabnanny on VxWorks: adjust ENOENT error + message. + + - bpo-36436(13): Fix ‘_testcapi.pymem_buffer_overflow()’: handle + memory allocation failure. + + - bpo-31904(14): Fix test_utf8_mode on VxWorks: Python always use + UTF-8 on VxWorks. + + - bpo-36341(15): Fix tests that may fail with PermissionError upon + calling bind() on AF_UNIX sockets. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36719 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36725 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36454 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32424 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32424 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36635 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36629 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36611 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36560 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36565 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=36436 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36341 + + +File: python.info, Node: Build<32>, Next: Windows<29>, Prev: Tests<30>, Up: Python 3 8 0 alpha 4 + +1.21.32.6 Build +............... + + - bpo-36747(1): Remove the stale scriptsinstall Makefile target. + + - bpo-21536(2): 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, ‘libpython’ must not be loaded with + ‘RTLD_LOCAL’, but ‘RTLD_GLOBAL’ instead. Previously, using + ‘RTLD_LOCAL’, it was already not possible to load C extensions + which were not linked to ‘libpython’, such as C extensions of the + standard library built by the ‘*shared*’ section of + ‘Modules/Setup’. + + distutils, python-config and python-config.py have been modified. + + - bpo-36707(3): ‘./configure --with-pymalloc’ no longer adds the ‘m’ + flag to SOABI (sys.implementation.cache_tag). Enabling or + disabling pymalloc has no impact on the ABI. + + - bpo-36635(4): Change ‘PyAPI_FUNC(type)’, ‘PyAPI_DATA(type)’ and + ‘PyMODINIT_FUNC’ macros of ‘pyport.h’ when ‘Py_BUILD_CORE_MODULE’ + is defined. The ‘Py_BUILD_CORE_MODULE’ define must be now be used + to build a C extension as a dynamic library accessing Python + internals: export the PyInit_xxx() function in DLL exports on + Windows. + + - bpo-31904(5): Don’t build the ‘_crypt’ extension on VxWorks. + + - bpo-36618(6): Add ‘-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 ‘CFLAGS’ and not just + ‘CFLAGS_NODIST’, since third party C extensions can have the same + issue. + + - bpo-36605(7): ‘make tags’ and ‘make TAGS’ now also parse + ‘Modules/_io/*.c’ and ‘Modules/_io/*.h’. + + - bpo-36465(8): Release builds and debug builds are now ABI + compatible: defining the ‘Py_DEBUG’ macro no longer implies the + ‘Py_TRACE_REFS’ macro, which introduces the only ABI + incompatibility. The ‘Py_TRACE_REFS’ macro, which adds the + ‘sys.getobjects()’ function and the *note PYTHONDUMPREFS: 5f6. + environment variable, can be set using the new ‘./configure + --with-trace-refs’ build option. + + - bpo-36577(9): setup.py now correctly reports missing OpenSSL + headers and libraries again. + + - bpo-36544(10): Fix regression introduced in bpo-36146(11) + refactoring setup.py + + - bpo-36508(12): ‘python-config --ldflags’ no longer includes flags + of the ‘LINKFORSHARED’ variable. The ‘LINKFORSHARED’ variable must + only be used to build executables. + + - bpo-36503(13): Remove references to “aix3” and “aix4”. Patch by M. + Felt. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36747 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21536 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36707 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36635 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36618 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36605 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36465 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36577 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36544 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=36146 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36508 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=36503 + + +File: python.info, Node: Windows<29>, Next: macOS<22>, Prev: Build<32>, Up: Python 3 8 0 alpha 4 + +1.21.32.7 Windows +................. + + - bpo-35920(1): 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. + + - bpo-36649(2): Remove trailing spaces for registry keys when + installed via the Store. + + - bpo-34144(3): Fixed activate.bat to correctly update codepage when + chcp.com returns dots in output. Patch by Lorenz Mende. + + - bpo-36509(4): 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. + + - bpo-35941(5): 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. + + - bpo-36441(6): Fixes creating a venv when debug binaries are + installed. + + - bpo-36085(7): Enable better DLL resolution on Windows by using safe + DLL search paths and adding *note os.add_dll_directory(): 62d. + + - bpo-36010(8): Add the venv standard library module to the nuget + distribution for Windows. + + - bpo-29515(9): 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 + + - bpo-35947(10): Added current version of libffi to + cpython-source-deps. Change _ctypes to use current version of + libffi on Windows. + + - bpo-34060(11): Report system load when running test suite on + Windows. Patch by Ammar Askar. Based on prior work by Jeremy + Kloth. + + - bpo-31512(12): With the Windows 10 Creators Update, non-elevated + users can now create symlinks as long as the computer has Developer + Mode enabled. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35920 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36649 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=34144 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36509 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35941 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36441 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36085 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36010 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=29515 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35947 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=34060 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31512 + + +File: python.info, Node: macOS<22>, Next: IDLE<22>, Prev: Windows<29>, Up: Python 3 8 0 alpha 4 + +1.21.32.8 macOS +............... + + - bpo-34602(1): Avoid failures setting macOS stack resource limit + with resource.setrlimit. This reverts an earlier fix for + bpo-18075(2) which forced a non-default stack size when building + the interpreter executable on macOS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34602 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=18075 + + +File: python.info, Node: IDLE<22>, Next: Tools/Demos<12>, Prev: macOS<22>, Up: Python 3 8 0 alpha 4 + +1.21.32.9 IDLE +.............. + + - bpo-36429(1): Fix starting IDLE with pyshell. Add idlelib.pyshell + alias at top; remove pyshell alias at bottom. Remove obsolete + __name__==’__main__’ command. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36429 + + +File: python.info, Node: Tools/Demos<12>, Next: C API<29>, Prev: IDLE<22>, Up: Python 3 8 0 alpha 4 + +1.21.32.10 Tools/Demos +...................... + + - bpo-14546(1): Fix the argument handling in Tools/scripts/lll.py. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14546 + + +File: python.info, Node: C API<29>, Prev: Tools/Demos<12>, Up: Python 3 8 0 alpha 4 + +1.21.32.11 C API +................ + + - bpo-36763(1): Fix memory leak in *note + Py_SetStandardStreamEncoding(): 36f.: release memory if the + function is called twice. + + - bpo-36641(2): PyDoc_VAR(name) and *note PyDoc_STRVAR: 138a.(name, + str) now create ‘static const char name[]’ instead of ‘static char + name[]’. Patch by Inada Naoki. + + - bpo-36389(3): Change the value of ‘CLEANBYTE’, ‘DEADDYTE’ and + ‘FORBIDDENBYTE’ internal constants used by debug hooks on Python + memory allocators (*note PyMem_SetupDebugHooks(): 8da. function). + Byte patterns ‘0xCB’, ‘0xDB’ and ‘0xFB’ have been replaced with + ‘0xCD’, ‘0xDD’ and ‘0xFD’ to use the same values than Windows CRT + debug ‘malloc()’ and ‘free()’. + + - bpo-36443(4): Since Python 3.7.0, calling *note Py_DecodeLocale(): + 82d. before *note Py_Initialize(): 4e7. produces mojibake if the + ‘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 ‘_Py_PreInitialize()’ + API with ‘_PyPreConfig’. + + - bpo-36025(5): Fixed an accidental change to the datetime C API + where the arguments to the *note PyDate_FromTimestamp(): 143f. + function were incorrectly interpreted as a single timestamp rather + than an arguments tuple, which causes existing code to start + raising *note TypeError: 19c. The backwards-incompatible change + was only present in alpha releases of Python 3.8. Patch by Paul + Ganssle. + + - bpo-35810(6): Modify ‘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 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36763 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36641 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36389 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36443 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36025 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35810 + + +File: python.info, Node: Python 3 8 0 alpha 3, Next: Python 3 8 0 alpha 2, Prev: Python 3 8 0 alpha 4, Up: Changelog + +1.21.33 Python 3.8.0 alpha 3 +---------------------------- + +`Release date: 2019-03-25' + +* Menu: + +* Security: Security<21>. +* Core and Builtins: Core and Builtins<33>. +* Library: Library<32>. +* Documentation: Documentation<32>. +* Tests: Tests<31>. +* Build: Build<33>. +* Windows: Windows<30>. +* IDLE: IDLE<23>. +* Tools/Demos: Tools/Demos<13>. +* C API: C API<30>. + + +File: python.info, Node: Security<21>, Next: Core and Builtins<33>, Up: Python 3 8 0 alpha 3 + +1.21.33.1 Security +.................. + + - bpo-36216(1): 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. + + - bpo-35121(2): 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 *note + http.cookiejar.DefaultCookiePolicy: 1442. policy. Patch by + Karthikeyan Singaravelan. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36216 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35121 + + +File: python.info, Node: Core and Builtins<33>, Next: Library<32>, Prev: Security<21>, Up: Python 3 8 0 alpha 3 + +1.21.33.2 Core and Builtins +........................... + + - bpo-36421(1): Fix a possible double decref in _ctypes.c’s + ‘PyCArrayType_new()’. + + - bpo-36412(2): Fix a possible crash when creating a new dictionary. + + - bpo-36398(3): Fix a possible crash in ‘structseq_repr()’. + + - bpo-36256(4): 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. + + - bpo-36365(5): repr(structseq) is no longer limited to 512 bytes. + + - bpo-36374(6): Fix a possible null pointer dereference in + ‘merge_consts_recursive()’. Patch by Zackery Spytz. + + - bpo-36236(7): At Python initialization, the current directory is no + longer prepended to *note sys.path: 162. if it has been removed. + + - bpo-36352(8): Python initialization now fails with an error, rather + than silently truncating paths, if a path is too long. + + - bpo-36301(9): Python initialization now fails if decoding + ‘pybuilddir.txt’ configuration file fails at startup. + + - bpo-36333(10): Fix leak in _PyRuntimeState_Fini. Contributed by + Stéphane Wirtel. + + - bpo-36332(11): The builtin *note compile(): 310. can now handle AST + objects that contain assignment expressions. Patch by Pablo + Galindo. + + - bpo-36282(12): Improved error message for too much positional + arguments in some builtin functions. + + - bpo-30040(13): New empty dict uses fewer memory for now. It used + more memory than empty dict created by ‘dict.clear()’. And empty + dict creation and deletion is about 2x faster. Patch by Inada + Naoki. + + - bpo-36262(14): Fix an unlikely memory leak on conversion from + string to float in the function ‘_Py_dg_strtod()’ used by + ‘float(str)’, ‘complex(str)’, *note pickle.load(): 981, *note + marshal.load(): 1444, etc. + + - bpo-36252(15): Update Unicode databases to version 12.0.0. + + - bpo-36218(16): Fix a segfault occurring when sorting a list of + heterogeneous values. Patch contributed by Rémi Lapeyre and Elliot + Gorokhovsky. + + - bpo-36188(17): Cleaned up left-over vestiges of Python 2 unbound + method handling in method objects and documentation. Patch by + Martijn Pieters + + - bpo-36124(18): 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. + + - bpo-35975(19): Add a ‘feature_version’ flag to ‘ast.parse()’ + (documented) and ‘compile()’ (hidden) that allows tweaking the + parser to support older versions of the grammar. In particular, if + ‘feature_version’ is 5 or 6, the hacks for the ‘async’ and ‘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 ‘NAME’ tokens that the parser driver + recognizes.) + + - bpo-31904(20): Use UTF-8 as the system encoding on VxWorks. + + - bpo-36048(21): The *note __index__(): 3bf. special method will be + used instead of *note __int__(): 3be. for implicit conversion of + Python numbers to C integers. Using the ‘__int__()’ method in + implicit conversions has been deprecated. + + - bpo-35808(22): Retire pgen and use a modified version of pgen2 to + generate the parser. Patch by Pablo Galindo. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36421 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36412 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36398 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36256 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36365 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36374 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36236 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36352 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36301 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=36333 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=36332 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36282 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=30040 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=36262 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36252 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=36218 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=36188 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=36124 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=35975 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=36048 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=35808 + + +File: python.info, Node: Library<32>, Next: Documentation<32>, Prev: Core and Builtins<33>, Up: Python 3 8 0 alpha 3 + +1.21.33.3 Library +................. + + - bpo-36401(1): The class documentation created by pydoc now has a + separate section for readonly properties. + + - bpo-36320(2): 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. + + - bpo-34745(3): Fix *note asyncio: 9. ssl memory issues caused by + circular references + + - bpo-36324(4): Add method to statistics.NormalDist for computing the + inverse cumulative normal distribution. + + - bpo-36321(5): 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. + + - bpo-36297(6): “unicode_internal” codec is removed. It was + deprecated since Python 3.3. Patch by Inada Naoki. + + - bpo-36298(7): Raise ModuleNotFoundError in pyclbr when a module + can’t be found. Thanks to ‘mental’ for the bug report. + + - bpo-36268(8): Switch the default format used for writing tars with + mod:*note tarfile: fd. to the modern POSIX.1-2001 pax standard, + from the vendor-specific GNU. Contributed by C.A.M. Gerlach. + + - bpo-36285(9): Fix integer overflows in the array module. Patch by + Stephan Hohe. + + - bpo-31904(10): Add _signal module support for VxWorks. + + - bpo-36272(11): *note logging: a8. does not silently ignore + RecursionError anymore. Patch contributed by Rémi Lapeyre. + + - bpo-36280(12): 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. + + - bpo-35931(13): The *note pdb: c6. ‘debug’ command now gracefully + handles all exceptions. + + - bpo-36251(14): Fix format strings used for stderrprinter and + re.Match reprs. Patch by Stephan Hohe. + + - bpo-36235(15): Fix ‘CFLAGS’ in ‘customize_compiler()’ of + ‘distutils.sysconfig’: when the ‘CFLAGS’ environment variable is + defined, don’t override ‘CFLAGS’ variable with the ‘OPT’ variable + anymore. Initial patch written by David Malcolm. + + - bpo-35807(16): Update ensurepip to install pip 19.0.3 and + setuptools 40.8.0. + + - bpo-36139(17): Release GIL when closing *note mmap: 64e. objects. + + - bpo-36179(18): Fix two unlikely reference leaks in _hashopenssl. + The leaks only occur in out-of-memory cases. + + - bpo-36169(19): Add overlap() method to statistics.NormalDist. + Computes the overlapping coefficient for two normal distributions. + + - bpo-36103(20): Default buffer size used by ‘shutil.copyfileobj()’ + is changed from 16 KiB to 64 KiB on non-Windows platform to reduce + system call overhead. Contributed by Inada Naoki. + + - bpo-36130(21): Fix ‘pdb’ with ‘skip=...’ when stepping into a frame + without a ‘__name__’ global. Patch by Anthony Sottile. + + - bpo-35652(22): shutil.copytree(copy_function=…) erroneously pass + DirEntry instead of a path string. + + - bpo-35178(23): Ensure custom *note warnings.formatwarning(): 1446. + function can receive ‘line’ as positional argument. Based on patch + by Tashrif Billah. + + - bpo-36106(24): Resolve potential name clash with libm’s sinpi(). + Patch by Dmitrii Pasechnik. + + - bpo-36091(25): Clean up reference to async generator in Lib/types. + Patch by Henry Chen. + + - bpo-36043(26): ‘FileCookieJar’ supports *note path-like object: + 773. Contributed by Stéphane Wirtel + + - bpo-35899(27): 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. + + - bpo-21269(28): Add ‘args’ and ‘kwargs’ properties to mock call + objects. Contributed by Kumar Akshay. + + - bpo-30670(29): *note pprint.pp: 66f. 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 *note + pprint.pprint: 41d, *note pprint.pformat: c1e. and *note + pprint.PrettyPrinter: c1d. Contributed by Rémi Lapeyre. + + - bpo-35843(30): Implement ‘__getitem__’ for ‘_NamespacePath’. Patch + by Anthony Sottile. + + - bpo-35802(31): Clean up code which checked presence of ‘os.stat’ / + ‘os.lstat’ / ‘os.chmod’ which are always present. Patch by Anthony + Sottile. + + - bpo-35715(32): Librates the return value of a ProcessPoolExecutor + _process_worker after it’s no longer needed to free memory + + - bpo-35493(33): Use *note multiprocessing.connection.wait(): d8a. + instead of polling each 0.2 seconds for worker updates in + ‘multiprocessing.Pool’. Patch by Pablo Galindo. + + - bpo-35661(34): Store the venv prompt in pyvenv.cfg. + + - bpo-35121(35): 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. + + - bpo-21478(36): Calls to a child function created with *note + unittest.mock.create_autospec(): 13b1. should propagate to the + parent. Patch by Karthikeyan Singaravelan. + + - bpo-35198(37): Fix C++ extension compilation on AIX + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36401 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36320 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=34745 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36324 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=36321 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36297 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=36298 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36268 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=36285 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=36272 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=36280 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=35931 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=36251 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=36235 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=35807 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=36139 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=36179 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=36169 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=36103 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=36130 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=35652 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=35178 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=36106 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=36091 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=36043 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=35899 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=21269 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30670 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=35843 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=35802 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=35715 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=35493 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=35661 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=35121 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=21478 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=35198 + + +File: python.info, Node: Documentation<32>, Next: Tests<31>, Prev: Library<32>, Up: Python 3 8 0 alpha 3 + +1.21.33.4 Documentation +....................... + + - bpo-36329(1): Declare the path of the Python binary for the usage + of ‘Tools/scripts/serve.py’ when executing ‘make -C Doc/ serve’. + Contributed by Stéphane Wirtel + + - bpo-36138(2): Improve documentation about converting + datetime.timedelta to scalars. + + - bpo-21314(3): 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 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36329 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36138 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21314 + + +File: python.info, Node: Tests<31>, Next: Build<33>, Prev: Documentation<32>, Up: Python 3 8 0 alpha 3 + +1.21.33.5 Tests +............... + + - bpo-36234(1): test_posix.PosixUidGidTests: add tests for invalid + uid/gid type (str). Initial patch written by David Malcolm. + + - bpo-29571(2): Fix ‘test_re.test_locale_flag()’: use + ‘locale.getpreferredencoding()’ rather than ‘locale.getlocale()’ to + get the locale encoding. With some locales, ‘locale.getlocale()’ + returns the wrong encoding. + + - bpo-36123(3): Fix race condition in test_socket. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36234 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29571 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36123 + + +File: python.info, Node: Build<33>, Next: Windows<30>, Prev: Tests<31>, Up: Python 3 8 0 alpha 3 + +1.21.33.6 Build +............... + + - bpo-36356(1): Fix leaks that led to build failure when configured + with address sanitizer. + + - bpo-36146(2): Add ‘TEST_EXTENSIONS’ constant to ‘setup.py’ to allow + to not build test extensions like ‘_testcapi’. + + - bpo-36146(3): Fix setup.py on macOS: only add ‘/usr/include/ffi’ to + include directories of _ctypes, not for all extensions. + + - bpo-31904(4): Enable build system to cross-build for VxWorks RTOS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36356 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36146 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36146 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31904 + + +File: python.info, Node: Windows<30>, Next: IDLE<23>, Prev: Build<33>, Up: Python 3 8 0 alpha 3 + +1.21.33.7 Windows +................. + + - bpo-36312(1): Fixed decoders for the following code pages: 50220, + 50221, 50222, 50225, 50227, 50229, 57002 through 57011, 65000 and + 42. + + - bpo-36264(2): Don’t honor POSIX ‘HOME’ in ‘os.path.expanduser’ on + windows. Patch by Anthony Sottile. + + - bpo-24643(3): Fix name collisions due to ‘#define timezone + _timezone’ in PC/pyconfig.h. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36312 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36264 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24643 + + +File: python.info, Node: IDLE<23>, Next: Tools/Demos<13>, Prev: Windows<30>, Up: Python 3 8 0 alpha 3 + +1.21.33.8 IDLE +.............. + + - bpo-36405(1): Use dict unpacking in idlelib. + + - bpo-36396(2): Remove fgBg param of idlelib.config.GetHighlight(). + This param was only used twice and changed the return type. + + - bpo-36176(3): Fix IDLE autocomplete & calltip popup colors. + Prevent conflicts with Linux dark themes (and slightly darken + calltip background). + + - bpo-23205(4): For the grep module, add tests for findfiles, + refactor findfiles to be a module-level function, and refactor + findfiles to use os.walk. + + - bpo-23216(5): Add docstrings to IDLE search modules. + + - bpo-36152(6): Remove colorizer.ColorDelegator.close_when_done and + the corresponding argument of .close(). In IDLE, both have always + been None or False since 2007. + + - bpo-32129(7): Avoid blurry IDLE application icon on macOS with Tk + 8.6. Patch by Kevin Walzer. + + - bpo-36096(8): Refactor class variables to instance variables in + colorizer. + + - bpo-30348(9): Increase test coverage of idlelib.autocomplete by + 30%. Patch by Louie Lu + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36405 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36396 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36176 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23205 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23216 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=36152 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32129 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=36096 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=30348 + + +File: python.info, Node: Tools/Demos<13>, Next: C API<30>, Prev: IDLE<23>, Up: Python 3 8 0 alpha 3 + +1.21.33.9 Tools/Demos +..................... + + - bpo-35132(1): Fix py-list and py-bt commands of python-gdb.py on + gdb7. + + - bpo-32217(2): Fix freeze script on Windows. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35132 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32217 + + +File: python.info, Node: C API<30>, Prev: Tools/Demos<13>, Up: Python 3 8 0 alpha 3 + +1.21.33.10 C API +................ + + - bpo-36381(1): Raise ‘DeprecationWarning’ when ‘#’ formats are used + for building or parsing values without ‘PY_SSIZE_T_CLEAN’. + + - bpo-36142(2): The whole coreconfig.h header is now excluded from + Py_LIMITED_API. Move functions definitions into a new internal + pycore_coreconfig.h header. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36381 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36142 + + +File: python.info, Node: Python 3 8 0 alpha 2, Next: Python 3 8 0 alpha 1, Prev: Python 3 8 0 alpha 3, Up: Changelog + +1.21.34 Python 3.8.0 alpha 2 +---------------------------- + +`Release date: 2019-02-25' + +* Menu: + +* Core and Builtins: Core and Builtins<34>. +* Library: Library<33>. +* Documentation: Documentation<33>. +* Tests: Tests<32>. +* Windows: Windows<31>. +* IDLE: IDLE<24>. + + +File: python.info, Node: Core and Builtins<34>, Next: Library<33>, Up: Python 3 8 0 alpha 2 + +1.21.34.1 Core and Builtins +........................... + + - bpo-36052(1): Raise a *note SyntaxError: 2d6. when assigning a + value to *note __debug__: 3cb. with the Assignment Operator. + Contributed by Stéphane Wirtel and Pablo Galindo. + + - bpo-36012(2): Doubled the speed of class variable writes. When a + non-dunder attribute was updated, there was an unnecessary call to + update slots. + + - bpo-35942(3): The error message emitted when returning invalid + types from ‘__fspath__’ in interfaces that allow passing *note + PathLike: 8bf. objects has been improved and now it does explain + the origin of the error. + + - bpo-36016(4): ‘gc.get_objects’ can now receive an optional + parameter indicating a generation to get objects from. Patch by + Pablo Galindo. + + - bpo-1054041(5): 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. + + - bpo-35992(6): Fix ‘__class_getitem__()’ not being called on a class + with a custom non-subscriptable metaclass. + + - bpo-35993(7): Fix a crash on fork when using subinterpreters. + Contributed by Stéphane Wirtel + + - bpo-35991(8): Fix a potential double free in + Modules/_randommodule.c. + + - bpo-35961(9): Fix a crash in slice_richcompare(): use strong + references rather than stolen references for the two temporary + internal tuples. + + - bpo-35911(10): Enable the creation of cell objects by adding a + ‘cell.__new__’ method, and expose the type ‘cell’ in ‘Lib/types.py’ + under the name CellType. Patch by Pierre Glaser. + + - bpo-12822(11): Use monotonic clock for ‘pthread_cond_timedwait’ + when ‘pthread_condattr_setclock’ and ‘CLOCK_MONOTONIC’ are + available. + + - bpo-15248(12): The compiler emits now syntax warnings in the case + when a comma is likely missed before tuple or list. + + - bpo-35886(13): The implementation of PyInterpreterState has been + moved into the internal header files (guarded by Py_BUILD_CORE). + + - bpo-31506(14): Clarify the errors reported when ‘object.__new__’ + and ‘object.__init__’ receive more than one argument. Contributed + by Sanyam Khurana. + + - bpo-35724(15): Signal-handling is now guaranteed to happen relative + to the main interpreter. + + - bpo-33608(16): 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. + + - bpo-33989(17): Fix a possible crash in *note list.sort(): 834. when + sorting objects with ‘ob_type->tp_richcompare == NULL’. Patch by + Zackery Spytz. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36052 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36012 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35942 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=36016 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=1054041 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35992 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35993 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35991 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35961 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35911 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=12822 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=15248 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=35886 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31506 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=35724 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=33608 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=33989 + + +File: python.info, Node: Library<33>, Next: Documentation<33>, Prev: Core and Builtins<34>, Up: Python 3 8 0 alpha 2 + +1.21.34.2 Library +................. + + - bpo-35512(1): *note unittest.mock.patch.dict(): 1423. used as a + decorator with string target resolves the target during function + call instead of during decorator construction. Patch by + Karthikeyan Singaravelan. + + - bpo-36018(2): 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. + + - bpo-35904(3): Added statistics.fmean() as a faster, floating point + variant of the existing mean() function. + + - bpo-35918(4): Removed broken ‘has_key’ method from + multiprocessing.managers.SyncManager.dict. Contributed by Rémi + Lapeyre. + + - bpo-18283(5): Add support for bytes to *note shutil.which(): 1339. + + - bpo-35960(6): Fix *note dataclasses.field(): 1451. throwing away + empty mapping objects passed as metadata. + + - bpo-35500(7): Write expected and actual call parameters on separate + lines in *note unittest.mock.Mock.assert_called_with(): 1452. + assertion errors. Contributed by Susan Su. + + - bpo-35931(8): The *note pdb: c6. ‘debug’ command now gracefully + handles syntax errors. + + - bpo-24209(9): 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. + + - bpo-35321(10): Set ‘__spec__.origin’ of ‘_frozen_importlib’ to + frozen so that it matches the behavior of + ‘_frozen_importlib_external’. Patch by Nina Zakharenko. + + - bpo-35378(11): Fix a reference issue inside ‘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. + + - bpo-34294(12): re module, fix wrong capturing groups in rare cases. + *note re.search(): edf, *note re.findall(): cd6, *note re.sub(): + 85d. and other functions that scan through string looking for a + match, should reset capturing groups between two match attempts. + Patch by Ma Lin. + + - bpo-35615(13): *note weakref: 132.: Fix a RuntimeError when copying + a WeakKeyDictionary or a WeakValueDictionary, due to some keys or + values disappearing while iterating. + + - bpo-35606(14): Implement *note math.prod(): 64a. as analogous + function to *note sum(): 296. that returns the product of a ‘start’ + value (default: 1) times an iterable of numbers. Patch by Pablo + Galindo. + + - bpo-32417(15): Performing arithmetic between *note + datetime.datetime: 4be. subclasses and *note datetime.timedelta: + 60f. now returns an object of the same type as the *note + datetime.datetime: 4be. subclass. As a result, *note + datetime.datetime.astimezone(): 610. and alternate constructors + like *note datetime.datetime.now(): 1453. and + ‘datetime.fromtimestamp()’ called with a ‘tz’ argument now `also' + retain their subclass. + + - bpo-35153(16): Add `headers' optional keyword-only parameter to + *note xmlrpc.client.ServerProxy: 6a6, ‘xmlrpc.client.Transport’ and + ‘xmlrpc.client.SafeTransport’. Patch by Cédric Krier. + + - bpo-34572(17): Fix C implementation of pickle.loads to use + importlib’s locking mechanisms, and thereby avoid using partially + loaded modules. Patch by Tim Burgess. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35512 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36018 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35904 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35918 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=18283 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35960 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35500 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35931 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24209 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35321 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35378 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=34294 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=35615 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=35606 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=32417 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=35153 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=34572 + + +File: python.info, Node: Documentation<33>, Next: Tests<32>, Prev: Library<33>, Up: Python 3 8 0 alpha 2 + +1.21.34.3 Documentation +....................... + + - bpo-36083(1): Fix formatting of –check-hash-based-pycs options in + the manpage Synopsis. + + - bpo-36007(2): Bump minimum sphinx version to 1.8. Patch by Anthony + Sottile. + + - bpo-22062(3): Update documentation and docstrings for pathlib. + Original patch by Mike Short. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=36083 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36007 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22062 + + +File: python.info, Node: Tests<32>, Next: Windows<31>, Prev: Documentation<33>, Up: Python 3 8 0 alpha 2 + +1.21.34.4 Tests +............... + + - bpo-27313(1): Avoid test_ttk_guionly ComboboxTest failure with + macOS Cocoa Tk. + + - bpo-36019(2): Add test.support.TEST_HTTP_URL and replace references + of ‘http://www.example.com’ by this new constant. Contributed by + Stéphane Wirtel. + + - bpo-36037(3): 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. + + - bpo-35798(4): Added ‘test.support.check_syntax_warning()’. + + - bpo-35505(5): Make test_imap4_host_default_value independent on + whether the local IMAP server is running. + + - bpo-35917(6): 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) + + - bpo-35704(7): Skip ‘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) + + - bpo-34720(8): Assert m_state != NULL to mimic GC traversal + functions that do not correctly handle module creation when the + module state has not been created. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27313 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=36019 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=36037 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35798 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35505 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35917 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35704 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=34720 + + +File: python.info, Node: Windows<31>, Next: IDLE<24>, Prev: Tests<32>, Up: Python 3 8 0 alpha 2 + +1.21.34.5 Windows +................. + + - bpo-35976(1): Added ARM build support to Windows build files in + PCBuild. + + - bpo-35692(2): ‘pathlib’ no longer raises when checking file and + directory existence on drives that are not ready + + - bpo-35872(3): Uses the base Python executable when invoking venv in + a virtual environment + + - bpo-35873(4): Prevents venv paths being inherited by child + processes + + - bpo-35299(5): Fix sysconfig detection of the source directory and + distutils handling of pyconfig.h during PGO profiling + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35976 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35692 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35872 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35873 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35299 + + +File: python.info, Node: IDLE<24>, Prev: Windows<31>, Up: Python 3 8 0 alpha 2 + +1.21.34.6 IDLE +.............. + + - bpo-24310(1): IDLE – Document settings dialog font tab sample. + + - bpo-35833(2): Revise IDLE doc for control codes sent to Shell. Add + a code example block. + + - bpo-35689(3): Add docstrings and unittests for colorizer.py. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24310 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35833 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35689 + + +File: python.info, Node: Python 3 8 0 alpha 1, Next: Python 3 7 0 final, Prev: Python 3 8 0 alpha 2, Up: Changelog + +1.21.35 Python 3.8.0 alpha 1 +---------------------------- + +`Release date: 2019-02-03' + +* Menu: + +* Security: Security<22>. +* Core and Builtins: Core and Builtins<35>. +* Library: Library<34>. +* Documentation: Documentation<34>. +* Tests: Tests<33>. +* Build: Build<34>. +* Windows: Windows<32>. +* macOS: macOS<23>. +* IDLE: IDLE<25>. +* Tools/Demos: Tools/Demos<14>. +* C API: C API<31>. + + +File: python.info, Node: Security<22>, Next: Core and Builtins<35>, Up: Python 3 8 0 alpha 1 + +1.21.35.1 Security +.................. + + - bpo-35746(1): [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. + + - bpo-34812(2): The *note -I: 5b0. command line option (run Python in + isolated mode) is now also copied by the *note multiprocessing: b5. + and *note distutils: 37. modules when spawning child processes. + Previously, only *note -E: 5af. and *note -s: 101c. options + (enabled by *note -I: 5b0.) were copied. + + - bpo-34791(3): 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. + + - bpo-17239(4): 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. + + - bpo-34623(5): CVE-2018-14647: The C accelerated _elementtree module + now initializes hash randomization salt from _Py_HashSecret instead + of libexpat’s default CSPRNG. + + - bpo-34405(6): Updated to OpenSSL 1.1.0i for Windows builds. + + - bpo-33871(7): Fixed sending the part of the file in *note + os.sendfile(): 762. on macOS. Using the `trailers' argument could + cause sending more bytes from the input file than was specified. + + - bpo-32533(8): Fixed thread-safety of error handling in _ssl. + + - bpo-33136(9): Harden ssl module against LibreSSL CVE-2018-8970. + X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. + A new test ensures that NULL bytes are not allowed. + + - bpo-33001(10): Minimal fix to prevent buffer overrun in os.symlink + on Windows + + - bpo-32981(11): Regexes in difflib and poplib were vulnerable to + catastrophic backtracking. These regexes formed potential DOS + vectors (REDOS). They have been refactored. This resolves + CVE-2018-1060 and CVE-2018-1061. Patch by Jamie Davis. + + - bpo-28414(12): The ssl module now allows users to perform their own + IDN en/decoding when using SNI. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35746 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34812 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=34791 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17239 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=34623 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=34405 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33871 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32533 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33136 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33001 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32981 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28414 + + +File: python.info, Node: Core and Builtins<35>, Next: Library<34>, Prev: Security<22>, Up: Python 3 8 0 alpha 1 + +1.21.35.2 Core and Builtins +........................... + + - bpo-35877(1): Make parenthesis optional for named expressions in + while statement. Patch by Karthikeyan Singaravelan. + + - bpo-35814(2): Allow same right hand side expressions in annotated + assignments as in normal ones. In particular, ‘x: Tuple[int, int] + = 1, 2’ (without parentheses on the right) is now allowed. + + - bpo-35766(3): 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](‘https://github.com/python/typed_ast’). + + - bpo-35713(4): Reorganize Python initialization to get working + exceptions and sys.stderr earlier. + + - bpo-33416(5): Add end line and end column position information to + the Python AST nodes. This is a C-level backwards incompatible + change. + + - bpo-35720(6): Fixed a minor memory leak in + pymain_parse_cmdline_impl function in Modules/main.c + + - bpo-35634(7): ‘func(**kwargs)’ will now raise an error when + ‘kwargs’ is a mapping containing multiple entries with the same + key. An error was already raised when other keyword arguments are + passed before ‘**kwargs’ since Python 3.6. + + - bpo-35623(8): Fix a crash when sorting very long lists. Patch by + Stephan Hohe. + + - bpo-35214(9): clang Memory Sanitizer build instrumentation was + added to work around false positives from posix, socket, time, + test_io, and test_faulthandler. + + - bpo-35560(10): Fix an assertion error in *note format(): 1f7. in + debug build for floating point formatting with “n” format, zero + padding and small width. Release build is not impacted. Patch by + Karthikeyan Singaravelan. + + - bpo-35552(11): Format characters ‘%s’ and ‘%V’ in *note + PyUnicode_FromFormat(): 4f2. and ‘%s’ in *note + PyBytes_FromFormat(): 145b. no longer read memory past the limit if + `precision' is specified. + + - bpo-35504(12): Fix segfaults and *note SystemError: 9b5.s when + deleting certain attributes. Patch by Zackery Spytz. + + - bpo-35504(13): Fixed a SystemError when delete the + characters_written attribute of an OSError. + + - bpo-35494(14): Improved syntax error messages for unbalanced + parentheses in f-string. + + - bpo-35444(15): Fixed error handling in pickling methods when fail + to look up builtin “getattr”. Sped up pickling iterators. + + - bpo-35436(16): Fix various issues with memory allocation error + handling. Patch by Zackery Spytz. + + - bpo-35423(17): 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. + + - bpo-35357(18): 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. + + - bpo-35372(19): Fixed the code page decoder for input longer than 2 + GiB containing undecodable bytes. + + - bpo-35336(20): Fix PYTHONCOERCECLOCALE=1 environment variable: only + coerce the C locale if the LC_CTYPE locale is “C”. + + - bpo-31241(21): 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. + + - bpo-33954(22): For *note str.format(): 1fc, ‘float.__format__()’ + and ‘complex.__format__()’ methods for non-ASCII decimal point when + using the “n” formatter. + + - bpo-35269(23): Fix a possible segfault involving a newly created + coroutine. Patch by Zackery Spytz. + + - bpo-35224(24): Implement PEP 572(25) (assignment expressions). + Patch by Emily Morehouse. + + - bpo-32492(26): Speed up ‘namedtuple’ attribute access by 1.6x using + a C fast-path for the name descriptors. Patch by Pablo Galindo. + + - bpo-35214(27): Fixed an out of bounds memory access when parsing a + truncated unicode escape sequence at the end of a string such as + ‘'\N'’. It would read one byte beyond the end of the memory + allocation. + + - bpo-35214(28): 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. + + - bpo-35193(29): 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. + + - bpo-35169(30): Improved error messages for forbidden assignments. + + - bpo-34022(31): Fix handling of hash-based bytecode files in *note + zipimport: 14e. Patch by Elvis Pranskevichus. + + - bpo-28401(32): 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. + + - bpo-29341(33): Clarify in the docstrings of *note os: c2. methods + that path-like objects are also accepted as input parameters. + + - bpo-35050(34): *note socket: ec.: Fix off-by-one bug in length + check for ‘AF_ALG’ name and type. + + - bpo-29743(35): Raise *note ValueError: 1c8. instead of *note + OverflowError: 4a4. in case of a negative ‘_length_’ in a *note + ctypes.Array: 145c. subclass. Also raise *note TypeError: 19c. + instead of *note AttributeError: 19d. for non-integer ‘_length_’. + Original patch by Oren Milman. + + - bpo-16806(36): Fix ‘lineno’ and ‘col_offset’ for multi-line string + tokens. + + - bpo-35029(37): *note SyntaxWarning: 2d5. raised as an exception at + code generation time will be now replaced with a *note SyntaxError: + 2d6. for better error reporting. + + - bpo-34983(38): Expose *note symtable.Symbol.is_nonlocal(): 145d. in + the symtable module. Patch by Pablo Galindo. + + - bpo-34974(39): *note bytes: 1b4. and *note bytearray: 1a5. + constructors no longer convert unexpected exceptions (e.g. *note + MemoryError: 127a. and *note KeyboardInterrupt: 611.) to *note + TypeError: 19c. + + - bpo-34939(40): Allow annotated names in module namespace that are + declared global before the annotation happens. Patch by Pablo + Galindo. + + - bpo-34973(41): Fixed crash in *note bytes(): 1b4. when the *note + list: 1e9. argument is mutated while it is iterated. + + - bpo-34876(42): The `lineno' and `col_offset' attributes of the AST + for decorated function and class refer now to the position of the + corresponding ‘def’, ‘async def’ and ‘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. + + - bpo-34879(43): Fix a possible null pointer dereference in + bytesobject.c. Patch by Zackery Spytz. + + - bpo-34784(44): Fix the implementation of PyStructSequence_NewType + in order to create heap allocated StructSequences. + + - bpo-32912(45): A *note SyntaxWarning: 2d5. is now emitted instead + of a *note DeprecationWarning: 2d4. for invalid escape sequences in + string and bytes literals. + + - bpo-34854(46): Fixed a crash in compiling string annotations + containing a lambda with a keyword-only argument that doesn’t have + a default value. + + - bpo-34850(47): The compiler now produces a *note SyntaxWarning: + 2d5. when identity checks (‘is’ and ‘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 (‘==’ and ‘!=’) + instead. + + - bpo-34824(48): Fix a possible null pointer dereference in + Modules/_ssl.c. Patch by Zackery Spytz. + + - bpo-30156(49): The C function ‘property_descr_get()’ uses a + “cached” tuple to optimize function calls. But this tuple can be + discovered in debug mode with ‘sys.getobjects()’. Remove the + optimization, it’s not really worth it and it causes 3 different + crashes last years. + + - bpo-34762(50): Fix contextvars C API to use PyObject* pointer + types. + + - bpo-34751(51): 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. + + - bpo-34735(52): Fix a memory leak in Modules/timemodule.c. Patch by + Zackery Spytz. + + - bpo-34683(53): Fixed a bug where some SyntaxError error pointed to + locations that were off-by-one. + + - bpo-34651(54): Only allow the main interpreter to fork. The avoids + the possibility of affecting the main interpreter, which is + critical to operation of the runtime. + + - bpo-34653(55): Remove unused function + PyParser_SimpleParseStringFilename. + + - bpo-32236(56): Warn that line buffering is not supported if *note + open(): 30b. is called with binary mode and ‘buffering=1’. + + - bpo-34641(57): Further restrict the syntax of the left-hand side of + keyword arguments in function calls. In particular, + ‘f((keyword)=arg)’ is now disallowed. + + - bpo-34637(58): Make the `start' argument to `sum()' visible as a + keyword argument. + + - bpo-1621(59): Do not assume signed integer overflow behavior (C + undefined behavior) when performing set hash table resizing. + + - bpo-34588(60): Fix an off-by-one in the recursive call pruning + feature of traceback formatting. + + - bpo-34485(61): 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, “”). + + - bpo-34485(62): 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). + + - bpo-34485(63): Fix the error handler of standard streams like + sys.stdout: PYTHONIOENCODING=”:” is now ignored instead of setting + the error handler to “strict”. + + - bpo-34485(64): 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. + + - bpo-34527(65): 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”. + + - bpo-34527(66): The UTF-8 Mode is now also enabled by the “POSIX” + locale, not only by the “C” locale. + + - bpo-34403(67): 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). + + - bpo-34523(68): The Python filesystem encoding is now read earlier + during the Python initialization. + + - bpo-12458(69): 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. + + - bpo-34408(70): Prevent a null pointer dereference and resource + leakage in ‘PyInterpreterState_New()’. + + - bpo-34400(71): Fix undefined behavior in parsetok.c. Patch by + Zackery Spytz. + + - bpo-33073(72): Added as_integer_ratio to ints to make them more + interoperable with floats. + + - bpo-34377(73): Update valgrind suppression list to use + ‘_PyObject_Free’/‘_PyObject_Realloc’ instead of + ‘PyObject_Free’/‘PyObject_Realloc’. + + - bpo-34353(74): Added the “socket” option in the *note + stat.filemode(): dfb. Python implementation to match the C + implementation. + + - bpo-34320(75): Fix ‘dict(od)’ didn’t copy iteration order of + OrderedDict. + + - bpo-34113(76): Fixed crash on debug builds when opcode stack was + adjusted with negative numbers. Patch by Constantin Petrisor. + + - bpo-34100(77): Compiler now merges constants in tuples and + frozensets recursively. Code attributes like ‘co_names’ are merged + too. + + - bpo-34151(78): Performance of list concatenation, repetition and + slicing operations is slightly improved. Patch by Sergey Fedoseev. + + - bpo-34170(79): -X dev: it is now possible to override the memory + allocator using PYTHONMALLOC even if the developer mode is enabled. + + - bpo-33237(80): Improved *note AttributeError: 19d. message for + partially initialized module. + + - bpo-34149(81): Fix min and max functions to get default behavior + when key is None. + + - bpo-34125(82): Profiling of unbound built-in methods now works when + ‘**kwargs’ is given. + + - bpo-34141(83): Optimized pickling atomic types (None, bool, int, + float, bytes, str). + + - bpo-34126(84): Fix crashes when profiling certain invalid calls of + unbound methods. Patch by Jeroen Demeyer. + + - bpo-24618(85): Fixed reading invalid memory when create the code + object with too small varnames tuple or too large argument counts. + + - bpo-34068(86): In *note io.IOBase.close(): 145e, ensure that the + *note closed: 145f. attribute is not set with a live exception. + Patch by Zackery Spytz and Serhiy Storchaka. + + - bpo-34087(87): Fix buffer overflow while converting unicode to + numeric values. + + - bpo-34080(88): Fixed a memory leak in the compiler when it raised + some uncommon errors during tokenizing. + + - bpo-34066(89): Disabled interruption by Ctrl-C between calling + ‘open()’ and entering a `with' block in ‘with open()’. + + - bpo-34042(90): Fix dict.copy() to maintain correct total refcount + (as reported by sys.gettotalrefcount()). + + - bpo-33418(91): Fix potential memory leak in function object when it + creates reference cycle. + + - bpo-33985(92): Implement contextvars.ContextVar.name attribute. + + - bpo-33956(93): Update vendored Expat library copy to version 2.2.5. + + - bpo-24596(94): Decref the module object in *note + PyRun_SimpleFileExFlags(): 130e. before calling *note + PyErr_Print(): 1353. Patch by Zackery Spytz. + + - bpo-33451(95): Close directly executed pyc files before calling + ‘PyEval_EvalCode()’. + + - bpo-1617161(96): The hash of ‘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 + ‘ModuleType’ and ‘MethodWrapperType’ instances (methods of + user-defined classes and some methods of built-in classes like + ‘str.__add__’) now depend on the hash and equality of the identity + of `__self__' instead of its value. ‘MethodWrapperType’ instances + no longer support ordering. + + - bpo-33824(97): Fix “LC_ALL=C python3.7 -V”: reset properly the + command line parser when the encoding changes after reading the + Python configuration. + + - bpo-33803(98): Fix a crash in hamt.c caused by enabling GC tracking + for an object that hadn’t all of its fields set to NULL. + + - bpo-33738(99): Seven macro incompatibilities with the Limited API + were fixed, and the macros *note PyIter_Check(): 12fa, *note + PyIndex_Check(): 5e0. and ‘PyExceptionClass_Name()’ were added as + functions. A script for automatic macro checks was added. + + - bpo-33786(100): Fix asynchronous generators to handle GeneratorExit + in athrow() correctly + + - bpo-30167(101): ‘PyRun_SimpleFileExFlags’ removes ‘__cached__’ from + module in addition to ‘__file__’. + + - bpo-33706(102): Fix a crash in Python initialization when parsing + the command line options. Thanks Christoph Gohlke for the bug + report and the fix! + + - bpo-33597(103): Reduce ‘PyGC_Head’ size from 3 words to 2 words. + + - bpo-30654(104): 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. + + - bpo-33622(105): Fixed a leak when the garbage collector fails to + add an object with the ‘__del__’ method or referenced by it into + the *note gc.garbage: e74. list. *note PyGC_Collect(): 5e4. can + now be called when an exception is set and preserves it. + + - bpo-33462(106): Make dict and dict views reversible. Patch by Rémi + Lapeyre. + + - bpo-23722(107): A *note RuntimeError: 6e9. is now raised when the + custom metaclass doesn’t provide the ‘__classcell__’ entry in the + namespace passed to ‘type.__new__’. A *note DeprecationWarning: + 2d4. was emitted in Python 3.6–3.7. + + - bpo-33499(108): Add *note PYTHONPYCACHEPREFIX: 5f3. environment + variable and *note -X: 174. ‘pycache_prefix’ command-line option to + set an alternate root directory for writing module bytecode cache + files. + + - bpo-25711(109): The *note zipimport: 14e. module has been rewritten + in pure Python. + + - bpo-33509(110): Fix module_globals parameter of + warnings.warn_explicit(): don’t crash if module_globals is not a + dict. + + - bpo-31849(111): Fix signed/unsigned comparison warning in pyhash.c. + + - bpo-33475(112): Fixed miscellaneous bugs in converting annotations + to strings and optimized parentheses in the string representation. + + - bpo-20104(113): Added support for the ‘setpgroup’, ‘resetids’, + ‘setsigmask’, ‘setsigdef’ and ‘scheduler’ parameters of + ‘posix_spawn’. Patch by Pablo Galindo. + + - bpo-33391(114): Fix a leak in set_symmetric_difference(). + + - bpo-33363(115): Raise a SyntaxError for ‘async with’ and ‘async + for’ statements outside of async functions. + + - bpo-28055(116): Fix unaligned accesses in siphash24(). Patch by + Rolf Eike Beer. + + - bpo-33128(117): Fix a bug that causes PathFinder to appear twice on + sys.meta_path. Patch by Pablo Galindo Salgado. + + - bpo-33331(118): Modules imported last are now cleared first at + interpreter shutdown. + + - bpo-33312(119): Fixed clang ubsan (undefined behavior sanitizer) + warnings in dictobject.c by adjusting how the internal struct + _dictkeysobject shared keys structure is declared. + + - bpo-33305(120): Improved syntax error messages for invalid + numerical literals. + + - bpo-33306(121): Improved syntax error messages for unbalanced + parentheses. + + - bpo-33234(122): The list constructor will pre-size and not + over-allocate when the input length is known. + + - bpo-33270(123): Intern the names for all anonymous code objects. + Patch by Zackery Spytz. + + - bpo-30455(124): The C and Python code and the documentation related + to tokens are now generated from a single source file + ‘Grammar/Tokens’. + + - bpo-33176(125): Add a ‘toreadonly()’ method to memoryviews. + + - bpo-33231(126): Fix potential memory leak in ‘normalizestring()’. + + - bpo-33205(127): Change dict growth function from + ‘round_up_to_power_2(used*2+hashtable_size/2)’ to + ‘round_up_to_power_2(used*3)’. Previously, dict is shrinked only + when ‘used == 0’. Now dict has more chance to be shrinked. + + - bpo-29922(128): Improved error messages in ‘async with’ when + ‘__aenter__()’ or ‘__aexit__()’ return non-awaitable object. + + - bpo-33199(129): Fix ‘ma_version_tag’ in dict implementation is + uninitialized when copying from key-sharing dict. + + - bpo-33053(130): 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) + + - bpo-33138(131): Changed standard error message for non-pickleable + and non-copyable types. It now says “cannot pickle” instead of + “can’t pickle” or “cannot serialize”. + + - bpo-33018(132): Improve consistency of errors raised by + ‘issubclass()’ when called with a non-class and an abstract base + class as the first and second arguments, respectively. Patch by + Josh Bronson. + + - bpo-33083(133): ‘math.factorial’ no longer accepts arguments that + are not int-like. Patch by Pablo Galindo. + + - bpo-33041(134): Added new opcode *note END_ASYNC_FOR: 707. and + fixes the following issues: + + * Setting global *note StopAsyncIteration: 1460. no longer + breaks ‘async for’ loops. + + * Jumping into an ‘async for’ loop is now disabled. + + * Jumping out of an ‘async for’ loop no longer corrupts the + stack. + + - bpo-25750(135): Fix rare Python crash due to bad refcounting in + ‘type_getattro()’ if a descriptor deletes itself from the class. + Patch by Jeroen Demeyer. + + - bpo-33041(136): 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. + + - bpo-33026(137): Fixed jumping out of “with” block by setting + f_lineno. + + - bpo-33005(138): 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. + + - bpo-32911(139): Due to unexpected compatibility issues discovered + during downstream beta testing, reverted bpo-29463(140). + ‘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. + + - bpo-17288(141): Prevent jumps from ‘return’ and ‘exception’ trace + events. + + - bpo-32946(142): Importing names from already imported module with + “from … import …” is now 30% faster if the module is not a package. + + - bpo-32932(143): Make error message more revealing when there are + non-str objects in ‘__all__’. + + - bpo-32925(144): Optimized iterating and containing test for literal + lists consisting of non-constants: ‘x in [a, b]’ and ‘for x in [a, + b]’. The case of all constant elements already was optimized. + + - bpo-32889(145): Update Valgrind suppression list to account for the + rename of ‘Py_ADDRESS_IN_RANG’ to ‘address_in_range’. + + - bpo-32836(146): Don’t use temporary variables in cases of + list/dict/set comprehensions + + - bpo-31356(147): Remove the new API added in bpo-31356(148) + (gc.ensure_disabled() context manager). + + - bpo-32305(149): For namespace packages, ensure that both ‘__file__’ + and ‘__spec__.origin’ are set to None. + + - bpo-32303(150): Make sure ‘__spec__.loader’ matches ‘__loader__’ + for namespace packages. + + - bpo-32711(151): Fix the warning messages for Python/ast_unparse.c. + Patch by Stéphane Wirtel + + - bpo-32583(152): Fix possible crashing in builtin Unicode decoders + caused by write out-of-bound errors when using customized decode + error handlers. + + - bpo-32489(153): A *note continue: 609. statement is now allowed in + the *note finally: 60a. clause. + + - bpo-17611(154): 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 *note break: 706, *note + continue: 609. and *note return: 60e. + + Removed opcodes ‘BREAK_LOOP’, ‘CONTINUE_LOOP’, ‘SETUP_LOOP’ and + ‘SETUP_EXCEPT’. Added new opcodes ‘ROT_FOUR’, ‘BEGIN_FINALLY’ and + ‘CALL_FINALLY’ and ‘POP_FINALLY’. Changed the behavior of + ‘END_FINALLY’ and ‘WITH_CLEANUP_START’. + + - bpo-32285(155): New function unicodedata.is_normalized, which can + check whether a string is in a specific normal form. + + - bpo-10544(156): Yield expressions are now disallowed in + comprehensions and generator expressions except the expression for + the outermost iterable. + + - bpo-32117(157): Iterable unpacking is now allowed without + parentheses in yield and return statements, e.g. ‘yield 1, 2, 3, + *rest’. Thanks to David Cuthbert for the change and Jordan Chapman + for added tests. + + - bpo-31902(158): Fix the ‘col_offset’ attribute for ast nodes + ‘ast.AsyncFor’, ‘ast.AsyncFunctionDef’, and ‘ast.AsyncWith’. + Previously, ‘col_offset’ pointed to the keyword after ‘async’. + + - bpo-25862(159): Fix assertion failures in the ‘tell()’ method of + ‘io.TextIOWrapper’. Patch by Zackery Spytz. + + - bpo-21983(160): Fix a crash in *note ctypes.cast(): 1461. in case + the type argument is a ctypes structured data type. Patch by Eryk + Sun and Oren Milman. + + - bpo-31577(161): Fix a crash in *note os.utime(): da2. in case of a + bad ns argument. Patch by Oren Milman. + + - bpo-29832(162): Remove references to ‘getsockaddrarg’ from various + socket error messages. Patch by Oren Milman. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35877 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35814 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35766 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35713 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33416 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35720 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35634 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35623 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35214 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35560 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35552 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=35504 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=35504 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=35494 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=35444 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=35436 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=35423 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=35357 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=35372 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=35336 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31241 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=33954 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=35269 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=35224 + + (25) https://peps.python.org/pep-0572/ + + (26) https://bugs.python.org/issue?@action=redirect&bpo=32492 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=35214 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=35214 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=35193 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=35169 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=34022 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=28401 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=29341 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=35050 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=29743 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=16806 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=35029 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=34983 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=34974 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=34939 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=34973 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=34876 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=34879 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=34784 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=32912 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=34854 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=34850 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=34824 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=30156 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=34762 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=34751 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=34735 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=34683 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=34651 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=34653 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=32236 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=34641 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=34637 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=1621 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=34588 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=34485 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=34485 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=34485 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=34485 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=34527 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=34527 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=34403 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=34523 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=12458 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=34408 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=34400 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=33073 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=34377 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=34353 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=34320 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=34113 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=34100 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=34151 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=34170 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=33237 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=34149 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=34125 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=34141 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=34126 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=24618 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=34068 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=34087 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=34080 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=34066 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=34042 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=33418 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=33985 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=33956 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=24596 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=33451 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=1617161 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=33824 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=33803 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=33738 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=33786 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=30167 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=33706 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=33597 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=30654 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=33622 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=33462 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=33499 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=25711 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=33509 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=31849 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=33475 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=20104 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=33391 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=33363 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=28055 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=33128 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=33331 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=33312 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=33305 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=33306 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=33234 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=33270 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=30455 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=33176 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=33231 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=33205 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=29922 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=33199 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=33053 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=33138 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=33018 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=33083 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=33041 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=25750 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=33041 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=33026 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=33005 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=32911 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=29463 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=17288 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=32946 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=32932 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=32925 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=32889 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=32836 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=31356 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=31356 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=32305 + + (150) https://bugs.python.org/issue?@action=redirect&bpo=32303 + + (151) https://bugs.python.org/issue?@action=redirect&bpo=32711 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=32583 + + (153) https://bugs.python.org/issue?@action=redirect&bpo=32489 + + (154) https://bugs.python.org/issue?@action=redirect&bpo=17611 + + (155) https://bugs.python.org/issue?@action=redirect&bpo=32285 + + (156) https://bugs.python.org/issue?@action=redirect&bpo=10544 + + (157) https://bugs.python.org/issue?@action=redirect&bpo=32117 + + (158) https://bugs.python.org/issue?@action=redirect&bpo=31902 + + (159) https://bugs.python.org/issue?@action=redirect&bpo=25862 + + (160) https://bugs.python.org/issue?@action=redirect&bpo=21983 + + (161) https://bugs.python.org/issue?@action=redirect&bpo=31577 + + (162) https://bugs.python.org/issue?@action=redirect&bpo=29832 + + +File: python.info, Node: Library<34>, Next: Documentation<34>, Prev: Core and Builtins<35>, Up: Python 3 8 0 alpha 1 + +1.21.35.3 Library +................. + + - bpo-35845(1): Add ‘order’ parameter to memoryview.tobytes(). + + - bpo-35864(2): The _asdict() method for collections.namedtuple now + returns a regular dict instead of an OrderedDict. + + - bpo-35537(3): 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) + + - bpo-35847(4): RISC-V needed the CTYPES_PASS_BY_REF_HACK. Fixes + ctypes Structure test_pass_by_value. + + - bpo-35813(5): Shared memory submodule added to multiprocessing to + avoid need for serialization between processes + + - bpo-35780(6): 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. + + - bpo-35537(7): *note os.posix_spawn(): 6a8. and *note + os.posix_spawnp(): 1463. now have a `setsid' parameter. + + - bpo-23846(8): *note asyncio.ProactorEventLoop: 1e0. now catches and + logs send errors when the self-pipe is full. + + - bpo-34323(9): *note asyncio: 9.: Enhance ‘IocpProactor.close()’ + log: wait 1 second before the first log, then log every second. + Log also the number of seconds since ‘close()’ was called. + + - bpo-35674(10): Add a new *note os.posix_spawnp(): 1463. function. + Patch by Joannah Nanjekye. + + - bpo-35733(11): ‘ast.Constant(boolean)’ no longer an instance of + ‘ast.Num’. Patch by Anthony Sottile. + + - bpo-35726(12): QueueHandler.prepare() now makes a copy of the + record before modifying and enqueueing it, to avoid affecting other + handlers in the chain. + + - bpo-35719(13): Sped up multi-argument *note math: af. functions + atan2(), copysign(), remainder() and hypot() by 1.3–2.5 times. + + - bpo-35717(14): Fix KeyError exception raised when using enums and + compile. Patch contributed by Rémi Lapeyre. + + - bpo-35699(15): Fixed detection of Visual Studio Build Tools 2017 in + distutils + + - bpo-32710(16): Fix memory leaks in asyncio ProactorEventLoop on + overlapped operation failure. + + - bpo-35702(17): The *note time.CLOCK_UPTIME_RAW: 690. constant is + now available for macOS 10.12. + + - bpo-32710(18): Fix a memory leak in asyncio in the + ProactorEventLoop when ‘ReadFile()’ or ‘WSASend()’ overlapped + operation fail immediately: release the internal buffer. + + - bpo-35682(19): Fix ‘asyncio.ProactorEventLoop.sendfile()’: don’t + attempt to set the result of an internal future if it’s already + done. + + - bpo-35283(20): Add a deprecated warning for the + ‘threading.Thread.isAlive()’ method. Patch by Dong-hee Na. + + - bpo-35664(21): 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). + + - bpo-35643(22): Fixed a SyntaxWarning: invalid escape sequence in + Modules/_sha3/cleanup.py. Patch by Mickaël Schoentgen. + + - bpo-35619(23): Improved support of custom data descriptors in *note + help(): 514. and *note pydoc: d6. + + - bpo-28503(24): The *note crypt: 27. module now internally uses the + ‘crypt_r()’ library function instead of *note crypt(): 27. when + available. + + - bpo-35614(25): Fixed help() on metaclasses. Patch by Sanyam + Khurana. + + - bpo-35568(26): Expose ‘raise(signum)’ as ‘raise_signal’ + + - bpo-35588(27): The floor division and modulo operations and the + *note divmod(): 5f1. function on *note fractions.Fraction: 210. + types are 2–4x faster. Patch by Stefan Behnel. + + - bpo-35585(28): Speed-up building enums by value, e.g. + http.HTTPStatus(200). + + - bpo-30561(29): 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. + + - bpo-35537(30): The *note subprocess: f6. module can now use the + *note os.posix_spawn(): 6a8. function in some cases for better + performance. + + - bpo-35526(31): Delaying the ‘joke’ of barry_as_FLUFL.mandatory to + Python version 4.0 + + - bpo-35523(32): Remove *note ctypes: 29. callback workaround: no + longer create a callback at startup. Avoid SELinux alert on + ‘import ctypes’ and ‘import uuid’. + + - bpo-31784(33): *note uuid.uuid1(): 80b. now calls *note + time.time_ns(): 73c. rather than ‘int(time.time() * 1e9)’. + + - bpo-35513(34): ‘TextTestRunner’ of ‘unittest.runner’ now uses *note + time.perf_counter(): 6da. rather than *note time.time(): 736. to + measure the execution time of a test: *note time.time(): 736. can + go backwards, whereas *note time.perf_counter(): 6da. is monotonic. + + - bpo-35502(35): Fixed reference leaks in *note + xml.etree.ElementTree.TreeBuilder: 6a4. in case of unfinished + building of the tree (in particular when an error was raised during + parsing XML). + + - bpo-35348(36): Make *note platform.architecture(): 1464. parsing of + ‘file’ command output more reliable: add the ‘-b’ option to the + ‘file’ command to omit the filename, force the usage of the C + locale, and search also the “shared object” pattern. + + - bpo-35491(37): *note multiprocessing: b5.: Add ‘Pool.__repr__()’ + and enhance ‘BaseProcess.__repr__()’ (add pid and parent pid) to + ease debugging. Pool state constant values are now strings instead + of integers, for example ‘RUN’ value becomes ‘'RUN'’ instead of + ‘0’. + + - bpo-35477(38): ‘multiprocessing.Pool.__enter__()’ now fails if the + pool is not running: ‘with pool:’ fails if used more than once. + + - bpo-31446(39): Copy command line that was passed to CreateProcessW + since this function can change the content of the input buffer. + + - bpo-35471(40): Python 2.4 dropped MacOS 9 support. The macpath + module was deprecated in Python 3.7. The module is now removed. + + - bpo-23057(41): Unblock Proactor event loop when keyboard interrupt + is received on Windows + + - bpo-35052(42): Fix xml.dom.minidom cloneNode() on a document with + an entity: pass the correct arguments to the user data handler of + an entity. + + - bpo-20239(43): Allow repeated assignment deletion of *note + unittest.mock.Mock: 69b. attributes. Patch by Pablo Galindo. + + - bpo-17185(44): Set ‘__signature__’ on mock for *note inspect: 9e. + to get signature. Patch by Karthikeyan Singaravelan. + + - bpo-35445(45): Memory errors during creating posix.environ no + longer ignored. + + - bpo-35415(46): Validate fileno= argument to socket.socket(). + + - bpo-35424(47): ‘multiprocessing.Pool’ destructor now emits *note + ResourceWarning: 8a9. if the pool is still running. + + - bpo-35330(48): When a ‘Mock’ instance was used to wrap an object, + if ‘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. + + - bpo-35346(49): Drop Mac OS 9 and Rhapsody support from the *note + platform: cb. module. Rhapsody last release was in 2000. Mac OS 9 + last release was in 2001. + + - bpo-10496(50): ‘check_environ()’ of ‘distutils.utils’ now catches + *note KeyError: 6f5. on calling *note pwd.getpwuid(): 1465.: don’t + create the ‘HOME’ environment variable in this case. + + - bpo-10496(51): ‘posixpath.expanduser()’ now returns the input + `path' unchanged if the ‘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 *note site: e8. module if the current user doesn’t exist in + the password database (if the user has no home directory). + + - bpo-35389(52): *note platform.libc_ver(): 1466. now uses + ‘os.confstr('CS_GNU_LIBC_VERSION')’ if available and the + `executable' parameter is not set. + + - bpo-35394(53): Add empty slots to asyncio abstract protocols. + + - bpo-35310(54): Fix a bug in *note select.select(): a1e. 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. *note select.select(): a1e. will now always + return empty lists if a timeout has occurred. Patch by Oran + Avraham. + + - bpo-35380(55): Enable TCP_NODELAY on Windows for proactor asyncio + event loop. + + - bpo-35341(56): Add generic version of ‘collections.OrderedDict’ to + the ‘typing’ module. Patch by Ismo Toijala. + + - bpo-35371(57): Fixed possible crash in ‘os.utime()’ on Windows when + pass incorrect arguments. + + - bpo-35346(58): *note platform.uname(): 1467. now redirects ‘stderr’ + to *note os.devnull: 1468. when running external programs like ‘cmd + /c ver’. + + - bpo-35066(59): 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 ‘%’. + + - bpo-35345(60): The function ‘platform.popen’ has been removed, it + was deprecated since Python 3.3: use *note os.popen(): 6d9. + instead. + + - bpo-35344(61): On macOS, *note platform.platform(): 1469. now uses + *note platform.mac_ver(): 146a, if it returns a non-empty release + string, to get the macOS version rather than the darwin version. + + - bpo-35312(62): Make ‘lib2to3.pgen2.parse.ParseError’ round-trip + pickle-able. Patch by Anthony Sottile. + + - bpo-35308(63): Fix regression in ‘webbrowser’ where default + browsers may be preferred over browsers in the ‘BROWSER’ + environment variable. + + - bpo-24746(64): Avoid stripping trailing whitespace in doctest fancy + diff. Original patch by R. David Murray & Jairo Trad. Enhanced by + Sanyam Khurana. + + - bpo-28604(65): *note locale.localeconv(): 868. now sets temporarily + the ‘LC_CTYPE’ locale to the ‘LC_MONETARY’ locale if the two + locales are different and monetary strings are non-ASCII. This + temporary change affects other threads. + + - bpo-35277(66): Update ensurepip to install pip 18.1 and setuptools + 40.6.2. + + - bpo-24209(67): Adds IPv6 support when invoking http.server + directly. + + - bpo-35226(68): Recursively check arguments when testing for + equality of *note unittest.mock.call: 13ec. objects and add note + that tracking of parameters used to create ancestors of mocks in + ‘mock_calls’ is not possible. + + - bpo-29564(69): 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. + + - bpo-35189(70): Modify the following fnctl function to retry if + interrupted by a signal (EINTR): flock, lockf, fnctl + + - bpo-30064(71): Use add_done_callback() in sock_* asyncio API to + unsubscribe reader/writer early on calcellation. + + - bpo-35186(72): Removed the “built with” comment added when + ‘setup.py upload’ is used with either ‘bdist_rpm’ or ‘bdist_dumb’. + + - bpo-35152(73): Allow sending more than 2 GB at once on a + multiprocessing connection on non-Windows systems. + + - bpo-35062(74): Fix incorrect parsing of + ‘_io.IncrementalNewlineDecoder’’s `translate' argument. + + - bpo-35065(75): Remove ‘StreamReaderProtocol._untrack_reader’. The + call to ‘_untrack_reader’ is currently performed too soon, causing + the protocol to forget about the reader before ‘connection_lost’ + can run and feed the EOF to the reader. + + - bpo-34160(76): ElementTree and minidom now preserve the attribute + order specified by the user. + + - bpo-35079(77): Improve difflib.SequenceManager.get_matching_blocks + doc by adding ‘non-overlapping’ and changing ‘!=’ to ‘<’. + + - bpo-33710(78): Deprecated ‘l*gettext()’ functions and methods in + the *note gettext: 83. 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 + ‘l*gettext()’ functions and methods. + + - bpo-35017(79): *note socketserver.BaseServer.serve_forever(): dec. + now exits immediately if it’s *note shutdown(): 146b. method is + called while it is polling for new events. + + - bpo-35024(80): *note importlib: 97. no longer logs ‘wrote’ + redundantly after ‘(created|could not create)’ is already logged. + Patch by Quentin Agren. + + - bpo-35047(81): ‘unittest.mock’ now includes mock calls in exception + messages if ‘assert_not_called’, ‘assert_called_once’, or + ‘assert_called_once_with’ fails. Patch by Petter Strandmark. + + - bpo-31047(82): Fix ‘ntpath.abspath’ regression where it didn’t + remove a trailing separator on Windows. Patch by Tim Graham. + + - bpo-35053(83): 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). + + - bpo-31553(84): Add the –json-lines option to json.tool. Patch by + hongweipeng. + + - bpo-34794(85): Fixed a leak in Tkinter when pass the Python wrapper + around Tcl_Obj back to Tcl/Tk. + + - bpo-34909(86): Enum: fix grandchildren subclassing when parent + mixed with concrete data types. + + - bpo-35022(87): *note unittest.mock.MagicMock: b1d. now supports the + ‘__fspath__’ method (from *note os.PathLike: 8bf.). + + - bpo-35008(88): Fixed references leaks when call the + ‘__setstate__()’ method of *note xml.etree.ElementTree.Element: + 59e. in the C implementation for already initialized element. + + - bpo-23420(89): Verify the value for the parameter ‘-s’ of the + cProfile CLI. Patch by Robert Kuska + + - bpo-33947(90): dataclasses now handle recursive reprs without + raising RecursionError. + + - bpo-34890(91): Make *note inspect.iscoroutinefunction(): a9a, *note + inspect.isgeneratorfunction(): 11b3. and *note + inspect.isasyncgenfunction(): 11b4. work with *note + functools.partial(): b5b. Patch by Pablo Galindo. + + - bpo-34521(92): Use *note socket.CMSG_SPACE(): 146c. to calculate + ancillary data size instead of *note socket.CMSG_LEN(): 146d. in + ‘multiprocessing.reduction.recvfds()’ as RFC 3542(93) requires the + use of the former for portable applications. + + - bpo-31522(94): The ‘mailbox.mbox.get_string’ function `from_' + parameter can now successfully be set to a non-default value. + + - bpo-34970(95): Protect tasks weak set manipulation in + ‘asyncio.all_tasks()’ + + - bpo-34969(96): 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). + + - bpo-16965(97): The *note 2to3: 146e. *note execfile: 146f. fixer + now opens the file with mode ‘'rb'’. Patch by Zackery Spytz. + + - bpo-34966(98): *note pydoc: d6. now supports aliases not only to + methods defined in the end class, but also to inherited methods. + The docstring is not duplicated for aliases. + + - bpo-34926(99): *note mimetypes.MimeTypes.guess_type(): 1470. now + accepts *note path-like object: 773. in addition to url strings. + Patch by Mayank Asthana. + + - bpo-23831(100): Add ‘moveto()’ method to the ‘tkinter.Canvas’ + widget. Patch by Juliette Monsel. + + - bpo-34941(101): Methods ‘find()’, ‘findtext()’ and ‘findall()’ of + the ‘Element’ class in the *note xml.etree.ElementTree: 142. module + are now able to find children which are instances of ‘Element’ + subclasses. + + - bpo-32680(102): *note smtplib.SMTP: 575. objects now always have a + ‘sock’ attribute present + + - bpo-34769(103): Fix for async generators not finalizing when event + loop is in debug mode and garbage collector runs in another thread. + + - bpo-34936(104): Fix ‘TclError’ in + ‘tkinter.Spinbox.selection_element()’. Patch by Juliette Monsel. + + - bpo-34829(105): Add methods ‘selection_from’, ‘selection_range’, + ‘selection_present’ and ‘selection_to’ to the ‘tkinter.Spinbox’ for + consistency with the ‘tkinter.Entry’ widget. Patch by Juliette + Monsel. + + - bpo-34911(106): 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. + + - bpo-34922(107): Fixed integer overflow in the *note digest(): 1471. + and *note hexdigest(): 1472. methods for the SHAKE algorithm in the + *note hashlib: 88. module. + + - bpo-34925(108): 25% speedup in argument parsing for the functions + in the bisect module. + + - bpo-34900(109): Fixed *note unittest.TestCase.debug(): 1291. when + used to call test methods with subtests. Patch by Bruno Oliveira. + + - bpo-34844(110): 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. + + - bpo-34897(111): Adjust test.support.missing_compiler_executable + check so that a nominal command name of “” is ignored. Patch by + Michael Felt. + + - bpo-34871(112): Fix inspect module polluted ‘sys.modules’ when + parsing ‘__text_signature__’ of callable. + + - bpo-34898(113): Add ‘mtime’ argument to *note gzip.compress: 63b. + for reproducible output. Patch by Guo Ci Teo. + + - bpo-28441(114): On Cygwin and MinGW, ensure that ‘sys.executable’ + always includes the full filename in the path, including the ‘.exe’ + suffix (unless it is a symbolic link). + + - bpo-34866(115): Adding ‘max_num_fields’ to ‘cgi.FieldStorage’ to + make DOS attacks harder by limiting the number of + ‘MiniFieldStorage’ objects created by ‘FieldStorage’. + + - bpo-34711(116): 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. + + - bpo-34872(117): Fix self-cancellation in C implementation of + asyncio.Task + + - bpo-34849(118): Don’t log waiting for ‘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. + + - bpo-34022(119): The ‘SOURCE_DATE_EPOCH’ environment variable no + longer overrides the value of the `invalidation_mode' argument to + *note py_compile.compile(): 671, and determines its default value + instead. + + - bpo-34819(120): Use a monotonic clock to compute timeouts in + ‘Executor.map()’ and ‘as_completed()’, in order to prevent timeouts + from deviating when the system clock is adjusted. + + - bpo-34758(121): Add .wasm -> application/wasm to list of recognized + file types and content type headers + + - bpo-34789(122): *note xml.sax.make_parser(): 1473. now accepts any + iterable as its `parser_list' argument. Patch by Andrés Delfino. + + - bpo-34334(123): In ‘QueueHandler’, clear ‘exc_text’ from + ‘LogRecord’ to prevent traceback from being written twice. + + - bpo-34687(124): On Windows, asyncio now uses ProactorEventLoop, + instead of SelectorEventLoop, by default. + + - bpo-5950(125): Support reading zip files with archive comments in + *note zipimport: 14e. + + - bpo-32892(126): The parser now represents all constants as *note + ast.Constant: 6c0. instead of using specific constant AST types + (‘Num’, ‘Str’, ‘Bytes’, ‘NameConstant’ and ‘Ellipsis’). These + classes are considered deprecated and will be removed in future + Python versions. + + - bpo-34728(127): Add deprecation warning when ‘loop’ is used in + methods: *note asyncio.sleep: 6c2, *note asyncio.wait: 591. and + *note asyncio.wait_for: 1d5. + + - bpo-34738(128): ZIP files created by *note distutils: 37. will now + include entries for directories. + + - bpo-34659(129): Add an optional `initial' argument to + itertools.accumulate(). + + - bpo-29577(130): Support multiple mixin classes when creating Enums. + + - bpo-34670(131): Add SSLContext.post_handshake_auth and + SSLSocket.verify_client_post_handshake for TLS 1.3’s post handshake + authentication feature. + + - bpo-32718(132): The Activate.ps1 script from venv works with + PowerShell Core 6.1 and is now available under all operating + systems. + + - bpo-31177(133): Fix bug that prevented using *note reset_mock: 969. + on mock instances with deleted attributes + + - bpo-34672(134): Add a workaround, so the ‘'Z'’ *note + time.strftime(): e99. specifier on the musl C library can work in + some cases. + + - bpo-34666(135): Implement ‘asyncio.StreamWriter.awrite’ and + ‘asyncio.StreamWriter.aclose()’ coroutines. Methods are needed for + providing a consistent stream API with control flow switched on by + default. + + - bpo-6721(136): Acquire the logging module’s commonly used internal + locks while fork()ing to avoid deadlocks in the child process. + + - bpo-34658(137): 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. + + - bpo-34652(138): Ensure *note os.lchmod(): 1474. is never defined on + Linux. + + - bpo-34638(139): 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 ‘close()’ call. + + - bpo-34536(140): ‘Enum._missing_’: raise *note ValueError: 1c8. if + None returned and *note TypeError: 19c. if non-member is returned. + + - bpo-34636(141): Speed up re scanning of many non-matching + characters for s w and d within bytes objects. (microoptimization) + + - bpo-24412(142): Add *note addModuleCleanup(): 69c. and *note + addClassCleanup(): 69d. to unittest to support cleanups for + ‘setUpModule()’ and *note setUpClass(): 69e. Patch by Lisa Roach. + + - bpo-34630(143): Don’t log SSL certificate errors in asyncio code + (connection error logging is skipped already). + + - bpo-32490(144): Prevent filename duplication in *note subprocess: + f6. exception messages. Patch by Zackery Spytz. + + - bpo-34363(145): dataclasses.asdict() and .astuple() now handle + namedtuples correctly. + + - bpo-34625(146): Update vendorized expat library version to 2.2.6. + + - bpo-32270(147): 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. + + - bpo-34622(148): Create a dedicated ‘asyncio.CancelledError’, + ‘asyncio.InvalidStateError’ and ‘asyncio.TimeoutError’ exception + classes. Inherit them from corresponding exceptions from + ‘concurrent.futures’ package. Extract ‘asyncio’ exceptions into a + separate file. + + - bpo-34610(149): Fixed iterator of + ‘multiprocessing.managers.DictProxy’. + + - bpo-34421(150): Fix distutils logging for non-ASCII strings. This + caused installation issues on Windows. + + - bpo-34604(151): Fix possible mojibake in the error message of *note + pwd.getpwnam: 1475. and *note grp.getgrnam: 1476. using string + representation because of invisible characters or trailing + whitespaces. Patch by William Grzybowski. + + - bpo-30977(152): Make uuid.UUID use ‘__slots__’ to reduce its memory + footprint. Based on original patch by Wouter Bolsterlee. + + - bpo-34574(153): OrderedDict iterators are not exhausted during + pickling anymore. Patch by Sergey Fedoseev. + + - bpo-8110(154): Refactored *note subprocess: f6. to check for + Windows-specific modules rather than ‘sys.platform == 'win32'’. + + - bpo-34530(155): ‘distutils.spawn.find_executable()’ now falls back + on *note os.defpath: 1433. if the ‘PATH’ environment variable is + not set. + + - bpo-34563(156): On Windows, fix multiprocessing.Connection for very + large read: fix _winapi.PeekNamedPipe() and _winapi.ReadFile() for + read larger than INT_MAX (usually ‘2**31-1’). + + - bpo-34558(157): Correct typo in Lib/ctypes/_aix.py + + - bpo-34282(158): Move ‘Enum._convert’ to ‘EnumMeta._convert_’ and + fix enum members getting shadowed by parent attributes. + + - bpo-22872(159): When the queue is closed, *note ValueError: 1c8. is + now raised by *note multiprocessing.Queue.put(): 1477. and *note + multiprocessing.Queue.get(): 1478. instead of *note AssertionError: + 26e. and *note OSError: 413, respectively. Patch by Zackery Spytz. + + - bpo-34515(160): Fix parsing non-ASCII identifiers in + ‘lib2to3.pgen2.tokenize’ (PEP 3131). + + - bpo-13312(161): Avoids a possible integer underflow (undefined + behavior) in the time module’s year handling code when passed a + very low negative year value. + + - bpo-34472(162): Improved compatibility for streamed files in *note + zipfile: 14d. Previously an optional signature was not being + written and certain ZIP applications were not supported. Patch by + Silas Sewell. + + - bpo-34454(163): 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. + + - bpo-6700(164): Fix inspect.getsourcelines for module level + frames/tracebacks. Patch by Vladimir Matveev. + + - bpo-34171(165): Running the *note trace: 11c. module no longer + creates the ‘trace.cover’ file. + + - bpo-34441(166): Fix crash when an ‘ABC’-derived class with invalid + ‘__subclasses__’ is passed as the second argument to *note + issubclass(): 3ac. Patch by Alexey Izbyshev. + + - bpo-34427(167): Fix infinite loop in ‘a.extend(a)’ for + ‘MutableSequence’ subclasses. + + - bpo-34412(168): Make *note signal.strsignal(): 1479. work on HP-UX. + Patch by Michael Osipov. + + - bpo-20849(169): shutil.copytree now accepts a new ‘dirs_exist_ok’ + keyword argument. Patch by Josh Bronson. + + - bpo-31715(170): Associate ‘.mjs’ file extension with + ‘application/javascript’ MIME Type. + + - bpo-34384(171): *note os.readlink(): 568. now accepts *note + path-like: 773. and *note bytes: 1b4. objects on Windows. + + - bpo-22602(172): The UTF-7 decoder now raises *note + UnicodeDecodeError: 65c. for ill-formed sequences starting with “+” + (as specified in RFC 2152). Patch by Zackery Spytz. + + - bpo-2122(173): The *note mmap.flush(): 6f1. method now returns + ‘None’ on success, raises an exception on error under all + platforms. + + - bpo-34341(174): Appending to the ZIP archive with the ZIP64 + extension no longer grows the size of extra fields of existing + entries. + + - bpo-34333(175): Fix %-formatting in *note + pathlib.PurePath.with_suffix(): 147a. when formatting an error + message. + + - bpo-18540(176): The *note imaplib.IMAP4: 546. and *note + imaplib.IMAP4_SSL: 547. classes now resolve to the local host IP + correctly when the default value of `host' parameter (‘''’) is + used. + + - bpo-26502(177): Implement ‘traceback.FrameSummary.__len__()’ method + to preserve compatibility with the old tuple API. + + - bpo-34318(178): *note assertRaises(): e16, *note + assertRaisesRegex(): e17, *note assertWarns(): e18. and *note + assertWarnsRegex(): e19. 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. + + - bpo-9372(179): Deprecate ‘__getitem__()’ methods of *note + xml.dom.pulldom.DOMEventStream: 2fe, *note + wsgiref.util.FileWrapper: 2ff. and *note fileinput.FileInput: 300. + + - bpo-33613(180): Fix a race condition in + ‘multiprocessing.semaphore_tracker’ when the tracker receives + SIGINT before it can register signal handlers for ignoring it. + + - bpo-34248(181): Report filename in the exception raised when the + database file cannot be opened by *note dbm.gnu.open(): 147b. and + *note dbm.ndbm.open(): 147c. due to OS-related error. Patch by + Zsolt Cserna. + + - bpo-33089(182): Add math.dist() to compute the Euclidean distance + between two points. + + - bpo-34246(183): *note smtplib.SMTP.send_message(): ae1. no longer + modifies the content of the `mail_options' argument. Patch by + Pablo S. Blum de Aguiar. + + - bpo-31047(184): Fix ‘ntpath.abspath’ for invalid paths on windows. + Patch by Franz Woellert. + + - bpo-32321(185): Add pure Python fallback for functools.reduce. + Patch by Robert Wright. + + - bpo-34270(186): The default asyncio task class now always has a + name which can be get or set using two new methods (*note + get_name(): 621. and *note set_name(): 620.) and is visible in the + *note repr(): 3ee. output. An initial name can also be set using + the new ‘name’ keyword argument to *note asyncio.create_task(): + 1d2. or the ‘create_task()’ method of the event loop. If no + initial name is set, the default Task implementation generates a + name like ‘Task-1’ using a monotonic counter. + + - bpo-34263(187): asyncio’s event loop will not pass timeouts longer + than one day to epoll/select etc. + + - bpo-34035(188): Fix several AttributeError in zipfile seek() + methods. Patch by Mickaël Schoentgen. + + - bpo-32215(189): Fix performance regression in *note sqlite3: ef. + when a DML statement appeared in a different line than the rest of + the SQL query. + + - bpo-34075(190): Deprecate passing non-ThreadPoolExecutor instances + to ‘AbstractEventLoop.set_default_executor()’. + + - bpo-34251(191): Restore ‘msilib.Win64’ to preserve backwards + compatibility since it’s already used by *note distutils: 37.’ + ‘bdist_msi’ command. + + - bpo-19891(192): Ignore errors caused by missing / non-writable + homedir while writing history during exit of an interactive + session. Patch by Anthony Sottile. + + - bpo-33089(193): Enhanced math.hypot() to support more than two + dimensions. + + - bpo-34228(194): tracemalloc: PYTHONTRACEMALLOC=0 environment + variable and -X tracemalloc=0 command line option are now allowed + to disable explicitly tracemalloc at startup. + + - bpo-13041(195): Use *note shutil.get_terminal_size(): dae. to + calculate the terminal width correctly in the + ‘argparse.HelpFormatter’ class. Initial patch by Zbyszek + Jędrzejewski-Szmek. + + - bpo-34213(196): Allow frozen dataclasses to have a field named + “object”. Previously this conflicted with an internal use of + “object”. + + - bpo-34052(197): *note sqlite3.Connection.create_aggregate(): 13f3, + *note sqlite3.Connection.create_function(): 13f4, *note + sqlite3.Connection.set_authorizer(): 244, *note + sqlite3.Connection.set_progress_handler(): 13f5. 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. + + - bpo-34197(198): Attributes `skipinitialspace', `doublequote' and + `strict' of the `dialect' attribute of the *note csv: 28. reader + are now *note bool: 463. instances instead of integers 0 or 1. + + - bpo-32788(199): Errors other than *note TypeError: 19c. raised in + methods ‘__adapt__()’ and ‘__conform__()’ in the *note sqlite3: ef. + module are now propagated to the user. + + - bpo-21446(200): The *note reload: 147d. fixer now uses *note + importlib.reload(): 79d. instead of deprecated *note imp.reload(): + f81. + + - bpo-940286(201): pydoc’s ‘Helper.showtopic()’ method now prints the + cross references of a topic correctly. + + - bpo-34164(202): *note base64.b32decode(): cd1. could raise + UnboundLocalError or OverflowError for incorrect padding. Now it + always raises ‘base64.Error’ in these cases. + + - bpo-33729(203): Fixed issues with arguments parsing in *note + hashlib: 88. + + - bpo-34097(204): ZipFile can zip files older than 1980-01-01 and + newer than 2107-12-31 using a new ‘strict_timestamps’ parameter at + the cost of setting the timestamp to the limit. + + - bpo-34108(205): Remove extraneous CR in 2to3 refactor. + + - bpo-34070(206): Make sure to only check if the handle is a tty, + when opening a file with ‘buffering=-1’. + + - bpo-27494(207): Reverted bpo-27494(208). 2to3 rejects now a + trailing comma in generator expressions. + + - bpo-33967(209): functools.singledispatch now raises TypeError + instead of IndexError when no positional arguments are passed. + + - bpo-34041(210): Add the parameter `deterministic' to the *note + sqlite3.Connection.create_function(): 13f4. method. Patch by + Sergey Fedoseev. + + - bpo-34056(211): Ensure the loader shim created by ‘imp.load_module’ + always returns bytes from its ‘get_data()’ function. This fixes + using ‘imp.load_module’ with PEP 552(212) hash-based pycs. + + - bpo-34054(213): The multiprocessing module now uses the monotonic + clock *note time.monotonic(): b0a. instead of the system clock + *note time.time(): 736. to implement timeout. + + - bpo-34043(214): Optimize tarfile uncompress performance about 15% + when gzip is used. + + - bpo-34044(215): ‘subprocess.Popen’ now copies the `startupinfo' + argument to leave it unchanged: it will modify the copy, so that + the same ‘STARTUPINFO’ object can be used multiple times. + + - bpo-34010(216): Fixed a performance regression for reading streams + with tarfile. The buffered read should use a list, instead of + appending to a bytes object. + + - bpo-34019(217): webbrowser: Correct the arguments passed to Opera + Browser when opening a new URL using the ‘webbrowser’ module. + Patch by Bumsik Kim. + + - bpo-34003(218): csv.DictReader now creates dicts instead of + OrderedDicts. Patch by Michael Selik. + + - bpo-33978(219): Closed existing logging handlers before + reconfiguration via fileConfig and dictConfig. Patch by + Karthikeyan Singaravelan. + + - bpo-14117(220): 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. + + - bpo-33974(221): Fixed passing lists and tuples of strings + containing special characters ‘"’, ‘\’, ‘{’, ‘}’ and ‘\n’ as + options to *note ttk: 118. widgets. + + - bpo-27500(222): Fix getaddrinfo to resolve IPv6 addresses + correctly. + + - bpo-24567(223): Improve random.choices() to handle subnormal input + weights that could occasionally trigger an IndexError. + + - bpo-33871(224): Fixed integer overflow in *note os.readv(): 7ba, + *note os.writev(): 7bd, *note os.preadv(): 7b9. and *note + os.pwritev(): 7bc. and in *note os.sendfile(): 762. with `headers' + or `trailers' arguments (on BSD-based OSes and macOS). + + - bpo-25007(225): Add *note copy.copy(): 7cc. and *note + copy.deepcopy(): 7cd. support to zlib compressors and + decompressors. Patch by Zackery Spytz. + + - bpo-33929(226): 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. + + - bpo-33899(227): 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. + + - bpo-33897(228): Added a ‘force’ keyword argument to + logging.basicConfig(). + + - bpo-33695(229): *note shutil.copytree(): 675. uses *note + os.scandir(): 6b0. function and all copy functions depending from + it use cached *note os.stat(): 653. 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 *note + os.stat(): 653. syscalls is reduced by 38% making *note + shutil.copytree(): 675. especially faster on network filesystems. + (Contributed by Giampaolo Rodola’ in bpo-33695(230).) + + - bpo-33916(231): bz2 and lzma: When Decompressor.__init__() is + called twice, free the old lock to not leak memory. + + - bpo-32568(232): Make select.epoll() and its documentation + consistent regarding `sizehint' and `flags'. + + - bpo-33833(233): Fixed bug in asyncio where ProactorSocketTransport + logs AssertionError if force closed during write. + + - bpo-33663(234): Convert content length to string before putting to + header. + + - bpo-33721(235): *note os.path: c3. functions that return a boolean + result like *note exists(): 657, *note lexists(): 658, *note + isdir(): 659, *note isfile(): 65a, *note islink(): 655, and *note + ismount(): 65b, and *note pathlib.Path: 65f. methods that return a + boolean result like *note exists(): 660, *note is_dir(): 661, *note + is_file(): 662, *note is_mount(): 663, *note is_symlink(): 664, + *note is_block_device(): 665, *note is_char_device(): 666, *note + is_fifo(): 667, *note is_socket(): 668. now return ‘False’ instead + of raising *note ValueError: 1c8. or its subclasses *note + UnicodeEncodeError: 246. and *note UnicodeDecodeError: 65c. for + paths that contain characters or bytes unrepresentable at the OS + level. + + - bpo-26544(236): Fixed implementation of *note platform.libc_ver(): + 1466. It almost always returned version ‘2.9’ for glibc. + + - bpo-33843(237): Remove deprecated ‘cgi.escape’, ‘cgi.parse_qs’ and + ‘cgi.parse_qsl’. + + - bpo-33842(238): Remove ‘tarfile.filemode’ which is deprecated since + Python 3.3. + + - bpo-30167(239): Prevent site.main() exception if PYTHONSTARTUP is + set. Patch by Steve Weber. + + - bpo-33805(240): Improve error message of dataclasses.replace() when + an InitVar is not specified + + - bpo-33687(241): Fix the call to ‘os.chmod()’ for ‘uu.decode()’ if a + mode is given or decoded. Patch by Timo Furrer. + + - bpo-33812(242): Datetime instance d with non-None tzinfo, but with + d.tzinfo.utcoffset(d) returning None is now treated as naive by the + astimezone() method. + + - bpo-32108(243): In configparser, don’t clear section when it is + assigned to itself. + + - bpo-27397(244): Make email module properly handle invalid-length + base64 strings. + + - bpo-33578(245): Implement multibyte encoder/decoder state methods + + - bpo-30805(246): Avoid race condition with debug logging + + - bpo-33476(247): Fix _header_value_parser.py when address group is + missing final ‘;’. Contributed by Enrique Perez-Terron + + - bpo-33694(248): asyncio: Fix a race condition causing data loss on + pause_reading()/resume_reading() when using the ProactorEventLoop. + + - bpo-32493(249): Correct test for ‘uuid_enc_be’ availability in + ‘configure.ac’. Patch by Michael Felt. + + - bpo-33792(250): Add asyncio.WindowsSelectorEventLoopPolicy and + asyncio.WindowsProactorEventLoopPolicy. + + - bpo-33274(251): 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. + + - bpo-33778(252): Update ‘unicodedata’’s database to Unicode version + 11.0.0. + + - bpo-33165(253): Added a stacklevel parameter to logging calls to + allow use of wrapper/helper functions for logging APIs. + + - bpo-33770(254): improve base64 exception message for encoded inputs + of invalid length + + - bpo-33769(255): asyncio/start_tls: Fix error message; cancel + callbacks in case of an unhandled error; mark SSLTransport as + closed if it is aborted. + + - bpo-33767(256): The concatenation (‘+’) and repetition (‘*’) + sequence operations now raise *note TypeError: 19c. instead of + *note SystemError: 9b5. when performed on *note mmap.mmap: 64e. + objects. Patch by Zackery Spytz. + + - bpo-33734(257): asyncio/ssl: Fix AttributeError, increase default + handshake timeout + + - bpo-31014(258): Fixed creating a controller for *note webbrowser: + 133. when a user specifies a path to an entry in the BROWSER + environment variable. Based on patch by John Still. + + - bpo-2504(259): Add gettext.pgettext() and variants. + + - bpo-33197(260): Add description property for _ParameterKind + + - bpo-32751(261): When cancelling the task due to a timeout, *note + asyncio.wait_for(): 1d5. will now wait until the cancellation is + complete. + + - bpo-32684(262): Fix gather to propagate cancellation of itself even + with return_exceptions. + + - bpo-33654(263): Support protocol type switching in + SSLTransport.set_protocol(). + + - bpo-33674(264): Pause the transport as early as possible to further + reduce the risk of data_received() being called before + connection_made(). + + - bpo-33671(265): *note shutil.copyfile(): 6a9, *note shutil.copy(): + 6aa, *note shutil.copy2(): 6ab, *note shutil.copytree(): 675. and + *note shutil.move(): 6ac. use platform-specific fast-copy syscalls + on Linux and macOS in order to copy the file more efficiently. On + Windows *note shutil.copyfile(): 6a9. uses a bigger default buffer + size (1 MiB instead of 16 KiB) and a *note memoryview(): 6ad.-based + variant of *note shutil.copyfileobj(): 6ae. 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(266).) + + - bpo-33674(267): 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. + + - bpo-31647(268): Fixed bug where calling write_eof() on a + _SelectorSocketTransport after it’s already closed raises + AttributeError. + + - bpo-32610(269): Make asyncio.all_tasks() return only pending tasks. + + - bpo-32410(270): Avoid blocking on file IO in sendfile fallback code + + - bpo-33469(271): Fix RuntimeError after closing loop that used + run_in_executor + + - bpo-33672(272): Fix Task.__repr__ crash with Cython’s bogus + coroutines + + - bpo-33654(273): Fix transport.set_protocol() to support switching + between asyncio.Protocol and asyncio.BufferedProtocol. Fix + loop.start_tls() to work with asyncio.BufferedProtocols. + + - bpo-33652(274): Pickles of type variables and subscripted generics + are now future-proof and compatible with older Python versions. + + - bpo-32493(275): Fixed *note uuid.uuid1(): 80b. on FreeBSD. + + - bpo-33238(276): Add ‘InvalidStateError’ to *note + concurrent.futures: 20. ‘Future.set_result’ and + ‘Future.set_exception’ now raise ‘InvalidStateError’ if the futures + are not pending or running. Patch by Jason Haydaman. + + - bpo-33618(277): Finalize and document preliminary and experimental + TLS 1.3 support with OpenSSL 1.1.1 + + - bpo-33625(278): Release GIL on *note grp.getgrnam: 1476, *note + grp.getgrgid: 99b, *note pwd.getpwnam: 1475. and *note + pwd.getpwuid: 1465. if reentrant variants of these functions are + available. Patch by William Grzybowski. + + - bpo-33623(279): Fix possible SIGSGV when asyncio.Future is created + in __del__ + + - bpo-11874(280): Use a better regex when breaking usage into + wrappable parts. Avoids bogus assertion errors from custom metavar + strings. + + - bpo-30877(281): 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. + + - bpo-33604(282): Remove HMAC default to md5 marked for removal in + 3.8 (removal originally planned in 3.6, bump to 3.8 in PR 7062). + + - bpo-33582(283): Emit a deprecation warning for + inspect.formatargspec + + - bpo-21145(284): Add ‘functools.cached_property’ decorator, for + computed properties cached for the life of the instance. + + - bpo-33570(285): 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. + + - bpo-28556(286): Do not simplify arguments to *note typing.Union: + 214. Now ‘Union[Manager, Employee]’ is not simplified to + ‘Employee’ at runtime. Such simplification previously caused + several bugs and limited possibilities for introspection. + + - bpo-12486(287): *note tokenize.generate_tokens(): 147e. is now + documented as a public API to tokenize unicode strings. It was + previously present but undocumented. + + - bpo-33540(288): Add a new ‘block_on_close’ class attribute to + ‘ForkingMixIn’ and ‘ThreadingMixIn’ classes of *note socketserver: + ed. + + - bpo-33548(289): tempfile._candidate_tempdir_list should consider + common TEMP locations + + - bpo-33109(290): argparse subparsers are once again not required by + default, reverting the change in behavior introduced by + bpo-26510(291) in 3.7.0a2. + + - bpo-33541(292): Remove unused private method + ‘_strptime.LocaleTime.__pad’ (a.k.a. ‘_LocaleTime__pad’). + + - bpo-33536(293): dataclasses.make_dataclass now checks for invalid + field names and duplicate fields. Also, added a check for invalid + field specifications. + + - bpo-33542(294): Prevent ‘uuid.get_node’ from using a DUID instead + of a MAC on Windows. Patch by Zvi Effron + + - bpo-26819(295): Fix race condition with + ‘ReadTransport.resume_reading’ in Windows proactor event loop. + + - Fix failure in *note typing.get_type_hints(): 277. when ClassVar + was provided as a string forward reference. + + - bpo-33516(296): *note unittest.mock.MagicMock: b1d. now supports + the ‘__round__’ magic method. + + - bpo-28612(297): Added support for Site Maps to urllib’s + ‘RobotFileParser’ as *note RobotFileParser.site_maps(): 147f. + Patch by Lady Red, based on patch by Peter Wirtz. + + - bpo-28167(298): Remove platform.linux_distribution, which was + deprecated since 3.5. + + - bpo-33504(299): Switch the default dictionary implementation for + *note configparser: 21. from *note collections.OrderedDict: 1a8. to + the standard *note dict: 16e. type. + + - bpo-33505(300): Optimize asyncio.ensure_future() by reordering if + checks: 1.17x faster. + + - bpo-33497(301): Add errors param to cgi.parse_multipart and make an + encoding in FieldStorage use the given errors (needed for Twisted). + Patch by Amber Brown. + + - bpo-29235(302): The ‘cProfile.Profile’ class can now be used as a + context manager. Patch by Scott Sanderson. + + - bpo-33495(303): 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. + + - bpo-26103(304): Correct ‘inspect.isdatadescriptor’ to look for + ‘__set__’ or ‘__delete__’. Patch by Aaron Hall. + + - bpo-29209(305): Removed the ‘doctype()’ method and the `html' + parameter of the constructor of *note XMLParser: 6a3. The + ‘doctype()’ method defined in a subclass will no longer be called. + Deprecated methods ‘getchildren()’ and ‘getiterator()’ in the *note + ElementTree: 142. module emit now a *note DeprecationWarning: 2d4. + instead of *note PendingDeprecationWarning: 503. + + - bpo-33453(306): 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”). + + - bpo-28556(307): Minor fixes in typing module: add annotations to + ‘NamedTuple.__new__’, pass ‘*args’ and ‘**kwds’ in + ‘Generic.__new__’. Original PRs by Paulius Šarka and Chad + Dombrova. + + - bpo-33365(308): Print the header values besides the header keys + instead just the header keys if `debuglevel' is set to >0 in *note + http.client: 8f. Patch by Marco Strigl. + + - bpo-20087(309): Updated alias mapping with glibc 2.27 supported + locales. + + - bpo-33422(310): Fix trailing quotation marks getting deleted when + looking up byte/string literals on pydoc. Patch by Andrés Delfino. + + - bpo-28167(311): The function ‘platform.linux_distribution’ and + ‘platform.dist’ now trigger a ‘DeprecationWarning’ and have been + marked for removal in Python 3.8 + + - bpo-33281(312): Fix ctypes.util.find_library regression on macOS. + + - bpo-33311(313): 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. + + - bpo-27300(314): The file classes in `tempfile' now accept an + `errors' parameter that complements the already existing + `encoding'. Patch by Stephan Hohe. + + - bpo-32933(315): *note unittest.mock.mock_open(): 141c. now supports + iteration over the file contents. Patch by Tony Flury. + + - bpo-33217(316): Raise *note TypeError: 19c. when looking up + non-Enum objects in Enum classes and Enum members. + + - bpo-33197(317): Update error message when constructing invalid + inspect.Parameters Patch by Dong-hee Na. + + - bpo-33383(318): Fixed crash in the get() method of the *note + dbm.ndbm: 33. database object when it is called with a single + argument. + + - bpo-33375(319): 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. + + - bpo-33336(320): ‘imaplib’ now allows ‘MOVE’ command in + ‘IMAP4.uid()’ (RFC 6851: IMAP MOVE Extension) and potentially as a + name of supported method of ‘IMAP4’ object. + + - bpo-32455(321): Added `jump' parameter to *note dis.stack_effect(): + bcb. + + - bpo-27485(322): Rename and deprecate undocumented functions in + *note urllib.parse(): 129. + + - bpo-33332(323): Add ‘signal.valid_signals()’ to expose the POSIX + sigfillset() functionality. + + - bpo-33251(324): ‘ConfigParser.items()’ was fixed so that key-value + pairs passed in via *note vars: 1480. are not included in the + resulting output. + + - bpo-33329(325): Fix multiprocessing regression on newer glibcs + + - bpo-33334(326): *note dis.stack_effect(): bcb. now supports all + defined opcodes including NOP and EXTENDED_ARG. + + - bpo-991266(327): Fix quoting of the ‘Comment’ attribute of *note + http.cookies.SimpleCookie: 1481. + + - bpo-33131(328): Upgrade bundled version of pip to 10.0.1. + + - bpo-33308(329): Fixed a crash in the ‘parser’ module when + converting an ST object to a tree of tuples or lists with + ‘line_info=False’ and ‘col_info=True’. + + - bpo-23403(330): lib2to3 now uses pickle protocol 4 for pre-computed + grammars. + + - bpo-33266(331): lib2to3 now recognizes ‘rf'...'’ strings. + + - bpo-11594(332): Ensure line-endings are respected when using + lib2to3. + + - bpo-33254(333): Have *note importlib.resources.contents(): 1482. + and ‘importlib.abc.ResourceReader.contents()’ return an *note + iterable: ed9. instead of an *note iterator: 134f. + + - bpo-33265(334): ‘contextlib.ExitStack’ and + ‘contextlib.AsyncExitStack’ now use a method instead of a wrapper + function for exit callbacks. + + - bpo-33263(335): Fix FD leak in ‘_SelectorSocketTransport’ Patch by + Vlad Starostin. + + - bpo-33256(336): Fix display of ‘’ call in the html produced + by ‘cgitb.html()’. Patch by Stéphane Blondon. + + - bpo-33144(337): ‘random.Random()’ and its subclassing mechanism got + optimized to check only once at class/subclass instantiation time + whether its ‘getrandbits()’ method can be relied on by other + methods, including ‘randrange()’, for the generation of arbitrarily + large random integers. Patch by Wolfgang Maier. + + - bpo-33185(338): Fixed regression when running pydoc with the *note + -m: 1ae. switch. (The regression was introduced in 3.7.0b3 by the + resolution of bpo-33053(339)) + + This fix also changed pydoc to add ‘os.getcwd()’ to *note sys.path: + 162. when necessary, rather than adding ‘"."’. + + - bpo-29613(340): Added support for the ‘SameSite’ cookie flag to the + ‘http.cookies’ module. + + - bpo-33169(341): Delete entries of ‘None’ in *note + sys.path_importer_cache: 1b2. when + ‘importlib.machinery.invalidate_caches()’ is called. + + - bpo-33203(342): ‘random.Random.choice()’ now raises ‘IndexError’ + for empty sequences consistently even when called from subclasses + without a ‘getrandbits()’ implementation. + + - bpo-33224(343): Update difflib.mdiff() for PEP 479(344). Convert + an uncaught StopIteration in a generator into a return-statement. + + - bpo-33209(345): End framing at the end of C implementation of *note + pickle.Pickler.dump(): 1483. + + - bpo-32861(346): The urllib.robotparser’s ‘__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. + + - bpo-23403(347): ‘DEFAULT_PROTOCOL’ in *note pickle: c7. was bumped + to 4. Protocol 4 is described in PEP 3154(348) and available since + Python 3.4. It offers better performance and smaller size compared + to protocol 3 introduced in Python 3.0. + + - bpo-20104(349): Improved error handling and fixed a reference leak + in *note os.posix_spawn(): 6a8. + + - bpo-33106(350): Deleting a key from a read-only dbm database raises + module specific error instead of KeyError. + + - bpo-33175(351): In dataclasses, Field.__set_name__ now looks up the + __set_name__ special method on the class, not the instance, of the + default value. + + - bpo-32380(352): Create functools.singledispatchmethod to support + generic single dispatch on descriptors and methods. + + - bpo-33141(353): Have Field objects pass through __set_name__ to + their default values, if they have their own __set_name__. + + - bpo-33096(354): 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. + + - bpo-32873(355): 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. + + - bpo-33134(356): 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. + + - bpo-33127(357): The ssl module now compiles with LibreSSL 2.7.1. + + - bpo-32505(358): Raise TypeError if a member variable of a dataclass + is of type Field, but doesn’t have a type annotation. + + - bpo-33078(359): Fix the failure on OSX caused by the tests relying + on sem_getvalue + + - bpo-33116(360): Add ‘Field’ to dataclasses.__all__. + + - bpo-32896(361): Fix an error where subclassing a dataclass with a + field that uses a default_factory would generate an incorrect + class. + + - bpo-33100(362): 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. + + - bpo-32953(363): 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. + + - bpo-33097(364): Raise RuntimeError when ‘executor.submit’ is called + during interpreter shutdown. + + - bpo-32968(365): Modulo and floor division involving Fraction and + float should return float. + + - bpo-33061(366): Add missing ‘NoReturn’ to ‘__all__’ in typing.py + + - bpo-33078(367): Fix the size handling in multiprocessing.Queue when + a pickling error occurs. + + - bpo-33064(368): lib2to3 now properly supports trailing commas after + ‘*args’ and ‘**kwargs’ in function signatures. + + - bpo-33056(369): FIX properly close leaking fds in + concurrent.futures.ProcessPoolExecutor. + + - bpo-33021(370): Release the GIL during fstat() calls, avoiding hang + of all threads when calling mmap.mmap(), os.urandom(), and + random.seed(). Patch by Nir Soffer. + + - bpo-31804(371): Avoid failing in multiprocessing.Process if the + standard streams are closed or None at exit. + + - bpo-33034(372): Providing an explicit error message when casting + the port property to anything that is not an integer value using + ‘urlparse()’ and ‘urlsplit()’. Patch by Matt Eaton. + + - bpo-30249(373): Improve struct.unpack_from() exception messages for + problems with the buffer size and offset. + + - bpo-33037(374): Skip sending/receiving data after SSL transport + closing. + + - bpo-27683(375): Fix a regression in *note ipaddress: a0. that + result of ‘hosts()’ is empty when the network is constructed by a + tuple containing an integer mask and only 1 bit left for addresses. + + - bpo-22674(376): Add the strsignal() function in the signal module + that returns the system description of the given signal, as + returned by strsignal(3). + + - bpo-32999(377): Fix C implementation of ‘ABC.__subclasscheck__(cls, + subclass)’ crashed when ‘subclass’ is not a type object. + + - bpo-33009(378): Fix inspect.signature() for single-parameter + partialmethods. + + - bpo-32969(379): Expose several missing constants in zlib and fix + corresponding documentation. + + - bpo-32056(380): Improved exceptions raised for invalid number of + channels and sample width when read an audio file in modules *note + aifc: 4, *note wave: 131. and *note sunau: f7. + + - bpo-32970(381): Improved disassembly of the MAKE_FUNCTION + instruction. + + - bpo-32844(382): Fix wrong redirection of a low descriptor (0 or 1) + to stderr in subprocess if another low descriptor is closed. + + - bpo-32960(383): 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. + + - bpo-32713(384): Fixed tarfile.itn handling of out-of-bounds float + values. Patch by Joffrey Fuhrer. + + - bpo-32257(385): The ssl module now contains OP_NO_RENEGOTIATION + constant, available with OpenSSL 1.1.0h or 1.1.1. + + - bpo-32951(386): 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. + + - bpo-32929(387): 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. + + - bpo-32947(388): Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround + for TLSv1.3 for future compatibility with OpenSSL 1.1.1. + + - bpo-32146(389): Document the interaction between frozen executables + and the spawn and forkserver start methods in multiprocessing. + + - bpo-30622(390): The ssl module now detects missing NPN support in + LibreSSL. + + - bpo-32922(391): dbm.open() now encodes filename with the filesystem + encoding rather than default encoding. + + - bpo-32759(392): Free unused arenas in multiprocessing.heap. + + - bpo-32859(393): In ‘os.dup2’, don’t check every call whether the + ‘dup3’ syscall exists or not. + + - bpo-32556(394): nt._getfinalpathname, nt._getvolumepathname and + nt._getdiskusage now correctly convert from bytes. + + - bpo-21060(395): 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”. + + - bpo-32857(396): In *note tkinter: 10e, ‘after_cancel(None)’ now + raises a *note ValueError: 1c8. instead of canceling the first + scheduled function. Patch by Cheryl Sabella. + + - bpo-32852(397): Make sure sys.argv remains as a list when running + trace. + + - bpo-31333(398): ‘_abc’ module is added. It is a speedup module + with C implementations for various functions and methods in ‘abc’. + Creating an ABC subclass and calling ‘isinstance’ or ‘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 + ‘_abc_registry’, ‘_abc_cache’, and ‘_abc_negative_cache’. There + are three debugging helper methods that can be used instead + ‘_dump_registry’, ‘_abc_registry_clear’, and ‘_abc_caches_clear’. + + - bpo-32841(399): Fixed *note asyncio.Condition: 6c5. issue which + silently ignored cancellation after notifying and cancelling a + conditional lock. Patch by Bar Harel. + + - bpo-32819(400): 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. + + - bpo-19675(401): ‘multiprocessing.Pool’ no longer leaks processes if + its initialization fails. + + - bpo-32394(402): socket: Remove + TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older + version Windows during run-time. + + - bpo-31787(403): Fixed refleaks of ‘__init__()’ methods in various + modules. (Contributed by Oren Milman) + + - bpo-30157(404): Fixed guessing quote and delimiter in + csv.Sniffer.sniff() when only the last field is quoted. Patch by + Jake Davis. + + - bpo-30688(405): Added support of ‘\N{name}’ escapes in regular + expressions. Based on patch by Jonathan Eunice. + + - bpo-32792(406): collections.ChainMap() preserves the order of the + underlying mappings. + + - bpo-32775(407): *note fnmatch.translate(): 1484. 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. + + - bpo-32622(408): Implement native fast sendfile for Windows proactor + event loop. + + - bpo-32777(409): 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. + + - bpo-32647(410): The ctypes module used to depend on indirect + linking for dlopen. The shared extension is now explicitly linked + against libdl on platforms with dl. + + - bpo-32749(411): A *note dbm.dumb: 31. database opened with flags + ‘r’ is now read-only. *note dbm.dumb.open(): 6ee. with flags ‘r’ + and ‘w’ no longer creates a database if it does not exist. + + - bpo-32741(412): Implement ‘asyncio.TimerHandle.when()’ method. + + - bpo-32691(413): Use mod_spec.parent when running modules with pdb + + - bpo-32734(414): Fixed ‘asyncio.Lock()’ safety issue which allowed + acquiring and locking the same lock multiple times, without it + being free. Patch by Bar Harel. + + - bpo-32727(415): Do not include name field in SMTP envelope from + address. Patch by Stéphane Wirtel + + - bpo-31453(416): Add TLSVersion constants and + SSLContext.maximum_version / minimum_version attributes. The new + API wraps OpenSSL 1.1 + ‘https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html’ + feature. + + - bpo-24334(417): 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. + + - bpo-31848(418): Fix the error handling in Aifc_read.initfp() when + the SSND chunk is not found. Patch by Zackery Spytz. + + - bpo-32585(419): Add Ttk spinbox widget to *note tkinter.ttk: 118. + Patch by Alan D Moore. + + - bpo-32512(420): *note profile: d0. CLI accepts ‘-m module_name’ as + an alternative to script path. + + - bpo-8525(421): 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. + + - bpo-31639(422): http.server now exposes a ThreadingHTTPServer class + and uses it when the module is run with ‘-m’ to cope with web + browsers pre-opening sockets. + + - bpo-29877(423): compileall: import ProcessPoolExecutor only when + needed, preventing hangs on low resource platforms + + - bpo-32221(424): Various functions returning tuple containing IPv6 + addresses now omit ‘%scope’ part since the same information is + already encoded in `scopeid' tuple item. Especially this speeds up + ‘socket.recvfrom()’ when it receives multicast packet since useless + resolving of network interface name is omitted. + + - bpo-32147(425): *note binascii.unhexlify(): 1485. is now up to 2 + times faster. Patch by Sergey Fedoseev. + + - bpo-30693(426): The TarFile class now recurses directories in a + reproducible way. + + - bpo-30693(427): The ZipFile class now recurses directories in a + reproducible way. + + - bpo-31680(428): Added *note curses.ncurses_version: 62a. + + - bpo-31908(429): Fix output of cover files for ‘trace’ module + command-line tool. Previously emitted cover files only when + ‘--missing’ option was used. Patch by Michael Selik. + + - bpo-31608(430): Raise a ‘TypeError’ instead of crashing if a + ‘collections.deque’ subclass returns a non-deque from ‘__new__’. + Patch by Oren Milman. + + - bpo-31425(431): 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. + + - bpo-22005(432): Implemented unpickling instances of *note datetime: + 4be, *note date: 536. and *note time: 4bf. pickled by Python 2. + ‘encoding='latin1'’ should be used for successful decoding. + + - bpo-27645(433): *note sqlite3.Connection: 24c. now exposes a *note + backup: 7d9. method, if the underlying SQLite library is at version + 3.6.11 or higher. Patch by Lele Gaifax. + + - bpo-16865(434): Support arrays >=2GiB in *note ctypes: 29. Patch + by Segev Finer. + + - bpo-31508(435): Removed support of arguments in *note + tkinter.ttk.Treeview.selection: 6eb. It was deprecated in 3.6. + Use specialized methods like ‘selection_set’ for changing the + selection. + + - bpo-29456(436): Fix bugs in hangul normalization: u1176, u11a7 and + u11c3 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35845 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35864 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35537 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35847 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35813 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35780 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35537 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=23846 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=34323 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35674 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35733 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=35726 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=35719 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=35717 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=35699 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=32710 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=35702 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=32710 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=35682 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=35283 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=35664 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=35643 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=35619 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=28503 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=35614 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=35568 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=35588 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=35585 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30561 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=35537 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=35526 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=35523 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=31784 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=35513 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=35502 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=35348 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=35491 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=35477 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=31446 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=35471 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=23057 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=35052 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=20239 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=17185 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=35445 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=35415 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=35424 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=35330 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=35346 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=10496 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=10496 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=35389 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=35394 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=35310 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=35380 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=35341 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=35371 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=35346 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=35066 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=35345 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=35344 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=35312 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=35308 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=24746 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=28604 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=35277 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=24209 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=35226 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=29564 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=35189 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=30064 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=35186 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=35152 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=35062 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=35065 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=34160 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=35079 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=33710 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=35017 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=35024 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=35047 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=31047 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=35053 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=31553 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=34794 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=34909 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=35022 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=35008 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=23420 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=33947 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=34890 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=34521 + + (93) https://datatracker.ietf.org/doc/html/rfc3542.html + + (94) https://bugs.python.org/issue?@action=redirect&bpo=31522 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=34970 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=34969 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=16965 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=34966 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=34926 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=23831 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=34941 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=32680 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=34769 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=34936 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=34829 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=34911 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=34922 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=34925 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=34900 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=34844 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=34897 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=34871 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=34898 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=28441 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=34866 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=34711 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=34872 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=34849 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=34022 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=34819 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=34758 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=34789 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=34334 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=34687 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=5950 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=32892 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=34728 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=34738 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=34659 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=29577 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=34670 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=32718 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=31177 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=34672 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=34666 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=6721 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=34658 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=34652 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=34638 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=34536 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=34636 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=24412 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=34630 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=32490 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=34363 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=34625 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=32270 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=34622 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=34610 + + (150) https://bugs.python.org/issue?@action=redirect&bpo=34421 + + (151) https://bugs.python.org/issue?@action=redirect&bpo=34604 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=30977 + + (153) https://bugs.python.org/issue?@action=redirect&bpo=34574 + + (154) https://bugs.python.org/issue?@action=redirect&bpo=8110 + + (155) https://bugs.python.org/issue?@action=redirect&bpo=34530 + + (156) https://bugs.python.org/issue?@action=redirect&bpo=34563 + + (157) https://bugs.python.org/issue?@action=redirect&bpo=34558 + + (158) https://bugs.python.org/issue?@action=redirect&bpo=34282 + + (159) https://bugs.python.org/issue?@action=redirect&bpo=22872 + + (160) https://bugs.python.org/issue?@action=redirect&bpo=34515 + + (161) https://bugs.python.org/issue?@action=redirect&bpo=13312 + + (162) https://bugs.python.org/issue?@action=redirect&bpo=34472 + + (163) https://bugs.python.org/issue?@action=redirect&bpo=34454 + + (164) https://bugs.python.org/issue?@action=redirect&bpo=6700 + + (165) https://bugs.python.org/issue?@action=redirect&bpo=34171 + + (166) https://bugs.python.org/issue?@action=redirect&bpo=34441 + + (167) https://bugs.python.org/issue?@action=redirect&bpo=34427 + + (168) https://bugs.python.org/issue?@action=redirect&bpo=34412 + + (169) https://bugs.python.org/issue?@action=redirect&bpo=20849 + + (170) https://bugs.python.org/issue?@action=redirect&bpo=31715 + + (171) https://bugs.python.org/issue?@action=redirect&bpo=34384 + + (172) https://bugs.python.org/issue?@action=redirect&bpo=22602 + + (173) https://bugs.python.org/issue?@action=redirect&bpo=2122 + + (174) https://bugs.python.org/issue?@action=redirect&bpo=34341 + + (175) https://bugs.python.org/issue?@action=redirect&bpo=34333 + + (176) https://bugs.python.org/issue?@action=redirect&bpo=18540 + + (177) https://bugs.python.org/issue?@action=redirect&bpo=26502 + + (178) https://bugs.python.org/issue?@action=redirect&bpo=34318 + + (179) https://bugs.python.org/issue?@action=redirect&bpo=9372 + + (180) https://bugs.python.org/issue?@action=redirect&bpo=33613 + + (181) https://bugs.python.org/issue?@action=redirect&bpo=34248 + + (182) https://bugs.python.org/issue?@action=redirect&bpo=33089 + + (183) https://bugs.python.org/issue?@action=redirect&bpo=34246 + + (184) https://bugs.python.org/issue?@action=redirect&bpo=31047 + + (185) https://bugs.python.org/issue?@action=redirect&bpo=32321 + + (186) https://bugs.python.org/issue?@action=redirect&bpo=34270 + + (187) https://bugs.python.org/issue?@action=redirect&bpo=34263 + + (188) https://bugs.python.org/issue?@action=redirect&bpo=34035 + + (189) https://bugs.python.org/issue?@action=redirect&bpo=32215 + + (190) https://bugs.python.org/issue?@action=redirect&bpo=34075 + + (191) https://bugs.python.org/issue?@action=redirect&bpo=34251 + + (192) https://bugs.python.org/issue?@action=redirect&bpo=19891 + + (193) https://bugs.python.org/issue?@action=redirect&bpo=33089 + + (194) https://bugs.python.org/issue?@action=redirect&bpo=34228 + + (195) https://bugs.python.org/issue?@action=redirect&bpo=13041 + + (196) https://bugs.python.org/issue?@action=redirect&bpo=34213 + + (197) https://bugs.python.org/issue?@action=redirect&bpo=34052 + + (198) https://bugs.python.org/issue?@action=redirect&bpo=34197 + + (199) https://bugs.python.org/issue?@action=redirect&bpo=32788 + + (200) https://bugs.python.org/issue?@action=redirect&bpo=21446 + + (201) https://bugs.python.org/issue?@action=redirect&bpo=940286 + + (202) https://bugs.python.org/issue?@action=redirect&bpo=34164 + + (203) https://bugs.python.org/issue?@action=redirect&bpo=33729 + + (204) https://bugs.python.org/issue?@action=redirect&bpo=34097 + + (205) https://bugs.python.org/issue?@action=redirect&bpo=34108 + + (206) https://bugs.python.org/issue?@action=redirect&bpo=34070 + + (207) https://bugs.python.org/issue?@action=redirect&bpo=27494 + + (208) https://bugs.python.org/issue?@action=redirect&bpo=27494 + + (209) https://bugs.python.org/issue?@action=redirect&bpo=33967 + + (210) https://bugs.python.org/issue?@action=redirect&bpo=34041 + + (211) https://bugs.python.org/issue?@action=redirect&bpo=34056 + + (212) https://peps.python.org/pep-0552/ + + (213) https://bugs.python.org/issue?@action=redirect&bpo=34054 + + (214) https://bugs.python.org/issue?@action=redirect&bpo=34043 + + (215) https://bugs.python.org/issue?@action=redirect&bpo=34044 + + (216) https://bugs.python.org/issue?@action=redirect&bpo=34010 + + (217) https://bugs.python.org/issue?@action=redirect&bpo=34019 + + (218) https://bugs.python.org/issue?@action=redirect&bpo=34003 + + (219) https://bugs.python.org/issue?@action=redirect&bpo=33978 + + (220) https://bugs.python.org/issue?@action=redirect&bpo=14117 + + (221) https://bugs.python.org/issue?@action=redirect&bpo=33974 + + (222) https://bugs.python.org/issue?@action=redirect&bpo=27500 + + (223) https://bugs.python.org/issue?@action=redirect&bpo=24567 + + (224) https://bugs.python.org/issue?@action=redirect&bpo=33871 + + (225) https://bugs.python.org/issue?@action=redirect&bpo=25007 + + (226) https://bugs.python.org/issue?@action=redirect&bpo=33929 + + (227) https://bugs.python.org/issue?@action=redirect&bpo=33899 + + (228) https://bugs.python.org/issue?@action=redirect&bpo=33897 + + (229) https://bugs.python.org/issue?@action=redirect&bpo=33695 + + (230) https://bugs.python.org/issue?@action=redirect&bpo=33695 + + (231) https://bugs.python.org/issue?@action=redirect&bpo=33916 + + (232) https://bugs.python.org/issue?@action=redirect&bpo=32568 + + (233) https://bugs.python.org/issue?@action=redirect&bpo=33833 + + (234) https://bugs.python.org/issue?@action=redirect&bpo=33663 + + (235) https://bugs.python.org/issue?@action=redirect&bpo=33721 + + (236) https://bugs.python.org/issue?@action=redirect&bpo=26544 + + (237) https://bugs.python.org/issue?@action=redirect&bpo=33843 + + (238) https://bugs.python.org/issue?@action=redirect&bpo=33842 + + (239) https://bugs.python.org/issue?@action=redirect&bpo=30167 + + (240) https://bugs.python.org/issue?@action=redirect&bpo=33805 + + (241) https://bugs.python.org/issue?@action=redirect&bpo=33687 + + (242) https://bugs.python.org/issue?@action=redirect&bpo=33812 + + (243) https://bugs.python.org/issue?@action=redirect&bpo=32108 + + (244) https://bugs.python.org/issue?@action=redirect&bpo=27397 + + (245) https://bugs.python.org/issue?@action=redirect&bpo=33578 + + (246) https://bugs.python.org/issue?@action=redirect&bpo=30805 + + (247) https://bugs.python.org/issue?@action=redirect&bpo=33476 + + (248) https://bugs.python.org/issue?@action=redirect&bpo=33694 + + (249) https://bugs.python.org/issue?@action=redirect&bpo=32493 + + (250) https://bugs.python.org/issue?@action=redirect&bpo=33792 + + (251) https://bugs.python.org/issue?@action=redirect&bpo=33274 + + (252) https://bugs.python.org/issue?@action=redirect&bpo=33778 + + (253) https://bugs.python.org/issue?@action=redirect&bpo=33165 + + (254) https://bugs.python.org/issue?@action=redirect&bpo=33770 + + (255) https://bugs.python.org/issue?@action=redirect&bpo=33769 + + (256) https://bugs.python.org/issue?@action=redirect&bpo=33767 + + (257) https://bugs.python.org/issue?@action=redirect&bpo=33734 + + (258) https://bugs.python.org/issue?@action=redirect&bpo=31014 + + (259) https://bugs.python.org/issue?@action=redirect&bpo=2504 + + (260) https://bugs.python.org/issue?@action=redirect&bpo=33197 + + (261) https://bugs.python.org/issue?@action=redirect&bpo=32751 + + (262) https://bugs.python.org/issue?@action=redirect&bpo=32684 + + (263) https://bugs.python.org/issue?@action=redirect&bpo=33654 + + (264) https://bugs.python.org/issue?@action=redirect&bpo=33674 + + (265) https://bugs.python.org/issue?@action=redirect&bpo=33671 + + (266) https://bugs.python.org/issue?@action=redirect&bpo=25427 + + (267) https://bugs.python.org/issue?@action=redirect&bpo=33674 + + (268) https://bugs.python.org/issue?@action=redirect&bpo=31647 + + (269) https://bugs.python.org/issue?@action=redirect&bpo=32610 + + (270) https://bugs.python.org/issue?@action=redirect&bpo=32410 + + (271) https://bugs.python.org/issue?@action=redirect&bpo=33469 + + (272) https://bugs.python.org/issue?@action=redirect&bpo=33672 + + (273) https://bugs.python.org/issue?@action=redirect&bpo=33654 + + (274) https://bugs.python.org/issue?@action=redirect&bpo=33652 + + (275) https://bugs.python.org/issue?@action=redirect&bpo=32493 + + (276) https://bugs.python.org/issue?@action=redirect&bpo=33238 + + (277) https://bugs.python.org/issue?@action=redirect&bpo=33618 + + (278) https://bugs.python.org/issue?@action=redirect&bpo=33625 + + (279) https://bugs.python.org/issue?@action=redirect&bpo=33623 + + (280) https://bugs.python.org/issue?@action=redirect&bpo=11874 + + (281) https://bugs.python.org/issue?@action=redirect&bpo=30877 + + (282) https://bugs.python.org/issue?@action=redirect&bpo=33604 + + (283) https://bugs.python.org/issue?@action=redirect&bpo=33582 + + (284) https://bugs.python.org/issue?@action=redirect&bpo=21145 + + (285) https://bugs.python.org/issue?@action=redirect&bpo=33570 + + (286) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (287) https://bugs.python.org/issue?@action=redirect&bpo=12486 + + (288) https://bugs.python.org/issue?@action=redirect&bpo=33540 + + (289) https://bugs.python.org/issue?@action=redirect&bpo=33548 + + (290) https://bugs.python.org/issue?@action=redirect&bpo=33109 + + (291) https://bugs.python.org/issue?@action=redirect&bpo=26510 + + (292) https://bugs.python.org/issue?@action=redirect&bpo=33541 + + (293) https://bugs.python.org/issue?@action=redirect&bpo=33536 + + (294) https://bugs.python.org/issue?@action=redirect&bpo=33542 + + (295) https://bugs.python.org/issue?@action=redirect&bpo=26819 + + (296) https://bugs.python.org/issue?@action=redirect&bpo=33516 + + (297) https://bugs.python.org/issue?@action=redirect&bpo=28612 + + (298) https://bugs.python.org/issue?@action=redirect&bpo=28167 + + (299) https://bugs.python.org/issue?@action=redirect&bpo=33504 + + (300) https://bugs.python.org/issue?@action=redirect&bpo=33505 + + (301) https://bugs.python.org/issue?@action=redirect&bpo=33497 + + (302) https://bugs.python.org/issue?@action=redirect&bpo=29235 + + (303) https://bugs.python.org/issue?@action=redirect&bpo=33495 + + (304) https://bugs.python.org/issue?@action=redirect&bpo=26103 + + (305) https://bugs.python.org/issue?@action=redirect&bpo=29209 + + (306) https://bugs.python.org/issue?@action=redirect&bpo=33453 + + (307) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (308) https://bugs.python.org/issue?@action=redirect&bpo=33365 + + (309) https://bugs.python.org/issue?@action=redirect&bpo=20087 + + (310) https://bugs.python.org/issue?@action=redirect&bpo=33422 + + (311) https://bugs.python.org/issue?@action=redirect&bpo=28167 + + (312) https://bugs.python.org/issue?@action=redirect&bpo=33281 + + (313) https://bugs.python.org/issue?@action=redirect&bpo=33311 + + (314) https://bugs.python.org/issue?@action=redirect&bpo=27300 + + (315) https://bugs.python.org/issue?@action=redirect&bpo=32933 + + (316) https://bugs.python.org/issue?@action=redirect&bpo=33217 + + (317) https://bugs.python.org/issue?@action=redirect&bpo=33197 + + (318) https://bugs.python.org/issue?@action=redirect&bpo=33383 + + (319) https://bugs.python.org/issue?@action=redirect&bpo=33375 + + (320) https://bugs.python.org/issue?@action=redirect&bpo=33336 + + (321) https://bugs.python.org/issue?@action=redirect&bpo=32455 + + (322) https://bugs.python.org/issue?@action=redirect&bpo=27485 + + (323) https://bugs.python.org/issue?@action=redirect&bpo=33332 + + (324) https://bugs.python.org/issue?@action=redirect&bpo=33251 + + (325) https://bugs.python.org/issue?@action=redirect&bpo=33329 + + (326) https://bugs.python.org/issue?@action=redirect&bpo=33334 + + (327) https://bugs.python.org/issue?@action=redirect&bpo=991266 + + (328) https://bugs.python.org/issue?@action=redirect&bpo=33131 + + (329) https://bugs.python.org/issue?@action=redirect&bpo=33308 + + (330) https://bugs.python.org/issue?@action=redirect&bpo=23403 + + (331) https://bugs.python.org/issue?@action=redirect&bpo=33266 + + (332) https://bugs.python.org/issue?@action=redirect&bpo=11594 + + (333) https://bugs.python.org/issue?@action=redirect&bpo=33254 + + (334) https://bugs.python.org/issue?@action=redirect&bpo=33265 + + (335) https://bugs.python.org/issue?@action=redirect&bpo=33263 + + (336) https://bugs.python.org/issue?@action=redirect&bpo=33256 + + (337) https://bugs.python.org/issue?@action=redirect&bpo=33144 + + (338) https://bugs.python.org/issue?@action=redirect&bpo=33185 + + (339) https://bugs.python.org/issue?@action=redirect&bpo=33053 + + (340) https://bugs.python.org/issue?@action=redirect&bpo=29613 + + (341) https://bugs.python.org/issue?@action=redirect&bpo=33169 + + (342) https://bugs.python.org/issue?@action=redirect&bpo=33203 + + (343) https://bugs.python.org/issue?@action=redirect&bpo=33224 + + (344) https://peps.python.org/pep-0479/ + + (345) https://bugs.python.org/issue?@action=redirect&bpo=33209 + + (346) https://bugs.python.org/issue?@action=redirect&bpo=32861 + + (347) https://bugs.python.org/issue?@action=redirect&bpo=23403 + + (348) https://peps.python.org/pep-3154/ + + (349) https://bugs.python.org/issue?@action=redirect&bpo=20104 + + (350) https://bugs.python.org/issue?@action=redirect&bpo=33106 + + (351) https://bugs.python.org/issue?@action=redirect&bpo=33175 + + (352) https://bugs.python.org/issue?@action=redirect&bpo=32380 + + (353) https://bugs.python.org/issue?@action=redirect&bpo=33141 + + (354) https://bugs.python.org/issue?@action=redirect&bpo=33096 + + (355) https://bugs.python.org/issue?@action=redirect&bpo=32873 + + (356) https://bugs.python.org/issue?@action=redirect&bpo=33134 + + (357) https://bugs.python.org/issue?@action=redirect&bpo=33127 + + (358) https://bugs.python.org/issue?@action=redirect&bpo=32505 + + (359) https://bugs.python.org/issue?@action=redirect&bpo=33078 + + (360) https://bugs.python.org/issue?@action=redirect&bpo=33116 + + (361) https://bugs.python.org/issue?@action=redirect&bpo=32896 + + (362) https://bugs.python.org/issue?@action=redirect&bpo=33100 + + (363) https://bugs.python.org/issue?@action=redirect&bpo=32953 + + (364) https://bugs.python.org/issue?@action=redirect&bpo=33097 + + (365) https://bugs.python.org/issue?@action=redirect&bpo=32968 + + (366) https://bugs.python.org/issue?@action=redirect&bpo=33061 + + (367) https://bugs.python.org/issue?@action=redirect&bpo=33078 + + (368) https://bugs.python.org/issue?@action=redirect&bpo=33064 + + (369) https://bugs.python.org/issue?@action=redirect&bpo=33056 + + (370) https://bugs.python.org/issue?@action=redirect&bpo=33021 + + (371) https://bugs.python.org/issue?@action=redirect&bpo=31804 + + (372) https://bugs.python.org/issue?@action=redirect&bpo=33034 + + (373) https://bugs.python.org/issue?@action=redirect&bpo=30249 + + (374) https://bugs.python.org/issue?@action=redirect&bpo=33037 + + (375) https://bugs.python.org/issue?@action=redirect&bpo=27683 + + (376) https://bugs.python.org/issue?@action=redirect&bpo=22674 + + (377) https://bugs.python.org/issue?@action=redirect&bpo=32999 + + (378) https://bugs.python.org/issue?@action=redirect&bpo=33009 + + (379) https://bugs.python.org/issue?@action=redirect&bpo=32969 + + (380) https://bugs.python.org/issue?@action=redirect&bpo=32056 + + (381) https://bugs.python.org/issue?@action=redirect&bpo=32970 + + (382) https://bugs.python.org/issue?@action=redirect&bpo=32844 + + (383) https://bugs.python.org/issue?@action=redirect&bpo=32960 + + (384) https://bugs.python.org/issue?@action=redirect&bpo=32713 + + (385) https://bugs.python.org/issue?@action=redirect&bpo=32257 + + (386) https://bugs.python.org/issue?@action=redirect&bpo=32951 + + (387) https://bugs.python.org/issue?@action=redirect&bpo=32929 + + (388) https://bugs.python.org/issue?@action=redirect&bpo=32947 + + (389) https://bugs.python.org/issue?@action=redirect&bpo=32146 + + (390) https://bugs.python.org/issue?@action=redirect&bpo=30622 + + (391) https://bugs.python.org/issue?@action=redirect&bpo=32922 + + (392) https://bugs.python.org/issue?@action=redirect&bpo=32759 + + (393) https://bugs.python.org/issue?@action=redirect&bpo=32859 + + (394) https://bugs.python.org/issue?@action=redirect&bpo=32556 + + (395) https://bugs.python.org/issue?@action=redirect&bpo=21060 + + (396) https://bugs.python.org/issue?@action=redirect&bpo=32857 + + (397) https://bugs.python.org/issue?@action=redirect&bpo=32852 + + (398) https://bugs.python.org/issue?@action=redirect&bpo=31333 + + (399) https://bugs.python.org/issue?@action=redirect&bpo=32841 + + (400) https://bugs.python.org/issue?@action=redirect&bpo=32819 + + (401) https://bugs.python.org/issue?@action=redirect&bpo=19675 + + (402) https://bugs.python.org/issue?@action=redirect&bpo=32394 + + (403) https://bugs.python.org/issue?@action=redirect&bpo=31787 + + (404) https://bugs.python.org/issue?@action=redirect&bpo=30157 + + (405) https://bugs.python.org/issue?@action=redirect&bpo=30688 + + (406) https://bugs.python.org/issue?@action=redirect&bpo=32792 + + (407) https://bugs.python.org/issue?@action=redirect&bpo=32775 + + (408) https://bugs.python.org/issue?@action=redirect&bpo=32622 + + (409) https://bugs.python.org/issue?@action=redirect&bpo=32777 + + (410) https://bugs.python.org/issue?@action=redirect&bpo=32647 + + (411) https://bugs.python.org/issue?@action=redirect&bpo=32749 + + (412) https://bugs.python.org/issue?@action=redirect&bpo=32741 + + (413) https://bugs.python.org/issue?@action=redirect&bpo=32691 + + (414) https://bugs.python.org/issue?@action=redirect&bpo=32734 + + (415) https://bugs.python.org/issue?@action=redirect&bpo=32727 + + (416) https://bugs.python.org/issue?@action=redirect&bpo=31453 + + (417) https://bugs.python.org/issue?@action=redirect&bpo=24334 + + (418) https://bugs.python.org/issue?@action=redirect&bpo=31848 + + (419) https://bugs.python.org/issue?@action=redirect&bpo=32585 + + (420) https://bugs.python.org/issue?@action=redirect&bpo=32512 + + (421) https://bugs.python.org/issue?@action=redirect&bpo=8525 + + (422) https://bugs.python.org/issue?@action=redirect&bpo=31639 + + (423) https://bugs.python.org/issue?@action=redirect&bpo=29877 + + (424) https://bugs.python.org/issue?@action=redirect&bpo=32221 + + (425) https://bugs.python.org/issue?@action=redirect&bpo=32147 + + (426) https://bugs.python.org/issue?@action=redirect&bpo=30693 + + (427) https://bugs.python.org/issue?@action=redirect&bpo=30693 + + (428) https://bugs.python.org/issue?@action=redirect&bpo=31680 + + (429) https://bugs.python.org/issue?@action=redirect&bpo=31908 + + (430) https://bugs.python.org/issue?@action=redirect&bpo=31608 + + (431) https://bugs.python.org/issue?@action=redirect&bpo=31425 + + (432) https://bugs.python.org/issue?@action=redirect&bpo=22005 + + (433) https://bugs.python.org/issue?@action=redirect&bpo=27645 + + (434) https://bugs.python.org/issue?@action=redirect&bpo=16865 + + (435) https://bugs.python.org/issue?@action=redirect&bpo=31508 + + (436) https://bugs.python.org/issue?@action=redirect&bpo=29456 + + +File: python.info, Node: Documentation<34>, Next: Tests<33>, Prev: Library<34>, Up: Python 3 8 0 alpha 1 + +1.21.35.4 Documentation +....................... + + - bpo-21257(1): Document *note http.client.parse_headers(): 1487. + + - bpo-34764(2): Improve example of iter() with 2nd sentinel argument. + + - bpo-35564(3): Explicitly set master_doc variable in conf.py for + compliance with Sphinx 2.0 + + - bpo-35511(4): 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. + + - bpo-10536(5): Enhance the gettext docs. Patch by Éric Araujo + + - bpo-35089(6): Remove mention of ‘typing.io’ and ‘typing.re’. Their + types should be imported from ‘typing’ directly. + + - bpo-35038(7): Fix the documentation about an unexisting + ‘f_restricted’ attribute in the frame object. Patch by Stéphane + Wirtel + + - bpo-35042(8): Replace PEP XYZ by the pep role and allow to use the + direct links to the PEPs. + + - bpo-35044(9): Fix the documentation with the role ‘exc’ for the + appropriated exception. Patch by Stéphane Wirtel + + - bpo-35035(10): Rename documentation for *note email.utils: 71. to + ‘email.utils.rst’. + + - bpo-34967(11): Use app.add_object_type() instead of the deprecated + Sphinx function app.description_unit() + + - bpo-34913(12): Add documentation about the new command line + interface of the gzip module. + + - bpo-32174(13): chm document displays non-ASCII charaters properly + on some MBCS Windows systems. + + - bpo-11233(14): Create availability directive for documentation. + Original patch by Georg Brandl. + + - bpo-34790(15): Document how passing coroutines to asyncio.wait() + can be confusing. + + - bpo-34552(16): Make clear that ‘==’ operator sometimes is + equivalent to ‘is’. The ‘<’, ‘<=’, ‘>’ and ‘>=’ operators are only + defined where they make sense. + + - bpo-28617(17): Fixed info in the stdtypes docs concerning the types + that support membership tests. + + - bpo-20177(18): Migrate datetime.date.fromtimestamp to Argument + Clinic. Patch by Tim Hoffmann. + + - bpo-34065(19): Fix wrongly written basicConfig documentation markup + syntax + + - bpo-33460(20): replaced ellipsis with correct error codes in + tutorial chapter 3. + + - bpo-33847(21): Add ‘@’ operator entry to index. + + - bpo-33409(22): Clarified the relationship between PEP 538(23)’s + PYTHONCOERCECLOCALE and PEP 540’s PYTHONUTF8 mode. + + - bpo-33197(24): Add versionadded tag to the documentation of + ParameterKind.description + + - bpo-17045(25): 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. + + - bpo-33736(26): Improve the documentation of *note + asyncio.open_connection(): 76c, *note asyncio.start_server(): 76d. + and their UNIX socket counterparts. + + - bpo-23859(27): Document that *note asyncio.wait(): 591. does not + cancel its futures on timeout. + + - bpo-32436(28): Document PEP 567(29) changes to asyncio. + + - bpo-33604(30): Update HMAC md5 default to a DeprecationWarning, + bump removal to 3.8. + + - bpo-33594(31): Document ‘getargspec’, ‘from_function’ and + ‘from_builtin’ as deprecated in their respective docstring, and + include version since deprecation in DeprecationWarning message. + + - bpo-33503(32): Fix broken pypi link + + - bpo-33421(33): Add missing documentation for + ‘typing.AsyncContextManager’. + + - bpo-33487(34): 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. + + - bpo-33378(35): Add Korean language switcher for + ‘https://docs.python.org/3/’ + + - bpo-33276(36): Clarify that the ‘__path__’ attribute on modules + cannot be just any value. + + - bpo-33201(37): Modernize documentation for writing C extension + types. + + - bpo-33195(38): Deprecate ‘Py_UNICODE’ usage in ‘c-api/arg’ + document. ‘Py_UNICODE’ related APIs are deprecated since Python + 3.3, but it is missed in the document. + + - bpo-33126(39): Document PyBuffer_ToContiguous(). + + - bpo-27212(40): Modify documentation for the ‘islice()’ recipe to + consume initial values up to the start index. + + - bpo-28247(41): Update *note zipapp: 14c. documentation to describe + how to make standalone applications. + + - bpo-18802(42): Documentation changes for ipaddress. Patch by Jon + Foster and Berker Peksag. + + - bpo-27428(43): Update documentation to clarify that + ‘WindowsRegistryFinder’ implements ‘MetaPathFinder’. (Patch by + Himanshu Lakhara) + + - bpo-28124(44): 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. + + - bpo-17232(45): Clarify docs for -O and -OO. Patch by Terry Reedy. + + - bpo-32436(46): Add documentation for the contextvars module (PEP + 567). + + - bpo-32800(47): Update link to w3c doc for xml default namespaces. + + - bpo-11015(48): Update *note test.support: 102. documentation. + + - bpo-32613(49): Update the faq/windows.html to use the py command + from PEP 397 instead of python. + + - bpo-8722(50): Document ‘__getattr__()’ behavior when property + ‘get()’ method raises *note AttributeError: 19d. + + - bpo-32614(51): Modify RE examples in documentation to use raw + strings to prevent *note DeprecationWarning: 2d4. and add text to + REGEX HOWTO to highlight the deprecation. + + - bpo-20709(52): Remove the paragraph where we explain that + os.utime() does not support a directory as path under Windows. + Patch by Jan-Philip Gehrcke + + - bpo-32722(53): Remove the bad example in the tutorial of the + Generator Expression. Patch by Stéphane Wirtel + + - bpo-31972(54): Improve docstrings for *note pathlib.PurePath: 306. + subclasses. + + - bpo-30607(55): Use the externalized ‘python-docs-theme’ package + when building the documentation. + + - bpo-8243(56): Add a note about curses.addch and curses.addstr + exception behavior when writing outside a window, or pad. + + - bpo-32337(57): Update documentation related with ‘dict’ order. + + - bpo-25041(58): Document ‘AF_PACKET’ in the *note socket: ec. + module. + + - bpo-31432(59): Clarify meaning of CERT_NONE, CERT_OPTIONAL, and + CERT_REQUIRED flags for ssl.SSLContext.verify_mode. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21257 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34764 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35564 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35511 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=10536 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35089 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35038 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35042 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35044 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35035 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=34967 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=34913 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32174 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=11233 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=34790 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=34552 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28617 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=20177 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=34065 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=33460 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=33847 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=33409 + + (23) https://peps.python.org/pep-0538/ + + (24) https://bugs.python.org/issue?@action=redirect&bpo=33197 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=17045 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=33736 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=23859 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=32436 + + (29) https://peps.python.org/pep-0567/ + + (30) https://bugs.python.org/issue?@action=redirect&bpo=33604 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=33594 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=33503 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=33421 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=33487 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=33378 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=33276 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=33201 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=33195 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=33126 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=27212 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=28247 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=18802 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=27428 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=28124 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=17232 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=32436 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=32800 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=11015 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=32613 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=8722 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=32614 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=20709 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=32722 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=31972 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=30607 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=8243 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=32337 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=25041 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=31432 + + +File: python.info, Node: Tests<33>, Next: Build<34>, Prev: Documentation<34>, Up: Python 3 8 0 alpha 1 + +1.21.35.5 Tests +............... + + - bpo-35772(1): 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. + + - bpo-35045(2): Make ssl tests less strict and also accept TLSv1 as + system default. The changes unbreaks test_min_max_version on + Fedora 29. + + - bpo-32710(3): ‘test_asyncio/test_sendfile.py’ now resets the event + loop policy using ‘tearDownModule()’ as done in other tests, to + prevent a warning when running tests on Windows. + + - bpo-33717(4): test.pythoninfo now logs information of all clocks, + not only time.time() and time.perf_counter(). + + - bpo-35488(5): Add a test to pathlib’s Path.match() to verify it + does not support glob-style ** recursive pattern matching. + + - bpo-31731(6): Fix a race condition in ‘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. + + - bpo-35424(7): Fix test_multiprocessing_main_handling: use + ‘multiprocessing.Pool’ with a context manager and then explicitly + join the pool. + + - bpo-35519(8): Rename ‘test.bisect’ module to ‘test.bisect_cmd’ to + avoid conflict with *note bisect: 10. module when running directly + a test like ‘./python Lib/test/test_xmlrpc.py’. + + - bpo-35513(9): Replace *note time.time(): 736. with *note + time.monotonic(): b0a. in tests to measure time delta. + + - bpo-34279(10): *note test.support.run_unittest(): 1489. no longer + raise ‘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. + + - bpo-35412(11): Add testcase to ‘test_future4’: check unicode + literal. + + - bpo-26704(12): Added test demonstrating double-patching of an + instance method. Patch by Anthony Sottile. + + - bpo-33725(13): test_multiprocessing_fork may crash on recent + versions of macOS. Until the issue is resolved, skip the test on + macOS. + + - bpo-35352(14): Modify test_asyncio to use the certificate set from + the test directory. + + - bpo-35317(15): Fix ‘mktime()’ overflow error in ‘test_email’: run + ‘test_localtime_daylight_true_dst_true()’ and + ‘test_localtime_daylight_false_dst_true()’ with a specific + timezone. + + - bpo-21263(16): 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 + + - bpo-34279(17): 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. + + - bpo-34962(18): make docstest in Doc now passes., and is enforced in + CI + + - bpo-23596(19): Use argparse for the command line of the gzip + module. Patch by Antony Lee + + - bpo-34537(20): Fix ‘test_gdb.test_strings()’ when ‘LC_ALL=C’ and + GDB was compiled with Python 3.6 or earlier. + + - bpo-34587(21): 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. + + - bpo-34661(22): Fix test_shutil if unzip doesn’t support -t. + + - bpo-34200(23): 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. + + - bpo-34569(24): The experimental PEP 554 data channels now correctly + pass negative PyLong objects between subinterpreters on 32-bit + systems. Patch by Michael Felt. + + - bpo-34594(25): Fix usage of hardcoded ‘errno’ values in the tests. + + - bpo-34579(26): Fix test_embed for AIX Patch by Michael Felt + + - bpo-34542(27): Use 3072 RSA keys and SHA-256 signature for test + certs and keys. + + - bpo-11193(28): Remove special condition for AIX in + ‘test_subprocess.test_undecodable_env’ + + - bpo-34347(29): Fix ‘test_utf8_mode.test_cmd_line’ for AIX + + - bpo-34490(30): On AIX with AF_UNIX family sockets getsockname() + does not provide ‘sockname’, so skip calls to + transport.get_extra_info(‘sockname’) + + - bpo-34391(31): Fix ftplib test for TLS 1.3 by reading from data + socket. + + - bpo-11192(32): Fix ‘test_socket’ on AIX 6.1 and later IPv6 zone id + supports only supported by inet_pton6_zone() Switch to + runtime-based platform.system() to establish current platform + rather than build-time based sys.platform() + + - bpo-34399(33): Update all RSA keys and DH params to use at least + 2048 bits. + + - bpo-34373(34): Fix ‘test_mktime’ and ‘test_pthread_getcpuclickid’ + tests for AIX Add range checking for ‘_PyTime_localtime’ for AIX + Patch by Michael Felt + + - bpo-11191(35): Skip the distutils test ‘test_search_cpp’ when using + XLC as compiler patch by aixtools (Michael Felt) + + - Improved an error message when mock assert_has_calls fails. + + - bpo-33746(36): Fix test_unittest when run in verbose mode. + + - bpo-33901(37): Fix test_dbm_gnu on macOS with gdbm 1.15: add a + larger value to make sure that the file size changes. + + - bpo-33873(38): Fix a bug in ‘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). + + - bpo-33562(39): Check that a global asyncio event loop policy is not + left behind by any tests. + + - bpo-33655(40): Ignore test_posix_fallocate failures on BSD + platforms that might be due to running on ZFS. + + - bpo-32962(41): Fixed test_gdb when Python is compiled with flags + -mcet -fcf-protection -O0. + + - bpo-33358(42): Fix + ‘test_embed.test_pre_initialization_sys_options()’ when the + interpreter is built with ‘--enable-shared’. + + - bpo-32872(43): Avoid regrtest compatibility issue with namespace + packages. + + - bpo-32517(44): Fix failing ‘test_asyncio’ on macOS 10.12.2+ due to + transport of ‘KqueueSelector’ loop was not being closed. + + - bpo-32663(45): Making sure the ‘SMTPUTF8SimTests’ class of tests + gets run in test_smtplib.py. + + - bpo-27643(46): 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 + + - bpo-19417(47): Add test_bdb.py. + + - bpo-31809(48): Add tests to verify connection with secp ECDH + curves. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35772 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35045 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32710 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33717 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35488 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31731 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35424 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35519 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35513 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=34279 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35412 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26704 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=33725 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=35352 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=35317 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=21263 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=34279 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=34962 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=23596 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=34537 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=34587 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=34661 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=34200 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=34569 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=34594 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=34579 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=34542 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=11193 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=34347 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=34490 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=34391 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=11192 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=34399 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=34373 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=11191 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=33746 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=33901 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=33873 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=33562 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=33655 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=32962 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=33358 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=32872 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=32517 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=32663 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=27643 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=19417 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=31809 + + +File: python.info, Node: Build<34>, Next: Windows<32>, Prev: Tests<33>, Up: Python 3 8 0 alpha 1 + +1.21.35.6 Build +............... + + - bpo-34691(1): The _contextvars module is now built into the core + Python library on Windows. + + - bpo-35683(2): Improved Azure Pipelines build steps and now + verifying layouts correctly + + - bpo-35642(3): Remove asynciomodule.c from pythoncore.vcxproj + + - bpo-35550(4): Fix incorrect Solaris #ifdef checks to look for __sun + && __SVR4 instead of sun when compiling. + + - bpo-35499(5): ‘make profile-opt’ no longer replaces ‘CFLAGS_NODIST’ + with ‘CFLAGS’. It now adds profile-guided optimization (PGO) flags + to ‘CFLAGS_NODIST’: existing ‘CFLAGS_NODIST’ flags are kept. + + - bpo-35257(6): Avoid leaking the linker flags from Link Time + Optimizations (LTO) into distutils when compiling C extensions. + + - bpo-35351(7): When building Python with clang and LTO, LTO flags + are no longer passed into CFLAGS to build third-party C extensions + through distutils. + + - bpo-35139(8): Fix a compiler error when statically linking + ‘pyexpat’ in ‘Modules/Setup’. + + - bpo-35059(9): 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. + + - bpo-35011(10): 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. + + - bpo-28015(11): Have –with-lto works correctly with clang. + + - bpo-34765(12): Update the outdated install-sh file to the latest + revision from automake v1.16.1 + + - bpo-34585(13): 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. + + - bpo-34710(14): Fixed SSL module build with OpenSSL & pedantic + CFLAGS. + + - bpo-34582(15): Add JUnit XML output for regression tests and update + Azure DevOps builds. + + - bpo-34081(16): Make Sphinx warnings as errors in the Docs Makefile. + + - bpo-34555(17): Fix for case where it was not possible to have both + ‘HAVE_LINUX_VM_SOCKETS_H’ and ‘HAVE_SOCKADDR_ALG’ be undefined. + + - bpo-33015(18): Fix an undefined behaviour in the pthread + implementation of ‘PyThread_start_new_thread()’: add a function + wrapper to always return ‘NULL’. + + - bpo-34245(19): The Python shared library is now installed with + write permission (mode 0755), which is the standard way of + installing such libraries. + + - bpo-34121(20): Fix detection of C11 atomic support on clang. + + - bpo-32430(21): 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. + + - bpo-30345(22): Add -g to LDFLAGS when compiling with LTO to get + debug symbols. + + - bpo-5755(23): Move ‘-Wstrict-prototypes’ option to ‘CFLAGS_NODIST’ + from ‘OPT’. This option emitted annoying warnings when building + extension modules written in C++. + + - bpo-33614(24): Ensures module definition files for the stable ABI + on Windows are correctly regenerated. + + - bpo-33648(25): The –with-c-locale-warning configuration flag has + been removed. It has had no effect for about a year. + + - bpo-33522(26): Enable CI builds on Visual Studio Team Services at + ‘https://python.visualstudio.com/cpython’ + + - bpo-33512(27): configure’s check for “long double” has been + simplified + + - bpo-33483(28): C compiler is now correctly detected from the + standard environment variables. –without-gcc and –with-icc options + have been removed. + + - bpo-33394(29): Enable the verbose build for extension modules, when + GNU make is passed macros on the command line. + + - bpo-33393(30): Update config.guess and config.sub files. + + - bpo-33377(31): Add new triplets for mips r6 and riscv variants + (used in extension suffixes). + + - bpo-32232(32): By default, modules configured in ‘Modules/Setup’ + are no longer built with ‘-DPy_BUILD_CORE’. Instead, modules that + specifically need that preprocessor definition include it in their + individual entries. + + - bpo-33182(33): The embedding tests can once again be built with + clang 6.0 + + - bpo-33163(34): Upgrade pip to 9.0.3 and setuptools to v39.0.1. + + - bpo-33012(35): 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. + + - bpo-32898(36): Fix the python debug build when using COUNT_ALLOCS. + + - bpo-29442(37): Replace optparse with argparse in setup.py + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34691 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35683 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35642 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35550 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35499 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35257 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35351 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35139 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35059 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35011 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28015 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=34765 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=34585 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=34710 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=34582 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=34081 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=34555 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=33015 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=34245 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=34121 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32430 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30345 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=5755 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=33614 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=33648 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=33522 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=33512 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=33483 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=33394 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=33393 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=33377 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=32232 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=33182 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=33163 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=33012 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=32898 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=29442 + + +File: python.info, Node: Windows<32>, Next: macOS<23>, Prev: Build<34>, Up: Python 3 8 0 alpha 1 + +1.21.35.7 Windows +................. + + - bpo-35890(1): Fix API calling consistency of GetVersionEx and + wcstok. + + - bpo-32560(2): The ‘py’ launcher now forwards its ‘STARTUPINFO’ + structure to child processes. + + - bpo-35854(3): Fix EnvBuilder and –symlinks in venv on Windows + + - bpo-35811(4): Avoid propagating venv settings when launching via + py.exe + + - bpo-35797(5): Fix default executable used by the multiprocessing + module + + - bpo-35758(6): Allow building on ARM with MSVC. + + - bpo-29734(7): Fix handle leaks in os.stat on Windows. + + - bpo-35596(8): Use unchecked PYCs for the embeddable distro to avoid + zipimport restrictions. + + - bpo-35596(9): Fix vcruntime140.dll being added to embeddable distro + multiple times. + + - bpo-35402(10): Update Windows build to use Tcl and Tk 8.6.9 + + - bpo-35401(11): Updates Windows build to OpenSSL 1.1.0j + + - bpo-34977(12): venv on Windows will now use a python.exe redirector + rather than copying the actual binaries from the base environment. + + - bpo-34977(13): Adds support for building a Windows App Store + package + + - bpo-35067(14): Remove _distutils_findvs module and use vswhere.exe + instead. + + - bpo-32557(15): Allow shutil.disk_usage to take a file path on + Windows + + - bpo-34770(16): Fix a possible null pointer dereference in + pyshellext.cpp. + + - bpo-34603(17): Fix returning structs from functions produced by + MSVC + + - bpo-34581(18): Guard MSVC-specific code in socketmodule.c with + ‘#ifdef _MSC_VER’. + + - bpo-34532(19): Fixes exit code of list version arguments for + py.exe. + + - bpo-34062(20): Fixed the ‘–list’ and ‘–list-paths’ arguments for + the py.exe launcher + + - bpo-34225(21): Ensure INCLUDE and LIB directories do not end with a + backslash. + + - bpo-34011(22): 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. + + - bpo-34006(23): 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. + + - bpo-31546(24): 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. + + - bpo-30237(25): Output error when ReadConsole is canceled by + CancelSynchronousIo instead of crashing. + + - bpo-33895(26): GIL is released while calling functions that acquire + Windows loader lock. + + - bpo-33720(27): Reduces maximum marshal recursion depth on release + builds. + + - bpo-29097(28): Fix bug where ‘datetime.fromtimestamp()’ erroneously + throws an *note OSError: 413. on Windows for values between 0 and + 86400. Patch by Ammar Askar. + + - bpo-33316(29): PyThread_release_lock always fails + + - bpo-33184(30): Update Windows installer to use OpenSSL 1.1.0h. + + - bpo-32890(31): Fix usage of GetLastError() instead of errno in + os.execve() and os.truncate(). + + - bpo-33016(32): Fix potential use of uninitialized memory in + nt._getfinalpathname + + - bpo-32903(33): Fix a memory leak in os.chdir() on Windows if the + current directory is set to a UNC path. + + - bpo-32901(34): Update Tcl and Tk versions to 8.6.8 + + - bpo-31966(35): Fixed WindowsConsoleIO.write() for writing empty + data. + + - bpo-32409(36): Ensures activate.bat can handle Unicode contents. + + - bpo-32457(37): Improves handling of denormalized executable path + when launching Python. + + - bpo-32370(38): Use the correct encoding for ipconfig output in the + uuid module. Patch by Segev Finer. + + - bpo-29248(39): Fix *note os.readlink(): 568. on Windows, which was + mistakenly treating the ‘PrintNameOffset’ field of the reparse data + buffer as a number of characters instead of bytes. Patch by Craig + Holmquist and SSE4. + + - bpo-1104(40): Correctly handle string length in + ‘msilib.SummaryInfo.GetProperty()’ to prevent it from truncating + the last character. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35890 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32560 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35854 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35811 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35797 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35758 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29734 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35596 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35596 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=35402 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35401 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=34977 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=34977 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=35067 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=32557 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=34770 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=34603 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=34581 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=34532 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=34062 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=34225 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=34011 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=34006 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=31546 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=30237 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=33895 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=33720 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=29097 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=33316 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=33184 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=32890 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=33016 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=32903 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=32901 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=31966 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=32409 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=32457 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=32370 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=29248 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=1104 + + +File: python.info, Node: macOS<23>, Next: IDLE<25>, Prev: Windows<32>, Up: Python 3 8 0 alpha 1 + +1.21.35.8 macOS +............... + + - bpo-35401(1): Update macOS installer to use OpenSSL 1.1.0j. + + - bpo-35025(2): Properly guard the use of the ‘CLOCK_GETTIME’ et al. + macros in ‘timemodule’ on macOS. + + - bpo-24658(3): On macOS, fix reading from and writing into a file + with a size larger than 2 GiB. + + - bpo-34405(4): Update to OpenSSL 1.1.0i for macOS installer builds. + + - bpo-33635(5): 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. + + - bpo-13631(6): The .editrc file in user’s home directory is now + processed correctly during the readline initialization through + editline emulation on macOS. + + - bpo-33184(7): Update macOS installer build to use OpenSSL 1.1.0h. + + - bpo-32726(8): 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. + + - bpo-32901(9): Update macOS 10.9+ installer to Tcl/Tk 8.6.8. + + - bpo-31903(10): In ‘_scproxy’, drop the GIL when calling into + ‘SystemConfiguration’ to avoid deadlocks. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35401 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35025 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24658 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=34405 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33635 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=13631 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33184 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32726 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32901 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31903 + + +File: python.info, Node: IDLE<25>, Next: Tools/Demos<14>, Prev: macOS<23>, Up: Python 3 8 0 alpha 1 + +1.21.35.9 IDLE +.............. + + - bpo-35770(1): 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. + + - bpo-35769(2): Change IDLE’s new file name from ‘Untitled’ to + ‘untitled’ + + - bpo-35660(3): Fix imports in idlelib.window. + + - bpo-35641(4): Proper format ‘calltip’ when the function has no + docstring. + + - bpo-33987(5): Use ttk Frame for ttk widgets. + + - bpo-34055(6): Fix erroneous ‘smart’ indents and newlines in IDLE + Shell. + + - bpo-35591(7): Find Selection now works when selection not found. + + - bpo-35196(8): Speed up squeezer line counting. + + - bpo-35598(9): Update config_key: use PEP 8 names and ttk widgets, + make some objects global, and add tests. + + - bpo-28097(10): Add Previous/Next History entries to Shell menu. + + - bpo-35208(11): Squeezer now properly counts wrapped lines before + newlines. + + - bpo-35555(12): Gray out Code Context menu entry when it’s not + applicable. + + - bpo-35521(13): Document the IDLE editor code context feature. Add + some internal references within the IDLE doc. + + - bpo-22703(14): 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. + + - bpo-35213(15): Where appropriate, use ‘macOS’ in idlelib. + + - bpo-34864(16): On macOS, warn if the system preference “Prefer tabs + when opening documents” is set to “Always”. + + - bpo-34864(17): 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. + + - bpo-35202(18): Remove unused imports from lib/idlelib + + - bpo-33000(19): Document that IDLE’s shell has no line limit. A + program that runs indefinitely can overfill memory. + + - bpo-23220(20): Explain how IDLE’s Shell displays output. + + - bpo-35099(21): 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 sys.stdxxx objects. + + - bpo-35097(22): Add IDLE doc subsection explaining editor windows. + Topics include opening, title and status bar, .py* extension, and + running. + + - bpo-35093(23): Document the IDLE document viewer in the IDLE doc. + Add a paragraph in “Help and preferences”, “Help sources” + subsection. + + - bpo-35088(24): Update idlelib.help.copy_string docstring. We now + use git and backporting instead of hg and forward merging. + + - bpo-35087(25): Update idlelib help files for the current doc build. + The main change is the elimination of chapter-section numbers. + + - bpo-34548(26): Use configured color theme for read-only text views. + + - bpo-1529353(27): 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”. + + - bpo-34047(28): Fixed mousewheel scrolling direction on macOS. + + - bpo-34275(29): Make IDLE calltips always visible on Mac. Some + MacOS-tk combinations need .update_idletasks(). Patch by Kevin + Walzer. + + - bpo-34120(30): Fix unresponsiveness after closing certain windows + and dialogs. + + - bpo-33975(31): 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. + + - bpo-33905(32): Add test for idlelib.stackview.StackBrowser. + + - bpo-33924(33): Change mainmenu.menudefs key ‘windows’ to ‘window’. + Every other menudef key is lowercase version of main menu entry. + + - bpo-33906(34): Rename idlelib.windows as window Match Window on the + main menu and remove last plural module name. + + - bpo-33917(35): 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. + + - bpo-33904(36): IDLE: In rstrip, rename class RstripExtension as + Rstrip + + - bpo-33907(37): 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. + + - bpo-33856(38): Add “help” in the welcome message of IDLE + + - bpo-33839(39): IDLE: refactor ToolTip and CallTip and add + documentation and tests + + - bpo-33855(40): Minimally test all IDLE modules. Add missing files, + import module, instantiate classes, and check coverage. Check + existing files. + + - bpo-33656(41): 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. + + - bpo-33768(42): Clicking on a context line moves that line to the + top of the editor window. + + - bpo-33763(43): IDLE: Use read-only text widget for code context + instead of label widget. + + - bpo-33664(44): 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. + + - bpo-33679(45): 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. + + - bpo-33642(46): Display up to maxlines non-blank lines for Code + Context. If there is no current context, show a single blank line. + + - bpo-33628(47): IDLE: Cleanup codecontext.py and its test. + + - bpo-33564(48): IDLE’s code context now recognizes async as a block + opener. + + - bpo-21474(49): 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. + + - bpo-33204(50): 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. + + - bpo-32984(51): Set ‘__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, + ‘-s’ runs a file named in environmental variable ‘IDLESTARTUP’ or + *note PYTHONSTARTUP: c6a.; ‘-r file’ runs ‘file’. Python sets + ‘__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 ‘-n’ option. + + - bpo-32940(52): Simplify and rename StringTranslatePseudoMapping in + pyparse. + + - bpo-32916(53): Change ‘str’ to ‘code’ in pyparse. + + - bpo-32905(54): Remove unused code in pyparse module. + + - bpo-32874(55): Add tests for pyparse. + + - bpo-32837(56): Using the system and place-dependent default + encoding for open() is a bad idea for IDLE’s system and + location-independent files. + + - bpo-32826(57): 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. + + - bpo-32831(58): Add docstrings and tests for codecontext. + + - bpo-32765(59): Update configdialog General tab docstring to add new + widgets to the widget list. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35770 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=35769 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35660 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35641 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33987 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=34055 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35591 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35196 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35598 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28097 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=35208 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=35555 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=35521 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=22703 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=35213 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=34864 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=34864 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=35202 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=33000 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23220 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=35099 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=35097 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=35093 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=35088 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=35087 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=34548 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=1529353 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=34047 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=34275 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=34120 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=33975 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=33905 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=33924 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=33906 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=33917 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=33904 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=33907 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=33856 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=33839 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=33855 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=33656 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=33768 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=33763 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=33664 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=33679 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=33642 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=33628 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=33564 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=21474 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=33204 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=32984 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=32940 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=32916 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=32905 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=32874 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=32837 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=32826 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=32831 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=32765 + + +File: python.info, Node: Tools/Demos<14>, Next: C API<31>, Prev: IDLE<25>, Up: Python 3 8 0 alpha 1 + +1.21.35.10 Tools/Demos +...................... + + - bpo-35884(1): Add a benchmark script for timing various ways to + access variables: ‘Tools/scripts/var_access_benchmark.py’. + + - bpo-34989(2): python-gdb.py now handles errors on computing the + line number of a Python frame. + + - bpo-20260(3): Argument Clinic now has non-bitwise unsigned int + converters. + + - bpo-32962(4): python-gdb now catches ‘UnicodeDecodeError’ + exceptions when calling ‘string()’. + + - bpo-32962(5): python-gdb now catches ValueError on read_var(): when + Python has no debug symbols for example. + + - bpo-33189(6): ‘pygettext.py’ now recognizes only literal strings as + docstrings and translatable strings, and rejects bytes literals and + f-string expressions. + + - bpo-31920(7): Fixed handling directories as arguments in the + ‘pygettext’ script. Based on patch by Oleg Krasnikov. + + - bpo-29673(8): Fix pystackv and pystack gdbinit macros. + + - bpo-25427(9): Remove the pyvenv script in favor of ‘python3 -m + venv’ in order to lower confusion as to what Python interpreter a + virtual environment will be created for. + + - bpo-32885(10): Add an ‘-n’ flag for ‘Tools/scripts/pathfix.py’ to + disable automatic backup creation (files with ‘~’ suffix). + + - bpo-32222(11): Fix pygettext not extracting docstrings for + functions with type annotated arguments. Patch by Toby Harradine. + + - bpo-31583(12): Fix 2to3 for using with –add-suffix option but + without –output-dir option for relative path to files in current + directory. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35884 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=34989 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20260 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32962 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32962 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33189 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31920 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29673 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25427 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32885 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32222 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31583 + + +File: python.info, Node: C API<31>, Prev: Tools/Demos<14>, Up: Python 3 8 0 alpha 1 + +1.21.35.11 C API +................ + + - bpo-35713(1): The ‘PyByteArray_Init()’ and ‘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. + + - bpo-33817(2): Fixed *note _PyBytes_Resize(): 1490. for empty bytes + objects. + + - bpo-35322(3): Fix memory leak in *note PyUnicode_EncodeLocale(): + 830. and *note PyUnicode_EncodeFSDefault(): 1491. on error + handling. + + - bpo-35059(4): The following C macros have been converted to static + inline functions: *note Py_INCREF(): 4cc, *note Py_DECREF(): 4cd, + *note Py_XINCREF(): 6b6, *note Py_XDECREF(): 363, + ‘PyObject_INIT()’, ‘PyObject_INIT_VAR()’. + + - bpo-35296(5): ‘make install’ now also installs the internal API: + ‘Include/internal/*.h’ header files. + + - bpo-35081(6): Internal APIs surrounded by ‘#ifdef Py_BUILD_CORE’ + have been moved from ‘Include/*.h’ headers to new header files + ‘Include/internal/pycore_*.h’. + + - bpo-35259(7): Conditionally declare *note Py_FinalizeEx(): 986. + (new in 3.6) based on Py_LIMITED_API. Patch by Arthur Neufeld. + + - bpo-35081(8): The ‘_PyObject_GC_TRACK()’ and + ‘_PyObject_GC_UNTRACK()’ macros have been removed from the public C + API. + + - bpo-35134(9): Creation of a new ‘Include/cpython/’ subdirectory. + + - bpo-34725(10): Adds _Py_SetProgramFullPath so embedders may + override sys.executable + + - bpo-34910(11): Ensure that *note PyObject_Print(): 1492. always + returns ‘-1’ on error. Patch by Zackery Spytz. + + - bpo-34523(12): Py_DecodeLocale() and Py_EncodeLocale() now use the + UTF-8 encoding on Windows if Py_LegacyWindowsFSEncodingFlag is + zero. + + - bpo-34193(13): Fix pluralization in TypeError messages in getargs.c + and typeobject.c: ‘1 argument’ instead of ‘1 arguments’ and ‘1 + element’ instead of ‘1 elements’. + + - bpo-34127(14): Return grammatically correct error message based on + argument count. Patch by Karthikeyan Singaravelan. + + - bpo-23927(15): Fixed *note SystemError: 9b5. in *note + PyArg_ParseTupleAndKeywords(): 987. when the ‘w*’ format unit is + used for optional parameter. + + - bpo-32455(16): Added ‘PyCompile_OpcodeStackEffectWithJump()’. + + - bpo-34008(17): Py_Main() can again be called after Py_Initialize(), + as in Python 3.6. + + - bpo-32500(18): Fixed error messages for *note PySequence_Size(): + 1493, *note PySequence_GetItem(): 1494, *note PySequence_SetItem(): + 1495. and *note PySequence_DelItem(): 1496. called with a mapping + and *note PyMapping_Size(): 1497. called with a sequence. + + - bpo-33818(19): ‘PyExceptionClass_Name()’ will now return ‘const + char *’ instead of ‘char *’. + + - bpo-33042(20): Embedding applications may once again call + PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption + prior to calling Py_Initialize. + + - bpo-32374(21): Document that m_traverse for multi-phase initialized + modules can be called with m_state=NULL, and add a sanity check + + - bpo-30863(22): *note PyUnicode_AsWideChar(): 1498. and *note + PyUnicode_AsWideCharString(): 4f9. no longer cache the ‘wchar_t*’ + representation of string objects. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=35713 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33817 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=35322 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=35059 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=35296 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=35081 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=35259 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=35081 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=35134 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=34725 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=34910 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=34523 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=34193 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=34127 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=23927 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=32455 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=34008 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=32500 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=33818 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=33042 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32374 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30863 + + +File: python.info, Node: Python 3 7 0 final, Next: Python 3 7 0 release candidate 1, Prev: Python 3 8 0 alpha 1, Up: Changelog + +1.21.36 Python 3.7.0 final +-------------------------- + +`Release date: 2018-06-27' + +* Menu: + +* Library: Library<35>. +* C API: C API<32>. + + +File: python.info, Node: Library<35>, Next: C API<32>, Up: Python 3 7 0 final + +1.21.36.1 Library +................. + + - bpo-33851(1): Fix *note ast.get_docstring(): 149b. for a node that + lacks a docstring. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33851 + + +File: python.info, Node: C API<32>, Prev: Library<35>, Up: Python 3 7 0 final + +1.21.36.2 C API +............... + + - bpo-33932(1): Calling Py_Initialize() twice does nothing, instead + of failing with a fatal error: restore the Python 3.6 behaviour. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33932 + + +File: python.info, Node: Python 3 7 0 release candidate 1, Next: Python 3 7 0 beta 5, Prev: Python 3 7 0 final, Up: Changelog + +1.21.37 Python 3.7.0 release candidate 1 +---------------------------------------- + +`Release date: 2018-06-12' + +* Menu: + +* Core and Builtins: Core and Builtins<36>. +* Library: Library<36>. +* Documentation: Documentation<35>. +* Build: Build<35>. +* Windows: Windows<33>. +* IDLE: IDLE<26>. + + +File: python.info, Node: Core and Builtins<36>, Next: Library<36>, Up: Python 3 7 0 release candidate 1 + +1.21.37.1 Core and Builtins +........................... + + - bpo-33803(1): Fix a crash in hamt.c caused by enabling GC tracking + for an object that hadn’t all of its fields set to NULL. + + - bpo-33706(2): Fix a crash in Python initialization when parsing the + command line options. Thanks Christoph Gohlke for the bug report + and the fix! + + - bpo-30654(3): 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. + + - bpo-31849(4): Fix signed/unsigned comparison warning in pyhash.c. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33803 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33706 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30654 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31849 + + +File: python.info, Node: Library<36>, Next: Documentation<35>, Prev: Core and Builtins<36>, Up: Python 3 7 0 release candidate 1 + +1.21.37.2 Library +................. + + - bpo-30167(1): Prevent site.main() exception if PYTHONSTARTUP is + set. Patch by Steve Weber. + + - bpo-33812(2): Datetime instance d with non-None tzinfo, but with + d.tzinfo.utcoffset(d) returning None is now treated as naive by the + astimezone() method. + + - bpo-30805(3): Avoid race condition with debug logging + + - bpo-33694(4): asyncio: Fix a race condition causing data loss on + pause_reading()/resume_reading() when using the ProactorEventLoop. + + - bpo-32493(5): Correct test for ‘uuid_enc_be’ availability in + ‘configure.ac’. Patch by Michael Felt. + + - bpo-33792(6): Add asyncio.WindowsSelectorEventLoopPolicy and + asyncio.WindowsProactorEventLoopPolicy. + + - bpo-33778(7): Update ‘unicodedata’’s database to Unicode version + 11.0.0. + + - bpo-33770(8): improve base64 exception message for encoded inputs + of invalid length + + - bpo-33769(9): asyncio/start_tls: Fix error message; cancel + callbacks in case of an unhandled error; mark SSLTransport as + closed if it is aborted. + + - bpo-33767(10): The concatenation (‘+’) and repetition (‘*’) + sequence operations now raise *note TypeError: 19c. instead of + *note SystemError: 9b5. when performed on *note mmap.mmap: 64e. + objects. Patch by Zackery Spytz. + + - bpo-33734(11): asyncio/ssl: Fix AttributeError, increase default + handshake timeout + + - bpo-11874(12): Use a better regex when breaking usage into + wrappable parts. Avoids bogus assertion errors from custom metavar + strings. + + - bpo-33582(13): Emit a deprecation warning for inspect.formatargspec + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30167 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33812 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30805 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33694 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32493 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33792 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33778 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33770 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33769 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33767 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33734 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=11874 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=33582 + + +File: python.info, Node: Documentation<35>, Next: Build<35>, Prev: Library<36>, Up: Python 3 7 0 release candidate 1 + +1.21.37.3 Documentation +....................... + + - bpo-33409(1): Clarified the relationship between PEP 538(2)’s + PYTHONCOERCECLOCALE and PEP 540’s PYTHONUTF8 mode. + + - bpo-33736(3): Improve the documentation of *note + asyncio.open_connection(): 76c, *note asyncio.start_server(): 76d. + and their UNIX socket counterparts. + + - bpo-31432(4): Clarify meaning of CERT_NONE, CERT_OPTIONAL, and + CERT_REQUIRED flags for ssl.SSLContext.verify_mode. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33409 + + (2) https://peps.python.org/pep-0538/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33736 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31432 + + +File: python.info, Node: Build<35>, Next: Windows<33>, Prev: Documentation<35>, Up: Python 3 7 0 release candidate 1 + +1.21.37.4 Build +............... + + - bpo-5755(1): Move ‘-Wstrict-prototypes’ option to ‘CFLAGS_NODIST’ + from ‘OPT’. This option emitted annoying warnings when building + extension modules written in C++. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5755 + + +File: python.info, Node: Windows<33>, Next: IDLE<26>, Prev: Build<35>, Up: Python 3 7 0 release candidate 1 + +1.21.37.5 Windows +................. + + - bpo-33720(1): Reduces maximum marshal recursion depth on release + builds. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33720 + + +File: python.info, Node: IDLE<26>, Prev: Windows<33>, Up: Python 3 7 0 release candidate 1 + +1.21.37.6 IDLE +.............. + + - bpo-33656(1): 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. + + - bpo-33768(2): Clicking on a context line moves that line to the top + of the editor window. + + - bpo-33763(3): IDLE: Use read-only text widget for code context + instead of label widget. + + - bpo-33664(4): 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. + + - bpo-33679(5): 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. + + - bpo-33642(6): Display up to maxlines non-blank lines for Code + Context. If there is no current context, show a single blank line. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33656 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33768 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33763 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33664 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33679 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33642 + + +File: python.info, Node: Python 3 7 0 beta 5, Next: Python 3 7 0 beta 4, Prev: Python 3 7 0 release candidate 1, Up: Changelog + +1.21.38 Python 3.7.0 beta 5 +--------------------------- + +`Release date: 2018-05-30' + +* Menu: + +* Core and Builtins: Core and Builtins<37>. +* Library: Library<37>. +* Documentation: Documentation<36>. +* Tests: Tests<34>. +* Build: Build<36>. +* macOS: macOS<24>. +* IDLE: IDLE<27>. + + +File: python.info, Node: Core and Builtins<37>, Next: Library<37>, Up: Python 3 7 0 beta 5 + +1.21.38.1 Core and Builtins +........................... + + - bpo-33622(1): Fixed a leak when the garbage collector fails to add + an object with the ‘__del__’ method or referenced by it into the + *note gc.garbage: e74. list. *note PyGC_Collect(): 5e4. can now be + called when an exception is set and preserves it. + + - bpo-33509(2): Fix module_globals parameter of + warnings.warn_explicit(): don’t crash if module_globals is not a + dict. + + - bpo-20104(3): The new *note os.posix_spawn: 6a8. 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. + + - bpo-33475(4): Fixed miscellaneous bugs in converting annotations to + strings and optimized parentheses in the string representation. + + - bpo-33391(5): Fix a leak in set_symmetric_difference(). + + - bpo-28055(6): Fix unaligned accesses in siphash24(). Patch by Rolf + Eike Beer. + + - bpo-32911(7): Due to unexpected compatibility issues discovered + during downstream beta testing, reverted bpo-29463(8). ‘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. + + - bpo-21983(9): Fix a crash in *note ctypes.cast(): 1461. in case the + type argument is a ctypes structured data type. Patch by Eryk Sun + and Oren Milman. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33622 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33509 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20104 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33475 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33391 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28055 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32911 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29463 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=21983 + + +File: python.info, Node: Library<37>, Next: Documentation<36>, Prev: Core and Builtins<37>, Up: Python 3 7 0 beta 5 + +1.21.38.2 Library +................. + + - bpo-32751(1): When cancelling the task due to a timeout, *note + asyncio.wait_for(): 1d5. will now wait until the cancellation is + complete. + + - bpo-32684(2): Fix gather to propagate cancellation of itself even + with return_exceptions. + + - bpo-33654(3): Support protocol type switching in + SSLTransport.set_protocol(). + + - bpo-33674(4): Pause the transport as early as possible to further + reduce the risk of data_received() being called before + connection_made(). + + - bpo-33674(5): 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. + + - bpo-31647(6): Fixed bug where calling write_eof() on a + _SelectorSocketTransport after it’s already closed raises + AttributeError. + + - bpo-32610(7): Make asyncio.all_tasks() return only pending tasks. + + - bpo-32410(8): Avoid blocking on file IO in sendfile fallback code + + - bpo-33469(9): Fix RuntimeError after closing loop that used + run_in_executor + + - bpo-33672(10): Fix Task.__repr__ crash with Cython’s bogus + coroutines + + - bpo-33654(11): Fix transport.set_protocol() to support switching + between asyncio.Protocol and asyncio.BufferedProtocol. Fix + loop.start_tls() to work with asyncio.BufferedProtocols. + + - bpo-33652(12): Pickles of type variables and subscripted generics + are now future-proof and compatible with older Python versions. + + - bpo-32493(13): Fixed *note uuid.uuid1(): 80b. on FreeBSD. + + - bpo-33618(14): Finalize and document preliminary and experimental + TLS 1.3 support with OpenSSL 1.1.1 + + - bpo-33623(15): Fix possible SIGSGV when asyncio.Future is created + in __del__ + + - bpo-30877(16): 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. + + - bpo-33570(17): 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. + + - bpo-28556(18): Do not simplify arguments to *note typing.Union: + 214. Now ‘Union[Manager, Employee]’ is not simplified to + ‘Employee’ at runtime. Such simplification previously caused + several bugs and limited possibilities for introspection. + + - bpo-33540(19): Add a new ‘block_on_close’ class attribute to + ‘ForkingMixIn’ and ‘ThreadingMixIn’ classes of *note socketserver: + ed. + + - bpo-33548(20): tempfile._candidate_tempdir_list should consider + common TEMP locations + + - bpo-33109(21): argparse subparsers are once again not required by + default, reverting the change in behavior introduced by + bpo-26510(22) in 3.7.0a2. + + - bpo-33536(23): dataclasses.make_dataclass now checks for invalid + field names and duplicate fields. Also, added a check for invalid + field specifications. + + - bpo-33542(24): Prevent ‘uuid.get_node’ from using a DUID instead of + a MAC on Windows. Patch by Zvi Effron + + - bpo-26819(25): Fix race condition with + ‘ReadTransport.resume_reading’ in Windows proactor event loop. + + - Fix failure in *note typing.get_type_hints(): 277. when ClassVar + was provided as a string forward reference. + + - bpo-33505(26): Optimize asyncio.ensure_future() by reordering if + checks: 1.17x faster. + + - bpo-33497(27): Add errors param to cgi.parse_multipart and make an + encoding in FieldStorage use the given errors (needed for Twisted). + Patch by Amber Brown. + + - bpo-33495(28): 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. + + - bpo-33453(29): 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”). + + - bpo-28556(30): Minor fixes in typing module: add annotations to + ‘NamedTuple.__new__’, pass ‘*args’ and ‘**kwds’ in + ‘Generic.__new__’. Original PRs by Paulius Šarka and Chad + Dombrova. + + - bpo-20087(31): Updated alias mapping with glibc 2.27 supported + locales. + + - bpo-33422(32): Fix trailing quotation marks getting deleted when + looking up byte/string literals on pydoc. Patch by Andrés Delfino. + + - bpo-28167(33): The function ‘platform.linux_distribution’ and + ‘platform.dist’ now trigger a ‘DeprecationWarning’ and have been + marked for removal in Python 3.8 + + - bpo-33197(34): Update error message when constructing invalid + inspect.Parameters Patch by Dong-hee Na. + + - bpo-33263(35): Fix FD leak in ‘_SelectorSocketTransport’ Patch by + Vlad Starostin. + + - bpo-32861(36): The urllib.robotparser’s ‘__str__’ representation + now includes wildcard entries and the “Crawl-delay” and + “Request-rate” fields. Patch by Michael Lazar. + + - bpo-32257(37): The ssl module now contains OP_NO_RENEGOTIATION + constant, available with OpenSSL 1.1.0h or 1.1.1. + + - bpo-16865(38): Support arrays >=2GiB in *note ctypes: 29. Patch by + Segev Finer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32751 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32684 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33654 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33674 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33674 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31647 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32610 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32410 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33469 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33672 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33654 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=33652 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32493 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=33618 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=33623 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=30877 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=33570 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=33540 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=33548 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=33109 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=26510 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=33536 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=33542 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=26819 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=33505 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=33497 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=33495 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=33453 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=20087 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=33422 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=28167 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=33197 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=33263 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=32861 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=32257 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=16865 + + +File: python.info, Node: Documentation<36>, Next: Tests<34>, Prev: Library<37>, Up: Python 3 7 0 beta 5 + +1.21.38.3 Documentation +....................... + + - bpo-23859(1): Document that *note asyncio.wait(): 591. does not + cancel its futures on timeout. + + - bpo-32436(2): Document PEP 567(3) changes to asyncio. + + - bpo-33604(4): Update HMAC md5 default to a DeprecationWarning, bump + removal to 3.8. + + - bpo-33503(5): Fix broken pypi link + + - bpo-33421(6): Add missing documentation for + ‘typing.AsyncContextManager’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23859 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32436 + + (3) https://peps.python.org/pep-0567/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33604 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33503 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33421 + + +File: python.info, Node: Tests<34>, Next: Build<36>, Prev: Documentation<36>, Up: Python 3 7 0 beta 5 + +1.21.38.4 Tests +............... + + - bpo-33655(1): Ignore test_posix_fallocate failures on BSD platforms + that might be due to running on ZFS. + + - bpo-32604(2): Remove the _xxsubinterpreters module (meant for + testing) and associated helpers. This module was originally added + recently in 3.7b1. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33655 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32604 + + +File: python.info, Node: Build<36>, Next: macOS<24>, Prev: Tests<34>, Up: Python 3 7 0 beta 5 + +1.21.38.5 Build +............... + + - bpo-33614(1): Ensures module definition files for the stable ABI on + Windows are correctly regenerated. + + - bpo-33522(2): Enable CI builds on Visual Studio Team Services at + ‘https://python.visualstudio.com/cpython’ + + - bpo-33012(3): Add ‘-Wno-cast-function-type’ for gcc 8 for silencing + warnings about function casts like casting to PyCFunction in method + definition lists. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33614 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33522 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33012 + + +File: python.info, Node: macOS<24>, Next: IDLE<27>, Prev: Build<36>, Up: Python 3 7 0 beta 5 + +1.21.38.6 macOS +............... + + - bpo-13631(1): The .editrc file in user’s home directory is now + processed correctly during the readline initialization through + editline emulation on macOS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=13631 + + +File: python.info, Node: IDLE<27>, Prev: macOS<24>, Up: Python 3 7 0 beta 5 + +1.21.38.7 IDLE +.............. + + - bpo-33628(1): IDLE: Cleanup codecontext.py and its test. + + - bpo-33564(2): IDLE’s code context now recognizes async as a block + opener. + + - bpo-32831(3): Add docstrings and tests for codecontext. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33628 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33564 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32831 + + +File: python.info, Node: Python 3 7 0 beta 4, Next: Python 3 7 0 beta 3, Prev: Python 3 7 0 beta 5, Up: Changelog + +1.21.39 Python 3.7.0 beta 4 +--------------------------- + +`Release date: 2018-05-02' + +* Menu: + +* Core and Builtins: Core and Builtins<38>. +* Library: Library<38>. +* Documentation: Documentation<37>. +* Tests: Tests<35>. +* Build: Build<37>. +* Windows: Windows<34>. +* macOS: macOS<25>. +* IDLE: IDLE<28>. +* Tools/Demos: Tools/Demos<15>. + + +File: python.info, Node: Core and Builtins<38>, Next: Library<38>, Up: Python 3 7 0 beta 4 + +1.21.39.1 Core and Builtins +........................... + + - bpo-33363(1): Raise a SyntaxError for ‘async with’ and ‘async for’ + statements outside of async functions. + + - bpo-33128(2): Fix a bug that causes PathFinder to appear twice on + sys.meta_path. Patch by Pablo Galindo Salgado. + + - bpo-33312(3): Fixed clang ubsan (undefined behavior sanitizer) + warnings in dictobject.c by adjusting how the internal struct + _dictkeysobject shared keys structure is declared. + + - bpo-33231(4): Fix potential memory leak in ‘normalizestring()’. + + - bpo-33205(5): Change dict growth function from + ‘round_up_to_power_2(used*2+hashtable_size/2)’ to + ‘round_up_to_power_2(used*3)’. Previously, dict is shrinked only + when ‘used == 0’. Now dict has more chance to be shrinked. + + - bpo-29922(6): Improved error messages in ‘async with’ when + ‘__aenter__()’ or ‘__aexit__()’ return non-awaitable object. + + - bpo-33199(7): Fix ‘ma_version_tag’ in dict implementation is + uninitialized when copying from key-sharing dict. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33363 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33128 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33312 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33231 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33205 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29922 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33199 + + +File: python.info, Node: Library<38>, Next: Documentation<37>, Prev: Core and Builtins<38>, Up: Python 3 7 0 beta 4 + +1.21.39.2 Library +................. + + - bpo-33281(1): Fix ctypes.util.find_library regression on macOS. + + - bpo-33383(2): Fixed crash in the get() method of the *note + dbm.ndbm: 33. database object when it is called with a single + argument. + + - bpo-33329(3): Fix multiprocessing regression on newer glibcs + + - bpo-991266(4): Fix quoting of the ‘Comment’ attribute of *note + http.cookies.SimpleCookie: 1481. + + - bpo-33131(5): Upgrade bundled version of pip to 10.0.1. + + - bpo-33308(6): Fixed a crash in the ‘parser’ module when converting + an ST object to a tree of tuples or lists with ‘line_info=False’ + and ‘col_info=True’. + + - bpo-33266(7): lib2to3 now recognizes ‘rf'...'’ strings. + + - bpo-11594(8): Ensure line-endings are respected when using lib2to3. + + - bpo-33254(9): Have *note importlib.resources.contents(): 1482. and + ‘importlib.abc.ResourceReader.contents()’ return an *note iterable: + ed9. instead of an *note iterator: 134f. + + - bpo-33256(10): Fix display of ‘’ call in the html produced + by ‘cgitb.html()’. Patch by Stéphane Blondon. + + - bpo-33185(11): Fixed regression when running pydoc with the *note + -m: 1ae. switch. (The regression was introduced in 3.7.0b3 by the + resolution of bpo-33053(12)) This fix also changed pydoc to add + ‘os.getcwd()’ to *note sys.path: 162. when necessary, rather than + adding ‘"."’. + + - bpo-33169(13): Delete entries of ‘None’ in *note + sys.path_importer_cache: 1b2. when + ‘importlib.machinery.invalidate_caches()’ is called. + + - bpo-33217(14): Deprecate looking up non-Enum objects in Enum + classes and Enum members (will raise *note TypeError: 19c. in + 3.8+). + + - bpo-33203(15): ‘random.Random.choice()’ now raises ‘IndexError’ for + empty sequences consistently even when called from subclasses + without a ‘getrandbits()’ implementation. + + - bpo-33224(16): Update difflib.mdiff() for PEP 479(17). Convert an + uncaught StopIteration in a generator into a return-statement. + + - bpo-33209(18): End framing at the end of C implementation of *note + pickle.Pickler.dump(): 1483. + + - bpo-20104(19): Improved error handling and fixed a reference leak + in *note os.posix_spawn(): 6a8. + + - bpo-33175(20): In dataclasses, Field.__set_name__ now looks up the + __set_name__ special method on the class, not the instance, of the + default value. + + - bpo-33097(21): Raise RuntimeError when ‘executor.submit’ is called + during interpreter shutdown. + + - bpo-31908(22): Fix output of cover files for ‘trace’ module + command-line tool. Previously emitted cover files only when + ‘--missing’ option was used. Patch by Michael Selik. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33281 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33383 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33329 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=991266 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33131 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33308 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33266 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=11594 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33254 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33256 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33185 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=33053 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=33169 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=33217 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=33203 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=33224 + + (17) https://peps.python.org/pep-0479/ + + (18) https://bugs.python.org/issue?@action=redirect&bpo=33209 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=20104 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=33175 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=33097 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=31908 + + +File: python.info, Node: Documentation<37>, Next: Tests<35>, Prev: Library<38>, Up: Python 3 7 0 beta 4 + +1.21.39.3 Documentation +....................... + + - bpo-33378(1): Add Korean language switcher for + ‘https://docs.python.org/3/’ + + - bpo-33276(2): Clarify that the ‘__path__’ attribute on modules + cannot be just any value. + + - bpo-33201(3): Modernize documentation for writing C extension + types. + + - bpo-33195(4): Deprecate ‘Py_UNICODE’ usage in ‘c-api/arg’ document. + ‘Py_UNICODE’ related APIs are deprecated since Python 3.3, but it + is missed in the document. + + - bpo-8243(5): Add a note about curses.addch and curses.addstr + exception behavior when writing outside a window, or pad. + + - bpo-32337(6): Update documentation related with ‘dict’ order. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33378 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33276 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33201 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33195 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=8243 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32337 + + +File: python.info, Node: Tests<35>, Next: Build<37>, Prev: Documentation<37>, Up: Python 3 7 0 beta 4 + +1.21.39.4 Tests +............... + + - bpo-33358(1): Fix + ‘test_embed.test_pre_initialization_sys_options()’ when the + interpreter is built with ‘--enable-shared’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33358 + + +File: python.info, Node: Build<37>, Next: Windows<34>, Prev: Tests<35>, Up: Python 3 7 0 beta 4 + +1.21.39.5 Build +............... + + - bpo-33394(1): Enable the verbose build for extension modules, when + GNU make is passed macros on the command line. + + - bpo-33393(2): Update config.guess and config.sub files. + + - bpo-33377(3): Add new triplets for mips r6 and riscv variants (used + in extension suffixes). + + - bpo-32232(4): By default, modules configured in ‘Modules/Setup’ are + no longer built with ‘-DPy_BUILD_CORE’. Instead, modules that + specifically need that preprocessor definition include it in their + individual entries. + + - bpo-33182(5): The embedding tests can once again be built with + clang 6.0 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33394 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33393 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33377 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32232 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33182 + + +File: python.info, Node: Windows<34>, Next: macOS<25>, Prev: Build<37>, Up: Python 3 7 0 beta 4 + +1.21.39.6 Windows +................. + + - bpo-33184(1): Update Windows installer to use OpenSSL 1.1.0h. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33184 + + +File: python.info, Node: macOS<25>, Next: IDLE<28>, Prev: Windows<34>, Up: Python 3 7 0 beta 4 + +1.21.39.7 macOS +............... + + - bpo-33184(1): Update macOS installer build to use OpenSSL 1.1.0h. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33184 + + +File: python.info, Node: IDLE<28>, Next: Tools/Demos<15>, Prev: macOS<25>, Up: Python 3 7 0 beta 4 + +1.21.39.8 IDLE +.............. + + - bpo-21474(1): 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. + + - bpo-33204(2): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21474 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33204 + + +File: python.info, Node: Tools/Demos<15>, Prev: IDLE<28>, Up: Python 3 7 0 beta 4 + +1.21.39.9 Tools/Demos +..................... + + - bpo-33189(1): ‘pygettext.py’ now recognizes only literal strings as + docstrings and translatable strings, and rejects bytes literals and + f-string expressions. + + - bpo-31920(2): Fixed handling directories as arguments in the + ‘pygettext’ script. Based on patch by Oleg Krasnikov. + + - bpo-29673(3): Fix pystackv and pystack gdbinit macros. + + - bpo-31583(4): Fix 2to3 for using with –add-suffix option but + without –output-dir option for relative path to files in current + directory. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33189 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31920 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29673 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31583 + + +File: python.info, Node: Python 3 7 0 beta 3, Next: Python 3 7 0 beta 2, Prev: Python 3 7 0 beta 4, Up: Changelog + +1.21.40 Python 3.7.0 beta 3 +--------------------------- + +`Release date: 2018-03-29' + +* Menu: + +* Security: Security<23>. +* Core and Builtins: Core and Builtins<39>. +* Library: Library<39>. +* Documentation: Documentation<38>. +* Tests: Tests<36>. +* Build: Build<38>. +* Windows: Windows<35>. +* macOS: macOS<26>. +* IDLE: IDLE<29>. +* Tools/Demos: Tools/Demos<16>. +* C API: C API<33>. + + +File: python.info, Node: Security<23>, Next: Core and Builtins<39>, Up: Python 3 7 0 beta 3 + +1.21.40.1 Security +.................. + + - bpo-33136(1): Harden ssl module against LibreSSL CVE-2018-8970. + X509_VERIFY_PARAM_set1_host() is called with an explicit namelen. + A new test ensures that NULL bytes are not allowed. + + - bpo-33001(2): Minimal fix to prevent buffer overrun in os.symlink + on Windows + + - bpo-32981(3): Regexes in difflib and poplib were vulnerable to + catastrophic backtracking. These regexes formed potential DOS + vectors (REDOS). They have been refactored. This resolves + CVE-2018-1060 and CVE-2018-1061. Patch by Jamie Davis. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33136 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33001 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32981 + + +File: python.info, Node: Core and Builtins<39>, Next: Library<39>, Prev: Security<23>, Up: Python 3 7 0 beta 3 + +1.21.40.2 Core and Builtins +........................... + + - bpo-33053(1): 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) + + - bpo-33018(2): Improve consistency of errors raised by + ‘issubclass()’ when called with a non-class and an abstract base + class as the first and second arguments, respectively. Patch by + Josh Bronson. + + - bpo-33041(3): Fixed jumping when the function contains an ‘async + for’ loop. + + - bpo-33026(4): Fixed jumping out of “with” block by setting + f_lineno. + + - bpo-33005(5): 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. + + - bpo-17288(6): Prevent jumps from ‘return’ and ‘exception’ trace + events. + + - bpo-32836(7): Don’t use temporary variables in cases of + list/dict/set comprehensions + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33053 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33018 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33041 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33026 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33005 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17288 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32836 + + +File: python.info, Node: Library<39>, Next: Documentation<38>, Prev: Core and Builtins<39>, Up: Python 3 7 0 beta 3 + +1.21.40.3 Library +................. + + - bpo-33141(1): Have Field objects pass through __set_name__ to their + default values, if they have their own __set_name__. + + - bpo-33096(2): 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. + + - bpo-32873(3): 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. + + - bpo-33134(4): 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. + + - bpo-33127(5): The ssl module now compiles with LibreSSL 2.7.1. + + - bpo-32505(6): Raise TypeError if a member variable of a dataclass + is of type Field, but doesn’t have a type annotation. + + - bpo-33078(7): Fix the failure on OSX caused by the tests relying on + sem_getvalue + + - bpo-33116(8): Add ‘Field’ to dataclasses.__all__. + + - bpo-32896(9): Fix an error where subclassing a dataclass with a + field that uses a default_factory would generate an incorrect + class. + + - bpo-33100(10): 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. + + - bpo-32953(11): 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. + + - bpo-33061(12): Add missing ‘NoReturn’ to ‘__all__’ in typing.py + + - bpo-33078(13): Fix the size handling in multiprocessing.Queue when + a pickling error occurs. + + - bpo-33064(14): lib2to3 now properly supports trailing commas after + ‘*args’ and ‘**kwargs’ in function signatures. + + - bpo-33056(15): FIX properly close leaking fds in + concurrent.futures.ProcessPoolExecutor. + + - bpo-33021(16): Release the GIL during fstat() calls, avoiding hang + of all threads when calling mmap.mmap(), os.urandom(), and + random.seed(). Patch by Nir Soffer. + + - bpo-31804(17): Avoid failing in multiprocessing.Process if the + standard streams are closed or None at exit. + + - bpo-33037(18): Skip sending/receiving data after SSL transport + closing. + + - bpo-27683(19): Fix a regression in *note ipaddress: a0. that result + of ‘hosts()’ is empty when the network is constructed by a tuple + containing an integer mask and only 1 bit left for addresses. + + - bpo-32999(20): Fix C implementation of ‘ABC.__subclasscheck__(cls, + subclass)’ crashed when ‘subclass’ is not a type object. + + - bpo-33009(21): Fix inspect.signature() for single-parameter + partialmethods. + + - bpo-32969(22): Expose several missing constants in zlib and fix + corresponding documentation. + + - bpo-32056(23): Improved exceptions raised for invalid number of + channels and sample width when read an audio file in modules *note + aifc: 4, *note wave: 131. and *note sunau: f7. + + - bpo-32844(24): Fix wrong redirection of a low descriptor (0 or 1) + to stderr in subprocess if another low descriptor is closed. + + - bpo-32857(25): In *note tkinter: 10e, ‘after_cancel(None)’ now + raises a *note ValueError: 1c8. instead of canceling the first + scheduled function. Patch by Cheryl Sabella. + + - bpo-31639(26): http.server now exposes a ThreadedHTTPServer class + and uses it when the module is run with ‘-m’ to cope with web + browsers pre-opening sockets. + + - bpo-27645(27): *note sqlite3.Connection: 24c. now exposes a *note + backup: 7d9. method, if the underlying SQLite library is at version + 3.6.11 or higher. Patch by Lele Gaifax. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33141 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33096 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32873 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33134 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33127 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32505 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33078 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33116 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32896 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33100 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32953 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=33061 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=33078 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=33064 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=33056 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=33021 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=31804 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=33037 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=27683 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32999 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=33009 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32969 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32056 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=32844 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=32857 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=31639 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=27645 + + +File: python.info, Node: Documentation<38>, Next: Tests<36>, Prev: Library<39>, Up: Python 3 7 0 beta 3 + +1.21.40.4 Documentation +....................... + + - bpo-33126(1): Document PyBuffer_ToContiguous(). + + - bpo-27212(2): Modify documentation for the ‘islice()’ recipe to + consume initial values up to the start index. + + - bpo-28247(3): Update *note zipapp: 14c. documentation to describe + how to make standalone applications. + + - bpo-18802(4): Documentation changes for ipaddress. Patch by Jon + Foster and Berker Peksag. + + - bpo-27428(5): Update documentation to clarify that + ‘WindowsRegistryFinder’ implements ‘MetaPathFinder’. (Patch by + Himanshu Lakhara) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33126 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27212 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28247 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=18802 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27428 + + +File: python.info, Node: Tests<36>, Next: Build<38>, Prev: Documentation<38>, Up: Python 3 7 0 beta 3 + +1.21.40.5 Tests +............... + + - bpo-32872(1): Avoid regrtest compatibility issue with namespace + packages. + + - bpo-32517(2): Fix failing ‘test_asyncio’ on macOS 10.12.2+ due to + transport of ‘KqueueSelector’ loop was not being closed. + + - bpo-19417(3): Add test_bdb.py. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32872 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32517 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=19417 + + +File: python.info, Node: Build<38>, Next: Windows<35>, Prev: Tests<36>, Up: Python 3 7 0 beta 3 + +1.21.40.6 Build +............... + + - bpo-33163(1): Upgrade pip to 9.0.3 and setuptools to v39.0.1. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33163 + + +File: python.info, Node: Windows<35>, Next: macOS<26>, Prev: Build<38>, Up: Python 3 7 0 beta 3 + +1.21.40.7 Windows +................. + + - bpo-33016(1): Fix potential use of uninitialized memory in + nt._getfinalpathname + + - bpo-32903(2): Fix a memory leak in os.chdir() on Windows if the + current directory is set to a UNC path. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33016 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32903 + + +File: python.info, Node: macOS<26>, Next: IDLE<29>, Prev: Windows<35>, Up: Python 3 7 0 beta 3 + +1.21.40.8 macOS +............... + + - bpo-32726(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32726 + + +File: python.info, Node: IDLE<29>, Next: Tools/Demos<16>, Prev: macOS<26>, Up: Python 3 7 0 beta 3 + +1.21.40.9 IDLE +.............. + + - bpo-32984(1): Set ‘__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, + ‘-s’ runs a file named in environmental variable ‘IDLESTARTUP’ or + *note PYTHONSTARTUP: c6a.; ‘-r file’ runs ‘file’. Python sets + ‘__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 ‘-n’ option. + + - bpo-32940(2): Simplify and rename StringTranslatePseudoMapping in + pyparse. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32984 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32940 + + +File: python.info, Node: Tools/Demos<16>, Next: C API<33>, Prev: IDLE<29>, Up: Python 3 7 0 beta 3 + +1.21.40.10 Tools/Demos +...................... + + - bpo-32885(1): Add an ‘-n’ flag for ‘Tools/scripts/pathfix.py’ to + disable automatic backup creation (files with ‘~’ suffix). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32885 + + +File: python.info, Node: C API<33>, Prev: Tools/Demos<16>, Up: Python 3 7 0 beta 3 + +1.21.40.11 C API +................ + + - bpo-33042(1): Embedding applications may once again call + PySys_ResetWarnOptions, PySys_AddWarnOption, and PySys_AddXOption + prior to calling Py_Initialize. + + - bpo-32374(2): Document that m_traverse for multi-phase initialized + modules can be called with m_state=NULL, and add a sanity check + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33042 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32374 + + +File: python.info, Node: Python 3 7 0 beta 2, Next: Python 3 7 0 beta 1, Prev: Python 3 7 0 beta 3, Up: Changelog + +1.21.41 Python 3.7.0 beta 2 +--------------------------- + +`Release date: 2018-02-27' + +* Menu: + +* Security: Security<24>. +* Core and Builtins: Core and Builtins<40>. +* Library: Library<40>. +* Documentation: Documentation<39>. +* Tests: Tests<37>. +* Build: Build<39>. +* Windows: Windows<36>. +* macOS: macOS<27>. +* IDLE: IDLE<30>. +* Tools/Demos: Tools/Demos<17>. + + +File: python.info, Node: Security<24>, Next: Core and Builtins<40>, Up: Python 3 7 0 beta 2 + +1.21.41.1 Security +.................. + + - bpo-28414(1): The ssl module now allows users to perform their own + IDN en/decoding when using SNI. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28414 + + +File: python.info, Node: Core and Builtins<40>, Next: Library<40>, Prev: Security<24>, Up: Python 3 7 0 beta 2 + +1.21.41.2 Core and Builtins +........................... + + - bpo-32889(1): Update Valgrind suppression list to account for the + rename of ‘Py_ADDRESS_IN_RANG’ to ‘address_in_range’. + + - bpo-31356(2): Remove the new API added in bpo-31356(3) + (gc.ensure_disabled() context manager). + + - bpo-32305(4): For namespace packages, ensure that both ‘__file__’ + and ‘__spec__.origin’ are set to None. + + - bpo-32303(5): Make sure ‘__spec__.loader’ matches ‘__loader__’ for + namespace packages. + + - bpo-32711(6): Fix the warning messages for Python/ast_unparse.c. + Patch by Stéphane Wirtel + + - bpo-32583(7): Fix possible crashing in builtin Unicode decoders + caused by write out-of-bound errors when using customized decode + error handlers. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32889 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31356 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31356 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32305 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32303 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32711 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32583 + + +File: python.info, Node: Library<40>, Next: Documentation<39>, Prev: Core and Builtins<40>, Up: Python 3 7 0 beta 2 + +1.21.41.3 Library +................. + + - bpo-32960(1): 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. + + - bpo-32713(2): Fixed tarfile.itn handling of out-of-bounds float + values. Patch by Joffrey Fuhrer. + + - bpo-32951(3): 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. + + - bpo-32929(4): 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. + + - bpo-32947(5): Add OP_ENABLE_MIDDLEBOX_COMPAT and test workaround + for TLSv1.3 for future compatibility with OpenSSL 1.1.1. + + - bpo-30622(6): The ssl module now detects missing NPN support in + LibreSSL. + + - bpo-32922(7): dbm.open() now encodes filename with the filesystem + encoding rather than default encoding. + + - bpo-32859(8): In ‘os.dup2’, don’t check every call whether the + ‘dup3’ syscall exists or not. + + - bpo-32556(9): nt._getfinalpathname, nt._getvolumepathname and + nt._getdiskusage now correctly convert from bytes. + + - bpo-25988(10): Emit a *note DeprecationWarning: 2d4. when using or + importing an ABC directly from *note collections: 1c. rather than + from *note collections.abc: 1d. + + - bpo-21060(11): 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”. + + - bpo-32852(12): Make sure sys.argv remains as a list when running + trace. + + - bpo-31333(13): ‘_abc’ module is added. It is a speedup module with + C implementations for various functions and methods in ‘abc’. + Creating an ABC subclass and calling ‘isinstance’ or ‘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 ‘_abc_registry’, ‘_abc_cache’, + and ‘_abc_negative_cache’. There are three debugging helper + methods that can be used instead ‘_dump_registry’, + ‘_abc_registry_clear’, and ‘_abc_caches_clear’. + + - bpo-32841(14): Fixed *note asyncio.Condition: 6c5. issue which + silently ignored cancellation after notifying and cancelling a + conditional lock. Patch by Bar Harel. + + - bpo-32819(15): 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. + + - bpo-32394(16): socket: Remove + TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on older + version Windows during run-time. + + - bpo-31787(17): Fixed refleaks of ‘__init__()’ methods in various + modules. (Contributed by Oren Milman) + + - bpo-30157(18): Fixed guessing quote and delimiter in + csv.Sniffer.sniff() when only the last field is quoted. Patch by + Jake Davis. + + - bpo-32792(19): collections.ChainMap() preserves the order of the + underlying mappings. + + - bpo-32775(20): *note fnmatch.translate(): 1484. 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. + + - bpo-32622(21): Implement native fast sendfile for Windows proactor + event loop. + + - bpo-32777(22): 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. + + - bpo-32647(23): The ctypes module used to depend on indirect linking + for dlopen. The shared extension is now explicitly linked against + libdl on platforms with dl. + + - bpo-32741(24): Implement ‘asyncio.TimerHandle.when()’ method. + + - bpo-32691(25): Use mod_spec.parent when running modules with pdb + + - bpo-32734(26): Fixed ‘asyncio.Lock()’ safety issue which allowed + acquiring and locking the same lock multiple times, without it + being free. Patch by Bar Harel. + + - bpo-32727(27): Do not include name field in SMTP envelope from + address. Patch by Stéphane Wirtel + + - bpo-31453(28): Add TLSVersion constants and + SSLContext.maximum_version / minimum_version attributes. The new + API wraps OpenSSL 1.1 + ‘https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_min_proto_version.html’ + feature. + + - bpo-24334(29): 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. + + - bpo-31848(30): Fix the error handling in Aifc_read.initfp() when + the SSND chunk is not found. Patch by Zackery Spytz. + + - bpo-32585(31): Add Ttk spinbox widget to *note tkinter.ttk: 118. + Patch by Alan D Moore. + + - bpo-32221(32): Various functions returning tuple containing IPv6 + addresses now omit ‘%scope’ part since the same information is + already encoded in `scopeid' tuple item. Especially this speeds up + ‘socket.recvfrom()’ when it receives multicast packet since useless + resolving of network interface name is omitted. + + - bpo-30693(33): The TarFile class now recurses directories in a + reproducible way. + + - bpo-30693(34): The ZipFile class now recurses directories in a + reproducible way. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32960 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32713 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32951 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32929 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32947 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30622 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32922 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32859 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32556 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=25988 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=21060 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32852 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31333 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32841 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=32819 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=32394 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=31787 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=30157 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=32792 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32775 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32622 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32777 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32647 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=32741 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=32691 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=32734 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=32727 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=31453 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=24334 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=31848 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=32585 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=32221 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=30693 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=30693 + + +File: python.info, Node: Documentation<39>, Next: Tests<37>, Prev: Library<40>, Up: Python 3 7 0 beta 2 + +1.21.41.4 Documentation +....................... + + - bpo-28124(1): 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. + + - bpo-17232(2): Clarify docs for -O and -OO. Patch by Terry Reedy. + + - bpo-32436(3): Add documentation for the contextvars module (PEP + 567). + + - bpo-32800(4): Update link to w3c doc for xml default namespaces. + + - bpo-11015(5): Update *note test.support: 102. documentation. + + - bpo-8722(6): Document ‘__getattr__()’ behavior when property + ‘get()’ method raises *note AttributeError: 19d. + + - bpo-32614(7): Modify RE examples in documentation to use raw + strings to prevent *note DeprecationWarning: 2d4. and add text to + REGEX HOWTO to highlight the deprecation. + + - bpo-31972(8): Improve docstrings for *note pathlib.PurePath: 306. + subclasses. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28124 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17232 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32436 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32800 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=11015 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=8722 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32614 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31972 + + +File: python.info, Node: Tests<37>, Next: Build<39>, Prev: Documentation<39>, Up: Python 3 7 0 beta 2 + +1.21.41.5 Tests +............... + + - bpo-31809(1): Add tests to verify connection with secp ECDH curves. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31809 + + +File: python.info, Node: Build<39>, Next: Windows<36>, Prev: Tests<37>, Up: Python 3 7 0 beta 2 + +1.21.41.6 Build +............... + + - bpo-32898(1): Fix the python debug build when using COUNT_ALLOCS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32898 + + +File: python.info, Node: Windows<36>, Next: macOS<27>, Prev: Build<39>, Up: Python 3 7 0 beta 2 + +1.21.41.7 Windows +................. + + - bpo-32901(1): Update Tcl and Tk versions to 8.6.8 + + - bpo-31966(2): Fixed WindowsConsoleIO.write() for writing empty + data. + + - bpo-32409(3): Ensures activate.bat can handle Unicode contents. + + - bpo-32457(4): Improves handling of denormalized executable path + when launching Python. + + - bpo-32370(5): Use the correct encoding for ipconfig output in the + uuid module. Patch by Segev Finer. + + - bpo-29248(6): Fix *note os.readlink(): 568. on Windows, which was + mistakenly treating the ‘PrintNameOffset’ field of the reparse data + buffer as a number of characters instead of bytes. Patch by Craig + Holmquist and SSE4. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32901 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31966 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32409 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32457 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32370 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29248 + + +File: python.info, Node: macOS<27>, Next: IDLE<30>, Prev: Windows<36>, Up: Python 3 7 0 beta 2 + +1.21.41.8 macOS +............... + + - bpo-32901(1): Update macOS 10.9+ installer to Tcl/Tk 8.6.8. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32901 + + +File: python.info, Node: IDLE<30>, Next: Tools/Demos<17>, Prev: macOS<27>, Up: Python 3 7 0 beta 2 + +1.21.41.9 IDLE +.............. + + - bpo-32916(1): Change ‘str’ to ‘code’ in pyparse. + + - bpo-32905(2): Remove unused code in pyparse module. + + - bpo-32874(3): Add tests for pyparse. + + - bpo-32837(4): Using the system and place-dependent default encoding + for open() is a bad idea for IDLE’s system and location-independent + files. + + - bpo-32826(5): 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. + + - bpo-32765(6): Update configdialog General tab docstring to add new + widgets to the widget list. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32916 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32905 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32874 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32837 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32826 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32765 + + +File: python.info, Node: Tools/Demos<17>, Prev: IDLE<30>, Up: Python 3 7 0 beta 2 + +1.21.41.10 Tools/Demos +...................... + + - bpo-32222(1): Fix pygettext not extracting docstrings for functions + with type annotated arguments. Patch by Toby Harradine. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32222 + + +File: python.info, Node: Python 3 7 0 beta 1, Next: Python 3 7 0 alpha 4, Prev: Python 3 7 0 beta 2, Up: Changelog + +1.21.42 Python 3.7.0 beta 1 +--------------------------- + +`Release date: 2018-01-30' + +* Menu: + +* Core and Builtins: Core and Builtins<41>. +* Library: Library<41>. +* Documentation: Documentation<40>. +* Tests: Tests<38>. +* Build: Build<40>. +* Windows: Windows<37>. +* macOS: macOS<28>. +* C API: C API<34>. + + +File: python.info, Node: Core and Builtins<41>, Next: Library<41>, Up: Python 3 7 0 beta 1 + +1.21.42.1 Core and Builtins +........................... + + - bpo-32703(1): Fix coroutine’s ResourceWarning when there’s an + active error set when it’s being finalized. + + - bpo-32650(2): Pdb and other debuggers dependent on bdb.py will + correctly step over (next command) native coroutines. Patch by + Pablo Galindo. + + - bpo-28685(3): Optimize list.sort() and sorted() by using type + specialized comparisons when possible. + + - bpo-32685(4): 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. + + - bpo-32697(5): 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. + + - bpo-32690(6): The locals() dictionary now displays in the lexical + order that variables were defined. Previously, the order was + reversed. + + - bpo-32677(7): Add ‘.isascii()’ method to ‘str’, ‘bytes’ and + ‘bytearray’. It can be used to test that string contains only + ASCII characters. + + - bpo-32670(8): Enforce PEP 479(9) 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. + + - bpo-32591(10): 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. + + - bpo-31368(11): Expose preadv and pwritev system calls in the os + module. Patch by Pablo Galindo + + - bpo-32544(12): ‘hasattr(obj, name)’ and ‘getattr(obj, name, + default)’ are about 4 times faster than before when ‘name’ is not + found and ‘obj’ doesn’t override ‘__getattr__’ or + ‘__getattribute__’. + + - bpo-26163(13): Improved frozenset() hash to create more distinct + hash values when faced with datasets containing many similar + values. + + - bpo-32550(14): Remove the STORE_ANNOTATION bytecode. + + - bpo-20104(15): Expose posix_spawn as a low level API in the os + module. (removed before 3.7.0rc1) + + - bpo-24340(16): Fixed estimation of the code stack size. + + - bpo-32436(17): Implement PEP 567(18) Context Variables. + + - bpo-18533(19): ‘repr()’ on a dict containing its own ‘values()’ or + ‘items()’ no longer raises ‘RecursionError’; OrderedDict similarly. + Instead, use ‘...’, as for other recursive structures. Patch by + Ben North. + + - bpo-20891(20): 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. + + - bpo-32028(21): Leading whitespace is now correctly ignored when + generating suggestions for converting Py2 print statements to Py3 + builtin print function calls. Patch by Sanyam Khurana. + + - bpo-31179(22): Make dict.copy() up to 5.5 times faster. + + - bpo-31113(23): Get rid of recursion in the compiler for normal + control flow. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32703 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32650 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28685 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32685 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32697 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32690 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32677 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32670 + + (9) https://peps.python.org/pep-0479/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32591 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31368 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32544 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26163 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32550 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=20104 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24340 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32436 + + (18) https://peps.python.org/pep-0567/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=18533 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=20891 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32028 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=31179 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31113 + + +File: python.info, Node: Library<41>, Next: Documentation<40>, Prev: Core and Builtins<41>, Up: Python 3 7 0 beta 1 + +1.21.42.2 Library +................. + + - bpo-25988(1): Deprecate exposing the contents of collections.abc in + the regular collections module. + + - bpo-31429(2): 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. + + - bpo-30306(3): 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. + + - bpo-21417(4): Added support for setting the compression level for + zipfile.ZipFile. + + - bpo-32251(5): Implement asyncio.BufferedProtocol (provisional API). + + - bpo-32513(6): In dataclasses, allow easier overriding of dunder + methods without specifying decorator parameters. + + - bpo-32660(7): *note termios: 100. makes available ‘FIONREAD’, + ‘FIONCLEX’, ‘FIOCLEX’, ‘FIOASYNC’ and ‘FIONBIO’ also under + Solaris/derivatives. + + - bpo-27931(8): Fix email address header parsing error when the + username is an empty quoted string. Patch by Xiang Zhang. + + - bpo-32659(9): Under Solaris and derivatives, *note os.stat_result: + 14d0. provides a st_fstype attribute. + + - bpo-32662(10): 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(). + + - bpo-32391(11): Implement *note asyncio.StreamWriter.wait_closed(): + 75f. and *note asyncio.StreamWriter.is_closing(): 760. methods + + - bpo-32643(12): Make Task._step, Task._wakeup and + Future._schedule_callbacks methods private. + + - bpo-32630(13): Refactor decimal module to use contextvars to store + decimal context. + + - bpo-32622(14): Add ‘asyncio.AbstractEventLoop.sendfile()’ method. + + - bpo-32304(15): 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. + + - bpo-32502(16): uuid.uuid1 no longer raises an exception if a 64-bit + hardware address is encountered. + + - bpo-32596(17): ‘concurrent.futures’ imports ‘ThreadPoolExecutor’ + and ‘ProcessPoolExecutor’ lazily (using PEP 562(18)). It makes + ‘import asyncio’ about 15% faster because asyncio uses only + ‘ThreadPoolExecutor’ by default. + + - bpo-31801(19): Add ‘_ignore_’ to ‘Enum’ so temporary variables can + be used during class construction without being turned into + members. + + - bpo-32576(20): Use queue.SimpleQueue() in places where it can be + invoked from a weakref callback. + + - bpo-32574(21): Fix memory leak in asyncio.Queue, when the queue has + limited size and it is full, the cancelation of queue.put() can + cause a memory leak. Patch by: José Melero. + + - bpo-32521(22): The nis module is now compatible with new libnsl and + headers location. + + - bpo-32467(23): collections.abc.ValuesView now inherits from + collections.abc.Collection. + + - bpo-32473(24): Improve ABCMeta._dump_registry() output readability + + - bpo-32102(25): New argument ‘capture_output’ for subprocess.run + + - bpo-32521(26): glibc has removed Sun RPC. Use replacement libtirpc + headers and library in nis module. + + - bpo-32493(27): UUID module fixes build for FreeBSD/OpenBSD + + - bpo-32503(28): Pickling with protocol 4 no longer creates too small + frames. + + - bpo-29237(29): Create enum for pstats sorting options + + - bpo-32454(30): Add close(fd) function to the socket module. + + - bpo-25942(31): 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. + + - bpo-32433(32): The hmac module now has hmac.digest(), which + provides an optimized HMAC digest. + + - bpo-28134(33): Sockets now auto-detect family, type and protocol + from file descriptor by default. + + - bpo-32404(34): Fix bug where *note + datetime.datetime.fromtimestamp(): 11d0. did not call __new__ in + *note datetime.datetime: 4be. subclasses. + + - bpo-32403(35): Improved speed of *note datetime.date: 536. and + *note datetime.datetime: 4be. alternate constructors. + + - bpo-32228(36): Ensure that ‘truncate()’ preserves the file position + (as reported by ‘tell()’) after writes longer than the buffer size. + + - bpo-32410(37): Implement ‘loop.sock_sendfile’ for asyncio event + loop. + + - bpo-22908(38): Added seek and tell to the ZipExtFile class. This + only works if the file object used to open the zipfile is seekable. + + - bpo-32373(39): Add socket.getblocking() method. + + - bpo-32248(40): Add *note importlib.resources: 9b. and + ‘importlib.abc.ResourceReader’ as the unified API for reading + resources contained within packages. Loaders wishing to support + resource reading must implement the ‘get_resource_reader()’ method. + File-based and zipimport-based loaders both implement these APIs. + *note importlib.abc.ResourceLoader: 84e. is deprecated in favor of + these new APIs. + + - bpo-32320(41): collections.namedtuple() now supports default + values. + + - bpo-29302(42): Add contextlib.AsyncExitStack. Patch by Alexander + Mohr and Ilya Kulakov. + + - bpo-31961(43): `Removed in Python 3.7.0b2.' The `args' argument of + subprocess.Popen can now be a *note path-like object: 773. If + `args' is given as a sequence, it’s first element can now be a + *note path-like object: 773. as well. + + - bpo-31900(44): The *note locale.localeconv(): 868. function now + sets temporarily the ‘LC_CTYPE’ locale to the ‘LC_NUMERIC’ locale + to decode ‘decimal_point’ and ‘thousands_sep’ byte strings if they + are non-ASCII or longer than 1 byte, and the ‘LC_NUMERIC’ locale is + different than the ‘LC_CTYPE’ locale. This temporary change + affects other threads. Same change for the *note str.format(): + 1fc. method when formatting a number (*note int: 1c7, *note float: + 3ca, *note float: 3ca. and subclasses) with the ‘n’ type (ex: + ‘'{:n}'.format(1234)’). + + - bpo-31853(45): Use super().method instead of socket.method in + SSLSocket. They were there most likely for legacy reasons. + + - bpo-31399(46): 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. + + - bpo-14976(47): Add a queue.SimpleQueue class, an unbounded FIFO + queue with a reentrant C implementation of put(). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25988 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31429 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30306 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21417 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32251 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32513 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32660 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27931 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32659 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32662 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32391 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32643 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32630 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32622 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=32304 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=32502 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32596 + + (18) https://peps.python.org/pep-0562/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31801 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32576 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32574 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32521 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32467 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=32473 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=32102 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=32521 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=32493 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=32503 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=29237 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=32454 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=25942 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=32433 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=28134 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=32404 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=32403 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=32228 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=32410 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=22908 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=32373 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=32248 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=32320 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=29302 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=31961 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=31900 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=31853 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=31399 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=14976 + + +File: python.info, Node: Documentation<40>, Next: Tests<38>, Prev: Library<41>, Up: Python 3 7 0 beta 1 + +1.21.42.3 Documentation +....................... + + - bpo-32724(1): Add references to some commands in the documentation + of Pdb. Patch by Stéphane Wirtel + + - bpo-32649(2): Complete the C API documentation, profiling and + tracing part with the newly added per-opcode events. + + - bpo-17799(3): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32724 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32649 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=17799 + + +File: python.info, Node: Tests<38>, Next: Build<40>, Prev: Documentation<40>, Up: Python 3 7 0 beta 1 + +1.21.42.4 Tests +............... + + - bpo-32721(1): Fix test_hashlib to not fail if the _md5 module is + not built. + + - bpo-28414(2): Add test cases for IDNA 2003 and 2008 host names. + IDNA 2003 internationalized host names are working since + bpo-31399(3) has landed. IDNA 2008 are still broken. + + - bpo-32604(4): 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. + + - bpo-32602(5): Add test certs and test for ECDSA cert and EC/RSA + dual mode. + + - bpo-32549(6): On Travis CI, Python now Compiles and uses a local + copy of OpenSSL 1.1.0g for testing. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32721 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28414 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31399 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32604 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32602 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32549 + + +File: python.info, Node: Build<40>, Next: Windows<37>, Prev: Tests<38>, Up: Python 3 7 0 beta 1 + +1.21.42.5 Build +............... + + - bpo-32635(1): Fix segfault of the crypt module when libxcrypt is + provided instead of libcrypt at the system. + + - bpo-32598(2): 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. + + - bpo-32593(3): Drop support of FreeBSD 9 and older. + + - bpo-29708(4): If the ‘SOURCE_DATE_EPOCH’ environment variable is + set, *note py_compile: d4. will always create hash-based ‘.pyc’ + files. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32635 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32598 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32593 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29708 + + +File: python.info, Node: Windows<37>, Next: macOS<28>, Prev: Build<40>, Up: Python 3 7 0 beta 1 + +1.21.42.6 Windows +................. + + - bpo-32588(1): Create standalone _distutils_findvs module and add + missing _queue module to installer. + + - bpo-29911(2): Ensure separate Modify and Uninstall buttons are + displayed. + + - bpo-32507(3): Use app-local UCRT install rather than the proper + update for old versions of Windows. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32588 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29911 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32507 + + +File: python.info, Node: macOS<28>, Next: C API<34>, Prev: Windows<37>, Up: Python 3 7 0 beta 1 + +1.21.42.7 macOS +............... + + - bpo-32726(1): 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. + + - bpo-28440(2): No longer add /Library/Python/3.x/site-packages to + sys.path for macOS framework builds to avoid future conflicts. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32726 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28440 + + +File: python.info, Node: C API<34>, Prev: macOS<28>, Up: Python 3 7 0 beta 1 + +1.21.42.8 C API +............... + + - bpo-32681(1): Fix uninitialized variable ‘res’ in the C + implementation of os.dup2. Patch by Stéphane Wirtel + + - bpo-10381(2): Add C API access to the ‘datetime.timezone’ + constructor and ‘datetime.timzone.UTC’ singleton. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32681 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10381 + + +File: python.info, Node: Python 3 7 0 alpha 4, Next: Python 3 7 0 alpha 3, Prev: Python 3 7 0 beta 1, Up: Changelog + +1.21.43 Python 3.7.0 alpha 4 +---------------------------- + +`Release date: 2018-01-08' + +* Menu: + +* Core and Builtins: Core and Builtins<42>. +* Library: Library<42>. +* Documentation: Documentation<41>. +* Tests: Tests<39>. +* Windows: Windows<38>. +* Tools/Demos: Tools/Demos<18>. +* C API: C API<35>. + + +File: python.info, Node: Core and Builtins<42>, Next: Library<42>, Up: Python 3 7 0 alpha 4 + +1.21.43.1 Core and Builtins +........................... + + - bpo-31975(1): 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. + + - bpo-32226(2): ‘__class_getitem__’ is now an automatic class method. + + - bpo-32399(3): Add AIX uuid library support for RFC4122 using + uuid_create() in libc.a + + - bpo-32390(4): Fix the compilation failure on AIX after the f_fsid + field has been added to the object returned by os.statvfs() + (bpo-32143(5)). Original patch by Michael Felt. + + - bpo-32379(6): Make MRO computation faster when a class inherits + from a single base. + + - bpo-32259(7): The error message of a TypeError raised when unpack + non-iterable is now more specific. + + - bpo-27169(8): The ‘__debug__’ constant is now optimized out at + compile time. This fixes also bpo-22091(9). + + - bpo-32329(10): The *note -R: 14d9. option now turns on hash + randomization when the *note PYTHONHASHSEED: d2e. environment + variable is set to ‘0’. Previously, the option was ignored. + Moreover, ‘sys.flags.hash_randomization’ is now properly set to 0 + when hash randomization is turned off by ‘PYTHONHASHSEED=0’. + + - bpo-30416(11): 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. + + - bpo-32282(12): Fix an unnecessary ifdef in the include of + VersionHelpers.h in socketmodule on Windows. + + - bpo-30579(13): Implement TracebackType.__new__ to allow + Python-level creation of traceback objects, and make + TracebackType.tb_next mutable. + + - bpo-32260(14): Don’t byte swap the input keys to the SipHash + algorithm on big-endian platforms. This should ensure siphash + gives consistent results across platforms. + + - bpo-31506(15): Improve the error message logic for object.__new__ + and object.__init__. Patch by Sanyam Khurana. + + - bpo-20361(16): ‘-b’ and ‘-bb’ now inject ‘'default::BytesWarning'’ + and ‘error::BytesWarning’ entries into ‘sys.warnoptions’, ensuring + that they take precedence over any other warning filters configured + via the ‘-W’ option or the ‘PYTHONWARNINGS’ environment variable. + + - bpo-32230(17): ‘-X dev’ now injects a ‘'default'’ entry into + sys.warnoptions, ensuring that it behaves identically to actually + passing ‘-Wdefault’ at the command line. + + - bpo-29240(18): Add a new UTF-8 mode: implementation of the PEP + 540(19). + + - bpo-32226(20): PEP 560(21): Add support for ‘__mro_entries__’ and + ‘__class_getitem__’. Implemented by Ivan Levkivskyi. + + - bpo-32225(22): PEP 562(23): Add support for module ‘__getattr__’ + and ‘__dir__’. Implemented by Ivan Levkivskyi. + + - bpo-31901(24): The *note atexit: b. module now has its callback + stored per interpreter. + + - bpo-31650(25): Implement PEP 552(26) (Deterministic pycs). Python + now supports invalidating bytecode cache files bashed on a source + content hash rather than source last-modified time. + + - bpo-29469(27): Move constant folding from bytecode layer to AST + layer. Original patch by Eugene Toder. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31975 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32226 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32399 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32390 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32143 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32379 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32259 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27169 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=22091 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32329 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=30416 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32282 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=30579 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32260 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31506 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=20361 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32230 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=29240 + + (19) https://peps.python.org/pep-0540/ + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32226 + + (21) https://peps.python.org/pep-0560/ + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32225 + + (23) https://peps.python.org/pep-0562/ + + (24) https://bugs.python.org/issue?@action=redirect&bpo=31901 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=31650 + + (26) https://peps.python.org/pep-0552/ + + (27) https://bugs.python.org/issue?@action=redirect&bpo=29469 + + +File: python.info, Node: Library<42>, Next: Documentation<41>, Prev: Core and Builtins<42>, Up: Python 3 7 0 alpha 4 + +1.21.43.2 Library +................. + + - bpo-32506(1): Now that dict is defined as keeping insertion order, + drop OrderedDict and just use plain dict. + + - bpo-32279(2): Add params to dataclasses.make_dataclasses(): init, + repr, eq, order, hash, and frozen. Pass them through to + dataclass(). + + - bpo-32278(3): Make type information optional on + dataclasses.make_dataclass(). If omitted, the string ‘typing.Any’ + is used. + + - bpo-32499(4): Add dataclasses.is_dataclass(obj), which returns True + if obj is a dataclass or an instance of one. + + - bpo-32468(5): Improve frame repr() to mention filename, code name + and current line number. + + - bpo-23749(6): asyncio: Implement loop.start_tls() + + - bpo-32441(7): Return the new file descriptor (i.e., the second + argument) from ‘os.dup2’. Previously, ‘None’ was always returned. + + - bpo-32422(8): ‘functools.lru_cache’ uses less memory (3 words for + each cached key) and takes about 1/3 time for cyclic GC. + + - bpo-31721(9): 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. + + - bpo-32415(10): asyncio: Add Task.get_loop() and Future.get_loop() + + - bpo-26133(11): Don’t unsubscribe signals in asyncio UNIX event loop + on interpreter shutdown. + + - bpo-32363(12): 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. + + - bpo-32357(13): 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. + + - bpo-32356(14): asyncio.transport.resume_reading() and + pause_reading() are now idempotent. New transport.is_reading() + method is added. + + - bpo-32355(15): Optimize asyncio.gather(); now up to 15% faster. + + - bpo-32351(16): Use fastpath in asyncio.sleep if delay<0 (2x boost) + + - bpo-32348(17): Optimize asyncio.Future schedule/add/remove + callback. The optimization shows 3-6% performance improvements of + async/await code. + + - bpo-32331(18): 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. + + - bpo-32248(19): Add ‘importlib.abc.ResourceReader’ as an ABC for + loaders to provide a unified API for reading resources contained + within packages. Also add *note importlib.resources: 9b. as the + port of ‘importlib_resources’. + + - bpo-32311(20): Implement asyncio.create_task(coro) shortcut + + - bpo-32327(21): 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. + + - bpo-32323(22): *note urllib.parse.urlsplit(): 9b3. does not convert + zone-id (scope) to lower case for scoped IPv6 addresses in + hostnames now. + + - bpo-32302(23): Fix bdist_wininst of distutils for CRT v142: it + binary compatible with CRT v140. + + - bpo-29711(24): Fix ‘stop_serving’ in asyncio proactor loop kill all + listening servers + + - bpo-32308(25): *note re.sub(): 85d. now replaces empty matches + adjacent to a previous non-empty match. + + - bpo-29970(26): Abort asyncio SSLProtocol connection if handshake + not complete within 10 seconds. + + - bpo-32314(27): Implement asyncio.run(). + + - bpo-17852(28): Revert incorrect fix based on misunderstanding of + _Py_PyAtExit() semantics. + + - bpo-32296(29): Implement asyncio._get_running_loop() and + get_event_loop() in C. This makes them 4x faster. + + - bpo-32250(30): Implement ‘asyncio.current_task()’ and + ‘asyncio.all_tasks()’. Add helpers intended to be used by + alternative task implementations: ‘asyncio._register_task’, + ‘asyncio._enter_task’, ‘asyncio._leave_task’ and + ‘asyncio._unregister_task’. Deprecate + ‘asyncio.Task.current_task()’ and ‘asyncio.Task.all_tasks()’. + + - bpo-32255(31): 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. + + - bpo-32277(32): Raise ‘NotImplementedError’ instead of ‘SystemError’ + on platforms where ‘chmod(..., follow_symlinks=False)’ is not + supported. Patch by Anthony Sottile. + + - bpo-30050(33): 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. + + - bpo-29137(34): The ‘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. + + - bpo-32273(35): Move asyncio.test_utils to test.test_asyncio. + + - bpo-32272(36): Remove asyncio.async() function. + + - bpo-32269(37): Add asyncio.get_running_loop() function. + + - bpo-32265(38): All class and static methods of builtin types now + are correctly classified by inspect.classify_class_attrs() and + grouped in pydoc ouput. Added types.ClassMethodDescriptorType for + unbound class methods of builtin types. + + - bpo-32253(39): Deprecate ‘yield from lock’, ‘await lock’, ‘with + (yield from lock)’ and ‘with await lock’ for asyncio + synchronization primitives. + + - bpo-22589(40): Changed MIME type of .bmp from ‘image/x-ms-bmp’ to + ‘image/bmp’ + + - bpo-32193(41): Convert asyncio to use `async/await' syntax. Old + styled ‘yield from’ is still supported too. + + - bpo-32206(42): Add support to run modules with pdb + + - bpo-32227(43): ‘functools.singledispatch’ now supports registering + implementations using type annotations. + + - bpo-15873(44): Added new alternate constructors *note + datetime.datetime.fromisoformat(): 1ef, *note + datetime.time.fromisoformat(): 1ee. and *note + datetime.date.fromisoformat(): 1ed. as the inverse operation of + each classes’s respective ‘isoformat’ methods. + + - bpo-32199(45): The getnode() ip getter now uses ‘ip link’ instead + of ‘ip link list’. + + - bpo-32143(46): os.statvfs() includes the f_fsid field from + statvfs(2) + + - bpo-26439(47): Fix ctypes.util.find_library() for AIX by + implementing ctypes._aix.find_library() Patch by: Michael Felt + + - bpo-31993(48): 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. + + - bpo-27456(49): Ensure TCP_NODELAY is set on Linux. Tests by Victor + Stinner. + + - bpo-31778(50): ast.literal_eval() is now more strict. Addition and + subtraction of arbitrary numbers no longer allowed. + + - bpo-31802(51): Importing native path module (‘posixpath’, ‘ntpath’) + now works even if the ‘os’ module still is not imported. + + - bpo-30241(52): Add contextlib.AbstractAsyncContextManager. Patch + by Jelle Zijlstra. + + - bpo-31699(53): Fix deadlocks in *note + concurrent.futures.ProcessPoolExecutor: 52e. when task arguments or + results cause pickling or unpickling errors. This should make sure + that calls to the ‘ProcessPoolExecutor’ API always eventually + return. + + - bpo-15216(54): ‘TextIOWrapper.reconfigure()’ supports changing + `encoding', `errors', and `newline'. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32506 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32279 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32278 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32499 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32468 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23749 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32441 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32422 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31721 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32415 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=26133 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32363 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32357 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32356 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=32355 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=32351 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32348 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=32331 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=32248 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32311 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32327 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32323 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32302 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=29711 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=32308 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=29970 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=32314 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=17852 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=32296 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=32250 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=32255 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=32277 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=30050 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=29137 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=32273 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=32272 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=32269 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=32265 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=32253 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=22589 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=32193 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=32206 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=32227 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=15873 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=32199 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=32143 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=26439 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=31993 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=27456 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=31778 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=31802 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=30241 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=31699 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=15216 + + +File: python.info, Node: Documentation<41>, Next: Tests<39>, Prev: Library<42>, Up: Python 3 7 0 alpha 4 + +1.21.43.3 Documentation +....................... + + - bpo-32418(1): Add get_loop() method to Server and AbstractServer + classes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32418 + + +File: python.info, Node: Tests<39>, Next: Windows<38>, Prev: Documentation<41>, Up: Python 3 7 0 alpha 4 + +1.21.43.4 Tests +............... + + - bpo-32252(1): Fix faulthandler_suppress_crash_report() used to + prevent core dump files when testing crashes. getrlimit() returns + zero on success. + + - bpo-32002(2): Adjust C locale coercion testing for the empty locale + and POSIX locale cases to more readily adjust to platform dependent + behaviour. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32252 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32002 + + +File: python.info, Node: Windows<38>, Next: Tools/Demos<18>, Prev: Tests<39>, Up: Python 3 7 0 alpha 4 + +1.21.43.5 Windows +................. + + - bpo-19764(1): Implement support for + ‘subprocess.Popen(close_fds=True)’ on Windows. Patch by Segev + Finer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19764 + + +File: python.info, Node: Tools/Demos<18>, Next: C API<35>, Prev: Windows<38>, Up: Python 3 7 0 alpha 4 + +1.21.43.6 Tools/Demos +..................... + + - bpo-24960(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24960 + + +File: python.info, Node: C API<35>, Prev: Tools/Demos<18>, Up: Python 3 7 0 alpha 4 + +1.21.43.7 C API +............... + + - bpo-32030(1): Py_Initialize() doesn’t reset the memory allocators + to default if the ‘PYTHONMALLOC’ environment variable is not set. + + - bpo-29084(2): 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. + + - bpo-32264(3): Moved the pygetopt.h header into internal/, since it + has no public APIs. + + - bpo-32241(4): *note Py_SetProgramName(): 36d. and *note + Py_SetPythonHome(): 36e. now take the ‘const wchar *’ arguments + instead of ‘wchar *’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32030 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29084 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32264 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32241 + + +File: python.info, Node: Python 3 7 0 alpha 3, Next: Python 3 7 0 alpha 2, Prev: Python 3 7 0 alpha 4, Up: Changelog + +1.21.44 Python 3.7.0 alpha 3 +---------------------------- + +`Release date: 2017-12-05' + +* Menu: + +* Core and Builtins: Core and Builtins<43>. +* Library: Library<43>. +* Documentation: Documentation<42>. +* Tests: Tests<40>. +* Build: Build<41>. +* Windows: Windows<39>. +* macOS: macOS<29>. +* IDLE: IDLE<31>. +* Tools/Demos: Tools/Demos<19>. +* C API: C API<36>. + + +File: python.info, Node: Core and Builtins<43>, Next: Library<43>, Up: Python 3 7 0 alpha 3 + +1.21.44.1 Core and Builtins +........................... + + - bpo-32176(1): 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. + + - bpo-10544(2): 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. + + - bpo-32137(3): The repr of deeply nested dict now raises a + RecursionError instead of crashing due to a stack overflow. + + - bpo-32096(4): 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(). + + - bpo-32043(5): Add a new “developer mode”: new “-X dev” command line + option to enable debug checks at runtime. + + - bpo-32023(6): 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. + + - bpo-32012(7): 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. + + - bpo-28180(8): A new internal ‘_Py_SetLocaleFromEnv(category)’ + helper function has been added in order to improve the consistency + of behaviour across different ‘libc’ implementations (e.g. Android + doesn’t support setting the locale from the environment by + default). + + - bpo-31949(9): 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 ‘2**31’ traceback items on Windows. Fixed output + errors handling. + + - bpo-30696(10): Fix the interactive interpreter looping endlessly + when no memory. + + - bpo-20047(11): 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. + + - bpo-21720(12): BytesWarning no longer emitted when the `fromlist' + argument of ‘__import__()’ or the ‘__all__’ attribute of the module + contain bytes instances. + + - bpo-31845(13): Environment variables are once more read correctly + at interpreter startup. + + - bpo-28936(14): Ensure that lexically first syntax error involving a + parameter and ‘global’ or ‘nonlocal’ is detected first at a given + scope. Patch by Ivan Levkivskyi. + + - bpo-31825(15): Fixed OverflowError in the ‘unicode-escape’ codec + and in codecs.escape_decode() when decode an escaped non-ascii + byte. + + - bpo-31618(16): The per-frame tracing logic added in 3.7a1 has been + altered so that ‘frame->f_lineno’ is updated before either ‘"line"’ + or ‘"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 ‘f_trace_lines’ and + ‘f_trace_opcodes’ are enabled, line events now occur first. + + - bpo-28603(17): 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. + + - bpo-31786(18): 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. + + - bpo-31781(19): Prevent crashes when calling methods of an + uninitialized ‘zipimport.zipimporter’ object. Patch by Oren + Milman. + + - bpo-30399(20): Standard repr() of BaseException with a single + argument no longer contains redundant trailing comma. + + - bpo-31626(21): Fixed a bug in debug memory allocator. There was a + write to freed memory after shrinking a memory block. + + - bpo-30817(22): ‘PyErr_PrintEx()’ clears now the ignored exception + that may be raised by ‘_PySys_SetObjectId()’, for example when no + memory. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32176 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=10544 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32137 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32096 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32043 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32023 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32012 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28180 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31949 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=30696 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=20047 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=21720 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31845 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28936 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31825 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=31618 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28603 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31786 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31781 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=30399 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31626 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30817 + + +File: python.info, Node: Library<43>, Next: Documentation<42>, Prev: Core and Builtins<43>, Up: Python 3 7 0 alpha 3 + +1.21.44.2 Library +................. + + - bpo-28556(1): Two minor fixes for ‘typing’ module: allow shallow + copying instances of generic classes, improve interaction of + ‘__init_subclass__’ with generics. Original PRs by Ivan + Levkivskyi. + + - bpo-32214(2): PEP 557, Data Classes. Provides a decorator which + adds boilerplate methods to classes which use type annotations so + specify fields. + + - bpo-27240(3): The header folding algorithm for the new email + policies has been rewritten, which also fixes bpo-30788(4), + bpo-31831(5), and bpo-32182(6). In particular, RFC2231 folding is + now done correctly. + + - bpo-32186(7): 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. + + - bpo-32101(8): Add ‘sys.flags.dev_mode’ flag + + - bpo-32154(9): The ‘asyncio.windows_utils.socketpair()’ function has + been removed: use directly *note socket.socketpair(): 860. which is + available on all platforms since Python 3.5 (before, it wasn’t + available on Windows). ‘asyncio.windows_utils.socketpair()’ was + just an alias to ‘socket.socketpair’ on Python 3.5 and newer. + + - bpo-32089(10): 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. + + - bpo-32107(11): ‘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 ‘uuid.uuid1()’. If only + locally administered MAC addresses are available, the first such + one found is returned. + + - bpo-23033(12): Wildcard is now supported in hostname when it is one + and only character in the left most segment of hostname in second + argument of *note ssl.match_hostname(): 492. Patch by Mandeep + Singh. + + - bpo-12239(13): Make *note msilib.SummaryInformation.GetProperty(): + 1418. return ‘None’ when the value of property is ‘VT_EMPTY’. + Initial patch by Mark Mc Mahon. + + - bpo-28334(14): Use *note os.path.expanduser(): 65d. to find the + ‘~/.netrc’ file in *note netrc.netrc: 12c7. If it does not exist, + *note FileNotFoundError: b53. is raised. Patch by Dimitri + Merejkowsky. + + - bpo-32121(15): Made ‘tracemalloc.Traceback’ behave more like the + traceback module, sorting the frames from oldest to most recent. + ‘Traceback.format()’ now accepts negative `limit', truncating the + result to the ‘abs(limit)’ oldest frames. To get the old + behaviour, one can use the new `most_recent_first' argument to + ‘Traceback.format()’. (Patch by Jesse Bakker.) + + - bpo-31325(16): Fix wrong usage of *note collections.namedtuple(): + 538. in the *note RobotFileParser.parse(): 14e3. method. Initial + patch by Robin Wellner. + + - bpo-12382(17): *note msilib.OpenDatabase(): 1360. now raises a + better exception message when it couldn’t open or create an MSI + file. Initial patch by William Tisäter. + + - bpo-19610(18): ‘setup()’ now warns about invalid types for some + fields. The ‘distutils.dist.Distribution’ class now warns when + ‘classifiers’, ‘keywords’ and ‘platforms’ fields are not specified + as a list or a string. + + - bpo-32071(19): Added the ‘-k’ command-line option to ‘python -m + unittest’ to run only tests that match the given pattern(s). + + - bpo-10049(20): Added `nullcontext' no-op context manager to + contextlib. This provides a simpler and faster alternative to + ExitStack() when handling optional context managers. + + - bpo-28684(21): 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). + + - bpo-32110(22): ‘codecs.StreamReader.read(n)’ now returns not more + than `n' characters/bytes for non-negative `n'. This makes it + compatible with ‘read()’ methods of other file-like objects. + + - bpo-27535(23): 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. + + - bpo-32088(24): warnings: When Python is build is debug mode + (‘Py_DEBUG’), *note DeprecationWarning: 2d4, *note + PendingDeprecationWarning: 503. and *note ImportWarning: 46d. + warnings are now displayed by default. + + - bpo-1647489(25): Fixed searching regular expression patterns that + could match an empty string. Non-empty string can now be correctly + found after matching an empty string. + + - bpo-25054(26): Added support of splitting on a pattern that could + match an empty string. + + - bpo-32072(27): 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. + + - bpo-32069(28): Drop legacy SSL transport from asyncio, + ssl.MemoryBIO is always used anyway. + + - bpo-32066(29): asyncio: Support pathlib.Path in + create_unix_connection; sock arg should be optional + + - bpo-32046(30): Updates 2to3 to convert from + operator.isCallable(obj) to callable(obj). Patch by Dong-hee Na. + + - bpo-32018(31): inspect.signature should follow PEP 8(32), if the + parameter has an annotation and a default value. Patch by Dong-hee + Na. + + - bpo-32025(33): Add time.thread_time() and time.thread_time_ns() + + - bpo-32037(34): 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. + + - bpo-32034(35): Make asyncio.IncompleteReadError and + LimitOverrunError pickleable. + + - bpo-32015(36): Fixed the looping of asyncio in the case of + reconnection the socket during waiting async read/write from/to the + socket. + + - bpo-32011(37): Restored support of loading marshal files with the + TYPE_INT64 code. These files can be produced in Python 2.7. + + - bpo-28369(38): 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. + + - bpo-31976(39): Fix race condition when flushing a file is slow, + which can cause a segfault if closing the file from another thread. + + - bpo-31985(40): 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. + + - bpo-21862(41): cProfile command line now accepts ‘-m module_name’ + as an alternative to script path. Patch by Sanyam Khurana. + + - bpo-31970(42): Reduce performance overhead of asyncio debug mode. + + - bpo-31843(43): `database' argument of sqlite3.connect() now accepts + a *note path-like object: 773, instead of just a string. + + - bpo-31945(44): Add Configurable `blocksize' to ‘HTTPConnection’ and + ‘HTTPSConnection’ for improved upload throughput. Patch by Nir + Soffer. + + - bpo-31943(45): Add a ‘cancelled()’ method to *note asyncio.Handle: + 14e4. Patch by Marat Sharafutdinov. + + - bpo-9678(46): 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. + + - bpo-30057(47): Fix potential missed signal in signal.signal(). + + - bpo-31933(48): Fix Blake2 params leaf_size and node_offset on big + endian platforms. Patch by Jack O’Connor. + + - bpo-21423(49): Add an initializer argument to + {Process,Thread}PoolExecutor + + - bpo-31927(50): 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. + + - bpo-27666(51): 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. + + - bpo-31917(52): Add 3 new clock identifiers: *note + time.CLOCK_BOOTTIME: 7f0, *note time.CLOCK_PROF: 7f1. and *note + time.CLOCK_UPTIME: 7f2. + + - bpo-31897(53): plistlib now catches more errors when read binary + plists and raises InvalidFileException instead of unexpected + exceptions. + + - bpo-25720(54): Fix the method for checking pad state of curses + WINDOW. Patch by Masayuki Yamamoto. + + - bpo-31893(55): Fixed the layout of the kqueue_event structure on + OpenBSD and NetBSD. Fixed the comparison of the kqueue_event + objects. + + - bpo-31891(56): Fixed building the curses module on NetBSD. + + - bpo-31884(57): added required constants to subprocess module for + setting priority on windows + + - bpo-28281(58): Remove year (1-9999) limits on the + Calendar.weekday() function. Patch by Mark Gollahon. + + - bpo-31702(59): crypt.mksalt() now allows to specify the number of + rounds for SHA-256 and SHA-512 hashing. + + - bpo-30639(60): *note inspect.getfile(): 14e5. no longer computes + the repr of unknown objects to display in an error message, to + protect against badly behaved custom reprs. + + - bpo-30768(61): 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 PEP 475(62). + + - bpo-31854(63): Add ‘mmap.ACCESS_DEFAULT’ constant. + + - bpo-31834(64): Use optimized code for BLAKE2 only with SSSE3+. The + pure SSE2 implementation is slower than the pure C reference + implementation. + + - bpo-28292(65): 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. + + - bpo-28564(66): The shutil.rmtree() function has been sped up to + 20–40%. This was done using the os.scandir() function. + + - bpo-28416(67): Instances of pickle.Pickler subclass with the + persistent_id() method and pickle.Unpickler subclass with the + persistent_load() method no longer create reference cycles. + + - bpo-31653(68): Don’t release the GIL if we can acquire a + multiprocessing semaphore immediately. + + - bpo-28326(69): Fix multiprocessing.Process when stdout and/or + stderr is closed or None. + + - bpo-20825(70): Add ‘subnet_of’ and ‘superset_of’ containment tests + to *note ipaddress.IPv6Network: 7a2. and *note + ipaddress.IPv4Network: 7a3. Patch by Michel Albert and Cheryl + Sabella. + + - bpo-31827(71): 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. + + - bpo-31756(72): Add a ‘subprocess.Popen(text=False)’ keyword + argument to *note subprocess: f6. functions to be more explicit + about when the library should attempt to decode outputs into text. + Patch by Andrew Clegg. + + - bpo-31819(73): Add AbstractEventLoop.sock_recv_into(). + + - bpo-31457(74): If nested log adapters are used, the inner + ‘process()’ methods are no longer omitted. + + - bpo-31457(75): The ‘manager’ property on LoggerAdapter objects is + now properly settable. + + - bpo-31806(76): 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. + + - bpo-31803(77): time.clock() and time.get_clock_info(‘clock’) now + emit a DeprecationWarning warning. + + - bpo-31800(78): Extended support for parsing UTC offsets. strptime + ‘%z’ can now parse the output generated by datetime.isoformat, + including seconds and microseconds. + + - bpo-28603(79): 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. + + - bpo-30541(80): Add new function to seal a mock and prevent the + automatically creation of child mocks. Patch by Mario Corchero. + + - bpo-31784(81): Implement the PEP 564(82), add new 6 new functions + with nanosecond resolution to the *note time: 10c. module: *note + clock_gettime_ns(): 737, *note clock_settime_ns(): 738, *note + monotonic_ns(): 739, *note perf_counter_ns(): 73a, *note + process_time_ns(): 73b, *note time_ns(): 73c. + + - bpo-30143(83): 2to3 now generates a code that uses abstract + collection classes from collections.abc rather than collections. + + - bpo-31770(84): Prevent a crash when calling the ‘__init__()’ method + of a ‘sqlite3.Cursor’ object more than once. Patch by Oren Milman. + + - bpo-31764(85): Prevent a crash in ‘sqlite3.Cursor.close()’ in case + the ‘Cursor’ object is uninitialized. Patch by Oren Milman. + + - bpo-31752(86): Fix possible crash in timedelta constructor called + with custom integers. + + - bpo-31620(87): an empty asyncio.Queue now doesn’t leak memory when + queue.get pollers timeout + + - bpo-31690(88): Allow the flags re.ASCII, re.LOCALE, and re.UNICODE + to be used as group flags for regular expressions. + + - bpo-30349(89): FutureWarning is now emitted if a regular expression + contains character set constructs that will change semantically in + the future (nested sets and set operations). + + - bpo-31664(90): Added support for the Blowfish hashing in the crypt + module. + + - bpo-31632(91): Fix method set_protocol() of class + _SSLProtocolTransport in asyncio module. This method was + previously modifying a wrong reference to the protocol. + + - bpo-15037(92): Added a workaround for getkey() in curses for + ncurses 5.7 and earlier. + + - bpo-31307(93): Allow use of bytes objects for arguments to *note + configparser.ConfigParser.read(): 14e6. Patch by Vincent Michel. + + - bpo-31334(94): Fix ‘poll.poll([timeout])’ in the ‘select’ module + for arbitrary negative timeouts on all OSes where it can only be a + non-negative integer or -1. Patch by Riccardo Coccioli. + + - bpo-31310(95): multiprocessing’s semaphore tracker should be + launched again if crashed. + + - bpo-31308(96): Make multiprocessing’s forkserver process immune to + Ctrl-C and other user interruptions. If it crashes, restart it + when necessary. + + - bpo-31245(97): Added support for AF_UNIX socket in asyncio + ‘create_datagram_endpoint’. + + - bpo-30553(98): Add HTTP/2 status code 421 (Misdirected Request) to + *note http.HTTPStatus: 543. Patch by Vitor Pereira. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32214 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27240 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30788 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31831 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32182 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32186 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32101 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32154 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32089 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32107 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=23033 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=12239 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28334 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=32121 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=31325 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=12382 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=19610 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=32071 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=10049 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28684 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=32110 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=27535 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=32088 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=1647489 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=25054 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=32072 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=32069 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=32066 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=32046 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=32018 + + (32) https://peps.python.org/pep-0008/ + + (33) https://bugs.python.org/issue?@action=redirect&bpo=32025 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=32037 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=32034 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=32015 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=32011 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=28369 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=31976 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=31985 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=21862 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=31970 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=31843 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=31945 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=31943 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=9678 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=30057 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=31933 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=21423 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=31927 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=27666 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=31917 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=31897 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=25720 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=31893 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=31891 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=31884 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=28281 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=31702 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=30639 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=30768 + + (62) https://peps.python.org/pep-0475/ + + (63) https://bugs.python.org/issue?@action=redirect&bpo=31854 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=31834 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=28292 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=28564 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=28416 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=31653 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=28326 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=20825 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=31827 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=31756 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=31819 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=31457 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=31457 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=31806 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=31803 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=31800 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=28603 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=30541 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=31784 + + (82) https://peps.python.org/pep-0564/ + + (83) https://bugs.python.org/issue?@action=redirect&bpo=30143 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=31770 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=31764 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=31752 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=31620 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=31690 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=30349 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=31664 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=31632 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=15037 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=31307 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=31334 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=31310 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=31308 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=31245 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=30553 + + +File: python.info, Node: Documentation<42>, Next: Tests<40>, Prev: Library<43>, Up: Python 3 7 0 alpha 3 + +1.21.44.3 Documentation +....................... + + - bpo-32105(1): Added asyncio.BaseEventLoop.connect_accepted_socket + versionadded marker. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32105 + + +File: python.info, Node: Tests<40>, Next: Build<41>, Prev: Documentation<42>, Up: Python 3 7 0 alpha 3 + +1.21.44.4 Tests +............... + + - bpo-31380(1): Skip test_httpservers test_undecodable_file on macOS: + fails on APFS. + + - bpo-31705(2): 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. + + - bpo-32138(3): Skip on Android test_faulthandler tests that raise + SIGSEGV and remove the test.support.requires_android_level + decorator. + + - bpo-32136(4): The runtime embedding tests have been split out from + ‘Lib/test/test_capi.py’ into a new ‘Lib/test/test_embed.py’ file. + + - bpo-28668(5): 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. + + - bpo-32126(6): Skip test_get_event_loop_new_process in + test.test_asyncio.test_events when sem_open() is not functional. + + - bpo-31174(7): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31380 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31705 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32138 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32136 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28668 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32126 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31174 + + +File: python.info, Node: Build<41>, Next: Windows<39>, Prev: Tests<40>, Up: Python 3 7 0 alpha 3 + +1.21.44.5 Build +............... + + - bpo-28538(1): Revert the previous changes, the if_nameindex + structure is defined by Unified Headers. + + - bpo-28762(2): Revert the last commit, the F_LOCK macro is defined + by Android Unified Headers. + + - bpo-29040(3): Support building Android with Unified Headers. The + first NDK release to support Unified Headers is android-ndk-r14. + + - bpo-32059(4): ‘detect_modules()’ in ‘setup.py’ now also searches + the sysroot paths when cross-compiling. + + - bpo-31957(5): Fixes Windows SDK version detection when building for + Windows. + + - bpo-31609(6): Fixes quotes in PCbuild/clean.bat + + - bpo-31934(7): Abort the build when building out of a not clean + source tree. + + - bpo-31926(8): 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. + + - bpo-28791(9): Update Windows builds to use SQLite 3.21.0. + + - bpo-28791(10): Update OS X installer to use SQLite 3.21.0. + + - bpo-28643(11): Record profile-opt build progress with stamp files. + + - bpo-31866(12): Finish removing support for AtheOS. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28538 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28762 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29040 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32059 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31957 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31609 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31934 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31926 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28791 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28791 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28643 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31866 + + +File: python.info, Node: Windows<39>, Next: macOS<29>, Prev: Build<41>, Up: Python 3 7 0 alpha 3 + +1.21.44.6 Windows +................. + + - bpo-1102(1): Return ‘None’ when ‘View.Fetch()’ returns + ‘ERROR_NO_MORE_ITEMS’ instead of raising ‘MSIError’. Initial patch + by Anthony Tuininga. + + - bpo-31944(2): Fixes Modify button in Apps and Features dialog. + + - bpo-20486(3): Implement the ‘Database.Close()’ method to help + closing MSI database objects. + + - bpo-31857(4): Make the behavior of USE_STACKCHECK deterministic in + a multi-threaded environment. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1102 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31944 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20486 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31857 + + +File: python.info, Node: macOS<29>, Next: IDLE<31>, Prev: Windows<39>, Up: Python 3 7 0 alpha 3 + +1.21.44.7 macOS +............... + + - bpo-31392(1): Update macOS installer to use OpenSSL 1.0.2m + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31392 + + +File: python.info, Node: IDLE<31>, Next: Tools/Demos<19>, Prev: macOS<29>, Up: Python 3 7 0 alpha 3 + +1.21.44.8 IDLE +.............. + + - bpo-32207(1): 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. + + - bpo-32164(2): Delete unused file idlelib/tabbedpages.py. Use of + TabbedPageSet in configdialog was replaced by ttk.Notebook. + + - bpo-32100(3): IDLE: Fix old and new bugs in pathbrowser; improve + tests. Patch mostly by Cheryl Sabella. + + - bpo-31858(4): 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. + + - bpo-31860(5): The font sample in the IDLE configuration dialog is + now editable. Changes persist while IDLE remains open + + - bpo-31836(6): 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. + + - bpo-28603(7): Fix a TypeError that caused a shell restart when + printing a traceback that includes an exception that is unhashable. + Patch by Zane Bitter. + + - bpo-13802(8): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32207 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32164 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32100 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31858 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31860 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31836 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28603 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=13802 + + +File: python.info, Node: Tools/Demos<19>, Next: C API<36>, Prev: IDLE<31>, Up: Python 3 7 0 alpha 3 + +1.21.44.9 Tools/Demos +..................... + + - bpo-32159(1): 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. + + - bpo-30722(2): Make redemo work with Python 3.6 and newer versions. + Also, remove the ‘LOCALE’ option since it doesn’t work with string + patterns in Python 3. Patch by Christoph Sarnowski. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32159 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30722 + + +File: python.info, Node: C API<36>, Prev: Tools/Demos<19>, Up: Python 3 7 0 alpha 3 + +1.21.44.10 C API +................ + + - bpo-20891(1): 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. + + - bpo-32125(2): The ‘Py_UseClassExceptionsFlag’ flag has been + removed. It was deprecated and wasn’t used anymore since Python + 2.0. + + - bpo-25612(3): 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. + + - bpo-23699(4): Add Py_RETURN_RICHCOMPARE macro to reduce boilerplate + code in rich comparison functions. + + - bpo-30697(5): The ‘PyExc_RecursionErrorInst’ singleton is removed + and ‘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(6). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20891 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32125 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25612 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23699 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30697 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22898 + + +File: python.info, Node: Python 3 7 0 alpha 2, Next: Python 3 7 0 alpha 1, Prev: Python 3 7 0 alpha 3, Up: Changelog + +1.21.45 Python 3.7.0 alpha 2 +---------------------------- + +`Release date: 2017-10-16' + +* Menu: + +* Core and Builtins: Core and Builtins<44>. +* Library: Library<44>. +* Documentation: Documentation<43>. +* Build: Build<42>. +* IDLE: IDLE<32>. +* C API: C API<37>. + + +File: python.info, Node: Core and Builtins<44>, Next: Library<44>, Up: Python 3 7 0 alpha 2 + +1.21.45.1 Core and Builtins +........................... + + - bpo-31558(1): ‘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(). + + - bpo-31642(2): Restored blocking “from package import module” by + setting sys.modules[“package.module”] to None. + + - bpo-31708(3): Allow use of asynchronous generator expressions in + synchronous functions. + + - bpo-31709(4): Drop support of asynchronous __aiter__. + + - bpo-30404(5): The -u option now makes the stdout and stderr streams + unbuffered rather than line-buffered. + + - bpo-31619(6): Fixed a ValueError when convert a string with large + number of underscores to integer with binary base. + + - bpo-31602(7): Fix an assertion failure in + ‘zipimporter.get_source()’ in case of a bad *note + zlib.decompress(): 97e. Patch by Oren Milman. + + - bpo-31592(8): Fixed an assertion failure in Python parser in case + of a bad *note unicodedata.normalize(): 29e. Patch by Oren Milman. + + - bpo-31588(9): Raise a *note TypeError: 19c. with a helpful error + message when class creation fails due to a metaclass with a bad + ‘__prepare__()’ method. Patch by Oren Milman. + + - bpo-31574(10): Importlib was instrumented with two dtrace probes to + profile import timing. + + - bpo-31566(11): Fix an assertion failure in ‘_warnings.warn()’ in + case of a bad ‘__name__’ global. Patch by Oren Milman. + + - bpo-31506(12): Improved the error message logic for object.__new__ + and object.__init__. + + - bpo-31505(13): Fix an assertion failure in *note json: a2, in case + ‘_json.make_encoder()’ received a bad ‘encoder()’ argument. Patch + by Oren Milman. + + - bpo-31492(14): Fix assertion failures in case of failing to import + from a module with a bad ‘__name__’ attribute, and in case of + failing to access an attribute of such a module. Patch by Oren + Milman. + + - bpo-31478(15): Fix an assertion failure in ‘_random.Random.seed()’ + in case the argument has a bad ‘__abs__()’ method. Patch by Oren + Milman. + + - bpo-31336(16): Speed up class creation by 10-20% by reducing the + overhead in the necessary special method lookups. Patch by Stefan + Behnel. + + - bpo-31415(17): Add ‘-X importtime’ option to show how long each + import takes. It can be used to optimize application’s startup + time. Support the *note PYTHONPROFILEIMPORTTIME: 74a. as an + equivalent way to enable this. + + - bpo-31410(18): Optimized calling wrapper and classmethod + descriptors. + + - bpo-31353(19): PEP 553(20) - Add a new built-in called + ‘breakpoint()’ which calls ‘sys.breakpointhook()’. By default this + imports ‘pdb’ and calls ‘pdb.set_trace()’, but users may override + ‘sys.breakpointhook()’ to call whatever debugger they want. The + original value of the hook is saved in ‘sys.__breakpointhook__’. + + - bpo-17852(21): Maintain a list of open buffered files, flush them + before exiting the interpreter. Based on a patch from Armin Rigo. + + - bpo-31315(22): Fix an assertion failure in imp.create_dynamic(), + when spec.name is not a string. Patch by Oren Milman. + + - bpo-31311(23): Fix a crash in the ‘__setstate__()’ method of *note + ctypes._CData: 14f1, in case of a bad ‘__dict__’. Patch by Oren + Milman. + + - bpo-31293(24): 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. + + - bpo-31285(25): Fix an assertion failure in *note + warnings.warn_explicit: 96f, when the return value of the received + loader’s get_source() has a bad splitlines() method. Patch by Oren + Milman. + + - bpo-30406(26): Make ‘async’ and ‘await’ proper keywords, as + specified in PEP 492(27). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31558 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31642 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31708 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31709 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30404 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31619 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31602 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31592 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31588 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31574 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31566 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31506 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31505 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31492 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31478 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=31336 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=31415 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31410 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31353 + + (20) https://peps.python.org/pep-0553/ + + (21) https://bugs.python.org/issue?@action=redirect&bpo=17852 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=31315 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31311 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=31293 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=31285 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=30406 + + (27) https://peps.python.org/pep-0492/ + + +File: python.info, Node: Library<44>, Next: Documentation<43>, Prev: Core and Builtins<44>, Up: Python 3 7 0 alpha 2 + +1.21.45.2 Library +................. + + - bpo-30058(1): Fixed buffer overflow in select.kqueue.control(). + + - bpo-31672(2): ‘idpattern’ in ‘string.Template’ matched some + non-ASCII characters. Now it uses ‘-i’ regular expression local + flag to avoid non-ASCII characters. + + - bpo-31701(3): On Windows, faulthandler.enable() now ignores MSC and + COM exceptions. + + - bpo-31728(4): Prevent crashes in ‘_elementtree’ due to unsafe + cleanup of ‘Element.text’ and ‘Element.tail’. Patch by Oren + Milman. + + - bpo-31671(5): Now ‘re.compile()’ converts passed RegexFlag to + normal int object before compiling. bm_regex_compile benchmark + shows 14% performance improvements. + + - bpo-30397(6): The types of compiled regular objects and match + objects are now exposed as ‘re.Pattern’ and ‘re.Match’. This adds + information in pydoc output for the re module. + + - bpo-31675(7): Fixed memory leaks in Tkinter’s methods splitlist() + and split() when pass a string larger than 2 GiB. + + - bpo-31673(8): Fixed typo in the name of Tkinter’s method + adderrorinfo(). + + - bpo-31648(9): 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. + + - bpo-30806(10): Fix the string representation of a netrc object. + + - bpo-31638(11): Add optional argument ‘compressed’ to + ‘zipapp.create_archive’, and add option ‘--compress’ to the command + line interface of ‘zipapp’. + + - bpo-25351(12): Avoid venv activate failures with undefined + variables + + - bpo-20519(13): Avoid ctypes use (if possible) and improve import + time for uuid. + + - bpo-28293(14): The regular expression cache is no longer completely + dumped when it is full. + + - bpo-31596(15): Added pthread_getcpuclockid() to the time module + + - bpo-27494(16): Make 2to3 accept a trailing comma in generator + expressions. For example, ‘set(x for x in [],)’ is now allowed. + + - bpo-30347(17): Stop crashes when concurrently iterate over + itertools.groupby() iterators. + + - bpo-30346(18): An iterator produced by itertools.groupby() iterator + now becomes exhausted after advancing the groupby iterator. + + - bpo-31556(19): Cancel asyncio.wait_for future faster if timeout <= + 0 + + - bpo-31540(20): Allow passing a context object in *note + concurrent.futures.ProcessPoolExecutor: 52e. constructor. Also, + free job resources in *note concurrent.futures.ProcessPoolExecutor: + 52e. earlier to improve memory usage when a worker waits for new + jobs. + + - bpo-31516(21): ‘threading.current_thread()’ should not return a + dummy thread at shutdown. + + - bpo-31525(22): In the sqlite module, require the sqlite3_prepare_v2 + API. Thus, the sqlite module now requires sqlite version at least + 3.3.9. + + - bpo-26510(23): argparse subparsers are now required by default. + This matches behaviour in Python 2. For optional subparsers, use + the new parameter ‘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.) + + - bpo-27541(24): Reprs of subclasses of some collection and iterator + classes (*note bytearray: 1a5, *note array.array: 3d2, *note + collections.deque: 1a9, *note collections.defaultdict: e71, *note + itertools.count: f3d, *note itertools.repeat: 14f3.) now contain + actual type name insteads of hardcoded name of the base class. + + - bpo-31351(25): python -m ensurepip now exits with non-zero exit + code if pip bootstrapping has failed. + + - bpo-31389(26): ‘pdb.set_trace()’ now takes an optional keyword-only + argument ‘header’. If given, this is printed to the console just + before debugging begins. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30058 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31672 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31701 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31728 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31671 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30397 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31675 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31673 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31648 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=30806 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31638 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25351 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=20519 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28293 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31596 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=27494 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=30347 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=30346 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31556 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31540 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31516 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=31525 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=26510 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=27541 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=31351 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=31389 + + +File: python.info, Node: Documentation<43>, Next: Build<42>, Prev: Library<44>, Up: Python 3 7 0 alpha 2 + +1.21.45.3 Documentation +....................... + + - bpo-31537(1): Fix incorrect usage of ‘get_history_length’ in + readline documentation example code. Patch by Brad Smith. + + - bpo-30085(2): The operator functions without double underscores are + preferred for clarity. The one with underscores are only kept for + back-compatibility. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31537 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30085 + + +File: python.info, Node: Build<42>, Next: IDLE<32>, Prev: Documentation<43>, Up: Python 3 7 0 alpha 2 + +1.21.45.4 Build +............... + + - bpo-31696(1): Improve compiler version information in *note + sys.version: 990. when Python is built with Clang. + + - bpo-31625(2): Stop using ranlib on static libraries. Instead, we + assume ar supports the ‘s’ flag. + + - bpo-31624(3): Remove support for BSD/OS. + + - bpo-22140(4): Prevent double substitution of prefix in + python-config.sh. + + - bpo-31569(5): Correct PCBuild/ case to PCbuild/ in build scripts + and documentation. + + - bpo-31536(6): Avoid wholesale rebuild after ‘make regen-all’ if + nothing changed. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31696 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31625 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31624 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22140 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31569 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31536 + + +File: python.info, Node: IDLE<32>, Next: C API<37>, Prev: Build<42>, Up: Python 3 7 0 alpha 2 + +1.21.45.5 IDLE +.............. + + - bpo-31460(1): 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. + + - bpo-31649(2): IDLE - Make _htest, _utest parameters keyword only. + + - bpo-31559(3): Remove test order dependence in + idle_test.test_browser. + + - bpo-31459(4): 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 + <>, which appears on the Keys tab of the + Settings dialog, is not changed. Patch by Cheryl Sabella. + + - bpo-31500(5): Default fonts now are scaled on HiDPI displays. + + - bpo-1612262(6): IDLE module browser now shows nested classes and + functions. Original patches for code and tests by Guilherme Polo + and Cheryl Sabella, respectively. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31460 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31649 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31559 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31459 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31500 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=1612262 + + +File: python.info, Node: C API<37>, Prev: IDLE<32>, Up: Python 3 7 0 alpha 2 + +1.21.45.6 C API +............... + + - bpo-28280(1): Make ‘PyMapping_Keys()’, ‘PyMapping_Values()’ and + ‘PyMapping_Items()’ always return a *note list: 1e9. (rather than a + *note list: 1e9. or a *note tuple: 539.). Patch by Oren Milman. + + - bpo-31532(2): Fix memory corruption due to allocator mix in + getpath.c between Py_GetPath() and Py_SetPath() + + - bpo-25658(3): Implement PEP 539(4) 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28280 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31532 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25658 + + (4) https://peps.python.org/pep-0539/ + + +File: python.info, Node: Python 3 7 0 alpha 1, Next: Python 3 6 6 final, Prev: Python 3 7 0 alpha 2, Up: Changelog + +1.21.46 Python 3.7.0 alpha 1 +---------------------------- + +`Release date: 2017-09-19' + +* Menu: + +* Security: Security<25>. +* Core and Builtins: Core and Builtins<45>. +* Library: Library<45>. +* Documentation: Documentation<44>. +* Tests: Tests<41>. +* Build: Build<43>. +* Windows: Windows<40>. +* IDLE: IDLE<33>. +* Tools/Demos: Tools/Demos<20>. +* C API: C API<38>. + + +File: python.info, Node: Security<25>, Next: Core and Builtins<45>, Up: Python 3 7 0 alpha 1 + +1.21.46.1 Security +.................. + + - bpo-29781(1): SSLObject.version() now correctly returns None when + handshake over BIO has not been performed yet. + + - bpo-29505(2): Add fuzz tests for float(str), int(str), + unicode(str); for oss-fuzz. + + - bpo-30947(3): Upgrade libexpat embedded copy from version 2.2.1 to + 2.2.3 to get security fixes. + + - bpo-30730(4): Prevent environment variables injection in subprocess + on Windows. Prevent passing other environment variables and + command arguments. + + - bpo-30694(5): Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes + of multiple security vulnerabilities including: CVE-2017-9233 + (External entity infinite loop DoS), CVE-2016-9063 (Integer + overflow, re-fix), CVE-2016-0718 (Fix regression bugs from 2.2.0’s + fix to CVE-2016-0718) and CVE-2012-0876 (Counter hash flooding with + SipHash). Note: the 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 + ‘XML_SetHashSalt()’. + + - bpo-30500(6): Fix urllib.parse.splithost() to correctly parse + fragments. For example, ‘splithost('//127.0.0.1#@evil.com/')’ now + correctly returns the ‘127.0.0.1’ host, instead of treating + ‘@evil.com’ as the host in an authentication (‘login@host’). + + - bpo-29591(7): Update expat copy from 2.1.1 to 2.2.0 to get fixes of + CVE-2016-0718 and CVE-2016-4472. See + ‘https://sourceforge.net/p/expat/bugs/537/’ for more information. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29781 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29505 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30947 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30730 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30694 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30500 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29591 + + +File: python.info, Node: Core and Builtins<45>, Next: Library<45>, Prev: Security<25>, Up: Python 3 7 0 alpha 1 + +1.21.46.2 Core and Builtins +........................... + + - bpo-31490(1): Fix an assertion failure in *note ctypes: 29. class + definition, in case the class has an attribute whose name is + specified in ‘_anonymous_’ but not in ‘_fields_’. Patch by Oren + Milman. + + - bpo-31471(2): Fix an assertion failure in *note subprocess.Popen(): + 6e8. on Windows, in case the env argument has a bad keys() method. + Patch by Oren Milman. + + - bpo-31418(3): Fix an assertion failure in ‘PyErr_WriteUnraisable()’ + in case of an exception with a bad ‘__module__’ attribute. Patch + by Oren Milman. + + - bpo-31416(4): Fix assertion failures in case of a bad + warnings.filters or warnings.defaultaction. Patch by Oren Milman. + + - bpo-28411(5): 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. + + - bpo-28411(6): Switch to the abstract API when dealing with + ‘PyInterpreterState.modules’. This allows later support for all + dict subclasses and other Mapping implementations. Also add a + ‘PyImport_GetModule()’ function to reduce a bunch of duplicated + code. + + - bpo-31411(7): Raise a TypeError instead of SystemError in case + warnings.onceregistry is not a dictionary. Patch by Oren Milman. + + - bpo-31344(8): 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: ‘f_trace_lines’ + (‘True’ by default) to turn off per-line trace events; and + ‘f_trace_opcodes’ (‘False’ by default) to turn on per-opcode trace + events. + + - bpo-31373(9): Fix several possible instances of undefined behavior + due to floating-point demotions. + + - bpo-30465(10): Location information (‘lineno’ and ‘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). + + - bpo-30860(11): Consolidate CPython’s global runtime state under a + single struct. This improves discoverability of the runtime state. + + - bpo-31347(12): Fix possible undefined behavior in + _PyObject_FastCall_Prepend. + + - bpo-31343(13): Include sys/sysmacros.h for major(), minor(), and + makedev(). GNU C libray plans to remove the functions from + sys/types.h. + + - bpo-31291(14): Fix an assertion failure in *note + zipimport.zipimporter.get_data: 14fb. on Windows, when the return + value of ‘pathname.replace('/','\\')’ isn’t a string. Patch by + Oren Milman. + + - bpo-31271(15): Fix an assertion failure in the write() method of + *note io.TextIOWrapper: 9ad, when the encoder doesn’t return a + bytes object. Patch by Oren Milman. + + - bpo-31243(16): Fix a crash in some methods of *note + io.TextIOWrapper: 9ad, when the decoder’s state is invalid. Patch + by Oren Milman. + + - bpo-30721(17): ‘print’ now shows correct usage hint for using + Python 2 redirection syntax. Patch by Sanyam Khurana. + + - bpo-31070(18): Fix a race condition in importlib + _get_module_lock(). + + - bpo-30747(19): Add a non-dummy implementation of _Py_atomic_store + and _Py_atomic_load on MSVC. + + - bpo-31095(20): Fix potential crash during GC caused by ‘tp_dealloc’ + which doesn’t call ‘PyObject_GC_UnTrack()’. + + - bpo-31071(21): Avoid masking original TypeError in call with * + unpacking when other arguments are passed. + + - bpo-30978(22): str.format_map() now passes key lookup exceptions + through. Previously any exception was replaced with a KeyError + exception. + + - bpo-30808(23): Use _Py_atomic API for concurrency-sensitive signal + state. + + - bpo-30876(24): 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. + + - bpo-30703(25): 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). + + - bpo-30765(26): Avoid blocking in pthread_mutex_lock() when + PyThread_acquire_lock() is asked not to block. + + - bpo-31161(27): Make sure the ‘Missing parentheses’ syntax error + message is only applied to SyntaxError, not to subclasses. Patch + by Martijn Pieters. + + - bpo-30814(28): Fixed a race condition when import a submodule from + a package. + + - bpo-30736(29): The internal unicodedata database has been upgraded + to Unicode 10.0. + + - bpo-30604(30): Move co_extra_freefuncs from per-thread to + per-interpreter to avoid crashes. + + - bpo-30597(31): ‘print’ now shows expected input in custom error + message when used as a Python 2 statement. Patch by Sanyam + Khurana. + + - bpo-30682(32): Removed a too-strict assertion that failed for + certain f-strings, such as eval(“f’\n’”) and eval(“f’\r’”). + + - bpo-30501(33): 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. + + - bpo-28180(34): Implement PEP 538(35) (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. + + - bpo-30486(36): Allows setting cell values for __closure__. Patch + by Lisa Roach. + + - bpo-30537(37): itertools.islice now accepts integer-like objects + (having an __index__ method) as start, stop, and slice arguments + + - bpo-25324(38): Tokens needed for parsing in Python moved to C. + ‘COMMENT’, ‘NL’ and ‘ENCODING’. This way the tokens and tok_names + in the token module don’t get changed when you import the tokenize + module. + + - bpo-29104(39): Fixed parsing backslashes in f-strings. + + - bpo-27945(40): Fixed various segfaults with dict when input + collections are mutated during searching, inserting or comparing. + Based on patches by Duane Griffin and Tim Mitchell. + + - bpo-25794(41): Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + + - bpo-30039(42): 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. + + - bpo-28974(43): ‘object.__format__(x, '')’ is now equivalent to + ‘str(x)’ rather than ‘format(str(self), '')’. + + - bpo-30024(44): Circular imports involving absolute imports with + binding a submodule to a name are now supported. + + - bpo-12414(45): sys.getsizeof() on a code object now returns the + sizes which includes the code struct and sizes of objects which it + references. Patch by Dong-hee Na. + + - bpo-29839(46): len() now raises ValueError rather than + OverflowError if __len__() returned a large negative integer. + + - bpo-11913(47): README.rst is now included in the list of distutils + standard READMEs and therefore included in source distributions. + + - bpo-29914(48): Fixed default implementations of __reduce__ and + __reduce_ex__(). object.__reduce__() no longer takes arguments, + object.__reduce_ex__() now requires one argument. + + - bpo-29949(49): Fix memory usage regression of set and frozenset + object. + + - bpo-29935(50): Fixed error messages in the index() method of tuple, + list and deque when pass indices of wrong type. + + - bpo-29816(51): 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. + + - bpo-24821(52): Fixed the slowing down to 25 times in the searching + of some unlucky Unicode characters. + + - bpo-29102(53): Add a unique ID to PyInterpreterState. This makes + it easier to identify each subinterpreter. + + - bpo-29894(54): 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. + + - bpo-29859(55): Show correct error messages when any of the + pthread_* calls in thread_pthread.h fails. + + - bpo-29849(56): Fix a memory leak when an ImportError is raised + during from import. + + - bpo-28856(57): Fix an oversight that %b format for bytes should + support objects follow the buffer protocol. + + - bpo-29723(58): The ‘sys.path[0]’ initialization change for + bpo-29139(59) caused a regression by revealing an inconsistency in + how sys.path is initialized when executing ‘__main__’ from a + zipfile, directory, or other import location. The interpreter now + consistently avoids ever adding the import location’s parent + directory to ‘sys.path’, and ensures no other ‘sys.path’ entries + are inadvertently modified when inserting the import location named + on the command line. + + - bpo-29568(60): Escaped percent “%%” in the format string for + classic string formatting no longer allows any characters between + two percents. + + - bpo-29714(61): Fix a regression that bytes format may fail when + containing zero bytes inside. + + - bpo-29695(62): bool(), float(), list() and tuple() no longer take + keyword arguments. The first argument of int() can now be passes + only as positional argument. + + - bpo-28893(63): Set correct __cause__ for errors about invalid + awaitables returned from __aiter__ and __anext__. + + - bpo-28876(64): ‘bool(range)’ works even if ‘len(range)’ raises + *note OverflowError: 4a4. + + - bpo-29683(65): Fixes to memory allocation in _PyCode_SetExtra. + Patch by Brian Coleman. + + - bpo-29684(66): 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. + + - bpo-28598(67): Support __rmod__ for subclasses of str being called + before str.__mod__. Patch by Martijn Pieters. + + - bpo-29607(68): Fix stack_effect computation for CALL_FUNCTION_EX. + Patch by Matthieu Dartiailh. + + - bpo-29602(69): Fix incorrect handling of signed zeros in complex + constructor for complex subclasses and for inputs having a + __complex__ method. Patch by Serhiy Storchaka. + + - bpo-29347(70): Fixed possibly dereferencing undefined pointers when + creating weakref objects. + + - bpo-29463(71): Add ‘docstring’ field to Module, ClassDef, + FunctionDef, and AsyncFunctionDef ast nodes. docstring is not + first stmt in their body anymore. It affects ‘co_firstlineno’ and + ‘co_lnotab’ of code object for module and class. (Reverted in + bpo-32911(72).) + + - bpo-29438(73): Fixed use-after-free problem in key sharing dict. + + - bpo-29546(74): Set the ‘path’ and ‘name’ attribute on ImportError + for ‘from ... import ...’. + + - bpo-29546(75): Improve from-import error message with location + + - bpo-29478(76): If max_line_length=None is specified while using the + Compat32 policy, it is no longer ignored. Patch by Mircea Cosbuc. + + - bpo-29319(77): Prevent RunMainFromImporter overwriting sys.path[0]. + + - bpo-29337(78): Fixed possible BytesWarning when compare the code + objects. Warnings could be emitted at compile time. + + - bpo-29327(79): Fixed a crash when pass the iterable keyword + argument to sorted(). + + - bpo-29034(80): Fix memory leak and use-after-free in os module + (path_converter). + + - bpo-29159(81): Fix regression in bytes(x) when x.__index__() raises + Exception. + + - bpo-29049(82): Call _PyObject_GC_TRACK() lazily when calling Python + function. Calling function is up to 5% faster. + + - bpo-28927(83): bytes.fromhex() and bytearray.fromhex() now ignore + all ASCII whitespace, not only spaces. Patch by Robert Xiao. + + - bpo-28932(84): Do not include if it does not exist. + + - bpo-25677(85): Correct the positioning of the syntax error caret + for indented blocks. Based on patch by Michael Layzell. + + - bpo-29000(86): Fixed bytes formatting of octals with zero padding + in alternate form. + + - bpo-18896(87): Python function can now have more than 255 + parameters. collections.namedtuple() now supports tuples with more + than 255 elements. + + - bpo-28596(88): The preferred encoding is UTF-8 on Android. Patch + written by Chi Hsuan Yen. + + - bpo-22257(89): Clean up interpreter startup (see PEP 432(90)). + + - bpo-26919(91): 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. + + - bpo-28991(92): functools.lru_cache() was susceptible to an obscure + reentrancy bug triggerable by a monkey-patched len() function. + + - bpo-28147(93): Fix a memory leak in split-table dictionaries: + setattr() must not convert combined table into split table. Patch + written by INADA Naoki. + + - bpo-28739(94): f-string expressions are no longer accepted as + docstrings and by ast.literal_eval() even if they do not include + expressions. + + - bpo-28512(95): Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + + - bpo-28918(96): Fix the cross compilation of xxlimited when Python + has been built with Py_DEBUG defined. + + - bpo-23722(97): Rather than silently producing a class that doesn’t + support zero-argument ‘super()’ in methods, failing to pass the new + ‘__classcell__’ namespace entry up to ‘type.__new__’ now results in + a ‘DeprecationWarning’ and a class that supports zero-argument + ‘super()’. + + - bpo-28797(98): 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. + + - bpo-28799(99): Remove the ‘PyEval_GetCallStats()’ function and + deprecate the untested and undocumented ‘sys.callstats()’ function. + Remove the ‘CALL_PROFILE’ special build: use the *note + sys.setprofile(): 1138. function, *note cProfile: 26. or *note + profile: d0. to profile function calls. + + - bpo-12844(100): More than 255 arguments can now be passed to a + function. + + - bpo-28782(101): Fix a bug in the implementation ‘yield from’ when + checking if the next instruction is YIELD_FROM. Regression + introduced by WORDCODE (bpo-26647(102)). + + - bpo-28774(103): 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). + + - bpo-28731(104): Optimize _PyDict_NewPresized() to create correct + size dict. Improve speed of dict literal with constant keys up to + 30%. + + - bpo-28532(105): Show sys.version when -V option is supplied twice. + + - bpo-27100(106): 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. + + - bpo-28746(107): Fix the set_inheritable() file descriptor method on + platforms that do not have the ioctl FIOCLEX and FIONCLEX commands. + + - bpo-26920(108): Fix not getting the locale’s charset upon + initializing the interpreter, on platforms that do not have + langinfo. + + - bpo-28648(109): Fixed crash in Py_DecodeLocale() in debug build on + Mac OS X when decode astral characters. Patch by Xiang Zhang. + + - bpo-28665(110): Improve speed of the STORE_DEREF opcode by 40%. + + - bpo-19398(111): Extra slash no longer added to sys.path components + in case of empty compile-time PYTHONPATH components. + + - bpo-28621(112): Sped up converting int to float by reusing faster + bits counting implementation. Patch by Adrian Wielgosik. + + - bpo-28580(113): Optimize iterating split table values. Patch by + Xiang Zhang. + + - bpo-28583(114): PyDict_SetDefault didn’t combine split table when + needed. Patch by Xiang Zhang. + + - bpo-28128(115): 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. + + - bpo-28509(116): dict.update() no longer allocate unnecessary large + memory. + + - bpo-28426(117): Fixed potential crash in + PyUnicode_AsDecodedObject() in debug build. + + - bpo-28517(118): Fixed of-by-one error in the peephole optimizer + that caused keeping unreachable code. + + - bpo-28214(119): Improved exception reporting for problematic + __set_name__ attributes. + + - bpo-23782(120): Fixed possible memory leak in _PyTraceback_Add() + and exception loss in PyTraceBack_Here(). + + - bpo-28183(121): Optimize and cleanup dict iteration. + + - bpo-26081(122): Added C implementation of asyncio.Future. Original + patch by Yury Selivanov. + + - bpo-28379(123): Added sanity checks and tests for + PyUnicode_CopyCharacters(). Patch by Xiang Zhang. + + - bpo-28376(124): The type of long range iterator is now registered + as Iterator. Patch by Oren Milman. + + - bpo-28376(125): 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. + + - bpo-26906(126): Resolving special methods of uninitialized type now + causes implicit initialization of the type instead of a fail. + + - bpo-18287(127): PyType_Ready() now checks that tp_name is not NULL. + Original patch by Niklas Koep. + + - bpo-24098(128): Fixed possible crash when AST is changed in process + of compiling it. + + - bpo-28201(129): Dict reduces possibility of 2nd conflict in hash + table when hashes have same lower bits. + + - bpo-28350(130): String constants with null character no longer + interned. + + - bpo-26617(131): Fix crash when GC runs during weakref callbacks. + + - bpo-27942(132): String constants now interned recursively in tuples + and frozensets. + + - bpo-28289(133): ImportError.__init__ now resets not specified + attributes. + + - bpo-21578(134): Fixed misleading error message when ImportError + called with invalid keyword args. + + - bpo-28203(135): Fix incorrect type in complex(1.0, {2:3}) error + message. Patch by Soumya Sharma. + + - bpo-28086(136): Single var-positional argument of tuple subtype was + passed unscathed to the C-defined function. Now it is converted to + exact tuple. + + - bpo-28214(137): Now __set_name__ is looked up on the class instead + of the instance. + + - bpo-27955(138): Fallback on reading /dev/urandom device when the + getrandom() syscall fails with EPERM, for example when blocked by + SECCOMP. + + - bpo-28192(139): Don’t import readline in isolated mode. + + - bpo-27441(140): Remove some redundant assignments to ob_size in + longobject.c. Thanks Oren Milman. + + - bpo-27222(141): Clean up redundant code in long_rshift function. + Thanks Oren Milman. + + - Upgrade internal unicode databases to Unicode version 9.0.0. + + - bpo-28131(142): Fix a regression in zipimport’s compile_source(). + zipimport should use the same optimization level as the + interpreter. + + - bpo-28126(143): Replace Py_MEMCPY with memcpy(). Visual Studio can + properly optimize memcpy(). + + - bpo-28120(144): Fix dict.pop() for splitted dictionary when trying + to remove a “pending key” (Not yet inserted in split-table). Patch + by Xiang Zhang. + + - bpo-26182(145): Raise DeprecationWarning when async and await + keywords are used as variable/attribute/class/function name. + + - bpo-26182(146): Fix a refleak in code that raises + DeprecationWarning. + + - bpo-28721(147): Fix asynchronous generators aclose() and athrow() + to handle StopAsyncIteration propagation properly. + + - bpo-26110(148): Speed-up method calls: add LOAD_METHOD and + CALL_METHOD opcodes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31490 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31471 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31418 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31416 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28411 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28411 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31411 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31344 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31373 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=30465 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=30860 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31347 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31343 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31291 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31271 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=31243 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=30721 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31070 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=30747 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31095 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31071 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30978 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=30808 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=30876 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=30703 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=30765 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=31161 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=30814 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30736 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=30604 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=30597 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=30682 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=30501 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=28180 + + (35) https://peps.python.org/pep-0538/ + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30486 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=30537 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=25324 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=29104 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=27945 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=25794 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=30039 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=28974 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=30024 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=12414 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=29839 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=11913 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=29914 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=29949 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=29935 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=29816 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=24821 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=29102 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=29894 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=29859 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=29849 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=28856 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=29723 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=29139 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=29568 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=29714 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=29695 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=28893 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=28876 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=29683 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=29684 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=28598 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=29607 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=29602 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=29347 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=29463 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=32911 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=29438 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=29546 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=29546 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=29478 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=29319 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=29337 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=29327 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=29034 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=29159 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=29049 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=28927 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=28932 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=25677 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=29000 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=18896 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=28596 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=22257 + + (90) https://peps.python.org/pep-0432/ + + (91) https://bugs.python.org/issue?@action=redirect&bpo=26919 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=28991 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=28147 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=28739 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=28512 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=28918 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=28797 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=28799 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=12844 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=28782 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=26647 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=28774 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=28731 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=28532 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=27100 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=28746 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=26920 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=28648 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=28665 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=19398 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=28621 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=28580 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=28583 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=28128 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=28509 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=28426 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=28517 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=28214 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=23782 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=28183 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=26081 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=28379 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=28376 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=28376 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=26906 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=18287 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=24098 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=28201 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=28350 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=26617 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=27942 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=28289 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=21578 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=28203 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=28086 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=28214 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=27955 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=28192 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=27441 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=27222 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=28131 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=28126 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=28120 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=26182 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=26182 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=28721 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=26110 + + +File: python.info, Node: Library<45>, Next: Documentation<44>, Prev: Core and Builtins<45>, Up: Python 3 7 0 alpha 1 + +1.21.46.3 Library +................. + + - bpo-31499(1): xml.etree: Fix a crash when a parser is part of a + reference cycle. + + - bpo-31482(2): ‘random.seed()’ now works with bytes in version=1 + + - bpo-28556(3): typing.get_type_hints now finds the right globalns + for classes and modules by default (when no ‘globalns’ was + specified by the caller). + + - bpo-28556(4): Speed improvements to the ‘typing’ module. Original + PRs by Ivan Levkivskyi and Mitar. + + - bpo-31544(5): The C accelerator module of ElementTree ignored + exceptions raised when looking up TreeBuilder target methods in + XMLParser(). + + - bpo-31234(6): socket.create_connection() now fixes manually a + reference cycle: clear the variable storing the last exception on + success. + + - bpo-31457(7): LoggerAdapter objects can now be nested. + + - bpo-31431(8): SSLContext.check_hostname now automatically sets + SSLContext.verify_mode to ssl.CERT_REQUIRED instead of failing with + a ValueError. + + - bpo-31233(9): socketserver.ThreadingMixIn now keeps a list of + non-daemonic threads to wait until all these threads complete in + server_close(). + + - bpo-28638(10): 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.) + + - bpo-31400(11): Improves SSL error handling to avoid losing error + numbers. + + - bpo-27629(12): Make return types of SSLContext.wrap_bio() and + SSLContext.wrap_socket() customizable. + + - bpo-28958(13): ssl.SSLContext() now uses OpenSSL error information + when a context cannot be instantiated. + + - bpo-28182(14): The SSL module now raises SSLCertVerificationError + when OpenSSL fails to verify the peer’s certificate. The exception + contains more information about the error. + + - bpo-27340(15): 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. + + - bpo-14191(16): A new function + ‘argparse.ArgumentParser.parse_intermixed_args’ provides the + ability to parse command lines where there user intermixes options + and positional arguments. + + - bpo-31178(17): Fix string concatenation bug in rare error path in + the subprocess module + + - bpo-31350(18): Micro-optimize ‘asyncio._get_running_loop()’ to + become up to 10% faster. + + - bpo-31170(19): expat: Update libexpat from 2.2.3 to 2.2.4. Fix + copying of partial characters for UTF-8 input (libexpat bug 115): + ‘https://github.com/libexpat/libexpat/issues/115’ + + - bpo-29136(20): Add TLS 1.3 cipher suites and OP_NO_TLSv1_3. + + - bpo-1198569(21): ‘string.Template’ subclasses can optionally define + ‘braceidpattern’ if they want to specify different placeholder + patterns inside and outside the braces. If None (the default) it + falls back to ‘idpattern’. + + - bpo-31326(22): 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. + + - bpo-27144(23): The ‘map()’ and ‘as_completed()’ iterators in + ‘concurrent.futures’ now avoid keeping a reference to yielded + objects. + + - bpo-31281(24): Fix ‘fileinput.FileInput(files, inplace=True)’ when + ‘files’ contain ‘pathlib.Path’ objects. + + - bpo-10746(25): Fix ctypes producing wrong PEP 3118(26) type codes + for integer types. + + - bpo-27584(27): ‘AF_VSOCK’ has been added to the socket interface + which allows communication between virtual machines and their host. + + - bpo-22536(28): The subprocess module now sets the filename when + FileNotFoundError is raised on POSIX systems due to the executable + or cwd not being found. + + - bpo-29741(29): Update some methods in the _pyio module to also + accept integer types. Patch by Oren Milman. + + - bpo-31249(30): concurrent.futures: WorkItem.run() used by + ThreadPoolExecutor now breaks a reference cycle between an + exception object and the WorkItem object. + + - bpo-31247(31): xmlrpc.server now explicitly breaks reference cycles + when using sys.exc_info() in code handling exceptions. + + - bpo-23835(32): configparser: reading defaults in the + ‘ConfigParser()’ constructor is now using ‘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. + + - bpo-31238(33): 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. + + - bpo-5001(34): Many asserts in *note multiprocessing: b5. are now + more informative, and some error types have been changed to more + specific ones. + + - bpo-31109(35): Convert zipimport to use Argument Clinic. + + - bpo-30102(36): 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. + + - bpo-18966(37): Non-daemonic threads created by a + multiprocessing.Process are now joined on child exit. + + - bpo-31183(38): *note dis: 36. now works with asynchronous generator + and coroutine objects. Patch by George Collins based on diagnosis + by Luciano Ramalho. + + - bpo-5001(39): There are a number of uninformative asserts in the + *note multiprocessing: b5. 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 + ‘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). + + - bpo-31185(40): Fixed miscellaneous errors in asyncio speedup + module. + + - bpo-31151(41): socketserver.ForkingMixIn.server_close() now waits + until all child processes completed to prevent leaking zombie + processes. + + - bpo-31072(42): Add an ‘include_file’ parameter to + ‘zipapp.create_archive()’ + + - bpo-24700(43): Optimize array.array comparison. It is now from 10x + up to 70x faster when comparing arrays holding values of the same + integer type. + + - bpo-31135(44): 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. + + - bpo-31107(45): Fix ‘copyreg._slotnames()’ mangled attribute + calculation for classes whose name begins with an underscore. + Patch by Shane Harvey. + + - bpo-31080(46): Allow *note logging.config.fileConfig: 7ab. to + accept kwargs and/or args. + + - bpo-30897(47): ‘pathlib.Path’ objects now include an ‘is_mount()’ + method (only implemented on POSIX). This is similar to + ‘os.path.ismount(p)’. Patch by Cooper Ry Lees. + + - bpo-31061(48): Fixed a crash when using asyncio and threads. + + - bpo-30987(49): Added support for CAN ISO-TP protocol in the socket + module. + + - bpo-30522(50): Added a ‘setStream’ method to + ‘logging.StreamHandler’ to allow the stream to be set after + creation. + + - bpo-30502(51): Fix handling of long oids in ssl. Based on patch by + Christian Heimes. + + - bpo-5288(52): Support tzinfo objects with sub-minute offsets. + + - bpo-30919(53): 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. + + - bpo-26732(54): 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. + + - bpo-29403(55): Fix ‘unittest.mock’’s autospec to not fail on + method-bound builtin functions. Patch by Aaron Gallagher. + + - bpo-30961(56): Fix decrementing a borrowed reference in + tracemalloc. + + - bpo-19896(57): Fix multiprocessing.sharedctypes to recognize + typecodes ‘'q'’ and ‘'Q'’. + + - bpo-30946(58): Remove obsolete code in readline module for + platforms where GNU readline is older than 2.1 or where select() is + not available. + + - bpo-25684(59): Change ‘ttk.OptionMenu’ radiobuttons to be unique + across instances of ‘OptionMenu’. + + - bpo-30886(60): 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. + + - bpo-29854(61): Fix segfault in readline when using readline’s + history-size option. Patch by Nir Soffer. + + - bpo-30794(62): Added multiprocessing.Process.kill method to + terminate using the SIGKILL signal on Unix. + + - bpo-30319(63): socket.close() now ignores ECONNRESET error. + + - bpo-30828(64): Fix out of bounds write in + ‘asyncio.CFuture.remove_done_callback()’. + + - bpo-30302(65): Use keywords in the ‘repr’ of ‘datetime.timedelta’. + + - bpo-30807(66): 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. + + - bpo-30441(67): Fix bug when modifying os.environ while iterating + over it + + - bpo-29585(68): Avoid importing ‘sysconfig’ from ‘site’ to improve + startup speed. Python startup is about 5% faster on Linux and 30% + faster on macOS. + + - bpo-29293(69): 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. + + - bpo-30532(70): Fix email header value parser dropping folding white + space in certain cases. + + - bpo-30596(71): Add a ‘close()’ method to ‘multiprocessing.Process’. + + - bpo-9146(72): 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. + + - bpo-29169(73): Update zlib to 1.2.11. + + - bpo-30119(74): ftplib.FTP.putline() now throws ValueError on + commands that contains CR or LF. Patch by Dong-hee Na. + + - bpo-30879(75): os.listdir() and os.scandir() now emit bytes names + when called with bytes-like argument. + + - bpo-30746(76): Prohibited the ‘=’ character in environment variable + names in ‘os.putenv()’ and ‘os.spawn*()’. + + - bpo-30664(77): The description of a unittest subtest now preserves + the order of keyword arguments of TestCase.subTest(). + + - bpo-21071(78): struct.Struct.format type is now *note str: 1b3. + instead of *note bytes: 1b4. + + - bpo-29212(79): 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”. + + - bpo-29755(80): Fixed the lgettext() family of functions in the + gettext module. They now always return bytes. + + - bpo-30616(81): Functional API of enum allows to create empty enums. + Patched by Dong-hee Na + + - bpo-30038(82): Fix race condition between signal delivery and + wakeup file descriptor. Patch by Nathaniel Smith. + + - bpo-23894(83): lib2to3 now recognizes ‘rb'...'’ and ‘f'...'’ + strings. + + - bpo-24744(84): pkgutil.walk_packages function now raises ValueError + if `path' is a string. Patch by Sanyam Khurana. + + - bpo-24484(85): Avoid race condition in multiprocessing cleanup. + + - bpo-30589(86): 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. + + - bpo-28994(87): The traceback no longer displayed for SystemExit + raised in a callback registered by atexit. + + - bpo-30508(88): Don’t log exceptions if Task/Future “cancel()” + method was called. + + - bpo-30645(89): Fix path calculation in ‘imp.load_package()’, fixing + it for cases when a package is only shipped with bytecodes. Patch + by Alexandru Ardelean. + + - bpo-11822(90): The dis.dis() function now is able to disassemble + nested code objects. + + - bpo-30624(91): selectors does not take KeyboardInterrupt and + SystemExit into account, leaving a fd in a bad state in case of + error. Patch by Giampaolo Rodola’. + + - bpo-30595(92): 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. + + - bpo-28556(93): Updates to typing module: Add generic + AsyncContextManager, add support for ContextManager on all + versions. Original PRs by Jelle Zijlstra and Ivan Levkivskyi + + - bpo-30605(94): re.compile() no longer raises a BytesWarning when + compiling a bytes instance with misplaced inline modifier. Patch + by Roy Williams. + + - bpo-29870(95): Fix ssl sockets leaks when connection is aborted in + asyncio/ssl implementation. Patch by Michaël Sghaïer. + + - bpo-29743(96): Closing transport during handshake process leaks + open socket. Patch by Nikolay Kim + + - bpo-27585(97): Fix waiter cancellation in asyncio.Lock. Patch by + Mathieu Sornay. + + - bpo-30014(98): modify() method of poll(), epoll() and devpoll() + based classes of selectors module is around 10% faster. Patch by + Giampaolo Rodola’. + + - bpo-30418(99): On Windows, subprocess.Popen.communicate() now also + ignore EINVAL on stdin.write() if the child process is still + running but closed the pipe. + + - bpo-30463(100): Addded empty __slots__ to abc.ABC. This allows + subclassers to deny __dict__ and __weakref__ creation. Patch by + Aaron Hall. + + - bpo-30520(101): Loggers are now pickleable. + + - bpo-30557(102): faulthandler now correctly filters and displays + exception codes on Windows + + - bpo-30526(103): Add TextIOWrapper.reconfigure() and a + TextIOWrapper.write_through attribute. + + - bpo-30245(104): Fix possible overflow when organize + struct.pack_into error message. Patch by Yuan Liu. + + - bpo-30378(105): Fix the problem that logging.handlers.SysLogHandler + cannot handle IPv6 addresses. + + - bpo-16500(106): Allow registering at-fork handlers. + + - bpo-30470(107): Deprecate invalid ctypes call protection on + Windows. Patch by Mariatta Wijaya. + + - bpo-30414(108): multiprocessing.Queue._feed background running + thread do not break from main loop on exception. + + - bpo-30003(109): Fix handling escape characters in HZ codec. Based + on patch by Ma Lin. + + - bpo-30149(110): inspect.signature() now supports callables with + variable-argument parameters wrapped with partialmethod. Patch by + Dong-hee Na. + + - bpo-30436(111): importlib.find_spec() raises ModuleNotFoundError + instead of AttributeError if the specified parent module is not a + package (i.e. lacks a __path__ attribute). + + - bpo-30301(112): Fix AttributeError when using SimpleQueue.empty() + under `spawn' and `forkserver' start methods. + + - bpo-30375(113): 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. + + - bpo-30329(114): 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. + + - bpo-29196(115): 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. + + - bpo-9850(116): The ‘macpath’ is now deprecated and will be removed + in Python 3.8. + + - bpo-30299(117): Compiling regular expression in debug mode on + CPython now displays the compiled bytecode in human readable form. + + - bpo-30048(118): Fixed ‘Task.cancel()’ can be ignored when the task + is running coroutine and the coroutine returned without any more + ‘await’. + + - bpo-30266(119): contextlib.AbstractContextManager now supports + anti-registration by setting __enter__ = None or __exit__ = None, + following the pattern introduced in bpo-25958(120). Patch by Jelle + Zijlstra. + + - bpo-30340(121): Enhanced regular expressions optimization. This + increased the performance of matching some patterns up to 25 times. + + - bpo-30298(122): Weaken the condition of deprecation warnings for + inline modifiers. Now allowed several subsequential inline + modifiers at the start of the pattern (e.g. ‘'(?i)(?s)...'’). In + verbose mode whitespaces and comments now are allowed before and + between inline modifiers (e.g. ‘'(?x) (?i) (?s)...'’). + + - bpo-30285(123): Optimized case-insensitive matching and searching + of regular expressions. + + - bpo-29990(124): Fix range checking in GB18030 decoder. Original + patch by Ma Lin. + + - bpo-29979(125): 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. + + - bpo-30243(126): 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. + + - bpo-30215(127): 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. + + - bpo-30185(128): Avoid KeyboardInterrupt tracebacks in forkserver + helper process when Ctrl-C is received. + + - bpo-30103(129): binascii.b2a_uu() and uu.encode() now support using + ‘'`'’ as zero instead of space. + + - bpo-28556(130): Various updates to typing module: add + typing.NoReturn type, use WrapperDescriptorType, minor bug-fixes. + Original PRs by Jim Fasarakis-Hilliard and Ivan Levkivskyi. + + - bpo-30205(131): Fix getsockname() for unbound AF_UNIX sockets on + Linux. + + - bpo-30228(132): 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). + + - bpo-30190(133): 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’) + + - bpo-30101(134): Add support for curses.A_ITALIC. + + - bpo-29822(135): inspect.isabstract() now works during + __init_subclass__. Patch by Nate Soares. + + - bpo-29960(136): Preserve generator state when + _random.Random.setstate() raises an exception. Patch by Bryan + Olson. + + - bpo-30070(137): Fixed leaks and crashes in errors handling in the + parser module. + + - bpo-22352(138): Column widths in the output of dis.dis() are now + adjusted for large line numbers and instruction offsets. + + - bpo-30061(139): 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(). + + - bpo-30218(140): Fix PathLike support for shutil.unpack_archive. + Patch by Jelle Zijlstra. + + - bpo-10076(141): Compiled regular expression and match objects in + the re module now support copy.copy() and copy.deepcopy() (they are + considered atomic). + + - bpo-30068(142): _io._IOBase.readlines will check if it’s closed + first when hint is present. + + - bpo-29694(143): Fixed race condition in pathlib mkdir with flags + parents=True. Patch by Armin Rigo. + + - bpo-29692(144): Fixed arbitrary unchaining of RuntimeError + exceptions in contextlib.contextmanager. Patch by Siddharth + Velankar. + + - bpo-26187(145): 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(146). Patch by + Aviv Palivoda. + + - bpo-30017(147): Allowed calling the close() method of the zip entry + writer object multiple times. Writing to a closed writer now + always produces a ValueError. + + - bpo-29998(148): Pickling and copying ImportError now preserves name + and path attributes. + + - bpo-29995(149): re.escape() now escapes only regex special + characters. + + - bpo-29962(150): Add math.remainder operation, implementing + remainder as specified in IEEE 754. + + - bpo-29649(151): Improve struct.pack_into() exception messages for + problems with the buffer size and offset. Patch by Andrew Nester. + + - bpo-29654(152): Support If-Modified-Since HTTP header (browser + cache). Patch by Pierre Quentel. + + - bpo-29931(153): Fixed comparison check for ipaddress.ip_interface + objects. Patch by Sanjay Sundaresan. + + - bpo-29953(154): Fixed memory leaks in the replace() method of + datetime and time objects when pass out of bound fold argument. + + - bpo-29942(155): Fix a crash in itertools.chain.from_iterable when + encountering long runs of empty iterables. + + - bpo-10030(156): Sped up reading encrypted ZIP files by 2 times. + + - bpo-29204(157): 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. + + - bpo-27863(158): Fixed multiple crashes in ElementTree caused by + race conditions and wrong types. + + - bpo-25996(159): Added support of file descriptors in os.scandir() + on Unix. os.fwalk() is sped up by 2 times by using os.scandir(). + + - bpo-28699(160): 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. + + - bpo-23890(161): unittest.TestCase.assertRaises() now manually + breaks a reference cycle to not keep objects alive longer than + expected. + + - bpo-29901(162): The zipapp module now supports general path-like + objects, not just pathlib.Path. + + - bpo-25803(163): Avoid incorrect errors raised by + Path.mkdir(exist_ok=True) when the OS gives priority to errors such + as EACCES over EEXIST. + + - bpo-29861(164): Release references to tasks, their arguments and + their results as soon as they are finished in multiprocessing.Pool. + + - bpo-19930(165): The mode argument of os.makedirs() no longer + affects the file permission bits of newly created + intermediate-level directories. + + - bpo-29884(166): faulthandler: Restore the old sigaltstack during + teardown. Patch by Christophe Zeitouny. + + - bpo-25455(167): Fixed crashes in repr of recursive buffered + file-like objects. + + - bpo-29800(168): Fix crashes in partial.__repr__ if the keys of + partial.keywords are not strings. Patch by Michael Seifert. + + - bpo-8256(169): Fixed possible failing or crashing input() if + attributes “encoding” or “errors” of sys.stdin or sys.stdout are + not set or are not strings. + + - bpo-28692(170): Using non-integer value for selecting a plural form + in gettext is now deprecated. + + - bpo-26121(171): Use C library implementation for math functions + erf() and erfc(). + + - bpo-29619(172): os.stat() and os.DirEntry.inode() now convert inode + (st_ino) using unsigned integers. + + - bpo-28298(173): Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ + from accepting big intables (objects that have __int__) as + elements. + + - bpo-29645(174): Speed up importing the webbrowser module. + webbrowser.register() is now thread-safe. + + - bpo-28231(175): The zipfile module now accepts path-like objects + for external paths. + + - bpo-26915(176): index() and count() methods of + collections.abc.Sequence now check identity before checking + equality when do comparisons. + + - bpo-28682(177): Added support for bytes paths in os.fwalk(). + + - bpo-29728(178): Add new ‘socket.TCP_NOTSENT_LOWAT’ (Linux 3.12) + constant. Patch by Nathaniel J. Smith. + + - bpo-29623(179): Allow use of path-like object as a single argument + in ConfigParser.read(). Patch by David Ellis. + + - bpo-9303(180): Migrate sqlite3 module to _v2 API. Patch by Aviv + Palivoda. + + - bpo-28963(181): Fix out of bound iteration in + asyncio.Future.remove_done_callback implemented in C. + + - bpo-29704(182): asyncio.subprocess.SubprocessStreamProtocol no + longer closes before all pipes are closed. + + - bpo-29271(183): Fix Task.current_task and Task.all_tasks + implemented in C to accept None argument as their pure Python + implementation. + + - bpo-29703(184): Fix asyncio to support instantiation of new event + loops in child processes. + + - bpo-29615(185): SimpleXMLRPCDispatcher no longer chains KeyError + (or any other exception) to exception(s) raised in the dispatched + methods. Patch by Petr Motejlek. + + - bpo-7769(186): Method register_function() of + xmlrpc.server.SimpleXMLRPCDispatcher and its subclasses can now be + used as a decorator. + + - bpo-29376(187): Fix assertion error in + threading._DummyThread.is_alive(). + + - bpo-28624(188): Add a test that checks that cwd parameter of + Popen() accepts PathLike objects. Patch by Sayan Chowdhury. + + - bpo-28518(189): Start a transaction implicitly before a DML + statement. Patch by Aviv Palivoda. + + - bpo-29742(190): get_extra_info() raises exception if get called on + closed ssl transport. Patch by Nikolay Kim. + + - bpo-16285(191): 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. + + - bpo-29532(192): Altering a kwarg dictionary passed to + functools.partial() no longer affects a partial object after + creation. + + - bpo-29110(193): 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. + + - bpo-22807(194): 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. + + - bpo-29576(195): Improve some deprecations in importlib. Some + deprecated methods now emit DeprecationWarnings and have better + descriptive messages. + + - bpo-29534(196): Fixed different behaviour of Decimal.from_float() + for _decimal and _pydecimal. Thanks Andrew Nester. + + - bpo-10379(197): locale.format_string now supports the ‘monetary’ + keyword argument, and locale.format is deprecated. + + - bpo-29851(198): importlib.reload() now raises ModuleNotFoundError + if the module lacks a spec. + + - bpo-28556(199): 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. + + - bpo-29100(200): Fix datetime.fromtimestamp() regression introduced + in Python 3.6.0: check minimum and maximum years. + + - bpo-29416(201): Prevent infinite loop in pathlib.Path.mkdir + + - bpo-29444(202): Fixed out-of-bounds buffer access in the group() + method of the match object. Based on patch by WGH. + + - bpo-29377(203): Add WrapperDescriptorType, MethodWrapperType, and + MethodDescriptorType built-in types to types module. Original + patch by Manuel Krebber. + + - bpo-29218(204): Unused install_misc command is now removed. It has + been documented as unused since 2000. Patch by Eric N. Vander + Weele. + + - bpo-29368(205): 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. + + - bpo-29338(206): The help of a builtin or extension class now + includes the constructor signature if __text_signature__ is + provided for the class. + + - bpo-29335(207): Fix subprocess.Popen.wait() when the child process + has exited to a stopped instead of terminated state (ex: when under + ptrace). + + - bpo-29290(208): Fix a regression in argparse that help messages + would wrap at non-breaking spaces. + + - bpo-28735(209): Fixed the comparison of mock.MagickMock with + mock.ANY. + + - bpo-29197(210): Removed deprecated function ntpath.splitunc(). + + - bpo-29210(211): Removed support of deprecated argument “exclude” in + tarfile.TarFile.add(). + + - bpo-29219(212): Fixed infinite recursion in the repr of + uninitialized ctypes.CDLL instances. + + - bpo-29192(213): Removed deprecated features in the http.cookies + module. + + - bpo-29193(214): A format string argument for + string.Formatter.format() is now positional-only. + + - bpo-29195(215): Removed support of deprecated undocumented keyword + arguments in methods of regular expression objects. + + - bpo-28969(216): 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. + + - bpo-20804(217): The unittest.mock.sentinel attributes now preserve + their identity when they are copied or pickled. + + - bpo-29142(218): 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. + + - bpo-28961(219): Fix unittest.mock._Call helper: don’t ignore the + name parameter anymore. Patch written by Jiajun Huang. + + - bpo-15812(220): inspect.getframeinfo() now correctly shows the + first line of a context. Patch by Sam Breese. + + - bpo-28985(221): Update authorizer constants in sqlite3 module. + Patch by Dingyuan Wang. + + - bpo-29079(222): Prevent infinite loop in pathlib.resolve() on + Windows + + - bpo-13051(223): Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + + - bpo-9770(224): curses.ascii predicates now work correctly with + negative integers. + + - bpo-28427(225): old keys should not remove new values from + WeakValueDictionary when collecting from another thread. + + - bpo-28923(226): Remove editor artifacts from Tix.py. + + - bpo-28871(227): Fixed a crash when deallocate deep ElementTree. + + - bpo-19542(228): Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another + thread. + + - bpo-20191(229): Fixed a crash in resource.prlimit() when passing a + sequence that doesn’t own its elements as limits. + + - bpo-16255(230): subprocess.Popen uses /system/bin/sh on Android as + the shell, instead of /bin/sh. + + - bpo-28779(231): multiprocessing.set_forkserver_preload() would + crash the forkserver process if a preloaded module instantiated + some multiprocessing objects such as locks. + + - bpo-26937(232): 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. + + - bpo-28847(233): 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). + + - bpo-27030(234): Unknown escapes consisting of ‘'\'’ and an ASCII + letter in re.sub() replacement templates regular expressions now + are errors. + + - bpo-28835(235): Fix a regression introduced in + warnings.catch_warnings(): call warnings.showwarning() if it was + overridden inside the context manager. + + - bpo-27172(236): To assist with upgrades from 2.7, the previously + documented deprecation of ‘inspect.getfullargspec()’ has been + reversed. This decision may be revisited again after the Python + 2.7 branch is no longer officially supported. + + - bpo-28740(237): Add sys.getandroidapilevel(): return the build time + API version of Android as an integer. Function only available on + Android. + + - bpo-26273(238): Add new ‘socket.TCP_CONGESTION’ (Linux 2.6.13) and + ‘socket.TCP_USER_TIMEOUT’ (Linux 2.6.37) constants. Patch written + by Omar Sandoval. + + - bpo-28752(239): Restored the __reduce__() methods of datetime + objects. + + - bpo-28727(240): 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(241): don’t + duplicate warning filters when the warnings module is reloaded + (thing usually only done in unit tests). + + - bpo-20572(242): Remove the subprocess.Popen.wait endtime parameter. + It was deprecated in 3.4 and undocumented prior to that. + + - bpo-25659(243): In ctypes, prevent a crash calling the + from_buffer() and from_buffer_copy() methods on abstract classes + like Array. + + - bpo-28548(244): In the “http.server” module, parse the protocol + version if possible, to avoid using HTTP 0.9 in some error + responses. + + - bpo-19717(245): Makes Path.resolve() succeed on paths that do not + exist. Patch by Vajrasky Kok + + - bpo-28563(246): 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. + + - bpo-28387(247): Fixed possible crash in _io.TextIOWrapper + deallocator when the garbage collector is invoked in other thread. + Based on patch by Sebastian Cufre. + + - bpo-27517(248): LZMA compressor and decompressor no longer raise + exceptions if given empty data twice. Patch by Benjamin Fogle. + + - bpo-28549(249): Fixed segfault in curses’s addch() with ncurses6. + + - bpo-28449(250): 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. + + - bpo-23262(251): The webbrowser module now supports Firefox 36+ and + derived browsers. Based on patch by Oleg Broytman. + + - bpo-24241(252): 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 + + - bpo-27939(253): 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. + + - bpo-28255(254): 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. + + - bpo-28255(255): calendar.TextCalendar.prmonth() no longer prints a + space at the start of new line after printing a month’s calendar. + Patch by Xiang Zhang. + + - bpo-20491(256): The textwrap.TextWrapper class now honors + non-breaking spaces. Based on patch by Kaarle Ritvanen. + + - bpo-28353(257): os.fwalk() no longer fails on broken links. + + - bpo-28430(258): Fix iterator of C implemented asyncio.Future + doesn’t accept non-None value is passed to it.send(val). + + - bpo-27025(259): Generated names for Tkinter widgets now start by + the “!” prefix for readability. + + - bpo-25464(260): Fixed HList.header_exists() in tkinter.tix module + by addin a workaround to Tix library bug. + + - bpo-28488(261): shutil.make_archive() no longer adds entry “./” to + ZIP archive. + + - bpo-25953(262): 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. + + - bpo-28469(263): timeit now uses the sequence 1, 2, 5, 10, 20, 50,… + instead of 1, 10, 100,… for autoranging. + + - bpo-28115(264): Command-line interface of the zipfile module now + uses argparse. Added support of long options. + + - bpo-18219(265): Optimize csv.DictWriter for large number of + columns. Patch by Mariatta Wijaya. + + - bpo-28448(266): Fix C implemented asyncio.Future didn’t work on + Windows. + + - bpo-23214(267): In the “io” module, the argument to BufferedReader + and BytesIO’s read1() methods is now optional and can be -1, + matching the BufferedIOBase specification. + + - bpo-28480(268): Fix error building socket module when + multithreading is disabled. + + - bpo-28240(269): timeit: remove ‘-c/--clock’ and ‘-t/--time’ command + line options which were deprecated since Python 3.3. + + - bpo-28240(270): timeit now repeats the benchmarks 5 times instead + of only 3 to make benchmarks more reliable. + + - bpo-28240(271): 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. + + - 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(272) for rationale. + + - bpo-24452(273): Make webbrowser support Chrome on Mac OS X. Patch + by Ned Batchelder. + + - bpo-20766(274): Fix references leaked by pdb in the handling of + SIGINT handlers. + + - bpo-27998(275): Fixed bytes path support in os.scandir() on + Windows. Patch by Eryk Sun. + + - bpo-28317(276): The disassembler now decodes FORMAT_VALUE argument. + + - bpo-28380(277): unittest.mock Mock autospec functions now properly + support assert_called, assert_not_called, and assert_called_once. + + - bpo-28229(278): lzma module now supports pathlib. + + - bpo-28321(279): Fixed writing non-BMP characters with binary format + in plistlib. + + - bpo-28225(280): bz2 module now supports pathlib. Initial patch by + Ethan Furman. + + - bpo-28227(281): gzip now supports pathlib. Patch by Ethan Furman. + + - bpo-28332(282): Deprecated silent truncations in socket.htons and + socket.ntohs. Original patch by Oren Milman. + + - bpo-27358(283): Optimized merging var-keyword arguments and + improved error message when passing a non-mapping as a var-keyword + argument. + + - bpo-28257(284): Improved error message when passing a non-iterable + as a var-positional argument. Added opcode + BUILD_TUPLE_UNPACK_WITH_CALL. + + - bpo-28322(285): Fixed possible crashes when unpickle itertools + objects from incorrect pickle data. Based on patch by John Leitch. + + - bpo-28228(286): imghdr now supports pathlib. + + - bpo-28226(287): compileall now supports pathlib. + + - bpo-28314(288): Fix function declaration (C flags) for the + getiterator() method of xml.etree.ElementTree.Element. + + - bpo-28148(289): 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. + + - bpo-28253(290): 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. + + - bpo-28275(291): Fixed possible use after free in the decompress() + methods of the LZMADecompressor and BZ2Decompressor classes. + Original patch by John Leitch. + + - bpo-27897(292): Fixed possible crash in + sqlite3.Connection.create_collation() if pass invalid string-like + object as a name. Patch by Xiang Zhang. + + - bpo-18844(293): 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. + + - bpo-18893(294): Fix invalid exception handling in + Lib/ctypes/macholib/dyld.py. Patch by Madison May. + + - bpo-27611(295): Fixed support of default root window in the + tkinter.tix module. Added the master parameter in the DisplayStyle + constructor. + + - bpo-27348(296): In the traceback module, restore the formatting of + exception messages like “Exception: None”. This fixes a regression + introduced in 3.5a2. + + - bpo-25651(297): Allow falsy values to be used for msg parameter of + subTest(). + + - bpo-27778(298): Fix a memory leak in os.getrandom() when the + getrandom() is interrupted by a signal and a signal handler raises + a Python exception. + + - bpo-28200(299): Fix memory leak on Windows in the os module (fix + path_converter() function). + + - bpo-25400(300): RobotFileParser now correctly returns default + values for crawl_delay and request_rate. Initial patch by Peter + Wirtz. + + - bpo-27932(301): Prevent memory leak in win32_ver(). + + - Fix UnboundLocalError in socket._sendfile_use_sendfile. + + - bpo-28075(302): Check for ERROR_ACCESS_DENIED in Windows + implementation of os.stat(). Patch by Eryk Sun. + + - bpo-22493(303): Warning message emitted by using inline flags in + the middle of regular expression now contains a (truncated) regex + pattern. Patch by Tim Graham. + + - bpo-25270(304): Prevent codecs.escape_encode() from raising + SystemError when an empty bytestring is passed. + + - bpo-28181(305): Get antigravity over HTTPS. Patch by Kaartic + Sivaraam. + + - bpo-25895(306): Enable WebSocket URL schemes in + urllib.parse.urljoin. Patch by Gergely Imreh and Markus + Holtermann. + + - bpo-28114(307): Fix a crash in parse_envlist() when env contains + byte strings. Patch by Eryk Sun. + + - bpo-27599(308): Fixed buffer overrun in binascii.b2a_qp() and + binascii.a2b_qp(). + + - bpo-27906(309): Fix socket accept exhaustion during high TCP + traffic. Patch by Kevin Conway. + + - bpo-28174(310): Handle when SO_REUSEPORT isn’t properly supported. + Patch by Seth Michael Larson. + + - bpo-26654(311): Inspect functools.partial in + asyncio.Handle.__repr__. Patch by iceboy. + + - bpo-26909(312): Fix slow pipes IO in asyncio. Patch by INADA + Naoki. + + - bpo-28176(313): Fix callbacks race in + asyncio.SelectorLoop.sock_connect. + + - bpo-27759(314): Fix selectors incorrectly retain invalid file + descriptors. Patch by Mark Williams. + + - bpo-28325(315): Remove vestigial MacOS 9 macurl2path module and its + tests. + + - bpo-28368(316): Refuse monitoring processes if the child watcher + has no loop attached. Patch by Vincent Michel. + + - bpo-28369(317): Raise RuntimeError when transport’s FD is used with + add_reader, add_writer, etc. + + - bpo-28370(318): Speedup asyncio.StreamReader.readexactly. Patch by + Коренберг Марк. + + - bpo-28371(319): Deprecate passing asyncio.Handles to + run_in_executor. + + - bpo-28372(320): Fix asyncio to support formatting of non-python + coroutines. + + - bpo-28399(321): Remove UNIX socket from FS before binding. Patch + by Коренберг Марк. + + - bpo-27972(322): Prohibit Tasks to await on themselves. + + - bpo-24142(323): Reading a corrupt config file left configparser in + an invalid state. Original patch by Florian Höch. + + - bpo-29581(324): ABCMeta.__new__ now accepts ‘**kwargs’, allowing + abstract base classes to use keyword parameters in + __init_subclass__. Patch by Nate Soares. + + - bpo-25532(325): 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. + + - bpo-30177(326): path.resolve(strict=False) no longer cuts the path + after the first element not present in the filesystem. Patch by + Antoine Pietri. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31499 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31482 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31544 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31234 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31457 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31431 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31233 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28638 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31400 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=27629 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28958 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28182 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=27340 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=14191 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=31178 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31350 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31170 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=29136 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=1198569 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=31326 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=27144 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=31281 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=10746 + + (26) https://peps.python.org/pep-3118/ + + (27) https://bugs.python.org/issue?@action=redirect&bpo=27584 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=22536 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=29741 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=31249 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=31247 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=23835 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=31238 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=5001 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=31109 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30102 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=18966 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=31183 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=5001 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=31185 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=31151 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=31072 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=24700 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=31135 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=31107 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=31080 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=30897 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=31061 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=30987 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=30522 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=30502 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=5288 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=30919 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=26732 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=29403 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=30961 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=19896 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=30946 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=25684 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=30886 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=29854 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=30794 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=30319 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=30828 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=30302 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=30807 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=30441 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=29585 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=29293 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=30532 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=30596 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=9146 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=29169 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=30119 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=30879 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=30746 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=30664 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=21071 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=29212 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=29755 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=30616 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=30038 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=23894 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=24744 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=24484 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=30589 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=28994 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=30508 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=30645 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=11822 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=30624 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=30595 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=30605 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=29870 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=29743 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=27585 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=30014 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=30418 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=30463 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=30520 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=30557 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=30526 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=30245 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=30378 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=16500 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=30470 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=30414 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=30003 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=30149 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=30436 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=30301 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=30375 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=30329 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=29196 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=9850 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=30299 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=30048 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=30266 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=25958 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=30340 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=30298 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=30285 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=29990 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=29979 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=30243 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=30215 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=30185 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=30103 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=30205 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=30228 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=30190 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=30101 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=29822 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=29960 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=30070 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=22352 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=30061 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=30218 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=10076 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=30068 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=29694 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=29692 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=26187 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=9303 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=30017 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=29998 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=29995 + + (150) https://bugs.python.org/issue?@action=redirect&bpo=29962 + + (151) https://bugs.python.org/issue?@action=redirect&bpo=29649 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=29654 + + (153) https://bugs.python.org/issue?@action=redirect&bpo=29931 + + (154) https://bugs.python.org/issue?@action=redirect&bpo=29953 + + (155) https://bugs.python.org/issue?@action=redirect&bpo=29942 + + (156) https://bugs.python.org/issue?@action=redirect&bpo=10030 + + (157) https://bugs.python.org/issue?@action=redirect&bpo=29204 + + (158) https://bugs.python.org/issue?@action=redirect&bpo=27863 + + (159) https://bugs.python.org/issue?@action=redirect&bpo=25996 + + (160) https://bugs.python.org/issue?@action=redirect&bpo=28699 + + (161) https://bugs.python.org/issue?@action=redirect&bpo=23890 + + (162) https://bugs.python.org/issue?@action=redirect&bpo=29901 + + (163) https://bugs.python.org/issue?@action=redirect&bpo=25803 + + (164) https://bugs.python.org/issue?@action=redirect&bpo=29861 + + (165) https://bugs.python.org/issue?@action=redirect&bpo=19930 + + (166) https://bugs.python.org/issue?@action=redirect&bpo=29884 + + (167) https://bugs.python.org/issue?@action=redirect&bpo=25455 + + (168) https://bugs.python.org/issue?@action=redirect&bpo=29800 + + (169) https://bugs.python.org/issue?@action=redirect&bpo=8256 + + (170) https://bugs.python.org/issue?@action=redirect&bpo=28692 + + (171) https://bugs.python.org/issue?@action=redirect&bpo=26121 + + (172) https://bugs.python.org/issue?@action=redirect&bpo=29619 + + (173) https://bugs.python.org/issue?@action=redirect&bpo=28298 + + (174) https://bugs.python.org/issue?@action=redirect&bpo=29645 + + (175) https://bugs.python.org/issue?@action=redirect&bpo=28231 + + (176) https://bugs.python.org/issue?@action=redirect&bpo=26915 + + (177) https://bugs.python.org/issue?@action=redirect&bpo=28682 + + (178) https://bugs.python.org/issue?@action=redirect&bpo=29728 + + (179) https://bugs.python.org/issue?@action=redirect&bpo=29623 + + (180) https://bugs.python.org/issue?@action=redirect&bpo=9303 + + (181) https://bugs.python.org/issue?@action=redirect&bpo=28963 + + (182) https://bugs.python.org/issue?@action=redirect&bpo=29704 + + (183) https://bugs.python.org/issue?@action=redirect&bpo=29271 + + (184) https://bugs.python.org/issue?@action=redirect&bpo=29703 + + (185) https://bugs.python.org/issue?@action=redirect&bpo=29615 + + (186) https://bugs.python.org/issue?@action=redirect&bpo=7769 + + (187) https://bugs.python.org/issue?@action=redirect&bpo=29376 + + (188) https://bugs.python.org/issue?@action=redirect&bpo=28624 + + (189) https://bugs.python.org/issue?@action=redirect&bpo=28518 + + (190) https://bugs.python.org/issue?@action=redirect&bpo=29742 + + (191) https://bugs.python.org/issue?@action=redirect&bpo=16285 + + (192) https://bugs.python.org/issue?@action=redirect&bpo=29532 + + (193) https://bugs.python.org/issue?@action=redirect&bpo=29110 + + (194) https://bugs.python.org/issue?@action=redirect&bpo=22807 + + (195) https://bugs.python.org/issue?@action=redirect&bpo=29576 + + (196) https://bugs.python.org/issue?@action=redirect&bpo=29534 + + (197) https://bugs.python.org/issue?@action=redirect&bpo=10379 + + (198) https://bugs.python.org/issue?@action=redirect&bpo=29851 + + (199) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (200) https://bugs.python.org/issue?@action=redirect&bpo=29100 + + (201) https://bugs.python.org/issue?@action=redirect&bpo=29416 + + (202) https://bugs.python.org/issue?@action=redirect&bpo=29444 + + (203) https://bugs.python.org/issue?@action=redirect&bpo=29377 + + (204) https://bugs.python.org/issue?@action=redirect&bpo=29218 + + (205) https://bugs.python.org/issue?@action=redirect&bpo=29368 + + (206) https://bugs.python.org/issue?@action=redirect&bpo=29338 + + (207) https://bugs.python.org/issue?@action=redirect&bpo=29335 + + (208) https://bugs.python.org/issue?@action=redirect&bpo=29290 + + (209) https://bugs.python.org/issue?@action=redirect&bpo=28735 + + (210) https://bugs.python.org/issue?@action=redirect&bpo=29197 + + (211) https://bugs.python.org/issue?@action=redirect&bpo=29210 + + (212) https://bugs.python.org/issue?@action=redirect&bpo=29219 + + (213) https://bugs.python.org/issue?@action=redirect&bpo=29192 + + (214) https://bugs.python.org/issue?@action=redirect&bpo=29193 + + (215) https://bugs.python.org/issue?@action=redirect&bpo=29195 + + (216) https://bugs.python.org/issue?@action=redirect&bpo=28969 + + (217) https://bugs.python.org/issue?@action=redirect&bpo=20804 + + (218) https://bugs.python.org/issue?@action=redirect&bpo=29142 + + (219) https://bugs.python.org/issue?@action=redirect&bpo=28961 + + (220) https://bugs.python.org/issue?@action=redirect&bpo=15812 + + (221) https://bugs.python.org/issue?@action=redirect&bpo=28985 + + (222) https://bugs.python.org/issue?@action=redirect&bpo=29079 + + (223) https://bugs.python.org/issue?@action=redirect&bpo=13051 + + (224) https://bugs.python.org/issue?@action=redirect&bpo=9770 + + (225) https://bugs.python.org/issue?@action=redirect&bpo=28427 + + (226) https://bugs.python.org/issue?@action=redirect&bpo=28923 + + (227) https://bugs.python.org/issue?@action=redirect&bpo=28871 + + (228) https://bugs.python.org/issue?@action=redirect&bpo=19542 + + (229) https://bugs.python.org/issue?@action=redirect&bpo=20191 + + (230) https://bugs.python.org/issue?@action=redirect&bpo=16255 + + (231) https://bugs.python.org/issue?@action=redirect&bpo=28779 + + (232) https://bugs.python.org/issue?@action=redirect&bpo=26937 + + (233) https://bugs.python.org/issue?@action=redirect&bpo=28847 + + (234) https://bugs.python.org/issue?@action=redirect&bpo=27030 + + (235) https://bugs.python.org/issue?@action=redirect&bpo=28835 + + (236) https://bugs.python.org/issue?@action=redirect&bpo=27172 + + (237) https://bugs.python.org/issue?@action=redirect&bpo=28740 + + (238) https://bugs.python.org/issue?@action=redirect&bpo=26273 + + (239) https://bugs.python.org/issue?@action=redirect&bpo=28752 + + (240) https://bugs.python.org/issue?@action=redirect&bpo=28727 + + (241) https://bugs.python.org/issue?@action=redirect&bpo=18383 + + (242) https://bugs.python.org/issue?@action=redirect&bpo=20572 + + (243) https://bugs.python.org/issue?@action=redirect&bpo=25659 + + (244) https://bugs.python.org/issue?@action=redirect&bpo=28548 + + (245) https://bugs.python.org/issue?@action=redirect&bpo=19717 + + (246) https://bugs.python.org/issue?@action=redirect&bpo=28563 + + (247) https://bugs.python.org/issue?@action=redirect&bpo=28387 + + (248) https://bugs.python.org/issue?@action=redirect&bpo=27517 + + (249) https://bugs.python.org/issue?@action=redirect&bpo=28549 + + (250) https://bugs.python.org/issue?@action=redirect&bpo=28449 + + (251) https://bugs.python.org/issue?@action=redirect&bpo=23262 + + (252) https://bugs.python.org/issue?@action=redirect&bpo=24241 + + (253) https://bugs.python.org/issue?@action=redirect&bpo=27939 + + (254) https://bugs.python.org/issue?@action=redirect&bpo=28255 + + (255) https://bugs.python.org/issue?@action=redirect&bpo=28255 + + (256) https://bugs.python.org/issue?@action=redirect&bpo=20491 + + (257) https://bugs.python.org/issue?@action=redirect&bpo=28353 + + (258) https://bugs.python.org/issue?@action=redirect&bpo=28430 + + (259) https://bugs.python.org/issue?@action=redirect&bpo=27025 + + (260) https://bugs.python.org/issue?@action=redirect&bpo=25464 + + (261) https://bugs.python.org/issue?@action=redirect&bpo=28488 + + (262) https://bugs.python.org/issue?@action=redirect&bpo=25953 + + (263) https://bugs.python.org/issue?@action=redirect&bpo=28469 + + (264) https://bugs.python.org/issue?@action=redirect&bpo=28115 + + (265) https://bugs.python.org/issue?@action=redirect&bpo=18219 + + (266) https://bugs.python.org/issue?@action=redirect&bpo=28448 + + (267) https://bugs.python.org/issue?@action=redirect&bpo=23214 + + (268) https://bugs.python.org/issue?@action=redirect&bpo=28480 + + (269) https://bugs.python.org/issue?@action=redirect&bpo=28240 + + (270) https://bugs.python.org/issue?@action=redirect&bpo=28240 + + (271) https://bugs.python.org/issue?@action=redirect&bpo=28240 + + (272) https://github.com/pypa/setuptools/issues/100 + + (273) https://bugs.python.org/issue?@action=redirect&bpo=24452 + + (274) https://bugs.python.org/issue?@action=redirect&bpo=20766 + + (275) https://bugs.python.org/issue?@action=redirect&bpo=27998 + + (276) https://bugs.python.org/issue?@action=redirect&bpo=28317 + + (277) https://bugs.python.org/issue?@action=redirect&bpo=28380 + + (278) https://bugs.python.org/issue?@action=redirect&bpo=28229 + + (279) https://bugs.python.org/issue?@action=redirect&bpo=28321 + + (280) https://bugs.python.org/issue?@action=redirect&bpo=28225 + + (281) https://bugs.python.org/issue?@action=redirect&bpo=28227 + + (282) https://bugs.python.org/issue?@action=redirect&bpo=28332 + + (283) https://bugs.python.org/issue?@action=redirect&bpo=27358 + + (284) https://bugs.python.org/issue?@action=redirect&bpo=28257 + + (285) https://bugs.python.org/issue?@action=redirect&bpo=28322 + + (286) https://bugs.python.org/issue?@action=redirect&bpo=28228 + + (287) https://bugs.python.org/issue?@action=redirect&bpo=28226 + + (288) https://bugs.python.org/issue?@action=redirect&bpo=28314 + + (289) https://bugs.python.org/issue?@action=redirect&bpo=28148 + + (290) https://bugs.python.org/issue?@action=redirect&bpo=28253 + + (291) https://bugs.python.org/issue?@action=redirect&bpo=28275 + + (292) https://bugs.python.org/issue?@action=redirect&bpo=27897 + + (293) https://bugs.python.org/issue?@action=redirect&bpo=18844 + + (294) https://bugs.python.org/issue?@action=redirect&bpo=18893 + + (295) https://bugs.python.org/issue?@action=redirect&bpo=27611 + + (296) https://bugs.python.org/issue?@action=redirect&bpo=27348 + + (297) https://bugs.python.org/issue?@action=redirect&bpo=25651 + + (298) https://bugs.python.org/issue?@action=redirect&bpo=27778 + + (299) https://bugs.python.org/issue?@action=redirect&bpo=28200 + + (300) https://bugs.python.org/issue?@action=redirect&bpo=25400 + + (301) https://bugs.python.org/issue?@action=redirect&bpo=27932 + + (302) https://bugs.python.org/issue?@action=redirect&bpo=28075 + + (303) https://bugs.python.org/issue?@action=redirect&bpo=22493 + + (304) https://bugs.python.org/issue?@action=redirect&bpo=25270 + + (305) https://bugs.python.org/issue?@action=redirect&bpo=28181 + + (306) https://bugs.python.org/issue?@action=redirect&bpo=25895 + + (307) https://bugs.python.org/issue?@action=redirect&bpo=28114 + + (308) https://bugs.python.org/issue?@action=redirect&bpo=27599 + + (309) https://bugs.python.org/issue?@action=redirect&bpo=27906 + + (310) https://bugs.python.org/issue?@action=redirect&bpo=28174 + + (311) https://bugs.python.org/issue?@action=redirect&bpo=26654 + + (312) https://bugs.python.org/issue?@action=redirect&bpo=26909 + + (313) https://bugs.python.org/issue?@action=redirect&bpo=28176 + + (314) https://bugs.python.org/issue?@action=redirect&bpo=27759 + + (315) https://bugs.python.org/issue?@action=redirect&bpo=28325 + + (316) https://bugs.python.org/issue?@action=redirect&bpo=28368 + + (317) https://bugs.python.org/issue?@action=redirect&bpo=28369 + + (318) https://bugs.python.org/issue?@action=redirect&bpo=28370 + + (319) https://bugs.python.org/issue?@action=redirect&bpo=28371 + + (320) https://bugs.python.org/issue?@action=redirect&bpo=28372 + + (321) https://bugs.python.org/issue?@action=redirect&bpo=28399 + + (322) https://bugs.python.org/issue?@action=redirect&bpo=27972 + + (323) https://bugs.python.org/issue?@action=redirect&bpo=24142 + + (324) https://bugs.python.org/issue?@action=redirect&bpo=29581 + + (325) https://bugs.python.org/issue?@action=redirect&bpo=25532 + + (326) https://bugs.python.org/issue?@action=redirect&bpo=30177 + + +File: python.info, Node: Documentation<44>, Next: Tests<41>, Prev: Library<45>, Up: Python 3 7 0 alpha 1 + +1.21.46.4 Documentation +....................... + + - bpo-31294(1): Fix incomplete code snippet in the + ZeroMQSocketListener and ZeroMQSocketHandler examples and adapt + them to Python 3. + + - bpo-21649(2): Add RFC 7525 and Mozilla server side TLS links to SSL + documentation. + + - bpo-31128(3): Allow the pydoc server to bind to arbitrary + hostnames. + + - bpo-30803(4): Clarify doc on truth value testing. Original patch + by Peter Thomassen. + + - bpo-30176(5): Add missing attribute related constants in curses + documentation. + + - bpo-30052(6): the link targets for *note bytes(): 1b4. and *note + bytearray(): 1a5. are now their respective type definitions, rather + than the corresponding builtin function entries. Use *note bytes: + 14fe. and *note bytearray: 14ff. 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. + + - bpo-26985(7): Add missing info of code object in inspect + documentation. + + - bpo-19824(8): 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(9), + bpo-12518(10)) + + - bpo-28929(11): Link the documentation to its source file on GitHub. + + - bpo-25008(12): Document smtpd.py as effectively deprecated and add + a pointer to aiosmtpd, a third-party asyncio-based replacement. + + - bpo-26355(13): Add canonical header link on each page to + corresponding major version of the documentation. Patch by + Matthias Bussonnier. + + - bpo-29349(14): Fix Python 2 syntax in code for building the + documentation. + + - bpo-23722(15): The data model reference and the porting section in + the 3.6 What’s New guide now cover the additional ‘__classcell__’ + handling needed for custom metaclasses to fully support PEP 487(16) + and zero-argument ‘super()’. + + - bpo-28513(17): Documented command-line interface of zipfile. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31294 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21649 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31128 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30803 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30176 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30052 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26985 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=19824 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=20314 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=12518 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28929 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25008 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26355 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29349 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + (16) https://peps.python.org/pep-0487/ + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28513 + + +File: python.info, Node: Tests<41>, Next: Build<43>, Prev: Documentation<44>, Up: Python 3 7 0 alpha 1 + +1.21.46.5 Tests +............... + + - bpo-29639(1): test.support.HOST is now “localhost”, a new HOSTv4 + constant has been added for your ‘127.0.0.1’ needs, similar to the + existing HOSTv6 constant. + + - bpo-31320(2): Silence traceback in test_ssl + + - bpo-31346(3): Prefer PROTOCOL_TLS_CLIENT and PROTOCOL_TLS_SERVER + protocols for SSLContext. + + - bpo-25674(4): Remove sha256.tbs-internet.com ssl test + + - bpo-30715(5): Address ALPN callback changes for OpenSSL 1.1.0f. + The latest version behaves like OpenSSL 1.0.2 and no longer aborts + handshake. + + - bpo-30822(6): 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. + + - bpo-30695(7): Add the ‘set_nomemory(start, stop)’ and + ‘remove_mem_hooks()’ functions to the _testcapi module. + + - bpo-30357(8): 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. + + - bpo-30197(9): 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. + + - bpo-24932(10): Use proper command line parsing in _testembed + + - bpo-28950(11): Disallow -j0 to be combined with -T/-l in regrtest + command line arguments. + + - bpo-28683(12): Fix the tests that bind() a unix socket and raise + PermissionError on Android for a non-root user. + + - bpo-26936(13): Fix the test_socket failures on Android - + getservbyname(), getservbyport() and getaddrinfo() are broken on + some Android API levels. + + - bpo-28666(14): Now test.support.rmtree is able to remove unwritable + or unreadable directories. + + - bpo-23839(15): Various caches now are cleared before running every + test file. + + - bpo-26944(16): Fix test_posix for Android where ‘id -G’ is entirely + wrong or missing the effective gid. + + - bpo-28409(17): regrtest: fix the parser of command line arguments. + + - bpo-28217(18): Adds _testconsole module to test console input. + + - bpo-26939(19): Add the support.setswitchinterval() function to fix + test_functools hanging on the Android armv7 qemu emulator. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29639 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31320 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31346 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25674 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30715 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30822 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=30695 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30357 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=30197 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=24932 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28950 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28683 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26936 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28666 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=23839 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=26944 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28409 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28217 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26939 + + +File: python.info, Node: Build<43>, Next: Windows<40>, Prev: Tests<41>, Up: Python 3 7 0 alpha 1 + +1.21.46.6 Build +............... + + - bpo-31354(1): Allow –with-lto to be used on all builds, not just + ‘make profile-opt’. + + - bpo-31370(2): 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. + + - bpo-31341(3): Per PEP 11(4), support for the IRIX operating system + was removed. + + - bpo-30854(5): Fix compile error when compiling –without-threads. + Patch by Masayuki Yamamoto. + + - bpo-30687(6): Locate msbuild.exe on Windows when building rather + than vcvarsall.bat + + - bpo-20210(7): 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. + + - bpo-29941(8): Add ‘--with-assertions’ configure flag to explicitly + enable C ‘assert()’ checks. Defaults to off. ‘--with-pydebug’ + implies ‘--with-assertions’. + + - bpo-28787(9): Fix out-of-tree builds of Python when configured with + ‘--with--dtrace’. + + - bpo-29243(10): Prevent unnecessary rebuilding of Python during + ‘make test’, ‘make install’ and some other make targets when + configured with ‘--enable-optimizations’. + + - bpo-23404(11): Don’t regenerate generated files based on file + modification time anymore: the action is now explicit. Replace + ‘make touch’ with ‘make regen-all’. + + - bpo-29643(12): Fix ‘--enable-optimization’ didn’t work. + + - bpo-27593(13): 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. + + - bpo-29572(14): Update Windows build and OS X installers to use + OpenSSL 1.0.2k. + + - bpo-27659(15): Prohibit implicit C function declarations: use + ‘-Werror=implicit-function-declaration’ when possible (GCC and + Clang, but it depends on the compiler version). Patch written by + Chi Hsuan Yen. + + - bpo-29384(16): Remove old Be OS helper scripts. + + - bpo-26851(17): Set Android compilation and link flags. + + - bpo-28768(18): Fix implicit declaration of function _setmode. + Patch by Masayuki Yamamoto + + - bpo-29080(19): Removes hard dependency on hg.exe from + PCBuild/build.bat + + - bpo-23903(20): Added missed names to PC/python3.def. + + - bpo-28762(21): lockf() is available on Android API level 24, but + the F_LOCK macro is not defined in android-ndk-r13. + + - bpo-28538(22): Fix the compilation error that occurs because + if_nameindex() is available on Android API level 24, but the + if_nameindex structure is not defined. + + - bpo-20211(23): 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. + + - bpo-28849(24): Do not define sys.implementation._multiarch on + Android. + + - bpo-10656(25): Fix out-of-tree building on AIX. Patch by Tristan + Carel and Michael Haubenwallner. + + - bpo-26359(26): Rename –with-optimiations to –enable-optimizations. + + - bpo-28444(27): Fix missing extensions modules when cross compiling. + + - bpo-28208(28): Update Windows build and OS X installers to use + SQLite 3.14.2. + + - bpo-28248(29): Update Windows build and OS X installers to use + OpenSSL 1.0.2j. + + - bpo-21124(30): Fix building the _struct module on Cygwin by passing + ‘NULL’ instead of ‘&PyType_Type’ to PyVarObject_HEAD_INIT. Patch by + Masayuki Yamamoto. + + - bpo-13756(31): Fix building extensions modules on Cygwin. Patch by + Roumen Petrov, based on original patch by Jason Tishler. + + - bpo-21085(32): Add configure check for siginfo_t.si_band, which + Cygwin does not provide. Patch by Masayuki Yamamoto with review + and rebase by Erik Bray. + + - bpo-28258(33): Fixed build with Estonian locale (python-config and + distclean targets in Makefile). Patch by Arfrever Frehtes + Taifersar Arahesis. + + - bpo-26661(34): setup.py now detects system libffi with multiarch + wrapper. + + - bpo-27979(35): 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. + + - bpo-15819(36): Remove redundant include search directory option for + building outside the source tree. + + - bpo-28676(37): Prevent missing ‘getentropy’ declaration warning on + macOS. Patch by Gareth Rees. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31354 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31370 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31341 + + (4) https://peps.python.org/pep-0011/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30854 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30687 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=20210 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29941 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28787 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=29243 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=29643 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27593 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29572 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=27659 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=29384 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=26851 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28768 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=29080 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23903 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28762 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28538 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=20211 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=28849 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=10656 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=26359 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=28444 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=28208 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=28248 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=21124 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=13756 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=21085 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=28258 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=26661 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=27979 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=15819 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=28676 + + +File: python.info, Node: Windows<40>, Next: IDLE<33>, Prev: Build<43>, Up: Python 3 7 0 alpha 1 + +1.21.46.7 Windows +................. + + - bpo-31392(1): Update Windows build to use OpenSSL 1.1.0f + + - bpo-30389(2): Adds detection of Visual Studio 2017 to distutils on + Windows. + + - bpo-31358(3): zlib is no longer bundled in the CPython source, + instead it is downloaded on demand just like bz2, lzma, OpenSSL, + Tcl/Tk, and SQLite. + + - bpo-31340(4): Change to building with MSVC v141 (included with + Visual Studio 2017) + + - bpo-30581(5): os.cpu_count() now returns the correct number of + processors on Windows when the number of logical processors is + greater than 64. + + - bpo-30916(6): Pre-build OpenSSL, Tcl and Tk and include the + binaries in the build. + + - bpo-30731(7): Add a missing xmlns to python.manifest so that it + matches the schema. + + - bpo-30291(8): Allow requiring 64-bit interpreters from py.exe using + -64 suffix. Contributed by Steve (Gadget) Barnes. + + - bpo-30362(9): Adds list options (-0, -0p) to py.exe launcher. + Contributed by Steve Barnes. + + - bpo-23451(10): Fix socket deprecation warnings in socketmodule.c. + Patch by Segev Finer. + + - bpo-30450(11): 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 ‘py -3.6’), + NuGet is used to download a copy of 32-bit Python. + + - bpo-29579(12): Removes readme.txt from the installer. + + - bpo-25778(13): winreg does not truncate string correctly (Patch by + Eryk Sun) + + - bpo-28896(14): Deprecate WindowsRegistryFinder and disable it by + default + + - bpo-28522(15): Fixes mishandled buffer reallocation in getpathp.c + + - bpo-28402(16): Adds signed catalog files for stdlib on Windows. + + - bpo-28333(17): Enables Unicode for ps1/ps2 and input() prompts. + (Patch by Eryk Sun) + + - bpo-28251(18): Improvements to help manuals on Windows. + + - bpo-28110(19): launcher.msi has different product codes between + 32-bit and 64-bit + + - bpo-28161(20): Opening CON for write access fails + + - bpo-28162(21): WindowsConsoleIO readall() fails if first line + starts with Ctrl+Z + + - bpo-28163(22): WindowsConsoleIO fileno() passes wrong flags to + _open_osfhandle + + - bpo-28164(23): _PyIO_get_console_type fails for various paths + + - bpo-28137(24): Renames Windows path file to ._pth + + - bpo-28138(25): Windows ._pth file should allow import site + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31392 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30389 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31358 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31340 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30581 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30916 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=30731 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30291 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=30362 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=23451 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=30450 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=29579 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25778 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28896 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28522 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=28402 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28333 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28251 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=28110 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=28161 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28162 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28163 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=28164 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=28137 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=28138 + + +File: python.info, Node: IDLE<33>, Next: Tools/Demos<20>, Prev: Windows<40>, Up: Python 3 7 0 alpha 1 + +1.21.46.8 IDLE +.............. + + - bpo-31493(1): IDLE code context – fix code update and font update + timers. Canceling timers prevents a warning message when test_idle + completes. + + - bpo-31488(2): 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. + + - bpo-31477(3): IDLE - Improve rstrip entry in doc. Strip trailing + whitespace strips more than blank spaces. Multiline string + literals are not skipped. + + - bpo-31480(4): IDLE - make tests pass with zzdummy extension + disabled by default. + + - bpo-31421(5): 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. + + - bpo-31414(6): 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. + + - bpo-31051(7): Rearrange IDLE configdialog GenPage into Window, + Editor, and Help sections. + + - bpo-30617(8): 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. + + - bpo-31287(9): IDLE - Do not modify tkinter.message in + test_configdialog. + + - bpo-27099(10): 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 ‘<>’, ‘<>’, + ‘<>’, ‘<>’, + ‘<>’, ‘<>’, ‘<>’, and + ‘<>’. 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. + + - bpo-31206(11): IDLE: Factor HighPage(Frame) class from + ConfigDialog. Patch by Cheryl Sabella. + + - bpo-31001(12): Add tests for configdialog highlight tab. Patch by + Cheryl Sabella. + + - bpo-31205(13): IDLE: Factor KeysPage(Frame) class from + ConfigDialog. The slightly modified tests continue to pass. Patch + by Cheryl Sabella. + + - bpo-31130(14): IDLE – stop leaks in test_configdialog. Initial + patch by Victor Stinner. + + - bpo-31002(15): Add tests for configdialog keys tab. Patch by + Cheryl Sabella. + + - bpo-19903(16): IDLE: Calltips use *note inspect.signature: 301. + instead of *note inspect.getfullargspec: 302. This improves + calltips for builtins converted to use Argument Clinic. Patch by + Louie Lu. + + - bpo-31083(17): IDLE - Add an outline of a TabPage class in + configdialog. Update existing classes to match outline. Initial + patch by Cheryl Sabella. + + - bpo-31050(18): Factor GenPage(Frame) class from ConfigDialog. The + slightly modified tests continue to pass. Patch by Cheryl Sabella. + + - bpo-31004(19): IDLE - Factor FontPage(Frame) class from + ConfigDialog. Slightly modified tests continue to pass. Fix + General tests. Patch mostly by Cheryl Sabella. + + - bpo-30781(20): IDLE - Use ttk widgets in ConfigDialog. Patches by + Terry Jan Reedy and Cheryl Sabella. + + - bpo-31060(21): 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. + + - bpo-30853(22): 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%. + + - bpo-31003(23): IDLE: Add more tests for General tab. + + - bpo-30993(24): 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. + + - bpo-30981(25): IDLE – Add more configdialog font page tests. + + - bpo-28523(26): IDLE: replace ‘colour’ with ‘color’ in configdialog. + + - bpo-30917(27): Add tests for idlelib.config.IdleConf. Increase + coverage from 46% to 96%. Patch by Louie Lu. + + - bpo-30934(28): 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. + + - bpo-30913(29): 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. + + - bpo-30899(30): IDLE: Add tests for ConfigParser subclasses in + config. Patch by Louie Lu. + + - bpo-30881(31): IDLE: Add docstrings to browser.py. Patch by Cheryl + Sabella. + + - bpo-30851(32): IDLE: Remove unused variables in configdialog. One + is a duplicate, one is set but cannot be altered by users. Patch + by Cheryl Sabella. + + - bpo-30870(33): IDLE: In Settings dialog, select font with Up, Down + keys as well as mouse. Initial patch by Louie Lu. + + - bpo-8231(34): IDLE: call config.IdleConf.GetUserCfgDir only once. + + - bpo-30779(35): 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. + + - bpo-30777(36): IDLE: configdialog - Add docstrings and fix + comments. Patch by Cheryl Sabella. + + - bpo-30495(37): IDLE: Improve textview with docstrings, PEP8 names, + and more tests. Patch by Cheryl Sabella. + + - bpo-30723(38): 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. + + - bpo-30674(39): IDLE: add docstrings to grep module. Patch by + Cheryl Sabella + + - bpo-21519(40): IDLE’s basic custom key entry dialog now detects + duplicates properly. Original patch by Saimadhav Heblikar. + + - bpo-29910(41): IDLE no longer deletes a character after commenting + out a region by a key shortcut. Add ‘return 'break'’ for this and + other potential conflicts between IDLE and default key bindings. + + - bpo-30728(42): Review and change idlelib.configdialog names. + Lowercase method and attribute names. Replace ‘colour’ with + ‘color’, expand overly cryptic names, delete unneeded underscores. + Replace ‘import *’ with specific imports. Patches by Cheryl + Sabella. + + - bpo-6739(43): 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. + + - bpo-15786(44): 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. + + - bpo-25514(45): Add doc subsubsection about IDLE failure to start. + Popup no-connection message directs users to this section. + + - bpo-30642(46): Fix reference leaks in IDLE tests. Patches by Louie + Lu and Terry Jan Reedy. + + - bpo-30495(47): Add docstrings for textview.py and use PEP8 names. + Patches by Cheryl Sabella and Terry Jan Reedy. + + - bpo-30290(48): Help-about: use pep8 names and add tests. Increase + coverage to 100%. Patches by Louie Lu, Cheryl Sabella, and Terry + Jan Reedy. + + - bpo-30303(49): Add _utest option to textview; add new tests. + Increase coverage to 100%. Patches by Louie Lu and Terry Jan + Reedy. + + - bpo-29071(50): IDLE colors f-string prefixes (but not invalid ur + prefixes). + + - bpo-28572(51): Add 10% to coverage of IDLE’s test_configdialog. + Update and augment description of the configuration system. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31493 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31488 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31477 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31480 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31421 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31414 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31051 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30617 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31287 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27099 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31206 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31001 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31205 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31130 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31002 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=19903 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=31083 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31050 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31004 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=30781 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31060 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30853 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31003 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=30993 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=30981 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=28523 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=30917 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=30934 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30913 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=30899 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=30881 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=30851 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=30870 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=8231 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=30779 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30777 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=30495 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=30723 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=30674 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=21519 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=29910 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=30728 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=6739 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=15786 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=25514 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=30642 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=30495 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=30290 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=30303 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=29071 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=28572 + + +File: python.info, Node: Tools/Demos<20>, Next: C API<38>, Prev: IDLE<33>, Up: Python 3 7 0 alpha 1 + +1.21.46.9 Tools/Demos +..................... + + - bpo-30983(1): gdb integration commands (py-bt, etc.) work on + optimized shared builds now, too. PEP 523(2) 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. + + - bpo-29748(3): Added the slice index converter in Argument Clinic. + + - bpo-24037(4): Argument Clinic now uses the converter + ‘bool(accept={int})’ rather than *note int: 1c7. for semantical + booleans. This avoids repeating the default value for Python and C + and will help in converting to *note bool: 463. in future. + + - bpo-29367(5): python-gdb.py now supports also ‘method-wrapper’ + (‘wrapperobject’) objects. + + - bpo-28023(6): Fix python-gdb.py didn’t support new dict + implementation. + + - bpo-15369(7): The pybench and pystone microbenchmark have been + removed from Tools. Please use the new Python benchmark suite + ‘https://github.com/python/performance’ which is more reliable and + includes a portable version of pybench working on Python 2 and + Python 3. + + - bpo-28102(8): The zipfile module CLI now prints usage to stderr. + Patch by Stephen J. Turnbull. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30983 + + (2) https://peps.python.org/pep-0523/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29748 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24037 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29367 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28023 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=15369 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28102 + + +File: python.info, Node: C API<38>, Prev: Tools/Demos<20>, Up: Python 3 7 0 alpha 1 + +1.21.46.10 C API +................ + + - bpo-31338(1): Added the ‘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. + + - bpo-30832(2): 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. + + - bpo-30708(3): PyUnicode_AsWideCharString() now raises a ValueError + if the second argument is NULL and the wchar_t* string contains + null characters. + + - bpo-16500(4): Deprecate PyOS_AfterFork() and add PyOS_BeforeFork(), + PyOS_AfterFork_Parent() and PyOS_AfterFork_Child(). + + - bpo-6532(5): 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”. + + - bpo-27867(6): 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(). + + - bpo-29083(7): 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. + + - bpo-28769(8): The result of PyUnicode_AsUTF8AndSize() and + PyUnicode_AsUTF8() is now of type ‘const char *’ rather of ‘char + *’. + + - bpo-29058(9): 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. + + - bpo-28822(10): The index parameters `start' and `end' of + PyUnicode_FindChar() are now adjusted to behave like + ‘str[start:end]’. + + - bpo-28808(11): PyUnicode_CompareWithASCIIString() now never raises + exceptions. + + - bpo-28761(12): The fields name and doc of structures PyMemberDef, + PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc, and + wrapperbase are now of type ‘const char *’ rather of ‘char *’. + + - bpo-28748(13): Private variable _Py_PackageContext is now of type + ‘const char *’ rather of ‘char *’. + + - bpo-19569(14): Compiler warnings are now emitted if use most of + deprecated functions. + + - bpo-28426(15): Deprecated undocumented functions + PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), + PyUnicode_AsDecodedUnicode() and PyUnicode_AsEncodedUnicode(). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31338 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30832 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30708 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=16500 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=6532 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27867 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29083 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28769 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=29058 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28822 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28808 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28761 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28748 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=19569 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28426 + + +File: python.info, Node: Python 3 6 6 final, Next: Python 3 6 6 release candidate 1, Prev: Python 3 7 0 alpha 1, Up: Changelog + +1.21.47 Python 3.6.6 final +-------------------------- + +`Release date: 2018-06-27' + +There were no new changes in version 3.6.6. + + +File: python.info, Node: Python 3 6 6 release candidate 1, Next: Python 3 6 5 final, Prev: Python 3 6 6 final, Up: Changelog + +1.21.48 Python 3.6.6 release candidate 1 +---------------------------------------- + +`Release date: 2018-06-11' + +* Menu: + +* Core and Builtins: Core and Builtins<46>. +* Library: Library<46>. +* Documentation: Documentation<45>. +* Tests: Tests<42>. +* Build: Build<44>. +* Windows: Windows<41>. +* macOS: macOS<30>. +* IDLE: IDLE<34>. +* Tools/Demos: Tools/Demos<21>. +* C API: C API<39>. + + +File: python.info, Node: Core and Builtins<46>, Next: Library<46>, Up: Python 3 6 6 release candidate 1 + +1.21.48.1 Core and Builtins +........................... + + - bpo-33786(1): Fix asynchronous generators to handle GeneratorExit + in athrow() correctly + + - bpo-30654(2): 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. + + - bpo-33622(3): Fixed a leak when the garbage collector fails to add + an object with the ‘__del__’ method or referenced by it into the + *note gc.garbage: e74. list. *note PyGC_Collect(): 5e4. can now be + called when an exception is set and preserves it. + + - bpo-31849(4): Fix signed/unsigned comparison warning in pyhash.c. + + - bpo-33391(5): Fix a leak in set_symmetric_difference(). + + - bpo-28055(6): Fix unaligned accesses in siphash24(). Patch by Rolf + Eike Beer. + + - bpo-33231(7): Fix potential memory leak in ‘normalizestring()’. + + - bpo-29922(8): Improved error messages in ‘async with’ when + ‘__aenter__()’ or ‘__aexit__()’ return non-awaitable object. + + - bpo-33199(9): Fix ‘ma_version_tag’ in dict implementation is + uninitialized when copying from key-sharing dict. + + - bpo-33041(10): Fixed jumping when the function contains an ‘async + for’ loop. + + - bpo-32282(11): Fix an unnecessary ifdef in the include of + VersionHelpers.h in socketmodule on Windows. + + - bpo-21983(12): Fix a crash in *note ctypes.cast(): 1461. in case + the type argument is a ctypes structured data type. Patch by Eryk + Sun and Oren Milman. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33786 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30654 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33622 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31849 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33391 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28055 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33231 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29922 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33199 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=33041 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32282 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=21983 + + +File: python.info, Node: Library<46>, Next: Documentation<45>, Prev: Core and Builtins<46>, Up: Python 3 6 6 release candidate 1 + +1.21.48.2 Library +................. + + - bpo-30167(1): Prevent site.main() exception if PYTHONSTARTUP is + set. Patch by Steve Weber. + + - bpo-33812(2): Datetime instance d with non-None tzinfo, but with + d.tzinfo.utcoffset(d) returning None is now treated as naive by the + astimezone() method. + + - bpo-30805(3): Avoid race condition with debug logging + + - bpo-33767(4): The concatenation (‘+’) and repetition (‘*’) sequence + operations now raise *note TypeError: 19c. instead of *note + SystemError: 9b5. when performed on *note mmap.mmap: 64e. objects. + Patch by Zackery Spytz. + + - bpo-32684(5): Fix gather to propagate cancellation of itself even + with return_exceptions. + + - bpo-33674(6): 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. + + - bpo-31647(7): Fixed bug where calling write_eof() on a + _SelectorSocketTransport after it’s already closed raises + AttributeError. + + - bpo-33672(8): Fix Task.__repr__ crash with Cython’s bogus + coroutines + + - bpo-33469(9): Fix RuntimeError after closing loop that used + run_in_executor + + - bpo-11874(10): Use a better regex when breaking usage into + wrappable parts. Avoids bogus assertion errors from custom metavar + strings. + + - bpo-30877(11): 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. + + - bpo-33548(12): tempfile._candidate_tempdir_list should consider + common TEMP locations + + - bpo-33542(13): Prevent ‘uuid.get_node’ from using a DUID instead of + a MAC on Windows. Patch by Zvi Effron + + - bpo-26819(14): Fix race condition with + ‘ReadTransport.resume_reading’ in Windows proactor event loop. + + - bpo-28556(15): Minor fixes in typing module: add annotations to + ‘NamedTuple.__new__’, pass ‘*args’ and ‘**kwds’ in + ‘Generic.__new__’. Original PRs by Paulius Šarka and Chad + Dombrova. + + - bpo-20087(16): Updated alias mapping with glibc 2.27 supported + locales. + + - bpo-33422(17): Fix trailing quotation marks getting deleted when + looking up byte/string literals on pydoc. Patch by Andrés Delfino. + + - bpo-33197(18): Update error message when constructing invalid + inspect.Parameters Patch by Dong-hee Na. + + - bpo-33383(19): Fixed crash in the get() method of the *note + dbm.ndbm: 33. database object when it is called with a single + argument. + + - bpo-33329(20): Fix multiprocessing regression on newer glibcs + + - bpo-991266(21): Fix quoting of the ‘Comment’ attribute of *note + http.cookies.SimpleCookie: 1481. + + - bpo-33131(22): Upgrade bundled version of pip to 10.0.1. + + - bpo-33308(23): Fixed a crash in the ‘parser’ module when converting + an ST object to a tree of tuples or lists with ‘line_info=False’ + and ‘col_info=True’. + + - bpo-33263(24): Fix FD leak in ‘_SelectorSocketTransport’ Patch by + Vlad Starostin. + + - bpo-33256(25): Fix display of ‘’ call in the html produced + by ‘cgitb.html()’. Patch by Stéphane Blondon. + + - bpo-33203(26): ‘random.Random.choice()’ now raises ‘IndexError’ for + empty sequences consistently even when called from subclasses + without a ‘getrandbits()’ implementation. + + - bpo-33224(27): Update difflib.mdiff() for PEP 479(28). Convert an + uncaught StopIteration in a generator into a return-statement. + + - bpo-33209(29): End framing at the end of C implementation of *note + pickle.Pickler.dump(): 1483. + + - bpo-32861(30): The urllib.robotparser’s ‘__str__’ representation + now includes wildcard entries and the “Crawl-delay” and + “Request-rate” fields. Patch by Michael Lazar. + + - bpo-33096(31): 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. + + - bpo-33127(32): The ssl module now compiles with LibreSSL 2.7.1. + + - bpo-33021(33): Release the GIL during fstat() calls, avoiding hang + of all threads when calling mmap.mmap(), os.urandom(), and + random.seed(). Patch by Nir Soffer. + + - bpo-27683(34): Fix a regression in *note ipaddress: a0. that result + of ‘hosts()’ is empty when the network is constructed by a tuple + containing an integer mask and only 1 bit left for addresses. + + - bpo-32844(35): Fix wrong redirection of a low descriptor (0 or 1) + to stderr in subprocess if another low descriptor is closed. + + - bpo-31908(36): Fix output of cover files for ‘trace’ module + command-line tool. Previously emitted cover files only when + ‘--missing’ option was used. Patch by Michael Selik. + + - bpo-31457(37): If nested log adapters are used, the inner + ‘process()’ methods are no longer omitted. + + - bpo-16865(38): Support arrays >=2GiB in *note ctypes: 29. Patch by + Segev Finer. + + - bpo-31238(39): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30167 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33812 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30805 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33767 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32684 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33674 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31647 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33672 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=33469 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=11874 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=30877 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=33548 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=33542 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=26819 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=20087 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=33422 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=33197 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=33383 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=33329 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=991266 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=33131 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=33308 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=33263 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=33256 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=33203 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=33224 + + (28) https://peps.python.org/pep-0479/ + + (29) https://bugs.python.org/issue?@action=redirect&bpo=33209 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=32861 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=33096 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=33127 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=33021 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=27683 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=32844 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=31908 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=31457 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=16865 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=31238 + + +File: python.info, Node: Documentation<45>, Next: Tests<42>, Prev: Library<46>, Up: Python 3 6 6 release candidate 1 + +1.21.48.3 Documentation +....................... + + - bpo-33503(1): Fix broken pypi link + + - bpo-33421(2): Add missing documentation for + ‘typing.AsyncContextManager’. + + - bpo-33378(3): Add Korean language switcher for + ‘https://docs.python.org/3/’ + + - bpo-33276(4): Clarify that the ‘__path__’ attribute on modules + cannot be just any value. + + - bpo-33201(5): Modernize documentation for writing C extension + types. + + - bpo-33195(6): Deprecate ‘Py_UNICODE’ usage in ‘c-api/arg’ document. + ‘Py_UNICODE’ related APIs are deprecated since Python 3.3, but it + is missed in the document. + + - bpo-33126(7): Document PyBuffer_ToContiguous(). + + - bpo-27212(8): Modify documentation for the ‘islice()’ recipe to + consume initial values up to the start index. + + - bpo-28247(9): Update *note zipapp: 14c. documentation to describe + how to make standalone applications. + + - bpo-18802(10): Documentation changes for ipaddress. Patch by Jon + Foster and Berker Peksag. + + - bpo-27428(11): Update documentation to clarify that + ‘WindowsRegistryFinder’ implements ‘MetaPathFinder’. (Patch by + Himanshu Lakhara) + + - bpo-8243(12): Add a note about curses.addch and curses.addstr + exception behavior when writing outside a window, or pad. + + - bpo-31432(13): Clarify meaning of CERT_NONE, CERT_OPTIONAL, and + CERT_REQUIRED flags for ssl.SSLContext.verify_mode. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33503 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33421 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33378 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33276 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33201 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33195 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33126 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27212 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28247 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=18802 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27428 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=8243 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31432 + + +File: python.info, Node: Tests<42>, Next: Build<44>, Prev: Documentation<45>, Up: Python 3 6 6 release candidate 1 + +1.21.48.4 Tests +............... + + - bpo-33655(1): Ignore test_posix_fallocate failures on BSD platforms + that might be due to running on ZFS. + + - bpo-19417(2): Add test_bdb.py. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33655 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19417 + + +File: python.info, Node: Build<44>, Next: Windows<41>, Prev: Tests<42>, Up: Python 3 6 6 release candidate 1 + +1.21.48.5 Build +............... + + - bpo-5755(1): Move ‘-Wstrict-prototypes’ option to ‘CFLAGS_NODIST’ + from ‘OPT’. This option emitted annoying warnings when building + extension modules written in C++. + + - bpo-33614(2): Ensures module definition files for the stable ABI on + Windows are correctly regenerated. + + - bpo-33522(3): Enable CI builds on Visual Studio Team Services at + ‘https://python.visualstudio.com/cpython’ + + - bpo-33012(4): Add ‘-Wno-cast-function-type’ for gcc 8 for silencing + warnings about function casts like casting to PyCFunction in method + definition lists. + + - bpo-33394(5): Enable the verbose build for extension modules, when + GNU make is passed macros on the command line. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5755 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33614 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33522 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33012 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33394 + + +File: python.info, Node: Windows<41>, Next: macOS<30>, Prev: Build<44>, Up: Python 3 6 6 release candidate 1 + +1.21.48.6 Windows +................. + + - bpo-33184(1): Update Windows installer to OpenSSL 1.0.2o. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33184 + + +File: python.info, Node: macOS<30>, Next: IDLE<34>, Prev: Windows<41>, Up: Python 3 6 6 release candidate 1 + +1.21.48.7 macOS +............... + + - bpo-33184(1): Update macOS installer build to use OpenSSL 1.0.2o. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33184 + + +File: python.info, Node: IDLE<34>, Next: Tools/Demos<21>, Prev: macOS<30>, Up: Python 3 6 6 release candidate 1 + +1.21.48.8 IDLE +.............. + + - bpo-33656(1): 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. + + - bpo-33768(2): Clicking on a context line moves that line to the top + of the editor window. + + - bpo-33763(3): IDLE: Use read-only text widget for code context + instead of label widget. + + - bpo-33664(4): 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. + + - bpo-33679(5): 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. + + - bpo-33642(6): Display up to maxlines non-blank lines for Code + Context. If there is no current context, show a single blank line. + + - bpo-33628(7): IDLE: Cleanup codecontext.py and its test. + + - bpo-33564(8): IDLE’s code context now recognizes async as a block + opener. + + - bpo-29706(9): IDLE now colors async and await as keywords in 3.6. + They become full keywords in 3.7. + + - bpo-21474(10): 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. + + - bpo-33204(11): 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. + + - bpo-32831(12): Add docstrings and tests for codecontext. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33656 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=33768 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33763 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=33664 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33679 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=33642 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=33628 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=33564 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=29706 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21474 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=33204 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32831 + + +File: python.info, Node: Tools/Demos<21>, Next: C API<39>, Prev: IDLE<34>, Up: Python 3 6 6 release candidate 1 + +1.21.48.9 Tools/Demos +..................... + + - bpo-33189(1): ‘pygettext.py’ now recognizes only literal strings as + docstrings and translatable strings, and rejects bytes literals and + f-string expressions. + + - bpo-31920(2): Fixed handling directories as arguments in the + ‘pygettext’ script. Based on patch by Oleg Krasnikov. + + - bpo-29673(3): Fix pystackv and pystack gdbinit macros. + + - bpo-32885(4): Add an ‘-n’ flag for ‘Tools/scripts/pathfix.py’ to + disable automatic backup creation (files with ‘~’ suffix). + + - bpo-31583(5): Fix 2to3 for using with –add-suffix option but + without –output-dir option for relative path to files in current + directory. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33189 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31920 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29673 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32885 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31583 + + +File: python.info, Node: C API<39>, Prev: Tools/Demos<21>, Up: Python 3 6 6 release candidate 1 + +1.21.48.10 C API +................ + + - bpo-32374(1): Document that m_traverse for multi-phase initialized + modules can be called with m_state=NULL, and add a sanity check + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32374 + + +File: python.info, Node: Python 3 6 5 final, Next: Python 3 6 5 release candidate 1, Prev: Python 3 6 6 release candidate 1, Up: Changelog + +1.21.49 Python 3.6.5 final +-------------------------- + +`Release date: 2018-03-28' + +* Menu: + +* Tests: Tests<43>. +* Build: Build<45>. + + +File: python.info, Node: Tests<43>, Next: Build<45>, Up: Python 3 6 5 final + +1.21.49.1 Tests +............... + + - bpo-32872(1): Avoid regrtest compatibility issue with namespace + packages. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32872 + + +File: python.info, Node: Build<45>, Prev: Tests<43>, Up: Python 3 6 5 final + +1.21.49.2 Build +............... + + - bpo-33163(1): Upgrade pip to 9.0.3 and setuptools to v39.0.1. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33163 + + +File: python.info, Node: Python 3 6 5 release candidate 1, Next: Python 3 6 4 final, Prev: Python 3 6 5 final, Up: Changelog + +1.21.50 Python 3.6.5 release candidate 1 +---------------------------------------- + +`Release date: 2018-03-13' + +* Menu: + +* Security: Security<26>. +* Core and Builtins: Core and Builtins<47>. +* Library: Library<47>. +* Documentation: Documentation<46>. +* Tests: Tests<44>. +* Build: Build<46>. +* Windows: Windows<42>. +* macOS: macOS<31>. +* IDLE: IDLE<35>. +* Tools/Demos: Tools/Demos<22>. +* C API: C API<40>. + + +File: python.info, Node: Security<26>, Next: Core and Builtins<47>, Up: Python 3 6 5 release candidate 1 + +1.21.50.1 Security +.................. + + - bpo-33001(1): Minimal fix to prevent buffer overrun in os.symlink + on Windows + + - bpo-32981(2): Regexes in difflib and poplib were vulnerable to + catastrophic backtracking. These regexes formed potential DOS + vectors (REDOS). They have been refactored. This resolves + CVE-2018-1060 and CVE-2018-1061. Patch by Jamie Davis. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33001 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32981 + + +File: python.info, Node: Core and Builtins<47>, Next: Library<47>, Prev: Security<26>, Up: Python 3 6 5 release candidate 1 + +1.21.50.2 Core and Builtins +........................... + + - bpo-33026(1): Fixed jumping out of “with” block by setting + f_lineno. + + - bpo-17288(2): Prevent jumps from ‘return’ and ‘exception’ trace + events. + + - bpo-32889(3): Update Valgrind suppression list to account for the + rename of ‘Py_ADDRESS_IN_RANG’ to ‘address_in_range’. + + - bpo-32650(4): Pdb and other debuggers dependent on bdb.py will + correctly step over (next command) native coroutines. Patch by + Pablo Galindo. + + - bpo-32685(5): 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. + + - bpo-32583(6): Fix possible crashing in builtin Unicode decoders + caused by write out-of-bound errors when using customized decode + error handlers. + + - bpo-26163(7): Improved frozenset() hash to create more distinct + hash values when faced with datasets containing many similar + values. + + - bpo-27169(8): The ‘__debug__’ constant is now optimized out at + compile time. This fixes also bpo-22091(9). + + - bpo-32329(10): ‘sys.flags.hash_randomization’ is now properly set + to 0 when hash randomization is turned off by ‘PYTHONHASHSEED=0’. + + - bpo-30416(11): The optimizer is now protected from spending much + time doing complex calculations and consuming much memory for + creating large constants in constant folding. + + - bpo-18533(12): ‘repr()’ on a dict containing its own ‘values()’ or + ‘items()’ no longer raises ‘RecursionError’; OrderedDict similarly. + Instead, use ‘...’, as for other recursive structures. Patch by + Ben North. + + - bpo-32028(13): Leading whitespace is now correctly ignored when + generating suggestions for converting Py2 print statements to Py3 + builtin print function calls. Patch by Sanyam Khurana. + + - bpo-32137(14): The repr of deeply nested dict now raises a + RecursionError instead of crashing due to a stack overflow. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33026 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17288 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32889 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32650 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32685 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32583 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26163 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27169 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=22091 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32329 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=30416 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=18533 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32028 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32137 + + +File: python.info, Node: Library<47>, Next: Documentation<46>, Prev: Core and Builtins<47>, Up: Python 3 6 5 release candidate 1 + +1.21.50.3 Library +................. + + - bpo-33064(1): lib2to3 now properly supports trailing commas after + ‘*args’ and ‘**kwargs’ in function signatures. + + - bpo-31804(2): Avoid failing in multiprocessing.Process if the + standard streams are closed or None at exit. + + - bpo-33037(3): Skip sending/receiving data after SSL transport + closing. + + - bpo-30353(4): Fix ctypes pass-by-value for structs on 64-bit + Cygwin/MinGW. + + - bpo-33009(5): Fix inspect.signature() for single-parameter + partialmethods. + + - bpo-32969(6): Expose several missing constants in zlib and fix + corresponding documentation. + + - bpo-32713(7): Fixed tarfile.itn handling of out-of-bounds float + values. Patch by Joffrey Fuhrer. + + - bpo-30622(8): The ssl module now detects missing NPN support in + LibreSSL. + + - bpo-32922(9): dbm.open() now encodes filename with the filesystem + encoding rather than default encoding. + + - bpo-32859(10): In ‘os.dup2’, don’t check every call whether the + ‘dup3’ syscall exists or not. + + - bpo-21060(11): 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”. + + - bpo-32857(12): In *note tkinter: 10e, ‘after_cancel(None)’ now + raises a *note ValueError: 1c8. instead of canceling the first + scheduled function. Patch by Cheryl Sabella. + + - bpo-32852(13): Make sure sys.argv remains as a list when running + trace. + + - bpo-32841(14): Fixed *note asyncio.Condition: 6c5. issue which + silently ignored cancellation after notifying and cancelling a + conditional lock. Patch by Bar Harel. + + - bpo-31787(15): Fixed refleaks of ‘__init__()’ methods in various + modules. (Contributed by Oren Milman) + + - bpo-30157(16): Fixed guessing quote and delimiter in + csv.Sniffer.sniff() when only the last field is quoted. Patch by + Jake Davis. + + - bpo-32394(17): socket: Remove TCP_FASTOPEN, TCP_KEEPCNT flags on + older version Windows during run-time. + + - bpo-32777(18): 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. + + - bpo-32647(19): The ctypes module used to depend on indirect linking + for dlopen. The shared extension is now explicitly linked against + libdl on platforms with dl. + + - bpo-32734(20): Fixed ‘asyncio.Lock()’ safety issue which allowed + acquiring and locking the same lock multiple times, without it + being free. Patch by Bar Harel. + + - bpo-32727(21): Do not include name field in SMTP envelope from + address. Patch by Stéphane Wirtel + + - bpo-27931(22): Fix email address header parsing error when the + username is an empty quoted string. Patch by Xiang Zhang. + + - bpo-32304(23): 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. + + - bpo-32502(24): uuid.uuid1 no longer raises an exception if a 64-bit + hardware address is encountered. + + - bpo-31848(25): Fix the error handling in Aifc_read.initfp() when + the SSND chunk is not found. Patch by Zackery Spytz. + + - bpo-32555(26): 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. + + - bpo-32521(27): The nis module is now compatible with new libnsl and + headers location. + + - bpo-32473(28): Improve ABCMeta._dump_registry() output readability + + - bpo-32521(29): glibc has removed Sun RPC. Use replacement libtirpc + headers and library in nis module. + + - bpo-32228(30): Ensure that ‘truncate()’ preserves the file position + (as reported by ‘tell()’) after writes longer than the buffer size. + + - bpo-26133(31): Don’t unsubscribe signals in asyncio UNIX event loop + on interpreter shutdown. + + - bpo-32185(32): The SSL module no longer sends IP addresses in SNI + TLS extension on platforms with OpenSSL 1.0.2+ or inet_pton. + + - bpo-32323(33): *note urllib.parse.urlsplit(): 9b3. does not convert + zone-id (scope) to lower case for scoped IPv6 addresses in + hostnames now. + + - bpo-32302(34): Fix bdist_wininst of distutils for CRT v142: it + binary compatible with CRT v140. + + - bpo-32255(35): 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. + + - bpo-32277(36): Raise ‘NotImplementedError’ instead of ‘SystemError’ + on platforms where ‘chmod(..., follow_symlinks=False)’ is not + supported. Patch by Anthony Sottile. + + - bpo-32199(37): The getnode() ip getter now uses ‘ip link’ instead + of ‘ip link list’. + + - bpo-27456(38): Ensure TCP_NODELAY is set on Linux. Tests by Victor + Stinner. + + - bpo-31900(39): The *note locale.localeconv(): 868. function now + sets temporarily the ‘LC_CTYPE’ locale to the ‘LC_NUMERIC’ locale + to decode ‘decimal_point’ and ‘thousands_sep’ byte strings if they + are non-ASCII or longer than 1 byte, and the ‘LC_NUMERIC’ locale is + different than the ‘LC_CTYPE’ locale. This temporary change + affects other threads. Same change for the *note str.format(): + 1fc. method when formatting a number (*note int: 1c7, *note float: + 3ca, *note float: 3ca. and subclasses) with the ‘n’ type (ex: + ‘'{:n}'.format(1234)’). + + - bpo-31802(40): Importing native path module (‘posixpath’, ‘ntpath’) + now works even if the ‘os’ module still is not imported. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33064 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31804 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=33037 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30353 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=33009 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32969 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32713 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30622 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=32922 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32859 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=21060 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32857 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32852 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32841 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31787 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=30157 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=32394 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=32777 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=32647 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=32734 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=32727 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=27931 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=32304 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=32502 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=31848 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=32555 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=32521 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=32473 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=32521 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=32228 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=26133 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=32185 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=32323 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=32302 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=32255 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=32277 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=32199 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=27456 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=31900 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=31802 + + +File: python.info, Node: Documentation<46>, Next: Tests<44>, Prev: Library<47>, Up: Python 3 6 5 release candidate 1 + +1.21.50.4 Documentation +....................... + + - bpo-17232(1): Clarify docs for -O and -OO. Patch by Terry Reedy. + + - bpo-32800(2): Update link to w3c doc for xml default namespaces. + + - bpo-8722(3): Document ‘__getattr__()’ behavior when property + ‘get()’ method raises *note AttributeError: 19d. + + - bpo-32614(4): Modify RE examples in documentation to use raw + strings to prevent *note DeprecationWarning: 2d4. and add text to + REGEX HOWTO to highlight the deprecation. + + - bpo-31972(5): Improve docstrings for *note pathlib.PurePath: 306. + subclasses. + + - bpo-17799(6): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=17232 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32800 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=8722 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32614 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31972 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17799 + + +File: python.info, Node: Tests<44>, Next: Build<46>, Prev: Documentation<46>, Up: Python 3 6 5 release candidate 1 + +1.21.50.5 Tests +............... + + - bpo-32517(1): Fix failing ‘test_asyncio’ on macOS 10.12.2+ due to + transport of ‘KqueueSelector’ loop was not being closed. + + - bpo-32721(2): Fix test_hashlib to not fail if the _md5 module is + not built. + + - bpo-32252(3): Fix faulthandler_suppress_crash_report() used to + prevent core dump files when testing crashes. getrlimit() returns + zero on success. + + - bpo-31518(4): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32517 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32721 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32252 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31518 + + +File: python.info, Node: Build<46>, Next: Windows<42>, Prev: Tests<44>, Up: Python 3 6 5 release candidate 1 + +1.21.50.6 Build +............... + + - bpo-32635(1): Fix segfault of the crypt module when libxcrypt is + provided instead of libcrypt at the system. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32635 + + +File: python.info, Node: Windows<42>, Next: macOS<31>, Prev: Build<46>, Up: Python 3 6 5 release candidate 1 + +1.21.50.7 Windows +................. + + - bpo-33016(1): Fix potential use of uninitialized memory in + nt._getfinalpathname + + - bpo-32903(2): Fix a memory leak in os.chdir() on Windows if the + current directory is set to a UNC path. + + - bpo-31966(3): Fixed WindowsConsoleIO.write() for writing empty + data. + + - bpo-32409(4): Ensures activate.bat can handle Unicode contents. + + - bpo-32457(5): Improves handling of denormalized executable path + when launching Python. + + - bpo-32370(6): Use the correct encoding for ipconfig output in the + uuid module. Patch by Segev Finer. + + - bpo-29248(7): Fix *note os.readlink(): 568. on Windows, which was + mistakenly treating the ‘PrintNameOffset’ field of the reparse data + buffer as a number of characters instead of bytes. Patch by Craig + Holmquist and SSE4. + + - bpo-32588(8): Create standalone _distutils_findvs module. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33016 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32903 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31966 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32409 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32457 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32370 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29248 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32588 + + +File: python.info, Node: macOS<31>, Next: IDLE<35>, Prev: Windows<42>, Up: Python 3 6 5 release candidate 1 + +1.21.50.8 macOS +............... + + - bpo-32726(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32726 + + +File: python.info, Node: IDLE<35>, Next: Tools/Demos<22>, Prev: macOS<31>, Up: Python 3 6 5 release candidate 1 + +1.21.50.9 IDLE +.............. + + - bpo-32984(1): Set ‘__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, + ‘-s’ runs a file named in environmental variable ‘IDLESTARTUP’ or + *note PYTHONSTARTUP: c6a.; ‘-r file’ runs ‘file’. Python sets + ‘__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 ‘-n’ option. + + - bpo-32940(2): Simplify and rename StringTranslatePseudoMapping in + pyparse. + + - bpo-32916(3): Change ‘str’ to ‘code’ in pyparse. + + - bpo-32905(4): Remove unused code in pyparse module. + + - bpo-32874(5): Add tests for pyparse. + + - bpo-32837(6): Using the system and place-dependent default encoding + for open() is a bad idea for IDLE’s system and location-independent + files. + + - bpo-32826(7): 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. + + - bpo-32765(8): Update configdialog General tab docstring to add new + widgets to the widget list. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32984 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32940 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32916 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=32905 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32874 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32837 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=32826 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=32765 + + +File: python.info, Node: Tools/Demos<22>, Next: C API<40>, Prev: IDLE<35>, Up: Python 3 6 5 release candidate 1 + +1.21.50.10 Tools/Demos +...................... + + - bpo-24960(1): 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. + + - bpo-32222(2): Fix pygettext not extracting docstrings for functions + with type annotated arguments. Patch by Toby Harradine. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24960 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32222 + + +File: python.info, Node: C API<40>, Prev: Tools/Demos<22>, Up: Python 3 6 5 release candidate 1 + +1.21.50.11 C API +................ + + - bpo-29084(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29084 + + +File: python.info, Node: Python 3 6 4 final, Next: Python 3 6 4 release candidate 1, Prev: Python 3 6 5 release candidate 1, Up: Changelog + +1.21.51 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. + + +File: python.info, Node: Python 3 6 4 release candidate 1, Next: Python 3 6 3 final, Prev: Python 3 6 4 final, Up: Changelog + +1.21.52 Python 3.6.4 release candidate 1 +---------------------------------------- + +`Release date: 2017-12-05' + +* Menu: + +* Core and Builtins: Core and Builtins<48>. +* Library: Library<48>. +* Documentation: Documentation<47>. +* Tests: Tests<45>. +* Build: Build<47>. +* Windows: Windows<43>. +* macOS: macOS<32>. +* IDLE: IDLE<36>. +* Tools/Demos: Tools/Demos<23>. +* C API: C API<41>. + + +File: python.info, Node: Core and Builtins<48>, Next: Library<48>, Up: Python 3 6 4 release candidate 1 + +1.21.52.1 Core and Builtins +........................... + + - bpo-32176(1): 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. + + - bpo-31949(2): 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 ‘2**31’ traceback items on Windows. Fixed output + errors handling. + + - bpo-30696(3): Fix the interactive interpreter looping endlessly + when no memory. + + - bpo-20047(4): 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. + + - bpo-31852(5): Fix a segmentation fault caused by a combination of + the async soft keyword and continuation lines. + + - bpo-21720(6): BytesWarning no longer emitted when the `fromlist' + argument of ‘__import__()’ or the ‘__all__’ attribute of the module + contain bytes instances. + + - bpo-31825(7): Fixed OverflowError in the ‘unicode-escape’ codec and + in codecs.escape_decode() when decode an escaped non-ascii byte. + + - bpo-28603(8): 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. + + - bpo-31786(9): 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. + + - bpo-31642(10): Restored blocking “from package import module” by + setting sys.modules[“package.module”] to None. + + - bpo-31626(11): Fixed a bug in debug memory allocator. There was a + write to freed memory after shrinking a memory block. + + - bpo-31619(12): Fixed a ValueError when convert a string with large + number of underscores to integer with binary base. + + - bpo-31592(13): Fixed an assertion failure in Python parser in case + of a bad *note unicodedata.normalize(): 29e. Patch by Oren Milman. + + - bpo-31588(14): Raise a *note TypeError: 19c. with a helpful error + message when class creation fails due to a metaclass with a bad + ‘__prepare__()’ method. Patch by Oren Milman. + + - bpo-31566(15): Fix an assertion failure in ‘_warnings.warn()’ in + case of a bad ‘__name__’ global. Patch by Oren Milman. + + - bpo-31505(16): Fix an assertion failure in *note json: a2, in case + ‘_json.make_encoder()’ received a bad ‘encoder()’ argument. Patch + by Oren Milman. + + - bpo-31492(17): Fix assertion failures in case of failing to import + from a module with a bad ‘__name__’ attribute, and in case of + failing to access an attribute of such a module. Patch by Oren + Milman. + + - bpo-31490(18): Fix an assertion failure in *note ctypes: 29. class + definition, in case the class has an attribute whose name is + specified in ‘_anonymous_’ but not in ‘_fields_’. Patch by Oren + Milman. + + - bpo-31478(19): Fix an assertion failure in ‘_random.Random.seed()’ + in case the argument has a bad ‘__abs__()’ method. Patch by Oren + Milman. + + - bpo-31315(20): Fix an assertion failure in imp.create_dynamic(), + when spec.name is not a string. Patch by Oren Milman. + + - bpo-31311(21): Fix a crash in the ‘__setstate__()’ method of *note + ctypes._CData: 14f1, in case of a bad ‘__dict__’. Patch by Oren + Milman. + + - bpo-31293(22): 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. + + - bpo-31285(23): Fix an assertion failure in *note + warnings.warn_explicit: 96f, when the return value of the received + loader’s get_source() has a bad splitlines() method. Patch by Oren + Milman. + + - bpo-30817(24): ‘PyErr_PrintEx()’ clears now the ignored exception + that may be raised by ‘_PySys_SetObjectId()’, for example when no + memory. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32176 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31949 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30696 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20047 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31852 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21720 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31825 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28603 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31786 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31642 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31626 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31619 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31592 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31588 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31566 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=31505 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=31492 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31490 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31478 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31315 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31311 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=31293 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31285 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=30817 + + +File: python.info, Node: Library<48>, Next: Documentation<47>, Prev: Core and Builtins<48>, Up: Python 3 6 4 release candidate 1 + +1.21.52.2 Library +................. + + - bpo-28556(1): Two minor fixes for ‘typing’ module: allow shallow + copying instances of generic classes, improve interaction of + ‘__init_subclass__’ with generics. Original PRs by Ivan + Levkivskyi. + + - bpo-27240(2): The header folding algorithm for the new email + policies has been rewritten, which also fixes bpo-30788(3), + bpo-31831(4), and bpo-32182(5). In particular, RFC2231 folding is + now done correctly. + + - bpo-32186(6): 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. + + - bpo-12239(7): Make *note msilib.SummaryInformation.GetProperty(): + 1418. return ‘None’ when the value of property is ‘VT_EMPTY’. + Initial patch by Mark Mc Mahon. + + - bpo-31325(8): Fix wrong usage of *note collections.namedtuple(): + 538. in the *note RobotFileParser.parse(): 14e3. method. Initial + patch by Robin Wellner. + + - bpo-12382(9): *note msilib.OpenDatabase(): 1360. now raises a + better exception message when it couldn’t open or create an MSI + file. Initial patch by William Tisäter. + + - bpo-32110(10): ‘codecs.StreamReader.read(n)’ now returns not more + than `n' characters/bytes for non-negative `n'. This makes it + compatible with ‘read()’ methods of other file-like objects. + + - bpo-32072(11): 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. + + - bpo-32034(12): Make asyncio.IncompleteReadError and + LimitOverrunError pickleable. + + - bpo-32015(13): Fixed the looping of asyncio in the case of + reconnection the socket during waiting async read/write from/to the + socket. + + - bpo-32011(14): Restored support of loading marshal files with the + TYPE_INT64 code. These files can be produced in Python 2.7. + + - bpo-31970(15): Reduce performance overhead of asyncio debug mode. + + - bpo-9678(16): 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. + + - bpo-30057(17): Fix potential missed signal in signal.signal(). + + - bpo-31933(18): Fix Blake2 params leaf_size and node_offset on big + endian platforms. Patch by Jack O’Connor. + + - bpo-31927(19): 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. + + - bpo-27666(20): 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. + + - bpo-31897(21): plistlib now catches more errors when read binary + plists and raises InvalidFileException instead of unexpected + exceptions. + + - bpo-25720(22): Fix the method for checking pad state of curses + WINDOW. Patch by Masayuki Yamamoto. + + - bpo-31893(23): Fixed the layout of the kqueue_event structure on + OpenBSD and NetBSD. Fixed the comparison of the kqueue_event + objects. + + - bpo-31891(24): Fixed building the curses module on NetBSD. + + - bpo-28416(25): Instances of pickle.Pickler subclass with the + persistent_id() method and pickle.Unpickler subclass with the + persistent_load() method no longer create reference cycles. + + - bpo-28326(26): Fix multiprocessing.Process when stdout and/or + stderr is closed or None. + + - bpo-31457(27): If nested log adapters are used, the inner + ‘process()’ methods are no longer omitted. + + - bpo-31457(28): The ‘manager’ property on LoggerAdapter objects is + now properly settable. + + - bpo-31806(29): 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. + + - bpo-28603(30): 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. + + - bpo-30058(31): Fixed buffer overflow in select.kqueue.control(). + + - bpo-31770(32): Prevent a crash when calling the ‘__init__()’ method + of a ‘sqlite3.Cursor’ object more than once. Patch by Oren Milman. + + - bpo-31672(33): ‘idpattern’ in ‘string.Template’ matched some + non-ASCII characters. Now it uses ‘-i’ regular expression local + flag to avoid non-ASCII characters. + + - bpo-31764(34): Prevent a crash in ‘sqlite3.Cursor.close()’ in case + the ‘Cursor’ object is uninitialized. Patch by Oren Milman. + + - bpo-31752(35): Fix possible crash in timedelta constructor called + with custom integers. + + - bpo-31701(36): On Windows, faulthandler.enable() now ignores MSC + and COM exceptions. + + - bpo-31728(37): Prevent crashes in ‘_elementtree’ due to unsafe + cleanup of ‘Element.text’ and ‘Element.tail’. Patch by Oren + Milman. + + - bpo-31620(38): an empty asyncio.Queue now doesn’t leak memory when + queue.get pollers timeout + + - bpo-31632(39): Fix method set_protocol() of class + _SSLProtocolTransport in asyncio module. This method was + previously modifying a wrong reference to the protocol. + + - bpo-31675(40): Fixed memory leaks in Tkinter’s methods splitlist() + and split() when pass a string larger than 2 GiB. + + - bpo-31673(41): Fixed typo in the name of Tkinter’s method + adderrorinfo(). + + - bpo-30806(42): Fix the string representation of a netrc object. + + - bpo-15037(43): Added a workaround for getkey() in curses for + ncurses 5.7 and earlier. + + - bpo-25351(44): Avoid venv activate failures with undefined + variables + + - bpo-25532(45): 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. + + - bpo-30347(46): Stop crashes when concurrently iterate over + itertools.groupby() iterators. + + - bpo-31516(47): ‘threading.current_thread()’ should not return a + dummy thread at shutdown. + + - bpo-31351(48): python -m ensurepip now exits with non-zero exit + code if pip bootstrapping has failed. + + - bpo-31482(49): ‘random.seed()’ now works with bytes in version=1 + + - bpo-31334(50): Fix ‘poll.poll([timeout])’ in the ‘select’ module + for arbitrary negative timeouts on all OSes where it can only be a + non-negative integer or -1. Patch by Riccardo Coccioli. + + - bpo-31310(51): multiprocessing’s semaphore tracker should be + launched again if crashed. + + - bpo-31308(52): Make multiprocessing’s forkserver process immune to + Ctrl-C and other user interruptions. If it crashes, restart it + when necessary. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27240 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30788 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31831 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=32182 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=32186 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=12239 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31325 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=12382 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=32110 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=32072 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=32034 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=32015 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=32011 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31970 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=9678 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=30057 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31933 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31927 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=27666 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31897 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=25720 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31893 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=31891 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=28416 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=28326 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=31457 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=31457 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=31806 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=28603 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=30058 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=31770 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=31672 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=31764 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=31752 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=31701 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=31728 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=31620 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=31632 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=31675 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=31673 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=30806 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=15037 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=25351 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=25532 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=30347 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=31516 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=31351 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=31482 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=31334 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=31310 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=31308 + + +File: python.info, Node: Documentation<47>, Next: Tests<45>, Prev: Library<48>, Up: Python 3 6 4 release candidate 1 + +1.21.52.3 Documentation +....................... + + - bpo-32105(1): Added asyncio.BaseEventLoop.connect_accepted_socket + versionadded marker. + + - bpo-31537(2): Fix incorrect usage of ‘get_history_length’ in + readline documentation example code. Patch by Brad Smith. + + - bpo-30085(3): The operator functions without double underscores are + preferred for clarity. The one with underscores are only kept for + back-compatibility. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32105 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31537 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30085 + + +File: python.info, Node: Tests<45>, Next: Build<47>, Prev: Documentation<47>, Up: Python 3 6 4 release candidate 1 + +1.21.52.4 Tests +............... + + - bpo-31380(1): Skip test_httpservers test_undecodable_file on macOS: + fails on APFS. + + - bpo-31705(2): 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. + + - bpo-31174(3): 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. + + - bpo-30695(4): Add the ‘set_nomemory(start, stop)’ and + ‘remove_mem_hooks()’ functions to the _testcapi module. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31380 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31705 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31174 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30695 + + +File: python.info, Node: Build<47>, Next: Windows<43>, Prev: Tests<45>, Up: Python 3 6 4 release candidate 1 + +1.21.52.5 Build +............... + + - bpo-32059(1): ‘detect_modules()’ in ‘setup.py’ now also searches + the sysroot paths when cross-compiling. + + - bpo-31957(2): Fixes Windows SDK version detection when building for + Windows. + + - bpo-31609(3): Fixes quotes in PCbuild/clean.bat + + - bpo-31934(4): Abort the build when building out of a not clean + source tree. + + - bpo-31926(5): 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. + + - bpo-28791(6): Update Windows builds to use SQLite 3.21.0. + + - bpo-28791(7): Update OS X installer to use SQLite 3.21.0. + + - bpo-22140(8): Prevent double substitution of prefix in + python-config.sh. + + - bpo-31536(9): Avoid wholesale rebuild after ‘make regen-all’ if + nothing changed. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32059 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31957 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31609 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31934 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31926 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28791 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28791 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22140 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31536 + + +File: python.info, Node: Windows<43>, Next: macOS<32>, Prev: Build<47>, Up: Python 3 6 4 release candidate 1 + +1.21.52.6 Windows +................. + + - bpo-1102(1): Return ‘None’ when ‘View.Fetch()’ returns + ‘ERROR_NO_MORE_ITEMS’ instead of raising ‘MSIError’. Initial patch + by Anthony Tuininga. + + - bpo-31944(2): Fixes Modify button in Apps and Features dialog. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=1102 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31944 + + +File: python.info, Node: macOS<32>, Next: IDLE<36>, Prev: Windows<43>, Up: Python 3 6 4 release candidate 1 + +1.21.52.7 macOS +............... + + - bpo-31392(1): Update macOS installer to use OpenSSL 1.0.2m + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31392 + + +File: python.info, Node: IDLE<36>, Next: Tools/Demos<23>, Prev: macOS<32>, Up: Python 3 6 4 release candidate 1 + +1.21.52.8 IDLE +.............. + + - bpo-32207(1): 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. + + - bpo-32164(2): Delete unused file idlelib/tabbedpages.py. Use of + TabbedPageSet in configdialog was replaced by ttk.Notebook. + + - bpo-32100(3): IDLE: Fix old and new bugs in pathbrowser; improve + tests. Patch mostly by Cheryl Sabella. + + - bpo-31858(4): 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. + + - bpo-31860(5): The font sample in the IDLE configuration dialog is + now editable. Changes persist while IDLE remains open + + - bpo-31836(6): 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. + + - bpo-28603(7): Fix a TypeError that caused a shell restart when + printing a traceback that includes an exception that is unhashable. + Patch by Zane Bitter. + + - bpo-13802(8): 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. + + - bpo-31460(9): 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. + + - bpo-31649(10): IDLE - Make _htest, _utest parameters keyword only. + + - bpo-31559(11): Remove test order dependence in + idle_test.test_browser. + + - bpo-31459(12): 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 + <>, which appears on the Keys tab of the + Settings dialog, is not changed. Patch by Cheryl Sabella. + + - bpo-31500(13): Default fonts now are scaled on HiDPI displays. + + - bpo-1612262(14): IDLE module browser now shows nested classes and + functions. Original patches for code and tests by Guilherme Polo + and Cheryl Sabella, respectively. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32207 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=32164 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=32100 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31858 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31860 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31836 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28603 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=13802 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31460 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31649 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31559 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31459 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31500 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=1612262 + + +File: python.info, Node: Tools/Demos<23>, Next: C API<41>, Prev: IDLE<36>, Up: Python 3 6 4 release candidate 1 + +1.21.52.9 Tools/Demos +..................... + + - bpo-30722(1): Make redemo work with Python 3.6 and newer versions. + Also, remove the ‘LOCALE’ option since it doesn’t work with string + patterns in Python 3. Patch by Christoph Sarnowski. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30722 + + +File: python.info, Node: C API<41>, Prev: Tools/Demos<23>, Up: Python 3 6 4 release candidate 1 + +1.21.52.10 C API +................ + + - bpo-20891(1): 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. + + - bpo-31532(2): Fix memory corruption due to allocator mix in + getpath.c between Py_GetPath() and Py_SetPath() + + - bpo-30697(3): The ‘PyExc_RecursionErrorInst’ singleton is removed + and ‘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(4). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20891 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31532 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30697 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22898 + + +File: python.info, Node: Python 3 6 3 final, Next: Python 3 6 3 release candidate 1, Prev: Python 3 6 4 release candidate 1, Up: Changelog + +1.21.53 Python 3.6.3 final +-------------------------- + +`Release date: 2017-10-03' + +* Menu: + +* Library: Library<49>. +* Build: Build<48>. + + +File: python.info, Node: Library<49>, Next: Build<48>, Up: Python 3 6 3 final + +1.21.53.1 Library +................. + + - bpo-31641(1): Re-allow arbitrary iterables in *note + concurrent.futures.as_completed(): 152f. Fixes regression in + 3.6.3rc1. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31641 + + +File: python.info, Node: Build<48>, Prev: Library<49>, Up: Python 3 6 3 final + +1.21.53.2 Build +............... + + - bpo-31662(1): Fix typos in Windows ‘uploadrelease.bat’ script. Fix + Windows Doc build issues in ‘Doc/make.bat’. + + - bpo-31423(2): Fix building the PDF documentation with newer + versions of Sphinx. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31662 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31423 + + +File: python.info, Node: Python 3 6 3 release candidate 1, Next: Python 3 6 2 final, Prev: Python 3 6 3 final, Up: Changelog + +1.21.54 Python 3.6.3 release candidate 1 +---------------------------------------- + +`Release date: 2017-09-18' + +* Menu: + +* Security: Security<27>. +* Core and Builtins: Core and Builtins<49>. +* Library: Library<50>. +* Documentation: Documentation<48>. +* Tests: Tests<46>. +* Build: Build<49>. +* Windows: Windows<44>. +* IDLE: IDLE<37>. +* Tools/Demos: Tools/Demos<24>. + + +File: python.info, Node: Security<27>, Next: Core and Builtins<49>, Up: Python 3 6 3 release candidate 1 + +1.21.54.1 Security +.................. + + - bpo-29781(1): SSLObject.version() now correctly returns None when + handshake over BIO has not been performed yet. + + - bpo-30947(2): Upgrade libexpat embedded copy from version 2.2.1 to + 2.2.3 to get security fixes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29781 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30947 + + +File: python.info, Node: Core and Builtins<49>, Next: Library<50>, Prev: Security<27>, Up: Python 3 6 3 release candidate 1 + +1.21.54.2 Core and Builtins +........................... + + - bpo-31471(1): Fix an assertion failure in *note subprocess.Popen(): + 6e8. on Windows, in case the env argument has a bad keys() method. + Patch by Oren Milman. + + - bpo-31418(2): Fix an assertion failure in ‘PyErr_WriteUnraisable()’ + in case of an exception with a bad ‘__module__’ attribute. Patch + by Oren Milman. + + - bpo-31416(3): Fix assertion failures in case of a bad + warnings.filters or warnings.defaultaction. Patch by Oren Milman. + + - bpo-31411(4): Raise a TypeError instead of SystemError in case + warnings.onceregistry is not a dictionary. Patch by Oren Milman. + + - bpo-31373(5): Fix several possible instances of undefined behavior + due to floating-point demotions. + + - bpo-30465(6): Location information (‘lineno’ and ‘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). + + - bpo-31343(7): Include sys/sysmacros.h for major(), minor(), and + makedev(). GNU C libray plans to remove the functions from + sys/types.h. + + - bpo-31291(8): Fix an assertion failure in *note + zipimport.zipimporter.get_data: 14fb. on Windows, when the return + value of ‘pathname.replace('/','\\')’ isn’t a string. Patch by + Oren Milman. + + - bpo-31271(9): Fix an assertion failure in the write() method of + *note io.TextIOWrapper: 9ad, when the encoder doesn’t return a + bytes object. Patch by Oren Milman. + + - bpo-31243(10): Fix a crash in some methods of *note + io.TextIOWrapper: 9ad, when the decoder’s state is invalid. Patch + by Oren Milman. + + - bpo-30721(11): ‘print’ now shows correct usage hint for using + Python 2 redirection syntax. Patch by Sanyam Khurana. + + - bpo-31070(12): Fix a race condition in importlib + _get_module_lock(). + + - bpo-31095(13): Fix potential crash during GC caused by ‘tp_dealloc’ + which doesn’t call ‘PyObject_GC_UnTrack()’. + + - bpo-31071(14): Avoid masking original TypeError in call with * + unpacking when other arguments are passed. + + - bpo-30978(15): str.format_map() now passes key lookup exceptions + through. Previously any exception was replaced with a KeyError + exception. + + - bpo-30808(16): Use _Py_atomic API for concurrency-sensitive signal + state. + + - bpo-30876(17): 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. + + - bpo-30703(18): 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). + + - bpo-30765(19): Avoid blocking in pthread_mutex_lock() when + PyThread_acquire_lock() is asked not to block. + + - bpo-31161(20): Make sure the ‘Missing parentheses’ syntax error + message is only applied to SyntaxError, not to subclasses. Patch + by Martijn Pieters. + + - bpo-30814(21): Fixed a race condition when import a submodule from + a package. + + - bpo-30597(22): ‘print’ now shows expected input in custom error + message when used as a Python 2 statement. Patch by Sanyam + Khurana. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31471 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31418 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31416 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31411 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31373 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30465 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31343 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=31291 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31271 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31243 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=30721 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31070 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31095 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31071 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=30978 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=30808 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=30876 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=30703 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=30765 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31161 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=30814 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30597 + + +File: python.info, Node: Library<50>, Next: Documentation<48>, Prev: Core and Builtins<49>, Up: Python 3 6 3 release candidate 1 + +1.21.54.3 Library +................. + + - bpo-31499(1): xml.etree: Fix a crash when a parser is part of a + reference cycle. + + - bpo-28556(2): typing.get_type_hints now finds the right globalns + for classes and modules by default (when no ‘globalns’ was + specified by the caller). + + - bpo-28556(3): Speed improvements to the ‘typing’ module. Original + PRs by Ivan Levkivskyi and Mitar. + + - bpo-31544(4): The C accelerator module of ElementTree ignored + exceptions raised when looking up TreeBuilder target methods in + XMLParser(). + + - bpo-31234(5): socket.create_connection() now fixes manually a + reference cycle: clear the variable storing the last exception on + success. + + - bpo-31457(6): LoggerAdapter objects can now be nested. + + - bpo-31400(7): Improves SSL error handling to avoid losing error + numbers. + + - bpo-28958(8): ssl.SSLContext() now uses OpenSSL error information + when a context cannot be instantiated. + + - bpo-27340(9): 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. + + - bpo-31178(10): Fix string concatenation bug in rare error path in + the subprocess module + + - bpo-31350(11): Micro-optimize ‘asyncio._get_running_loop()’ to + become up to 10% faster. + + - bpo-31170(12): expat: Update libexpat from 2.2.3 to 2.2.4. Fix + copying of partial characters for UTF-8 input (libexpat bug 115): + ‘https://github.com/libexpat/libexpat/issues/115’ + + - bpo-29136(13): Add TLS 1.3 cipher suites and OP_NO_TLSv1_3. + + - bpo-29212(14): 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”. + + - bpo-9146(15): 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. + + - bpo-27144(16): The ‘map()’ and ‘as_completed()’ iterators in + ‘concurrent.futures’ now avoid keeping a reference to yielded + objects. + + - bpo-10746(17): Fix ctypes producing wrong PEP 3118(18) type codes + for integer types. + + - bpo-22536(19): The subprocess module now sets the filename when + FileNotFoundError is raised on POSIX systems due to the executable + or cwd not being found. + + - bpo-31249(20): concurrent.futures: WorkItem.run() used by + ThreadPoolExecutor now breaks a reference cycle between an + exception object and the WorkItem object. + + - bpo-31247(21): xmlrpc.server now explicitly breaks reference cycles + when using sys.exc_info() in code handling exceptions. + + - bpo-30102(22): 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. + + - bpo-31185(23): Fixed miscellaneous errors in asyncio speedup + module. + + - bpo-31135(24): 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. + + - bpo-31107(25): Fix ‘copyreg._slotnames()’ mangled attribute + calculation for classes whose name begins with an underscore. + Patch by Shane Harvey. + + - bpo-31061(26): Fixed a crash when using asyncio and threads. + + - bpo-30502(27): Fix handling of long oids in ssl. Based on patch by + Christian Heimes. + + - bpo-30119(28): ftplib.FTP.putline() now throws ValueError on + commands that contains CR or LF. Patch by Dong-hee Na. + + - bpo-30595(29): 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. + + - bpo-29403(30): Fix ‘unittest.mock’’s autospec to not fail on + method-bound builtin functions. Patch by Aaron Gallagher. + + - bpo-30961(31): Fix decrementing a borrowed reference in + tracemalloc. + + - bpo-25684(32): Change ‘ttk.OptionMenu’ radiobuttons to be unique + across instances of ‘OptionMenu’. + + - bpo-30886(33): 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. + + - bpo-29854(34): Fix segfault in readline when using readline’s + history-size option. Patch by Nir Soffer. + + - bpo-30319(35): socket.close() now ignores ECONNRESET error. + + - bpo-30828(36): Fix out of bounds write in + ‘asyncio.CFuture.remove_done_callback()’. + + - bpo-30807(37): 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. + + - bpo-30441(38): Fix bug when modifying os.environ while iterating + over it + + - bpo-30532(39): Fix email header value parser dropping folding white + space in certain cases. + + - bpo-30879(40): os.listdir() and os.scandir() now emit bytes names + when called with bytes-like argument. + + - bpo-30746(41): Prohibited the ‘=’ character in environment variable + names in ‘os.putenv()’ and ‘os.spawn*()’. + + - bpo-29755(42): Fixed the lgettext() family of functions in the + gettext module. They now always return bytes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31499 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31544 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31234 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31457 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31400 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28958 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=27340 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=31178 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31350 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31170 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=29136 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29212 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=9146 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=27144 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=10746 + + (18) https://peps.python.org/pep-3118/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=22536 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=31249 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31247 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30102 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31185 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=31135 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=31107 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=31061 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=30502 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=30119 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30595 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=29403 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=30961 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=25684 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=30886 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=29854 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=30319 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30828 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=30807 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=30441 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=30532 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=30879 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=30746 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=29755 + + +File: python.info, Node: Documentation<48>, Next: Tests<46>, Prev: Library<50>, Up: Python 3 6 3 release candidate 1 + +1.21.54.4 Documentation +....................... + + - bpo-31294(1): Fix incomplete code snippet in the + ZeroMQSocketListener and ZeroMQSocketHandler examples and adapt + them to Python 3. + + - bpo-21649(2): Add RFC 7525 and Mozilla server side TLS links to SSL + documentation. + + - bpo-30803(3): Clarify doc on truth value testing. Original patch + by Peter Thomassen. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31294 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21649 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30803 + + +File: python.info, Node: Tests<46>, Next: Build<49>, Prev: Documentation<48>, Up: Python 3 6 3 release candidate 1 + +1.21.54.5 Tests +............... + + - bpo-31320(1): Silence traceback in test_ssl + + - bpo-25674(2): Remove sha256.tbs-internet.com ssl test + + - bpo-30715(3): Address ALPN callback changes for OpenSSL 1.1.0f. + The latest version behaves like OpenSSL 1.0.2 and no longer aborts + handshake. + + - bpo-30822(4): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31320 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25674 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30715 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30822 + + +File: python.info, Node: Build<49>, Next: Windows<44>, Prev: Tests<46>, Up: Python 3 6 3 release candidate 1 + +1.21.54.6 Build +............... + + - bpo-30854(1): Fix compile error when compiling –without-threads. + Patch by Masayuki Yamamoto. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30854 + + +File: python.info, Node: Windows<44>, Next: IDLE<37>, Prev: Build<49>, Up: Python 3 6 3 release candidate 1 + +1.21.54.7 Windows +................. + + - bpo-30389(1): Adds detection of Visual Studio 2017 to distutils on + Windows. + + - bpo-31340(2): Change to building with MSVC v141 (included with + Visual Studio 2017) + + - bpo-30581(3): os.cpu_count() now returns the correct number of + processors on Windows when the number of logical processors is + greater than 64. + + - bpo-30731(4): Add a missing xmlns to python.manifest so that it + matches the schema. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30389 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31340 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30581 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30731 + + +File: python.info, Node: IDLE<37>, Next: Tools/Demos<24>, Prev: Windows<44>, Up: Python 3 6 3 release candidate 1 + +1.21.54.8 IDLE +.............. + + - bpo-31493(1): IDLE code context – fix code update and font update + timers. Canceling timers prevents a warning message when test_idle + completes. + + - bpo-31488(2): 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. + + - bpo-31477(3): IDLE - Improve rstrip entry in doc. Strip trailing + whitespace strips more than blank spaces. Multiline string + literals are not skipped. + + - bpo-31480(4): IDLE - make tests pass with zzdummy extension + disabled by default. + + - bpo-31421(5): 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. + + - bpo-31414(6): 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. + + - bpo-31051(7): Rearrange IDLE configdialog GenPage into Window, + Editor, and Help sections. + + - bpo-30617(8): 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. + + - bpo-31287(9): IDLE - Do not modify tkinter.message in + test_configdialog. + + - bpo-27099(10): 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 ‘<>’, ‘<>’, + ‘<>’, ‘<>’, + ‘<>’, ‘<>’, ‘<>’, and + ‘<>’. 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. + + - bpo-31206(11): IDLE: Factor HighPage(Frame) class from + ConfigDialog. Patch by Cheryl Sabella. + + - bpo-31001(12): Add tests for configdialog highlight tab. Patch by + Cheryl Sabella. + + - bpo-31205(13): IDLE: Factor KeysPage(Frame) class from + ConfigDialog. The slightly modified tests continue to pass. Patch + by Cheryl Sabella. + + - bpo-31130(14): IDLE – stop leaks in test_configdialog. Initial + patch by Victor Stinner. + + - bpo-31002(15): Add tests for configdialog keys tab. Patch by + Cheryl Sabella. + + - bpo-19903(16): IDLE: Calltips use *note inspect.signature: 301. + instead of *note inspect.getfullargspec: 302. This improves + calltips for builtins converted to use Argument Clinic. Patch by + Louie Lu. + + - bpo-31083(17): IDLE - Add an outline of a TabPage class in + configdialog. Update existing classes to match outline. Initial + patch by Cheryl Sabella. + + - bpo-31050(18): Factor GenPage(Frame) class from ConfigDialog. The + slightly modified tests continue to pass. Patch by Cheryl Sabella. + + - bpo-31004(19): IDLE - Factor FontPage(Frame) class from + ConfigDialog. Slightly modified tests continue to pass. Fix + General tests. Patch mostly by Cheryl Sabella. + + - bpo-30781(20): IDLE - Use ttk widgets in ConfigDialog. Patches by + Terry Jan Reedy and Cheryl Sabella. + + - bpo-31060(21): 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. + + - bpo-30853(22): 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%. + + - bpo-31003(23): IDLE: Add more tests for General tab. + + - bpo-30993(24): 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. + + - bpo-30981(25): IDLE – Add more configdialog font page tests. + + - bpo-28523(26): IDLE: replace ‘colour’ with ‘color’ in configdialog. + + - bpo-30917(27): Add tests for idlelib.config.IdleConf. Increase + coverage from 46% to 96%. Patch by Louie Lu. + + - bpo-30934(28): 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. + + - bpo-30913(29): 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. + + - bpo-30899(30): IDLE: Add tests for ConfigParser subclasses in + config. Patch by Louie Lu. + + - bpo-30881(31): IDLE: Add docstrings to browser.py. Patch by Cheryl + Sabella. + + - bpo-30851(32): IDLE: Remove unused variables in configdialog. One + is a duplicate, one is set but cannot be altered by users. Patch + by Cheryl Sabella. + + - bpo-30870(33): IDLE: In Settings dialog, select font with Up, Down + keys as well as mouse. Initial patch by Louie Lu. + + - bpo-8231(34): IDLE: call config.IdleConf.GetUserCfgDir only once. + + - bpo-30779(35): 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. + + - bpo-30777(36): IDLE: configdialog - Add docstrings and fix + comments. Patch by Cheryl Sabella. + + - bpo-30495(37): IDLE: Improve textview with docstrings, PEP8 names, + and more tests. Patch by Cheryl Sabella. + + - bpo-30723(38): 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. + + - bpo-30674(39): IDLE: add docstrings to grep module. Patch by + Cheryl Sabella + + - bpo-21519(40): IDLE’s basic custom key entry dialog now detects + duplicates properly. Original patch by Saimadhav Heblikar. + + - bpo-29910(41): IDLE no longer deletes a character after commenting + out a region by a key shortcut. Add ‘return 'break'’ for this and + other potential conflicts between IDLE and default key bindings. + + - bpo-30728(42): Review and change idlelib.configdialog names. + Lowercase method and attribute names. Replace ‘colour’ with + ‘color’, expand overly cryptic names, delete unneeded underscores. + Replace ‘import *’ with specific imports. Patches by Cheryl + Sabella. + + - bpo-6739(43): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31493 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31488 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=31477 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=31480 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=31421 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=31414 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=31051 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30617 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=31287 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27099 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=31206 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=31001 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=31205 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=31130 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=31002 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=19903 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=31083 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=31050 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=31004 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=30781 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=31060 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30853 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=31003 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=30993 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=30981 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=28523 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=30917 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=30934 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30913 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=30899 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=30881 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=30851 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=30870 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=8231 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=30779 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30777 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=30495 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=30723 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=30674 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=21519 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=29910 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=30728 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=6739 + + +File: python.info, Node: Tools/Demos<24>, Prev: IDLE<37>, Up: Python 3 6 3 release candidate 1 + +1.21.54.9 Tools/Demos +..................... + + - bpo-30983(1): gdb integration commands (py-bt, etc.) work on + optimized shared builds now, too. PEP 523(2) 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30983 + + (2) https://peps.python.org/pep-0523/ + + +File: python.info, Node: Python 3 6 2 final, Next: Python 3 6 2 release candidate 2, Prev: Python 3 6 3 release candidate 1, Up: Changelog + +1.21.55 Python 3.6.2 final +-------------------------- + +`Release date: 2017-07-17' + +No changes since release candidate 2 + + +File: python.info, Node: Python 3 6 2 release candidate 2, Next: Python 3 6 2 release candidate 1, Prev: Python 3 6 2 final, Up: Changelog + +1.21.56 Python 3.6.2 release candidate 2 +---------------------------------------- + +`Release date: 2017-07-07' + +* Menu: + +* Security: Security<28>. + + +File: python.info, Node: Security<28>, Up: Python 3 6 2 release candidate 2 + +1.21.56.1 Security +.................. + + - bpo-30730(1): Prevent environment variables injection in subprocess + on Windows. Prevent passing other environment variables and + command arguments. + + - bpo-30694(2): Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes + of multiple security vulnerabilities including: CVE-2017-9233 + (External entity infinite loop DoS), CVE-2016-9063 (Integer + overflow, re-fix), CVE-2016-0718 (Fix regression bugs from 2.2.0’s + fix to CVE-2016-0718) and CVE-2012-0876 (Counter hash flooding with + SipHash). Note: the 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 + ‘XML_SetHashSalt()’. + + - bpo-30500(3): Fix urllib.parse.splithost() to correctly parse + fragments. For example, ‘splithost('//127.0.0.1#@evil.com/')’ now + correctly returns the ‘127.0.0.1’ host, instead of treating + ‘@evil.com’ as the host in an authentication (‘login@host’). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30730 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30694 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30500 + + +File: python.info, Node: Python 3 6 2 release candidate 1, Next: Python 3 6 1 final, Prev: Python 3 6 2 release candidate 2, Up: Changelog + +1.21.57 Python 3.6.2 release candidate 1 +---------------------------------------- + +`Release date: 2017-06-17' + +* Menu: + +* Security: Security<29>. +* Core and Builtins: Core and Builtins<50>. +* Library: Library<51>. +* IDLE: IDLE<38>. +* C API: C API<42>. +* Build: Build<50>. +* Documentation: Documentation<49>. +* Tools/Demos: Tools/Demos<25>. +* Tests: Tests<47>. +* Windows: Windows<45>. + + +File: python.info, Node: Security<29>, Next: Core and Builtins<50>, Up: Python 3 6 2 release candidate 1 + +1.21.57.1 Security +.................. + + - bpo-29591(1): Update expat copy from 2.1.1 to 2.2.0 to get fixes of + CVE-2016-0718 and CVE-2016-4472. See + ‘https://sourceforge.net/p/expat/bugs/537/’ for more information. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29591 + + +File: python.info, Node: Core and Builtins<50>, Next: Library<51>, Prev: Security<29>, Up: Python 3 6 2 release candidate 1 + +1.21.57.2 Core and Builtins +........................... + + - bpo-30682(1): Removed a too-strict assertion that failed for + certain f-strings, such as eval(“f’\n’”) and eval(“f’\r’”). + + - bpo-30604(2): Move co_extra_freefuncs to not be per-thread to avoid + crashes + + - bpo-29104(3): Fixed parsing backslashes in f-strings. + + - bpo-27945(4): Fixed various segfaults with dict when input + collections are mutated during searching, inserting or comparing. + Based on patches by Duane Griffin and Tim Mitchell. + + - bpo-25794(5): Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + + - bpo-30039(6): 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. + + - bpo-12414(7): sys.getsizeof() on a code object now returns the + sizes which includes the code struct and sizes of objects which it + references. Patch by Dong-hee Na. + + - bpo-29949(8): Fix memory usage regression of set and frozenset + object. + + - bpo-29935(9): Fixed error messages in the index() method of tuple, + list and deque when pass indices of wrong type. + + - bpo-29859(10): Show correct error messages when any of the + pthread_* calls in thread_pthread.h fails. + + - bpo-28876(11): ‘bool(range)’ works even if ‘len(range)’ raises + *note OverflowError: 4a4. + + - bpo-29600(12): Fix wrapping coroutine return values in + StopIteration. + + - bpo-28856(13): Fix an oversight that %b format for bytes should + support objects follow the buffer protocol. + + - bpo-29714(14): Fix a regression that bytes format may fail when + containing zero bytes inside. + + - bpo-29478(15): If max_line_length=None is specified while using the + Compat32 policy, it is no longer ignored. Patch by Mircea Cosbuc. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30682 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30604 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29104 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27945 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25794 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30039 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=12414 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29949 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=29935 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=29859 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28876 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=29600 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28856 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29714 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=29478 + + +File: python.info, Node: Library<51>, Next: IDLE<38>, Prev: Core and Builtins<50>, Up: Python 3 6 2 release candidate 1 + +1.21.57.3 Library +................. + + - bpo-30616(1): Functional API of enum allows to create empty enums. + Patched by Dong-hee Na + + - bpo-30038(2): Fix race condition between signal delivery and wakeup + file descriptor. Patch by Nathaniel Smith. + + - bpo-23894(3): lib2to3 now recognizes ‘rb'...'’ and ‘f'...'’ + strings. + + - bpo-23890(4): unittest.TestCase.assertRaises() now manually breaks + a reference cycle to not keep objects alive longer than expected. + + - bpo-30149(5): inspect.signature() now supports callables with + variable-argument parameters wrapped with partialmethod. Patch by + Dong-hee Na. + + - bpo-30645(6): Fix path calculation in imp.load_package(), fixing it + for cases when a package is only shipped with bytecodes. Patch by + Alexandru Ardelean. + + - bpo-29931(7): Fixed comparison check for ipaddress.ip_interface + objects. Patch by Sanjay Sundaresan. + + - bpo-30605(8): re.compile() no longer raises a BytesWarning when + compiling a bytes instance with misplaced inline modifier. Patch + by Roy Williams. + + - bpo-24484(9): Avoid race condition in multiprocessing cleanup + (#2159) + + - bpo-28994(10): The traceback no longer displayed for SystemExit + raised in a callback registered by atexit. + + - bpo-30508(11): Don’t log exceptions if Task/Future “cancel()” + method was called. + + - bpo-28556(12): Updates to typing module: Add generic + AsyncContextManager, add support for ContextManager on all + versions. Original PRs by Jelle Zijlstra and Ivan Levkivskyi + + - bpo-29870(13): Fix ssl sockets leaks when connection is aborted in + asyncio/ssl implementation. Patch by Michaël Sghaïer. + + - bpo-29743(14): Closing transport during handshake process leaks + open socket. Patch by Nikolay Kim + + - bpo-27585(15): Fix waiter cancellation in asyncio.Lock. Patch by + Mathieu Sornay. + + - bpo-30418(16): On Windows, subprocess.Popen.communicate() now also + ignore EINVAL on stdin.write() if the child process is still + running but closed the pipe. + + - bpo-29822(17): inspect.isabstract() now works during + __init_subclass__. Patch by Nate Soares. + + - bpo-29581(18): ABCMeta.__new__ now accepts ‘**kwargs’, allowing + abstract base classes to use keyword parameters in + __init_subclass__. Patch by Nate Soares. + + - bpo-30557(19): faulthandler now correctly filters and displays + exception codes on Windows + + - bpo-30378(20): Fix the problem that logging.handlers.SysLogHandler + cannot handle IPv6 addresses. + + - bpo-29960(21): Preserve generator state when + _random.Random.setstate() raises an exception. Patch by Bryan + Olson. + + - bpo-30414(22): multiprocessing.Queue._feed background running + thread do not break from main loop on exception. + + - bpo-30003(23): Fix handling escape characters in HZ codec. Based + on patch by Ma Lin. + + - bpo-30301(24): Fix AttributeError when using SimpleQueue.empty() + under `spawn' and `forkserver' start methods. + + - bpo-30329(25): 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. + + - bpo-30375(26): 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. + + - bpo-30048(27): Fixed ‘Task.cancel()’ can be ignored when the task + is running coroutine and the coroutine returned without any more + ‘await’. + + - bpo-30266(28): contextlib.AbstractContextManager now supports + anti-registration by setting __enter__ = None or __exit__ = None, + following the pattern introduced in bpo-25958(29). Patch by Jelle + Zijlstra. + + - bpo-30298(30): Weaken the condition of deprecation warnings for + inline modifiers. Now allowed several subsequential inline + modifiers at the start of the pattern (e.g. ‘'(?i)(?s)...'’). In + verbose mode whitespaces and comments now are allowed before and + between inline modifiers (e.g. ‘'(?x) (?i) (?s)...'’). + + - bpo-29990(31): Fix range checking in GB18030 decoder. Original + patch by Ma Lin. + + - bpo-26293(32): Change resulted because of zipfile breakage. (See + also: bpo-29094(33)) + + - bpo-30243(34): 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. + + - bpo-30185(35): Avoid KeyboardInterrupt tracebacks in forkserver + helper process when Ctrl-C is received. + + - bpo-28556(36): Various updates to typing module: add + typing.NoReturn type, use WrapperDescriptorType, minor bug-fixes. + Original PRs by Jim Fasarakis-Hilliard and Ivan Levkivskyi. + + - bpo-30205(37): Fix getsockname() for unbound AF_UNIX sockets on + Linux. + + - bpo-30070(38): Fixed leaks and crashes in errors handling in the + parser module. + + - bpo-30061(39): 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(). + + - bpo-30017(40): Allowed calling the close() method of the zip entry + writer object multiple times. Writing to a closed writer now + always produces a ValueError. + + - bpo-30068(41): _io._IOBase.readlines will check if it’s closed + first when hint is present. + + - bpo-29694(42): Fixed race condition in pathlib mkdir with flags + parents=True. Patch by Armin Rigo. + + - bpo-29692(43): Fixed arbitrary unchaining of RuntimeError + exceptions in contextlib.contextmanager. Patch by Siddharth + Velankar. + + - bpo-29998(44): Pickling and copying ImportError now preserves name + and path attributes. + + - bpo-29953(45): Fixed memory leaks in the replace() method of + datetime and time objects when pass out of bound fold argument. + + - bpo-29942(46): Fix a crash in itertools.chain.from_iterable when + encountering long runs of empty iterables. + + - bpo-27863(47): Fixed multiple crashes in ElementTree caused by race + conditions and wrong types. + + - bpo-28699(48): 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. + + - bpo-25803(49): Avoid incorrect errors raised by + Path.mkdir(exist_ok=True) when the OS gives priority to errors such + as EACCES over EEXIST. + + - bpo-29861(50): Release references to tasks, their arguments and + their results as soon as they are finished in multiprocessing.Pool. + + - bpo-29884(51): faulthandler: Restore the old sigaltstack during + teardown. Patch by Christophe Zeitouny. + + - bpo-25455(52): Fixed crashes in repr of recursive buffered + file-like objects. + + - bpo-29800(53): Fix crashes in partial.__repr__ if the keys of + partial.keywords are not strings. Patch by Michael Seifert. + + - bpo-29742(54): get_extra_info() raises exception if get called on + closed ssl transport. Patch by Nikolay Kim. + + - bpo-8256(55): Fixed possible failing or crashing input() if + attributes “encoding” or “errors” of sys.stdin or sys.stdout are + not set or are not strings. + + - bpo-28298(56): Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from + accepting big intables (objects that have __int__) as elements. + Patch by Oren Milman. + + - bpo-28231(57): The zipfile module now accepts path-like objects for + external paths. + + - bpo-26915(58): index() and count() methods of + collections.abc.Sequence now check identity before checking + equality when do comparisons. + + - bpo-29615(59): SimpleXMLRPCDispatcher no longer chains KeyError (or + any other exception) to exception(s) raised in the dispatched + methods. Patch by Petr Motejlek. + + - bpo-30177(60): path.resolve(strict=False) no longer cuts the path + after the first element not present in the filesystem. Patch by + Antoine Pietri. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30616 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30038 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23894 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23890 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30149 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30645 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29931 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30605 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24484 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28994 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=30508 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=29870 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29743 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=27585 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=30418 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=29822 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=29581 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=30557 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=30378 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=29960 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=30414 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=30003 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=30301 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=30329 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=30375 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=30048 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=30266 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=25958 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=30298 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=29990 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=26293 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=29094 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=30243 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=30185 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=30205 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=30070 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=30061 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=30017 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=30068 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=29694 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=29692 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=29998 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=29953 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=29942 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=27863 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=28699 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=25803 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=29861 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=29884 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=25455 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=29800 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=29742 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=8256 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=28298 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=28231 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=26915 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=29615 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=30177 + + +File: python.info, Node: IDLE<38>, Next: C API<42>, Prev: Library<51>, Up: Python 3 6 2 release candidate 1 + +1.21.57.4 IDLE +.............. + + - bpo-15786(1): 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. + + - bpo-25514(2): Add doc subsubsection about IDLE failure to start. + Popup no-connection message directs users to this section. + + - bpo-30642(3): Fix reference leaks in IDLE tests. Patches by Louie + Lu and Terry Jan Reedy. + + - bpo-30495(4): Add docstrings for textview.py and use PEP8 names. + Patches by Cheryl Sabella and Terry Jan Reedy. + + - bpo-30290(5): Help-about: use pep8 names and add tests. Increase + coverage to 100%. Patches by Louie Lu, Cheryl Sabella, and Terry + Jan Reedy. + + - bpo-30303(6): Add _utest option to textview; add new tests. + Increase coverage to 100%. Patches by Louie Lu and Terry Jan + Reedy. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15786 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25514 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30642 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30495 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30290 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30303 + + +File: python.info, Node: C API<42>, Next: Build<50>, Prev: IDLE<38>, Up: Python 3 6 2 release candidate 1 + +1.21.57.5 C API +............... + + - bpo-27867(1): Function PySlice_GetIndicesEx() no longer replaced + with a macro if Py_LIMITED_API is not set. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27867 + + +File: python.info, Node: Build<50>, Next: Documentation<49>, Prev: C API<42>, Up: Python 3 6 2 release candidate 1 + +1.21.57.6 Build +............... + + - bpo-29941(1): Add ‘--with-assertions’ configure flag to explicitly + enable C ‘assert()’ checks. Defaults to off. ‘--with-pydebug’ + implies ‘--with-assertions’. + + - bpo-28787(2): Fix out-of-tree builds of Python when configured with + ‘--with--dtrace’. + + - bpo-29243(3): Prevent unnecessary rebuilding of Python during ‘make + test’, ‘make install’ and some other make targets when configured + with ‘--enable-optimizations’. + + - bpo-23404(4): Don’t regenerate generated files based on file + modification time anymore: the action is now explicit. Replace + ‘make touch’ with ‘make regen-all’. + + - bpo-29643(5): Fix ‘--enable-optimization’ didn’t work. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29941 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28787 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29243 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29643 + + +File: python.info, Node: Documentation<49>, Next: Tools/Demos<25>, Prev: Build<50>, Up: Python 3 6 2 release candidate 1 + +1.21.57.7 Documentation +....................... + + - bpo-30176(1): Add missing attribute related constants in curses + documentation. + + - bpo-30052(2): the link targets for *note bytes(): 1b4. and *note + bytearray(): 1a5. are now their respective type definitions, rather + than the corresponding builtin function entries. Use *note bytes: + 14fe. and *note bytearray: 14ff. 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. + + - bpo-26985(3): Add missing info of code object in inspect + documentation. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30176 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30052 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26985 + + +File: python.info, Node: Tools/Demos<25>, Next: Tests<47>, Prev: Documentation<49>, Up: Python 3 6 2 release candidate 1 + +1.21.57.8 Tools/Demos +..................... + + - bpo-29367(1): python-gdb.py now supports also ‘method-wrapper’ + (‘wrapperobject’) objects. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29367 + + +File: python.info, Node: Tests<47>, Next: Windows<45>, Prev: Tools/Demos<25>, Up: Python 3 6 2 release candidate 1 + +1.21.57.9 Tests +............... + + - bpo-30357(1): 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. + + - bpo-30197(2): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30357 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30197 + + +File: python.info, Node: Windows<45>, Prev: Tests<47>, Up: Python 3 6 2 release candidate 1 + +1.21.57.10 Windows +.................. + + - bpo-30687(1): Locate msbuild.exe on Windows when building rather + than vcvarsall.bat + + - bpo-30450(2): 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 ‘py -3.6’), + NuGet is used to download a copy of 32-bit Python. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30687 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30450 + + +File: python.info, Node: Python 3 6 1 final, Next: Python 3 6 1 release candidate 1, Prev: Python 3 6 2 release candidate 1, Up: Changelog + +1.21.58 Python 3.6.1 final +-------------------------- + +`Release date: 2017-03-21' + +* Menu: + +* Core and Builtins: Core and Builtins<51>. +* Build: Build<51>. + + +File: python.info, Node: Core and Builtins<51>, Next: Build<51>, Up: Python 3 6 1 final + +1.21.58.1 Core and Builtins +........................... + + - bpo-29723(1): The ‘sys.path[0]’ initialization change for + bpo-29139(2) caused a regression by revealing an inconsistency in + how sys.path is initialized when executing ‘__main__’ from a + zipfile, directory, or other import location. The interpreter now + consistently avoids ever adding the import location’s parent + directory to ‘sys.path’, and ensures no other ‘sys.path’ entries + are inadvertently modified when inserting the import location named + on the command line. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29723 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29139 + + +File: python.info, Node: Build<51>, Prev: Core and Builtins<51>, Up: Python 3 6 1 final + +1.21.58.2 Build +............... + + - bpo-27593(1): fix format of git information used in sys.version + + - Fix incompatible comment in python.h + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27593 + + +File: python.info, Node: Python 3 6 1 release candidate 1, Next: Python 3 6 0 final, Prev: Python 3 6 1 final, Up: Changelog + +1.21.59 Python 3.6.1 release candidate 1 +---------------------------------------- + +`Release date: 2017-03-04' + +* Menu: + +* Core and Builtins: Core and Builtins<52>. +* Library: Library<52>. +* IDLE: IDLE<39>. +* Windows: Windows<46>. +* C API: C API<43>. +* Documentation: Documentation<50>. +* Tests: Tests<48>. +* Build: Build<52>. + + +File: python.info, Node: Core and Builtins<52>, Next: Library<52>, Up: Python 3 6 1 release candidate 1 + +1.21.59.1 Core and Builtins +........................... + + - bpo-28893(1): Set correct __cause__ for errors about invalid + awaitables returned from __aiter__ and __anext__. + + - bpo-29683(2): Fixes to memory allocation in _PyCode_SetExtra. + Patch by Brian Coleman. + + - bpo-29684(3): 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. + + - bpo-28598(4): Support __rmod__ for subclasses of str being called + before str.__mod__. Patch by Martijn Pieters. + + - bpo-29607(5): Fix stack_effect computation for CALL_FUNCTION_EX. + Patch by Matthieu Dartiailh. + + - bpo-29602(6): Fix incorrect handling of signed zeros in complex + constructor for complex subclasses and for inputs having a + __complex__ method. Patch by Serhiy Storchaka. + + - bpo-29347(7): Fixed possibly dereferencing undefined pointers when + creating weakref objects. + + - bpo-29438(8): Fixed use-after-free problem in key sharing dict. + + - bpo-29319(9): Prevent RunMainFromImporter overwriting sys.path[0]. + + - bpo-29337(10): Fixed possible BytesWarning when compare the code + objects. Warnings could be emitted at compile time. + + - bpo-29327(11): Fixed a crash when pass the iterable keyword + argument to sorted(). + + - bpo-29034(12): Fix memory leak and use-after-free in os module + (path_converter). + + - bpo-29159(13): Fix regression in bytes(x) when x.__index__() raises + Exception. + + - bpo-28932(14): Do not include if it does not exist. + + - bpo-25677(15): Correct the positioning of the syntax error caret + for indented blocks. Based on patch by Michael Layzell. + + - bpo-29000(16): Fixed bytes formatting of octals with zero padding + in alternate form. + + - bpo-26919(17): 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. + + - bpo-28991(18): functools.lru_cache() was susceptible to an obscure + reentrancy bug triggerable by a monkey-patched len() function. + + - bpo-28739(19): f-string expressions are no longer accepted as + docstrings and by ast.literal_eval() even if they do not include + expressions. + + - bpo-28512(20): Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + + - bpo-28918(21): Fix the cross compilation of xxlimited when Python + has been built with Py_DEBUG defined. + + - bpo-28731(22): Optimize _PyDict_NewPresized() to create correct + size dict. Improve speed of dict literal with constant keys up to + 30%. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28893 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29683 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29684 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28598 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29607 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29602 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29347 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29438 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=29319 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=29337 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=29327 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=29034 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=29159 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28932 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=25677 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=29000 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=26919 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28991 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=28739 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=28512 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28918 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28731 + + +File: python.info, Node: Library<52>, Next: IDLE<39>, Prev: Core and Builtins<52>, Up: Python 3 6 1 release candidate 1 + +1.21.59.2 Library +................. + + - bpo-29169(1): Update zlib to 1.2.11. + + - bpo-29623(2): Allow use of path-like object as a single argument in + ConfigParser.read(). Patch by David Ellis. + + - bpo-28963(3): Fix out of bound iteration in + asyncio.Future.remove_done_callback implemented in C. + + - bpo-29704(4): asyncio.subprocess.SubprocessStreamProtocol no longer + closes before all pipes are closed. + + - bpo-29271(5): Fix Task.current_task and Task.all_tasks implemented + in C to accept None argument as their pure Python implementation. + + - bpo-29703(6): Fix asyncio to support instantiation of new event + loops in child processes. + + - bpo-29376(7): Fix assertion error in + threading._DummyThread.is_alive(). + + - bpo-28624(8): Add a test that checks that cwd parameter of Popen() + accepts PathLike objects. Patch by Sayan Chowdhury. + + - bpo-28518(9): Start a transaction implicitly before a DML + statement. Patch by Aviv Palivoda. + + - bpo-29532(10): Altering a kwarg dictionary passed to + functools.partial() no longer affects a partial object after + creation. + + - bpo-29110(11): 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. + + - bpo-28556(12): 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. + + - bpo-29100(13): Fix datetime.fromtimestamp() regression introduced + in Python 3.6.0: check minimum and maximum years. + + - bpo-29519(14): Fix weakref spewing exceptions during interpreter + shutdown when used with a rare combination of multiprocessing and + custom codecs. + + - bpo-29416(15): Prevent infinite loop in pathlib.Path.mkdir + + - bpo-29444(16): Fixed out-of-bounds buffer access in the group() + method of the match object. Based on patch by WGH. + + - bpo-29335(17): Fix subprocess.Popen.wait() when the child process + has exited to a stopped instead of terminated state (ex: when under + ptrace). + + - bpo-29290(18): Fix a regression in argparse that help messages + would wrap at non-breaking spaces. + + - bpo-28735(19): Fixed the comparison of mock.MagickMock with + mock.ANY. + + - bpo-29316(20): Restore the provisional status of typing module, add + corresponding note to documentation. Patch by Ivan L. + + - bpo-29219(21): Fixed infinite recursion in the repr of + uninitialized ctypes.CDLL instances. + + - bpo-29011(22): Fix an important omission by adding Deque to the + typing module. + + - bpo-28969(23): 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. + + - bpo-29142(24): 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. + + - bpo-28961(25): Fix unittest.mock._Call helper: don’t ignore the + name parameter anymore. Patch written by Jiajun Huang. + + - bpo-29203(26): functools.lru_cache() now respects PEP 468(27) 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. + + - bpo-15812(28): inspect.getframeinfo() now correctly shows the first + line of a context. Patch by Sam Breese. + + - bpo-29094(29): Offsets in a ZIP file created with extern file + object and modes “w” and “x” now are relative to the start of the + file. + + - bpo-29085(30): Allow random.Random.seed() to use high quality OS + randomness rather than the pid and time. + + - bpo-29061(31): Fixed bug in secrets.randbelow() which would hang + when given a negative input. Patch by Brendan Donegan. + + - bpo-29079(32): Prevent infinite loop in pathlib.resolve() on + Windows + + - bpo-13051(33): Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + + - bpo-29119(34): Fix weakrefs in the pure python version of + collections.OrderedDict move_to_end() method. Contributed by Andra + Bogildea. + + - bpo-9770(35): curses.ascii predicates now work correctly with + negative integers. + + - bpo-28427(36): old keys should not remove new values from + WeakValueDictionary when collecting from another thread. + + - bpo-28923(37): Remove editor artifacts from Tix.py. + + - bpo-29055(38): Neaten-up empty population error on random.choice() + by suppressing the upstream exception. + + - bpo-28871(39): Fixed a crash when deallocate deep ElementTree. + + - bpo-19542(40): Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another + thread. + + - bpo-20191(41): Fixed a crash in resource.prlimit() when passing a + sequence that doesn’t own its elements as limits. + + - bpo-28779(42): multiprocessing.set_forkserver_preload() would crash + the forkserver process if a preloaded module instantiated some + multiprocessing objects such as locks. + + - bpo-28847(43): dbm.dumb now supports reading read-only files and no + longer writes the index file when it is not changed. + + - bpo-26937(44): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29169 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29623 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28963 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29704 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29271 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29703 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29376 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28624 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28518 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=29532 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=29110 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=29100 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29519 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=29416 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=29444 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=29335 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=29290 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=28735 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=29316 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=29219 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=29011 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=28969 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=29142 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=28961 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=29203 + + (27) https://peps.python.org/pep-0468/ + + (28) https://bugs.python.org/issue?@action=redirect&bpo=15812 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=29094 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=29085 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=29061 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=29079 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=13051 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=29119 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=9770 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=28427 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=28923 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=29055 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=28871 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=19542 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=20191 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=28779 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=28847 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=26937 + + +File: python.info, Node: IDLE<39>, Next: Windows<46>, Prev: Library<52>, Up: Python 3 6 1 release candidate 1 + +1.21.59.3 IDLE +.............. + + - bpo-29071(1): IDLE colors f-string prefixes (but not invalid ur + prefixes). + + - bpo-28572(2): Add 10% to coverage of IDLE’s test_configdialog. + Update and augment description of the configuration system. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29071 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28572 + + +File: python.info, Node: Windows<46>, Next: C API<43>, Prev: IDLE<39>, Up: Python 3 6 1 release candidate 1 + +1.21.59.4 Windows +................. + + - bpo-29579(1): Removes readme.txt from the installer + + - bpo-29326(2): Ignores blank lines in ._pth files (Patch by Alexey + Izbyshev) + + - bpo-28164(3): Correctly handle special console filenames (patch by + Eryk Sun) + + - bpo-29409(4): Implement PEP 529(5) for io.FileIO (Patch by Eryk + Sun) + + - bpo-29392(6): Prevent crash when passing invalid arguments into + msvcrt module. + + - bpo-25778(7): winreg does not truncate string correctly (Patch by + Eryk Sun) + + - bpo-28896(8): Deprecate WindowsRegistryFinder and disable it by + default. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29579 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29326 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28164 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29409 + + (5) https://peps.python.org/pep-0529/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29392 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=25778 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28896 + + +File: python.info, Node: C API<43>, Next: Documentation<50>, Prev: Windows<46>, Up: Python 3 6 1 release candidate 1 + +1.21.59.5 C API +............... + + - bpo-27867(1): 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. + + - bpo-29083(2): 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. + + - bpo-29058(3): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27867 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29083 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29058 + + +File: python.info, Node: Documentation<50>, Next: Tests<48>, Prev: C API<43>, Up: Python 3 6 1 release candidate 1 + +1.21.59.6 Documentation +....................... + + - bpo-28929(1): Link the documentation to its source file on GitHub. + + - bpo-25008(2): Document smtpd.py as effectively deprecated and add a + pointer to aiosmtpd, a third-party asyncio-based replacement. + + - bpo-26355(3): Add canonical header link on each page to + corresponding major version of the documentation. Patch by + Matthias Bussonnier. + + - bpo-29349(4): Fix Python 2 syntax in code for building the + documentation. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28929 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25008 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26355 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29349 + + +File: python.info, Node: Tests<48>, Next: Build<52>, Prev: Documentation<50>, Up: Python 3 6 1 release candidate 1 + +1.21.59.7 Tests +............... + + - bpo-28087(1): 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. + + - bpo-29571(2): to match the behaviour of the ‘re.LOCALE’ flag, + test_re.test_locale_flag now uses + ‘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) + + - bpo-28950(3): Disallow -j0 to be combined with -T/-l in regrtest + command line arguments. + + - bpo-28683(4): Fix the tests that bind() a unix socket and raise + PermissionError on Android for a non-root user. + + - bpo-26939(5): Add the support.setswitchinterval() function to fix + test_functools hanging on the Android armv7 qemu emulator. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28087 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29571 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28950 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28683 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26939 + + +File: python.info, Node: Build<52>, Prev: Tests<48>, Up: Python 3 6 1 release candidate 1 + +1.21.59.8 Build +............... + + - bpo-27593(1): 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. + + - bpo-29572(2): Update Windows build and OS X installers to use + OpenSSL 1.0.2k. + + - bpo-26851(3): Set Android compilation and link flags. + + - bpo-28768(4): Fix implicit declaration of function _setmode. Patch + by Masayuki Yamamoto + + - bpo-29080(5): Removes hard dependency on hg.exe from + PCBuild/build.bat + + - bpo-23903(6): Added missed names to PC/python3.def. + + - bpo-28762(7): lockf() is available on Android API level 24, but the + F_LOCK macro is not defined in android-ndk-r13. + + - bpo-28538(8): Fix the compilation error that occurs because + if_nameindex() is available on Android API level 24, but the + if_nameindex structure is not defined. + + - bpo-20211(9): 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. + + - bpo-28849(10): Do not define sys.implementation._multiarch on + Android. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27593 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29572 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26851 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28768 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29080 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23903 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28762 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28538 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=20211 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28849 + + +File: python.info, Node: Python 3 6 0 final, Next: Python 3 6 0 release candidate 2, Prev: Python 3 6 1 release candidate 1, Up: Changelog + +1.21.60 Python 3.6.0 final +-------------------------- + +`Release date: 2016-12-23' + +No changes since release candidate 2 + + +File: python.info, Node: Python 3 6 0 release candidate 2, Next: Python 3 6 0 release candidate 1, Prev: Python 3 6 0 final, Up: Changelog + +1.21.61 Python 3.6.0 release candidate 2 +---------------------------------------- + +`Release date: 2016-12-16' + +* Menu: + +* Core and Builtins: Core and Builtins<53>. +* Tools/Demos: Tools/Demos<26>. +* Windows: Windows<47>. +* Build: Build<53>. + + +File: python.info, Node: Core and Builtins<53>, Next: Tools/Demos<26>, Up: Python 3 6 0 release candidate 2 + +1.21.61.1 Core and Builtins +........................... + + - bpo-28147(1): Fix a memory leak in split-table dictionaries: + setattr() must not convert combined table into split table. Patch + written by INADA Naoki. + + - bpo-28990(2): Fix asyncio SSL hanging if connection is closed + before handshake is completed. (Patch by HoHo-Ho) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28147 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28990 + + +File: python.info, Node: Tools/Demos<26>, Next: Windows<47>, Prev: Core and Builtins<53>, Up: Python 3 6 0 release candidate 2 + +1.21.61.2 Tools/Demos +..................... + + - bpo-28770(1): Fix python-gdb.py for fastcalls. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28770 + + +File: python.info, Node: Windows<47>, Next: Build<53>, Prev: Tools/Demos<26>, Up: Python 3 6 0 release candidate 2 + +1.21.61.3 Windows +................. + + - bpo-28896(1): Deprecate WindowsRegistryFinder. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28896 + + +File: python.info, Node: Build<53>, Prev: Windows<47>, Up: Python 3 6 0 release candidate 2 + +1.21.61.4 Build +............... + + - bpo-28898(1): Prevent gdb build errors due to HAVE_LONG_LONG + redefinition. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28898 + + +File: python.info, Node: Python 3 6 0 release candidate 1, Next: Python 3 6 0 beta 4, Prev: Python 3 6 0 release candidate 2, Up: Changelog + +1.21.62 Python 3.6.0 release candidate 1 +---------------------------------------- + +`Release date: 2016-12-06' + +* Menu: + +* Core and Builtins: Core and Builtins<54>. +* Library: Library<53>. +* C API: C API<44>. +* Documentation: Documentation<51>. +* Tools/Demos: Tools/Demos<27>. + + +File: python.info, Node: Core and Builtins<54>, Next: Library<53>, Up: Python 3 6 0 release candidate 1 + +1.21.62.1 Core and Builtins +........................... + + - bpo-23722(1): Rather than silently producing a class that doesn’t + support zero-argument ‘super()’ in methods, failing to pass the new + ‘__classcell__’ namespace entry up to ‘type.__new__’ now results in + a ‘DeprecationWarning’ and a class that supports zero-argument + ‘super()’. + + - bpo-28797(2): 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. + + - bpo-28782(3): Fix a bug in the implementation ‘yield from’ when + checking if the next instruction is YIELD_FROM. Regression + introduced by WORDCODE (bpo-26647(4)). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28797 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28782 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26647 + + +File: python.info, Node: Library<53>, Next: C API<44>, Prev: Core and Builtins<54>, Up: Python 3 6 0 release candidate 1 + +1.21.62.2 Library +................. + + - bpo-27030(1): Unknown escapes in re.sub() replacement template are + allowed again. But they still are deprecated and will be disabled + in 3.7. + + - bpo-28835(2): Fix a regression introduced in + warnings.catch_warnings(): call warnings.showwarning() if it was + overridden inside the context manager. + + - bpo-27172(3): To assist with upgrades from 2.7, the previously + documented deprecation of ‘inspect.getfullargspec()’ has been + reversed. This decision may be revisited again after the Python + 2.7 branch is no longer officially supported. + + - bpo-26273(4): Add new ‘socket.TCP_CONGESTION’ (Linux 2.6.13) and + ‘socket.TCP_USER_TIMEOUT’ (Linux 2.6.37) constants. Patch written + by Omar Sandoval. + + - bpo-24142(5): Reading a corrupt config file left configparser in an + invalid state. Original patch by Florian Höch. + + - bpo-28843(6): Fix asyncio C Task to handle exceptions + __traceback__. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27030 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28835 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27172 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26273 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24142 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28843 + + +File: python.info, Node: C API<44>, Next: Documentation<51>, Prev: Library<53>, Up: Python 3 6 0 release candidate 1 + +1.21.62.3 C API +............... + + - bpo-28808(1): PyUnicode_CompareWithASCIIString() now never raises + exceptions. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28808 + + +File: python.info, Node: Documentation<51>, Next: Tools/Demos<27>, Prev: C API<44>, Up: Python 3 6 0 release candidate 1 + +1.21.62.4 Documentation +....................... + + - bpo-23722(1): The data model reference and the porting section in + the What’s New guide now cover the additional ‘__classcell__’ + handling needed for custom metaclasses to fully support PEP 487(2) + and zero-argument ‘super()’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + (2) https://peps.python.org/pep-0487/ + + +File: python.info, Node: Tools/Demos<27>, Prev: Documentation<51>, Up: Python 3 6 0 release candidate 1 + +1.21.62.5 Tools/Demos +..................... + + - bpo-28023(1): Fix python-gdb.py didn’t support new dict + implementation. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28023 + + +File: python.info, Node: Python 3 6 0 beta 4, Next: Python 3 6 0 beta 3, Prev: Python 3 6 0 release candidate 1, Up: Changelog + +1.21.63 Python 3.6.0 beta 4 +--------------------------- + +`Release date: 2016-11-21' + +* Menu: + +* Core and Builtins: Core and Builtins<55>. +* Library: Library<54>. +* Documentation: Documentation<52>. +* Tests: Tests<49>. +* Build: Build<54>. + + +File: python.info, Node: Core and Builtins<55>, Next: Library<54>, Up: Python 3 6 0 beta 4 + +1.21.63.1 Core and Builtins +........................... + + - bpo-28532(1): Show sys.version when -V option is supplied twice. + + - bpo-27100(2): 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. + + - bpo-28746(3): Fix the set_inheritable() file descriptor method on + platforms that do not have the ioctl FIOCLEX and FIONCLEX commands. + + - bpo-26920(4): Fix not getting the locale’s charset upon + initializing the interpreter, on platforms that do not have + langinfo. + + - bpo-28648(5): Fixed crash in Py_DecodeLocale() in debug build on + Mac OS X when decode astral characters. Patch by Xiang Zhang. + + - bpo-19398(6): Extra slash no longer added to sys.path components in + case of empty compile-time PYTHONPATH components. + + - bpo-28665(7): Improve speed of the STORE_DEREF opcode by 40%. + + - bpo-28583(8): PyDict_SetDefault didn’t combine split table when + needed. Patch by Xiang Zhang. + + - bpo-27243(9): 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. + + - bpo-26182(10): Fix a refleak in code that raises + DeprecationWarning. + + - bpo-28721(11): Fix asynchronous generators aclose() and athrow() to + handle StopAsyncIteration propagation properly. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28532 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27100 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28746 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26920 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28648 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=19398 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28665 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28583 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=27243 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=26182 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28721 + + +File: python.info, Node: Library<54>, Next: Documentation<52>, Prev: Core and Builtins<55>, Up: Python 3 6 0 beta 4 + +1.21.63.2 Library +................. + + - bpo-28752(1): Restored the __reduce__() methods of datetime + objects. + + - bpo-28727(2): 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(3): don’t + duplicate warning filters when the warnings module is reloaded + (thing usually only done in unit tests). + + - bpo-20572(4): The subprocess.Popen.wait method’s undocumented + endtime parameter now raises a DeprecationWarning. + + - bpo-25659(5): In ctypes, prevent a crash calling the from_buffer() + and from_buffer_copy() methods on abstract classes like Array. + + - bpo-19717(6): Makes Path.resolve() succeed on paths that do not + exist. Patch by Vajrasky Kok + + - bpo-28563(7): 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. + + - bpo-28387(8): Fixed possible crash in _io.TextIOWrapper deallocator + when the garbage collector is invoked in other thread. Based on + patch by Sebastian Cufre. + + - bpo-28600(9): Optimize loop.call_soon. + + - bpo-28613(10): Fix get_event_loop() return the current loop if + called from coroutines/callbacks. + + - bpo-28634(11): Fix asyncio.isfuture() to support unittest.Mock. + + - bpo-26081(12): Fix refleak in _asyncio.Future.__iter__().throw. + + - bpo-28639(13): Fix inspect.isawaitable to always return bool Patch + by Justin Mayfield. + + - bpo-28652(14): Make loop methods reject socket kinds they do not + support. + + - bpo-28653(15): Fix a refleak in functools.lru_cache. + + - bpo-28703(16): Fix asyncio.iscoroutinefunction to handle Mock + objects. + + - bpo-28704(17): Fix create_unix_server to support Path-like objects + (PEP 519). + + - bpo-28720(18): Add collections.abc.AsyncGenerator. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28752 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28727 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=18383 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20572 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25659 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=19717 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28563 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28387 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28600 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28613 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28634 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26081 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28639 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28652 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28653 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=28703 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28704 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28720 + + +File: python.info, Node: Documentation<52>, Next: Tests<49>, Prev: Library<54>, Up: Python 3 6 0 beta 4 + +1.21.63.3 Documentation +....................... + + - bpo-28513(1): Documented command-line interface of zipfile. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28513 + + +File: python.info, Node: Tests<49>, Next: Build<54>, Prev: Documentation<52>, Up: Python 3 6 0 beta 4 + +1.21.63.4 Tests +............... + + - bpo-28666(1): Now test.support.rmtree is able to remove unwritable + or unreadable directories. + + - bpo-23839(2): Various caches now are cleared before running every + test file. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28666 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23839 + + +File: python.info, Node: Build<54>, Prev: Tests<49>, Up: Python 3 6 0 beta 4 + +1.21.63.5 Build +............... + + - bpo-10656(1): Fix out-of-tree building on AIX. Patch by Tristan + Carel and Michael Haubenwallner. + + - bpo-26359(2): Rename –with-optimiations to –enable-optimizations. + + - bpo-28676(3): Prevent missing ‘getentropy’ declaration warning on + macOS. Patch by Gareth Rees. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=10656 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26359 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28676 + + +File: python.info, Node: Python 3 6 0 beta 3, Next: Python 3 6 0 beta 2, Prev: Python 3 6 0 beta 4, Up: Changelog + +1.21.64 Python 3.6.0 beta 3 +--------------------------- + +`Release date: 2016-10-31' + +* Menu: + +* Core and Builtins: Core and Builtins<56>. +* Library: Library<55>. +* Windows: Windows<48>. +* Build: Build<55>. +* Tests: Tests<50>. + + +File: python.info, Node: Core and Builtins<56>, Next: Library<55>, Up: Python 3 6 0 beta 3 + +1.21.64.1 Core and Builtins +........................... + + - bpo-28128(1): 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. + + - bpo-28509(2): dict.update() no longer allocate unnecessary large + memory. + + - bpo-28426(3): Fixed potential crash in PyUnicode_AsDecodedObject() + in debug build. + + - bpo-28517(4): Fixed of-by-one error in the peephole optimizer that + caused keeping unreachable code. + + - bpo-28214(5): Improved exception reporting for problematic + __set_name__ attributes. + + - bpo-23782(6): Fixed possible memory leak in _PyTraceback_Add() and + exception loss in PyTraceBack_Here(). + + - bpo-28471(7): Fix “Python memory allocator called without holding + the GIL” crash in socket.setblocking. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28128 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28509 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28426 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28517 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28214 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23782 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28471 + + +File: python.info, Node: Library<55>, Next: Windows<48>, Prev: Core and Builtins<56>, Up: Python 3 6 0 beta 3 + +1.21.64.2 Library +................. + + - bpo-27517(1): LZMA compressor and decompressor no longer raise + exceptions if given empty data twice. Patch by Benjamin Fogle. + + - bpo-28549(2): Fixed segfault in curses’s addch() with ncurses6. + + - bpo-28449(3): 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. + + - bpo-23262(4): The webbrowser module now supports Firefox 36+ and + derived browsers. Based on patch by Oleg Broytman. + + - bpo-27939(5): 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. + + - bpo-18844(6): The various ways of specifying weights for + random.choices() now produce the same result sequences. + + - bpo-28255(7): calendar.TextCalendar().prmonth() no longer prints a + space at the start of new line after printing a month’s calendar. + Patch by Xiang Zhang. + + - bpo-20491(8): The textwrap.TextWrapper class now honors + non-breaking spaces. Based on patch by Kaarle Ritvanen. + + - bpo-28353(9): os.fwalk() no longer fails on broken links. + + - bpo-28430(10): Fix iterator of C implemented asyncio.Future doesn’t + accept non-None value is passed to it.send(val). + + - bpo-27025(11): Generated names for Tkinter widgets now start by the + “!” prefix for readability. + + - bpo-25464(12): Fixed HList.header_exists() in tkinter.tix module by + addin a workaround to Tix library bug. + + - bpo-28488(13): shutil.make_archive() no longer adds entry “./” to + ZIP archive. + + - bpo-25953(14): 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. + + - bpo-18219(15): Optimize csv.DictWriter for large number of columns. + Patch by Mariatta Wijaya. + + - bpo-28448(16): Fix C implemented asyncio.Future didn’t work on + Windows. + + - bpo-28480(17): Fix error building socket module when multithreading + is disabled. + + - bpo-24452(18): Make webbrowser support Chrome on Mac OS X. + + - bpo-20766(19): Fix references leaked by pdb in the handling of + SIGINT handlers. + + - bpo-28492(20): Fix how StopIteration exception is raised in + _asyncio.Future. + + - bpo-28500(21): Fix asyncio to handle async gens GC from another + thread. + + - bpo-26923(22): Fix asyncio.Gather to refuse being cancelled once + all children are done. Patch by Johannes Ebke. + + - bpo-26796(23): Don’t configure the number of workers for default + threadpool executor. Initial patch by Hans Lawrenz. + + - bpo-28544(24): Implement asyncio.Task in C. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27517 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28549 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28449 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23262 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27939 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=18844 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28255 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=20491 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28353 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28430 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27025 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25464 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28488 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=25953 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=18219 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=28448 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28480 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=24452 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=20766 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=28492 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28500 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=26923 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=26796 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=28544 + + +File: python.info, Node: Windows<48>, Next: Build<55>, Prev: Library<55>, Up: Python 3 6 0 beta 3 + +1.21.64.3 Windows +................. + + - bpo-28522(1): Fixes mishandled buffer reallocation in getpathp.c + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28522 + + +File: python.info, Node: Build<55>, Next: Tests<50>, Prev: Windows<48>, Up: Python 3 6 0 beta 3 + +1.21.64.4 Build +............... + + - bpo-28444(1): Fix missing extensions modules when cross compiling. + + - bpo-28208(2): Update Windows build and OS X installers to use + SQLite 3.14.2. + + - bpo-28248(3): Update Windows build and OS X installers to use + OpenSSL 1.0.2j. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28444 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28208 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28248 + + +File: python.info, Node: Tests<50>, Prev: Build<55>, Up: Python 3 6 0 beta 3 + +1.21.64.5 Tests +............... + + - bpo-26944(1): Fix test_posix for Android where ‘id -G’ is entirely + wrong or missing the effective gid. + + - bpo-28409(2): regrtest: fix the parser of command line arguments. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26944 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28409 + + +File: python.info, Node: Python 3 6 0 beta 2, Next: Python 3 6 0 beta 1, Prev: Python 3 6 0 beta 3, Up: Changelog + +1.21.65 Python 3.6.0 beta 2 +--------------------------- + +`Release date: 2016-10-10' + +* Menu: + +* Core and Builtins: Core and Builtins<57>. +* Library: Library<56>. +* Windows: Windows<49>. +* C API: C API<45>. +* Build: Build<56>. +* Tests: Tests<51>. + + +File: python.info, Node: Core and Builtins<57>, Next: Library<56>, Up: Python 3 6 0 beta 2 + +1.21.65.1 Core and Builtins +........................... + + - bpo-28183(1): Optimize and cleanup dict iteration. + + - bpo-26081(2): Added C implementation of asyncio.Future. Original + patch by Yury Selivanov. + + - bpo-28379(3): Added sanity checks and tests for + PyUnicode_CopyCharacters(). Patch by Xiang Zhang. + + - bpo-28376(4): The type of long range iterator is now registered as + Iterator. Patch by Oren Milman. + + - bpo-28376(5): Creating instances of range_iterator by calling + range_iterator type now is deprecated. Patch by Oren Milman. + + - bpo-28376(6): The constructor of range_iterator now checks that + step is not 0. Patch by Oren Milman. + + - bpo-26906(7): Resolving special methods of uninitialized type now + causes implicit initialization of the type instead of a fail. + + - bpo-18287(8): PyType_Ready() now checks that tp_name is not NULL. + Original patch by Niklas Koep. + + - bpo-24098(9): Fixed possible crash when AST is changed in process + of compiling it. + + - bpo-28201(10): Dict reduces possibility of 2nd conflict in hash + table when hashes have same lower bits. + + - bpo-28350(11): String constants with null character no longer + interned. + + - bpo-26617(12): Fix crash when GC runs during weakref callbacks. + + - bpo-27942(13): String constants now interned recursively in tuples + and frozensets. + + - bpo-21578(14): Fixed misleading error message when ImportError + called with invalid keyword args. + + - bpo-28203(15): Fix incorrect type in complex(1.0, {2:3}) error + message. Patch by Soumya Sharma. + + - bpo-28086(16): Single var-positional argument of tuple subtype was + passed unscathed to the C-defined function. Now it is converted to + exact tuple. + + - bpo-28214(17): Now __set_name__ is looked up on the class instead + of the instance. + + - bpo-27955(18): Fallback on reading /dev/urandom device when the + getrandom() syscall fails with EPERM, for example when blocked by + SECCOMP. + + - bpo-28192(19): Don’t import readline in isolated mode. + + - Upgrade internal unicode databases to Unicode version 9.0.0. + + - bpo-28131(20): Fix a regression in zipimport’s compile_source(). + zipimport should use the same optimization level as the + interpreter. + + - bpo-28126(21): Replace Py_MEMCPY with memcpy(). Visual Studio can + properly optimize memcpy(). + + - bpo-28120(22): Fix dict.pop() for splitted dictionary when trying + to remove a “pending key” (Not yet inserted in split-table). Patch + by Xiang Zhang. + + - bpo-26182(23): Raise DeprecationWarning when async and await + keywords are used as variable/attribute/class/function name. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28183 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26081 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28379 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28376 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28376 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28376 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26906 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=18287 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24098 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28201 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28350 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26617 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27942 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=21578 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28203 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=28086 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28214 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=27955 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=28192 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=28131 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=28126 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28120 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=26182 + + +File: python.info, Node: Library<56>, Next: Windows<49>, Prev: Core and Builtins<57>, Up: Python 3 6 0 beta 2 + +1.21.65.2 Library +................. + + - bpo-27998(1): Fixed bytes path support in os.scandir() on Windows. + Patch by Eryk Sun. + + - bpo-28317(2): The disassembler now decodes FORMAT_VALUE argument. + + - bpo-26293(3): 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. + + - bpo-28380(4): unittest.mock Mock autospec functions now properly + support assert_called, assert_not_called, and assert_called_once. + + - bpo-27181(5): remove statistics.geometric_mean and defer until 3.7. + + - bpo-28229(6): lzma module now supports pathlib. + + - bpo-28321(7): Fixed writing non-BMP characters with binary format + in plistlib. + + - bpo-28225(8): bz2 module now supports pathlib. Initial patch by + Ethan Furman. + + - bpo-28227(9): gzip now supports pathlib. Patch by Ethan Furman. + + - bpo-27358(10): Optimized merging var-keyword arguments and improved + error message when passing a non-mapping as a var-keyword argument. + + - bpo-28257(11): Improved error message when passing a non-iterable + as a var-positional argument. Added opcode + BUILD_TUPLE_UNPACK_WITH_CALL. + + - bpo-28322(12): Fixed possible crashes when unpickle itertools + objects from incorrect pickle data. Based on patch by John Leitch. + + - bpo-28228(13): imghdr now supports pathlib. + + - bpo-28226(14): compileall now supports pathlib. + + - bpo-28314(15): Fix function declaration (C flags) for the + getiterator() method of xml.etree.ElementTree.Element. + + - bpo-28148(16): 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. + + - bpo-28253(17): 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. + + - bpo-28275(18): Fixed possible use after free in the decompress() + methods of the LZMADecompressor and BZ2Decompressor classes. + Original patch by John Leitch. + + - bpo-27897(19): Fixed possible crash in + sqlite3.Connection.create_collation() if pass invalid string-like + object as a name. Patch by Xiang Zhang. + + - bpo-18844(20): 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. + + - bpo-18893(21): Fix invalid exception handling in + Lib/ctypes/macholib/dyld.py. Patch by Madison May. + + - bpo-27611(22): Fixed support of default root window in the + tkinter.tix module. Added the master parameter in the DisplayStyle + constructor. + + - bpo-27348(23): In the traceback module, restore the formatting of + exception messages like “Exception: None”. This fixes a regression + introduced in 3.5a2. + + - bpo-25651(24): Allow falsy values to be used for msg parameter of + subTest(). + + - bpo-27778(25): Fix a memory leak in os.getrandom() when the + getrandom() is interrupted by a signal and a signal handler raises + a Python exception. + + - bpo-28200(26): Fix memory leak on Windows in the os module (fix + path_converter() function). + + - bpo-25400(27): RobotFileParser now correctly returns default values + for crawl_delay and request_rate. Initial patch by Peter Wirtz. + + - bpo-27932(28): Prevent memory leak in win32_ver(). + + - Fix UnboundLocalError in socket._sendfile_use_sendfile. + + - bpo-28075(29): Check for ERROR_ACCESS_DENIED in Windows + implementation of os.stat(). Patch by Eryk Sun. + + - bpo-22493(30): Warning message emitted by using inline flags in the + middle of regular expression now contains a (truncated) regex + pattern. Patch by Tim Graham. + + - bpo-25270(31): Prevent codecs.escape_encode() from raising + SystemError when an empty bytestring is passed. + + - bpo-28181(32): Get antigravity over HTTPS. Patch by Kaartic + Sivaraam. + + - bpo-25895(33): Enable WebSocket URL schemes in + urllib.parse.urljoin. Patch by Gergely Imreh and Markus + Holtermann. + + - bpo-28114(34): Fix a crash in parse_envlist() when env contains + byte strings. Patch by Eryk Sun. + + - bpo-27599(35): Fixed buffer overrun in binascii.b2a_qp() and + binascii.a2b_qp(). + + - bpo-27906(36): Fix socket accept exhaustion during high TCP + traffic. Patch by Kevin Conway. + + - bpo-28174(37): Handle when SO_REUSEPORT isn’t properly supported. + Patch by Seth Michael Larson. + + - bpo-26654(38): Inspect functools.partial in + asyncio.Handle.__repr__. Patch by iceboy. + + - bpo-26909(39): Fix slow pipes IO in asyncio. Patch by INADA Naoki. + + - bpo-28176(40): Fix callbacks race in + asyncio.SelectorLoop.sock_connect. + + - bpo-27759(41): Fix selectors incorrectly retain invalid file + descriptors. Patch by Mark Williams. + + - bpo-28368(42): Refuse monitoring processes if the child watcher has + no loop attached. Patch by Vincent Michel. + + - bpo-28369(43): Raise RuntimeError when transport’s FD is used with + add_reader, add_writer, etc. + + - bpo-28370(44): Speedup asyncio.StreamReader.readexactly. Patch by + Коренберг Марк. + + - bpo-28371(45): Deprecate passing asyncio.Handles to + run_in_executor. + + - bpo-28372(46): Fix asyncio to support formatting of non-python + coroutines. + + - bpo-28399(47): Remove UNIX socket from FS before binding. Patch by + Коренберг Марк. + + - bpo-27972(48): Prohibit Tasks to await on themselves. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27998 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28317 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26293 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28380 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27181 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28229 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28321 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28225 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28227 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27358 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28257 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28322 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28228 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28226 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28314 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=28148 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28253 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28275 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=27897 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=18844 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=18893 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=27611 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=27348 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=25651 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=27778 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=28200 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=25400 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=27932 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=28075 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=22493 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=25270 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=28181 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=25895 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=28114 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=27599 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=27906 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=28174 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=26654 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=26909 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=28176 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=27759 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=28368 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=28369 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=28370 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=28371 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=28372 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=28399 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=27972 + + +File: python.info, Node: Windows<49>, Next: C API<45>, Prev: Library<56>, Up: Python 3 6 0 beta 2 + +1.21.65.3 Windows +................. + + - bpo-28402(1): Adds signed catalog files for stdlib on Windows. + + - bpo-28333(2): Enables Unicode for ps1/ps2 and input() prompts. + (Patch by Eryk Sun) + + - bpo-28251(3): Improvements to help manuals on Windows. + + - bpo-28110(4): launcher.msi has different product codes between + 32-bit and 64-bit + + - bpo-28161(5): Opening CON for write access fails + + - bpo-28162(6): WindowsConsoleIO readall() fails if first line starts + with Ctrl+Z + + - bpo-28163(7): WindowsConsoleIO fileno() passes wrong flags to + _open_osfhandle + + - bpo-28164(8): _PyIO_get_console_type fails for various paths + + - bpo-28137(9): Renames Windows path file to ._pth + + - bpo-28138(10): Windows ._pth file should allow import site + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28402 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28333 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28251 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28110 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28161 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28162 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28163 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28164 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28137 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28138 + + +File: python.info, Node: C API<45>, Next: Build<56>, Prev: Windows<49>, Up: Python 3 6 0 beta 2 + +1.21.65.4 C API +............... + + - bpo-28426(1): Deprecated undocumented functions + PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), + PyUnicode_AsDecodedUnicode() and PyUnicode_AsEncodedUnicode(). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28426 + + +File: python.info, Node: Build<56>, Next: Tests<51>, Prev: C API<45>, Up: Python 3 6 0 beta 2 + +1.21.65.5 Build +............... + + - bpo-28258(1): Fixed build with Estonian locale (python-config and + distclean targets in Makefile). Patch by Arfrever Frehtes + Taifersar Arahesis. + + - bpo-26661(2): setup.py now detects system libffi with multiarch + wrapper. + + - bpo-15819(3): Remove redundant include search directory option for + building outside the source tree. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28258 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26661 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=15819 + + +File: python.info, Node: Tests<51>, Prev: Build<56>, Up: Python 3 6 0 beta 2 + +1.21.65.6 Tests +............... + + - bpo-28217(1): Adds _testconsole module to test console input. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28217 + + +File: python.info, Node: Python 3 6 0 beta 1, Next: Python 3 6 0 alpha 4, Prev: Python 3 6 0 beta 2, Up: Changelog + +1.21.66 Python 3.6.0 beta 1 +--------------------------- + +`Release date: 2016-09-12' + +* Menu: + +* Core and Builtins: Core and Builtins<58>. +* Library: Library<57>. +* IDLE: IDLE<40>. +* C API: C API<46>. +* Tests: Tests<52>. +* Build: Build<57>. +* Tools/Demos: Tools/Demos<28>. +* Windows: Windows<50>. + + +File: python.info, Node: Core and Builtins<58>, Next: Library<57>, Up: Python 3 6 0 beta 1 + +1.21.66.1 Core and Builtins +........................... + + - bpo-23722(1): 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. + + - bpo-25221(2): Fix corrupted result from PyLong_FromLong(0) when + Python is compiled with NSMALLPOSINTS = 0. + + - bpo-27080(3): Implement formatting support for PEP 515(4). Initial + patch by Chris Angelico. + + - bpo-27199(5): In tarfile, expose copyfileobj bufsize to improve + throughput. Patch by Jason Fried. + + - bpo-27948(6): 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 + ‘f'\x7b"hi"\x7d'’. + + - bpo-28046(7): Remove platform-specific directories from sys.path. + + - bpo-28071(8): Add early-out for differencing from an empty set. + + - bpo-25758(9): Prevents zipimport from unnecessarily encoding a + filename (patch by Eryk Sun) + + - bpo-25856(10): The __module__ attribute of extension classes and + functions now is interned. This leads to more compact pickle data + with protocol 4. + + - bpo-27213(11): 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. + + - bpo-26331(12): Implement tokenizing support for PEP 515(13). Patch + by Georg Brandl. + + - bpo-27999(14): Make “global after use” a SyntaxError, and ditto for + nonlocal. Patch by Ivan Levkivskyi. + + - bpo-28003(15): Implement PEP 525(16) – Asynchronous Generators. + + - bpo-27985(17): Implement PEP 526(18) – Syntax for Variable + Annotations. Patch by Ivan Levkivskyi. + + - bpo-26058(19): 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. + + - bpo-27364(20): A backslash-character pair that is not a valid + escape sequence now generates a DeprecationWarning. Patch by + Emanuel Barry. + + - bpo-27350(21): *note dict: 16e. implementation is changed like + PyPy. It is more compact and preserves insertion order. (Concept + developed by Raymond Hettinger and patch by Inada Naoki.) + + - bpo-27911(22): Remove unnecessary error checks in + ‘exec_builtin_or_dynamic()’. + + - bpo-27078(23): Added BUILD_STRING opcode. Optimized f-strings + evaluation. + + - bpo-17884(24): Python now requires systems with inttypes.h and + stdint.h + + - bpo-27961(25): Require platforms to support ‘long long’. Python + hasn’t compiled without ‘long long’ for years, so this is basically + a formality. + + - bpo-27355(26): Removed support for Windows CE. It was never + finished, and Windows CE is no longer a relevant platform for + Python. + + - Implement PEP 523(27). + + - bpo-27870(28): A left shift of zero by a large integer no longer + attempts to allocate large amounts of memory. + + - bpo-25402(29): 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. + + - bpo-27214(30): 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. + + - bpo-27506(31): Support passing the bytes/bytearray.translate() + “delete” argument by keyword. + + - bpo-27812(32): Properly clear out a generator’s frame’s + backreference to the generator to prevent crashes in frame.clear(). + + - bpo-27811(33): Fix a crash when a coroutine that has not been + awaited is finalized with warnings-as-errors enabled. + + - bpo-27587(34): Fix another issue found by PVS-Studio: Null pointer + check after use of ‘def’ in _PyState_AddModule(). Initial patch by + Christian Heimes. + + - bpo-27792(35): The modulo operation applied to ‘bool’ and other + ‘int’ subclasses now always returns an ‘int’. Previously the + return type depended on the input values. Patch by Xiang Zhang. + + - bpo-26984(36): int() now always returns an instance of exact int. + + - bpo-25604(37): 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. + + - bpo-24254(38): Make class definition namespace ordered by default. + + - bpo-27662(39): Fix an overflow check in ‘List_New’: the original + code was checking against ‘Py_SIZE_MAX’ instead of the correct + upper bound of ‘Py_SSIZE_T_MAX’. Patch by Xiang Zhang. + + - bpo-27782(40): Multi-phase extension module import now correctly + allows the ‘m_methods’ field to be used to add module level + functions to instances of non-module types returned from + ‘Py_create_mod’. Patch by Xiang Zhang. + + - bpo-27936(41): 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. + + - bpo-27487(42): 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. + + - bpo-27157(43): Make only type() itself accept the one-argument + form. Patch by Eryk Sun and Emanuel Barry. + + - bpo-27558(44): 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. + + - bpo-28008(45): Implement PEP 530(46) – asynchronous comprehensions. + + - bpo-27942(47): Fix memory leak in codeobject.c + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23722 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25221 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27080 + + (4) https://peps.python.org/pep-0515/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27199 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27948 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28046 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28071 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25758 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=25856 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27213 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26331 + + (13) https://peps.python.org/pep-0515/ + + (14) https://bugs.python.org/issue?@action=redirect&bpo=27999 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28003 + + (16) https://peps.python.org/pep-0525/ + + (17) https://bugs.python.org/issue?@action=redirect&bpo=27985 + + (18) https://peps.python.org/pep-0526/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26058 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=27364 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=27350 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=27911 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=27078 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=17884 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=27961 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=27355 + + (27) https://peps.python.org/pep-0523/ + + (28) https://bugs.python.org/issue?@action=redirect&bpo=27870 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=25402 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=27214 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=27506 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=27812 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=27811 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=27587 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=27792 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=26984 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=25604 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=24254 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=27662 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=27782 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=27936 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=27487 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=27157 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=27558 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=28008 + + (46) https://peps.python.org/pep-0530/ + + (47) https://bugs.python.org/issue?@action=redirect&bpo=27942 + + +File: python.info, Node: Library<57>, Next: IDLE<40>, Prev: Core and Builtins<58>, Up: Python 3 6 0 beta 1 + +1.21.66.2 Library +................. + + - bpo-28732(1): Fix crash in os.spawnv() with no elements in args + + - bpo-28485(2): Always raise ValueError for negative + compileall.compile_dir(workers=…) parameter, even when + multithreading is unavailable. + + - bpo-28037(3): Use sqlite3_get_autocommit() instead of setting + Connection->inTransaction manually. + + - bpo-25283(4): Attributes tm_gmtoff and tm_zone are now available on + all platforms in the return values of time.localtime() and + time.gmtime(). + + - bpo-24454(5): Regular expression match object groups are now + accessible using __getitem__. “mo[x]” is equivalent to + “mo.group(x)”. + + - bpo-10740(6): sqlite3 no longer implicitly commit an open + transaction before DDL statements. + + - bpo-17941(7): Add a `module' parameter to collections.namedtuple(). + + - bpo-22493(8): 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. + + - bpo-26885(9): xmlrpc now supports unmarshalling additional data + types used by Apache XML-RPC implementation for numerics and None. + + - bpo-28070(10): Fixed parsing inline verbose flag in regular + expressions. + + - bpo-19500(11): Add client-side SSL session resumption to the ssl + module. + + - bpo-28022(12): 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. + + - bpo-28043(13): 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. + + - bpo-24693(14): Changed some RuntimeError’s in the zipfile module to + more appropriate types. Improved some error messages and debugging + output. + + - bpo-17909(15): ‘json.load’ and ‘json.loads’ now support binary + input encoded as UTF-8, UTF-16 or UTF-32. Patch by Serhiy + Storchaka. + + - bpo-27137(16): the pure Python fallback implementation of + ‘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. + + - Fix possible integer overflows and crashes in the mmap module with + unusual usage patterns. + + - bpo-1703178(17): Fix the ability to pass the –link-objects option + to the distutils build_ext command. + + - bpo-28019(18): itertools.count() no longer rounds non-integer step + in range between 1.0 and 2.0 to 1. + + - bpo-18401(19): Pdb now supports the ‘readrc’ keyword argument to + control whether .pdbrc files should be read. Patch by Martin + Matusiak and Sam Kimbrel. + + - bpo-25969(20): Update the lib2to3 grammar to handle the unpacking + generalizations added in 3.5. + + - bpo-14977(21): mailcap now respects the order of the lines in the + mailcap files (“first match”), as required by RFC 1542. Patch by + Michael Lazar. + + - bpo-28082(22): Convert re flag constants to IntFlag. + + - bpo-28025(23): Convert all ssl module constants to IntEnum and + IntFlags. SSLContext properties now return flags and enums. + + - bpo-23591(24): Add Flag, IntFlag, and auto() to enum module. + + - bpo-433028(25): Added support of modifier spans in regular + expressions. + + - bpo-24594(26): Validates persist parameter when opening MSI + database + + - bpo-17582(27): xml.etree.ElementTree nows preserves whitespaces in + attributes (Patch by Duane Griffin. Reviewed and approved by + Stefan Behnel.) + + - bpo-28047(28): Fixed calculation of line length used for the base64 + CTE in the new email policies. + + - bpo-27576(29): Fix call order in OrderedDict.__init__(). + + - email.generator.DecodedGenerator now supports the policy keyword. + + - bpo-28027(30): Remove undocumented modules from ‘Lib/plat-*’: IN, + CDROM, DLFCN, TYPES, CDIO, and STROPTS. + + - bpo-27445(31): Don’t pass str(_charset) to MIMEText.set_payload(). + Patch by Claude Paroz. + + - bpo-24277(32): The new email API is no longer provisional, and the + docs have been reorganized and rewritten to emphasize the new API. + + - bpo-22450(33): urllib now includes an ‘Accept: */*’ header among + the default headers. This makes the results of REST API requests + more consistent and predictable especially when proxy servers are + involved. + + - 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. + + - bpo-28005(34): Allow ImportErrors in encoding implementation to + propagate. + + - bpo-26667(35): Support path-like objects in importlib.util. + + - bpo-27570(36): Avoid zero-length memcpy() etc calls with null + source pointers in the “ctypes” and “array” modules. + + - bpo-22233(37): 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. + + - bpo-27331(38): The email.mime classes now all accept an optional + policy keyword. + + - bpo-27988(39): Fix email iter_attachments incorrect mutation of + payload list. + + - bpo-16113(40): Add SHA-3 and SHAKE support to hashlib module. + + - Eliminate a tautological-pointer-compare warning in _scproxy.c. + + - bpo-27776(41): The *note os.urandom(): 237. 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 + PEP 524(42). + + - bpo-27778(43): Expose the Linux ‘getrandom()’ syscall as a new + *note os.getrandom(): 92c. function. This change is part of the + PEP 524(44). + + - bpo-27691(45): Fix ssl module’s parsing of GEN_RID subject + alternative name fields in X.509 certs. + + - bpo-18844(46): Add random.choices(). + + - bpo-25761(47): Improved error reporting about truncated pickle data + in C implementation of unpickler. UnpicklingError is now raised + instead of AttributeError and ValueError in some cases. + + - bpo-26798(48): Add BLAKE2 (blake2b and blake2s) to hashlib. + + - bpo-26032(49): Optimized globbing in pathlib by using os.scandir(); + it is now about 1.5–4 times faster. + + - bpo-25596(50): Optimized glob() and iglob() functions in the glob + module; they are now about 3–6 times faster. + + - bpo-27928(51): Add scrypt (password-based key derivation function) + to hashlib module (requires OpenSSL 1.1.0). + + - bpo-27850(52): Remove 3DES from ssl module’s default cipher list to + counter measure sweet32 attack (CVE-2016-2183). + + - bpo-27766(53): Add ChaCha20 Poly1305 to ssl module’s default cipher + list. (Required OpenSSL 1.1.0 or LibreSSL). + + - bpo-25387(54): Check return value of winsound.MessageBeep. + + - bpo-27866(55): Add SSLContext.get_ciphers() method to get a list of + all enabled ciphers. + + - bpo-27744(56): Add AF_ALG (Linux Kernel crypto) to socket module. + + - bpo-26470(57): Port ssl and hashlib module to OpenSSL 1.1.0. + + - bpo-11620(58): Fix support for SND_MEMORY in winsound.PlaySound. + Based on a patch by Tim Lesher. + + - bpo-11734(59): Add support for IEEE 754 half-precision floats to + the struct module. Based on a patch by Eli Stevens. + + - bpo-27919(60): Deprecated ‘extra_path’ distribution option in + distutils packaging. + + - bpo-23229(61): Add new ‘cmath’ constants: ‘cmath.inf’ and + ‘cmath.nan’ to match ‘math.inf’ and ‘math.nan’, and also + ‘cmath.infj’ and ‘cmath.nanj’ to match the format used by complex + repr. + + - bpo-27842(62): The csv.DictReader now returns rows of type + OrderedDict. (Contributed by Steve Holden.) + + - Remove support for passing a file descriptor to os.access. It + never worked but previously didn’t raise. + + - bpo-12885(63): Fix error when distutils encounters symlink. + + - bpo-27881(64): Fixed possible bugs when setting + sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang. + + - bpo-27861(65): Fixed a crash in sqlite3.Connection.cursor() when a + factory creates not a cursor. Patch by Xiang Zhang. + + - bpo-19884(66): Avoid spurious output on OS X with Gnu Readline. + + - bpo-27706(67): 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. + + - bpo-10513(68): Fix a regression in Connection.commit(). Statements + should not be reset after a commit. + + - bpo-12319(69): 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. + + - A new version of typing.py from ‘https://github.com/python/typing’: + - Collection (only for 3.6) (bpo-27598(70)) - Add FrozenSet to + __all__ (upstream #261) - fix crash in _get_type_vars() (upstream + #259) - Remove the dict constraint in ForwardRef._eval_type + (upstream #252) + + - bpo-27832(71): Make ‘_normalize’ parameter to ‘Fraction’ + constructor keyword-only, so that ‘Fraction(2, 3, 4)’ now raises + ‘TypeError’. + + - bpo-27539(72): Fix unnormalised ‘Fraction.__pow__’ result in the + case of negative exponent and negative base. + + - bpo-21718(73): cursor.description is now available for queries + using CTEs. + + - bpo-27819(74): In distutils sdists, simply produce the “gztar” + (gzipped tar format) distributions on all platforms unless + “formats” is supplied. + + - bpo-2466(75): posixpath.ismount now correctly recognizes mount + points which the user does not have permission to access. + + - bpo-9998(76): On Linux, ctypes.util.find_library now looks in + LD_LIBRARY_PATH for shared libraries. + + - bpo-27573(77): exit message for code.interact is now configurable. + + - bpo-27930(78): Improved behaviour of + logging.handlers.QueueListener. Thanks to Paulo Andrade and Petr + Viktorin for the analysis and patch. + + - bpo-6766(79): Distributed reference counting added to + multiprocessing to support nesting of shared values / proxy + objects. + + - bpo-21201(80): Improves readability of multiprocessing error + message. Thanks to Wojciech Walczak for patch. + + - asyncio: Add set_protocol / get_protocol to Transports. + + - bpo-27456(81): asyncio: Set TCP_NODELAY by default. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28732 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28485 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28037 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25283 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24454 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=10740 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=17941 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22493 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26885 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28070 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=19500 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28022 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28043 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=24693 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=17909 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=27137 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=1703178 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28019 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=18401 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=25969 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=14977 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28082 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=28025 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=23591 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=433028 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=24594 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=17582 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=28047 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=27576 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=28027 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=27445 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=24277 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=22450 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=28005 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=26667 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=27570 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=22233 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=27331 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=27988 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=16113 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=27776 + + (42) https://peps.python.org/pep-0524/ + + (43) https://bugs.python.org/issue?@action=redirect&bpo=27778 + + (44) https://peps.python.org/pep-0524/ + + (45) https://bugs.python.org/issue?@action=redirect&bpo=27691 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=18844 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=25761 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=26798 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=26032 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=25596 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=27928 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=27850 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=27766 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=25387 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=27866 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=27744 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=26470 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=11620 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=11734 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=27919 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=23229 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=27842 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=12885 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=27881 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=27861 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=19884 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=27706 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=10513 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=12319 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=27598 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=27832 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=27539 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=21718 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=27819 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=2466 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=9998 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=27573 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=27930 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=6766 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=21201 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=27456 + + +File: python.info, Node: IDLE<40>, Next: C API<46>, Prev: Library<57>, Up: Python 3 6 0 beta 1 + +1.21.66.3 IDLE +.............. + + - bpo-15308(1): Add ‘interrupt execution’ (^C) to Shell menu. Patch + by Roger Serwy, updated by Bayard Randel. + + - bpo-27922(2): Stop IDLE tests from ‘flashing’ gui widgets on the + screen. + + - bpo-27891(3): Consistently group and sort imports within idlelib + modules. + + - bpo-17642(4): add larger font sizes for classroom projection. + + - Add version to title of IDLE help window. + + - bpo-25564(5): In section on IDLE – console differences, mention + that using exec means that __builtins__ is defined for each + statement. + + - bpo-27821(6): Fix 3.6.0a3 regression that prevented custom key sets + from being selected when no custom theme was defined. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15308 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27922 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27891 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=17642 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25564 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27821 + + +File: python.info, Node: C API<46>, Next: Tests<52>, Prev: IDLE<40>, Up: Python 3 6 0 beta 1 + +1.21.66.4 C API +............... + + - bpo-26900(1): Excluded underscored names and other private API from + limited API. + + - bpo-26027(2): Add support for path-like objects in + PyUnicode_FSConverter() & PyUnicode_FSDecoder(). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26900 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26027 + + +File: python.info, Node: Tests<52>, Next: Build<57>, Prev: C API<46>, Up: Python 3 6 0 beta 1 + +1.21.66.5 Tests +............... + + - bpo-27427(1): Additional tests for the math module. Patch by + Francisco Couzo. + + - bpo-27953(2): Skip math and cmath tests that fail on OS X 10.4 due + to a poor libm implementation of tan. + + - bpo-26040(3): Improve test_math and test_cmath coverage and rigour. + Patch by Jeff Allen. + + - bpo-27787(4): Call gc.collect() before checking each test for + “dangling threads”, since the dangling threads are weak references. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27427 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27953 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26040 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27787 + + +File: python.info, Node: Build<57>, Next: Tools/Demos<28>, Prev: Tests<52>, Up: Python 3 6 0 beta 1 + +1.21.66.6 Build +............... + + - bpo-27566(1): Fix clean target in freeze makefile (patch by Lisa + Roach) + + - bpo-27705(2): Update message in validate_ucrtbase.py + + - bpo-27976(3): Deprecate building _ctypes with the bundled copy of + libffi on non-OSX UNIX platforms. + + - bpo-27983(4): 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. + + - bpo-21590(5): Support for DTrace and SystemTap probes. + + - bpo-26307(6): The profile-opt build now applies PGO to the built-in + modules. + + - bpo-26359(7): Add the –with-optimizations flag to turn on LTO and + PGO build support when available. + + - bpo-27917(8): Set platform triplets for Android builds. + + - bpo-25825(9): Update references to the $(LIBPL) installation path + on AIX. This path was changed in 3.2a4. + + - Update OS X installer to use SQLite 3.14.1 and XZ 5.2.2. + + - bpo-21122(10): Fix LTO builds on OS X. + + - bpo-17128(11): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27566 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27705 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27976 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27983 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=21590 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=26307 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26359 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27917 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25825 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21122 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=17128 + + +File: python.info, Node: Tools/Demos<28>, Next: Windows<50>, Prev: Build<57>, Up: Python 3 6 0 beta 1 + +1.21.66.7 Tools/Demos +..................... + + - bpo-27952(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27952 + + +File: python.info, Node: Windows<50>, Prev: Tools/Demos<28>, Up: Python 3 6 0 beta 1 + +1.21.66.8 Windows +................. + + - bpo-28065(1): Update xz dependency to 5.2.2 and build it from + source. + + - bpo-25144(2): Ensures TargetDir is set before continuing with + custom install. + + - bpo-1602(3): Windows console doesn’t input or print Unicode (PEP + 528) + + - bpo-27781(4): Change file system encoding on Windows to UTF-8 (PEP + 529) + + - bpo-27731(5): Opt-out of MAX_PATH on Windows 10 + + - bpo-6135(6): Adds encoding and errors parameters to subprocess. + + - bpo-27959(7): Adds oem encoding, alias ansi to mbcs, move aliasmbcs + to codec lookup. + + - bpo-27982(8): The functions of the winsound module now accept + keyword arguments. + + - bpo-20366(9): Build full text search support into SQLite on + Windows. + + - bpo-27756(10): Adds new icons for Python files and processes on + Windows. Designs by Cherry Wang. + + - bpo-27883(11): Update sqlite to 3.14.1.0 on Windows. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28065 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25144 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=1602 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27781 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27731 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=6135 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27959 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27982 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=20366 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27756 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27883 + + +File: python.info, Node: Python 3 6 0 alpha 4, Next: Python 3 6 0 alpha 3, Prev: Python 3 6 0 beta 1, Up: Changelog + +1.21.67 Python 3.6.0 alpha 4 +---------------------------- + +`Release date: 2016-08-15' + +* Menu: + +* Core and Builtins: Core and Builtins<59>. +* Library: Library<58>. +* IDLE: IDLE<41>. +* Tests: Tests<53>. +* Windows: Windows<51>. +* Build: Build<58>. + + +File: python.info, Node: Core and Builtins<59>, Next: Library<58>, Up: Python 3 6 0 alpha 4 + +1.21.67.1 Core and Builtins +........................... + + - bpo-27704(1): Optimized creating bytes and bytearray from byte-like + objects and iterables. Speed up to 3 times for short objects. + Original patch by Naoki Inada. + + - bpo-26823(2): 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. + + - bpo-27574(3): Decreased an overhead of parsing keyword arguments in + functions implemented with using Argument Clinic. + + - bpo-22557(4): Now importing already imported modules is up to 2.5 + times faster. + + - bpo-17596(5): Include to help with Min GW building. + + - bpo-17599(6): On Windows, rename the privately defined + REPARSE_DATA_BUFFER structure to avoid conflicting with the + definition from Min GW. + + - bpo-27507(7): Add integer overflow check in bytearray.extend(). + Patch by Xiang Zhang. + + - bpo-27581(8): Don’t rely on wrapping for overflow check in + PySequence_Tuple(). Patch by Xiang Zhang. + + - bpo-1621(9): Avoid signed integer overflow in list and tuple + operations. Patch by Xiang Zhang. + + - bpo-27419(10): 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__. + + - bpo-27083(11): Respect the PYTHONCASEOK environment variable under + Windows. + + - bpo-27514(12): Make having too many statically nested blocks a + SyntaxError instead of SystemError. + + - bpo-27366(13): Implemented PEP 487(14) (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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27704 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26823 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27574 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22557 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=17596 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17599 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27507 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27581 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=1621 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27419 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27083 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=27514 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27366 + + (14) https://peps.python.org/pep-0487/ + + +File: python.info, Node: Library<58>, Next: IDLE<41>, Prev: Core and Builtins<59>, Up: Python 3 6 0 alpha 4 + +1.21.67.2 Library +................. + + - bpo-26027(1): Add PEP 519(2)/__fspath__() support to the os and + os.path modules. Includes code from Jelle Zijlstra. (See also: + bpo-27524(3)) + + - bpo-27598(4): Add Collections to collections.abc. Patch by Ivan + Levkivskyi, docs by Neil Girdhar. + + - bpo-25958(5): 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. + + - bpo-16764(6): Support keyword arguments to zlib.decompress(). + Patch by Xiang Zhang. + + - bpo-27736(7): Prevent segfault after interpreter re-initialization + due to ref count problem introduced in code for bpo-27038(8) in + 3.6.0a3. Patch by Xiang Zhang. + + - bpo-25628(9): The `verbose' and `rename' parameters for + collections.namedtuple are now keyword-only. + + - bpo-12345(10): Add mathematical constant tau to math and cmath. + See also PEP 628(11). + + - bpo-26823(12): 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. + + - bpo-27664(13): Add to + concurrent.futures.thread.ThreadPoolExecutor() the ability to + specify a thread name prefix. + + - bpo-27181(14): Add geometric_mean and harmonic_mean to statistics + module. + + - bpo-27573(15): code.interact now prints an message when exiting. + + - bpo-6422(16): Add autorange method to timeit.Timer objects. + + - bpo-27773(17): Correct some memory management errors + server_hostname in _ssl.wrap_socket(). + + - bpo-26750(18): 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. + + - bpo-26754(19): Undocumented support of general bytes-like objects + as path in compile() and similar functions is now deprecated. + + - bpo-26800(20): Undocumented support of general bytes-like objects + as paths in os functions is now deprecated. + + - bpo-26981(21): Add _order_ compatibility shim to enum.Enum for + Python 2/3 code bases. + + - bpo-27661(22): Added tzinfo keyword argument to datetime.combine. + + - In the curses module, raise an error if window.getstr() or + window.instr() is passed a negative value. + + - bpo-27783(23): Fix possible usage of uninitialized memory in + operator.methodcaller. + + - bpo-27774(24): Fix possible Py_DECREF on unowned object in _sre. + + - bpo-27760(25): Fix possible integer overflow in binascii.b2a_qp. + + - bpo-27758(26): Fix possible integer overflow in the _csv module for + large record lengths. + + - bpo-27568(27): Prevent HTTPoxy attack (CVE-2016-1000110). Ignore + the HTTP_PROXY variable when REQUEST_METHOD environment is set, + which indicates that the script is in CGI mode. + + - bpo-7063(28): Remove dead code from the “array” module’s slice + handling. Patch by Chuck. + + - bpo-27656(29): Do not assume sched.h defines any SCHED_* constants. + + - bpo-27130(30): 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. + + - bpo-24773(31): Implemented PEP 495(32) (Local Time Disambiguation). + + - Expose the EPOLLEXCLUSIVE constant (when it is defined) in the + select module. + + - bpo-27567(33): Expose the EPOLLRDHUP and POLLRDHUP constants in the + select module. + + - bpo-1621(34): Avoid signed int negation overflow in the “audioop” + module. + + - bpo-27533(35): Release GIL in nt._isdir + + - bpo-17711(36): Fixed unpickling by the persistent ID with protocol + 0. Original patch by Alexandre Vassalotti. + + - bpo-27522(37): Avoid an unintentional reference cycle in + email.feedparser. + + - bpo-27512(38): Fix a segfault when os.fspath() called an + __fspath__() method that raised an exception. Patch by Xiang + Zhang. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26027 + + (2) https://peps.python.org/pep-0519/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27524 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27598 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25958 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=16764 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27736 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27038 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25628 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=12345 + + (11) https://peps.python.org/pep-0628/ + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26823 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27664 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=27181 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=27573 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=6422 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=27773 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=26750 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26754 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=26800 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=26981 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=27661 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=27783 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=27774 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=27760 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=27758 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=27568 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=7063 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=27656 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=27130 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=24773 + + (32) https://peps.python.org/pep-0495/ + + (33) https://bugs.python.org/issue?@action=redirect&bpo=27567 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=1621 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=27533 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=17711 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=27522 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=27512 + + +File: python.info, Node: IDLE<41>, Next: Tests<53>, Prev: Library<58>, Up: Python 3 6 0 alpha 4 + +1.21.67.3 IDLE +.............. + + - bpo-27714(1): 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. + + - bpo-27621(2): 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. + + - bpo-27620(3): Escape key now closes Query box as cancelled. + + - bpo-27609(4): IDLE: tab after initial whitespace should tab, not + autocomplete. This fixes problem with writing docstrings at least + twice indented. + + - bpo-27609(5): Explicitly return None when there are also non-None + returns. In a few cases, reverse a condition and eliminate a + return. + + - bpo-25507(6): IDLE no longer runs buggy code because of its tkinter + imports. Users must include the same imports required to run + directly in Python. + + - bpo-27173(7): 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. + + - bpo-27452(8): add line counter and crc to IDLE configHandler test + dump. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27714 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27621 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27620 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27609 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27609 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25507 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27173 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27452 + + +File: python.info, Node: Tests<53>, Next: Windows<51>, Prev: IDLE<41>, Up: Python 3 6 0 alpha 4 + +1.21.67.4 Tests +............... + + - bpo-25805(1): Skip a test in test_pkgutil as needed that doesn’t + work when ‘__name__ == __main__’. Patch by SilentGhost. + + - bpo-27472(2): Add test.support.unix_shell as the path to the + default shell. + + - bpo-27369(3): In test_pyexpat, avoid testing an error message + detail that changed in Expat 2.2.0. + + - bpo-27594(4): Prevent assertion error when running test_ast with + coverage enabled: ensure code object has a valid first line number. + Patch suggested by Ivan Levkivskyi. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25805 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27472 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27369 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27594 + + +File: python.info, Node: Windows<51>, Next: Build<58>, Prev: Tests<53>, Up: Python 3 6 0 alpha 4 + +1.21.67.5 Windows +................. + + - bpo-27647(1): Update bundled Tcl/Tk to 8.6.6. + + - bpo-27610(2): Adds PEP 514(3) metadata to Windows installer + + - bpo-27469(4): Adds a shell extension to the launcher so that drag + and drop works correctly. + + - bpo-27309(5): Enables proper Windows styles in python[w].exe + manifest. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27647 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27610 + + (3) https://peps.python.org/pep-0514/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27469 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27309 + + +File: python.info, Node: Build<58>, Prev: Windows<51>, Up: Python 3 6 0 alpha 4 + +1.21.67.6 Build +............... + + - bpo-27713(1): Suppress spurious build warnings when updating + importlib’s bootstrap files. Patch by Xiang Zhang + + - bpo-25825(2): Correct the references to Modules/python.exp, which + is required on AIX. The references were accidentally changed in + 3.5.0a1. + + - bpo-27453(3): CPP invocation in configure must use CPPFLAGS. Patch + by Chi Hsuan Yen. + + - bpo-27641(4): The configure script now inserts comments into the + makefile to prevent the pgen and _freeze_importlib executables from + being cross-compiled. + + - bpo-26662(5): Set PYTHON_FOR_GEN in configure as the Python program + to be used for file generation during the build. + + - bpo-10910(6): Avoid C++ compilation errors on FreeBSD and OS X. + Also update FreedBSD version checks for the original ctype UTF-8 + workaround. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27713 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25825 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27453 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27641 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26662 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=10910 + + +File: python.info, Node: Python 3 6 0 alpha 3, Next: Python 3 6 0 alpha 2, Prev: Python 3 6 0 alpha 4, Up: Changelog + +1.21.68 Python 3.6.0 alpha 3 +---------------------------- + +`Release date: 2016-07-11' + +* Menu: + +* Security: Security<30>. +* Core and Builtins: Core and Builtins<60>. +* Library: Library<59>. +* IDLE: IDLE<42>. +* C API: C API<47>. +* Build: Build<59>. +* Tools/Demos: Tools/Demos<29>. +* Documentation: Documentation<53>. +* Tests: Tests<54>. + + +File: python.info, Node: Security<30>, Next: Core and Builtins<60>, Up: Python 3 6 0 alpha 3 + +1.21.68.1 Security +.................. + + - bpo-27278(1): 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. + + - bpo-22636(2): Avoid shell injection problems with + ctypes.util.find_library(). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27278 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22636 + + +File: python.info, Node: Core and Builtins<60>, Next: Library<59>, Prev: Security<30>, Up: Python 3 6 0 alpha 3 + +1.21.68.2 Core and Builtins +........................... + + - bpo-27473(1): Fixed possible integer overflow in bytes and + bytearray concatenations. Patch by Xiang Zhang. + + - bpo-23034(2): 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. + + - bpo-27443(3): __length_hint__() of bytearray iterators no longer + return a negative integer for a resized bytearray. + + - bpo-27007(4): The fromhex() class methods of bytes and bytearray + subclasses now return an instance of corresponding subclass. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27473 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23034 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27443 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27007 + + +File: python.info, Node: Library<59>, Next: IDLE<42>, Prev: Core and Builtins<60>, Up: Python 3 6 0 alpha 3 + +1.21.68.3 Library +................. + + - bpo-26844(1): Fix error message for imp.find_module() to refer to + ‘path’ instead of ‘name’. Patch by Lev Maximov. + + - bpo-23804(2): Fix SSL zero-length recv() calls to not block and not + raise an error about unclean EOF. + + - bpo-27466(3): Change time format returned by + http.cookie.time2netscape, confirming the netscape cookie format + and making it consistent with documentation. + + - bpo-21708(4): 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. + + - bpo-26721(5): Change the socketserver.StreamRequestHandler.wfile + attribute to implement BufferedIOBase. In particular, the write() + method no longer does partial writes. + + - bpo-22115(6): 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. + + - bpo-26243(7): Only the level argument to zlib.compress() is keyword + argument now. The first argument is positional-only. + + - bpo-27038(8): Expose the DirEntry type as os.DirEntry. Code patch + by Jelle Zijlstra. + + - bpo-27186(9): Update os.fspath()/PyOS_FSPath() to check the return + value of __fspath__() to be either str or bytes. + + - bpo-18726(10): 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. + + - bpo-27319(11): 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. + + - bpo-27079(12): Fixed curses.ascii functions isblank(), iscntrl() + and ispunct(). + + - bpo-27294(13): Numerical state in the repr for Tkinter event + objects is now represented as a combination of known flags. + + - bpo-27177(14): Match objects in the re module now support + index-like objects as group indices. Based on patches by Jeroen + Demeyer and Xiang Zhang. + + - bpo-26754(15): Some functions (compile() etc) accepted a filename + argument encoded as an iterable of integers. Now only strings and + byte-like objects are accepted. + + - bpo-26536(16): socket.ioctl now supports SIO_LOOPBACK_FAST_PATH. + Patch by Daniel Stokes. + + - bpo-27048(17): Prevents distutils failing on Windows when + environment variables contain non-ASCII characters + + - bpo-27330(18): Fixed possible leaks in the ctypes module. + + - bpo-27238(19): Got rid of bare excepts in the turtle module. + Original patch by Jelle Zijlstra. + + - bpo-27122(20): 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 PEP 479(21) bug described in issue25782. + + - bpo-16864(22): sqlite3.Cursor.lastrowid now supports REPLACE + statement. Initial patch by Alex LordThorsen. + + - bpo-26386(23): Fixed ttk.TreeView selection operations with item + id’s containing spaces. + + - bpo-8637(24): Honor a pager set by the env var MANPAGER (in + preference to one set by the env var PAGER). + + - bpo-16182(25): Fix various functions in the “readline” module to + use the locale encoding, and fix get_begidx() and get_endidx() to + return code point indexes. + + - bpo-27392(26): Add loop.connect_accepted_socket(). Patch by Jim + Fulton. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26844 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23804 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27466 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21708 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26721 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22115 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26243 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27038 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=18726 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27319 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=27079 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27294 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=27177 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=26754 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=26536 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=27048 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=27330 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=27238 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=27122 + + (21) https://peps.python.org/pep-0479/ + + (22) https://bugs.python.org/issue?@action=redirect&bpo=16864 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=26386 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=8637 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=16182 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=27392 + + +File: python.info, Node: IDLE<42>, Next: C API<47>, Prev: Library<59>, Up: Python 3 6 0 alpha 3 + +1.21.68.4 IDLE +.............. + + - bpo-27477(1): IDLE search dialogs now use ttk widgets. + + - bpo-27173(2): 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. + + - bpo-27452(3): make command line “idle-test> python test_help.py” + work. __file__ is relative when python is started in the file’s + directory. + + - bpo-27452(4): add line counter and crc to IDLE configHandler test + dump. + + - bpo-27380(5): 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. + + - bpo-27372(6): Test_idle no longer changes the locale. + + - bpo-27365(7): Allow non-ascii chars in IDLE NEWS.txt, for + contributor names. + + - bpo-27245(8): 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. + + - bpo-24137(9): 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. + + - bpo-27310(10): Fix IDLE.app failure to launch on OS X due to + vestigial import. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27477 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27173 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27452 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27452 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27380 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27372 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27365 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27245 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24137 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27310 + + +File: python.info, Node: C API<47>, Next: Build<59>, Prev: IDLE<42>, Up: Python 3 6 0 alpha 3 + +1.21.68.5 C API +............... + + - bpo-26754(1): PyUnicode_FSDecoder() accepted a filename argument + encoded as an iterable of integers. Now only strings and byte-like + objects are accepted. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26754 + + +File: python.info, Node: Build<59>, Next: Tools/Demos<29>, Prev: C API<47>, Up: Python 3 6 0 alpha 3 + +1.21.68.6 Build +............... + + - bpo-28066(1): Fix the logic that searches build directories for + generated include files when building outside the source tree. + + - bpo-27442(2): Expose the Android API level that python was built + against, in sysconfig.get_config_vars() as ‘ANDROID_API_LEVEL’. + + - bpo-27434(3): 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. + + - bpo-26930(4): Update Windows builds to use OpenSSL 1.0.2h. + + - bpo-23968(5): 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. + + - Don’t use largefile support for GNU/Hurd. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28066 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27442 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27434 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26930 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23968 + + +File: python.info, Node: Tools/Demos<29>, Next: Documentation<53>, Prev: Build<59>, Up: Python 3 6 0 alpha 3 + +1.21.68.7 Tools/Demos +..................... + + - bpo-27332(1): Fixed the type of the first argument of module-level + functions generated by Argument Clinic. Patch by Petr Viktorin. + + - bpo-27418(2): Fixed Tools/importbench/importbench.py. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27332 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27418 + + +File: python.info, Node: Documentation<53>, Next: Tests<54>, Prev: Tools/Demos<29>, Up: Python 3 6 0 alpha 3 + +1.21.68.8 Documentation +....................... + + - bpo-19489(1): Moved the search box from the sidebar to the header + and footer of each page. Patch by Ammar Askar. + + - bpo-27285(2): Update documentation to reflect the deprecation of + ‘pyvenv’ and normalize on the term “virtual environment”. Patch by + Steve Piercy. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19489 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27285 + + +File: python.info, Node: Tests<54>, Prev: Documentation<53>, Up: Python 3 6 0 alpha 3 + +1.21.68.9 Tests +............... + + - bpo-27027(1): Added test.support.is_android that is True when this + is an Android build. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27027 + + +File: python.info, Node: Python 3 6 0 alpha 2, Next: Python 3 6 0 alpha 1, Prev: Python 3 6 0 alpha 3, Up: Changelog + +1.21.69 Python 3.6.0 alpha 2 +---------------------------- + +`Release date: 2016-06-13' + +* Menu: + +* Security: Security<31>. +* Core and Builtins: Core and Builtins<61>. +* Library: Library<60>. +* IDLE: IDLE<43>. +* Documentation: Documentation<54>. +* Tests: Tests<55>. +* Windows: Windows<52>. +* Build: Build<60>. +* C API: C API<48>. +* Tools/Demos: Tools/Demos<30>. + + +File: python.info, Node: Security<31>, Next: Core and Builtins<61>, Up: Python 3 6 0 alpha 2 + +1.21.69.1 Security +.................. + + - bpo-26556(1): Update expat to 2.1.1, fixes CVE-2015-1283. + + - Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. + Reported by Team Oststrom. + + - bpo-26839(2): On Linux, *note os.urandom(): 237. now calls + ‘getrandom()’ with ‘GRND_NONBLOCK’ to fall back on reading + ‘/dev/urandom’ if the urandom entropy pool is not initialized yet. + Patch written by Colm Buckley. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26556 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26839 + + +File: python.info, Node: Core and Builtins<61>, Next: Library<60>, Prev: Security<31>, Up: Python 3 6 0 alpha 2 + +1.21.69.2 Core and Builtins +........................... + + - bpo-27095(1): Simplified MAKE_FUNCTION and removed MAKE_CLOSURE + opcodes. Patch by Demur Rumed. + + - bpo-27190(2): Raise NotSupportedError if sqlite3 is older than + 3.3.1. Patch by Dave Sawyer. + + - bpo-27286(3): Fixed compiling BUILD_MAP_UNPACK_WITH_CALL opcode. + Calling function with generalized unpacking (PEP 448) and + conflicting keyword names could cause undefined behavior. + + - bpo-27140(4): Added BUILD_CONST_KEY_MAP opcode. + + - bpo-27186(5): Add support for os.PathLike objects to open() (part + of PEP 519(6)). + + - bpo-27066(7): Fixed SystemError if a custom opener (for open()) + returns a negative number without setting an exception. + + - bpo-26983(8): 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. + + - bpo-27097(9): Python interpreter is now about 7% faster due to + optimized instruction decoding. Based on patch by Demur Rumed. + + - bpo-26647(10): Python interpreter now uses 16-bit wordcode instead + of bytecode. Patch by Demur Rumed. + + - bpo-23275(11): Allow assigning to an empty target list in round + brackets: () = iterable. + + - bpo-27243(12): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27095 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27190 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27286 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27140 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + (6) https://peps.python.org/pep-0519/ + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27066 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26983 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=27097 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=26647 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23275 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=27243 + + +File: python.info, Node: Library<60>, Next: IDLE<43>, Prev: Core and Builtins<61>, Up: Python 3 6 0 alpha 2 + +1.21.69.3 Library +................. + + - 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. + + - bpo-27025(1): Generated names for Tkinter widgets are now more + meaningful and recognizable. + + - bpo-25455(2): Fixed crashes in repr of recursive + ElementTree.Element and functools.partial objects. + + - bpo-27294(3): Improved repr for Tkinter event objects. + + - bpo-20508(4): Improve exception message of + IPv{4,6}Network.__getitem__. Patch by Gareth Rees. + + - bpo-21386(5): Implement missing IPv4Address.is_global property. It + was documented since 07a5610bae9d. Initial patch by Roger Luethi. + + - bpo-27029(6): Removed deprecated support of universal newlines mode + from ZipFile.open(). + + - bpo-27030(7): Unknown escapes consisting of ‘'\'’ and an ASCII + letter in regular expressions now are errors. The re.LOCALE flag + now can be used only with bytes patterns. + + - bpo-27186(8): Add os.PathLike support to DirEntry (part of PEP + 519(9)). Initial patch by Jelle Zijlstra. + + - bpo-20900(10): distutils register command now decodes HTTP + responses correctly. Initial patch by ingrid. + + - bpo-27186(11): Add os.PathLike support to pathlib, removing its + provisional status (part of PEP 519). Initial patch by Dusty + Phillips. + + - bpo-27186(12): Add support for os.PathLike objects to os.fsencode() + and os.fsdecode() (part of PEP 519(13)). + + - bpo-27186(14): Introduce os.PathLike and os.fspath() (part of PEP + 519(15)). + + - 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 PEP 492(16) + (Awaitable, AsyncIterable, AsyncIterator) have been added (in fact + they made it into 3.5.1 but were never mentioned). + + - bpo-25738(17): 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. + + - bpo-21313(18): Fix the “platform” module to tolerate when + sys.version contains truncated build information. + + - bpo-23883(19): 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. + + - bpo-27164(20): In the zlib module, allow decompressing raw Deflate + streams with a predefined zdict. Based on patch by Xiang Zhang. + + - bpo-24291(21): 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. + + - bpo-21272(22): Use _sysconfigdata.py to initialize + distutils.sysconfig. + + - bpo-19611(23): *note inspect: 9e. now reports the implicit ‘.0’ + parameters generated by the compiler for comprehension and + generator expression scopes as if they were positional-only + parameters called ‘implicit0’. Patch by Jelle Zijlstra. + + - bpo-26809(24): Add ‘__all__’ to *note string: f3. Patch by Emanuel + Barry. + + - bpo-26373(25): subprocess.Popen.communicate now correctly ignores + BrokenPipeError when the child process dies before .communicate() + is called in more/all circumstances. + + - 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. + + - bpo-27167(26): Clarify the subprocess.CalledProcessError error + message text when the child process died due to a signal. + + - bpo-25931(27): Don’t define socketserver.Forking* names on + platforms such as Windows that do not support os.fork(). + + - bpo-21776(28): distutils.upload now correctly handles HTTPError. + Initial patch by Claudiu Popa. + + - bpo-26526(29): Replace custom parse tree validation in the parser + module with a simple DFA validator. + + - bpo-27114(30): Fix SSLContext._load_windows_store_certs fails with + PermissionError + + - bpo-18383(31): Avoid creating duplicate filters when using + filterwarnings and simplefilter. Based on patch by Alex Shkop. + + - bpo-23026(32): winreg.QueryValueEx() now return an integer for + REG_QWORD type. + + - bpo-26741(33): subprocess.Popen destructor now emits a + ResourceWarning warning if the child process is still running. + + - bpo-27056(34): Optimize pickle.load() and pickle.loads(), up to 10% + faster to deserialize a lot of small objects. + + - bpo-21271(35): New keyword only parameters in reset_mock call. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27025 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25455 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27294 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20508 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=21386 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27029 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27030 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + (9) https://peps.python.org/pep-0519/ + + (10) https://bugs.python.org/issue?@action=redirect&bpo=20900 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + (13) https://peps.python.org/pep-0519/ + + (14) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + (15) https://peps.python.org/pep-0519/ + + (16) https://peps.python.org/pep-0492/ + + (17) https://bugs.python.org/issue?@action=redirect&bpo=25738 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=21313 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=23883 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=27164 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=24291 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=21272 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=19611 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=26809 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=26373 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=27167 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=25931 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=21776 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=26526 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=27114 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=18383 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=23026 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=26741 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=27056 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=21271 + + +File: python.info, Node: IDLE<43>, Next: Documentation<54>, Prev: Library<60>, Up: Python 3 6 0 alpha 2 + +1.21.69.4 IDLE +.............. + + - bpo-5124(1): 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. + + - bpo-24750(2): Switch all scrollbars in IDLE to ttk versions. Where + needed, minimal tests are added to cover changes. + + - bpo-24759(3): 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. + + - bpo-27239(4): idlelib.macosx.isXyzTk functions initialize as + needed. + + - bpo-27262(5): move Aqua unbinding code, which enable context menus, + to macosx. + + - bpo-24759(6): Make clear in idlelib.idle_test.__init__ that the + directory is a private implementation of test.test_idle and tool + for maintainers. + + - bpo-27196(7): 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 + + - bpo-20567(8): Revise idle_test/README.txt with advice about + avoiding tk warning messages from tests. Apply advice to several + IDLE tests. + + - bpo-24225(9): Update idlelib/README.txt with new file names and + event handlers. + + - bpo-27156(10): Remove obsolete code not used by IDLE. + + - bpo-27117(11): Make colorizer htest and turtledemo work with dark + themes. Move code for configuring text widget colors to a new + function. + + - bpo-24225(12): Rename many ‘idlelib/*.py’ and ‘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. + + - bpo-26673(13): When tk reports font size as 0, change to size 10. + Such fonts on Linux prevented the configuration dialog from + opening. + + - bpo-21939(14): Add test for IDLE’s percolator. Original patch by + Saimadhav Heblikar. + + - bpo-21676(15): Add test for IDLE’s replace dialog. Original patch + by Saimadhav Heblikar. + + - bpo-18410(16): Add test for IDLE’s search dialog. Original patch + by Westley Martínez. + + - bpo-21703(17): Add test for undo delegator. Patch mostly by + Saimadhav Heblikar . + + - bpo-27044(18): Add ConfigDialog.remove_var_callbacks to stop memory + leaks. + + - bpo-23977(19): Add more asserts to test_delegator. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5124 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24750 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24759 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27239 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27262 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24759 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27196 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=20567 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24225 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=27156 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27117 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=24225 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26673 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=21939 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=21676 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=18410 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=21703 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=27044 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=23977 + + +File: python.info, Node: Documentation<54>, Next: Tests<55>, Prev: IDLE<43>, Up: Python 3 6 0 alpha 2 + +1.21.69.5 Documentation +....................... + + - bpo-16484(1): Change the default PYTHONDOCS URL to “https:”, and + fix the resulting links to use lowercase. Patch by Sean Rodman, + test by Kaushik Nadikuditi. + + - bpo-24136(2): Document the new PEP 448(3) unpacking syntax of 3.5. + + - bpo-22558(4): Add remaining doc links to source code for + Python-coded modules. Patch by Yoni Lavi. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=16484 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24136 + + (3) https://peps.python.org/pep-0448/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22558 + + +File: python.info, Node: Tests<55>, Next: Windows<52>, Prev: Documentation<54>, Up: Python 3 6 0 alpha 2 + +1.21.69.6 Tests +............... + + - bpo-25285(1): 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. + + - bpo-25285(2): Tools/buildbot/test.bat script now uses -j1 by + default to run each test file in fresh child process. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25285 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25285 + + +File: python.info, Node: Windows<52>, Next: Build<60>, Prev: Tests<55>, Up: Python 3 6 0 alpha 2 + +1.21.69.7 Windows +................. + + - bpo-27064(1): The py.exe launcher now defaults to Python 3. The + Windows launcher ‘py.exe’ no longer prefers an installed Python 2 + version over Python 3 by default when used interactively. + + - bpo-17500(2): Remove unused and outdated icons. (See also: + ‘https://github.com/python/pythondotorg/issues/945’) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27064 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17500 + + +File: python.info, Node: Build<60>, Next: C API<48>, Prev: Windows<52>, Up: Python 3 6 0 alpha 2 + +1.21.69.8 Build +............... + + - bpo-27229(1): Fix the cross-compiling pgen rule for in-tree builds. + Patch by Xavier de Gaye. + + - bpo-26930(2): Update OS X 10.5+ 32-bit-only installer to build and + link with OpenSSL 1.0.2h. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27229 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26930 + + +File: python.info, Node: C API<48>, Next: Tools/Demos<30>, Prev: Build<60>, Up: Python 3 6 0 alpha 2 + +1.21.69.9 C API +............... + + - bpo-27186(1): Add the PyOS_FSPath() function (part of PEP 519(2)). + + - bpo-26282(3): PyArg_ParseTupleAndKeywords() now supports + positional-only parameters. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27186 + + (2) https://peps.python.org/pep-0519/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26282 + + +File: python.info, Node: Tools/Demos<30>, Prev: C API<48>, Up: Python 3 6 0 alpha 2 + +1.21.69.10 Tools/Demos +...................... + + - bpo-26282(1): Argument Clinic now supports positional-only and + keyword parameters in the same function. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26282 + + +File: python.info, Node: Python 3 6 0 alpha 1, Next: Python 3 5 5 final, Prev: Python 3 6 0 alpha 2, Up: Changelog + +1.21.70 Python 3.6.0 alpha 1 +---------------------------- + +`Release date: 2016-05-16' + +* Menu: + +* Security: Security<32>. +* Core and Builtins: Core and Builtins<62>. +* Library: Library<61>. +* IDLE: IDLE<44>. +* Documentation: Documentation<55>. +* Tests: Tests<56>. +* Build: Build<61>. +* Windows: Windows<53>. +* Tools/Demos: Tools/Demos<31>. +* C API: C API<49>. + + +File: python.info, Node: Security<32>, Next: Core and Builtins<62>, Up: Python 3 6 0 alpha 1 + +1.21.70.1 Security +.................. + + - bpo-26657(1): 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. + + - bpo-26313(2): ssl.py _load_windows_store_certs fails if windows + cert store is empty. Patch by Baji. + + - bpo-25939(3): On Windows open the cert store readonly in + ssl.enum_certificates. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26657 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26313 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25939 + + +File: python.info, Node: Core and Builtins<62>, Next: Library<61>, Prev: Security<32>, Up: Python 3 6 0 alpha 1 + +1.21.70.2 Core and Builtins +........................... + + - bpo-20041(1): Fixed TypeError when frame.f_trace is set to None. + Patch by Xavier de Gaye. + + - bpo-26168(2): Fixed possible refleaks in failing Py_BuildValue() + with the “N” format unit. + + - bpo-26991(3): Fix possible refleak when creating a function with + annotations. + + - bpo-27039(4): Fixed bytearray.remove() for values greater than 127. + Based on patch by Joe Jevnik. + + - bpo-23640(5): int.from_bytes() no longer bypasses constructors for + subclasses. + + - bpo-27005(6): Optimized the float.fromhex() class method for exact + float. It is now 2 times faster. + + - bpo-18531(7): Single var-keyword argument of dict subtype was + passed unscathed to the C-defined function. Now it is converted to + exact dict. + + - bpo-26811(8): gc.get_objects() no longer contains a broken tuple + with NULL pointer. + + - bpo-20120(9): 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. + + - bpo-26249(10): Memory functions of the *note PyMem_Malloc(): 8d7. + domain (‘PYMEM_DOMAIN_MEM’) now use the *note pymalloc allocator: + 980. rather than system ‘malloc()’. Applications calling *note + PyMem_Malloc(): 8d7. without holding the GIL can now crash: use + ‘PYTHONMALLOC=debug’ environment variable to validate the usage of + memory allocators in your application. + + - bpo-26802(11): Optimize function calls only using unpacking like + ‘func(*tuple)’ (no other positional argument, no keyword): avoid + copying the tuple. Patch written by Joe Jevnik. + + - bpo-26659(12): Make the builtin slice type support cycle + collection. + + - bpo-26718(13): super.__init__ no longer leaks memory if called + multiple times. NOTE: A direct call of super.__init__ is not + endorsed! + + - bpo-27138(14): Fix the doc comment for FileFinder.find_spec(). + + - bpo-27147(15): Mention PEP 420(16) in the importlib docs. + + - bpo-25339(17): PYTHONIOENCODING now has priority over locale in + setting the error handler for stdin and stdout. + + - bpo-26494(18): 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. + + - bpo-26574(19): Optimize ‘bytes.replace(b'', b'.')’ and + ‘bytearray.replace(b'', b'.')’. Patch written by Josh Snider. + + - bpo-26581(20): If coding cookie is specified multiple times on a + line in Python source code file, only the first one is taken to + account. + + - bpo-19711(21): Add tests for reloading namespace packages. + + - bpo-21099(22): Switch applicable importlib tests to use PEP 451(23) + API. + + - bpo-26563(24): Debug hooks on Python memory allocators now raise a + fatal error if functions of the *note PyMem_Malloc(): 8d7. family + are called without holding the GIL. + + - bpo-26564(25): On error, the debug hooks on Python memory + allocators now use the *note tracemalloc: 11e. module to get the + traceback where a memory block was allocated. + + - bpo-26558(26): The debug hooks on Python memory allocator *note + PyObject_Malloc(): 8d9. now detect when functions are called + without holding the GIL. + + - bpo-26516(27): Add *note PYTHONMALLOC: 8d5. environment variable to + set the Python memory allocators and/or install debug hooks. + + - bpo-26516(28): The *note PyMem_SetupDebugHooks(): 8da. function can + now also be used on Python compiled in release mode. + + - bpo-26516(29): The *note PYTHONMALLOCSTATS: 159c. environment + variable can now also be used on Python compiled in release mode. + It now has no effect if set to an empty string. + + - bpo-26516(30): In debug mode, debug hooks are now also installed on + Python memory allocators when Python is configured without + pymalloc. + + - bpo-26464(31): 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. + + - bpo-22836(32): 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. + + - bpo-26302(33): Correct behavior to reject comma as a legal + character for cookie names. + + - bpo-26136(34): Upgrade the warning when a generator raises + StopIteration from PendingDeprecationWarning to DeprecationWarning. + Patch by Anish Shah. + + - bpo-26204(35): 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, ‘1.0’ is now ignored in ‘def f(): 1.0’. + + - bpo-4806(36): Avoid masking the original TypeError exception when + using star (‘*’) unpacking in function calls. Based on patch by + Hagen Fürstenau and Daniel Urban. + + - bpo-26146(37): Add a new kind of AST node: ‘ast.Constant’. It can + be used by external AST optimizers, but the compiler does not emit + directly such node. + + - bpo-23601(38): Sped-up allocation of dict key objects by using + Python’s small object allocator. (Contributed by Julian Taylor.) + + - bpo-18018(39): Import raises ImportError instead of SystemError if + a relative import is attempted without a known parent package. + + - bpo-25843(40): When compiling code, don’t merge constants if they + are equal but have a different types. For example, ‘f1, f2 = + lambda: 1, lambda: 1.0’ is now correctly compiled to two different + functions: ‘f1()’ returns ‘1’ (‘int’) and ‘f2()’ returns ‘1.0’ + (‘float’), even if ‘1’ and ‘1.0’ are equal. + + - bpo-26107(41): The format of the ‘co_lnotab’ attribute of code + objects changes to support negative line number delta. + + - bpo-26154(42): 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. + + - bpo-25791(43): If __package__ != __spec__.parent or if neither + __package__ or __spec__ are defined then ImportWarning is raised. + + - bpo-22995(44): [UPDATE] Comment out the one of the pickleability + tests in _PyObject_GetState() due to regressions observed in + Cython-based projects. + + - bpo-25961(45): Disallowed null characters in the type name. + + - bpo-25973(46): Fix segfault when an invalid nonlocal statement + binds a name starting with two underscores. + + - bpo-22995(47): 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. + + - bpo-20440(48): Massive replacing unsafe attribute setting code with + special macro Py_SETREF. + + - bpo-25766(49): Special method __bytes__() now works in str + subclasses. + + - bpo-25421(50): __sizeof__ methods of builtin types now use dynamic + basic size. This allows sys.getsize() to work correctly with their + subclasses with __slots__ defined. + + - bpo-25709(51): Fixed problem with in-place string concatenation and + utf-8 cache. + + - bpo-5319(52): New Py_FinalizeEx() API allowing Python to set an + exit status of 120 on failure to flush buffered streams. + + - bpo-25485(53): telnetlib.Telnet is now a context manager. + + - bpo-24097(54): Fixed crash in object.__reduce__() if slot name is + freed inside __getattr__. + + - bpo-24731(55): 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. + + - bpo-25630(56): Fix a possible segfault during argument parsing in + functions that accept filesystem paths. + + - bpo-23564(57): 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. + + - bpo-25388(58): Fixed tokenizer crash when processing undecodable + source code with a null byte. + + - bpo-25462(59): The hash of the key now is calculated only once in + most operations in C implementation of OrderedDict. + + - bpo-22995(60): Default implementation of __reduce__ and + __reduce_ex__ now rejects builtin types with not defined __new__. + + - bpo-24802(61): 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. + + - bpo-25555(62): Fix parser and AST: fill lineno and col_offset of + “arg” node when compiling AST from Python objects. + + - bpo-24726(63): Fixed a crash and leaking NULL in repr() of + OrderedDict that was mutated by direct calls of dict methods. + + - bpo-25449(64): Iterating OrderedDict with keys with unstable hash + now raises KeyError in C implementations as well as in Python + implementation. + + - bpo-25395(65): Fixed crash when highly nested OrderedDict + structures were garbage collected. + + - bpo-25401(66): Optimize bytes.fromhex() and bytearray.fromhex(): + they are now between 2x and 3.5x faster. + + - bpo-25399(67): Optimize bytearray % args using the new private + _PyBytesWriter API. Formatting is now between 2.5 and 5 times + faster. + + - bpo-25274(68): 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. + + - bpo-24402(69): Fix input() to prompt to the redirected stdout when + sys.stdout.fileno() fails. + + - bpo-25349(70): Optimize bytes % args using the new private + _PyBytesWriter API. Formatting is now up to 2 times faster. + + - bpo-24806(71): Prevent builtin types that are not allowed to be + subclassed from being subclassed through multiple inheritance. + + - bpo-25301(72): The UTF-8 decoder is now up to 15 times as fast for + error handlers: ‘ignore’, ‘replace’ and ‘surrogateescape’. + + - bpo-24848(73): Fixed a number of bugs in UTF-7 decoding of + misformed data. + + - bpo-25267(74): The UTF-8 encoder is now up to 75 times as fast for + error handlers: ‘ignore’, ‘replace’, ‘surrogateescape’, + ‘surrogatepass’. Patch co-written with Serhiy Storchaka. + + - bpo-25280(75): Import trace messages emitted in verbose (-v) mode + are no longer formatted twice. + + - bpo-25227(76): Optimize ASCII and latin1 encoders with the + ‘surrogateescape’ error handler: the encoders are now up to 3 times + as fast. Initial patch written by Serhiy Storchaka. + + - bpo-25003(77): 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. + + - bpo-9232(78): 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. + + - bpo-24965(79): Implement PEP 498(80) “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. + + - bpo-26478(81): Fix semantic bugs when using binary operators with + dictionary views and tuples. + + - bpo-26171(82): Fix possible integer overflow and heap corruption in + zipimporter.get_data(). + + - bpo-25660(83): Fix TAB key behaviour in REPL with readline. + + - bpo-26288(84): Optimize PyLong_AsDouble. + + - bpo-26289(85): 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(86)) + + - bpo-25887(87): Raise a RuntimeError when a coroutine object is + awaited more than once. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20041 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26168 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26991 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27039 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23640 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27005 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=18531 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26811 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=20120 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=26249 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=26802 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26659 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26718 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=27138 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=27147 + + (16) https://peps.python.org/pep-0420/ + + (17) https://bugs.python.org/issue?@action=redirect&bpo=25339 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=26494 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26574 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=26581 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=19711 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=21099 + + (23) https://peps.python.org/pep-0451/ + + (24) https://bugs.python.org/issue?@action=redirect&bpo=26563 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=26564 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=26558 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=26516 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=26516 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=26516 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=26516 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=26464 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=22836 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=26302 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=26136 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=26204 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=4806 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=26146 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=23601 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=18018 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=25843 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=26107 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=26154 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=25791 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=22995 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=25961 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=25973 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=22995 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=20440 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=25766 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=25421 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=25709 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=5319 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=25485 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=24097 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=24731 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=25630 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=23564 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=25388 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=25462 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=22995 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=24802 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=25555 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=24726 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=25449 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=25395 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=25401 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=25399 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=25274 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=24402 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=25349 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=24806 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=25301 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=24848 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=25267 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=25280 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=25227 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=25003 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=9232 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=24965 + + (80) https://peps.python.org/pep-0498/ + + (81) https://bugs.python.org/issue?@action=redirect&bpo=26478 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=26171 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=25660 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=26288 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=26289 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=26315 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=25887 + + +File: python.info, Node: Library<61>, Next: IDLE<44>, Prev: Core and Builtins<62>, Up: Python 3 6 0 alpha 1 + +1.21.70.3 Library +................. + + - bpo-27057(1): 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. + + - bpo-27014(2): Fix infinite recursion using typing.py. Thanks to + Kalle Tuure! + + - bpo-27031(3): Removed dummy methods in Tkinter widget classes: + tk_menuBar() and tk_bindForTraversal(). + + - bpo-14132(4): Fix urllib.request redirect handling when the target + only has a query string. Original fix by Ján Janech. + + - bpo-17214(5): 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. + + - bpo-27033(6): The default value of the decode_data parameter for + smtpd.SMTPChannel and smtpd.SMTPServer constructors is changed to + False. + + - bpo-27034(7): Removed deprecated class asynchat.fifo. + + - bpo-26870(8): Added readline.set_auto_history(), which can stop + entries being automatically added to the history list. Based on + patch by Tyler Crompton. + + - bpo-26039(9): zipfile.ZipFile.open() can now be used to write data + into a ZIP file, as well as for extracting data. Patch by Thomas + Kluyver. + + - bpo-26892(10): Honor debuglevel flag in urllib.request.HTTPHandler. + Patch contributed by Chi Hsuan Yen. + + - bpo-22274(11): In the subprocess module, allow stderr to be + redirected to stdout even when stdout is not redirected. Patch by + Akira Li. + + - bpo-26807(12): mock_open ‘files’ no longer error on readline at end + of file. Patch from Yolanda Robla. + + - bpo-25745(13): Fixed leaking a userptr in curses panel destructor. + + - bpo-26977(14): Removed unnecessary, and ignored, call to sum of + squares helper in statistics.pvariance. + + - bpo-26002(15): Use bisect in statistics.median instead of a linear + search. Patch by Upendra Kuma. + + - bpo-25974(16): Make use of new Decimal.as_integer_ratio() method in + statistics module. Patch by Stefan Krah. + + - bpo-26996(17): Add secrets module as described in PEP 506(18). + + - bpo-26881(19): The modulefinder module now supports extended opcode + arguments. + + - bpo-23815(20): Fixed crashes related to directly created instances + of types in _tkinter and curses.panel modules. + + - bpo-17765(21): weakref.ref() no longer silently ignores keyword + arguments. Patch by Georg Brandl. + + - bpo-26873(22): xmlrpc now raises ResponseError on unsupported type + tags instead of silently return incorrect result. + + - bpo-26915(23): 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. + + - bpo-26711(24): Fixed the comparison of plistlib.Data with other + types. + + - bpo-24114(25): Fix an uninitialized variable in ‘ctypes.util’. The + bug only occurs on SunOS when the ctypes implementation searches + for the ‘crle’ program. Patch by Xiang Zhang. Tested on SunOS by + Kees Bos. + + - bpo-26864(26): 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. + + - bpo-24902(27): Print server URL on http.server startup. Initial + patch by Felix Kaiser. + + - bpo-25788(28): fileinput.hook_encoded() now supports an “errors” + argument for passing to open. Original patch by Joseph Hackman. + + - bpo-26634(29): recursive_repr() now sets __qualname__ of wrapper. + Patch by Xiang Zhang. + + - bpo-26804(30): urllib.request will prefer lower_case proxy + environment variables over UPPER_CASE or Mixed_Case ones. Patch + contributed by Hans-Peter Jansen. + + - bpo-26837(31): assertSequenceEqual() now correctly outputs + non-stringified differing items (like bytes in the -b mode). This + affects assertListEqual() and assertTupleEqual(). + + - bpo-26041(32): Remove “will be removed in Python 3.7” from + deprecation messages of platform.dist() and + platform.linux_distribution(). Patch by Kumaripaba Miyurusara + Athukorala. + + - bpo-26822(33): itemgetter, attrgetter and methodcaller objects no + longer silently ignore keyword arguments. + + - bpo-26733(34): Disassembling a class now disassembles class and + static methods. Patch by Xiang Zhang. + + - bpo-26801(35): Fix error handling in *note + shutil.get_terminal_size(): dae, catch *note AttributeError: 19d. + instead of *note NameError: 396. Patch written by Emanuel Barry. + + - bpo-24838(36): tarfile’s ustar and gnu formats now correctly + calculate name and link field limits for multibyte character + encodings like utf-8. + + - bpo-26717(37): Stop encoding Latin-1-ized WSGI paths with UTF-8. + Patch by Anthony Sottile. + + - bpo-26782(38): Add STARTUPINFO to subprocess.__all__ on Windows. + + - bpo-26404(39): Add context manager to socketserver. Patch by Aviv + Palivoda. + + - bpo-26735(40): Fix *note os.urandom(): 237. on Solaris 11.3 and + newer when reading more than 1,024 bytes: call ‘getrandom()’ + multiple times with a limit of 1024 bytes per call. + + - bpo-26585(41): Eliminate http.server._quote_html() and use + html.escape(quote=False). Patch by Xiang Zhang. + + - bpo-26685(42): Raise OSError if closing a socket fails. + + - bpo-16329(43): Add .webm to mimetypes.types_map. Patch by + Giampaolo Rodola’. + + - bpo-13952(44): Add .csv to mimetypes.types_map. Patch by Geoff + Wilson. + + - bpo-26587(45): the site module now allows .pth files to specify + files to be added to sys.path (e.g. zip files). + + - bpo-25609(46): Introduce contextlib.AbstractContextManager and + typing.ContextManager. + + - bpo-26709(47): Fixed Y2038 problem in loading binary PLists. + + - bpo-23735(48): Handle terminal resizing with Readline 6.3+ by + installing our own SIGWINCH handler. Patch by Eric Price. + + - bpo-25951(49): Change SSLSocket.sendall() to return None, as + explicitly documented for plain socket objects. Patch by Aviv + Palivoda. + + - bpo-26586(50): 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. + + - bpo-26676(51): Added missing XMLPullParser to ElementTree.__all__. + + - bpo-22854(52): Change BufferedReader.writable() and + BufferedWriter.readable() to always return False. + + - bpo-26492(53): 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. + + - bpo-26641(54): doctest.DocFileTest and doctest.testfile() now + support packages (module splitted into multiple directories) for + the package parameter. + + - bpo-25195(55): 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. + + - bpo-26644(56): Raise ValueError rather than SystemError when a + negative length is passed to SSLSocket.recv() or read(). + + - bpo-23804(57): Fix SSL recv(0) and read(0) methods to return zero + bytes instead of up to 1024. + + - bpo-26616(58): Fixed a bug in datetime.astimezone() method. + + - bpo-26637(59): The *note importlib: 97. module now emits an *note + ImportError: 511. rather than a *note TypeError: 19c. if *note + __import__(): 510. is tried during the Python shutdown process but + *note sys.path: 162. is already cleared (set to ‘None’). + + - bpo-21925(60): *note warnings.formatwarning(): 1446. now catches + exceptions when calling *note linecache.getline(): aa7. and *note + tracemalloc.get_object_traceback(): 159e. to be able to log *note + ResourceWarning: 8a9. emitted late during the Python shutdown + process. + + - bpo-23848(61): 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). + + - bpo-26530(62): Add C functions ‘_PyTraceMalloc_Track()’ and + ‘_PyTraceMalloc_Untrack()’ to track memory blocks using the *note + tracemalloc: 11e. module. Add ‘_PyTraceMalloc_GetTraceback()’ to + get the traceback of an object. + + - bpo-26588(63): The _tracemalloc now supports tracing memory + allocations of multiple address spaces (domains). + + - bpo-24266(64): Ctrl+C during Readline history search now cancels + the search mode when compiled with Readline 7. + + - bpo-26590(65): Implement a safe finalizer for the _socket.socket + type. It now releases the GIL to close the socket. + + - bpo-18787(66): spwd.getspnam() now raises a PermissionError if the + user doesn’t have privileges. + + - bpo-26560(67): Avoid potential ValueError in + BaseHandler.start_response. Initial patch by Peter Inglesby. + + - bpo-26567(68): Add a new function *note PyErr_ResourceWarning(): + 989. function to pass the destroyed object. Add a `source' + attribute to ‘warnings.WarningMessage’. Add + warnings._showwarnmsg() which uses tracemalloc to get the traceback + where source object was allocated. + + - bpo-26569(69): Fix *note pyclbr.readmodule(): 159f. and *note + pyclbr.readmodule_ex(): 15a0. to support importing packages. + + - bpo-26499(70): Account for remaining Content-Length in + HTTPResponse.readline() and read1(). Based on patch by Silent + Ghost. Also document that HTTPResponse now supports these methods. + + - bpo-25320(71): Handle sockets in directories unittest discovery is + scanning. Patch from Victor van den Elzen. + + - bpo-16181(72): cookiejar.http2time() now returns None if year is + higher than datetime.MAXYEAR. + + - bpo-26513(73): Fixes platform module detection of Windows Server + + - bpo-23718(74): Fixed parsing time in week 0 before Jan 1. Original + patch by Tamás Bence Gedai. + + - bpo-26323(75): Add Mock.assert_called() and + Mock.assert_called_once() methods to unittest.mock. Patch written + by Amit Saha. + + - bpo-20589(76): Invoking Path.owner() and Path.group() on Windows + now raise NotImplementedError instead of ImportError. + + - bpo-26177(77): Fixed the keys() method for Canvas and Scrollbar + widgets. + + - bpo-15068(78): Got rid of excessive buffering in fileinput. The + bufsize parameter is now deprecated and ignored. + + - bpo-19475(79): Added an optional argument timespec to the datetime + isoformat() method to choose the precision of the time component. + + - bpo-2202(80): Fix UnboundLocalError in + AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by + Mathieu Dupuy. + + - bpo-26167(81): Minimized overhead in copy.copy() and + copy.deepcopy(). Optimized copying and deepcopying bytearrays, + NotImplemented, slices, short lists, tuples, dicts, sets. + + - bpo-25718(82): Fixed pickling and copying the accumulate() iterator + with total is None. + + - bpo-26475(83): Fixed debugging output for regular expressions with + the (?x) flag. + + - bpo-26482(84): Allowed pickling recursive dequeues. + + - bpo-26335(85): Make mmap.write() return the number of bytes written + like other write methods. Patch by Jakub Stasiak. + + - bpo-26457(86): 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. + + - bpo-26385(87): Remove the file if the internal open() call in + NamedTemporaryFile() fails. Patch by Silent Ghost. + + - bpo-26402(88): 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. + + - bpo-25913(89): Leading ‘<~’ is optional now in base64.a85decode() + with adobe=True. Patch by Swati Jaiswal. + + - bpo-26186(90): Remove an invalid type check in + importlib.util.LazyLoader. + + - bpo-26367(91): importlib.__import__() raises ImportError like + builtins.__import__() when ‘level’ is specified but without an + accompanying package specified. + + - bpo-26309(92): In the “socketserver” module, shut down the request + (closing the connected socket) when verify_request() returns false. + Patch by Aviv Palivoda. + + - bpo-23430(93): 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. + + - bpo-25995(94): os.walk() no longer uses FDs proportional to the + tree depth. + + - bpo-25994(95): Added the close() method and the support of the + context manager protocol for the os.scandir() iterator. + + - bpo-23992(96): multiprocessing: make MapResult not fail-fast upon + exception. + + - bpo-26243(97): Support keyword arguments to zlib.compress(). Patch + by Aviv Palivoda. + + - bpo-26117(98): The os.scandir() iterator now closes file descriptor + not only when the iteration is finished, but when it was failed + with error. + + - bpo-25949(99): __dict__ for an OrderedDict instance is now created + only when needed. + + - bpo-25911(100): Restored support of bytes paths in os.walk() on + Windows. + + - bpo-26045(101): Add UTF-8 suggestion to error message when posting + a non-Latin-1 string with http.client. + + - bpo-26039(102): Added zipfile.ZipInfo.from_file() and + zipinfo.ZipInfo.is_dir(). Patch by Thomas Kluyver. + + - bpo-12923(103): Reset FancyURLopener’s redirect counter even if + there is an exception. Based on patches by Brian Brazil and Daniel + Rocco. + + - bpo-25945(104): 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. + + - bpo-26202(105): copy.deepcopy() now correctly copies range() + objects with non-atomic attributes. + + - bpo-23076(106): Path.glob() now raises a ValueError if it’s called + with an invalid pattern. Patch by Thomas Nyberg. + + - bpo-19883(107): Fixed possible integer overflows in zipimport. + + - bpo-26227(108): 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. + + - bpo-26099(109): 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. + + - bpo-26147(110): xmlrpc now works with strings not encodable with + used non-UTF-8 encoding. + + - bpo-25935(111): Garbage collector now breaks reference loops with + OrderedDict. + + - bpo-16620(112): Fixed AttributeError in msilib.Directory.glob(). + + - bpo-26013(113): Added compatibility with broken protocol 2 pickles + created in old Python 3 versions (3.4.3 and lower). + + - bpo-26129(114): Deprecated accepting non-integers in + grp.getgrgid(). + + - bpo-25850(115): Use cross-compilation by default for 64-bit + Windows. + + - bpo-25822(116): Add docstrings to the fields of urllib.parse + results. Patch contributed by Swati Jaiswal. + + - bpo-22642(117): Convert trace module option parsing mechanism to + argparse. Patch contributed by SilentGhost. + + - bpo-24705(118): Fix sysconfig._parse_makefile not expanding ${} + vars appearing before $() vars. + + - bpo-26069(119): Remove the deprecated apis in the trace module. + + - bpo-22138(120): Fix mock.patch behavior when patching descriptors. + Restore original values after patching. Patch contributed by Sean + McCully. + + - bpo-25672(121): In the ssl module, enable the + SSL_MODE_RELEASE_BUFFERS mode option if it is safe to do so. + + - bpo-26012(122): Don’t traverse into symlinks for ‘**’ pattern in + pathlib.Path.[r]glob(). + + - bpo-24120(123): Ignore PermissionError when traversing a tree with + pathlib.Path.[r]glob(). Patch by Ulrich Petri. + + - bpo-21815(124): 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. + + - bpo-25447(125): fileinput now uses sys.stdin as-is if it does not + have a buffer attribute (restores backward compatibility). + + - bpo-25971(126): Optimized creating Fractions from floats by 2 times + and from Decimals by 3 times. + + - bpo-25802(127): Document as deprecated the remaining + implementations of importlib.abc.Loader.load_module(). + + - bpo-25928(128): Add Decimal.as_integer_ratio(). + + - bpo-25447(129): Copying the lru_cache() wrapper object now always + works, independently from the type of the wrapped object (by + returning the original object unchanged). + + - bpo-25768(130): Have the functions in compileall return booleans + instead of ints and add proper documentation and tests for the + return values. + + - bpo-24103(131): Fixed possible use after free in + ElementTree.XMLPullParser. + + - bpo-25860(132): os.fwalk() no longer skips remaining directories + when error occurs. Original patch by Samson Lee. + + - bpo-25914(133): Fixed and simplified OrderedDict.__sizeof__. + + - bpo-25869(134): Optimized deepcopying ElementTree; it is now 20 + times faster. + + - bpo-25873(135): Optimized iterating ElementTree. Iterating + elements Element.iter() is now 40% faster, iterating text + Element.itertext() is now up to 2.5 times faster. + + - bpo-25902(136): Fixed various refcount issues in ElementTree + iteration. + + - bpo-22227(137): The TarFile iterator is reimplemented using + generator. This implementation is simpler that using class. + + - bpo-25638(138): Optimized ElementTree.iterparse(); it is now 2x + faster. Optimized ElementTree parsing; it is now 10% faster. + + - bpo-25761(139): Improved detecting errors in broken pickle data. + + - bpo-25717(140): 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. + + - bpo-24903(141): 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. + + - bpo-25764(142): In the subprocess module, preserve any exception + caused by fork() failure when preexec_fn is used. + + - bpo-25771(143): Tweak the exception message for + importlib.util.resolve_name() when ‘package’ isn’t specified but + necessary. + + - bpo-6478(144): _strptime’s regexp cache now is reset after changing + timezone with time.tzset(). + + - bpo-14285(145): 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. + + - bpo-19771(146): 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 + ‘*.pyc’ file). + + - bpo-25177(147): 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. + + - bpo-25718(148): Fixed copying object with state with boolean value + is false. + + - bpo-10131(149): Fixed deep copying of minidom documents. Based on + patch by Marian Ganisin. + + - bpo-7990(150): dir() on ElementTree.Element now lists properties: + “tag”, “text”, “tail” and “attrib”. Original patch by Santoso + Wijaya. + + - bpo-25725(151): Fixed a reference leak in pickle.loads() when + unpickling invalid data including tuple instructions. + + - bpo-25663(152): In the Readline completer, avoid listing duplicate + global names, and search the global namespace before searching + builtins. + + - bpo-25688(153): Fixed file leak in ElementTree.iterparse() raising + an error. + + - bpo-23914(154): Fixed SystemError raised by unpickler on broken + pickle data. + + - bpo-25691(155): Fixed crash on deleting ElementTree.Element + attributes. + + - bpo-25624(156): ZipFile now always writes a ZIP_STORED header for + directory entries. Patch by Dingyuan Wang. + + - bpo-25626(157): 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. + + - bpo-25583(158): Avoid incorrect errors raised by + os.makedirs(exist_ok=True) when the OS gives priority to errors + such as EACCES over EEXIST. + + - bpo-25593(159): Change semantics of EventLoop.stop() in asyncio. + + - bpo-6973(160): 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. + + - bpo-23883(161): 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. + + - bpo-25590(162): 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. + + - bpo-25498(163): 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. + + - bpo-25584(164): Added “escape” to the __all__ list in the glob + module. + + - bpo-25584(165): Fixed recursive glob() with patterns starting with + ‘**’. + + - bpo-25446(166): Fix regression in smtplib’s AUTH LOGIN support. + + - bpo-18010(167): Fix the pydoc web server’s module search function + to handle exceptions from importing packages. + + - bpo-25554(168): Got rid of circular references in regular + expression parsing. + + - bpo-18973(169): Command-line interface of the calendar module now + uses argparse instead of optparse. + + - bpo-25510(170): fileinput.FileInput.readline() now returns b’’ + instead of ‘’ at the end if the FileInput was opened with binary + mode. Patch by Ryosuke Ito. + + - bpo-25503(171): Fixed inspect.getdoc() for inherited docstrings of + properties. Original patch by John Mark Vandenberg. + + - bpo-25515(172): Always use os.urandom as a source of randomness in + uuid.uuid4. + + - bpo-21827(173): Fixed textwrap.dedent() for the case when largest + common whitespace is a substring of smallest leading whitespace. + Based on patch by Robert Li. + + - bpo-25447(174): The lru_cache() wrapper objects now can be copied + and pickled (by returning the original object unchanged). + + - bpo-25390(175): typing: Don’t crash on Union[str, Pattern]. + + - bpo-25441(176): asyncio: Raise error from drain() when socket is + closed. + + - bpo-25410(177): Cleaned up and fixed minor bugs in C implementation + of OrderedDict. + + - bpo-25411(178): Improved Unicode support in SMTPHandler through + better use of the email package. Thanks to user simon04 for the + patch. + + - Move the imp module from a PendingDeprecationWarning to + DeprecationWarning. + + - bpo-25407(179): Remove mentions of the formatter module being + removed in Python 3.6. + + - bpo-25406(180): 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. + + - bpo-25382(181): pickletools.dis() now outputs implicit memo index + for the MEMOIZE opcode. + + - bpo-25357(182): Add an optional newline parameter to + binascii.b2a_base64(). base64.b64encode() uses it to avoid a + memory copy. + + - bpo-24164(183): Objects that need calling ‘__new__’ with keyword + arguments, can now be pickled using pickle protocols older than + protocol version 4. + + - bpo-25364(184): zipfile now works in threads disabled builds. + + - bpo-25328(185): smtpd’s SMTPChannel now correctly raises a + ValueError if both decode_data and enable_SMTPUTF8 are set to true. + + - bpo-16099(186): RobotFileParser now supports Crawl-delay and + Request-rate extensions. Patch by Nikolay Bogoychev. + + - bpo-25316(187): distutils raises OSError instead of + DistutilsPlatformError when MSVC is not installed. + + - bpo-25380(188): Fixed protocol for the STACK_GLOBAL opcode in + pickletools.opcodes. + + - bpo-23972(189): 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. + + - bpo-25304(190): 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. + + - bpo-25232(191): Fix CGIRequestHandler to split the query from the + URL at the first question mark (?) rather than the last. Patch + from Xiang Zhang. + + - bpo-24657(192): Prevent CGIRequestHandler from collapsing slashes + in the query part of the URL as if it were a path. Patch from + Xiang Zhang. + + - bpo-25287(193): 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. + + - bpo-23600(194): Default implementation of tzinfo.fromutc() was + returning wrong results in some cases. + + - bpo-25203(195): Failed readline.set_completer_delims() no longer + left the module in inconsistent state. + + - bpo-25011(196): rlcompleter now omits private and special attribute + names unless the prefix starts with underscores. + + - bpo-25209(197): rlcompleter now can add a space or a colon after + completed keyword. + + - bpo-22241(198): timezone.utc name is now plain ‘UTC’, not + ‘UTC-00:00’. + + - bpo-23517(199): 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). + + - bpo-23552(200): Timeit now warns when there is substantial (4x) + variance between best and worst times. Patch from Serhiy + Storchaka. + + - bpo-24633(201): site-packages/README -> README.txt. + + - bpo-24879(202): 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. + + - bpo-24874(203): Improve speed of itertools.cycle() and make its + pickle more compact. + + - Fix crash in itertools.cycle.__setstate__() when the first argument + wasn’t a list. + + - bpo-20059(204): urllib.parse raises ValueError on all invalid + ports. Patch by Martin Panter. + + - bpo-24360(205): Improve __repr__ of argparse.Namespace() for + invalid identifiers. Patch by Matthias Bussonnier. + + - bpo-23426(206): run_setup was broken in distutils. Patch from + Alexander Belopolsky. + + - bpo-13938(207): 2to3 converts StringTypes to a tuple. Patch from + Mark Hammond. + + - bpo-2091(208): open() accepted a ‘U’ mode string containing ‘+’, + but ‘U’ can only be used with ‘r’. Patch from Jeff Balogh and John + O’Connor. + + - bpo-8585(209): improved tests for zipimporter2. Patch from Mark + Lawrence. + + - bpo-18622(210): unittest.mock.mock_open().reset_mock would recurse + infinitely. Patch from Nicola Palumbo and Laurent De Buyst. + + - bpo-24426(211): 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. + + - bpo-23661(212): unittest.mock side_effects can now be exceptions + again. This was a regression vs Python 3.4. Patch from Ignacio + Rossi + + - bpo-13248(213): Remove deprecated inspect.getmoduleinfo function. + + - bpo-25578(214): Fix (another) memory leak in + SSLSocket.getpeercer(). + + - bpo-25530(215): Disable the vulnerable SSLv3 protocol by default + when creating ssl.SSLContext. + + - bpo-25569(216): Fix memory leak in SSLSocket.getpeercert(). + + - bpo-25471(217): Sockets returned from accept() shouldn’t appear to + be nonblocking. + + - bpo-25319(218): When threading.Event is reinitialized, the + underlying condition should use a regular lock rather than a + recursive lock. + + - Skip getaddrinfo if host is already resolved. Patch by A. Jesse + Jiryu Davis. + + - bpo-26050(219): Add asyncio.StreamReader.readuntil() method. Patch + by Марк Коренберг. + + - bpo-25924(220): Avoid unnecessary serialization of getaddrinfo(3) + calls on OS X versions 10.5 or higher. Original patch by A. Jesse + Jiryu Davis. + + - bpo-26406(221): Avoid unnecessary serialization of getaddrinfo(3) + calls on current versions of OpenBSD and NetBSD. Patch by A. Jesse + Jiryu Davis. + + - bpo-26848(222): Fix asyncio/subprocess.communicate() to handle + empty input. Patch by Jack O’Connor. + + - bpo-27040(223): Add loop.get_exception_handler method + + - bpo-27041(224): asyncio: Add loop.create_future method + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27057 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27014 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27031 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=14132 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=17214 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27033 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27034 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26870 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26039 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=26892 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=22274 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26807 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25745 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=26977 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=26002 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=25974 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=26996 + + (18) https://peps.python.org/pep-0506/ + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26881 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23815 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=17765 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=26873 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=26915 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=26711 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=24114 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=26864 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=24902 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=25788 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=26634 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=26804 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=26837 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=26041 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=26822 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=26733 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=26801 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=24838 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=26717 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=26782 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=26404 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=26735 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=26585 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=26685 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=16329 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=13952 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=26587 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=25609 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=26709 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=23735 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=25951 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=26586 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=26676 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=22854 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=26492 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=26641 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=25195 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=26644 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=23804 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=26616 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=26637 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=21925 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=23848 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=26530 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=26588 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=24266 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=26590 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=18787 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=26560 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=26567 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=26569 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=26499 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=25320 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=16181 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=26513 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=23718 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=26323 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=20589 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=26177 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=15068 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=19475 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=2202 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=26167 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=25718 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=26475 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=26482 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=26335 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=26457 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=26385 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=26402 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=25913 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=26186 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=26367 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=26309 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=23430 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=25995 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=25994 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=23992 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=26243 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=26117 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=25949 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=25911 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=26045 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=26039 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=12923 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=25945 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=26202 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=23076 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=19883 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=26227 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=26099 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=26147 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=25935 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=16620 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=26013 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=26129 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=25850 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=25822 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=22642 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=24705 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=26069 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=22138 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=25672 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=26012 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=24120 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=21815 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=25447 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=25971 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=25802 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=25928 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=25447 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=25768 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=24103 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=25860 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=25914 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=25869 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=25873 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=25902 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=22227 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=25638 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=25761 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=25717 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=24903 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=25764 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=25771 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=6478 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=14285 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=19771 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=25177 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=25718 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=10131 + + (150) https://bugs.python.org/issue?@action=redirect&bpo=7990 + + (151) https://bugs.python.org/issue?@action=redirect&bpo=25725 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=25663 + + (153) https://bugs.python.org/issue?@action=redirect&bpo=25688 + + (154) https://bugs.python.org/issue?@action=redirect&bpo=23914 + + (155) https://bugs.python.org/issue?@action=redirect&bpo=25691 + + (156) https://bugs.python.org/issue?@action=redirect&bpo=25624 + + (157) https://bugs.python.org/issue?@action=redirect&bpo=25626 + + (158) https://bugs.python.org/issue?@action=redirect&bpo=25583 + + (159) https://bugs.python.org/issue?@action=redirect&bpo=25593 + + (160) https://bugs.python.org/issue?@action=redirect&bpo=6973 + + (161) https://bugs.python.org/issue?@action=redirect&bpo=23883 + + (162) https://bugs.python.org/issue?@action=redirect&bpo=25590 + + (163) https://bugs.python.org/issue?@action=redirect&bpo=25498 + + (164) https://bugs.python.org/issue?@action=redirect&bpo=25584 + + (165) https://bugs.python.org/issue?@action=redirect&bpo=25584 + + (166) https://bugs.python.org/issue?@action=redirect&bpo=25446 + + (167) https://bugs.python.org/issue?@action=redirect&bpo=18010 + + (168) https://bugs.python.org/issue?@action=redirect&bpo=25554 + + (169) https://bugs.python.org/issue?@action=redirect&bpo=18973 + + (170) https://bugs.python.org/issue?@action=redirect&bpo=25510 + + (171) https://bugs.python.org/issue?@action=redirect&bpo=25503 + + (172) https://bugs.python.org/issue?@action=redirect&bpo=25515 + + (173) https://bugs.python.org/issue?@action=redirect&bpo=21827 + + (174) https://bugs.python.org/issue?@action=redirect&bpo=25447 + + (175) https://bugs.python.org/issue?@action=redirect&bpo=25390 + + (176) https://bugs.python.org/issue?@action=redirect&bpo=25441 + + (177) https://bugs.python.org/issue?@action=redirect&bpo=25410 + + (178) https://bugs.python.org/issue?@action=redirect&bpo=25411 + + (179) https://bugs.python.org/issue?@action=redirect&bpo=25407 + + (180) https://bugs.python.org/issue?@action=redirect&bpo=25406 + + (181) https://bugs.python.org/issue?@action=redirect&bpo=25382 + + (182) https://bugs.python.org/issue?@action=redirect&bpo=25357 + + (183) https://bugs.python.org/issue?@action=redirect&bpo=24164 + + (184) https://bugs.python.org/issue?@action=redirect&bpo=25364 + + (185) https://bugs.python.org/issue?@action=redirect&bpo=25328 + + (186) https://bugs.python.org/issue?@action=redirect&bpo=16099 + + (187) https://bugs.python.org/issue?@action=redirect&bpo=25316 + + (188) https://bugs.python.org/issue?@action=redirect&bpo=25380 + + (189) https://bugs.python.org/issue?@action=redirect&bpo=23972 + + (190) https://bugs.python.org/issue?@action=redirect&bpo=25304 + + (191) https://bugs.python.org/issue?@action=redirect&bpo=25232 + + (192) https://bugs.python.org/issue?@action=redirect&bpo=24657 + + (193) https://bugs.python.org/issue?@action=redirect&bpo=25287 + + (194) https://bugs.python.org/issue?@action=redirect&bpo=23600 + + (195) https://bugs.python.org/issue?@action=redirect&bpo=25203 + + (196) https://bugs.python.org/issue?@action=redirect&bpo=25011 + + (197) https://bugs.python.org/issue?@action=redirect&bpo=25209 + + (198) https://bugs.python.org/issue?@action=redirect&bpo=22241 + + (199) https://bugs.python.org/issue?@action=redirect&bpo=23517 + + (200) https://bugs.python.org/issue?@action=redirect&bpo=23552 + + (201) https://bugs.python.org/issue?@action=redirect&bpo=24633 + + (202) https://bugs.python.org/issue?@action=redirect&bpo=24879 + + (203) https://bugs.python.org/issue?@action=redirect&bpo=24874 + + (204) https://bugs.python.org/issue?@action=redirect&bpo=20059 + + (205) https://bugs.python.org/issue?@action=redirect&bpo=24360 + + (206) https://bugs.python.org/issue?@action=redirect&bpo=23426 + + (207) https://bugs.python.org/issue?@action=redirect&bpo=13938 + + (208) https://bugs.python.org/issue?@action=redirect&bpo=2091 + + (209) https://bugs.python.org/issue?@action=redirect&bpo=8585 + + (210) https://bugs.python.org/issue?@action=redirect&bpo=18622 + + (211) https://bugs.python.org/issue?@action=redirect&bpo=24426 + + (212) https://bugs.python.org/issue?@action=redirect&bpo=23661 + + (213) https://bugs.python.org/issue?@action=redirect&bpo=13248 + + (214) https://bugs.python.org/issue?@action=redirect&bpo=25578 + + (215) https://bugs.python.org/issue?@action=redirect&bpo=25530 + + (216) https://bugs.python.org/issue?@action=redirect&bpo=25569 + + (217) https://bugs.python.org/issue?@action=redirect&bpo=25471 + + (218) https://bugs.python.org/issue?@action=redirect&bpo=25319 + + (219) https://bugs.python.org/issue?@action=redirect&bpo=26050 + + (220) https://bugs.python.org/issue?@action=redirect&bpo=25924 + + (221) https://bugs.python.org/issue?@action=redirect&bpo=26406 + + (222) https://bugs.python.org/issue?@action=redirect&bpo=26848 + + (223) https://bugs.python.org/issue?@action=redirect&bpo=27040 + + (224) https://bugs.python.org/issue?@action=redirect&bpo=27041 + + +File: python.info, Node: IDLE<44>, Next: Documentation<55>, Prev: Library<61>, Up: Python 3 6 0 alpha 1 + +1.21.70.4 IDLE +.............. + + - bpo-20640(1): Add tests for idlelib.configHelpSourceEdit. Patch by + Saimadhav Heblikar. + + - In the ‘IDLE-console differences’ section of the IDLE doc, clarify + how running with IDLE affects sys.modules and the standard streams. + + - bpo-25507(2): fix incorrect change in IOBinding that prevented + printing. Augment IOBinding htest to include all major IOBinding + functions. + + - bpo-25905(3): 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’. + + - bpo-15348(4): 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. + + - bpo-24455(5): 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. + + - 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. + + - bpo-24750(6): Improve the appearance of the IDLE editor window + status bar. Patch by Mark Roseman. + + - bpo-25313(7): 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. + + - bpo-24782(8): 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. + + - bpo-22726(9): Re-activate the config dialog help button with some + content about the other buttons and the new IDLE Dark theme. + + - bpo-24820(10): 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. + + - bpo-25224(11): 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’. + + - bpo-24820(12): Users can now set breakpoint colors in Settings -> + Custom Highlighting. Original patch by Mark Roseman. + + - bpo-24972(13): 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. + + - bpo-24570(14): Idle: make calltip and completion boxes appear on + Macs affected by a tk regression. Initial patch by Mark Roseman. + + - bpo-24988(15): Idle ScrolledList context menus (used in debugger) + now work on Mac Aqua. Patch by Mark Roseman. + + - bpo-24801(16): Make right-click for context menu work on Mac Aqua. + Patch by Mark Roseman. + + - bpo-25173(17): Associate tkinter messageboxes with a specific + widget. For Mac OSX, make them a ‘sheet’. Patch by Mark Roseman. + + - bpo-25198(18): 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. + + - bpo-25225(19): Condense and rewrite Idle doc section on text + colors. + + - bpo-21995(20): Explain some differences between IDLE and console + Python. + + - bpo-22820(21): Explain need for `print' when running file from Idle + editor. + + - bpo-25224(22): Doc: augment Idle feature list and no-subprocess + section. + + - bpo-25219(23): Update doc for Idle command line options. Some were + missing and notes were not correct. + + - bpo-24861(24): Most of idlelib is private and subject to change. + Use idleib.idle.* to start Idle. See idlelib.__init__.__doc__. + + - bpo-25199(25): Idle: add synchronization comments for future + maintainers. + + - bpo-16893(26): 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. + + - bpo-24199(27): Deprecate unused idlelib.idlever with possible + removal in 3.6. + + - bpo-24790(28): Remove extraneous code (which also create 2 & 3 + conflicts). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20640 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25507 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25905 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=15348 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24455 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24750 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=25313 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=24782 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=22726 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=24820 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25224 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=24820 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=24972 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=24570 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=24988 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24801 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=25173 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=25198 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=25225 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=21995 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=22820 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=25224 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=25219 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=24861 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=25199 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=16893 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=24199 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=24790 + + +File: python.info, Node: Documentation<55>, Next: Tests<56>, Prev: IDLE<44>, Up: Python 3 6 0 alpha 1 + +1.21.70.5 Documentation +....................... + + - bpo-26736(1): Used HTTPS for external links in the documentation if + possible. + + - bpo-6953(2): Rework the Readline module documentation to group + related functions together, and add more details such as what + underlying Readline functions and variables are accessed. + + - bpo-23606(3): Adds note to ctypes documentation regarding + cdll.msvcrt. + + - bpo-24952(4): Clarify the default size argument of stack_size() in + the “threading” and “_thread” modules. Patch from Mattip. + + - bpo-26014(5): 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 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26736 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=6953 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23606 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24952 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26014 + + +File: python.info, Node: Tests<56>, Next: Build<61>, Prev: Documentation<55>, Up: Python 3 6 0 alpha 1 + +1.21.70.6 Tests +............... + + - bpo-21916(1): Added tests for the turtle module. Patch by ingrid, + Gregory Loyse and Jelle Zijlstra. + + - bpo-26295(2): When using “python3 -m test –testdir=TESTDIR”, + regrtest doesn’t add “test.” prefix to test module names. + + - bpo-26523(3): The multiprocessing thread pool + (multiprocessing.dummy.Pool) was untested. + + - bpo-26015(4): Added new tests for pickling iterators of mutable + sequences. + + - bpo-26325(5): Added test.support.check_no_resource_warning() to + check that no ResourceWarning is emitted. + + - bpo-25940(6): Changed test_ssl to use its internal local server + more. This avoids relying on svn.python.org, which recently + changed root certificate. + + - bpo-25616(7): Tests for OrderedDict are extracted from + test_collections into separate file test_ordered_dict. + + - bpo-25449(8): Added tests for OrderedDict subclasses. + + - bpo-25188(9): 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. + + - bpo-22806(10): Add ‘python -m test --list-tests’ command to list + tests. + + - bpo-18174(11): ‘python -m test --huntrleaks ...’ now also checks + for leak of file descriptors. Patch written by Richard Oudkerk. + + - bpo-25260(12): Fix ‘python -m test --coverage’ on Windows. Remove + the list of ignored directories. + + - ‘PCbuild\rt.bat’ now accepts an unlimited number of arguments to + pass along to regrtest.py. Previously there was a limit of 9. + + - bpo-26583(13): Skip test_timestamp_overflow in test_import if + bytecode files cannot be written. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21916 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26295 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26523 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26015 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26325 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25940 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=25616 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=25449 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25188 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=22806 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=18174 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25260 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26583 + + +File: python.info, Node: Build<61>, Next: Windows<53>, Prev: Tests<56>, Up: Python 3 6 0 alpha 1 + +1.21.70.7 Build +............... + + - bpo-21277(1): Don’t try to link _ctypes with a ffi_convenience + library. + + - bpo-26884(2): Fix linking extension modules for cross builds. + Patch by Xavier de Gaye. + + - bpo-26932(3): Fixed support of RTLD_* constants defined as enum + values, not via macros (in particular on Android). Patch by Chi + Hsuan Yen. + + - bpo-22359(4): 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. + + - bpo-21668(5): Link audioop, _datetime, _ctypes_test modules to + libm, except on Mac OS X. Patch written by Chi Hsuan Yen. + + - bpo-25702(6): 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. + + - bpo-26624(7): Adds validation of ucrtbase[d].dll version with + warning for old versions. + + - bpo-17603(8): Avoid error about nonexistent fileblocks.o file by + using a lower-level check for st_blocks in struct stat. + + - bpo-26079(9): Fixing the build output folder for tix-8.4.3.6. + Patch by Bjoern Thiel. + + - bpo-26465(10): Update Windows builds to use OpenSSL 1.0.2g. + + - bpo-25348(11): Added ‘--pgo’ and ‘--pgo-job’ arguments to + ‘PCbuild\build.bat’ for building with Profile-Guided Optimization. + The old ‘PCbuild\build_pgo.bat’ script is removed. + + - bpo-25827(12): Add support for building with ICC to ‘configure’, + including a new ‘--with-icc’ flag. + + - bpo-25696(13): Fix installation of Python on UNIX with make -j9. + + - bpo-24986(14): It is now possible to build Python on Windows + without errors when external libraries are not available. + + - bpo-24421(15): Compile Modules/_math.c once, before building + extensions. Previously it could fail to compile properly if the + math and cmath builds were concurrent. + + - bpo-26465(16): Update OS X 10.5+ 32-bit-only installer to build and + link with OpenSSL 1.0.2g. + + - bpo-26268(17): Update Windows builds to use OpenSSL 1.0.2f. + + - bpo-25136(18): Support Apple Xcode 7’s new textual SDK stub + libraries. + + - bpo-24324(19): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21277 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26884 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26932 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22359 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=21668 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25702 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26624 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=17603 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26079 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=26465 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25348 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25827 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25696 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=24986 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=24421 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=26465 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=26268 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=25136 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=24324 + + +File: python.info, Node: Windows<53>, Next: Tools/Demos<31>, Prev: Build<61>, Up: Python 3 6 0 alpha 1 + +1.21.70.8 Windows +................. + + - bpo-27053(1): Updates make_zip.py to correctly generate library ZIP + file. + + - bpo-26268(2): 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). + + - bpo-26071(3): bdist_wininst created binaries fail to start and find + 32bit Python + + - bpo-26073(4): Update the list of magic numbers in launcher + + - bpo-26065(5): Excludes venv from library when generating embeddable + distro. + + - bpo-25022(6): Removed very outdated PC/example_nt/ directory. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27053 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26268 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26071 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26073 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26065 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25022 + + +File: python.info, Node: Tools/Demos<31>, Next: C API<49>, Prev: Windows<53>, Up: Python 3 6 0 alpha 1 + +1.21.70.9 Tools/Demos +..................... + + - bpo-26799(1): 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. + + - bpo-26271(2): Fix the Freeze tool to properly use flags passed + through configure. Patch by Daniel Shaulov. + + - bpo-26489(3): Add dictionary unpacking support to + Tools/parser/unparse.py. Patch by Guo Ci Teo. + + - bpo-26316(4): Fix variable name typo in Argument Clinic. + + - bpo-25440(5): Fix output of python-config –extension-suffix. + + - bpo-25154(6): The pyvenv script has been deprecated in favour of + ‘python3 -m venv’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26799 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26271 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26489 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26316 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25440 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25154 + + +File: python.info, Node: C API<49>, Prev: Tools/Demos<31>, Up: Python 3 6 0 alpha 1 + +1.21.70.10 C API +................ + + - bpo-26312(1): SystemError is now raised in all programming bugs + with using PyArg_ParseTupleAndKeywords(). RuntimeError did raised + before in some programming bugs. + + - bpo-26198(2): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26312 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26198 + + +File: python.info, Node: Python 3 5 5 final, Next: Python 3 5 5 release candidate 1, Prev: Python 3 6 0 alpha 1, Up: Changelog + +1.21.71 Python 3.5.5 final +-------------------------- + +`Release date: 2018-02-04' + +There were no new changes in version 3.5.5. + + +File: python.info, Node: Python 3 5 5 release candidate 1, Next: Python 3 5 4 final, Prev: Python 3 5 5 final, Up: Changelog + +1.21.72 Python 3.5.5 release candidate 1 +---------------------------------------- + +`Release date: 2018-01-23' + +* Menu: + +* Security: Security<33>. +* Core and Builtins: Core and Builtins<63>. +* Library: Library<62>. + + +File: python.info, Node: Security<33>, Next: Core and Builtins<63>, Up: Python 3 5 5 release candidate 1 + +1.21.72.1 Security +.................. + + - bpo-32551(1): The ‘sys.path[0]’ initialization change for + bpo-29139(2) caused a regression by revealing an inconsistency in + how sys.path is initialized when executing ‘__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 ‘sys.path’, and ensures no other ‘sys.path’ entries + are inadvertently modified when inserting the import location named + on the command line. (Originally reported as bpo-29723(3) against + Python 3.6rc1, but it was missed at the time that the then upcoming + Python 3.5.4 release would also be affected) + + - bpo-30657(4): Fixed possible integer overflow in + PyBytes_DecodeEscape, CVE-2017-1000158. Original patch by Jay + Bosamiya; rebased to Python 3 by Miro Hrončok. + + - bpo-30947(5): Upgrade libexpat embedded copy from version 2.2.1 to + 2.2.3 to get security fixes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32551 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29139 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29723 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30657 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30947 + + +File: python.info, Node: Core and Builtins<63>, Next: Library<62>, Prev: Security<33>, Up: Python 3 5 5 release candidate 1 + +1.21.72.2 Core and Builtins +........................... + + - bpo-31095(1): Fix potential crash during GC caused by ‘tp_dealloc’ + which doesn’t call ‘PyObject_GC_UnTrack()’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=31095 + + +File: python.info, Node: Library<62>, Prev: Core and Builtins<63>, Up: Python 3 5 5 release candidate 1 + +1.21.72.3 Library +................. + + - bpo-32072(1): 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. + + - bpo-31170(2): expat: Update libexpat from 2.2.3 to 2.2.4. Fix + copying of partial characters for UTF-8 input (libexpat bug 115): + ‘https://github.com/libexpat/libexpat/issues/115’ + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=32072 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=31170 + + +File: python.info, Node: Python 3 5 4 final, Next: Python 3 5 4 release candidate 1, Prev: Python 3 5 5 release candidate 1, Up: Changelog + +1.21.73 Python 3.5.4 final +-------------------------- + +`Release date: 2017-08-07' + +* Menu: + +* Library: Library<63>. + + +File: python.info, Node: Library<63>, Up: Python 3 5 4 final + +1.21.73.1 Library +................. + + - bpo-30119(1): ftplib.FTP.putline() now throws ValueError on + commands that contains CR or LF. Patch by Dong-hee Na. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30119 + + +File: python.info, Node: Python 3 5 4 release candidate 1, Next: Python 3 5 3 final, Prev: Python 3 5 4 final, Up: Changelog + +1.21.74 Python 3.5.4 release candidate 1 +---------------------------------------- + +`Release date: 2017-07-23' + +* Menu: + +* Security: Security<34>. +* Core and Builtins: Core and Builtins<64>. +* Library: Library<64>. +* Documentation: Documentation<56>. +* Tests: Tests<57>. +* Build: Build<62>. +* Windows: Windows<54>. +* C API: C API<50>. + + +File: python.info, Node: Security<34>, Next: Core and Builtins<64>, Up: Python 3 5 4 release candidate 1 + +1.21.74.1 Security +.................. + + - bpo-30730(1): Prevent environment variables injection in subprocess + on Windows. Prevent passing other environment variables and + command arguments. + + - bpo-30694(2): Upgrade expat copy from 2.2.0 to 2.2.1 to get fixes + of multiple security vulnerabilities including: CVE-2017-9233 + (External entity infinite loop DoS), CVE-2016-9063 (Integer + overflow, re-fix), CVE-2016-0718 (Fix regression bugs from 2.2.0’s + fix to CVE-2016-0718) and CVE-2012-0876 (Counter hash flooding with + SipHash). Note: the 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 + ‘XML_SetHashSalt()’. + + - bpo-30500(3): Fix urllib.parse.splithost() to correctly parse + fragments. For example, ‘splithost('//127.0.0.1#@evil.com/')’ now + correctly returns the ‘127.0.0.1’ host, instead of treating + ‘@evil.com’ as the host in an authentication (‘login@host’). + + - bpo-29591(4): Update expat copy from 2.1.1 to 2.2.0 to get fixes of + CVE-2016-0718 and CVE-2016-4472. See + ‘https://sourceforge.net/p/expat/bugs/537/’ for more information. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30730 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30694 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30500 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29591 + + +File: python.info, Node: Core and Builtins<64>, Next: Library<64>, Prev: Security<34>, Up: Python 3 5 4 release candidate 1 + +1.21.74.2 Core and Builtins +........................... + + - bpo-30876(1): 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. + + - bpo-30765(2): Avoid blocking in pthread_mutex_lock() when + PyThread_acquire_lock() is asked not to block. + + - bpo-27945(3): Fixed various segfaults with dict when input + collections are mutated during searching, inserting or comparing. + Based on patches by Duane Griffin and Tim Mitchell. + + - bpo-25794(4): Fixed type.__setattr__() and type.__delattr__() for + non-interned attribute names. Based on patch by Eryk Sun. + + - bpo-29935(5): Fixed error messages in the index() method of tuple, + list and deque when pass indices of wrong type. + + - bpo-28876(6): ‘bool(range)’ works even if ‘len(range)’ raises *note + OverflowError: 4a4. + + - bpo-29600(7): Fix wrapping coroutine return values in + StopIteration. + + - bpo-29537(8): 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. + + - bpo-28598(9): Support __rmod__ for subclasses of str being called + before str.__mod__. Patch by Martijn Pieters. + + - bpo-29602(10): Fix incorrect handling of signed zeros in complex + constructor for complex subclasses and for inputs having a + __complex__ method. Patch by Serhiy Storchaka. + + - bpo-29347(11): Fixed possibly dereferencing undefined pointers when + creating weakref objects. + + - bpo-29438(12): Fixed use-after-free problem in key sharing dict. + + - bpo-29319(13): Prevent RunMainFromImporter overwriting sys.path[0]. + + - bpo-29337(14): Fixed possible BytesWarning when compare the code + objects. Warnings could be emitted at compile time. + + - bpo-29478(15): If max_line_length=None is specified while using the + Compat32 policy, it is no longer ignored. Patch by Mircea Cosbuc. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30876 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30765 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27945 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25794 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29935 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28876 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=29600 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29537 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28598 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=29602 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=29347 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=29438 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=29319 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=29337 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=29478 + + +File: python.info, Node: Library<64>, Next: Documentation<56>, Prev: Core and Builtins<64>, Up: Python 3 5 4 release candidate 1 + +1.21.74.3 Library +................. + + - bpo-29403(1): Fix ‘unittest.mock’’s autospec to not fail on + method-bound builtin functions. Patch by Aaron Gallagher. + + - bpo-30961(2): Fix decrementing a borrowed reference in tracemalloc. + + - bpo-30886(3): 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. + + - bpo-29854(4): Fix segfault in readline when using readline’s + history-size option. Patch by Nir Soffer. + + - bpo-30807(5): 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. + + - bpo-30441(6): Fix bug when modifying os.environ while iterating + over it + + - bpo-30532(7): Fix email header value parser dropping folding white + space in certain cases. + + - bpo-29169(8): Update zlib to 1.2.11. + + - bpo-30879(9): os.listdir() and os.scandir() now emit bytes names + when called with bytes-like argument. + + - bpo-30746(10): Prohibited the ‘=’ character in environment variable + names in ‘os.putenv()’ and ‘os.spawn*()’. + + - bpo-29755(11): Fixed the lgettext() family of functions in the + gettext module. They now always return bytes. + + - bpo-30645(12): Fix path calculation in imp.load_package(), fixing + it for cases when a package is only shipped with bytecodes. Patch + by Alexandru Ardelean. + + - bpo-23890(13): unittest.TestCase.assertRaises() now manually breaks + a reference cycle to not keep objects alive longer than expected. + + - bpo-30149(14): inspect.signature() now supports callables with + variable-argument parameters wrapped with partialmethod. Patch by + Dong-hee Na. + + - bpo-29931(15): Fixed comparison check for ipaddress.ip_interface + objects. Patch by Sanjay Sundaresan. + + - bpo-24484(16): Avoid race condition in multiprocessing cleanup. + + - bpo-28994(17): The traceback no longer displayed for SystemExit + raised in a callback registered by atexit. + + - bpo-30508(18): Don’t log exceptions if Task/Future “cancel()” + method was called. + + - bpo-28556(19): Updates to typing module: Add generic + AsyncContextManager, add support for ContextManager on all + versions. Original PRs by Jelle Zijlstra and Ivan Levkivskyi + + - bpo-29870(20): Fix ssl sockets leaks when connection is aborted in + asyncio/ssl implementation. Patch by Michaël Sghaïer. + + - bpo-29743(21): Closing transport during handshake process leaks + open socket. Patch by Nikolay Kim + + - bpo-27585(22): Fix waiter cancellation in asyncio.Lock. Patch by + Mathieu Sornay. + + - bpo-30418(23): On Windows, subprocess.Popen.communicate() now also + ignore EINVAL on stdin.write() if the child process is still + running but closed the pipe. + + - bpo-30378(24): Fix the problem that logging.handlers.SysLogHandler + cannot handle IPv6 addresses. + + - bpo-29960(25): Preserve generator state when + _random.Random.setstate() raises an exception. Patch by Bryan + Olson. + + - bpo-30414(26): multiprocessing.Queue._feed background running + thread do not break from main loop on exception. + + - bpo-30003(27): Fix handling escape characters in HZ codec. Based + on patch by Ma Lin. + + - bpo-30301(28): Fix AttributeError when using SimpleQueue.empty() + under `spawn' and `forkserver' start methods. + + - bpo-30329(29): 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. + + - bpo-30375(30): 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. + + - bpo-30048(31): Fixed ‘Task.cancel()’ can be ignored when the task + is running coroutine and the coroutine returned without any more + ‘await’. + + - bpo-29990(32): Fix range checking in GB18030 decoder. Original + patch by Ma Lin. + + - bpo-26293(33): Change resulted because of zipfile breakage. (See + also: bpo-29094(34)) + + - bpo-30243(35): 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. + + - bpo-30185(36): Avoid KeyboardInterrupt tracebacks in forkserver + helper process when Ctrl-C is received. + + - bpo-28556(37): Various updates to typing module: add + typing.NoReturn type, use WrapperDescriptorType, minor bug-fixes. + Original PRs by Jim Fasarakis-Hilliard and Ivan Levkivskyi. + + - bpo-30205(38): Fix getsockname() for unbound AF_UNIX sockets on + Linux. + + - bpo-30070(39): Fixed leaks and crashes in errors handling in the + parser module. + + - bpo-30061(40): 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(). + + - bpo-30068(41): _io._IOBase.readlines will check if it’s closed + first when hint is present. + + - bpo-29694(42): Fixed race condition in pathlib mkdir with flags + parents=True. Patch by Armin Rigo. + + - bpo-29692(43): Fixed arbitrary unchaining of RuntimeError + exceptions in contextlib.contextmanager. Patch by Siddharth + Velankar. + + - bpo-29998(44): Pickling and copying ImportError now preserves name + and path attributes. + + - bpo-29942(45): Fix a crash in itertools.chain.from_iterable when + encountering long runs of empty iterables. + + - bpo-27863(46): Fixed multiple crashes in ElementTree caused by race + conditions and wrong types. + + - bpo-28699(47): 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. + + - bpo-25803(48): Avoid incorrect errors raised by + Path.mkdir(exist_ok=True) when the OS gives priority to errors such + as EACCES over EEXIST. + + - bpo-29861(49): Release references to tasks, their arguments and + their results as soon as they are finished in multiprocessing.Pool. + + - bpo-29884(50): faulthandler: Restore the old sigaltstack during + teardown. Patch by Christophe Zeitouny. + + - bpo-25455(51): Fixed crashes in repr of recursive buffered + file-like objects. + + - bpo-29800(52): Fix crashes in partial.__repr__ if the keys of + partial.keywords are not strings. Patch by Michael Seifert. + + - bpo-29742(53): get_extra_info() raises exception if get called on + closed ssl transport. Patch by Nikolay Kim. + + - bpo-8256(54): Fixed possible failing or crashing input() if + attributes “encoding” or “errors” of sys.stdin or sys.stdout are + not set or are not strings. + + - bpo-28298(55): Fix a bug that prevented array ‘Q’, ‘L’ and ‘I’ from + accepting big intables (objects that have __int__) as elements. + Patch by Oren Milman. + + - bpo-29615(56): SimpleXMLRPCDispatcher no longer chains KeyError (or + any other exception) to exception(s) raised in the dispatched + methods. Patch by Petr Motejlek. + + - bpo-29704(57): asyncio.subprocess.SubprocessStreamProtocol no + longer closes before all pipes are closed. + + - bpo-29703(58): Fix asyncio to support instantiation of new event + loops in child processes. + + - bpo-29376(59): Fix assertion error in + threading._DummyThread.is_alive(). + + - bpo-29110(60): 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. + + - bpo-28961(61): Fix unittest.mock._Call helper: don’t ignore the + name parameter anymore. Patch written by Jiajun Huang. + + - bpo-29532(62): Altering a kwarg dictionary passed to + functools.partial() no longer affects a partial object after + creation. + + - bpo-28556(63): 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. + + - bpo-29100(64): Fix datetime.fromtimestamp() regression introduced + in Python 3.6.0: check minimum and maximum years. + + - bpo-29519(65): Fix weakref spewing exceptions during interpreter + shutdown when used with a rare combination of multiprocessing and + custom codecs. + + - bpo-29416(66): Prevent infinite loop in pathlib.Path.mkdir + + - bpo-29444(67): Fixed out-of-bounds buffer access in the group() + method of the match object. Based on patch by WGH. + + - bpo-29335(68): Fix subprocess.Popen.wait() when the child process + has exited to a stopped instead of terminated state (ex: when under + ptrace). + + - bpo-29290(69): Fix a regression in argparse that help messages + would wrap at non-breaking spaces. + + - bpo-28735(70): Fixed the comparison of mock.MagickMock with + mock.ANY. + + - bpo-29011(71): Fix an important omission by adding Deque to the + typing module. + + - bpo-29219(72): Fixed infinite recursion in the repr of + uninitialized ctypes.CDLL instances. + + - bpo-28969(73): 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. + + - bpo-29142(74): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29403 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30961 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30886 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29854 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30807 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30441 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=30532 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=29169 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=30879 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=30746 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=29755 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=30645 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=23890 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=30149 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=29931 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24484 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=28994 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=30508 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=29870 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=29743 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=27585 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=30418 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=30378 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=29960 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=30414 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=30003 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=30301 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=30329 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=30375 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=30048 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=29990 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=26293 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=29094 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=30243 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=30185 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=30205 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=30070 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=30061 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=30068 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=29694 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=29692 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=29998 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=29942 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=27863 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=28699 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=25803 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=29861 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=29884 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=25455 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=29800 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=29742 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=8256 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=28298 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=29615 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=29704 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=29703 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=29376 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=29110 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=28961 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=29532 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=28556 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=29100 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=29519 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=29416 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=29444 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=29335 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=29290 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=28735 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=29011 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=29219 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=28969 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=29142 + + +File: python.info, Node: Documentation<56>, Next: Tests<57>, Prev: Library<64>, Up: Python 3 5 4 release candidate 1 + +1.21.74.4 Documentation +....................... + + - bpo-30176(1): Add missing attribute related constants in curses + documentation. + + - bpo-26985(2): Add missing info of code object in inspect + documentation. + + - bpo-28929(3): Link the documentation to its source file on GitHub. + + - bpo-25008(4): Document smtpd.py as effectively deprecated and add a + pointer to aiosmtpd, a third-party asyncio-based replacement. + + - bpo-26355(5): Add canonical header link on each page to + corresponding major version of the documentation. Patch by + Matthias Bussonnier. + + - bpo-29349(6): Fix Python 2 syntax in code for building the + documentation. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30176 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26985 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28929 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25008 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26355 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=29349 + + +File: python.info, Node: Tests<57>, Next: Build<62>, Prev: Documentation<56>, Up: Python 3 5 4 release candidate 1 + +1.21.74.5 Tests +............... + + - bpo-30822(1): Fix regrtest command line parser to allow passing -u + extralargefile to run test_zipfile64. + + - bpo-30383(2): 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(3)), –matchfile (load a list + of test filters from a text file, bpo-30540(4)), –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(5)). + + - bpo-30357(6): 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. + + - bpo-28087(7): 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. + + - bpo-30197(8): 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. + + - bpo-29571(9): to match the behaviour of the ‘re.LOCALE’ flag, + test_re.test_locale_flag now uses + ‘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) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30822 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=30383 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=30523 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=30540 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=30675 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=30357 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28087 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=30197 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=29571 + + +File: python.info, Node: Build<62>, Next: Windows<54>, Prev: Tests<57>, Up: Python 3 5 4 release candidate 1 + +1.21.74.6 Build +............... + + - bpo-29243(1): Prevent unnecessary rebuilding of Python during ‘make + test’, ‘make install’ and some other make targets when configured + with ‘--enable-optimizations’. + + - bpo-23404(2): Don’t regenerate generated files based on file + modification time anymore: the action is now explicit. Replace + ‘make touch’ with ‘make regen-all’. + + - bpo-29643(3): Fix ‘--enable-optimization’ didn’t work. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29243 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23404 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=29643 + + +File: python.info, Node: Windows<54>, Next: C API<50>, Prev: Build<62>, Up: Python 3 5 4 release candidate 1 + +1.21.74.7 Windows +................. + + - bpo-30687(1): Locate msbuild.exe on Windows when building rather + than vcvarsall.bat + + - bpo-29392(2): Prevent crash when passing invalid arguments into + msvcrt module. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=30687 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29392 + + +File: python.info, Node: C API<50>, Prev: Windows<54>, Up: Python 3 5 4 release candidate 1 + +1.21.74.8 C API +............... + + - bpo-27867(1): 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. + + - bpo-29083(2): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27867 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29083 + + +File: python.info, Node: Python 3 5 3 final, Next: Python 3 5 3 release candidate 1, Prev: Python 3 5 4 release candidate 1, Up: Changelog + +1.21.75 Python 3.5.3 final +-------------------------- + +`Release date: 2017-01-17' + +There were no code changes between 3.5.3rc1 and 3.5.3 final. + + +File: python.info, Node: Python 3 5 3 release candidate 1, Next: Python 3 5 2 final, Prev: Python 3 5 3 final, Up: Changelog + +1.21.76 Python 3.5.3 release candidate 1 +---------------------------------------- + +`Release date: 2017-01-02' + +* Menu: + +* Security: Security<35>. +* Core and Builtins: Core and Builtins<65>. +* Library: Library<65>. +* IDLE: IDLE<45>. +* C API: C API<51>. +* Documentation: Documentation<57>. +* Tests: Tests<58>. +* Tools/Demos: Tools/Demos<32>. +* Windows: Windows<55>. +* Build: Build<63>. + + +File: python.info, Node: Security<35>, Next: Core and Builtins<65>, Up: Python 3 5 3 release candidate 1 + +1.21.76.1 Security +.................. + + - bpo-27278(1): 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. + + - bpo-22636(2): Avoid shell injection problems with + ctypes.util.find_library(). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27278 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22636 + + +File: python.info, Node: Core and Builtins<65>, Next: Library<65>, Prev: Security<35>, Up: Python 3 5 3 release candidate 1 + +1.21.76.2 Core and Builtins +........................... + + - bpo-29073(1): bytearray formatting no longer truncates on first + null byte. + + - bpo-28932(2): Do not include if it does not exist. + + - bpo-28147(3): Fix a memory leak in split-table dictionaries: + setattr() must not convert combined table into split table. + + - bpo-25677(4): Correct the positioning of the syntax error caret for + indented blocks. Based on patch by Michael Layzell. + + - bpo-29000(5): Fixed bytes formatting of octals with zero padding in + alternate form. + + - bpo-28512(6): Fixed setting the offset attribute of SyntaxError by + PyErr_SyntaxLocationEx() and PyErr_SyntaxLocationObject(). + + - bpo-28991(7): functools.lru_cache() was susceptible to an obscure + reentrancy bug caused by a monkey-patched len() function. + + - bpo-28648(8): Fixed crash in Py_DecodeLocale() in debug build on + Mac OS X when decode astral characters. Patch by Xiang Zhang. + + - bpo-19398(9): Extra slash no longer added to sys.path components in + case of empty compile-time PYTHONPATH components. + + - bpo-28426(10): Fixed potential crash in PyUnicode_AsDecodedObject() + in debug build. + + - bpo-23782(11): Fixed possible memory leak in _PyTraceback_Add() and + exception loss in PyTraceBack_Here(). + + - bpo-28379(12): Added sanity checks and tests for + PyUnicode_CopyCharacters(). Patch by Xiang Zhang. + + - bpo-28376(13): The type of long range iterator is now registered as + Iterator. Patch by Oren Milman. + + - bpo-28376(14): The constructor of range_iterator now checks that + step is not 0. Patch by Oren Milman. + + - bpo-26906(15): Resolving special methods of uninitialized type now + causes implicit initialization of the type instead of a fail. + + - bpo-18287(16): PyType_Ready() now checks that tp_name is not NULL. + Original patch by Niklas Koep. + + - bpo-24098(17): Fixed possible crash when AST is changed in process + of compiling it. + + - bpo-28350(18): String constants with null character no longer + interned. + + - bpo-26617(19): Fix crash when GC runs during weakref callbacks. + + - bpo-27942(20): String constants now interned recursively in tuples + and frozensets. + + - bpo-21578(21): Fixed misleading error message when ImportError + called with invalid keyword args. + + - bpo-28203(22): Fix incorrect type in error message from + ‘complex(1.0, {2:3})’. Patch by Soumya Sharma. + + - bpo-27955(23): Fallback on reading /dev/urandom device when the + getrandom() syscall fails with EPERM, for example when blocked by + SECCOMP. + + - bpo-28131(24): Fix a regression in zipimport’s compile_source(). + zipimport should use the same optimization level as the + interpreter. + + - bpo-25221(25): Fix corrupted result from PyLong_FromLong(0) when + Python is compiled with NSMALLPOSINTS = 0. + + - bpo-25758(26): Prevents zipimport from unnecessarily encoding a + filename (patch by Eryk Sun) + + - bpo-28189(27): dictitems_contains no longer swallows compare + errors. (Patch by Xiang Zhang) + + - bpo-27812(28): Properly clear out a generator’s frame’s + backreference to the generator to prevent crashes in frame.clear(). + + - bpo-27811(29): Fix a crash when a coroutine that has not been + awaited is finalized with warnings-as-errors enabled. + + - bpo-27587(30): Fix another issue found by PVS-Studio: Null pointer + check after use of ‘def’ in _PyState_AddModule(). Initial patch by + Christian Heimes. + + - bpo-26020(31): set literal evaluation order did not match + documented behaviour. + + - bpo-27782(32): Multi-phase extension module import now correctly + allows the ‘m_methods’ field to be used to add module level + functions to instances of non-module types returned from + ‘Py_create_mod’. Patch by Xiang Zhang. + + - bpo-27936(33): 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. + + - bpo-27487(34): 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. + + - bpo-27558(35): 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. + + - bpo-27419(36): 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. + + - bpo-27083(37): Respect the PYTHONCASEOK environment variable under + Windows. + + - bpo-27514(38): Make having too many statically nested blocks a + SyntaxError instead of SystemError. + + - bpo-27473(39): Fixed possible integer overflow in bytes and + bytearray concatenations. Patch by Xiang Zhang. + + - bpo-27507(40): Add integer overflow check in bytearray.extend(). + Patch by Xiang Zhang. + + - bpo-27581(41): Don’t rely on wrapping for overflow check in + PySequence_Tuple(). Patch by Xiang Zhang. + + - bpo-27443(42): __length_hint__() of bytearray iterators no longer + return a negative integer for a resized bytearray. + + - bpo-27942(43): Fix memory leak in codeobject.c + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29073 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28932 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=28147 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25677 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=29000 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28512 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28991 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28648 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=19398 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=28426 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23782 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28379 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=28376 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28376 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=26906 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=18287 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=24098 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28350 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26617 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=27942 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=21578 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28203 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=27955 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=28131 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=25221 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=25758 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=28189 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=27812 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=27811 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=27587 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=26020 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=27782 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=27936 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=27487 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=27558 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=27419 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=27083 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=27514 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=27473 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=27507 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=27581 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=27443 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=27942 + + +File: python.info, Node: Library<65>, Next: IDLE<45>, Prev: Core and Builtins<65>, Up: Python 3 5 3 release candidate 1 + +1.21.76.3 Library +................. + + - bpo-15812(1): inspect.getframeinfo() now correctly shows the first + line of a context. Patch by Sam Breese. + + - bpo-29094(2): Offsets in a ZIP file created with extern file object + and modes “w” and “x” now are relative to the start of the file. + + - bpo-13051(3): Fixed recursion errors in large or resized + curses.textpad.Textbox. Based on patch by Tycho Andersen. + + - bpo-29119(4): Fix weakrefs in the pure python version of + collections.OrderedDict move_to_end() method. Contributed by Andra + Bogildea. + + - bpo-9770(5): curses.ascii predicates now work correctly with + negative integers. + + - bpo-28427(6): old keys should not remove new values from + WeakValueDictionary when collecting from another thread. + + - bpo-28923(7): Remove editor artifacts from Tix.py. + + - bpo-28871(8): Fixed a crash when deallocate deep ElementTree. + + - bpo-19542(9): Fix bugs in WeakValueDictionary.setdefault() and + WeakValueDictionary.pop() when a GC collection happens in another + thread. + + - bpo-20191(10): Fixed a crash in resource.prlimit() when pass a + sequence that doesn’t own its elements as limits. + + - bpo-28779(11): multiprocessing.set_forkserver_preload() would crash + the forkserver process if a preloaded module instantiated some + multiprocessing objects such as locks. + + - bpo-28847(12): dbm.dumb now supports reading read-only files and no + longer writes the index file when it is not changed. + + - bpo-25659(13): In ctypes, prevent a crash calling the from_buffer() + and from_buffer_copy() methods on abstract classes like Array. + + - bpo-28732(14): Fix crash in os.spawnv() with no elements in args + + - bpo-28485(15): Always raise ValueError for negative + compileall.compile_dir(workers=…) parameter, even when + multithreading is unavailable. + + - bpo-28387(16): Fixed possible crash in _io.TextIOWrapper + deallocator when the garbage collector is invoked in other thread. + Based on patch by Sebastian Cufre. + + - bpo-27517(17): LZMA compressor and decompressor no longer raise + exceptions if given empty data twice. Patch by Benjamin Fogle. + + - bpo-28549(18): Fixed segfault in curses’s addch() with ncurses6. + + - bpo-28449(19): 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. + + - bpo-23262(20): The webbrowser module now supports Firefox 36+ and + derived browsers. Based on patch by Oleg Broytman. + + - bpo-27939(21): 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. + + - bpo-28255(22): calendar.TextCalendar().prmonth() no longer prints a + space at the start of new line after printing a month’s calendar. + Patch by Xiang Zhang. + + - bpo-20491(23): The textwrap.TextWrapper class now honors + non-breaking spaces. Based on patch by Kaarle Ritvanen. + + - bpo-28353(24): os.fwalk() no longer fails on broken links. + + - bpo-25464(25): Fixed HList.header_exists() in tkinter.tix module by + addin a workaround to Tix library bug. + + - bpo-28488(26): shutil.make_archive() no longer add entry “./” to + ZIP archive. + + - bpo-24452(27): Make webbrowser support Chrome on Mac OS X. + + - bpo-20766(28): Fix references leaked by pdb in the handling of + SIGINT handlers. + + - bpo-26293(29): 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. + + - bpo-28321(30): Fixed writing non-BMP characters with binary format + in plistlib. + + - bpo-28322(31): Fixed possible crashes when unpickle itertools + objects from incorrect pickle data. Based on patch by John Leitch. + + - Fix possible integer overflows and crashes in the mmap module with + unusual usage patterns. + + - bpo-1703178(32): Fix the ability to pass the –link-objects option + to the distutils build_ext command. + + - bpo-28253(33): 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. + + - bpo-28275(34): Fixed possible use after free in the decompress() + methods of the LZMADecompressor and BZ2Decompressor classes. + Original patch by John Leitch. + + - bpo-27897(35): Fixed possible crash in + sqlite3.Connection.create_collation() if pass invalid string-like + object as a name. Patch by Xiang Zhang. + + - bpo-18893(36): Fix invalid exception handling in + Lib/ctypes/macholib/dyld.py. Patch by Madison May. + + - bpo-27611(37): Fixed support of default root window in the + tkinter.tix module. + + - bpo-27348(38): In the traceback module, restore the formatting of + exception messages like “Exception: None”. This fixes a regression + introduced in 3.5a2. + + - bpo-25651(39): Allow falsy values to be used for msg parameter of + subTest(). + + - bpo-27932(40): Prevent memory leak in win32_ver(). + + - Fix UnboundLocalError in socket._sendfile_use_sendfile. + + - bpo-28075(41): Check for ERROR_ACCESS_DENIED in Windows + implementation of os.stat(). Patch by Eryk Sun. + + - bpo-25270(42): Prevent codecs.escape_encode() from raising + SystemError when an empty bytestring is passed. + + - bpo-28181(43): Get antigravity over HTTPS. Patch by Kaartic + Sivaraam. + + - bpo-25895(44): Enable WebSocket URL schemes in + urllib.parse.urljoin. Patch by Gergely Imreh and Markus + Holtermann. + + - bpo-27599(45): Fixed buffer overrun in binascii.b2a_qp() and + binascii.a2b_qp(). + + - bpo-19003(46): m email.generator now replaces only ‘\r’ and/or ‘\n’ + line endings, per the RFC, instead of all unicode line endings. + + - bpo-28019(47): itertools.count() no longer rounds non-integer step + in range between 1.0 and 2.0 to 1. + + - bpo-25969(48): Update the lib2to3 grammar to handle the unpacking + generalizations added in 3.5. + + - bpo-14977(49): mailcap now respects the order of the lines in the + mailcap files (“first match”), as required by RFC 1542. Patch by + Michael Lazar. + + - bpo-24594(50): Validates persist parameter when opening MSI + database + + - bpo-17582(51): xml.etree.ElementTree nows preserves whitespaces in + attributes (Patch by Duane Griffin. Reviewed and approved by + Stefan Behnel.) + + - bpo-28047(52): Fixed calculation of line length used for the base64 + CTE in the new email policies. + + - bpo-27445(53): Don’t pass str(_charset) to MIMEText.set_payload(). + Patch by Claude Paroz. + + - bpo-22450(54): urllib now includes an ‘Accept: */*’ header among + the default headers. This makes the results of REST API requests + more consistent and predictable especially when proxy servers are + involved. + + - 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. + + - bpo-27570(55): Avoid zero-length memcpy() etc calls with null + source pointers in the “ctypes” and “array” modules. + + - bpo-22233(56): 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. + + - bpo-27988(57): Fix email iter_attachments incorrect mutation of + payload list. + + - bpo-27691(58): Fix ssl module’s parsing of GEN_RID subject + alternative name fields in X.509 certs. + + - bpo-27850(59): Remove 3DES from ssl module’s default cipher list to + counter measure sweet32 attack (CVE-2016-2183). + + - bpo-27766(60): Add ChaCha20 Poly1305 to ssl module’s default cipher + list. (Required OpenSSL 1.1.0 or LibreSSL). + + - bpo-26470(61): Port ssl and hashlib module to OpenSSL 1.1.0. + + - Remove support for passing a file descriptor to os.access. It + never worked but previously didn’t raise. + + - bpo-12885(62): Fix error when distutils encounters symlink. + + - bpo-27881(63): Fixed possible bugs when setting + sqlite3.Connection.isolation_level. Based on patch by Xiang Zhang. + + - bpo-27861(64): Fixed a crash in sqlite3.Connection.cursor() when a + factory creates not a cursor. Patch by Xiang Zhang. + + - bpo-19884(65): Avoid spurious output on OS X with Gnu Readline. + + - bpo-27706(66): 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. + + - bpo-10513(67): Fix a regression in Connection.commit(). Statements + should not be reset after a commit. + + - A new version of typing.py from ‘https://github.com/python/typing’: + Collection (only for 3.6) (bpo-27598(68)). Add FrozenSet to + __all__ (upstream #261). Fix crash in _get_type_vars() (upstream + #259). Remove the dict constraint in ForwardRef._eval_type + (upstream #252). + + - bpo-27539(69): Fix unnormalised ‘Fraction.__pow__’ result in the + case of negative exponent and negative base. + + - bpo-21718(70): cursor.description is now available for queries + using CTEs. + + - bpo-2466(71): posixpath.ismount now correctly recognizes mount + points which the user does not have permission to access. + + - bpo-27773(72): Correct some memory management errors + server_hostname in _ssl.wrap_socket(). + + - bpo-26750(73): unittest.mock.create_autospec() now works properly + for subclasses of property() and other data descriptors. + + - In the curses module, raise an error if window.getstr() or + window.instr() is passed a negative value. + + - bpo-27783(74): Fix possible usage of uninitialized memory in + operator.methodcaller. + + - bpo-27774(75): Fix possible Py_DECREF on unowned object in _sre. + + - bpo-27760(76): Fix possible integer overflow in binascii.b2a_qp. + + - bpo-27758(77): Fix possible integer overflow in the _csv module for + large record lengths. + + - bpo-27568(78): Prevent HTTPoxy attack (CVE-2016-1000110). Ignore + the HTTP_PROXY variable when REQUEST_METHOD environment is set, + which indicates that the script is in CGI mode. + + - bpo-27656(79): Do not assume sched.h defines any SCHED_* constants. + + - bpo-27130(80): 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. + + - bpo-27533(81): Release GIL in nt._isdir + + - bpo-17711(82): Fixed unpickling by the persistent ID with protocol + 0. Original patch by Alexandre Vassalotti. + + - bpo-27522(83): Avoid an unintentional reference cycle in + email.feedparser. + + - bpo-26844(84): Fix error message for imp.find_module() to refer to + ‘path’ instead of ‘name’. Patch by Lev Maximov. + + - bpo-23804(85): Fix SSL zero-length recv() calls to not block and + not raise an error about unclean EOF. + + - bpo-27466(86): Change time format returned by + http.cookie.time2netscape, confirming the netscape cookie format + and making it consistent with documentation. + + - bpo-26664(87): Fix activate.fish by removing mis-use of ‘$’. + + - bpo-22115(88): 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. + + - Fix a scoping issue in importlib.util.LazyLoader which triggered an + UnboundLocalError when lazy-loading a module that was already put + into sys.modules. + + - bpo-27079(89): Fixed curses.ascii functions isblank(), iscntrl() + and ispunct(). + + - bpo-26754(90): Some functions (compile() etc) accepted a filename + argument encoded as an iterable of integers. Now only strings and + byte-like objects are accepted. + + - bpo-27048(91): Prevents distutils failing on Windows when + environment variables contain non-ASCII characters + + - bpo-27330(92): Fixed possible leaks in the ctypes module. + + - bpo-27238(93): Got rid of bare excepts in the turtle module. + Original patch by Jelle Zijlstra. + + - bpo-27122(94): 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 PEP 479(95) bug described in issue25782. + + - bpo-26386(96): Fixed ttk.TreeView selection operations with item + id’s containing spaces. + + - bpo-16182(97): Fix various functions in the “readline” module to + use the locale encoding, and fix get_begidx() and get_endidx() to + return code point indexes. + + - bpo-27392(98): Add loop.connect_accepted_socket(). Patch by Jim + Fulton. + + - bpo-27930(99): Improved behaviour of + logging.handlers.QueueListener. Thanks to Paulo Andrade and Petr + Viktorin for the analysis and patch. + + - bpo-21201(100): Improves readability of multiprocessing error + message. Thanks to Wojciech Walczak for patch. + + - bpo-27456(101): asyncio: Set TCP_NODELAY by default. + + - bpo-27906(102): Fix socket accept exhaustion during high TCP + traffic. Patch by Kevin Conway. + + - bpo-28174(103): Handle when SO_REUSEPORT isn’t properly supported. + Patch by Seth Michael Larson. + + - bpo-26654(104): Inspect functools.partial in + asyncio.Handle.__repr__. Patch by iceboy. + + - bpo-26909(105): Fix slow pipes IO in asyncio. Patch by INADA + Naoki. + + - bpo-28176(106): Fix callbacks race in + asyncio.SelectorLoop.sock_connect. + + - bpo-27759(107): Fix selectors incorrectly retain invalid file + descriptors. Patch by Mark Williams. + + - bpo-28368(108): Refuse monitoring processes if the child watcher + has no loop attached. Patch by Vincent Michel. + + - bpo-28369(109): Raise RuntimeError when transport’s FD is used with + add_reader, add_writer, etc. + + - bpo-28370(110): Speedup asyncio.StreamReader.readexactly. Patch by + Коренберг Марк. + + - bpo-28371(111): Deprecate passing asyncio.Handles to + run_in_executor. + + - bpo-28372(112): Fix asyncio to support formatting of non-python + coroutines. + + - bpo-28399(113): Remove UNIX socket from FS before binding. Patch + by Коренберг Марк. + + - bpo-27972(114): Prohibit Tasks to await on themselves. + + - bpo-26923(115): Fix asyncio.Gather to refuse being cancelled once + all children are done. Patch by Johannes Ebke. + + - bpo-26796(116): Don’t configure the number of workers for default + threadpool executor. Initial patch by Hans Lawrenz. + + - bpo-28600(117): Optimize loop.call_soon(). + + - bpo-28613(118): Fix get_event_loop() return the current loop if + called from coroutines/callbacks. + + - bpo-28639(119): Fix inspect.isawaitable to always return bool Patch + by Justin Mayfield. + + - bpo-28652(120): Make loop methods reject socket kinds they do not + support. + + - bpo-28653(121): Fix a refleak in functools.lru_cache. + + - bpo-28703(122): Fix asyncio.iscoroutinefunction to handle Mock + objects. + + - bpo-24142(123): Reading a corrupt config file left the parser in an + invalid state. Original patch by Florian Höch. + + - bpo-28990(124): Fix SSL hanging if connection is closed before + handshake completed. (Patch by HoHo-Ho) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15812 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=29094 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13051 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=29119 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=9770 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28427 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28923 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=28871 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=19542 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=20191 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=28779 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=28847 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25659 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=28732 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=28485 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=28387 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=27517 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=28549 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=28449 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23262 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=27939 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28255 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=20491 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=28353 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=25464 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=28488 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=24452 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=20766 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=26293 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=28321 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=28322 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=1703178 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=28253 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=28275 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=27897 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=18893 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=27611 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=27348 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=25651 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=27932 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=28075 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=25270 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=28181 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=25895 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=27599 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=19003 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=28019 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=25969 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=14977 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=24594 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=17582 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=28047 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=27445 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=22450 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=27570 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=22233 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=27988 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=27691 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=27850 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=27766 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=26470 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=12885 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=27881 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=27861 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=19884 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=27706 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=10513 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=27598 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=27539 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=21718 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=2466 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=27773 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=26750 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=27783 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=27774 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=27760 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=27758 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=27568 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=27656 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=27130 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=27533 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=17711 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=27522 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=26844 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=23804 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=27466 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=26664 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=22115 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=27079 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=26754 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=27048 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=27330 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=27238 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=27122 + + (95) https://peps.python.org/pep-0479/ + + (96) https://bugs.python.org/issue?@action=redirect&bpo=26386 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=16182 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=27392 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=27930 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=21201 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=27456 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=27906 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=28174 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=26654 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=26909 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=28176 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=27759 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=28368 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=28369 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=28370 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=28371 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=28372 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=28399 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=27972 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=26923 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=26796 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=28600 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=28613 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=28639 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=28652 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=28653 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=28703 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=24142 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=28990 + + +File: python.info, Node: IDLE<45>, Next: C API<51>, Prev: Library<65>, Up: Python 3 5 3 release candidate 1 + +1.21.76.4 IDLE +.............. + + - bpo-15308(1): Add ‘interrupt execution’ (^C) to Shell menu. Patch + by Roger Serwy, updated by Bayard Randel. + + - bpo-27922(2): Stop IDLE tests from ‘flashing’ gui widgets on the + screen. + + - Add version to title of IDLE help window. + + - bpo-25564(3): In section on IDLE – console differences, mention + that using exec means that __builtins__ is defined for each + statement. + + - bpo-27714(4): 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. + + - bpo-25507(5): IDLE no longer runs buggy code because of its tkinter + imports. Users must include the same imports required to run + directly in Python. + + - bpo-27452(6): add line counter and crc to IDLE configHandler test + dump. + + - bpo-27365(7): Allow non-ascii chars in IDLE NEWS.txt, for + contributor names. + + - bpo-27245(8): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15308 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27922 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25564 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27714 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25507 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27452 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=27365 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=27245 + + +File: python.info, Node: C API<51>, Next: Documentation<57>, Prev: IDLE<45>, Up: Python 3 5 3 release candidate 1 + +1.21.76.5 C API +............... + + - bpo-28808(1): PyUnicode_CompareWithASCIIString() now never raises + exceptions. + + - bpo-26754(2): PyUnicode_FSDecoder() accepted a filename argument + encoded as an iterable of integers. Now only strings and + bytes-like objects are accepted. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28808 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26754 + + +File: python.info, Node: Documentation<57>, Next: Tests<58>, Prev: C API<51>, Up: Python 3 5 3 release candidate 1 + +1.21.76.6 Documentation +....................... + + - bpo-28513(1): Documented command-line interface of zipfile. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28513 + + +File: python.info, Node: Tests<58>, Next: Tools/Demos<32>, Prev: Documentation<57>, Up: Python 3 5 3 release candidate 1 + +1.21.76.7 Tests +............... + + - bpo-28950(1): Disallow -j0 to be combined with -T/-l/-M in regrtest + command line arguments. + + - bpo-28666(2): Now test.support.rmtree is able to remove unwritable + or unreadable directories. + + - bpo-23839(3): Various caches now are cleared before running every + test file. + + - bpo-28409(4): regrtest: fix the parser of command line arguments. + + - bpo-27787(5): Call gc.collect() before checking each test for + “dangling threads”, since the dangling threads are weak references. + + - bpo-27369(6): In test_pyexpat, avoid testing an error message + detail that changed in Expat 2.2.0. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28950 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28666 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23839 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=28409 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27787 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27369 + + +File: python.info, Node: Tools/Demos<32>, Next: Windows<55>, Prev: Tests<58>, Up: Python 3 5 3 release candidate 1 + +1.21.76.8 Tools/Demos +..................... + + - bpo-27952(1): 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. + + - bpo-27332(2): Fixed the type of the first argument of module-level + functions generated by Argument Clinic. Patch by Petr Viktorin. + + - bpo-27418(3): Fixed Tools/importbench/importbench.py. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27952 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=27332 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27418 + + +File: python.info, Node: Windows<55>, Next: Build<63>, Prev: Tools/Demos<32>, Up: Python 3 5 3 release candidate 1 + +1.21.76.9 Windows +................. + + - bpo-28251(1): Improvements to help manuals on Windows. + + - bpo-28110(2): launcher.msi has different product codes between + 32-bit and 64-bit + + - bpo-25144(3): Ensures TargetDir is set before continuing with + custom install. + + - bpo-27469(4): Adds a shell extension to the launcher so that drag + and drop works correctly. + + - bpo-27309(5): Enabled proper Windows styles in python[w].exe + manifest. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=28251 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=28110 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25144 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=27469 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27309 + + +File: python.info, Node: Build<63>, Prev: Windows<55>, Up: Python 3 5 3 release candidate 1 + +1.21.76.10 Build +................ + + - bpo-29080(1): Removes hard dependency on hg.exe from + PCBuild/build.bat + + - bpo-23903(2): Added missed names to PC/python3.def. + + - bpo-10656(3): Fix out-of-tree building on AIX. Patch by Tristan + Carel and Michael Haubenwallner. + + - bpo-26359(4): Rename –with-optimiations to –enable-optimizations. + + - bpo-28444(5): Fix missing extensions modules when cross compiling. + + - bpo-28248(6): Update Windows build and OS X installers to use + OpenSSL 1.0.2j. + + - bpo-28258(7): Fixed build with Estonian locale (python-config and + distclean targets in Makefile). Patch by Arfrever Frehtes + Taifersar Arahesis. + + - bpo-26661(8): setup.py now detects system libffi with multiarch + wrapper. + + - bpo-28066(9): Fix the logic that searches build directories for + generated include files when building outside the source tree. + + - bpo-15819(10): Remove redundant include search directory option for + building outside the source tree. + + - bpo-27566(11): Fix clean target in freeze makefile (patch by Lisa + Roach) + + - bpo-27705(12): Update message in validate_ucrtbase.py + + - bpo-27983(13): 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. + + - bpo-26307(14): The profile-opt build now applies PGO to the + built-in modules. + + - bpo-26359(15): Add the –with-optimizations configure flag. + + - bpo-27713(16): Suppress spurious build warnings when updating + importlib’s bootstrap files. Patch by Xiang Zhang + + - bpo-25825(17): 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. + + - bpo-27453(18): CPP invocation in configure must use CPPFLAGS. Patch + by Chi Hsuan Yen. + + - bpo-27641(19): The configure script now inserts comments into the + makefile to prevent the pgen and _freeze_importlib executables from + being cross-compiled. + + - bpo-26662(20): Set PYTHON_FOR_GEN in configure as the Python + program to be used for file generation during the build. + + - bpo-10910(21): Avoid C++ compilation errors on FreeBSD and OS X. + Also update FreedBSD version checks for the original ctype UTF-8 + workaround. + + - bpo-28676(22): Prevent missing ‘getentropy’ declaration warning on + macOS. Patch by Gareth Rees. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=29080 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23903 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=10656 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26359 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=28444 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=28248 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=28258 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26661 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=28066 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=15819 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27566 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=27705 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27983 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=26307 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=26359 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=27713 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=25825 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=27453 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=27641 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=26662 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=10910 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=28676 + + +File: python.info, Node: Python 3 5 2 final, Next: Python 3 5 2 release candidate 1, Prev: Python 3 5 3 release candidate 1, Up: Changelog + +1.21.77 Python 3.5.2 final +-------------------------- + +`Release date: 2016-06-26' + +* Menu: + +* Core and Builtins: Core and Builtins<66>. +* Tests: Tests<59>. +* IDLE: IDLE<46>. + + +File: python.info, Node: Core and Builtins<66>, Next: Tests<59>, Up: Python 3 5 2 final + +1.21.77.1 Core and Builtins +........................... + + - bpo-26930(1): Update Windows builds to use OpenSSL 1.0.2h. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26930 + + +File: python.info, Node: Tests<59>, Next: IDLE<46>, Prev: Core and Builtins<66>, Up: Python 3 5 2 final + +1.21.77.2 Tests +............... + + - bpo-26867(1): Ubuntu’s openssl OP_NO_SSLv3 is forced on by default; + fix test. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26867 + + +File: python.info, Node: IDLE<46>, Prev: Tests<59>, Up: Python 3 5 2 final + +1.21.77.3 IDLE +.............. + + - bpo-27365(1): Allow non-ascii in idlelib/NEWS.txt - minimal part + for 3.5.2. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27365 + + +File: python.info, Node: Python 3 5 2 release candidate 1, Next: Python 3 5 1 final, Prev: Python 3 5 2 final, Up: Changelog + +1.21.78 Python 3.5.2 release candidate 1 +---------------------------------------- + +`Release date: 2016-06-12' + +* Menu: + +* Security: Security<36>. +* Core and Builtins: Core and Builtins<67>. +* Library: Library<66>. +* IDLE: IDLE<47>. +* Documentation: Documentation<58>. +* Tests: Tests<60>. +* Build: Build<64>. +* Windows: Windows<56>. +* Tools/Demos: Tools/Demos<33>. + + +File: python.info, Node: Security<36>, Next: Core and Builtins<67>, Up: Python 3 5 2 release candidate 1 + +1.21.78.1 Security +.................. + + - bpo-26556(1): Update expat to 2.1.1, fixes CVE-2015-1283. + + - Fix TLS stripping vulnerability in smtplib, CVE-2016-0772. + Reported by Team Oststrom + + - bpo-26839(2): On Linux, *note os.urandom(): 237. now calls + ‘getrandom()’ with ‘GRND_NONBLOCK’ to fall back on reading + ‘/dev/urandom’ if the urandom entropy pool is not initialized yet. + Patch written by Colm Buckley. + + - bpo-26657(3): 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. + + - bpo-26313(4): ssl.py _load_windows_store_certs fails if windows + cert store is empty. Patch by Baji. + + - bpo-25939(5): On Windows open the cert store readonly in + ssl.enum_certificates. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26556 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26839 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26657 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26313 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25939 + + +File: python.info, Node: Core and Builtins<67>, Next: Library<66>, Prev: Security<36>, Up: Python 3 5 2 release candidate 1 + +1.21.78.2 Core and Builtins +........................... + + - bpo-27066(1): Fixed SystemError if a custom opener (for open()) + returns a negative number without setting an exception. + + - bpo-20041(2): Fixed TypeError when frame.f_trace is set to None. + Patch by Xavier de Gaye. + + - bpo-26168(3): Fixed possible refleaks in failing Py_BuildValue() + with the “N” format unit. + + - bpo-26991(4): Fix possible refleak when creating a function with + annotations. + + - bpo-27039(5): Fixed bytearray.remove() for values greater than 127. + Patch by Joe Jevnik. + + - bpo-23640(6): int.from_bytes() no longer bypasses constructors for + subclasses. + + - bpo-26811(7): gc.get_objects() no longer contains a broken tuple + with NULL pointer. + + - bpo-20120(8): 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. + + - bpo-26659(9): Make the builtin slice type support cycle collection. + + - bpo-26718(10): super.__init__ no longer leaks memory if called + multiple times. NOTE: A direct call of super.__init__ is not + endorsed! + + - bpo-25339(11): PYTHONIOENCODING now has priority over locale in + setting the error handler for stdin and stdout. + + - bpo-26494(12): 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. + + - bpo-26581(13): If coding cookie is specified multiple times on a + line in Python source code file, only the first one is taken to + account. + + - bpo-26464(14): 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. + + - bpo-22836(15): 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. + + - bpo-26302(16): Correct behavior to reject comma as a legal + character for cookie names. + + - bpo-4806(17): Avoid masking the original TypeError exception when + using star (‘*’) unpacking in function calls. Based on patch by + Hagen Fürstenau and Daniel Urban. + + - bpo-27138(18): Fix the doc comment for FileFinder.find_spec(). + + - bpo-26154(19): 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. + + - bpo-26194(20): 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. + + - bpo-25843(21): When compiling code, don’t merge constants if they + are equal but have a different types. For example, ‘f1, f2 = + lambda: 1, lambda: 1.0’ is now correctly compiled to two different + functions: ‘f1()’ returns ‘1’ (‘int’) and ‘f2()’ returns ‘1.0’ + (‘int’), even if ‘1’ and ‘1.0’ are equal. + + - bpo-22995(22): [UPDATE] Comment out the one of the pickleability + tests in _PyObject_GetState() due to regressions observed in + Cython-based projects. + + - bpo-25961(23): Disallowed null characters in the type name. + + - bpo-25973(24): Fix segfault when an invalid nonlocal statement + binds a name starting with two underscores. + + - bpo-22995(25): 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. + + - bpo-20440(26): Massive replacing unsafe attribute setting code with + special macro Py_SETREF. + + - bpo-25766(27): Special method __bytes__() now works in str + subclasses. + + - bpo-25421(28): __sizeof__ methods of builtin types now use dynamic + basic size. This allows sys.getsize() to work correctly with their + subclasses with __slots__ defined. + + - bpo-25709(29): Fixed problem with in-place string concatenation and + utf-8 cache. + + - bpo-27147(30): Mention PEP 420(31) in the importlib docs. + + - bpo-24097(32): Fixed crash in object.__reduce__() if slot name is + freed inside __getattr__. + + - bpo-24731(33): 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. + + - bpo-26478(34): Fix semantic bugs when using binary operators with + dictionary views and tuples. + + - bpo-26171(35): Fix possible integer overflow and heap corruption in + zipimporter.get_data(). + + - bpo-25660(36): Fix TAB key behaviour in REPL with readline. + + - bpo-25887(37): Raise a RuntimeError when a coroutine object is + awaited more than once. + + - bpo-27243(38): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27066 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20041 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26168 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26991 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27039 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23640 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26811 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=20120 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26659 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=26718 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25339 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=26494 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=26581 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=26464 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=22836 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=26302 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=4806 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=27138 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26154 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=26194 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=25843 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=22995 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=25961 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=25973 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=22995 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=20440 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=25766 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=25421 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=25709 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=27147 + + (31) https://peps.python.org/pep-0420/ + + (32) https://bugs.python.org/issue?@action=redirect&bpo=24097 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=24731 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=26478 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=26171 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=25660 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=25887 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=27243 + + +File: python.info, Node: Library<66>, Next: IDLE<47>, Prev: Core and Builtins<67>, Up: Python 3 5 2 release candidate 1 + +1.21.78.3 Library +................. + + - bpo-21386(1): Implement missing IPv4Address.is_global property. It + was documented since 07a5610bae9d. Initial patch by Roger Luethi. + + - bpo-20900(2): distutils register command now decodes HTTP responses + correctly. Initial patch by ingrid. + + - 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 PEP 492(3) + (Awaitable, AsyncIterable, AsyncIterator) have been added (in fact + they made it into 3.5.1 but were never mentioned). + + - bpo-25738(4): 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. + + - bpo-21313(5): Fix the “platform” module to tolerate when + sys.version contains truncated build information. + + - bpo-27164(6): In the zlib module, allow decompressing raw Deflate + streams with a predefined zdict. Based on patch by Xiang Zhang. + + - bpo-24291(7): 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. + + - bpo-26809(8): Add ‘__all__’ to *note string: f3. Patch by Emanuel + Barry. + + - bpo-26373(9): subprocess.Popen.communicate now correctly ignores + BrokenPipeError when the child process dies before .communicate() + is called in more/all circumstances. + + - bpo-21776(10): distutils.upload now correctly handles HTTPError. + Initial patch by Claudiu Popa. + + - bpo-27114(11): Fix SSLContext._load_windows_store_certs fails with + PermissionError + + - bpo-18383(12): Avoid creating duplicate filters when using + filterwarnings and simplefilter. Based on patch by Alex Shkop. + + - bpo-27057(13): 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. + + - bpo-27014(14): Fix infinite recursion using typing.py. Thanks to + Kalle Tuure! + + - bpo-14132(15): Fix urllib.request redirect handling when the target + only has a query string. Original fix by Ján Janech. + + - bpo-17214(16): 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. + + - bpo-26892(17): Honor debuglevel flag in urllib.request.HTTPHandler. + Patch contributed by Chi Hsuan Yen. + + - bpo-22274(18): In the subprocess module, allow stderr to be + redirected to stdout even when stdout is not redirected. Patch by + Akira Li. + + - bpo-26807(19): mock_open ‘files’ no longer error on readline at end + of file. Patch from Yolanda Robla. + + - bpo-25745(20): Fixed leaking a userptr in curses panel destructor. + + - bpo-26977(21): Removed unnecessary, and ignored, call to sum of + squares helper in statistics.pvariance. + + - bpo-26881(22): The modulefinder module now supports extended opcode + arguments. + + - bpo-23815(23): Fixed crashes related to directly created instances + of types in _tkinter and curses.panel modules. + + - bpo-17765(24): weakref.ref() no longer silently ignores keyword + arguments. Patch by Georg Brandl. + + - bpo-26873(25): xmlrpc now raises ResponseError on unsupported type + tags instead of silently return incorrect result. + + - bpo-26711(26): Fixed the comparison of plistlib.Data with other + types. + + - bpo-24114(27): Fix an uninitialized variable in ‘ctypes.util’. The + bug only occurs on SunOS when the ctypes implementation searches + for the ‘crle’ program. Patch by Xiang Zhang. Tested on SunOS by + Kees Bos. + + - bpo-26864(28): 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. + + - bpo-26634(29): recursive_repr() now sets __qualname__ of wrapper. + Patch by Xiang Zhang. + + - bpo-26804(30): urllib.request will prefer lower_case proxy + environment variables over UPPER_CASE or Mixed_Case ones. Patch + contributed by Hans-Peter Jansen. + + - bpo-26837(31): assertSequenceEqual() now correctly outputs + non-stringified differing items (like bytes in the -b mode). This + affects assertListEqual() and assertTupleEqual(). + + - bpo-26041(32): Remove “will be removed in Python 3.7” from + deprecation messages of platform.dist() and + platform.linux_distribution(). Patch by Kumaripaba Miyurusara + Athukorala. + + - bpo-26822(33): itemgetter, attrgetter and methodcaller objects no + longer silently ignore keyword arguments. + + - bpo-26733(34): Disassembling a class now disassembles class and + static methods. Patch by Xiang Zhang. + + - bpo-26801(35): Fix error handling in *note + shutil.get_terminal_size(): dae, catch *note AttributeError: 19d. + instead of *note NameError: 396. Patch written by Emanuel Barry. + + - bpo-24838(36): tarfile’s ustar and gnu formats now correctly + calculate name and link field limits for multibyte character + encodings like utf-8. + + - bpo-26717(37): Stop encoding Latin-1-ized WSGI paths with UTF-8. + Patch by Anthony Sottile. + + - bpo-26735(38): Fix *note os.urandom(): 237. on Solaris 11.3 and + newer when reading more than 1,024 bytes: call ‘getrandom()’ + multiple times with a limit of 1024 bytes per call. + + - bpo-16329(39): Add .webm to mimetypes.types_map. Patch by + Giampaolo Rodola’. + + - bpo-13952(40): Add .csv to mimetypes.types_map. Patch by Geoff + Wilson. + + - bpo-26709(41): Fixed Y2038 problem in loading binary PLists. + + - bpo-23735(42): Handle terminal resizing with Readline 6.3+ by + installing our own SIGWINCH handler. Patch by Eric Price. + + - bpo-26586(43): 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. + + - bpo-22854(44): Change BufferedReader.writable() and + BufferedWriter.readable() to always return False. + + - bpo-25195(45): 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. + + - bpo-26644(46): Raise ValueError rather than SystemError when a + negative length is passed to SSLSocket.recv() or read(). + + - bpo-23804(47): Fix SSL recv(0) and read(0) methods to return zero + bytes instead of up to 1024. + + - bpo-26616(48): Fixed a bug in datetime.astimezone() method. + + - bpo-21925(49): *note warnings.formatwarning(): 1446. now catches + exceptions on ‘linecache.getline(...)’ to be able to log *note + ResourceWarning: 8a9. emitted late during the Python shutdown + process. + + - bpo-24266(50): Ctrl+C during Readline history search now cancels + the search mode when compiled with Readline 7. + + - bpo-26560(51): Avoid potential ValueError in + BaseHandler.start_response. Initial patch by Peter Inglesby. + + - bpo-26569(52): Fix *note pyclbr.readmodule(): 159f. and *note + pyclbr.readmodule_ex(): 15a0. to support importing packages. + + - bpo-26499(53): Account for remaining Content-Length in + HTTPResponse.readline() and read1(). Based on patch by Silent + Ghost. Also document that HTTPResponse now supports these methods. + + - bpo-25320(54): Handle sockets in directories unittest discovery is + scanning. Patch from Victor van den Elzen. + + - bpo-16181(55): cookiejar.http2time() now returns None if year is + higher than datetime.MAXYEAR. + + - bpo-26513(56): Fixes platform module detection of Windows Server + + - bpo-23718(57): Fixed parsing time in week 0 before Jan 1. Original + patch by Tamás Bence Gedai. + + - bpo-20589(58): Invoking Path.owner() and Path.group() on Windows + now raise NotImplementedError instead of ImportError. + + - bpo-26177(59): Fixed the keys() method for Canvas and Scrollbar + widgets. + + - bpo-15068(60): Got rid of excessive buffering in the fileinput + module. The bufsize parameter is no longer used. + + - bpo-2202(61): Fix UnboundLocalError in + AbstractDigestAuthHandler.get_algorithm_impls. Initial patch by + Mathieu Dupuy. + + - bpo-25718(62): Fixed pickling and copying the accumulate() iterator + with total is None. + + - bpo-26475(63): Fixed debugging output for regular expressions with + the (?x) flag. + + - bpo-26457(64): 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. + + - bpo-26385(65): Remove the file if the internal open() call in + NamedTemporaryFile() fails. Patch by Silent Ghost. + + - bpo-26402(66): 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. + + - bpo-25913(67): Leading ‘<~’ is optional now in base64.a85decode() + with adobe=True. Patch by Swati Jaiswal. + + - bpo-26186(68): Remove an invalid type check in + importlib.util.LazyLoader. + + - bpo-26367(69): importlib.__import__() raises SystemError like + builtins.__import__() when ‘level’ is specified but without an + accompanying package specified. + + - bpo-26309(70): In the “socketserver” module, shut down the request + (closing the connected socket) when verify_request() returns false. + Patch by Aviv Palivoda. + + - bpo-25995(71): os.walk() no longer uses FDs proportional to the + tree depth. + + - bpo-26117(72): The os.scandir() iterator now closes file descriptor + not only when the iteration is finished, but when it was failed + with error. + + - bpo-25911(73): Restored support of bytes paths in os.walk() on + Windows. + + - bpo-26045(74): Add UTF-8 suggestion to error message when posting a + non-Latin-1 string with http.client. + + - bpo-12923(75): Reset FancyURLopener’s redirect counter even if + there is an exception. Based on patches by Brian Brazil and Daniel + Rocco. + + - bpo-25945(76): 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. + + - bpo-26202(77): copy.deepcopy() now correctly copies range() objects + with non-atomic attributes. + + - bpo-23076(78): Path.glob() now raises a ValueError if it’s called + with an invalid pattern. Patch by Thomas Nyberg. + + - bpo-19883(79): Fixed possible integer overflows in zipimport. + + - bpo-26227(80): 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. + + - bpo-26147(81): xmlrpc now works with strings not encodable with + used non-UTF-8 encoding. + + - bpo-25935(82): Garbage collector now breaks reference loops with + OrderedDict. + + - bpo-16620(83): Fixed AttributeError in msilib.Directory.glob(). + + - bpo-26013(84): Added compatibility with broken protocol 2 pickles + created in old Python 3 versions (3.4.3 and lower). + + - bpo-25850(85): Use cross-compilation by default for 64-bit Windows. + + - bpo-17633(86): Improve zipimport’s support for namespace packages. + + - bpo-24705(87): Fix sysconfig._parse_makefile not expanding ${} vars + appearing before $() vars. + + - bpo-22138(88): Fix mock.patch behavior when patching descriptors. + Restore original values after patching. Patch contributed by Sean + McCully. + + - bpo-25672(89): In the ssl module, enable the + SSL_MODE_RELEASE_BUFFERS mode option if it is safe to do so. + + - bpo-26012(90): Don’t traverse into symlinks for ‘**’ pattern in + pathlib.Path.[r]glob(). + + - bpo-24120(91): Ignore PermissionError when traversing a tree with + pathlib.Path.[r]glob(). Patch by Ulrich Petri. + + - bpo-25447(92): fileinput now uses sys.stdin as-is if it does not + have a buffer attribute (restores backward compatibility). + + - bpo-25447(93): Copying the lru_cache() wrapper object now always + works, independently from the type of the wrapped object (by + returning the original object unchanged). + + - bpo-24103(94): Fixed possible use after free in + ElementTree.XMLPullParser. + + - bpo-25860(95): os.fwalk() no longer skips remaining directories + when error occurs. Original patch by Samson Lee. + + - bpo-25914(96): Fixed and simplified OrderedDict.__sizeof__. + + - bpo-25902(97): Fixed various refcount issues in ElementTree + iteration. + + - bpo-25717(98): 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. + + - bpo-24903(99): 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. + + - bpo-25764(100): In the subprocess module, preserve any exception + caused by fork() failure when preexec_fn is used. + + - bpo-6478(101): _strptime’s regexp cache now is reset after changing + timezone with time.tzset(). + + - bpo-14285(102): 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. + + - bpo-19771(103): 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 + ‘*.pyc’ file). + + - bpo-25177(104): 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. + + - bpo-25718(105): Fixed copying object with state with boolean value + is false. + + - bpo-10131(106): Fixed deep copying of minidom documents. Based on + patch by Marian Ganisin. + + - bpo-25725(107): Fixed a reference leak in pickle.loads() when + unpickling invalid data including tuple instructions. + + - bpo-25663(108): In the Readline completer, avoid listing duplicate + global names, and search the global namespace before searching + builtins. + + - bpo-25688(109): Fixed file leak in ElementTree.iterparse() raising + an error. + + - bpo-23914(110): Fixed SystemError raised by unpickler on broken + pickle data. + + - bpo-25691(111): Fixed crash on deleting ElementTree.Element + attributes. + + - bpo-25624(112): ZipFile now always writes a ZIP_STORED header for + directory entries. Patch by Dingyuan Wang. + + - Skip getaddrinfo if host is already resolved. Patch by A. Jesse + Jiryu Davis. + + - bpo-26050(113): Add asyncio.StreamReader.readuntil() method. Patch + by Марк Коренберг. + + - bpo-25924(114): Avoid unnecessary serialization of getaddrinfo(3) + calls on OS X versions 10.5 or higher. Original patch by A. Jesse + Jiryu Davis. + + - bpo-26406(115): Avoid unnecessary serialization of getaddrinfo(3) + calls on current versions of OpenBSD and NetBSD. Patch by A. Jesse + Jiryu Davis. + + - bpo-26848(116): Fix asyncio/subprocess.communicate() to handle + empty input. Patch by Jack O’Connor. + + - bpo-27040(117): Add loop.get_exception_handler method + + - bpo-27041(118): asyncio: Add loop.create_future method + + - bpo-27223(119): asyncio: Fix _read_ready and _write_ready to + respect _conn_lost. Patch by Łukasz Langa. + + - bpo-22970(120): asyncio: Fix inconsistency cancelling + Condition.wait. Patch by David Coles. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21386 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20900 + + (3) https://peps.python.org/pep-0492/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25738 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=21313 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=27164 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24291 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26809 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26373 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21776 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27114 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=18383 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=27057 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=27014 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=14132 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=17214 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=26892 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=22274 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=26807 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=25745 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=26977 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=26881 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=23815 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=17765 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=26873 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=26711 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=24114 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=26864 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=26634 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=26804 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=26837 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=26041 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=26822 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=26733 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=26801 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=24838 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=26717 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=26735 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=16329 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=13952 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=26709 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=23735 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=26586 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=22854 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=25195 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=26644 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=23804 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=26616 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=21925 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=24266 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=26560 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=26569 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=26499 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=25320 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=16181 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=26513 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=23718 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=20589 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=26177 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=15068 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=2202 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=25718 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=26475 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=26457 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=26385 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=26402 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=25913 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=26186 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=26367 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=26309 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=25995 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=26117 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=25911 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=26045 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=12923 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=25945 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=26202 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=23076 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=19883 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=26227 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=26147 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=25935 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=16620 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=26013 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=25850 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=17633 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=24705 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=22138 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=25672 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=26012 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=24120 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=25447 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=25447 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=24103 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=25860 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=25914 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=25902 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=25717 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=24903 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=25764 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=6478 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=14285 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=19771 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=25177 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=25718 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=10131 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=25725 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=25663 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=25688 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=23914 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=25691 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=25624 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=26050 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=25924 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=26406 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=26848 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=27040 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=27041 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=27223 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=22970 + + +File: python.info, Node: IDLE<47>, Next: Documentation<58>, Prev: Library<66>, Up: Python 3 5 2 release candidate 1 + +1.21.78.4 IDLE +.............. + + - bpo-5124(1): 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. + + - bpo-24759(2): Make clear in idlelib.idle_test.__init__ that the + directory is a private implementation of test.test_idle and tool + for maintainers. + + - bpo-27196(3): 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 + + - bpo-20567(4): Revise idle_test/README.txt with advice about + avoiding tk warning messages from tests. Apply advice to several + IDLE tests. + + - bpo-27117(5): Make colorizer htest and turtledemo work with dark + themes. Move code for configuring text widget colors to a new + function. + + - bpo-26673(6): When tk reports font size as 0, change to size 10. + Such fonts on Linux prevented the configuration dialog from + opening. + + - bpo-21939(7): Add test for IDLE’s percolator. Original patch by + Saimadhav Heblikar. + + - bpo-21676(8): Add test for IDLE’s replace dialog. Original patch + by Saimadhav Heblikar. + + - bpo-18410(9): Add test for IDLE’s search dialog. Original patch by + Westley Martínez. + + - bpo-21703(10): Add test for IDLE’s undo delegator. Original patch + by Saimadhav Heblikar . + + - bpo-27044(11): Add ConfigDialog.remove_var_callbacks to stop memory + leaks. + + - bpo-23977(12): Add more asserts to test_delegator. + + - bpo-20640(13): Add tests for idlelib.configHelpSourceEdit. Patch + by Saimadhav Heblikar. + + - In the ‘IDLE-console differences’ section of the IDLE doc, clarify + how running with IDLE affects sys.modules and the standard streams. + + - bpo-25507(14): fix incorrect change in IOBinding that prevented + printing. Augment IOBinding htest to include all major IOBinding + functions. + + - bpo-25905(15): 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’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=5124 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24759 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27196 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20567 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=27117 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=26673 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=21939 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=21676 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=18410 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21703 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=27044 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=23977 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=20640 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=25507 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=25905 + + +File: python.info, Node: Documentation<58>, Next: Tests<60>, Prev: IDLE<47>, Up: Python 3 5 2 release candidate 1 + +1.21.78.5 Documentation +....................... + + - bpo-19489(1): Moved the search box from the sidebar to the header + and footer of each page. Patch by Ammar Askar. + + - bpo-24136(2): Document the new PEP 448(3) unpacking syntax of 3.5. + + - bpo-26736(4): Used HTTPS for external links in the documentation if + possible. + + - bpo-6953(5): Rework the Readline module documentation to group + related functions together, and add more details such as what + underlying Readline functions and variables are accessed. + + - bpo-23606(6): Adds note to ctypes documentation regarding + cdll.msvcrt. + + - bpo-25500(7): Fix documentation to not claim that __import__ is + searched for in the global scope. + + - bpo-26014(8): 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 + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19489 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24136 + + (3) https://peps.python.org/pep-0448/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26736 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=6953 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23606 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=25500 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26014 + + +File: python.info, Node: Tests<60>, Next: Build<64>, Prev: Documentation<58>, Up: Python 3 5 2 release candidate 1 + +1.21.78.6 Tests +............... + + - bpo-21916(1): Added tests for the turtle module. Patch by ingrid, + Gregory Loyse and Jelle Zijlstra. + + - bpo-26523(2): The multiprocessing thread pool + (multiprocessing.dummy.Pool) was untested. + + - bpo-26015(3): Added new tests for pickling iterators of mutable + sequences. + + - bpo-26325(4): Added test.support.check_no_resource_warning() to + check that no ResourceWarning is emitted. + + - bpo-25940(5): Changed test_ssl to use self-signed.pythontest.net. + This avoids relying on svn.python.org, which recently changed root + certificate. + + - bpo-25616(6): Tests for OrderedDict are extracted from + test_collections into separate file test_ordered_dict. + + - bpo-26583(7): Skip test_timestamp_overflow in test_import if + bytecode files cannot be written. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21916 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26523 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26015 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26325 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25940 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25616 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=26583 + + +File: python.info, Node: Build<64>, Next: Windows<56>, Prev: Tests<60>, Up: Python 3 5 2 release candidate 1 + +1.21.78.7 Build +............... + + - bpo-26884(1): Fix linking extension modules for cross builds. + Patch by Xavier de Gaye. + + - bpo-22359(2): 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. + + - bpo-27229(3): Fix the cross-compiling pgen rule for in-tree builds. + Patch by Xavier de Gaye. + + - bpo-21668(4): Link audioop, _datetime, _ctypes_test modules to + libm, except on Mac OS X. Patch written by Xavier de Gaye. + + - bpo-25702(5): 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. + + - bpo-26624(6): Adds validation of ucrtbase[d].dll version with + warning for old versions. + + - bpo-17603(7): Avoid error about nonexistent fileblocks.o file by + using a lower-level check for st_blocks in struct stat. + + - bpo-26079(8): Fixing the build output folder for tix-8.4.3.6. + Patch by Bjoern Thiel. + + - bpo-26465(9): Update Windows builds to use OpenSSL 1.0.2g. + + - bpo-24421(10): Compile Modules/_math.c once, before building + extensions. Previously it could fail to compile properly if the + math and cmath builds were concurrent. + + - bpo-25348(11): Added ‘--pgo’ and ‘--pgo-job’ arguments to + ‘PCbuild\build.bat’ for building with Profile-Guided Optimization. + The old ‘PCbuild\build_pgo.bat’ script is now deprecated, and + simply calls ‘PCbuild\build.bat --pgo %*’. + + - bpo-25827(12): Add support for building with ICC to ‘configure’, + including a new ‘--with-icc’ flag. + + - bpo-25696(13): Fix installation of Python on UNIX with make -j9. + + - bpo-26930(14): Update OS X 10.5+ 32-bit-only installer to build and + link with OpenSSL 1.0.2h. + + - bpo-26268(15): Update Windows builds to use OpenSSL 1.0.2f. + + - bpo-25136(16): Support Apple Xcode 7’s new textual SDK stub + libraries. + + - bpo-24324(17): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26884 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22359 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=27229 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21668 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25702 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=26624 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=17603 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=26079 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=26465 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=24421 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25348 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25827 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25696 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=26930 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=26268 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=25136 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=24324 + + +File: python.info, Node: Windows<56>, Next: Tools/Demos<33>, Prev: Build<64>, Up: Python 3 5 2 release candidate 1 + +1.21.78.8 Windows +................. + + - bpo-27053(1): Updates make_zip.py to correctly generate library ZIP + file. + + - bpo-26268(2): 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). + + - bpo-26071(3): bdist_wininst created binaries fail to start and find + 32bit Python + + - bpo-26073(4): Update the list of magic numbers in launcher + + - bpo-26065(5): Excludes venv from library when generating embeddable + distro. + + - bpo-17500(6): Remove unused and outdated icons. (See also: + ‘https://github.com/python/pythondotorg/issues/945’) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=27053 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26268 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26071 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26073 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=26065 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17500 + + +File: python.info, Node: Tools/Demos<33>, Prev: Windows<56>, Up: Python 3 5 2 release candidate 1 + +1.21.78.9 Tools/Demos +..................... + + - bpo-26799(1): 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. + + - bpo-26271(2): Fix the Freeze tool to properly use flags passed + through configure. Patch by Daniel Shaulov. + + - bpo-26489(3): Add dictionary unpacking support to + Tools/parser/unparse.py. Patch by Guo Ci Teo. + + - bpo-26316(4): Fix variable name typo in Argument Clinic. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=26799 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=26271 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=26489 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=26316 + + +File: python.info, Node: Python 3 5 1 final, Next: Python 3 5 1 release candidate 1, Prev: Python 3 5 2 release candidate 1, Up: Changelog + +1.21.79 Python 3.5.1 final +-------------------------- + +`Release date: 2015-12-06' + +* Menu: + +* Core and Builtins: Core and Builtins<68>. +* Windows: Windows<57>. + + +File: python.info, Node: Core and Builtins<68>, Next: Windows<57>, Up: Python 3 5 1 final + +1.21.79.1 Core and Builtins +........................... + + - bpo-25709(1): Fixed problem with in-place string concatenation and + utf-8 cache. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25709 + + +File: python.info, Node: Windows<57>, Prev: Core and Builtins<68>, Up: Python 3 5 1 final + +1.21.79.2 Windows +................. + + - bpo-25715(1): Python 3.5.1 installer shows wrong upgrade path and + incorrect logic for launcher detection. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25715 + + +File: python.info, Node: Python 3 5 1 release candidate 1, Next: Python 3 5 0 final, Prev: Python 3 5 1 final, Up: Changelog + +1.21.80 Python 3.5.1 release candidate 1 +---------------------------------------- + +`Release date: 2015-11-22' + +* Menu: + +* Core and Builtins: Core and Builtins<69>. +* Library: Library<67>. +* IDLE: IDLE<48>. +* Documentation: Documentation<59>. +* Tests: Tests<61>. +* Build: Build<65>. +* Windows: Windows<58>. +* Tools/Demos: Tools/Demos<34>. + + +File: python.info, Node: Core and Builtins<69>, Next: Library<67>, Up: Python 3 5 1 release candidate 1 + +1.21.80.1 Core and Builtins +........................... + + - bpo-25630(1): Fix a possible segfault during argument parsing in + functions that accept filesystem paths. + + - bpo-23564(2): 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. + + - bpo-25388(3): Fixed tokenizer crash when processing undecodable + source code with a null byte. + + - bpo-25462(4): The hash of the key now is calculated only once in + most operations in C implementation of OrderedDict. + + - bpo-22995(5): Default implementation of __reduce__ and + __reduce_ex__ now rejects builtin types with not defined __new__. + + - bpo-25555(6): Fix parser and AST: fill lineno and col_offset of + “arg” node when compiling AST from Python objects. + + - bpo-24802(7): 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. + + - bpo-24726(8): Fixed a crash and leaking NULL in repr() of + OrderedDict that was mutated by direct calls of dict methods. + + - bpo-25449(9): Iterating OrderedDict with keys with unstable hash + now raises KeyError in C implementations as well as in Python + implementation. + + - bpo-25395(10): Fixed crash when highly nested OrderedDict + structures were garbage collected. + + - bpo-25274(11): 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. + + - bpo-24402(12): Fix input() to prompt to the redirected stdout when + sys.stdout.fileno() fails. + + - bpo-24806(13): Prevent builtin types that are not allowed to be + subclassed from being subclassed through multiple inheritance. + + - bpo-24848(14): Fixed a number of bugs in UTF-7 decoding of + misformed data. + + - bpo-25280(15): Import trace messages emitted in verbose (-v) mode + are no longer formatted twice. + + - bpo-25003(16): 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. + + - bpo-25182(17): The stdprinter (used as sys.stderr before the io + module is imported at startup) now uses the backslashreplace error + handler. + + - bpo-25131(18): Make the line number and column offset of set/dict + literals and comprehensions correspond to the opening brace. + + - bpo-25150(19): Hide the private _Py_atomic_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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25630 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23564 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25388 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25462 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22995 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25555 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24802 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=24726 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25449 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=25395 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25274 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=24402 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=24806 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=24848 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=25280 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=25003 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=25182 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=25131 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=25150 + + +File: python.info, Node: Library<67>, Next: IDLE<48>, Prev: Core and Builtins<69>, Up: Python 3 5 1 release candidate 1 + +1.21.80.2 Library +................. + + - bpo-25626(1): 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. + + - bpo-25583(2): Avoid incorrect errors raised by + os.makedirs(exist_ok=True) when the OS gives priority to errors + such as EACCES over EEXIST. + + - bpo-25593(3): Change semantics of EventLoop.stop() in asyncio. + + - bpo-6973(4): 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. + + - bpo-25590(5): In the Readline completer, only call getattr() once + per attribute. + + - bpo-25498(6): 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. + + - bpo-25584(7): Added “escape” to the __all__ list in the glob + module. + + - bpo-25584(8): Fixed recursive glob() with patterns starting with + ‘**’. + + - bpo-25446(9): Fix regression in smtplib’s AUTH LOGIN support. + + - bpo-18010(10): Fix the pydoc web server’s module search function to + handle exceptions from importing packages. + + - bpo-25554(11): Got rid of circular references in regular expression + parsing. + + - bpo-25510(12): fileinput.FileInput.readline() now returns b’’ + instead of ‘’ at the end if the FileInput was opened with binary + mode. Patch by Ryosuke Ito. + + - bpo-25503(13): Fixed inspect.getdoc() for inherited docstrings of + properties. Original patch by John Mark Vandenberg. + + - bpo-25515(14): Always use os.urandom as a source of randomness in + uuid.uuid4. + + - bpo-21827(15): Fixed textwrap.dedent() for the case when largest + common whitespace is a substring of smallest leading whitespace. + Based on patch by Robert Li. + + - bpo-25447(16): The lru_cache() wrapper objects now can be copied + and pickled (by returning the original object unchanged). + + - bpo-25390(17): typing: Don’t crash on Union[str, Pattern]. + + - bpo-25441(18): asyncio: Raise error from drain() when socket is + closed. + + - bpo-25410(19): Cleaned up and fixed minor bugs in C implementation + of OrderedDict. + + - bpo-25411(20): Improved Unicode support in SMTPHandler through + better use of the email package. Thanks to user simon04 for the + patch. + + - bpo-25407(21): Remove mentions of the formatter module being + removed in Python 3.6. + + - bpo-25406(22): 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. + + - bpo-25364(23): zipfile now works in threads disabled builds. + + - bpo-25328(24): smtpd’s SMTPChannel now correctly raises a + ValueError if both decode_data and enable_SMTPUTF8 are set to true. + + - bpo-25316(25): distutils raises OSError instead of + DistutilsPlatformError when MSVC is not installed. + + - bpo-25380(26): Fixed protocol for the STACK_GLOBAL opcode in + pickletools.opcodes. + + - bpo-23972(27): 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. + + - bpo-25304(28): 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. + + - bpo-25232(29): Fix CGIRequestHandler to split the query from the + URL at the first question mark (?) rather than the last. Patch + from Xiang Zhang. + + - bpo-24657(30): Prevent CGIRequestHandler from collapsing slashes in + the query part of the URL as if it were a path. Patch from Xiang + Zhang. + + - bpo-24483(31): C implementation of functools.lru_cache() now + calculates key’s hash only once. + + - bpo-22958(32): Constructor and update method of + weakref.WeakValueDictionary now accept the self and the dict + keyword arguments. + + - bpo-22609(33): Constructor of collections.UserDict now accepts the + self keyword argument. + + - bpo-25111(34): Fixed comparison of traceback.FrameSummary. + + - bpo-25262(35): 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. + + - bpo-25034(36): Fix string.Formatter problem with auto-numbering and + nested format_specs. Patch by Anthon van der Neut. + + - bpo-25233(37): Rewrite the guts of asyncio.Queue and + asyncio.Semaphore to be more understandable and correct. + + - bpo-25203(38): Failed readline.set_completer_delims() no longer + left the module in inconsistent state. + + - bpo-23600(39): Default implementation of tzinfo.fromutc() was + returning wrong results in some cases. + + - bpo-23329(40): Allow the ssl module to be built with older versions + of LibreSSL. + + - Prevent overflow in _Unpickler_Read. + + - bpo-25047(41): 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. + + - bpo-25135(42): Make deque_clear() safer by emptying the deque + before clearing. This helps avoid possible reentrancy issues. + + - bpo-19143(43): platform module now reads Windows version from + kernel32.dll to avoid compatibility shims. + + - bpo-25092(44): Fix datetime.strftime() failure when errno was + already set to EINVAL. + + - bpo-23517(45): 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. + + - bpo-25155(46): 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. + + - bpo-25108(47): Omitted internal frames in traceback functions + print_stack(), format_stack(), and extract_stack() called without + arguments. + + - bpo-25118(48): Fix a regression of Python 3.5.0 in os.waitpid() on + Windows. + + - bpo-24684(49): 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. + + - bpo-25060(50): Correctly compute stack usage of the BUILD_MAP + opcode. + + - bpo-24857(51): Comparing call_args to a long sequence now correctly + returns a boolean result instead of raising an exception. Patch by + A Kaptur. + + - bpo-23144(52): Make sure that HTMLParser.feed() returns all the + data, even when convert_charrefs is True. + + - bpo-24982(53): shutil.make_archive() with the “zip” format now adds + entries for directories (including empty directories) in ZIP file. + + - bpo-25019(54): Fixed a crash caused by setting non-string key of + expat parser. Based on patch by John Leitch. + + - bpo-16180(55): Exit pdb if file has syntax error, instead of + trapping user in an infinite loop. Patch by Xavier de Gaye. + + - bpo-24891(56): 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. + + - bpo-24992(57): Fix error handling and a race condition (related to + garbage collection) in collections.OrderedDict constructor. + + - bpo-24881(58): Fixed setting binary mode in Python implementation + of FileIO on Windows and Cygwin. Patch from Akira Li. + + - bpo-25578(59): Fix (another) memory leak in SSLSocket.getpeercer(). + + - bpo-25530(60): Disable the vulnerable SSLv3 protocol by default + when creating ssl.SSLContext. + + - bpo-25569(61): Fix memory leak in SSLSocket.getpeercert(). + + - bpo-25471(62): Sockets returned from accept() shouldn’t appear to + be nonblocking. + + - bpo-25319(63): When threading.Event is reinitialized, the + underlying condition should use a regular lock rather than a + recursive lock. + + - bpo-21112(64): Fix regression in unittest.expectedFailure on + subclasses. Patch from Berker Peksag. + + - bpo-24764(65): cgi.FieldStorage.read_multi() now ignores the + Content-Length header in part headers. Patch written by Peter + Landry and reviewed by Pierre Quentel. + + - bpo-24913(66): Fix overrun error in deque.index(). Found by John + Leitch and Bryce Darling. + + - bpo-24774(67): Fix docstring in http.server.test. Patch from + Chiu-Hsiang Hsu. + + - bpo-21159(68): Improve message in + configparser.InterpolationMissingOptionError. Patch from Łukasz + Langa. + + - bpo-20362(69): Honour TestCase.longMessage correctly in + assertRegex. Patch from Ilia Kurenkov. + + - bpo-23572(70): Fixed functools.singledispatch on classes with falsy + metaclasses. Patch by Ethan Furman. + + - asyncio: ensure_future() now accepts awaitable objects. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25626 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25583 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25593 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=6973 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25590 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25498 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=25584 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=25584 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25446 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=18010 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25554 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25510 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25503 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=25515 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=21827 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=25447 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=25390 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=25441 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=25410 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=25411 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=25407 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=25406 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=25364 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=25328 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=25316 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=25380 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=23972 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=25304 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=25232 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=24657 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=24483 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=22958 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=22609 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=25111 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=25262 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=25034 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=25233 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=25203 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=23600 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=23329 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=25047 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=25135 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=19143 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=25092 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=23517 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=25155 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=25108 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=25118 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=24684 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=25060 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=24857 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=23144 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=24982 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=25019 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=16180 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=24891 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=24992 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=24881 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=25578 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=25530 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=25569 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=25471 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=25319 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=21112 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=24764 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=24913 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=24774 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=21159 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=20362 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=23572 + + +File: python.info, Node: IDLE<48>, Next: Documentation<59>, Prev: Library<67>, Up: Python 3 5 1 release candidate 1 + +1.21.80.3 IDLE +.............. + + - bpo-15348(1): 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. + + - bpo-24455(2): 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. + + - 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. + + - bpo-24750(3): Improve the appearance of the IDLE editor window + status bar. Patch by Mark Roseman. + + - bpo-25313(4): 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. + + - bpo-24782(5): 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. + + - bpo-22726(6): Re-activate the config dialog help button with some + content about the other buttons and the new IDLE Dark theme. + + - bpo-24820(7): 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. + + - bpo-25224(8): 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’. + + - bpo-24820(9): Users can now set breakpoint colors in Settings -> + Custom Highlighting. Original patch by Mark Roseman. + + - bpo-24972(10): 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. + + - bpo-24570(11): Idle: make calltip and completion boxes appear on + Macs affected by a tk regression. Initial patch by Mark Roseman. + + - bpo-24988(12): Idle ScrolledList context menus (used in debugger) + now work on Mac Aqua. Patch by Mark Roseman. + + - bpo-24801(13): Make right-click for context menu work on Mac Aqua. + Patch by Mark Roseman. + + - bpo-25173(14): Associate tkinter messageboxes with a specific + widget. For Mac OSX, make them a ‘sheet’. Patch by Mark Roseman. + + - bpo-25198(15): 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. + + - bpo-25225(16): Condense and rewrite Idle doc section on text + colors. + + - bpo-21995(17): Explain some differences between IDLE and console + Python. + + - bpo-22820(18): Explain need for `print' when running file from Idle + editor. + + - bpo-25224(19): Doc: augment Idle feature list and no-subprocess + section. + + - bpo-25219(20): Update doc for Idle command line options. Some were + missing and notes were not correct. + + - bpo-24861(21): Most of idlelib is private and subject to change. + Use idleib.idle.* to start Idle. See idlelib.__init__.__doc__. + + - bpo-25199(22): Idle: add synchronization comments for future + maintainers. + + - bpo-16893(23): 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. + + - bpo-24199(24): Deprecate unused idlelib.idlever with possible + removal in 3.6. + + - bpo-24790(25): Remove extraneous code (which also create 2 & 3 + conflicts). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15348 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24455 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24750 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25313 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24782 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22726 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24820 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=25224 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24820 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=24972 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=24570 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=24988 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=24801 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=25173 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=25198 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=25225 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=21995 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=22820 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=25224 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=25219 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=24861 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=25199 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=16893 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=24199 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=24790 + + +File: python.info, Node: Documentation<59>, Next: Tests<61>, Prev: IDLE<48>, Up: Python 3 5 1 release candidate 1 + +1.21.80.4 Documentation +....................... + + - bpo-22558(1): Add remaining doc links to source code for + Python-coded modules. Patch by Yoni Lavi. + + - bpo-12067(2): 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. + + - bpo-24952(3): Clarify the default size argument of stack_size() in + the “threading” and “_thread” modules. Patch from Mattip. + + - bpo-23725(4): Overhaul tempfile docs. Note deprecated status of + mktemp. Patch from Zbigniew Jędrzejewski-Szmek. + + - bpo-24808(5): Update the types of some PyTypeObject fields. Patch + by Joseph Weston. + + - bpo-22812(6): Fix unittest discovery examples. Patch from Pam + McA’Nulty. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22558 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=12067 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24952 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23725 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24808 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22812 + + +File: python.info, Node: Tests<61>, Next: Build<65>, Prev: Documentation<59>, Up: Python 3 5 1 release candidate 1 + +1.21.80.5 Tests +............... + + - bpo-25449(1): Added tests for OrderedDict subclasses. + + - bpo-25099(2): Make test_compileall not fail when an entry on + sys.path cannot be written to (commonly seen in administrative + installs on Windows). + + - bpo-23919(3): Prevents assert dialogs appearing in the test suite. + + - ‘PCbuild\rt.bat’ now accepts an unlimited number of arguments to + pass along to regrtest.py. Previously there was a limit of 9. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25449 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25099 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23919 + + +File: python.info, Node: Build<65>, Next: Windows<58>, Prev: Tests<61>, Up: Python 3 5 1 release candidate 1 + +1.21.80.6 Build +............... + + - bpo-24915(1): Add LLVM support for PGO builds and use the test + suite to generate the profile data. Initial patch by Alecsandru + Patrascu of Intel. + + - bpo-24910(2): Windows MSIs now have unique display names. + + - bpo-24986(3): It is now possible to build Python on Windows without + errors when external libraries are not available. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24915 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24910 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24986 + + +File: python.info, Node: Windows<58>, Next: Tools/Demos<34>, Prev: Build<65>, Up: Python 3 5 1 release candidate 1 + +1.21.80.7 Windows +................. + + - bpo-25450(1): Updates shortcuts to start Python in installation + directory. + + - bpo-25164(2): Changes default all-users install directory to match + per-user directory. + + - bpo-25143(3): Improves installer error messages for unsupported + platforms. + + - bpo-25163(4): Display correct directory in installer when using + non-default settings. + + - bpo-25361(5): Disables use of SSE2 instructions in Windows 32-bit + build + + - bpo-25089(6): Adds logging to installer for case where launcher is + not selected on upgrade. + + - bpo-25165(7): Windows uninstallation should not remove launcher if + other versions remain + + - bpo-25112(8): py.exe launcher is missing icons + + - bpo-25102(9): Windows installer does not precompile for -O or -OO. + + - bpo-25081(10): Makes Back button in installer go back to upgrade + page when upgrading. + + - bpo-25091(11): Increases font size of the installer. + + - bpo-25126(12): Clarifies that the non-web installer will download + some components. + + - bpo-25213(13): Restores requestedExecutionLevel to manifest to + disable UAC virtualization. + + - bpo-25022(14): Removed very outdated PC/example_nt/ directory. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25450 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=25164 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=25143 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=25163 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=25361 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=25089 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=25165 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=25112 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=25102 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=25081 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=25091 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=25126 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=25213 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=25022 + + +File: python.info, Node: Tools/Demos<34>, Prev: Windows<58>, Up: Python 3 5 1 release candidate 1 + +1.21.80.8 Tools/Demos +..................... + + - bpo-25440(1): Fix output of python-config –extension-suffix. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25440 + + +File: python.info, Node: Python 3 5 0 final, Next: Python 3 5 0 release candidate 4, Prev: Python 3 5 1 release candidate 1, Up: Changelog + +1.21.81 Python 3.5.0 final +-------------------------- + +`Release date: 2015-09-13' + +* Menu: + +* Build: Build<66>. + + +File: python.info, Node: Build<66>, Up: Python 3 5 0 final + +1.21.81.1 Build +............... + + - bpo-25071(1): Windows installer should not require TargetDir + parameter when installing quietly. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25071 + + +File: python.info, Node: Python 3 5 0 release candidate 4, Next: Python 3 5 0 release candidate 3, Prev: Python 3 5 0 final, Up: Changelog + +1.21.82 Python 3.5.0 release candidate 4 +---------------------------------------- + +`Release date: 2015-09-09' + +* Menu: + +* Library: Library<68>. +* Build: Build<67>. + + +File: python.info, Node: Library<68>, Next: Build<67>, Up: Python 3 5 0 release candidate 4 + +1.21.82.1 Library +................. + + - bpo-25029(1): Fixes MemoryError in test_strptime. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25029 + + +File: python.info, Node: Build<67>, Prev: Library<68>, Up: Python 3 5 0 release candidate 4 + +1.21.82.2 Build +............... + + - bpo-25027(1): Reverts partial-static build options and adds + vcruntime140.dll to Windows installation. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=25027 + + +File: python.info, Node: Python 3 5 0 release candidate 3, Next: Python 3 5 0 release candidate 2, Prev: Python 3 5 0 release candidate 4, Up: Changelog + +1.21.83 Python 3.5.0 release candidate 3 +---------------------------------------- + +`Release date: 2015-09-07' + +* Menu: + +* Core and Builtins: Core and Builtins<70>. +* Library: Library<69>. + + +File: python.info, Node: Core and Builtins<70>, Next: Library<69>, Up: Python 3 5 0 release candidate 3 + +1.21.83.1 Core and Builtins +........................... + + - bpo-24305(1): Prevent import subsystem stack frames from being + counted by the warnings.warn(stacklevel=) parameter. + + - bpo-24912(2): Prevent __class__ assignment to immutable built-in + objects. + + - bpo-24975(3): Fix AST compilation for PEP 448(4) syntax. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24305 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24912 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24975 + + (4) https://peps.python.org/pep-0448/ + + +File: python.info, Node: Library<69>, Prev: Core and Builtins<70>, Up: Python 3 5 0 release candidate 3 + +1.21.83.2 Library +................. + + - bpo-24917(1): time_strftime() buffer over-read. + + - bpo-24748(2): 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. + + - bpo-24635(3): Fixed a bug in typing.py where isinstance([], + typing.Iterable) would return True once, then False on subsequent + calls. + + - bpo-24989(4): Fixed buffer overread in BytesIO.readline() if a + position is set beyond size. Based on patch by John Leitch. + + - bpo-24913(5): Fix overrun error in deque.index(). Found by John + Leitch and Bryce Darling. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24917 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24748 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24635 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24989 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24913 + + +File: python.info, Node: Python 3 5 0 release candidate 2, Next: Python 3 5 0 release candidate 1, Prev: Python 3 5 0 release candidate 3, Up: Changelog + +1.21.84 Python 3.5.0 release candidate 2 +---------------------------------------- + +`Release date: 2015-08-25' + +* Menu: + +* Core and Builtins: Core and Builtins<71>. +* Library: Library<70>. + + +File: python.info, Node: Core and Builtins<71>, Next: Library<70>, Up: Python 3 5 0 release candidate 2 + +1.21.84.1 Core and Builtins +........................... + + - bpo-24769(1): Interpreter now starts properly when dynamic loading + is disabled. Patch by Petr Viktorin. + + - bpo-21167(2): NAN operations are now handled correctly when python + is compiled with ICC even if -fp-model strict is not specified. + + - bpo-24492(3): A “package” lacking a __name__ attribute when trying + to perform a ‘from .. import ...’ statement will trigger an + ImportError instead of an AttributeError. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24769 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=21167 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24492 + + +File: python.info, Node: Library<70>, Prev: Core and Builtins<71>, Up: Python 3 5 0 release candidate 2 + +1.21.84.2 Library +................. + + - bpo-24847(1): Removes vcruntime140.dll dependency from Tcl/Tk. + + - bpo-24839(2): platform._syscmd_ver raises DeprecationWarning + + - bpo-24867(3): Fix Task.get_stack() for ‘async def’ coroutines + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24847 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24839 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24867 + + +File: python.info, Node: Python 3 5 0 release candidate 1, Next: Python 3 5 0 beta 4, Prev: Python 3 5 0 release candidate 2, Up: Changelog + +1.21.85 Python 3.5.0 release candidate 1 +---------------------------------------- + +`Release date: 2015-08-09' + +* Menu: + +* Core and Builtins: Core and Builtins<72>. +* Library: Library<71>. +* IDLE: IDLE<49>. +* Documentation: Documentation<60>. +* Tests: Tests<62>. + + +File: python.info, Node: Core and Builtins<72>, Next: Library<71>, Up: Python 3 5 0 release candidate 1 + +1.21.85.1 Core and Builtins +........................... + + - bpo-24667(1): Resize odict in all cases that the underlying dict + resizes. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24667 + + +File: python.info, Node: Library<71>, Next: IDLE<49>, Prev: Core and Builtins<72>, Up: Python 3 5 0 release candidate 1 + +1.21.85.2 Library +................. + + - bpo-24824(1): Signatures of codecs.encode() and codecs.decode() now + are compatible with pydoc. + + - bpo-24634(2): Importing uuid should not try to load libc on Windows + + - bpo-24798(3): _msvccompiler.py doesn’t properly support manifests + + - bpo-4395(4): Better testing and documentation of binary operators. + Patch by Martin Panter. + + - bpo-23973(5): Update typing.py from GitHub repo. + + - bpo-23004(6): mock_open() now reads binary data correctly when the + type of read_data is bytes. Initial patch by Aaron Hill. + + - bpo-23888(7): Handle fractional time in cookie expiry. Patch by + ssh. + + - bpo-23652(8): 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. + + - bpo-22932(9): Fix timezones in email.utils.formatdate. Patch from + Dmitry Shachnev. + + - bpo-23779(10): imaplib raises TypeError if authenticator tries to + abort. Patch from Craig Holmquist. + + - bpo-23319(11): Fix ctypes.BigEndianStructure, swap correctly bytes. + Patch written by Matthieu Gautier. + + - bpo-23254(12): Document how to close the TCPServer listening + socket. Patch from Martin Panter. + + - bpo-19450(13): Update Windows and OS X installer builds to use + SQLite 3.8.11. + + - bpo-17527(14): Add PATCH to wsgiref.validator. Patch from Luca + Sbardella. + + - bpo-24791(15): Fix grammar regression for call syntax: ‘g(*a or + b)’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24824 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24634 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24798 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=4395 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23973 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23004 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23888 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=23652 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=22932 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=23779 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23319 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=23254 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=19450 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=17527 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=24791 + + +File: python.info, Node: IDLE<49>, Next: Documentation<60>, Prev: Library<71>, Up: Python 3 5 0 release candidate 1 + +1.21.85.3 IDLE +.............. + + - bpo-23672(1): Allow Idle to edit and run files with astral chars in + name. Patch by Mohd Sanad Zaki Rizvi. + + - bpo-24745(2): 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 ‘fontxxx’ entries from + [Editor Window]. Patch by Mark Roseman. + + - bpo-21192(3): Idle editor. When a file is run, put its name in the + restart bar. Do not print false prompts. Original patch by Adnan + Umer. + + - bpo-13884(4): Idle menus. Remove tearoff lines. Patch by Roger + Serwy. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23672 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24745 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21192 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=13884 + + +File: python.info, Node: Documentation<60>, Next: Tests<62>, Prev: IDLE<49>, Up: Python 3 5 0 release candidate 1 + +1.21.85.4 Documentation +....................... + + - bpo-24129(1): 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. + + - bpo-20769(2): Improve reload() docs. Patch by Dorian Pula. + + - bpo-23589(3): Remove duplicate sentence from the FAQ. Patch by + Yongzhi Pan. + + - bpo-24729(4): Correct IO tutorial to match implementation regarding + encoding parameter to open function. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24129 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20769 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23589 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24729 + + +File: python.info, Node: Tests<62>, Prev: Documentation<60>, Up: Python 3 5 0 release candidate 1 + +1.21.85.5 Tests +............... + + - bpo-24751(1): When running regrtest with the ‘-w’ command line + option, a test run is no longer marked as a failure if all tests + succeed when re-run. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24751 + + +File: python.info, Node: Python 3 5 0 beta 4, Next: Python 3 5 0 beta 3, Prev: Python 3 5 0 release candidate 1, Up: Changelog + +1.21.86 Python 3.5.0 beta 4 +--------------------------- + +`Release date: 2015-07-26' + +* Menu: + +* Core and Builtins: Core and Builtins<73>. +* Library: Library<72>. +* Build: Build<68>. + + +File: python.info, Node: Core and Builtins<73>, Next: Library<72>, Up: Python 3 5 0 beta 4 + +1.21.86.1 Core and Builtins +........................... + + - bpo-23573(1): Restored optimization of bytes.rfind() and + bytearray.rfind() for single-byte argument on Linux. + + - bpo-24569(2): Make PEP 448(3) dictionary evaluation more + consistent. + + - bpo-24583(4): Fix crash when set is mutated while being updated. + + - bpo-24407(5): Fix crash when dict is mutated while being updated. + + - bpo-24619(6): New approach for tokenizing async/await. As a + consequence, it is now possible to have one-line ‘async def foo(): + await ..’ functions. + + - bpo-24687(7): Plug refleak on SyntaxError in function parameters + annotations. + + - bpo-15944(8): memoryview: Allow arbitrary formats when casting to + bytes. Patch by Martin Panter. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23573 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24569 + + (3) https://peps.python.org/pep-0448/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24583 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24407 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24619 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24687 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=15944 + + +File: python.info, Node: Library<72>, Next: Build<68>, Prev: Core and Builtins<73>, Up: Python 3 5 0 beta 4 + +1.21.86.2 Library +................. + + - bpo-23441(1): rcompleter now prints a tab character instead of + displaying possible completions for an empty word. Initial patch + by Martin Sekera. + + - bpo-24683(2): Fixed crashes in _json functions called with + arguments of inappropriate type. + + - bpo-21697(3): shutil.copytree() now correctly handles symbolic + links that point to directories. Patch by Eduardo Seabra and + Thomas Kluyver. + + - bpo-14373(4): Fixed segmentation fault when gc.collect() is called + during constructing lru_cache (C implementation). + + - bpo-24695(5): Fix a regression in traceback.print_exception(). If + exc_traceback is None we shouldn’t print a traceback header like + described in the documentation. + + - bpo-24620(6): Random.setstate() now validates the value of state + last element. + + - bpo-22485(7): Fixed an issue that caused *note inspect.getsource: + 129c. to return incorrect results on nested functions. + + - bpo-22153(8): Improve unittest docs. Patch from Martin Panter and + evilzero. + + - bpo-24580(9): Symbolic group references to open group in re + patterns now are explicitly forbidden as well as numeric group + references. + + - bpo-24206(10): Fixed __eq__ and __ne__ methods of inspect classes. + + - bpo-24631(11): Fixed regression in the timeit module with multiline + setup. + + - bpo-18622(12): unittest.mock.mock_open().reset_mock would recurse + infinitely. Patch from Nicola Palumbo and Laurent De Buyst. + + - bpo-23661(13): unittest.mock side_effects can now be exceptions + again. This was a regression vs Python 3.4. Patch from Ignacio + Rossi + + - bpo-24608(14): chunk.Chunk.read() now always returns bytes, not + str. + + - bpo-18684(15): Fixed reading out of the buffer in the re module. + + - bpo-24259(16): tarfile now raises a ReadError if an archive is + truncated inside a data segment. + + - bpo-15014(17): SMTP.auth() and SMTP.login() now support RFC 4954’s + optional initial-response argument to the SMTP AUTH command. + + - bpo-24669(18): Fix inspect.getsource() for ‘async def’ functions. + Patch by Kai Groner. + + - bpo-24688(19): ast.get_docstring() for ‘async def’ functions. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23441 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24683 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21697 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=14373 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24695 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24620 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=22485 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22153 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24580 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=24206 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=24631 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=18622 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=23661 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=24608 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=18684 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24259 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=15014 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=24669 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=24688 + + +File: python.info, Node: Build<68>, Prev: Library<72>, Up: Python 3 5 0 beta 4 + +1.21.86.3 Build +............... + + - bpo-24603(1): Update Windows builds and OS X 10.5 installer to use + OpenSSL 1.0.2d. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24603 + + +File: python.info, Node: Python 3 5 0 beta 3, Next: Python 3 5 0 beta 2, Prev: Python 3 5 0 beta 4, Up: Changelog + +1.21.87 Python 3.5.0 beta 3 +--------------------------- + +`Release date: 2015-07-05' + +* Menu: + +* Core and Builtins: Core and Builtins<74>. +* Library: Library<73>. +* Tests: Tests<63>. +* Documentation: Documentation<61>. +* Build: Build<69>. + + +File: python.info, Node: Core and Builtins<74>, Next: Library<73>, Up: Python 3 5 0 beta 3 + +1.21.87.1 Core and Builtins +........................... + + - bpo-24467(1): 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. + + - Upgrade to Unicode 8.0.0. + + - bpo-24345(2): Add Py_tp_finalize slot for the stable ABI. + + - bpo-24400(3): Introduce a distinct type for PEP 492(4) 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. + + - bpo-24450(5): Add gi_yieldfrom to generators and cr_await to + coroutines. Contributed by Benno Leslie and Yury Selivanov. + + - bpo-19235(6): Add new RecursionError exception. Patch by Georg + Brandl. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24467 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24345 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24400 + + (4) https://peps.python.org/pep-0492/ + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24450 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=19235 + + +File: python.info, Node: Library<73>, Next: Tests<63>, Prev: Core and Builtins<74>, Up: Python 3 5 0 beta 3 + +1.21.87.2 Library +................. + + - bpo-21750(1): mock_open.read_data can now be read from each + instance, as it could in Python 3.3. + + - bpo-24552(2): Fix use after free in an error case of the _pickle + module. + + - bpo-24514(3): tarfile now tolerates number fields consisting of + only whitespace. + + - bpo-19176(4): 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. + + - bpo-20387(5): Restore semantic round-trip correctness in + tokenize/untokenize for tab-indented blocks. + + - bpo-24456(6): Fixed possible buffer over-read in adpcm2lin() and + lin2adpcm() functions of the audioop module. + + - bpo-24336(7): The contextmanager decorator now works with functions + with keyword arguments called “func” and “self”. Patch by Martin + Panter. + + - bpo-24522(8): Fix possible integer overflow in json accelerator + module. + + - bpo-24489(9): ensure a previously set C errno doesn’t disturb + cmath.polar(). + + - bpo-24408(10): Fixed AttributeError in measure() and metrics() + methods of tkinter.Font. + + - bpo-14373(11): C implementation of functools.lru_cache() now can be + used with methods. + + - bpo-24347(12): Set KeyError if PyDict_GetItemWithError returns + NULL. + + - bpo-24348(13): Drop superfluous incref/decref. + + - bpo-24359(14): Check for changed OrderedDict size during iteration. + + - bpo-24368(15): Support keyword arguments in OrderedDict methods. + + - bpo-24362(16): Simplify the C OrderedDict fast nodes resize logic. + + - bpo-24377(17): Fix a ref leak in OrderedDict.__repr__. + + - bpo-24369(18): Defend against key-changes during iteration. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21750 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24552 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24514 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19176 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=20387 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=24456 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24336 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=24522 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=24489 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=24408 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=14373 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=24347 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=24348 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=24359 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=24368 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24362 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=24377 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=24369 + + +File: python.info, Node: Tests<63>, Next: Documentation<61>, Prev: Library<73>, Up: Python 3 5 0 beta 3 + +1.21.87.3 Tests +............... + + - bpo-24373(1): _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(2) for details) + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24373 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16690 + + +File: python.info, Node: Documentation<61>, Next: Build<69>, Prev: Tests<63>, Up: Python 3 5 0 beta 3 + +1.21.87.4 Documentation +....................... + + - bpo-24458(1): Update documentation to cover multi-phase + initialization for extension modules (PEP 489). Patch by Petr + Viktorin. + + - bpo-24351(2): Clarify what is meant by “identifier” in the context + of string.Template instances. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24458 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24351 + + +File: python.info, Node: Build<69>, Prev: Documentation<61>, Up: Python 3 5 0 beta 3 + +1.21.87.5 Build +............... + + - bpo-24432(1): Update Windows builds and OS X 10.5 installer to use + OpenSSL 1.0.2c. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24432 + + +File: python.info, Node: Python 3 5 0 beta 2, Next: Python 3 5 0 beta 1, Prev: Python 3 5 0 beta 3, Up: Changelog + +1.21.88 Python 3.5.0 beta 2 +--------------------------- + +`Release date: 2015-05-31' + +* Menu: + +* Core and Builtins: Core and Builtins<75>. +* Library: Library<74>. + + +File: python.info, Node: Core and Builtins<75>, Next: Library<74>, Up: Python 3 5 0 beta 2 + +1.21.88.1 Core and Builtins +........................... + + - bpo-24284(1): 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. + + - bpo-24115(2): Update uses of PyObject_IsTrue(), PyObject_Not(), + PyObject_IsInstance(), PyObject_RichCompareBool() and + _PyDict_Contains() to check for and handle errors correctly. + + - bpo-24328(3): Fix importing one character extension modules. + + - bpo-11205(4): In dictionary displays, evaluate the key before the + value. + + - bpo-24285(5): Fixed regression that prevented importing extension + modules from inside packages. Patch by Petr Viktorin. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24284 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24115 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24328 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=11205 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24285 + + +File: python.info, Node: Library<74>, Prev: Core and Builtins<75>, Up: Python 3 5 0 beta 2 + +1.21.88.2 Library +................. + + - bpo-23247(1): Fix a crash in the StreamWriter.reset() of CJK + codecs. + + - bpo-24270(2): Add math.isclose() and cmath.isclose() functions as + per PEP 485(3). Contributed by Chris Barker and Tal Einat. + + - bpo-5633(4): Fixed timeit when the statement is a string and the + setup is not. + + - bpo-24326(5): Fixed audioop.ratecv() with non-default weightB + argument. Original patch by David Moore. + + - bpo-16991(6): Add a C implementation of OrderedDict. + + - bpo-23934(7): Fix inspect.signature to fail correctly for builtin + types lacking signature information. Initial patch by James + Powell. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23247 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24270 + + (3) https://peps.python.org/pep-0485/ + + (4) https://bugs.python.org/issue?@action=redirect&bpo=5633 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=24326 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=16991 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23934 + + +File: python.info, Node: Python 3 5 0 beta 1, Next: Python 3 5 0 alpha 4, Prev: Python 3 5 0 beta 2, Up: Changelog + +1.21.89 Python 3.5.0 beta 1 +--------------------------- + +`Release date: 2015-05-24' + +* Menu: + +* Core and Builtins: Core and Builtins<76>. +* Library: Library<75>. +* IDLE: IDLE<50>. +* Tests: Tests<64>. +* Documentation: Documentation<62>. +* Tools/Demos: Tools/Demos<35>. + + +File: python.info, Node: Core and Builtins<76>, Next: Library<75>, Up: Python 3 5 0 beta 1 + +1.21.89.1 Core and Builtins +........................... + + - bpo-24276(1): Fixed optimization of property descriptor getter. + + - bpo-24268(2): PEP 489: Multi-phase extension module initialization. + Patch by Petr Viktorin. + + - bpo-23955(3): Add pyvenv.cfg option to suppress + registry/environment lookup for generating sys.path on Windows. + + - bpo-24257(4): Fixed system error in the comparison of faked + types.SimpleNamespace. + + - bpo-22939(5): Fixed integer overflow in iterator object. Patch by + Clement Rouault. + + - bpo-23985(6): Fix a possible buffer overrun when deleting a slice + from the front of a bytearray and then appending some other bytes + data. + + - bpo-24102(7): Fixed exception type checking in standard error + handlers. + + - bpo-15027(8): The UTF-32 encoder is now 3x to 7x faster. + + - bpo-23290(9): Optimize set_merge() for cases where the target is + empty. (Contributed by Serhiy Storchaka.) + + - bpo-2292(10): PEP 448: Additional Unpacking Generalizations. + + - bpo-24096(11): Make warnings.warn_explicit more robust against + mutation of the warnings.filters list. + + - bpo-23996(12): Avoid a crash when a delegated generator raises an + unnormalized StopIteration exception. Patch by Stefan Behnel. + + - bpo-23910(13): Optimize property() getter calls. Patch by Joe + Jevnik. + + - bpo-23911(14): Move path-based importlib bootstrap code to a + separate frozen module. + + - bpo-24192(15): Fix namespace package imports. + + - bpo-24022(16): Fix tokenizer crash when processing undecodable + source code. + + - bpo-9951(17): Added a hex() method to bytes, bytearray, and + memoryview. + + - bpo-22906(18): PEP 479: Change StopIteration handling inside + generators. + + - bpo-24017(19): PEP 492: Coroutines with async and await syntax. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24276 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24268 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23955 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24257 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22939 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23985 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=24102 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=15027 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=23290 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=2292 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=24096 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=23996 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=23910 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=23911 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=24192 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=24022 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=9951 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=22906 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=24017 + + +File: python.info, Node: Library<75>, Next: IDLE<50>, Prev: Core and Builtins<76>, Up: Python 3 5 0 beta 1 + +1.21.89.2 Library +................. + + - bpo-14373(1): Added C implementation of functools.lru_cache(). + Based on patches by Matt Joiner and Alexey Kachayev. + + - bpo-24230(2): The tempfile module now accepts bytes for prefix, + suffix and dir parameters and returns bytes in such situations + (matching the os module APIs). + + - bpo-22189(3): collections.UserString now supports __getnewargs__(), + __rmod__(), casefold(), format_map(), isprintable(), and + maketrans(). Patch by Joe Jevnik. + + - bpo-24244(4): Prevents termination when an invalid format string is + encountered on Windows in strftime. + + - bpo-23973(5): PEP 484: Add the typing module. + + - bpo-23086(6): The collections.abc.Sequence() abstract base class + added `start' and `stop' parameters to the index() mixin. Patch by + Devin Jeanpierre. + + - bpo-20035(7): Replaced the ‘tkinter._fix’ module used for setting + up the Tcl/Tk environment on Windows with a private function in the + ‘_tkinter’ module that makes no permanent changes to the + environment. + + - bpo-24257(8): Fixed segmentation fault in sqlite3.Row constructor + with faked cursor type. + + - bpo-15836(9): 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. + + - bpo-9858(10): Add missing method stubs to _io.RawIOBase. Patch by + Laura Rupprecht. + + - bpo-22955(11): 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. + + - bpo-22107(12): 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. + + - bpo-23780(13): Improved error message in os.path.join() with single + argument. + + - bpo-6598(14): Increased time precision and random number range in + email.utils.make_msgid() to strengthen the uniqueness of the + message ID. + + - bpo-24091(15): Fixed various crashes in corner cases in C + implementation of ElementTree. + + - bpo-21931(16): 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. + + - bpo-13866(17): `quote_via' argument added to + urllib.parse.urlencode. + + - bpo-20098(18): New mangle_from policy option for email, default + True for compat32, but False for all other policies. + + - bpo-24211(19): The email library now supports RFC 6532: it can + generate headers using utf-8 instead of encoded words. + + - bpo-16314(20): Added support for the LZMA compression in distutils. + + - bpo-21804(21): poplib now supports RFC 6856 (UTF8). + + - bpo-18682(22): Optimized pprint functions for builtin scalar types. + + - bpo-22027(23): smtplib now supports RFC 6531 (SMTPUTF8). + + - bpo-23488(24): Random generator objects now consume 2x less memory + on 64-bit. + + - bpo-1322(25): platform.dist() and platform.linux_distribution() + functions are now deprecated. Initial patch by Vajrasky Kok. + + - bpo-22486(26): Added the math.gcd() function. The fractions.gcd() + function now is deprecated. Based on patch by Mark Dickinson. + + - bpo-24064(27): Property() docstrings are now writeable. (Patch by + Berker Peksag.) + + - bpo-22681(28): Added support for the koi8_t encoding. + + - bpo-22682(29): Added support for the kz1048 encoding. + + - bpo-23796(30): peek and read1 methods of BufferedReader now raise + ValueError if they called on a closed object. Patch by John + Hergenroeder. + + - bpo-21795(31): smtpd now supports the 8BITMIME extension whenever + the new `decode_data' constructor argument is set to False. + + - bpo-24155(32): optimize heapq.heapify() for better cache + performance when heapifying large lists. + + - bpo-21800(33): imaplib now supports RFC 5161 (enable), RFC 6855 + (utf8/internationalized email) and automatically encodes non-ASCII + usernames and passwords to UTF8. + + - bpo-20274(34): When calling a _sqlite.Connection, it now complains + if passed any keyword arguments. Previously it silently ignored + them. + + - bpo-20274(35): Remove ignored and erroneous “kwargs” parameters + from three METH_VARARGS methods on _sqlite.Connection. + + - bpo-24134(36): 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. + + - bpo-24018(37): Add a collections.abc.Generator abstract base class. + Contributed by Stefan Behnel. + + - bpo-23880(38): Tkinter’s getint() and getdouble() now support + Tcl_Obj. Tkinter’s getdouble() now supports any numbers (in + particular int). + + - bpo-22619(39): Added negative limit support in the traceback + module. Based on patch by Dmitry Kazakov. + + - bpo-24094(40): Fix possible crash in json.encode with poorly + behaved dict subclasses. + + - bpo-9246(41): On POSIX, os.getcwd() now supports paths longer than + 1025 bytes. Patch written by William Orr. + + - bpo-17445(42): add difflib.diff_bytes() to support comparison of + byte strings (fixes a regression from Python 2). + + - bpo-23917(43): Fall back to sequential compilation when + ProcessPoolExecutor doesn’t exist. Patch by Claudiu Popa. + + - bpo-23008(44): Fixed resolving attributes with boolean value is + False in pydoc. + + - Fix asyncio issue 235: LifoQueue and PriorityQueue’s put didn’t + increment unfinished tasks (this bug was introduced when + JoinableQueue was merged with Queue). + + - bpo-23908(45): os functions now reject paths with embedded null + character on Windows instead of silently truncating them. + + - bpo-23728(46): binascii.crc_hqx() could return an integer outside + of the range 0-0xffff for empty data. + + - bpo-23887(47): urllib.error.HTTPError now has a proper repr() + representation. Patch by Berker Peksag. + + - asyncio: New event loop APIs: set_task_factory() and + get_task_factory(). + + - asyncio: async() function is deprecated in favour of + ensure_future(). + + - bpo-24178(48): asyncio.Lock, Condition, Semaphore, and + BoundedSemaphore support new ‘async with’ syntax. Contributed by + Yury Selivanov. + + - bpo-24179(49): Support ‘async for’ for asyncio.StreamReader. + Contributed by Yury Selivanov. + + - bpo-24184(50): Add AsyncIterator and AsyncIterable ABCs to + collections.abc. Contributed by Yury Selivanov. + + - bpo-22547(51): Implement informative __repr__ for + inspect.BoundArguments. Contributed by Yury Selivanov. + + - bpo-24190(52): Implement inspect.BoundArgument.apply_defaults() + method. Contributed by Yury Selivanov. + + - bpo-20691(53): Add ‘follow_wrapped’ argument to + inspect.Signature.from_callable() and inspect.signature(). + Contributed by Yury Selivanov. + + - bpo-24248(54): Deprecate inspect.Signature.from_function() and + inspect.Signature.from_builtin(). + + - bpo-23898(55): Fix inspect.classify_class_attrs() to support + attributes with overloaded __eq__ and __bool__. Patch by Mike + Bayer. + + - bpo-24298(56): Fix inspect.signature() to correctly unwrap wrappers + around bound methods. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14373 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24230 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22189 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24244 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23973 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23086 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=20035 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=24257 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=15836 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=9858 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=22955 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=22107 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=23780 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=6598 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=24091 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=21931 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=13866 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=20098 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=24211 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=16314 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=21804 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=18682 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=22027 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=23488 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=1322 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=22486 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=24064 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=22681 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=22682 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=23796 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=21795 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=24155 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=21800 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=20274 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=20274 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=24134 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=24018 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=23880 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=22619 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=24094 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=9246 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=17445 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=23917 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=23008 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=23908 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=23728 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=23887 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=24178 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=24179 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=24184 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=22547 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=24190 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=20691 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=24248 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=23898 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=24298 + + +File: python.info, Node: IDLE<50>, Next: Tests<64>, Prev: Library<75>, Up: Python 3 5 0 beta 1 + +1.21.89.3 IDLE +.............. + + - bpo-23184(1): remove unused names and imports in idlelib. Initial + patch by Al Sweigart. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23184 + + +File: python.info, Node: Tests<64>, Next: Documentation<62>, Prev: IDLE<50>, Up: Python 3 5 0 beta 1 + +1.21.89.4 Tests +............... + + - bpo-21520(1): test_zipfile no longer fails if the word ‘bad’ + appears anywhere in the name of the current directory. + + - bpo-9517(2): Move script_helper into the support package. Patch by + Christie Wilson. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=21520 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=9517 + + +File: python.info, Node: Documentation<62>, Next: Tools/Demos<35>, Prev: Tests<64>, Up: Python 3 5 0 beta 1 + +1.21.89.5 Documentation +....................... + + - bpo-22155(1): Add File Handlers subsection with createfilehandler + to tkinter doc. Remove obsolete example from FAQ. Patch by Martin + Panter. + + - bpo-24029(2): Document the name binding behavior for submodule + imports. + + - bpo-24077(3): Fix typo in man page for -I command option: -s, not + -S + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22155 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24029 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=24077 + + +File: python.info, Node: Tools/Demos<35>, Prev: Documentation<62>, Up: Python 3 5 0 beta 1 + +1.21.89.6 Tools/Demos +..................... + + - bpo-24000(1): Improved Argument Clinic’s mapping of converters to + legacy “format units”. Updated the documentation to match. + + - bpo-24001(2): Argument Clinic converters now use accept={type} + instead of types={‘type’} to specify the types the converter + accepts. + + - bpo-23330(3): h2py now supports arbitrary filenames in #include. + + - bpo-24031(4): make patchcheck now supports git checkouts, too. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=24000 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=24001 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23330 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=24031 + + +File: python.info, Node: Python 3 5 0 alpha 4, Next: Python 3 5 0 alpha 3, Prev: Python 3 5 0 beta 1, Up: Changelog + +1.21.90 Python 3.5.0 alpha 4 +---------------------------- + +`Release date: 2015-04-19' + +* Menu: + +* Core and Builtins: Core and Builtins<77>. +* Library: Library<76>. +* Build: Build<70>. +* Tests: Tests<65>. +* Tools/Demos: Tools/Demos<36>. +* C API: C API<52>. + + +File: python.info, Node: Core and Builtins<77>, Next: Library<76>, Up: Python 3 5 0 alpha 4 + +1.21.90.1 Core and Builtins +........................... + + - bpo-22980(1): 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 PEP 3149(2)-style + information. + + - bpo-22631(3): Added Linux-specific socket constant + CAN_RAW_FD_FRAMES. Patch courtesy of Joe Jevnik. + + - bpo-23731(4): Implement PEP 488(5): removal of .pyo files. + + - bpo-23726(6): Don’t enable GC for user subclasses of non-GC types + that don’t add any new fields. Patch by Eugene Toder. + + - bpo-23309(7): 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. + + - bpo-22977(8): Fixed formatting Windows error messages on Wine. + Patch by Martin Panter. + + - bpo-23466(9): %c, %o, %x, and %X in bytes formatting now raise + TypeError on non-integer input. + + - bpo-24044(10): Fix possible null pointer dereference in list.sort + in out of memory conditions. + + - bpo-21354(11): PyCFunction_New function is exposed by python DLL + again. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22980 + + (2) https://peps.python.org/pep-3149/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22631 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23731 + + (5) https://peps.python.org/pep-0488/ + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23726 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23309 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22977 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=23466 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=24044 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=21354 + + +File: python.info, Node: Library<76>, Next: Build<70>, Prev: Core and Builtins<77>, Up: Python 3 5 0 alpha 4 + +1.21.90.2 Library +................. + + - bpo-23840(1): tokenize.open() now closes the temporary binary file + on error to fix a resource warning. + + - bpo-16914(2): new debuglevel 2 in smtplib adds timestamps to debug + output. + + - bpo-7159(3): urllib.request now supports sending auth credentials + automatically after the first 401. This enhancement is a superset + of the enhancement from bpo-19494(4) and supersedes that change. + + - bpo-23703(5): Fix a regression in urljoin() introduced in + 901e4e52b20a. Patch by Demian Brecht. + + - bpo-4254(6): Adds _curses.update_lines_cols(). Patch by Arnon + Yaari + + - bpo-19933(7): Provide default argument for ndigits in round. Patch + by Vajrasky Kok. + + - bpo-23193(8): Add a numeric_owner parameter to + tarfile.TarFile.extract and tarfile.TarFile.extractall. Patch by + Michael Vogt and Eric Smith. + + - bpo-23342(9): Add a subprocess.run() function than returns a + CalledProcess instance for a more consistent API than the existing + call* functions. + + - bpo-21217(10): 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. + + - bpo-24521(11): Fix possible integer overflows in the pickle module. + + - bpo-22931(12): Allow ‘[’ and ‘]’ in cookie values. + + - The keywords attribute of functools.partial is now always a + dictionary. + + - bpo-23811(13): Add missing newline to the PyCompileError error + message. Patch by Alex Shkop. + + - bpo-21116(14): Avoid blowing memory when allocating a + multiprocessing shared array that’s larger than 50% of the + available RAM. Patch by Médéric Boquien. + + - bpo-22982(15): Improve BOM handling when seeking to multiple + positions of a writable text file. + + - bpo-23464(16): Removed deprecated asyncio JoinableQueue. + + - bpo-23529(17): 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. + + - bpo-21859(18): Added Python implementation of io.FileIO. + + - bpo-23865(19): 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. + + - bpo-23400(20): Raise same exception on both Python 2 and 3 if + sem_open is not available. Patch by Davin Potts. + + - bpo-10838(21): The subprocess now module includes SubprocessError + and TimeoutError in its list of exported names for the users wild + enough to use ‘from subprocess import *’. + + - bpo-23411(22): Added DefragResult, ParseResult, SplitResult, + DefragResultBytes, ParseResultBytes, and SplitResultBytes to + urllib.parse.__all__. Patch by Martin Panter. + + - bpo-23881(23): urllib.request.ftpwrapper constructor now closes the + socket if the FTP connection failed to fix a ResourceWarning. + + - bpo-23853(24): *note socket.socket.sendall(): a26. 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. + + - bpo-22721(25): 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. + + - bpo-15133(26): _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. + + - bpo-10590(27): xml.sax.parseString() now supports string argument. + + - bpo-23338(28): Fixed formatting ctypes error messages on Cygwin. + Patch by Makoto Kato. + + - bpo-15582(29): inspect.getdoc() now follows inheritance chains. + + - bpo-2175(30): SAX parsers now support a character stream of + InputSource object. + + - bpo-16840(31): Tkinter now supports 64-bit integers added in Tcl + 8.4 and arbitrary precision integers added in Tcl 8.5. + + - bpo-23834(32): Fix socket.sendto(), use the C Py_ssize_t type to + store the result of sendto() instead of the C int type. + + - bpo-23618(33): *note socket.socket.connect(): a21. now waits until + the connection completes instead of raising *note InterruptedError: + a05. if the connection is interrupted by signals, signal handlers + don’t raise an exception and the socket is blocking or has a + timeout. *note socket.socket.connect(): a21. still raise *note + InterruptedError: a05. for non-blocking sockets. + + - bpo-21526(34): Tkinter now supports new boolean type in Tcl 8.5. + + - bpo-23836(35): Fix the faulthandler module to handle reentrant + calls to its signal handlers. + + - bpo-23838(36): linecache now clears the cache and returns an empty + result on MemoryError. + + - bpo-10395(37): Added os.path.commonpath(). Implemented in + posixpath and ntpath. Based on patch by Rafik Draoui. + + - bpo-23611(38): Serializing more “lookupable” objects (such as + unbound methods or nested classes) now are supported with pickle + protocols < 4. + + - bpo-13583(39): sqlite3.Row now supports slice indexing. + + - bpo-18473(40): 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. + + - bpo-23485(41): 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 PEP + 475(42). + + - bpo-23752(43): When built from an existing file descriptor, + io.FileIO() now only calls fstat() once. Before fstat() was called + twice, which was not necessary. + + - bpo-23704(44): collections.deque() objects now support __add__, + __mul__, and __imul__(). + + - bpo-23171(45): csv.Writer.writerow() now supports arbitrary + iterables. + + - bpo-23745(46): The new email header parser now handles duplicate + MIME parameter names without error, similar to how get_param + behaves. + + - bpo-22117(47): Fix os.utime(), it now rounds the timestamp towards + minus infinity (-inf) instead of rounding towards zero. + + - bpo-23310(48): Fix MagicMock’s initializer to work with + __methods__, just like configure_mock(). Patch by Kasia Jachim. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23840 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16914 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=7159 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=19494 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23703 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=4254 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=19933 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=23193 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=23342 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21217 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=24521 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=22931 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=23811 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=21116 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=22982 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=23464 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=23529 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=21859 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=23865 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23400 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=10838 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=23411 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=23881 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=23853 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=22721 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=15133 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=10590 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=23338 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=15582 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=2175 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=16840 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=23834 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=23618 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=21526 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=23836 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=23838 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=10395 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=23611 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=13583 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=18473 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=23485 + + (42) https://peps.python.org/pep-0475/ + + (43) https://bugs.python.org/issue?@action=redirect&bpo=23752 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=23704 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=23171 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=23745 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=22117 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=23310 + + +File: python.info, Node: Build<70>, Next: Tests<65>, Prev: Library<76>, Up: Python 3 5 0 alpha 4 + +1.21.90.3 Build +............... + + - bpo-23817(1): FreeBSD now uses “1.0” in the SOVERSION as other + operating systems, instead of just “1”. + + - bpo-23501(2): Argument Clinic now generates code into separate + files by default. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23817 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23501 + + +File: python.info, Node: Tests<65>, Next: Tools/Demos<36>, Prev: Build<70>, Up: Python 3 5 0 alpha 4 + +1.21.90.4 Tests +............... + + - bpo-23799(1): Added test.support.start_threads() for running and + cleaning up multiple threads. + + - bpo-22390(2): test.regrtest now emits a warning if temporary files + or directories are left after running a test. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23799 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22390 + + +File: python.info, Node: Tools/Demos<36>, Next: C API<52>, Prev: Tests<65>, Up: Python 3 5 0 alpha 4 + +1.21.90.5 Tools/Demos +..................... + + - bpo-18128(1): pygettext now uses standard +NNNN format in the + POT-Creation-Date header. + + - bpo-23935(2): Argument Clinic’s understanding of format units + accepting bytes, bytearrays, and buffers is now consistent with + both the documentation and the implementation. + + - bpo-23944(3): Argument Clinic now wraps long impl prototypes at + column 78. + + - bpo-20586(4): Argument Clinic now ensures that functions without + docstrings have signatures. + + - bpo-23492(5): Argument Clinic now generates argument parsing code + with PyArg_Parse instead of PyArg_ParseTuple if possible. + + - bpo-23500(6): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18128 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23935 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23944 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20586 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23492 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23500 + + +File: python.info, Node: C API<52>, Prev: Tools/Demos<36>, Up: Python 3 5 0 alpha 4 + +1.21.90.6 C API +............... + + - bpo-23998(1): PyImport_ReInitLock() now checks for lock allocation + error + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23998 + + +File: python.info, Node: Python 3 5 0 alpha 3, Next: Python 3 5 0 alpha 2, Prev: Python 3 5 0 alpha 4, Up: Changelog + +1.21.91 Python 3.5.0 alpha 3 +---------------------------- + +`Release date: 2015-03-28' + +* Menu: + +* Core and Builtins: Core and Builtins<78>. +* Library: Library<77>. +* Build: Build<71>. +* Tests: Tests<66>. +* Tools/Demos: Tools/Demos<37>. + + +File: python.info, Node: Core and Builtins<78>, Next: Library<77>, Up: Python 3 5 0 alpha 3 + +1.21.91.1 Core and Builtins +........................... + + - bpo-23573(1): 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). + + - bpo-23753(2): Python doesn’t support anymore platforms without + stat() or fstat(), these functions are always required. + + - bpo-23681(3): The -b option now affects comparisons of bytes with + int. + + - bpo-23632(4): Memoryviews now allow tuple indexing (including for + multi-dimensional memoryviews). + + - bpo-23192(5): Fixed generator lambdas. Patch by Bruno Cauet. + + - bpo-23629(6): Fix the default __sizeof__ implementation for + variable-sized objects. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23573 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23753 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23681 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23632 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23192 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23629 + + +File: python.info, Node: Library<77>, Next: Build<71>, Prev: Core and Builtins<78>, Up: Python 3 5 0 alpha 3 + +1.21.91.2 Library +................. + + - bpo-14260(1): The groupindex attribute of regular expression + pattern object now is non-modifiable mapping. + + - bpo-23792(2): 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. + + - bpo-23775(3): pprint() of OrderedDict now outputs the same + representation as repr(). + + - bpo-23765(4): Removed IsBadStringPtr calls in ctypes + + - bpo-22364(5): Improved some re error messages using regex for + hints. + + - bpo-23742(6): ntpath.expandvars() no longer loses unbalanced single + quotes. + + - bpo-21717(7): The zipfile.ZipFile.open function now supports ‘x’ + (exclusive creation) mode. + + - bpo-21802(8): The reader in BufferedRWPair now is closed even when + closing writer failed in BufferedRWPair.close(). + + - bpo-23622(9): Unknown escapes in regular expressions that consist + of ‘'\'’ and ASCII letter now raise a deprecation warning and will + be forbidden in Python 3.6. + + - bpo-23671(10): 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. + + - bpo-23502(11): The pprint module now supports mapping proxies. + + - bpo-17530(12): pprint now wraps long bytes objects and bytearrays. + + - bpo-22687(13): Fixed some corner cases in breaking words in + tetxtwrap. Got rid of quadratic complexity in breaking long words. + + - bpo-4727(14): The copy module now uses pickle protocol 4 (PEP 3154) + and supports copying of instances of classes whose __new__ method + takes keyword-only arguments. + + - bpo-23491(15): 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). + + - bpo-23657(16): Avoid explicit checks for str in zipapp, adding + support for pathlib.Path objects as arguments. + + - bpo-23688(17): Added support of arbitrary bytes-like objects and + avoided unnecessary copying of memoryview in gzip.GzipFile.write(). + Original patch by Wolfgang Maier. + + - bpo-23252(18): Added support for writing ZIP files to unseekable + streams. + + - bpo-23647(19): Increase imaplib’s MAXLINE to accommodate modern + mailbox sizes. + + - bpo-23539(20): 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. + + - bpo-22351(21): The nntplib.NNTP constructor no longer leaves the + connection and socket open until the garbage collector cleans them + up. Patch by Martin Panter. + + - bpo-23704(22): 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. + + - bpo-23715(23): *note signal.sigwaitinfo(): a2a. and *note + signal.sigtimedwait(): a29. 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. + + - bpo-23001(24): 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. + + - bpo-23646(25): 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). + + - bpo-23136(26): _strptime now uniformly handles all days in week 0, + including Dec 30 of previous year. Based on patch by Jim Carroll. + + - bpo-23700(27): Iterator of NamedTemporaryFile now keeps a reference + to NamedTemporaryFile instance. Patch by Bohuslav Kabrda. + + - bpo-22903(28): The fake test case created by unittest.loader when + it fails importing a test module is now picklable. + + - bpo-22181(29): 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. + + - bpo-2211(30): 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. + + - bpo-18983(31): Allow selection of output units in timeit. Patch by + Julian Gindi. + + - bpo-23631(32): Fix traceback.format_list when a traceback has been + mutated. + + - bpo-23568(33): Add rdivmod support to MagicMock() objects. Patch + by Håkan Lövdahl. + + - bpo-2052(34): Add charset parameter to HtmlDiff.make_file(). + + - bpo-23668(35): Support os.truncate and os.ftruncate on Windows. + + - bpo-23138(36): Fixed parsing cookies with absent keys or values in + cookiejar. Patch by Demian Brecht. + + - bpo-23051(37): multiprocessing.Pool methods imap() and + imap_unordered() now handle exceptions raised by an iterator. + Patch by Alon Diamant and Davin Potts. + + - bpo-23581(38): Add matmul support to MagicMock. Patch by Håkan + Lövdahl. + + - bpo-23566(39): enable(), register(), dump_traceback() and + dump_traceback_later() functions of faulthandler now accept file + descriptors. Patch by Wei Wu. + + - bpo-22928(40): Disabled HTTP header injections in http.client. + Original patch by Demian Brecht. + + - bpo-23615(41): Modules bz2, tarfile and tokenize now can be + reloaded with imp.reload(). Patch by Thomas Kluyver. + + - bpo-23605(42): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14260 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23792 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23775 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=23765 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22364 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23742 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=21717 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=21802 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=23622 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=23671 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23502 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=17530 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=22687 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=4727 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=23491 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=23657 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=23688 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=23252 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=23647 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=23539 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=22351 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=23704 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=23715 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=23001 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=23646 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=23136 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=23700 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=22903 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=22181 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=2211 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=18983 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=23631 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=23568 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=2052 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=23668 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=23138 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=23051 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=23581 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=23566 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=22928 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=23615 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=23605 + + +File: python.info, Node: Build<71>, Next: Tests<66>, Prev: Library<77>, Up: Python 3 5 0 alpha 3 + +1.21.91.3 Build +............... + + - bpo-23585(1): make patchcheck will ensure the interpreter is built. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23585 + + +File: python.info, Node: Tests<66>, Next: Tools/Demos<37>, Prev: Build<71>, Up: Python 3 5 0 alpha 3 + +1.21.91.4 Tests +............... + + - bpo-23583(1): Added tests for standard IO streams in IDLE. + + - bpo-22289(2): Prevent test_urllib2net failures due to ftp + connection timeout. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23583 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22289 + + +File: python.info, Node: Tools/Demos<37>, Prev: Tests<66>, Up: Python 3 5 0 alpha 3 + +1.21.91.5 Tools/Demos +..................... + + - bpo-22826(1): 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). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22826 + + +File: python.info, Node: Python 3 5 0 alpha 2, Next: Python 3 5 0 alpha 1, Prev: Python 3 5 0 alpha 3, Up: Changelog + +1.21.92 Python 3.5.0 alpha 2 +---------------------------- + +`Release date: 2015-03-09' + +* Menu: + +* Core and Builtins: Core and Builtins<79>. +* Library: Library<78>. +* Build: Build<72>. +* C API: C API<53>. +* Windows: Windows<59>. + + +File: python.info, Node: Core and Builtins<79>, Next: Library<78>, Up: Python 3 5 0 alpha 2 + +1.21.92.1 Core and Builtins +........................... + + - bpo-23571(1): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23571 + + +File: python.info, Node: Library<78>, Next: Build<72>, Prev: Core and Builtins<79>, Up: Python 3 5 0 alpha 2 + +1.21.92.2 Library +................. + + - bpo-22524(1): New os.scandir() function, part of the PEP 471(2): + “os.scandir() function – a better and faster directory iterator”. + Patch written by Ben Hoyt. + + - bpo-23103(3): Reduced the memory consumption of IPv4Address and + IPv6Address. + + - bpo-21793(4): BaseHTTPRequestHandler again logs response code as + numeric, not as stringified enum. Patch by Demian Brecht. + + - bpo-23476(5): In the ssl module, enable OpenSSL’s + X509_V_FLAG_TRUSTED_FIRST flag on certificate stores when it is + available. + + - bpo-23576(6): Avoid stalling in SSL reads when EOF has been reached + in the SSL layer but the underlying connection hasn’t been closed. + + - bpo-23504(7): Added an __all__ to the types module. + + - bpo-23563(8): Optimized utility functions in urllib.parse. + + - bpo-7830(9): Flatten nested functools.partial. + + - bpo-20204(10): Added the __module__ attribute to _tkinter classes. + + - bpo-19980(11): 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. + + - bpo-23521(12): Corrected pure python implementation of timedelta + division. Eliminated OverflowError from ‘timedelta * float’ for + some floats; Corrected rounding in timedelta true division. + + - bpo-21619(13): Popen objects no longer leave a zombie after exit in + the with statement if the pipe was broken. Patch by Martin Panter. + + - bpo-22936(14): Make it possible to show local variables in + tracebacks for both the traceback module and unittest. + + - bpo-15955(15): Add an option to limit the output size in + bz2.decompress(). Patch by Nikolaus Rath. + + - bpo-6639(16): Module-level turtle functions no longer raise + TclError after closing the window. + + - bpo-814253(17): Group references and conditional group references + now work in lookbehind assertions in regular expressions. (See + also: bpo-9179(18)) + + - bpo-23215(19): Multibyte codecs with custom error handlers that + ignores errors consumed too much memory and raised SystemError or + MemoryError. Original patch by Aleksi Torhamo. + + - bpo-5700(20): io.FileIO() called flush() after closing the file. + flush() was not called in close() if closefd=False. + + - bpo-23374(21): Fixed pydoc failure with non-ASCII files when stdout + encoding differs from file system encoding (e.g. on Mac OS). + + - bpo-23481(22): Remove RC4 from the SSL module’s default cipher + list. + + - bpo-21548(23): Fix pydoc.synopsis() and pydoc.apropos() on modules + with empty docstrings. + + - bpo-22885(24): Fixed arbitrary code execution vulnerability in the + dbm.dumb module. Original patch by Claudiu Popa. + + - bpo-23239(25): ssl.match_hostname() now supports matching of IP + addresses. + + - bpo-23146(26): Fix mishandling of absolute Windows paths with + forward slashes in pathlib. + + - bpo-23096(27): Pickle representation of floats with protocol 0 now + is the same for both Python and C implementations. + + - bpo-19105(28): pprint now more efficiently uses free space at the + right. + + - bpo-14910(29): Add allow_abbrev parameter to + argparse.ArgumentParser. Patch by Jonathan Paugh, Steven Bethard, + paul j3 and Daniel Eriksson. + + - bpo-21717(30): tarfile.open() now supports ‘x’ (exclusive creation) + mode. + + - bpo-23344(31): marshal.dumps() is now 20-25% faster on average. + + - bpo-20416(32): marshal.dumps() with protocols 3 and 4 is now 40-50% + faster on average. + + - bpo-23421(33): Fixed compression in tarfile CLI. Patch by wdv4758h. + + - bpo-23367(34): Fix possible overflows in the unicodedata module. + + - bpo-23361(35): Fix possible overflow in Windows subprocess creation + code. + + - 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. + + - bpo-19705(36): turtledemo now has a visual sorting algorithm demo. + Original patch from Jason Yeo. + + - bpo-23801(37): Fix issue where cgi.FieldStorage did not always + ignore the entire preamble to a multipart body. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22524 + + (2) https://peps.python.org/pep-0471/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23103 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21793 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=23476 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23576 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23504 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=23563 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=7830 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=20204 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=19980 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=23521 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=21619 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=22936 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=15955 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=6639 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=814253 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=9179 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=23215 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=5700 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=23374 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=23481 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=21548 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=22885 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=23239 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=23146 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=23096 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=19105 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=14910 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=21717 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=23344 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=20416 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=23421 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=23367 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=23361 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=19705 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=23801 + + +File: python.info, Node: Build<72>, Next: C API<53>, Prev: Library<78>, Up: Python 3 5 0 alpha 2 + +1.21.92.3 Build +............... + + - bpo-23445(1): pydebug builds now use “gcc -Og” where possible, to + make the resulting executable faster. + + - bpo-23686(2): Update OS X 10.5 installer build to use OpenSSL + 1.0.2a. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23445 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=23686 + + +File: python.info, Node: C API<53>, Next: Windows<59>, Prev: Build<72>, Up: Python 3 5 0 alpha 2 + +1.21.92.4 C API +............... + + - bpo-20204(1): Deprecation warning is now raised for builtin types + without the __module__ attribute. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20204 + + +File: python.info, Node: Windows<59>, Prev: C API<53>, Up: Python 3 5 0 alpha 2 + +1.21.92.5 Windows +................. + + - bpo-23465(1): Implement PEP 486(2) - Make the Python Launcher aware + of virtual environments. Patch by Paul Moore. + + - bpo-23437(3): Make user scripts directory versioned on Windows. + Patch by Paul Moore. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23465 + + (2) https://peps.python.org/pep-0486/ + + (3) https://bugs.python.org/issue?@action=redirect&bpo=23437 + + +File: python.info, Node: Python 3 5 0 alpha 1, Prev: Python 3 5 0 alpha 2, Up: Changelog + +1.21.93 Python 3.5.0 alpha 1 +---------------------------- + +`Release date: 2015-02-08' + +* Menu: + +* Core and Builtins: Core and Builtins<80>. +* Library: Library<79>. +* IDLE: IDLE<51>. +* Build: Build<73>. +* C API: C API<54>. +* Documentation: Documentation<63>. +* Tests: Tests<67>. +* Tools/Demos: Tools/Demos<38>. +* Windows: Windows<60>. + + +File: python.info, Node: Core and Builtins<80>, Next: Library<79>, Up: Python 3 5 0 alpha 1 + +1.21.93.1 Core and Builtins +........................... + + - bpo-23285(1): PEP 475 - EINTR handling. + + - bpo-22735(2): Fix many edge cases (including crashes) involving + custom mro() implementations. + + - bpo-22896(3): Avoid using PyObject_AsCharBuffer(), + PyObject_AsReadBuffer() and PyObject_AsWriteBuffer(). + + - bpo-21295(4): Revert some changes (bpo-16795(5)) to AST line + numbers and column offsets that constituted a regression. + + - bpo-22986(6): Allow changing an object’s __class__ between a + dynamic type and static type in some cases. + + - bpo-15859(7): 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. + + - bpo-21408(8): The default __ne__() now returns NotImplemented if + __eq__() returned NotImplemented. Original patch by Martin Panter. + + - bpo-23321(9): Fixed a crash in str.decode() when error handler + returned replacement string longer than malformed input data. + + - bpo-22286(10): The “backslashreplace” error handlers now works with + decoding and translating. + + - bpo-23253(11): Delay-load ShellExecute[AW] in os.startfile for + reduced startup overhead on Windows. + + - bpo-22038(12): 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. + + - bpo-20284(13): %-interpolation (aka printf) formatting added for + bytes and bytearray. + + - bpo-23048(14): Fix jumping out of an infinite while loop in the + pdb. + + - bpo-20335(15): bytes constructor now raises TypeError when encoding + or errors is specified with non-string argument. Based on patch by + Renaud Blanch. + + - bpo-22834(16): If the current working directory ends up being set + to a non-existent directory then import will no longer raise + FileNotFoundError. + + - bpo-22869(17): Move the interpreter startup & shutdown code to a + new dedicated pylifecycle.c module + + - bpo-22847(18): Improve method cache efficiency. + + - bpo-22335(19): Fix crash when trying to enlarge a bytearray to + 0x7fffffff bytes on a 32-bit platform. + + - bpo-22653(20): Fix an assertion failure in debug mode when doing a + reentrant dict insertion in debug mode. + + - bpo-22643(21): Fix integer overflow in Unicode case operations + (upper, lower, title, swapcase, casefold). + + - bpo-17636(22): Circular imports involving relative imports are now + supported. + + - bpo-22604(23): Fix assertion error in debug mode when dividing a + complex number by (nan+0j). + + - bpo-21052(24): Do not raise ImportWarning when sys.path_hooks or + sys.meta_path are set to None. + + - bpo-16518(25): Use ‘bytes-like object required’ in error messages + that previously used the far more cryptic “‘x’ does not support the + buffer protocol. + + - bpo-22470(26): Fixed integer overflow issues in “backslashreplace”, + “xmlcharrefreplace”, and “surrogatepass” error handlers. + + - bpo-22540(27): speed up ‘PyObject_IsInstance’ and + ‘PyObject_IsSubclass’ in the common case that the second argument + has metaclass *note type: 9c2. + + - bpo-18711(28): Add a new ‘PyErr_FormatV’ function, similar to + ‘PyErr_Format’ but accepting a ‘va_list’ argument. + + - bpo-22520(29): Fix overflow checking when generating the repr of a + unicode object. + + - bpo-22519(30): Fix overflow checking in PyBytes_Repr. + + - bpo-22518(31): Fix integer overflow issues in latin-1 encoding. + + - bpo-16324(32): _charset parameter of MIMEText now also accepts + email.charset.Charset instances. Initial patch by Claude Paroz. + + - bpo-1764286(33): Fix inspect.getsource() to support decorated + functions. Patch by Claudiu Popa. + + - bpo-18554(34): os.__all__ includes posix functions. + + - bpo-21391(35): Use os.path.abspath in the shutil module. + + - bpo-11471(36): avoid generating a JUMP_FORWARD instruction at the + end of an if-block if there is no else-clause. Original patch by + Eugene Toder. + + - bpo-22215(37): Now ValueError is raised instead of TypeError when + str or bytes argument contains not permitted null character or + byte. + + - bpo-22258(38): Fix the internal function set_inheritable() on + Illumos. This platform exposes the function ‘ioctl(FIOCLEX)’, but + calling it fails with errno is ENOTTY: “Inappropriate ioctl for + device”. set_inheritable() now falls back to the slower ‘fcntl()’ + (‘F_GETFD’ and then ‘F_SETFD’). + + - bpo-21389(39): Displaying the __qualname__ of the underlying + function in the repr of a bound method. + + - bpo-22206(40): Using pthread, PyThread_create_key() now sets errno + to ENOMEM and returns -1 (error) on integer overflow. + + - bpo-20184(41): Argument Clinic based signature introspection added + for 30 of the builtin functions. + + - bpo-22116(42): C functions and methods (of the + ‘builtin_function_or_method’ type) can now be weakref’ed. Patch by + Wei Wu. + + - bpo-22077(43): Improve index error messages for bytearrays, bytes, + lists, and tuples by adding ‘or slices’. Added ‘, not ’ + for bytearrays. Original patch by Claudiu Popa. + + - bpo-20179(44): Apply Argument Clinic to bytes and bytearray. Patch + by Tal Einat. + + - bpo-22082(45): Clear interned strings in slotdefs. + + - Upgrade Unicode database to Unicode 7.0.0. + + - bpo-21897(46): Fix a crash with the f_locals attribute with closure + variables when frame.clear() has been called. + + - bpo-21205(47): Add a new ‘__qualname__’ attribute to generator, the + qualified name, and use it in the representation of a generator + (‘repr(gen)’). The default name of the generator (‘__name__’ + attribute) is now get from the function instead of the code. Use + ‘gen.gi_code.co_name’ to get the name of the code. + + - bpo-21669(48): 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. + + - bpo-21642(49): In the conditional if-else expression, allow an + integer written with no space between itself and the ‘else’ keyword + (e.g. ‘True if 42else False’) to be valid syntax. + + - bpo-21523(50): 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. + + - bpo-21418(51): Fix a crash in the builtin function super() when + called without argument and without current frame (ex: embedded + Python). + + - bpo-21425(52): Fix flushing of standard streams in the interactive + interpreter. + + - bpo-21435(53): 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. + + - bpo-21377(54): PyBytes_Concat() now tries to concatenate in-place + when the first argument has a reference count of 1. Patch by + Nikolaus Rath. + + - bpo-20355(55): -W command line options now have higher priority + than the PYTHONWARNINGS environment variable. Patch by Arfrever. + + - bpo-21274(56): Define PATH_MAX for GNU/Hurd in Python/pythonrun.c. + + - bpo-20904(57): Support setting FPU precision on m68k. + + - bpo-21209(58): Fix sending tuples to custom generator objects with + the yield from syntax. + + - bpo-21193(59): pow(a, b, c) now raises ValueError rather than + TypeError when b is negative. Patch by Josh Rosenberg. + + - bpo-21176(60): PEP 465: Add the ‘@’ operator for matrix + multiplication. + + - bpo-21134(61): Fix segfault when str is called on an uninitialized + UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError + object. + + - bpo-19537(62): Fix PyUnicode_DATA() alignment under m68k. Patch by + Andreas Schwab. + + - bpo-20929(63): Add a type cast to avoid shifting a negative number. + + - bpo-20731(64): Properly position in source code files even if they + are opened in text mode. Patch by Serhiy Storchaka. + + - bpo-20637(65): Key-sharing now also works for instance dictionaries + of subclasses. Patch by Peter Ingebretson. + + - bpo-8297(66): Attributes missing from modules now include the + module name in the error text. Original patch by ysj.ray. + + - bpo-19995(67): %c, %o, %x, and %X now raise TypeError on + non-integer input. + + - bpo-19655(68): 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. + + - bpo-12546(69): Allow ‘\x00’ to be used as a fill character when + using str, int, float, and complex __format__ methods. + + - bpo-20480(70): Add ipaddress.reverse_pointer. Patch by Leon Weber. + + - bpo-13598(71): 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. + + - bpo-8931(72): 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. + + - bpo-23165(73): Perform overflow checks before allocating memory in + the _Py_char2wchar function. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23285 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22735 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22896 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21295 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=16795 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22986 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=15859 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=21408 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=23321 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=22286 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23253 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=22038 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=20284 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=23048 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=20335 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=22834 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=22869 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=22847 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=22335 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=22653 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=22643 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=17636 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=22604 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=21052 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=16518 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=22470 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=22540 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=18711 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=22520 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=22519 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=22518 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=16324 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=1764286 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=18554 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=21391 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=11471 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=22215 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=22258 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=21389 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=22206 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=20184 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=22116 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=22077 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=20179 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=22082 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=21897 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=21205 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=21669 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=21642 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=21523 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=21418 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=21425 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=21435 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=21377 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=20355 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=21274 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=20904 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=21209 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=21193 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=21176 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=21134 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=19537 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=20929 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=20731 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=20637 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=8297 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=19995 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=19655 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=12546 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=20480 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=13598 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=8931 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=23165 + + +File: python.info, Node: Library<79>, Next: IDLE<51>, Prev: Core and Builtins<80>, Up: Python 3 5 0 alpha 1 + +1.21.93.2 Library +................. + + - bpo-23399(1): pyvenv creates relative symlinks where possible. + + - bpo-20289(2): cgi.FieldStorage() now supports the context + management protocol. + + - bpo-13128(3): Print response headers for CONNECT requests when + debuglevel > 0. Patch by Demian Brecht. + + - bpo-15381(4): Optimized io.BytesIO to make less allocations and + copyings. + + - bpo-22818(5): Splitting on a pattern that could match an empty + string now raises a warning. Patterns that can only match empty + strings are now rejected. + + - bpo-23099(6): Closing io.BytesIO with exported buffer is rejected + now to prevent corrupting exported buffer. + + - bpo-23326(7): Removed __ne__ implementations. Since fixing default + __ne__ implementation in bpo-21408(8) they are redundant. + + - bpo-23363(9): Fix possible overflow in itertools.permutations. + + - bpo-23364(10): Fix possible overflow in itertools.product. + + - bpo-23366(11): Fixed possible integer overflow in + itertools.combinations. + + - bpo-23369(12): Fixed possible integer overflow in + _json.encode_basestring_ascii. + + - bpo-23353(13): 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. + + - bpo-14099(14): Restored support of writing ZIP files to tellable + but non-seekable streams. + + - bpo-14099(15): Writing to ZipFile and reading multiple ZipExtFiles + is threadsafe now. + + - bpo-19361(16): JSON decoder now raises JSONDecodeError instead of + ValueError. + + - bpo-18518(17): timeit now rejects statements which can’t be + compiled outside a function or a loop (e.g. “return” or “break”). + + - bpo-23094(18): Fixed readline with frames in Python implementation + of pickle. + + - bpo-23268(19): Fixed bugs in the comparison of ipaddress classes. + + - bpo-21408(20): Removed incorrect implementations of __ne__() which + didn’t returned NotImplemented if __eq__() returned NotImplemented. + The default __ne__() now works correctly. + + - bpo-19996(21): ‘email.feedparser.FeedParser’ now handles + (malformed) headers with no key rather than assuming the body has + started. + + - bpo-20188(22): Support Application-Layer Protocol Negotiation + (ALPN) in the ssl module. + + - bpo-23133(23): Pickling of ipaddress objects now produces more + compact and portable representation. + + - bpo-23248(24): Update ssl error codes from latest OpenSSL git + master. + + - bpo-23266(25): Much faster implementation of + ipaddress.collapse_addresses() when there are many non-consecutive + addresses. + + - bpo-23098(26): 64-bit dev_t is now supported in the os module. + + - bpo-21817(27): 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. + + - bpo-15955(28): Add an option to limit output size when + decompressing LZMA data. Patch by Nikolaus Rath and Martin Panter. + + - bpo-23250(29): In the http.cookies module, capitalize “HttpOnly” + and “Secure” as they are written in the standard. + + - bpo-23063(30): In the distutils’ check command, fix parsing of reST + with code or code-block directives. + + - bpo-23209(31): 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(32)) + + - bpo-17911(33): Provide a way to seed the linecache for a PEP-302 + module without actually loading the code. + + - bpo-17911(34): 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. + + - bpo-19777(35): Provide a home() classmethod on Path objects. + Contributed by Victor Salgado and Mayank Tripathi. + + - bpo-23206(36): Make ‘json.dumps(..., ensure_ascii=False)’ as fast + as the default case of ‘ensure_ascii=True’. Patch by Naoki Inada. + + - bpo-23185(37): Add math.inf and math.nan constants. + + - bpo-23186(38): Add ssl.SSLObject.shared_ciphers() and + ssl.SSLSocket.shared_ciphers() to fetch the client’s list ciphers + sent at handshake. + + - bpo-23143(39): Remove compatibility with OpenSSLs older than 0.9.8. + + - bpo-23132(40): Improve performance and introspection support of + comparison methods created by functool.total_ordering. + + - bpo-19776(41): Add an expanduser() method on Path objects. + + - bpo-23112(42): Fix SimpleHTTPServer to correctly carry the query + string and fragment when it redirects to add a trailing slash. + + - bpo-21793(43): Added http.HTTPStatus enums (i.e. HTTPStatus.OK, + HTTPStatus.NOT_FOUND). Patch by Demian Brecht. + + - bpo-23093(44): In the io, module allow more operations to work on + detached streams. + + - bpo-23111(45): In the ftplib, make ssl.PROTOCOL_SSLv23 the default + protocol version. + + - bpo-22585(46): On OpenBSD 5.6 and newer, os.urandom() now calls + getentropy(), instead of reading /dev/urandom, to get pseudo-random + bytes. + + - bpo-19104(47): pprint now produces evaluable output for wrapped + strings. + + - bpo-23071(48): Added missing names to codecs.__all__. Patch by + Martin Panter. + + - bpo-22783(49): Pickling now uses the NEWOBJ opcode instead of the + NEWOBJ_EX opcode if possible. + + - bpo-15513(50): Added a __sizeof__ implementation for pickle + classes. + + - bpo-19858(51): 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. + + - bpo-22095(52): Fixed HTTPConnection.set_tunnel with default port. + The port value in the host header was set to “None”. Patch by + Demian Brecht. + + - bpo-23016(53): A warning no longer produces an AttributeError when + the program is run with pythonw.exe. + + - bpo-21775(54): 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. + + - bpo-1218234(55): Fix inspect.getsource() to load updated source of + reloaded module. Initial patch by Berker Peksag. + + - bpo-21740(56): Support wrapped callables in doctest. Patch by + Claudiu Popa. + + - bpo-23009(57): Make sure selectors.EpollSelector.select() works + when no FD is registered. + + - bpo-22959(58): In the constructor of http.client.HTTPSConnection, + prefer the context’s check_hostname attribute over the + `check_hostname' parameter. + + - bpo-22696(59): Add function *note sys.is_finalizing(): afe. to know + about interpreter shutdown. + + - bpo-16043(60): Add a default limit for the amount of data + xmlrpclib.gzip_decode will return. This resolves CVE-2013-1753. + + - bpo-14099(61): 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. + + - bpo-22966(62): Fix __pycache__ pyc file name clobber when + pyc_compile is asked to compile a source file containing multiple + dots in the source file name. + + - bpo-21971(63): Update turtledemo doc and add module to the index. + + - bpo-21032(64): Fixed socket leak if HTTPConnection.getresponse() + fails. Original patch by Martin Panter. + + - bpo-22407(65): Deprecated the use of re.LOCALE flag with str + patterns or re.ASCII. It was newer worked. + + - bpo-22902(66): The “ip” command is now used on Linux to determine + MAC address in uuid.getnode(). Pach by Bruno Cauet. + + - bpo-22960(67): Add a context argument to xmlrpclib.ServerProxy + constructor. + + - bpo-22389(68): Add contextlib.redirect_stderr(). + + - bpo-21356(69): Make ssl.RAND_egd() optional to support LibreSSL. + The availability of the function is checked during the compilation. + Patch written by Bernard Spil. + + - bpo-22915(70): SAX parser now supports files opened with file + descriptor or bytes path. + + - bpo-22609(71): Constructors and update methods of mapping classes + in the collections module now accept the self keyword argument. + + - bpo-22940(72): Add readline.append_history_file. + + - bpo-19676(73): Added the “namereplace” error handler. + + - bpo-22788(74): Add `context' parameter to + logging.handlers.HTTPHandler. + + - bpo-22921(75): Allow SSLContext to take the `hostname' parameter + even if OpenSSL doesn’t support SNI. + + - bpo-22894(76): TestCase.subTest() would cause the test suite to be + stopped when in failfast mode, even in the absence of failures. + + - bpo-22796(77): HTTP cookie parsing is now stricter, in order to + protect against potential injection attacks. + + - bpo-22370(78): Windows detection in pathlib is now more robust. + + - bpo-22841(79): Reject coroutines in asyncio add_signal_handler(). + Patch by Ludovic.Gasc. + + - bpo-19494(80): Added urllib.request.HTTPBasicPriorAuthHandler. + Patch by Matej Cepl. + + - bpo-22578(81): Added attributes to the re.error class. + + - bpo-22849(82): Fix possible double free in the io.TextIOWrapper + constructor. + + - bpo-12728(83): Different Unicode characters having the same + uppercase but different lowercase are now matched in + case-insensitive regular expressions. + + - bpo-22821(84): Fixed fcntl() with integer argument on 64-bit + big-endian platforms. + + - bpo-21650(85): Add an ‘--sort-keys’ option to json.tool CLI. + + - bpo-22824(86): Updated reprlib output format for sets to use set + literals. Patch contributed by Berker Peksag. + + - bpo-22824(87): Updated reprlib output format for arrays to display + empty arrays without an unnecessary empty list. Suggested by + Serhiy Storchaka. + + - bpo-22406(88): Fixed the uu_codec codec incorrectly ported to 3.x. + Based on patch by Martin Panter. + + - bpo-17293(89): uuid.getnode() now determines MAC address on AIX + using netstat. Based on patch by Aivars Kalvāns. + + - bpo-22769(90): Fixed ttk.Treeview.tag_has() when called without + arguments. + + - bpo-22417(91): Verify certificates by default in httplib (PEP 476). + + - bpo-22775(92): Fixed unpickling of http.cookies.SimpleCookie with + protocol 2 and above. Patch by Tim Graham. + + - bpo-22776(93): Brought excluded code into the scope of a try block + in SysLogHandler.emit(). + + - bpo-22665(94): Add missing get_terminal_size and SameFileError to + shutil.__all__. + + - bpo-6623(95): Remove deprecated Netrc class in the ftplib module. + Patch by Matt Chaput. + + - bpo-17381(96): Fixed handling of case-insensitive ranges in regular + expressions. + + - bpo-22410(97): Module level functions in the re module now cache + compiled locale-dependent regular expressions taking into account + the locale. + + - bpo-22759(98): Query methods on pathlib.Path() (exists(), is_dir(), + etc.) now return False when the underlying stat call raises + NotADirectoryError. + + - bpo-8876(99): distutils now falls back to copying files when hard + linking doesn’t work. This allows use with special filesystems + such as VirtualBox shared folders. + + - bpo-22217(100): Implemented reprs of classes in the zipfile module. + + - bpo-22457(101): Honour load_tests in the start_dir of discovery. + + - bpo-18216(102): gettext now raises an error when a .mo file has an + unsupported major version number. Patch by Aaron Hill. + + - bpo-13918(103): 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. + + - bpo-22676(104): Make the pickling of global objects which don’t + have a __module__ attribute less slow. + + - bpo-18853(105): Fixed ResourceWarning in shlex.__nain__. + + - bpo-9351(106): Defaults set with set_defaults on an argparse + subparser are no longer ignored when also set on the parent parser. + + - bpo-7559(107): unittest test loading ImportErrors are reported as + import errors with their import exception rather than as attribute + errors after the import has already failed. + + - bpo-19746(108): Make it possible to examine the errors from + unittest discovery without executing the test suite. The new + ‘errors’ attribute on TestLoader exposes these non-fatal errors + encountered during discovery. + + - bpo-21991(109): 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. + + - bpo-22638(110): SSLv3 is now disabled throughout the standard + library. It can still be enabled by instantiating a SSLContext + manually. + + - bpo-22641(111): In asyncio, the default SSL context for client + connections is now created using ssl.create_default_context(), for + stronger security. + + - bpo-17401(112): Include closefd in io.FileIO repr. + + - bpo-21338(113): 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. + + - bpo-20152(114): Convert the array and cmath modules to Argument + Clinic. + + - bpo-18643(115): Add socket.socketpair() on Windows. + + - bpo-22435(116): Fix a file descriptor leak when socketserver bind + fails. + + - bpo-13096(117): Fixed segfault in CTypes POINTER handling of large + values. + + - bpo-11694(118): Raise ConversionError in xdrlib as documented. + Patch by Filip Gruszczyński and Claudiu Popa. + + - bpo-19380(119): Optimized parsing of regular expressions. + + - bpo-1519638(120): Now unmatched groups are replaced with empty + strings in re.sub() and re.subn(). + + - bpo-18615(121): sndhdr.what/whathdr now return a namedtuple. + + - bpo-22462(122): Fix pyexpat’s creation of a dummy frame to make it + appear in exception tracebacks. + + - bpo-21965(123): Add support for in-memory SSL to the ssl module. + Patch by Geert Jansen. + + - bpo-21173(124): Fix len() on a WeakKeyDictionary when .clear() was + called with an iterator alive. + + - bpo-11866(125): Eliminated race condition in the computation of + names for new threads. + + - bpo-21905(126): Avoid RuntimeError in pickle.whichmodule() when + sys.modules is mutated while iterating. Patch by Olivier Grisel. + + - bpo-11271(127): 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. + + - bpo-21883(128): os.path.join() and os.path.relpath() now raise a + TypeError with more helpful error message for unsupported or + mismatched types of arguments. + + - bpo-22219(129): The zipfile module CLI now adds entries for + directories (including empty directories) in ZIP file. + + - bpo-22449(130): In the ssl.SSLContext.load_default_certs, consult + the environmental variables SSL_CERT_DIR and SSL_CERT_FILE on + Windows. + + - bpo-22508(131): 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. + + - bpo-20076(132): Added non derived UTF-8 aliases to locale aliases + table. + + - bpo-20079(133): Added locales supported in glibc 2.18 to locale + alias table. + + - bpo-20218(134): Added convenience methods read_text/write_text and + read_bytes/ write_bytes to pathlib.Path objects. + + - bpo-22396(135): On 32-bit AIX platform, don’t expose + os.posix_fadvise() nor os.posix_fallocate() because their + prototypes in system headers are wrong. + + - bpo-22517(136): When an io.BufferedRWPair object is deallocated, + clear its weakrefs. + + - bpo-22437(137): Number of capturing groups in regular expression is + no longer limited by 100. + + - bpo-17442(138): InteractiveInterpreter now displays the full + chained traceback in its showtraceback method, to match the built + in interactive interpreter. + + - bpo-23392(139): Added tests for marshal C API that works with + FILE*. + + - bpo-10510(140): distutils register and upload methods now use HTML + standards compliant CRLF line endings. + + - bpo-9850(141): Fixed macpath.join() for empty first component. + Patch by Oleg Oshmyan. + + - bpo-5309(142): distutils’ build and build_ext commands now accept a + ‘-j’ option to enable parallel building of extension modules. + + - bpo-22448(143): Improve canceled timer handles cleanup to prevent + unbound memory usage. Patch by Joshua Moore-Oliva. + + - bpo-22427(144): TemporaryDirectory no longer attempts to clean up + twice when used in the with statement in generator. + + - bpo-22362(145): Forbidden ambiguous octal escapes out of range + 0-0o377 in regular expressions. + + - bpo-20912(146): Now directories added to ZIP file have correct Unix + and MS-DOS directory attributes. + + - bpo-21866(147): ZipFile.close() no longer writes ZIP64 central + directory records if allowZip64 is false. + + - bpo-22278(148): Fix urljoin problem with relative urls, a + regression observed after changes to issue22118 were submitted. + + - bpo-22415(149): Fixed debugging output of the GROUPREF_EXISTS + opcode in the re module. Removed trailing spaces in debugging + output. + + - bpo-22423(150): Unhandled exception in thread no longer causes + unhandled AttributeError when sys.stderr is None. + + - bpo-21332(151): Ensure that ‘bufsize=1’ in subprocess.Popen() + selects line buffering, rather than block buffering. Patch by + Akira Li. + + - bpo-21091(152): Fix API bug: + email.message.EmailMessage.is_attachment is now a method. + + - bpo-21079(153): Fix email.message.EmailMessage.is_attachment to + return the correct result when the header has parameters as well as + a value. + + - bpo-22247(154): Add NNTPError to nntplib.__all__. + + - bpo-22366(155): urllib.request.urlopen will accept a context object + (SSLContext) as an argument which will then be used for HTTPS + connection. Patch by Alex Gaynor. + + - bpo-4180(156): The warnings registries are now reset when the + filters are modified. + + - bpo-22419(157): 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. + + - 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. + + - bpo-20537(158): logging methods now accept an exception instance as + well as a Boolean value or exception tuple. Thanks to Yury + Selivanov for the patch. + + - bpo-22384(159): An exception in Tkinter callback no longer crashes + the program when it is run with pythonw.exe. + + - bpo-22168(160): Prevent turtle AttributeError with non-default + Canvas on OS X. + + - bpo-21147(161): sqlite3 now raises an exception if the request + contains a null character instead of truncating it. Based on patch + by Victor Stinner. + + - bpo-13968(162): The glob module now supports recursive search in + subdirectories using the ‘**’ pattern. + + - bpo-21951(163): Fixed a crash in Tkinter on AIX when called Tcl + command with empty string or tuple argument. + + - bpo-21951(164): Tkinter now most likely raises MemoryError instead + of crash if the memory allocation fails. + + - bpo-22338(165): Fix a crash in the json module on memory allocation + failure. + + - bpo-12410(166): imaplib.IMAP4 now supports the context management + protocol. Original patch by Tarek Ziadé. + + - bpo-21270(167): We now override tuple methods in mock.call objects + so that they can be used as normal call attributes. + + - bpo-16662(168): load_tests() is now unconditionally run when it is + present in a package’s __init__.py. + TestLoader.loadTestsFromModule() still accepts use_load_tests, but + it is deprecated and ignored. A new keyword-only attribute + ‘pattern’ is added and documented. Patch given by Robert Collins, + tweaked by Barry Warsaw. + + - bpo-22226(169): First letter no longer is stripped from the + “status” key in the result of Treeview.heading(). + + - bpo-19524(170): Fixed resource leak in the HTTP connection when an + invalid response is received. Patch by Martin Panter. + + - bpo-20421(171): Add a .version() method to SSL sockets exposing the + actual protocol version in use. + + - bpo-19546(172): configparser exceptions no longer expose + implementation details. Chained KeyErrors are removed, which leads + to cleaner tracebacks. Patch by Claudiu Popa. + + - bpo-22051(173): 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. + + - bpo-21933(174): Turtledemo users can change the code font size with + a menu selection or control(command) ‘-’ or ‘+’ or + control-mousewheel. Original patch by Lita Cho. + + - bpo-21597(175): 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. + + - bpo-18132(176): Turtledemo buttons no longer disappear when the + window is shrunk. Original patches by Jan Kanis and Lita Cho. + + - bpo-22043(177): time.monotonic() is now always available. + ‘threading.Lock.acquire()’, ‘threading.RLock.acquire()’ and socket + operations now use a monotonic clock, instead of the system clock, + when a timeout is used. + + - bpo-21527(178): Add a default number of workers to + ThreadPoolExecutor equal to 5 times the number of CPUs. Patch by + Claudiu Popa. + + - bpo-22216(179): 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. + + - bpo-22098(180): ctypes’ BigEndianStructure and + LittleEndianStructure now define an empty __slots__ so that + subclasses don’t always get an instance dict. Patch by Claudiu + Popa. + + - bpo-22185(181): Fix an occasional RuntimeError in + threading.Condition.wait() caused by mutation of the waiters queue + without holding the lock. Patch by Doug Zongker. + + - bpo-22287(182): 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). + + - bpo-22182(183): Use e.args to unpack exceptions correctly in + distutils.file_util.move_file. Patch by Claudiu Popa. + + - The webbrowser module now uses subprocess’s start_new_session=True + rather than a potentially risky preexec_fn=os.setsid call. + + - bpo-22042(184): signal.set_wakeup_fd(fd) now raises an exception if + the file descriptor is in blocking mode. + + - bpo-16808(185): inspect.stack() now returns a named tuple instead + of a tuple. Patch by Daniel Shahaf. + + - bpo-22236(186): Fixed Tkinter images copying operations in + NoDefaultRoot mode. + + - bpo-2527(187): 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. + + - bpo-22118(188): Switch urllib.parse to use RFC 3986 semantics for + the resolution of relative URLs, rather than RFCs 1808 and 2396. + Patch by Demian Brecht. + + - bpo-21549(189): Added the “members” parameter to TarFile.list(). + + - bpo-19628(190): Allow compileall recursion depth to be specified + with a -r option. + + - bpo-15696(191): Add a __sizeof__ implementation for mmap objects on + Windows. + + - bpo-22068(192): Avoided reference loops with Variables and Fonts in + Tkinter. + + - bpo-22165(193): SimpleHTTPRequestHandler now supports undecodable + file names. + + - bpo-15381(194): Optimized line reading in io.BytesIO. + + - bpo-8797(195): Raise HTTPError on failed Basic Authentication + immediately. Initial patch by Sam Bull. + + - bpo-20729(196): Restored the use of lazy + iterkeys()/itervalues()/iteritems() in the mailbox module. + + - bpo-21448(197): Changed FeedParser feed() to avoid O(N^2) behavior + when parsing long line. Original patch by Raymond Hettinger. + + - bpo-22184(198): The functools LRU Cache decorator factory now gives + an earlier and clearer error message when the user forgets the + required parameters. + + - bpo-17923(199): glob() patterns ending with a slash no longer match + non-dirs on AIX. Based on patch by Delhallt. + + - bpo-21725(200): Added support for RFC 6531 (SMTPUTF8) in smtpd. + + - bpo-22176(201): Update the ctypes module’s libffi to v3.1. This + release adds support for the Linux AArch64 and POWERPC ELF ABIv2 + little endian architectures. + + - bpo-5411(202): Added support for the “xztar” format in the shutil + module. + + - bpo-21121(203): Don’t force 3rd party C extensions to be built with + -Werror=declaration-after-statement. + + - bpo-21975(204): Fixed crash when using uninitialized sqlite3.Row + (in particular when unpickling pickled sqlite3.Row). sqlite3.Row + is now initialized in the __new__() method. + + - bpo-20170(205): Convert posixmodule to use Argument Clinic. + + - bpo-21539(206): Add an `exists_ok' argument to ‘Pathlib.mkdir()’ to + mimic ‘mkdir -p’ and *note os.makedirs(): 7bf. functionality. When + true, ignore FileExistsErrors. Patch by Berker Peksag. + + - bpo-22127(207): Bypass IDNA for pure-ASCII host names in the socket + module (in particular for numeric IPs). + + - bpo-21047(208): set the default value for the `convert_charrefs' + argument of HTMLParser to True. Patch by Berker Peksag. + + - Add an __all__ to html.entities. + + - bpo-15114(209): the strict mode and argument of HTMLParser, + HTMLParser.error, and the HTMLParserError exception have been + removed. + + - bpo-22085(210): Dropped support of Tk 8.3 in Tkinter. + + - bpo-21580(211): Now Tkinter correctly handles bytes arguments + passed to Tk. In particular this allows initializing images from + binary data. + + - bpo-22003(212): 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. + + - bpo-22018(213): On Windows, signal.set_wakeup_fd() now also + supports sockets. A side effect is that Python depends to the + WinSock library. + + - bpo-22054(214): 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. + + - bpo-17172(215): Make turtledemo start as active on OS X even when + run with subprocess. Patch by Lita Cho. + + - bpo-21704(216): Fix build error for _multiprocessing when + semaphores are not available. Patch by Arfrever Frehtes Taifersar + Arahesis. + + - bpo-20173(217): Convert sha1, sha256, sha512 and md5 to + ArgumentClinic. Patch by Vajrasky Kok. + + - Fix repr(_socket.socket) on Windows 64-bit: don’t fail with + OverflowError on closed socket. repr(socket.socket) already works + fine. + + - bpo-22033(218): Reprs of most Python implemented classes now + contain actual class name instead of hardcoded one. + + - bpo-21947(219): The dis module can now disassemble + generator-iterator objects based on their gi_code attribute. Patch + by Clement Rouault. + + - bpo-16133(220): The asynchat.async_chat.handle_read() method now + ignores BlockingIOError exceptions. + + - bpo-22044(221): Fixed premature DECREF in call_tzinfo_method. + Patch by Tom Flanagan. + + - bpo-19884(222): readline: Disable the meta modifier key if stdout + is not a terminal to not write the ANSI sequence ‘"\033[1034h"’ + into stdout. This sequence is used on some terminal (ex: + TERM=xterm-256color”) to enable support of 8 bit characters. + + - bpo-4350(223): Removed a number of out-of-dated and non-working for + a long time Tkinter methods. + + - bpo-6167(224): Scrollbar.activate() now returns the name of active + element if the argument is not specified. Scrollbar.set() now + always accepts only 2 arguments. + + - bpo-15275(225): Clean up and speed up the ntpath module. + + - bpo-21888(226): plistlib’s load() and loads() now work if the fmt + parameter is specified. + + - bpo-22032(227): __qualname__ instead of __name__ is now always used + to format fully qualified class names of Python implemented + classes. + + - bpo-22031(228): Reprs now always use hexadecimal format with the + “0x” prefix when contain an id in form ” at 0x…”. + + - bpo-22018(229): signal.set_wakeup_fd() now raises an OSError + instead of a ValueError on ‘fstat()’ failure. + + - bpo-21044(230): tarfile.open() now handles fileobj with an integer + ‘name’ attribute. Based on patch by Antoine Pietri. + + - bpo-21966(231): Respect -q command-line option when code module is + ran. + + - bpo-19076(232): Don’t pass the redundant ‘file’ argument to + self.error(). + + - bpo-16382(233): Improve exception message of warnings.warn() for + bad category. Initial patch by Phil Elson. + + - bpo-21932(234): os.read() now uses a *note Py_ssize_t(): 6b1. 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. + + - bpo-21942(235): Fixed source file viewing in pydoc’s server mode on + Windows. + + - bpo-11259(236): asynchat.async_chat().set_terminator() now raises a + ValueError if the number of received bytes is negative. + + - bpo-12523(237): asynchat.async_chat.push() now raises a TypeError + if it doesn’t get a bytes string + + - bpo-21707(238): Add missing kwonlyargcount argument to + ModuleFinder.replace_paths_in_code(). + + - bpo-20639(239): calling Path.with_suffix(‘’) allows removing the + suffix again. Patch by July Tikhonov. + + - bpo-21714(240): Disallow the construction of invalid paths using + Path.with_name(). Original patch by Antony Lee. + + - bpo-15014(241): Added ‘auth’ method to smtplib to make implementing + auth mechanisms simpler, and used it internally in the login + method. + + - bpo-21151(242): Fixed a segfault in the winreg module when ‘None’ + is passed as a ‘REG_BINARY’ value to SetValueEx. Patch by John + Ehresman. + + - bpo-21090(243): 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. + + - bpo-5800(244): headers parameter of wsgiref.headers.Headers is now + optional. Initial patch by Pablo Torres Navarrete and SilentGhost. + + - bpo-21781(245): ssl.RAND_add() now supports strings longer than 2 + GB. + + - bpo-21679(246): Prevent extraneous fstat() calls during open(). + Patch by Bohuslav Kabrda. + + - bpo-21863(247): cProfile now displays the module name of C + extension functions, in addition to their own name. + + - bpo-11453(248): 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. + + - bpo-21858(249): Better handling of Python exceptions in the sqlite3 + module. + + - bpo-21476(250): Make sure the email.parser.BytesParser + TextIOWrapper is discarded after parsing, so the input file isn’t + unexpectedly closed. + + - bpo-20295(251): imghdr now recognizes OpenEXR format images. + + - bpo-21729(252): Used the “with” statement in the dbm.dumb module to + ensure files closing. Patch by Claudiu Popa. + + - bpo-21491(253): socketserver: Fix a race condition in child + processes reaping. + + - bpo-21719(254): Added the ‘st_file_attributes’ field to + os.stat_result on Windows. + + - bpo-21832(255): Require named tuple inputs to be exact strings. + + - bpo-21722(256): The distutils “upload” command now exits with a + non-zero return code when uploading fails. Patch by Martin + Dengler. + + - bpo-21723(257): asyncio.Queue: support any type of number (ex: + float) for the maximum size. Patch written by Vajrasky Kok. + + - bpo-21711(258): support for “site-python” directories has now been + removed from the site module (it was deprecated in 3.4). + + - bpo-17552(259): 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’. + + - bpo-18039(260): dbm.dump.open() now always creates a new database + when the flag has the value ‘n’. Patch by Claudiu Popa. + + - bpo-21326(261): 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. + + - bpo-21766(262): Prevent a security hole in CGIHTTPServer by URL + unquoting paths before checking for a CGI script at that path. + + - bpo-21310(263): Fixed possible resource leak in failed open(). + + - bpo-21256(264): Printout of keyword args should be in deterministic + order in a mock function call. This will help to write better + doctests. + + - bpo-21677(265): Fixed chaining nonnormalized exceptions in io + close() methods. + + - bpo-11709(266): Fix the pydoc.help function to not fail when + sys.stdin is not a valid file. + + - bpo-21515(267): tempfile.TemporaryFile now uses os.O_TMPFILE flag + is available. + + - bpo-13223(268): Fix pydoc.writedoc so that the HTML documentation + for methods that use ‘self’ in the example code is generated + correctly. + + - bpo-21463(269): In urllib.request, fix pruning of the FTP cache. + + - bpo-21618(270): 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. + + - bpo-20383(271): Introduce importlib.util.module_from_spec() as the + preferred way to create a new module. + + - bpo-21552(272): Fixed possible integer overflow of too long string + lengths in the tkinter module on 64-bit platforms. + + - bpo-14315(273): 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. + + - bpo-13742(274): Added “key” and “reverse” parameters to + heapq.merge(). (First draft of patch contributed by Simon Sapin.) + + - bpo-21402(275): tkinter.ttk now works when default root window is + not set. + + - bpo-3015(276): _tkinter.create() now creates tkapp object with + wantobject=1 by default. + + - bpo-10203(277): sqlite3.Row now truly supports sequence protocol. + In particular it supports reverse() and negative indices. Original + patch by Claudiu Popa. + + - bpo-18807(278): If copying (no symlinks) specified for a venv, then + the python interpreter aliases (python, python3) are now created by + copying rather than symlinking. + + - bpo-20197(279): Added support for the WebP image type in the imghdr + module. Patch by Fabrice Aneche and Claudiu Popa. + + - bpo-21513(280): Speedup some properties of IP addresses + (IPv4Address, IPv6Address) such as .is_private or .is_multicast. + + - bpo-21137(281): Improve the repr for threading.Lock() and its + variants by showing the “locked” or “unlocked” status. Patch by + Berker Peksag. + + - bpo-21538(282): The plistlib module now supports loading of binary + plist files when reference or offset size is not a power of two. + + - bpo-21455(283): Add a default backlog to socket.listen(). + + - bpo-21525(284): Most Tkinter methods which accepted tuples now + accept lists too. + + - bpo-22166(285): 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 + + - bpo-22236(286): Tkinter tests now don’t reuse default root window. + New root window is created for every test class. + + - bpo-10744(287): Fix PEP 3118(288) format strings on ctypes objects + with a nontrivial shape. + + - bpo-20826(289): Optimize ipaddress.collapse_addresses(). + + - bpo-21487(290): Optimize ipaddress.summarize_address_range() and + ipaddress.{IPv4Network,IPv6Network}.subnets(). + + - bpo-21486(291): Optimize parsing of netmasks in + ipaddress.IPv4Network and ipaddress.IPv6Network. + + - bpo-13916(292): Disallowed the surrogatepass error handler for non + UTF-* encodings. + + - bpo-20998(293): Fixed re.fullmatch() of repeated single character + pattern with ignore case. Original patch by Matthew Barnett. + + - bpo-21075(294): fileinput.FileInput now reads bytes from standard + stream if binary mode is specified. Patch by Sam Kimbrel. + + - bpo-19775(295): Add a samefile() method to pathlib Path objects. + Initial patch by Vajrasky Kok. + + - bpo-21226(296): Set up modules properly in + PyImport_ExecCodeModuleObject (and friends). + + - bpo-21398(297): Fix a unicode error in the pydoc pager when the + documentation contains characters not encodable to the stdout + encoding. + + - bpo-16531(298): ipaddress.IPv4Network and ipaddress.IPv6Network now + accept an (address, netmask) tuple argument, so as to easily + construct network objects from existing addresses. + + - bpo-21156(299): importlib.abc.InspectLoader.source_to_code() is now + a staticmethod. + + - bpo-21424(300): Simplified and optimized heaqp.nlargest() and + nmsmallest() to make fewer tuple comparisons. + + - bpo-21396(301): Fix TextIOWrapper(…, write_through=True) to not + force a flush() on the underlying binary stream. Patch by akira. + + - bpo-18314(302): Unlink now removes junctions on Windows. Patch by + Kim Gräsman + + - bpo-21088(303): Bugfix for curses.window.addch() regression in + 3.4.0. In porting to Argument Clinic, the first two arguments were + reversed. + + - bpo-21407(304): _decimal: The module now supports function + signatures. + + - bpo-10650(305): Remove the non-standard ‘watchexp’ parameter from + the Decimal.quantize() method in the Python version. It had never + been present in the C version. + + - bpo-21469(306): 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(). + + - bpo-19414(307): Have the OrderedDict mark deleted links as + unusable. This gives an early failure if the link is deleted + during iteration. + + - bpo-21421(308): Add __slots__ to the MappingViews ABC. Patch by + Josh Rosenberg. + + - bpo-21101(309): Eliminate double hashing in the C speed-up code for + collections.Counter(). + + - bpo-21321(310): itertools.islice() now releases the reference to + the source iterator when the slice is exhausted. Patch by Anton + Afanasyev. + + - bpo-21057(311): 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. + + - bpo-20951(312): 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. + + - bpo-13248(313): removed previously deprecated asyncore.dispatcher + __getattr__ cheap inheritance hack. + + - bpo-9815(314): assertRaises now tries to clear references to local + variables in the exception’s traceback. + + - bpo-19940(315): ssl.cert_time_to_seconds() now interprets the given + time string in the UTC timezone (as specified in RFC 5280), not the + local timezone. + + - bpo-13204(316): Calling sys.flags.__new__ would crash the + interpreter, now it raises a TypeError. + + - bpo-19385(317): Make operations on a closed dbm.dumb database + always raise the same exception. + + - bpo-21207(318): Detect when the os.urandom cached fd has been + closed or replaced, and open it anew. + + - bpo-21291(319): 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. + + - bpo-21127(320): Path objects can now be instantiated from str + subclass instances (such as ‘numpy.str_’). + + - bpo-15002(321): urllib.response object to use _TemporaryFileWrapper + (and _TemporaryFileCloser) facility. Provides a better way to + handle file descriptor close. Patch contributed by Christian + Theune. + + - bpo-12220(322): mindom now raises a custom ValueError indicating it + doesn’t support spaces in URIs instead of letting a ‘split’ + ValueError bubble up. + + - bpo-21068(323): The ssl.PROTOCOL* constants are now enum members. + + - bpo-21276(324): posixmodule: Don’t define USE_XATTRS on KFreeBSD + and the Hurd. + + - bpo-21262(325): New method assert_not_called for Mock. It raises + AssertionError if the mock has been called. + + - bpo-21238(326): New keyword argument ‘unsafe’ to Mock. It raises + *note AttributeError: 19d. incase of an attribute startswith assert + or assret. + + - bpo-20896(327): ssl.get_server_certificate() now uses + PROTOCOL_SSLv23, not PROTOCOL_SSLv3, for maximum compatibility. + + - bpo-21239(328): patch.stopall() didn’t work deterministically when + the same name was patched more than once. + + - bpo-21203(329): Updated fileConfig and dictConfig to remove + inconsistencies. Thanks to Jure Koren for the patch. + + - bpo-21222(330): Passing name keyword argument to + mock.create_autospec now works. + + - bpo-21197(331): Add lib64 -> lib symlink in venvs on 64-bit non-OS + X POSIX. + + - bpo-17498(332): 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. + + - bpo-17826(333): setting an iterable side_effect on a mock function + created by create_autospec now works. Patch by Kushal Das. + + - bpo-7776(334): Fix ‘Host:’ header and reconnection when using + http.client.HTTPConnection.set_tunnel(). Patch by Nikolaus Rath. + + - bpo-20968(335): unittest.mock.MagicMock now supports division. + Patch by Johannes Baiter. + + - bpo-21529(336): Fix arbitrary memory access in + JSONDecoder.raw_decode with a negative second parameter. Bug + reported by Guido Vranken. (See also: CVE-2014-4616) + + - bpo-21169(337): getpass now handles non-ascii characters that the + input stream encoding cannot encode by re-encoding using the + replace error handler. + + - bpo-21171(338): Fixed undocumented filter API of the rot13 codec. + Patch by Berker Peksag. + + - bpo-20539(339): Improved math.factorial error message for large + positive inputs and changed exception type (OverflowError -> + ValueError) for large negative inputs. + + - bpo-21172(340): isinstance check relaxed from dict to + collections.Mapping. + + - bpo-21155(341): asyncio.EventLoop.create_unix_server() now raises a + ValueError if path and sock are specified at the same time. + + - bpo-21136(342): Avoid unnecessary normalization of Fractions + resulting from power and other operations. Patch by Raymond + Hettinger. + + - bpo-17621(343): Introduce importlib.util.LazyLoader. + + - bpo-21076(344): signal module constants were turned into enums. + Patch by Giampaolo Rodola’. + + - bpo-20636(345): Improved the repr of Tkinter widgets. + + - bpo-19505(346): The items, keys, and values views of OrderedDict + now support reverse iteration using reversed(). + + - bpo-21149(347): Improved thread-safety in logging cleanup during + interpreter shutdown. Thanks to Devin Jeanpierre for the patch. + + - bpo-21058(348): Fix a leak of file descriptor in *note + tempfile.NamedTemporaryFile(): 104a, close the file descriptor if + *note io.open(): 30c. fails + + - bpo-21200(349): Return None from pkgutil.get_loader() when __spec__ + is missing. + + - bpo-21013(350): Enhance ssl.create_default_context() when used for + server side sockets to provide better security by default. + + - bpo-20145(351): ‘assertRaisesRegex’ and ‘assertWarnsRegex’ now + raise a TypeError if the second argument is not a string or + compiled regex. + + - bpo-20633(352): Replace relative import by absolute import. + + - bpo-20980(353): Stop wrapping exception when using ThreadPool. + + - bpo-21082(354): In os.makedirs, do not set the process-wide umask. + Note this changes behavior of makedirs when exist_ok=True. + + - bpo-20990(355): Fix issues found by pyflakes for multiprocessing. + + - bpo-21015(356): 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”. + + - bpo-21000(357): Improve the command-line interface of json.tool. + + - bpo-20995(358): Enhance default ciphers used by the ssl module to + enable better security and prioritize perfect forward secrecy. + + - bpo-20884(359): Don’t assume that __file__ is defined on + importlib.__init__. + + - bpo-21499(360): Ignore __builtins__ in several + test_importlib.test_api tests. + + - bpo-20627(361): xmlrpc.client.ServerProxy is now a context manager. + + - bpo-19165(362): The formatter module now raises DeprecationWarning + instead of PendingDeprecationWarning. + + - bpo-13936(363): Remove the ability of datetime.time instances to be + considered false in boolean contexts. + + - bpo-18931(364): selectors module now supports /dev/poll on Solaris. + Patch by Giampaolo Rodola’. + + - bpo-19977(365): When the ‘LC_TYPE’ locale is the POSIX locale (‘C’ + locale), *note sys.stdin: 729. and *note sys.stdout: 72a. are now + using the ‘surrogateescape’ error handler, instead of the ‘strict’ + error handler. + + - bpo-20574(366): Implement incremental decoder for cp65001 code + (Windows code page 65001, Microsoft UTF-8). + + - bpo-20879(367): 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. + + - bpo-19157(368): Include the broadcast address in the usuable hosts + for IPv6 in ipaddress. + + - bpo-11599(369): 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. + + - bpo-4931(370): distutils should not produce unhelpful “error: None” + messages anymore. distutils.util.grok_environment_error is kept + but doc-deprecated. + + - bpo-20875(371): Prevent possible gzip “‘read’ is not defined” + NameError. Patch by Claudiu Popa. + + - bpo-11558(372): ‘email.message.Message.attach’ now returns a more + useful error message if ‘attach’ is called on a message for which + ‘is_multipart’ is False. + + - bpo-20283(373): RE pattern methods now accept the string keyword + parameters as documented. The pattern and source keyword + parameters are left as deprecated aliases. + + - bpo-20778(374): Fix modulefinder to work with bytecode-only + modules. + + - bpo-20791(375): copy.copy() now doesn’t make a copy when the input + is a bytes object. Initial patch by Peter Otten. + + - bpo-19748(376): On AIX, time.mktime() now raises an OverflowError + for year outsize range [1902; 2037]. + + - bpo-19573(377): inspect.signature: Use enum for parameter kind + constants. + + - bpo-20726(378): inspect.signature: Make Signature and Parameter + picklable. + + - bpo-17373(379): Add inspect.Signature.from_callable method. + + - bpo-20378(380): Improve repr of inspect.Signature and + inspect.Parameter. + + - bpo-20816(381): Fix inspect.getcallargs() to raise correct + TypeError for missing keyword-only arguments. Patch by Jeremiah + Lowin. + + - bpo-20817(382): Fix inspect.getcallargs() to fail correctly if more + than 3 arguments are missing. Patch by Jeremiah Lowin. + + - bpo-6676(383): 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) + + - bpo-21117(384): 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. + + - bpo-20334(385): inspect.Signature and inspect.Parameter are now + hashable. Thanks to Antony Lee for bug reports and suggestions. + + - bpo-15916(386): doctest.DocTestSuite returns an empty + unittest.TestSuite instead of raising ValueError if it finds no + tests + + - bpo-21209(387): Fix asyncio.tasks.CoroWrapper to workaround a bug + in yield-from implementation in CPythons prior to 3.4.1. + + - asyncio: Add gi_{frame,running,code} properties to CoroWrapper + (upstream bpo-163(388)). + + - bpo-21311(389): Avoid exception in _osx_support with non-standard + compiler configurations. Patch by John Szakmeister. + + - bpo-11571(390): Ensure that the turtle window becomes the topmost + window when launched on OS X. + + - bpo-21801(391): Validate that __signature__ is None or an instance + of Signature. + + - bpo-21923(392): Prevent AttributeError in + distutils.sysconfig.customize_compiler due to possible + uninitialized _config_vars. + + - bpo-21323(393): Fix http.server to again handle scripts in CGI + subdirectories, broken by the fix for security bpo-19435(394). + Patch by Zach Byrne. + + - bpo-22733(395): Fix ffi_prep_args not zero-extending argument + values correctly on 64-bit Windows. + + - bpo-23302(396): 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. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23399 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=20289 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=13128 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=15381 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22818 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=23099 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=23326 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=21408 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=23363 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=23364 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=23366 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=23369 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=23353 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=14099 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=14099 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=19361 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=18518 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=23094 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=23268 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=21408 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=19996 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=20188 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=23133 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=23248 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=23266 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=23098 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=21817 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=15955 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=23250 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=23063 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=23209 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=23225 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=17911 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=17911 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=19777 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=23206 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=23185 + + (38) https://bugs.python.org/issue?@action=redirect&bpo=23186 + + (39) https://bugs.python.org/issue?@action=redirect&bpo=23143 + + (40) https://bugs.python.org/issue?@action=redirect&bpo=23132 + + (41) https://bugs.python.org/issue?@action=redirect&bpo=19776 + + (42) https://bugs.python.org/issue?@action=redirect&bpo=23112 + + (43) https://bugs.python.org/issue?@action=redirect&bpo=21793 + + (44) https://bugs.python.org/issue?@action=redirect&bpo=23093 + + (45) https://bugs.python.org/issue?@action=redirect&bpo=23111 + + (46) https://bugs.python.org/issue?@action=redirect&bpo=22585 + + (47) https://bugs.python.org/issue?@action=redirect&bpo=19104 + + (48) https://bugs.python.org/issue?@action=redirect&bpo=23071 + + (49) https://bugs.python.org/issue?@action=redirect&bpo=22783 + + (50) https://bugs.python.org/issue?@action=redirect&bpo=15513 + + (51) https://bugs.python.org/issue?@action=redirect&bpo=19858 + + (52) https://bugs.python.org/issue?@action=redirect&bpo=22095 + + (53) https://bugs.python.org/issue?@action=redirect&bpo=23016 + + (54) https://bugs.python.org/issue?@action=redirect&bpo=21775 + + (55) https://bugs.python.org/issue?@action=redirect&bpo=1218234 + + (56) https://bugs.python.org/issue?@action=redirect&bpo=21740 + + (57) https://bugs.python.org/issue?@action=redirect&bpo=23009 + + (58) https://bugs.python.org/issue?@action=redirect&bpo=22959 + + (59) https://bugs.python.org/issue?@action=redirect&bpo=22696 + + (60) https://bugs.python.org/issue?@action=redirect&bpo=16043 + + (61) https://bugs.python.org/issue?@action=redirect&bpo=14099 + + (62) https://bugs.python.org/issue?@action=redirect&bpo=22966 + + (63) https://bugs.python.org/issue?@action=redirect&bpo=21971 + + (64) https://bugs.python.org/issue?@action=redirect&bpo=21032 + + (65) https://bugs.python.org/issue?@action=redirect&bpo=22407 + + (66) https://bugs.python.org/issue?@action=redirect&bpo=22902 + + (67) https://bugs.python.org/issue?@action=redirect&bpo=22960 + + (68) https://bugs.python.org/issue?@action=redirect&bpo=22389 + + (69) https://bugs.python.org/issue?@action=redirect&bpo=21356 + + (70) https://bugs.python.org/issue?@action=redirect&bpo=22915 + + (71) https://bugs.python.org/issue?@action=redirect&bpo=22609 + + (72) https://bugs.python.org/issue?@action=redirect&bpo=22940 + + (73) https://bugs.python.org/issue?@action=redirect&bpo=19676 + + (74) https://bugs.python.org/issue?@action=redirect&bpo=22788 + + (75) https://bugs.python.org/issue?@action=redirect&bpo=22921 + + (76) https://bugs.python.org/issue?@action=redirect&bpo=22894 + + (77) https://bugs.python.org/issue?@action=redirect&bpo=22796 + + (78) https://bugs.python.org/issue?@action=redirect&bpo=22370 + + (79) https://bugs.python.org/issue?@action=redirect&bpo=22841 + + (80) https://bugs.python.org/issue?@action=redirect&bpo=19494 + + (81) https://bugs.python.org/issue?@action=redirect&bpo=22578 + + (82) https://bugs.python.org/issue?@action=redirect&bpo=22849 + + (83) https://bugs.python.org/issue?@action=redirect&bpo=12728 + + (84) https://bugs.python.org/issue?@action=redirect&bpo=22821 + + (85) https://bugs.python.org/issue?@action=redirect&bpo=21650 + + (86) https://bugs.python.org/issue?@action=redirect&bpo=22824 + + (87) https://bugs.python.org/issue?@action=redirect&bpo=22824 + + (88) https://bugs.python.org/issue?@action=redirect&bpo=22406 + + (89) https://bugs.python.org/issue?@action=redirect&bpo=17293 + + (90) https://bugs.python.org/issue?@action=redirect&bpo=22769 + + (91) https://bugs.python.org/issue?@action=redirect&bpo=22417 + + (92) https://bugs.python.org/issue?@action=redirect&bpo=22775 + + (93) https://bugs.python.org/issue?@action=redirect&bpo=22776 + + (94) https://bugs.python.org/issue?@action=redirect&bpo=22665 + + (95) https://bugs.python.org/issue?@action=redirect&bpo=6623 + + (96) https://bugs.python.org/issue?@action=redirect&bpo=17381 + + (97) https://bugs.python.org/issue?@action=redirect&bpo=22410 + + (98) https://bugs.python.org/issue?@action=redirect&bpo=22759 + + (99) https://bugs.python.org/issue?@action=redirect&bpo=8876 + + (100) https://bugs.python.org/issue?@action=redirect&bpo=22217 + + (101) https://bugs.python.org/issue?@action=redirect&bpo=22457 + + (102) https://bugs.python.org/issue?@action=redirect&bpo=18216 + + (103) https://bugs.python.org/issue?@action=redirect&bpo=13918 + + (104) https://bugs.python.org/issue?@action=redirect&bpo=22676 + + (105) https://bugs.python.org/issue?@action=redirect&bpo=18853 + + (106) https://bugs.python.org/issue?@action=redirect&bpo=9351 + + (107) https://bugs.python.org/issue?@action=redirect&bpo=7559 + + (108) https://bugs.python.org/issue?@action=redirect&bpo=19746 + + (109) https://bugs.python.org/issue?@action=redirect&bpo=21991 + + (110) https://bugs.python.org/issue?@action=redirect&bpo=22638 + + (111) https://bugs.python.org/issue?@action=redirect&bpo=22641 + + (112) https://bugs.python.org/issue?@action=redirect&bpo=17401 + + (113) https://bugs.python.org/issue?@action=redirect&bpo=21338 + + (114) https://bugs.python.org/issue?@action=redirect&bpo=20152 + + (115) https://bugs.python.org/issue?@action=redirect&bpo=18643 + + (116) https://bugs.python.org/issue?@action=redirect&bpo=22435 + + (117) https://bugs.python.org/issue?@action=redirect&bpo=13096 + + (118) https://bugs.python.org/issue?@action=redirect&bpo=11694 + + (119) https://bugs.python.org/issue?@action=redirect&bpo=19380 + + (120) https://bugs.python.org/issue?@action=redirect&bpo=1519638 + + (121) https://bugs.python.org/issue?@action=redirect&bpo=18615 + + (122) https://bugs.python.org/issue?@action=redirect&bpo=22462 + + (123) https://bugs.python.org/issue?@action=redirect&bpo=21965 + + (124) https://bugs.python.org/issue?@action=redirect&bpo=21173 + + (125) https://bugs.python.org/issue?@action=redirect&bpo=11866 + + (126) https://bugs.python.org/issue?@action=redirect&bpo=21905 + + (127) https://bugs.python.org/issue?@action=redirect&bpo=11271 + + (128) https://bugs.python.org/issue?@action=redirect&bpo=21883 + + (129) https://bugs.python.org/issue?@action=redirect&bpo=22219 + + (130) https://bugs.python.org/issue?@action=redirect&bpo=22449 + + (131) https://bugs.python.org/issue?@action=redirect&bpo=22508 + + (132) https://bugs.python.org/issue?@action=redirect&bpo=20076 + + (133) https://bugs.python.org/issue?@action=redirect&bpo=20079 + + (134) https://bugs.python.org/issue?@action=redirect&bpo=20218 + + (135) https://bugs.python.org/issue?@action=redirect&bpo=22396 + + (136) https://bugs.python.org/issue?@action=redirect&bpo=22517 + + (137) https://bugs.python.org/issue?@action=redirect&bpo=22437 + + (138) https://bugs.python.org/issue?@action=redirect&bpo=17442 + + (139) https://bugs.python.org/issue?@action=redirect&bpo=23392 + + (140) https://bugs.python.org/issue?@action=redirect&bpo=10510 + + (141) https://bugs.python.org/issue?@action=redirect&bpo=9850 + + (142) https://bugs.python.org/issue?@action=redirect&bpo=5309 + + (143) https://bugs.python.org/issue?@action=redirect&bpo=22448 + + (144) https://bugs.python.org/issue?@action=redirect&bpo=22427 + + (145) https://bugs.python.org/issue?@action=redirect&bpo=22362 + + (146) https://bugs.python.org/issue?@action=redirect&bpo=20912 + + (147) https://bugs.python.org/issue?@action=redirect&bpo=21866 + + (148) https://bugs.python.org/issue?@action=redirect&bpo=22278 + + (149) https://bugs.python.org/issue?@action=redirect&bpo=22415 + + (150) https://bugs.python.org/issue?@action=redirect&bpo=22423 + + (151) https://bugs.python.org/issue?@action=redirect&bpo=21332 + + (152) https://bugs.python.org/issue?@action=redirect&bpo=21091 + + (153) https://bugs.python.org/issue?@action=redirect&bpo=21079 + + (154) https://bugs.python.org/issue?@action=redirect&bpo=22247 + + (155) https://bugs.python.org/issue?@action=redirect&bpo=22366 + + (156) https://bugs.python.org/issue?@action=redirect&bpo=4180 + + (157) https://bugs.python.org/issue?@action=redirect&bpo=22419 + + (158) https://bugs.python.org/issue?@action=redirect&bpo=20537 + + (159) https://bugs.python.org/issue?@action=redirect&bpo=22384 + + (160) https://bugs.python.org/issue?@action=redirect&bpo=22168 + + (161) https://bugs.python.org/issue?@action=redirect&bpo=21147 + + (162) https://bugs.python.org/issue?@action=redirect&bpo=13968 + + (163) https://bugs.python.org/issue?@action=redirect&bpo=21951 + + (164) https://bugs.python.org/issue?@action=redirect&bpo=21951 + + (165) https://bugs.python.org/issue?@action=redirect&bpo=22338 + + (166) https://bugs.python.org/issue?@action=redirect&bpo=12410 + + (167) https://bugs.python.org/issue?@action=redirect&bpo=21270 + + (168) https://bugs.python.org/issue?@action=redirect&bpo=16662 + + (169) https://bugs.python.org/issue?@action=redirect&bpo=22226 + + (170) https://bugs.python.org/issue?@action=redirect&bpo=19524 + + (171) https://bugs.python.org/issue?@action=redirect&bpo=20421 + + (172) https://bugs.python.org/issue?@action=redirect&bpo=19546 + + (173) https://bugs.python.org/issue?@action=redirect&bpo=22051 + + (174) https://bugs.python.org/issue?@action=redirect&bpo=21933 + + (175) https://bugs.python.org/issue?@action=redirect&bpo=21597 + + (176) https://bugs.python.org/issue?@action=redirect&bpo=18132 + + (177) https://bugs.python.org/issue?@action=redirect&bpo=22043 + + (178) https://bugs.python.org/issue?@action=redirect&bpo=21527 + + (179) https://bugs.python.org/issue?@action=redirect&bpo=22216 + + (180) https://bugs.python.org/issue?@action=redirect&bpo=22098 + + (181) https://bugs.python.org/issue?@action=redirect&bpo=22185 + + (182) https://bugs.python.org/issue?@action=redirect&bpo=22287 + + (183) https://bugs.python.org/issue?@action=redirect&bpo=22182 + + (184) https://bugs.python.org/issue?@action=redirect&bpo=22042 + + (185) https://bugs.python.org/issue?@action=redirect&bpo=16808 + + (186) https://bugs.python.org/issue?@action=redirect&bpo=22236 + + (187) https://bugs.python.org/issue?@action=redirect&bpo=2527 + + (188) https://bugs.python.org/issue?@action=redirect&bpo=22118 + + (189) https://bugs.python.org/issue?@action=redirect&bpo=21549 + + (190) https://bugs.python.org/issue?@action=redirect&bpo=19628 + + (191) https://bugs.python.org/issue?@action=redirect&bpo=15696 + + (192) https://bugs.python.org/issue?@action=redirect&bpo=22068 + + (193) https://bugs.python.org/issue?@action=redirect&bpo=22165 + + (194) https://bugs.python.org/issue?@action=redirect&bpo=15381 + + (195) https://bugs.python.org/issue?@action=redirect&bpo=8797 + + (196) https://bugs.python.org/issue?@action=redirect&bpo=20729 + + (197) https://bugs.python.org/issue?@action=redirect&bpo=21448 + + (198) https://bugs.python.org/issue?@action=redirect&bpo=22184 + + (199) https://bugs.python.org/issue?@action=redirect&bpo=17923 + + (200) https://bugs.python.org/issue?@action=redirect&bpo=21725 + + (201) https://bugs.python.org/issue?@action=redirect&bpo=22176 + + (202) https://bugs.python.org/issue?@action=redirect&bpo=5411 + + (203) https://bugs.python.org/issue?@action=redirect&bpo=21121 + + (204) https://bugs.python.org/issue?@action=redirect&bpo=21975 + + (205) https://bugs.python.org/issue?@action=redirect&bpo=20170 + + (206) https://bugs.python.org/issue?@action=redirect&bpo=21539 + + (207) https://bugs.python.org/issue?@action=redirect&bpo=22127 + + (208) https://bugs.python.org/issue?@action=redirect&bpo=21047 + + (209) https://bugs.python.org/issue?@action=redirect&bpo=15114 + + (210) https://bugs.python.org/issue?@action=redirect&bpo=22085 + + (211) https://bugs.python.org/issue?@action=redirect&bpo=21580 + + (212) https://bugs.python.org/issue?@action=redirect&bpo=22003 + + (213) https://bugs.python.org/issue?@action=redirect&bpo=22018 + + (214) https://bugs.python.org/issue?@action=redirect&bpo=22054 + + (215) https://bugs.python.org/issue?@action=redirect&bpo=17172 + + (216) https://bugs.python.org/issue?@action=redirect&bpo=21704 + + (217) https://bugs.python.org/issue?@action=redirect&bpo=20173 + + (218) https://bugs.python.org/issue?@action=redirect&bpo=22033 + + (219) https://bugs.python.org/issue?@action=redirect&bpo=21947 + + (220) https://bugs.python.org/issue?@action=redirect&bpo=16133 + + (221) https://bugs.python.org/issue?@action=redirect&bpo=22044 + + (222) https://bugs.python.org/issue?@action=redirect&bpo=19884 + + (223) https://bugs.python.org/issue?@action=redirect&bpo=4350 + + (224) https://bugs.python.org/issue?@action=redirect&bpo=6167 + + (225) https://bugs.python.org/issue?@action=redirect&bpo=15275 + + (226) https://bugs.python.org/issue?@action=redirect&bpo=21888 + + (227) https://bugs.python.org/issue?@action=redirect&bpo=22032 + + (228) https://bugs.python.org/issue?@action=redirect&bpo=22031 + + (229) https://bugs.python.org/issue?@action=redirect&bpo=22018 + + (230) https://bugs.python.org/issue?@action=redirect&bpo=21044 + + (231) https://bugs.python.org/issue?@action=redirect&bpo=21966 + + (232) https://bugs.python.org/issue?@action=redirect&bpo=19076 + + (233) https://bugs.python.org/issue?@action=redirect&bpo=16382 + + (234) https://bugs.python.org/issue?@action=redirect&bpo=21932 + + (235) https://bugs.python.org/issue?@action=redirect&bpo=21942 + + (236) https://bugs.python.org/issue?@action=redirect&bpo=11259 + + (237) https://bugs.python.org/issue?@action=redirect&bpo=12523 + + (238) https://bugs.python.org/issue?@action=redirect&bpo=21707 + + (239) https://bugs.python.org/issue?@action=redirect&bpo=20639 + + (240) https://bugs.python.org/issue?@action=redirect&bpo=21714 + + (241) https://bugs.python.org/issue?@action=redirect&bpo=15014 + + (242) https://bugs.python.org/issue?@action=redirect&bpo=21151 + + (243) https://bugs.python.org/issue?@action=redirect&bpo=21090 + + (244) https://bugs.python.org/issue?@action=redirect&bpo=5800 + + (245) https://bugs.python.org/issue?@action=redirect&bpo=21781 + + (246) https://bugs.python.org/issue?@action=redirect&bpo=21679 + + (247) https://bugs.python.org/issue?@action=redirect&bpo=21863 + + (248) https://bugs.python.org/issue?@action=redirect&bpo=11453 + + (249) https://bugs.python.org/issue?@action=redirect&bpo=21858 + + (250) https://bugs.python.org/issue?@action=redirect&bpo=21476 + + (251) https://bugs.python.org/issue?@action=redirect&bpo=20295 + + (252) https://bugs.python.org/issue?@action=redirect&bpo=21729 + + (253) https://bugs.python.org/issue?@action=redirect&bpo=21491 + + (254) https://bugs.python.org/issue?@action=redirect&bpo=21719 + + (255) https://bugs.python.org/issue?@action=redirect&bpo=21832 + + (256) https://bugs.python.org/issue?@action=redirect&bpo=21722 + + (257) https://bugs.python.org/issue?@action=redirect&bpo=21723 + + (258) https://bugs.python.org/issue?@action=redirect&bpo=21711 + + (259) https://bugs.python.org/issue?@action=redirect&bpo=17552 + + (260) https://bugs.python.org/issue?@action=redirect&bpo=18039 + + (261) https://bugs.python.org/issue?@action=redirect&bpo=21326 + + (262) https://bugs.python.org/issue?@action=redirect&bpo=21766 + + (263) https://bugs.python.org/issue?@action=redirect&bpo=21310 + + (264) https://bugs.python.org/issue?@action=redirect&bpo=21256 + + (265) https://bugs.python.org/issue?@action=redirect&bpo=21677 + + (266) https://bugs.python.org/issue?@action=redirect&bpo=11709 + + (267) https://bugs.python.org/issue?@action=redirect&bpo=21515 + + (268) https://bugs.python.org/issue?@action=redirect&bpo=13223 + + (269) https://bugs.python.org/issue?@action=redirect&bpo=21463 + + (270) https://bugs.python.org/issue?@action=redirect&bpo=21618 + + (271) https://bugs.python.org/issue?@action=redirect&bpo=20383 + + (272) https://bugs.python.org/issue?@action=redirect&bpo=21552 + + (273) https://bugs.python.org/issue?@action=redirect&bpo=14315 + + (274) https://bugs.python.org/issue?@action=redirect&bpo=13742 + + (275) https://bugs.python.org/issue?@action=redirect&bpo=21402 + + (276) https://bugs.python.org/issue?@action=redirect&bpo=3015 + + (277) https://bugs.python.org/issue?@action=redirect&bpo=10203 + + (278) https://bugs.python.org/issue?@action=redirect&bpo=18807 + + (279) https://bugs.python.org/issue?@action=redirect&bpo=20197 + + (280) https://bugs.python.org/issue?@action=redirect&bpo=21513 + + (281) https://bugs.python.org/issue?@action=redirect&bpo=21137 + + (282) https://bugs.python.org/issue?@action=redirect&bpo=21538 + + (283) https://bugs.python.org/issue?@action=redirect&bpo=21455 + + (284) https://bugs.python.org/issue?@action=redirect&bpo=21525 + + (285) https://bugs.python.org/issue?@action=redirect&bpo=22166 + + (286) https://bugs.python.org/issue?@action=redirect&bpo=22236 + + (287) https://bugs.python.org/issue?@action=redirect&bpo=10744 + + (288) https://peps.python.org/pep-3118/ + + (289) https://bugs.python.org/issue?@action=redirect&bpo=20826 + + (290) https://bugs.python.org/issue?@action=redirect&bpo=21487 + + (291) https://bugs.python.org/issue?@action=redirect&bpo=21486 + + (292) https://bugs.python.org/issue?@action=redirect&bpo=13916 + + (293) https://bugs.python.org/issue?@action=redirect&bpo=20998 + + (294) https://bugs.python.org/issue?@action=redirect&bpo=21075 + + (295) https://bugs.python.org/issue?@action=redirect&bpo=19775 + + (296) https://bugs.python.org/issue?@action=redirect&bpo=21226 + + (297) https://bugs.python.org/issue?@action=redirect&bpo=21398 + + (298) https://bugs.python.org/issue?@action=redirect&bpo=16531 + + (299) https://bugs.python.org/issue?@action=redirect&bpo=21156 + + (300) https://bugs.python.org/issue?@action=redirect&bpo=21424 + + (301) https://bugs.python.org/issue?@action=redirect&bpo=21396 + + (302) https://bugs.python.org/issue?@action=redirect&bpo=18314 + + (303) https://bugs.python.org/issue?@action=redirect&bpo=21088 + + (304) https://bugs.python.org/issue?@action=redirect&bpo=21407 + + (305) https://bugs.python.org/issue?@action=redirect&bpo=10650 + + (306) https://bugs.python.org/issue?@action=redirect&bpo=21469 + + (307) https://bugs.python.org/issue?@action=redirect&bpo=19414 + + (308) https://bugs.python.org/issue?@action=redirect&bpo=21421 + + (309) https://bugs.python.org/issue?@action=redirect&bpo=21101 + + (310) https://bugs.python.org/issue?@action=redirect&bpo=21321 + + (311) https://bugs.python.org/issue?@action=redirect&bpo=21057 + + (312) https://bugs.python.org/issue?@action=redirect&bpo=20951 + + (313) https://bugs.python.org/issue?@action=redirect&bpo=13248 + + (314) https://bugs.python.org/issue?@action=redirect&bpo=9815 + + (315) https://bugs.python.org/issue?@action=redirect&bpo=19940 + + (316) https://bugs.python.org/issue?@action=redirect&bpo=13204 + + (317) https://bugs.python.org/issue?@action=redirect&bpo=19385 + + (318) https://bugs.python.org/issue?@action=redirect&bpo=21207 + + (319) https://bugs.python.org/issue?@action=redirect&bpo=21291 + + (320) https://bugs.python.org/issue?@action=redirect&bpo=21127 + + (321) https://bugs.python.org/issue?@action=redirect&bpo=15002 + + (322) https://bugs.python.org/issue?@action=redirect&bpo=12220 + + (323) https://bugs.python.org/issue?@action=redirect&bpo=21068 + + (324) https://bugs.python.org/issue?@action=redirect&bpo=21276 + + (325) https://bugs.python.org/issue?@action=redirect&bpo=21262 + + (326) https://bugs.python.org/issue?@action=redirect&bpo=21238 + + (327) https://bugs.python.org/issue?@action=redirect&bpo=20896 + + (328) https://bugs.python.org/issue?@action=redirect&bpo=21239 + + (329) https://bugs.python.org/issue?@action=redirect&bpo=21203 + + (330) https://bugs.python.org/issue?@action=redirect&bpo=21222 + + (331) https://bugs.python.org/issue?@action=redirect&bpo=21197 + + (332) https://bugs.python.org/issue?@action=redirect&bpo=17498 + + (333) https://bugs.python.org/issue?@action=redirect&bpo=17826 + + (334) https://bugs.python.org/issue?@action=redirect&bpo=7776 + + (335) https://bugs.python.org/issue?@action=redirect&bpo=20968 + + (336) https://bugs.python.org/issue?@action=redirect&bpo=21529 + + (337) https://bugs.python.org/issue?@action=redirect&bpo=21169 + + (338) https://bugs.python.org/issue?@action=redirect&bpo=21171 + + (339) https://bugs.python.org/issue?@action=redirect&bpo=20539 + + (340) https://bugs.python.org/issue?@action=redirect&bpo=21172 + + (341) https://bugs.python.org/issue?@action=redirect&bpo=21155 + + (342) https://bugs.python.org/issue?@action=redirect&bpo=21136 + + (343) https://bugs.python.org/issue?@action=redirect&bpo=17621 + + (344) https://bugs.python.org/issue?@action=redirect&bpo=21076 + + (345) https://bugs.python.org/issue?@action=redirect&bpo=20636 + + (346) https://bugs.python.org/issue?@action=redirect&bpo=19505 + + (347) https://bugs.python.org/issue?@action=redirect&bpo=21149 + + (348) https://bugs.python.org/issue?@action=redirect&bpo=21058 + + (349) https://bugs.python.org/issue?@action=redirect&bpo=21200 + + (350) https://bugs.python.org/issue?@action=redirect&bpo=21013 + + (351) https://bugs.python.org/issue?@action=redirect&bpo=20145 + + (352) https://bugs.python.org/issue?@action=redirect&bpo=20633 + + (353) https://bugs.python.org/issue?@action=redirect&bpo=20980 + + (354) https://bugs.python.org/issue?@action=redirect&bpo=21082 + + (355) https://bugs.python.org/issue?@action=redirect&bpo=20990 + + (356) https://bugs.python.org/issue?@action=redirect&bpo=21015 + + (357) https://bugs.python.org/issue?@action=redirect&bpo=21000 + + (358) https://bugs.python.org/issue?@action=redirect&bpo=20995 + + (359) https://bugs.python.org/issue?@action=redirect&bpo=20884 + + (360) https://bugs.python.org/issue?@action=redirect&bpo=21499 + + (361) https://bugs.python.org/issue?@action=redirect&bpo=20627 + + (362) https://bugs.python.org/issue?@action=redirect&bpo=19165 + + (363) https://bugs.python.org/issue?@action=redirect&bpo=13936 + + (364) https://bugs.python.org/issue?@action=redirect&bpo=18931 + + (365) https://bugs.python.org/issue?@action=redirect&bpo=19977 + + (366) https://bugs.python.org/issue?@action=redirect&bpo=20574 + + (367) https://bugs.python.org/issue?@action=redirect&bpo=20879 + + (368) https://bugs.python.org/issue?@action=redirect&bpo=19157 + + (369) https://bugs.python.org/issue?@action=redirect&bpo=11599 + + (370) https://bugs.python.org/issue?@action=redirect&bpo=4931 + + (371) https://bugs.python.org/issue?@action=redirect&bpo=20875 + + (372) https://bugs.python.org/issue?@action=redirect&bpo=11558 + + (373) https://bugs.python.org/issue?@action=redirect&bpo=20283 + + (374) https://bugs.python.org/issue?@action=redirect&bpo=20778 + + (375) https://bugs.python.org/issue?@action=redirect&bpo=20791 + + (376) https://bugs.python.org/issue?@action=redirect&bpo=19748 + + (377) https://bugs.python.org/issue?@action=redirect&bpo=19573 + + (378) https://bugs.python.org/issue?@action=redirect&bpo=20726 + + (379) https://bugs.python.org/issue?@action=redirect&bpo=17373 + + (380) https://bugs.python.org/issue?@action=redirect&bpo=20378 + + (381) https://bugs.python.org/issue?@action=redirect&bpo=20816 + + (382) https://bugs.python.org/issue?@action=redirect&bpo=20817 + + (383) https://bugs.python.org/issue?@action=redirect&bpo=6676 + + (384) https://bugs.python.org/issue?@action=redirect&bpo=21117 + + (385) https://bugs.python.org/issue?@action=redirect&bpo=20334 + + (386) https://bugs.python.org/issue?@action=redirect&bpo=15916 + + (387) https://bugs.python.org/issue?@action=redirect&bpo=21209 + + (388) https://bugs.python.org/issue?@action=redirect&bpo=163 + + (389) https://bugs.python.org/issue?@action=redirect&bpo=21311 + + (390) https://bugs.python.org/issue?@action=redirect&bpo=11571 + + (391) https://bugs.python.org/issue?@action=redirect&bpo=21801 + + (392) https://bugs.python.org/issue?@action=redirect&bpo=21923 + + (393) https://bugs.python.org/issue?@action=redirect&bpo=21323 + + (394) https://bugs.python.org/issue?@action=redirect&bpo=19435 + + (395) https://bugs.python.org/issue?@action=redirect&bpo=22733 + + (396) https://bugs.python.org/issue?@action=redirect&bpo=23302 + + +File: python.info, Node: IDLE<51>, Next: Build<73>, Prev: Library<79>, Up: Python 3 5 0 alpha 1 + +1.21.93.3 IDLE +.............. + + - bpo-20577(1): 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. + + - bpo-16893(2): Update Idle doc chapter to match current Idle and add + new information. + + - bpo-3068(3): Add Idle extension configuration dialog to Options + menu. Changes are written to HOME/.idlerc/config-extensions.cfg. + Original patch by Tal Einat. + + - bpo-16233(4): 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. + + - bpo-4832(5): 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. + + - bpo-21986(6): Code objects are not normally pickled by the pickle + module. To match this, they are no longer pickled when running + under Idle. + + - bpo-17390(7): Adjust Editor window title; remove ‘Python’, move + version to end. + + - bpo-14105(8): Idle debugger breakpoints no longer disappear when + inserting or deleting lines. + + - bpo-17172(9): 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. + + - bpo-21765(10): Add support for non-ascii identifiers to + HyperParser. + + - bpo-21940(11): Add unittest for WidgetRedirector. Initial patch by + Saimadhav Heblikar. + + - bpo-18592(12): Add unittest for SearchDialogBase. Patch by Phil + Webster. + + - bpo-21694(13): Add unittest for ParenMatch. Patch by Saimadhav + Heblikar. + + - bpo-21686(14): add unittest for HyperParser. Original patch by + Saimadhav Heblikar. + + - bpo-12387(15): Add missing upper(lower)case versions of default + Windows key bindings for Idle so Caps Lock does not disable them. + Patch by Roger Serwy. + + - bpo-21695(16): Closing a Find-in-files output window while the + search is still in progress no longer closes Idle. + + - bpo-18910(17): Add unittest for textView. Patch by Phil Webster. + + - bpo-18292(18): Add unittest for AutoExpand. Patch by Saihadhav + Heblikar. + + - bpo-18409(19): Add unittest for AutoComplete. Patch by Phil + Webster. + + - bpo-21477(20): htest.py - Improve framework, complete set of tests. + Patches by Saimadhav Heblikar + + - bpo-18104(21): 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. + + - bpo-21139(22): Change default paragraph width to 72, the PEP 8(23) + recommendation. + + - bpo-21284(24): Paragraph reformat test passes after user changes + reformat width. + + - bpo-17654(25): Ensure IDLE menus are customized properly on OS X + for non-framework builds and for all variants of Tk. + + - bpo-23180(26): Rename IDLE “Windows” menu item to “Window”. Patch + by Al Sweigart. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=20577 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=16893 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=3068 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=16233 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=4832 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21986 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=17390 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=14105 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=17172 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21765 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=21940 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=18592 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=21694 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=21686 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=12387 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=21695 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=18910 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=18292 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=18409 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=21477 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=18104 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=21139 + + (23) https://peps.python.org/pep-0008/ + + (24) https://bugs.python.org/issue?@action=redirect&bpo=21284 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=17654 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=23180 + + +File: python.info, Node: Build<73>, Next: C API<54>, Prev: IDLE<51>, Up: Python 3 5 0 alpha 1 + +1.21.93.4 Build +............... + + - bpo-15506(1): Use standard PKG_PROG_PKG_CONFIG autoconf macro in + the configure script. + + - bpo-22935(2): Allow the ssl module to be compiled if openssl + doesn’t support SSL 3. + + - bpo-22592(3): Drop support of the Borland C compiler to build + Python. The distutils module still supports it to build + extensions. + + - bpo-22591(4): Drop support of MS-DOS, especially of the DJGPP + compiler (MS-DOS port of GCC). + + - bpo-16537(5): Check whether self.extensions is empty in setup.py. + Patch by Jonathan Hosmer. + + - bpo-22359(6): Remove incorrect uses of recursive make. Patch by + Jonas Wagner. + + - bpo-21958(7): Define HAVE_ROUND when building with Visual Studio + 2013 and above. Patch by Zachary Turner. + + - bpo-18093(8): the programs that embed the CPython runtime are now + in a separate “Programs” directory, rather than being kept in the + Modules directory. + + - bpo-15759(9): “make suspicious”, “make linkcheck” and “make + doctest” in Doc/ now display special message when and only when + there are failures. + + - bpo-21141(10): The Windows build process no longer attempts to find + Perl, instead relying on OpenSSL source being configured and ready + to build. The ‘PCbuild\build_ssl.py’ script has been re-written + and re-named to ‘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. + + - bpo-21037(11): Add a build option to enable AddressSanitizer + support. + + - bpo-19962(12): 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. + + - bpo-21285(13): Refactor and fix curses configure check to always + search in a ncursesw directory. + + - bpo-15234(14): 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. + + - bpo-17861(15): Tools/scripts/generate_opcode_h.py automatically + regenerates Include/opcode.h from Lib/opcode.py if the latter gets + any change. + + - bpo-20644(16): OS X installer build support for documentation build + changes in 3.4.1: assume externally supplied sphinx-build is + available in /usr/bin. + + - bpo-20022(17): Eliminate use of deprecated bundlebuilder in OS X + builds. + + - bpo-15968(18): Incorporated Tcl, Tk, and Tix builds into the + Windows build solution. + + - bpo-17095(19): Fix Modules/Setup `shared' support. + + - bpo-21811(20): Anticipated fixes to support OS X versions > 10.9. + + - bpo-21166(21): Prevent possible segfaults and other random failures + of python –generate-posix-vars in pybuilddir.txt build target. + + - bpo-18096(22): Fix library order returned by python-config. + + - bpo-17219(23): Add library build dir for Python extension + cross-builds. + + - bpo-22919(24): Windows build updated to support VC 14.0 (Visual + Studio 2015), which will be used for the official release. + + - bpo-21236(25): Build _msi.pyd with cabinet.lib instead of fci.lib + + - bpo-17128(26): Use private version of OpenSSL for OS X 10.5+ + installer. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=15506 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22935 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22592 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22591 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=16537 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22359 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=21958 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=18093 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=15759 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=21141 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=21037 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=19962 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=21285 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=15234 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=17861 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=20644 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=20022 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=15968 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=17095 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=21811 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=21166 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=18096 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=17219 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=22919 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=21236 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=17128 + + +File: python.info, Node: C API<54>, Next: Documentation<63>, Prev: Build<73>, Up: Python 3 5 0 alpha 1 + +1.21.93.5 C API +............... + + - bpo-14203(1): 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. + + - bpo-22445(2): 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. + + - bpo-22079(3): PyType_Ready() now checks that statically allocated + type has no dynamically allocated bases. + + - bpo-22453(4): Removed non-documented macro PyObject_REPR(). + + - bpo-18395(5): Rename ‘_Py_char2wchar()’ to *note Py_DecodeLocale(): + 82d, rename ‘_Py_wchar2char()’ to *note Py_EncodeLocale(): 82e, and + document these functions. + + - bpo-21233(6): Add new C functions: PyMem_RawCalloc(), + PyMem_Calloc(), PyObject_Calloc(), _PyObject_GC_Calloc(). + bytes(int) is now using ‘calloc()’ instead of ‘malloc()’ for large + objects which is faster and use less memory. + + - bpo-20942(7): 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(). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=14203 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22445 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22079 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22453 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=18395 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21233 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=20942 + + +File: python.info, Node: Documentation<63>, Next: Tests<67>, Prev: C API<54>, Up: Python 3 5 0 alpha 1 + +1.21.93.6 Documentation +....................... + + - bpo-19548(1): Update the codecs module documentation to better + cover the distinction between text encodings and other codecs, + together with other clarifications. Patch by Martin Panter. + + - bpo-22394(2): Doc/Makefile now supports ‘make venv + PYTHON=../python’ to create a venv for generating the + documentation, e.g., ‘make html PYTHON=venv/bin/python3’. + + - bpo-21514(3): The documentation of the json module now refers to + new JSON RFC 7159 instead of obsoleted RFC 4627. + + - bpo-21777(4): 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. + + - bpo-6916(5): undocument deprecated asynchat.fifo class. + + - bpo-17386(6): Expanded functionality of the ‘Doc/make.bat’ script + to make it much more comparable to ‘Doc/Makefile’. + + - bpo-21312(7): Update the thread_foobar.h template file to include + newer threading APIs. Patch by Jack McCracken. + + - bpo-21043(8): Remove the recommendation for specific CA + organizations and to mention the ability to load the OS + certificates. + + - bpo-20765(9): Add missing documentation for PurePath.with_name() + and PurePath.with_suffix(). + + - bpo-19407(10): 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. + + - bpo-19697(11): Document cases where __main__.__spec__ is None. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=19548 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22394 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=21514 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21777 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=6916 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=17386 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=21312 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=21043 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=20765 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=19407 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=19697 + + +File: python.info, Node: Tests<67>, Next: Tools/Demos<38>, Prev: Documentation<63>, Up: Python 3 5 0 alpha 1 + +1.21.93.7 Tests +............... + + - bpo-18982(1): Add tests for CLI of the calendar module. + + - bpo-19548(2): Added some additional checks to test_codecs to ensure + that statements in the updated documentation remain accurate. + Patch by Martin Panter. + + - bpo-22838(3): All test_re tests now work with unittest test + discovery. + + - bpo-22173(4): Update lib2to3 tests to use unittest test discovery. + + - bpo-16000(5): Convert test_curses to use unittest. + + - bpo-21456(6): Skip two tests in test_urllib2net.py if _ssl module + not present. Patch by Remi Pointel. + + - bpo-20746(7): Fix test_pdb to run in refleak mode (-R). Patch by + Xavier de Gaye. + + - bpo-22060(8): test_ctypes has been somewhat cleaned up and + simplified; it now uses unittest test discovery to find its tests. + + - bpo-22104(9): regrtest.py no longer holds a reference to the suite + of tests loaded from test modules that don’t define test_main(). + + - bpo-22111(10): Assorted cleanups in test_imaplib. Patch by Milan + Oberkirch. + + - bpo-22002(11): Added ‘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. + + - bpo-21976(12): Fix test_ssl to accept LibreSSL version strings. + Thanks to William Orr. + + - bpo-21918(13): Converted test_tools from a module to a package + containing separate test files for each tested script. + + - bpo-9554(14): Use modern unittest features in test_argparse. + Initial patch by Denver Coneybeare and Radu Voicilas. + + - bpo-20155(15): 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. + + - bpo-19493(16): Refactored the ctypes test package to skip tests + explicitly rather than silently. + + - bpo-18492(17): All resources are now allowed when tests are not run + by regrtest.py. + + - bpo-21634(18): 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. + + - bpo-21605(19): Added tests for Tkinter images. + + - bpo-21493(20): Added test for ntpath.expanduser(). Original patch + by Claudiu Popa. + + - bpo-19925(21): Added tests for the spwd module. Original patch by + Vajrasky Kok. + + - bpo-21522(22): Added Tkinter tests for Listbox.itemconfigure(), + PanedWindow.paneconfigure(), and Menu.entryconfigure(). + + - bpo-17756(23): Fix test_code test when run from the installed + location. + + - bpo-17752(24): Fix distutils tests when run from the installed + location. + + - bpo-18604(25): Consolidated checks for GUI availability. All + platforms now at least check whether Tk can be instantiated when + the GUI resource is requested. + + - bpo-21275(26): Fix a socket test on KFreeBSD. + + - bpo-21223(27): Pass test_site/test_startup_imports when some of the + extensions are built as builtins. + + - bpo-20635(28): Added tests for Tk geometry managers. + + - Add test case for freeze. + + - bpo-20743(29): Fix a reference leak in test_tcl. + + - bpo-21097(30): Move test_namespace_pkgs into test_importlib. + + - bpo-21503(31): Use test_both() consistently in test_importlib. + + - bpo-20939(32): Avoid various network test failures due to new + redirect of ‘http://www.python.org/’ to ‘https://www.python.org’: + use ‘http://www.example.com’ instead. + + - bpo-20668(33): asyncio tests no longer rely on tests.txt file. + (Patch by Vajrasky Kok) + + - bpo-21093(34): Prevent failures of ctypes test_macholib on OS X if + a copy of libz exists in $HOME/lib or /usr/local/lib. + + - bpo-22770(35): Prevent some Tk segfaults on OS X when running gui + tests. + + - bpo-23211(36): Workaround test_logging failure on some OS X 10.6 + systems. + + - bpo-23345(37): Prevent test_ssl failures with large OpenSSL patch + level values (like 0.9.8zc). + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18982 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=19548 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=22838 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=22173 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=16000 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=21456 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=20746 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=22060 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=22104 + + (10) https://bugs.python.org/issue?@action=redirect&bpo=22111 + + (11) https://bugs.python.org/issue?@action=redirect&bpo=22002 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=21976 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=21918 + + (14) https://bugs.python.org/issue?@action=redirect&bpo=9554 + + (15) https://bugs.python.org/issue?@action=redirect&bpo=20155 + + (16) https://bugs.python.org/issue?@action=redirect&bpo=19493 + + (17) https://bugs.python.org/issue?@action=redirect&bpo=18492 + + (18) https://bugs.python.org/issue?@action=redirect&bpo=21634 + + (19) https://bugs.python.org/issue?@action=redirect&bpo=21605 + + (20) https://bugs.python.org/issue?@action=redirect&bpo=21493 + + (21) https://bugs.python.org/issue?@action=redirect&bpo=19925 + + (22) https://bugs.python.org/issue?@action=redirect&bpo=21522 + + (23) https://bugs.python.org/issue?@action=redirect&bpo=17756 + + (24) https://bugs.python.org/issue?@action=redirect&bpo=17752 + + (25) https://bugs.python.org/issue?@action=redirect&bpo=18604 + + (26) https://bugs.python.org/issue?@action=redirect&bpo=21275 + + (27) https://bugs.python.org/issue?@action=redirect&bpo=21223 + + (28) https://bugs.python.org/issue?@action=redirect&bpo=20635 + + (29) https://bugs.python.org/issue?@action=redirect&bpo=20743 + + (30) https://bugs.python.org/issue?@action=redirect&bpo=21097 + + (31) https://bugs.python.org/issue?@action=redirect&bpo=21503 + + (32) https://bugs.python.org/issue?@action=redirect&bpo=20939 + + (33) https://bugs.python.org/issue?@action=redirect&bpo=20668 + + (34) https://bugs.python.org/issue?@action=redirect&bpo=21093 + + (35) https://bugs.python.org/issue?@action=redirect&bpo=22770 + + (36) https://bugs.python.org/issue?@action=redirect&bpo=23211 + + (37) https://bugs.python.org/issue?@action=redirect&bpo=23345 + + +File: python.info, Node: Tools/Demos<38>, Next: Windows<60>, Prev: Tests<67>, Up: Python 3 5 0 alpha 1 + +1.21.93.8 Tools/Demos +..................... + + - bpo-22314(1): pydoc now works when the LINES environment variable + is set. + + - bpo-22615(2): Argument Clinic now supports the “type” argument for + the int converter. This permits using the int converter with enums + and typedefs. + + - bpo-20076(3): The makelocalealias.py script no longer ignores UTF-8 + mapping. + + - bpo-20079(4): The makelocalealias.py script now can parse the + SUPPORTED file from glibc sources and supports command line options + for source paths. + + - bpo-22201(5): Command-line interface of the zipfile module now + correctly extracts ZIP files with directory entries. Patch by Ryan + Wilson. + + - bpo-22120(6): 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.) + + - bpo-18974(7): Tools/scripts/diff.py now uses argparse instead of + optparse. + + - bpo-21906(8): Make Tools/scripts/md5sum.py work in Python 3. Patch + by Zachary Ware. + + - bpo-21629(9): Fix Argument Clinic’s “–converters” feature. + + - Add support for ‘yield from’ to 2to3. + + - Add support for the PEP 465(10) matrix multiplication operator to + 2to3. + + - bpo-16047(11): Fix module exception list and __file__ handling in + freeze. Patch by Meador Inge. + + - bpo-11824(12): Consider ABI tags in freeze. Patch by Meador Inge. + + - bpo-20535(13): PYTHONWARNING no longer affects the run_tests.py + script. Patch by Arfrever Frehtes Taifersar Arahesis. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=22314 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=22615 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=20076 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=20079 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22201 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=22120 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=18974 + + (8) https://bugs.python.org/issue?@action=redirect&bpo=21906 + + (9) https://bugs.python.org/issue?@action=redirect&bpo=21629 + + (10) https://peps.python.org/pep-0465/ + + (11) https://bugs.python.org/issue?@action=redirect&bpo=16047 + + (12) https://bugs.python.org/issue?@action=redirect&bpo=11824 + + (13) https://bugs.python.org/issue?@action=redirect&bpo=20535 + + +File: python.info, Node: Windows<60>, Prev: Tools/Demos<38>, Up: Python 3 5 0 alpha 1 + +1.21.93.9 Windows +................. + + - bpo-23260(1): Update Windows installer + + - 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. + + - bpo-17896(2): The Windows build scripts now expect external library + sources to be in ‘PCbuild\..\externals’ rather than + ‘PCbuild\..\..’. + + - bpo-17717(3): The Windows build scripts now use a copy of NASM + pulled from svn.python.org to build OpenSSL. + + - bpo-21907(4): Improved the batch scripts provided for building + Python. + + - bpo-22644(5): The bundled version of OpenSSL has been updated to + 1.0.1j. + + - bpo-10747(6): Use versioned labels in the Windows start menu. + Patch by Olive Kilburn. + + - bpo-22980(7): .pyd files with a version and platform tag (for + example, “.cp35-win32.pyd”) will now be loaded in preference to + those without tags. + +`(For information about older versions, consult the HISTORY file.)' + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=23260 + + (2) https://bugs.python.org/issue?@action=redirect&bpo=17896 + + (3) https://bugs.python.org/issue?@action=redirect&bpo=17717 + + (4) https://bugs.python.org/issue?@action=redirect&bpo=21907 + + (5) https://bugs.python.org/issue?@action=redirect&bpo=22644 + + (6) https://bugs.python.org/issue?@action=redirect&bpo=10747 + + (7) https://bugs.python.org/issue?@action=redirect&bpo=22980 + + +File: python.info, Node: The Python Tutorial, Next: Python Setup and Usage, Prev: What’s New in Python, Up: Top + +2 The Python Tutorial +********************* + +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 web site, ‘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. 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 *note The Python +Standard Library: 1623. *note The Python Language Reference: 1624. +gives a more formal definition of the language. To write extensions in +C or C++, read *note Extending and Embedding the Python Interpreter: +1625. and *note Python/C API Reference Manual: 1626. 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 *note The Python Standard Library: 1623. + +The *note Glossary: 1627. 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:: +* 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:: + + +File: python.info, Node: Whetting Your Appetite, Next: Using the Python Interpreter, Up: The Python Tutorial + +2.1 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: + + * the high-level data types allow you to express complex operations + in a single statement; + + * statement grouping is done by indentation instead of beginning and + ending brackets; + + * no variable or argument declarations are necessary. + +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. + + +File: python.info, Node: Using the Python Interpreter, Next: An Informal Introduction to Python, Prev: Whetting Your Appetite, Up: The Python Tutorial + +2.2 Using the Python Interpreter +================================ + +* Menu: + +* Invoking the Interpreter:: +* The Interpreter and Its Environment:: + + +File: python.info, Node: Invoking the Interpreter, Next: The Interpreter and Its Environment, Up: Using the Python Interpreter + +2.2.1 Invoking the Interpreter +------------------------------ + +The Python interpreter is usually installed as +‘/usr/local/bin/python3.11’ on those machines where it is available; +putting ‘/usr/local/bin’ in your Unix shell’s search path makes it +possible to start it by typing the command: + + python3.11 + +to the shell. (1) 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., +‘/usr/local/python’ is a popular alternative location.) + +On Windows machines where you have installed Python from the *note +Microsoft Store: 1630, the ‘python3.11’ command will be available. If +you have the *note py.exe launcher: 180. installed, you can use the ‘py’ +command. See *note Excursus; Setting environment variables: 1631. for +other ways to launch Python. + +Typing an end-of-file character (‘Control-D’ on Unix, ‘Control-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: ‘quit()’. + +The interpreter’s line-editing features include interactive editing, +history substitution and code completion on systems that support the GNU +Readline(2) library. Perhaps the quickest check to see whether command +line editing is supported is typing ‘Control-P’ to the first Python +prompt you get. If it beeps, you have command line editing; see +Appendix *note Interactive Input Editing and History Substitution: 1632. +for an introduction to the keys. If nothing appears to happen, or if +‘^P’ is echoed, 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 ‘python -c command [arg] +...’, which executes the statement(s) in `command', analogous to the +shell’s *note -c: 1ad. 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 ‘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 *note -i: 111d. before the script. + +All command line options are described in *note Command line and +environment: 13e0. + +* Menu: + +* Argument Passing:: +* Interactive Mode:: + + ---------- Footnotes ---------- + + (1) On Unix, the Python 3.x interpreter is by default not installed +with the executable named ‘python’, so that it does not conflict with a +simultaneously installed Python 2.x executable. + + (2) https://tiswww.case.edu/php/chet/readline/rltop.html + + +File: python.info, Node: Argument Passing, Next: Interactive Mode, Up: Invoking the Interpreter + +2.2.1.1 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 ‘argv’ +variable in the ‘sys’ module. You can access this list by executing +‘import sys’. The length of the list is at least one; when no script +and no arguments are given, ‘sys.argv[0]’ is an empty string. When the +script name is given as ‘'-'’ (meaning standard input), ‘sys.argv[0]’ is +set to ‘'-'’. When *note -c: 1ad. `command' is used, ‘sys.argv[0]’ is +set to ‘'-c'’. When *note -m: 1ae. `module' is used, ‘sys.argv[0]’ is +set to the full name of the located module. Options found after *note +-c: 1ad. `command' or *note -m: 1ae. `module' are not consumed by the +Python interpreter’s option processing but left in ‘sys.argv’ for the +command or module to handle. + + +File: python.info, Node: Interactive Mode, Prev: Argument Passing, Up: Invoking the Interpreter + +2.2.1.2 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 (‘>>>’); for +continuation lines it prompts with the `secondary prompt', by default +three dots (‘...’). The interpreter prints a welcome message stating +its version number and a copyright notice before printing the first +prompt: + + $ python3.11 + Python 3.11 (default, April 4 2021, 09:25:04) + [GCC 10.2.0] on linux + Type "help", "copyright", "credits" or "license" for more information. + >>> + +Continuation lines are needed when entering a multi-line construct. As +an example, take a look at this *note if: 467. statement: + + >>> the_world_is_flat = True + >>> if the_world_is_flat: + ... print("Be careful not to fall off!") + ... + Be careful not to fall off! + +For more on interactive mode, see *note Interactive Mode: 1636. + + +File: python.info, Node: The Interpreter and Its Environment, Prev: Invoking the Interpreter, Up: Using the Python Interpreter + +2.2.2 The Interpreter and Its Environment +----------------------------------------- + +* Menu: + +* Source Code Encoding:: + + +File: python.info, Node: Source Code Encoding, Up: The Interpreter and Its Environment + +2.2.2.1 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: + + # -*- coding: encoding -*- + +where `encoding' is one of the valid *note codecs: 1a. 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: + + # -*- coding: cp1252 -*- + +One exception to the `first line' rule is when the source code starts +with a *note UNIX “shebang” line: 163b. In this case, the encoding +declaration should be added as the second line of the file. For +example: + + #!/usr/bin/env python3 + # -*- coding: cp1252 -*- + + +File: python.info, Node: An Informal Introduction to Python, Next: More Control Flow Tools, Prev: Using the Python Interpreter, Up: The Python Tutorial + +2.3 An Informal Introduction to Python +====================================== + +In the following examples, input and output are distinguished by the +presence or absence of prompts (*note >>>: 163f. and *note …: 1640.): 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. + +Many of the examples in this manual, even those entered at the +interactive prompt, include comments. Comments in Python start with the +hash character, ‘#’, 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: + + # 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." + +* Menu: + +* Using Python as a Calculator:: +* First Steps Towards Programming:: + + +File: python.info, Node: Using Python as a Calculator, Next: First Steps Towards Programming, Up: An Informal Introduction to Python + +2.3.1 Using Python as a Calculator +---------------------------------- + +Let’s try some simple Python commands. Start the interpreter and wait +for the primary prompt, ‘>>>’. (It shouldn’t take long.) + +* Menu: + +* Numbers:: +* Strings:: +* Lists:: + + +File: python.info, Node: Numbers, Next: Strings, Up: Using Python as a Calculator + +2.3.1.1 Numbers +............... + +The interpreter acts as a simple calculator: you can type an expression +at it and it will write the value. Expression syntax is +straightforward: the operators ‘+’, ‘-’, ‘*’ and ‘/’ work just like in +most other languages (for example, Pascal or C); parentheses (‘()’) can +be used for grouping. For 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 + +The integer numbers (e.g. ‘2’, ‘4’, ‘20’) have type *note int: 1c7, the +ones with a fractional part (e.g. ‘5.0’, ‘1.6’) have type *note float: +3ca. We will see more about numeric types later in the tutorial. + +Division (‘/’) always returns a float. To do *note floor division: 58c. +and get an integer result you can use the ‘//’ operator; to calculate +the remainder you can use ‘%’: + + >>> 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 + +With Python, it is possible to use the ‘**’ operator to calculate powers +(1): + + >>> 5 ** 2 # 5 squared + 25 + >>> 2 ** 7 # 2 to the power of 7 + 128 + +The equal sign (‘=’) is used to assign a value to a variable. +Afterwards, no result is displayed before the next interactive prompt: + + >>> width = 20 + >>> height = 5 * 9 + >>> width * height + 900 + +If a variable is not “defined” (assigned a value), trying to use it will +give you an error: + + >>> n # try to access an undefined variable + Traceback (most recent call last): + File "", line 1, in + NameError: name 'n' is not defined + +There is full support for floating point; operators with mixed type +operands convert the integer operand to floating point: + + >>> 4 * 3.75 - 1 + 14.0 + +In interactive mode, the last printed expression is assigned to the +variable ‘_’. This means that when you are using Python as a desk +calculator, it is somewhat easier to continue calculations, for example: + + >>> tax = 12.5 / 100 + >>> price = 100.50 + >>> price * tax + 12.5625 + >>> price + _ + 113.0625 + >>> round(_, 2) + 113.06 + +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 *note int: 1c7. and *note float: 3ca, Python supports +other types of numbers, such as *note Decimal: 3bd. and *note Fraction: +210. Python also has built-in support for *note complex numbers: 1645, +and uses the ‘j’ or ‘J’ suffix to indicate the imaginary part (e.g. +‘3+5j’). + + ---------- Footnotes ---------- + + (1) Since ‘**’ has higher precedence than ‘-’, ‘-3**2’ will be +interpreted as ‘-(3**2)’ and thus result in ‘-9’. To avoid this and get +‘9’, you can use ‘(-3)**2’. + + +File: python.info, Node: Strings, Next: Lists, Prev: Numbers, Up: Using Python as a Calculator + +2.3.1.2 Strings +............... + +Besides numbers, Python can also manipulate strings, which can be +expressed in several ways. They can be enclosed in single quotes +(‘'...'’) or double quotes (‘"..."’) with the same result (1). ‘\’ can +be used to escape quotes: + + >>> 'spam eggs' # single quotes + 'spam eggs' + >>> '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.' + +In the interactive interpreter, the output string is enclosed in quotes +and special characters are escaped with backslashes. While this might +sometimes look different from the input (the enclosing quotes could +change), the two strings are equivalent. The string is enclosed in +double quotes if the string contains a single quote and no double +quotes, otherwise it is enclosed in single quotes. The *note print(): +c13. function produces a more readable output, by omitting the enclosing +quotes and by printing escaped and special characters: + + >>> '"Isn\'t," they said.' + '"Isn\'t," they said.' + >>> print('"Isn\'t," they said.') + "Isn't," they said. + >>> s = 'First line.\nSecond line.' # \n means newline + >>> s # without print(), \n is included in the output + 'First line.\nSecond line.' + >>> print(s) # with print(), \n produces a new line + First line. + Second line. + +If you don’t want characters prefaced by ‘\’ to be interpreted as +special characters, you can use `raw strings' by adding an ‘r’ before +the first quote: + + >>> print('C:\some\name') # here \n means newline! + C:\some + ame + >>> print(r'C:\some\name') # note the r before the quote + C:\some\name + +String literals can span multiple lines. One way is using +triple-quotes: ‘"""..."""’ or ‘'''...'''’. End of lines are +automatically included in the string, but it’s possible to prevent this +by adding a ‘\’ at the end of the line. The following example: + + print("""\ + Usage: thingy [OPTIONS] + -h Display this usage message + -H hostname Hostname to connect to + """) + +produces the following output (note that the initial newline is not +included): + + Usage: thingy [OPTIONS] + -h Display this usage message + -H hostname Hostname to connect to + +Strings can be concatenated (glued together) with the ‘+’ operator, and +repeated with ‘*’: + + >>> # 3 times 'un', followed by 'ium' + >>> 3 * 'un' + 'ium' + 'unununium' + +Two or more `string literals' (i.e. the ones enclosed between quotes) +next to each other are automatically concatenated. + + >>> 'Py' 'thon' + 'Python' + +This feature is particularly useful when you want to break long strings: + + >>> text = ('Put several strings within parentheses ' + ... 'to have them joined together.') + >>> text + 'Put several strings within parentheses to have them joined together.' + +This only works with two literals though, not with variables or +expressions: + + >>> prefix = 'Py' + >>> prefix 'thon' # can't concatenate a variable and a string literal + File "", line 1 + prefix 'thon' + ^^^^^^ + SyntaxError: invalid syntax + >>> ('un' * 3) 'ium' + File "", line 1 + ('un' * 3) 'ium' + ^^^^^ + SyntaxError: invalid syntax + +If you want to concatenate variables or a variable and a literal, use +‘+’: + + >>> prefix + 'thon' + 'Python' + +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: + + >>> word = 'Python' + >>> word[0] # character in position 0 + 'P' + >>> word[5] # character in position 5 + 'n' + +Indices may also be negative numbers, to start counting from the right: + + >>> word[-1] # last character + 'n' + >>> word[-2] # second-last character + 'o' + >>> word[-6] + 'P' + +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 +substring: + + >>> word[0:2] # characters from position 0 (included) to 2 (excluded) + 'Py' + >>> word[2:5] # characters from position 2 (included) to 5 (excluded) + 'tho' + +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. + + >>> 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' + +Note how the start is always included, and the end always excluded. +This makes sure that ‘s[:i] + s[i:]’ is always equal to ‘s’: + + >>> word[:2] + word[2:] + 'Python' + >>> word[:4] + word[4:] + 'Python' + +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: + + +---+---+---+---+---+---+ + | P | y | t | h | o | n | + +---+---+---+---+---+---+ + 0 1 2 3 4 5 6 + -6 -5 -4 -3 -2 -1 + +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 +‘word[1:3]’ is 2. + +Attempting to use an index that is too large will result in an error: + + >>> word[42] # the word only has 6 characters + Traceback (most recent call last): + File "", line 1, in + IndexError: string index out of range + +However, out of range slice indexes are handled gracefully when used for +slicing: + + >>> word[4:42] + 'on' + >>> word[42:] + '' + +Python strings cannot be changed — they are *note immutable: 1648. +Therefore, assigning to an indexed position in the string results in an +error: + + >>> word[0] = 'J' + Traceback (most recent call last): + File "", line 1, in + TypeError: 'str' object does not support item assignment + >>> word[2:] = 'py' + Traceback (most recent call last): + File "", line 1, in + TypeError: 'str' object does not support item assignment + +If you need a different string, you should create a new one: + + >>> 'J' + word[1:] + 'Jython' + >>> word[:2] + 'py' + 'Pypy' + +The built-in function *note len(): 209. returns the length of a string: + + >>> s = 'supercalifragilisticexpialidocious' + >>> len(s) + 34 + +See also +........ + +*note Text Sequence Type — str: 1649. + + Strings are examples of `sequence types', and support the common + operations supported by such types. + +*note String Methods: 164a. + + Strings support a large number of methods for basic transformations + and searching. + +*note Formatted string literals: 5f9. + + String literals that have embedded expressions. + +*note Format String Syntax: 1021. + + Information about string formatting with *note str.format(): 1fc. + +*note printf-style String Formatting: 295. + + The old formatting operations invoked when strings are the left + operand of the ‘%’ operator are described in more detail here. + + ---------- Footnotes ---------- + + (1) Unlike other languages, special characters such as ‘\n’ have the +same meaning with both single (‘'...'’) and double (‘"..."’) quotes. +The only difference between the two is that within single quotes you +don’t need to escape ‘"’ (but you have to escape ‘\'’) and vice versa. + + +File: python.info, Node: Lists, Prev: Strings, Up: Using Python as a Calculator + +2.3.1.3 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. + + >>> squares = [1, 4, 9, 16, 25] + >>> squares + [1, 4, 9, 16, 25] + +Like strings (and all other built-in *note sequence: 164d. types), lists +can be indexed and sliced: + + >>> squares[0] # indexing returns the item + 1 + >>> squares[-1] + 25 + >>> squares[-3:] # slicing returns a new list + [9, 16, 25] + +All slice operations return a new list containing the requested +elements. This means that the following slice returns a *note shallow +copy: 164e. of the list: + + >>> squares[:] + [1, 4, 9, 16, 25] + +Lists also support operations like concatenation: + + >>> squares + [36, 49, 64, 81, 100] + [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] + +Unlike strings, which are *note immutable: 1648, lists are a *note +mutable: 164f. type, i.e. it is possible to change their content: + + >>> 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] + +You can also add new items at the end of the list, by using the +‘append()’ `method' (we will see more about methods later): + + >>> 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] + +Assignment to slices is also possible, and this can even change the size +of the list or clear it entirely: + + >>> 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 + [] + +The built-in function *note len(): 209. also applies to lists: + + >>> letters = ['a', 'b', 'c', 'd'] + >>> len(letters) + 4 + +It is possible to nest lists (create lists containing other lists), for +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' + + +File: python.info, Node: First Steps Towards Programming, Prev: Using Python as a Calculator, Up: An Informal Introduction to Python + +2.3.2 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(1) as follows: + + >>> # 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 + +This example introduces several new features. + + * The first line contains a `multiple assignment': the variables ‘a’ + and ‘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. + + * The *note while: 1652. loop executes as long as the condition + (here: ‘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: ‘<’ (less than), ‘>’ + (greater than), ‘==’ (equal to), ‘<=’ (less than or equal to), ‘>=’ + (greater than or equal to) and ‘!=’ (not equal to). + + * 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. + + * The *note print(): c13. 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: + + >>> i = 256*256 + >>> print('The value of i is', i) + The value of i is 65536 + + The keyword argument `end' can be used to avoid the newline after + the output, or end the output with a different string: + + >>> 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, + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Fibonacci_number + + +File: python.info, Node: More Control Flow Tools, Next: Data Structures, Prev: An Informal Introduction to Python, Up: The Python Tutorial + +2.4 More Control Flow Tools +=========================== + +Besides the *note while: 1652. statement just introduced, Python uses +the usual flow control statements known from other languages, with some +twists. + +* Menu: + +* if Statements:: +* for Statements:: +* The range() Function: The range Function. +* break and continue Statements, and else Clauses on Loops: break and continue Statements and else Clauses on Loops. +* pass Statements:: +* match Statements:: +* Defining Functions:: +* More on Defining Functions:: +* Intermezzo; Coding Style: Intermezzo Coding Style. + + +File: python.info, Node: if Statements, Next: for Statements, Up: More Control Flow Tools + +2.4.1 ‘if’ Statements +--------------------- + +Perhaps the most well-known statement type is the *note if: 467. +statement. For 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 + +There can be zero or more *note elif: 1658. parts, and the *note else: +466. part is optional. The keyword ‘‘elif’’ is short for ‘else if’, and +is useful to avoid excessive indentation. An ‘if’ … ‘elif’ … ‘elif’ … +sequence is a substitute for the ‘switch’ or ‘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 ‘match’ statement +useful. For more details see *note match Statements: 1659. + + +File: python.info, Node: for Statements, Next: The range Function, Prev: if Statements, Up: More Control Flow Tools + +2.4.2 ‘for’ Statements +---------------------- + +The *note for: 199. 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 ‘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): + + >>> # Measure some strings: + ... words = ['cat', 'window', 'defenestrate'] + >>> for w in words: + ... print(w, len(w)) + ... + cat 3 + window 6 + defenestrate 12 + +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: + + # 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 + + +File: python.info, Node: The range Function, Next: break and continue Statements and else Clauses on Loops, Prev: for Statements, Up: More Control Flow Tools + +2.4.3 The ‘range()’ Function +---------------------------- + +If you do need to iterate over a sequence of numbers, the built-in +function *note range(): 58b. comes in handy. It generates arithmetic +progressions: + + >>> for i in range(5): + ... print(i) + ... + 0 + 1 + 2 + 3 + 4 + +The given end point is never part of the generated sequence; ‘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’): + + >>> 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] + +To iterate over the indices of a sequence, you can combine *note +range(): 58b. and *note len(): 209. as follows: + + >>> 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 + +In most such cases, however, it is convenient to use the *note +enumerate(): 10e1. function, see *note Looping Techniques: 165e. + +A strange thing happens if you just print a range: + + >>> range(10) + range(0, 10) + +In many ways the object returned by *note range(): 58b. 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 *note iterable: ed9, 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 *note for: 199. statement is such a construct, while an +example of a function that takes an iterable is *note sum(): 296.: + + >>> sum(range(4)) # 0 + 1 + 2 + 3 + 6 + +Later we will see more functions that return iterables and take +iterables as arguments. In chapter *note Data Structures: 165f, we will +discuss in more detail about *note list(): 1e9. + + +File: python.info, Node: break and continue Statements and else Clauses on Loops, Next: pass Statements, Prev: The range Function, Up: More Control Flow Tools + +2.4.4 ‘break’ and ‘continue’ Statements, and ‘else’ Clauses on Loops +-------------------------------------------------------------------- + +The *note break: 706. statement, like in C, breaks out of the innermost +enclosing *note for: 199. or *note while: 1652. loop. + +Loop statements may have an ‘else’ clause; it is executed when the loop +terminates through exhaustion of the iterable (with *note for: 199.) or +when the condition becomes false (with *note while: 1652.), but not when +the loop is terminated by a *note break: 706. statement. This is +exemplified by the following loop, which searches for prime numbers: + + >>> 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 + +(Yes, this is the correct code. Look closely: the ‘else’ clause belongs +to the *note for: 199. loop, `not' the *note if: 467. statement.) + +When used with a loop, the ‘else’ clause has more in common with the +‘else’ clause of a *note try: 1073. statement than it does with that of +*note if: 467. statements: a *note try: 1073. statement’s ‘else’ clause +runs when no exception occurs, and a loop’s ‘else’ clause runs when no +‘break’ occurs. For more on the ‘try’ statement and exceptions, see +*note Handling Exceptions: 1662. + +The *note continue: 609. statement, also borrowed from C, continues with +the next iteration of the loop: + + >>> for num in range(2, 10): + ... if num % 2 == 0: + ... print("Found an even number", num) + ... continue + ... print("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 + + +File: python.info, Node: pass Statements, Next: match Statements, Prev: break and continue Statements and else Clauses on Loops, Up: More Control Flow Tools + +2.4.5 ‘pass’ Statements +----------------------- + +The *note pass: 1665. statement does nothing. It can be used when a +statement is required syntactically but the program requires no action. +For example: + + >>> while True: + ... pass # Busy-wait for keyboard interrupt (Ctrl+C) + ... + +This is commonly used for creating minimal classes: + + >>> class MyEmptyClass: + ... pass + ... + +Another place *note pass: 1665. 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 ‘pass’ is silently +ignored: + + >>> def initlog(*args): + ... pass # Remember to implement this! + ... + + +File: python.info, Node: match Statements, Next: Defining Functions, Prev: pass Statements, Up: More Control Flow Tools + +2.4.6 ‘match’ Statements +------------------------ + +A *note match: 400. 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. + +The simplest form compares a subject value against one or more literals: + + 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" + +Note the last block: the “variable name” ‘_’ acts as a `wildcard' and +never fails to match. If no case matches, none of the branches is +executed. + +You can combine several literals in a single pattern using ‘|’ (“or”): + + case 401 | 403 | 404: + return "Not allowed" + +Patterns can look like unpacking assignments, and can be used to bind +variables: + + # 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") + +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 (‘point’). The fourth pattern captures +two values, which makes it conceptually similar to the unpacking +assignment ‘(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: + + class Point: + x: int + y: int + + 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") + +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 +‘__match_args__’ special attribute in your classes. If it’s set to +(“x”, “y”), the following patterns are all equivalent (and all bind the +‘y’ attribute to the ‘var’ variable): + + Point(1, var) + Point(1, y=var) + Point(x=1, y=var) + Point(y=var, x=1) + +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 +‘var’ above) are assigned to by a match statement. Dotted names (like +‘foo.bar’), attribute names (the ‘x=’ and ‘y=’ above) or class names +(recognized by the “(…)” next to them like ‘Point’ above) are never +assigned to. + +Patterns can be arbitrarily nested. For example, if we have a short +list of points, we could match it like this: + + 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") + +We can add an ‘if’ clause to a pattern, known as a “guard”. If the +guard is false, ‘match’ goes on to try the next case block. Note that +value capture happens before the guard is evaluated: + + 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") + +Several other key features of this statement: + + - 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. + + - Sequence patterns support extended unpacking: ‘[x, y, *rest]’ and + ‘(x, y, *rest)’ work similar to unpacking assignments. The name + after ‘*’ may also be ‘_’, so ‘(x, y, *_)’ matches a sequence of at + least two items without binding the remaining items. + + - Mapping patterns: ‘{"bandwidth": b, "latency": l}’ captures the + ‘"bandwidth"’ and ‘"latency"’ values from a dictionary. Unlike + sequence patterns, extra keys are ignored. An unpacking like + ‘**rest’ is also supported. (But ‘**_’ would be redundant, so it + is not allowed.) + + - Subpatterns may be captured using the ‘as’ keyword: + + case (Point(x1, y1), Point(x2, y2) as p2): ... + + will capture the second element of the input as ‘p2’ (as long as + the input is a sequence of two points) + + - Most literals are compared by equality, however the singletons + ‘True’, ‘False’ and ‘None’ are compared by identity. + + - Patterns may use named constants. These must be dotted names to + prevent them from being interpreted as capture variable: + + 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 :(") + +For a more detailed explanation and additional examples, you can look +into PEP 636(1) which is written in a tutorial format. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0636/ + + +File: python.info, Node: Defining Functions, Next: More on Defining Functions, Prev: match Statements, Up: More Control Flow Tools + +2.4.7 Defining Functions +------------------------ + +We can create a function that writes the Fibonacci series to an +arbitrary boundary: + + >>> def fib(n): # write Fibonacci series up to n + ... """Print a Fibonacci series up to 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 + +The keyword *note def: 10bd. 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 *note +Documentation Strings: 1669.) 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 *note global: 166a. statement, or, for variables of enclosing +functions, named in a *note nonlocal: f56. 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). (1) 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: + + >>> fib + + >>> f = fib + >>> f(100) + 0 1 1 2 3 5 8 13 21 34 55 89 + +Coming from other languages, you might object that ‘fib’ is not a +function but a procedure since it doesn’t return a value. In fact, even +functions without a *note return: 60e. statement do return a value, +albeit a rather boring one. This value is called ‘None’ (it’s a +built-in name). Writing the value ‘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 *note print(): c13.: + + >>> fib(0) + >>> print(fib(0)) + None + +It is simple to write a function that returns a list of the numbers of +the Fibonacci series, instead of printing it: + + >>> 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] + +This example, as usual, demonstrates some new Python features: + + * The *note return: 60e. statement returns with a value from a + function. ‘return’ without an expression argument returns ‘None’. + Falling off the end of a function also returns ‘None’. + + * The statement ‘result.append(a)’ calls a `method' of the list + object ‘result’. A method is a function that ‘belongs’ to an + object and is named ‘obj.methodname’, where ‘obj’ is some object + (this may be an expression), and ‘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 *note + Classes: 166b.) The method ‘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 ‘result = result + [a]’, + but more efficient. + + ---------- Footnotes ---------- + + (1) 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). + + +File: python.info, Node: More on Defining Functions, Next: Intermezzo Coding Style, Prev: Defining Functions, Up: More Control Flow Tools + +2.4.8 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:: + + +File: python.info, Node: Default Argument Values, Next: Keyword Arguments, Up: More on Defining Functions + +2.4.8.1 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: + + def ask_ok(prompt, retries=4, reminder='Please try again!'): + while True: + ok = input(prompt) + if ok in ('y', 'ye', 'yes'): + return True + if ok in ('n', 'no', 'nop', 'nope'): + return False + retries = retries - 1 + if retries < 0: + raise ValueError('invalid user response') + print(reminder) + +This function can be called in several ways: + + * giving only the mandatory argument: ‘ask_ok('Do you really want to + quit?')’ + + * giving one of the optional arguments: ‘ask_ok('OK to overwrite the + file?', 2)’ + + * or even giving all arguments: ‘ask_ok('OK to overwrite the file?', + 2, 'Come on, only yes or no!')’ + +This example also introduces the *note in: 20a. 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 + + i = 5 + + def f(arg=i): + print(arg) + + i = 6 + f() + +will print ‘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: + + def f(a, L=[]): + L.append(a) + return L + + print(f(1)) + print(f(2)) + print(f(3)) + +This will print + + [1] + [1, 2] + [1, 2, 3] + +If you don’t want the default to be shared between subsequent calls, you +can write the function like this instead: + + def f(a, L=None): + if L is None: + L = [] + L.append(a) + return L + + +File: python.info, Node: Keyword Arguments, Next: Special parameters, Prev: Default Argument Values, Up: More on Defining Functions + +2.4.8.2 Keyword Arguments +......................... + +Functions can also be called using *note keyword arguments: 983. of the +form ‘kwarg=value’. For instance, the following function: + + 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, "!") + +accepts one required argument (‘voltage’) and three optional arguments +(‘state’, ‘action’, and ‘type’). This function can be called in any of +the following ways: + + 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 + +but all the following calls would be invalid: + + 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 + +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. ‘actor’ is not a valid argument for the +‘parrot’ function), and their order is not important. This also +includes non-optional arguments (e.g. ‘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: + + >>> def function(a): + ... pass + ... + >>> function(0, a=0) + Traceback (most recent call last): + File "", line 1, in + TypeError: function() got multiple values for argument 'a' + +When a final formal parameter of the form ‘**name’ is present, it +receives a dictionary (see *note Mapping Types — dict: 719.) containing +all keyword arguments except for those corresponding to a formal +parameter. This may be combined with a formal parameter of the form +‘*name’ (described in the next subsection) which receives a *note tuple: +1672. containing the positional arguments beyond the formal parameter +list. (‘*name’ must occur before ‘**name’.) For example, if we define +a function like this: + + 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]) + +It could be called like this: + + cheeseshop("Limburger", "It's very runny, sir.", + "It's really very, VERY runny, sir.", + shopkeeper="Michael Palin", + client="John Cleese", + sketch="Cheese Shop Sketch") + +and of course it would print: + + -- 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 + +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. + + +File: python.info, Node: Special parameters, Next: Arbitrary Argument Lists, Prev: Keyword Arguments, Up: More on Defining Functions + +2.4.8.3 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: + + def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): + ----------- ---------- ---------- + | | | + | Positional or keyword | + | - Keyword only + -- Positional only + +where ‘/’ and ‘*’ 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:: + + +File: python.info, Node: Positional-or-Keyword Arguments, Next: Positional-Only Parameters, Up: Special parameters + +2.4.8.4 Positional-or-Keyword Arguments +....................................... + +If ‘/’ and ‘*’ are not present in the function definition, arguments may +be passed to a function by position or by keyword. + + +File: python.info, Node: Positional-Only Parameters, Next: Keyword-Only Arguments, Prev: Positional-or-Keyword Arguments, Up: Special parameters + +2.4.8.5 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 ‘/’ (forward-slash). The +‘/’ is used to logically separate the positional-only parameters from +the rest of the parameters. If there is no ‘/’ in the function +definition, there are no positional-only parameters. + +Parameters following the ‘/’ may be `positional-or-keyword' or +`keyword-only'. + + +File: python.info, Node: Keyword-Only Arguments, Next: Function Examples, Prev: Positional-Only Parameters, Up: Special parameters + +2.4.8.6 Keyword-Only Arguments +.............................. + +To mark parameters as `keyword-only', indicating the parameters must be +passed by keyword argument, place an ‘*’ in the arguments list just +before the first `keyword-only' parameter. + + +File: python.info, Node: Function Examples, Next: Recap, Prev: Keyword-Only Arguments, Up: Special parameters + +2.4.8.7 Function Examples +......................... + +Consider the following example function definitions paying close +attention to the markers ‘/’ and ‘*’: + + >>> 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) + +The first function definition, ‘standard_arg’, the most familiar form, +places no restrictions on the calling convention and arguments may be +passed by position or keyword: + + >>> standard_arg(2) + 2 + + >>> standard_arg(arg=2) + 2 + +The second function ‘pos_only_arg’ is restricted to only use positional +parameters as there is a ‘/’ in the function definition: + + >>> pos_only_arg(1) + 1 + + >>> pos_only_arg(arg=1) + Traceback (most recent call last): + File "", line 1, in + TypeError: pos_only_arg() got some positional-only arguments passed as keyword arguments: 'arg' + +The third function ‘kwd_only_args’ only allows keyword arguments as +indicated by a ‘*’ in the function definition: + + >>> kwd_only_arg(3) + Traceback (most recent call last): + File "", line 1, in + TypeError: kwd_only_arg() takes 0 positional arguments but 1 was given + + >>> kwd_only_arg(arg=3) + 3 + +And the last uses all three calling conventions in the same function +definition: + + >>> combined_example(1, 2, 3) + Traceback (most recent call last): + File "", line 1, in + 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 "", line 1, in + TypeError: combined_example() got some positional-only arguments passed as keyword arguments: 'pos_only' + +Finally, consider this function definition which has a potential +collision between the positional argument ‘name’ and ‘**kwds’ which has +‘name’ as a key: + + def foo(name, **kwds): + return 'name' in kwds + +There is no possible call that will make it return ‘True’ as the keyword +‘'name'’ will always bind to the first parameter. For example: + + >>> foo(1, **{'name': 2}) + Traceback (most recent call last): + File "", line 1, in + TypeError: foo() got multiple values for argument 'name' + >>> + +But using ‘/’ (positional only arguments), it is possible since it +allows ‘name’ as a positional argument and ‘'name'’ as a key in the +keyword arguments: + + def foo(name, /, **kwds): + return 'name' in kwds + >>> foo(1, **{'name': 2}) + True + +In other words, the names of positional-only parameters can be used in +‘**kwds’ without ambiguity. + + +File: python.info, Node: Recap, Prev: Function Examples, Up: Special parameters + +2.4.8.8 Recap +............. + +The use case will determine which parameters to use in the function +definition: + + def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): + +As guidance: + + * 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. + + * 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. + + * For an API, use positional-only to prevent breaking API changes if + the parameter’s name is modified in the future. + + +File: python.info, Node: Arbitrary Argument Lists, Next: Unpacking Argument Lists, Prev: Special parameters, Up: More on Defining Functions + +2.4.8.9 Arbitrary Argument Lists +................................ + +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 *note Tuples and Sequences: 1672.). +Before the variable number of arguments, zero or more normal arguments +may occur. + + def write_multiple_items(file, separator, *args): + file.write(separator.join(args)) + +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 +‘*args’ parameter are ‘keyword-only’ arguments, meaning that they can +only be used as keywords rather than positional arguments. + + >>> def concat(*args, sep="/"): + ... return sep.join(args) + ... + >>> concat("earth", "mars", "venus") + 'earth/mars/venus' + >>> concat("earth", "mars", "venus", sep=".") + 'earth.mars.venus' + + +File: python.info, Node: Unpacking Argument Lists, Next: Lambda Expressions, Prev: Arbitrary Argument Lists, Up: More on Defining Functions + +2.4.8.10 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 *note range(): 58b. +function expects separate `start' and `stop' arguments. If they are not +available separately, write the function call with the ‘*’-operator to +unpack the arguments out of a list or tuple: + + >>> 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] + +In the same fashion, dictionaries can deliver keyword arguments with the +‘**’-operator: + + >>> 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 ! + + +File: python.info, Node: Lambda Expressions, Next: Documentation Strings, Prev: Unpacking Argument Lists, Up: More on Defining Functions + +2.4.8.11 Lambda Expressions +........................... + +Small anonymous functions can be created with the *note lambda: f4b. +keyword. This function returns the sum of its two arguments: ‘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: + + >>> def make_incrementor(n): + ... return lambda x: x + n + ... + >>> f = make_incrementor(42) + >>> f(0) + 42 + >>> f(1) + 43 + +The above example uses a lambda expression to return a function. +Another use is to pass a small function as an argument: + + >>> 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')] + + +File: python.info, Node: Documentation Strings, Next: Function Annotations, Prev: Lambda Expressions, Up: More on Defining Functions + +2.4.8.12 Documentation Strings +.............................. + +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 does not strip indentation from multi-line string +literals in Python, so tools that process documentation have to strip +indentation if desired. This is done using the following convention. +The first non-blank line `after' the first line of the string determines +the amount of indentation for the entire documentation string. (We +can’t use the first line since it is generally adjacent to the string’s +opening quotes so its indentation is not apparent in the string +literal.) Whitespace “equivalent” to this indentation is then stripped +from the start of all lines of the string. Lines that are indented less +should not occur, but if they occur all their leading whitespace should +be stripped. Equivalence of whitespace should be tested after expansion +of tabs (to 8 spaces, normally). + +Here is an example of a multi-line docstring: + + >>> def my_function(): + ... """Do nothing, but document it. + ... + ... No, really, it doesn't do anything. + ... """ + ... pass + ... + >>> print(my_function.__doc__) + Do nothing, but document it. + + No, really, it doesn't do anything. + + +File: python.info, Node: Function Annotations, Prev: Documentation Strings, Up: More on Defining Functions + +2.4.8.13 Function Annotations +............................. + +*note Function annotations: 1682. are completely optional metadata +information about the types used by user-defined functions (see PEP +3107(1) and PEP 484(2) for more information). + +*note Annotations: 1683. are stored in the ‘__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 ‘->’, followed +by an expression, between the parameter list and the colon denoting the +end of the *note def: 10bd. statement. The following example has a +required argument, an optional argument, and the return value annotated: + + >>> def f(ham: str, eggs: str = 'eggs') -> str: + ... print("Annotations:", f.__annotations__) + ... print("Arguments:", ham, eggs) + ... return ham + ' and ' + eggs + ... + >>> f('spam') + Annotations: {'ham': , 'return': , 'eggs': } + Arguments: spam eggs + 'spam and eggs' + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3107/ + + (2) https://peps.python.org/pep-0484/ + + +File: python.info, Node: Intermezzo Coding Style, Prev: More on Defining Functions, Up: More Control Flow Tools + +2.4.9 Intermezzo: 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 concise, `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, PEP 8(1) 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: + + * 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. + + * 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. + + * Use blank lines to separate functions and classes, and larger + blocks of code inside functions. + + * When possible, put comments on a line of their own. + + * Use docstrings. + + * Use spaces around operators and after commas, but not directly + inside bracketing constructs: ‘a = f(1, 2) + g(3, 4)’. + + * Name your classes and functions consistently; the convention is to + use ‘UpperCamelCase’ for classes and ‘lowercase_with_underscores’ + for functions and methods. Always use ‘self’ as the name for the + first method argument (see *note A First Look at Classes: 1686. for + more on classes and methods). + + * 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. + + * 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0008/ + + +File: python.info, Node: Data Structures, Next: Modules, Prev: More Control Flow Tools, Up: The Python Tutorial + +2.5 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:: + + +File: python.info, Node: More on Lists, Next: The del statement, Up: Data Structures + +2.5.1 More on Lists +------------------- + +The list data type has some more methods. Here are all of the methods +of list objects: + + -- Method: list.append (x) + + Add an item to the end of the list. Equivalent to ‘a[len(a):] = + [x]’. + + -- Method: list.extend (iterable) + + Extend the list by appending all the items from the iterable. + Equivalent to ‘a[len(a):] = iterable’. + + -- Method: list.insert (i, x) + + Insert an item at a given position. The first argument is the + index of the element before which to insert, so ‘a.insert(0, x)’ + inserts at the front of the list, and ‘a.insert(len(a), x)’ is + equivalent to ‘a.append(x)’. + + -- Method: list.remove (x) + + Remove the first item from the list whose value is equal to `x'. + It raises a *note ValueError: 1c8. if there is no such item. + + -- Method: list.pop ([i]) + + Remove the item at the given position in the list, and return it. + If no index is specified, ‘a.pop()’ removes and returns the last + item in the list. (The square brackets around the `i' in the + method signature denote that the parameter is optional, not that + you should type square brackets at that position. You will see + this notation frequently in the Python Library Reference.) + + -- Method: list.clear () + + Remove all items from the list. Equivalent to ‘del a[:]’. + + -- Method: list.index (x[, start[, end]]) + + Return zero-based index in the list of the first item whose value + is equal to `x'. Raises a *note ValueError: 1c8. 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. + + -- Method: list.count (x) + + Return the number of times `x' appears in the list. + + -- Method: list.sort (*, key=None, reverse=False) + + Sort the items of the list in place (the arguments can be used for + sort customization, see *note sorted(): 833. for their + explanation). + + -- Method: list.reverse () + + Reverse the elements of the list in place. + + -- Method: list.copy () + + Return a shallow copy of the list. Equivalent to ‘a[:]’. + +An example that uses most of the list methods: + + >>> 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' + +You might have noticed that methods like ‘insert’, ‘remove’ or ‘sort’ +that only modify the list have no return value printed – they return the +default ‘None’. (1) 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, ‘[None, 'hello', 10]’ doesn’t sort because +integers can’t be compared to strings and `None' can’t be compared to +other types. Also, there are some types that don’t have a defined +ordering relation. For example, ‘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:: + + ---------- Footnotes ---------- + + (1) Other languages may return the mutated object, which allows +method chaining, such as ‘d->insert("a")->remove("b")->sort();’. + + +File: python.info, Node: Using Lists as Stacks, Next: Using Lists as Queues, Up: More on Lists + +2.5.1.1 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 ‘append()’. +To retrieve an item from the top of the stack, use ‘pop()’ without an +explicit index. For 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] + + +File: python.info, Node: Using Lists as Queues, Next: List Comprehensions<2>, Prev: Using Lists as Stacks, Up: More on Lists + +2.5.1.2 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 *note collections.deque: 1a9. which was +designed to have fast appends and pops from both ends. For 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']) + + +File: python.info, Node: List Comprehensions<2>, Next: Nested List Comprehensions, Prev: Using Lists as Queues, Up: More on Lists + +2.5.1.3 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: + + >>> squares = [] + >>> for x in range(10): + ... squares.append(x**2) + ... + >>> squares + [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + +Note that this creates (or overwrites) a variable named ‘x’ that still +exists after the loop completes. We can calculate the list of squares +without any side effects using: + + squares = list(map(lambda x: x**2, range(10))) + +or, equivalently: + + squares = [x**2 for x in range(10)] + +which is more concise and readable. + +A list comprehension consists of brackets containing an expression +followed by a ‘for’ clause, then zero or more ‘for’ or ‘if’ clauses. +The result will be a new list resulting from evaluating the expression +in the context of the ‘for’ and ‘if’ clauses which follow it. For +example, this listcomp combines the elements of two lists if they are +not equal: + + >>> [(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)] + +and it’s equivalent to: + + >>> 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)] + +Note how the order of the *note for: 199. and *note if: 467. statements +is the same in both these snippets. + +If the expression is a tuple (e.g. the ‘(x, y)’ in the previous +example), it must be parenthesized. + + >>> 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 "", 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] + +List comprehensions can contain complex expressions and nested +functions: + + >>> from math import pi + >>> [str(round(pi, i)) for i in range(1, 6)] + ['3.1', '3.14', '3.142', '3.1416', '3.14159'] + + +File: python.info, Node: Nested List Comprehensions, Prev: List Comprehensions<2>, Up: More on Lists + +2.5.1.4 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: + + >>> matrix = [ + ... [1, 2, 3, 4], + ... [5, 6, 7, 8], + ... [9, 10, 11, 12], + ... ] + +The following list comprehension will transpose rows and columns: + + >>> [[row[i] for row in matrix] for i in range(4)] + [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] + +As we saw in the previous section, the inner list comprehension is +evaluated in the context of the *note for: 199. that follows it, so this +example is equivalent to: + + >>> 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]] + +which, in turn, is the same as: + + >>> 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]] + +In the real world, you should prefer built-in functions to complex flow +statements. The *note zip(): 3bc. function would do a great job for +this use case: + + >>> list(zip(*matrix)) + [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] + +See *note Unpacking Argument Lists: 167b. for details on the asterisk in +this line. + + +File: python.info, Node: The del statement, Next: Tuples and Sequences, Prev: More on Lists, Up: Data Structures + +2.5.2 The ‘del’ statement +------------------------- + +There is a way to remove an item from a list given its index instead of +its value: the *note del: 1694. statement. This differs from the +‘pop()’ method which returns a value. The ‘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: + + >>> 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 + [] + +*note del: 1694. can also be used to delete entire variables: + + >>> del a + +Referencing the name ‘a’ hereafter is an error (at least until another +value is assigned to it). We’ll find other uses for *note del: 1694. +later. + + +File: python.info, Node: Tuples and Sequences, Next: Sets, Prev: The del statement, Up: Data Structures + +2.5.3 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 *note Sequence Types — list, tuple, range: 1696.). +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: + + >>> 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 "", line 1, in + 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]) + +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 *note +immutable: 1648, 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 *note namedtuples: 538.). +Lists are *note mutable: 164f, 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: + + >>> empty = () + >>> singleton = 'hello', # <-- note trailing comma + >>> len(empty) + 0 + >>> len(singleton) + 1 + >>> singleton + ('hello',) + +The statement ‘t = 12345, 54321, 'hello!'’ is an example of `tuple +packing': the values ‘12345’, ‘54321’ and ‘'hello!'’ are packed together +in a tuple. The reverse operation is also possible: + + >>> x, y, z = t + +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. + + +File: python.info, Node: Sets, Next: Dictionaries, Prev: Tuples and Sequences, Up: Data Structures + +2.5.4 Sets +---------- + +Python also includes a data type for `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 *note set(): 1a6. function can be used to create +sets. Note: to create an empty set you have to use ‘set()’, not ‘{}’; +the latter creates an empty dictionary, a data structure that we discuss +in the next section. + +Here is a brief demonstration: + + >>> 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'} + +Similarly to *note list comprehensions: 1690, set comprehensions are +also supported: + + >>> a = {x for x in 'abracadabra' if x not in 'abc'} + >>> a + {'r', 'd'} + + +File: python.info, Node: Dictionaries, Next: Looping Techniques, Prev: Sets, Up: Data Structures + +2.5.5 Dictionaries +------------------ + +Another useful data type built into Python is the `dictionary' (see +*note Mapping Types — dict: 719.). 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 ‘append()’ and +‘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: ‘{}’. 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 ‘del’. If you store using a key that is already in +use, the old value associated with that key is forgotten. It is an +error to extract a value using a non-existent key. + +Performing ‘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 +‘sorted(d)’ instead). To check whether a single key is in the +dictionary, use the *note in: 20a. keyword. + +Here is a small example using a dictionary: + + >>> tel = {'jack': 4098, 'sape': 4139} + >>> tel['guido'] = 4127 + >>> tel + {'jack': 4098, 'sape': 4139, 'guido': 4127} + >>> tel['jack'] + 4098 + >>> 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 + +The *note dict(): 16e. constructor builds dictionaries directly from +sequences of key-value pairs: + + >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) + {'sape': 4139, 'guido': 4127, 'jack': 4098} + +In addition, dict comprehensions can be used to create dictionaries from +arbitrary key and value expressions: + + >>> {x: x**2 for x in (2, 4, 6)} + {2: 4, 4: 16, 6: 36} + +When the keys are simple strings, it is sometimes easier to specify +pairs using keyword arguments: + + >>> dict(sape=4139, guido=4127, jack=4098) + {'sape': 4139, 'guido': 4127, 'jack': 4098} + + +File: python.info, Node: Looping Techniques, Next: More on Conditions, Prev: Dictionaries, Up: Data Structures + +2.5.6 Looping Techniques +------------------------ + +When looping through dictionaries, the key and corresponding value can +be retrieved at the same time using the ‘items()’ method. + + >>> knights = {'gallahad': 'the pure', 'robin': 'the brave'} + >>> for k, v in knights.items(): + ... print(k, v) + ... + gallahad the pure + robin the brave + +When looping through a sequence, the position index and corresponding +value can be retrieved at the same time using the *note enumerate(): +10e1. function. + + >>> for i, v in enumerate(['tic', 'tac', 'toe']): + ... print(i, v) + ... + 0 tic + 1 tac + 2 toe + +To loop over two or more sequences at the same time, the entries can be +paired with the *note zip(): 3bc. function. + + >>> 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. + +To loop over a sequence in reverse, first specify the sequence in a +forward direction and then call the *note reversed(): 462. function. + + >>> for i in reversed(range(1, 10, 2)): + ... print(i) + ... + 9 + 7 + 5 + 3 + 1 + +To loop over a sequence in sorted order, use the *note sorted(): 833. +function which returns a new sorted list while leaving the source +unaltered. + + >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] + >>> for i in sorted(basket): + ... print(i) + ... + apple + apple + banana + orange + orange + pear + +Using *note set(): 1a6. on a sequence eliminates duplicate elements. +The use of *note sorted(): 833. in combination with *note set(): 1a6. +over a sequence is an idiomatic way to loop over unique elements of the +sequence in sorted order. + + >>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] + >>> for f in sorted(set(basket)): + ... print(f) + ... + apple + banana + orange + pear + +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. + + >>> 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] + + +File: python.info, Node: More on Conditions, Next: Comparing Sequences and Other Types, Prev: Looping Techniques, Up: Data Structures + +2.5.7 More on Conditions +------------------------ + +The conditions used in ‘while’ and ‘if’ statements can contain any +operators, not just comparisons. + +The comparison operators ‘in’ and ‘not in’ are membership tests that +determine whether a value is in (or not in) a container. The operators +‘is’ and ‘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, ‘a < b == c’ tests whether ‘a’ +is less than ‘b’ and moreover ‘b’ equals ‘c’. + +Comparisons may be combined using the Boolean operators ‘and’ and ‘or’, +and the outcome of a comparison (or of any other Boolean expression) may +be negated with ‘not’. These have lower priorities than comparison +operators; between them, ‘not’ has the highest priority and ‘or’ the +lowest, so that ‘A and not B or C’ is equivalent to ‘(A and (not B)) or +C’. As always, parentheses can be used to express the desired +composition. + +The Boolean operators ‘and’ and ‘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 +‘A’ and ‘C’ are true but ‘B’ is false, ‘A and B and C’ does not evaluate +the expression ‘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, + + >>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance' + >>> non_null = string1 or string2 or string3 + >>> non_null + 'Trondheim' + +Note that in Python, unlike C, assignment inside expressions must be +done explicitly with the *note walrus operator: 169e. ‘:=’. This avoids +a common class of problems encountered in C programs: typing ‘=’ in an +expression when ‘==’ was intended. + + +File: python.info, Node: Comparing Sequences and Other Types, Prev: More on Conditions, Up: Data Structures + +2.5.8 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: + + (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) + +Note that comparing objects of different types with ‘<’ or ‘>’ 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 *note TypeError: 19c. +exception. + + +File: python.info, Node: Modules, Next: Input and Output, Prev: Data Structures, Up: The Python Tutorial + +2.6 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 ‘.py’ appended. Within a +module, the module’s name (as a string) is available as the value of the +global variable ‘__name__’. For instance, use your favorite text editor +to create a file called ‘fibo.py’ in the current directory with the +following contents: + + # 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 + +Now enter the Python interpreter and import this module with the +following command: + + >>> import fibo + +This does not add the names of the functions defined in ‘fibo’ directly +to the current *note namespace: 16a4. (see *note Python Scopes and +Namespaces: 16a5. for more details); it only adds the module name ‘fibo’ +there. Using the module name you can access the functions: + + >>> 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' + +If you intend to use a function often you can assign it to a local name: + + >>> fib = fibo.fib + >>> fib(500) + 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 + +* Menu: + +* More on Modules:: +* Standard Modules:: +* The dir() Function: The dir Function. +* Packages:: + + +File: python.info, Node: More on Modules, Next: Standard Modules, Up: Modules + +2.6.1 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. (1) (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, +‘modname.itemname’. + +Modules can import other modules. It is customary but not required to +place all *note import: 1af. 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 *note import: 1af. statement that imports +names from a module directly into the importing module’s namespace. For +example: + + >>> from fibo import fib, fib2 + >>> fib(500) + 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 + +This does not introduce the module name from which the imports are taken +in the local namespace (so in the example, ‘fibo’ is not defined). + +There is even a variant to import all names that a module defines: + + >>> from fibo import * + >>> fib(500) + 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 + +This imports all names except those beginning with an underscore (‘_’). +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 ‘*’ 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 ‘as’, then the name following ‘as’ is +bound directly to the imported module. + + >>> import fibo as fib + >>> fib.fib(500) + 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 + +This is effectively importing the module in the same way that ‘import +fibo’ will do, with the only difference of it being available as ‘fib’. + +It can also be used when utilising *note from: f5a. with similar +effects: + + >>> from fibo import fib as fibonacci + >>> fibonacci(500) + 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 + + 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 *note importlib.reload(): 79d, e.g. + ‘import importlib; importlib.reload(modulename)’. + +* Menu: + +* Executing modules as scripts:: +* The Module Search Path:: +* “Compiled” Python files:: + + ---------- Footnotes ---------- + + (1) 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. + + +File: python.info, Node: Executing modules as scripts, Next: The Module Search Path, Up: More on Modules + +2.6.1.1 Executing modules as scripts +.................................... + +When you run a Python module with + + python fibo.py + +the code in the module will be executed, just as if you imported it, but +with the ‘__name__’ set to ‘"__main__"’. That means that by adding this +code at the end of your module: + + if __name__ == "__main__": + import sys + fib(int(sys.argv[1])) + +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: + + $ python fibo.py 50 + 0 1 1 2 3 5 8 13 21 34 + +If the module is imported, the code is not run: + + >>> import fibo + >>> + +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). + + +File: python.info, Node: The Module Search Path, Next: “Compiled” Python files, Prev: Executing modules as scripts, Up: More on Modules + +2.6.1.2 The Module Search Path +.............................. + +When a module named ‘spam’ is imported, the interpreter first searches +for a built-in module with that name. These module names are listed in +*note sys.builtin_module_names: 16ac. If not found, it then searches +for a file named ‘spam.py’ in a list of directories given by the +variable *note sys.path: 162. *note sys.path: 162. is initialized from +these locations: + + * The directory containing the input script (or the current directory + when no file is specified). + + * *note PYTHONPATH: cc7. (a list of directory names, with the same + syntax as the shell variable ‘PATH’). + + * The installation-dependent default (by convention including a + ‘site-packages’ directory, handled by the *note site: e8. module). + +More details are at *note The initialization of the sys.path module +search path: 16ad. + + 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. + +After initialization, Python programs can modify *note sys.path: 162. +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 *note Standard Modules: 16ae. for more +information. + + +File: python.info, Node: “Compiled” Python files, Prev: The Module Search Path, Up: More on Modules + +2.6.1.3 “Compiled” Python files +............................... + +To speed up loading modules, Python caches the compiled version of each +module in the ‘__pycache__’ directory under the name +‘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 ‘__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: + + * You can use the *note -O: a34. or *note -OO: a35. switches on the + Python command to reduce the size of a compiled module. The ‘-O’ + switch removes assert statements, the ‘-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 ‘opt-’ tag + and are usually smaller. Future releases may change the effects of + optimization. + + * A program doesn’t run any faster when it is read from a ‘.pyc’ file + than when it is read from a ‘.py’ file; the only thing that’s + faster about ‘.pyc’ files is the speed with which they are loaded. + + * The module *note compileall: 1f. can create .pyc files for all + modules in a directory. + + * There is more detail on this process, including a flow chart of the + decisions, in PEP 3147(1). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + +File: python.info, Node: Standard Modules, Next: The dir Function, Prev: More on Modules, Up: Modules + +2.6.2 Standard Modules +---------------------- + +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 *note winreg: 134. module is only provided +on Windows systems. One particular module deserves some attention: +*note sys: f9, which is built into every Python interpreter. The +variables ‘sys.ps1’ and ‘sys.ps2’ define the strings used as primary and +secondary prompts: + + >>> import sys + >>> sys.ps1 + '>>> ' + >>> sys.ps2 + '... ' + >>> sys.ps1 = 'C> ' + C> print('Yuck!') + Yuck! + C> + +These two variables are only defined if the interpreter is in +interactive mode. + +The variable ‘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 *note PYTHONPATH: cc7, or from +a built-in default if *note PYTHONPATH: cc7. is not set. You can modify +it using standard list operations: + + >>> import sys + >>> sys.path.append('/ufs/guido/lib/python') + + +File: python.info, Node: The dir Function, Next: Packages, Prev: Standard Modules, Up: Modules + +2.6.3 The ‘dir()’ Function +-------------------------- + +The built-in function *note dir(): 20e. is used to find out which names +a module defines. It returns a sorted list of strings: + + >>> 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'] + +Without arguments, *note dir(): 20e. lists the names you have defined +currently: + + >>> a = [1, 2, 3, 4, 5] + >>> import fibo + >>> fib = fibo.fib + >>> dir() + ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys'] + +Note that it lists all types of names: variables, modules, functions, +etc. + +*note dir(): 20e. 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 *note builtins: 11.: + + >>> 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'] + + +File: python.info, Node: Packages, Prev: The dir Function, Up: Modules + +2.6.4 Packages +-------------- + +Packages are a way of structuring Python’s module namespace by using +“dotted module names”. For example, the module name ‘A.B’ designates a +submodule named ‘B’ in a package named ‘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: ‘.wav’, ‘.aiff’, ‘.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): + + 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 + ... + +When importing the package, Python searches through the directories on +‘sys.path’ looking for the package subdirectory. + +The ‘__init__.py’ files are required to make Python treat directories +containing the file as packages. This prevents directories with a +common name, such as ‘string’, unintentionally hiding valid modules that +occur later on the module search path. In the simplest case, +‘__init__.py’ can just be an empty file, but it can also execute +initialization code for the package or set the ‘__all__’ variable, +described later. + +Users of the package can import individual modules from the package, for +example: + + import sound.effects.echo + +This loads the submodule ‘sound.effects.echo’. It must be referenced +with its full name. + + sound.effects.echo.echofilter(input, output, delay=0.7, atten=4) + +An alternative way of importing the submodule is: + + from sound.effects import echo + +This also loads the submodule ‘echo’, and makes it available without its +package prefix, so it can be used as follows: + + echo.echofilter(input, output, delay=0.7, atten=4) + +Yet another variation is to import the desired function or variable +directly: + + from sound.effects.echo import echofilter + +Again, this loads the submodule ‘echo’, but this makes its function +‘echofilter()’ directly available: + + echofilter(input, output, delay=0.7, atten=4) + +Note that when using ‘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 ‘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 *note ImportError: 511. exception is raised. + +Contrarily, when using syntax like ‘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:: + + +File: python.info, Node: Importing * From a Package, Next: Intra-package References, Up: Packages + +2.6.4.1 Importing * From a Package +.................................. + +Now what happens when the user writes ‘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 *note import: 1af. statement uses the following +convention: if a package’s ‘__init__.py’ code defines a list named +‘__all__’, it is taken to be the list of module names that should be +imported when ‘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 ‘sound/effects/__init__.py’ could contain the +following code: + + __all__ = ["echo", "surround", "reverse"] + +This would mean that ‘from sound.effects import *’ would import the +three named submodules of the ‘sound.effects’ package. + +If ‘__all__’ is not defined, the statement ‘from sound.effects import *’ +does `not' import all submodules from the package ‘sound.effects’ into +the current namespace; it only ensures that the package ‘sound.effects’ +has been imported (possibly running any initialization code in +‘__init__.py’) and then imports whatever names are defined in the +package. This includes any names defined (and submodules explicitly +loaded) by ‘__init__.py’. It also includes any submodules of the +package that were explicitly loaded by previous *note import: 1af. +statements. Consider this code: + + import sound.effects.echo + import sound.effects.surround + from sound.effects import * + +In this example, the ‘echo’ and ‘surround’ modules are imported in the +current namespace because they are defined in the ‘sound.effects’ +package when the ‘from...import’ statement is executed. (This also +works when ‘__all__’ is defined.) + +Although certain modules are designed to export only names that follow +certain patterns when you use ‘import *’, it is still considered bad +practice in production code. + +Remember, there is nothing wrong with using ‘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. + + +File: python.info, Node: Intra-package References, Next: Packages in Multiple Directories, Prev: Importing * From a Package, Up: Packages + +2.6.4.2 Intra-package References +................................ + +When packages are structured into subpackages (as with the ‘sound’ +package in the example), you can use absolute imports to refer to +submodules of siblings packages. For example, if the module +‘sound.filters.vocoder’ needs to use the ‘echo’ module in the +‘sound.effects’ package, it can use ‘from sound.effects import echo’. + +You can also write relative imports, with the ‘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 ‘surround’ module for example, you might use: + + from . import echo + from .. import formats + from ..filters import equalizer + +Note that relative imports are based on the name of the current module. +Since the name of the main module is always ‘"__main__"’, modules +intended for use as the main module of a Python application must always +use absolute imports. + + +File: python.info, Node: Packages in Multiple Directories, Prev: Intra-package References, Up: Packages + +2.6.4.3 Packages in Multiple Directories +........................................ + +Packages support one more special attribute, *note __path__: 16ba. This +is initialized to be a list containing the name of the directory holding +the package’s ‘__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. + + +File: python.info, Node: Input and Output, Next: Errors and Exceptions, Prev: Modules, Up: The Python Tutorial + +2.7 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:: + + +File: python.info, Node: Fancier Output Formatting, Next: Reading and Writing Files, Up: Input and Output + +2.7.1 Fancier Output Formatting +------------------------------- + +So far we’ve encountered two ways of writing values: `expression +statements' and the *note print(): c13. function. (A third way is using +the ‘write()’ method of file objects; the standard output file can be +referenced as ‘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. + + * To use *note formatted string literals: 16c0, begin a string with + ‘f’ or ‘F’ before the opening quotation mark or triple quotation + mark. Inside this string, you can write a Python expression + between ‘{’ and ‘}’ characters that can refer to variables or + literal values. + + >>> year = 2016 + >>> event = 'Referendum' + >>> f'Results of the {year} {event}' + 'Results of the 2016 Referendum' + + * The *note str.format(): 1fc. method of strings requires more manual + effort. You’ll still use ‘{’ and ‘}’ 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. + + >>> yes_votes = 42_572_654 + >>> no_votes = 43_132_495 + >>> percentage = yes_votes / (yes_votes + no_votes) + >>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage) + ' 42572654 YES votes 49.67%' + + * 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. + +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 *note repr(): 3ee. or *note str(): 1b3. functions. + +The *note str(): 1b3. function is meant to return representations of +values which are fairly human-readable, while *note repr(): 3ee. is +meant to generate representations which can be read by the interpreter +(or will force a *note SyntaxError: 2d6. if there is no equivalent +syntax). For objects which don’t have a particular representation for +human consumption, *note str(): 1b3. will return the same value as *note +repr(): 3ee. 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: + + >>> 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'))" + +The *note string: f3. module contains a *note Template: 259. class that +offers yet another way to substitute values into strings, using +placeholders like ‘$x’ and replacing them with values from a dictionary, +but offers much less control of the formatting. + +* Menu: + +* Formatted String Literals:: +* The String format() Method: The String format Method. +* Manual String Formatting:: +* Old string formatting:: + + +File: python.info, Node: Formatted String Literals, Next: The String format Method, Up: Fancier Output Formatting + +2.7.1.1 Formatted String Literals +................................. + +*note Formatted string literals: 5f9. (also called f-strings for short) +let you include the value of Python expressions inside a string by +prefixing the string with ‘f’ or ‘F’ and writing expressions as +‘{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: + + >>> import math + >>> print(f'The value of pi is approximately {math.pi:.3f}.') + The value of pi is approximately 3.142. + +Passing an integer after the ‘':'’ will cause that field to be a minimum +number of characters wide. This is useful for making columns line up. + + >>> 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 + +Other modifiers can be used to convert the value before it is formatted. +‘'!a'’ applies *note ascii(): 104d, ‘'!s'’ applies *note str(): 1b3, and +‘'!r'’ applies *note repr(): 3ee.: + + >>> 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'. + +The ‘=’ specifier can be used to expand an expression to the text of the +expression, an equal sign, then the representation of the evaluated +expression: + + >>> bugs = 'roaches' + >>> count = 13 + >>> area = 'living room' + >>> print(f'Debugging {bugs=} {count=} {area=}') + Debugging bugs='roaches' count=13 area='living room' + +See *note self-documenting expressions: 5f7. for more information on the +‘=’ specifier. For a reference on these format specifications, see the +reference guide for the *note Format Specification Mini-Language: 1b0. + + +File: python.info, Node: The String format Method, Next: Manual String Formatting, Prev: Formatted String Literals, Up: Fancier Output Formatting + +2.7.1.2 The String format() Method +.................................. + +Basic usage of the *note str.format(): 1fc. method looks like this: + + >>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) + We are the knights who say "Ni!" + +The brackets and characters within them (called format fields) are +replaced with the objects passed into the *note str.format(): 1fc. +method. A number in the brackets can be used to refer to the position +of the object passed into the *note str.format(): 1fc. method. + + >>> print('{0} and {1}'.format('spam', 'eggs')) + spam and eggs + >>> print('{1} and {0}'.format('spam', 'eggs')) + eggs and spam + +If keyword arguments are used in the *note str.format(): 1fc. method, +their values are referred to by using the name of the argument. + + >>> print('This {food} is {adjective}.'.format( + ... food='spam', adjective='absolutely horrible')) + This spam is absolutely horrible. + +Positional and keyword arguments can be arbitrarily combined: + + >>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', + ... other='Georg')) + The story of Bill, Manfred, and Georg. + +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 ‘'[]'’ to access the keys. + + >>> 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 + +This could also be done by passing the ‘table’ dictionary as keyword +arguments with the ‘**’ notation. + + >>> 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 + +This is particularly useful in combination with the built-in function +*note vars(): 1480, which returns a dictionary containing all local +variables. + +As an example, the following lines produce a tidily aligned set of +columns giving integers and their squares and cubes: + + >>> 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 + +For a complete overview of string formatting with *note str.format(): +1fc, see *note Format String Syntax: 1021. + + +File: python.info, Node: Manual String Formatting, Next: Old string formatting, Prev: The String format Method, Up: Fancier Output Formatting + +2.7.1.3 Manual String Formatting +................................ + +Here’s the same table of squares and cubes, formatted manually: + + >>> 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 + +(Note that the one space between each column was added by the way *note +print(): c13. works: it always adds spaces between its arguments.) + +The *note str.rjust(): 16c5. 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 *note str.ljust(): 16c6. and *note +str.center(): 16c7. 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 ‘x.ljust(n)[:n]’.) + +There is another method, *note str.zfill(): 16c8, which pads a numeric +string on the left with zeros. It understands about plus and minus +signs: + + >>> '12'.zfill(5) + '00012' + >>> '-3.14'.zfill(7) + '-003.14' + >>> '3.14159265359'.zfill(5) + '3.14159265359' + + +File: python.info, Node: Old string formatting, Prev: Manual String Formatting, Up: Fancier Output Formatting + +2.7.1.4 Old string formatting +............................. + +The % operator (modulo) can also be used for string formatting. Given +‘'string' % values’, instances of ‘%’ in ‘string’ are replaced with zero +or more elements of ‘values’. This operation is commonly known as +string interpolation. For example: + + >>> import math + >>> print('The value of pi is approximately %5.3f.' % math.pi) + The value of pi is approximately 3.142. + +More information can be found in the *note printf-style String +Formatting: 295. section. + + +File: python.info, Node: Reading and Writing Files, Prev: Fancier Output Formatting, Up: Input and Output + +2.7.2 Reading and Writing Files +------------------------------- + +*note open(): 30b. returns a *note file object: e76, and is most +commonly used with two positional arguments and one keyword argument: +‘open(filename, mode, encoding=None)’ + + >>> f = open('workfile', 'w', encoding="utf-8") + +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 ‘'r'’ when the file +will only be read, ‘'w'’ for only writing (an existing file with the +same name will be erased), and ‘'a'’ opens the file for appending; any +data written to the file is automatically added to the end. ‘'r+'’ +opens the file for both reading and writing. The `mode' argument is +optional; ‘'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 *note open(): 30b.). Because UTF-8 is the modern +de-facto standard, ‘encoding="utf-8"’ is recommended unless you know +that you need to use a different encoding. Appending a ‘'b'’ to the +mode opens the file in `binary mode'. Binary mode data is read and +written as *note bytes: 1b4. 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 (‘\n’ on Unix, ‘\r\n’ on Windows) to just ‘\n’. When +writing in text mode, the default is to convert occurrences of ‘\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 ‘JPEG’ or ‘EXE’ files. Be very careful to use binary mode when +reading and writing such files. + +It is good practice to use the *note with: 19e. 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 ‘with’ is also much shorter than writing equivalent *note try: +1073.-*note finally: 60a. blocks: + + >>> 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 + +If you’re not using the *note with: 19e. keyword, then you should call +‘f.close()’ to close the file and immediately free up any system +resources used by it. + + Warning: Calling ‘f.write()’ without using the ‘with’ keyword or + calling ‘f.close()’ `might' result in the arguments of ‘f.write()’ + not being completely written to the disk, even if the program exits + successfully. + +After a file object is closed, either by a *note with: 19e. statement or +by calling ‘f.close()’, attempts to use the file object will +automatically fail. + + >>> f.close() + >>> f.read() + Traceback (most recent call last): + File "", line 1, in + ValueError: I/O operation on closed file. + +* Menu: + +* Methods of File Objects:: +* Saving structured data with json:: + + +File: python.info, Node: Methods of File Objects, Next: Saving structured data with json, Up: Reading and Writing Files + +2.7.2.1 Methods of File Objects +............................... + +The rest of the examples in this section will assume that a file object +called ‘f’ has already been created. + +To read a file’s contents, call ‘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, ‘f.read()’ will return an empty string +(‘''’). + + >>> f.read() + 'This is the entire file.\n' + >>> f.read() + '' + +‘f.readline()’ reads a single line from the file; a newline character +(‘\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 ‘f.readline()’ returns an empty string, the +end of the file has been reached, while a blank line is represented by +‘'\n'’, a string containing only a single newline. + + >>> f.readline() + 'This is the first line of the file.\n' + >>> f.readline() + 'Second line of the file\n' + >>> f.readline() + '' + +For reading lines from a file, you can loop over the file object. This +is memory efficient, fast, and leads to simple code: + + >>> for line in f: + ... print(line, end='') + ... + This is the first line of the file. + Second line of the file + +If you want to read all the lines of a file in a list you can also use +‘list(f)’ or ‘f.readlines()’. + +‘f.write(string)’ writes the contents of `string' to the file, returning +the number of characters written. + + >>> f.write('This is a test\n') + 15 + +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: + + >>> value = ('the answer', 42) + >>> s = str(value) # convert the tuple to string + >>> f.write(s) + 18 + +‘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 ‘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. + + >>> 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' + +In text files (those opened without a ‘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 ‘seek(0, 2)’) and the only valid +`offset' values are those returned from the ‘f.tell()’, or zero. Any +other `offset' value produces undefined behaviour. + +File objects have some additional methods, such as ‘isatty()’ and +‘truncate()’ which are less frequently used; consult the Library +Reference for a complete guide to file objects. + + +File: python.info, Node: Saving structured data with json, Prev: Methods of File Objects, Up: Reading and Writing Files + +2.7.2.2 Saving structured data with ‘json’ +.......................................... + +Strings can easily be written to and read from a file. Numbers take a +bit more effort, since the ‘read()’ method only returns strings, which +will have to be passed to a function like *note int(): 1c7, which takes +a string like ‘'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)(1). +The standard module called *note json: a2. 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. + + 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. + +If you have an object ‘x’, you can view its JSON string representation +with a simple line of code: + + >>> import json + >>> x = [1, 'simple', 'list'] + >>> json.dumps(x) + '[1, "simple", "list"]' + +Another variant of the *note dumps(): 9bf. function, called *note +dump(): 9be, simply serializes the object to a *note text file: 16d0. +So if ‘f’ is a *note text file: 16d0. object opened for writing, we can +do this: + + json.dump(x, f) + +To decode the object again, if ‘f’ is a *note binary file: 16d1. or +*note text file: 16d0. object which has been opened for reading: + + x = json.load(f) + + Note: JSON files must be encoded in UTF-8. Use ‘encoding="utf-8"’ + when opening JSON file as a *note text file: 16d0. for both of + reading and writing. + +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 *note json: a2. module contains an +explanation of this. + +See also +........ + +*note pickle: c7. - the pickle module + +Contrary to *note JSON: 16cf, `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. + + ---------- Footnotes ---------- + + (1) http://json.org + + +File: python.info, Node: Errors and Exceptions, Next: Classes, Prev: Input and Output, Up: The Python Tutorial + +2.8 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:: + + +File: python.info, Node: Syntax Errors, Next: Exceptions, Up: Errors and Exceptions + +2.8.1 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: + + >>> while True print('Hello world') + File "", line 1 + while True print('Hello world') + ^ + SyntaxError: invalid syntax + +The parser repeats the offending line and displays a little ‘arrow’ +pointing at the earliest point in the line where the error was detected. +The error is caused by (or at least detected at) the token `preceding' +the arrow: in the example, the error is detected at the function *note +print(): c13, since a colon (‘':'’) is missing before it. File name and +line number are printed so you know where to look in case the input came +from a script. + + +File: python.info, Node: Exceptions, Next: Handling Exceptions, Prev: Syntax Errors, Up: Errors and Exceptions + +2.8.2 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: + + >>> 10 * (1/0) + Traceback (most recent call last): + File "", line 1, in + ZeroDivisionError: division by zero + >>> 4 + spam*3 + Traceback (most recent call last): + File "", line 1, in + NameError: name 'spam' is not defined + >>> '2' + 2 + Traceback (most recent call last): + File "", line 1, in + TypeError: can only concatenate str (not "int") to str + +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 *note ZeroDivisionError: 58d, *note +NameError: 396. and *note TypeError: 19c. 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. + +*note Built-in Exceptions: 1281. lists the built-in exceptions and their +meanings. + + +File: python.info, Node: Handling Exceptions, Next: Raising Exceptions, Prev: Exceptions, Up: Errors and Exceptions + +2.8.3 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 ‘Control-C’ or whatever the operating system supports); note that +a user-generated interruption is signalled by raising the *note +KeyboardInterrupt: 611. exception. + + >>> while True: + ... try: + ... x = int(input("Please enter a number: ")) + ... break + ... except ValueError: + ... print("Oops! That was no valid number. Try again...") + ... + +The *note try: 1073. statement works as follows. + + * First, the `try clause' (the statement(s) between the *note try: + 1073. and *note except: 17a. keywords) is executed. + + * If no exception occurs, the `except clause' is skipped and + execution of the *note try: 1073. statement is finished. + + * If an exception occurs during execution of the *note try: 1073. + clause, the rest of the clause is skipped. Then, if its type + matches the exception named after the *note except: 17a. keyword, + the `except clause' is executed, and then execution continues after + the try/except block. + + * If an exception occurs which does not match the exception named in + the `except clause', it is passed on to outer *note try: 1073. + statements; if no handler is found, it is an `unhandled exception' + and execution stops with a message as shown above. + +A *note try: 1073. 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 ‘try’ +statement. An `except clause' may name multiple exceptions as a +parenthesized tuple, for example: + + ... except (RuntimeError, TypeError, NameError): + ... pass + +A class in an *note except: 17a. clause is compatible with an exception +if it is the same class or a base class thereof (but not the other way +around — an `except clause' listing a derived class is not compatible +with a base class). For example, the following code will print B, C, D +in that order: + + 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") + +Note that if the `except clauses' were reversed (with ‘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 +‘args’ attribute that stores the arguments. For convenience, builtin +exception types define ‘__str__()’ to print all the arguments without +explicitly accessing ‘.args’. + + >>> try: + ... raise Exception('spam', 'eggs') + ... except Exception as inst: + ... print(type(inst)) # the exception instance + ... 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) + ... + + ('spam', 'eggs') + ('spam', 'eggs') + x = spam + y = eggs + +The exception’s ‘__str__()’ output is printed as the last part +(‘detail’) of the message for unhandled exceptions. + +*note BaseException: 17d. is the common base class of all exceptions. +One of its subclasses, *note Exception: 61c, is the base class of all +the non-fatal exceptions. Exceptions which are not subclasses of *note +Exception: 61c. are not typically handled, because they are used to +indicate that the program should terminate. They include *note +SystemExit: 9b6. which is raised by *note sys.exit(): fec. and *note +KeyboardInterrupt: 611. which is raised when a user wishes to interrupt +the program. + +*note Exception: 61c. 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 *note Exception: 61c. is to print +or log the exception and then re-raise it (allowing a caller to handle +the exception as well): + + 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 + +The *note try: 1073. … *note except: 17a. 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: + + 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() + +The use of the ‘else’ clause is better than adding additional code to +the *note try: 1073. clause because it avoids accidentally catching an +exception that wasn’t raised by the code being protected by the ‘try’ … +‘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: + + >>> 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 + + +File: python.info, Node: Raising Exceptions, Next: Exception Chaining, Prev: Handling Exceptions, Up: Errors and Exceptions + +2.8.4 Raising Exceptions +------------------------ + +The *note raise: 1be. statement allows the programmer to force a +specified exception to occur. For example: + + >>> raise NameError('HiThere') + Traceback (most recent call last): + File "", line 1, in + NameError: HiThere + +The sole argument to *note raise: 1be. indicates the exception to be +raised. This must be either an exception instance or an exception class +(a class that derives from *note BaseException: 17d, such as *note +Exception: 61c. or one of its subclasses). If an exception class is +passed, it will be implicitly instantiated by calling its constructor +with no arguments: + + raise ValueError # shorthand for 'raise ValueError()' + +If you need to determine whether an exception was raised but don’t +intend to handle it, a simpler form of the *note raise: 1be. statement +allows you to re-raise the exception: + + >>> try: + ... raise NameError('HiThere') + ... except NameError: + ... print('An exception flew by!') + ... raise + ... + An exception flew by! + Traceback (most recent call last): + File "", line 2, in + NameError: HiThere + + +File: python.info, Node: Exception Chaining, Next: User-defined Exceptions, Prev: Raising Exceptions, Up: Errors and Exceptions + +2.8.5 Exception Chaining +------------------------ + +If an unhandled exception occurs inside an *note except: 17a. section, +it will have the exception being handled attached to it and included in +the error message: + + >>> try: + ... open("database.sqlite") + ... except OSError: + ... raise RuntimeError("unable to handle error") + ... + Traceback (most recent call last): + File "", line 2, in + 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 "", line 4, in + RuntimeError: unable to handle error + +To indicate that an exception is a direct consequence of another, the +*note raise: 1be. statement allows an optional *note from: 1be. clause: + + # exc must be exception instance or None. + raise RuntimeError from exc + +This can be useful when you are transforming exceptions. For 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 "", line 2, in + File "", line 2, in func + ConnectionError + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "", line 4, in + RuntimeError: Failed to open database + +It also allows disabling automatic exception chaining using the ‘from +None’ idiom: + + >>> try: + ... open('database.sqlite') + ... except OSError: + ... raise RuntimeError from None + ... + Traceback (most recent call last): + File "", line 4, in + RuntimeError + +For more information about chaining mechanics, see *note Built-in +Exceptions: 1281. + + +File: python.info, Node: User-defined Exceptions, Next: Defining Clean-up Actions, Prev: Exception Chaining, Up: Errors and Exceptions + +2.8.6 User-defined Exceptions +----------------------------- + +Programs may name their own exceptions by creating a new exception class +(see *note Classes: 166b. for more about Python classes). Exceptions +should typically be derived from the *note Exception: 61c. 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. + + +File: python.info, Node: Defining Clean-up Actions, Next: Predefined Clean-up Actions, Prev: User-defined Exceptions, Up: Errors and Exceptions + +2.8.7 Defining Clean-up Actions +------------------------------- + +The *note try: 1073. statement has another optional clause which is +intended to define clean-up actions that must be executed under all +circumstances. For example: + + >>> try: + ... raise KeyboardInterrupt + ... finally: + ... print('Goodbye, world!') + ... + Goodbye, world! + Traceback (most recent call last): + File "", line 2, in + KeyboardInterrupt + +If a *note finally: 60a. clause is present, the ‘finally’ clause will +execute as the last task before the *note try: 1073. statement +completes. The ‘finally’ clause runs whether or not the ‘try’ statement +produces an exception. The following points discuss more complex cases +when an exception occurs: + + * If an exception occurs during execution of the ‘try’ clause, the + exception may be handled by an *note except: 17a. clause. If the + exception is not handled by an ‘except’ clause, the exception is + re-raised after the ‘finally’ clause has been executed. + + * An exception could occur during execution of an ‘except’ or ‘else’ + clause. Again, the exception is re-raised after the ‘finally’ + clause has been executed. + + * If the ‘finally’ clause executes a *note break: 706, *note + continue: 609. or *note return: 60e. statement, exceptions are not + re-raised. + + * If the ‘try’ statement reaches a *note break: 706, *note continue: + 609. or *note return: 60e. statement, the ‘finally’ clause will + execute just prior to the ‘break’, ‘continue’ or ‘return’ + statement’s execution. + + * If a ‘finally’ clause includes a ‘return’ statement, the returned + value will be the one from the ‘finally’ clause’s ‘return’ + statement, not the value from the ‘try’ clause’s ‘return’ + statement. + +For example: + + >>> def bool_return(): + ... try: + ... return True + ... finally: + ... return False + ... + >>> bool_return() + False + +A more complicated 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 "", line 1, in + File "", line 3, in divide + TypeError: unsupported operand type(s) for /: 'str' and 'str' + +As you can see, the *note finally: 60a. clause is executed in any event. +The *note TypeError: 19c. raised by dividing two strings is not handled +by the *note except: 17a. clause and therefore re-raised after the +‘finally’ clause has been executed. + +In real world applications, the *note finally: 60a. clause is useful for +releasing external resources (such as files or network connections), +regardless of whether the use of the resource was successful. + + +File: python.info, Node: Predefined Clean-up Actions, Next: Raising and Handling Multiple Unrelated Exceptions, Prev: Defining Clean-up Actions, Up: Errors and Exceptions + +2.8.8 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. + + for line in open("myfile.txt"): + print(line, end="") + +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 *note with: 19e. statement allows objects +like files to be used in a way that ensures they are always cleaned up +promptly and correctly. + + with open("myfile.txt") as f: + for line in f: + print(line, end="") + +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. + + +File: python.info, Node: Raising and Handling Multiple Unrelated Exceptions, Next: Enriching Exceptions with Notes, Prev: Predefined Clean-up Actions, Up: Errors and Exceptions + +2.8.9 Raising and Handling Multiple Unrelated Exceptions +-------------------------------------------------------- + +There are situations where it is necessary to report several exceptions +that have occurred. This it 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 *note ExceptionGroup: 177. 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. + + >>> def f(): + ... excs = [OSError('error 1'), SystemError('error 2')] + ... raise ExceptionGroup('there were problems', excs) + ... + >>> f() + + Exception Group Traceback (most recent call last): + | File "", line 1, in + | File "", line 3, in f + | ExceptionGroup: there were problems + +-+---------------- 1 ---------------- + | OSError: error 1 + +---------------- 2 ---------------- + | SystemError: error 2 + +------------------------------------ + >>> try: + ... f() + ... except Exception as e: + ... print(f'caught {type(e)}: e') + ... + caught : e + >>> + +By using ‘except*’ instead of ‘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 ‘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. + + >>> 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 "", line 2, in + | File "", line 2, in f + | ExceptionGroup: group1 + +-+---------------- 1 ---------------- + | ExceptionGroup: group2 + +-+---------------- 1 ---------------- + | RecursionError: 4 + +------------------------------------ + >>> + +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: + + >>> excs = [] + ... for test in tests: + ... try: + ... test.run() + ... except Exception as e: + ... excs.append(e) + ... + >>> if excs: + ... raise ExceptionGroup("Test Failures", excs) + ... + + +File: python.info, Node: Enriching Exceptions with Notes, Prev: Raising and Handling Multiple Unrelated Exceptions, Up: Errors and Exceptions + +2.8.10 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 +‘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. + + >>> 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 "", line 2, in + TypeError: bad type + Add some information + Add some more information + >>> + +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. + + >>> 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 "", line 1, in + | ExceptionGroup: We have some problems (3 sub-exceptions) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "", line 3, in + | File "", line 2, in f + | OSError: operation failed + | Happened in Iteration 1 + +---------------- 2 ---------------- + | Traceback (most recent call last): + | File "", line 3, in + | File "", line 2, in f + | OSError: operation failed + | Happened in Iteration 2 + +---------------- 3 ---------------- + | Traceback (most recent call last): + | File "", line 3, in + | File "", line 2, in f + | OSError: operation failed + | Happened in Iteration 3 + +------------------------------------ + >>> + + +File: python.info, Node: Classes, Next: Brief Tour of the Standard Library, Prev: Errors and Exceptions, Up: The Python Tutorial + +2.9 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 *note Private Variables: 16e9.), 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:: + + +File: python.info, Node: A Word About Names and Objects, Next: Python Scopes and Namespaces, Up: Classes + +2.9.1 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. + + +File: python.info, Node: Python Scopes and Namespaces, Next: A First Look at Classes, Prev: A Word About Names and Objects, Up: Classes + +2.9.2 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 *note abs(): 16ed, 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 ‘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 ‘z.real’, ‘real’ is an attribute of the +object ‘z’. Strictly speaking, references to names in modules are +attribute references: in the expression ‘modname.funcname’, ‘modname’ is +a module object and ‘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! (1) + +Attributes may be read-only or writable. In the latter case, assignment +to attributes is possible. Module attributes are writable: you can +write ‘modname.the_answer = 42’. Writable attributes may also be +deleted with the *note del: 1694. statement. For example, ‘del +modname.the_answer’ will remove the attribute ‘the_answer’ from the +object named by ‘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 *note __main__: 1, so they have their own global +namespace. (The built-in names actually also live in a module; this is +called *note builtins: 11.) + +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: + + * the innermost scope, which is searched first, contains the local + names + + * the scopes of any enclosing functions, which are searched starting + with the nearest enclosing scope, contains non-local, but also + non-global names + + * the next-to-last scope contains the current module’s global names + + * the outermost scope (searched last) is the namespace containing + built-in names + +If a name is declared global, then all references and assignments go +directly to the middle scope containing the module’s global names. To +rebind variables found outside of the innermost scope, the *note +nonlocal: f56. 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 *note global: 166a. or *note +nonlocal: f56. 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 ‘del x’ +removes the binding of ‘x’ from the namespace referenced by the local +scope. In fact, all operations that introduce new names use the local +scope: in particular, *note import: 1af. statements and function +definitions bind the module or function name in the local scope. + +The *note global: 166a. statement can be used to indicate that +particular variables live in the global scope and should be rebound +there; the *note nonlocal: f56. statement indicates that particular +variables live in an enclosing scope and should be rebound there. + +* Menu: + +* Scopes and Namespaces Example:: + + ---------- Footnotes ---------- + + (1) Except for one thing. Module objects have a secret read-only +attribute called *note __dict__: 8ce. which returns the dictionary used +to implement the module’s namespace; the name *note __dict__: 8ce. 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. + + +File: python.info, Node: Scopes and Namespaces Example, Up: Python Scopes and Namespaces + +2.9.2.1 Scopes and Namespaces Example +..................................... + +This is an example demonstrating how to reference the different scopes +and namespaces, and how *note global: 166a. and *note nonlocal: f56. +affect variable binding: + + 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) + +The output of the example code is: + + After local assignment: test spam + After nonlocal assignment: nonlocal spam + After global assignment: nonlocal spam + In global scope: global spam + +Note how the `local' assignment (which is default) didn’t change +`scope_test'’s binding of `spam'. The *note nonlocal: f56. assignment +changed `scope_test'’s binding of `spam', and the *note global: 166a. +assignment changed the module-level binding. + +You can also see that there was no previous binding for `spam' before +the *note global: 166a. assignment. + + +File: python.info, Node: A First Look at Classes, Next: Random Remarks, Prev: Python Scopes and Namespaces, Up: Classes + +2.9.3 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:: + + +File: python.info, Node: Class Definition Syntax, Next: Class Objects, Up: A First Look at Classes + +2.9.3.1 Class Definition Syntax +............................... + +The simplest form of class definition looks like this: + + class ClassName: + + . + . + . + + +Class definitions, like function definitions (*note def: 10bd. +statements) must be executed before they have any effect. (You could +conceivably place a class definition in a branch of an *note if: 467. +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 (‘ClassName’ in the example). + + +File: python.info, Node: Class Objects, Next: Instance Objects, Prev: Class Definition Syntax, Up: A First Look at Classes + +2.9.3.2 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: ‘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: + + class MyClass: + """A simple example class""" + i = 12345 + + def f(self): + return 'hello world' + +then ‘MyClass.i’ and ‘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 +‘MyClass.i’ by assignment. ‘__doc__’ is also a valid attribute, +returning the docstring belonging to the class: ‘"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): + + x = MyClass() + +creates a new `instance' of the class and assigns this object to the +local variable ‘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 ‘__init__()’, like this: + + def __init__(self): + self.data = [] + +When a class defines an ‘__init__()’ method, class instantiation +automatically invokes ‘__init__()’ for the newly created class instance. +So in this example, a new, initialized instance can be obtained by: + + x = MyClass() + +Of course, the ‘__init__()’ method may have arguments for greater +flexibility. In that case, arguments given to the class instantiation +operator are passed on to ‘__init__()’. For 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) + + +File: python.info, Node: Instance Objects, Next: Method Objects, Prev: Class Objects, Up: A First Look at Classes + +2.9.3.3 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 ‘x’ is the instance of ‘MyClass’ created above, the +following piece of code will print the value ‘16’, without leaving a +trace: + + x.counter = 1 + while x.counter < 10: + x.counter = x.counter * 2 + print(x.counter) + del x.counter + +The other kind of instance attribute reference is a `method'. A method +is a function that “belongs to” an object. (In Python, the term method +is not unique to class instances: other object types can have methods as +well. For example, list objects have methods called append, insert, +remove, sort, and so on. However, in the following discussion, we’ll +use the term method exclusively to mean methods of class instance +objects, unless explicitly stated otherwise.) + +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, ‘x.f’ is a +valid method reference, since ‘MyClass.f’ is a function, but ‘x.i’ is +not, since ‘MyClass.i’ is not. But ‘x.f’ is not the same thing as +‘MyClass.f’ — it is a `method object', not a function object. + + +File: python.info, Node: Method Objects, Next: Class and Instance Variables, Prev: Instance Objects, Up: A First Look at Classes + +2.9.3.4 Method Objects +...................... + +Usually, a method is called right after it is bound: + + x.f() + +In the ‘MyClass’ example, this will return the string ‘'hello world'’. +However, it is not necessary to call a method right away: ‘x.f’ is a +method object, and can be stored away and called at a later time. For +example: + + xf = x.f + while True: + print(xf()) + +will continue to print ‘hello world’ until the end of time. + +What exactly happens when a method is called? You may have noticed that +‘x.f()’ was called without an argument above, even though the function +definition for ‘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 ‘x.f()’ is exactly equivalent to +‘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. + +If you still don’t understand how methods work, a look at the +implementation can perhaps clarify matters. 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, a method +object is created by packing (pointers to) the instance object and the +function object just found together in an abstract object: this is the +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. + + +File: python.info, Node: Class and Instance Variables, Prev: Method Objects, Up: A First Look at Classes + +2.9.3.5 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: + + 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' + +As discussed in *note A Word About Names and Objects: 16eb, shared data +can have possibly surprising effects with involving *note mutable: 164f. +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: + + 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'] + +Correct design of the class should use an instance variable instead: + + 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'] + + +File: python.info, Node: Random Remarks, Next: Inheritance, Prev: A First Look at Classes, Up: Classes + +2.9.4 Random Remarks +-------------------- + +If the same attribute name occurs in both an instance and in a class, +then attribute lookup prioritizes the instance: + + >>> 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 + +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 ‘self’. This is nothing +more than a convention: the name ‘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: + + # 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 + +Now ‘f’, ‘g’ and ‘h’ are all attributes of class ‘C’ that refer to +function objects, and consequently they are all methods of instances of +‘C’ — ‘h’ being exactly equivalent to ‘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 ‘self’ +argument: + + 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) + +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 ‘object.__class__’. + + +File: python.info, Node: Inheritance, Next: Private Variables, Prev: Random Remarks, Up: Classes + +2.9.5 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: + + class DerivedClassName(BaseClassName): + + . + . + . + + +The name ‘BaseClassName’ must be defined in a 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: + + class DerivedClassName(modname.BaseClassName): + +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: +‘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 ‘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 +‘BaseClassName.methodname(self, arguments)’. This is occasionally +useful to clients as well. (Note that this only works if the base class +is accessible as ‘BaseClassName’ in the global scope.) + +Python has two built-in functions that work with inheritance: + + * Use *note isinstance(): 3ab. to check an instance’s type: + ‘isinstance(obj, int)’ will be ‘True’ only if ‘obj.__class__’ is + *note int: 1c7. or some class derived from *note int: 1c7. + + * Use *note issubclass(): 3ac. to check class inheritance: + ‘issubclass(bool, int)’ is ‘True’ since *note bool: 463. is a + subclass of *note int: 1c7. However, ‘issubclass(float, int)’ is + ‘False’ since *note float: 3ca. is not a subclass of *note int: + 1c7. + +* Menu: + +* Multiple Inheritance:: + + +File: python.info, Node: Multiple Inheritance, Up: Inheritance + +2.9.5.1 Multiple Inheritance +............................ + +Python supports a form of multiple inheritance as well. A class +definition with multiple base classes looks like this: + + class DerivedClassName(Base1, Base2, Base3): + + . + . + . + + +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 +‘DerivedClassName’, it is searched for in ‘Base1’, then (recursively) in +the base classes of ‘Base1’, and if it was not found there, it was +searched for in ‘Base2’, and so on. + +In fact, it is slightly more complex than that; the method resolution +order changes dynamically to support cooperative calls to *note super(): +8b7. 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 *note object: +6df, so any case of multiple inheritance provides more than one path to +reach *note object: 6df. 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 ‘https://www.python.org/download/releases/2.3/mro/’. + + +File: python.info, Node: Private Variables, Next: Odds and Ends, Prev: Inheritance, Up: Classes + +2.9.6 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. +‘_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. + +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 ‘__spam’ (at least two leading underscores, at +most one trailing underscore) is textually replaced with +‘_classname__spam’, where ‘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. + +Name mangling is helpful for letting subclasses override methods without +breaking intraclass method calls. For 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) + +The above example would work even if ‘MappingSubclass’ were to introduce +a ‘__update’ identifier since it is replaced with ‘_Mapping__update’ in +the ‘Mapping’ class and ‘_MappingSubclass__update’ in the +‘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 ‘exec()’ or ‘eval()’ does not consider the +classname of the invoking class to be the current class; this is similar +to the effect of the ‘global’ statement, the effect of which is likewise +restricted to code that is byte-compiled together. The same restriction +applies to ‘getattr()’, ‘setattr()’ and ‘delattr()’, as well as when +referencing ‘__dict__’ directly. + + +File: python.info, Node: Odds and Ends, Next: Iterators, Prev: Private Variables, Up: Classes + +2.9.7 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. An +empty class definition will do nicely: + + class Employee: + pass + + john = Employee() # Create an empty employee record + + # Fill the fields of the record + john.name = 'John Doe' + john.dept = 'computer lab' + john.salary = 1000 + +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 ‘read()’ and +‘readline()’ that get the data from a string buffer instead, and pass it +as an argument. + +Instance method objects have attributes, too: ‘m.__self__’ is the +instance object with the method ‘m()’, and ‘m.__func__’ is the function +object corresponding to the method. + + +File: python.info, Node: Iterators, Next: Generators, Prev: Odds and Ends, Up: Classes + +2.9.8 Iterators +--------------- + +By now you have probably noticed that most container objects can be +looped over using a *note for: 199. statement: + + 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='') + +This style of access is clear, concise, and convenient. The use of +iterators pervades and unifies Python. Behind the scenes, the *note +for: 199. statement calls *note iter(): 3c6. on the container object. +The function returns an iterator object that defines the method *note +__next__(): f76. which accesses elements in the container one at a time. +When there are no more elements, *note __next__(): f76. raises a *note +StopIteration: 865. exception which tells the ‘for’ loop to terminate. +You can call the *note __next__(): f76. method using the *note next(): +3c7. built-in function; this example shows how it all works: + + >>> s = 'abc' + >>> it = iter(s) + >>> it + + >>> next(it) + 'a' + >>> next(it) + 'b' + >>> next(it) + 'c' + >>> next(it) + Traceback (most recent call last): + File "", line 1, in + next(it) + StopIteration + +Having seen the mechanics behind the iterator protocol, it is easy to +add iterator behavior to your classes. Define an ‘__iter__()’ method +which returns an object with a *note __next__(): f76. method. If the +class defines ‘__next__()’, then ‘__iter__()’ can just return ‘self’: + + 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] + + >>> rev = Reverse('spam') + >>> iter(rev) + <__main__.Reverse object at 0x00A1DB50> + >>> for char in rev: + ... print(char) + ... + m + a + p + s + + +File: python.info, Node: Generators, Next: Generator Expressions, Prev: Iterators, Up: Classes + +2.9.9 Generators +---------------- + +*note Generators: d11. are a simple and powerful tool for creating +iterators. They are written like regular functions but use the *note +yield: 60d. statement whenever they want to return data. Each time +*note next(): 3c7. 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: + + def reverse(data): + for index in range(len(data)-1, -1, -1): + yield data[index] + + >>> for char in reverse('golf'): + ... print(char) + ... + f + l + o + g + +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 ‘__iter__()’ and *note __next__(): +1708. 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 +‘self.index’ and ‘self.data’. + +In addition to automatic method creation and saving program state, when +generators terminate, they automatically raise *note StopIteration: 865. +In combination, these features make it easy to create iterators with no +more effort than writing a regular function. + + +File: python.info, Node: Generator Expressions, Prev: Generators, Up: Classes + +2.9.10 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: + + >>> 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'] + + +File: python.info, Node: Brief Tour of the Standard Library, Next: Brief Tour of the Standard Library — Part II, Prev: Classes, Up: The Python Tutorial + +2.10 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:: + + +File: python.info, Node: Operating System Interface, Next: File Wildcards, Up: Brief Tour of the Standard Library + +2.10.1 Operating System Interface +--------------------------------- + +The *note os: c2. module provides dozens of functions for interacting +with the operating system: + + >>> import os + >>> os.getcwd() # Return the current working directory + 'C:\\Python311' + >>> os.chdir('/server/accesslogs') # Change current working directory + >>> os.system('mkdir today') # Run the command mkdir in the system shell + 0 + +Be sure to use the ‘import os’ style instead of ‘from os import *’. +This will keep *note os.open(): a10. from shadowing the built-in *note +open(): 30b. function which operates much differently. + +The built-in *note dir(): 20e. and *note help(): 514. functions are +useful as interactive aids for working with large modules like *note os: +c2.: + + >>> import os + >>> dir(os) + + >>> help(os) + + +For daily file and directory management tasks, the *note shutil: e6. +module provides a higher level interface that is easier to use: + + >>> import shutil + >>> shutil.copyfile('data.db', 'archive.db') + 'archive.db' + >>> shutil.move('/build/executables', 'installdir') + 'installdir' + + +File: python.info, Node: File Wildcards, Next: Command Line Arguments, Prev: Operating System Interface, Up: Brief Tour of the Standard Library + +2.10.2 File Wildcards +--------------------- + +The *note glob: 84. module provides a function for making file lists +from directory wildcard searches: + + >>> import glob + >>> glob.glob('*.py') + ['primes.py', 'random.py', 'quote.py'] + + +File: python.info, Node: Command Line Arguments, Next: Error Output Redirection and Program Termination, Prev: File Wildcards, Up: Brief Tour of the Standard Library + +2.10.3 Command Line Arguments +----------------------------- + +Common utility scripts often need to process command line arguments. +These arguments are stored in the *note sys: f9. module’s `argv' +attribute as a list. For instance the following output results from +running ‘python demo.py one two three’ at the command line: + + >>> import sys + >>> print(sys.argv) + ['demo.py', 'one', 'two', 'three'] + +The *note argparse: 5. 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: + + 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) + +When run at the command line with ‘python top.py --lines=5 alpha.txt +beta.txt’, the script sets ‘args.lines’ to ‘5’ and ‘args.filenames’ to +‘['alpha.txt', 'beta.txt']’. + + +File: python.info, Node: Error Output Redirection and Program Termination, Next: String Pattern Matching, Prev: Command Line Arguments, Up: Brief Tour of the Standard Library + +2.10.4 Error Output Redirection and Program Termination +------------------------------------------------------- + +The *note sys: f9. 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: + + >>> sys.stderr.write('Warning, log file not found starting a new one\n') + Warning, log file not found starting a new one + +The most direct way to terminate a script is to use ‘sys.exit()’. + + +File: python.info, Node: String Pattern Matching, Next: Mathematics, Prev: Error Output Redirection and Program Termination, Up: Brief Tour of the Standard Library + +2.10.5 String Pattern Matching +------------------------------ + +The *note re: da. module provides regular expression tools for advanced +string processing. For complex matching and manipulation, regular +expressions offer succinct, optimized solutions: + + >>> 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' + +When only simple capabilities are needed, string methods are preferred +because they are easier to read and debug: + + >>> 'tea for too'.replace('too', 'two') + 'tea for two' + + +File: python.info, Node: Mathematics, Next: Internet Access, Prev: String Pattern Matching, Up: Brief Tour of the Standard Library + +2.10.6 Mathematics +------------------ + +The *note math: af. module gives access to the underlying C library +functions for floating point math: + + >>> import math + >>> math.cos(math.pi / 4) + 0.70710678118654757 + >>> math.log(1024, 2) + 10.0 + +The *note random: d9. module provides tools for making random +selections: + + >>> 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 + 0.17970987693706186 + >>> random.randrange(6) # random integer chosen from range(6) + 4 + +The *note statistics: f2. module calculates basic statistical properties +(the mean, median, variance, etc.) of numeric data: + + >>> 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 + +The SciPy project <‘https://scipy.org’> has many other modules for +numerical computations. + + +File: python.info, Node: Internet Access, Next: Dates and Times, Prev: Mathematics, Up: Brief Tour of the Standard Library + +2.10.7 Internet Access +---------------------- + +There are a number of modules for accessing the internet and processing +internet protocols. Two of the simplest are *note urllib.request: 12a. +for retrieving data from URLs and *note smtplib: ea. for sending mail: + + >>> from urllib.request import urlopen + >>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response: + ... for line in response: + ... line = line.decode() # Convert bytes to a str + ... if line.startswith('datetime'): + ... print(line.rstrip()) # Remove trailing newline + ... + datetime: 2022-01-01T01:36:47.689215+00:00 + + >>> 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() + +(Note that the second example needs a mailserver running on localhost.) + + +File: python.info, Node: Dates and Times, Next: Data Compression, Prev: Internet Access, Up: Brief Tour of the Standard Library + +2.10.8 Dates and Times +---------------------- + +The *note datetime: 2f. 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. + + >>> # dates are easily constructed and formatted + >>> from datetime import date + >>> now = 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 = date(1964, 7, 31) + >>> age = now - birthday + >>> age.days + 14368 + + +File: python.info, Node: Data Compression, Next: Performance Measurement, Prev: Dates and Times, Up: Brief Tour of the Standard Library + +2.10.9 Data Compression +----------------------- + +Common data archiving and compression formats are directly supported by +modules including: *note zlib: 14f, *note gzip: 87, *note bz2: 12, *note +lzma: ab, *note zipfile: 14d. and *note tarfile: fd. + + >>> 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 + + +File: python.info, Node: Performance Measurement, Next: Quality Control, Prev: Data Compression, Up: Brief Tour of the Standard Library + +2.10.10 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 +*note timeit: 10d. module quickly demonstrates a modest performance +advantage: + + >>> 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 + +In contrast to *note timeit: 10d.’s fine level of granularity, the *note +profile: d0. and *note pstats: d1. modules provide tools for identifying +time critical sections in larger blocks of code. + + +File: python.info, Node: Quality Control, Next: Batteries Included, Prev: Performance Measurement, Up: Brief Tour of the Standard Library + +2.10.11 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 *note doctest: 63. 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: + + 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 + +The *note unittest: 125. module is not as effortless as the *note +doctest: 63. module, but it allows a more comprehensive set of tests to +be maintained in a separate file: + + 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 + + +File: python.info, Node: Batteries Included, Prev: Quality Control, Up: Brief Tour of the Standard Library + +2.10.12 Batteries Included +-------------------------- + +Python has a “batteries included” philosophy. This is best seen through +the sophisticated and robust capabilities of its larger packages. For +example: + + * The *note xmlrpc.client: 14a. and *note xmlrpc.server: 14b. modules + make implementing remote procedure calls into an almost trivial + task. Despite the modules’ names, no direct knowledge or handling + of XML is needed. + + * The *note email: 64. package is a library for managing email + messages, including MIME and other RFC 2822(1)-based message + documents. Unlike *note smtplib: ea. and *note poplib: cd. 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. + + * The *note json: a2. package provides robust support for parsing + this popular data interchange format. The *note csv: 28. 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 *note xml.etree.ElementTree: + 142, *note xml.dom: 13f. and *note xml.sax: 146. packages. + Together, these modules and packages greatly simplify data + interchange between Python applications and other tools. + + * The *note sqlite3: ef. module is a wrapper for the SQLite database + library, providing a persistent database that can be updated and + accessed using slightly nonstandard SQL syntax. + + * Internationalization is supported by a number of modules including + *note gettext: 83, *note locale: a7, and the *note codecs: 1a. + package. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2822.html + + +File: python.info, Node: Brief Tour of the Standard Library — Part II, Next: Virtual Environments and Packages, Prev: Brief Tour of the Standard Library, Up: The Python Tutorial + +2.11 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:: + + +File: python.info, Node: Output Formatting, Next: Templating, Up: Brief Tour of the Standard Library — Part II + +2.11.1 Output Formatting +------------------------ + +The *note reprlib: dc. module provides a version of *note repr(): 3ee. +customized for abbreviated displays of large or deeply nested +containers: + + >>> import reprlib + >>> reprlib.repr(set('supercalifragilisticexpialidocious')) + "{'a', 'c', 'd', 'e', 'f', 'g', ...}" + +The *note pprint: cf. 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: + + >>> import pprint + >>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta', + ... 'yellow'], 'blue']]] + ... + >>> pprint.pprint(t, width=30) + [[[['black', 'cyan'], + 'white', + ['green', 'red']], + [['magenta', 'yellow'], + 'blue']]] + +The *note textwrap: 10a. module formats paragraphs of text to fit a +given screen width: + + >>> 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. + +The *note locale: a7. 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: + + >>> 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("%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' + + +File: python.info, Node: Templating, Next: Working with Binary Data Record Layouts, Prev: Output Formatting, Up: Brief Tour of the Standard Library — Part II + +2.11.2 Templating +----------------- + +The *note string: f3. module includes a versatile *note Template: 259. +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 ‘$’ 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 ‘$$’ creates a single +escaped ‘$’: + + >>> 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.' + +The *note substitute(): 172d. method raises a *note KeyError: 6f5. 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 *note safe_substitute(): 172e. method may be more appropriate — +it will leave placeholders unchanged if data is missing: + + >>> 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.' + +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: + + >>> 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 + +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. + + +File: python.info, Node: Working with Binary Data Record Layouts, Next: Multi-threading<2>, Prev: Templating, Up: Brief Tour of the Standard Library — Part II + +2.11.3 Working with Binary Data Record Layouts +---------------------------------------------- + +The *note struct: f5. module provides *note pack(): f2f. and *note +unpack(): 1731. 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 *note zipfile: 14d. module. +Pack codes ‘"H"’ and ‘"I"’ represent two and four byte unsigned numbers +respectively. The ‘"<"’ indicates that they are standard size and in +little-endian byte order: + + 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(', Next: Logging, Prev: Working with Binary Data Record Layouts, Up: Brief Tour of the Standard Library — Part II + +2.11.4 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 *note threading: 10b. module +can run tasks in background while the main program continues to run: + + import threading, zipfile + + class AsyncZip(threading.Thread): + def __init__(self, infile, outfile): + threading.Thread.__init__(self) + self.infile = infile + self.outfile = outfile + + def run(self): + f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED) + f.write(self.infile) + f.close() + 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.') + +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 *note queue: d7. module to feed that thread with +requests from other threads. Applications using *note Queue: 101f. +objects for inter-thread communication and coordination are easier to +design, more readable, and more reliable. + + +File: python.info, Node: Logging, Next: Weak References, Prev: Multi-threading<2>, Up: Brief Tour of the Standard Library — Part II + +2.11.5 Logging +-------------- + +The *note logging: a8. module offers a full featured and flexible +logging system. At its simplest, log messages are sent to a file or to +‘sys.stderr’: + + 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') + +This produces the following output: + + WARNING:root:Warning:config file server.conf not found + ERROR:root:Error occurred + CRITICAL:root:Critical error -- shutting down + +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: ‘DEBUG’, +‘INFO’, ‘WARNING’, ‘ERROR’, and ‘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. + + +File: python.info, Node: Weak References, Next: Tools for Working with Lists, Prev: Logging, Up: Brief Tour of the Standard Library — Part II + +2.11.6 Weak References +---------------------- + +Python does automatic memory management (reference counting for most +objects and *note garbage collection: 131f. 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 *note weakref: 132. 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: + + >>> 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 "", line 1, in + d['primary'] # entry was automatically removed + File "C:/python311/lib/weakref.py", line 46, in __getitem__ + o = self.data[key]() + KeyError: 'primary' + + +File: python.info, Node: Tools for Working with Lists, Next: Decimal Floating Point Arithmetic, Prev: Weak References, Up: Brief Tour of the Standard Library — Part II + +2.11.7 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 *note array: 6. module provides an *note array(): 3d2. 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 ‘"H"’) rather than the usual +16 bytes per entry for regular lists of Python int objects: + + >>> from array import array + >>> a = array('H', [4000, 10, 700, 22222]) + >>> sum(a) + 26932 + >>> a[1:3] + array('H', [10, 700]) + +The *note collections: 1c. module provides a *note deque(): 1a9. 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: + + >>> from collections import deque + >>> d = deque(["task1", "task2", "task3"]) + >>> d.append("task4") + >>> print("Handling", d.popleft()) + Handling task1 + + 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) + +In addition to alternative list implementations, the library also offers +other tools such as the *note bisect: 10. module with functions for +manipulating sorted lists: + + >>> 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')] + +The *note heapq: 89. 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: + + >>> 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] + + +File: python.info, Node: Decimal Floating Point Arithmetic, Prev: Tools for Working with Lists, Up: Brief Tour of the Standard Library — Part II + +2.11.8 Decimal Floating Point Arithmetic +---------------------------------------- + +The *note decimal: 34. module offers a *note Decimal: 3bd. datatype for +decimal floating point arithmetic. Compared to the built-in *note +float: 3ca. implementation of binary floating point, the class is +especially helpful for + + * financial applications and other uses which require exact decimal + representation, + + * control over precision, + + * control over rounding to meet legal or regulatory requirements, + + * tracking of significant decimal places, or + + * applications where the user expects the results to match + calculations done by hand. + +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: + + >>> from decimal import * + >>> round(Decimal('0.70') * Decimal('1.05'), 2) + Decimal('0.74') + >>> round(.70 * 1.05, 2) + 0.73 + +The *note Decimal: 3bd. 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 *note Decimal: 3bd. class to perform +modulo calculations and equality tests that are unsuitable for binary +floating point: + + >>> Decimal('1.00') % Decimal('.10') + Decimal('0.00') + >>> 1.00 % 0.10 + 0.09999999999999995 + + >>> sum([Decimal('0.1')]*10) == Decimal('1.0') + True + >>> sum([0.1]*10) == 1.0 + False + +The *note decimal: 34. module provides arithmetic with as much precision +as needed: + + >>> getcontext().prec = 36 + >>> Decimal(1) / Decimal(7) + Decimal('0.142857142857142857142857142857142857') + + +File: python.info, Node: Virtual Environments and Packages, Next: What Now?, Prev: Brief Tour of the Standard Library — Part II, Up: The Python Tutorial + +2.12 Virtual Environments and Packages +====================================== + +* Menu: + +* Introduction: Introduction<4>. +* Creating Virtual Environments:: +* Managing Packages with pip:: + + +File: python.info, Node: Introduction<4>, Next: Creating Virtual Environments, Up: Virtual Environments and Packages + +2.12.1 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 *note virtual environment: +1740, 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. + + +File: python.info, Node: Creating Virtual Environments, Next: Managing Packages with pip, Prev: Introduction<4>, Up: Virtual Environments and Packages + +2.12.2 Creating Virtual Environments +------------------------------------ + +The module used to create and manage virtual environments is called +*note venv: 12f. *note venv: 12f. will usually install the most recent +version of Python that you have available. If you have multiple +versions of Python on your system, you can select a specific Python +version by running ‘python3’ or whichever version you want. + +To create a virtual environment, decide upon a directory where you want +to place it, and run the *note venv: 12f. module as a script with the +directory path: + + python3 -m venv tutorial-env + +This will create the ‘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 ‘.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 ‘.env’ environment variable definition +files that some tooling supports. + +Once you’ve created a virtual environment, you may activate it. + +On Windows, run: + + tutorial-env\Scripts\activate.bat + +On Unix or MacOS, run: + + source tutorial-env/bin/activate + +(This script is written for the bash shell. If you use the ‘csh’ or +‘fish’ shells, there are alternate ‘activate.csh’ and ‘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 ‘python’ will get you that particular version and +installation of Python. For 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 + ['', '/usr/local/lib/python35.zip', ..., + '~/envs/tutorial-env/lib/python3.5/site-packages'] + >>> + +To deactivate a virtual environment, type: + + deactivate + +into the terminal. + + +File: python.info, Node: Managing Packages with pip, Prev: Creating Virtual Environments, Up: Virtual Environments and Packages + +2.12.3 Managing Packages with pip +--------------------------------- + +You can install, upgrade, and remove packages using a program called +‘pip’. By default ‘pip’ will install packages from the Python Package +Index, <‘https://pypi.org’>. You can browse the Python Package Index by +going to it in your web browser. + +‘pip’ has a number of subcommands: “install”, “uninstall”, “freeze”, +etc. (Consult the *note Installing Python Modules: b85. guide for +complete documentation for ‘pip’.) + +You can install the latest version of a package by specifying a +package’s name: + + (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 + +You can also install a specific version of a package by giving the +package name followed by ‘==’ and the version number: + + (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 + +If you re-run this command, ‘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 ‘python -m pip install +--upgrade’ to upgrade the package to the latest version: + + (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 + +‘python -m pip uninstall’ followed by one or more package names will +remove the packages from the virtual environment. + +‘python -m pip show’ will display information about a particular +package: + + (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: + +‘python -m pip list’ will display all of the packages installed in the +virtual environment: + + (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) + +‘python -m pip freeze’ will produce a similar list of the installed +packages, but the output uses the format that ‘python -m pip install’ +expects. A common convention is to put this list in a +‘requirements.txt’ file: + + (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 + +The ‘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 ‘install -r’: + + (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 + +‘pip’ has many more options. Consult the *note Installing Python +Modules: b85. guide for complete documentation for ‘pip’. When you’ve +written a package and want to make it available on the Python Package +Index, consult the *note Distributing Python Modules: b86. guide. + + +File: python.info, Node: What Now?, Next: Interactive Input Editing and History Substitution, Prev: Virtual Environments and Packages, Up: The Python Tutorial + +2.13 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: + + * *note The Python Standard Library: 1623.: + + 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. + + * *note Installing Python Modules: b85. explains how to install + additional modules written by other Python users. + + * *note The Python Language Reference: 1624.: A detailed explanation + of Python’s syntax and semantics. It’s heavy reading, but is + useful as a complete guide to the language itself. + +More Python resources: + + * ‘https://www.python.org’: The major Python web site. It contains + code, documentation, and pointers to Python-related pages around + the web. + + * ‘https://docs.python.org’: Fast access to Python’s documentation. + + * ‘https://pypi.org’: The Python Package Index, previously also + nicknamed the Cheese Shop (1), 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. + + * ‘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.) + + * ‘https://pyvideo.org’ collects links to Python-related videos from + conferences and user-group meetings. + + * ‘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. + +For Python-related questions and problem reports, you can post to the +newsgroup ‘comp.lang.python’, or send them to the mailing list at +. 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 ‘https://mail.python.org/pipermail/’. + +Before posting, be sure to check the list of *note Frequently Asked +Questions: 1746. (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. + + ---------- Footnotes ---------- + + (1) “Cheese Shop” is a Monty Python’s sketch: a customer enters a +cheese shop, but whatever cheese he asks for, the clerk says it’s +missing. + + +File: python.info, Node: Interactive Input Editing and History Substitution, Next: Floating Point Arithmetic Issues and Limitations, Prev: What Now?, Up: The Python Tutorial + +2.14 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(1) 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:: + + ---------- Footnotes ---------- + + (1) https://tiswww.case.edu/php/chet/readline/rltop.html + + +File: python.info, Node: Tab Completion and History Editing, Next: Alternatives to the Interactive Interpreter, Up: Interactive Input Editing and History Substitution + +2.14.1 Tab Completion and History Editing +----------------------------------------- + +Completion of variable and module names is *note automatically enabled: +c6b. at interpreter startup so that the ‘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 ‘string.a’, it will evaluate the expression up to the final ‘'.'’ and +then suggest completions from the attributes of the resulting object. +Note that this may execute application-defined code if an object with a +‘__getattr__()’ method is part of the expression. The default +configuration also saves your history into a file named +‘.python_history’ in your user directory. The history will be available +again during the next interactive interpreter session. + + +File: python.info, Node: Alternatives to the Interactive Interpreter, Prev: Tab Completion and History Editing, Up: Interactive Input Editing and History Substitution + +2.14.2 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 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(1), 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(2). + + ---------- Footnotes ---------- + + (1) https://ipython.org/ + + (2) https://www.bpython-interpreter.org/ + + +File: python.info, Node: Floating Point Arithmetic Issues and Limitations, Next: Appendix, Prev: Interactive Input Editing and History Substitution, Up: The Python Tutorial + +2.15 Floating Point Arithmetic: Issues and Limitations +====================================================== + +Floating-point numbers are represented in computer hardware as base 2 +(binary) fractions. For example, the `decimal' fraction ‘0.125’ has +value 1/10 + 2/100 + 5/1000, and in the same way the `binary' fraction +‘0.001’ has value 0/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: + + 0.3 + +or, better, + + 0.33 + +or, better, + + 0.333 + +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 + + 0.0001100110011001100110011001100110011001100110011... + +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 ‘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 + + >>> 0.1 + 0.1000000000000000055511151231257827021181583404541015625 + +That is more digits than most people find useful, so Python keeps the +number of digits manageable by displaying a rounded value instead + + >>> 1 / 10 + 0.1 + +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 +‘0.1’ and ‘0.10000000000000001’ and +‘0.1000000000000000055511151231257827021181583404541015625’ are all +approximated by ‘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 ‘eval(repr(x)) == x’. + +Historically, the Python prompt and built-in *note repr(): 3ee. function +would choose the one with 17 significant digits, ‘0.10000000000000001’. +Starting with Python 3.1, Python (on most systems) is now able to choose +the shortest of these and simply display ‘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: + + >>> 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' + +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: + + >>> .1 + .1 + .1 == .3 + False + +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 *note round(): f7e. function cannot help: + + >>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1) + False + +Though the numbers cannot be made closer to their intended exact values, +the *note round(): f7e. function can be useful for post-rounding so that +results with inexact values become comparable to one another: + + >>> round(.1 + .1 + .1, 10) == round(.3, 10) + True + +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 The Perils of Floating Point(1) 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. *note str(): 1b3. usually suffices, and for finer control +see the *note str.format(): 1fc. method’s format specifiers in *note +Format String Syntax: 1021. + +For use cases which require exact decimal representation, try using the +*note decimal: 34. module which implements decimal arithmetic suitable +for accounting applications and high-precision applications. + +Another form of exact arithmetic is supported by the *note fractions: +7d. 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 +<‘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 *note +float.as_integer_ratio(): 1751. method expresses the value of a float as +a fraction: + + >>> x = 3.14159 + >>> x.as_integer_ratio() + (3537115888337719, 1125899906842624) + +Since the ratio is exact, it can be used to losslessly recreate the +original value: + + >>> x == 3537115888337719 / 1125899906842624 + True + +The *note float.hex(): 1752. method expresses a float in hexadecimal +(base 16), again giving the exact value stored by your computer: + + >>> x.hex() + '0x1.921f9f01b866ep+1' + +This precise hexadecimal representation can be used to reconstruct the +float value exactly: + + >>> x == float.fromhex('0x1.921f9f01b866ep+1') + True + +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 *note math.fsum(): 1040. function which +helps mitigate loss-of-precision during summation. It tracks “lost +digits” 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: + + >>> sum([0.1] * 10) == 1.0 + False + >>> math.fsum([0.1] * 10) == 1.0 + True + +* Menu: + +* Representation Error:: + + ---------- Footnotes ---------- + + (1) https://www.lahey.com/float.htm + + +File: python.info, Node: Representation Error, Up: Floating Point Arithmetic Issues and Limitations + +2.15.1 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. +Almost all machines today (November 2000) use IEEE-754 floating point +arithmetic, and almost all platforms map Python floats to IEEE-754 +“double precision”. 754 doubles 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 + + 1 / 10 ~= J / (2**N) + +as + + J ~= 2**N / 10 + +and recalling that `J' has exactly 53 bits (is ‘>= 2**52’ but ‘< +2**53’), the best value for `N' is 56: + + >>> 2**52 <= 2**56 // 10 < 2**53 + True + +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: + + >>> q, r = divmod(2**56, 10) + >>> r + 6 + +Since the remainder is more than half of 10, the best approximation is +obtained by rounding up: + + >>> q+1 + 7205759403792794 + +Therefore the best possible approximation to 1/10 in 754 double +precision is: + + 7205759403792794 / 2 ** 56 + +Dividing both the numerator and denominator by two reduces the fraction +to: + + 3602879701896397 / 2 ** 55 + +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 754 double approximation it can get: + + >>> 0.1 * 2 ** 55 + 3602879701896397.0 + +If we multiply that fraction by 10**55, we can see the value out to 55 +decimal digits: + + >>> 3602879701896397 * 10 ** 55 // 2 ** 55 + 1000000000000000055511151231257827021181583404541015625 + +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: + + >>> format(0.1, '.17f') + '0.10000000000000001' + +The *note fractions: 7d. and *note decimal: 34. modules make these +calculations easy: + + >>> 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' + + +File: python.info, Node: Appendix, Prev: Floating Point Arithmetic Issues and Limitations, Up: The Python Tutorial + +2.16 Appendix +============= + +* Menu: + +* Interactive Mode: Interactive Mode<2>. + + +File: python.info, Node: Interactive Mode<2>, Up: Appendix + +2.16.1 Interactive Mode +----------------------- + +* Menu: + +* Error Handling:: +* Executable Python Scripts:: +* The Interactive Startup File:: +* The Customization Modules:: + + +File: python.info, Node: Error Handling, Next: Executable Python Scripts, Up: Interactive Mode<2> + +2.16.1.1 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 *note except: +17a. clause in a *note try: 1073. statement are not errors in this +context.) Some errors are unconditionally fatal and cause an exit with +a nonzero exit; 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 ‘Control-C’ or ‘Delete’) to the +primary or secondary prompt cancels the input and returns to the primary +prompt. (1) Typing an interrupt while a command is executing raises +the *note KeyboardInterrupt: 611. exception, which may be handled by a +*note try: 1073. statement. + + ---------- Footnotes ---------- + + (1) A problem with the GNU Readline package may prevent this. + + +File: python.info, Node: Executable Python Scripts, Next: The Interactive Startup File, Prev: Error Handling, Up: Interactive Mode<2> + +2.16.1.2 Executable Python Scripts +.................................. + +On BSD’ish Unix systems, Python scripts can be made directly executable, +like shell scripts, by putting the line + + #!/usr/bin/env python3.5 + +(assuming that the interpreter is on the user’s ‘PATH’) at the beginning +of the script and giving the file an executable mode. The ‘#!’ must be +the first two characters of the file. On some platforms, this first +line must end with a Unix-style line ending (‘'\n'’), not a Windows +(‘'\r\n'’) line ending. Note that the hash, or pound, character, ‘'#'’, +is used to start a comment in Python. + +The script can be given an executable mode, or permission, using the +‘chmod’ command. + + $ chmod +x myscript.py + +On Windows systems, there is no notion of an “executable mode”. The +Python installer automatically associates ‘.py’ files with ‘python.exe’ +so that a double-click on a Python file will run it as a script. The +extension can also be ‘.pyw’, in that case, the console window that +normally appears is suppressed. + + +File: python.info, Node: The Interactive Startup File, Next: The Customization Modules, Prev: Executable Python Scripts, Up: Interactive Mode<2> + +2.16.1.3 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 *note +PYTHONSTARTUP: c6a. to the name of a file containing your start-up +commands. This is similar to the ‘.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 ‘/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 ‘sys.ps1’ and ‘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 ‘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: + + 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) + + +File: python.info, Node: The Customization Modules, Prev: The Interactive Startup File, Up: Interactive Mode<2> + +2.16.1.4 The Customization Modules +.................................. + +Python provides two hooks to let you customize it: ‘sitecustomize’ and +‘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: + + >>> import site + >>> site.getusersitepackages() + '/home/user/.local/lib/python3.5/site-packages' + +Now you can create a file named ‘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 *note -s: 101c. option to disable the +automatic import. + +‘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 ‘usercustomize’. See the documentation of the *note +site: e8. module for more details. + + +File: python.info, Node: Python Setup and Usage, Next: The Python Language Reference, Prev: The Python Tutorial, Up: Top + +3 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. + +* Menu: + +* Command line and environment:: +* Using Python on Unix platforms:: +* Configure Python:: +* Using Python on Windows:: +* Using Python on a Mac:: +* Editors and IDEs:: + + +File: python.info, Node: Command line and environment, Next: Using Python on Unix platforms, Up: Python Setup and Usage + +3.1 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 *note Alternate Implementations: 1765. for +further resources. + +* Menu: + +* Command line:: +* Environment variables:: + + +File: python.info, Node: Command line, Next: Environment variables, Up: Command line and environment + +3.1.1 Command line +------------------ + +When invoking Python, you may specify any of these options: + + python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args] + +The most common use case is, of course, a simple invocation of a script: + + python myscript.py + +* Menu: + +* Interface options:: +* Generic options:: +* Miscellaneous options:: +* Options you shouldn’t use:: + + +File: python.info, Node: Interface options, Next: Generic options, Up: Command line + +3.1.1.1 Interface options +......................... + +The interpreter interface resembles that of the UNIX shell, but provides +some additional methods of invocation: + + * 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 ‘Ctrl-D’ on UNIX or ‘Ctrl-Z, + Enter’ on Windows) is read. + + * When called with a file name argument or with a file as standard + input, it reads and executes a script from that file. + + * When called with a directory name argument, it reads and executes + an appropriately named script from that directory. + + * When called with ‘-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! + + * When called with ‘-m module-name’, the given module is located on + the Python module path and executed as a script. + +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 *note sys.argv: +f1f. – note that the first element, subscript zero (‘sys.argv[0]’), is a +string reflecting the program’s source. + + -- Program Option: -c + + 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 *note sys.argv: f1f. + will be ‘"-c"’ and the current directory will be added to the start + of *note sys.path: 162. (allowing modules in that directory to be + imported as top level modules). + + Raises an *note auditing event: 12c0. ‘cpython.run_command’ with + argument ‘command’. + + -- Program Option: -m + + Search *note sys.path: 162. for the named module and execute its + contents as the *note __main__: 1. module. + + Since the argument is a `module' name, you must not give a file + extension (‘.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 ‘.__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. + + 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. + + If this option is given, the first element of *note sys.argv: f1f. + will be the full path to the module file (while the module file is + being located, the first element will be set to ‘"-m"’). As with + the *note -c: 1ad. option, the current directory will be added to + the start of *note sys.path: 162. + + *note -I: 5b0. option can be used to run the script in isolated + mode where *note sys.path: 162. contains neither the current + directory nor the user’s site-packages directory. All ‘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 *note timeit: 10d. + module: + + python -m timeit -s 'setup here' 'benchmarked code here' + python -m timeit -h # for details + + Raises an *note auditing event: 12c0. ‘cpython.run_module’ with + argument ‘module-name’. + + See also + ........ + + *note runpy.run_module(): 11f2. + + Equivalent functionality directly available to Python code + + PEP 338(1) – Executing modules as scripts + + Changed in version 3.1: Supply the package name to run a ‘__main__’ + submodule. + + Changed in version 3.4: namespace packages are also supported + + -- Describe: - + + Read commands from standard input (*note sys.stdin: 729.). If + standard input is a terminal, *note -i: 111d. is implied. + + If this option is given, the first element of *note sys.argv: f1f. + will be ‘"-"’ and the current directory will be added to the start + of *note sys.path: 162. + + Raises an *note auditing event: 12c0. ‘cpython.run_stdin’ with no + arguments. + + -- Describe: ’ and + ‘’). + + -- Method: HTMLParser.handle_entityref (name) + + This method is called to process a named character reference of the + form ‘&name;’ (e.g. ‘>’), where `name' is a general entity + reference (e.g. ‘'gt'’). This method is never called if + `convert_charrefs' is ‘True’. + + -- Method: HTMLParser.handle_charref (name) + + This method is called to process decimal and hexadecimal numeric + character references of the form ‘&#NNN;’ and ‘&#xNNN;’. For + example, the decimal equivalent for ‘>’ is ‘>’, whereas the + hexadecimal is ‘>’; in this case the method will receive + ‘'62'’ or ‘'x3E'’. This method is never called if + `convert_charrefs' is ‘True’. + + -- Method: HTMLParser.handle_comment (data) + + This method is called when a comment is encountered (e.g. + ‘’). + + For example, the comment ‘’ will cause this method + to be called with the argument ‘' comment '’. + + The content of Internet Explorer conditional comments (condcoms) + will also be sent to this method, so, for ‘’, this method will receive + ‘'[if IE 9]>IE9-specific content’). + + The `decl' parameter will be the entire contents of the declaration + inside the ‘’ markup (e.g. ‘'DOCTYPE html'’). + + -- 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 ‘’, + this method would be called as ‘handle_pi("proc color='red'")’. It + is intended to be overridden by a derived class; the base class + implementation does nothing. + + Note: The *note HTMLParser: 499. class uses the SGML syntactic + rules for processing instructions. An XHTML processing + instruction using the trailing ‘'?'’ will cause the ‘'?'’ to + be included in `data'. + + -- 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 ‘’ markup. It is sometimes useful to be + overridden by a derived class. The base class implementation does + nothing. + + +File: python.info, Node: Examples<23>, Prev: HTMLParser Methods, Up: html parser — Simple HTML and XHTML parser + +5.20.2.3 Examples +................. + +The following class implements a parser that will be used to illustrate +more examples: + + 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() + +Parsing a doctype: + + >>> parser.feed('') + Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" + +Parsing an element with a few attributes and a title: + + >>> parser.feed('The Python logo') + Start tag: img + attr: ('src', 'python-logo.png') + attr: ('alt', 'The Python logo') + >>> + >>> parser.feed('

Python

') + Start tag: h1 + Data : Python + End tag : h1 + +The content of ‘script’ and ‘style’ elements is returned as is, without +further parsing: + + >>> parser.feed('') + Start tag: style + attr: ('type', 'text/css') + Data : #python { color: green } + End tag : style + + >>> parser.feed('') + Start tag: script + attr: ('type', 'text/javascript') + Data : alert("hello!"); + End tag : script + +Parsing comments: + + >>> parser.feed('' + ... '') + Comment : a comment + Comment : [if IE 9]>IE-specific content'’): + + >>> parser.feed('>>>') + Named ent: > + Num ent : > + Num ent : > + +Feeding incomplete chunks to *note feed(): 2f9e. works, but *note +handle_data(): 2fa6. might be called more than once (unless +`convert_charrefs' is set to ‘True’): + + >>> for chunk in ['buff', 'ered ', 'text']: + ... parser.feed(chunk) + ... + Start tag: span + Data : buff + Data : ered + Data : text + End tag : span + +Parsing invalid HTML (e.g. unquoted attributes) also works: + + >>> parser.feed('

tag soup

') + Start tag: p + Start tag: a + attr: ('class', 'link') + attr: ('href', '#main') + Data : tag soup + End tag : p + End tag : a + + +File: python.info, Node: html entities — Definitions of HTML general entities, Next: XML Processing Modules, Prev: html parser — Simple HTML and XHTML parser, Up: Structured Markup Processing Tools + +5.20.3 ‘html.entities’ — Definitions of HTML general entities +------------------------------------------------------------- + +`Source code:' Lib/html/entities.py(1) + +__________________________________________________________________ + +This module defines four dictionaries, *note html5: d7d, *note +name2codepoint: 2fb1, *note codepoint2name: 2fb2, and *note entitydefs: +2fb3. + + -- Data: html.entities.html5 + + A dictionary that maps HTML5 named character references (2) to the + equivalent Unicode character(s), e.g. ‘html5['gt;'] == '>'’. Note + that the trailing semicolon is included in the name (e.g. + ‘'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 ‘';'’. See also *note html.unescape(): 5a9. + + New in version 3.3. + + -- Data: html.entities.entitydefs + + A dictionary mapping XHTML 1.0 entity definitions to their + replacement text in ISO Latin-1. + + -- Data: html.entities.name2codepoint + + A dictionary that maps HTML entity names to the Unicode code + points. + + -- Data: html.entities.codepoint2name + + A dictionary that maps Unicode code points to HTML entity names. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/html/entities.py + + (2) See +‘https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references’ + + +File: python.info, Node: XML Processing Modules, Next: xml etree ElementTree — The ElementTree XML API, Prev: html entities — Definitions of HTML general entities, Up: Structured Markup Processing Tools + +5.20.4 XML Processing Modules +----------------------------- + +`Source code:' Lib/xml/(1) + +__________________________________________________________________ + +Python’s interfaces for processing XML are grouped in the ‘xml’ package. + + Warning: The XML modules are not secure against erroneous or + maliciously constructed data. If you need to parse untrusted or + unauthenticated data see the *note XML vulnerabilities: 2fb7. and + *note The defusedxml Package: 2fb8. sections. + +It is important to note that modules in the *note xml: 13e. package +require that there be at least one SAX-compliant XML parser available. +The Expat parser is included with Python, so the *note +xml.parsers.expat: 143. module will always be available. + +The documentation for the *note xml.dom: 13f. and *note xml.sax: 146. +packages are the definition of the Python bindings for the DOM and SAX +interfaces. + +The XML handling submodules are: + + * *note xml.etree.ElementTree: 142.: the ElementTree API, a simple + and lightweight XML processor + + * *note xml.dom: 13f.: the DOM API definition + + * *note xml.dom.minidom: 140.: a minimal DOM implementation + + * *note xml.dom.pulldom: 141.: support for building partial DOM trees + + * *note xml.sax: 146.: SAX2 base classes and convenience functions + + * *note xml.parsers.expat: 143.: the Expat parser binding + +* Menu: + +* XML vulnerabilities:: +* The defusedxml Package:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/xml/ + + +File: python.info, Node: XML vulnerabilities, Next: The defusedxml Package, Up: XML Processing Modules + +5.20.4.1 XML vulnerabilities +............................ + +The XML processing modules are not secure against maliciously +constructed data. 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. + +The following table gives an overview of the known attacks and whether +the various modules are vulnerable to them. + +kind sax etree minidom pulldom xmlrpc + +------------------------------------------------------------------------------------------------------------------------------------------------- + +billion laughs `Vulnerable' (1) `Vulnerable' (1) `Vulnerable' (1) `Vulnerable' (1) `Vulnerable' (1) + + +quadratic blowup `Vulnerable' (1) `Vulnerable' (1) `Vulnerable' (1) `Vulnerable' (1) `Vulnerable' (1) + + +external entity expansion Safe (5) Safe (2) Safe (3) Safe (5) Safe (4) + + +DTD(1) retrieval Safe (5) Safe Safe Safe (5) Safe + + +decompression bomb Safe Safe Safe Safe `Vulnerable' + + + 1. Expat 2.4.1 and newer is not vulnerable to the “billion laughs” and + “quadratic blowup” vulnerabilities. Items still listed as + vulnerable due to potential reliance on system-provided libraries. + Check ‘pyexpat.EXPAT_VERSION’. + + 2. *note xml.etree.ElementTree: 142. doesn’t expand external entities + and raises a ‘ParserError’ when an entity occurs. + + 3. *note xml.dom.minidom: 140. doesn’t expand external entities and + simply returns the unexpanded entity verbatim. + + 4. ‘xmlrpclib’ doesn’t expand external entities and omits them. + + 5. Since Python 3.7.1, external general entities are no longer + processed by default. + +billion laughs / exponential entity expansion + + The Billion Laughs(2) 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. + +quadratic blowup entity expansion + + A quadratic blowup attack is similar to a Billion Laughs(3) 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. + +external entity expansion + + Entity declarations can contain more than just text for + replacement. They can also point to external resources or local + files. The XML parser accesses the resource and embeds the content + into the XML document. + +DTD(4) retrieval + + Some XML libraries like Python’s *note xml.dom.pulldom: 141. + retrieve document type definitions from remote or local locations. + The feature has similar implications as the external entity + expansion issue. + +decompression bomb + + Decompression bombs (aka ZIP bomb(5)) 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. + +The documentation for defusedxml(6) on PyPI has further information +about all known attack vectors with examples and references. + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Document_type_definition + + (2) https://en.wikipedia.org/wiki/Billion_laughs + + (3) https://en.wikipedia.org/wiki/Billion_laughs + + (4) https://en.wikipedia.org/wiki/Document_type_definition + + (5) https://en.wikipedia.org/wiki/Zip_bomb + + (6) https://pypi.org/project/defusedxml/ + + +File: python.info, Node: The defusedxml Package, Prev: XML vulnerabilities, Up: XML Processing Modules + +5.20.4.2 The ‘defusedxml’ Package +................................. + +defusedxml(1) is a pure Python package with modified subclasses of all +stdlib XML parsers that prevent any potentially malicious operation. +Use of this package is recommended for any server code that parses +untrusted XML data. The package also ships with example exploits and +extended documentation on more XML exploits such as XPath injection. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/defusedxml/ + + +File: python.info, Node: xml etree ElementTree — The ElementTree XML API, Next: xml dom — The Document Object Model API, Prev: XML Processing Modules, Up: Structured Markup Processing Tools + +5.20.5 ‘xml.etree.ElementTree’ — The ElementTree XML API +-------------------------------------------------------- + +`Source code:' Lib/xml/etree/ElementTree.py(1) + +__________________________________________________________________ + +The *note xml.etree.ElementTree: 142. 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 ‘xml.etree.cElementTree’ module is +deprecated. + + Warning: The *note xml.etree.ElementTree: 142. module is not secure + against maliciously constructed data. If you need to parse + untrusted or unauthenticated data see *note XML vulnerabilities: + 2fb7. + +* Menu: + +* Tutorial: Tutorial<2>. +* XPath support:: +* Reference: Reference<3>. +* XInclude support:: +* Reference: Reference<4>. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/etree/ElementTree.py + + +File: python.info, Node: Tutorial<2>, Next: XPath support, Up: xml etree ElementTree — The ElementTree XML API + +5.20.5.1 Tutorial +................. + +This is a short tutorial for using *note xml.etree.ElementTree: 142. +(‘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:: + + +File: python.info, Node: XML tree and elements, Next: Parsing XML, Up: Tutorial<2> + +5.20.5.2 XML tree and elements +.............................. + +XML is an inherently hierarchical data format, and the most natural way +to represent it is with a tree. ‘ET’ has two classes for this purpose - +*note ElementTree: 59d. represents the whole XML document as a tree, and +*note Element: 59e. represents a single node in this tree. Interactions +with the whole document (reading and writing to/from files) are usually +done on the *note ElementTree: 59d. level. Interactions with a single +XML element and its sub-elements are done on the *note Element: 59e. +level. + + +File: python.info, Node: Parsing XML, Next: Pull API for non-blocking parsing, Prev: XML tree and elements, Up: Tutorial<2> + +5.20.5.3 Parsing XML +.................... + +We’ll be using the following XML document as the sample data for this +section: + + + + + 1 + 2008 + 141100 + + + + + 4 + 2011 + 59900 + + + + 68 + 2011 + 13600 + + + + + +We can import this data by reading from a file: + + import xml.etree.ElementTree as ET + tree = ET.parse('country_data.xml') + root = tree.getroot() + +Or directly from a string: + + root = ET.fromstring(country_data_as_string) + +*note fromstring(): 2fc2. parses XML from a string directly into an +*note Element: 59e, which is the root element of the parsed tree. Other +parsing functions may create an *note ElementTree: 59d. Check the +documentation to be sure. + +As an *note Element: 59e, ‘root’ has a tag and a dictionary of +attributes: + + >>> root.tag + 'data' + >>> root.attrib + {} + +It also has children nodes over which we can iterate: + + >>> for child in root: + ... print(child.tag, child.attrib) + ... + country {'name': 'Liechtenstein'} + country {'name': 'Singapore'} + country {'name': 'Panama'} + +Children are nested, and we can access specific child nodes by index: + + >>> root[0][1].text + '2008' + + 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 *note TreeBuilder: 6a4. instance to the *note XMLParser: + 6a3. constructor. + + +File: python.info, Node: Pull API for non-blocking parsing, Next: Finding interesting elements, Prev: Parsing XML, Up: Tutorial<2> + +5.20.5.4 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 *note XMLParser: 6a3. 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 *note +Element: 59e. objects. + +The most powerful tool for doing this is *note XMLPullParser: c95. It +does not require a blocking read to obtain the XML data, and is instead +fed with data incrementally with *note XMLPullParser.feed(): 2fc4. +calls. To get the parsed XML elements, call *note +XMLPullParser.read_events(): 2fc5. Here is an example: + + >>> parser = ET.XMLPullParser(['start', 'end']) + >>> parser.feed('sometext') + >>> list(parser.read_events()) + [('start', )] + >>> parser.feed(' more text') + >>> for event, elem in parser.read_events(): + ... print(event) + ... print(elem.tag, 'text=', elem.text) + ... + end + +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, *note XMLPullParser: c95. 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 *note iterparse(): cbd. It can be +useful when you’re reading a large XML document and don’t want to hold +it wholly in memory. + + +File: python.info, Node: Finding interesting elements, Next: Modifying an XML File, Prev: Pull API for non-blocking parsing, Up: Tutorial<2> + +5.20.5.5 Finding interesting elements +..................................... + +*note Element: 59e. has some useful methods that help iterate +recursively over all the sub-tree below it (its children, their +children, and so on). For example, *note Element.iter(): ff1.: + + >>> 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'} + +*note Element.findall(): 2fc7. finds only elements with a tag which are +direct children of the current element. *note Element.find(): 2fc8. +finds the `first' child with a particular tag, and *note Element.text: +2fc9. accesses the element’s text content. *note Element.get(): 2fca. +accesses the element’s attributes: + + >>> for country in root.findall('country'): + ... rank = country.find('rank').text + ... name = country.get('name') + ... print(name, rank) + ... + Liechtenstein 1 + Singapore 4 + Panama 68 + +More sophisticated specification of which elements to look for is +possible by using *note XPath: 810. + + +File: python.info, Node: Modifying an XML File, Next: Building XML documents, Prev: Finding interesting elements, Up: Tutorial<2> + +5.20.5.6 Modifying an XML File +.............................. + +*note ElementTree: 59d. provides a simple way to build XML documents and +write them to files. The *note ElementTree.write(): c99. method serves +this purpose. + +Once created, an *note Element: 59e. object may be manipulated by +directly changing its fields (such as *note Element.text: 2fc9.), adding +and modifying attributes (*note Element.set(): 2fcc. method), as well as +adding new children (for example with *note Element.append(): 2fcd.). + +Let’s say we want to add one to each country’s rank, and add an +‘updated’ attribute to the rank element: + + >>> 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') + +Our XML now looks like this: + + + + + 2 + 2008 + 141100 + + + + + 5 + 2011 + 59900 + + + + 69 + 2011 + 13600 + + + + + +We can remove elements using *note Element.remove(): 2fce. Let’s say we +want to remove all countries with a rank higher than 50: + + >>> 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') + +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 +‘root.findall()’, and only then iterates over the list of matches. + +Our XML now looks like this: + + + + + 2 + 2008 + 141100 + + + + + 5 + 2011 + 59900 + + + + + +File: python.info, Node: Building XML documents, Next: Parsing XML with Namespaces, Prev: Modifying an XML File, Up: Tutorial<2> + +5.20.5.7 Building XML documents +............................... + +The *note SubElement(): 2fd0. function also provides a convenient way to +create new sub-elements for a given element: + + >>> a = ET.Element('a') + >>> b = ET.SubElement(a, 'b') + >>> c = ET.SubElement(a, 'c') + >>> d = ET.SubElement(c, 'd') + >>> ET.dump(a) + + + +File: python.info, Node: Parsing XML with Namespaces, Prev: Building XML documents, Up: Tutorial<2> + +5.20.5.8 Parsing XML with Namespaces +.................................... + +If the XML input has namespaces(1), tags and attributes with prefixes in +the form ‘prefix:sometag’ get expanded to ‘{uri}sometag’ where the +`prefix' is replaced by the full `URI'. Also, if there is a default +namespace(2), 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: + + + + + John Cleese + Lancelot + Archie Leach + + + Eric Idle + Sir Robin + Gunther + Commander Clement + + + +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 *note find(): 2fc8. or +*note findall(): 2fc7.: + + 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) + +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: + + 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) + +These two approaches both output: + + John Cleese + |--> Lancelot + |--> Archie Leach + Eric Idle + |--> Sir Robin + |--> Gunther + |--> Commander Clement + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/XML_namespace + + (2) https://www.w3.org/TR/xml-names/#defaulting + + +File: python.info, Node: XPath support, Next: Reference<3>, Prev: Tutorial<2>, Up: xml etree ElementTree — The ElementTree XML API + +5.20.5.9 XPath support +...................... + +This module provides limited support for XPath expressions(1) 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<9>. +* Supported XPath syntax:: + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/xpath + + +File: python.info, Node: Example<9>, Next: Supported XPath syntax, Up: XPath support + +5.20.5.10 Example +................. + +Here’s an example that demonstrates some of the XPath capabilities of +the module. We’ll be using the ‘countrydata’ XML document from the +*note Parsing XML: 2fc0. section: + + 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]") + +For XML with namespaces, use the usual qualified ‘{namespace}tag’ +notation: + + # All dublin-core "title" tags in the document + root.findall(".//{http://purl.org/dc/elements/1.1/}title") + + +File: python.info, Node: Supported XPath syntax, Prev: Example<9>, Up: XPath support + +5.20.5.11 Supported XPath syntax +................................ + +Syntax Meaning + +--------------------------------------------------------------------------------------- + +‘tag’ Selects all child elements with the given tag. For + example, ‘spam’ selects all child elements named ‘spam’, + and ‘spam/egg’ selects all grandchildren named ‘egg’ in + all children named ‘spam’. ‘{namespace}*’ selects all + tags in the given namespace, ‘{*}spam’ selects tags + named ‘spam’ in any (or no) namespace, and ‘{}*’ only + selects tags that are not in a namespace. + + Changed in version 3.8: Support for star-wildcards was + added. + + +‘*’ Selects all child elements, including comments and + processing instructions. For example, ‘*/egg’ selects + all grandchildren named ‘egg’. + + +‘.’ Selects the current node. This is mostly useful at the + beginning of the path, to indicate that it’s a relative + path. + + +‘//’ Selects all subelements, on all levels beneath the + current element. For example, ‘.//egg’ selects all + ‘egg’ elements in the entire tree. + + +‘..’ Selects the parent element. Returns ‘None’ if the path + attempts to reach the ancestors of the start element + (the element ‘find’ was called on). + + +‘[@attrib]’ Selects all elements that have the given attribute. + + +‘[@attrib='value']’ Selects all elements for which the given attribute has + the given value. The value cannot contain quotes. + + +‘[@attrib!='value']’ Selects all elements for which the given attribute does + not have the given value. The value cannot contain + quotes. + + New in version 3.10. + + +‘[tag]’ Selects all elements that have a child named ‘tag’. + Only immediate children are supported. + + +‘[.='text']’ Selects all elements whose complete text content, + including descendants, equals the given ‘text’. + + New in version 3.7. + + +‘[.!='text']’ Selects all elements whose complete text content, + including descendants, does not equal the given ‘text’. + + New in version 3.10. + + +‘[tag='text']’ Selects all elements that have a child named ‘tag’ whose + complete text content, including descendants, equals the + given ‘text’. + + +‘[tag!='text']’ Selects all elements that have a child named ‘tag’ whose + complete text content, including descendants, does not + equal the given ‘text’. + + New in version 3.10. + + +‘[position]’ Selects all elements that are located at the given + position. The position can be either an integer (1 is + the first position), the expression ‘last()’ (for the + last position), or a position relative to the last + position (e.g. ‘last()-1’). + + +Predicates (expressions within square brackets) must be preceded by a +tag name, an asterisk, or another predicate. ‘position’ predicates must +be preceded by a tag name. + + +File: python.info, Node: Reference<3>, Next: XInclude support, Prev: XPath support, Up: xml etree ElementTree — The ElementTree XML API + +5.20.5.12 Reference +................... + +* Menu: + +* Functions: Functions<8>. + + +File: python.info, Node: Functions<8>, Up: Reference<3> + +5.20.5.13 Functions +................... + + -- Function: xml.etree.ElementTree.canonicalize (xml_data=None, *, + out=None, from_file=None, **options) + + C14N 2.0(1) transformation function. + + Canonicalization is a way to normalise XML output in a way that + allows byte-by-byte comparisons and digital signatures. It reduced + 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 ‘utf-8’ encoding. + + Typical uses: + + xml_data = "..." + 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) + + The configuration `options' are as follows: + + - `with_comments': set to true to include comments (default: + false) + + - + `strip_text': set to true to strip whitespace before and after text content + + (default: false) + + - + `rewrite_prefixes': set to true to replace namespace prefixes by “n{number}” + + (default: false) + + - + `qname_aware_tags': a set of qname aware tag names in which prefixes + + should be replaced in text content (default: empty) + + - + `qname_aware_attrs': a set of qname aware attribute names in which prefixes + + should be replaced in text content (default: empty) + + - `exclude_attrs': a set of attribute names that should not be + serialised + + - `exclude_tags': a set of tag names that should not be + serialised + + In the option list above, “a set” refers to any collection or + iterable of strings, no ordering is expected. + + New in version 3.8. + + -- 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 *note XMLParser: 6a3. skips over comments in the input + instead of creating comment objects for them. An *note + ElementTree: 59d. will only contain comment nodes if they have been + inserted into to the tree using one of the *note Element: 59e. + methods. + + -- 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 *note dump(): 2fda. function now + preserves the attribute order specified by the user. + + -- Function: xml.etree.ElementTree.fromstring (text, parser=None) + + Parses an XML section from a string constant. Same as *note XML(): + 2fdb. `text' is a string containing XML data. `parser' is an + optional parser instance. If not given, the standard *note + XMLParser: 6a3. parser is used. Returns an *note Element: 59e. + instance. + + -- 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 *note XMLParser: 6a3. parser is used. Returns an + *note Element: 59e. instance. + + New in version 3.2. + + -- 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'. + + New in version 3.9. + + -- Function: xml.etree.ElementTree.iselement (element) + + Check if an object appears to be a valid element object. `element' + is an element instance. Return ‘True’ if this is an element + object. + + -- 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 + *note file object: e76. containing XML data. `events' is a + sequence of events to report back. The supported events are the + strings ‘"start"’, ‘"end"’, ‘"comment"’, ‘"pi"’, ‘"start-ns"’ and + ‘"end-ns"’ (the “ns” events are used to get detailed namespace + information). If `events' is omitted, only ‘"end"’ events are + reported. `parser' is an optional parser instance. If not given, + the standard *note XMLParser: 6a3. parser is used. `parser' must + be a subclass of *note XMLParser: 6a3. and can only use the default + *note TreeBuilder: 6a4. as a target. Returns an *note iterator: + 134f. providing ‘(event, elem)’ pairs. + + Note that while *note iterparse(): cbd. 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 *note + XMLPullParser: c95. + + Note: *note iterparse(): cbd. 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. + + Deprecated since version 3.4: The `parser' argument. + + Changed in version 3.8: The ‘comment’ and ‘pi’ events were added. + + -- 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 *note XMLParser: 6a3. parser + is used. Returns an *note ElementTree: 59d. instance. + + -- 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 *note XMLParser: 6a3. skips over processing instructions + in the input instead of creating comment objects for them. An + *note ElementTree: 59d. will only contain processing instruction + nodes if they have been inserted into to the tree using one of the + *note Element: 59e. methods. + + -- 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. + + New in version 3.2. + + -- 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. + + -- 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 *note Element: 59e. instance. + `encoding' (2) is the output encoding (default is US-ASCII). Use + ‘encoding="unicode"’ to generate a Unicode string (otherwise, a + bytestring is generated). `method' is either ‘"xml"’, ‘"html"’ or + ‘"text"’ (default is ‘"xml"’). `xml_declaration', + `default_namespace' and `short_empty_elements' has the same meaning + as in *note ElementTree.write(): c99. Returns an (optionally) + encoded string containing the XML data. + + New in version 3.4: The `short_empty_elements' parameter. + + New in version 3.8: The `xml_declaration' and `default_namespace' + parameters. + + Changed in version 3.8: The *note tostring(): c97. function now + preserves the attribute order specified by the user. + + -- 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 *note Element: 59e. instance. + `encoding' (3) is the output encoding (default is US-ASCII). Use + ‘encoding="unicode"’ to generate a Unicode string (otherwise, a + bytestring is generated). `method' is either ‘"xml"’, ‘"html"’ or + ‘"text"’ (default is ‘"xml"’). `xml_declaration', + `default_namespace' and `short_empty_elements' has the same meaning + as in *note ElementTree.write(): c99. Returns a list of + (optionally) encoded strings containing the XML data. It does not + guarantee any specific sequence, except that + ‘b"".join(tostringlist(element)) == tostring(element)’. + + New in version 3.2. + + New in version 3.4: The `short_empty_elements' parameter. + + New in version 3.8: The `xml_declaration' and `default_namespace' + parameters. + + Changed in version 3.8: The *note tostringlist(): c98. function now + preserves the attribute order specified by the user. + + -- 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 *note XMLParser: 6a3. parser is used. + Returns an *note Element: 59e. instance. + + -- 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 *note XMLParser: 6a3. parser + is used. Returns a tuple containing an *note Element: 59e. + instance and a dictionary. + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/xml-c14n2/ + + (2) The encoding string included in XML output should conform to the +appropriate standards. For example, “UTF-8” is valid, but “UTF8” is +not. See +‘https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl’ and +‘https://www.iana.org/assignments/character-sets/character-sets.xhtml’. + + (3) The encoding string included in XML output should conform to the +appropriate standards. For example, “UTF-8” is valid, but “UTF8” is +not. See +‘https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl’ and +‘https://www.iana.org/assignments/character-sets/character-sets.xhtml’. + + +File: python.info, Node: XInclude support, Next: Reference<4>, Prev: Reference<3>, Up: xml etree ElementTree — The ElementTree XML API + +5.20.5.14 XInclude support +.......................... + +This module provides limited support for XInclude directives(1), via the +‘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<10>. + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/xinclude/ + + +File: python.info, Node: Example<10>, Up: XInclude support + +5.20.5.15 Example +................. + +Here’s an example that demonstrates use of the XInclude module. To +include an XML document in the current document, use the +‘{http://www.w3.org/2001/XInclude}include’ element and set the `parse' +attribute to ‘"xml"’, and use the `href' attribute to specify the +document to include. + + + + + + +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 +*note xml.etree.ElementTree: 142. module: + + from xml.etree import ElementTree, ElementInclude + + tree = ElementTree.parse("document.xml") + root = tree.getroot() + + ElementInclude.include(root) + +The ElementInclude module replaces the +‘{http://www.w3.org/2001/XInclude}include’ element with the root element +from the `source.xml' document. The result might look something like +this: + + + This is a paragraph. + + +If the `parse' attribute is omitted, it defaults to “xml”. The href +attribute is required. + +To include a text document, use the +‘{http://www.w3.org/2001/XInclude}include’ element, and set the `parse' +attribute to “text”: + + + + Copyright (c) . + + +The result might look something like: + + + Copyright (c) 2003. + + + +File: python.info, Node: Reference<4>, Prev: XInclude support, Up: xml etree ElementTree — The ElementTree XML API + +5.20.5.16 Reference +................... + +* Menu: + +* Functions: Functions<9>. +* Element Objects:: +* ElementTree Objects:: +* QName Objects:: +* TreeBuilder Objects:: +* XMLParser Objects:: +* XMLPullParser Objects:: +* Exceptions: Exceptions<16>. + + +File: python.info, Node: Functions<9>, Next: Element Objects, Up: Reference<4> + +5.20.5.17 Functions +................... + + -- 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 ‘utf-8’. Returns the expanded resource. If the parse + mode is ‘"xml"’, this is an ElementTree instance. If the parse + mode is “text”, this is a Unicode string. If the loader fails, it + can return None or raise an exception. + + -- Function: xml.etree.ElementInclude.include (elem, loader=None, + base_url=None, max_depth=6) + + This function expands XInclude directives. `elem' is the root + element. `loader' is an optional resource loader. If omitted, it + defaults to *note default_loader(): 2fe7. If given, it should be a + callable that implements the same interface as *note + default_loader(): 2fe7. `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 a negative value to + disable the limitation. + + Returns the expanded resource. If the parse mode is ‘"xml"’, this + is an ElementTree instance. If the parse mode is “text”, this is a + Unicode string. If the loader fails, it can return None or raise + an exception. + + New in version 3.9: The `base_url' and `max_depth' parameters. + + +File: python.info, Node: Element Objects, Next: ElementTree Objects, Prev: Functions<9>, Up: Reference<4> + +5.20.5.18 Element Objects +......................... + + -- 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. + + -- Attribute: tag + + A string identifying what kind of data this element represents + (the element type, in other words). + + -- Attribute: text + -- 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 ‘None’, and the `tail' attribute holds either + the text between the element’s end tag and the next tag, or + ‘None’. For the XML data + + 1234 + + the `a' element has ‘None’ for both `text' and `tail' + attributes, the `b' element has `text' ‘"1"’ and `tail' ‘"4"’, + the `c' element has `text' ‘"2"’ and `tail' ‘None’, and the + `d' element has `text' ‘None’ and `tail' ‘"3"’. + + To collect the inner text of an element, see *note itertext(): + e87, for example ‘"".join(element.itertext())’. + + Applications may store arbitrary objects in these attributes. + + -- 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. + + The following dictionary-like methods work on the element + attributes. + + -- Method: clear () + + Resets an element. This function removes all subelements, + clears all attributes, and sets the text and tail attributes + to ‘None’. + + -- Method: get (key, default=None) + + Gets the element attribute named `key'. + + Returns the attribute value, or `default' if the attribute was + not found. + + -- Method: items () + + Returns the element attributes as a sequence of (name, value) + pairs. The attributes are returned in an arbitrary order. + + -- Method: keys () + + Returns the elements attribute names as a list. The names are + returned in an arbitrary order. + + -- Method: set (key, value) + + Set the attribute `key' on the element to `value'. + + The following methods work on the element’s children (subelements). + + -- Method: append (subelement) + + Adds the element `subelement' to the end of this element’s + internal list of subelements. Raises *note TypeError: 19c. if + `subelement' is not an *note Element: 59e. + + -- Method: extend (subelements) + + Appends `subelements' from a sequence object with zero or more + elements. Raises *note TypeError: 19c. if a subelement is not + an *note Element: 59e. + + New in version 3.2. + + -- Method: find (match, namespaces=None) + + Finds the first subelement matching `match'. `match' may be a + tag name or a *note path: 810. Returns an element instance or + ‘None’. `namespaces' is an optional mapping from namespace + prefix to full name. Pass ‘''’ as prefix to move all + unprefixed tag names in the expression into the given + namespace. + + -- Method: findall (match, namespaces=None) + + Finds all matching subelements, by tag name or *note path: + 810. Returns a list containing all matching elements in + document order. `namespaces' is an optional mapping from + namespace prefix to full name. Pass ‘''’ as prefix to move + all unprefixed tag names in the expression into the given + namespace. + + -- Method: findtext (match, default=None, namespaces=None) + + Finds text for the first subelement matching `match'. `match' + may be a tag name or a *note path: 810. 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 + ‘''’ as prefix to move all unprefixed tag names in the + expression into the given namespace. + + -- Method: insert (index, subelement) + + Inserts `subelement' at the given position in this element. + Raises *note TypeError: 19c. if `subelement' is not an *note + Element: 59e. + + -- Method: iter (tag=None) + + Creates a tree *note iterator: 134f. 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 ‘None’ or ‘'*'’, only elements whose tag equals `tag' + are returned from the iterator. If the tree structure is + modified during iteration, the result is undefined. + + New in version 3.2. + + -- Method: iterfind (match, namespaces=None) + + Finds all matching subelements, by tag name or *note path: + 810. Returns an iterable yielding all matching elements in + document order. `namespaces' is an optional mapping from + namespace prefix to full name. + + New in version 3.2. + + -- Method: itertext () + + Creates a text iterator. The iterator loops over this element + and all subelements, in document order, and returns all inner + text. + + New in version 3.2. + + -- Method: makeelement (tag, attrib) + + Creates a new element object of the same type as this element. + Do not call this method, use the *note SubElement(): 2fd0. + factory function instead. + + -- 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. + + *note Element: 59e. objects also support the following sequence + type methods for working with subelements: *note __delitem__(): + 1941, *note __getitem__(): 2fd, *note __setitem__(): 1940, *note + __len__(): 1915. + + Caution: Elements with no subelements will test as ‘False’. This + behavior will change in future versions. Use specific ‘len(elem)’ + or ‘elem is None’ test instead. + + 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") + + 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(1) + 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 *note canonicalize(): 2fd8. 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: + + 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) + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/xml-infoset/ + + +File: python.info, Node: ElementTree Objects, Next: QName Objects, Prev: Element Objects, Up: Reference<4> + +5.20.5.19 ElementTree Objects +............................. + + -- 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. + + -- 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. + + -- Method: find (match, namespaces=None) + + Same as *note Element.find(): 2fc8, starting at the root of + the tree. + + -- Method: findall (match, namespaces=None) + + Same as *note Element.findall(): 2fc7, starting at the root of + the tree. + + -- Method: findtext (match, default=None, namespaces=None) + + Same as *note Element.findtext(): 2ff1, starting at the root + of the tree. + + -- Method: getroot () + + Returns the root element for this tree. + + -- 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). + + -- Method: iterfind (match, namespaces=None) + + Same as *note Element.iterfind(): e86, starting at the root of + the tree. + + New in version 3.2. + + -- Method: parse (source, parser=None) + + Loads an external XML section into this element tree. + `source' is a file name or *note file object: e76. `parser' + is an optional parser instance. If not given, the standard + *note XMLParser: 6a3. parser is used. Returns the section + root element. + + -- 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 *note file object: e76. opened for writing. + `encoding' (1) is the output encoding (default is US-ASCII). + `xml_declaration' controls if an XML declaration should be + added to the file. Use ‘False’ for never, ‘True’ for always, + ‘None’ for only if not US-ASCII or UTF-8 or Unicode (default + is ‘None’). `default_namespace' sets the default XML + namespace (for “xmlns”). `method' is either ‘"xml"’, ‘"html"’ + or ‘"text"’ (default is ‘"xml"’). The keyword-only + `short_empty_elements' parameter controls the formatting of + elements that contain no content. If ‘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 (*note str: 1b3.) or binary + (*note bytes: 1b4.). This is controlled by the `encoding' + argument. If `encoding' is ‘"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 *note file object: + e76.; make sure you do not try to write a string to a binary + stream and vice versa. + + New in version 3.4: The `short_empty_elements' parameter. + + Changed in version 3.8: The *note write(): c99. method now + preserves the attribute order specified by the user. + +This is the XML file that is going to be manipulated: + + + + Example page + + +

Moved to example.org + or example.com.

+ + + +Example of changing the attribute “target” of every link in first +paragraph: + + >>> from xml.etree.ElementTree import ElementTree + >>> tree = ElementTree() + >>> tree.parse("index.xhtml") + + >>> p = tree.find("body/p") # Finds first occurrence of tag p in body + >>> p + + >>> links = list(p.iter("a")) # Returns list of all links + >>> links + [, ] + >>> for i in links: # Iterates through all found links + ... i.attrib["target"] = "blank" + >>> tree.write("output.xhtml") + + ---------- Footnotes ---------- + + (1) The encoding string included in XML output should conform to the +appropriate standards. For example, “UTF-8” is valid, but “UTF8” is +not. See +‘https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl’ and +‘https://www.iana.org/assignments/character-sets/character-sets.xhtml’. + + +File: python.info, Node: QName Objects, Next: TreeBuilder Objects, Prev: ElementTree Objects, Up: Reference<4> + +5.20.5.20 QName Objects +....................... + + -- 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. *note QName: 3000. + instances are opaque. + + +File: python.info, Node: TreeBuilder Objects, Next: XMLParser Objects, Prev: QName Objects, Up: Reference<4> + +5.20.5.21 TreeBuilder Objects +............................. + + -- 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 *note Comment(): 2fd9. and *note + ProcessingInstruction(): 2fdf. 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). + + -- Method: close () + + Flushes the builder buffers, and returns the toplevel document + element. Returns an *note Element: 59e. instance. + + -- Method: data (data) + + Adds text to the current element. `data' is a string. This + should be either a bytestring, or a Unicode string. + + -- Method: end (tag) + + Closes the current element. `tag' is the element name. + Returns the closed element. + + -- Method: start (tag, attrs) + + Opens a new element. `tag' is the element name. `attrs' is a + dictionary containing element attributes. Returns the opened + element. + + -- Method: comment (text) + + Creates a comment with the given `text'. If ‘insert_comments’ + is true, this will also add it to the tree. + + New in version 3.8. + + -- Method: pi (target, text) + + Creates a comment with the given `target' name and `text'. If + ‘insert_pis’ is true, this will also add it to the tree. + + New in version 3.8. + + In addition, a custom *note TreeBuilder: 6a4. object can provide + the following methods: + + -- 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 *note + TreeBuilder: 6a4. class. + + New in version 3.2. + + -- Method: start_ns (prefix, uri) + + Is called whenever the parser encounters a new namespace + declaration, before the ‘start()’ callback for the opening + element that defines it. `prefix' is ‘''’ for the default + namespace and the declared namespace prefix name otherwise. + `uri' is the namespace URI. + + New in version 3.8. + + -- Method: end_ns (prefix) + + Is called after the ‘end()’ callback of an element that + declared a namespace prefix mapping, with the name of the + `prefix' that went out of scope. + + New in version 3.8. + + -- 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(1) writer. Arguments are the same as for the *note + canonicalize(): 2fd8. function. This class does not build a tree + but translates the callback events directly into a serialised form + using the `write' function. + + New in version 3.8. + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/xml-c14n2/ + + +File: python.info, Node: XMLParser Objects, Next: XMLPullParser Objects, Prev: TreeBuilder Objects, Up: Reference<4> + +5.20.5.22 XMLParser Objects +........................... + + -- Class: xml.etree.ElementTree.XMLParser (*, target=None, + encoding=None) + + This class is the low-level building block of the module. It uses + *note xml.parsers.expat: 143. for efficient, event-based parsing of + XML. It can be fed XML data incrementally with the *note feed(): + 300c. method, and parsing events are translated to a push API - by + invoking callbacks on the `target' object. If `target' is omitted, + the standard *note TreeBuilder: 6a4. is used. If `encoding' (1) is + given, the value overrides the encoding specified in the XML file. + + Changed in version 3.8: Parameters are now *note keyword-only: 6dc. + The `html' argument no longer supported. + + -- Method: close () + + Finishes feeding data to the parser. Returns the result of + calling the ‘close()’ method of the `target' passed during + construction; by default, this is the toplevel document + element. + + -- Method: feed (data) + + Feeds data to the parser. `data' is encoded data. + + *note XMLParser.feed(): 300c. calls `target'’s ‘start(tag, + attrs_dict)’ method for each opening tag, its ‘end(tag)’ method for + each closing tag, and data is processed by method ‘data(data)’. + For further supported callback methods, see the *note TreeBuilder: + 6a4. class. *note XMLParser.close(): 300d. calls `target'’s method + ‘close()’. *note XMLParser: 6a3. can be used not only for building + a tree structure. This is an example of counting the maximum depth + of an XML file: + + >>> 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 = """ + ... + ... + ... + ... + ... + ... + ... + ... + ... + ... """ + >>> parser.feed(exampleXml) + >>> parser.close() + 4 + + ---------- Footnotes ---------- + + (1) The encoding string included in XML output should conform to the +appropriate standards. For example, “UTF-8” is valid, but “UTF8” is +not. See +‘https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl’ and +‘https://www.iana.org/assignments/character-sets/character-sets.xhtml’. + + +File: python.info, Node: XMLPullParser Objects, Next: Exceptions<16>, Prev: XMLParser Objects, Up: Reference<4> + +5.20.5.23 XMLPullParser Objects +............................... + + -- Class: xml.etree.ElementTree.XMLPullParser (events=None) + + A pull parser suitable for non-blocking applications. Its + input-side API is similar to that of *note XMLParser: 6a3, but + instead of pushing calls to a callback target, *note XMLPullParser: + c95. 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 ‘"start"’, ‘"end"’, + ‘"comment"’, ‘"pi"’, ‘"start-ns"’ and ‘"end-ns"’ (the “ns” events + are used to get detailed namespace information). If `events' is + omitted, only ‘"end"’ events are reported. + + -- Method: feed (data) + + Feed the given bytes data to the parser. + + -- Method: close () + + Signal the parser that the data stream is terminated. Unlike + *note XMLParser.close(): 300d, this method always returns + *note None: 243. Any events not yet retrieved when the parser + is closed can still be read with *note read_events(): 2fc5. + + -- Method: read_events () + + Return an iterator over the events which have been encountered + in the data fed to the parser. The iterator yields ‘(event, + elem)’ pairs, where `event' is a string representing the type + of event (e.g. ‘"end"’) and `elem' is the encountered *note + Element: 59e. object, or other context value as follows. + + * ‘start’, ‘end’: the current Element. + + * ‘comment’, ‘pi’: the current comment / processing + instruction + + * ‘start-ns’: a tuple ‘(prefix, uri)’ naming the declared + namespace mapping. + + * ‘end-ns’: *note None: 243. (this may change in a future + version) + + Events provided in a previous call to *note read_events(): + 2fc5. 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 *note read_events(): 2fc5. will have + unpredictable results. + + Note: *note XMLPullParser: c95. 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. + + New in version 3.4. + + Changed in version 3.8: The ‘comment’ and ‘pi’ events were added. + + +File: python.info, Node: Exceptions<16>, Prev: XMLPullParser Objects, Up: Reference<4> + +5.20.5.24 Exceptions +.................... + + -- 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: + + -- Attribute: code + + A numeric error code from the expat parser. See the + documentation of *note xml.parsers.expat: 143. for the list of + error codes and their meanings. + + -- Attribute: position + + A tuple of `line', `column' numbers, specifying where the + error occurred. + + +File: python.info, Node: xml dom — The Document Object Model API, Next: xml dom minidom — Minimal DOM implementation, Prev: xml etree ElementTree — The ElementTree XML API, Up: Structured Markup Processing Tools + +5.20.6 ‘xml.dom’ — The Document Object Model API +------------------------------------------------ + +`Source code:' Lib/xml/dom/__init__.py(1) + +__________________________________________________________________ + +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. + +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 ‘DOMImplementation’ +object class which provides access to ‘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 ‘Document’ object. In Python, +each DOM implementation will provide a function *note +getDOMImplementation(): 3016. 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 *note Conformance: 3017. for a +detailed discussion of mapping requirements. + +See also +........ + +Document Object Model (DOM) Level 2 Specification(2) + + The W3C recommendation upon which the Python DOM API is based. + +Document Object Model (DOM) Level 1 Specification(3) + + The W3C recommendation for the DOM supported by *note + xml.dom.minidom: 140. + +Python Language Mapping Specification(4) + + This specifies the mapping from OMG IDL to Python. + +* Menu: + +* Module Contents: Module Contents<4>. +* Objects in the DOM:: +* Conformance:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/dom/__init__.py + + (2) https://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ + + (3) https://www.w3.org/TR/REC-DOM-Level-1/ + + (4) https://www.omg.org/spec/PYTH/1.2/PDF + + +File: python.info, Node: Module Contents<4>, Next: Objects in the DOM, Up: xml dom — The Document Object Model API + +5.20.6.1 Module Contents +........................ + +The *note xml.dom: 13f. contains the following functions: + + -- Function: xml.dom.registerDOMImplementation (name, factory) + + Register the `factory' function with the name `name'. The factory + function should return an object which implements the + ‘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). + + -- 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 ‘None’. If + it is not ‘None’, imports the corresponding module and returns a + ‘DOMImplementation’ object if the import succeeds. If no name is + given, and if the environment variable ‘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 *note ImportError: 511. The features list + must be a sequence of ‘(feature, version)’ pairs which are passed + to the ‘hasFeature()’ method on available ‘DOMImplementation’ + objects. + +Some convenience constants are also provided: + + -- 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 ‘namespaceURI’ of a + node, or used as the `namespaceURI' parameter to a + namespaces-specific method. + + -- Data: xml.dom.XML_NAMESPACE + + The namespace URI associated with the reserved prefix ‘xml’, as + defined by Namespaces in XML(1) (section 4). + + -- Data: xml.dom.XMLNS_NAMESPACE + + The namespace URI for namespace declarations, as defined by + Document Object Model (DOM) Level 2 Core Specification(2) (section + 1.1.8). + + -- Data: xml.dom.XHTML_NAMESPACE + + The URI of the XHTML namespace as defined by XHTML 1.0: The + Extensible HyperText Markup Language(3) (section 3.1.1). + +In addition, *note xml.dom: 13f. contains a base ‘Node’ class and the +DOM exception classes. The ‘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 +‘Node’ class provided as part of this module does provide the constants +used for the ‘nodeType’ attribute on concrete ‘Node’ objects; they are +located within the class rather than at the module level to conform with +the DOM specifications. + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/REC-xml-names/ + + (2) https://www.w3.org/TR/DOM-Level-2-Core/core.html + + (3) https://www.w3.org/TR/xhtml1/ + + +File: python.info, Node: Objects in the DOM, Next: Conformance, Prev: Module Contents<4>, Up: xml dom — The Document Object Model API + +5.20.6.2 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. + +Interface Section Purpose + +------------------------------------------------------------------------------------------------------------------- + +‘DOMImplementation’ *note DOMImplementation Objects: 3020. Interface to the underlying + implementation. + + +‘Node’ *note Node Objects: 3021. Base interface for most objects in + a document. + + +‘NodeList’ *note NodeList Objects: 3022. Interface for a sequence of nodes. + + +‘DocumentType’ *note DocumentType Objects: 3023. Information about the declarations + needed to process a document. + + +‘Document’ *note Document Objects: 3024. Object which represents an entire + document. + + +‘Element’ *note Element Objects: 3025. Element nodes in the document + hierarchy. + + +‘Attr’ *note Attr Objects: 3026. Attribute value nodes on element + nodes. + + +‘Comment’ *note Comment Objects: 3027. Representation of comments in the + source document. + + +‘Text’ *note Text and CDATASection Objects: 3028.Nodes containing textual content + from the document. + + +‘ProcessingInstruction’ *note ProcessingInstruction Objects: 3029.Processing instruction + representation. + + +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<17>. + + +File: python.info, Node: DOMImplementation Objects, Next: Node Objects, Up: Objects in the DOM + +5.20.6.3 DOMImplementation Objects +.................................. + +The ‘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 ‘Document’ and +‘DocumentType’ objects using the ‘DOMImplementation’ as well. + + -- Method: DOMImplementation.hasFeature (feature, version) + + Return ‘True’ if the feature identified by the pair of strings + `feature' and `version' is implemented. + + -- Method: DOMImplementation.createDocument (namespaceUri, + qualifiedName, doctype) + + Return a new ‘Document’ object (the root of the DOM), with a child + ‘Element’ object having the given `namespaceUri' and + `qualifiedName'. The `doctype' must be a ‘DocumentType’ object + created by *note createDocumentType(): 302d, or ‘None’. In the + Python DOM API, the first two arguments can also be ‘None’ in order + to indicate that no ‘Element’ child is to be created. + + -- Method: DOMImplementation.createDocumentType (qualifiedName, + publicId, systemId) + + Return a new ‘DocumentType’ object that encapsulates the given + `qualifiedName', `publicId', and `systemId' strings, representing + the information contained in an XML document type declaration. + + +File: python.info, Node: Node Objects, Next: NodeList Objects, Prev: DOMImplementation Objects, Up: Objects in the DOM + +5.20.6.4 Node Objects +..................... + +All of the components of an XML document are subclasses of ‘Node’. + + -- Attribute: Node.nodeType + + An integer representing the node type. Symbolic constants for the + types are on the ‘Node’ object: ‘ELEMENT_NODE’, ‘ATTRIBUTE_NODE’, + ‘TEXT_NODE’, ‘CDATA_SECTION_NODE’, ‘ENTITY_NODE’, + ‘PROCESSING_INSTRUCTION_NODE’, ‘COMMENT_NODE’, ‘DOCUMENT_NODE’, + ‘DOCUMENT_TYPE_NODE’, ‘NOTATION_NODE’. This is a read-only + attribute. + + -- Attribute: Node.parentNode + + The parent of the current node, or ‘None’ for the document node. + The value is always a ‘Node’ object or ‘None’. For ‘Element’ + nodes, this will be the parent element, except for the root + element, in which case it will be the ‘Document’ object. For + ‘Attr’ nodes, this is always ‘None’. This is a read-only + attribute. + + -- Attribute: Node.attributes + + A ‘NamedNodeMap’ of attribute objects. Only elements have actual + values for this; others provide ‘None’ for this attribute. This is + a read-only attribute. + + -- 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 ‘None’. This is a read-only + attribute. + + -- Attribute: Node.nextSibling + + The node that immediately follows this one with the same parent. + See also *note previousSibling: 3032. If this is the last child of + the parent, this attribute will be ‘None’. This is a read-only + attribute. + + -- Attribute: Node.childNodes + + A list of nodes contained within this node. This is a read-only + attribute. + + -- Attribute: Node.firstChild + + The first child of the node, if there are any, or ‘None’. This is + a read-only attribute. + + -- Attribute: Node.lastChild + + The last child of the node, if there are any, or ‘None’. This is a + read-only attribute. + + -- Attribute: Node.localName + + The part of the ‘tagName’ following the colon if there is one, else + the entire ‘tagName’. The value is a string. + + -- Attribute: Node.prefix + + The part of the ‘tagName’ preceding the colon if there is one, else + the empty string. The value is a string, or ‘None’. + + -- Attribute: Node.namespaceURI + + The namespace associated with the element name. This will be a + string or ‘None’. This is a read-only attribute. + + -- 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 ‘tagName’ property + for elements or the ‘name’ property for attributes. For all node + types, the value of this attribute will be either a string or + ‘None’. This is a read-only attribute. + + -- 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 + *note nodeName: 303a. The value is a string or ‘None’. + + -- Method: Node.hasAttributes () + + Return ‘True’ if the node has any attributes. + + -- Method: Node.hasChildNodes () + + Return ‘True’ if the node has any child nodes. + + -- Method: Node.isSameNode (other) + + Return ‘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). + + 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). + + -- 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. + + -- 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, *note + ValueError: 1c8. is raised. `newChild' is returned. If `refChild' + is ‘None’, it inserts `newChild' at the end of the children’s list. + + -- Method: Node.removeChild (oldChild) + + Remove a child node. `oldChild' must be a child of this node; if + not, *note ValueError: 1c8. is raised. `oldChild' is returned on + success. If `oldChild' will not be used further, its ‘unlink()’ + method should be called. + + -- 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, *note ValueError: 1c8. + is raised. + + -- Method: Node.normalize () + + Join adjacent text nodes so that all stretches of text are stored + as single ‘Text’ instances. This simplifies processing text from a + DOM tree for many applications. + + -- Method: Node.cloneNode (deep) + + Clone this node. Setting `deep' means to clone all child nodes as + well. This returns the clone. + + +File: python.info, Node: NodeList Objects, Next: DocumentType Objects, Prev: Node Objects, Up: Objects in the DOM + +5.20.6.5 NodeList Objects +......................... + +A ‘NodeList’ represents a sequence of nodes. These objects are used in +two ways in the DOM Core recommendation: an ‘Element’ object provides +one as its list of child nodes, and the ‘getElementsByTagName()’ and +‘getElementsByTagNameNS()’ methods of ‘Node’ return objects with this +interface to represent query results. + +The DOM Level 2 recommendation defines one method and one attribute for +these objects: + + -- Method: NodeList.item (i) + + Return the `i'’th item from the sequence, if there is one, or + ‘None’. The index `i' is not allowed to be less than zero or + greater than or equal to the length of the sequence. + + -- Attribute: NodeList.length + + The number of nodes in the sequence. + +In addition, the Python DOM interface requires that some additional +support is provided to allow ‘NodeList’ objects to be used as Python +sequences. All ‘NodeList’ implementations must include support for +*note __len__(): 1915. and *note __getitem__(): 2fd.; this allows +iteration over the ‘NodeList’ in *note for: 199. statements and proper +support for the *note len(): 209. built-in function. + +If a DOM implementation supports modification of the document, the +‘NodeList’ implementation must also support the *note __setitem__(): +1940. and *note __delitem__(): 1941. methods. + + +File: python.info, Node: DocumentType Objects, Next: Document Objects, Prev: NodeList Objects, Up: Objects in the DOM + +5.20.6.6 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 ‘DocumentType’ object. The +‘DocumentType’ for a document is available from the ‘Document’ object’s +‘doctype’ attribute; if there is no ‘DOCTYPE’ declaration for the +document, the document’s ‘doctype’ attribute will be set to ‘None’ +instead of an instance of this interface. + +‘DocumentType’ is a specialization of ‘Node’, and adds the following +attributes: + + -- Attribute: DocumentType.publicId + + The public identifier for the external subset of the document type + definition. This will be a string or ‘None’. + + -- Attribute: DocumentType.systemId + + The system identifier for the external subset of the document type + definition. This will be a URI as a string, or ‘None’. + + -- 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 ‘None’. + + -- Attribute: DocumentType.name + + The name of the root element as given in the ‘DOCTYPE’ declaration, + if present. + + -- Attribute: DocumentType.entities + + This is a ‘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 ‘None’ if the information is not + provided by the parser, or if no entities are defined. + + -- Attribute: DocumentType.notations + + This is a ‘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 ‘None’ if the information is not + provided by the parser, or if no notations are defined. + + +File: python.info, Node: Document Objects, Next: Element Objects<2>, Prev: DocumentType Objects, Up: Objects in the DOM + +5.20.6.7 Document Objects +......................... + +A ‘Document’ represents an entire XML document, including its +constituent elements, attributes, processing instructions, comments etc. +Remember that it inherits properties from ‘Node’. + + -- Attribute: Document.documentElement + + The one and only root element of the document. + + -- 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 ‘insertBefore()’ or + ‘appendChild()’. + + -- 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 ‘insertBefore()’ or ‘appendChild()’. + + -- 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. + + -- 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. + + -- 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. + + -- 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 ‘setAttributeNode()’ on the appropriate ‘Element’ object to use + the newly created attribute instance. + + -- 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 + ‘setAttributeNode()’ on the appropriate ‘Element’ object to use the + newly created attribute instance. + + -- Method: Document.getElementsByTagName (tagName) + + Search for all descendants (direct children, children’s children, + etc.) with a particular element type name. + + -- 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. + + +File: python.info, Node: Element Objects<2>, Next: Attr Objects, Prev: Document Objects, Up: Objects in the DOM + +5.20.6.8 Element Objects +........................ + +‘Element’ is a subclass of ‘Node’, so inherits all the attributes of +that class. + + -- Attribute: Element.tagName + + The element type name. In a namespace-using document it may have + colons in it. The value is a string. + + -- Method: Element.getElementsByTagName (tagName) + + Same as equivalent method in the ‘Document’ class. + + -- Method: Element.getElementsByTagNameNS (namespaceURI, localName) + + Same as equivalent method in the ‘Document’ class. + + -- Method: Element.hasAttribute (name) + + Return ‘True’ if the element has an attribute named by `name'. + + -- Method: Element.hasAttributeNS (namespaceURI, localName) + + Return ‘True’ if the element has an attribute named by + `namespaceURI' and `localName'. + + -- 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. + + -- Method: Element.getAttributeNode (attrname) + + Return the ‘Attr’ node for the attribute named by `attrname'. + + -- 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. + + -- Method: Element.getAttributeNodeNS (namespaceURI, localName) + + Return an attribute value as a node, given a `namespaceURI' and + `localName'. + + -- Method: Element.removeAttribute (name) + + Remove an attribute by name. If there is no matching attribute, a + *note NotFoundErr: 3065. is raised. + + -- Method: Element.removeAttributeNode (oldAttr) + + Remove and return `oldAttr' from the attribute list, if present. + If `oldAttr' is not present, *note NotFoundErr: 3065. is raised. + + -- 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. + + -- Method: Element.setAttribute (name, value) + + Set an attribute value from a string. + + -- Method: Element.setAttributeNode (newAttr) + + Add a new attribute node to the element, replacing an existing + attribute if necessary if the ‘name’ attribute matches. If a + replacement occurs, the old attribute node will be returned. If + `newAttr' is already in use, *note InuseAttributeErr: 306a. will be + raised. + + -- Method: Element.setAttributeNodeNS (newAttr) + + Add a new attribute node to the element, replacing an existing + attribute if necessary if the ‘namespaceURI’ and ‘localName’ + attributes match. If a replacement occurs, the old attribute node + will be returned. If `newAttr' is already in use, *note + InuseAttributeErr: 306a. will be raised. + + -- 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. + + +File: python.info, Node: Attr Objects, Next: NamedNodeMap Objects, Prev: Element Objects<2>, Up: Objects in the DOM + +5.20.6.9 Attr Objects +..................... + +‘Attr’ inherits from ‘Node’, so inherits all its attributes. + + -- Attribute: Attr.name + + The attribute name. In a namespace-using document it may include a + colon. + + -- 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. + + -- Attribute: Attr.prefix + + The part of the name preceding the colon if there is one, else the + empty string. + + -- Attribute: Attr.value + + The text value of the attribute. This is a synonym for the + ‘nodeValue’ attribute. + + +File: python.info, Node: NamedNodeMap Objects, Next: Comment Objects, Prev: Attr Objects, Up: Objects in the DOM + +5.20.6.10 NamedNodeMap Objects +.............................. + +‘NamedNodeMap’ does `not' inherit from ‘Node’. + + -- Attribute: NamedNodeMap.length + + The length of the attribute list. + + -- 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 + ‘value’ attribute. + +There are also experimental methods that give this class more mapping +behavior. You can use them or you can use the standardized +‘getAttribute*()’ family of methods on the ‘Element’ objects. + + +File: python.info, Node: Comment Objects, Next: Text and CDATASection Objects, Prev: NamedNodeMap Objects, Up: Objects in the DOM + +5.20.6.11 Comment Objects +......................... + +‘Comment’ represents a comment in the XML document. It is a subclass of +‘Node’, but cannot have child nodes. + + -- Attribute: Comment.data + + The content of the comment as a string. The attribute contains all + characters between the leading ‘’, but + does not include them. + + +File: python.info, Node: Text and CDATASection Objects, Next: ProcessingInstruction Objects, Prev: Comment Objects, Up: Objects in the DOM + +5.20.6.12 Text and CDATASection Objects +....................................... + +The ‘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 ‘CDATASection’ +objects. These two interfaces are identical, but provide different +values for the ‘nodeType’ attribute. + +These interfaces extend the ‘Node’ interface. They cannot have child +nodes. + + -- Attribute: Text.data + + The content of the text node as a string. + + Note: The use of a ‘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 + ‘CDATASection’ nodes represent different CDATA marked sections. + + +File: python.info, Node: ProcessingInstruction Objects, Next: Exceptions<17>, Prev: Text and CDATASection Objects, Up: Objects in the DOM + +5.20.6.13 ProcessingInstruction Objects +....................................... + +Represents a processing instruction in the XML document; this inherits +from the ‘Node’ interface and cannot have child nodes. + + -- Attribute: ProcessingInstruction.target + + The content of the processing instruction up to the first + whitespace character. This is a read-only attribute. + + -- Attribute: ProcessingInstruction.data + + The content of the processing instruction following the first + whitespace character. + + +File: python.info, Node: Exceptions<17>, Prev: ProcessingInstruction Objects, Up: Objects in the DOM + +5.20.6.14 Exceptions +.................... + +The DOM Level 2 recommendation defines a single exception, *note +DOMException: 307f, and a number of constants that allow applications to +determine what sort of error occurred. *note DOMException: 307f. +instances carry a *note code: 19. 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 *note code: 19. attribute. + + -- Exception: xml.dom.DOMException + + Base exception class used for all specific DOM exceptions. This + exception class cannot be directly instantiated. + + -- 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. + + -- Exception: xml.dom.HierarchyRequestErr + + Raised when an attempt is made to insert a node where the node type + is not allowed. + + -- Exception: xml.dom.IndexSizeErr + + Raised when an index or size parameter to a method is negative or + exceeds the allowed values. + + -- Exception: xml.dom.InuseAttributeErr + + Raised when an attempt is made to insert an ‘Attr’ node that is + already present elsewhere in the document. + + -- Exception: xml.dom.InvalidAccessErr + + Raised if a parameter or an operation is not supported on the + underlying object. + + -- 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 ‘Element’ node with a space in the element type name will cause + this error to be raised. + + -- Exception: xml.dom.InvalidModificationErr + + Raised when an attempt is made to modify the type of a node. + + -- Exception: xml.dom.InvalidStateErr + + Raised when an attempt is made to use an object that is not defined + or is no longer usable. + + -- 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(1) recommendation, + this exception is raised. + + -- Exception: xml.dom.NotFoundErr + + Exception when a node does not exist in the referenced context. + For example, ‘NamedNodeMap.removeNamedItem()’ will raise this if + the node passed in does not exist in the map. + + -- Exception: xml.dom.NotSupportedErr + + Raised when the implementation does not support the requested type + of object or operation. + + -- Exception: xml.dom.NoDataAllowedErr + + This is raised if data is specified for a node which does not + support data. + + -- Exception: xml.dom.NoModificationAllowedErr + + Raised on attempts to modify an object where modifications are not + allowed (such as for read-only nodes). + + -- Exception: xml.dom.SyntaxErr + + Raised when an invalid or illegal string is specified. + + -- 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. + +The exception codes defined in the DOM recommendation map to the +exceptions described above according to this table: + +Constant Exception + +--------------------------------------------------------------------------------- + +‘DOMSTRING_SIZE_ERR’ *note DomstringSizeErr: 3080. + + +‘HIERARCHY_REQUEST_ERR’ *note HierarchyRequestErr: 3081. + + +‘INDEX_SIZE_ERR’ *note IndexSizeErr: 3082. + + +‘INUSE_ATTRIBUTE_ERR’ *note InuseAttributeErr: 306a. + + +‘INVALID_ACCESS_ERR’ *note InvalidAccessErr: 3083. + + +‘INVALID_CHARACTER_ERR’ *note InvalidCharacterErr: 3084. + + +‘INVALID_MODIFICATION_ERR’ *note InvalidModificationErr: 3085. + + +‘INVALID_STATE_ERR’ *note InvalidStateErr: 3086. + + +‘NAMESPACE_ERR’ *note NamespaceErr: 3087. + + +‘NOT_FOUND_ERR’ *note NotFoundErr: 3065. + + +‘NOT_SUPPORTED_ERR’ *note NotSupportedErr: 3088. + + +‘NO_DATA_ALLOWED_ERR’ *note NoDataAllowedErr: 3089. + + +‘NO_MODIFICATION_ALLOWED_ERR’ *note NoModificationAllowedErr: 308a. + + +‘SYNTAX_ERR’ *note SyntaxErr: 308b. + + +‘WRONG_DOCUMENT_ERR’ *note WrongDocumentErr: 308c. + + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/REC-xml-names/ + + +File: python.info, Node: Conformance, Prev: Objects in the DOM, Up: xml dom — The Document Object Model API + +5.20.6.15 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:: + + +File: python.info, Node: Type Mapping, Next: Accessor Methods, Up: Conformance + +5.20.6.16 Type Mapping +...................... + +The IDL types used in the DOM specification are mapped to Python types +according to the following table. + +IDL Type Python Type + +----------------------------------------------------------------------- + +‘boolean’ ‘bool’ or ‘int’ + + +‘int’ ‘int’ + + +‘long int’ ‘int’ + + +‘unsigned int’ ‘int’ + + +‘DOMString’ ‘str’ or ‘bytes’ + + +‘null’ ‘None’ + + + +File: python.info, Node: Accessor Methods, Prev: Type Mapping, Up: Conformance + +5.20.6.17 Accessor Methods +.......................... + +The mapping from OMG IDL to Python defines accessor functions for IDL +‘attribute’ declarations in much the way the Java mapping does. Mapping +the IDL declarations + + readonly attribute string someValue; + attribute string anotherValue; + +yields three accessor functions: a “get” method for ‘someValue’ +(‘_get_someValue()’), and “get” and “set” methods for ‘anotherValue’ +(‘_get_anotherValue()’ and ‘_set_anotherValue()’). The mapping, in +particular, does not require that the IDL attributes are accessible as +normal Python attributes: ‘object.someValue’ is `not' required to work, +and may raise an *note AttributeError: 19d. + +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 ‘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 ‘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 +‘getElementsByTagName()’, being “live”. The Python DOM API does not +require implementations to enforce such requirements. + + +File: python.info, Node: xml dom minidom — Minimal DOM implementation, Next: xml dom pulldom — Support for building partial DOM trees, Prev: xml dom — The Document Object Model API, Up: Structured Markup Processing Tools + +5.20.7 ‘xml.dom.minidom’ — Minimal DOM implementation +----------------------------------------------------- + +`Source code:' Lib/xml/dom/minidom.py(1) + +__________________________________________________________________ + +*note xml.dom.minidom: 140. 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 *note xml.etree.ElementTree: 142. module for their +XML processing instead. + + Warning: The *note xml.dom.minidom: 140. module is not secure + against maliciously constructed data. If you need to parse + untrusted or unauthenticated data see *note XML vulnerabilities: + 2fb7. + +DOM applications typically start by parsing some XML into a DOM. With +*note xml.dom.minidom: 140, this is done through the parse functions: + + 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('Some data some more data') + +The *note parse(): 3094. function can take either a filename or an open +file object. + + -- Function: xml.dom.minidom.parse (filename_or_file, parser=None, + bufsize=None) + + Return a ‘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. + +If you have XML in a string, you can use the *note parseString(): 3095. +function instead: + + -- Function: xml.dom.minidom.parseString (string, parser=None) + + Return a ‘Document’ that represents the `string'. This method + creates an *note io.StringIO: bbe. object for the string and passes + that on to *note parse(): 3094. + +Both functions return a ‘Document’ object representing the content of +the document. + +What the *note parse(): 3094. and *note parseString(): 3095. 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 name +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 ‘Document’ by calling a method on a “DOM +Implementation” object. You can get this object either by calling the +‘getDOMImplementation()’ function in the *note xml.dom: 13f. package or +the *note xml.dom.minidom: 140. module. Once you have a ‘Document’, you +can add child nodes to it to populate the DOM: + + 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) + +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 ‘documentElement’ property. It gives you the main element +in the XML document: the one that holds all others. Here is an example +program: + + dom3 = parseString("Some data") + assert dom3.documentElement.tagName == "myxml" + +When you are finished with a DOM tree, you may optionally call the +‘unlink()’ method to encourage early cleanup of the now-unneeded +objects. ‘unlink()’ is an *note xml.dom.minidom: 140.-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. + +See also +........ + +Document Object Model (DOM) Level 1 Specification(2) + + The W3C recommendation for the DOM supported by *note + xml.dom.minidom: 140. + +* Menu: + +* DOM Objects:: +* DOM Example:: +* minidom and the DOM standard:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/dom/minidom.py + + (2) https://www.w3.org/TR/REC-DOM-Level-1/ + + +File: python.info, Node: DOM Objects, Next: DOM Example, Up: xml dom minidom — Minimal DOM implementation + +5.20.7.1 DOM Objects +.................... + +The definition of the DOM API for Python is given as part of the *note +xml.dom: 13f. module documentation. This section lists the differences +between the API and *note xml.dom.minidom: 140. + + -- 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 ‘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 *note + with: 19e. statement. The following code will automatically unlink + `dom' when the ‘with’ block is exited: + + with xml.dom.minidom.parse(datasource) as dom: + ... # Work with dom. + + -- Method: Node.writexml (writer, indent='', addindent='', newl='', + encoding=None, standalone=None) + + Write XML to the writer object. The writer receives texts but not + bytes as input, it should have a ‘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 ‘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 ‘True’, ‘standalone="yes"’ is + added, otherwise it is set to ‘"no"’. Not stating the argument + will omit the declaration from the document. + + Changed in version 3.8: The *note writexml(): 3099. method now + preserves the attribute order specified by the user. + + Changed in version 3.9: The `standalone' parameter was added. + + -- 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' (1) 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 *note writexml(): + 3099. + + Changed in version 3.8: The *note toxml(): 309a. method now + preserves the attribute order specified by the user. + + Changed in version 3.9: The `standalone' parameter was added. + + -- 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 ‘\n’. + + The `encoding' argument behaves like the corresponding argument of + *note toxml(): 309a. + + The `standalone' argument behaves exactly as in *note writexml(): + 3099. + + Changed in version 3.8: The *note toprettyxml(): 309b. method now + preserves the attribute order specified by the user. + + Changed in version 3.9: The `standalone' parameter was added. + + ---------- Footnotes ---------- + + (1) 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 +‘https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl’ and +‘https://www.iana.org/assignments/character-sets/character-sets.xhtml’. + + +File: python.info, Node: DOM Example, Next: minidom and the DOM standard, Prev: DOM Objects, Up: xml dom minidom — Minimal DOM implementation + +5.20.7.2 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. + + import xml.dom.minidom + + document = """\ + + Demo slideshow + Slide title + This is a demo + Of a program for processing slides + + + Another demo slide + It is important + To have more than + one slide + + + """ + + 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 ''.join(rc) + + def handleSlideshow(slideshow): + print("") + handleSlideshowTitle(slideshow.getElementsByTagName("title")[0]) + slides = slideshow.getElementsByTagName("slide") + handleToc(slides) + handleSlides(slides) + print("") + + 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"{getText(title.childNodes)}") + + def handleSlideTitle(title): + print(f"

{getText(title.childNodes)}

") + + def handlePoints(points): + print("
    ") + for point in points: + handlePoint(point) + print("
") + + def handlePoint(point): + print(f"
  • {getText(point.childNodes)}
  • ") + + def handleToc(slides): + for slide in slides: + title = slide.getElementsByTagName("title")[0] + print(f"

    {getText(title.childNodes)}

    ") + + handleSlideshow(dom) + + +File: python.info, Node: minidom and the DOM standard, Prev: DOM Example, Up: xml dom minidom — Minimal DOM implementation + +5.20.7.3 minidom and the DOM standard +..................................... + +The *note xml.dom.minidom: 140. 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: + + * Interfaces are accessed through instance objects. Applications + should not instantiate the classes themselves; they should use the + creator functions available on the ‘Document’ object. Derived + interfaces support all operations (and attributes) from the base + interfaces, plus any new operations. + + * Operations are used as methods. Since the DOM uses only *note in: + 20a. parameters, the arguments are passed in normal order (from + left to right). There are no optional arguments. ‘void’ + operations return ‘None’. + + * IDL attributes map to instance attributes. For compatibility with + the OMG IDL language mapping for Python, an attribute ‘foo’ can + also be accessed through accessor methods ‘_get_foo()’ and + ‘_set_foo()’. ‘readonly’ attributes must not be changed; this is + not enforced at runtime. + + * The types ‘short int’, ‘unsigned int’, ‘unsigned long long’, and + ‘boolean’ all map to Python integer objects. + + * The type ‘DOMString’ maps to Python strings. *note + xml.dom.minidom: 140. supports either bytes or strings, but will + normally produce strings. Values of type ‘DOMString’ may also be + ‘None’ where allowed to have the IDL ‘null’ value by the DOM + specification from the W3C. + + * ‘const’ declarations map to variables in their respective scope + (e.g. ‘xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE’); they + must not be changed. + + * ‘DOMException’ is currently not supported in *note xml.dom.minidom: + 140. Instead, *note xml.dom.minidom: 140. uses standard Python + exceptions such as *note TypeError: 19c. and *note AttributeError: + 19d. + + * ‘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. + +The following interfaces have no implementation in *note +xml.dom.minidom: 140.: + + * ‘DOMTimeStamp’ + + * ‘EntityReference’ + +Most of these reflect information in the XML document that is not of +general utility to most DOM users. + + +File: python.info, Node: xml dom pulldom — Support for building partial DOM trees, Next: xml sax — Support for SAX2 parsers, Prev: xml dom minidom — Minimal DOM implementation, Up: Structured Markup Processing Tools + +5.20.8 ‘xml.dom.pulldom’ — Support for building partial DOM trees +----------------------------------------------------------------- + +`Source code:' Lib/xml/dom/pulldom.py(1) + +__________________________________________________________________ + +The *note xml.dom.pulldom: 141. 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. + + Warning: The *note xml.dom.pulldom: 141. module is not secure + against maliciously constructed data. If you need to parse + untrusted or unauthenticated data see *note XML vulnerabilities: + 2fb7. + +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: + + 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) + +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()) + +‘event’ is a constant and can be one of: + + * ‘START_ELEMENT’ + + * ‘END_ELEMENT’ + + * ‘COMMENT’ + + * ‘START_DOCUMENT’ + + * ‘END_DOCUMENT’ + + * ‘CHARACTERS’ + + * ‘PROCESSING_INSTRUCTION’ + + * ‘IGNORABLE_WHITESPACE’ + +‘node’ is an object of type ‘xml.dom.minidom.Document’, +‘xml.dom.minidom.Element’ or ‘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 *note DOMEventStream.expandNode(): 30a2. method and switch to +DOM-related processing. + + -- Class: xml.dom.pulldom.PullDom (documentFactory=None) + + Subclass of *note xml.sax.handler.ContentHandler: 30a4. + + -- Class: xml.dom.pulldom.SAX2DOM (documentFactory=None) + + Subclass of *note xml.sax.handler.ContentHandler: 30a4. + + -- Function: xml.dom.pulldom.parse (stream_or_string, parser=None, + bufsize=None) + + Return a *note DOMEventStream: 2fe. from the given input. + `stream_or_string' may be either a file name, or a file-like + object. `parser', if given, must be an *note XMLReader: 30a7. + 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. + +If you have XML in a string, you can use the *note parseString(): 30a8. +function instead: + + -- Function: xml.dom.pulldom.parseString (string, parser=None) + + Return a *note DOMEventStream: 2fe. that represents the (Unicode) + `string'. + + -- Data: xml.dom.pulldom.default_bufsize + + Default value for the `bufsize' parameter to *note parse(): 30a6. + + The value of this variable can be changed before calling *note + parse(): 30a6. and the new value will take effect. + +* Menu: + +* DOMEventStream Objects:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/dom/pulldom.py + + +File: python.info, Node: DOMEventStream Objects, Up: xml dom pulldom — Support for building partial DOM trees + +5.20.8.1 DOMEventStream Objects +............................... + + -- Class: xml.dom.pulldom.DOMEventStream (stream, parser, bufsize) + + Changed in version 3.11: Support for ‘__getitem__()’ method has + been removed. + + -- Method: getEvent () + + Return a tuple containing `event' and the current `node' as + ‘xml.dom.minidom.Document’ if event equals ‘START_DOCUMENT’, + ‘xml.dom.minidom.Element’ if event equals ‘START_ELEMENT’ or + ‘END_ELEMENT’ or ‘xml.dom.minidom.Text’ if event equals + ‘CHARACTERS’. The current node does not contain information + about its children, unless *note expandNode(): 30a2. is + called. + + -- Method: expandNode (node) + + Expands all children of `node' into `node'. Example: + + from xml.dom import pulldom + + xml = 'Foo

    Some text

    and more

    ' + doc = pulldom.parseString(xml) + for event, node in doc: + if event == pulldom.START_ELEMENT and node.tagName == 'p': + # Following statement only prints '

    ' + print(node.toxml()) + doc.expandNode(node) + # Following statement prints node with all its children '

    Some text

    and more

    ' + print(node.toxml()) + + -- Method: reset () + + +File: python.info, Node: xml sax — Support for SAX2 parsers, Next: xml sax handler — Base classes for SAX handlers, Prev: xml dom pulldom — Support for building partial DOM trees, Up: Structured Markup Processing Tools + +5.20.9 ‘xml.sax’ — Support for SAX2 parsers +------------------------------------------- + +`Source code:' Lib/xml/sax/__init__.py(1) + +__________________________________________________________________ + +The *note xml.sax: 146. 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. + + Warning: The *note xml.sax: 146. module is not secure against + maliciously constructed data. If you need to parse untrusted or + unauthenticated data see *note XML vulnerabilities: 2fb7. + +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 *note setFeature(): 30b0. on the parser object and +argument *note feature_external_ges: 30b1. + +The convenience functions are: + + -- Function: xml.sax.make_parser (parser_list=[]) + + Create and return a SAX *note XMLReader: 30a7. 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 ‘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. + + -- 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 *note + ContentHandler: 30a4. instance. If `error_handler' is given, it + must be a SAX *note ErrorHandler: 30b2. instance; if omitted, *note + SAXParseException: 30b3. will be raised on all errors. There is no + return value; all work must be done by the `handler' passed in. + + -- Function: xml.sax.parseString (string, handler, + error_handler=handler.ErrorHandler()) + + Similar to *note parse(): 1435, but parses from a buffer `string' + received as a parameter. `string' must be a *note str: 1b3. + instance or a *note bytes-like object: 9a2. + + Changed in version 3.5: Added support of *note str: 1b3. instances. + +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 *note InputSource: b28, *note Locator: +30b4, ‘Attributes’, ‘AttributesNS’, and *note XMLReader: 30a7. +interfaces are defined in the module *note xml.sax.xmlreader: 149. The +handler interfaces are defined in *note xml.sax.handler: 147. For +convenience, *note InputSource: b28. (which is often instantiated +directly) and the handler classes are also available from *note xml.sax: +146. These interfaces are described below. + +In addition to these classes, *note xml.sax: 146. provides the following +exception classes. + + -- 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 *note ErrorHandler: 30b2. 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 + ‘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. + + -- Exception: xml.sax.SAXParseException (msg, exception, locator) + + Subclass of *note SAXException: 30b5. raised on parse errors. + Instances of this class are passed to the methods of the SAX *note + ErrorHandler: 30b2. interface to provide information about the + parse error. This class supports the SAX *note Locator: 30b4. + interface as well as the *note SAXException: 30b5. interface. + + -- Exception: xml.sax.SAXNotRecognizedException (msg, exception=None) + + Subclass of *note SAXException: 30b5. raised when a SAX *note + XMLReader: 30a7. is confronted with an unrecognized feature or + property. SAX applications and extensions may use this class for + similar purposes. + + -- Exception: xml.sax.SAXNotSupportedException (msg, exception=None) + + Subclass of *note SAXException: 30b5. raised when a SAX *note + XMLReader: 30a7. 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. + +See also +........ + +SAX: The Simple API for XML(2) + + 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. + +Module *note xml.sax.handler: 147. + + Definitions of the interfaces for application-provided objects. + +Module *note xml.sax.saxutils: 148. + + Convenience functions for use in SAX applications. + +Module *note xml.sax.xmlreader: 149. + + Definitions of the interfaces for parser-provided objects. + +* Menu: + +* SAXException Objects:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/sax/__init__.py + + (2) http://www.saxproject.org/ + + +File: python.info, Node: SAXException Objects, Up: xml sax — Support for SAX2 parsers + +5.20.9.1 SAXException Objects +............................. + +The *note SAXException: 30b5. exception class supports the following +methods: + + -- Method: SAXException.getMessage () + + Return a human-readable message describing the error condition. + + -- Method: SAXException.getException () + + Return an encapsulated exception object, or ‘None’. + + +File: python.info, Node: xml sax handler — Base classes for SAX handlers, Next: xml sax saxutils — SAX Utilities, Prev: xml sax — Support for SAX2 parsers, Up: Structured Markup Processing Tools + +5.20.10 ‘xml.sax.handler’ — Base classes for SAX handlers +--------------------------------------------------------- + +`Source code:' Lib/xml/sax/handler.py(1) + +__________________________________________________________________ + +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 *note +xml.sax.handler: 147, so that all methods get default implementations. + + -- 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. + + -- Class: xml.sax.handler.DTDHandler + + Handle DTD events. + + This interface specifies only those DTD events required for basic + parsing (unparsed entities and attributes). + + -- 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. + + -- 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. + + -- Class: xml.sax.handler.LexicalHandler + + Interface used by the parser to represent low frequency events + which may not be of interest to many applications. + +In addition to these classes, *note xml.sax.handler: 147. provides +symbolic constants for the feature and property names. + + -- Data: xml.sax.handler.feature_namespaces + + value: ‘"http://xml.org/sax/features/namespaces"’ + true: Perform Namespace processing. + false: Optionally do not perform Namespace processing (implies namespace-prefixes; default). + access: (parsing) read-only; (not parsing) read/write + + -- Data: xml.sax.handler.feature_namespace_prefixes + + value: ‘"http://xml.org/sax/features/namespace-prefixes"’ + true: Report the original prefixed names and attributes used for Namespace declarations. + false: Do not report attributes used for Namespace declarations, and optionally do not report original prefixed names (default). + access: (parsing) read-only; (not parsing) read/write + + -- Data: xml.sax.handler.feature_string_interning + + value: ‘"http://xml.org/sax/features/string-interning"’ + true: All element names, prefixes, attribute names, Namespace URIs, and local names are interned using the built-in intern function. + false: Names are not necessarily interned, although they may be (default). + access: (parsing) read-only; (not parsing) read/write + + -- Data: xml.sax.handler.feature_validation + + value: ‘"http://xml.org/sax/features/validation"’ + true: Report all validation errors (implies external-general-entities and external-parameter-entities). + false: Do not report validation errors. + access: (parsing) read-only; (not parsing) read/write + + -- Data: xml.sax.handler.feature_external_ges + + value: ‘"http://xml.org/sax/features/external-general-entities"’ + true: Include all external general (text) entities. + false: Do not include external general entities. + access: (parsing) read-only; (not parsing) read/write + + -- Data: xml.sax.handler.feature_external_pes + + value: ‘"http://xml.org/sax/features/external-parameter-entities"’ + true: Include all external parameter entities, including the external DTD subset. + false: Do not include any external parameter entities, even the external DTD subset. + access: (parsing) read-only; (not parsing) read/write + + -- Data: xml.sax.handler.all_features + + List of all features. + + -- Data: xml.sax.handler.property_lexical_handler + + value: ‘"http://xml.org/sax/properties/lexical-handler"’ + data type: xml.sax.handler.LexicalHandler (not supported in Python 2) + description: An optional extension handler for lexical events like comments. + access: read/write + + -- Data: xml.sax.handler.property_declaration_handler + + value: ‘"http://xml.org/sax/properties/declaration-handler"’ + data type: xml.sax.sax2lib.DeclHandler (not supported in Python 2) + description: An optional extension handler for DTD-related events other than notations and unparsed entities. + access: read/write + + -- Data: xml.sax.handler.property_dom_node + + value: ‘"http://xml.org/sax/properties/dom-node"’ + data type: org.w3c.dom.Node (not supported in Python 2) + description: When parsing, the current DOM node being visited if this is a DOM iterator; when not parsing, the root DOM node for iteration. + access: (parsing) read-only; (not parsing) read/write + + -- Data: xml.sax.handler.property_xml_string + + value: ‘"http://xml.org/sax/properties/xml-string"’ + data type: Bytes + description: The literal string of characters that was the source for the current event. + access: read-only + + -- Data: xml.sax.handler.all_properties + + List of all known property names. + +* Menu: + +* ContentHandler Objects:: +* DTDHandler Objects:: +* EntityResolver Objects:: +* ErrorHandler Objects:: +* LexicalHandler Objects:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/sax/handler.py + + +File: python.info, Node: ContentHandler Objects, Next: DTDHandler Objects, Up: xml sax handler — Base classes for SAX handlers + +5.20.10.1 ContentHandler Objects +................................ + +Users are expected to subclass *note ContentHandler: 30a4. to support +their application. The following methods are called by the parser on +the appropriate events in the input document: + + -- 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. + + -- 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 *note + setDocumentLocator(): 30cd.). + + -- 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. + + -- 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 + ‘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 *note startPrefixMapping(): 30d0. and + *note endPrefixMapping(): 30d1. events supply the information to + the application to expand prefixes in those contexts itself, if + necessary. + + Note that *note startPrefixMapping(): 30d0. and *note + endPrefixMapping(): 30d1. events are not guaranteed to be properly + nested relative to each-other: all *note startPrefixMapping(): + 30d0. events will occur before the corresponding *note + startElement(): 30d2. event, and all *note endPrefixMapping(): + 30d1. events will occur after the corresponding *note endElement(): + 30d3. event, but their order is not guaranteed. + + -- Method: ContentHandler.endPrefixMapping (prefix) + + End the scope of a prefix-URI mapping. + + See *note startPrefixMapping(): 30d0. for details. This event will + always occur after the corresponding *note endElement(): 30d3. + event, but the order of *note endPrefixMapping(): 30d1. events is + not otherwise guaranteed. + + -- 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 + ‘Attributes’ interface (see *note The Attributes Interface: 30d4.) + 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 *note copy(): 24. method of the + `attrs' object. + + -- 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 *note startElement(): 30d2. event. + + -- 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 + ‘(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 ‘AttributesNS’ interface (see *note The + AttributesNS Interface: 30d6.) containing the attributes of the + element. If no namespace is associated with the element, the `uri' + component of `name' will be ‘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 *note copy(): 24. method of the + `attrs' object. + + Parsers may set the `qname' parameter to ‘None’, unless the + ‘feature_namespace_prefixes’ feature is activated. + + -- 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 *note startElementNS(): 30d5. method, likewise the `qname' + parameter. + + -- 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 ‘expat’ reader + module always produces strings. + + 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. + + -- 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. + + -- 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. + + -- 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 ‘feature_external_ges’ and + the ‘feature_external_pes’ properties. + + +File: python.info, Node: DTDHandler Objects, Next: EntityResolver Objects, Prev: ContentHandler Objects, Up: xml sax handler — Base classes for SAX handlers + +5.20.10.2 DTDHandler Objects +............................ + +*note DTDHandler: 30be. instances provide the following methods: + + -- Method: DTDHandler.notationDecl (name, publicId, systemId) + + Handle a notation declaration event. + + -- Method: DTDHandler.unparsedEntityDecl (name, publicId, systemId, + ndata) + + Handle an unparsed entity declaration event. + + +File: python.info, Node: EntityResolver Objects, Next: ErrorHandler Objects, Prev: DTDHandler Objects, Up: xml sax handler — Base classes for SAX handlers + +5.20.10.3 EntityResolver Objects +................................ + + -- 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'. + + +File: python.info, Node: ErrorHandler Objects, Next: LexicalHandler Objects, Prev: EntityResolver Objects, Up: xml sax handler — Base classes for SAX handlers + +5.20.10.4 ErrorHandler Objects +.............................. + +Objects with this interface are used to receive error and warning +information from the *note XMLReader: 30a7. If you create an object +that implements this interface, then register the object with your *note +XMLReader: 30a7, 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 ‘SAXParseException’ as the only parameter. +Errors and warnings may be converted to an exception by raising the +passed-in exception object. + + -- 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. + + -- Method: ErrorHandler.fatalError (exception) + + Called when the parser encounters an error it cannot recover from; + parsing is expected to terminate when this method returns. + + -- 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. + + +File: python.info, Node: LexicalHandler Objects, Prev: ErrorHandler Objects, Up: xml sax handler — Base classes for SAX handlers + +5.20.10.5 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 +‘'http://xml.org/sax/properties/lexical-handler'’. + + -- Method: LexicalHandler.comment (content) + + Reports a comment anywhere in the document (including the DTD and + outside the document element). + + -- Method: LexicalHandler.startDTD (name, public_id, system_id) + + Reports the start of the DTD declarations if the document has an + associated DTD. + + -- Method: LexicalHandler.endDTD () + + Reports the end of DTD declaration. + + -- 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. + + -- Method: LexicalHandler.endCDATA () + + Reports the end of a CDATA marked section. + + +File: python.info, Node: xml sax saxutils — SAX Utilities, Next: xml sax xmlreader — Interface for XML parsers, Prev: xml sax handler — Base classes for SAX handlers, Up: Structured Markup Processing Tools + +5.20.11 ‘xml.sax.saxutils’ — SAX Utilities +------------------------------------------ + +`Source code:' Lib/xml/sax/saxutils.py(1) + +__________________________________________________________________ + +The module *note xml.sax.saxutils: 148. contains a number of classes and +functions that are commonly useful when creating SAX applications, +either in direct use, or as base classes. + + -- Function: xml.sax.saxutils.escape (data, entities={}) + + Escape ‘'&'’, ‘'<'’, and ‘'>'’ 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 ‘'&'’, ‘'<'’ and ‘'>'’ are always escaped, even if + `entities' is provided. + + -- Function: xml.sax.saxutils.unescape (data, entities={}) + + Unescape ‘'&'’, ‘'<'’, and ‘'>'’ 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. + ‘'&'’, ‘'<'’, and ‘'>'’ are always unescaped, even if + `entities' is provided. + + -- Function: xml.sax.saxutils.quoteattr (data, entities={}) + + Similar to *note escape(): 30f1, 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. *note + quoteattr(): 30f3. 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: + + >>> print("" % quoteattr("ab ' cd \" ef")) + + + This function is useful when generating attribute values for HTML + or any SGML using the reference concrete syntax. + + -- Class: xml.sax.saxutils.XMLGenerator (out=None, + encoding='iso-8859-1', short_empty_elements=False) + + This class implements the *note ContentHandler: 30a4. interface by + writing SAX events back into an XML document. In other words, + using an *note XMLGenerator: 30f4. 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 ‘'iso-8859-1'’. + `short_empty_elements' controls the formatting of elements that + contain no content: if ‘False’ (the default) they are emitted as a + pair of start/end tags, if set to ‘True’ they are emitted as a + single self-closed tag. + + New in version 3.2: The `short_empty_elements' parameter. + + -- Class: xml.sax.saxutils.XMLFilterBase (base) + + This class is designed to sit between an *note XMLReader: 30a7. 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. + + -- Function: xml.sax.saxutils.prepare_input_source (source, base='') + + This function takes an input source and an optional base URL and + returns a fully resolved *note InputSource: b28. object ready for + reading. The input source can be given as a string, a file-like + object, or an *note InputSource: b28. object; parsers will use this + function to implement the polymorphic `source' argument to their + ‘parse()’ method. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/sax/saxutils.py + + +File: python.info, Node: xml sax xmlreader — Interface for XML parsers, Next: xml parsers expat — Fast XML parsing using Expat, Prev: xml sax saxutils — SAX Utilities, Up: Structured Markup Processing Tools + +5.20.12 ‘xml.sax.xmlreader’ — Interface for XML parsers +------------------------------------------------------- + +`Source code:' Lib/xml/sax/xmlreader.py(1) + +__________________________________________________________________ + +SAX parsers implement the *note XMLReader: 30a7. interface. They are +implemented in a Python module, which must provide a function +‘create_parser()’. This function is invoked by *note +xml.sax.make_parser(): 1473. with no arguments to create a new parser +object. + + -- Class: xml.sax.xmlreader.XMLReader + + Base class which can be inherited by SAX parsers. + + -- 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 ‘parse()’ won’t return until the + entire document is processed. So these interfaces should be used + if the blocking behaviour of ‘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. + + -- 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 + ‘None’. + + -- Class: xml.sax.xmlreader.InputSource (system_id=None) + + Encapsulation of the information needed by the *note XMLReader: + 30a7. 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 *note + XMLReader.parse(): 30fa. method and for returning from + EntityResolver.resolveEntity. + + An *note InputSource: b28. belongs to the application, the *note + XMLReader: 30a7. is not allowed to modify *note InputSource: b28. + objects passed to it from the application, although it may make + copies and modify those. + + -- Class: xml.sax.xmlreader.AttributesImpl (attrs) + + This is an implementation of the ‘Attributes’ interface (see + section *note The Attributes Interface: 30d4.). This is a + dictionary-like object which represents the element attributes in a + ‘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. + + -- Class: xml.sax.xmlreader.AttributesNSImpl (attrs, qnames) + + Namespace-aware variant of *note AttributesImpl: 30fb, which will + be passed to ‘startElementNS()’. It is derived from *note + AttributesImpl: 30fb, 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 ‘AttributesNS’ + interface (see section *note The AttributesNS Interface: 30d6.). + +* Menu: + +* XMLReader Objects:: +* IncrementalParser Objects:: +* Locator Objects:: +* InputSource Objects:: +* The Attributes Interface:: +* The AttributesNS Interface:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/xml/sax/xmlreader.py + + +File: python.info, Node: XMLReader Objects, Next: IncrementalParser Objects, Up: xml sax xmlreader — Interface for XML parsers + +5.20.12.1 XMLReader Objects +........................... + +The *note XMLReader: 30a7. interface supports the following methods: + + -- 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 *note pathlib.Path: 65f. or + *note path-like: 773. object, or an *note InputSource: b28. object. + When *note parse(): 30fa. 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. + + -- Method: XMLReader.getContentHandler () + + Return the current *note ContentHandler: 30a4. + + -- Method: XMLReader.setContentHandler (handler) + + Set the current *note ContentHandler: 30a4. If no *note + ContentHandler: 30a4. is set, content events will be discarded. + + -- Method: XMLReader.getDTDHandler () + + Return the current *note DTDHandler: 30be. + + -- Method: XMLReader.setDTDHandler (handler) + + Set the current *note DTDHandler: 30be. If no *note DTDHandler: + 30be. is set, DTD events will be discarded. + + -- Method: XMLReader.getEntityResolver () + + Return the current *note EntityResolver: 30bf. + + -- Method: XMLReader.setEntityResolver (handler) + + Set the current *note EntityResolver: 30bf. If no *note + EntityResolver: 30bf. 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. + + -- Method: XMLReader.getErrorHandler () + + Return the current *note ErrorHandler: 30b2. + + -- Method: XMLReader.setErrorHandler (handler) + + Set the current error handler. If no *note ErrorHandler: 30b2. is + set, errors will be raised as exceptions, and warnings will be + printed. + + -- 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. + + -- Method: XMLReader.getFeature (featurename) + + Return the current setting for feature `featurename'. If the + feature is not recognized, ‘SAXNotRecognizedException’ is raised. + The well-known featurenames are listed in the module *note + xml.sax.handler: 147. + + -- Method: XMLReader.setFeature (featurename, value) + + Set the `featurename' to `value'. If the feature is not + recognized, ‘SAXNotRecognizedException’ is raised. If the feature + or its setting is not supported by the parser, + `SAXNotSupportedException' is raised. + + -- Method: XMLReader.getProperty (propertyname) + + Return the current setting for property `propertyname'. If the + property is not recognized, a ‘SAXNotRecognizedException’ is + raised. The well-known propertynames are listed in the module + *note xml.sax.handler: 147. + + -- Method: XMLReader.setProperty (propertyname, value) + + Set the `propertyname' to `value'. If the property is not + recognized, ‘SAXNotRecognizedException’ is raised. If the property + or its setting is not supported by the parser, + `SAXNotSupportedException' is raised. + + +File: python.info, Node: IncrementalParser Objects, Next: Locator Objects, Prev: XMLReader Objects, Up: xml sax xmlreader — Interface for XML parsers + +5.20.12.2 IncrementalParser Objects +................................... + +Instances of *note IncrementalParser: 30f9. offer the following +additional methods: + + -- Method: IncrementalParser.feed (data) + + Process a chunk of `data'. + + -- 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. + + -- 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. + + +File: python.info, Node: Locator Objects, Next: InputSource Objects, Prev: IncrementalParser Objects, Up: xml sax xmlreader — Interface for XML parsers + +5.20.12.3 Locator Objects +......................... + +Instances of *note Locator: 30b4. provide these methods: + + -- Method: Locator.getColumnNumber () + + Return the column number where the current event begins. + + -- Method: Locator.getLineNumber () + + Return the line number where the current event begins. + + -- Method: Locator.getPublicId () + + Return the public identifier for the current event. + + -- Method: Locator.getSystemId () + + Return the system identifier for the current event. + + +File: python.info, Node: InputSource Objects, Next: The Attributes Interface, Prev: Locator Objects, Up: xml sax xmlreader — Interface for XML parsers + +5.20.12.4 InputSource Objects +............................. + + -- Method: InputSource.setPublicId (id) + + Sets the public identifier of this *note InputSource: b28. + + -- Method: InputSource.getPublicId () + + Returns the public identifier of this *note InputSource: b28. + + -- Method: InputSource.setSystemId (id) + + Sets the system identifier of this *note InputSource: b28. + + -- Method: InputSource.getSystemId () + + Returns the system identifier of this *note InputSource: b28. + + -- Method: InputSource.setEncoding (encoding) + + Sets the character encoding of this *note InputSource: b28. + + 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 *note InputSource: b28. is ignored if + the *note InputSource: b28. also contains a character stream. + + -- Method: InputSource.getEncoding () + + Get the character encoding of this InputSource. + + -- Method: InputSource.setByteStream (bytefile) + + Set the byte stream (a *note binary file: 16d1.) 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. + + -- Method: InputSource.getByteStream () + + Get the byte stream for this input source. + + The getEncoding method will return the character encoding for this + byte stream, or ‘None’ if unknown. + + -- Method: InputSource.setCharacterStream (charfile) + + Set the character stream (a *note text file: 16d0.) 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. + + -- Method: InputSource.getCharacterStream () + + Get the character stream for this input source. + + +File: python.info, Node: The Attributes Interface, Next: The AttributesNS Interface, Prev: InputSource Objects, Up: xml sax xmlreader — Interface for XML parsers + +5.20.12.5 The ‘Attributes’ Interface +.................................... + +‘Attributes’ objects implement a portion of the *note mapping protocol: +e70, including the methods ‘copy()’, ‘get()’, *note __contains__(): +190a, ‘items()’, ‘keys()’, and ‘values()’. The following methods are +also provided: + + -- Method: Attributes.getLength () + + Return the number of attributes. + + -- Method: Attributes.getNames () + + Return the names of the attributes. + + -- Method: Attributes.getType (name) + + Returns the type of the attribute `name', which is normally + ‘'CDATA'’. + + -- Method: Attributes.getValue (name) + + Return the value of attribute `name'. + + +File: python.info, Node: The AttributesNS Interface, Prev: The Attributes Interface, Up: xml sax xmlreader — Interface for XML parsers + +5.20.12.6 The ‘AttributesNS’ Interface +...................................... + +This interface is a subtype of the ‘Attributes’ interface (see section +*note The Attributes Interface: 30d4.). All methods supported by that +interface are also available on ‘AttributesNS’ objects. + +The following methods are also available: + + -- Method: AttributesNS.getValueByQName (name) + + Return the value for a qualified name. + + -- Method: AttributesNS.getNameByQName (name) + + Return the ‘(namespace, localname)’ pair for a qualified `name'. + + -- Method: AttributesNS.getQNameByName (name) + + Return the qualified name for a ‘(namespace, localname)’ pair. + + -- Method: AttributesNS.getQNames () + + Return the qualified names of all attributes. + + +File: python.info, Node: xml parsers expat — Fast XML parsing using Expat, Prev: xml sax xmlreader — Interface for XML parsers, Up: Structured Markup Processing Tools + +5.20.13 ‘xml.parsers.expat’ — Fast XML parsing using Expat +---------------------------------------------------------- + +__________________________________________________________________ + + Warning: The ‘pyexpat’ module is not secure against maliciously + constructed data. If you need to parse untrusted or + unauthenticated data see *note XML vulnerabilities: 2fb7. + +The *note xml.parsers.expat: 143. module is a Python interface to the +Expat non-validating XML parser. The module provides a single extension +type, ‘xmlparser’, that represents the current state of an XML parser. +After an ‘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. + +This module uses the ‘pyexpat’ module to provide access to the Expat +parser. Direct use of the ‘pyexpat’ module is deprecated. + +This module provides one exception and one type object: + + -- Exception: xml.parsers.expat.ExpatError + + The exception raised when Expat reports an error. See section + *note ExpatError Exceptions: 312e. for more information on + interpreting Expat errors. + + -- Exception: xml.parsers.expat.error + + Alias for *note ExpatError: f31. + + -- Data: xml.parsers.expat.XMLParserType + + The type of the return values from the *note ParserCreate(): 3131. + function. + +The *note xml.parsers.expat: 143. module contains two functions: + + -- Function: xml.parsers.expat.ErrorString (errno) + + Returns an explanatory string for a given error number `errno'. + + -- Function: xml.parsers.expat.ParserCreate (encoding=None, + namespace_separator=None) + + Creates and returns a new ‘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' (1) is given + it will override the implicit or explicit encoding of the document. + + 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 *note ValueError: 1c8. will be raised if + the string has an illegal length (‘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 + ‘StartElementHandler’ and ‘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 (‘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 + (‘' '’) and the following document is parsed: + + + + + + + + ‘StartElementHandler’ will receive the following strings for each + element: + + http://default-namespace.org/ root + http://www.python.org/ns/ elem1 + elem2 + + Due to limitations in the ‘Expat’ library used by ‘pyexpat’, the + ‘xmlparser’ instance returned can only be used to parse a single + XML document. Call ‘ParserCreate’ for each document to provide + unique parser instances. + +See also +........ + +The Expat XML Parser(2) + + Home page of the Expat project. + +* Menu: + +* XMLParser Objects: XMLParser Objects<2>. +* ExpatError Exceptions:: +* Example: Example<11>. +* Content Model Descriptions:: +* Expat error constants:: + + ---------- Footnotes ---------- + + (1) The encoding string included in XML output should conform to the +appropriate standards. For example, “UTF-8” is valid, but “UTF8” is +not. See +‘https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl’ and +‘https://www.iana.org/assignments/character-sets/character-sets.xhtml’. + + (2) http://www.libexpat.org/ + + +File: python.info, Node: XMLParser Objects<2>, Next: ExpatError Exceptions, Up: xml parsers expat — Fast XML parsing using Expat + +5.20.13.1 XMLParser Objects +........................... + +‘xmlparser’ objects have the following methods: + + -- 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. + + -- Method: xmlparser.ParseFile (file) + + Parse XML data reading from the object `file'. `file' only needs + to provide the ‘read(nbytes)’ method, returning the empty string + when there’s no more data. + + -- 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 *note ExternalEntityRefHandler(): 3138, + *note NotationDeclHandler(): 3139, and *note + UnparsedEntityDeclHandler(): 313a. functions. + + -- Method: xmlparser.GetBase () + + Returns a string containing the base set by a previous call to + *note SetBase(): 3137, or ‘None’ if *note SetBase(): 3137. hasn’t + been called. + + -- 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 ‘None’. + + -- 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 *note + ExternalEntityRefHandler(): 3138. handler function, described + below. The child parser is created with the *note + ordered_attributes: 313e. and *note specified_attributes: 313f. set + to the values of this parser. + + -- Method: xmlparser.SetParamEntityParsing (flag) + + Control parsing of parameter entities (including the external DTD + subset). Possible `flag' values are + ‘XML_PARAM_ENTITY_PARSING_NEVER’, + ‘XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE’ and + ‘XML_PARAM_ENTITY_PARSING_ALWAYS’. Return true if setting the flag + was successful. + + -- Method: xmlparser.UseForeignDTD ([flag]) + + Calling this with a true value for `flag' (the default) will cause + Expat to call the *note ExternalEntityRefHandler: 3138. with *note + None: 243. for all arguments to allow an alternate DTD to be + loaded. If the document does not contain a document type + declaration, the *note ExternalEntityRefHandler: 3138. will still + be called, but the *note StartDoctypeDeclHandler: 3142. and *note + EndDoctypeDeclHandler: 3143. 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 *note Parse(): 3135. or + *note ParseFile(): 3136. methods are called; calling it after + either of those have been called causes *note ExpatError: f31. to + be raised with the *note code: 19. attribute set to + ‘errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]’. + +‘xmlparser’ objects have the following attributes: + + -- Attribute: xmlparser.buffer_size + + The size of the buffer used when *note buffer_text: 3145. 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. + + -- Attribute: xmlparser.buffer_text + + Setting this to true causes the ‘xmlparser’ object to buffer + textual content returned by Expat to avoid multiple calls to the + *note CharacterDataHandler(): 3146. 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. + + -- Attribute: xmlparser.buffer_used + + If *note buffer_text: 3145. is enabled, the number of bytes stored + in the buffer. These bytes represent UTF-8 encoded text. This + attribute has no meaningful interpretation when *note buffer_text: + 3145. is false. + + -- 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. + + -- 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. + +The following attributes contain values relating to the most recent +error encountered by an ‘xmlparser’ object, and will only have correct +values once a call to ‘Parse()’ or ‘ParseFile()’ has raised an *note +xml.parsers.expat.ExpatError: f31. exception. + + -- Attribute: xmlparser.ErrorByteIndex + + Byte index at which an error occurred. + + -- Attribute: xmlparser.ErrorCode + + Numeric code specifying the problem. This value can be passed to + the *note ErrorString(): 3132. function, or compared to one of the + constants defined in the ‘errors’ object. + + -- Attribute: xmlparser.ErrorColumnNumber + + Column number at which an error occurred. + + -- Attribute: xmlparser.ErrorLineNumber + + Line number at which an error occurred. + +The following attributes contain values relating to the current parse +location in an ‘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). + + -- Attribute: xmlparser.CurrentByteIndex + + Current byte index in the parser input. + + -- Attribute: xmlparser.CurrentColumnNumber + + Current column number in the parser input. + + -- Attribute: xmlparser.CurrentLineNumber + + Current line number in the parser input. + +Here is the list of handlers that can be set. To set a handler on an +‘xmlparser’ object `o', use ‘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. + + -- 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 ‘1’ if the document is declared + standalone, ‘0’ if it is declared not to be standalone, or ‘-1’ if + the standalone clause was omitted. This is only available with + Expat version 1.95.0 or newer. + + -- Method: xmlparser.StartDoctypeDeclHandler (doctypeName, systemId, + publicId, has_internal_subset) + + Called when Expat begins parsing the document type declaration + (‘'’. + + -- Method: xmlparser.StartCdataSectionHandler () + + Called at the start of a CDATA section. This and *note + EndCdataSectionHandler: 3156. are needed to be able to identify the + syntactical start and end for CDATA sections. + + -- Method: xmlparser.EndCdataSectionHandler () + + Called at the end of a CDATA section. + + -- 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. + + -- Method: xmlparser.DefaultHandlerExpand (data) + + This is the same as the *note DefaultHandler(): 315b, but doesn’t + inhibit expansion of internal entities. The entity reference will + not be passed to the default handler. + + -- 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 ‘yes’ in an XML declaration. If this handler + returns ‘0’, then the parser will raise an + ‘XML_ERROR_NOT_STANDALONE’ error. If this handler is not set, no + exception is raised by the parser for this condition. + + -- Method: xmlparser.ExternalEntityRefHandler (context, base, systemId, + publicId) + + Called for references to external entities. `base' is the current + base, as set by a previous call to *note SetBase(): 3137. The + public and system identifiers, `systemId' and `publicId', are + strings if given; if the public identifier is not given, `publicId' + will be ‘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 + ‘ExternalEntityParserCreate(context)’, initializing it with the + appropriate callbacks, and parsing the entity. This handler should + return an integer; if it returns ‘0’, the parser will raise an + ‘XML_ERROR_EXTERNAL_ENTITY_HANDLING’ error, otherwise parsing will + continue. + + If this handler is not provided, external entities are reported by + the *note DefaultHandler: 315b. callback, if provided. + + +File: python.info, Node: ExpatError Exceptions, Next: Example<11>, Prev: XMLParser Objects<2>, Up: xml parsers expat — Fast XML parsing using Expat + +5.20.13.2 ExpatError Exceptions +............................... + +*note ExpatError: f31. exceptions have a number of interesting +attributes: + + -- Attribute: ExpatError.code + + Expat’s internal error number for the specific error. The *note + errors.messages: 3160. dictionary maps these error numbers to + Expat’s error messages. For 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]) + + The *note errors: 144. module also provides error message constants + and a dictionary *note codes: 3161. mapping these messages back to + the error codes, see below. + + -- Attribute: ExpatError.lineno + + Line number on which the error was detected. The first line is + numbered ‘1’. + + -- Attribute: ExpatError.offset + + Character offset into the line where the error occurred. The first + column is numbered ‘0’. + + +File: python.info, Node: Example<11>, Next: Content Model Descriptions, Prev: ExpatError Exceptions, Up: xml parsers expat — Fast XML parsing using Expat + +5.20.13.3 Example +................. + +The following program defines three handlers that just print out their +arguments. + + 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(""" + Text goes here + More text + """, 1) + +The output from this program is: + + 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 + + +File: python.info, Node: Content Model Descriptions, Next: Expat error constants, Prev: Example<11>, Up: xml parsers expat — Fast XML parsing using Expat + +5.20.13.4 Content Model Descriptions +.................................... + +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 *note +xml.parsers.expat.model: 145. 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: + + -- Data: xml.parsers.expat.model.XML_CTYPE_ANY + + The element named by the model name was declared to have a content + model of ‘ANY’. + + -- 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 ‘(A | B | C)’. + + -- Data: xml.parsers.expat.model.XML_CTYPE_EMPTY + + Elements which are declared to be ‘EMPTY’ have this model type. + + -- Data: xml.parsers.expat.model.XML_CTYPE_MIXED + + -- Data: xml.parsers.expat.model.XML_CTYPE_NAME + + -- 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 ‘(A, B, C)’. + +The constants in the quantifier group are: + + -- Data: xml.parsers.expat.model.XML_CQUANT_NONE + + No modifier is given, so it can appear exactly once, as for ‘A’. + + -- Data: xml.parsers.expat.model.XML_CQUANT_OPT + + The model is optional: it can appear once or not at all, as for + ‘A?’. + + -- Data: xml.parsers.expat.model.XML_CQUANT_PLUS + + The model must occur one or more times (like ‘A+’). + + -- Data: xml.parsers.expat.model.XML_CQUANT_REP + + The model must occur zero or more times, as for ‘A*’. + + +File: python.info, Node: Expat error constants, Prev: Content Model Descriptions, Up: xml parsers expat — Fast XML parsing using Expat + +5.20.13.5 Expat error constants +............................... + +The following constants are provided in the *note +xml.parsers.expat.errors: 144. module. These constants are useful in +interpreting some of the attributes of the ‘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 *note code: +19. attribute with ‘errors.codes[errors.XML_ERROR_CONSTANT_NAME]’. + +The ‘errors’ module has the following attributes: + + -- Data: xml.parsers.expat.errors.codes + + A dictionary mapping string descriptions to their error codes. + + New in version 3.2. + + -- Data: xml.parsers.expat.errors.messages + + A dictionary mapping numeric error codes to their string + descriptions. + + New in version 3.2. + + -- Data: xml.parsers.expat.errors.XML_ERROR_ASYNC_ENTITY + + -- 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. + + -- 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 ‘0’, or ‘‘�’’). + + -- 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. + + -- Data: xml.parsers.expat.errors.XML_ERROR_DUPLICATE_ATTRIBUTE + + An attribute was used more than once in a start tag. + + -- Data: xml.parsers.expat.errors.XML_ERROR_INCORRECT_ENCODING + + -- 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 ‘0’) in a UTF-8 input + stream. + + -- Data: xml.parsers.expat.errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT + + Something other than whitespace occurred after the document + element. + + -- Data: xml.parsers.expat.errors.XML_ERROR_MISPLACED_XML_PI + + An XML declaration was found somewhere other than the start of the + input data. + + -- 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).. + + -- Data: xml.parsers.expat.errors.XML_ERROR_NO_MEMORY + + Expat was not able to allocate memory internally. + + -- Data: xml.parsers.expat.errors.XML_ERROR_PARAM_ENTITY_REF + + A parameter entity reference was found where it was not allowed. + + -- Data: xml.parsers.expat.errors.XML_ERROR_PARTIAL_CHAR + + An incomplete character was found in the input. + + -- 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. + + -- Data: xml.parsers.expat.errors.XML_ERROR_SYNTAX + + Some unspecified syntax error was encountered. + + -- Data: xml.parsers.expat.errors.XML_ERROR_TAG_MISMATCH + + An end tag did not match the innermost open start tag. + + -- 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. + + -- Data: xml.parsers.expat.errors.XML_ERROR_UNDEFINED_ENTITY + + A reference was made to an entity which was not defined. + + -- Data: xml.parsers.expat.errors.XML_ERROR_UNKNOWN_ENCODING + + The document encoding is not supported by Expat. + + -- Data: xml.parsers.expat.errors.XML_ERROR_UNCLOSED_CDATA_SECTION + + A CDATA marked section was not closed. + + -- Data: xml.parsers.expat.errors.XML_ERROR_EXTERNAL_ENTITY_HANDLING + + -- 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 + ‘NotStandaloneHandler’ was set and returned ‘0’. + + -- Data: xml.parsers.expat.errors.XML_ERROR_UNEXPECTED_STATE + + -- Data: xml.parsers.expat.errors.XML_ERROR_ENTITY_DECLARED_IN_PE + + -- 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 *note + xml.parsers.expat: 143. module. + + -- 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 ‘UseForeignDTD()’. + + -- Data: xml.parsers.expat.errors.XML_ERROR_UNBOUND_PREFIX + + An undeclared prefix was found when namespace processing was + enabled. + + -- Data: xml.parsers.expat.errors.XML_ERROR_UNDECLARING_PREFIX + + The document attempted to remove the namespace declaration + associated with a prefix. + + -- Data: xml.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE + + A parameter entity contained incomplete markup. + + -- Data: xml.parsers.expat.errors.XML_ERROR_XML_DECL + + The document contained no document element at all. + + -- Data: xml.parsers.expat.errors.XML_ERROR_TEXT_DECL + + There was an error parsing a text declaration in an external + entity. + + -- Data: xml.parsers.expat.errors.XML_ERROR_PUBLICID + + Characters were found in the public id that are not allowed. + + -- 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. + + -- Data: xml.parsers.expat.errors.XML_ERROR_NOT_SUSPENDED + + An attempt to resume the parser was made when the parser had not + been suspended. + + -- Data: xml.parsers.expat.errors.XML_ERROR_ABORTED + + This should not be reported to Python applications. + + -- 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. + + -- Data: xml.parsers.expat.errors.XML_ERROR_SUSPEND_PE + + -- Data: xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XML + + An attempt was made to undeclare reserved namespace prefix ‘xml’ or + to bind it to another namespace URI. + + -- Data: xml.parsers.expat.errors.XML_ERROR_RESERVED_PREFIX_XMLNS + + An attempt was made to declare or undeclare reserved namespace + prefix ‘xmlns’. + + -- Data: xml.parsers.expat.errors.XML_ERROR_RESERVED_NAMESPACE_URI + + An attempt was made to bind the URI of one the reserved namespace + prefixes ‘xml’ and ‘xmlns’ to another namespace prefix. + + -- Data: xml.parsers.expat.errors.XML_ERROR_INVALID_ARGUMENT + + This should not be reported to Python applications. + + -- Data: xml.parsers.expat.errors.XML_ERROR_NO_BUFFER + + This should not be reported to Python applications. + + -- Data: xml.parsers.expat.errors.XML_ERROR_AMPLIFICATION_LIMIT_BREACH + + The limit on input amplification factor (from DTD and entities) has + been breached. + + +File: python.info, Node: Internet Protocols and Support, Next: Multimedia Services, Prev: Structured Markup Processing Tools, Up: The Python Standard Library + +5.21 Internet Protocols and Support +=================================== + +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 *note socket: ec, 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 4122:: +* 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:: + + +File: python.info, Node: webbrowser — Convenient web-browser controller, Next: wsgiref — WSGI Utilities and Reference Implementation, Up: Internet Protocols and Support + +5.21.1 ‘webbrowser’ — Convenient web-browser controller +------------------------------------------------------- + +`Source code:' Lib/webbrowser.py(1) + +__________________________________________________________________ + +The *note webbrowser: 133. module provides a high-level interface to +allow displaying web-based documents to users. Under most +circumstances, simply calling the *note open(): 319a. 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 ‘BROWSER’ exists, it is interpreted as the +*note os.pathsep: 1788.-separated list of browsers to try ahead of the +platform defaults. When the value of a list part contains the string +‘%s’, then it is interpreted as a literal browser command line to be +used with the argument URL substituted for ‘%s’; if the part does not +contain ‘%s’, it is simply interpreted as the name of the browser to +launch. (2) + +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. + +The script ‘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: ‘-n’ opens the URL in a new browser window, if +possible; ‘-t’ opens the URL in a new browser page (“tab”). The options +are, naturally, mutually exclusive. Usage example: + + python -m webbrowser -t "https://www.python.org" + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +The following exception is defined: + + -- Exception: webbrowser.Error + + Exception raised when a browser control error occurs. + +The following functions are defined: + + -- 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 + ‘True’, the window is raised if possible (note that under many + window managers this will occur regardless of the setting of this + variable). + + 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 *note auditing event: 12c0. ‘webbrowser.open’ with + argument ‘url’. + + -- 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. + + -- Function: webbrowser.open_new_tab (url) + + Open `url' in a new page (“tab”) of the default browser, if + possible, otherwise equivalent to *note open_new(): 319c. + + -- Function: webbrowser.get (using=None) + + Return a controller object for the browser type `using'. If + `using' is ‘None’, return a controller for a default browser + appropriate to the caller’s environment. + + -- Function: webbrowser.register (name, constructor, instance=None, *, + preferred=False) + + Register the browser type `name'. Once a browser type is + registered, the *note get(): 319e. function can return a controller + for that browser type. If `instance' is not provided, or is + ‘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 ‘None’. + + Setting `preferred' to ‘True’ makes this browser a preferred result + for a *note get(): 319e. call with no argument. Otherwise, this + entry point is only useful if you plan to either set the ‘BROWSER’ + variable or call *note get(): 319e. with a nonempty argument + matching the name of a handler you declare. + + Changed in version 3.7: `preferred' keyword-only parameter was + added. + +A number of browser types are predefined. This table gives the type +names that may be passed to the *note get(): 319e. function and the +corresponding instantiations for the controller classes, all defined in +this module. + +Type Name Class Name Notes + +--------------------------------------------------------------------------------------- + +‘'mozilla'’ ‘Mozilla('mozilla')’ + + +‘'firefox'’ ‘Mozilla('mozilla')’ + + +‘'netscape'’ ‘Mozilla('netscape')’ + + +‘'galeon'’ ‘Galeon('galeon')’ + + +‘'epiphany'’ ‘Galeon('epiphany')’ + + +‘'skipstone'’ ‘BackgroundBrowser('skipstone')’ + + +‘'kfmclient'’ ‘Konqueror()’ (1) + + +‘'konqueror'’ ‘Konqueror()’ (1) + + +‘'kfm'’ ‘Konqueror()’ (1) + + +‘'mosaic'’ ‘BackgroundBrowser('mosaic')’ + + +‘'opera'’ ‘Opera()’ + + +‘'grail'’ ‘Grail()’ + + +‘'links'’ ‘GenericBrowser('links')’ + + +‘'elinks'’ ‘Elinks('elinks')’ + + +‘'lynx'’ ‘GenericBrowser('lynx')’ + + +‘'w3m'’ ‘GenericBrowser('w3m')’ + + +‘'windows-default'’ ‘WindowsDefault’ (2) + + +‘'macosx'’ ‘MacOSXOSAScript('default')’ (3) + + +‘'safari'’ ‘MacOSXOSAScript('safari')’ (3) + + +‘'google-chrome'’ ‘Chrome('google-chrome')’ + + +‘'chrome'’ ‘Chrome('chrome')’ + + +‘'chromium'’ ‘Chromium('chromium')’ + + +‘'chromium-browser'’ ‘Chromium('chromium-browser')’ + + +Notes: + + 1. “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 ‘KDEDIR’ variable is not + sufficient. Note also that the name “kfm” is used even when using + the ‘konqueror’ command with KDE 2 — the implementation selects the + best strategy for running Konqueror. + + 2. Only on Windows platforms. + + 3. Only on macOS platform. + +New in version 3.3: Support for Chrome/Chromium has been added. + +Deprecated since version 3.11, will be removed in version 3.13: ‘MacOSX’ +is deprecated, use ‘MacOSXOSAScript’ instead. + +Here are some simple examples: + + 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) + +* Menu: + +* Browser Controller Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/webbrowser.py + + (2) Executables named here without a full path will be searched in +the directories given in the ‘PATH’ environment variable. + + +File: python.info, Node: Browser Controller Objects, Up: webbrowser — Convenient web-browser controller + +5.21.1.1 Browser Controller Objects +................................... + +Browser controllers provide these methods which parallel three of the +module-level convenience functions: + + -- Attribute: webbrowser.name + + System-dependent name for the browser. + + -- 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. + + -- 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 *note open_new(): 319c. + + -- 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 *note open_new(): + 319c. + + +File: python.info, Node: wsgiref — WSGI Utilities and Reference Implementation, Next: urllib — URL handling modules, Prev: webbrowser — Convenient web-browser controller, Up: Internet Protocols and Support + +5.21.2 ‘wsgiref’ — WSGI Utilities and Reference Implementation +-------------------------------------------------------------- + +__________________________________________________________________ + +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. + +*note wsgiref: 136. 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 ( PEP 3333(1)). + +See wsgi.readthedocs.io(2) for more information about WSGI, and links to +tutorials and other resources. + +* 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<24>. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3333/ + + (2) https://wsgi.readthedocs.io/ + + +File: python.info, Node: wsgiref util – WSGI environment utilities, Next: wsgiref headers – WSGI response header tools, Up: wsgiref — WSGI Utilities and Reference Implementation + +5.21.2.1 ‘wsgiref.util’ – WSGI environment utilities +.................................................... + +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 PEP 3333(1). All of the functions +taking an `environ' parameter expect a WSGI-compliant dictionary to be +supplied; please see PEP 3333(2) for a detailed specification and *note +WSGIEnvironment: 31a9. for a type alias that can be used in type +annotations. + + -- Function: wsgiref.util.guess_scheme (environ) + + Return a guess for whether ‘wsgi.url_scheme’ should be “http” or + “https”, by checking for a ‘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 ‘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. + + -- 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 + PEP 3333(3). If `include_query' is false, the query string is not + included in the resulting URI. + + -- Function: wsgiref.util.application_uri (environ) + + Similar to *note request_uri(): 31ab, except that the ‘PATH_INFO’ + and ‘QUERY_STRING’ variables are ignored. The result is the base + URI of the application object addressed by the request. + + -- Function: wsgiref.util.shift_path_info (environ) + + Shift a single name from ‘PATH_INFO’ to ‘SCRIPT_NAME’ and return + the name. The `environ' dictionary is `modified' in-place; use a + copy if you need to keep the original ‘PATH_INFO’ or ‘SCRIPT_NAME’ + intact. + + If there are no remaining path segments in ‘PATH_INFO’, ‘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 ‘/foo’, and the request URI path is ‘/foo/bar/baz’, + and the WSGI application at ‘/foo’ calls *note shift_path_info(): + 31ad, it will receive the string “bar”, and the environment will be + updated to be suitable for passing to a WSGI application at + ‘/foo/bar’. That is, ‘SCRIPT_NAME’ will change from ‘/foo’ to + ‘/foo/bar’, and ‘PATH_INFO’ will change from ‘/bar/baz’ to ‘/baz’. + + When ‘PATH_INFO’ is just a “/”, this routine returns an empty + string and appends a trailing slash to ‘SCRIPT_NAME’, even though + empty path segments are normally ignored, and ‘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 + ‘/x’ from ones ending in ‘/x/’ when using this routine to do object + traversal. + + -- Function: wsgiref.util.setup_testing_defaults (environ) + + Update `environ' with trivial defaults for testing purposes. + + This routine adds various parameters required for WSGI, including + ‘HTTP_HOST’, ‘SERVER_NAME’, ‘SERVER_PORT’, ‘REQUEST_METHOD’, + ‘SCRIPT_NAME’, ‘PATH_INFO’, and all of the PEP 3333(4)-defined + ‘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: + + 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('', 8000, simple_app) as httpd: + print("Serving on port 8000...") + httpd.serve_forever() + +In addition to the environment functions above, the *note wsgiref.util: +13b. module also provides these miscellaneous utilities: + + -- Function: wsgiref.util.is_hop_by_hop (header_name) + + Return ‘True’ if ‘header_name’ is an HTTP/1.1 “Hop-by-Hop” header, + as defined by RFC 2616(5). + + -- Class: wsgiref.util.FileWrapper (filelike, blksize=8192) + + A concrete implementation of the *note wsgiref.types.FileWrapper: + 31b0. protocol used to convert a file-like object to an *note + iterator: 134f. The resulting objects are *note iterable: ed9.s. + As the object is iterated over, the optional `blksize' parameter + will be repeatedly passed to the `filelike' object’s ‘read()’ + method to obtain bytestrings to yield. When ‘read()’ returns an + empty bytestring, iteration is ended and is not resumable. + + If `filelike' has a ‘close()’ method, the returned object will also + have a ‘close()’ method, and it will invoke the `filelike' object’s + ‘close()’ method when called. + + Example usage: + + 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) + + Changed in version 3.11: Support for ‘__getitem__()’ method has + been removed. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3333/ + + (2) https://peps.python.org/pep-3333/ + + (3) https://peps.python.org/pep-3333/ + + (4) https://peps.python.org/pep-3333/ + + (5) https://datatracker.ietf.org/doc/html/rfc2616.html + + +File: python.info, Node: wsgiref headers – WSGI response header tools, Next: wsgiref simple_server – a simple WSGI HTTP server, Prev: wsgiref util – WSGI environment utilities, Up: wsgiref — WSGI Utilities and Reference Implementation + +5.21.2.2 ‘wsgiref.headers’ – WSGI response header tools +....................................................... + +This module provides a single class, *note Headers: b25, for convenient +manipulation of WSGI response headers using a mapping-like interface. + + -- 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 PEP 3333(1). The + default value of `headers' is an empty list. + + *note Headers: b25. objects support typical mapping operations + including ‘__getitem__()’, ‘get()’, ‘__setitem__()’, + ‘setdefault()’, ‘__delitem__()’ and ‘__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, *note Headers: b25. 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 ‘None’, and + deleting a nonexistent header does nothing. + + *note Headers: b25. objects also support ‘keys()’, ‘values()’, and + ‘items()’ methods. The lists returned by ‘keys()’ and ‘items()’ + can include the same key more than once if there is a multi-valued + header. The ‘len()’ of a *note Headers: b25. object is the same as + the length of its ‘items()’, which is the same as the length of the + wrapped header list. In fact, the ‘items()’ method just returns a + copy of the wrapped header list. + + Calling ‘bytes()’ on a *note Headers: b25. 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, + *note Headers: b25. objects also have the following methods for + querying and adding multi-valued headers, and for adding headers + with MIME parameters: + + -- 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. + + -- 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 ‘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 + ‘name="value"’. If it is ‘None’, only the parameter name is + added. (This is used for MIME parameters without a value.) + Example usage: + + h.add_header('content-disposition', 'attachment', filename='bud.gif') + + The above will add a header that looks like this: + + Content-Disposition: attachment; filename="bud.gif" + + Changed in version 3.5: `headers' parameter is optional. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3333/ + + +File: python.info, Node: wsgiref simple_server – a simple WSGI HTTP server, Next: wsgiref validate — WSGI conformance checker, Prev: wsgiref headers – WSGI response header tools, Up: wsgiref — WSGI Utilities and Reference Implementation + +5.21.2.3 ‘wsgiref.simple_server’ – a simple WSGI HTTP server +............................................................ + +This module implements a simple HTTP server (based on *note http.server: +92.) 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 ‘PATH_INFO’ to select which application to +invoke for each request. (E.g., using the ‘shift_path_info()’ function +from *note wsgiref.util: 13b.) + + -- 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 PEP 3333(1). + + Example usage: + + from wsgiref.simple_server import make_server, demo_app + + with make_server('', 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() + + -- 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 *note + wsgiref.simple_server: 139.) is able to run a simple WSGI + application correctly. + + -- Class: wsgiref.simple_server.WSGIServer (server_address, + RequestHandlerClass) + + Create a *note WSGIServer: 31b7. instance. `server_address' should + be a ‘(host,port)’ tuple, and `RequestHandlerClass' should be the + subclass of *note http.server.BaseHTTPRequestHandler: d76. that + will be used to process requests. + + You do not normally need to call this constructor, as the *note + make_server(): 31b5. function can handle all the details for you. + + *note WSGIServer: 31b7. is a subclass of *note + http.server.HTTPServer: 31b8, so all of its methods (such as + ‘serve_forever()’ and ‘handle_request()’) are available. *note + WSGIServer: 31b7. also provides these WSGI-specific methods: + + -- Method: set_app (application) + + Sets the callable `application' as the WSGI application that + will receive requests. + + -- Method: get_app () + + Returns the currently set application callable. + + Normally, however, you do not need to use these additional methods, + as *note set_app(): 31b9. is normally called by *note + make_server(): 31b5, and the *note get_app(): 31ba. exists mainly + for the benefit of request handler instances. + + -- Class: wsgiref.simple_server.WSGIRequestHandler (request, + client_address, server) + + Create an HTTP handler for the given `request' (i.e. a socket), + `client_address' (a ‘(host,port)’ tuple), and `server' (*note + WSGIServer: 31b7. instance). + + You do not need to create instances of this class directly; they + are automatically created as needed by *note WSGIServer: 31b7. + objects. You can, however, subclass this class and supply it as a + `handler_class' to the *note make_server(): 31b5. function. Some + possibly relevant methods for overriding in subclasses: + + -- Method: get_environ () + + Return a *note WSGIEnvironment: 31a9. dictionary for a + request. The default implementation copies the contents of + the *note WSGIServer: 31b7. object’s ‘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 PEP 3333(2). + + -- Method: get_stderr () + + Return the object that should be used as the ‘wsgi.errors’ + stream. The default implementation just returns ‘sys.stderr’. + + -- Method: handle () + + Process the HTTP request. The default implementation creates + a handler instance using a *note wsgiref.handlers: 137. class + to implement the actual WSGI application interface. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3333/ + + (2) https://peps.python.org/pep-3333/ + + +File: python.info, Node: wsgiref validate — WSGI conformance checker, Next: wsgiref handlers – server/gateway base classes, Prev: wsgiref simple_server – a simple WSGI HTTP server, Up: wsgiref — WSGI Utilities and Reference Implementation + +5.21.2.4 ‘wsgiref.validate’ — WSGI conformance checker +...................................................... + +When creating new WSGI application objects, frameworks, servers, or +middleware, it can be useful to validate the new code’s conformance +using *note wsgiref.validate: 13c. 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 PEP 3333(1) +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 ‘paste.lint’ module from Ian Bicking’s +“Python Paste” library. + + -- 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 + RFC 2616(2). + + Any detected nonconformance results in an *note AssertionError: + 26e. being raised; note, however, that how these errors are handled + is server-dependent. For example, *note wsgiref.simple_server: + 139. and other servers based on *note wsgiref.handlers: 137. (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 ‘sys.stderr’ or some other error stream. + + This wrapper may also generate output using the *note warnings: + 130. module to indicate behaviors that are questionable but which + may not actually be prohibited by PEP 3333(3). Unless they are + suppressed using Python command-line options or the *note warnings: + 130. API, any such warnings will be written to ‘sys.stderr’ (`not' + ‘wsgi.errors’, unless they happen to be the same object). + + Example usage: + + 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('', 8000, validator_app) as httpd: + print("Listening on port 8000....") + httpd.serve_forever() + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3333/ + + (2) https://datatracker.ietf.org/doc/html/rfc2616.html + + (3) https://peps.python.org/pep-3333/ + + +File: python.info, Node: wsgiref handlers – server/gateway base classes, Next: wsgiref types – WSGI types for static type checking, Prev: wsgiref validate — WSGI conformance checker, Up: wsgiref — WSGI Utilities and Reference Implementation + +5.21.2.5 ‘wsgiref.handlers’ – server/gateway base classes +......................................................... + +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. + + -- Class: wsgiref.handlers.CGIHandler + + CGI-based invocation via ‘sys.stdin’, ‘sys.stdout’, ‘sys.stderr’ + and ‘os.environ’. This is useful when you have a WSGI application + and want to run it as a CGI script. Simply invoke + ‘CGIHandler().run(app)’, where ‘app’ is the WSGI application object + you wish to invoke. + + This class is a subclass of *note BaseCGIHandler: 31c3. that sets + ‘wsgi.run_once’ to true, ‘wsgi.multithread’ to false, and + ‘wsgi.multiprocess’ to true, and always uses *note sys: f9. and + *note os: c2. to obtain the necessary CGI streams and environment. + + -- Class: wsgiref.handlers.IISCGIHandler + + A specialized alternative to *note CGIHandler: 31c2, 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 ‘PATH_INFO’ that duplicates the + ‘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 ‘PATH_INFO’, but this + causes another bug where ‘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 + ‘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 *note CGIHandler: 31c2, i.e., by calling + ‘IISCGIHandler().run(app)’, where ‘app’ is the WSGI application + object you wish to invoke. + + New in version 3.2. + + -- Class: wsgiref.handlers.BaseCGIHandler (stdin, stdout, stderr, + environ, multithread=True, multiprocess=False) + + Similar to *note CGIHandler: 31c2, but instead of using the *note + sys: f9. and *note os: c2. modules, the CGI environment and I/O + streams are specified explicitly. The `multithread' and + `multiprocess' values are used to set the ‘wsgi.multithread’ and + ‘wsgi.multiprocess’ flags for any applications run by the handler + instance. + + This class is a subclass of *note SimpleHandler: 31c5. 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 ‘Status:’ header to send an HTTP status, + you probably want to subclass this instead of *note SimpleHandler: + 31c5. + + -- Class: wsgiref.handlers.SimpleHandler (stdin, stdout, stderr, + environ, multithread=True, multiprocess=False) + + Similar to *note BaseCGIHandler: 31c3, 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 + *note BaseCGIHandler: 31c3. + + This class is a subclass of *note BaseHandler: 1420. It overrides + the ‘__init__()’, ‘get_stdin()’, ‘get_stderr()’, ‘add_cgi_vars()’, + ‘_write()’, and ‘_flush()’ methods to support explicitly setting + the environment and streams via the constructor. The supplied + environment and streams are stored in the ‘stdin’, ‘stdout’, + ‘stderr’, and ‘environ’ attributes. + + The *note write(): 94a. method of `stdout' should write each chunk + in full, like *note io.BufferedIOBase: 949. + + -- 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. + + *note BaseHandler: 1420. instances have only one method intended + for external use: + + -- Method: run (app) + + Run the specified WSGI application, `app'. + + All of the other *note BaseHandler: 1420. 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: + + -- Method: _write (data) + + Buffer the bytes `data' for transmission to the client. It’s + okay if this method actually transmits the data; *note + BaseHandler: 1420. just separates write and flush operations + for greater efficiency when the underlying system actually has + such a distinction. + + -- Method: _flush () + + Force buffered data to be transmitted to the client. It’s + okay if this method is a no-op (i.e., if *note _write(): 31c7. + actually sends the data). + + -- Method: get_stdin () + + Return an object compatible with *note InputStream: 31ca. + suitable for use as the ‘wsgi.input’ of the request currently + being processed. + + -- Method: get_stderr () + + Return an object compatible with *note ErrorStream: 31cc. + suitable for use as the ‘wsgi.errors’ of the request currently + being processed. + + -- Method: add_cgi_vars () + + Insert CGI variables for the current request into the + ‘environ’ attribute. + + 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 *note BaseHandler: 1420. + subclass. + + Attributes and methods for customizing the WSGI environment: + + -- Attribute: wsgi_multithread + + The value to be used for the ‘wsgi.multithread’ environment + variable. It defaults to true in *note BaseHandler: 1420, but + may have a different default (or be set by the constructor) in + the other subclasses. + + -- Attribute: wsgi_multiprocess + + The value to be used for the ‘wsgi.multiprocess’ environment + variable. It defaults to true in *note BaseHandler: 1420, but + may have a different default (or be set by the constructor) in + the other subclasses. + + -- Attribute: wsgi_run_once + + The value to be used for the ‘wsgi.run_once’ environment + variable. It defaults to false in *note BaseHandler: 1420, + but *note CGIHandler: 31c2. sets it to true by default. + + -- Attribute: os_environ + + The default environment variables to be included in every + request’s WSGI environment. By default, this is a copy of + ‘os.environ’ at the time that *note wsgiref.handlers: 137. 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. + + -- Attribute: server_software + + If the *note origin_server: 31d3. attribute is set, this + attribute’s value is used to set the default ‘SERVER_SOFTWARE’ + WSGI environment variable, and also to set a default ‘Server:’ + header in HTTP responses. It is ignored for handlers (such as + *note BaseCGIHandler: 31c3. and *note CGIHandler: 31c2.) that + are not HTTP origin servers. + + Changed in version 3.3: The term “Python” is replaced with + implementation specific term like “CPython”, “Jython” etc. + + -- Method: get_scheme () + + Return the URL scheme being used for the current request. The + default implementation uses the ‘guess_scheme()’ function from + *note wsgiref.util: 13b. to guess whether the scheme should be + “http” or “https”, based on the current request’s ‘environ’ + variables. + + -- Method: setup_environ () + + Set the ‘environ’ attribute to a fully populated WSGI + environment. The default implementation uses all of the above + methods and attributes, plus the *note get_stdin(): 31c9, + *note get_stderr(): 31cb, and *note add_cgi_vars(): 31cd. + methods and the *note wsgi_file_wrapper: 31d6. attribute. It + also inserts a ‘SERVER_SOFTWARE’ key if not present, as long + as the *note origin_server: 31d3. attribute is a true value + and the *note server_software: 31d2. attribute is set. + + Methods and attributes for customizing exception handling: + + -- Method: log_exception (exc_info) + + Log the `exc_info' tuple in the server log. `exc_info' is a + ‘(type, value, traceback)’ tuple. The default implementation + simply writes the traceback to the request’s ‘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. + + -- Attribute: traceback_limit + + The maximum number of frames to include in tracebacks output + by the default *note log_exception(): 31d7. method. If + ‘None’, all frames are included. + + -- 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 information using + ‘sys.exc_info()’, and should pass that information to + `start_response' when calling it (as described in the “Error + Handling” section of PEP 3333(1)). + + The default implementation just uses the *note error_status: + 31da, *note error_headers: 31db, and *note error_body: 31dc. + 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. + + -- Attribute: error_status + + The HTTP status used for error responses. This should be a + status string as defined in PEP 3333(2); it defaults to a 500 + code and message. + + -- Attribute: error_headers + + The HTTP headers used for error responses. This should be a + list of WSGI response headers (‘(name, value)’ tuples), as + described in PEP 3333(3). The default list just sets the + content type to ‘text/plain’. + + -- 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.” + + Methods and attributes for PEP 3333(4)’s “Optional + Platform-Specific File Handling” feature: + + -- Attribute: wsgi_file_wrapper + + A ‘wsgi.file_wrapper’ factory, compatible with *note + wsgiref.types.FileWrapper: 31b0, or ‘None’. The default value + of this attribute is the *note wsgiref.util.FileWrapper: 2ff. + class. + + -- 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 *note + wsgi_file_wrapper: 31d6. 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. + + Miscellaneous methods and attributes: + + -- Attribute: origin_server + + This attribute should be set to a true value if the handler’s + *note _write(): 31c7. and *note _flush(): 31c8. 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 ‘Status:’ header. + + This attribute’s default value is true in *note BaseHandler: + 1420, but false in *note BaseCGIHandler: 31c3. and *note + CGIHandler: 31c2. + + -- Attribute: http_version + + If *note origin_server: 31d3. is true, this string attribute + is used to set the HTTP version of the response set to the + client. It defaults to ‘"1.0"’. + + -- Function: wsgiref.handlers.read_environ () + + Transcode CGI variables from ‘os.environ’ to PEP 3333(5) “bytes in + unicode” strings, returning a new dictionary. This function is + used by *note CGIHandler: 31c2. and *note IISCGIHandler: 31c4. in + place of directly using ‘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 ‘os.environ’ directly. + + New in version 3.2. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3333/ + + (2) https://peps.python.org/pep-3333/ + + (3) https://peps.python.org/pep-3333/ + + (4) https://peps.python.org/pep-3333/ + + (5) https://peps.python.org/pep-3333/ + + +File: python.info, Node: wsgiref types – WSGI types for static type checking, Next: Examples<24>, Prev: wsgiref handlers – server/gateway base classes, Up: wsgiref — WSGI Utilities and Reference Implementation + +5.21.2.6 ‘wsgiref.types’ – WSGI types for static type checking +.............................................................. + +This module provides various types for static type checking as described +in PEP 3333(1). + +New in version 3.11. + + -- Class: wsgiref.types.StartResponse + + A *note typing.Protocol: 276. describing start_response()(2) + callables ( PEP 3333(3)). + + -- Data: wsgiref.types.WSGIEnvironment + + A type alias describing a WSGI environment dictionary. + + -- Data: wsgiref.types.WSGIApplication + + A type alias describing a WSGI application callable. + + -- Class: wsgiref.types.InputStream + + A *note typing.Protocol: 276. describing a WSGI Input Stream(4). + + -- Class: wsgiref.types.ErrorStream + + A *note typing.Protocol: 276. describing a WSGI Error Stream(5). + + -- Class: wsgiref.types.FileWrapper + + A *note typing.Protocol: 276. describing a file wrapper(6). See + *note wsgiref.util.FileWrapper: 2ff. for a concrete implementation + of this protocol. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3333/ + + (2) https://peps.python.org/pep-3333/#the-start-response-callable + + (3) https://peps.python.org/pep-3333/ + + (4) https://peps.python.org/pep-3333/#input-and-error-streams + + (5) https://peps.python.org/pep-3333/#input-and-error-streams + + (6) +https://peps.python.org/pep-3333/#optional-platform-specific-file-handling + + +File: python.info, Node: Examples<24>, Prev: wsgiref types – WSGI types for static type checking, Up: wsgiref — WSGI Utilities and Reference Implementation + +5.21.2.7 Examples +................. + +This is a working “Hello World” WSGI application: + + """ + 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() + +Example of a WSGI application serving the current directory, accept +optional directory and port number (default: 8000) on the command line: + + """ + 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_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() + + +File: python.info, Node: urllib — URL handling modules, Next: urllib request — Extensible library for opening URLs, Prev: wsgiref — WSGI Utilities and Reference Implementation, Up: Internet Protocols and Support + +5.21.3 ‘urllib’ — URL handling modules +-------------------------------------- + +`Source code:' Lib/urllib/(1) + +__________________________________________________________________ + +‘urllib’ is a package that collects several modules for working with +URLs: + + * *note urllib.request: 12a. for opening and reading URLs + + * *note urllib.error: 128. containing the exceptions raised by *note + urllib.request: 12a. + + * *note urllib.parse: 129. for parsing URLs + + * *note urllib.robotparser: 12c. for parsing ‘robots.txt’ files + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/urllib/ + + +File: python.info, Node: urllib request — Extensible library for opening URLs, Next: urllib response — Response classes used by urllib, Prev: urllib — URL handling modules, Up: Internet Protocols and Support + +5.21.4 ‘urllib.request’ — Extensible library for opening URLs +------------------------------------------------------------- + +`Source code:' Lib/urllib/request.py(1) + +__________________________________________________________________ + +The *note urllib.request: 12a. module defines functions and classes +which help in opening URLs (mostly HTTP) in a complex world — basic and +digest authentication, redirections, cookies and more. + +See also +........ + +The Requests package(2) is recommended for a higher-level HTTP client +interface. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +The *note urllib.request: 12a. module defines the following functions: + + -- Function: urllib.request.urlopen (url, data=None[, timeout], *, + cafile=None, capath=None, cadefault=False, context=None) + + Open the URL `url', which can be either a string or a *note + Request: c7a. object. + + `data' must be an object specifying additional data to be sent to + the server, or ‘None’ if no such data is needed. See *note + Request: c7a. for details. + + urllib.request module uses HTTP/1.1 and includes ‘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 *note ssl.SSLContext: 430. + instance describing the various SSL options. See *note + HTTPSConnection: 797. for more details. + + The optional `cafile' and `capath' parameters specify a set of + trusted CA certificates for HTTPS requests. `cafile' should point + to a single file containing a bundle of CA certificates, whereas + `capath' should point to a directory of hashed certificate files. + More information can be found in *note + ssl.SSLContext.load_verify_locations(): b7b. + + The `cadefault' parameter is ignored. + + This function always returns an object which can work as a *note + context manager: 1a0. and has the properties `url', `headers', and + `status'. See *note urllib.response.addinfourl: 31e7. for more + detail on these properties. + + For HTTP and HTTPS URLs, this function returns a *note + http.client.HTTPResponse: d79. object slightly modified. In + addition to the three new methods above, the msg attribute contains + the same information as the *note reason: 31e8. attribute — the + reason phrase returned by server — instead of the response headers + as it is specified in the documentation for *note HTTPResponse: + d79. + + For FTP, file, and data URLs and requests explicitly handled by + legacy *note URLopener: 1208. and *note FancyURLopener: 31e9. + classes, this function returns a *note urllib.response.addinfourl: + 31e7. object. + + Raises *note URLError: 31ea. on protocol errors. + + Note that ‘None’ may be returned if no handler handles the request + (though the default installed global *note OpenerDirector: 31eb. + uses *note UnknownHandler: 31ec. to ensure this never happens). + + In addition, if proxy settings are detected (for example, when a + ‘*_proxy’ environment variable like ‘http_proxy’ is set), *note + ProxyHandler: 13f7. is default installed and makes sure the + requests are handled through the proxy. + + The legacy ‘urllib.urlopen’ function from Python 2.6 and earlier + has been discontinued; *note urllib.request.urlopen(): b22. + corresponds to the old ‘urllib2.urlopen’. Proxy handling, which + was done by passing a dictionary parameter to ‘urllib.urlopen’, can + be obtained by using *note ProxyHandler: 13f7. objects. + + The default opener raises an *note auditing event: 12c0. + ‘urllib.Request’ with arguments ‘fullurl’, ‘data’, ‘headers’, + ‘method’ taken from the request object. + + Changed in version 3.2: `cafile' and `capath' were added. + + Changed in version 3.2: HTTPS virtual hosts are now supported if + possible (that is, if *note ssl.HAS_SNI: 2cc4. is true). + + New in version 3.2: `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 ‘http/1.1’ when no `context' is + given. Custom `context' should set ALPN protocols with + ‘set_alpn_protocol()’. + + Deprecated since version 3.6: `cafile', `capath' and `cadefault' + are deprecated in favor of `context'. Please use *note + ssl.SSLContext.load_cert_chain(): df1. instead, or let *note + ssl.create_default_context(): c46. select the system’s trusted CA + certificates for you. + + -- Function: urllib.request.install_opener (opener) + + Install an *note OpenerDirector: 31eb. instance as the default + global opener. Installing an opener is only necessary if you want + urlopen to use that opener; otherwise, simply call *note + OpenerDirector.open(): c7e. instead of *note urlopen(): b22. The + code does not check for a real *note OpenerDirector: 31eb, and any + class with the appropriate interface will work. + + -- Function: urllib.request.build_opener ([handler, ...]) + + Return an *note OpenerDirector: 31eb. instance, which chains the + handlers in the order given. `handler's can be either instances of + *note BaseHandler: 31ef, or subclasses of *note BaseHandler: 31ef. + (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: *note ProxyHandler: 13f7. + (if proxy settings are detected), *note UnknownHandler: 31ec, *note + HTTPHandler: 31f0, *note HTTPDefaultErrorHandler: 31f1, *note + HTTPRedirectHandler: 31f2, *note FTPHandler: 31f3, *note + FileHandler: 31f4, *note HTTPErrorProcessor: 31f5. + + If the Python installation has SSL support (i.e., if the *note ssl: + f0. module can be imported), *note HTTPSHandler: ed5. will also be + added. + + A *note BaseHandler: 31ef. subclass may also change its + ‘handler_order’ attribute to modify its position in the handlers + list. + + -- Function: urllib.request.pathname2url (path) + + Convert the pathname `path' from the local syntax for a path to the + form used in the path component of a URL. This does not produce a + complete URL. The return value will already be quoted using the + *note quote(): 805. function. + + -- Function: urllib.request.url2pathname (path) + + Convert the path component `path' from a percent-encoded URL to the + local syntax for a path. This does not accept a complete URL. This + function uses *note unquote(): 13fa. to decode `path'. + + -- Function: urllib.request.getproxies () + + This helper function returns a dictionary of scheme to proxy server + URL mappings. It scans the environment for variables named + ‘_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. + + Note: If the environment variable ‘REQUEST_METHOD’ is set, + which usually indicates your script is running in a CGI + environment, the environment variable ‘HTTP_PROXY’ (uppercase + ‘_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 + ‘ProxyHandler’ explicitly, or make sure the variable name is + in lowercase (or at least the ‘_proxy’ suffix). + +The following classes are provided: + + -- 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 URL. + + `data' must be an object specifying additional data to send to the + server, or ‘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 ‘Content-Length’ nor ‘Transfer-Encoding’ header + field has been provided, *note HTTPHandler: 31f0. will set these + headers according to the type of `data'. ‘Content-Length’ will be + used to send bytes objects, while ‘Transfer-Encoding: chunked’ as + specified in RFC 7230(3), 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 ‘application/x-www-form-urlencoded’ format. The *note + urllib.parse.urlencode(): b21. 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 *note + add_header(): 31f9. was called with each key and value as + arguments. This is often used to “spoof” the ‘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 + ‘"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 + Firefox/2.0.0.11"’, while *note urllib: 127.’s default user agent + string is ‘"Python-urllib/2.6"’ (on Python 2.6). All header keys + are sent in camel case. + + An appropriate ‘Content-Type’ header should be included if the + `data' argument is present. If this header has not been provided + and `data' is not None, ‘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 RFC 2965(4). It defaults to + ‘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 RFC 2965(5). It defaults to ‘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. ‘'HEAD'’). If provided, its value is + stored in the *note method: c7b. attribute and is used by *note + get_method(): e1d. The default is ‘'GET'’ if `data' is ‘None’ or + ‘'POST'’ otherwise. Subclasses may indicate a different default + method by setting the *note method: c7b. attribute in the class + itself. + + 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. + + Changed in version 3.3: *note Request.method: c7b. argument is + added to the Request class. + + Changed in version 3.4: Default *note Request.method: c7b. may be + indicated at the class level. + + Changed in version 3.6: Do not raise an error if the + ‘Content-Length’ has not been provided and `data' is neither ‘None’ + nor a bytes object. Fall back to use chunked transfer encoding + instead. + + -- Class: urllib.request.OpenerDirector + + The *note OpenerDirector: 31eb. class opens URLs via *note + BaseHandler: 31ef.s chained together. It manages the chaining of + handlers, and recovery from errors. + + -- Class: urllib.request.BaseHandler + + This is the base class for all registered handlers — and handles + only the simple mechanics of registration. + + -- Class: urllib.request.HTTPDefaultErrorHandler + + A class which defines a default handler for HTTP error responses; + all responses are turned into *note HTTPError: c80. exceptions. + + -- Class: urllib.request.HTTPRedirectHandler + + A class to handle redirections. + + -- Class: urllib.request.HTTPCookieProcessor (cookiejar=None) + + A class to handle HTTP Cookies. + + -- 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 ‘_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 ‘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 ‘:port’ + appended, for example ‘cern.ch,ncsa.uiuc.edu,some.host:8080’. + + Note: ‘HTTP_PROXY’ will be ignored if a variable + ‘REQUEST_METHOD’ is set; see the documentation on *note + getproxies(): 31f8. + + -- Class: urllib.request.HTTPPasswordMgr + + Keep a database of ‘(realm, uri) -> (user, password)’ mappings. + + -- Class: urllib.request.HTTPPasswordMgrWithDefaultRealm + + Keep a database of ‘(realm, uri) -> (user, password)’ mappings. A + realm of ‘None’ is considered a catch-all realm, which is searched + if no other realm fits. + + -- Class: urllib.request.HTTPPasswordMgrWithPriorAuth + + A variant of *note HTTPPasswordMgrWithDefaultRealm: 31fc. that also + has a database of ‘uri -> is_authenticated’ mappings. Can be used + by a BasicAuth handler to determine when to send authentication + credentials immediately instead of waiting for a ‘401’ response + first. + + New in version 3.5. + + -- 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 *note HTTPPasswordMgr: 31fb.; + refer to section *note HTTPPasswordMgr Objects: 31fd. for + information on the interface that must be supported. If + `passwd_mgr' also provides ‘is_authenticated’ and + ‘update_authenticated’ methods (see *note + HTTPPasswordMgrWithPriorAuth Objects: 31fe.), then the handler will + use the ‘is_authenticated’ result for a given URI to determine + whether or not to send authentication credentials with the request. + If ‘is_authenticated’ returns ‘True’ for the URI, credentials are + sent. If ‘is_authenticated’ is ‘False’, credentials are not sent, + and then if a ‘401’ response is received the request is re-sent + with the authentication credentials. If authentication succeeds, + ‘update_authenticated’ is called to set ‘is_authenticated’ ‘True’ + for the URI, so that subsequent requests to the URI or any of its + super-URIs will automatically include the authentication + credentials. + + New in version 3.5: Added ‘is_authenticated’ support. + + -- Class: urllib.request.HTTPBasicAuthHandler (password_mgr=None) + + Handle authentication with the remote host. `password_mgr', if + given, should be something that is compatible with *note + HTTPPasswordMgr: 31fb.; refer to section *note HTTPPasswordMgr + Objects: 31fd. for information on the interface that must be + supported. HTTPBasicAuthHandler will raise a *note ValueError: + 1c8. when presented with a wrong Authentication scheme. + + -- Class: urllib.request.ProxyBasicAuthHandler (password_mgr=None) + + Handle authentication with the proxy. `password_mgr', if given, + should be something that is compatible with *note HTTPPasswordMgr: + 31fb.; refer to section *note HTTPPasswordMgr Objects: 31fd. for + information on the interface that must be supported. + + -- 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 *note HTTPPasswordMgr: 31fb.; + refer to section *note HTTPPasswordMgr Objects: 31fd. for + information on the interface that must be supported. + + -- Class: urllib.request.HTTPDigestAuthHandler (password_mgr=None) + + Handle authentication with the remote host. `password_mgr', if + given, should be something that is compatible with *note + HTTPPasswordMgr: 31fb.; refer to section *note HTTPPasswordMgr + Objects: 31fd. 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 *note ValueError: 1c8. + when presented with an authentication scheme other than Digest or + Basic. + + Changed in version 3.3: Raise *note ValueError: 1c8. on unsupported + Authentication Scheme. + + -- Class: urllib.request.ProxyDigestAuthHandler (password_mgr=None) + + Handle authentication with the proxy. `password_mgr', if given, + should be something that is compatible with *note HTTPPasswordMgr: + 31fb.; refer to section *note HTTPPasswordMgr Objects: 31fd. for + information on the interface that must be supported. + + -- Class: urllib.request.HTTPHandler + + A class to handle opening of HTTP URLs. + + -- 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 *note + http.client.HTTPSConnection: 797. + + Changed in version 3.2: `context' and `check_hostname' were added. + + -- Class: urllib.request.FileHandler + + Open local files. + + -- Class: urllib.request.DataHandler + + Open data URLs. + + New in version 3.4. + + -- Class: urllib.request.FTPHandler + + Open FTP URLs. + + -- Class: urllib.request.CacheFTPHandler + + Open FTP URLs, keeping a cache of open FTP connections to minimize + delays. + + -- Class: urllib.request.UnknownHandler + + A catch-all class to handle unknown URLs. + + -- Class: urllib.request.HTTPErrorProcessor + + Process HTTP error responses. + +* 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<25>. +* Legacy interface:: +* urllib.request Restrictions: urllib request Restrictions. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/urllib/request.py + + (2) https://requests.readthedocs.io/en/master/ + + (3) https://datatracker.ietf.org/doc/html/rfc7230.html + + (4) https://datatracker.ietf.org/doc/html/rfc2965.html + + (5) https://datatracker.ietf.org/doc/html/rfc2965.html + + +File: python.info, Node: Request Objects, Next: OpenerDirector Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.1 Request Objects +........................ + +The following methods describe *note Request: c7a.’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. + + -- 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 *note full_url: c7c. returns the original request URL with + the fragment, if it was present. + + -- Attribute: Request.type + + The URI scheme. + + -- Attribute: Request.host + + The URI authority, typically a host, but may also contain a port + separated by a colon. + + -- Attribute: Request.origin_req_host + + The original host for the request, without port. + + -- Attribute: Request.selector + + The URI path. If the *note Request: c7a. uses a proxy, then + selector will be the full URL that is passed to the proxy. + + -- Attribute: Request.data + + The entity body for the request, or ‘None’ if not specified. + + Changed in version 3.4: Changing value of *note Request.data: c7d. + now deletes “Content-Length” header if it was previously set or + calculated. + + -- Attribute: Request.unverifiable + + boolean, indicates whether the request is unverifiable as defined + by RFC 2965(1). + + -- Attribute: Request.method + + The HTTP request method to use. By default its value is *note + None: 243, which means that *note get_method(): e1d. will do its + normal computation of the method to be used. Its value can be set + (thus overriding the default computation in *note get_method(): + e1d.) either by providing a default value by setting it at the + class level in a *note Request: c7a. subclass, or by passing a + value in to the *note Request: c7a. constructor via the `method' + argument. + + New 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. + + -- Method: Request.get_method () + + Return a string indicating the HTTP request method. If *note + Request.method: c7b. is not ‘None’, return its value, otherwise + return ‘'GET'’ if *note Request.data: c7d. is ‘None’, or ‘'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 *note + Request.method: c7b. + + -- 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. + + -- Method: Request.add_unredirected_header (key, header) + + Add a header that will not be added to a redirected request. + + -- Method: Request.has_header (header) + + Return whether the instance has the named header (checks both + regular and unredirected). + + -- Method: Request.remove_header (header) + + Remove named header from the request instance (both from regular + and unredirected headers). + + New in version 3.4. + + -- Method: Request.get_full_url () + + Return the URL given in the constructor. + + Changed in version 3.4. + + Returns *note Request.full_url: c7c. + + -- 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. + + -- 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. + + -- Method: Request.header_items () + + Return a list of tuples (header_name, header_value) of the Request + headers. + +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. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2965.html + + +File: python.info, Node: OpenerDirector Objects, Next: BaseHandler Objects, Prev: Request Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.2 OpenerDirector Objects +............................... + +*note OpenerDirector: 31eb. instances have the following methods: + + -- Method: OpenerDirector.add_handler (handler) + + `handler' should be an instance of *note BaseHandler: 31ef. 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 ‘http_response()’ would be the HTTP protocol + response handler. Also `type' should be replaced with the actual + HTTP code, for example ‘http_error_404()’ would handle HTTP 404 + errors. + + * ‘_open()’ — signal that the handler knows how to + open `protocol' URLs. + + See *note BaseHandler._open(): 3214. for more + information. + + * ‘http_error_()’ — signal that the handler knows how to + handle HTTP errors with HTTP error code `type'. + + See *note BaseHandler.http_error_(): 3215. for more + information. + + * ‘_error()’ — signal that the handler knows how to + handle errors from (non-‘http’) `protocol'. + + * ‘_request()’ — signal that the handler knows how to + pre-process `protocol' requests. + + See *note BaseHandler._request(): 3216. for more + information. + + * ‘_response()’ — signal that the handler knows how to + post-process `protocol' responses. + + See *note BaseHandler._response(): 3217. for more + information. + + -- 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 *note urlopen(): b22. + (which simply calls the *note open(): 30b. method on the currently + installed global *note OpenerDirector: 31eb.). 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. + + -- 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 ‘http_error_()’ methods + of the handler classes. + + Return values and exceptions raised are the same as those of *note + urlopen(): b22. + +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. + + 1. Every handler with a method named like ‘_request()’ has + that method called to pre-process the request. + + 2. Handlers with a method named like ‘_open()’ are called to + handle the request. This stage ends when a handler either returns + a non-*note None: 243. value (ie. a response), or raises an + exception (usually *note URLError: 31ea.). Exceptions are allowed + to propagate. + + In fact, the above algorithm is first tried for methods named + ‘default_open()’. If all such methods return *note None: 243, the + algorithm is repeated for methods named like ‘_open()’. + If all such methods return *note None: 243, the algorithm is + repeated for methods named ‘unknown_open()’. + + Note that the implementation of these methods may involve calls of + the parent *note OpenerDirector: 31eb. instance’s *note open(): + c7e. and *note error(): 3218. methods. + + 3. Every handler with a method named like ‘_response()’ has + that method called to post-process the response. + + +File: python.info, Node: BaseHandler Objects, Next: HTTPRedirectHandler Objects, Prev: OpenerDirector Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.3 BaseHandler Objects +............................ + +*note BaseHandler: 31ef. 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: + + -- Method: BaseHandler.add_parent (director) + + Add a director as parent. + + -- Method: BaseHandler.close () + + Remove any parents. + +The following attribute and methods should only be used by classes +derived from *note BaseHandler: 31ef. + + Note: The convention has been adopted that subclasses defining + ‘_request()’ or ‘_response()’ methods are named + ‘*Processor’; all others are named ‘*Handler’. + + -- Attribute: BaseHandler.parent + + A valid *note OpenerDirector: 31eb, which can be used to open using + a different protocol, or handle errors. + + -- Method: BaseHandler.default_open (req) + + This method is `not' defined in *note BaseHandler: 31ef, but + subclasses should define it if they want to catch all URLs. + + This method, if implemented, will be called by the parent *note + OpenerDirector: 31eb. It should return a file-like object as + described in the return value of the *note open(): c7e. method of + *note OpenerDirector: 31eb, or ‘None’. It should raise *note + URLError: 31ea, unless a truly exceptional thing happens (for + example, *note MemoryError: 127a. should not be mapped to + ‘URLError’). + + This method will be called before any protocol-specific open + method. + + -- Method: BaseHandler._open(req) + + This method is `not' defined in *note BaseHandler: 31ef, 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 *note + OpenerDirector: 31eb. Return values should be the same as for + ‘default_open()’. + + -- Method: BaseHandler.unknown_open (req) + + This method is `not' defined in *note BaseHandler: 31ef, 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 *note parent: + 321d. *note OpenerDirector: 31eb. Return values should be the same + as for *note default_open(): 321e. + + -- Method: BaseHandler.http_error_default (req, fp, code, msg, hdrs) + + This method is `not' defined in *note BaseHandler: 31ef, 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 *note OpenerDirector: 31eb. getting the error, + and should not normally be called in other circumstances. + + `req' will be a *note Request: c7a. object, `fp' will be a + file-like object with the HTTP error body, `code' will be the + three-digit code of the error, `msg' will be the user-visible + explanation of the code and `hdrs' will be a mapping object with + the headers of the error. + + Return values and exceptions raised should be the same as those of + *note urlopen(): b22. + + -- Method: BaseHandler.http_error_(req, fp, code, msg, hdrs) + + `nnn' should be a three-digit HTTP error code. This method is also + not defined in *note BaseHandler: 31ef, 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 ‘http_error_default()’. + + -- Method: BaseHandler._request(req) + + This method is `not' defined in *note BaseHandler: 31ef, 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 *note + OpenerDirector: 31eb. `req' will be a *note Request: c7a. object. + The return value should be a *note Request: c7a. object. + + -- Method: BaseHandler._response(req, response) + + This method is `not' defined in *note BaseHandler: 31ef, 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 *note + OpenerDirector: 31eb. `req' will be a *note Request: c7a. object. + `response' will be an object implementing the same interface as the + return value of *note urlopen(): b22. The return value should + implement the same interface as the return value of *note + urlopen(): b22. + + +File: python.info, Node: HTTPRedirectHandler Objects, Next: HTTPCookieProcessor Objects, Prev: BaseHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.4 HTTPRedirectHandler Objects +.................................... + + Note: Some HTTP redirections require action from this module’s + client code. If this is the case, *note HTTPError: c80. is raised. + See RFC 2616(1) for details of the precise meanings of the various + redirection codes. + + An ‘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. + + -- Method: HTTPRedirectHandler.redirect_request (req, fp, code, msg, + hdrs, newurl) + + Return a *note Request: c7a. or ‘None’ in response to a redirect. + This is called by the default implementations of the + ‘http_error_30*()’ methods when a redirection is received from the + server. If a redirection should take place, return a new *note + Request: c7a. to allow ‘http_error_30*()’ to perform the redirect + to `newurl'. Otherwise, raise *note HTTPError: c80. if no other + handler should try to handle this URL, or return ‘None’ if you + can’t but another handler might. + + Note: The default implementation of this method does not + strictly follow RFC 2616(2), which says that 301 and 302 + responses to ‘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 ‘GET’, and the default implementation + reproduces this behavior. + + -- Method: HTTPRedirectHandler.http_error_301 (req, fp, code, msg, + hdrs) + + Redirect to the ‘Location:’ or ‘URI:’ URL. This method is called by + the parent *note OpenerDirector: 31eb. when getting an HTTP ‘moved + permanently’ response. + + -- Method: HTTPRedirectHandler.http_error_302 (req, fp, code, msg, + hdrs) + + The same as *note http_error_301(): 3224, but called for the + ‘found’ response. + + -- Method: HTTPRedirectHandler.http_error_303 (req, fp, code, msg, + hdrs) + + The same as *note http_error_301(): 3224, but called for the ‘see + other’ response. + + -- Method: HTTPRedirectHandler.http_error_307 (req, fp, code, msg, + hdrs) + + The same as *note http_error_301(): 3224, but called for the + ‘temporary redirect’ response. It does not allow changing the + request method from ‘POST’ to ‘GET’. + + -- Method: HTTPRedirectHandler.http_error_308 (req, fp, code, msg, + hdrs) + + The same as *note http_error_301(): 3224, but called for the + ‘permanent redirect’ response. It does not allow changing the + request method from ‘POST’ to ‘GET’. + + New in version 3.11. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2616.html + + (2) https://datatracker.ietf.org/doc/html/rfc2616.html + + +File: python.info, Node: HTTPCookieProcessor Objects, Next: ProxyHandler Objects, Prev: HTTPRedirectHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.5 HTTPCookieProcessor Objects +.................................... + +*note HTTPCookieProcessor: 31fa. instances have one attribute: + + -- Attribute: HTTPCookieProcessor.cookiejar + + The *note http.cookiejar.CookieJar: 322c. in which cookies are + stored. + + +File: python.info, Node: ProxyHandler Objects, Next: HTTPPasswordMgr Objects, Prev: HTTPCookieProcessor Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.6 ProxyHandler Objects +............................. + + -- Method: ProxyHandler._open(request) + + The *note ProxyHandler: 13f7. will have a method + ‘_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 + ‘request.set_proxy()’, and call the next handler in the chain to + actually execute the protocol. + + +File: python.info, Node: HTTPPasswordMgr Objects, Next: HTTPPasswordMgrWithPriorAuth Objects, Prev: ProxyHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.7 HTTPPasswordMgr Objects +................................ + +These methods are available on *note HTTPPasswordMgr: 31fb. and *note +HTTPPasswordMgrWithDefaultRealm: 31fc. objects. + + -- 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 ‘(user, passwd)’ + to be used as authentication tokens when authentication for `realm' + and a super-URI of any of the given URIs is given. + + -- Method: HTTPPasswordMgr.find_user_password (realm, authuri) + + Get user/password for given realm and URI, if any. This method + will return ‘(None, None)’ if there is no matching user/password. + + For *note HTTPPasswordMgrWithDefaultRealm: 31fc. objects, the realm + ‘None’ will be searched if the given `realm' has no matching + user/password. + + +File: python.info, Node: HTTPPasswordMgrWithPriorAuth Objects, Next: AbstractBasicAuthHandler Objects, Prev: HTTPPasswordMgr Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.8 HTTPPasswordMgrWithPriorAuth Objects +............................................. + +This password manager extends *note HTTPPasswordMgrWithDefaultRealm: +31fc. to support tracking URIs for which authentication credentials +should always be sent. + + -- Method: HTTPPasswordMgrWithPriorAuth.add_password (realm, uri, user, + passwd, is_authenticated=False) + + `realm', `uri', `user', `passwd' are as for *note + HTTPPasswordMgr.add_password(): 3230. `is_authenticated' sets the + initial value of the ‘is_authenticated’ flag for the given URI or + list of URIs. If `is_authenticated' is specified as ‘True’, + `realm' is ignored. + + -- Method: HTTPPasswordMgrWithPriorAuth.find_user_password (realm, + authuri) + + Same as for *note HTTPPasswordMgrWithDefaultRealm: 31fc. objects + + -- Method: HTTPPasswordMgrWithPriorAuth.update_authenticated (self, + uri, is_authenticated=False) + + Update the ‘is_authenticated’ flag for the given `uri' or list of + URIs. + + -- Method: HTTPPasswordMgrWithPriorAuth.is_authenticated (self, + authuri) + + Returns the current state of the ‘is_authenticated’ flag for the + given URI. + + +File: python.info, Node: AbstractBasicAuthHandler Objects, Next: HTTPBasicAuthHandler Objects, Prev: HTTPPasswordMgrWithPriorAuth Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.9 AbstractBasicAuthHandler Objects +......................................... + + -- 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) *note Request: c7a. object, and + `headers' should be the error headers. + + `host' is either an authority (e.g. ‘"python.org"’) or a URL + containing an authority component (e.g. ‘"http://python.org/"’). + In either case, the authority must not contain a userinfo component + (so, ‘"python.org"’ and ‘"python.org:80"’ are fine, + ‘"joe:password@python.org"’ is not). + + +File: python.info, Node: HTTPBasicAuthHandler Objects, Next: ProxyBasicAuthHandler Objects, Prev: AbstractBasicAuthHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.10 HTTPBasicAuthHandler Objects +...................................... + + -- Method: HTTPBasicAuthHandler.http_error_401 (req, fp, code, msg, + hdrs) + + Retry the request with authentication information, if available. + + +File: python.info, Node: ProxyBasicAuthHandler Objects, Next: AbstractDigestAuthHandler Objects, Prev: HTTPBasicAuthHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.11 ProxyBasicAuthHandler Objects +....................................... + + -- Method: ProxyBasicAuthHandler.http_error_407 (req, fp, code, msg, + hdrs) + + Retry the request with authentication information, if available. + + +File: python.info, Node: AbstractDigestAuthHandler Objects, Next: HTTPDigestAuthHandler Objects, Prev: ProxyBasicAuthHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.12 AbstractDigestAuthHandler Objects +........................................... + + -- 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) *note + Request: c7a. object, and `headers' should be the error headers. + + +File: python.info, Node: HTTPDigestAuthHandler Objects, Next: ProxyDigestAuthHandler Objects, Prev: AbstractDigestAuthHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.13 HTTPDigestAuthHandler Objects +....................................... + + -- Method: HTTPDigestAuthHandler.http_error_401 (req, fp, code, msg, + hdrs) + + Retry the request with authentication information, if available. + + +File: python.info, Node: ProxyDigestAuthHandler Objects, Next: HTTPHandler Objects, Prev: HTTPDigestAuthHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.14 ProxyDigestAuthHandler Objects +........................................ + + -- Method: ProxyDigestAuthHandler.http_error_407 (req, fp, code, msg, + hdrs) + + Retry the request with authentication information, if available. + + +File: python.info, Node: HTTPHandler Objects, Next: HTTPSHandler Objects, Prev: ProxyDigestAuthHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.15 HTTPHandler Objects +............................. + + -- Method: HTTPHandler.http_open (req) + + Send an HTTP request, which can be either GET or POST, depending on + ‘req.has_data()’. + + +File: python.info, Node: HTTPSHandler Objects, Next: FileHandler Objects, Prev: HTTPHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.16 HTTPSHandler Objects +.............................. + + -- Method: HTTPSHandler.https_open (req) + + Send an HTTPS request, which can be either GET or POST, depending + on ‘req.has_data()’. + + +File: python.info, Node: FileHandler Objects, Next: DataHandler Objects, Prev: HTTPSHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.17 FileHandler Objects +............................. + + -- Method: FileHandler.file_open (req) + + Open the file locally, if there is no host name, or the host name + is ‘'localhost'’. + + Changed in version 3.2: This method is applicable only for local + hostnames. When a remote hostname is given, an *note URLError: + 31ea. is raised. + + +File: python.info, Node: DataHandler Objects, Next: FTPHandler Objects, Prev: FileHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.18 DataHandler Objects +............................. + + -- 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 RFC 2397(1). + 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 an *note ValueError: 1c8. in that case. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2397.html + + +File: python.info, Node: FTPHandler Objects, Next: CacheFTPHandler Objects, Prev: DataHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.19 FTPHandler Objects +............................ + + -- Method: FTPHandler.ftp_open (req) + + Open the FTP file indicated by `req'. The login is always done + with empty username and password. + + +File: python.info, Node: CacheFTPHandler Objects, Next: UnknownHandler Objects, Prev: FTPHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.20 CacheFTPHandler Objects +................................. + +*note CacheFTPHandler: 3203. objects are *note FTPHandler: 31f3. objects +with the following additional methods: + + -- Method: CacheFTPHandler.setTimeout (t) + + Set timeout of connections to `t' seconds. + + -- Method: CacheFTPHandler.setMaxConns (m) + + Set maximum number of cached connections to `m'. + + +File: python.info, Node: UnknownHandler Objects, Next: HTTPErrorProcessor Objects, Prev: CacheFTPHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.21 UnknownHandler Objects +................................ + + -- Method: UnknownHandler.unknown_open () + + Raise a *note URLError: 31ea. exception. + + +File: python.info, Node: HTTPErrorProcessor Objects, Next: Examples<25>, Prev: UnknownHandler Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.22 HTTPErrorProcessor Objects +.................................... + + -- 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 + ‘http_error_()’ handler methods, via *note + OpenerDirector.error(): 3218. Eventually, *note + HTTPDefaultErrorHandler: 31f1. will raise an *note HTTPError: c80. + if no other handler handles the error. + + -- Method: HTTPErrorProcessor.https_response (request, response) + + Process HTTPS error responses. + + The behavior is same as *note http_response(): 325f. + + +File: python.info, Node: Examples<25>, Next: Legacy interface, Prev: HTTPErrorProcessor Objects, Up: urllib request — Extensible library for opening URLs + +5.21.4.23 Examples +.................. + +In addition to the examples below, more examples are given in *note +HOWTO Fetch Internet Resources Using The urllib Package: 3263. + +This example gets the python.org main page and displays the first 300 +bytes of it. + + >>> import urllib.request + >>> with urllib.request.urlopen('http://www.python.org/') as f: + ... print(f.read(300)) + ... + b'\n\n\n\n\n\n + \n + Python Programming ' + +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 W3C document, +‘https://www.w3.org/International/O-charset’, lists the various ways in +which an (X)HTML or an XML document could have specified its encoding +information. + +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. + + >>> with urllib.request.urlopen('http://www.python.org/') as f: + ... print(f.read(100).decode('utf-8')) + ... + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtm + +It is also possible to achieve the same result without using the *note +context manager: 1a0. approach. + + >>> import urllib.request + >>> f = urllib.request.urlopen('http://www.python.org/') + >>> print(f.read(100).decode('utf-8')) + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtm + +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. + + >>> 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" + +The code for the sample CGI used in the above example is: + + #!/usr/bin/env python + import sys + data = sys.stdin.read() + print('Content-type: text/plain\n\nGot Data: "%s"' % data) + +Here is an example of doing a ‘PUT’ request using *note Request: c7a.: + + 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) + +Use of Basic HTTP Authentication: + + 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) + urllib.request.urlopen('http://www.example.com/login.html') + +*note build_opener(): 31ee. provides many handlers by default, including +a *note ProxyHandler: 13f7. By default, *note ProxyHandler: 13f7. uses +the environment variables named ‘<scheme>_proxy’, where ‘<scheme>’ is +the URL scheme involved. For example, the ‘http_proxy’ environment +variable is read to obtain the HTTP proxy’s URL. + +This example replaces the default *note ProxyHandler: 13f7. with one +that uses programmatically supplied proxy URLs, and adds proxy +authorization support with *note ProxyBasicAuthHandler: 3200. + + 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: + opener.open('http://www.example.com/login.html') + +Adding HTTP headers: + +Use the `headers' argument to the *note Request: c7a. constructor, or: + + import urllib.request + req = urllib.request.Request('http://www.example.com/') + req.add_header('Referer', 'http://www.python.org/') + # Customize the default User-Agent header value: + req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)') + r = urllib.request.urlopen(req) + +*note OpenerDirector: 31eb. automatically adds a ‘User-Agent’ header to +every *note Request: c7a. To change this: + + import urllib.request + opener = urllib.request.build_opener() + opener.addheaders = [('User-agent', 'Mozilla/5.0')] + opener.open('http://www.example.com/') + +Also, remember that a few standard headers (‘Content-Length’, +‘Content-Type’ and ‘Host’) are added when the *note Request: c7a. is +passed to *note urlopen(): b22. (or *note OpenerDirector.open(): c7e.). +Here is an example session that uses the ‘GET’ method to retrieve a URL +containing parameters: + + >>> import urllib.request + >>> import urllib.parse + >>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) + >>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params + >>> with urllib.request.urlopen(url) as f: + ... print(f.read().decode('utf-8')) + ... + +The following example uses the ‘POST’ method instead. Note that params +output from urlencode is encoded to bytes before it is sent to urlopen +as data: + + >>> import urllib.request + >>> import urllib.parse + >>> data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) + >>> data = data.encode('ascii') + >>> with urllib.request.urlopen("http://requestb.in/xrbl82xr", data) as f: + ... print(f.read().decode('utf-8')) + ... + +The following example uses an explicitly specified HTTP proxy, +overriding environment settings: + + >>> import urllib.request + >>> proxies = {'http': 'http://proxy.example.com:8080/'} + >>> opener = urllib.request.FancyURLopener(proxies) + >>> with opener.open("http://www.python.org") as f: + ... f.read().decode('utf-8') + ... + +The following example uses no proxies at all, overriding environment +settings: + + >>> import urllib.request + >>> opener = urllib.request.FancyURLopener({}) + >>> with opener.open("http://www.python.org/") as f: + ... f.read().decode('utf-8') + ... + + +File: python.info, Node: Legacy interface, Next: urllib request Restrictions, Prev: Examples<25>, Up: urllib request — Extensible library for opening URLs + +5.21.4.24 Legacy interface +.......................... + +The following functions and classes are ported from the Python 2 module +‘urllib’ (as opposed to ‘urllib2’). They might become deprecated at +some point in the future. + + -- 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 ‘(filename, headers)’ where + `filename' is the local file name under which the object can be + found, and `headers' is whatever the ‘info()’ method of the object + returned by *note urlopen(): b22. returned (for a remote object). + Exceptions are the same as for *note urlopen(): b22. + + 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 ‘-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: + + >>> import urllib.request + >>> local_filename, headers = urllib.request.urlretrieve('http://python.org/') + >>> html = open(local_filename) + >>> html.close() + + If the `url' uses the ‘http:’ scheme identifier, the optional + `data' argument may be given to specify a ‘POST’ request (normally + the request type is ‘GET’). The `data' argument must be a bytes + object in standard ‘application/x-www-form-urlencoded’ format; see + the *note urllib.parse.urlencode(): b21. function. + + *note urlretrieve(): 3266. will raise ‘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 ‘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. + + -- Function: urllib.request.urlcleanup () + + Cleans up temporary files that may have been left behind by + previous calls to *note urlretrieve(): 3266. + + -- Class: urllib.request.URLopener (proxies=None, **x509) + + Deprecated since version 3.3. + + Base class for opening and reading URLs. Unless you need to + support opening objects using schemes other than ‘http:’, ‘ftp:’, + or ‘file:’, you probably want to use *note FancyURLopener: 31e9. + + By default, the *note URLopener: 1208. class sends a ‘User-Agent’ + header of ‘urllib/VVV’, where `VVV' is the *note urllib: 127. + version number. Applications can define their own ‘User-Agent’ + header by subclassing *note URLopener: 1208. or *note + FancyURLopener: 31e9. and setting the class attribute *note + version: 3267. to an appropriate string value in the subclass + definition. + + The optional `proxies' parameter should be a dictionary mapping + scheme names to proxy URLs, where an empty dictionary turns proxies + off completely. Its default value is ‘None’, in which case + environmental proxy settings will be used if present, as discussed + in the definition of *note urlopen(): b22, above. + + Additional keyword parameters, collected in `x509', may be used for + authentication of the client when using the ‘https:’ scheme. The + keywords `key_file' and `cert_file' are supported to provide an SSL + key and certificate; both are needed to support client + authentication. + + *note URLopener: 1208. objects will raise an *note OSError: 413. + exception if the server returns an error code. + + -- Method: open (fullurl, data=None) + + Open `fullurl' using the appropriate protocol. This method + sets up cache and proxy information, then calls the + appropriate open method with its input arguments. If the + scheme is not recognized, *note open_unknown(): 3269. is + called. The `data' argument has the same meaning as the + `data' argument of *note urlopen(): b22. + + This method always quotes `fullurl' using *note quote(): 805. + + -- Method: open_unknown (fullurl, data=None) + + Overridable interface to open unknown URL types. + + -- Method: retrieve (url, filename=None, reporthook=None, + data=None) + + Retrieves the contents of `url' and places it in `filename'. + The return value is a tuple consisting of a local filename and + either an *note email.message.Message: 90b. object containing + the response headers (for remote URLs) or ‘None’ (for local + URLs). The caller must then open and read the contents of + `filename'. If `filename' is not given and the URL refers to + a local file, the input filename is returned. If the URL is + non-local and `filename' is not given, the filename is the + output of *note tempfile.mktemp(): 128a. with a suffix that + matches the suffix of the last path component of the input + URL. If `reporthook' is given, it must be a function accepting + three numeric parameters: A chunk number, the maximum size + chunks are read in and the total size of the download (-1 if + unknown). It will be called once at the start and after each + chunk of data is read from the network. `reporthook' is + ignored for local URLs. + + If the `url' uses the ‘http:’ scheme identifier, the optional + `data' argument may be given to specify a ‘POST’ request + (normally the request type is ‘GET’). The `data' argument + must in standard ‘application/x-www-form-urlencoded’ format; + see the *note urllib.parse.urlencode(): b21. function. + + -- Attribute: version + + Variable that specifies the user agent of the opener object. + To get *note urllib: 127. to tell servers that it is a + particular user agent, set this in a subclass as a class + variable or in the constructor before calling the base + constructor. + + -- Class: urllib.request.FancyURLopener (...) + + Deprecated since version 3.3. + + *note FancyURLopener: 31e9. subclasses *note URLopener: 1208. + providing default handling for the following HTTP response codes: + 301, 302, 303, 307 and 401. For the 30x response codes listed + above, the ‘Location’ header is used to fetch the actual URL. For + 401 response codes (authentication required), basic HTTP + authentication is performed. For the 30x response codes, recursion + is bounded by the value of the `maxtries' attribute, which defaults + to 10. + + For all other response codes, the method ‘http_error_default()’ is + called which you can override in subclasses to handle the error + appropriately. + + Note: According to the letter of RFC 2616(1), 301 and 302 + responses to 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 GET, and *note urllib: 127. reproduces + this behaviour. + + The parameters to the constructor are the same as those for *note + URLopener: 1208. + + Note: When performing basic authentication, a *note + FancyURLopener: 31e9. instance calls its *note + prompt_user_passwd(): 326a. method. The default + implementation asks the users for the required information on + the controlling terminal. A subclass may override this method + to support more appropriate behavior if needed. + + The *note FancyURLopener: 31e9. class offers one additional method + that should be overloaded to provide the appropriate behavior: + + -- Method: prompt_user_passwd (host, realm) + + Return information needed to authenticate the user at the + given host in the specified security realm. The return value + should be a tuple, ‘(user, password)’, which can be used for + basic authentication. + + The implementation prompts for this information on the + terminal; an application should override this method to use an + appropriate interaction model in the local environment. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2616.html + + +File: python.info, Node: urllib request Restrictions, Prev: Legacy interface, Up: urllib request — Extensible library for opening URLs + +5.21.4.25 ‘urllib.request’ Restrictions +....................................... + + * 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. + + * The caching feature of *note urlretrieve(): 3266. has been disabled + until someone finds the time to hack proper processing of + Expiration time headers. + + * There should be a function to query whether a particular URL is in + the cache. + + * 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. + + * The *note urlopen(): b22. and *note urlretrieve(): 3266. 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. + + * The data returned by *note urlopen(): b22. or *note urlretrieve(): + 3266. 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 ‘Content-Type’ header. If the + returned data is HTML, you can use the module *note html.parser: + 8d. to parse it. + + * 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 ‘/’, 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 ‘/’ 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 *note ftplib: 7e. module, subclassing + *note FancyURLopener: 31e9, or changing `_urlopener' to meet your + needs. + + +File: python.info, Node: urllib response — Response classes used by urllib, Next: urllib parse — Parse URLs into components, Prev: urllib request — Extensible library for opening URLs, Up: Internet Protocols and Support + +5.21.5 ‘urllib.response’ — Response classes used by urllib +---------------------------------------------------------- + +The *note urllib.response: 12b. module defines functions and classes +which define a minimal file-like interface, including ‘read()’ and +‘readline()’. Functions defined by this module are used internally by +the *note urllib.request: 12a. module. The typical response object is a +*note urllib.response.addinfourl: 31e7. instance: + + -- Class: urllib.response.addinfourl + + -- Attribute: url + + URL of the resource retrieved, commonly used to determine if a + redirect was followed. + + -- Attribute: headers + + Returns the headers of the response in the form of an *note + EmailMessage: 90c. instance. + + -- Attribute: status + + New in version 3.9. + + Status code returned by server. + + -- Method: geturl () + + Deprecated since version 3.9: Deprecated in favor of *note + url: 326d. + + -- Method: info () + + Deprecated since version 3.9: Deprecated in favor of *note + headers: 326e. + + -- Attribute: code + + Deprecated since version 3.9: Deprecated in favor of *note + status: 326f. + + -- Method: getstatus () + + Deprecated since version 3.9: Deprecated in favor of *note + status: 326f. + + +File: python.info, Node: urllib parse — Parse URLs into components, Next: urllib error — Exception classes raised by urllib request, Prev: urllib response — Response classes used by urllib, Up: Internet Protocols and Support + +5.21.6 ‘urllib.parse’ — Parse URLs into components +-------------------------------------------------- + +`Source code:' Lib/urllib/parse.py(1) + +__________________________________________________________________ + +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: +‘file’, ‘ftp’, ‘gopher’, ‘hdl’, ‘http’, ‘https’, ‘imap’, ‘mailto’, +‘mms’, ‘news’, ‘nntp’, ‘prospero’, ‘rsync’, ‘rtsp’, ‘rtspu’, ‘sftp’, +‘shttp’, ‘sip’, ‘sips’, ‘snews’, ‘svn’, ‘svn+ssh’, ‘telnet’, ‘wais’, +‘ws’, ‘wss’. + +The *note urllib.parse: 129. module defines functions that fall into two +broad categories: URL parsing and URL quoting. These are covered in +detail in the following sections. + +* Menu: + +* URL Parsing:: +* Parsing ASCII Encoded Bytes:: +* Structured Parse Results:: +* URL Quoting:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/urllib/parse.py + + +File: python.info, Node: URL Parsing, Next: Parsing ASCII Encoded Bytes, Up: urllib parse — Parse URLs into components + +5.21.6.1 URL Parsing +.................... + +The URL parsing functions focus on splitting a URL string into its +components, or on combining URL components into a URL string. + + -- Function: urllib.parse.urlparse (urlstring, scheme='', + allow_fragments=True) + + Parse a URL into six components, returning a 6-item *note named + tuple: 221. This corresponds to the general structure of a URL: + ‘scheme://netloc/path;parameters?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: + + >>> from urllib.parse import urlparse + >>> urlparse("scheme://netloc/path;parameters?query#fragment") + ParseResult(scheme='scheme', netloc='netloc', path='/path;parameters', params='', + query='query', fragment='fragment') + >>> o = urlparse("http://docs.python.org:80/3/library/urllib.parse.html?" + ... "highlight=params#url-parsing") + >>> o + ParseResult(scheme='http', netloc='docs.python.org:80', + path='/3/library/urllib.parse.html', params='', + 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' + + Following the syntax specifications in RFC 1808(1), urlparse + 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. + + >>> from urllib.parse import urlparse + >>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html') + ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') + >>> urlparse('www.cwi.nl/%7Eguido/Python.html') + ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', + params='', query='', fragment='') + >>> urlparse('help/Python.html') + ParseResult(scheme='', netloc='', path='help/Python.html', params='', + query='', fragment='') + + 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 + ‘''’ is always allowed, and is automatically converted to ‘b''’ 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 ‘fragment’ is set to the empty + string in the return value. + + The return value is a *note named tuple: 221, which means that its + items can be accessed by index or as named attributes, which are: + + Attribute Index Value Value if not present + + ---------------------------------------------------------------------------------------------- + + ‘scheme’ 0 URL scheme specifier `scheme' parameter + + + ‘netloc’ 1 Network location part empty string + + + ‘path’ 2 Hierarchical path empty string + + + ‘params’ 3 Parameters for last path empty string + element + + + ‘query’ 4 Query component empty string + + + ‘fragment’ 5 Fragment identifier empty string + + + ‘username’ User name *note None: 243. + + + ‘password’ Password *note None: 243. + + + ‘hostname’ Host name (lower case) *note None: 243. + + + ‘port’ Port number as integer, if *note None: 243. + present + + + Reading the ‘port’ attribute will raise a *note ValueError: 1c8. if + an invalid port is specified in the URL. See section *note + Structured Parse Results: 3277. for more information on the result + object. + + Unmatched square brackets in the ‘netloc’ attribute will raise a + *note ValueError: 1c8. + + Characters in the ‘netloc’ attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ‘/’, ‘?’, + ‘#’, ‘@’, or ‘:’ will raise a *note ValueError: 1c8. If the URL is + decomposed before parsing, no error will be raised. + + 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 ‘_replace()’. The ‘_replace()’ method will + return a new ParseResult object replacing specified fields with new + values. + + >>> from urllib.parse import urlparse + >>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html') + >>> u + ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') + >>> u._replace(scheme='http') + ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') + + 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_fragment' is false), in accordance with RFC + 3986(2). Previously, an allowlist of schemes that support + fragments existed. + + Changed in version 3.6: Out-of-range port numbers now raise *note + ValueError: 1c8, instead of returning *note None: 243. + + Changed in version 3.8: Characters that affect netloc parsing under + NFKC normalization will now raise *note ValueError: 1c8. + + -- 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 + ‘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 *note ValueError: 1c8. + exception. + + The optional `encoding' and `errors' parameters specify how to + decode percent-encoded sequences into Unicode characters, as + accepted by the *note bytes.decode(): 513. method. + + The optional argument `max_num_fields' is the maximum number of + fields to read. If set, then throws a *note ValueError: 1c8. 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 ‘&’. + + Use the *note urllib.parse.urlencode(): b21. function (with the + ‘doseq’ parameter set to ‘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 ‘&’. Python versions earlier than Python 3.10 + allowed using both ‘;’ and ‘&’ as query parameter separator. This + has been changed to allow only a single separator key, with ‘&’ as + the default separator. + + -- 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 + ‘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 *note ValueError: 1c8. + exception. + + The optional `encoding' and `errors' parameters specify how to + decode percent-encoded sequences into Unicode characters, as + accepted by the *note bytes.decode(): 513. method. + + The optional argument `max_num_fields' is the maximum number of + fields to read. If set, then throws a *note ValueError: 1c8. 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 ‘&’. + + Use the *note urllib.parse.urlencode(): b21. 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 ‘&’. Python versions earlier than Python 3.10 + allowed using both ‘;’ and ‘&’ as query parameter separator. This + has been changed to allow only a single separator key, with ‘&’ as + the default separator. + + -- Function: urllib.parse.urlunparse (parts) + + Construct a URL from a tuple as returned by ‘urlparse()’. 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). + + -- Function: urllib.parse.urlsplit (urlstring, scheme='', + allow_fragments=True) + + This is similar to *note urlparse(): 9b4, but does not split the + params from the URL. This should generally be used instead of *note + urlparse(): 9b4. if the more recent URL syntax allowing parameters + to be applied to each segment of the `path' portion of the URL (see + RFC 2396(3)) is wanted. A separate function is needed to separate + the path segments and parameters. This function returns a 5-item + *note named tuple: 221.: + + (addressing scheme, network location, path, query, fragment identifier). + + The return value is a *note named tuple: 221, its items can be + accessed by index or as named attributes: + + Attribute Index Value Value if not present + + -------------------------------------------------------------------------------------------- + + ‘scheme’ 0 URL scheme specifier `scheme' parameter + + + ‘netloc’ 1 Network location part empty string + + + ‘path’ 2 Hierarchical path empty string + + + ‘query’ 3 Query component empty string + + + ‘fragment’ 4 Fragment identifier empty string + + + ‘username’ User name *note None: 243. + + + ‘password’ Password *note None: 243. + + + ‘hostname’ Host name (lower case) *note None: 243. + + + ‘port’ Port number as integer, if *note None: 243. + present + + + Reading the ‘port’ attribute will raise a *note ValueError: 1c8. if + an invalid port is specified in the URL. See section *note + Structured Parse Results: 3277. for more information on the result + object. + + Unmatched square brackets in the ‘netloc’ attribute will raise a + *note ValueError: 1c8. + + Characters in the ‘netloc’ attribute that decompose under NFKC + normalization (as used by the IDNA encoding) into any of ‘/’, ‘?’, + ‘#’, ‘@’, or ‘:’ will raise a *note ValueError: 1c8. If the URL is + decomposed before parsing, no error will be raised. + + Following the WHATWG spec(4) that updates RFC 3986, ASCII newline + ‘\n’, ‘\r’ and tab ‘\t’ characters are stripped from the URL. + + Changed in version 3.6: Out-of-range port numbers now raise *note + ValueError: 1c8, instead of returning *note None: 243. + + Changed in version 3.8: Characters that affect netloc parsing under + NFKC normalization will now raise *note ValueError: 1c8. + + Changed in version 3.10: ASCII newline and tab characters are + stripped from the URL. + + -- Function: urllib.parse.urlunsplit (parts) + + Combine the elements of a tuple as returned by *note urlsplit(): + 9b3. into a complete URL as a string. 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 ? with an empty query; the + RFC states that these are equivalent). + + -- 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: + + >>> from urllib.parse import urljoin + >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html') + 'http://www.cwi.nl/%7Eguido/FAQ.html' + + The `allow_fragments' argument has the same meaning and default as + for *note urlparse(): 9b4. + + Note: If `url' is an absolute URL (that is, it starts with + ‘//’ or ‘scheme://’), the `url'’s hostname and/or scheme will + be present in the result. For example: + + >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', + ... '//www.python.org/%7Eguido') + 'http://www.python.org/%7Eguido' + + If you do not want that behavior, preprocess the `url' with + *note urlsplit(): 9b3. and *note urlunsplit(): 3279, removing + possible `scheme' and `netloc' parts. + + Changed in version 3.5: Behavior updated to match the semantics + defined in RFC 3986(5). + + -- 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 *note named tuple: 221, its items can be + accessed by index or as named attributes: + + Attribute Index Value Value if not present + + -------------------------------------------------------------------------------------------- + + ‘url’ 0 URL with no fragment empty string + + + ‘fragment’ 1 Fragment identifier empty string + + + See section *note Structured Parse Results: 3277. for more + information on the result object. + + Changed in version 3.2: Result is a structured object rather than a + simple 2-tuple. + + -- Function: urllib.parse.unwrap (url) + + Extract the url from a wrapped URL (that is, a string formatted as + ‘<URL:scheme://host/path>’, ‘<scheme://host/path>’, + ‘URL:scheme://host/path’ or ‘scheme://host/path’). If `url' is not + a wrapped URL, it is returned without changes. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc1808.html + + (2) https://datatracker.ietf.org/doc/html/rfc3986.html + + (3) https://datatracker.ietf.org/doc/html/rfc2396.html + + (4) https://url.spec.whatwg.org/#concept-basic-url-parser + + (5) https://datatracker.ietf.org/doc/html/rfc3986.html + + +File: python.info, Node: Parsing ASCII Encoded Bytes, Next: Structured Parse Results, Prev: URL Parsing, Up: urllib parse — Parse URLs into components + +5.21.6.2 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 +*note bytes: 1b4. and *note bytearray: 1a5. objects in addition to *note +str: 1b3. objects. + +If *note str: 1b3. data is passed in, the result will also contain only +*note str: 1b3. data. If *note bytes: 1b4. or *note bytearray: 1a5. +data is passed in, the result will contain only *note bytes: 1b4. data. + +Attempting to mix *note str: 1b3. data with *note bytes: 1b4. or *note +bytearray: 1a5. in a single function call will result in a *note +TypeError: 19c. being raised, while attempting to pass in non-ASCII byte +values will trigger *note UnicodeDecodeError: 65c. + +To support easier conversion of result objects between *note str: 1b3. +and *note bytes: 1b4, all return values from URL parsing functions +provide either an ‘encode()’ method (when the result contains *note str: +1b3. data) or a ‘decode()’ method (when the result contains *note bytes: +1b4. data). The signatures of these methods match those of the +corresponding *note str: 1b3. and *note bytes: 1b4. methods (except that +the default encoding is ‘'ascii'’ rather than ‘'utf-8'’). Each produces +a value of a corresponding type that contains either *note bytes: 1b4. +data (for ‘encode()’ methods) or *note str: 1b3. data (for ‘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 + + +File: python.info, Node: Structured Parse Results, Next: URL Quoting, Prev: Parsing ASCII Encoded Bytes, Up: urllib parse — Parse URLs into components + +5.21.6.3 Structured Parse Results +................................. + +The result objects from the *note urlparse(): 9b4, *note urlsplit(): +9b3. and *note urldefrag(): f06. functions are subclasses of the *note +tuple: 539. 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: + + -- 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 *note urldefrag(): f06. results, only empty fragment + identifiers will be removed. For *note urlsplit(): 9b3. and *note + urlparse(): 9b4. 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: + + >>> 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/' + +The following classes provide the implementations of the structured +parse results when operating on *note str: 1b3. objects: + + -- Class: urllib.parse.DefragResult (url, fragment) + + Concrete class for *note urldefrag(): f06. results containing *note + str: 1b3. data. The ‘encode()’ method returns a *note + DefragResultBytes: 327f. instance. + + New in version 3.2. + + -- Class: urllib.parse.ParseResult (scheme, netloc, path, params, + query, fragment) + + Concrete class for *note urlparse(): 9b4. results containing *note + str: 1b3. data. The ‘encode()’ method returns a *note + ParseResultBytes: 3281. instance. + + -- Class: urllib.parse.SplitResult (scheme, netloc, path, query, + fragment) + + Concrete class for *note urlsplit(): 9b3. results containing *note + str: 1b3. data. The ‘encode()’ method returns a *note + SplitResultBytes: 3283. instance. + +The following classes provide the implementations of the parse results +when operating on *note bytes: 1b4. or *note bytearray: 1a5. objects: + + -- Class: urllib.parse.DefragResultBytes (url, fragment) + + Concrete class for *note urldefrag(): f06. results containing *note + bytes: 1b4. data. The ‘decode()’ method returns a *note + DefragResult: 327e. instance. + + New in version 3.2. + + -- Class: urllib.parse.ParseResultBytes (scheme, netloc, path, params, + query, fragment) + + Concrete class for *note urlparse(): 9b4. results containing *note + bytes: 1b4. data. The ‘decode()’ method returns a *note + ParseResult: 3280. instance. + + New in version 3.2. + + -- Class: urllib.parse.SplitResultBytes (scheme, netloc, path, query, + fragment) + + Concrete class for *note urlsplit(): 9b3. results containing *note + bytes: 1b4. data. The ‘decode()’ method returns a *note + SplitResult: 3282. instance. + + New in version 3.2. + + +File: python.info, Node: URL Quoting, Prev: Structured Parse Results, Up: urllib parse — Parse URLs into components + +5.21.6.4 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. + + -- Function: urllib.parse.quote (string, safe='/', encoding=None, + errors=None) + + Replace special characters in `string' using the ‘%xx’ escape. + Letters, digits, and the characters ‘'_.-~'’ 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 ‘'/'’. + + `string' may be either a *note str: 1b3. or a *note bytes: 1b4. + object. + + Changed in version 3.7: Moved from RFC 2396(1) to RFC 3986(2) 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 *note str.encode(): + 512. method. `encoding' defaults to ‘'utf-8'’. `errors' defaults + to ‘'strict'’, meaning unsupported characters raise a *note + UnicodeEncodeError: 246. `encoding' and `errors' must not be + supplied if `string' is a *note bytes: 1b4, or a *note TypeError: + 19c. is raised. + + Note that ‘quote(string, safe, encoding, errors)’ is equivalent to + ‘quote_from_bytes(string.encode(encoding, errors), safe)’. + + Example: ‘quote('/El Niño/')’ yields ‘'/El%20Ni%C3%B1o/'’. + + -- Function: urllib.parse.quote_plus (string, safe='', encoding=None, + errors=None) + + Like *note quote(): 805, 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 ‘'/'’. + + Example: ‘quote_plus('/El Niño/')’ yields ‘'%2FEl+Ni%C3%B1o%2F'’. + + -- Function: urllib.parse.quote_from_bytes (bytes, safe='/') + + Like *note quote(): 805, but accepts a *note bytes: 1b4. object + rather than a *note str: 1b3, and does not perform string-to-bytes + encoding. + + Example: ‘quote_from_bytes(b'a&\xef')’ yields ‘'a%26%EF'’. + + -- Function: urllib.parse.unquote (string, encoding='utf-8', + errors='replace') + + Replace ‘%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 *note bytes.decode(): 513. method. + + `string' may be either a *note str: 1b3. or a *note bytes: 1b4. + object. + + `encoding' defaults to ‘'utf-8'’. `errors' defaults to + ‘'replace'’, meaning invalid sequences are replaced by a + placeholder character. + + Example: ‘unquote('/El%20Ni%C3%B1o/')’ yields ‘'/El Niño/'’. + + Changed in version 3.9: `string' parameter supports bytes and str + objects (previously only str). + + -- Function: urllib.parse.unquote_plus (string, encoding='utf-8', + errors='replace') + + Like *note unquote(): 13fa, but also replace plus signs with + spaces, as required for unquoting HTML form values. + + `string' must be a *note str: 1b3. + + Example: ‘unquote_plus('/El+Ni%C3%B1o/')’ yields ‘'/El Niño/'’. + + -- Function: urllib.parse.unquote_to_bytes (string) + + Replace ‘%xx’ escapes with their single-octet equivalent, and + return a *note bytes: 1b4. object. + + `string' may be either a *note str: 1b3. or a *note bytes: 1b4. + object. + + If it is a *note str: 1b3, unescaped non-ASCII characters in + `string' are encoded into UTF-8 bytes. + + Example: ‘unquote_to_bytes('a%26%EF')’ yields ‘b'a&\xef'’. + + -- Function: urllib.parse.urlencode (query, doseq=False, safe='', + encoding=None, errors=None, quote_via=quote_plus) + + Convert a mapping object or a sequence of two-element tuples, which + may contain *note str: 1b3. or *note bytes: 1b4. objects, to a + percent-encoded ASCII text string. If the resultant string is to + be used as a `data' for POST operation with the *note urlopen(): + b22. function, then it should be encoded to bytes, otherwise it + would result in a *note TypeError: 19c. + + The resulting string is a series of ‘key=value’ pairs separated by + ‘'&'’ characters, where both `key' and `value' are quoted using the + `quote_via' function. By default, *note quote_plus(): f07. is used + to quote the values, which means spaces are quoted as a ‘'+'’ + character and ‘/’ characters are encoded as ‘%2F’, which follows + the standard for GET requests + (‘application/x-www-form-urlencoded’). An alternate function that + can be passed as `quote_via' is *note quote(): 805, which will + encode spaces as ‘%20’ and not encode ‘/’ characters. For maximum + control of what is quoted, use ‘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 ‘True’, + individual ‘key=value’ pairs separated by ‘'&'’ 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 *note str: 1b3.). + + To reverse this encoding process, *note parse_qs(): 452. and *note + parse_qsl(): 453. are provided in this module to parse query + strings into Python data structures. + + Refer to *note urllib examples: 3264. to find out how the *note + urllib.parse.urlencode(): b21. 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. + + New in version 3.5: `quote_via' parameter. + +See also +........ + +WHATWG(3) - 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. + +RFC 3986(4) - 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. + +RFC 2732(5) - Format for Literal IPv6 Addresses in URL’s. + + This specifies the parsing requirements of IPv6 URLs. + +RFC 2396(6) - Uniform Resource Identifiers (URI): Generic Syntax + + Document describing the generic syntactic requirements for both + Uniform Resource Names (URNs) and Uniform Resource Locators (URLs). + +RFC 2368(7) - The mailto URL scheme. + + Parsing requirements for mailto URL schemes. + +RFC 1808(8) - 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. + +RFC 1738(9) - Uniform Resource Locators (URL) + + This specifies the formal syntax and semantics of absolute URLs. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2396.html + + (2) https://datatracker.ietf.org/doc/html/rfc3986.html + + (3) https://url.spec.whatwg.org/ + + (4) https://datatracker.ietf.org/doc/html/rfc3986.html + + (5) https://datatracker.ietf.org/doc/html/rfc2732.html + + (6) https://datatracker.ietf.org/doc/html/rfc2396.html + + (7) https://datatracker.ietf.org/doc/html/rfc2368.html + + (8) https://datatracker.ietf.org/doc/html/rfc1808.html + + (9) https://datatracker.ietf.org/doc/html/rfc1738.html + + +File: python.info, Node: urllib error — Exception classes raised by urllib request, Next: urllib robotparser — Parser for robots txt, Prev: urllib parse — Parse URLs into components, Up: Internet Protocols and Support + +5.21.7 ‘urllib.error’ — Exception classes raised by urllib.request +------------------------------------------------------------------ + +`Source code:' Lib/urllib/error.py(1) + +__________________________________________________________________ + +The *note urllib.error: 128. module defines the exception classes for +exceptions raised by *note urllib.request: 12a. The base exception +class is *note URLError: 31ea. + +The following exceptions are raised by *note urllib.error: 128. as +appropriate: + + -- Exception: urllib.error.URLError + + The handlers raise this exception (or derived exceptions) when they + run into a problem. It is a subclass of *note OSError: 413. + + -- Attribute: reason + + The reason for this error. It can be a message string or + another exception instance. + + Changed in version 3.3: *note URLError: 31ea. has been made a + subclass of *note OSError: 413. instead of *note IOError: d02. + + -- Exception: urllib.error.HTTPError + + Though being an exception (a subclass of *note URLError: 31ea.), an + *note HTTPError: c80. can also function as a non-exceptional + file-like return value (the same thing that *note urlopen(): b22. + returns). This is useful when handling exotic HTTP errors, such as + requests for authentication. + + -- Attribute: code + + An HTTP status code as defined in RFC 2616(2). This numeric + value corresponds to a value found in the dictionary of codes + as found in *note + http.server.BaseHTTPRequestHandler.responses: 328d. + + -- Attribute: reason + + This is usually a string explaining the reason for this error. + + -- Attribute: headers + + The HTTP response headers for the HTTP request that caused the + *note HTTPError: c80. + + New in version 3.4. + + -- Exception: urllib.error.ContentTooShortError (msg, content) + + This exception is raised when the *note urlretrieve(): 3266. + function detects that the amount of the downloaded data is less + than the expected amount (given by the `Content-Length' header). + The ‘content’ attribute stores the downloaded (and supposedly + truncated) data. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/urllib/error.py + + (2) https://datatracker.ietf.org/doc/html/rfc2616.html + + +File: python.info, Node: urllib robotparser — Parser for robots txt, Next: http — HTTP modules, Prev: urllib error — Exception classes raised by urllib request, Up: Internet Protocols and Support + +5.21.8 ‘urllib.robotparser’ — Parser for robots.txt +--------------------------------------------------- + +`Source code:' Lib/urllib/robotparser.py(1) + +__________________________________________________________________ + +This module provides a single class, *note RobotFileParser: 96c, which +answers questions about whether or not a particular user agent can fetch +a URL on the web site that published the ‘robots.txt’ file. For more +details on the structure of ‘robots.txt’ files, see +‘http://www.robotstxt.org/orig.html’. + + -- Class: urllib.robotparser.RobotFileParser (url='') + + This class provides methods to read, parse and answer questions + about the ‘robots.txt’ file at `url'. + + -- Method: set_url (url) + + Sets the URL referring to a ‘robots.txt’ file. + + -- Method: read () + + Reads the ‘robots.txt’ URL and feeds it to the parser. + + -- Method: parse (lines) + + Parses the lines argument. + + -- Method: can_fetch (useragent, url) + + Returns ‘True’ if the `useragent' is allowed to fetch the + `url' according to the rules contained in the parsed + ‘robots.txt’ file. + + -- Method: mtime () + + Returns the time the ‘robots.txt’ file was last fetched. This + is useful for long-running web spiders that need to check for + new ‘robots.txt’ files periodically. + + -- Method: modified () + + Sets the time the ‘robots.txt’ file was last fetched to the + current time. + + -- Method: crawl_delay (useragent) + + Returns the value of the ‘Crawl-delay’ parameter from + ‘robots.txt’ for the `useragent' in question. If there is no + such parameter or it doesn’t apply to the `useragent' + specified or the ‘robots.txt’ entry for this parameter has + invalid syntax, return ‘None’. + + New in version 3.6. + + -- Method: request_rate (useragent) + + Returns the contents of the ‘Request-rate’ parameter from + ‘robots.txt’ as a *note named tuple: 221. + ‘RequestRate(requests, seconds)’. If there is no such + parameter or it doesn’t apply to the `useragent' specified or + the ‘robots.txt’ entry for this parameter has invalid syntax, + return ‘None’. + + New in version 3.6. + + -- Method: site_maps () + + Returns the contents of the ‘Sitemap’ parameter from + ‘robots.txt’ in the form of a *note list(): 1e9. If there is + no such parameter or the ‘robots.txt’ entry for this parameter + has invalid syntax, return ‘None’. + + New in version 3.8. + +The following example demonstrates basic use of the *note +RobotFileParser: 96c. class: + + >>> import urllib.robotparser + >>> rp = urllib.robotparser.RobotFileParser() + >>> rp.set_url("http://www.musi-cal.com/robots.txt") + >>> rp.read() + >>> rrate = rp.request_rate("*") + >>> rrate.requests + 3 + >>> rrate.seconds + 20 + >>> rp.crawl_delay("*") + 6 + >>> rp.can_fetch("*", "http://www.musi-cal.com/cgi-bin/search?city=San+Francisco") + False + >>> rp.can_fetch("*", "http://www.musi-cal.com/") + True + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/urllib/robotparser.py + + +File: python.info, Node: http — HTTP modules, Next: http client — HTTP protocol client, Prev: urllib robotparser — Parser for robots txt, Up: Internet Protocols and Support + +5.21.9 ‘http’ — HTTP modules +---------------------------- + +`Source code:' Lib/http/__init__.py(1) + +__________________________________________________________________ + +*note http: 8e. is a package that collects several modules for working +with the HyperText Transfer Protocol: + + * *note http.client: 8f. is a low-level HTTP protocol client; for + high-level URL opening use *note urllib.request: 12a. + + * *note http.server: 92. contains basic HTTP server classes based on + *note socketserver: ed. + + * *note http.cookies: 91. has utilities for implementing state + management with cookies + + * *note http.cookiejar: 90. provides persistence of cookies + +The *note http: 8e. module also defines the following enums that help +you work with http related code: + + -- Class: http.HTTPStatus + + New in version 3.5. + + A subclass of *note enum.IntEnum: 1f9. that defines a set of HTTP + status codes, reason phrases and long descriptions written in + English. + + Usage: + + >>> 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, ...] + +* Menu: + +* HTTP status codes:: +* HTTP methods:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/http/__init__.py + + +File: python.info, Node: HTTP status codes, Next: HTTP methods, Up: http — HTTP modules + +5.21.9.1 HTTP status codes +.......................... + +Supported, IANA-registered status codes(1) available in *note +http.HTTPStatus: 543. are: + +Code Enum Name Details + +---------------------------------------------------------------------------------------------------------------------------------------- + +‘100’ ‘CONTINUE’ HTTP/1.1 RFC 7231(2), Section 6.2.1 + + +‘101’ ‘SWITCHING_PROTOCOLS’ HTTP/1.1 RFC 7231(3), Section 6.2.2 + + +‘102’ ‘PROCESSING’ WebDAV RFC 2518(4), Section 10.1 + + +‘103’ ‘EARLY_HINTS’ An HTTP Status Code for Indicating Hints RFC 8297(5) + + +‘200’ ‘OK’ HTTP/1.1 RFC 7231(6), Section 6.3.1 + + +‘201’ ‘CREATED’ HTTP/1.1 RFC 7231(7), Section 6.3.2 + + +‘202’ ‘ACCEPTED’ HTTP/1.1 RFC 7231(8), Section 6.3.3 + + +‘203’ ‘NON_AUTHORITATIVE_INFORMATION’ HTTP/1.1 RFC 7231(9), Section 6.3.4 + + +‘204’ ‘NO_CONTENT’ HTTP/1.1 RFC 7231(10), Section 6.3.5 + + +‘205’ ‘RESET_CONTENT’ HTTP/1.1 RFC 7231(11), Section 6.3.6 + + +‘206’ ‘PARTIAL_CONTENT’ HTTP/1.1 RFC 7233(12), Section 4.1 + + +‘207’ ‘MULTI_STATUS’ WebDAV RFC 4918(13), Section 11.1 + + +‘208’ ‘ALREADY_REPORTED’ WebDAV Binding Extensions RFC 5842(14), Section 7.1 (Experimental) + + +‘226’ ‘IM_USED’ Delta Encoding in HTTP RFC 3229(15), Section 10.4.1 + + +‘300’ ‘MULTIPLE_CHOICES’ HTTP/1.1 RFC 7231(16), Section 6.4.1 + + +‘301’ ‘MOVED_PERMANENTLY’ HTTP/1.1 RFC 7231(17), Section 6.4.2 + + +‘302’ ‘FOUND’ HTTP/1.1 RFC 7231(18), Section 6.4.3 + + +‘303’ ‘SEE_OTHER’ HTTP/1.1 RFC 7231(19), Section 6.4.4 + + +‘304’ ‘NOT_MODIFIED’ HTTP/1.1 RFC 7232(20), Section 4.1 + + +‘305’ ‘USE_PROXY’ HTTP/1.1 RFC 7231(21), Section 6.4.5 + + +‘307’ ‘TEMPORARY_REDIRECT’ HTTP/1.1 RFC 7231(22), Section 6.4.7 + + +‘308’ ‘PERMANENT_REDIRECT’ Permanent Redirect RFC 7238(23), Section 3 (Experimental) + + +‘400’ ‘BAD_REQUEST’ HTTP/1.1 RFC 7231(24), Section 6.5.1 + + +‘401’ ‘UNAUTHORIZED’ HTTP/1.1 Authentication RFC 7235(25), Section 3.1 + + +‘402’ ‘PAYMENT_REQUIRED’ HTTP/1.1 RFC 7231(26), Section 6.5.2 + + +‘403’ ‘FORBIDDEN’ HTTP/1.1 RFC 7231(27), Section 6.5.3 + + +‘404’ ‘NOT_FOUND’ HTTP/1.1 RFC 7231(28), Section 6.5.4 + + +‘405’ ‘METHOD_NOT_ALLOWED’ HTTP/1.1 RFC 7231(29), Section 6.5.5 + + +‘406’ ‘NOT_ACCEPTABLE’ HTTP/1.1 RFC 7231(30), Section 6.5.6 + + +‘407’ ‘PROXY_AUTHENTICATION_REQUIRED’ HTTP/1.1 Authentication RFC 7235(31), Section 3.2 + + +‘408’ ‘REQUEST_TIMEOUT’ HTTP/1.1 RFC 7231(32), Section 6.5.7 + + +‘409’ ‘CONFLICT’ HTTP/1.1 RFC 7231(33), Section 6.5.8 + + +‘410’ ‘GONE’ HTTP/1.1 RFC 7231(34), Section 6.5.9 + + +‘411’ ‘LENGTH_REQUIRED’ HTTP/1.1 RFC 7231(35), Section 6.5.10 + + +‘412’ ‘PRECONDITION_FAILED’ HTTP/1.1 RFC 7232(36), Section 4.2 + + +‘413’ ‘REQUEST_ENTITY_TOO_LARGE’ HTTP/1.1 RFC 7231(37), Section 6.5.11 + + +‘414’ ‘REQUEST_URI_TOO_LONG’ HTTP/1.1 RFC 7231(38), Section 6.5.12 + + +‘415’ ‘UNSUPPORTED_MEDIA_TYPE’ HTTP/1.1 RFC 7231(39), Section 6.5.13 + + +‘416’ ‘REQUESTED_RANGE_NOT_SATISFIABLE’ HTTP/1.1 Range Requests RFC 7233(40), Section 4.4 + + +‘417’ ‘EXPECTATION_FAILED’ HTTP/1.1 RFC 7231(41), Section 6.5.14 + + +‘418’ ‘IM_A_TEAPOT’ HTCPCP/1.0 RFC 2324(42), Section 2.3.2 + + +‘421’ ‘MISDIRECTED_REQUEST’ HTTP/2 RFC 7540(43), Section 9.1.2 + + +‘422’ ‘UNPROCESSABLE_ENTITY’ WebDAV RFC 4918(44), Section 11.2 + + +‘423’ ‘LOCKED’ WebDAV RFC 4918(45), Section 11.3 + + +‘424’ ‘FAILED_DEPENDENCY’ WebDAV RFC 4918(46), Section 11.4 + + +‘425’ ‘TOO_EARLY’ Using Early Data in HTTP RFC 8470(47) + + +‘426’ ‘UPGRADE_REQUIRED’ HTTP/1.1 RFC 7231(48), Section 6.5.15 + + +‘428’ ‘PRECONDITION_REQUIRED’ Additional HTTP Status Codes RFC 6585(49) + + +‘429’ ‘TOO_MANY_REQUESTS’ Additional HTTP Status Codes RFC 6585(50) + + +‘431’ ‘REQUEST_HEADER_FIELDS_TOO_LARGE’ Additional HTTP Status Codes RFC 6585(51) + + +‘451’ ‘UNAVAILABLE_FOR_LEGAL_REASONS’ An HTTP Status Code to Report Legal Obstacles RFC 7725(52) + + +‘500’ ‘INTERNAL_SERVER_ERROR’ HTTP/1.1 RFC 7231(53), Section 6.6.1 + + +‘501’ ‘NOT_IMPLEMENTED’ HTTP/1.1 RFC 7231(54), Section 6.6.2 + + +‘502’ ‘BAD_GATEWAY’ HTTP/1.1 RFC 7231(55), Section 6.6.3 + + +‘503’ ‘SERVICE_UNAVAILABLE’ HTTP/1.1 RFC 7231(56), Section 6.6.4 + + +‘504’ ‘GATEWAY_TIMEOUT’ HTTP/1.1 RFC 7231(57), Section 6.6.5 + + +‘505’ ‘HTTP_VERSION_NOT_SUPPORTED’ HTTP/1.1 RFC 7231(58), Section 6.6.6 + + +‘506’ ‘VARIANT_ALSO_NEGOTIATES’ Transparent Content Negotiation in HTTP RFC 2295(59), Section 8.1 (Experimental) + + +‘507’ ‘INSUFFICIENT_STORAGE’ WebDAV RFC 4918(60), Section 11.5 + + +‘508’ ‘LOOP_DETECTED’ WebDAV Binding Extensions RFC 5842(61), Section 7.2 (Experimental) + + +‘510’ ‘NOT_EXTENDED’ An HTTP Extension Framework RFC 2774(62), Section 7 (Experimental) + + +‘511’ ‘NETWORK_AUTHENTICATION_REQUIRED’ Additional HTTP Status Codes RFC 6585(63), Section 6 + + +In order to preserve backwards compatibility, enum values are also +present in the *note http.client: 8f. module in the form of constants. +The enum name is equal to the constant name (i.e. ‘http.HTTPStatus.OK’ +is also available as ‘http.client.OK’). + +Changed in version 3.7: Added ‘421 MISDIRECTED_REQUEST’ status code. + +New in version 3.8: Added ‘451 UNAVAILABLE_FOR_LEGAL_REASONS’ status +code. + +New in version 3.9: Added ‘103 EARLY_HINTS’, ‘418 IM_A_TEAPOT’ and ‘425 +TOO_EARLY’ status codes. + + -- Class: http.HTTPMethod + + New in version 3.11. + + A subclass of *note enum.StrEnum: 1f3. that defines a set of HTTP + methods and descriptions written in English. + + Usage: + + >>> from http import HTTPMethod + >>> HTTMethod.GET + HTTMethod.GET + >>> HTTMethod.GET == 'GET' + True + >>> HTTMethod.GET.value + 'GET' + >>> HTTMethod.GET.description + 'Transfer a current representation of the target resource.' + >>> list(HTTPMethod) + [HTTPMethod.GET, HTTPMethod.HEAD, ...] + + ---------- Footnotes ---------- + + (1) +https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + + (2) https://datatracker.ietf.org/doc/html/rfc7231.html + + (3) https://datatracker.ietf.org/doc/html/rfc7231.html + + (4) https://datatracker.ietf.org/doc/html/rfc2518.html + + (5) https://datatracker.ietf.org/doc/html/rfc8297.html + + (6) https://datatracker.ietf.org/doc/html/rfc7231.html + + (7) https://datatracker.ietf.org/doc/html/rfc7231.html + + (8) https://datatracker.ietf.org/doc/html/rfc7231.html + + (9) https://datatracker.ietf.org/doc/html/rfc7231.html + + (10) https://datatracker.ietf.org/doc/html/rfc7231.html + + (11) https://datatracker.ietf.org/doc/html/rfc7231.html + + (12) https://datatracker.ietf.org/doc/html/rfc7233.html + + (13) https://datatracker.ietf.org/doc/html/rfc4918.html + + (14) https://datatracker.ietf.org/doc/html/rfc5842.html + + (15) https://datatracker.ietf.org/doc/html/rfc3229.html + + (16) https://datatracker.ietf.org/doc/html/rfc7231.html + + (17) https://datatracker.ietf.org/doc/html/rfc7231.html + + (18) https://datatracker.ietf.org/doc/html/rfc7231.html + + (19) https://datatracker.ietf.org/doc/html/rfc7231.html + + (20) https://datatracker.ietf.org/doc/html/rfc7232.html + + (21) https://datatracker.ietf.org/doc/html/rfc7231.html + + (22) https://datatracker.ietf.org/doc/html/rfc7231.html + + (23) https://datatracker.ietf.org/doc/html/rfc7238.html + + (24) https://datatracker.ietf.org/doc/html/rfc7231.html + + (25) https://datatracker.ietf.org/doc/html/rfc7235.html + + (26) https://datatracker.ietf.org/doc/html/rfc7231.html + + (27) https://datatracker.ietf.org/doc/html/rfc7231.html + + (28) https://datatracker.ietf.org/doc/html/rfc7231.html + + (29) https://datatracker.ietf.org/doc/html/rfc7231.html + + (30) https://datatracker.ietf.org/doc/html/rfc7231.html + + (31) https://datatracker.ietf.org/doc/html/rfc7235.html + + (32) https://datatracker.ietf.org/doc/html/rfc7231.html + + (33) https://datatracker.ietf.org/doc/html/rfc7231.html + + (34) https://datatracker.ietf.org/doc/html/rfc7231.html + + (35) https://datatracker.ietf.org/doc/html/rfc7231.html + + (36) https://datatracker.ietf.org/doc/html/rfc7232.html + + (37) https://datatracker.ietf.org/doc/html/rfc7231.html + + (38) https://datatracker.ietf.org/doc/html/rfc7231.html + + (39) https://datatracker.ietf.org/doc/html/rfc7231.html + + (40) https://datatracker.ietf.org/doc/html/rfc7233.html + + (41) https://datatracker.ietf.org/doc/html/rfc7231.html + + (42) https://datatracker.ietf.org/doc/html/rfc2324.html + + (43) https://datatracker.ietf.org/doc/html/rfc7540.html + + (44) https://datatracker.ietf.org/doc/html/rfc4918.html + + (45) https://datatracker.ietf.org/doc/html/rfc4918.html + + (46) https://datatracker.ietf.org/doc/html/rfc4918.html + + (47) https://datatracker.ietf.org/doc/html/rfc8470.html + + (48) https://datatracker.ietf.org/doc/html/rfc7231.html + + (49) https://datatracker.ietf.org/doc/html/rfc6585.html + + (50) https://datatracker.ietf.org/doc/html/rfc6585.html + + (51) https://datatracker.ietf.org/doc/html/rfc6585.html + + (52) https://datatracker.ietf.org/doc/html/rfc7725.html + + (53) https://datatracker.ietf.org/doc/html/rfc7231.html + + (54) https://datatracker.ietf.org/doc/html/rfc7231.html + + (55) https://datatracker.ietf.org/doc/html/rfc7231.html + + (56) https://datatracker.ietf.org/doc/html/rfc7231.html + + (57) https://datatracker.ietf.org/doc/html/rfc7231.html + + (58) https://datatracker.ietf.org/doc/html/rfc7231.html + + (59) https://datatracker.ietf.org/doc/html/rfc2295.html + + (60) https://datatracker.ietf.org/doc/html/rfc4918.html + + (61) https://datatracker.ietf.org/doc/html/rfc5842.html + + (62) https://datatracker.ietf.org/doc/html/rfc2774.html + + (63) https://datatracker.ietf.org/doc/html/rfc6585.html + + +File: python.info, Node: HTTP methods, Prev: HTTP status codes, Up: http — HTTP modules + +5.21.9.2 HTTP methods +..................... + +Supported, IANA-registered methods(1) available in *note +http.HTTPMethod: 329d. are: + +Method Enum Name Details + +------------------------------------------------------------------------------------------------------------------------------- + +‘GET’ ‘GET’ HTTP/1.1 RFC 7231(2), Section 4.3.1 + + +‘HEAD’ ‘HEAD’ HTTP/1.1 RFC 7231(3), Section 4.3.2 + + +‘POST’ ‘POST’ HTTP/1.1 RFC 7231(4), Section 4.3.3 + + +‘PUT’ ‘PUT’ HTTP/1.1 RFC 7231(5), Section 4.3.4 + + +‘DELETE’ ‘DELETE’ HTTP/1.1 RFC 7231(6), Section 4.3.5 + + +‘CONNECT’ ‘CONNECT’ HTTP/1.1 RFC 7231(7), Section 4.3.6 + + +‘OPTIONS’ ‘OPTIONS’ HTTP/1.1 RFC 7231(8), Section 4.3.7 + + +‘TRACE’ ‘TRACE’ HTTP/1.1 RFC 7231(9), Section 4.3.8 + + +‘PATCH’ ‘PATCH’ HTTP/1.1 RFC 5789(10) + + + ---------- Footnotes ---------- + + (1) https://www.iana.org/assignments/http-methods/http-methods.xhtml + + (2) https://datatracker.ietf.org/doc/html/rfc7231.html + + (3) https://datatracker.ietf.org/doc/html/rfc7231.html + + (4) https://datatracker.ietf.org/doc/html/rfc7231.html + + (5) https://datatracker.ietf.org/doc/html/rfc7231.html + + (6) https://datatracker.ietf.org/doc/html/rfc7231.html + + (7) https://datatracker.ietf.org/doc/html/rfc7231.html + + (8) https://datatracker.ietf.org/doc/html/rfc7231.html + + (9) https://datatracker.ietf.org/doc/html/rfc7231.html + + (10) https://datatracker.ietf.org/doc/html/rfc5789.html + + +File: python.info, Node: http client — HTTP protocol client, Next: ftplib — FTP protocol client, Prev: http — HTTP modules, Up: Internet Protocols and Support + +5.21.10 ‘http.client’ — HTTP protocol client +-------------------------------------------- + +`Source code:' Lib/http/client.py(1) + +__________________________________________________________________ + +This module defines classes that implement the client side of the HTTP +and HTTPS protocols. It is normally not used directly — the module +*note urllib.request: 12a. uses it to handle URLs that use HTTP and +HTTPS. + +See also +........ + +The Requests package(2) is recommended for a higher-level HTTP client +interface. + + Note: HTTPS support is only available if Python was compiled with + SSL support (through the *note ssl: f0. module). + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +The module provides the following classes: + + -- Class: http.client.HTTPConnection (host, port=None[, timeout], + source_address=None, blocksize=8192) + + An *note HTTPConnection: 796. 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 + ‘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: + + >>> 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) + + 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. + + -- Class: http.client.HTTPSConnection (host, port=None, key_file=None, + cert_file=None[, timeout], source_address=None, *, + context=None, check_hostname=None, blocksize=8192) + + A subclass of *note HTTPConnection: 796. that uses SSL for + communication with secure servers. Default port is ‘443’. If + `context' is specified, it must be a *note ssl.SSLContext: 430. + instance describing the various SSL options. + + Please read *note Security considerations: 2b9e. 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 *note ssl.HAS_SNI: 2cc4. 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 ‘ssl._create_unverified_context()’ + can be passed to the `context' parameter. + + Changed in version 3.8: This class now enables TLS 1.3 *note + ssl.SSLContext.post_handshake_auth: 67e. 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 ‘http/1.1’ when no `context' is given. + Custom `context' should set ALPN protocols with + ‘set_alpn_protocol()’. + + Deprecated since version 3.6: `key_file' and `cert_file' are + deprecated in favor of `context'. Please use *note + ssl.SSLContext.load_cert_chain(): df1. instead, or let *note + ssl.create_default_context(): c46. select the system’s trusted CA + certificates for you. + + The `check_hostname' parameter is also deprecated; the *note + ssl.SSLContext.check_hostname: 2cb7. attribute of `context' should + be used instead. + + -- 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. + +This module provides the following function: + + -- 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 ‘BufferedIOBase’ reader + (i.e. not text) and must provide a valid RFC 2822(3) style header. + + This function returns an instance of ‘http.client.HTTPMessage’ that + holds the header fields, but no payload (the same as *note + HTTPResponse.msg: 32a2. and *note + http.server.BaseHTTPRequestHandler.headers: 32a3.). After + returning, the file pointer `fp' is ready to read the HTTP body. + + Note: *note parse_headers(): 1487. does not parse the + start-line of a HTTP message; it only parses the ‘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. + +The following exceptions are raised as appropriate: + + -- Exception: http.client.HTTPException + + The base class of the other exceptions in this module. It is a + subclass of *note Exception: 61c. + + -- Exception: http.client.NotConnected + + A subclass of *note HTTPException: 32a4. + + -- Exception: http.client.InvalidURL + + A subclass of *note HTTPException: 32a4, raised if a port is given + and is either non-numeric or empty. + + -- Exception: http.client.UnknownProtocol + + A subclass of *note HTTPException: 32a4. + + -- Exception: http.client.UnknownTransferEncoding + + A subclass of *note HTTPException: 32a4. + + -- Exception: http.client.UnimplementedFileMode + + A subclass of *note HTTPException: 32a4. + + -- Exception: http.client.IncompleteRead + + A subclass of *note HTTPException: 32a4. + + -- Exception: http.client.ImproperConnectionState + + A subclass of *note HTTPException: 32a4. + + -- Exception: http.client.CannotSendRequest + + A subclass of *note ImproperConnectionState: 32ab. + + -- Exception: http.client.CannotSendHeader + + A subclass of *note ImproperConnectionState: 32ab. + + -- Exception: http.client.ResponseNotReady + + A subclass of *note ImproperConnectionState: 32ab. + + -- Exception: http.client.BadStatusLine + + A subclass of *note HTTPException: 32a4. Raised if a server + responds with a HTTP status code that we don’t understand. + + -- Exception: http.client.LineTooLong + + A subclass of *note HTTPException: 32a4. Raised if an excessively + long line is received in the HTTP protocol from the server. + + -- Exception: http.client.RemoteDisconnected + + A subclass of *note ConnectionResetError: d0f. and *note + BadStatusLine: 32af. Raised by *note HTTPConnection.getresponse(): + a89. when the attempt to read the response results in no data read + from the connection, indicating that the remote end has closed the + connection. + + New in version 3.5: Previously, *note BadStatusLine: 32af.‘('')’ + was raised. + +The constants defined in this module are: + + -- Data: http.client.HTTP_PORT + + The default port for the HTTP protocol (always ‘80’). + + -- Data: http.client.HTTPS_PORT + + The default port for the HTTPS protocol (always ‘443’). + + -- Data: http.client.responses + + This dictionary maps the HTTP 1.1 status codes to the W3C names. + + Example: ‘http.client.responses[http.client.NOT_FOUND]’ is ‘'Not + Found'’. + +See *note HTTP status codes: 329b. for a list of HTTP status codes that +are available in this module as constants. + +* Menu: + +* HTTPConnection Objects:: +* HTTPResponse Objects:: +* Examples: Examples<26>. +* HTTPMessage Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/http/client.py + + (2) https://requests.readthedocs.io/en/master/ + + (3) https://datatracker.ietf.org/doc/html/rfc2822.html + + +File: python.info, Node: HTTPConnection Objects, Next: HTTPResponse Objects, Up: http client — HTTP protocol client + +5.21.10.1 HTTPConnection Objects +................................ + +*note HTTPConnection: 796. instances have the following methods: + + -- 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 selector `url'. + + If `body' is specified, the specified data is sent after the + headers are finished. It may be a *note str: 1b3, a *note + bytes-like object: 9a2, an open *note file object: e76, or an + iterable of *note bytes: 1b4. 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 *note file object: e76, the + contents of the file is sent; this file object should support at + least the ‘read()’ method. If the file object is an instance of + *note io.TextIOBase: f50, the data returned by the ‘read()’ method + will be encoded as ISO-8859-1, otherwise the data returned by + ‘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. + + 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 ‘None’, the Content-Length + header is set to ‘0’ for methods that expect a body (‘PUT’, ‘POST’, + and ‘PATCH’). If `body' is a string or a bytes-like object that is + not also a *note file: e76, 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 ‘False’, the + HTTPConnection object assumes that all encoding is handled by the + calling code. If it is ‘True’, the body will be chunk-encoded. + + 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 *note str: 1b3. or bytes-like + object that is not also a file as the body representation. + + New 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. + + -- Method: HTTPConnection.getresponse () + + Should be called after a request is sent to get the response from + the server. Returns an *note HTTPResponse: d79. instance. + + Note: Note that you must have read the whole response before + you can send a new request to the server. + + Changed in version 3.5: If a *note ConnectionError: a8b. or + subclass is raised, the *note HTTPConnection: 796. object will be + ready to reconnect when a new request is sent. + + -- Method: HTTPConnection.set_debuglevel (level) + + Set the debugging level. The default debug level is ‘0’, meaning + no debugging output is printed. Any value greater than ‘0’ will + cause all currently defined debug output to be printed to stdout. + The ‘debuglevel’ is passed to any new *note HTTPResponse: d79. + objects that are created. + + New in version 3.1. + + -- 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. + + For example, to tunnel through a HTTPS proxy server running locally + on port 8080, we would pass the address of the proxy to the *note + HTTPSConnection: 797. constructor, and the address of the host that + we eventually want to reach to the *note set_tunnel(): eda. method: + + >>> import http.client + >>> conn = http.client.HTTPSConnection("localhost", 8080) + >>> conn.set_tunnel("www.python.org") + >>> conn.request("HEAD","/index.html") + + New in version 3.2. + + -- 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 *note auditing event: 12c0. ‘http.client.connect’ with + arguments ‘self’, ‘host’, ‘port’. + + -- Method: HTTPConnection.close () + + Close the connection to the server. + + -- Attribute: HTTPConnection.blocksize + + Buffer size in bytes for sending a file-like message body. + + New in version 3.7. + +As an alternative to using the ‘request()’ method described above, you +can also send your request step by step, by using the four functions +below. + + -- 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 + (‘HTTP/1.1’). To disable automatic sending of ‘Host:’ or + ‘Accept-Encoding:’ headers (for example to accept additional + content encodings), specify `skip_host' or `skip_accept_encoding' + with non-False values. + + -- Method: HTTPConnection.putheader (header, argument[, ...]) + + Send an RFC 822(1)-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. + + -- 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 ‘True’, the result of each iteration of + `message_body' will be chunk-encoded as specified in RFC 7230(2), + Section 3.3.1. How the data is encoded is dependent on the type of + `message_body'. If `message_body' implements the *note buffer + interface: 1ba6. the encoding will result in a single chunk. If + `message_body' is a *note collections.abc.Iterable: 1ca5, each + iteration of `message_body' will result in a chunk. If + `message_body' is a *note file object: e76, each call to ‘.read()’ + will result in a chunk. The method automatically signals the end + of the chunk-encoded data immediately after `message_body'. + + 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. + + New in version 3.6: Chunked encoding support. The `encode_chunked' + parameter was added. + + -- Method: HTTPConnection.send (data) + + Send data to the server. This should be used directly only after + the *note endheaders(): 917. method has been called and before + *note getresponse(): a89. is called. + + Raises an *note auditing event: 12c0. ‘http.client.send’ with + arguments ‘self’, ‘data’. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc822.html + + (2) https://datatracker.ietf.org/doc/html/rfc7230.html + + +File: python.info, Node: HTTPResponse Objects, Next: Examples<26>, Prev: HTTPConnection Objects, Up: http client — HTTP protocol client + +5.21.10.2 HTTPResponse Objects +.............................. + +An *note HTTPResponse: d79. 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 *note io.BufferedIOBase: 949. interface is +now implemented and all of its reader operations are supported. + + -- Method: HTTPResponse.read ([amt]) + + Reads and returns the response body, or up to the next `amt' bytes. + + -- 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. + + New in version 3.3. + + -- 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. + + -- Method: HTTPResponse.getheaders () + + Return a list of (header, value) tuples. + + -- Method: HTTPResponse.fileno () + + Return the ‘fileno’ of the underlying socket. + + -- Attribute: HTTPResponse.msg + + A ‘http.client.HTTPMessage’ instance containing the response + headers. ‘http.client.HTTPMessage’ is a subclass of *note + email.message.Message: 90b. + + -- Attribute: HTTPResponse.version + + HTTP protocol version used by server. 10 for HTTP/1.0, 11 for + HTTP/1.1. + + -- Attribute: HTTPResponse.url + + URL of the resource retrieved, commonly used to determine if a + redirect was followed. + + -- Attribute: HTTPResponse.headers + + Headers of the response in the form of an *note + email.message.EmailMessage: 90c. instance. + + -- Attribute: HTTPResponse.status + + Status code returned by server. + + -- Attribute: HTTPResponse.reason + + Reason phrase returned by server. + + -- Attribute: HTTPResponse.debuglevel + + A debugging hook. If *note debuglevel: 32c7. is greater than zero, + messages will be printed to stdout as the response is read and + parsed. + + -- Attribute: HTTPResponse.closed + + Is ‘True’ if the stream is closed. + + -- Method: HTTPResponse.geturl () + + Deprecated since version 3.9: Deprecated in favor of *note url: + 32c4. + + -- Method: HTTPResponse.info () + + Deprecated since version 3.9: Deprecated in favor of *note headers: + 32c5. + + -- Method: HTTPResponse.getstatus () + + Deprecated since version 3.9: Deprecated in favor of *note status: + 32c6. + + +File: python.info, Node: Examples<26>, Next: HTTPMessage Objects, Prev: HTTPResponse Objects, Up: http client — HTTP protocol client + +5.21.10.3 Examples +.................. + +Here is an example session that uses the ‘GET’ method: + + >>> 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() + +Here is an example session that uses the ‘HEAD’ method. Note that the +‘HEAD’ method never returns any data. + + >>> 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'' + True + +Here is an example session that uses the ‘POST’ method: + + >>> 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() + +Client side HTTP ‘PUT’ requests are very similar to ‘POST’ requests. +The difference lies only on the server side where HTTP servers will +allow resources to be created via ‘PUT’ requests. It should be noted +that custom HTTP methods are also handled in *note +urllib.request.Request: c7a. by setting the appropriate method +attribute. Here is an example session that uses the ‘PUT’ method: + + >>> # 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 + + +File: python.info, Node: HTTPMessage Objects, Prev: Examples<26>, Up: http client — HTTP protocol client + +5.21.10.4 HTTPMessage Objects +............................. + +An ‘http.client.HTTPMessage’ instance holds the headers from an HTTP +response. It is implemented using the *note email.message.Message: 90b. +class. + + +File: python.info, Node: ftplib — FTP protocol client, Next: poplib — POP3 protocol client, Prev: http client — HTTP protocol client, Up: Internet Protocols and Support + +5.21.11 ‘ftplib’ — FTP protocol client +-------------------------------------- + +`Source code:' Lib/ftplib.py(1) + +__________________________________________________________________ + +This module defines the class *note FTP: 53d. and a few related items. +The *note FTP: 53d. 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 *note urllib.request: 12a. to handle URLs +that use FTP. For more information on FTP (File Transfer Protocol), see +internet RFC 959(2). + +The default encoding is UTF-8, following RFC 2640(3). + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +Here’s a sample session using the *note ftplib: 7e. module: + + >>> 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.' + +The module defines the following items: + + -- Class: ftplib.FTP (host='', user='', passwd='', acct='', + timeout=None, source_address=None, *, encoding='utf-8') + + Return a new instance of the *note FTP: 53d. class. When `host' is + given, the method call ‘connect(host)’ is made. When `user' is + given, additionally the method call ‘login(user, passwd, acct)’ is + made (where `passwd' and `acct' default to the empty string when + not given). The optional `timeout' parameter specifies a timeout + in seconds for blocking operations like the connection attempt (if + is not specified, the global default timeout setting will be used). + `source_address' is a 2-tuple ‘(host, port)’ for the socket to bind + to as its source address before connecting. The `encoding' + parameter specifies the encoding for directories and filenames. + + The *note FTP: 53d. class supports the *note with: 19e. statement, + e.g.: + + >>> 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 + >>> + + Changed in version 3.2: Support for the *note with: 19e. 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 *note ValueError: 1c8. 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 + RFC 2640(4). + + -- Class: ftplib.FTP_TLS (host='', user='', passwd='', acct='', + keyfile=None, certfile=None, context=None, timeout=None, + source_address=None, *, encoding='utf-8') + + A *note FTP: 53d. subclass which adds TLS support to FTP as + described in RFC 4217(5). Connect as usual to port 21 implicitly + securing the FTP control connection before authenticating. + Securing the data connection requires the user to explicitly ask + for it by calling the *note prot_p(): 32d1. method. `context' is a + *note ssl.SSLContext: 430. object which allows bundling SSL + configuration options, certificates and private keys into a single + (potentially long-lived) structure. Please read *note Security + considerations: 2b9e. for best practices. + + `keyfile' and `certfile' are a legacy alternative to `context' – + they can point to PEM-formatted private key and certificate chain + files (respectively) for the SSL connection. + + New in version 3.2. + + Changed in version 3.3: `source_address' parameter was added. + + Changed in version 3.4: The class now supports hostname check with + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + Deprecated since version 3.6: `keyfile' and `certfile' are + deprecated in favor of `context'. Please use *note + ssl.SSLContext.load_cert_chain(): df1. instead, or let *note + ssl.create_default_context(): c46. select the system’s trusted CA + certificates for you. + + Changed in version 3.9: If the `timeout' parameter is set to be + zero, it will raise a *note ValueError: 1c8. 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 + RFC 2640(6). + + Here’s a sample session using the *note FTP_TLS: 53e. class: + + >>> 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'] + + -- Exception: ftplib.error_reply + + Exception raised when an unexpected reply is received from the + server. + + -- Exception: ftplib.error_temp + + Exception raised when an error code signifying a temporary error + (response codes in the range 400–499) is received. + + -- Exception: ftplib.error_perm + + Exception raised when an error code signifying a permanent error + (response codes in the range 500–599) is received. + + -- 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. + + -- Data: ftplib.all_errors + + The set of all exceptions (as a tuple) that methods of *note FTP: + 53d. 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 *note + OSError: 413. and *note EOFError: f7d. + +See also +........ + +Module *note netrc: bc. + + Parser for the ‘.netrc’ file format. The file ‘.netrc’ is + typically used by FTP clients to load user authentication + information before prompting the user. + +* Menu: + +* FTP Objects:: +* FTP_TLS Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/ftplib.py + + (2) https://datatracker.ietf.org/doc/html/rfc959.html + + (3) https://datatracker.ietf.org/doc/html/rfc2640.html + + (4) https://datatracker.ietf.org/doc/html/rfc2640.html + + (5) https://datatracker.ietf.org/doc/html/rfc4217.html + + (6) https://datatracker.ietf.org/doc/html/rfc2640.html + + +File: python.info, Node: FTP Objects, Next: FTP_TLS Objects, Up: ftplib — FTP protocol client + +5.21.11.1 FTP Objects +..................... + +Several methods are available in two flavors: one for handling text +files and another for binary files. These are named for the command +which is used followed by ‘lines’ for the text version or ‘binary’ for +the binary version. + +*note FTP: 53d. instances have the following methods: + + -- Method: FTP.set_debuglevel (level) + + Set the instance’s debugging level. This controls the amount of + debugging output printed. The default, ‘0’, produces no debugging + output. A value of ‘1’ produces a moderate amount of debugging + output, generally a single line per request. A value of ‘2’ or + higher produces the maximum amount of debugging output, logging + each line sent and received on the control connection. + + -- Method: FTP.connect (host='', port=0, timeout=None, + source_address=None) + + Connect to the given host and port. The default port number is + ‘21’, as specified by the FTP protocol specification. It is rarely + needed to specify a different port number. This function should be + called only once for each instance; it should not be called at all + if a host was given when the instance was created. All other + methods can only be used after a connection has been made. The + optional `timeout' parameter specifies a timeout in seconds for the + connection attempt. If no `timeout' is passed, the global default + timeout setting will be used. `source_address' is a 2-tuple + ‘(host, port)’ for the socket to bind to as its source address + before connecting. + + Raises an *note auditing event: 12c0. ‘ftplib.connect’ with + arguments ‘self’, ‘host’, ‘port’. + + Changed in version 3.3: `source_address' parameter was added. + + -- Method: FTP.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.) + + -- Method: FTP.login (user='anonymous', passwd='', acct='') + + Log in as the given `user'. The `passwd' and `acct' parameters are + optional and default to the empty string. If no `user' is + specified, it defaults to ‘'anonymous'’. If `user' is + ‘'anonymous'’, the default `passwd' is ‘'anonymous@'’. This + function should be called only once for each instance, after a + connection has been established; it should not be called at all if + a host and user were given when the instance was created. Most FTP + commands are only allowed after the client has logged in. The + `acct' parameter supplies “accounting information”; few systems + implement this. + + -- Method: FTP.abort () + + Abort a file transfer that is in progress. Using this does not + always work, but it’s worth a try. + + -- Method: FTP.sendcmd (cmd) + + Send a simple command string to the server and return the response + string. + + Raises an *note auditing event: 12c0. ‘ftplib.sendcmd’ with + arguments ‘self’, ‘cmd’. + + -- Method: FTP.voidcmd (cmd) + + Send a simple command string to the server and handle the response. + Return nothing if a response code corresponding to success (codes + in the range 200–299) is received. Raise *note error_reply: 32d2. + otherwise. + + Raises an *note auditing event: 12c0. ‘ftplib.sendcmd’ with + arguments ‘self’, ‘cmd’. + + -- Method: FTP.retrbinary (cmd, callback, blocksize=8192, rest=None) + + Retrieve a file in binary transfer mode. `cmd' should be an + appropriate ‘RETR’ command: ‘'RETR filename'’. The `callback' + function is called for each block of data received, with a single + bytes argument giving the data block. The optional `blocksize' + argument specifies the maximum chunk size to read on the low-level + socket object created to do the actual transfer (which will also be + the largest size of the data blocks passed to `callback'). A + reasonable default is chosen. `rest' means the same thing as in + the *note transfercmd(): 32e1. method. + + -- Method: FTP.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 ‘RETR’ command (see *note retrbinary(): 32e0.) or a + command such as ‘LIST’ or ‘NLST’ (usually just the string + ‘'LIST'’). ‘LIST’ retrieves a list of files and information about + those files. ‘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 ‘sys.stdout’. + + -- Method: FTP.set_pasv (val) + + Enable “passive” mode if `val' is true, otherwise disable passive + mode. Passive mode is on by default. + + -- Method: FTP.storbinary (cmd, fp, blocksize=8192, callback=None, + rest=None) + + Store a file in binary transfer mode. `cmd' should be an + appropriate ‘STOR’ command: ‘"STOR filename"’. `fp' is a *note + file object: e76. (opened in binary mode) which is read until EOF + using its ‘read()’ method in blocks of size `blocksize' to provide + the data to be stored. The `blocksize' argument defaults to 8192. + `callback' is an optional single parameter callable that is called + on each block of data after it is sent. `rest' means the same + thing as in the *note transfercmd(): 32e1. method. + + Changed in version 3.2: `rest' parameter added. + + -- Method: FTP.storlines (cmd, fp, callback=None) + + Store a file in line mode. `cmd' should be an appropriate ‘STOR’ + command (see *note storbinary(): fad.). Lines are read until EOF + from the *note file object: e76. `fp' (opened in binary mode) using + its *note readline(): 1ce1. 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. + + -- Method: FTP.transfercmd (cmd, rest=None) + + Initiate a transfer over the data connection. If the transfer is + active, send an ‘EPRT’ or ‘PORT’ command and the transfer command + specified by `cmd', and accept the connection. If the server is + passive, send an ‘EPSV’ or ‘PASV’ command, connect to it, and start + the transfer command. Either way, return the socket for the + connection. + + If optional `rest' is given, a ‘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 *note transfercmd(): 32e1. + 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 ‘REST’ + command, an *note error_reply: 32d2. exception will be raised. If + this happens, simply call *note transfercmd(): 32e1. without a + `rest' argument. + + -- Method: FTP.ntransfercmd (cmd, rest=None) + + Like *note transfercmd(): 32e1, but returns a tuple of the data + connection and the expected size of the data. If the expected size + could not be computed, ‘None’ will be returned as the expected + size. `cmd' and `rest' means the same thing as in *note + transfercmd(): 32e1. + + -- Method: FTP.mlsd (path='', facts=[]) + + List a directory in a standardized format by using ‘MLSD’ command ( + RFC 3659(1)). If `path' is omitted the current directory is + assumed. `facts' is a list of strings representing the type of + information desired (e.g. ‘["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. + + New in version 3.3. + + -- Method: FTP.nlst (argument[, ...]) + + Return a list of file names as returned by the ‘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 ‘NLST’ command. + + Note: If your server supports the command, *note mlsd(): d6d. + offers a better API. + + -- Method: FTP.dir (argument[, ...]) + + Produce a directory listing as returned by the ‘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 + ‘LIST’ command. If the last argument is a function, it is used as + a `callback' function as for *note retrlines(): 32e2.; the default + prints to ‘sys.stdout’. This method returns ‘None’. + + Note: If your server supports the command, *note mlsd(): d6d. + offers a better API. + + -- Method: FTP.rename (fromname, toname) + + Rename file `fromname' on the server to `toname'. + + -- Method: FTP.delete (filename) + + Remove the file named `filename' from the server. If successful, + returns the text of the response, otherwise raises *note + error_perm: 32d4. on permission errors or *note error_reply: 32d2. + on other errors. + + -- Method: FTP.cwd (pathname) + + Set the current directory on the server. + + -- Method: FTP.mkd (pathname) + + Create a new directory on the server. + + -- Method: FTP.pwd () + + Return the pathname of the current directory on the server. + + -- Method: FTP.rmd (dirname) + + Remove the directory named `dirname' on the server. + + -- Method: FTP.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 + ‘None’ is returned. Note that the ‘SIZE’ command is not + standardized, but is supported by many common server + implementations. + + -- Method: FTP.quit () + + Send a ‘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 ‘QUIT’ + command. This implies a call to the *note close(): 32ee. method + which renders the *note FTP: 53d. instance useless for subsequent + calls (see below). + + -- Method: FTP.close () + + Close the connection unilaterally. This should not be applied to + an already closed connection such as after a successful call to + *note quit(): 32ed. After this call the *note FTP: 53d. instance + should not be used any more (after a call to *note close(): 32ee. + or *note quit(): 32ed. you cannot reopen the connection by issuing + another *note login(): 32dc. method). + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc3659.html + + +File: python.info, Node: FTP_TLS Objects, Prev: FTP Objects, Up: ftplib — FTP protocol client + +5.21.11.2 FTP_TLS Objects +......................... + +*note FTP_TLS: 53e. class inherits from *note FTP: 53d, defining these +additional objects: + + -- Attribute: FTP_TLS.ssl_version + + The SSL version to use (defaults to *note ssl.PROTOCOL_SSLv23: + 489.). + + -- Method: FTP_TLS.auth () + + Set up a secure control connection by using TLS or SSL, depending + on what is specified in the *note ssl_version: 32f0. attribute. + + Changed in version 3.4: The method now supports hostname check with + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + -- Method: FTP_TLS.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. + + New in version 3.3. + + -- Method: FTP_TLS.prot_p () + + Set up secure data connection. + + -- Method: FTP_TLS.prot_c () + + Set up clear text data connection. + + +File: python.info, Node: poplib — POP3 protocol client, Next: imaplib — IMAP4 protocol client, Prev: ftplib — FTP protocol client, Up: Internet Protocols and Support + +5.21.12 ‘poplib’ — POP3 protocol client +--------------------------------------- + +`Source code:' Lib/poplib.py(1) + +__________________________________________________________________ + +This module defines a class, *note POP3: 56c, which encapsulates a +connection to a POP3 server and implements the protocol as defined in +RFC 1939(2). The *note POP3: 56c. class supports both the minimal and +optional command sets from RFC 1939(3). The *note POP3: 56c. class also +supports the ‘STLS’ command introduced in RFC 2595(4) to enable +encrypted communication on an already established connection. + +Additionally, this module provides a class *note POP3_SSL: 56d, 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 *note imaplib.IMAP4: 546. class, as IMAP servers tend to be +better implemented. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +The *note poplib: cd. module provides two classes: + + -- 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 *note auditing event: 12c0. ‘poplib.connect’ with + arguments ‘self’, ‘host’, ‘port’. + + All commands will raise an *note auditing event: 12c0. + ‘poplib.putline’ with arguments ‘self’ and ‘line’, where ‘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 *note ValueError: 1c8. to prevent the + creation of a non-blocking socket. + + -- Class: poplib.POP3_SSL (host, port=POP3_SSL_PORT, keyfile=None, + certfile=None, timeout=None, context=None) + + This is a subclass of *note POP3: 56c. 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 + *note POP3: 56c. constructor. `context' is an optional *note + ssl.SSLContext: 430. object which allows bundling SSL configuration + options, certificates and private keys into a single (potentially + long-lived) structure. Please read *note Security considerations: + 2b9e. for best practices. + + `keyfile' and `certfile' are a legacy alternative to `context' - + they can point to PEM-formatted private key and certificate chain + files, respectively, for the SSL connection. + + Raises an *note auditing event: 12c0. ‘poplib.connect’ with + arguments ‘self’, ‘host’, ‘port’. + + All commands will raise an *note auditing event: 12c0. + ‘poplib.putline’ with arguments ‘self’ and ‘line’, where ‘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 + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + Deprecated since version 3.6: `keyfile' and `certfile' are + deprecated in favor of `context'. Please use *note + ssl.SSLContext.load_cert_chain(): df1. instead, or let *note + ssl.create_default_context(): c46. select the system’s trusted CA + certificates for you. + + Changed in version 3.9: If the `timeout' parameter is set to be + zero, it will raise a *note ValueError: 1c8. to prevent the + creation of a non-blocking socket. + +One exception is defined as an attribute of the *note poplib: cd. +module: + + -- Exception: poplib.error_proto + + Exception raised on any errors from this module (errors from *note + socket: ec. module are not caught). The reason for the exception + is passed to the constructor as a string. + +See also +........ + +Module *note imaplib: 94. + + The standard Python IMAP module. + +Frequently Asked Questions About Fetchmail(5) + + The FAQ for the ‘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. + +* Menu: + +* POP3 Objects:: +* POP3 Example:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/poplib.py + + (2) https://datatracker.ietf.org/doc/html/rfc1939.html + + (3) https://datatracker.ietf.org/doc/html/rfc1939.html + + (4) https://datatracker.ietf.org/doc/html/rfc2595.html + + (5) http://www.catb.org/~esr/fetchmail/fetchmail-FAQ.html + + +File: python.info, Node: POP3 Objects, Next: POP3 Example, Up: poplib — POP3 protocol client + +5.21.12.1 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 *note POP3: 56c. instance has the following methods: + + -- Method: POP3.set_debuglevel (level) + + Set the instance’s debugging level. This controls the amount of + debugging output printed. The default, ‘0’, produces no debugging + output. A value of ‘1’ produces a moderate amount of debugging + output, generally a single line per request. A value of ‘2’ or + higher produces the maximum amount of debugging output, logging + each line sent and received on the control connection. + + -- Method: POP3.getwelcome () + + Returns the greeting string sent by the POP3 server. + + -- Method: POP3.capa () + + Query the server’s capabilities as specified in RFC 2449(1). + Returns a dictionary in the form ‘{'name': ['param'...]}’. + + New in version 3.4. + + -- Method: POP3.user (username) + + Send user command, response should indicate that a password is + required. + + -- Method: POP3.pass_ (password) + + Send password, response includes message count and mailbox size. + Note: the mailbox on the server is locked until ‘quit()’ is called. + + -- Method: POP3.apop (user, secret) + + Use the more secure APOP authentication to log into the POP3 + server. + + -- Method: POP3.rpop (user) + + Use RPOP authentication (similar to UNIX r-commands) to log into + POP3 server. + + -- Method: POP3.stat () + + Get mailbox status. The result is a tuple of 2 integers: ‘(message + count, mailbox size)’. + + -- Method: POP3.list ([which]) + + Request message list, result is in the form ‘(response, ['mesg_num + octets', ...], octets)’. If `which' is set, it is the message to + list. + + -- Method: POP3.retr (which) + + Retrieve whole message number `which', and set its seen flag. + Result is in form ‘(response, ['line', ...], octets)’. + + -- 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). + + -- Method: POP3.rset () + + Remove any deletion marks for the mailbox. + + -- Method: POP3.noop () + + Do nothing. Might be used as a keep-alive. + + -- Method: POP3.quit () + + Signoff: commit changes, unlock mailbox, drop connection. + + -- 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 + ‘(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. + + -- 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 + ‘'response mesgnum uid’, otherwise result is list ‘(response, + ['mesgnum uid', ...], octets)’. + + -- Method: POP3.utf8 () + + Try to switch to UTF-8 mode. Returns the server response if + successful, raises *note error_proto: e51. if not. Specified in + RFC 6856(2). + + New in version 3.5. + + -- Method: POP3.stls (context=None) + + Start a TLS session on the active connection as specified in RFC + 2595(3). This is only allowed before user authentication + + `context' parameter is a *note ssl.SSLContext: 430. object which + allows bundling SSL configuration options, certificates and private + keys into a single (potentially long-lived) structure. Please read + *note Security considerations: 2b9e. for best practices. + + This method supports hostname checking via *note + ssl.SSLContext.check_hostname: 2cb7. and `Server Name Indication' + (see *note ssl.HAS_SNI: 2cc4.). + + New in version 3.4. + +Instances of *note POP3_SSL: 56d. have no additional methods. The +interface of this subclass is identical to its parent. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2449.html + + (2) https://datatracker.ietf.org/doc/html/rfc6856.html + + (3) https://datatracker.ietf.org/doc/html/rfc2595.html + + +File: python.info, Node: POP3 Example, Prev: POP3 Objects, Up: poplib — POP3 protocol client + +5.21.12.2 POP3 Example +...................... + +Here is a minimal example (without error checking) that opens a mailbox +and retrieves and prints all messages: + + 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) + +At the end of the module, there is a test section that contains a more +extensive example of usage. + + +File: python.info, Node: imaplib — IMAP4 protocol client, Next: smtplib — SMTP protocol client, Prev: poplib — POP3 protocol client, Up: Internet Protocols and Support + +5.21.13 ‘imaplib’ — IMAP4 protocol client +----------------------------------------- + +`Source code:' Lib/imaplib.py(1) + +__________________________________________________________________ + +This module defines three classes, *note IMAP4: 546, *note IMAP4_SSL: +547. and *note IMAP4_stream: 549, which encapsulate a connection to an +IMAP4 server and implement a large subset of the IMAP4rev1 client +protocol as defined in RFC 2060(2). It is backward compatible with +IMAP4 ( RFC 1730(3)) servers, but note that the ‘STATUS’ command is not +supported in IMAP4. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +Three classes are provided by the *note imaplib: 94. module, *note +IMAP4: 546. is the base class: + + -- Class: imaplib.IMAP4 (host='', 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, ‘''’ + (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 None, the global default socket timeout is used. + + The *note IMAP4: 546. class supports the *note with: 19e. + statement. When used like this, the IMAP4 ‘LOGOUT’ command is + issued automatically when the ‘with’ statement exits. E.g.: + + >>> from imaplib import IMAP4 + >>> with IMAP4("domain.org") as M: + ... M.noop() + ... + ('OK', [b'Nothing Accomplished. d25if65hy903weo.87']) + + Changed in version 3.5: Support for the *note with: 19e. statement + was added. + + Changed in version 3.9: The optional `timeout' parameter was added. + +Three exceptions are defined as attributes of the *note IMAP4: 546. +class: + + -- Exception: IMAP4.error + + Exception raised on any errors. The reason for the exception is + passed to the constructor as a string. + + -- Exception: IMAP4.abort + + IMAP4 server errors cause this exception to be raised. This is a + sub-class of *note IMAP4.error: 3309. Note that closing the + instance and instantiating a new one will usually allow recovery + from this exception. + + -- Exception: IMAP4.readonly + + This exception is raised when a writable mailbox has its status + changed by the server. This is a sub-class of *note IMAP4.error: + 3309. Some other client now has write permission, and the mailbox + will need to be re-opened to re-obtain write permission. + +There’s also a subclass for secure connections: + + -- Class: imaplib.IMAP4_SSL (host='', port=IMAP4_SSL_PORT, + keyfile=None, certfile=None, ssl_context=None, timeout=None) + + This is a subclass derived from *note IMAP4: 546. 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, ‘''’ (the local host) is used. If `port' is omitted, + the standard IMAP4-over-SSL port (993) is used. `ssl_context' is a + *note ssl.SSLContext: 430. object which allows bundling SSL + configuration options, certificates and private keys into a single + (potentially long-lived) structure. Please read *note Security + considerations: 2b9e. for best practices. + + `keyfile' and `certfile' are a legacy alternative to `ssl_context' + - they can point to PEM-formatted private key and certificate chain + files for the SSL connection. Note that the `keyfile'/`certfile' + parameters are mutually exclusive with `ssl_context', a *note + ValueError: 1c8. is raised if `keyfile'/`certfile' is provided + along with `ssl_context'. + + The optional `timeout' parameter specifies a timeout in seconds for + the connection attempt. If timeout is not given or is 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 + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + Deprecated since version 3.6: `keyfile' and `certfile' are + deprecated in favor of `ssl_context'. Please use *note + ssl.SSLContext.load_cert_chain(): df1. instead, or let *note + ssl.create_default_context(): c46. select the system’s trusted CA + certificates for you. + + Changed in version 3.9: The optional `timeout' parameter was added. + +The second subclass allows for connections created by a child process: + + -- Class: imaplib.IMAP4_stream (command) + + This is a subclass derived from *note IMAP4: 546. that connects to + the ‘stdin/stdout’ file descriptors created by passing `command' to + ‘subprocess.Popen()’. + +The following utility functions are defined: + + -- Function: imaplib.Internaldate2tuple (datestr) + + Parse an IMAP4 ‘INTERNALDATE’ string and return corresponding local + time. The return value is a *note time.struct_time: 959. tuple or + ‘None’ if the string has wrong format. + + -- Function: imaplib.Int2AP (num) + + Converts an integer into a bytes representation using characters + from the set [‘A’ .. ‘P’]. + + -- Function: imaplib.ParseFlags (flagstr) + + Converts an IMAP4 ‘FLAGS’ response to a tuple of individual flags. + + -- Function: imaplib.Time2Internaldate (date_time) + + Convert `date_time' to an IMAP4 ‘INTERNALDATE’ representation. The + return value is a string in the form: ‘"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 *note time.time(): 736.), a 9-tuple representing local + time an instance of *note time.struct_time: 959. (as returned by + *note time.localtime(): 13ad.), an aware instance of *note + datetime.datetime: 4be, or a double-quoted string. In the last + case, it is assumed to already be in the correct format. + +Note that IMAP4 message numbers change as the mailbox changes; in +particular, after an ‘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. + +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') ‘https://github.com/uw-imap/imap’ (`Not +Maintained'). + +* Menu: + +* IMAP4 Objects:: +* IMAP4 Example:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/imaplib.py + + (2) https://datatracker.ietf.org/doc/html/rfc2060.html + + (3) https://datatracker.ietf.org/doc/html/rfc1730.html + + +File: python.info, Node: IMAP4 Objects, Next: IMAP4 Example, Up: imaplib — IMAP4 protocol client + +5.21.13.1 IMAP4 Objects +....................... + +All IMAP4rev1 commands are represented by methods of the same name, +either upper-case or lower-case. + +All arguments to commands are converted to strings, except for +‘AUTHENTICATE’, and the last argument to ‘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 ‘LOGIN’ command is always quoted. If you want to avoid +having an argument string quoted (eg: the `flags' argument to ‘STORE’) +then enclose the string in parentheses (eg: ‘r'(\Deleted)'’). + +Each command returns a tuple: ‘(type, [data, ...])’ where `type' is +usually ‘'OK'’ or ‘'NO'’, and `data' is either the text from the command +response, or mandated results from the command. Each `data' is either a +‘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 +(‘'1'’), a range of message numbers (‘'2:4'’), or a group of +non-contiguous ranges separated by commas (‘'1:3,6:9'’). A range can +contain an asterisk to indicate an infinite upper bound (‘'3:*'’). + +An *note IMAP4: 546. instance has the following methods: + + -- Method: IMAP4.append (mailbox, flags, date_time, message) + + Append `message' to named mailbox. + + -- 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 ‘capabilities’ in the + form ‘AUTH=mechanism’. + + `authobject' must be a callable object: + + data = authobject(response) + + It will be called to process server continuation responses; the + `response' argument it is passed will be ‘bytes’. It should return + ‘bytes’ `data' that will be base64 encoded and sent to the server. + It should return ‘None’ if the client abort response ‘*’ should be + sent instead. + + Changed in version 3.5: string usernames and passwords are now + encoded to ‘utf-8’ instead of being limited to ASCII. + + -- Method: IMAP4.check () + + Checkpoint mailbox on server. + + -- Method: IMAP4.close () + + Close currently selected mailbox. Deleted messages are removed + from writable mailbox. This is the recommended command before + ‘LOGOUT’. + + -- Method: IMAP4.copy (message_set, new_mailbox) + + Copy `message_set' messages onto end of `new_mailbox'. + + -- Method: IMAP4.create (mailbox) + + Create new mailbox named `mailbox'. + + -- Method: IMAP4.delete (mailbox) + + Delete old mailbox named `mailbox'. + + -- Method: IMAP4.deleteacl (mailbox, who) + + Delete the ACLs (remove any rights) set for who on mailbox. + + -- Method: IMAP4.enable (capability) + + Enable `capability' (see RFC 5161(1)). Most capabilities do not + need to be enabled. Currently only the ‘UTF8=ACCEPT’ capability is + supported (see RFC 6855(2)). + + New in version 3.5: The *note enable(): a8e. method itself, and RFC + 6855(3) support. + + -- Method: IMAP4.expunge () + + Permanently remove deleted items from selected mailbox. Generates + an ‘EXPUNGE’ response for each deleted message. Returned data + contains a list of ‘EXPUNGE’ message numbers in order received. + + -- 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: ‘"(UID + BODY[TEXT])"’. Returned data are tuples of message part envelope + and data. + + -- Method: IMAP4.getacl (mailbox) + + Get the ‘ACL’s for `mailbox'. The method is non-standard, but is + supported by the ‘Cyrus’ server. + + -- Method: IMAP4.getannotation (mailbox, entry, attribute) + + Retrieve the specified ‘ANNOTATION’s for `mailbox'. The method is + non-standard, but is supported by the ‘Cyrus’ server. + + -- Method: IMAP4.getquota (root) + + Get the ‘quota’ `root'’s resource usage and limits. This method is + part of the IMAP4 QUOTA extension defined in rfc2087. + + -- Method: IMAP4.getquotaroot (mailbox) + + Get the list of ‘quota’ ‘roots’ for the named `mailbox'. This + method is part of the IMAP4 QUOTA extension defined in rfc2087. + + -- 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 ‘LIST’ responses. + + -- Method: IMAP4.login (user, password) + + Identify the client using a plaintext password. The `password' + will be quoted. + + -- Method: IMAP4.login_cram_md5 (user, password) + + Force use of ‘CRAM-MD5’ authentication when identifying the client + to protect the password. Will only work if the server ‘CAPABILITY’ + response includes the phrase ‘AUTH=CRAM-MD5’. + + -- Method: IMAP4.logout () + + Shutdown connection to server. Returns server ‘BYE’ response. + + Changed in version 3.8: The method no longer ignores silently + arbitrary exceptions. + + -- 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. + + -- Method: IMAP4.myrights (mailbox) + + Show my ACLs for a mailbox (i.e. the rights that I have on + mailbox). + + -- Method: IMAP4.namespace () + + Returns IMAP namespaces as defined in RFC 2342(4). + + -- Method: IMAP4.noop () + + Send ‘NOOP’ to server. + + -- 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 None, the global default socket timeout + is used. Also note that if the `timeout' parameter is set to be + zero, it will raise a *note ValueError: 1c8. to reject creating a + non-blocking socket. This method is implicitly called by the *note + IMAP4: 546. constructor. The connection objects established by + this method will be used in the *note IMAP4.read(): 3327, *note + IMAP4.readline(): 3328, *note IMAP4.send(): 3329, and *note + IMAP4.shutdown(): 332a. methods. You may override this method. + + Raises an *note auditing event: 12c0. ‘imaplib.open’ with arguments + ‘self’, ‘host’, ‘port’. + + Changed in version 3.9: The `timeout' parameter was added. + + -- 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. + + -- Method: IMAP4.proxyauth (user) + + Assume authentication as `user'. Allows an authorised + administrator to proxy into any user’s mailbox. + + -- Method: IMAP4.read (size) + + Reads `size' bytes from the remote server. You may override this + method. + + -- Method: IMAP4.readline () + + Reads one line from the remote server. You may override this + method. + + -- Method: IMAP4.recent () + + Prompt server for an update. Returned data is ‘None’ if no new + messages, else value of ‘RECENT’ response. + + -- Method: IMAP4.rename (oldmailbox, newmailbox) + + Rename mailbox named `oldmailbox' to `newmailbox'. + + -- Method: IMAP4.response (code) + + Return data for response `code' if received, or ‘None’. Returns + the given code, instead of the usual type. + + -- Method: IMAP4.search (charset, criterion[, ...]) + + Search mailbox for matching messages. `charset' may be ‘None’, in + which case no ‘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 ‘None’ if the ‘UTF8=ACCEPT’ capability + was enabled using the *note enable(): a8e. command. + + Example: + + # M is a connected IMAP4 instance... + typ, msgnums = M.search(None, 'FROM', '"LDJ"') + + # or: + typ, msgnums = M.search(None, '(FROM "LDJ")') + + -- Method: IMAP4.select (mailbox='INBOX', readonly=False) + + Select a mailbox. Returned data is the count of messages in + `mailbox' (‘EXISTS’ response). The default `mailbox' is ‘'INBOX'’. + If the `readonly' flag is set, modifications to the mailbox are not + allowed. + + -- Method: IMAP4.send (data) + + Sends ‘data’ to the remote server. You may override this method. + + Raises an *note auditing event: 12c0. ‘imaplib.send’ with arguments + ‘self’, ‘data’. + + -- Method: IMAP4.setacl (mailbox, who, what) + + Set an ‘ACL’ for `mailbox'. The method is non-standard, but is + supported by the ‘Cyrus’ server. + + -- Method: IMAP4.setannotation (mailbox, entry, attribute[, ...]) + + Set ‘ANNOTATION’s for `mailbox'. The method is non-standard, but + is supported by the ‘Cyrus’ server. + + -- Method: IMAP4.setquota (root, limits) + + Set the ‘quota’ `root'’s resource `limits'. This method is part of + the IMAP4 QUOTA extension defined in rfc2087. + + -- Method: IMAP4.shutdown () + + Close connection established in ‘open’. This method is implicitly + called by *note IMAP4.logout(): 3322. You may override this + method. + + -- Method: IMAP4.socket () + + Returns socket instance used to connect to server. + + -- Method: IMAP4.sort (sort_criteria, charset, search_criterion[, ...]) + + The ‘sort’ command is a variant of ‘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 ‘search’, the searching `charset' argument is + mandatory. There is also a ‘uid sort’ command which corresponds to + ‘sort’ the way that ‘uid search’ corresponds to ‘search’. The + ‘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 ‘IMAP4rev1’ extension command. + + -- Method: IMAP4.starttls (ssl_context=None) + + Send a ‘STARTTLS’ command. The `ssl_context' argument is optional + and should be a *note ssl.SSLContext: 430. object. This will + enable encryption on the IMAP connection. Please read *note + Security considerations: 2b9e. for best practices. + + New in version 3.2. + + Changed in version 3.4: The method now supports hostname check with + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + -- Method: IMAP4.status (mailbox, names) + + Request named status conditions for `mailbox'. + + -- Method: IMAP4.store (message_set, command, flag_list) + + Alters flag dispositions for messages in mailbox. `command' is + specified by section 6.4.6 of RFC 2060(5) as being one of “FLAGS”, + “+FLAGS”, or “-FLAGS”, optionally with a suffix of “.SILENT”. + + For example, to set the delete flag on all messages: + + typ, data = M.search(None, 'ALL') + for num in data[0].split(): + M.store(num, '+FLAGS', '\\Deleted') + M.expunge() + + Note: Creating flags containing ‘]’ (for example: “[test]”) + violates RFC 3501(6) (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 nonetheless 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. + + -- Method: IMAP4.subscribe (mailbox) + + Subscribe to new mailbox. + + -- Method: IMAP4.thread (threading_algorithm, charset, + search_criterion[, ...]) + + The ‘thread’ command is a variant of ‘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 ‘search’, the searching `charset' argument is mandatory. + There is also a ‘uid thread’ command which corresponds to ‘thread’ + the way that ‘uid search’ corresponds to ‘search’. The ‘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 ‘IMAP4rev1’ extension command. + + -- 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. + + -- Method: IMAP4.unsubscribe (mailbox) + + Unsubscribe from old mailbox. + + -- Method: IMAP4.unselect () + + *note imaplib.IMAP4.unselect(): 54a. frees server’s resources + associated with the selected mailbox and returns the server to the + authenticated state. This command performs the same actions as + *note imaplib.IMAP4.close(): 54b, except that no messages are + permanently removed from the currently selected mailbox. + + New in version 3.9. + + -- Method: IMAP4.xatom (name[, ...]) + + Allow simple extension commands notified by server in ‘CAPABILITY’ + response. + +The following attributes are defined on instances of *note IMAP4: 546.: + + -- Attribute: IMAP4.PROTOCOL_VERSION + + The most recent supported protocol in the ‘CAPABILITY’ response + from the server. + + -- Attribute: IMAP4.debug + + Integer value to control debugging output. The initialize value is + taken from the module variable ‘Debug’. Values greater than three + trace each command. + + -- Attribute: IMAP4.utf8_enabled + + Boolean value that is normally ‘False’, but is set to ‘True’ if an + *note enable(): a8e. command is successfully issued for the + ‘UTF8=ACCEPT’ capability. + + New in version 3.5. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc5161.html + + (2) https://datatracker.ietf.org/doc/html/rfc6855.html + + (3) https://datatracker.ietf.org/doc/html/rfc6855.html + + (4) https://datatracker.ietf.org/doc/html/rfc2342.html + + (5) https://datatracker.ietf.org/doc/html/rfc2060.html + + (6) https://datatracker.ietf.org/doc/html/rfc3501.html + + +File: python.info, Node: IMAP4 Example, Prev: IMAP4 Objects, Up: imaplib — IMAP4 protocol client + +5.21.13.2 IMAP4 Example +....................... + +Here is a minimal example (without error checking) that opens a mailbox +and retrieves and prints all messages: + + import getpass, imaplib + + M = imaplib.IMAP4() + 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() + + +File: python.info, Node: smtplib — SMTP protocol client, Next: uuid — UUID objects according to RFC 4122, Prev: imaplib — IMAP4 protocol client, Up: Internet Protocols and Support + +5.21.14 ‘smtplib’ — SMTP protocol client +---------------------------------------- + +`Source code:' Lib/smtplib.py(1) + +__________________________________________________________________ + +The *note smtplib: ea. 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 RFC +821(2) (Simple Mail Transfer Protocol) and RFC 1869(3) (SMTP Service +Extensions). + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + + -- Class: smtplib.SMTP (host='', port=0, local_hostname=None[, + timeout], source_address=None) + + An *note SMTP: 575. 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 *note connect(): 13ed. 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 *note + socket.getfqdn(): 2c86. If the *note connect(): 13ed. call returns + anything other than a success code, an *note SMTPConnectError: + 3344. 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, *note TimeoutError: 429. 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 (host, port), for the socket to bind to as its source + address before connecting. If omitted (or if host or port are ‘''’ + and/or 0 respectively) the OS default behavior will be used. + + For normal use, you should only require the initialization/connect, + *note sendmail(): ae0, and *note SMTP.quit(): 3345. methods. An + example is included below. + + The *note SMTP: 575. class supports the *note with: 19e. statement. + When used like this, the SMTP ‘QUIT’ command is issued + automatically when the ‘with’ statement exits. E.g.: + + >>> from smtplib import SMTP + >>> with SMTP("domain.org") as smtp: + ... smtp.noop() + ... + (250, b'Ok') + >>> + + All commands will raise an *note auditing event: 12c0. + ‘smtplib.SMTP.send’ with arguments ‘self’ and ‘data’, where ‘data’ + is the bytes about to be sent to the remote host. + + Changed in version 3.3: Support for the *note with: 19e. statement + was added. + + Changed in version 3.3: source_address argument was added. + + New in version 3.5: The SMTPUTF8 extension ( RFC 6531(4)) is now + supported. + + Changed in version 3.9: If the `timeout' parameter is set to be + zero, it will raise a *note ValueError: 1c8. to prevent the + creation of a non-blocking socket + + -- Class: smtplib.SMTP_SSL (host='', port=0, local_hostname=None, + keyfile=None, certfile=None[, timeout], context=None, + source_address=None) + + An *note SMTP_SSL: 576. instance behaves exactly the same as + instances of *note SMTP: 575. *note SMTP_SSL: 576. should be used + for situations where SSL is required from the beginning of the + connection and using ‘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 *note SMTP: 575. class. `context', also + optional, can contain a *note SSLContext: 430. and allows + configuring various aspects of the secure connection. Please read + *note Security considerations: 2b9e. for best practices. + + `keyfile' and `certfile' are a legacy alternative to `context', and + can point to a PEM formatted private key and certificate chain file + for the SSL connection. + + Changed in version 3.3: `context' was added. + + Changed in version 3.3: source_address argument was added. + + Changed in version 3.4: The class now supports hostname check with + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + Deprecated since version 3.6: `keyfile' and `certfile' are + deprecated in favor of `context'. Please use *note + ssl.SSLContext.load_cert_chain(): df1. instead, or let *note + ssl.create_default_context(): c46. select the system’s trusted CA + certificates for you. + + Changed in version 3.9: If the `timeout' parameter is set to be + zero, it will raise a *note ValueError: 1c8. to prevent the + creation of a non-blocking socket + + -- Class: smtplib.LMTP (host='', 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 ‘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 *note + SMTP: 575. 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. + +A nice selection of exceptions is defined as well: + + -- Exception: smtplib.SMTPException + + Subclass of *note OSError: 413. that is the base exception class + for all the other exceptions provided by this module. + + Changed in version 3.4: SMTPException became subclass of *note + OSError: 413. + + -- Exception: smtplib.SMTPServerDisconnected + + This exception is raised when the server unexpectedly disconnects, + or when an attempt is made to use the *note SMTP: 575. instance + before connecting it to a server. + + -- 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. The error code is stored in the + ‘smtp_code’ attribute of the error, and the ‘smtp_error’ attribute + is set to the error message. + + -- Exception: smtplib.SMTPSenderRefused + + Sender address refused. In addition to the attributes set by on + all *note SMTPResponseException: 3347. exceptions, this sets + ‘sender’ to the string that the SMTP server refused. + + -- Exception: smtplib.SMTPRecipientsRefused + + All recipient addresses refused. The errors for each recipient are + accessible through the attribute ‘recipients’, which is a + dictionary of exactly the same sort as *note SMTP.sendmail(): ae0. + returns. + + -- Exception: smtplib.SMTPDataError + + The SMTP server refused to accept the message data. + + -- Exception: smtplib.SMTPConnectError + + Error occurred during establishment of a connection with the + server. + + -- Exception: smtplib.SMTPHeloError + + The server refused our ‘HELO’ message. + + -- Exception: smtplib.SMTPNotSupportedError + + The command or option attempted is not supported by the server. + + New in version 3.5. + + -- Exception: smtplib.SMTPAuthenticationError + + SMTP authentication went wrong. Most probably the server didn’t + accept the username/password combination provided. + +See also +........ + +RFC 821(5) - Simple Mail Transfer Protocol + + Protocol definition for SMTP. This document covers the model, + operating procedure, and protocol details for SMTP. + +RFC 1869(6) - 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. + +* Menu: + +* SMTP Objects:: +* SMTP Example:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/smtplib.py + + (2) https://datatracker.ietf.org/doc/html/rfc821.html + + (3) https://datatracker.ietf.org/doc/html/rfc1869.html + + (4) https://datatracker.ietf.org/doc/html/rfc6531.html + + (5) https://datatracker.ietf.org/doc/html/rfc821.html + + (6) https://datatracker.ietf.org/doc/html/rfc1869.html + + +File: python.info, Node: SMTP Objects, Next: SMTP Example, Up: smtplib — SMTP protocol client + +5.21.14.1 SMTP Objects +...................... + +An *note SMTP: 575. instance has the following methods: + + -- Method: SMTP.set_debuglevel (level) + + Set the debug output level. A value of 1 or ‘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. + + -- Method: SMTP.docmd (cmd, args='') + + 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, *note SMTPServerDisconnected: 3346. will be raised. + + -- 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 (‘':'’) 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 *note auditing event: 12c0. ‘smtplib.connect’ with + arguments ‘self’, ‘host’, ‘port’. + + -- Method: SMTP.helo (name='') + + Identify yourself to the SMTP server using ‘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 + ‘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 *note sendmail(): + ae0. when necessary. + + -- Method: SMTP.ehlo (name='') + + Identify yourself to an ESMTP server using ‘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 *note has_extn(): 3352. Also sets several informational + attributes: the message returned by the server is stored as the + ‘ehlo_resp’ attribute, ‘does_esmtp’ is set to ‘True’ or ‘False’ + depending on whether the server supports ESMTP, and + ‘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 *note has_extn(): 3352. before sending mail, + it should not be necessary to call this method explicitly. It will + be implicitly called by *note sendmail(): ae0. when necessary. + + -- Method: SMTP.ehlo_or_helo_if_needed () + + This method calls *note ehlo(): 3351. and/or *note helo(): 3350. if + there has been no previous ‘EHLO’ or ‘HELO’ command this session. + It tries ESMTP ‘EHLO’ first. + + *note SMTPHeloError: 334b. + + The server didn’t reply properly to the ‘HELO’ greeting. + + -- Method: SMTP.has_extn (name) + + Return *note True: 877. if `name' is in the set of SMTP service + extensions returned by the server, *note False: 78d. otherwise. + Case is ignored. + + -- Method: SMTP.verify (address) + + Check the validity of an address on this server using SMTP ‘VRFY’. + Returns a tuple consisting of code 250 and a full RFC 822(1) + address (including human name) if the user address is valid. + Otherwise returns an SMTP error code of 400 or greater and an error + string. + + Note: Many sites disable SMTP ‘VRFY’ in order to foil + spammers. + + -- 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 ‘EHLO’ or ‘HELO’ command this + session, this method tries ESMTP ‘EHLO’ first. This method will + return normally if the authentication was successful, or may raise + the following exceptions: + + *note SMTPHeloError: 334b. + + The server didn’t reply properly to the ‘HELO’ greeting. + + *note SMTPAuthenticationError: 334c. + + The server didn’t accept the username/password combination. + + *note SMTPNotSupportedError: 13eb. + + The ‘AUTH’ command is not supported by the server. + + *note SMTPException: c3f. + + No suitable authentication method was found. + + Each of the authentication methods supported by *note smtplib: ea. + are tried in turn if they are advertised as supported by the + server. See *note auth(): ade. for a list of supported + authentication methods. `initial_response_ok' is passed through to + *note auth(): ade. + + Optional keyword argument `initial_response_ok' specifies whether, + for authentication methods that support it, an “initial response” + as specified in RFC 4954(2) can be sent along with the ‘AUTH’ + command, rather than requiring a challenge/response. + + Changed in version 3.5: *note SMTPNotSupportedError: 13eb. may be + raised, and the `initial_response_ok' parameter was added. + + -- Method: SMTP.auth (mechanism, authobject, *, + initial_response_ok=True) + + Issue an ‘SMTP’ ‘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 ‘AUTH’ command; the valid values are those + listed in the ‘auth’ element of ‘esmtp_features’. + + `authobject' must be a callable object taking an optional single + argument: + + data = authobject(challenge=None) + + If optional keyword argument `initial_response_ok' is true, + ‘authobject()’ will be called first with no argument. It can + return the RFC 4954(3) “initial response” ASCII ‘str’ which will be + encoded and sent with the ‘AUTH’ command as below. If the + ‘authobject()’ does not support an initial response (e.g. because + it requires a challenge), it should return ‘None’ when called with + ‘challenge=None’. If `initial_response_ok' is false, then + ‘authobject()’ will not be called first with ‘None’. + + If the initial response check returns ‘None’, or if + `initial_response_ok' is false, ‘authobject()’ will be called to + process the server’s challenge response; the `challenge' argument + it is passed will be a ‘bytes’. It should return ASCII ‘str’ + `data' that will be base64 encoded and sent to the server. + + The ‘SMTP’ class provides ‘authobjects’ for the ‘CRAM-MD5’, + ‘PLAIN’, and ‘LOGIN’ mechanisms; they are named + ‘SMTP.auth_cram_md5’, ‘SMTP.auth_plain’, and ‘SMTP.auth_login’ + respectively. They all require that the ‘user’ and ‘password’ + properties of the ‘SMTP’ instance are set to appropriate values. + + User code does not normally need to call ‘auth’ directly, but can + instead call the *note login(): 3355. method, which will try each + of the above mechanisms in turn, in the order listed. ‘auth’ is + exposed to facilitate the implementation of authentication methods + not (or not yet) supported directly by *note smtplib: ea. + + New in version 3.5. + + -- Method: SMTP.starttls (keyfile=None, certfile=None, context=None) + + Put the SMTP connection in TLS (Transport Layer Security) mode. + All SMTP commands that follow will be encrypted. You should then + call *note ehlo(): 3351. again. + + If `keyfile' and `certfile' are provided, they are used to create + an *note ssl.SSLContext: 430. + + Optional `context' parameter is an *note ssl.SSLContext: 430. + object; This is an alternative to using a keyfile and a certfile + and if specified both `keyfile' and `certfile' should be ‘None’. + + If there has been no previous ‘EHLO’ or ‘HELO’ command this + session, this method tries ESMTP ‘EHLO’ first. + + Deprecated since version 3.6: `keyfile' and `certfile' are + deprecated in favor of `context'. Please use *note + ssl.SSLContext.load_cert_chain(): df1. instead, or let *note + ssl.create_default_context(): c46. select the system’s trusted CA + certificates for you. + + *note SMTPHeloError: 334b. + + The server didn’t reply properly to the ‘HELO’ greeting. + + *note SMTPNotSupportedError: 13eb. + + The server does not support the STARTTLS extension. + + *note RuntimeError: 6e9. + + SSL/TLS support is not available to your Python interpreter. + + Changed in version 3.3: `context' was added. + + Changed in version 3.4: The method now supports hostname check with + ‘SSLContext.check_hostname’ and `Server Name Indicator' (see *note + HAS_SNI: 2cc4.). + + Changed in version 3.5: The error raised for lack of STARTTLS + support is now the *note SMTPNotSupportedError: 13eb. subclass + instead of the base *note SMTPException: c3f. + + -- Method: SMTP.sendmail (from_addr, to_addrs, msg, mail_options=(), + rcpt_options=()) + + Send mail. The required arguments are an RFC 822(4) from-address + string, a list of RFC 822(5) 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 ‘8bitmime’) to be + used in ‘MAIL FROM’ commands as `mail_options'. ESMTP options + (such as ‘DSN’ commands) that should be used with all ‘RCPT’ + commands can be passed as `rcpt_options'. (If you need to use + different ESMTP options to different recipients you have to use the + low-level methods such as ‘mail()’, ‘rcpt()’ and ‘data()’ to send + the message.) + + Note: The `from_addr' and `to_addrs' parameters are used to + construct the message envelope used by the transport agents. + ‘sendmail’ does not modify the message headers in any way. + + `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 ‘\r’ and ‘\n’ characters are converted to ‘\r\n’ + characters. A byte string is not modified. + + If there has been no previous ‘EHLO’ or ‘HELO’ command this + session, this method tries ESMTP ‘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 ‘EHLO’ fails, ‘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 ‘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: + + *note SMTPRecipientsRefused: 3349. + + All recipients were refused. Nobody got the mail. The + ‘recipients’ attribute of the exception object is a dictionary + with information about the refused recipients (like the one + returned when at least one recipient was accepted). + + *note SMTPHeloError: 334b. + + The server didn’t reply properly to the ‘HELO’ greeting. + + *note SMTPSenderRefused: 3348. + + The server didn’t accept the `from_addr'. + + *note SMTPDataError: 334a. + + The server replied with an unexpected error code (other than a + refusal of a recipient). + + *note SMTPNotSupportedError: 13eb. + + ‘SMTPUTF8’ was given in the `mail_options' but is not + supported by the server. + + 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: ‘SMTPUTF8’ support added, and *note + SMTPNotSupportedError: 13eb. may be raised if ‘SMTPUTF8’ is + specified but the server does not support it. + + -- Method: SMTP.send_message (msg, from_addr=None, to_addrs=None, + mail_options=(), rcpt_options=()) + + This is a convenience method for calling *note sendmail(): ae0. + with the message represented by an *note email.message.Message: + 90b. object. The arguments have the same meaning as for *note + sendmail(): ae0, except that `msg' is a ‘Message’ object. + + If `from_addr' is ‘None’ or `to_addrs' is ‘None’, ‘send_message’ + fills those arguments with addresses extracted from the headers of + `msg' as specified in RFC 5322(6): `from_addr' is set to the + ‘Sender’ field if it is present, and otherwise to the ‘From’ field. + `to_addrs' combines the values (if any) of the ‘To’, ‘Cc’, and + ‘Bcc’ fields from `msg'. If exactly one set of ‘Resent-*’ headers + appear in the message, the regular headers are ignored and the + ‘Resent-*’ headers are used instead. If the message contains more + than one set of ‘Resent-*’ headers, a *note ValueError: 1c8. is + raised, since there is no way to unambiguously detect the most + recent set of ‘Resent-’ headers. + + ‘send_message’ serializes `msg' using *note BytesGenerator: e81. + with ‘\r\n’ as the `linesep', and calls *note sendmail(): ae0. to + transmit the resulting message. Regardless of the values of + `from_addr' and `to_addrs', ‘send_message’ does not transmit any + ‘Bcc’ or ‘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 ‘SMTPUTF8’ support, an + ‘SMTPNotSupported’ error is raised. Otherwise the ‘Message’ is + serialized with a clone of its *note policy: 70. with the *note + utf8: a79. attribute set to ‘True’, and ‘SMTPUTF8’ and + ‘BODY=8BITMIME’ are added to `mail_options'. + + New in version 3.2. + + New in version 3.5: Support for internationalized addresses + (‘SMTPUTF8’). + + -- Method: SMTP.quit () + + Terminate the SMTP session and close the connection. Return the + result of the SMTP ‘QUIT’ command. + +Low-level methods corresponding to the standard SMTP/ESMTP commands +‘HELP’, ‘RSET’, ‘NOOP’, ‘MAIL’, ‘RCPT’, and ‘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. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc822.html + + (2) https://datatracker.ietf.org/doc/html/rfc4954.html + + (3) https://datatracker.ietf.org/doc/html/rfc4954.html + + (4) https://datatracker.ietf.org/doc/html/rfc822.html + + (5) https://datatracker.ietf.org/doc/html/rfc822.html + + (6) https://datatracker.ietf.org/doc/html/rfc5322.html + + +File: python.info, Node: SMTP Example, Prev: SMTP Objects, Up: smtplib — SMTP protocol client + +5.21.14.2 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 +RFC 822(1) headers. In particular, the ‘To’ and ‘From’ addresses must +be included in the message headers explicitly. + + import smtplib + + def prompt(prompt): + return input(prompt).strip() + + fromaddr = prompt("From: ") + toaddrs = prompt("To: ").split() + print("Enter message, end with ^D (Unix) or ^Z (Windows):") + + # Add the From: and To: headers at the start! + msg = ("From: %s\r\nTo: %s\r\n\r\n" + % (fromaddr, ", ".join(toaddrs))) + while True: + try: + line = input() + except EOFError: + break + if not line: + break + msg = msg + line + + print("Message length is", len(msg)) + + server = smtplib.SMTP('localhost') + server.set_debuglevel(1) + server.sendmail(fromaddr, toaddrs, msg) + server.quit() + + Note: In general, you will want to use the *note email: 64. + package’s features to construct an email message, which you can + then send via *note send_message(): ae1.; see *note email; + Examples: bd6. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc822.html + + +File: python.info, Node: uuid — UUID objects according to RFC 4122, Next: socketserver — A framework for network servers, Prev: smtplib — SMTP protocol client, Up: Internet Protocols and Support + +5.21.15 ‘uuid’ — UUID objects according to +------------------------------------------ + +`RFC 4122' + +`Source code:' Lib/uuid.py(1) + +__________________________________________________________________ + +This module provides immutable *note UUID: 6b2. objects (the *note UUID: +6b2. class) and the functions *note uuid1(): 80b, *note uuid3(): 335a, +*note uuid4(): 335b, *note uuid5(): 335c. for generating version 1, 3, +4, and 5 UUIDs as specified in RFC 4122(2). + +If all you want is a unique ID, you should probably call *note uuid1(): +80b. or *note uuid4(): 335b. Note that *note uuid1(): 80b. may +compromise privacy since it creates a UUID containing the computer’s +network address. *note uuid4(): 335b. creates a random UUID. + +Depending on support from the underlying platform, *note uuid1(): 80b. +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 *note UUID: 6b2. have an +‘is_safe’ attribute which relays any information about the UUID’s +safety, using this enumeration: + + -- Class: uuid.SafeUUID + + New in version 3.7. + + -- Attribute: safe + + The UUID was generated by the platform in a + multiprocessing-safe way. + + -- Attribute: unsafe + + The UUID was not generated in a multiprocessing-safe way. + + -- Attribute: unknown + + The platform does not provide information on whether the UUID + was generated safely or not. + + -- 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: + + 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) + + 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 RFC 4122(3), overriding bits in the given `hex', + `bytes', `bytes_le', `fields', or `int'. + + Comparison of UUID objects are made by way of comparing their *note + UUID.int: 3361. attributes. Comparison with a non-UUID object + raises a *note TypeError: 19c. + + ‘str(uuid)’ returns a string in the form + ‘12345678-1234-5678-1234-567812345678’ where the 32 hexadecimal + digits represent the UUID. + +*note UUID: 6b2. instances have these read-only attributes: + + -- Attribute: UUID.bytes + + The UUID as a 16-byte string (containing the six integer fields in + big-endian byte order). + + -- 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). + + -- 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: + + Field Meaning + + ----------------------------------------------------------------------- + + ‘time_low’ the first 32 bits of the UUID + + + ‘time_mid’ the next 16 bits of the UUID + + + ‘time_hi_version’ the next 16 bits of the UUID + + + ‘clock_seq_hi_variant’ the next 8 bits of the UUID + + + ‘clock_seq_low’ the next 8 bits of the UUID + + + ‘node’ the last 48 bits of the UUID + + + *note time: 10c. the 60-bit timestamp + + + ‘clock_seq’ the 14-bit sequence number + + + -- Attribute: UUID.hex + + The UUID as a 32-character lowercase hexadecimal string. + + -- Attribute: UUID.int + + The UUID as a 128-bit integer. + + -- Attribute: UUID.urn + + The UUID as a URN as specified in RFC 4122(4). + + -- Attribute: UUID.variant + + The UUID variant, which determines the internal layout of the UUID. + This will be one of the constants *note RESERVED_NCS: 3368, *note + RFC_4122: 3369, *note RESERVED_MICROSOFT: 336a, or *note + RESERVED_FUTURE: 336b. + + -- Attribute: UUID.version + + The UUID version number (1 through 5, meaningful only when the + variant is *note RFC_4122: 3369.). + + -- Attribute: UUID.is_safe + + An enumeration of *note SafeUUID: 335d. which indicates whether the + platform generated the UUID in a multiprocessing-safe way. + + New in version 3.7. + +The *note uuid: 12e. module defines the following functions: + + -- 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 RFC + 4122(5). “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. + + -- Function: uuid.uuid1 (node=None, clock_seq=None) + + Generate a UUID from a host ID, sequence number, and the current + time. If `node' is not given, *note getnode(): 80a. is used to + obtain the hardware address. If `clock_seq' is given, it is used + as the sequence number; otherwise a random 14-bit sequence number + is chosen. + + -- 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 string). + + -- Function: uuid.uuid4 () + + Generate a random UUID. + + -- 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 string). + +The *note uuid: 12e. module defines the following namespace identifiers +for use with *note uuid3(): 335a. or *note uuid5(): 335c. + + -- Data: uuid.NAMESPACE_DNS + + When this namespace is specified, the `name' string is a fully + qualified domain name. + + -- Data: uuid.NAMESPACE_URL + + When this namespace is specified, the `name' string is a URL. + + -- Data: uuid.NAMESPACE_OID + + When this namespace is specified, the `name' string is an ISO OID. + + -- Data: uuid.NAMESPACE_X500 + + When this namespace is specified, the `name' string is an X.500 DN + in DER or a text output format. + +The *note uuid: 12e. module defines the following constants for the +possible values of the ‘variant’ attribute: + + -- Data: uuid.RESERVED_NCS + + Reserved for NCS compatibility. + + -- Data: uuid.RFC_4122 + + Specifies the UUID layout given in RFC 4122(6). + + -- Data: uuid.RESERVED_MICROSOFT + + Reserved for Microsoft compatibility. + + -- Data: uuid.RESERVED_FUTURE + + Reserved for future definition. + +See also +........ + +RFC 4122(7) - 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. + +* Menu: + +* Example: Example<12>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/uuid.py + + (2) https://datatracker.ietf.org/doc/html/rfc4122.html + + (3) https://datatracker.ietf.org/doc/html/rfc4122.html + + (4) https://datatracker.ietf.org/doc/html/rfc4122.html + + (5) https://datatracker.ietf.org/doc/html/rfc4122.html + + (6) https://datatracker.ietf.org/doc/html/rfc4122.html + + (7) https://datatracker.ietf.org/doc/html/rfc4122.html + + +File: python.info, Node: Example<12>, Up: uuid — UUID objects according to RFC 4122 + +5.21.15.1 Example +................. + +Here are some examples of typical usage of the *note uuid: 12e. module: + + >>> 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') + + +File: python.info, Node: socketserver — A framework for network servers, Next: http server — HTTP servers, Prev: uuid — UUID objects according to RFC 4122, Up: Internet Protocols and Support + +5.21.16 ‘socketserver’ — A framework for network servers +-------------------------------------------------------- + +`Source code:' Lib/socketserver.py(1) + +__________________________________________________________________ + +The *note socketserver: ed. module simplifies the task of writing +network servers. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +There are four basic concrete server classes: + + -- 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 *note server_bind(): 3376. and *note server_activate(): + 3377. The other parameters are passed to the *note BaseServer: + dea. base class. + + -- 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 *note TCPServer: 3375. + + -- Class: socketserver.UnixStreamServer (server_address, + RequestHandlerClass, bind_and_activate=True) + -- 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 *note + TCPServer: 3375. + +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 *note ForkingMixIn: 7d6. +and *note ThreadingMixIn: 7d7. 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 *note BaseRequestHandler: 337b. +class and overriding its *note handle(): 337c. 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 *note with: 19e. +statement. Then call the *note handle_request(): 337d. or *note +serve_forever(): dec. method of the server object to process one or many +requests. Finally, call *note server_close(): 337e. to close the socket +(unless you used a ‘with’ statement). + +When inheriting from *note ThreadingMixIn: 7d7. for threaded connection +behavior, you should explicitly declare how you want your threads to +behave on an abrupt shutdown. The *note ThreadingMixIn: 7d7. 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 *note False: 78d, meaning that Python will not exit until all threads +created by *note ThreadingMixIn: 7d7. have exited. + +Server classes have the same external methods and attributes, no matter +what network protocol they use. + +* Menu: + +* Server Creation Notes:: +* Server Objects: Server Objects<2>. +* Request Handler Objects:: +* Examples: Examples<27>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/socketserver.py + + +File: python.info, Node: Server Creation Notes, Next: Server Objects<2>, Up: socketserver — A framework for network servers + +5.21.16.1 Server Creation Notes +............................... + +There are five classes in an inheritance diagram, four of which +represent synchronous servers of four types: + + +------------+ + | BaseServer | + +------------+ + | + v + +-----------+ +------------------+ + | TCPServer |------->| UnixStreamServer | + +-----------+ +------------------+ + | + v + +-----------+ +--------------------+ + | UDPServer |------->| UnixDatagramServer | + +-----------+ +--------------------+ + +Note that *note UnixDatagramServer: 337a. derives from *note UDPServer: +3378, not from *note UnixStreamServer: 3379. — the only difference +between an IP and a Unix stream server is the address family, which is +simply repeated in both Unix server classes. + + -- Class: socketserver.ForkingMixIn + -- Class: socketserver.ThreadingMixIn + + Forking and threading versions of each type of server can be + created using these mix-in classes. For instance, *note + ThreadingUDPServer: 3380. is created as follows: + + class ThreadingUDPServer(ThreadingMixIn, UDPServer): + pass + + The mix-in class comes first, since it overrides a method defined + in *note UDPServer: 3378. Setting the various attributes also + changes the behavior of the underlying server mechanism. + + *note ForkingMixIn: 7d6. and the Forking classes mentioned below + are only available on POSIX platforms that support *note fork(): + cd4. + + ‘socketserver.ForkingMixIn.server_close()’ waits until all child + processes complete, except if + ‘socketserver.ForkingMixIn.block_on_close’ attribute is false. + + ‘socketserver.ThreadingMixIn.server_close()’ waits until all + non-daemon threads complete, except if + ‘socketserver.ThreadingMixIn.block_on_close’ attribute is false. + Use daemonic threads by setting ‘ThreadingMixIn.daemon_threads’ to + ‘True’ to not wait until threads complete. + + Changed in version 3.7: ‘socketserver.ForkingMixIn.server_close()’ + and ‘socketserver.ThreadingMixIn.server_close()’ now waits until + all child processes and non-daemonic threads complete. Add a new + ‘socketserver.ForkingMixIn.block_on_close’ class attribute to + opt-in for the pre-3.7 behaviour. + + -- Class: socketserver.ForkingTCPServer + -- Class: socketserver.ForkingUDPServer + -- Class: socketserver.ThreadingTCPServer + -- Class: socketserver.ThreadingUDPServer + + These classes are pre-defined using the mix-in classes. + +To implement a service, you must derive a class from *note +BaseRequestHandler: 337b. and redefine its *note handle(): 337c. 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 *note StreamRequestHandler: 948. +or *note DatagramRequestHandler: 3384. + +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 *note handle(): +337c. method. + +Another approach to handling multiple simultaneous requests in an +environment that supports neither threads nor *note fork(): cd4. (or +where these are too expensive or inappropriate for the service) is to +maintain an explicit table of partially finished requests and to use +*note selectors: e3. 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). See *note +asyncore: a. for another way to manage this. + + +File: python.info, Node: Server Objects<2>, Next: Request Handler Objects, Prev: Server Creation Notes, Up: socketserver — A framework for network servers + +5.21.16.2 Server Objects +........................ + + -- 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 *note server_address: 3386. and *note + RequestHandlerClass: 3387. attributes. + + -- Method: fileno () + + Return an integer file descriptor for the socket on which the + server is listening. This function is most commonly passed to + *note selectors: e3, to allow monitoring multiple servers in + the same process. + + -- Method: handle_request () + + Process a single request. This function calls the following + methods in order: *note get_request(): 3389, *note + verify_request(): 338a, and *note process_request(): 338b. If + the user-provided *note handle(): 337c. method of the handler + class raises an exception, the server’s *note handle_error(): + 9b7. method will be called. If no request is received within + *note timeout: 338c. seconds, *note handle_timeout(): 338d. + will be called and *note handle_request(): 337d. will return. + + -- Method: serve_forever (poll_interval=0.5) + + Handle requests until an explicit *note shutdown(): 146b. + request. Poll for shutdown every `poll_interval' seconds. + Ignores the *note timeout: 338c. attribute. It also calls + *note service_actions(): deb, which may be used by a subclass + or mixin to provide actions specific to a given service. For + example, the *note ForkingMixIn: 7d6. class uses *note + service_actions(): deb. to clean up zombie child processes. + + Changed in version 3.3: Added ‘service_actions’ call to the + ‘serve_forever’ method. + + -- Method: service_actions () + + This is called in the *note serve_forever(): dec. loop. This + method can be overridden by subclasses or mixin classes to + perform actions specific to a given service, such as cleanup + actions. + + New in version 3.3. + + -- Method: shutdown () + + Tell the *note serve_forever(): dec. loop to stop and wait + until it does. *note shutdown(): 146b. must be called while + *note serve_forever(): dec. is running in a different thread + otherwise it will deadlock. + + -- Method: server_close () + + Clean up the server. May be overridden. + + -- Attribute: address_family + + The family of protocols to which the server’s socket belongs. + Common examples are *note socket.AF_INET: 1205. and *note + socket.AF_UNIX: 1207. + + -- Attribute: RequestHandlerClass + + The user-provided request handler class; an instance of this + class is created for each request. + + -- 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 *note socket: ec. module for details. + For internet protocols, this is a tuple containing a string + giving the address, and an integer port number: ‘('127.0.0.1', + 80)’, for example. + + -- Attribute: socket + + The socket object on which the server will listen for incoming + requests. + + The server classes support the following class variables: + + -- Attribute: allow_reuse_address + + Whether the server will allow the reuse of an address. This + defaults to *note False: 78d, and can be set in subclasses to + change the policy. + + -- 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 *note + request_queue_size: 3391. 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. + + -- Attribute: socket_type + + The type of socket used by the server; *note + socket.SOCK_STREAM: f9a. and *note socket.SOCK_DGRAM: f99. are + two common values. + + -- Attribute: timeout + + Timeout duration, measured in seconds, or *note None: 243. if + no timeout is desired. If *note handle_request(): 337d. + receives no incoming requests within the timeout period, the + *note handle_timeout(): 338d. method is called. + + There are various server methods that can be overridden by + subclasses of base server classes like *note TCPServer: 3375.; + these methods aren’t useful to external users of the server object. + + -- Method: finish_request (request, client_address) + + Actually processes the request by instantiating *note + RequestHandlerClass: 3387. and calling its *note handle(): + 337c. method. + + -- 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. + + -- Method: handle_error (request, client_address) + + This function is called if the *note handle(): 337c. method of + a *note RequestHandlerClass: 3387. 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 *note Exception: 61c. class. + + -- Method: handle_timeout () + + This function is called when the *note timeout: 338c. + attribute has been set to a value other than *note None: 243. + 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. + + -- Method: process_request (request, client_address) + + Calls *note finish_request(): 3393. to create an instance of + the *note RequestHandlerClass: 3387. If desired, this + function can create a new process or thread to handle the + request; the *note ForkingMixIn: 7d6. and *note + ThreadingMixIn: 7d7. classes do this. + + -- Method: server_activate () + + Called by the server’s constructor to activate the server. + The default behavior for a TCP server just invokes *note + listen(): ae7. on the server’s socket. May be overridden. + + -- Method: server_bind () + + Called by the server’s constructor to bind the socket to the + desired address. May be overridden. + + -- Method: verify_request (request, client_address) + + Must return a Boolean value; if the value is *note True: 877, + the request will be processed, and if it’s *note False: 78d, + the request will be denied. This function can be overridden + to implement access controls for a server. The default + implementation always returns *note True: 877. + + Changed in version 3.6: Support for the *note context manager: 1a0. + protocol was added. Exiting the context manager is equivalent to + calling *note server_close(): 337e. + + +File: python.info, Node: Request Handler Objects, Next: Examples<27>, Prev: Server Objects<2>, Up: socketserver — A framework for network servers + +5.21.16.3 Request Handler Objects +................................. + + -- 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 *note handle(): 337c. method, and can override + any of the other methods. A new instance of the subclass is + created for each request. + + -- Method: setup () + + Called before the *note handle(): 337c. method to perform any + initialization actions required. The default implementation + does nothing. + + -- 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 ‘self.request’; the client address as + ‘self.client_address’; and the server instance as + ‘self.server’, in case it needs access to per-server + information. + + The type of ‘self.request’ is different for datagram or stream + services. For stream services, ‘self.request’ is a socket + object; for datagram services, ‘self.request’ is a pair of + string and socket. + + -- Method: finish () + + Called after the *note handle(): 337c. method to perform any + clean-up actions required. The default implementation does + nothing. If *note setup(): 3395. raises an exception, this + function will not be called. + + -- Class: socketserver.StreamRequestHandler + -- Class: socketserver.DatagramRequestHandler + + These *note BaseRequestHandler: 337b. subclasses override the *note + setup(): 3395. and *note finish(): 3396. methods, and provide + ‘self.rfile’ and ‘self.wfile’ attributes. The ‘self.rfile’ and + ‘self.wfile’ attributes can be read or written, respectively, to + get the request data or return data to the client. + + The ‘rfile’ attributes of both classes support the *note + io.BufferedIOBase: 949. readable interface, and + ‘DatagramRequestHandler.wfile’ supports the *note + io.BufferedIOBase: 949. writable interface. + + Changed in version 3.6: ‘StreamRequestHandler.wfile’ also supports + the *note io.BufferedIOBase: 949. writable interface. + + +File: python.info, Node: Examples<27>, Prev: Request Handler Objects, Up: socketserver — A framework for network servers + +5.21.16.4 Examples +.................. + +* Menu: + +* socketserver.TCPServer Example: socketserver TCPServer Example. +* socketserver.UDPServer Example: socketserver UDPServer Example. +* Asynchronous Mixins:: + + +File: python.info, Node: socketserver TCPServer Example, Next: socketserver UDPServer Example, Up: Examples<27> + +5.21.16.5 ‘socketserver.TCPServer’ Example +.......................................... + +This is the server side: + + 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 + self.data = self.request.recv(1024).strip() + print("{} wrote:".format(self.client_address[0])) + print(self.data) + # just send back the same data, but upper-cased + self.request.sendall(self.data.upper()) + + 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() + +An alternative request handler class that makes use of streams +(file-like objects that simplify communication by providing the standard +file interface): + + 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 + self.data = self.rfile.readline().strip() + print("{} wrote:".format(self.client_address[0])) + print(self.data) + # Likewise, self.wfile is a file-like object used to write back + # to the client + self.wfile.write(self.data.upper()) + +The difference is that the ‘readline()’ call in the second handler will +call ‘recv()’ multiple times until it encounters a newline character, +while the single ‘recv()’ call in the first handler will just return +what has been sent from the client in one ‘sendall()’ call. + +This is the client side: + + 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 + "\n", "utf-8")) + + # Receive data from the server and shut down + received = str(sock.recv(1024), "utf-8") + + print("Sent: {}".format(data)) + print("Received: {}".format(received)) + +The output of the example should look something like this: + +Server: + + $ python TCPServer.py + 127.0.0.1 wrote: + b'hello world with TCP' + 127.0.0.1 wrote: + b'python is nice' + +Client: + + $ 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 + + +File: python.info, Node: socketserver UDPServer Example, Next: Asynchronous Mixins, Prev: socketserver TCPServer Example, Up: Examples<27> + +5.21.16.6 ‘socketserver.UDPServer’ Example +.......................................... + +This is the server side: + + 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("{} wrote:".format(self.client_address[0])) + 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() + +This is the client side: + + 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: {}".format(data)) + print("Received: {}".format(received)) + +The output of the example should look exactly like for the TCP server +example. + + +File: python.info, Node: Asynchronous Mixins, Prev: socketserver UDPServer Example, Up: Examples<27> + +5.21.16.7 Asynchronous Mixins +............................. + +To build asynchronous handlers, use the *note ThreadingMixIn: 7d7. and +*note ForkingMixIn: 7d6. classes. + +An example for the *note ThreadingMixIn: 7d7. class: + + 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() + +The output of the example should look something like this: + + $ 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 + +The *note ForkingMixIn: 7d6. 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 *note fork(): cd4. + + +File: python.info, Node: http server — HTTP servers, Next: http cookies — HTTP state management, Prev: socketserver — A framework for network servers, Up: Internet Protocols and Support + +5.21.17 ‘http.server’ — HTTP servers +------------------------------------ + +`Source code:' Lib/http/server.py(1) + +__________________________________________________________________ + +This module defines classes for implementing HTTP servers. + + Warning: *note http.server: 92. is not recommended for production. + It only implements *note basic security checks: 339d. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +One class, *note HTTPServer: 31b8, is a *note socketserver.TCPServer: +3375. 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: + + def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler): + server_address = ('', 8000) + httpd = server_class(server_address, handler_class) + httpd.serve_forever() + + -- Class: http.server.HTTPServer (server_address, RequestHandlerClass) + + This class builds on the *note TCPServer: 3375. class by storing + the server address as instance variables named ‘server_name’ and + ‘server_port’. The server is accessible by the handler, typically + through the handler’s ‘server’ instance variable. + + -- Class: http.server.ThreadingHTTPServer (server_address, + RequestHandlerClass) + + This class is identical to HTTPServer but uses threads to handle + requests by using the *note ThreadingMixIn: 7d7. This is useful to + handle web browsers pre-opening sockets, on which *note HTTPServer: + 31b8. would wait indefinitely. + + New in version 3.7. + +The *note HTTPServer: 31b8. and *note ThreadingHTTPServer: 79a. must be +given a `RequestHandlerClass' on instantiation, of which this module +provides three different variants: + + -- 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 (e.g. GET or + POST). *note BaseHTTPRequestHandler: d76. 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 + ‘SPAM’, the ‘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 + ‘__init__()’ method. + + *note BaseHTTPRequestHandler: d76. has the following instance + variables: + + -- Attribute: client_address + + Contains a tuple of the form ‘(host, port)’ referring to the + client’s address. + + -- Attribute: server + + Contains the server instance. + + -- Attribute: close_connection + + Boolean that should be set before *note handle_one_request(): + 33a1. returns, indicating if another request may be expected, + or if the connection should be shut down. + + -- Attribute: requestline + + Contains the string representation of the HTTP request line. + The terminating CRLF is stripped. This attribute should be + set by *note handle_one_request(): 33a1. If no valid request + line was processed, it should be set to the empty string. + + -- Attribute: command + + Contains the command (request type). For example, ‘'GET'’. + + -- Attribute: path + + Contains the request path. If query component of the URL is + present, then ‘path’ includes the query. Using the + terminology of RFC 3986(2), ‘path’ here includes ‘hier-part’ + and the ‘query’. + + -- Attribute: request_version + + Contains the version string from the request. For example, + ‘'HTTP/1.0'’. + + -- Attribute: headers + + Holds an instance of the class specified by the *note + MessageClass: 33a6. class variable. This instance parses and + manages the headers in the HTTP request. The *note + parse_headers(): 1487. function from *note http.client: 8f. is + used to parse the headers and it requires that the HTTP + request provide a valid RFC 2822(3) style header. + + -- Attribute: rfile + + An *note io.BufferedIOBase: 949. input stream, ready to read + from the start of the optional input data. + + -- 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 *note io.BufferedIOBase: + 949. stream. + + *note BaseHTTPRequestHandler: d76. has the following attributes: + + -- 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, ‘'BaseHTTP/0.2'’. + + -- Attribute: sys_version + + Contains the Python system version, in a form usable by the + *note version_string: 33ab. method and the *note + server_version: 33a9. class variable. For example, + ‘'Python/1.4'’. + + -- Attribute: error_message_format + + Specifies a format string that should be used by *note + send_error(): bea. method for building an error response to + the client. The string is filled by default with variables + from *note responses: 328d. based on the status code that + passed to *note send_error(): bea. + + -- Attribute: error_content_type + + Specifies the Content-Type HTTP header of error responses sent + to the client. The default value is ‘'text/html'’. + + -- 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 + ‘'HTTP/1.1'’, the server will permit HTTP persistent + connections; however, your server `must' then include an + accurate ‘Content-Length’ header (using *note send_header(): + 33af.) in all of its responses to clients. For backwards + compatibility, the setting defaults to ‘'HTTP/1.0'’. + + -- Attribute: MessageClass + + Specifies an *note email.message.Message: 90b.-like class to + parse HTTP headers. Typically, this is not overridden, and it + defaults to ‘http.client.HTTPMessage’. + + -- Attribute: responses + + This attribute contains a mapping of error code integers to + two-element tuples containing a short and long message. For + example, ‘{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 *note send_response_only(): 33b0. and *note + send_error(): bea. methods. + + A *note BaseHTTPRequestHandler: d76. instance has the following + methods: + + -- Method: handle () + + Calls *note handle_one_request(): 33a1. once (or, if + persistent connections are enabled, multiple times) to handle + incoming HTTP requests. You should never need to override it; + instead, implement appropriate ‘do_*()’ methods. + + -- Method: handle_one_request () + + This method will parse and dispatch the request to the + appropriate ‘do_*()’ method. You should never need to + override it. + + -- Method: handle_expect_100 () + + When an HTTP/1.1 conformant server receives an ‘Expect: + 100-continue’ request header it responds back with a ‘100 + Continue’ followed by ‘200 OK’ headers. This method can be + overridden to raise an error if the server does not want the + client to continue. For e.g. server can choose to send ‘417 + Expectation Failed’ as a response header and ‘return False’. + + New in version 3.2. + + -- 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 *note error_message_format: 33ac. attribute and + emitted, after a complete set of headers, as the response + body. The *note responses: 328d. 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 ‘???’. The body will be empty if the + method is HEAD or the response code is one of the following: + ‘1xx’, ‘204 No Content’, ‘205 Reset Content’, ‘304 Not + Modified’. + + Changed in version 3.4: The error response includes a + Content-Length header. Added the `explain' argument. + + -- 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 *note + version_string(): 33ab. and *note date_time_string(): 33b4. + methods, respectively. If the server does not intend to send + any other headers using the *note send_header(): 33af. method, + then *note send_response(): 33b3. should be followed by an + *note end_headers(): d77. call. + + Changed in version 3.3: Headers are stored to an internal + buffer and *note end_headers(): d77. needs to be called + explicitly. + + -- Method: send_header (keyword, value) + + Adds the HTTP header to an internal buffer which will be + written to the output stream when either *note end_headers(): + d77. or *note flush_headers(): d78. is invoked. `keyword' + should specify the header keyword, with `value' specifying its + value. Note that, after the send_header calls are done, *note + end_headers(): d77. MUST BE called in order to complete the + operation. + + Changed in version 3.2: Headers are stored in an internal + buffer. + + -- Method: send_response_only (code, message=None) + + Sends the response header only, used for the purposes when + ‘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. + + New in version 3.2. + + -- Method: end_headers () + + Adds a blank line (indicating the end of the HTTP headers in + the response) to the headers buffer and calls *note + flush_headers(): d78. + + Changed in version 3.2: The buffered headers are written to + the output stream. + + -- Method: flush_headers () + + Finally send the headers to the output stream and flush the + internal headers buffer. + + New in version 3.3. + + -- 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. + + -- Method: log_error (...) + + Logs an error when a request cannot be fulfilled. By default, + it passes the message to *note log_message(): 33b7, so it + takes the same arguments (`format' and additional values). + + -- Method: log_message (format, ...) + + Logs an arbitrary message to ‘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 *note log_message(): 33b7. + are applied as inputs to the formatting. The client ip + address and current date and time are prefixed to every + message logged. + + -- Method: version_string () + + Returns the server software’s version string. This is a + combination of the *note server_version: 33a9. and *note + sys_version: 33aa. attributes. + + -- Method: date_time_string (timestamp=None) + + Returns the date and time given by `timestamp' (which must be + ‘None’ or in the format returned by *note time.time(): 736.), + formatted for a message header. If `timestamp' is omitted, it + uses the current date and time. + + The result looks like ‘'Sun, 06 Nov 1994 08:49:37 GMT'’. + + -- Method: log_date_time_string () + + Returns the current date and time, formatted for logging. + + -- 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. + + -- 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. + + New in version 3.7: The `directory' parameter. + + Changed in version 3.9: The `directory' parameter accepts a *note + path-like object: 773. + + A lot of the work, such as parsing the request, is done by the base + class *note BaseHTTPRequestHandler: d76. This class implements the + *note do_GET(): 33ba. and *note do_HEAD(): 33bb. functions. + + The following are defined as class-level attributes of *note + SimpleHTTPRequestHandler: 799.: + + -- Attribute: server_version + + This will be ‘"SimpleHTTP/" + __version__’, where + ‘__version__’ is defined at the module level. + + -- 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. + + The *note SimpleHTTPRequestHandler: 799. class defines the + following methods: + + -- Method: do_HEAD () + + This method serves the ‘'HEAD'’ request type: it sends the + headers it would send for the equivalent ‘GET’ request. See + the *note do_GET(): 33ba. method for a more complete + explanation of the possible headers. + + -- 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 ‘index.html’ or ‘index.htm’ (in that + order). If found, the file’s contents are returned; otherwise + a directory listing is generated by calling the + ‘list_directory()’ method. This method uses *note + os.listdir(): da5. to scan the directory, and returns a ‘404’ + error response if the *note listdir(): da5. fails. + + If the request was mapped to a file, it is opened. Any *note + OSError: 413. exception in opening the requested file is + mapped to a ‘404’, ‘'File not found'’ error. If there was a + ‘'If-Modified-Since'’ header in the request, and the file was + not modified after this time, a ‘304’, ‘'Not Modified'’ + response is sent. Otherwise, the content type is guessed by + calling the ‘guess_type()’ method, which in turn uses the + `extensions_map' variable, and the file contents are returned. + + A ‘'Content-type:'’ header with the guessed content type is + output, followed by a ‘'Content-Length:'’ header with the + file’s size and a ‘'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. If the file’s + MIME type starts with ‘text/’ the file is opened in text mode; + otherwise binary mode is used. + + For example usage, see the implementation of the ‘test’ + function in Lib/http/server.py(4). + + Changed in version 3.7: Support of the ‘'If-Modified-Since'’ + header. + +The *note SimpleHTTPRequestHandler: 799. class can be used in the +following manner in order to create a very basic webserver serving files +relative to the current directory: + + 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() +*note http.server: 92. can also be invoked directly using the *note -m: +1ae. switch of the interpreter. Similar to the previous example, this +serves files relative to the current directory: + + python -m http.server + +The server listens to port 8000 by default. The default can be +overridden by passing the desired port number as an argument: + + python -m http.server 9000 + +By default, the server binds itself to all interfaces. The option +‘-b/--bind’ specifies a specific address to which it should bind. Both +IPv4 and IPv6 addresses are supported. For example, the following +command causes the server to bind to localhost only: + + python -m http.server --bind 127.0.0.1 + +New in version 3.4: ‘--bind’ argument was introduced. + +New in version 3.8: ‘--bind’ argument enhanced to support IPv6 + +By default, the server uses the current directory. The option +‘-d/--directory’ specifies a directory to which it should serve the +files. For example, the following command uses a specific directory: + + python -m http.server --directory /tmp/ + +New in version 3.7: ‘--directory’ argument was introduced. + +By default, the server is conformant to HTTP/1.0. The option +‘-p/--protocol’ specifies the HTTP version to which the server is +conformant. For example, the following command runs an HTTP/1.1 +conformant server: + + python -m http.server --protocol HTTP/1.1 + +New in version 3.11: ‘--protocol’ argument was introduced. + + -- 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 + *note SimpleHTTPRequestHandler: 799. + + Note: CGI scripts run by the *note CGIHTTPRequestHandler: + 33be. 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. + + 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 ‘do_GET()’ and ‘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 ‘cgi_directories’ path. + + The *note CGIHTTPRequestHandler: 33be. defines the following data + member: + + -- Attribute: cgi_directories + + This defaults to ‘['/cgi-bin', '/htbin']’ and describes + directories to treat as containing CGI scripts. + + The *note CGIHTTPRequestHandler: 33be. defines the following + method: + + -- Method: do_POST () + + This method serves the ‘'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. + + 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. + +*note CGIHTTPRequestHandler: 33be. can be enabled in the command line by +passing the ‘--cgi’ option: + + python -m http.server --cgi + +* Menu: + +* Security Considerations: Security Considerations<3>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/http/server.py + + (2) https://datatracker.ietf.org/doc/html/rfc3986.html + + (3) https://datatracker.ietf.org/doc/html/rfc2822.html + + (4) https://github.com/python/cpython/tree/3.11/Lib/http/server.py + + +File: python.info, Node: Security Considerations<3>, Up: http server — HTTP servers + +5.21.17.1 Security Considerations +................................. + +*note SimpleHTTPRequestHandler: 799. will follow symbolic links when +handling requests, this makes it possible for files outside of the +specified directory to be served. + + +File: python.info, Node: http cookies — HTTP state management, Next: http cookiejar — Cookie handling for HTTP clients, Prev: http server — HTTP servers, Up: Internet Protocols and Support + +5.21.18 ‘http.cookies’ — HTTP state management +---------------------------------------------- + +`Source code:' Lib/http/cookies.py(1) + +__________________________________________________________________ + +The *note http.cookies: 91. 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 +RFC 2109(2) and RFC 2068(3) specifications. It has since been +discovered that MSIE 3.0x doesn’t follow the character rules outlined in +those specs and also many current day browsers and servers have relaxed +parsing rules when comes to Cookie handling. As a result, the parsing +rules used are a bit less strict. + +The character set, *note string.ascii_letters: f71, *note string.digits: +1d1d. and ‘!#$%&'*+-.^_`|~:’ denote the set of valid characters allowed +by this module in Cookie name (as *note key: 86b.). + +Changed in version 3.3: Allowed ‘:’ as a valid Cookie name character. + + Note: On encountering an invalid cookie, *note CookieError: 33c4. + is raised, so if your cookie data comes from a browser you should + always prepare for invalid data and catch *note CookieError: 33c4. + on parsing. + + -- Exception: http.cookies.CookieError + + Exception failing because of RFC 2109(4) invalidity: incorrect + attributes, incorrect ‘Set-Cookie’ header, etc. + + -- Class: http.cookies.BaseCookie ([input]) + + This class is a dictionary-like object whose keys are strings and + whose values are *note Morsel: 86e. instances. Note that upon + setting a key to a value, the value is first converted to a *note + Morsel: 86e. containing the key and the value. + + If `input' is given, it is passed to the *note load(): 33c6. + method. + + -- Class: http.cookies.SimpleCookie ([input]) + + This class derives from *note BaseCookie: 33c5. and overrides + ‘value_decode()’ and ‘value_encode()’. SimpleCookie supports + strings as cookie values. When setting the value, SimpleCookie + calls the builtin *note str(): 1b3. to convert the value to a + string. Values received from HTTP are kept as strings. + +See also +........ + +Module *note http.cookiejar: 90. + + HTTP cookie handling for web `clients'. The *note http.cookiejar: + 90. and *note http.cookies: 91. modules do not depend on each + other. + +RFC 2109(5) - HTTP State Management Mechanism + + This is the state management specification implemented by this + module. + +* Menu: + +* Cookie Objects:: +* Morsel Objects:: +* Example: Example<13>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/http/cookies.py + + (2) https://datatracker.ietf.org/doc/html/rfc2109.html + + (3) https://datatracker.ietf.org/doc/html/rfc2068.html + + (4) https://datatracker.ietf.org/doc/html/rfc2109.html + + (5) https://datatracker.ietf.org/doc/html/rfc2109.html + + +File: python.info, Node: Cookie Objects, Next: Morsel Objects, Up: http cookies — HTTP state management + +5.21.18.1 Cookie Objects +........................ + + -- Method: BaseCookie.value_decode (val) + + Return a tuple ‘(real_value, coded_value)’ from a string + representation. ‘real_value’ can be any type. This method does no + decoding in *note BaseCookie: 33c5. — it exists so it can be + overridden. + + -- Method: BaseCookie.value_encode (val) + + Return a tuple ‘(real_value, coded_value)’. `val' can be any type, + but ‘coded_value’ will always be converted to a string. This + method does no encoding in *note BaseCookie: 33c5. — it exists so + it can be overridden. + + In general, it should be the case that *note value_encode(): 33ca. + and *note value_decode(): 33c9. are inverses on the range of + `value_decode'. + + -- 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 *note Morsel: 86e.’s *note + output(): 33cb. method. `sep' is used to join the headers + together, and is by default the combination ‘'\r\n'’ (CRLF). + + -- 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 *note output(): 33cb. + + -- Method: BaseCookie.load (rawdata) + + If `rawdata' is a string, parse it as an ‘HTTP_COOKIE’ and add the + values found there as *note Morsel: 86e.s. If it is a dictionary, + it is equivalent to: + + for k, v in rawdata.items(): + cookie[k] = v + + +File: python.info, Node: Morsel Objects, Next: Example<13>, Prev: Cookie Objects, Up: http cookies — HTTP state management + +5.21.18.2 Morsel Objects +........................ + + -- Class: http.cookies.Morsel + + Abstract a key/value pair, which has some RFC 2109(1) attributes. + + Morsels are dictionary-like objects, whose set of keys is constant + — the valid RFC 2109(2) attributes, which are + + * ‘expires’ + + * ‘path’ + + * ‘comment’ + + * ‘domain’ + + * ‘max-age’ + + * ‘secure’ + + * ‘version’ + + * ‘httponly’ + + * ‘samesite’ + + The attribute ‘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 ‘samesite’ specifies that the browser is not allowed + to send the cookie along with cross-site requests. This helps to + mitigate CSRF attacks. Valid values for this attribute are + “Strict” and “Lax”. + + The keys are case-insensitive and their default value is ‘''’. + + Changed in version 3.5: ‘__eq__()’ now takes *note key: 86b. and + *note value: 86c. into account. + + Changed in version 3.7: Attributes *note key: 86b, *note value: + 86c. and *note coded_value: 86d. are read-only. Use *note set(): + 86f. for setting them. + + Changed in version 3.8: Added support for the ‘samesite’ attribute. + + -- Attribute: Morsel.value + + The value of the cookie. + + -- Attribute: Morsel.coded_value + + The encoded value of the cookie — this is what should be sent. + + -- Attribute: Morsel.key + + The name of the cookie. + + -- Method: Morsel.set (key, value, coded_value) + + Set the `key', `value' and `coded_value' attributes. + + -- Method: Morsel.isReservedKey (K) + + Whether `K' is a member of the set of keys of a *note Morsel: 86e. + + -- 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 ‘"Set-Cookie:"’. + + -- 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 *note output(): 33d0. + + -- 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 *note output(): 33d0. + + -- 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 RFC 2109(3) attribute. + + Changed in version 3.5: an error is raised for invalid keys. + + -- 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. + + -- Method: Morsel.setdefault (key, value=None) + + Raise an error if key is not a valid RFC 2109(4) attribute, + otherwise behave the same as *note dict.setdefault(): d29. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2109.html + + (2) https://datatracker.ietf.org/doc/html/rfc2109.html + + (3) https://datatracker.ietf.org/doc/html/rfc2109.html + + (4) https://datatracker.ietf.org/doc/html/rfc2109.html + + +File: python.info, Node: Example<13>, Prev: Morsel Objects, Up: http cookies — HTTP state management + +5.21.18.3 Example +................. + +The following example demonstrates how to use the *note http.cookies: +91. module. + + >>> 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=\\012;";') + >>> print(C) + Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;" + >>> 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 + + +File: python.info, Node: http cookiejar — Cookie handling for HTTP clients, Next: xmlrpc — XMLRPC server and client modules, Prev: http cookies — HTTP state management, Up: Internet Protocols and Support + +5.21.19 ‘http.cookiejar’ — Cookie handling for HTTP clients +----------------------------------------------------------- + +`Source code:' Lib/http/cookiejar.py(1) + +__________________________________________________________________ + +The *note http.cookiejar: 90. module defines classes for automatic +handling of HTTP cookies. It is useful for accessing web sites 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 +RFC 2965(2) are handled. RFC 2965 handling is switched off by default. +RFC 2109(3) 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. *note http.cookiejar: 90. 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 ‘max-age’ and ‘port’ cookie-attributes introduced with RFC 2965. + + Note: The various named parameters found in ‘Set-Cookie’ and + ‘Set-Cookie2’ headers (eg. ‘domain’ and ‘expires’) are + conventionally referred to as `attributes'. To distinguish them + from Python attributes, the documentation for this module uses the + term `cookie-attribute' instead. + +The module defines the following exception: + + -- Exception: http.cookiejar.LoadError + + Instances of *note FileCookieJar: 33d9. raise this exception on + failure to load cookies from a file. *note LoadError: 33d8. is a + subclass of *note OSError: 413. + + Changed in version 3.3: LoadError was made a subclass of *note + OSError: 413. instead of *note IOError: d02. + +The following classes are provided: + + -- Class: http.cookiejar.CookieJar (policy=None) + + `policy' is an object implementing the *note CookiePolicy: 33da. + interface. + + The *note CookieJar: 322c. class stores HTTP cookies. It extracts + cookies from HTTP requests, and returns them in HTTP responses. + *note CookieJar: 322c. instances automatically expire contained + cookies when necessary. Subclasses are also responsible for + storing and retrieving cookies from a file or database. + + -- Class: http.cookiejar.FileCookieJar (filename=None, delayload=None, + policy=None) + + `policy' is an object implementing the *note CookiePolicy: 33da. + interface. For the other arguments, see the documentation for the + corresponding attributes. + + A *note CookieJar: 322c. 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 *note load(): 33db. or *note revert(): + 33dc. method is called. Subclasses of this class are documented in + section *note FileCookieJar subclasses and co-operation with web + browsers: 33dd. + + This should not be initialized directly – use its subclasses below + instead. + + Changed in version 3.8: The filename parameter supports a *note + path-like object: 773. + + -- Class: http.cookiejar.CookiePolicy + + This class is responsible for deciding whether each cookie should + be accepted from / returned to the server. + + -- 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 *note None: 243, 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 + *note CookiePolicy: 33da. and *note DefaultCookiePolicy: 1442. + objects. + + *note DefaultCookiePolicy: 1442. implements the standard accept / + reject rules for Netscape and RFC 2965(4) cookies. By default, RFC + 2109(5) cookies (ie. cookies received in a ‘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 + *note rfc2109_as_netscape: 33de. is ‘True’, RFC 2109 cookies are + ‘downgraded’ by the *note CookieJar: 322c. instance to Netscape + cookies, by setting the ‘version’ attribute of the *note Cookie: + 33df. instance to 0. *note DefaultCookiePolicy: 1442. also + provides some parameters to allow some fine-tuning of policy. + + -- Class: http.cookiejar.Cookie + + This class represents Netscape, RFC 2109(6) and RFC 2965(7) + cookies. It is not expected that users of *note http.cookiejar: + 90. construct their own *note Cookie: 33df. instances. Instead, if + necessary, call ‘make_cookies()’ on a *note CookieJar: 322c. + instance. + +See also +........ + +Module *note urllib.request: 12a. + + URL opening with automatic cookie handling. + +Module *note http.cookies: 91. + + HTTP cookie classes, principally useful for server-side code. The + *note http.cookiejar: 90. and *note http.cookies: 91. modules do + not depend on each other. + +‘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 *note http.cookiejar: + 90.) only bears a passing resemblance to the one sketched out in + ‘cookie_spec.html’. + +RFC 2109(8) - HTTP State Management Mechanism + + Obsoleted by RFC 2965(9). Uses ‘Set-Cookie’ with version=1. + +RFC 2965(10) - HTTP State Management Mechanism + + The Netscape protocol with the bugs fixed. Uses ‘Set-Cookie2’ in + place of ‘Set-Cookie’. Not widely used. + +‘http://kristol.org/cookie/errata.html’ + + Unfinished errata to RFC 2965(11). + +RFC 2964(12) - 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<28>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/http/cookiejar.py + + (2) https://datatracker.ietf.org/doc/html/rfc2965.html + + (3) https://datatracker.ietf.org/doc/html/rfc2109.html + + (4) https://datatracker.ietf.org/doc/html/rfc2965.html + + (5) https://datatracker.ietf.org/doc/html/rfc2109.html + + (6) https://datatracker.ietf.org/doc/html/rfc2109.html + + (7) https://datatracker.ietf.org/doc/html/rfc2965.html + + (8) https://datatracker.ietf.org/doc/html/rfc2109.html + + (9) https://datatracker.ietf.org/doc/html/rfc2965.html + + (10) https://datatracker.ietf.org/doc/html/rfc2965.html + + (11) https://datatracker.ietf.org/doc/html/rfc2965.html + + (12) https://datatracker.ietf.org/doc/html/rfc2964.html + + +File: python.info, Node: CookieJar and FileCookieJar Objects, Next: FileCookieJar subclasses and co-operation with web browsers, Up: http cookiejar — Cookie handling for HTTP clients + +5.21.19.1 CookieJar and FileCookieJar Objects +............................................. + +*note CookieJar: 322c. objects support the *note iterator: 134f. +protocol for iterating over contained *note Cookie: 33df. objects. + +*note CookieJar: 322c. has the following methods: + + -- Method: CookieJar.add_cookie_header (request) + + Add correct ‘Cookie’ header to `request'. + + If policy allows (ie. the ‘rfc2965’ and ‘hide_cookie2’ attributes + of the *note CookieJar: 322c.’s *note CookiePolicy: 33da. instance + are true and false respectively), the ‘Cookie2’ header is also + added when appropriate. + + The `request' object (usually a *note urllib.request.Request: c7a. + instance) must support the methods ‘get_full_url()’, + ‘has_header()’, ‘get_header()’, ‘header_items()’, + ‘add_unredirected_header()’ and the attributes ‘host’, ‘type’, + ‘unverifiable’ and ‘origin_req_host’ as documented by *note + urllib.request: 12a. + + Changed in version 3.3: `request' object needs ‘origin_req_host’ + attribute. Dependency on a deprecated method + ‘get_origin_req_host()’ has been removed. + + -- Method: CookieJar.extract_cookies (response, request) + + Extract cookies from HTTP `response' and store them in the *note + CookieJar: 322c, where allowed by policy. + + The *note CookieJar: 322c. will look for allowable ‘Set-Cookie’ and + ‘Set-Cookie2’ headers in the `response' argument, and store cookies + as appropriate (subject to the *note CookiePolicy.set_ok(): 33e4. + method’s approval). + + The `response' object (usually the result of a call to *note + urllib.request.urlopen(): b22, or similar) should support an + ‘info()’ method, which returns an *note email.message.Message: 90b. + instance. + + The `request' object (usually a *note urllib.request.Request: c7a. + instance) must support the method ‘get_full_url()’ and the + attributes ‘host’, ‘unverifiable’ and ‘origin_req_host’, as + documented by *note urllib.request: 12a. 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 ‘origin_req_host’ + attribute. Dependency on a deprecated method + ‘get_origin_req_host()’ has been removed. + + -- Method: CookieJar.set_policy (policy) + + Set the *note CookiePolicy: 33da. instance to be used. + + -- Method: CookieJar.make_cookies (response, request) + + Return sequence of *note Cookie: 33df. objects extracted from + `response' object. + + See the documentation for *note extract_cookies(): 33e3. for the + interfaces required of the `response' and `request' arguments. + + -- Method: CookieJar.set_cookie_if_ok (cookie, request) + + Set a *note Cookie: 33df. if policy says it’s OK to do so. + + -- Method: CookieJar.set_cookie (cookie) + + Set a *note Cookie: 33df, without checking with policy to see + whether or not it should be set. + + -- 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 *note KeyError: 6f5. if no matching cookie exists. + + -- Method: CookieJar.clear_session_cookies () + + Discard all session cookies. + + Discards all contained cookies that have a true ‘discard’ attribute + (usually because they had either no ‘max-age’ or ‘expires’ + cookie-attribute, or an explicit ‘discard’ cookie-attribute). For + interactive browsers, the end of a session usually corresponds to + closing the browser window. + + Note that the ‘save()’ method won’t save session cookies anyway, + unless you ask otherwise by passing a true `ignore_discard' + argument. + +*note FileCookieJar: 33d9. implements the following additional methods: + + -- Method: FileCookieJar.save (filename=None, ignore_discard=False, + ignore_expires=False) + + Save cookies to a file. + + This base class raises *note NotImplementedError: 9c7. Subclasses + may leave this method unimplemented. + + `filename' is the name of file in which to save cookies. If + `filename' is not specified, ‘self.filename’ is used (whose default + is the value passed to the constructor, if any); if ‘self.filename’ + is *note None: 243, *note ValueError: 1c8. 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 + *note load(): 33db. or *note revert(): 33dc. methods. + + -- 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 *note save(): 33eb. + + The named file must be in the format understood by the class, or + *note LoadError: 33d8. will be raised. Also, *note OSError: 413. + may be raised, for example if the file does not exist. + + Changed in version 3.3: *note IOError: d02. used to be raised, it + is now an alias of *note OSError: 413. + + -- Method: FileCookieJar.revert (filename=None, ignore_discard=False, + ignore_expires=False) + + Clear all cookies and reload cookies from a saved file. + + *note revert(): 33dc. can raise the same exceptions as *note + load(): 33db. If there is a failure, the object’s state will not + be altered. + +*note FileCookieJar: 33d9. instances have the following public +attributes: + + -- Attribute: FileCookieJar.filename + + Filename of default file in which to keep cookies. This attribute + may be assigned to. + + -- 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 *note CookieJar: 322c. object may ignore it. None of + the *note FileCookieJar: 33d9. classes included in the standard + library lazily loads cookies. + + +File: python.info, Node: FileCookieJar subclasses and co-operation with web browsers, Next: CookiePolicy Objects, Prev: CookieJar and FileCookieJar Objects, Up: http cookiejar — Cookie handling for HTTP clients + +5.21.19.2 FileCookieJar subclasses and co-operation with web browsers +..................................................................... + +The following *note CookieJar: 322c. subclasses are provided for reading +and writing. + + -- Class: http.cookiejar.MozillaCookieJar (filename=None, + delayload=None, policy=None) + + A *note FileCookieJar: 33d9. that can load from and save cookies to + disk in the Mozilla ‘cookies.txt’ file format (which is also used + by the Lynx and Netscape browsers). + + Note: This loses information about RFC 2965(1) cookies, and + also about newer or non-standard cookie-attributes such as + ‘port’. + + 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). + + Also note that cookies saved while Mozilla is running will get + clobbered by Mozilla. + + -- Class: http.cookiejar.LWPCookieJar (filename=None, delayload=None, + policy=None) + + A *note FileCookieJar: 33d9. that can load from and save cookies to + disk in format compatible with the libwww-perl library’s + ‘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 *note + path-like object: 773. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2965.html + + +File: python.info, Node: CookiePolicy Objects, Next: DefaultCookiePolicy Objects, Prev: FileCookieJar subclasses and co-operation with web browsers, Up: http cookiejar — Cookie handling for HTTP clients + +5.21.19.3 CookiePolicy Objects +.............................. + +Objects implementing the *note CookiePolicy: 33da. interface have the +following methods: + + -- Method: CookiePolicy.set_ok (cookie, request) + + Return boolean value indicating whether cookie should be accepted + from server. + + `cookie' is a *note Cookie: 33df. instance. `request' is an object + implementing the interface defined by the documentation for *note + CookieJar.extract_cookies(): 33e3. + + -- Method: CookiePolicy.return_ok (cookie, request) + + Return boolean value indicating whether cookie should be returned + to server. + + `cookie' is a *note Cookie: 33df. instance. `request' is an object + implementing the interface defined by the documentation for *note + CookieJar.add_cookie_header(): 33e2. + + -- Method: CookiePolicy.domain_return_ok (domain, request) + + Return ‘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 *note domain_return_ok(): 33f4. + and *note path_return_ok(): 33f5. leaves all the work to *note + return_ok(): 33f3. + + If *note domain_return_ok(): 33f4. returns true for the cookie + domain, *note path_return_ok(): 33f5. is called for the cookie + path. Otherwise, *note path_return_ok(): 33f5. and *note + return_ok(): 33f3. are never called for that cookie domain. If + *note path_return_ok(): 33f5. returns true, *note return_ok(): + 33f3. is called with the *note Cookie: 33df. object itself for a + full check. Otherwise, *note return_ok(): 33f3. is never called + for that cookie path. + + Note that *note domain_return_ok(): 33f4. is called for every + `cookie' domain, not just for the `request' domain. For example, + the function might be called with both ‘".example.com"’ and + ‘"www.example.com"’ if the request domain is ‘"www.example.com"’. + The same goes for *note path_return_ok(): 33f5. + + The `request' argument is as documented for *note return_ok(): + 33f3. + + -- Method: CookiePolicy.path_return_ok (path, request) + + Return ‘False’ if cookies should not be returned, given cookie + path. + + See the documentation for *note domain_return_ok(): 33f4. + +In addition to implementing the methods above, implementations of the +*note CookiePolicy: 33da. interface must also supply the following +attributes, indicating which protocols should be used, and how. All of +these attributes may be assigned to. + + -- Attribute: CookiePolicy.netscape + + Implement Netscape protocol. + + -- Attribute: CookiePolicy.rfc2965 + + Implement RFC 2965(1) protocol. + + -- Attribute: CookiePolicy.hide_cookie2 + + Don’t add ‘Cookie2’ header to requests (the presence of this header + indicates to the server that we understand RFC 2965(2) cookies). + +The most useful way to define a *note CookiePolicy: 33da. class is by +subclassing from *note DefaultCookiePolicy: 1442. and overriding some or +all of the methods above. *note CookiePolicy: 33da. itself may be used +as a ‘null policy’ to allow setting and receiving any and all cookies +(this is unlikely to be useful). + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2965.html + + (2) https://datatracker.ietf.org/doc/html/rfc2965.html + + +File: python.info, Node: DefaultCookiePolicy Objects, Next: Cookie Objects<2>, Prev: CookiePolicy Objects, Up: http cookiejar — Cookie handling for HTTP clients + +5.21.19.4 DefaultCookiePolicy Objects +..................................... + +Implements the standard rules for accepting and returning cookies. + +Both RFC 2965(1) 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: + + 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 + +In addition to the features required to implement the *note +CookiePolicy: 33da. 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 ‘blocked_domains()’ and +‘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 *note None: 243. + +Domains in block or allow lists that do not start with a dot must equal +the cookie domain to be matched. For example, ‘"example.com"’ matches a +blocklist entry of ‘"example.com"’, but ‘"www.example.com"’ does not. +Domains that do start with a dot are matched by more specific domains +too. For example, both ‘"www.example.com"’ and +‘"www.coyote.example.com"’ match ‘".example.com"’ (but ‘"example.com"’ +itself does not). IP addresses are an exception, and must match +exactly. For example, if blocked_domains contains ‘"192.168.1.2"’ and +‘".168.1.2"’, 192.168.1.2 is blocked, but 193.168.1.2 is not. + +*note DefaultCookiePolicy: 1442. implements the following additional +methods: + + -- Method: DefaultCookiePolicy.blocked_domains () + + Return the sequence of blocked domains (as a tuple). + + -- Method: DefaultCookiePolicy.set_blocked_domains (blocked_domains) + + Set the sequence of blocked domains. + + -- Method: DefaultCookiePolicy.is_blocked (domain) + + Return ‘True’ if `domain' is on the blocklist for setting or + receiving cookies. + + -- Method: DefaultCookiePolicy.allowed_domains () + + Return *note None: 243, or the sequence of allowed domains (as a + tuple). + + -- Method: DefaultCookiePolicy.set_allowed_domains (allowed_domains) + + Set the sequence of allowed domains, or *note None: 243. + + -- Method: DefaultCookiePolicy.is_not_allowed (domain) + + Return ‘True’ if `domain' is not on the allowlist for setting or + receiving cookies. + +*note DefaultCookiePolicy: 1442. instances have the following +attributes, which are all initialised from the constructor arguments of +the same name, and which may all be assigned to. + + -- Attribute: DefaultCookiePolicy.rfc2109_as_netscape + + If true, request that the *note CookieJar: 322c. instance downgrade + RFC 2109(2) cookies (ie. cookies received in a ‘Set-Cookie’ header + with a version cookie-attribute of 1) to Netscape cookies by + setting the version attribute of the *note Cookie: 33df. instance + to 0. The default value is *note None: 243, in which case RFC 2109 + cookies are downgraded if and only if RFC 2965(3) handling is + turned off. Therefore, RFC 2109 cookies are downgraded by default. + +General strictness switches: + + -- Attribute: DefaultCookiePolicy.strict_domain + + Don’t allow sites to set two-component domains with country-code + top-level domains like ‘.co.uk’, ‘.gov.uk’, ‘.co.nz’.etc. This is + far from perfect and isn’t guaranteed to work! + +RFC 2965(4) protocol strictness switches: + + -- Attribute: DefaultCookiePolicy.strict_rfc2965_unverifiable + + Follow RFC 2965(5) 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 + +Netscape protocol strictness switches: + + -- Attribute: DefaultCookiePolicy.strict_ns_unverifiable + + Apply RFC 2965(6) rules on unverifiable transactions even to + Netscape cookies. + + -- Attribute: DefaultCookiePolicy.strict_ns_domain + + Flags indicating how strict to be with domain-matching rules for + Netscape cookies. See below for acceptable values. + + -- Attribute: DefaultCookiePolicy.strict_ns_set_initial_dollar + + Ignore cookies in Set-Cookie: headers that have names starting with + ‘'$'’. + + -- Attribute: DefaultCookiePolicy.strict_ns_set_path + + Don’t allow setting cookies whose path doesn’t path-match request + URI. + +‘strict_ns_domain’ is a collection of flags. Its value is constructed +by or-ing together (for example, +‘DomainStrictNoDots|DomainStrictNonDomain’ means both flags are set). + + -- Attribute: DefaultCookiePolicy.DomainStrictNoDots + + When setting cookies, the ‘host prefix’ must not contain a dot (eg. + ‘www.foo.bar.com’ can’t set a cookie for ‘.bar.com’, because + ‘www.foo’ contains a dot). + + -- Attribute: DefaultCookiePolicy.DomainStrictNonDomain + + Cookies that did not explicitly specify a ‘domain’ cookie-attribute + can only be returned to a domain equal to the domain that set the + cookie (eg. ‘spam.example.com’ won’t be returned cookies from + ‘example.com’ that had no ‘domain’ cookie-attribute). + + -- Attribute: DefaultCookiePolicy.DomainRFC2965Match + + When setting cookies, require a full RFC 2965(7) domain-match. + +The following attributes are provided for convenience, and are the most +useful combinations of the above flags: + + -- Attribute: DefaultCookiePolicy.DomainLiberal + + Equivalent to 0 (ie. all of the above Netscape domain strictness + flags switched off). + + -- Attribute: DefaultCookiePolicy.DomainStrict + + Equivalent to ‘DomainStrictNoDots|DomainStrictNonDomain’. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2965.html + + (2) https://datatracker.ietf.org/doc/html/rfc2109.html + + (3) https://datatracker.ietf.org/doc/html/rfc2965.html + + (4) https://datatracker.ietf.org/doc/html/rfc2965.html + + (5) https://datatracker.ietf.org/doc/html/rfc2965.html + + (6) https://datatracker.ietf.org/doc/html/rfc2965.html + + (7) https://datatracker.ietf.org/doc/html/rfc2965.html + + +File: python.info, Node: Cookie Objects<2>, Next: Examples<28>, Prev: DefaultCookiePolicy Objects, Up: http cookiejar — Cookie handling for HTTP clients + +5.21.19.5 Cookie Objects +........................ + +*note Cookie: 33df. 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 +‘max-age’ and ‘expires’ cookie-attributes contain equivalent +information, and because RFC 2109(1) cookies may be ‘downgraded’ by +*note http.cookiejar: 90. from version 1 to version 0 (Netscape) +cookies. + +Assignment to these attributes should not be necessary other than in +rare circumstances in a *note CookiePolicy: 33da. method. The class +does not enforce internal consistency, so you should know what you’re +doing if you do that. + + -- Attribute: Cookie.version + + Integer or *note None: 243. Netscape cookies have *note version: + 340d. 0. RFC 2965(2) and RFC 2109(3) cookies have a ‘version’ + cookie-attribute of 1. However, note that *note http.cookiejar: + 90. may ‘downgrade’ RFC 2109 cookies to Netscape cookies, in which + case *note version: 340d. is 0. + + -- Attribute: Cookie.name + + Cookie name (a string). + + -- Attribute: Cookie.value + + Cookie value (a string), or *note None: 243. + + -- Attribute: Cookie.port + + String representing a port or a set of ports (eg. ‘80’, or + ‘80,8080’), or *note None: 243. + + -- Attribute: Cookie.path + + Cookie path (a string, eg. ‘'/acme/rocket_launchers'’). + + -- Attribute: Cookie.secure + + ‘True’ if cookie should only be returned over a secure connection. + + -- Attribute: Cookie.expires + + Integer expiry date in seconds since epoch, or *note None: 243. + See also the *note is_expired(): 3414. method. + + -- Attribute: Cookie.discard + + ‘True’ if this is a session cookie. + + -- Attribute: Cookie.comment + + String comment from the server explaining the function of this + cookie, or *note None: 243. + + -- Attribute: Cookie.comment_url + + URL linking to a comment from the server explaining the function of + this cookie, or *note None: 243. + + -- Attribute: Cookie.rfc2109 + + ‘True’ if this cookie was received as an RFC 2109(4) cookie (ie. + the cookie arrived in a ‘Set-Cookie’ header, and the value of the + Version cookie-attribute in that header was 1). This attribute is + provided because *note http.cookiejar: 90. may ‘downgrade’ RFC 2109 + cookies to Netscape cookies, in which case *note version: 340d. is + 0. + + -- Attribute: Cookie.port_specified + + ‘True’ if a port or set of ports was explicitly specified by the + server (in the ‘Set-Cookie’ / ‘Set-Cookie2’ header). + + -- Attribute: Cookie.domain_specified + + ‘True’ if a domain was explicitly specified by the server. + + -- Attribute: Cookie.domain_initial_dot + + ‘True’ if the domain explicitly specified by the server began with + a dot (‘'.'’). + +Cookies may have additional non-standard cookie-attributes. These may +be accessed using the following methods: + + -- Method: Cookie.has_nonstandard_attr (name) + + Return ‘True’ if cookie has the named cookie-attribute. + + -- Method: Cookie.get_nonstandard_attr (name, default=None) + + If cookie has the named cookie-attribute, return its value. + Otherwise, return `default'. + + -- Method: Cookie.set_nonstandard_attr (name, value) + + Set the value of the named cookie-attribute. + +The *note Cookie: 33df. class also defines the following method: + + -- Method: Cookie.is_expired (now=None) + + ‘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. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2109.html + + (2) https://datatracker.ietf.org/doc/html/rfc2965.html + + (3) https://datatracker.ietf.org/doc/html/rfc2109.html + + (4) https://datatracker.ietf.org/doc/html/rfc2109.html + + +File: python.info, Node: Examples<28>, Prev: Cookie Objects<2>, Up: http cookiejar — Cookie handling for HTTP clients + +5.21.19.6 Examples +.................. + +The first example shows the most common usage of *note http.cookiejar: +90.: + + import http.cookiejar, urllib.request + cj = http.cookiejar.CookieJar() + opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) + r = opener.open("http://example.com/") + +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): + + 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/") + +The next example illustrates the use of *note DefaultCookiePolicy: 1442. +Turn on RFC 2965(1) cookies, be more strict about domains when setting +and returning Netscape cookies, and block some domains from setting +cookies or having them returned: + + 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/") + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2965.html + + +File: python.info, Node: xmlrpc — XMLRPC server and client modules, Next: xmlrpc client — XML-RPC client access, Prev: http cookiejar — Cookie handling for HTTP clients, Up: Internet Protocols and Support + +5.21.20 ‘xmlrpc’ — XMLRPC server and client modules +--------------------------------------------------- + +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. + +‘xmlrpc’ is a package that collects server and client modules +implementing XML-RPC. The modules are: + + * *note xmlrpc.client: 14a. + + * *note xmlrpc.server: 14b. + + +File: python.info, Node: xmlrpc client — XML-RPC client access, Next: xmlrpc server — Basic XML-RPC servers, Prev: xmlrpc — XMLRPC server and client modules, Up: Internet Protocols and Support + +5.21.21 ‘xmlrpc.client’ — XML-RPC client access +----------------------------------------------- + +`Source code:' Lib/xmlrpc/client.py(1) + +__________________________________________________________________ + +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. + + Warning: The *note xmlrpc.client: 14a. module is not secure against + maliciously constructed data. If you need to parse untrusted or + unauthenticated data see *note XML vulnerabilities: 2fb7. + +Changed in version 3.5: For HTTPS URIs, *note xmlrpc.client: 14a. now +performs all the necessary certificate and hostname checks by default. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + + -- 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 *note ServerProxy: 6a6. 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 + ‘SafeTransport’ instance for https: URLs and an internal HTTP + ‘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 ‘None’ will + be translated into XML; the default behaviour is for ‘None’ to + raise a *note TypeError: 19c. 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(2) for a + description. The `use_builtin_types' flag can be used to cause + date/time values to be presented as *note datetime.datetime: 4be. + objects and binary data to be presented as *note bytes: 1b4. + objects; this flag is false by default. *note datetime.datetime: + 4be, *note bytes: 1b4. and *note bytearray: 1a5. 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. + ‘[('Header-Name', 'value')]’). 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: ‘http://user:pass@host:port/path’. The +‘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. If an +HTTPS URL is provided, `context' may be *note ssl.SSLContext: 430. and +configures the SSL settings of the underlying HTTPS connection. + +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): + +XML-RPC type Python type + +--------------------------------------------------------------------------------------- + +‘boolean’ *note bool: 463. + + +‘int’, ‘i1’, ‘i2’, ‘i4’, *note int: 1c7. in range from -2147483648 to 2147483647. +‘i8’ or ‘biginteger’ Values get the ‘<int>’ tag. + + +‘double’ or ‘float’ *note float: 3ca. Values get the ‘<double>’ tag. + + +‘string’ *note str: 1b3. + + +‘array’ *note list: 1e9. or *note tuple: 539. containing + conformable elements. Arrays are returned as + *note lists: 1e9. + + +‘struct’ *note dict: 16e. Keys must be strings, values may be any + conformable type. Objects of user-defined classes can be + passed in; only their *note __dict__: 8ce. attribute is + transmitted. + + +‘dateTime.iso8601’ *note DateTime: 3424. or *note datetime.datetime: 4be. + Returned type depends on values of `use_builtin_types' + and `use_datetime' flags. + + +‘base64’ *note Binary: 3425, *note bytes: 1b4. or + *note bytearray: 1a5. Returned type depends on the value + of the `use_builtin_types' flag. + + +‘nil’ The ‘None’ constant. Passing is allowed only if + `allow_none' is true. + + +‘bigdecimal’ *note decimal.Decimal: 3bd. Returned type only. + + +This is the full set of data types supported by XML-RPC. Method calls +may also raise a special *note Fault: 3426. instance, used to signal +XML-RPC server errors, or *note ProtocolError: 3427. used to signal an +error in the HTTP/HTTPS transport layer. Both *note Fault: 3426. and +*note ProtocolError: 3427. derive from a base class called ‘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 ‘<’, ‘>’, and +‘&’ 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 +*note bytes: 1b4. or *note bytearray: 1a5. classes or the *note Binary: +3425. wrapper class described below. + +‘Server’ is retained as an alias for *note ServerProxy: 6a6. for +backwards compatibility. New code should use *note ServerProxy: 6a6. + +Changed in version 3.5: Added the `context' argument. + +Changed in version 3.6: Added support of type tags with prefixes (e.g. +‘ex:nil’). Added support of unmarshalling additional types used by +Apache XML-RPC implementation for numerics: ‘i1’, ‘i2’, ‘i8’, +‘biginteger’, ‘float’ and ‘bigdecimal’. See +‘https://ws.apache.org/xmlrpc/types.html’ for a description. + +See also +........ + +XML-RPC HOWTO(3) + + 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. + +XML-RPC Introspection(4) + + Describes the XML-RPC protocol extension for introspection. + +XML-RPC Specification(5) + + The official specification. + +* 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:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/xmlrpc/client.py + + (2) +https://web.archive.org/web/20130120074804/http://ontosys.com/xml-rpc/extensions.php + + (3) https://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html + + (4) https://xmlrpc-c.sourceforge.net/introspection.html + + (5) http://xmlrpc.scripting.com/spec.html + + +File: python.info, Node: ServerProxy Objects, Next: DateTime Objects, Up: xmlrpc client — XML-RPC client access + +5.21.21.1 ServerProxy Objects +............................. + +A *note ServerProxy: 6a6. 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 *note Fault: 3426. or *note +ProtocolError: 3427. object indicating an error. + +Servers that support the XML introspection API support some common +methods grouped under the reserved ‘system’ attribute: + + -- Method: ServerProxy.system.listMethods () + + This method returns a list of strings, one for each (non-system) + method supported by the XML-RPC server. + + -- 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. + + -- 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. + +Changed in version 3.5: Instances of *note ServerProxy: 6a6. support the +*note context manager: 1a0. protocol for closing the underlying +transport. + +A working example follows. The server code: + + 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() + +The client code for the preceding server: + + 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))) + + +File: python.info, Node: DateTime Objects, Next: Binary Objects, Prev: ServerProxy Objects, Up: xmlrpc client — XML-RPC client access + +5.21.21.2 DateTime Objects +.......................... + + -- 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 *note datetime.datetime: + 4be. instance. It has the following methods, supported mainly for + internal use by the marshalling/unmarshalling code: + + -- Method: decode (string) + + Accept a string as the instance’s new time value. + + -- Method: encode (out) + + Write the XML-RPC encoding of this *note DateTime: 3424. item + to the `out' stream object. + + It also supports certain of Python’s built-in operators through + rich comparison and ‘__repr__()’ methods. + +A working example follows. The server code: + + import datetime + from xmlrpc.server import SimpleXMLRPCServer + import xmlrpc.client + + def today(): + today = datetime.datetime.today() + return xmlrpc.client.DateTime(today) + + server = SimpleXMLRPCServer(("localhost", 8000)) + print("Listening on port 8000...") + server.register_function(today, "today") + server.serve_forever() + +The client code for the preceding server: + + import xmlrpc.client + import datetime + + proxy = xmlrpc.client.ServerProxy("http://localhost:8000/") + + today = proxy.today() + # convert the ISO8601 string to a datetime object + converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S") + print("Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")) + + +File: python.info, Node: Binary Objects, Next: Fault Objects, Prev: DateTime Objects, Up: xmlrpc client — XML-RPC client access + +5.21.21.3 Binary Objects +........................ + + -- Class: xmlrpc.client.Binary + + This class may be initialized from bytes data (which may include + NULs). The primary access to the content of a *note Binary: 3425. + object is provided by an attribute: + + -- Attribute: data + + The binary data encapsulated by the *note Binary: 3425. + instance. The data is provided as a *note bytes: 1b4. object. + + *note Binary: 3425. objects have the following methods, supported + mainly for internal use by the marshalling/unmarshalling code: + + -- Method: decode (bytes) + + Accept a base64 *note bytes: 1b4. object and decode it as the + instance’s new data. + + -- 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 + RFC 2045 section 6.8(1), which was the de facto standard + base64 specification when the XML-RPC spec was written. + + It also supports certain of Python’s built-in operators through + ‘__eq__()’ and ‘__ne__()’ methods. + +Example usage of the binary objects. We’re going to transfer an image +over XMLRPC: + + 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() + +The client gets the image and saves it to a file: + + 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) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2045.html#section-6.8 + + +File: python.info, Node: Fault Objects, Next: ProtocolError Objects, Prev: Binary Objects, Up: xmlrpc client — XML-RPC client access + +5.21.21.4 Fault Objects +....................... + + -- Class: xmlrpc.client.Fault + + A *note Fault: 3426. object encapsulates the content of an XML-RPC + fault tag. Fault objects have the following attributes: + + -- Attribute: faultCode + + An int indicating the fault type. + + -- Attribute: faultString + + A string containing a diagnostic message associated with the + fault. + +In the following example we’re going to intentionally cause a *note +Fault: 3426. by returning a complex type object. The server code: + + 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() + +The client code for the preceding server: + + 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) + + +File: python.info, Node: ProtocolError Objects, Next: MultiCall Objects, Prev: Fault Objects, Up: xmlrpc client — XML-RPC client access + +5.21.21.5 ProtocolError Objects +............................... + + -- Class: xmlrpc.client.ProtocolError + + A *note ProtocolError: 3427. 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: + + -- Attribute: url + + The URI or URL that triggered the error. + + -- Attribute: errcode + + The error code. + + -- Attribute: errmsg + + The error message or diagnostic string. + + -- Attribute: headers + + A dict containing the headers of the HTTP/HTTPS request that + triggered the error. + +In the following example we’re going to intentionally cause a *note +ProtocolError: 3427. by providing an invalid URI: + + 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) + + +File: python.info, Node: MultiCall Objects, Next: Convenience Functions, Prev: ProtocolError Objects, Up: xmlrpc client — XML-RPC client access + +5.21.21.6 MultiCall Objects +........................... + +The *note MultiCall: 3441. object provides a way to encapsulate multiple +calls to a remote server into a single request (1). + + -- 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 ‘None’, and only store the + call name and parameters in the *note MultiCall: 3441. object. + Calling the object itself causes all stored calls to be transmitted + as a single ‘system.multicall’ request. The result of this call is + a *note generator: d11.; iterating over this generator yields the + individual results. + +A usage example of this class follows. The server code: + + 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() + +The client code for the preceding server: + + 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)) + + ---------- Footnotes ---------- + + (1) This approach has been first presented in a discussion on +xmlrpc.com +(https://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic). + + +File: python.info, Node: Convenience Functions, Next: Example of Client Usage, Prev: MultiCall Objects, Up: xmlrpc client — XML-RPC client access + +5.21.21.7 Convenience Functions +............................... + + -- 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 *note Fault: 3426. 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 *note None: 243. value cannot be used in + standard XML-RPC; to allow using it via an extension, provide a + true value for `allow_none'. + + -- Function: xmlrpc.client.loads (data, use_datetime=False, + use_builtin_types=False) + + Convert an XML-RPC request or response into Python objects, a + ‘(params, methodname)’. `params' is a tuple of argument; + `methodname' is a string, or ‘None’ if no method name is present in + the packet. If the XML-RPC packet represents a fault condition, + this function will raise a *note Fault: 3426. exception. The + `use_builtin_types' flag can be used to cause date/time values to + be presented as *note datetime.datetime: 4be. objects and binary + data to be presented as *note bytes: 1b4. 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. + + +File: python.info, Node: Example of Client Usage, Next: Example of Client and Server Usage, Prev: Convenience Functions, Up: xmlrpc client — XML-RPC client access + +5.21.21.8 Example of Client Usage +................................. + + # 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) + +To access an XML-RPC server through a HTTP proxy, you need to define a +custom transport. The following example shows how: + + 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)) + + +File: python.info, Node: Example of Client and Server Usage, Prev: Example of Client Usage, Up: xmlrpc client — XML-RPC client access + +5.21.21.9 Example of Client and Server Usage +............................................ + +See *note SimpleXMLRPCServer Example: 3448. + + +File: python.info, Node: xmlrpc server — Basic XML-RPC servers, Next: ipaddress — IPv4/IPv6 manipulation library, Prev: xmlrpc client — XML-RPC client access, Up: Internet Protocols and Support + +5.21.22 ‘xmlrpc.server’ — Basic XML-RPC servers +----------------------------------------------- + +`Source code:' Lib/xmlrpc/server.py(1) + +__________________________________________________________________ + +The *note xmlrpc.server: 14b. module provides a basic server framework +for XML-RPC servers written in Python. Servers can either be free +standing, using *note SimpleXMLRPCServer: 344b, or embedded in a CGI +environment, using *note CGIXMLRPCRequestHandler: 344c. + + Warning: The *note xmlrpc.server: 14b. module is not secure against + maliciously constructed data. If you need to parse untrusted or + unauthenticated data see *note XML vulnerabilities: 2fb7. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + + -- 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 *note + SimpleXMLRPCRequestHandler: 344d. The `addr' and `requestHandler' + parameters are passed to the *note socketserver.TCPServer: 3375. + 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 *note + xmlrpc.client: 14a. and control the XML-RPC responses that will be + returned from the server. The `bind_and_activate' parameter + controls whether ‘server_bind()’ and ‘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 *note loads(): 3444. 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. + + -- 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 *note xmlrpc.client: 14a. and control the XML-RPC responses + that will be returned from the server. The `use_builtin_types' + parameter is passed to the *note loads(): 3444. 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. + + -- Class: xmlrpc.server.SimpleXMLRPCRequestHandler + + Create a new request handler instance. This request handler + supports ‘POST’ requests and modifies logging so that the + `logRequests' parameter to the *note SimpleXMLRPCServer: 344b. + constructor parameter is honored. + +* Menu: + +* SimpleXMLRPCServer Objects:: +* CGIXMLRPCRequestHandler:: +* Documenting XMLRPC server:: +* DocXMLRPCServer Objects:: +* DocCGIXMLRPCRequestHandler:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/xmlrpc/server.py + + +File: python.info, Node: SimpleXMLRPCServer Objects, Next: CGIXMLRPCRequestHandler, Up: xmlrpc server — Basic XML-RPC servers + +5.21.22.1 SimpleXMLRPCServer Objects +.................................... + +The *note SimpleXMLRPCServer: 344b. class is based on *note +socketserver.TCPServer: 3375. and provides a means of creating simple, +stand alone XML-RPC servers. + + -- 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 ‘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, + ‘function.__name__’ will be used. + + Changed in version 3.7: *note register_function(): 3450. can be + used as a decorator. + + -- 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 *note register_function(): 3450. If + `instance' contains a ‘_dispatch()’ method, it is called with the + requested method name and the parameters from the request. Its API + is ‘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 + ‘func(*params)’, expanding the parameter list. The return value + from ‘_dispatch()’ is returned to the client as the result. If + `instance' does not have a ‘_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 ‘_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. + + 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. + + -- Method: SimpleXMLRPCServer.register_introspection_functions () + + Registers the XML-RPC introspection functions ‘system.listMethods’, + ‘system.methodHelp’ and ‘system.methodSignature’. + + -- Method: SimpleXMLRPCServer.register_multicall_functions () + + Registers the XML-RPC multicall function system.multicall. + + -- 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 ‘('/', '/RPC2')’. + +* Menu: + +* SimpleXMLRPCServer Example:: + + +File: python.info, Node: SimpleXMLRPCServer Example, Up: SimpleXMLRPCServer Objects + +5.21.22.2 SimpleXMLRPCServer Example +.................................... + +Server code: + + 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() + +The following client code will call the methods made available by the +preceding server: + + 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()) + +‘register_function()’ can also be used as a decorator. The previous +server example can register functions in a decorator way: + + 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() + +The following example included in the ‘Lib/xmlrpc/server.py’ module +shows a server allowing dotted names and registering a multicall +function. + + 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 only + within a secure, closed network. + + import datetime + + class ExampleService: + def getData(self): + return '42' + + class currentTime: + @staticmethod + def getCurrentTime(): + return datetime.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) + +This ExampleService demo can be invoked from the command line: + + python -m xmlrpc.server + +The client that interacts with the above server is included in +‘Lib/xmlrpc/client.py’: + + 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) + +This client which interacts with the demo XMLRPC server can be invoked +as: + + python -m xmlrpc.client + + +File: python.info, Node: CGIXMLRPCRequestHandler, Next: Documenting XMLRPC server, Prev: SimpleXMLRPCServer Objects, Up: xmlrpc server — Basic XML-RPC servers + +5.21.22.3 CGIXMLRPCRequestHandler +................................. + +The *note CGIXMLRPCRequestHandler: 344c. class can be used to handle +XML-RPC requests sent to Python CGI scripts. + + -- 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 ‘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, + ‘function.__name__’ will be used. + + Changed in version 3.7: *note register_function(): 3457. can be + used as a decorator. + + -- Method: CGIXMLRPCRequestHandler.register_instance (instance) + + Register an object which is used to expose method names which have + not been registered using *note register_function(): 3457. If + instance contains a ‘_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 ‘_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. + + -- Method: CGIXMLRPCRequestHandler.register_introspection_functions () + + Register the XML-RPC introspection functions ‘system.listMethods’, + ‘system.methodHelp’ and ‘system.methodSignature’. + + -- Method: CGIXMLRPCRequestHandler.register_multicall_functions () + + Register the XML-RPC multicall function ‘system.multicall’. + + -- 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. + +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() + + +File: python.info, Node: Documenting XMLRPC server, Next: DocXMLRPCServer Objects, Prev: CGIXMLRPCRequestHandler, Up: xmlrpc server — Basic XML-RPC servers + +5.21.22.4 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 *note DocXMLRPCServer: 13df, or embedded in a CGI environment, +using *note DocCGIXMLRPCRequestHandler: 345d. + + -- 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 *note SimpleXMLRPCServer: 344b.; `requestHandler' defaults + to *note DocXMLRPCRequestHandler: 345e. + + Changed in version 3.3: The `use_builtin_types' flag was added. + + -- Class: xmlrpc.server.DocCGIXMLRPCRequestHandler + + Create a new instance to handle XML-RPC requests in a CGI + environment. + + -- 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 *note + DocXMLRPCServer: 13df. constructor parameter is honored. + + +File: python.info, Node: DocXMLRPCServer Objects, Next: DocCGIXMLRPCRequestHandler, Prev: Documenting XMLRPC server, Up: xmlrpc server — Basic XML-RPC servers + +5.21.22.5 DocXMLRPCServer Objects +................................. + +The *note DocXMLRPCServer: 13df. class is derived from *note +SimpleXMLRPCServer: 344b. 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. + + -- 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. + + -- 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. + + -- 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. + + +File: python.info, Node: DocCGIXMLRPCRequestHandler, Prev: DocXMLRPCServer Objects, Up: xmlrpc server — Basic XML-RPC servers + +5.21.22.6 DocCGIXMLRPCRequestHandler +.................................... + +The *note DocCGIXMLRPCRequestHandler: 345d. class is derived from *note +CGIXMLRPCRequestHandler: 344c. 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. + + -- 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. + + -- 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. + + -- 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. + + +File: python.info, Node: ipaddress — IPv4/IPv6 manipulation library, Prev: xmlrpc server — Basic XML-RPC servers, Up: Internet Protocols and Support + +5.21.23 ‘ipaddress’ — IPv4/IPv6 manipulation library +---------------------------------------------------- + +`Source code:' Lib/ipaddress.py(1) + +__________________________________________________________________ + +*note ipaddress: a0. 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 *note An introduction to the ipaddress module: 346a. + +New in version 3.3. + +* Menu: + +* Convenience factory functions:: +* IP Addresses:: +* IP Network definitions:: +* Interface objects:: +* Other Module Level Functions:: +* Custom Exceptions:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/ipaddress.py + + +File: python.info, Node: Convenience factory functions, Next: IP Addresses, Up: ipaddress — IPv4/IPv6 manipulation library + +5.21.23.1 Convenience factory functions +....................................... + +The *note ipaddress: a0. module provides factory functions to +conveniently create IP addresses, networks and interfaces: + + -- Function: ipaddress.ip_address (address) + + Return an *note IPv4Address: 346d. or *note IPv6Address: 552. + object depending on the IP address passed as argument. Either IPv4 + or IPv6 addresses may be supplied; integers less than ‘2**32’ will + be considered to be IPv4 by default. A *note ValueError: 1c8. is + raised if `address' does not represent a valid IPv4 or IPv6 + address. + + >>> ipaddress.ip_address('192.168.0.1') + IPv4Address('192.168.0.1') + >>> ipaddress.ip_address('2001:db8::') + IPv6Address('2001:db8::') + + -- Function: ipaddress.ip_network (address, strict=True) + + Return an *note IPv4Network: 7a3. or *note IPv6Network: 7a2. 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 ‘2**32’ will be + considered to be IPv4 by default. `strict' is passed to *note + IPv4Network: 7a3. or *note IPv6Network: 7a2. constructor. A *note + ValueError: 1c8. is raised if `address' does not represent a valid + IPv4 or IPv6 address, or if the network has host bits set. + + >>> ipaddress.ip_network('192.168.0.0/28') + IPv4Network('192.168.0.0/28') + + -- Function: ipaddress.ip_interface (address) + + Return an *note IPv4Interface: 11f4. or *note IPv6Interface: 11f5. + 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 ‘2**32’ will be + considered to be IPv4 by default. A *note ValueError: 1c8. is + raised if `address' does not represent a valid IPv4 or IPv6 + address. + +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. + + +File: python.info, Node: IP Addresses, Next: IP Network definitions, Prev: Convenience factory functions, Up: ipaddress — IPv4/IPv6 manipulation library + +5.21.23.2 IP Addresses +...................... + +* Menu: + +* Address objects:: +* Conversion to Strings and Integers:: +* Operators: Operators<3>. + + +File: python.info, Node: Address objects, Next: Conversion to Strings and Integers, Up: IP Addresses + +5.21.23.3 Address objects +......................... + +The *note IPv4Address: 346d. and *note IPv6Address: 552. objects share a +lot of common attributes. Some attributes that are only meaningful for +IPv6 addresses are also implemented by *note IPv4Address: 346d. objects, +in order to make it easier to write code that handles both IP versions +correctly. Address objects are *note hashable: 1e8, so they can be used +as keys in dictionaries. + + -- Class: ipaddress.IPv4Address (address) + + Construct an IPv4 address. An *note AddressValueError: 3472. is + raised if `address' is not a valid IPv4 address. + + The following constitutes a valid IPv4 address: + + 1. A string in decimal-dot notation, consisting of four decimal + integers in the inclusive range 0–255, separated by dots (e.g. + ‘192.168.0.1’). Each integer represents an octet (byte) in + the address. Leading zeroes are not tolerated to prevent + confusion with octal notation. + + 2. An integer that fits into 32 bits. + + 3. An integer packed into a *note bytes: 1b4. object of length 4 + (most significant octet first). + + >>> 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') + + Changed in version 3.8: Leading zeros are tolerated, even in + ambiguous cases that look like octal notation. + + Changed in version 3.10: Leading zeros are no longer tolerated and + are treated as an error. IPv4 address strings are now parsed as + strict as glibc *note inet_pton(): 5b4. + + Changed in version 3.9.5: The above change was also included in + Python 3.9 starting with version 3.9.5. + + Changed in version 3.8.12: The above change was also included in + Python 3.8 starting with version 3.8.12. + + -- Attribute: version + + The appropriate version number: ‘4’ for IPv4, ‘6’ for IPv6. + + -- Attribute: max_prefixlen + + The total number of bits in the address representation for + this version: ‘32’ for IPv4, ‘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. + + -- Attribute: compressed + + -- 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 ‘str(addr)’ for IPv4 addresses. Exposing these + attributes makes it easier to write display code that can + handle both IPv4 and IPv6 addresses. + + -- Attribute: packed + + The binary representation of this address - a *note bytes: + 1b4. object of the appropriate length (most significant octet + first). This is 4 bytes for IPv4 and 16 bytes for IPv6. + + -- Attribute: reverse_pointer + + The name of the reverse DNS PTR record for the IP address, + e.g.: + + >>> 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' + + This is the name that could be used for performing a PTR + lookup, not the resolved hostname itself. + + New in version 3.5. + + -- Attribute: is_multicast + + ‘True’ if the address is reserved for multicast use. See RFC + 3171(1) (for IPv4) or RFC 2373(2) (for IPv6). + + -- Attribute: is_private + + ‘True’ if the address is allocated for private networks. See + iana-ipv4-special-registry(3) (for IPv4) or + iana-ipv6-special-registry(4) (for IPv6). + + -- Attribute: is_global + + ‘True’ if the address is allocated for public networks. See + iana-ipv4-special-registry(5) (for IPv4) or + iana-ipv6-special-registry(6) (for IPv6). + + New in version 3.4. + + -- Attribute: is_unspecified + + ‘True’ if the address is unspecified. See RFC 5735(7) (for + IPv4) or RFC 2373(8) (for IPv6). + + -- Attribute: is_reserved + + ‘True’ if the address is otherwise IETF reserved. + + -- Attribute: is_loopback + + ‘True’ if this is a loopback address. See RFC 3330(9) (for + IPv4) or RFC 2373(10) (for IPv6). + + -- Attribute: is_link_local + + ‘True’ if the address is reserved for link-local usage. See + RFC 3927(11). + + -- 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: ‘'s'’, + the default option, equivalent to *note str(): 1b3, ‘'b'’ for a + zero-padded binary string, ‘'X'’ or ‘'x'’ for an uppercase or + lowercase hexadecimal representation, or ‘'n'’, which is equivalent + to ‘'b'’ for IPv4 addresses and ‘'x'’ for IPv6. For binary and + hexadecimal representations, the form specifier ‘'#'’ and the + grouping option ‘'_'’ are available. ‘__format__’ is used by + ‘format’, ‘str.format’ and f-strings. + + >>> 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' + + New in version 3.9. + + -- Class: ipaddress.IPv6Address (address) + + Construct an IPv6 address. An *note AddressValueError: 3472. is + raised if `address' is not a valid IPv6 address. + + The following constitutes a valid IPv6 address: + + 1. 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 RFC 4291(12) for details. + For example, ‘"0000:0000:0000:0000:0000:0abc:0007:0def"’ can + be compressed to ‘"::abc:7:def"’. + + Optionally, the string may also have a scope zone ID, + expressed with a suffix ‘%scope_id’. If present, the scope ID + must be non-empty, and may not contain ‘%’. See RFC 4007(13) + for details. For example, ‘fe80::1234%1’ might identify + address ‘fe80::1234’ on the first link of the node. + + 2. An integer that fits into 128 bits. + + 3. An integer packed into a *note bytes: 1b4. object of length + 16, big-endian. + + >>> ipaddress.IPv6Address('2001:db8::1000') + IPv6Address('2001:db8::1000') + >>> ipaddress.IPv6Address('ff02::5678%1') + IPv6Address('ff02::5678%1') + + -- Attribute: compressed + + 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 ‘str(addr)’ for IPv6 addresses. + + -- Attribute: exploded + + 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 *note IPv4Address: 346d. class: + + -- Attribute: packed + + -- Attribute: reverse_pointer + + -- Attribute: version + + -- Attribute: max_prefixlen + + -- Attribute: is_multicast + + -- Attribute: is_private + + -- Attribute: is_global + + -- Attribute: is_unspecified + + -- Attribute: is_reserved + + -- Attribute: is_loopback + + -- Attribute: is_link_local + + New in version 3.4: is_global + + -- Attribute: is_site_local + + ‘True’ if the address is reserved for site-local usage. Note + that the site-local address space has been deprecated by RFC + 3879(14). Use *note is_private: 347a. to test if this address + is in the space of unique local addresses as defined by RFC + 4193(15). + + -- Attribute: ipv4_mapped + + For addresses that appear to be IPv4 mapped addresses + (starting with ‘::FFFF/96’), this property will report the + embedded IPv4 address. For any other address, this property + will be ‘None’. + + -- Attribute: scope_id + + For scoped addresses as defined by RFC 4007(16), 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 ‘None’. + + -- Attribute: sixtofour + + For addresses that appear to be 6to4 addresses (starting with + ‘2002::/16’) as defined by RFC 3056(17), this property will + report the embedded IPv4 address. For any other address, this + property will be ‘None’. + + -- Attribute: teredo + + For addresses that appear to be Teredo addresses (starting + with ‘2001::/32’) as defined by RFC 4380(18), this property + will report the embedded ‘(server, client)’ IP address pair. + For any other address, this property will be ‘None’. + + -- Method: IPv6Address.__format__ (fmt) + + Refer to the corresponding method documentation in *note + IPv4Address: 346d. + + New in version 3.9. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc3171.html + + (2) https://datatracker.ietf.org/doc/html/rfc2373.html + + (3) +https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml + + (4) +https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml + + (5) +https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml + + (6) +https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml + + (7) https://datatracker.ietf.org/doc/html/rfc5735.html + + (8) https://datatracker.ietf.org/doc/html/rfc2373.html + + (9) https://datatracker.ietf.org/doc/html/rfc3330.html + + (10) https://datatracker.ietf.org/doc/html/rfc2373.html + + (11) https://datatracker.ietf.org/doc/html/rfc3927.html + + (12) https://datatracker.ietf.org/doc/html/rfc4291.html + + (13) https://datatracker.ietf.org/doc/html/rfc4007.html + + (14) https://datatracker.ietf.org/doc/html/rfc3879.html + + (15) https://datatracker.ietf.org/doc/html/rfc4193.html + + (16) https://datatracker.ietf.org/doc/html/rfc4007.html + + (17) https://datatracker.ietf.org/doc/html/rfc3056.html + + (18) https://datatracker.ietf.org/doc/html/rfc4380.html + + +File: python.info, Node: Conversion to Strings and Integers, Next: Operators<3>, Prev: Address objects, Up: IP Addresses + +5.21.23.4 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 *note str(): 1b3. and *note int(): 1c7. builtin functions: + + >>> 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 + +Note that IPv6 scoped addresses are converted to integers without scope +zone ID. + + +File: python.info, Node: Operators<3>, Prev: Conversion to Strings and Integers, Up: IP Addresses + +5.21.23.5 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:: + + +File: python.info, Node: Comparison operators, Next: Arithmetic operators, Up: Operators<3> + +5.21.23.6 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: + + >>> 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 + + +File: python.info, Node: Arithmetic operators, Prev: Comparison operators, Up: Operators<3> + +5.21.23.7 Arithmetic operators +.............................. + +Integers can be added to or subtracted from address objects. Some +examples: + + >>> 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 + + +File: python.info, Node: IP Network definitions, Next: Interface objects, Prev: IP Addresses, Up: ipaddress — IPv4/IPv6 manipulation library + +5.21.23.8 IP Network definitions +................................ + +The *note IPv4Network: 7a3. and *note IPv6Network: 7a2. 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 ‘255.255.255.0’ and the network address ‘192.168.1.0’ +consists of IP addresses in the inclusive range ‘192.168.1.0’ to +‘192.168.1.255’. + +* Menu: + +* Prefix, net mask and host mask: Prefix net mask and host mask. +* Network objects:: +* Operators: Operators<4>. + + +File: python.info, Node: Prefix net mask and host mask, Next: Network objects, Up: IP Network definitions + +5.21.23.9 Prefix, net mask and host mask +........................................ + +There are several equivalent ways to specify IP network masks. A +`prefix' ‘/<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 ‘/24’ is equivalent to +the net mask ‘255.255.255.0’ in IPv4, or ‘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 ‘/24’ in IPv4 is ‘0.0.0.255’. + + +File: python.info, Node: Network objects, Next: Operators<4>, Prev: Prefix net mask and host mask, Up: IP Network definitions + +5.21.23.10 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 *note IPv4Network: 7a3. and +*note IPv6Network: 7a2, so to avoid duplication they are only documented +for *note IPv4Network: 7a3. Network objects are *note hashable: 1e8, so +they can be used as keys in dictionaries. + + -- Class: ipaddress.IPv4Network (address, strict=True) + + Construct an IPv4 network definition. `address' can be one of the + following: + + 1. A string consisting of an IP address and an optional mask, + separated by a slash (‘/’). 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 ‘/32’. + + For example, the following `address' specifications are + equivalent: ‘192.168.1.0/24’, ‘192.168.1.0/255.255.255.0’ and + ‘192.168.1.0/0.0.0.255’. + + 2. 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 ‘/32’. + + 3. An integer packed into a *note bytes: 1b4. object of length 4, + big-endian. The interpretation is similar to an integer + `address'. + + 4. 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 IPv4Address object; and + the netmask is either an integer representing the prefix + length (e.g. ‘24’) or a string representing the prefix mask + (e.g. ‘255.255.255.0’). + + An *note AddressValueError: 3472. is raised if `address' is not a + valid IPv4 address. A *note NetmaskValueError: 3498. is raised if + the mask is not valid for an IPv4 address. + + If `strict' is ‘True’ and host bits are set in the supplied + address, then *note ValueError: 1c8. 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 *note TypeError: 19c. if the + argument’s IP version is incompatible to ‘self’. + + Changed in version 3.5: Added the two-tuple form for the `address' + constructor parameter. + + -- Attribute: version + + -- Attribute: max_prefixlen + + Refer to the corresponding attribute documentation in *note + IPv4Address: 346d. + + -- Attribute: is_multicast + + -- Attribute: is_private + + -- Attribute: is_unspecified + + -- Attribute: is_reserved + + -- Attribute: is_loopback + + -- 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. + + -- Attribute: network_address + + The network address for the network. The network address and + the prefix length together uniquely define a network. + + -- Attribute: broadcast_address + + The broadcast address for the network. Packets sent to the + broadcast address should be received by every host on the + network. + + -- Attribute: hostmask + + The host mask, as an *note IPv4Address: 346d. object. + + -- Attribute: netmask + + The net mask, as an *note IPv4Address: 346d. object. + + -- Attribute: with_prefixlen + + -- Attribute: compressed + + -- Attribute: exploded + + A string representation of the network, with the mask in + prefix notation. + + ‘with_prefixlen’ and ‘compressed’ are always the same as + ‘str(network)’. ‘exploded’ uses the exploded form the network + address. + + -- Attribute: with_netmask + + A string representation of the network, with the mask in net + mask notation. + + -- Attribute: with_hostmask + + A string representation of the network, with the mask in host + mask notation. + + -- Attribute: num_addresses + + The total number of addresses in the network. + + -- Attribute: prefixlen + + Length of the network prefix, in bits. + + -- 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. + + >>> 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')] + + -- Method: overlaps (other) + + ‘True’ if this network is partly or wholly contained in + `other' or `other' is wholly contained in this network. + + -- Method: address_exclude (network) + + Computes the network definitions resulting from removing the + given `network' from this one. Returns an iterator of network + objects. Raises *note ValueError: 1c8. if `network' is not + completely contained in this network. + + >>> 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')] + + -- 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. + + >>> 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')] + + -- 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. + + >>> 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') + + -- Method: subnet_of (other) + + Return ‘True’ if this network is a subnet of `other'. + + >>> a = ip_network('192.168.1.0/24') + >>> b = ip_network('192.168.1.128/30') + >>> b.subnet_of(a) + True + + New in version 3.7. + + -- Method: supernet_of (other) + + Return ‘True’ if this network is a supernet of `other'. + + >>> a = ip_network('192.168.1.0/24') + >>> b = ip_network('192.168.1.128/30') + >>> a.supernet_of(b) + True + + New in version 3.7. + + -- Method: compare_networks (other) + + Compare this network to `other'. In this comparison only the + network addresses are considered; host bits aren’t. Returns + either ‘-1’, ‘0’ or ‘1’. + + >>> 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 + + Deprecated since version 3.7: It uses the same ordering and + comparison algorithm as “<”, “==”, and “>” + + -- Class: ipaddress.IPv6Network (address, strict=True) + + Construct an IPv6 network definition. `address' can be one of the + following: + + 1. A string consisting of an IP address and an optional prefix + length, separated by a slash (‘/’). 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 ‘/128’. + + Note that currently expanded netmasks are not supported. That + means ‘2001:db00::0/24’ is a valid argument while + ‘2001:db00::0/ffff:ff00::’ is not. + + 2. 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 ‘/128’. + + 3. An integer packed into a *note bytes: 1b4. object of length + 16, big-endian. The interpretation is similar to an integer + `address'. + + 4. 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 IPv6Address object; + and the netmask is an integer representing the prefix length. + + An *note AddressValueError: 3472. is raised if `address' is not a + valid IPv6 address. A *note NetmaskValueError: 3498. is raised if + the mask is not valid for an IPv6 address. + + If `strict' is ‘True’ and host bits are set in the supplied + address, then *note ValueError: 1c8. 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. + + -- Attribute: version + + -- Attribute: max_prefixlen + + -- Attribute: is_multicast + + -- Attribute: is_private + + -- Attribute: is_unspecified + + -- Attribute: is_reserved + + -- Attribute: is_loopback + + -- Attribute: is_link_local + + -- Attribute: network_address + + -- Attribute: broadcast_address + + -- Attribute: hostmask + + -- Attribute: netmask + + -- Attribute: with_prefixlen + + -- Attribute: compressed + + -- Attribute: exploded + + -- Attribute: with_netmask + + -- Attribute: with_hostmask + + -- Attribute: num_addresses + + -- Attribute: prefixlen + + -- 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. + + -- Method: overlaps (other) + + -- Method: address_exclude (network) + + -- Method: subnets (prefixlen_diff=1, new_prefix=None) + + -- Method: supernet (prefixlen_diff=1, new_prefix=None) + + -- Method: subnet_of (other) + + -- Method: supernet_of (other) + + -- Method: compare_networks (other) + + Refer to the corresponding attribute documentation in *note + IPv4Network: 7a3. + + -- Attribute: is_site_local + + These attribute is true for the network as a whole if it is + true for both the network address and the broadcast address. + + +File: python.info, Node: Operators<4>, Prev: Network objects, Up: IP Network definitions + +5.21.23.11 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:: + + +File: python.info, Node: Logical operators, Next: Iteration, Up: Operators<4> + +5.21.23.12 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. + + +File: python.info, Node: Iteration, Next: Networks as containers of addresses, Prev: Logical operators, Up: Operators<4> + +5.21.23.13 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 *note hosts(): 34ac. method). +An 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') + + +File: python.info, Node: Networks as containers of addresses, Prev: Iteration, Up: Operators<4> + +5.21.23.14 Networks as containers of addresses +.............................................. + +Network objects can act as containers of addresses. Some examples: + + >>> 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 + + +File: python.info, Node: Interface objects, Next: Other Module Level Functions, Prev: IP Network definitions, Up: ipaddress — IPv4/IPv6 manipulation library + +5.21.23.15 Interface objects +............................ + +Interface objects are *note hashable: 1e8, so they can be used as keys +in dictionaries. + + -- Class: ipaddress.IPv4Interface (address) + + Construct an IPv4 interface. The meaning of `address' is as in the + constructor of *note IPv4Network: 7a3, except that arbitrary host + addresses are always accepted. + + *note IPv4Interface: 11f4. is a subclass of *note IPv4Address: + 346d, so it inherits all the attributes from that class. In + addition, the following attributes are available: + + -- Attribute: ip + + The address (*note IPv4Address: 346d.) without network + information. + + >>> interface = IPv4Interface('192.0.2.5/24') + >>> interface.ip + IPv4Address('192.0.2.5') + + -- Attribute: network + + The network (*note IPv4Network: 7a3.) this interface belongs + to. + + >>> interface = IPv4Interface('192.0.2.5/24') + >>> interface.network + IPv4Network('192.0.2.0/24') + + -- Attribute: with_prefixlen + + A string representation of the interface with the mask in + prefix notation. + + >>> interface = IPv4Interface('192.0.2.5/24') + >>> interface.with_prefixlen + '192.0.2.5/24' + + -- Attribute: with_netmask + + A string representation of the interface with the network as a + net mask. + + >>> interface = IPv4Interface('192.0.2.5/24') + >>> interface.with_netmask + '192.0.2.5/255.255.255.0' + + -- Attribute: with_hostmask + + A string representation of the interface with the network as a + host mask. + + >>> interface = IPv4Interface('192.0.2.5/24') + >>> interface.with_hostmask + '192.0.2.5/0.0.0.255' + + -- Class: ipaddress.IPv6Interface (address) + + Construct an IPv6 interface. The meaning of `address' is as in the + constructor of *note IPv6Network: 7a2, except that arbitrary host + addresses are always accepted. + + *note IPv6Interface: 11f5. is a subclass of *note IPv6Address: 552, + so it inherits all the attributes from that class. In addition, + the following attributes are available: + + -- Attribute: ip + + -- Attribute: network + + -- Attribute: with_prefixlen + + -- Attribute: with_netmask + + -- Attribute: with_hostmask + + Refer to the corresponding attribute documentation in *note + IPv4Interface: 11f4. + +* Menu: + +* Operators: Operators<5>. + + +File: python.info, Node: Operators<5>, Up: Interface objects + +5.21.23.16 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>. + + +File: python.info, Node: Logical operators<2>, Up: Operators<5> + +5.21.23.17 Logical operators +............................ + +Interface objects can be compared with the usual set of logical +operators. + +For equality comparison (‘==’ and ‘!=’), 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 (‘<’, ‘>’, 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. + + +File: python.info, Node: Other Module Level Functions, Next: Custom Exceptions, Prev: Interface objects, Up: ipaddress — IPv4/IPv6 manipulation library + +5.21.23.18 Other Module Level Functions +....................................... + +The module also provides the following module level functions: + + -- 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 *note ValueError: 1c8. is raised if the integer is + negative or too large to be an IPv4 IP address. + + >>> ipaddress.ip_address(3221225985) + IPv4Address('192.0.2.1') + >>> ipaddress.v4_int_to_packed(3221225985) + b'\xc0\x00\x02\x01' + + -- 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 *note ValueError: 1c8. is raised if the integer is + negative or too large to be an IPv6 IP address. + + -- 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 *note IPv4Address: + 346d. or *note IPv6Address: 552. in the range and `last' is the + last *note IPv4Address: 346d. or *note IPv6Address: 552. in the + range. A *note TypeError: 19c. is raised if `first' or `last' are + not IP addresses or are not of the same version. A *note + ValueError: 1c8. is raised if `last' is not greater than `first' or + if `first' address version is not 4 or 6. + + >>> [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')] + + -- Function: ipaddress.collapse_addresses (addresses) + + Return an iterator of the collapsed *note IPv4Network: 7a3. or + *note IPv6Network: 7a2. objects. `addresses' is an iterator of + *note IPv4Network: 7a3. or *note IPv6Network: 7a2. objects. A + *note TypeError: 19c. is raised if `addresses' contains mixed + version objects. + + >>> [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')] + + -- 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: + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn’t make sense. There are some times however, where you may + wish to have *note ipaddress: a0. sort these anyway. If you need + to do this, you can use this function as the `key' argument to + *note sorted(): 833. + + `obj' is either a network or address object. + + +File: python.info, Node: Custom Exceptions, Prev: Other Module Level Functions, Up: ipaddress — IPv4/IPv6 manipulation library + +5.21.23.19 Custom Exceptions +............................ + +To support more specific error reporting from class constructors, the +module defines the following exceptions: + + -- Exception: ipaddress.AddressValueError (ValueError) + + Any value error related to the address. + + -- Exception: ipaddress.NetmaskValueError (ValueError) + + Any value error related to the net mask. + + +File: python.info, Node: Multimedia Services, Next: Internationalization, Prev: Internet Protocols and Support, Up: The Python Standard Library + +5.22 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:: + + +File: python.info, Node: wave — Read and write WAV files, Next: colorsys — Conversions between color systems, Up: Multimedia Services + +5.22.1 ‘wave’ — Read and write WAV files +---------------------------------------- + +`Source code:' Lib/wave.py(1) + +__________________________________________________________________ + +The *note wave: 131. module provides a convenient interface to the WAV +sound format. Only files using ‘WAVE_FORMAT_PCM’ are supported. Note +that this does not include files using ‘WAVE_FORMAT_EXTENSIBLE’ even if +the subformat is PCM. + +The *note wave: 131. module defines the following function and +exception: + + -- 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: + + ‘'rb'’ + + Read only mode. + + ‘'wb'’ + + Write only mode. + + Note that it does not allow read/write WAV files. + + A `mode' of ‘'rb'’ returns a ‘Wave_read’ object, while a `mode' of + ‘'wb'’ returns a ‘Wave_write’ object. If `mode' is omitted and a + file-like object is passed as `file', ‘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 ‘close()’ method is called; it is the caller’s + responsibility to close the file object. + + The *note open(): 59a. function may be used in a *note with: 19e. + statement. When the ‘with’ block completes, the *note + Wave_read.close(): 34e9. or *note Wave_write.close(): 34ea. method + is called. + + Changed in version 3.4: Added support for unseekable files. + + -- Exception: wave.Error + + An error raised when something is impossible because it violates + the WAV specification or hits an implementation deficiency. + +* Menu: + +* Wave_read Objects:: +* Wave_write Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/wave.py + + +File: python.info, Node: Wave_read Objects, Next: Wave_write Objects, Up: wave — Read and write WAV files + +5.22.1.1 Wave_read Objects +.......................... + +Wave_read objects, as returned by *note open(): 59a, have the following +methods: + + -- Method: Wave_read.close () + + Close the stream if it was opened by *note wave: 131, and make the + instance unusable. This is called automatically on object + collection. + + -- Method: Wave_read.getnchannels () + + Returns number of audio channels (‘1’ for mono, ‘2’ for stereo). + + -- Method: Wave_read.getsampwidth () + + Returns sample width in bytes. + + -- Method: Wave_read.getframerate () + + Returns sampling frequency. + + -- Method: Wave_read.getnframes () + + Returns number of audio frames. + + -- Method: Wave_read.getcomptype () + + Returns compression type (‘'NONE'’ is the only supported type). + + -- Method: Wave_read.getcompname () + + Human-readable version of *note getcomptype(): 34f2. Usually ‘'not + compressed'’ parallels ‘'NONE'’. + + -- Method: Wave_read.getparams () + + Returns a *note namedtuple(): 538. ‘(nchannels, sampwidth, + framerate, nframes, comptype, compname)’, equivalent to output of + the ‘get*()’ methods. + + -- Method: Wave_read.readframes (n) + + Reads and returns at most `n' frames of audio, as a *note bytes: + 1b4. object. + + -- Method: Wave_read.rewind () + + Rewind the file pointer to the beginning of the audio stream. + +The following two methods are defined for compatibility with the *note +aifc: 4. module, and don’t do anything interesting. + + -- Method: Wave_read.getmarkers () + + Returns ‘None’. + + -- Method: Wave_read.getmark (id) + + Raise an error. + +The following two methods define a term “position” which is compatible +between them, and is otherwise implementation dependent. + + -- Method: Wave_read.setpos (pos) + + Set the file pointer to the specified position. + + -- Method: Wave_read.tell () + + Return current file pointer position. + + +File: python.info, Node: Wave_write Objects, Prev: Wave_read Objects, Up: wave — Read and write WAV files + +5.22.1.2 Wave_write Objects +........................... + +For seekable output streams, the ‘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 *note setnframes(): 34fc. or *note setparams(): 34fd. +with the number of frames that will be written before *note close(): +34ea. is called and then using *note writeframesraw(): c8e. to write the +frame data, or by calling *note writeframes(): c8f. with all of the +frame data to be written. In the latter case *note writeframes(): c8f. +will calculate the number of frames in the data and set `nframes' +accordingly before writing the frame data. + +Wave_write objects, as returned by *note open(): 59a, have the following +methods: + +Changed in version 3.4: Added support for unseekable files. + + -- Method: Wave_write.close () + + Make sure `nframes' is correct, and close the file if it was opened + by *note wave: 131. 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. + + -- Method: Wave_write.setnchannels (n) + + Set the number of channels. + + -- Method: Wave_write.setsampwidth (n) + + Set the sample width to `n' bytes. + + -- Method: Wave_write.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. + + -- Method: Wave_write.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). + + -- Method: Wave_write.setcomptype (type, name) + + Set the compression type and description. At the moment, only + compression type ‘NONE’ is supported, meaning no compression. + + -- Method: Wave_write.setparams (tuple) + + The `tuple' should be ‘(nchannels, sampwidth, framerate, nframes, + comptype, compname)’, with values valid for the ‘set*()’ methods. + Sets all parameters. + + -- Method: Wave_write.tell () + + Return current position in the file, with the same disclaimer for + the *note Wave_read.tell(): 34fa. and *note Wave_read.setpos(): + 34f9. methods. + + -- Method: Wave_write.writeframesraw (data) + + Write audio frames, without correcting `nframes'. + + Changed in version 3.4: Any *note bytes-like object: 9a2. is now + accepted. + + -- Method: Wave_write.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 *note bytes-like object: 9a2. is now + accepted. + +Note that it is invalid to set any parameters after calling +‘writeframes()’ or ‘writeframesraw()’, and any attempt to do so will +raise *note wave.Error: 34eb. + + +File: python.info, Node: colorsys — Conversions between color systems, Prev: wave — Read and write WAV files, Up: Multimedia Services + +5.22.2 ‘colorsys’ — Conversions between color systems +----------------------------------------------------- + +`Source code:' Lib/colorsys.py(1) + +__________________________________________________________________ + +The *note colorsys: 1e. 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. + +See also +........ + +More information about color spaces can be found at +‘https://poynton.ca/ColorFAQ.html’ and +‘https://www.cambridgeincolour.com/tutorials/color-spaces.htm’. + +The *note colorsys: 1e. module defines the following functions: + + -- Function: colorsys.rgb_to_yiq (r, g, b) + + Convert the color from RGB coordinates to YIQ coordinates. + + -- Function: colorsys.yiq_to_rgb (y, i, q) + + Convert the color from YIQ coordinates to RGB coordinates. + + -- Function: colorsys.rgb_to_hls (r, g, b) + + Convert the color from RGB coordinates to HLS coordinates. + + -- Function: colorsys.hls_to_rgb (h, l, s) + + Convert the color from HLS coordinates to RGB coordinates. + + -- Function: colorsys.rgb_to_hsv (r, g, b) + + Convert the color from RGB coordinates to HSV coordinates. + + -- Function: colorsys.hsv_to_rgb (h, s, v) + + Convert the color from HSV coordinates to RGB coordinates. + +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) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/colorsys.py + + +File: python.info, Node: Internationalization, Next: Program Frameworks, Prev: Multimedia Services, Up: The Python Standard Library + +5.23 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:: + + +File: python.info, Node: gettext — Multilingual internationalization services, Next: locale — Internationalization services, Up: Internationalization + +5.23.1 ‘gettext’ — Multilingual internationalization services +------------------------------------------------------------- + +`Source code:' Lib/gettext.py(1) + +__________________________________________________________________ + +The *note gettext: 83. module provides internationalization (I18N) and +localization (L10N) services for your Python modules and applications. +It supports both the GNU ‘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>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/gettext.py + + +File: python.info, Node: GNU gettext API, Next: Class-based API, Up: gettext — Multilingual internationalization services + +5.23.1.1 GNU ‘gettext’ API +.......................... + +The *note gettext: 83. module defines the following API, which is very +similar to the GNU ‘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. + + -- Function: gettext.bindtextdomain (domain, localedir=None) + + Bind the `domain' to the locale directory `localedir'. More + concretely, *note gettext: 83. will look for binary ‘.mo’ files for + the given domain using the path (on Unix): + ‘`localedir'/`language'/LC_MESSAGES/`domain'.mo’, where `language' + is searched for in the environment variables ‘LANGUAGE’, ‘LC_ALL’, + ‘LC_MESSAGES’, and ‘LANG’ respectively. + + If `localedir' is omitted or ‘None’, then the current binding for + `domain' is returned. (1) + + -- Function: gettext.textdomain (domain=None) + + Change or query the current global domain. If `domain' is ‘None’, + then the current global domain is returned, otherwise the global + domain is set to `domain', which is returned. + + -- 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 ‘_()’ in the local namespace (see examples + below). + + -- Function: gettext.dgettext (domain, message) + + Like *note gettext(): 10cb, but look the message up in the + specified `domain'. + + -- Function: gettext.ngettext (singular, plural, n) + + Like *note gettext(): 10cb, 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(2) for the precise syntax to be used in ‘.po’ + files and the formulas for a variety of languages. + + -- Function: gettext.dngettext (domain, singular, plural, n) + + Like *note ngettext(): 3515, but look the message up in the + specified `domain'. + + -- Function: gettext.pgettext (context, message) + + -- Function: gettext.dpgettext (domain, context, message) + + -- Function: gettext.npgettext (context, singular, plural, n) + + -- Function: gettext.dnpgettext (domain, context, singular, plural, n) + + Similar to the corresponding functions without the ‘p’ in the + prefix (that is, *note gettext(): 83, *note dgettext(): 3514, *note + ngettext(): 3515, *note dngettext(): 3516.), but the translation is + restricted to the given message `context'. + + New in version 3.8. + +Note that GNU ‘gettext’ also defines a ‘dcgettext()’ method, but this +was deemed not useful and so it is currently unimplemented. + +Here’s an example of typical usage for this API: + + import gettext + gettext.bindtextdomain('myapplication', '/path/to/my/language/directory') + gettext.textdomain('myapplication') + _ = gettext.gettext + # ... + print(_('This is a translatable string.')) + + ---------- Footnotes ---------- + + (1) The default locale directory is system dependent; for example, on +RedHat Linux it is ‘/usr/share/locale’, but on Solaris it is +‘/usr/lib/locale’. The *note gettext: 83. module does not try to +support these system dependent defaults; instead its default is +‘`sys.base_prefix'/share/locale’ (see *note sys.base_prefix: 3512.). +For this reason, it is always best to call *note bindtextdomain(): 3511. +with an explicit absolute path at the start of your application. + + (2) https://www.gnu.org/software/gettext/manual/gettext.html + + +File: python.info, Node: Class-based API, Next: Internationalizing your programs and modules, Prev: GNU gettext API, Up: gettext — Multilingual internationalization services + +5.23.1.2 Class-based API +........................ + +The class-based API of the *note gettext: 83. module gives you more +flexibility and greater convenience than the GNU ‘gettext’ API. It is +the recommended way of localizing your Python applications and modules. +‘gettext’ defines a *note GNUTranslations: 351b. class which implements +the parsing of GNU ‘.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 ‘_()’. + + -- Function: gettext.find (domain, localedir=None, languages=None, + all=False) + + This function implements the standard ‘.mo’ file search algorithm. + It takes a `domain', identical to what *note textdomain(): 3513. + takes. Optional `localedir' is as in *note bindtextdomain(): 3511. + 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. (1) If `languages' is not given, then the + following environment variables are searched: ‘LANGUAGE’, ‘LC_ALL’, + ‘LC_MESSAGES’, and ‘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. + + *note find(): 351c. then expands and normalizes the languages, and + then iterates through them, searching for an existing file built of + these components: + + ‘`localedir'/`language'/LC_MESSAGES/`domain'.mo’ + + The first such file name that exists is returned by *note find(): + 351c. If no such file is found, then ‘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. + + -- Function: gettext.translation (domain, localedir=None, + languages=None, class_=None, fallback=False) + + Return a ‘*Translations’ instance based on the `domain', + `localedir', and `languages', which are first passed to *note + find(): 351c. to get a list of the associated ‘.mo’ file paths. + Instances with identical ‘.mo’ file names are cached. The actual + class instantiated is `class_' if provided, otherwise *note + GNUTranslations: 351b. The class’s constructor must take a single + *note file object: e76. argument. If provided, `codeset' will + change the charset used to encode translated strings in the + ‘lgettext()’ and ‘lngettext()’ methods. + + If multiple files are found, later files are used as fallbacks for + earlier ones. To allow setting the fallback, *note copy.copy(): + 7cc. is used to clone each translation object from the cache; the + actual instance data is still shared with the cache. + + If no ‘.mo’ file is found, this function raises *note OSError: 413. + if `fallback' is false (which is the default), and returns a *note + NullTranslations: 351d. instance if `fallback' is true. + + Changed in version 3.3: *note IOError: d02. used to be raised + instead of *note OSError: 413. + + Changed in version 3.11: `codeset' parameter is removed. + + -- Function: gettext.install (domain, localedir=None, *, names=None) + + This installs the function ‘_()’ in Python’s builtins namespace, + based on `domain' and `localedir' which are passed to the function + *note translation(): 6cb. + + For the `names' parameter, please see the description of the + translation object’s *note install(): 351e. 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 ‘_()’ function, like this: + + print(_('This string will be translated.')) + + For convenience, you want the ‘_()’ 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. + +* Menu: + +* The NullTranslations class:: +* The GNUTranslations class:: +* Solaris message catalog support:: +* The Catalog constructor:: + + ---------- Footnotes ---------- + + (1) See the footnote for *note bindtextdomain(): 3511. above. + + +File: python.info, Node: The NullTranslations class, Next: The GNUTranslations class, Up: Class-based API + +5.23.1.3 The ‘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 *note NullTranslations: +351d.; this provides the basic interface you can use to write your own +specialized translation classes. Here are the methods of +‘NullTranslations’: + + -- Class: gettext.NullTranslations (fp=None) + + Takes an optional *note file object: e76. `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 *note add_fallback(): 3520. It + then calls ‘self._parse(fp)’ if `fp' is not ‘None’. + + -- 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. + + -- 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. + + -- Method: gettext (message) + + If a fallback has been set, forward ‘gettext()’ to the + fallback. Otherwise, return `message'. Overridden in derived + classes. + + -- Method: ngettext (singular, plural, n) + + If a fallback has been set, forward ‘ngettext()’ to the + fallback. Otherwise, return `singular' if `n' is 1; return + `plural' otherwise. Overridden in derived classes. + + -- Method: pgettext (context, message) + + If a fallback has been set, forward *note pgettext(): 639. to + the fallback. Otherwise, return the translated message. + Overridden in derived classes. + + New in version 3.8. + + -- Method: npgettext (context, singular, plural, n) + + If a fallback has been set, forward *note npgettext(): 3518. + to the fallback. Otherwise, return the translated message. + Overridden in derived classes. + + New in version 3.8. + + -- Method: info () + + Return the “protected” ‘_info’ variable, a dictionary + containing the metadata found in the message catalog file. + + -- Method: charset () + + Return the encoding of the message catalog file. + + -- Method: install (names=None) + + This method installs *note gettext(): 3522. into the built-in + namespace, binding it to ‘_’. + + 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 ‘_()’. Supported names are + ‘'gettext'’, ‘'ngettext'’, ‘'pgettext'’, ‘'npgettext'’, + ‘'lgettext'’, and ‘'lngettext'’. + + Note that this is only one way, albeit the most convenient + way, to make the ‘_()’ function available to your application. + Because it affects the entire application globally, and + specifically the built-in namespace, localized modules should + never install ‘_()’. Instead, they should use this code to + make ‘_()’ available to their module: + + import gettext + t = gettext.translation('mymodule', ...) + _ = t.gettext + + This puts ‘_()’ only in the module’s global namespace and so + only affects calls within this module. + + Changed in version 3.8: Added ‘'pgettext'’ and ‘'npgettext'’. + + +File: python.info, Node: The GNUTranslations class, Next: Solaris message catalog support, Prev: The NullTranslations class, Up: Class-based API + +5.23.1.4 The ‘GNUTranslations’ class +.................................... + +The *note gettext: 83. module provides one additional class derived from +*note NullTranslations: 351d.: *note GNUTranslations: 351b. This class +overrides ‘_parse()’ to enable reading GNU ‘gettext’ format ‘.mo’ files +in both big-endian and little-endian format. + +*note GNUTranslations: 351b. parses optional metadata out of the +translation catalog. It is convention with GNU ‘gettext’ to include +metadata as the translation for the empty string. This metadata is in +RFC 822(1)-style ‘key: value’ pairs, and should contain the +‘Project-Id-Version’ key. If the key ‘Content-Type’ is found, then the +‘charset’ property is used to initialize the “protected” ‘_charset’ +instance variable, defaulting to ‘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 ‘*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” ‘_info’ instance variable. + +If the ‘.mo’ file’s magic number is invalid, the major version number is +unexpected, or if other problems occur while reading the file, +instantiating a *note GNUTranslations: 351b. class can raise *note +OSError: 413. + + -- Class: gettext.GNUTranslations + + The following methods are overridden from the base class + implementation: + + -- 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 *note gettext(): 3522. method. Otherwise, the + `message' id is returned. + + -- 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 *note + ngettext(): 3523. method. Otherwise, when `n' is 1 `singular' + is returned, and `plural' is returned in all other cases. + + Here is an 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} + + -- 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 *note pgettext(): 639. method. + Otherwise, the `message' id is returned. + + New in version 3.8. + + -- 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 *note npgettext(): 3518. method. Otherwise, when + `n' is 1 `singular' is returned, and `plural' is returned in + all other cases. + + New in version 3.8. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc822.html + + +File: python.info, Node: Solaris message catalog support, Next: The Catalog constructor, Prev: The GNUTranslations class, Up: Class-based API + +5.23.1.5 Solaris message catalog support +........................................ + +The Solaris operating system defines its own binary ‘.mo’ file format, +but since no documentation can be found on this format, it is not +supported at this time. + + +File: python.info, Node: The Catalog constructor, Prev: Solaris message catalog support, Up: Class-based API + +5.23.1.6 The Catalog constructor +................................ + +GNOME uses a version of the *note gettext: 83. module by James +Henstridge, but this version has a slightly different API. Its +documented usage was: + + import gettext + cat = gettext.Catalog(domain, localedir) + _ = cat.gettext + print(_('hello world')) + +For compatibility with this older module, the function ‘Catalog()’ is an +alias for the *note translation(): 6cb. 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. + + +File: python.info, Node: Internationalizing your programs and modules, Next: Acknowledgements<9>, Prev: Class-based API, Up: gettext — Multilingual internationalization services + +5.23.1.7 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: + + 1. prepare your program or module by specially marking translatable + strings + + 2. run a suite of tools over your marked files to generate raw + messages catalogs + + 3. create language-specific translations of the message catalogs + + 4. use the *note gettext: 83. module so that message strings are + properly translated + +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 ‘_('...')’ — that is, a call to the function +‘_()’. For example: + + filename = 'mylog.txt' + message = _('writing a log message') + with open(filename, 'w') as fp: + fp.write(message) + +In this example, the string ‘'writing a log message'’ is marked as a +candidate for translation, while the strings ‘'mylog.txt'’ and ‘'w'’ are +not. + +There are a few tools to extract the strings meant for translation. The +original GNU ‘gettext’ only supported C or C++ source code but its +extended version ‘xgettext’ scans code written in a number of languages, +including Python, to find strings marked as translatable. Babel(1) is a +Python internationalization library that includes a ‘pybabel’ script to +extract and compile message catalogs. François Pinard’s program called +‘xpot’ does a similar job and is available as part of his po-utils +package(2). + +(Python also includes pure-Python versions of these programs, called +‘pygettext.py’ and ‘msgfmt.py’; some Python distributions will install +them for you. ‘pygettext.py’ is similar to ‘xgettext’, but only +understands Python source code and cannot handle other programming +languages such as C or C++. ‘pygettext.py’ supports a command-line +interface similar to ‘xgettext’; for details on its use, run +‘pygettext.py --help’. ‘msgfmt.py’ is binary compatible with GNU +‘msgfmt’. With these two programs, you may not need the GNU ‘gettext’ +package to internationalize your Python applications.) + +‘xgettext’, ‘pygettext’, and similar tools generate ‘.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 ‘.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 +‘<language-name>.po’ file that’s compiled into a machine-readable ‘.mo’ +binary catalog file using the ‘msgfmt’ program. The ‘.mo’ files are +used by the *note gettext: 83. module for the actual translation +processing at run-time. + +How you use the *note gettext: 83. 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:: + + ---------- Footnotes ---------- + + (1) https://babel.pocoo.org/ + + (2) https://github.com/pinard/po-utils + + +File: python.info, Node: Localizing your module, Next: Localizing your application, Up: Internationalizing your programs and modules + +5.23.1.8 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 +‘gettext’ API but instead the class-based API. + +Let’s say your module is called “spam” and the module’s various natural +language translation ‘.mo’ files reside in ‘/usr/share/locale’ in GNU +‘gettext’ format. Here’s what you would put at the top of your module: + + import gettext + t = gettext.translation('spam', '/usr/share/locale') + _ = t.gettext + + +File: python.info, Node: Localizing your application, Next: Changing languages on the fly, Prev: Localizing your module, Up: Internationalizing your programs and modules + +5.23.1.9 Localizing your application +.................................... + +If you are localizing your application, you can install the ‘_()’ +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 ‘_('...')’ 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: + + import gettext + gettext.install('myapplication') + +If you need to set the locale directory, you can pass it into the *note +install(): 6cc. function: + + import gettext + gettext.install('myapplication', '/usr/share/locale') + + +File: python.info, Node: Changing languages on the fly, Next: Deferred translations, Prev: Localizing your application, Up: Internationalizing your programs and modules + +5.23.1.10 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: + + 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() + + +File: python.info, Node: Deferred translations, Prev: Changing languages on the fly, Up: Internationalizing your programs and modules + +5.23.1.11 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: + + animals = ['mollusk', + 'albatross', + 'rat', + 'penguin', + 'python', ] + # ... + for a in animals: + print(a) + +Here, you want to mark the strings in the ‘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: + + def _(message): return message + + animals = [_('mollusk'), + _('albatross'), + _('rat'), + _('penguin'), + _('python'), ] + + del _ + + # ... + for a in animals: + print(_(a)) + +This works because the dummy definition of ‘_()’ simply returns the +string unchanged. And this dummy definition will temporarily override +any definition of ‘_()’ in the built-in namespace (until the *note del: +1694. command). Take care, though if you have a previous definition of +‘_()’ in the local namespace. + +Note that the second use of ‘_()’ will not identify “a” as being +translatable to the ‘gettext’ program, because the parameter is not a +string literal. + +Another way to handle this is with the following example: + + def N_(message): return message + + animals = [N_('mollusk'), + N_('albatross'), + N_('rat'), + N_('penguin'), + N_('python'), ] + + # ... + for a in animals: + print(_(a)) + +In this case, you are marking translatable strings with the function +‘N_()’, which won’t conflict with any definition of ‘_()’. However, you +will need to teach your message extraction program to look for +translatable strings marked with ‘N_()’. ‘xgettext’, ‘pygettext’, +‘pybabel extract’, and ‘xpot’ all support this through the use of the +‘-k’ command-line switch. The choice of ‘N_()’ here is totally +arbitrary; it could have just as easily been +‘MarkThisStringForTranslation()’. + + +File: python.info, Node: Acknowledgements<9>, Prev: Internationalizing your programs and modules, Up: gettext — Multilingual internationalization services + +5.23.1.12 Acknowledgements +.......................... + +The following people contributed code, feedback, design suggestions, +previous implementations, and valuable experience to the creation of +this module: + + * Peter Funk + + * James Henstridge + + * Juan David Ibáñez Palomar + + * Marc-André Lemburg + + * Martin von Löwis + + * François Pinard + + * Barry Warsaw + + * Gustavo Niemeyer + + +File: python.info, Node: locale — Internationalization services, Prev: gettext — Multilingual internationalization services, Up: Internationalization + +5.23.2 ‘locale’ — Internationalization services +----------------------------------------------- + +`Source code:' Lib/locale.py(1) + +__________________________________________________________________ + +The *note locale: a7. 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. + +The *note locale: a7. module is implemented on top of the ‘_locale’ +module, which in turn uses an ANSI C locale implementation if available. + +The *note locale: a7. module defines the following exception and +functions: + + -- Exception: locale.Error + + Exception raised when the locale passed to *note setlocale(): 2de. + is not recognized. + + -- Function: locale.setlocale (category, locale=None) + + If `locale' is given and not ‘None’, *note setlocale(): 2de. + modifies the locale setting for the `category'. The available + categories are listed in the data description below. `locale' may + be a string, or an iterable of two strings (language code and + encoding). If it’s an iterable, it’s converted to a locale name + using the locale aliasing engine. An empty string specifies the + user’s default settings. If the modification of the locale fails, + the exception *note Error: 3537. is raised. If successful, the new + locale setting is returned. + + If `locale' is omitted or ‘None’, the current setting for + `category' is returned. + + *note setlocale(): 2de. is not thread-safe on most systems. + Applications typically start with a call of + + import locale + locale.setlocale(locale.LC_ALL, '') + + This sets the locale for all categories to the user’s default + setting (typically specified in the ‘LANG’ environment variable). + If the locale is not changed thereafter, using multithreading + should not cause problems. + + -- Function: locale.localeconv () + + Returns the database of the local conventions as a dictionary. + This dictionary has the following strings as keys: + + Category Key Meaning + + ---------------------------------------------------------------------------------------------------------- + + *note LC_NUMERIC: 3538. ‘'decimal_point'’ Decimal point character. + + + ‘'grouping'’ Sequence of numbers specifying + which relative positions the + ‘'thousands_sep'’ is expected. If + the sequence is terminated with + *note CHAR_MAX: 3539, no further + grouping is performed. If the + sequence terminates with a ‘0’, + the last group size is repeatedly + used. + + + ‘'thousands_sep'’ Character used between groups. + + + *note LC_MONETARY: 353a. ‘'int_curr_symbol'’ International currency symbol. + + + ‘'currency_symbol'’ Local currency symbol. + + + ‘'p_cs_precedes/n_cs_precedes'’ Whether the currency symbol + precedes the value (for positive + resp. negative values). + + + ‘'p_sep_by_space/n_sep_by_space'’ Whether the currency symbol is + separated from the value by a + space (for positive resp. + negative values). + + + ‘'mon_decimal_point'’ Decimal point used for monetary + values. + + + ‘'frac_digits'’ Number of fractional digits used + in local formatting of monetary + values. + + + ‘'int_frac_digits'’ Number of fractional digits used + in international formatting of + monetary values. + + + ‘'mon_thousands_sep'’ Group separator used for monetary + values. + + + ‘'mon_grouping'’ Equivalent to ‘'grouping'’, used + for monetary values. + + + ‘'positive_sign'’ Symbol used to annotate a positive + monetary value. + + + ‘'negative_sign'’ Symbol used to annotate a negative + monetary value. + + + ‘'p_sign_posn/n_sign_posn'’ The position of the sign (for + positive resp. negative values), + see below. + + + All numeric values can be set to *note CHAR_MAX: 3539. to indicate + that there is no value specified in this locale. + + The possible values for ‘'p_sign_posn'’ and ‘'n_sign_posn'’ are + given below. + + Value Explanation + + ----------------------------------------------------------------- + + ‘0’ Currency and value are surrounded by + parentheses. + + + ‘1’ The sign should precede the value and + currency symbol. + + + ‘2’ The sign should follow the value and + currency symbol. + + + ‘3’ The sign should immediately precede the + value. + + + ‘4’ The sign should immediately follow the + value. + + + ‘CHAR_MAX’ Nothing is specified in this locale. + + + The function sets temporarily the ‘LC_CTYPE’ locale to the + ‘LC_NUMERIC’ locale or the ‘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 sets temporarily the + ‘LC_CTYPE’ locale to the ‘LC_NUMERIC’ locale in some cases. + + -- 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 *note nl_langinfo(): 353b. function accepts one of the + following keys. Most descriptions are taken from the corresponding + description in the GNU C library. + + -- Data: locale.CODESET + + Get a string with the name of the character encoding used in + the selected locale. + + -- Data: locale.D_T_FMT + + Get a string that can be used as a format string for *note + time.strftime(): e99. to represent date and time in a + locale-specific way. + + -- Data: locale.D_FMT + + Get a string that can be used as a format string for *note + time.strftime(): e99. to represent a date in a locale-specific + way. + + -- Data: locale.T_FMT + + Get a string that can be used as a format string for *note + time.strftime(): e99. to represent a time in a locale-specific + way. + + -- Data: locale.T_FMT_AMPM + + Get a format string for *note time.strftime(): e99. to + represent time in the am/pm format. + + -- Data: DAY_1 ... DAY_7 + + Get the name of the n-th day of the week. + + Note: This follows the US convention of ‘DAY_1’ being + Sunday, not the international convention (ISO 8601) that + Monday is the first day of the week. + + -- Data: ABDAY_1 ... ABDAY_7 + + Get the abbreviated name of the n-th day of the week. + + -- Data: MON_1 ... MON_12 + + Get the name of the n-th month. + + -- Data: ABMON_1 ... ABMON_12 + + Get the abbreviated name of the n-th month. + + -- Data: locale.RADIXCHAR + + Get the radix character (decimal dot, decimal comma, etc.). + + -- Data: locale.THOUSEP + + Get the separator character for thousands (groups of three + digits). + + -- 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. + + Note: The expression is in the syntax suitable for the + ‘regex()’ function from the C library, which might differ + from the syntax used in *note re: da. + + -- Data: locale.NOEXPR + + Get a regular expression that can be used with the regex(3) + function to recognize a negative response to a yes/no + question. + + -- 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. + + -- Data: locale.ERA + + Get a string that represents the era used in the current + 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 ‘E’ modifier in their format strings + causes the *note time.strftime(): e99. function to use this + information. The format of the returned string is not + specified, and therefore you should not assume knowledge of it + on different systems. + + -- Data: locale.ERA_D_T_FMT + + Get a format string for *note time.strftime(): e99. to + represent date and time in a locale-specific era-based way. + + -- Data: locale.ERA_D_FMT + + Get a format string for *note time.strftime(): e99. to + represent a date in a locale-specific era-based way. + + -- Data: locale.ERA_T_FMT + + Get a format string for *note time.strftime(): e99. to + represent a time in a locale-specific era-based way. + + -- Data: locale.ALT_DIGITS + + Get a representation of up to 100 values used to represent the + values 0 to 99. + + -- Function: locale.getdefaultlocale ([envvars]) + + Tries to determine the default locale settings and returns them as + a tuple of the form ‘(language code, encoding)’. + + According to POSIX, a program which has not called + ‘setlocale(LC_ALL, '')’ runs using the portable ‘'C'’ locale. + Calling ‘setlocale(LC_ALL, '')’ lets it use the default locale as + defined by the ‘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 ‘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 ‘'LANG'’. The GNU gettext search path + contains ‘'LC_ALL'’, ‘'LC_CTYPE'’, ‘'LANG'’ and ‘'LANGUAGE'’, in + that order. + + Except for the code ‘'C'’, the language code corresponds to RFC + 1766(2). `language code' and `encoding' may be ‘None’ if their + values cannot be determined. + + Deprecated since version 3.11, will be removed in version 3.13. + + -- Function: locale.getlocale (category=LC_CTYPE) + + Returns the current setting for the given locale category as + sequence containing `language code', `encoding'. `category' may be + one of the ‘LC_*’ values except *note LC_ALL: 354b. It defaults to + *note LC_CTYPE: 354c. + + Except for the code ‘'C'’, the language code corresponds to RFC + 1766(3). `language code' and `encoding' may be ‘None’ if their + values cannot be determined. + + -- Function: locale.getpreferredencoding (do_setlocale=True) + + Return the *note locale encoding: 24df. 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 *note setlocale(): 2de. + 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 ‘False’. + + On Android or if the *note Python UTF-8 Mode: 229. is enabled, + always return ‘'utf-8'’, the *note locale encoding: 24df. and the + `do_setlocale' argument are ignored. + + The *note Python preinitialization: 354d. configures the LC_CTYPE + locale. See also the *note filesystem encoding and error handler: + 1793. + + Changed in version 3.7: The function now always returns ‘"utf-8"’ + on Android or if the *note Python UTF-8 Mode: 229. is enabled. + + -- Function: locale.getencoding () + + Get the current *note locale encoding: 24df.: + + * On Android and VxWorks, return ‘"utf-8"’. + + * On Unix, return the encoding of the current *note LC_CTYPE: + 354c. locale. Return ‘"utf-8"’ if ‘nl_langinfo(CODESET)’ + returns an empty string: for example, if the current LC_CTYPE + locale is not supported. + + * On Windows, return the ANSI code page. + + The *note Python preinitialization: 354d. configures the LC_CTYPE + locale. See also the *note filesystem encoding and error handler: + 1793. + + This function is similar to *note getpreferredencoding(False): 2df. + except this function ignores the *note Python UTF-8 Mode: 229. + + New in version 3.11. + + -- Function: locale.normalize (localename) + + Returns a normalized locale code for the given locale name. The + returned locale code is formatted for use with *note setlocale(): + 2de. 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 *note setlocale(): + 2de. + + -- Function: locale.resetlocale (category=LC_ALL) + + Sets the locale for `category' to the default setting. + + The default setting is determined by calling *note + getdefaultlocale(): 2dd. `category' defaults to *note LC_ALL: + 354b. + + Deprecated since version 3.11, will be removed in version 3.13. + + -- Function: locale.strcoll (string1, string2) + + Compares two strings according to the current *note LC_COLLATE: + 3550. setting. As any other compare function, returns a negative, + or a positive value, or ‘0’, depending on whether `string1' + collates before or after `string2' or is equal to it. + + -- Function: locale.strxfrm (string) + + Transforms a string to one that can be used in locale-aware + comparisons. For example, ‘strxfrm(s1) < strxfrm(s2)’ is + equivalent to ‘strcoll(s1, s2) < 0’. This function can be used + when the same string is compared repeatedly, e.g. when collating a + sequence of strings. + + -- Function: locale.format_string (format, val, grouping=False, + monetary=False) + + Formats a number `val' according to the current *note LC_NUMERIC: + 3538. setting. The format follows the conventions of the ‘%’ + operator. For floating point values, the decimal point is modified + if appropriate. If `grouping' is 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 ‘format % val’, but takes the + current locale settings into account. + + Changed in version 3.7: The `monetary' keyword parameter was added. + + -- Function: locale.format (format, val, grouping=False, + monetary=False) + + Please note that this function works like *note format_string(): + 7a7. but will only work for exactly one ‘%char’ specifier. For + example, ‘'%f'’ and ‘'%.0f'’ are both valid specifiers, but ‘'%f + KiB'’ is not. + + For whole format strings, use *note format_string(): 7a7. + + Deprecated since version 3.7: Use *note format_string(): 7a7. + instead. + + -- Function: locale.currency (val, symbol=True, grouping=False, + international=False) + + Formats a number `val' according to the current *note LC_MONETARY: + 353a. settings. + + The returned string includes the currency symbol if `symbol' is + true, which is the default. If `grouping' is true (which is not + the default), grouping is done with the value. If `international' + is true (which is not the default), the international currency + symbol is used. + + Note that this function will not work with the ‘C’ locale, so you + have to set a locale via *note setlocale(): 2de. first. + + -- Function: locale.str (float) + + Formats a floating point number using the same format as the + built-in function ‘str(float)’, but takes the decimal point into + account. + + -- Function: locale.delocalize (string) + + Converts a string into a normalized number string, following the + *note LC_NUMERIC: 3538. settings. + + New in version 3.5. + + -- Function: locale.localize (string, grouping=False, monetary=False) + + Converts a normalized number string into a formatted string + following the *note LC_NUMERIC: 3538. settings. + + New in version 3.10. + + -- Function: locale.atof (string, func=float) + + Converts a string to a number, following the *note LC_NUMERIC: + 3538. settings, by calling `func' on the result of calling *note + delocalize(): aa9. on `string'. + + -- Function: locale.atoi (string) + + Converts a string to an integer, following the *note LC_NUMERIC: + 3538. conventions. + + -- Data: locale.LC_CTYPE + + Locale category for the character type functions. Depending on the + settings of this category, the functions of module *note string: + f3. dealing with case change their behaviour. + + -- Data: locale.LC_COLLATE + + Locale category for sorting strings. The functions *note + strcoll(): 354f. and *note strxfrm(): 3551. of the *note locale: + a7. module are affected. + + -- Data: locale.LC_TIME + + Locale category for the formatting of time. The function *note + time.strftime(): e99. follows these conventions. + + -- Data: locale.LC_MONETARY + + Locale category for formatting of monetary values. The available + options are available from the *note localeconv(): 868. function. + + -- 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 *note + os.strerror(): 24fd. might be affected by this category. + + -- Data: locale.LC_NUMERIC + + Locale category for formatting numbers. The functions *note + format(): 850, *note atoi(): 3556, *note atof(): 3555. and *note + str(): 3553. of the *note locale: a7. module are affected by that + category. All other numeric formatting operations are not + affected. + + -- 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. + + -- Data: locale.CHAR_MAX + + This is a symbolic constant used for different values returned by + *note localeconv(): 868. + +Example: + + >>> import locale + >>> loc = locale.getlocale() # get current locale + # use German locale; name might vary with platform + >>> locale.setlocale(locale.LC_ALL, 'de_DE') + >>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut + >>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale + >>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale + >>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale + +* Menu: + +* Background, details, hints, tips and caveats: Background details hints tips and caveats. +* For extension writers and programs that embed Python:: +* Access to message catalogs:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/locale.py + + (2) https://datatracker.ietf.org/doc/html/rfc1766.html + + (3) https://datatracker.ietf.org/doc/html/rfc1766.html + + +File: python.info, Node: Background details hints tips and caveats, Next: For extension writers and programs that embed Python, Up: locale — Internationalization services + +5.23.2.1 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 ‘C’ locale, no +matter what the user’s preferred locale is. There is one exception: the +*note LC_CTYPE: 354c. 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 ‘setlocale(LC_ALL, '')’. + +It is generally a bad idea to call *note setlocale(): 2de. 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 *note time.strftime(): e99.), 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-‘C’ locale settings. + +The only way to perform numeric operations according to the locale is to +use the special functions defined by this module: *note atof(): 3555, +*note atoi(): 3556, *note format(): 850, *note str(): 3553. + +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. + + +File: python.info, Node: For extension writers and programs that embed Python, Next: Access to message catalogs, Prev: Background details hints tips and caveats, Up: locale — Internationalization services + +5.23.2.2 For extension writers and programs that embed Python +............................................................. + +Extension modules should never call *note setlocale(): 2de, 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 ‘C’). + +When Python code uses the *note locale: a7. 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 ‘_locale’ +extension module (which does all the work) from the table of built-in +modules in the ‘config.c’ file, and make sure that the ‘_locale’ module +is not accessible as a shared library. + + +File: python.info, Node: Access to message catalogs, Prev: For extension writers and programs that embed Python, Up: locale — Internationalization services + +5.23.2.3 Access to message catalogs +................................... + + -- Function: locale.gettext (msg) + + -- Function: locale.dgettext (domain, msg) + + -- Function: locale.dcgettext (domain, msg, category) + + -- Function: locale.textdomain (domain) + + -- Function: locale.bindtextdomain (domain, dir) + +The locale module exposes the C library’s gettext interface on systems +that provide this interface. It consists of the functions ‘gettext()’, +‘dgettext()’, ‘dcgettext()’, ‘textdomain()’, ‘bindtextdomain()’, and +‘bind_textdomain_codeset()’. These are similar to the same functions in +the *note gettext: 83. 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 *note gettext: 83. instead. A known exception +to this rule are applications that link with additional C libraries +which internally invoke ‘gettext()’ or ‘dcgettext()’. For these +applications, it may be necessary to bind the text domain, so that the +libraries can properly locate their message catalogs. + + +File: python.info, Node: Program Frameworks, Next: Graphical User Interfaces with Tk, Prev: Internationalization, Up: The Python Standard Library + +5.24 Program Frameworks +======================= + +The modules described in this chapter are frameworks that will largely +dictate the structure of your program. Currently the modules described +here are all oriented toward writing command-line interfaces. + +The full list of modules described in this chapter is: + +* Menu: + +* turtle — Turtle graphics:: +* cmd — Support for line-oriented command interpreters:: +* shlex — Simple lexical analysis:: + + +File: python.info, Node: turtle — Turtle graphics, Next: cmd — Support for line-oriented command interpreters, Up: Program Frameworks + +5.24.1 ‘turtle’ — Turtle graphics +--------------------------------- + +`Source code:' Lib/turtle.py(1) + +__________________________________________________________________ + +* Menu: + +* Introduction: Introduction<9>. +* Overview of available Turtle and Screen methods:: +* Methods of RawTurtle/Turtle and corresponding functions:: +* Methods of TurtleScreen/Screen and corresponding functions:: +* Public classes:: +* 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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/turtle.py + + +File: python.info, Node: Introduction<9>, Next: Overview of available Turtle and Screen methods, Up: turtle — Turtle graphics + +5.24.1.1 Introduction +..................... + +Turtle graphics is a popular way for introducing programming to kids. +It was part of the original Logo programming language developed by Wally +Feurzeig, Seymour Papert and Cynthia Solomon in 1967. + +Imagine a robotic turtle starting at (0, 0) in the x-y plane. After an +‘import turtle’, give it the command ‘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 ‘turtle.right(25)’, and it rotates +in-place 25 degrees clockwise. + +Turtle star +........... + +Turtle can draw intricate shapes using programs that repeat simple +moves. + +�[image src="python-figures/turtle-star.png"�] + + + from turtle import * + color('red', 'yellow') + begin_fill() + while True: + forward(200) + left(170) + if abs(pos()) < 1: + break + end_fill() + done() + +By combining together these and similar commands, intricate shapes and +pictures can easily be drawn. + +The *note turtle: 120. module is an extended reimplementation of the +same-named module from the Python standard distribution up to version +Python 2.5. + +It tries to keep the merits of the old turtle module and to be (nearly) +100% compatible with it. This means in the first place to enable the +learning programmer to use all the commands, classes and methods +interactively when using the module from within IDLE run with the ‘-n’ +switch. + +The turtle module provides turtle graphics primitives, in both +object-oriented and procedure-oriented ways. Because it uses *note +tkinter: 10e. for the underlying graphics, it needs a version of Python +installed with Tk support. + +The object-oriented interface uses essentially two+two classes: + + 1. The *note TurtleScreen: 3569. class defines graphics windows as a + playground for the drawing turtles. Its constructor needs a + ‘tkinter.Canvas’ or a *note ScrolledCanvas: 356a. as argument. It + should be used when *note turtle: 120. is used as part of some + application. + + The function *note Screen(): 356b. returns a singleton object of a + *note TurtleScreen: 3569. subclass. This function should be used + when *note turtle: 120. is used as a standalone tool for doing + graphics. As a singleton object, inheriting from its class is not + possible. + + All methods of TurtleScreen/Screen also exist as functions, i.e. + as part of the procedure-oriented interface. + + 2. *note RawTurtle: 356c. (alias: *note RawPen: 356d.) defines Turtle + objects which draw on a *note TurtleScreen: 3569. Its constructor + needs a Canvas, ScrolledCanvas or TurtleScreen as argument, so the + RawTurtle objects know where to draw. + + Derived from RawTurtle is the subclass *note Turtle: 356e. (alias: + ‘Pen’), which draws on “the” *note Screen: 356b. instance which is + automatically created, if not already present. + + All methods of RawTurtle/Turtle also exist as functions, i.e. part + of the procedure-oriented interface. + +The procedural interface provides functions which are derived from the +methods of the classes *note Screen: 356b. and *note Turtle: 356e. They +have the same names as the corresponding methods. A screen object is +automatically created whenever a function derived from a Screen method +is called. An (unnamed) turtle object is automatically created whenever +any of the functions derived from a Turtle method is called. + +To use multiple turtles on a screen one has to use the object-oriented +interface. + + 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. + + +File: python.info, Node: Overview of available Turtle and Screen methods, Next: Methods of RawTurtle/Turtle and corresponding functions, Prev: Introduction<9>, Up: turtle — Turtle graphics + +5.24.1.2 Overview of available Turtle and Screen methods +........................................................ + +* Menu: + +* Turtle methods:: +* Methods of TurtleScreen/Screen:: + + +File: python.info, Node: Turtle methods, Next: Methods of TurtleScreen/Screen, Up: Overview of available Turtle and Screen methods + +5.24.1.3 Turtle methods +....................... + +Turtle motion + + Move and draw + + *note forward(): 3571. | *note fd(): 3572. + *note backward(): 3573. | *note bk(): 3574. | *note back(): 3575. + *note right(): 3576. | *note rt(): 3577. + *note left(): 3578. | *note lt(): 3579. + *note goto(): 357a. | *note setpos(): 357b. | *note setposition(): 357c. + *note setx(): 357d. + *note sety(): 357e. + *note setheading(): 357f. | *note seth(): 3580. + *note home(): 3581. + *note circle(): 3582. + *note dot(): 3583. + *note stamp(): 3584. + *note clearstamp(): 3585. + *note clearstamps(): 3586. + *note undo(): 3587. + *note speed(): 3588. + + Tell Turtle’s state + + *note position(): 3589. | *note pos(): 358a. + *note towards(): 358b. + *note xcor(): 358c. + *note ycor(): 358d. + *note heading(): 358e. + *note distance(): 358f. + + Setting and measurement + + *note degrees(): 3590. + *note radians(): 3591. + +Pen control + + Drawing state + + *note pendown(): 3592. | *note pd(): 3593. | *note down(): 3594. + *note penup(): 3595. | *note pu(): 3596. | *note up(): 3597. + *note pensize(): 3598. | *note width(): 3599. + *note pen(): 359a. + *note isdown(): 359b. + + Color control + + *note color(): 359c. + *note pencolor(): 359d. + *note fillcolor(): 359e. + + Filling + + *note filling(): 359f. + *note begin_fill(): 35a0. + *note end_fill(): 35a1. + + More drawing control + + *note reset(): 35a2. + *note clear(): 35a3. + *note write(): 35a4. + +Turtle state + + Visibility + + *note showturtle(): 35a5. | *note st(): 35a6. + *note hideturtle(): 35a7. | *note ht(): 35a8. + *note isvisible(): 35a9. + + Appearance + + *note shape(): 35aa. + *note resizemode(): 35ab. + *note shapesize(): 35ac. | *note turtlesize(): 35ad. + *note shearfactor(): 35ae. + *note settiltangle(): 35af. + *note tiltangle(): 35b0. + *note tilt(): 35b1. + *note shapetransform(): 35b2. + *note get_shapepoly(): 35b3. + +Using events + + *note onclick(): 35b4. + *note onrelease(): 35b5. + *note ondrag(): 35b6. + +Special Turtle methods + + *note begin_poly(): 35b7. + *note end_poly(): 35b8. + *note get_poly(): 35b9. + *note clone(): 35ba. + *note getturtle(): 35bb. | *note getpen(): 35bc. + *note getscreen(): 35bd. + *note setundobuffer(): 35be. + *note undobufferentries(): 35bf. + + +File: python.info, Node: Methods of TurtleScreen/Screen, Prev: Turtle methods, Up: Overview of available Turtle and Screen methods + +5.24.1.4 Methods of TurtleScreen/Screen +....................................... + +Window control + + *note bgcolor(): 35c1. + *note bgpic(): 35c2. + *note clearscreen(): 35c3. + *note resetscreen(): 35c4. + *note screensize(): 35c5. + *note setworldcoordinates(): 35c6. + +Animation control + + *note delay(): 35c7. + *note tracer(): 35c8. + *note update(): 35c9. + +Using screen events + + *note listen(): 35ca. + *note onkey(): 35cb. | *note onkeyrelease(): 35cc. + *note onkeypress(): 35cd. + *note onclick(): 35b4. | *note onscreenclick(): 35ce. + *note ontimer(): 35cf. + *note mainloop(): 35d0. | *note done(): 35d1. + +Settings and special methods + + *note mode(): 35d2. + *note colormode(): 35d3. + *note getcanvas(): 35d4. + *note getshapes(): 35d5. + *note register_shape(): 35d6. | *note addshape(): 35d7. + *note turtles(): 35d8. + *note window_height(): 35d9. + *note window_width(): 35da. + +Input methods + + *note textinput(): 12c8. + *note numinput(): 12c9. + +Methods specific to Screen + + *note bye(): 35db. + *note exitonclick(): 35dc. + *note setup(): 35dd. + *note title(): 35de. + + +File: python.info, Node: Methods of RawTurtle/Turtle and corresponding functions, Next: Methods of TurtleScreen/Screen and corresponding functions, Prev: Overview of available Turtle and Screen methods, Up: turtle — Turtle graphics + +5.24.1.5 Methods of RawTurtle/Turtle and corresponding functions +................................................................ + +Most of the examples in this section refer to a Turtle instance called +‘turtle’. + +* Menu: + +* Turtle motion:: +* Tell Turtle’s state:: +* Settings for measurement:: +* Pen control:: +* Turtle state:: +* Using events:: +* Special Turtle methods:: +* Compound shapes:: + + +File: python.info, Node: Turtle motion, Next: Tell Turtle’s state, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.6 Turtle motion +...................... + + -- Function: turtle.forward (distance) + -- Function: turtle.fd (distance) + + + Parameters: ‘distance’ – a number (integer or float) + + Move the turtle forward by the specified `distance', in the + direction the turtle is headed. + + >>> turtle.position() + (0.00,0.00) + >>> turtle.forward(25) + >>> turtle.position() + (25.00,0.00) + >>> turtle.forward(-75) + >>> turtle.position() + (-50.00,0.00) + + -- Function: turtle.back (distance) + -- Function: turtle.bk (distance) + -- Function: turtle.backward (distance) + + + Parameters: ‘distance’ – a number + + Move the turtle backward by `distance', opposite to the direction + the turtle is headed. Do not change the turtle’s heading. + + >>> turtle.position() + (0.00,0.00) + >>> turtle.backward(30) + >>> turtle.position() + (-30.00,0.00) + + -- Function: turtle.right (angle) + -- Function: turtle.rt (angle) + + + Parameters: ‘angle’ – a number (integer or float) + + Turn turtle right by `angle' units. (Units are by default degrees, + but can be set via the *note degrees(): 3590. and *note radians(): + 3591. functions.) Angle orientation depends on the turtle mode, + see *note mode(): 35d2. + + >>> turtle.heading() + 22.0 + >>> turtle.right(45) + >>> turtle.heading() + 337.0 + + -- Function: turtle.left (angle) + -- Function: turtle.lt (angle) + + + Parameters: ‘angle’ – a number (integer or float) + + Turn turtle left by `angle' units. (Units are by default degrees, + but can be set via the *note degrees(): 3590. and *note radians(): + 3591. functions.) Angle orientation depends on the turtle mode, + see *note mode(): 35d2. + + >>> turtle.heading() + 22.0 + >>> turtle.left(45) + >>> turtle.heading() + 67.0 + + -- Function: turtle.goto (x, y=None) + -- Function: turtle.setpos (x, y=None) + -- Function: turtle.setposition (x, y=None) + + + Parameters: + + * ‘x’ – a number or a pair/vector of numbers + + * ‘y’ – a number or ‘None’ + + If `y' is ‘None’, `x' must be a pair of coordinates or a *note + Vec2D: 35e1. (e.g. as returned by *note pos(): 358a.). + + Move turtle to an absolute position. If the pen is down, draw + line. Do not change the turtle’s orientation. + + >>> 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) + + -- Function: turtle.setx (x) + + + Parameters: ‘x’ – a number (integer or float) + + Set the turtle’s first coordinate to `x', leave second coordinate + unchanged. + + >>> turtle.position() + (0.00,240.00) + >>> turtle.setx(10) + >>> turtle.position() + (10.00,240.00) + + -- Function: turtle.sety (y) + + + Parameters: ‘y’ – a number (integer or float) + + Set the turtle’s second coordinate to `y', leave first coordinate + unchanged. + + >>> turtle.position() + (0.00,40.00) + >>> turtle.sety(-10) + >>> turtle.position() + (0.00,-10.00) + + -- Function: turtle.setheading (to_angle) + -- Function: turtle.seth (to_angle) + + + Parameters: ‘to_angle’ – a number (integer or float) + + Set the orientation of the turtle to `to_angle'. Here are some + common directions in degrees: + + standard mode logo mode + + ------------------------------------------------- + + 0 - east 0 - north + + + 90 - north 90 - east + + + 180 - west 180 - south + + + 270 - south 270 - west + + + >>> turtle.setheading(90) + >>> turtle.heading() + 90.0 + + -- 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 *note + mode(): 35d2.). + + >>> turtle.heading() + 90.0 + >>> turtle.position() + (0.00,-10.00) + >>> turtle.home() + >>> turtle.position() + (0.00,0.00) + >>> turtle.heading() + 0.0 + + -- Function: turtle.circle (radius, extent=None, steps=None) + + + Parameters: + + * ‘radius’ – a number + + * ‘extent’ – a number (or ‘None’) + + * ‘steps’ – an integer (or ‘None’) + + 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. + + >>> 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 + + -- Function: turtle.dot (size=None, *color) + + + Parameters: + + * ‘size’ – an integer >= 1 (if given) + + * ‘color’ – a colorstring or a numeric color tuple + + Draw a circular dot with diameter `size', using `color'. If `size' + is not given, the maximum of pensize+4 and 2*pensize is used. + + >>> turtle.home() + >>> turtle.dot() + >>> turtle.fd(50); turtle.dot(20, "blue"); turtle.fd(50) + >>> turtle.position() + (100.00,-0.00) + >>> turtle.heading() + 0.0 + + -- 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 ‘clearstamp(stamp_id)’. + + >>> turtle.color("blue") + >>> turtle.stamp() + 11 + >>> turtle.fd(50) + + -- Function: turtle.clearstamp (stampid) + + + Parameters: ‘stampid’ – an integer, must be return value of + previous *note stamp(): 3584. call + + Delete stamp with given `stampid'. + + >>> 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) + + -- Function: turtle.clearstamps (n=None) + + + Parameters: ‘n’ – an integer (or ‘None’) + + Delete all or first/last `n' of turtle’s stamps. If `n' is ‘None’, + delete all stamps, if `n' > 0 delete first `n' stamps, else if `n' + < 0 delete last `n' stamps. + + >>> for i in range(8): + ... turtle.stamp(); turtle.fd(30) + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + >>> turtle.clearstamps(2) + >>> turtle.clearstamps(-2) + >>> turtle.clearstamps() + + -- Function: turtle.undo () + + Undo (repeatedly) the last turtle action(s). Number of available + undo actions is determined by the size of the undobuffer. + + >>> for i in range(4): + ... turtle.fd(50); turtle.lt(80) + ... + >>> for i in range(8): + ... turtle.undo() + + -- Function: turtle.speed (speed=None) + + + Parameters: ‘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: + + * “fastest”: 0 + + * “fast”: 10 + + * “normal”: 6 + + * “slow”: 3 + + * “slowest”: 1 + + 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. + + >>> turtle.speed() + 3 + >>> turtle.speed('normal') + >>> turtle.speed() + 6 + >>> turtle.speed(9) + >>> turtle.speed() + 9 + + +File: python.info, Node: Tell Turtle’s state, Next: Settings for measurement, Prev: Turtle motion, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.7 Tell Turtle’s state +............................ + + -- Function: turtle.position () + -- Function: turtle.pos () + + Return the turtle’s current location (x,y) (as a *note Vec2D: 35e1. + vector). + + >>> turtle.pos() + (440.00,-0.00) + + -- Function: turtle.towards (x, y=None) + + + Parameters: + + * ‘x’ – a number or a pair/vector of numbers or a turtle + instance + + * ‘y’ – a number if `x' is a number, else ‘None’ + + 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”. + + >>> turtle.goto(10, 10) + >>> turtle.towards(0,0) + 225.0 + + -- Function: turtle.xcor () + + Return the turtle’s x coordinate. + + >>> turtle.home() + >>> turtle.left(50) + >>> turtle.forward(100) + >>> turtle.pos() + (64.28,76.60) + >>> print(round(turtle.xcor(), 5)) + 64.27876 + + -- Function: turtle.ycor () + + Return the turtle’s y coordinate. + + >>> turtle.home() + >>> turtle.left(60) + >>> turtle.forward(100) + >>> print(turtle.pos()) + (50.00,86.60) + >>> print(round(turtle.ycor(), 5)) + 86.60254 + + -- Function: turtle.heading () + + Return the turtle’s current heading (value depends on the turtle + mode, see *note mode(): 35d2.). + + >>> turtle.home() + >>> turtle.left(67) + >>> turtle.heading() + 67.0 + + -- Function: turtle.distance (x, y=None) + + + Parameters: + + * ‘x’ – a number or a pair/vector of numbers or a turtle + instance + + * ‘y’ – a number if `x' is a number, else ‘None’ + + Return the distance from the turtle to (x,y), the given vector, or + the given other turtle, in turtle step units. + + >>> turtle.home() + >>> turtle.distance(30,40) + 50.0 + >>> turtle.distance((30,40)) + 50.0 + >>> joe = Turtle() + >>> joe.forward(77) + >>> turtle.distance(joe) + 77.0 + + +File: python.info, Node: Settings for measurement, Next: Pen control, Prev: Tell Turtle’s state, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.8 Settings for measurement +................................. + + -- Function: turtle.degrees (fullcircle=360.0) + + + Parameters: ‘fullcircle’ – a number + + Set angle measurement units, i.e. set number of “degrees” for a + full circle. Default value is 360 degrees. + + >>> 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 + + -- Function: turtle.radians () + + Set the angle measurement units to radians. Equivalent to + ‘degrees(2*math.pi)’. + + >>> turtle.home() + >>> turtle.left(90) + >>> turtle.heading() + 90.0 + >>> turtle.radians() + >>> turtle.heading() + 1.5707963267948966 + + +File: python.info, Node: Pen control, Next: Turtle state, Prev: Settings for measurement, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.9 Pen control +.................... + +* Menu: + +* Drawing state:: +* Color control:: +* Filling:: +* More drawing control:: + + +File: python.info, Node: Drawing state, Next: Color control, Up: Pen control + +5.24.1.10 Drawing state +....................... + + -- Function: turtle.pendown () + -- Function: turtle.pd () + -- Function: turtle.down () + + Pull the pen down – drawing when moving. + + -- Function: turtle.penup () + -- Function: turtle.pu () + -- Function: turtle.up () + + Pull the pen up – no drawing when moving. + + -- Function: turtle.pensize (width=None) + -- Function: turtle.width (width=None) + + + Parameters: ‘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. + + >>> turtle.pensize() + 1 + >>> turtle.pensize(10) # from here on lines of width 10 are drawn + + -- Function: turtle.pen (pen=None, **pendict) + + + Parameters: + + * ‘pen’ – a dictionary with some or all of the below listed keys + + * ‘pendict’ – one or more keyword-arguments with the below + listed keys as keywords + + Return or set the pen’s attributes in a “pen-dictionary” with the + following key/value pairs: + + * “shown”: True/False + + * “pendown”: True/False + + * “pencolor”: color-string or color-tuple + + * “fillcolor”: color-string or color-tuple + + * “pensize”: positive number + + * “speed”: number in range 0..10 + + * “resizemode”: “auto” or “user” or “noresize” + + * “stretchfactor”: (positive number, positive number) + + * “outline”: positive number + + * “tilt”: number + + This dictionary can be used as argument for a subsequent call to + *note pen(): 359a. 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. + + >>> 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', ''), ('outline', 1), ('pencolor', 'yellow')] + >>> turtle.pen(penstate, fillcolor="green") + >>> sorted(turtle.pen().items())[:3] + [('fillcolor', 'green'), ('outline', 1), ('pencolor', 'red')] + + -- Function: turtle.isdown () + + Return ‘True’ if pen is down, ‘False’ if it’s up. + + >>> turtle.penup() + >>> turtle.isdown() + False + >>> turtle.pendown() + >>> turtle.isdown() + True + + +File: python.info, Node: Color control, Next: Filling, Prev: Drawing state, Up: Pen control + +5.24.1.11 Color control +....................... + + -- Function: turtle.pencolor (*args) + + Return or set the pencolor. + + Four input formats are allowed: + + ‘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 call. + + ‘pencolor(colorstring)’ + + Set pencolor to `colorstring', which is a Tk color + specification string, such as ‘"red"’, ‘"yellow"’, or + ‘"#33cc8c"’. + + ‘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 *note + colormode(): 35d3.). + + ‘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. + + If turtleshape is a polygon, the outline of that polygon is drawn + with the newly set pencolor. + + >>> 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) + + -- Function: turtle.fillcolor (*args) + + Return or set the fillcolor. + + Four input formats are allowed: + + ‘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 call. + + ‘fillcolor(colorstring)’ + + Set fillcolor to `colorstring', which is a Tk color + specification string, such as ‘"red"’, ‘"yellow"’, or + ‘"#33cc8c"’. + + ‘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 + *note colormode(): 35d3.). + + ‘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. + + If turtleshape is a polygon, the interior of that polygon is drawn + with the newly set fillcolor. + + >>> 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) + + -- Function: turtle.color (*args) + + Return or set pencolor and fillcolor. + + Several input formats are allowed. They use 0 to 3 arguments as + follows: + + ‘color()’ + + Return the current pencolor and the current fillcolor as a + pair of color specification strings or tuples as returned by + *note pencolor(): 359d. and *note fillcolor(): 359e. + + ‘color(colorstring)’, ‘color((r,g,b))’, ‘color(r,g,b)’ + + Inputs as in *note pencolor(): 359d, set both, fillcolor and + pencolor, to the given value. + + ‘color(colorstring1, colorstring2)’, ‘color((r1,g1,b1), (r2,g2,b2))’ + + Equivalent to ‘pencolor(colorstring1)’ and + ‘fillcolor(colorstring2)’ and analogously if the other input + format is used. + + If turtleshape is a polygon, outline and interior of that polygon + is drawn with the newly set colors. + + >>> turtle.color("red", "green") + >>> turtle.color() + ('red', 'green') + >>> color("#285078", "#a0c8f0") + >>> color() + ((40.0, 80.0, 120.0), (160.0, 200.0, 240.0)) + +See also: Screen method *note colormode(): 35d3. + + +File: python.info, Node: Filling, Next: More drawing control, Prev: Color control, Up: Pen control + +5.24.1.12 Filling +................. + + -- Function: turtle.filling () + + Return fillstate (‘True’ if filling, ‘False’ else). + + >>> turtle.begin_fill() + >>> if turtle.filling(): + ... turtle.pensize(5) + ... else: + ... turtle.pensize(3) + + -- Function: turtle.begin_fill () + + To be called just before drawing a shape to be filled. + + -- Function: turtle.end_fill () + + Fill the shape drawn after the last call to *note begin_fill(): + 35a0. + + 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. + + >>> turtle.color("black", "red") + >>> turtle.begin_fill() + >>> turtle.circle(80) + >>> turtle.end_fill() + + +File: python.info, Node: More drawing control, Prev: Filling, Up: Pen control + +5.24.1.13 More drawing control +.............................. + + -- Function: turtle.reset () + + Delete the turtle’s drawings from the screen, re-center the turtle + and set variables to the default values. + + >>> 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 + + -- 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. + + -- Function: turtle.write (arg, move=False, align='left', + font=('Arial', 8, 'normal')) + + + Parameters: + + * ‘arg’ – object to be written to the TurtleScreen + + * ‘move’ – True/False + + * ‘align’ – one of the strings “left”, “center” or right” + + * ‘font’ – a triple (fontname, fontsize, fonttype) + + 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 + ‘False’. + + >>> turtle.write("Home = ", True, align="center") + >>> turtle.write((0,0), True) + + +File: python.info, Node: Turtle state, Next: Using events, Prev: Pen control, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.14 Turtle state +...................... + +* Menu: + +* Visibility:: +* Appearance:: + + +File: python.info, Node: Visibility, Next: Appearance, Up: Turtle state + +5.24.1.15 Visibility +.................... + + -- Function: turtle.hideturtle () + -- 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. + + >>> turtle.hideturtle() + + -- Function: turtle.showturtle () + -- Function: turtle.st () + + Make the turtle visible. + + >>> turtle.showturtle() + + -- Function: turtle.isvisible () + + Return ‘True’ if the Turtle is shown, ‘False’ if it’s hidden. + + >>> turtle.hideturtle() + >>> turtle.isvisible() + False + >>> turtle.showturtle() + >>> turtle.isvisible() + True + + +File: python.info, Node: Appearance, Prev: Visibility, Up: Turtle state + +5.24.1.16 Appearance +.................... + + -- Function: turtle.shape (name=None) + + + Parameters: ‘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 *note register_shape(): 35d6. + + >>> turtle.shape() + 'classic' + >>> turtle.shape("turtle") + >>> turtle.shape() + 'turtle' + + -- Function: turtle.resizemode (rmode=None) + + + Parameters: ‘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: + + - “auto”: adapts the appearance of the turtle corresponding to + the value of pensize. + + - “user”: adapts the appearance of the turtle according to the + values of stretchfactor and outlinewidth (outline), which are + set by *note shapesize(): 35ac. + + - “noresize”: no adaption of the turtle’s appearance takes + place. + + ‘resizemode("user")’ is called by *note shapesize(): 35ac. when + used with arguments. + + >>> turtle.resizemode() + 'noresize' + >>> turtle.resizemode("auto") + >>> turtle.resizemode() + 'auto' + + -- Function: turtle.shapesize (stretch_wid=None, stretch_len=None, + outline=None) + -- Function: turtle.turtlesize (stretch_wid=None, stretch_len=None, + outline=None) + + + Parameters: + + * ‘stretch_wid’ – positive number + + * ‘stretch_len’ – positive number + + * ‘outline’ – positive number + + 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 shapes’s + outline. + + >>> 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) + + -- Function: turtle.shearfactor (shear=None) + + + Parameters: ‘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. + + >>> turtle.shape("circle") + >>> turtle.shapesize(5,2) + >>> turtle.shearfactor(0.5) + >>> turtle.shearfactor() + 0.5 + + -- Function: turtle.tilt (angle) + + + Parameters: ‘angle’ – a number + + Rotate the turtleshape by `angle' from its current tilt-angle, but + do `not' change the turtle’s heading (direction of movement). + + >>> turtle.reset() + >>> turtle.shape("circle") + >>> turtle.shapesize(5,2) + >>> turtle.tilt(30) + >>> turtle.fd(50) + >>> turtle.tilt(30) + >>> turtle.fd(50) + + -- Function: turtle.settiltangle (angle) + + + Parameters: ‘angle’ – a number + + 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). + + >>> turtle.reset() + >>> turtle.shape("circle") + >>> turtle.shapesize(5,2) + >>> turtle.settiltangle(45) + >>> turtle.fd(50) + >>> turtle.settiltangle(-45) + >>> turtle.fd(50) + + Deprecated since version 3.1. + + -- Function: turtle.tiltangle (angle=None) + + + Parameters: ‘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). + + >>> turtle.reset() + >>> turtle.shape("circle") + >>> turtle.shapesize(5,2) + >>> turtle.tilt(45) + >>> turtle.tiltangle() + 45.0 + + -- Function: turtle.shapetransform (t11=None, t12=None, t21=None, + t22=None) + + + Parameters: + + * ‘t11’ – a number (optional) + + * ‘t12’ – a number (optional) + + * ‘t21’ – a number (optional) + + * ‘t12’ – a number (optional) + + 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. + + >>> turtle = Turtle() + >>> turtle.shape("square") + >>> turtle.shapesize(4,2) + >>> turtle.shearfactor(-0.5) + >>> turtle.shapetransform() + (4.0, -1.0, -0.0, 2.0) + + -- 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. + + >>> turtle.shape("square") + >>> turtle.shapetransform(4, -1, 0, 2) + >>> turtle.get_shapepoly() + ((50, -20), (30, 20), (-50, 20), (-30, -20)) + + +File: python.info, Node: Using events, Next: Special Turtle methods, Prev: Turtle state, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.17 Using events +...................... + + -- Function: turtle.onclick (fun, btn=1, add=None) + + + Parameters: + + * ‘fun’ – a function with two arguments which will be called + with the coordinates of the clicked point on the canvas + + * ‘btn’ – number of the mouse-button, defaults to 1 (left mouse + button) + + * ‘add’ – ‘True’ or ‘False’ – if ‘True’, a new binding will be + added, otherwise it will replace a former binding + + Bind `fun' to mouse-click events on this turtle. If `fun' is + ‘None’, existing bindings are removed. Example for the anonymous + turtle, i.e. the procedural way: + + >>> def turn(x, y): + ... left(180) + ... + >>> onclick(turn) # Now clicking into the turtle will turn it. + >>> onclick(None) # event-binding will be removed + + -- Function: turtle.onrelease (fun, btn=1, add=None) + + + Parameters: + + * ‘fun’ – a function with two arguments which will be called + with the coordinates of the clicked point on the canvas + + * ‘btn’ – number of the mouse-button, defaults to 1 (left mouse + button) + + * ‘add’ – ‘True’ or ‘False’ – if ‘True’, a new binding will be + added, otherwise it will replace a former binding + + Bind `fun' to mouse-button-release events on this turtle. If `fun' + is ‘None’, existing bindings are removed. + + >>> 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. + + -- Function: turtle.ondrag (fun, btn=1, add=None) + + + Parameters: + + * ‘fun’ – a function with two arguments which will be called + with the coordinates of the clicked point on the canvas + + * ‘btn’ – number of the mouse-button, defaults to 1 (left mouse + button) + + * ‘add’ – ‘True’ or ‘False’ – if ‘True’, a new binding will be + added, otherwise it will replace a former binding + + Bind `fun' to mouse-move events on this turtle. If `fun' is + ‘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. + + >>> turtle.ondrag(turtle.goto) + + Subsequently, clicking and dragging the Turtle will move it across + the screen thereby producing handdrawings (if pen is down). + + +File: python.info, Node: Special Turtle methods, Next: Compound shapes, Prev: Using events, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.18 Special Turtle methods +................................ + + -- Function: turtle.begin_poly () + + Start recording the vertices of a polygon. Current turtle position + is first vertex of polygon. + + -- 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. + + -- Function: turtle.get_poly () + + Return the last recorded polygon. + + >>> 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) + + -- Function: turtle.clone () + + Create and return a clone of the turtle with same position, heading + and turtle properties. + + >>> mick = Turtle() + >>> joe = mick.clone() + + -- Function: turtle.getturtle () + -- Function: turtle.getpen () + + Return the Turtle object itself. Only reasonable use: as a + function to return the “anonymous turtle”: + + >>> pet = getturtle() + >>> pet.fd(50) + >>> pet + <turtle.Turtle object at 0x...> + + -- Function: turtle.getscreen () + + Return the *note TurtleScreen: 3569. object the turtle is drawing + on. TurtleScreen methods can then be called for that object. + + >>> ts = turtle.getscreen() + >>> ts + <turtle._Screen object at 0x...> + >>> ts.bgcolor("pink") + + -- Function: turtle.setundobuffer (size) + + + Parameters: ‘size’ – an integer or ‘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 *note undo(): + 3587. method/function. If `size' is ‘None’, the undobuffer is + disabled. + + >>> turtle.setundobuffer(42) + + -- Function: turtle.undobufferentries () + + Return number of entries in the undobuffer. + + >>> while undobufferentries(): + ... undo() + + +File: python.info, Node: Compound shapes, Prev: Special Turtle methods, Up: Methods of RawTurtle/Turtle and corresponding functions + +5.24.1.19 Compound shapes +......................... + +To use compound turtle shapes, which consist of several polygons of +different color, you must use the helper class *note Shape: 35f0. +explicitly as described below: + + 1. Create an empty Shape object of type “compound”. + + 2. Add as many components to this object as desired, using the + ‘addcomponent()’ method. + + For 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") + + 3. Now add the Shape to the Screen’s shapelist and use it: + + >>> register_shape("myshape", s) + >>> shape("myshape") + + Note: The *note Shape: 35f0. class is used internally by the *note + register_shape(): 35d6. method in different ways. The application + programmer has to deal with the Shape class `only' when using + compound shapes like shown above! + + +File: python.info, Node: Methods of TurtleScreen/Screen and corresponding functions, Next: Public classes, Prev: Methods of RawTurtle/Turtle and corresponding functions, Up: turtle — Turtle graphics + +5.24.1.20 Methods of TurtleScreen/Screen and corresponding functions +.................................................................... + +Most of the examples in this section refer to a TurtleScreen instance +called ‘screen’. + +* Menu: + +* Window control:: +* Animation control:: +* Using screen events:: +* Input methods:: +* Settings and special methods:: +* Methods specific to Screen, not inherited from TurtleScreen: Methods specific to Screen not inherited from TurtleScreen. + + +File: python.info, Node: Window control, Next: Animation control, Up: Methods of TurtleScreen/Screen and corresponding functions + +5.24.1.21 Window control +........................ + + -- Function: turtle.bgcolor (*args) + + + Parameters: ‘args’ – a color string or three numbers in the range + 0..colormode or a 3-tuple of such numbers + + Set or return background color of the TurtleScreen. + + >>> screen.bgcolor("orange") + >>> screen.bgcolor() + 'orange' + >>> screen.bgcolor("#800080") + >>> screen.bgcolor() + (128.0, 0.0, 128.0) + + -- Function: turtle.bgpic (picname=None) + + + Parameters: ‘picname’ – a string, name of a gif-file or ‘"nopic"’, + or ‘None’ + + Set background image or return name of current backgroundimage. If + `picname' is a filename, set the corresponding image as background. + If `picname' is ‘"nopic"’, delete background image, if present. If + `picname' is ‘None’, return the filename of the current + backgroundimage. + + >>> screen.bgpic() + 'nopic' + >>> screen.bgpic("landscape.gif") + >>> screen.bgpic() + "landscape.gif" + + -- Function: turtle.clear () + + Note: This TurtleScreen method is available as a global + function only under the name ‘clearscreen’. The global + function ‘clear’ is a different one derived from the Turtle + method ‘clear’. + + -- 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. + + -- Function: turtle.reset () + + Note: This TurtleScreen method is available as a global + function only under the name ‘resetscreen’. The global + function ‘reset’ is another one derived from the Turtle method + ‘reset’. + + -- Function: turtle.resetscreen () + + Reset all Turtles on the Screen to their initial state. + + -- Function: turtle.screensize (canvwidth=None, canvheight=None, + bg=None) + + + Parameters: + + * ‘canvwidth’ – positive integer, new width of canvas in pixels + + * ‘canvheight’ – positive integer, new height of canvas in + pixels + + * ‘bg’ – colorstring or color-tuple, new background color + + 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. + + >>> screen.screensize() + (400, 300) + >>> screen.screensize(2000,1500) + >>> screen.screensize() + (2000, 1500) + + e.g. to search for an erroneously escaped turtle ;-) + + -- Function: turtle.setworldcoordinates (llx, lly, urx, ury) + + + Parameters: + + * ‘llx’ – a number, x-coordinate of lower left corner of canvas + + * ‘lly’ – a number, y-coordinate of lower left corner of canvas + + * ‘urx’ – a number, x-coordinate of upper right corner of canvas + + * ‘ury’ – a number, y-coordinate of upper right corner of canvas + + Set up user-defined coordinate system and switch to mode “world” if + necessary. This performs a ‘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. + + >>> 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 + + +File: python.info, Node: Animation control, Next: Using screen events, Prev: Window control, Up: Methods of TurtleScreen/Screen and corresponding functions + +5.24.1.22 Animation control +........................... + + -- Function: turtle.delay (delay=None) + + + Parameters: ‘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: + + >>> screen.delay() + 10 + >>> screen.delay(5) + >>> screen.delay() + 5 + + -- Function: turtle.tracer (n=None, delay=None) + + + Parameters: + + * ‘n’ – nonnegative integer + + * ‘delay’ – nonnegative integer + + 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 *note + delay(): 35c7.). + + >>> screen.tracer(8, 25) + >>> dist = 2 + >>> for i in range(200): + ... fd(dist) + ... rt(90) + ... dist += 2 + + -- Function: turtle.update () + + Perform a TurtleScreen update. To be used when tracer is turned + off. + +See also the RawTurtle/Turtle method *note speed(): 3588. + + +File: python.info, Node: Using screen events, Next: Input methods, Prev: Animation control, Up: Methods of TurtleScreen/Screen and corresponding functions + +5.24.1.23 Using screen events +............................. + + -- 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 *note listen(): + 35ca. to the onclick method. + + -- Function: turtle.onkey (fun, key) + -- Function: turtle.onkeyrelease (fun, key) + + + Parameters: + + * ‘fun’ – a function with no arguments or ‘None’ + + * ‘key’ – a string: key (e.g. “a”) or key-symbol (e.g. + “space”) + + Bind `fun' to key-release event of key. If `fun' is ‘None’, event + bindings are removed. Remark: in order to be able to register + key-events, TurtleScreen must have the focus. (See method *note + listen(): 35ca.) + + >>> def f(): + ... fd(50) + ... lt(60) + ... + >>> screen.onkey(f, "Up") + >>> screen.listen() + + -- Function: turtle.onkeypress (fun, key=None) + + + Parameters: + + * ‘fun’ – a function with no arguments or ‘None’ + + * ‘key’ – a string: key (e.g. “a”) or key-symbol (e.g. + “space”) + + 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 + *note listen(): 35ca.) + + >>> def f(): + ... fd(50) + ... + >>> screen.onkey(f, "Up") + >>> screen.listen() + + -- Function: turtle.onclick (fun, btn=1, add=None) + -- Function: turtle.onscreenclick (fun, btn=1, add=None) + + + Parameters: + + * ‘fun’ – a function with two arguments which will be called + with the coordinates of the clicked point on the canvas + + * ‘btn’ – number of the mouse-button, defaults to 1 (left mouse + button) + + * ‘add’ – ‘True’ or ‘False’ – if ‘True’, a new binding will be + added, otherwise it will replace a former binding + + Bind `fun' to mouse-click events on this screen. If `fun' is + ‘None’, existing bindings are removed. + + Example for a TurtleScreen instance named ‘screen’ and a Turtle + instance named ‘turtle’: + + >>> 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 + + Note: This TurtleScreen method is available as a global + function only under the name ‘onscreenclick’. The global + function ‘onclick’ is another one derived from the Turtle + method ‘onclick’. + + -- Function: turtle.ontimer (fun, t=0) + + + Parameters: + + * ‘fun’ – a function with no arguments + + * ‘t’ – a number >= 0 + + Install a timer that calls `fun' after `t' milliseconds. + + >>> running = True + >>> def f(): + ... if running: + ... fd(50) + ... lt(60) + ... screen.ontimer(f, 250) + >>> f() ### makes the turtle march around + >>> running = False + + -- Function: turtle.mainloop () + -- 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. + + >>> screen.mainloop() + + +File: python.info, Node: Input methods, Next: Settings and special methods, Prev: Using screen events, Up: Methods of TurtleScreen/Screen and corresponding functions + +5.24.1.24 Input methods +....................... + + -- Function: turtle.textinput (title, prompt) + + + Parameters: + + * ‘title’ – string + + * ‘prompt’ – string + + 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 ‘None’. + + >>> screen.textinput("NIM", "Name of first player:") + + -- Function: turtle.numinput (title, prompt, default=None, minval=None, + maxval=None) + + + Parameters: + + * ‘title’ – string + + * ‘prompt’ – string + + * ‘default’ – number (optional) + + * ‘minval’ – number (optional) + + * ‘maxval’ – number (optional) + + 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 ‘None’. + + >>> screen.numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000) + + +File: python.info, Node: Settings and special methods, Next: Methods specific to Screen not inherited from TurtleScreen, Prev: Input methods, Up: Methods of TurtleScreen/Screen and corresponding functions + +5.24.1.25 Settings and special methods +...................................... + + -- Function: turtle.mode (mode=None) + + + Parameters: ‘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 *note turtle: 120. Mode + “logo” is compatible with most Logo turtle graphics. Mode “world” + uses user-defined “world coordinates”. `Attention': in this mode + angles appear distorted if ‘x/y’ unit-ratio doesn’t equal 1. + + Mode Initial turtle heading positive angles + + ----------------------------------------------------------------------- + + “standard” to the right (east) counterclockwise + + + “logo” upward (north) clockwise + + + >>> mode("logo") # resets turtle heading to north + >>> mode() + 'logo' + + -- Function: turtle.colormode (cmode=None) + + + Parameters: ‘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*. + + >>> 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) + + -- Function: turtle.getcanvas () + + Return the Canvas of this TurtleScreen. Useful for insiders who + know what to do with a Tkinter Canvas. + + >>> cv = screen.getcanvas() + >>> cv + <turtle.ScrolledCanvas object ...> + + -- Function: turtle.getshapes () + + Return a list of names of all currently available turtle shapes. + + >>> screen.getshapes() + ['arrow', 'blank', 'circle', ..., 'turtle'] + + -- Function: turtle.register_shape (name, shape=None) + -- Function: turtle.addshape (name, shape=None) + + There are three different ways to call this function: + + 1. `name' is the name of a gif-file and `shape' is ‘None’: + Install the corresponding image shape. + + >>> screen.register_shape("turtle.gif") + + Note: Image shapes `do not' rotate when turning the + turtle, so they do not display the heading of the turtle! + + 2. `name' is an arbitrary string and `shape' is a tuple of pairs + of coordinates: Install the corresponding polygon shape. + + >>> screen.register_shape("triangle", ((5,-3), (0,5), (-5,-3))) + + 3. `name' is an arbitrary string and `shape' is a (compound) + *note Shape: 35f0. object: Install the corresponding compound + shape. + + Add a turtle shape to TurtleScreen’s shapelist. Only thusly + registered shapes can be used by issuing the command + ‘shape(shapename)’. + + -- Function: turtle.turtles () + + Return the list of turtles on the screen. + + >>> for turtle in screen.turtles(): + ... turtle.color("red") + + -- Function: turtle.window_height () + + Return the height of the turtle window. + + >>> screen.window_height() + 480 + + -- Function: turtle.window_width () + + Return the width of the turtle window. + + >>> screen.window_width() + 640 + + +File: python.info, Node: Methods specific to Screen not inherited from TurtleScreen, Prev: Settings and special methods, Up: Methods of TurtleScreen/Screen and corresponding functions + +5.24.1.26 Methods specific to Screen, not inherited from TurtleScreen +..................................................................... + + -- Function: turtle.bye () + + Shut the turtlegraphics window. + + -- Function: turtle.exitonclick () + + Bind ‘bye()’ method to mouse clicks on the Screen. + + If the value “using_IDLE” in the configuration dictionary is + ‘False’ (default value), also enter mainloop. Remark: If IDLE with + the ‘-n’ switch (no subprocess) is used, this value should be set + to ‘True’ in ‘turtle.cfg’. In this case IDLE’s own mainloop is + active also for the client script. + + -- 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 ‘turtle.cfg’ file. + + + Parameters: + + * ‘width’ – if an integer, a size in pixels, if a float, a + fraction of the screen; default is 50% of screen + + * ‘height’ – if an integer, the height in pixels, if a float, a + fraction of the screen; default is 75% of screen + + * ‘startx’ – if positive, starting position in pixels from the + left edge of the screen, if negative from the right edge, if + ‘None’, center window horizontally + + * ‘starty’ – if positive, starting position in pixels from the + top edge of the screen, if negative from the bottom edge, if + ‘None’, center window vertically + + >>> 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 + + -- Function: turtle.title (titlestring) + + + Parameters: ‘titlestring’ – a string that is shown in the titlebar + of the turtle graphics window + + Set title of turtle window to `titlestring'. + + >>> screen.title("Welcome to the turtle zoo!") + + +File: python.info, Node: Public classes, Next: Help and configuration, Prev: Methods of TurtleScreen/Screen and corresponding functions, Up: turtle — Turtle graphics + +5.24.1.27 Public classes +........................ + + -- Class: turtle.RawTurtle (canvas) + -- Class: turtle.RawPen (canvas) + + + Parameters: ‘canvas’ – a ‘tkinter.Canvas’, a *note ScrolledCanvas: + 356a. or a *note TurtleScreen: 3569. + + Create a turtle. The turtle has all methods described above as + “methods of Turtle/RawTurtle”. + + -- Class: turtle.Turtle + + Subclass of RawTurtle, has the same interface but draws on a + default *note Screen: 356b. object created automatically when + needed for the first time. + + -- Class: turtle.TurtleScreen (cv) + + + Parameters: ‘cv’ – a ‘tkinter.Canvas’ + + Provides screen oriented methods like ‘setbg()’ etc. that are + described above. + + -- Class: turtle.Screen + + Subclass of TurtleScreen, with *note four methods added: 35f8. + + -- Class: turtle.ScrolledCanvas (master) + + + Parameters: ‘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. + + -- Class: turtle.Shape (type_, data) + + + Parameters: ‘type_’ – one of the strings “polygon”, “image”, + “compound” + + Data structure modeling shapes. The pair ‘(type_, data)’ must + follow this specification: + + `type_' `data' + + ------------------------------------------------------------------------------- + + “polygon” a polygon-tuple, i.e. a tuple of pairs of coordinates + + + “image” an image (in this form only used internally!) + + + “compound” ‘None’ (a compound shape has to be constructed using the + *note addcomponent(): 35fa. method) + + + -- Method: addcomponent (poly, fill, outline=None) + + + Parameters: + + * ‘poly’ – a polygon, i.e. a tuple of pairs of numbers + + * ‘fill’ – a color the `poly' will be filled with + + * ‘outline’ – a color for the poly’s outline (if given) + + 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() + + See *note Compound shapes: 35ef. + + -- 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): + + * ‘a + b’ vector addition + + * ‘a - b’ vector subtraction + + * ‘a * b’ inner product + + * ‘k * a’ and ‘a * k’ multiplication with scalar + + * ‘abs(a)’ absolute value of a + + * ‘a.rotate(angle)’ rotation + + +File: python.info, Node: Help and configuration, Next: turtledemo — Demo scripts, Prev: Public classes, Up: turtle — Turtle graphics + +5.24.1.28 Help and configuration +................................ + +* Menu: + +* How to use help:: +* Translation of docstrings into different languages:: +* How to configure Screen and Turtles:: + + +File: python.info, Node: How to use help, Next: Translation of docstrings into different languages, Up: Help and configuration + +5.24.1.29 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: + + - When using IDLE, tooltips show the signatures and first lines of + the docstrings of typed in function-/method calls. + + - Calling *note help(): 514. on methods or functions displays the + docstrings: + + >>> 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() + + - The docstrings of the functions which are derived from methods have + a modified form: + + >>> 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() + +These modified docstrings are created automatically together with the +function definitions that are derived from the methods at import time. + + +File: python.info, Node: Translation of docstrings into different languages, Next: How to configure Screen and Turtles, Prev: How to use help, Up: Help and configuration + +5.24.1.30 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. + + -- Function: turtle.write_docstringdict + (filename='turtle_docstringdict') + + + Parameters: ‘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 ‘`filename'.py’. It is + intended to serve as a template for translation of the docstrings + into different languages. + +If you (or your students) want to use *note turtle: 120. with online +help in your native language, you have to translate the docstrings and +save the resulting file as e.g. ‘turtle_docstringdict_german.py’. + +If you have an appropriate entry in your ‘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 <glingl@aon.at>.) + + +File: python.info, Node: How to configure Screen and Turtles, Prev: Translation of docstrings into different languages, Up: Help and configuration + +5.24.1.31 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 ‘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 turtle.cfg: + + 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 + +Short explanation of selected entries: + + - The first four lines correspond to the arguments of the + ‘Screen.setup()’ method. + + - Line 5 and 6 correspond to the arguments of the method + ‘Screen.screensize()’. + + - `shape' can be any of the built-in shapes, e.g: arrow, turtle, etc. + For more info try ‘help(shape)’. + + - If you want to use no fillcolor (i.e. make the turtle + transparent), you have to write ‘fillcolor = ""’ (but all nonempty + strings must not have quotes in the cfg-file). + + - If you want to reflect the turtle its state, you have to use + ‘resizemode = auto’. + + - If you set e.g. ‘language = italian’ the docstringdict + ‘turtle_docstringdict_italian.py’ will be loaded at import time (if + present on the import path, e.g. in the same directory as *note + turtle: 120.). + + - 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. + + - `using_IDLE': Set this to ‘True’ if you regularly work with IDLE + and its ‘-n’ switch (“no subprocess”). This will prevent *note + exitonclick(): 35dc. to enter the mainloop. + +There can be a ‘turtle.cfg’ file in the directory where *note turtle: +120. is stored and an additional one in the current working directory. +The latter will override the settings of the first one. + +The ‘Lib/turtledemo’ directory contains a ‘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). + + +File: python.info, Node: turtledemo — Demo scripts, Next: Changes since Python 2 6, Prev: Help and configuration, Up: turtle — Turtle graphics + +5.24.1.32 ‘turtledemo’ — Demo scripts +..................................... + +The *note turtledemo: 121. package includes a set of demo scripts. +These scripts can be run and viewed using the supplied demo viewer as +follows: + + python -m turtledemo + +Alternatively, you can run the demo scripts individually. For example, + + python -m turtledemo.bytedesign + +The *note turtledemo: 121. package directory contains: + + - A demo viewer ‘__main__.py’ which can be used to view the + sourcecode of the scripts and run them at the same time. + + - Multiple scripts demonstrating different features of the *note + turtle: 120. module. Examples can be accessed via the Examples + menu. They can also be run standalone. + + - A ‘turtle.cfg’ file which serves as an example of how to write and + use such files. + +The demo scripts are: + +Name Description Features + +------------------------------------------------------------------------------------ + +bytedesign complex classical turtle ‘tracer()’, delay, + graphics pattern ‘update()’ + + +chaos graphs Verhulst dynamics, shows world coordinates + that computer’s computations can + generate results sometimes + against the common sense + expectations + + +clock analog clock showing time of turtles as clock’s hands, + your computer ontimer + + +colormixer experiment with r, g, b ‘ondrag()’ + + +forest 3 breadth-first trees randomization + + +fractalcurves Hilbert & Koch curves recursion + + +lindenmayer ethnomathematics (indian kolams) L-System + + +minimal_hanoi Towers of Hanoi Rectangular Turtles as + Hanoi discs (shape, + shapesize) + + +nim play the classical nim game with turtles as nimsticks, + three heaps of sticks against event driven (mouse, + the computer. keyboard) + + +paint super minimalistic drawing ‘onclick()’ + program + + +peace elementary turtle: appearance and + animation + + +penrose aperiodic tiling with kites and ‘stamp()’ + darts + + +planet_and_moon simulation of gravitational compound shapes, ‘Vec2D’ + system + + +round_dance dancing turtles rotating compound shapes, clone + pairwise in opposite direction shapesize, tilt, + get_shapepoly, update + + +sorting_animate visual demonstration of simple alignment, + different sorting methods randomization + + +tree a (graphical) breadth first tree ‘clone()’ + (using generators) + + +two_canvases simple design turtles on two canvases + + +wikipedia a pattern from the wikipedia ‘clone()’, ‘undo()’ + article on turtle graphics + + +yinyang another elementary example ‘circle()’ + + +Have fun! + + +File: python.info, Node: Changes since Python 2 6, Next: Changes since Python 3 0, Prev: turtledemo — Demo scripts, Up: turtle — Turtle graphics + +5.24.1.33 Changes since Python 2.6 +.................................. + + - The methods ‘Turtle.tracer()’, ‘Turtle.window_width()’ and + ‘Turtle.window_height()’ have been eliminated. Methods with these + names and functionality are now available only as methods of + ‘Screen’. The functions derived from these remain available. (In + fact already in Python 2.6 these methods were merely duplications + of the corresponding ‘TurtleScreen’/‘Screen’-methods.) + + - The method ‘Turtle.fill()’ has been eliminated. The behaviour of + ‘begin_fill()’ and ‘end_fill()’ have changed slightly: now every + filling-process must be completed with an ‘end_fill()’ call. + + - A method ‘Turtle.filling()’ has been added. It returns a boolean + value: ‘True’ if a filling process is under way, ‘False’ otherwise. + This behaviour corresponds to a ‘fill()’ call without arguments in + Python 2.6. + + +File: python.info, Node: Changes since Python 3 0, Prev: Changes since Python 2 6, Up: turtle — Turtle graphics + +5.24.1.34 Changes since Python 3.0 +.................................. + + - The methods ‘Turtle.shearfactor()’, ‘Turtle.shapetransform()’ and + ‘Turtle.get_shapepoly()’ have been added. Thus the full range of + regular linear transforms is now available for transforming turtle + shapes. ‘Turtle.tiltangle()’ has been enhanced in functionality: + it now can be used to get or set the tiltangle. + ‘Turtle.settiltangle()’ has been deprecated. + + - The method ‘Screen.onkeypress()’ has been added as a complement to + ‘Screen.onkey()’ which in fact binds actions to the keyrelease + event. Accordingly the latter has got an alias: + ‘Screen.onkeyrelease()’. + + - The method ‘Screen.mainloop()’ has been added. So when working + only with Screen and Turtle objects one must not additionally + import ‘mainloop()’ anymore. + + - Two input methods has been added ‘Screen.textinput()’ and + ‘Screen.numinput()’. These popup input dialogs and return strings + and numbers respectively. + + - Two example scripts ‘tdemo_nim.py’ and ‘tdemo_round_dance.py’ have + been added to the ‘Lib/turtledemo’ directory. + + +File: python.info, Node: cmd — Support for line-oriented command interpreters, Next: shlex — Simple lexical analysis, Prev: turtle — Turtle graphics, Up: Program Frameworks + +5.24.2 ‘cmd’ — Support for line-oriented command interpreters +------------------------------------------------------------- + +`Source code:' Lib/cmd.py(1) + +__________________________________________________________________ + +The *note Cmd: 3605. 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. + + -- Class: cmd.Cmd (completekey='tab', stdin=None, stdout=None) + + A *note Cmd: 3605. instance or subclass instance is a line-oriented + interpreter framework. There is no good reason to instantiate + *note Cmd: 3605. itself; rather, it’s useful as a superclass of an + interpreter class you define yourself in order to inherit *note + Cmd: 3605.’s methods and encapsulate action methods. + + The optional argument `completekey' is the *note readline: db. name + of a completion key; it defaults to ‘Tab’. If `completekey' is not + *note None: 243. and *note readline: db. is available, command + completion is done automatically. + + 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 + *note sys.stdin: 729. and *note sys.stdout: 72a. + + If you want a given `stdin' to be used, make sure to set the + instance’s *note use_rawinput: 3606. attribute to ‘False’, + otherwise `stdin' will be ignored. + +* Menu: + +* Cmd Objects:: +* Cmd Example:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/cmd.py + + +File: python.info, Node: Cmd Objects, Next: Cmd Example, Up: cmd — Support for line-oriented command interpreters + +5.24.2.1 Cmd Objects +.................... + +A *note Cmd: 3605. instance has the following methods: + + -- 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 *note intro: 360a. + class attribute). + + If the *note readline: db. module is loaded, input will + automatically inherit ‘bash’-like history-list editing (e.g. + ‘Control-P’ scrolls back to the last command, ‘Control-N’ forward + to the next one, ‘Control-F’ moves the cursor to the right + non-destructively, ‘Control-B’ moves the cursor to the left + non-destructively, etc.). + + An end-of-file on input is passed back as the string ‘'EOF'’. + + An interpreter instance will recognize a command name ‘foo’ if and + only if it has a method ‘do_foo()’. As a special case, a line + beginning with the character ‘'?'’ is dispatched to the method + ‘do_help()’. As another special case, a line beginning with the + character ‘'!'’ is dispatched to the method ‘do_shell()’ (if such a + method is defined). + + This method will return when the *note postcmd(): 360b. method + returns a true value. The `stop' argument to *note postcmd(): + 360b. is the return value from the command’s corresponding ‘do_*()’ + method. + + If completion is enabled, completing commands will be done + automatically, and completing of commands args is done by calling + ‘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. + + All subclasses of *note Cmd: 3605. inherit a predefined + ‘do_help()’. This method, called with an argument ‘'bar'’, invokes + the corresponding method ‘help_bar()’, and if that is not present, + prints the docstring of ‘do_bar()’, if available. With no + argument, ‘do_help()’ lists all available help topics (that is, all + commands with corresponding ‘help_*()’ methods or commands that + have docstrings), and also lists any undocumented commands. + + -- 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 *note precmd(): 360d. and *note postcmd(): 360b. + 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 ‘do_*()’ method for the command `str', + the return value of that method is returned, otherwise the return + value from the *note default(): 360e. method is returned. + + -- 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. + + -- 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. + + -- Method: Cmd.completedefault (text, line, begidx, endidx) + + Method called to complete an input line when no command-specific + ‘complete_*()’ method is available. By default, it returns an + empty list. + + -- 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. + + -- 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 *note Cmd: 3605.; it exists to be + overridden by subclasses. The return value is used as the command + which will be executed by the *note onecmd(): 360c. method; the + *note precmd(): 360d. implementation may re-write the command or + simply return `line' unchanged. + + -- Method: Cmd.postcmd (stop, line) + + Hook method executed just after a command dispatch is finished. + This method is a stub in *note Cmd: 3605.; 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 *note postcmd(): 360b.; this + will be the return value of the *note onecmd(): 360c. 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. + + -- Method: Cmd.preloop () + + Hook method executed once when *note cmdloop(): 3609. is called. + This method is a stub in *note Cmd: 3605.; it exists to be + overridden by subclasses. + + -- Method: Cmd.postloop () + + Hook method executed once when *note cmdloop(): 3609. is about to + return. This method is a stub in *note Cmd: 3605.; it exists to be + overridden by subclasses. + +Instances of *note Cmd: 3605. subclasses have some public instance +variables: + + -- Attribute: Cmd.prompt + + The prompt issued to solicit input. + + -- Attribute: Cmd.identchars + + The string of characters accepted for the command prefix. + + -- Attribute: Cmd.lastcmd + + The last nonempty command prefix seen. + + -- Attribute: Cmd.cmdqueue + + A list of queued input lines. The cmdqueue list is checked in + *note cmdloop(): 3609. when new input is needed; if it is nonempty, + its elements will be processed in order, as if entered at the + prompt. + + -- Attribute: Cmd.intro + + A string to issue as an intro or banner. May be overridden by + giving the *note cmdloop(): 3609. method an argument. + + -- Attribute: Cmd.doc_header + + The header to issue if the help output has a section for documented + commands. + + -- Attribute: Cmd.misc_header + + The header to issue if the help output has a section for + miscellaneous help topics (that is, there are ‘help_*()’ methods + without corresponding ‘do_*()’ methods). + + -- Attribute: Cmd.undoc_header + + The header to issue if the help output has a section for + undocumented commands (that is, there are ‘do_*()’ methods without + corresponding ‘help_*()’ methods). + + -- 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 ‘'='’. + + -- Attribute: Cmd.use_rawinput + + A flag, defaulting to true. If true, *note cmdloop(): 3609. uses + *note input(): f7c. to display a prompt and read the next command; + if false, ‘sys.stdout.write()’ and ‘sys.stdin.readline()’ are used. + (This means that by importing *note readline: db, on systems that + support it, the interpreter will automatically support ‘Emacs’-like + line editing and command-history keystrokes.) + + +File: python.info, Node: Cmd Example, Prev: Cmd Objects, Up: cmd — Support for line-oriented command interpreters + +5.24.2.2 Cmd Example +.................... + +The *note cmd: 18. 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 *note turtle: 120. module. + +Basic turtle commands such as *note forward(): 3571. are added to a +*note Cmd: 3605. subclass with method named ‘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 *note precmd(): 360d. method which is responsible +for converting the input to lowercase and writing the commands to a +file. The ‘do_playback()’ method reads the file and adds the recorded +commands to the ‘cmdqueue’ for immediate playback: + + 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() + +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: + + 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 + + +File: python.info, Node: shlex — Simple lexical analysis, Prev: cmd — Support for line-oriented command interpreters, Up: Program Frameworks + +5.24.3 ‘shlex’ — Simple lexical analysis +---------------------------------------- + +`Source code:' Lib/shlex.py(1) + +__________________________________________________________________ + +The *note shlex: 93b. 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 *note shlex: e5. module defines the following functions: + + -- Function: shlex.split (s, comments=False, posix=True) + + Split the string `s' using shell-like syntax. If `comments' is + *note False: 78d. (the default), the parsing of comments in the + given string will be disabled (setting the *note commenters: 361f. + attribute of the *note shlex: 93b. instance to the empty string). + This function operates in POSIX mode by default, but uses non-POSIX + mode if the `posix' argument is false. + + Note: Since the *note split(): 594. function instantiates a + *note shlex: 93b. instance, passing ‘None’ for `s' will read + the string to split from standard input. + + Deprecated since version 3.9: Passing ‘None’ for `s' will raise an + exception in future Python versions. + + -- Function: shlex.join (split_command) + + Concatenate the tokens of the list `split_command' and return a + string. This function is the inverse of *note split(): 594. + + >>> from shlex import join + >>> print(join(['echo', '-n', 'Multiple words'])) + echo -n 'Multiple words' + + The returned value is shell-escaped to protect against injection + vulnerabilities (see *note quote(): dd7.). + + New in version 3.8. + + -- 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. + Warning: The ‘shlex’ module is `only designed for Unix + shells'. + + The *note quote(): dd7. 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 *note subprocess.run(): 7e8. with ‘shell=False’. + + This idiom would be unsafe: + + >>> filename = 'somefile; rm -rf ~' + >>> command = 'ls -l {}'.format(filename) + >>> print(command) # executed by a shell: boom! + ls -l somefile; rm -rf ~ + + *note quote(): dd7. lets you plug the security hole: + + >>> 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 ~'"'"'' + + The quoting is compatible with UNIX shells and with *note split(): + 594.: + + >>> 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 ~'] + + New in version 3.3. + +The *note shlex: e5. module defines the following class: + + -- Class: shlex.shlex (instream=None, infile=None, posix=False, + punctuation_chars=False) + + A *note shlex: 93b. 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 *note read(): 2602. and *note + readline(): 2208. methods, or a string. If no argument is given, + input will be taken from ‘sys.stdin’. The second optional argument + is a filename string, which sets the initial value of the *note + infile: 3620. attribute. If the `instream' argument is omitted or + equal to ‘sys.stdin’, this second argument defaults to “stdin”. + The `posix' argument defines the operational mode: when `posix' is + not true (default), the *note shlex: 93b. instance will operate in + compatibility mode. When operating in POSIX mode, *note shlex: + 93b. 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, ‘False’, preserves the + behaviour seen under Python 3.5 and earlier. If set to ‘True’, + then parsing of the characters ‘();<>|&’ 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 *note wordchars: 3621. attribute that appear in + `punctuation_chars' will be removed from *note wordchars: 3621. + See *note Improved Compatibility with Shells: 93c. for more + information. `punctuation_chars' can be set only upon *note shlex: + 93b. instance creation and can’t be modified later. + + Changed in version 3.6: The `punctuation_chars' parameter was + added. + +See also +........ + +Module *note configparser: 21. + + Parser for configuration files similar to the Windows ‘.ini’ files. + +* Menu: + +* shlex Objects:: +* Parsing Rules:: +* Improved Compatibility with Shells:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/shlex.py + + +File: python.info, Node: shlex Objects, Next: Parsing Rules, Up: shlex — Simple lexical analysis + +5.24.3.1 shlex Objects +...................... + +A *note shlex: 93b. instance has the following methods: + + -- Method: shlex.get_token () + + Return a token. If tokens have been stacked using *note + push_token(): 3625, pop a token off the stack. Otherwise, read one + from the input stream. If reading encounters an immediate + end-of-file, *note eof: 3626. is returned (the empty string (‘''’) + in non-POSIX mode, and ‘None’ in POSIX mode). + + -- Method: shlex.push_token (str) + + Push the argument onto the token stack. + + -- 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.) + + -- Method: shlex.sourcehook (filename) + + When *note shlex: 93b. detects a source request (see *note source: + 3629. 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 + ‘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 ‘#include + "file.h"’). + + The result of the manipulations is treated as a filename, and + returned as the first component of the tuple, with *note open(): + 30b. 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 *note close(): 145e. method of the sourced + input stream when it returns EOF. + + For more explicit control of source stacking, use the *note + push_source(): 362a. and *note pop_source(): 362b. methods. + + -- 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 *note + sourcehook(): 3628. method. + + -- 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. + + -- 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 ‘'"%s", line %d: '’, + where the ‘%s’ is replaced with the name of the current source file + and the ‘%d’ with the current input line number (the optional + arguments can be used to override these). + + This convenience is provided to encourage *note shlex: e5. users to + generate error messages in the standard, parseable format + understood by Emacs and other Unix tools. + +Instances of *note shlex: 93b. subclasses have some public instance +variables which either control lexical analysis or can be used for +debugging: + + -- 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 ‘'#'’ by default. + + -- 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 *note punctuation_chars: 13f8. is not + empty, the characters ‘~-./*?=’, which can appear in filename + specifications and command line parameters, will also be included + in this attribute, and any characters which appear in + ‘punctuation_chars’ will be removed from ‘wordchars’ if they are + present there. If *note whitespace_split: 362d. is set to ‘True’, + this will have no effect. + + -- Attribute: shlex.whitespace + + Characters that will be considered whitespace and skipped. + Whitespace bounds tokens. By default, includes space, tab, + linefeed and carriage-return. + + -- Attribute: shlex.escape + + Characters that will be considered as escape. This will be only + used in POSIX mode, and includes just ‘'\'’ by default. + + -- 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. + + -- Attribute: shlex.escapedquotes + + Characters in *note quotes: 3630. that will interpret escape + characters defined in *note escape: 362f. This is only used in + POSIX mode, and includes just ‘'"'’ by default. + + -- Attribute: shlex.whitespace_split + + If ‘True’, tokens will only be split in whitespaces. This is + useful, for example, for parsing command lines with *note shlex: + 93b, getting tokens in a similar way to shell arguments. When used + in combination with *note punctuation_chars: 13f8, tokens will be + split on whitespace in addition to those characters. + + Changed in version 3.8: The *note punctuation_chars: 13f8. + attribute was made compatible with the *note whitespace_split: + 362d. attribute. + + -- 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. + + -- Attribute: shlex.instream + + The input stream from which this *note shlex: 93b. instance is + reading characters. + + -- Attribute: shlex.source + + This attribute is ‘None’ by default. If you assign a string to it, + that string will be recognized as a lexical-level inclusion request + similar to the ‘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 *note + close(): 145e. 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. + + -- Attribute: shlex.debug + + If this attribute is numeric and ‘1’ or more, a *note shlex: 93b. + 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. + + -- Attribute: shlex.lineno + + Source line number (count of newlines seen so far plus one). + + -- Attribute: shlex.token + + The token buffer. It may be useful to examine this when catching + exceptions. + + -- Attribute: shlex.eof + + Token used to determine end of file. This will be set to the empty + string (‘''’), in non-POSIX mode, and to ‘None’ in POSIX mode. + + -- 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. + + New in version 3.6. + + +File: python.info, Node: Parsing Rules, Next: Improved Compatibility with Shells, Prev: shlex Objects, Up: shlex — Simple lexical analysis + +5.24.3.2 Parsing Rules +...................... + +When operating in non-POSIX mode, *note shlex: 93b. will try to obey to +the following rules. + + * Quote characters are not recognized within words (‘Do"Not"Separate’ + is parsed as the single word ‘Do"Not"Separate’); + + * Escape characters are not recognized; + + * Enclosing characters in quotes preserve the literal value of all + characters within the quotes; + + * Closing quotes separate words (‘"Do"Separate’ is parsed as ‘"Do"’ + and ‘Separate’); + + * If *note whitespace_split: 362d. is ‘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 ‘True’, *note + shlex: 93b. will only split words in whitespaces; + + * EOF is signaled with an empty string (‘''’); + + * It’s not possible to parse empty strings, even if quoted. + +When operating in POSIX mode, *note shlex: 93b. will try to obey to the +following parsing rules. + + * Quotes are stripped out, and do not separate words + (‘"Do"Not"Separate"’ is parsed as the single word ‘DoNotSeparate’); + + * Non-quoted escape characters (e.g. ‘'\'’) preserve the literal + value of the next character that follows; + + * Enclosing characters in quotes which are not part of *note + escapedquotes: 3631. (e.g. ‘"'"’) preserve the literal value of + all characters within the quotes; + + * Enclosing characters in quotes which are part of *note + escapedquotes: 3631. (e.g. ‘'"'’) preserves the literal value of + all characters within the quotes, with the exception of the + characters mentioned in *note escape: 362f. The escape characters + retain its 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. + + * EOF is signaled with a *note None: 243. value; + + * Quoted empty strings (‘''’) are allowed. + + +File: python.info, Node: Improved Compatibility with Shells, Prev: Parsing Rules, Up: shlex — Simple lexical analysis + +5.24.3.3 Improved Compatibility with Shells +........................................... + +New in version 3.6. + +The *note shlex: e5. class provides compatibility with the parsing +performed by common Unix shells like ‘bash’, ‘dash’, and ‘sh’. To take +advantage of this compatibility, specify the ‘punctuation_chars’ +argument in the constructor. This defaults to ‘False’, which preserves +pre-3.6 behaviour. However, if it is set to ‘True’, then parsing of the +characters ‘();<>|&’ 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: + + >>> 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', ')'] + +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 ‘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: + + >>> import shlex + >>> s = shlex.shlex("a && b || c", punctuation_chars="|") + >>> list(s) + ['a', '&', '&', 'b', '||', 'c'] + + Note: When ‘punctuation_chars’ is specified, the *note wordchars: + 3621. attribute is augmented with the characters ‘~-./*?=’. That + is because these characters can appear in file names (including + wildcards) and command-line arguments (e.g. ‘--color=auto’). + Hence: + + >>> import shlex + >>> s = shlex.shlex('~/a && b-c --color=auto || d *.py?', + ... punctuation_chars=True) + >>> list(s) + ['~/a', '&&', 'b-c', '--color=auto', '||', 'd', '*.py?'] + + However, to match the shell as closely as possible, it is + recommended to always use ‘posix’ and *note whitespace_split: 362d. + when using *note punctuation_chars: 13f8, which will negate *note + wordchars: 3621. entirely. + +For best effect, ‘punctuation_chars’ should be set in conjunction with +‘posix=True’. (Note that ‘posix=False’ is the default for *note shlex: +93b.) + + +File: python.info, Node: Graphical User Interfaces with Tk, Next: Development Tools, Prev: Program Frameworks, Up: The Python Standard Library + +5.25 Graphical User Interfaces with 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 *note tkinter: 10e. package, and its extension, +the *note tkinter.tix: 117. and the *note tkinter.ttk: 118. modules. + +The *note tkinter: 10e. package is a thin object-oriented layer on top +of Tcl/Tk. To use *note tkinter: 10e, you don’t need to write Tcl code, +but you will need to consult the Tk documentation, and occasionally the +Tcl documentation. *note tkinter: 10e. is a set of wrappers that +implement the Tk widgets as Python classes. + +*note tkinter: 10e.’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. *note tkinter: 10e. 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(1). + +* 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. +* tkinter.tix — Extension widgets for Tk: tkinter tix — Extension widgets for Tk. +* IDLE: IDLE<52>. + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/GuiProgramming + + +File: python.info, Node: tkinter — Python interface to Tcl/Tk, Next: tkinter colorchooser — Color choosing dialog, Up: Graphical User Interfaces with Tk + +5.25.1 ‘tkinter’ — Python interface to Tcl/Tk +--------------------------------------------- + +`Source code:' Lib/tkinter/__init__.py(1) + +__________________________________________________________________ + +The *note tkinter: 10e. package (“Tk interface”) is the standard Python +interface to the Tcl/Tk GUI toolkit. Both Tk and *note tkinter: 10e. +are available on most Unix platforms, including macOS, as well as on +Windows systems. + +Running ‘python -m tkinter’ from the command line should open a window +demonstrating a simple Tk interface, letting you know that *note +tkinter: 10e. 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. The official Python binary release bundles +Tcl/Tk 8.6 threaded. See the source code for the ‘_tkinter’ module for +more information about supported versions. + +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. + + 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. + +See also +........ + + * + TkDocs(2) + + Extensive tutorial on creating user interfaces with Tkinter. + Explains key concepts, and illustrates recommended approaches + using the modern API. + + * + Tkinter 8.5 reference: a GUI for Python(3) + + Reference documentation for Tkinter 8.5 detailing available + classes, methods, and options. + +Tcl/Tk Resources: + + * + Tk commands(4) + + Comprehensive reference to each of the underlying Tcl/Tk + commands used by Tkinter. + + * + Tcl/Tk Home Page(5) + + Additional documentation, and links to Tcl/Tk core + development. + +Books: + + * + Modern Tkinter for Busy Python Developers(6) + + By Mark Roseman. (ISBN 978-1999149567) + + * + Python and Tkinter Programming(7) + + By Alan Moore. (ISBN 978-1788835886) + + * + Programming Python(8) + + By Mark Lutz; has excellent coverage of Tkinter. (ISBN + 978-0596158101) + + * + Tcl and the Tk Toolkit (2nd edition)(9) + + By John Ousterhout, inventor of Tcl/Tk, and Ken Jones; does + not cover Tkinter. (ISBN 978-0321336330) + +* Menu: + +* Architecture:: +* Tkinter Modules:: +* Tkinter Life Preserver:: +* Threading model:: +* Handy Reference:: +* File Handlers:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/tkinter/__init__.py + + (2) https://tkdocs.com/ + + (3) https://www.tkdocs.com/shipman/ + + (4) https://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm + + (5) https://www.tcl.tk + + (6) https://tkdocs.com/book.html + + (7) +https://www.packtpub.com/product/python-gui-programming-with-tkinter/9781788835886 + + (8) https://learning-python.com/about-pp4e.html + + (9) https://www.amazon.com/exec/obidos/ASIN/032133633X + + +File: python.info, Node: Architecture, Next: Tkinter Modules, Up: tkinter — Python interface to Tcl/Tk + +5.25.1.1 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. + +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 *note Threading model: + 363f. for details). + +Tk + + Tk is a Tcl package(1) implemented in C that adds custom commands + to create and manipulate GUI widgets. Each *note Tk: 3640. 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. + +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, + *note tkinter.ttk: 118. + +Internally, Tk and Ttk use facilities of the underlying operating +system, i.e., Xlib on Unix/X11, Cocoa on macOS, GDI on Windows. + +When your Python application uses a class in Tkinter, e.g., to create a +widget, the *note tkinter: 10e. module first assembles a Tcl/Tk command +string. It passes that Tcl command string to an internal ‘_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. + + ---------- Footnotes ---------- + + (1) https://wiki.tcl-lang.org/37432 + + +File: python.info, Node: Tkinter Modules, Next: Tkinter Life Preserver, Prev: Architecture, Up: tkinter — Python interface to Tcl/Tk + +5.25.1.2 Tkinter Modules +........................ + +Support for Tkinter is spread across several modules. Most applications +will need the main *note tkinter: 10e. module, as well as the *note +tkinter.ttk: 118. module, which provides the modern themed widget set +and API: + + from tkinter import * + from tkinter import ttk + + -- 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 *note Tk: 3640. class is typically instantiated using all + default values. However, the following keyword arguments are + currently recognized: + + `screenName' + + When given (as a string), sets the ‘DISPLAY’ environment + variable. (X11 only) + + `baseName' + + Name of the profile file. By default, `baseName' is derived + from the program name (‘sys.argv[0]’). + + `className' + + Name of the widget class. Used as a profile file and also as + the name with which Tcl is invoked (`argv0' in `interp'). + + `useTk' + + If ‘True’, initialize the Tk subsystem. The *note + tkinter.Tcl(): 3642. function sets this to ‘False’. + + `sync' + + If ‘True’, execute all X server commands synchronously, so + that errors are reported immediately. Can be used for + debugging. (X11 only) + + `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 ‘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. + + *note Tk: 3640. reads and interprets profile files, named + ‘.`className'.tcl’ and ‘.`baseName'.tcl’, into the Tcl interpreter + and calls *note exec(): 4a8. on the contents of ‘.`className'.py’ + and ‘.`baseName'.py’. The path for the profile files is the ‘HOME’ + environment variable or, if that isn’t defined, then *note + os.curdir: 21fc. + + -- Attribute: tk + + The Tk application object created by instantiating *note Tk: + 3640. This provides access to the Tcl interpreter. Each + widget that is attached the same instance of *note Tk: 3640. + has the same value for its *note tk: 3643. attribute. + + -- Attribute: master + + The widget object that contains this widget. For *note Tk: + 3640, the `master' is *note None: 243. because it is the main + window. The terms `master' and `parent' are similar and + sometimes used interchangeably as argument names; however, + calling ‘winfo_parent()’ returns a string of the widget name + whereas *note master: 3644. returns the object. + `parent'/`child' reflects the tree-like relationship while + `master'/`slave' reflects the container structure. + + -- Attribute: children + + The immediate descendants of this widget as a *note dict: 16e. + with the child widget names as the keys and the child instance + objects as the values. + + -- Function: tkinter.Tcl (screenName=None, baseName=None, + className='Tk', useTk=False) + + The *note Tcl(): 3642. function is a factory function which creates + an object much like that created by the *note Tk: 3640. 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 *note Tcl(): 3642. object can have a + Toplevel window created (and the Tk subsystem initialized) by + calling its ‘loadtk()’ method. + +The modules that provide Tk support include: + +*note tkinter: 10e. + + Main Tkinter module. + +*note tkinter.colorchooser: 10f. + + Dialog to let the user choose a color. + +*note tkinter.commondialog: 110. + + Base class for the dialogs defined in the other modules listed + here. + +*note tkinter.filedialog: 112. + + Common dialogs to allow the user to specify a file to open or save. + +*note tkinter.font: 113. + + Utilities to help work with fonts. + +*note tkinter.messagebox: 114. + + Access to standard Tk dialog boxes. + +*note tkinter.scrolledtext: 115. + + Text widget with a vertical scroll bar built in. + +*note tkinter.simpledialog: 116. + + Basic dialogs and convenience functions. + +*note tkinter.ttk: 118. + + Themed widget set introduced in Tk 8.5, providing modern + alternatives for many of the classic widgets in the main *note + tkinter: 10e. module. + +Additional modules: + +‘_tkinter’ + + A binary module that contains the low-level interface to Tcl/Tk. + It is automatically imported by the main *note tkinter: 10e. + 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. + +*note idlelib: 93. + + Python’s Integrated Development and Learning Environment (IDLE). + Based on *note tkinter: 10e. + +‘tkinter.constants’ + + Symbolic constants that can be used in place of strings when + passing various parameters to Tkinter calls. Automatically + imported by the main *note tkinter: 10e. module. + +*note tkinter.dnd: 111. + + (experimental) Drag-and-drop support for *note tkinter: 10e. This + will become deprecated when it is replaced with the Tk DND. + +*note tkinter.tix: 117. + + (deprecated) An older third-party Tcl/Tk package that adds several + new widgets. Better alternatives for most can be found in *note + tkinter.ttk: 118. + +*note turtle: 120. + + Turtle graphics in a Tk window. + + +File: python.info, Node: Tkinter Life Preserver, Next: Threading model, Prev: Tkinter Modules, Up: tkinter — Python interface to Tcl/Tk + +5.25.1.3 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:: + + +File: python.info, Node: A Hello World Program, Next: Important Tk Concepts, Up: Tkinter Life Preserver + +5.25.1.4 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. + + 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() + +After the imports, the next line creates an instance of the *note Tk: +3640. 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 +‘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 ‘destroy()’ method of the root window. + +Finally, the ‘mainloop()’ method puts everything on the display, and +responds to user input until the program terminates. + + +File: python.info, Node: Important Tk Concepts, Next: Understanding How Tkinter Wraps Tcl/Tk, Prev: A Hello World Program, Up: Tkinter Life Preserver + +5.25.1.5 Important Tk Concepts +.............................. + +Even this simple program illustrates the following key Tk concepts: + +widgets + + A Tkinter user interface is made up of individual `widgets'. Each + widget is represented as a Python object, instantiated from classes + like ‘ttk.Frame’, ‘ttk.Label’, and ‘ttk.Button’. + +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. + +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. + +geometry management + + Widgets aren’t automatically added to the user interface when they + are created. A `geometry manager' like ‘grid’ controls where in + the user interface they are placed. + +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. + + +File: python.info, Node: Understanding How Tkinter Wraps Tcl/Tk, Next: How do I…? What option does…?, Prev: Important Tk Concepts, Up: Tkinter Life Preserver + +5.25.1.6 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 +applicaton’s *note Tk: 3640. 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. + + 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 + +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: + + * The commands used to create widgets (like ‘ttk::frame’) correspond + to widget classes in Tkinter. + + * Tcl widget options (like ‘-text’) correspond to keyword arguments + in Tkinter. + + * Widgets are referred to by a `pathname' in Tcl (like ‘.frm.btn’), + whereas Tkinter doesn’t use names but object references. + + * A widget’s place in the widget hierarchy is encoded in its + (hierarchical) pathname, which uses a ‘.’ (dot) as a path + separator. The pathname for the root window is just ‘.’ (dot). In + Tkinter, the hierarchy is defined not by pathname but by specifying + the parent widget when creating each child widget. + + * Operations which are implemented as separate `commands' in Tcl + (like ‘grid’ or ‘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 would is used in Tkinter. + + +File: python.info, Node: How do I…? What option does…?, Next: Navigating the Tcl/Tk Reference Manual, Prev: Understanding How Tkinter Wraps Tcl/Tk, Up: Tkinter Life Preserver + +5.25.1.7 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 *note print(): c13, can help you +identify what you need. + +To find out what configuration options are available on any widget, call +its ‘configure()’ method, which returns a dictionary containing a +variety of information about each object, including its default and +current values. Use ‘keys()’ to get just the names of each option. + + btn = ttk.Button(frm, ...) + print(btn.configure().keys()) + +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. + + print(set(btn.configure().keys()) - set(frm.configure().keys())) + +Similarly, you can find the available methods for a widget object using +the standard *note dir(): 20e. 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. + + print(dir(btn)) + print(set(dir(btn)) - set(dir(frm))) + + +File: python.info, Node: Navigating the Tcl/Tk Reference Manual, Prev: How do I…? What option does…?, Up: Tkinter Life Preserver + +5.25.1.8 Navigating the Tcl/Tk Reference Manual +............................................... + +As noted, the official Tk commands(1) 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, e.g. + + destroy . + grid .frm.btn -column 0 -row 0 + +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). + + .frm.btn invoke + .frm.lbl configure -text "Goodbye" + +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 (e.g., you’ll find the ‘invoke()’ method on the ttk::button(2) +man page), while functions that take a widget as a parameter often have +their own man page (e.g., grid(3)). + +You’ll find many common options and methods in the options(4) or +ttk::widget(5) 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, e.g., +‘winfo_x()’, ‘winfo_height()’, ‘winfo_viewable()’. You’d find +documentation for all of these in the winfo(6) man page. + + 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 ‘Widget’ class that all Tkinter + widgets inherit from). + + ---------- Footnotes ---------- + + (1) https://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm + + (2) https://www.tcl.tk/man/tcl8.6/TkCmd/ttk_button.htm + + (3) https://www.tcl.tk/man/tcl8.6/TkCmd/grid.htm + + (4) https://www.tcl.tk/man/tcl8.6/TkCmd/options.htm + + (5) https://www.tcl.tk/man/tcl8.6/TkCmd/ttk_widget.htm + + (6) https://www.tcl.tk/man/tcl8.6/TkCmd/winfo.htm + + +File: python.info, Node: Threading model, Next: Handy Reference, Prev: Tkinter Life Preserver, Up: tkinter — Python interface to Tcl/Tk + +5.25.1.9 Threading model +........................ + +Python and Tcl/Tk have very different threading models, which *note +tkinter: 10e. 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 *note Tk: 3640. object created by *note tkinter: 10e. contains a +Tcl interpreter. It also keeps track of which thread created that +interpreter. Calls to *note tkinter: 10e. can be made from any Python +thread. Internally, if a call comes from a thread other than the one +that created the *note Tk: 3640. 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 (i.e. +‘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 *note tkinter: 10e. calls made from threads other than the +one running the Tcl interpreter will fail. + +A number of special cases exist: + + * Tcl/Tk libraries can be built so they are not thread-aware. + In this case, *note tkinter: 10e. 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. + + * While *note tkinter: 10e. allows you to create more than one + instance of a *note Tk: 3640. 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 *note Tk: + 3640. at a time. Otherwise, it’s best to create them in + separate threads and ensure you’re running a thread-aware + Tcl/Tk build. + + * 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. + + * There are a few select *note tkinter: 10e. functions that + presently work only when called from the thread that created + the Tcl interpreter. + + +File: python.info, Node: Handy Reference, Next: File Handlers, Prev: Threading model, Up: tkinter — Python interface to Tcl/Tk + +5.25.1.10 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:: + + +File: python.info, Node: Setting Options, Next: The Packer, Up: Handy Reference + +5.25.1.11 Setting Options +......................... + +Options control things like the color and border width of a widget. +Options can be set in three ways: + +At object creation time, using keyword arguments + + fred = Button(self, fg="red", bg="blue") + +After object creation, treating the option name like a dictionary index + + fred["fg"] = "red" + fred["bg"] = "blue" + +Use the config() method to update multiple attrs subsequent to object creation + + fred.config(fg="red", bg="blue") + +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 ‘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 ‘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 ‘config()’ method +without arguments, or by calling the ‘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, ‘'relief'’) and whose values are +5-tuples. + +Some options, like ‘bg’ are synonyms for common options with long names +(‘bg’ is shorthand for “background”). Passing the ‘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 ‘('bg', 'background')’). + +Index Meaning Example + +--------------------------------------------------------------------- + +0 option name ‘'relief'’ + + +1 option name for database lookup ‘'relief'’ + + +2 option class for database lookup ‘'Relief'’ + + +3 default value ‘'raised'’ + + +4 current value ‘'groove'’ + + +Example: + + >>> print(fred.config()) + {'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')} + +Of course, the dictionary printed will include all the options available +and their values. This is meant only as an example. + + +File: python.info, Node: The Packer, Next: Packer Options, Prev: Setting Options, Up: Handy Reference + +5.25.1.12 The Packer +.................... + +The packer is one of Tk’s geometry-management mechanisms. Geometry +managers are used to specify the relative positioning of widgets within +their container - their mutual `master'. 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 `master' widget is determined by the size of the “slave +widgets” inside. The packer is used to control where slave widgets +appear inside the master 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 ‘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: + + fred.pack() # defaults to side = "top" + fred.pack(side="left") + fred.pack(expand=1) + + +File: python.info, Node: Packer Options, Next: Coupling Widget Variables, Prev: The Packer, Up: Handy Reference + +5.25.1.13 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. + +anchor + + Anchor type. Denotes where the packer is to place each slave in + its parcel. + +expand + + Boolean, ‘0’ or ‘1’. + +fill + + Legal values: ‘'x'’, ‘'y'’, ‘'both'’, ‘'none'’. + +ipadx and ipady + + A distance - designating internal padding on each side of the slave + widget. + +padx and pady + + A distance - designating external padding on each side of the slave + widget. + +side + + Legal values are: ‘'left'’, ‘'right'’, ‘'top'’, ‘'bottom'’. + + +File: python.info, Node: Coupling Widget Variables, Next: The Window Manager, Prev: Packer Options, Up: Handy Reference + +5.25.1.14 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 ‘variable’, ‘textvariable’, ‘onvalue’, ‘offvalue’, and +‘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 *note tkinter: 10e. it +is not possible to hand over an arbitrary Python variable to a widget +through a ‘variable’ or ‘textvariable’ option. The only kinds of +variables for which this works are variables that are subclassed from a +class called Variable, defined in *note tkinter: 10e. + +There are many useful subclasses of Variable already defined: +‘StringVar’, ‘IntVar’, ‘DoubleVar’, and ‘BooleanVar’. To read the +current value of such a variable, call the ‘get()’ method on it, and to +change its value you call the ‘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: + + 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() + + +File: python.info, Node: The Window Manager, Next: Tk Option Data Types, Prev: Coupling Widget Variables, Up: Handy Reference + +5.25.1.15 The Window Manager +............................ + +In Tk, there is a utility command, ‘wm’, for interacting with the window +manager. Options to the ‘wm’ command allow you to control things like +titles, placement, icon bitmaps, and the like. In *note tkinter: 10e, +these commands have been implemented as methods on the ‘Wm’ class. +Toplevel widgets are subclassed from the ‘Wm’ class, and so can call the +‘Wm’ methods directly. + +To get at the toplevel window that contains a given widget, you can +often just refer to the widget’s master. Of course if the widget has +been packed inside of a frame, the master won’t represent a toplevel +window. To get at the toplevel window that contains an arbitrary +widget, you can call the ‘_root()’ method. This method begins with an +underscore to denote the fact that this function is part of the +implementation, and not an interface to Tk functionality. + +Here are some examples of typical usage: + + 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() + + +File: python.info, Node: Tk Option Data Types, Next: Bindings and Events, Prev: The Window Manager, Up: Handy Reference + +5.25.1.16 Tk Option Data Types +.............................. + +anchor + + Legal values are points of the compass: ‘"n"’, ‘"ne"’, ‘"e"’, + ‘"se"’, ‘"s"’, ‘"sw"’, ‘"w"’, ‘"nw"’, and also ‘"center"’. + +bitmap + + There are eight built-in, named bitmaps: ‘'error'’, ‘'gray25'’, + ‘'gray50'’, ‘'hourglass'’, ‘'info'’, ‘'questhead'’, ‘'question'’, + ‘'warning'’. To specify an X bitmap filename, give the full path + to the file, preceded with an ‘@’, as in + ‘"@/usr/contrib/bitmap/gumby.bit"’. + +boolean + + You can pass integers 0 or 1 or the strings ‘"yes"’ or ‘"no"’. + +callback + + This is any Python function that takes no arguments. For example: + + def print_it(): + print("hi there") + fred["command"] = print_it + +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: ‘"#RGB"’, 8 bit: + ‘"#RRGGBB"’, 12 bit: ‘"#RRRGGGBBB"’, or 16 bit: ‘"#RRRRGGGGBBBB"’ + ranges, where R,G,B here represent any legal hex digit. See page + 160 of Ousterhout’s book for details. + +cursor + + The standard X cursor names from ‘cursorfont.h’ can be used, + without the ‘XC_’ prefix. For example to get a hand cursor + (‘XC_hand2’), use the string ‘"hand2"’. You can also specify a + bitmap and mask file of your own. See page 179 of Ousterhout’s + book. + +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: ‘c’ for + centimetres, ‘i’ for inches, ‘m’ for millimetres, ‘p’ for printer’s + points. For example, 3.5 inches is expressed as ‘"3.5i"’. + +font + + Tk uses a list font name format, such as ‘{courier 10 bold}’. Font + sizes with positive numbers are measured in points; sizes with + negative numbers are measured in pixels. + +geometry + + This is a string of the form ‘widthxheight’, where width and height + are measured in pixels for most widgets (in characters for widgets + displaying text). For example: ‘fred["geometry"] = "200x100"’. + +justify + + Legal values are the strings: ‘"left"’, ‘"center"’, ‘"right"’, and + ‘"fill"’. + +region + + This is a string with four space-delimited elements, each of which + is a legal distance (see above). For example: ‘"2 3 4 5"’ and ‘"3i + 2i 4.5i 2i"’ and ‘"3c 2c 4c 10.43c"’ are all legal regions. + +relief + + Determines what the border style of a widget will be. Legal values + are: ‘"raised"’, ‘"sunken"’, ‘"flat"’, ‘"groove"’, and ‘"ridge"’. + +scrollcommand + + This is almost always the ‘set()’ method of some scrollbar widget, + but can be any widget method that takes a single argument. + +wrap + + Must be one of: ‘"none"’, ‘"char"’, or ‘"word"’. + + +File: python.info, Node: Bindings and Events, Next: The index Parameter, Prev: Tk Option Data Types, Up: Handy Reference + +5.25.1.17 Bindings and Events +............................. + +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: + + def bind(self, sequence, func, add=''): + +where: + +sequence + + is a string that denotes the target kind of event. (See the + ‘bind(3tk)’ man page, and page 201 of John Ousterhout’s book, ‘Tcl + and the Tk Toolkit (2nd edition)’, for details). + +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'.) + +add + + is optional, either ‘''’ or ‘'+'’. Passing an empty string denotes + that this binding is to replace any other bindings that this event + is associated with. Passing a ‘'+'’ means that this function is to + be added to the list of functions bound to this event type. + +For example: + + def turn_red(self, event): + event.widget["activeforeground"] = "red" + + self.button.bind("<Enter>", self.turn_red) + +Notice how the widget field of the event is being accessed in the +‘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. + +Tk Tkinter Event Field Tk Tkinter Event Field + +---------------------------------------------------------------------- + +%f focus %A char + + +%h height %E send_event + + +%k keycode %K keysym + + +%s state %N keysym_num + + +%t time %T type + + +%w width %W widget + + +%x x %X x_root + + +%y y %Y y_root + + + +File: python.info, Node: The index Parameter, Next: Images, Prev: Bindings and Events, Up: Handy Reference + +5.25.1.18 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. + +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 *note tkinter: 10e. + functions to access these special points in text widgets: + +Text widget indexes + + The index notation for Text widgets is very rich and is best + described in the Tk man pages. + +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: + + * an integer which refers to the numeric position of the entry + in the widget, counted from the top, starting with 0; + + * the string ‘"active"’, which refers to the menu position that + is currently under the cursor; + + * the string ‘"last"’ which refers to the last menu item; + + * An integer preceded by ‘@’, as in ‘@6’, where the integer is + interpreted as a y pixel coordinate in the menu’s coordinate + system; + + * the string ‘"none"’, which indicates no menu entry at all, + most often used with menu.activate() to deactivate all + entries, and finally, + + * 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 ‘last’, + ‘active’, or ‘none’ may be interpreted as the above literals, + instead. + + +File: python.info, Node: Images, Prev: The index Parameter, Up: Handy Reference + +5.25.1.19 Images +................ + +Images of different formats can be created through the corresponding +subclass of ‘tkinter.Image’: + + * ‘BitmapImage’ for images in XBM format. + + * ‘PhotoImage’ for images in PGM, PPM, GIF and PNG formats. The + latter is supported starting with Tk 8.6. + +Either type of image is created through either the ‘file’ or the ‘data’ +option (other options are available as well). + +The image object can then be used wherever an ‘image’ option is +supported by some widget (e.g. 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. + +See also +........ + +The Pillow(1) package adds support for formats such as BMP, JPEG, TIFF, +and WebP, among others. + + ---------- Footnotes ---------- + + (1) https://python-pillow.org/ + + +File: python.info, Node: File Handlers, Prev: Handy Reference, Up: tkinter — Python interface to Tcl/Tk + +5.25.1.20 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: + + import tkinter + widget = tkinter.Tk() + mask = tkinter.READABLE | tkinter.WRITABLE + widget.tk.createfilehandler(file, mask, callback) + ... + widget.tk.deletefilehandler(file) + +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 *note BufferedIOBase: 949. or *note TextIOBase: f50. +*note read(): 2374. or *note readline(): 1ce1. methods, since these will +insist on reading a predefined number of bytes. For sockets, the *note +recv(): a22. or *note recvfrom(): a23. methods will work fine; for other +files, use raw reads or ‘os.read(file.fileno(), maxbytecount)’. + + -- Method: Widget.tk.createfilehandler (file, mask, func) + + Registers the file handler callback function `func'. The `file' + argument may either be an object with a *note fileno(): 24aa. + 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: + + callback(file, mask) + + -- Method: Widget.tk.deletefilehandler (file) + + Unregisters a file handler. + + -- Data: tkinter.READABLE + -- Data: tkinter.WRITABLE + -- Data: tkinter.EXCEPTION + + Constants used in the `mask' arguments. + + +File: python.info, Node: tkinter colorchooser — Color choosing dialog, Next: tkinter font — Tkinter font wrapper, Prev: tkinter — Python interface to Tcl/Tk, Up: Graphical User Interfaces with Tk + +5.25.2 ‘tkinter.colorchooser’ — Color choosing dialog +----------------------------------------------------- + +`Source code:' Lib/tkinter/colorchooser.py(1) + +__________________________________________________________________ + +The *note tkinter.colorchooser: 10f. module provides the *note Chooser: +3661. class as an interface to the native color picker dialog. +‘Chooser’ implements a modal color choosing dialog window. The +‘Chooser’ class inherits from the *note Dialog: 3662. class. + + -- Class: tkinter.colorchooser.Chooser (master=None, **options) + + -- Function: tkinter.colorchooser.askcolor (color=None, **options) + + Create a color choosing dialog. A call to this method will show + the window, wait for the user to make a selection, and return the + selected color (or ‘None’) to the caller. + +See also +........ + +Module *note tkinter.commondialog: 110. + + Tkinter standard dialog module + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/tkinter/colorchooser.py + + +File: python.info, Node: tkinter font — Tkinter font wrapper, Next: Tkinter Dialogs, Prev: tkinter colorchooser — Color choosing dialog, Up: Graphical User Interfaces with Tk + +5.25.3 ‘tkinter.font’ — Tkinter font wrapper +-------------------------------------------- + +`Source code:' Lib/tkinter/font.py(1) + +__________________________________________________________________ + +The *note tkinter.font: 113. module provides the *note Font: 1310. class +for creating and using named fonts. + +The different font weights and slants are: + + -- Data: tkinter.font.NORMAL + -- Data: tkinter.font.BOLD + -- Data: tkinter.font.ITALIC + -- Data: tkinter.font.ROMAN + + -- Class: tkinter.font.Font (root=None, font=None, name=None, + exists=False, **options) + + The *note Font: 1310. 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. + + arguments: + + `font' - font specifier tuple (family, size, options) + `name' - unique font name + `exists' - self points to existing named font if true + + additional keyword options (ignored if `font' is specified): + + `family' - font family i.e. Courier, Times + `size' - font size + If `size' is positive it is interpreted as size in points. + If `size' is a negative number its absolute value is treated + as size in pixels. + `weight' - font emphasis (NORMAL, BOLD) + `slant' - ROMAN, ITALIC + `underline' - font underlining (0 - none, 1 - underline) + `overstrike' - font strikeout (0 - none, 1 - strikeout) + + -- Method: actual (option=None, displayof=None) + + Return the attributes of the font. + + -- Method: cget (option) + + Retrieve an attribute of the font. + + -- Method: config (**options) + + Modify attributes of the font. + + -- Method: copy () + + Return new instance of the current font. + + -- Method: measure (text, displayof=None) + + Return amount of space the text would occupy on the specified + display when formatted in the current font. If no display is + specified then the main application window is assumed. + + -- Method: metrics (*options, **kw) + + Return font-specific data. Options include: + + `ascent' - distance between baseline and highest point that a + + character of the font can occupy + + `descent' - distance between baseline and lowest point that a + + character of the font can occupy + + `linespace' - minimum vertical separation necessary between any two + + characters of the font that ensures no vertical overlap + between lines. + + `fixed' - 1 if font is fixed-width else 0 + + -- Function: tkinter.font.families (root=None, displayof=None) + + Return the different font families. + + -- Function: tkinter.font.names (root=None) + + Return the names of defined fonts. + + -- Function: tkinter.font.nametofont (name, root=None) + + Return a *note Font: 1310. representation of a tk named font. + + Changed in version 3.10: The `root' parameter was added. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tkinter/font.py + + +File: python.info, Node: Tkinter Dialogs, Next: tkinter messagebox — Tkinter message prompts, Prev: tkinter font — Tkinter font wrapper, Up: Graphical User Interfaces with Tk + +5.25.4 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. + + +File: python.info, Node: tkinter simpledialog — Standard Tkinter input dialogs, Next: tkinter filedialog — File selection dialogs, Up: Tkinter Dialogs + +5.25.4.1 ‘tkinter.simpledialog’ — Standard Tkinter input dialogs +................................................................ + +`Source code:' Lib/tkinter/simpledialog.py(1) + +__________________________________________________________________ + +The *note tkinter.simpledialog: 116. module contains convenience classes +and functions for creating simple modal dialogs to get a value from the +user. + + -- Function: tkinter.simpledialog.askfloat (title, prompt, **kw) + -- Function: tkinter.simpledialog.askinteger (title, prompt, **kw) + -- 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. + + -- Class: tkinter.simpledialog.Dialog (parent, title=None) + + The base class for custom dialogs. + + -- Method: body (master) + + Override to construct the dialog’s interface and return + the widget that should have initial focus. + + -- Method: buttonbox () + + Default behaviour adds OK and Cancel buttons. Override + for custom button layouts. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/tkinter/simpledialog.py + + +File: python.info, Node: tkinter filedialog — File selection dialogs, Next: tkinter commondialog — Dialog window templates, Prev: tkinter simpledialog — Standard Tkinter input dialogs, Up: Tkinter Dialogs + +5.25.4.2 ‘tkinter.filedialog’ — File selection dialogs +...................................................... + +`Source code:' Lib/tkinter/filedialog.py(1) + +__________________________________________________________________ + +The *note tkinter.filedialog: 112. module provides classes and factory +functions for creating file/directory selection windows. + +* Menu: + +* Native Load/Save Dialogs:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/tkinter/filedialog.py + + +File: python.info, Node: Native Load/Save Dialogs, Up: tkinter filedialog — File selection dialogs + +5.25.4.3 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: + + `parent' - the window to place the dialog on top of + + `title' - the title of the window + + `initialdir' - the directory that the dialog starts in + + `initialfile' - the file selected upon opening of the dialog + + `filetypes' - a sequence of (label, pattern) tuples, ‘*’ wildcard is allowed + + `defaultextension' - default extension to append to file (save dialogs) + + `multiple' - when true, selection of multiple items is allowed + +`Static factory functions' + +The below functions when called create a modal, native look-and-feel +dialog, wait for the user’s selection, then return the selected value(s) +or ‘None’ to the caller. + + -- Function: tkinter.filedialog.askopenfile (mode='r', **options) + -- Function: tkinter.filedialog.askopenfiles (mode='r', **options) + + The above two functions create an *note Open: 367e. dialog and + return the opened file object(s) in read-only mode. + + -- Function: tkinter.filedialog.asksaveasfile (mode='w', **options) + + Create a *note SaveAs: 3680. dialog and return a file object opened + in write-only mode. + + -- Function: tkinter.filedialog.askopenfilename (**options) + -- Function: tkinter.filedialog.askopenfilenames (**options) + + The above two functions create an *note Open: 367e. dialog and + return the selected filename(s) that correspond to existing + file(s). + + -- Function: tkinter.filedialog.asksaveasfilename (**options) + + Create a *note SaveAs: 3680. dialog and return the selected + filename. + + -- Function: tkinter.filedialog.askdirectory (**options) + + Prompt user to select a directory. + Additional keyword option: + `mustexist' - determines if selection must be an existing directory. + + -- Class: tkinter.filedialog.Open (master=None, **options) + -- Class: tkinter.filedialog.SaveAs (master=None, **options) + + The above two classes provide native dialog windows for saving and + loading files. + +`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. + + -- Class: tkinter.filedialog.Directory (master=None, **options) + + Create a dialog prompting the user to select a directory. + + Note: The `FileDialog' class should be subclassed for custom event + handling and behaviour. + + -- Class: tkinter.filedialog.FileDialog (master, title=None) + + Create a basic file selection dialog. + + -- Method: cancel_command (event=None) + + Trigger the termination of the dialog window. + + -- Method: dirs_double_event (event) + + Event handler for double-click event on directory. + + -- Method: dirs_select_event (event) + + Event handler for click event on directory. + + -- Method: files_double_event (event) + + Event handler for double-click event on file. + + -- Method: files_select_event (event) + + Event handler for single-click event on file. + + -- Method: filter_command (event=None) + + Filter the files by directory. + + -- Method: get_filter () + + Retrieve the file filter currently in use. + + -- Method: get_selection () + + Retrieve the currently selected item. + + -- Method: go (dir_or_file=os.curdir, pattern='*', default='', + key=None) + + Render dialog and start event loop. + + -- Method: ok_event (event) + + Exit dialog returning current selection. + + -- Method: quit (how=None) + + Exit dialog returning filename, if any. + + -- Method: set_filter (dir, pat) + + Set the file filter. + + -- Method: set_selection (file) + + Update the current file selection to `file'. + + -- Class: tkinter.filedialog.LoadFileDialog (master, title=None) + + A subclass of FileDialog that creates a dialog window for selecting + an existing file. + + -- Method: ok_command () + + Test that a file is provided and that the selection indicates + an already existing file. + + -- Class: tkinter.filedialog.SaveFileDialog (master, title=None) + + A subclass of FileDialog that creates a dialog window for selecting + a destination file. + + -- 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. + + +File: python.info, Node: tkinter commondialog — Dialog window templates, Prev: tkinter filedialog — File selection dialogs, Up: Tkinter Dialogs + +5.25.4.4 ‘tkinter.commondialog’ — Dialog window templates +......................................................... + +`Source code:' Lib/tkinter/commondialog.py(1) + +__________________________________________________________________ + +The *note tkinter.commondialog: 110. module provides the *note Dialog: +3662. class that is the base class for dialogs defined in other +supporting modules. + + -- Class: tkinter.commondialog.Dialog (master=None, **options) + + -- Method: show (color=None, **options) + + Render the Dialog window. + +See also +........ + +Modules *note tkinter.messagebox: 114, *note Reading and Writing Files: +16cb. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/tkinter/commondialog.py + + +File: python.info, Node: tkinter messagebox — Tkinter message prompts, Next: tkinter scrolledtext — Scrolled Text Widget, Prev: Tkinter Dialogs, Up: Graphical User Interfaces with Tk + +5.25.5 ‘tkinter.messagebox’ — Tkinter message prompts +----------------------------------------------------- + +`Source code:' Lib/tkinter/messagebox.py(1) + +__________________________________________________________________ + +The *note tkinter.messagebox: 114. module provides a template base class +as well as a variety of convenience methods for commonly used +configurations. The message boxes are modal and will return a subset of +(True, False, OK, None, Yes, No) based on the user’s selection. Common +message box styles and layouts include but are not limited to: + +�[image src="python-figures/tk_msg.png"�] + + +Figure + + -- Class: tkinter.messagebox.Message (master=None, **options) + + Create a default information message box. + +`Information message box' + + -- Method: tkinter.messagebox.showinfo (title=None, message=None, + **options) + +`Warning message boxes' + + -- Method: tkinter.messagebox.showwarning (title=None, message=None, + **options) + -- Method: tkinter.messagebox.showerror (title=None, message=None, + **options) + +`Question message boxes' + + -- Method: tkinter.messagebox.askquestion (title=None, message=None, + **options) + -- Method: tkinter.messagebox.askokcancel (title=None, message=None, + **options) + -- Method: tkinter.messagebox.askretrycancel (title=None, message=None, + **options) + -- Method: tkinter.messagebox.askyesno (title=None, message=None, + **options) + -- Method: tkinter.messagebox.askyesnocancel (title=None, message=None, + **options) + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/tkinter/messagebox.py + + +File: python.info, Node: tkinter scrolledtext — Scrolled Text Widget, Next: tkinter dnd — Drag and drop support, Prev: tkinter messagebox — Tkinter message prompts, Up: Graphical User Interfaces with Tk + +5.25.6 ‘tkinter.scrolledtext’ — Scrolled Text Widget +---------------------------------------------------- + +`Source code:' Lib/tkinter/scrolledtext.py(1) + +__________________________________________________________________ + +The *note tkinter.scrolledtext: 115. 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 *note ScrolledText: +36a7. 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 ‘Frame’, and the +methods of the ‘Grid’ and ‘Pack’ geometry managers are acquired from the +‘Frame’ object. This allows the *note ScrolledText: 36a7. widget to be +used directly to achieve most normal geometry management behavior. + +Should more specific control be necessary, the following attributes are +available: + + -- Class: tkinter.scrolledtext.ScrolledText (master=None, **kw) + + -- Attribute: frame + + The frame which surrounds the text and scroll bar widgets. + + -- Attribute: vbar + + The scroll bar widget. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/tkinter/scrolledtext.py + + +File: python.info, Node: tkinter dnd — Drag and drop support, Next: tkinter ttk — Tk themed widgets, Prev: tkinter scrolledtext — Scrolled Text Widget, Up: Graphical User Interfaces with Tk + +5.25.7 ‘tkinter.dnd’ — Drag and drop support +-------------------------------------------- + +`Source code:' Lib/tkinter/dnd.py(1) + +__________________________________________________________________ + + Note: This is experimental and due to be deprecated when it is + replaced with the Tk DND. + +The *note tkinter.dnd: 111. 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 +*note Bindings and Events: 3654.). The function should call *note +dnd_start(): 36ac, 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: + + 1. Top-down search of area under mouse for target widget + + * Target widget should have a callable `dnd_accept' attribute + + * If `dnd_accept' is not present or returns None, search moves + to parent widget + + * If no target widget is found, then the target object is None + + 2. Call to `<old_target>.dnd_leave(source, event)' + + 3. Call to `<new_target>.dnd_enter(source, event)' + + 4. Call to `<target>.dnd_commit(source, event)' to notify of drop + + 5. Call to `<source>.dnd_end(target, event)' to signal end of + drag-and-drop + + -- 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. + + -- Method: cancel (event=None) + + Cancel the drag-and-drop process. + + -- Method: finish (event, commit=0) + + Execute end of drag-and-drop functions. + + -- Method: on_motion (event) + + Inspect area below mouse for target objects while drag is + performed. + + -- Method: on_release (event) + + Signal end of drag when the release pattern is triggered. + + -- Function: tkinter.dnd.dnd_start (source, event) + + Factory function for drag-and-drop process. + +See also +........ + +*note Bindings and Events: 3654. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tkinter/dnd.py + + +File: python.info, Node: tkinter ttk — Tk themed widgets, Next: tkinter tix — Extension widgets for Tk, Prev: tkinter dnd — Drag and drop support, Up: Graphical User Interfaces with Tk + +5.25.8 ‘tkinter.ttk’ — Tk themed widgets +---------------------------------------- + +`Source code:' Lib/tkinter/ttk.py(1) + +__________________________________________________________________ + +The *note tkinter.ttk: 118. 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 *note tkinter.ttk: 118. is to separate, to the extent +possible, the code implementing a widget’s behavior from the code +implementing its appearance. + +See also +........ + +Tk Widget Styling Support(2) + + A document introducing theming support for Tk + +* Menu: + +* Using Ttk:: +* Ttk Widgets:: +* Widget:: +* Combobox:: +* Spinbox:: +* Notebook:: +* Progressbar:: +* Separator:: +* Sizegrip:: +* Treeview:: +* Ttk Styling:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tkinter/ttk.py + + (2) https://core.tcl.tk/tips/doc/trunk/tip/48.md + + +File: python.info, Node: Using Ttk, Next: Ttk Widgets, Up: tkinter ttk — Tk themed widgets + +5.25.8.1 Using Ttk +.................. + +To start using Ttk, import its module: + + from tkinter import ttk + +To override the basic Tk widgets, the import should follow the Tk +import: + + from tkinter import * + from tkinter.ttk import * + +That code causes several *note tkinter.ttk: 118. widgets (‘Button’, +‘Checkbutton’, ‘Entry’, ‘Frame’, ‘Label’, ‘LabelFrame’, ‘Menubutton’, +‘PanedWindow’, ‘Radiobutton’, ‘Scale’ and ‘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 ‘ttk.Style’ class for +improved styling effects. + +See also +........ + +Converting existing applications to use Tile widgets(1) + + A monograph (using Tcl terminology) about differences typically + encountered when moving applications to use the new widgets. + + ---------- Footnotes ---------- + + (1) https://tktable.sourceforge.net/tile/doc/converting.txt + + +File: python.info, Node: Ttk Widgets, Next: Widget, Prev: Using Ttk, Up: tkinter ttk — Tk themed widgets + +5.25.8.2 Ttk Widgets +.................... + +Ttk comes with 18 widgets, twelve of which already existed in tkinter: +‘Button’, ‘Checkbutton’, ‘Entry’, ‘Frame’, ‘Label’, ‘LabelFrame’, +‘Menubutton’, ‘PanedWindow’, ‘Radiobutton’, ‘Scale’, ‘Scrollbar’, and +*note Spinbox: 7f6. The other six are new: *note Combobox: 36b6, *note +Notebook: 36b7, *note Progressbar: 36b8, ‘Separator’, ‘Sizegrip’ and +*note Treeview: 6ec. And all them are subclasses of *note Widget: 36b9. + +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: + + l1 = tkinter.Label(text="Test", fg="black", bg="white") + l2 = tkinter.Label(text="Test", fg="black", bg="white") + +Ttk code: + + 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") + +For more information about *note TtkStyling: 36ba, see the *note Style: +36bb. class documentation. + + +File: python.info, Node: Widget, Next: Combobox, Prev: Ttk Widgets, Up: tkinter ttk — Tk themed widgets + +5.25.8.3 Widget +............... + +‘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. + + +File: python.info, Node: Standard Options, Next: Scrollable Widget Options, Up: Widget + +5.25.8.4 Standard Options +......................... + +All the ‘ttk’ Widgets accepts the following options: + + Option Description + + ----------------------------------------------------------------------------------- + + class 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. + + + cursor Specifies the mouse cursor to be used for the widget. If set to + the empty string (the default), the cursor is inherited for the + parent widget. + + + takefocus 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. + + + style May be used to specify a custom widget style. + + + +File: python.info, Node: Scrollable Widget Options, Next: Label Options, Prev: Standard Options, Up: Widget + +5.25.8.5 Scrollable Widget Options +.................................. + +The following options are supported by widgets that are controlled by a +scrollbar. + + Option Description + + ----------------------------------------------------------------------------------- + + xscrollcommand Used to communicate with horizontal scrollbars. + + When the view in the widget’s window change, the widget + will generate a Tcl command based on the scrollcommand. + + Usually this option consists of the method + ‘Scrollbar.set()’ of some scrollbar. This will cause the + scrollbar to be updated whenever the view in the window + changes. + + + yscrollcommand Used to communicate with vertical scrollbars. For some + more information, see above. + + + +File: python.info, Node: Label Options, Next: Compatibility Options, Prev: Scrollable Widget Options, Up: Widget + +5.25.8.6 Label Options +...................... + +The following options are supported by labels, buttons and other +button-like widgets. + + Option Description + + ----------------------------------------------------------------------------------- + + text Specifies a text string to be displayed inside the widget. + + + textvariable Specifies a name whose value will be used in place of the + text option resource. + + + underline If set, specifies the index (0-based) of a character to + underline in the text string. The underline character is + used for mnemonic activation. + + + image 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 *note Style.map(): 1323, 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. + + + compound Specifies how to display the image relative to the text, in + the case both text and images options are present. Valid + values are: + + * text: display text only + + * image: display image only + + * top, bottom, left, right: display image above, below, + left of, or right of the text, respectively. + + * none: the default. display the image if present, + otherwise the text. + + + width 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. + + + +File: python.info, Node: Compatibility Options, Next: Widget States, Prev: Label Options, Up: Widget + +5.25.8.7 Compatibility Options +.............................. + + Option Description + + ---------------------------------------------------------------------------------- + + state 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 *note Widget.state(): 36c1. method does not + affect this option. + + + +File: python.info, Node: Widget States, Next: ttk Widget, Prev: Compatibility Options, Up: Widget + +5.25.8.8 Widget States +...................... + +The widget state is a bitmap of independent state flags. + + Flag Description + + ----------------------------------------------------------------------------------- + + active The mouse cursor is over the widget and pressing a mouse button + will cause some action to occur + + + disabled Widget is disabled under program control + + + focus Widget has keyboard focus + + + pressed Widget is being pressed + + + selected “On”, “true”, or “current” for things like Checkbuttons and + radiobuttons + + + background 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 + + + readonly Widget should not allow user modification + + + alternate A widget-specific alternate display format + + + invalid The widget’s value is invalid + + +A state specification is a sequence of state names, optionally prefixed +with an exclamation point indicating that the bit is off. + + +File: python.info, Node: ttk Widget, Prev: Widget States, Up: Widget + +5.25.8.9 ttk.Widget +................... + +Besides the methods described below, the ‘ttk.Widget’ supports the +methods ‘tkinter.Widget.cget()’ and ‘tkinter.Widget.configure()’. + + -- Class: tkinter.ttk.Widget + + -- 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. + + -- Method: instate (statespec, callback=None, *args, **kw) + + Test the widget’s state. If a callback is not specified, + returns ‘True’ if the widget state matches `statespec' and + ‘False’ otherwise. If callback is specified then it is called + with args if widget state matches `statespec'. + + -- 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. + + `statespec' will usually be a list or a tuple. + + +File: python.info, Node: Combobox, Next: Spinbox, Prev: Widget, Up: tkinter ttk — Tk themed widgets + +5.25.8.10 Combobox +.................. + +The ‘ttk.Combobox’ widget combines a text field with a pop-down list of +values. This widget is a subclass of ‘Entry’. + +Besides the methods inherited from *note Widget: 36b9.: ‘Widget.cget()’, +‘Widget.configure()’, *note Widget.identify(): 36c4, *note +Widget.instate(): 36c5. and *note Widget.state(): 36c1, and the +following inherited from ‘Entry’: ‘Entry.bbox()’, ‘Entry.delete()’, +‘Entry.icursor()’, ‘Entry.index()’, ‘Entry.insert()’, +‘Entry.selection()’, ‘Entry.xview()’, it has some other methods, +described at ‘ttk.Combobox’. + +* Menu: + +* Options:: +* Virtual events:: +* ttk.Combobox: ttk Combobox. + + +File: python.info, Node: Options, Next: Virtual events, Up: Combobox + +5.25.8.11 Options +................. + +This widget accepts the following specific options: + + Option Description + + ----------------------------------------------------------------------------------- + + exportselection Boolean value. If set, the widget selection is linked to + the Window Manager selection (which can be returned by + invoking Misc.selection_get, for example). + + + justify Specifies how the text is aligned within the widget. One + of “left”, “center”, or “right”. + + + height Specifies the height of the pop-down listbox, in rows. + + + postcommand A script (possibly registered with Misc.register) that is + called immediately before displaying the values. It may + specify which values to display. + + + state One of “normal”, “readonly”, or “disabled”. In the + “readonly” state, the value may not be edited directly, + and the user can only selection 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. + + + textvariable 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 + ‘tkinter.StringVar’. + + + values Specifies the list of values to display in the drop-down + listbox. + + + width Specifies an integer value indicating the desired width of + the entry window, in average-size characters of the + widget’s font. + + + +File: python.info, Node: Virtual events, Next: ttk Combobox, Prev: Options, Up: Combobox + +5.25.8.12 Virtual events +........................ + +The combobox widgets generates a `<<ComboboxSelected>>' virtual event +when the user selects an element from the list of values. + + +File: python.info, Node: ttk Combobox, Prev: Virtual events, Up: Combobox + +5.25.8.13 ttk.Combobox +...................... + + -- Class: tkinter.ttk.Combobox + + -- 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. + + -- Method: get () + + Returns the current value of the combobox. + + -- Method: set (value) + + Sets the value of the combobox to `value'. + + +File: python.info, Node: Spinbox, Next: Notebook, Prev: Combobox, Up: tkinter ttk — Tk themed widgets + +5.25.8.14 Spinbox +................. + +The ‘ttk.Spinbox’ widget is a ‘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 ‘Entry’. + +Besides the methods inherited from *note Widget: 36b9.: ‘Widget.cget()’, +‘Widget.configure()’, *note Widget.identify(): 36c4, *note +Widget.instate(): 36c5. and *note Widget.state(): 36c1, and the +following inherited from ‘Entry’: ‘Entry.bbox()’, ‘Entry.delete()’, +‘Entry.icursor()’, ‘Entry.index()’, ‘Entry.insert()’, ‘Entry.xview()’, +it has some other methods, described at ‘ttk.Spinbox’. + +* Menu: + +* Options: Options<2>. +* Virtual events: Virtual events<2>. +* ttk.Spinbox: ttk Spinbox. + + +File: python.info, Node: Options<2>, Next: Virtual events<2>, Up: Spinbox + +5.25.8.15 Options +................. + +This widget accepts the following specific options: + +Option Description + +-------------------------------------------------------------------------------------- + +from Float value. If set, this is the minimum value to which + the decrement button will decrement. Must be spelled as + ‘from_’ when used as an argument, since ‘from’ is a + Python keyword. + + +to Float value. If set, this is the maximum value to which + the increment button will increment. + + +increment Float value. Specifies the amount which the + increment/decrement buttons change the value. Defaults + to 1.0. + + +values 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. + + +wrap Boolean value. If ‘True’, increment and decrement + buttons will cycle from the ‘to’ value to the ‘from’ + value or the ‘from’ value to the ‘to’ value, + respectively. + + +format 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. + + +command Python callable. Will be called with no arguments + whenever either of the increment or decrement buttons + are pressed. + + + +File: python.info, Node: Virtual events<2>, Next: ttk Spinbox, Prev: Options<2>, Up: Spinbox + +5.25.8.16 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>. + + +File: python.info, Node: ttk Spinbox, Prev: Virtual events<2>, Up: Spinbox + +5.25.8.17 ttk.Spinbox +..................... + + -- Class: tkinter.ttk.Spinbox + + -- Method: get () + + Returns the current value of the spinbox. + + -- Method: set (value) + + Sets the value of the spinbox to `value'. + + +File: python.info, Node: Notebook, Next: Progressbar, Prev: Spinbox, Up: tkinter ttk — Tk themed widgets + +5.25.8.18 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:: +* ttk.Notebook: ttk Notebook. + + +File: python.info, Node: Options<3>, Next: Tab Options, Up: Notebook + +5.25.8.19 Options +................. + +This widget accepts the following specific options: + + Option Description + + ----------------------------------------------------------------------------------- + + height 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. + + + padding 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. + + + width 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. + + + +File: python.info, Node: Tab Options, Next: Tab Identifiers, Prev: Options<3>, Up: Notebook + +5.25.8.20 Tab Options +..................... + +There are also specific options for tabs: + + Option Description + + ----------------------------------------------------------------------------------- + + state Either “normal”, “disabled” or “hidden”. If “disabled”, then + the tab is not selectable. If “hidden”, then the tab is not + shown. + + + sticky 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 ‘grid()’ geometry manager. + + + padding 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. + + + text Specifies a text to be displayed in the tab. + + + image Specifies an image to display in the tab. See the option image + described in *note Widget: 36b9. + + + compound Specifies how to display the image relative to the text, in the + case both options text and image are present. See + *note Label Options: 36bf. for legal values. + + + underline Specifies the index (0-based) of a character to underline in the + text string. The underlined character is used for mnemonic + activation if *note Notebook.enable_traversal(): 36d6. is + called. + + + +File: python.info, Node: Tab Identifiers, Next: Virtual Events, Prev: Tab Options, Up: Notebook + +5.25.8.21 Tab Identifiers +......................... + +The tab_id present in several methods of ‘ttk.Notebook’ may take any of +the following forms: + + * An integer between zero and the number of tabs + + * The name of a child window + + * A positional specification of the form “@x,y”, which identifies the + tab + + * The literal string “current”, which identifies the currently + selected tab + + * The literal string “end”, which returns the number of tabs (only + valid for *note Notebook.index(): 36d8.) + + +File: python.info, Node: Virtual Events, Next: ttk Notebook, Prev: Tab Identifiers, Up: Notebook + +5.25.8.22 Virtual Events +........................ + +This widget generates a `<<NotebookTabChanged>>' virtual event after a +new tab is selected. + + +File: python.info, Node: ttk Notebook, Prev: Virtual Events, Up: Notebook + +5.25.8.23 ttk.Notebook +...................... + + -- Class: tkinter.ttk.Notebook + + -- 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 *note Tab Options: 36d5. for the list of available + options. + + -- Method: forget (tab_id) + + Removes the tab specified by `tab_id', unmaps and unmanages + the associated window. + + -- 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 *note add(): + 36db. command. + + -- Method: identify (x, y) + + Returns the name of the tab element at position `x', `y', or + the empty string if none. + + -- 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”. + + -- 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 *note Tab Options: 36d5. for the list of available + options. + + -- 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. + + -- 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. + + -- Method: tabs () + + Returns a list of windows managed by the notebook. + + -- 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: + + * ‘Control-Tab’: selects the tab following the currently + selected one. + + * ‘Shift-Control-Tab’: selects the tab preceding the + currently selected one. + + * ‘Alt-K’: where `K' is the mnemonic (underlined) character + of any tab, will select that tab. + + Multiple notebooks in a single toplevel may be enabled for + traversal, including nested notebooks. However, notebook + traversal only works properly if all panes have the notebook + they are in as master. + + +File: python.info, Node: Progressbar, Next: Separator, Prev: Notebook, Up: tkinter ttk — Tk themed widgets + +5.25.8.24 Progressbar +..................... + +The ‘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. + + +File: python.info, Node: Options<4>, Next: ttk Progressbar, Up: Progressbar + +5.25.8.25 Options +................. + +This widget accepts the following specific options: + + Option Description + + ----------------------------------------------------------------------------------- + + orient One of “horizontal” or “vertical”. Specifies the orientation of + the progress bar. + + + length Specifies the length of the long axis of the progress bar (width + if horizontal, height if vertical). + + + mode One of “determinate” or “indeterminate”. + + + maximum A number specifying the maximum value. Defaults to 100. + + + value 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'. + + + variable 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. + + + phase 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. + + + +File: python.info, Node: ttk Progressbar, Prev: Options<4>, Up: Progressbar + +5.25.8.26 ttk.Progressbar +......................... + + -- Class: tkinter.ttk.Progressbar + + -- Method: start (interval=None) + + Begin autoincrement mode: schedules a recurring timer event + that calls *note Progressbar.step(): 36e7. every `interval' + milliseconds. If omitted, `interval' defaults to 50 + milliseconds. + + -- Method: step (amount=None) + + Increments the progress bar’s value by `amount'. + + `amount' defaults to 1.0 if omitted. + + -- Method: stop () + + Stop autoincrement mode: cancels any recurring timer event + initiated by *note Progressbar.start(): 36e6. for this + progress bar. + + +File: python.info, Node: Separator, Next: Sizegrip, Prev: Progressbar, Up: tkinter ttk — Tk themed widgets + +5.25.8.27 Separator +................... + +The ‘ttk.Separator’ widget displays a horizontal or vertical separator +bar. + +It has no other methods besides the ones inherited from ‘ttk.Widget’. + +* Menu: + +* Options: Options<5>. + + +File: python.info, Node: Options<5>, Up: Separator + +5.25.8.28 Options +................. + +This widget accepts the following specific option: + + Option Description + + ---------------------------------------------------------------------------------- + + orient One of “horizontal” or “vertical”. Specifies the orientation of + the separator. + + + +File: python.info, Node: Sizegrip, Next: Treeview, Prev: Separator, Up: tkinter ttk — Tk themed widgets + +5.25.8.29 Sizegrip +.................. + +The ‘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 ‘ttk.Widget’. + +* Menu: + +* Platform-specific notes:: +* Bugs:: + + +File: python.info, Node: Platform-specific notes, Next: Bugs, Up: Sizegrip + +5.25.8.30 Platform-specific notes +................................. + + * On macOS, toplevel windows automatically include a built-in size + grip by default. Adding a ‘Sizegrip’ is harmless, since the + built-in grip will just mask the widget. + + +File: python.info, Node: Bugs, Prev: Platform-specific notes, Up: Sizegrip + +5.25.8.31 Bugs +.............. + + * If the containing toplevel’s position was specified relative to the + right or bottom of the screen (e.g. ….), the ‘Sizegrip’ widget + will not resize the window. + + * This widget supports only “southeast” resizing. + + +File: python.info, Node: Treeview, Next: Ttk Styling, Prev: Sizegrip, Up: tkinter ttk — Tk themed widgets + +5.25.8.32 Treeview +.................. + +The ‘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 ‘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 *note Column +Identifiers: 36ef. + +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 ‘{}’. 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 *note Scrollable Widget Options: +36be. and the methods *note Treeview.xview(): 36f0. and *note +Treeview.yview(): 36f1. + +* Menu: + +* Options: Options<6>. +* Item Options:: +* Tag Options:: +* Column Identifiers:: +* Virtual Events: Virtual Events<2>. +* ttk.Treeview: ttk Treeview. + + +File: python.info, Node: Options<6>, Next: Item Options, Up: Treeview + +5.25.8.33 Options +................. + +This widget accepts the following specific options: + + Option Description + + ---------------------------------------------------------------------------------- + + columns A list of column identifiers, specifying the number of + columns and their names. + + + displaycolumns 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”. + + + height Specifies the number of rows which should be visible. + Note: the requested width is determined from the sum of + the column widths. + + + padding Specifies the internal padding for the widget. The + padding is a list of up to four length specifications. + + + selectmode 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. + + + show A list containing zero or more of the following values, + specifying which elements of the tree to display. + + * tree: display tree labels in column #0. + + * headings: display the heading row. + + The default is “tree headings”, i.e., show all elements. + + `Note': Column #0 always refers to the tree column, even + if show=”tree” is not specified. + + + +File: python.info, Node: Item Options, Next: Tag Options, Prev: Options<6>, Up: Treeview + +5.25.8.34 Item Options +...................... + +The following item options may be specified for items in the insert and +item widget commands. + + Option Description + + --------------------------------------------------------------------------------- + + text The textual label to display for the item. + + + image A Tk Image, displayed to the left of the label. + + + values 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. + + + open ‘True’/‘False’ value indicating whether the item’s children + should be displayed or hidden. + + + tags A list of tags associated with this item. + + + +File: python.info, Node: Tag Options, Next: Column Identifiers, Prev: Item Options, Up: Treeview + +5.25.8.35 Tag Options +..................... + +The following options may be specified on tags: + + Option Description + + --------------------------------------------------------------------------------- + + foreground Specifies the text foreground color. + + + background Specifies the cell or item background color. + + + font Specifies the font to use when drawing text. + + + image Specifies the item image, in case the item’s image option is + empty. + + + +File: python.info, Node: Column Identifiers, Next: Virtual Events<2>, Prev: Tag Options, Up: Treeview + +5.25.8.36 Column Identifiers +............................ + +Column identifiers take any of the following forms: + + * A symbolic name from the list of columns option. + + * An integer n, specifying the nth data column. + + * A string of the form #n, where n is an integer, specifying the nth + display column. + +Notes: + + * Item’s option values may be displayed in a different order than the + order in which they are stored. + + * Column #0 always refers to the tree column, even if show=”tree” is + not specified. + +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'. + + +File: python.info, Node: Virtual Events<2>, Next: ttk Treeview, Prev: Column Identifiers, Up: Treeview + +5.25.8.37 Virtual Events +........................ + +The Treeview widget generates the following virtual events. + + Event Description + + -------------------------------------------------------------------------------- + + <<TreeviewSelect>> Generated whenever the selection changes. + + + <<TreeviewOpen>> Generated just before settings the focus item to + open=True. + + + <<TreeviewClose>> Generated just after setting the focus item to + open=False. + + +The *note Treeview.focus(): 36f6. and *note Treeview.selection(): 6eb. +methods can be used to determine the affected item or items. + + +File: python.info, Node: ttk Treeview, Prev: Virtual Events<2>, Up: Treeview + +5.25.8.38 ttk.Treeview +...................... + + -- Class: tkinter.ttk.Treeview + + -- 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 (i.e., if it is a + descendant of a closed item or is scrolled offscreen), returns + an empty string. + + -- Method: get_children (item=None) + + Returns the list of children belonging to `item'. + + If `item' is not specified, returns root children. + + -- Method: set_children (item, *newchildren) + + Replaces `item'’s child 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. + + -- 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: + + * + id + + Returns the column name. This is a read-only + option. + + * + anchor: One of the standard Tk anchor values. + + Specifies how the text in this column should be + aligned with respect to the cell. + + * + 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. + + * + stretch: ‘True’/‘False’ + + Specifies whether the column’s width should be + adjusted when the widget is resized. + + * + width: width + + The width of the column in pixels. + + To configure the tree column, call this with column = “#0” + + -- Method: delete (*items) + + Delete all specified `items' and all their descendants. + + The root item may not be deleted. + + -- 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. + + -- Method: exists (item) + + Returns ‘True’ if the specified `item' is present in the tree. + + -- 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. + + -- 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: + + * + text: text + + The text to display in the column heading. + + * + image: imageName + + Specifies an image to display to the right of the + column heading. + + * + anchor: anchor + + Specifies how the heading text should be aligned. + One of the standard Tk anchor values. + + * + command: callback + + A callback to be invoked when the heading label is + pressed. + + To configure the tree column heading, call this with column = + “#0”. + + -- 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. + + -- Method: identify_row (y) + + Returns the item ID of the item at position `y'. + + -- Method: identify_column (x) + + Returns the data column identifier of the cell at position + `x'. + + The tree column has ID #0. + + -- Method: identify_region (x, y) + + Returns one of: + + region meaning + + ----------------------------------------------------------- + + heading Tree heading area. + + + separator Space between two columns headings. + + + tree The tree area. + + + cell A data cell. + + + Availability: Tk 8.6. + + -- Method: identify_element (x, y) + + Returns the element at position `x', `y'. + + Availability: Tk 8.6. + + -- Method: index (item) + + Returns the integer index of `item' within its parent’s list + of children. + + -- 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 *note Item Options: 36f3. for the list of available + points. + + -- 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'. + + -- 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. + + -- Method: next (item) + + Returns the identifier of `item'’s next sibling, or ‘’ if + `item' is the last child of its parent. + + -- Method: parent (item) + + Returns the ID of the parent of `item', or ‘’ if `item' is at + the top level of the hierarchy. + + -- Method: prev (item) + + Returns the identifier of `item'’s previous sibling, or ‘’ if + `item' is the first child of its parent. + + -- Method: reattach (item, parent, index) + + An alias for *note Treeview.move(): 3708. + + -- Method: see (item) + + Ensure that `item' is visible. + + Sets all of `item'’s ancestors open option to ‘True’, and + scrolls the widget if necessary so that `item' is within the + visible portion of the tree. + + -- Method: selection () + + Returns a tuple of selected items. + + Changed in version 3.8: ‘selection()’ no longer takes + arguments. For changing the selection state use the following + selection methods. + + -- 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. + + -- 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. + + -- 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. + + -- 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. + + -- 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'. + + -- 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. + + -- 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'. + + -- Method: tag_has (tagname, item=None) + + If `item' is specified, returns 1 or 0 depending on whether + the specified `item' has the given `tagname'. Otherwise, + returns a list of all items that have the specified tag. + + Availability: Tk 8.6 + + -- Method: xview (*args) + + Query or modify horizontal position of the treeview. + + -- Method: yview (*args) + + Query or modify vertical position of the treeview. + + +File: python.info, Node: Ttk Styling, Prev: Treeview, Up: tkinter ttk — Tk themed widgets + +5.25.8.39 Ttk Styling +..................... + +Each widget in ‘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 ‘Misc.winfo_class()’ (somewidget.winfo_class()). + +See also +........ + +Tcl’2004 conference presentation(1) + + This document explains how the theme engine works + + -- Class: tkinter.ttk.Style + + This class is used to manipulate the style database. + + -- 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: + + 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() + + -- 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: + + 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() + + Note that the order of the (states, value) sequences for an + option does matter, if the order is changed to ‘[('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. + + -- 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: + + from tkinter import ttk + + print(ttk.Style().lookup("TButton", "font")) + + -- 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 *note + Layouts: 3719. + + To understand the format, see the following example (it is not + intended to do anything useful): + + 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() + + -- 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.6a for Windows + XP and Vista and is not described here. + + 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: + + * + border=padding + + padding is a list of up to four integers, + specifying the left, top, right, and bottom + borders, respectively. + + * + height=height + + Specifies a minimum height for the element. If + less than zero, the base image’s height is used + as a default. + + * + padding=padding + + Specifies the element’s interior padding. + Defaults to border’s value if not specified. + + * + sticky=spec + + Specifies how the image is placed within the + final parcel. spec contains zero or more + characters “n”, “s”, “w”, or “e”. + + * + width=width + + Specifies a minimum width for the element. If + less than zero, the base image’s width is used + as a default. + + If “from” is used as the value of `etype', *note + element_create(): 371a. 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. + + -- Method: element_names () + + Returns the list of elements defined in the current theme. + + -- Method: element_options (elementname) + + Returns the list of `elementname'’s options. + + -- 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 *note + theme_settings(): 371e. + + -- 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 *note Style.configure(): 3716, *note Style.map(): + 1323, *note Style.layout(): 3718. and *note + Style.element_create(): 371a. respectively. + + As an example, let’s change the Combobox for the default theme + a bit: + + 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() + + -- Method: theme_names () + + Returns a list of all known themes. + + -- 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. + +* Menu: + +* Layouts:: + + ---------- Footnotes ---------- + + (1) https://tktable.sourceforge.net/tile/tile-tcl2004.pdf + + +File: python.info, Node: Layouts, Up: Ttk Styling + +5.25.8.40 Layouts +................. + +A layout can be just ‘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. Valid options/values are: + + * + 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. + + * + sticky: nswe + + Specifies where the element is placed inside its + allocated parcel. + + * + 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 *note Widget.identify(): 36c4. et al. It’s + used for things like scrollbar thumbs with grips. + + * + 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 + *note Layout: 3719. + + +File: python.info, Node: tkinter tix — Extension widgets for Tk, Next: IDLE<52>, Prev: tkinter ttk — Tk themed widgets, Up: Graphical User Interfaces with Tk + +5.25.9 ‘tkinter.tix’ — Extension widgets for Tk +----------------------------------------------- + +`Source code:' Lib/tkinter/tix.py(1) + +Deprecated since version 3.6: This Tk extension is unmaintained and +should not be used in new code. Use *note tkinter.ttk: 118. instead. + +__________________________________________________________________ + +The *note tkinter.tix: 117. (Tk Interface Extension) module provides an +additional rich set of widgets. Although the standard Tk library has +many useful widgets, they are far from complete. The *note tkinter.tix: +117. library provides most of the commonly needed widgets that are +missing from standard Tk: *note HList: 3725, *note ComboBox: 3726, *note +Control: 3727. (a.k.a. SpinBox) and an assortment of scrollable +widgets. *note tkinter.tix: 117. also includes many more widgets that +are generally useful in a wide range of applications: *note NoteBook: +3728, *note FileEntry: 3729, *note PanedWindow: 372a, etc; there are +more than 40 of them. + +With all these new widgets, you can introduce new interaction techniques +into applications, creating more useful and more intuitive user +interfaces. You can design your application by choosing the most +appropriate widgets to match the special needs of your application and +users. + +See also +........ + +Tix Homepage(2) + + The home page for ‘Tix’. This includes links to additional + documentation and downloads. + +Tix Man Pages(3) + + On-line version of the man pages and reference material. + +Tix Programming Guide(4) + + On-line version of the programmer’s reference material. + +Tix Development Applications(5) + + Tix applications for development of Tix and Tkinter programs. Tide + applications work under Tk or Tkinter, and include ‘TixInspect’, an + inspector to remotely modify and debug Tix/Tk/Tkinter applications. + +* Menu: + +* Using Tix:: +* Tix Widgets:: +* Tix Commands:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tkinter/tix.py + + (2) https://tix.sourceforge.net/ + + (3) https://tix.sourceforge.net/dist/current/man/ + + (4) +https://tix.sourceforge.net/dist/current/docs/tix-book/tix.book.html + + (5) https://tix.sourceforge.net/Tixapps/src/Tide.html + + +File: python.info, Node: Using Tix, Next: Tix Widgets, Up: tkinter tix — Extension widgets for Tk + +5.25.9.1 Using Tix +.................. + + -- Class: tkinter.tix.Tk (screenName=None, baseName=None, + className='Tix') + + Toplevel widget of Tix which represents mostly the main window of + an application. It has an associated Tcl interpreter. + + Classes in the *note tkinter.tix: 117. module subclasses the + classes in the *note tkinter: 10e. The former imports the latter, + so to use *note tkinter.tix: 117. with Tkinter, all you need to do + is to import one module. In general, you can just import *note + tkinter.tix: 117, and replace the toplevel call to *note + tkinter.Tk: 3640. with ‘tix.Tk’: + + from tkinter import tix + from tkinter.constants import * + root = tix.Tk() + +To use *note tkinter.tix: 117, you must have the Tix widgets installed, +usually alongside your installation of the Tk widgets. To test your +installation, try the following: + + from tkinter import tix + root = tix.Tk() + root.tk.eval('package require Tix') + + +File: python.info, Node: Tix Widgets, Next: Tix Commands, Prev: Using Tix, Up: tkinter tix — Extension widgets for Tk + +5.25.9.2 Tix Widgets +.................... + +Tix(1) introduces over 40 widget classes to the *note tkinter: 10e. +repertoire. + +* Menu: + +* Basic Widgets:: +* File Selectors:: +* Hierarchical ListBox:: +* Tabular ListBox:: +* Manager Widgets:: +* Image Types:: +* Miscellaneous Widgets:: +* Form Geometry Manager:: + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/TixIntro.htm + + +File: python.info, Node: Basic Widgets, Next: File Selectors, Up: Tix Widgets + +5.25.9.3 Basic Widgets +...................... + + -- Class: tkinter.tix.Balloon + + A Balloon(1) that pops up over a widget to provide help. When the + user moves the cursor inside a widget to which a Balloon widget has + been bound, a small pop-up window with a descriptive message will + be shown on the screen. + + -- Class: tkinter.tix.ButtonBox + + The ButtonBox(2) widget creates a box of buttons, such as is + commonly used for ‘Ok Cancel’. + + -- Class: tkinter.tix.ComboBox + + The ComboBox(3) widget is similar to the combo box control in MS + Windows. The user can select a choice by either typing in the + entry subwidget or selecting from the listbox subwidget. + + -- Class: tkinter.tix.Control + + The Control(4) widget is also known as the ‘SpinBox’ widget. The + user can adjust the value by pressing the two arrow buttons or by + entering the value directly into the entry. The new value will be + checked against the user-defined upper and lower limits. + + -- Class: tkinter.tix.LabelEntry + + The LabelEntry(5) widget packages an entry widget and a label into + one mega widget. It can be used to simplify the creation of + “entry-form” type of interface. + + -- Class: tkinter.tix.LabelFrame + + The LabelFrame(6) widget packages a frame widget and a label into + one mega widget. To create widgets inside a LabelFrame widget, one + creates the new widgets relative to the ‘frame’ subwidget and + manage them inside the ‘frame’ subwidget. + + -- Class: tkinter.tix.Meter + + The Meter(7) widget can be used to show the progress of a + background job which may take a long time to execute. + + -- Class: tkinter.tix.OptionMenu + + The OptionMenu(8) creates a menu button of options. + + -- Class: tkinter.tix.PopupMenu + + The PopupMenu(9) widget can be used as a replacement of the + ‘tk_popup’ command. The advantage of the ‘Tix’ *note PopupMenu: + 3735. widget is it requires less application code to manipulate. + + -- Class: tkinter.tix.Select + + The Select(10) widget is a container of button subwidgets. It can + be used to provide radio-box or check-box style of selection + options for the user. + + -- Class: tkinter.tix.StdButtonBox + + The StdButtonBox(11) widget is a group of standard buttons for + Motif-like dialog boxes. + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixBalloon.htm + + (2) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixButtonBox.htm + + (3) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixComboBox.htm + + (4) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixControl.htm + + (5) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixLabelEntry.htm + + (6) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixLabelFrame.htm + + (7) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixMeter.htm + + (8) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixOptionMenu.htm + + (9) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixPopupMenu.htm + + (10) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixSelect.htm + + (11) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixStdButtonBox.htm + + +File: python.info, Node: File Selectors, Next: Hierarchical ListBox, Prev: Basic Widgets, Up: Tix Widgets + +5.25.9.4 File Selectors +....................... + + -- Class: tkinter.tix.DirList + + The DirList(1) widget displays a list view of a directory, its + previous directories and its sub-directories. The user can choose + one of the directories displayed in the list or change to another + directory. + + -- Class: tkinter.tix.DirTree + + The DirTree(2) widget displays a tree view of a directory, its + previous directories and its sub-directories. The user can choose + one of the directories displayed in the list or change to another + directory. + + -- Class: tkinter.tix.DirSelectDialog + + The DirSelectDialog(3) widget presents the directories in the file + system in a dialog window. The user can use this dialog window to + navigate through the file system to select the desired directory. + + -- Class: tkinter.tix.DirSelectBox + + The *note DirSelectBox: 373c. is similar to the standard Motif(TM) + directory-selection box. It is generally used for the user to + choose a directory. DirSelectBox stores the directories mostly + recently selected into a ComboBox widget so that they can be + quickly selected again. + + -- Class: tkinter.tix.ExFileSelectBox + + The ExFileSelectBox(4) widget is usually embedded in a + tixExFileSelectDialog widget. It provides a convenient method for + the user to select files. The style of the *note ExFileSelectBox: + 373d. widget is very similar to the standard file dialog on MS + Windows 3.1. + + -- Class: tkinter.tix.FileSelectBox + + The FileSelectBox(5) is similar to the standard Motif(TM) + file-selection box. It is generally used for the user to choose a + file. FileSelectBox stores the files mostly recently selected into + a *note ComboBox: 3726. widget so that they can be quickly selected + again. + + -- Class: tkinter.tix.FileEntry + + The FileEntry(6) widget can be used to input a filename. The user + can type in the filename manually. Alternatively, the user can + press the button widget that sits next to the entry, which will + bring up a file selection dialog. + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirList.htm + + (2) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirTree.htm + + (3) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixDirSelectDialog.htm + + (4) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixExFileSelectBox.htm + + (5) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixFileSelectBox.htm + + (6) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixFileEntry.htm + + +File: python.info, Node: Hierarchical ListBox, Next: Tabular ListBox, Prev: File Selectors, Up: Tix Widgets + +5.25.9.5 Hierarchical ListBox +............................. + + -- Class: tkinter.tix.HList + + The HList(1) widget can be used to display any data that have a + hierarchical structure, for example, file system directory trees. + The list entries are indented and connected by branch lines + according to their places in the hierarchy. + + -- Class: tkinter.tix.CheckList + + The CheckList(2) widget displays a list of items to be selected by + the user. CheckList acts similarly to the Tk checkbutton or + radiobutton widgets, except it is capable of handling many more + items than checkbuttons or radiobuttons. + + -- Class: tkinter.tix.Tree + + The Tree(3) widget can be used to display hierarchical data in a + tree form. The user can adjust the view of the tree by opening or + closing parts of the tree. + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixHList.htm + + (2) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixCheckList.htm + + (3) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixTree.htm + + +File: python.info, Node: Tabular ListBox, Next: Manager Widgets, Prev: Hierarchical ListBox, Up: Tix Widgets + +5.25.9.6 Tabular ListBox +........................ + + -- Class: tkinter.tix.TList + + The TList(1) widget can be used to display data in a tabular + format. The list entries of a *note TList: 3743. widget are + similar to the entries in the Tk listbox widget. The main + differences are (1) the *note TList: 3743. widget can display the + list entries in a two dimensional format and (2) you can use + graphical images as well as multiple colors and fonts for the list + entries. + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixTList.htm + + +File: python.info, Node: Manager Widgets, Next: Image Types, Prev: Tabular ListBox, Up: Tix Widgets + +5.25.9.7 Manager Widgets +........................ + + -- Class: tkinter.tix.PanedWindow + + The PanedWindow(1) widget allows the user to interactively + manipulate the sizes of several panes. The panes can be arranged + either vertically or horizontally. The user changes the sizes of + the panes by dragging the resize handle between two panes. + + -- Class: tkinter.tix.ListNoteBook + + The ListNoteBook(2) widget is very similar to the ‘TixNoteBook’ + widget: it can be used to display many windows in a limited space + using a notebook metaphor. The notebook is divided into a stack of + pages (windows). At one time only one of these pages can be shown. + The user can navigate through these pages by choosing the name of + the desired page in the ‘hlist’ subwidget. + + -- Class: tkinter.tix.NoteBook + + The NoteBook(3) widget can be used to display many windows in a + limited space using a notebook metaphor. The notebook is divided + into a stack of pages. At one time only one of these pages can be + shown. The user can navigate through these pages by choosing the + visual “tabs” at the top of the NoteBook widget. + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixPanedWindow.htm + + (2) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixListNoteBook.htm + + (3) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixNoteBook.htm + + +File: python.info, Node: Image Types, Next: Miscellaneous Widgets, Prev: Manager Widgets, Up: Tix Widgets + +5.25.9.8 Image Types +.................... + +The *note tkinter.tix: 117. module adds: + + * pixmap(1) capabilities to all *note tkinter.tix: 117. and *note + tkinter: 10e. widgets to create color images from XPM files. + + * Compound(2) image types can be used to create images that consists + of multiple horizontal lines; each line is composed of a series of + items (texts, bitmaps, images or spaces) arranged from left to + right. For example, a compound image can be used to display a + bitmap and a text string simultaneously in a Tk ‘Button’ widget. + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/pixmap.htm + + (2) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/compound.htm + + +File: python.info, Node: Miscellaneous Widgets, Next: Form Geometry Manager, Prev: Image Types, Up: Tix Widgets + +5.25.9.9 Miscellaneous Widgets +.............................. + + -- Class: tkinter.tix.InputOnly + + The InputOnly(1) widgets are to accept inputs from the user, which + can be done with the ‘bind’ command (Unix only). + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixInputOnly.htm + + +File: python.info, Node: Form Geometry Manager, Prev: Miscellaneous Widgets, Up: Tix Widgets + +5.25.9.10 Form Geometry Manager +............................... + +In addition, *note tkinter.tix: 117. augments *note tkinter: 10e. by +providing: + + -- Class: tkinter.tix.Form + + The Form(1) geometry manager based on attachment rules for all Tk + widgets. + + ---------- Footnotes ---------- + + (1) +https://tix.sourceforge.net/dist/current/man/html/TixCmd/tixForm.htm + + +File: python.info, Node: Tix Commands, Prev: Tix Widgets, Up: tkinter tix — Extension widgets for Tk + +5.25.9.11 Tix Commands +...................... + + -- Class: tkinter.tix.tixCommand + + The tix commands(1) provide access to miscellaneous elements of + ‘Tix’’s internal state and the ‘Tix’ application context. Most of + the information manipulated by these methods pertains to the + application as a whole, or to a screen or display, rather than to a + particular window. + + To view the current settings, the common usage is: + + from tkinter import tix + root = tix.Tk() + print(root.tix_configure()) + + -- Method: tixCommand.tix_configure (cnf=None, **kw) + + Query or modify the configuration options of the Tix application + context. If no option is specified, returns a dictionary all of + the available options. If option is specified with no value, then + the method returns a list describing the one named option (this + list will be identical to the corresponding sublist of the value + returned if no option is specified). If one or more option-value + pairs are specified, then the method modifies the given option(s) + to have the given value(s); in this case the method returns an + empty string. Option may be any of the configuration options. + + -- Method: tixCommand.tix_cget (option) + + Returns the current value of the configuration option given by + `option'. Option may be any of the configuration options. + + -- Method: tixCommand.tix_getbitmap (name) + + Locates a bitmap file of the name ‘name.xpm’ or ‘name’ in one of + the bitmap directories (see the *note tix_addbitmapdir(): 3750. + method). By using *note tix_getbitmap(): 374f, you can avoid hard + coding the pathnames of the bitmap files in your application. When + successful, it returns the complete pathname of the bitmap file, + prefixed with the character ‘@’. The returned value can be used to + configure the ‘bitmap’ option of the Tk and Tix widgets. + + -- Method: tixCommand.tix_addbitmapdir (directory) + + Tix maintains a list of directories under which the *note + tix_getimage(): 3751. and *note tix_getbitmap(): 374f. methods will + search for image files. The standard bitmap directory is + ‘$TIX_LIBRARY/bitmaps’. The *note tix_addbitmapdir(): 3750. method + adds `directory' into this list. By using this method, the image + files of an applications can also be located using the *note + tix_getimage(): 3751. or *note tix_getbitmap(): 374f. method. + + -- Method: tixCommand.tix_filedialog ([dlgclass]) + + Returns the file selection dialog that may be shared among + different calls from this application. This method will create a + file selection dialog widget when it is called the first time. + This dialog will be returned by all subsequent calls to *note + tix_filedialog(): 3752. An optional dlgclass parameter can be + passed as a string to specified what type of file selection dialog + widget is desired. Possible options are ‘tix’, ‘FileSelectDialog’ + or ‘tixExFileSelectDialog’. + + -- Method: tixCommand.tix_getimage (self, name) + + Locates an image file of the name ‘name.xpm’, ‘name.xbm’ or + ‘name.ppm’ in one of the bitmap directories (see the *note + tix_addbitmapdir(): 3750. method above). If more than one file + with the same name (but different extensions) exist, then the image + type is chosen according to the depth of the X display: xbm images + are chosen on monochrome displays and color images are chosen on + color displays. By using *note tix_getimage(): 3751, you can avoid + hard coding the pathnames of the image files in your application. + When successful, this method returns the name of the newly created + image, which can be used to configure the ‘image’ option of the Tk + and Tix widgets. + + -- Method: tixCommand.tix_option_get (name) + + Gets the options maintained by the Tix scheme mechanism. + + -- Method: tixCommand.tix_resetoptions (newScheme, newFontSet[, + newScmPrio]) + + Resets the scheme and fontset of the Tix application to `newScheme' + and `newFontSet', respectively. This affects only those widgets + created after this call. Therefore, it is best to call the + resetoptions method before the creation of any widgets in a Tix + application. + + The optional parameter `newScmPrio' can be given to reset the + priority level of the Tk options set by the Tix schemes. + + Because of the way Tk handles the X option database, after Tix has + been has imported and inited, it is not possible to reset the color + schemes and font sets using the ‘tix_config()’ method. Instead, + the *note tix_resetoptions(): 3754. method must be used. + + ---------- Footnotes ---------- + + (1) https://tix.sourceforge.net/dist/current/man/html/TixCmd/tix.htm + + +File: python.info, Node: IDLE<52>, Prev: tkinter tix — Extension widgets for Tk, Up: Graphical User Interfaces with Tk + +5.25.10 IDLE +------------ + +`Source code:' Lib/idlelib/(1) + +__________________________________________________________________ + +IDLE is Python’s Integrated Development and Learning Environment. + +IDLE has the following features: + + * coded in 100% pure Python, using the *note tkinter: 10e. GUI + toolkit + + * cross-platform: works mostly the same on Windows, Unix, and macOS + + * Python shell window (interactive interpreter) with colorizing of + code input, output, and error messages + + * multi-window text editor with multiple undo, Python colorizing, + smart indent, call tips, auto completion, and other features + + * search within any window, replace within editor windows, and search + through multiple files (grep) + + * debugger with persistent breakpoints, stepping, and viewing of + global and local namespaces + + * configuration, browsers, and other dialogs + +* Menu: + +* Menus:: +* Editing and Navigation:: +* Startup and Code Execution:: +* Help and Preferences:: +* idlelib:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/idlelib/ + + +File: python.info, Node: Menus, Next: Editing and Navigation, Up: IDLE<52> + +5.25.10.1 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:: + + +File: python.info, Node: File menu Shell and Editor, Next: Edit menu Shell and Editor, Up: Menus + +5.25.10.2 File menu (Shell and Editor) +...................................... + +New File + + Create a new file editing window. + +Open… + + Open an existing file with an Open dialog. + +Open Module… + + Open an existing module (searches sys.path). + +Recent Files + + Open a list of recent files. Click one to open it. + +Module Browser + + Show functions, classes, and methods in the current Editor file in + a tree structure. In the shell, open a module first. + +Path Browser + + Show sys.path directories, modules, functions, classes and methods + in a tree structure. + +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. + +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 + namager 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.) + +Save Copy As… + + Save the current window to different file without changing the + associated file. (See Save As note above about filename + extensions.) + +Print Window + + Print the current window to the default printer. + +Close Window + + Close the current window (if an unsaved editor, ask to save; if an + unsaved Shell, ask to quit execution). Calling ‘exit()’ or + ‘close()’ in the Shell window also closes Shell. If this is the + only window, also exit IDLE. + +Exit IDLE + + Close all windows and quit IDLE (ask to save unsaved edit windows). + + +File: python.info, Node: Edit menu Shell and Editor, Next: Format menu Editor window only, Prev: File menu Shell and Editor, Up: Menus + +5.25.10.3 Edit menu (Shell and Editor) +...................................... + +Undo + + Undo the last change to the current window. A maximum of 1000 + changes may be undone. + +Redo + + Redo the last undone change to the current window. + +Select All + + Select the entire contents of the current window. + +Cut + + Copy selection into the system-wide clipboard; then delete the + selection. + +Copy + + Copy selection into the system-wide clipboard. + +Paste + + Insert contents of the system-wide clipboard into the current + window. + +The clipboard functions are also available in context menus. + +Find… + + Open a search dialog with many options + +Find Again + + Repeat the last search, if there is one. + +Find Selection + + Search for the currently selected string, if there is one. + +Find in Files… + + Open a file search dialog. Put results in a new output window. + +Replace… + + Open a search-and-replace dialog. + +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. + +Show Completions + + Open a scrollable list allowing selection of existing names. See + *note Completions: 375a. in the Editing and navigation section + below. + +Expand Word + + Expand a prefix you have typed to match a full word in the same + window; repeat to get a different expansion. + +Show Call Tip + + After an unclosed parenthesis for a function, open a small window + with function parameter hints. See *note Calltips: 375b. in the + Editing and navigation section below. + +Show Surrounding Parens + + Highlight the surrounding parenthesis. + + +File: python.info, Node: Format menu Editor window only, Next: Run menu Editor window only, Prev: Edit menu Shell and Editor, Up: Menus + +5.25.10.4 Format menu (Editor window only) +.......................................... + +Format Paragraph + + Reformat the current blank-line-delimited paragraph in comment + block or multiline string or selected line in a string. All lines + in the paragraph will be formatted to less than N columns, where N + defaults to 72. + +Indent Region + + Shift selected lines right by the indent width (default 4 spaces). + +Dedent Region + + Shift selected lines left by the indent width (default 4 spaces). + +Comment Out Region + + Insert ## in front of selected lines. + +Uncomment Region + + Remove leading # or ## from selected lines. + +Tabify Region + + Turn `leading' stretches of spaces into tabs. (Note: We recommend + using 4 space blocks to indent Python code.) + +Untabify Region + + Turn `all' tabs into the correct number of spaces. + +Toggle Tabs + + Open a dialog to switch between indenting with spaces and tabs. + +New Indent Width + + Open a dialog to change indent width. The accepted default by the + Python community is 4 spaces. + +Strip Trailing Chitespace + + Remove trailing space and other whitespace characters after the + last non-whitespace character of a line by applying str.rstrip to + each line, including lines within multiline strings. Except for + Shell windows, remove extra newlines at the end of the file. + + +File: python.info, Node: Run menu Editor window only, Next: Shell menu Shell window only, Prev: Format menu Editor window only, Up: Menus + +5.25.10.5 Run menu (Editor window only) +....................................... + +Run Module + + Do *note Check Module: 3760. 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 + ‘print’ or ‘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 ‘python -i file’ at a command line. + +Run… Customized + + Same as *note Run Module: 375f, but run the module with customized + settings. `Command Line Arguments' extend *note sys.argv: f1f. as + if passed on a command line. The module can be run in the Shell + without restarting. + +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. + +Python Shell + + Open or wake up the Python Shell window. + + +File: python.info, Node: Shell menu Shell window only, Next: Debug menu Shell window only, Prev: Run menu Editor window only, Up: Menus + +5.25.10.6 Shell menu (Shell window only) +........................................ + +View Last Restart + + Scroll the shell window to the last Shell restart. + +Restart Shell + + Restart the shell to clean the environment and reset display and + exception handling. + +Previous History + + Cycle through earlier commands in history which match the current + entry. + +Next History + + Cycle through later commands in history which match the current + entry. + +Interrupt Execution + + Stop a running program. + + +File: python.info, Node: Debug menu Shell window only, Next: Options menu Shell and Editor, Prev: Shell menu Shell window only, Up: Menus + +5.25.10.7 Debug menu (Shell window only) +........................................ + +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. + +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. + +Stack Viewer + + Show the stack traceback of the last exception in a tree widget, + with access to locals and globals. + +Auto-open Stack Viewer + + Toggle automatically opening the stack viewer on an unhandled + exception. + + +File: python.info, Node: Options menu Shell and Editor, Next: Window menu Shell and Editor, Prev: Debug menu Shell window only, Up: Menus + +5.25.10.8 Options menu (Shell and Editor) +......................................... + +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 *note Setting + preferences: 3766. under Help and preferences. + +Most configuration options apply to all windows or all future windows. +The option items below only apply to the active window. + +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 *note Code Context: 3767. in the Editing and Navigation section + below. + +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 *note Setting preferences: 3766.). + +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. + + +File: python.info, Node: Window menu Shell and Editor, Next: Help menu Shell and Editor, Prev: Options menu Shell and Editor, Up: Menus + +5.25.10.9 Window menu (Shell and Editor) +........................................ + +Lists the names of all open windows; select one to bring it to the +foreground (deiconifying it if necessary). + + +File: python.info, Node: Help menu Shell and Editor, Next: Context menus, Prev: Window menu Shell and Editor, Up: Menus + +5.25.10.10 Help menu (Shell and Editor) +....................................... + +About IDLE + + Display version, copyright, license, credits, and more. + +IDLE Help + + Display this IDLE document, detailing the menu options, basic + editing and navigation, and other tips. + +Python Docs + + Access local Python documentation, if installed, or start a web + browser and open docs.python.org showing the latest Python + documentation. + +Turtle Demo + + Run the turtledemo module with example Python code and turtle + drawings. + +Additional help sources may be added here with the Configure IDLE dialog +under the General tab. See the *note Help sources: 376a. subsection +below for more on Help menu choices. + + +File: python.info, Node: Context menus, Prev: Help menu Shell and Editor, Up: Menus + +5.25.10.11 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. + +Cut + + Copy selection into the system-wide clipboard; then delete the + selection. + +Copy + + Copy selection into the system-wide clipboard. + +Paste + + Insert contents of the system-wide clipboard into the current + window. + +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 +‘.idlerc’ directory. + +Set Breakpoint + + Set a breakpoint on the current line. + +Clear Breakpoint + + Clear the breakpoint on that line. + +Shell and Output windows also have the following. + +Go to file/line + + Same as in Debug menu. + +The Shell window also has an output squeezing facility explained in the +`Python Shell window' subsection below. + +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. + + +File: python.info, Node: Editing and Navigation, Next: Startup and Code Execution, Prev: Menus, Up: IDLE<52> + +5.25.10.12 Editing and Navigation +................................. + +* Menu: + +* Editor windows:: +* Key bindings:: +* Automatic indentation:: +* Search and Replace:: +* Completions:: +* Calltips:: +* Code Context:: +* Shell window:: +* Text colors:: + + +File: python.info, Node: Editor windows, Next: Key bindings, Up: Editing and Navigation + +5.25.10.13 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. + + +File: python.info, Node: Key bindings, Next: Automatic indentation, Prev: Editor windows, Up: Editing and Navigation + +5.25.10.14 Key bindings +....................... + +In this section, ‘C’ refers to the ‘Control’ key on Windows and Unix and +the ‘Command’ key on macOS. + + * ‘Backspace’ deletes to the left; ‘Del’ deletes to the right + + * ‘C-Backspace’ delete word left; ‘C-Del’ delete word to the right + + * Arrow keys and ‘Page Up’/‘Page Down’ to move around + + * ‘C-LeftArrow’ and ‘C-RightArrow’ moves by words + + * ‘Home’/‘End’ go to begin/end of line + + * ‘C-Home’/‘C-End’ go to begin/end of file + + * Some useful Emacs bindings are inherited from Tcl/Tk: + + * ‘C-a’ beginning of line + + * ‘C-e’ end of line + + * ‘C-k’ kill line (but doesn’t put it in clipboard) + + * ‘C-l’ center window around the insertion point + + * ‘C-b’ go backward one character without deleting (usually + you can also use the cursor key for this) + + * ‘C-f’ go forward one character without deleting (usually + you can also use the cursor key for this) + + * ‘C-p’ go up one line (usually you can also use the cursor + key for this) + + * ‘C-d’ delete next character + +Standard keybindings (like ‘C-c’ to copy and ‘C-v’ to paste) may work. +Keybindings are selected in the Configure IDLE dialog. + + +File: python.info, Node: Automatic indentation, Next: Search and Replace, Prev: Key bindings, Up: Editing and Navigation + +5.25.10.15 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, +‘Backspace’ deletes up to 4 spaces if they are there. ‘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 *note Format menu: +375c. + + +File: python.info, Node: Search and Replace, Next: Completions, Prev: Automatic indentation, Up: Editing and Navigation + +5.25.10.16 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 ‘[x] Regular expresion’ is checked, the +target is interpreted according to the Python re module. + + +File: python.info, Node: Completions, Next: Calltips, Prev: Search and Replace, Up: Editing and Navigation + +5.25.10.17 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 ‘Up’, ‘Down’, ‘PageUp’, ‘PageDown’, ‘Home’, and +‘End’ keys; and by a single click within the box. Close the box with +‘Escape’, ‘Enter’, and double ‘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 *note os.sep: 23b. or *note os.altsep: 23c. 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 ‘C-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 ‘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 ‘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. + + +File: python.info, Node: Calltips, Next: Code Context, Prev: Completions, Up: Editing and Navigation + +5.25.10.18 Calltips +................... + +A calltip is shown automatically when one types ‘(’ 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 ‘)’ 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 ‘itertools.count(’. A calltip +appears because Idle imports itertools into the user process for its own +use. (This could change.) Enter ‘turtle.write(’ and nothing appears. +Idle does not itself import turtle. The menu entry and shortcut also do +nothing. Enter ‘import turtle’. Thereafter, ‘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. + + +File: python.info, Node: Code Context, Next: Shell window, Prev: Calltips, Up: Editing and Navigation + +5.25.10.19 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 ‘class’, ‘def’, or ‘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. + + +File: python.info, Node: Shell window, Next: Text colors, Prev: Code Context, Up: Editing and Navigation + +5.25.10.20 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 ‘Return’ with +the cursor anywhere on the line. If a line is extended with Backslash +(‘\’), 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 ‘Return’, as specified above. One may edit +pasted code first. If one pastes more than one statement into Shell, +the result will be a *note SyntaxError: 2d6. when multiple statements +are compiled as if they were one. + +Lines containing ‘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 keys. + + * ‘C-c’ interrupts executing command + + * ‘C-d’ sends end-of-file; closes window if typed at a ‘>>>’ prompt + + * ‘Alt-/’ (Expand word) is also useful to reduce typing + + Command history + + * ‘Alt-p’ retrieves previous command matching what you have + typed. On macOS use ‘C-p’. + + * ‘Alt-n’ retrieves next. On macOS use ‘C-n’. + + * ‘Return’ while the cursor is on any previous command retrieves + that command + + +File: python.info, Node: Text colors, Prev: Shell window, Up: Editing and Navigation + +5.25.10.21 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 ‘class’ and ‘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 *note soft keywords: 3ff. *note match: 400, +*note case: 400, and *note _: 401. in pattern-matching statements. +However, this highlighting is not perfect and will be incorrect in some +rare cases, including some ‘_’-s in ‘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. + + +File: python.info, Node: Startup and Code Execution, Next: Help and Preferences, Prev: Editing and Navigation, Up: IDLE<52> + +5.25.10.22 Startup and Code Execution +..................................... + +Upon startup with the ‘-s’ option, IDLE will execute the file referenced +by the environment variables ‘IDLESTARTUP’ or *note PYTHONSTARTUP: c6a. +IDLE first checks for ‘IDLESTARTUP’; if ‘IDLESTARTUP’ is present the +file referenced is run. If ‘IDLESTARTUP’ is not present, IDLE checks +for ‘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, ‘Tk’ also loads a startup file if it is present. Note that +the Tk file is loaded unconditionally. This additional file is +‘.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:: +* Startup failure:: +* Running user code:: +* User output in Shell:: +* Developing tkinter applications:: +* Running without a subprocess:: + + +File: python.info, Node: Command line usage, Next: Startup failure, Up: Startup and Code Execution + +5.25.10.23 Command line usage +............................. + + idle.py [-c command] [-d] [-e] [-h] [-i] [-r file] [-s] [-t title] [-] [arg] ... + + -c command run command in the shell window + -d enable debugger and open shell window + -e open editor window + -h print help message with legal combinations and exit + -i open shell window + -r file run file in shell window + -s run $IDLESTARTUP or $PYTHONSTARTUP first, in shell window + -t title set title of shell window + - run stdin in shell (- must be last option before args) + +If there are arguments: + + * If ‘-’, ‘-c’, or ‘r’ is used, all arguments are placed in + ‘sys.argv[1:...]’ and ‘sys.argv[0]’ is set to ‘''’, ‘'-c'’, or + ‘'-r'’. No editor window is opened, even if that is the default + set in the Options dialog. + + * Otherwise, arguments are files opened for editing and ‘sys.argv’ + reflects the arguments passed to IDLE itself. + + +File: python.info, Node: Startup failure, Next: Running user code, Prev: Command line usage, Up: Startup and Code Execution + +5.25.10.24 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 ‘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 ‘** Invalid host:’. The valid value is ‘127.0.0.1 +(idlelib.rpc.LOCALHOST)’. One can diagnose with ‘tcpconnect -irv +127.0.0.1 6543’ in one terminal window and ‘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 +‘~/.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 (‘python -m idlelib’) and see +if this results in an error message. + +On Unix-based systems with tcl/tk older than ‘8.6.11’ (see ‘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. + + +File: python.info, Node: Running user code, Next: User output in Shell, Prev: Startup failure, Up: Startup and Code Execution + +5.25.10.25 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, ‘sys.modules’ starts with more +entries, and ‘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 ‘sys.stdin’, ‘sys.stdout’, and +‘sys.stderr’ with objects that get input from and send output to the +Shell window. The original values stored in ‘sys.__stdin__’, +‘sys.__stdout__’, and ‘sys.__stderr__’ are not touched, but may be +‘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 *note +str.join(): 1bf4. 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 ‘input’ from +sys.stdin or ‘print’ or ‘write’ to sys.stdout or sys.stderr, IDLE should +be started in a command line window. (On Windows, use ‘python’ or ‘py’ +rather than ‘pythonw’ or ‘pyw’.) The secondary subprocess will then be +attached to that window for input and output. + +If ‘sys’ is reset by user code, such as with ‘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 +‘sys.getrecursionlimit’ and ‘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. + + +File: python.info, Node: User output in Shell, Next: Developing tkinter applications, Prev: Running user code, Up: Startup and Code Execution + +5.25.10.26 User output in Shell +............................... + +When a program outputs text, the result is determined by the +corresponding output device. When IDLE executes user code, ‘sys.stdout’ +and ‘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.) + + >>> 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='') # Display s as is. + # Result varies by OS and font. Try it. + +The ‘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. + + +File: python.info, Node: Developing tkinter applications, Next: Running without a subprocess, Prev: User output in Shell, Up: Startup and Code Execution + +5.25.10.27 Developing tkinter applications +.......................................... + +IDLE is intentionally different from standard Python in order to +facilitate development of tkinter programs. Enter ‘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 ‘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 ‘b = tk.Button(root, text='button'); +b.pack()’. Again, nothing visibly changes in standard Python until one +enters ‘root.update()’. + +Most tkinter programs run ‘root.mainloop()’, which usually does not +return until the tk app is destroyed. If the program is run with +‘python -i’ or from an IDLE editor, a ‘>>>’ shell prompt does not appear +until ‘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. + + +File: python.info, Node: Running without a subprocess, Prev: Developing tkinter applications, Up: Startup and Code Execution + +5.25.10.28 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. + + +File: python.info, Node: Help and Preferences, Next: idlelib, Prev: Startup and Code Execution, Up: IDLE<52> + +5.25.10.29 Help and Preferences +............................... + +* Menu: + +* Help sources:: +* Setting preferences:: +* IDLE on macOS:: +* Extensions:: + + +File: python.info, Node: Help sources, Next: Setting preferences, Up: Help and Preferences + +5.25.10.30 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 ‘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. + + +File: python.info, Node: Setting preferences, Next: IDLE on macOS, Prev: Help sources, Up: Help and Preferences + +5.25.10.31 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 ‘.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 ‘.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. + + +File: python.info, Node: IDLE on macOS, Next: Extensions, Prev: Setting preferences, Up: Help and Preferences + +5.25.10.32 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. + + +File: python.info, Node: Extensions, Prev: IDLE on macOS, Up: Help and Preferences + +5.25.10.33 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. + + +File: python.info, Node: idlelib, Prev: Help and Preferences, Up: IDLE<52> + +5.25.10.34 idlelib +.................. + +`Source code:' Lib/idlelib(1) + +__________________________________________________________________ + +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 PEP 434(2)). + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/idlelib + + (2) https://peps.python.org/pep-0434/ + + +File: python.info, Node: Development Tools, Next: Debugging and Profiling, Prev: Graphical User Interfaces with Tk, Up: The Python Standard Library + +5.26 Development Tools +====================== + +The modules described in this chapter help you write software. For +example, the *note pydoc: d6. module takes a module and generates +documentation based on the module’s contents. The *note doctest: 63. +and *note unittest: 125. modules contains frameworks for writing unit +tests that automatically exercise code and verify that the expected +output is produced. ‘2to3’ can translate Python 2.x source code into +valid Python 3.x code. + +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:: +* Effects of the Python Development Mode:: +* ResourceWarning Example:: +* Bad file descriptor error example:: +* 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. +* 2to3 — Automated Python 2 to 3 code translation:: +* 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. + + +File: python.info, Node: typing — Support for type hints, Next: pydoc — Documentation generator and online help system, Up: Development Tools + +5.26.1 ‘typing’ — Support for type hints +---------------------------------------- + +New in version 3.5. + +`Source code:' Lib/typing.py(1) + + Note: The Python runtime does not enforce function and variable + type annotations. They can be used by third party tools such as + type checkers, IDEs, linters, etc. + +__________________________________________________________________ + +This module provides runtime support for type hints. The most +fundamental support consists of the types *note Any: 272, *note Union: +214, *note Callable: 3b1, *note TypeVar: 185, and *note Generic: 11ec. +For a full specification, please see PEP 484(2). For a simplified +introduction to type hints, see PEP 483(3). + +The function below takes and returns a string and is annotated as +follows: + + def greeting(name: str) -> str: + return 'Hello ' + name + +In the function ‘greeting’, the argument ‘name’ is expected to be of +type *note str: 1b3. and the return type *note str: 1b3. Subtypes are +accepted as arguments. + +New features are frequently added to the ‘typing’ module. The +typing_extensions(4) package provides backports of these new features to +older versions of Python. + +For a summary of deprecated features and a deprecation timeline, please +see *note Deprecation Timeline of Major Features: 3789. + +See also +........ + +The documentation at ‘https://typing.readthedocs.io/’ serves as useful +reference for type system features, useful typing related tools and +typing best practices. + +* Menu: + +* Relevant PEPs:: +* Type aliases:: +* NewType:: +* Callable:: +* Generics:: +* User-defined generic types:: +* The Any type:: +* Nominal vs structural subtyping:: +* Module contents: Module contents<3>. +* Deprecation Timeline of Major Features:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/typing.py + + (2) https://peps.python.org/pep-0484/ + + (3) https://peps.python.org/pep-0483/ + + (4) https://pypi.org/project/typing-extensions/ + + +File: python.info, Node: Relevant PEPs, Next: Type aliases, Up: typing — Support for type hints + +5.26.1.1 Relevant PEPs +...................... + +Since the initial introduction of type hints in PEP 484(1) and PEP +483(2), a number of PEPs have modified and enhanced Python’s framework +for type annotations. These include: + + * + PEP 526(3): Syntax for Variable Annotations + + `Introducing' syntax for annotating variables outside of + function definitions, and *note ClassVar: 27a. + + * + PEP 544(4): Protocols: Structural subtyping (static duck typing) + + `Introducing' *note Protocol: 276. and the *note + @runtime_checkable: 693. decorator + + * + PEP 585(5): Type Hinting Generics In Standard Collections + + `Introducing' *note types.GenericAlias: 3dd. and the ability + to use standard library classes as *note generic types: 278. + + * + PEP 586(6): Literal Types + + `Introducing' *note Literal: 44c. + + * + PEP 589(7): TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys + + `Introducing' *note TypedDict: 18a. + + * + PEP 591(8): Adding a final qualifier to typing + + `Introducing' *note Final: 692. and the *note @final: 273. + decorator + + * + PEP 593(9): Flexible function and variable annotations + + `Introducing' *note Annotated: 585. + + * + PEP 604(10): Allow writing union types as ‘X | Y’ + + `Introducing' *note types.UnionType: 213. and the ability to + use the binary-or operator ‘|’ to signify a *note union of + types: 3ad. + + * + PEP 612(11): Parameter Specification Variables + + `Introducing' *note ParamSpec: 3af. and *note Concatenate: + 3b0. + + * + PEP 613(12): Explicit Type Aliases + + `Introducing' *note TypeAlias: 1338. + + * + PEP 646(13): Variadic Generics + + `Introducing' *note TypeVarTuple: 186. + + * + PEP 647(14): User-Defined Type Guards + + `Introducing' *note TypeGuard: 378c. + + * + PEP 655(15): Marking individual TypedDict items as required or potentially missing + + `Introducing' *note Required: 188. and *note NotRequired: 189. + + * + PEP 673(16): Self type + + `Introducing' *note Self: 18c. + + * + PEP 675(17): Arbitrary Literal String Type + + `Introducing' *note LiteralString: 190. + + * + PEP 681(18): Data Class Transforms + + `Introducing' the *note @dataclass_transform: 192. decorator + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0483/ + + (3) https://peps.python.org/pep-0526/ + + (4) https://peps.python.org/pep-0544/ + + (5) https://peps.python.org/pep-0585/ + + (6) https://peps.python.org/pep-0586/ + + (7) https://peps.python.org/pep-0589/ + + (8) https://peps.python.org/pep-0591/ + + (9) https://peps.python.org/pep-0593/ + + (10) https://peps.python.org/pep-0604/ + + (11) https://peps.python.org/pep-0612/ + + (12) https://peps.python.org/pep-0613/ + + (13) https://peps.python.org/pep-0646/ + + (14) https://peps.python.org/pep-0647/ + + (15) https://peps.python.org/pep-0655/ + + (16) https://peps.python.org/pep-0673/ + + (17) https://peps.python.org/pep-0675/ + + (18) https://peps.python.org/pep-0681/ + + +File: python.info, Node: Type aliases, Next: NewType, Prev: Relevant PEPs, Up: typing — Support for type hints + +5.26.1.2 Type aliases +..................... + +A type alias is defined by assigning the type to the alias. In this +example, ‘Vector’ and ‘list[float]’ will be treated as interchangeable +synonyms: + + 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]) + +Type aliases are useful for simplifying complex type signatures. For +example: + + from collections.abc import Sequence + + ConnectionOptions = dict[str, str] + Address = tuple[str, int] + 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: + ... + +Note that ‘None’ as a type hint is a special case and is replaced by +‘type(None)’. + + +File: python.info, Node: NewType, Next: Callable, Prev: Type aliases, Up: typing — Support for type hints + +5.26.1.3 NewType +................ + +Use the *note NewType: 964. helper to create distinct types: + + from typing import NewType + + UserId = NewType('UserId', int) + some_id = UserId(524313) + +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: + + 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) + +You may still perform all ‘int’ operations on a variable of type +‘UserId’, but the result will always be of type ‘int’. This lets you +pass in a ‘UserId’ wherever an ‘int’ might be expected, but will prevent +you from accidentally creating a ‘UserId’ in an invalid way: + + # 'output' is of type 'int', not 'UserId' + output = UserId(23413) + UserId(54341) + +Note that these checks are enforced only by the static type checker. At +runtime, the statement ‘Derived = NewType('Derived', Base)’ will make +‘Derived’ a callable that immediately returns whatever parameter you +pass it. That means the expression ‘Derived(some_value)’ does not +create a new class or introduce much overhead beyond that of a regular +function call. + +More precisely, the expression ‘some_value is Derived(some_value)’ is +always true at runtime. + +It is invalid to create a subtype of ‘Derived’: + + from typing import NewType + + UserId = NewType('UserId', int) + + # Fails at runtime and does not pass type checking + class AdminUserId(UserId): pass + +However, it is possible to create a *note NewType: 964. based on a +‘derived’ ‘NewType’: + + from typing import NewType + + UserId = NewType('UserId', int) + + ProUserId = NewType('ProUserId', UserId) + +and typechecking for ‘ProUserId’ will work as expected. + +See PEP 484(1) for more details. + + Note: Recall that the use of a type alias declares two types to be + `equivalent' to one another. Doing ‘Alias = Original’ will make + the static type checker treat ‘Alias’ as being `exactly equivalent' + to ‘Original’ in all cases. This is useful when you want to + simplify complex type signatures. + + In contrast, ‘NewType’ declares one type to be a `subtype' of + another. Doing ‘Derived = NewType('Derived', Original)’ will make + the static type checker treat ‘Derived’ as a `subclass' of + ‘Original’, which means a value of type ‘Original’ cannot be used + in places where a value of type ‘Derived’ is expected. This is + useful when you want to prevent logic errors with minimal runtime + cost. + +New in version 3.5.2. + +Changed in version 3.10: ‘NewType’ is now a class rather than a +function. There is some additional runtime cost when calling ‘NewType’ +over a regular function. However, this cost will be reduced in 3.11.0. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + +File: python.info, Node: Callable, Next: Generics, Prev: NewType, Up: typing — Support for type hints + +5.26.1.4 Callable +................. + +Frameworks expecting callback functions of specific signatures might be +type hinted using ‘Callable[[Arg1Type, Arg2Type], ReturnType]’. + +For example: + + from collections.abc import Callable + + 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 + +It is possible to declare the return type of a callable without +specifying the call signature by substituting a literal ellipsis for the +list of arguments in the type hint: ‘Callable[..., ReturnType]’. + +Callables which take other callables as arguments may indicate that +their parameter types are dependent on each other using *note ParamSpec: +3af. Additionally, if that callable adds or removes arguments from +other callables, the *note Concatenate: 3b0. operator may be used. They +take the form ‘Callable[ParamSpecVariable, ReturnType]’ and +‘Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], +ReturnType]’ respectively. + +Changed in version 3.10: ‘Callable’ now supports *note ParamSpec: 3af. +and *note Concatenate: 3b0. See PEP 612(1) for more details. + +See also +........ + +The documentation for *note ParamSpec: 3af. and *note Concatenate: 3b0. +provides examples of usage in ‘Callable’. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0612/ + + +File: python.info, Node: Generics, Next: User-defined generic types, Prev: Callable, Up: typing — Support for type hints + +5.26.1.5 Generics +................. + +Since type information about objects kept in containers cannot be +statically inferred in a generic way, abstract base classes have been +extended to support subscription to denote expected types for container +elements. + + from collections.abc import Mapping, Sequence + + def notify_by_email(employees: Sequence[Employee], + overrides: Mapping[str, str]) -> None: ... + +Generics can be parameterized by using a factory available in typing +called *note TypeVar: 185. + + from collections.abc import Sequence + from typing import TypeVar + + T = TypeVar('T') # Declare type variable + + def first(l: Sequence[T]) -> T: # Generic function + return l[0] + + +File: python.info, Node: User-defined generic types, Next: The Any type, Prev: Generics, Up: typing — Support for type hints + +5.26.1.6 User-defined generic types +................................... + +A user-defined class can be defined as a generic class. + + from typing import TypeVar, Generic + from logging import Logger + + T = TypeVar('T') + + class LoggedVar(Generic[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) + +‘Generic[T]’ as a base class defines that the class ‘LoggedVar’ takes a +single type parameter ‘T’ . This also makes ‘T’ valid as a type within +the class body. + +The *note Generic: 11ec. base class defines *note __class_getitem__(): +305. so that ‘LoggedVar[t]’ is valid as a type: + + from collections.abc import Iterable + + def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None: + for var in vars: + var.set(0) + +A generic type can have any number of type variables. All varieties of +*note TypeVar: 185. are permissible as parameters for a generic type: + + from typing import TypeVar, Generic, Sequence + + T = TypeVar('T', contravariant=True) + B = TypeVar('B', bound=Sequence[bytes], covariant=True) + S = TypeVar('S', int, str) + + class WeirdTrio(Generic[T, B, S]): + ... + +Each type variable argument to *note Generic: 11ec. must be distinct. +This is thus invalid: + + from typing import TypeVar, Generic + ... + + T = TypeVar('T') + + class Pair(Generic[T, T]): # INVALID + ... + +You can use multiple inheritance with *note Generic: 11ec.: + + from collections.abc import Sized + from typing import TypeVar, Generic + + T = TypeVar('T') + + class LinkedList(Sized, Generic[T]): + ... + +When inheriting from generic classes, some type variables could be +fixed: + + from collections.abc import Mapping + from typing import TypeVar + + T = TypeVar('T') + + class MyDict(Mapping[str, T]): + ... + +In this case ‘MyDict’ has a single parameter, ‘T’. + +Using a generic class without specifying type parameters assumes *note +Any: 272. for each position. In the following example, ‘MyIterable’ is +not generic but implicitly inherits from ‘Iterable[Any]’: + + from collections.abc import Iterable + + class MyIterable(Iterable): # Same as Iterable[Any] + +User defined generic type aliases are also supported. Examples: + + from collections.abc import Iterable + from typing import TypeVar + S = TypeVar('S') + Response = Iterable[S] | int + + # Return type here is same as Iterable[str] | int + def response(query: str) -> Response[str]: + ... + + T = TypeVar('T', int, float, complex) + Vec = Iterable[tuple[T, T]] + + def inproduct(v: Vec[T]) -> T: # Same as Iterable[tuple[T, T]] + return sum(x*y for x, y in v) + +Changed in version 3.7: *note Generic: 11ec. no longer has a custom +metaclass. + +User-defined generics for parameter expressions are also supported via +parameter specification variables in the form ‘Generic[P]’. The +behavior is consistent with type variables’ described above as parameter +specification variables are treated by the typing module as a +specialized type variable. The one exception to this is that a list of +types can be used to substitute a *note ParamSpec: 3af.: + + >>> from typing import Generic, ParamSpec, TypeVar + + >>> T = TypeVar('T') + >>> P = ParamSpec('P') + + >>> class Z(Generic[T, P]): ... + ... + >>> Z[int, [dict, float]] + __main__.Z[int, (<class 'dict'>, <class 'float'>)] + +Furthermore, a generic with only one parameter specification variable +will accept parameter lists in the forms ‘X[[Type1, Type2, ...]]’ and +also ‘X[Type1, Type2, ...]’ for aesthetic reasons. Internally, the +latter is converted to the former, so the following are equivalent: + + >>> class X(Generic[P]): ... + ... + >>> X[int, str] + __main__.X[(<class 'int'>, <class 'str'>)] + >>> X[[int, str]] + __main__.X[(<class 'int'>, <class 'str'>)] + +Do note that generics with *note ParamSpec: 3af. may not have correct +‘__parameters__’ after substitution in some cases because they are +intended primarily for static type checking. + +Changed in version 3.10: *note Generic: 11ec. can now be parameterized +over parameter expressions. See *note ParamSpec: 3af. and PEP 612(1) +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 typing +module are hashable and comparable for equality. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0612/ + + +File: python.info, Node: The Any type, Next: Nominal vs structural subtyping, Prev: User-defined generic types, Up: typing — Support for type hints + +5.26.1.7 The ‘Any’ type +....................... + +A special kind of type is *note Any: 272. A static type checker will +treat every type as being compatible with *note Any: 272. and *note Any: +272. as being compatible with every type. + +This means that it is possible to perform any operation or method call +on a value of type *note Any: 272. and assign it to any variable: + + from typing import Any + + a: Any = None + a = [] # OK + a = 2 # OK + + s: str = '' + 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() + ... + +Notice that no type checking is performed when assigning a value of type +*note Any: 272. to a more precise type. For example, the static type +checker did not report an error when assigning ‘a’ to ‘s’ even though +‘s’ was declared to be of type *note str: 1b3. and receives an *note +int: 1c7. value at runtime! + +Furthermore, all functions without a return type or parameter types will +implicitly default to using *note Any: 272.: + + 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 + +This behavior allows *note Any: 272. to be used as an `escape hatch' +when you need to mix dynamically and statically typed code. + +Contrast the behavior of *note Any: 272. with the behavior of *note +object: 6df. Similar to *note Any: 272, every type is a subtype of +*note object: 6df. However, unlike *note Any: 272, the reverse is not +true: *note object: 6df. is `not' a subtype of every other type. + +That means when the type of a value is *note object: 6df, 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: + + 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 compatible with all types + hash_b(42) + hash_b("foo") + +Use *note object: 6df. to indicate that a value could be any type in a +typesafe manner. Use *note Any: 272. to indicate that a value is +dynamically typed. + + +File: python.info, Node: Nominal vs structural subtyping, Next: Module contents<3>, Prev: The Any type, Up: typing — Support for type hints + +5.26.1.8 Nominal vs structural subtyping +........................................ + +Initially PEP 484(1) defined the Python static type system as using +`nominal subtyping'. This means that a class ‘A’ is allowed where a +class ‘B’ is expected if and only if ‘A’ is a subclass of ‘B’. + +This requirement previously also applied to abstract base classes, such +as *note Iterable: 1ca5. 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 PEP 484(2): + + from collections.abc import Sized, Iterable, Iterator + + class Bucket(Sized, Iterable[int]): + ... + def __len__(self) -> int: ... + def __iter__(self) -> Iterator[int]: ... + +PEP 544(3) allows to solve this problem by allowing users to write the +above code without explicit base classes in the class definition, +allowing ‘Bucket’ to be implicitly considered a subtype of both ‘Sized’ +and ‘Iterable[int]’ by static type checkers. This is known as +`structural subtyping' (or static duck-typing): + + 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 + +Moreover, by subclassing a special class *note Protocol: 276, a user can +define new custom protocols to fully enjoy structural subtyping (see +examples below). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0484/ + + (3) https://peps.python.org/pep-0544/ + + +File: python.info, Node: Module contents<3>, Next: Deprecation Timeline of Major Features, Prev: Nominal vs structural subtyping, Up: typing — Support for type hints + +5.26.1.9 Module contents +........................ + +The module defines the following classes, functions and decorators. + + Note: This module defines several types that are subclasses of + pre-existing standard library classes which also extend *note + Generic: 11ec. to support type variables inside ‘[]’. These types + became redundant in Python 3.9 when the corresponding pre-existing + classes were enhanced to support ‘[]’. + + The redundant types are deprecated as of Python 3.9 but no + deprecation warnings will be issued by the interpreter. It is + expected that type checkers will flag the deprecated types when the + checked program targets Python 3.9 or newer. + + The deprecated types will be removed from the *note typing: 123. + module in the first Python version released 5 years after the + release of Python 3.9.0. See details in PEP 585(1)—`Type Hinting + Generics In Standard Collections'. + +* Menu: + +* Special typing primitives:: +* Generic concrete collections:: +* Abstract Base Classes:: +* Protocols: Protocols<3>. +* Functions and decorators:: +* Introspection helpers:: +* Constant:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Special typing primitives, Next: Generic concrete collections, Up: Module contents<3> + +5.26.1.10 Special typing primitives +................................... + +* Menu: + +* Special types:: +* Special forms:: +* Building generic types:: +* Other special directives:: + + +File: python.info, Node: Special types, Next: Special forms, Up: Special typing primitives + +5.26.1.11 Special types +....................... + +These can be used as types in annotations and do not support ‘[]’. + + -- Data: typing.Any + + Special type indicating an unconstrained type. + + * Every type is compatible with *note Any: 272. + + * *note Any: 272. is compatible with every type. + + Changed in version 3.11: *note Any: 272. 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. + + -- Data: typing.LiteralString + + Special type that includes only literal strings. A string literal + is compatible with ‘LiteralString’, as is another ‘LiteralString’, + but an object typed as just ‘str’ is not. A string created by + composing ‘LiteralString’-typed objects is also acceptable as a + ‘LiteralString’. + + Example: + + def run_query(sql: LiteralString) -> ... + ... + + 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}" + ) + + This 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 PEP 675(1) for more details. + + New in version 3.11. + + -- Data: typing.Never + + The bottom type(2), a type that has no members. + + This can be used to define a function that should never be called, + or a function that never returns: + + from typing import Never + + 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 + + New in version 3.11: On older Python versions, *note NoReturn: + 3799. may be used to express the same concept. ‘Never’ was added + to make the intended meaning more explicit. + + -- Data: typing.NoReturn + + Special type indicating that a function never returns. For + example: + + from typing import NoReturn + + def stop() -> NoReturn: + raise RuntimeError('no way') + + ‘NoReturn’ can also be used as a bottom type(3), a type that has no + values. Starting in Python 3.11, the *note Never: 26d. type should + be used for this concept instead. Type checkers should treat the + two equivalently. + + New in version 3.5.4. + + New in version 3.6.2. + + -- Data: typing.Self + + Special type to represent the current enclosed class. For example: + + from typing import Self + + class Foo: + def return_self(self) -> Self: + ... + return self + + This annotation is semantically equivalent to the following, albeit + in a more succinct fashion: + + from typing import TypeVar + + Self = TypeVar("Self", bound="Foo") + + class Foo: + def return_self(self: Self) -> Self: + ... + return self + + In general if something currently follows the pattern of: + + class Foo: + def return_self(self) -> "Foo": + ... + return self + + You should use *note Self: 18c. as calls to + ‘SubclassOfFoo.return_self’ would have ‘Foo’ as the return type and + not ‘SubclassOfFoo’. + + Other common use cases include: + + - *note classmethod: 18d.s that are used as alternative + constructors and return instances of the ‘cls’ parameter. + + - Annotating an *note __enter__(): 18e. method which returns + self. + + See PEP 673(4) for more details. + + New in version 3.11. + + -- Data: typing.TypeAlias + + Special annotation for explicitly declaring a *note type alias: + 378e. For example: + + from typing import TypeAlias + + Factors: TypeAlias = list[int] + + See PEP 613(5) for more details about explicit type aliases. + + New in version 3.10. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0675/ + + (2) https://en.wikipedia.org/wiki/Bottom_type + + (3) https://en.wikipedia.org/wiki/Bottom_type + + (4) https://peps.python.org/pep-0673/ + + (5) https://peps.python.org/pep-0613/ + + +File: python.info, Node: Special forms, Next: Building generic types, Prev: Special types, Up: Special typing primitives + +5.26.1.12 Special forms +....................... + +These can be used as types in annotations using ‘[]’, each having a +unique syntax. + + -- Data: typing.Tuple + + Tuple type; ‘Tuple[X, Y]’ is the type of a tuple of two items with + the first item of type X and the second of type Y. The type of the + empty tuple can be written as ‘Tuple[()]’. + + Example: ‘Tuple[T1, T2]’ is a tuple of two elements corresponding + to type variables T1 and T2. ‘Tuple[int, float, str]’ is a tuple + of an int, a float and a string. + + To specify a variable-length tuple of homogeneous type, use literal + ellipsis, e.g. ‘Tuple[int, ...]’. A plain *note Tuple: 379b. is + equivalent to ‘Tuple[Any, ...]’, and in turn to *note tuple: 539. + + Deprecated since version 3.9: *note builtins.tuple: 539. now + supports ‘[]’. See PEP 585(1) and *note Generic Alias Type: 278. + + -- Data: typing.Union + + Union type; ‘Union[X, Y]’ is equivalent to ‘X | Y’ and means either + X or Y. + + To define a union, use e.g. ‘Union[int, str]’ or the shorthand + ‘int | str’. Using that shorthand is recommended. Details: + + * The arguments must be types and there must be at least one. + + * Unions of unions are flattened, e.g.: + + Union[Union[int, str], float] == Union[int, str, float] + + * Unions of a single argument vanish, e.g.: + + Union[int] == int # The constructor actually returns int + + * Redundant arguments are skipped, e.g.: + + Union[int, str, int] == Union[int, str] == int | str + + * When comparing unions, the argument order is ignored, e.g.: + + Union[int, str] == Union[str, int] + + * You cannot subclass or instantiate a ‘Union’. + + * You cannot write ‘Union[X][Y]’. + + 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 ‘X | Y’. See + *note union type expressions: 3ad. + + -- Data: typing.Optional + + Optional type. + + ‘Optional[X]’ is equivalent to ‘X | None’ (or ‘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 ‘Optional’ qualifier on its type + annotation just because it is optional. For example: + + def foo(arg: int = 0) -> None: + ... + + On the other hand, if an explicit value of ‘None’ is allowed, the + use of ‘Optional’ is appropriate, whether the argument is optional + or not. For example: + + def foo(arg: Optional[int] = None) -> None: + ... + + Changed in version 3.10: Optional can now be written as ‘X | None’. + See *note union type expressions: 3ad. + + -- Data: typing.Callable + + Callable type; ‘Callable[[int], str]’ is a function of (int) -> + str. + + 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 or an ellipsis; the return type must be a + single type. + + There is no syntax to indicate optional or keyword arguments; such + function types are rarely used as callback types. ‘Callable[..., + ReturnType]’ (literal ellipsis) can be used to type hint a callable + taking any number of arguments and returning ‘ReturnType’. A plain + *note Callable: 3b1. is equivalent to ‘Callable[..., Any]’, and in + turn to *note collections.abc.Callable: 3dc. + + Callables which take other callables as arguments may indicate that + their parameter types are dependent on each other using *note + ParamSpec: 3af. Additionally, if that callable adds or removes + arguments from other callables, the *note Concatenate: 3b0. + operator may be used. They take the form + ‘Callable[ParamSpecVariable, ReturnType]’ and + ‘Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], + ReturnType]’ respectively. + + Deprecated since version 3.9: *note collections.abc.Callable: 3dc. + now supports ‘[]’. See PEP 585(2) and *note Generic Alias Type: + 278. + + Changed in version 3.10: ‘Callable’ now supports *note ParamSpec: + 3af. and *note Concatenate: 3b0. See PEP 612(3) for more details. + + See also + ........ + + The documentation for *note ParamSpec: 3af. and *note Concatenate: + 3b0. provide examples of usage with ‘Callable’. + + -- Data: typing.Concatenate + + Used with *note Callable: 3b1. and *note ParamSpec: 3af. to type + annotate a higher order callable which adds, removes, or transforms + parameters of another callable. Usage is in the form + ‘Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]’. + ‘Concatenate’ is currently only valid when used as the first + argument to a *note Callable: 3b1. The last parameter to + ‘Concatenate’ must be a *note ParamSpec: 3af. or ellipsis (‘...’). + + For example, to annotate a decorator ‘with_lock’ which provides a + *note threading.Lock: 2950. to the decorated function, + ‘Concatenate’ can be used to indicate that ‘with_lock’ expects a + callable which takes in a ‘Lock’ as the first argument, and returns + a callable with a different type signature. In this case, the + *note ParamSpec: 3af. indicates that the returned callable’s + parameter types are dependent on the parameter types of the + callable being passed in: + + from collections.abc import Callable + from threading import Lock + from typing import Concatenate, ParamSpec, TypeVar + + P = ParamSpec('P') + R = TypeVar('R') + + # Use this lock to ensure that only one thread is executing a function + # at any time. + my_lock = Lock() + + def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: + '''A type-safe decorator which provides a lock.''' + 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: + '''Add a list of numbers together in a thread-safe manner.''' + 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]) + +New in version 3.10. + +See also +........ + + * PEP 612(4) – Parameter Specification Variables (the PEP which + introduced ‘ParamSpec’ and ‘Concatenate’). + + * *note ParamSpec: 3af. and *note Callable: 3b1. + + -- Class: typing.Type (Generic[CT_co]) + + A variable annotated with ‘C’ may accept a value of type ‘C’. In + contrast, a variable annotated with ‘Type[C]’ may accept values + that are classes themselves – specifically, it will accept the + `class object' of ‘C’. For example: + + a = 3 # Has type 'int' + b = int # Has type 'Type[int]' + c = type(a) # Also has type 'Type[int]' + + Note that ‘Type[C]’ is covariant: + + class User: ... + class BasicUser(User): ... + class ProUser(User): ... + class TeamUser(User): ... + + # Accepts User, BasicUser, ProUser, TeamUser, ... + def make_new_user(user_class: Type[User]) -> User: + # ... + return user_class() + + The fact that ‘Type[C]’ is covariant implies that all subclasses of + ‘C’ should implement the same constructor signature and class + method signatures as ‘C’. The type checker should flag violations + of this, but should also allow constructor calls in subclasses that + match the constructor calls in the indicated base class. How the + type checker is required to handle this particular case may change + in future revisions of PEP 484(5). + + The only legal parameters for *note Type: 379c. are classes, *note + Any: 272, *note type variables: 1933, and unions of any of these + types. For example: + + def new_non_team_user(user_class: Type[BasicUser | ProUser]): ... + + ‘Type[Any]’ is equivalent to ‘Type’ which in turn is equivalent to + ‘type’, which is the root of Python’s metaclass hierarchy. + + New in version 3.5.2. + + Deprecated since version 3.9: *note builtins.type: 9c2. now + supports ‘[]’. See PEP 585(6) and *note Generic Alias Type: 278. + + -- Data: typing.Literal + + A type that can be used to indicate to type checkers that the + corresponding variable or function parameter has a value equivalent + to the provided literal (or one of several literals). For example: + + def validate_simple(data: Any) -> Literal[True]: # always returns True + ... + + 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 + + ‘Literal[...]’ cannot be subclassed. At runtime, an arbitrary + value is allowed as type argument to ‘Literal[...]’, but type + checkers may impose restrictions. See PEP 586(7) for more details + about literal types. + + New in version 3.8. + + Changed in version 3.9.1: ‘Literal’ now de-duplicates parameters. + Equality comparisons of ‘Literal’ objects are no longer order + dependent. ‘Literal’ objects will now raise a *note TypeError: + 19c. exception during equality comparisons if one of their + parameters are not *note hashable: 1e8. + + -- Data: typing.ClassVar + + Special type construct to mark class variables. + + As introduced in PEP 526(8), 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: + + class Starship: + stats: ClassVar[dict[str, int]] = {} # class variable + damage: int = 10 # instance variable + + *note ClassVar: 27a. accepts only types and cannot be further + subscribed. + + *note ClassVar: 27a. is not a class itself, and should not be used + with *note isinstance(): 3ab. or *note issubclass(): 3ac. *note + ClassVar: 27a. does not change Python runtime behavior, but it can + be used by third-party type checkers. For example, a type checker + might flag the following code as an error: + + enterprise_d = Starship(3000) + enterprise_d.stats = {} # Error, setting class variable on instance + Starship.stats = {} # This is OK + + New in version 3.5.3. + + -- Data: typing.Final + + A special typing construct to indicate to type checkers that a name + cannot be re-assigned or overridden in a subclass. For 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 + + There is no runtime checking of these properties. See PEP 591(9) + for more details. + + New in version 3.8. + + -- Data: typing.Required + + -- Data: typing.NotRequired + + Special typing constructs that mark individual keys of a *note + TypedDict: 18a. as either required or non-required respectively. + + See *note TypedDict: 18a. and PEP 655(10) for more details. + + New in version 3.11. + + -- Data: typing.Annotated + + A type, introduced in PEP 593(11) (‘Flexible function and variable + annotations’), to decorate existing types with context-specific + metadata (possibly multiple pieces of it, as ‘Annotated’ is + variadic). Specifically, a type ‘T’ can be annotated with metadata + ‘x’ via the typehint ‘Annotated[T, x]’. This metadata can be used + for either static analysis or at runtime. If a library (or tool) + encounters a typehint ‘Annotated[T, x]’ and has no special logic + for metadata ‘x’, it should ignore it and simply treat the type as + ‘T’. Unlike the ‘no_type_check’ functionality that currently + exists in the ‘typing’ module which completely disables + typechecking annotations on a function or a class, the ‘Annotated’ + type allows for both static typechecking of ‘T’ (which can safely + ignore ‘x’) together with runtime access to ‘x’ within a specific + application. + + Ultimately, the responsibility of how to interpret the annotations + (if at all) is the responsibility of the tool or library + encountering the ‘Annotated’ type. A tool or library encountering + an ‘Annotated’ type can scan through the annotations to determine + if they are of interest (e.g., using ‘isinstance()’). + + When a tool or a library does not support annotations or encounters + an unknown annotation it should just ignore it and treat annotated + type as the underlying type. + + It’s up to the tool consuming the annotations to decide whether the + client is allowed to have several annotations on one type and how + to merge those annotations. + + Since the ‘Annotated’ type allows you to put several annotations of + the same (or different) type(s) on any node, the tools or libraries + consuming those annotations are in charge of dealing with potential + duplicates. For example, if you are doing value range analysis you + might allow this: + + T1 = Annotated[int, ValueRange(-10, 5)] + T2 = Annotated[T1, ValueRange(-20, 3)] + + Passing ‘include_extras=True’ to *note get_type_hints(): 277. lets + one access the extra annotations at runtime. + + The details of the syntax: + + * The first argument to ‘Annotated’ must be a valid type + + * Multiple type annotations are supported (‘Annotated’ supports + variadic arguments): + + Annotated[int, ValueRange(3, 10), ctype("char")] + + * ‘Annotated’ must be called with at least two arguments ( + ‘Annotated[int]’ is not valid) + + * The order of the annotations is preserved and matters for + equality checks: + + Annotated[int, ValueRange(3, 10), ctype("char")] != Annotated[ + int, ctype("char"), ValueRange(3, 10) + ] + + * Nested ‘Annotated’ types are flattened, with metadata ordered + starting with the innermost annotation: + + Annotated[Annotated[int, ValueRange(3, 10)], ctype("char")] == Annotated[ + int, ValueRange(3, 10), ctype("char") + ] + + * Duplicated annotations are not removed: + + Annotated[int, ValueRange(3, 10)] != Annotated[ + int, ValueRange(3, 10), ValueRange(3, 10) + ] + + * ‘Annotated’ can be used with nested and generic aliases: + + T = TypeVar('T') + Vec = Annotated[list[tuple[T, T]], MaxLen(10)] + V = Vec[int] + + V == Annotated[list[tuple[int, int]], MaxLen(10)] + + New in version 3.9. + + -- Data: typing.TypeGuard + + Special typing form used to annotate the return type of a + user-defined type guard function. ‘TypeGuard’ only accepts a + single type argument. At runtime, functions marked this way should + return a boolean. + + ‘TypeGuard’ 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 guard”: + + def is_str(val: str | float): + # "isinstance" type guard + if isinstance(val, str): + # Type of ``val`` is narrowed to ``str`` + ... + else: + # Else, type of ``val`` is narrowed to ``float``. + ... + + Sometimes it would be convenient to use a user-defined boolean + function as a type guard. Such a function should use + ‘TypeGuard[...]’ as its return type to alert static type checkers + to this intention. + + Using ‘-> TypeGuard’ tells the static type checker that for a given + function: + + 1. The return value is a boolean. + + 2. If the return value is ‘True’, the type of its argument is the + type inside ‘TypeGuard’. + + For example: + + def is_str_list(val: list[object]) -> TypeGuard[list[str]]: + '''Determines whether all objects in the list are strings''' + return all(isinstance(x, str) for x in val) + + def func1(val: list[object]): + if is_str_list(val): + # Type of ``val`` is narrowed to ``list[str]``. + print(" ".join(val)) + else: + # Type of ``val`` remains as ``list[object]``. + print("Not a list of strings!") + + If ‘is_str_list’ is a class or instance method, then the type in + ‘TypeGuard’ maps to the type of the second parameter after ‘cls’ or + ‘self’. + + In short, the form ‘def foo(arg: TypeA) -> TypeGuard[TypeB]: ...’, + means that if ‘foo(arg)’ returns ‘True’, then ‘arg’ narrows from + ‘TypeA’ to ‘TypeB’. + + Note: ‘TypeB’ need not be a narrower form of ‘TypeA’ – it can + even be a wider form. The main reason is to allow for things + like narrowing ‘list[object]’ to ‘list[str]’ even though the + latter is not a subtype of the former, since ‘list’ is + invariant. The responsibility of writing type-safe type + guards is left to the user. + + ‘TypeGuard’ also works with type variables. See PEP 647(12) for + more details. + + New in version 3.10. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://peps.python.org/pep-0585/ + + (3) https://peps.python.org/pep-0612/ + + (4) https://peps.python.org/pep-0612/ + + (5) https://peps.python.org/pep-0484/ + + (6) https://peps.python.org/pep-0585/ + + (7) https://peps.python.org/pep-0586/ + + (8) https://peps.python.org/pep-0526/ + + (9) https://peps.python.org/pep-0591/ + + (10) https://peps.python.org/pep-0655/ + + (11) https://peps.python.org/pep-0593/ + + (12) https://peps.python.org/pep-0647/ + + +File: python.info, Node: Building generic types, Next: Other special directives, Prev: Special forms, Up: Special typing primitives + +5.26.1.13 Building generic types +................................ + +These are not used in annotations. They are building blocks for +creating generic types. + + -- Class: typing.Generic + + Abstract base class for generic types. + + A generic type is typically declared by inheriting from an + instantiation of this class with one or more type variables. For + example, a generic mapping type might be defined as: + + class Mapping(Generic[KT, VT]): + def __getitem__(self, key: KT) -> VT: + ... + # Etc. + + This class can then be used as follows: + + X = TypeVar('X') + Y = TypeVar('Y') + + def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y: + try: + return mapping[key] + except KeyError: + return default + + -- Class: typing.TypeVar + + Type variable. + + Usage: + + 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 + + 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 definitions. See *note Generic: 11ec. for + more information on generic types. Generic functions work as + follows: + + def repeat(x: T, n: int) -> Sequence[T]: + """Return a list containing n references to x.""" + return [x]*n + + + def print_capitalized(x: S) -> S: + """Print x capitalized, and return x.""" + print(x.capitalize()) + return x + + + def concatenate(x: A, y: A) -> A: + """Add two strings or bytes objects together.""" + return x + y + + Note that type variables can be `bound', `constrained', or neither, + but cannot be both bound `and' constrained. + + Bound type variables and constrained type variables have different + semantics in several important ways. Using a `bound' type variable + means that the ‘TypeVar’ will be solved using the most specific + type possible: + + 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 + + Type variables can be bound to concrete types, abstract types (ABCs + or protocols), and even unions of types: + + 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 + + Using a `constrained' type variable, however, means that the + ‘TypeVar’ can only ever be solved as being exactly one of the + constraints given: + + 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 + + At runtime, ‘isinstance(x, T)’ will raise *note TypeError: 19c. In + general, *note isinstance(): 3ab. and *note issubclass(): 3ac. + should not be used with types. + + Type variables may be marked covariant or contravariant by passing + ‘covariant=True’ or ‘contravariant=True’. See PEP 484(1) for more + details. By default, type variables are invariant. + + -- Class: typing.TypeVarTuple + + Type variable tuple. A specialized form of *note type variable: + 185. that enables `variadic' generics. + + 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: + + T = TypeVar('T') + Ts = TypeVarTuple('Ts') + + def move_first_element_to_last(tup: tuple[T, *Ts]) -> tuple[*Ts, T]: + return (*tup[1:], tup[0]) + + # 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=()) + + Note the use of the unpacking operator ‘*’ in ‘tuple[T, *Ts]’. + Conceptually, you can think of ‘Ts’ as a tuple of type variables + ‘(T1, T2, ...)’. ‘tuple[T, *Ts]’ would then become ‘tuple[T, *(T1, + T2, ...)]’, which is equivalent to ‘tuple[T, T1, T2, ...]’. (Note + that in older versions of Python, you might see this written using + *note Unpack: 379e. instead, as ‘Unpack[Ts]’.) + + Type variable tuples must `always' be unpacked. This helps + distinguish type variable types from normal type variables: + + x: Ts # Not valid + x: tuple[Ts] # Not valid + x: tuple[*Ts] # The correct way to to do it + + Type variable tuples can be used in the same contexts as normal + type variables. For example, in class definitions, arguments, and + return types: + + Shape = TypeVarTuple('Shape') + class Array(Generic[*Shape]): + def __getitem__(self, key: tuple[*Shape]) -> float: ... + def __abs__(self) -> Array[*Shape]: ... + def get_shape(self) -> tuple[*Shape]: ... + + Type variable tuples can be happily combined with normal type + variables: + + DType = TypeVar('DType') + + class Array(Generic[DType, *Shape]): # This is fine + pass + + class Array2(Generic[*Shape, DType]): # This would also be fine + pass + + float_array_1d: Array[float, Height] = Array() # Totally fine + int_array_2d: Array[int, Height, Width] = Array() # Yup, fine too + + However, note that at most one type variable tuple may appear in a + single list of type arguments or type parameters: + + x: tuple[*Ts, *Ts] # Not valid + class Array(Generic[*Shape, *Shape]): # Not valid + pass + + Finally, an unpacked type variable tuple can be used as the type + annotation of ‘*args’: + + def call_soon( + callback: Callable[[*Ts], None], + *args: *Ts + ) -> None: + ... + callback(*args) + + In contrast to non-unpacked annotations of ‘*args’ - e.g. ‘*args: + int’, which would specify that `all' arguments are ‘int’ - ‘*args: + *Ts’ enables reference to the types of the `individual' arguments + in ‘*args’. Here, this allows us to ensure the types of the + ‘*args’ passed to ‘call_soon’ match the types of the (positional) + arguments of ‘callback’. + + See PEP 646(2) for more details on type variable tuples. + + New in version 3.11. + + -- Data: typing.Unpack + + A typing operator that conceptually marks an object as having been + unpacked. For example, using the unpack operator ‘*’ on a *note + type variable tuple: 186. is equivalent to using ‘Unpack’ to mark + the type variable tuple as having been unpacked: + + Ts = TypeVarTuple('Ts') + tup: tuple[*Ts] + # Effectively does: + tup: tuple[Unpack[Ts]] + + In fact, ‘Unpack’ can be used interchangeably with ‘*’ in the + context of types. You might see ‘Unpack’ being used explicitly in + older versions of Python, where ‘*’ couldn’t be used in certain + places: + + # 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 + + New in version 3.11. + + -- Class: typing.ParamSpec (name, *, bound=None, covariant=False, + contravariant=False) + + Parameter specification variable. A specialized version of *note + type variables: 185. + + Usage: + + P = ParamSpec('P') + + 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 ‘Concatenate’, or as the first argument to + ‘Callable’, or as parameters for user-defined Generics. See *note + Generic: 11ec. for more information on generic types. + + For example, to add basic logging to a function, one can create a + decorator ‘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: + + from collections.abc import Callable + from typing import TypeVar, ParamSpec + import logging + + T = TypeVar('T') + P = ParamSpec('P') + + def add_logging(f: Callable[P, T]) -> Callable[P, T]: + '''A type-safe decorator to add logging to a function.''' + 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: + '''Add two numbers together.''' + return x + y + + Without ‘ParamSpec’, the simplest way to annotate this previously + was to use a *note TypeVar: 185. with bound ‘Callable[..., Any]’. + However this causes two problems: + + 1. The type checker can’t type check the ‘inner’ function because + ‘*args’ and ‘**kwargs’ have to be typed *note Any: 272. + + 2. *note cast(): 379f. may be required in the body of the + ‘add_logging’ decorator when returning the ‘inner’ function, + or the static type checker must be told to ignore the ‘return + inner’. + + -- Attribute: args + + -- Attribute: kwargs + + Since ‘ParamSpec’ captures both positional and keyword + parameters, ‘P.args’ and ‘P.kwargs’ can be used to split a + ‘ParamSpec’ into its components. ‘P.args’ represents the + tuple of positional parameters in a given call and should only + be used to annotate ‘*args’. ‘P.kwargs’ represents the + mapping of keyword parameters to their values in a given call, + and should be only be used to annotate ‘**kwargs’. Both + attributes require the annotated parameter to be in scope. At + runtime, ‘P.args’ and ‘P.kwargs’ are instances respectively of + *note ParamSpecArgs: 3b2. and *note ParamSpecKwargs: 3b3. + + Parameter specification variables created with ‘covariant=True’ or + ‘contravariant=True’ can be used to declare covariant or + contravariant generic types. The ‘bound’ argument is also + accepted, similar to *note TypeVar: 185. However the actual + semantics of these keywords are yet to be decided. + + New in version 3.10. + + Note: Only parameter specification variables defined in global + scope can be pickled. + + See also + ........ + + * PEP 612(3) – Parameter Specification Variables (the PEP which + introduced ‘ParamSpec’ and ‘Concatenate’). + + * *note Callable: 3b1. and *note Concatenate: 3b0. + + -- Data: typing.ParamSpecArgs + + -- Data: typing.ParamSpecKwargs + + Arguments and keyword arguments attributes of a *note ParamSpec: + 3af. The ‘P.args’ attribute of a ‘ParamSpec’ is an instance of + ‘ParamSpecArgs’, and ‘P.kwargs’ is an instance of + ‘ParamSpecKwargs’. They are intended for runtime introspection and + have no special meaning to static type checkers. + + Calling *note get_origin(): 696. on either of these objects will + return the original ‘ParamSpec’: + + P = ParamSpec("P") + get_origin(P.args) # returns P + get_origin(P.kwargs) # returns P + + New in version 3.10. + + -- Data: typing.AnyStr + + ‘AnyStr’ is a *note constrained type variable: 185. defined as + ‘AnyStr = TypeVar('AnyStr', str, bytes)’. + + It is meant to be used for functions that may accept any kind of + string without allowing different kinds of strings to mix. For + example: + + def concat(a: AnyStr, b: AnyStr) -> AnyStr: + return a + b + + concat(u"foo", u"bar") # Ok, output has type 'unicode' + concat(b"foo", b"bar") # Ok, output has type 'bytes' + concat(u"foo", b"bar") # Error, cannot mix unicode and bytes + + -- Class: typing.Protocol (Generic) + + Base class for protocol classes. Protocol classes are defined like + this: + + class Proto(Protocol): + def meth(self) -> int: + ... + + Such classes are primarily used with static type checkers that + recognize structural subtyping (static duck-typing), for example: + + class C: + def meth(self) -> int: + return 0 + + def func(x: Proto) -> int: + return x.meth() + + func(C()) # Passes static type check + + See PEP 544(4) for more details. Protocol classes decorated with + *note runtime_checkable(): 693. (described later) act as + simple-minded runtime protocols that check only the presence of + given attributes, ignoring their type signatures. + + Protocol classes can be generic, for example: + + class GenProto(Protocol[T]): + def meth(self) -> T: + ... + + New in version 3.8. + + -- Function: @typing.runtime_checkable + + Mark a protocol class as a runtime protocol. + + Such a protocol can be used with *note isinstance(): 3ab. and *note + issubclass(): 3ac. This raises *note TypeError: 19c. when applied + to a non-protocol class. This allows a simple-minded structural + check, very similar to “one trick ponies” in *note collections.abc: + 1d. such as *note Iterable: 1ca5. For example: + + @runtime_checkable + class Closable(Protocol): + def close(self): ... + + assert isinstance(open('/some/file'), Closable) + + Note: *note runtime_checkable(): 693. will check only the + presence of the required methods, not their type signatures. + For example, *note ssl.SSLObject: 7e1. is a class, therefore + it passes an *note issubclass(): 3ac. check against *note + Callable: 3b1. However, the ‘ssl.SSLObject.__init__()’ method + exists only to raise a *note TypeError: 19c. with a more + informative message, therefore making it impossible to call + (instantiate) *note ssl.SSLObject: 7e1. + + New in version 3.8. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0646/ + + (3) https://peps.python.org/pep-0612/ + + (4) https://peps.python.org/pep-0544/ + + +File: python.info, Node: Other special directives, Prev: Building generic types, Up: Special typing primitives + +5.26.1.14 Other special directives +.................................. + +These are not used in annotations. They are building blocks for +declaring types. + + -- Class: typing.NamedTuple + + Typed version of *note collections.namedtuple(): 538. + + Usage: + + class Employee(NamedTuple): + name: str + id: int + + This is equivalent to: + + Employee = collections.namedtuple('Employee', ['name', 'id']) + + To give a field a default value, you can assign to it in the class + body: + + class Employee(NamedTuple): + name: str + id: int = 3 + + employee = Employee('Guido') + assert employee.id == 3 + + Fields with a default value must come after any fields without a + default. + + The resulting class has an extra attribute ‘__annotations__’ giving + a dict that maps the field names to the field types. (The field + names are in the ‘_fields’ attribute and the default values are in + the ‘_field_defaults’ attribute, both of which are part of the + *note namedtuple(): 538. API.) + + ‘NamedTuple’ subclasses can also have docstrings and methods: + + class Employee(NamedTuple): + """Represents an employee.""" + name: str + id: int = 3 + + def __repr__(self) -> str: + return f'<Employee {self.name}, id={self.id}>' + + ‘NamedTuple’ subclasses can be generic: + + class Group(NamedTuple, Generic[T]): + key: T + group: list[T] + + Backward-compatible usage: + + Employee = NamedTuple('Employee', [('name', str), ('id', int)]) + + Changed in version 3.6: Added support for PEP 526(1) variable + annotation syntax. + + Changed in version 3.6.1: Added support for default values, + methods, and docstrings. + + Changed in version 3.8: The ‘_field_types’ and ‘__annotations__’ + attributes are now regular dictionaries instead of instances of + ‘OrderedDict’. + + Changed in version 3.9: Removed the ‘_field_types’ attribute in + favor of the more standard ‘__annotations__’ attribute which has + the same information. + + Changed in version 3.11: Added support for generic namedtuples. + + -- Class: typing.NewType (name, tp) + + A helper class to indicate a distinct type to a typechecker, see + *note NewType: 378f. At runtime it returns an object that returns + its argument when called. Usage: + + UserId = NewType('UserId', int) + first_user = UserId(1) + + New in version 3.5.2. + + Changed in version 3.10: ‘NewType’ is now a class rather than a + function. + + -- Class: typing.TypedDict (dict) + + Special construct to add type hints to a dictionary. At runtime it + is a plain *note dict: 16e. + + ‘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: + + 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') + + To allow using this feature with older versions of Python that do + not support PEP 526(2), ‘TypedDict’ supports two additional + equivalent syntactic forms: + + * Using a literal *note dict: 16e. as the second argument: + + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) + + * Using keyword arguments: + + Point2D = TypedDict('Point2D', x=int, y=int, label=str) + + Deprecated since version 3.11, will be removed in version 3.13: The + keyword-argument syntax is deprecated in 3.11 and will be removed + in 3.13. It may also be unsupported by static type checkers. + + The functional syntax should also be used when any of the keys are + not valid *note identifiers: 1877, for example because they are + keywords or contain hyphens. Example: + + # raises SyntaxError + class Point2D(TypedDict): + in: int # 'in' is a keyword + x-y: int # name with hyphens + + # OK, functional syntax + Point2D = TypedDict('Point2D', {'in': int, 'x-y': int}) + + By default, all keys must be present in a ‘TypedDict’. It is + possible to mark individual keys as non-required using *note + NotRequired: 189.: + + class Point2D(TypedDict): + x: int + y: int + label: NotRequired[str] + + # Alternative syntax + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': NotRequired[str]}) + + This means that a ‘Point2D’ ‘TypedDict’ can have the ‘label’ key + omitted. + + It is also possible to mark all keys as non-required by default by + specifying a totality of ‘False’: + + class Point2D(TypedDict, total=False): + x: int + y: int + + # Alternative syntax + Point2D = TypedDict('Point2D', {'x': int, 'y': int}, total=False) + + This means that a ‘Point2D’ ‘TypedDict’ can have any of the keys + omitted. A type checker is only expected to support a literal + ‘False’ or ‘True’ as the value of the ‘total’ argument. ‘True’ is + the default, and makes all items defined in the class body + required. + + Individual keys of a ‘total=False’ ‘TypedDict’ can be marked as + required using *note Required: 188.: + + 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) + + It is possible for a ‘TypedDict’ type to inherit from one or more + other ‘TypedDict’ types using the class-based syntax. Usage: + + class Point3D(Point2D): + z: int + + ‘Point3D’ has three items: ‘x’, ‘y’ and ‘z’. It is equivalent to + this definition: + + class Point3D(TypedDict): + x: int + y: int + z: int + + A ‘TypedDict’ cannot inherit from a non-‘TypedDict’ class, except + for *note Generic: 11ec. For 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 + + T = TypeVar('T') + class XT(X, Generic[T]): pass # raises TypeError + + A ‘TypedDict’ can be generic: + + class Group(TypedDict, Generic[T]): + key: T + group: list[T] + + A ‘TypedDict’ can be introspected via annotations dicts (see *note + Annotations Best Practices: 3c9. for more information on + annotations best practices), *note __total__: 37a4, *note + __required_keys__: 37a5, and *note __optional_keys__: 37a6. + + -- Attribute: __total__ + + ‘Point2D.__total__’ gives the value of the ‘total’ argument. + 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 + + -- Attribute: __required_keys__ + + New in version 3.9. + + -- Attribute: __optional_keys__ + + ‘Point2D.__required_keys__’ and ‘Point2D.__optional_keys__’ + return *note frozenset: 1a7. objects containing required and + non-required keys, respectively. + + Keys marked with *note Required: 188. will always appear in + ‘__required_keys__’ and keys marked with *note NotRequired: + 189. will always appear in ‘__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 ‘TypedDict’ . This is done by + declaring a ‘TypedDict’ with one value for the ‘total’ + argument and then inheriting from it in another ‘TypedDict’ + with a different value for ‘total’: + + >>> 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 + + New in version 3.9. + + See PEP 589(3) for more examples and detailed rules of using + ‘TypedDict’. + + New in version 3.8. + + Changed in version 3.11: Added support for marking individual keys + as *note Required: 188. or *note NotRequired: 189. See PEP 655(4). + + Changed in version 3.11: Added support for generic ‘TypedDict’s. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0526/ + + (2) https://peps.python.org/pep-0526/ + + (3) https://peps.python.org/pep-0589/ + + (4) https://peps.python.org/pep-0655/ + + +File: python.info, Node: Generic concrete collections, Next: Abstract Base Classes, Prev: Special typing primitives, Up: Module contents<3> + +5.26.1.15 Generic concrete collections +...................................... + +* Menu: + +* Corresponding to built-in types:: +* Corresponding to types in collections:: +* Other concrete types:: + + +File: python.info, Node: Corresponding to built-in types, Next: Corresponding to types in collections, Up: Generic concrete collections + +5.26.1.16 Corresponding to built-in types +......................................... + + -- Class: typing.Dict (dict, MutableMapping[KT, VT]) + + A generic version of *note dict: 16e. Useful for annotating return + types. To annotate arguments it is preferred to use an abstract + collection type such as *note Mapping: 37aa. + + This type can be used as follows: + + def count_words(text: str) -> Dict[str, int]: + ... + + Deprecated since version 3.9: *note builtins.dict: 16e. now + supports ‘[]’. See PEP 585(1) and *note Generic Alias Type: 278. + + -- Class: typing.List (list, MutableSequence[T]) + + Generic version of *note list: 1e9. Useful for annotating return + types. To annotate arguments it is preferred to use an abstract + collection type such as *note Sequence: 37ac. or *note Iterable: + 37ad. + + This type may be used as follows: + + T = TypeVar('T', int, float) + + def vec2(x: T, y: T) -> List[T]: + return [x, y] + + def keep_positives(vector: Sequence[T]) -> List[T]: + return [item for item in vector if item > 0] + + Deprecated since version 3.9: *note builtins.list: 1e9. now + supports ‘[]’. See PEP 585(2) and *note Generic Alias Type: 278. + + -- Class: typing.Set (set, MutableSet[T]) + + A generic version of *note builtins.set: 1a6. Useful for + annotating return types. To annotate arguments it is preferred to + use an abstract collection type such as *note AbstractSet: 37af. + + Deprecated since version 3.9: *note builtins.set: 1a6. now supports + ‘[]’. See PEP 585(3) and *note Generic Alias Type: 278. + + -- Class: typing.FrozenSet (frozenset, AbstractSet[T_co]) + + A generic version of *note builtins.frozenset: 1a7. + + Deprecated since version 3.9: *note builtins.frozenset: 1a7. now + supports ‘[]’. See PEP 585(4) and *note Generic Alias Type: 278. + + Note: *note Tuple: 379b. is a special form. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://peps.python.org/pep-0585/ + + (3) https://peps.python.org/pep-0585/ + + (4) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Corresponding to types in collections, Next: Other concrete types, Prev: Corresponding to built-in types, Up: Generic concrete collections + +5.26.1.17 Corresponding to types in ‘collections’ +................................................. + + -- Class: typing.DefaultDict (collections.defaultdict, + MutableMapping[KT, VT]) + + A generic version of *note collections.defaultdict: e71. + + New in version 3.5.2. + + Deprecated since version 3.9: *note collections.defaultdict: e71. + now supports ‘[]’. See PEP 585(1) and *note Generic Alias Type: + 278. + + -- Class: typing.OrderedDict (collections.OrderedDict, + MutableMapping[KT, VT]) + + A generic version of *note collections.OrderedDict: 1a8. + + New in version 3.7.2. + + Deprecated since version 3.9: *note collections.OrderedDict: 1a8. + now supports ‘[]’. See PEP 585(2) and *note Generic Alias Type: + 278. + + -- Class: typing.ChainMap (collections.ChainMap, MutableMapping[KT, + VT]) + + A generic version of *note collections.ChainMap: 886. + + New in version 3.5.4. + + New in version 3.6.1. + + Deprecated since version 3.9: *note collections.ChainMap: 886. now + supports ‘[]’. See PEP 585(3) and *note Generic Alias Type: 278. + + -- Class: typing.Counter (collections.Counter, Dict[T, int]) + + A generic version of *note collections.Counter: d43. + + New in version 3.5.4. + + New in version 3.6.1. + + Deprecated since version 3.9: *note collections.Counter: d43. now + supports ‘[]’. See PEP 585(4) and *note Generic Alias Type: 278. + + -- Class: typing.Deque (deque, MutableSequence[T]) + + A generic version of *note collections.deque: 1a9. + + New in version 3.5.4. + + New in version 3.6.1. + + Deprecated since version 3.9: *note collections.deque: 1a9. now + supports ‘[]’. See PEP 585(5) and *note Generic Alias Type: 278. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://peps.python.org/pep-0585/ + + (3) https://peps.python.org/pep-0585/ + + (4) https://peps.python.org/pep-0585/ + + (5) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Other concrete types, Prev: Corresponding to types in collections, Up: Generic concrete collections + +5.26.1.18 Other concrete types +.............................. + + -- Class: typing.IO + -- Class: typing.TextIO + -- Class: typing.BinaryIO + + Generic type ‘IO[AnyStr]’ and its subclasses ‘TextIO(IO[str])’ and + ‘BinaryIO(IO[bytes])’ represent the types of I/O streams such as + returned by *note open(): 30b. + + Deprecated since version 3.8, will be removed in version 3.12: The + ‘typing.io’ namespace is deprecated and will be removed. These + types should be directly imported from ‘typing’ instead. + + -- Class: typing.Pattern + -- Class: typing.Match + + These type aliases correspond to the return types from *note + re.compile(): 83a. and *note re.match(): ee0. These types (and the + corresponding functions) are generic in ‘AnyStr’ and can be made + specific by writing ‘Pattern[str]’, ‘Pattern[bytes]’, ‘Match[str]’, + or ‘Match[bytes]’. + + Deprecated since version 3.8, will be removed in version 3.12: The + ‘typing.re’ namespace is deprecated and will be removed. These + types should be directly imported from ‘typing’ instead. + + Deprecated since version 3.9: Classes ‘Pattern’ and ‘Match’ from + *note re: da. now support ‘[]’. See PEP 585(1) and *note Generic + Alias Type: 278. + + -- Class: typing.Text + + ‘Text’ is an alias for ‘str’. It is provided to supply a forward + compatible path for Python 2 code: in Python 2, ‘Text’ is an alias + for ‘unicode’. + + Use ‘Text’ to indicate that a value must contain a unicode string + in a manner that is compatible with both Python 2 and Python 3: + + def add_unicode_checkmark(text: Text) -> Text: + return text + u' \u2713' + + New 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 *note str: 1b3. instead of ‘Text’ wherever + possible. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Abstract Base Classes, Next: Protocols<3>, Prev: Generic concrete collections, Up: Module contents<3> + +5.26.1.19 Abstract Base Classes +............................... + +* Menu: + +* Corresponding to collections in collections.abc: Corresponding to collections in collections abc. +* Corresponding to other types in collections.abc: Corresponding to other types in collections abc. +* Asynchronous programming:: +* Context manager types:: + + +File: python.info, Node: Corresponding to collections in collections abc, Next: Corresponding to other types in collections abc, Up: Abstract Base Classes + +5.26.1.20 Corresponding to collections in ‘collections.abc’ +........................................................... + + -- Class: typing.AbstractSet (Sized, Collection[T_co]) + + A generic version of *note collections.abc.Set: 1c9d. + + Deprecated since version 3.9: *note collections.abc.Set: 1c9d. now + supports ‘[]’. See PEP 585(1) and *note Generic Alias Type: 278. + + -- Class: typing.ByteString (Sequence[int]) + + A generic version of *note collections.abc.ByteString: 1ca9. + + This type represents the types *note bytes: 1b4, *note bytearray: + 1a5, and *note memoryview: 6ad. of byte sequences. + + As a shorthand for this type, *note bytes: 1b4. can be used to + annotate arguments of any of the types mentioned above. + + Deprecated since version 3.9: *note collections.abc.ByteString: + 1ca9. now supports ‘[]’. See PEP 585(2) and *note Generic Alias + Type: 278. + + -- Class: typing.Collection (Sized, Iterable[T_co], Container[T_co]) + + A generic version of *note collections.abc.Collection: 8f9. + + New in version 3.6.0. + + Deprecated since version 3.9: *note collections.abc.Collection: + 8f9. now supports ‘[]’. See PEP 585(3) and *note Generic Alias + Type: 278. + + -- Class: typing.Container (Generic[T_co]) + + A generic version of *note collections.abc.Container: 1ca7. + + Deprecated since version 3.9: *note collections.abc.Container: + 1ca7. now supports ‘[]’. See PEP 585(4) and *note Generic Alias + Type: 278. + + -- Class: typing.ItemsView (MappingView, Generic[KT_co, VT_co]) + + A generic version of *note collections.abc.ItemsView: 1cac. + + Deprecated since version 3.9: *note collections.abc.ItemsView: + 1cac. now supports ‘[]’. See PEP 585(5) and *note Generic Alias + Type: 278. + + -- Class: typing.KeysView (MappingView[KT_co], AbstractSet[KT_co]) + + A generic version of *note collections.abc.KeysView: 1cab. + + Deprecated since version 3.9: *note collections.abc.KeysView: 1cab. + now supports ‘[]’. See PEP 585(6) and *note Generic Alias Type: + 278. + + -- Class: typing.Mapping (Sized, Collection[KT], Generic[VT_co]) + + A generic version of *note collections.abc.Mapping: 505. This type + can be used as follows: + + def get_position_in_index(word_list: Mapping[str, int], word: str) -> int: + return word_list[word] + + Deprecated since version 3.9: *note collections.abc.Mapping: 505. + now supports ‘[]’. See PEP 585(7) and *note Generic Alias Type: + 278. + + -- Class: typing.MappingView (Sized, Iterable[T_co]) + + A generic version of *note collections.abc.MappingView: 1caa. + + Deprecated since version 3.9: *note collections.abc.MappingView: + 1caa. now supports ‘[]’. See PEP 585(8) and *note Generic Alias + Type: 278. + + -- Class: typing.MutableMapping (Mapping[KT, VT]) + + A generic version of *note collections.abc.MutableMapping: d58. + + Deprecated since version 3.9: *note collections.abc.MutableMapping: + d58. now supports ‘[]’. See PEP 585(9) and *note Generic Alias + Type: 278. + + -- Class: typing.MutableSequence (Sequence[T]) + + A generic version of *note collections.abc.MutableSequence: a55. + + Deprecated since version 3.9: *note + collections.abc.MutableSequence: a55. now supports ‘[]’. See PEP + 585(10) and *note Generic Alias Type: 278. + + -- Class: typing.MutableSet (AbstractSet[T]) + + A generic version of *note collections.abc.MutableSet: 1ca8. + + Deprecated since version 3.9: *note collections.abc.MutableSet: + 1ca8. now supports ‘[]’. See PEP 585(11) and *note Generic Alias + Type: 278. + + -- Class: typing.Sequence (Reversible[T_co], Collection[T_co]) + + A generic version of *note collections.abc.Sequence: 12a3. + + Deprecated since version 3.9: *note collections.abc.Sequence: 12a3. + now supports ‘[]’. See PEP 585(12) and *note Generic Alias Type: + 278. + + -- Class: typing.ValuesView (MappingView[VT_co]) + + A generic version of *note collections.abc.ValuesView: 1cad. + + Deprecated since version 3.9: *note collections.abc.ValuesView: + 1cad. now supports ‘[]’. See PEP 585(13) and *note Generic Alias + Type: 278. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://peps.python.org/pep-0585/ + + (3) https://peps.python.org/pep-0585/ + + (4) https://peps.python.org/pep-0585/ + + (5) https://peps.python.org/pep-0585/ + + (6) https://peps.python.org/pep-0585/ + + (7) https://peps.python.org/pep-0585/ + + (8) https://peps.python.org/pep-0585/ + + (9) https://peps.python.org/pep-0585/ + + (10) https://peps.python.org/pep-0585/ + + (11) https://peps.python.org/pep-0585/ + + (12) https://peps.python.org/pep-0585/ + + (13) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Corresponding to other types in collections abc, Next: Asynchronous programming, Prev: Corresponding to collections in collections abc, Up: Abstract Base Classes + +5.26.1.21 Corresponding to other types in ‘collections.abc’ +........................................................... + + -- Class: typing.Iterable (Generic[T_co]) + + A generic version of *note collections.abc.Iterable: 1ca5. + + Deprecated since version 3.9: *note collections.abc.Iterable: 1ca5. + now supports ‘[]’. See PEP 585(1) and *note Generic Alias Type: + 278. + + -- Class: typing.Iterator (Iterable[T_co]) + + A generic version of *note collections.abc.Iterator: 1ca6. + + Deprecated since version 3.9: *note collections.abc.Iterator: 1ca6. + now supports ‘[]’. See PEP 585(2) and *note Generic Alias Type: + 278. + + -- Class: typing.Generator (Iterator[T_co], Generic[T_co, T_contra, + V_co]) + + A generator can be annotated by the generic type + ‘Generator[YieldType, SendType, ReturnType]’. For example: + + def echo_round() -> Generator[int, float, str]: + sent = yield 0 + while sent >= 0: + sent = yield round(sent) + return 'Done' + + Note that unlike many other generics in the typing module, the + ‘SendType’ of *note Generator: 37ca. behaves contravariantly, not + covariantly or invariantly. + + If your generator will only yield values, set the ‘SendType’ and + ‘ReturnType’ to ‘None’: + + def infinite_stream(start: int) -> Generator[int, None, None]: + while True: + yield start + start += 1 + + Alternatively, annotate your generator as having a return type of + either ‘Iterable[YieldType]’ or ‘Iterator[YieldType]’: + + def infinite_stream(start: int) -> Iterator[int]: + while True: + yield start + start += 1 + + Deprecated since version 3.9: *note collections.abc.Generator: a5c. + now supports ‘[]’. See PEP 585(3) and *note Generic Alias Type: + 278. + + -- Class: typing.Hashable + + An alias to *note collections.abc.Hashable: 1f64. + + -- Class: typing.Reversible (Iterable[T_co]) + + A generic version of *note collections.abc.Reversible: 8fa. + + Deprecated since version 3.9: *note collections.abc.Reversible: + 8fa. now supports ‘[]’. See PEP 585(4) and *note Generic Alias + Type: 278. + + -- Class: typing.Sized + + An alias to *note collections.abc.Sized: 1f65. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://peps.python.org/pep-0585/ + + (3) https://peps.python.org/pep-0585/ + + (4) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Asynchronous programming, Next: Context manager types, Prev: Corresponding to other types in collections abc, Up: Abstract Base Classes + +5.26.1.22 Asynchronous programming +.................................. + + -- Class: typing.Coroutine (Awaitable[V_co], Generic[T_co, T_contra, + V_co]) + + A generic version of *note collections.abc.Coroutine: a5e. The + variance and order of type variables correspond to those of *note + Generator: 37ca, for 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 + + New in version 3.5.3. + + Deprecated since version 3.9: *note collections.abc.Coroutine: a5e. + now supports ‘[]’. See PEP 585(1) and *note Generic Alias Type: + 278. + + -- Class: typing.AsyncGenerator (AsyncIterator[T_co], Generic[T_co, + T_contra]) + + An async generator can be annotated by the generic type + ‘AsyncGenerator[YieldType, SendType]’. For example: + + async def echo_round() -> AsyncGenerator[int, float]: + sent = yield 0 + while sent >= 0.0: + rounded = await round(sent) + sent = yield rounded + + Unlike normal generators, async generators cannot return a value, + so there is no ‘ReturnType’ type parameter. As with *note + Generator: 37ca, the ‘SendType’ behaves contravariantly. + + If your generator will only yield values, set the ‘SendType’ to + ‘None’: + + async def infinite_stream(start: int) -> AsyncGenerator[int, None]: + while True: + yield start + start = await increment(start) + + Alternatively, annotate your generator as having a return type of + either ‘AsyncIterable[YieldType]’ or ‘AsyncIterator[YieldType]’: + + async def infinite_stream(start: int) -> AsyncIterator[int]: + while True: + yield start + start = await increment(start) + + New in version 3.6.1. + + Deprecated since version 3.9: *note collections.abc.AsyncGenerator: + 8fb. now supports ‘[]’. See PEP 585(2) and *note Generic Alias + Type: 278. + + -- Class: typing.AsyncIterable (Generic[T_co]) + + A generic version of *note collections.abc.AsyncIterable: a60. + + New in version 3.5.2. + + Deprecated since version 3.9: *note collections.abc.AsyncIterable: + a60. now supports ‘[]’. See PEP 585(3) and *note Generic Alias + Type: 278. + + -- Class: typing.AsyncIterator (AsyncIterable[T_co]) + + A generic version of *note collections.abc.AsyncIterator: a5f. + + New in version 3.5.2. + + Deprecated since version 3.9: *note collections.abc.AsyncIterator: + a5f. now supports ‘[]’. See PEP 585(4) and *note Generic Alias + Type: 278. + + -- Class: typing.Awaitable (Generic[T_co]) + + A generic version of *note collections.abc.Awaitable: a5d. + + New in version 3.5.2. + + Deprecated since version 3.9: *note collections.abc.Awaitable: a5d. + now supports ‘[]’. See PEP 585(5) and *note Generic Alias Type: + 278. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://peps.python.org/pep-0585/ + + (3) https://peps.python.org/pep-0585/ + + (4) https://peps.python.org/pep-0585/ + + (5) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Context manager types, Prev: Asynchronous programming, Up: Abstract Base Classes + +5.26.1.23 Context manager types +............................... + + -- Class: typing.ContextManager (Generic[T_co]) + + A generic version of *note contextlib.AbstractContextManager: 8fe. + + New in version 3.5.4. + + New in version 3.6.0. + + Deprecated since version 3.9: *note + contextlib.AbstractContextManager: 8fe. now supports ‘[]’. See PEP + 585(1) and *note Generic Alias Type: 278. + + -- Class: typing.AsyncContextManager (Generic[T_co]) + + A generic version of *note contextlib.AbstractAsyncContextManager: + 780. + + New in version 3.5.4. + + New in version 3.6.2. + + Deprecated since version 3.9: *note + contextlib.AbstractAsyncContextManager: 780. now supports ‘[]’. + See PEP 585(2) and *note Generic Alias Type: 278. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0585/ + + (2) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Protocols<3>, Next: Functions and decorators, Prev: Abstract Base Classes, Up: Module contents<3> + +5.26.1.24 Protocols +................... + +These protocols are decorated with *note runtime_checkable(): 693. + + -- Class: typing.SupportsAbs + + An ABC with one abstract method ‘__abs__’ that is covariant in its + return type. + + -- Class: typing.SupportsBytes + + An ABC with one abstract method ‘__bytes__’. + + -- Class: typing.SupportsComplex + + An ABC with one abstract method ‘__complex__’. + + -- Class: typing.SupportsFloat + + An ABC with one abstract method ‘__float__’. + + -- Class: typing.SupportsIndex + + An ABC with one abstract method ‘__index__’. + + New in version 3.8. + + -- Class: typing.SupportsInt + + An ABC with one abstract method ‘__int__’. + + -- Class: typing.SupportsRound + + An ABC with one abstract method ‘__round__’ that is covariant in + its return type. + + +File: python.info, Node: Functions and decorators, Next: Introspection helpers, Prev: Protocols<3>, Up: Module contents<3> + +5.26.1.25 Functions and decorators +.................................. + + -- 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). + + -- Function: typing.assert_type (val, typ, /) + + Ask a static type checker to confirm that `val' has an inferred + type of `typ'. + + When the type checker encounters a call to ‘assert_type()’, it + emits an error if the value is not of the specified type: + + def greet(name: str) -> None: + assert_type(name, str) # OK, inferred type of `name` is `str` + assert_type(name, int) # type checker error + + At runtime this returns the first argument unchanged with no side + effects. + + This function is useful for ensuring the type checker’s + understanding of a script is in line with the developer’s + intentions: + + 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) + + New in version 3.11. + + -- Function: typing.assert_never (arg, /) + + Ask a static type checker to confirm that a line of code is + unreachable. + + 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) + + Here, the annotations allow the type checker to infer that the last + case can never execute, because ‘arg’ is either an *note int: 1c7. + or a *note str: 1b3, and both options are covered by earlier cases. + If a type checker finds that a call to ‘assert_never()’ is + reachable, it will emit an error. For example, if the type + annotation for ‘arg’ was instead ‘int | str | float’, the type + checker would emit an error pointing out that ‘unreachable’ is of + type *note float: 3ca. For a call to ‘assert_never’ to pass type + checking, the inferred type of the argument passed in must be the + bottom type, *note Never: 26d, and nothing else. + + At runtime, this throws an exception when called. + + See also + ........ + + Unreachable Code and Exhaustiveness Checking(1) has more + information about exhaustiveness checking with static typing. + + New in version 3.11. + + -- Function: typing.reveal_type (obj, /) + + Reveal the inferred static type of an expression. + + When a static type checker encounters a call to this function, it + emits a diagnostic with the type of the argument. For example: + + x: int = 1 + reveal_type(x) # Revealed type is "builtins.int" + + This can be useful when you want to debug how your type checker + handles a particular piece of code. + + The function returns its argument unchanged, which allows using it + within an expression: + + x = reveal_type(1) # Revealed type is "builtins.int" + + Most type checkers support ‘reveal_type()’ anywhere, even if the + name is not imported from ‘typing’. Importing the name from + ‘typing’ allows your code to run without runtime errors and + communicates intent more clearly. + + At runtime, this function prints the runtime type of its argument + to stderr and returns it unchanged: + + x = reveal_type(1) # prints "Runtime type is int" + print(x) # prints "1" + + New in version 3.11. + + -- Function: @typing.dataclass_transform + + *note dataclass_transform: 192. may be used to decorate a class, + metaclass, or a function that is itself a decorator. The presence + of ‘@dataclass_transform()’ tells a static type checker that the + decorated object performs runtime “magic” that transforms a class, + giving it *note dataclasses.dataclass(): 193.-like behaviors. + + Example usage with a decorator function: + + T = TypeVar("T") + + @dataclass_transform() + def create_model(cls: type[T]) -> type[T]: + ... + return cls + + @create_model + class CustomerModel: + id: int + name: str + + On a base class: + + @dataclass_transform() + class ModelBase: ... + + class CustomerModel(ModelBase): + id: int + name: str + + On a metaclass: + + @dataclass_transform() + class ModelMeta(type): ... + + class ModelBase(metaclass=ModelMeta): ... + + class CustomerModel(ModelBase): + id: int + name: str + + The ‘CustomerModel’ classes defined above will be treated by type + checkers similarly to classes created with *note + @dataclasses.dataclass: 193. For example, type checkers will + assume these classes have ‘__init__’ methods that accept ‘id’ and + ‘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 *note @dataclasses.dataclass: + 193. decorator: ‘init’, ‘eq’, ‘order’, ‘unsafe_hash’, ‘frozen’, + ‘match_args’, ‘kw_only’, and ‘slots’. It must be possible for the + value of these arguments (‘True’ or ‘False’) to be statically + evaluated. + + The arguments to the ‘dataclass_transform’ decorator can be used to + customize the default behaviors of the decorated class, metaclass, + or function: + + * ‘eq_default’ indicates whether the ‘eq’ parameter is assumed + to be ‘True’ or ‘False’ if it is omitted by the caller. + + * ‘order_default’ indicates whether the ‘order’ parameter is + assumed to be True or False if it is omitted by the caller. + + * ‘kw_only_default’ indicates whether the ‘kw_only’ parameter is + assumed to be True or False if it is omitted by the caller. + + * ‘field_specifiers’ specifies a static list of supported + classes or functions that describe fields, similar to + ‘dataclasses.field()’. + + * Arbitrary other keyword arguments are accepted in order to + allow for possible future extensions. + + Type checkers recognize the following optional arguments on field + specifiers: + + * ‘init’ indicates whether the field should be included in the + synthesized ‘__init__’ method. If unspecified, ‘init’ + defaults to ‘True’. + + * ‘default’ provides the default value for the field. + + * ‘default_factory’ provides a runtime callback that returns the + default value for the field. If neither ‘default’ nor + ‘default_factory’ are specified, the field is assumed to have + no default value and must be provided a value when the class + is instantiated. + + * ‘factory’ is an alias for ‘default_factory’. + + * ‘kw_only’ indicates whether the field should be marked as + keyword-only. If ‘True’, the field will be keyword-only. If + ‘False’, it will not be keyword-only. If unspecified, the + value of the ‘kw_only’ parameter on the object decorated with + ‘dataclass_transform’ will be used, or if that is unspecified, + the value of ‘kw_only_default’ on ‘dataclass_transform’ will + be used. + + * ‘alias’ provides an alternative name for the field. This + alternative name is used in the synthesized ‘__init__’ method. + + At runtime, this decorator records its arguments in the + ‘__dataclass_transform__’ attribute on the decorated object. It + has no other runtime effect. + + See PEP 681(2) for more details. + + New in version 3.11. + + -- Function: @typing.overload + + The ‘@overload’ decorator allows describing functions and methods + that support multiple different combinations of argument types. A + series of ‘@overload’-decorated definitions must be followed by + exactly one non-‘@overload’-decorated definition (for the same + function/method). The ‘@overload’-decorated definitions are for + the benefit of the type checker only, since they will be + overwritten by the non-‘@overload’-decorated definition, while the + latter is used at runtime but should be ignored by a type checker. + At runtime, calling a ‘@overload’-decorated function directly will + raise *note NotImplementedError: 9c7. An example of overload that + gives a more precise type than can be expressed using a union or a + type variable: + + @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> + + See PEP 484(3) for more details and comparison with other typing + semantics. + + Changed in version 3.11: Overloaded functions can now be + introspected at runtime using *note get_overloads(): 274. + + -- Function: typing.get_overloads (func) + + Return a sequence of *note @overload: 37da.-decorated definitions + for `func'. `func' is the function object for the implementation + of the overloaded function. For example, given the definition of + ‘process’ in the documentation for *note @overload: 37da, + ‘get_overloads(process)’ will return a sequence of three function + objects for the three defined overloads. If called on a function + with no overloads, ‘get_overloads()’ returns an empty sequence. + + ‘get_overloads()’ can be used for introspecting an overloaded + function at runtime. + + New in version 3.11. + + -- Function: typing.clear_overloads () + + Clear all registered overloads in the internal registry. This can + be used to reclaim the memory used by the registry. + + New in version 3.11. + + -- Function: @typing.final + + A decorator to indicate to type checkers that the decorated method + cannot be overridden, and the decorated class cannot be subclassed. + For 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 + ... + + There is no runtime checking of these properties. See PEP 591(4) + for more details. + + New in version 3.8. + + Changed in version 3.11: The decorator will now set the ‘__final__’ + attribute to ‘True’ on the decorated object. Thus, a check like + ‘if getattr(obj, "__final__", False)’ can be used at runtime to + determine whether an object ‘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. + + -- Function: @typing.no_type_check + + Decorator to indicate that annotations are not type hints. + + This works as class or function *note decorator: 2f8. 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). + + This mutates the function(s) in place. + + -- Function: @typing.no_type_check_decorator + + Decorator to give another decorator the *note no_type_check(): 27b. + effect. + + This wraps the decorator with something that wraps the decorated + function in *note no_type_check(): 27b. + + -- Function: @typing.type_check_only + + Decorator to mark a class or function to be 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: + + @type_check_only + class Response: # private or not available at runtime + code: int + def get_header(self, name: str) -> str: ... + + def fetch_response() -> Response: ... + + Note that returning instances of private classes is not + recommended. It is usually preferable to make such classes public. + + ---------- Footnotes ---------- + + (1) https://typing.readthedocs.io/en/latest/source/unreachable.html + + (2) https://peps.python.org/pep-0681/ + + (3) https://peps.python.org/pep-0484/ + + (4) https://peps.python.org/pep-0591/ + + +File: python.info, Node: Introspection helpers, Next: Constant, Prev: Functions and decorators, Up: Module contents<3> + +5.26.1.26 Introspection helpers +............................... + + -- Function: typing.get_type_hints (obj, globalns=None, localns=None, + include_extras=False) + + Return a dictionary containing type hints for a function, method, + module or class object. + + This is often the same as ‘obj.__annotations__’. In addition, + forward references encoded as string literals are handled by + evaluating them in ‘globals’ and ‘locals’ namespaces. For a class + ‘C’, return a dictionary constructed by merging all the + ‘__annotations__’ along ‘C.__mro__’ in reverse order. + + The function recursively replaces all ‘Annotated[T, ...]’ with ‘T’, + unless ‘include_extras’ is set to ‘True’ (see *note Annotated: 585. + for more information). For example: + + class Student(NamedTuple): + name: Annotated[str, 'some marker'] + + get_type_hints(Student) == {'name': str} + get_type_hints(Student, include_extras=False) == {'name': str} + get_type_hints(Student, include_extras=True) == { + 'name': Annotated[str, 'some marker'] + } + + Note: *note get_type_hints(): 277. does not work with imported + *note type aliases: 378e. that include forward references. + Enabling postponed evaluation of annotations ( PEP 563(1)) may + remove the need for most forward references. + + Changed in version 3.9: Added ‘include_extras’ parameter as part of + PEP 593(2). + + Changed in version 3.11: Previously, ‘Optional[t]’ was added for + function and method annotations if a default value equal to ‘None’ + was set. Now the annotation is returned unchanged. + + -- Function: typing.get_args (tp) + + -- Function: typing.get_origin (tp) + + Provide basic introspection for generic types and special typing + forms. + + For a typing object of the form ‘X[Y, Z, ...]’ these functions + return ‘X’ and ‘(Y, Z, ...)’. If ‘X’ is a generic alias for a + builtin or *note collections: 1c. class, it gets normalized to the + original class. If ‘X’ is a union or *note Literal: 44c. contained + in another generic type, the order of ‘(Y, Z, ...)’ may be + different from the order of the original arguments ‘[Y, Z, ...]’ + due to type caching. For unsupported objects return ‘None’ and + ‘()’ correspondingly. Examples: + + assert get_origin(Dict[str, int]) is dict + assert get_args(Dict[int, str]) == (int, str) + + assert get_origin(Union[int, str]) is Union + assert get_args(Union[int, str]) == (int, str) + + New in version 3.8. + + -- Function: typing.is_typeddict (tp) + + Check if a type is a *note TypedDict: 18a. + + For example: + + class Film(TypedDict): + title: str + year: int + + is_typeddict(Film) # => True + is_typeddict(list | str) # => False + + New in version 3.10. + + -- Class: typing.ForwardRef + + A class used for internal typing representation of string forward + references. For example, ‘List["SomeClass"]’ is implicitly + transformed into ‘List[ForwardRef("SomeClass")]’. This class + should not be instantiated by a user, but may be used by + introspection tools. + + Note: PEP 585(3) generic types such as ‘list["SomeClass"]’ + will not be implicitly transformed into + ‘list[ForwardRef("SomeClass")]’ and thus will not + automatically resolve to ‘list[SomeClass]’. + + New in version 3.7.4. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0563/ + + (2) https://peps.python.org/pep-0593/ + + (3) https://peps.python.org/pep-0585/ + + +File: python.info, Node: Constant, Prev: Introspection helpers, Up: Module contents<3> + +5.26.1.27 Constant +.................. + + -- Data: typing.TYPE_CHECKING + + A special constant that is assumed to be ‘True’ by 3rd party static + type checkers. It is ‘False’ at runtime. Usage: + + if TYPE_CHECKING: + import expensive_mod + + def fun(arg: 'expensive_mod.SomeType') -> None: + local_var: expensive_mod.AnotherType = other_fun() + + The first type annotation must be enclosed in quotes, making it a + “forward reference”, to hide the ‘expensive_mod’ reference from the + interpreter runtime. Type annotations for local variables are not + evaluated, so the second annotation does not need to be enclosed in + quotes. + + Note: If ‘from __future__ import annotations’ is used, + annotations are not evaluated at function definition time. + Instead, they are stored as strings in ‘__annotations__’. + This makes it unnecessary to use quotes around the annotation + (see PEP 563(1)). + + New in version 3.5.2. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0563/ + + +File: python.info, Node: Deprecation Timeline of Major Features, Prev: Module contents<3>, Up: typing — Support for type hints + +5.26.1.28 Deprecation Timeline of Major Features +................................................ + +Certain features in ‘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. + +Feature Deprecated in Projected removal PEP/issue + +-------------------------------------------------------------------------------------------------------- + +‘typing.io’ and ‘typing.re’ 3.8 3.12 bpo-38291(1) +submodules + +‘typing’ versions of standard 3.9 Undecided PEP 585(2) +collections + +‘typing.Text’ 3.11 Undecided gh-92332(3) + + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=38291 + + (2) https://peps.python.org/pep-0585/ + + (3) https://github.com/python/cpython/issues/92332 + + +File: python.info, Node: pydoc — Documentation generator and online help system, Next: Python Development Mode, Prev: typing — Support for type hints, Up: Development Tools + +5.26.2 ‘pydoc’ — Documentation generator and online help system +--------------------------------------------------------------- + +`Source code:' Lib/pydoc.py(1) + +__________________________________________________________________ + +The *note pydoc: d6. 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 ‘__doc__’ attribute) of the +object, and recursively of its documentable members. If there is no +docstring, *note pydoc: d6. 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 *note +inspect.getcomments(): 37e1.). + +The built-in function *note help(): 514. invokes the online help system +in the interactive interpreter, which uses *note pydoc: d6. to generate +its documentation as text on the console. The same text documentation +can also be viewed from outside the Python interpreter by running +‘pydoc’ as a script at the operating system’s command prompt. For +example, running + + pydoc sys + +at a shell prompt will display documentation on the *note sys: f9. +module, in a style similar to the manual pages shown by the Unix ‘man’ +command. The argument to ‘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 ‘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. + + Note: In order to find objects and their documentation, *note + pydoc: d6. imports the module(s) to be documented. Therefore, any + code on module level will be executed on that occasion. Use an ‘if + __name__ == '__main__':’ guard to only execute code when a file is + invoked as a script and not just imported. + +When printing output to the console, ‘pydoc’ attempts to paginate the +output for easier reading. If the ‘PAGER’ environment variable is set, +‘pydoc’ will use its value as a pagination program. + +Specifying a ‘-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 ‘-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 ‘man’ command. The synopsis line +of a module is the first line of its documentation string. + +You can also use ‘pydoc’ to start an HTTP server on the local machine +that will serve documentation to visiting web browsers. ‘pydoc -p 1234’ +will start a HTTP server on port 1234, allowing you to browse the +documentation at ‘http://localhost:1234/’ in your preferred web browser. +Specifying ‘0’ as the port number will select an arbitrary unused port. + +‘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. + +‘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 ‘pydoc’ generates documentation, it uses the current environment +and path to locate modules. Thus, invoking ‘pydoc spam’ documents +precisely the version of the module you would get if you started the +Python interpreter and typed ‘import spam’. + +Module docs for core modules are assumed to reside in +‘https://docs.python.org/X.Y/library/’ where ‘X’ and ‘Y’ are the major +and minor version numbers of the Python interpreter. This can be +overridden by setting the ‘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 ‘-b’ option. + +Changed in version 3.3: The ‘-g’ command line option was removed. + +Changed in version 3.4: *note pydoc: d6. now uses *note +inspect.signature(): 301. rather than *note inspect.getfullargspec(): +302. to extract signature information from callables. + +Changed in version 3.7: Added the ‘-n’ option. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/pydoc.py + + +File: python.info, Node: Python Development Mode, Next: Effects of the Python Development Mode, Prev: pydoc — Documentation generator and online help system, Up: Development Tools + +5.26.3 Python Development Mode +------------------------------ + +New 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 *note -X dev: 174. command line option or by +setting the *note PYTHONDEVMODE: 743. environment variable to ‘1’. + +See also *note Python debug build: 496. + + +File: python.info, Node: Effects of the Python Development Mode, Next: ResourceWarning Example, Prev: Python Development Mode, Up: Development Tools + +5.26.4 Effects of the Python Development Mode +--------------------------------------------- + +Enabling the Python Development Mode is similar to the following +command, but with additional effects described below: + + PYTHONMALLOC=debug PYTHONASYNCIODEBUG=1 python3 -W default -X faulthandler + +Effects of the Python Development Mode: + + * Add ‘default’ *note warning filter: 1780. The following warnings + are shown: + + * *note DeprecationWarning: 2d4. + + * *note ImportWarning: 46d. + + * *note PendingDeprecationWarning: 503. + + * *note ResourceWarning: 8a9. + + Normally, the above warnings are filtered by the default *note + warning filters: 1780. + + It behaves as if the *note -W default: 502. command line option is + used. + + Use the *note -W error: 502. command line option or set the *note + PYTHONWARNINGS: 80e. environment variable to ‘error’ to treat + warnings as errors. + + * Install debug hooks on memory allocators to check for: + + * Buffer underflow + + * Buffer overflow + + * Memory allocator API violation + + * Unsafe usage of the GIL + + See the *note PyMem_SetupDebugHooks(): 8da. C function. + + It behaves as if the *note PYTHONMALLOC: 8d5. environment variable + is set to ‘debug’. + + To enable the Python Development Mode without installing debug + hooks on memory allocators, set the *note PYTHONMALLOC: 8d5. + environment variable to ‘default’. + + * Call *note faulthandler.enable(): 911. at Python startup to install + handlers for the ‘SIGSEGV’, ‘SIGFPE’, ‘SIGABRT’, ‘SIGBUS’ and + ‘SIGILL’ signals to dump the Python traceback on a crash. + + It behaves as if the *note -X faulthandler: 174. command line + option is used or if the *note PYTHONFAULTHANDLER: d31. environment + variable is set to ‘1’. + + * Enable *note asyncio debug mode: 1790. For example, *note asyncio: + 9. checks for coroutines that were not awaited and logs them. + + It behaves as if the *note PYTHONASYNCIODEBUG: 178f. environment + variable is set to ‘1’. + + * Check the `encoding' and `errors' arguments for string encoding and + decoding operations. Examples: *note open(): 30b, *note + str.encode(): 512. and *note bytes.decode(): 513. + + 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. + + * The *note io.IOBase: 641. destructor logs ‘close()’ exceptions. + + * Set the ‘dev_mode’ attribute of *note sys.flags: 25d. to ‘True’. + +The Python Development Mode does not enable the *note tracemalloc: 11e. +module by default, because the overhead cost (to performance and memory) +would be too large. Enabling the *note tracemalloc: 11e. module +provides additional information on the origin of some errors. For +example, *note ResourceWarning: 8a9. 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 *note -O: a34. command +line option from removing *note assert: 5bc. statements nor from setting +*note __debug__: 3cb. to ‘False’. + +The Python Development Mode can only be enabled at the Python startup. +Its value can be read from *note sys.flags.dev_mode: 25d. + +Changed in version 3.8: The *note io.IOBase: 641. destructor now logs +‘close()’ exceptions. + +Changed in version 3.9: The `encoding' and `errors' arguments are now +checked for string encoding and decoding operations. + + +File: python.info, Node: ResourceWarning Example, Next: Bad file descriptor error example, Prev: Effects of the Python Development Mode, Up: Development Tools + +5.26.5 ResourceWarning Example +------------------------------ + +Example of a script counting the number of lines of the text file +specified in the command line: + + import sys + + def main(): + fp = open(sys.argv[1]) + nlines = len(fp.readlines()) + print(nlines) + # The file is closed implicitly + + if __name__ == "__main__": + main() + +The script does not close the file explicitly. By default, Python does +not emit any warning. Example using README.txt, which has 269 lines: + + $ python3 script.py README.txt + 269 + +Enabling the Python Development Mode displays a *note ResourceWarning: +8a9. warning: + + $ python3 -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 + +In addition, enabling *note tracemalloc: 11e. shows the line where the +file was opened: + + $ python3 -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]) + +The fix is to close explicitly the file. Example using a context +manager: + + def main(): + # Close the file explicitly when exiting the with block + with open(sys.argv[1]) as fp: + nlines = len(fp.readlines()) + print(nlines) + +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. + + +File: python.info, Node: Bad file descriptor error example, Next: doctest — Test interactive Python examples, Prev: ResourceWarning Example, Up: Development Tools + +5.26.6 Bad file descriptor error example +---------------------------------------- + +Script displaying the first line of itself: + + import os + + def main(): + fp = open(__file__) + firstline = fp.readline() + print(firstline.rstrip()) + os.close(fp.fileno()) + # The file is closed implicitly + + main() + +By default, Python does not emit any warning: + + $ python3 script.py + import os + +The Python Development Mode shows a *note ResourceWarning: 8a9. and logs +a “Bad file descriptor” error when finalizing the file object: + + $ python3 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 + +‘os.close(fp.fileno())’ closes the file descriptor. When the file +object finalizer tries to close the file descriptor again, it fails with +the ‘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(1) for an example). + +The fix is to remove the ‘os.close(fp.fileno())’ line, or open the file +with ‘closefd=False’. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=18748 + + +File: python.info, Node: doctest — Test interactive Python examples, Next: unittest — Unit testing framework, Prev: Bad file descriptor error example, Up: Development Tools + +5.26.7 ‘doctest’ — Test interactive Python examples +--------------------------------------------------- + +`Source code:' Lib/doctest.py(1) + +__________________________________________________________________ + +The *note doctest: 63. 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: + + * To check that a module’s docstrings are up-to-date by verifying + that all interactive examples still work as documented. + + * To perform regression testing by verifying that interactive + examples from a test file or a test object work as expected. + + * 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”. + +Here’s a complete but small example module: + + """ + 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() + +If you run ‘example.py’ directly from the command line, *note doctest: +63. works its magic: + + $ python example.py + $ + +There’s no output! That’s normal, and it means all the examples worked. +Pass ‘-v’ to the script, and *note doctest: 63. prints a detailed log of +what it’s trying, and prints a summary at the end: + + $ 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 + +And so on, eventually ending with: + + Trying: + factorial(1e100) + Expecting: + Traceback (most recent call last): + ... + OverflowError: n too large + ok + 2 items passed all tests: + 1 tests in __main__ + 8 tests in __main__.factorial + 9 tests in 2 items. + 9 passed and 0 failed. + Test passed. + $ + +That’s all you need to know to start making productive use of *note +doctest: 63.! 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 ‘Lib/test/test_doctest.py’. + +* 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. +* How It Works:: +* Basic API:: +* Unittest API:: +* Advanced API:: +* Debugging:: +* Soapbox:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/doctest.py + + +File: python.info, Node: Simple Usage Checking Examples in Docstrings, Next: Simple Usage Checking Examples in a Text File, Up: doctest — Test interactive Python examples + +5.26.7.1 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 ‘M’ with: + + if __name__ == "__main__": + import doctest + doctest.testmod() + +*note doctest: 63. then examines docstrings in module ‘M’. + +Running the module as a script causes the examples in the docstrings to +get executed and verified: + + python M.py + +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 ‘***Test Failed*** N failures.’, +where `N' is the number of examples that failed. + +Run it with the ‘-v’ switch instead: + + python M.py -v + +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 ‘verbose=True’ to *note testmod(): +10ce, or prohibit it by passing ‘verbose=False’. In either of those +cases, ‘sys.argv’ is not examined by *note testmod(): 10ce. (so passing +‘-v’ or not has no effect). + +There is also a command line shortcut for running *note testmod(): 10ce. +You can instruct the Python interpreter to run the doctest module +directly from the standard library and pass the module name(s) on the +command line: + + python -m doctest -v example.py + +This will import ‘example.py’ as a standalone module and run *note +testmod(): 10ce. on it. Note that this may not work correctly if the +file is part of a package and imports other submodules from that +package. + +For more information on *note testmod(): 10ce, see section *note Basic +API: 37eb. + + +File: python.info, Node: Simple Usage Checking Examples in a Text File, Next: How It Works, Prev: Simple Usage Checking Examples in Docstrings, Up: doctest — Test interactive Python examples + +5.26.7.2 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 *note testfile(): 37ee. +function: + + import doctest + doctest.testfile("example.txt") + +That short script executes and verifies any interactive Python examples +contained in the file ‘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 ‘example.txt’ contains this: + + The ``example`` module + ====================== + + Using ``factorial`` + ------------------- + + This is an example text file in reStructuredText format. First import + ``factorial`` from the ``example`` module: + + >>> from example import factorial + + Now use it: + + >>> factorial(6) + 120 + +Running ‘doctest.testfile("example.txt")’ then finds the error in this +documentation: + + File "./example.txt", line 14, in example.txt + Failed example: + factorial(6) + Expected: + 120 + Got: + 720 + +As with *note testmod(): 10ce, *note testfile(): 37ee. 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 *note testmod(): 10ce. + +By default, *note testfile(): 37ee. looks for files in the calling +module’s directory. See section *note Basic API: 37eb. for a +description of the optional arguments that can be used to tell it to +look for files in other locations. + +Like *note testmod(): 10ce, *note testfile(): 37ee.’s verbosity can be +set with the ‘-v’ command-line switch or with the optional keyword +argument `verbose'. + +There is also a command line shortcut for running *note testfile(): +37ee. You can instruct the Python interpreter to run the doctest module +directly from the standard library and pass the file name(s) on the +command line: + + python -m doctest -v example.txt + +Because the file name does not end with ‘.py’, *note doctest: 63. infers +that it must be run with *note testfile(): 37ee, not *note testmod(): +10ce. + +For more information on *note testfile(): 37ee, see section *note Basic +API: 37eb. + + +File: python.info, Node: How It Works, Next: Basic API, Prev: Simple Usage Checking Examples in a Text File, Up: doctest — Test interactive Python examples + +5.26.7.3 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>. + + +File: python.info, Node: Which Docstrings Are Examined?, Next: How are Docstring Examples Recognized?, Up: How It Works + +5.26.7.4 Which Docstrings Are Examined? +....................................... + +The module docstring, and all function, class and method docstrings are +searched. Objects imported into the module are not searched. + +In addition, if ‘M.__test__’ exists and “is true”, 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 ‘M.__test__’ +are searched, and strings are treated as if they were docstrings. In +output, a key ‘K’ in ‘M.__test__’ appears with name + + <name of M>.__test__.K + +Any classes found are recursively searched similarly, to test docstrings +in their contained methods and nested classes. + + +File: python.info, Node: How are Docstring Examples Recognized?, Next: What’s the Execution Context?, Prev: Which Docstrings Are Examined?, Up: How It Works + +5.26.7.5 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. + + >>> # comments are ignored + >>> x = 12 + >>> x + 12 + >>> if x == 13: + ... print("yes") + ... else: + ... print("no") + ... print("NO") + ... print("NO!!!") + ... + no + NO + NO!!! + >>> + +Any expected output must immediately follow the final ‘'>>> '’ or ‘'... +'’ line containing the code, and the expected output (if any) extends to +the next ‘'>>> '’ or all-whitespace line. + +The fine print: + + * 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 ‘<BLANKLINE>’ in your doctest + example each place a blank line is expected. + + * 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 *note + NORMALIZE_WHITESPACE: 37f5. option or *note directive: 37f6. 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 *note DocTestParser: 37f7. class. + + * Output to stdout is captured, but not output to stderr (exception + tracebacks are captured via a different means). + + * 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: + + >>> def f(x): + ... r'''Backslashes in a raw docstring: m\n''' + >>> print(f.__doc__) + Backslashes in a raw docstring: m\n + + Otherwise, the backslash will be interpreted as part of the string. + For example, the ‘\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): + + >>> def f(x): + ... '''Backslashes in a raw docstring: m\\n''' + >>> print(f.__doc__) + Backslashes in a raw docstring: m\n + + * The starting column doesn’t matter: + + >>> assert "Easy!" + >>> import math + >>> math.floor(1.9) + 1 + + and as many leading whitespace characters are stripped from the + expected output as appeared in the initial ‘'>>> '’ line that + started the example. + + +File: python.info, Node: What’s the Execution Context?, Next: What About Exceptions?, Prev: How are Docstring Examples Recognized?, Up: How It Works + +5.26.7.6 What’s the Execution Context? +...................................... + +By default, each time *note doctest: 63. finds a docstring to test, it +uses a `shallow copy' of ‘M’’s globals, so that running tests doesn’t +change the module’s real globals, and so that one test in ‘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 ‘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 +‘globs=your_dict’ to *note testmod(): 10ce. or *note testfile(): 37ee. +instead. + + +File: python.info, Node: What About Exceptions?, Next: Option Flags, Prev: What’s the Execution Context?, Up: How It Works + +5.26.7.7 What About Exceptions? +............................... + +No problem, provided that the traceback is the only output produced by +the example: just paste in the traceback. (1) 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: + + >>> [1, 2, 3].remove(42) + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + ValueError: list.remove(x): x not in list + +That doctest succeeds if *note ValueError: 1c8. is raised, with the +‘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: + + Traceback (most recent call last): + Traceback (innermost last): + +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: + + >>> raise ValueError('multi\n line\ndetail') + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + ValueError: multi + line + detail + +The last three lines (starting with *note ValueError: 1c8.) 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: + + >>> raise ValueError('multi\n line\ndetail') + Traceback (most recent call last): + ... + ValueError: multi + line + detail + +Note that tracebacks are treated very specially. In particular, in the +rewritten example, the use of ‘...’ is independent of doctest’s *note +ELLIPSIS: 10cf. 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: + + * Doctest can’t guess whether your expected output came from an + exception traceback or from ordinary printing. So, e.g., an + example that expects ‘ValueError: 42 is prime’ will pass whether + *note ValueError: 1c8. 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. + + * 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. + + * When the *note IGNORE_EXCEPTION_DETAIL: 37fc. doctest option is + specified, everything following the leftmost colon and any module + information in the exception name is ignored. + + * The interactive shell omits the traceback header line for some + *note SyntaxError: 2d6.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 *note SyntaxError: 2d6. that omits + the traceback header, you will need to manually add the traceback + header line to your test example. + + * For some exceptions, Python displays the position of the error + using ‘^’ markers and tildes: + + >>> 1 + None + File "<stdin>", line 1 + 1 + None + ~~^~~~~~ + TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' + + 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 ‘^’ + marker in the wrong location: + + >>> 1 + None + File "<stdin>", line 1 + 1 + None + ^~~~~~~~ + TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' + + ---------- Footnotes ---------- + + (1) 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. + + +File: python.info, Node: Option Flags, Next: Directives, Prev: What About Exceptions?, Up: How It Works + +5.26.7.8 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 *note bitwise ORed: 1a5c. together and passed to various functions. +The names can also be used in *note doctest directives: 37f6, and may be +passed to the doctest command line interface via the ‘-o’ option. + +New in version 3.4: The ‘-o’ command line option. + +The first group of options define test semantics, controlling aspects of +how doctest decides whether actual output matches an example’s expected +output: + + -- Data: doctest.DONT_ACCEPT_TRUE_FOR_1 + + By default, if an expected output block contains just ‘1’, an + actual output block containing just ‘1’ or just ‘True’ is + considered to be a match, and similarly for ‘0’ versus ‘False’. + When *note DONT_ACCEPT_TRUE_FOR_1: 37ff. 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. + + -- Data: doctest.DONT_ACCEPT_BLANKLINE + + By default, if an expected output block contains a line containing + only the string ‘<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 *note DONT_ACCEPT_BLANKLINE: 3800. is + specified, this substitution is not allowed. + + -- 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. *note + NORMALIZE_WHITESPACE: 37f5. is especially useful when a line of + expected output is very long, and you want to wrap it across + multiple lines in your source. + + -- Data: doctest.ELLIPSIS + + When specified, an ellipsis marker (‘...’) 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 ‘.*’ + is prone to in regular expressions. + + -- 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 ‘ValueError: 42’ will pass if the + actual exception raised is ‘ValueError: 3*14’, but will fail if, + say, a *note TypeError: 19c. 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: + + >>> 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 + + Note that *note ELLIPSIS: 10cf. 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: *note IGNORE_EXCEPTION_DETAIL: 37fc. now + also ignores any information relating to the module containing the + exception under test. + + -- 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. + + -- Data: doctest.COMPARISON_FLAGS + + A bitmask or’ing together all the comparison flags above. + +The second group of options controls how test failures are reported: + + -- Data: doctest.REPORT_UDIFF + + When specified, failures that involve multi-line expected and + actual outputs are displayed using a unified diff. + + -- Data: doctest.REPORT_CDIFF + + When specified, failures that involve multi-line expected and + actual outputs will be displayed using a context diff. + + -- Data: doctest.REPORT_NDIFF + + When specified, differences are computed by ‘difflib.Differ’, using + the same algorithm as the popular ‘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 + ‘1’ where actual output contains letter ‘l’, a line is inserted + with a caret marking the mismatching column positions. + + -- 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 *note + REPORT_ONLY_FIRST_FAILURE: 3803. is specified, the remaining + examples are still run, and still count towards the total number of + failures reported; only the output is suppressed. + + -- 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. + + The doctest command line accepts the option ‘-f’ as a shorthand for + ‘-o FAIL_FAST’. + + New in version 3.4. + + -- Data: doctest.REPORTING_FLAGS + + A bitmask or’ing together all the reporting flags above. + +There is also a way to register new option flag names, though this isn’t +useful unless you intend to extend *note doctest: 63. internals via +subclassing: + + -- Function: doctest.register_optionflag (name) + + Create a new option flag with a given name, and return the new + flag’s integer value. *note register_optionflag(): 3805. can be + used when subclassing *note OutputChecker: 3806. or *note + DocTestRunner: 3807. to create new options that are supported by + your subclasses. *note register_optionflag(): 3805. should always + be called using the following idiom: + + MY_FLAG = register_optionflag('MY_FLAG') + + +File: python.info, Node: Directives, Next: Warnings<2>, Prev: Option Flags, Up: How It Works + +5.26.7.9 Directives +................... + +Doctest directives may be used to modify the *note option flags: bcd. +for an individual example. Doctest directives are special Python +comments following an example’s source code: + + directive ::= "#" "doctest:" directive_options + directive_options ::= directive_option ("," directive_option)\* + directive_option ::= on_or_off directive_option_name + on_or_off ::= "+" \| "-" + directive_option_name ::= "DONT_ACCEPT_BLANKLINE" \| "NORMALIZE_WHITESPACE" \| ... + +Whitespace is not allowed between the ‘+’ or ‘-’ 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 ‘+’ to enable the named behavior, or ‘-’ to disable +it. + +For example, this test passes: + + >>> 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] + +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: + + >>> print(list(range(20))) # doctest: +ELLIPSIS + [0, 1, ..., 18, 19] + +Multiple directives can be used on a single physical line, separated by +commas: + + >>> print(list(range(20))) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE + [0, 1, ..., 18, 19] + +If multiple directive comments are used for a single example, then they +are combined: + + >>> print(list(range(20))) # doctest: +ELLIPSIS + ... # doctest: +NORMALIZE_WHITESPACE + [0, 1, ..., 18, 19] + +As the previous example shows, you can add ‘...’ 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: + + >>> print(list(range(5)) + list(range(10, 20)) + list(range(30, 40))) + ... # doctest: +ELLIPSIS + [0, ..., 4, 10, ..., 19, 30, ..., 39] + +Note that since all options are disabled by default, and directives +apply only to the example they appear in, enabling options (via ‘+’ 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 ‘-’ in a +directive can be useful. + + +File: python.info, Node: Warnings<2>, Prev: Directives, Up: How It Works + +5.26.7.10 Warnings +.................. + +*note doctest: 63. 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 + + >>> foo() + {"Hermione", "Harry"} + +is vulnerable! One workaround is to do + + >>> foo() == {"Hermione", "Harry"} + True + +instead. Another is to do + + >>> d = sorted(foo()) + >>> d + ['Harry', 'Hermione'] + +There are others, but you get the idea. + +Another bad idea is to print things that embed an object address, like + + >>> 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> + +The *note ELLIPSIS: 10cf. directive gives a nice approach for the last +example: + + >>> C() # doctest: +ELLIPSIS + <C object at 0x...> + +Floating-point numbers are also subject to small output variations +across platforms, because Python defers to the platform C library for +float formatting, and C libraries vary widely in quality here. + + >>> 1./7 # risky + 0.14285714285714285 + >>> print(1./7) # safer + 0.142857142857 + >>> print(round(1./7, 6)) # much safer + 0.142857 + +Numbers of the form ‘I/2.**J’ are safe across all platforms, and I often +contrive doctest examples to produce numbers of that form: + + >>> 3./4 # utterly safe + 0.75 + +Simple fractions are also easier for people to understand, and that +makes for better documentation. + + +File: python.info, Node: Basic API, Next: Unittest API, Prev: How It Works, Up: doctest — Test interactive Python examples + +5.26.7.11 Basic API +................... + +The functions *note testmod(): 10ce. and *note testfile(): 37ee. 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 *note Simple Usage; Checking Examples in Docstrings: 37e9. and +*note Simple Usage; Checking Examples in a Text File: 37ec. + + -- 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 + ‘(failure_count, test_count)’. + + Optional argument `module_relative' specifies how the filename + should be interpreted: + + * If `module_relative' is ‘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 ‘/’ characters to separate path segments, and may not be + an absolute path (i.e., it may not begin with ‘/’). + + * If `module_relative' is ‘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. + + Optional argument `name' gives the name of the test; by default, or + if ‘None’, ‘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 ‘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 ‘None’, a new empty dict is used. + + Optional argument `extraglobs' gives a dict merged into the globals + used to execute examples. This works like *note dict.update(): + 10c8.: if `globs' and `extraglobs' have a common key, the + associated value in `extraglobs' appears in the combined dict. By + default, or if ‘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 ‘None’, it’s true + if and only if ‘'-v'’ is in ‘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 0) takes the *note + bitwise OR: 1a5c. of option flags. See section *note Option Flags: + bcd. + + 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 *note DocTestParser: 37f7. + (or subclass) that should be used to extract tests from the files. + It defaults to a normal parser (i.e., ‘DocTestParser()’). + + Optional argument `encoding' specifies an encoding that should be + used to convert the file to unicode. + + -- 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 *note __main__: 1. if `m' is not supplied or + is ‘None’), starting with ‘m.__doc__’. + + Also test examples reachable from dict ‘m.__test__’, if it exists + and is not ‘None’. ‘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 ‘(failure_count, test_count)’. + + Optional argument `name' gives the name of the module; by default, + or if ‘None’, ‘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 ‘doctest.master.summarize()’ in conjunction + with *note testmod(): 10ce. continues to get output for objects + with no tests. The `exclude_empty' argument to the newer *note + DocTestFinder: 3816. constructor defaults to true. + + Optional arguments `extraglobs', `verbose', `report', + `optionflags', `raise_on_error', and `globs' are the same as for + function *note testfile(): 37ee. above, except that `globs' + defaults to ‘m.__dict__’. + + -- 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 ‘"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 ‘None’, flags are deduced corresponding to the set + of future features found in `globs'. + + Optional argument `optionflags' works as for function *note + testfile(): 37ee. above. + + +File: python.info, Node: Unittest API, Next: Advanced API, Prev: Basic API, Up: doctest — Test interactive Python examples + +5.26.7.12 Unittest API +...................... + +As your collection of doctest’ed modules grows, you’ll want a way to run +all their doctests systematically. *note doctest: 63. provides two +functions that can be used to create *note unittest: 125. test suites +from modules and text files containing doctests. To integrate with +*note unittest: 125. test discovery, include a ‘load_tests()’ function +in your test module: + + 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 + +There are two main functions for creating *note unittest.TestSuite: a75. +instances from text files and modules with doctests: + + -- 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 *note + unittest.TestSuite: a75. + + The returned *note unittest.TestSuite: a75. 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 ‘failureException’ exception is raised showing the + name of the file containing the test and a (sometimes approximate) + line number. + + 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: + + * If `module_relative' is ‘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 ‘/’ characters to + separate path segments, and may not be an absolute path (i.e., + it may not begin with ‘/’). + + * If `module_relative' is ‘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. + + 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 ‘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 *note DocTest: 381b. object. The + setUp function can access the test globals as the `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 *note DocTest: 381b. + object. The setUp function can access the test globals as the + `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 *note Option Flags: bcd. See function *note + set_unittest_reportflags(): 381c. below for a better way to set + reporting options. + + Optional argument `parser' specifies a *note DocTestParser: 37f7. + (or subclass) that should be used to extract tests from the files. + It defaults to a normal parser (i.e., ‘DocTestParser()’). + + Optional argument `encoding' specifies an encoding that should be + used to convert the file to unicode. + + The global ‘__file__’ is added to the globals provided to doctests + loaded from a text file using *note DocFileSuite(): 381a. + + -- Function: doctest.DocTestSuite (module=None, globs=None, + extraglobs=None, test_finder=None, setUp=None, tearDown=None, + checker=None) + + Convert doctest tests for a module to a *note unittest.TestSuite: + a75. + + The returned *note unittest.TestSuite: a75. is to be run by the + unittest framework and runs each doctest in the module. If any of + the doctests fail, then the synthesized unit test fails, and a + ‘failureException’ exception is raised showing the name of the file + containing the test and a (sometimes approximate) line number. + + 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 a new empty + dictionary. + + 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 *note DocTestFinder: 3816. + 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 *note DocFileSuite(): 381a. above. + + This function uses the same search technique as *note testmod(): + 10ce. + + Changed in version 3.5: *note DocTestSuite(): a74. returns an empty + *note unittest.TestSuite: a75. if `module' contains no docstrings + instead of raising *note ValueError: 1c8. + +Under the covers, *note DocTestSuite(): a74. creates a *note +unittest.TestSuite: a75. out of ‘doctest.DocTestCase’ instances, and +‘DocTestCase’ is a subclass of *note unittest.TestCase: 282. +‘DocTestCase’ isn’t documented here (it’s an internal detail), but +studying its code can answer questions about the exact details of *note +unittest: 125. integration. + +Similarly, *note DocFileSuite(): 381a. creates a *note +unittest.TestSuite: a75. out of ‘doctest.DocFileCase’ instances, and +‘DocFileCase’ is a subclass of ‘DocTestCase’. + +So both ways of creating a *note unittest.TestSuite: a75. run instances +of ‘DocTestCase’. This is important for a subtle reason: when you run +*note doctest: 63. functions yourself, you can control the *note +doctest: 63. options in use directly, by passing option flags to *note +doctest: 63. functions. However, if you’re writing a *note unittest: +125. framework, *note unittest: 125. ultimately controls when and how +tests get run. The framework author typically wants to control *note +doctest: 63. reporting options (perhaps, e.g., specified by command line +options), but there’s no way to pass options through *note unittest: +125. to *note doctest: 63. test runners. + +For this reason, *note doctest: 63. also supports a notion of *note +doctest: 63. reporting flags specific to *note unittest: 125. support, +via this function: + + -- Function: doctest.set_unittest_reportflags (flags) + + Set the *note doctest: 63. reporting flags to use. + + Argument `flags' takes the *note bitwise OR: 1a5c. of option flags. + See section *note Option Flags: bcd. Only “reporting flags” can be + used. + + This is a module-global setting, and affects all future doctests + run by module *note unittest: 125.: the ‘runTest()’ method of + ‘DocTestCase’ looks at the option flags specified for the test case + when the ‘DocTestCase’ instance was constructed. If no reporting + flags were specified (which is the typical and expected case), + *note doctest: 63.’s *note unittest: 125. reporting flags are *note + bitwise ORed: 1a5c. into the option flags, and the option flags so + augmented are passed to the *note DocTestRunner: 3807. instance + created to run the doctest. If any reporting flags were specified + when the ‘DocTestCase’ instance was constructed, *note doctest: + 63.’s *note unittest: 125. reporting flags are ignored. + + The value of the *note unittest: 125. reporting flags in effect + before the function was called is returned by the function. + + +File: python.info, Node: Advanced API, Next: Debugging, Prev: Unittest API, Up: doctest — Test interactive Python examples + +5.26.7.13 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: + + * *note Example: 381f.: A single Python *note statement: 21a1, paired + with its expected output. + + * *note DocTest: 381b.: A collection of *note Example: 381f.s, + typically extracted from a single docstring or text file. + +Additional processing classes are defined to find, parse, and run, and +check doctest examples: + + * *note DocTestFinder: 3816.: Finds all docstrings in a given module, + and uses a *note DocTestParser: 37f7. to create a *note DocTest: + 381b. from every docstring that contains interactive examples. + + * *note DocTestParser: 37f7.: Creates a *note DocTest: 381b. object + from a string (such as an object’s docstring). + + * *note DocTestRunner: 3807.: Executes the examples in a *note + DocTest: 381b, and uses an *note OutputChecker: 3806. to verify + their output. + + * *note OutputChecker: 3806.: Compares the actual output from a + doctest example with the expected output, and decides whether they + match. + +The relationships among these processing classes are summarized in the +following diagram: + + list of: + +------+ +---------+ + |module| --DocTestFinder-> | DocTest | --DocTestRunner-> results + +------+ | ^ +---------+ | ^ (printed) + | | | Example | | | + v | | ... | v | + DocTestParser | Example | OutputChecker + +---------+ + +* Menu: + +* DocTest Objects:: +* Example Objects:: +* DocTestFinder objects:: +* DocTestParser objects:: +* DocTestRunner objects:: +* OutputChecker objects:: + + +File: python.info, Node: DocTest Objects, Next: Example Objects, Up: Advanced API + +5.26.7.14 DocTest Objects +......................... + + -- 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. + + *note DocTest: 381b. defines the following attributes. They are + initialized by the constructor, and should not be modified + directly. + + -- Attribute: examples + + A list of *note Example: 381f. objects encoding the individual + interactive Python examples that should be run by this test. + + -- 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 *note globs: 3823. after + the test is run. + + -- Attribute: name + + A string name identifying the *note DocTest: 381b. Typically, + this is the name of the object or file that the test was + extracted from. + + -- Attribute: filename + + The name of the file that this *note DocTest: 381b. was + extracted from; or ‘None’ if the filename is unknown, or if + the *note DocTest: 381b. was not extracted from a file. + + -- Attribute: lineno + + The line number within *note filename: 3825. where this *note + DocTest: 381b. begins, or ‘None’ if the line number is + unavailable. This line number is zero-based with respect to + the beginning of the file. + + -- Attribute: docstring + + The string that the test was extracted from, or ‘None’ if the + string is unavailable, or if the test was not extracted from a + string. + + +File: python.info, Node: Example Objects, Next: DocTestFinder objects, Prev: DocTest Objects, Up: Advanced API + +5.26.7.15 Example Objects +......................... + + -- 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. + + *note Example: 381f. defines the following attributes. They are + initialized by the constructor, and should not be modified + directly. + + -- 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. + + -- Attribute: want + + The expected output from running the example’s source code + (either from stdout, or a traceback in case of exception). + *note want: 382a. ends with a newline unless no output is + expected, in which case it’s an empty string. The constructor + adds a newline when necessary. + + -- Attribute: exc_msg + + The exception message generated by the example, if the example + is expected to generate an exception; or ‘None’ if it is not + expected to generate an exception. This exception message is + compared against the return value of *note + traceback.format_exception_only(): 445. *note exc_msg: 382b. + ends with a newline unless it’s ‘None’. The constructor adds + a newline if needed. + + -- 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. + + -- Attribute: indent + + The example’s indentation in the containing string, i.e., the + number of space characters that precede the example’s first + prompt. + + -- Attribute: options + + A dictionary mapping from option flags to ‘True’ or ‘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 *note DocTestRunner: + 3807.’s ‘optionflags’). By default, no options are set. + + +File: python.info, Node: DocTestFinder objects, Next: DocTestParser objects, Prev: Example Objects, Up: Advanced API + +5.26.7.16 DocTestFinder objects +............................... + + -- Class: doctest.DocTestFinder (verbose=False, parser=DocTestParser(), + recurse=True, exclude_empty=True) + + A processing class used to extract the *note DocTest: 381b.s that + are relevant to a given object, from its docstring and the + docstrings of its contained objects. *note DocTest: 381b.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 ‘False’ (no output). + + The optional argument `parser' specifies the *note DocTestParser: + 37f7. object (or a drop-in replacement) that is used to extract + doctests from docstrings. + + If the optional argument `recurse' is false, then *note + DocTestFinder.find(): 3831. will only examine the given object, and + not any contained objects. + + If the optional argument `exclude_empty' is false, then *note + DocTestFinder.find(): 3831. will include tests for objects with + empty docstrings. + + *note DocTestFinder: 3816. defines the following method: + + -- Method: find (obj[, name][, module][, globs][, extraglobs]) + + Return a list of the *note DocTest: 381b.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 *note + DocTest: 381b.s. If `name' is not specified, then + ‘obj.__name__’ is used. + + The optional parameter `module' is the module that contains + the given object. If the module is not specified or is + ‘None’, then the test finder will attempt to automatically + determine the correct module. The object’s module is used: + + * As a default namespace, if `globs' is not specified. + + * To prevent the DocTestFinder from extracting DocTests + from objects that are imported from other modules. + (Contained objects with modules other than `module' are + ignored.) + + * To find the name of the file containing the object. + + * To help find the line number of the object within its + file. + + If `module' is ‘False’, no attempt to find the module will be + made. This is obscure, of use mostly in testing doctest + itself: if `module' is ‘False’, or is ‘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 *note DocTest: 381b. 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 *note DocTest: 381b. + If `globs' is not specified, then it defaults to the module’s + `__dict__', if specified, or ‘{}’ otherwise. If `extraglobs' + is not specified, then it defaults to ‘{}’. + + +File: python.info, Node: DocTestParser objects, Next: DocTestRunner objects, Prev: DocTestFinder objects, Up: Advanced API + +5.26.7.17 DocTestParser objects +............................... + + -- Class: doctest.DocTestParser + + A processing class used to extract interactive examples from a + string, and use them to create a *note DocTest: 381b. object. + + *note DocTestParser: 37f7. defines the following methods: + + -- Method: get_doctest (string, globs, name, filename, lineno) + + Extract all doctest examples from the given string, and + collect them into a *note DocTest: 381b. object. + + `globs', `name', `filename', and `lineno' are attributes for + the new *note DocTest: 381b. object. See the documentation + for *note DocTest: 381b. for more information. + + -- Method: get_examples (string, name='<string>') + + Extract all doctest examples from the given string, and return + them as a list of *note Example: 381f. objects. Line numbers + are 0-based. The optional argument `name' is a name + identifying this string, and is only used for error messages. + + -- Method: parse (string, name='<string>') + + Divide the given string into examples and intervening text, + and return them as a list of alternating *note Example: 381f.s + and strings. Line numbers for the *note Example: 381f.s are + 0-based. The optional argument `name' is a name identifying + this string, and is only used for error messages. + + +File: python.info, Node: DocTestRunner objects, Next: OutputChecker objects, Prev: DocTestParser objects, Up: Advanced API + +5.26.7.18 DocTestRunner objects +............................... + + -- Class: doctest.DocTestRunner (checker=None, verbose=None, + optionflags=0) + + A processing class used to execute and verify the interactive + examples in a *note DocTest: 381b. + + The comparison between expected outputs and actual outputs is done + by an *note OutputChecker: 3806. This comparison may be customized + with a number of option flags; see section *note Option Flags: bcd. + for more information. If the option flags are insufficient, then + the comparison may also be customized by passing a subclass of + *note OutputChecker: 3806. to the constructor. + + The test runner’s display output can be controlled in two ways. + First, an output function can be passed to ‘TestRunner.run()’; this + function will be called with strings that should be displayed. It + defaults to ‘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 *note + report_start(): 3839, *note report_success(): 383a, *note + report_unexpected_exception(): 383b, and *note report_failure(): + 383c. + + The optional keyword argument `checker' specifies the *note + OutputChecker: 3806. 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 *note + DocTestRunner: 3807.’s verbosity. If `verbose' is ‘True’, then + information is printed about each example, as it is run. If + `verbose' is ‘False’, then only failures are printed. If `verbose' + is unspecified, or ‘None’, then verbose output is used iff the + command-line switch ‘-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 *note + Option Flags: bcd. + + *note DocTestParser: 37f7. defines the following methods: + + -- 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 *note + DocTestRunner: 3807. 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 *note DocTestRunner.run(): 383d. + + -- Method: report_success (out, test, example, got) + + Report that the given example ran successfully. This method + is provided to allow subclasses of *note DocTestRunner: 3807. + 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 + *note DocTestRunner.run(): 383d. + + -- Method: report_failure (out, test, example, got) + + Report that the given example failed. This method is provided + to allow subclasses of *note DocTestRunner: 3807. 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 + *note DocTestRunner.run(): 383d. + + -- 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 *note + DocTestRunner: 3807. 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 *note sys.exc_info(): 25b.). `test' is the + test containing `example'. `out' is the output function that + was passed to *note DocTestRunner.run(): 383d. + + -- Method: run (test, compileflags=None, out=None, + clear_globs=True) + + Run the examples in `test' (a *note DocTest: 381b. object), + and display the results using the writer function `out'. + + The examples are run in the namespace ‘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 *note + DocTestRunner: 3807.’s output checker, and the results are + formatted by the ‘DocTestRunner.report_*()’ methods. + + -- Method: summarize (verbose=None) + + Print a summary of all the test cases that have been run by + this DocTestRunner, and return a *note named tuple: 221. + ‘TestResults(failed, attempted)’. + + The optional `verbose' argument controls how detailed the + summary is. If the verbosity is not specified, then the *note + DocTestRunner: 3807.’s verbosity is used. + + +File: python.info, Node: OutputChecker objects, Prev: DocTestRunner objects, Up: Advanced API + +5.26.7.19 OutputChecker objects +............................... + + -- Class: doctest.OutputChecker + + A class used to check the whether the actual output from a doctest + example matches the expected output. *note OutputChecker: 3806. + defines two methods: *note check_output(): 3841, which compares a + given pair of outputs, and returns ‘True’ if they match; and *note + output_difference(): 3842, which returns a string describing the + differences between two outputs. + + *note OutputChecker: 3806. defines the following methods: + + -- Method: check_output (want, got, optionflags) + + Return ‘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 + *note Option Flags: bcd. for more information about option + flags. + + -- 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'. + + +File: python.info, Node: Debugging, Next: Soapbox, Prev: Advanced API, Up: doctest — Test interactive Python examples + +5.26.7.20 Debugging +................... + +Doctest provides several mechanisms for debugging doctest examples: + + * Several functions convert doctests to executable Python programs, + which can be run under the Python debugger, *note pdb: c6. + + * The *note DebugRunner: 3845. class is a subclass of *note + DocTestRunner: 3807. 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. + + * The *note unittest: 125. cases generated by *note DocTestSuite(): + a74. support the *note debug(): 3846. method defined by *note + unittest.TestCase: 282. + + * You can add a call to *note pdb.set_trace(): 7c4. 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 ‘a.py’ contains just this module + docstring: + + """ + >>> def f(x): + ... g(x*2) + >>> def g(x): + ... print(x+3) + ... import pdb; pdb.set_trace() + >>> f(3) + 9 + """ + + Then an interactive Python session may look like this: + + >>> 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) + >>> + +Functions that convert doctests to Python code, and possibly run the +synthesized code under the debugger: + + -- 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, + + 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 + """)) + + displays: + + # Set x and y to 1 and 2. + x, y = 1, 2 + # + # Print their sum: + print(x+y) + # Expected: + ## 3 + + 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. + + -- 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 + *note script_from_examples(): 3847. above. For example, if module + ‘a.py’ contains a top-level function ‘f()’, then + + import a, doctest + print(doctest.testsource(a, "a.f")) + + prints a script version of function ‘f()’’s docstring, with + doctests converted to code, and the rest placed in comments. + + -- Function: doctest.debug (module, name, pm=False) + + Debug the doctests for an object. + + The `module' and `name' arguments are the same as for function + *note testsource(): 3848. 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, + *note pdb: c6. + + A shallow copy of ‘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 *note pdb.post_mortem(): 1046, 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 *note exec(): 4a8. call to + *note pdb.run(): 3849. + + -- Function: doctest.debug_src (src, pm=False, globs=None) + + Debug the doctests in a string. + + This is like function *note debug(): 3846. 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 *note + debug(): 3846. above. + + Optional argument `globs' gives a dictionary to use as both local + and global execution context. If not specified, or ‘None’, an + empty dictionary is used. If specified, a shallow copy of the + dictionary is used. + +The *note DebugRunner: 3845. 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 *note +DebugRunner: 3845.’s docstring (which is a doctest!) for more details: + + -- Class: doctest.DebugRunner (checker=None, verbose=None, + optionflags=0) + + A subclass of *note DocTestRunner: 3807. that raises an exception + as soon as a failure is encountered. If an unexpected exception + occurs, an *note UnexpectedException: 384b. exception is raised, + containing the test, the example, and the original exception. If + the output doesn’t match, then a *note DocTestFailure: 384c. + exception is raised, containing the test, the example, and the + actual output. + + For information about the constructor parameters and methods, see + the documentation for *note DocTestRunner: 3807. in section *note + Advanced API: 381e. + +There are two exceptions that may be raised by *note DebugRunner: 3845. +instances: + + -- Exception: doctest.DocTestFailure (test, example, got) + + An exception raised by *note DocTestRunner: 3807. 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. + +*note DocTestFailure: 384c. defines the following attributes: + + -- Attribute: DocTestFailure.test + + The *note DocTest: 381b. object that was being run when the example + failed. + + -- Attribute: DocTestFailure.example + + The *note Example: 381f. that failed. + + -- Attribute: DocTestFailure.got + + The example’s actual output. + + -- Exception: doctest.UnexpectedException (test, example, exc_info) + + An exception raised by *note DocTestRunner: 3807. to signal that a + doctest example raised an unexpected exception. The constructor + arguments are used to initialize the attributes of the same names. + +*note UnexpectedException: 384b. defines the following attributes: + + -- Attribute: UnexpectedException.test + + The *note DocTest: 381b. object that was being run when the example + failed. + + -- Attribute: UnexpectedException.example + + The *note Example: 381f. that failed. + + -- Attribute: UnexpectedException.exc_info + + A tuple containing information about the unexpected exception, as + returned by *note sys.exc_info(): 25b. + + +File: python.info, Node: Soapbox, Prev: Debugging, Up: doctest — Test interactive Python examples + +5.26.7.21 Soapbox +................. + +As mentioned in the introduction, *note doctest: 63. has grown to have +three primary uses: + + 1. Checking examples in docstrings. + + 2. Regression testing. + + 3. Executable documentation / literate testing. + +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 *note doctest: 63. 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: + + * Write text files containing test cases as interactive examples, and + test the files using *note testfile(): 37ee. or *note + DocFileSuite(): 381a. This is recommended, although is easiest to + do for new projects, designed from the start to use doctest. + + * Define functions named ‘_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. + + * Define a ‘__test__’ dictionary mapping from regression test topics + to docstrings containing test cases. + +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: + + 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("{} failures out of {} tests".format(fail, total)) + + +File: python.info, Node: unittest — Unit testing framework, Next: unittest mock — mock object library, Prev: doctest — Test interactive Python examples, Up: Development Tools + +5.26.8 ‘unittest’ — Unit testing framework +------------------------------------------ + +`Source code:' Lib/unittest/__init__.py(1) + +__________________________________________________________________ + +(If you are already familiar with the basic concepts of testing, you +might want to skip to *note the list of assert methods: 3857.) + +The *note unittest: 125. 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, *note unittest: 125. supports some important concepts +in an object-oriented way: + +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. + +test case + + A `test case' is the individual unit of testing. It checks for a + specific response to a particular set of inputs. *note unittest: + 125. provides a base class, *note TestCase: 282, which may be used + to create new test cases. + +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. + +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. + +See also +........ + +Module *note doctest: 63. + + Another test-support module with a very different flavor. + +Simple Smalltalk Testing: With Patterns(2) + + Kent Beck’s original paper on testing frameworks using the pattern + shared by *note unittest: 125. + +pytest(3) + + Third-party unittest framework with a lighter-weight syntax for + writing tests. For example, ‘assert func(10) == 42’. + +The Python Testing Tools Taxonomy(4) + + An extensive list of Python testing tools including functional + testing frameworks and mock object libraries. + +Testing in Python Mailing List(5) + + A special-interest-group for discussion of testing, and testing + tools, in Python. + +The script ‘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(6), Jenkins(7), GitHub +Actions(8), or AppVeyor(9). + +* Menu: + +* Basic example:: +* Command-Line Interface: Command-Line Interface<3>. +* 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:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/unittest/__init__.py + + (2) +https://web.archive.org/web/20150315073817/http://www.xprogramming.com/testfram.htm + + (3) https://docs.pytest.org/ + + (4) https://wiki.python.org/moin/PythonTestingToolsTaxonomy + + (5) http://lists.idyll.org/listinfo/testing-in-python + + (6) https://buildbot.net/ + + (7) https://jenkins.io/ + + (8) https://github.com/features/actions + + (9) https://www.appveyor.com/ + + +File: python.info, Node: Basic example, Next: Command-Line Interface<3>, Up: unittest — Unit testing framework + +5.26.8.1 Basic example +...................... + +The *note unittest: 125. 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: + + 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() + +A testcase is created by subclassing *note unittest.TestCase: 282. The +three individual tests are defined with methods whose names start with +the letters ‘test’. This naming convention informs the test runner +about which methods represent tests. + +The crux of each test is a call to *note assertEqual(): ee2. to check +for an expected result; *note assertTrue(): ee1. or *note assertFalse(): +fd1. to verify a condition; or *note assertRaises(): e16. to verify that +a specific exception gets raised. These methods are used instead of the +*note assert: 5bc. statement so the test runner can accumulate all test +results and produce a report. + +The *note setUp(): fd5. and *note tearDown(): fd6. 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 *note Organizing +test code: 385a. + +The final block shows a simple way to run the tests. *note +unittest.main(): c85. 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: + + ... + ---------------------------------------------------------------------- + Ran 3 tests in 0.000s + + OK + +Passing the ‘-v’ option to your test script will instruct *note +unittest.main(): c85. to enable a higher level of verbosity, and produce +the following output: + + 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 + +The above examples show the most commonly used *note unittest: 125. +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 ‘None’ value), is now deprecated. + + +File: python.info, Node: Command-Line Interface<3>, Next: Test Discovery, Prev: Basic example, Up: unittest — Unit testing framework + +5.26.8.2 Command-Line Interface +............................... + +The unittest module can be used from the command line to run tests from +modules, classes or even individual test methods: + + python -m unittest test_module1 test_module2 + python -m unittest test_module.TestClass + python -m unittest test_module.TestClass.test_method + +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: + + python -m unittest tests/test_something.py + +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: + + python -m unittest -v test_module + +When executed without arguments *note Test Discovery: 385d. is started: + + python -m unittest + +For a list of all the command-line options: + + python -m unittest -h + +Changed in version 3.2: In earlier versions it was only possible to run +individual test methods and not modules or classes. + +* Menu: + +* Command-line options: Command-line options<3>. + + +File: python.info, Node: Command-line options<3>, Up: Command-Line Interface<3> + +5.26.8.3 Command-line options +............................. + +‘unittest’ supports these command-line options: + + -- Program Option: -b, --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. + + -- Program Option: -c, --catch + + ‘Control-C’ during the test run waits for the current test to end + and then reports all the results so far. A second ‘Control-C’ + raises the normal *note KeyboardInterrupt: 611. exception. + + See *note Signal Handling: 3861. for the functions that provide + this functionality. + + -- Program Option: -f, --failfast + + Stop the test run on the first error or failure. + + -- Program Option: -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 (‘*’) are matched + against the test name using *note fnmatch.fnmatchcase(): 129e.; + 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, ‘-k foo’ matches ‘foo_tests.SomeTest.test_something’, + ‘bar_tests.SomeTest.test_foo’, but not + ‘bar_tests.FooTest.test_something’. + + -- Program Option: --locals + + Show local variables in tracebacks. + +New in version 3.2: The command-line options ‘-b’, ‘-c’ and ‘-f’ were +added. + +New in version 3.5: The command-line option ‘--locals’. + +New in version 3.7: The command-line option ‘-k’. + +The command line can also be used for test discovery, for running all of +the tests in a project or just a subset. + + +File: python.info, Node: Test Discovery, Next: Organizing test code, Prev: Command-Line Interface<3>, Up: unittest — Unit testing framework + +5.26.8.4 Test Discovery +....................... + +New in version 3.2. + +Unittest supports simple test discovery. In order to be compatible with +test discovery, all of the test files must be *note modules: 16a3. or +*note packages: 16b4. importable from the top-level directory of the +project (this means that their filenames must be valid *note +identifiers: 1877.). + +Test discovery is implemented in *note TestLoader.discover(): c87, but +can also be used from the command line. The basic command-line usage +is: + + cd project_directory + python -m unittest discover + + Note: As a shortcut, ‘python -m unittest’ is the equivalent of + ‘python -m unittest discover’. If you want to pass arguments to + test discovery the ‘discover’ sub-command must be used explicitly. + +The ‘discover’ sub-command has the following options: + + -- Program Option: -v, --verbose + + Verbose output + + -- Program Option: -s, --start-directory directory + + Directory to start discovery (‘.’ default) + + -- Program Option: -p, --pattern pattern + + Pattern to match test files (‘test*.py’ default) + + -- Program Option: -t, --top-level-directory directory + + Top level directory of project (defaults to start directory) + +The *note -s: 3868, *note -p: 386a, and *note -t: 386c. options can be +passed in as positional arguments in that order. The following two +command lines are equivalent: + + python -m unittest discover -s project_directory -p "*_test.py" + python -m unittest discover project_directory "*_test.py" + +As well as being a path it is possible to pass a package name, for +example ‘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. + + 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 ‘foo/bar/baz.py’ will be imported as ‘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. + +Test modules and packages can customize test loading and discovery by +through the *note load_tests protocol: 386e. + +Changed in version 3.4: Test discovery supports *note namespace +packages: 19a5. for the start directory. Note that you need to specify +the top level directory too (e.g. ‘python -m unittest discover -s +root/namespace -t root’). + +Changed in version 3.11: Python 3.11 dropped the *note namespace +packages: 19a5. support. It has been broken since Python 3.7. Start +directory and subdirectories containing tests must be regular package +that have ‘__init__.py’ file. + +Directories containing start directory still can be a namespace package. +In this case, you need to specify start directory as dotted package +name, and target directory explicitly. For example: + + # proj/ <-- current directory + # namespace/ + # mypkg/ + # __init__.py + # test_mypkg.py + + python -m unittest discover -s namespace.mypkg -t . + + +File: python.info, Node: Organizing test code, Next: Re-using old test code, Prev: Test Discovery, Up: unittest — Unit testing framework + +5.26.8.5 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 *note +unittest: 125, test cases are represented by *note unittest.TestCase: +282. instances. To make your own test cases you must write subclasses +of *note TestCase: 282. or use *note FunctionTestCase: 3870. + +The testing code of a *note TestCase: 282. 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 *note TestCase: 282. subclass will simply implement a test +method (i.e. a method whose name starts with ‘test’) in order to +perform specific testing code: + + import unittest + + class DefaultWidgetSizeTestCase(unittest.TestCase): + def test_default_widget_size(self): + widget = Widget('The widget') + self.assertEqual(widget.size(), (50, 50)) + +Note that in order to test something, we use one of the ‘assert*()’ +methods provided by the *note TestCase: 282. base class. If the test +fails, an exception will be raised with an explanatory message, and +*note unittest: 125. 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 *note +setUp(): fd5, which the testing framework will automatically call for +every single test we run: + + 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') + + 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. + +If the *note setUp(): fd5. 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 *note tearDown(): fd6. method that tidies up +after the test method has been run: + + import unittest + + class WidgetTestCase(unittest.TestCase): + def setUp(self): + self.widget = Widget('The widget') + + def tearDown(self): + self.widget.dispose() + +If *note setUp(): fd5. succeeded, *note tearDown(): fd6. 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 *note setUp(): fd5, +*note tearDown(): fd6, and ‘__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. *note unittest: 125. +provides a mechanism for this: the `test suite', represented by *note +unittest: 125.’s *note TestSuite: a75. class. In most cases, calling +*note unittest.main(): c85. 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: + + 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()) + +You can place the definitions of test cases and test suites in the same +modules as the code they are to test (such as ‘widget.py’), but there +are several advantages to placing the test code in a separate module, +such as ‘test_widget.py’: + + * The test module can be run standalone from the command line. + + * The test code can more easily be separated from shipped code. + + * There is less temptation to change test code to fit the code it + tests without a good reason. + + * Test code should be modified much less frequently than the code it + tests. + + * Tested code can be refactored more easily. + + * Tests for modules written in C must be in separate modules anyway, + so why not be consistent? + + * If the testing strategy changes, there is no need to change the + source code. + + +File: python.info, Node: Re-using old test code, Next: Skipping tests and expected failures, Prev: Organizing test code, Up: unittest — Unit testing framework + +5.26.8.6 Re-using old test code +............................... + +Some users will find that they have existing test code that they would +like to run from *note unittest: 125, without converting every old test +function to a *note TestCase: 282. subclass. + +For this reason, *note unittest: 125. provides a *note FunctionTestCase: +3870. class. This subclass of *note TestCase: 282. can be used to wrap +an existing test function. Set-up and tear-down functions can also be +provided. + +Given the following test function: + + def testSomething(): + something = makeSomething() + assert something.name is not None + # ... + +one can create an equivalent test case instance as follows, with +optional set-up and tear-down methods: + + testcase = unittest.FunctionTestCase(testSomething, + setUp=makeSomethingDB, + tearDown=deleteSomethingDB) + + Note: Even though *note FunctionTestCase: 3870. can be used to + quickly convert an existing test base over to a *note unittest: + 125.-based system, this approach is not recommended. Taking the + time to set up proper *note TestCase: 282. subclasses will make + future test refactorings infinitely easier. + +In some cases, the existing tests may have been written using the *note +doctest: 63. module. If so, *note doctest: 63. provides a +‘DocTestSuite’ class that can automatically build *note +unittest.TestSuite: a75. instances from the existing *note doctest: +63.-based tests. + + +File: python.info, Node: Skipping tests and expected failures, Next: Distinguishing test iterations using subtests, Prev: Re-using old test code, Up: unittest — Unit testing framework + +5.26.8.7 Skipping tests and expected failures +............................................. + +New 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 *note TestResult: e1b. + +Skipping a test is simply a matter of using the *note skip(): 1402. +*note decorator: 2f8. or one of its conditional variants, calling *note +TestCase.skipTest(): 3875. within a *note setUp(): fd5. or test method, +or raising *note SkipTest: c86. directly. + +Basic skipping looks like this: + + 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 + +This is the output of running the example above in verbose mode: + + 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) + +Classes can be skipped just like methods: + + @unittest.skip("showing class skipping") + class MySkippedTestCase(unittest.TestCase): + def test_not_run(self): + pass + +*note TestCase.setUp(): fd5. can also skip the test. This is useful +when a resource that needs to be set up is not available. + +Expected failures use the *note expectedFailure(): 3876. decorator. + + class ExpectedFailureTestCase(unittest.TestCase): + @unittest.expectedFailure + def test_fail(self): + self.assertEqual(1, 0, "broken") + +It’s easy to roll your own skipping decorators by making a decorator +that calls *note skip(): 1402. on the test when it wants it to be +skipped. This decorator skips the test unless the passed object has a +certain attribute: + + def skipUnlessHasattr(obj, attr): + if hasattr(obj, attr): + return lambda func: func + return unittest.skip("{!r} doesn't have {!r}".format(obj, attr)) + +The following decorators and exception implement test skipping and +expected failures: + + -- Function: @unittest.skip (reason) + + Unconditionally skip the decorated test. `reason' should describe + why the test is being skipped. + + -- Function: @unittest.skipIf (condition, reason) + + Skip the decorated test if `condition' is true. + + -- Function: @unittest.skipUnless (condition, reason) + + Skip the decorated test unless `condition' is true. + + -- 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. + + -- Exception: unittest.SkipTest (reason) + + This exception is raised to skip a test. + + Usually you can use *note TestCase.skipTest(): 3875. or one of the + skipping decorators instead of raising this directly. + +Skipped tests will not have *note setUp(): fd5. or *note tearDown(): +fd6. run around them. Skipped classes will not have *note setUpClass(): +69e. or *note tearDownClass(): fd3. run. Skipped modules will not have +‘setUpModule()’ or ‘tearDownModule()’ run. + + +File: python.info, Node: Distinguishing test iterations using subtests, Next: Classes and functions, Prev: Skipping tests and expected failures, Up: unittest — Unit testing framework + +5.26.8.8 Distinguishing test iterations using subtests +...................................................... + +New 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 *note subTest(): c83. context manager. + +For example, the following test: + + 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) + +will produce the following output: + + ====================================================================== + 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 + +Without using a subtest, execution would stop after the first failure, +and the error would be less easy to diagnose because the value of ‘i’ +wouldn’t be displayed: + + ====================================================================== + 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 + + +File: python.info, Node: Classes and functions, Next: Class and Module Fixtures, Prev: Distinguishing test iterations using subtests, Up: unittest — Unit testing framework + +5.26.8.9 Classes and functions +.............................. + +This section describes in depth the API of *note unittest: 125. + +* Menu: + +* Test cases:: +* Grouping tests:: +* Loading and running tests:: + + +File: python.info, Node: Test cases, Next: Grouping tests, Up: Classes and functions + +5.26.8.10 Test cases +.................... + + -- Class: unittest.TestCase (methodName='runTest') + + Instances of the *note TestCase: 282. class represent the logical + test units in the *note unittest: 125. 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 *note TestCase: 282. will run a single base + method: the method named `methodName'. In most uses of *note + TestCase: 282, you will neither change the `methodName' nor + reimplement the default ‘runTest()’ method. + + Changed in version 3.2: *note TestCase: 282. can be instantiated + successfully without providing a `methodName'. This makes it + easier to experiment with *note TestCase: 282. from the interactive + interpreter. + + *note TestCase: 282. 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: + + -- Method: setUp () + + Method called to prepare the test fixture. This is called + immediately before calling the test method; other than *note + AssertionError: 26e. or *note SkipTest: c86, any exception + raised by this method will be considered an error rather than + a test failure. The default implementation does nothing. + + -- 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 *note + AssertionError: 26e. or *note SkipTest: c86, 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 *note + setUp(): fd5. succeeds, regardless of the outcome of the test + method. The default implementation does nothing. + + -- Method: setUpClass () + + A class method called before tests in an individual class are + run. ‘setUpClass’ is called with the class as the only + argument and must be decorated as a *note classmethod(): 18d.: + + @classmethod + def setUpClass(cls): + ... + + See *note Class and Module Fixtures: 387e. for more details. + + New in version 3.2. + + -- Method: tearDownClass () + + A class method called after tests in an individual class have + run. ‘tearDownClass’ is called with the class as the only + argument and must be decorated as a *note classmethod(): 18d.: + + @classmethod + def tearDownClass(cls): + ... + + See *note Class and Module Fixtures: 387e. for more details. + + New in version 3.2. + + -- Method: run (result=None) + + Run the test, collecting the result into the *note TestResult: + e1b. object passed as `result'. If `result' is omitted or + ‘None’, a temporary result object is created (by calling the + *note defaultTestResult(): 387f. method) and used. The result + object is returned to *note run(): e1a.’s caller. + + The same effect may be had by simply calling the *note + TestCase: 282. instance. + + Changed in version 3.3: Previous versions of ‘run’ did not + return the result. Neither did calling an instance. + + -- Method: skipTest (reason) + + Calling this during a test method or *note setUp(): fd5. skips + the current test. See *note Skipping tests and expected + failures: 3874. for more information. + + New in version 3.1. + + -- 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 *note Distinguishing test iterations using subtests: c84. + for more information. + + New in version 3.4. + + -- 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. + The *note TestCase: 282. 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): + + Method Checks that New in + + ---------------------------------------------------------------------------------------------------- + + *note assertEqual(a, b): ee2. ‘a == b’ + + + *note assertNotEqual(a, b): ee3. ‘a != b’ + + + *note assertTrue(x): ee1. ‘bool(x) is True’ + + + *note assertFalse(x): fd1. ‘bool(x) is False’ + + + *note assertIs(a, b): fd9. ‘a is b’ 3.1 + + + *note assertIsNot(a, b): fda. ‘a is not b’ 3.1 + + + *note assertIsNone(x): fd7. ‘x is None’ 3.1 + + + *note assertIsNotNone(x): fd8. ‘x is not None’ 3.1 + + + *note assertIn(a, b): fe2. ‘a in b’ 3.1 + + + *note assertNotIn(a, b): fe3. ‘a not in b’ 3.1 + + + *note assertIsInstance(a, b): fdb. ‘isinstance(a, b)’ 3.2 + + + *note assertNotIsInstance(a, b): fdc. ‘not isinstance(a, b)’ 3.2 + + + All the assert methods accept a `msg' argument that, if specified, + is used as the error message on failure (see also *note + longMessage: fd2.). Note that the `msg' keyword argument can be + passed to *note assertRaises(): e16, *note assertRaisesRegex(): + e17, *note assertWarns(): e18, *note assertWarnsRegex(): e19. only + when they are used as a context manager. + + -- 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 *note + addTypeEqualityFunc(): feb. the type-specific equality + function will be called in order to generate a more useful + default error message (see also the *note list of + type-specific methods: 3880.). + + Changed in version 3.1: Added the automatic calling of + type-specific equality function. + + Changed in version 3.2: *note assertMultiLineEqual(): fe1. + added as the default type equality function for comparing + strings. + + -- Method: assertNotEqual (first, second, msg=None) + + Test that `first' and `second' are not equal. If the values + do compare equal, the test will fail. + + -- Method: assertTrue (expr, msg=None) + -- Method: assertFalse (expr, msg=None) + + Test that `expr' is true (or false). + + Note that this is equivalent to ‘bool(expr) is True’ and not + to ‘expr is True’ (use ‘assertIs(expr, True)’ for the latter). + This method should also be avoided when more specific methods + are available (e.g. ‘assertEqual(a, b)’ instead of + ‘assertTrue(a == b)’), because they provide a better error + message in case of failure. + + -- Method: assertIs (first, second, msg=None) + -- Method: assertIsNot (first, second, msg=None) + + Test that `first' and `second' are (or are not) the same + object. + + New in version 3.1. + + -- Method: assertIsNone (expr, msg=None) + -- Method: assertIsNotNone (expr, msg=None) + + Test that `expr' is (or is not) ‘None’. + + New in version 3.1. + + -- Method: assertIn (member, container, msg=None) + -- Method: assertNotIn (member, container, msg=None) + + Test that `member' is (or is not) in `container'. + + New in version 3.1. + + -- Method: assertIsInstance (obj, cls, msg=None) + -- 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 *note + isinstance(): 3ab.). To check for the exact type, use *note + assertIs(type(obj), cls): fd9. + + New in version 3.2. + + It is also possible to check the production of exceptions, + warnings, and log messages using the following methods: + + Method Checks that New in + + -------------------------------------------------------------------------------------------------------------------------- + + *note assertRaises(exc, fun, *args, **kwds): e16. ‘fun(*args, **kwds)’ raises `exc' + + + *note assertRaisesRegex(exc, r, fun, *args, **kwds): e17. ‘fun(*args, **kwds)’ raises `exc' and 3.1 + the message matches regex `r' + + + *note assertWarns(warn, fun, *args, **kwds): e18. ‘fun(*args, **kwds)’ raises `warn' 3.2 + + + *note assertWarnsRegex(warn, r, fun, *args, **kwds): e19. ‘fun(*args, **kwds)’ raises `warn' and 3.2 + the message matches regex `r' + + + *note assertLogs(logger, level): 450. The ‘with’ block logs on `logger' with 3.4 + minimum `level' + + + *note assertNoLogs(logger, level): 44f. The ‘with’ block does not log on 3.10 + + `logger' with minimum `level' + + + -- Method: assertRaises (exception, callable, *args, **kwds) + + -- 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 *note assertRaises(): e16. 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: + + with self.assertRaises(SomeException): + do_something() + + When used as a context manager, *note assertRaises(): e16. + accepts the additional keyword argument `msg'. + + The context manager will store the caught exception object in + its ‘exception’ attribute. This can be useful if the + intention is to perform additional checks on the exception + raised: + + with self.assertRaises(SomeException) as cm: + do_something() + + the_exception = cm.exception + self.assertEqual(the_exception.error_code, 3) + + Changed in version 3.1: Added the ability to use *note + assertRaises(): e16. as a context manager. + + Changed in version 3.2: Added the ‘exception’ attribute. + + Changed in version 3.3: Added the `msg' keyword argument when + used as a context manager. + + -- Method: assertRaisesRegex (exception, regex, callable, *args, + **kwds) + + -- Method: assertRaisesRegex (exception, regex, *, msg=None) + + Like *note assertRaises(): e16. 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 *note + re.search(): edf. Examples: + + self.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$", + int, 'XYZ') + + or: + + with self.assertRaisesRegex(ValueError, 'literal'): + int('XYZ') + + New in version 3.1: Added under the name ‘assertRaisesRegexp’. + + Changed in version 3.2: Renamed to *note assertRaisesRegex(): + e17. + + Changed in version 3.3: Added the `msg' keyword argument when + used as a context manager. + + -- Method: assertWarns (warning, callable, *args, **kwds) + + -- 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 *note assertWarns(): e18. 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: + + with self.assertWarns(SomeWarning): + do_something() + + When used as a context manager, *note assertWarns(): e18. + accepts the additional keyword argument `msg'. + + The context manager will store the caught warning object in + its ‘warning’ attribute, and the source line which triggered + the warnings in the ‘filename’ and ‘lineno’ attributes. This + can be useful if the intention is to perform additional checks + on the warning caught: + + with self.assertWarns(SomeWarning) as cm: + do_something() + + self.assertIn('myfile.py', cm.filename) + self.assertEqual(320, cm.lineno) + + This method works regardless of the warning filters in place + when it is called. + + New in version 3.2. + + Changed in version 3.3: Added the `msg' keyword argument when + used as a context manager. + + -- Method: assertWarnsRegex (warning, regex, callable, *args, + **kwds) + + -- Method: assertWarnsRegex (warning, regex, *, msg=None) + + Like *note assertWarns(): e18. 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 *note re.search(): edf. + Example: + + self.assertWarnsRegex(DeprecationWarning, + r'legacy_function\(\) is deprecated', + legacy_function, 'XYZ') + + or: + + with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'): + frobnicate('/etc/passwd') + + New in version 3.2. + + Changed in version 3.3: Added the `msg' keyword argument when + used as a context manager. + + -- 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 *note logging.Logger: 7a9. + object or a *note str: 1b3. 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 ‘"ERROR"’ or + ‘logging.ERROR’). The default is ‘logging.INFO’. + + The test passes if at least one message emitted inside the + ‘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: + + -- Attribute: records + + A list of *note logging.LogRecord: c88. objects of the + matching log messages. + + -- Attribute: output + + A list of *note str: 1b3. objects with the formatted + output of matching messages. + + 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']) + + New in version 3.4. + + -- 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 *note logging.Logger: 7a9. + object or a *note str: 1b3. 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 ‘"ERROR"’ or + ‘logging.ERROR’). The default is ‘logging.INFO’. + + Unlike *note assertLogs(): 450, nothing will be returned by + the context manager. + + New in version 3.10. + + There are also other methods used to perform more specific checks, + such as: + + Method Checks that New in + + ---------------------------------------------------------------------------------------------------- + + *note assertAlmostEqual(a, b): ee4. ‘round(a-b, 7) == 0’ + + + *note assertNotAlmostEqual(a, b): ee5. ‘round(a-b, 7) != 0’ + + + *note assertGreater(a, b): fdd. ‘a > b’ 3.1 + + + *note assertGreaterEqual(a, b): fde. ‘a >= b’ 3.1 + + + *note assertLess(a, b): fdf. ‘a < b’ 3.1 + + + *note assertLessEqual(a, b): fe0. ‘a <= b’ 3.1 + + + *note assertRegex(s, r): ede. ‘r.search(s)’ 3.1 + + + *note assertNotRegex(s, r): 3883. ‘not r.search(s)’ 3.2 + + + *note assertCountEqual(a, b): edc. `a' and `b' have the same elements 3.2 + in the same number, regardless of + their order. + + + -- Method: assertAlmostEqual (first, second, places=7, msg=None, + delta=None) + -- 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 *note + round(): f7e. 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 *note TypeError: + 19c. + + Changed in version 3.2: *note assertAlmostEqual(): ee4. + automatically considers almost equal objects that compare + equal. *note assertNotAlmostEqual(): ee5. automatically fails + if the objects compare equal. Added the `delta' keyword + argument. + + -- Method: assertGreater (first, second, msg=None) + -- Method: assertGreaterEqual (first, second, msg=None) + -- Method: assertLess (first, second, msg=None) + -- 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: + + >>> self.assertGreaterEqual(3, 4) + AssertionError: "3" unexpectedly not greater than or equal to "4" + + New in version 3.1. + + -- Method: assertRegex (text, regex, msg=None) + -- 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 *note re.search(): edf. + + New in version 3.1: Added under the name + ‘assertRegexpMatches’. + + Changed in version 3.2: The method ‘assertRegexpMatches()’ has + been renamed to *note assertRegex(): ede. + + New in version 3.2: *note assertNotRegex(): 3883. + + New in version 3.5: The name ‘assertNotRegexpMatches’ is a + deprecated alias for *note assertNotRegex(): 3883. + + -- 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: + ‘assertEqual(Counter(list(first)), Counter(list(second)))’ but + works with sequences of unhashable objects as well. + + New in version 3.2. + + The *note assertEqual(): ee2. 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 *note + addTypeEqualityFunc(): feb.: + + -- Method: addTypeEqualityFunc (typeobj, function) + + Registers a type-specific method called by *note + assertEqual(): ee2. 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 *note assertEqual(): ee2. does. It + must raise *note self.failureException(msg): 3884. when + inequality between the first two parameters is detected – + possibly providing useful information and explaining the + inequalities in details in the error message. + + New in version 3.1. + + The list of type-specific methods automatically used by *note + assertEqual(): ee2. are summarized in the following table. Note + that it’s usually not necessary to invoke these methods directly. + + Method Used to compare New in + + --------------------------------------------------------------------------------------------------- + + *note assertMultiLineEqual(a, b): fe1. strings 3.1 + + + *note assertSequenceEqual(a, b): fe7. sequences 3.1 + + + *note assertListEqual(a, b): fe5. lists 3.1 + + + *note assertTupleEqual(a, b): fe6. tuples 3.1 + + + *note assertSetEqual(a, b): fe4. sets or frozensets 3.1 + + + *note assertDictEqual(a, b): fe8. dicts 3.1 + + + -- 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 *note assertEqual(): ee2. + + New in version 3.1. + + -- 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 *note assertEqual(): + ee2, but it’s used to implement *note assertListEqual(): fe5. + and *note assertTupleEqual(): fe6. + + New in version 3.1. + + -- Method: assertListEqual (first, second, msg=None) + -- 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 *note assertEqual(): ee2. + + New in version 3.1. + + -- 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 *note assertEqual(): ee2. + + Fails if either of `first' or `second' does not have a + ‘set.difference()’ method. + + New in version 3.1. + + -- 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 *note assertEqual(): ee2. + + New in version 3.1. + + Finally the *note TestCase: 282. provides the following methods and + attributes: + + -- Method: fail (msg=None) + + Signals a test failure unconditionally, with `msg' or ‘None’ + for the error message. + + -- 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 *note + AssertionError: 26e. + + -- 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. ‘True’ is the default value. In this case, + the custom message is appended to the end of the standard + failure message. When set to ‘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 + ‘True’ or ‘False’ before calling the assert methods. + + The class setting gets reset before each test call. + + New in version 3.1. + + -- 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 *note assertSequenceEqual(): fe7. (including all the + sequence comparison methods that delegate to it), *note + assertDictEqual(): fe8. and *note assertMultiLineEqual(): fe1. + + Setting ‘maxDiff’ to ‘None’ means that there is no maximum + length of diffs. + + New in version 3.2. + + Testing frameworks can use the following methods to collect + information on the test: + + -- Method: countTestCases () + + Return the number of tests represented by this test object. + For *note TestCase: 282. instances, this will always be ‘1’. + + -- 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 *note run(): e1a. method). + + For *note TestCase: 282. instances, this will always be an + instance of *note TestResult: e1b.; subclasses of *note + TestCase: 282. should override this as necessary. + + -- 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. + + -- Method: shortDescription () + + Returns a description of the test, or ‘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 ‘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 *note + TextTestResult: 125a. in Python 3.2. + + -- Method: addCleanup (function, /, *args, **kwargs) + + Add a function to be called after *note tearDown(): fd6. to + cleanup resources used during the test. Functions will be + called in reverse order to the order they are added (LIFO). + They are called with any arguments and keyword arguments + passed into *note addCleanup(): 6d3. when they are added. + + If *note setUp(): fd5. fails, meaning that *note tearDown(): + fd6. is not called, then any cleanup functions added will + still be called. + + New in version 3.1. + + -- Method: enterContext (cm) + + Enter the supplied *note context manager: 1a0. If successful, + also add its *note __exit__(): 1978. method as a cleanup + function by *note addCleanup(): 6d3. and return the result of + the *note __enter__(): 18e. method. + + New in version 3.11. + + -- Method: doCleanups () + + This method is called unconditionally after *note tearDown(): + fd6, or after *note setUp(): fd5. if *note setUp(): fd5. + raises an exception. + + It is responsible for calling all the cleanup functions added + by *note addCleanup(): 6d3. If you need cleanup functions to + be called `prior' to *note tearDown(): fd6. then you can call + *note doCleanups(): fd4. yourself. + + *note doCleanups(): fd4. pops methods off the stack of cleanup + functions one at a time, so it can be called at any time. + + New in version 3.1. + + -- Method: classmethod addClassCleanup (function, /, *args, + **kwargs) + + Add a function to be called after *note tearDownClass(): fd3. + to cleanup resources used during the test class. Functions + will be called in reverse order to the order they are added + (LIFO). They are called with any arguments and keyword + arguments passed into *note addClassCleanup(): 69d. when they + are added. + + If *note setUpClass(): 69e. fails, meaning that *note + tearDownClass(): fd3. is not called, then any cleanup + functions added will still be called. + + New in version 3.8. + + -- Method: classmethod enterClassContext (cm) + + Enter the supplied *note context manager: 1a0. If successful, + also add its *note __exit__(): 1978. method as a cleanup + function by *note addClassCleanup(): 69d. and return the + result of the *note __enter__(): 18e. method. + + New in version 3.11. + + -- Method: classmethod doClassCleanups () + + This method is called unconditionally after *note + tearDownClass(): fd3, or after *note setUpClass(): 69e. if + *note setUpClass(): 69e. raises an exception. + + It is responsible for calling all the cleanup functions added + by *note addClassCleanup(): 69d. If you need cleanup + functions to be called `prior' to *note tearDownClass(): fd3. + then you can call *note doClassCleanups(): 388a. yourself. + + *note doClassCleanups(): 388a. pops methods off the stack of + cleanup functions one at a time, so it can be called at any + time. + + New in version 3.8. + + -- Class: unittest.IsolatedAsyncioTestCase (methodName='runTest') + + This class provides an API similar to *note TestCase: 282. and also + accepts coroutines as test functions. + + New in version 3.8. + + -- Method: coroutine asyncSetUp () + + Method called to prepare the test fixture. This is called + after ‘setUp()’. This is called immediately before calling + the test method; other than *note AssertionError: 26e. or + *note SkipTest: c86, any exception raised by this method will + be considered an error rather than a test failure. The + default implementation does nothing. + + -- Method: coroutine asyncTearDown () + + Method called immediately after the test method has been + called and the result recorded. This is called before + ‘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 *note AssertionError: 26e. or *note + SkipTest: c86, 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 *note asyncSetUp(): 388b. succeeds, + regardless of the outcome of the test method. The default + implementation does nothing. + + -- Method: addAsyncCleanup (function, /, *args, **kwargs) + + This method accepts a coroutine that can be used as a cleanup + function. + + -- Method: coroutine enterAsyncContext (cm) + + Enter the supplied *note asynchronous context manager: 1a3. + If successful, also add its *note __aexit__(): 1989. method as + a cleanup function by *note addAsyncCleanup(): 388d. and + return the result of the *note __aenter__(): 1988. method. + + New in version 3.11. + + -- Method: run (result=None) + + Sets up a new event loop to run the test, collecting the + result into the *note TestResult: e1b. object passed as + `result'. If `result' is omitted or ‘None’, a temporary + result object is created (by calling the ‘defaultTestResult()’ + method) and used. The result object is returned to *note + run(): 388e.’s caller. At the end of the test all the tasks + in the event loop are cancelled. + + An example illustrating the order: + + 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() + + After running the test, ‘events’ would contain ‘["setUp", + "asyncSetUp", "test_response", "asyncTearDown", "tearDown", + "cleanup"]’. + + -- Class: unittest.FunctionTestCase (testFunc, setUp=None, + tearDown=None, description=None) + + This class implements the portion of the *note TestCase: 282. + 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 *note unittest: 125.-based test + framework. + +* Menu: + +* Deprecated aliases:: + + +File: python.info, Node: Deprecated aliases, Up: Test cases + +5.26.8.11 Deprecated aliases +............................ + +For historical reasons, some of the *note TestCase: 282. methods had one +or more aliases that are now deprecated. The following table lists the +correct names along with their deprecated aliases: + + Method Name Deprecated alias Deprecated alias + + ------------------------------------------------------------------------------------------ + + *note assertEqual(): ee2. failUnlessEqual assertEquals + + + *note assertNotEqual(): ee3. failIfEqual assertNotEquals + + + *note assertTrue(): ee1. failUnless assert_ + + + *note assertFalse(): fd1. failIf + + + *note assertRaises(): e16. failUnlessRaises + + + *note assertAlmostEqual(): ee4. failUnlessAlmostEqual assertAlmostEquals + + + *note assertNotAlmostEqual(): ee5. failIfAlmostEqual assertNotAlmostEquals + + + *note assertRegex(): ede. assertRegexpMatches + + + *note assertNotRegex(): 3883. assertNotRegexpMatches + + + *note assertRaisesRegex(): e17. assertRaisesRegexp + + + Deprecated since version 3.1: The fail* aliases listed in the + second column have been deprecated. + + Deprecated since version 3.2: The assert* aliases listed in the + third column have been deprecated. + + Deprecated since version 3.2: ‘assertRegexpMatches’ and + ‘assertRaisesRegexp’ have been renamed to *note assertRegex(): ede. + and *note assertRaisesRegex(): e17. + + Deprecated since version 3.5: The ‘assertNotRegexpMatches’ name is + deprecated in favor of *note assertNotRegex(): 3883. + + +File: python.info, Node: Grouping tests, Next: Loading and running tests, Prev: Test cases, Up: Classes and functions + +5.26.8.12 Grouping tests +........................ + + -- 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 + *note TestSuite: a75. 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. + + *note TestSuite: a75. objects behave much like *note TestCase: 282. + 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 *note TestSuite: a75. instances: + + -- Method: addTest (test) + + Add a *note TestCase: 282. or *note TestSuite: a75. to the + suite. + + -- Method: addTests (tests) + + Add all the tests from an iterable of *note TestCase: 282. and + *note TestSuite: a75. instances to this test suite. + + This is equivalent to iterating over `tests', calling *note + addTest(): 3892. for each element. + + *note TestSuite: a75. shares the following methods with *note + TestCase: 282.: + + -- Method: run (result) + + Run the tests associated with this suite, collecting the + result into the test result object passed as `result'. Note + that unlike *note TestCase.run(): e1a, *note TestSuite.run(): + 3894. requires the result object to be passed in. + + -- 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. + + -- Method: countTestCases () + + Return the number of tests represented by this test object, + including all individual tests and sub-suites. + + -- Method: __iter__ () + + Tests grouped by a *note TestSuite: a75. are always accessed + by iteration. Subclasses can lazily provide tests by + overriding *note __iter__(): cd5. 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 *note TestSuite.run(): + 3894. must be the same for each call iteration. After *note + TestSuite.run(): 3894, callers should not rely on the tests + returned by this method unless the caller uses a subclass that + overrides ‘TestSuite._removeTestAtIndex()’ to preserve test + references. + + Changed in version 3.2: In earlier versions the *note + TestSuite: a75. accessed tests directly rather than through + iteration, so overriding *note __iter__(): cd5. wasn’t + sufficient for providing tests. + + Changed in version 3.4: In earlier versions the *note + TestSuite: a75. held references to each *note TestCase: 282. + after *note TestSuite.run(): 3894. Subclasses can restore + that behavior by overriding ‘TestSuite._removeTestAtIndex()’. + + In the typical usage of a *note TestSuite: a75. object, the *note + run(): 3894. method is invoked by a ‘TestRunner’ rather than by the + end-user test harness. + + +File: python.info, Node: Loading and running tests, Prev: Grouping tests, Up: Classes and functions + +5.26.8.13 Loading and running tests +................................... + + -- Class: unittest.TestLoader + + The *note TestLoader: 2d7. class is used to create test suites from + classes and modules. Normally, there is no need to create an + instance of this class; the *note unittest: 125. module provides an + instance that can be shared as *note unittest.defaultTestLoader: + 3898. Using a subclass or instance, however, allows customization + of some configurable properties. + + *note TestLoader: 2d7. objects have the following attributes: + + -- 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. + + New in version 3.5. + + *note TestLoader: 2d7. objects have the following methods: + + -- Method: loadTestsFromTestCase (testCaseClass) + + Return a suite of all test cases contained in the *note + TestCase: 282.-derived ‘testCaseClass’. + + A test case instance is created for each method named by *note + getTestCaseNames(): 2da. By default these are the method + names beginning with ‘test’. If *note getTestCaseNames(): + 2da. returns no methods, but the ‘runTest()’ method is + implemented, a single test case is created for that method + instead. + + -- 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 *note TestCase: 282. and creates an instance of the class + for each test method defined for the class. + + Note: While using a hierarchy of *note TestCase: + 282.-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. + + If a module provides a ‘load_tests’ function it will be called + to load the tests. This allows modules to customize test + loading. This is the *note load_tests protocol: 386e. The + `pattern' argument is passed as the third argument to + ‘load_tests’. + + Changed in version 3.2: Support for ‘load_tests’ added. + + Changed in version 3.5: The undocumented and unofficial + `use_load_tests' default argument is deprecated and ignored, + although it is still accepted for backward compatibility. The + method also now accepts a keyword-only argument `pattern' + which is passed to ‘load_tests’ as the third argument. + + -- 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 *note TestSuite: a75. instance, or a + callable object which returns a *note TestCase: 282. or *note + TestSuite: a75. 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 ‘SampleTests’ containing a + *note TestCase: 282.-derived class ‘SampleTestCase’ with three + test methods (‘test_one()’, ‘test_two()’, and ‘test_three()’), + the specifier ‘'SampleTests.SampleTestCase'’ would cause this + method to return a suite which will run all three test + methods. Using the specifier + ‘'SampleTests.SampleTestCase.test_two'’ would cause it to + return a test suite which will run only the ‘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 *note ImportError: 511. or *note + AttributeError: 19d. 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. + + -- Method: loadTestsFromNames (names, module=None) + + Similar to *note loadTestsFromName(): fe9, 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. + + -- Method: getTestCaseNames (testCaseClass) + + Return a sorted sequence of method names found within + `testCaseClass'; this should be a subclass of *note TestCase: + 282. + + -- 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 the top level directory 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 + *note SkipTest: c86. being raised, it will be recorded as a + skip instead of an error. + + If a package (a directory containing a file named + ‘__init__.py’) is found, the package will be checked for a + ‘load_tests’ function. If this exists then it will be called + ‘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 ‘loader.discover’. + + If ‘load_tests’ exists then discovery does `not' recurse into + the package, ‘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 so ‘load_tests’ does not need to + pass this argument in to ‘loader.discover()’. + + `start_dir' can be a dotted module name as well as a + directory. + + New in version 3.2. + + Changed in version 3.4: Modules that raise *note SkipTest: + c86. on import are recorded as skips, not errors. + + Changed in version 3.4: `start_dir' can be a *note namespace + packages: 19a5. + + Changed in version 3.4: 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 + ‘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 *note + namespace packages: 19a5. It has been broken since Python 3.7 + and Python 3.11 officially remove it. + + The following attributes of a *note TestLoader: 2d7. can be + configured either by subclassing or assignment on an instance: + + -- Attribute: testMethodPrefix + + String giving the prefix of method names which will be + interpreted as test methods. The default value is ‘'test'’. + + This affects *note getTestCaseNames(): 2da. and all the + ‘loadTestsFrom*()’ methods. + + -- Attribute: sortTestMethodsUsing + + Function to be used to compare method names when sorting them + in *note getTestCaseNames(): 2da. and all the + ‘loadTestsFrom*()’ methods. + + -- 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 *note TestSuite: a75. class. + + This affects all the ‘loadTestsFrom*()’ methods. + + -- Attribute: testNamePatterns + + List of Unix shell-style wildcard test name patterns that test + methods have to match to be included in test suites (see ‘-v’ + option). + + If this attribute is not ‘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 *note fnmatch.fnmatchcase(): 129e, so unlike patterns + passed to the ‘-v’ option, simple substring patterns will have + to be converted using ‘*’ wildcards. + + This affects all the ‘loadTestsFrom*()’ methods. + + New in version 3.7. + + -- Class: unittest.TestResult + + This class is used to compile information about which tests have + succeeded and which have failed. + + A *note TestResult: e1b. object stores the results of a set of + tests. The *note TestCase: 282. and *note TestSuite: a75. 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 *note unittest: 125. may want + access to the *note TestResult: e1b. object generated by running a + set of tests for reporting purposes; a *note TestResult: e1b. + instance is returned by the ‘TestRunner.run()’ method for this + purpose. + + *note TestResult: e1b. instances have the following attributes that + will be of interest when inspecting the results of running a set of + tests: + + -- Attribute: errors + + A list containing 2-tuples of *note TestCase: 282. instances + and strings holding formatted tracebacks. Each tuple + represents a test which raised an unexpected exception. + + -- Attribute: failures + + A list containing 2-tuples of *note TestCase: 282. instances + and strings holding formatted tracebacks. Each tuple + represents a test where a failure was explicitly signalled + using the ‘TestCase.assert*()’ methods. + + -- Attribute: skipped + + A list containing 2-tuples of *note TestCase: 282. instances + and strings holding the reason for skipping the test. + + New in version 3.1. + + -- Attribute: expectedFailures + + A list containing 2-tuples of *note TestCase: 282. instances + and strings holding formatted tracebacks. Each tuple + represents an expected failure or error of the test case. + + -- Attribute: unexpectedSuccesses + + A list containing *note TestCase: 282. instances that were + marked as expected failures, but succeeded. + + -- Attribute: shouldStop + + Set to ‘True’ when the execution of tests should stop by *note + stop(): 38a3. + + -- Attribute: testsRun + + The total number of tests run so far. + + -- Attribute: buffer + + If set to true, ‘sys.stdout’ and ‘sys.stderr’ will be buffered + in between *note startTest(): 38a6. and *note stopTest(): + 38a7. being called. Collected output will only be echoed onto + the real ‘sys.stdout’ and ‘sys.stderr’ if the test fails or + errors. Any output is also attached to the failure / error + message. + + New in version 3.2. + + -- Attribute: failfast + + If set to true *note stop(): 38a3. will be called on the first + failure or error, halting the test run. + + New in version 3.2. + + -- Attribute: tb_locals + + If set to true then local variables will be shown in + tracebacks. + + New in version 3.5. + + -- Method: wasSuccessful () + + Return ‘True’ if all tests run so far have passed, otherwise + returns ‘False’. + + Changed in version 3.4: Returns ‘False’ if there were any + *note unexpectedSuccesses: 38a1. from tests marked with the + *note expectedFailure(): 3876. decorator. + + -- Method: stop () + + This method can be called to signal that the set of tests + being run should be aborted by setting the *note shouldStop: + 38a2. attribute to ‘True’. ‘TestRunner’ objects should + respect this flag and return without running any additional + tests. + + For example, this feature is used by the *note TextTestRunner: + 126c. class to stop the test framework when the user signals + an interrupt from the keyboard. Interactive tools which + provide ‘TestRunner’ implementations can use this in a similar + manner. + + The following methods of the *note TestResult: e1b. 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. + + -- Method: startTest (test) + + Called when the test case `test' is about to be run. + + -- Method: stopTest (test) + + Called after the test case `test' has been executed, + regardless of the outcome. + + -- Method: startTestRun () + + Called once before any tests are executed. + + New in version 3.1. + + -- Method: stopTestRun () + + Called once after all tests are executed. + + New in version 3.1. + + -- Method: addError (test, err) + + Called when the test case `test' raises an unexpected + exception. `err' is a tuple of the form returned by *note + sys.exc_info(): 25b.: ‘(type, value, traceback)’. + + The default implementation appends a tuple ‘(test, + formatted_err)’ to the instance’s *note errors: 389d. + attribute, where `formatted_err' is a formatted traceback + derived from `err'. + + -- Method: addFailure (test, err) + + Called when the test case `test' signals a failure. `err' is + a tuple of the form returned by *note sys.exc_info(): 25b.: + ‘(type, value, traceback)’. + + The default implementation appends a tuple ‘(test, + formatted_err)’ to the instance’s *note failures: 389e. + attribute, where `formatted_err' is a formatted traceback + derived from `err'. + + -- Method: addSuccess (test) + + Called when the test case `test' succeeds. + + The default implementation does nothing. + + -- 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 ‘(test, reason)’ to + the instance’s *note skipped: 389f. attribute. + + -- Method: addExpectedFailure (test, err) + + Called when the test case `test' fails or errors, but was + marked with the *note expectedFailure(): 3876. decorator. + + The default implementation appends a tuple ‘(test, + formatted_err)’ to the instance’s *note expectedFailures: + 38a0. attribute, where `formatted_err' is a formatted + traceback derived from `err'. + + -- Method: addUnexpectedSuccess (test) + + Called when the test case `test' was marked with the *note + expectedFailure(): 3876. decorator, but succeeded. + + The default implementation appends the test to the instance’s + *note unexpectedSuccesses: 38a1. attribute. + + -- Method: addSubTest (test, subtest, outcome) + + Called when a subtest finishes. `test' is the test case + corresponding to the test method. `subtest' is a custom *note + TestCase: 282. instance describing the subtest. + + If `outcome' is *note None: 243, the subtest succeeded. + Otherwise, it failed with an exception where `outcome' is a + tuple of the form returned by *note sys.exc_info(): 25b.: + ‘(type, value, traceback)’. + + The default implementation does nothing when the outcome is a + success, and records subtest failures as normal failures. + + New in version 3.4. + + -- Class: unittest.TextTestResult (stream, descriptions, verbosity) + + A concrete implementation of *note TestResult: e1b. used by the + *note TextTestRunner: 126c. + + New in version 3.2: This class was previously named + ‘_TextTestResult’. The old name still exists as an alias but is + deprecated. + + -- Data: unittest.defaultTestLoader + + Instance of the *note TestLoader: 2d7. class intended to be shared. + If no customization of the *note TestLoader: 2d7. is needed, this + instance can be used instead of repeatedly creating new instances. + + -- Class: unittest.TextTestRunner (stream=None, descriptions=True, + verbosity=1, failfast=False, buffer=False, resultclass=None, + warnings=None, *, tb_locals=False) + + A basic test runner implementation that outputs results to a + stream. If `stream' is ‘None’, the default, *note sys.stderr: 581. + 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 ‘**kwargs’ as the interface to + construct runners changes when features are added to unittest. + + By default this runner shows *note DeprecationWarning: 2d4, *note + PendingDeprecationWarning: 503, *note ResourceWarning: 8a9. and + *note ImportWarning: 46d. even if they are *note ignored by + default: 38ae. Deprecation warnings caused by *note deprecated + unittest methods: ee6. are also special-cased and, when the warning + filters are ‘'default'’ or ‘'always'’, they will appear only once + per-module, in order to avoid too many warning messages. This + behavior can be overridden using Python’s ‘-Wd’ or ‘-Wa’ options + (see *note Warning control: 177e.) and leaving `warnings' to + ‘None’. + + Changed in version 3.2: Added the ‘warnings’ argument. + + Changed in version 3.2: The default stream is set to *note + sys.stderr: 581. at instantiation time rather than import time. + + Changed in version 3.5: Added the tb_locals parameter. + + -- Method: _makeResult () + + This method returns the instance of ‘TestResult’ used by *note + run(): 38b0. It is not intended to be called directly, but + can be overridden in subclasses to provide a custom + ‘TestResult’. + + ‘_makeResult()’ instantiates the class or callable passed in + the ‘TextTestRunner’ constructor as the ‘resultclass’ + argument. It defaults to *note TextTestResult: 125a. if no + ‘resultclass’ is provided. The result class is instantiated + with the following arguments: + + stream, descriptions, verbosity + + -- Method: run (test) + + This method is the main public interface to the + ‘TextTestRunner’. This method takes a *note TestSuite: a75. + or *note TestCase: 282. instance. A *note TestResult: e1b. is + created by calling *note _makeResult(): 38af. and the test(s) + are run and the results printed to stdout. + + -- 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: + + if __name__ == '__main__': + unittest.main() + + You can run tests with more detailed information by passing in the + verbosity argument: + + if __name__ == '__main__': + unittest.main(verbosity=2) + + 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 ‘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 + ‘None’, the values of *note sys.argv: f1f. are used. + + The `testRunner' argument can either be a test runner class or an + already created instance of it. By default ‘main’ calls *note + sys.exit(): fec. with an exit code indicating success or failure of + the tests run. + + The `testLoader' argument has to be a *note TestLoader: 2d7. + instance, and defaults to *note defaultTestLoader: 3898. + + ‘main’ supports being used from the interactive interpreter by + passing in the argument ‘exit=False’. This displays the result on + standard output without calling *note sys.exit(): fec.: + + >>> from unittest import main + >>> main(module='test_module', exit=False) + + The `failfast', `catchbreak' and `buffer' parameters have the same + effect as the same-name *note command-line options: 385e. + + The `warnings' argument specifies the *note warning filter: 504. + that should be used while running the tests. If it’s not + specified, it will remain ‘None’ if a ‘-W’ option is passed to + ‘python’ (see *note Warning control: 177e.), otherwise it will be + set to ‘'default'’. + + Calling ‘main’ actually returns an instance of the ‘TestProgram’ + class. This stores the result of the tests run as the ‘result’ + attribute. + + 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. + +* Menu: + +* load_tests Protocol:: + + +File: python.info, Node: load_tests Protocol, Up: Loading and running tests + +5.26.8.14 load_tests Protocol +............................. + +New 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 +‘load_tests’. + +If a test module defines ‘load_tests’ it will be called by *note +TestLoader.loadTestsFromModule(): 2d8. with the following arguments: + + load_tests(loader, standard_tests, pattern) + +where `pattern' is passed straight through from ‘loadTestsFromModule’. +It defaults to ‘None’. + +It should return a *note TestSuite: a75. + +`loader' is the instance of *note TestLoader: 2d7. 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 ‘load_tests’ function that loads tests from a specific set of +*note TestCase: 282. classes may look like: + + 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 + +If discovery is started in a directory containing a package, either from +the command line or by calling *note TestLoader.discover(): c87, then +the package ‘__init__.py’ will be checked for ‘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 ‘load_tests’ which is called with the +following arguments: + + load_tests(loader, standard_tests, pattern) + +This should return a *note TestSuite: a75. representing all the tests +from the package. (‘standard_tests’ will only contain tests collected +from ‘__init__.py’.) + +Because the pattern is passed into ‘load_tests’ the package is free to +continue (and potentially modify) test discovery. A ‘do nothing’ +‘load_tests’ function for a test package would look like: + + 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 + +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. + + +File: python.info, Node: Class and Module Fixtures, Next: Signal Handling, Prev: Classes and functions, Up: unittest — Unit testing framework + +5.26.8.15 Class and Module Fixtures +................................... + +Class and module level fixtures are implemented in *note TestSuite: a75. +When the test suite encounters a test from a new class then +‘tearDownClass()’ from the previous class (if there is one) is called, +followed by ‘setUpClass()’ from the new class. + +Similarly if a test is from a different module from the previous test +then ‘tearDownModule’ from the previous module is run, followed by +‘setUpModule’ from the new module. + +After all the tests have run the final ‘tearDownClass’ and +‘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 ‘setUpClass’ / ‘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 ‘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 ‘_ErrorHolder’ object (that has the same +interface as a *note TestCase: 282.) 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:: + + +File: python.info, Node: setUpClass and tearDownClass, Next: setUpModule and tearDownModule, Up: Class and Module Fixtures + +5.26.8.16 setUpClass and tearDownClass +...................................... + +These must be implemented as class methods: + + import unittest + + class Test(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls._connection = createExpensiveConnectionObject() + + @classmethod + def tearDownClass(cls): + cls._connection.destroy() + +If you want the ‘setUpClass’ and ‘tearDownClass’ on base classes called +then you must call up to them yourself. The implementations in *note +TestCase: 282. are empty. + +If an exception is raised during a ‘setUpClass’ then the tests in the +class are not run and the ‘tearDownClass’ is not run. Skipped classes +will not have ‘setUpClass’ or ‘tearDownClass’ run. If the exception is +a *note SkipTest: c86. exception then the class will be reported as +having been skipped instead of as an error. + + +File: python.info, Node: setUpModule and tearDownModule, Prev: setUpClass and tearDownClass, Up: Class and Module Fixtures + +5.26.8.17 setUpModule and tearDownModule +........................................ + +These should be implemented as functions: + + def setUpModule(): + createConnection() + + def tearDownModule(): + closeConnection() + +If an exception is raised in a ‘setUpModule’ then none of the tests in +the module will be run and the ‘tearDownModule’ will not be run. If the +exception is a *note SkipTest: c86. 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 ‘addModuleCleanup’: + + -- Function: unittest.addModuleCleanup (function, /, *args, **kwargs) + + Add a function to be called after ‘tearDownModule()’ to cleanup + resources used during the test class. Functions will be called in + reverse order to the order they are added (LIFO). They are called + with any arguments and keyword arguments passed into *note + addModuleCleanup(): 69c. when they are added. + + If ‘setUpModule()’ fails, meaning that ‘tearDownModule()’ is not + called, then any cleanup functions added will still be called. + + New in version 3.8. + + -- Method: classmethod unittest.enterModuleContext (cm) + + Enter the supplied *note context manager: 1a0. If successful, also + add its *note __exit__(): 1978. method as a cleanup function by + *note addModuleCleanup(): 69c. and return the result of the *note + __enter__(): 18e. method. + + New in version 3.11. + + -- Function: unittest.doModuleCleanups () + + This function is called unconditionally after ‘tearDownModule()’, + or after ‘setUpModule()’ if ‘setUpModule()’ raises an exception. + + It is responsible for calling all the cleanup functions added by + *note addModuleCleanup(): 69c. If you need cleanup functions to be + called `prior' to ‘tearDownModule()’ then you can call *note + doModuleCleanups(): 122f. yourself. + + *note doModuleCleanups(): 122f. pops methods off the stack of + cleanup functions one at a time, so it can be called at any time. + + New in version 3.8. + + +File: python.info, Node: Signal Handling, Prev: Class and Module Fixtures, Up: unittest — Unit testing framework + +5.26.8.18 Signal Handling +......................... + +New in version 3.2. + +The *note -c/–catch: fce. command-line option to unittest, along with +the ‘catchbreak’ parameter to *note unittest.main(): c85, 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 *note KeyboardInterrupt: 611. in +the usual way. + +The control-c handling signal handler attempts to remain compatible with +code or tests that install their own *note signal.SIGINT: 43b. handler. +If the ‘unittest’ handler is called but `isn’t' the installed *note +signal.SIGINT: 43b. 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 +‘unittest’ control-c handling disabled the *note removeHandler(): fcf. +decorator can be used. + +There are a few utility functions for framework authors to enable +control-c handling functionality within test frameworks. + + -- Function: unittest.installHandler () + + Install the control-c handler. When a *note signal.SIGINT: 43b. is + received (usually in response to the user pressing control-c) all + registered results have *note stop(): 38a3. called. + + -- Function: unittest.registerResult (result) + + Register a *note TestResult: e1b. 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 *note TestResult: e1b. 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. + + -- Function: unittest.removeResult (result) + + Remove a registered result. Once a result has been removed then + *note stop(): 38a3. will no longer be called on that result object + in response to a control-c. + + -- 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: + + @unittest.removeHandler + def test_signal_handling(self): + ... + + +File: python.info, Node: unittest mock — mock object library, Next: unittest mock — getting started, Prev: unittest — Unit testing framework, Up: Development Tools + +5.26.9 ‘unittest.mock’ — mock object library +-------------------------------------------- + +New in version 3.3. + +`Source code:' Lib/unittest/mock.py(1) + +__________________________________________________________________ + +*note unittest.mock: 126. 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. + +*note unittest.mock: 126. provides a core *note Mock: 69b. 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 *note patch(): b1e. decorator that handles +patching module and class level attributes within the scope of a test, +along with *note sentinel: 802. for creating unique objects. See the +*note quick guide: 38b8. for some examples of how to use *note Mock: +69b, *note MagicMock: b1d. and *note patch(): b1e. + +Mock is designed for use with *note unittest: 125. and is based on the +‘action -> assertion’ pattern instead of ‘record -> replay’ used by many +mocking frameworks. + +There is a backport of *note unittest.mock: 126. for earlier versions of +Python, available as mock on PyPI(2). + +* Menu: + +* Quick Guide:: +* The Mock Class:: +* The patchers:: +* MagicMock and magic method support:: +* Helpers:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/unittest/mock.py + + (2) https://pypi.org/project/mock + + +File: python.info, Node: Quick Guide, Next: The Mock Class, Up: unittest mock — mock object library + +5.26.9.1 Quick Guide +.................... + +*note Mock: 69b. and *note MagicMock: b1d. 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: + + >>> 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') + +‘side_effect’ allows you to perform side effects, including raising an +exception when a mock is called: + + >>> mock = Mock(side_effect=KeyError('foo')) + >>> mock() + Traceback (most recent call last): + ... + KeyError: 'foo' + + >>> 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) + +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 *note +AttributeError: 19d. + +The *note patch(): b1e. 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: + + >>> 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() + + 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 ‘module.ClassName1’ + is passed in first. + + With *note patch(): b1e. it matters that you patch objects in the + namespace where they are looked up. This is normally + straightforward, but for a quick guide read *note where to patch: + 38b9. + +As well as a decorator *note patch(): b1e. can be used as a context +manager in a with statement: + + >>> 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) + +There is also *note patch.dict(): 1423. for setting values in a +dictionary just during a scope and restoring the dictionary to its +original state when the test ends: + + >>> foo = {'key': 'value'} + >>> original = foo.copy() + >>> with patch.dict(foo, {'newkey': 'newvalue'}, clear=True): + ... assert foo == {'newkey': 'newvalue'} + ... + >>> assert foo == original + +Mock supports the mocking of Python *note magic methods: 38ba. The +easiest way of using magic methods is with the *note MagicMock: b1d. +class. It allows you to do things like: + + >>> mock = MagicMock() + >>> mock.__str__.return_value = 'foobarbaz' + >>> str(mock) + 'foobarbaz' + >>> mock.__str__.assert_called_with() + +Mock allows you to assign functions (or other Mock instances) to magic +methods and they will be called appropriately. The *note MagicMock: +b1d. 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: + + >>> mock = Mock() + >>> mock.__str__ = Mock(return_value='wheeeeee') + >>> str(mock) + 'wheeeeee' + +For ensuring that the mock objects in your tests have the same api as +the objects they are replacing, you can use *note auto-speccing: 38bb. +Auto-speccing can be done through the `autospec' argument to patch, or +the *note create_autospec(): 13b1. 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: + + >>> 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: <lambda>() takes exactly 3 arguments (1 given) + +*note create_autospec(): 13b1. can also be used on classes, where it +copies the signature of the ‘__init__’ method, and on callable objects +where it copies the signature of the ‘__call__’ method. + + +File: python.info, Node: The Mock Class, Next: The patchers, Prev: Quick Guide, Up: unittest mock — mock object library + +5.26.9.2 The Mock Class +....................... + +*note Mock: 69b. 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 (1). 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. + +*note MagicMock: b1d. is a subclass of *note Mock: 69b. 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: +*note NonCallableMock: 38bd. and *note NonCallableMagicMock: 38be. + +The *note patch(): b1e. decorators makes it easy to temporarily replace +classes in a particular module with a *note Mock: 69b. object. By +default *note patch(): b1e. will create a *note MagicMock: b1d. for you. +You can specify an alternative class of *note Mock: 69b. using the +`new_callable' argument to *note patch(): b1e. + + -- 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 *note Mock: 69b. object. *note Mock: 69b. takes + several optional arguments that specify the behaviour of the Mock + object: + + * `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 *note AttributeError: + 19d. + + If `spec' is an object (rather than a list of strings) then + *note __class__: 1104. returns the class of the spec object. + This allows mocks to pass *note isinstance(): 3ab. tests. + + * `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 *note + AttributeError: 19d. + + * `side_effect': A function to be called whenever the Mock is + called. See the *note side_effect: 38bf. 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 *note DEFAULT: 38c0, 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 ‘None’. + + * `return_value': The value returned when the mock is called. + By default this is a new Mock (created on first access). See + the *note return_value: 38c1. attribute. + + * `unsafe': By default, accessing any attribute whose name + starts with `assert', `assret', `asert', `aseert' or `assrt' + will raise an *note AttributeError: 19d. Passing + ‘unsafe=True’ will allow access to these attributes. + + New in version 3.5. + + * `wraps': Item for the mock object to wrap. If `wraps' is not + ‘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 *note + AttributeError: 19d.). + + 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. + + * `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. + + 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 *note configure_mock(): 38c2. method for details. + + -- Method: assert_called () + + Assert that the mock was called at least once. + + >>> mock = Mock() + >>> mock.method() + <Mock name='mock.method()' id='...'> + >>> mock.method.assert_called() + + New in version 3.6. + + -- Method: assert_called_once () + + Assert that the mock was called exactly once. + + >>> 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. + + New in version 3.6. + + -- 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: + + >>> mock = Mock() + >>> mock.method(1, 2, 3, test='wow') + <Mock name='mock.method()' id='...'> + >>> mock.method.assert_called_with(1, 2, 3, test='wow') + + -- Method: assert_called_once_with (*args, **kwargs) + + Assert that the mock was called exactly once and that call was + with the specified arguments. + + >>> 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. + + -- 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 + *note assert_called_with(): 1452. and *note + assert_called_once_with(): 38c3. that only pass if the call is + the most recent one, and in the case of *note + assert_called_once_with(): 38c3. it must also be the only + call. + + >>> mock = Mock(return_value=None) + >>> mock(1, 2, arg='thing') + >>> mock('some', 'thing', 'else') + >>> mock.assert_any_call(1, 2, arg='thing') + + -- Method: assert_has_calls (calls, any_order=False) + + assert the mock has been called with the specified calls. The + *note mock_calls: 38c6. 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 *note mock_calls: 38c6. + + >>> 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) + + -- Method: assert_not_called () + + Assert the mock was never called. + + >>> 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. + + New in version 3.5. + + -- Method: reset_mock (*, return_value=False, side_effect=False) + + The reset_mock method resets all the call attributes on a mock + object: + + >>> mock = Mock(return_value=None) + >>> mock('hello') + >>> mock.called + True + >>> mock.reset_mock() + >>> mock.called + False + + Changed in version 3.6: Added two keyword only argument to the + reset_mock function. + + This can be useful where you want to make a series of + assertions that reuse the same object. Note that *note + reset_mock(): 969. `doesn’t' clear the return value, *note + side_effect: 38bf. or any child attributes you have set using + normal assignment by default. In case you want to reset + `return_value' or *note side_effect: 38bf, then pass the + corresponding parameter as ‘True’. Child mocks and the return + value mock (if any) are reset as well. + + Note: `return_value', and *note side_effect: 38bf. are + keyword only argument. + + -- 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. + + -- 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 *note method_calls: 38c9. and *note mock_calls: 38c6. + attributes of this one. + + -- 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: + + >>> 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 + + The same thing can be achieved in the constructor call to + mocks: + + >>> 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 + + *note configure_mock(): 38c2. exists to make it easier to do + configuration after the mock has been created. + + -- Method: __dir__ () + + *note Mock: 69b. objects limit the results of ‘dir(some_mock)’ + to useful results. For mocks with a `spec' this includes all + the permitted attributes for the mock. + + See *note FILTER_DIR: 38cb. for what this filtering does, and + how to switch it off. + + -- 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). + + -- Attribute: called + + A boolean representing whether or not the mock object has been + called: + + >>> mock = Mock(return_value=None) + >>> mock.called + False + >>> mock() + >>> mock.called + True + + -- Attribute: call_count + + An integer telling you how many times the mock object has been + called: + + >>> mock = Mock(return_value=None) + >>> mock.call_count + 0 + >>> mock() + >>> mock() + >>> mock.call_count + 2 + + -- Attribute: return_value + + Set this to configure the value returned by calling the mock: + + >>> mock = Mock() + >>> mock.return_value = 'fish' + >>> mock() + 'fish' + + The default return value is a mock object and you can + configure it in the normal way: + + >>> mock = Mock() + >>> mock.return_value.attribute = sentinel.Attribute + >>> mock.return_value() + <Mock name='mock()()' id='...'> + >>> mock.return_value.assert_called_with() + + *note return_value: 38c1. can also be set in the constructor: + + >>> mock = Mock(return_value=3) + >>> mock.return_value + 3 + >>> mock() + 3 + + -- 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 + *note DEFAULT: 38c0. singleton the call to the mock will then + return whatever the function returns. If the function returns + *note DEFAULT: 38c0. then the mock will return its normal + value (from the *note return_value: 38c1.). + + 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 (*note DEFAULT: 38c0. + handling is identical to the function case). + + An example of a mock that raises an exception (to test + exception handling of an API): + + >>> mock = Mock() + >>> mock.side_effect = Exception('Boom!') + >>> mock() + Traceback (most recent call last): + ... + Exception: Boom! + + Using *note side_effect: 38bf. to return a sequence of values: + + >>> mock = Mock() + >>> mock.side_effect = [3, 2, 1] + >>> mock(), mock(), mock() + (3, 2, 1) + + Using a callable: + + >>> mock = Mock(return_value=3) + >>> def side_effect(*args, **kwargs): + ... return DEFAULT + ... + >>> mock.side_effect = side_effect + >>> mock() + 3 + + *note side_effect: 38bf. can be set in the constructor. + Here’s an example that adds one to the value the mock is + called with and returns it: + + >>> side_effect = lambda value: value + 1 + >>> mock = Mock(side_effect=side_effect) + >>> mock(3) + 4 + >>> mock(-8) + -7 + + Setting *note side_effect: 38bf. to ‘None’ clears it: + + >>> m = Mock(side_effect=KeyError, return_value=3) + >>> m() + Traceback (most recent call last): + ... + KeyError + >>> m.side_effect = None + >>> m() + 3 + + -- Attribute: call_args + + This is either ‘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 ‘args’ property, is any ordered arguments + the mock was called with (or an empty tuple) and the second + member, which can also be accessed through the ‘kwargs’ + property, is any keyword arguments (or an empty dictionary). + + >>> 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!'} + + *note call_args: 1399, along with members of the lists *note + call_args_list: 38cf, *note method_calls: 38c9. and *note + mock_calls: 38c6. are *note call: 13ec. objects. These are + tuples, so they can be unpacked to get at the individual + arguments and make more complex assertions. See *note calls + as tuples: 38d0. + + Changed in version 3.8: Added ‘args’ and ‘kwargs’ properties. + + -- 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 *note call: 13ec. object can be used for + conveniently constructing lists of calls to compare with *note + call_args_list: 38cf. + + >>> 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 + + Members of *note call_args_list: 38cf. are *note call: 13ec. + objects. These can be unpacked as tuples to get at the + individual arguments. See *note calls as tuples: 38d0. + + -- Attribute: method_calls + + As well as tracking calls to themselves, mocks also track + calls to methods and attributes, and `their' methods and + attributes: + + >>> 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()] + + Members of *note method_calls: 38c9. are *note call: 13ec. + objects. These can be unpacked as tuples to get at the + individual arguments. See *note calls as tuples: 38d0. + + -- Attribute: mock_calls + + *note mock_calls: 38c6. records `all' calls to the mock + object, its methods, magic methods `and' return value mocks. + + >>> 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 + + Members of *note mock_calls: 38c6. are *note call: 13ec. + objects. These can be unpacked as tuples to get at the + individual arguments. See *note calls as tuples: 38d0. + + Note: The way *note mock_calls: 38c6. are recorded means + that where nested calls are made, the parameters of + ancestor calls are not recorded and so will always + compare equal: + + >>> 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 + + -- Attribute: __class__ + + Normally the *note __class__: 38d1. attribute of an object + will return its type. For a mock object with a ‘spec’, + ‘__class__’ returns the spec class instead. This allows mock + objects to pass *note isinstance(): 3ab. tests for the object + they are replacing / masquerading as: + + >>> mock = Mock(spec=3) + >>> isinstance(mock, int) + True + + *note __class__: 38d1. is assignable to, this allows a mock to + pass an *note isinstance(): 3ab. check without forcing you to + use a spec: + + >>> mock = Mock() + >>> mock.__class__ = dict + >>> isinstance(mock, dict) + True + + -- Class: unittest.mock.NonCallableMock (spec=None, wraps=None, + name=None, spec_set=None, **kwargs) + + A non-callable version of *note Mock: 69b. The constructor + parameters have the same meaning of *note Mock: 69b, with the + exception of `return_value' and `side_effect' which have no meaning + on a non-callable mock. + +Mock objects that use a class or an instance as a ‘spec’ or ‘spec_set’ +are able to pass *note isinstance(): 3ab. tests: + + >>> mock = Mock(spec=SomeClass) + >>> isinstance(mock, SomeClass) + True + >>> mock = Mock(spec_set=SomeClass()) + >>> isinstance(mock, SomeClass) + True + +The *note Mock: 69b. classes have support for mocking magic methods. +See *note magic methods: 38ba. for the full details. + +The mock classes and the *note patch(): b1e. decorators all take +arbitrary keyword arguments for configuration. For the *note patch(): +b1e. decorators the keywords are passed to the constructor of the mock +being created. The keyword arguments are for configuring attributes of +the mock: + + >>> m = MagicMock(attribute=3, other='fish') + >>> m.attribute + 3 + >>> m.other + 'fish' + +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 ‘**’: + + >>> 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 + +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: + + >>> 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) + +This applies to *note assert_called_with(): 1452, *note +assert_called_once_with(): 38c3, *note assert_has_calls(): 38c5. and +*note assert_any_call(): 38c4. When *note Autospeccing: 38bb, 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. + + -- Class: unittest.mock.PropertyMock (*args, **kwargs) + + A mock intended to be used as a property, or other descriptor, on a + class. *note PropertyMock: 38d2. provides ‘__get__()’ and + ‘__set__()’ methods so you can specify a return value when it is + fetched. + + Fetching a *note PropertyMock: 38d2. instance from an object calls + the mock, with no args. Setting it calls the mock with the value + being set. + + >>> 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)] + +Because of the way mock attributes are stored you can’t directly attach +a *note PropertyMock: 38d2. to a mock object. Instead you can attach it +to the mock type object: + + >>> m = MagicMock() + >>> p = PropertyMock(return_value=3) + >>> type(m).foo = p + >>> m.foo + 3 + >>> p.assert_called_once_with() + + -- 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 *note MagicMock: b1d. The *note + AsyncMock: 69a. object will behave so the object is recognized as + an async function, and the result of a call is an awaitable. + + >>> mock = AsyncMock() + >>> asyncio.iscoroutinefunction(mock) + True + >>> inspect.isawaitable(mock()) + True + + The result of ‘mock()’ is an async function which will have the + outcome of ‘side_effect’ or ‘return_value’ after it has been + awaited: + + - if ‘side_effect’ is a function, the async function will return + the result of that function, + + - if ‘side_effect’ is an exception, the async function will + raise the exception, + + - if ‘side_effect’ is an iterable, the async function will + return the next value of the iterable, however, if the + sequence of result is exhausted, ‘StopAsyncIteration’ is + raised immediately, + + - if ‘side_effect’ is not defined, the async function will + return the value defined by ‘return_value’, hence, by default, + the async function returns a new *note AsyncMock: 69a. object. + + Setting the `spec' of a *note Mock: 69b. or *note MagicMock: b1d. + to an async function will result in a coroutine object being + returned after calling. + + >>> async def async_func(): pass + ... + >>> mock = MagicMock(async_func) + >>> mock + <MagicMock spec='function' id='...'> + >>> mock() + <coroutine object AsyncMockMixin._mock_call at ...> + + Setting the `spec' of a *note Mock: 69b, *note MagicMock: b1d, or + *note AsyncMock: 69a. to a class with asynchronous and synchronous + functions will automatically detect the synchronous functions and + set them as *note MagicMock: b1d. (if the parent mock is *note + AsyncMock: 69a. or *note MagicMock: b1d.) or *note Mock: 69b. (if + the parent mock is *note Mock: 69b.). All asynchronous functions + will be *note AsyncMock: 69a. + + >>> 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='...'> + + New in version 3.8. + + -- Method: assert_awaited () + + Assert that the mock was awaited at least once. Note that + this is separate from the object having been called, the + ‘await’ keyword must be used: + + >>> 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() + + -- Method: assert_awaited_once () + + Assert that the mock was awaited exactly once. + + >>> mock = AsyncMock() + >>> async def main(): + ... await mock() + ... + >>> asyncio.run(main()) + >>> mock.assert_awaited_once() + >>> asyncio.run(main()) + >>> mock.method.assert_awaited_once() + Traceback (most recent call last): + ... + AssertionError: Expected mock to have been awaited once. Awaited 2 times. + + -- Method: assert_awaited_with (*args, **kwargs) + + Assert that the last await was with the specified arguments. + + >>> 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 call not found. + Expected: mock('other') + Actual: mock('foo', bar='bar') + + -- Method: assert_awaited_once_with (*args, **kwargs) + + Assert that the mock was awaited exactly once and with the + specified arguments. + + >>> 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. + + -- Method: assert_any_await (*args, **kwargs) + + Assert the mock has ever been awaited with the specified + arguments. + + >>> 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 + + -- Method: assert_has_awaits (calls, any_order=False) + + Assert the mock has been awaited with the specified calls. + The *note await_args_list: 1398. 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 *note await_args_list: 1398. + + >>> 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) + + -- Method: assert_not_awaited () + + Assert that the mock was never awaited. + + >>> mock = AsyncMock() + >>> mock.assert_not_awaited() + + -- Method: reset_mock (*args, **kwargs) + + See *note Mock.reset_mock(): 969. Also sets *note + await_count: 38db. to 0, *note await_args: 38dc. to None, and + clears the *note await_args_list: 1398. + + -- Attribute: await_count + + An integer keeping track of how many times the mock object has + been awaited. + + >>> mock = AsyncMock() + >>> async def main(): + ... await mock() + ... + >>> asyncio.run(main()) + >>> mock.await_count + 1 + >>> asyncio.run(main()) + >>> mock.await_count + 2 + + -- Attribute: await_args + + This is either ‘None’ (if the mock hasn’t been awaited), or + the arguments that the mock was last awaited with. Functions + the same as *note Mock.call_args: 1399. + + >>> 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') + + -- 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. + + >>> 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')] + +* Menu: + +* Calling:: +* Deleting Attributes:: +* Mock names and the name attribute:: +* Attaching Mocks as Attributes:: + + ---------- Footnotes ---------- + + (1) 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 *note AttributeError: 19d. 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 *note magic methods: 38ba. + + +File: python.info, Node: Calling, Next: Deleting Attributes, Up: The Mock Class + +5.26.9.3 Calling +................ + +Mock objects are callable. The call will return the value set as the +*note return_value: 38c1. 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 *note +call_args: 1399. and *note call_args_list: 38cf. + +If *note side_effect: 38bf. is set then it will be called after the call +has been recorded, so if ‘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 *note side_effect: 38bf. an exception class or instance: + + >>> 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')] + +If ‘side_effect’ is a function then whatever that function returns is +what calls to the mock return. The ‘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: + + >>> 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)] + +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 ‘mock.return_value’ from inside ‘side_effect’, or return +*note DEFAULT: 38c0.: + + >>> 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 + +To remove a ‘side_effect’, and return to the default behaviour, set the +‘side_effect’ to ‘None’: + + >>> 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 + +The ‘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 *note StopIteration: 865. is raised): + + >>> m = MagicMock(side_effect=[1, 2, 3]) + >>> m() + 1 + >>> m() + 2 + >>> m() + 3 + >>> m() + Traceback (most recent call last): + ... + StopIteration + +If any members of the iterable are exceptions they will be raised +instead of returned: + + >>> iterable = (33, ValueError, 66) + >>> m = MagicMock(side_effect=iterable) + >>> m() + 33 + >>> m() + Traceback (most recent call last): + ... + ValueError + >>> m() + 66 + + +File: python.info, Node: Deleting Attributes, Next: Mock names and the name attribute, Prev: Calling, Up: The Mock Class + +5.26.9.4 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 ‘False’ to a *note hasattr(): 836. +call, or raise an *note AttributeError: 19d. when an attribute is +fetched. You can do this by providing an object as a ‘spec’ for a mock, +but that isn’t always convenient. + +You “block” attributes by deleting them. Once deleted, accessing an +attribute will raise an *note AttributeError: 19d. + + >>> 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 + + +File: python.info, Node: Mock names and the name attribute, Next: Attaching Mocks as Attributes, Prev: Deleting Attributes, Up: The Mock Class + +5.26.9.5 Mock names and the name attribute +.......................................... + +Since “name” is an argument to the *note Mock: 69b. 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 +*note configure_mock(): 38c2.: + + >>> mock = MagicMock() + >>> mock.configure_mock(name='my_name') + >>> mock.name + 'my_name' + +A simpler option is to simply set the “name” attribute after mock +creation: + + >>> mock = MagicMock() + >>> mock.name = "foo" + + +File: python.info, Node: Attaching Mocks as Attributes, Prev: Mock names and the name attribute, Up: The Mock Class + +5.26.9.6 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 *note method_calls: 38c9. and *note mock_calls: 38c6. +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: + + >>> 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)] + +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. + + >>> 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 + [] + +Mocks created for you by *note patch(): b1e. are automatically given +names. To attach mocks that have names to a parent you use the *note +attach_mock(): 38c8. method: + + >>> 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')] + + +File: python.info, Node: The patchers, Next: MagicMock and magic method support, Prev: The Mock Class, Up: unittest mock — mock object library + +5.26.9.7 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:: + + +File: python.info, Node: patch, Next: patch object, Up: The patchers + +5.26.9.8 patch +.............. + + Note: The key is to do the patching in the right namespace. See + the section *note where to patch: 38e4. + + -- Function: unittest.mock.patch (target, new=DEFAULT, spec=None, + create=False, spec_set=None, autospec=None, new_callable=None, + **kwargs) + + *note patch(): b1e. 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 *note + AsyncMock: 69a. if the patched object is an async function or a + *note MagicMock: b1d. otherwise. If *note patch(): b1e. is used as + a decorator and `new' is omitted, the created mock is passed in as + an extra argument to the decorated function. If *note patch(): + b1e. is used as a context manager the created mock is returned by + the context manager. + + `target' should be a string in the form + ‘'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 *note + patch(): b1e. 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 *note + MagicMock: b1d. if patch is creating one for you. + + In addition you can pass ‘spec=True’ or ‘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 + *note AsyncMock: 69a. is used for async functions and *note + MagicMock: b1d. for the rest. + + A more powerful form of `spec' is `autospec'. If you set + ‘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 *note TypeError: 19c. 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 *note create_autospec(): 13b1. function and *note + Autospeccing: 38bb. + + Instead of ‘autospec=True’ you can pass ‘autospec=some_object’ to + use an arbitrary object as the spec instead of the one being + replaced. + + By default *note patch(): b1e. will fail to replace attributes that + don’t exist. If you pass in ‘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! + + Note: + Changed in version 3.5: If you are patching builtins in a + module then you don’t need to pass ‘create=True’, it will be + added by default. + + Patch can be used as a ‘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. *note patch(): b1e. finds tests by looking for method names + that start with ‘patch.TEST_PREFIX’. By default this is ‘'test'’, + which matches the way *note unittest: 125. finds tests. You can + specify an alternative prefix by setting ‘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 *note patch(): b1e. is + creating a mock object for you. + + *note patch(): b1e. takes arbitrary keyword arguments. These will + be passed to *note AsyncMock: 69a. if the patched object is + asynchronous, to *note MagicMock: b1d. otherwise or to + `new_callable' if specified. + + ‘patch.dict(...)’, ‘patch.multiple(...)’ and ‘patch.object(...)’ + are available for alternate use-cases. + +*note patch(): b1e. as function decorator, creating the mock for you and +passing it into the decorated function: + + >>> @patch('__main__.SomeClass') + ... def function(normal_argument, mock_class): + ... print(mock_class is SomeClass) + ... + >>> function(None) + True + +Patching a class replaces the class with a *note MagicMock: b1d. +`instance'. If the class is instantiated in the code under test then it +will be the *note return_value: 38c1. of the mock that will be used. + +If the class is instantiated multiple times you could use *note +side_effect: 38bf. 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 ‘return_value’. For 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' + ... + +If you use `spec' or `spec_set' and *note patch(): b1e. is replacing a +`class', then the return value of the created mock will have the same +spec. + + >>> Original = Class + >>> patcher = patch('__main__.Class', spec=True) + >>> MockClass = patcher.start() + >>> instance = MockClass() + >>> assert isinstance(instance, Original) + >>> patcher.stop() + +The `new_callable' argument is useful where you want to use an +alternative class to the default *note MagicMock: b1d. for the created +mock. For example, if you wanted a *note NonCallableMock: 38bd. to be +used: + + >>> 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 + +Another use case might be to replace an object with an *note +io.StringIO: bbe. instance: + + >>> 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() + +When *note patch(): b1e. 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: + + >>> patcher = patch('__main__.thing', first='one', second='two') + >>> mock_thing = patcher.start() + >>> mock_thing.first + 'one' + >>> mock_thing.second + 'two' + +As well as attributes on the created mock attributes, like the *note +return_value: 38c1. and *note side_effect: 38bf, 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 *note patch(): b1e. call using ‘**’: + + >>> 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 + +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 *note +AttributeError: 19d.: + + >>> @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' + +but adding ‘create=True’ in the call to *note patch(): b1e. will make +the previous example work as expected: + + >>> @patch('sys.non_existing_attribute', 42, create=True) + ... def test(mock_stdout): + ... assert sys.non_existing_attribute == 42 + ... + >>> test() + +Changed in version 3.8: *note patch(): b1e. now returns an *note +AsyncMock: 69a. if the target is an async function. + + +File: python.info, Node: patch object, Next: patch dict, Prev: patch, Up: The patchers + +5.26.9.9 patch.object +..................... + + -- 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. + + *note patch.object(): 13d7. 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 *note patch(): b1e. Like *note patch(): b1e, *note + patch.object(): 13d7. takes arbitrary keyword arguments for + configuring the mock object it creates. + + When used as a class decorator *note patch.object(): 13d7. honours + ‘patch.TEST_PREFIX’ for choosing which methods to wrap. + +You can either call *note patch.object(): 13d7. 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: + + >>> @patch.object(SomeClass, 'class_method') + ... def test(mock_method): + ... SomeClass.class_method(3) + ... mock_method.assert_called_with(3) + ... + >>> test() + +`spec', `create' and the other arguments to *note patch.object(): 13d7. +have the same meaning as they do for *note patch(): b1e. + + +File: python.info, Node: patch dict, Next: patch multiple, Prev: patch object, Up: The patchers + +5.26.9.10 patch.dict +.................... + + -- 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. + + `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 ‘(key, value)’ pairs. + + If `clear' is true then the dictionary will be cleared before the + new values are set. + + *note patch.dict(): 1423. can also be called with arbitrary keyword + arguments to set values in the dictionary. + + Changed in version 3.8: *note patch.dict(): 1423. now returns the + patched dictionary when used as a context manager. + +*note patch.dict(): 1423. can be used as a context manager, decorator or +class decorator: + + >>> foo = {} + >>> @patch.dict(foo, {'newkey': 'newvalue'}) + ... def test(): + ... assert foo == {'newkey': 'newvalue'} + >>> test() + >>> assert foo == {} + +When used as a class decorator *note patch.dict(): 1423. honours +‘patch.TEST_PREFIX’ (default to ‘'test'’) for choosing which methods to +wrap: + + >>> 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') + +If you want to use a different prefix for your test, you can inform the +patchers of the different prefix by setting ‘patch.TEST_PREFIX’. For +more details about how to change the value of see *note TEST_PREFIX: +38e7. + +*note patch.dict(): 1423. 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. + + >>> 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 == {} + + >>> import os + >>> with patch.dict('os.environ', {'newkey': 'newvalue'}): + ... print(os.environ['newkey']) + ... + newvalue + >>> assert 'newkey' not in os.environ + +Keywords can be used in the *note patch.dict(): 1423. call to set values +in the dictionary: + + >>> mymodule = MagicMock() + >>> mymodule.function.return_value = 'fish' + >>> with patch.dict('sys.modules', mymodule=mymodule): + ... import mymodule + ... mymodule.function('some', 'args') + ... + 'fish' + +*note patch.dict(): 1423. 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 ‘__getitem__()’, ‘__setitem__()’, +‘__delitem__()’ and either ‘__iter__()’ or ‘__contains__()’. + + >>> 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'] + + +File: python.info, Node: patch multiple, Next: patch methods start and stop, Prev: patch dict, Up: The patchers + +5.26.9.11 patch.multiple +........................ + + -- 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: + + with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'): + ... + + Use *note DEFAULT: 38c0. as the value if you want *note + patch.multiple(): 38e9. 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 *note patch.multiple(): 38e9. is used + as a context manager. + + *note patch.multiple(): 38e9. 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 *note patch(): b1e. These arguments will be applied to `all' + patches done by *note patch.multiple(): 38e9. + + When used as a class decorator *note patch.multiple(): 38e9. + honours ‘patch.TEST_PREFIX’ for choosing which methods to wrap. + +If you want *note patch.multiple(): 38e9. to create mocks for you, then +you can use *note DEFAULT: 38c0. as the value. If you use *note +patch.multiple(): 38e9. as a decorator then the created mocks are passed +into the decorated function by keyword. + + >>> 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() + +*note patch.multiple(): 38e9. can be nested with other ‘patch’ +decorators, but put arguments passed by keyword `after' any of the +standard arguments created by *note patch(): b1e.: + + >>> @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() + +If *note patch.multiple(): 38e9. is used as a context manager, the value +returned by the context manager is a dictionary where created mocks are +keyed by name: + + >>> 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 + ... + + +File: python.info, Node: patch methods start and stop, Next: patch builtins, Prev: patch multiple, Up: The patchers + +5.26.9.12 patch methods: start and stop +....................................... + +All the patchers have ‘start()’ and ‘stop()’ methods. These make it +simpler to do patching in ‘setUp’ methods or where you want to do +multiple patches without nesting decorators or with statements. + +To use them call *note patch(): b1e, *note patch.object(): 13d7. or +*note patch.dict(): 1423. as normal and keep a reference to the returned +‘patcher’ object. You can then call ‘start()’ to put the patch in place +and ‘stop()’ to undo it. + +If you are using *note patch(): b1e. to create a mock for you then it +will be returned by the call to ‘patcher.start’. + + >>> 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 + +A typical use case for this might be for doing multiple patches in the +‘setUp’ method of a ‘TestCase’: + + >>> 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() + + Caution: If you use this technique you must ensure that the + patching is “undone” by calling ‘stop’. This can be fiddlier than + you might think, because if an exception is raised in the ‘setUp’ + then ‘tearDown’ is not called. *note + unittest.TestCase.addCleanup(): 6d3. makes this easier: + + >>> 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 + ... + + As an added bonus you no longer need to keep a reference to the + ‘patcher’ object. + +It is also possible to stop all patches which have been started by using +*note patch.stopall(): 38ec. + + -- Function: patch.stopall () + + Stop all active patches. Only stops patches started with ‘start’. + + +File: python.info, Node: patch builtins, Next: TEST_PREFIX, Prev: patch methods start and stop, Up: The patchers + +5.26.9.13 patch builtins +........................ + +You can patch any builtins within a module. The following example +patches builtin *note ord(): 18f9.: + + >>> @patch('__main__.ord') + ... def test(mock_ord): + ... mock_ord.return_value = 101 + ... print(ord('c')) + ... + >>> test() + 101 + + +File: python.info, Node: TEST_PREFIX, Next: Nesting Patch Decorators, Prev: patch builtins, Up: The patchers + +5.26.9.14 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 ‘'test'’ as being test methods. This is the +same way that the *note unittest.TestLoader: 2d7. 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 +‘patch.TEST_PREFIX’: + + >>> 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 + + +File: python.info, Node: Nesting Patch Decorators, Next: Where to patch, Prev: TEST_PREFIX, Up: The patchers + +5.26.9.15 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: + + >>> @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') + +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. + + +File: python.info, Node: Where to patch, Next: Patching Descriptors and Proxy Objects, Prev: Nesting Patch Decorators, Up: The patchers + +5.26.9.16 Where to patch +........................ + +*note patch(): b1e. 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: + + a.py + -> Defines SomeClass + + b.py + -> from a import SomeClass + -> some_function instantiates SomeClass + +Now we want to test ‘some_function’ but we want to mock out ‘SomeClass’ +using *note patch(): b1e. The problem is that when we import module b, +which we will have to do then it imports ‘SomeClass’ from module a. If +we use *note patch(): b1e. to mock out ‘a.SomeClass’ then it will have +no effect on our test; module b already has a reference to the `real' +‘SomeClass’ and it looks like our patching had no effect. + +The key is to patch out ‘SomeClass’ where it is used (or where it is +looked up). In this case ‘some_function’ will actually look up +‘SomeClass’ in module b, where we have imported it. The patching should +look like: + + @patch('b.SomeClass') + +However, consider the alternative scenario where instead of ‘from a +import SomeClass’ module b does ‘import a’ and ‘some_function’ uses +‘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 ‘a.SomeClass’ instead: + + @patch('a.SomeClass') + + +File: python.info, Node: Patching Descriptors and Proxy Objects, Prev: Where to patch, Up: The patchers + +5.26.9.17 Patching Descriptors and Proxy Objects +................................................ + +Both *note patch: 38e3. and *note patch.object: 38e5. 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(1). + + ---------- Footnotes ---------- + + (1) +https://web.archive.org/web/20200603181648/http://www.voidspace.org.uk/python/weblog/arch_d7_2010_12_04.shtml#e1198 + + +File: python.info, Node: MagicMock and magic method support, Next: Helpers, Prev: The patchers, Up: unittest mock — mock object library + +5.26.9.18 MagicMock and magic method support +............................................ + +* Menu: + +* Mocking Magic Methods:: +* Magic Mock:: + + +File: python.info, Node: Mocking Magic Methods, Next: Magic Mock, Up: MagicMock and magic method support + +5.26.9.19 Mocking Magic Methods +............................... + +*note Mock: 69b. supports mocking the Python protocol methods, also +known as “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 (1), +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 ‘self’ as the first argument (2). + + >>> def __str__(self): + ... return 'fooble' + ... + >>> mock = Mock() + >>> mock.__str__ = __str__ + >>> str(mock) + 'fooble' + + >>> mock = Mock() + >>> mock.__str__ = Mock() + >>> mock.__str__.return_value = 'fooble' + >>> str(mock) + 'fooble' + + >>> mock = Mock() + >>> mock.__iter__ = Mock(return_value=iter([])) + >>> list(mock) + [] + +One use case for this is for mocking objects used as context managers in +a *note with: 19e. statement: + + >>> 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) + +Calls to magic methods do not appear in *note method_calls: 38c9, but +they are recorded in *note mock_calls: 38c6. + + 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 *note AttributeError: 19d. + +The full list of supported magic methods is: + + * ‘__hash__’, ‘__sizeof__’, ‘__repr__’ and ‘__str__’ + + * ‘__dir__’, ‘__format__’ and ‘__subclasses__’ + + * ‘__round__’, ‘__floor__’, ‘__trunc__’ and ‘__ceil__’ + + * Comparisons: ‘__lt__’, ‘__gt__’, ‘__le__’, ‘__ge__’, ‘__eq__’ and + ‘__ne__’ + + * Container methods: ‘__getitem__’, ‘__setitem__’, ‘__delitem__’, + ‘__contains__’, ‘__len__’, ‘__iter__’, ‘__reversed__’ and + ‘__missing__’ + + * Context manager: ‘__enter__’, ‘__exit__’, ‘__aenter__’ and + ‘__aexit__’ + + * Unary numeric methods: ‘__neg__’, ‘__pos__’ and ‘__invert__’ + + * The numeric methods (including right hand and in-place variants): + ‘__add__’, ‘__sub__’, ‘__mul__’, ‘__matmul__’, ‘__truediv__’, + ‘__floordiv__’, ‘__mod__’, ‘__divmod__’, ‘__lshift__’, + ‘__rshift__’, ‘__and__’, ‘__xor__’, ‘__or__’, and ‘__pow__’ + + * Numeric conversion methods: ‘__complex__’, ‘__int__’, ‘__float__’ + and ‘__index__’ + + * Descriptor methods: ‘__get__’, ‘__set__’ and ‘__delete__’ + + * Pickling: ‘__reduce__’, ‘__reduce_ex__’, ‘__getinitargs__’, + ‘__getnewargs__’, ‘__getstate__’ and ‘__setstate__’ + + * File system path representation: ‘__fspath__’ + + * Asynchronous iteration methods: ‘__aiter__’ and ‘__anext__’ + +Changed in version 3.8: Added support for *note +os.PathLike.__fspath__(): 8c0. + +Changed in version 3.8: Added support for ‘__aenter__’, ‘__aexit__’, +‘__aiter__’ and ‘__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: + + * ‘__getattr__’, ‘__setattr__’, ‘__init__’ and ‘__new__’ + + * ‘__prepare__’, ‘__instancecheck__’, ‘__subclasscheck__’, ‘__del__’ + + ---------- Footnotes ---------- + + (1) 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. + + (2) The function is basically hooked up to the class, but each ‘Mock’ +instance is kept isolated from the others. + + +File: python.info, Node: Magic Mock, Prev: Mocking Magic Methods, Up: MagicMock and magic method support + +5.26.9.20 Magic Mock +.................... + +There are two ‘MagicMock’ variants: *note MagicMock: b1d. and *note +NonCallableMagicMock: 38be. + + -- Class: unittest.mock.MagicMock (*args, **kw) + + ‘MagicMock’ is a subclass of *note Mock: 69b. with default + implementations of most of the magic methods. You can use + ‘MagicMock’ without having to configure the magic methods yourself. + + The constructor parameters have the same meaning as for *note Mock: + 69b. + + If you use the `spec' or `spec_set' arguments then `only' magic + methods that exist in the spec will be created. + + -- Class: unittest.mock.NonCallableMagicMock (*args, **kw) + + A non-callable version of *note MagicMock: b1d. + + The constructor parameters have the same meaning as for *note + MagicMock: b1d, with the exception of `return_value' and + `side_effect' which have no meaning on a non-callable mock. + +The magic methods are setup with *note MagicMock: b1d. objects, so you +can configure them and use them in the usual way: + + >>> mock = MagicMock() + >>> mock[3] = 'fish' + >>> mock.__setitem__.assert_called_with(3, 'fish') + >>> mock.__getitem__.return_value = 'result' + >>> mock[2] + 'result' + +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: + + * ‘__lt__’: ‘NotImplemented’ + + * ‘__gt__’: ‘NotImplemented’ + + * ‘__le__’: ‘NotImplemented’ + + * ‘__ge__’: ‘NotImplemented’ + + * ‘__int__’: ‘1’ + + * ‘__contains__’: ‘False’ + + * ‘__len__’: ‘0’ + + * ‘__iter__’: ‘iter([])’ + + * ‘__exit__’: ‘False’ + + * ‘__aexit__’: ‘False’ + + * ‘__complex__’: ‘1j’ + + * ‘__float__’: ‘1.0’ + + * ‘__bool__’: ‘True’ + + * ‘__index__’: ‘1’ + + * ‘__hash__’: default hash for the mock + + * ‘__str__’: default str for the mock + + * ‘__sizeof__’: default sizeof for the mock + +For example: + + >>> mock = MagicMock() + >>> int(mock) + 1 + >>> len(mock) + 0 + >>> list(mock) + [] + >>> object() in mock + False + +The two equality methods, ‘__eq__()’ and ‘__ne__()’, are special. They +do the default equality comparison on identity, using the *note +side_effect: 38bf. attribute, unless you change their return value to +return something else: + + >>> MagicMock() == 3 + False + >>> MagicMock() != 3 + True + >>> mock = MagicMock() + >>> mock.__eq__.return_value = True + >>> mock == 3 + True + +The return value of ‘MagicMock.__iter__()’ can be any iterable object +and isn’t required to be an iterator: + + >>> mock = MagicMock() + >>> mock.__iter__.return_value = ['a', 'b', 'c'] + >>> list(mock) + ['a', 'b', 'c'] + >>> list(mock) + ['a', 'b', 'c'] + +If the return value `is' an iterator, then iterating over it once will +consume it and subsequent iterations will result in an empty list: + + >>> mock.__iter__.return_value = iter(['a', 'b', 'c']) + >>> list(mock) + ['a', 'b', 'c'] + >>> list(mock) + [] + +‘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 ‘MagicMock’ +are: + + * ‘__subclasses__’ + + * ‘__dir__’ + + * ‘__format__’ + + * ‘__get__’, ‘__set__’ and ‘__delete__’ + + * ‘__reversed__’ and ‘__missing__’ + + * ‘__reduce__’, ‘__reduce_ex__’, ‘__getinitargs__’, ‘__getnewargs__’, + ‘__getstate__’ and ‘__setstate__’ + + * ‘__getformat__’ + + +File: python.info, Node: Helpers, Prev: MagicMock and magic method support, Up: unittest mock — mock object library + +5.26.9.21 Helpers +................. + +* Menu: + +* sentinel:: +* DEFAULT:: +* call:: +* create_autospec:: +* ANY:: +* FILTER_DIR:: +* mock_open:: +* Autospeccing:: +* Sealing mocks:: + + +File: python.info, Node: sentinel, Next: DEFAULT, Up: Helpers + +5.26.9.22 sentinel +.................. + + -- Data: unittest.mock.sentinel + + The ‘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 ‘sentinel’ attributes now preserve + their identity when they are *note copied: 24. or *note pickled: + c7. + +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. *note sentinel: 802. +provides a convenient way of creating and testing the identity of +objects like this. + +In this example we monkey patch ‘method’ to return +‘sentinel.some_object’: + + >>> 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 + + +File: python.info, Node: DEFAULT, Next: call, Prev: sentinel, Up: Helpers + +5.26.9.23 DEFAULT +................. + + -- Data: unittest.mock.DEFAULT + + The *note DEFAULT: 38c0. object is a pre-created sentinel (actually + ‘sentinel.DEFAULT’). It can be used by *note side_effect: 38bf. + functions to indicate that the normal return value should be used. + + +File: python.info, Node: call, Next: create_autospec, Prev: DEFAULT, Up: Helpers + +5.26.9.24 call +.............. + + -- Function: unittest.mock.call (*args, **kwargs) + + *note call(): 13ec. is a helper object for making simpler + assertions, for comparing with *note call_args: 1399, *note + call_args_list: 38cf, *note mock_calls: 38c6. and *note + method_calls: 38c9. *note call(): 13ec. can also be used with + *note assert_has_calls(): 38c5. + + >>> 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 + + -- Method: call.call_list () + + For a call object that represents multiple calls, *note + call_list(): 38f9. returns a list of all the intermediate calls as + well as the final call. + +‘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 *note mock_calls: 38c6. on a mock. +Manually constructing the sequence of calls can be tedious. + +*note call_list(): 38f9. can construct the sequence of calls from the +same chained call: + + >>> 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 +A ‘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 ‘call’ objects that are in the *note +Mock.call_args: 1399, *note Mock.call_args_list: 38cf. and *note +Mock.mock_calls: 38c6. attributes can be introspected to get at the +individual arguments they contain. + +The ‘call’ objects in *note Mock.call_args: 1399. and *note +Mock.call_args_list: 38cf. are two-tuples of (positional args, keyword +args) whereas the ‘call’ objects in *note Mock.mock_calls: 38c6, 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: + + >>> 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 + + >>> 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 + + +File: python.info, Node: create_autospec, Next: ANY, Prev: call, Up: Helpers + +5.26.9.25 create_autospec +......................... + + -- 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 ‘True’ then attempting to set attributes that + don’t exist on the spec object will raise an *note AttributeError: + 19d. + + 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 + ‘instance=True’. The returned mock will only be callable if + instances of the mock are callable. + + *note create_autospec(): 13b1. also takes arbitrary keyword + arguments that are passed to the constructor of the created mock. + +See *note Autospeccing: 38bb. for examples of how to use auto-speccing +with *note create_autospec(): 13b1. and the `autospec' argument to *note +patch(): b1e. + +Changed in version 3.8: *note create_autospec(): 13b1. now returns an +*note AsyncMock: 69a. if the target is an async function. + + +File: python.info, Node: ANY, Next: FILTER_DIR, Prev: create_autospec, Up: Helpers + +5.26.9.26 ANY +............. + + -- Data: unittest.mock.ANY + +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 *note call_args: 1399. and make +more complex assertions on them. + +To ignore certain arguments you can pass in objects that compare equal +to `everything'. Calls to *note assert_called_with(): 1452. and *note +assert_called_once_with(): 38c3. will then succeed no matter what was +passed in. + + >>> mock = Mock(return_value=None) + >>> mock('foo', bar=object()) + >>> mock.assert_called_once_with('foo', bar=ANY) + +*note ANY: 13f1. can also be used in comparisons with call lists like +*note mock_calls: 38c6.: + + >>> m = MagicMock(return_value=None) + >>> m(1) + >>> m(1, 2) + >>> m(object()) + >>> m.mock_calls == [call(1), call(1, 2), ANY] + True + + +File: python.info, Node: FILTER_DIR, Next: mock_open, Prev: ANY, Up: Helpers + +5.26.9.27 FILTER_DIR +.................... + + -- Data: unittest.mock.FILTER_DIR + +*note FILTER_DIR: 38cb. is a module level variable that controls the way +mock objects respond to *note dir(): 20e. The default is ‘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 ‘mock.FILTER_DIR = False’. + +With filtering on, ‘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: + + >>> 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', + ... + +Many of the not-very-useful (private to *note Mock: 69b. rather than the +thing being mocked) underscore and double underscore prefixed attributes +have been filtered from the result of calling *note dir(): 20e. on a +*note Mock: 69b. If you dislike this behaviour you can switch it off by +setting the module level switch *note FILTER_DIR: 38cb.: + + >>> 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__', + ... + +Alternatively you can just use ‘vars(my_mock)’ (instance members) and +‘dir(type(my_mock))’ (type members) to bypass the filtering irrespective +of ‘mock.FILTER_DIR’. + + +File: python.info, Node: mock_open, Next: Autospeccing, Prev: FILTER_DIR, Up: Helpers + +5.26.9.28 mock_open +................... + + -- Function: unittest.mock.mock_open (mock=None, read_data=None) + + A helper function to create a mock to replace the use of *note + open(): 30b. It works for *note open(): 30b. called directly or + used as a context manager. + + The `mock' argument is the mock object to configure. If ‘None’ + (the default) then a *note MagicMock: b1d. 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 ‘read()’, *note readline(): 1ce1, + and *note readlines(): 1d95. 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(1) can offer a realistic filesystem for testing. + + Changed in version 3.4: Added *note readline(): 1ce1. and *note + readlines(): 1d95. support. The mock of ‘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 ‘__iter__()’ to implementation so + that iteration (such as in for loops) correctly consumes + `read_data'. + +Using *note open(): 30b. as a context manager is a great way to ensure +your file handles are closed properly and is becoming common: + + with open('/some/path', 'w') as f: + f.write('something') + +The issue is that even if you mock out the call to *note open(): 30b. it +is the `returned object' that is used as a context manager (and has +‘__enter__()’ and ‘__exit__()’ called). + +Mocking context managers with a *note MagicMock: b1d. is common enough +and fiddly enough that a helper function is useful. + + >>> 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') + +And for reading files: + + >>> 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' + + ---------- Footnotes ---------- + + (1) https://pypi.org + + +File: python.info, Node: Autospeccing, Next: Sealing mocks, Prev: mock_open, Up: Helpers + +5.26.9.29 Autospeccing +...................... + +Autospeccing is based on the existing ‘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 +*note TypeError: 19c. if they are called incorrectly. + +Before I explain how auto-speccing works, here’s why it is needed. + +*note Mock: 69b. is a very powerful and flexible object, but it suffers +from two flaws when used to mock out objects from a system under test. +One of these flaws is specific to the *note Mock: 69b. api and the other +is a more general problem with using mock objects. + +First the problem specific to *note Mock: 69b. *note Mock: 69b. has two +assert methods that are extremely handy: *note assert_called_with(): +1452. and *note assert_called_once_with(): 38c3. + + >>> mock = Mock(name='Thing', return_value=None) + >>> mock(1, 2, 3) + >>> mock.assert_called_once_with(1, 2, 3) + >>> mock(1, 2, 3) + >>> mock.assert_called_once_with(1, 2, 3) + Traceback (most recent call last): + ... + AssertionError: Expected 'mock' to be called once. Called 2 times. + +Because mocks auto-create attributes on demand, and allow you to call +them with arbitrary arguments, if you misspell one of these assert +methods then your assertion is gone: + + >>> mock = Mock(name='Thing', return_value=None) + >>> mock(1, 2, 3) + >>> mock.assret_called_once_with(4, 5, 6) # Intentional typo! + +Your tests can pass silently and incorrectly because of the typo. + +The second issue is more 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. + +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. + +‘mock’ already provides a feature to help with this, called speccing. +If you use a class or instance as the ‘spec’ for a mock then you can +only access attributes on the mock that exist on the real class: + + >>> 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' + +The spec only applies to the mock itself, so we still have the same +issue with any methods on the mock: + + >>> mock.has_data() + <mock.Mock object at 0x...> + >>> mock.has_data.assret_called_with() # Intentional typo! + +Auto-speccing solves this problem. You can either pass ‘autospec=True’ +to *note patch(): b1e. / *note patch.object(): 13d7. or use the *note +create_autospec(): 13b1. function to create a mock with a spec. If you +use the ‘autospec=True’ argument to *note patch(): b1e. 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: + + >>> 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='...'> + +You can see that ‘request.Request’ has a spec. ‘request.Request’ takes +two arguments in the constructor (one of which is `self'). Here’s what +happens if we try to call it incorrectly: + + >>> req = request.Request() + Traceback (most recent call last): + ... + TypeError: <lambda>() takes at least 2 arguments (1 given) + +The spec also applies to instantiated classes (i.e. the return value of +specced mocks): + + >>> req = request.Request('foo') + >>> req + <NonCallableMagicMock name='request.Request()' spec='Request' id='...'> + +‘Request’ objects are not callable, so the return value of instantiating +our mocked out ‘request.Request’ is a non-callable mock. With the spec +in place any typos in our asserts will raise the correct error: + + >>> 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') + +In many cases you will just be able to add ‘autospec=True’ to your +existing *note patch(): b1e. calls and then be protected against bugs +due to typos and api changes. + +As well as using `autospec' through *note patch(): b1e. there is a *note +create_autospec(): 13b1. for creating autospecced mocks directly: + + >>> from urllib import request + >>> mock_request = create_autospec(request) + >>> mock_request.Request('foo', 'bar') + <NonCallableMagicMock name='mock.Request()' spec='Request' id='...'> + +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 (1). + +A more serious problem is that it is common for instance attributes to +be created in the ‘__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. + + >>> 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' + +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: + + >>> with patch('__main__.Something', autospec=True): + ... thing = Something() + ... thing.a = 33 + ... + +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: + + >>> 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' + +Probably the best way of solving the problem is to add class attributes +as default values for instance members initialised in ‘__init__()’. +Note that if you are only setting default attributes in ‘__init__()’ +then providing them via class attributes (shared between instances of +course) is faster too. e.g. + + class Something: + a = 33 + +This brings up another issue. It is relatively common to provide a +default value of ‘None’ for members that will later be an object of a +different type. ‘None’ would be useless as a spec because it wouldn’t +let you access `any' attributes or methods on it. As ‘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 ‘None’. These will just be ordinary mocks (well - +MagicMocks): + + >>> class Something: + ... member = None + ... + >>> mock = create_autospec(Something) + >>> mock.member.foo.bar.baz() + <MagicMock name='mock.member.foo.bar.baz()' id='...'> + +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 *note patch(): b1e. +supports this - you can simply pass the alternative object as the +`autospec' argument: + + >>> 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='...'> + + ---------- Footnotes ---------- + + (1) 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 *note +dir(): 20e. - that are done. + + +File: python.info, Node: Sealing mocks, Prev: Autospeccing, Up: Helpers + +5.26.9.30 Sealing mocks +....................... + + -- 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. + + >>> 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. + + New in version 3.7. + + +File: python.info, Node: unittest mock — getting started, Next: 2to3 — Automated Python 2 to 3 code translation, Prev: unittest mock — mock object library, Up: Development Tools + +5.26.10 ‘unittest.mock’ — getting started +----------------------------------------- + +New in version 3.3. + +* Menu: + +* Using Mock:: +* Patch Decorators:: +* Further Examples:: + + +File: python.info, Node: Using Mock, Next: Patch Decorators, Up: unittest mock — getting started + +5.26.10.1 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:: + + +File: python.info, Node: Mock Patching Methods, Next: Mock for Method Calls on an Object, Up: Using Mock + +5.26.10.2 Mock Patching Methods +............................... + +Common uses for *note Mock: 69b. objects include: + + * Patching methods + + * Recording method calls on objects + +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: + + >>> real = SomeClass() + >>> real.method = MagicMock(name='method') + >>> real.method(3, 4, 5, key='value') + <MagicMock name='method()' id='...'> + +Once our mock has been used (‘real.method’ in this example) it has +methods and attributes that allow you to make assertions about how it +has been used. + + Note: In most of these examples the *note Mock: 69b. and *note + MagicMock: b1d. classes are interchangeable. As the ‘MagicMock’ is + the more capable class it makes a sensible one to use by default. + +Once the mock has been called its *note called: 38cd. attribute is set +to ‘True’. More importantly we can use the *note assert_called_with(): +1452. or *note assert_called_once_with(): 38c3. method to check that it +was called with the correct arguments. + +This example tests that calling ‘ProductionClass().method’ results in a +call to the ‘something’ method: + + >>> 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) + + +File: python.info, Node: Mock for Method Calls on an Object, Next: Mocking Classes, Prev: Mock Patching Methods, Up: Using Mock + +5.26.10.3 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 ‘ProductionClass’ below has a ‘closer’ method. If it is +called with an object then it calls ‘close’ on it. + + >>> class ProductionClass: + ... def closer(self, something): + ... something.close() + ... + +So to test it we need to pass in an object with a ‘close’ method and +check that it was called correctly. + + >>> real = ProductionClass() + >>> mock = Mock() + >>> real.closer(mock) + >>> mock.close.assert_called_with() + +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 *note +assert_called_with(): 1452. will raise a failure exception. + + +File: python.info, Node: Mocking Classes, Next: Naming your mocks, Prev: Mock for Method Calls on an Object, Up: Using Mock + +5.26.10.4 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 ‘some_function’ that +instantiates ‘Foo’ and calls a method on it. The call to *note patch(): +b1e. replaces the class ‘Foo’ with a mock. The ‘Foo’ instance is the +result of calling the mock, so it is configured by modifying the mock +*note return_value: 38c1. + + >>> 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' + + +File: python.info, Node: Naming your mocks, Next: Tracking all Calls, Prev: Mocking Classes, Up: Using Mock + +5.26.10.5 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: + + >>> mock = MagicMock(name='foo') + >>> mock + <MagicMock name='foo' id='...'> + >>> mock.method + <MagicMock name='foo.method' id='...'> + + +File: python.info, Node: Tracking all Calls, Next: Setting Return Values and Attributes, Prev: Naming your mocks, Up: Using Mock + +5.26.10.6 Tracking all Calls +............................ + +Often you want to track more than a single call to a method. The *note +mock_calls: 38c6. attribute records all calls to child attributes of the +mock - and also to their children. + + >>> 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)] + +If you make an assertion about ‘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 *note call: 13ec. object to construct lists for comparing +with ‘mock_calls’: + + >>> expected = [call.method(), call.attribute.method(10, x=53)] + >>> mock.mock_calls == expected + True + +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: + + >>> m = Mock() + >>> m.factory(important=True).deliver() + <Mock name='mock.factory().deliver()' id='...'> + >>> m.mock_calls[-1] == call.factory(important=False).deliver() + True + + +File: python.info, Node: Setting Return Values and Attributes, Next: Raising exceptions with mocks, Prev: Tracking all Calls, Up: Using Mock + +5.26.10.7 Setting Return Values and Attributes +.............................................. + +Setting the return values on a mock object is trivially easy: + + >>> mock = Mock() + >>> mock.return_value = 3 + >>> mock() + 3 + +Of course you can do the same for methods on the mock: + + >>> mock = Mock() + >>> mock.method.return_value = 3 + >>> mock.method() + 3 + +The return value can also be set in the constructor: + + >>> mock = Mock(return_value=3) + >>> mock() + 3 + +If you need an attribute setting on your mock, just do it: + + >>> mock = Mock() + >>> mock.x = 3 + >>> mock.x + 3 + +Sometimes you want to mock up a more complex situation, like for example +‘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 *note call: 13ec. to construct the set of calls in a “chained +call” like this for easy assertion afterwards: + + >>> 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 + +It is the call to ‘.call_list()’ that turns our call object into a list +of calls representing the chained calls. + + +File: python.info, Node: Raising exceptions with mocks, Next: Side effect functions and iterables, Prev: Setting Return Values and Attributes, Up: Using Mock + +5.26.10.8 Raising exceptions with mocks +....................................... + +A useful attribute is *note side_effect: 38bf. If you set this to an +exception class or instance then the exception will be raised when the +mock is called. + + >>> mock = Mock(side_effect=Exception('Boom!')) + >>> mock() + Traceback (most recent call last): + ... + Exception: Boom! + + +File: python.info, Node: Side effect functions and iterables, Next: Mocking asynchronous iterators, Prev: Raising exceptions with mocks, Up: Using Mock + +5.26.10.9 Side effect functions and iterables +............................................. + +‘side_effect’ can also be set to a function or an iterable. The use +case for ‘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 ‘side_effect’ to an iterable every call to the mock +returns the next value from the iterable: + + >>> mock = MagicMock(side_effect=[4, 5, 6]) + >>> mock() + 4 + >>> mock() + 5 + >>> mock() + 6 + +For more advanced use cases, like dynamically varying the return values +depending on what the mock is called with, ‘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: + + >>> 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 + + +File: python.info, Node: Mocking asynchronous iterators, Next: Mocking asynchronous context manager, Prev: Side effect functions and iterables, Up: Using Mock + +5.26.10.10 Mocking asynchronous iterators +......................................... + +Since Python 3.8, ‘AsyncMock’ and ‘MagicMock’ have support to mock *note +Asynchronous Iterators: 9f6. through ‘__aiter__’. The *note +return_value: 38c1. attribute of ‘__aiter__’ can be used to set the +return values to be used for iteration. + + >>> 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] + + +File: python.info, Node: Mocking asynchronous context manager, Next: Creating a Mock from an Existing Object, Prev: Mocking asynchronous iterators, Up: Using Mock + +5.26.10.11 Mocking asynchronous context manager +............................................... + +Since Python 3.8, ‘AsyncMock’ and ‘MagicMock’ have support to mock *note +Asynchronous Context Managers: 1d1. through ‘__aenter__’ and +‘__aexit__’. By default, ‘__aenter__’ and ‘__aexit__’ are ‘AsyncMock’ +instances that return an async function. + + >>> 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() + + +File: python.info, Node: Creating a Mock from an Existing Object, Prev: Mocking asynchronous context manager, Up: Using Mock + +5.26.10.12 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 ‘some_method’. In a test for another +class, you provide a mock of this object that `also' provides +‘some_method’. If later you refactor the first class, so that it no +longer has ‘some_method’ - then your tests will continue to pass even +though your code is now broken! + +*note Mock: 69b. 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. + + >>> mock = Mock(spec=SomeClass) + >>> mock.old_method() + Traceback (most recent call last): + ... + AttributeError: object has no attribute 'old_method' + +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: + + >>> 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) + +If you want this smarter matching to also work with method calls on the +mock, you can use *note auto-speccing: 38bb. + +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'. + + +File: python.info, Node: Patch Decorators, Next: Further Examples, Prev: Using Mock, Up: unittest mock — getting started + +5.26.10.13 Patch Decorators +........................... + + Note: With *note patch(): b1e. it matters that you patch objects in + the namespace where they are looked up. This is normally + straightforward, but for a quick guide read *note where to patch: + 38b9. + +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: *note patch(): b1e, +*note patch.object(): 13d7. and *note patch.dict(): 1423. ‘patch’ takes +a single string, of the form ‘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. + +‘patch.object’: + + >>> 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() + +If you are patching a module (including *note builtins: 11.) then use +*note patch(): b1e. instead of *note patch.object(): 13d7.: + + >>> 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" + +The module name can be ‘dotted’, in the form ‘package.module’ if needed: + + >>> @patch('package.module.ClassName.attribute', sentinel.attribute) + ... def test(): + ... from package.module import ClassName + ... assert ClassName.attribute == sentinel.attribute + ... + >>> test() + +A nice pattern is to actually decorate test methods themselves: + + >>> 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 + +If you want to patch with a Mock, you can use *note patch(): b1e. with +only one argument (or *note patch.object(): 13d7. with two arguments). +The mock will be created for you and passed into the test function / +method: + + >>> 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() + +You can stack up multiple patch decorators using this pattern: + + >>> 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() + +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 ‘test_module.ClassName2’ is passed in first. + +There is also *note patch.dict(): 1423. for setting values in a +dictionary just during a scope and restoring the dictionary to its +original state when the test ends: + + >>> foo = {'key': 'value'} + >>> original = foo.copy() + >>> with patch.dict(foo, {'newkey': 'newvalue'}, clear=True): + ... assert foo == {'newkey': 'newvalue'} + ... + >>> assert foo == original + +‘patch’, ‘patch.object’ and ‘patch.dict’ can all be used as context +managers. + +Where you use *note patch(): b1e. to create a mock for you, you can get +a reference to the mock using the “as” form of the with statement: + + >>> 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) + +As an alternative ‘patch’, ‘patch.object’ and ‘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”. + + +File: python.info, Node: Further Examples, Prev: Patch Decorators, Up: unittest mock — getting started + +5.26.10.14 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:: + + +File: python.info, Node: Mocking chained calls, Next: Partial mocking, Up: Further Examples + +5.26.10.15 Mocking chained calls +................................ + +Mocking chained calls is actually straightforward with mock once you +understand the *note return_value: 38c1. attribute. When a mock is +called for the first time, or you fetch its ‘return_value’ before it has +been called, a new *note Mock: 69b. 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 ‘return_value’ mock: + + >>> mock = Mock() + >>> mock().foo(a=2, b=3) + <Mock name='mock().foo()' id='...'> + >>> mock.return_value.foo.assert_called_with(a=2, b=3) + +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: + + >>> 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 + +Assuming that ‘BackendProvider’ is already well tested, how do we test +‘method()’? Specifically, we want to test that the code section ‘# 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 ‘backend’ attribute on a ‘Something’ instance. In this +particular case we are only interested in the return value from the +final call to ‘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 *note open(): 30b. as its ‘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 ‘start_call’ we could do this: + + mock_backend.get_endpoint.return_value.create_call.return_value.start_call.return_value = mock_response + +We can do that in a slightly nicer way using the *note configure_mock(): +38c2. method to directly set the return value for us: + + >>> 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) + +With these we monkey patch the “mock backend” in place and can make the +real call: + + >>> something.backend = mock_backend + >>> something.method() + +Using *note mock_calls: 38c6. 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 ‘mock_calls’. We can use *note +call.call_list(): 38f9. to create this list of calls for us: + + >>> chained = call.get_endpoint('foobar').create_call('spam', 'eggs').start_call() + >>> call_list = chained.call_list() + >>> assert mock_backend.mock_calls == call_list + + +File: python.info, Node: Partial mocking, Next: Mocking a Generator Method, Prev: Mocking chained calls, Up: Further Examples + +5.26.10.16 Partial mocking +.......................... + +In some tests I wanted to mock out a call to *note +datetime.date.today(): 1ea5. to return a known date, but I didn’t want +to prevent the code under test from creating new date objects. +Unfortunately *note datetime.date: 536. is written in C, and so I +couldn’t just monkey-patch out the static ‘date.today()’ method. + +I found a simple way of doing this that involved effectively wrapping +the date class with a mock, but passing through calls to the constructor +to the real class (and returning real instances). + +The *note patch decorator: b1e. is used here to mock out the ‘date’ +class in the module under test. The ‘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 ‘side_effect’. + + >>> from datetime import date + >>> with patch('mymodule.date') as mock_date: + ... mock_date.today.return_value = date(2010, 10, 8) + ... mock_date.side_effect = lambda *args, **kw: date(*args, **kw) + ... + ... assert mymodule.date.today() == date(2010, 10, 8) + ... assert mymodule.date(2009, 6, 8) == date(2009, 6, 8) + +Note that we don’t patch *note datetime.date: 536. globally, we patch +‘date’ in the module that `uses' it. See *note where to patch: 38b9. + +When ‘date.today()’ is called a known date is returned, but calls to the +‘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 ‘mock_date’ attributes +(‘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(1). + + ---------- Footnotes ---------- + + (1) +https://williambert.online/2011/07/how-to-unit-testing-in-django-with-mocking-and-patching/ + + +File: python.info, Node: Mocking a Generator Method, Next: Applying the same patch to every test method, Prev: Partial mocking, Up: Further Examples + +5.26.10.17 Mocking a Generator Method +..................................... + +A Python generator is a function or method that uses the *note yield: +60d. statement to return a series of values when iterated over (1). + +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 *note __iter__(): 1bec, so we can mock this +using a *note MagicMock: b1d. + +Here’s an example class with an “iter” method implemented as a +generator: + + >>> class Foo: + ... def iter(self): + ... for i in [1, 2, 3]: + ... yield i + ... + >>> foo = Foo() + >>> list(foo.iter()) + [1, 2, 3] + +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 *note list: 1e9.), we need to configure the object returned by +the call to ‘foo.iter()’. + + >>> mock_foo = MagicMock() + >>> mock_foo.iter.return_value = iter([1, 2, 3]) + >>> list(mock_foo.iter()) + [1, 2, 3] + + ---------- Footnotes ---------- + + (1) There are also generator expressions and more advanced uses +(http://www.dabeaz.com/coroutines/index.html) of generators, but we +aren’t concerned about them here. A very good introduction to +generators and how powerful they are is: Generator Tricks for Systems +Programmers (http://www.dabeaz.com/generators/). + + +File: python.info, Node: Applying the same patch to every test method, Next: Mocking Unbound Methods, Prev: Mocking a Generator Method, Up: Further Examples + +5.26.10.18 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 *note patch(): +b1e. (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 ‘test’: + + >>> @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' + +An alternative way of managing patches is to use the *note patch +methods; start and stop: 38eb. These allow you to move the patching +into your ‘setUp’ and ‘tearDown’ methods. + + >>> 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() + +If you use this technique you must ensure that the patching is “undone” +by calling ‘stop’. This can be fiddlier than you might think, because +if an exception is raised in the setUp then tearDown is not called. +*note unittest.TestCase.addCleanup(): 6d3. makes this easier: + + >>> 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() + + +File: python.info, Node: Mocking Unbound Methods, Next: Checking multiple calls with mock, Prev: Applying the same patch to every test method, Up: Further Examples + +5.26.10.19 Mocking Unbound Methods +.................................. + +Whilst writing tests today I needed to patch an `unbound method' +(patching the method on the class rather than on the instance). I +needed self to be passed in as the first argument because I want to make +asserts about which objects were calling this particular method. 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 self passed in. +The workaround is to patch the unbound method with a real function +instead. The *note patch(): b1e. 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 ‘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 ‘self’ passed in as the +first argument, which is exactly what I wanted: + + >>> 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) + +If we don’t use ‘autospec=True’ then the unbound method is patched out +with a Mock instance instead, and isn’t called with ‘self’. + + +File: python.info, Node: Checking multiple calls with mock, Next: Coping with mutable arguments, Prev: Mocking Unbound Methods, Up: Further Examples + +5.26.10.20 Checking multiple calls with mock +............................................ + +mock has a nice API for making assertions about how your mock objects +are used. + + >>> mock = Mock() + >>> mock.foo_bar.return_value = None + >>> mock.foo_bar('baz', spam='eggs') + >>> mock.foo_bar.assert_called_with('baz', spam='eggs') + +If your mock is only being called once you can use the +‘assert_called_once_with()’ method that also asserts that the +‘call_count’ is one. + + >>> 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 to be called once. Called 2 times. + +Both ‘assert_called_with’ and ‘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 *note call_args_list: 38cf.: + + >>> 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()] + +The *note call: 13ec. helper makes it easy to make assertions about +these calls. You can build up a list of expected calls and compare it +to ‘call_args_list’. This looks remarkably similar to the repr of the +‘call_args_list’: + + >>> expected = [call(1, 2, 3), call(4, 5, 6), call()] + >>> mock.call_args_list == expected + True + + +File: python.info, Node: Coping with mutable arguments, Next: Nesting Patches, Prev: Checking multiple calls with mock, Up: Further Examples + +5.26.10.21 Coping with mutable arguments +........................................ + +Another situation is rare, but can bite you, is when your mock is called +with mutable arguments. ‘call_args’ and ‘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’: + + def frob(val): + pass + + def grob(val): + "First frob and then clear val" + frob(val) + val.clear() + +When we try to test that ‘grob’ calls ‘frob’ with the correct argument +look what happens: + + >>> 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(),), {}) + +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 ‘side_effect’ functionality. If you +provide a ‘side_effect’ function for a mock then ‘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. + + >>> 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}) + +‘copy_call_args’ is called with the mock that will be called. It +returns a new mock that we do the assertion on. The ‘side_effect’ +function makes a copy of the args and calls our ‘new_mock’ with the +copy. + + 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 ‘side_effect’ function. + + >>> def side_effect(arg): + ... assert arg == {6} + ... + >>> mock = Mock(side_effect=side_effect) + >>> mock({6}) + >>> mock(set()) + Traceback (most recent call last): + ... + AssertionError + +An alternative approach is to create a subclass of *note Mock: 69b. or +*note MagicMock: b1d. that copies (using *note copy.deepcopy(): 7cd.) +the arguments. Here’s an example implementation: + + >>> 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: mock({1}) + Actual call: mock(set()) + >>> c.foo + <CopyingMock name='mock.foo' id='...'> + +When you subclass ‘Mock’ or ‘MagicMock’ all dynamically created +attributes, and the ‘return_value’ will use your subclass automatically. +That means all children of a ‘CopyingMock’ will also have the type +‘CopyingMock’. + + +File: python.info, Node: Nesting Patches, Next: Mocking a dictionary with MagicMock, Prev: Coping with mutable arguments, Up: Further Examples + +5.26.10.22 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: + + >>> 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 + +With unittest ‘cleanup’ functions and the *note patch methods; start and +stop: 38eb. we can achieve the same effect without the nested +indentation. A simple helper method, ‘create_patch’, puts the patch in +place and returns the created mock for us: + + >>> 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 + + +File: python.info, Node: Mocking a dictionary with MagicMock, Next: Mock subclasses and their attributes, Prev: Nesting Patches, Up: Further Examples + +5.26.10.23 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 *note MagicMock: b1d, which will behave like a +dictionary, and using *note side_effect: 38bf. to delegate dictionary +access to a real underlying dictionary that is under our control. + +When the ‘__getitem__()’ and ‘__setitem__()’ methods of our ‘MagicMock’ +are called (normal dictionary access) then ‘side_effect’ is called with +the key (and in the case of ‘__setitem__’ the value too). We can also +control what is returned. + +After the ‘MagicMock’ has been used we can use attributes like *note +call_args_list: 38cf. to assert about how the dictionary was used: + + >>> 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 + + Note: An alternative to using ‘MagicMock’ is to use ‘Mock’ and + `only' provide the magic methods you specifically want: + + >>> mock = Mock() + >>> mock.__getitem__ = Mock(side_effect=getitem) + >>> mock.__setitem__ = Mock(side_effect=setitem) + + A `third' option is to use ‘MagicMock’ but passing in ‘dict’ as the + `spec' (or `spec_set') argument so that the ‘MagicMock’ created + only has dictionary magic methods available: + + >>> mock = MagicMock(spec_set=dict) + >>> mock.__getitem__.side_effect = getitem + >>> mock.__setitem__.side_effect = setitem + +With these side effect functions in place, the ‘mock’ will behave like a +normal dictionary but recording the access. It even raises a *note +KeyError: 6f5. if you try to access a key that doesn’t exist. + + >>> 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' + +After it has been used you can make assertions about the access using +the normal mock methods and attributes: + + >>> 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'} + + +File: python.info, Node: Mock subclasses and their attributes, Next: Mocking imports with patch dict, Prev: Mocking a dictionary with MagicMock, Up: Further Examples + +5.26.10.24 Mock subclasses and their attributes +............................................... + +There are various reasons why you might want to subclass *note Mock: +69b. One reason might be to add helper methods. Here’s a silly +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 + +The standard behaviour for ‘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 ‘Mock’ attributes are ‘Mocks’ and ‘MagicMock’ +attributes are ‘MagicMocks’ (1). 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. + + >>> 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 + +Sometimes this is inconvenient. For example, one user(2) is subclassing +mock to created a Twisted adaptor(3). Having this applied to attributes +too actually causes errors. + +‘Mock’ (in all its flavours) uses a method called ‘_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 +(‘**kwargs’) which are then passed onto the mock constructor: + + >>> 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) + + ---------- Footnotes ---------- + + (1) 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. + + (2) https://code.google.com/archive/p/mock/issues/105 + + (3) +https://twistedmatrix.com/documents/11.0.0/api/twisted.python.components.html + + +File: python.info, Node: Mocking imports with patch dict, Next: Tracking order of calls and less verbose call assertions, Prev: Mock subclasses and their attributes, Up: Further Examples + +5.26.10.25 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 ‘mock’ to affect the results of an +import. Importing fetches an `object' from the *note sys.modules: 1382. +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 ‘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 *note patch.dict(): 1423. to `temporarily' put a +mock in place in *note sys.modules: 1382. 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 +‘patcher.stop()’ is called) then whatever was there previously will be +restored safely. + +Here’s an example that mocks out the ‘fooble’ module. + + >>> 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() + +As you can see the ‘import fooble’ succeeds, but on exit there is no +‘fooble’ left in *note sys.modules: 1382. + +This also works for the ‘from module import name’ form: + + >>> 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() + +With slightly more work you can also mock package imports: + + >>> 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() + + +File: python.info, Node: Tracking order of calls and less verbose call assertions, Next: More complex argument matching, Prev: Mocking imports with patch dict, Up: Further Examples + +5.26.10.26 Tracking order of calls and less verbose call assertions +................................................................... + +The *note Mock: 69b. class allows you to track the `order' of method +calls on your mock objects through the *note method_calls: 38c9. +attribute. This doesn’t allow you to track the order of calls between +separate mock objects, however we can use *note mock_calls: 38c6. to +achieve the same effect. + +Because mocks track calls to child mocks in ‘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 ‘mock_calls’ of the parent: + + >>> manager = Mock() + >>> mock_foo = manager.foo + >>> mock_bar = manager.bar + + >>> mock_foo.something() + <Mock name='mock.foo.something()' id='...'> + >>> mock_bar.other.thing() + <Mock name='mock.bar.other.thing()' id='...'> + + >>> manager.mock_calls + [call.foo.something(), call.bar.other.thing()] + +We can then assert about the calls, including the order, by comparing +with the ‘mock_calls’ attribute on the manager mock: + + >>> expected_calls = [call.foo.something(), call.bar.other.thing()] + >>> manager.mock_calls == expected_calls + True + +If ‘patch’ is creating, and putting in place, your mocks then you can +attach them to a manager mock using the *note attach_mock(): 38c8. +method. After attaching calls will be recorded in ‘mock_calls’ of the +manager. + + >>> 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()] + +If many calls have been made, but you’re only interested in a particular +sequence of them then an alternative is to use the *note +assert_has_calls(): 38c5. method. This takes a list of calls +(constructed with the *note call: 13ec. object). If that sequence of +calls are in *note mock_calls: 38c6. then the assert succeeds. + + >>> 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) + +Even though the chained call ‘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 ‘any_order=True’ to +‘assert_has_calls’: + + >>> 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) + + +File: python.info, Node: More complex argument matching, Prev: Tracking order of calls and less verbose call assertions, Up: Further Examples + +5.26.10.27 More complex argument matching +......................................... + +Using the same basic concept as *note ANY: 13f1. 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 *note assert_called_with(): 1452. 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 +‘assert_called_with’ isn’t sufficient: + + >>> 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(<__main__.Foo object at 0x...>) + Actual call: call(<__main__.Foo object at 0x...>) + +A comparison function for our ‘Foo’ class might look something like +this: + + >>> 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 + ... + +And a matcher object that can use comparison functions like this for its +equality operation would look something like this: + + >>> 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) + ... + +Putting all this together: + + >>> match_foo = Matcher(compare, Foo(1, 2)) + >>> mock.assert_called_with(match_foo) + +The ‘Matcher’ is instantiated with our compare function and the ‘Foo’ +object we want to compare against. In ‘assert_called_with’ the +‘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 ‘assert_called_with’ passes, and if they don’t an *note +AssertionError: 26e. is raised: + + >>> 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...>,), {}) + +With a bit of tweaking you could have the comparison function raise the +*note AssertionError: 26e. directly and provide a more useful failure +message. + +As of version 1.5, the Python testing library PyHamcrest(1) provides +similar functionality, that may be useful here, in the form of its +equality matcher (hamcrest.library.integration.match_equality(2)). + + ---------- Footnotes ---------- + + (1) https://pyhamcrest.readthedocs.io/ + + (2) +https://pyhamcrest.readthedocs.io/en/release-1.8/integration/#module-hamcrest.library.integration.match_equality + + +File: python.info, Node: 2to3 — Automated Python 2 to 3 code translation, Next: test — Regression tests package for Python, Prev: unittest mock — getting started, Up: Development Tools + +5.26.11 2to3 — Automated Python 2 to 3 code translation +------------------------------------------------------- + +2to3 is a Python program that reads Python 2.x source code and applies a +series of `fixers' to transform it into valid Python 3.x code. The +standard library contains a rich set of fixers that will handle almost +all code. 2to3 supporting library *note lib2to3: a5. is, however, a +flexible and generic library, so it is possible to write your own fixers +for 2to3. + +Deprecated since version 3.11, will be removed in version 3.13: The +‘lib2to3’ module was marked pending for deprecation in Python 3.9 +(raising *note PendingDeprecationWarning: 503. on import) and fully +deprecated in Python 3.11 (raising *note DeprecationWarning: 2d4.). The +‘2to3’ tool is part of that. It will be removed in Python 3.13. + +* Menu: + +* Using 2to3:: +* Fixers:: +* lib2to3 — 2to3’s library:: + + +File: python.info, Node: Using 2to3, Next: Fixers, Up: 2to3 — Automated Python 2 to 3 code translation + +5.26.11.1 Using 2to3 +.................... + +2to3 will usually be installed with the Python interpreter as a script. +It is also located in the ‘Tools/scripts’ directory of the Python root. + +2to3’s basic arguments are a list of files or directories to transform. +The directories are recursively traversed for Python sources. + +Here is a sample Python 2.x source file, ‘example.py’: + + def greet(name): + print "Hello, {0}!".format(name) + print "What's your name?" + name = raw_input() + greet(name) + +It can be converted to Python 3.x code via 2to3 on the command line: + + $ 2to3 example.py + +A diff against the original source file is printed. 2to3 can also write +the needed modifications right back to the source file. (A backup of +the original file is made unless ‘-n’ is also given.) Writing the +changes back is enabled with the ‘-w’ flag: + + $ 2to3 -w example.py + +After transformation, ‘example.py’ looks like this: + + def greet(name): + print("Hello, {0}!".format(name)) + print("What's your name?") + name = input() + greet(name) + +Comments and exact indentation are preserved throughout the translation +process. + +By default, 2to3 runs a set of *note predefined fixers: 3923. The ‘-l’ +flag lists all available fixers. An explicit set of fixers to run can +be given with ‘-f’. Likewise the ‘-x’ explicitly disables a fixer. The +following example runs only the ‘imports’ and ‘has_key’ fixers: + + $ 2to3 -f imports -f has_key example.py + +This command runs every fixer except the ‘apply’ fixer: + + $ 2to3 -x apply example.py + +Some fixers are `explicit', meaning they aren’t run by default and must +be listed on the command line to be run. Here, in addition to the +default fixers, the ‘idioms’ fixer is run: + + $ 2to3 -f all -f idioms example.py + +Notice how passing ‘all’ enables all default fixers. + +Sometimes 2to3 will find a place in your source code that needs to be +changed, but 2to3 cannot fix automatically. In this case, 2to3 will +print a warning beneath the diff for a file. You should address the +warning in order to have compliant 3.x code. + +2to3 can also refactor doctests. To enable this mode, use the ‘-d’ +flag. Note that `only' doctests will be refactored. This also doesn’t +require the module to be valid Python. For example, doctest like +examples in a reST document could also be refactored with this option. + +The ‘-v’ option enables output of more information on the translation +process. + +Since some print statements can be parsed as function calls or +statements, 2to3 cannot always read files containing the print function. +When 2to3 detects the presence of the ‘from __future__ import +print_function’ compiler directive, it modifies its internal grammar to +interpret *note print(): c13. as a function. This change can also be +enabled manually with the ‘-p’ flag. Use ‘-p’ to run fixers on code +that already has had its print statements converted. Also ‘-e’ can be +used to make *note exec(): 4a8. a function. + +The ‘-o’ or ‘--output-dir’ option allows specification of an alternate +directory for processed output files to be written to. The ‘-n’ flag is +required when using this as backup files do not make sense when not +overwriting the input files. + +New in version 3.2.3: The ‘-o’ option was added. + +The ‘-W’ or ‘--write-unchanged-files’ flag tells 2to3 to always write +output files even if no changes were required to the file. This is most +useful with ‘-o’ so that an entire Python source tree is copied with +translation from one directory to another. This option implies the ‘-w’ +flag as it would not make sense otherwise. + +New in version 3.2.3: The ‘-W’ flag was added. + +The ‘--add-suffix’ option specifies a string to append to all output +filenames. The ‘-n’ flag is required when specifying this as backups +are not necessary when writing to different filenames. Example: + + $ 2to3 -n -W --add-suffix=3 example.py + +Will cause a converted file named ‘example.py3’ to be written. + +New in version 3.2.3: The ‘--add-suffix’ option was added. + +To translate an entire project from one directory tree to another use: + + $ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode + + +File: python.info, Node: Fixers, Next: lib2to3 — 2to3’s library, Prev: Using 2to3, Up: 2to3 — Automated Python 2 to 3 code translation + +5.26.11.2 Fixers +................ + +Each step of transforming code is encapsulated in a fixer. The command +‘2to3 -l’ lists them. As *note documented above: 3921, each can be +turned on and off individually. They are described here in more detail. + + -- 2to3fixer: apply + + Removes usage of ‘apply()’. For example ‘apply(function, *args, + **kwargs)’ is converted to ‘function(*args, **kwargs)’. + + -- 2to3fixer: asserts + + Replaces deprecated *note unittest: 125. method names with the + correct ones. + + From To + + ------------------------------------------------------------------------------------ + + ‘failUnlessEqual(a, b)’ *note assertEqual(a, b): ee2. + + + ‘assertEquals(a, b)’ *note assertEqual(a, b): ee2. + + + ‘failIfEqual(a, b)’ *note assertNotEqual(a, b): ee3. + + + ‘assertNotEquals(a, b)’ *note assertNotEqual(a, b): ee3. + + + ‘failUnless(a)’ *note assertTrue(a): ee1. + + + ‘assert_(a)’ *note assertTrue(a): ee1. + + + ‘failIf(a)’ *note assertFalse(a): fd1. + + + ‘failUnlessRaises(exc, cal)’ *note assertRaises(exc, cal): e16. + + + ‘failUnlessAlmostEqual(a, b)’ *note assertAlmostEqual(a, b): ee4. + + + ‘assertAlmostEquals(a, b)’ *note assertAlmostEqual(a, b): ee4. + + + ‘failIfAlmostEqual(a, b)’ *note assertNotAlmostEqual(a, b): ee5. + + + ‘assertNotAlmostEquals(a, b)’ *note assertNotAlmostEqual(a, b): ee5. + + + -- 2to3fixer: basestring + + Converts ‘basestring’ to *note str: 1b3. + + -- 2to3fixer: buffer + + Converts ‘buffer’ to *note memoryview: 6ad. This fixer is optional + because the *note memoryview: 6ad. API is similar but not exactly + the same as that of ‘buffer’. + + -- 2to3fixer: dict + + Fixes dictionary iteration methods. ‘dict.iteritems()’ is + converted to *note dict.items(): 3ba, ‘dict.iterkeys()’ to *note + dict.keys(): 3b8, and ‘dict.itervalues()’ to *note dict.values(): + 3b9. Similarly, ‘dict.viewitems()’, ‘dict.viewkeys()’ and + ‘dict.viewvalues()’ are converted respectively to *note + dict.items(): 3ba, *note dict.keys(): 3b8. and *note dict.values(): + 3b9. It also wraps existing usages of *note dict.items(): 3ba, + *note dict.keys(): 3b8, and *note dict.values(): 3b9. in a call to + *note list: 1e9. + + -- 2to3fixer: except + + Converts ‘except X, T’ to ‘except X as T’. + + -- 2to3fixer: exec + + Converts the ‘exec’ statement to the *note exec(): 4a8. function. + + -- 2to3fixer: execfile + + Removes usage of ‘execfile()’. The argument to ‘execfile()’ is + wrapped in calls to *note open(): 30b, *note compile(): 310, and + *note exec(): 4a8. + + -- 2to3fixer: exitfunc + + Changes assignment of ‘sys.exitfunc’ to use of the *note atexit: b. + module. + + -- 2to3fixer: filter + + Wraps *note filter(): 461. usage in a *note list: 1e9. call. + + -- 2to3fixer: funcattrs + + Fixes function attributes that have been renamed. For example, + ‘my_function.func_closure’ is converted to + ‘my_function.__closure__’. + + -- 2to3fixer: future + + Removes ‘from __future__ import new_feature’ statements. + + -- 2to3fixer: getcwdu + + Renames ‘os.getcwdu()’ to *note os.getcwd(): 1432. + + -- 2to3fixer: has_key + + Changes ‘dict.has_key(key)’ to ‘key in dict’. + + -- 2to3fixer: idioms + + This optional fixer performs several transformations that make + Python code more idiomatic. Type comparisons like ‘type(x) is + SomeClass’ and ‘type(x) == SomeClass’ are converted to + ‘isinstance(x, SomeClass)’. ‘while 1’ becomes ‘while True’. This + fixer also tries to make use of *note sorted(): 833. in appropriate + places. For example, this block + + L = list(some_iterable) + L.sort() + + is changed to + + L = sorted(some_iterable) + + -- 2to3fixer: import + + Detects sibling imports and converts them to relative imports. + + -- 2to3fixer: imports + + Handles module renames in the standard library. + + -- 2to3fixer: imports2 + + Handles other modules renames in the standard library. It is + separate from the *note imports: 3944. fixer only because of + technical limitations. + + -- 2to3fixer: input + + Converts ‘input(prompt)’ to ‘eval(input(prompt))’. + + -- 2to3fixer: intern + + Converts ‘intern()’ to *note sys.intern(): f7f. + + -- 2to3fixer: isinstance + + Fixes duplicate types in the second argument of *note isinstance(): + 3ab. For example, ‘isinstance(x, (int, int))’ is converted to + ‘isinstance(x, int)’ and ‘isinstance(x, (int, float, int))’ is + converted to ‘isinstance(x, (int, float))’. + + -- 2to3fixer: itertools_imports + + Removes imports of ‘itertools.ifilter()’, ‘itertools.izip()’, and + ‘itertools.imap()’. Imports of ‘itertools.ifilterfalse()’ are also + changed to *note itertools.filterfalse(): 1bad. + + -- 2to3fixer: itertools + + Changes usage of ‘itertools.ifilter()’, ‘itertools.izip()’, and + ‘itertools.imap()’ to their built-in equivalents. + ‘itertools.ifilterfalse()’ is changed to *note + itertools.filterfalse(): 1bad. + + -- 2to3fixer: long + + Renames ‘long’ to *note int: 1c7. + + -- 2to3fixer: map + + Wraps *note map(): 460. in a *note list: 1e9. call. It also + changes ‘map(None, x)’ to ‘list(x)’. Using ‘from future_builtins + import map’ disables this fixer. + + -- 2to3fixer: metaclass + + Converts the old metaclass syntax (‘__metaclass__ = Meta’ in the + class body) to the new (‘class X(metaclass=Meta)’). + + -- 2to3fixer: methodattrs + + Fixes old method attribute names. For example, ‘meth.im_func’ is + converted to ‘meth.__func__’. + + -- 2to3fixer: ne + + Converts the old not-equal syntax, ‘<>’, to ‘!=’. + + -- 2to3fixer: next + + Converts the use of iterator’s ‘next()’ methods to the *note + next(): 3c7. function. It also renames *note next(): 3c7. methods + to *note __next__(): f76. + + -- 2to3fixer: nonzero + + Renames definitions of methods called ‘__nonzero__()’ to *note + __bool__(): 1914. + + -- 2to3fixer: numliterals + + Converts octal literals into the new syntax. + + -- 2to3fixer: operator + + Converts calls to various functions in the *note operator: c0. + module to other, but equivalent, function calls. When needed, the + appropriate ‘import’ statements are added, e.g. ‘import + collections.abc’. The following mapping are made: + + From To + + ----------------------------------------------------------------------------------------- + + ‘operator.isCallable(obj)’ ‘callable(obj)’ + + + ‘operator.sequenceIncludes(obj)’ ‘operator.contains(obj)’ + + + ‘operator.isSequenceType(obj)’ ‘isinstance(obj, collections.abc.Sequence)’ + + + ‘operator.isMappingType(obj)’ ‘isinstance(obj, collections.abc.Mapping)’ + + + ‘operator.isNumberType(obj)’ ‘isinstance(obj, numbers.Number)’ + + + ‘operator.repeat(obj, n)’ ‘operator.mul(obj, n)’ + + + ‘operator.irepeat(obj, n)’ ‘operator.imul(obj, n)’ + + + -- 2to3fixer: paren + + Add extra parenthesis where they are required in list + comprehensions. For example, ‘[x for x in 1, 2]’ becomes ‘[x for x + in (1, 2)]’. + + -- 2to3fixer: print + + Converts the ‘print’ statement to the *note print(): c13. function. + + -- 2to3fixer: raise + + Converts ‘raise E, V’ to ‘raise E(V)’, and ‘raise E, V, T’ to + ‘raise E(V).with_traceback(T)’. If ‘E’ is a tuple, the translation + will be incorrect because substituting tuples for exceptions has + been removed in 3.0. + + -- 2to3fixer: raw_input + + Converts ‘raw_input()’ to *note input(): f7c. + + -- 2to3fixer: reduce + + Handles the move of ‘reduce()’ to *note functools.reduce(): f80. + + -- 2to3fixer: reload + + Converts ‘reload()’ to *note importlib.reload(): 79d. + + -- 2to3fixer: renames + + Changes ‘sys.maxint’ to *note sys.maxsize: e77. + + -- 2to3fixer: repr + + Replaces backtick repr with the *note repr(): 3ee. function. + + -- 2to3fixer: set_literal + + Replaces use of the *note set: 1a6. constructor with set literals. + This fixer is optional. + + -- 2to3fixer: standarderror + + Renames ‘StandardError’ to *note Exception: 61c. + + -- 2to3fixer: sys_exc + + Changes the deprecated ‘sys.exc_value’, ‘sys.exc_type’, + ‘sys.exc_traceback’ to use *note sys.exc_info(): 25b. + + -- 2to3fixer: throw + + Fixes the API change in generator’s ‘throw()’ method. + + -- 2to3fixer: tuple_params + + Removes implicit tuple parameter unpacking. This fixer inserts + temporary variables. + + -- 2to3fixer: types + + Fixes code broken from the removal of some members in the *note + types: 122. module. + + -- 2to3fixer: unicode + + Renames ‘unicode’ to *note str: 1b3. + + -- 2to3fixer: urllib + + Handles the rename of *note urllib: 127. and ‘urllib2’ to the *note + urllib: 127. package. + + -- 2to3fixer: ws_comma + + Removes excess whitespace from comma separated items. This fixer + is optional. + + -- 2to3fixer: xrange + + Renames ‘xrange()’ to *note range(): 58b. and wraps existing *note + range(): 58b. calls with *note list: 1e9. + + -- 2to3fixer: xreadlines + + Changes ‘for x in file.xreadlines()’ to ‘for x in file’. + + -- 2to3fixer: zip + + Wraps *note zip(): 3bc. usage in a *note list: 1e9. call. This is + disabled when ‘from future_builtins import zip’ appears. + + +File: python.info, Node: lib2to3 — 2to3’s library, Prev: Fixers, Up: 2to3 — Automated Python 2 to 3 code translation + +5.26.11.3 ‘lib2to3’ — 2to3’s library +.................................... + +`Source code:' Lib/lib2to3/(1) + +__________________________________________________________________ + +Deprecated since version 3.11, will be removed in version 3.13: Python +3.9 switched to a PEG parser (see PEP 617(2)) while lib2to3 is using a +less flexible LL(1) parser. Python 3.10 includes new language syntax +that is not parsable by lib2to3’s LL(1) parser (see PEP 634(3)). The +‘lib2to3’ module was marked pending for deprecation in Python 3.9 +(raising *note PendingDeprecationWarning: 503. on import) and fully +deprecated in Python 3.11 (raising *note DeprecationWarning: 2d4.). It +will be removed from the standard library in Python 3.13. Consider +third-party alternatives such as LibCST(4) or parso(5). + + Note: The *note lib2to3: a5. API should be considered unstable and + may change drastically in the future. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/lib2to3/ + + (2) https://peps.python.org/pep-0617/ + + (3) https://peps.python.org/pep-0634/ + + (4) https://libcst.readthedocs.io/ + + (5) https://parso.readthedocs.io/ + + +File: python.info, Node: test — Regression tests package for Python, Next: test support — Utilities for the Python test suite, Prev: 2to3 — Automated Python 2 to 3 code translation, Up: Development Tools + +5.26.12 ‘test’ — Regression tests package for Python +---------------------------------------------------- + + Note: The *note test: 101. 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. + +__________________________________________________________________ + +The *note test: 101. package contains all regression tests for Python as +well as the modules *note test.support: 102. and ‘test.regrtest’. *note +test.support: 102. is used to enhance your tests while ‘test.regrtest’ +drives the testing suite. + +Each module in the *note test: 101. package whose name starts with +‘test_’ is a testing suite for a specific module or feature. All new +tests should be written using the *note unittest: 125. or *note doctest: +63. module. Some older tests are written using a “traditional” testing +style that compares output printed to ‘sys.stdout’; this style of test +is considered deprecated. + +See also +........ + +Module *note unittest: 125. + + Writing PyUnit regression tests. + +Module *note doctest: 63. + + Tests embedded in documentation strings. + +* Menu: + +* Writing Unit Tests for the test package:: +* Running tests using the command-line interface:: + + +File: python.info, Node: Writing Unit Tests for the test package, Next: Running tests using the command-line interface, Up: test — Regression tests package for Python + +5.26.12.1 Writing Unit Tests for the ‘test’ package +................................................... + +It is preferred that tests that use the *note unittest: 125. module +follow a few guidelines. One is to name the test module by starting it +with ‘test_’ and end it with the name of the module being tested. The +test methods in the test module should start with ‘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 ‘# 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: + + 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() + +This code pattern allows the testing suite to be run by ‘test.regrtest’, +on its own as a script that supports the *note unittest: 125. CLI, or +via the ‘python -m unittest’ CLI. + +The goal for regression testing is to try to break code. This leads to +a few guidelines to be followed: + + * 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. + + * 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. + + * 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. + + * 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. + + * 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. + + * Make sure to clean up after your tests (such as close and remove + all temporary files). + + * If a test is dependent on a specific condition of the operating + system then verify the condition already exists before attempting + the test. + + * 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. + + * 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: + + 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) + + When using this pattern, remember that all classes that inherit + from *note unittest.TestCase: 282. are run as tests. The ‘Mixin’ + class in the example above does not have any data and so can’t be + run by itself, thus it does not inherit from *note + unittest.TestCase: 282. + +See also +........ + +Test Driven Development + + A book by Kent Beck on writing tests before code. + + +File: python.info, Node: Running tests using the command-line interface, Prev: Writing Unit Tests for the test package, Up: test — Regression tests package for Python + +5.26.12.2 Running tests using the command-line interface +........................................................ + +The *note test: 101. package can be run as a script to drive Python’s +regression test suite, thanks to the *note -m: 1ae. option: ‘python -m +test’. Under the hood, it uses ‘test.regrtest’; the call ‘python -m +test.regrtest’ used in previous Python versions still works. Running +the script by itself automatically starts running all regression tests +in the *note test: 101. package. It does this by finding all modules in +the package whose name starts with ‘test_’, importing them, and +executing the function ‘test_main()’ if present or loading the tests via +unittest.TestLoader.loadTestsFromModule if ‘test_main’ does not exist. +The names of tests to execute may also be passed to the script. +Specifying a single regression test (‘python -m test test_spam’) will +minimize output and only print whether the test passed or failed. + +Running *note test: 101. directly allows what resources are available +for tests to use to be set. You do this by using the ‘-u’ command-line +option. Specifying ‘all’ as the value for the ‘-u’ option enables all +possible resources: ‘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 ‘all’. The command ‘python -m test +-uall,-audio,-largefile’ will run *note test: 101. with all resources +except the ‘audio’ and ‘largefile’ resources. For a list of all +resources and more command-line options, run ‘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 ‘make test’ at +the top-level directory where Python was built. On Windows, executing +‘rt.bat’ from your ‘PCbuild’ directory will run all regression tests. + + +File: python.info, Node: test support — Utilities for the Python test suite, Next: test support socket_helper — Utilities for socket tests, Prev: test — Regression tests package for Python, Up: Development Tools + +5.26.13 ‘test.support’ — Utilities for the Python test suite +------------------------------------------------------------ + +The *note test.support: 102. module provides support for Python’s +regression test suite. + + Note: *note test.support: 102. 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. + +This module defines the following exceptions: + + -- Exception: test.support.TestFailed + + Exception to be raised when a test fails. This is deprecated in + favor of *note unittest: 125.-based tests and *note + unittest.TestCase: 282.’s assertion methods. + + -- Exception: test.support.ResourceDenied + + Subclass of *note unittest.SkipTest: c86. Raised when a resource + (such as a network connection) is not available. Raised by the + *note requires(): 3995. function. + +The *note test.support: 102. module defines the following constants: + + -- Data: test.support.verbose + + ‘True’ when verbose output is enabled. Should be checked when more + detailed information is desired about a running test. `verbose' is + set by ‘test.regrtest’. + + -- Data: test.support.is_jython + + ‘True’ if the running interpreter is Jython. + + -- Data: test.support.is_android + + ‘True’ if the system is Android. + + -- Data: test.support.unix_shell + + Path for shell if not on Windows; otherwise ‘None’. + + -- Data: test.support.LOOPBACK_TIMEOUT + + Timeout in seconds for tests using a network server listening on + the network local loopback interface like ‘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 *note connect(): a21, *note + recv(): a22. and *note send(): a25. methods of *note socket.socket: + a1f. + + Its default value is 5 seconds. + + See also *note INTERNET_TIMEOUT: 13d5. + + -- 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 *note INTERNET_TIMEOUT: 13d5. should not + mark a test as failed, but skip the test instead: see *note + transient_internet(): 399a. + + Its default value is 1 minute. + + See also *note LOOPBACK_TIMEOUT: 13d4. + + -- 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 ‘--timeout’ command line + option. + + If a test using *note SHORT_TIMEOUT: 12b1. starts to fail randomly + on slow buildbots, use *note LONG_TIMEOUT: 13d6. instead. + + Its default value is 30 seconds. + + -- 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 ‘--timeout’ command line option. + + Its default value is 5 minutes. + + See also *note LOOPBACK_TIMEOUT: 13d4, *note INTERNET_TIMEOUT: + 13d5. and *note SHORT_TIMEOUT: 12b1. + + -- Data: test.support.PGO + + Set when tests can be skipped when they are not useful for PGO. + + -- Data: test.support.PIPE_MAX_SIZE + + A constant that is likely larger than the underlying OS pipe buffer + size, to make writes blocking. + + -- Data: test.support.SOCK_MAX_SIZE + + A constant that is likely larger than the underlying OS socket + buffer size, to make writes blocking. + + -- Data: test.support.TEST_SUPPORT_DIR + + Set to the top level directory that contains *note test.support: + 102. + + -- Data: test.support.TEST_HOME_DIR + + Set to the top level directory for the test package. + + -- Data: test.support.TEST_DATA_DIR + + Set to the ‘data’ directory within the test package. + + -- Data: test.support.MAX_Py_ssize_t + + Set to *note sys.maxsize: e77. for big memory tests. + + -- Data: test.support.max_memuse + + Set by *note set_memlimit(): 39a3. as the memory limit for big + memory tests. Limited by *note MAX_Py_ssize_t: 39a1. + + -- Data: test.support.real_max_memuse + + Set by *note set_memlimit(): 39a3. as the memory limit for big + memory tests. Not limited by *note MAX_Py_ssize_t: 39a1. + + -- Data: test.support.MISSING_C_DOCSTRINGS + + Set to ‘True’ if Python is built without docstrings (the + ‘WITH_DOC_STRINGS’ macro is not defined). See the *note configure + –without-doc-strings: 17c1. option. + + See also the *note HAVE_DOCSTRINGS: 39a6. variable. + + -- Data: test.support.HAVE_DOCSTRINGS + + Set to ‘True’ if function docstrings are available. See the *note + python -OO: a34. option, which strips docstrings of functions + implemented in Python. + + See also the *note MISSING_C_DOCSTRINGS: 39a5. variable. + + -- Data: test.support.TEST_HTTP_URL + + Define the URL of a dedicated HTTP server for the network tests. + + -- Data: test.support.ALWAYS_EQ + + Object that is equal to anything. Used to test mixed type + comparison. + + -- Data: test.support.NEVER_EQ + + Object that is not equal to anything (even to *note ALWAYS_EQ: + 39a8.). Used to test mixed type comparison. + + -- Data: test.support.LARGEST + + Object that is greater than anything (except itself). Used to test + mixed type comparison. + + -- Data: test.support.SMALLEST + + Object that is less than anything (except itself). Used to test + mixed type comparison. + +The *note test.support: 102. module defines the following functions: + + -- Function: test.support.is_resource_enabled (resource) + + Return ‘True’ if `resource' is enabled and available. The list of + available resources is only set when ‘test.regrtest’ is executing + the tests. + + -- Function: test.support.python_is_optimized () + + Return ‘True’ if Python was not built with ‘-O0’ or ‘-Og’. + + -- Function: test.support.with_pymalloc () + + Return ‘_testcapi.WITH_PYMALLOC’. + + -- Function: test.support.requires (resource, msg=None) + + Raise *note ResourceDenied: 3994. if `resource' is not available. + `msg' is the argument to *note ResourceDenied: 3994. if it is + raised. Always returns ‘True’ if called by a function whose + ‘__name__’ is ‘'__main__'’. Used when tests are executed by + ‘test.regrtest’. + + -- Function: test.support.sortdict (dict) + + Return a repr of `dict' with keys sorted. + + -- 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. + + -- Function: test.support.match_test (test) + + Determine whether `test' matches the patterns set in *note + set_match_tests(): 39b2. + + -- Function: test.support.set_match_tests (accept_patterns=None, + ignore_patterns=None) + + Define match patterns on test filenames and test method names for + filtering tests. + + -- Function: test.support.run_unittest (*classes) + + Execute *note unittest.TestCase: 282. subclasses passed to the + function. The function scans the classes for methods starting with + the prefix ‘test_’ and executes the tests individually. + + It is also legal to pass strings as parameters; these should be + keys in ‘sys.modules’. Each associated module will be scanned by + ‘unittest.TestLoader.loadTestsFromModule()’. This is usually seen + in the following ‘test_main()’ function: + + def test_main(): + support.run_unittest(__name__) + + This will run all tests defined in the named module. + + -- Function: test.support.run_doctest (module, verbosity=None, + optionflags=0) + + Run *note doctest.testmod(): 10ce. on the given `module'. Return + ‘(failure_count, test_count)’. + + If `verbosity' is ‘None’, *note doctest.testmod(): 10ce. is run + with verbosity set to *note verbose: 3996. Otherwise, it is run + with verbosity set to ‘None’. `optionflags' is passed as + ‘optionflags’ to *note doctest.testmod(): 10ce. + + -- Function: test.support.setswitchinterval (interval) + + Set the *note sys.setswitchinterval(): 599. to the given + `interval'. Defines a minimum interval for Android systems to + prevent the system from hanging. + + -- 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 ‘True’ or ‘False’ depending on the host + platform. Example usage: + + check_impl_detail() # Only on CPython (default). + check_impl_detail(jython=True) # Only on Jython. + check_impl_detail(cpython=False) # Everywhere except CPython. + + -- Function: test.support.set_memlimit (limit) + + Set the values for *note max_memuse: 39a2. and *note + real_max_memuse: 39a4. for big memory tests. + + -- 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. + + -- Function: test.support.get_original_stdout () + + Return the original stdout set by *note record_original_stdout(): + 39b6. or ‘sys.stdout’ if it’s not set. + + -- Function: test.support.args_from_interpreter_flags () + + Return a list of command line arguments reproducing the current + settings in ‘sys.flags’ and ‘sys.warnoptions’. + + -- Function: test.support.optim_args_from_interpreter_flags () + + Return a list of command line arguments reproducing the current + optimization settings in ‘sys.flags’. + + -- Function: test.support.captured_stdin () + -- Function: test.support.captured_stdout () + -- Function: test.support.captured_stderr () + + A context managers that temporarily replaces the named stream with + *note io.StringIO: bbe. object. + + Example use with output streams: + + 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" + + Example use with input stream: + + 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") + + -- Function: test.support.disable_faulthandler () + + A context manager that temporary disables *note faulthandler: 78. + + -- 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 ‘__del__’ methods may be called later + than expected and weakrefs may remain alive for longer than + expected. + + -- 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. + + -- Function: test.support.swap_attr (obj, attr, new_val) + + Context manager to swap out an attribute with a new object. + + Usage: + + with swap_attr(obj, "attr", 5): + ... + + This will set ‘obj.attr’ to 5 for the duration of the ‘with’ block, + restoring the old value at the end of the block. If ‘attr’ doesn’t + exist on ‘obj’, it will be created and then deleted at the end of + the block. + + The old value (or ‘None’ if it doesn’t exist) will be assigned to + the target of the “as” clause, if there is one. + + -- Function: test.support.swap_item (obj, attr, new_val) + + Context manager to swap out an item with a new object. + + Usage: + + with swap_item(obj, "item", 5): + ... + + This will set ‘obj["item"]’ to 5 for the duration of the ‘with’ + block, restoring the old value at the end of the block. If ‘item’ + doesn’t exist on ‘obj’, it will be created and then deleted at the + end of the block. + + The old value (or ‘None’ if it doesn’t exist) will be assigned to + the target of the “as” clause, if there is one. + + -- Function: test.support.flush_std_streams () + + Call the ‘flush()’ method on *note sys.stdout: 72a. and then on + *note sys.stderr: 581. It can be used to make sure that the logs + order is consistent before writing into stderr. + + New in version 3.11. + + -- Function: test.support.print_warning (msg) + + Print a warning into *note sys.__stderr__: 39c3. Format the + message as: ‘f"Warning -- {msg}"’. If `msg' is made of multiple + lines, add ‘"Warning -- "’ prefix to each line. + + New in version 3.9. + + -- 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 *note AssertionError: 26e. if the process exit code is not + equal to `exitcode'. + + If the process runs longer than `timeout' seconds (*note + SHORT_TIMEOUT: 12b1. by default), kill the process and raise an + *note AssertionError: 26e. The timeout feature is not available on + Windows. + + New in version 3.9. + + -- Function: test.support.calcobjsize (fmt) + + Return the size of the *note PyObject: 4cf. whose structure members + are defined by `fmt'. The returned value includes the size of the + Python object header and alignment. + + -- Function: test.support.calcvobjsize (fmt) + + Return the size of the *note PyVarObject: 39c6. whose structure + members are defined by `fmt'. The returned value includes the size + of the Python object header and alignment. + + -- Function: test.support.checksizeof (test, o, size) + + For testcase `test', assert that the ‘sys.getsizeof’ for `o' plus + the GC header size equals `size'. + + -- Function: @test.support.anticipate_failure (condition) + + A decorator to conditionally mark tests with *note + unittest.expectedFailure(): 3876. Any use of this decorator should + have an associated comment identifying the relevant tracker issue. + + -- Function: test.support.system_must_validate_cert (f) + + A decorator that skips the decorated test on TLS certification + validation failures. + + -- 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 ‘"LC_ALL"’). The `locales' + passed will be tried sequentially, and the first valid locale will + be used. + + -- Function: @test.support.run_with_tz (tz) + + A decorator for running a function in a specific timezone, + correctly resetting it after it has finished. + + -- 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. + + -- 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. + + -- 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. + + -- Function: @test.support.requires_IEEE_754 + + Decorator for skipping tests on non-IEEE 754 platforms. + + -- Function: @test.support.requires_zlib + + Decorator for skipping tests if *note zlib: 14f. doesn’t exist. + + -- Function: @test.support.requires_gzip + + Decorator for skipping tests if *note gzip: 87. doesn’t exist. + + -- Function: @test.support.requires_bz2 + + Decorator for skipping tests if *note bz2: 12. doesn’t exist. + + -- Function: @test.support.requires_lzma + + Decorator for skipping tests if *note lzma: ab. doesn’t exist. + + -- Function: @test.support.requires_resource (resource) + + Decorator for skipping tests if `resource' is not available. + + -- Function: @test.support.requires_docstrings + + Decorator for only running the test if *note HAVE_DOCSTRINGS: 39a6. + + -- Function: @test.support.cpython_only + + Decorator for tests only applicable to CPython. + + -- Function: @test.support.impl_detail (msg=None, **guards) + + Decorator for invoking *note check_impl_detail(): 39b5. on + `guards'. If that returns ‘False’, then uses `msg' as the reason + for skipping the test. + + -- Function: @test.support.no_tracing + + Decorator to temporarily turn off tracing for the duration of the + test. + + -- 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. + + -- 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 + ‘@bigmemtest(size=_4G, memuse=2)’. + + The `size' argument is normally passed to the decorated test method + as an extra argument. If `dry_run' is ‘True’, the value passed to + the test method may be less than the requested value. If `dry_run' + is ‘False’, it means the test doesn’t support dummy runs when ‘-M’ + is not specified. + + -- Function: @test.support.bigaddrspacetest + + Decorator for tests that fill the address space. + + -- Function: test.support.check_syntax_error (testcase, statement, + errtext='', *, lineno=None, offset=None) + + Test for syntax errors in `statement' by attempting to compile + `statement'. `testcase' is the *note unittest: 125. instance for + the test. `errtext' is the regular expression which should match + the string representation of the raised *note SyntaxError: 2d6. If + `lineno' is not ‘None’, compares to the line of the exception. If + `offset' is not ‘None’, compares to the offset of the exception. + + -- Function: test.support.open_urlresource (url, *args, **kw) + + Open `url'. If open fails, raises *note TestFailed: 3993. + + -- Function: test.support.reap_children () + + Use this at the end of ‘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. + + -- Function: test.support.get_attribute (obj, name) + + Get an attribute, raising *note unittest.SkipTest: c86. if *note + AttributeError: 19d. is raised. + + -- Function: test.support.catch_unraisable_exception () + + Context manager catching unraisable exception using *note + sys.unraisablehook(): 24e. + + Storing the exception value (‘cm.unraisable.exc_value’) creates a + reference cycle. The reference cycle is broken explicitly when the + context manager exits. + + Storing the object (‘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: + + 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) + + New in version 3.8. + + -- Function: test.support.load_package_tests (pkg_dir, loader, + standard_tests, pattern) + + Generic implementation of the *note unittest: 125. ‘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 ‘load_tests’. In simple cases, the test + package’s ‘__init__.py’ can be the following: + + import os + from test.support import load_package_tests + + def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) + + -- 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 + ‘__’. + + New in version 3.5. + + -- 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'. + + -- Function: test.support.run_in_subinterp (code) + + Run `code' in subinterpreter. Raise *note unittest.SkipTest: c86. + if *note tracemalloc: 11e. is enabled. + + -- Function: test.support.check_free_after_iterating (test, iter, cls, + args=()) + + Assert instances of `cls' are deallocated after iterating. + + -- 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 + ‘None’ when none is found missing. + + -- Function: test.support.check__all__ (test_case, module, + name_of_module=None, extra=(), not_exported=()) + + Assert that the ‘__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 ‘csv’ and its ‘_csv’). + + The `extra' argument can be a set of names that wouldn’t otherwise + be automatically detected as “public”, like objects without a + proper ‘__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: + + 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) + + New in version 3.6. + + -- Function: test.support.skip_if_broken_multiprocessing_synchronize () + + Skip tests if the ‘multiprocessing.synchronize’ module is missing, + if there is no available semaphore implementation, or if creating a + lock raises an *note OSError: 413. + + New in version 3.10. + + -- Function: test.support.check_disallow_instantiation (test_case, tp, + *args, **kwds) + + Assert that type `tp' cannot be instantiated using `args' and + `kwds'. + + New in version 3.10. + + -- Function: test.support.adjust_int_max_str_digits (max_digits) + + This function returns a context manager that will change the global + *note sys.set_int_max_str_digits(): 1184. 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. + + New in version 3.11. + +The *note test.support: 102. module defines the following classes: + + -- 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(1). + + On UNIX, *note resource.setrlimit(): 39e9. is used to set *note + resource.RLIMIT_CORE: 39ea.’s soft limit to 0 to prevent coredump + file creation. + + On both platforms, the old value is restored by ‘__exit__()’. + + -- Class: test.support.SaveSignals + + Class to save and restore signal handlers registered by the Python + signal handler. + + -- Method: save (self) + + Save the signal handlers to a dictionary mapping signal + numbers to the current signal handler. + + -- Method: restore (self) + + Set the signal numbers from the *note save(): 39ec. dictionary + to the saved handler. + + -- Class: test.support.Matcher + + -- Method: matches (self, d, **kwargs) + + Try to match a single dict with the supplied arguments. + + -- Method: match_value (self, k, dv, v) + + Try to match a single stored value (`dv') with a supplied + value (`v'). + + -- Class: test.support.BasicTestRunner + + -- Method: run (test) + + Run `test' and return the result. + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx + + +File: python.info, Node: test support socket_helper — Utilities for socket tests, Next: test support script_helper — Utilities for the Python execution tests, Prev: test support — Utilities for the Python test suite, Up: Development Tools + +5.26.14 ‘test.support.socket_helper’ — Utilities for socket tests +----------------------------------------------------------------- + +The *note test.support.socket_helper: 107. module provides support for +socket tests. + +New in version 3.9. + + -- Data: test.support.socket_helper.IPV6_ENABLED + + Set to ‘True’ if IPv6 is enabled on this host, ‘False’ otherwise. + + -- 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 ‘sock’ parameter (default is *note AF_INET: 1205, *note + SOCK_STREAM: f9a.), and binding it to the specified host address + (defaults to ‘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 *note bind_port(): 39f6. 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 ‘-accept’ argument to openssl’s + s_server mode). Always prefer *note bind_port(): 39f6. over *note + find_unused_port(): 39f5. 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. + + -- 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 ‘sock.family’ is *note AF_INET: 1205. and + ‘sock.type’ is *note SOCK_STREAM: f9a, and the socket has + ‘SO_REUSEADDR’ or ‘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 ‘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. + + -- Function: test.support.socket_helper.bind_unix_socket (sock, addr) + + Bind a Unix socket, raising *note unittest.SkipTest: c86. if *note + PermissionError: 9b9. is raised. + + -- Function: @test.support.socket_helper.skip_unless_bind_unix_socket + + A decorator for running tests that require a functional ‘bind()’ + for Unix sockets. + + -- Function: test.support.socket_helper.transient_internet + (resource_name, *, timeout=30.0, errnos=()) + + A context manager that raises *note ResourceDenied: 3994. when + various issues with the internet connection manifest themselves as + exceptions. + + +File: python.info, Node: test support script_helper — Utilities for the Python execution tests, Next: test support bytecode_helper — Support tools for testing correct bytecode generation, Prev: test support socket_helper — Utilities for socket tests, Up: Development Tools + +5.26.15 ‘test.support.script_helper’ — Utilities for the Python execution tests +------------------------------------------------------------------------------- + +The *note test.support.script_helper: 106. module provides support for +Python’s script execution tests. + + -- Function: + test.support.script_helper.interpreter_requires_environment () + + Return ‘True’ if ‘sys.executable interpreter’ requires environment + variables in order to be able to run at all. + + This is designed to be used with ‘@unittest.skipIf()’ to annotate + tests that need to use an ‘assert_python*()’ function to launch an + isolated mode (‘-I’) or no environment mode (‘-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 *note PYTHONHOME: 8ae. is one way to get most of the + testsuite to run in that situation. *note PYTHONPATH: cc7. or + ‘PYTHONUSERSITE’ are other common environment variables that might + impact whether or not the interpreter can start. + + -- 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 ‘__isolated’, + ‘__cleanenv’, ‘__cwd’, and ‘TERM’. + + Changed in version 3.9: The function no longer strips whitespaces + from `stderr'. + + -- 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 (‘rc == 0’) and return a + ‘(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 ‘-I’), + except if the `__isolated' keyword-only parameter is set to + ‘False’. + + Changed in version 3.9: The function no longer strips whitespaces + from `stderr'. + + -- 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 (‘rc != 0’) and return a + ‘(return code, stdout, stderr)’ tuple. + + See *note assert_python_ok(): 39fc. for more options. + + Changed in version 3.9: The function no longer strips whitespaces + from `stderr'. + + -- 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 *note subprocess.Popen(): + 6e8. Returns a *note subprocess.Popen: 6e8. object. + + -- Function: test.support.script_helper.kill_python (p) + + Run the given *note subprocess.Popen: 6e8. process until completion + and return stdout. + + -- 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 ‘False’, append ‘.py’ to + the name. Return the full script path. + + -- 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 + ‘zip’ which contains the files in `script_name'. `name_in_zip' is + the archive name. Return a tuple containing ‘(full path, full path + of archive name)’. + + -- Function: test.support.script_helper.make_pkg (pkg_dir, + init_source='') + + Create a directory named `pkg_dir' containing an ‘__init__’ file + with `init_source' as its contents. + + -- 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 ‘__init__’ file and a file + `script_basename' containing the `source'. If `compiled' is + ‘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. + + +File: python.info, Node: test support bytecode_helper — Support tools for testing correct bytecode generation, Next: test support threading_helper — Utilities for threading tests, Prev: test support script_helper — Utilities for the Python execution tests, Up: Development Tools + +5.26.16 ‘test.support.bytecode_helper’ — Support tools for testing correct bytecode generation +---------------------------------------------------------------------------------------------- + +The *note test.support.bytecode_helper: 103. module provides support for +testing and inspecting bytecode generation. + +New in version 3.9. + +The module defines the following class: + + -- Class: test.support.bytecode_helper.BytecodeTestCase + (unittest.TestCase) + + This class has custom assertion methods for inspecting bytecode. + + -- Method: BytecodeTestCase.get_disassembly_as_string (co) + + Return the disassembly of `co' as string. + + -- Method: BytecodeTestCase.assertInBytecode (x, opname, + argval=_UNSPECIFIED) + + Return instr if `opname' is found, otherwise throws *note + AssertionError: 26e. + + -- Method: BytecodeTestCase.assertNotInBytecode (x, opname, + argval=_UNSPECIFIED) + + Throws *note AssertionError: 26e. if `opname' is found. + + +File: python.info, Node: test support threading_helper — Utilities for threading tests, Next: test support os_helper — Utilities for os tests, Prev: test support bytecode_helper — Support tools for testing correct bytecode generation, Up: Development Tools + +5.26.17 ‘test.support.threading_helper’ — Utilities for threading tests +----------------------------------------------------------------------- + +The *note test.support.threading_helper: 108. module provides support +for threading tests. + +New in version 3.10. + + -- Function: test.support.threading_helper.join_thread (thread, + timeout=None) + + Join a `thread' within `timeout'. Raise an *note AssertionError: + 26e. if thread is still alive after `timeout' seconds. + + -- Function: @test.support.threading_helper.reap_threads + + Decorator to ensure the threads are cleaned up even if the test + fails. + + -- 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 *note + threading.Event.set(): 2961. ‘start_threads’ will attempt to join + the started threads upon exit. + + -- 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. + + -- Function: test.support.threading_helper.threading_setup () + + Return current thread count and copy of dangling threads. + + -- Function: test.support.threading_helper.wait_threads_exit + (timeout=None) + + Context manager to wait until all threads created in the ‘with’ + statement exit. + + -- Function: test.support.threading_helper.catch_threading_exception () + + Context manager catching *note threading.Thread: 59b. exception + using *note threading.excepthook(): 442. + + Attributes set when an exception is caught: + + * ‘exc_type’ + + * ‘exc_value’ + + * ‘exc_traceback’ + + * ‘thread’ + + See *note threading.excepthook(): 442. documentation. + + These attributes are deleted at the context manager exit. + + Usage: + + 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) + + New in version 3.8. + + +File: python.info, Node: test support os_helper — Utilities for os tests, Next: test support import_helper — Utilities for import tests, Prev: test support threading_helper — Utilities for threading tests, Up: Development Tools + +5.26.18 ‘test.support.os_helper’ — Utilities for os tests +--------------------------------------------------------- + +The *note test.support.os_helper: 105. module provides support for os +tests. + +New in version 3.10. + + -- Data: test.support.os_helper.FS_NONASCII + + A non-ASCII character encodable by *note os.fsencode(): 8c3. + + -- Data: test.support.os_helper.SAVEDCWD + + Set to *note os.getcwd(): 1432. + + -- 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). + + -- Data: test.support.os_helper.TESTFN_NONASCII + + Set to a filename containing the *note FS_NONASCII: 3a12. + 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. + + -- 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 ‘None’ if it’s + not possible to generate such a filename. + + -- 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 ‘None’ + if it’s not possible to generate such a filename. + + -- Data: test.support.os_helper.TESTFN_UNICODE + + Set to a non-ASCII name for a temporary file. + + -- 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 + ‘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. + + -- Class: test.support.os_helper.FakePath (path) + + Simple *note path-like object: 773. It implements the + ‘__fspath__()’ method which just returns the `path' argument. If + `path' is an exception, it will be raised in ‘__fspath__()’. + + -- Method: EnvironmentVarGuard.set (envvar, value) + + Temporarily set the environment variable ‘envvar’ to the value of + ‘value’. + + -- Method: EnvironmentVarGuard.unset (envvar) + + Temporarily unset the environment variable ‘envvar’. + + -- Function: test.support.os_helper.can_symlink () + + Return ‘True’ if the OS supports symbolic links, ‘False’ otherwise. + + -- Function: test.support.os_helper.can_xattr () + + Return ‘True’ if the OS supports xattr, ‘False’ otherwise. + + -- 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 ‘False’, the context manager raises an exception on + error. Otherwise, it issues only a warning and keeps the current + working directory the same. + + -- Function: test.support.os_helper.create_empty_file (filename) + + Create an empty file with `filename'. If it already exists, + truncate it. + + -- Function: test.support.os_helper.fd_count () + + Count the number of open file descriptors. + + -- Function: test.support.os_helper.fs_is_case_insensitive (directory) + + Return ‘True’ if the file system for `directory' is + case-insensitive. + + -- Function: test.support.os_helper.make_bad_fd () + + Create an invalid file descriptor by opening and closing a + temporary file, and returning its descriptor. + + -- Function: test.support.os_helper.rmdir (filename) + + Call *note os.rmdir(): d9f. 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. + + -- Function: test.support.os_helper.rmtree (path) + + Call *note shutil.rmtree(): 23f. on `path' or call *note + os.lstat(): 654. and *note os.rmdir(): d9f. to remove a path and + its contents. As with *note rmdir(): 3a24, on Windows platforms + this is wrapped with a wait loop that checks for the existence of + the files. + + -- Function: @test.support.os_helper.skip_unless_symlink + + A decorator for running tests that require support for symbolic + links. + + -- Function: @test.support.os_helper.skip_unless_xattr + + A decorator for running tests that require support for xattr. + + -- 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 ‘None’, the temporary directory is + created using *note tempfile.mkdtemp(): 2270. + + If `quiet' is ‘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. + + -- 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 ‘None’, the temporary directory is created using *note + tempfile.mkdtemp(): 2270. If `quiet' is ‘False’, the context + manager raises an exception on error. Otherwise, if `path' is + specified and cannot be created, only a warning is issued. + + -- Function: test.support.os_helper.temp_umask (umask) + + A context manager that temporarily sets the process umask. + + -- Function: test.support.os_helper.unlink (filename) + + Call *note os.unlink(): da1. on `filename'. As with *note rmdir(): + 3a24, on Windows platforms, this is wrapped with a wait loop that + checks for the existence of the file. + + +File: python.info, Node: test support import_helper — Utilities for import tests, Next: test support warnings_helper — Utilities for warnings tests, Prev: test support os_helper — Utilities for os tests, Up: Development Tools + +5.26.19 ‘test.support.import_helper’ — Utilities for import tests +----------------------------------------------------------------- + +The *note test.support.import_helper: 104. module provides support for +import tests. + +New in version 3.10. + + -- Function: test.support.import_helper.forget (module_name) + + Remove the module named `module_name' from ‘sys.modules’ and delete + any byte-compiled files of the module. + + -- 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 ‘sys.modules’ before doing + the import. Note that unlike ‘reload()’, the original module is + not affected by this operation. + + `fresh' is an iterable of additional module names that are also + removed from the ‘sys.modules’ cache before doing the import. + + `blocked' is an iterable of module names that are replaced with + ‘None’ in the module cache during the import to ensure that + attempts to import them raise *note ImportError: 511. + + The named module and any modules named in the `fresh' and `blocked' + parameters are saved before starting the import and then reinserted + into ‘sys.modules’ when the fresh import is complete. + + Module and package deprecation messages are suppressed during this + import if `deprecated' is ‘True’. + + This function will raise *note ImportError: 511. if the named + module cannot be imported. + + Example use: + + # 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']) + + New in version 3.1. + + -- 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 *note unittest.SkipTest: c86. + if the module cannot be imported. + + Module and package deprecation messages are suppressed during this + import if `deprecated' is ‘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 *note + sys.platform: 6e0. + + New in version 3.1. + + -- Function: test.support.import_helper.modules_setup () + + Return a copy of *note sys.modules: 1382. + + -- Function: test.support.import_helper.modules_cleanup (oldmodules) + + Remove modules except for `oldmodules' and ‘encodings’ in order to + preserve internal cache. + + -- Function: test.support.import_helper.unload (name) + + Delete `name' from ‘sys.modules’. + + -- Function: test.support.import_helper.make_legacy_pyc (source) + + Move a PEP 3147(1)/ PEP 488(2) 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. + + -- 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 *note DeprecationWarning: 2d4. on import. Example + usage: + + with CleanImport('foo'): + importlib.import_module('foo') # New reference. + + -- Class: test.support.import_helper.DirsOnSysPath (*paths) + + A context manager to temporarily add directories to *note sys.path: + 162. + + This makes a copy of *note sys.path: 162, appends any directories + given as positional arguments, then reverts *note sys.path: 162. to + the copied settings when the context ends. + + Note that `all' *note sys.path: 162. modifications in the body of + the context manager, including replacement of the object, will be + reverted at the end of the block. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + (2) https://peps.python.org/pep-0488/ + + +File: python.info, Node: test support warnings_helper — Utilities for warnings tests, Prev: test support import_helper — Utilities for import tests, Up: Development Tools + +5.26.20 ‘test.support.warnings_helper’ — Utilities for warnings tests +--------------------------------------------------------------------- + +The *note test.support.warnings_helper: 109. module provides support for +warnings tests. + +New in version 3.10. + + -- Function: test.support.warnings_helper.check_no_resource_warning + (testcase) + + Context manager to check that no *note ResourceWarning: 8a9. was + raised. You must remove the object which may emit *note + ResourceWarning: 8a9. before the end of the context manager. + + -- Function: test.support.warnings_helper.check_syntax_warning + (testcase, statement, errtext='', *, lineno=1, offset=None) + + Test for syntax warning in `statement' by attempting to compile + `statement'. Test also that the *note SyntaxWarning: 2d5. is + emitted only once, and that it will be converted to a *note + SyntaxError: 2d6. when turned into error. `testcase' is the *note + unittest: 125. instance for the test. `errtext' is the regular + expression which should match the string representation of the + emitted *note SyntaxWarning: 2d5. and raised *note SyntaxError: + 2d6. If `lineno' is not ‘None’, compares to the line of the + warning and exception. If `offset' is not ‘None’, compares to the + offset of the exception. + + New in version 3.8. + + -- Function: test.support.warnings_helper.check_warnings (*filters, + quiet=True) + + A convenience wrapper for *note warnings.catch_warnings(): 288. + that makes it easier to test that a warning was correctly raised. + It is approximately equivalent to calling + ‘warnings.catch_warnings(record=True)’ with *note + warnings.simplefilter(): 289. set to ‘always’ and with the option + to automatically validate the results that are recorded. + + ‘check_warnings’ accepts 2-tuples of the form ‘("message regexp", + WarningCategory)’ as positional arguments. If one or more + `filters' are provided, or if the optional keyword argument `quiet' + is ‘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 + ‘True’. + + If no arguments are specified, it defaults to: + + check_warnings(("", Warning), quiet=True) + + In this case all warnings are caught and no errors are raised. + + On entry to the context manager, a ‘WarningRecorder’ instance is + returned. The underlying warnings list from *note + catch_warnings(): 288. is available via the recorder object’s *note + warnings: 130. 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 ‘None’. + + The recorder object also has a ‘reset()’ method, which clears the + warnings list. + + The context manager is designed to be used like this: + + with check_warnings(("assertion is always true", SyntaxWarning), + ("", UserWarning)): + exec('assert(False, "Hey!")') + warnings.warn(UserWarning("Hide me!")) + + In this case if either warning was not raised, or some other + warning was raised, *note check_warnings(): 3a38. 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: + + 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 + + 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'. + + -- Class: test.support.warnings_helper.WarningsRecorder + + Class used to record warnings for unit tests. See documentation of + *note check_warnings(): 3a38. above for more details. + + +File: python.info, Node: Debugging and Profiling, Next: Software Packaging and Distribution, Prev: Development Tools, Up: The Python Standard Library + +5.27 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. + +* 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:: + + +File: python.info, Node: Audit events table, Next: bdb — Debugger framework, Up: Debugging and Profiling + +5.27.1 Audit events table +------------------------- + +This table contains all events raised by *note sys.audit(): 1387. or +*note PySys_Audit(): 1397. calls throughout the CPython runtime and the +standard library. These calls were added in 3.8.0 or later (see PEP +578(1)). + +See *note sys.addaudithook(): 3a3e. and *note PySys_AddAuditHook(): +3a3f. 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. + +Audit event Arguments References + +------------------------------------------------------------------------------------------------------------------- + +array.__new__ ‘typecode’, ‘initializer’ *note [1]: 3d2. + + +builtins.breakpoint ‘breakpointhook’ *note [1]: 716. + + +builtins.id ‘id’ *note [1]: 1086. + + +builtins.input ‘prompt’ *note [1]: f7c. + + +builtins.input/result ‘result’ *note [1]: f7c. + + +code.__new__ ‘code’, ‘filename’, ‘name’, ‘argcount’, *note [1]: 612. + ‘posonlyargcount’, ‘kwonlyargcount’, ‘nlocals’, + ‘stacksize’, ‘flags’ + + +compile ‘source’, ‘filename’ *note [1]: 310. + + +cpython.PyInterpreterState_Clear *note [1]: 3a40. + + +cpython.PyInterpreterState_New *note [1]: 3a41. + + +cpython._PySys_ClearAuditHooks *note [1]: 986. + + +cpython.run_command ‘command’ *note [1]: 1ad. + + +cpython.run_file ‘filename’ *note [1]: 3a42. + + +cpython.run_interactivehook ‘hook’ *note [1]: c69. + + +cpython.run_module ‘module-name’ *note [1]: 1ae. + + +cpython.run_startup ‘filename’ *note [1]: c6a. + + +cpython.run_stdin *note [1]: 3a43. + + +ctypes.addressof ‘obj’ *note [1]: 290f. + + +ctypes.call_function ‘func_pointer’, ‘arguments’ *note [1]: 2904. + + +ctypes.cdata ‘address’ *note [1]: 2920. + + +ctypes.cdata/buffer ‘pointer’, ‘size’, ‘offset’ *note [1]: 291e.*note [2]: 291f. + + +ctypes.create_string_buffer ‘init’, ‘size’ *note [1]: 28c1. + + +ctypes.create_unicode_buffer ‘init’, ‘size’ *note [1]: 13f6. + + +ctypes.dlopen ‘name’ *note [1]: 2901. + + +ctypes.dlsym ‘library’, ‘name’ *note [1]: 2901. + + +ctypes.dlsym/handle ‘handle’, ‘name’ *note [1]: 2901. + + +ctypes.get_errno *note [1]: 28fb. + + +ctypes.get_last_error *note [1]: 28fd. + + +ctypes.seh_exception ‘code’ *note [1]: 2904. + + +ctypes.set_errno ‘errno’ *note [1]: 28fc. + + +ctypes.set_last_error ‘error’ *note [1]: 28fe. + + +ctypes.string_at ‘address’, ‘size’ *note [1]: 2918. + + +ctypes.wstring_at ‘address’, ‘size’ *note [1]: 291a. + + +ensurepip.bootstrap ‘root’ *note [1]: 3a44. + + +exec ‘code_object’ *note [1]: 4a7.*note [2]: 4a8. + + +fcntl.fcntl ‘fd’, ‘cmd’, ‘arg’ *note [1]: 2c95. + + +fcntl.flock ‘fd’, ‘operation’ *note [1]: 3a45. + + +fcntl.ioctl ‘fd’, ‘request’, ‘arg’ *note [1]: 10dc. + + +fcntl.lockf ‘fd’, ‘cmd’, ‘len’, ‘start’, ‘whence’ *note [1]: 1053. + + +ftplib.connect ‘self’, ‘host’, ‘port’ *note [1]: 32da. + + +ftplib.sendcmd ‘self’, ‘cmd’ *note [1]: 32de.*note [2]: 32df. + + +function.__new__ ‘code’ *note [1]: 4a6. + + +gc.get_objects ‘generation’ *note [1]: 3f4. + + +gc.get_referents ‘objs’ *note [1]: 3f6. + + +gc.get_referrers ‘objs’ *note [1]: 3f5. + + +glob.glob ‘pathname’, ‘recursive’ *note [1]: 3f8.*note [2]: 3f9. + + +glob.glob/2 ‘pathname’, ‘recursive’, ‘root_dir’, ‘dir_fd’ *note [1]: 3f8.*note [2]: 3f9. + + +http.client.connect ‘self’, ‘host’, ‘port’ *note [1]: 32b7. + + +http.client.send ‘self’, ‘data’ *note [1]: 32bc. + + +imaplib.open ‘self’, ‘host’, ‘port’ *note [1]: 548. + + +imaplib.send ‘self’, ‘data’ *note [1]: 3329. + + +import ‘module’, ‘filename’, ‘sys.path’, ‘sys.meta_path’, *note [1]: 1af. + ‘sys.path_hooks’ + + +marshal.dumps ‘value’, ‘version’ *note [1]: 22e2. + + +marshal.load *note [1]: 1444. + + +marshal.loads ‘bytes’ *note [1]: 1444. + + +mmap.__new__ ‘fileno’, ‘length’, ‘access’, ‘offset’ *note [1]: 64e. + + +msvcrt.get_osfhandle ‘fd’ *note [1]: 3a46. + + +msvcrt.locking ‘fd’, ‘mode’, ‘nbytes’ *note [1]: 3a47. + + +msvcrt.open_osfhandle ‘handle’, ‘flags’ *note [1]: 3a48. + + +nntplib.connect ‘self’, ‘host’, ‘port’ *note [1]: 55d.*note [2]: 55e. + + +nntplib.putline ‘self’, ‘line’ *note [1]: 55d.*note [2]: 55e. + + +object.__delattr__ ‘obj’, ‘name’ *note [1]: 1904. + + +object.__getattr__ ‘obj’, ‘name’ *note [1]: 839. + + +object.__setattr__ ‘obj’, ‘name’, ‘value’ *note [1]: 1903. + + +open ‘path’, ‘mode’, ‘flags’ *note [1]: 30b.*note [2]: 30c.*note [3]: a10. + + +os.add_dll_directory ‘path’ *note [1]: 62d. + + +os.chdir ‘path’ *note [1]: 1e6.*note [2]: a06. + + +os.chflags ‘path’, ‘flags’ *note [1]: d97.*note [2]: 2547. + + +os.chmod ‘path’, ‘mode’, ‘dir_fd’ *note [1]: d98.*note [2]: a07.*note [3]: 1474. + + +os.chown ‘path’, ‘uid’, ‘gid’, ‘dir_fd’ *note [1]: d99.*note [2]: a08.*note [3]: 2548. + + +os.exec ‘path’, ‘args’, ‘env’ *note [1]: 2586. + + +os.fork *note [1]: cd4. + + +os.forkpty *note [1]: 259e. + + +os.fwalk ‘top’, ‘topdown’, ‘onerror’, ‘follow_symlinks’, ‘dir_fd’ *note [1]: 7b6. + + +os.getxattr ‘path’, ‘attribute’ *note [1]: daf. + + +os.kill ‘pid’, ‘sig’ *note [1]: ffa. + + +os.killpg ‘pgid’, ‘sig’ *note [1]: 13ff. + + +os.link ‘src’, ‘dst’, ‘src_dir_fd’, ‘dst_dir_fd’ *note [1]: d9a. + + +os.listdir ‘path’ *note [1]: da5. + + +os.listxattr ‘path’ *note [1]: db0. + + +os.lockf ‘fd’, ‘cmd’, ‘len’ *note [1]: dbe. + + +os.mkdir ‘path’, ‘mode’, ‘dir_fd’ *note [1]: 7bf.*note [2]: d9b. + + +os.posix_spawn ‘path’, ‘argv’, ‘env’ *note [1]: 6a8.*note [2]: 1463. + + +os.putenv ‘key’, ‘value’ *note [1]: 564. + + +os.remove ‘path’, ‘dir_fd’ *note [1]: d9c.*note [2]: 254f.*note [3]: da1. + + +os.removexattr ‘path’, ‘attribute’ *note [1]: db1. + + +os.rename ‘src’, ‘dst’, ‘src_dir_fd’, ‘dst_dir_fd’ *note [1]: d9d.*note [2]: 2550.*note [3]: d9e. + + +os.rmdir ‘path’, ‘dir_fd’ *note [1]: d9f. + + +os.scandir ‘path’ *note [1]: 6b0. + + +os.setxattr ‘path’, ‘attribute’, ‘value’, ‘flags’ *note [1]: db2. + + +os.spawn ‘mode’, ‘path’, ‘args’, ‘env’ *note [1]: 2540. + + +os.startfile ‘path’, ‘operation’ *note [1]: 12d1. + + +os.startfile/2 ‘path’, ‘operation’, ‘arguments’, ‘cwd’, ‘show_cmd’ *note [1]: 12d1. + + +os.symlink ‘src’, ‘dst’, ‘dir_fd’ *note [1]: da0. + + +os.system ‘command’ *note [1]: 10c0. + + +os.truncate ‘fd’, ‘length’ *note [1]: a0d.*note [2]: ac0. + + +os.unsetenv ‘key’ *note [1]: 563. + + +os.utime ‘path’, ‘times’, ‘ns’, ‘dir_fd’ *note [1]: da2. + + +os.walk ‘top’, ‘topdown’, ‘onerror’, ‘followlinks’ *note [1]: a00. + + +pathlib.Path.glob ‘self’, ‘pattern’ *note [1]: 239. + + +pathlib.Path.rglob ‘self’, ‘pattern’ *note [1]: 23a. + + +pdb.Pdb *note [1]: 56a. + + +pickle.find_class ‘module’, ‘name’ *note [1]: 22bc. + + +poplib.connect ‘self’, ‘host’, ‘port’ *note [1]: 56c.*note [2]: 56d. + + +poplib.putline ‘self’, ‘line’ *note [1]: 56c.*note [2]: 56d. + + +pty.spawn ‘argv’ *note [1]: c20. + + +resource.prlimit ‘pid’, ‘resource’, ‘limits’ *note [1]: c27. + + +resource.setrlimit ‘resource’, ‘limits’ *note [1]: 39e9. + + +setopencodehook *note [1]: 25e4. + + +shutil.chown ‘path’, ‘user’, ‘group’ *note [1]: dda. + + +shutil.copyfile ‘src’, ‘dst’ *note [1]: 6aa.*note [2]: 6ab.*note [3]: 6a9. + + +shutil.copymode ‘src’, ‘dst’ *note [1]: 6aa.*note [2]: 2286. + + +shutil.copystat ‘src’, ‘dst’ *note [1]: 6ab.*note [2]: ddb. + + +shutil.copytree ‘src’, ‘dst’ *note [1]: 675. + + +shutil.make_archive ‘base_name’, ‘format’, ‘root_dir’, ‘base_dir’ *note [1]: 676. + + +shutil.move ‘src’, ‘dst’ *note [1]: 6ac. + + +shutil.rmtree ‘path’, ‘dir_fd’ *note [1]: 23f. + + +shutil.unpack_archive ‘filename’, ‘extract_dir’, ‘format’ *note [1]: ec9. + + +signal.pthread_kill ‘thread_id’, ‘signalnum’ *note [1]: dde. + + +smtplib.connect ‘self’, ‘host’, ‘port’ *note [1]: 13ed. + + +smtplib.send ‘self’, ‘data’ *note [1]: 575. + + +socket.__new__ ‘self’, ‘family’, ‘type’, ‘protocol’ *note [1]: a1f. + + +socket.bind ‘self’, ‘address’ *note [1]: 2c8f. + + +socket.connect ‘self’, ‘address’ *note [1]: a21.*note [2]: 2c91. + + +socket.getaddrinfo ‘host’, ‘port’, ‘family’, ‘type’, ‘protocol’ *note [1]: 1357. + + +socket.gethostbyaddr ‘ip_address’ *note [1]: 12d2. + + +socket.gethostbyname ‘hostname’ *note [1]: 2c87.*note [2]: 12d3. + + +socket.gethostname *note [1]: 24ff. + + +socket.getnameinfo ‘sockaddr’ *note [1]: 2bad. + + +socket.getservbyname ‘servicename’, ‘protocolname’ *note [1]: 2c89. + + +socket.getservbyport ‘port’, ‘protocolname’ *note [1]: 2c8a. + + +socket.sendmsg ‘self’, ‘address’ *note [1]: a27. + + +socket.sendto ‘self’, ‘address’ *note [1]: a28. + + +socket.sethostname ‘name’ *note [1]: de8. + + +sqlite3.connect ‘database’ *note [1]: 7da. + + +sqlite3.connect/handle ‘connection_handle’ *note [1]: 7da. + + +sqlite3.enable_load_extension ‘connection’, ‘enabled’ *note [1]: 434. + + +sqlite3.load_extension ‘connection’, ‘path’ *note [1]: 435. + + +subprocess.Popen ‘executable’, ‘args’, ‘cwd’, ‘env’ *note [1]: 6e8. + + +sys._current_exceptions *note [1]: 1335. + + +sys._current_frames *note [1]: 109a. + + +sys._getframe ‘frame’ *note [1]: 115c. + + +sys.addaudithook *note [1]: 3a3f.*note [2]: 3a3e. + + +sys.excepthook ‘hook’, ‘type’, ‘value’, ‘traceback’ *note [1]: 3fe. + + +sys.set_asyncgen_hooks_finalizer *note [1]: 1222. + + +sys.set_asyncgen_hooks_firstiter *note [1]: 1222. + + +sys.setprofile *note [1]: 1138. + + +sys.settrace *note [1]: 1139. + + +sys.unraisablehook ‘hook’, ‘unraisable’ *note [1]: 24e. + + +syslog.closelog *note [1]: 3a49. + + +syslog.openlog ‘ident’, ‘logoption’, ‘facility’ *note [1]: 13c9. + + +syslog.setlogmask ‘maskpri’ *note [1]: 3a4a. + + +syslog.syslog ‘priority’, ‘message’ *note [1]: 3a4b. + + +telnetlib.Telnet.open ‘self’, ‘host’, ‘port’ *note [1]: 3a4c. + + +telnetlib.Telnet.write ‘self’, ‘buffer’ *note [1]: 3a4d. + + +tempfile.mkdtemp ‘fullpath’ *note [1]: ef1.*note [2]: 2270. + + +tempfile.mkstemp ‘fullpath’ *note [1]: 104a.*note [2]: 226e.*note [3]: 226f. + + +urllib.Request ‘fullurl’, ‘data’, ‘headers’, ‘method’ *note [1]: b22. + + +webbrowser.open ‘url’ *note [1]: 319a. + + +winreg.ConnectRegistry ‘computer_name’, ‘key’ *note [1]: 3a4e. + + +winreg.CreateKey ‘key’, ‘sub_key’, ‘access’ *note [1]: 3a4f.*note [2]: 3a50. + + +winreg.DeleteKey ‘key’, ‘sub_key’, ‘access’ *note [1]: 3a51.*note [2]: 3a52. + + +winreg.DeleteValue ‘key’, ‘value’ *note [1]: 3a53. + + +winreg.DisableReflectionKey ‘key’ *note [1]: 3a54. + + +winreg.EnableReflectionKey ‘key’ *note [1]: 3a55. + + +winreg.EnumKey ‘key’, ‘index’ *note [1]: 3a56. + + +winreg.EnumValue ‘key’, ‘index’ *note [1]: 3a57. + + +winreg.ExpandEnvironmentStrings ‘str’ *note [1]: 3a58. + + +winreg.LoadKey ‘key’, ‘sub_key’, ‘file_name’ *note [1]: 3a59. + + +winreg.OpenKey ‘key’, ‘sub_key’, ‘access’ *note [1]: 3a5a. + + +winreg.OpenKey/result ‘key’ *note [1]: 3a4f.*note [2]: 3a50.*note [3]: 3a5a. + + +winreg.PyHKEY.Detach ‘key’ *note [1]: 3a5b. + + +winreg.QueryInfoKey ‘key’ *note [1]: 3a5c. + + +winreg.QueryReflectionKey ‘key’ *note [1]: 3a5d. + + +winreg.QueryValue ‘key’, ‘sub_key’, ‘value_name’ *note [1]: 3a5e.*note [2]: 3a5f. + + +winreg.SaveKey ‘key’, ‘file_name’ *note [1]: 3a60. + + +winreg.SetValue ‘key’, ‘sub_key’, ‘type’, ‘value’ *note [1]: 3a61.*note [2]: 3a62. + + +The following events are raised internally and do not correspond to any +public API of CPython: + +Audit event Arguments + +------------------------------------------------------------------------------- + +_winapi.CreateFile ‘file_name’, ‘desired_access’, ‘share_mode’, + ‘creation_disposition’, + ‘flags_and_attributes’ + + +_winapi.CreateJunction ‘src_path’, ‘dst_path’ + + +_winapi.CreateNamedPipe ‘name’, ‘open_mode’, ‘pipe_mode’ + + +_winapi.CreatePipe + +_winapi.CreateProcess ‘application_name’, ‘command_line’, + ‘current_directory’ + + +_winapi.OpenProcess ‘process_id’, ‘desired_access’ + + +_winapi.TerminateProcess ‘handle’, ‘exit_code’ + + +ctypes.PyObj_FromPtr ‘obj’ + + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0578/ + + +File: python.info, Node: bdb — Debugger framework, Next: faulthandler — Dump the Python traceback, Prev: Audit events table, Up: Debugging and Profiling + +5.27.2 ‘bdb’ — Debugger framework +--------------------------------- + +`Source code:' Lib/bdb.py(1) + +__________________________________________________________________ + +The *note bdb: e. module handles basic debugger functions, like setting +breakpoints or managing execution via the debugger. + +The following exception is defined: + + -- Exception: bdb.BdbQuit + + Exception raised by the *note Bdb: fa6. class for quitting the + debugger. + +The *note bdb: e. module also defines two classes: + + -- 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 *note + bpbynumber: 3a67. and by ‘(file, line)’ pairs through *note bplist: + 3a68. The former points to a single instance of class *note + Breakpoint: 3a66. 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 *note file name: 3a69. + should be in canonical form. If a *note funcname: 3a6a. is + defined, a breakpoint *note hit: 3a6b. will be counted when the + first line of that function is executed. A *note conditional: + 3a6c. breakpoint always counts a *note hit: 3a6b. + + *note Breakpoint: 3a66. instances have the following methods: + + -- 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. + + -- Method: enable () + + Mark the breakpoint as enabled. + + -- Method: disable () + + Mark the breakpoint as disabled. + + -- Method: bpformat () + + Return a string with all the information about the breakpoint, + nicely formatted: + + * Breakpoint number. + + * Temporary status (del or keep). + + * File/line position. + + * Break condition. + + * Number of times to ignore. + + * Number of times hit. + + New in version 3.2. + + -- Method: bpprint (out=None) + + Print the output of *note bpformat(): 3a70. to the file `out', + or if it is ‘None’, to standard output. + + *note Breakpoint: 3a66. instances have the following attributes: + + -- Attribute: file + + File name of the *note Breakpoint: 3a66. + + -- Attribute: line + + Line number of the *note Breakpoint: 3a66. within *note file: + 3a69. + + -- Attribute: temporary + + True if a *note Breakpoint: 3a66. at (file, line) is + temporary. + + -- Attribute: cond + + Condition for evaluating a *note Breakpoint: 3a66. at (file, + line). + + -- Attribute: funcname + + Function name that defines whether a *note Breakpoint: 3a66. + is hit upon entering the function. + + -- Attribute: enabled + + True if *note Breakpoint: 3a66. is enabled. + + -- Attribute: bpbynumber + + Numeric index for a single instance of a *note Breakpoint: + 3a66. + + -- Attribute: bplist + + Dictionary of *note Breakpoint: 3a66. instances indexed by + (*note file: 3a69, *note line: 3a72.) tuples. + + -- Attribute: ignore + + Number of times to ignore a *note Breakpoint: 3a66. + + -- Attribute: hits + + Count of the number of times a *note Breakpoint: 3a66. has + been hit. + + -- Class: bdb.Bdb (skip=None) + + The *note Bdb: fa6. 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 (*note pdb.Pdb: 56a.) 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 ‘__name__’ in the frame globals. + + New in version 3.1: The `skip' argument. + + The following methods of *note Bdb: fa6. normally don’t need to be + overridden. + + -- Method: canonic (filename) + + Return canonical form of `filename'. + + For real file names, the canonical form is an + operating-system-dependent, *note case-normalized: 21fb. *note + absolute path: fbb. A `filename' with angle brackets, such as + ‘"<stdin>"’ generated in interactive mode, is returned + unchanged. + + -- Method: reset () + + Set the ‘botframe’, ‘stopframe’, ‘returnframe’ and ‘quitting’ + attributes with values ready to start debugging. + + -- 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: + + * ‘"line"’: A new line of code is going to be executed. + + * ‘"call"’: A function is about to be called, or another + code block entered. + + * ‘"return"’: A function or other code block is about to + return. + + * ‘"exception"’: An exception has occurred. + + * ‘"c_call"’: A C function is about to be called. + + * ‘"c_return"’: A C function has returned. + + * ‘"c_exception"’: A C function has raised an exception. + + 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 *note sys.settrace(): 1139. for more + information on the trace function. For more information on + code and frame objects, refer to *note The standard type + hierarchy: 18f3. + + -- Method: dispatch_line (frame) + + If the debugger should stop on the current line, invoke the + *note user_line(): 3a7a. method (which should be overridden in + subclasses). Raise a *note BdbQuit: 3a65. exception if the + ‘Bdb.quitting’ flag is set (which can be set from *note + user_line(): 3a7a.). Return a reference to the *note + trace_dispatch(): 3a78. method for further tracing in that + scope. + + -- Method: dispatch_call (frame, arg) + + If the debugger should stop on this function call, invoke the + *note user_call(): 3a7c. method (which should be overridden in + subclasses). Raise a *note BdbQuit: 3a65. exception if the + ‘Bdb.quitting’ flag is set (which can be set from *note + user_call(): 3a7c.). Return a reference to the *note + trace_dispatch(): 3a78. method for further tracing in that + scope. + + -- Method: dispatch_return (frame, arg) + + If the debugger should stop on this function return, invoke + the *note user_return(): 3a7e. method (which should be + overridden in subclasses). Raise a *note BdbQuit: 3a65. + exception if the ‘Bdb.quitting’ flag is set (which can be set + from *note user_return(): 3a7e.). Return a reference to the + *note trace_dispatch(): 3a78. method for further tracing in + that scope. + + -- Method: dispatch_exception (frame, arg) + + If the debugger should stop at this exception, invokes the + *note user_exception(): 3a80. method (which should be + overridden in subclasses). Raise a *note BdbQuit: 3a65. + exception if the ‘Bdb.quitting’ flag is set (which can be set + from *note user_exception(): 3a80.). Return a reference to + the *note trace_dispatch(): 3a78. method for further tracing + in that scope. + + Normally derived classes don’t override the following methods, but + they may if they want to redefine the definition of stopping and + breakpoints. + + -- Method: is_skipped_line (module_name) + + Return True if `module_name' matches any skip pattern. + + -- Method: stop_here (frame) + + Return True if `frame' is below the starting frame in the + stack. + + -- Method: break_here (frame) + + Return 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 *note effective(): 3a84. + + -- Method: break_anywhere (frame) + + Return True if any breakpoint exists for `frame'’s filename. + + Derived classes should override these methods to gain control over + debugger operation. + + -- Method: user_call (frame, argument_list) + + Called from *note dispatch_call(): 3a7b. if a break might stop + inside the called function. + + -- Method: user_line (frame) + + Called from *note dispatch_line(): 3a79. when either *note + stop_here(): 3a82. or *note break_here(): 3a83. returns + ‘True’. + + -- Method: user_return (frame, return_value) + + Called from *note dispatch_return(): 3a7d. when *note + stop_here(): 3a82. returns ‘True’. + + -- Method: user_exception (frame, exc_info) + + Called from *note dispatch_exception(): 3a7f. when *note + stop_here(): 3a82. returns ‘True’. + + -- 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. + + Derived classes and clients can call the following methods to + affect the stepping state. + + -- Method: set_step () + + Stop after one line of code. + + -- Method: set_next (frame) + + Stop on the next line in or below the given frame. + + -- Method: set_return (frame) + + Stop when returning from the given frame. + + -- 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. + + -- Method: set_trace ([frame]) + + Start debugging from `frame'. If `frame' is not specified, + debugging starts from caller’s frame. + + -- Method: set_continue () + + Stop only at breakpoints or when finished. If there are no + breakpoints, set the system trace function to ‘None’. + + -- Method: set_quit () + + Set the ‘quitting’ attribute to ‘True’. This raises *note + BdbQuit: 3a65. in the next call to one of the ‘dispatch_*()’ + methods. + + 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 ‘None’ if all is well. + + -- 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 *note canonic(): 3a76. method. + + -- Method: clear_break (filename, lineno) + + Delete the breakpoints in `filename' and `lineno'. If none + were set, return an error message. + + -- Method: clear_bpbynumber (arg) + + Delete the breakpoint which has the index `arg' in the *note + Breakpoint.bpbynumber: 3a67. If `arg' is not numeric or out + of range, return an error message. + + -- Method: clear_all_file_breaks (filename) + + Delete all breakpoints in `filename'. If none were set, + return an error message. + + -- Method: clear_all_breaks () + + Delete all existing breakpoints. If none were set, return an + error message. + + -- 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 *note ValueError: 1c8. is raised. + + New in version 3.2. + + -- Method: get_break (filename, lineno) + + Return True if there is a breakpoint for `lineno' in + `filename'. + + -- Method: get_breaks (filename, lineno) + + Return all breakpoints for `lineno' in `filename', or an empty + list if none are set. + + -- Method: get_file_breaks (filename) + + Return all breakpoints in `filename', or an empty list if none + are set. + + -- Method: get_all_breaks () + + Return all breakpoints that are set. + + Derived classes and clients can call the following methods to get a + data structure representing a stack trace. + + -- 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. + + -- Method: format_stack_entry (frame_lineno, lprefix=': ') + + Return a string with information about a stack entry, which is + a ‘(frame, lineno)’ tuple. The return string contains: + + * The canonical filename which contains the frame. + + * The function name or ‘"<lambda>"’. + + * The input arguments. + + * The return value. + + * The line of code (if it exists). + + The following two methods can be called by clients to use a + debugger to debug a *note statement: 21a1, given as a string. + + -- Method: run (cmd, globals=None, locals=None) + + Debug a statement executed via the *note exec(): 4a8. + function. `globals' defaults to ‘__main__.__dict__’, `locals' + defaults to `globals'. + + -- Method: runeval (expr, globals=None, locals=None) + + Debug an expression executed via the *note eval(): 4a7. + function. `globals' and `locals' have the same meaning as in + *note run(): 3a9a. + + -- Method: runctx (cmd, globals, locals) + + For backwards compatibility. Calls the *note run(): 3a9a. + method. + + -- Method: runcall (func, /, *args, **kwds) + + Debug a single function call, and return its result. + +Finally, the module defines the following functions: + + -- Function: bdb.checkfuncname (b, frame) + + Return True if we should break here, depending on the way the *note + Breakpoint: 3a66. `b' was set. + + If it was set via line number, it checks if *note b.line: 3a72. is + the same as the one in `frame'. If the breakpoint was set via + *note function name: 3a6a, we have to check we are in the right + `frame' (the right function) and if we are on its first executable + line. + + -- Function: bdb.effective (file, line, frame) + + Return ‘(active breakpoint, delete temporary flag)’ or ‘(None, + None)’ as the breakpoint to act upon. + + The `active breakpoint' is the first entry in *note bplist: 3a68. + for the (*note file: 3a69, *note line: 3a72.) (which must exist) + that is *note enabled: 3a74, for which *note checkfuncname(): 3a9d. + is True, and that has neither a False *note condition: 3a6c. nor + positive *note ignore: 3a75. count. The `flag', meaning that a + temporary breakpoint should be deleted, is False only when the + *note cond: 3a6c. cannot be evaluated (in which case, *note ignore: + 3a75. count is ignored). + + If no such entry exists, then (None, None) is returned. + + -- Function: bdb.set_trace () + + Start debugging with a *note Bdb: fa6. instance from caller’s + frame. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/bdb.py + + +File: python.info, Node: faulthandler — Dump the Python traceback, Next: pdb — The Python Debugger, Prev: bdb — Debugger framework, Up: Debugging and Profiling + +5.27.3 ‘faulthandler’ — Dump the Python traceback +------------------------------------------------- + +New 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 *note +faulthandler.enable(): 911. to install fault handlers for the ‘SIGSEGV’, +‘SIGFPE’, ‘SIGABRT’, ‘SIGBUS’, and ‘SIGILL’ signals. You can also +enable them at startup by setting the *note PYTHONFAULTHANDLER: d31. +environment variable or by using the *note -X: 174. ‘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 ‘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: + + * Only ASCII is supported. The ‘backslashreplace’ error handler is + used on encoding. + + * Each string is limited to 500 characters. + + * Only the filename, the function name and the line number are + displayed. (no source code) + + * It is limited to 100 frames and 100 threads. + + * The order is reversed: the most recent call is shown first. + +By default, the Python traceback is written to *note sys.stderr: 581. +To see tracebacks, applications must be run in the terminal. A log file +can alternatively be passed to *note faulthandler.enable(): 911. + +The module is implemented in C, so tracebacks can be dumped on a crash +or when Python is deadlocked. + +The *note Python Development Mode: 506. calls *note +faulthandler.enable(): 911. at Python startup. + +* Menu: + +* Dumping the traceback:: +* Fault handler state:: +* Dumping the tracebacks after a timeout:: +* Dumping the traceback on a user signal:: +* Issue with file descriptors:: +* Example: Example<14>. + + +File: python.info, Node: Dumping the traceback, Next: Fault handler state, Up: faulthandler — Dump the Python traceback + +5.27.3.1 Dumping the traceback +.............................. + + -- Function: faulthandler.dump_traceback (file=sys.stderr, + all_threads=True) + + Dump the tracebacks of all threads into `file'. If `all_threads' + is ‘False’, dump only the current thread. + + Changed in version 3.5: Added support for passing file descriptor + to this function. + + +File: python.info, Node: Fault handler state, Next: Dumping the tracebacks after a timeout, Prev: Dumping the traceback, Up: faulthandler — Dump the Python traceback + +5.27.3.2 Fault handler state +............................ + + -- Function: faulthandler.enable (file=sys.stderr, all_threads=True) + + Enable the fault handler: install handlers for the ‘SIGSEGV’, + ‘SIGFPE’, ‘SIGABRT’, ‘SIGBUS’ and ‘SIGILL’ signals to dump the + Python traceback. If `all_threads' is ‘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 *note issue with file descriptors: 3aa3. + + 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. + + -- Function: faulthandler.disable () + + Disable the fault handler: uninstall the signal handlers installed + by *note enable(): 911. + + -- Function: faulthandler.is_enabled () + + Check if the fault handler is enabled. + + +File: python.info, Node: Dumping the tracebacks after a timeout, Next: Dumping the traceback on a user signal, Prev: Fault handler state, Up: faulthandler — Dump the Python traceback + +5.27.3.3 Dumping the tracebacks after a timeout +............................................... + + -- 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 ‘True’. If + `exit' is ‘True’, call ‘_exit()’ with status=1 after dumping the + tracebacks. (Note ‘_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 *note + cancel_dump_traceback_later(): 3aa7. is called: see *note issue + with file descriptors: 3aa3. + + This function is implemented using a watchdog thread. + + Changed in version 3.7: This function is now always available. + + Changed in version 3.5: Added support for passing file descriptor + to this function. + + -- Function: faulthandler.cancel_dump_traceback_later () + + Cancel the last call to *note dump_traceback_later(): a80. + + +File: python.info, Node: Dumping the traceback on a user signal, Next: Issue with file descriptors, Prev: Dumping the tracebacks after a timeout, Up: faulthandler — Dump the Python traceback + +5.27.3.4 Dumping the traceback on a user signal +............................................... + + -- 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 ‘False’, into `file'. Call the previous handler + if chain is ‘True’. + + The `file' must be kept open until the signal is unregistered by + *note unregister(): 3aa9.: see *note issue with file descriptors: + 3aa3. + + Not available on Windows. + + Changed in version 3.5: Added support for passing file descriptor + to this function. + + -- Function: faulthandler.unregister (signum) + + Unregister a user signal: uninstall the handler of the `signum' + signal installed by *note register(): a7e. Return ‘True’ if the + signal was registered, ‘False’ otherwise. + + Not available on Windows. + + +File: python.info, Node: Issue with file descriptors, Next: Example<14>, Prev: Dumping the traceback on a user signal, Up: faulthandler — Dump the Python traceback + +5.27.3.5 Issue with file descriptors +.................................... + +*note enable(): 911, *note dump_traceback_later(): a80. and *note +register(): a7e. 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 *note os.dup2(): 7c0. 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. + + +File: python.info, Node: Example<14>, Prev: Issue with file descriptors, Up: faulthandler — Dump the Python traceback + +5.27.3.6 Example +................ + +Example of a segmentation fault on Linux with and without enabling the +fault handler: + + $ python3 -c "import ctypes; ctypes.string_at(0)" + Segmentation fault + + $ python3 -q -X faulthandler + >>> import ctypes + >>> ctypes.string_at(0) + Fatal Python error: Segmentation fault + + Current thread 0x00007fb899f39700 (most recent call first): + File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at + File "<stdin>", line 1 in <module> + Segmentation fault + + +File: python.info, Node: pdb — The Python Debugger, Next: The Python Profilers, Prev: faulthandler — Dump the Python traceback, Up: Debugging and Profiling + +5.27.4 ‘pdb’ — The Python Debugger +---------------------------------- + +`Source code:' Lib/pdb.py(1) + +__________________________________________________________________ + +The module *note pdb: c6. 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. + +The debugger is extensible – it is actually defined as the class *note +Pdb: 56a. This is currently undocumented but easily understood by +reading the source. The extension interface uses the modules *note bdb: +e. and *note cmd: 18. + +The debugger’s prompt is ‘(Pdb)’. Typical usage to run a program under +control of the debugger is: + + >>> import pdb + >>> import mymodule + >>> pdb.run('mymodule.test()') + > <string>(0)?() + (Pdb) continue + > <string>(1)?() + (Pdb) continue + NameError: 'spam' + > <string>(1)?() + (Pdb) + +Changed in version 3.3: Tab-completion via the *note readline: db. +module is available for commands and command arguments, e.g. the +current global and local names are offered as arguments of the ‘p’ +command. + +‘pdb.py’ can also be invoked as a script to debug other scripts. For +example: + + python3 -m pdb myscript.py + +When invoked as a script, 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. + +New in version 3.2: ‘pdb.py’ now accepts a ‘-c’ option that executes +commands as if given in a ‘.pdbrc’ file, see *note Debugger Commands: +3aaf. + +New in version 3.7: ‘pdb.py’ now accepts a ‘-m’ option that execute +modules similar to the way ‘python3 -m’ does. As with a script, the +debugger will pause execution just before the first line of the module. + +The typical usage to break into the debugger is to insert: + + import pdb; pdb.set_trace() + +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 *note continue: +3ab0. command. + +New in version 3.7: The built-in *note breakpoint(): 716, when called +with defaults, can be used instead of ‘import pdb; pdb.set_trace()’. + +The typical usage to inspect a crashed program is: + + >>> import pdb + >>> import mymodule + >>> mymodule.test() + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + File "./mymodule.py", line 4, in test + test2() + File "./mymodule.py", line 3, in test2 + print(spam) + NameError: spam + >>> pdb.pm() + > ./mymodule.py(3)test2() + -> print(spam) + (Pdb) + +The module defines the following functions; each enters the debugger in +a slightly different way: + + -- 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 *note continue: 3ab0, or + you can step through the statement using *note step: 3ab1. or *note + next: 3ab2. (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 *note + __main__: 1. is used. (See the explanation of the built-in *note + exec(): 4a8. or *note eval(): 4a7. functions.) + + -- Function: pdb.runeval (expression, globals=None, locals=None) + + Evaluate the `expression' (given as a string or a code object) + under debugger control. When *note runeval(): 3ab3. returns, it + returns the value of the expression. Otherwise this function is + similar to *note run(): 3849. + + -- Function: pdb.runcall (function, *args, **kwds) + + Call the `function' (a function or method object, not a string) + with the given arguments. When *note runcall(): 3ab4. returns, it + returns whatever the function call returned. The debugger prompt + appears as soon as the function is entered. + + -- Function: pdb.set_trace (*, header=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. + + Changed in version 3.7: The keyword-only argument `header'. + + -- Function: pdb.post_mortem (traceback=None) + + Enter post-mortem debugging of the given `traceback' object. If no + `traceback' is given, it uses the one of the exception that is + currently being handled (an exception must be being handled if the + default is to be used). + + -- Function: pdb.pm () + + Enter post-mortem debugging of the traceback found in *note + sys.last_traceback: 3ab6. + +The ‘run*’ functions and *note set_trace(): 7c4. are aliases for +instantiating the *note Pdb: 56a. class and calling the method of the +same name. If you want to access further features, you have to do this +yourself: + + -- Class: pdb.Pdb (completekey='tab', stdin=None, stdout=None, + skip=None, nosigint=False, readrc=True) + + *note Pdb: 56a. is the debugger class. + + The `completekey', `stdin' and `stdout' arguments are passed to the + underlying *note cmd.Cmd: 3605. 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. (2) + + By default, Pdb sets a handler for the SIGINT signal (which is sent + when the user presses ‘Ctrl-C’ on the console) when you give a + ‘continue’ command. This allows you to break into the debugger + again by pressing ‘Ctrl-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. + + Example call to enable tracing with `skip': + + import pdb; pdb.Pdb(skip=['django.*']).set_trace() + + Raises an *note auditing event: 12c0. ‘pdb.Pdb’ with no arguments. + + New in version 3.1: The `skip' argument. + + New in version 3.2: The `nosigint' argument. Previously, a SIGINT + handler was never set by Pdb. + + Changed in version 3.6: The `readrc' argument. + + -- Method: run (statement, globals=None, locals=None) + -- Method: runeval (expression, globals=None, locals=None) + -- Method: runcall (function, *args, **kwds) + -- Method: set_trace () + + See the documentation for the functions explained above. + +* Menu: + +* Debugger Commands:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/pdb.py + + (2) Whether a frame is considered to originate in a certain module is +determined by the ‘__name__’ in the frame globals. + + +File: python.info, Node: Debugger Commands, Up: pdb — The Python Debugger + +5.27.4.1 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. ‘h(elp)’ +means that either ‘h’ or ‘help’ can be used to enter the help command +(but not ‘he’ or ‘hel’, nor ‘H’ or ‘Help’ or ‘HELP’). Arguments to +commands must be separated by whitespace (spaces or tabs). Optional +arguments are enclosed in square brackets (‘[]’) in the command syntax; +the square brackets must not be typed. Alternatives in the command +syntax are separated by a vertical bar (‘|’). + +Entering a blank line repeats the last command entered. Exception: if +the last command was a *note list: 3abc. 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 (‘!’). 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. + +The debugger supports *note aliases: 3abd. 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 ‘;;’. +(A single ‘;’ 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 ‘;;’ +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 +‘';'';'’ or ‘";"";"’. + +If a file ‘.pdbrc’ exists in the user’s home directory or in the current +directory, it is read with ‘'utf-8'’ encoding and executed as if it had +been typed at the debugger prompt. 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.11: ‘.pdbrc’ is now read with ‘'utf-8'’ encoding. +Previously, it was read with the system locale encoding. + +Changed in version 3.2: ‘.pdbrc’ can now contain commands that continue +debugging, such as *note continue: 3ab0. or *note next: 3ab2. +Previously, these commands had no effect. + + -- Pdbcommand: h(elp) [command] + + Without argument, print the list of available commands. With a + `command' as argument, print help about that command. ‘help pdb’ + displays the full documentation (the docstring of the *note pdb: + c6. module). Since the `command' argument must be an identifier, + ‘help exec’ must be entered to get help on the ‘!’ command. + + -- Pdbcommand: w(here) + + Print a stack trace, with the most recent frame at the bottom. An + arrow indicates the current frame, which determines the context of + most commands. + + -- Pdbcommand: d(own) [count] + + Move the current frame `count' (default one) levels down in the + stack trace (to a newer frame). + + -- Pdbcommand: u(p) [count] + + Move the current frame `count' (default one) levels up in the stack + trace (to an older frame). + + -- Pdbcommand: b(reak) [([filename:]lineno | function) [, condition]] + + With a `lineno' argument, set a break there in the current file. + With a `function' argument, set a break at the first executable + statement within that function. The line number may be prefixed + with a filename and a colon, to specify a breakpoint in another + file (probably one that hasn’t been loaded yet). The file is + searched on *note sys.path: 162. Note that each breakpoint is + assigned a number to which all the other breakpoint commands refer. + + 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. + + -- Pdbcommand: tbreak [([filename:]lineno | function) [, condition]] + + Temporary breakpoint, which is removed automatically when it is + first hit. The arguments are the same as for *note break: 3ac2. + + -- 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). + + -- Pdbcommand: disable [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. + + -- Pdbcommand: enable [bpnumber ...] + + Enable the breakpoints specified. + + -- 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. + + -- 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. + + -- 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 ‘end’ to terminate the commands. An example: + + (Pdb) commands 1 + (com) p some_variable + (com) end + (Pdb) + + To remove all commands from a breakpoint, type ‘commands’ and + follow it immediately with ‘end’; that is, give no commands. + + With no `bpnumber' argument, ‘commands’ refers to the last + breakpoint set. + + You can use breakpoint commands to start your program up again. + Simply use the *note continue: 3ab0. command, or *note step: 3ab1, + or any other command that resumes execution. + + Specifying any command resuming execution (currently *note + continue: 3ab0, *note step: 3ab1, *note next: 3ab2, *note return: + 3aca, *note jump: 3acb, *note quit: 3acc. 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 you use the ‘silent’ command in the command list, the usual + message about stopping at a breakpoint is not printed. This may be + desirable for breakpoints that are to print a specific message and + then continue. If none of the other commands print anything, you + see no sign that the breakpoint was reached. + + -- 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). + + -- Pdbcommand: n(ext) + + Continue execution until the next line in the current function is + reached or it returns. (The difference between *note next: 3ab2. + and *note step: 3ab1. is that *note step: 3ab1. stops inside a + called function, while *note next: 3ab2. executes called functions + at (nearly) full speed, only stopping at the next line in the + current function.) + + -- Pdbcommand: unt(il) [lineno] + + Without argument, continue execution until the line with a number + greater than the current one is reached. + + With a line number, continue execution until a line with a number + greater or equal to that is reached. In both cases, also stop when + the current frame returns. + + Changed in version 3.2: Allow giving an explicit line number. + + -- Pdbcommand: r(eturn) + + Continue execution until the current function returns. + + -- Pdbcommand: c(ont(inue)) + + Continue execution, only stop when a breakpoint is encountered. + + -- 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 *note for: 199. loop + or out of a *note finally: 60a. clause. + + -- 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 ‘.’ 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 ‘->’. If an + exception is being debugged, the line where the exception was + originally raised or propagated is indicated by ‘>>’, if it differs + from the current line. + + New in version 3.2: The ‘>>’ marker. + + -- Pdbcommand: ll | longlist + + List all source code for the current function or frame. + Interesting lines are marked as for *note list: 3abc. + + New in version 3.2. + + -- Pdbcommand: a(rgs) + + Print the argument list of the current function. + + -- Pdbcommand: p expression + + Evaluate the `expression' in the current context and print its + value. + + Note: ‘print()’ can also be used, but is not a debugger + command — this executes the Python *note print(): c13. + function. + + -- Pdbcommand: pp expression + + Like the *note p: c14. command, except the value of the expression + is pretty-printed using the *note pprint: cf. module. + + -- Pdbcommand: whatis expression + + Print the type of the `expression'. + + -- Pdbcommand: source expression + + Try to get source code for the given object and display it. + + New in version 3.2. + + -- Pdbcommand: display [expression] + + Display the value of the expression if it changed, each time + execution stops in the current frame. + + Without expression, list all display expressions for the current + frame. + + New in version 3.2. + + -- Pdbcommand: undisplay [expression] + + Do not display the expression any more in the current frame. + Without expression, clear all display expressions for the current + frame. + + New in version 3.2. + + -- Pdbcommand: interact + + Start an interactive interpreter (using the *note code: 19. module) + whose global namespace contains all the (global and local) names + found in the current scope. + + New in version 3.2. + + -- 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 ‘%1’, ‘%2’, and so on, while ‘%*’ is replaced by all + the parameters. If no command is given, 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 ‘.pdbrc’ file): + + # Print instance variables (usage "pi classInst") + alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k]) + # Print instance variables in self + alias ps pi self + + -- Pdbcommand: unalias name + + Delete the specified alias. + + -- 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. To set a + global variable, you can prefix the assignment command with a *note + global: 166a. statement on the same line, e.g.: + + (Pdb) global list_options; list_options = ['-l'] + (Pdb) + + -- Pdbcommand: run [args ...] + -- Pdbcommand: restart [args ...] + + Restart the debugged Python program. If an argument is supplied, + it is split with *note shlex: e5. and the result is used as the new + *note sys.argv: f1f. History, breakpoints, actions and debugger + options are preserved. *note restart: 3adb. is an alias for *note + run: 3ada. + + -- Pdbcommand: q(uit) + + Quit from the debugger. The program being executed is aborted. + + -- Pdbcommand: debug code + + Enter a recursive debugger that steps through the code argument + (which is an arbitrary expression or statement to be executed in + the current environment). + + -- Pdbcommand: retval + + Print the return value for the last return of a function. + + +File: python.info, Node: The Python Profilers, Next: timeit — Measure execution time of small code snippets, Prev: pdb — The Python Debugger, Up: Debugging and Profiling + +5.27.5 The Python Profilers +--------------------------- + +`Source code:' Lib/profile.py(1) and Lib/pstats.py(2) + +__________________________________________________________________ + +* 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:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/profile.py + + (2) https://github.com/python/cpython/tree/3.11/Lib/pstats.py + + +File: python.info, Node: Introduction to the profilers, Next: Instant User’s Manual, Up: The Python Profilers + +5.27.5.1 Introduction to the profilers +...................................... + +*note cProfile: 26. and *note profile: d0. 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 *note +pstats: d1. module. + +The Python standard library provides two different implementations of +the same profiling interface: + + 1. *note cProfile: 26. is recommended for most users; it’s a C + extension with reasonable overhead that makes it suitable for + profiling long-running programs. Based on ‘lsprof’, contributed by + Brett Rosen and Ted Czotter. + + 2. *note profile: d0, a pure Python module whose interface is imitated + by *note cProfile: 26, 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. + + Note: The profiler modules are designed to provide an execution + profile for a given program, not for benchmarking purposes (for + that, there is *note timeit: 10d. 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. + + +File: python.info, Node: Instant User’s Manual, Next: profile and cProfile Module Reference, Prev: Introduction to the profilers, Up: The Python Profilers + +5.27.5.2 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: + + import cProfile + import re + cProfile.run('re.compile("foo|bar")') + +(Use *note profile: d0. instead of *note cProfile: 26. if the latter is +not available on your system.) + +The above action would run *note re.compile(): 83a. and print profile +results like the following: + + 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) + +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: ‘Ordered by: cumulative name’, indicates that +the text string in the far right column was used to sort the output. +The column headings include: + +ncalls + + for the number of calls. + +tottime + + for the total time spent in the given function (and excluding time + made in calls to sub-functions) + +percall + + is the quotient of ‘tottime’ divided by ‘ncalls’ + +cumtime + + is the cumulative time spent in this and all subfunctions (from + invocation till exit). This figure is accurate `even' for + recursive functions. + +percall + + is the quotient of ‘cumtime’ divided by primitive calls + +filename:lineno(function) + + provides the respective data of each function + +When there are two numbers in the first column (for example ‘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 ‘run()’ +function: + + import cProfile + import re + cProfile.run('re.compile("foo|bar")', 'restats') + +The *note pstats.Stats: 3ae5. class reads profile results from a file +and formats them in various ways. + +The files *note cProfile: 26. and *note profile: d0. can also be invoked +as a script to profile another script. For example: + + python -m cProfile [-o output_file] [-s sort_order] (-m module | myscript.py) + +‘-o’ writes the profile results to a file instead of to stdout + +‘-s’ specifies one of the *note sort_stats(): 3ae6. sort values to sort +the output by. This only applies when ‘-o’ is not supplied. + +‘-m’ specifies that a module is being profiled instead of a script. + + New in version 3.7: Added the ‘-m’ option to *note cProfile: 26. + + New in version 3.8: Added the ‘-m’ option to *note profile: d0. + +The *note pstats: d1. module’s *note Stats: 3ae5. class has a variety of +methods for manipulating and printing the data saved into a profile +results file: + + import pstats + from pstats import SortKey + p = pstats.Stats('restats') + p.strip_dirs().sort_stats(-1).print_stats() + +The *note strip_dirs(): 3ae7. method removed the extraneous path from +all the module names. The *note sort_stats(): 3ae6. method sorted all +the entries according to the standard module/line/name string that is +printed. The *note print_stats(): 3ae8. method printed out all the +statistics. You might try the following sort calls: + + p.sort_stats(SortKey.NAME) + p.print_stats() + +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: + + p.sort_stats(SortKey.CUMULATIVE).print_stats(10) + +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: + + p.sort_stats(SortKey.TIME).print_stats(10) + +to sort according to time spent within each function, and then print the +statistics for the top ten functions. + +You might also try: + + p.sort_stats(SortKey.FILENAME).print_stats('__init__') + +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 +‘__init__’ in them). As one final example, you could try: + + p.sort_stats(SortKey.TIME, SortKey.CUMULATIVE).print_stats(.5, 'init') + +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: ‘.5’) of its +original size, then only lines containing ‘init’ are maintained, and +that sub-sub-list is printed. + +If you wondered what functions called the above functions, you could now +(‘p’ is still sorted according to the last criteria) do: + + p.print_callers(.5, 'init') + +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: + + p.print_callees() + p.add('restats') + +Invoked as a script, the *note pstats: d1. module is a statistics +browser for reading and examining profile dumps. It has a simple +line-oriented interface (implemented using *note cmd: 18.) and +interactive help. + + +File: python.info, Node: profile and cProfile Module Reference, Next: The Stats Class, Prev: Instant User’s Manual, Up: The Python Profilers + +5.27.5.3 ‘profile’ and ‘cProfile’ Module Reference +.................................................. + +Both the *note profile: d0. and *note cProfile: 26. modules provide the +following functions: + + -- Function: profile.run (command, filename=None, sort=- 1) + + This function takes a single argument that can be passed to the + *note exec(): 4a8. function, and an optional file name. In all + cases this routine executes: + + exec(command, __main__.__dict__, __main__.__dict__) + + and gathers profiling statistics from the execution. If no file + name is present, then this function automatically creates a *note + Stats: 3ae5. instance and prints a simple profiling report. If the + sort value is specified, it is passed to this *note Stats: 3ae5. + instance to control how the results are sorted. + + -- Function: profile.runctx (command, globals, locals, filename=None, + sort=- 1) + + This function is similar to *note run(): 3aea, with added arguments + to supply the globals and locals dictionaries for the `command' + string. This routine executes: + + exec(command, globals, locals) + + and gathers profiling statistics as in the *note run(): 3aea. + function above. + + -- 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 ‘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 + ‘.001’. + + Directly using the *note Profile: 626. class allows formatting + profile results without writing the profile data to a file: + + 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()) + + The *note Profile: 626. class can also be used as a context manager + (supported only in *note cProfile: 26. module. see *note Context + Manager Types: 1977.): + + import cProfile + + with cProfile.Profile() as pr: + # ... do something ... + + pr.print_stats() + + Changed in version 3.8: Added context manager support. + + -- Method: enable () + + Start collecting profiling data. Only in *note cProfile: 26. + + -- Method: disable () + + Stop collecting profiling data. Only in *note cProfile: 26. + + -- Method: create_stats () + + Stop collecting profiling data and record the results + internally as the current profile. + + -- Method: print_stats (sort=- 1) + + Create a *note Stats: 3ae5. object based on the current + profile and print the results to stdout. + + -- Method: dump_stats (filename) + + Write the results of the current profile to `filename'. + + -- Method: run (cmd) + + Profile the cmd via *note exec(): 4a8. + + -- Method: runctx (cmd, globals, locals) + + Profile the cmd via *note exec(): 4a8. with the specified + global and local environment. + + -- Method: runcall (func, /, *args, **kwargs) + + Profile ‘func(*args, **kwargs)’ + +Note that profiling will only work if the called command/function +actually returns. If the interpreter is terminated (e.g. via a *note +sys.exit(): fec. call during the called command/function execution) no +profiling results will be printed. + + +File: python.info, Node: The Stats Class, Next: What Is Deterministic Profiling?, Prev: profile and cProfile Module Reference, Up: The Python Profilers + +5.27.5.4 The ‘Stats’ Class +.......................... + +Analysis of the profiler data is done using the *note Stats: 3ae5. +class. + + -- 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 ‘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 *note profile: d0. or *note + cProfile: 26. 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 *note Stats: 3ae5. object, the + *note add(): 3af5. method can be used. + + Instead of reading the profile data from a file, a + ‘cProfile.Profile’ or *note profile.Profile: 626. object can be + used as the profile data source. + + *note Stats: 3ae5. objects have the following methods: + + -- Method: strip_dirs () + + This method for the *note Stats: 3ae5. 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 + *note strip_dirs(): 3ae7. 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. + + -- Method: add (*filenames) + + This method of the *note Stats: 3ae5. class accumulates + additional profiling information into the current profiling + object. Its arguments should refer to filenames created by + the corresponding version of *note profile.run(): 3aea. or + ‘cProfile.run()’. Statistics for identically named (re: file, + line, name) functions are automatically accumulated into + single function statistics. + + -- Method: dump_stats (filename) + + Save the data loaded into the *note Stats: 3ae5. 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 *note + profile.Profile: 626. and ‘cProfile.Profile’ classes. + + -- Method: sort_stats (*keys) + + This method modifies the *note Stats: 3ae5. 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: ‘'time'’, ‘'name'’, ‘SortKey.TIME’ or + ‘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, ‘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: + + Valid String Arg Valid enum Arg Meaning + + ---------------------------------------------------------------------------- + + ‘'calls'’ SortKey.CALLS call count + + + ‘'cumulative'’ SortKey.CUMULATIVE cumulative time + + + ‘'cumtime'’ N/A cumulative time + + + ‘'file'’ N/A file name + + + ‘'filename'’ SortKey.FILENAME file name + + + ‘'module'’ N/A file name + + + ‘'ncalls'’ N/A call count + + + ‘'pcalls'’ SortKey.PCALLS primitive call count + + + ‘'line'’ SortKey.LINE line number + + + ‘'name'’ SortKey.NAME function name + + + ‘'nfl'’ SortKey.NFL name/file/line + + + ‘'stdname'’ SortKey.STDNAME standard name + + + ‘'time'’ SortKey.TIME internal time + + + ‘'tottime'’ N/A internal time + + + 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 ‘SortKey.NFL’ + and ‘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, ‘SortKey.NFL’ does a + numeric compare of the line numbers. In fact, + ‘sort_stats(SortKey.NFL)’ is the same as + ‘sort_stats(SortKey.NAME, SortKey.FILENAME, SortKey.LINE)’. + + For backward-compatibility reasons, the numeric arguments + ‘-1’, ‘0’, ‘1’, and ‘2’ are permitted. They are interpreted + as ‘'stdname'’, ‘'calls'’, ‘'time'’, and ‘'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. + + New in version 3.7: Added the SortKey enum. + + -- Method: reverse_order () + + This method for the *note Stats: 3ae5. 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. + + -- Method: print_stats (*restrictions) + + This method for the *note Stats: 3ae5. class prints out a + report as described in the *note profile.run(): 3aea. + definition. + + The order of the printing is based on the last *note + sort_stats(): 3ae6. operation done on the object (subject to + caveats in *note add(): 3af5. and *note strip_dirs(): 3ae7.). + + 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 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: + + print_stats(.1, 'foo:') + + would first limit the printing to first 10% of list, and then + only print functions that were part of filename ‘.*foo:’. In + contrast, the command: + + print_stats('foo:', .1) + + would limit the list to all functions having file names + ‘.*foo:’, and then proceed to only print the first 10% of + them. + + -- Method: print_callers (*restrictions) + + This method for the *note Stats: 3ae5. class prints a list of + all functions that called each function in the profiled + database. The ordering is identical to that provided by *note + print_stats(): 3ae8, 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: + + * With *note profile: d0, 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. + + * With *note cProfile: 26, 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. + + -- Method: print_callees (*restrictions) + + This method for the *note Stats: 3ae5. 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 *note print_callers(): 3af8. method. + + -- 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… + + New in version 3.9: Added the following dataclasses: + StatsProfile, FunctionProfile. Added the following function: + get_stats_profile. + + +File: python.info, Node: What Is Deterministic Profiling?, Next: Limitations, Prev: The Stats Class, Up: The Python Profilers + +5.27.5.5 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. + + +File: python.info, Node: Limitations, Next: Calibration, Prev: What Is Deterministic Profiling?, Up: The Python Profilers + +5.27.5.6 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 *note profile: d0. than with the +lower-overhead *note cProfile: 26. For this reason, *note profile: d0. +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. + + +File: python.info, Node: Calibration, Next: Using a custom timer, Prev: Limitations, Up: The Python Profilers + +5.27.5.7 Calibration +.................... + +The profiler of the *note profile: d0. 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 *note Limitations: 3afe.). + + import profile + pr = profile.Profile() + for i in range(5): + print(pr.calibrate(10000)) + +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: + + 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) + +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. + + +File: python.info, Node: Using a custom timer, Prev: Calibration, Up: The Python Profilers + +5.27.5.8 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 ‘Profile’ class constructor: + + pr = profile.Profile(your_time_func) + +The resulting profiler will then call ‘your_time_func’. Depending on +whether you are using *note profile.Profile: 626. or ‘cProfile.Profile’, +‘your_time_func’’s return value will be interpreted differently: + +*note profile.Profile: 626. + + ‘your_time_func’ should return a single number, or a list of + numbers whose sum is the current time (like what *note os.times(): + dc0. 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 *note Calibration: 3b00.). For + most machines, a timer that returns a lone integer value will + provide the best results in terms of low overhead during profiling. + (*note os.times(): dc0. 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. + +‘cProfile.Profile’ + + ‘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 ‘your_integer_time_func’ returns times measured in + thousands of seconds, you would construct the ‘Profile’ instance as + follows: + + pr = cProfile.Profile(your_integer_time_func, 0.001) + + As the ‘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 ‘_lsprof’ + module. + +Python 3.3 adds several new functions in *note time: 10c. that can be +used to make precise measurements of process or wall-clock time. For +example, see *note time.perf_counter(): 6da. + + +File: python.info, Node: timeit — Measure execution time of small code snippets, Next: trace — Trace or track Python statement execution, Prev: The Python Profilers, Up: Debugging and Profiling + +5.27.6 ‘timeit’ — Measure execution time of small code snippets +--------------------------------------------------------------- + +`Source code:' Lib/timeit.py(1) + +__________________________________________________________________ + +This module provides a simple way to time small bits of Python code. It +has both a *note Command-Line Interface: 3b05. as well as a *note +callable: 3b06. 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<4>. +* Examples: Examples<29>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/timeit.py + + +File: python.info, Node: Basic Examples<2>, Next: Python Interface, Up: timeit — Measure execution time of small code snippets + +5.27.6.1 Basic Examples +....................... + +The following example shows how the *note Command-Line Interface: 3b05. +can be used to compare three different expressions: + + $ python3 -m timeit '"-".join(str(n) for n in range(100))' + 10000 loops, best of 5: 30.2 usec per loop + $ python3 -m timeit '"-".join([str(n) for n in range(100)])' + 10000 loops, best of 5: 27.5 usec per loop + $ python3 -m timeit '"-".join(map(str, range(100)))' + 10000 loops, best of 5: 23.2 usec per loop + +This can be achieved from the *note Python Interface: 3b06. with: + + >>> 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 + +A callable can also be passed from the *note Python Interface: 3b06.: + + >>> timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000) + 0.19665591977536678 + +Note however that *note timeit(): b0c. will automatically determine the +number of repetitions only when the command-line interface is used. In +the *note Examples: 3b08. section you can find more advanced examples. + + +File: python.info, Node: Python Interface, Next: Command-Line Interface<4>, Prev: Basic Examples<2>, Up: timeit — Measure execution time of small code snippets + +5.27.6.2 Python Interface +......................... + +The module defines three convenience functions and a public class: + + -- Function: timeit.timeit (stmt='pass', setup='pass', timer=<default + timer>, number=1000000, globals=None) + + Create a *note Timer: 134e. instance with the given statement, + `setup' code and `timer' function and run its *note timeit(): 95c. + 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. + + -- Function: timeit.repeat (stmt='pass', setup='pass', timer=<default + timer>, repeat=5, number=1000000, globals=None) + + Create a *note Timer: 134e. instance with the given statement, + `setup' code and `timer' function and run its *note repeat(): 3b0b. + 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. + + -- Function: timeit.default_timer () + + The default timer, which is always *note time.perf_counter(): 6da. + + Changed in version 3.3: *note time.perf_counter(): 6da. is now the + default timer. + + -- 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 ‘'pass'’; the timer function is platform-dependent (see + the module doc string). `stmt' and `setup' may also contain + multiple statements separated by ‘;’ 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 *note + timeit(): 95c. method. The *note repeat(): 3b0b. and *note + autorange(): 95b. methods are convenience methods to call *note + timeit(): 95c. 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 *note timeit(): 95c. + 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. + + -- 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, measured in + 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. + + Note: By default, *note timeit(): 95c. temporarily turns + off *note garbage collection: 131f. 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: + + timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit() + + -- Method: autorange (callback=None) + + Automatically determine how many times to call *note timeit(): + 95c. + + This is a convenience function that calls *note timeit(): 95c. + repeatedly so that the total time >= 0.2 second, returning the + eventual (number of loops, time taken for that number of + loops). It calls *note timeit(): 95c. with increasing numbers + from the sequence 1, 2, 5, 10, 20, 50, … until the time taken + is at least 0.2 second. + + If `callback' is given and is not ‘None’, it will be called + after each trial with two arguments: ‘callback(number, + time_taken)’. + + New in version 3.6. + + -- Method: repeat (repeat=5, number=1000000) + + Call *note timeit(): 95c. a few times. + + This is a convenience function that calls the *note timeit(): + 95c. repeatedly, returning a list of results. The first + argument specifies how many times to call *note timeit(): 95c. + The second argument specifies the `number' argument for *note + timeit(): 95c. + + 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 *note min(): b99. 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. + + Changed in version 3.7: Default value of `repeat' changed from + 3 to 5. + + -- Method: print_exc (file=None) + + Helper to print a traceback from the timed code. + + Typical use: + + t = Timer(...) # outside the try/except + try: + t.timeit(...) # or t.repeat(...) + except Exception: + t.print_exc() + + 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 *note sys.stderr: 581. + + +File: python.info, Node: Command-Line Interface<4>, Next: Examples<29>, Prev: Python Interface, Up: timeit — Measure execution time of small code snippets + +5.27.6.3 Command-Line Interface +............................... + +When called as a program from the command line, the following form is +used: + + python -m timeit [-n N] [-r N] [-u U] [-s S] [-h] [statement ...] + +Where the following options are understood: + + -- Program Option: -n N, --number=N + + how many times to execute ‘statement’ + + -- Program Option: -r N, --repeat=N + + how many times to repeat the timer (default 5) + + -- Program Option: -s S, --setup=S + + statement to be executed once initially (default ‘pass’) + + -- Program Option: -p, --process + + measure process time, not wallclock time, using *note + time.process_time(): 6db. instead of *note time.perf_counter(): + 6da, which is the default + + New in version 3.3. + + -- Program Option: -u, --unit=U + + specify a time unit for timer output; can select ‘nsec’, ‘usec’, + ‘msec’, or ‘sec’ + + New in version 3.5. + + -- Program Option: -v, --verbose + + print raw timing results; repeat for more digits precision + + -- Program Option: -h, --help + + print a short usage message and exit + +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 *note -s: 3b13. +options are treated similarly. + +If *note -n: 3b0f. 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. + +*note default_timer(): 3b0c. 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 *note -r: 3b11. option is good for this; the default +of 5 repetitions is probably enough in most cases. You can use *note +time.process_time(): 6db. to measure CPU time. + + 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. + + +File: python.info, Node: Examples<29>, Prev: Command-Line Interface<4>, Up: timeit — Measure execution time of small code snippets + +5.27.6.4 Examples +................. + +It is possible to provide a setup statement that is executed only once +at the beginning: + + $ 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 + +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. + + >>> 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 + +The same can be done using the *note Timer: 134e. class and its methods: + + >>> 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] + +The following examples show how to time expressions that contain +multiple lines. Here we compare the cost of using *note hasattr(): 836. +vs. *note try: 1073./*note except: 17a. to test for missing and present +object attributes: + + $ 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 + + >>> 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 + +To give the *note timeit: 10d. module access to functions you define, +you can pass a `setup' parameter which contains an import statement: + + 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")) + +Another option is to pass *note globals(): 125f. 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: + + 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())) + + +File: python.info, Node: trace — Trace or track Python statement execution, Next: tracemalloc — Trace memory allocations, Prev: timeit — Measure execution time of small code snippets, Up: Debugging and Profiling + +5.27.7 ‘trace’ — Trace or track Python statement execution +---------------------------------------------------------- + +`Source code:' Lib/trace.py(1) + +__________________________________________________________________ + +The *note trace: 11c. 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. + +See also +........ + +Coverage.py(2) + + A popular third-party coverage tool that provides HTML output along + with advanced features such as branch coverage. + +* Menu: + +* Command-Line Usage:: +* Programmatic Interface:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/trace.py + + (2) https://coverage.readthedocs.io/ + + +File: python.info, Node: Command-Line Usage, Next: Programmatic Interface, Up: trace — Trace or track Python statement execution + +5.27.7.1 Command-Line Usage +........................... + +The *note trace: 11c. module can be invoked from the command line. It +can be as simple as + + python -m trace --count -C . somefile.py ... + +The above will execute ‘somefile.py’ and generate annotated listings of +all Python modules imported during the execution into the current +directory. + + -- Program Option: --help + + Display usage and exit. + + -- Program Option: --version + + Display the version of the module and exit. + +New in version 3.8: Added ‘--module’ option that allows to run an +executable module. + +* Menu: + +* Main options:: +* Modifiers:: +* Filters:: + + +File: python.info, Node: Main options, Next: Modifiers, Up: Command-Line Usage + +5.27.7.2 Main options +..................... + +At least one of the following options must be specified when invoking +*note trace: 11c. The *note –listfuncs: 3b25. option is mutually +exclusive with the *note –trace: 3b26. and *note –count: 3b27. options. +When *note –listfuncs: 3b25. is provided, neither *note –count: 3b27. +nor *note –trace: 3b26. are accepted, and vice versa. + + -- Program Option: -c, --count + + Produce a set of annotated listing files upon program completion + that shows how many times each statement was executed. See also + *note –coverdir: 3b29, *note –file: 3b2a. and *note –no-report: + 3b2b. below. + + -- Program Option: -t, --trace + + Display lines as they are executed. + + -- Program Option: -l, --listfuncs + + Display the functions executed by running the program. + + -- Program Option: -r, --report + + Produce an annotated list from an earlier program run that used the + *note –count: 3b27. and *note –file: 3b2a. option. This does not + execute any code. + + -- Program Option: -T, --trackcalls + + Display the calling relationships exposed by running the program. + + +File: python.info, Node: Modifiers, Next: Filters, Prev: Main options, Up: Command-Line Usage + +5.27.7.3 Modifiers +.................. + + -- Program Option: -f, --file=<file> + + Name of a file to accumulate counts over several tracing runs. + Should be used with the *note –count: 3b27. option. + + -- Program Option: -C, --coverdir=<dir> + + Directory where the report files go. The coverage report for + ‘package.module’ is written to file + ‘`dir'/`package'/`module'.cover’. + + -- Program Option: -m, --missing + + When generating annotated listings, mark lines which were not + executed with ‘>>>>>>’. + + -- Program Option: -s, --summary + + When using *note –count: 3b27. or *note –report: 3b2e, write a + brief summary to stdout for each file processed. + + -- Program Option: -R, --no-report + + Do not generate annotated listings. This is useful if you intend + to make several runs with *note –count: 3b27, and then produce a + single set of annotated listings at the end. + + -- Program Option: -g, --timing + + Prefix each line with the time since the program started. Only + used while tracing. + + +File: python.info, Node: Filters, Prev: Modifiers, Up: Command-Line Usage + +5.27.7.4 Filters +................ + +These options may be repeated multiple times. + + -- Program Option: --ignore-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. + + -- Program Option: --ignore-dir=<dir> + + Ignore all modules and packages in the named directory and + subdirectories. The argument can be a list of directories + separated by *note os.pathsep: 1788. + + +File: python.info, Node: Programmatic Interface, Prev: Command-Line Usage, Up: trace — Trace or track Python statement execution + +5.27.7.5 Programmatic Interface +............................... + + -- 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. + + -- 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 *note exec(): 4a8. + + -- 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. + + -- Method: runfunc (func, /, *args, **kwds) + + Call `func' with the given arguments under control of the + *note Trace: 3b41. object with the current tracing parameters. + + -- Method: results () + + Return a *note CoverageResults: 3b45. object that contains the + cumulative results of all previous calls to ‘run’, ‘runctx’ + and ‘runfunc’ for the given *note Trace: 3b41. instance. Does + not reset the accumulated trace results. + + -- Class: trace.CoverageResults + + A container for coverage results, created by *note Trace.results(): + 3b44. Should not be created directly by the user. + + -- Method: update (other) + + Merge in data from another *note CoverageResults: 3b45. + object. + + -- Method: write_results (show_missing=True, summary=False, + coverdir=None) + + 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 ‘None’, the results for each source file are placed in its + directory. + +A simple example demonstrating the use of the programmatic interface: + + 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=".") + + +File: python.info, Node: tracemalloc — Trace memory allocations, Prev: trace — Trace or track Python statement execution, Up: Debugging and Profiling + +5.27.8 ‘tracemalloc’ — Trace memory allocations +----------------------------------------------- + +New in version 3.4. + +`Source code:' Lib/tracemalloc.py(1) + +__________________________________________________________________ + +The tracemalloc module is a debug tool to trace memory blocks allocated +by Python. It provides the following information: + + * Traceback where an object was allocated + + * Statistics on allocated memory blocks per filename and per line + number: total size, number and average size of allocated memory + blocks + + * Compute the differences between two snapshots to detect memory + leaks + +To trace most memory blocks allocated by Python, the module should be +started as early as possible by setting the *note PYTHONTRACEMALLOC: +178e. environment variable to ‘1’, or by using *note -X: 174. +‘tracemalloc’ command line option. The *note tracemalloc.start(): 1782. +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 *note +PYTHONTRACEMALLOC: 178e. environment variable to ‘25’, or use the *note +-X: 174. ‘tracemalloc=25’ command line option. + +* Menu: + +* Examples: Examples<30>. +* API:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tracemalloc.py + + +File: python.info, Node: Examples<30>, Next: API, Up: tracemalloc — Trace memory allocations + +5.27.8.1 Examples +................. + +* Menu: + +* Display the top 10:: +* Compute differences:: +* Get the traceback of a memory block:: +* Pretty top:: + + +File: python.info, Node: Display the top 10, Next: Compute differences, Up: Examples<30> + +5.27.8.2 Display the top 10 +........................... + +Display the 10 files allocating the most memory: + + 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) + +Example of output of the Python test suite: + + [ 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 + +We can see that Python loaded ‘4855 KiB’ data (bytecode and constants) +from modules and that the *note collections: 1c. module allocated ‘244 +KiB’ to build *note namedtuple: 538. types. + +See *note Snapshot.statistics(): 3b4c. for more options. + + +File: python.info, Node: Compute differences, Next: Get the traceback of a memory block, Prev: Display the top 10, Up: Examples<30> + +5.27.8.3 Compute differences +............................ + +Take two snapshots and display the differences: + + 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) + +Example of output before/after running some tests of the Python test +suite: + + [ 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 + +We can see that Python has loaded ‘8173 KiB’ of module data (bytecode +and constants), and that this is ‘4428 KiB’ more than had been loaded +before the tests, when the previous snapshot was taken. Similarly, the +*note linecache: a6. module has cached ‘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 *note Snapshot.dump(): 3b4e. method to analyze the snapshot +offline. Then use the *note Snapshot.load(): 3b4f. method reload the +snapshot. + + +File: python.info, Node: Get the traceback of a memory block, Next: Pretty top, Prev: Compute differences, Up: Examples<30> + +5.27.8.4 Get the traceback of a memory block +............................................ + +Code to display the traceback of the biggest memory block: + + 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) + +Example of output of the Python test suite (traceback limited to 25 +frames): + + 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) + +We can see that the most memory was allocated in the *note importlib: +97. module to load data (bytecode and constants) from modules: ‘870.1 +KiB’. The traceback is where the *note importlib: 97. loaded data most +recently: on the ‘import pdb’ line of the *note doctest: 63. module. +The traceback may change if a new module is loaded. + + +File: python.info, Node: Pretty top, Prev: Get the traceback of a memory block, Up: Examples<30> + +5.27.8.5 Pretty top +................... + +Code to display the 10 lines allocating the most memory with a pretty +output, ignoring ‘<frozen importlib._bootstrap>’ and ‘<unknown>’ files: + + 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) + +Example of output of the Python test suite: + + 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 + +See *note Snapshot.statistics(): 3b4c. for more options. + +* Menu: + +* Record the current and peak size of all traced memory blocks:: + + +File: python.info, Node: Record the current and peak size of all traced memory blocks, Up: Pretty top + +5.27.8.6 Record the current and peak size of all traced memory blocks +..................................................................... + +The following code computes two sums like ‘0 + 1 + 2 + ...’ +inefficiently, by creating a list of those numbers. This list consumes +a lot of memory temporarily. We can use *note get_traced_memory(): +3b53. and *note reset_peak(): 583. to observe the small memory usage +after the sum is computed as well as the peak memory usage during the +computations: + + 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=}") + +Output: + + first_size=664, first_peak=3592984 + second_size=804, second_peak=29704 + +Using *note reset_peak(): 583. ensured we could accurately record the +peak during the computation of ‘small_sum’, even though it is much +smaller than the overall peak size of memory blocks since the *note +start(): 1782. call. Without the call to *note reset_peak(): 583, +‘second_peak’ would still be the peak from the computation ‘large_sum’ +(that is, equal to ‘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 *note list: 1e9, and writing +‘sum(range(...))’). + + +File: python.info, Node: API, Prev: Examples<30>, Up: tracemalloc — Trace memory allocations + +5.27.8.7 API +............ + +* Menu: + +* Functions: Functions<10>. +* DomainFilter:: +* Filter:: +* Frame:: +* Snapshot:: +* Statistic:: +* StatisticDiff:: +* Trace:: +* Traceback:: + + +File: python.info, Node: Functions<10>, Next: DomainFilter, Up: API + +5.27.8.8 Functions +.................. + + -- Function: tracemalloc.clear_traces () + + Clear traces of memory blocks allocated by Python. + + See also *note stop(): 3b57. + + -- Function: tracemalloc.get_object_traceback (obj) + + Get the traceback where the Python object `obj' was allocated. + Return a *note Traceback: 7f8. instance, or ‘None’ if the *note + tracemalloc: 11e. module is not tracing memory allocations or did + not trace the allocation of the object. + + See also *note gc.get_referrers(): 3f5. and *note sys.getsizeof(): + 11c0. functions. + + -- Function: tracemalloc.get_traceback_limit () + + Get the maximum number of frames stored in the traceback of a + trace. + + The *note tracemalloc: 11e. module must be tracing memory + allocations to get the limit, otherwise an exception is raised. + + The limit is set by the *note start(): 1782. function. + + -- Function: tracemalloc.get_traced_memory () + + Get the current size and peak size of memory blocks traced by the + *note tracemalloc: 11e. module as a tuple: ‘(current: int, peak: + int)’. + + -- Function: tracemalloc.reset_peak () + + Set the peak size of memory blocks traced by the *note tracemalloc: + 11e. module to the current size. + + Do nothing if the *note tracemalloc: 11e. module is not tracing + memory allocations. + + This function only modifies the recorded peak size, and does not + modify or clear any traces, unlike *note clear_traces(): 3b56. + Snapshots taken with *note take_snapshot(): 3b59. before a call to + *note reset_peak(): 583. can be meaningfully compared to snapshots + taken after the call. + + See also *note get_traced_memory(): 3b53. + + New in version 3.9. + + -- Function: tracemalloc.get_tracemalloc_memory () + + Get the memory usage in bytes of the *note tracemalloc: 11e. module + used to store traces of memory blocks. Return an *note int: 1c7. + + -- Function: tracemalloc.is_tracing () + + ‘True’ if the *note tracemalloc: 11e. module is tracing Python + memory allocations, ‘False’ otherwise. + + See also *note start(): 1782. and *note stop(): 3b57. functions. + + -- 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 ‘1’. `nframe' must be + greater or equal to ‘1’. + + You can still read the original number of total frames that + composed the traceback by looking at the *note + Traceback.total_nframe: 3b5c. attribute. + + Storing more than ‘1’ frame is only useful to compute statistics + grouped by ‘'traceback'’ or to compute cumulative statistics: see + the *note Snapshot.compare_to(): 3b5d. and *note + Snapshot.statistics(): 3b4c. methods. + + Storing more frames increases the memory and CPU overhead of the + *note tracemalloc: 11e. module. Use the *note + get_tracemalloc_memory(): 3b5a. function to measure how much memory + is used by the *note tracemalloc: 11e. module. + + The *note PYTHONTRACEMALLOC: 178e. environment variable + (‘PYTHONTRACEMALLOC=NFRAME’) and the *note -X: 174. + ‘tracemalloc=NFRAME’ command line option can be used to start + tracing at startup. + + See also *note stop(): 3b57, *note is_tracing(): 3b5b. and *note + get_traceback_limit(): 3b58. functions. + + -- 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 *note take_snapshot(): 3b59. function to take a snapshot of + traces before clearing them. + + See also *note start(): 1782, *note is_tracing(): 3b5b. and *note + clear_traces(): 3b56. functions. + + -- Function: tracemalloc.take_snapshot () + + Take a snapshot of traces of memory blocks allocated by Python. + Return a new *note Snapshot: 3b5e. instance. + + The snapshot does not include memory blocks allocated before the + *note tracemalloc: 11e. module started to trace memory allocations. + + Tracebacks of traces are limited to *note get_traceback_limit(): + 3b58. frames. Use the `nframe' parameter of the *note start(): + 1782. function to store more frames. + + The *note tracemalloc: 11e. module must be tracing memory + allocations to take a snapshot, see the *note start(): 1782. + function. + + See also the *note get_object_traceback(): 159e. function. + + +File: python.info, Node: DomainFilter, Next: Filter, Prev: Functions<10>, Up: API + +5.27.8.9 DomainFilter +..................... + + -- Class: tracemalloc.DomainFilter (inclusive: bool, domain: int) + + Filter traces of memory blocks by their address space (domain). + + New in version 3.6. + + -- Attribute: inclusive + + If `inclusive' is ‘True’ (include), match memory blocks + allocated in the address space *note domain: 3b61. + + If `inclusive' is ‘False’ (exclude), match memory blocks not + allocated in the address space *note domain: 3b61. + + -- Attribute: domain + + Address space of a memory block (‘int’). Read-only property. + + +File: python.info, Node: Filter, Next: Frame, Prev: DomainFilter, Up: API + +5.27.8.10 Filter +................ + + -- 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 *note fnmatch.fnmatch(): 129d. function for the syntax of + `filename_pattern'. The ‘'.pyc'’ file extension is replaced with + ‘'.py'’. + + Examples: + + * ‘Filter(True, subprocess.__file__)’ only includes traces of + the *note subprocess: f6. module + + * ‘Filter(False, tracemalloc.__file__)’ excludes traces of the + *note tracemalloc: 11e. module + + * ‘Filter(False, "<unknown>")’ excludes empty tracebacks + + Changed in version 3.5: The ‘'.pyo'’ file extension is no longer + replaced with ‘'.py'’. + + Changed in version 3.6: Added the *note domain: 3b64. attribute. + + -- Attribute: domain + + Address space of a memory block (‘int’ or ‘None’). + + tracemalloc uses the domain ‘0’ to trace memory allocations + made by Python. C extensions can use other domains to trace + other resources. + + -- Attribute: inclusive + + If `inclusive' is ‘True’ (include), only match memory blocks + allocated in a file with a name matching *note + filename_pattern: 3b66. at line number *note lineno: 3b67. + + If `inclusive' is ‘False’ (exclude), ignore memory blocks + allocated in a file with a name matching *note + filename_pattern: 3b66. at line number *note lineno: 3b67. + + -- Attribute: lineno + + Line number (‘int’) of the filter. If `lineno' is ‘None’, the + filter matches any line number. + + -- Attribute: filename_pattern + + Filename pattern of the filter (‘str’). Read-only property. + + -- Attribute: all_frames + + If `all_frames' is ‘True’, all frames of the traceback are + checked. If `all_frames' is ‘False’, only the most recent + frame is checked. + + This attribute has no effect if the traceback limit is ‘1’. + See the *note get_traceback_limit(): 3b58. function and *note + Snapshot.traceback_limit: 3b69. attribute. + + +File: python.info, Node: Frame, Next: Snapshot, Prev: Filter, Up: API + +5.27.8.11 Frame +............... + + -- Class: tracemalloc.Frame + + Frame of a traceback. + + The *note Traceback: 7f8. class is a sequence of *note Frame: 3b6b. + instances. + + -- Attribute: filename + + Filename (‘str’). + + -- Attribute: lineno + + Line number (‘int’). + + +File: python.info, Node: Snapshot, Next: Statistic, Prev: Frame, Up: API + +5.27.8.12 Snapshot +.................. + + -- Class: tracemalloc.Snapshot + + Snapshot of traces of memory blocks allocated by Python. + + The *note take_snapshot(): 3b59. function creates a snapshot + instance. + + -- 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 *note StatisticDiff: 3b6f. instances + grouped by `key_type'. + + See the *note Snapshot.statistics(): 3b4c. method for + `key_type' and `cumulative' parameters. + + The result is sorted from the biggest to the smallest by: + absolute value of *note StatisticDiff.size_diff: 3b70, *note + StatisticDiff.size: 3b71, absolute value of *note + StatisticDiff.count_diff: 3b72, *note Statistic.count: 3b73. + and then by *note StatisticDiff.traceback: 3b74. + + -- Method: dump (filename) + + Write the snapshot into a file. + + Use *note load(): 3b4f. to reload the snapshot. + + -- Method: filter_traces (filters) + + Create a new *note Snapshot: 3b5e. instance with a filtered + *note traces: 3b76. sequence, `filters' is a list of *note + DomainFilter: 960. and *note Filter: 3b63. instances. If + `filters' is an empty list, return a new *note Snapshot: 3b5e. + 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: *note DomainFilter: 960. instances are + now also accepted in `filters'. + + -- Method: classmethod load (filename) + + Load a snapshot from a file. + + See also *note dump(): 3b4e. + + -- Method: statistics (key_type: str, cumulative: bool = False) + + Get statistics as a sorted list of *note Statistic: 3b77. + instances grouped by `key_type': + + key_type description + + ------------------------------------------------------- + + ‘'filename'’ filename + + + ‘'lineno'’ filename and line number + + + ‘'traceback'’ traceback + + + If `cumulative' is ‘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' equals to ‘'filename'’ and ‘'lineno'’. + + The result is sorted from the biggest to the smallest by: + *note Statistic.size: 3b78, *note Statistic.count: 3b73. and + then by *note Statistic.traceback: 3b79. + + -- Attribute: traceback_limit + + Maximum number of frames stored in the traceback of *note + traces: 3b76.: result of the *note get_traceback_limit(): + 3b58. when the snapshot was taken. + + -- Attribute: traces + + Traces of all memory blocks allocated by Python: sequence of + *note Trace: 3b7a. instances. + + The sequence has an undefined order. Use the *note + Snapshot.statistics(): 3b4c. method to get a sorted list of + statistics. + + +File: python.info, Node: Statistic, Next: StatisticDiff, Prev: Snapshot, Up: API + +5.27.8.13 Statistic +................... + + -- Class: tracemalloc.Statistic + + Statistic on memory allocations. + + *note Snapshot.statistics(): 3b4c. returns a list of *note + Statistic: 3b77. instances. + + See also the *note StatisticDiff: 3b6f. class. + + -- Attribute: count + + Number of memory blocks (‘int’). + + -- Attribute: size + + Total size of memory blocks in bytes (‘int’). + + -- Attribute: traceback + + Traceback where the memory block was allocated, *note + Traceback: 7f8. instance. + + +File: python.info, Node: StatisticDiff, Next: Trace, Prev: Statistic, Up: API + +5.27.8.14 StatisticDiff +....................... + + -- Class: tracemalloc.StatisticDiff + + Statistic difference on memory allocations between an old and a new + *note Snapshot: 3b5e. instance. + + *note Snapshot.compare_to(): 3b5d. returns a list of *note + StatisticDiff: 3b6f. instances. See also the *note Statistic: + 3b77. class. + + -- Attribute: count + + Number of memory blocks in the new snapshot (‘int’): ‘0’ if + the memory blocks have been released in the new snapshot. + + -- Attribute: count_diff + + Difference of number of memory blocks between the old and the + new snapshots (‘int’): ‘0’ if the memory blocks have been + allocated in the new snapshot. + + -- Attribute: size + + Total size of memory blocks in bytes in the new snapshot + (‘int’): ‘0’ if the memory blocks have been released in the + new snapshot. + + -- Attribute: size_diff + + Difference of total size of memory blocks in bytes between the + old and the new snapshots (‘int’): ‘0’ if the memory blocks + have been allocated in the new snapshot. + + -- Attribute: traceback + + Traceback where the memory blocks were allocated, *note + Traceback: 7f8. instance. + + +File: python.info, Node: Trace, Next: Traceback, Prev: StatisticDiff, Up: API + +5.27.8.15 Trace +............... + + -- Class: tracemalloc.Trace + + Trace of a memory block. + + The *note Snapshot.traces: 3b76. attribute is a sequence of *note + Trace: 3b7a. instances. + + Changed in version 3.6: Added the *note domain: 3b7f. attribute. + + -- Attribute: domain + + Address space of a memory block (‘int’). Read-only property. + + tracemalloc uses the domain ‘0’ to trace memory allocations + made by Python. C extensions can use other domains to trace + other resources. + + -- Attribute: size + + Size of the memory block in bytes (‘int’). + + -- Attribute: traceback + + Traceback where the memory block was allocated, *note + Traceback: 7f8. instance. + + +File: python.info, Node: Traceback, Prev: Trace, Up: API + +5.27.8.16 Traceback +................... + + -- Class: tracemalloc.Traceback + + Sequence of *note Frame: 3b6b. instances sorted from the oldest + frame to the most recent frame. + + A traceback contains at least ‘1’ frame. If the ‘tracemalloc’ + module failed to get a frame, the filename ‘"<unknown>"’ at line + number ‘0’ is used. + + When a snapshot is taken, tracebacks of traces are limited to *note + get_traceback_limit(): 3b58. frames. See the *note + take_snapshot(): 3b59. function. The original number of frames of + the traceback is stored in the *note Traceback.total_nframe: 3b5c. + attribute. That allows to know if a traceback has been truncated + by the traceback limit. + + The *note Trace.traceback: 3b81. attribute is an instance of *note + Traceback: 7f8. instance. + + Changed in version 3.7: Frames are now sorted from the oldest to + the most recent, instead of most recent to oldest. + + -- Attribute: total_nframe + + Total number of frames that composed the traceback before + truncation. This attribute can be set to ‘None’ if the + information is not available. + + Changed in version 3.9: The *note Traceback.total_nframe: 3b5c. + attribute was added. + + -- Method: format (limit=None, most_recent_first=False) + + Format the traceback as a list of lines. Use the *note + linecache: a6. 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 ‘abs(limit)’ + oldest frames. If `most_recent_first' is ‘True’, the order of + the formatted frames is reversed, returning the most recent + frame first instead of last. + + Similar to the *note traceback.format_tb(): 3b83. function, + except that *note format(): 7f9. does not include newlines. + + Example: + + print("Traceback (most recent call first):") + for line in traceback: + print(line) + + Output: + + Traceback (most recent call first): + File "test.py", line 9 + obj = Object() + File "test.py", line 12 + tb = tracemalloc.get_object_traceback(f()) + + +File: python.info, Node: Software Packaging and Distribution, Next: Python Runtime Services, Prev: Debugging and Profiling, Up: The Python Standard Library + +5.28 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(1), they can also be used with a local index server, or +without any index server at all. + +* Menu: + +* distutils — Building and installing Python modules:: +* ensurepip — Bootstrapping the pip installer:: +* venv — Creation of virtual environments:: +* zipapp — Manage executable Python zip archives:: + + ---------- Footnotes ---------- + + (1) https://pypi.org + + +File: python.info, Node: distutils — Building and installing Python modules, Next: ensurepip — Bootstrapping the pip installer, Up: Software Packaging and Distribution + +5.28.1 ‘distutils’ — Building and installing Python modules +----------------------------------------------------------- + +__________________________________________________________________ + +*note distutils: 37. is deprecated with removal planned for Python 3.12. +See the *note What’s New: 2f3. entry for more information. + +__________________________________________________________________ + +The *note distutils: 37. package provides support for building and +installing additional modules into a Python installation. The new +modules may be either 100%-pure Python, or may be extension modules +written in C, or may be collections of Python packages which include +modules coded in both Python and C. + +Most Python users will `not' want to use this module directly, but +instead use the cross-version tools maintained by the Python Packaging +Authority. In particular, setuptools(1) is an enhanced alternative to +*note distutils: 37. that provides: + + * support for declaring project dependencies + + * additional mechanisms for configuring which files to include in + source releases (including plugins for integration with version + control systems) + + * the ability to declare project “entry points”, which can be used as + the basis for application plugin systems + + * the ability to automatically generate Windows command line + executables at installation time rather than needing to prebuild + them + + * consistent behaviour across all supported Python versions + +The recommended pip(2) installer runs all ‘setup.py’ scripts with +‘setuptools’, even if the script itself only imports ‘distutils’. Refer +to the Python Packaging User Guide(3) for more information. + +For the benefits of packaging tool authors and users seeking a deeper +understanding of the details of the current packaging and distribution +system, the legacy *note distutils: 37. based user documentation and API +reference remain available: + + * *note Installing Python Modules (Legacy version): b87. + + * *note Distributing Python Modules (Legacy version): b88. + + ---------- Footnotes ---------- + + (1) https://setuptools.readthedocs.io/en/latest/ + + (2) https://pip.pypa.io/ + + (3) https://packaging.python.org + + +File: python.info, Node: ensurepip — Bootstrapping the pip installer, Next: venv — Creation of virtual environments, Prev: distutils — Building and installing Python modules, Up: Software Packaging and Distribution + +5.28.2 ‘ensurepip’ — Bootstrapping the ‘pip’ installer +------------------------------------------------------ + +New in version 3.4. + +__________________________________________________________________ + +The *note ensurepip: 75. package provides support for bootstrapping the +‘pip’ installer into an existing Python installation or virtual +environment. This bootstrapping approach reflects the fact that ‘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 ‘pip’ should be bootstrapped by default), but it may be +needed if installing ‘pip’ was skipped when installing Python (or when +creating a virtual environment) or after explicitly uninstalling ‘pip’. + + Note: This module `does not' access the internet. All of the + components needed to bootstrap ‘pip’ are included as internal parts + of the package. + +See also +........ + +*note Installing Python Modules: b85. + + The end user guide for installing Python packages + +PEP 453(1): Explicit bootstrapping of pip in Python installations + + The original rationale and specification for this module. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +* Menu: + +* Command line interface:: +* Module API:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0453/ + + +File: python.info, Node: Command line interface, Next: Module API, Up: ensurepip — Bootstrapping the pip installer + +5.28.2.1 Command line interface +............................... + +The command line interface is invoked using the interpreter’s ‘-m’ +switch. + +The simplest possible invocation is: + + python -m ensurepip + +This invocation will install ‘pip’ if it is not already installed, but +otherwise does nothing. To ensure the installed version of ‘pip’ is at +least as recent as the one available in ‘ensurepip’, pass the +‘--upgrade’ option: + + python -m ensurepip --upgrade + +By default, ‘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: + + * ‘--root <dir>’: Installs ‘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. + + * ‘--user’: Installs ‘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). + +By default, the scripts ‘pipX’ and ‘pipX.Y’ will be installed (where X.Y +stands for the version of Python used to invoke ‘ensurepip’). The +scripts installed can be controlled through two additional command line +options: + + * ‘--altinstall’: if an alternate installation is requested, the + ‘pipX’ script will `not' be installed. + + * ‘--default-pip’: if a “default pip” installation is requested, the + ‘pip’ script will be installed in addition to the two regular + scripts. + +Providing both of the script selection options will trigger an +exception. + + +File: python.info, Node: Module API, Prev: Command line interface, Up: ensurepip — Bootstrapping the pip installer + +5.28.2.2 Module API +................... + +*note ensurepip: 75. exposes two functions for programmatic use: + + -- Function: ensurepip.version () + + Returns a string specifying the available version of pip that will + be installed when bootstrapping an environment. + + -- Function: ensurepip.bootstrap (root=None, upgrade=False, user=False, + altinstall=False, default_pip=False, verbosity=0) + + Bootstraps ‘pip’ into the current or designated environment. + + `root' specifies an alternative root directory to install relative + to. If `root' is ‘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 ‘pip’ to the available + version. + + `user' indicates whether to use the user scheme rather than + installing globally. + + By default, the scripts ‘pipX’ and ‘pipX.Y’ will be installed + (where X.Y stands for the current version of Python). + + If `altinstall' is set, then ‘pipX’ will `not' be installed. + + If `default_pip' is set, then ‘pip’ will be installed in addition + to the two regular scripts. + + Setting both `altinstall' and `default_pip' will trigger *note + ValueError: 1c8. + + `verbosity' controls the level of output to *note sys.stdout: 72a. + from the bootstrapping operation. + + Raises an *note auditing event: 12c0. ‘ensurepip.bootstrap’ with + argument ‘root’. + + Note: The bootstrapping process has side effects on both + ‘sys.path’ and ‘os.environ’. Invoking the command line + interface in a subprocess instead allows these side effects to + be avoided. + + Note: The bootstrapping process may install additional modules + required by ‘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 ‘pip’). + + +File: python.info, Node: venv — Creation of virtual environments, Next: zipapp — Manage executable Python zip archives, Prev: ensurepip — Bootstrapping the pip installer, Up: Software Packaging and Distribution + +5.28.3 ‘venv’ — Creation of virtual environments +------------------------------------------------ + +New in version 3.3. + +`Source code:' Lib/venv/(1) + +__________________________________________________________________ + +The *note venv: 12f. module provides support for creating lightweight +“virtual environments” with their own site directories, optionally +isolated from system site directories. Each virtual environment has its +own Python binary (which matches the version of the binary that was used +to create this environment) and can have its own independent set of +installed Python packages in its site directories. + +See PEP 405(2) for more information about Python virtual environments. + +See also +........ + +Python Packaging User Guide: Creating and using virtual environments(3) + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +* Menu: + +* Creating virtual environments:: +* API: API<2>. +* An example of extending EnvBuilder:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/venv/ + + (2) https://peps.python.org/pep-0405/ + + (3) +https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#creating-a-virtual-environment + + +File: python.info, Node: Creating virtual environments, Next: API<2>, Up: venv — Creation of virtual environments + +5.28.3.1 Creating virtual environments +...................................... + +Creation of *note virtual environments: 3b90. is done by executing the +command ‘venv’: + + python3 -m venv /path/to/new/virtual/environment + +Running this command creates the target directory (creating any parent +directories that don’t exist already) and places a ‘pyvenv.cfg’ file in +it with a ‘home’ key pointing to the Python installation from which the +command was run (a common name for the target directory is ‘.venv’). It +also creates a ‘bin’ (or ‘Scripts’ on Windows) subdirectory containing a +copy/symlink of the Python binary/binaries (as appropriate for the +platform or arguments used at environment creation time). It also +creates an (initially empty) ‘lib/pythonX.Y/site-packages’ subdirectory +(on Windows, this is ‘Lib\site-packages’). If an existing directory is +specified, it will be re-used. + +Deprecated since version 3.6: ‘pyvenv’ was the recommended tool for +creating virtual environments for Python 3.3 and 3.4, and is deprecated +in Python 3.6(1). + +Changed in version 3.5: The use of ‘venv’ is now recommended for +creating virtual environments. + +On Windows, invoke the ‘venv’ command as follows: + + c:\>c:\Python35\python -m venv c:\path\to\myenv + +Alternatively, if you configured the ‘PATH’ and ‘PATHEXT’ variables for +your *note Python installation: 704.: + + c:\>python -m venv c:\path\to\myenv + +The command, if run with ‘-h’, will show the available options: + + usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] + [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] + ENV_DIR [ENV_DIR ...] + + Creates virtual Python environments in one or more target directories. + + positional arguments: + ENV_DIR A directory to create the environment in. + + optional arguments: + -h, --help show this help message and exit + --system-site-packages + Give the virtual environment access to the system + site-packages dir. + --symlinks Try to use symlinks rather than copies, when symlinks + are not the default for the platform. + --copies Try to use copies rather than symlinks, even when + symlinks are the default for the platform. + --clear Delete the contents of the environment directory if it + already exists, before environment creation. + --upgrade Upgrade the environment directory to use this version + of Python, assuming Python has been upgraded in-place. + --without-pip Skips installing or upgrading pip in the virtual + environment (pip is bootstrapped by default) + --prompt PROMPT Provides an alternative prompt prefix for this + environment. + --upgrade-deps Upgrade core dependencies: pip setuptools to the + latest version in PyPI + + Once an environment has been created, you may wish to activate it, e.g. by + sourcing an activate script in its bin directory. + +Changed in version 3.9: Add ‘--upgrade-deps’ option to upgrade pip + +setuptools to the latest on PyPI + +Changed in version 3.4: Installs pip by default, added the +‘--without-pip’ and ‘--copies’ options + +Changed in version 3.4: In earlier versions, if the target directory +already existed, an error was raised, unless the ‘--clear’ or +‘--upgrade’ option was provided. + + Note: While symlinks are supported on Windows, they are not + recommended. Of particular note is that double-clicking + ‘python.exe’ in File Explorer will resolve the symlink eagerly and + ignore the virtual environment. + + Note: On Microsoft Windows, it may be required to enable the + ‘Activate.ps1’ script by setting the execution policy for the user. + You can do this by issuing the following PowerShell command: + + PS C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope + CurrentUser + + See About Execution Policies(2) for more information. + +The created ‘pyvenv.cfg’ file also includes the +‘include-system-site-packages’ key, set to ‘true’ if ‘venv’ is run with +the ‘--system-site-packages’ option, ‘false’ otherwise. + +Unless the ‘--without-pip’ option is given, *note ensurepip: 75. will be +invoked to bootstrap ‘pip’ into the virtual environment. + +Multiple paths can be given to ‘venv’, in which case an identical +virtual environment will be created, according to the given options, at +each provided path. + +Once a virtual environment has been created, it can be “activated” using +a script in the virtual environment’s binary directory. The invocation +of the script is platform-specific (‘<venv>’ must be replaced by the +path of the directory containing the virtual environment): + +Platform Shell Command to activate virtual environment + +-------------------------------------------------------------------------------------- + +POSIX bash/zsh $ source <venv>/bin/activate + + + fish $ source <venv>/bin/activate.fish + + + csh/tcsh $ source <venv>/bin/activate.csh + + + PowerShell Core $ <venv>/bin/Activate.ps1 + + +Windows cmd.exe C:\> <venv>\Scripts\activate.bat + + + PowerShell PS C:\> <venv>\Scripts\Activate.ps1 + + +When a virtual environment is active, the ‘VIRTUAL_ENV’ environment +variable is set to the path of the virtual environment. This can be +used to check if one is running inside a virtual environment. + +You don’t specifically `need' to activate an environment; activation +just prepends the virtual environment’s binary directory to your path, +so that “python” invokes the virtual environment’s Python interpreter +and you can run installed scripts without having to use their full path. +However, all scripts installed in a virtual environment should be +runnable without activating it, and run with the virtual environment’s +Python automatically. + +You can deactivate a virtual environment by typing “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). + +New in version 3.4: ‘fish’ and ‘csh’ activation scripts. + +New in version 3.8: PowerShell activation scripts installed under POSIX +for PowerShell Core support. + + Note: A virtual environment is a Python environment such that the + Python interpreter, libraries and scripts installed into it are + isolated from those installed in other virtual environments, and + (by default) any libraries installed in a “system” Python, i.e., + one which is installed as part of your operating system. + + A virtual environment is a directory tree which contains Python + executable files and other files which indicate that it is a + virtual environment. + + Common installation tools such as setuptools(3) and pip(4) work as + expected with virtual environments. In other words, when a virtual + environment is active, they install Python packages into the + virtual environment without needing to be told to do so explicitly. + + When a virtual environment is active (i.e., the virtual + environment’s Python interpreter is running), the attributes *note + sys.prefix: 3b91. and *note sys.exec_prefix: 3b92. point to the + base directory of the virtual environment, whereas *note + sys.base_prefix: 3512. and *note sys.base_exec_prefix: 3b93. point + to the non-virtual environment Python installation which was used + to create the virtual environment. If a virtual environment is not + active, then *note sys.prefix: 3b91. is the same as *note + sys.base_prefix: 3512. and *note sys.exec_prefix: 3b92. is the same + as *note sys.base_exec_prefix: 3b93. (they all point to a + non-virtual environment Python installation). + + When a virtual environment is active, any options that change the + installation path will be ignored from all *note distutils: 37. + configuration files to prevent projects being inadvertently + installed outside of the virtual environment. + + When working in a command shell, users can make a virtual + environment active by running an ‘activate’ script in the virtual + environment’s executables directory (the precise filename and + command to use the file is shell-dependent), which prepends the + virtual environment’s directory for executables to the ‘PATH’ + environment variable for the running shell. There should be no + need in other circumstances to activate a virtual environment; + scripts installed into virtual environments have a “shebang” line + which points to the virtual environment’s Python interpreter. This + means that the script will run with that interpreter regardless of + the value of ‘PATH’. On Windows, “shebang” line processing is + supported if you have the Python Launcher for Windows installed + (this was added to Python in 3.3 - see PEP 397(5) for more + details). Thus, double-clicking an installed script in a Windows + Explorer window should run the script with the correct interpreter + without there needing to be any reference to its virtual + environment in ‘PATH’. + + 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 + ‘requirements.txt’, you can invoke ‘pip install -r + requirements.txt’ using the environment’s ‘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. + + ---------- Footnotes ---------- + + (1) https://docs.python.org/dev/whatsnew/3.6.html#id8 + + (2) https://go.microsoft.com/fwlink/?LinkID=135170 + + (3) https://pypi.org/project/setuptools/ + + (4) https://pypi.org/project/pip/ + + (5) https://peps.python.org/pep-0397/ + + +File: python.info, Node: API<2>, Next: An example of extending EnvBuilder, Prev: Creating virtual environments, Up: venv — Creation of virtual environments + +5.28.3.2 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 *note +EnvBuilder: c8a. class. + + -- Class: venv.EnvBuilder (system_site_packages=False, clear=False, + symlinks=False, upgrade=False, with_pip=False, prompt=None, + upgrade_deps=False) + + The *note EnvBuilder: c8a. class accepts the following keyword + arguments on instantiation: + + * ‘system_site_packages’ – a Boolean value indicating that the + system Python site-packages should be available to the + environment (defaults to ‘False’). + + * ‘clear’ – a Boolean value which, if true, will delete the + contents of any existing target directory, before creating the + environment. + + * ‘symlinks’ – a Boolean value indicating whether to attempt to + symlink the Python binary rather than copying. + + * ‘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 ‘False’). + + * ‘with_pip’ – a Boolean value which, if true, ensures pip is + installed in the virtual environment. This uses *note + ensurepip: 75. with the ‘--default-pip’ option. + + * ‘prompt’ – a String to be used after virtual environment is + activated (defaults to ‘None’ which means directory name of + the environment would be used). If the special string ‘"."’ + is provided, the basename of the current directory is used as + the prompt. + + * ‘upgrade_deps’ – Update the base venv modules to the latest on + PyPI + + Changed in version 3.4: Added the ‘with_pip’ parameter + + New in version 3.6: Added the ‘prompt’ parameter + + New in version 3.9: Added the ‘upgrade_deps’ parameter + + Creators of third-party virtual environment tools will be free to + use the provided *note EnvBuilder: c8a. class as a base class. + + The returned env-builder is an object which has a method, ‘create’: + + -- 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 ‘create’ + method will either create the environment in the specified + directory, or raise an appropriate exception. + + The ‘create’ method of the *note EnvBuilder: c8a. class + illustrates the hooks available for subclass customization: + + 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) + + Each of the methods *note ensure_directories(): 3b96, *note + create_configuration(): 3b97, *note setup_python(): 3b98, + *note setup_scripts(): 3b99. and *note post_setup(): 3b9a. can + be overridden. + + -- 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 *note + EnvBuilder: c8a. is created with the arg ‘clear=True’, + contents of the environment directory will be cleared and then + all necessary subdirectories will be recreated. + + Changed in version 3.11: The `venv' *note sysconfig + installation scheme: 25f. is used to construct the paths of + the created directories. + + -- Method: create_configuration (context) + + Creates the ‘pyvenv.cfg’ configuration file in the + environment. + + -- Method: setup_python (context) + + Creates a copy or symlink to the Python executable in the + environment. On POSIX systems, if a specific executable + ‘python3.x’ was used, symlinks to ‘python’ and ‘python3’ will + be created pointing to that executable, unless files with + those names already exist. + + -- Method: setup_scripts (context) + + Installs activation scripts appropriate to the platform into + the virtual environment. + + -- Method: upgrade_dependencies (context) + + Upgrades the core venv dependency packages (currently ‘pip’ + and ‘setuptools’) in the environment. This is done by + shelling out to the ‘pip’ executable in the environment. + + New in version 3.9. + + -- 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. + + Changed in version 3.7.2: Windows now uses redirector scripts for + ‘python[w].exe’ instead of copying the actual binaries. In 3.7.2 + only *note setup_python(): 3b98. 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 *note setup_python(): 3b98. instead of *note + setup_scripts(): 3b99. This was not the case in 3.7.2. When using + symlinks, the original executables will be linked. + + In addition, *note EnvBuilder: c8a. provides this utility method + that can be called from *note setup_scripts(): 3b99. or *note + post_setup(): 3b9a. in subclasses to assist in installing custom + scripts into the virtual environment. + + -- Method: install_scripts (context, path) + + `path' is the path to a directory that should contain + subdirectories “common”, “posix”, “nt”, each containing + scripts destined for the bin directory in the environment. + The contents of “common” and the directory corresponding to + *note os.name: 24da. are copied after some text replacement of + placeholders: + + * ‘__VENV_DIR__’ is replaced with the absolute path of the + environment directory. + + * ‘__VENV_NAME__’ is replaced with the environment name + (final path segment of environment directory). + + * ‘__VENV_PROMPT__’ is replaced with the prompt (the + environment name surrounded by parentheses and with a + following space) + + * ‘__VENV_BIN_NAME__’ is replaced with the name of the bin + directory (either ‘bin’ or ‘Scripts’). + + * ‘__VENV_PYTHON__’ is replaced with the absolute path of + the environment’s executable. + + The directories are allowed to exist (for when an existing + environment is being upgraded). + +There is also a module-level convenience function: + + -- Function: venv.create (env_dir, system_site_packages=False, + clear=False, symlinks=False, with_pip=False, prompt=None, + upgrade_deps=False) + + Create an *note EnvBuilder: c8a. with the given keyword arguments, + and call its *note create(): 3b95. method with the `env_dir' + argument. + + New 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 + + +File: python.info, Node: An example of extending EnvBuilder, Prev: API<2>, Up: venv — Creation of virtual environments + +5.28.3.3 An example of extending ‘EnvBuilder’ +............................................. + +The following script shows how to extend *note EnvBuilder: c8a. by +implementing a subclass which installs setuptools and pip into a created +virtual environment: + + import os + import os.path + from subprocess import Popen, PIPE + import sys + from threading import Thread + from urllib.parse import urlparse + 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, _, _, _ = urlparse(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 = '' + 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://bitbucket.org/pypa/setuptools/downloads/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): + compatible = True + if sys.version_info < (3, 3): + compatible = False + elif not hasattr(sys, 'base_prefix'): + compatible = False + if not compatible: + raise ValueError('This script is only for use with ' + 'Python 3.3 or later') + else: + 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) + +This script is also available for download online(1). + + ---------- Footnotes ---------- + + (1) https://gist.github.com/vsajip/4673395 + + +File: python.info, Node: zipapp — Manage executable Python zip archives, Prev: venv — Creation of virtual environments, Up: Software Packaging and Distribution + +5.28.4 ‘zipapp’ — Manage executable Python zip archives +------------------------------------------------------- + +New in version 3.5. + +`Source code:' Lib/zipapp.py(1) + +__________________________________________________________________ + +This module provides tools to manage the creation of zip files +containing Python code, which can be *note executed directly by the +Python interpreter: 1768. The module provides both a *note Command-Line +Interface: 3ba1. and a *note Python API: 3ba2. + +* Menu: + +* Basic Example:: +* Command-Line Interface: Command-Line Interface<5>. +* Python API:: +* Examples: Examples<31>. +* Specifying the Interpreter:: +* Creating Standalone Applications with zipapp:: +* The Python Zip Application Archive Format:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/zipapp.py + + +File: python.info, Node: Basic Example, Next: Command-Line Interface<5>, Up: zipapp — Manage executable Python zip archives + +5.28.4.1 Basic Example +...................... + +The following example shows how the *note Command-Line Interface: 3ba1. +can be used to create an executable archive from a directory containing +Python code. When run, the archive will execute the ‘main’ function +from the module ‘myapp’ in the archive. + + $ python -m zipapp myapp -m "myapp:main" + $ python myapp.pyz + <output from myapp> + + +File: python.info, Node: Command-Line Interface<5>, Next: Python API, Prev: Basic Example, Up: zipapp — Manage executable Python zip archives + +5.28.4.2 Command-Line Interface +............................... + +When called as a program from the command line, the following form is +used: + + $ python -m zipapp source [options] + +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: + + -- Program Option: -o <output>, --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 ‘.pyz’ added. If an explicit filename + is given, it is used as is (so a ‘.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'). + + -- Program Option: -p <interpreter>, --python=<interpreter> + + Add a ‘#!’ line to the archive specifying `interpreter' as the + command to run. Also, on POSIX, make the archive executable. The + default is to write no ‘#!’ line, and not make the file executable. + + -- Program Option: -m <mainfn>, --main=<mainfn> + + Write a ‘__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 ‘__main__.py’ file will execute + that callable. + + *note –main: 3ba9. cannot be specified when copying an archive. + + -- Program Option: -c, --compress + + Compress files with the deflate method, reducing the size of the + output file. By default, files are stored uncompressed in the + archive. + + *note –compress: 3bab. has no effect when copying an archive. + + New in version 3.7. + + -- Program Option: --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. + + -- Program Option: -h, --help + + Print a short usage message and exit. + + +File: python.info, Node: Python API, Next: Examples<31>, Prev: Command-Line Interface<5>, Up: zipapp — Manage executable Python zip archives + +5.28.4.3 Python API +................... + +The module defines two convenience functions: + + -- 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: + + * The name of a directory, or a *note path-like object: 773. + referring to a directory, in which case a new application + archive will be created from the content of that directory. + + * The name of an existing application archive file, or a *note + path-like object: 773. 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 ‘.pyz’ extension, if required. + + * 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. + + The `target' argument determines where the resulting archive will + be written: + + * If it is the name of a file, or a *note path-like object: 773, + the archive will be written to that file. + + * 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. + + * If the target is omitted (or ‘None’), the source must be a + directory and the target will be a file with the same name as + the source, with a ‘.pyz’ extension added. + + 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 ‘__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 ‘__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 ‘True’ + if the file is to be added. + + The optional `compressed' argument determines whether files are + compressed. If set to ‘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 + ‘read’ and ‘readline’, or ‘write’ methods. When creating an + archive from a directory, if the target is a file object it will be + passed to the ‘zipfile.ZipFile’ class, and must supply the methods + needed by that class. + + New in version 3.7: Added the `filter' and `compressed' arguments. + + -- Function: zipapp.get_interpreter (archive) + + Return the interpreter specified in the ‘#!’ line at the start of + the archive. If there is no ‘#!’ line, return *note None: 243. + 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. + + +File: python.info, Node: Examples<31>, Next: Specifying the Interpreter, Prev: Python API, Up: zipapp — Manage executable Python zip archives + +5.28.4.4 Examples +................. + +Pack up a directory into an archive, and run it. + + $ python -m zipapp myapp + $ python myapp.pyz + <output from myapp> + +The same can be done using the *note create_archive(): 813. function: + + >>> import zipapp + >>> zipapp.create_archive('myapp', 'myapp.pyz') + +To make the application directly executable on POSIX, specify an +interpreter to use. + + $ python -m zipapp myapp -p "/usr/bin/env python" + $ ./myapp.pyz + <output from myapp> + +To replace the shebang line on an existing archive, create a modified +archive using the *note create_archive(): 813. function: + + >>> import zipapp + >>> zipapp.create_archive('old_archive.pyz', 'new_archive.pyz', '/usr/bin/python3') + +To update the file in place, do the replacement in memory using a +‘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: + + >>> 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()) + + +File: python.info, Node: Specifying the Interpreter, Next: Creating Standalone Applications with zipapp, Prev: Examples<31>, Up: zipapp — Manage executable Python zip archives + +5.28.4.5 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 ‘#!’ line, but there are other issues to consider: + + * 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. + + * 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). + + * 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. + +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. + + +File: python.info, Node: Creating Standalone Applications with zipapp, Next: The Python Zip Application Archive Format, Prev: Specifying the Interpreter, Up: zipapp — Manage executable Python zip archives + +5.28.4.6 Creating Standalone Applications with zipapp +..................................................... + +Using the *note zipapp: 14c. 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: + + 1. Create your application in a directory as normal, so you have a + ‘myapp’ directory containing a ‘__main__.py’ file, and any + supporting application code. + + 2. Install all of your application’s dependencies into the ‘myapp’ + directory, using pip: + + $ python -m pip install -r requirements.txt --target myapp + + (this assumes you have your project requirements in a + ‘requirements.txt’ file - if not, you can just list the + dependencies manually on the pip command line). + + 3. Optionally, delete the ‘.dist-info’ directories created by pip in + the ‘myapp’ directory. These hold metadata for pip to manage the + packages, and as you won’t be making any further use of pip they + aren’t required - although it won’t do any harm if you leave them. + + 4. Package the application using: + + $ python -m zipapp -p "interpreter" myapp + +This will produce a standalone executable, which can be run on any +machine with the appropriate interpreter available. See *note +Specifying the Interpreter: 3bb5. for details. It can be shipped to +users as a single file. + +On Unix, the ‘myapp.pyz’ file is executable as it stands. You can +rename the file to remove the ‘.pyz’ extension if you prefer a “plain” +command name. On Windows, the ‘myapp.pyz[w]’ file is executable by +virtue of the fact that the Python interpreter registers the ‘.pyz’ and +‘.pyzw’ file extensions when installed. + +* Menu: + +* Making a Windows executable:: +* Caveats:: + + +File: python.info, Node: Making a Windows executable, Next: Caveats, Up: Creating Standalone Applications with zipapp + +5.28.4.7 Making a Windows executable +.................................... + +On Windows, registration of the ‘.pyz’ extension is optional, and +furthermore, there are certain places that don’t recognise registered +extensions “transparently” (the simplest example is that +‘subprocess.run(['myapp'])’ won’t find your application - you need to +explicitly specify the extension). + +On Windows, therefore, it is often preferable to create an executable +from the zipapp. This is relatively easy, although it does require a C +compiler. The basic approach relies on the fact that zipfiles can have +arbitrary data prepended, and Windows exe files can have arbitrary data +appended. So by creating a suitable launcher and tacking the ‘.pyz’ +file onto the end of it, you end up with a single-file executable that +runs your application. + +A suitable launcher can be as simple as the following: + + #define Py_LIMITED_API 1 + #include "Python.h" + + #define WIN32_LEAN_AND_MEAN + #include <windows.h> + + #ifdef WINDOWS + int WINAPI wWinMain( + HINSTANCE hInstance, /* handle to current instance */ + HINSTANCE hPrevInstance, /* handle to previous instance */ + LPWSTR lpCmdLine, /* pointer to command line */ + int nCmdShow /* show state of window */ + ) + #else + int wmain() + #endif + { + wchar_t **myargv = _alloca((__argc + 1) * sizeof(wchar_t*)); + myargv[0] = __wargv[0]; + memcpy(myargv + 1, __wargv, __argc * sizeof(wchar_t *)); + return Py_Main(__argc+1, myargv); + } + +If you define the ‘WINDOWS’ preprocessor symbol, this will generate a +GUI executable, and without it, a console executable. + +To compile the executable, you can either just use the standard MSVC +command line tools, or you can take advantage of the fact that distutils +knows how to compile Python source: + + >>> from distutils.ccompiler import new_compiler + >>> import distutils.sysconfig + >>> import sys + >>> import os + >>> from pathlib import Path + + >>> def compile(src): + >>> src = Path(src) + >>> cc = new_compiler() + >>> exe = src.stem + >>> cc.add_include_dir(distutils.sysconfig.get_python_inc()) + >>> cc.add_library_dir(os.path.join(sys.base_exec_prefix, 'libs')) + >>> # First the CLI executable + >>> objs = cc.compile([str(src)]) + >>> cc.link_executable(objs, exe) + >>> # Now the GUI executable + >>> cc.define_macro('WINDOWS') + >>> objs = cc.compile([str(src)]) + >>> cc.link_executable(objs, exe + 'w') + + >>> if __name__ == "__main__": + >>> compile("zastub.c") + +The resulting launcher uses the “Limited ABI”, so it will run unchanged +with any version of Python 3.x. All it needs is for Python +(‘python3.dll’) to be on the user’s ‘PATH’. + +For a fully standalone distribution, you can distribute the launcher +with your application appended, bundled with the Python “embedded” +distribution. This will run on any PC with the appropriate architecture +(32 bit or 64 bit). + + +File: python.info, Node: Caveats, Prev: Making a Windows executable, Up: Creating Standalone Applications with zipapp + +5.28.4.8 Caveats +................ + +There are some limitations to the process of bundling your application +into a single file. In most, if not all, cases they can be addressed +without needing major changes to your application. + + 1. 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 ‘__main__.py’ to include the directory containing the unzipped + module in ‘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 ‘sys.path’ at + runtime, based on the user’s machine). + + 2. If you are shipping a Windows executable as described above, you + either need to ensure that your users have ‘python3.dll’ on their + PATH (which is not the default behaviour of the installer) or you + should bundle your application with the embedded distribution. + + 3. The suggested launcher above uses the Python embedding API. This + means that in your application, ‘sys.executable’ will be your + application, and `not' a conventional Python interpreter. Your + code and its dependencies need to be prepared for this possibility. + For example, if your application uses the *note multiprocessing: + b5. module, it will need to call *note + multiprocessing.set_executable(): 11eb. to let the module know + where to find the standard Python interpreter. + + +File: python.info, Node: The Python Zip Application Archive Format, Prev: Creating Standalone Applications with zipapp, Up: zipapp — Manage executable Python zip archives + +5.28.4.9 The Python Zip Application Archive Format +.................................................. + +Python has been able to execute zip files which contain a ‘__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 +‘__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 *note sys.path: 162. 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 (‘#!/path/to/interpreter’). + +Formally, the Python zip application format is therefore: + + 1. An optional shebang line, containing the characters ‘b'#!'’ + followed by an interpreter name, and then a newline (‘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 *note + sys.getfilesystemencoding(): 8c8. on POSIX. + + 2. Standard zipfile data, as generated by the *note zipfile: 14d. + module. The zipfile content `must' include a file called + ‘__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. + +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. + + +File: python.info, Node: Python Runtime Services, Next: Custom Python Interpreters, Prev: Software Packaging and Distribution, Up: The Python Standard Library + +5.29 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:: +* 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:: +* site — Site-specific configuration hook:: + + +File: python.info, Node: sys — System-specific parameters and functions, Next: sysconfig — Provide access to Python’s configuration information, Up: Python Runtime Services + +5.29.1 ‘sys’ — System-specific parameters and functions +------------------------------------------------------- + +__________________________________________________________________ + +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. + + -- Data: sys.abiflags + + On POSIX systems where Python was built with the standard + ‘configure’ script, this contains the ABI flags as specified by PEP + 3149(1). + + Changed in version 3.8: Default flags became an empty string (‘m’ + flag for pymalloc has been removed). + + New in version 3.2. + + -- 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 *note sys.audit(): + 1387. 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 *note PySys_AddAuditHook(): 3a3f. 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. + + Calling *note sys.addaudithook(): 3a3e. will itself raise an + auditing event named ‘sys.addaudithook’ with no arguments. If any + existing hooks raise an exception derived from *note RuntimeError: + 6e9, 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 *note audit events table: 1269. for all events raised by + CPython, and PEP 578(2) for the original design discussion. + + New in version 3.8. + + Changed in version 3.8.1: Exceptions derived from *note Exception: + 61c. but not *note RuntimeError: 6e9. are no longer suppressed. + + `CPython implementation detail:' When tracing is enabled (see *note + settrace(): 1139.), Python hooks are only traced if the callable + has a ‘__cantrace__’ member that is set to a true value. + Otherwise, trace functions will skip the hook. + + -- Data: sys.argv + + The list of command line arguments passed to a Python script. + ‘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 *note -c: 1ad. command line option to the + interpreter, ‘argv[0]’ is set to the string ‘'-c'’. If no script + name was passed to the Python interpreter, ‘argv[0]’ is the empty + string. + + To loop over the standard input, or the list of files given on the + command line, see the *note fileinput: 7b. module. + + See also *note sys.orig_argv: 437. + + 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 ‘[os.fsencode(arg) for arg in + sys.argv]’. + -- Function: sys.audit (event, *args) + + 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 ‘os.chdir’. This event + has one argument called `path' that will contain the requested new + working directory. + + *note sys.audit(): 1387. 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 *note sys.addaudithook(): 3a3e. or *note + PySys_AddAuditHook(): 3a3f. functions. + + The native equivalent of this function is *note PySys_Audit(): + 1397. Using the native function is preferred when possible. + + See the *note audit events table: 1269. for all events raised by + CPython. + + New in version 3.8. + + -- Data: sys.base_exec_prefix + + Set during Python startup, before ‘site.py’ is run, to the same + value as *note exec_prefix: 3b92. If not running in a *note + virtual environment: 3b90, the values will stay the same; if + ‘site.py’ finds that a virtual environment is in use, the values of + *note prefix: 3b91. and *note exec_prefix: 3b92. will be changed to + point to the virtual environment, whereas *note base_prefix: 3512. + and *note base_exec_prefix: 3b93. will remain pointing to the base + Python installation (the one which the virtual environment was + created from). + + New in version 3.3. + + -- Data: sys.base_prefix + + Set during Python startup, before ‘site.py’ is run, to the same + value as *note prefix: 3b91. If not running in a *note virtual + environment: 3b90, the values will stay the same; if ‘site.py’ + finds that a virtual environment is in use, the values of *note + prefix: 3b91. and *note exec_prefix: 3b92. will be changed to point + to the virtual environment, whereas *note base_prefix: 3512. and + *note base_exec_prefix: 3b93. will remain pointing to the base + Python installation (the one which the virtual environment was + created from). + + New in version 3.3. + + -- Data: sys.byteorder + + An indicator of the native byte order. This will have the value + ‘'big'’ on big-endian (most-significant byte first) platforms, and + ‘'little'’ on little-endian (least-significant byte first) + platforms. + + -- 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 — ‘modules.keys()’ only lists the + imported modules.) + + See also the *note sys.stdlib_module_names: 438. list. + + -- Function: sys.call_tracing (func, args) + + Call ‘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 some other code. + + -- Data: sys.copyright + + A string containing the copyright pertaining to the Python + interpreter. + + -- 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. + + -- 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 *note traceback: + 11d. 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 *note auditing event: 12c0. ‘sys._current_frames’ with no + arguments. + + -- 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 *note auditing event: 12c0. ‘sys._current_exceptions’ + with no arguments. + + -- Function: sys.breakpointhook () + + This hook function is called by built-in *note breakpoint(): 716. + By default, it drops you into the *note pdb: c6. 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. ‘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 + ‘breakpoint()’ function passes its ‘*args’ and ‘**kws’ straight + through. Whatever ‘breakpointhooks()’ returns is returned from + ‘breakpoint()’. + + The default implementation first consults the environment variable + *note PYTHONBREAKPOINT: 72f. If that is set to ‘"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, + ‘pdb.set_trace()’ is called. Otherwise this variable should name a + function to run, using Python’s dotted-import nomenclature, e.g. + ‘package.subpackage.module.function’. In this case, + ‘package.subpackage.module’ would be imported and the resulting + module must have a callable named ‘function()’. This is run, + passing in ‘*args’ and ‘**kws’, and whatever ‘function()’ returns, + ‘sys.breakpointhook()’ returns to the built-in *note breakpoint(): + 716. function. + + Note that if anything goes wrong while importing the callable named + by *note PYTHONBREAKPOINT: 72f, a *note RuntimeWarning: 6ef. is + reported and the breakpoint is ignored. + + Also note that if ‘sys.breakpointhook()’ is overridden + programmatically, *note PYTHONBREAKPOINT: 72f. is `not' consulted. + + New in version 3.7. + + -- Function: sys._debugmallocstats () + + Print low-level information to stderr about the state of CPython’s + memory allocator. + + If Python is *note built in debug mode: 496. (*note configure + –with-pydebug option: 17c4.), it also performs some expensive + internal consistency checks. + + New in version 3.3. + + `CPython implementation detail:' This function is specific to + CPython. The exact output format is not defined here, and may + change. + + -- Data: sys.dllhandle + + Integer specifying the handle of the Python DLL. + + *note Availability: 1794.: Windows. + + -- Function: sys.displayhook (value) + + If `value' is not ‘None’, this function prints ‘repr(value)’ to + ‘sys.stdout’, and saves `value' in ‘builtins._’. If ‘repr(value)’ + is not encodable to ‘sys.stdout.encoding’ with ‘sys.stdout.errors’ + error handler (which is probably ‘'strict'’), encode it to + ‘sys.stdout.encoding’ with ‘'backslashreplace'’ error handler. + + ‘sys.displayhook’ is called on the result of evaluating an *note + expression: 193a. entered in an interactive Python session. The + display of these values can be customized by assigning another + one-argument function to ‘sys.displayhook’. + + Pseudo-code: + + 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 + + Changed in version 3.2: Use ‘'backslashreplace'’ error handler on + *note UnicodeEncodeError: 246. + + -- Data: sys.dont_write_bytecode + + If this is true, Python won’t try to write ‘.pyc’ files on the + import of source modules. This value is initially set to ‘True’ or + ‘False’ depending on the *note -B: 103a. command line option and + the *note PYTHONDONTWRITEBYTECODE: 103b. environment variable, but + you can set it yourself to control bytecode file generation. + + -- Data: sys._emscripten_info + + A *note named tuple: 221. holding information about the environment + on the `wasm32-emscripten' platform. The named tuple is + provisional and may change in the future. + + Attribute Explanation + + ------------------------------------------------------------------------------------- + + ‘emscripten_version’ Emscripten version as tuple of ints (major, + minor, micro), e.g. ‘(3, 1, 8)’. + + + ‘runtime’ Runtime string, e.g. browser user agent, + ‘'Node.js v14.18.2'’, or ‘'UNKNOWN'’. + + + ‘pthreads’ ‘True’ if Python is compiled with Emscripten + pthreads support. + + + ‘shared_memory’ ‘True’ if Python is compiled with shared memory + support. + + + *note Availability: 1794.: Emscripten. + + New in version 3.11. + + -- Data: sys.pycache_prefix + + If this is set (not ‘None’), Python will write bytecode-cache + ‘.pyc’ files to (and read them from) a parallel directory tree + rooted at this directory, rather than from ‘__pycache__’ + directories in the source code tree. Any ‘__pycache__’ directories + in the source code tree will be ignored and new ‘.pyc’ files + written within the pycache prefix. Thus if you use *note + compileall: 1f. 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 *note -X: + 174. ‘pycache_prefix=PATH’ command-line option or the *note + PYTHONPYCACHEPREFIX: 5f3. environment variable (command-line takes + precedence). If neither are set, it is ‘None’. + + New in version 3.8. + + -- Function: sys.excepthook (type, value, traceback) + + This function prints out a given traceback and exception to + ‘sys.stderr’. + + When an exception is raised and uncaught, the interpreter calls + ‘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 ‘sys.excepthook’. + + Raise an auditing event ‘sys.excepthook’ with arguments ‘hook’, + ‘type’, ‘value’, ‘traceback’ when an uncaught exception occurs. If + no hook has been set, ‘hook’ may be ‘None’. If any hook raises an + exception derived from *note RuntimeError: 6e9. the call to the + hook will be suppressed. Otherwise, the audit hook exception will + be reported as unraisable and ‘sys.excepthook’ will be called. + + See also + ........ + + The *note sys.unraisablehook(): 24e. function handles unraisable + exceptions and the *note threading.excepthook(): 442. function + handles exception raised by *note threading.Thread.run(): 68a. + + -- Data: sys.__breakpointhook__ + -- Data: sys.__displayhook__ + -- Data: sys.__excepthook__ + -- Data: sys.__unraisablehook__ + + These objects contain the original values of ‘breakpointhook’, + ‘displayhook’, ‘excepthook’, and ‘unraisablehook’ at the start of + the program. They are saved so that ‘breakpointhook’, + ‘displayhook’ and ‘excepthook’, ‘unraisablehook’ can be restored in + case they happen to get replaced with broken or alternative + objects. + + New in version 3.7: __breakpointhook__ + + New in version 3.8: __unraisablehook__ + + -- Function: sys.exception () + + This function, when called while an exception handler is executing + (such as an ‘except’ or ‘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 ‘None’. + + New in version 3.11. + + -- Function: sys.exc_info () + + This function returns the old-style representation of the handled + exception. If an exception ‘e’ is currently handled (so *note + exception(): 25c. would return ‘e’), *note exc_info(): 25b. returns + the tuple ‘(type(e), e, e.__traceback__)’. That is, a tuple + containing the type of the exception (a subclass of *note + BaseException: 17d.), the exception itself, and a *note traceback + object: 749. which typically encapsulates the call stack at the + point where the exception last occurred. + + If no exception is being handled anywhere on the stack, this + function return a tuple containing three ‘None’ values. + + Changed in version 3.11: The ‘type’ and ‘traceback’ fields are now + derived from the ‘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 *note exc_info(): + 25b. + + -- 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 ‘'/usr/local'’. This can be set at build time with the + ‘--exec-prefix’ argument to the ‘configure’ script. Specifically, + all configuration files (e.g. the ‘pyconfig.h’ header file) are + installed in the directory ‘`exec_prefix'/lib/python`X.Y'/config’, + and shared library modules are installed in + ‘`exec_prefix'/lib/python`X.Y'/lib-dynload’, where `X.Y' is the + version number of Python, for example ‘3.2’. + + Note: If a *note virtual environment: 3b90. is in effect, this + value will be changed in ‘site.py’ to point to the virtual + environment. The value for the Python installation will still + be available, via *note base_exec_prefix: 3b93. + + -- 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, *note + sys.executable: 6be. will be an empty string or ‘None’. + + -- Function: sys.exit ([arg]) + + Raise a *note SystemExit: 9b6. 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 kind of + errors. If another type of object is passed, ‘None’ is equivalent + to passing zero, and any other object is printed to *note stderr: + 581. and results in an exit code of 1. In particular, + ‘sys.exit("some error message")’ is a quick way to exit a program + when an error occurs. + + Since *note exit(): 1bd4. 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 *note try: 1073. 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 *note SystemExit: 9b6. (such as an + error flushing buffered data in the standard streams), the exit + status is changed to 120. + + -- Data: sys.flags + + The *note named tuple: 221. `flags' exposes the status of command + line flags. The attributes are read only. + + attribute flag + + ----------------------------------------------------------------------------------------------------------------------------------------------------- + + ‘debug’ *note -d: 1772. + + + *note inspect: 9e. *note -i: 111d. + + + ‘interactive’ *note -i: 111d. + + + ‘isolated’ *note -I: 5b0. + + + ‘optimize’ *note -O: a34. or *note -OO: a35. + + + *note dont_write_bytecode: 3bc3. *note -B: 103a. + + + ‘no_user_site’ *note -s: 101c. + + + ‘no_site’ *note -S: e5c. + + + ‘ignore_environment’ *note -E: 5af. + + + ‘verbose’ *note -v: 1088. + + + ‘bytes_warning’ *note -b: 1b1. + + + ‘quiet’ *note -q: 1779. + + + ‘hash_randomization’ *note -R: 14d9. + + + ‘dev_mode’ *note -X dev: 174. (*note Python Development Mode: 506.) + + + ‘utf8_mode’ *note -X utf8: 174. + + + ‘safe_path’ *note -P: 15f. + + + ‘int_max_str_digits’ *note -X int_max_str_digits: 174. (*note integer string conversion length limitation: 1c9.) + + + Changed in version 3.2: Added ‘quiet’ attribute for the new *note + -q: 1779. flag. + + New in version 3.2.3: The ‘hash_randomization’ attribute. + + Changed in version 3.3: Removed obsolete ‘division_warning’ + attribute. + + Changed in version 3.4: Added ‘isolated’ attribute for *note -I: + 5b0. ‘isolated’ flag. + + Changed in version 3.7: Added the ‘dev_mode’ attribute for the new + *note Python Development Mode: 506. and the ‘utf8_mode’ attribute + for the new *note -X: 174. ‘utf8’ flag. + + Changed in version 3.11: Added the ‘safe_path’ attribute for *note + -P: 15f. option. + + Changed in version 3.11: Added the ‘int_max_str_digits’ attribute. + + -- Data: sys.float_info + + A *note named tuple: 221. 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 + ‘float.h’ for the ‘C’ programming language; see section 5.2.4.2.2 + of the 1999 ISO/IEC C standard *note [C99]: 3bc8, ‘Characteristics + of floating types’, for details. + + attribute float.h macro explanation + + ------------------------------------------------------------------------------------------------------ + + ‘epsilon’ DBL_EPSILON difference between 1.0 and the least value greater + than 1.0 that is representable as a float + + See also *note math.ulp(): 558. + + + ‘dig’ DBL_DIG maximum number of decimal digits that can be + faithfully represented in a float; see below + + + ‘mant_dig’ DBL_MANT_DIG float precision: the number of base-‘radix’ digits + in the significand of a float + + + *note max: b9a. DBL_MAX maximum representable positive finite float + + + ‘max_exp’ DBL_MAX_EXP maximum integer `e' such that ‘radix**(e-1)’ is a + representable finite float + + + ‘max_10_exp’ DBL_MAX_10_EXP maximum integer `e' such that ‘10**e’ is in the + range of representable finite floats + + + *note min: b99. DBL_MIN minimum representable positive `normalized' float + + Use *note math.ulp(0.0): 558. to get the smallest + positive `denormalized' representable float. + + + ‘min_exp’ DBL_MIN_EXP minimum integer `e' such that ‘radix**(e-1)’ is a + normalized float + + + ‘min_10_exp’ DBL_MIN_10_EXP minimum integer `e' such that ‘10**e’ is a + normalized float + + + ‘radix’ FLT_RADIX radix of exponent representation + + + ‘rounds’ FLT_ROUNDS integer constant representing the rounding mode used + for arithmetic operations. This reflects the value + of the system FLT_ROUNDS macro at interpreter + startup time. See section 5.2.4.2.2 of the C99 + standard for an explanation of the possible values + and their meanings. + + + The attribute ‘sys.float_info.dig’ needs further explanation. If + ‘s’ is any string representing a decimal number with at most + ‘sys.float_info.dig’ significant digits, then converting ‘s’ to a + float and back again will recover a string representing the same + decimal value: + + >>> 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' + + But for strings with more than ‘sys.float_info.dig’ significant + digits, this isn’t always true: + + >>> s = '9876543211234567' # 16 significant digits is too many! + >>> format(float(s), '.16g') # conversion changes value + '9876543211234568' + + -- Data: sys.float_repr_style + + A string indicating how the *note repr(): 3ee. function behaves for + floats. If the string has value ‘'short'’ then for a finite float + ‘x’, ‘repr(x)’ aims to produce a short string with the property + that ‘float(repr(x)) == x’. This is the usual behaviour in Python + 3.1 and later. Otherwise, ‘float_repr_style’ has value ‘'legacy'’ + and ‘repr(x)’ behaves in the same way as it did in versions of + Python prior to 3.1. + + New in version 3.1. + + -- 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 *note _clear_type_cache(): 3bc0. and + *note gc.collect(): 687. to get more predictable results. + + If a Python build or implementation cannot reasonably compute this + information, *note getallocatedblocks(): c67. is allowed to return + 0 instead. + + New in version 3.4. + + -- Function: sys.getandroidapilevel () + + Return the build time API version of Android as an integer. + + *note Availability: 1794.: Android. + + New in version 3.7. + + -- Function: sys.getdefaultencoding () + + Return the name of the current default string encoding used by the + Unicode implementation. + + -- Function: sys.getdlopenflags () + + Return the current value of the flags that are used for ‘dlopen()’ + calls. Symbolic names for the flag values can be found in the + *note os: c2. module (‘RTLD_xxx’ constants, e.g. *note + os.RTLD_LAZY: dc3.). + + *note Availability: 1794.: Unix. + + -- Function: sys.getfilesystemencoding () + + Get the *note filesystem encoding: 1793.: the encoding used with + the *note filesystem error handler: 1793. to convert between + Unicode filenames and bytes filenames. The filesystem error + handler is returned from *note getfilesystemencoding(): 8c8. + + 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. + + *note os.fsencode(): 8c3. and *note os.fsdecode(): 8c2. should be + used to ensure that the correct encoding and errors mode are used. + + The *note filesystem encoding and error handler: 1793. are + configured at Python startup by the ‘PyConfig_Read()’ function: see + *note filesystem_encoding: 24dd. and *note filesystem_errors: 24de. + members of *note PyConfig: 370. + + Changed in version 3.2: *note getfilesystemencoding(): 8c8. result + cannot be ‘None’ anymore. + + Changed in version 3.6: Windows is no longer guaranteed to return + ‘'mbcs'’. See PEP 529(3) and *note + _enablelegacywindowsfsencoding(): 8ca. for more information. + + Changed in version 3.7: Return ‘'utf-8'’ if the *note Python UTF-8 + Mode: 229. is enabled. + + -- Function: sys.getfilesystemencodeerrors () + + Get the *note filesystem error handler: 1793.: the error handler + used with the *note filesystem encoding: 1793. to convert between + Unicode filenames and bytes filenames. The filesystem encoding is + returned from *note getfilesystemencoding(): 8c8. + + *note os.fsencode(): 8c3. and *note os.fsdecode(): 8c2. should be + used to ensure that the correct encoding and errors mode are used. + + The *note filesystem encoding and error handler: 1793. are + configured at Python startup by the ‘PyConfig_Read()’ function: see + *note filesystem_encoding: 24dd. and *note filesystem_errors: 24de. + members of *note PyConfig: 370. + + New in version 3.6. + + -- Function: sys.get_int_max_str_digits () + + Returns the current value for the *note integer string conversion + length limitation: 1c9. See also *note set_int_max_str_digits(): + 1184. + + New in version 3.11. + + -- 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 *note getrefcount(): 3bca. + + -- 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 *note setrecursionlimit(): 1170. + + -- 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 *note TypeError: 19c. will + be raised. + + *note getsizeof(): 11c0. calls the object’s ‘__sizeof__’ method and + adds an additional garbage collector overhead if the object is + managed by the garbage collector. + + See recursive sizeof recipe(4) for an example of using *note + getsizeof(): 11c0. recursively to find the size of containers and + all their contents. + + -- Function: sys.getswitchinterval () + + Return the interpreter’s “thread switch interval”; see *note + setswitchinterval(): 599. + + New in version 3.2. + + -- 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, *note + ValueError: 1c8. is raised. The default for `depth' is zero, + returning the frame at the top of the call stack. + + Raises an *note auditing event: 12c0. ‘sys._getframe’ with argument + ‘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. + + -- Function: sys.getprofile () + + Get the profiler function as set by *note setprofile(): 1138. + + -- Function: sys.gettrace () + + Get the trace function as set by *note settrace(): 1139. + + `CPython implementation detail:' The *note gettrace(): 1049. + 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. + + -- 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 + ‘sys.getwindowsversion()[0]’ is equivalent to + ‘sys.getwindowsversion().major’. For compatibility with prior + versions, only the first 5 elements are retrievable by indexing. + + `platform' will be ‘2 (VER_PLATFORM_WIN32_NT)’. + + `product_type' may be one of the following values: + + Constant Meaning + + ---------------------------------------------------------------------------------- + + ‘1 (VER_NT_WORKSTATION)’ The system is a workstation. + + + ‘2 (VER_NT_DOMAIN_CONTROLLER)’ The system is a domain controller. + + + ‘3 (VER_NT_SERVER)’ The system is a server, but not a + domain controller. + + + This function wraps the Win32 ‘GetVersionEx()’ function; see the + Microsoft documentation on ‘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. + + Note: `platform_version' derives the version from kernel32.dll + which can be of a different version than the OS version. + Please use *note platform: cb. module for achieving accurate + OS version. + + *note Availability: 1794.: 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' + + -- Function: sys.get_asyncgen_hooks () + + Returns an `asyncgen_hooks' object, which is similar to a *note + namedtuple: 538. of the form ‘(firstiter, finalizer)’, where + `firstiter' and `finalizer' are expected to be either ‘None’ or + functions which take an *note asynchronous generator iterator: + 3bcb. as an argument, and are used to schedule finalization of an + asynchronous generator by an event loop. + + New in version 3.6: See PEP 525(5) for more details. + + Note: This function has been added on a provisional basis (see + PEP 411(6) for details.) + + -- Function: sys.get_coroutine_origin_tracking_depth () + + Get the current coroutine origin tracking depth, as set by *note + set_coroutine_origin_tracking_depth(): 7ee. + + New in version 3.7. + + Note: This function has been added on a provisional basis (see + PEP 411(7) for details.) Use it only for debugging purposes. + + -- Data: sys.hash_info + + A *note named tuple: 221. giving parameters of the numeric hash + implementation. For more details about hashing of numeric types, + see *note Hashing of numeric types: 1bea. + + attribute explanation + + --------------------------------------------------------------------------------- + + ‘width’ width in bits used for hash values + + + ‘modulus’ prime modulus P used for numeric hash scheme + + + ‘inf’ hash value returned for a positive infinity + + + ‘nan’ (this attribute is no longer used) + + + ‘imag’ multiplier used for the imaginary part of a complex + number + + + ‘algorithm’ name of the algorithm for hashing of str, bytes, and + memoryview + + + ‘hash_bits’ internal output size of the hash algorithm + + + ‘seed_bits’ size of the seed key of the hash algorithm + + + New in version 3.2. + + Changed in version 3.4: Added `algorithm', `hash_bits' and + `seed_bits' + + -- 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: + + if sys.hexversion >= 0x010502F0: + # use some advanced feature + ... + else: + # use an alternative implementation or warn the user + ... + + This is called ‘hexversion’ since it only really looks meaningful + when viewed as the result of passing it to the built-in *note + hex(): f78. function. The *note named tuple: 221. *note + sys.version_info: 27d. may be used for a more human-friendly + encoding of the same information. + + More details of ‘hexversion’ can be found at *note API and ABI + Versioning: 3bcd. + + -- 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. ‘'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 *note + sys.version_info: 27d. 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 ‘sys.version_info’ represents. For + example, for PyPy 1.8 ‘sys.implementation.version’ might be + ‘sys.version_info(1, 8, 0, 'final', 0)’, whereas ‘sys.version_info’ + would be ‘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 *note sys.hexversion: 3bcc. + + `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 + ‘'cpython-33'’. However, a Python implementation may use some + other value if appropriate. If ‘cache_tag’ is set to ‘None’, it + indicates that module caching should be disabled. + + *note sys.implementation: d19. 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, *note sys.implementation: d19. + will not change during a run of the interpreter, nor between + implementation versions. (It may change between Python language + versions, however.) See PEP 421(8) for more information. + + New in version 3.3. + + Note: The addition of new required attributes must go through + the normal PEP process. See PEP 421(9) for more information. + + -- Data: sys.int_info + + A *note named tuple: 221. that holds information about Python’s + internal representation of integers. The attributes are read only. + + Attribute Explanation + + ------------------------------------------------------------------------------------------------- + + ‘bits_per_digit’ number of bits held in each digit. Python + integers are stored internally in base + ‘2**int_info.bits_per_digit’ + + + ‘sizeof_digit’ size in bytes of the C type used to represent a + digit + + + ‘default_max_str_digits’ default value for + *note sys.get_int_max_str_digits(): 1cd5. when it + is not otherwise explicitly configured. + + + ‘str_digits_check_threshold’ minimum non-zero value for + *note sys.set_int_max_str_digits(): 1184, + *note PYTHONINTMAXSTRDIGITS: 1183, or + *note -X int_max_str_digits: 174. + + + New in version 3.1. + + Changed in version 3.11: Added ‘default_max_str_digits’ and + ‘str_digits_check_threshold’. + + -- Data: sys.__interactivehook__ + + When this attribute exists, its value is automatically called (with + no arguments) when the interpreter is launched in *note interactive + mode: c68. This is done after the *note PYTHONSTARTUP: c6a. file + is read, so that you can set this hook there. The *note site: e8. + module *note sets this: c6b. + + Raises an *note auditing event: 12c0. ‘cpython.run_interactivehook’ + with the hook object as the argument when the hook is called on + startup. + + New in version 3.4. + + -- 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 immortal; you must keep a reference to the + return value of *note intern(): f7f. around to benefit from it. + + -- Function: sys.is_finalizing () + + Return *note True: 877. if the Python interpreter is *note shutting + down: aff, *note False: 78d. otherwise. + + New in version 3.5. + + -- Data: sys.last_type + -- Data: sys.last_value + -- Data: sys.last_traceback + + These three variables are not always defined; they are set when an + exception is not handled and the interpreter prints an error + message and a stack traceback. Their 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 ‘import pdb; pdb.pm()’ to enter + the post-mortem debugger; see *note pdb: c6. module for more + information.) + + The meaning of the variables is the same as that of the return + values from *note exc_info(): 25b. above. + + -- Data: sys.maxsize + + An integer giving the maximum value a variable of type *note + Py_ssize_t: 6b1. can take. It’s usually ‘2**31 - 1’ on a 32-bit + platform and ‘2**63 - 1’ on a 64-bit platform. + + -- Data: sys.maxunicode + + An integer giving the value of the largest Unicode code point, i.e. + ‘1114111’ (‘0x10FFFF’ in hexadecimal). + + Changed in version 3.3: Before PEP 393(10), ‘sys.maxunicode’ used + to be either ‘0xFFFF’ or ‘0x10FFFF’, depending on the configuration + option that specified whether Unicode characters were stored as + UCS-2 or UCS-4. + + -- Data: sys.meta_path + + A list of *note meta path finder: d1f. objects that have their + *note find_spec(): 46f. 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 *note + find_spec(): 46f. 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 *note __path__: + 16ba. attribute is passed in as a second argument. The method + returns a *note module spec: 3bcf, or ‘None’ if the module cannot + be found. + + See also + ........ + + *note importlib.abc.MetaPathFinder: 473. + + The abstract base class defining the interface of finder + objects on *note meta_path: 9a0. + + *note importlib.machinery.ModuleSpec: 19b8. + + The concrete class which *note find_spec(): 46f. should return + instances of. + + Changed in version 3.4: *note Module specs: 3bcf. were introduced + in Python 3.4, by PEP 451(11). Earlier versions of Python looked + for a method called *note find_module(): 2ed. This is still called + as a fallback if a *note meta_path: 9a0. entry doesn’t have a *note + find_spec(): 46f. method. + + -- 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 ‘sys.modules.copy()’ or + ‘tuple(sys.modules)’ to avoid exceptions as its size may change + during iteration as a side effect of code or activity in other + threads. + + -- Data: sys.orig_argv + + The list of the original command line arguments passed to the + Python executable. + + See also *note sys.argv: f1f. + + New in version 3.10. + + -- Data: sys.path + + A list of strings that specifies the search path for modules. + Initialized from the environment variable *note PYTHONPATH: cc7, + plus an installation-dependent default. + + By default, as initialized upon program startup, a potentially + unsafe path is prepended to *note sys.path: 162. (`before' the + entries inserted as a result of *note PYTHONPATH: cc7.): + + * ‘python -m module’ command line: prepend the current working + directory. + + * ‘python script.py’ command line: prepend the script’s + directory. If it’s a symbolic link, resolve symbolic links. + + * ‘python -c code’ and ‘python’ (REPL) command lines: prepend an + empty string, which means the current working directory. + + To not prepend this potentially unsafe path, use the *note -P: 15f. + command line option or the *note PYTHONSAFEPATH: 160. environment + variable? + + A program is free to modify this list for its own purposes. Only + strings should be added to *note sys.path: 162.; all other data + types are ignored during import. + + See also + ........ + + * Module *note site: e8. This describes how to use .pth files to + extend *note sys.path: 162. + + -- Data: sys.path_hooks + + A list of callables that take a path argument to try to create a + *note finder: 19ac. for the path. If a finder can be created, it + is to be returned by the callable, else raise *note ImportError: + 511. + + Originally specified in PEP 302(12). + + -- Data: sys.path_importer_cache + + A dictionary acting as a cache for *note finder: 19ac. objects. + The keys are paths that have been passed to *note sys.path_hooks: + cd0. and the values are the finders that are found. If a path is a + valid file system path but no finder is found on *note + sys.path_hooks: cd0. then ‘None’ is stored. + + Originally specified in PEP 302(13). + + Changed in version 3.3: ‘None’ is stored instead of *note + imp.NullImporter: d26. when no finder is found. + + -- Data: sys.platform + + This string contains a platform identifier that can be used to + append platform-specific components to *note sys.path: 162, for + instance. + + For Unix systems, except on Linux and AIX, this is the lowercased + OS name as returned by ‘uname -s’ with the first part of the + version as returned by ‘uname -r’ appended, e.g. ‘'sunos5'’ or + ‘'freebsd8'’, `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: + + if sys.platform.startswith('freebsd'): + # FreeBSD-specific code here... + elif sys.platform.startswith('linux'): + # Linux-specific code here... + elif sys.platform.startswith('aix'): + # AIX-specific code here... + + For other systems, the values are: + + System ‘platform’ value + + ----------------------------------------------------- + + AIX ‘'aix'’ + + + Emscripten ‘'emscripten'’ + + + Linux ‘'linux'’ + + + WASI ‘'wasi'’ + + + Windows ‘'win32'’ + + + Windows/Cygwin ‘'cygwin'’ + + + macOS ‘'darwin'’ + + + Changed in version 3.3: On Linux, *note sys.platform: 6e0. doesn’t + contain the major version anymore. It is always ‘'linux'’, instead + of ‘'linux2'’ or ‘'linux3'’. Since older Python versions include + the version number, it is recommended to always use the + ‘startswith’ idiom presented above. + + Changed in version 3.8: On AIX, *note sys.platform: 6e0. doesn’t + contain the major version anymore. It is always ‘'aix'’, instead + of ‘'aix5'’ or ‘'aix7'’. Since older Python versions include the + version number, it is recommended to always use the ‘startswith’ + idiom presented above. + + See also + ........ + + *note os.name: 24da. has a coarser granularity. *note os.uname(): + dc1. gives system-dependent version information. + + The *note platform: cb. module provides detailed checks for the + system’s identity. + + -- 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 ‘"lib"’ on most platforms. On Fedora and SuSE, it + is equal to ‘"lib64"’ on 64-bit platforms which gives the following + ‘sys.path’ paths (where ‘X.Y’ is the Python ‘major.minor’ version): + + * ‘/usr/lib64/pythonX.Y/’: Standard library (like ‘os.py’ of the + *note os: c2. module) + + * ‘/usr/lib64/pythonX.Y/lib-dynload/’: C extension modules of + the standard library (like the *note errno: 77. module, the + exact filename is platform specific) + + * ‘/usr/lib/pythonX.Y/site-packages/’ (always use ‘lib’, not + *note sys.platlibdir: 580.): Third-party modules + + * ‘/usr/lib64/pythonX.Y/site-packages/’: C extension modules of + third-party packages + + New in version 3.9. + + -- Data: sys.prefix + + A string giving the site-specific directory prefix where the + platform independent Python files are installed; on Unix, the + default is ‘'/usr/local'’. This can be set at build time with the + ‘--prefix’ argument to the ‘configure’ script. See *note + Installation paths: 25f. for derived paths. + + Note: If a *note virtual environment: 3b90. is in effect, this + value will be changed in ‘site.py’ to point to the virtual + environment. The value for the Python installation will still + be available, via *note base_prefix: 3512. + + -- Data: sys.ps1 + -- Data: sys.ps2 + + 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 ‘'>>> '’ + and ‘'... '’. If a non-string object is assigned to either + variable, its *note str(): 1b3. is re-evaluated each time the + interpreter prepares to read a new interactive command; this can be + used to implement a dynamic prompt. + + -- Function: sys.setdlopenflags (n) + + Set the flags used by the interpreter for ‘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 ‘sys.setdlopenflags(0)’. To share symbols + across extension modules, call as + ‘sys.setdlopenflags(os.RTLD_GLOBAL)’. Symbolic names for the flag + values can be found in the *note os: c2. module (‘RTLD_xxx’ + constants, e.g. *note os.RTLD_LAZY: dc3.). + + *note Availability: 1794.: Unix. + + -- Function: sys.set_int_max_str_digits (maxdigits) + + Set the *note integer string conversion length limitation: 1c9. + used by this interpreter. See also *note get_int_max_str_digits(): + 1cd5. + + New in version 3.11. + + -- Function: sys.setprofile (profilefunc) + + Set the system’s profile function, which allows you to implement a + Python source code profiler in Python. See chapter *note The + Python Profilers: 3adf. for more information on the Python + profiler. The system’s profile function is called similarly to the + system’s trace function (see *note settrace(): 1139.), 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 ‘None’. Error in + the profile function will cause itself unset. + + Profile functions should have three arguments: `frame', `event', + and `arg'. `frame' is the current stack frame. `event' is a + string: ‘'call'’, ‘'return'’, ‘'c_call'’, ‘'c_return'’, or + ‘'c_exception'’. `arg' depends on the event type. + + Raises an *note auditing event: 12c0. ‘sys.setprofile’ with no + arguments. + + The events have the following meaning: + + ‘'call'’ + + A function is called (or some other code block entered). The + profile function is called; `arg' is ‘None’. + + ‘'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 ‘None’ if the event is caused by an exception + being raised. + + ‘'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. + + ‘'c_return'’ + + A C function has returned. `arg' is the C function object. + + ‘'c_exception'’ + + A C function has raised an exception. `arg' is the C function + object. + + -- 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 *note + RecursionError: 9e7. exception is raised. + + Changed in version 3.5.1: A *note RecursionError: 9e7. exception is + now raised if the new limit is too low at the current recursion + depth. + + -- 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. + + New in version 3.2. + + -- Function: sys.settrace (tracefunc) + + 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 *note settrace(): 1139. for + each thread being debugged or use *note threading.settrace(): 43f. + + Trace functions should have three arguments: `frame', `event', and + `arg'. `frame' is the current stack frame. `event' is a string: + ‘'call'’, ‘'line'’, ‘'return'’, ‘'exception'’ or ‘'opcode'’. `arg' + depends on the event type. + + The trace function is invoked (with `event' set to ‘'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 ‘None’ + if the scope shouldn’t be traced. + + The local trace function should return a reference to itself (or to + another function for further tracing in that scope), or ‘None’ to + turn off tracing in that scope. + + If there is any error occurred in the trace function, it will be + unset, just like ‘settrace(None)’ is called. + + The events have the following meaning: + + ‘'call'’ + + A function is called (or some other code block entered). The + global trace function is called; `arg' is ‘None’; the return + value specifies the local trace function. + + ‘'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 ‘None’; the return value specifies the new + local trace function. See ‘Objects/lnotab_notes.txt’ for a + detailed explanation of how this works. Per-line events may + be disabled for a frame by setting ‘f_trace_lines’ to *note + False: 78d. on that frame. + + ‘'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 ‘None’ if the event is caused by an exception + being raised. The trace function’s return value is ignored. + + ‘'exception'’ + + An exception has occurred. The local trace function is + called; `arg' is a tuple ‘(exception, value, traceback)’; the + return value specifies the new local trace function. + + ‘'opcode'’ + + The interpreter is about to execute a new opcode (see *note + dis: 36. for opcode details). The local trace function is + called; `arg' is ‘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 + ‘f_trace_opcodes’ to *note True: 877. on the frame. + + Note that as an exception is propagated down the chain of callers, + an ‘'exception'’ event is generated at each level. + + For more fine-grained usage, it’s possible to set a trace function + by assigning ‘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 *note + settrace(): 1139. doesn’t do. Note that in order for this to work, + a global tracing function must have been installed with *note + settrace(): 1139. 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 ‘None’ to + disable itself immediately on each frame). + + For more information on code and frame objects, refer to *note The + standard type hierarchy: 18f3. + + Raises an *note auditing event: 12c0. ‘sys.settrace’ with no + arguments. + + `CPython implementation detail:' The *note settrace(): 1139. + 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: ‘'opcode'’ event type added; + ‘f_trace_lines’ and ‘f_trace_opcodes’ attributes added to frames + + -- Function: sys.set_asyncgen_hooks (firstiter, finalizer) + + Accepts two optional keyword arguments which are callables that + accept an *note asynchronous generator iterator: 3bcb. 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 *note auditing event: 12c0. + ‘sys.set_asyncgen_hooks_firstiter’ with no arguments. + + Raises an *note auditing event: 12c0. + ‘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. + + New in version 3.6: See PEP 525(14) for more details, and for a + reference example of a `finalizer' method see the implementation of + ‘asyncio.Loop.shutdown_asyncgens’ in Lib/asyncio/base_events.py(15) + + Note: This function has been added on a provisional basis (see + PEP 411(16) for details.) + + -- Function: sys.set_coroutine_origin_tracking_depth (depth) + + Allows enabling or disabling coroutine origin tracking. When + enabled, the ‘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, ‘cr_origin’ will + be None. + + To enable, pass a `depth' value greater than zero; this sets the + number of frames whose information will be captured. To disable, + pass set `depth' to zero. + + This setting is thread-specific. + + New in version 3.7. + + Note: This function has been added on a provisional basis (see + PEP 411(17) for details.) Use it only for debugging purposes. + + -- Function: sys._enablelegacywindowsfsencoding () + + Changes the *note filesystem encoding and error handler: 1793. to + ‘mbcs’ and ‘replace’ respectively, for consistency with versions of + Python prior to 3.6. + + This is equivalent to defining the *note + PYTHONLEGACYWINDOWSFSENCODING: 8c9. environment variable before + launching Python. + + See also *note sys.getfilesystemencoding(): 8c8. and *note + sys.getfilesystemencodeerrors(): 954. + + *note Availability: 1794.: Windows. + + New in version 3.6: See PEP 529(18) for more details. + + -- Data: sys.stdin + -- Data: sys.stdout + -- Data: sys.stderr + + *note File objects: e76. used by the interpreter for standard + input, output and errors: + + * ‘stdin’ is used for all interactive input (including calls to + *note input(): f7c.); + + * ‘stdout’ is used for the output of *note print(): c13. and + *note expression: 193a. statements and for the prompts of + *note input(): f7c.; + + * The interpreter’s own prompts and its error messages go to + ‘stderr’. + + These streams are regular *note text files: 16d0. like those + returned by the *note open(): 30b. function. Their parameters are + chosen as follows: + + * The encoding and error handling are is initialized from *note + PyConfig.stdio_encoding: 3bd0. and *note + PyConfig.stdio_errors: 3bd1. + + 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 ‘isatty()’ returns + ‘True’) use the value of the console input and output + codepages at startup, respectively for stdin and + stdout/stderr. This defaults to the system *note locale + encoding: 24df. 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 *note PYTHONIOENCODING: cad. environment + variable before starting Python or by using the new *note -X: + 174. ‘utf8’ command line option and *note PYTHONUTF8: 72c. + environment variable. However, for the Windows console, this + only applies when *note PYTHONLEGACYWINDOWSSTDIO: 8cc. is also + set. + + * When interactive, the ‘stdout’ stream is line-buffered. + Otherwise, it is block-buffered like regular text files. The + ‘stderr’ stream is line-buffered in both cases. You can make + both streams unbuffered by passing the *note -u: 13c1. + command-line option or setting the *note PYTHONUNBUFFERED: + 13c2. environment variable. + + Changed in version 3.9: Non-interactive ‘stderr’ is now + line-buffered instead of fully buffered. + + Note: To write or read binary data from/to the standard + streams, use the underlying binary *note buffer: f51. object. + For example, to write bytes to *note stdout: 72a, use + ‘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 + *note io.StringIO: bbe. which do not support the ‘buffer’ + attribute. + + -- Data: sys.__stdin__ + -- Data: sys.__stdout__ + -- Data: sys.__stderr__ + + These objects contain the original values of ‘stdin’, ‘stderr’ and + ‘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 ‘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. + + Note: Under some conditions ‘stdin’, ‘stdout’ and ‘stderr’ as + well as the original values ‘__stdin__’, ‘__stdout__’ and + ‘__stderr__’ can be ‘None’. It is usually the case for + Windows GUI apps that aren’t connected to a console and Python + apps started with ‘pythonw’. + + -- 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 ‘email’ package is + listed, but the ‘email.mime’ sub-package and the ‘email.message’ + sub-module are not listed. + + See also the *note sys.builtin_module_names: 16ac. list. + + New in version 3.10. + + -- Data: sys.thread_info + + A *note named tuple: 221. holding information about the thread + implementation. + + Attribute Explanation + + ------------------------------------------------------------------------------------- + + ‘name’ Name of the thread implementation: + + * ‘'nt'’: Windows threads + + * ‘'pthread'’: POSIX threads + + * ‘'pthread-stubs'’: stub POSIX threads (on + WebAssembly platforms without threading support) + + * ‘'solaris'’: Solaris threads + + + ‘lock’ Name of the lock implementation: + + * ‘'semaphore'’: a lock uses a semaphore + + * ‘'mutex+cond'’: a lock uses a mutex and a + condition variable + + * ‘None’ if this information is unknown + + + *note version: 990. Name and version of the thread library. It is a string, or + ‘None’ if this information is unknown. + + + New in version 3.3. + + -- 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 ‘1000’. When set to + ‘0’ or less, all traceback information is suppressed and only the + exception type and value are printed. + + -- 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 (*note gc.collect(): 687.). + + The `unraisable' argument has the following attributes: + + * `exc_type': Exception type. + + * `exc_value': Exception value, can be ‘None’. + + * `exc_traceback': Exception traceback, can be ‘None’. + + * `err_msg': Error message, can be ‘None’. + + * `object': Object causing the exception, can be ‘None’. + + The default hook formats `err_msg' and `object' as: ‘f'{err_msg}: + {object!r}'’; use “Exception ignored in” error message if `err_msg' + is ‘None’. + + *note sys.unraisablehook(): 24e. can be overridden to control how + unraisable exceptions 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 `object' using a custom hook can resurrect it if it is set + to an object which is being finalized. Avoid storing `object' + after the custom hook completes to avoid resurrecting objects. + + See also *note excepthook(): 3fe. which handles uncaught + exceptions. + + Raise an auditing event ‘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 ‘None’. + + New in version 3.8. + + -- 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 + *note version_info: 27d. and the functions provided by the *note + platform: cb. module. + + -- Data: sys.api_version + + The C API version for this interpreter. Programmers may find this + useful when debugging version conflicts between Python and + extension modules. + + -- 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 + ‘'alpha'’, ‘'beta'’, ‘'candidate'’, or ‘'final'’. The + ‘version_info’ value corresponding to the Python version 2.0 is + ‘(2, 0, 0, 'final', 0)’. The components can also be accessed by + name, so ‘sys.version_info[0]’ is equivalent to + ‘sys.version_info.major’ and so on. + + Changed in version 3.1: Added named component attributes. + + -- Data: sys.warnoptions + + This is an implementation detail of the warnings framework; do not + modify this value. Refer to the *note warnings: 130. module for + more information on the warnings framework. + + -- 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 first three characters of *note version: 990. It + is provided in the *note sys: f9. module for informational + purposes; modifying this value has no effect on the registry keys + used by Python. + + *note Availability: 1794.: Windows. + + -- Data: sys._xoptions + + A dictionary of the various implementation-specific flags passed + through the *note -X: 174. command-line option. Option names are + either mapped to their values, if given explicitly, or to *note + True: 877. 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} + + `CPython implementation detail:' This is a CPython-specific way of + accessing options passed through *note -X: 174. Other + implementations may export them through other means, or not at all. + + New in version 3.2. + +Citations +......... + +(C99) ISO/IEC 9899:1999. “Programming languages – C.” A public draft of +this standard is available at +‘https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf’. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3149/ + + (2) https://peps.python.org/pep-0578/ + + (3) https://peps.python.org/pep-0529/ + + (4) https://code.activestate.com/recipes/577504 + + (5) https://peps.python.org/pep-0525/ + + (6) https://peps.python.org/pep-0411/ + + (7) https://peps.python.org/pep-0411/ + + (8) https://peps.python.org/pep-0421/ + + (9) https://peps.python.org/pep-0421/ + + (10) https://peps.python.org/pep-0393/ + + (11) https://peps.python.org/pep-0451/ + + (12) https://peps.python.org/pep-0302/ + + (13) https://peps.python.org/pep-0302/ + + (14) https://peps.python.org/pep-0525/ + + (15) +https://github.com/python/cpython/tree/3.11/Lib/asyncio/base_events.py + + (16) https://peps.python.org/pep-0411/ + + (17) https://peps.python.org/pep-0411/ + + (18) https://peps.python.org/pep-0529/ + + +File: python.info, Node: sysconfig — Provide access to Python’s configuration information, Next: builtins — Built-in objects, Prev: sys — System-specific parameters and functions, Up: Python Runtime Services + +5.29.2 ‘sysconfig’ — Provide access to Python’s configuration information +------------------------------------------------------------------------- + +New in version 3.2. + +`Source code:' Lib/sysconfig.py(1) + +__________________________________________________________________ + +The *note sysconfig: fa. 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:: +* Other functions: Other functions<3>. +* Using sysconfig as a script:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/sysconfig.py + + +File: python.info, Node: Configuration variables, Next: Installation paths, Up: sysconfig — Provide access to Python’s configuration information + +5.29.2.1 Configuration variables +................................ + +A Python distribution contains a ‘Makefile’ and a ‘pyconfig.h’ header +file that are necessary to build both the Python binary itself and +third-party C extensions compiled using *note distutils: 37. + +*note sysconfig: fa. puts all variables found in these files in a +dictionary that can be accessed using *note get_config_vars(): cd8. or +*note get_config_var(): cd7. + +Notice that on Windows, it’s a much smaller set. + + -- 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 ‘None’. + + -- Function: sysconfig.get_config_var (name) + + Return the value of a single variable `name'. Equivalent to + ‘get_config_vars().get(name)’. + + If `name' is not found, return ‘None’. + +Example of usage: + + >>> 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++'] + + +File: python.info, Node: Installation paths, Next: Other functions<3>, Prev: Configuration variables, Up: sysconfig — Provide access to Python’s configuration information + +5.29.2.2 Installation paths +........................... + +Python uses an installation scheme that differs depending on the +platform and on the installation options. These schemes are stored in +*note sysconfig: fa. under unique identifiers based on the value +returned by *note os.name: 24da. + +Every new component that is installed using *note distutils: 37. or a +Distutils-based system will follow the same scheme to copy its file in +the right places. + +Python currently supports nine schemes: + + - `posix_prefix': scheme for POSIX platforms like Linux or macOS. + This is the default scheme used when Python or a component is + installed. + + - `posix_home': scheme for POSIX platforms used when a `home' option + is used upon installation. This scheme is used when a component is + installed through Distutils with a specific home prefix. + + - `posix_user': scheme for POSIX platforms used when a component is + installed through Distutils and the `user' option is used. This + scheme defines paths located under the user home directory. + + - `posix_venv': scheme for *note Python virtual environments: 12f. on + POSIX platforms; by default it is the same as `posix_prefix' . + + - `nt': scheme for NT platforms like Windows. + + - `nt_user': scheme for NT platforms, when the `user' option is used. + + - `nt_venv': scheme for *note Python virtual environments: 12f. on NT + platforms; by default it is the same as `nt' . + + - `venv': a scheme with values from ether `posix_venv' or `nt_venv' + depending on the platform Python runs on + + - `osx_framework_user': scheme for macOS, when the `user' option is + used. + +Each scheme is itself composed of a series of paths and each path has a +unique identifier. Python currently uses eight paths: + + - `stdlib': directory containing the standard Python library files + that are not platform-specific. + + - `platstdlib': directory containing the standard Python library + files that are platform-specific. + + - `platlib': directory for site-specific, platform-specific files. + + - `purelib': directory for site-specific, non-platform-specific + files. + + - `include': directory for non-platform-specific header files for the + Python C-API. + + - `platinclude': directory for platform-specific header files for the + Python C-API. + + - `scripts': directory for script files. + + - `data': directory for data files. + +*note sysconfig: fa. provides some functions to determine these paths. + + -- Function: sysconfig.get_scheme_names () + + Return a tuple containing all schemes currently supported in *note + sysconfig: fa. + + -- Function: sysconfig.get_default_scheme () + + Return the default scheme name for the current platform. + + Changed in version 3.10: This function was previously named + ‘_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. + + -- Function: sysconfig.get_preferred_scheme (key) + + Return a preferred scheme name for an installation layout specified + by `key'. + + `key' must be either ‘"prefix"’, ‘"home"’, or ‘"user"’. + + The return value is a scheme name listed in *note + get_scheme_names(): 3bda. It can be passed to *note sysconfig: fa. + functions that take a `scheme' argument, such as *note get_paths(): + f02. + + New in version 3.10. + + Changed in version 3.11: When Python runs from a virtual + environment and ‘key="prefix"’, the `venv' scheme is returned. + + -- 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 ‘_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 *note + get_default_scheme(): 1210. and *note get_preferred_scheme(): 260. + instead. + + New in version 3.10. + + -- Function: sysconfig.get_path_names () + + Return a tuple containing all path names currently supported in + *note sysconfig: fa. + + -- 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 *note + get_path_names(): 3bdc. + + *note sysconfig: fa. 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: + ‘{base}/Lib’. + + *note get_path(): fc8. will use the variables returned by *note + get_config_vars(): cd8. 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 *note get_scheme_names(): 3bda. 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 return by *note get_config_vars(): cd8. + + If `expand' is set to ‘False’, the path will not be expanded using + the variables. + + If `name' is not found, raise a *note KeyError: 6f5. + + -- Function: sysconfig.get_paths ([scheme[, vars[, expand]]]) + + Return a dictionary containing all installation paths corresponding + to an installation scheme. See *note get_path(): fc8. 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, *note get_paths(): f02. will + raise a *note KeyError: 6f5. + + +File: python.info, Node: Other functions<3>, Next: Using sysconfig as a script, Prev: Installation paths, Up: sysconfig — Provide access to Python’s configuration information + +5.29.2.3 Other functions +........................ + + -- Function: sysconfig.get_python_version () + + Return the ‘MAJOR.MINOR’ Python version number as a string. + Similar to ‘'%d.%d' % sys.version_info[:2]’. + + -- 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 ‘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: + + - linux-i586 + + - linux-alpha (?) + + - solaris-2.6-sun4u + + Windows will return one of: + + - win-amd64 (64bit Windows on AMD64, aka x86_64, Intel64, and + EM64T) + + - win32 (all others - specifically, sys.platform is returned) + + macOS can return: + + - macosx-10.6-ppc + + - macosx-10.4-ppc64 + + - macosx-10.3-i386 + + - macosx-10.4-fat + + For other non-POSIX platforms, currently just returns *note + sys.platform: 6e0. + + -- Function: sysconfig.is_python_build () + + Return ‘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 ‘make install’ or installing + via a binary installer. + + -- Function: sysconfig.parse_config_h (fp[, vars]) + + Parse a ‘config.h’-style file. + + `fp' is a file-like object pointing to the ‘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. + + -- Function: sysconfig.get_config_h_filename () + + Return the path of ‘pyconfig.h’. + + -- Function: sysconfig.get_makefile_filename () + + Return the path of ‘Makefile’. + + +File: python.info, Node: Using sysconfig as a script, Prev: Other functions<3>, Up: sysconfig — Provide access to Python’s configuration information + +5.29.2.4 Using ‘sysconfig’ as a script +...................................... + +You can use *note sysconfig: fa. as a script with Python’s `-m' option: + + $ 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" + ... + +This call will print in the standard output the information returned by +*note get_platform(): f00, *note get_python_version(): f01, *note +get_path(): fc8. and *note get_config_vars(): cd8. + + +File: python.info, Node: builtins — Built-in objects, Next: __main__ — Top-level code environment, Prev: sysconfig — Provide access to Python’s configuration information, Up: Python Runtime Services + +5.29.3 ‘builtins’ — Built-in objects +------------------------------------ + +__________________________________________________________________ + +This module provides direct access to all ‘built-in’ identifiers of +Python; for example, ‘builtins.open’ is the full name for the built-in +function *note open(): 30b. See *note Built-in Functions: f18. and +*note Built-in Constants: 1bcf. for documentation. + +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 *note open(): 30b. +function that wraps the built-in *note open(): 30b, this module can be +used directly: + + import builtins + + def open(path): + f = builtins.open(path, 'r') + return UpperCaser(f) + + class UpperCaser: + '''Wrapper around a file that converts output to uppercase.''' + + def __init__(self, f): + self._f = f + + def read(self, count=-1): + return self._f.read(count).upper() + + # ... + +As an implementation detail, most modules have the name ‘__builtins__’ +made available as part of their globals. The value of ‘__builtins__’ is +normally either this module or the value of this module’s *note +__dict__: 8ce. attribute. Since this is an implementation detail, it +may not be used by alternate implementations of Python. + + +File: python.info, Node: __main__ — Top-level code environment, Next: warnings — Warning control, Prev: builtins — Built-in objects, Up: Python Runtime Services + +5.29.4 ‘__main__’ — Top-level code environment +---------------------------------------------- + +__________________________________________________________________ + +In Python, the special name ‘__main__’ is used for two important +constructs: + + 1. the name of the top-level environment of the program, which can be + checked using the ‘__name__ == '__main__'’ expression; and + + 2. the ‘__main__.py’ file in Python packages. + +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 *note Modules: 16a3. for an introduction. + +* Menu: + +* __name__ == '__main__':: +* __main__.py in Python Packages: __main__ py in Python Packages. +* import __main__:: + + +File: python.info, Node: __name__ == '__main__', Next: __main__ py in Python Packages, Up: __main__ — Top-level code environment + +5.29.4.1 ‘__name__ == '__main__'’ +................................. + +When a Python module or package is imported, ‘__name__’ is set to the +module’s name. Usually, this is the name of the Python file itself +without the ‘.py’ extension: + + >>> import configparser + >>> configparser.__name__ + 'configparser' + +If the file is part of a package, ‘__name__’ will also include the +parent package’s path: + + >>> from concurrent.futures import process + >>> process.__name__ + 'concurrent.futures.process' + +However, if the module is executed in the top-level code environment, +its ‘__name__’ is set to the string ‘'__main__'’. + +* Menu: + +* What is the “top-level code environment”?:: +* Idiomatic Usage:: +* Packaging Considerations:: + + +File: python.info, Node: What is the “top-level code environment”?, Next: Idiomatic Usage, Up: __name__ == '__main__' + +5.29.4.2 What is the “top-level code environment”? +.................................................. + +‘__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: + + * the scope of an interactive prompt: + + >>> __name__ + '__main__' + + * the Python module passed to the Python interpreter as a file + argument: + + $ python3 helloworld.py + Hello, world! + + * the Python module or package passed to the Python interpreter with + the *note -m: 1ae. argument: + + $ python3 -m tarfile + usage: tarfile.py [-h] [-v] (...) + + * Python code read by the Python interpreter from standard input: + + $ echo "import this" | python3 + The Zen of Python, by Tim Peters + + Beautiful is better than ugly. + Explicit is better than implicit. + ... + + * Python code passed to the Python interpreter with the *note -c: + 1ad. argument: + + $ python3 -c "import this" + The Zen of Python, by Tim Peters + + Beautiful is better than ugly. + Explicit is better than implicit. + ... + +In each of these situations, the top-level module’s ‘__name__’ is set to +‘'__main__'’. + +As a result, a module can discover whether or not it is running in the +top-level environment by checking its own ‘__name__’, which allows a +common idiom for conditionally executing code when the module is not +initialized from an import statement: + + if __name__ == '__main__': + # Execute when the module is not initialized from an import statement. + ... + +See also +........ + +For a more detailed look at how ‘__name__’ is set in all situations, see +the tutorial section *note Modules: 16a3. + + +File: python.info, Node: Idiomatic Usage, Next: Packaging Considerations, Prev: What is the “top-level code environment”?, Up: __name__ == '__main__' + +5.29.4.3 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 ‘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 ‘if __name___ +== '__main__'’ can improve code clarity and correctness. Most often, a +function named ‘main’ encapsulates the program’s primary behavior: + + # 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 + +Note that if the module didn’t encapsulate code inside the ‘main’ +function but instead put it directly within the ‘if __name__ == +'__main__'’ block, the ‘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 +‘main’ function solves this problem. + +Using a ‘main’ function has the added benefit of the ‘echo’ function +itself being isolated and importable elsewhere. When ‘echo.py’ is +imported, the ‘echo’ and ‘main’ functions will be defined, but neither +of them will be called, because ‘__name__ != '__main__'’. + + +File: python.info, Node: Packaging Considerations, Prev: Idiomatic Usage, Up: __name__ == '__main__' + +5.29.4.4 Packaging Considerations +................................. + +‘main’ functions are often used to create command-line tools by +specifying them as entry points for console scripts. When this is done, +pip(1) inserts the function call into a template script, where the +return value of ‘main’ is passed into *note sys.exit(): fec. For +example: + + sys.exit(main()) + +Since the call to ‘main’ is wrapped in *note sys.exit(): fec, the +expectation is that your function will return some value acceptable as +an input to *note sys.exit(): fec.; typically, an integer or ‘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. ‘python3 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 ‘main’ +function. *note sys.exit(): fec. will interpret a string argument as a +failure message, so your program will have an exit code of ‘1’, +indicating failure, and the string will be written to *note sys.stderr: +581. The ‘echo.py’ example from earlier exemplifies using the +‘sys.exit(main())’ convention. + +See also +........ + +Python Packaging User Guide(2) contains a collection of tutorials and +references on how to distribute and install Python packages with modern +tools. + + ---------- Footnotes ---------- + + (1) https://pip.pypa.io/ + + (2) https://packaging.python.org/ + + +File: python.info, Node: __main__ py in Python Packages, Next: import __main__, Prev: __name__ == '__main__', Up: __main__ — Top-level code environment + +5.29.4.5 ‘__main__.py’ in Python Packages +......................................... + +If you are not familiar with Python packages, see section *note +Packages: 16b4. of the tutorial. Most commonly, the ‘__main__.py’ file +is used to provide a command-line interface for a package. Consider the +following hypothetical package, “bandclass”: + + bandclass + ├── __init__.py + ├── __main__.py + └── student.py + +‘__main__.py’ will be executed when the package itself is invoked +directly from the command line using the *note -m: 1ae. flag. For +example: + + $ python3 -m bandclass + +This command will cause ‘__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: + + # bandclass/__main__.py + + import sys + from .student import search_students + + student_name = sys.argv[2] if len(sys.argv) >= 2 else '' + print(f'Found student: {search_students(student_name)}') + +Note that ‘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 *note Intra-package References: +16b8. in the *note Modules: 16a3. section of the tutorial. + +* Menu: + +* Idiomatic Usage: Idiomatic Usage<2>. + + +File: python.info, Node: Idiomatic Usage<2>, Up: __main__ py in Python Packages + +5.29.4.6 Idiomatic Usage +........................ + +The contents of ‘__main__.py’ typically isn’t fenced with ‘if __name__ +== '__main__'’ blocks. Instead, those files are kept short, functions +to execute from other modules. Those other modules can then be easily +unit-tested and are properly reusable. + +If used, an ‘if __name__ == '__main__'’ block will still work as +expected for a ‘__main__.py’ file within a package, because its +‘__name__’ attribute will include the package’s path if imported: + + >>> import asyncio.__main__ + >>> asyncio.__main__.__name__ + 'asyncio.__main__' + +This won’t work for ‘__main__.py’ files in the root directory of a .zip +file though. Hence, for consistency, minimal ‘__main__.py’ like the +*note venv: 12f. one mentioned below are preferred. + +See also +........ + +See *note venv: 12f. for an example of a package with a minimal +‘__main__.py’ in the standard library. It doesn’t contain a ‘if +__name__ == '__main__'’ block. You can invoke it with ‘python3 -m venv +[directory]’. + +See *note runpy: df. for more details on the *note -m: 1ae. flag to the +interpreter executable. + +See *note zipapp: 14c. for how to run applications packaged as `.zip' +files. In this case Python looks for a ‘__main__.py’ file in the root +directory of the archive. + + +File: python.info, Node: import __main__, Prev: __main__ py in Python Packages, Up: __main__ — Top-level code environment + +5.29.4.7 ‘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 (*note namespace: 16a4.) by importing the ‘__main__’ +module. This doesn’t import a ‘__main__.py’ file but rather whichever +module that received the special name ‘'__main__'’. + +Here is an example module that consumes the ‘__main__’ namespace: + + # 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`!') + + if '__file__' in dir(__main__): + print(__main__.my_name, "found in file", __main__.__file__) + else: + print(__main__.my_name) + +Example usage of this module could be as follows: + + # 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()) + +Now, if we started our program, the result would look like this: + + $ python3 start.py + Define the variable `my_name`! + +The exit code of the program would be 1, indicating an error. +Uncommenting the line with ‘my_name = "Dinsdale"’ fixes the program and +now it exits with status code 0, indicating success: + + $ python3 start.py + Dinsdale found in file /path/to/start.py + +Note that importing ‘__main__’ doesn’t cause any issues with +unintentionally running top-level code meant for script use which is put +in the ‘if __name__ == "__main__"’ block of the ‘start’ module. Why +does this work? + +Python inserts an empty ‘__main__’ module in *note sys.modules: 1382. at +interpreter startup, and populates it by running top-level code. In our +example this is the ‘start’ module which runs line by line and imports +‘namely’. In turn, ‘namely’ imports ‘__main__’ (which is really +‘start’). That’s an import cycle! Fortunately, since the partially +populated ‘__main__’ module is present in *note sys.modules: 1382, +Python passes that to ‘namely’. See *note Special considerations for +__main__: 19d0. 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 ‘__main__’ scope: + + >>> 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 + +Note that in this case the ‘__main__’ scope doesn’t contain a ‘__file__’ +attribute as it’s interactive. + +The ‘__main__’ scope is used in the implementation of *note pdb: c6. and +*note rlcompleter: de. + + +File: python.info, Node: warnings — Warning control, Next: dataclasses — Data Classes, Prev: __main__ — Top-level code environment, Up: Python Runtime Services + +5.29.5 ‘warnings’ — Warning control +----------------------------------- + +`Source code:' Lib/warnings.py(1) + +__________________________________________________________________ + +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 *note warn(): 1152. +function defined in this module. (C programmers use *note +PyErr_WarnEx(): 10b0.; see *note Exception Handling: 3bf0. for details). + +Warning messages are normally written to *note sys.stderr: 581, 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 *note warning category: 1d0b, 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 *note warning filter: 504, which is a sequence of matching rules and +actions. Rules can be added to the filter by calling *note +filterwarnings(): 1102. and reset to its default state by calling *note +resetwarnings(): 3bf1. + +The printing of warning messages is done by calling *note showwarning(): +3bf2, which may be overridden; the default implementation of this +function formats the message by calling *note formatwarning(): 1446, +which is also available for use by custom implementations. + +See also +........ + +*note logging.captureWarnings(): 26d8. 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:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/warnings.py + + +File: python.info, Node: Warning Categories, Next: The Warnings Filter, Up: warnings — Warning control + +5.29.5.1 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 *note built-in exceptions: 1d09, 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 *note Warning: 1d0c. class. + +The following warnings category classes are currently defined: + +Class Description + +------------------------------------------------------------------------------------------- + +*note Warning: 1d0c. This is the base class of all warning category + classes. It is a subclass of + *note Exception: 61c. + + +*note UserWarning: 1d0d. The default category for *note warn(): 1152. + + +*note DeprecationWarning: 2d4. Base category for warnings about deprecated + features when those warnings are intended for + other Python developers (ignored by default, + unless triggered by code in ‘__main__’). + + +*note SyntaxWarning: 2d5. Base category for warnings about dubious + syntactic features. + + +*note RuntimeWarning: 6ef. Base category for warnings about dubious runtime + features. + + +*note FutureWarning: 73e. Base category for warnings about deprecated + features when those warnings are intended for end + users of applications that are written in Python. + + +*note PendingDeprecationWarning: 503. Base category for warnings about features that + will be deprecated in the future (ignored by + default). + + +*note ImportWarning: 46d. Base category for warnings triggered during the + process of importing a module (ignored by + default). + + +*note UnicodeWarning: 1087. Base category for warnings related to Unicode. + + +*note BytesWarning: 88f. Base category for warnings related to + *note bytes: 1b4. and *note bytearray: 1a5. + + +*note ResourceWarning: 8a9. Base category for warnings related to resource + usage (ignored by default). + + +Changed in version 3.7: Previously *note DeprecationWarning: 2d4. and +*note FutureWarning: 73e. 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. + + +File: python.info, Node: The Warnings Filter, Next: Temporarily Suppressing Warnings, Prev: Warning Categories, Up: warnings — Warning control + +5.29.5.2 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: + + * `action' is one of the following strings: + + Value Disposition + + ----------------------------------------------------------------------- + + ‘"default"’ print the first occurrence of matching warnings + for each location (module + line number) where + the warning is issued + + + ‘"error"’ turn matching warnings into exceptions + + + ‘"ignore"’ never print matching warnings + + + ‘"always"’ always print matching warnings + + + ‘"module"’ print the first occurrence of matching warnings + for each module where the warning is issued + (regardless of line number) + + + ‘"once"’ print only the first occurrence of matching + warnings, regardless of location + + + * `message' is a string containing a regular expression that the + start of the warning message must match, case-insensitively. In + *note -W: 502. and *note PYTHONWARNINGS: 80e, `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'. + + * `category' is a class (a subclass of *note Warning: 1d0c.) of which + the warning category must be a subclass in order to match. + + * `module' is a string containing a regular expression that the start + of the fully qualified module name must match, case-sensitively. + In *note -W: 502. and *note PYTHONWARNINGS: 80e, `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'. + + * `lineno' is an integer that the line number where the warning + occurred must match, or ‘0’ to match all line numbers. + +Since the *note Warning: 1d0c. class is derived from the built-in *note +Exception: 61c. class, to turn a warning into an error we simply raise +‘category(message)’. + +If a warning is reported and doesn’t match any registered filter then +the “default” action is applied (hence its name). + +* Menu: + +* Describing Warning Filters:: +* Default Warning Filter:: +* Overriding the default filter:: + + +File: python.info, Node: Describing Warning Filters, Next: Default Warning Filter, Up: The Warnings Filter + +5.29.5.3 Describing Warning Filters +................................... + +The warnings filter is initialized by *note -W: 502. options passed to +the Python interpreter command line and the *note PYTHONWARNINGS: 80e. +environment variable. The interpreter saves the arguments for all +supplied entries without interpretation in *note sys.warnoptions: 80d.; +the *note warnings: 130. module parses these when it is first imported +(invalid options are ignored, after printing a message to *note +sys.stderr: 581.). + +Individual warnings filters are specified as a sequence of fields +separated by colons: + + action:message:category:module:line + +The meaning of each of these fields is as described in *note The +Warnings Filter: 504. When listing multiple filters on a single line +(as for *note PYTHONWARNINGS: 80e.), 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: + + 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" + + +File: python.info, Node: Default Warning Filter, Next: Overriding the default filter, Prev: Describing Warning Filters, Up: The Warnings Filter + +5.29.5.4 Default Warning Filter +............................... + +By default, Python installs several warning filters, which can be +overridden by the *note -W: 502. command-line option, the *note +PYTHONWARNINGS: 80e. environment variable and calls to *note +filterwarnings(): 1102. + +In regular release builds, the default warning filter has the following +entries (in order of precedence): + + default::DeprecationWarning:__main__ + ignore::DeprecationWarning + ignore::PendingDeprecationWarning + ignore::ImportWarning + ignore::ResourceWarning + +In a *note debug build: 496, the list of default warning filters is +empty. + +Changed in version 3.2: *note DeprecationWarning: 2d4. is now ignored by +default in addition to *note PendingDeprecationWarning: 503. + +Changed in version 3.7: *note DeprecationWarning: 2d4. is once again +shown by default when triggered directly by code in ‘__main__’. + +Changed in version 3.7: *note BytesWarning: 88f. no longer appears in +the default filter list and is instead configured via *note +sys.warnoptions: 80d. when *note -b: 1b1. is specified twice. + + +File: python.info, Node: Overriding the default filter, Prev: Default Warning Filter, Up: The Warnings Filter + +5.29.5.5 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 *note +sys.warnoptions: 80d. attribute used to pass filter configurations to +the interpreter can be used as a marker to indicate whether or not +warnings should be disabled: + + import sys + + if not sys.warnoptions: + import warnings + warnings.simplefilter("ignore") + +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: + + 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 + +Finally, developers of interactive shells that run user code in a +namespace other than ‘__main__’ are advised to ensure that *note +DeprecationWarning: 2d4. messages are made visible by default, using +code like the following (where ‘user_ns’ is the module used to execute +code entered interactively): + + import warnings + warnings.filterwarnings("default", category=DeprecationWarning, + module=user_ns.get("__name__")) + + +File: python.info, Node: Temporarily Suppressing Warnings, Next: Testing Warnings, Prev: The Warnings Filter, Up: warnings — Warning control + +5.29.5.6 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 *note catch_warnings: 288. +context manager: + + import warnings + + def fxn(): + warnings.warn("deprecated", DeprecationWarning) + + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + fxn() + +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. Note: this can only be +guaranteed in a single-threaded application. If two or more threads use +the *note catch_warnings: 288. context manager at the same time, the +behavior is undefined. + + +File: python.info, Node: Testing Warnings, Next: Updating Code For New Versions of Dependencies, Prev: Temporarily Suppressing Warnings, Up: warnings — Warning control + +5.29.5.7 Testing Warnings +......................... + +To test warnings raised by code, use the *note catch_warnings: 288. +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: + + 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) + +One can also cause all warnings to be exceptions by using ‘error’ +instead of ‘always’. One thing to be aware of is that if a warning has +already been raised because of a ‘once’/‘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. The *note showwarning(): 3bf2. function in +the module is also restored to its original value. Note: this can only +be guaranteed in a single-threaded application. If two or more threads +use the *note catch_warnings: 288. context manager at the same time, the +behavior is undefined. + +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). + + +File: python.info, Node: Updating Code For New Versions of Dependencies, Next: Available Functions, Prev: Testing Warnings, Up: warnings — Warning control + +5.29.5.8 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 *note +DeprecationWarning: 2d4. (for every module except ‘__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 *note unittest: 125. +module does this). + +In less ideal cases, applications can be checked for use of deprecated +interfaces by passing *note -Wd: 502. to the Python interpreter (this is +shorthand for ‘-W default’) or setting ‘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 *note -W: +502. (e.g. ‘-W error’). See the *note -W: 502. flag for more details +on what is possible. + + +File: python.info, Node: Available Functions, Next: Available Context Managers, Prev: Updating Code For New Versions of Dependencies, Up: warnings — Warning control + +5.29.5.9 Available Functions +............................ + + -- Function: warnings.warn (message, category=None, stacklevel=1, + source=None) + + Issue a warning, or maybe ignore it or raise an exception. The + `category' argument, if given, must be a *note warning category + class: 1d0b.; it defaults to *note UserWarning: 1d0d. + Alternatively, `message' can be a *note Warning: 1d0c. instance, in + which case `category' will be ignored and ‘message.__class__’ will + be used. In this case, the message text will be ‘str(message)’. + This function raises an exception if the particular warning issued + is changed into an error by the *note warnings filter: 504. The + `stacklevel' argument can be used by wrapper functions written in + Python, like this: + + def deprecation(message): + warnings.warn(message, DeprecationWarning, stacklevel=2) + + This makes the warning refer to ‘deprecation()’’s caller, rather + than to the source of ‘deprecation()’ itself (since the latter + would defeat the purpose of the warning message). + + `source', if supplied, is the destroyed object which emitted a + *note ResourceWarning: 8a9. + + Changed in version 3.6: Added `source' parameter. + + -- 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 *note warn(): + 1152, passing in explicitly the message, category, filename and + line number, and optionally the module name and the registry (which + should be the ‘__warningregistry__’ dictionary of the module). The + module name defaults to the filename with ‘.py’ stripped; if no + registry is passed, the warning is never suppressed. `message' + must be a string and `category' a subclass of *note Warning: 1d0c. + or `message' may be a *note Warning: 1d0c. instance, in which case + `category' will be ignored. + + `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 + *note ResourceWarning: 8a9. + + Changed in version 3.6: Add the `source' parameter. + + -- Function: warnings.showwarning (message, category, filename, lineno, + file=None, line=None) + + Write a warning to a file. The default implementation calls + ‘formatwarning(message, category, filename, lineno, line)’ and + writes the resulting string to `file', which defaults to *note + sys.stderr: 581. You may replace this function with any callable + by assigning to ‘warnings.showwarning’. `line' is a line of source + code to be included in the warning message; if `line' is not + supplied, *note showwarning(): 3bf2. will try to read the line + specified by `filename' and `lineno'. + + -- 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, *note formatwarning(): 1446. will try to read the + line specified by `filename' and `lineno'. + + -- Function: warnings.filterwarnings (action, message='', + category=Warning, module='', lineno=0, append=False) + + Insert an entry into the list of *note warnings filter + specifications: 504. 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. + + -- Function: warnings.simplefilter (action, category=Warning, lineno=0, + append=False) + + Insert a simple entry into the list of *note warnings filter + specifications: 504. The meaning of the function parameters is as + for *note filterwarnings(): 1102, 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. + + -- Function: warnings.resetwarnings () + + Reset the warnings filter. This discards the effect of all + previous calls to *note filterwarnings(): 1102, including that of + the *note -W: 502. command line options and calls to *note + simplefilter(): 289. + + +File: python.info, Node: Available Context Managers, Prev: Available Functions, Up: warnings — Warning control + +5.29.5.10 Available Context Managers +.................................... + + -- 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 *note showwarning(): 3bf2. function. If the + `record' argument is *note False: 78d. (the default) the context + manager returns *note None: 243. on entry. If `record' is *note + True: 877, a list is returned that is progressively populated with + objects as seen by a custom *note showwarning(): 3bf2. function + (which also suppresses output to ‘sys.stdout’). Each object in the + list has attributes with the same names as the arguments to *note + showwarning(): 3bf2. + + The `module' argument takes a module that will be used instead of + the module returned when you import *note warnings: 130. whose + filter will be protected. This argument exists primarily for + testing the *note warnings: 130. module itself. + + If the `action' argument is not ‘None’, the remaining arguments are + passed to *note simplefilter(): 289. as if it were called + immediately on entering the context. + + Note: The *note catch_warnings: 288. manager works by + replacing and then later restoring the module’s *note + showwarning(): 3bf2. function and internal list of filter + specifications. This means the context manager is modifying + global state and therefore is not thread-safe. + + Changed in version 3.11: Added the `action', `category', `lineno', + and `append' parameters. + + +File: python.info, Node: dataclasses — Data Classes, Next: contextlib — Utilities for with-statement contexts, Prev: warnings — Warning control, Up: Python Runtime Services + +5.29.6 ‘dataclasses’ — Data Classes +----------------------------------- + +`Source code:' Lib/dataclasses.py(1) + +__________________________________________________________________ + +This module provides a decorator and functions for automatically adding +generated *note special method: 12ab.s such as ‘__init__()’ and +‘__repr__()’ to user-defined classes. It was originally described in +PEP 557(2). + +The member variables to use in these generated methods are defined using +PEP 526(3) type annotations. For example, this code: + + 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 + +will add, among other things, a ‘__init__()’ that looks like: + + 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 + +Note that this method is automatically added to the class: it is not +directly specified in the ‘InventoryItem’ definition shown above. + +New in version 3.7. + +* Menu: + +* Module contents: Module contents<4>. +* 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:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/dataclasses.py + + (2) https://peps.python.org/pep-0557/ + + (3) https://peps.python.org/pep-0526/ + + +File: python.info, Node: Module contents<4>, Next: Post-init processing, Up: dataclasses — Data Classes + +5.29.6.1 Module contents +........................ + + -- 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 *note decorator: 2f8. that is used to add + generated *note special method: 12ab.s to classes, as described + below. + + The *note dataclass(): 193. decorator examines the class to find + ‘field’s. A ‘field’ is defined as a class variable that has a + *note type annotation: 9d2. With two exceptions described below, + nothing in *note dataclass(): 193. 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 *note dataclass(): 193. 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 *note dataclass(): 193. 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 *note dataclass(): + 193. are equivalent: + + @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: + ... + + The parameters to *note dataclass(): 193. are: + + - ‘init’: If true (the default), a ‘__init__()’ method will be + generated. + + If the class already defines ‘__init__()’, this parameter is + ignored. + + - ‘repr’: If true (the default), a ‘__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: + ‘InventoryItem(name='widget', unit_price=3.0, + quantity_on_hand=10)’. + + If the class already defines ‘__repr__()’, this parameter is + ignored. + + - ‘eq’: If true (the default), an ‘__eq__()’ method will be + generated. This method compares 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 the class already defines ‘__eq__()’, this parameter is + ignored. + + - ‘order’: If true (the default is ‘False’), ‘__lt__()’, + ‘__le__()’, ‘__gt__()’, and ‘__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 *note ValueError: 1c8. is raised. + + If the class already defines any of ‘__lt__()’, ‘__le__()’, + ‘__gt__()’, or ‘__ge__()’, then *note TypeError: 19c. is + raised. + + - ‘unsafe_hash’: If ‘False’ (the default), a ‘__hash__()’ method + is generated according to how ‘eq’ and ‘frozen’ are set. + + ‘__hash__()’ is used by built-in *note hash(): 1bc, and when + objects are added to hashed collections such as dictionaries + and sets. Having a ‘__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 ‘__eq__()’, and the values of the ‘eq’ and + ‘frozen’ flags in the *note dataclass(): 193. decorator. + + By default, *note dataclass(): 193. will not implicitly add a + ‘__hash__()’ method unless it is safe to do so. Neither will + it add or change an existing explicitly defined ‘__hash__()’ + method. Setting the class attribute ‘__hash__ = None’ has a + specific meaning to Python, as described in the ‘__hash__()’ + documentation. + + If ‘__hash__()’ is not explicitly defined, or if it is set to + ‘None’, then *note dataclass(): 193. `may' add an implicit + ‘__hash__()’ method. Although not recommended, you can force + *note dataclass(): 193. to create a ‘__hash__()’ method with + ‘unsafe_hash=True’. This might be the case if your class is + logically immutable but can nonetheless be mutated. This is a + specialized use case and should be considered carefully. + + Here are the rules governing implicit creation of a + ‘__hash__()’ method. Note that you cannot both have an + explicit ‘__hash__()’ method in your dataclass and set + ‘unsafe_hash=True’; this will result in a *note TypeError: + 19c. + + If ‘eq’ and ‘frozen’ are both true, by default *note + dataclass(): 193. will generate a ‘__hash__()’ method for you. + If ‘eq’ is true and ‘frozen’ is false, ‘__hash__()’ will be + set to ‘None’, marking it unhashable (which it is, since it is + mutable). If ‘eq’ is false, ‘__hash__()’ will be left + untouched meaning the ‘__hash__()’ method of the superclass + will be used (if the superclass is *note object: 6df, this + means it will fall back to id-based hashing). + + - ‘frozen’: If true (the default is ‘False’), assigning to + fields will generate an exception. This emulates read-only + frozen instances. If ‘__setattr__()’ or ‘__delattr__()’ is + defined in the class, then *note TypeError: 19c. is raised. + See the discussion below. + + - ‘match_args’: If true (the default is ‘True’), the + ‘__match_args__’ tuple will be created from the list of + parameters to the generated ‘__init__()’ method (even if + ‘__init__()’ is not generated, see above). If false, or if + ‘__match_args__’ is already defined in the class, then + ‘__match_args__’ will not be generated. + + New in version 3.10. + + - ‘kw_only’: If true (the default value is ‘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 ‘__init__()’ + parameter generated from a keyword-only field must be + specified with a keyword when ‘__init__()’ is called. There + is no effect on any other aspect of dataclasses. See the + *note parameter: 1a44. glossary entry for details. Also see + the *note KW_ONLY: 3c05. section. + + New in version 3.10. + + - ‘slots’: If true (the default is ‘False’), ‘__slots__’ + attribute will be generated and new class will be returned + instead of the original one. If ‘__slots__’ is already + defined in the class, then *note TypeError: 19c. is raised. + + New in version 3.10. + + Changed in version 3.11: If a field name is already included + in the ‘__slots__’ of a base class, it will not be included in + the generated ‘__slots__’ to prevent overriding them(1). + Therefore, do not use ‘__slots__’ to retrieve the field names + of a dataclass. Use *note fields(): 3c06. instead. To be + able to determine inherited slots, base class ‘__slots__’ may + be any iterable, but `not' an iterator. + + - ‘weakref_slot’: If true (the default is ‘False’), add a slot + named “__weakref__”, which is required to make an instance + weakref-able. It is an error to specify ‘weakref_slot=True’ + without also specifying ‘slots=True’. + + New in version 3.11. + + ‘field’s may optionally specify a default value, using normal + Python syntax: + + @dataclass + class C: + a: int # 'a' has no default value + b: int = 0 # assign a default value for 'b' + + In this example, both ‘a’ and ‘b’ will be included in the added + ‘__init__()’ method, which will be defined as: + + def __init__(self, a: int, b: int = 0): + + *note TypeError: 19c. 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. + + -- Function: dataclasses.field (*, default=MISSING, + default_factory=MISSING, init=True, repr=True, hash=None, + compare=True, metadata=None, kw_only=MISSING) + + 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 *note field(): 1451. function. For + example: + + @dataclass + class C: + mylist: list[int] = field(default_factory=list) + + c = C() + c.mylist += [1, 2, 3] + + As shown above, the *note MISSING: 3c07. value is a sentinel object + used to detect if some parameters are provided by the user. This + sentinel is used because ‘None’ is a valid value for some + parameters with a distinct meaning. No code should directly use + the *note MISSING: 3c07. value. + + The parameters to *note field(): 1451. are: + + - ‘default’: If provided, this will be the default value for + this field. This is needed because the *note field(): 1451. + call itself replaces the normal position of the default value. + + - ‘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’. + + - ‘init’: If true (the default), this field is included as a + parameter to the generated ‘__init__()’ method. + + - ‘repr’: If true (the default), this field is included in the + string returned by the generated ‘__repr__()’ method. + + - ‘hash’: This can be a bool or ‘None’. If true, this field is + included in the generated ‘__hash__()’ method. If ‘None’ (the + default), use the value of ‘compare’: this would normally be + the expected behavior. A field should be considered in the + hash if it’s used for comparisons. Setting this value to + anything other than ‘None’ is discouraged. + + One possible reason to set ‘hash=False’ but ‘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. + + - ‘compare’: If true (the default), this field is included in + the generated equality and comparison methods (‘__eq__()’, + ‘__gt__()’, et al.). + + - ‘metadata’: This can be a mapping or None. None is treated as + an empty dict. This value is wrapped in *note + MappingProxyType(): 3bb. to make it read-only, and exposed on + the *note Field: 1cae. 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. + + - ‘kw_only’: If true, this field will be marked as keyword-only. + This is used when the generated ‘__init__()’ method’s + parameters are computed. + + New in version 3.10. + + If the default value of a field is specified by a call to *note + field(): 1451, then the class attribute for this field will be + replaced by the specified ‘default’ value. If no ‘default’ is + provided, then the class attribute will be deleted. The intent is + that after the *note dataclass(): 193. 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: + + @dataclass + class C: + x: int + y: int = field(repr=False) + z: int = field(repr=False, default=10) + t: int = 20 + + The class attribute ‘C.z’ will be ‘10’, the class attribute ‘C.t’ + will be ‘20’, and the class attributes ‘C.x’ and ‘C.y’ will not be + set. + + -- Class: dataclasses.Field + + *note Field: 1cae. objects describe each defined field. These + objects are created internally, and are returned by the *note + fields(): 3c06. module-level method (see below). Users should + never instantiate a *note Field: 1cae. object directly. Its + documented attributes are: + + - ‘name’: The name of the field. + + - ‘type’: The type of the field. + + - ‘default’, ‘default_factory’, ‘init’, ‘repr’, ‘hash’, + ‘compare’, ‘metadata’, and ‘kw_only’ have the identical + meaning and values as they do in the *note field(): 1451. + function. + + Other attributes may exist, but they are private and must not be + inspected or relied on. + + -- Function: dataclasses.fields (class_or_instance) + + Returns a tuple of *note Field: 1cae. objects that define the + fields for this dataclass. Accepts either a dataclass, or an + instance of a dataclass. Raises *note TypeError: 19c. if not + passed a dataclass or instance of one. Does not return + pseudo-fields which are ‘ClassVar’ or ‘InitVar’. + + -- 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 ‘name: value’ pairs. dataclasses, dicts, lists, and + tuples are recursed into. Other objects are copied with *note + copy.deepcopy(): 7cd. + + Example of using *note asdict(): 1270. on nested dataclasses: + + @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}]} + + To create a shallow copy, the following workaround may be used: + + dict((field.name, getattr(obj, field.name)) for field in fields(obj)) + + *note asdict(): 1270. raises *note TypeError: 19c. if ‘obj’ is not + a dataclass instance. + + -- 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 *note + copy.deepcopy(): 7cd. + + Continuing from the previous example: + + assert astuple(p) == (10, 20) + assert astuple(c) == ([(0, 0), (10, 4)],) + + To create a shallow copy, the following workaround may be used: + + tuple(getattr(obj, field.name) for field in dataclasses.fields(obj)) + + *note astuple(): 126f. raises *note TypeError: 19c. if ‘obj’ is not + a dataclass instance. + + -- 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) + + 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 ‘name’, ‘(name, type)’, or ‘(name, type, + Field)’. If just ‘name’ is supplied, ‘typing.Any’ is used for + ‘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 *note + dataclass(): 193. + + This function is not strictly required, because any Python + mechanism for creating a new class with ‘__annotations__’ can then + apply the *note dataclass(): 193. function to convert that class to + a dataclass. This function is provided as a convenience. For + example: + + C = make_dataclass('C', + [('x', int), + 'y', + ('z', int, field(default=5))], + namespace={'add_one': lambda self: self.x + 1}) + + Is equivalent to: + + @dataclass + class C: + x: int + y: 'typing.Any' + z: int = 5 + + def add_one(self): + return self.x + 1 + + -- 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 + *note TypeError: 19c. If values in ‘changes’ do not specify + fields, raises *note TypeError: 19c. + + The newly returned object is created by calling the ‘__init__()’ + method of the dataclass. This ensures that ‘__post_init__()’, if + present, is also called. + + Init-only variables without default values, if any exist, must be + specified on the call to *note replace(): 12ca. so that they can be + passed to ‘__init__()’ and ‘__post_init__()’. + + It is an error for ‘changes’ to contain any fields that are defined + as having ‘init=False’. A *note ValueError: 1c8. will be raised in + this case. + + Be forewarned about how ‘init=False’ fields work during a call to + *note replace(): 12ca. They are not copied from the source object, + but rather are initialized in ‘__post_init__()’, if they’re + initialized at all. It is expected that ‘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 + ‘replace()’ (or similarly named) method which handles instance + copying. + + -- Function: dataclasses.is_dataclass (obj) + + Return ‘True’ if its parameter is a dataclass or an instance of + one, otherwise return ‘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 ‘not + isinstance(obj, type)’: + + def is_dataclass_instance(obj): + return is_dataclass(obj) and not isinstance(obj, type) + + -- Data: dataclasses.MISSING + + A sentinel value signifying a missing default or default_factory. + + -- Data: dataclasses.KW_ONLY + + A sentinel value used as a type annotation. Any fields after a + pseudo-field with the type of *note KW_ONLY: 3c05. are marked as + keyword-only fields. Note that a pseudo-field of type *note + KW_ONLY: 3c05. is otherwise completely ignored. This includes the + name of such a field. By convention, a name of ‘_’ is used for a + *note KW_ONLY: 3c05. field. Keyword-only fields signify + ‘__init__()’ parameters that must be specified as keywords when the + class is instantiated. + + In this example, the fields ‘y’ and ‘z’ will be marked as + keyword-only fields: + + @dataclass + class Point: + x: float + _: KW_ONLY + y: float + z: float + + p = Point(0, y=1.5, z=2.0) + + In a single dataclass, it is an error to specify more than one + field whose type is *note KW_ONLY: 3c05. + + New in version 3.10. + + -- Exception: dataclasses.FrozenInstanceError + + Raised when an implicitly defined ‘__setattr__()’ or + ‘__delattr__()’ is called on a dataclass which was defined with + ‘frozen=True’. It is a subclass of *note AttributeError: 19d. + + ---------- Footnotes ---------- + + (1) +https://docs.python.org/3/reference/datamodel.html#notes-on-using-slots + + +File: python.info, Node: Post-init processing, Next: Class variables, Prev: Module contents<4>, Up: dataclasses — Data Classes + +5.29.6.2 Post-init processing +............................. + +The generated ‘__init__()’ code will call a method named +‘__post_init__()’, if ‘__post_init__()’ is defined on the class. It +will normally be called as ‘self.__post_init__()’. However, if any +‘InitVar’ fields are defined, they will also be passed to +‘__post_init__()’ in the order they were defined in the class. If no +‘__init__()’ method is generated, then ‘__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: + + @dataclass + class C: + a: float + b: float + c: float = field(init=False) + + def __post_init__(self): + self.c = self.a + self.b + +The ‘__init__()’ method generated by *note dataclass(): 193. does not +call base class ‘__init__()’ methods. If the base class has an +‘__init__()’ method that has to be called, it is common to call this +method in a ‘__post_init__()’ method: + + @dataclass + class Rectangle: + height: float + width: float + + @dataclass + class Square(Rectangle): + side: float + + def __post_init__(self): + super().__init__(self.side, self.side) + +Note, however, that in general the dataclass-generated ‘__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 ‘__post_init__()’. Also see the warning about how *note replace(): +12ca. handles ‘init=False’ fields. + + +File: python.info, Node: Class variables, Next: Init-only variables, Prev: Post-init processing, Up: dataclasses — Data Classes + +5.29.6.3 Class variables +........................ + +One of two places where *note dataclass(): 193. actually inspects the +type of a field is to determine if a field is a class variable as +defined in PEP 526(1). It does this by checking if the type of the +field is ‘typing.ClassVar’. If a field is a ‘ClassVar’, it is excluded +from consideration as a field and is ignored by the dataclass +mechanisms. Such ‘ClassVar’ pseudo-fields are not returned by the +module-level *note fields(): 3c06. function. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0526/ + + +File: python.info, Node: Init-only variables, Next: Frozen instances, Prev: Class variables, Up: dataclasses — Data Classes + +5.29.6.4 Init-only variables +............................ + +The other place where *note dataclass(): 193. 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 ‘dataclasses.InitVar’. If a +field is an ‘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 *note fields(): 3c06. function. Init-only fields are added +as parameters to the generated ‘__init__()’ method, and are passed to +the optional ‘__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: + + @dataclass + class C: + i: int + j: int = None + database: InitVar[DatabaseType] = 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) + +In this case, *note fields(): 3c06. will return *note Field: 1cae. +objects for ‘i’ and ‘j’, but not for ‘database’. + + +File: python.info, Node: Frozen instances, Next: Inheritance<2>, Prev: Init-only variables, Up: dataclasses — Data Classes + +5.29.6.5 Frozen instances +......................... + +It is not possible to create truly immutable Python objects. However, +by passing ‘frozen=True’ to the *note dataclass(): 193. decorator you +can emulate immutability. In that case, dataclasses will add +‘__setattr__()’ and ‘__delattr__()’ methods to the class. These methods +will raise a *note FrozenInstanceError: 3c09. when invoked. + +There is a tiny performance penalty when using ‘frozen=True’: +‘__init__()’ cannot use simple assignment to initialize fields, and must +use *note object.__setattr__(): 1903. + + +File: python.info, Node: Inheritance<2>, Next: Re-ordering of keyword-only parameters in __init__, Prev: Frozen instances, Up: dataclasses — Data Classes + +5.29.6.6 Inheritance +.................... + +When the dataclass is being created by the *note dataclass(): 193. +decorator, it looks through all of the class’s base classes in reverse +MRO (that is, starting at *note object: 6df.) 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: + + @dataclass + class Base: + x: Any = 15.0 + y: int = 0 + + @dataclass + class C(Base): + z: int = 10 + x: int = 15 + +The final list of fields is, in order, ‘x’, ‘y’, ‘z’. The final type of +‘x’ is ‘int’, as specified in class ‘C’. + +The generated ‘__init__()’ method for ‘C’ will look like: + + def __init__(self, x: int = 15, y: int = 0, z: int = 10): + + +File: python.info, Node: Re-ordering of keyword-only parameters in __init__, Next: Default factory functions, Prev: Inheritance<2>, Up: dataclasses — Data Classes + +5.29.6.7 Re-ordering of keyword-only parameters in ‘__init__()’ +............................................................... + +After the parameters needed for ‘__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, ‘Base.y’, ‘Base.w’, and ‘D.t’ are keyword-only fields, +and ‘Base.x’ and ‘D.z’ are regular fields: + + @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) + +The generated ‘__init__()’ method for ‘D’ will look like: + + def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t: int = 0): + +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 ‘__init__()’ parameter list. + + +File: python.info, Node: Default factory functions, Next: Mutable default values, Prev: Re-ordering of keyword-only parameters in __init__, Up: dataclasses — Data Classes + +5.29.6.8 Default factory functions +.................................. + +If a *note field(): 1451. 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: + + mylist: list = field(default_factory=list) + +If a field is excluded from ‘__init__()’ (using ‘init=False’) and the +field also specifies ‘default_factory’, then the default factory +function will always be called from the generated ‘__init__()’ function. +This happens because there is no other way to give the field an initial +value. + + +File: python.info, Node: Mutable default values, Next: Descriptor-typed fields, Prev: Default factory functions, Up: dataclasses — Data Classes + +5.29.6.9 Mutable default values +............................... + +Python stores default member variable values in class attributes. +Consider this example, not using dataclasses: + + 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 + +Note that the two instances of class ‘C’ share the same class variable +‘x’, as expected. + +Using dataclasses, `if' this code was valid: + + @dataclass + class D: + x: List = [] + def add(self, element): + self.x += element + +it would generate code similar to: + + class D: + x = [] + def __init__(self, x=x): + self.x = x + def add(self, element): + self.x += element + + assert D().x is D().x + +This has the same issue as the original example using class ‘C’. That +is, two instances of class ‘D’ that do not specify a value for ‘x’ when +creating a class instance will share the same copy of ‘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 *note dataclass(): 193. decorator will raise a +*note TypeError: 19c. 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: + + @dataclass + class D: + x: list = field(default_factory=list) + + assert D().x is not D().x + +Changed in version 3.11: Instead of looking for and disallowing objects +of type ‘list’, ‘dict’, or ‘set’, unhashable objects are now not allowed +as default values. Unhashability is used to approximate mutability. + + +File: python.info, Node: Descriptor-typed fields, Prev: Mutable default values, Up: dataclasses — Data Classes + +5.29.6.10 Descriptor-typed fields +................................. + +Fields that are assigned *note descriptor objects: 8bd. as their default +value have the following special behaviors: + + * The value for the field passed to the dataclass’s ‘__init__’ method + is passed to the descriptor’s ‘__set__’ method rather than + overwriting the descriptor object. + + * Similarly, when getting or setting the field, the descriptor’s + ‘__get__’ or ‘__set__’ method is called rather than returning or + overwriting the descriptor object. + + * To determine whether a field contains a default value, + ‘dataclasses’ will call the descriptor’s ‘__get__’ method using its + class access form (i.e. ‘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 + *note AttributeError: 19d. in this situation, no default value will + be provided for the field. + + 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 + +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. + + +File: python.info, Node: contextlib — Utilities for with-statement contexts, Next: abc — Abstract Base Classes, Prev: dataclasses — Data Classes, Up: Python Runtime Services + +5.29.7 ‘contextlib’ — Utilities for ‘with’-statement contexts +------------------------------------------------------------- + +`Source code:' Lib/contextlib.py(1) + +__________________________________________________________________ + +This module provides utilities for common tasks involving the *note +with: 19e. statement. For more information see also *note Context +Manager Types: 1977. and *note With Statement Context Managers: 1975. + +* Menu: + +* Utilities:: +* Examples and Recipes: Examples and Recipes<2>. +* Single use, reusable and reentrant context managers: Single use reusable and reentrant context managers. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/contextlib.py + + +File: python.info, Node: Utilities, Next: Examples and Recipes<2>, Up: contextlib — Utilities for with-statement contexts + +5.29.7.1 Utilities +.................. + +Functions and classes provided: + + -- Class: contextlib.AbstractContextManager + + An *note abstract base class: e6a. for classes that implement *note + object.__enter__(): 18e. and *note object.__exit__(): 1978. A + default implementation for *note object.__enter__(): 18e. is + provided which returns ‘self’ while *note object.__exit__(): 1978. + is an abstract method which by default returns ‘None’. See also + the definition of *note Context Manager Types: 1977. + + New in version 3.6. + + -- Class: contextlib.AbstractAsyncContextManager + + An *note abstract base class: e6a. for classes that implement *note + object.__aenter__(): 1988. and *note object.__aexit__(): 1989. A + default implementation for *note object.__aenter__(): 1988. is + provided which returns ‘self’ while *note object.__aexit__(): 1989. + is an abstract method which by default returns ‘None’. See also + the definition of *note Asynchronous Context Managers: 1d1. + + New in version 3.7. + + -- Function: @contextlib.contextmanager + + This function is a *note decorator: 2f8. that can be used to define + a factory function for *note with: 19e. statement context managers, + without needing to create a class or separate ‘__enter__()’ and + ‘__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 ‘close()’ method + for use with ‘contextlib.closing’ + + An abstract example would be the following to ensure correct + resource management: + + 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) + + The function can then be used like this: + + >>> 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 + + The function being decorated must return a *note generator: + d11.-iterator when called. This iterator must yield exactly one + value, which will be bound to the targets in the *note with: 19e. + statement’s ‘as’ clause, if any. + + At the point where the generator yields, the block nested in the + *note with: 19e. 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 *note try: + 1073.…*note except: 17a.…*note finally: 60a. 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 ‘with’ statement that the exception has been + handled, and execution will resume with the statement immediately + following the ‘with’ statement. + + *note contextmanager(): eb1. uses *note ContextDecorator: eb0. so + the context managers it creates can be used as decorators as well + as in *note with: 19e. 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 + *note contextmanager(): eb1. to meet the requirement that context + managers support multiple invocations in order to be used as + decorators). + + Changed in version 3.2: Use of *note ContextDecorator: eb0. + + -- Function: @contextlib.asynccontextmanager + + Similar to *note contextmanager(): eb1, but creates an *note + asynchronous context manager: 1d1. + + This function is a *note decorator: 2f8. that can be used to + define a factory function for *note async with: 1a1. statement + asynchronous context managers, without needing to create a + class or separate ‘__aenter__()’ and ‘__aexit__()’ methods. + It must be applied to an *note asynchronous generator: 1a0f. + function. + + A simple 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 ...') + + New in version 3.7. + + Context managers defined with *note asynccontextmanager(): + 77f. can be used either as decorators or with *note async + with: 1a1. statements: + + 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 ... + + 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 *note + asynccontextmanager(): 77f. 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 *note + asynccontextmanager(): 77f. can be used as decorators. + + -- Function: contextlib.closing (thing) + + Return a context manager that closes `thing' upon completion of the + block. This is basically equivalent to: + + from contextlib import contextmanager + + @contextmanager + def closing(thing): + try: + yield thing + finally: + thing.close() + + And lets you write code like this: + + from contextlib import closing + from urllib.request import urlopen + + with closing(urlopen('https://www.python.org')) as page: + for line in page: + print(line) + + without needing to explicitly close ‘page’. Even if an error + occurs, ‘page.close()’ will be called when the *note with: 19e. + block is exited. + + -- Function: contextlib.aclosing (thing) + + Return an async context manager that calls the ‘aclose()’ method of + `thing' upon completion of the block. This is basically equivalent + to: + + from contextlib import asynccontextmanager + + @asynccontextmanager + async def aclosing(thing): + try: + yield thing + finally: + await thing.aclose() + + Significantly, ‘aclosing()’ supports deterministic cleanup of async + generators when they happen to exit early by *note break: 706. or + an exception. For example: + + from contextlib import aclosing + + async with aclosing(my_generator()) as values: + async for value in values: + if value == 42: + break + + 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). + + New in version 3.10. + + -- Function: contextlib.nullcontext (enter_result=None) + + Return a context manager that returns `enter_result' from + ‘__enter__’, but otherwise does nothing. It is intended to be used + as a stand-in for an optional context manager, for 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 + + An example using `enter_result': + + 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 + + It can also be used as a stand-in for *note asynchronous context + managers: 1d1.: + + 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 + + New in version 3.7. + + Changed in version 3.10: *note asynchronous context manager: 1a3. + support was added. + + -- Function: contextlib.suppress (*exceptions) + + Return a context manager that suppresses any of the specified + exceptions if they occur in the body of a ‘with’ statement and then + resumes execution with the first statement following the end of the + ‘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: + + from contextlib import suppress + + with suppress(FileNotFoundError): + os.remove('somefile.tmp') + + with suppress(FileNotFoundError): + os.remove('someotherfile.tmp') + + This code is equivalent to: + + try: + os.remove('somefile.tmp') + except FileNotFoundError: + pass + + try: + os.remove('someotherfile.tmp') + except FileNotFoundError: + pass + + This context manager is *note reentrant: 3c18. + + New in version 3.4. + + -- Function: contextlib.redirect_stdout (new_target) + + Context manager for temporarily redirecting *note sys.stdout: 72a. + 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 *note help(): 514. normally is sent to + `sys.stdout'. You can capture that output in a string by + redirecting the output to an *note io.StringIO: bbe. object. The + replacement stream is returned from the ‘__enter__’ method and so + is available as the target of the *note with: 19e. statement: + + with redirect_stdout(io.StringIO()) as f: + help(pow) + s = f.getvalue() + + To send the output of *note help(): 514. to a file on disk, + redirect the output to a regular file: + + with open('help.txt', 'w') as f: + with redirect_stdout(f): + help(pow) + + To send the output of *note help(): 514. to `sys.stderr': + + with redirect_stdout(sys.stderr): + help(pow) + + Note that the global side effect on *note sys.stdout: 72a. 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 *note reentrant: 3c18. + + New in version 3.4. + + -- Function: contextlib.redirect_stderr (new_target) + + Similar to *note redirect_stdout(): a69. but redirecting *note + sys.stderr: 581. to another file or file-like object. + + This context manager is *note reentrant: 3c18. + + New in version 3.5. + + -- 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 *note chdir(): 1e6, it changes the + current working directory upon entering and restores the old one on + exit. + + This context manager is *note reentrant: 3c18. + + New in version 3.11. + + -- Class: contextlib.ContextDecorator + + A base class that enables a context manager to also be used as a + decorator. + + Context managers inheriting from ‘ContextDecorator’ have to + implement ‘__enter__’ and ‘__exit__’ as normal. ‘__exit__’ retains + its optional exception handling even when used as a decorator. + + ‘ContextDecorator’ is used by *note contextmanager(): eb1, so you + get this functionality automatically. + + Example of ‘ContextDecorator’: + + from contextlib import ContextDecorator + + class mycontext(ContextDecorator): + def __enter__(self): + print('Starting') + return self + + def __exit__(self, *exc): + print('Finishing') + return False + + The class can then be used like this: + + >>> @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 + + This change is just syntactic sugar for any construct of the + following form: + + def f(): + with cm(): + # Do stuff + + ‘ContextDecorator’ lets you instead write: + + @cm() + def f(): + # Do stuff + + It makes it clear that the ‘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 ‘ContextDecorator’ as a mixin class: + + from contextlib import ContextDecorator + + class mycontext(ContextBaseClass, ContextDecorator): + def __enter__(self): + return self + + def __exit__(self, *exc): + return False + + Note: As the decorated function must be able to be called + multiple times, the underlying context manager must support + use in multiple *note with: 19e. statements. If this is not + the case, then the original construct with the explicit ‘with’ + statement inside the function should be used. + + New in version 3.2. + + -- Class: contextlib.AsyncContextDecorator + + Similar to *note ContextDecorator: eb0. but only for asynchronous + functions. + + Example of ‘AsyncContextDecorator’: + + 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 + + The class can then be used like this: + + >>> @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 + + New in version 3.10. + + -- 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: + + 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 + + The ‘__enter__()’ method returns the *note ExitStack: 77e. + 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 *note with: 19e. + 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 ‘__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 *note + with: 19e. 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. + + New in version 3.3. + + -- Method: enter_context (cm) + + Enters a new context manager and adds its ‘__exit__()’ method + to the callback stack. The return value is the result of the + context manager’s own ‘__enter__()’ method. + + These context managers may suppress exceptions just as they + normally would if used directly as part of a *note with: 19e. + statement. + + Changed in version 3.11: Raises *note TypeError: 19c. instead + of *note AttributeError: 19d. if `cm' is not a context + manager. + + -- Method: push (exit) + + Adds a context manager’s ‘__exit__()’ method to the callback + stack. + + As ‘__enter__’ is `not' invoked, this method can be used to + cover part of an ‘__enter__()’ implementation with a context + manager’s own ‘__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 ‘__exit__()’ method and adds it directly to the + callback stack. + + By returning true values, these callbacks can suppress + exceptions the same way context manager ‘__exit__()’ methods + can. + + The passed in object is returned from the function, allowing + this method to be used as a function decorator. + + -- 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. + + -- Method: pop_all () + + Transfers the callback stack to a fresh *note ExitStack: 77e. + 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 *note with: 19e. statement). + + For example, a group of files can be opened as an “all or + nothing” operation as follows: + + 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. + + -- 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. + + -- Class: contextlib.AsyncExitStack + + An *note asynchronous context manager: 1d1, similar to *note + ExitStack: 77e, that supports combining both synchronous and + asynchronous context managers, as well as having coroutines for + cleanup logic. + + The ‘close()’ method is not implemented, *note aclose(): 3c1d. must + be used instead. + + -- Method: coroutine enter_async_context (cm) + + Similar to ‘enter_context()’ but expects an asynchronous + context manager. + + Changed in version 3.11: Raises *note TypeError: 19c. instead + of *note AttributeError: 19d. if `cm' is not an asynchronous + context manager. + + -- Method: push_async_exit (exit) + + Similar to ‘push()’ but expects either an asynchronous context + manager or a coroutine function. + + -- Method: push_async_callback (callback, /, *args, **kwds) + + Similar to ‘callback()’ but expects a coroutine function. + + -- Method: coroutine aclose () + + Similar to ‘close()’ but properly handles awaitables. + + Continuing the example for *note asynccontextmanager(): 77f.: + + 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. + + New in version 3.7. + + +File: python.info, Node: Examples and Recipes<2>, Next: Single use reusable and reentrant context managers, Prev: Utilities, Up: contextlib — Utilities for with-statement contexts + +5.29.7.2 Examples and Recipes +............................. + +This section describes some examples and recipes for making effective +use of the tools provided by *note contextlib: 22. + +* 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:: + + +File: python.info, Node: Supporting a variable number of context managers, Next: Catching exceptions from __enter__ methods, Up: Examples and Recipes<2> + +5.29.7.3 Supporting a variable number of context managers +......................................................... + +The primary use case for *note ExitStack: 77e. is the one given in the +class documentation: supporting a variable number of context managers +and other cleanup operations in a single *note with: 19e. 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: + + 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 + +As shown, *note ExitStack: 77e. also makes it quite easy to use *note +with: 19e. statements to manage arbitrary resources that don’t natively +support the context management protocol. + + +File: python.info, Node: Catching exceptions from __enter__ methods, Next: Cleaning up in an __enter__ implementation, Prev: Supporting a variable number of context managers, Up: Examples and Recipes<2> + +5.29.7.4 Catching exceptions from ‘__enter__’ methods +..................................................... + +It is occasionally desirable to catch exceptions from an ‘__enter__’ +method implementation, `without' inadvertently catching exceptions from +the *note with: 19e. statement body or the context manager’s ‘__exit__’ +method. By using *note ExitStack: 77e. the steps in the context +management protocol can be separated slightly in order to allow this: + + stack = ExitStack() + try: + x = stack.enter_context(cm) + except Exception: + # handle __enter__ exception + else: + with stack: + # Handle normal case + +Actually needing to do this is likely to indicate that the underlying +API should be providing a direct resource management interface for use +with *note try: 1073./*note except: 17a./*note finally: 60a. statements, +but not all APIs are well designed in that regard. When a context +manager is the only resource management API provided, then *note +ExitStack: 77e. can make it easier to handle various situations that +can’t be handled directly in a *note with: 19e. statement. + + +File: python.info, Node: Cleaning up in an __enter__ implementation, Next: Replacing any use of try-finally and flag variables, Prev: Catching exceptions from __enter__ methods, Up: Examples and Recipes<2> + +5.29.7.5 Cleaning up in an ‘__enter__’ implementation +..................................................... + +As noted in the documentation of *note ExitStack.push(): 3c1a, this +method can be useful in cleaning up an already allocated resource if +later steps in the ‘__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: + + 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() + + +File: python.info, Node: Replacing any use of try-finally and flag variables, Next: Using a context manager as a function decorator, Prev: Cleaning up in an __enter__ implementation, Up: Examples and Recipes<2> + +5.29.7.6 Replacing any use of ‘try-finally’ and flag variables +.............................................................. + +A pattern you will sometimes see is a ‘try-finally’ statement with a +flag variable to indicate whether or not the body of the ‘finally’ +clause should be executed. In its simplest form (that can’t already be +handled just by using an ‘except’ clause instead), it looks something +like this: + + cleanup_needed = True + try: + result = perform_operation() + if result: + cleanup_needed = False + finally: + if cleanup_needed: + cleanup_resources() + +As with any ‘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. + +*note ExitStack: 77e. makes it possible to instead register a callback +for execution at the end of a ‘with’ statement, and then later decide to +skip executing that callback: + + from contextlib import ExitStack + + with ExitStack() as stack: + stack.callback(cleanup_resources) + result = perform_operation() + if result: + stack.pop_all() + +This allows the intended cleanup up 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: + + 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() + +If the resource cleanup isn’t already neatly bundled into a standalone +function, then it is still possible to use the decorator form of *note +ExitStack.callback(): 6d5. to declare the resource cleanup in advance: + + from contextlib import ExitStack + + with ExitStack() as stack: + @stack.callback + def cleanup_resources(): + ... + result = perform_operation() + if result: + stack.pop_all() + +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. + + +File: python.info, Node: Using a context manager as a function decorator, Prev: Replacing any use of try-finally and flag variables, Up: Examples and Recipes<2> + +5.29.7.7 Using a context manager as a function decorator +........................................................ + +*note ContextDecorator: eb0. makes it possible to use a context manager +in both an ordinary ‘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 *note ContextDecorator: eb0. +provides both capabilities in a single definition: + + 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) + +Instances of this class can be used as both a context manager: + + with track_entry_and_exit('widget loader'): + print('Some time consuming activity goes here') + load_widget() + +And also as a function decorator: + + @track_entry_and_exit('widget loader') + def activity(): + print('Some time consuming activity goes here') + load_widget() + +Note that there is one additional limitation when using context managers +as function decorators: there’s no way to access the return value of +‘__enter__()’. If that value is needed, then it is still necessary to +use an explicit ‘with’ statement. + +See also +........ + +PEP 343(1) - The “with” statement + + The specification, background, and examples for the Python *note + with: 19e. statement. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0343/ + + +File: python.info, Node: Single use reusable and reentrant context managers, Prev: Examples and Recipes<2>, Up: contextlib — Utilities for with-statement contexts + +5.29.7.8 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 *note with: 19e. 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 *note with: 19e. +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 *note with: 19e. statement will close the file, preventing any +further IO operations using that file object. + +Context managers created using *note contextmanager(): eb1. 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: + + >>> 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 + +* Menu: + +* Reentrant context managers:: +* Reusable context managers:: + + +File: python.info, Node: Reentrant context managers, Next: Reusable context managers, Up: Single use reusable and reentrant context managers + +5.29.7.9 Reentrant context managers +................................... + +More sophisticated context managers may be “reentrant”. These context +managers can not only be used in multiple *note with: 19e. statements, +but may also be used `inside' a ‘with’ statement that is already using +the same context manager. + +*note threading.RLock: f14. is an example of a reentrant context +manager, as are *note suppress(): bbd, *note redirect_stdout(): a69, and +*note chdir(): 1e5. Here’s a very simple example of reentrant use: + + >>> 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 + +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. *note redirect_stdout(): a69, for example, is definitely not +thread safe, as it makes a global modification to the system state by +binding *note sys.stdout: 72a. to a different stream. + + +File: python.info, Node: Reusable context managers, Prev: Reentrant context managers, Up: Single use reusable and reentrant context managers + +5.29.7.10 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. + +*note threading.Lock: 2950. is an example of a reusable, but not +reentrant, context manager (for a reentrant lock, it is necessary to use +*note threading.RLock: f14. instead). + +Another example of a reusable, but not reentrant, context manager is +*note ExitStack: 77e, as it invokes `all' currently registered callbacks +when leaving any with statement, regardless of where those callbacks +were added: + + >>> 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 + +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 *note ExitStack: 77e. instances instead of reusing a +single instance avoids that problem: + + >>> 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 + + +File: python.info, Node: abc — Abstract Base Classes, Next: atexit — Exit handlers, Prev: contextlib — Utilities for with-statement contexts, Up: Python Runtime Services + +5.29.8 ‘abc’ — Abstract Base Classes +------------------------------------ + +`Source code:' Lib/abc.py(1) + +__________________________________________________________________ + +This module provides the infrastructure for defining *note abstract base +classes: e6a. (ABCs) in Python, as outlined in PEP 3119(2); see the PEP +for why this was added to Python. (See also PEP 3141(3) and the *note +numbers: bf. module regarding a type hierarchy for numbers based on +ABCs.) + +The *note collections: 1c. module has some concrete classes that derive +from ABCs; these can, of course, be further derived. In addition, the +*note collections.abc: 1d. submodule has some ABCs that can be used to +test whether a class or instance provides a particular interface, for +example, if it is hashable or if it is a mapping. + +This module provides the metaclass *note ABCMeta: baa. for defining ABCs +and a helper class *note ABC: ba9. to alternatively define ABCs through +inheritance: + + -- Class: abc.ABC + + A helper class that has *note ABCMeta: baa. as its metaclass. With + this class, an abstract base class can be created by simply + deriving from *note ABC: ba9. avoiding sometimes confusing + metaclass usage, for example: + + from abc import ABC + + class MyABC(ABC): + pass + + Note that the type of *note ABC: ba9. is still *note ABCMeta: baa, + therefore inheriting from *note ABC: ba9. 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 *note ABCMeta: + baa. directly, for example: + + from abc import ABCMeta + + class MyABC(metaclass=ABCMeta): + pass + + New in version 3.4. + + -- 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 *note + issubclass(): 3ac. 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 *note super(): 8b7.). (4) + + Classes created with a metaclass of *note ABCMeta: baa. have the + following method: + + -- Method: register (subclass) + + Register `subclass' as a “virtual subclass” of this ABC. For + example: + + from abc import ABC + + class MyABC(ABC): + pass + + MyABC.register(tuple) + + assert issubclass(tuple, MyABC) + assert isinstance((), MyABC) + + 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 *note register(): + d3a, you can use the *note get_cache_token(): ba8. function. + + You can also override this method in an abstract base class: + + -- 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 ‘issubclass’ + further without the need to call *note register(): d3a. on + every class you want to consider a subclass of the ABC. (This + class method is called from the ‘__subclasscheck__()’ method + of the ABC.) + + This method should return ‘True’, ‘False’ or ‘NotImplemented’. + If it returns ‘True’, the `subclass' is considered a subclass + of this ABC. If it returns ‘False’, the `subclass' is not + considered a subclass of this ABC, even if it would normally + be one. If it returns ‘NotImplemented’, the subclass check is + continued with the usual mechanism. + + For a demonstration of these concepts, look at this example ABC + definition: + + 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) + + The ABC ‘MyIterable’ defines the standard iterable method, *note + __iter__(): 1bed, as an abstract method. The implementation given + here can still be called from subclasses. The ‘get_iterator()’ + method is also part of the ‘MyIterable’ abstract base class, but it + does not have to be overridden in non-abstract derived classes. + + The *note __subclasshook__(): 3c2b. class method defined here says + that any class that has an *note __iter__(): 1bed. method in its + *note __dict__: 8ce. (or in that of one of its base classes, + accessed via the *note __mro__: 1bca. list) is considered a + ‘MyIterable’ too. + + Finally, the last line makes ‘Foo’ a virtual subclass of + ‘MyIterable’, even though it does not define an *note __iter__(): + 1bed. method (it uses the old-style iterable protocol, defined in + terms of ‘__len__()’ and ‘__getitem__()’). Note that this will not + make ‘get_iterator’ available as a method of ‘Foo’, so it is + provided separately. + +The *note abc: 3. module also provides the following decorator: + + -- Function: @abc.abstractmethod + + A decorator indicating abstract methods. + + Using this decorator requires that the class’s metaclass is *note + ABCMeta: baa. or is derived from it. A class that has a metaclass + derived from *note ABCMeta: baa. 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. *note abstractmethod(): d37. 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 *note + update_abstractmethods(): 3c2c. function. The *note + abstractmethod(): d37. only affects subclasses derived using + regular inheritance; “virtual subclasses” registered with the ABC’s + ‘register()’ method are not affected. + + When *note abstractmethod(): d37. is applied in combination with + other method descriptors, it should be applied as the innermost + decorator, as shown in the following usage examples: + + 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) + + In order to correctly interoperate with the abstract base class + machinery, the descriptor must identify itself as abstract using + ‘__isabstractmethod__’. In general, this attribute should be + ‘True’ if any of the methods used to compose the descriptor are + abstract. For example, Python’s built-in *note property: 205. does + the equivalent of: + + class Descriptor: + ... + @property + def __isabstractmethod__(self): + return any(getattr(f, '__isabstractmethod__', False) for + f in (self._fget, self._fset, self._fdel)) + + Note: Unlike Java abstract methods, these abstract methods may + have an implementation. This implementation can be called via + the *note super(): 8b7. 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. + +The *note abc: 3. module also supports the following legacy decorators: + + -- Function: @abc.abstractclassmethod + + New in version 3.2. + + Deprecated since version 3.3: It is now possible to use *note + classmethod: 18d. with *note abstractmethod(): d37, making this + decorator redundant. + + A subclass of the built-in *note classmethod(): 18d, indicating an + abstract classmethod. Otherwise it is similar to *note + abstractmethod(): d37. + + This special case is deprecated, as the *note classmethod(): 18d. + decorator is now correctly identified as abstract when applied to + an abstract method: + + class C(ABC): + @classmethod + @abstractmethod + def my_abstract_classmethod(cls, arg): + ... + + -- Function: @abc.abstractstaticmethod + + New in version 3.2. + + Deprecated since version 3.3: It is now possible to use *note + staticmethod: 3c8. with *note abstractmethod(): d37, making this + decorator redundant. + + A subclass of the built-in *note staticmethod(): 3c8, indicating an + abstract staticmethod. Otherwise it is similar to *note + abstractmethod(): d37. + + This special case is deprecated, as the *note staticmethod(): 3c8. + decorator is now correctly identified as abstract when applied to + an abstract method: + + class C(ABC): + @staticmethod + @abstractmethod + def my_abstract_staticmethod(arg): + ... + + -- Function: @abc.abstractproperty + + Deprecated since version 3.3: It is now possible to use *note + property: 205, ‘property.getter()’, ‘property.setter()’ and + ‘property.deleter()’ with *note abstractmethod(): d37, making this + decorator redundant. + + A subclass of the built-in *note property(): 205, indicating an + abstract property. + + This special case is deprecated, as the *note property(): 205. + decorator is now correctly identified as abstract when applied to + an abstract method: + + class C(ABC): + @property + @abstractmethod + def my_abstract_property(self): + ... + + 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: + + class C(ABC): + @property + def x(self): + ... + + @x.setter + @abstractmethod + def x(self, val): + ... + + If only some components are abstract, only those components need to + be updated to create a concrete property in a subclass: + + class D(C): + @C.x.setter + def x(self, val): + ... + +The *note abc: 3. module also provides the following functions: + + -- 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 *note + ABCMeta.register(): d3a. on any ABC. + + New in version 3.4. + + -- 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 *note ABCMeta: baa, does nothing. + + Note: This function assumes that `cls'’s superclasses are + already updated. It does not update any subclasses. + + New in version 3.10. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/abc.py + + (2) https://peps.python.org/pep-3119/ + + (3) https://peps.python.org/pep-3141/ + + (4) C++ programmers should note that Python’s virtual base class +concept is not the same as C++’s. + + +File: python.info, Node: atexit — Exit handlers, Next: traceback — Print or retrieve a stack traceback, Prev: abc — Abstract Base Classes, Up: Python Runtime Services + +5.29.9 ‘atexit’ — Exit handlers +------------------------------- + +__________________________________________________________________ + +The *note atexit: b. module defines functions to register and unregister +cleanup functions. Functions thus registered are automatically executed +upon normal interpreter termination. *note atexit: b. runs these +functions in the `reverse' order in which they were registered; if you +register ‘A’, ‘B’, and ‘C’, at interpreter termination time they will be +run in the order ‘C’, ‘B’, ‘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 *note os._exit(): 1cef. is called. + +Changed in version 3.7: When used with C-API subinterpreters, registered +functions are local to the interpreter they were registered in. + + -- 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 *note register(): 4a0. It is possible to register + the same function and arguments more than once. + + At normal program termination (for instance, if *note sys.exit(): + fec. 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 *note SystemExit: 9b6. 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. + + -- Function: atexit.unregister (func) + + Remove `func' from the list of functions to be run at interpreter + shutdown. *note unregister(): 3c2f. silently does nothing if + `func' was not previously registered. If `func' has been + registered more than once, every occurrence of that function in the + *note atexit: b. call stack will be removed. Equality comparisons + (‘==’) are used internally during unregistration, so function + references do not need to have matching identities. + +See also +........ + +Module *note readline: db. + + Useful example of *note atexit: b. to read and write *note + readline: db. history files. + +* Menu: + +* atexit Example:: + + +File: python.info, Node: atexit Example, Up: atexit — Exit handlers + +5.29.9.1 ‘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. + + 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) + +Positional and keyword arguments may also be passed to *note register(): +4a0. to be passed along to the registered function when it is called: + + 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') + +Usage as a *note decorator: 2f8.: + + import atexit + + @atexit.register + def goodbye(): + print('You are now leaving the Python sector.') + +This only works with functions that can be called without arguments. + + +File: python.info, Node: traceback — Print or retrieve a stack traceback, Next: __future__ — Future statement definitions, Prev: atexit — Exit handlers, Up: Python Runtime Services + +5.29.10 ‘traceback’ — Print or retrieve a stack traceback +--------------------------------------------------------- + +`Source code:' Lib/traceback.py(1) + +__________________________________________________________________ + +This module provides a standard interface to extract, format and print +stack traces of Python programs. It exactly mimics the behavior of the +Python interpreter when it prints a stack trace. This is useful when +you want to print stack traces under program control, such as in a +“wrapper” around the interpreter. + +The module uses traceback objects — this is the object type that is +stored in the *note sys.last_traceback: 3ab6. variable and returned as +the third item from *note sys.exc_info(): 25b. + +The module defines the following functions: + + -- Function: traceback.print_tb (tb, limit=None, file=None) + + Print up to `limit' stack trace entries from traceback object `tb' + (starting from the caller’s frame) if `limit' is positive. + Otherwise, print the last ‘abs(limit)’ entries. If `limit' is + omitted or ‘None’, all entries are printed. If `file' is omitted + or ‘None’, the output goes to ‘sys.stderr’; otherwise it should be + an open file or file-like object to receive the output. + + Changed in version 3.5: Added negative `limit' support. + + -- Function: traceback.print_exception (exc, /[, value, tb], + limit=None, file=None, chain=True) + + Print exception information and stack trace entries from traceback + object `tb' to `file'. This differs from *note print_tb(): b13. in + the following ways: + + * if `tb' is not ‘None’, it prints a header ‘Traceback (most + recent call last):’ + + * it prints the exception type and `value' after the stack trace + + * if `type(value)' is *note SyntaxError: 2d6. 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. + + 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 *note + print_tb(): b13. If `chain' is true (the default), then chained + exceptions (the ‘__cause__’ or ‘__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. + + -- Function: traceback.print_exc (limit=None, file=None, chain=True) + + This is a shorthand for ‘print_exception(*sys.exc_info(), limit, + file, chain)’. + + -- Function: traceback.print_last (limit=None, file=None, chain=True) + + This is a shorthand for ‘print_exception(sys.last_type, + sys.last_value, sys.last_traceback, limit, file, chain)’. In + general it will work only after an exception has reached an + interactive prompt (see *note sys.last_type: f6f.). + + -- 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 ‘abs(limit)’ entries. If `limit' is omitted or ‘None’, all + entries are printed. The optional `f' argument can be used to + specify an alternate stack frame to start. The optional `file' + argument has the same meaning as for *note print_tb(): b13. + + Changed in version 3.5: Added negative `limit' support. + + -- Function: traceback.extract_tb (tb, limit=None) + + Return a *note StackSummary: b11. object representing a list of + “pre-processed” stack trace entries extracted from the traceback + object `tb'. It is useful for alternate formatting of stack + traces. The optional `limit' argument has the same meaning as for + *note print_tb(): b13. A “pre-processed” stack trace entry is a + *note FrameSummary: b12. object containing attributes ‘filename’, + ‘lineno’, ‘name’, and ‘line’ representing the information that is + usually printed for a stack trace. The ‘line’ is a string with + leading and trailing whitespace stripped; if the source is not + available it is ‘None’. + + -- Function: traceback.extract_stack (f=None, limit=None) + + Extract the raw traceback from the current stack frame. The return + value has the same format as for *note extract_tb(): 3c35. The + optional `f' and `limit' arguments have the same meaning as for + *note print_stack(): b14. + + -- Function: traceback.format_list (extracted_list) + + Given a list of tuples or *note FrameSummary: b12. objects as + returned by *note extract_tb(): 3c35. or *note extract_stack(): + 3c36, 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 ‘None’. + + -- Function: traceback.format_exception_only (exc, /[, value]) + + Format the exception part of a traceback using an exception value + such as given by ‘sys.last_value’. The return value is a list of + strings, each ending in a newline. Normally, the list contains a + single string; however, for *note SyntaxError: 2d6. exceptions, it + contains several lines that (when printed) display detailed + information about where the syntax error occurred. The message + indicating which exception occurred is the always last string in + the list. + + 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. + + Changed in version 3.10: The `etype' parameter has been renamed to + `exc' and is now positional-only. + + -- 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 *note + print_exception(): 446. 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 *note print_exception(): 446. + + 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 *note print_exception(): 446. + + -- Function: traceback.format_exc (limit=None, chain=True) + + This is like ‘print_exc(limit)’ but returns a string instead of + printing to a file. + + -- Function: traceback.format_tb (tb, limit=None) + + A shorthand for ‘format_list(extract_tb(tb, limit))’. + + -- Function: traceback.format_stack (f=None, limit=None) + + A shorthand for ‘format_list(extract_stack(f, limit))’. + + -- Function: traceback.clear_frames (tb) + + Clears the local variables of all the stack frames in a traceback + `tb' by calling the ‘clear()’ method of each frame object. + + New in version 3.4. + + -- Function: traceback.walk_stack (f) + + Walk a stack following ‘f.f_back’ from the given frame, yielding + the frame and line number for each frame. If `f' is ‘None’, the + current stack is used. This helper is used with *note + StackSummary.extract(): 3c3a. + + New in version 3.5. + + -- Function: traceback.walk_tb (tb) + + Walk a traceback following ‘tb_next’ yielding the frame and line + number for each frame. This helper is used with *note + StackSummary.extract(): 3c3a. + + New in version 3.5. + +The module also defines the following classes: + +* Menu: + +* TracebackException Objects:: +* StackSummary Objects:: +* FrameSummary Objects:: +* Traceback Examples:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/traceback.py + + +File: python.info, Node: TracebackException Objects, Next: StackSummary Objects, Up: traceback — Print or retrieve a stack traceback + +5.29.10.1 ‘TracebackException’ Objects +...................................... + +New in version 3.5. + +*note TracebackException: 26a. objects are created from actual +exceptions to capture data for later printing in a lightweight fashion. + + -- Class: traceback.TracebackException (exc_type, exc_value, + exc_traceback, *, limit=None, lookup_lines=True, + capture_locals=False, compact=False) + + Capture an exception for later rendering. `limit', `lookup_lines' + and `capture_locals' are as for the *note StackSummary: b11. class. + + If `compact' is true, only data that is required by *note + TracebackException: 26a.’s ‘format’ method is saved in the class + attributes. In particular, the ‘__context__’ field is calculated + only if ‘__cause__’ is ‘None’ and ‘__suppress_context__’ is false. + + Note that when locals are captured, they are also shown in the + traceback. + + -- Attribute: __cause__ + + A *note TracebackException: 26a. of the original ‘__cause__’. + + -- Attribute: __context__ + + A *note TracebackException: 26a. of the original + ‘__context__’. + + -- Attribute: __suppress_context__ + + The ‘__suppress_context__’ value from the original exception. + + -- Attribute: __notes__ + + The ‘__notes__’ value from the original exception, or ‘None’ + if the exception does not have any notes. If it is not ‘None’ + is it formatted in the traceback after the exception string. + + New in version 3.11. + + -- Attribute: stack + + A *note StackSummary: b11. representing the traceback. + + -- Attribute: exc_type + + The class of the original traceback. + + -- Attribute: filename + + For syntax errors - the file name where the error occurred. + + -- Attribute: lineno + + For syntax errors - the line number where the error occurred. + + -- Attribute: text + + For syntax errors - the text where the error occurred. + + -- Attribute: offset + + For syntax errors - the offset into the text where the error + occurred. + + -- Attribute: msg + + For syntax errors - the compiler error message. + + -- Method: classmethod from_exception (exc, *, limit=None, + lookup_lines=True, capture_locals=False) + + Capture an exception for later rendering. `limit', + `lookup_lines' and `capture_locals' are as for the *note + StackSummary: b11. class. + + Note that when locals are captured, they are also shown in the + traceback. + + -- Method: print (*, file=None, chain=True) + + Print to `file' (default ‘sys.stderr’) the exception + information returned by *note format(): 1f7. + + New in version 3.11. + + -- Method: format (*, chain=True) + + Format the exception. + + If `chain' is not ‘True’, ‘__cause__’ and ‘__context__’ will + not be formatted. + + The return value is a generator of strings, each ending in a + newline and some containing internal newlines. *note + print_exception(): 446. is a wrapper around this method which + just prints the lines to a file. + + The message indicating which exception occurred is always the + last string in the output. + + -- Method: format_exception_only () + + Format the exception part of the traceback. + + The return value is a generator of strings, each ending in a + newline. + + Normally, the generator emits a single string; however, for + *note SyntaxError: 2d6. exceptions, it emits several lines + that (when printed) display detailed information about where + the syntax error occurred. + + The message indicating which exception occurred is always the + last string in the output. + + Changed in version 3.10: Added the `compact' parameter. + + +File: python.info, Node: StackSummary Objects, Next: FrameSummary Objects, Prev: TracebackException Objects, Up: traceback — Print or retrieve a stack traceback + +5.29.10.2 ‘StackSummary’ Objects +................................ + +New in version 3.5. + +*note StackSummary: b11. objects represent a call stack ready for +formatting. + + -- Class: traceback.StackSummary + + -- Method: classmethod extract (frame_gen, *, limit=None, + lookup_lines=True, capture_locals=False) + + Construct a *note StackSummary: b11. object from a frame + generator (such as is returned by *note walk_stack(): b0f. or + *note walk_tb(): b10.). + + If `limit' is supplied, only this many frames are taken from + `frame_gen'. If `lookup_lines' is ‘False’, the returned *note + FrameSummary: b12. objects will not have read their lines in + yet, making the cost of creating the *note StackSummary: b11. + cheaper (which may be valuable if it may not actually get + formatted). If `capture_locals' is ‘True’ the local variables + in each *note FrameSummary: b12. are captured as object + representations. + + -- Method: classmethod from_list (a_list) + + Construct a *note StackSummary: b11. object from a supplied + list of *note FrameSummary: b12. objects or old-style list of + tuples. Each tuple should be a 4-tuple with filename, lineno, + name, line as the elements. + + -- Method: format () + + Returns a list of strings ready for printing. Each string in + the resulting list corresponds to a single 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. + + -- Method: format_frame_summary (frame_summary) + + Returns a string for printing one of the frames involved in + the stack. This method is called for each *note FrameSummary: + b12. object to be printed by *note StackSummary.format(): + 3c4c. If it returns ‘None’, the frame is omitted from the + output. + + New in version 3.11. + + +File: python.info, Node: FrameSummary Objects, Next: Traceback Examples, Prev: StackSummary Objects, Up: traceback — Print or retrieve a stack traceback + +5.29.10.3 ‘FrameSummary’ Objects +................................ + +New in version 3.5. + +A *note FrameSummary: b12. object represents a single frame in a +traceback. + + -- Class: traceback.FrameSummary (filename, lineno, name, + lookup_line=True, locals=None, line=None) + + Represent a single frame in the traceback or stack that is being + formatted or printed. It may optionally have a stringified version + of the frames locals included in it. If `lookup_line' is ‘False’, + the source code is not looked up until the *note FrameSummary: b12. + has the ‘line’ attribute accessed (which also happens when casting + it to a tuple). ‘line’ may be directly provided, and will prevent + line lookups happening at all. `locals' is an optional local + variable dictionary, and if supplied the variable representations + are stored in the summary for later display. + + +File: python.info, Node: Traceback Examples, Prev: FrameSummary Objects, Up: traceback — Print or retrieve a stack traceback + +5.29.10.4 Traceback Examples +............................ + +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 +*note code: 19. module. + + 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) + +The following example demonstrates the different ways to print and +format the exception and traceback: + + import sys, traceback + + def lumberjack(): + bright_side_of_life() + + def bright_side_of_life(): + return tuple()[0] + + try: + lumberjack() + except IndexError: + exc_type, exc_value, exc_traceback = sys.exc_info() + print("*** print_tb:") + traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) + print("*** print_exception:") + traceback.print_exception(exc_value, 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_value))) + 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) + +The output for the example would look similar to this: + + *** 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', + ' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\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', + ' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n', + ' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n'] + *** tb_lineno: 10 + +The following example shows the different ways to print and format the +stack: + + >>> 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'] + +This last example demonstrates the final few formatting functions: + + >>> 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(type(an_error), an_error) + ['IndexError: tuple index out of range\n'] + + +File: python.info, Node: __future__ — Future statement definitions, Next: gc — Garbage Collector interface, Prev: traceback — Print or retrieve a stack traceback, Up: Python Runtime Services + +5.29.11 ‘__future__’ — Future statement definitions +--------------------------------------------------- + +`Source code:' Lib/__future__.py(1) + +__________________________________________________________________ + +*note __future__: 0. is a real module, and serves three purposes: + + * To avoid confusing existing tools that analyze import statements + and expect to find the modules they’re importing. + + * To ensure that *note future statements: 196. run under releases + prior to 2.1 at least yield runtime exceptions (the import of *note + __future__: 0. will fail, because there was no module of that name + prior to 2.1). + + * 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 *note __future__: 0. and examining its contents. + +Each statement in ‘__future__.py’ is of the form: + + FeatureName = _Feature(OptionalRelease, MandatoryRelease, + CompilerFlag) + +where, normally, `OptionalRelease' is less than `MandatoryRelease', and +both are 5-tuples of the same form as *note sys.version_info: 27d.: + + (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 + ) + +`OptionalRelease' records the first release in which the feature was +accepted. + +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 ‘None’, meaning that a planned feature +got dropped. + +Instances of class ‘_Feature’ have two corresponding methods, +‘getOptionalRelease()’ and ‘getMandatoryRelease()’. + +`CompilerFlag' is the (bitfield) flag that should be passed in the +fourth argument to the built-in function *note compile(): 310. to enable +the feature in dynamically compiled code. This flag is stored in the +‘compiler_flag’ attribute on ‘_Feature’ instances. + +No feature description will ever be deleted from *note __future__: 0. +Since its introduction in Python 2.1 the following features have found +their way into the language using this mechanism: + +feature optional in mandatory in effect + +-------------------------------------------------------------------------------------------------------------- + +nested_scopes 2.1.0b1 2.2 PEP 227(2): `Statically Nested Scopes' + + +generators 2.2.0a1 2.3 PEP 255(3): `Simple Generators' + + +division 2.2.0a2 3.0 PEP 238(4): `Changing the Division Operator' + + +absolute_import 2.5.0a1 3.0 PEP 328(5): `Imports: Multi-Line and + Absolute/Relative' + + +with_statement 2.5.0a1 2.6 PEP 343(6): `The “with” Statement' + + +print_function 2.6.0a2 3.0 PEP 3105(7): `Make print a function' + + +unicode_literals 2.6.0a2 3.0 PEP 3112(8): `Bytes literals in Python 3000' + + +generator_stop 3.5.0b1 3.7 PEP 479(9): `StopIteration handling inside + generators' + + +annotations 3.7.0b1 TBD (10) PEP 563(11): `Postponed evaluation of + annotations' + + +See also +........ + +*note Future statements: 196. + + How the compiler treats future imports. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/__future__.py + + (2) https://peps.python.org/pep-0227/ + + (3) https://peps.python.org/pep-0255/ + + (4) https://peps.python.org/pep-0238/ + + (5) https://peps.python.org/pep-0328/ + + (6) https://peps.python.org/pep-0343/ + + (7) https://peps.python.org/pep-3105/ + + (8) https://peps.python.org/pep-3112/ + + (9) https://peps.python.org/pep-0479/ + + (10) ‘from __future__ import annotations’ was previously scheduled to +become mandatory in Python 3.10, but the Python Steering Council twice +decided to delay the change (announcement for Python 3.10 +(https://mail.python.org/archives/list/python-dev@python.org/message/CLVXXPQ2T2LQ5MP2Y53VVQFCXYWQJHKZ/); +announcement for Python 3.11 +(https://mail.python.org/archives/list/python-dev@python.org/message/VIZEBX5EYMSYIJNDBF6DMUMZOCWHARSO/)). +No final decision has been made yet. See also PEP 563 +(https://peps.python.org/pep-0563/) and PEP 649 +(https://peps.python.org/pep-0649/). + + (11) https://peps.python.org/pep-0563/ + + +File: python.info, Node: gc — Garbage Collector interface, Next: inspect — Inspect live objects, Prev: __future__ — Future statement definitions, Up: Python Runtime Services + +5.29.12 ‘gc’ — Garbage Collector interface +------------------------------------------ + +__________________________________________________________________ + +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 +‘gc.disable()’. To debug a leaking program call +‘gc.set_debug(gc.DEBUG_LEAK)’. Notice that this includes +‘gc.DEBUG_SAVEALL’, causing garbage-collected objects to be saved in +gc.garbage for inspection. + +The *note gc: 80. module provides the following functions: + + -- Function: gc.enable () + + Enable automatic garbage collection. + + -- Function: gc.disable () + + Disable automatic garbage collection. + + -- Function: gc.isenabled () + + Return ‘True’ if automatic collection is enabled. + + -- 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 *note ValueError: 1c8. is raised if the + generation number is invalid. The number of unreachable objects + found 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 *note + float: 3ca. + + -- Function: gc.set_debug (flags) + + Set the garbage collection debugging flags. Debugging information + will be written to ‘sys.stderr’. See below for a list of debugging + flags which can be combined using bit operations to control + debugging. + + -- Function: gc.get_debug () + + Return the debugging flags currently set. + + -- Function: gc.get_objects (generation=None) + + Returns a list of all objects tracked by the collector, excluding + the list returned. If `generation' is not None, return only the + objects tracked by the collector that are in that generation. + + Changed in version 3.8: New `generation' parameter. + + Raises an *note auditing event: 12c0. ‘gc.get_objects’ with + argument ‘generation’. + + -- 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: + + * ‘collections’ is the number of times this generation was + collected; + + * ‘collected’ is the total number of objects collected inside + this generation; + + * ‘uncollectable’ is the total number of objects which were + found to be uncollectable (and were therefore moved to the + *note garbage: e74. list) inside this generation. + + New in version 3.4. + + -- 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 ‘0’). If an object survives + a collection it is moved into the next older generation. Since + generation ‘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 ‘0’ is examined. If + generation ‘0’ has been examined more than `threshold1' times since + generation ‘1’ has been examined, then generation ‘1’ is examined + as well. With the third generation, things are a bit more + complicated, see Collecting the oldest generation(1) for more + information. + + -- Function: gc.get_count () + + Return the current collection counts as a tuple of ‘(count0, + count1, count2)’. + + -- Function: gc.get_threshold () + + Return the current collection thresholds as a tuple of + ‘(threshold0, threshold1, threshold2)’. + + -- 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 *note collect(): 687. before calling + *note get_referrers(): 3f5. + + Warning: Care must be taken when using objects returned by + *note get_referrers(): 3f5. because some of them could still + be under construction and hence in a temporarily invalid + state. Avoid using *note get_referrers(): 3f5. for any + purpose other than debugging. + + Raises an *note auditing event: 12c0. ‘gc.get_referrers’ with + argument ‘objs’. + + -- 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 *note tp_traverse: 352. methods (if any), and + may not be all objects actually directly reachable. *note + tp_traverse: 352. 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 *note auditing event: 12c0. ‘gc.get_referents’ with + argument ‘objs’. + + -- Function: gc.is_tracked (obj) + + Returns ‘True’ if the object is currently tracked by the garbage + collector, ‘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): + + >>> gc.is_tracked(0) + False + >>> gc.is_tracked("a") + False + >>> gc.is_tracked([]) + True + >>> gc.is_tracked({}) + False + >>> gc.is_tracked({"a": 1}) + False + >>> gc.is_tracked({"a": []}) + True + + New in version 3.1. + + -- Function: gc.is_finalized (obj) + + Returns ‘True’ if the given object has been finalized by the + garbage collector, ‘False’ otherwise. + + >>> 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 + + New in version 3.9. + + -- Function: gc.freeze () + + Freeze all the objects tracked by gc - move them to a permanent + generation and ignore all the future collections. This can be used + before a POSIX fork() call to make the gc copy-on-write friendly or + to speed up collection. Also collection before a POSIX fork() call + may free pages for future allocation which can cause copy-on-write + too so it’s advised to disable gc in parent process and freeze + before fork and enable gc in child process. + + New in version 3.7. + + -- Function: gc.unfreeze () + + Unfreeze the objects in the permanent generation, put them back + into the oldest generation. + + New in version 3.7. + + -- Function: gc.get_freeze_count () + + Return the number of objects in the permanent generation. + + New in version 3.7. + +The following variables are provided for read-only access (you can +mutate the values but should not rebind them): + + -- 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-‘NULL’ ‘tp_del’ slot. + + If *note DEBUG_SAVEALL: 3c5c. 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 *note + interpreter shutdown: aff, a *note ResourceWarning: 8a9. is + emitted, which is silent by default. If *note DEBUG_UNCOLLECTABLE: + e75. is set, in addition all uncollectable objects are printed. + + Changed in version 3.4: Following PEP 442(2), objects with a + ‘__del__()’ method don’t end up in *note gc.garbage: e74. anymore. + + -- 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: + + “start”: The garbage collection is about to start. + + “stop”: The garbage collection has finished. + + `info' is a dict providing more information for the callback. The + following keys are currently defined: + + “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 *note garbage: + e74. + + Applications can add their own callbacks to this list. The primary + use cases are: + + 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 *note garbage: e74. + + New in version 3.3. + +The following constants are provided for use with *note set_debug(): +3c57.: + + -- Data: gc.DEBUG_STATS + + Print statistics during collection. This information can be useful + when tuning the collection frequency. + + -- Data: gc.DEBUG_COLLECTABLE + + Print information on collectable objects found. + + -- 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 ‘garbage’ list. + + Changed in version 3.2: Also print the contents of the *note + garbage: e74. list at *note interpreter shutdown: aff, if it isn’t + empty. + + -- 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. + + -- Data: gc.DEBUG_LEAK + + The debugging flags necessary for the collector to print + information about a leaking program (equal to ‘DEBUG_COLLECTABLE | + DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL’). + + ---------- Footnotes ---------- + + (1) +https://devguide.python.org/garbage_collector/#collecting-the-oldest-generation + + (2) https://peps.python.org/pep-0442/ + + +File: python.info, Node: inspect — Inspect live objects, Next: site — Site-specific configuration hook, Prev: gc — Garbage Collector interface, Up: Python Runtime Services + +5.29.13 ‘inspect’ — Inspect live objects +---------------------------------------- + +`Source code:' Lib/inspect.py(1) + +__________________________________________________________________ + +The *note inspect: 9e. 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 and Coroutines:: +* Code Objects Bit Flags:: +* Command Line Interface: Command Line Interface<3>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/inspect.py + + +File: python.info, Node: Types and members, Next: Retrieving source code, Up: inspect — Inspect live objects + +5.29.13.1 Types and members +........................... + +The *note getmembers(): 124b. 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 *note getmembers(): 124b. They also help you determine when you can +expect to find the following special attributes: + +Type Attribute Description + +------------------------------------------------------------------------ + +module __doc__ documentation string + + + __file__ filename (missing for + built-in modules) + + +class __doc__ documentation string + + + __name__ name with which this class + was defined + + + __qualname__ qualified name + + + __module__ name of module in which this + class was defined + + +method __doc__ documentation string + + + __name__ name with which this method + was defined + + + __qualname__ qualified name + + + __func__ function object containing + implementation of method + + + __self__ instance to which this method + is bound, or ‘None’ + + + __module__ name of module in which this + method was defined + + +function __doc__ documentation string + + + __name__ name with which this function + was defined + + + __qualname__ qualified name + + + __code__ code object containing + compiled function + *note bytecode: 16f. + + + __defaults__ tuple of any default values + for positional or keyword + parameters + + + __kwdefaults__ mapping of any default values + for keyword-only parameters + + + __globals__ global namespace in which + this function was defined + + + __builtins__ builtins namespace + + + __annotations__ mapping of parameters names + to annotations; ‘"return"’ + key is reserved for return + annotations. + + + __module__ name of module in which this + function was defined + + +traceback tb_frame frame object at this level + + + tb_lasti index of last attempted + instruction in bytecode + + + tb_lineno current line number in Python + source code + + + tb_next next inner traceback object + (called by this level) + + +frame f_back next outer frame object (this + frame’s caller) + + + f_builtins builtins namespace seen by + this frame + + + f_code code object being executed in + this frame + + + f_globals global namespace seen by this + frame + + + f_lasti index of last attempted + instruction in bytecode + + + f_lineno current line number in Python + source code + + + f_locals local namespace seen by this + frame + + + f_trace tracing function for this + frame, or ‘None’ + + +code co_argcount number of arguments (not + including keyword only + arguments, * or ** args) + + + co_code string of raw compiled + bytecode + + + co_cellvars tuple of names of cell + variables (referenced by + containing scopes) + + + co_consts tuple of constants used in + the bytecode + + + co_filename name of file in which this + code object was created + + + co_firstlineno number of first line in + Python source code + + + co_flags bitmap of ‘CO_*’ flags, read + more *note here: 3c64. + + + co_lnotab encoded mapping of line + numbers to bytecode indices + + + co_freevars tuple of names of free + variables (referenced via a + function’s closure) + + + co_posonlyargcount number of positional only + arguments + + + co_kwonlyargcount number of keyword only + arguments (not including ** + arg) + + + co_name name with which this code + object was defined + + + co_qualname fully qualified name with + which this code object was + defined + + + co_names tuple of names other than + arguments and function locals + + + co_nlocals number of local variables + + + co_stacksize virtual machine stack space + required + + + co_varnames tuple of names of arguments + and local variables + + +generator __name__ name + + + __qualname__ qualified name + + + gi_frame frame + + + gi_running is the generator running? + + + gi_code code + + + gi_yieldfrom object being iterated by + ‘yield from’, or ‘None’ + + +coroutine __name__ name + + + __qualname__ qualified name + + + cr_await object being awaited on, or + ‘None’ + + + cr_frame frame + + + cr_running is the coroutine running? + + + cr_code code + + + cr_origin where coroutine was created, + or ‘None’. See + *note sys.set_coroutine_origin_tracking_depth(): 7ee. + + +builtin __doc__ documentation string + + + __name__ original name of this + function or method + + + __qualname__ qualified name + + + __self__ instance to which a method is + bound, or ‘None’ + + +Changed in version 3.5: Add ‘__qualname__’ and ‘gi_yieldfrom’ attributes +to generators. + +The ‘__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 ‘cr_origin’ attribute to coroutines. + +Changed in version 3.10: Add ‘__builtins__’ attribute to functions. + + -- Function: inspect.getmembers (object[, predicate]) + + Return all the members of an object in a list of ‘(name, value)’ + pairs sorted by name. If the optional `predicate' argument—which + will be called with the ‘value’ object of each member—is supplied, + only members for which the predicate returns a true value are + included. + + Note: *note getmembers(): 124b. 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 ‘__dir__()’. + + -- Function: inspect.getmembers_static (object[, predicate]) + + Return all the members of an object in a list of ‘(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. + + Note: *note getmembers_static(): 21c. 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. + + New in version 3.11. + + -- 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 *note + importlib.machinery.all_suffixes(): 3c65. If it matches, the final + path component is returned with the extension removed. Otherwise, + ‘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 ‘None’. + + Changed in version 3.3: The function is based directly on *note + importlib: 97. + + -- Function: inspect.ismodule (object) + + Return ‘True’ if the object is a module. + + -- Function: inspect.isclass (object) + + Return ‘True’ if the object is a class, whether built-in or created + in Python code. + + -- Function: inspect.ismethod (object) + + Return ‘True’ if the object is a bound method written in Python. + + -- Function: inspect.isfunction (object) + + Return ‘True’ if the object is a Python function, which includes + functions created by a *note lambda: 2159. expression. + + -- Function: inspect.isgeneratorfunction (object) + + Return ‘True’ if the object is a Python generator function. + + Changed in version 3.8: Functions wrapped in *note + functools.partial(): b5b. now return ‘True’ if the wrapped function + is a Python generator function. + + -- Function: inspect.isgenerator (object) + + Return ‘True’ if the object is a generator. + + -- Function: inspect.iscoroutinefunction (object) + + Return ‘True’ if the object is a *note coroutine function: 9f2. (a + function defined with an *note async def: 19b. syntax). + + New in version 3.5. + + Changed in version 3.8: Functions wrapped in *note + functools.partial(): b5b. now return ‘True’ if the wrapped function + is a *note coroutine function: 9f2. + + -- Function: inspect.iscoroutine (object) + + Return ‘True’ if the object is a *note coroutine: 525. created by + an *note async def: 19b. function. + + New in version 3.5. + + -- Function: inspect.isawaitable (object) + + Return ‘True’ if the object can be used in *note await: 2fa. + expression. + + Can also be used to distinguish generator-based coroutines from + regular generators: + + def gen(): + yield + @types.coroutine + def gen_coro(): + yield + + assert not isawaitable(gen()) + assert isawaitable(gen_coro()) + + New in version 3.5. + + -- Function: inspect.isasyncgenfunction (object) + + Return ‘True’ if the object is an *note asynchronous generator: + 1a0f. function, for example: + + >>> async def agen(): + ... yield 1 + ... + >>> inspect.isasyncgenfunction(agen) + True + + New in version 3.6. + + Changed in version 3.8: Functions wrapped in *note + functools.partial(): b5b. now return ‘True’ if the wrapped function + is a *note asynchronous generator: 1a0f. function. + + -- Function: inspect.isasyncgen (object) + + Return ‘True’ if the object is an *note asynchronous generator + iterator: 3bcb. created by an *note asynchronous generator: 1a0f. + function. + + New in version 3.6. + + -- Function: inspect.istraceback (object) + + Return ‘True’ if the object is a traceback. + + -- Function: inspect.isframe (object) + + Return ‘True’ if the object is a frame. + + -- Function: inspect.iscode (object) + + Return ‘True’ if the object is a code. + + -- Function: inspect.isbuiltin (object) + + Return ‘True’ if the object is a built-in function or a bound + built-in method. + + -- Function: inspect.ismethodwrapper (object) + + Return ‘True’ if the type of object is a *note MethodWrapperType: + 21e. + + These are instances of *note MethodWrapperType: 21e, such as *note + __str__(): 1f5, *note __eq__(): 74f. and *note __repr__(): 1f4. + + New in version 3.11. + + -- Function: inspect.isroutine (object) + + Return ‘True’ if the object is a user-defined or built-in function + or method. + + -- Function: inspect.isabstract (object) + + Return ‘True’ if the object is an abstract base class. + + -- Function: inspect.ismethoddescriptor (object) + + Return ‘True’ if the object is a method descriptor, but not if + *note ismethod(): 3c68, *note isclass(): 3c67, *note isfunction(): + 3c69. or *note isbuiltin(): 3c6f. are true. + + This, for example, is true of ‘int.__add__’. An object passing + this test has a *note __get__(): 1918. method but not a *note + __set__(): 191d. method, but beyond that the set of attributes + varies. A *note __name__: f79. attribute is usually sensible, and + ‘__doc__’ often is. + + Methods implemented via descriptors that also pass one of the other + tests return ‘False’ from the *note ismethoddescriptor(): 3c71. + test, simply because the other tests promise more – you can, e.g., + count on having the ‘__func__’ attribute (etc) when an object + passes *note ismethod(): 3c68. + + -- Function: inspect.isdatadescriptor (object) + + Return ‘True’ if the object is a data descriptor. + + Data descriptors have a *note __set__: 191d. or a *note __delete__: + 191e. 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 *note __name__: f79. and ‘__doc__’ attributes + (properties, getsets, and members have both of these attributes), + but this is not guaranteed. + + -- Function: inspect.isgetsetdescriptor (object) + + Return ‘True’ if the object is a getset descriptor. + + `CPython implementation detail:' getsets are attributes defined in + extension modules via *note PyGetSetDef: 81b. structures. For + Python implementations without such types, this method will always + return ‘False’. + + -- Function: inspect.ismemberdescriptor (object) + + Return ‘True’ if the object is a member descriptor. + + `CPython implementation detail:' Member descriptors are attributes + defined in extension modules via *note PyMemberDef: 81a. + structures. For Python implementations without such types, this + method will always return ‘False’. + + +File: python.info, Node: Retrieving source code, Next: Introspecting callables with the Signature object, Prev: Types and members, Up: inspect — Inspect live objects + +5.29.13.2 Retrieving source code +................................ + + -- Function: inspect.getdoc (object) + + Get the documentation string for an object, cleaned up with *note + cleandoc(): 3c77. 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 ‘None’ if the documentation string is invalid or + missing. + + Changed in version 3.5: Documentation strings are now inherited if + not overridden. + + -- 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 + ‘None’. This could happen if the object has been defined in C or + the interactive shell. + + -- Function: inspect.getfile (object) + + Return the name of the (text or binary) file in which an object was + defined. This will fail with a *note TypeError: 19c. if the object + is a built-in module, class, or function. + + -- Function: inspect.getmodule (object) + + Try to guess which module an object was defined in. Return ‘None’ + if the module cannot be determined. + + -- Function: inspect.getsourcefile (object) + + Return the name of the Python source file in which an object was + defined or ‘None’ if no way can be identified to get the source. + This will fail with a *note TypeError: 19c. if the object is a + built-in module, class, or function. + + -- 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 *note OSError: 413. is raised if the source code + cannot be retrieved. + + Changed in version 3.3: *note OSError: 413. is raised instead of + *note IOError: d02, now an alias of the former. + + -- 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 *note + OSError: 413. is raised if the source code cannot be retrieved. + + Changed in version 3.3: *note OSError: 413. is raised instead of + *note IOError: d02, now an alias of the former. + + -- 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. + + +File: python.info, Node: Introspecting callables with the Signature object, Next: Classes and functions<2>, Prev: Retrieving source code, Up: inspect — Inspect live objects + +5.29.13.3 Introspecting callables with the Signature object +........................................................... + +New in version 3.3. + +The Signature object represents the call signature of a callable object +and its return annotation. To retrieve a Signature object, use the +*note signature(): 301. function. + + -- Function: inspect.signature (callable, *, follow_wrapped=True, + globals=None, locals=None, eval_str=False) + + Return a *note Signature: 303. object for the given ‘callable’: + + >>> 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'> + + Accepts a wide range of Python callables, from plain functions and + classes to *note functools.partial(): b5b. objects. + + For objects defined in modules using stringized annotations (‘from + __future__ import annotations’), *note signature(): 301. will + attempt to automatically un-stringize the annotations using *note + inspect.get_annotations(): 405. The ‘global’, ‘locals’, and + ‘eval_str’ parameters are passed into *note + inspect.get_annotations(): 405. when resolving the annotations; see + the documentation for *note inspect.get_annotations(): 405. for + instructions on how to use these parameters. + + Raises *note ValueError: 1c8. if no signature can be provided, and + *note TypeError: 19c. if that type of object is not supported. + Also, if the annotations are stringized, and ‘eval_str’ is not + false, the ‘eval()’ call(s) to un-stringize the 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 + *note the FAQ entry on positional-only parameters: 1bb9. + + New in version 3.5: ‘follow_wrapped’ parameter. Pass ‘False’ to + get a signature of ‘callable’ specifically (‘callable.__wrapped__’ + will not be used to unwrap decorated callables.) + + New in version 3.10: ‘globals’, ‘locals’, and ‘eval_str’ + parameters. + + 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. + + -- Class: inspect.Signature (parameters=None, *, + return_annotation=Signature.empty) + + A Signature object represents the call signature of a function and + its return annotation. For each parameter accepted by the function + it stores a *note Parameter: a97. object in its *note parameters: + 13b2. collection. + + The optional `parameters' argument is a sequence of *note + Parameter: a97. 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, is the “return” annotation of the callable. + + Signature objects are `immutable'. Use *note Signature.replace(): + 3c7b. to make a modified copy. + + Changed in version 3.5: Signature objects are picklable and + hashable. + + -- Attribute: empty + + A special class-level marker to specify absence of a return + annotation. + + -- Attribute: parameters + + An ordered mapping of parameters’ names to the corresponding + *note Parameter: a97. 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. + + -- Attribute: return_annotation + + The “return” annotation for the callable. If the callable has + no “return” annotation, this attribute is set to *note + Signature.empty: 3c7c. + + -- Method: bind (*args, **kwargs) + + Create a mapping from positional and keyword arguments to + parameters. Returns *note BoundArguments: d17. if ‘*args’ and + ‘**kwargs’ match the signature, or raises a *note TypeError: + 19c. + + -- Method: bind_partial (*args, **kwargs) + + Works the same way as *note Signature.bind(): 3c7e, but allows + the omission of some required arguments (mimics *note + functools.partial(): b5b. behavior.) Returns *note + BoundArguments: d17, or raises a *note TypeError: 19c. if the + passed arguments do not match the signature. + + -- Method: replace (*[, parameters][, return_annotation]) + + Create a new Signature instance based on the instance 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 return_annotation + from the copied Signature, pass in *note Signature.empty: + 3c7c. + + >>> 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'" + + -- Method: classmethod from_callable (obj, *, follow_wrapped=True, + globalns=None, localns=None) + + Return a *note Signature: 303. (or its subclass) object for a + given callable ‘obj’. Pass ‘follow_wrapped=False’ to get a + signature of ‘obj’ without unwrapping its ‘__wrapped__’ chain. + ‘globalns’ and ‘localns’ will be used as the namespaces when + resolving annotations. + + This method simplifies subclassing of *note Signature: 303.: + + class MySignature(Signature): + pass + sig = MySignature.from_callable(min) + assert isinstance(sig, MySignature) + + New in version 3.5. + + New in version 3.10: ‘globalns’ and ‘localns’ parameters. + + -- Class: inspect.Parameter (name, kind, *, default=Parameter.empty, + annotation=Parameter.empty) + + Parameter objects are `immutable'. Instead of modifying a + Parameter object, you can use *note Parameter.replace(): 3c80. to + create a modified copy. + + Changed in version 3.5: Parameter objects are picklable and + hashable. + + -- Attribute: empty + + A special class-level marker to specify absence of default + values and annotations. + + -- 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 ‘.0’ on the code objects used to + implement comprehensions and generator expressions. + + Changed in version 3.6: These parameter names are exposed by + this module as names like ‘implicit0’. + + -- Attribute: default + + The default value for the parameter. If the parameter has no + default value, this attribute is set to *note Parameter.empty: + 3c81. + + -- Attribute: annotation + + The annotation for the parameter. If the parameter has no + annotation, this attribute is set to *note Parameter.empty: + 3c81. + + -- Attribute: kind + + Describes how argument values are bound to the parameter. + Possible values (accessible via *note Parameter: a97, like + ‘Parameter.KEYWORD_ONLY’): + + Name Meaning + + -------------------------------------------------------------------------------- + + `POSITIONAL_ONLY' Value must be supplied as a positional argument. + Positional only parameters are those which + appear before a ‘/’ entry (if present) in a + Python function definition. + + + `POSITIONAL_OR_KEYWORD' Value may be supplied as either a keyword or + positional argument (this is the standard + binding behaviour for functions implemented in + Python.) + + + `VAR_POSITIONAL' A tuple of positional arguments that aren’t + bound to any other parameter. This corresponds + to a ‘*args’ parameter in a Python function + definition. + + + `KEYWORD_ONLY' Value must be supplied as a keyword argument. + Keyword only parameters are those which appear + after a ‘*’ or ‘*args’ entry in a Python + function definition. + + + `VAR_KEYWORD' A dict of keyword arguments that aren’t bound to + any other parameter. This corresponds to a + ‘**kwargs’ parameter in a Python function + definition. + + + Example: print all keyword-only arguments without default + values: + + >>> 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 + + -- Attribute: kind.description + + Describes a enum value of Parameter.kind. + + New in version 3.8. + + Example: print all descriptions of arguments: + + >>> 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 + + -- Method: replace (*[, name][, kind][, default][, annotation]) + + Create a new Parameter instance based on the instance replaced + was invoked on. To override a *note Parameter: a97. + attribute, pass the corresponding argument. To remove a + default value or/and an annotation from a Parameter, pass + *note Parameter.empty: 3c81. + + >>> 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'" + + Changed in version 3.4: In Python 3.3 Parameter objects were + allowed to have ‘name’ set to ‘None’ if their ‘kind’ was set to + ‘POSITIONAL_ONLY’. This is no longer permitted. + + -- Class: inspect.BoundArguments + + Result of a *note Signature.bind(): 3c7e. or *note + Signature.bind_partial(): 3c7f. call. Holds the mapping of + arguments to the function’s parameters. + + -- Attribute: arguments + + A mutable mapping of parameters’ names to arguments’ values. + Contains only explicitly bound arguments. Changes in *note + arguments: 550. will reflect in *note args: 3c87. and *note + kwargs: 3c88. + + Should be used in conjunction with *note Signature.parameters: + 13b2. for any argument processing purposes. + + Note: Arguments for which *note Signature.bind(): 3c7e. + or *note Signature.bind_partial(): 3c7f. relied on a + default value are skipped. However, if needed, use *note + BoundArguments.apply_defaults(): a98. to add them. + + Changed in version 3.9: *note arguments: 550. is now of type + *note dict: 16e. Formerly, it was of type *note + collections.OrderedDict: 1a8. + + -- Attribute: args + + A tuple of positional arguments values. Dynamically computed + from the *note arguments: 550. attribute. + + -- Attribute: kwargs + + A dict of keyword arguments values. Dynamically computed from + the *note arguments: 550. attribute. + + -- Attribute: signature + + A reference to the parent *note Signature: 303. object. + + -- Method: apply_defaults () + + Set default values for missing arguments. + + For variable-positional arguments (‘*args’) the default is an + empty tuple. + + For variable-keyword arguments (‘**kwargs’) the default is an + empty dict. + + >>> def foo(a, b='ham', *args): pass + >>> ba = inspect.signature(foo).bind('spam') + >>> ba.apply_defaults() + >>> ba.arguments + {'a': 'spam', 'b': 'ham', 'args': ()} + + New in version 3.5. + + The *note args: 3c87. and *note kwargs: 3c88. properties can be + used to invoke functions: + + def test(a, *, b): + ... + + sig = signature(test) + ba = sig.bind(10, b=20) + test(*ba.args, **ba.kwargs) + +See also +........ + +PEP 362(1) - Function Signature Object. + + The detailed specification, implementation details and examples. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0362/ + + +File: python.info, Node: Classes and functions<2>, Next: The interpreter stack, Prev: Introspecting callables with the Signature object, Up: inspect — Inspect live objects + +5.29.13.4 Classes and functions +............................... + + -- 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. + + -- Function: inspect.getfullargspec (func) + + Get the names and default values of a Python function’s parameters. + A *note named tuple: 221. is returned: + + ‘FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, + kwonlydefaults, annotations)’ + + `args' is a list of the positional parameter names. `varargs' is + the name of the ‘*’ parameter or ‘None’ if arbitrary positional + arguments are not accepted. `varkw' is the name of the ‘**’ + parameter or ‘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 ‘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 ‘"return"’ is used to report the + function return value annotation (if any). + + Note that *note signature(): 301. and *note Signature Object: 3c79. + 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 ‘inspect’ module API. + + Changed in version 3.4: This function is now based on *note + signature(): 301, but still ignores ‘__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 *note signature(): 301. 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 ‘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. + + -- Function: inspect.getargvalues (frame) + + Get information about arguments passed into a particular frame. A + *note named tuple: 221. ‘ArgInfo(args, varargs, keywords, locals)’ + is returned. `args' is a list of the argument names. `varargs' + and `keywords' are the names of the ‘*’ and ‘**’ arguments or + ‘None’. `locals' is the locals dictionary of the given frame. + + Note: This function was inadvertently marked as deprecated in + Python 3.5. + + -- Function: inspect.formatargvalues (args[, varargs, varkw, locals, + formatarg, formatvarargs, formatvarkw, formatvalue]) + + Format a pretty argument spec from the four values returned by + *note getargvalues(): b4c. The format* arguments are the + corresponding optional formatting functions that are called to turn + names and values into strings. + + Note: This function was inadvertently marked as deprecated in + Python 3.5. + + -- 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. + + -- 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 + ‘self’) to the associated instance. A dict is returned, mapping + the argument names (including the names of the ‘*’ and ‘**’ + arguments, if any) to their values from `args' and `kwds'. In case + of invoking `func' incorrectly, i.e. whenever ‘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: + + >>> 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' + + New in version 3.2. + + Deprecated since version 3.5: Use *note Signature.bind(): 3c7e. and + *note Signature.bind_partial(): 3c7f. instead. + + -- Function: inspect.getclosurevars (func) + + Get the mapping of external name references in a Python function or + method `func' to their current values. A *note named tuple: 221. + ‘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. + + *note TypeError: 19c. is raised if `func' is not a Python function + or method. + + New in version 3.3. + + -- Function: inspect.unwrap (func, *, stop=None) + + Get the object wrapped by `func'. It follows the chain of + ‘__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, *note signature(): 301. uses + this to stop unwrapping if any object in the chain has a + ‘__signature__’ attribute defined. + + *note ValueError: 1c8. is raised if a cycle is encountered. + + New in version 3.4. + + -- Function: inspect.get_annotations (obj, *, globals=None, + locals=None, eval_str=False) + + Compute the annotations dict for an object. + + ‘obj’ may be a callable, class, or module. Passing in an object of + any other type raises *note TypeError: 19c. + + Returns a dict. ‘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: + + * If ‘eval_str’ is true, values of type ‘str’ will be + un-stringized using *note eval(): 4a7. This is intended for + use with stringized annotations (‘from __future__ import + annotations’). + + * 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.) + + * Ignores inherited annotations on classes. If a class doesn’t + have its own annotations dict, returns an empty dict. + + * All accesses to object members and dict values are done using + ‘getattr()’ and ‘dict.get()’ for safety. + + * Always, always, always returns a freshly created dict. + + ‘eval_str’ controls whether or not values of type ‘str’ are + replaced with the result of calling *note eval(): 4a7. on those + values: + + * If eval_str is true, *note eval(): 4a7. is called on values of + type ‘str’. (Note that ‘get_annotations’ doesn’t catch + exceptions; if *note eval(): 4a7. raises an exception, it will + unwind the stack past the ‘get_annotations’ call.) + + * If eval_str is false (the default), values of type ‘str’ are + unchanged. + + ‘globals’ and ‘locals’ are passed in to *note eval(): 4a7.; see the + documentation for *note eval(): 4a7. for more information. If + ‘globals’ or ‘locals’ is ‘None’, this function may replace that + value with a context-specific default, contingent on ‘type(obj)’: + + * If ‘obj’ is a module, ‘globals’ defaults to ‘obj.__dict__’. + + * If ‘obj’ is a class, ‘globals’ defaults to + ‘sys.modules[obj.__module__].__dict__’ and ‘locals’ defaults + to the ‘obj’ class namespace. + + * If ‘obj’ is a callable, ‘globals’ defaults to + ‘obj.__globals__’, although if ‘obj’ is a wrapped function + (using ‘functools.update_wrapper()’) it is first unwrapped. + + Calling ‘get_annotations’ is best practice for accessing the + annotations dict of any object. See *note Annotations Best + Practices: 3c9. for more information on annotations best practices. + + New in version 3.10. + + +File: python.info, Node: The interpreter stack, Next: Fetching attributes statically, Prev: Classes and functions<2>, Up: inspect — Inspect live objects + +5.29.13.5 The interpreter stack +............................... + +Some of the following functions return *note FrameInfo: 21f. objects. +For backwards compatibility these objects allow tuple-like operations on +all attributes except ‘positions’. This behavior is considered +deprecated and may be removed in the future. + + -- Class: inspect.FrameInfo + + -- Attribute: frame + + The *note frame object: 1906. that the record corresponds to. + + -- Attribute: filename + + The file name associated with the code being executed by the + frame this record corresponds to. + + -- Attribute: lineno + + The line number of the current line associated with the code + being executed by the frame this record corresponds to. + + -- Attribute: function + + The function name that is being executed by the frame this + record corresponds to. + + -- Attribute: code_context + + A list of lines of context from the source code that’s being + executed by the frame this record corresponds to. + + -- Attribute: index + + The index of the current line being executed in the *note + code_context: 3c94. list. + + -- Attribute: positions + + A *note dis.Positions: 3c97. 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. + + Changed in version 3.5: Return a *note named tuple: 221. instead of + a *note tuple: 539. + + Changed in version 3.11: ‘FrameInfo’ is now a class instance (that + is backwards compatible with the previous *note named tuple: 221.). + + -- Class: inspect.Traceback + + -- Attribute: filename + + The file name associated with the code being executed by the + frame this traceback corresponds to. + + -- Attribute: lineno + + The line number of the current line associated with the code + being executed by the frame this traceback corresponds to. + + -- Attribute: function + + The function name that is being executed by the frame this + traceback corresponds to. + + -- Attribute: code_context + + A list of lines of context from the source code that’s being + executed by the frame this traceback corresponds to. + + -- Attribute: index + + The index of the current line being executed in the *note + code_context: 3c9b. list. + + -- Attribute: positions + + A *note dis.Positions: 3c97. 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. + + Changed in version 3.11: ‘Traceback’ is now a class instance (that + is backwards compatible with the previous *note named tuple: 221.). + + 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 *note finally: 60a. clause. This is also important + if the cycle detector was disabled when Python was compiled or + using *note gc.disable(): 3c55. For example: + + def handle_stackframe_without_leak(): + frame = inspect.currentframe() + try: + # do something with the frame + finally: + del frame + + If you want to keep the frame around (for example to print a + traceback later), you can also break reference cycles by using the + *note frame.clear(): b9c. method. + +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. + + -- Function: inspect.getframeinfo (frame, context=1) + + Get information about a frame or traceback object. A *note + Traceback: 220. object is returned. + + Changed in version 3.11: A *note Traceback: 220. object is returned + instead of a named tuple. + + -- Function: inspect.getouterframes (frame, context=1) + + Get a list of *note FrameInfo: 21f. 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 *note named tuples: 221. + ‘FrameInfo(frame, filename, lineno, function, code_context, index)’ + is returned. + + Changed in version 3.11: A list of *note FrameInfo: 21f. objects is + returned. + + -- Function: inspect.getinnerframes (traceback, context=1) + + Get a list of *note FrameInfo: 21f. 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 *note named tuples: 221. + ‘FrameInfo(frame, filename, lineno, function, code_context, index)’ + is returned. + + Changed in version 3.11: A list of *note FrameInfo: 21f. objects is + returned. + + -- 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 ‘None’. + + -- Function: inspect.stack (context=1) + + Return a list of *note FrameInfo: 21f. 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 *note named tuples: 221. + ‘FrameInfo(frame, filename, lineno, function, code_context, index)’ + is returned. + + Changed in version 3.11: A list of *note FrameInfo: 21f. objects is + returned. + + -- Function: inspect.trace (context=1) + + Return a list of *note FrameInfo: 21f. 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 *note named tuples: 221. + ‘FrameInfo(frame, filename, lineno, function, code_context, index)’ + is returned. + + Changed in version 3.11: A list of *note FrameInfo: 21f. objects is + returned. + + +File: python.info, Node: Fetching attributes statically, Next: Current State of Generators and Coroutines, Prev: The interpreter stack, Up: inspect — Inspect live objects + +5.29.13.6 Fetching attributes statically +........................................ + +Both *note getattr(): 837. and *note hasattr(): 836. can trigger code +execution when fetching or checking for the existence of attributes. +Descriptors, like properties, will be invoked and ‘__getattr__()’ and +‘__getattribute__()’ may be called. + +For cases where you want passive introspection, like documentation +tools, this can be inconvenient. *note getattr_static(): ef4. has the +same signature as *note getattr(): 837. but avoids executing code when +it fetches attributes. + + -- Function: inspect.getattr_static (obj, attr, default=None) + + Retrieve attributes without triggering dynamic lookup via the + descriptor protocol, ‘__getattr__()’ or ‘__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 *note __dict__: 8ce. is shadowed by another member + (for example a property) then this function will be unable to find + instance members. + + New in version 3.2. + +*note getattr_static(): ef4. 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 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 + + +File: python.info, Node: Current State of Generators and Coroutines, Next: Code Objects Bit Flags, Prev: Fetching attributes statically, Up: inspect — Inspect live objects + +5.29.13.7 Current State of Generators and Coroutines +.................................................... + +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. *note getgeneratorstate(): ef3. allows the current state of +a generator to be determined easily. + + -- Function: inspect.getgeneratorstate (generator) + + Get current state of a generator-iterator. + + Possible states are: + + * GEN_CREATED: Waiting to start execution. + + * GEN_RUNNING: Currently being executed by the interpreter. + + * GEN_SUSPENDED: Currently suspended at a yield expression. + + * GEN_CLOSED: Execution has completed. + + New in version 3.2. + + -- Function: inspect.getcoroutinestate (coroutine) + + Get current state of a coroutine object. The function is intended + to be used with coroutine objects created by *note async def: 19b. + functions, but will accept any coroutine-like object that has + ‘cr_running’ and ‘cr_frame’ attributes. + + Possible states are: + + * CORO_CREATED: Waiting to start execution. + + * CORO_RUNNING: Currently being executed by the + interpreter. + + * CORO_SUSPENDED: Currently suspended at an await + expression. + + * CORO_CLOSED: Execution has completed. + + New in version 3.5. + +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: + + -- 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 *note locals(): + 842. in the body of the generator, and all the same caveats apply. + + If `generator' is a *note generator: d11. with no currently + associated frame, then an empty dictionary is returned. *note + TypeError: 19c. 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. + + New in version 3.3. + + -- Function: inspect.getcoroutinelocals (coroutine) + + This function is analogous to *note getgeneratorlocals(): d81, but + works for coroutine objects created by *note async def: 19b. + functions. + + New in version 3.5. + + +File: python.info, Node: Code Objects Bit Flags, Next: Command Line Interface<3>, Prev: Current State of Generators and Coroutines, Up: inspect — Inspect live objects + +5.29.13.8 Code Objects Bit Flags +................................ + +Python code objects have a ‘co_flags’ attribute, which is a bitmap of +the following flags: + + -- Data: inspect.CO_OPTIMIZED + + The code object is optimized, using fast locals. + + -- Data: inspect.CO_NEWLOCALS + + If set, a new dict will be created for the frame’s ‘f_locals’ when + the code object is executed. + + -- Data: inspect.CO_VARARGS + + The code object has a variable positional parameter (‘*args’-like). + + -- Data: inspect.CO_VARKEYWORDS + + The code object has a variable keyword parameter (‘**kwargs’-like). + + -- Data: inspect.CO_NESTED + + The flag is set when the code object is a nested function. + + -- 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. + + -- 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 PEP + 492(1) for more details. + + New in version 3.5. + + -- 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 + ‘await’ expression, and can ‘yield from’ coroutine objects. See + PEP 492(2) for more details. + + New in version 3.5. + + -- 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 PEP 525(3) for more details. + + New in version 3.6. + + 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 + *note inspect: 9e. module for any introspection needs. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0492/ + + (2) https://peps.python.org/pep-0492/ + + (3) https://peps.python.org/pep-0525/ + + +File: python.info, Node: Command Line Interface<3>, Prev: Code Objects Bit Flags, Up: inspect — Inspect live objects + +5.29.13.9 Command Line Interface +................................ + +The *note inspect: 9e. 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. + + -- Program Option: --details + + Print information about the specified object rather than the source + code + + +File: python.info, Node: site — Site-specific configuration hook, Prev: inspect — Inspect live objects, Up: Python Runtime Services + +5.29.14 ‘site’ — Site-specific configuration hook +------------------------------------------------- + +`Source code:' Lib/site.py(1) + +__________________________________________________________________ + +`This module is automatically imported during initialization.' The +automatic import can be suppressed using the interpreter’s *note -S: +e5c. option. + +Importing this module will append site-specific paths to the module +search path and add a few builtins, unless *note -S: e5c. was used. In +that case, 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 *note +site.main(): 177c. function. + +Changed in version 3.3: Importing the module used to trigger paths +manipulation even when using *note -S: e5c. + +It starts by constructing up to four directories from a head and a tail +part. For the head part, it uses ‘sys.prefix’ and ‘sys.exec_prefix’; +empty heads are skipped. For the tail part, it uses the empty string +and then ‘lib/site-packages’ (on Windows) or +‘lib/python`X.Y'/site-packages’ (on Unix and macOS). For each of the +distinct head-tail combinations, it sees if it refers to an existing +directory, and if so, adds it to ‘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. + +If a file named “pyvenv.cfg” exists one directory above sys.executable, +sys.prefix and sys.exec_prefix are set to that directory and it is also +checked for site-packages (sys.base_prefix and sys.base_exec_prefix will +always be the “real” prefixes of the Python installation). If +“pyvenv.cfg” (a bootstrap configuration file) contains the key +“include-system-site-packages” set to anything other than “true” +(case-insensitive), the system-level prefixes will not be searched for +site-packages; otherwise they will. + +A path configuration file is a file whose name has the form ‘`name'.pth’ +and exists in one of the four directories mentioned above; its contents +are additional items (one per line) to be added to ‘sys.path’. +Non-existing items are never added to ‘sys.path’, and no check is made +that the item refers to a directory rather than a file. No item is +added to ‘sys.path’ more than once. Blank lines and lines beginning +with ‘#’ are skipped. Lines starting with ‘import’ (followed by space +or tab) are executed. + + Note: An executable line in a ‘.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 ‘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. + +For example, suppose ‘sys.prefix’ and ‘sys.exec_prefix’ are set to +‘/usr/local’. The Python X.Y library is then installed in +‘/usr/local/lib/python`X.Y'’. Suppose this has a subdirectory +‘/usr/local/lib/python`X.Y'/site-packages’ with three subsubdirectories, +‘foo’, ‘bar’ and ‘spam’, and two path configuration files, ‘foo.pth’ and +‘bar.pth’. Assume ‘foo.pth’ contains the following: + + # foo package configuration + + foo + bar + bletch + +and ‘bar.pth’ contains: + + # bar package configuration + + bar + +Then the following version-specific directories are added to ‘sys.path’, +in this order: + + /usr/local/lib/pythonX.Y/site-packages/bar + /usr/local/lib/pythonX.Y/site-packages/foo + +Note that ‘bletch’ is omitted because it doesn’t exist; the ‘bar’ +directory precedes the ‘foo’ directory because ‘bar.pth’ comes +alphabetically before ‘foo.pth’; and ‘spam’ is omitted because it is not +mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named ‘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 *note +ImportError: 511. or its subclass exception, and the exception’s ‘name’ +attribute equals to ‘'sitecustomize'’, it is silently ignored. If +Python is started without output streams available, as with +‘pythonw.exe’ on Windows (which is used by default to start IDLE), +attempted output from ‘sitecustomize’ is ignored. Any other exception +causes a silent and perhaps mysterious failure of the process. + +After this, an attempt is made to import a module named ‘usercustomize’, +which can perform arbitrary user-specific customizations, if *note +ENABLE_USER_SITE: 3caf. is true. This file is intended to be created in +the user site-packages directory (see below), which is part of +‘sys.path’ unless disabled by *note -s: 101c. If this import fails with +an *note ImportError: 511. or its subclass exception, and the +exception’s ‘name’ attribute equals to ‘'usercustomize'’, it is silently +ignored. + +Note that for some non-Unix systems, ‘sys.prefix’ and ‘sys.exec_prefix’ +are empty, and the path manipulations are skipped; however the import of +‘sitecustomize’ and ‘usercustomize’ is still attempted. + +* Menu: + +* Readline configuration:: +* Module contents: Module contents<5>. +* Command Line Interface: Command Line Interface<4>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/site.py + + +File: python.info, Node: Readline configuration, Next: Module contents<5>, Up: site — Site-specific configuration hook + +5.29.14.1 Readline configuration +................................ + +On systems that support *note readline: db, this module will also import +and configure the *note rlcompleter: de. module, if Python is started in +*note interactive mode: c68. and without the *note -S: e5c. option. The +default behavior is enable tab-completion and to use ‘~/.python_history’ +as the history save file. To disable it, delete (or override) the *note +sys.__interactivehook__: c69. attribute in your ‘sitecustomize’ or +‘usercustomize’ module or your *note PYTHONSTARTUP: c6a. file. + +Changed in version 3.4: Activation of rlcompleter and history was made +automatic. + + +File: python.info, Node: Module contents<5>, Next: Command Line Interface<4>, Prev: Readline configuration, Up: site — Site-specific configuration hook + +5.29.14.2 Module contents +......................... + + -- Data: site.PREFIXES + + A list of prefixes for site-packages directories. + + -- Data: site.ENABLE_USER_SITE + + Flag showing the status of the user site-packages directory. + ‘True’ means that it is enabled and was added to ‘sys.path’. + ‘False’ means that it was disabled by user request (with *note -s: + 101c. or *note PYTHONNOUSERSITE: 101d.). ‘None’ means it was + disabled for security reasons (mismatch between user or group id + and effective id) or by an administrator. + + -- Data: site.USER_SITE + + Path to the user site-packages for the running Python. Can be + ‘None’ if *note getusersitepackages(): efe. hasn’t been called yet. + Default value is ‘~/.local/lib/python`X.Y'/site-packages’ for UNIX + and non-framework macOS builds, + ‘~/Library/Python/`X.Y'/lib/python/site-packages’ for macOS + framework builds, and ‘`%APPDATA%'\Python\Python`XY'\site-packages’ + on Windows. This directory is a site directory, which means that + ‘.pth’ files in it will be processed. + + -- Data: site.USER_BASE + + Path to the base directory for the user site-packages. Can be + ‘None’ if *note getuserbase(): efd. hasn’t been called yet. + Default value is ‘~/.local’ for UNIX and macOS non-framework + builds, ‘~/Library/Python/`X.Y'’ for macOS framework builds, and + ‘`%APPDATA%'\Python’ for Windows. This value is used by Distutils + to compute the installation directories for scripts, data files, + Python modules, etc. for the *note user installation scheme: 178c. + See also *note PYTHONUSERBASE: 101b. + + -- 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 *note -S: e5c. flag. + + Changed in version 3.3: This function used to be called + unconditionally. + + -- Function: site.addsitedir (sitedir, known_paths=None) + + Add a directory to sys.path and process its ‘.pth’ files. + Typically used in ‘sitecustomize’ or ‘usercustomize’ (see above). + + -- Function: site.getsitepackages () + + Return a list containing all global site-packages directories. + + New in version 3.2. + + -- Function: site.getuserbase () + + Return the path of the user base directory, *note USER_BASE: 178b. + If it is not initialized yet, this function will also set it, + respecting *note PYTHONUSERBASE: 101b. + + New in version 3.2. + + -- Function: site.getusersitepackages () + + Return the path of the user-specific site-packages directory, *note + USER_SITE: 177b. If it is not initialized yet, this function will + also set it, respecting *note USER_BASE: 178b. To determine if the + user-specific site-packages was added to ‘sys.path’ *note + ENABLE_USER_SITE: 3caf. should be used. + + New in version 3.2. + + +File: python.info, Node: Command Line Interface<4>, Prev: Module contents<5>, Up: site — Site-specific configuration hook + +5.29.14.3 Command Line Interface +................................ + +The *note site: e8. module also provides a way to get the user +directories from the command line: + + $ python3 -m site --user-site + /home/user/.local/lib/python3.3/site-packages + +If it is called without arguments, it will print the contents of *note +sys.path: 162. on the standard output, followed by the value of *note +USER_BASE: 178b. and whether the directory exists, then the same thing +for *note USER_SITE: 177b, and finally the value of *note +ENABLE_USER_SITE: 3caf. + + -- Program Option: --user-base + + Print the path to the user base directory. + + -- Program Option: --user-site + + Print the path to the user site-packages directory. + +If both options are given, user base and user site will be printed +(always in this order), separated by *note os.pathsep: 1788. + +If any option is given, the script will exit with one of these values: +‘0’ if the user site-packages directory is enabled, ‘1’ if it was +disabled by the user, ‘2’ if it is disabled for security reasons or by +an administrator, and a value greater than 2 if there is an error. + +See also +........ + + * PEP 370(1) – Per user site-packages directory + + * *note The initialization of the sys.path module search path: 16ad. + – The initialization of *note sys.path: 162. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0370/ + + +File: python.info, Node: Custom Python Interpreters, Next: Importing Modules, Prev: Python Runtime Services, Up: The Python Standard Library + +5.30 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 *note code: 19. module. (The *note codeop: 1b. +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:: + + +File: python.info, Node: code — Interpreter base classes, Next: codeop — Compile Python code, Up: Custom Python Interpreters + +5.30.1 ‘code’ — Interpreter base classes +---------------------------------------- + +`Source code:' Lib/code.py(1) + +__________________________________________________________________ + +The ‘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. + + -- 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 the dictionary in which + code will be executed; it defaults to a newly created dictionary + with key ‘'__name__'’ set to ‘'__console__'’ and key ‘'__doc__'’ + set to ‘None’. + + -- Class: code.InteractiveConsole (locals=None, filename='<console>') + + Closely emulate the behavior of the interactive Python interpreter. + This class builds on *note InteractiveInterpreter: 3cbd. and adds + prompting using the familiar ‘sys.ps1’ and ‘sys.ps2’, and input + buffering. + + -- Function: code.interact (banner=None, readfunc=None, local=None, + exitmsg=None) + + Convenience function to run a read-eval-print loop. This creates a + new instance of *note InteractiveConsole: 1e01. and sets `readfunc' + to be used as the *note InteractiveConsole.raw_input(): 3cbf. + method, if provided. If `local' is provided, it is passed to the + *note InteractiveConsole: 1e01. constructor for use as the default + namespace for the interpreter loop. The *note interact(): 3cbe. + 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. + + -- 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 ‘'<input>'’; and `symbol' + is the optional grammar start symbol, which should be ‘'single'’ + (the default), ‘'eval'’ or ‘'exec'’. + + Returns a code object (the same as ‘compile(source, filename, + symbol)’) if the command is complete and valid; ‘None’ if the + command is incomplete; raises *note SyntaxError: 2d6. if the + command is complete and contains a syntax error, or raises *note + OverflowError: 4a4. or *note ValueError: 1c8. if the command + contains an invalid literal. + +* Menu: + +* Interactive Interpreter Objects:: +* Interactive Console Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/code.py + + +File: python.info, Node: Interactive Interpreter Objects, Next: Interactive Console Objects, Up: code — Interpreter base classes + +5.30.1.1 Interactive Interpreter Objects +........................................ + + -- Method: InteractiveInterpreter.runsource (source, + filename='<input>', symbol='single') + + Compile and run some source in the interpreter. Arguments are the + same as for *note compile_command(): 3cc0.; the default for + `filename' is ‘'<input>'’, and for `symbol' is ‘'single'’. One of + several things can happen: + + * The input is incorrect; *note compile_command(): 3cc0. raised + an exception (*note SyntaxError: 2d6. or *note OverflowError: + 4a4.). A syntax traceback will be printed by calling the + *note showsyntaxerror(): 3cc4. method. *note runsource(): + 3cc3. returns ‘False’. + + * The input is incomplete, and more input is required; *note + compile_command(): 3cc0. returned ‘None’. *note runsource(): + 3cc3. returns ‘True’. + + * The input is complete; *note compile_command(): 3cc0. returned + a code object. The code is executed by calling the *note + runcode(): 3cc5. (which also handles run-time exceptions, + except for *note SystemExit: 9b6.). *note runsource(): 3cc3. + returns ‘False’. + + The return value can be used to decide whether to use ‘sys.ps1’ or + ‘sys.ps2’ to prompt the next line. + + -- Method: InteractiveInterpreter.runcode (code) + + Execute a code object. When an exception occurs, *note + showtraceback(): a50. is called to display a traceback. All + exceptions are caught except *note SystemExit: 9b6, which is + allowed to propagate. + + A note about *note KeyboardInterrupt: 611.: this exception may + occur elsewhere in this code, and may not always be caught. The + caller should be prepared to deal with it. + + -- 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 ‘'<string>'’ when reading from a string. The output is + written by the *note write(): 3cc6. method. + + -- 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 *note write(): 3cc6. + method. + + Changed in version 3.5: The full chained traceback is displayed + instead of just the primary traceback. + + -- Method: InteractiveInterpreter.write (data) + + Write a string to the standard error stream (‘sys.stderr’). + Derived classes should override this to provide the appropriate + output handling as needed. + + +File: python.info, Node: Interactive Console Objects, Prev: Interactive Interpreter Objects, Up: code — Interpreter base classes + +5.30.1.2 Interactive Console Objects +.................................... + +The *note InteractiveConsole: 1e01. class is a subclass of *note +InteractiveInterpreter: 3cbd, and so offers all the methods of the +interpreter objects as well as the following additions. + + -- 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 ‘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. + + -- 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 ‘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 ‘True’ if more input is required, ‘False’ if the line was + dealt with in some way (this is the same as ‘runsource()’). + + -- Method: InteractiveConsole.resetbuffer () + + Remove any unhandled source text from the input buffer. + + -- Method: InteractiveConsole.raw_input (prompt='') + + Write a prompt and read a line. The returned line does not include + the trailing newline. When the user enters the EOF key sequence, + *note EOFError: f7d. is raised. The base implementation reads from + ‘sys.stdin’; a subclass may replace this with a different + implementation. + + +File: python.info, Node: codeop — Compile Python code, Prev: code — Interpreter base classes, Up: Custom Python Interpreters + +5.30.2 ‘codeop’ — Compile Python code +------------------------------------- + +`Source code:' Lib/codeop.py(1) + +__________________________________________________________________ + +The *note codeop: 1b. module provides utilities upon which the Python +read-eval-print loop can be emulated, as is done in the *note code: 19. +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 *note code: 19. module instead. + +There are two parts to this job: + + 1. Being able to tell if a line of input completes a Python statement: + in short, telling whether to print ‘‘>>>’’ or ‘‘...’’ next. + + 2. Remembering which future statements the user has entered, so + subsequent input can be compiled with these in effect. + +The *note codeop: 1b. module provides a way of doing each of these +things, and a way of doing them both. + +To do just the former: + + -- 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 ‘'<input>'’. Returns ‘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. + *note SyntaxError: 2d6. is raised if there is invalid Python + syntax, and *note OverflowError: 4a4. or *note ValueError: 1c8. if + there is an invalid literal. + + The `symbol' argument determines whether `source' is compiled as a + statement (‘'single'’, the default), as a sequence of statements + (‘'exec'’) or as an *note expression: 193a. (‘'eval'’). Any other + value will cause *note ValueError: 1c8. to be raised. + + 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. + + -- Class: codeop.Compile + + Instances of this class have ‘__call__()’ methods identical in + signature to the built-in function *note compile(): 310, but with + the difference that if the instance compiles program text + containing a *note __future__: 0. statement, the instance + ‘remembers’ and compiles all subsequent program texts with the + statement in force. + + -- Class: codeop.CommandCompiler + + Instances of this class have ‘__call__()’ methods identical in + signature to *note compile_command(): 136e.; the difference is that + if the instance compiles program text containing a ‘__future__’ + statement, the instance ‘remembers’ and compiles all subsequent + program texts with the statement in force. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/codeop.py + + +File: python.info, Node: Importing Modules, Next: Python Language Services, Prev: Custom Python Interpreters, Up: The Python Standard Library + +5.31 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 – Resources: importlib resources – Resources. +* Deprecated functions:: +* importlib.resources.abc – Abstract base classes for resources: importlib resources abc – Abstract base classes for resources. +* Using importlib.metadata: Using importlib metadata. +* The initialization of the sys.path module search path: The initialization of the sys path module search path. + + +File: python.info, Node: zipimport — Import modules from Zip archives, Next: pkgutil — Package extension utility, Up: Importing Modules + +5.31.1 ‘zipimport’ — Import modules from Zip archives +----------------------------------------------------- + +`Source code:' Lib/zipimport.py(1) + +__________________________________________________________________ + +This module adds the ability to import Python modules (‘*.py’, ‘*.pyc’) +and packages from ZIP-format archives. It is usually not needed to use +the *note zipimport: 14e. module explicitly; it is automatically used by +the built-in *note import: 1af. mechanism for *note sys.path: 162. items +that are paths to ZIP archives. + +Typically, *note sys.path: 162. is a list of directory names as strings. +This module also allows an item of *note sys.path: 162. 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 +‘example.zip/lib/’ would only import from the ‘lib/’ subdirectory within +the archive. + +Any files may be present in the ZIP archive, but importers are only +invoked for ‘.py’ and ‘.pyc’ files. ZIP import of dynamic modules +(‘.pyd’, ‘.so’) is disallowed. Note that if an archive only contains +‘.py’ files, Python will not attempt to modify the archive by adding the +corresponding ‘.pyc’ file, meaning that if a ZIP archive doesn’t contain +‘.pyc’ files, importing may be rather slow. + +Changed in version 3.8: Previously, ZIP archives with an archive comment +were not supported. + +See also +........ + +PKZIP Application Note(2) + + Documentation on the ZIP file format by Phil Katz, the creator of + the format and algorithms used. + +PEP 273(3) - Import Modules from Zip Archives + + Written by James C. Ahlstrom, who also provided an implementation. + Python 2.3 follows the specification in PEP 273(4), but uses an + implementation written by Just van Rossum that uses the import + hooks described in PEP 302(5). + +*note importlib: 97. - The implementation of the import machinery + + Package providing the relevant protocols for all importers to + implement. + +This module defines an exception: + + -- Exception: zipimport.ZipImportError + + Exception raised by zipimporter objects. It’s a subclass of *note + ImportError: 511, so it can be caught as *note ImportError: 511, + too. + +* Menu: + +* zipimporter Objects:: +* Examples: Examples<32>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/zipimport.py + + (2) https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT + + (3) https://peps.python.org/pep-0273/ + + (4) https://peps.python.org/pep-0273/ + + (5) https://peps.python.org/pep-0302/ + + +File: python.info, Node: zipimporter Objects, Next: Examples<32>, Up: zipimport — Import modules from Zip archives + +5.31.1.1 zipimporter Objects +............................ + +*note zipimporter: 3cd8. is the class for importing ZIP files. + + -- 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 ‘foo/bar.zip/lib’ will look for modules in the + ‘lib’ directory inside the ZIP file ‘foo/bar.zip’ (provided that it + exists). + + *note ZipImportError: 3cd5. is raised if `archivepath' doesn’t + point to a valid ZIP archive. + + -- Method: create_module (spec) + + Implementation of *note importlib.abc.Loader.create_module(): + 91b. that returns *note None: 243. to explicitly request the + default semantics. + + New in version 3.10. + + -- Method: exec_module (module) + + Implementation of *note importlib.abc.Loader.exec_module(): + 46c. + + New in version 3.10. + + -- Method: find_loader (fullname, path=None) + + An implementation of *note + importlib.abc.PathEntryFinder.find_loader(): 2ee. + + Deprecated since version 3.10: Use *note find_spec(): 459. + instead. + + -- Method: find_module (fullname, path=None) + + Search for a module specified by `fullname'. `fullname' must + be the fully qualified (dotted) module name. It returns the + zipimporter instance itself if the module was found, or *note + None: 243. if it wasn’t. The optional `path' argument is + ignored—it’s there for compatibility with the importer + protocol. + + Deprecated since version 3.10: Use *note find_spec(): 459. + instead. + + -- Method: find_spec (fullname, target=None) + + An implementation of *note + importlib.abc.PathEntryFinder.find_spec(): 470. + + New in version 3.10. + + -- Method: get_code (fullname) + + Return the code object for the specified module. Raise *note + ZipImportError: 3cd5. if the module couldn’t be imported. + + -- Method: get_data (pathname) + + Return the data associated with `pathname'. Raise *note + OSError: 413. if the file wasn’t found. + + Changed in version 3.3: *note IOError: d02. used to be raised + instead of *note OSError: 413. + + -- Method: get_filename (fullname) + + Return the value ‘__file__’ would be set to if the specified + module was imported. Raise *note ZipImportError: 3cd5. if the + module couldn’t be imported. + + New in version 3.1. + + -- Method: get_source (fullname) + + Return the source code for the specified module. Raise *note + ZipImportError: 3cd5. if the module couldn’t be found, return + *note None: 243. if the archive does contain the module, but + has no source for it. + + -- Method: is_package (fullname) + + Return ‘True’ if the module specified by `fullname' is a + package. Raise *note ZipImportError: 3cd5. if the module + couldn’t be found. + + -- 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 *note ZipImportError: 3cd5. + on failure. + + Deprecated since version 3.10: Use *note exec_module(): 45b. + instead. + + -- Method: invalidate_caches () + + Clear out the internal cache of information about files found + within the ZIP archive. + + New in version 3.10. + + -- Attribute: archive + + The file name of the importer’s associated ZIP file, without a + possible subpath. + + -- 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. + + The *note archive: 3ce0. and *note prefix: 3ce1. attributes, when + combined with a slash, equal the original `archivepath' argument + given to the *note zipimporter: 3cd8. constructor. + + +File: python.info, Node: Examples<32>, Prev: zipimporter Objects, Up: zipimport — Import modules from Zip archives + +5.31.1.2 Examples +................. + +Here is an example that imports a module from a ZIP archive - note that +the *note zipimport: 14e. module is not explicitly used. + + $ unzip -l example.zip + Archive: example.zip + Length Date Time Name + -------- ---- ---- ---- + 8467 11-26-02 22:30 jwzthreading.py + -------- ------- + 8467 1 file + $ ./python + Python 2.3 (#1, Aug 1 2003, 19:54:32) + >>> import sys + >>> sys.path.insert(0, 'example.zip') # Add .zip file to front of path + >>> import jwzthreading + >>> jwzthreading.__file__ + 'example.zip/jwzthreading.py' + + +File: python.info, Node: pkgutil — Package extension utility, Next: modulefinder — Find modules used by a script, Prev: zipimport — Import modules from Zip archives, Up: Importing Modules + +5.31.2 ‘pkgutil’ — Package extension utility +-------------------------------------------- + +`Source code:' Lib/pkgutil.py(1) + +__________________________________________________________________ + +This module provides utilities for the import system, in particular +package support. + + -- Class: pkgutil.ModuleInfo (module_finder, name, ispkg) + + A namedtuple that holds a brief summary of a module’s info. + + New in version 3.6. + + -- 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 + ‘__init__.py’: + + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) + + This will add to the package’s ‘__path__’ all subdirectories of + directories on *note sys.path: 162. named after the package. This + is useful if one wants to distribute different parts of a single + logical package as multiple directories. + + It also looks for ‘*.pkg’ files beginning where ‘*’ matches the + `name' argument. This feature is similar to ‘*.pth’ files (see the + *note site: e8. module for more information), except that it + doesn’t special-case lines starting with ‘import’. A ‘*.pkg’ file + is trusted at face value: apart from checking for duplicates, all + entries found in a ‘*.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 *note sys.path: 162. is a sequence. Items of + *note sys.path: 162. that are not strings referring to existing + directories are ignored. Unicode items on *note sys.path: 162. + that cause errors when used as filenames may cause this function to + raise an exception (in line with *note os.path.isdir(): 659. + behavior). + + -- Class: pkgutil.ImpImporter (dirname=None) + + PEP 302(2) Finder that wraps Python’s “classic” import algorithm. + + If `dirname' is a string, a PEP 302(3) finder is created that + searches that directory. If `dirname' is ‘None’, a PEP 302(4) + finder is created that searches the current *note sys.path: 162, + plus any modules that are frozen or built-in. + + Note that *note ImpImporter: 2e7. does not currently support being + used by placement on *note sys.meta_path: 9a0. + + Deprecated since version 3.3: This emulation is no longer needed, + as the standard import mechanism is now fully PEP 302(5) compliant + and available in *note importlib: 97. + + -- Class: pkgutil.ImpLoader (fullname, file, filename, etc) + + *note Loader: 19ad. that wraps Python’s “classic” import algorithm. + + Deprecated since version 3.3: This emulation is no longer needed, + as the standard import mechanism is now fully PEP 302(6) compliant + and available in *note importlib: 97. + + -- Function: pkgutil.find_loader (fullname) + + Retrieve a module *note loader: 19ad. for the given `fullname'. + + This is a backwards compatibility wrapper around *note + importlib.util.find_spec(): cb4. that converts most failures to + *note ImportError: 511. and only returns the loader rather than the + full ‘ModuleSpec’. + + Changed in version 3.3: Updated to be based directly on *note + importlib: 97. rather than relying on the package internal PEP + 302(7) import emulation. + + Changed in version 3.4: Updated to be based on PEP 451(8) + + -- Function: pkgutil.get_importer (path_item) + + Retrieve a *note finder: 19ac. for the given `path_item'. + + The returned finder is cached in *note sys.path_importer_cache: + 1b2. if it was newly created by a path hook. + + The cache (or part of it) can be cleared manually if a rescan of + *note sys.path_hooks: cd0. is necessary. + + Changed in version 3.3: Updated to be based directly on *note + importlib: 97. rather than relying on the package internal PEP + 302(9) import emulation. + + -- Function: pkgutil.get_loader (module_or_name) + + Get a *note loader: 19ad. object for `module_or_name'. + + If the module or package is accessible via the normal import + mechanism, a wrapper around the relevant part of that machinery is + returned. Returns ‘None’ if the module cannot be found or + imported. If the named module is not already imported, its + containing package (if any) is imported, in order to establish the + package ‘__path__’. + + Changed in version 3.3: Updated to be based directly on *note + importlib: 97. rather than relying on the package internal PEP + 302(10) import emulation. + + Changed in version 3.4: Updated to be based on PEP 451(11) + + -- Function: pkgutil.iter_importers (fullname='') + + Yield *note finder: 19ac. objects for the given module name. + + If fullname contains a ‘'.'’, the finders will be for the package + containing fullname, otherwise they will be all registered top + level finders (i.e. those on both *note sys.meta_path: 9a0. and + *note sys.path_hooks: cd0.). + + 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 *note + importlib: 97. rather than relying on the package internal PEP + 302(12) import emulation. + + -- Function: pkgutil.iter_modules (path=None, prefix='') + + Yields *note ModuleInfo: 9c6. for all submodules on `path', or, if + `path' is ‘None’, all top-level modules on *note sys.path: 162. + + `path' should be either ‘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: Only works for a *note finder: 19ac. which defines an + ‘iter_modules()’ method. This interface is non-standard, so + the module also provides implementations for *note + importlib.machinery.FileFinder: d21. and *note + zipimport.zipimporter: 3cd8. + + Changed in version 3.3: Updated to be based directly on *note + importlib: 97. rather than relying on the package internal PEP + 302(13) import emulation. + + -- Function: pkgutil.walk_packages (path=None, prefix='', onerror=None) + + Yields *note ModuleInfo: 9c6. for all modules recursively on + `path', or, if `path' is ‘None’, all accessible modules. + + `path' should be either ‘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 ‘__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, *note ImportError: 511.s are caught and ignored, while + all other exceptions are propagated, terminating the search. + + Examples: + + # list all modules python can access + walk_packages() + + # list all submodules of ctypes + walk_packages(ctypes.__path__, ctypes.__name__ + '.') + + Note: Only works for a *note finder: 19ac. which defines an + ‘iter_modules()’ method. This interface is non-standard, so + the module also provides implementations for *note + importlib.machinery.FileFinder: d21. and *note + zipimport.zipimporter: 3cd8. + + Changed in version 3.3: Updated to be based directly on *note + importlib: 97. rather than relying on the package internal PEP + 302(14) import emulation. + + -- Function: pkgutil.get_data (package, resource) + + Get a resource from a package. + + This is a wrapper for the *note loader: 19ad. *note get_data: 3cea. + API. The `package' argument should be the name of a package, in + standard module format (‘foo.bar’). The `resource' argument should + be in the form of a relative filename, using ‘/’ as the path + separator. The parent directory name ‘..’ is not allowed, and nor + is a rooted name (starting with a ‘/’). + + The function returns a binary string that is the contents of the + specified resource. + + For packages located in the filesystem, which have already been + imported, this is the rough equivalent of: + + d = os.path.dirname(sys.modules[package].__file__) + data = open(os.path.join(d, resource), 'rb').read() + + If the package cannot be located or loaded, or it uses a *note + loader: 19ad. which does not support *note get_data: 3cea, then + ‘None’ is returned. In particular, the *note loader: 19ad. for + *note namespace packages: 19a5. does not support *note get_data: + 3cea. + + -- 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(15)) - 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: + + * ‘W(.W)*’ + + * ‘W(.W)*:(W(.W)*)?’ + + 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: + + *note ValueError: 1c8. – if `name' isn’t in a recognised format. + + *note ImportError: 511. – if an import failed when it shouldn’t + have. + + *note AttributeError: 19d. – If a failure occurred when traversing + the object hierarchy within the imported package to get to the + desired object. + + New in version 3.9. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/pkgutil.py + + (2) https://peps.python.org/pep-0302/ + + (3) https://peps.python.org/pep-0302/ + + (4) https://peps.python.org/pep-0302/ + + (5) https://peps.python.org/pep-0302/ + + (6) https://peps.python.org/pep-0302/ + + (7) https://peps.python.org/pep-0302/ + + (8) https://peps.python.org/pep-0451/ + + (9) https://peps.python.org/pep-0302/ + + (10) https://peps.python.org/pep-0302/ + + (11) https://peps.python.org/pep-0451/ + + (12) https://peps.python.org/pep-0302/ + + (13) https://peps.python.org/pep-0302/ + + (14) https://peps.python.org/pep-0302/ + + (15) https://bugs.python.org/issue?@action=redirect&bpo=12915 + + +File: python.info, Node: modulefinder — Find modules used by a script, Next: runpy — Locating and executing Python modules, Prev: pkgutil — Package extension utility, Up: Importing Modules + +5.31.3 ‘modulefinder’ — Find modules used by a script +----------------------------------------------------- + +`Source code:' Lib/modulefinder.py(1) + +__________________________________________________________________ + +This module provides a *note ModuleFinder: 1434. class that can be used +to determine the set of modules imported by a script. ‘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. + + -- Function: modulefinder.AddPackagePath (pkg_name, path) + + Record that the package named `pkg_name' can be found in the + specified `path'. + + -- Function: modulefinder.ReplacePackage (oldname, newname) + + Allows specifying that the module named `oldname' is in fact the + package named `newname'. + + -- Class: modulefinder.ModuleFinder (path=None, debug=0, excludes=[], + replace_paths=[]) + + This class provides *note run_script(): 3cf0. and *note report(): + 3cf1. 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, ‘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 ‘(oldpath, newpath)’ + tuples that will be replaced in module paths. + + -- 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. + + -- Method: run_script (pathname) + + Analyze the contents of the `pathname' file, which must + contain Python code. + + -- Attribute: modules + + A dictionary mapping module names to modules. See *note + Example usage of ModuleFinder: 3cf3. + +* Menu: + +* Example usage of ModuleFinder:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/modulefinder.py + + +File: python.info, Node: Example usage of ModuleFinder, Up: modulefinder — Find modules used by a script + +5.31.3.1 Example usage of ‘ModuleFinder’ +........................................ + +The script that is going to get analyzed later on (bacon.py): + + import re, itertools + + try: + import baconhameggs + except ImportError: + pass + + try: + import guido.python.ham + except ImportError: + pass + +The script that will output the report of bacon.py: + + 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='') + print(','.join(list(mod.globalnames.keys())[:3])) + + print('-'*50) + print('Modules not imported:') + print('\n'.join(finder.badmodules.keys())) + +Sample output (may vary depending on the architecture): + + 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 + + +File: python.info, Node: runpy — Locating and executing Python modules, Next: importlib — The implementation of import, Prev: modulefinder — Find modules used by a script, Up: Importing Modules + +5.31.4 ‘runpy’ — Locating and executing Python modules +------------------------------------------------------ + +`Source code:' Lib/runpy.py(1) + +__________________________________________________________________ + +The *note runpy: df. module is used to locate and run Python modules +without importing them first. Its main use is to implement the *note +-m: 1ae. 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 *note runpy: df. function has +returned. If that limitation is not acceptable for a given use case, +*note importlib: 97. is likely to be a more suitable choice than this +module. + +The *note runpy: df. module provides two functions: + + -- Function: runpy.run_module (mod_name, init_globals=None, + run_name=None, alter_sys=False) + + Execute the code of the specified module and return the resulting + module globals dictionary. The module’s code is first located + using the standard import mechanism (refer to PEP 302(2) 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 ‘__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. The supplied dictionary will not be modified. If any of + the special global variables below are defined in the supplied + dictionary, those definitions are overridden by *note run_module(): + 11f2. + + The special global variables ‘__name__’, ‘__spec__’, ‘__file__’, + ‘__cached__’, ‘__loader__’ and ‘__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). + + ‘__name__’ is set to `run_name' if this optional argument is not + *note None: 243, to ‘mod_name + '.__main__'’ if the named module is + a package and to the `mod_name' argument otherwise. + + ‘__spec__’ will be set appropriately for the `actually' imported + module (that is, ‘__spec__.name’ will always be `mod_name' or + ‘mod_name + '.__main__’, never `run_name'). + + ‘__file__’, ‘__cached__’, ‘__loader__’ and ‘__package__’ are *note + set as normal: 19b4. based on the module spec. + + If the argument `alter_sys' is supplied and evaluates to *note + True: 877, then ‘sys.argv[0]’ is updated with the value of + ‘__file__’ and ‘sys.modules[__name__]’ is updated with a temporary + module object for the module being executed. Both ‘sys.argv[0]’ + and ‘sys.modules[__name__]’ are restored to their original values + before the function returns. + + Note that this manipulation of *note sys: f9. 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 *note + sys: f9. module be left alone when invoking this function from + threaded code. + + See also + ........ + + The *note -m: 1ae. option offering equivalent functionality from + the command line. + + Changed in version 3.1: Added ability to execute packages by + looking for a ‘__main__’ submodule. + + Changed in version 3.2: Added ‘__cached__’ global variable (see PEP + 3147(3)). + + Changed in version 3.4: Updated to take advantage of the module + spec feature added by PEP 451(4). This allows ‘__cached__’ to be + set correctly for modules run this way, as well as ensuring the + real module name is always accessible as ‘__spec__.name’. + + -- Function: runpy.run_path (path_name, init_globals=None, + run_name=None) + + Execute the code at the named filesystem location and return the + resulting module globals dictionary. As with a script name + supplied to the CPython command line, the supplied path may refer + to a Python source file, a compiled bytecode file or a valid + sys.path entry containing a ‘__main__’ module (e.g. a zipfile + containing a top-level ‘__main__.py’ file). + + For a simple script, the specified code is simply executed in a + fresh module namespace. For a valid sys.path entry (typically a + zipfile or directory), the entry is first added to the beginning of + ‘sys.path’. The function then looks for and executes a *note + __main__: 1. module using the updated path. Note that there is no + special protection against invoking an existing *note __main__: 1. + entry located elsewhere on ‘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. The supplied dictionary will not be modified. If any of + the special global variables below are defined in the supplied + dictionary, those definitions are overridden by *note run_path(): + fbc. + + The special global variables ‘__name__’, ‘__spec__’, ‘__file__’, + ‘__cached__’, ‘__loader__’ and ‘__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). + + ‘__name__’ is set to `run_name' if this optional argument is not + *note None: 243. and to ‘'<run_path>'’ otherwise. + + If the supplied path directly references a script file (whether as + source or as precompiled byte code), then ‘__file__’ will be set to + the supplied path, and ‘__spec__’, ‘__cached__’, ‘__loader__’ and + ‘__package__’ will all be set to *note None: 243. + + If the supplied path is a reference to a valid sys.path entry, then + ‘__spec__’ will be set appropriately for the imported ‘__main__’ + module (that is, ‘__spec__.name’ will always be ‘__main__’). + ‘__file__’, ‘__cached__’, ‘__loader__’ and ‘__package__’ will be + *note set as normal: 19b4. based on the module spec. + + A number of alterations are also made to the *note sys: f9. module. + Firstly, ‘sys.path’ may be altered as described above. + ‘sys.argv[0]’ is updated with the value of ‘path_name’ and + ‘sys.modules[__name__]’ is updated with a temporary module object + for the module being executed. All modifications to items in *note + sys: f9. are reverted before the function returns. + + Note that, unlike *note run_module(): 11f2, the alterations made to + *note sys: f9. are not optional in this function as these + adjustments are essential to allowing the execution of 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. + + See also + ........ + + *note Interface options: 1768. for equivalent functionality on the + command line (‘python path/to/script’). + + New in version 3.2. + + Changed in version 3.4: Updated to take advantage of the module + spec feature added by PEP 451(5). This allows ‘__cached__’ to be + set correctly in the case where ‘__main__’ is imported from a valid + sys.path entry rather than being executed directly. + +See also +........ + +PEP 338(6) – Executing modules as scripts + + PEP written and implemented by Nick Coghlan. + +PEP 366(7) – Main module explicit relative imports + + PEP written and implemented by Nick Coghlan. + +PEP 451(8) – A ModuleSpec Type for the Import System + + PEP written and implemented by Eric Snow + +*note Command line and environment: 13e0. - CPython command line details + +The *note importlib.import_module(): e4d. function + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/runpy.py + + (2) https://peps.python.org/pep-0302/ + + (3) https://peps.python.org/pep-3147/ + + (4) https://peps.python.org/pep-0451/ + + (5) https://peps.python.org/pep-0451/ + + (6) https://peps.python.org/pep-0338/ + + (7) https://peps.python.org/pep-0366/ + + (8) https://peps.python.org/pep-0451/ + + +File: python.info, Node: importlib — The implementation of import, Next: importlib resources – Resources, Prev: runpy — Locating and executing Python modules, Up: Importing Modules + +5.31.5 ‘importlib’ — The implementation of ‘import’ +--------------------------------------------------- + +New in version 3.1. + +`Source code:' Lib/importlib/__init__.py(1) + +__________________________________________________________________ + +* Menu: + +* Introduction: Introduction<10>. +* Functions: Functions<11>. +* 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<33>. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/importlib/__init__.py + + +File: python.info, Node: Introduction<10>, Next: Functions<11>, Up: importlib — The implementation of import + +5.31.5.1 Introduction +..................... + +The purpose of the *note importlib: 97. package is three-fold. + +One is to provide the implementation of the *note import: 1af. statement +(and thus, by extension, the *note __import__(): 510. function) in +Python source code. This provides an implementation of ‘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 *note import: 1af. are exposed in this +package, making it easier for users to create their own custom objects +(known generically as an *note importer: 19ae.) to participate in the +import process. + +Three, the package contains modules exposing additional functionality +for managing aspects of Python packages: + + * *note importlib.metadata: 9a. presents access to metadata from + third-party distributions. + + * *note importlib.resources: 9b. provides routines for accessing + non-code “resources” from Python packages. + +See also +........ + +*note The import statement: 1af. + + The language reference for the *note import: 1af. statement. + +Packages specification(1) + + Original specification of packages. Some semantics have changed + since the writing of this document (e.g. redirecting based on + ‘None’ in *note sys.modules: 1382.). + +The *note __import__(): d1c. function + + The *note import: 1af. statement is syntactic sugar for this + function. + +*note The initialization of the sys.path module search path: 16ad. + + The initialization of *note sys.path: 162. + +PEP 235(2) + + Import on Case-Insensitive Platforms + +PEP 263(3) + + Defining Python Source Code Encodings + +PEP 302(4) + + New Import Hooks + +PEP 328(5) + + Imports: Multi-Line and Absolute/Relative + +PEP 366(6) + + Main module explicit relative imports + +PEP 420(7) + + Implicit namespace packages + +PEP 451(8) + + A ModuleSpec Type for the Import System + +PEP 488(9) + + Elimination of PYO files + +PEP 489(10) + + Multi-phase extension module initialization + +PEP 552(11) + + Deterministic pycs + +PEP 3120(12) + + Using UTF-8 as the Default Source Encoding + +PEP 3147(13) + + PYC Repository Directories + + ---------- Footnotes ---------- + + (1) https://www.python.org/doc/essays/packages/ + + (2) https://peps.python.org/pep-0235/ + + (3) https://peps.python.org/pep-0263/ + + (4) https://peps.python.org/pep-0302/ + + (5) https://peps.python.org/pep-0328/ + + (6) https://peps.python.org/pep-0366/ + + (7) https://peps.python.org/pep-0420/ + + (8) https://peps.python.org/pep-0451/ + + (9) https://peps.python.org/pep-0488/ + + (10) https://peps.python.org/pep-0489/ + + (11) https://peps.python.org/pep-0552/ + + (12) https://peps.python.org/pep-3120/ + + (13) https://peps.python.org/pep-3147/ + + +File: python.info, Node: Functions<11>, Next: importlib abc – Abstract base classes related to import, Prev: Introduction<10>, Up: importlib — The implementation of import + +5.31.5.2 Functions +.................. + + -- Function: importlib.__import__ (name, globals=None, locals=None, + fromlist=(), level=0) + + An implementation of the built-in *note __import__(): 510. + function. + + Note: Programmatic importing of modules should use *note + import_module(): e4d. instead of this function. + + -- 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 ‘pkg.mod’ or + ‘..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. + ‘import_module('..mod', 'pkg.subpkg')’ will import ‘pkg.mod’). + + The *note import_module(): e4d. function acts as a simplifying + wrapper around *note importlib.__import__(): d1c. This means all + semantics of the function are derived from *note + importlib.__import__(): d1c. The most important difference between + these two functions is that *note import_module(): e4d. returns the + specified package or module (e.g. ‘pkg.mod’), while *note + __import__(): 510. returns the top-level package or module (e.g. + ‘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 *note invalidate_caches(): 87a. in + order for the new module to be noticed by the import system. + + Changed in version 3.3: Parent packages are automatically imported. + + -- Function: importlib.find_loader (name, path=None) + + Find the loader for a module, optionally within the specified + `path'. If the module is in *note sys.modules: 1382, then + ‘sys.modules[name].__loader__’ is returned (unless the loader would + be ‘None’ or is not set, in which case *note ValueError: 1c8. is + raised). Otherwise a search using *note sys.meta_path: 9a0. is + done. ‘None’ is returned if no loader is found. + + A dotted name does not have its parents implicitly imported as that + requires loading them and that may not be desired. To properly + import a submodule you will need to import all parent packages of + the submodule and use the correct argument to `path'. + + New in version 3.3. + + Changed in version 3.4: If ‘__loader__’ is not set, raise *note + ValueError: 1c8, just like when the attribute is set to ‘None’. + + Deprecated since version 3.4: Use *note importlib.util.find_spec(): + cb4. instead. + + -- Function: importlib.invalidate_caches () + + Invalidate the internal caches of finders stored at *note + sys.meta_path: 9a0. If a finder implements ‘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. + + New in version 3.3. + + Changed in version 3.10: Namespace packages created/installed in a + different *note sys.path: 162. location after the same namespace + was already imported are noticed. + + -- 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 *note sys.modules: 1382.). + + When *note reload(): 79d. is executed: + + * 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 *note loader: + 19ad. which originally loaded the module. The ‘init’ function + of extension modules is not called a second time. + + * As with all other objects in Python the old objects are only + reclaimed after their reference counts drop to zero. + + * The names in the module namespace are updated to point to any + new or changed objects. + + * 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. + + 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 *note try: 1073. + statement it can test for the table’s presence and skip its + initialization if desired: + + try: + cache + except NameError: + cache = {} + + It is generally not very useful to reload built-in or dynamically + loaded modules. Reloading *note sys: f9, *note __main__: 1, *note + builtins: 11. 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 *note from: + f5a. … *note import: 1af. …, calling *note reload(): 79d. for the + other module does not redefine the objects imported from it — one + way around this is to re-execute the ‘from’ statement, another is + to use ‘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. + + New in version 3.4. + + Changed in version 3.7: *note ModuleNotFoundError: 79e. is raised + when the module being reloaded lacks a *note ModuleSpec: 19b8. + + +File: python.info, Node: importlib abc – Abstract base classes related to import, Next: importlib machinery – Importers and path hooks, Prev: Functions<11>, Up: importlib — The implementation of import + +5.31.5.3 ‘importlib.abc’ – Abstract base classes related to import +.................................................................. + +`Source code:' Lib/importlib/abc.py(1) + +__________________________________________________________________ + +The *note importlib.abc: 98. module contains all of the core abstract +base classes used by *note import: 1af. Some subclasses of the core +abstract base classes are also provided to help in implementing the core +ABCs. + +ABC hierarchy: + + object + +-- Finder (deprecated) + +-- MetaPathFinder + +-- PathEntryFinder + +-- Loader + +-- ResourceLoader --------+ + +-- InspectLoader | + +-- ExecutionLoader --+ + +-- FileLoader + +-- SourceLoader + + -- Class: importlib.abc.Finder + + An abstract base class representing a *note finder: 19ac. + + Deprecated since version 3.3: Use *note MetaPathFinder: 473. or + *note PathEntryFinder: 474. instead. + + -- Method: abstractmethod find_module (fullname, path=None) + + An abstract method for finding a *note loader: 19ad. for the + specified module. Originally specified in PEP 302(2), this + method was meant for use in *note sys.meta_path: 9a0. and in + the path-based import subsystem. + + Changed in version 3.4: Returns ‘None’ when called instead of + raising *note NotImplementedError: 9c7. + + Deprecated since version 3.10: Implement *note + MetaPathFinder.find_spec(): 46f. or *note + PathEntryFinder.find_spec(): 470. instead. + + -- Class: importlib.abc.MetaPathFinder + + An abstract base class representing a *note meta path finder: d1f. + + New in version 3.3. + + Changed in version 3.10: No longer a subclass of *note Finder: 472. + + -- Method: find_spec (fullname, path, target=None) + + An abstract method for finding a *note spec: 3bcf. for the + specified module. If this is a top-level import, `path' will + be ‘None’. Otherwise, this is a search for a subpackage or + module and `path' will be the value of *note __path__: 16ba. + from the parent package. If a spec cannot be found, ‘None’ is + returned. When passed in, ‘target’ is a module object that + the finder may use to make a more educated guess about what + spec to return. *note importlib.util.spec_from_loader(): 471. + may be useful for implementing concrete ‘MetaPathFinders’. + + New in version 3.4. + + -- Method: find_module (fullname, path) + + A legacy method for finding a *note loader: 19ad. for the + specified module. If this is a top-level import, `path' will + be ‘None’. Otherwise, this is a search for a subpackage or + module and `path' will be the value of *note __path__: 16ba. + from the parent package. If a loader cannot be found, ‘None’ + is returned. + + If *note find_spec(): 46f. is defined, backwards-compatible + functionality is provided. + + Changed in version 3.4: Returns ‘None’ when called instead of + raising *note NotImplementedError: 9c7. Can use *note + find_spec(): 46f. to provide functionality. + + Deprecated since version 3.4: Use *note find_spec(): 46f. + instead. + + -- Method: invalidate_caches () + + An optional method which, when called, should invalidate any + internal cache used by the finder. Used by *note + importlib.invalidate_caches(): 87a. when invalidating the + caches of all finders on *note sys.meta_path: 9a0. + + Changed in version 3.4: Returns ‘None’ when called instead of + ‘NotImplemented’. + + -- Class: importlib.abc.PathEntryFinder + + An abstract base class representing a *note path entry finder: d20. + Though it bears some similarities to *note MetaPathFinder: 473, + ‘PathEntryFinder’ is meant for use only within the path-based + import subsystem provided by *note importlib.machinery.PathFinder: + ccf. + + New in version 3.3. + + Changed in version 3.10: No longer a subclass of *note Finder: 472. + + -- Method: find_spec (fullname, target=None) + + An abstract method for finding a *note spec: 3bcf. for the + specified module. The finder will search for the module only + within the *note path entry: 19c9. to which it is assigned. + If a spec cannot be found, ‘None’ is returned. When passed + in, ‘target’ is a module object that the finder may use to + make a more educated guess about what spec to return. *note + importlib.util.spec_from_loader(): 471. may be useful for + implementing concrete ‘PathEntryFinders’. + + New in version 3.4. + + -- Method: find_loader (fullname) + + A legacy method for finding a *note loader: 19ad. for the + specified module. Returns a 2-tuple of ‘(loader, portion)’ + where ‘portion’ is a sequence of file system locations + contributing to part of a namespace package. The loader may + be ‘None’ while specifying ‘portion’ to signify the + contribution of the file system locations to a namespace + package. An empty list can be used for ‘portion’ to signify + the loader is not part of a namespace package. If ‘loader’ is + ‘None’ and ‘portion’ is the empty list then no loader or + location for a namespace package were found (i.e. failure to + find anything for the module). + + If *note find_spec(): 470. is defined then + backwards-compatible functionality is provided. + + Changed in version 3.4: Returns ‘(None, [])’ instead of + raising *note NotImplementedError: 9c7. Uses *note + find_spec(): 470. when available to provide functionality. + + Deprecated since version 3.4: Use *note find_spec(): 470. + instead. + + -- Method: find_module (fullname) + + A concrete implementation of *note Finder.find_module(): 46a. + which is equivalent to ‘self.find_loader(fullname)[0]’. + + Deprecated since version 3.4: Use *note find_spec(): 470. + instead. + + -- Method: invalidate_caches () + + An optional method which, when called, should invalidate any + internal cache used by the finder. Used by *note + importlib.machinery.PathFinder.invalidate_caches(): 879. when + invalidating the caches of all cached finders. + + -- Class: importlib.abc.Loader + + An abstract base class for a *note loader: 19ad. See PEP 302(3) + for the exact definition for a loader. + + Loaders that wish to support resource reading should implement a + ‘get_resource_reader()’ method as specified by *note + importlib.resources.abc.ResourceReader: 3cfe. + + Changed in version 3.7: Introduced the optional + ‘get_resource_reader()’ method. + + -- Method: create_module (spec) + + A method that returns the module object to use when importing + a module. This method may return ‘None’, indicating that + default module creation semantics should take place. + + New in version 3.4. + + Changed in version 3.6: This method is no longer optional when + *note exec_module(): 46c. is defined. + + -- 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 *note exec_module(): 46c. + is called. When this method exists, *note create_module(): + 91b. must be defined. + + New in version 3.4. + + Changed in version 3.6: *note create_module(): 91b. must also + be defined. + + -- Method: load_module (fullname) + + A legacy method for loading a module. If the module cannot be + loaded, *note ImportError: 511. is raised, otherwise the + loaded module is returned. + + If the requested module already exists in *note sys.modules: + 1382, that module should be used and reloaded. Otherwise the + loader should create a new module and insert it into *note + sys.modules: 1382. 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 + *note sys.modules: 1382.; modules already in *note + sys.modules: 1382. before the loader began execution should be + left alone (see *note importlib.util.module_for_loader(): + 2eb.). + + The loader should set several attributes on the module (note + that some of these attributes can change when a module is + reloaded): + + - + *note __name__: 1019. + + The module’s fully qualified name. It is + ‘'__main__'’ for an executed module. + + - + *note __file__: 1902. + + The location the *note loader: 19ad. used to load + the module. For example, for modules loaded from a + .py file this is the filename. It is not set on all + modules (e.g. built-in modules). + + - + *note __cached__: e69. + + The filename of a compiled version of the module’s + code. It is not set on all modules (e.g. built-in + modules). + + - + *note __path__: 16ba. + + The list of locations where the package’s submodules + will be found. Most of the time this is a single + directory. The import system passes this attribute + to ‘__import__()’ and to finders in the same way as + *note sys.path: 162. but just for the package. It + is not set on non-package modules so it can be used + as an indicator that the module is a package. + + - + *note __package__: cc9. + + The fully qualified name of the package the module + is in (or the empty string for a top-level module). + If the module is a package then this is the same as + *note __name__: 1019. + + - + *note __loader__: cca. + + The *note loader: 19ad. used to load the module. + + When *note exec_module(): 46c. is available then + backwards-compatible functionality is provided. + + Changed in version 3.4: Raise *note ImportError: 511. when + called instead of *note NotImplementedError: 9c7. + Functionality provided when *note exec_module(): 46c. is + available. + + Deprecated since version 3.4: The recommended API for loading + a module is *note exec_module(): 46c. (and *note + create_module(): 91b.). Loaders should implement it instead + of *note load_module(): 46b. The import machinery takes care + of all the other responsibilities of *note load_module(): 46b. + when *note exec_module(): 46c. is implemented. + + -- Method: module_repr (module) + + A legacy method which when implemented calculates and returns + the given module’s representation, as a string. The module + type’s default ‘__repr__()’ will use the result of this method + as appropriate. + + New in version 3.3. + + Changed in version 3.4: Made optional instead of an + abstractmethod. + + Deprecated since version 3.4: The import machinery now takes + care of this automatically. + + -- Class: importlib.abc.ResourceLoader + + An abstract base class for a *note loader: 19ad. which implements + the optional PEP 302(4) 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 *note + importlib.resources.abc.ResourceReader: 3cfe. + + -- Method: abstractmethod get_data (path) + + 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. *note + OSError: 413. is to be raised if the `path' cannot be found. + The `path' is expected to be constructed using a module’s + *note __file__: 1902. attribute or an item from a package’s + *note __path__: 16ba. + + Changed in version 3.4: Raises *note OSError: 413. instead of + *note NotImplementedError: 9c7. + + -- Class: importlib.abc.InspectLoader + + An abstract base class for a *note loader: 19ad. which implements + the optional PEP 302(5) protocol for loaders that inspect modules. + + -- Method: get_code (fullname) + + Return the code object for a module, or ‘None’ if the module + does not have a code object (as would be the case, for + example, for a built-in module). Raise an *note ImportError: + 511. if loader cannot find the requested module. + + Note: While the method has a default implementation, it + is suggested that it be overridden if possible for + performance. + + Changed in version 3.4: No longer abstract and a concrete + implementation is provided. + + -- Method: abstractmethod get_source (fullname) + + An abstract method to return the source of a module. It is + returned as a text string using *note universal newlines: 9ae, + translating all recognized line separators into ‘'\n'’ + characters. Returns ‘None’ if no source is available (e.g. a + built-in module). Raises *note ImportError: 511. if the + loader cannot find the module specified. + + Changed in version 3.4: Raises *note ImportError: 511. instead + of *note NotImplementedError: 9c7. + + -- Method: is_package (fullname) + + An optional method to return a true value if the module is a + package, a false value otherwise. *note ImportError: 511. is + raised if the *note loader: 19ad. cannot find the module. + + Changed in version 3.4: Raises *note ImportError: 511. instead + of *note NotImplementedError: 9c7. + + -- Method: static source_to_code (data, path='<string>') + + Create a code object from Python source. + + The `data' argument can be whatever the *note compile(): 310. + 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 ‘exec(code, module.__dict__)’. + + New in version 3.4. + + Changed in version 3.5: Made the method static. + + -- Method: exec_module (module) + + Implementation of *note Loader.exec_module(): 46c. + + New in version 3.4. + + -- Method: load_module (fullname) + + Implementation of *note Loader.load_module(): 46b. + + Deprecated since version 3.4: use *note exec_module(): cb9. + instead. + + -- Class: importlib.abc.ExecutionLoader + + An abstract base class which inherits from *note InspectLoader: + bee. that, when implemented, helps a module to be executed as a + script. The ABC represents an optional PEP 302(6) protocol. + + -- Method: abstractmethod get_filename (fullname) + + An abstract method that is to return the value of *note + __file__: 1902. for the specified module. If no path is + available, *note ImportError: 511. 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 *note ImportError: 511. instead + of *note NotImplementedError: 9c7. + + -- Class: importlib.abc.FileLoader (fullname, path) + + An abstract base class which inherits from *note ResourceLoader: + 84e. and *note ExecutionLoader: 3d00, providing concrete + implementations of *note ResourceLoader.get_data(): 3cea. and *note + ExecutionLoader.get_filename(): 3d01. + + 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. + + New in version 3.3. + + -- Attribute: name + + The name of the module the loader can handle. + + -- Attribute: path + + Path to the file of the module. + + -- Method: load_module (fullname) + + Calls super’s ‘load_module()’. + + Deprecated since version 3.4: Use *note Loader.exec_module(): + 46c. instead. + + -- Method: abstractmethod get_filename (fullname) + + Returns *note path: 3d03. + + -- Method: abstractmethod get_data (path) + + Reads `path' as a binary file and returns the bytes from it. + + -- Class: importlib.abc.SourceLoader + + An abstract base class for implementing source (and optionally + bytecode) file loading. The class inherits from both *note + ResourceLoader: 84e. and *note ExecutionLoader: 3d00, requiring the + implementation of: + + * *note ResourceLoader.get_data(): 3cea. + + * + *note ExecutionLoader.get_filename(): 3d01. + + Should only return the path to the source file; + sourceless loading is not supported. + + The abstract methods defined by this class are to add optional + bytecode file support. Not implementing these optional methods (or + causing them to raise *note NotImplementedError: 9c7.) 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. + + -- Method: path_stats (path) + + Optional abstract method which returns a *note dict: 16e. + containing metadata about the specified path. Supported + dictionary keys are: + + - ‘'mtime'’ (mandatory): an integer or floating-point + number representing the modification time of the source + code; + + - ‘'size'’ (optional): the size in bytes of the source + code. + + Any other keys in the dictionary are ignored, to allow for + future extensions. If the path cannot be handled, *note + OSError: 413. is raised. + + New in version 3.3. + + Changed in version 3.4: Raise *note OSError: 413. instead of + *note NotImplementedError: 9c7. + + -- 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 *note path_stats(): e3f. You don’t have to + implement it, but it is still available for compatibility + purposes. Raise *note OSError: 413. if the path cannot be + handled. + + Changed in version 3.4: Raise *note OSError: 413. instead of + *note NotImplementedError: 9c7. + + -- 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 + (*note errno.EACCES: 1d06./*note PermissionError: 9b9.), do + not propagate the exception. + + Changed in version 3.4: No longer raises *note + NotImplementedError: 9c7. when called. + + -- Method: get_code (fullname) + + Concrete implementation of *note InspectLoader.get_code(): + bef. + + -- Method: exec_module (module) + + Concrete implementation of *note Loader.exec_module(): 46c. + + New in version 3.4. + + -- Method: load_module (fullname) + + Concrete implementation of *note Loader.load_module(): 46b. + + Deprecated since version 3.4: Use *note exec_module(): cba. + instead. + + -- Method: get_source (fullname) + + Concrete implementation of *note InspectLoader.get_source(): + bf3. + + -- Method: is_package (fullname) + + Concrete implementation of *note InspectLoader.is_package(): + 3cff. A module is determined to be a package if its file path + (as provided by *note ExecutionLoader.get_filename(): 3d01.) + is a file named ‘__init__’ when the file extension is removed + `and' the module name itself does not end in ‘__init__’. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/importlib/abc.py + + (2) https://peps.python.org/pep-0302/ + + (3) https://peps.python.org/pep-0302/ + + (4) https://peps.python.org/pep-0302/ + + (5) https://peps.python.org/pep-0302/ + + (6) https://peps.python.org/pep-0302/ + + +File: python.info, Node: importlib machinery – Importers and path hooks, Next: importlib util – Utility code for importers, Prev: importlib abc – Abstract base classes related to import, Up: importlib — The implementation of import + +5.31.5.4 ‘importlib.machinery’ – Importers and path hooks +......................................................... + +`Source code:' Lib/importlib/machinery.py(1) + +__________________________________________________________________ + +This module contains the various objects that help *note import: 1af. +find and load modules. + + -- Attribute: importlib.machinery.SOURCE_SUFFIXES + + A list of strings representing the recognized file suffixes for + source modules. + + New in version 3.3. + + -- Attribute: importlib.machinery.DEBUG_BYTECODE_SUFFIXES + + A list of strings representing the file suffixes for non-optimized + bytecode modules. + + New in version 3.3. + + Deprecated since version 3.5: Use *note BYTECODE_SUFFIXES: 3d0d. + instead. + + -- Attribute: importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES + + A list of strings representing the file suffixes for optimized + bytecode modules. + + New in version 3.3. + + Deprecated since version 3.5: Use *note BYTECODE_SUFFIXES: 3d0d. + instead. + + -- Attribute: importlib.machinery.BYTECODE_SUFFIXES + + A list of strings representing the recognized file suffixes for + bytecode modules (including the leading dot). + + New in version 3.3. + + Changed in version 3.5: The value is no longer dependent on + ‘__debug__’. + + -- Attribute: importlib.machinery.EXTENSION_SUFFIXES + + A list of strings representing the recognized file suffixes for + extension modules. + + New in version 3.3. + + -- 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, *note inspect.getmodulename(): 9ac.). + + New in version 3.3. + + -- Class: importlib.machinery.BuiltinImporter + + An *note importer: 19ae. for built-in modules. All known built-in + modules are listed in *note sys.builtin_module_names: 16ac. This + class implements the *note importlib.abc.MetaPathFinder: 473. and + *note importlib.abc.InspectLoader: bee. ABCs. + + Only class methods are defined by this class to alleviate the need + for instantiation. + + Changed in version 3.5: As part of PEP 489(2), the builtin importer + now implements ‘Loader.create_module()’ and ‘Loader.exec_module()’ + + -- Class: importlib.machinery.FrozenImporter + + An *note importer: 19ae. for frozen modules. This class implements + the *note importlib.abc.MetaPathFinder: 473. and *note + importlib.abc.InspectLoader: bee. ABCs. + + Only class methods are defined by this class to alleviate the need + for instantiation. + + Changed in version 3.4: Gained ‘create_module()’ and + ‘exec_module()’ methods. + + -- Class: importlib.machinery.WindowsRegistryFinder + + *note Finder: 19ac. for modules declared in the Windows registry. + This class implements the *note importlib.abc.MetaPathFinder: 473. + ABC. + + Only class methods are defined by this class to alleviate the need + for instantiation. + + New in version 3.3. + + Deprecated since version 3.6: Use *note site: e8. configuration + instead. Future versions of Python may not enable this finder by + default. + + -- Class: importlib.machinery.PathFinder + + A *note Finder: 19ac. for *note sys.path: 162. and package + ‘__path__’ attributes. This class implements the *note + importlib.abc.MetaPathFinder: 473. ABC. + + Only class methods are defined by this class to alleviate the need + for instantiation. + + -- Method: classmethod find_spec (fullname, path=None, + target=None) + + Class method that attempts to find a *note spec: 3bcf. for the + module specified by `fullname' on *note sys.path: 162. or, if + defined, on `path'. For each path entry that is searched, + *note sys.path_importer_cache: 1b2. is checked. If a + non-false object is found then it is used as the *note path + entry finder: d20. to look for the module being searched for. + If no entry is found in *note sys.path_importer_cache: 1b2, + then *note sys.path_hooks: cd0. is searched for a finder for + the path entry and, if found, is stored in *note + sys.path_importer_cache: 1b2. along with being queried about + the module. If no finder is ever found then ‘None’ is both + stored in the cache and returned. + + New in version 3.4. + + Changed in version 3.5: If the current working directory – + represented by an empty string – is no longer valid then + ‘None’ is returned but no value is cached in *note + sys.path_importer_cache: 1b2. + + -- Method: classmethod find_module (fullname, path=None) + + A legacy wrapper around *note find_spec(): cb5. + + Deprecated since version 3.4: Use *note find_spec(): cb5. + instead. + + -- Method: classmethod invalidate_caches () + + Calls *note importlib.abc.PathEntryFinder.invalidate_caches(): + 3cfd. on all finders stored in *note sys.path_importer_cache: + 1b2. that define the method. Otherwise entries in *note + sys.path_importer_cache: 1b2. set to ‘None’ are deleted. + + Changed in version 3.7: Entries of ‘None’ in *note + sys.path_importer_cache: 1b2. are deleted. + + Changed in version 3.4: Calls objects in *note sys.path_hooks: cd0. + with the current working directory for ‘''’ (i.e. the empty + string). + + -- Class: importlib.machinery.FileFinder (path, *loader_details) + + A concrete implementation of *note importlib.abc.PathEntryFinder: + 474. 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 *note importlib.invalidate_caches(): 87a. + + New in version 3.3. + + -- Attribute: path + + The path the finder will search in. + + -- Method: find_spec (fullname, target=None) + + Attempt to find the spec to handle `fullname' within *note + path: 3d10. + + New in version 3.4. + + -- Method: find_loader (fullname) + + Attempt to find the loader to handle `fullname' within *note + path: 3d10. + + Deprecated since version 3.10: Use *note find_spec(): b54. + instead. + + -- Method: invalidate_caches () + + Clear out the internal cache. + + -- Method: classmethod path_hook (*loader_details) + + A class method which returns a closure for use on *note + sys.path_hooks: cd0. An instance of *note FileFinder: d21. 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, + *note ImportError: 511. is raised. + + -- Class: importlib.machinery.SourceFileLoader (fullname, path) + + A concrete implementation of *note importlib.abc.SourceLoader: + 3d06. by subclassing *note importlib.abc.FileLoader: d22. and + providing some concrete implementations of other methods. + + New in version 3.3. + + -- Attribute: name + + The name of the module that this loader will handle. + + -- Attribute: path + + The path to the source file. + + -- Method: is_package (fullname) + + Return ‘True’ if *note path: 3d14. appears to be for a + package. + + -- Method: path_stats (path) + + Concrete implementation of *note + importlib.abc.SourceLoader.path_stats(): e3f. + + -- Method: set_data (path, data) + + Concrete implementation of *note + importlib.abc.SourceLoader.set_data(): 3d07. + + -- Method: load_module (name=None) + + Concrete implementation of *note + importlib.abc.Loader.load_module(): 46b. where specifying the + name of the module to load is optional. + + Deprecated since version 3.6: Use *note + importlib.abc.Loader.exec_module(): 46c. instead. + + -- Class: importlib.machinery.SourcelessFileLoader (fullname, path) + + A concrete implementation of *note importlib.abc.FileLoader: d22. + 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. + + New in version 3.3. + + -- Attribute: name + + The name of the module the loader will handle. + + -- Attribute: path + + The path to the bytecode file. + + -- Method: is_package (fullname) + + Determines if the module is a package based on *note path: + 3d19. + + -- Method: get_code (fullname) + + Returns the code object for *note name: 3d18. created from + *note path: 3d19. + + -- Method: get_source (fullname) + + Returns ‘None’ as bytecode files have no source when this + loader is used. + + -- Method: load_module (name=None) + + Concrete implementation of *note + importlib.abc.Loader.load_module(): 46b. where specifying the name + of the module to load is optional. + + Deprecated since version 3.6: Use *note + importlib.abc.Loader.exec_module(): 46c. instead. + + -- Class: importlib.machinery.ExtensionFileLoader (fullname, path) + + A concrete implementation of *note importlib.abc.ExecutionLoader: + 3d00. 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. + + New in version 3.3. + + -- Attribute: name + + Name of the module the loader supports. + + -- Attribute: path + + Path to the extension module. + + -- Method: create_module (spec) + + Creates the module object from the given specification in + accordance with PEP 489(3). + + New in version 3.5. + + -- Method: exec_module (module) + + Initializes the given module object in accordance with PEP + 489(4). + + New in version 3.5. + + -- Method: is_package (fullname) + + Returns ‘True’ if the file path points to a package’s + ‘__init__’ module based on *note EXTENSION_SUFFIXES: 3d0f. + + -- Method: get_code (fullname) + + Returns ‘None’ as extension modules lack a code object. + + -- Method: get_source (fullname) + + Returns ‘None’ as extension modules do not have source code. + + -- Method: get_filename (fullname) + + Returns *note path: 3d1e. + + New in version 3.4. + + -- Class: NamespaceLoader(name, path, path_finder): + + A concrete implementation of *note importlib.abc.InspectLoader: + bee. for namespace packages. This is an alias for a private class + and is only made public for introspecting the ‘__loader__’ + attribute on namespace packages: + + >>> 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 + + New in version 3.11. + + -- 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 *note __spec__: 19bd. + attribute. In the descriptions below, the names in parentheses + give the corresponding attribute available directly on the module + object, e.g. ‘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 *note __file__: + 1902. at runtime and this will not be automatically reflected in + the module’s ‘__spec__.origin’, and vice versa. + + New in version 3.4. + + -- Attribute: name + + (*note __name__: 1019.) + + The module’s fully qualified name. The *note finder: 19ac. should + always set this attribute to a non-empty string. + + -- Attribute: loader + + (*note __loader__: cca.) + + The *note loader: 19ad. used to load the module. The *note finder: + 19ac. should always set this attribute. + + -- Attribute: origin + + (*note __file__: 1902.) + + The location the *note loader: 19ad. should use to load the module. + For example, for modules loaded from a .py file this is the + filename. The *note finder: 19ac. should always set this attribute + to a meaningful value for the *note loader: 19ad. to use. In the + uncommon case that there is not one (like for namespace packages), + it should be set to ‘None’. + + -- Attribute: submodule_search_locations + + (*note __path__: 16ba.) + + The list of locations where the package’s submodules will be found. + Most of the time this is a single directory. The *note finder: + 19ac. should set this attribute to a list, even an empty one, to + indicate to the import system that the module is a package. It + should be set to ‘None’ for non-package modules. It is set + automatically later to a special object for namespace packages. + + -- Attribute: loader_state + + The *note finder: 19ac. may set this attribute to an object + containing additional, module-specific data to use when loading the + module. Otherwise it should be set to ‘None’. + + -- Attribute: cached + + (*note __cached__: e69.) + + The filename of a compiled version of the module’s code. The *note + finder: 19ac. should always set this attribute but it may be ‘None’ + for modules that do not need compiled code stored. + + -- Attribute: parent + + (*note __package__: cc9.) + + (Read-only) The fully qualified name of the package the module is + in (or the empty string for a top-level module). If the module is + a package then this is the same as *note name: 1fb9. + + -- Attribute: has_location + + ‘True’ if the spec’s *note origin: 3d24. refers to a loadable location, + + ‘False’ otherwise. This value impacts how *note origin: 3d24. + is interpreted and how the module’s *note __file__: 1902. is + populated. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/importlib/machinery.py + + (2) https://peps.python.org/pep-0489/ + + (3) https://peps.python.org/pep-0489/ + + (4) https://peps.python.org/pep-0489/ + + +File: python.info, Node: importlib util – Utility code for importers, Next: Examples<33>, Prev: importlib machinery – Importers and path hooks, Up: importlib — The implementation of import + +5.31.5.5 ‘importlib.util’ – Utility code for importers +...................................................... + +`Source code:' Lib/importlib/util.py(1) + +__________________________________________________________________ + +This module contains the various objects that help in the construction +of an *note importer: 19ae. + + -- Attribute: importlib.util.MAGIC_NUMBER + + The bytes which represent the bytecode version number. If you need + help with loading/writing bytecode then consider *note + importlib.abc.SourceLoader: 3d06. + + New in version 3.4. + + -- Function: importlib.util.cache_from_source (path, + debug_override=None, *, optimization=None) + + Return the PEP 3147(2)/ PEP 488(3) path to the byte-compiled file + associated with the source `path'. For example, if `path' is + ‘/foo/bar/baz.py’ the return value would be + ‘/foo/bar/__pycache__/baz.cpython-32.pyc’ for Python 3.2. The + ‘cpython-32’ string comes from the current magic tag (see + ‘get_tag()’; if ‘sys.implementation.cache_tag’ is not defined then + *note NotImplementedError: 9c7. will be raised). + + The `optimization' parameter is used to specify the optimization + level of the bytecode file. An empty string represents no + optimization, so ‘/foo/bar/baz.py’ with an `optimization' of ‘''’ + will result in a bytecode path of + ‘/foo/bar/__pycache__/baz.cpython-32.pyc’. ‘None’ causes the + interpreter’s optimization level to be used. Any other value’s + string representation is used, so ‘/foo/bar/baz.py’ with an + `optimization' of ‘2’ will lead to the bytecode path of + ‘/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc’. The string + representation of `optimization' can only be alphanumeric, else + *note ValueError: 1c8. is raised. + + The `debug_override' parameter is deprecated and can be used to + override the system’s value for ‘__debug__’. A ‘True’ value is the + equivalent of setting `optimization' to the empty string. A + ‘False’ value is the same as setting `optimization' to ‘1’. If + both `debug_override' an `optimization' are not ‘None’ then *note + TypeError: 19c. is raised. + + New 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 *note path-like object: 773. + + -- Function: importlib.util.source_from_cache (path) + + Given the `path' to a PEP 3147(4) file name, return the associated + source code file path. For example, if `path' is + ‘/foo/bar/__pycache__/baz.cpython-32.pyc’ the returned path would + be ‘/foo/bar/baz.py’. `path' need not exist, however if it does + not conform to PEP 3147(5) or PEP 488(6) format, a *note + ValueError: 1c8. is raised. If ‘sys.implementation.cache_tag’ is + not defined, *note NotImplementedError: 9c7. is raised. + + New in version 3.4. + + Changed in version 3.6: Accepts a *note path-like object: 773. + + -- 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 *note + importlib.abc.InspectLoader.get_source(): bf3.). + + New in version 3.4. + + -- 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 ‘importlib.util.resolve_name('sys', + __spec__.parent)’ without doing a check to see if the `package' + argument is needed. + + *note ImportError: 511. is raised if `name' is a relative module + name but `package' is a false value (e.g. ‘None’ or the empty + string). *note ImportError: 511. is also raised if a relative name + would escape its containing package (e.g. requesting ‘..bacon’ + from within the ‘spam’ package). + + New in version 3.3. + + Changed in version 3.9: To improve consistency with import + statements, raise *note ImportError: 511. instead of *note + ValueError: 1c8. for invalid relative import attempts. + + -- Function: importlib.util.find_spec (name, package=None) + + Find the *note spec: 3bcf. for a module, optionally relative to the + specified `package' name. If the module is in *note sys.modules: + 1382, then ‘sys.modules[name].__spec__’ is returned (unless the + spec would be ‘None’ or is not set, in which case *note ValueError: + 1c8. is raised). Otherwise a search using *note sys.meta_path: + 9a0. is done. ‘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 ‘import_module()’. + + New in version 3.4. + + Changed in version 3.7: Raises *note ModuleNotFoundError: 79e. + instead of *note AttributeError: 19d. if `package' is in fact not a + package (i.e. lacks a *note __path__: 16ba. attribute). + + -- Function: importlib.util.module_from_spec (spec) + + Create a new module based on `spec' and *note + spec.loader.create_module: 91b. + + If *note spec.loader.create_module: 91b. does not return ‘None’, + then any pre-existing attributes will not be reset. Also, no *note + AttributeError: 19d. will be raised if triggered while accessing + `spec' or setting an attribute on the module. + + This function is preferred over using *note types.ModuleType: a95. + to create a new module as `spec' is used to set as many + import-controlled attributes on the module as possible. + + New in version 3.5. + + -- Function: @importlib.util.module_for_loader + + A *note decorator: 2f8. for *note + importlib.abc.Loader.load_module(): 46b. to handle selecting the + proper module object to load with. The decorated method is + expected to have a call signature taking two positional arguments + (e.g. ‘load_module(self, module)’) for which the second argument + will be the module `object' to be used by the loader. Note that + the decorator will not work on static methods because of the + assumption of two arguments. + + The decorated method will take in the `name' of the module to be + loaded as expected for a *note loader: 19ad. If the module is not + found in *note sys.modules: 1382. then a new one is constructed. + Regardless of where the module came from, *note __loader__: cca. + set to `self' and *note __package__: cc9. is set based on what + *note importlib.abc.InspectLoader.is_package(): 3cff. returns (if + available). These attributes are set unconditionally to support + reloading. + + If an exception is raised by the decorated method and a module was + added to *note sys.modules: 1382, then the module will be removed + to prevent a partially initialized module from being in left in + *note sys.modules: 1382. If the module was already in *note + sys.modules: 1382. then it is left alone. + + Changed in version 3.3: *note __loader__: cca. and *note + __package__: cc9. are automatically set (when possible). + + Changed in version 3.4: Set *note __name__: 1019, *note __loader__: + cca. *note __package__: cc9. unconditionally to support reloading. + + Deprecated since version 3.4: The import machinery now directly + performs all the functionality provided by this function. + + -- Function: @importlib.util.set_loader + + A *note decorator: 2f8. for *note + importlib.abc.Loader.load_module(): 46b. to set the *note + __loader__: cca. attribute on the returned module. If the + attribute is already set the decorator does nothing. It is assumed + that the first positional argument to the wrapped method (i.e. + ‘self’) is what *note __loader__: cca. should be set to. + + Changed in version 3.4: Set ‘__loader__’ if set to ‘None’, as if + the attribute does not exist. + + Deprecated since version 3.4: The import machinery takes care of + this automatically. + + -- Function: @importlib.util.set_package + + A *note decorator: 2f8. for *note + importlib.abc.Loader.load_module(): 46b. to set the *note + __package__: cc9. attribute on the returned module. If *note + __package__: cc9. is set and has a value other than ‘None’ it will + not be changed. + + Deprecated since version 3.4: The import machinery takes care of + this automatically. + + -- Function: importlib.util.spec_from_loader (name, loader, *, + origin=None, is_package=None) + + A factory function for creating a *note ModuleSpec: 19b8. instance + based on a loader. The parameters have the same meaning as they do + for ModuleSpec. The function uses available *note loader: 19ad. + APIs, such as ‘InspectLoader.is_package()’, to fill in any missing + information on the spec. + + New in version 3.4. + + -- Function: importlib.util.spec_from_file_location (name, location, *, + loader=None, submodule_search_locations=None) + + A factory function for creating a *note ModuleSpec: 19b8. 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. + + New in version 3.4. + + Changed in version 3.6: Accepts a *note path-like object: 773. + + -- Function: importlib.util.source_hash (source_bytes) + + Return the hash of `source_bytes' as bytes. A hash-based ‘.pyc’ + file embeds the *note source_hash(): 3d2a. of the corresponding + source file’s contents in its header. + + New in version 3.7. + + -- 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 *note + exec_module(): 46c. as control over what module type is used for + the module is required. For those same reasons, the loader’s *note + create_module(): 91b. method must return ‘None’ or a type for which + its ‘__class__’ attribute can be mutated along with not using *note + slots: 1ac. Finally, modules which substitute the object placed + into *note sys.modules: 1382. will not work as there is no way to + properly replace the module references throughout the interpreter + safely; *note ValueError: 1c8. is raised if such a substitution is + detected. + + 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. + + New in version 3.5. + + Changed in version 3.6: Began calling *note create_module(): 91b, + removing the compatibility warning for *note + importlib.machinery.BuiltinImporter: 91c. and *note + importlib.machinery.ExtensionFileLoader: 91d. + + -- Method: classmethod factory (loader) + + A static 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. + + suffixes = importlib.machinery.SOURCE_SUFFIXES + loader = importlib.machinery.SourceFileLoader + lazy_loader = importlib.util.LazyLoader.factory(loader) + finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes)) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/importlib/util.py + + (2) https://peps.python.org/pep-3147/ + + (3) https://peps.python.org/pep-0488/ + + (4) https://peps.python.org/pep-3147/ + + (5) https://peps.python.org/pep-3147/ + + (6) https://peps.python.org/pep-0488/ + + +File: python.info, Node: Examples<33>, Prev: importlib util – Utility code for importers, Up: importlib — The implementation of import + +5.31.5.6 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. + + +File: python.info, Node: Importing programmatically, Next: Checking if a module can be imported, Up: Examples<33> + +5.31.5.7 Importing programmatically +................................... + +To programmatically import a module, use *note +importlib.import_module(): e4d. + + import importlib + + itertools = importlib.import_module('itertools') + + +File: python.info, Node: Checking if a module can be imported, Next: Importing a source file directly, Prev: Importing programmatically, Up: Examples<33> + +5.31.5.8 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 *note importlib.util.find_spec(): +cb4. + +Note that if ‘name’ is a submodule (contains a dot), *note +importlib.util.find_spec(): cb4. will import the parent module. + + 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") + + +File: python.info, Node: Importing a source file directly, Next: Implementing lazy imports, Prev: Checking if a module can be imported, Up: Examples<33> + +5.31.5.9 Importing a source file directly +......................................... + +To import a Python source file directly, use the following recipe: + + import importlib.util + import sys + + # For illustrative purposes. + import tokenize + file_path = tokenize.__file__ + module_name = tokenize.__name__ + + 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) + + +File: python.info, Node: Implementing lazy imports, Next: Setting up an importer, Prev: Importing a source file directly, Up: Examples<33> + +5.31.5.10 Implementing lazy imports +................................... + +The example below shows how to implement lazy imports: + + >>> 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 + + +File: python.info, Node: Setting up an importer, Next: Approximating importlib import_module, Prev: Implementing lazy imports, Up: Examples<33> + +5.31.5.11 Setting up an importer +................................ + +For deep customizations of import, you typically want to implement an +*note importer: 19ae. This means managing both the *note finder: 19ac. +and *note loader: 19ad. side of things. For finders there are two +flavours to choose from depending on your needs: a *note meta path +finder: d1f. or a *note path entry finder: d20. The former is what you +would put on *note sys.meta_path: 9a0. while the latter is what you +create using a *note path entry hook: 19cb. on *note sys.path_hooks: +cd0. which works with *note sys.path: 162. 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): + + 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)) + + +File: python.info, Node: Approximating importlib import_module, Prev: Setting up an importer, Up: Examples<33> + +5.31.5.12 Approximating ‘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 *note importlib.import_module(): e4d.: + + 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 + + +File: python.info, Node: importlib resources – Resources, Next: Deprecated functions, Prev: importlib — The implementation of import, Up: Importing Modules + +5.31.6 ‘importlib.resources’ – Resources +---------------------------------------- + +`Source code:' Lib/importlib/resources/__init__.py(1) + +__________________________________________________________________ + +New in version 3.7. + +This module leverages Python’s import system to provide access to +`resources' within `packages'. If you can import a package, you can +access resources within that package. 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 *note zipimport: 14e. + + Note: This module provides functionality similar to + pkg_resources(2) Basic Resource Access(3) without the performance + overhead of that package. This makes reading resources included in + packages easier, with more stable and consistent semantics. + + The standalone backport of this module provides more information on + using importlib.resources(4) and migrating from pkg_resources to + importlib.resources(5). + +*note Loaders: b55. that wish to support resource reading should +implement a ‘get_resource_reader(fullname)’ method as specified by *note +importlib.resources.abc.ResourceReader: 3cfe. + + -- Data: importlib.resources.Package + + Whenever a function accepts a ‘Package’ argument, you can pass in + either a *note module object: a95. or a module name as a string. + You can only pass module objects whose + ‘__spec__.submodule_search_locations’ is not ‘None’. + + The ‘Package’ type is defined as ‘Union[str, ModuleType]’. + + -- Function: importlib.resources.files (package) + + Returns a *note Traversable: 3d37. object representing the resource + container for the package (think directory) and its resources + (think files). A Traversable may contain other containers (think + subdirectories). + + `package' is either a name or a module object which conforms to the + *note Package: 3d36. requirements. + + New in version 3.9. + + -- Function: importlib.resources.as_file (traversable) + + Given a *note Traversable: 3d37. object representing a file, + typically from *note importlib.resources.files(): 54e, return a + context manager for use in a *note with: 19e. statement. The + context manager provides a *note pathlib.Path: 65f. object. + + Exiting the context manager cleans up any temporary file created + when the resource was extracted from e.g. a zip file. + + Use ‘as_file’ when the Traversable methods (‘read_text’, etc) are + insufficient and an actual file on the file system is required. + + New in version 3.9. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/importlib/resources/__init__.py + + (2) https://setuptools.readthedocs.io/en/latest/pkg_resources.html + + (3) +https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + (4) https://importlib-resources.readthedocs.io/en/latest/using.html + + (5) +https://importlib-resources.readthedocs.io/en/latest/migration.html + + +File: python.info, Node: Deprecated functions, Next: importlib resources abc – Abstract base classes for resources, Prev: importlib resources – Resources, Up: Importing Modules + +5.31.7 Deprecated functions +--------------------------- + +An older, deprecated set of functions is still available, but is +scheduled for removal in a future version of Python. The main drawback +of these functions is that they do not support directories: they assume +all resources are located directly within a `package'. + + -- Data: importlib.resources.Resource + + For `resource' arguments of the functions below, you can pass in + the name of a resource as a string or a *note path-like object: + 8bf. + + The ‘Resource’ type is defined as ‘Union[str, os.PathLike]’. + + -- Function: importlib.resources.open_binary (package, resource) + + Open for binary reading the `resource' within `package'. + + `package' is either a name or a module object which conforms to the + ‘Package’ requirements. `resource' is the name of the resource to + open within `package'; it may not contain path separators and it + may not have sub-resources (i.e. it cannot be a directory). This + function returns a ‘typing.BinaryIO’ instance, a binary I/O stream + open for reading. + + Deprecated since version 3.11: Calls to this function can be + replaced by: + + files(package).joinpath(resource).open('rb') + + -- Function: importlib.resources.open_text (package, resource, + encoding='utf-8', errors='strict') + + Open for text reading the `resource' within `package'. By default, + the resource is opened for reading as UTF-8. + + `package' is either a name or a module object which conforms to the + ‘Package’ requirements. `resource' is the name of the resource to + open within `package'; it may not contain path separators and it + may not have sub-resources (i.e. it cannot be a directory). + `encoding' and `errors' have the same meaning as with built-in + *note open(): 30b. + + This function returns a ‘typing.TextIO’ instance, a text I/O stream + open for reading. + + Deprecated since version 3.11: Calls to this function can be + replaced by: + + files(package).joinpath(resource).open('r', encoding=encoding) + + -- Function: importlib.resources.read_binary (package, resource) + + Read and return the contents of the `resource' within `package' as + ‘bytes’. + + `package' is either a name or a module object which conforms to the + ‘Package’ requirements. `resource' is the name of the resource to + open within `package'; it may not contain path separators and it + may not have sub-resources (i.e. it cannot be a directory). This + function returns the contents of the resource as *note bytes: 1b4. + + Deprecated since version 3.11: Calls to this function can be + replaced by: + + files(package).joinpath(resource).read_bytes() + + -- Function: importlib.resources.read_text (package, resource, + encoding='utf-8', errors='strict') + + Read and return the contents of `resource' within `package' as a + ‘str’. By default, the contents are read as strict UTF-8. + + `package' is either a name or a module object which conforms to the + ‘Package’ requirements. `resource' is the name of the resource to + open within `package'; it may not contain path separators and it + may not have sub-resources (i.e. it cannot be a directory). + `encoding' and `errors' have the same meaning as with built-in + *note open(): 30b. This function returns the contents of the + resource as *note str: 1b3. + + Deprecated since version 3.11: Calls to this function can be + replaced by: + + files(package).joinpath(resource).read_text(encoding=encoding) + + -- Function: importlib.resources.path (package, resource) + + Return the path to the `resource' as an actual file system path. + This function returns a context manager for use in a *note with: + 19e. statement. The context manager provides a *note pathlib.Path: + 65f. object. + + Exiting the context manager cleans up any temporary file created + when the resource needs to be extracted from e.g. a zip file. + + `package' is either a name or a module object which conforms to the + ‘Package’ requirements. `resource' is the name of the resource to + open within `package'; it may not contain path separators and it + may not have sub-resources (i.e. it cannot be a directory). + + Deprecated since version 3.11: Calls to this function can be + replaced using *note as_file(): 11b9.: + + as_file(files(package).joinpath(resource)) + + -- Function: importlib.resources.is_resource (package, name) + + Return ‘True’ if there is a resource named `name' in the package, + otherwise ‘False’. This function does not consider directories to + be resources. `package' is either a name or a module object which + conforms to the ‘Package’ requirements. + + Deprecated since version 3.11: Calls to this function can be + replaced by: + + files(package).joinpath(resource).is_file() + + -- Function: importlib.resources.contents (package) + + Return an iterable over the named items within the package. The + iterable returns *note str: 1b3. resources (e.g. files) and + non-resources (e.g. directories). The iterable does not recurse + into subdirectories. + + `package' is either a name or a module object which conforms to the + ‘Package’ requirements. + + Deprecated since version 3.11: Calls to this function can be + replaced by: + + (resource.name for resource in files(package).iterdir() if resource.is_file()) + + +File: python.info, Node: importlib resources abc – Abstract base classes for resources, Next: Using importlib metadata, Prev: Deprecated functions, Up: Importing Modules + +5.31.8 ‘importlib.resources.abc’ – Abstract base classes for resources +---------------------------------------------------------------------- + +`Source code:' Lib/importlib/resources/abc.py(1) + +__________________________________________________________________ + +New in version 3.11. + + -- Class: importlib.resources.abc.ResourceReader + + `Superseded by TraversableResources' + + An *note abstract base class: e6a. 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 ‘__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 in a e.g. zip file versus + on the file system. + + For any of methods of this class, a `resource' argument is expected + to be a *note path-like object: 773. 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 ‘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 + *note None: 243. An object compatible with this ABC should only be + returned when the specified module is a package. + + New in version 3.7. + + -- Method: abstractmethod open_resource (resource) + + Returns an opened, *note file-like object: 1fcb. for binary + reading of the `resource'. + + If the resource cannot be found, *note FileNotFoundError: b53. + is raised. + + -- 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 *note FileNotFoundError: b53. + + -- Method: abstractmethod is_resource (name) + + Returns ‘True’ if the named `name' is considered a resource. + *note FileNotFoundError: b53. is raised if `name' does not + exist. + + -- Method: abstractmethod contents () + + Returns an *note iterable: ed9. 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 *note is_resource(): + 3d43. 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. + + -- Class: importlib.resources.abc.Traversable + + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + + New in version 3.9. + + -- Attribute: name + + Abstract. The base name of this object without any parent + references. + + -- Method: abstractmethod iterdir () + + Yield Traversable objects in self. + + -- Method: abstractmethod is_dir () + + Return True if self is a directory. + + -- Method: abstractmethod is_file () + + Return True if self is a file. + + -- Method: abstractmethod joinpath (child) + + Return Traversable child in self. + + -- Method: abstractmethod __truediv__ (child) + + Return Traversable child in self. + + -- 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 *note pathlib.Path.open: + 21e8.). + + When opening as text, accepts encoding parameters such as + those accepted by *note io.TextIOWrapper: 9ad. + + -- Method: read_bytes () + + Read contents of self as bytes. + + -- Method: read_text (encoding=None) + + Read contents of self as text. + + -- Class: importlib.resources.abc.TraversableResources + + An abstract base class for resource readers capable of serving the + *note importlib.resources.files(): 54e. interface. Subclasses + *note importlib.resources.abc.ResourceReader: 3cfe. and provides + concrete implementations of the *note + importlib.resources.abc.ResourceReader: 3cfe.’s abstract methods. + Therefore, any loader supplying ‘importlib.abc.TraversableReader’ + also supplies ResourceReader. + + Loaders that wish to support resource reading are expected to + implement this interface. + + New in version 3.9. + + -- Method: abstractmethod files () + + Returns a *note importlib.resources.abc.Traversable: 3d37. + object for the loaded package. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/importlib/resources/abc.py + + +File: python.info, Node: Using importlib metadata, Next: The initialization of the sys path module search path, Prev: importlib resources abc – Abstract base classes for resources, Up: Importing Modules + +5.31.9 Using ‘importlib.metadata’ +--------------------------------- + +New in version 3.8. + +Changed in version 3.10: ‘importlib.metadata’ is no longer provisional. + +`Source code:' Lib/importlib/metadata/__init__.py(1) + +‘importlib.metadata’ is a library that provides for access to installed +package metadata. Built in part on Python’s import system, this library +intends to replace similar functionality in the entry point API(2) and +metadata API(3) of ‘pkg_resources’. Along with *note +importlib.resources: 9b. (with new features backported to the +importlib_resources(4) package), this can eliminate the need to use the +older and less efficient ‘pkg_resources’ package. + +By “installed package” we generally mean a third-party package installed +into Python’s ‘site-packages’ directory via tools such as pip(5). +Specifically, it means a package with either a discoverable ‘dist-info’ +or ‘egg-info’ directory, and metadata defined by PEP 566(6) or its older +specifications. By default, package metadata can live on the file +system or in zip archives on *note sys.path: 162. Through an extension +mechanism, the metadata can live almost anywhere. + +* Menu: + +* Overview: Overview<3>. +* Functional API:: +* Distributions:: +* Extending the search algorithm:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/importlib/metadata/__init__.py + + (2) +https://setuptools.readthedocs.io/en/latest/pkg_resources.html#entry-points + + (3) +https://setuptools.readthedocs.io/en/latest/pkg_resources.html#metadata-api + + (4) https://importlib-resources.readthedocs.io/en/latest/index.html + + (5) https://pypi.org/project/pip/ + + (6) https://peps.python.org/pep-0566/ + + +File: python.info, Node: Overview<3>, Next: Functional API, Up: Using importlib metadata + +5.31.9.1 Overview +................. + +Let’s say you wanted to get the version string for a package you’ve +installed using ‘pip’. We start by creating a virtual environment and +installing something into it: + + $ python3 -m venv example + $ source example/bin/activate + (example) $ python -m pip install wheel + +You can get the version string for ‘wheel’ by running the following: + + (example) $ python + >>> from importlib.metadata import version + >>> version('wheel') + '0.32.3' + +You can also get the set of entry points keyed by group, such as +‘console_scripts’, ‘distutils.commands’ and others. Each group contains +a sequence of *note EntryPoint: 403. objects. + +You can get the *note metadata for a distribution: 3d54.: + + >>> 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'] + +You can also get a *note distribution’s version number: 3d55, list its +*note constituent files: 3d56, and get a list of the distribution’s +*note Distribution requirements: 3d57. + + +File: python.info, Node: Functional API, Next: Distributions, Prev: Overview<3>, Up: Using importlib metadata + +5.31.9.2 Functional API +....................... + +This package provides the following functionality via its public API. + +* Menu: + +* Entry points:: +* Distribution metadata:: +* Distribution versions:: +* Distribution files:: +* Distribution requirements:: +* Package distributions:: + + +File: python.info, Node: Entry points, Next: Distribution metadata, Up: Functional API + +5.31.9.3 Entry points +..................... + +The ‘entry_points()’ function returns a collection of entry points. +Entry points are represented by ‘EntryPoint’ instances; each +‘EntryPoint’ has a ‘.name’, ‘.group’, and ‘.value’ attributes and a +‘.load()’ method to resolve the value. There are also ‘.module’, +‘.attr’, and ‘.extras’ attributes for getting the components of the +‘.value’ attribute. + +Query all entry points: + + >>> eps = entry_points() + +The ‘entry_points()’ function returns an ‘EntryPoints’ object, a +sequence of all ‘EntryPoint’ objects with ‘names’ and ‘groups’ +attributes for convenience: + + >>> sorted(eps.groups) + ['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation'] + +‘EntryPoints’ has a ‘select’ method to select entry points matching +specific properties. Select entry points in the ‘console_scripts’ +group: + + >>> scripts = eps.select(group='console_scripts') + +Equivalently, since ‘entry_points’ passes keyword arguments through to +select: + + >>> scripts = entry_points(group='console_scripts') + +Pick out a specific script named “wheel” (found in the wheel project): + + >>> 'wheel' in scripts.names + True + >>> wheel = scripts['wheel'] + +Equivalently, query for that entry point during selection: + + >>> (wheel,) = entry_points(group='console_scripts', name='wheel') + >>> (wheel,) = entry_points().select(group='console_scripts', name='wheel') + +Inspect the resolved entry point: + + >>> 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> + +The ‘group’ and ‘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(1) for more information on +entry points, their definition, and usage. + +`Compatibility Note' + +The “selectable” entry points were introduced in ‘importlib_metadata’ +3.6 and Python 3.10. Prior to those changes, ‘entry_points’ accepted no +parameters and always returned a dictionary of entry points, keyed by +group. For compatibility, if no parameters are passed to entry_points, +a ‘SelectableGroups’ object is returned, implementing that dict +interface. In the future, calling ‘entry_points’ with no parameters +will return an ‘EntryPoints’ object. Users should rely on the selection +interface to retrieve entry points by group. + + ---------- Footnotes ---------- + + (1) https://setuptools.pypa.io/en/latest/userguide/entry_point.html + + +File: python.info, Node: Distribution metadata, Next: Distribution versions, Prev: Entry points, Up: Functional API + +5.31.9.4 Distribution metadata +.............................. + +Every distribution includes some metadata, which you can extract using +the ‘metadata()’ function: + + >>> wheel_metadata = metadata('wheel') + +The keys of the returned data structure, a ‘PackageMetadata’, name the +metadata keywords, and the values are returned unparsed from the +distribution metadata: + + >>> wheel_metadata['Requires-Python'] + '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' + +‘PackageMetadata’ also presents a ‘json’ attribute that returns all the +metadata in a JSON-compatible form per PEP 566(1): + + >>> wheel_metadata.json['requires_python'] + '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' + +Changed in version 3.10: The ‘Description’ is now included in the +metadata when presented through the payload. Line continuation +characters have been removed. + +New in version 3.10: The ‘json’ attribute was added. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0566/ + + +File: python.info, Node: Distribution versions, Next: Distribution files, Prev: Distribution metadata, Up: Functional API + +5.31.9.5 Distribution versions +.............................. + +The ‘version()’ function is the quickest way to get a distribution’s +version number, as a string: + + >>> version('wheel') + '0.32.3' + + +File: python.info, Node: Distribution files, Next: Distribution requirements, Prev: Distribution versions, Up: Functional API + +5.31.9.6 Distribution files +........................... + +You can also get the full set of files contained within a distribution. +The ‘files()’ function takes a distribution package name and returns all +of the files installed by this distribution. Each file object returned +is a ‘PackagePath’, a *note pathlib.PurePath: 306. derived object with +additional ‘dist’, ‘size’, and ‘hash’ properties as indicated by the +metadata. For 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> + +Once you have the file, you can also read its contents: + + >>> print(util.read_text()) + import base64 + import sys + ... + def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s + +You can also use the ‘locate’ method to get a the absolute path to the +file: + + >>> util.locate() + PosixPath('/home/gustav/example/lib/site-packages/wheel/util.py') + +In the case where the metadata file listing files (RECORD or +SOURCES.txt) is missing, ‘files()’ will return ‘None’. The caller may +wish to wrap calls to ‘files()’ in always_iterable(1) or otherwise guard +against this condition if the target distribution is not known to have +the metadata present. + + ---------- Footnotes ---------- + + (1) +https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.always_iterable + + +File: python.info, Node: Distribution requirements, Next: Package distributions, Prev: Distribution files, Up: Functional API + +5.31.9.7 Distribution requirements +.................................. + +To get the full set of requirements for a distribution, use the +‘requires()’ function: + + >>> requires('wheel') + ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"] + + +File: python.info, Node: Package distributions, Prev: Distribution requirements, Up: Functional API + +5.31.9.8 Package distributions +.............................. + +A convenience method to resolve the distribution or distributions (in +the case of a namespace package) for top-level Python packages or +modules: + + >>> packages_distributions() + {'importlib_metadata': ['importlib-metadata'], 'yaml': ['PyYAML'], 'jaraco': ['jaraco.classes', 'jaraco.functools'], ...} + +New in version 3.10. + + +File: python.info, Node: Distributions, Next: Extending the search algorithm, Prev: Functional API, Up: Using importlib metadata + +5.31.9.9 Distributions +...................... + +While the above API is the most common and convenient usage, you can get +all of that information from the ‘Distribution’ class. A ‘Distribution’ +is an abstract object that represents the metadata for a Python package. +You can get the ‘Distribution’ instance: + + >>> from importlib.metadata import distribution + >>> dist = distribution('wheel') + +Thus, an alternative way to get the version number is through the +‘Distribution’ instance: + + >>> dist.version + '0.32.3' + +There are all kinds of additional metadata available on the +‘Distribution’ instance: + + >>> dist.metadata['Requires-Python'] + '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' + >>> dist.metadata['License'] + 'MIT' + +The full set of available metadata is not described here. See PEP +566(1) for additional details. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0566/ + + +File: python.info, Node: Extending the search algorithm, Prev: Distributions, Up: Using importlib metadata + +5.31.9.10 Extending the search algorithm +........................................ + +Because package metadata is not available through *note sys.path: 162. +searches, or package loaders directly, the metadata for a package is +found through import system *note finders: 19aa. To find a distribution +package’s metadata, ‘importlib.metadata’ queries the list of *note meta +path finders: d1f. on *note sys.meta_path: 9a0. + +The default ‘PathFinder’ for Python includes a hook that calls into +‘importlib.metadata.MetadataPathFinder’ for finding distributions loaded +from typical file-system-based paths. + +The abstract class *note importlib.abc.MetaPathFinder: 473. defines the +interface expected of finders by Python’s import system. +‘importlib.metadata’ extends this protocol by looking for an optional +‘find_distributions’ callable on the finders from *note sys.meta_path: +9a0. and presents this extended interface as the ‘DistributionFinder’ +abstract base class, which defines this abstract method: + + @abc.abstractmethod + def find_distributions(context=DistributionFinder.Context()): + """Return an iterable of all Distribution instances capable of + loading the metadata for packages for the indicated ``context``. + """ + +The ‘DistributionFinder.Context’ object provides ‘.path’ and ‘.name’ +properties indicating the path to search and name to match and may +supply other relevant context. + +What this means in practice is that to support finding distribution +package metadata in locations other than the file system, subclass +‘Distribution’ and implement the abstract methods. Then from a custom +finder, return instances of this derived ‘Distribution’ in the +‘find_distributions()’ method. + + +File: python.info, Node: The initialization of the sys path module search path, Prev: Using importlib metadata, Up: Importing Modules + +5.31.10 The initialization of the ‘sys.path’ module search path +--------------------------------------------------------------- + +A module search path is initialized when Python starts. This module +search path may be accessed at *note sys.path: 162. + +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 *note -c: 1ad. command, or *note -m: 1ae. module. + +The *note PYTHONPATH: cc7. 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. + + Note: *note PYTHONPATH: cc7. will affect all installed Python + versions/environments. Be wary of setting this in your shell + profile or global environment variables. The *note site: e8. + module offers more nuanced techniques as mentioned below. + +The next items added are the directories containing standard Python +modules as well as any *note extension module: 3d65.s that these modules +depend on. Extension modules are ‘.pyd’ files on Windows and ‘.so’ +files on other platforms. The directory with the platform-independent +Python modules is called ‘prefix’. The directory with the extension +modules is called ‘exec_prefix’. + +The *note PYTHONHOME: 8ae. environment variable may be used to set the +‘prefix’ and ‘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 ‘home’. + +Once ‘home’ is determined, the ‘prefix’ directory is found by first +looking for ‘python`majorversion'`minorversion'.zip’ (‘python311.zip’). +On Windows the zip archive is searched for in ‘home’ and on Unix the +archive is expected to be in ‘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 ‘prefix’ by looking for ‘Lib\os.py’. Python on Unix will +look for ‘lib/python`majorversion'.`minorversion'/os.py’ +(‘lib/python3.11/os.py’). On Windows ‘prefix’ and ‘exec_prefix’ are the +same, however on other platforms +‘lib/python`majorversion'.`minorversion'/lib-dynload’ +(‘lib/python3.11/lib-dynload’) is searched for and used as an anchor for +‘exec_prefix’. On some platforms ‘lib’ may be ‘lib64’ or another value, +see *note sys.platlibdir: 580. and *note PYTHONPLATLIBDIR: 134a. + +Once found, ‘prefix’ and ‘exec_prefix’ are available at *note +sys.prefix: 3b91. and *note sys.exec_prefix: 3b92. respectively. + +Finally, the *note site: e8. module is processed and ‘site-packages’ +directories are added to the module search path. A common way to +customize the search path is to create ‘sitecustomize’ or +‘usercustomize’ modules as described in the *note site: e8. module +documentation. + + Note: Certain command line options may further affect path + calculations. See *note -E: 5af, *note -I: 5b0, *note -s: 101c. + and *note -S: e5c. for further details. + +* Menu: + +* Virtual environments: Virtual environments<2>. +* _pth files:: +* Embedded Python:: + + +File: python.info, Node: Virtual environments<2>, Next: _pth files, Up: The initialization of the sys path module search path + +5.31.10.1 Virtual environments +.............................. + +If Python is run in a virtual environment (as described at *note Virtual +Environments and Packages: 173d.) then ‘prefix’ and ‘exec_prefix’ are +specific to the virtual environment. + +If a ‘pyvenv.cfg’ file is found alongside the main executable, or in the +directory one level above the executable, the following variations +apply: + + * If ‘home’ is an absolute path and *note PYTHONHOME: 8ae. is not + set, this path is used instead of the path to the main executable + when deducing ‘prefix’ and ‘exec_prefix’. + + +File: python.info, Node: _pth files, Next: Embedded Python, Prev: Virtual environments<2>, Up: The initialization of the sys path module search path + +5.31.10.2 _pth files +.................... + +To completely override *note sys.path: 162. create a ‘._pth’ file with +the same name as the shared library or executable (‘python._pth’ or +‘python311._pth’). The shared library path is always known on Windows, +however it may not be available on other platforms. In the ‘._pth’ file +specify one line for each path to add to *note sys.path: 162. 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 *note site: e8. is not imported +unless one line in the file specifies ‘import site’. Blank paths and +lines starting with ‘#’ are ignored. Each path may be absolute or +relative to the location of the file. Import statements other than to +‘site’ are not permitted, and arbitrary code cannot be specified. + +Note that ‘.pth’ files (without leading underscore) will be processed +normally by the *note site: e8. module when ‘import site’ has been +specified. + + +File: python.info, Node: Embedded Python, Prev: _pth files, Up: The initialization of the sys path module search path + +5.31.10.3 Embedded Python +......................... + +If Python is embedded within another application *note +Py_InitializeFromConfig(): 600. and the *note PyConfig: 370. structure +can be used to initialize Python. The path specific details are +described at *note Python Path Configuration: 4e8. Alternatively the +older *note Py_SetPath(): 36c. can be used to bypass the initialization +of the module search path. + +See also +........ + + * *note Finding modules: 88c. for detailed Windows notes. + + * *note Using Python on Unix platforms: 179a. for Unix details. + + +File: python.info, Node: Python Language Services, Next: MS Windows Specific Services, Prev: Importing Modules, Up: The Python Standard Library + +5.32 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:: + + +File: python.info, Node: ast — Abstract Syntax Trees, Next: symtable — Access to the compiler’s symbol tables, Up: Python Language Services + +5.32.1 ‘ast’ — Abstract Syntax Trees +------------------------------------ + +`Source code:' Lib/ast.py(1) + +__________________________________________________________________ + +The *note ast: 7. 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 *note +ast.PyCF_ONLY_AST: 3d6e. as a flag to the *note compile(): 310. built-in +function, or using the *note parse(): 619. helper provided in this +module. The result will be a tree of objects whose classes all inherit +from *note ast.AST: 30f. An abstract syntax tree can be compiled into a +Python code object using the built-in *note compile(): 310. function. + +* Menu: + +* Abstract Grammar:: +* Node classes:: +* ast Helpers:: +* Compiler Flags:: +* Command-Line Usage: Command-Line Usage<2>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/ast.py + + +File: python.info, Node: Abstract Grammar, Next: Node classes, Up: ast — Abstract Syntax Trees + +5.32.1.1 Abstract Grammar +......................... + +The abstract grammar is currently defined as follows: + + -- 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) + | AsyncFunctionDef(identifier name, arguments args, + stmt* body, expr* decorator_list, expr? returns, + string? type_comment) + + | ClassDef(identifier name, + expr* bases, + keyword* keywords, + stmt* body, + expr* decorator_list) + | Return(expr? value) + + | Delete(expr* targets) + | Assign(expr* targets, expr value, string? type_comment) + | 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) + | JoinedStr(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) + } + + +File: python.info, Node: Node classes, Next: ast Helpers, Prev: Abstract Grammar, Up: ast — Abstract Syntax Trees + +5.32.1.2 Node classes +..................... + + -- Class: ast.AST + + This is the base of all AST node classes. The actual node classes + are derived from the ‘Parser/Python.asdl’ file, which is reproduced + *note above: 3d6f. They are defined in the ‘_ast’ C module and + re-exported in *note ast: 7. + + There is one class defined for each left-hand side symbol in the + abstract grammar (for example, ‘ast.stmt’ or ‘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, *note ast.BinOp: 13f2. inherits + from ‘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. + + -- Attribute: _fields + + Each concrete class has an attribute *note _fields: 3d72. + 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, *note ast.BinOp: 13f2. instances have an attribute + ‘left’ of type ‘ast.expr’. + + If these attributes are marked as optional in the grammar + (using a question mark), the value might be ‘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 *note compile(): 310. + + -- Attribute: lineno + -- Attribute: col_offset + -- Attribute: end_lineno + -- Attribute: end_col_offset + + Instances of ‘ast.expr’ and ‘ast.stmt’ subclasses have *note + lineno: 3d73, *note col_offset: 3d74, *note end_lineno: 3d75, + and *note end_col_offset: 3d76. attributes. The *note lineno: + 3d73. and *note end_lineno: 3d75. are the first and last line + numbers of source text span (1-indexed so the first line is + line 1) and the *note col_offset: 3d74. and *note + end_col_offset: 3d76. 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 ‘source_line[node.col_offset : + node.end_col_offset]’. + + The constructor of a class ‘ast.T’ parses its arguments as follows: + + * If there are positional arguments, there must be as many as + there are items in ‘T._fields’; they will be assigned as + attributes of these names. + + * If there are keyword arguments, they will set the attributes + of the same names to the given values. + + For example, to create and populate an *note ast.UnaryOp: 3d77. + node, you could use + + node = ast.UnaryOp() + node.op = ast.USub() + node.operand = ast.Constant() + node.operand.value = 5 + node.operand.lineno = 0 + node.operand.col_offset = 0 + node.lineno = 0 + node.col_offset = 0 + + or the more compact + + node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0), + lineno=0, col_offset=0) + +Changed in version 3.8: Class *note ast.Constant: 6c0. is now used for +all constants. + +Changed in version 3.9: Simple indices are represented by their value, +extended slices are represented as tuples. + +Deprecated since version 3.8: Old classes ‘ast.Num’, ‘ast.Str’, +‘ast.Bytes’, ‘ast.NameConstant’ and ‘ast.Ellipsis’ 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.9: Old classes ‘ast.Index’ and ‘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. + + Note: The descriptions of the specific node classes displayed here + were initially adapted from the fantastic Green Tree Snakes(1) + project and all its contributors. + +* Menu: + +* Literals: Literals<3>. +* Variables:: +* Expressions: Expressions<2>. +* Statements:: +* Control flow:: +* Pattern matching:: +* Function and class definitions:: +* Async and await:: + + ---------- Footnotes ---------- + + (1) https://greentreesnakes.readthedocs.io/en/latest/ + + +File: python.info, Node: Literals<3>, Next: Variables, Up: Node classes + +5.32.1.3 Literals +................. + + -- Class: ast.Constant (value) + + A constant value. The ‘value’ attribute of the ‘Constant’ literal + contains the Python object it represents. The values represented + can be simple types such as a number, string or ‘None’, but also + immutable container types (tuples and frozensets) if all of their + elements are constant. + + >>> print(ast.dump(ast.parse('123', mode='eval'), indent=4)) + Expression( + body=Constant(value=123)) + + -- 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 *note JoinedStr: 3d7a. + + * ‘value’ is any expression node (such as a literal, a variable, + or a function call). + + * ‘conversion’ is an integer: + + * -1: no formatting + + * 115: ‘!s’ string formatting + + * 114: ‘!r’ repr formatting + + * 97: ‘!a’ ascii formatting + + * ‘format_spec’ is a *note JoinedStr: 3d7a. node representing + the formatting of the value, or ‘None’ if no format was + specified. Both ‘conversion’ and ‘format_spec’ can be set at + the same time. + + -- Class: ast.JoinedStr (values) + + An f-string, comprising a series of *note FormattedValue: 3d79. and + *note Constant: 6c0. nodes. + + >>> 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())], + keywords=[]), + conversion=-1, + format_spec=JoinedStr( + values=[ + Constant(value='.3')]))])) + + -- Class: ast.List (elts, ctx) + -- Class: ast.Tuple (elts, ctx) + + A list or tuple. ‘elts’ holds a list of nodes representing the + elements. ‘ctx’ is *note Store: 3d7d. if the container is an + assignment target (i.e. ‘(x,y)=something’), and *note Load: 3d7e. + otherwise. + + >>> 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())) + + -- Class: ast.Set (elts) + + A set. ‘elts’ holds a list of nodes representing the set’s + elements. + + >>> 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)])) + + -- Class: ast.Dict (keys, values) + + A dictionary. ‘keys’ and ‘values’ hold lists of nodes representing + the keys and the values respectively, in matching order (what would + be returned when calling ‘dictionary.keys()’ and + ‘dictionary.values()’). + + When doing dictionary unpacking using dictionary literals the + expression to be expanded goes in the ‘values’ list, with a ‘None’ + at the corresponding position in ‘keys’. + + >>> 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())])) + + +File: python.info, Node: Variables, Next: Expressions<2>, Prev: Literals<3>, Up: Node classes + +5.32.1.4 Variables +.................. + + -- Class: ast.Name (id, ctx) + + A variable name. ‘id’ holds the name as a string, and ‘ctx’ is one + of the following types. + + -- Class: ast.Load + -- Class: ast.Store + -- 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. + + >>> print(ast.dump(ast.parse('a'), indent=4)) + Module( + body=[ + Expr( + value=Name(id='a', ctx=Load()))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('a = 1'), indent=4)) + Module( + body=[ + Assign( + targets=[ + Name(id='a', ctx=Store())], + value=Constant(value=1))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('del a'), indent=4)) + Module( + body=[ + Delete( + targets=[ + Name(id='a', ctx=Del())])], + type_ignores=[]) + + -- Class: ast.Starred (value, ctx) + + A ‘*var’ variable reference. ‘value’ holds the variable, typically + a *note Name: 1349. node. This type must be used when building a + *note Call: 3d83. node with ‘*args’. + + >>> 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()))], + type_ignores=[]) + + +File: python.info, Node: Expressions<2>, Next: Statements, Prev: Variables, Up: Node classes + +5.32.1.5 Expressions +.................... + + -- 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. ‘value’ holds one of the other nodes in this + section, a *note Constant: 6c0, a *note Name: 1349, a *note Lambda: + 3d86, a *note Yield: 3d87. or *note YieldFrom: 3d88. node. + + >>> print(ast.dump(ast.parse('-a'), indent=4)) + Module( + body=[ + Expr( + value=UnaryOp( + op=USub(), + operand=Name(id='a', ctx=Load())))], + type_ignores=[]) + + -- Class: ast.UnaryOp (op, operand) + + A unary operation. ‘op’ is the operator, and ‘operand’ any + expression node. + + -- Class: ast.UAdd + -- Class: ast.USub + -- Class: ast.Not + -- Class: ast.Invert + + Unary operator tokens. *note Not: 3d8b. is the ‘not’ keyword, + *note Invert: 3d8c. is the ‘~’ operator. + + >>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4)) + Expression( + body=UnaryOp( + op=Not(), + operand=Name(id='x', ctx=Load()))) + + -- Class: ast.BinOp (left, op, right) + + A binary operation (like addition or division). ‘op’ is the + operator, and ‘left’ and ‘right’ are any expression nodes. + + >>> 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()))) + + -- Class: ast.Add + -- Class: ast.Sub + -- Class: ast.Mult + -- Class: ast.Div + -- Class: ast.FloorDiv + -- Class: ast.Mod + -- Class: ast.Pow + -- Class: ast.LShift + -- Class: ast.RShift + -- Class: ast.BitOr + -- Class: ast.BitXor + -- Class: ast.BitAnd + -- Class: ast.MatMult + + Binary operator tokens. + + -- Class: ast.BoolOp (op, values) + + A boolean operation, ‘or’ or ‘and’. ‘op’ is *note Or: 3d9b. or + *note And: 3d9c. ‘values’ are the values involved. Consecutive + operations with the same operator, such as ‘a or b or c’, are + collapsed into one node with several values. + + This doesn’t include ‘not’, which is a *note UnaryOp: 3d77. + + >>> 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())])) + + -- Class: ast.And + -- Class: ast.Or + + Boolean operator tokens. + + -- Class: ast.Compare (left, ops, comparators) + + A comparison of two or more values. ‘left’ is the first value in + the comparison, ‘ops’ the list of operators, and ‘comparators’ the + list of values after the first element in the comparison. + + >>> 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)])) + + -- Class: ast.Eq + -- Class: ast.NotEq + -- Class: ast.Lt + -- Class: ast.LtE + -- Class: ast.Gt + -- Class: ast.GtE + -- Class: ast.Is + -- Class: ast.IsNot + -- Class: ast.In + -- Class: ast.NotIn + + Comparison operator tokens. + + -- Class: ast.Call (func, args, keywords, starargs, kwargs) + + A function call. ‘func’ is the function, which will often be a + *note Name: 1349. or *note Attribute: 3da8. object. Of the + arguments: + + * ‘args’ holds a list of the arguments passed by position. + + * ‘keywords’ holds a list of *note keyword: a4. objects + representing arguments passed by keyword. + + When creating a ‘Call’ node, ‘args’ and ‘keywords’ are required, + but they can be empty lists. ‘starargs’ and ‘kwargs’ are optional. + + >>> 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()))])) + + -- Class: ast.keyword (arg, value) + + A keyword argument to a function call or class definition. ‘arg’ + is a raw string of the parameter name, ‘value’ is a node to pass + in. + + -- Class: ast.IfExp (test, body, orelse) + + An expression such as ‘a if b else c’. Each field holds a single + node, so in the following example, all three are *note Name: 1349. + nodes. + + >>> 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()))) + + -- Class: ast.Attribute (value, attr, ctx) + + Attribute access, e.g. ‘d.keys’. ‘value’ is a node, typically a + *note Name: 1349. ‘attr’ is a bare string giving the name of the + attribute, and ‘ctx’ is *note Load: 3d7e, *note Store: 3d7d. or + *note Del: 3d81. according to how the attribute is acted on. + + >>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4)) + Expression( + body=Attribute( + value=Name(id='snake', ctx=Load()), + attr='colour', + ctx=Load())) + + -- 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 *note Assign: 3dac. node in + which the first argument can be multiple nodes, in this case + both ‘target’ and ‘value’ must be single nodes. + + >>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4)) + Expression( + body=NamedExpr( + target=Name(id='x', ctx=Store()), + value=Constant(value=4))) + +* Menu: + +* Subscripting:: +* Comprehensions:: + + +File: python.info, Node: Subscripting, Next: Comprehensions, Up: Expressions<2> + +5.32.1.6 Subscripting +..................... + + -- Class: ast.Subscript (value, slice, ctx) + + A subscript, such as ‘l[1]’. ‘value’ is the subscripted object + (usually sequence or mapping). ‘slice’ is an index, slice or key. + It can be a *note Tuple: 3d7c. and contain a *note Slice: 3daf. + ‘ctx’ is *note Load: 3d7e, *note Store: 3d7d. or *note Del: 3d81. + according to the action performed with the subscript. + + >>> 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())) + + -- Class: ast.Slice (lower, upper, step) + + Regular slicing (on the form ‘lower:upper’ or ‘lower:upper:step’). + Can occur only inside the `slice' field of *note Subscript: 3dae, + either directly or as an element of *note Tuple: 3d7c. + + >>> 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())) + + +File: python.info, Node: Comprehensions, Prev: Subscripting, Up: Expressions<2> + +5.32.1.7 Comprehensions +....................... + + -- Class: ast.ListComp (elt, generators) + -- Class: ast.SetComp (elt, generators) + -- Class: ast.GeneratorExp (elt, generators) + -- Class: ast.DictComp (key, value, generators) + + List and set comprehensions, generator expressions, and dictionary + comprehensions. ‘elt’ (or ‘key’ and ‘value’) is a single node + representing the part that will be evaluated for each item. + + ‘generators’ is a list of *note comprehension: 3db5. nodes. + + >>> 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()), + ifs=[], + 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()), + ifs=[], + 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()), + ifs=[], + is_async=0)])) + + -- Class: ast.comprehension (target, iter, ifs, is_async) + + One ‘for’ clause in a comprehension. ‘target’ is the reference to + use for each element - typically a *note Name: 1349. or *note + Tuple: 3d7c. node. ‘iter’ is the object to iterate over. ‘ifs’ is + a list of test expressions: each ‘for’ clause can have multiple + ‘ifs’. + + ‘is_async’ indicates a comprehension is asynchronous (using an + ‘async for’ instead of ‘for’). The value is an integer (0 or 1). + + >>> 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())], + keywords=[]), + generators=[ + comprehension( + target=Name(id='line', ctx=Store()), + iter=Name(id='file', ctx=Load()), + ifs=[], + is_async=0), + comprehension( + target=Name(id='c', ctx=Store()), + iter=Name(id='line', ctx=Load()), + ifs=[], + 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()), + ifs=[], + is_async=1)])) + + +File: python.info, Node: Statements, Next: Control flow, Prev: Expressions<2>, Up: Node classes + +5.32.1.8 Statements +................... + + -- Class: ast.Assign (targets, value, type_comment) + + An assignment. ‘targets’ is a list of nodes, and ‘value’ is a + single node. + + Multiple nodes in ‘targets’ represents assigning the same value to + each. Unpacking is represented by putting a *note Tuple: 3d7c. or + *note List: 3d7b. within ‘targets’. + + -- Attribute: type_comment + + ‘type_comment’ is an optional string with the type annotation + as a comment. + + >>> 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))], + type_ignores=[]) + + >>> 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()))], + type_ignores=[]) + + -- Class: ast.AnnAssign (target, annotation, value, simple) + + An assignment with a type annotation. ‘target’ is a single node + and can be a *note Name: 1349, a *note Attribute: 3da8. or a *note + Subscript: 3dae. ‘annotation’ is the annotation, such as a *note + Constant: 6c0. or *note Name: 1349. node. ‘value’ is a single + optional node. ‘simple’ is a boolean integer set to True for a + *note Name: 1349. node in ‘target’ that do not appear in between + parenthesis and are hence pure names and not expressions. + + >>> 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)], + type_ignores=[]) + + >>> 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)], + type_ignores=[]) + + >>> 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)], + type_ignores=[]) + + >>> 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)], + type_ignores=[]) + + -- Class: ast.AugAssign (target, op, value) + + Augmented assignment, such as ‘a += 1’. In the following example, + ‘target’ is a *note Name: 1349. node for ‘x’ (with the *note Store: + 3d7d. context), ‘op’ is *note Add: 3d8d, and ‘value’ is a *note + Constant: 6c0. with value for 1. + + The ‘target’ attribute cannot be of class *note Tuple: 3d7c. or + *note List: 3d7b, unlike the targets of *note Assign: 3dac. + + >>> print(ast.dump(ast.parse('x += 2'), indent=4)) + Module( + body=[ + AugAssign( + target=Name(id='x', ctx=Store()), + op=Add(), + value=Constant(value=2))], + type_ignores=[]) + + -- Class: ast.Raise (exc, cause) + + A ‘raise’ statement. ‘exc’ is the exception object to be raised, + normally a *note Call: 3d83. or *note Name: 1349, or ‘None’ for a + standalone ‘raise’. ‘cause’ is the optional part for ‘y’ in ‘raise + x from y’. + + >>> 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()))], + type_ignores=[]) + + -- Class: ast.Assert (test, msg) + + An assertion. ‘test’ holds the condition, such as a *note Compare: + 3d9d. node. ‘msg’ holds the failure message. + + >>> 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()))], + type_ignores=[]) + + -- Class: ast.Delete (targets) + + Represents a ‘del’ statement. ‘targets’ is a list of nodes, such + as *note Name: 1349, *note Attribute: 3da8. or *note Subscript: + 3dae. nodes. + + >>> 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())])], + type_ignores=[]) + + -- Class: ast.Pass + + A ‘pass’ statement. + + >>> print(ast.dump(ast.parse('pass'), indent=4)) + Module( + body=[ + Pass()], + type_ignores=[]) + +Other statements which are only applicable inside functions or loops are +described in other sections. + +* Menu: + +* Imports:: + + +File: python.info, Node: Imports, Up: Statements + +5.32.1.9 Imports +................ + + -- Class: ast.Import (names) + + An import statement. ‘names’ is a list of *note alias: 12c4. + nodes. + + >>> print(ast.dump(ast.parse('import x,y,z'), indent=4)) + Module( + body=[ + Import( + names=[ + alias(name='x'), + alias(name='y'), + alias(name='z')])], + type_ignores=[]) + + -- Class: ast.ImportFrom (module, names, level) + + Represents ‘from x import y’. ‘module’ is a raw string of the + ‘from’ name, without any leading dots, or ‘None’ for statements + such as ‘from . import foo’. ‘level’ is an integer holding the + level of the relative import (0 means absolute import). + + >>> 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)], + type_ignores=[]) + + -- Class: ast.alias (name, asname) + + Both parameters are raw strings of the names. ‘asname’ can be + ‘None’ if the regular name is to be used. + + >>> 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)], + type_ignores=[]) + + +File: python.info, Node: Control flow, Next: Pattern matching, Prev: Statements, Up: Node classes + +5.32.1.10 Control flow +...................... + + Note: Optional clauses such as ‘else’ are stored as an empty list + if they’re not present. + + -- Class: ast.If (test, body, orelse) + + An ‘if’ statement. ‘test’ holds a single node, such as a *note + Compare: 3d9d. node. ‘body’ and ‘orelse’ each hold a list of + nodes. + + ‘elif’ clauses don’t have a special representation in the AST, but + rather appear as extra *note If: 3dc2. nodes within the ‘orelse’ + section of the previous one. + + >>> 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))])])], + type_ignores=[]) + + -- Class: ast.For (target, iter, body, orelse, type_comment) + + A ‘for’ loop. ‘target’ holds the variable(s) the loop assigns to, + as a single *note Name: 1349, *note Tuple: 3d7c. or *note List: + 3d7b. node. ‘iter’ holds the item to be looped over, again as a + single node. ‘body’ and ‘orelse’ contain lists of nodes to + execute. Those in ‘orelse’ are executed if the loop finishes + normally, rather than via a ‘break’ statement. + + -- Attribute: type_comment + + ‘type_comment’ is an optional string with the type annotation + as a comment. + + >>> 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))])], + type_ignores=[]) + + -- Class: ast.While (test, body, orelse) + + A ‘while’ loop. ‘test’ holds the condition, such as a *note + Compare: 3d9d. node. + + >> 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))])], + type_ignores=[]) + + -- Class: ast.Break + -- Class: ast.Continue + + The ‘break’ and ‘continue’ statements. + + >>> 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()])], + orelse=[])], + type_ignores=[]) + + -- Class: ast.Try (body, handlers, orelse, finalbody) + + ‘try’ blocks. All attributes are list of nodes to execute, except + for ‘handlers’, which is a list of *note ExceptHandler: 3dc9. + nodes. + + >>> 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))])], + type_ignores=[]) + + -- Class: ast.TryStar (body, handlers, orelse, finalbody) + + ‘try’ blocks which are followed by ‘except*’ clauses. The + attributes are the same as for *note Try: 3dc8. but the *note + ExceptHandler: 3dc9. nodes in ‘handlers’ are interpreted as + ‘except*’ blocks rather then ‘except’. + + >>> 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))])], + orelse=[], + finalbody=[])], + type_ignores=[]) + + -- Class: ast.ExceptHandler (type, name, body) + + A single ‘except’ clause. ‘type’ is the exception type it will + match, typically a *note Name: 1349. node (or ‘None’ for a + catch-all ‘except:’ clause). ‘name’ is a raw string for the name + to hold the exception, or ‘None’ if the clause doesn’t have ‘as + foo’. ‘body’ is a list of nodes. + + >>> 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()])], + orelse=[], + finalbody=[])], + type_ignores=[]) + + -- Class: ast.With (items, body, type_comment) + + A ‘with’ block. ‘items’ is a list of *note withitem: 3dcc. nodes + representing the context managers, and ‘body’ is the indented block + inside the context. + + -- Attribute: type_comment + + ‘type_comment’ is an optional string with the type annotation + as a comment. + + -- Class: ast.withitem (context_expr, optional_vars) + + A single context manager in a ‘with’ block. ‘context_expr’ is the + context manager, often a *note Call: 3d83. node. ‘optional_vars’ + is a *note Name: 1349, *note Tuple: 3d7c. or *note List: 3d7b. for + the ‘as foo’ part, or ‘None’ if that isn’t used. + + >>> 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())], + keywords=[]))])], + type_ignores=[]) + + +File: python.info, Node: Pattern matching, Next: Function and class definitions, Prev: Control flow, Up: Node classes + +5.32.1.11 Pattern matching +.......................... + + -- Class: ast.Match (subject, cases) + + A ‘match’ statement. ‘subject’ holds the subject of the match (the + object that is being matched against the cases) and ‘cases’ + contains an iterable of *note match_case: 3dd0. nodes with the + different cases. + + -- Class: ast.match_case (pattern, guard, body) + + A single case pattern in a ‘match’ statement. ‘pattern’ contains + the match pattern that the subject will be matched against. Note + that the *note AST: 30f. nodes produced for patterns differ from + those produced for expressions, even when they share the same + syntax. + + The ‘guard’ attribute contains an expression that will be evaluated + if the pattern matches the subject. + + ‘body’ contains a list of nodes to execute if the pattern matches + and the result of evaluating the guard expression is true. + + >>> 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()), + patterns=[], + kwd_attrs=[], + kwd_patterns=[]), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + + -- Class: ast.MatchValue (value) + + A match literal or value pattern that compares by equality. + ‘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. + + >>> 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))])])], + type_ignores=[]) + + -- Class: ast.MatchSingleton (value) + + A match literal pattern that compares by identity. ‘value’ is the + singleton to be compared against: ‘None’, ‘True’, or ‘False’. This + pattern succeeds if the match subject is the given constant. + + >>> 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))])])], + type_ignores=[]) + + -- Class: ast.MatchSequence (patterns) + + A match sequence pattern. ‘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 + ‘MatchStar’ node, otherwise matches a fixed length sequence. + + >>> 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))])])], + type_ignores=[]) + + -- Class: ast.MatchStar (name) + + Matches the rest of the sequence in a variable length match + sequence pattern. If ‘name’ is not ‘None’, a list containing the + remaining sequence elements is bound to that name if the overall + sequence pattern is successful. + + >>> 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))])])], + type_ignores=[]) + + -- Class: ast.MatchMapping (keys, patterns, rest) + + A match mapping pattern. ‘keys’ is a sequence of expression nodes. + ‘patterns’ is a corresponding sequence of pattern nodes. ‘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 + ‘rest’ is not ‘None’, a dict containing the remaining mapping + elements is bound to that name if the overall mapping pattern is + successful. + + >>> 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(keys=[], patterns=[], rest='rest'), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + + -- Class: ast.MatchClass (cls, patterns, kwd_attrs, kwd_patterns) + + A match class pattern. ‘cls’ is an expression giving the nominal + class to be matched. ‘patterns’ is a sequence of pattern nodes to + be matched against the class defined sequence of pattern matching + attributes. ‘kwd_attrs’ is a sequence of additional attributes to + be matched (specified as keyword arguments in the class pattern), + ‘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. + + >>> 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))], + kwd_attrs=[], + kwd_patterns=[]), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + match_case( + pattern=MatchClass( + cls=Name(id='Point3D', ctx=Load()), + patterns=[], + 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))])])], + type_ignores=[]) + + -- Class: ast.MatchAs (pattern, name) + + A match “as-pattern”, capture pattern or wildcard pattern. + ‘pattern’ contains the match pattern that the subject will be + matched against. If the pattern is ‘None’, the node represents a + capture pattern (i.e a bare name) and will always succeed. + + The ‘name’ attribute contains the name that will be bound if the + pattern is successful. If ‘name’ is ‘None’, ‘pattern’ must also be + ‘None’ and the node represents the wildcard pattern. + + >>> 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))])])], + type_ignores=[]) + + -- 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 ‘patterns’ attribute contains a + list of match pattern nodes that will be matched against the + subject. + + >>> 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))])])], + type_ignores=[]) + + +File: python.info, Node: Function and class definitions, Next: Async and await, Prev: Pattern matching, Up: Node classes + +5.32.1.12 Function and class definitions +........................................ + + -- Class: ast.FunctionDef (name, args, body, decorator_list, returns, + type_comment) + + A function definition. + + * ‘name’ is a raw string of the function name. + + * ‘args’ is an *note arguments: 3ddb. node. + + * ‘body’ is the list of nodes inside the function. + + * ‘decorator_list’ is the list of decorators to be applied, + stored outermost first (i.e. the first in the list will be + applied last). + + * ‘returns’ is the return annotation. + + -- Attribute: type_comment + + ‘type_comment’ is an optional string with the type annotation + as a comment. + + -- Class: ast.Lambda (args, body) + + ‘lambda’ is a minimal function definition that can be used inside + an expression. Unlike *note FunctionDef: 3dda, ‘body’ holds a + single node. + + >>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4)) + Module( + body=[ + Expr( + value=Lambda( + args=arguments( + posonlyargs=[], + args=[ + arg(arg='x'), + arg(arg='y')], + kwonlyargs=[], + kw_defaults=[], + defaults=[]), + body=Constant(value=Ellipsis)))], + type_ignores=[]) + + -- Class: ast.arguments (posonlyargs, args, vararg, kwonlyargs, + kw_defaults, kwarg, defaults) + + The arguments for a function. + + * ‘posonlyargs’, ‘args’ and ‘kwonlyargs’ are lists of *note arg: + 3ddd. nodes. + + * ‘vararg’ and ‘kwarg’ are single *note arg: 3ddd. nodes, + referring to the ‘*args, **kwargs’ parameters. + + * ‘kw_defaults’ is a list of default values for keyword-only + arguments. If one is ‘None’, the corresponding argument is + required. + + * ‘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. + + -- Class: ast.arg (arg, annotation, type_comment) + + A single argument in a list. ‘arg’ is a raw string of the argument + name, ‘annotation’ is its annotation, such as a ‘Str’ or *note + Name: 1349. node. + + -- Attribute: type_comment + + ‘type_comment’ is an optional string with the type annotation + as a comment + + >>> 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( + posonlyargs=[], + 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'))], + type_ignores=[]) + + -- Class: ast.Return (value) + + A ‘return’ statement. + + >>> print(ast.dump(ast.parse('return 4'), indent=4)) + Module( + body=[ + Return( + value=Constant(value=4))], + type_ignores=[]) + + -- Class: ast.Yield (value) + -- Class: ast.YieldFrom (value) + + A ‘yield’ or ‘yield from’ expression. Because these are + expressions, they must be wrapped in a *note Expr: 3d85. node if + the value sent back is not used. + + >>> print(ast.dump(ast.parse('yield x'), indent=4)) + Module( + body=[ + Expr( + value=Yield( + value=Name(id='x', ctx=Load())))], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('yield from x'), indent=4)) + Module( + body=[ + Expr( + value=YieldFrom( + value=Name(id='x', ctx=Load())))], + type_ignores=[]) + + -- Class: ast.Global (names) + -- Class: ast.Nonlocal (names) + + ‘global’ and ‘nonlocal’ statements. ‘names’ is a list of raw + strings. + + >>> print(ast.dump(ast.parse('global x,y,z'), indent=4)) + Module( + body=[ + Global( + names=[ + 'x', + 'y', + 'z'])], + type_ignores=[]) + + >>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4)) + Module( + body=[ + Nonlocal( + names=[ + 'x', + 'y', + 'z'])], + type_ignores=[]) + + -- Class: ast.ClassDef (name, bases, keywords, starargs, kwargs, body, + decorator_list) + + A class definition. + + * ‘name’ is a raw string for the class name + + * ‘bases’ is a list of nodes for explicitly specified base + classes. + + * ‘keywords’ is a list of *note keyword: a4. nodes, principally + for ‘metaclass’. Other keywords will be passed to the + metaclass, as per PEP-3115(1). + + * ‘starargs’ and ‘kwargs’ are each a single node, as in a + function call. starargs will be expanded to join the list of + base classes, and kwargs will be passed to the metaclass. + + * ‘body’ is a list of nodes representing the code within the + class definition. + + * ‘decorator_list’ is a list of nodes, as in *note FunctionDef: + 3dda. + + >>> 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())])], + type_ignores=[]) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3115/ + + +File: python.info, Node: Async and await, Prev: Function and class definitions, Up: Node classes + +5.32.1.13 Async and await +......................... + + -- Class: ast.AsyncFunctionDef (name, args, body, decorator_list, + returns, type_comment) + + An ‘async def’ function definition. Has the same fields as *note + FunctionDef: 3dda. + + -- Class: ast.Await (value) + + An ‘await’ expression. ‘value’ is what it waits for. Only valid + in the body of an *note AsyncFunctionDef: 3de4. + + >>> print(ast.dump(ast.parse("""\ + ... async def f(): + ... await other_func() + ... """), indent=4)) + 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_ignores=[]) + + -- Class: ast.AsyncFor (target, iter, body, orelse, type_comment) + -- Class: ast.AsyncWith (items, body, type_comment) + + ‘async for’ loops and ‘async with’ context managers. They have the + same fields as *note For: 3dc3. and *note With: 3dcb, respectively. + Only valid in the body of an *note AsyncFunctionDef: 3de4. + + Note: When a string is parsed by *note ast.parse(): 619, operator + nodes (subclasses of ‘ast.operator’, ‘ast.unaryop’, ‘ast.cmpop’, + ‘ast.boolop’ and ‘ast.expr_context’) on the returned tree will be + singletons. Changes to one will be reflected in all other + occurrences of the same value (e.g. *note ast.Add: 3d8d.). + + +File: python.info, Node: ast Helpers, Next: Compiler Flags, Prev: Node classes, Up: ast — Abstract Syntax Trees + +5.32.1.14 ‘ast’ Helpers +....................... + +Apart from the node classes, the *note ast: 7. module defines these +utility functions and classes for traversing abstract syntax trees: + + -- Function: ast.parse (source, filename='<unknown>', mode='exec', *, + type_comments=False, feature_version=None) + + Parse the source into an AST node. Equivalent to ‘compile(source, + filename, mode, ast.PyCF_ONLY_AST)’. + + If ‘type_comments=True’ is given, the parser is modified to check + and return type comments as specified by PEP 484(1) and PEP 526(2). + This is equivalent to adding *note ast.PyCF_TYPE_COMMENTS: 3de9. to + the flags passed to *note compile(): 310. This will report syntax + errors for misplaced type comments. Without this flag, type + comments will be ignored, and the ‘type_comment’ field on selected + AST nodes will always be ‘None’. In addition, the locations of ‘# + type: ignore’ comments will be returned as the ‘type_ignores’ + attribute of ‘Module’ (otherwise it is always an empty list). + + In addition, if ‘mode’ is ‘'func_type'’, the input syntax is + modified to correspond to PEP 484(3) “signature type comments”, + e.g. ‘(str, int) -> List[str]’. + + Also, setting ‘feature_version’ to a tuple ‘(major, minor)’ will + attempt to parse using that Python version’s grammar. Currently + ‘major’ must equal to ‘3’. For example, setting + ‘feature_version=(3, 4)’ will allow the use of ‘async’ and ‘await’ + as variable names. The lowest supported version is ‘(3, 4)’; the + highest is ‘sys.version_info[0:2]’. + + If source contains a null character (’0’), *note ValueError: 1c8. + is raised. + + 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 *note SyntaxError: 2d6. exceptions. For + instance, the source ‘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, *note ast.parse(): 619. won’t do any scoping + checks, which the compilation step does. + + 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. + + Changed in version 3.8: Added ‘type_comments’, ‘mode='func_type'’ + and ‘feature_version’. + + -- Function: ast.unparse (ast_obj) + + Unparse an *note ast.AST: 30f. object and generate a string with + code that would produce an equivalent *note ast.AST: 30f. object if + parsed back with *note ast.parse(): 619. + + Warning: The produced code string will not necessarily be + equal to the original code that generated the *note ast.AST: + 30f. object (without any compiler optimizations, such as + constant tuples/frozensets). + + Warning: Trying to unparse a highly complex expression would + result with *note RecursionError: 9e7. + + New in version 3.9. + + -- Function: ast.literal_eval (node_or_string) + + Safely evaluate an expression node or a string containing 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, ‘None’ and + ‘Ellipsis’. + + This can be used for safely evaluating strings containing Python + values from untrusted sources without the need to parse the values + oneself. It is not capable of evaluating arbitrarily complex + expressions, for example involving operators or indexing. + + 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. + + It can raise *note ValueError: 1c8, *note TypeError: 19c, + *note SyntaxError: 2d6, *note MemoryError: 127a. and *note + RecursionError: 9e7. depending on the malformed input. + + Changed in version 3.2: Now allows bytes and set literals. + + Changed in version 3.9: Now supports creating empty sets with + ‘'set()'’. + + Changed in version 3.10: For string inputs, leading spaces and tabs + are now stripped. + + -- Function: ast.get_docstring (node, clean=True) + + Return the docstring of the given `node' (which must be a *note + FunctionDef: 3dda, *note AsyncFunctionDef: 3de4, *note ClassDef: + 3de2, or ‘Module’ node), or ‘None’ if it has no docstring. If + `clean' is true, clean up the docstring’s indentation with *note + inspect.cleandoc(): 3c77. + + Changed in version 3.5: *note AsyncFunctionDef: 3de4. is now + supported. + + -- Function: ast.get_source_segment (source, node, *, padded=False) + + Get source code segment of the `source' that generated `node'. If + some location information (‘lineno’, ‘end_lineno’, ‘col_offset’, or + ‘end_col_offset’) is missing, return ‘None’. + + If `padded' is ‘True’, the first line of a multi-line statement + will be padded with spaces to match its original position. + + New in version 3.8. + + -- Function: ast.fix_missing_locations (node) + + When you compile a node tree with *note compile(): 310, the + compiler expects ‘lineno’ and ‘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'. + + -- 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. + + -- Function: ast.copy_location (new_node, old_node) + + Copy source location (‘lineno’, ‘col_offset’, ‘end_lineno’, and + ‘end_col_offset’) from `old_node' to `new_node' if possible, and + return `new_node'. + + -- Function: ast.iter_fields (node) + + Yield a tuple of ‘(fieldname, value)’ for each field in + ‘node._fields’ that is present on `node'. + + -- 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. + + -- 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. + + -- 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 *note visit(): 3def. + method. + + This class is meant to be subclassed, with the subclass adding + visitor methods. + + -- Method: visit (node) + + Visit a node. The default implementation calls the method + called ‘self.visit_CLASSNAME’ where `classname' is the name of + the node class, or *note generic_visit(): 3df0. if that method + doesn’t exist. + + -- Method: generic_visit (node) + + This visitor calls *note visit(): 3def. 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 *note + generic_visit(): 3df0. or visits them itself. + + Don’t use the *note NodeVisitor: 6c1. if you want to apply changes + to nodes during traversal. For this a special visitor exists + (*note NodeTransformer: 3df1.) that allows modifications. + + Deprecated since version 3.8: Methods ‘visit_Num()’, ‘visit_Str()’, + ‘visit_Bytes()’, ‘visit_NameConstant()’ and ‘visit_Ellipsis()’ are + deprecated now and will not be called in future Python versions. + Add the ‘visit_Constant()’ method to handle all constant nodes. + + -- Class: ast.NodeTransformer + + A *note NodeVisitor: 6c1. subclass that walks the abstract syntax + tree and allows modification of nodes. + + The *note NodeTransformer: 3df1. 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 ‘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 (‘foo’) to ‘data['foo']’: + + class RewriteName(NodeTransformer): + + def visit_Name(self, node): + return Subscript( + value=Name(id='data', ctx=Load()), + slice=Constant(value=node.id), + ctx=node.ctx + ) + + 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 + ‘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 *note NodeTransformer: 3df1. introduces new nodes (that weren’t + part of original tree) without giving them location information + (such as ‘lineno’), *note fix_missing_locations(): 3dea. should be + called with the new sub-tree to recalculate the location + information: + + tree = ast.parse('foo', mode='eval') + new_tree = fix_missing_locations(RewriteName().visit(tree)) + + Usually you use the transformer like this: + + node = YourTransformer().visit(node) + + -- Function: ast.dump (node, annotate_fields=True, + include_attributes=False, *, indent=None) + + 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 ‘""’ will only insert newlines. ‘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 ‘"\t"’), that string is used to indent each level. + + Changed in version 3.9: Added the `indent' option. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0526/ + + (3) https://peps.python.org/pep-0484/ + + +File: python.info, Node: Compiler Flags, Next: Command-Line Usage<2>, Prev: ast Helpers, Up: ast — Abstract Syntax Trees + +5.32.1.15 Compiler Flags +........................ + +The following flags may be passed to *note compile(): 310. in order to +change effects on the compilation of a program: + + -- Data: ast.PyCF_ALLOW_TOP_LEVEL_AWAIT + + Enables support for top-level ‘await’, ‘async for’, ‘async with’ + and async comprehensions. + + New in version 3.8. + + -- Data: ast.PyCF_ONLY_AST + + Generates and returns an abstract syntax tree instead of returning + a compiled code object. + + -- Data: ast.PyCF_TYPE_COMMENTS + + Enables support for PEP 484(1) and PEP 526(2) style type comments + (‘# type: <type>’, ‘# type: ignore <stuff>’). + + New in version 3.8. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0526/ + + +File: python.info, Node: Command-Line Usage<2>, Prev: Compiler Flags, Up: ast — Abstract Syntax Trees + +5.32.1.16 Command-Line Usage +............................ + +New in version 3.9. + +The *note ast: 7. module can be executed as a script from the command +line. It is as simple as: + + python -m ast [-m <mode>] [-a] [infile] + +The following options are accepted: + + -- Program Option: -h, --help + + Show the help message and exit. + + -- Program Option: -m <mode> + -- Program Option: --mode <mode> + + Specify what kind of code must be compiled, like the `mode' + argument in *note parse(): 619. + + -- Program Option: --no-type-comments + + Don’t parse type comments. + + -- Program Option: -a, --include-attributes + + Include attributes such as line numbers and column offsets. + + -- Program Option: -i <indent> + -- Program Option: --indent <indent> + + Indentation of nodes in AST (number of spaces). + +If ‘infile’ is specified its contents are parsed to AST and dumped to +stdout. Otherwise, the content is read from stdin. + +See also +........ + +Green Tree Snakes(1), an external documentation resource, has good +details on working with Python ASTs. + +ASTTokens(2) 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(3) unifies the token-based and parse-tree-based views of +python programs by inserting two-way links between tokens and ast nodes. + +LibCST(4) 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(5) 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. + + ---------- Footnotes ---------- + + (1) https://greentreesnakes.readthedocs.io/ + + (2) https://asttokens.readthedocs.io/en/latest/user-guide.html + + (3) https://leoeditor.com/appendices.html#leoast-py + + (4) https://libcst.readthedocs.io/ + + (5) https://parso.readthedocs.io + + +File: python.info, Node: symtable — Access to the compiler’s symbol tables, Next: token — Constants used with Python parse trees, Prev: ast — Abstract Syntax Trees, Up: Python Language Services + +5.32.2 ‘symtable’ — Access to the compiler’s symbol tables +---------------------------------------------------------- + +`Source code:' Lib/symtable.py(1) + +__________________________________________________________________ + +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. *note symtable: f8. provides +an interface to examine these tables. + +* Menu: + +* Generating Symbol Tables:: +* Examining Symbol Tables:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/symtable.py + + +File: python.info, Node: Generating Symbol Tables, Next: Examining Symbol Tables, Up: symtable — Access to the compiler’s symbol tables + +5.32.2.1 Generating Symbol Tables +................................. + + -- Function: symtable.symtable (code, filename, compile_type) + + Return the toplevel *note SymbolTable: 3e02. for the Python source + `code'. `filename' is the name of the file containing the code. + `compile_type' is like the `mode' argument to *note compile(): 310. + + +File: python.info, Node: Examining Symbol Tables, Prev: Generating Symbol Tables, Up: symtable — Access to the compiler’s symbol tables + +5.32.2.2 Examining Symbol Tables +................................ + + -- Class: symtable.SymbolTable + + A namespace table for a block. The constructor is not public. + + -- Method: get_type () + + Return the type of the symbol table. Possible values are + ‘'class'’, ‘'module'’, and ‘'function'’. + + -- Method: get_id () + + Return the table’s identifier. + + -- 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 ‘'top'’ if the table is global (*note + get_type(): 3e04. returns ‘'module'’). + + -- Method: get_lineno () + + Return the number of the first line in the block this table + represents. + + -- Method: is_optimized () + + Return ‘True’ if the locals in this table can be optimized. + + -- Method: is_nested () + + Return ‘True’ if the block is a nested class or function. + + -- Method: has_children () + + Return ‘True’ if the block has nested namespaces within it. + These can be obtained with *note get_children(): 3e0b. + + -- Method: get_identifiers () + + Return a view object containing the names of symbols in the + table. See the *note documentation of view objects: 1c99. + + -- Method: lookup (name) + + Lookup `name' in the table and return a *note Symbol: 3e0e. + instance. + + -- Method: get_symbols () + + Return a list of *note Symbol: 3e0e. instances for names in + the table. + + -- Method: get_children () + + Return a list of the nested symbol tables. + + -- Class: symtable.Function + + A namespace for a function or method. This class inherits *note + SymbolTable: 3e02. + + -- Method: get_parameters () + + Return a tuple containing names of parameters to this + function. + + -- Method: get_locals () + + Return a tuple containing names of locals in this function. + + -- Method: get_globals () + + Return a tuple containing names of globals in this function. + + -- Method: get_nonlocals () + + Return a tuple containing names of nonlocals in this function. + + -- Method: get_frees () + + Return a tuple containing names of free variables in this + function. + + -- Class: symtable.Class + + A namespace of a class. This class inherits *note SymbolTable: + 3e02. + + -- Method: get_methods () + + Return a tuple containing the names of methods declared in the + class. + + -- Class: symtable.Symbol + + An entry in a *note SymbolTable: 3e02. corresponding to an + identifier in the source. The constructor is not public. + + -- Method: get_name () + + Return the symbol’s name. + + -- Method: is_referenced () + + Return ‘True’ if the symbol is used in its block. + + -- Method: is_imported () + + Return ‘True’ if the symbol is created from an import + statement. + + -- Method: is_parameter () + + Return ‘True’ if the symbol is a parameter. + + -- Method: is_global () + + Return ‘True’ if the symbol is global. + + -- Method: is_nonlocal () + + Return ‘True’ if the symbol is nonlocal. + + -- Method: is_declared_global () + + Return ‘True’ if the symbol is declared global with a global + statement. + + -- Method: is_local () + + Return ‘True’ if the symbol is local to its block. + + -- Method: is_annotated () + + Return ‘True’ if the symbol is annotated. + + New in version 3.6. + + -- Method: is_free () + + Return ‘True’ if the symbol is referenced in its block, but + not assigned to. + + -- Method: is_assigned () + + Return ‘True’ if the symbol is assigned to in its block. + + -- Method: is_namespace () + + Return ‘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: + + >>> table = symtable.symtable("def some_func(): pass", "string", "exec") + >>> table.lookup("some_func").is_namespace() + True + + Note that a single name can be bound to multiple objects. If + the result is ‘True’, the name may also be bound to other + objects, like an int or list, that does not introduce a new + namespace. + + -- Method: get_namespaces () + + Return a list of namespaces bound to this name. + + -- Method: get_namespace () + + Return the namespace bound to this name. If more than one or + no namespace is bound to this name, a *note ValueError: 1c8. + is raised. + + +File: python.info, Node: token — Constants used with Python parse trees, Next: keyword — Testing for Python keywords, Prev: symtable — Access to the compiler’s symbol tables, Up: Python Language Services + +5.32.3 ‘token’ — Constants used with Python parse trees +------------------------------------------------------- + +`Source code:' Lib/token.py(1) + +__________________________________________________________________ + +This module provides constants which represent the numeric values of +leaf nodes of the parse tree (terminal tokens). Refer to the file +‘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. + + -- 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. + + -- Function: token.ISTERMINAL (x) + + Return ‘True’ for terminal token values. + + -- Function: token.ISNONTERMINAL (x) + + Return ‘True’ for non-terminal token values. + + -- Function: token.ISEOF (x) + + Return ‘True’ if `x' is the marker indicating the end of input. + +The token constants are: + + -- Data: token.ENDMARKER + + -- Data: token.NAME + + -- Data: token.NUMBER + + -- Data: token.STRING + + -- Data: token.NEWLINE + + -- Data: token.INDENT + + -- Data: token.DEDENT + + -- Data: token.LPAR + + Token value for ‘"("’. + + -- Data: token.RPAR + + Token value for ‘")"’. + + -- Data: token.LSQB + + Token value for ‘"["’. + + -- Data: token.RSQB + + Token value for ‘"]"’. + + -- Data: token.COLON + + Token value for ‘":"’. + + -- Data: token.COMMA + + Token value for ‘","’. + + -- Data: token.SEMI + + Token value for ‘";"’. + + -- Data: token.PLUS + + Token value for ‘"+"’. + + -- Data: token.MINUS + + Token value for ‘"-"’. + + -- Data: token.STAR + + Token value for ‘"*"’. + + -- Data: token.SLASH + + Token value for ‘"/"’. + + -- Data: token.VBAR + + Token value for ‘"|"’. + + -- Data: token.AMPER + + Token value for ‘"&"’. + + -- Data: token.LESS + + Token value for ‘"<"’. + + -- Data: token.GREATER + + Token value for ‘">"’. + + -- Data: token.EQUAL + + Token value for ‘"="’. + + -- Data: token.DOT + + Token value for ‘"."’. + + -- Data: token.PERCENT + + Token value for ‘"%"’. + + -- Data: token.LBRACE + + Token value for ‘"{"’. + + -- Data: token.RBRACE + + Token value for ‘"}"’. + + -- Data: token.EQEQUAL + + Token value for ‘"=="’. + + -- Data: token.NOTEQUAL + + Token value for ‘"!="’. + + -- Data: token.LESSEQUAL + + Token value for ‘"<="’. + + -- Data: token.GREATEREQUAL + + Token value for ‘">="’. + + -- Data: token.TILDE + + Token value for ‘"~"’. + + -- Data: token.CIRCUMFLEX + + Token value for ‘"^"’. + + -- Data: token.LEFTSHIFT + + Token value for ‘"<<"’. + + -- Data: token.RIGHTSHIFT + + Token value for ‘">>"’. + + -- Data: token.DOUBLESTAR + + Token value for ‘"**"’. + + -- Data: token.PLUSEQUAL + + Token value for ‘"+="’. + + -- Data: token.MINEQUAL + + Token value for ‘"-="’. + + -- Data: token.STAREQUAL + + Token value for ‘"*="’. + + -- Data: token.SLASHEQUAL + + Token value for ‘"/="’. + + -- Data: token.PERCENTEQUAL + + Token value for ‘"%="’. + + -- Data: token.AMPEREQUAL + + Token value for ‘"&="’. + + -- Data: token.VBAREQUAL + + Token value for ‘"|="’. + + -- Data: token.CIRCUMFLEXEQUAL + + Token value for ‘"^="’. + + -- Data: token.LEFTSHIFTEQUAL + + Token value for ‘"<<="’. + + -- Data: token.RIGHTSHIFTEQUAL + + Token value for ‘">>="’. + + -- Data: token.DOUBLESTAREQUAL + + Token value for ‘"**="’. + + -- Data: token.DOUBLESLASH + + Token value for ‘"//"’. + + -- Data: token.DOUBLESLASHEQUAL + + Token value for ‘"//="’. + + -- Data: token.AT + + Token value for ‘"@"’. + + -- Data: token.ATEQUAL + + Token value for ‘"@="’. + + -- Data: token.RARROW + + Token value for ‘"->"’. + + -- Data: token.ELLIPSIS + + Token value for ‘"..."’. + + -- Data: token.COLONEQUAL + + Token value for ‘":="’. + + -- Data: token.OP + + -- Data: token.AWAIT + + -- Data: token.ASYNC + + -- Data: token.TYPE_IGNORE + + -- Data: token.TYPE_COMMENT + + -- Data: token.SOFT_KEYWORD + + -- Data: token.ERRORTOKEN + + -- Data: token.N_TOKENS + + -- Data: token.NT_OFFSET + +The following token type values aren’t used by the C tokenizer but are +needed for the *note tokenize: 11a. module. + + -- Data: token.COMMENT + + Token value used to indicate a comment. + + -- Data: token.NL + + Token value used to indicate a non-terminating newline. The *note + NEWLINE: 3e2e. token indicates the end of a logical line of Python + code; ‘NL’ tokens are generated when a logical line of code is + continued over multiple physical lines. + + -- Data: token.ENCODING + + Token value that indicates the encoding used to decode the source + bytes into text. The first token returned by *note + tokenize.tokenize(): f70. will always be an ‘ENCODING’ token. + + -- Data: token.TYPE_COMMENT + + Token value indicating that a type comment was recognized. Such + tokens are only produced when *note ast.parse(): 619. is invoked + with ‘type_comments=True’. + +Changed in version 3.5: Added *note AWAIT: 3e61. and *note ASYNC: 3e62. +tokens. + +Changed in version 3.7: Added *note COMMENT: 3e69, *note NL: 3e6a. and +*note ENCODING: 3e6b. tokens. + +Changed in version 3.7: Removed *note AWAIT: 3e61. and *note ASYNC: +3e62. tokens. “async” and “await” are now tokenized as *note NAME: +3e2b. tokens. + +Changed in version 3.8: Added *note TYPE_COMMENT: 3e64, *note +TYPE_IGNORE: 3e63, *note COLONEQUAL: 3e5f. Added *note AWAIT: 3e61. and +*note ASYNC: 3e62. tokens back (they’re needed to support parsing older +Python versions for *note ast.parse(): 619. with ‘feature_version’ set +to 6 or lower). + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/token.py + + +File: python.info, Node: keyword — Testing for Python keywords, Next: tokenize — Tokenizer for Python source, Prev: token — Constants used with Python parse trees, Up: Python Language Services + +5.32.4 ‘keyword’ — Testing for Python keywords +---------------------------------------------- + +`Source code:' Lib/keyword.py(1) + +__________________________________________________________________ + +This module allows a Python program to determine if a string is a *note +keyword: 1884. or *note soft keyword: 3ff. + + -- Function: keyword.iskeyword (s) + + Return ‘True’ if `s' is a Python *note keyword: 1884. + + -- Data: keyword.kwlist + + Sequence containing all the *note keywords: 1884. defined for the + interpreter. If any keywords are defined to only be active when + particular *note __future__: 0. statements are in effect, these + will be included as well. + + -- Function: keyword.issoftkeyword (s) + + Return ‘True’ if `s' is a Python *note soft keyword: 3ff. + + New in version 3.9. + + -- Data: keyword.softkwlist + + Sequence containing all the *note soft keywords: 3ff. defined for + the interpreter. If any soft keywords are defined to only be + active when particular *note __future__: 0. statements are in + effect, these will be included as well. + + New in version 3.9. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/keyword.py + + +File: python.info, Node: tokenize — Tokenizer for Python source, Next: tabnanny — Detection of ambiguous indentation, Prev: keyword — Testing for Python keywords, Up: Python Language Services + +5.32.5 ‘tokenize’ — Tokenizer for Python source +----------------------------------------------- + +`Source code:' Lib/tokenize.py(1) + +__________________________________________________________________ + +The *note tokenize: 11a. 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 *note operator: 18eb. and *note +delimiter: 18ec. tokens and *note Ellipsis: 1bd0. are returned using the +generic *note OP: 3e60. token type. The exact type can be determined by +checking the ‘exact_type’ property on the *note named tuple: 221. +returned from *note tokenize.tokenize(): f70. + +* Menu: + +* Tokenizing Input:: +* Command-Line Usage: Command-Line Usage<3>. +* Examples: Examples<34>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tokenize.py + + +File: python.info, Node: Tokenizing Input, Next: Command-Line Usage<3>, Up: tokenize — Tokenizer for Python source + +5.32.5.1 Tokenizing Input +......................... + +The primary entry point is a *note generator: d11.: + + -- Function: tokenize.tokenize (readline) + + The *note tokenize(): f70. generator requires one argument, + `readline', which must be a callable object which provides the same + interface as the *note io.IOBase.readline(): 1ce1. 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 ‘(srow, scol)’ of ints specifying the + row and column where the token begins in the source; a 2-tuple + ‘(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 *note named tuple: 221. with + the field names: ‘type string start end line’. + + The returned *note named tuple: 221. has an additional property + named ‘exact_type’ that contains the exact operator type for *note + OP: 3e60. tokens. For all other token types ‘exact_type’ equals + the named tuple ‘type’ field. + + Changed in version 3.1: Added support for named tuples. + + Changed in version 3.3: Added support for ‘exact_type’. + + *note tokenize(): f70. determines the source encoding of the file + by looking for a UTF-8 BOM or encoding cookie, according to PEP + 263(1). + + -- Function: tokenize.generate_tokens (readline) + + Tokenize a source reading unicode strings instead of bytes. + + Like *note tokenize(): f70, the `readline' argument is a callable + returning a single line of input. However, *note + generate_tokens(): 147e. expects `readline' to return a str object + rather than bytes. + + The result is an iterator yielding named tuples, exactly like *note + tokenize(): f70. It does not yield an *note ENCODING: 3e6b. token. + +All constants from the *note token: 119. module are also exported from +*note tokenize: 11a. + +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. + + -- 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 reconstructed script is returned as a single string. 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 *note ENCODING: 3e6b. token, + which is the first token sequence output by *note tokenize(): f70. + If there is no encoding token in the input, it returns a str + instead. + +*note tokenize(): f70. needs to detect the encoding of source files it +tokenizes. The function it uses to do this is available: + + -- Function: tokenize.detect_encoding (readline) + + The *note detect_encoding(): 227f. 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 *note + tokenize(): f70. 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 PEP 263(2). If both a BOM and a + cookie are present, but disagree, a *note SyntaxError: 2d6. will be + raised. Note that if the BOM is found, ‘'utf-8-sig'’ will be + returned as an encoding. + + If no encoding is specified, then the default of ‘'utf-8'’ will be + returned. + + Use *note open(): 227e. to open Python source files: it uses *note + detect_encoding(): 227f. to detect the file encoding. + + -- Function: tokenize.open (filename) + + Open a file in read only mode using the encoding detected by *note + detect_encoding(): 227f. + + New in version 3.2. + + -- 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: + + """Beginning of + docstring + + or: + + [1, + 2, + 3 + +Note that unclosed single-quoted strings do not cause an error to be +raised. They are tokenized as *note ERRORTOKEN: 3e66, followed by the +tokenization of their contents. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0263/ + + (2) https://peps.python.org/pep-0263/ + + +File: python.info, Node: Command-Line Usage<3>, Next: Examples<34>, Prev: Tokenizing Input, Up: tokenize — Tokenizer for Python source + +5.32.5.2 Command-Line Usage +........................... + +New in version 3.3. + +The *note tokenize: 11a. module can be executed as a script from the +command line. It is as simple as: + + python -m tokenize [-e] [filename.py] + +The following options are accepted: + + -- Program Option: -h, --help + + show this help message and exit + + -- Program Option: -e, --exact + + display token names using the exact type + +If ‘filename.py’ is specified its contents are tokenized to stdout. +Otherwise, tokenization is performed on stdin. + + +File: python.info, Node: Examples<34>, Prev: Command-Line Usage<3>, Up: tokenize — Tokenizer for Python source + +5.32.5.3 Examples +................. + +Example of a script rewriter that transforms float literals into Decimal +objects: + + 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') + +Example of tokenizing from the command line. The script: + + def say_hello(): + print("Hello, World!") + + say_hello() + +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) + + $ 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 '' + 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 '' + +The exact token type names can be displayed using the *note -e: 3e7a. +option: + + $ 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 '' + 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 '' + +Example of tokenizing a file programmatically, reading unicode strings +instead of bytes with *note generate_tokens(): 147e.: + + import tokenize + + with tokenize.open('hello.py') as f: + tokens = tokenize.generate_tokens(f.readline) + for token in tokens: + print(token) + +Or reading bytes directly with *note tokenize(): f70.: + + import tokenize + + with open('hello.py', 'rb') as f: + tokens = tokenize.tokenize(f.readline) + for token in tokens: + print(token) + + +File: python.info, Node: tabnanny — Detection of ambiguous indentation, Next: pyclbr — Python module browser support, Prev: tokenize — Tokenizer for Python source, Up: Python Language Services + +5.32.6 ‘tabnanny’ — Detection of ambiguous indentation +------------------------------------------------------ + +`Source code:' Lib/tabnanny.py(1) + +__________________________________________________________________ + +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 +*note check(): 3e7f. described below. + + Note: The API provided by this module is likely to change in future + releases; such changes may not be backward compatible. + + -- 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 ‘.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 *note print(): c13. function. + + -- Data: tabnanny.verbose + + Flag indicating whether to print verbose messages. This is + incremented by the ‘-v’ option if called as a script. + + -- 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 + ‘-q’ option if called as a script. + + -- Exception: tabnanny.NannyNag + + Raised by *note process_tokens(): 3e83. if detecting an ambiguous + indent. Captured and handled in *note check(): 3e7f. + + -- Function: tabnanny.process_tokens (tokens) + + This function is used by *note check(): 3e7f. to process tokens + generated by the *note tokenize: 11a. module. + +See also +........ + +Module *note tokenize: 11a. + + Lexical scanner for Python source code. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tabnanny.py + + +File: python.info, Node: pyclbr — Python module browser support, Next: py_compile — Compile Python source files, Prev: tabnanny — Detection of ambiguous indentation, Up: Python Language Services + +5.32.7 ‘pyclbr’ — Python module browser support +----------------------------------------------- + +`Source code:' Lib/pyclbr.py(1) + +__________________________________________________________________ + +The *note pyclbr: d5. 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. + + -- 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 + ‘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. + + -- 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 ‘def’ or ‘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 ‘'__path__'’ whose value is a + list containing the package search path. + +New 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>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/pyclbr.py + + +File: python.info, Node: Function Objects, Next: Class Objects<2>, Up: pyclbr — Python module browser support + +5.32.7.1 Function Objects +......................... + +Class ‘Function’ instances describe functions defined by def statements. +They have the following attributes: + + -- Attribute: Function.file + + Name of the file in which the function is defined. + + -- Attribute: Function.module + + The name of the module defining the function described. + + -- Attribute: Function.name + + The name of the function. + + -- Attribute: Function.lineno + + The line number in the file where the definition starts. + + -- Attribute: Function.parent + + For top-level functions, None. For nested functions, the parent. + + New in version 3.7. + + -- Attribute: Function.children + + A dictionary mapping names to descriptors for nested functions and + classes. + + New in version 3.7. + + -- Attribute: Function.is_async + + ‘True’ for functions that are defined with the ‘async’ prefix, + ‘False’ otherwise. + + New in version 3.10. + + +File: python.info, Node: Class Objects<2>, Prev: Function Objects, Up: pyclbr — Python module browser support + +5.32.7.2 Class Objects +...................... + +Class ‘Class’ instances describe classes defined by class statements. +They have the same attributes as Functions and two more. + + -- Attribute: Class.file + + Name of the file in which the class is defined. + + -- Attribute: Class.module + + The name of the module defining the class described. + + -- Attribute: Class.name + + The name of the class. + + -- Attribute: Class.lineno + + The line number in the file where the definition starts. + + -- Attribute: Class.parent + + For top-level classes, None. For nested classes, the parent. + + New in version 3.7. + + -- Attribute: Class.children + + A dictionary mapping names to descriptors for nested functions and + classes. + + New in version 3.7. + + -- Attribute: Class.super + + A list of ‘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 *note + readmodule_ex(): 15a0. are listed as a string with the class name + instead of as ‘Class’ objects. + + -- Attribute: Class.methods + + A dictionary mapping method names to line numbers. This can be + derived from the newer children dictionary, but remains for + back-compatibility. + + +File: python.info, Node: py_compile — Compile Python source files, Next: compileall — Byte-compile Python libraries, Prev: pyclbr — Python module browser support, Up: Python Language Services + +5.32.8 ‘py_compile’ — Compile Python source files +------------------------------------------------- + +`Source code:' Lib/py_compile.py(1) + +__________________________________________________________________ + +The *note py_compile: d4. 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. + + -- Exception: py_compile.PyCompileError + + Exception raised when an error occurs while attempting to compile + the file. + + -- 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 PEP + 3147(2)/ PEP 488(3) path, ending in ‘.pyc’. For example, if `file' + is ‘/foo/bar/baz.py’ `cfile' will default to + ‘/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 *note + PyCompileError: 3e9b. is raised when an error is encountered while + compiling `file'. If `doraise' is false (the default), an error + string is written to ‘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 ‘sys.stderr’, and the function returns ‘None’ instead of + a path. If `doraise' is true, a *note PyCompileError: 3e9b. 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, *note FileExistsError: + ccc. 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 *note compile(): 310. function. The default of ‘-1’ + selects the optimization level of the current interpreter. + + `invalidation_mode' should be a member of the *note + PycInvalidationMode: 3e9c. enum and controls how the generated + bytecode cache is invalidated at runtime. The default is *note + PycInvalidationMode.CHECKED_HASH: 3e9d. if the ‘SOURCE_DATE_EPOCH’ + environment variable is set, otherwise the default is *note + PycInvalidationMode.TIMESTAMP: 3e9e. + + Changed in version 3.2: Changed default value of `cfile' to be PEP + 3147(4)-compliant. Previous default was `file' + ‘'c'’ (‘'o'’ if + optimization was enabled). Also added the `optimize' parameter. + + Changed in version 3.4: Changed code to use *note importlib: 97. + for the byte-code cache file writing. This means file + creation/writing semantics now match what *note importlib: 97. + does, e.g. permissions, write-and-move semantics, etc. Also added + the caveat that *note FileExistsError: ccc. 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 PEP 552(5). If the ‘SOURCE_DATE_EPOCH’ environment + variable is set, `invalidation_mode' will be forced to *note + PycInvalidationMode.CHECKED_HASH: 3e9d. + + Changed in version 3.7.2: The ‘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. + + -- Class: py_compile.PycInvalidationMode + + A enumeration of possible methods the interpreter can use to + determine whether a bytecode file is up to date with a source file. + The ‘.pyc’ file indicates the desired invalidation mode in its + header. See *note Cached bytecode invalidation: 1bd. for more + information on how Python invalidates ‘.pyc’ files at runtime. + + New in version 3.7. + + -- Attribute: TIMESTAMP + + The ‘.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 ‘.pyc’ file needs + to be regenerated. + + -- Attribute: CHECKED_HASH + + The ‘.pyc’ file includes a hash of the source file content, + which Python will compare against the source at runtime to + determine if the ‘.pyc’ file needs to be regenerated. + + -- Attribute: UNCHECKED_HASH + + Like *note CHECKED_HASH: 3e9d, the ‘.pyc’ file includes a hash + of the source file content. However, Python will at runtime + assume the ‘.pyc’ file is up to date and not validate the + ‘.pyc’ against the source file at all. + + This option is useful when the ‘.pycs’ are kept up to date by + some system external to Python like a build system. + +* Menu: + +* Command-Line Interface: Command-Line Interface<6>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/py_compile.py + + (2) https://peps.python.org/pep-3147/ + + (3) https://peps.python.org/pep-0488/ + + (4) https://peps.python.org/pep-3147/ + + (5) https://peps.python.org/pep-0552/ + + +File: python.info, Node: Command-Line Interface<6>, Up: py_compile — Compile Python source files + +5.32.8.1 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. + + -- Program Option: <file> ... <fileN> + -- Program Option: - + + Positional arguments are files to compile. If ‘-’ is the only + parameter, the list of files is taken from standard input. + + -- Program Option: -q, --quiet + + Suppress errors output. + +Changed in version 3.2: Added support for ‘-’. + +Changed in version 3.10: Added support for *note -q: 3ea5. + +See also +........ + +Module *note compileall: 1f. + + Utilities to compile all Python source files in a directory tree. + + +File: python.info, Node: compileall — Byte-compile Python libraries, Next: dis — Disassembler for Python bytecode, Prev: py_compile — Compile Python source files, Up: Python Language Services + +5.32.9 ‘compileall’ — Byte-compile Python libraries +--------------------------------------------------- + +`Source code:' Lib/compileall.py(1) + +__________________________________________________________________ + +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. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +* Menu: + +* Command-line use:: +* Public functions:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/compileall.py + + +File: python.info, Node: Command-line use, Next: Public functions, Up: compileall — Byte-compile Python libraries + +5.32.9.1 Command-line use +......................... + +This module can work as a script (using ‘python -m compileall’) to +compile Python sources. + + -- Program Option: directory ... + -- Program 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 ‘-l <directories from + sys.path>’. + + -- Program Option: -l + + Do not recurse into subdirectories, only compile source code files + directly contained in the named or implied directories. + + -- Program Option: -f + + Force rebuild even if timestamps are up-to-date. + + -- Program Option: -q + + Do not print the list of files compiled. If passed once, error + messages will still be printed. If passed twice (‘-qq’), all + output is suppressed. + + -- Program Option: -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. + + -- Program Option: -s strip_prefix + + -- Program Option: -p prepend_prefix + + Remove (‘-s’) or append (‘-p’) the given prefix of paths recorded + in the ‘.pyc’ files. Cannot be combined with ‘-d’. + + -- Program Option: -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. + + -- Program Option: -i list + + Read the file ‘list’ and add each line that it contains to the list + of files and directories to compile. If ‘list’ is ‘-’, read lines + from ‘stdin’. + + -- Program Option: -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 PEP 3147(1) + locations and names, which allows byte-code files from multiple + versions of Python to coexist. + + -- Program Option: -r + + Control the maximum recursion level for subdirectories. If this is + given, then ‘-l’ option will not be taken into account. ‘python -m + compileall <directory> -r 0’ is equivalent to ‘python -m compileall + <directory> -l’. + + -- Program Option: -j N + + Use `N' workers to compile the files within the given directory. + If ‘0’ is used, then the result of *note os.cpu_count(): 40a. will + be used. + + -- Program Option: --invalidation-mode + [timestamp|checked-hash|unchecked-hash] + + Control how the generated byte-code files are invalidated at + runtime. The ‘timestamp’ value, means that ‘.pyc’ files with the + source timestamp and size embedded will be generated. The + ‘checked-hash’ and ‘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 *note Cached bytecode + invalidation: 1bd. for more information on how Python validates + bytecode cache files at runtime. The default is ‘timestamp’ if the + ‘SOURCE_DATE_EPOCH’ environment variable is not set, and + ‘checked-hash’ if the ‘SOURCE_DATE_EPOCH’ environment variable is + set. + + -- Program Option: -o level + + Compile with the given optimization level. May be used multiple + times to compile for multiple levels at a time (for example, + ‘compileall -o 1 -o 2’). + + -- Program Option: -e dir + + Ignore symlinks pointing outside the given directory. + + -- Program Option: --hardlink-dupes + + If two ‘.pyc’ files with different optimization level have the same + content, use hard links to consolidate duplicate files. + +Changed in version 3.2: Added the ‘-i’, ‘-b’ and ‘-h’ options. + +Changed in version 3.5: Added the ‘-j’, ‘-r’, and ‘-qq’ options. ‘-q’ +option was changed to a multilevel value. ‘-b’ will always produce a +byte-code file ending in ‘.pyc’, never ‘.pyo’. + +Changed in version 3.7: Added the ‘--invalidation-mode’ option. + +Changed in version 3.9: Added the ‘-s’, ‘-p’, ‘-e’ and +‘--hardlink-dupes’ options. Raised the default recursion limit from 10 +to *note sys.getrecursionlimit(): 116f. Added the possibility to +specify the ‘-o’ option multiple times. + +There is no command-line option to control the optimization level used +by the *note compile(): 310. function, because the Python interpreter +itself already provides the option: ‘python -O -m compileall’. + +Similarly, the *note compile(): 310. function respects the *note +sys.pycache_prefix: 5f4. setting. The generated bytecode cache will +only be useful if *note compile(): 310. is run with the same *note +sys.pycache_prefix: 5f4. (if any) that will be used at runtime. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + +File: python.info, Node: Public functions, Prev: Command-line use, Up: compileall — Byte-compile Python libraries + +5.32.9.2 Public functions +......................... + + -- 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 ‘.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 ‘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 ‘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 *note re.Pattern: c24. + object. + + If `quiet' is ‘False’ or ‘0’ (the default), the filenames and other + information are printed to standard out. Set to ‘1’, only errors + are printed. Set to ‘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 + PEP 3147(1) 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 *note compile(): 310. function. Accepts + also a sequence of optimization levels which lead to multiple + compilations of one ‘.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 ‘0’, a *note ValueError: 1c8. + will be raised. + + `invalidation_mode' should be a member of the *note + py_compile.PycInvalidationMode: 3e9c. enum and controls how the + generated pycs are invalidated at runtime. + + The `stripdir', `prependdir' and `limit_sl_dest' arguments + correspond to the ‘-s’, ‘-p’ and ‘-e’ options described above. + They may be specified as ‘str’, ‘bytes’ or *note os.PathLike: 8bf. + + If `hardlink_dupes' is true and two ‘.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 + ‘.pyc’ files, not ‘.pyo’ files no matter what the value of + `optimize' is. + + Changed in version 3.6: Accepts a *note path-like object: 773. + + 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 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 ‘10’ to ‘sys.getrecursionlimit()’ + + -- 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 ‘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 ‘True’ is returned. This can be used to + exclude files matching a regular expression, given as a *note + re.Pattern: c24. object. + + If `quiet' is ‘False’ or ‘0’ (the default), the filenames and other + information are printed to standard out. Set to ‘1’, only errors + are printed. Set to ‘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 + PEP 3147(2) 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 *note compile(): 310. function. Accepts + also a sequence of optimization levels which lead to multiple + compilations of one ‘.py’ file in one call. + + `invalidation_mode' should be a member of the *note + py_compile.PycInvalidationMode: 3e9c. enum and controls how the + generated pycs are invalidated at runtime. + + The `stripdir', `prependdir' and `limit_sl_dest' arguments + correspond to the ‘-s’, ‘-p’ and ‘-e’ options described above. + They may be specified as ‘str’, ‘bytes’ or *note os.PathLike: 8bf. + + If `hardlink_dupes' is true and two ‘.pyc’ files with different + optimization level have the same content, use hard links to + consolidate duplicate files. + + New 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 + ‘.pyc’ files, not ‘.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 None. + + Changed in version 3.9: Added `stripdir', `prependdir', + `limit_sl_dest' and `hardlink_dupes' arguments. + + -- Function: compileall.compile_path (skip_curdir=True, maxlevels=0, + force=False, quiet=0, legacy=False, optimize=- 1, + invalidation_mode=None) + + Byte-compile all the ‘.py’ files found along ‘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 + *note compile_dir(): 77b. function. Note that unlike the other + compile functions, ‘maxlevels’ defaults to ‘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 + ‘.pyc’ files, not ‘.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 None. + +To force a recompile of all the ‘.py’ files in the ‘Lib/’ subdirectory +and all its subdirectories: + + 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) + +See also +........ + +Module *note py_compile: d4. + + Byte-compile a single source file. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + (2) https://peps.python.org/pep-3147/ + + +File: python.info, Node: dis — Disassembler for Python bytecode, Next: pickletools — Tools for pickle developers, Prev: compileall — Byte-compile Python libraries, Up: Python Language Services + +5.32.10 ‘dis’ — Disassembler for Python bytecode +------------------------------------------------ + +`Source code:' Lib/dis.py(1) + +__________________________________________________________________ + +The *note dis: 36. module supports the analysis of CPython *note +bytecode: 16f. by disassembling it. The CPython bytecode which this +module takes as an input is defined in the file ‘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 *note CACHE: 2b7. +instructions. These instructions are hidden by default, but can be +shown by passing ‘show_caches=True’ to any *note dis: 36. utility. + +Example: Given the function ‘myfunc()’: + + def myfunc(alist): + return len(alist) + +the following command can be used to display the disassembly of +‘myfunc()’: + + >>> dis.dis(myfunc) + 2 0 RESUME 0 + + 3 2 LOAD_GLOBAL 1 (NULL + len) + 14 LOAD_FAST 0 (alist) + 16 PRECALL 1 + 20 CALL 1 + 30 RETURN_VALUE + +(The “2” is a line number). + +* Menu: + +* Bytecode analysis:: +* Analysis functions:: +* Python Bytecode Instructions:: +* Opcode collections:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/dis.py + + +File: python.info, Node: Bytecode analysis, Next: Analysis functions, Up: dis — Disassembler for Python bytecode + +5.32.10.1 Bytecode analysis +........................... + +New in version 3.4. + +The bytecode analysis API allows pieces of Python code to be wrapped in +a *note Bytecode: bc8. object that provides easy access to details of +the compiled code. + + -- Class: dis.Bytecode (x, *, first_line=None, current_offset=None, + show_caches=False) + + Analyse the bytecode corresponding to a function, generator, + asynchronous generator, coroutine, method, string of source code, + or a code object (as returned by *note compile(): 310.). + + This is a convenience wrapper around many of the functions listed + below, most notably *note get_instructions(): bc7, as iterating + over a *note Bytecode: bc8. instance yields the bytecode operations + as *note Instruction: bc6. instances. + + If `first_line' is not ‘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 ‘None’, it refers to an instruction + offset in the disassembled code. Setting this means *note dis(): + bc9. will display a “current instruction” marker against the + specified opcode. + + -- Method: classmethod from_traceback (tb, *, show_caches=False) + + Construct a *note Bytecode: bc8. instance from the given + traceback, setting `current_offset' to the instruction + responsible for the exception. + + -- Data: codeobj + + The compiled code object. + + -- Data: first_line + + The first source line of the code object (if available) + + -- Method: dis () + + Return a formatted view of the bytecode operations (the same + as printed by *note dis.dis(): 78a, but returned as a + multi-line string). + + -- Method: info () + + Return a formatted multi-line string with detailed information + about the code object, like *note code_info(): ef7. + + Changed in version 3.7: This can now handle coroutine and + asynchronous generator objects. + + Changed in version 3.11: Added the ‘show_caches’ parameter. + +Example: + + >>> bytecode = dis.Bytecode(myfunc) + >>> for instr in bytecode: + ... print(instr.opname) + ... + RESUME + LOAD_GLOBAL + LOAD_FAST + PRECALL + CALL + RETURN_VALUE + + +File: python.info, Node: Analysis functions, Next: Python Bytecode Instructions, Prev: Bytecode analysis, Up: dis — Disassembler for Python bytecode + +5.32.10.2 Analysis functions +............................ + +The *note dis: 36. 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: + + -- 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. + + New in version 3.2. + + Changed in version 3.7: This can now handle coroutine and + asynchronous generator objects. + + -- 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 + ‘sys.stdout’ if `file' is not specified). + + This is a convenient shorthand for ‘print(code_info(x), + file=file)’, intended for interactive exploration at the + interpreter prompt. + + New in version 3.2. + + Changed in version 3.4: Added `file' parameter. + + -- Function: dis.dis (x=None, *, file=None, depth=None, + show_caches=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 (the code of + comprehensions, generator expressions and nested functions, and the + code used for building nested classes). Strings are first compiled + to code objects with the *note compile(): 310. 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 ‘sys.stdout’ otherwise. + + The maximal depth of recursion is limited by `depth' unless it is + ‘None’. ‘depth=0’ means no recursion. + + 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’ parameter. + + -- Function: dis.distb (tb=None, *, file=None, show_caches=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 ‘sys.stdout’ otherwise. + + Changed in version 3.4: Added `file' parameter. + + Changed in version 3.11: Added the ‘show_caches’ parameter. + + -- Function: dis.disassemble (code, lasti=- 1, *, file=None, + show_caches=False) + -- Function: dis.disco (code, lasti=- 1, *, file=None, + show_caches=False) + + Disassemble a code object, indicating the last instruction if + `lasti' was provided. The output is divided in the following + columns: + + 1. the line number, for the first instruction of each line + + 2. the current instruction, indicated as ‘-->’, + + 3. a labelled instruction, indicated with ‘>>’, + + 4. the address of the instruction, + + 5. the operation code name, + + 6. operation parameters, and + + 7. interpretation of the parameters in parentheses. + + 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 ‘sys.stdout’ otherwise. + + Changed in version 3.4: Added `file' parameter. + + Changed in version 3.11: Added the ‘show_caches’ parameter. + + -- Function: dis.get_instructions (x, *, first_line=None, + show_caches=False) + + Return an iterator over the instructions in the supplied function, + method, source code string or code object. + + The iterator generates a series of *note Instruction: bc6. named + tuples giving the details of each operation in the supplied code. + + If `first_line' is not ‘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. + + New in version 3.4. + + Changed in version 3.11: Added the ‘show_caches’ parameter. + + -- Function: dis.findlinestarts (code) + + This generator function uses the ‘co_lines’ method of the code + object `code' to find the offsets which are starts of lines in the + source code. They are generated as ‘(offset, lineno)’ pairs. + + Changed in version 3.6: Line numbers can be decreasing. Before, + they were always increasing. + + Changed in version 3.10: The PEP 626(1) ‘co_lines’ method is used + instead of the ‘co_firstlineno’ and ‘co_lnotab’ attributes of the + code object. + + -- 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. + + -- 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 ‘True’, *note + stack_effect(): bcb. will return the stack effect of jumping. If + `jump' is ‘False’, it will return the stack effect of not jumping. + And if `jump' is ‘None’ (default), it will return the maximal stack + effect of both cases. + + New in version 3.4. + + Changed in version 3.8: Added `jump' parameter. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0626/ + + +File: python.info, Node: Python Bytecode Instructions, Next: Opcode collections, Prev: Analysis functions, Up: dis — Disassembler for Python bytecode + +5.32.10.3 Python Bytecode Instructions +...................................... + +The *note get_instructions(): bc7. function and *note Bytecode: bc8. +class provide details of bytecode instructions as *note Instruction: +bc6. instances: + + -- Class: dis.Instruction + + Details for a bytecode operation + + -- Data: opcode + + numeric code for operation, corresponding to the opcode values + listed below and the bytecode values in the *note Opcode + collections: 3eca. + + -- Data: opname + + human readable name for operation + + -- Data: arg + + numeric argument to operation (if any), otherwise ‘None’ + + -- Data: argval + + resolved arg value (if any), otherwise ‘None’ + + -- Data: argrepr + + human readable description of operation argument (if any), + otherwise an empty string. + + -- Data: offset + + start index of operation within bytecode sequence + + -- Data: starts_line + + line started by this opcode (if any), otherwise ‘None’ + + -- Data: is_jump_target + + ‘True’ if other code jumps to here, otherwise ‘False’ + + -- Data: positions + + *note dis.Positions: 3c97. object holding the start and end + locations that are covered by this instruction. + + New in version 3.4. + + Changed in version 3.11: Field ‘positions’ is added. + + -- Class: dis.Positions + + In case the information is not available, some fields might be + ‘None’. + + -- Data: lineno + + -- Data: end_lineno + + -- Data: col_offset + + -- Data: end_col_offset + + New in version 3.11. + +The Python compiler currently generates the following bytecode +instructions. + +`General instructions' + + -- Opcode: NOP + + Do nothing code. Used as a placeholder by the bytecode optimizer, + and to generate line tracing events. + + -- Opcode: POP_TOP + + Removes the top-of-stack (TOS) item. + + -- Opcode: COPY (i) + + Push the `i'-th item to the top of the stack. The item is not + removed from its original location. + + New in version 3.11. + + -- Opcode: SWAP (i) + + Swap TOS with the item at position `i'. + + New in version 3.11. + + -- 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 ‘dis’ + utilities, but can be viewed with ‘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. + + New in version 3.11. + +`Unary operations' + +Unary operations take the top of the stack, apply the operation, and +push the result back on the stack. + + -- Opcode: UNARY_POSITIVE + + Implements ‘TOS = +TOS’. + + -- Opcode: UNARY_NEGATIVE + + Implements ‘TOS = -TOS’. + + -- Opcode: UNARY_NOT + + Implements ‘TOS = not TOS’. + + -- Opcode: UNARY_INVERT + + Implements ‘TOS = ~TOS’. + + -- Opcode: GET_ITER + + Implements ‘TOS = iter(TOS)’. + + -- Opcode: GET_YIELD_FROM_ITER + + If ‘TOS’ is a *note generator iterator: 844. or *note coroutine: + 525. object it is left as is. Otherwise, implements ‘TOS = + iter(TOS)’. + + New in version 3.5. + +`Binary and in-place operations' + +Binary operations remove the top of the stack (TOS) and the second +top-most stack item (TOS1) from the stack. They perform the operation, +and put the result back on the stack. + +In-place operations are like binary operations, in that they remove TOS +and TOS1, and push the result back on the stack, but the operation is +done in-place when TOS1 supports it, and the resulting TOS may be (but +does not have to be) the original TOS1. + + -- Opcode: BINARY_OP (op) + + Implements the binary and in-place operators (depending on the + value of `op'). + + New in version 3.11. + + -- Opcode: BINARY_SUBSCR + + Implements ‘TOS = TOS1[TOS]’. + + -- Opcode: STORE_SUBSCR + + Implements ‘TOS1[TOS] = TOS2’. + + -- Opcode: DELETE_SUBSCR + + Implements ‘del TOS1[TOS]’. + +`Coroutine opcodes' + + -- Opcode: GET_AWAITABLE (where) + + Implements ‘TOS = get_awaitable(TOS)’, where ‘get_awaitable(o)’ + returns ‘o’ if ‘o’ is a coroutine object or a generator object with + the CO_ITERABLE_COROUTINE flag, or resolves ‘o.__await__’. + + If the ‘where’ operand is nonzero, it indicates where the + instruction occurs: + + * ‘1’ After a call to ‘__aenter__’ + + * ‘2’ After a call to ‘__aexit__’ + + New in version 3.5. + + Changed in version 3.11: Previously, this instruction did not have + an oparg. + + -- Opcode: GET_AITER + + Implements ‘TOS = TOS.__aiter__()’. + + New in version 3.5. + + Changed in version 3.7: Returning awaitable objects from + ‘__aiter__’ is no longer supported. + + -- Opcode: GET_ANEXT + + Pushes ‘get_awaitable(TOS.__anext__())’ to the stack. See + ‘GET_AWAITABLE’ for details about ‘get_awaitable’. + + New in version 3.5. + + -- Opcode: END_ASYNC_FOR + + Terminates an *note async for: 708. loop. Handles an exception + raised when awaiting a next item. If TOS is *note + StopAsyncIteration: 1460. pop 3 values from the stack and restore + the exception state using the second of them. Otherwise re-raise + the exception using the value from the stack. An exception handler + block is removed from the block stack. + + New in version 3.8: + + Changed in version 3.11: Exception representation on the stack now + consist of one, not three, items. + + -- Opcode: BEFORE_ASYNC_WITH + + Resolves ‘__aenter__’ and ‘__aexit__’ from the object on top of the + stack. Pushes ‘__aexit__’ and result of ‘__aenter__()’ to the + stack. + + New in version 3.5. + +`Miscellaneous opcodes' + + -- Opcode: PRINT_EXPR + + Implements the expression statement for the interactive mode. TOS + is removed from the stack and printed. In non-interactive mode, an + expression statement is terminated with *note POP_TOP: 3ed8. + + -- Opcode: SET_ADD (i) + + Calls ‘set.add(TOS1[-i], TOS)’. Used to implement set + comprehensions. + + -- Opcode: LIST_APPEND (i) + + Calls ‘list.append(TOS1[-i], TOS)’. Used to implement list + comprehensions. + + -- Opcode: MAP_ADD (i) + + Calls ‘dict.__setitem__(TOS1[-i], TOS1, TOS)’. Used to implement + dict comprehensions. + + New in version 3.1. + + Changed in version 3.8: Map value is TOS and map key is TOS1. + Before, those were reversed. + +For all of the *note SET_ADD: 3ee4, *note LIST_APPEND: 3ee5. and *note +MAP_ADD: 709. 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. + + -- Opcode: RETURN_VALUE + + Returns with TOS to the caller of the function. + + -- Opcode: YIELD_VALUE + + Pops TOS and yields it from a *note generator: d11. + + -- Opcode: SETUP_ANNOTATIONS + + Checks whether ‘__annotations__’ is defined in ‘locals()’, if not + it is set up to an empty ‘dict’. This opcode is only emitted if a + class or module body contains *note variable annotations: 9d2. + statically. + + New in version 3.6. + + -- Opcode: IMPORT_STAR + + Loads all symbols not starting with ‘'_'’ directly from the module + TOS to the local namespace. The module is popped after loading all + names. This opcode implements ‘from module import *’. + + -- 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. + + -- 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 ‘f_lasti’ of the current frame. + + New in version 3.9. + + Changed in version 3.11: Exception representation on the stack now + consist of one, not three, items. + + -- 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. + + New in version 3.11. + + -- Opcode: CHECK_EXC_MATCH + + Performs exception matching for ‘except’. Tests whether the TOS1 + is an exception matching TOS. Pops TOS and pushes the boolean + result of the test. + + New in version 3.11. + + -- Opcode: CHECK_EG_MATCH + + Performs exception matching for ‘except*’. Applies ‘split(TOS)’ on + the exception group representing TOS1. + + In case of a match, pops two items from the stack and pushes the + non-matching subgroup (‘None’ in case of full match) followed by + the matching subgroup. When there is no match, pops one item (the + match type) and pushes ‘None’. + + New in version 3.11. + + -- Opcode: PREP_RERAISE_STAR + + Combines the raised and reraised exceptions list from TOS, into an + exception group to propagate from a try-except* block. Uses the + original exception group from TOS1 to reconstruct the structure of + reraised exceptions. Pops two items from the stack and pushes the + exception to reraise or ‘None’ if there isn’t one. + + New in version 3.11. + + -- 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 ‘context_manager.__exit__(*exc_info())’ when + an exception has occurred in a *note with: 19e. statement. + + New in version 3.9. + + Changed in version 3.11: The ‘__exit__’ function is in position 4 + of the stack rather than 7. Exception representation on the stack + now consist of one, not three, items. + + -- Opcode: LOAD_ASSERTION_ERROR + + Pushes *note AssertionError: 26e. onto the stack. Used by the + *note assert: 5bc. statement. + + New in version 3.9. + + -- Opcode: LOAD_BUILD_CLASS + + Pushes ‘builtins.__build_class__()’ onto the stack. It is later + called to construct a class. + + -- Opcode: BEFORE_WITH (delta) + + This opcode performs several operations before a with block starts. + First, it loads *note __exit__(): 1978. from the context manager + and pushes it onto the stack for later use by *note + WITH_EXCEPT_START: 3eec. Then, *note __enter__(): 18e. is called. + Finally, the result of calling the ‘__enter__()’ method is pushed + onto the stack. + + New in version 3.11. + + -- Opcode: GET_LEN + + Push ‘len(TOS)’ onto the stack. + + New in version 3.10. + + -- Opcode: MATCH_MAPPING + + If TOS is an instance of *note collections.abc.Mapping: 505. (or, + more technically: if it has the *note Py_TPFLAGS_MAPPING: 12a1. + flag set in its *note tp_flags: 12c3.), push ‘True’ onto the stack. + Otherwise, push ‘False’. + + New in version 3.10. + + -- Opcode: MATCH_SEQUENCE + + If TOS is an instance of *note collections.abc.Sequence: 12a3. and + is `not' an instance of *note str: 1b3./*note bytes: 1b4./*note + bytearray: 1a5. (or, more technically: if it has the *note + Py_TPFLAGS_SEQUENCE: 12a2. flag set in its *note tp_flags: 12c3.), + push ‘True’ onto the stack. Otherwise, push ‘False’. + + New in version 3.10. + + -- Opcode: MATCH_KEYS + + TOS is a tuple of mapping keys, and TOS1 is the match subject. If + TOS1 contains all of the keys in TOS, push a *note tuple: 539. + containing the corresponding values. Otherwise, push ‘None’. + + New in version 3.10. + + Changed in version 3.11: Previously, this instruction also pushed a + boolean value indicating success (‘True’) or failure (‘False’). + + -- Opcode: STORE_NAME (namei) + + Implements ‘name = TOS’. `namei' is the index of `name' in the + attribute ‘co_names’ of the code object. The compiler tries to use + *note STORE_FAST: 3ef3. or *note STORE_GLOBAL: 3ef4. if possible. + + -- Opcode: DELETE_NAME (namei) + + Implements ‘del name’, where `namei' is the index into ‘co_names’ + attribute of the code object. + + -- Opcode: UNPACK_SEQUENCE (count) + + Unpacks TOS into `count' individual values, which are put onto the + stack right-to-left. + + -- Opcode: UNPACK_EX (counts) + + Implements assignment with a starred target: Unpacks an iterable in + TOS 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 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 resulting values are put onto the stack right-to-left. + + -- Opcode: STORE_ATTR (namei) + + Implements ‘TOS.name = TOS1’, where `namei' is the index of name in + ‘co_names’. + + -- Opcode: DELETE_ATTR (namei) + + Implements ‘del TOS.name’, using `namei' as index into ‘co_names’. + + -- Opcode: STORE_GLOBAL (namei) + + Works as *note STORE_NAME: 3ef2, but stores the name as a global. + + -- Opcode: DELETE_GLOBAL (namei) + + Works as *note DELETE_NAME: 3ef5, but deletes a global name. + + -- Opcode: LOAD_CONST (consti) + + Pushes ‘co_consts[consti]’ onto the stack. + + -- Opcode: LOAD_NAME (namei) + + Pushes the value associated with ‘co_names[namei]’ onto the stack. + + -- Opcode: BUILD_TUPLE (count) + + Creates a tuple consuming `count' items from the stack, and pushes + the resulting tuple onto the stack. + + -- Opcode: BUILD_LIST (count) + + Works as *note BUILD_TUPLE: 3efb, but creates a list. + + -- Opcode: BUILD_SET (count) + + Works as *note BUILD_TUPLE: 3efb, but creates a set. + + -- Opcode: BUILD_MAP (count) + + Pushes a new dictionary object onto the stack. Pops ‘2 * count’ + items so that the dictionary holds `count' entries: ‘{..., TOS3: + TOS2, TOS1: TOS}’. + + Changed in version 3.5: The dictionary is created from stack items + instead of creating an empty dictionary pre-sized to hold `count' + items. + + -- Opcode: BUILD_CONST_KEY_MAP (count) + + The version of *note BUILD_MAP: 3efe. specialized for constant + keys. Pops the top element on the stack which contains a tuple of + keys, then starting from ‘TOS1’, pops `count' values to form values + in the built dictionary. + + New in version 3.6. + + -- Opcode: BUILD_STRING (count) + + Concatenates `count' strings from the stack and pushes the + resulting string onto the stack. + + New in version 3.6. + + -- Opcode: LIST_TO_TUPLE + + Pops a list from the stack and pushes a tuple containing the same + values. + + New in version 3.9. + + -- Opcode: LIST_EXTEND (i) + + Calls ‘list.extend(TOS1[-i], TOS)’. Used to build lists. + + New in version 3.9. + + -- Opcode: SET_UPDATE (i) + + Calls ‘set.update(TOS1[-i], TOS)’. Used to build sets. + + New in version 3.9. + + -- Opcode: DICT_UPDATE (i) + + Calls ‘dict.update(TOS1[-i], TOS)’. Used to build dicts. + + New in version 3.9. + + -- Opcode: DICT_MERGE (i) + + Like *note DICT_UPDATE: 3f02. but raises an exception for duplicate + keys. + + New in version 3.9. + + -- Opcode: LOAD_ATTR (namei) + + Replaces TOS with ‘getattr(TOS, co_names[namei])’. + + -- Opcode: COMPARE_OP (opname) + + Performs a Boolean operation. The operation name can be found in + ‘cmp_op[opname]’. + + -- Opcode: IS_OP (invert) + + Performs ‘is’ comparison, or ‘is not’ if ‘invert’ is 1. + + New in version 3.9. + + -- Opcode: CONTAINS_OP (invert) + + Performs ‘in’ comparison, or ‘not in’ if ‘invert’ is 1. + + New in version 3.9. + + -- Opcode: IMPORT_NAME (namei) + + Imports the module ‘co_names[namei]’. TOS and TOS1 are popped and + provide the `fromlist' and `level' arguments of *note __import__(): + 510. The module object is pushed onto the stack. The current + namespace is not affected: for a proper import statement, a + subsequent *note STORE_FAST: 3ef3. instruction modifies the + namespace. + + -- Opcode: IMPORT_FROM (namei) + + Loads the attribute ‘co_names[namei]’ from the module found in TOS. + The resulting object is pushed onto the stack, to be subsequently + stored by a *note STORE_FAST: 3ef3. instruction. + + -- Opcode: JUMP_FORWARD (delta) + + Increments bytecode counter by `delta'. + + -- Opcode: JUMP_BACKWARD (delta) + + Decrements bytecode counter by `delta'. Checks for interrupts. + + New in version 3.11. + + -- Opcode: JUMP_BACKWARD_NO_INTERRUPT (delta) + + Decrements bytecode counter by `delta'. Does not check for + interrupts. + + New in version 3.11. + + -- Opcode: POP_JUMP_FORWARD_IF_TRUE (delta) + + If TOS is true, increments the bytecode counter by `delta'. TOS is + popped. + + New in version 3.11. + + -- Opcode: POP_JUMP_BACKWARD_IF_TRUE (delta) + + If TOS is true, decrements the bytecode counter by `delta'. TOS is + popped. + + New in version 3.11. + + -- Opcode: POP_JUMP_FORWARD_IF_FALSE (delta) + + If TOS is false, increments the bytecode counter by `delta'. TOS + is popped. + + New in version 3.11. + + -- Opcode: POP_JUMP_BACKWARD_IF_FALSE (delta) + + If TOS is false, decrements the bytecode counter by `delta'. TOS + is popped. + + New in version 3.11. + + -- Opcode: POP_JUMP_FORWARD_IF_NOT_NONE (delta) + + If TOS is not ‘None’, increments the bytecode counter by `delta'. + TOS is popped. + + New in version 3.11. + + -- Opcode: POP_JUMP_BACKWARD_IF_NOT_NONE (delta) + + If TOS is not ‘None’, decrements the bytecode counter by `delta'. + TOS is popped. + + New in version 3.11. + + -- Opcode: POP_JUMP_FORWARD_IF_NONE (delta) + + If TOS is ‘None’, increments the bytecode counter by `delta'. TOS + is popped. + + New in version 3.11. + + -- Opcode: POP_JUMP_BACKWARD_IF_NONE (delta) + + If TOS is ‘None’, decrements the bytecode counter by `delta'. TOS + is popped. + + New in version 3.11. + + -- Opcode: JUMP_IF_TRUE_OR_POP (delta) + + If TOS is true, increments the bytecode counter by `delta' and + leaves TOS on the stack. Otherwise (TOS is false), TOS is popped. + + New in version 3.1. + + Changed in version 3.11: The oparg is now a relative delta rather + than an absolute target. + + -- Opcode: JUMP_IF_FALSE_OR_POP (delta) + + If TOS is false, increments the bytecode counter by `delta' and + leaves TOS on the stack. Otherwise (TOS is true), TOS is popped. + + New in version 3.1. + + Changed in version 3.11: The oparg is now a relative delta rather + than an absolute target. + + -- Opcode: FOR_ITER (delta) + + TOS is an *note iterator: 134f. Call its *note __next__(): f76. + method. If this yields a new value, push it on the stack (leaving + the iterator below it). If the iterator indicates it is exhausted, + TOS is popped, and the byte code counter is incremented by `delta'. + + -- Opcode: LOAD_GLOBAL (namei) + + Loads the global named ‘co_names[namei>>1]’ onto the stack. + + Changed in version 3.11: If the low bit of ‘namei’ is set, then a + ‘NULL’ is pushed to the stack before the global variable. + + -- Opcode: LOAD_FAST (var_num) + + Pushes a reference to the local ‘co_varnames[var_num]’ onto the + stack. + + -- Opcode: STORE_FAST (var_num) + + Stores TOS into the local ‘co_varnames[var_num]’. + + -- Opcode: DELETE_FAST (var_num) + + Deletes local ‘co_varnames[var_num]’. + + -- Opcode: MAKE_CELL (i) + + Creates a new cell in slot ‘i’. If that slot is empty then that + value is stored into the new cell. + + New in version 3.11. + + -- Opcode: LOAD_CLOSURE (i) + + Pushes a reference to the cell contained in slot ‘i’ of the “fast + locals” storage. The name of the variable is + ‘co_fastlocalnames[i]’. + + Note that ‘LOAD_CLOSURE’ is effectively an alias for ‘LOAD_FAST’. + It exists to keep bytecode a little more readable. + + Changed in version 3.11: ‘i’ is no longer offset by the length of + ‘co_varnames’. + + -- Opcode: LOAD_DEREF (i) + + Loads the cell contained in slot ‘i’ of the “fast locals” storage. + Pushes a reference to the object the cell contains on the stack. + + Changed in version 3.11: ‘i’ is no longer offset by the length of + ‘co_varnames’. + + -- Opcode: LOAD_CLASSDEREF (i) + + Much like *note LOAD_DEREF: 3f0e. but first checks the locals + dictionary before consulting the cell. This is used for loading + free variables in class bodies. + + New in version 3.4. + + Changed in version 3.11: ‘i’ is no longer offset by the length of + ‘co_varnames’. + + -- Opcode: STORE_DEREF (i) + + Stores TOS into the cell contained in slot ‘i’ of the “fast locals” + storage. + + Changed in version 3.11: ‘i’ is no longer offset by the length of + ‘co_varnames’. + + -- Opcode: DELETE_DEREF (i) + + Empties the cell contained in slot ‘i’ of the “fast locals” + storage. Used by the *note del: 1694. statement. + + New in version 3.2. + + Changed in version 3.11: ‘i’ is no longer offset by the length of + ‘co_varnames’. + + -- Opcode: COPY_FREE_VARS (n) + + Copies the ‘n’ free variables from the closure into the frame. + Removes the need for special code on the caller’s side when calling + closures. + + New in version 3.11. + + -- Opcode: RAISE_VARARGS (argc) + + Raises an exception using one of the 3 forms of the ‘raise’ + statement, depending on the value of `argc': + + * 0: ‘raise’ (re-raise previous exception) + + * 1: ‘raise TOS’ (raise exception instance or type at ‘TOS’) + + * 2: ‘raise TOS1 from TOS’ (raise exception instance or type at + ‘TOS1’ with ‘__cause__’ set to ‘TOS’) + + -- Opcode: CALL (argc) + + Calls a callable object with the number of arguments specified by + ‘argc’, including the named arguments specified by the preceding + *note KW_NAMES: 2bc, if any. On the stack are (in ascending + order), either: + + * NULL + + * The callable + + * The positional arguments + + * The named arguments + + or: + + * The callable + + * ‘self’ + + * The remaining positional arguments + + * The named arguments + + ‘argc’ is the total of the positional and named arguments, + excluding ‘self’ when a ‘NULL’ is not present. + + ‘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. + + New in version 3.11. + + -- 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. ‘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. + + New in version 3.6. + + -- Opcode: LOAD_METHOD (namei) + + Loads a method named ‘co_names[namei]’ from the TOS object. TOS is + popped. This bytecode distinguishes two cases: if TOS has a method + with the correct name, the bytecode pushes the unbound method and + TOS. TOS will be used as the first argument (‘self’) by *note CALL: + 2bb. when calling the unbound method. Otherwise, ‘NULL’ and the + object return by the attribute lookup are pushed. + + New in version 3.7. + + -- Opcode: PRECALL (argc) + + Prefixes *note CALL: 2bb. Logically this is a no op. It exists to + enable effective specialization of calls. ‘argc’ is the number of + arguments as described in *note CALL: 2bb. + + New in version 3.11. + + -- Opcode: PUSH_NULL + + Pushes a ‘NULL’ to the stack. Used in the call sequence to + match the ‘NULL’ pushed by *note LOAD_METHOD: 88a. for + non-method calls. + + New in version 3.11. + + -- Opcode: KW_NAMES (i) + + Prefixes *note PRECALL: 2ba. Stores a reference to + ‘co_consts[consti]’ into an internal variable for use by *note + CALL: 2bb. ‘co_consts[consti]’ must be a tuple of strings. + + New in version 3.11. + + -- Opcode: MAKE_FUNCTION (flags) + + Pushes a new function object on the stack. From bottom to top, the + consumed stack must consist of values if the argument carries a + specified flag value + + * ‘0x01’ a tuple of default values for positional-only and + positional-or-keyword parameters in positional order + + * ‘0x02’ a dictionary of keyword-only parameters’ default values + + * ‘0x04’ a tuple of strings containing parameters’ annotations + + * ‘0x08’ a tuple containing cells for free variables, making a + closure + + * the code associated with the function (at TOS1) + + * the *note qualified name: 134c. of the function (at TOS) + + Changed in version 3.10: Flag value ‘0x04’ is a tuple of strings + instead of dictionary + + -- Opcode: BUILD_SLICE (argc) + + Pushes a slice object on the stack. `argc' must be 2 or 3. If it + is 2, ‘slice(TOS1, TOS)’ is pushed; if it is 3, ‘slice(TOS2, TOS1, + TOS)’ is pushed. See the *note slice(): 1100. built-in function + for more information. + + -- 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 ‘EXTENDED_ARG’ are allowed, forming an argument from + two-byte to four-byte. + + -- Opcode: FORMAT_VALUE (flags) + + Used for implementing formatted literal strings (f-strings). Pops + an optional `fmt_spec' from the stack, then a required `value'. + `flags' is interpreted as follows: + + * ‘(flags & 0x03) == 0x00’: `value' is formatted as-is. + + * ‘(flags & 0x03) == 0x01’: call *note str(): 1b3. on `value' + before formatting it. + + * ‘(flags & 0x03) == 0x02’: call *note repr(): 3ee. on `value' + before formatting it. + + * ‘(flags & 0x03) == 0x03’: call *note ascii(): 104d. on `value' + before formatting it. + + * ‘(flags & 0x04) == 0x04’: pop `fmt_spec' from the stack and + use it, else use an empty `fmt_spec'. + + Formatting is performed using ‘PyObject_Format()’. The result is + pushed on the stack. + + New in version 3.6. + + -- Opcode: MATCH_CLASS (count) + + TOS is a tuple of keyword attribute names, TOS1 is the class being + matched against, and TOS2 is the match subject. `count' is the + number of positional sub-patterns. + + Pop TOS, TOS1, and TOS2. If TOS2 is an instance of TOS1 and has + the positional and keyword attributes required by `count' and TOS, + push a tuple of extracted attributes. Otherwise, push ‘None’. + + New in version 3.10. + + Changed in version 3.11: Previously, this instruction also pushed a + boolean value indicating success (‘True’) or failure (‘False’). + + -- Opcode: RESUME (where) + + A no-op. Performs internal tracing, debugging and + optimization checks. + + The ‘where’ operand marks where the ‘RESUME’ occurs: + + * ‘0’ The start of a function + + * ‘1’ After a ‘yield’ expression + + * ‘2’ After a ‘yield from’ expression + + * ‘3’ After an ‘await’ expression + + New in version 3.11. + + -- Opcode: RETURN_GENERATOR + + Create a generator, coroutine, or async generator from the current + frame. Clear the current frame and return the newly created + generator. + + New in version 3.11. + + -- Opcode: SEND + + Sends ‘None’ to the sub-generator of this generator. Used in + ‘yield from’ and ‘await’ statements. + + New in version 3.11. + + -- Opcode: ASYNC_GEN_WRAP + + Wraps the value on top of the stack in an + ‘async_generator_wrapped_value’. Used to yield in async + generators. + + New in version 3.11. + + -- Opcode: HAVE_ARGUMENT + + This is not really an opcode. It identifies the dividing line + between opcodes which don’t use their argument and those that do + (‘< HAVE_ARGUMENT’ and ‘>= HAVE_ARGUMENT’, respectively). + + Changed in version 3.6: Now every instruction has an argument, but + opcodes ‘< HAVE_ARGUMENT’ ignore it. Before, only opcodes ‘>= + HAVE_ARGUMENT’ had an argument. + + +File: python.info, Node: Opcode collections, Prev: Python Bytecode Instructions, Up: dis — Disassembler for Python bytecode + +5.32.10.4 Opcode collections +............................ + +These collections are provided for automatic introspection of bytecode +instructions: + + -- Data: dis.opname + + Sequence of operation names, indexable using the bytecode. + + -- Data: dis.opmap + + Dictionary mapping operation names to bytecodes. + + -- Data: dis.cmp_op + + Sequence of all compare operation names. + + -- Data: dis.hasconst + + Sequence of bytecodes that access a constant. + + -- Data: dis.hasfree + + Sequence of bytecodes that access a free variable (note that ‘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). + + -- Data: dis.hasname + + Sequence of bytecodes that access an attribute by name. + + -- Data: dis.hasjrel + + Sequence of bytecodes that have a relative jump target. + + -- Data: dis.hasjabs + + Sequence of bytecodes that have an absolute jump target. + + -- Data: dis.haslocal + + Sequence of bytecodes that access a local variable. + + -- Data: dis.hascompare + + Sequence of bytecodes of Boolean operations. + + +File: python.info, Node: pickletools — Tools for pickle developers, Prev: dis — Disassembler for Python bytecode, Up: Python Language Services + +5.32.11 ‘pickletools’ — Tools for pickle developers +--------------------------------------------------- + +`Source code:' Lib/pickletools.py(1) + +__________________________________________________________________ + +This module contains various constants relating to the intimate details +of the *note pickle: c7. 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 *note pickle: c7.; ordinary users of the *note +pickle: c7. module probably won’t find the *note pickletools: c8. module +relevant. + +* Menu: + +* Command line usage: Command line usage<2>. +* Programmatic Interface: Programmatic Interface<2>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/pickletools.py + + +File: python.info, Node: Command line usage<2>, Next: Programmatic Interface<2>, Up: pickletools — Tools for pickle developers + +5.32.11.1 Command line usage +............................ + +New in version 3.2. + +When invoked from the command line, ‘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 ‘-m pickle’ instead. +However, when the pickle file that you want to examine comes from an +untrusted source, ‘-m pickletools’ is a safer option because it does not +execute pickle bytecode. + +For example, with a tuple ‘(1, 2)’ pickled in file ‘x.pickle’: + + $ 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 + +* Menu: + +* Command line options: Command line options<3>. + + +File: python.info, Node: Command line options<3>, Up: Command line usage<2> + +5.32.11.2 Command line options +.............................. + + -- Program Option: -a, --annotate + + Annotate each line with a short opcode description. + + -- Program Option: -o, --output=<file> + + Name of a file where the output should be written. + + -- Program Option: -l, --indentlevel=<num> + + The number of blanks by which to indent a new MARK level. + + -- Program Option: -m, --memo + + When multiple objects are disassembled, preserve memo between + disassemblies. + + -- Program Option: -p, --preamble=<preamble> + + When more than one pickle file are specified, print given preamble + before each disassembly. + + +File: python.info, Node: Programmatic Interface<2>, Prev: Command line usage<2>, Up: pickletools — Tools for pickle developers + +5.32.11.3 Programmatic Interface +................................ + + -- 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 ‘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 ‘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. + + New in version 3.2: The `annotate' argument. + + -- Function: pickletools.genops (pickle) + + Provides an *note iterator: 134f. over all of the opcodes in a + pickle, returning a sequence of ‘(opcode, arg, pos)’ triples. + `opcode' is an instance of an ‘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. + + -- Function: pickletools.optimize (picklestring) + + Returns a new equivalent pickle string after eliminating unused + ‘PUT’ opcodes. The optimized pickle is shorter, takes less + transmission time, requires less storage space, and unpickles more + efficiently. + + +File: python.info, Node: MS Windows Specific Services, Next: Unix Specific Services, Prev: Python Language Services, Up: The Python Standard Library + +5.33 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:: + + +File: python.info, Node: msvcrt — Useful routines from the MS VC++ runtime, Next: winreg — Windows registry access, Up: MS Windows Specific Services + +5.33.1 ‘msvcrt’ — Useful routines from the MS VC++ runtime +---------------------------------------------------------- + +__________________________________________________________________ + +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 *note +getpass: 82. module uses this in the implementation of the *note +getpass(): 82. 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. + +Changed in version 3.3: Operations in this module now raise *note +OSError: 413. where *note IOError: d02. was raised. + +* Menu: + +* File Operations:: +* Console I/O:: +* Other Functions:: + + +File: python.info, Node: File Operations, Next: Console I/O, Up: msvcrt — Useful routines from the MS VC++ runtime + +5.33.1.1 File Operations +........................ + + -- Function: msvcrt.locking (fd, mode, nbytes) + + Lock part of a file based on file descriptor `fd' from the C + runtime. Raises *note OSError: 413. 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 ‘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 *note auditing event: 12c0. ‘msvcrt.locking’ with + arguments ‘fd’, ‘mode’, ‘nbytes’. + + -- Data: msvcrt.LK_LOCK + -- 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, *note OSError: 413. is + raised. + + -- Data: msvcrt.LK_NBLCK + -- Data: msvcrt.LK_NBRLCK + + Locks the specified bytes. If the bytes cannot be locked, *note + OSError: 413. is raised. + + -- Data: msvcrt.LK_UNLCK + + Unlocks the specified bytes, which must have been previously + locked. + + -- 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 *note os.O_TEXT: 251f.; for + binary, it should be *note os.O_BINARY: 2510. + + -- 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 *note os.O_APPEND: + 2512, *note os.O_RDONLY: 250e, and *note os.O_TEXT: 251f. The + returned file descriptor may be used as a parameter to *note + os.fdopen(): 1905. to create a file object. + + Raises an *note auditing event: 12c0. ‘msvcrt.open_osfhandle’ with + arguments ‘handle’, ‘flags’. + + -- Function: msvcrt.get_osfhandle (fd) + + Return the file handle for the file descriptor `fd'. Raises *note + OSError: 413. if `fd' is not recognized. + + Raises an *note auditing event: 12c0. ‘msvcrt.get_osfhandle’ with + argument ‘fd’. + + +File: python.info, Node: Console I/O, Next: Other Functions, Prev: File Operations, Up: msvcrt — Useful routines from the MS VC++ runtime + +5.33.1.2 Console I/O +.................... + + -- Function: msvcrt.kbhit () + + Return ‘True’ if a keypress is waiting to be read. + + -- 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 ‘Enter’ + to be pressed. If the pressed key was a special function key, this + will return ‘'\000'’ or ‘'\xe0'’; the next call will return the + keycode. The ‘Control-C’ keypress cannot be read with this + function. + + -- Function: msvcrt.getwch () + + Wide char variant of *note getch(): 3f41, returning a Unicode + value. + + -- Function: msvcrt.getche () + + Similar to *note getch(): 3f41, but the keypress will be echoed if + it represents a printable character. + + -- Function: msvcrt.getwche () + + Wide char variant of *note getche(): 3f43, returning a Unicode + value. + + -- Function: msvcrt.putch (char) + + Print the byte string `char' to the console without buffering. + + -- Function: msvcrt.putwch (unicode_char) + + Wide char variant of *note putch(): 3f45, accepting a Unicode + value. + + -- 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 *note getch(): 3f41. + or *note getche(): 3f43. + + -- Function: msvcrt.ungetwch (unicode_char) + + Wide char variant of *note ungetch(): 3f47, accepting a Unicode + value. + + +File: python.info, Node: Other Functions, Prev: Console I/O, Up: msvcrt — Useful routines from the MS VC++ runtime + +5.33.1.3 Other Functions +........................ + + -- Function: msvcrt.heapmin () + + Force the ‘malloc()’ heap to clean itself up and return unused + blocks to the operating system. On failure, this raises *note + OSError: 413. + + +File: python.info, Node: winreg — Windows registry access, Next: winsound — Sound-playing interface for Windows, Prev: msvcrt — Useful routines from the MS VC++ runtime, Up: MS Windows Specific Services + +5.33.2 ‘winreg’ — Windows registry access +----------------------------------------- + +__________________________________________________________________ + +These functions expose the Windows registry API to Python. Instead of +using an integer as the registry handle, a *note handle object: 3f4e. is +used to ensure that the handles are closed correctly, even if the +programmer neglects to explicitly close them. + +Changed in version 3.3: Several functions in this module used to raise a +*note WindowsError: d04, which is now an alias of *note OSError: 413. + +* Menu: + +* Functions: Functions<12>. +* Constants: Constants<10>. +* Registry Handle Objects:: + + +File: python.info, Node: Functions<12>, Next: Constants<10>, Up: winreg — Windows registry access + +5.33.2.1 Functions +.................. + +This module offers the following functions: + + -- Function: winreg.CloseKey (hkey) + + Closes a previously opened registry key. The `hkey' argument + specifies a previously opened key. + + Note: If `hkey' is not closed using this method (or via *note + hkey.Close(): 3f53.), it is closed when the `hkey' object is + destroyed by Python. + + -- Function: winreg.ConnectRegistry (computer_name, key) + + Establishes a connection to a predefined registry handle on another + computer, and returns a *note handle object: 3f4e. + + `computer_name' is the name of the remote computer, of the form + ‘r"\\computername"’. If ‘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 *note OSError: 413. exception is raised. + + Raises an *note auditing event: 12c0. ‘winreg.ConnectRegistry’ with + arguments ‘computer_name’, ‘key’. + + Changed in version 3.3: See *note above: 3f4f. + + -- Function: winreg.CreateKey (key, sub_key) + + Creates or opens the specified key, returning a *note handle + object: 3f4e. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + `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 ‘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 *note OSError: 413. exception is raised. + + Raises an *note auditing event: 12c0. ‘winreg.CreateKey’ with + arguments ‘key’, ‘sub_key’, ‘access’. + + Raises an *note auditing event: 12c0. ‘winreg.OpenKey/result’ with + argument ‘key’. + + Changed in version 3.3: See *note above: 3f4f. + + -- Function: winreg.CreateKeyEx (key, sub_key, reserved=0, + access=KEY_WRITE) + + Creates or opens the specified key, returning a *note handle + object: 3f4e. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + `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 *note + KEY_WRITE: 3f55. See *note Access Rights: 3f56. for other allowed + values. + + If `key' is one of the predefined keys, `sub_key' may be ‘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 *note OSError: 413. exception is raised. + + Raises an *note auditing event: 12c0. ‘winreg.CreateKey’ with + arguments ‘key’, ‘sub_key’, ‘access’. + + Raises an *note auditing event: 12c0. ‘winreg.OpenKey/result’ with + argument ‘key’. + + New in version 3.2. + + Changed in version 3.3: See *note above: 3f4f. + + -- Function: winreg.DeleteKey (key, sub_key) + + Deletes the specified key. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + `sub_key' is a string that must be a subkey of the key identified + by the `key' parameter. This value must not be ‘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 *note OSError: 413. + exception is raised. + + Raises an *note auditing event: 12c0. ‘winreg.DeleteKey’ with + arguments ‘key’, ‘sub_key’, ‘access’. + + Changed in version 3.3: See *note above: 3f4f. + + -- 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 *note HKEY_* + constants: 3f54. + + `sub_key' is a string that must be a subkey of the key identified + by the `key' parameter. This value must not be ‘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 *note + KEY_WOW64_64KEY: 3f57. On 32-bit Windows, the WOW64 constants are + ignored. See *note Access Rights: 3f56. 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 *note OSError: 413. + exception is raised. + + On unsupported Windows versions, *note NotImplementedError: 9c7. is + raised. + + Raises an *note auditing event: 12c0. ‘winreg.DeleteKey’ with + arguments ‘key’, ‘sub_key’, ‘access’. + + New in version 3.2. + + Changed in version 3.3: See *note above: 3f4f. + + -- Function: winreg.DeleteValue (key, value) + + Removes a named value from a registry key. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + `value' is a string that identifies the value to remove. + + Raises an *note auditing event: 12c0. ‘winreg.DeleteValue’ with + arguments ‘key’, ‘value’. + + -- 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 *note HKEY_* + constants: 3f54. + + `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 *note OSError: + 413. exception is raised, indicating, no more values are available. + + Raises an *note auditing event: 12c0. ‘winreg.EnumKey’ with + arguments ‘key’, ‘index’. + + Changed in version 3.3: See *note above: 3f4f. + + -- 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 *note HKEY_* + constants: 3f54. + + `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 *note OSError: + 413. exception is raised, indicating no more values. + + The result is a tuple of 3 items: + + Index Meaning + + ------------------------------------------------------------- + + ‘0’ A string that identifies the value name + + + ‘1’ An object that holds the value data, and whose + type depends on the underlying registry type + + + ‘2’ An integer that identifies the type of the + value data (see table in docs for + *note SetValueEx(): 3a62.) + + + Raises an *note auditing event: 12c0. ‘winreg.EnumValue’ with + arguments ‘key’, ‘index’. + + Changed in version 3.3: See *note above: 3f4f. + + -- Function: winreg.ExpandEnvironmentStrings (str) + + Expands environment variable placeholders ‘%NAME%’ in strings like + *note REG_EXPAND_SZ: 3f58.: + + >>> ExpandEnvironmentStrings('%windir%') + 'C:\\Windows' + + Raises an *note auditing event: 12c0. + ‘winreg.ExpandEnvironmentStrings’ with argument ‘str’. + + -- 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 *note HKEY_* + constants: 3f54. + + It is not necessary to call *note FlushKey(): 3f59. 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 *note CloseKey(): 3f52, the *note + FlushKey(): 3f59. method returns only when all the data has been + written to the registry. An application should only call *note + FlushKey(): 3f59. if it requires absolute certainty that registry + changes are on disk. + + Note: If you don’t know whether a *note FlushKey(): 3f59. call + is required, it probably isn’t. + + -- 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 *note ConnectRegistry(): 3a4e. or one + of the constants *note HKEY_USERS: 3f5a. or *note + HKEY_LOCAL_MACHINE: 3f5b. + + `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 *note SaveKey(): 3a60. + function. Under the file allocation table (FAT) file system, the + filename may not have an extension. + + A call to *note LoadKey(): 3a59. fails if the calling process does + not have the ‘SE_RESTORE_PRIVILEGE’ privilege. Note that + privileges are different from permissions – see the RegLoadKey + documentation(1) for more details. + + If `key' is a handle returned by *note ConnectRegistry(): 3a4e, + then the path specified in `file_name' is relative to the remote + computer. + + Raises an *note auditing event: 12c0. ‘winreg.LoadKey’ with + arguments ‘key’, ‘sub_key’, ‘file_name’. + + -- Function: winreg.OpenKey (key, sub_key, reserved=0, access=KEY_READ) + -- Function: winreg.OpenKeyEx (key, sub_key, reserved=0, + access=KEY_READ) + + Opens the specified key, returning a *note handle object: 3f4e. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + `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 *note + KEY_READ: 3f5d. See *note Access Rights: 3f56. for other allowed + values. + + The result is a new handle to the specified key. + + If the function fails, *note OSError: 413. is raised. + + Raises an *note auditing event: 12c0. ‘winreg.OpenKey’ with + arguments ‘key’, ‘sub_key’, ‘access’. + + Raises an *note auditing event: 12c0. ‘winreg.OpenKey/result’ with + argument ‘key’. + + Changed in version 3.2: Allow the use of named arguments. + + Changed in version 3.3: See *note above: 3f4f. + + -- Function: winreg.QueryInfoKey (key) + + Returns information about a key, as a tuple. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + The result is a tuple of 3 items: + + Index Meaning + + -------------------------------------------------------------- + + ‘0’ An integer giving the number of sub keys this + key has. + + + ‘1’ An integer giving the number of values this key + has. + + + ‘2’ An integer giving when the key was last + modified (if available) as 100’s of nanoseconds + since Jan 1, 1601. + + + Raises an *note auditing event: 12c0. ‘winreg.QueryInfoKey’ with + argument ‘key’. + + -- 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 *note HKEY_* + constants: 3f54. + + `sub_key' is a string that holds the name of the subkey with which + the value is associated. If this parameter is ‘None’ or empty, the + function retrieves the value set by the *note SetValue(): 3a61. + 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 ‘NULL’ + name. But the underlying API call doesn’t return the type, so + always use *note QueryValueEx(): 3a5f. if possible. + + Raises an *note auditing event: 12c0. ‘winreg.QueryValue’ with + arguments ‘key’, ‘sub_key’, ‘value_name’. + + -- 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 *note HKEY_* + constants: 3f54. + + `value_name' is a string indicating the value to query. + + The result is a tuple of 2 items: + + Index Meaning + + ---------------------------------------------------------- + + ‘0’ The value of the registry item. + + + ‘1’ An integer giving the registry type for + this value (see table in docs for + *note SetValueEx(): 3a62.) + + + Raises an *note auditing event: 12c0. ‘winreg.QueryValue’ with + arguments ‘key’, ‘sub_key’, ‘value_name’. + + -- 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 *note HKEY_* + constants: 3f54. + + `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 *note LoadKey(): 3a59. 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(2) for more details. + + This function passes ‘NULL’ for `security_attributes' to the API. + + Raises an *note auditing event: 12c0. ‘winreg.SaveKey’ with + arguments ‘key’, ‘file_name’. + + -- 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 *note HKEY_* + constants: 3f54. + + `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 *note REG_SZ: 3f5e, meaning only strings are + supported. Use the *note SetValueEx(): 3a62. 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 *note KEY_SET_VALUE: 3f5f. access. + + Raises an *note auditing event: 12c0. ‘winreg.SetValue’ with + arguments ‘key’, ‘sub_key’, ‘type’, ‘value’. + + -- 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 *note HKEY_* + constants: 3f54. + + `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 + *note Value Types: 3f60. 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 *note KEY_SET_VALUE: 3f5f. access. + + To open the key, use the *note CreateKey(): 3a4f. or *note + OpenKey(): 3a5a. 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 *note auditing event: 12c0. ‘winreg.SetValue’ with + arguments ‘key’, ‘sub_key’, ‘type’, ‘value’. + + -- 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 *note HKEY_* + constants: 3f54. + + Will generally raise *note NotImplementedError: 9c7. 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 *note auditing event: 12c0. ‘winreg.DisableReflectionKey’ + with argument ‘key’. + + -- Function: winreg.EnableReflectionKey (key) + + Restores registry reflection for the specified disabled key. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + Will generally raise *note NotImplementedError: 9c7. if executed on + a 32-bit operating system. + + Restoring reflection for a key does not affect reflection of any + subkeys. + + Raises an *note auditing event: 12c0. ‘winreg.EnableReflectionKey’ + with argument ‘key’. + + -- Function: winreg.QueryReflectionKey (key) + + Determines the reflection state for the specified key. + + `key' is an already open key, or one of the predefined *note HKEY_* + constants: 3f54. + + Returns ‘True’ if reflection is disabled. + + Will generally raise *note NotImplementedError: 9c7. if executed on + a 32-bit operating system. + + Raises an *note auditing event: 12c0. ‘winreg.QueryReflectionKey’ + with argument ‘key’. + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/ms724889%28v=VS.85%29.aspx + + (2) +https://msdn.microsoft.com/en-us/library/ms724878%28v=VS.85%29.aspx + + +File: python.info, Node: Constants<10>, Next: Registry Handle Objects, Prev: Functions<12>, Up: winreg — Windows registry access + +5.33.2.2 Constants +.................. + +The following constants are defined for use in many ‘_winreg’ functions. + +* Menu: + +* HKEY_* Constants:: +* Access Rights:: +* Value Types:: + + +File: python.info, Node: HKEY_* Constants, Next: Access Rights, Up: Constants<10> + +5.33.2.3 HKEY_* Constants +......................... + + -- 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. + + -- 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. + + -- 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. + + -- 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. + + -- 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. + + -- Data: winreg.HKEY_CURRENT_CONFIG + + Contains information about the current hardware profile of the + local computer system. + + -- Data: winreg.HKEY_DYN_DATA + + This key is not used in versions of Windows after 98. + + +File: python.info, Node: Access Rights, Next: Value Types, Prev: HKEY_* Constants, Up: Constants<10> + +5.33.2.4 Access Rights +...................... + +For more information, see Registry Key Security and Access(1). + + -- Data: winreg.KEY_ALL_ACCESS + + Combines the STANDARD_RIGHTS_REQUIRED, *note KEY_QUERY_VALUE: 3f6b, + *note KEY_SET_VALUE: 3f5f, *note KEY_CREATE_SUB_KEY: 3f6c, *note + KEY_ENUMERATE_SUB_KEYS: 3f6d, *note KEY_NOTIFY: 3f6e, and *note + KEY_CREATE_LINK: 3f6f. access rights. + + -- Data: winreg.KEY_WRITE + + Combines the STANDARD_RIGHTS_WRITE, *note KEY_SET_VALUE: 3f5f, and + *note KEY_CREATE_SUB_KEY: 3f6c. access rights. + + -- Data: winreg.KEY_READ + + Combines the STANDARD_RIGHTS_READ, *note KEY_QUERY_VALUE: 3f6b, + *note KEY_ENUMERATE_SUB_KEYS: 3f6d, and *note KEY_NOTIFY: 3f6e. + values. + + -- Data: winreg.KEY_EXECUTE + + Equivalent to *note KEY_READ: 3f5d. + + -- Data: winreg.KEY_QUERY_VALUE + + Required to query the values of a registry key. + + -- Data: winreg.KEY_SET_VALUE + + Required to create, delete, or set a registry value. + + -- Data: winreg.KEY_CREATE_SUB_KEY + + Required to create a subkey of a registry key. + + -- Data: winreg.KEY_ENUMERATE_SUB_KEYS + + Required to enumerate the subkeys of a registry key. + + -- Data: winreg.KEY_NOTIFY + + Required to request change notifications for a registry key or for + subkeys of a registry key. + + -- Data: winreg.KEY_CREATE_LINK + + Reserved for system use. + +* Menu: + +* 64-bit Specific:: + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/ms724878%28v=VS.85%29.aspx + + +File: python.info, Node: 64-bit Specific, Up: Access Rights + +5.33.2.5 64-bit Specific +........................ + +For more information, see Accessing an Alternate Registry View(1). + + -- 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. + + -- 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. + + ---------- Footnotes ---------- + + (1) https://msdn.microsoft.com/en-us/library/aa384129(v=VS.85).aspx + + +File: python.info, Node: Value Types, Prev: Access Rights, Up: Constants<10> + +5.33.2.6 Value Types +.................... + +For more information, see Registry Value Types(1). + + -- Data: winreg.REG_BINARY + + Binary data in any form. + + -- Data: winreg.REG_DWORD + + 32-bit number. + + -- Data: winreg.REG_DWORD_LITTLE_ENDIAN + + A 32-bit number in little-endian format. Equivalent to *note + REG_DWORD: 3f76. + + -- Data: winreg.REG_DWORD_BIG_ENDIAN + + A 32-bit number in big-endian format. + + -- Data: winreg.REG_EXPAND_SZ + + Null-terminated string containing references to environment + variables (‘%PATH%’). + + -- Data: winreg.REG_LINK + + A Unicode symbolic link. + + -- Data: winreg.REG_MULTI_SZ + + A sequence of null-terminated strings, terminated by two null + characters. (Python handles this termination automatically.) + + -- Data: winreg.REG_NONE + + No defined value type. + + -- Data: winreg.REG_QWORD + + A 64-bit number. + + New in version 3.6. + + -- Data: winreg.REG_QWORD_LITTLE_ENDIAN + + A 64-bit number in little-endian format. Equivalent to *note + REG_QWORD: 971. + + New in version 3.6. + + -- Data: winreg.REG_RESOURCE_LIST + + A device-driver resource list. + + -- Data: winreg.REG_FULL_RESOURCE_DESCRIPTOR + + A hardware setting. + + -- Data: winreg.REG_RESOURCE_REQUIREMENTS_LIST + + A hardware resource list. + + -- Data: winreg.REG_SZ + + A null-terminated string. + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/ms724884%28v=VS.85%29.aspx + + +File: python.info, Node: Registry Handle Objects, Prev: Constants<10>, Up: winreg — Windows registry access + +5.33.2.7 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 +*note Close(): 3f53. method on the object, or the *note CloseKey(): +3f52. 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 ‘__bool__()’ – thus + + if handle: + print("Yes") + +will print ‘Yes’ if the handle is currently valid (has not been closed +or detached). + +The object also support comparison semantics, so handle objects will +compare true if they both reference the same underlying Windows handle +value. + +Handle objects can be converted to an integer (e.g., using the built-in +*note int(): 1c7. function), in which case the underlying Windows handle +value is returned. You can also use the *note Detach(): 3a5b. method to +return the integer handle, and also disconnect the Windows handle from +the handle object. + + -- Method: PyHKEY.Close () + + Closes the underlying Windows handle. + + If the handle is already closed, no error is raised. + + -- 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 *note auditing event: 12c0. ‘winreg.PyHKEY.Detach’ with + argument ‘key’. + + -- Method: PyHKEY.__enter__ () + -- Method: PyHKEY.__exit__ (*exc_info) + + The HKEY object implements *note __enter__(): 18e. and *note + __exit__(): 1978. and thus supports the context protocol for the + *note with: 19e. statement: + + with OpenKey(HKEY_LOCAL_MACHINE, "foo") as key: + ... # work with key + + will automatically close `key' when control leaves the *note with: + 19e. block. + + +File: python.info, Node: winsound — Sound-playing interface for Windows, Prev: winreg — Windows registry access, Up: MS Windows Specific Services + +5.33.3 ‘winsound’ — Sound-playing interface for Windows +------------------------------------------------------- + +__________________________________________________________________ + +The *note winsound: 135. module provides access to the basic +sound-playing machinery provided by Windows platforms. It includes +functions and several constants. + + -- 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, *note RuntimeError: 6e9. is raised. + + -- Function: winsound.PlaySound (sound, flags) + + Call the underlying ‘PlaySound()’ function from the Platform API. + The `sound' parameter may be a filename, a system sound alias, + audio data as a *note bytes-like object: 9a2, or ‘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 ‘None’, any currently playing waveform sound + is stopped. If the system indicates an error, *note RuntimeError: + 6e9. is raised. + + -- Function: winsound.MessageBeep (type=MB_OK) + + Call the underlying ‘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 ‘-1’, + ‘MB_ICONASTERISK’, ‘MB_ICONEXCLAMATION’, ‘MB_ICONHAND’, + ‘MB_ICONQUESTION’, and ‘MB_OK’, all described below. The value + ‘-1’ produces a “simple beep”; this is the final fallback if a + sound cannot be played otherwise. If the system indicates an + error, *note RuntimeError: 6e9. is raised. + + -- Data: winsound.SND_FILENAME + + The `sound' parameter is the name of a WAV file. Do not use with + *note SND_ALIAS: 3f85. + + -- 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 *note SND_NODEFAULT: 3f86. is also specified. + If no default sound is registered, raise *note RuntimeError: 6e9. + Do not use with *note SND_FILENAME: 3f84. + + All Win32 systems support at least the following; most systems + support many more: + + *note PlaySound(): 975. Corresponding Control Panel Sound name + `name' + + ---------------------------------------------------------------------------- + + ‘'SystemAsterisk'’ Asterisk + + + ‘'SystemExclamation'’ Exclamation + + + ‘'SystemExit'’ Exit Windows + + + ‘'SystemHand'’ Critical Stop + + + ‘'SystemQuestion'’ Question + + + For 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) + + -- Data: winsound.SND_LOOP + + Play the sound repeatedly. The *note SND_ASYNC: 3f88. flag must + also be used to avoid blocking. Cannot be used with *note + SND_MEMORY: 3f89. + + -- Data: winsound.SND_MEMORY + + The `sound' parameter to *note PlaySound(): 975. is a memory image + of a WAV file, as a *note bytes-like object: 9a2. + + Note: This module does not support playing from a memory image + asynchronously, so a combination of this flag and *note + SND_ASYNC: 3f88. will raise *note RuntimeError: 6e9. + + -- Data: winsound.SND_PURGE + + Stop playing all instances of the specified sound. + + Note: This flag is not supported on modern Windows platforms. + + -- Data: winsound.SND_ASYNC + + Return immediately, allowing sounds to play asynchronously. + + -- Data: winsound.SND_NODEFAULT + + If the specified sound cannot be found, do not play the system + default sound. + + -- Data: winsound.SND_NOSTOP + + Do not interrupt sounds currently playing. + + -- Data: winsound.SND_NOWAIT + + Return immediately if the sound driver is busy. + + Note: This flag is not supported on modern Windows platforms. + + -- Data: winsound.MB_ICONASTERISK + + Play the ‘SystemDefault’ sound. + + -- Data: winsound.MB_ICONEXCLAMATION + + Play the ‘SystemExclamation’ sound. + + -- Data: winsound.MB_ICONHAND + + Play the ‘SystemHand’ sound. + + -- Data: winsound.MB_ICONQUESTION + + Play the ‘SystemQuestion’ sound. + + -- Data: winsound.MB_OK + + Play the ‘SystemDefault’ sound. + + +File: python.info, Node: Unix Specific Services, Next: Superseded Modules, Prev: MS Windows Specific Services, Up: The Python Standard Library + +5.34 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: + +* 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:: + + +File: python.info, Node: posix — The most common POSIX system calls, Next: pwd — The password database, Up: Unix Specific Services + +5.34.1 ‘posix’ — The most common POSIX system calls +--------------------------------------------------- + +__________________________________________________________________ + +This module provides access to operating system functionality that is +standardized by the C Standard and the POSIX standard (a thinly +disguised Unix interface). + +`Do not import this module directly.' Instead, import the module *note +os: c2, which provides a `portable' version of this interface. On Unix, +the *note os: c2. module provides a superset of the *note posix: ce. +interface. On non-Unix operating systems the *note posix: ce. module is +not available, but a subset is always available through the *note os: +c2. interface. Once *note os: c2. is imported, there is `no' +performance penalty in using it instead of *note posix: ce. In +addition, *note os: c2. provides some additional functionality, such as +automatically calling *note putenv(): 564. when an entry in ‘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 *note +OSError: 413. + +* Menu: + +* Large File Support:: +* Notable Module Contents:: + + +File: python.info, Node: Large File Support, Next: Notable Module Contents, Up: posix — The most common POSIX system calls + +5.34.1.1 Large File Support +........................... + +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 ‘off_t’ is +larger than a long and the long long is at least as large as an ‘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: + + CFLAGS="`getconf LFS_CFLAGS`" OPT="-g -O2 $CFLAGS" \ + ./configure + +On large-file-capable Linux systems, this might work: + + CFLAGS='-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64' OPT="-g -O2 $CFLAGS" \ + ./configure + + +File: python.info, Node: Notable Module Contents, Prev: Large File Support, Up: posix — The most common POSIX system calls + +5.34.1.2 Notable Module Contents +................................ + +In addition to many functions described in the *note os: c2. module +documentation, *note posix: ce. defines the following data item: + + -- 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, ‘environ[b'HOME']’ (‘environ['HOME']’ on + Windows) is the pathname of your home directory, equivalent to + ‘getenv("HOME")’ in C. + + Modifying this dictionary does not affect the string environment + passed on by *note execv(): 24f3, *note popen(): 6d9. or *note + system(): 10c0.; if you need to change the environment, pass + ‘environ’ to *note execve(): da4. or add variable assignments and + export statements to the command string for *note system(): 10c0. + or *note popen(): 6d9. + + Changed in version 3.2: On Unix, keys and values are bytes. + + Note: The *note os: c2. module provides an alternate + implementation of ‘environ’ which updates the environment on + modification. Note also that updating *note os.environ: e6e. + will render this dictionary obsolete. Use of the *note os: + c2. module version of this is recommended over direct access + to the *note posix: ce. module. + + +File: python.info, Node: pwd — The password database, Next: grp — The group database, Prev: posix — The most common POSIX system calls, Up: Unix Specific Services + +5.34.2 ‘pwd’ — The password database +------------------------------------ + +__________________________________________________________________ + +This module provides access to the Unix user account and password +database. It is available on all Unix versions. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +Password database entries are reported as a tuple-like object, whose +attributes correspond to the members of the ‘passwd’ structure +(Attribute field below, see ‘<pwd.h>’): + +Index Attribute Meaning + +------------------------------------------------------------------ + +0 ‘pw_name’ Login name + + +1 ‘pw_passwd’ Optional encrypted password + + +2 ‘pw_uid’ Numerical user ID + + +3 ‘pw_gid’ Numerical group ID + + +4 ‘pw_gecos’ User name or comment field + + +5 ‘pw_dir’ User home directory + + +6 ‘pw_shell’ User command interpreter + + +The uid and gid items are integers, all others are strings. *note +KeyError: 6f5. is raised if the entry asked for cannot be found. + + Note: + In traditional Unix the field ‘pw_passwd’ usually contains a + password encrypted with a DES derived algorithm (see module *note + crypt: 27.). However most modern unices use a so-called `shadow + password' system. On those unices the `pw_passwd' field only + contains an asterisk (‘'*'’) or the letter ‘'x'’ where the + encrypted password is stored in a file ‘/etc/shadow’ which is not + world readable. Whether the `pw_passwd' field contains anything + useful is system-dependent. If available, the *note spwd: ee. + module should be used where access to the encrypted password is + required. + +It defines the following items: + + -- Function: pwd.getpwuid (uid) + + Return the password database entry for the given numeric user ID. + + -- Function: pwd.getpwnam (name) + + Return the password database entry for the given user name. + + -- Function: pwd.getpwall () + + Return a list of all available password database entries, in + arbitrary order. + +See also +........ + +Module *note grp: 86. + + An interface to the group database, similar to this. + +Module *note spwd: ee. + + An interface to the shadow password database, similar to this. + + +File: python.info, Node: grp — The group database, Next: termios — POSIX style tty control, Prev: pwd — The password database, Up: Unix Specific Services + +5.34.3 ‘grp’ — The group database +--------------------------------- + +__________________________________________________________________ + +This module provides access to the Unix group database. It is available +on all Unix versions. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +Group database entries are reported as a tuple-like object, whose +attributes correspond to the members of the ‘group’ structure (Attribute +field below, see ‘<grp.h>’): + +Index Attribute Meaning + +------------------------------------------------------------------ + +0 gr_name the name of the group + + +1 gr_passwd the (encrypted) group password; + often empty + + +2 gr_gid the numerical group ID + + +3 gr_mem all the group member’s user names + + +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 ‘gr_name’ that starts with a ‘+’ or ‘-’ is likely to be +a YP/NIS reference and may not be accessible via *note getgrnam(): 1476. +or *note getgrgid(): 99b.) + +It defines the following items: + + -- Function: grp.getgrgid (id) + + Return the group database entry for the given numeric group ID. + *note KeyError: 6f5. is raised if the entry asked for cannot be + found. + + Changed in version 3.10: *note TypeError: 19c. is raised for + non-integer arguments like floats or strings. + + -- Function: grp.getgrnam (name) + + Return the group database entry for the given group name. *note + KeyError: 6f5. is raised if the entry asked for cannot be found. + + -- Function: grp.getgrall () + + Return a list of all available group entries, in arbitrary order. + +See also +........ + +Module *note pwd: d3. + + An interface to the user database, similar to this. + +Module *note spwd: ee. + + An interface to the shadow password database, similar to this. + + +File: python.info, Node: termios — POSIX style tty control, Next: tty — Terminal control functions, Prev: grp — The group database, Up: Unix Specific Services + +5.34.4 ‘termios’ — POSIX style tty control +------------------------------------------ + +__________________________________________________________________ + +This module provides an interface to the POSIX calls for tty I/O +control. For a complete description of these calls, see ‘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. + +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 +‘sys.stdin.fileno()’, or a *note file object: e76, such as ‘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: + + -- Function: termios.tcgetattr (fd) + + Return a list containing the tty attributes for file descriptor + `fd', as follows: ‘[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 ‘VMIN’ and + ‘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 *note termios: 100. module. + + -- 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 *note + tcgetattr(): 3fa4. The `when' argument determines when the + attributes are changed: ‘TCSANOW’ to change immediately, + ‘TCSADRAIN’ to change after transmitting all queued output, or + ‘TCSAFLUSH’ to change after transmitting all queued output and + discarding all queued input. + + -- 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. + + -- Function: termios.tcdrain (fd) + + Wait until all output written to file descriptor `fd' has been + transmitted. + + -- Function: termios.tcflush (fd, queue) + + Discard queued data on file descriptor `fd'. The `queue' selector + specifies which queue: ‘TCIFLUSH’ for the input queue, ‘TCOFLUSH’ + for the output queue, or ‘TCIOFLUSH’ for both queues. + + -- Function: termios.tcflow (fd, action) + + Suspend or resume input or output on file descriptor `fd'. The + `action' argument can be ‘TCOOFF’ to suspend output, ‘TCOON’ to + restart output, ‘TCIOFF’ to suspend input, or ‘TCION’ to restart + input. + + -- Function: termios.tcgetwinsize (fd) + + Return a tuple ‘(ws_row, ws_col)’ containing the tty window size + for file descriptor `fd'. Requires ‘termios.TIOCGWINSZ’ or + ‘termios.TIOCGSIZE’. + + New in version 3.11. + + -- Function: termios.tcsetwinsize (fd, winsize) + + Set the tty window size for file descriptor `fd' from `winsize', + which is a two-item tuple ‘(ws_row, ws_col)’ like the one returned + by *note tcgetwinsize(): 3faa. Requires at least one of the pairs + (‘termios.TIOCGWINSZ’, ‘termios.TIOCSWINSZ’); (‘termios.TIOCGSIZE’, + ‘termios.TIOCSSIZE’) to be defined. + + New in version 3.11. + +See also +........ + +Module *note tty: 11f. + + Convenience functions for common terminal control operations. + +* Menu: + +* Example: Example<15>. + + +File: python.info, Node: Example<15>, Up: termios — POSIX style tty control + +5.34.4.1 Example +................ + +Here’s a function that prompts for a password with echoing turned off. +Note the technique using a separate *note tcgetattr(): 3fa4. call and a +*note try: 1073. … *note finally: 60a. statement to ensure that the old +tty attributes are restored exactly no matter what happens: + + 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 + + +File: python.info, Node: tty — Terminal control functions, Next: pty — Pseudo-terminal utilities, Prev: termios — POSIX style tty control, Up: Unix Specific Services + +5.34.5 ‘tty’ — Terminal control functions +----------------------------------------- + +`Source code:' Lib/tty.py(1) + +__________________________________________________________________ + +The *note tty: 11f. module defines functions for putting the tty into +cbreak and raw modes. + +Because it requires the *note termios: 100. module, it will work only on +Unix. + +The *note tty: 11f. module defines the following functions: + + -- Function: tty.setraw (fd, when=termios.TCSAFLUSH) + + Change the mode of the file descriptor `fd' to raw. If `when' is + omitted, it defaults to ‘termios.TCSAFLUSH’, and is passed to *note + termios.tcsetattr(): 3fa5. + + -- Function: tty.setcbreak (fd, when=termios.TCSAFLUSH) + + Change the mode of file descriptor `fd' to cbreak. If `when' is + omitted, it defaults to ‘termios.TCSAFLUSH’, and is passed to *note + termios.tcsetattr(): 3fa5. + +See also +........ + +Module *note termios: 100. + + Low-level terminal control interface. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/tty.py + + +File: python.info, Node: pty — Pseudo-terminal utilities, Next: fcntl — The fcntl and ioctl system calls, Prev: tty — Terminal control functions, Up: Unix Specific Services + +5.34.6 ‘pty’ — Pseudo-terminal utilities +---------------------------------------- + +`Source code:' Lib/pty.py(1) + +__________________________________________________________________ + +The *note pty: d2. 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. + +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 *note pty: d2. module defines the following functions: + + -- Function: pty.fork () + + Fork. Connect the child’s controlling terminal to a + pseudo-terminal. Return value is ‘(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). + + -- Function: pty.openpty () + + Open a new pseudo-terminal pair, using *note os.openpty(): 2525. if + possible, or emulation code for generic Unix systems. Return a + pair of file descriptors ‘(master, slave)’, for the master and the + slave end, respectively. + + -- 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 *note os.waitpid(): a18. on the + child process. + + ‘waitstatus_to_exitcode()’ can be used to convert the exit status + into an exit code. + + Raises an *note auditing event: 12c0. ‘pty.spawn’ with argument + ‘argv’. + + Changed in version 3.4: *note spawn(): c20. now returns the status + value from *note os.waitpid(): a18. on the child process. + +* Menu: + +* Example: Example<16>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/pty.py + + +File: python.info, Node: Example<16>, Up: pty — Pseudo-terminal utilities + +5.34.6.1 Example +................ + +The following program acts like the Unix command ‘script(1)’, using a +pseudo-terminal to record all input and output of a terminal session in +a “typescript”. + + 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) + + +File: python.info, Node: fcntl — The fcntl and ioctl system calls, Next: resource — Resource usage information, Prev: pty — Pseudo-terminal utilities, Up: Unix Specific Services + +5.34.7 ‘fcntl’ — The ‘fcntl’ and ‘ioctl’ system calls +----------------------------------------------------- + +__________________________________________________________________ + +This module performs file control and I/O control on file descriptors. +It is an interface to the ‘fcntl()’ and ‘ioctl()’ Unix routines. For a +complete description of these calls, see ‘fcntl(2)’ and ‘ioctl(2)’ Unix +manual pages. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +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 +‘sys.stdin.fileno()’, or an *note io.IOBase: 641. object, such as +‘sys.stdin’ itself, which provides a *note fileno(): 24aa. that returns +a genuine file descriptor. + +Changed in version 3.3: Operations in this module used to raise an *note +IOError: d02. where they now raise an *note OSError: 413. + +Changed in version 3.8: The fcntl module now contains ‘F_ADD_SEALS’, +‘F_GET_SEALS’, and ‘F_SEAL_*’ constants for sealing of *note +os.memfd_create(): 652. file descriptors. + +Changed in version 3.9: On macOS, the fcntl module exposes the +‘F_GETPATH’ constant, which obtains the path of a file from a file +descriptor. On Linux(>=3.15), the fcntl module exposes the +‘F_OFD_GETLK’, ‘F_OFD_SETLK’ and ‘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 fcntl module exposes +the ‘F_GETPIPE_SZ’ and ‘F_SETPIPE_SZ’ constants, which allow to check +and modify a pipe’s size respectively. + +Changed in version 3.11: On FreeBSD, the fcntl module exposes the +‘F_DUP2FD’ and ‘F_DUP2FD_CLOEXEC’ constants, which allow to duplicate a +file descriptor, the latter setting ‘FD_CLOEXEC’ flag in addition. + +The module defines the following functions: + + -- Function: fcntl.fcntl (fd, cmd, arg=0) + + Perform the operation `cmd' on file descriptor `fd' (file objects + providing a *note fileno(): 24aa. method are accepted as well). + The values used for `cmd' are operating system dependent, and are + available as constants in the *note fcntl: 79. module, using the + same names as used in the relevant C header files. The argument + `arg' can either be an integer value, or a *note bytes: 1b4. + object. With an integer value, the return value of this function + is the integer return value of the C ‘fcntl()’ call. When the + argument is bytes it represents a binary structure, e.g. created + by *note struct.pack(): f2f. The binary data is copied to a buffer + whose address is passed to the C ‘fcntl()’ call. The return value + after a successful call is the contents of the buffer, converted to + a *note bytes: 1b4. 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 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. + + If the ‘fcntl()’ fails, an *note OSError: 413. is raised. + + Raises an *note auditing event: 12c0. ‘fcntl.fcntl’ with arguments + ‘fd’, ‘cmd’, ‘arg’. + + -- Function: fcntl.ioctl (fd, request, arg=0, mutate_flag=True) + + This function is identical to the *note fcntl(): 2c95. function, + except that the argument handling is even more complicated. + + The `request' parameter is limited to values that can fit in + 32-bits. Additional constants of interest for use as the `request' + argument can be found in the *note termios: 100. module, under the + same names as used in the relevant C header files. + + The parameter `arg' can be one of an integer, an object supporting + the read-only buffer interface (like *note bytes: 1b4.) or an + object supporting the read-write buffer interface (like *note + bytearray: 1a5.). + + In all but the last case, behaviour is as for the *note fcntl(): + 2c95. function. + + If a mutable buffer is passed, then the behaviour is determined by + the value of the `mutate_flag' parameter. + + If it is false, the buffer’s mutability is ignored and behaviour is + as for a read-only buffer, except that the 1024 byte limit + mentioned above is avoided – so long as the buffer you pass is at + least as long as what the operating system wants to put there, + things should work. + + If `mutate_flag' is true (the default), then the buffer is (in + effect) passed to the underlying *note ioctl(): 10dc. 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 *note ioctl(): + 10dc. 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 *note + ioctl(): 10dc. and copied back into the supplied buffer. + + If the ‘ioctl()’ fails, an *note OSError: 413. exception is raised. + + An 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]) + + Raises an *note auditing event: 12c0. ‘fcntl.ioctl’ with arguments + ‘fd’, ‘request’, ‘arg’. + + -- Function: fcntl.flock (fd, operation) + + Perform the lock operation `operation' on file descriptor `fd' + (file objects providing a *note fileno(): 24aa. method are accepted + as well). See the Unix manual ‘flock(2)’ for details. (On some + systems, this function is emulated using ‘fcntl()’.) + + If the ‘flock()’ fails, an *note OSError: 413. exception is raised. + + Raises an *note auditing event: 12c0. ‘fcntl.flock’ with arguments + ‘fd’, ‘operation’. + + -- Function: fcntl.lockf (fd, cmd, len=0, start=0, whence=0) + + This is essentially a wrapper around the *note fcntl(): 2c95. + locking calls. `fd' is the file descriptor (file objects providing + a *note fileno(): 24aa. method are accepted as well) of the file to + lock or unlock, and `cmd' is one of the following values: + + * ‘LOCK_UN’ – unlock + + * ‘LOCK_SH’ – acquire a shared lock + + * ‘LOCK_EX’ – acquire an exclusive lock + + When `cmd' is ‘LOCK_SH’ or ‘LOCK_EX’, it can also be bitwise ORed + with ‘LOCK_NB’ to avoid blocking on lock acquisition. If ‘LOCK_NB’ + is used and the lock cannot be acquired, an *note OSError: 413. + will be raised and the exception will have an `errno' attribute set + to ‘EACCES’ or ‘EAGAIN’ (depending on the operating system; for + portability, check for both values). On at least some systems, + ‘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 *note io.IOBase.seek(): 23b5, specifically: + + * ‘0’ – relative to the start of the file (*note os.SEEK_SET: + 1093.) + + * ‘1’ – relative to the current buffer position (*note + os.SEEK_CUR: 1094.) + + * ‘2’ – relative to the end of the file (*note os.SEEK_END: + 1095.) + + 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 *note auditing event: 12c0. ‘fcntl.lockf’ with arguments + ‘fd’, ‘cmd’, ‘len’, ‘start’, ‘whence’. + +Examples (all on a SVR4 compliant system): + + 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) + +Note that in the first example the return value variable `rv' will hold +an integer value; in the second example it will hold a *note bytes: 1b4. +object. The structure lay-out for the `lockdata' variable is system +dependent — therefore using the *note flock(): 3a45. call may be better. + +See also +........ + +Module *note os: c2. + + If the locking flags *note O_SHLOCK: 1096. and *note O_EXLOCK: + 1097. are present in the *note os: c2. module (on BSD only), the + *note os.open(): a10. function provides an alternative to the *note + lockf(): 1053. and *note flock(): 3a45. functions. + + +File: python.info, Node: resource — Resource usage information, Next: syslog — Unix syslog library routines, Prev: fcntl — The fcntl and ioctl system calls, Up: Unix Specific Services + +5.34.8 ‘resource’ — Resource usage information +---------------------------------------------- + +__________________________________________________________________ + +This module provides basic mechanisms for measuring and controlling +system resources utilized by a program. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +Symbolic constants are used to specify particular system resources and +to request usage information about either the current process or its +children. + +An *note OSError: 413. is raised on syscall failure. + + -- Exception: resource.error + + A deprecated alias of *note OSError: 413. + + Changed in version 3.3: Following PEP 3151(1), this class was made + an alias of *note OSError: 413. + +* Menu: + +* Resource Limits:: +* Resource Usage:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3151/ + + +File: python.info, Node: Resource Limits, Next: Resource Usage, Up: resource — Resource usage information + +5.34.8.1 Resource Limits +........................ + +Resources usage can be limited using the *note setrlimit(): 39e9. +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 ‘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. + + -- Data: resource.RLIM_INFINITY + + Constant used to represent the limit for an unlimited resource. + + -- Function: resource.getrlimit (resource) + + Returns a tuple ‘(soft, hard)’ with the current soft and hard + limits of `resource'. Raises *note ValueError: 1c8. if an invalid + resource is specified, or *note error: 3fbb. if the underlying + system call fails unexpectedly. + + -- Function: resource.setrlimit (resource, limits) + + Sets new limits of consumption of `resource'. The `limits' + argument must be a tuple ‘(soft, hard)’ of two integers describing + the new limits. A value of *note RLIM_INFINITY: 3fbd. can be used + to request a limit that is unlimited. + + Raises *note ValueError: 1c8. 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 *note + RLIM_INFINITY: 3fbd. when the hard or system limit for that + resource is not unlimited will result in a *note ValueError: 1c8. + A process with the effective UID of super-user can request any + valid limit value, including unlimited, but *note ValueError: 1c8. + will still be raised if the requested limit exceeds the system + imposed limit. + + ‘setrlimit’ may also raise *note error: 3fbb. if the underlying + system call fails. + + VxWorks only supports setting *note RLIMIT_NOFILE: 3fbf. + + Raises an *note auditing event: 12c0. ‘resource.setrlimit’ with + arguments ‘resource’, ‘limits’. + + -- Function: resource.prlimit (pid, resource[, limits]) + + Combines *note setrlimit(): 39e9. and *note getrlimit(): 3fbe. 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 *note setrlimit(): 39e9, 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 *note ProcessLookupError: d0b. when `pid' can’t be found and + *note PermissionError: 9b9. when the user doesn’t have + ‘CAP_SYS_RESOURCE’ for the process. + + Raises an *note auditing event: 12c0. ‘resource.prlimit’ with + arguments ‘pid’, ‘resource’, ‘limits’. + + *note Availability: 1794.: Linux >= 2.6.36 with glibc >= 2.13. + + New in version 3.4. + +These symbols define resources whose consumption can be controlled using +the *note setrlimit(): 39e9. and *note getrlimit(): 3fbe. functions +described below. The values of these symbols are exactly the constants +used by C programs. + +The Unix man page for ‘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. + + -- 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. + + -- Data: resource.RLIMIT_CPU + + The maximum amount of processor time (in seconds) that a process + can use. If this limit is exceeded, a ‘SIGXCPU’ signal is sent to + the process. (See the *note signal: e7. module documentation for + information about how to catch this signal and do something useful, + e.g. flush open files to disk.) + + -- Data: resource.RLIMIT_FSIZE + + The maximum size of a file which the process may create. + + -- Data: resource.RLIMIT_DATA + + The maximum size (in bytes) of the process’s heap. + + -- 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. + + -- Data: resource.RLIMIT_RSS + + The maximum resident set size that should be made available to the + process. + + -- Data: resource.RLIMIT_NPROC + + The maximum number of processes the current process may create. + + -- Data: resource.RLIMIT_NOFILE + + The maximum number of open file descriptors for the current + process. + + -- Data: resource.RLIMIT_OFILE + + The BSD name for *note RLIMIT_NOFILE: 3fbf. + + -- Data: resource.RLIMIT_MEMLOCK + + The maximum address space which may be locked in memory. + + -- Data: resource.RLIMIT_VMEM + + The largest area of mapped memory which the process may occupy. + + -- Data: resource.RLIMIT_AS + + The maximum area (in bytes) of address space which may be taken by + the process. + + -- Data: resource.RLIMIT_MSGQUEUE + + The number of bytes that can be allocated for POSIX message queues. + + *note Availability: 1794.: Linux >= 2.6.8. + + New in version 3.4. + + -- Data: resource.RLIMIT_NICE + + The ceiling for the process’s nice level (calculated as 20 - + rlim_cur). + + *note Availability: 1794.: Linux >= 2.6.12. + + New in version 3.4. + + -- Data: resource.RLIMIT_RTPRIO + + The ceiling of the real-time priority. + + *note Availability: 1794.: Linux >= 2.6.12. + + New in version 3.4. + + -- 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. + + *note Availability: 1794.: Linux >= 2.6.25. + + New in version 3.4. + + -- Data: resource.RLIMIT_SIGPENDING + + The number of signals which the process may queue. + + *note Availability: 1794.: Linux >= 2.6.8. + + New in version 3.4. + + -- 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. + + *note Availability: 1794.: FreeBSD. + + New in version 3.4. + + -- 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)(1) for a complete description of this sysctl. + + *note Availability: 1794.: FreeBSD. + + New in version 3.4. + + -- Data: resource.RLIMIT_NPTS + + The maximum number of pseudo-terminals created by this user id. + + *note Availability: 1794.: FreeBSD. + + New in version 3.4. + + -- Data: resource.RLIMIT_KQUEUES + + The maximum number of kqueues this user id is allowed to create. + + *note Availability: 1794.: FreeBSD >= 11. + + New in version 3.10. + + ---------- Footnotes ---------- + + (1) https://www.freebsd.org/cgi/man.cgi?query=tuning&sektion=7 + + +File: python.info, Node: Resource Usage, Prev: Resource Limits, Up: resource — Resource usage information + +5.34.8.2 Resource Usage +....................... + +These functions are used to retrieve resource usage information: + + -- 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 ‘RUSAGE_*’ constants described below. + + A simple 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)) + + The fields of the return value each describe how a particular + system resource has been used, e.g. amount of time spent running + is user mode or number of times the process was swapped out of main + memory. Some values are dependent on the clock tick internal, 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 ‘ru_utime’ and ‘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 ‘getrusage(2)’ man page for detailed information about + these values. A brief summary is presented here: + + Index Field Resource + + ----------------------------------------------------------------------------------- + + ‘0’ ‘ru_utime’ time in user mode (float seconds) + + + ‘1’ ‘ru_stime’ time in system mode (float seconds) + + + ‘2’ ‘ru_maxrss’ maximum resident set size + + + ‘3’ ‘ru_ixrss’ shared memory size + + + ‘4’ ‘ru_idrss’ unshared memory size + + + ‘5’ ‘ru_isrss’ unshared stack size + + + ‘6’ ‘ru_minflt’ page faults not requiring I/O + + + ‘7’ ‘ru_majflt’ page faults requiring I/O + + + ‘8’ ‘ru_nswap’ number of swap outs + + + ‘9’ ‘ru_inblock’ block input operations + + + ‘10’ ‘ru_oublock’ block output operations + + + ‘11’ ‘ru_msgsnd’ messages sent + + + ‘12’ ‘ru_msgrcv’ messages received + + + ‘13’ ‘ru_nsignals’ signals received + + + ‘14’ ‘ru_nvcsw’ voluntary context switches + + + ‘15’ ‘ru_nivcsw’ involuntary context switches + + + This function will raise a *note ValueError: 1c8. if an invalid + `who' parameter is specified. It may also raise *note error: 3fbb. + exception in unusual circumstances. + + -- Function: resource.getpagesize () + + Returns the number of bytes in a system page. (This need not be + the same as the hardware page size.) + +The following ‘RUSAGE_*’ symbols are passed to the *note getrusage(): +1098. function to specify which processes information should be provided +for. + + -- Data: resource.RUSAGE_SELF + + Pass to *note getrusage(): 1098. to request resources consumed by + the calling process, which is the sum of resources used by all + threads in the process. + + -- Data: resource.RUSAGE_CHILDREN + + Pass to *note getrusage(): 1098. to request resources consumed by + child processes of the calling process which have been terminated + and waited for. + + -- Data: resource.RUSAGE_BOTH + + Pass to *note getrusage(): 1098. to request resources consumed by + both the current process and child processes. May not be available + on all systems. + + -- Data: resource.RUSAGE_THREAD + + Pass to *note getrusage(): 1098. to request resources consumed by + the current thread. May not be available on all systems. + + New in version 3.2. + + +File: python.info, Node: syslog — Unix syslog library routines, Prev: resource — Resource usage information, Up: Unix Specific Services + +5.34.9 ‘syslog’ — Unix syslog library routines +---------------------------------------------- + +__________________________________________________________________ + +This module provides an interface to the Unix ‘syslog’ library routines. +Refer to the Unix manual pages for a detailed description of the +‘syslog’ facility. + +This module wraps the system ‘syslog’ family of routines. A pure Python +library that can speak to a syslog server is available in the *note +logging.handlers: aa. module as ‘SysLogHandler’. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +The module defines the following functions: + + -- Function: syslog.syslog (message) + + -- 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 ‘LOG_INFO’, determines the message + priority. If the facility is not encoded in `priority' using + logical-or (‘LOG_INFO | LOG_USER’), the value given in the *note + openlog(): 13c9. call is used. + + If *note openlog(): 13c9. has not been called prior to the call to + *note syslog(): fb, *note openlog(): 13c9. will be called with no + arguments. + + Raises an *note auditing event: 12c0. ‘syslog.syslog’ with + arguments ‘priority’, ‘message’. + + Changed in version 3.2: In previous versions, *note openlog(): + 13c9. would not be called automatically if it wasn’t called prior + to the call to *note syslog(): fb, deferring to the syslog + implementation to call ‘openlog()’. + + -- Function: syslog.openlog ([ident[, logoption[, facility]]]) + + Logging options of subsequent *note syslog(): fb. calls can be set + by calling *note openlog(): 13c9. *note syslog(): fb. will call + *note openlog(): 13c9. 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 ‘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 ‘LOG_USER’) sets the default facility for messages + which do not have a facility explicitly encoded. + + Raises an *note auditing event: 12c0. ‘syslog.openlog’ with + arguments ‘ident’, ‘logoption’, ‘facility’. + + Changed in version 3.2: In previous versions, keyword arguments + were not allowed, and `ident' was required. + + -- Function: syslog.closelog () + + Reset the syslog module values and call the system library + ‘closelog()’. + + This causes the module to behave as it does when initially + imported. For example, *note openlog(): 13c9. will be called on + the first *note syslog(): fb. call (if *note openlog(): 13c9. + hasn’t already been called), and `ident' and other *note openlog(): + 13c9. parameters are reset to defaults. + + Raises an *note auditing event: 12c0. ‘syslog.closelog’ with no + arguments. + + -- Function: syslog.setlogmask (maskpri) + + Set the priority mask to `maskpri' and return the previous mask + value. Calls to *note syslog(): fb. with a priority level not set + in `maskpri' are ignored. The default is to log all priorities. + The function ‘LOG_MASK(pri)’ calculates the mask for the individual + priority `pri'. The function ‘LOG_UPTO(pri)’ calculates the mask + for all priorities up to and including `pri'. + + Raises an *note auditing event: 12c0. ‘syslog.setlogmask’ with + argument ‘maskpri’. + +The module defines the following constants: + +Priority levels (high to low): + + ‘LOG_EMERG’, ‘LOG_ALERT’, ‘LOG_CRIT’, ‘LOG_ERR’, ‘LOG_WARNING’, + ‘LOG_NOTICE’, ‘LOG_INFO’, ‘LOG_DEBUG’. + +Facilities: + + ‘LOG_KERN’, ‘LOG_USER’, ‘LOG_MAIL’, ‘LOG_DAEMON’, ‘LOG_AUTH’, + ‘LOG_LPR’, ‘LOG_NEWS’, ‘LOG_UUCP’, ‘LOG_CRON’, ‘LOG_SYSLOG’, + ‘LOG_LOCAL0’ to ‘LOG_LOCAL7’, and, if defined in ‘<syslog.h>’, + ‘LOG_AUTHPRIV’. + +Log options: + + ‘LOG_PID’, ‘LOG_CONS’, ‘LOG_NDELAY’, and, if defined in + ‘<syslog.h>’, ‘LOG_ODELAY’, ‘LOG_NOWAIT’, and ‘LOG_PERROR’. + +* Menu: + +* Examples: Examples<35>. + + +File: python.info, Node: Examples<35>, Up: syslog — Unix syslog library routines + +5.34.9.1 Examples +................. + +* Menu: + +* Simple example:: + + +File: python.info, Node: Simple example, Up: Examples<35> + +5.34.9.2 Simple example +....................... + +A simple set of examples: + + import syslog + + syslog.syslog('Processing started') + if error: + syslog.syslog(syslog.LOG_ERR, 'Processing started') + +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: + + syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL) + syslog.syslog('E-mail processing initiated...') + + +File: python.info, Node: Superseded Modules, Next: Security Considerations<4>, Prev: Unix Specific Services, Up: The Python Standard Library + +5.35 Superseded Modules +======================= + +The modules described in this chapter are deprecated and only kept for +backwards compatibility. They have been superseded by other modules. + +* 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:: +* 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:: +* optparse — Parser for command line options:: +* 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:: + + +File: python.info, Node: aifc — Read and write AIFF and AIFC files, Next: asynchat — Asynchronous socket command/response handler, Up: Superseded Modules + +5.35.1 ‘aifc’ — Read and write AIFF and AIFC files +-------------------------------------------------- + +`Source code:' Lib/aifc.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note aifc: 4. module is deprecated (see PEP 594(2) for details). + +__________________________________________________________________ + +This module provides support for reading and writing AIFF and AIFF-C +files. AIFF is Audio Interchange File Format, a format for storing +digital audio samples in a file. AIFF-C is a newer version of the +format that includes the ability to compress the audio data. + +Audio files have a number of parameters that describe the audio data. +The sampling rate or frame rate is the number of times per second the +sound is sampled. The number of channels indicate if the audio is mono, +stereo, or quadro. Each frame consists of one sample per channel. The +sample size is the size in bytes of each sample. Thus a frame consists +of ‘nchannels * samplesize’ bytes, and a second’s worth of audio +consists of ‘nchannels * samplesize * framerate’ bytes. + +For example, CD quality audio has a sample size of two bytes (16 bits), +uses two channels (stereo) and has a frame rate of 44,100 frames/second. +This gives a frame size of 4 bytes (2*2), and a second’s worth occupies +2*2*44100 bytes (176,400 bytes). + +Module *note aifc: 4. defines the following function: + + -- Function: aifc.open (file, mode=None) + + Open an AIFF or AIFF-C file and return an object instance with + methods that are described below. The argument `file' is either a + string naming a file or a *note file object: e76. `mode' must be + ‘'r'’ or ‘'rb'’ when the file must be opened for reading, or ‘'w'’ + or ‘'wb'’ when the file must be opened for writing. If omitted, + ‘file.mode’ is used if it exists, otherwise ‘'rb'’ is used. When + used for writing, the file object should be seekable, unless you + know ahead of time how many samples you are going to write in total + and use ‘writeframesraw()’ and ‘setnframes()’. The *note open(): + 847. function may be used in a *note with: 19e. statement. When + the ‘with’ block completes, the *note close(): bad. method is + called. + + Changed in version 3.4: Support for the *note with: 19e. statement + was added. + +Objects returned by *note open(): 847. when a file is opened for reading +have the following methods: + + -- Method: aifc.getnchannels () + + Return the number of audio channels (1 for mono, 2 for stereo). + + -- Method: aifc.getsampwidth () + + Return the size in bytes of individual samples. + + -- Method: aifc.getframerate () + + Return the sampling rate (number of audio frames per second). + + -- Method: aifc.getnframes () + + Return the number of audio frames in the file. + + -- Method: aifc.getcomptype () + + Return a bytes array of length 4 describing the type of compression + used in the audio file. For AIFF files, the returned value is + ‘b'NONE'’. + + -- Method: aifc.getcompname () + + Return a bytes array convertible to a human-readable description of + the type of compression used in the audio file. For AIFF files, + the returned value is ‘b'not compressed'’. + + -- Method: aifc.getparams () + + Returns a *note namedtuple(): 538. ‘(nchannels, sampwidth, + framerate, nframes, comptype, compname)’, equivalent to output of + the ‘get*()’ methods. + + -- Method: aifc.getmarkers () + + Return a list of markers in the audio file. A marker consists of a + tuple of three elements. The first is the mark ID (an integer), + the second is the mark position in frames from the beginning of the + data (an integer), the third is the name of the mark (a string). + + -- Method: aifc.getmark (id) + + Return the tuple as described in *note getmarkers(): 3fdf. for the + mark with the given `id'. + + -- Method: aifc.readframes (nframes) + + Read and return the next `nframes' frames from the audio file. The + returned data is a string containing for each frame the + uncompressed samples of all channels. + + -- Method: aifc.rewind () + + Rewind the read pointer. The next *note readframes(): 3fe1. will + start from the beginning. + + -- Method: aifc.setpos (pos) + + Seek to the specified frame number. + + -- Method: aifc.tell () + + Return the current frame number. + + -- Method: aifc.close () + + Close the AIFF file. After calling this method, the object can no + longer be used. + +Objects returned by *note open(): 847. when a file is opened for writing +have all the above methods, except for ‘readframes()’ and ‘setpos()’. +In addition the following methods exist. The ‘get*()’ methods can only +be called after the corresponding ‘set*()’ methods have been called. +Before the first ‘writeframes()’ or ‘writeframesraw()’, all parameters +except for the number of frames must be filled in. + + -- Method: aifc.aiff () + + Create an AIFF file. The default is that an AIFF-C file is + created, unless the name of the file ends in ‘'.aiff'’ in which + case the default is an AIFF file. + + -- Method: aifc.aifc () + + Create an AIFF-C file. The default is that an AIFF-C file is + created, unless the name of the file ends in ‘'.aiff'’ in which + case the default is an AIFF file. + + -- Method: aifc.setnchannels (nchannels) + + Specify the number of channels in the audio file. + + -- Method: aifc.setsampwidth (width) + + Specify the size in bytes of audio samples. + + -- Method: aifc.setframerate (rate) + + Specify the sampling frequency in frames per second. + + -- Method: aifc.setnframes (nframes) + + Specify the number of frames that are to be written to the audio + file. If this parameter is not set, or not set correctly, the file + needs to support seeking. + + -- Method: aifc.setcomptype (type, name) + + Specify the compression type. If not specified, the audio data + will not be compressed. In AIFF files, compression is not + possible. The name parameter should be a human-readable + description of the compression type as a bytes array, the type + parameter should be a bytes array of length 4. Currently the + following compression types are supported: ‘b'NONE'’, ‘b'ULAW'’, + ‘b'ALAW'’, ‘b'G722'’. + + -- Method: aifc.setparams (nchannels, sampwidth, framerate, comptype, + compname) + + Set all the above parameters at once. The argument is a tuple + consisting of the various parameters. This means that it is + possible to use the result of a *note getparams(): bac. call as + argument to *note setparams(): 3fec. + + -- Method: aifc.setmark (id, pos, name) + + Add a mark with the given id (larger than 0), and the given name at + the given position. This method can be called at any time before + *note close(): bad. + + -- Method: aifc.tell () + + Return the current write position in the output file. Useful in + combination with *note setmark(): 3fed. + + -- Method: aifc.writeframes (data) + + Write data to the output file. This method can only be called + after the audio file parameters have been set. + + Changed in version 3.4: Any *note bytes-like object: 9a2. is now + accepted. + + -- Method: aifc.writeframesraw (data) + + Like *note writeframes(): baf, except that the header of the audio + file is not updated. + + Changed in version 3.4: Any *note bytes-like object: 9a2. is now + accepted. + + -- Method: aifc.close () + + Close the AIFF file. The header of the file is updated to reflect + the actual size of the audio data. After calling this method, the + object can no longer be used. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/aifc.py + + (2) https://peps.python.org/pep-0594/#aifc + + +File: python.info, Node: asynchat — Asynchronous socket command/response handler, Next: asyncore — Asynchronous socket handler, Prev: aifc — Read and write AIFF and AIFC files, Up: Superseded Modules + +5.35.2 ‘asynchat’ — Asynchronous socket command/response handler +---------------------------------------------------------------- + +`Source code:' Lib/asynchat.py(1) + +Deprecated since version 3.6, will be removed in version 3.12: The *note +asynchat: 8. module is deprecated (see PEP 594(2) for details). Please +use *note asyncio: 9. instead. + +__________________________________________________________________ + + Note: This module exists for backwards compatibility only. For new + code we recommend using *note asyncio: 9. + +This module builds on the *note asyncore: a. infrastructure, simplifying +asynchronous clients and servers and making it easier to handle +protocols whose elements are terminated by arbitrary strings, or are of +variable length. *note asynchat: 8. defines the abstract class *note +async_chat: c3d. that you subclass, providing implementations of the +‘collect_incoming_data()’ and ‘found_terminator()’ methods. It uses the +same asynchronous loop as *note asyncore: a, and the two types of +channel, *note asyncore.dispatcher: eec. and *note asynchat.async_chat: +c3d, can freely be mixed in the channel map. Typically an *note +asyncore.dispatcher: eec. server channel generates new *note +asynchat.async_chat: c3d. channel objects as it receives incoming +connection requests. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + + -- Class: asynchat.async_chat + + This class is an abstract subclass of *note asyncore.dispatcher: + eec. To make practical use of the code you must subclass *note + async_chat: c3d, providing meaningful *note + collect_incoming_data(): 3ff0. and *note found_terminator(): 3ff1. + methods. The *note asyncore.dispatcher: eec. methods can be used, + although not all make sense in a message/response context. + + Like *note asyncore.dispatcher: eec, *note async_chat: c3d. defines + a set of events that are generated by an analysis of socket + conditions after a ‘select()’ call. Once the polling loop has been + started the *note async_chat: c3d. object’s methods are called by + the event-processing framework with no action on the part of the + programmer. + + Two class attributes can be modified, to improve performance, or + possibly even to conserve memory. + + -- Data: ac_in_buffer_size + + The asynchronous input buffer size (default ‘4096’). + + -- Data: ac_out_buffer_size + + The asynchronous output buffer size (default ‘4096’). + + Unlike *note asyncore.dispatcher: eec, *note async_chat: c3d. + allows you to define a FIFO queue of `producers'. A producer need + have only one method, ‘more()’, which should return data to be + transmitted on the channel. The producer indicates exhaustion + (`i.e.' that it contains no more data) by having its ‘more()’ + method return the empty bytes object. At this point the *note + async_chat: c3d. object removes the producer from the queue and + starts using the next producer, if any. When the producer queue is + empty the ‘handle_write()’ method does nothing. You use the + channel object’s *note set_terminator(): 3ff4. method to describe + how to recognize the end of, or an important breakpoint in, an + incoming transmission from the remote endpoint. + + To build a functioning *note async_chat: c3d. subclass your input + methods *note collect_incoming_data(): 3ff0. and *note + found_terminator(): 3ff1. must handle the data that the channel + receives asynchronously. The methods are described below. + + -- Method: async_chat.close_when_done () + + Pushes a ‘None’ on to the producer queue. When this producer is + popped off the queue it causes the channel to be closed. + + -- Method: async_chat.collect_incoming_data (data) + + Called with `data' holding an arbitrary amount of received data. + The default method, which must be overridden, raises a *note + NotImplementedError: 9c7. exception. + + -- Method: async_chat.discard_buffers () + + In emergencies this method will discard any data held in the input + and/or output buffers and the producer queue. + + -- Method: async_chat.found_terminator () + + Called when the incoming data stream matches the termination + condition set by *note set_terminator(): 3ff4. The default method, + which must be overridden, raises a *note NotImplementedError: 9c7. + exception. The buffered input data should be available via an + instance attribute. + + -- Method: async_chat.get_terminator () + + Returns the current terminator for the channel. + + -- Method: async_chat.push (data) + + Pushes data on to the channel’s queue to ensure its transmission. + This is all you need to do to have the channel write the data out + to the network, although it is possible to use your own producers + in more complex schemes to implement encryption and chunking, for + example. + + -- Method: async_chat.push_with_producer (producer) + + Takes a producer object and adds it to the producer queue + associated with the channel. When all currently pushed producers + have been exhausted the channel will consume this producer’s data + by calling its ‘more()’ method and send the data to the remote + endpoint. + + -- Method: async_chat.set_terminator (term) + + Sets the terminating condition to be recognized on the channel. + ‘term’ may be any of three types of value, corresponding to three + different ways to handle incoming protocol data. + + term Description + + ------------------------------------------------------------------ + + `string' Will call *note found_terminator(): 3ff1. when + the string is found in the input stream + + + `integer' Will call *note found_terminator(): 3ff1. when + the indicated number of characters have been + received + + + ‘None’ The channel continues to collect data forever + + + Note that any data following the terminator will be available for + reading by the channel after *note found_terminator(): 3ff1. is + called. + +* Menu: + +* asynchat Example:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/asynchat.py + + (2) https://peps.python.org/pep-0594/#asynchat + + +File: python.info, Node: asynchat Example, Up: asynchat — Asynchronous socket command/response handler + +5.35.2.1 asynchat Example +......................... + +The following partial example shows how HTTP requests can be read with +*note async_chat: c3d. A web server might create an +‘http_request_handler’ object for each incoming client connection. +Notice that initially the channel terminator is set to match the blank +line at the end of the HTTP headers, and a flag indicates that the +headers are being read. + +Once the headers have been read, if the request is of type POST +(indicating that further data are present in the input stream) then the +‘Content-Length:’ header is used to set a numeric terminator to read the +right amount of data from the channel. + +The ‘handle_request()’ method is called once all relevant input has been +marshalled, after setting the channel terminator to ‘None’ to ensure +that any extraneous data sent by the web client are ignored. + + import asynchat + + class http_request_handler(asynchat.async_chat): + + def __init__(self, sock, addr, sessions, log): + asynchat.async_chat.__init__(self, sock=sock) + self.addr = addr + self.sessions = sessions + self.ibuffer = [] + self.obuffer = b"" + self.set_terminator(b"\r\n\r\n") + self.reading_headers = True + self.handling = False + self.cgi_data = None + self.log = log + + def collect_incoming_data(self, data): + """Buffer the data""" + self.ibuffer.append(data) + + def found_terminator(self): + if self.reading_headers: + self.reading_headers = False + self.parse_headers(b"".join(self.ibuffer)) + self.ibuffer = [] + if self.op.upper() == b"POST": + clen = self.headers.getheader("content-length") + self.set_terminator(int(clen)) + else: + self.handling = True + self.set_terminator(None) + self.handle_request() + elif not self.handling: + self.set_terminator(None) # browsers sometimes over-send + self.cgi_data = parse(self.headers, b"".join(self.ibuffer)) + self.handling = True + self.ibuffer = [] + self.handle_request() + + +File: python.info, Node: asyncore — Asynchronous socket handler, Next: audioop — Manipulate raw audio data, Prev: asynchat — Asynchronous socket command/response handler, Up: Superseded Modules + +5.35.3 ‘asyncore’ — Asynchronous socket handler +----------------------------------------------- + +`Source code:' Lib/asyncore.py(1) + +Deprecated since version 3.6, will be removed in version 3.12: The *note +asyncore: a. module is deprecated (see PEP 594(2) for details). Please +use *note asyncio: 9. instead. + +__________________________________________________________________ + + Note: This module exists for backwards compatibility only. For new + code we recommend using *note asyncio: 9. + +This module provides the basic infrastructure for writing asynchronous +socket service clients and servers. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +There are only two ways to have a program on a single processor do “more +than one thing at a time.” Multi-threaded programming is the simplest +and most popular way to do it, but there is another very different +technique, that lets you have nearly all the advantages of +multi-threading, without actually using multiple threads. It’s really +only practical if your program is largely I/O bound. If your program is +processor bound, then pre-emptive scheduled threads are probably what +you really need. Network servers are rarely processor bound, however. + +If your operating system supports the ‘select()’ system call in its I/O +library (and nearly all do), then you can use it to juggle multiple +communication channels at once; doing other work while your I/O is +taking place in the “background.” Although this strategy can seem +strange and complex, especially at first, it is in many ways easier to +understand and control than multi-threaded programming. The *note +asyncore: a. module solves many of the difficult problems for you, +making the task of building sophisticated high-performance network +servers and clients a snap. For “conversational” applications and +protocols the companion *note asynchat: 8. module is invaluable. + +The basic idea behind both modules is to create one or more network +`channels', instances of class *note asyncore.dispatcher: eec. and *note +asynchat.async_chat: c3d. Creating the channels adds them to a global +map, used by the *note loop(): 3ffe. function if you do not provide it +with your own `map'. + +Once the initial channel(s) is(are) created, calling the *note loop(): +3ffe. function activates channel service, which continues until the last +channel (including any that have been added to the map during +asynchronous service) is closed. + + -- Function: asyncore.loop ([timeout[, use_poll[, map[, count]]]]) + + Enter a polling loop that terminates after count passes or all open + channels have been closed. All arguments are optional. The + `count' parameter defaults to ‘None’, resulting in the loop + terminating only when all channels have been closed. The `timeout' + argument sets the timeout parameter for the appropriate *note + select(): a1e. or *note poll(): 257d. call, measured in seconds; + the default is 30 seconds. The `use_poll' parameter, if true, + indicates that *note poll(): 257d. should be used in preference to + *note select(): a1e. (the default is ‘False’). + + The `map' parameter is a dictionary whose items are the channels to + watch. As channels are closed they are deleted from their map. If + `map' is omitted, a global map is used. Channels (instances of + *note asyncore.dispatcher: eec, *note asynchat.async_chat: c3d. and + subclasses thereof) can freely be mixed in the map. + + -- Class: asyncore.dispatcher + + The *note dispatcher: eec. class is a thin wrapper around a + low-level socket object. To make it more useful, it has a few + methods for event-handling which are called from the asynchronous + loop. Otherwise, it can be treated as a normal non-blocking socket + object. + + The firing of low-level events at certain times or in certain + connection states tells the asynchronous loop that certain + higher-level events have taken place. For example, if we have + asked for a socket to connect to another host, we know that the + connection has been made when the socket becomes writable for the + first time (at this point you know that you may write to it with + the expectation of success). The implied higher-level events are: + + Event Description + + ------------------------------------------------------------------------ + + ‘handle_connect()’ Implied by the first read or write event + + + ‘handle_close()’ Implied by a read event with no data + available + + + ‘handle_accepted()’ Implied by a read event on a listening + socket + + + During asynchronous processing, each mapped channel’s *note + readable(): 3fff. and *note writable(): 4000. methods are used to + determine whether the channel’s socket should be added to the list + of channels ‘select()’ed or ‘poll()’ed for read and write events. + + Thus, the set of channel events is larger than the basic socket + events. The full set of methods that can be overridden in your + subclass follows: + + -- Method: handle_read () + + Called when the asynchronous loop detects that a ‘read()’ call + on the channel’s socket will succeed. + + -- Method: handle_write () + + Called when the asynchronous loop detects that a writable + socket can be written. Often this method will implement the + necessary buffering for performance. For example: + + def handle_write(self): + sent = self.send(self.buffer) + self.buffer = self.buffer[sent:] + + -- Method: handle_expt () + + Called when there is out of band (OOB) data for a socket + connection. This will almost never happen, as OOB is + tenuously supported and rarely used. + + -- Method: handle_connect () + + Called when the active opener’s socket actually makes a + connection. Might send a “welcome” banner, or initiate a + protocol negotiation with the remote endpoint, for example. + + -- Method: handle_close () + + Called when the socket is closed. + + -- Method: handle_error () + + Called when an exception is raised and not otherwise handled. + The default version prints a condensed traceback. + + -- Method: handle_accept () + + Called on listening channels (passive openers) when a + connection can be established with a new remote endpoint that + has issued a *note connect(): 4007. call for the local + endpoint. Deprecated in version 3.2; use *note + handle_accepted(): eed. instead. + + Deprecated since version 3.2. + + -- Method: handle_accepted (sock, addr) + + Called on listening channels (passive openers) when a + connection has been established with a new remote endpoint + that has issued a *note connect(): 4007. call for the local + endpoint. `sock' is a `new' socket object usable to send and + receive data on the connection, and `addr' is the address + bound to the socket on the other end of the connection. + + New in version 3.2. + + -- Method: readable () + + Called each time around the asynchronous loop to determine + whether a channel’s socket should be added to the list on + which read events can occur. The default method simply + returns ‘True’, indicating that by default, all channels will + be interested in read events. + + -- Method: writable () + + Called each time around the asynchronous loop to determine + whether a channel’s socket should be added to the list on + which write events can occur. The default method simply + returns ‘True’, indicating that by default, all channels will + be interested in write events. + + In addition, each channel delegates or extends many of the socket + methods. Most of these are nearly identical to their socket + partners. + + -- Method: create_socket (family=socket.AF_INET, + type=socket.SOCK_STREAM) + + This is identical to the creation of a normal socket, and will + use the same options for creation. Refer to the *note socket: + ec. documentation for information on creating sockets. + + Changed in version 3.3: `family' and `type' arguments can be + omitted. + + -- Method: connect (address) + + As with the normal socket object, `address' is a tuple with + the first element the host to connect to, and the second the + port number. + + -- Method: send (data) + + Send `data' to the remote end-point of the socket. + + -- Method: recv (buffer_size) + + Read at most `buffer_size' bytes from the socket’s remote + end-point. An empty bytes object implies that the channel has + been closed from the other end. + + Note that *note recv(): 400a. may raise *note BlockingIOError: + d07. , even though *note select.select(): a1e. or *note + select.poll(): 257d. has reported the socket ready for + reading. + + -- Method: listen (backlog) + + Listen for connections made to the socket. The `backlog' + argument specifies the maximum number of queued connections + and should be at least 1; the maximum value is + system-dependent (usually 5). + + -- Method: bind (address) + + Bind the socket to `address'. The socket must not already be + bound. (The format of `address' depends on the address family + — refer to the *note socket: ec. documentation for more + information.) To mark the socket as re-usable (setting the + ‘SO_REUSEADDR’ option), call the *note dispatcher: eec. + object’s ‘set_reuse_addr()’ method. + + -- Method: accept () + + Accept a connection. The socket must be bound to an address + and listening for connections. The return value can be either + ‘None’ or a pair ‘(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. When ‘None’ is returned + it means the connection didn’t take place, in which case the + server should just ignore this event and keep listening for + further incoming connections. + + -- Method: close () + + Close the socket. All future operations on the socket object + will fail. The remote end-point will receive no more data + (after queued data is flushed). Sockets are automatically + closed when they are garbage-collected. + + -- Class: asyncore.dispatcher_with_send + + A *note dispatcher: eec. subclass which adds simple buffered output + capability, useful for simple clients. For more sophisticated + usage use *note asynchat.async_chat: c3d. + + -- Class: asyncore.file_dispatcher + + A file_dispatcher takes a file descriptor or *note file object: + e76. along with an optional map argument and wraps it for use with + the ‘poll()’ or ‘loop()’ functions. If provided a file object or + anything with a ‘fileno()’ method, that method will be called and + passed to the *note file_wrapper: 4010. constructor. + + *note Availability: 1794.: Unix. + + -- Class: asyncore.file_wrapper + + A file_wrapper takes an integer file descriptor and calls *note + os.dup(): 1406. to duplicate the handle so that the original handle + may be closed independently of the file_wrapper. This class + implements sufficient methods to emulate a socket for use by the + *note file_dispatcher: 400f. class. + + *note Availability: 1794.: Unix. + +* Menu: + +* asyncore Example basic HTTP client:: +* asyncore Example basic echo server:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/asyncore.py + + (2) https://peps.python.org/pep-0594/#asyncore + + +File: python.info, Node: asyncore Example basic HTTP client, Next: asyncore Example basic echo server, Up: asyncore — Asynchronous socket handler + +5.35.3.1 asyncore Example basic HTTP client +........................................... + +Here is a very basic HTTP client that uses the *note dispatcher: eec. +class to implement its socket handling: + + import asyncore + + class HTTPClient(asyncore.dispatcher): + + def __init__(self, host, path): + asyncore.dispatcher.__init__(self) + self.create_socket() + self.connect( (host, 80) ) + self.buffer = bytes('GET %s HTTP/1.0\r\nHost: %s\r\n\r\n' % + (path, host), 'ascii') + + def handle_connect(self): + pass + + def handle_close(self): + self.close() + + def handle_read(self): + print(self.recv(8192)) + + def writable(self): + return (len(self.buffer) > 0) + + def handle_write(self): + sent = self.send(self.buffer) + self.buffer = self.buffer[sent:] + + + client = HTTPClient('www.python.org', '/') + asyncore.loop() + + +File: python.info, Node: asyncore Example basic echo server, Prev: asyncore Example basic HTTP client, Up: asyncore — Asynchronous socket handler + +5.35.3.2 asyncore Example basic echo server +........................................... + +Here is a basic echo server that uses the *note dispatcher: eec. class +to accept connections and dispatches the incoming connections to a +handler: + + import asyncore + + class EchoHandler(asyncore.dispatcher_with_send): + + def handle_read(self): + data = self.recv(8192) + if data: + self.send(data) + + class EchoServer(asyncore.dispatcher): + + def __init__(self, host, port): + asyncore.dispatcher.__init__(self) + self.create_socket() + self.set_reuse_addr() + self.bind((host, port)) + self.listen(5) + + def handle_accepted(self, sock, addr): + print('Incoming connection from %s' % repr(addr)) + handler = EchoHandler(sock) + + server = EchoServer('localhost', 8080) + asyncore.loop() + + +File: python.info, Node: audioop — Manipulate raw audio data, Next: cgi — Common Gateway Interface support, Prev: asyncore — Asynchronous socket handler, Up: Superseded Modules + +5.35.4 ‘audioop’ — Manipulate raw audio data +-------------------------------------------- + +Deprecated since version 3.11, will be removed in version 3.13: The +*note audioop: c. module is deprecated (see PEP 594(1) for details). + +__________________________________________________________________ + +The *note audioop: c. module contains some useful operations on sound +fragments. It operates on sound fragments consisting of signed integer +samples 8, 16, 24 or 32 bits wide, stored in *note bytes-like objects: +9a2. All scalar items are integers, unless specified otherwise. + +Changed in version 3.4: Support for 24-bit samples was added. All +functions now accept any *note bytes-like object: 9a2. String input now +results in an immediate error. + +This module provides support for a-LAW, u-LAW and Intel/DVI ADPCM +encodings. + +A few of the more complicated operations only take 16-bit samples, +otherwise the sample size (in bytes) is always a parameter of the +operation. + +The module defines the following variables and functions: + + -- Exception: audioop.error + + This exception is raised on all errors, such as unknown number of + bytes per sample, etc. + + -- Function: audioop.add (fragment1, fragment2, width) + + Return a fragment which is the addition of the two samples passed + as parameters. `width' is the sample width in bytes, either ‘1’, + ‘2’, ‘3’ or ‘4’. Both fragments should have the same length. + Samples are truncated in case of overflow. + + -- Function: audioop.adpcm2lin (adpcmfragment, width, state) + + Decode an Intel/DVI ADPCM coded fragment to a linear fragment. See + the description of *note lin2adpcm(): 401a. for details on ADPCM + coding. Return a tuple ‘(sample, newstate)’ where the sample has + the width specified in `width'. + + -- Function: audioop.alaw2lin (fragment, width) + + Convert sound fragments in a-LAW encoding to linearly encoded sound + fragments. a-LAW encoding always uses 8 bits samples, so `width' + refers only to the sample width of the output fragment here. + + -- Function: audioop.avg (fragment, width) + + Return the average over all samples in the fragment. + + -- Function: audioop.avgpp (fragment, width) + + Return the average peak-peak value over all samples in the + fragment. No filtering is done, so the usefulness of this routine + is questionable. + + -- Function: audioop.bias (fragment, width, bias) + + Return a fragment that is the original fragment with a bias added + to each sample. Samples wrap around in case of overflow. + + -- Function: audioop.byteswap (fragment, width) + + “Byteswap” all samples in a fragment and returns the modified + fragment. Converts big-endian samples to little-endian and vice + versa. + + New in version 3.4. + + -- Function: audioop.cross (fragment, width) + + Return the number of zero crossings in the fragment passed as an + argument. + + -- Function: audioop.findfactor (fragment, reference) + + Return a factor `F' such that ‘rms(add(fragment, mul(reference, + -F)))’ is minimal, i.e., return the factor with which you should + multiply `reference' to make it match as well as possible to + `fragment'. The fragments should both contain 2-byte samples. + + The time taken by this routine is proportional to ‘len(fragment)’. + + -- Function: audioop.findfit (fragment, reference) + + Try to match `reference' as well as possible to a portion of + `fragment' (which should be the longer fragment). This is + (conceptually) done by taking slices out of `fragment', using *note + findfactor(): 4020. to compute the best match, and minimizing the + result. The fragments should both contain 2-byte samples. Return + a tuple ‘(offset, factor)’ where `offset' is the (integer) offset + into `fragment' where the optimal match started and `factor' is the + (floating-point) factor as per *note findfactor(): 4020. + + -- Function: audioop.findmax (fragment, length) + + Search `fragment' for a slice of length `length' samples (not + bytes!) with maximum energy, i.e., return `i' for which + ‘rms(fragment[i*2:(i+length)*2])’ is maximal. The fragments should + both contain 2-byte samples. + + The routine takes time proportional to ‘len(fragment)’. + + -- Function: audioop.getsample (fragment, width, index) + + Return the value of sample `index' from the fragment. + + -- Function: audioop.lin2adpcm (fragment, width, state) + + Convert samples to 4 bit Intel/DVI ADPCM encoding. ADPCM coding is + an adaptive coding scheme, whereby each 4 bit number is the + difference between one sample and the next, divided by a (varying) + step. The Intel/DVI ADPCM algorithm has been selected for use by + the IMA, so it may well become a standard. + + `state' is a tuple containing the state of the coder. The coder + returns a tuple ‘(adpcmfrag, newstate)’, and the `newstate' should + be passed to the next call of *note lin2adpcm(): 401a. In the + initial call, ‘None’ can be passed as the state. `adpcmfrag' is + the ADPCM coded fragment packed 2 4-bit values per byte. + + -- Function: audioop.lin2alaw (fragment, width) + + Convert samples in the audio fragment to a-LAW encoding and return + this as a bytes object. a-LAW is an audio encoding format whereby + you get a dynamic range of about 13 bits using only 8 bit samples. + It is used by the Sun audio hardware, among others. + + -- Function: audioop.lin2lin (fragment, width, newwidth) + + Convert samples between 1-, 2-, 3- and 4-byte formats. + + Note: In some audio formats, such as .WAV files, 16, 24 and 32 + bit samples are signed, but 8 bit samples are unsigned. So + when converting to 8 bit wide samples for these formats, you + need to also add 128 to the result: + + new_frames = audioop.lin2lin(frames, old_width, 1) + new_frames = audioop.bias(new_frames, 1, 128) + + The same, in reverse, has to be applied when converting from 8 + to 16, 24 or 32 bit width samples. + + -- Function: audioop.lin2ulaw (fragment, width) + + Convert samples in the audio fragment to u-LAW encoding and return + this as a bytes object. u-LAW is an audio encoding format whereby + you get a dynamic range of about 14 bits using only 8 bit samples. + It is used by the Sun audio hardware, among others. + + -- Function: audioop.max (fragment, width) + + Return the maximum of the `absolute value' of all samples in a + fragment. + + -- Function: audioop.maxpp (fragment, width) + + Return the maximum peak-peak value in the sound fragment. + + -- Function: audioop.minmax (fragment, width) + + Return a tuple consisting of the minimum and maximum values of all + samples in the sound fragment. + + -- Function: audioop.mul (fragment, width, factor) + + Return a fragment that has all samples in the original fragment + multiplied by the floating-point value `factor'. Samples are + truncated in case of overflow. + + -- Function: audioop.ratecv (fragment, width, nchannels, inrate, + outrate, state[, weightA[, weightB]]) + + Convert the frame rate of the input fragment. + + `state' is a tuple containing the state of the converter. The + converter returns a tuple ‘(newfragment, newstate)’, and `newstate' + should be passed to the next call of *note ratecv(): 402b. The + initial call should pass ‘None’ as the state. + + The `weightA' and `weightB' arguments are parameters for a simple + digital filter and default to ‘1’ and ‘0’ respectively. + + -- Function: audioop.reverse (fragment, width) + + Reverse the samples in a fragment and returns the modified + fragment. + + -- Function: audioop.rms (fragment, width) + + Return the root-mean-square of the fragment, i.e. + ‘sqrt(sum(S_i^2)/n)’. + + This is a measure of the power in an audio signal. + + -- Function: audioop.tomono (fragment, width, lfactor, rfactor) + + Convert a stereo fragment to a mono fragment. The left channel is + multiplied by `lfactor' and the right channel by `rfactor' before + adding the two channels to give a mono signal. + + -- Function: audioop.tostereo (fragment, width, lfactor, rfactor) + + Generate a stereo fragment from a mono fragment. Each pair of + samples in the stereo fragment are computed from the mono sample, + whereby left channel samples are multiplied by `lfactor' and right + channel samples by `rfactor'. + + -- Function: audioop.ulaw2lin (fragment, width) + + Convert sound fragments in u-LAW encoding to linearly encoded sound + fragments. u-LAW encoding always uses 8 bits samples, so `width' + refers only to the sample width of the output fragment here. + +Note that operations such as *note mul(): 402a. or *note max(): 4027. +make no distinction between mono and stereo fragments, i.e. all samples +are treated equal. If this is a problem the stereo fragment should be +split into two mono fragments first and recombined later. Here is an +example of how to do that: + + def mul_stereo(sample, width, lfactor, rfactor): + lsample = audioop.tomono(sample, width, 1, 0) + rsample = audioop.tomono(sample, width, 0, 1) + lsample = audioop.mul(lsample, width, lfactor) + rsample = audioop.mul(rsample, width, rfactor) + lsample = audioop.tostereo(lsample, width, 1, 0) + rsample = audioop.tostereo(rsample, width, 0, 1) + return audioop.add(lsample, rsample, width) + +If you use the ADPCM coder to build network packets and you want your +protocol to be stateless (i.e. to be able to tolerate packet loss) you +should not only transmit the data but also the state. Note that you +should send the `initial' state (the one you passed to *note +lin2adpcm(): 401a.) along to the decoder, not the final state (as +returned by the coder). If you want to use *note struct.Struct: 1e0d. +to store the state in binary you can code the first element (the +predicted value) in 16 bits and the second (the delta index) in 8. + +The ADPCM coders have never been tried against other ADPCM coders, only +against themselves. It could well be that I misinterpreted the +standards in which case they will not be interoperable with the +respective standards. + +The ‘find*()’ routines might look a bit funny at first sight. They are +primarily meant to do echo cancellation. A reasonably fast way to do +this is to pick the most energetic piece of the output sample, locate +that in the input sample and subtract the whole output sample from the +input sample: + + def echocancel(outputdata, inputdata): + pos = audioop.findmax(outputdata, 800) # one tenth second + out_test = outputdata[pos*2:] + in_test = inputdata[pos*2:] + ipos, factor = audioop.findfit(in_test, out_test) + # Optional (for better cancellation): + # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], + # out_test) + prefill = '\0'*(pos+ipos)*2 + postfill = '\0'*(len(inputdata)-len(prefill)-len(outputdata)) + outputdata = prefill + audioop.mul(outputdata, 2, -factor) + postfill + return audioop.add(inputdata, outputdata, 2) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0594/#audioop + + +File: python.info, Node: cgi — Common Gateway Interface support, Next: cgitb — Traceback manager for CGI scripts, Prev: audioop — Manipulate raw audio data, Up: Superseded Modules + +5.35.5 ‘cgi’ — Common Gateway Interface support +----------------------------------------------- + +`Source code:' Lib/cgi.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note cgi: 14. module is deprecated (see PEP 594(2) for details and +alternatives). + +The ‘FieldStorage’ class can typically be replaced with *note +urllib.parse.parse_qsl(): 453. for ‘GET’ and ‘HEAD’ requests, and the +*note email.message: 6d. module or multipart(3) for ‘POST’ and ‘PUT’. +Most *note utility functions: 4033. have replacements. + +__________________________________________________________________ + +Support module for Common Gateway Interface (CGI) scripts. + +This module defines a number of utilities for use by CGI scripts written +in Python. + +The global variable ‘maxlen’ can be set to an integer indicating the +maximum size of a POST request. POST requests larger than this size +will result in a *note ValueError: 1c8. being raised during parsing. +The default value of this variable is ‘0’, meaning the request size is +unlimited. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +* Menu: + +* Introduction: Introduction<11>. +* Using the cgi module:: +* Higher Level Interface:: +* Functions: Functions<13>. +* Caring about security:: +* Installing your CGI script on a Unix system:: +* Testing your CGI script:: +* Debugging CGI scripts:: +* Common problems and solutions:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/cgi.py + + (2) https://peps.python.org/pep-0594/#cgi + + (3) https://pypi.org/project/multipart/ + + +File: python.info, Node: Introduction<11>, Next: Using the cgi module, Up: cgi — Common Gateway Interface support + +5.35.5.1 Introduction +..................... + +A CGI script is invoked by an HTTP server, usually to process user input +submitted through an HTML ‘<FORM>’ or ‘<ISINDEX>’ element. + +Most often, CGI scripts live in the server’s special ‘cgi-bin’ +directory. The HTTP server places all sorts of information about the +request (such as the client’s hostname, the requested URL, the query +string, and lots of other goodies) in the script’s shell environment, +executes the script, and sends the script’s output back to the client. + +The script’s input is connected to the client too, and sometimes the +form data is read this way; at other times the form data is passed via +the “query string” part of the URL. This module is intended to take care +of the different cases and provide a simpler interface to the Python +script. It also provides a number of utilities that help in debugging +scripts, and the latest addition is support for file uploads from a form +(if your browser supports it). + +The output of a CGI script should consist of two sections, separated by +a blank line. The first section contains a number of headers, telling +the client what kind of data is following. Python code to generate a +minimal header section looks like this: + + print("Content-Type: text/html") # HTML is following + print() # blank line, end of headers + +The second section is usually HTML, which allows the client software to +display nicely formatted text with header, in-line images, etc. Here’s +Python code that prints a simple piece of HTML: + + print("<TITLE>CGI script output") + print("

    This is my first CGI script

    ") + print("Hello, world!") + + +File: python.info, Node: Using the cgi module, Next: Higher Level Interface, Prev: Introduction<11>, Up: cgi — Common Gateway Interface support + +5.35.5.2 Using the cgi module +............................. + +Begin by writing ‘import cgi’. + +When you write a new script, consider adding these lines: + + import cgitb + cgitb.enable() + +This activates a special exception handler that will display detailed +reports in the web browser if any errors occur. If you’d rather not +show the guts of your program to users of your script, you can have the +reports saved to files instead, with code like this: + + import cgitb + cgitb.enable(display=0, logdir="/path/to/logdir") + +It’s very helpful to use this feature during script development. The +reports produced by *note cgitb: 15. provide information that can save +you a lot of time in tracking down bugs. You can always remove the +‘cgitb’ line later when you have tested your script and are confident +that it works correctly. + +To get at submitted form data, use the ‘FieldStorage’ class. If the +form contains non-ASCII characters, use the `encoding' keyword parameter +set to the value of the encoding defined for the document. It is +usually contained in the META tag in the HEAD section of the HTML +document or by the ‘Content-Type’ header. This reads the form contents +from the standard input or the environment (depending on the value of +various environment variables set according to the CGI standard). Since +it may consume standard input, it should be instantiated only once. + +The ‘FieldStorage’ instance can be indexed like a Python dictionary. It +allows membership testing with the *note in: 20a. operator, and also +supports the standard dictionary method *note keys(): 3b8. and the +built-in function *note len(): 209. Form fields containing empty +strings are ignored and do not appear in the dictionary; to keep such +values, provide a true value for the optional `keep_blank_values' +keyword parameter when creating the ‘FieldStorage’ instance. + +For instance, the following code (which assumes that the ‘Content-Type’ +header and blank line have already been printed) checks that the fields +‘name’ and ‘addr’ are both set to a non-empty string: + + form = cgi.FieldStorage() + if "name" not in form or "addr" not in form: + print("

    Error

    ") + print("Please fill in the name and addr fields.") + return + print("

    name:", form["name"].value) + print("

    addr:", form["addr"].value) + ...further form processing here... + +Here the fields, accessed through ‘form[key]’, are themselves instances +of ‘FieldStorage’ (or ‘MiniFieldStorage’, depending on the form +encoding). The ‘value’ attribute of the instance yields the string +value of the field. The ‘getvalue()’ method returns this string value +directly; it also accepts an optional second argument as a default to +return if the requested key is not present. + +If the submitted form data contains more than one field with the same +name, the object retrieved by ‘form[key]’ is not a ‘FieldStorage’ or +‘MiniFieldStorage’ instance but a list of such instances. Similarly, in +this situation, ‘form.getvalue(key)’ would return a list of strings. If +you expect this possibility (when your HTML form contains multiple +fields with the same name), use the *note getlist(): 4038. method, which +always returns a list of values (so that you do not need to special-case +the single item case). For example, this code concatenates any number +of username fields, separated by commas: + + value = form.getlist("username") + usernames = ",".join(value) + +If a field represents an uploaded file, accessing the value via the +‘value’ attribute or the ‘getvalue()’ method reads the entire file in +memory as bytes. This may not be what you want. You can test for an +uploaded file by testing either the ‘filename’ attribute or the ‘file’ +attribute. You can then read the data from the ‘file’ attribute before +it is automatically closed as part of the garbage collection of the +‘FieldStorage’ instance (the *note read(): aa0. and *note readline(): +1ce1. methods will return bytes): + + fileitem = form["userfile"] + if fileitem.file: + # It's an uploaded file; count lines + linecount = 0 + while True: + line = fileitem.file.readline() + if not line: break + linecount = linecount + 1 + +‘FieldStorage’ objects also support being used in a *note with: 19e. +statement, which will automatically close them when done. + +If an error is encountered when obtaining the contents of an uploaded +file (for example, when the user interrupts the form submission by +clicking on a Back or Cancel button) the ‘done’ attribute of the object +for the field will be set to the value -1. + +The file upload draft standard entertains the possibility of uploading +multiple files from one field (using a recursive ‘multipart/*’ +encoding). When this occurs, the item will be a dictionary-like +‘FieldStorage’ item. This can be determined by testing its ‘type’ +attribute, which should be ‘multipart/form-data’ (or perhaps another +MIME type matching ‘multipart/*’). In this case, it can be iterated +over recursively just like the top-level form object. + +When a form is submitted in the “old” format (as the query string or as +a single data part of type ‘application/x-www-form-urlencoded’), the +items will actually be instances of the class ‘MiniFieldStorage’. In +this case, the ‘list’, ‘file’, and ‘filename’ attributes are always +‘None’. + +A form submitted via POST that also has a query string will contain both +‘FieldStorage’ and ‘MiniFieldStorage’ items. + +Changed in version 3.4: The ‘file’ attribute is automatically closed +upon the garbage collection of the creating ‘FieldStorage’ instance. + +Changed in version 3.5: Added support for the context management +protocol to the ‘FieldStorage’ class. + + +File: python.info, Node: Higher Level Interface, Next: Functions<13>, Prev: Using the cgi module, Up: cgi — Common Gateway Interface support + +5.35.5.3 Higher Level Interface +............................... + +The previous section explains how to read CGI form data using the +‘FieldStorage’ class. This section describes a higher level interface +which was added to this class to allow one to do it in a more readable +and intuitive way. The interface doesn’t make the techniques described +in previous sections obsolete — they are still useful to process file +uploads efficiently, for example. + +The interface consists of two simple methods. Using the methods you can +process form data in a generic way, without the need to worry whether +only one or more values were posted under one name. + +In the previous section, you learned to write following code anytime you +expected a user to post more than one value under one name: + + item = form.getvalue("item") + if isinstance(item, list): + # The user is requesting more than one item. + else: + # The user is requesting only one item. + +This situation is common for example when a form contains a group of +multiple checkboxes with the same name: + + + + +In most situations, however, there’s only one form control with a +particular name in a form and then you expect and need only one value +associated with this name. So you write a script containing for example +this code: + + user = form.getvalue("user").upper() + +The problem with the code is that you should never expect that a client +will provide valid input to your scripts. For example, if a curious +user appends another ‘user=foo’ pair to the query string, then the +script would crash, because in this situation the ‘getvalue("user")’ +method call returns a list instead of a string. Calling the *note +upper(): 1c20. method on a list is not valid (since lists do not have a +method of this name) and results in an *note AttributeError: 19d. +exception. + +Therefore, the appropriate way to read form data values was to always +use the code which checks whether the obtained value is a single value +or a list of values. That’s annoying and leads to less readable +scripts. + +A more convenient approach is to use the methods *note getfirst(): 403a. +and *note getlist(): 4038. provided by this higher level interface. + + -- Method: FieldStorage.getfirst (name, default=None) + + This method always returns only one value associated with form + field `name'. The method returns only the first value in case that + more values were posted under such name. Please note that the + order in which the values are received may vary from browser to + browser and should not be counted on. (1) If no such form field + or value exists then the method returns the value specified by the + optional parameter `default'. This parameter defaults to ‘None’ if + not specified. + + -- Method: FieldStorage.getlist (name) + + This method always returns a list of values associated with form + field `name'. The method returns an empty list if no such form + field or value exists for `name'. It returns a list consisting of + one item if only one such value exists. + +Using these methods you can write nice compact code: + + import cgi + form = cgi.FieldStorage() + user = form.getfirst("user", "").upper() # This way it's safe. + for item in form.getlist("item"): + do_something(item) + + ---------- Footnotes ---------- + + (1) Note that some recent versions of the HTML specification do state +what order the field values should be supplied in, but knowing whether a +request was received from a conforming browser, or even from a browser +at all, is tedious and error-prone. + + +File: python.info, Node: Functions<13>, Next: Caring about security, Prev: Higher Level Interface, Up: cgi — Common Gateway Interface support + +5.35.5.4 Functions +.................. + +These are useful if you want more control, or if you want to employ some +of the algorithms implemented in this module in other circumstances. + + -- Function: cgi.parse (fp=None, environ=os.environ, + keep_blank_values=False, strict_parsing=False, separator='&') + + Parse a query in the environment or from a file (the file defaults + to ‘sys.stdin’). The `keep_blank_values', `strict_parsing' and + `separator' parameters are passed to *note urllib.parse.parse_qs(): + 452. unchanged. + + Deprecated since version 3.11, will be removed in version 3.13: + This function, like the rest of the *note cgi: 14. module, is + deprecated. It can be replaced by calling *note + urllib.parse.parse_qs(): 452. directly on the desired query string + (except for ‘multipart/form-data’ input, which can be handled as + described for *note parse_multipart(): 455.). + + -- Function: cgi.parse_multipart (fp, pdict, encoding='utf-8', + errors='replace', separator='&') + + Parse input of type ‘multipart/form-data’ (for file uploads). + Arguments are `fp' for the input file, `pdict' for a dictionary + containing other parameters in the ‘Content-Type’ header, and + `encoding', the request encoding. + + Returns a dictionary just like *note urllib.parse.parse_qs(): 452.: + keys are the field names, each value is a list of values for that + field. For non-file fields, the value is a list of strings. + + This is easy to use but not much good if you are expecting + megabytes to be uploaded — in that case, use the ‘FieldStorage’ + class instead which is much more flexible. + + Changed in version 3.7: Added the `encoding' and `errors' + parameters. For non-file fields, the value is now a list of + strings, not bytes. + + Changed in version 3.10: Added the `separator' parameter. + + Deprecated since version 3.11, will be removed in version 3.13: + This function, like the rest of the *note cgi: 14. module, is + deprecated. It can be replaced with the functionality in the *note + email: 64. package (e.g. *note email.message.EmailMessage: + 90c./*note email.message.Message: 90b.) which implements the same + MIME RFCs, or with the multipart(1) PyPI project. + + -- Function: cgi.parse_header (string) + + Parse a MIME header (such as ‘Content-Type’) into a main value and + a dictionary of parameters. + + Deprecated since version 3.11, will be removed in version 3.13: + This function, like the rest of the *note cgi: 14. module, is + deprecated. It can be replaced with the functionality in the *note + email: 64. package, which implements the same MIME RFCs. + + For example, with *note email.message.EmailMessage: 90c.: + + from email.message import EmailMessage + msg = EmailMessage() + msg['content-type'] = 'application/json; charset="utf8"' + main, params = msg.get_content_type(), msg['content-type'].params + + -- Function: cgi.test () + + Robust test CGI script, usable as main program. Writes minimal + HTTP headers and formats all information provided to the script in + HTML format. + + -- Function: cgi.print_environ () + + Format the shell environment in HTML. + + -- Function: cgi.print_form (form) + + Format a form in HTML. + + -- Function: cgi.print_directory () + + Format the current directory in HTML. + + -- Function: cgi.print_environ_usage () + + Print a list of useful (used by CGI) environment variables in HTML. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/multipart/ + + +File: python.info, Node: Caring about security, Next: Installing your CGI script on a Unix system, Prev: Functions<13>, Up: cgi — Common Gateway Interface support + +5.35.5.5 Caring about security +.............................. + +There’s one important rule: if you invoke an external program (via *note +os.system(): 10c0, *note os.popen(): 6d9. or other functions with +similar functionality), make very sure you don’t pass arbitrary strings +received from the client to the shell. This is a well-known security +hole whereby clever hackers anywhere on the web can exploit a gullible +CGI script to invoke arbitrary shell commands. Even parts of the URL or +field names cannot be trusted, since the request doesn’t have to come +from your form! + +To be on the safe side, if you must pass a string gotten from a form to +a shell command, you should make sure the string contains only +alphanumeric characters, dashes, underscores, and periods. + + +File: python.info, Node: Installing your CGI script on a Unix system, Next: Testing your CGI script, Prev: Caring about security, Up: cgi — Common Gateway Interface support + +5.35.5.6 Installing your CGI script on a Unix system +.................................................... + +Read the documentation for your HTTP server and check with your local +system administrator to find the directory where CGI scripts should be +installed; usually this is in a directory ‘cgi-bin’ in the server tree. + +Make sure that your script is readable and executable by “others”; the +Unix file mode should be ‘0o755’ octal (use ‘chmod 0755 filename’). +Make sure that the first line of the script contains ‘#!’ starting in +column 1 followed by the pathname of the Python interpreter, for +instance: + + #!/usr/local/bin/python + +Make sure the Python interpreter exists and is executable by “others”. + +Make sure that any files your script needs to read or write are readable +or writable, respectively, by “others” — their mode should be ‘0o644’ +for readable and ‘0o666’ for writable. This is because, for security +reasons, the HTTP server executes your script as user “nobody”, without +any special privileges. It can only read (write, execute) files that +everybody can read (write, execute). The current directory at execution +time is also different (it is usually the server’s cgi-bin directory) +and the set of environment variables is also different from what you get +when you log in. In particular, don’t count on the shell’s search path +for executables ( ‘PATH’) or the Python module search path ( *note +PYTHONPATH: cc7.) to be set to anything interesting. + +If you need to load modules from a directory which is not on Python’s +default module search path, you can change the path in your script, +before importing other modules. For example: + + import sys + sys.path.insert(0, "/usr/home/joe/lib/python") + sys.path.insert(0, "/usr/local/lib/python") + +(This way, the directory inserted last will be searched first!) + +Instructions for non-Unix systems will vary; check your HTTP server’s +documentation (it will usually have a section on CGI scripts). + + +File: python.info, Node: Testing your CGI script, Next: Debugging CGI scripts, Prev: Installing your CGI script on a Unix system, Up: cgi — Common Gateway Interface support + +5.35.5.7 Testing your CGI script +................................ + +Unfortunately, a CGI script will generally not run when you try it from +the command line, and a script that works perfectly from the command +line may fail mysteriously when run from the server. There’s one reason +why you should still test your script from the command line: if it +contains a syntax error, the Python interpreter won’t execute it at all, +and the HTTP server will most likely send a cryptic error to the client. + +Assuming your script has no syntax errors, yet it does not work, you +have no choice but to read the next section. + + +File: python.info, Node: Debugging CGI scripts, Next: Common problems and solutions, Prev: Testing your CGI script, Up: cgi — Common Gateway Interface support + +5.35.5.8 Debugging CGI scripts +.............................. + +First of all, check for trivial installation errors — reading the +section above on installing your CGI script carefully can save you a lot +of time. If you wonder whether you have understood the installation +procedure correctly, try installing a copy of this module file +(‘cgi.py’) as a CGI script. When invoked as a script, the file will +dump its environment and the contents of the form in HTML format. Give +it the right mode etc., and send it a request. If it’s installed in the +standard ‘cgi-bin’ directory, it should be possible to send it a request +by entering a URL into your browser of the form: + + http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home + +If this gives an error of type 404, the server cannot find the script – +perhaps you need to install it in a different directory. If it gives +another error, there’s an installation problem that you should fix +before trying to go any further. If you get a nicely formatted listing +of the environment and form content (in this example, the fields should +be listed as “addr” with value “At Home” and “name” with value “Joe +Blow”), the ‘cgi.py’ script has been installed correctly. If you follow +the same procedure for your own script, you should now be able to debug +it. + +The next step could be to call the *note cgi: 14. module’s *note test(): +101. function from your script: replace its main code with the single +statement + + cgi.test() + +This should produce the same results as those gotten from installing the +‘cgi.py’ file itself. + +When an ordinary Python script raises an unhandled exception (for +whatever reason: of a typo in a module name, a file that can’t be +opened, etc.), the Python interpreter prints a nice traceback and exits. +While the Python interpreter will still do this when your CGI script +raises an exception, most likely the traceback will end up in one of the +HTTP server’s log files, or be discarded altogether. + +Fortunately, once you have managed to get your script to execute `some' +code, you can easily send tracebacks to the web browser using the *note +cgitb: 15. module. If you haven’t done so already, just add the lines: + + import cgitb + cgitb.enable() + +to the top of your script. Then try running it again; when a problem +occurs, you should see a detailed report that will likely make apparent +the cause of the crash. + +If you suspect that there may be a problem in importing the *note cgitb: +15. module, you can use an even more robust approach (which only uses +built-in modules): + + import sys + sys.stderr = sys.stdout + print("Content-Type: text/plain") + print() + ...your code here... + +This relies on the Python interpreter to print the traceback. The +content type of the output is set to plain text, which disables all HTML +processing. If your script works, the raw HTML will be displayed by +your client. If it raises an exception, most likely after the first two +lines have been printed, a traceback will be displayed. Because no HTML +interpretation is going on, the traceback will be readable. + + +File: python.info, Node: Common problems and solutions, Prev: Debugging CGI scripts, Up: cgi — Common Gateway Interface support + +5.35.5.9 Common problems and solutions +...................................... + + * Most HTTP servers buffer the output from CGI scripts until the + script is completed. This means that it is not possible to display + a progress report on the client’s display while the script is + running. + + * Check the installation instructions above. + + * Check the HTTP server’s log files. (‘tail -f logfile’ in a + separate window may be useful!) + + * Always check a script for syntax errors first, by doing something + like ‘python script.py’. + + * If your script does not have any syntax errors, try adding ‘import + cgitb; cgitb.enable()’ to the top of the script. + + * When invoking external programs, make sure they can be found. + Usually, this means using absolute path names — ‘PATH’ is usually + not set to a very useful value in a CGI script. + + * When reading or writing external files, make sure they can be read + or written by the userid under which your CGI script will be + running: this is typically the userid under which the web server is + running, or some explicitly specified userid for a web server’s + ‘suexec’ feature. + + * Don’t try to give a CGI script a set-uid mode. This doesn’t work + on most systems, and is a security liability as well. + + +File: python.info, Node: cgitb — Traceback manager for CGI scripts, Next: chunk — Read IFF chunked data, Prev: cgi — Common Gateway Interface support, Up: Superseded Modules + +5.35.6 ‘cgitb’ — Traceback manager for CGI scripts +-------------------------------------------------- + +`Source code:' Lib/cgitb.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note cgitb: 15. module is deprecated (see PEP 594(2) for details). + +__________________________________________________________________ + +The *note cgitb: 15. module provides a special exception handler for +Python scripts. (Its name is a bit misleading. It was originally +designed to display extensive traceback information in HTML for CGI +scripts. It was later generalized to also display this information in +plain text.) After this module is activated, if an uncaught exception +occurs, a detailed, formatted report will be displayed. The report +includes a traceback showing excerpts of the source code for each level, +as well as the values of the arguments and local variables to currently +running functions, to help you debug the problem. Optionally, you can +save this information to a file instead of sending it to the browser. + +To enable this feature, simply add this to the top of your CGI script: + + import cgitb + cgitb.enable() + +The options to the *note enable(): 404a. function control whether the +report is displayed in the browser and whether the report is logged to a +file for later analysis. + + -- Function: cgitb.enable (display=1, logdir=None, context=5, + format='html') + + This function causes the *note cgitb: 15. module to take over the + interpreter’s default handling for exceptions by setting the value + of *note sys.excepthook: 3fe. + + The optional argument `display' defaults to ‘1’ and can be set to + ‘0’ to suppress sending the traceback to the browser. If the + argument `logdir' is present, the traceback reports are written to + files. The value of `logdir' should be a directory where these + files will be placed. The optional argument `context' is the + number of lines of context to display around the current line of + source code in the traceback; this defaults to ‘5’. If the + optional argument `format' is ‘"html"’, the output is formatted as + HTML. Any other value forces plain text output. The default value + is ‘"html"’. + + -- Function: cgitb.text (info, context=5) + + This function handles the exception described by `info' (a 3-tuple + containing the result of *note sys.exc_info(): 25b.), formatting + its traceback as text and returning the result as a string. The + optional argument `context' is the number of lines of context to + display around the current line of source code in the traceback; + this defaults to ‘5’. + + -- Function: cgitb.html (info, context=5) + + This function handles the exception described by `info' (a 3-tuple + containing the result of *note sys.exc_info(): 25b.), formatting + its traceback as HTML and returning the result as a string. The + optional argument `context' is the number of lines of context to + display around the current line of source code in the traceback; + this defaults to ‘5’. + + -- Function: cgitb.handler (info=None) + + This function handles an exception using the default settings (that + is, show a report in the browser, but don’t log to a file). This + can be used when you’ve caught an exception and want to report it + using *note cgitb: 15. The optional `info' argument should be a + 3-tuple containing an exception type, exception value, and + traceback object, exactly like the tuple returned by *note + sys.exc_info(): 25b. If the `info' argument is not supplied, the + current exception is obtained from *note sys.exc_info(): 25b. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/cgitb.py + + (2) https://peps.python.org/pep-0594/#cgitb + + +File: python.info, Node: chunk — Read IFF chunked data, Next: crypt — Function to check Unix passwords, Prev: cgitb — Traceback manager for CGI scripts, Up: Superseded Modules + +5.35.7 ‘chunk’ — Read IFF chunked data +-------------------------------------- + +`Source code:' Lib/chunk.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note chunk: 16. module is deprecated (see PEP 594(2) for details). + +__________________________________________________________________ + +This module provides an interface for reading files that use EA IFF 85 +chunks. (3) This format is used in at least the Audio Interchange File +Format (AIFF/AIFF-C) and the Real Media File Format (RMFF). The WAVE +audio file format is closely related and can also be read using this +module. + +A chunk has the following structure: + +Offset Length Contents + +--------------------------------------------------------------- + +0 4 Chunk ID + + +4 4 Size of chunk in big-endian byte + order, not including the header + + +8 `n' Data bytes, where `n' is the size + given in the preceding field + + +8 + `n' 0 or 1 Pad byte needed if `n' is odd and + chunk alignment is used + + +The ID is a 4-byte string which identifies the type of chunk. + +The size field (a 32-bit value, encoded using big-endian byte order) +gives the size of the chunk data, not including the 8-byte header. + +Usually an IFF-type file consists of one or more chunks. The proposed +usage of the *note Chunk: 4050. class defined here is to instantiate an +instance at the start of each chunk and read from the instance until it +reaches the end, after which a new instance can be instantiated. At the +end of the file, creating a new instance will fail with an *note +EOFError: f7d. exception. + + -- Class: chunk.Chunk (file, align=True, bigendian=True, + inclheader=False) + + Class which represents a chunk. The `file' argument is expected to + be a file-like object. An instance of this class is specifically + allowed. The only method that is needed is ‘read()’. If the + methods *note seek(): 23b5. and *note tell(): 23b6. are present and + don’t raise an exception, they are also used. If these methods are + present and raise an exception, they are expected to not have + altered the object. If the optional argument `align' is true, + chunks are assumed to be aligned on 2-byte boundaries. If `align' + is false, no alignment is assumed. The default value is true. If + the optional argument `bigendian' is false, the chunk size is + assumed to be in little-endian order. This is needed for WAVE + audio files. The default value is true. If the optional argument + `inclheader' is true, the size given in the chunk header includes + the size of the header. The default value is false. + + A *note Chunk: 4050. object supports the following methods: + + -- Method: getname () + + Returns the name (ID) of the chunk. This is the first 4 bytes + of the chunk. + + -- Method: getsize () + + Returns the size of the chunk. + + -- Method: close () + + Close and skip to the end of the chunk. This does not close + the underlying file. + + The remaining methods will raise *note OSError: 413. if called + after the *note close(): 4053. method has been called. Before + Python 3.3, they used to raise *note IOError: d02, now an alias of + *note OSError: 413. + + -- Method: isatty () + + Returns ‘False’. + + -- Method: seek (pos, whence=0) + + Set the chunk’s current position. The `whence' argument is + optional and defaults to ‘0’ (absolute file positioning); + other values are ‘1’ (seek relative to the current position) + and ‘2’ (seek relative to the file’s end). There is no return + value. If the underlying file does not allow seek, only + forward seeks are allowed. + + -- Method: tell () + + Return the current position into the chunk. + + -- Method: read (size=- 1) + + Read at most `size' bytes from the chunk (less if the read + hits the end of the chunk before obtaining `size' bytes). If + the `size' argument is negative or omitted, read all data + until the end of the chunk. An empty bytes object is returned + when the end of the chunk is encountered immediately. + + -- Method: skip () + + Skip to the end of the chunk. All further calls to *note + read(): 4057. for the chunk will return ‘b''’. If you are not + interested in the contents of the chunk, this method should be + called so that the file points to the start of the next chunk. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/chunk.py + + (2) https://peps.python.org/pep-0594/#chunk + + (3) “EA IFF 85” Standard for Interchange Format Files, Jerry +Morrison, Electronic Arts, January 1985. + + +File: python.info, Node: crypt — Function to check Unix passwords, Next: imghdr — Determine the type of an image, Prev: chunk — Read IFF chunked data, Up: Superseded Modules + +5.35.8 ‘crypt’ — Function to check Unix passwords +------------------------------------------------- + +`Source code:' Lib/crypt.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note crypt: 27. module is deprecated (see PEP 594(2) for details and +alternatives). The *note hashlib: 88. module is a potential replacement +for certain use cases. + +__________________________________________________________________ + +This module implements an interface to the ‘crypt(3)’ routine, which is +a one-way hash function based upon a modified DES algorithm; see the +Unix man page for further details. Possible uses include storing hashed +passwords so you can check passwords without storing the actual +password, or attempting to crack Unix passwords with a dictionary. + +Notice that the behavior of this module depends on the actual +implementation of the ‘crypt(3)’ routine in the running system. +Therefore, any extensions available on the current implementation will +also be available on this module. + +*note Availability: 1794.: Unix, not VxWorks. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +* Menu: + +* Hashing Methods:: +* Module Attributes:: +* Module Functions: Module Functions<2>. +* Examples: Examples<36>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/crypt.py + + (2) https://peps.python.org/pep-0594/#crypt + + +File: python.info, Node: Hashing Methods, Next: Module Attributes, Up: crypt — Function to check Unix passwords + +5.35.8.1 Hashing Methods +........................ + +New in version 3.3. + +The *note crypt: 27. module defines the list of hashing methods (not all +methods are available on all platforms): + + -- Data: crypt.METHOD_SHA512 + + A Modular Crypt Format method with 16 character salt and 86 + character hash based on the SHA-512 hash function. This is the + strongest method. + + -- Data: crypt.METHOD_SHA256 + + Another Modular Crypt Format method with 16 character salt and 43 + character hash based on the SHA-256 hash function. + + -- Data: crypt.METHOD_BLOWFISH + + Another Modular Crypt Format method with 22 character salt and 31 + character hash based on the Blowfish cipher. + + New in version 3.7. + + -- Data: crypt.METHOD_MD5 + + Another Modular Crypt Format method with 8 character salt and 22 + character hash based on the MD5 hash function. + + -- Data: crypt.METHOD_CRYPT + + The traditional method with a 2 character salt and 13 characters of + hash. This is the weakest method. + + +File: python.info, Node: Module Attributes, Next: Module Functions<2>, Prev: Hashing Methods, Up: crypt — Function to check Unix passwords + +5.35.8.2 Module Attributes +.......................... + +New in version 3.3. + + -- Attribute: crypt.methods + + A list of available password hashing algorithms, as + ‘crypt.METHOD_*’ objects. This list is sorted from strongest to + weakest. + + +File: python.info, Node: Module Functions<2>, Next: Examples<36>, Prev: Module Attributes, Up: crypt — Function to check Unix passwords + +5.35.8.3 Module Functions +......................... + +The *note crypt: 27. module defines the following functions: + + -- Function: crypt.crypt (word, salt=None) + + `word' will usually be a user’s password as typed at a prompt or in + a graphical interface. The optional `salt' is either a string as + returned from *note mksalt(): 784, one of the ‘crypt.METHOD_*’ + values (though not all may be available on all platforms), or a + full encrypted password including salt, as returned by this + function. If `salt' is not provided, the strongest method + available in *note methods: 4061. will be used. + + Checking a password is usually done by passing the plain-text + password as `word' and the full results of a previous *note + crypt(): 27. call, which should be the same as the results of this + call. + + `salt' (either a random 2 or 16 character string, possibly prefixed + with ‘$digit$’ to indicate the method) which will be used to + perturb the encryption algorithm. The characters in `salt' must be + in the set ‘[./a-zA-Z0-9]’, with the exception of Modular Crypt + Format which prefixes a ‘$digit$’. + + Returns the hashed password as a string, which will be composed of + characters from the same alphabet as the salt. + + Since a few ‘crypt(3)’ extensions allow different values, with + different sizes in the `salt', it is recommended to use the full + crypted password as salt when checking for a password. + + Changed in version 3.3: Accept ‘crypt.METHOD_*’ values in addition + to strings for `salt'. + + -- Function: crypt.mksalt (method=None, *, rounds=None) + + Return a randomly generated salt of the specified method. If no + `method' is given, the strongest method available in *note methods: + 4061. is used. + + The return value is a string suitable for passing as the `salt' + argument to *note crypt(): 27. + + `rounds' specifies the number of rounds for ‘METHOD_SHA256’, + ‘METHOD_SHA512’ and ‘METHOD_BLOWFISH’. For ‘METHOD_SHA256’ and + ‘METHOD_SHA512’ it must be an integer between ‘1000’ and + ‘999_999_999’, the default is ‘5000’. For ‘METHOD_BLOWFISH’ it + must be a power of two between ‘16’ (2^4) and ‘2_147_483_648’ + (2^31), the default is ‘4096’ (2^12). + + New in version 3.3. + + Changed in version 3.7: Added the `rounds' parameter. + + +File: python.info, Node: Examples<36>, Prev: Module Functions<2>, Up: crypt — Function to check Unix passwords + +5.35.8.4 Examples +................. + +A simple example illustrating typical use (a constant-time comparison +operation is needed to limit exposure to timing attacks. *note +hmac.compare_digest(): d74. is suitable for this purpose): + + import pwd + import crypt + import getpass + from hmac import compare_digest as compare_hash + + def login(): + username = input('Python login: ') + cryptedpasswd = pwd.getpwnam(username)[1] + if cryptedpasswd: + if cryptedpasswd == 'x' or cryptedpasswd == '*': + raise ValueError('no support for shadow passwords') + cleartext = getpass.getpass() + return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd) + else: + return True + +To generate a hash of a password using the strongest available method +and check it against the original: + + import crypt + from hmac import compare_digest as compare_hash + + hashed = crypt.crypt(plaintext) + if not compare_hash(hashed, crypt.crypt(plaintext, hashed)): + raise ValueError("hashed version doesn't validate against original") + + +File: python.info, Node: imghdr — Determine the type of an image, Next: imp — Access the import internals, Prev: crypt — Function to check Unix passwords, Up: Superseded Modules + +5.35.9 ‘imghdr’ — Determine the type of an image +------------------------------------------------ + +`Source code:' Lib/imghdr.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note imghdr: 95. module is deprecated (see PEP 594(2) for details and +alternatives). + +__________________________________________________________________ + +The *note imghdr: 95. module determines the type of image contained in a +file or byte stream. + +The *note imghdr: 95. module defines the following function: + + -- Function: imghdr.what (file, h=None) + + Tests the image data contained in the file named by `file', and + returns a string describing the image type. If optional `h' is + provided, the `file' argument is ignored and `h' is assumed to + contain the byte stream to test. + + Changed in version 3.6: Accepts a *note path-like object: 773. + +The following image types are recognized, as listed below with the +return value from *note what(): a91.: + +Value Image format + +--------------------------------------------------------- + +‘'rgb'’ SGI ImgLib Files + + +‘'gif'’ GIF 87a and 89a Files + + +‘'pbm'’ Portable Bitmap Files + + +‘'pgm'’ Portable Graymap Files + + +‘'ppm'’ Portable Pixmap Files + + +‘'tiff'’ TIFF Files + + +‘'rast'’ Sun Raster Files + + +‘'xbm'’ X Bitmap Files + + +‘'jpeg'’ JPEG data in JFIF or Exif formats + + +‘'bmp'’ BMP files + + +‘'png'’ Portable Network Graphics + + +‘'webp'’ WebP files + + +‘'exr'’ OpenEXR Files + + +New in version 3.5: The `exr' and `webp' formats were added. + +You can extend the list of file types *note imghdr: 95. can recognize by +appending to this variable: + + -- Data: imghdr.tests + + A list of functions performing the individual tests. Each function + takes two arguments: the byte-stream and an open file-like object. + When *note what(): a91. is called with a byte-stream, the file-like + object will be ‘None’. + + The test function should return a string describing the image type + if the test succeeded, or ‘None’ if it failed. + +Example: + + >>> import imghdr + >>> imghdr.what('bass.gif') + 'gif' + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/imghdr.py + + (2) https://peps.python.org/pep-0594/#imghdr + + +File: python.info, Node: imp — Access the import internals, Next: mailcap — Mailcap file handling, Prev: imghdr — Determine the type of an image, Up: Superseded Modules + +5.35.10 ‘imp’ — Access the import internals +------------------------------------------- + +`Source code:' Lib/imp.py(1) + +Deprecated since version 3.4, will be removed in version 3.12: The *note +imp: 96. module is deprecated in favor of *note importlib: 97. + +__________________________________________________________________ + +This module provides an interface to the mechanisms used to implement +the *note import: 1af. statement. It defines the following constants +and functions: + + -- Function: imp.get_magic () + + Return the magic string value used to recognize byte-compiled code + files (‘.pyc’ files). (This value may be different for each Python + version.) + + Deprecated since version 3.4: Use *note + importlib.util.MAGIC_NUMBER: bf0. instead. + + -- Function: imp.get_suffixes () + + Return a list of 3-element tuples, each describing a particular + type of module. Each triple has the form ‘(suffix, mode, type)’, + where `suffix' is a string to be appended to the module name to + form the filename to search for, `mode' is the mode string to pass + to the built-in *note open(): 30b. function to open the file (this + can be ‘'r'’ for text files or ‘'rb'’ for binary files), and `type' + is the file type, which has one of the values *note PY_SOURCE: + 406b, *note PY_COMPILED: 406c, or *note C_EXTENSION: 406d, + described below. + + Deprecated since version 3.3: Use the constants defined on *note + importlib.machinery: 99. instead. + + -- Function: imp.find_module (name[, path]) + + Try to find the module `name'. If `path' is omitted or ‘None’, the + list of directory names given by ‘sys.path’ is searched, but first + a few special places are searched: the function tries to find a + built-in module with the given name (*note C_BUILTIN: 406f.), then + a frozen module (*note PY_FROZEN: 4070.), and on some systems some + other places are looked in as well (on Windows, it looks in the + registry which may point to a specific file). + + Otherwise, `path' must be a list of directory names; each directory + is searched for files with any of the suffixes returned by *note + get_suffixes(): 406a. above. Invalid names in the list are + silently ignored (but all list items must be strings). + + If search is successful, the return value is a 3-element tuple + ‘(file, pathname, description)’: + + `file' is an open *note file object: e76. positioned at the + beginning, `pathname' is the pathname of the file found, and + `description' is a 3-element tuple as contained in the list + returned by *note get_suffixes(): 406a. describing the kind of + module found. + + If the module is built-in or frozen then `file' and `pathname' are + both ‘None’ and the `description' tuple contains empty strings for + its suffix and mode; the module type is indicated as given in + parentheses above. If the search is unsuccessful, *note + ImportError: 511. is raised. Other exceptions indicate problems + with the arguments or environment. + + If the module is a package, `file' is ‘None’, `pathname' is the + package path and the last item in the `description' tuple is *note + PKG_DIRECTORY: 4071. + + This function does not handle hierarchical module names (names + containing dots). In order to find `P.M', that is, submodule `M' + of package `P', use *note find_module(): 406e. and *note + load_module(): 4072. to find and load package `P', and then use + *note find_module(): 406e. with the `path' argument set to + ‘P.__path__’. When `P' itself has a dotted name, apply this recipe + recursively. + + Deprecated since version 3.3: Use *note importlib.util.find_spec(): + cb4. instead unless Python 3.3 compatibility is required, in which + case use *note importlib.find_loader(): 2ea. For example usage of + the former case, see the *note Examples: 3d2d. section of the *note + importlib: 97. documentation. + + -- Function: imp.load_module (name, file, pathname, description) + + Load a module that was previously found by *note find_module(): + 406e. (or by an otherwise conducted search yielding compatible + results). This function does more than importing the module: if + the module was already imported, it will reload the module! The + `name' argument indicates the full module name (including the + package name, if this is a submodule of a package). The `file' + argument is an open file, and `pathname' is the corresponding file + name; these can be ‘None’ and ‘''’, respectively, when the module + is a package or not being loaded from a file. The `description' + argument is a tuple, as would be returned by *note get_suffixes(): + 406a, describing what kind of module must be loaded. + + If the load is successful, the return value is the module object; + otherwise, an exception (usually *note ImportError: 511.) is + raised. + + `Important:' the caller is responsible for closing the `file' + argument, if it was not ‘None’, even when an exception is raised. + This is best done using a *note try: 1073. … *note finally: 60a. + statement. + + Deprecated since version 3.3: If previously used in conjunction + with *note imp.find_module(): 406e. then consider using *note + importlib.import_module(): e4d, otherwise use the loader returned + by the replacement you chose for *note imp.find_module(): 406e. If + you called *note imp.load_module(): 4072. and related functions + directly with file path arguments then use a combination of *note + importlib.util.spec_from_file_location(): 920. and *note + importlib.util.module_from_spec(): a94. See the *note Examples: + 3d2d. section of the *note importlib: 97. documentation for details + of the various approaches. + + -- Function: imp.new_module (name) + + Return a new empty module object called `name'. This object is + `not' inserted in ‘sys.modules’. + + Deprecated since version 3.4: Use *note + importlib.util.module_from_spec(): a94. instead. + + -- Function: imp.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 (the + same as the `module' argument). + + When ‘reload(module)’ is executed: + + * Python modules’ code is recompiled and the module-level code + reexecuted, defining a new set of objects which are bound to + names in the module’s dictionary. The ‘init’ function of + extension modules is not called a second time. + + * As with all other objects in Python the old objects are only + reclaimed after their reference counts drop to zero. + + * The names in the module namespace are updated to point to any + new or changed objects. + + * 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. + + 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 *note try: 1073. + statement it can test for the table’s presence and skip its + initialization if desired: + + try: + cache + except NameError: + cache = {} + + It is legal though generally not very useful to reload built-in or + dynamically loaded modules, except for *note sys: f9, *note + __main__: 1. and *note builtins: 11. In many cases, however, + 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 *note from: + f5a. … *note import: 1af. …, calling *note reload(): f81. for the + other module does not redefine the objects imported from it — one + way around this is to re-execute the ‘from’ statement, another is + to use ‘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. + + Changed in version 3.3: Relies on both ‘__name__’ and ‘__loader__’ + being defined on the module being reloaded instead of just + ‘__name__’. + + Deprecated since version 3.4: Use *note importlib.reload(): 79d. + instead. + +The following functions are conveniences for handling PEP 3147(2) +byte-compiled file paths. + +New in version 3.2. + + -- Function: imp.cache_from_source (path, debug_override=None) + + Return the PEP 3147(3) path to the byte-compiled file associated + with the source `path'. For example, if `path' is + ‘/foo/bar/baz.py’ the return value would be + ‘/foo/bar/__pycache__/baz.cpython-32.pyc’ for Python 3.2. The + ‘cpython-32’ string comes from the current magic tag (see *note + get_tag(): 4075.; if ‘sys.implementation.cache_tag’ is not defined + then *note NotImplementedError: 9c7. will be raised). By passing + in ‘True’ or ‘False’ for `debug_override' you can override the + system’s value for ‘__debug__’, leading to optimized bytecode. + + `path' need not exist. + + Changed in version 3.3: If ‘sys.implementation.cache_tag’ is + ‘None’, then *note NotImplementedError: 9c7. is raised. + + Deprecated since version 3.4: Use *note + importlib.util.cache_from_source(): 91e. instead. + + Changed in version 3.5: The `debug_override' parameter no longer + creates a ‘.pyo’ file. + + -- Function: imp.source_from_cache (path) + + Given the `path' to a PEP 3147(4) file name, return the associated + source code file path. For example, if `path' is + ‘/foo/bar/__pycache__/baz.cpython-32.pyc’ the returned path would + be ‘/foo/bar/baz.py’. `path' need not exist, however if it does + not conform to PEP 3147(5) format, a *note ValueError: 1c8. is + raised. If ‘sys.implementation.cache_tag’ is not defined, *note + NotImplementedError: 9c7. is raised. + + Changed in version 3.3: Raise *note NotImplementedError: 9c7. when + ‘sys.implementation.cache_tag’ is not defined. + + Deprecated since version 3.4: Use *note + importlib.util.source_from_cache(): 91f. instead. + + -- Function: imp.get_tag () + + Return the PEP 3147(6) magic tag string matching this version of + Python’s magic number, as returned by *note get_magic(): bf1. + + Deprecated since version 3.4: Use ‘sys.implementation.cache_tag’ + directly starting in Python 3.3. + +The following functions help interact with the import system’s internal +locking mechanism. Locking semantics of imports are an implementation +detail which may vary from release to release. However, Python ensures +that circular imports work without any deadlocks. + + -- Function: imp.lock_held () + + Return ‘True’ if the global import lock is currently held, else + ‘False’. On platforms without threads, always return ‘False’. + + On platforms with threads, a thread executing an import first holds + a global import lock, then sets up a per-module lock for the rest + of the import. This blocks other threads from importing the same + module until the original import completes, preventing other + threads from seeing incomplete module objects constructed by the + original thread. An exception is made for circular imports, which + by construction have to expose an incomplete module object at some + point. + + Changed in version 3.3: The locking scheme has changed to + per-module locks for the most part. A global import lock is kept + for some critical tasks, such as initializing the per-module locks. + + Deprecated since version 3.4. + + -- Function: imp.acquire_lock () + + Acquire the interpreter’s global import lock for the current + thread. This lock should be used by import hooks to ensure + thread-safety when importing modules. + + Once a thread has acquired the import lock, the same thread may + acquire it again without blocking; the thread must release it once + for each time it has acquired it. + + On platforms without threads, this function does nothing. + + Changed in version 3.3: The locking scheme has changed to + per-module locks for the most part. A global import lock is kept + for some critical tasks, such as initializing the per-module locks. + + Deprecated since version 3.4. + + -- Function: imp.release_lock () + + Release the interpreter’s global import lock. On platforms without + threads, this function does nothing. + + Changed in version 3.3: The locking scheme has changed to + per-module locks for the most part. A global import lock is kept + for some critical tasks, such as initializing the per-module locks. + + Deprecated since version 3.4. + +The following constants with integer values, defined in this module, are +used to indicate the search result of *note find_module(): 406e. + + -- Data: imp.PY_SOURCE + + The module was found as a source file. + + Deprecated since version 3.3. + + -- Data: imp.PY_COMPILED + + The module was found as a compiled code object file. + + Deprecated since version 3.3. + + -- Data: imp.C_EXTENSION + + The module was found as dynamically loadable shared library. + + Deprecated since version 3.3. + + -- Data: imp.PKG_DIRECTORY + + The module was found as a package directory. + + Deprecated since version 3.3. + + -- Data: imp.C_BUILTIN + + The module was found as a built-in module. + + Deprecated since version 3.3. + + -- Data: imp.PY_FROZEN + + The module was found as a frozen module. + + Deprecated since version 3.3. + + -- Class: imp.NullImporter (path_string) + + The *note NullImporter: d26. type is a PEP 302(7) import hook that + handles non-directory path strings by failing to find any modules. + Calling this type with an existing directory or empty string raises + *note ImportError: 511. Otherwise, a *note NullImporter: d26. + instance is returned. + + Instances have only one method: + + -- Method: find_module (fullname[, path]) + + This method always returns ‘None’, indicating that the + requested module could not be found. + + Changed in version 3.3: ‘None’ is inserted into + ‘sys.path_importer_cache’ instead of an instance of *note + NullImporter: d26. + + Deprecated since version 3.4: Insert ‘None’ into + ‘sys.path_importer_cache’ instead. + +* Menu: + +* Examples: Examples<37>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/imp.py + + (2) https://peps.python.org/pep-3147/ + + (3) https://peps.python.org/pep-3147/ + + (4) https://peps.python.org/pep-3147/ + + (5) https://peps.python.org/pep-3147/ + + (6) https://peps.python.org/pep-3147/ + + (7) https://peps.python.org/pep-0302/ + + +File: python.info, Node: Examples<37>, Up: imp — Access the import internals + +5.35.10.1 Examples +.................. + +The following function emulates what was the standard import statement +up to Python 1.4 (no hierarchical module names). (This `implementation' +wouldn’t work in that version, since *note find_module(): 406e. has been +extended and *note load_module(): 4072. has been added in 1.4.) + + import imp + import sys + + def __import__(name, globals=None, locals=None, fromlist=None): + # Fast path: see if the module has already been imported. + try: + return sys.modules[name] + except KeyError: + pass + + # If any of the following calls raises an exception, + # there's a problem we can't handle -- let the caller handle it. + + fp, pathname, description = imp.find_module(name) + + try: + return imp.load_module(name, fp, pathname, description) + finally: + # Since we may exit via an exception, close fp explicitly. + if fp: + fp.close() + + +File: python.info, Node: mailcap — Mailcap file handling, Next: msilib — Read and write Microsoft Installer files, Prev: imp — Access the import internals, Up: Superseded Modules + +5.35.11 ‘mailcap’ — Mailcap file handling +----------------------------------------- + +`Source code:' Lib/mailcap.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note mailcap: ad. module is deprecated (see PEP 594(2) for details). +The *note mimetypes: b0. module provides an alternative. + +__________________________________________________________________ + +Mailcap files are used to configure how MIME-aware applications such as +mail readers and web browsers react to files with different MIME types. +(The name “mailcap” is derived from the phrase “mail capability”.) For +example, a mailcap file might contain a line like ‘video/mpeg; xmpeg +%s’. Then, if the user encounters an email message or web document with +the MIME type ‘video/mpeg’, ‘%s’ will be replaced by a filename (usually +one belonging to a temporary file) and the ‘xmpeg’ program can be +automatically started to view the file. + +The mailcap format is documented in RFC 1524(3), “A User Agent +Configuration Mechanism For Multimedia Mail Format Information”, but is +not an internet standard. However, mailcap files are supported on most +Unix systems. + + -- Function: mailcap.findmatch (caps, MIMEtype, key='view', + filename='/dev/null', plist=[]) + + Return a 2-tuple; the first element is a string containing the + command line to be executed (which can be passed to *note + os.system(): 10c0.), and the second element is the mailcap entry + for a given MIME type. If no matching MIME type can be found, + ‘(None, None)’ is returned. + + `key' is the name of the field desired, which represents the type + of activity to be performed; the default value is ‘view’, since in + the most common case you simply want to view the body of the + MIME-typed data. Other possible values might be ‘compose’ and + ‘edit’, if you wanted to create a new body of the given MIME type + or alter the existing body data. See RFC 1524(4) for a complete + list of these fields. + + `filename' is the filename to be substituted for ‘%s’ in the + command line; the default value is ‘'/dev/null'’ which is almost + certainly not what you want, so usually you’ll override it by + specifying a filename. + + `plist' can be a list containing named parameters; the default + value is simply an empty list. Each entry in the list must be a + string containing the parameter name, an equals sign (‘'='’), and + the parameter’s value. Mailcap entries can contain named + parameters like ‘%{foo}’, which will be replaced by the value of + the parameter named ‘foo’. For example, if the command line + ‘showpartial %{id} %{number} %{total}’ was in a mailcap file, and + `plist' was set to ‘['id=1', 'number=2', 'total=3']’, the resulting + command line would be ‘'showpartial 1 2 3'’. + + In a mailcap file, the “test” field can optionally be specified to + test some external condition (such as the machine architecture, or + the window system in use) to determine whether or not the mailcap + line applies. *note findmatch(): 407f. will automatically check + such conditions and skip the entry if the check fails. + + Changed in version 3.11: To prevent security issues with shell + metacharacters (symbols that have special effects in a shell + command line), ‘findmatch’ will refuse to inject ASCII characters + other than alphanumerics and ‘@+=:,./-_’ into the returned command + line. + + If a disallowed character appears in `filename', ‘findmatch’ will + always return ‘(None, None)’ as if no entry was found. If such a + character appears elsewhere (a value in `plist' or in `MIMEtype'), + ‘findmatch’ will ignore all mailcap entries which use that value. + A *note warning: 130. will be raised in either case. + + -- Function: mailcap.getcaps () + + Returns a dictionary mapping MIME types to a list of mailcap file + entries. This dictionary must be passed to the *note findmatch(): + 407f. function. An entry is stored as a list of dictionaries, but + it shouldn’t be necessary to know the details of this + representation. + + The information is derived from all of the mailcap files found on + the system. Settings in the user’s mailcap file ‘$HOME/.mailcap’ + will override settings in the system mailcap files ‘/etc/mailcap’, + ‘/usr/etc/mailcap’, and ‘/usr/local/etc/mailcap’. + +An example usage: + + >>> import mailcap + >>> d = mailcap.getcaps() + >>> mailcap.findmatch(d, 'video/mpeg', filename='tmp1223') + ('xmpeg tmp1223', {'view': 'xmpeg %s'}) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/mailcap.py + + (2) https://peps.python.org/pep-0594/#mailcap + + (3) https://datatracker.ietf.org/doc/html/rfc1524.html + + (4) https://datatracker.ietf.org/doc/html/rfc1524.html + + +File: python.info, Node: msilib — Read and write Microsoft Installer files, Next: nis — Interface to Sun’s NIS Yellow Pages, Prev: mailcap — Mailcap file handling, Up: Superseded Modules + +5.35.12 ‘msilib’ — Read and write Microsoft Installer files +----------------------------------------------------------- + +`Source code:' Lib/msilib/__init__.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note msilib: b3. module is deprecated (see PEP 594(2) for details). + +__________________________________________________________________ + +The *note msilib: b3. supports the creation of Microsoft Installer +(‘.msi’) files. Because these files often contain an embedded “cabinet” +file (‘.cab’), it also exposes an API to create CAB files. Support for +reading ‘.cab’ files is currently not implemented; read support for the +‘.msi’ database is possible. + +This package aims to provide complete access to all tables in an ‘.msi’ +file, therefore, it is a fairly low-level API. One primary application +of this package is the creation of Python installer package itself +(although that currently uses a different version of ‘msilib’). + +The package contents can be roughly split into four parts: low-level CAB +routines, low-level MSI routines, higher-level MSI routines, and +standard table structures. + + -- Function: msilib.FCICreate (cabname, files) + + Create a new CAB file named `cabname'. `files' must be a list of + tuples, each containing the name of the file on disk, and the name + of the file inside the CAB file. + + The files are added to the CAB file in the order they appear in the + list. All files are added into a single CAB file, using the MSZIP + compression algorithm. + + Callbacks to Python for the various steps of MSI creation are + currently not exposed. + + -- Function: msilib.UuidCreate () + + Return the string representation of a new unique identifier. This + wraps the Windows API functions ‘UuidCreate()’ and + ‘UuidToString()’. + + -- Function: msilib.OpenDatabase (path, persist) + + Return a new database object by calling MsiOpenDatabase. `path' is + the file name of the MSI file; `persist' can be one of the + constants ‘MSIDBOPEN_CREATEDIRECT’, ‘MSIDBOPEN_CREATE’, + ‘MSIDBOPEN_DIRECT’, ‘MSIDBOPEN_READONLY’, or ‘MSIDBOPEN_TRANSACT’, + and may include the flag ‘MSIDBOPEN_PATCHFILE’. See the Microsoft + documentation for the meaning of these flags; depending on the + flags, an existing database is opened, or a new one created. + + -- Function: msilib.CreateRecord (count) + + Return a new record object by calling ‘MSICreateRecord()’. `count' + is the number of fields of the record. + + -- Function: msilib.init_database (name, schema, ProductName, + ProductCode, ProductVersion, Manufacturer) + + Create and return a new database `name', initialize it with + `schema', and set the properties `ProductName', `ProductCode', + `ProductVersion', and `Manufacturer'. + + `schema' must be a module object containing ‘tables’ and + ‘_Validation_records’ attributes; typically, *note msilib.schema: + 4086. should be used. + + The database will contain just the schema and the validation + records when this function returns. + + -- Function: msilib.add_data (database, table, records) + + Add all `records' to the table named `table' in `database'. + + The `table' argument must be one of the predefined tables in the + MSI schema, e.g. ‘'Feature'’, ‘'File'’, ‘'Component'’, ‘'Dialog'’, + ‘'Control'’, etc. + + `records' should be a list of tuples, each one containing all + fields of a record according to the schema of the table. For + optional fields, ‘None’ can be passed. + + Field values can be ints, strings, or instances of the Binary + class. + + -- Class: msilib.Binary (filename) + + Represents entries in the Binary table; inserting such an object + using *note add_data(): 4087. reads the file named `filename' into + the table. + + -- Function: msilib.add_tables (database, module) + + Add all table content from `module' to `database'. `module' must + contain an attribute `tables' listing all tables for which content + should be added, and one attribute per table that has the actual + content. + + This is typically used to install the sequence tables. + + -- Function: msilib.add_stream (database, name, path) + + Add the file `path' into the ‘_Stream’ table of `database', with + the stream name `name'. + + -- Function: msilib.gen_uuid () + + Return a new UUID, in the format that MSI typically requires (i.e. + in curly braces, and with all hexdigits in uppercase). + +See also +........ + +FCICreate(3) UuidCreate(4) UuidToString(5) + +* Menu: + +* Database Objects:: +* View Objects:: +* Summary Information Objects:: +* Record Objects:: +* Errors:: +* CAB Objects:: +* Directory Objects:: +* Features: Features<3>. +* GUI classes:: +* Precomputed tables:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/msilib/__init__.py + + (2) https://peps.python.org/pep-0594/#msilib + + (3) https://msdn.microsoft.com/en-us/library/bb432265.aspx + + (4) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa379205.aspx + + (5) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa379352.aspx + + +File: python.info, Node: Database Objects, Next: View Objects, Up: msilib — Read and write Microsoft Installer files + +5.35.12.1 Database Objects +.......................... + + -- Method: Database.OpenView (sql) + + Return a view object, by calling ‘MSIDatabaseOpenView()’. `sql' is + the SQL statement to execute. + + -- Method: Database.Commit () + + Commit the changes pending in the current transaction, by calling + ‘MSIDatabaseCommit()’. + + -- Method: Database.GetSummaryInformation (count) + + Return a new summary information object, by calling + ‘MsiGetSummaryInformation()’. `count' is the maximum number of + updated values. + + -- Method: Database.Close () + + Close the database object, through ‘MsiCloseHandle()’. + + New in version 3.7. + +See also +........ + +MSIDatabaseOpenView(1) MSIDatabaseCommit(2) MSIGetSummaryInformation(3) +MsiCloseHandle(4) + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370082.aspx + + (2) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370075.aspx + + (3) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370301.aspx + + (4) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370067.aspx + + +File: python.info, Node: View Objects, Next: Summary Information Objects, Prev: Database Objects, Up: msilib — Read and write Microsoft Installer files + +5.35.12.2 View Objects +...................... + + -- Method: View.Execute (params) + + Execute the SQL query of the view, through ‘MSIViewExecute()’. If + `params' is not ‘None’, it is a record describing actual values of + the parameter tokens in the query. + + -- Method: View.GetColumnInfo (kind) + + Return a record describing the columns of the view, through calling + ‘MsiViewGetColumnInfo()’. `kind' can be either ‘MSICOLINFO_NAMES’ + or ‘MSICOLINFO_TYPES’. + + -- Method: View.Fetch () + + Return a result record of the query, through calling + ‘MsiViewFetch()’. + + -- Method: View.Modify (kind, data) + + Modify the view, by calling ‘MsiViewModify()’. `kind' can be one + of ‘MSIMODIFY_SEEK’, ‘MSIMODIFY_REFRESH’, ‘MSIMODIFY_INSERT’, + ‘MSIMODIFY_UPDATE’, ‘MSIMODIFY_ASSIGN’, ‘MSIMODIFY_REPLACE’, + ‘MSIMODIFY_MERGE’, ‘MSIMODIFY_DELETE’, + ‘MSIMODIFY_INSERT_TEMPORARY’, ‘MSIMODIFY_VALIDATE’, + ‘MSIMODIFY_VALIDATE_NEW’, ‘MSIMODIFY_VALIDATE_FIELD’, or + ‘MSIMODIFY_VALIDATE_DELETE’. + + `data' must be a record describing the new data. + + -- Method: View.Close () + + Close the view, through ‘MsiViewClose()’. + +See also +........ + +MsiViewExecute(1) MSIViewGetColumnInfo(2) MsiViewFetch(3) +MsiViewModify(4) MsiViewClose(5) + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370513.aspx + + (2) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370516.aspx + + (3) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370514.aspx + + (4) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370519.aspx + + (5) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370510.aspx + + +File: python.info, Node: Summary Information Objects, Next: Record Objects, Prev: View Objects, Up: msilib — Read and write Microsoft Installer files + +5.35.12.3 Summary Information Objects +..................................... + + -- Method: SummaryInformation.GetProperty (field) + + Return a property of the summary, through + ‘MsiSummaryInfoGetProperty()’. `field' is the name of the + property, and can be one of the constants ‘PID_CODEPAGE’, + ‘PID_TITLE’, ‘PID_SUBJECT’, ‘PID_AUTHOR’, ‘PID_KEYWORDS’, + ‘PID_COMMENTS’, ‘PID_TEMPLATE’, ‘PID_LASTAUTHOR’, ‘PID_REVNUMBER’, + ‘PID_LASTPRINTED’, ‘PID_CREATE_DTM’, ‘PID_LASTSAVE_DTM’, + ‘PID_PAGECOUNT’, ‘PID_WORDCOUNT’, ‘PID_CHARCOUNT’, ‘PID_APPNAME’, + or ‘PID_SECURITY’. + + -- Method: SummaryInformation.GetPropertyCount () + + Return the number of summary properties, through + ‘MsiSummaryInfoGetPropertyCount()’. + + -- Method: SummaryInformation.SetProperty (field, value) + + Set a property through ‘MsiSummaryInfoSetProperty()’. `field' can + have the same values as in *note GetProperty(): 1418, `value' is + the new value of the property. Possible value types are integer + and string. + + -- Method: SummaryInformation.Persist () + + Write the modified properties to the summary information stream, + using ‘MsiSummaryInfoPersist()’. + +See also +........ + +MsiSummaryInfoGetProperty(1) MsiSummaryInfoGetPropertyCount(2) +MsiSummaryInfoSetProperty(3) MsiSummaryInfoPersist(4) + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370409.aspx + + (2) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370488.aspx + + (3) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370491.aspx + + (4) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370490.aspx + + +File: python.info, Node: Record Objects, Next: Errors, Prev: Summary Information Objects, Up: msilib — Read and write Microsoft Installer files + +5.35.12.4 Record Objects +........................ + + -- Method: Record.GetFieldCount () + + Return the number of fields of the record, through + ‘MsiRecordGetFieldCount()’. + + -- Method: Record.GetInteger (field) + + Return the value of `field' as an integer where possible. `field' + must be an integer. + + -- Method: Record.GetString (field) + + Return the value of `field' as a string where possible. `field' + must be an integer. + + -- Method: Record.SetString (field, value) + + Set `field' to `value' through ‘MsiRecordSetString()’. `field' + must be an integer; `value' a string. + + -- Method: Record.SetStream (field, value) + + Set `field' to the contents of the file named `value', through + ‘MsiRecordSetStream()’. `field' must be an integer; `value' a + string. + + -- Method: Record.SetInteger (field, value) + + Set `field' to `value' through ‘MsiRecordSetInteger()’. Both + `field' and `value' must be an integer. + + -- Method: Record.ClearData () + + Set all fields of the record to 0, through ‘MsiRecordClearData()’. + +See also +........ + +MsiRecordGetFieldCount(1) MsiRecordSetString(2) MsiRecordSetStream(3) +MsiRecordSetInteger(4) MsiRecordClearData(5) + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370366.aspx + + (2) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370373.aspx + + (3) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370372.aspx + + (4) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370371.aspx + + (5) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370364.aspx + + +File: python.info, Node: Errors, Next: CAB Objects, Prev: Record Objects, Up: msilib — Read and write Microsoft Installer files + +5.35.12.5 Errors +................ + +All wrappers around MSI functions raise ‘MSIError’; the string inside +the exception will contain more detail. + + +File: python.info, Node: CAB Objects, Next: Directory Objects, Prev: Errors, Up: msilib — Read and write Microsoft Installer files + +5.35.12.6 CAB Objects +..................... + + -- Class: msilib.CAB (name) + + The class *note CAB: 40a9. represents a CAB file. During MSI + construction, files will be added simultaneously to the ‘Files’ + table, and to a CAB file. Then, when all files have been added, + the CAB file can be written, then added to the MSI file. + + `name' is the name of the CAB file in the MSI file. + + -- Method: append (full, file, logical) + + Add the file with the pathname `full' to the CAB file, under + the name `logical'. If there is already a file named + `logical', a new file name is created. + + Return the index of the file in the CAB file, and the new name + of the file inside the CAB file. + + -- Method: commit (database) + + Generate a CAB file, add it as a stream to the MSI file, put + it into the ‘Media’ table, and remove the generated file from + the disk. + + +File: python.info, Node: Directory Objects, Next: Features<3>, Prev: CAB Objects, Up: msilib — Read and write Microsoft Installer files + +5.35.12.7 Directory Objects +........................... + + -- Class: msilib.Directory (database, cab, basedir, physical, logical, + default[, componentflags]) + + Create a new directory in the Directory table. There is a current + component at each point in time for the directory, which is either + explicitly created through *note start_component(): 1419, or + implicitly when files are added for the first time. Files are + added into the current component, and into the cab file. To create + a directory, a base directory object needs to be specified (can be + ‘None’), the path to the physical directory, and a logical + directory name. `default' specifies the DefaultDir slot in the + directory table. `componentflags' specifies the default flags that + new components get. + + -- Method: start_component (component=None, feature=None, + flags=None, keyfile=None, uuid=None) + + Add an entry to the Component table, and make this component + the current component for this directory. If no component + name is given, the directory name is used. If no `feature' is + given, the current feature is used. If no `flags' are given, + the directory’s default flags are used. If no `keyfile' is + given, the KeyPath is left null in the Component table. + + -- Method: add_file (file, src=None, version=None, language=None) + + Add a file to the current component of the directory, starting + a new one if there is no current component. By default, the + file name in the source and the file table will be identical. + If the `src' file is specified, it is interpreted relative to + the current directory. Optionally, a `version' and a + `language' can be specified for the entry in the File table. + + -- Method: glob (pattern, exclude=None) + + Add a list of files to the current component as specified in + the glob pattern. Individual files can be excluded in the + `exclude' list. + + -- Method: remove_pyc () + + Remove ‘.pyc’ files on uninstall. + +See also +........ + +Directory Table(1) File Table(2) Component Table(3) FeatureComponents +Table(4) + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368295.aspx + + (2) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368596.aspx + + (3) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368007.aspx + + (4) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368579.aspx + + +File: python.info, Node: Features<3>, Next: GUI classes, Prev: Directory Objects, Up: msilib — Read and write Microsoft Installer files + +5.35.12.8 Features +.................. + + -- Class: msilib.Feature (db, id, title, desc, display, level=1, + parent=None, directory=None, attributes=0) + + Add a new record to the ‘Feature’ table, using the values `id', + `parent.id', `title', `desc', `display', `level', `directory', and + `attributes'. The resulting feature object can be passed to the + ‘start_component()’ method of *note Directory: 40ae. + + -- Method: set_current () + + Make this feature the current feature of *note msilib: b3. + New components are automatically added to the default feature, + unless a feature is explicitly specified. + +See also +........ + +Feature Table(1) + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368585.aspx + + +File: python.info, Node: GUI classes, Next: Precomputed tables, Prev: Features<3>, Up: msilib — Read and write Microsoft Installer files + +5.35.12.9 GUI classes +..................... + +*note msilib: b3. provides several classes that wrap the GUI tables in +an MSI database. However, no standard user interface is provided. + + -- Class: msilib.Control (dlg, name) + + Base class of the dialog controls. `dlg' is the dialog object the + control belongs to, and `name' is the control’s name. + + -- Method: event (event, argument, condition=1, ordering=None) + + Make an entry into the ‘ControlEvent’ table for this control. + + -- Method: mapping (event, attribute) + + Make an entry into the ‘EventMapping’ table for this control. + + -- Method: condition (action, condition) + + Make an entry into the ‘ControlCondition’ table for this + control. + + -- Class: msilib.RadioButtonGroup (dlg, name, property) + + Create a radio button control named `name'. `property' is the + installer property that gets set when a radio button is selected. + + -- Method: add (name, x, y, width, height, text, value=None) + + Add a radio button named `name' to the group, at the + coordinates `x', `y', `width', `height', and with the label + `text'. If `value' is ‘None’, it defaults to `name'. + + -- Class: msilib.Dialog (db, name, x, y, w, h, attr, title, first, + default, cancel) + + Return a new *note Dialog: 40be. object. An entry in the ‘Dialog’ + table is made, with the specified coordinates, dialog attributes, + title, name of the first, default, and cancel controls. + + -- Method: control (name, type, x, y, width, height, attributes, + property, text, control_next, help) + + Return a new *note Control: 40b8. object. An entry in the + ‘Control’ table is made with the specified parameters. + + This is a generic method; for specific types, specialized + methods are provided. + + -- Method: text (name, x, y, width, height, attributes, text) + + Add and return a ‘Text’ control. + + -- Method: bitmap (name, x, y, width, height, text) + + Add and return a ‘Bitmap’ control. + + -- Method: line (name, x, y, width, height) + + Add and return a ‘Line’ control. + + -- Method: pushbutton (name, x, y, width, height, attributes, + text, next_control) + + Add and return a ‘PushButton’ control. + + -- Method: radiogroup (name, x, y, width, height, attributes, + property, text, next_control) + + Add and return a ‘RadioButtonGroup’ control. + + -- Method: checkbox (name, x, y, width, height, attributes, + property, text, next_control) + + Add and return a ‘CheckBox’ control. + +See also +........ + +Dialog Table(1) Control Table(2) Control Types(3) ControlCondition +Table(4) ControlEvent Table(5) EventMapping Table(6) RadioButton +Table(7) + + ---------- Footnotes ---------- + + (1) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368286.aspx + + (2) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368044.aspx + + (3) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368039.aspx + + (4) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368035.aspx + + (5) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368037.aspx + + (6) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa368559.aspx + + (7) +https://msdn.microsoft.com/en-us/library/windows/desktop/aa370962.aspx + + +File: python.info, Node: Precomputed tables, Prev: GUI classes, Up: msilib — Read and write Microsoft Installer files + +5.35.12.10 Precomputed tables +............................. + +*note msilib: b3. provides a few subpackages that contain only schema +and table definitions. Currently, these definitions are based on MSI +version 2.0. + + -- Data: msilib.schema + + This is the standard MSI schema for MSI 2.0, with the `tables' + variable providing a list of table definitions, and + `_Validation_records' providing the data for MSI validation. + + -- Data: msilib.sequence + + This module contains table contents for the standard sequence + tables: `AdminExecuteSequence', `AdminUISequence', + `AdvtExecuteSequence', `InstallExecuteSequence', and + `InstallUISequence'. + + -- Data: msilib.text + + This module contains definitions for the UIText and ActionText + tables, for the standard installer actions. + + +File: python.info, Node: nis — Interface to Sun’s NIS Yellow Pages, Next: nntplib — NNTP protocol client, Prev: msilib — Read and write Microsoft Installer files, Up: Superseded Modules + +5.35.13 ‘nis’ — Interface to Sun’s NIS (Yellow Pages) +----------------------------------------------------- + +Deprecated since version 3.11, will be removed in version 3.13: The +*note nis: bd. module is deprecated (see PEP 594(1) for details). + +__________________________________________________________________ + +The *note nis: bd. module gives a thin wrapper around the NIS library, +useful for central administration of several hosts. + +Because NIS exists only on Unix systems, this module is only available +for Unix. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +The *note nis: bd. module defines the following functions: + + -- Function: nis.match (key, mapname, domain=default_domain) + + Return the match for `key' in map `mapname', or raise an error + (*note nis.error: 40cc.) if there is none. Both should be strings, + `key' is 8-bit clean. Return value is an arbitrary array of bytes + (may contain ‘NULL’ and other joys). + + Note that `mapname' is first checked if it is an alias to another + name. + + The `domain' argument allows overriding the NIS domain used for the + lookup. If unspecified, lookup is in the default NIS domain. + + -- Function: nis.cat (mapname, domain=default_domain) + + Return a dictionary mapping `key' to `value' such that ‘match(key, + mapname)==value’. Note that both keys and values of the dictionary + are arbitrary arrays of bytes. + + Note that `mapname' is first checked if it is an alias to another + name. + + The `domain' argument allows overriding the NIS domain used for the + lookup. If unspecified, lookup is in the default NIS domain. + + -- Function: nis.maps (domain=default_domain) + + Return a list of all valid maps. + + The `domain' argument allows overriding the NIS domain used for the + lookup. If unspecified, lookup is in the default NIS domain. + + -- Function: nis.get_default_domain () + + Return the system default NIS domain. + +The *note nis: bd. module defines the following exception: + + -- Exception: nis.error + + An error raised when a NIS function returns an error code. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0594/#nis + + +File: python.info, Node: nntplib — NNTP protocol client, Next: optparse — Parser for command line options, Prev: nis — Interface to Sun’s NIS Yellow Pages, Up: Superseded Modules + +5.35.14 ‘nntplib’ — NNTP protocol client +---------------------------------------- + +`Source code:' Lib/nntplib.py(1) + +Deprecated since version 3.11: The *note nntplib: be. module is +deprecated (see PEP 594(2) for details). + +__________________________________________________________________ + +This module defines the class *note NNTP: 55d. which implements the +client side of the Network News Transfer Protocol. It can be used to +implement a news reader or poster, or automated news processors. It is +compatible with RFC 3977(3) as well as the older RFC 977(4) and RFC +2980(5). + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +Here are two small examples of how it can be used. To list some +statistics about a newsgroup and print the subjects of the last 10 +articles: + + >>> s = nntplib.NNTP('news.gmane.io') + >>> resp, count, first, last, name = s.group('gmane.comp.python.committers') + >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) + Group gmane.comp.python.committers has 1096 articles, range 1 to 1096 + >>> resp, overviews = s.over((last - 9, last)) + >>> for id, over in overviews: + ... print(id, nntplib.decode_header(over['subject'])) + ... + 1087 Re: Commit privileges for Łukasz Langa + 1088 Re: 3.2 alpha 2 freeze + 1089 Re: 3.2 alpha 2 freeze + 1090 Re: Commit privileges for Łukasz Langa + 1091 Re: Commit privileges for Łukasz Langa + 1092 Updated ssh key + 1093 Re: Updated ssh key + 1094 Re: Updated ssh key + 1095 Hello fellow committers! + 1096 Re: Hello fellow committers! + >>> s.quit() + '205 Bye!' + +To post an article from a binary file (this assumes that the article has +valid headers, and that you have right to post on the particular +newsgroup): + + >>> s = nntplib.NNTP('news.gmane.io') + >>> f = open('article.txt', 'rb') + >>> s.post(f) + '240 Article posted successfully.' + >>> s.quit() + '205 Bye!' + +The module itself defines the following classes: + + -- Class: nntplib.NNTP (host, port=119, user=None, password=None, + readermode=None, usenetrc=False[, timeout]) + + Return a new *note NNTP: 55d. object, representing a connection to + the NNTP server running on host `host', listening at port `port'. + An optional `timeout' can be specified for the socket connection. + If the optional `user' and `password' are provided, or if suitable + credentials are present in ‘/.netrc’ and the optional flag + `usenetrc' is true, the ‘AUTHINFO USER’ and ‘AUTHINFO PASS’ + commands are used to identify and authenticate the user to the + server. If the optional flag `readermode' is true, then a ‘mode + reader’ command is sent before authentication is performed. Reader + mode is sometimes necessary if you are connecting to an NNTP server + on the local machine and intend to call reader-specific commands, + such as ‘group’. If you get unexpected *note NNTPPermanentError: + 40d1.s, you might need to set `readermode'. The *note NNTP: 55d. + class supports the *note with: 19e. statement to unconditionally + consume *note OSError: 413. exceptions and to close the NNTP + connection when done, e.g.: + + >>> from nntplib import NNTP + >>> with NNTP('news.gmane.io') as n: + ... n.group('gmane.comp.python.committers') + ... + ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') + >>> + + Raises an *note auditing event: 12c0. ‘nntplib.connect’ with + arguments ‘self’, ‘host’, ‘port’. + + All commands will raise an *note auditing event: 12c0. + ‘nntplib.putline’ with arguments ‘self’ and ‘line’, where ‘line’ is + the bytes about to be sent to the remote host. + + Changed in version 3.2: `usenetrc' is now ‘False’ by default. + + Changed in version 3.3: Support for the *note with: 19e. statement + was added. + + Changed in version 3.9: If the `timeout' parameter is set to be + zero, it will raise a *note ValueError: 1c8. to prevent the + creation of a non-blocking socket. + + -- Class: nntplib.NNTP_SSL (host, port=563, user=None, password=None, + ssl_context=None, readermode=None, usenetrc=False[, timeout]) + + Return a new *note NNTP_SSL: 55e. object, representing an encrypted + connection to the NNTP server running on host `host', listening at + port `port'. *note NNTP_SSL: 55e. objects have the same methods as + *note NNTP: 55d. objects. If `port' is omitted, port 563 (NNTPS) + is used. `ssl_context' is also optional, and is a *note + SSLContext: 430. object. Please read *note Security + considerations: 2b9e. for best practices. All other parameters + behave the same as for *note NNTP: 55d. + + Note that SSL-on-563 is discouraged per RFC 4642(6), in favor of + STARTTLS as described below. However, some servers only support + the former. + + Raises an *note auditing event: 12c0. ‘nntplib.connect’ with + arguments ‘self’, ‘host’, ‘port’. + + All commands will raise an *note auditing event: 12c0. + ‘nntplib.putline’ with arguments ‘self’ and ‘line’, where ‘line’ is + the bytes about to be sent to the remote host. + + New in version 3.2. + + Changed in version 3.4: The class now supports hostname check with + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + Changed in version 3.9: If the `timeout' parameter is set to be + zero, it will raise a *note ValueError: 1c8. to prevent the + creation of a non-blocking socket. + + -- Exception: nntplib.NNTPError + + Derived from the standard exception *note Exception: 61c, this is + the base class for all exceptions raised by the *note nntplib: be. + module. Instances of this class have the following attribute: + + -- Attribute: response + + The response of the server if available, as a *note str: 1b3. + object. + + -- Exception: nntplib.NNTPReplyError + + Exception raised when an unexpected reply is received from the + server. + + -- Exception: nntplib.NNTPTemporaryError + + Exception raised when a response code in the range 400–499 is + received. + + -- Exception: nntplib.NNTPPermanentError + + Exception raised when a response code in the range 500–599 is + received. + + -- Exception: nntplib.NNTPProtocolError + + Exception raised when a reply is received from the server that does + not begin with a digit in the range 1–5. + + -- Exception: nntplib.NNTPDataError + + Exception raised when there is some error in the response data. + +* Menu: + +* NNTP Objects:: +* Utility functions: Utility functions<2>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/nntplib.py + + (2) https://peps.python.org/pep-0594/ + + (3) https://datatracker.ietf.org/doc/html/rfc3977.html + + (4) https://datatracker.ietf.org/doc/html/rfc977.html + + (5) https://datatracker.ietf.org/doc/html/rfc2980.html + + (6) https://datatracker.ietf.org/doc/html/rfc4642.html + + +File: python.info, Node: NNTP Objects, Next: Utility functions<2>, Up: nntplib — NNTP protocol client + +5.35.14.1 NNTP Objects +...................... + +When connected, *note NNTP: 55d. and *note NNTP_SSL: 55e. objects +support the following methods and attributes. + +* Menu: + +* Attributes:: +* Methods: Methods<3>. + + +File: python.info, Node: Attributes, Next: Methods<3>, Up: NNTP Objects + +5.35.14.2 Attributes +.................... + + -- Attribute: NNTP.nntp_version + + An integer representing the version of the NNTP protocol supported + by the server. In practice, this should be ‘2’ for servers + advertising RFC 3977(1) compliance and ‘1’ for others. + + New in version 3.2. + + -- Attribute: NNTP.nntp_implementation + + A string describing the software name and version of the NNTP + server, or *note None: 243. if not advertised by the server. + + New in version 3.2. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc3977.html + + +File: python.info, Node: Methods<3>, Prev: Attributes, Up: NNTP Objects + +5.35.14.3 Methods +................. + +The `response' that is returned as the first item in the return tuple of +almost all methods is the server’s response: a string beginning with a +three-digit code. If the server’s response indicates an error, the +method raises one of the above exceptions. + +Many of the following methods take an optional keyword-only argument +`file'. When the `file' argument is supplied, it must be either a *note +file object: e76. opened for binary writing, or the name of an on-disk +file to be written to. The method will then write any data returned by +the server (except for the response line and the terminating dot) to the +file; any list of lines, tuples or objects that the method normally +returns will be empty. + +Changed in version 3.2: Many of the following methods have been reworked +and fixed, which makes them incompatible with their 3.1 counterparts. + + -- Method: NNTP.quit () + + Send a ‘QUIT’ command and close the connection. Once this method + has been called, no other methods of the NNTP object should be + called. + + -- Method: NNTP.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.) + + -- Method: NNTP.getcapabilities () + + Return the RFC 3977(1) capabilities advertised by the server, as a + *note dict: 16e. instance mapping capability names to (possibly + empty) lists of values. On legacy servers which don’t understand + the ‘CAPABILITIES’ command, an empty dictionary is returned + instead. + + >>> s = NNTP('news.gmane.io') + >>> 'POST' in s.getcapabilities() + True + + New in version 3.2. + + -- Method: NNTP.login (user=None, password=None, usenetrc=True) + + Send ‘AUTHINFO’ commands with the user name and password. If + `user' and `password' are ‘None’ and `usenetrc' is true, + credentials from ‘~/.netrc’ will be used if possible. + + Unless intentionally delayed, login is normally performed during + the *note NNTP: 55d. object initialization and separately calling + this function is unnecessary. To force authentication to be + delayed, you must not set `user' or `password' when creating the + object, and must set `usenetrc' to False. + + New in version 3.2. + + -- Method: NNTP.starttls (context=None) + + Send a ‘STARTTLS’ command. This will enable encryption on the NNTP + connection. The `context' argument is optional and should be a + *note ssl.SSLContext: 430. object. Please read *note Security + considerations: 2b9e. for best practices. + + Note that this may not be done after authentication information has + been transmitted, and authentication occurs by default if possible + during a *note NNTP: 55d. object initialization. See *note + NNTP.login(): 40e1. for information on suppressing this behavior. + + New in version 3.2. + + Changed in version 3.4: The method now supports hostname check with + *note ssl.SSLContext.check_hostname: 2cb7. and `Server Name + Indication' (see *note ssl.HAS_SNI: 2cc4.). + + -- Method: NNTP.newgroups (date, *, file=None) + + Send a ‘NEWGROUPS’ command. The `date' argument should be a *note + datetime.date: 536. or *note datetime.datetime: 4be. object. + Return a pair ‘(response, groups)’ where `groups' is a list + representing the groups that are new since the given `date'. If + `file' is supplied, though, then `groups' will be empty. + + >>> from datetime import date, timedelta + >>> resp, groups = s.newgroups(date.today() - timedelta(days=3)) + >>> len(groups) + 85 + >>> groups[0] + GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m') + + -- Method: NNTP.newnews (group, date, *, file=None) + + Send a ‘NEWNEWS’ command. Here, `group' is a group name or ‘'*'’, + and `date' has the same meaning as for *note newgroups(): 40e2. + Return a pair ‘(response, articles)’ where `articles' is a list of + message ids. + + This command is frequently disabled by NNTP server administrators. + + -- Method: NNTP.list (group_pattern=None, *, file=None) + + Send a ‘LIST’ or ‘LIST ACTIVE’ command. Return a pair ‘(response, + list)’ where `list' is a list of tuples representing all the groups + available from this NNTP server, optionally matching the pattern + string `group_pattern'. Each tuple has the form ‘(group, last, + first, flag)’, where `group' is a group name, `last' and `first' + are the last and first article numbers, and `flag' usually takes + one of these values: + + * ‘y’: Local postings and articles from peers are allowed. + + * ‘m’: The group is moderated and all postings must be approved. + + * ‘n’: No local postings are allowed, only articles from peers. + + * ‘j’: Articles from peers are filed in the junk group instead. + + * ‘x’: No local postings, and articles from peers are ignored. + + * ‘=foo.bar’: Articles are filed in the ‘foo.bar’ group instead. + + If `flag' has another value, then the status of the newsgroup + should be considered unknown. + + This command can return very large results, especially if + `group_pattern' is not specified. It is best to cache the results + offline unless you really need to refresh them. + + Changed in version 3.2: `group_pattern' was added. + + -- Method: NNTP.descriptions (grouppattern) + + Send a ‘LIST NEWSGROUPS’ command, where `grouppattern' is a wildmat + string as specified in RFC 3977(2) (it’s essentially the same as + DOS or UNIX shell wildcard strings). Return a pair ‘(response, + descriptions)’, where `descriptions' is a dictionary mapping group + names to textual descriptions. + + >>> resp, descs = s.descriptions('gmane.comp.python.*') + >>> len(descs) + 295 + >>> descs.popitem() + ('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)') + + -- Method: NNTP.description (group) + + Get a description for a single group `group'. If more than one + group matches (if ‘group’ is a real wildmat string), return the + first match. If no group matches, return an empty string. + + This elides the response code from the server. If the response + code is needed, use *note descriptions(): 596. + + -- Method: NNTP.group (name) + + Send a ‘GROUP’ command, where `name' is the group name. The group + is selected as the current group, if it exists. Return a tuple + ‘(response, count, first, last, name)’ where `count' is the + (estimated) number of articles in the group, `first' is the first + article number in the group, `last' is the last article number in + the group, and `name' is the group name. + + -- Method: NNTP.over (message_spec, *, file=None) + + Send an ‘OVER’ command, or an ‘XOVER’ command on legacy servers. + `message_spec' can be either a string representing a message id, or + a ‘(first, last)’ tuple of numbers indicating a range of articles + in the current group, or a ‘(first, None)’ tuple indicating a range + of articles starting from `first' to the last article in the + current group, or *note None: 243. to select the current article in + the current group. + + Return a pair ‘(response, overviews)’. `overviews' is a list of + ‘(article_number, overview)’ tuples, one for each article selected + by `message_spec'. Each `overview' is a dictionary with the same + number of items, but this number depends on the server. These + items are either message headers (the key is then the lower-cased + header name) or metadata items (the key is then the metadata name + prepended with ‘":"’). The following items are guaranteed to be + present by the NNTP specification: + + * the ‘subject’, ‘from’, ‘date’, ‘message-id’ and ‘references’ + headers + + * the ‘:bytes’ metadata: the number of bytes in the entire raw + article (including headers and body) + + * the ‘:lines’ metadata: the number of lines in the article body + + The value of each item is either a string, or *note None: 243. if + not present. + + It is advisable to use the *note decode_header(): 40e7. function on + header values when they may contain non-ASCII characters: + + >>> _, _, first, last, _ = s.group('gmane.comp.python.devel') + >>> resp, overviews = s.over((last, last)) + >>> art_num, over = overviews[0] + >>> art_num + 117216 + >>> list(over.keys()) + ['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject'] + >>> over['from'] + '=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= ' + >>> nntplib.decode_header(over['from']) + '"Martin v. Löwis" ' + + New in version 3.2. + + -- Method: NNTP.help (*, file=None) + + Send a ‘HELP’ command. Return a pair ‘(response, list)’ where + `list' is a list of help strings. + + -- Method: NNTP.stat (message_spec=None) + + Send a ‘STAT’ command, where `message_spec' is either a message id + (enclosed in ‘'<'’ and ‘'>'’) or an article number in the current + group. If `message_spec' is omitted or *note None: 243, the + current article in the current group is considered. Return a + triple ‘(response, number, id)’ where `number' is the article + number and `id' is the message id. + + >>> _, _, first, last, _ = s.group('gmane.comp.python.devel') + >>> resp, number, message_id = s.stat(first) + >>> number, message_id + (9099, '<20030112190404.GE29873@epoch.metaslash.com>') + + -- Method: NNTP.next () + + Send a ‘NEXT’ command. Return as for *note stat(): 40e9. + + -- Method: NNTP.last () + + Send a ‘LAST’ command. Return as for *note stat(): 40e9. + + -- Method: NNTP.article (message_spec=None, *, file=None) + + Send an ‘ARTICLE’ command, where `message_spec' has the same + meaning as for *note stat(): 40e9. Return a tuple ‘(response, + info)’ where `info' is a *note namedtuple: 538. with three + attributes `number', `message_id' and `lines' (in that order). + `number' is the article number in the group (or 0 if the + information is not available), `message_id' the message id as a + string, and `lines' a list of lines (without terminating newlines) + comprising the raw message including headers and body. + + >>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>') + >>> info.number + 0 + >>> info.message_id + '<20030112190404.GE29873@epoch.metaslash.com>' + >>> len(info.lines) + 65 + >>> info.lines[0] + b'Path: main.gmane.org!not-for-mail' + >>> info.lines[1] + b'From: Neal Norwitz ' + >>> info.lines[-3:] + [b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal'] + + -- Method: NNTP.head (message_spec=None, *, file=None) + + Same as *note article(): 40ec, but sends a ‘HEAD’ command. The + `lines' returned (or written to `file') will only contain the + message headers, not the body. + + -- Method: NNTP.body (message_spec=None, *, file=None) + + Same as *note article(): 40ec, but sends a ‘BODY’ command. The + `lines' returned (or written to `file') will only contain the + message body, not the headers. + + -- Method: NNTP.post (data) + + Post an article using the ‘POST’ command. The `data' argument is + either a *note file object: e76. opened for binary reading, or any + iterable of bytes objects (representing raw lines of the article to + be posted). It should represent a well-formed news article, + including the required headers. The *note post(): 40ef. method + automatically escapes lines beginning with ‘.’ and appends the + termination line. + + If the method succeeds, the server’s response is returned. If the + server refuses posting, a *note NNTPReplyError: 40d4. is raised. + + -- Method: NNTP.ihave (message_id, data) + + Send an ‘IHAVE’ command. `message_id' is the id of the message to + send to the server (enclosed in ‘'<'’ and ‘'>'’). The `data' + parameter and the return value are the same as for *note post(): + 40ef. + + -- Method: NNTP.date () + + Return a pair ‘(response, date)’. `date' is a *note datetime: 4be. + object containing the current date and time of the server. + + -- Method: NNTP.slave () + + Send a ‘SLAVE’ command. Return the server’s `response'. + + -- Method: NNTP.set_debuglevel (level) + + Set the instance’s debugging level. This controls the amount of + debugging output printed. The default, ‘0’, produces no debugging + output. A value of ‘1’ produces a moderate amount of debugging + output, generally a single line per request or response. A value + of ‘2’ or higher produces the maximum amount of debugging output, + logging each line sent and received on the connection (including + message text). + +The following are optional NNTP extensions defined in RFC 2980(3). Some +of them have been superseded by newer commands in RFC 3977(4). + + -- Method: NNTP.xhdr (hdr, str, *, file=None) + + Send an ‘XHDR’ command. The `hdr' argument is a header keyword, + e.g. ‘'subject'’. The `str' argument should have the form + ‘'first-last'’ where `first' and `last' are the first and last + article numbers to search. Return a pair ‘(response, list)’, where + `list' is a list of pairs ‘(id, text)’, where `id' is an article + number (as a string) and `text' is the text of the requested header + for that article. If the `file' parameter is supplied, then the + output of the ‘XHDR’ command is stored in a file. If `file' is a + string, then the method will open a file with that name, write to + it then close it. If `file' is a *note file object: e76, then it + will start calling ‘write()’ on it to store the lines of the + command output. If `file' is supplied, then the returned `list' is + an empty list. + + -- Method: NNTP.xover (start, end, *, file=None) + + Send an ‘XOVER’ command. `start' and `end' are article numbers + delimiting the range of articles to select. The return value is + the same of for *note over(): 40e6. It is recommended to use *note + over(): 40e6. instead, since it will automatically use the newer + ‘OVER’ command if available. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc3977.html + + (2) https://datatracker.ietf.org/doc/html/rfc3977.html + + (3) https://datatracker.ietf.org/doc/html/rfc2980.html + + (4) https://datatracker.ietf.org/doc/html/rfc3977.html + + +File: python.info, Node: Utility functions<2>, Prev: NNTP Objects, Up: nntplib — NNTP protocol client + +5.35.14.4 Utility functions +........................... + +The module also defines the following utility function: + + -- Function: nntplib.decode_header (header_str) + + Decode a header value, un-escaping any escaped non-ASCII + characters. `header_str' must be a *note str: 1b3. object. The + unescaped value is returned. Using this function is recommended to + display some headers in a human readable form: + + >>> decode_header("Some subject") + 'Some subject' + >>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=") + 'Débuter en Python' + >>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=") + 'Re: problème de matrice' + + +File: python.info, Node: optparse — Parser for command line options, Next: ossaudiodev — Access to OSS-compatible audio devices, Prev: nntplib — NNTP protocol client, Up: Superseded Modules + +5.35.15 ‘optparse’ — Parser for command line options +---------------------------------------------------- + +`Source code:' Lib/optparse.py(1) + +Deprecated since version 3.2: The *note optparse: c1. module is +deprecated and will not be developed further; development will continue +with the *note argparse: 5. module. + +__________________________________________________________________ + +*note optparse: c1. is a more convenient, flexible, and powerful library +for parsing command-line options than the old *note getopt: 81. module. +*note optparse: c1. uses a more declarative style of command-line +parsing: you create an instance of *note OptionParser: 40f9, populate it +with options, and parse the command line. *note optparse: c1. 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 *note optparse: c1. in a simple script: + + 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() + +With these few lines of code, users of your script can now do the “usual +thing” on the command-line, for example: + + --file=outfile -q + +As it parses the command line, *note optparse: c1. sets attributes of +the ‘options’ object returned by ‘parse_args()’ based on user-supplied +command-line values. When ‘parse_args()’ returns from parsing this +command line, ‘options.filename’ will be ‘"outfile"’ and +‘options.verbose’ will be ‘False’. *note optparse: c1. 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: + + -f outfile --quiet + --quiet --file outfile + -q -foutfile + -qfoutfile + +Additionally, users can run one of the following + + -h + --help + +and *note optparse: c1. will print out a brief summary of your script’s +options: + + Usage: [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 + +where the value of `yourscript' is determined at runtime (normally from +‘sys.argv[0]’). + +* Menu: + +* Background:: +* Tutorial: Tutorial<3>. +* Reference Guide:: +* Option Callbacks:: +* Extending optparse:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/optparse.py + + +File: python.info, Node: Background, Next: Tutorial<3>, Up: optparse — Parser for command line options + +5.35.15.1 Background +.................... + +*note optparse: c1. was explicitly designed to encourage the creation of +programs with straightforward, conventional command-line interfaces. 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, read this section to acquaint yourself with them. + +* Menu: + +* Terminology:: +* What are options for?:: +* What are positional arguments for?:: + + +File: python.info, Node: Terminology, Next: What are options for?, Up: Background + +5.35.15.2 Terminology +..................... + +argument + + a string entered on the command-line, and passed by the shell to + ‘execl()’ or ‘execv()’. In Python, arguments are elements of + ‘sys.argv[1:]’ (‘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 ‘sys.argv[1:]’, so you should read “argument” as “an element + of ‘sys.argv[1:]’, or of some other list provided as a substitute + for ‘sys.argv[1:]’”. + +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. ‘-x’ or ‘-F’. Also, traditional Unix syntax + allows multiple options to be merged into a single argument, e.g. + ‘-x -F’ is equivalent to ‘-xF’. The GNU project introduced ‘--’ + followed by a series of hyphen-separated words, e.g. ‘--file’ or + ‘--dry-run’. These are the only two option syntaxes provided by + *note optparse: c1. + + Some other option syntaxes that the world has seen include: + + * a hyphen followed by a few letters, e.g. ‘-pf’ (this is `not' + the same as multiple options merged into a single argument) + + * a hyphen followed by a whole word, e.g. ‘-file’ (this is + technically equivalent to the previous syntax, but they aren’t + usually seen in the same program) + + * a plus sign followed by a single letter, or a few letters, or + a word, e.g. ‘+f’, ‘+rgb’ + + * a slash followed by a letter, or a few letters, or a word, + e.g. ‘/f’, ‘/file’ + + These option syntaxes are not supported by *note optparse: c1, 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). + +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 *note optparse: c1, option arguments may either be in a + separate argument from their option: + + -f foo + --file foo + + or included in the same argument: + + -ffoo + --file=foo + + 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 ‘-a’ takes an optional argument and ‘-b’ is + another option entirely, how do we interpret ‘-ab’? Because of + this ambiguity, *note optparse: c1. does not support this feature. + +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. + +required option + + an option that must be supplied on the command-line; note that the + phrase “required option” is self-contradictory in English. *note + optparse: c1. doesn’t prevent you from implementing required + options, but doesn’t give you much help at it either. + +For example, consider this hypothetical command-line: + + prog -v --report report.txt foo bar + +‘-v’ and ‘--report’ are both options. Assuming that ‘--report’ takes +one argument, ‘report.txt’ is an option argument. ‘foo’ and ‘bar’ are +positional arguments. + + +File: python.info, Node: What are options for?, Next: What are positional arguments for?, Prev: Terminology, Up: Background + +5.35.15.3 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 ‘find’, ‘tar’, and ‘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 +‘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, ‘cp’ fails if you run it with no arguments. However, it has a +flexible, useful syntax that does not require any options at all: + + cp SOURCE DEST + cp SOURCE ... DEST-DIR + +You can get pretty far with just that. Most ‘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 ‘cp’, which is to copy either one file to +another, or several files to another directory. + + +File: python.info, Node: What are positional arguments for?, Prev: What are options for?, Up: Background + +5.35.15.4 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. + + +File: python.info, Node: Tutorial<3>, Next: Reference Guide, Prev: Background, Up: optparse — Parser for command line options + +5.35.15.5 Tutorial +.................. + +While *note optparse: c1. 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 *note optparse: c1.-based program. + +First, you need to import the OptionParser class; then, early in the +main program, create an OptionParser instance: + + from optparse import OptionParser + ... + parser = OptionParser() + +Then you can start defining options. The basic syntax is: + + parser.add_option(opt_str, ..., + attr=value, ...) + +Each option has one or more option strings, such as ‘-f’ or ‘--file’, +and several option attributes that tell *note optparse: c1. 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.: + + parser.add_option("-f", "--file", ...) + +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 *note OptionParser.add_option(): 267b. 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, *note optparse: c1. encounters `option strings' and looks up +options from them. + +Once all of your options are defined, instruct *note optparse: c1. to +parse your program’s command line: + + (options, args) = parser.parse_args() + +(If you like, you can pass a custom argument list to ‘parse_args()’, but +that’s rarely necessary: by default it uses ‘sys.argv[1:]’.) + +‘parse_args()’ returns two values: + + * ‘options’, an object containing values for all of your options—e.g. + if ‘--file’ takes a single string argument, then ‘options.file’ + will be the filename supplied by the user, or ‘None’ if the user + did not supply that option + + * ‘args’, the list of positional arguments leftover after parsing + options + +This tutorial section only covers the four most important option +attributes: *note action: 4104, *note type: 4105, *note dest: 4106. +(destination), and *note help: 4107. Of these, *note action: 4104. 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:: + + +File: python.info, Node: Understanding option actions, Next: The store action, Up: Tutorial<3> + +5.35.15.6 Understanding option actions +...................................... + +Actions tell *note optparse: c1. what to do when it encounters an option +on the command line. There is a fixed set of actions hard-coded into +*note optparse: c1.; adding new actions is an advanced topic covered in +section *note Extending optparse: 410a. Most actions tell *note +optparse: c1. to store a value in some variable—for example, take a +string from the command line and store it in an attribute of ‘options’. + +If you don’t specify an option action, *note optparse: c1. defaults to +‘store’. + + +File: python.info, Node: The store action, Next: Handling boolean flag options, Prev: Understanding option actions, Up: Tutorial<3> + +5.35.15.7 The store action +.......................... + +The most common option action is ‘store’, which tells *note optparse: +c1. 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: + + parser.add_option("-f", "--file", + action="store", type="string", dest="filename") + +Now let’s make up a fake command line and ask *note optparse: c1. to +parse it: + + args = ["-f", "foo.txt"] + (options, args) = parser.parse_args(args) + +When *note optparse: c1. sees the option string ‘-f’, it consumes the +next argument, ‘foo.txt’, and stores it in ‘options.filename’. So, +after this call to ‘parse_args()’, ‘options.filename’ is ‘"foo.txt"’. + +Some other option types supported by *note optparse: c1. are ‘int’ and +‘float’. Here’s an option that expects an integer argument: + + parser.add_option("-n", type="int", dest="num") + +Note that this option has no long option string, which is perfectly +acceptable. Also, there’s no explicit action, since the default is +‘store’. + +Let’s parse another fake command-line. This time, we’ll jam the option +argument right up against the option: since ‘-n42’ (one argument) is +equivalent to ‘-n 42’ (two arguments), the code + + (options, args) = parser.parse_args(["-n42"]) + print(options.num) + +will print ‘42’. + +If you don’t specify a type, *note optparse: c1. assumes ‘string’. +Combined with the fact that the default action is ‘store’, that means +our first example can be a lot shorter: + + parser.add_option("-f", "--file", dest="filename") + +If you don’t supply a destination, *note optparse: c1. figures out a +sensible default from the option strings: if the first long option +string is ‘--foo-bar’, then the default destination is ‘foo_bar’. If +there are no long option strings, *note optparse: c1. looks at the first +short option string: the default destination for ‘-f’ is ‘f’. + +*note optparse: c1. also includes the built-in ‘complex’ type. Adding +types is covered in section *note Extending optparse: 410a. + + +File: python.info, Node: Handling boolean flag options, Next: Other actions, Prev: The store action, Up: Tutorial<3> + +5.35.15.8 Handling boolean (flag) options +......................................... + +Flag options—set a variable to true or false when a particular option is +seen—are quite common. *note optparse: c1. supports them with two +separate actions, ‘store_true’ and ‘store_false’. For example, you +might have a ‘verbose’ flag that is turned on with ‘-v’ and off with +‘-q’: + + parser.add_option("-v", action="store_true", dest="verbose") + parser.add_option("-q", action="store_false", dest="verbose") + +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 *note optparse: c1. encounters ‘-v’ on the command line, it sets +‘options.verbose’ to ‘True’; when it encounters ‘-q’, ‘options.verbose’ +is set to ‘False’. + + +File: python.info, Node: Other actions, Next: Default values, Prev: Handling boolean flag options, Up: Tutorial<3> + +5.35.15.9 Other actions +....................... + +Some other actions supported by *note optparse: c1. are: + +‘"store_const"’ + + store a constant value + +‘"append"’ + + append this option’s argument to a list + +‘"count"’ + + increment a counter by one + +‘"callback"’ + + call a specified function + +These are covered in section *note Reference Guide: 4111, and section +*note Option Callbacks: 4112. + + +File: python.info, Node: Default values, Next: Generating help, Prev: Other actions, Up: Tutorial<3> + +5.35.15.10 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 ‘None’. This is usually fine, but sometimes you +want more control. *note optparse: c1. 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 *note optparse: +c1. to set ‘verbose’ to ‘True’ unless ‘-q’ is seen, then we can do this: + + parser.add_option("-v", action="store_true", dest="verbose", default=True) + parser.add_option("-q", action="store_false", dest="verbose") + +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: + + parser.add_option("-v", action="store_true", dest="verbose") + parser.add_option("-q", action="store_false", dest="verbose", default=True) + +Consider this: + + parser.add_option("-v", action="store_true", dest="verbose", default=False) + parser.add_option("-q", action="store_false", dest="verbose", default=True) + +Again, the default value for ‘verbose’ will be ‘True’: the last default +value supplied for any particular destination is the one that counts. + +A clearer way to specify default values is the ‘set_defaults()’ method +of OptionParser, which you can call at any time before calling +‘parse_args()’: + + parser.set_defaults(verbose=True) + parser.add_option(...) + (options, args) = parser.parse_args() + +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. + + +File: python.info, Node: Generating help, Next: Printing a version string, Prev: Default values, Up: Tutorial<3> + +5.35.15.11 Generating help +.......................... + +*note optparse: c1.’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 *note help: 4107. value for +each option, and optionally a short usage message for your whole +program. Here’s an OptionParser populated with user-friendly +(documented) options: + + 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]") + +If *note optparse: c1. encounters either ‘-h’ or ‘--help’ on the +command-line, or if you just call ‘parser.print_help()’, it prints the +following to standard output: + + Usage: [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] + +(If the help output is triggered by a help option, *note optparse: c1. +exits after printing the help text.) + +There’s a lot going on here to help *note optparse: c1. generate the +best possible help message: + + * the script defines its own usage message: + + usage = "usage: %prog [options] arg1 arg2" + + *note optparse: c1. expands ‘%prog’ in the usage string to the name + of the current program, i.e. ‘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, *note optparse: c1. uses a + bland but sensible default: ‘"Usage: %prog [options]"’, which is + fine if your script doesn’t take any positional arguments. + + * every option defines a help string, and doesn’t worry about + line-wrapping—*note optparse: c1. takes care of wrapping lines and + making the help output look good. + + * options that take a value indicate this fact in their automatically + generated help message, e.g. for the “mode” option: + + -m MODE, --mode=MODE + + Here, “MODE” is called the meta-variable: it stands for the + argument that the user is expected to supply to ‘-m’/‘--mode’. By + default, *note optparse: c1. converts the destination variable name + to uppercase and uses that for the meta-variable. Sometimes, + that’s not what you want—for example, the ‘--filename’ option + explicitly sets ‘metavar="FILE"’, resulting in this automatically + generated option description: + + -f FILE, --filename=FILE + + This is important for more than just saving space, though: the + manually written help text uses the meta-variable ‘FILE’ to clue + the user in that there’s a connection between the semi-formal + syntax ‘-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. + + * options that have a default value can include ‘%default’ in the + help string—*note optparse: c1. will replace it with *note str(): + 1b3. of the option’s default value. If an option has no default + value (or the default value is ‘None’), ‘%default’ expands to + ‘none’. + +* Menu: + +* Grouping Options:: + + +File: python.info, Node: Grouping Options, Up: Generating help + +5.35.15.12 Grouping Options +........................... + +When dealing with many options, it is convenient to group these options +for better help output. An *note OptionParser: 40f9. can contain +several option groups, each of which can contain several options. + +An option group is obtained using the class *note OptionGroup: 4118.: + + -- Class: optparse.OptionGroup (parser, title, description=None) + + where + + * parser is the *note OptionParser: 40f9. instance the group + will be inserted in to + + * title is the group title + + * description, optional, is a long description of the group + +*note OptionGroup: 4118. inherits from ‘OptionContainer’ (like *note +OptionParser: 40f9.) and so the ‘add_option()’ method can be used to add +an option to the group. + +Once all the options are declared, using the *note OptionParser: 40f9. +method ‘add_option_group()’ the group is added to the previously defined +parser. + +Continuing with the parser defined in the previous section, adding an +*note OptionGroup: 4118. to a parser is easy: + + 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) + +This would result in the following help output: + + Usage: [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. + +A bit more complete example might involve using more than one group: +still extending the previous 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) + +that results in the following output: + + Usage: [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 + +Another interesting method, in particular when working programmatically +with option groups is: + + -- Method: OptionParser.get_option_group (opt_str) + + Return the *note OptionGroup: 4118. to which the short or long + option string `opt_str' (e.g. ‘'-o'’ or ‘'--option'’) belongs. If + there’s no such *note OptionGroup: 4118, return ‘None’. + + +File: python.info, Node: Printing a version string, Next: How optparse handles errors, Prev: Generating help, Up: Tutorial<3> + +5.35.15.13 Printing a version string +.................................... + +Similar to the brief usage string, *note optparse: c1. can also print a +version string for your program. You have to supply the string as the +‘version’ argument to OptionParser: + + parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0") + +‘%prog’ is expanded just like it is in ‘usage’. Apart from that, +‘version’ can contain anything you like. When you supply it, *note +optparse: c1. automatically adds a ‘--version’ option to your parser. +If it encounters this option on the command line, it expands your +‘version’ string (by replacing ‘%prog’), prints it to stdout, and exits. + +For example, if your script is called ‘/usr/bin/foo’: + + $ /usr/bin/foo --version + foo 1.0 + +The following two methods can be used to print and get the ‘version’ +string: + + -- Method: OptionParser.print_version (file=None) + + Print the version message for the current program (‘self.version’) + to `file' (default stdout). As with *note print_usage(): 411d, any + occurrence of ‘%prog’ in ‘self.version’ is replaced with the name + of the current program. Does nothing if ‘self.version’ is empty or + undefined. + + -- Method: OptionParser.get_version () + + Same as *note print_version(): 411c. but returns the version string + instead of printing it. + + +File: python.info, Node: How optparse handles errors, Next: Putting it all together, Prev: Printing a version string, Up: Tutorial<3> + +5.35.15.14 How ‘optparse’ handles errors +........................................ + +There are two broad classes of errors that *note optparse: c1. has to +worry about: programmer errors and user errors. Programmer errors are +usually erroneous calls to *note OptionParser.add_option(): 267b, e.g. +invalid option strings, unknown option attributes, missing option +attributes, etc. These are dealt with in the usual way: raise an +exception (either ‘optparse.OptionError’ or *note TypeError: 19c.) 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. *note optparse: c1. can +automatically detect some user errors, such as bad option arguments +(passing ‘-n 4x’ where ‘-n’ takes an integer argument), missing +arguments (‘-n’ at the end of the command line, where ‘-n’ takes an +argument of any type). Also, you can call ‘OptionParser.error()’ to +signal an application-defined error condition: + + (options, args) = parser.parse_args() + ... + if options.a and options.b: + parser.error("options -a and -b are mutually exclusive") + +In either case, *note optparse: c1. 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 ‘4x’ to an +option that takes an integer: + + $ /usr/bin/foo -n 4x + Usage: foo [options] + + foo: error: option -n: invalid integer value: '4x' + +Or, where the user fails to pass a value at all: + + $ /usr/bin/foo -n + Usage: foo [options] + + foo: error: -n option requires an argument + +*note optparse: c1.-generated error messages take care always to mention +the option involved in the error; be sure to do the same when calling +‘OptionParser.error()’ from your application code. + +If *note optparse: c1.’s default error-handling behaviour does not suit +your needs, you’ll need to subclass OptionParser and override its +‘exit()’ and/or ‘error()’ methods. + + +File: python.info, Node: Putting it all together, Prev: How optparse handles errors, Up: Tutorial<3> + +5.35.15.15 Putting it all together +.................................. + +Here’s what *note optparse: c1.-based scripts usually look like: + + 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() + + +File: python.info, Node: Reference Guide, Next: Option Callbacks, Prev: Tutorial<3>, Up: optparse — Parser for command line options + +5.35.15.16 Reference Guide +.......................... + +* Menu: + +* Creating the parser:: +* Populating the parser:: +* Defining options:: +* Option attributes:: +* Standard option actions:: +* Standard option types:: +* Parsing arguments: Parsing arguments<2>. +* Querying and manipulating your option parser:: +* Conflicts between options:: +* Cleanup: Cleanup<2>. +* Other methods:: + + +File: python.info, Node: Creating the parser, Next: Populating the parser, Up: Reference Guide + +5.35.15.17 Creating the parser +.............................. + +The first step in using *note optparse: c1. is to create an OptionParser +instance. + + -- 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. + + ‘usage’ (default: ‘"%prog [options]"’) + + The usage summary to print when your program is run + incorrectly or with a help option. When *note optparse: c1. + prints the usage string, it expands ‘%prog’ to + ‘os.path.basename(sys.argv[0])’ (or to ‘prog’ if you passed + that keyword argument). To suppress a usage message, pass the + special value ‘optparse.SUPPRESS_USAGE’. + + ‘option_list’ (default: ‘[]’) + + A list of Option objects to populate the parser with. The + options in ‘option_list’ are added after any options in + ‘standard_option_list’ (a class attribute that may be set by + OptionParser subclasses), but before any version or help + options. Deprecated; use *note add_option(): 267b. after + creating the parser instead. + + ‘option_class’ (default: optparse.Option) + + Class to use when adding options to the parser in *note + add_option(): 267b. + + ‘version’ (default: ‘None’) + + A version string to print when the user supplies a version + option. If you supply a true value for ‘version’, *note + optparse: c1. automatically adds a version option with the + single option string ‘--version’. The substring ‘%prog’ is + expanded the same as for ‘usage’. + + ‘conflict_handler’ (default: ‘"error"’) + + Specifies what to do when options with conflicting option + strings are added to the parser; see section *note Conflicts + between options: 4126. + + ‘description’ (default: ‘None’) + + A paragraph of text giving a brief overview of your program. + *note optparse: c1. reformats this paragraph to fit the + current terminal width and prints it when the user requests + help (after ‘usage’, but before the list of options). + + ‘formatter’ (default: a new ‘IndentedHelpFormatter’) + + An instance of optparse.HelpFormatter that will be used for + printing help text. *note optparse: c1. provides two concrete + classes for this purpose: IndentedHelpFormatter and + TitledHelpFormatter. + + ‘add_help_option’ (default: ‘True’) + + If true, *note optparse: c1. will add a help option (with + option strings ‘-h’ and ‘--help’) to the parser. + + ‘prog’ + + The string to use when expanding ‘%prog’ in ‘usage’ and + ‘version’ instead of ‘os.path.basename(sys.argv[0])’. + + ‘epilog’ (default: ‘None’) + + A paragraph of help text to print after the option help. + + +File: python.info, Node: Populating the parser, Next: Defining options, Prev: Creating the parser, Up: Reference Guide + +5.35.15.18 Populating the parser +................................ + +There are several ways to populate the parser with options. The +preferred way is by using *note OptionParser.add_option(): 267b, as +shown in section *note Tutorial: 4102. ‘add_option()’ can be called in +one of two ways: + + * pass it an Option instance (as returned by ‘make_option()’) + + * pass it any combination of positional and keyword arguments that + are acceptable to ‘make_option()’ (i.e., to the Option + constructor), and it will create the Option instance for you + +The other alternative is to pass a list of pre-constructed Option +instances to the OptionParser constructor, as in: + + 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) + +(‘make_option()’ is a factory function for creating Option instances; +currently it is an alias for the Option constructor. A future version +of *note optparse: c1. may split Option into several classes, and +‘make_option()’ will pick the right class to instantiate. Do not +instantiate Option directly.) + + +File: python.info, Node: Defining options, Next: Option attributes, Prev: Populating the parser, Up: Reference Guide + +5.35.15.19 Defining options +........................... + +Each Option instance represents a set of synonymous command-line option +strings, e.g. ‘-f’ and ‘--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 ‘Option’ instance is with the +‘add_option()’ method of *note OptionParser: 40f9. + + -- Method: OptionParser.add_option (option) + + -- Method: OptionParser.add_option (*opt_str, attr=value, ...) + + To define an option with only a short option string: + + parser.add_option("-f", attr=value, ...) + + And to define an option with only a long option string: + + parser.add_option("--foo", attr=value, ...) + + The keyword arguments define attributes of the new Option object. + The most important option attribute is *note action: 4104, and it + largely determines which other attributes are relevant or required. + If you pass irrelevant option attributes, or fail to pass required + ones, *note optparse: c1. raises an ‘OptionError’ exception + explaining your mistake. + + An option’s `action' determines what *note optparse: c1. does when + it encounters this option on the command-line. The standard option + actions hard-coded into *note optparse: c1. are: + + ‘"store"’ + + store this option’s argument (default) + + ‘"store_const"’ + + store a constant value + + ‘"store_true"’ + + store ‘True’ + + ‘"store_false"’ + + store ‘False’ + + ‘"append"’ + + append this option’s argument to a list + + ‘"append_const"’ + + append a constant value to a list + + ‘"count"’ + + increment a counter by one + + ‘"callback"’ + + call a specified function + + ‘"help"’ + + print a usage message including all options and the + documentation for them + + (If you don’t supply an action, the default is ‘"store"’. For this + action, you may also supply *note type: 4105. and *note dest: 4106. + option attributes; see *note Standard option actions: 412b.) + +As you can see, most actions involve storing or updating a value +somewhere. *note optparse: c1. always creates a special object for +this, conventionally called ‘options’ (it happens to be an instance of +‘optparse.Values’). Option arguments (and various other values) are +stored as attributes of this object, according to the *note dest: 4106. +(destination) option attribute. + +For example, when you call + + parser.parse_args() + +one of the first things *note optparse: c1. does is create the ‘options’ +object: + + options = Values() + +If one of the options in this parser is defined with + + parser.add_option("-f", "--file", action="store", type="string", dest="filename") + +and the command-line being parsed includes any of the following: + + -ffoo + -f foo + --file=foo + --file foo + +then *note optparse: c1, on seeing this option, will do the equivalent +of + + options.filename = "foo" + +The *note type: 4105. and *note dest: 4106. option attributes are almost +as important as *note action: 4104, but *note action: 4104. is the only +one that makes sense for `all' options. + + +File: python.info, Node: Option attributes, Next: Standard option actions, Prev: Defining options, Up: Reference Guide + +5.35.15.20 Option attributes +............................ + +The following option attributes may be passed as keyword arguments to +*note OptionParser.add_option(): 267b. If you pass an option attribute +that is not relevant to a particular option, or fail to pass a required +option attribute, *note optparse: c1. raises ‘OptionError’. + + -- Attribute: Option.action + + (default: ‘"store"’) + + Determines *note optparse: c1.’s behaviour when this option is seen + on the command line; the available options are documented *note + here: 412b. + + -- Attribute: Option.type + + (default: ‘"string"’) + + The argument type expected by this option (e.g., ‘"string"’ or + ‘"int"’); the available option types are documented *note here: + 412e. + + -- Attribute: Option.dest + + (default: derived from option strings) + + If the option’s action implies writing or modifying a value + somewhere, this tells *note optparse: c1. where to write it: *note + dest: 4106. names an attribute of the ‘options’ object that *note + optparse: c1. builds as it parses the command line. + + -- Attribute: Option.default + + The value to use for this option’s destination if the option is not + seen on the command line. See also *note + OptionParser.set_defaults(): 4130. + + -- Attribute: Option.nargs + + (default: 1) + + How many arguments of type *note type: 4105. should be consumed + when this option is seen. If > 1, *note optparse: c1. will store a + tuple of values to *note dest: 4106. + + -- Attribute: Option.const + + For actions that store a constant value, the constant value to + store. + + -- Attribute: Option.choices + + For options of type ‘"choice"’, the list of strings the user may + choose from. + + -- Attribute: Option.callback + + For options with action ‘"callback"’, the callable to call when + this option is seen. See section *note Option Callbacks: 4112. for + detail on the arguments passed to the callable. + + -- Attribute: Option.callback_args + -- Attribute: Option.callback_kwargs + + Additional positional and keyword arguments to pass to ‘callback’ + after the four standard callback arguments. + + -- Attribute: Option.help + + Help text to print for this option when listing all available + options after the user supplies a *note help: 4107. option (such as + ‘--help’). If no help text is supplied, the option will be listed + without help text. To hide this option, use the special value + ‘optparse.SUPPRESS_HELP’. + + -- Attribute: Option.metavar + + (default: derived from option strings) + + Stand-in for the option argument(s) to use when printing help text. + See section *note Tutorial: 4102. for an example. + + +File: python.info, Node: Standard option actions, Next: Standard option types, Prev: Option attributes, Up: Reference Guide + +5.35.15.21 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 *note optparse: c1.’s behaviour; a few have +required attributes, which you must specify for any option using that +action. + + * ‘"store"’ [relevant: *note type: 4105, *note dest: 4106, *note + nargs: 4131, *note choices: 4133.] + + The option must be followed by an argument, which is converted to a + value according to *note type: 4105. and stored in *note dest: + 4106. If *note nargs: 4131. > 1, multiple arguments will be + consumed from the command line; all will be converted according to + *note type: 4105. and stored to *note dest: 4106. as a tuple. See + the *note Standard option types: 412e. section. + + If *note choices: 4133. is supplied (a list or tuple of strings), + the type defaults to ‘"choice"’. + + If *note type: 4105. is not supplied, it defaults to ‘"string"’. + + If *note dest: 4106. is not supplied, *note optparse: c1. derives a + destination from the first long option string (e.g., ‘--foo-bar’ + implies ‘foo_bar’). If there are no long option strings, *note + optparse: c1. derives a destination from the first short option + string (e.g., ‘-f’ implies ‘f’). + + Example: + + parser.add_option("-f") + parser.add_option("-p", type="float", nargs=3, dest="point") + + As it parses the command line + + -f foo.txt -p 1 -3.5 4 -fbar.txt + + *note optparse: c1. will set + + options.f = "foo.txt" + options.point = (1.0, -3.5, 4.0) + options.f = "bar.txt" + + * ‘"store_const"’ [required: *note const: 4132.; relevant: *note + dest: 4106.] + + The value *note const: 4132. is stored in *note dest: 4106. + + 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") + + If ‘--noisy’ is seen, *note optparse: c1. will set + + options.verbose = 2 + + * ‘"store_true"’ [relevant: *note dest: 4106.] + + A special case of ‘"store_const"’ that stores ‘True’ to *note dest: + 4106. + + * ‘"store_false"’ [relevant: *note dest: 4106.] + + Like ‘"store_true"’, but stores ‘False’. + + Example: + + parser.add_option("--clobber", action="store_true", dest="clobber") + parser.add_option("--no-clobber", action="store_false", dest="clobber") + + * ‘"append"’ [relevant: *note type: 4105, *note dest: 4106, *note + nargs: 4131, *note choices: 4133.] + + The option must be followed by an argument, which is appended to + the list in *note dest: 4106. If no default value for *note dest: + 4106. is supplied, an empty list is automatically created when + *note optparse: c1. first encounters this option on the + command-line. If *note nargs: 4131. > 1, multiple arguments are + consumed, and a tuple of length *note nargs: 4131. is appended to + *note dest: 4106. + + The defaults for *note type: 4105. and *note dest: 4106. are the + same as for the ‘"store"’ action. + + Example: + + parser.add_option("-t", "--tracks", action="append", type="int") + + If ‘-t3’ is seen on the command-line, *note optparse: c1. does the + equivalent of: + + options.tracks = [] + options.tracks.append(int("3")) + + If, a little later on, ‘--tracks=4’ is seen, it does: + + options.tracks.append(int("4")) + + The ‘append’ action calls the ‘append’ method on the current value + of the option. This means that any default value specified must + have an ‘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: + + >>> parser.add_option("--files", action="append", default=['~/.mypkg/defaults']) + >>> opts, args = parser.parse_args(['--files', 'overrides.mypkg']) + >>> opts.files + ['~/.mypkg/defaults', 'overrides.mypkg'] + + * ‘"append_const"’ [required: *note const: 4132.; relevant: *note + dest: 4106.] + + Like ‘"store_const"’, but the value *note const: 4132. is appended + to *note dest: 4106.; as with ‘"append"’, *note dest: 4106. + defaults to ‘None’, and an empty list is automatically created the + first time the option is encountered. + + * ‘"count"’ [relevant: *note dest: 4106.] + + Increment the integer stored at *note dest: 4106. If no default + value is supplied, *note dest: 4106. is set to zero before being + incremented the first time. + + Example: + + parser.add_option("-v", action="count", dest="verbosity") + + The first time ‘-v’ is seen on the command line, *note optparse: + c1. does the equivalent of: + + options.verbosity = 0 + options.verbosity += 1 + + Every subsequent occurrence of ‘-v’ results in + + options.verbosity += 1 + + * ‘"callback"’ [required: *note callback: 4134.; relevant: *note + type: 4105, *note nargs: 4131, *note callback_args: 4135, *note + callback_kwargs: 4136.] + + Call the function specified by *note callback: 4134, which is + called as + + func(option, opt_str, value, parser, *args, **kwargs) + + See section *note Option Callbacks: 4112. for more detail. + + * ‘"help"’ + + Prints a complete help message for all the options in the current + option parser. The help message is constructed from the ‘usage’ + string passed to OptionParser’s constructor and the *note help: + 4107. string passed to every option. + + If no *note help: 4107. string is supplied for an option, it will + still be listed in the help message. To omit an option entirely, + use the special value ‘optparse.SUPPRESS_HELP’. + + *note optparse: c1. automatically adds a *note help: 4107. option + to all OptionParsers, so you do not normally need to create one. + + 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) + + If *note optparse: c1. sees either ‘-h’ or ‘--help’ on the command + line, it will print something like the following help message to + stdout (assuming ‘sys.argv[0]’ is ‘"foo.py"’): + + 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 + + After printing the help message, *note optparse: c1. terminates + your process with ‘sys.exit(0)’. + + * ‘"version"’ + + Prints the version number supplied to the OptionParser to stdout + and exits. The version number is actually formatted and printed by + the ‘print_version()’ method of OptionParser. Generally only + relevant if the ‘version’ argument is supplied to the OptionParser + constructor. As with *note help: 4107. options, you will rarely + create ‘version’ options, since *note optparse: c1. automatically + adds them when needed. + + +File: python.info, Node: Standard option types, Next: Parsing arguments<2>, Prev: Standard option actions, Up: Reference Guide + +5.35.15.22 Standard option types +................................ + +*note optparse: c1. has five built-in option types: ‘"string"’, ‘"int"’, +‘"choice"’, ‘"float"’ and ‘"complex"’. If you need to add new option +types, see section *note Extending optparse: 410a. + +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 ‘"int"’) are parsed as follows: + + * if the number starts with ‘0x’, it is parsed as a hexadecimal + number + + * if the number starts with ‘0’, it is parsed as an octal number + + * if the number starts with ‘0b’, it is parsed as a binary number + + * otherwise, the number is parsed as a decimal number + +The conversion is done by calling *note int(): 1c7. with the appropriate +base (2, 8, 10, or 16). If this fails, so will *note optparse: c1, +although with a more useful error message. + +‘"float"’ and ‘"complex"’ option arguments are converted directly with +*note float(): 3ca. and *note complex(): 1b8, with similar +error-handling. + +‘"choice"’ options are a subtype of ‘"string"’ options. The *note +choices: 4133. option attribute (a sequence of strings) defines the set +of allowed option arguments. ‘optparse.check_choice()’ compares +user-supplied option arguments against this master list and raises +‘OptionValueError’ if an invalid string is given. + + +File: python.info, Node: Parsing arguments<2>, Next: Querying and manipulating your option parser, Prev: Standard option types, Up: Reference Guide + +5.35.15.23 Parsing arguments +............................ + +The whole point of creating and populating an OptionParser is to call +its ‘parse_args()’ method: + + (options, args) = parser.parse_args(args=None, values=None) + +where the input parameters are + +‘args’ + + the list of arguments to process (default: ‘sys.argv[1:]’) + +‘values’ + + an ‘optparse.Values’ object to store option arguments in (default: + a new instance of ‘Values’) – if you give an existing object, the + option defaults will not be initialized on it + +and the return values are + +‘options’ + + the same object that was passed in as ‘values’, or the + optparse.Values instance created by *note optparse: c1. + +‘args’ + + the leftover positional arguments after all options have been + processed + +The most common usage is to supply neither keyword argument. If you +supply ‘values’, it will be modified with repeated *note setattr(): +1b9f. calls (roughly one for every option argument stored to an option +destination) and returned by ‘parse_args()’. + +If ‘parse_args()’ encounters any errors in the argument list, it calls +the OptionParser’s ‘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). + + +File: python.info, Node: Querying and manipulating your option parser, Next: Conflicts between options, Prev: Parsing arguments<2>, Up: Reference Guide + +5.35.15.24 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: + + -- Method: OptionParser.disable_interspersed_args () + + Set parsing to stop on the first non-option. For example, if ‘-a’ + and ‘-b’ are both simple options that take no arguments, *note + optparse: c1. normally accepts this syntax: + + prog -a arg1 -b arg2 + + and treats it as equivalent to + + prog -a -b arg1 arg2 + + To disable this feature, call *note disable_interspersed_args(): + 267c. 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. + + -- 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. + + -- Method: OptionParser.get_option (opt_str) + + Returns the Option instance with the option string `opt_str', or + ‘None’ if no options have that option string. + + -- Method: OptionParser.has_option (opt_str) + + Return ‘True’ if the OptionParser has an option with option string + `opt_str' (e.g., ‘-q’ or ‘--verbose’). + + -- Method: OptionParser.remove_option (opt_str) + + If the *note OptionParser: 40f9. 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 *note + OptionParser: 40f9, raises *note ValueError: 1c8. + + +File: python.info, Node: Conflicts between options, Next: Cleanup<2>, Prev: Querying and manipulating your option parser, Up: Reference Guide + +5.35.15.25 Conflicts between options +.................................... + +If you’re not careful, it’s easy to define options with conflicting +option strings: + + parser.add_option("-n", "--dry-run", ...) + ... + parser.add_option("-n", "--noisy", ...) + +(This is particularly true if you’ve defined your own OptionParser +subclass with some standard options.) + +Every time you add an option, *note optparse: c1. 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: + + parser = OptionParser(..., conflict_handler=handler) + +or with a separate call: + + parser.set_conflict_handler(handler) + +The available conflict handlers are: + + ‘"error"’ (default) + + assume option conflicts are a programming error and raise + ‘OptionConflictError’ + + ‘"resolve"’ + + resolve option conflicts intelligently (see below) + +As an example, let’s define an *note OptionParser: 40f9. that resolves +conflicts intelligently and add conflicting options to it: + + parser = OptionParser(conflict_handler="resolve") + parser.add_option("-n", "--dry-run", ..., help="do no harm") + parser.add_option("-n", "--noisy", ..., help="be noisy") + +At this point, *note optparse: c1. detects that a previously added +option is already using the ‘-n’ option string. Since +‘conflict_handler’ is ‘"resolve"’, it resolves the situation by removing +‘-n’ from the earlier option’s list of option strings. Now ‘--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: + + Options: + --dry-run do no harm + ... + -n, --noisy be noisy + +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, *note optparse: c1. +removes that option completely, so it doesn’t show up in help text or +anywhere else. Carrying on with our existing OptionParser: + + parser.add_option("--dry-run", ..., help="new dry-run option") + +At this point, the original ‘-n’/‘--dry-run’ option is no longer +accessible, so *note optparse: c1. removes it, leaving this help text: + + Options: + ... + -n, --noisy be noisy + --dry-run new dry-run option + + +File: python.info, Node: Cleanup<2>, Next: Other methods, Prev: Conflicts between options, Up: Reference Guide + +5.35.15.26 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 ‘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. + + +File: python.info, Node: Other methods, Prev: Cleanup<2>, Up: Reference Guide + +5.35.15.27 Other methods +........................ + +OptionParser supports several other public methods: + + -- Method: OptionParser.set_usage (usage) + + Set the usage string according to the rules described above for the + ‘usage’ constructor keyword argument. Passing ‘None’ sets the + default usage string; use ‘optparse.SUPPRESS_USAGE’ to suppress a + usage message. + + -- Method: OptionParser.print_usage (file=None) + + Print the usage message for the current program (‘self.usage’) to + `file' (default stdout). Any occurrence of the string ‘%prog’ in + ‘self.usage’ is replaced with the name of the current program. + Does nothing if ‘self.usage’ is empty or not defined. + + -- Method: OptionParser.get_usage () + + Same as *note print_usage(): 411d. but returns the usage string + instead of printing it. + + -- Method: OptionParser.set_defaults (dest=value, ...) + + Set default values for several option destinations at once. Using + *note set_defaults(): 4130. 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: + + 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 + + To avoid this confusion, use *note set_defaults(): 4130.: + + 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") + + +File: python.info, Node: Option Callbacks, Next: Extending optparse, Prev: Reference Guide, Up: optparse — Parser for command line options + +5.35.15.28 Option Callbacks +........................... + +When *note optparse: c1.’s built-in actions and types aren’t quite +enough for your needs, you have two choices: extend *note optparse: c1. +or define a callback option. Extending *note optparse: c1. 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: + + * define the option itself using the ‘"callback"’ action + + * write the callback; this is a function (or method) that takes at + least four arguments, as described below + +* 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. + + +File: python.info, Node: Defining a callback option, Next: How callbacks are called, Up: Option Callbacks + +5.35.15.29 Defining a callback option +..................................... + +As always, the easiest way to define a callback option is by using the +*note OptionParser.add_option(): 267b. method. Apart from *note action: +4104, the only option attribute you must specify is ‘callback’, the +function to call: + + parser.add_option("-c", action="callback", callback=my_callback) + +‘callback’ is a function (or other callable object), so you must have +already defined ‘my_callback()’ when you create this callback option. +In this simple case, *note optparse: c1. doesn’t even know if ‘-c’ takes +any arguments, which usually means that the option takes no +arguments—the mere presence of ‘-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. + +*note optparse: c1. always passes four particular arguments to your +callback, and it will only pass additional arguments if you specify them +via *note callback_args: 4135. and *note callback_kwargs: 4136. Thus, +the minimal callback function signature is: + + def my_callback(option, opt, value, parser): + +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: + +*note type: 4105. + + has its usual meaning: as with the ‘"store"’ or ‘"append"’ actions, + it instructs *note optparse: c1. to consume one argument and + convert it to *note type: 4105. Rather than storing the converted + value(s) anywhere, though, *note optparse: c1. passes it to your + callback function. + +*note nargs: 4131. + + also has its usual meaning: if it is supplied and > 1, *note + optparse: c1. will consume *note nargs: 4131. arguments, each of + which must be convertible to *note type: 4105. It then passes a + tuple of converted values to your callback. + +*note callback_args: 4135. + + a tuple of extra positional arguments to pass to the callback + +*note callback_kwargs: 4136. + + a dictionary of extra keyword arguments to pass to the callback + + +File: python.info, Node: How callbacks are called, Next: Raising errors in a callback, Prev: Defining a callback option, Up: Option Callbacks + +5.35.15.30 How callbacks are called +................................... + +All callbacks are called as follows: + + func(option, opt_str, value, parser, *args, **kwargs) + +where + +‘option’ + + is the Option instance that’s calling the callback + +‘opt_str’ + + is the option string seen on the command-line that’s triggering the + callback. (If an abbreviated long option was used, ‘opt_str’ will + be the full, canonical option string—e.g. if the user puts ‘--foo’ + on the command-line as an abbreviation for ‘--foobar’, then + ‘opt_str’ will be ‘"--foobar"’.) + +‘value’ + + is the argument to this option seen on the command-line. *note + optparse: c1. will only expect an argument if *note type: 4105. is + set; the type of ‘value’ will be the type implied by the option’s + type. If *note type: 4105. for this option is ‘None’ (no argument + expected), then ‘value’ will be ‘None’. If *note nargs: 4131. > 1, + ‘value’ will be a tuple of values of the appropriate type. + +‘parser’ + + is the OptionParser instance driving the whole thing, mainly useful + because you can access some other interesting data through its + instance attributes: + + ‘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 ‘parser.largs’, e.g. by + adding more arguments to it. (This list will become ‘args’, + the second return value of ‘parse_args()’.) + + ‘parser.rargs’ + + the current list of remaining arguments, ie. with ‘opt_str’ + and ‘value’ (if applicable) removed, and only the arguments + following them still there. Feel free to modify + ‘parser.rargs’, e.g. by consuming more arguments. + + ‘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 *note optparse: c1. 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. + +‘args’ + + is a tuple of arbitrary positional arguments supplied via the *note + callback_args: 4135. option attribute. + +‘kwargs’ + + is a dictionary of arbitrary keyword arguments supplied via *note + callback_kwargs: 4136. + + +File: python.info, Node: Raising errors in a callback, Next: Callback example 1 trivial callback, Prev: How callbacks are called, Up: Option Callbacks + +5.35.15.31 Raising errors in a callback +....................................... + +The callback function should raise ‘OptionValueError’ if there are any +problems with the option or its argument(s). *note optparse: c1. +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. + + +File: python.info, Node: Callback example 1 trivial callback, Next: Callback example 2 check option order, Prev: Raising errors in a callback, Up: Option Callbacks + +5.35.15.32 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: + + def record_foo_seen(option, opt_str, value, parser): + parser.values.saw_foo = True + + parser.add_option("--foo", action="callback", callback=record_foo_seen) + +Of course, you could do that with the ‘"store_true"’ action. + + +File: python.info, Node: Callback example 2 check option order, Next: Callback example 3 check option order generalized, Prev: Callback example 1 trivial callback, Up: Option Callbacks + +5.35.15.33 Callback example 2: check option order +................................................. + +Here’s a slightly more interesting example: record the fact that ‘-a’ is +seen, but blow up if it comes after ‘-b’ in the command-line. + + 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") + + +File: python.info, Node: Callback example 3 check option order generalized, Next: Callback example 4 check arbitrary condition, Prev: Callback example 2 check option order, Up: Option Callbacks + +5.35.15.34 Callback example 3: check option order (generalized) +............................................................... + +If you want to re-use this callback for several similar options (set a +flag, but blow up if ‘-b’ has already been seen), it needs a bit of +work: the error message and the flag that it sets must be generalized. + + 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') + + +File: python.info, Node: Callback example 4 check arbitrary condition, Next: Callback example 5 fixed arguments, Prev: Callback example 3 check option order generalized, Up: Option Callbacks + +5.35.15.35 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: + + 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") + +(The definition of ‘is_moon_full()’ is left as an exercise for the +reader.) + + +File: python.info, Node: Callback example 5 fixed arguments, Next: Callback example 6 variable arguments, Prev: Callback example 4 check arbitrary condition, Up: Option Callbacks + +5.35.15.36 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 ‘"store"’ or ‘"append"’ +option: if you define *note type: 4105, then the option takes one +argument that must be convertible to that type; if you further define +*note nargs: 4131, then the option takes *note nargs: 4131. arguments. + +Here’s an example that just emulates the standard ‘"store"’ action: + + 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") + +Note that *note optparse: c1. 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.) + + +File: python.info, Node: Callback example 6 variable arguments, Prev: Callback example 5 fixed arguments, Up: Option Callbacks + +5.35.15.37 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 *note optparse: +c1. doesn’t provide any built-in capabilities for it. And you have to +deal with certain intricacies of conventional Unix command-line parsing +that *note optparse: c1. normally handles for you. In particular, +callbacks should implement the conventional rules for bare ‘--’ and ‘-’ +arguments: + + * either ‘--’ or ‘-’ can be option arguments + + * bare ‘--’ (if not the argument to some option): halt command-line + processing and discard the ‘--’ + + * bare ‘-’ (if not the argument to some option): halt command-line + processing but keep the ‘-’ (append it to ‘parser.largs’) + +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 *note optparse: c1. +doesn’t support this sort of thing directly). + +Nevertheless, here’s a stab at a callback for an option with variable +arguments: + + 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) + + +File: python.info, Node: Extending optparse, Prev: Option Callbacks, Up: optparse — Parser for command line options + +5.35.15.38 Extending ‘optparse’ +............................... + +Since the two major controlling factors in how *note optparse: c1. +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:: + + +File: python.info, Node: Adding new types, Next: Adding new actions, Up: Extending optparse + +5.35.15.39 Adding new types +........................... + +To add new types, you need to define your own subclass of *note +optparse: c1.’s ‘Option’ class. This class has a couple of attributes +that define *note optparse: c1.’s types: *note TYPES: 415f. and *note +TYPE_CHECKER: 4160. + + -- Attribute: Option.TYPES + + A tuple of type names; in your subclass, simply define a new tuple + *note TYPES: 415f. that builds on the standard one. + + -- Attribute: Option.TYPE_CHECKER + + A dictionary mapping type names to type-checking functions. A + type-checking function has the following signature: + + def check_mytype(option, opt, value) + + where ‘option’ is an ‘Option’ instance, ‘opt’ is an option string + (e.g., ‘-f’), and ‘value’ is the string from the command line that + must be checked and converted to your desired type. + ‘check_mytype()’ should return an object of the hypothetical type + ‘mytype’. The value returned by a type-checking function will wind + up in the OptionValues instance returned by + ‘OptionParser.parse_args()’, or be passed to a callback as the + ‘value’ parameter. + + Your type-checking function should raise ‘OptionValueError’ if it + encounters any problems. ‘OptionValueError’ takes a single string + argument, which is passed as-is to *note OptionParser: 40f9.’s + ‘error()’ method, which in turn prepends the program name and the + string ‘"error:"’ and prints everything to stderr before + terminating the process. + +Here’s a silly example that demonstrates adding a ‘"complex"’ option +type to parse Python-style complex numbers on the command line. (This +is even sillier than it used to be, because *note optparse: c1. 1.3 +added built-in support for complex numbers, but never mind.) + +First, the necessary imports: + + from copy import copy + from optparse import Option, OptionValueError + +You need to define your type-checker first, since it’s referred to later +(in the *note TYPE_CHECKER: 4160. class attribute of your Option +subclass): + + def check_complex(option, opt, value): + try: + return complex(value) + except ValueError: + raise OptionValueError( + "option %s: invalid complex value: %r" % (opt, value)) + +Finally, the Option subclass: + + class MyOption (Option): + TYPES = Option.TYPES + ("complex",) + TYPE_CHECKER = copy(Option.TYPE_CHECKER) + TYPE_CHECKER["complex"] = check_complex + +(If we didn’t make a *note copy(): 24. of *note Option.TYPE_CHECKER: +4160, we would end up modifying the *note TYPE_CHECKER: 4160. attribute +of *note optparse: c1.’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 *note optparse: c1.-based script, except you have to +instruct your OptionParser to use MyOption instead of Option: + + parser = OptionParser(option_class=MyOption) + parser.add_option("-c", type="complex") + +Alternately, you can build your own option list and pass it to +OptionParser; if you don’t use ‘add_option()’ in the above way, you +don’t need to tell OptionParser which option class to use: + + option_list = [MyOption("-c", action="store", type="complex", dest="c")] + parser = OptionParser(option_list=option_list) + + +File: python.info, Node: Adding new actions, Prev: Adding new types, Up: Extending optparse + +5.35.15.40 Adding new actions +............................. + +Adding new actions is a bit trickier, because you have to understand +that *note optparse: c1. has a couple of classifications for actions: + +“store” actions + + actions that result in *note optparse: c1. storing a value to an + attribute of the current OptionValues instance; these options + require a *note dest: 4106. attribute to be supplied to the Option + constructor. + +“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 *note type: 4105. attribute + to the Option constructor. + +These are overlapping sets: some default “store” actions are ‘"store"’, +‘"store_const"’, ‘"append"’, and ‘"count"’, while the default “typed” +actions are ‘"store"’, ‘"append"’, and ‘"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): + + -- Attribute: Option.ACTIONS + + All actions must be listed in ACTIONS. + + -- Attribute: Option.STORE_ACTIONS + + “store” actions are additionally listed here. + + -- Attribute: Option.TYPED_ACTIONS + + “typed” actions are additionally listed here. + + -- 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 *note optparse: c1. assigns the default type, ‘"string"’, to + options with no explicit type whose action is listed in *note + ALWAYS_TYPED_ACTIONS: 4166. + +In order to actually implement your new action, you must override +Option’s ‘take_action()’ method and add a case that recognizes your +action. + +For example, let’s add an ‘"extend"’ action. This is similar to the +standard ‘"append"’ action, but instead of taking a single value from +the command-line and appending it to an existing list, ‘"extend"’ will +take multiple values in a single comma-delimited string, and extend an +existing list with them. That is, if ‘--names’ is an ‘"extend"’ option +of type ‘"string"’, the command line + + --names=foo,bar --names blah --names ding,dong + +would result in a list + + ["foo", "bar", "blah", "ding", "dong"] + +Again we define a subclass of Option: + + 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) + +Features of note: + + * ‘"extend"’ both expects a value on the command-line and stores that + value somewhere, so it goes in both *note STORE_ACTIONS: 4164. and + *note TYPED_ACTIONS: 4165. + + * to ensure that *note optparse: c1. assigns the default type of + ‘"string"’ to ‘"extend"’ actions, we put the ‘"extend"’ action in + *note ALWAYS_TYPED_ACTIONS: 4166. as well. + + * ‘MyOption.take_action()’ implements just this one new action, and + passes control back to ‘Option.take_action()’ for the standard + *note optparse: c1. actions. + + * ‘values’ is an instance of the optparse_parser.Values class, which + provides the very useful ‘ensure_value()’ method. ‘ensure_value()’ + is essentially *note getattr(): 837. with a safety valve; it is + called as + + values.ensure_value(attr, value) + + If the ‘attr’ attribute of ‘values’ doesn’t exist or is ‘None’, + then ensure_value() first sets it to ‘value’, and then returns + ‘value. This is very handy for actions like ‘"extend"’, + ‘"append"’, and ‘"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 + ‘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 ‘None’ and + ‘ensure_value()’ will take care of getting it right when it’s + needed. + + +File: python.info, Node: ossaudiodev — Access to OSS-compatible audio devices, Next: pipes — Interface to shell pipelines, Prev: optparse — Parser for command line options, Up: Superseded Modules + +5.35.16 ‘ossaudiodev’ — Access to OSS-compatible audio devices +-------------------------------------------------------------- + +Deprecated since version 3.11, will be removed in version 3.13: The +*note ossaudiodev: c4. module is deprecated (see PEP 594(1) for +details). + +__________________________________________________________________ + +This module allows you to access the OSS (Open Sound System) audio +interface. OSS is available for a wide range of open-source and +commercial Unices, and is the standard audio interface for Linux and +recent versions of FreeBSD. + +Changed in version 3.3: Operations in this module now raise *note +OSError: 413. where *note IOError: d02. was raised. + +See also +........ + +Open Sound System Programmer’s Guide(2) + + the official documentation for the OSS C API + +The module defines a large number of constants supplied by the OSS +device driver; see ‘’ on either Linux or FreeBSD for a +listing. + +*note ossaudiodev: c4. defines the following variables and functions: + + -- Exception: ossaudiodev.OSSAudioError + + This exception is raised on certain errors. The argument is a + string describing what went wrong. + + (If *note ossaudiodev: c4. receives an error from a system call + such as ‘open()’, ‘write()’, or ‘ioctl()’, it raises *note OSError: + 413. Errors detected directly by *note ossaudiodev: c4. result in + *note OSSAudioError: 4169.) + + (For backwards compatibility, the exception class is also available + as ‘ossaudiodev.error’.) + + -- Function: ossaudiodev.open (mode) + + -- Function: ossaudiodev.open (device, mode) + + Open an audio device and return an OSS audio device object. This + object supports many file-like methods, such as ‘read()’, + ‘write()’, and ‘fileno()’ (although there are subtle differences + between conventional Unix read/write semantics and those of OSS + audio devices). It also supports a number of audio-specific + methods; see below for the complete list of methods. + + `device' is the audio device filename to use. If it is not + specified, this module first looks in the environment variable + ‘AUDIODEV’ for a device to use. If not found, it falls back to + ‘/dev/dsp’. + + `mode' is one of ‘'r'’ for read-only (record) access, ‘'w'’ for + write-only (playback) access and ‘'rw'’ for both. Since many sound + cards only allow one process to have the recorder or player open at + a time, it is a good idea to open the device only for the activity + needed. Further, some sound cards are half-duplex: they can be + opened for reading or writing, but not both at once. + + Note the unusual calling syntax: the `first' argument is optional, + and the second is required. This is a historical artifact for + compatibility with the older ‘linuxaudiodev’ module which *note + ossaudiodev: c4. supersedes. + + -- Function: ossaudiodev.openmixer ([device]) + + Open a mixer device and return an OSS mixer device object. + `device' is the mixer device filename to use. If it is not + specified, this module first looks in the environment variable + ‘MIXERDEV’ for a device to use. If not found, it falls back to + ‘/dev/mixer’. + +* Menu: + +* Audio Device Objects:: +* Mixer Device Objects:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0594/#ossaudiodev + + (2) http://www.opensound.com/pguide/oss.pdf + + +File: python.info, Node: Audio Device Objects, Next: Mixer Device Objects, Up: ossaudiodev — Access to OSS-compatible audio devices + +5.35.16.1 Audio Device Objects +.............................. + +Before you can write to or read from an audio device, you must call +three methods in the correct order: + + 1. ‘setfmt()’ to set the output format + + 2. ‘channels()’ to set the number of channels + + 3. ‘speed()’ to set the sample rate + +Alternately, you can use the ‘setparameters()’ method to set all three +audio parameters at once. This is more convenient, but may not be as +flexible in all cases. + +The audio device objects returned by *note open(): 416a. define the +following methods and (read-only) attributes: + + -- Method: oss_audio_device.close () + + Explicitly close the audio device. When you are done writing to or + reading from an audio device, you should explicitly close it. A + closed device cannot be used again. + + -- Method: oss_audio_device.fileno () + + Return the file descriptor associated with the device. + + -- Method: oss_audio_device.read (size) + + Read `size' bytes from the audio input and return them as a Python + string. Unlike most Unix device drivers, OSS audio devices in + blocking mode (the default) will block *note read(): 4170. until + the entire requested amount of data is available. + + -- Method: oss_audio_device.write (data) + + Write a *note bytes-like object: 9a2. `data' to the audio device + and return the number of bytes written. If the audio device is in + blocking mode (the default), the entire data is always written + (again, this is different from usual Unix device semantics). If + the device is in non-blocking mode, some data may not be + written—see *note writeall(): 4172. + + Changed in version 3.5: Writable *note bytes-like object: 9a2. is + now accepted. + + -- Method: oss_audio_device.writeall (data) + + Write a *note bytes-like object: 9a2. `data' to the audio device: + waits until the audio device is able to accept data, writes as much + data as it will accept, and repeats until `data' has been + completely written. If the device is in blocking mode (the + default), this has the same effect as *note write(): 4171.; *note + writeall(): 4172. is only useful in non-blocking mode. Has no + return value, since the amount of data written is always equal to + the amount of data supplied. + + Changed in version 3.5: Writable *note bytes-like object: 9a2. is + now accepted. + +Changed in version 3.2: Audio device objects also support the context +management protocol, i.e. they can be used in a *note with: 19e. +statement. + +The following methods each map to exactly one ‘ioctl()’ system call. +The correspondence is obvious: for example, ‘setfmt()’ corresponds to +the ‘SNDCTL_DSP_SETFMT’ ioctl, and ‘sync()’ to ‘SNDCTL_DSP_SYNC’ (this +can be useful when consulting the OSS documentation). If the underlying +‘ioctl()’ fails, they all raise *note OSError: 413. + + -- Method: oss_audio_device.nonblock () + + Put the device into non-blocking mode. Once in non-blocking mode, + there is no way to return it to blocking mode. + + -- Method: oss_audio_device.getfmts () + + Return a bitmask of the audio output formats supported by the + soundcard. Some of the formats supported by OSS are: + + Format Description + + -------------------------------------------------------------------------------- + + ‘AFMT_MU_LAW’ a logarithmic encoding (used by Sun ‘.au’ files + and ‘/dev/audio’) + + + ‘AFMT_A_LAW’ a logarithmic encoding + + + ‘AFMT_IMA_ADPCM’ a 4:1 compressed format defined by the + Interactive Multimedia Association + + + ‘AFMT_U8’ Unsigned, 8-bit audio + + + ‘AFMT_S16_LE’ Signed, 16-bit audio, little-endian byte order + (as used by Intel processors) + + + ‘AFMT_S16_BE’ Signed, 16-bit audio, big-endian byte order (as + used by 68k, PowerPC, Sparc) + + + ‘AFMT_S8’ Signed, 8 bit audio + + + ‘AFMT_U16_LE’ Unsigned, 16-bit little-endian audio + + + ‘AFMT_U16_BE’ Unsigned, 16-bit big-endian audio + + + Consult the OSS documentation for a full list of audio formats, and + note that most devices support only a subset of these formats. + Some older devices only support ‘AFMT_U8’; the most common format + used today is ‘AFMT_S16_LE’. + + -- Method: oss_audio_device.setfmt (format) + + Try to set the current audio format to `format'—see *note + getfmts(): 4174. for a list. Returns the audio format that the + device was set to, which may not be the requested format. May also + be used to return the current audio format—do this by passing an + “audio format” of ‘AFMT_QUERY’. + + -- Method: oss_audio_device.channels (nchannels) + + Set the number of output channels to `nchannels'. A value of 1 + indicates monophonic sound, 2 stereophonic. Some devices may have + more than 2 channels, and some high-end devices may not support + mono. Returns the number of channels the device was set to. + + -- Method: oss_audio_device.speed (samplerate) + + Try to set the audio sampling rate to `samplerate' samples per + second. Returns the rate actually set. Most sound devices don’t + support arbitrary sampling rates. Common rates are: + + Rate Description + + ------------------------------------------------------------ + + 8000 default rate for ‘/dev/audio’ + + + 11025 speech recording + + + 22050 + + 44100 CD quality audio (at 16 bits/sample and 2 + channels) + + + 96000 DVD quality audio (at 24 bits/sample) + + + -- Method: oss_audio_device.sync () + + Wait until the sound device has played every byte in its buffer. + (This happens implicitly when the device is closed.) The OSS + documentation recommends closing and re-opening the device rather + than using *note sync(): 4178. + + -- Method: oss_audio_device.reset () + + Immediately stop playing or recording and return the device to a + state where it can accept commands. The OSS documentation + recommends closing and re-opening the device after calling *note + reset(): 4179. + + -- Method: oss_audio_device.post () + + Tell the driver that there is likely to be a pause in the output, + making it possible for the device to handle the pause more + intelligently. You might use this after playing a spot sound + effect, before waiting for user input, or before doing disk I/O. + +The following convenience methods combine several ioctls, or one ioctl +and some simple calculations. + + -- Method: oss_audio_device.setparameters (format, nchannels, + samplerate[, strict=False]) + + Set the key audio sampling parameters—sample format, number of + channels, and sampling rate—in one method call. `format', + `nchannels', and `samplerate' should be as specified in the *note + setfmt(): 4175, *note channels(): 4176, and *note speed(): 4177. + methods. If `strict' is true, *note setparameters(): 417b. checks + to see if each parameter was actually set to the requested value, + and raises *note OSSAudioError: 4169. if not. Returns a tuple + (`format', `nchannels', `samplerate') indicating the parameter + values that were actually set by the device driver (i.e., the same + as the return values of *note setfmt(): 4175, *note channels(): + 4176, and *note speed(): 4177.). + + For example, + + (fmt, channels, rate) = dsp.setparameters(fmt, channels, rate) + + is equivalent to + + fmt = dsp.setfmt(fmt) + channels = dsp.channels(channels) + rate = dsp.rate(rate) + + -- Method: oss_audio_device.bufsize () + + Returns the size of the hardware buffer, in samples. + + -- Method: oss_audio_device.obufcount () + + Returns the number of samples that are in the hardware buffer yet + to be played. + + -- Method: oss_audio_device.obuffree () + + Returns the number of samples that could be queued into the + hardware buffer to be played without blocking. + +Audio device objects also support several read-only attributes: + + -- Attribute: oss_audio_device.closed + + Boolean indicating whether the device has been closed. + + -- Attribute: oss_audio_device.name + + String containing the name of the device file. + + -- Attribute: oss_audio_device.mode + + The I/O mode for the file, either ‘"r"’, ‘"rw"’, or ‘"w"’. + + +File: python.info, Node: Mixer Device Objects, Prev: Audio Device Objects, Up: ossaudiodev — Access to OSS-compatible audio devices + +5.35.16.2 Mixer Device Objects +.............................. + +The mixer object provides two file-like methods: + + -- Method: oss_mixer_device.close () + + This method closes the open mixer device file. Any further + attempts to use the mixer after this file is closed will raise an + *note OSError: 413. + + -- Method: oss_mixer_device.fileno () + + Returns the file handle number of the open mixer device file. + +Changed in version 3.2: Mixer objects also support the context +management protocol. + +The remaining methods are specific to audio mixing: + + -- Method: oss_mixer_device.controls () + + This method returns a bitmask specifying the available mixer + controls (“Control” being a specific mixable “channel”, such as + ‘SOUND_MIXER_PCM’ or ‘SOUND_MIXER_SYNTH’). This bitmask indicates + a subset of all available mixer controls—the ‘SOUND_MIXER_*’ + constants defined at module level. To determine if, for example, + the current mixer object supports a PCM mixer, use the following + Python code: + + mixer=ossaudiodev.openmixer() + if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): + # PCM is supported + ... code ... + + For most purposes, the ‘SOUND_MIXER_VOLUME’ (master volume) and + ‘SOUND_MIXER_PCM’ controls should suffice—but code that uses the + mixer should be flexible when it comes to choosing mixer controls. + On the Gravis Ultrasound, for example, ‘SOUND_MIXER_VOLUME’ does + not exist. + + -- Method: oss_mixer_device.stereocontrols () + + Returns a bitmask indicating stereo mixer controls. If a bit is + set, the corresponding control is stereo; if it is unset, the + control is either monophonic or not supported by the mixer (use in + combination with *note controls(): 4186. to determine which). + + See the code example for the *note controls(): 4186. function for + an example of getting data from a bitmask. + + -- Method: oss_mixer_device.reccontrols () + + Returns a bitmask specifying the mixer controls that may be used to + record. See the code example for *note controls(): 4186. for an + example of reading from a bitmask. + + -- Method: oss_mixer_device.get (control) + + Returns the volume of a given mixer control. The returned volume + is a 2-tuple ‘(left_volume,right_volume)’. Volumes are specified + as numbers from 0 (silent) to 100 (full volume). If the control is + monophonic, a 2-tuple is still returned, but both volumes are the + same. + + Raises *note OSSAudioError: 4169. if an invalid control is + specified, or *note OSError: 413. if an unsupported control is + specified. + + -- Method: oss_mixer_device.set (control, (left, right)) + + Sets the volume for a given mixer control to ‘(left,right)’. + ‘left’ and ‘right’ must be ints and between 0 (silent) and 100 + (full volume). On success, the new volume is returned as a + 2-tuple. Note that this may not be exactly the same as the volume + specified, because of the limited resolution of some soundcard’s + mixers. + + Raises *note OSSAudioError: 4169. if an invalid mixer control was + specified, or if the specified volumes were out-of-range. + + -- Method: oss_mixer_device.get_recsrc () + + This method returns a bitmask indicating which control(s) are + currently being used as a recording source. + + -- Method: oss_mixer_device.set_recsrc (bitmask) + + Call this function to specify a recording source. Returns a + bitmask indicating the new recording source (or sources) if + successful; raises *note OSError: 413. if an invalid source was + specified. To set the current recording source to the microphone + input: + + mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC) + + +File: python.info, Node: pipes — Interface to shell pipelines, Next: smtpd — SMTP Server, Prev: ossaudiodev — Access to OSS-compatible audio devices, Up: Superseded Modules + +5.35.17 ‘pipes’ — Interface to shell pipelines +---------------------------------------------- + +`Source code:' Lib/pipes.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note pipes: c9. module is deprecated (see PEP 594(2) for details). +Please use the *note subprocess: f6. module instead. + +__________________________________________________________________ + +The *note pipes: c9. module defines a class to abstract the concept of a +`pipeline' — a sequence of converters from one file to another. + +Because the module uses ‘/bin/sh’ command lines, a POSIX or compatible +shell for *note os.system(): 10c0. and *note os.popen(): 6d9. is +required. + +*note Availability: 1794.: Unix, not VxWorks. + +The *note pipes: c9. module defines the following class: + + -- Class: pipes.Template + + An abstraction of a pipeline. + +Example: + + >>> import pipes + >>> t = pipes.Template() + >>> t.append('tr a-z A-Z', '--') + >>> f = t.open('pipefile', 'w') + >>> f.write('hello world') + >>> f.close() + >>> open('pipefile').read() + 'HELLO WORLD' + +* Menu: + +* Template Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/pipes.py + + (2) https://peps.python.org/pep-0594/#pipes + + +File: python.info, Node: Template Objects, Up: pipes — Interface to shell pipelines + +5.35.17.1 Template Objects +.......................... + +Template objects following methods: + + -- Method: Template.reset () + + Restore a pipeline template to its initial state. + + -- Method: Template.clone () + + Return a new, equivalent, pipeline template. + + -- Method: Template.debug (flag) + + If `flag' is true, turn debugging on. Otherwise, turn debugging + off. When debugging is on, commands to be executed are printed, + and the shell is given ‘set -x’ command to be more verbose. + + -- Method: Template.append (cmd, kind) + + Append a new action at the end. The `cmd' variable must be a valid + bourne shell command. The `kind' variable consists of two letters. + + The first letter can be either of ‘'-'’ (which means the command + reads its standard input), ‘'f'’ (which means the commands reads a + given file on the command line) or ‘'.'’ (which means the commands + reads no input, and hence must be first.) + + Similarly, the second letter can be either of ‘'-'’ (which means + the command writes to standard output), ‘'f'’ (which means the + command writes a file on the command line) or ‘'.'’ (which means + the command does not write anything, and hence must be last.) + + -- Method: Template.prepend (cmd, kind) + + Add a new action at the beginning. See *note append(): 4195. for + explanations of the arguments. + + -- Method: Template.open (file, mode) + + Return a file-like object, open to `file', but read from or written + to by the pipeline. Note that only one of ‘'r'’, ‘'w'’ may be + given. + + -- Method: Template.copy (infile, outfile) + + Copy `infile' to `outfile' through the pipe. + + +File: python.info, Node: smtpd — SMTP Server, Next: sndhdr — Determine type of sound file, Prev: pipes — Interface to shell pipelines, Up: Superseded Modules + +5.35.18 ‘smtpd’ — SMTP Server +----------------------------- + +`Source code:' Lib/smtpd.py(1) + +__________________________________________________________________ + +This module offers several classes to implement SMTP (email) servers. + +Deprecated since version 3.6, will be removed in version 3.12: The *note +smtpd: e9. module is deprecated (see PEP 594(2) for details). The +aiosmtpd(3) package is a recommended replacement for this module. It is +based on *note asyncio: 9. and provides a more straightforward API. + +Several server implementations are present; one is a generic do-nothing +implementation, which can be overridden, while the other two offer +specific mail-sending strategies. + +Additionally the SMTPChannel may be extended to implement very specific +interaction behaviour with SMTP clients. + +The code supports RFC 5321(4), plus the RFC 1870(5) SIZE and RFC 6531(6) +SMTPUTF8 extensions. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +* Menu: + +* SMTPServer Objects:: +* DebuggingServer Objects:: +* PureProxy Objects:: +* SMTPChannel Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/smtpd.py + + (2) https://peps.python.org/pep-0594/#smtpd + + (3) https://aiosmtpd.readthedocs.io/ + + (4) https://datatracker.ietf.org/doc/html/rfc5321.html + + (5) https://datatracker.ietf.org/doc/html/rfc1870.html + + (6) https://datatracker.ietf.org/doc/html/rfc6531.html + + +File: python.info, Node: SMTPServer Objects, Next: DebuggingServer Objects, Up: smtpd — SMTP Server + +5.35.18.1 SMTPServer Objects +............................ + + -- Class: smtpd.SMTPServer (localaddr, remoteaddr, + data_size_limit=33554432, map=None, enable_SMTPUTF8=False, + decode_data=False) + + Create a new *note SMTPServer: 9bc. object, which binds to local + address `localaddr'. It will treat `remoteaddr' as an upstream + SMTP relayer. Both `localaddr' and `remoteaddr' should be a *note + (host, port): 2c5d. tuple. The object inherits from *note + asyncore.dispatcher: eec, and so will insert itself into *note + asyncore: a.’s event loop on instantiation. + + `data_size_limit' specifies the maximum number of bytes that will + be accepted in a ‘DATA’ command. A value of ‘None’ or ‘0’ means no + limit. + + `map' is the socket map to use for connections (an initially empty + dictionary is a suitable value). If not specified the *note + asyncore: a. global socket map is used. + + `enable_SMTPUTF8' determines whether the ‘SMTPUTF8’ extension (as + defined in RFC 6531(1)) should be enabled. The default is ‘False’. + When ‘True’, ‘SMTPUTF8’ is accepted as a parameter to the ‘MAIL’ + command and when present is passed to *note process_message(): 9bd. + in the ‘kwargs['mail_options']’ list. `decode_data' and + `enable_SMTPUTF8' cannot be set to ‘True’ at the same time. + + `decode_data' specifies whether the data portion of the SMTP + transaction should be decoded using UTF-8. When `decode_data' is + ‘False’ (the default), the server advertises the ‘8BITMIME’ + extension ( RFC 6152(2)), accepts the ‘BODY=8BITMIME’ parameter to + the ‘MAIL’ command, and when present passes it to *note + process_message(): 9bd. in the ‘kwargs['mail_options']’ list. + `decode_data' and `enable_SMTPUTF8' cannot be set to ‘True’ at the + same time. + + -- Method: process_message (peer, mailfrom, rcpttos, data, + **kwargs) + + Raise a *note NotImplementedError: 9c7. exception. Override + this in subclasses to do something useful with this message. + Whatever was passed in the constructor as `remoteaddr' will be + available as the ‘_remoteaddr’ attribute. `peer' is the + remote host’s address, `mailfrom' is the envelope originator, + `rcpttos' are the envelope recipients and `data' is a string + containing the contents of the e-mail (which should be in RFC + 5321(3) format). + + If the `decode_data' constructor keyword is set to ‘True’, the + `data' argument will be a unicode string. If it is set to + ‘False’, it will be a bytes object. + + `kwargs' is a dictionary containing additional information. + It is empty if ‘decode_data=True’ was given as an init + argument, otherwise it contains the following keys: + + `mail_options': + + a list of all received parameters to the ‘MAIL’ + command (the elements are uppercase strings; + example: ‘['BODY=8BITMIME', 'SMTPUTF8']’). + + `rcpt_options': + + same as `mail_options' but for the ‘RCPT’ command. + Currently no ‘RCPT TO’ options are supported, so for + now this will always be an empty list. + + Implementations of ‘process_message’ should use the ‘**kwargs’ + signature to accept arbitrary keyword arguments, since future + feature enhancements may add keys to the kwargs dictionary. + + Return ‘None’ to request a normal ‘250 Ok’ response; otherwise + return the desired response string in RFC 5321(4) format. + + -- Attribute: channel_class + + Override this in subclasses to use a custom *note SMTPChannel: + 9bb. for managing SMTP clients. + + New in version 3.4: The `map' constructor argument. + + Changed in version 3.5: `localaddr' and `remoteaddr' may now + contain IPv6 addresses. + + New in version 3.5: The `decode_data' and `enable_SMTPUTF8' + constructor parameters, and the `kwargs' parameter to *note + process_message(): 9bd. when `decode_data' is ‘False’. + + Changed in version 3.6: `decode_data' is now ‘False’ by default. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc6531.html + + (2) https://datatracker.ietf.org/doc/html/rfc6152.html + + (3) https://datatracker.ietf.org/doc/html/rfc5321.html + + (4) https://datatracker.ietf.org/doc/html/rfc5321.html + + +File: python.info, Node: DebuggingServer Objects, Next: PureProxy Objects, Prev: SMTPServer Objects, Up: smtpd — SMTP Server + +5.35.18.2 DebuggingServer Objects +................................. + + -- Class: smtpd.DebuggingServer (localaddr, remoteaddr) + + Create a new debugging server. Arguments are as per *note + SMTPServer: 9bc. Messages will be discarded, and printed on + stdout. + + +File: python.info, Node: PureProxy Objects, Next: SMTPChannel Objects, Prev: DebuggingServer Objects, Up: smtpd — SMTP Server + +5.35.18.3 PureProxy Objects +........................... + + -- Class: smtpd.PureProxy (localaddr, remoteaddr) + + Create a new pure proxy server. Arguments are as per *note + SMTPServer: 9bc. Everything will be relayed to `remoteaddr'. Note + that running this has a good chance to make you into an open relay, + so please be careful. + + +File: python.info, Node: SMTPChannel Objects, Prev: PureProxy Objects, Up: smtpd — SMTP Server + +5.35.18.4 SMTPChannel Objects +............................. + + -- Class: smtpd.SMTPChannel (server, conn, addr, + data_size_limit=33554432, map=None, enable_SMTPUTF8=False, + decode_data=False) + + Create a new *note SMTPChannel: 9bb. object which manages the + communication between the server and a single SMTP client. + + `conn' and `addr' are as per the instance variables described + below. + + `data_size_limit' specifies the maximum number of bytes that will + be accepted in a ‘DATA’ command. A value of ‘None’ or ‘0’ means no + limit. + + `enable_SMTPUTF8' determines whether the ‘SMTPUTF8’ extension (as + defined in RFC 6531(1)) should be enabled. The default is ‘False’. + `decode_data' and `enable_SMTPUTF8' cannot be set to ‘True’ at the + same time. + + A dictionary can be specified in `map' to avoid using a global + socket map. + + `decode_data' specifies whether the data portion of the SMTP + transaction should be decoded using UTF-8. The default is ‘False’. + `decode_data' and `enable_SMTPUTF8' cannot be set to ‘True’ at the + same time. + + To use a custom SMTPChannel implementation you need to override the + *note SMTPServer.channel_class: 419c. of your *note SMTPServer: + 9bc. + + Changed in version 3.5: The `decode_data' and `enable_SMTPUTF8' + parameters were added. + + Changed in version 3.6: `decode_data' is now ‘False’ by default. + + The *note SMTPChannel: 9bb. has the following instance variables: + + -- Attribute: smtp_server + + Holds the *note SMTPServer: 9bc. that spawned this channel. + + -- Attribute: conn + + Holds the socket object connecting to the client. + + -- Attribute: addr + + Holds the address of the client, the second value returned by + *note socket.accept: a20. + + -- Attribute: received_lines + + Holds a list of the line strings (decoded using UTF-8) + received from the client. The lines have their ‘"\r\n"’ line + ending translated to ‘"\n"’. + + -- Attribute: smtp_state + + Holds the current state of the channel. This will be either + ‘COMMAND’ initially and then ‘DATA’ after the client sends a + “DATA” line. + + -- Attribute: seen_greeting + + Holds a string containing the greeting sent by the client in + its “HELO”. + + -- Attribute: mailfrom + + Holds a string containing the address identified in the “MAIL + FROM:” line from the client. + + -- Attribute: rcpttos + + Holds a list of strings containing the addresses identified in + the “RCPT TO:” lines from the client. + + -- Attribute: received_data + + Holds a string containing all of the data sent by the client + during the DATA state, up to but not including the terminating + ‘"\r\n.\r\n"’. + + -- Attribute: fqdn + + Holds the fully qualified domain name of the server as + returned by *note socket.getfqdn(): 2c86. + + -- Attribute: peer + + Holds the name of the client peer as returned by + ‘conn.getpeername()’ where ‘conn’ is *note conn: 41a3. + + The *note SMTPChannel: 9bb. operates by invoking methods named + ‘smtp_’ upon reception of a command line from the client. + Built into the base *note SMTPChannel: 9bb. class are methods for + handling the following commands (and responding to them + appropriately): + + Command Action taken + + ------------------------------------------------------------------------------------- + + HELO Accepts the greeting from the client and stores it in + *note seen_greeting: 41a7. Sets server to base command mode. + + + EHLO Accepts the greeting from the client and stores it in + *note seen_greeting: 41a7. Sets server to extended command mode. + + + NOOP Takes no action. + + + QUIT Closes the connection cleanly. + + + MAIL Accepts the “MAIL FROM:” syntax and stores the supplied address as + *note mailfrom: 41a8. In extended command mode, accepts the RFC + 1870(2) SIZE attribute and responds appropriately based on the value + of `data_size_limit'. + + + RCPT Accepts the “RCPT TO:” syntax and stores the supplied addresses in + the *note rcpttos: 41a9. list. + + + RSET Resets the *note mailfrom: 41a8, *note rcpttos: 41a9, and + *note received_data: 41aa, but not the greeting. + + + DATA Sets the internal state to ‘DATA’ and stores remaining lines from the + client in *note received_data: 41aa. until the terminator + ‘"\r\n.\r\n"’ is received. + + + HELP Returns minimal information on command syntax + + + VRFY Returns code 252 (the server doesn’t know if the address is valid) + + + EXPN Reports that the command is not implemented. + + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc6531.html + + (2) https://datatracker.ietf.org/doc/html/rfc1870.html + + +File: python.info, Node: sndhdr — Determine type of sound file, Next: spwd — The shadow password database, Prev: smtpd — SMTP Server, Up: Superseded Modules + +5.35.19 ‘sndhdr’ — Determine type of sound file +----------------------------------------------- + +`Source code:' Lib/sndhdr.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note sndhdr: eb. module is deprecated (see PEP 594(2) for details and +alternatives). + +__________________________________________________________________ + +The *note sndhdr: eb. provides utility functions which attempt to +determine the type of sound data which is in a file. When these +functions are able to determine what type of sound data is stored in a +file, they return a *note namedtuple(): 538, containing five attributes: +(‘filetype’, ‘framerate’, ‘nchannels’, ‘nframes’, ‘sampwidth’). The +value for `type' indicates the data type and will be one of the strings +‘'aifc'’, ‘'aiff'’, ‘'au'’, ‘'hcom'’, ‘'sndr'’, ‘'sndt'’, ‘'voc'’, +‘'wav'’, ‘'8svx'’, ‘'sb'’, ‘'ub'’, or ‘'ul'’. The `sampling_rate' will +be either the actual value or ‘0’ if unknown or difficult to decode. +Similarly, `channels' will be either the number of channels or ‘0’ if it +cannot be determined or if the value is difficult to decode. The value +for `frames' will be either the number of frames or ‘-1’. The last item +in the tuple, `bits_per_sample', will either be the sample size in bits +or ‘'A'’ for A-LAW or ‘'U'’ for u-LAW. + + -- Function: sndhdr.what (filename) + + Determines the type of sound data stored in the file `filename' + using *note whathdr(): ae4. If it succeeds, returns a namedtuple + as described above, otherwise ‘None’ is returned. + + Changed in version 3.5: Result changed from a tuple to a + namedtuple. + + -- Function: sndhdr.whathdr (filename) + + Determines the type of sound data stored in a file based on the + file header. The name of the file is given by `filename'. This + function returns a namedtuple as described above on success, or + ‘None’. + + Changed in version 3.5: Result changed from a tuple to a + namedtuple. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/sndhdr.py + + (2) https://peps.python.org/pep-0594/#sndhdr + + +File: python.info, Node: spwd — The shadow password database, Next: sunau — Read and write Sun AU files, Prev: sndhdr — Determine type of sound file, Up: Superseded Modules + +5.35.20 ‘spwd’ — The shadow password database +--------------------------------------------- + +Deprecated since version 3.11, will be removed in version 3.13: The +*note spwd: ee. module is deprecated (see PEP 594(1) for details and +alternatives). + +__________________________________________________________________ + +This module provides access to the Unix shadow password database. It is +available on various Unix versions. + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + +You must have enough privileges to access the shadow password database +(this usually means you have to be root). + +Shadow password database entries are reported as a tuple-like object, +whose attributes correspond to the members of the ‘spwd’ structure +(Attribute field below, see ‘’): + +Index Attribute Meaning + +---------------------------------------------------------------------- + +0 ‘sp_namp’ Login name + + +1 ‘sp_pwdp’ Encrypted password + + +2 ‘sp_lstchg’ Date of last change + + +3 ‘sp_min’ Minimal number of days between + changes + + +4 ‘sp_max’ Maximum number of days between + changes + + +5 ‘sp_warn’ Number of days before password + expires to warn user about it + + +6 ‘sp_inact’ Number of days after password + expires until account is disabled + + +7 ‘sp_expire’ Number of days since 1970-01-01 + when account expires + + +8 ‘sp_flag’ Reserved + + +The sp_namp and sp_pwdp items are strings, all others are integers. +*note KeyError: 6f5. is raised if the entry asked for cannot be found. + +The following functions are defined: + + -- Function: spwd.getspnam (name) + + Return the shadow password database entry for the given user name. + + Changed in version 3.6: Raises a *note PermissionError: 9b9. + instead of *note KeyError: 6f5. if the user doesn’t have + privileges. + + -- Function: spwd.getspall () + + Return a list of all available shadow password database entries, in + arbitrary order. + +See also +........ + +Module *note grp: 86. + + An interface to the group database, similar to this. + +Module *note pwd: d3. + + An interface to the normal password database, similar to this. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0594/#spwd + + +File: python.info, Node: sunau — Read and write Sun AU files, Next: telnetlib — Telnet client, Prev: spwd — The shadow password database, Up: Superseded Modules + +5.35.21 ‘sunau’ — Read and write Sun AU files +--------------------------------------------- + +`Source code:' Lib/sunau.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note sunau: f7. module is deprecated (see PEP 594(2) for details). + +__________________________________________________________________ + +The *note sunau: f7. module provides a convenient interface to the Sun +AU sound format. Note that this module is interface-compatible with the +modules *note aifc: 4. and *note wave: 131. + +An audio file consists of a header followed by the data. The fields of +the header are: + +Field Contents + +------------------------------------------------------------------------ + +magic word The four bytes ‘.snd’. + + +header size Size of the header, including info, in bytes. + + +data size Physical size of the data, in bytes. + + +encoding Indicates how the audio samples are encoded. + + +sample rate The sampling rate. + + +# of channels The number of channels in the samples. + + +info ASCII string giving a description of the audio + file (padded with null bytes). + + +Apart from the info field, all header fields are 4 bytes in size. They +are all 32-bit unsigned integers encoded in big-endian byte order. + +The *note sunau: f7. module defines the following functions: + + -- Function: sunau.open (file, mode) + + If `file' is a string, open the file by that name, otherwise treat + it as a seekable file-like object. `mode' can be any of + + ‘'r'’ + + Read only mode. + + ‘'w'’ + + Write only mode. + + Note that it does not allow read/write files. + + A `mode' of ‘'r'’ returns an ‘AU_read’ object, while a `mode' of + ‘'w'’ or ‘'wb'’ returns an ‘AU_write’ object. + +The *note sunau: f7. module defines the following exception: + + -- Exception: sunau.Error + + An error raised when something is impossible because of Sun AU + specs or implementation deficiency. + +The *note sunau: f7. module defines the following data items: + + -- Data: sunau.AUDIO_FILE_MAGIC + + An integer every valid Sun AU file begins with, stored in + big-endian form. This is the string ‘.snd’ interpreted as an + integer. + + -- Data: sunau.AUDIO_FILE_ENCODING_MULAW_8 + -- Data: sunau.AUDIO_FILE_ENCODING_LINEAR_8 + -- Data: sunau.AUDIO_FILE_ENCODING_LINEAR_16 + -- Data: sunau.AUDIO_FILE_ENCODING_LINEAR_24 + -- Data: sunau.AUDIO_FILE_ENCODING_LINEAR_32 + -- Data: sunau.AUDIO_FILE_ENCODING_ALAW_8 + + Values of the encoding field from the AU header which are supported + by this module. + + -- Data: sunau.AUDIO_FILE_ENCODING_FLOAT + -- Data: sunau.AUDIO_FILE_ENCODING_DOUBLE + -- Data: sunau.AUDIO_FILE_ENCODING_ADPCM_G721 + -- Data: sunau.AUDIO_FILE_ENCODING_ADPCM_G722 + -- Data: sunau.AUDIO_FILE_ENCODING_ADPCM_G723_3 + -- Data: sunau.AUDIO_FILE_ENCODING_ADPCM_G723_5 + + Additional known values of the encoding field from the AU header, + but which are not supported by this module. + +* Menu: + +* AU_read Objects:: +* AU_write Objects:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/sunau.py + + (2) https://peps.python.org/pep-0594/#sunau + + +File: python.info, Node: AU_read Objects, Next: AU_write Objects, Up: sunau — Read and write Sun AU files + +5.35.21.1 AU_read Objects +......................... + +AU_read objects, as returned by *note open(): 856. above, have the +following methods: + + -- Method: AU_read.close () + + Close the stream, and make the instance unusable. (This is called + automatically on deletion.) + + -- Method: AU_read.getnchannels () + + Returns number of audio channels (1 for mono, 2 for stereo). + + -- Method: AU_read.getsampwidth () + + Returns sample width in bytes. + + -- Method: AU_read.getframerate () + + Returns sampling frequency. + + -- Method: AU_read.getnframes () + + Returns number of audio frames. + + -- Method: AU_read.getcomptype () + + Returns compression type. Supported compression types are + ‘'ULAW'’, ‘'ALAW'’ and ‘'NONE'’. + + -- Method: AU_read.getcompname () + + Human-readable version of *note getcomptype(): 41c9. The supported + types have the respective names ‘'CCITT G.711 u-law'’, ‘'CCITT + G.711 A-law'’ and ‘'not compressed'’. + + -- Method: AU_read.getparams () + + Returns a *note namedtuple(): 538. ‘(nchannels, sampwidth, + framerate, nframes, comptype, compname)’, equivalent to output of + the ‘get*()’ methods. + + -- Method: AU_read.readframes (n) + + Reads and returns at most `n' frames of audio, as a *note bytes: + 1b4. object. The data will be returned in linear format. If the + original data is in u-LAW format, it will be converted. + + -- Method: AU_read.rewind () + + Rewind the file pointer to the beginning of the audio stream. + +The following two methods define a term “position” which is compatible +between them, and is otherwise implementation dependent. + + -- Method: AU_read.setpos (pos) + + Set the file pointer to the specified position. Only values + returned from *note tell(): 41cf. should be used for `pos'. + + -- Method: AU_read.tell () + + Return current file pointer position. Note that the returned value + has nothing to do with the actual position in the file. + +The following two functions are defined for compatibility with the *note +aifc: 4, and don’t do anything interesting. + + -- Method: AU_read.getmarkers () + + Returns ‘None’. + + -- Method: AU_read.getmark (id) + + Raise an error. + + +File: python.info, Node: AU_write Objects, Prev: AU_read Objects, Up: sunau — Read and write Sun AU files + +5.35.21.2 AU_write Objects +.......................... + +AU_write objects, as returned by *note open(): 856. above, have the +following methods: + + -- Method: AU_write.setnchannels (n) + + Set the number of channels. + + -- Method: AU_write.setsampwidth (n) + + Set the sample width (in bytes.) + + Changed in version 3.4: Added support for 24-bit samples. + + -- Method: AU_write.setframerate (n) + + Set the frame rate. + + -- Method: AU_write.setnframes (n) + + Set the number of frames. This can be later changed, when and if + more frames are written. + + -- Method: AU_write.setcomptype (type, name) + + Set the compression type and description. Only ‘'NONE'’ and + ‘'ULAW'’ are supported on output. + + -- Method: AU_write.setparams (tuple) + + The `tuple' should be ‘(nchannels, sampwidth, framerate, nframes, + comptype, compname)’, with values valid for the ‘set*()’ methods. + Set all parameters. + + -- Method: AU_write.tell () + + Return current position in the file, with the same disclaimer for + the *note AU_read.tell(): 41cf. and *note AU_read.setpos(): 41ce. + methods. + + -- Method: AU_write.writeframesraw (data) + + Write audio frames, without correcting `nframes'. + + Changed in version 3.4: Any *note bytes-like object: 9a2. is now + accepted. + + -- Method: AU_write.writeframes (data) + + Write audio frames and make sure `nframes' is correct. + + Changed in version 3.4: Any *note bytes-like object: 9a2. is now + accepted. + + -- Method: AU_write.close () + + Make sure `nframes' is correct, and close the file. + + This method is called upon deletion. + +Note that it is invalid to set any parameters after calling +‘writeframes()’ or ‘writeframesraw()’. + + +File: python.info, Node: telnetlib — Telnet client, Next: uu — Encode and decode uuencode files, Prev: sunau — Read and write Sun AU files, Up: Superseded Modules + +5.35.22 ‘telnetlib’ — Telnet client +----------------------------------- + +`Source code:' Lib/telnetlib.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note telnetlib: fe. module is deprecated (see PEP 594(2) for details +and alternatives). + +__________________________________________________________________ + +The *note telnetlib: fe. module provides a *note Telnet: 957. class that +implements the Telnet protocol. See RFC 854(3) for details about the +protocol. In addition, it provides symbolic constants for the protocol +characters (see below), and for the telnet options. The symbolic names +of the telnet options follow the definitions in ‘arpa/telnet.h’, with +the leading ‘TELOPT_’ removed. For symbolic names of options which are +traditionally not included in ‘arpa/telnet.h’, see the module source +itself. + +The symbolic constants for the telnet commands are: IAC, DONT, DO, WONT, +WILL, SE (Subnegotiation End), NOP (No Operation), DM (Data Mark), BRK +(Break), IP (Interrupt process), AO (Abort output), AYT (Are You There), +EC (Erase Character), EL (Erase Line), GA (Go Ahead), SB (Subnegotiation +Begin). + +*note Availability: 1794.: not Emscripten, not WASI. This module does +not work or is not available on WebAssembly platforms +‘wasm32-emscripten’ and ‘wasm32-wasi’. See *note WebAssembly platforms: +11a0. for more information. + + -- Class: telnetlib.Telnet (host=None, port=0[, timeout]) + + *note Telnet: 957. represents a connection to a Telnet server. The + instance is initially not connected by default; the *note open(): + 3a4c. method must be used to establish a connection. + Alternatively, the host name and optional port number can be passed + to the constructor too, in which case the connection to the server + will be established before the constructor returns. 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). + + Do not reopen an already connected instance. + + This class has many ‘read_*()’ methods. Note that some of them + raise *note EOFError: f7d. when the end of the connection is read, + because they can return an empty string for other reasons. See the + individual descriptions below. + + A *note Telnet: 957. object is a context manager and can be used in + a *note with: 19e. statement. When the ‘with’ block ends, the + *note close(): 41dd. method is called: + + >>> from telnetlib import Telnet + >>> with Telnet('localhost', 23) as tn: + ... tn.interact() + ... + + Changed in version 3.6: Context manager support added + +See also +........ + +RFC 854(4) - Telnet Protocol Specification + + Definition of the Telnet protocol. + +* Menu: + +* Telnet Objects:: +* Telnet Example:: + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/telnetlib.py + + (2) https://peps.python.org/pep-0594/#telnetlib + + (3) https://datatracker.ietf.org/doc/html/rfc854.html + + (4) https://datatracker.ietf.org/doc/html/rfc854.html + + +File: python.info, Node: Telnet Objects, Next: Telnet Example, Up: telnetlib — Telnet client + +5.35.22.1 Telnet Objects +........................ + +*note Telnet: 957. instances have the following methods: + + -- Method: Telnet.read_until (expected, timeout=None) + + Read until a given byte string, `expected', is encountered or until + `timeout' seconds have passed. + + When no match is found, return whatever is available instead, + possibly empty bytes. Raise *note EOFError: f7d. if the connection + is closed and no cooked data is available. + + -- Method: Telnet.read_all () + + Read all data until EOF as bytes; block until connection closed. + + -- Method: Telnet.read_some () + + Read at least one byte of cooked data unless EOF is hit. Return + ‘b''’ if EOF is hit. Block if no data is immediately available. + + -- Method: Telnet.read_very_eager () + + Read everything that can be without blocking in I/O (eager). + + Raise *note EOFError: f7d. if connection closed and no cooked data + available. Return ‘b''’ if no cooked data available otherwise. Do + not block unless in the midst of an IAC sequence. + + -- Method: Telnet.read_eager () + + Read readily available data. + + Raise *note EOFError: f7d. if connection closed and no cooked data + available. Return ‘b''’ if no cooked data available otherwise. Do + not block unless in the midst of an IAC sequence. + + -- Method: Telnet.read_lazy () + + Process and return data already in the queues (lazy). + + Raise *note EOFError: f7d. if connection closed and no data + available. Return ‘b''’ if no cooked data available otherwise. Do + not block unless in the midst of an IAC sequence. + + -- Method: Telnet.read_very_lazy () + + Return any data available in the cooked queue (very lazy). + + Raise *note EOFError: f7d. if connection closed and no data + available. Return ‘b''’ if no cooked data available otherwise. + This method never blocks. + + -- Method: Telnet.read_sb_data () + + Return the data collected between a SB/SE pair (suboption + begin/end). The callback should access these data when it was + invoked with a ‘SE’ command. This method never blocks. + + -- Method: Telnet.open (host, port=0[, timeout]) + + Connect to a host. The optional second argument is the port + number, which defaults to the standard Telnet port (23). 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). + + Do not try to reopen an already connected instance. + + Raises an *note auditing event: 12c0. ‘telnetlib.Telnet.open’ with + arguments ‘self’, ‘host’, ‘port’. + + -- Method: Telnet.msg (msg, *args) + + Print a debug message when the debug level is ‘>’ 0. If extra + arguments are present, they are substituted in the message using + the standard string formatting operator. + + -- Method: Telnet.set_debuglevel (debuglevel) + + Set the debug level. The higher the value of `debuglevel', the + more debug output you get (on ‘sys.stdout’). + + -- Method: Telnet.close () + + Close the connection. + + -- Method: Telnet.get_socket () + + Return the socket object used internally. + + -- Method: Telnet.fileno () + + Return the file descriptor of the socket object used internally. + + -- Method: Telnet.write (buffer) + + Write a byte string to the socket, doubling any IAC characters. + This can block if the connection is blocked. May raise *note + OSError: 413. if the connection is closed. + + Raises an *note auditing event: 12c0. ‘telnetlib.Telnet.write’ with + arguments ‘self’, ‘buffer’. + + Changed in version 3.3: This method used to raise *note + socket.error: d05, which is now an alias of *note OSError: 413. + + -- Method: Telnet.interact () + + Interaction function, emulates a very dumb Telnet client. + + -- Method: Telnet.mt_interact () + + Multithreaded version of *note interact(): 41ec. + + -- Method: Telnet.expect (list, timeout=None) + + Read until one from a list of a regular expressions matches. + + The first argument is a list of regular expressions, either + compiled (*note regex objects: c24.) or uncompiled (byte strings). + The optional second argument is a timeout, in seconds; the default + is to block indefinitely. + + Return a tuple of three items: the index in the list of the first + regular expression that matches; the match object returned; and the + bytes read up till and including the match. + + If end of file is found and no bytes were read, raise *note + EOFError: f7d. Otherwise, when nothing matches, return ‘(-1, None, + data)’ where `data' is the bytes received so far (may be empty + bytes if a timeout happened). + + If a regular expression ends with a greedy match (such as ‘.*’) or + if more than one expression can match the same input, the results + are non-deterministic, and may depend on the I/O timing. + + -- Method: Telnet.set_option_negotiation_callback (callback) + + Each time a telnet option is read on the input flow, this + `callback' (if set) is called with the following parameters: + callback(telnet socket, command (DO/DONT/WILL/WONT), option). No + other action is done afterwards by telnetlib. + + +File: python.info, Node: Telnet Example, Prev: Telnet Objects, Up: telnetlib — Telnet client + +5.35.22.2 Telnet Example +........................ + +A simple example illustrating typical use: + + import getpass + import telnetlib + + HOST = "localhost" + user = input("Enter your remote account: ") + password = getpass.getpass() + + tn = telnetlib.Telnet(HOST) + + tn.read_until(b"login: ") + tn.write(user.encode('ascii') + b"\n") + if password: + tn.read_until(b"Password: ") + tn.write(password.encode('ascii') + b"\n") + + tn.write(b"ls\n") + tn.write(b"exit\n") + + print(tn.read_all().decode('ascii')) + + +File: python.info, Node: uu — Encode and decode uuencode files, Next: xdrlib — Encode and decode XDR data, Prev: telnetlib — Telnet client, Up: Superseded Modules + +5.35.23 ‘uu’ — Encode and decode uuencode files +----------------------------------------------- + +`Source code:' Lib/uu.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note uu: 12d. module is deprecated (see PEP 594(2) for details). *note +base64: d. is a modern alternative. + +__________________________________________________________________ + +This module encodes and decodes files in uuencode format, allowing +arbitrary binary data to be transferred over ASCII-only connections. +Wherever a file argument is expected, the methods accept a file-like +object. For backwards compatibility, a string containing a pathname is +also accepted, and the corresponding file will be opened for reading and +writing; the pathname ‘'-'’ is understood to mean the standard input or +output. However, this interface is deprecated; it’s better for the +caller to open the file itself, and be sure that, when required, the +mode is ‘'rb'’ or ‘'wb'’ on Windows. + +This code was contributed by Lance Ellinghouse, and modified by Jack +Jansen. + +The *note uu: 12d. module defines the following functions: + + -- Function: uu.encode (in_file, out_file, name=None, mode=None, *, + backtick=False) + + Uuencode file `in_file' into file `out_file'. The uuencoded file + will have the header specifying `name' and `mode' as the defaults + for the results of decoding the file. The default defaults are + taken from `in_file', or ‘'-'’ and ‘0o666’ respectively. If + `backtick' is true, zeros are represented by ‘'`'’ instead of + spaces. + + Changed in version 3.7: Added the `backtick' parameter. + + -- Function: uu.decode (in_file, out_file=None, mode=None, quiet=False) + + This call decodes uuencoded file `in_file' placing the result on + file `out_file'. If `out_file' is a pathname, `mode' is used to + set the permission bits if the file must be created. Defaults for + `out_file' and `mode' are taken from the uuencode header. However, + if the file specified in the header already exists, a *note + uu.Error: 41f4. is raised. + + *note decode(): 1e78. may print a warning to standard error if the + input was produced by an incorrect uuencoder and Python could + recover from that error. Setting `quiet' to a true value silences + this warning. + + -- Exception: uu.Error + + Subclass of *note Exception: 61c, this can be raised by *note + uu.decode(): 1e78. under various situations, such as described + above, but also including a badly formatted header, or truncated + input file. + +See also +........ + +Module *note binascii: f. + + Support module containing ASCII-to-binary and binary-to-ASCII + conversions. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/uu.py + + (2) https://peps.python.org/pep-0594/#uu-and-the-uu-encoding + + +File: python.info, Node: xdrlib — Encode and decode XDR data, Prev: uu — Encode and decode uuencode files, Up: Superseded Modules + +5.35.24 ‘xdrlib’ — Encode and decode XDR data +--------------------------------------------- + +`Source code:' Lib/xdrlib.py(1) + +Deprecated since version 3.11, will be removed in version 3.13: The +*note xdrlib: 13d. module is deprecated (see PEP 594(2) for details). + +__________________________________________________________________ + +The *note xdrlib: 13d. module supports the External Data Representation +Standard as described in RFC 1014(3), written by Sun Microsystems, Inc. +June 1987. It supports most of the data types described in the RFC. + +The *note xdrlib: 13d. module defines two classes, one for packing +variables into XDR representation, and another for unpacking from XDR +representation. There are also two exception classes. + + -- Class: xdrlib.Packer + + *note Packer: 41f7. is the class for packing data into XDR + representation. The *note Packer: 41f7. class is instantiated with + no arguments. + + -- Class: xdrlib.Unpacker (data) + + ‘Unpacker’ is the complementary class which unpacks XDR data values + from a string buffer. The input buffer is given as `data'. + +See also +........ + +RFC 1014(4) - XDR: External Data Representation Standard + + This RFC defined the encoding of data which was XDR at the time + this module was originally written. It has apparently been + obsoleted by RFC 1832(5). + +RFC 1832(6) - XDR: External Data Representation Standard + + Newer RFC that provides a revised definition of XDR. + +* Menu: + +* Packer Objects:: +* Unpacker Objects:: +* Exceptions: Exceptions<18>. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Lib/xdrlib.py + + (2) https://peps.python.org/pep-0594/#xdrlib + + (3) https://datatracker.ietf.org/doc/html/rfc1014.html + + (4) https://datatracker.ietf.org/doc/html/rfc1014.html + + (5) https://datatracker.ietf.org/doc/html/rfc1832.html + + (6) https://datatracker.ietf.org/doc/html/rfc1832.html + + +File: python.info, Node: Packer Objects, Next: Unpacker Objects, Up: xdrlib — Encode and decode XDR data + +5.35.24.1 Packer Objects +........................ + +*note Packer: 41f7. instances have the following methods: + + -- Method: Packer.get_buffer () + + Returns the current pack buffer as a string. + + -- Method: Packer.reset () + + Resets the pack buffer to the empty string. + +In general, you can pack any of the most common XDR data types by +calling the appropriate ‘pack_type()’ method. Each method takes a +single argument, the value to pack. The following simple data type +packing methods are supported: ‘pack_uint()’, ‘pack_int()’, +‘pack_enum()’, ‘pack_bool()’, ‘pack_uhyper()’, and ‘pack_hyper()’. + + -- Method: Packer.pack_float (value) + + Packs the single-precision floating point number `value'. + + -- Method: Packer.pack_double (value) + + Packs the double-precision floating point number `value'. + +The following methods support packing strings, bytes, and opaque data: + + -- Method: Packer.pack_fstring (n, s) + + Packs a fixed length string, `s'. `n' is the length of the string + but it is `not' packed into the data buffer. The string is padded + with null bytes if necessary to guaranteed 4 byte alignment. + + -- Method: Packer.pack_fopaque (n, data) + + Packs a fixed length opaque data stream, similarly to *note + pack_fstring(): 41ff. + + -- Method: Packer.pack_string (s) + + Packs a variable length string, `s'. The length of the string is + first packed as an unsigned integer, then the string data is packed + with *note pack_fstring(): 41ff. + + -- Method: Packer.pack_opaque (data) + + Packs a variable length opaque data string, similarly to *note + pack_string(): 4201. + + -- Method: Packer.pack_bytes (bytes) + + Packs a variable length byte stream, similarly to *note + pack_string(): 4201. + +The following methods support packing arrays and lists: + + -- Method: Packer.pack_list (list, pack_item) + + Packs a `list' of homogeneous items. This method is useful for + lists with an indeterminate size; i.e. the size is not available + until the entire list has been walked. For each item in the list, + an unsigned integer ‘1’ is packed first, followed by the data value + from the list. `pack_item' is the function that is called to pack + the individual item. At the end of the list, an unsigned integer + ‘0’ is packed. + + For example, to pack a list of integers, the code might appear like + this: + + import xdrlib + p = xdrlib.Packer() + p.pack_list([1, 2, 3], p.pack_int) + + -- Method: Packer.pack_farray (n, array, pack_item) + + Packs a fixed length list (`array') of homogeneous items. `n' is + the length of the list; it is `not' packed into the buffer, but a + *note ValueError: 1c8. exception is raised if ‘len(array)’ is not + equal to `n'. As above, `pack_item' is the function used to pack + each element. + + -- Method: Packer.pack_array (list, pack_item) + + Packs a variable length `list' of homogeneous items. First, the + length of the list is packed as an unsigned integer, then each + element is packed as in *note pack_farray(): 4205. above. + + +File: python.info, Node: Unpacker Objects, Next: Exceptions<18>, Prev: Packer Objects, Up: xdrlib — Encode and decode XDR data + +5.35.24.2 Unpacker Objects +.......................... + +The *note Unpacker: 41f8. class offers the following methods: + + -- Method: Unpacker.reset (data) + + Resets the string buffer with the given `data'. + + -- Method: Unpacker.get_position () + + Returns the current unpack position in the data buffer. + + -- Method: Unpacker.set_position (position) + + Sets the data buffer unpack position to `position'. You should be + careful about using *note get_position(): 420a. and *note + set_position(): 420b. + + -- Method: Unpacker.get_buffer () + + Returns the current unpack data buffer as a string. + + -- Method: Unpacker.done () + + Indicates unpack completion. Raises an *note Error: 420e. + exception if all of the data has not been unpacked. + +In addition, every data type that can be packed with a *note Packer: +41f7, can be unpacked with an *note Unpacker: 41f8. Unpacking methods +are of the form ‘unpack_type()’, and take no arguments. They return the +unpacked object. + + -- Method: Unpacker.unpack_float () + + Unpacks a single-precision floating point number. + + -- Method: Unpacker.unpack_double () + + Unpacks a double-precision floating point number, similarly to + *note unpack_float(): 420f. + +In addition, the following methods unpack strings, bytes, and opaque +data: + + -- Method: Unpacker.unpack_fstring (n) + + Unpacks and returns a fixed length string. `n' is the number of + characters expected. Padding with null bytes to guaranteed 4 byte + alignment is assumed. + + -- Method: Unpacker.unpack_fopaque (n) + + Unpacks and returns a fixed length opaque data stream, similarly to + *note unpack_fstring(): 4211. + + -- Method: Unpacker.unpack_string () + + Unpacks and returns a variable length string. The length of the + string is first unpacked as an unsigned integer, then the string + data is unpacked with *note unpack_fstring(): 4211. + + -- Method: Unpacker.unpack_opaque () + + Unpacks and returns a variable length opaque data string, similarly + to *note unpack_string(): 4213. + + -- Method: Unpacker.unpack_bytes () + + Unpacks and returns a variable length byte stream, similarly to + *note unpack_string(): 4213. + +The following methods support unpacking arrays and lists: + + -- Method: Unpacker.unpack_list (unpack_item) + + Unpacks and returns a list of homogeneous items. The list is + unpacked one element at a time by first unpacking an unsigned + integer flag. If the flag is ‘1’, then the item is unpacked and + appended to the list. A flag of ‘0’ indicates the end of the list. + `unpack_item' is the function that is called to unpack the items. + + -- Method: Unpacker.unpack_farray (n, unpack_item) + + Unpacks and returns (as a list) a fixed length array of homogeneous + items. `n' is number of list elements to expect in the buffer. As + above, `unpack_item' is the function used to unpack each element. + + -- Method: Unpacker.unpack_array (unpack_item) + + Unpacks and returns a variable length `list' of homogeneous items. + First, the length of the list is unpacked as an unsigned integer, + then each element is unpacked as in *note unpack_farray(): 4217. + above. + + +File: python.info, Node: Exceptions<18>, Prev: Unpacker Objects, Up: xdrlib — Encode and decode XDR data + +5.35.24.3 Exceptions +.................... + +Exceptions in this module are coded as class instances: + + -- Exception: xdrlib.Error + + The base exception class. *note Error: 420e. has a single public + attribute ‘msg’ containing the description of the error. + + -- Exception: xdrlib.ConversionError + + Class derived from *note Error: 420e. Contains no additional + instance variables. + +Here is an example of how you would catch one of these exceptions: + + import xdrlib + p = xdrlib.Packer() + try: + p.pack_double(8.01) + except xdrlib.ConversionError as instance: + print('packing the double failed:', instance.msg) + + +File: python.info, Node: Security Considerations<4>, Prev: Superseded Modules, Up: The Python Standard Library + +5.36 Security Considerations +============================ + +The following modules have specific security considerations: + + * *note base64: d.: *note base64 security considerations: 2f89. in + RFC 4648(1) + + * *note cgi: 14.: *note CGI security considerations: 4043. + + * *note hashlib: 88.: *note all constructors take a “usedforsecurity” + keyword-only argument disabling known insecure and blocked + algorithms: 24a1. + + * *note http.server: 92. is not suitable for production use, only + implementing basic security checks. See the *note security + considerations: 339d. + + * *note logging: a8.: *note Logging configuration uses eval(): 26e0. + + * *note multiprocessing: b5.: *note Connection.recv() uses pickle: + 29b8. + + * *note pickle: c7.: *note Restricting globals in pickle: 22bd. + + * *note random: d9. shouldn’t be used for security purposes, use + *note secrets: e1. instead + + * *note shelve: e4.: *note shelve is based on pickle and thus + unsuitable for dealing with untrusted sources: 22dd. + + * *note ssl: f0.: *note SSL/TLS security considerations: 2b9e. + + * *note subprocess: f6.: *note Subprocess security considerations: + 2a5c. + + * *note tempfile: ff.: *note mktemp is deprecated due to + vulnerability to race conditions: 2277. + + * *note xml: 13e.: *note XML vulnerabilities: 2fb7. + + * *note zipfile: 14d.: *note maliciously prepared .zip files can + cause disk volume exhaustion: 23ed. + +The *note -I: 5b0. command line option can be used to run Python in +isolated mode. When it cannot be used, the *note -P: 15f. option or the +*note PYTHONSAFEPATH: 160. environment variable can be used to not +prepend a potentially unsafe path to *note sys.path: 162. such as the +current directory, the script’s directory or an empty string. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc4648.html + + +File: python.info, Node: Extending and Embedding the Python Interpreter, Next: Python/C API Reference Manual, Prev: The Python Standard Library, Up: Top + +6 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 *note The Python Tutorial: 1622. +*note The Python Language Reference: 1624. gives a more formal +definition of the language. *note The Python Standard Library: 1623. +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 +*note Python/C API Reference Manual: 1626. + +* Menu: + +* Recommended third party tools:: +* Creating extensions without third party tools:: +* Embedding the CPython runtime in a larger application:: + + +File: python.info, Node: Recommended third party tools, Next: Creating extensions without third party tools, Up: Extending and Embedding the Python Interpreter + +6.1 Recommended third party tools +================================= + +This guide only covers the basic tools for creating extensions provided +as part of this version of CPython. Third party tools like Cython(1), +cffi(2), SWIG(3) and Numba(4) offer both simpler and more sophisticated +approaches to creating C and C++ extensions for Python. + +See also +........ + +Python Packaging User Guide: Binary Extensions(5) + + 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. + + ---------- Footnotes ---------- + + (1) https://cython.org/ + + (2) https://cffi.readthedocs.io + + (3) https://www.swig.org + + (4) https://numba.pydata.org/ + + (5) https://packaging.python.org/guides/packaging-binary-extensions/ + + +File: python.info, Node: Creating extensions without third party tools, Next: Embedding the CPython runtime in a larger application, Prev: Recommended third party tools, Up: Extending and Embedding the Python Interpreter + +6.2 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. + +* 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:: + + +File: python.info, Node: Extending Python with C or C++, Next: Defining Extension Types Tutorial, Up: Creating extensions without third party tools + +6.2.1 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 ‘"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. + + 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 *note ctypes: 29. module or the cffi(1) + 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. + +* 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:: + + ---------- Footnotes ---------- + + (1) https://cffi.readthedocs.io/ + + +File: python.info, Node: A Simple Example, Next: Intermezzo Errors and Exceptions, Up: Extending Python with C or C++ + +6.2.1.1 A Simple Example +........................ + +Let’s create an extension module called ‘spam’ (the favorite food of +Monty Python fans…) and let’s say we want to create a Python interface +to the C library function ‘system()’ (1). 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: + + >>> import spam + >>> status = spam.system("ls -l") + +Begin by creating a file ‘spammodule.c’. (Historically, if a module is +called ‘spam’, the C file containing its implementation is called +‘spammodule.c’; if the module name is very long, like ‘spammify’, the +module name can be just ‘spammify.c’.) + +The first two lines of our file can be: + + #define PY_SSIZE_T_CLEAN + #include + +which pulls in the Python API (you can add a comment describing the +purpose of the module and a copyright notice if you like). + + Note: Since Python may define some pre-processor definitions which + affect the standard headers on some systems, you `must' include + ‘Python.h’ before any standard headers are included. + + It is recommended to always define ‘PY_SSIZE_T_CLEAN’ before + including ‘Python.h’. See *note Extracting Parameters in Extension + Functions: 4228. for a description of this macro. + +All user-visible symbols defined by ‘Python.h’ have a prefix of ‘Py’ or +‘PY’, except those defined in standard header files. For convenience, +and since they are used extensively by the Python interpreter, +‘"Python.h"’ includes a few standard header files: ‘’, +‘’, ‘’, and ‘’. If the latter header file +does not exist on your system, it declares the functions ‘malloc()’, +‘free()’ and ‘realloc()’ directly. + +The next thing we add to our module file is the C function that will be +called when the Python expression ‘spam.system(string)’ is evaluated +(we’ll see shortly how it ends up being called): + + 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); + } + +There is a straightforward translation from the argument list in Python +(for example, the single expression ‘"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 *note PyArg_ParseTuple(): 4d9. 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. + +*note PyArg_ParseTuple(): 4d9. 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 ‘NULL’ +immediately (as we saw in the example). + + ---------- Footnotes ---------- + + (1) An interface for this function already exists in the standard +module *note os: c2. — it was chosen as a simple and straightforward +example. + + +File: python.info, Node: Intermezzo Errors and Exceptions, Next: Back to the Example, Prev: A Simple Example, Up: Extending Python with C or C++ + +6.2.1.2 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 ‘-1’ or a ‘NULL’ pointer). Exception +information is stored in three members of the interpreter’s thread +state. These are ‘NULL’ if there is no exception. Otherwise they are +the C equivalents of the members of the Python tuple returned by *note +sys.exc_info(): 25b. 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 *note PyErr_SetString(): 422b. Its arguments are +an exception object and a C string. The exception object is usually a +predefined object like ‘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 *note PyErr_SetFromErrno(): 422c, which only +takes an exception argument and constructs the associated value by +inspection of the global variable ‘errno’. The most general function is +*note PyErr_SetObject(): 422d, which takes two object arguments, the +exception and its associated value. You don’t need to *note +Py_INCREF(): 4cc. the objects passed to any of these functions. + +You can test non-destructively whether an exception has been set with +*note PyErr_Occurred(): 12f8. This returns the current exception +object, or ‘NULL’ if no exception has occurred. You normally don’t need +to call *note PyErr_Occurred(): 12f8. 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 ‘NULL’ or +‘-1’). It should `not' call one of the ‘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 +‘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 ‘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 *note PyErr_Clear(): +cde. The only time C code should call *note PyErr_Clear(): cde. 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 ‘malloc()’ call must be turned into an exception — the +direct caller of ‘malloc()’ (or ‘realloc()’) must call *note +PyErr_NoMemory(): 422e. and return a failure indicator itself. All the +object-creating functions (for example, *note PyLong_FromLong(): 122c.) +already do this, so this note is only relevant to those who call +‘malloc()’ directly. + +Also note that, with the important exception of *note +PyArg_ParseTuple(): 4d9. and friends, functions that return an integer +status usually return a positive value or zero for success and ‘-1’ for +failure, like Unix system calls. + +Finally, be careful to clean up garbage (by making *note Py_XDECREF(): +363. or *note Py_DECREF(): 4cd. 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 ‘PyExc_ZeroDivisionError’, which you can use directly. Of +course, you should choose exceptions wisely — don’t use +‘PyExc_TypeError’ to mean that a file couldn’t be opened (that should +probably be ‘PyExc_IOError’). If something’s wrong with the argument +list, the *note PyArg_ParseTuple(): 4d9. function usually raises +‘PyExc_TypeError’. If you have an argument whose value must be in a +particular range or must satisfy other conditions, ‘PyExc_ValueError’ is +appropriate. + +You can also define a new exception that is unique to your module. For +this, you usually declare a static object variable at the beginning of +your file: + + static PyObject *SpamError; + +and initialize it in your module’s initialization function +(‘PyInit_spam()’) with an exception object: + + PyMODINIT_FUNC + PyInit_spam(void) + { + PyObject *m; + + m = PyModule_Create(&spammodule); + if (m == NULL) + return NULL; + + SpamError = PyErr_NewException("spam.error", NULL, NULL); + Py_XINCREF(SpamError); + if (PyModule_AddObject(m, "error", SpamError) < 0) { + Py_XDECREF(SpamError); + Py_CLEAR(SpamError); + Py_DECREF(m); + return NULL; + } + + return m; + } + +Note that the Python name for the exception object is ‘spam.error’. The +*note PyErr_NewException(): f24. function may create a class with the +base class being *note Exception: 61c. (unless another class is passed +in instead of ‘NULL’), described in *note Built-in Exceptions: 1281. + +Note also that the ‘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 +‘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. + +We discuss the use of ‘PyMODINIT_FUNC’ as a function return type later +in this sample. + +The ‘spam.error’ exception can be raised in your extension module using +a call to *note PyErr_SetString(): 422b. as shown below: + + 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); + } + + +File: python.info, Node: Back to the Example, Next: The Module’s Method Table and Initialization Function, Prev: Intermezzo Errors and Exceptions, Up: Extending Python with C or C++ + +6.2.1.3 Back to the Example +........................... + +Going back to our example function, you should now be able to understand +this statement: + + if (!PyArg_ParseTuple(args, "s", &command)) + return NULL; + +It returns ‘NULL’ (the error indicator for functions returning object +pointers) if an error is detected in the argument list, relying on the +exception set by *note PyArg_ParseTuple(): 4d9. Otherwise the string +value of the argument has been copied to the local variable ‘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 ‘command’ +should properly be declared as ‘const char *command’). + +The next statement is a call to the Unix function ‘system()’, passing it +the string we just got from *note PyArg_ParseTuple(): 4d9.: + + sts = system(command); + +Our ‘spam.system()’ function must return the value of ‘sts’ as a Python +object. This is done using the function *note PyLong_FromLong(): 122c. + + return PyLong_FromLong(sts); + +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 ‘None’. +You need this idiom to do so (which is implemented by the *note +Py_RETURN_NONE: 10d4. macro): + + Py_INCREF(Py_None); + return Py_None; + +*note Py_None: 4231. is the C name for the special Python object ‘None’. +It is a genuine Python object rather than a ‘NULL’ pointer, which means +“error” in most contexts, as we have seen. + + +File: python.info, Node: The Module’s Method Table and Initialization Function, Next: Compilation and Linkage, Prev: Back to the Example, Up: Extending Python with C or C++ + +6.2.1.4 The Module’s Method Table and Initialization Function +............................................................. + +I promised to show how ‘spam_system()’ is called from Python programs. +First, we need to list its name and address in a “method table”: + + static PyMethodDef SpamMethods[] = { + ... + {"system", spam_system, METH_VARARGS, + "Execute a shell command."}, + ... + {NULL, NULL, 0, NULL} /* Sentinel */ + }; + +Note the third entry (‘METH_VARARGS’). This is a flag telling the +interpreter the calling convention to be used for the C function. It +should normally always be ‘METH_VARARGS’ or ‘METH_VARARGS | +METH_KEYWORDS’; a value of ‘0’ means that an obsolete variant of *note +PyArg_ParseTuple(): 4d9. is used. + +When using only ‘METH_VARARGS’, the function should expect the +Python-level parameters to be passed in as a tuple acceptable for +parsing via *note PyArg_ParseTuple(): 4d9.; more information on this +function is provided below. + +The ‘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 ‘PyObject *’ parameter which will be a +dictionary of keywords. Use *note PyArg_ParseTupleAndKeywords(): 987. +to parse the arguments to such a function. + +The method table must be referenced in the module definition structure: + + static struct PyModuleDef spammodule = { + PyModuleDef_HEAD_INIT, + "spam", /* name of module */ + spam_doc, /* module documentation, may be NULL */ + -1, /* size of per-interpreter state of the module, + or -1 if the module keeps state in global variables. */ + SpamMethods + }; + +This structure, in turn, must be passed to the interpreter in the +module’s initialization function. The initialization function must be +named ‘PyInit_name()’, where `name' is the name of the module, and +should be the only non-‘static’ item defined in the module file: + + PyMODINIT_FUNC + PyInit_spam(void) + { + return PyModule_Create(&spammodule); + } + +Note that PyMODINIT_FUNC declares the function as ‘PyObject *’ return +type, declares any special linkage declarations required by the +platform, and for C++ declares the function as ‘extern "C"’. + +When the Python program imports module ‘spam’ for the first time, +‘PyInit_spam()’ is called. (See below for comments about embedding +Python.) It calls *note PyModule_Create(): 4234, which returns a module +object, and inserts built-in function objects into the newly created +module based upon the table (an array of *note PyMethodDef: 1119. +structures) found in the module definition. *note PyModule_Create(): +4234. returns a pointer to the module object that it creates. It may +abort with a fatal error for certain errors, or return ‘NULL’ if the +module could not be initialized satisfactorily. The init function must +return the module object to its caller, so that it then gets inserted +into ‘sys.modules’. + +When embedding Python, the ‘PyInit_spam()’ function is not called +automatically unless there’s an entry in the ‘PyImport_Inittab’ table. +To add the module to the initialization table, use *note +PyImport_AppendInittab(): 12bc, optionally followed by an import of the +module: + + int + main(int argc, char *argv[]) + { + wchar_t *program = Py_DecodeLocale(argv[0], NULL); + if (program == NULL) { + fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); + exit(1); + } + + /* 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 */ + Py_SetProgramName(program); + + /* Initialize the Python interpreter. Required. + If this step fails, it will be a fatal error. */ + Py_Initialize(); + + /* 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"); + } + + ... + + PyMem_RawFree(program); + return 0; + } + + Note: Removing entries from ‘sys.modules’ or importing compiled + modules into multiple interpreters within a process (or following a + ‘fork()’ without an intervening ‘exec()’) can create problems for + some extension modules. Extension module authors should exercise + caution when initializing internal data structures. + +A more substantial example module is included in the Python source +distribution as ‘Modules/xxmodule.c’. This file may be used as a +template or simply read as an example. + + Note: Unlike our ‘spam’ example, ‘xxmodule’ uses `multi-phase + initialization' (new in Python 3.5), where a PyModuleDef structure + is returned from ‘PyInit_spam’, and creation of the module is left + to the import machinery. For details on multi-phase + initialization, see PEP 489(1). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0489/ + + +File: python.info, Node: Compilation and Linkage, Next: Calling Python Functions from C, Prev: The Module’s Method Table and Initialization Function, Up: Extending Python with C or C++ + +6.2.1.5 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 +*note Building C and C++ Extensions: 4237.) and additional information +that pertains only to building on Windows (chapter *note Building C and +C++ Extensions on Windows: 183d.) 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 (‘spammodule.c’ for example) in the +‘Modules/’ directory of an unpacked source distribution, add a line to +the file ‘Modules/Setup.local’ describing your file: + + spam spammodule.o + +and rebuild the interpreter by running ‘make’ in the toplevel directory. +You can also run ‘make’ in the ‘Modules/’ subdirectory, but then you +must first rebuild ‘Makefile’ there by running ‘‘make’ Makefile’. (This +is necessary each time you change the ‘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: + + spam spammodule.o -lX11 + + +File: python.info, Node: Calling Python Functions from C, Next: Extracting Parameters in Extension Functions, Prev: Compilation and Linkage, Up: Extending Python with C or C++ + +6.2.1.6 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 *note -c: +1ad. command line option in ‘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 +*note Py_INCREF(): 4cc. it!) in a global variable — or wherever you see +fit. For example, the following function might be part of a module +definition: + + 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; + } + +This function must be registered with the interpreter using the *note +METH_VARARGS: 1143. flag; this is described in section *note The +Module’s Method Table and Initialization Function: 4232. The *note +PyArg_ParseTuple(): 4d9. function and its arguments are documented in +section *note Extracting Parameters in Extension Functions: 4228. + +The macros *note Py_XINCREF(): 6b6. and *note Py_XDECREF(): 363. +increment/decrement the reference count of an object and are safe in the +presence of ‘NULL’ pointers (but note that `temp' will not be ‘NULL’ in +this context). More info on them in section *note Reference Counts: +423a. + +Later, when it is time to call the function, you call the C function +*note PyObject_CallObject(): 423b. 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 ‘NULL’, or an empty tuple; to call it with one +argument, pass a singleton tuple. *note Py_BuildValue(): 4da. returns a +tuple when its format string consists of zero or more format codes +between parentheses. For 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); + +*note PyObject_CallObject(): 423b. returns a Python object pointer: this +is the return value of the Python function. *note +PyObject_CallObject(): 423b. 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 *note Py_DECREF(): 4cd.-ed immediately after +the *note PyObject_CallObject(): 423b. call. + +The return value of *note PyObject_CallObject(): 423b. 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 *note Py_DECREF(): 4cd. 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 ‘NULL’. If it is, the Python function terminated by raising +an exception. If the C code that called *note PyObject_CallObject(): +423b. 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 *note +PyErr_Clear(): cde. For example: + + if (result == NULL) + return NULL; /* Pass error back */ + ...use result... + Py_DECREF(result); + +Depending on the desired interface to the Python callback function, you +may also have to provide an argument list to *note +PyObject_CallObject(): 423b. 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 *note Py_BuildValue(): 4da. For example, if you want +to pass an integral event code, you might use the following code: + + 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); + +Note the placement of ‘Py_DECREF(arglist)’ immediately after the call, +before the error check! Also note that strictly speaking this code is +not complete: *note Py_BuildValue(): 4da. may run out of memory, and +this should be checked. + +You may also call a function with keyword arguments by using *note +PyObject_Call(): 5b9, which supports arguments and keyword arguments. +As in the above example, we use *note Py_BuildValue(): 4da. to construct +the dictionary. + + 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); + + +File: python.info, Node: Extracting Parameters in Extension Functions, Next: Keyword Parameters for Extension Functions, Prev: Calling Python Functions from C, Up: Extending Python with C or C++ + +6.2.1.7 Extracting Parameters in Extension Functions +.................................................... + +The *note PyArg_ParseTuple(): 4d9. function is declared as follows: + + int PyArg_ParseTuple(PyObject *arg, const char *format, ...); + +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 *note Parsing arguments and +building values: 4db. 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 *note PyArg_ParseTuple(): 4d9. 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: + + #define PY_SSIZE_T_CLEAN /* Make "s#" use Py_ssize_t rather than int. */ + #include + + int ok; + int i, j; + long k, l; + const char *s; + Py_ssize_t size; + + ok = PyArg_ParseTuple(args, ""); /* No arguments */ + /* Python call: f() */ + + ok = PyArg_ParseTuple(args, "s", &s); /* A string */ + /* Possible Python call: f('whoops!') */ + + ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); /* Two longs and a string */ + /* Possible Python call: f(1, 2, 'three') */ + + 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') */ + + { + 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) */ + } + + { + 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)) */ + } + + { + 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) */ + } + + +File: python.info, Node: Keyword Parameters for Extension Functions, Next: Building Arbitrary Values, Prev: Extracting Parameters in Extension Functions, Up: Extending Python with C or C++ + +6.2.1.8 Keyword Parameters for Extension Functions +.................................................. + +The *note PyArg_ParseTupleAndKeywords(): 987. function is declared as +follows: + + int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, + const char *format, char *kwlist[], ...); + +The `arg' and `format' parameters are identical to those of the *note +PyArg_ParseTuple(): 4d9. function. The `kwdict' parameter is the +dictionary of keywords received as the third parameter from the Python +runtime. The `kwlist' parameter is a ‘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, *note +PyArg_ParseTupleAndKeywords(): 987. returns true, otherwise it returns +false and raises an appropriate exception. + + Note: Nested tuples cannot be parsed when using keyword arguments! + Keyword parameters passed in which are not present in the `kwlist' + will cause *note TypeError: 19c. to be raised. + +Here is an example module which uses keywords, based on an example by +Geoff Philbrick (): + + #define PY_SSIZE_T_CLEAN /* Make "s#" use Py_ssize_t rather than int. */ + #include + + 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 keywdargmodule = { + PyModuleDef_HEAD_INIT, + "keywdarg", + NULL, + -1, + keywdarg_methods + }; + + PyMODINIT_FUNC + PyInit_keywdarg(void) + { + return PyModule_Create(&keywdargmodule); + } + + +File: python.info, Node: Building Arbitrary Values, Next: Reference Counts, Prev: Keyword Parameters for Extension Functions, Up: Extending Python with C or C++ + +6.2.1.9 Building Arbitrary Values +................................. + +This function is the counterpart to *note PyArg_ParseTuple(): 4d9. It +is declared as follows: + + PyObject *Py_BuildValue(const char *format, ...); + +It recognizes a set of format units similar to the ones recognized by +*note PyArg_ParseTuple(): 4d9, 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 *note PyArg_ParseTuple(): 4d9.: while the latter +requires its first argument to be a tuple (since Python argument lists +are always represented as tuples internally), *note Py_BuildValue(): +4da. 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 ‘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): + + 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)) + + +File: python.info, Node: Reference Counts, Next: Writing Extensions in C++, Prev: Building Arbitrary Values, Up: Extending Python with C or C++ + +6.2.1.10 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 ‘malloc()’ and ‘free()’. In C++, the operators +‘new’ and ‘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 ‘malloc()’ should eventually be +returned to the pool of available memory by exactly one call to +‘free()’. It is important to call ‘free()’ at the right time. If a +block’s address is forgotten but ‘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 +‘free()’ for a block and then continues to use the block, it creates a +conflict with re-use of the block through another ‘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 ‘malloc()’ and ‘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 ‘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 ‘malloc()’ and ‘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 *note gc: 80. module exposes a way to run the detector (the +*note collect(): 687. 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:: + + +File: python.info, Node: Reference Counting in Python, Next: Ownership Rules, Up: Reference Counts + +6.2.1.11 Reference Counting in Python +..................................... + +There are two macros, ‘Py_INCREF(x)’ and ‘Py_DECREF(x)’, which handle +the incrementing and decrementing of the reference count. *note +Py_DECREF(): 4cd. also frees the object when the count reaches zero. +For flexibility, it doesn’t call ‘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 ‘Py_INCREF(x)’ and +‘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 *note Py_DECREF(): +4cd. 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 *note Py_DECREF(): 4cd. +Forgetting to dispose of an owned reference creates a memory leak. + +It is also possible to `borrow' (1) a reference to an object. The +borrower of a reference should not call *note Py_DECREF(): 4cd. 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 +(2). + +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 +*note Py_INCREF(): 4cc. 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). + + ---------- Footnotes ---------- + + (1) The metaphor of “borrowing” a reference is not completely +correct: the owner still has a copy of the reference. + + (2) 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! + + +File: python.info, Node: Ownership Rules, Next: Thin Ice, Prev: Reference Counting in Python, Up: Reference Counts + +6.2.1.12 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 *note PyLong_FromLong(): 122c. and *note +Py_BuildValue(): 4da, 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, *note PyLong_FromLong(): 122c. +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 *note +PyObject_GetAttrString(): 4246. The picture is less clear, here, +however, since a few common routines are exceptions: *note +PyTuple_GetItem(): 4247, *note PyList_GetItem(): 4248, *note +PyDict_GetItem(): 4de, and *note PyDict_GetItemString(): 4249. all +return references that you borrow from the tuple, list or dictionary. + +The function *note PyImport_AddModule(): 424a. 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 +‘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 *note Py_INCREF(): 4cc. to become an independent owner. There +are exactly two important exceptions to this rule: *note +PyTuple_SetItem(): 424b. and *note PyList_SetItem(): 424c. These +functions take over ownership of the item passed to them — even if they +fail! (Note that *note PyDict_SetItem(): 424d. 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 *note +Py_INCREF(): 4cc. + +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. + + +File: python.info, Node: Thin Ice, Next: NULL Pointers, Prev: Ownership Rules, Up: Reference Counts + +6.2.1.13 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 *note +Py_DECREF(): 4cd. on an unrelated object while borrowing a reference to +a list item. For instance: + + void + bug(PyObject *list) + { + PyObject *item = PyList_GetItem(list, 0); + + PyList_SetItem(list, 1, PyLong_FromLong(0L)); + PyObject_Print(item, stdout, 0); /* BUG! */ + } + +This function first borrows a reference to ‘list[0]’, then replaces +‘list[1]’ with the value ‘0’, and finally prints the borrowed reference. +Looks harmless, right? But it’s not! + +Let’s follow the control flow into *note PyList_SetItem(): 424c. 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 ‘__del__()’ method. If this class +instance has a reference count of 1, disposing of it will call its +‘__del__()’ method. + +Since it is written in Python, the ‘__del__()’ method can execute +arbitrary Python code. Could it perhaps do something to invalidate the +reference to ‘item’ in ‘bug()’? You bet! Assuming that the list passed +into ‘bug()’ is accessible to the ‘__del__()’ method, it could execute a +statement to the effect of ‘del list[0]’, and assuming this was the last +reference to that object, it would free the memory associated with it, +thereby invalidating ‘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: + + 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); + } + +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 ‘__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 global lock protecting +Python’s entire object space. However, it is possible to temporarily +release this lock using the macro *note Py_BEGIN_ALLOW_THREADS: 4250, +and to re-acquire it using *note Py_END_ALLOW_THREADS: 6e4. 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: + + 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! */ + } + + +File: python.info, Node: NULL Pointers, Prev: Thin Ice, Up: Reference Counts + +6.2.1.14 NULL Pointers +...................... + +In general, functions that take object references as arguments do not +expect you to pass them ‘NULL’ pointers, and will dump core (or cause +later core dumps) if you do so. Functions that return object references +generally return ‘NULL’ only to indicate that an exception occurred. +The reason for not testing for ‘NULL’ arguments is that functions often +pass the objects they receive on to other function — if each function +were to test for ‘NULL’, there would be a lot of redundant tests and the +code would run more slowly. + +It is better to test for ‘NULL’ only at the “source:” when a pointer +that may be ‘NULL’ is received, for example, from ‘malloc()’ or from a +function that may raise an exception. + +The macros *note Py_INCREF(): 4cc. and *note Py_DECREF(): 4cd. do not +check for ‘NULL’ pointers — however, their variants *note Py_XINCREF(): +6b6. and *note Py_XDECREF(): 363. do. + +The macros for checking for a particular object type (‘Pytype_Check()’) +don’t check for ‘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 ‘NULL’ checking. + +The C function calling mechanism guarantees that the argument list +passed to C functions (‘args’ in the examples) is never ‘NULL’ — in fact +it guarantees that it is always a tuple (1). + +It is a severe error to ever let a ‘NULL’ pointer “escape” to the Python +user. + + ---------- Footnotes ---------- + + (1) These guarantees don’t hold when you use the “old” style calling +convention — this is still found in much existing code. + + +File: python.info, Node: Writing Extensions in C++, Next: Providing a C API for an Extension Module, Prev: Reference Counts, Up: Extending Python with C or C++ + +6.2.1.15 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 ‘extern "C"’. It is unnecessary to enclose the Python +header files in ‘extern "C" {...}’ — they use this form already if the +symbol ‘__cplusplus’ is defined (all recent C++ compilers define this +symbol). + + +File: python.info, Node: Providing a C API for an Extension Module, Prev: Writing Extensions in C++, Up: Extending Python with C or C++ + +6.2.1.16 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 ‘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 ‘static’, except for the module’s initialization function, in +order to avoid name clashes with other extension modules (as discussed +in section *note The Module’s Method Table and Initialization Function: +4232.). 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 *note PyCapsule_New(): 4256. takes a name +parameter (const char*); you’re permitted to pass in a ‘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: + + modulename.attributename + +The convenience function *note PyCapsule_Import(): 1266. 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 ‘spam’ module from section +*note A Simple Example: 4227. The function ‘spam.system()’ does not +call the C library function ‘system()’ directly, but a function +‘PySpam_System()’, which would of course do something more complicated +in reality (such as adding “spam” to every command). This function +‘PySpam_System()’ is also exported to other extension modules. + +The function ‘PySpam_System()’ is a plain C function, declared ‘static’ +like everything else: + + static int + PySpam_System(const char *command) + { + return system(command); + } + +The function ‘spam_system()’ is modified in a trivial way: + + 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); + } + +In the beginning of the module, right after the line + + #include + +two more lines must be added: + + #define SPAM_MODULE + #include "spammodule.h" + +The ‘#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 +initialization function must take care of initializing the C API pointer +array: + + PyMODINIT_FUNC + PyInit_spam(void) + { + PyObject *m; + static void *PySpam_API[PySpam_API_pointers]; + PyObject *c_api_object; + + m = PyModule_Create(&spammodule); + if (m == NULL) + return NULL; + + /* 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_AddObject(m, "_C_API", c_api_object) < 0) { + Py_XDECREF(c_api_object); + Py_DECREF(m); + return NULL; + } + + return m; + } + +Note that ‘PySpam_API’ is declared ‘static’; otherwise the pointer array +would disappear when ‘PyInit_spam()’ terminates! + +The bulk of the work is in the header file ‘spammodule.h’, which looks +like this: + + #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) */ + +All that a client module must do in order to have access to the function +‘PySpam_System()’ is to call the function (or rather macro) +‘import_spam()’ in its initialization function: + + PyMODINIT_FUNC + PyInit_client(void) + { + PyObject *m; + + m = PyModule_Create(&clientmodule); + if (m == NULL) + return NULL; + if (import_spam() < 0) + return NULL; + /* additional initialization can happen here */ + return m; + } + +The main disadvantage of this approach is that the file ‘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 *note +Capsules: 4257. and in the implementation of Capsules (files +‘Include/pycapsule.h’ and ‘Objects/pycapsule.c’ in the Python source +code distribution). + + +File: python.info, Node: Defining Extension Types Tutorial, Next: Defining Extension Types Assorted Topics, Prev: Extending Python with C or C++, Up: Creating extensions without third party tools + +6.2.2 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 *note +str: 1b3. and *note list: 1e9. 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:: + + +File: python.info, Node: The Basics, Next: Adding data and methods to the Basic example, Up: Defining Extension Types Tutorial + +6.2.2.1 The Basics +.................. + +The *note CPython: 2b4. runtime sees all Python objects as variables of +type *note PyObject: 4cf.*, which serves as a “base type” for all Python +objects. The *note PyObject: 4cf. structure itself only contains the +object’s *note reference count: 425c. 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 ‘Custom’ +inside a C extension module ‘custom’: + + 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 *note PyType_FromSpec(): 5b8. function, which isn’t covered in + this tutorial. + + #define PY_SSIZE_T_CLEAN + #include + + typedef struct { + PyObject_HEAD + /* Type-specific fields go here. */ + } CustomObject; + + static PyTypeObject CustomType = { + 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 PyModuleDef custommodule = { + PyModuleDef_HEAD_INIT, + .m_name = "custom", + .m_doc = "Example module that creates an extension type.", + .m_size = -1, + }; + + PyMODINIT_FUNC + PyInit_custom(void) + { + PyObject *m; + if (PyType_Ready(&CustomType) < 0) + return NULL; + + m = PyModule_Create(&custommodule); + if (m == NULL) + return NULL; + + Py_INCREF(&CustomType); + if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { + Py_DECREF(&CustomType); + Py_DECREF(m); + return NULL; + } + + return m; + } + +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: + + 1. What a ‘Custom’ `object' contains: this is the ‘CustomObject’ + struct, which is allocated once for each ‘Custom’ instance. + + 2. How the ‘Custom’ `type' behaves: this is the ‘CustomType’ struct, + which defines a set of flags and function pointers that the + interpreter inspects when specific operations are requested. + + 3. How to initialize the ‘custom’ module: this is the ‘PyInit_custom’ + function and the associated ‘custommodule’ struct. + +The first bit is: + + typedef struct { + PyObject_HEAD + } CustomObject; + +This is what a Custom object will contain. ‘PyObject_HEAD’ is mandatory +at the start of each object struct and defines a field called ‘ob_base’ +of type *note PyObject: 4cf, containing a pointer to a type object and a +reference count (these can be accessed using the macros *note Py_TYPE: +355. and *note Py_REFCNT: 4dc. respectively). The reason for the macro +is to abstract away the layout and to enable additional fields in *note +debug builds: 496. + + Note: There is no semicolon above after the *note PyObject_HEAD: + f83. macro. Be wary of adding one by accident: some compilers will + complain. + +Of course, objects generally store additional data besides the standard +‘PyObject_HEAD’ boilerplate; for example, here is the definition for +standard Python floats: + + typedef struct { + PyObject_HEAD + double ob_fval; + } PyFloatObject; + +The second bit is the definition of the type object. + + static PyTypeObject CustomType = { + 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, + }; + + Note: We recommend using C99-style designated initializers as + above, to avoid listing all the *note PyTypeObject: 701. fields + that you don’t care about and also to avoid caring about the + fields’ declaration order. + +The actual definition of *note PyTypeObject: 701. in ‘object.h’ has many +more *note fields: 5e3. 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: + + PyVarObject_HEAD_INIT(NULL, 0) + +This line is mandatory boilerplate to initialize the ‘ob_base’ field +mentioned above. + + .tp_name = "custom.Custom", + +The name of our type. This will appear in the default textual +representation of our objects and in some error messages, for example: + + >>> "" + custom.Custom() + Traceback (most recent call last): + File "", line 1, in + TypeError: can only concatenate str (not "custom.Custom") to str + +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 +‘custom’ and the type is ‘Custom’, so we set the type name to +‘custom.Custom’. Using the real dotted import path is important to make +your type compatible with the *note pydoc: d6. and *note pickle: c7. +modules. + + .tp_basicsize = sizeof(CustomObject), + .tp_itemsize = 0, + +This is so that Python knows how much memory to allocate when creating +new ‘Custom’ instances. *note tp_itemsize: 425d. is only used for +variable-sized objects and should otherwise be zero. + + Note: If you want your type to be subclassable from Python, and + your type has the same *note tp_basicsize: 5dd. 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 *note + __bases__: 1103, or else it will not be able to call your type’s + ‘__new__()’ method without getting an error. You can avoid this + problem by ensuring that your type has a larger value for *note + tp_basicsize: 5dd. than its base type does. Most of the time, this + will be true anyway, because either your base type will be *note + object: 6df, or else you will be adding data members to your base + type, and therefore increasing its size. + +We set the class flags to *note Py_TPFLAGS_DEFAULT: 425e. + + .tp_flags = Py_TPFLAGS_DEFAULT, + +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 *note tp_doc: 425f. + + .tp_doc = PyDoc_STR("Custom objects"), + +To enable object creation, we have to provide a *note tp_new: 4260. +handler. This is the equivalent of the Python method ‘__new__()’, but +has to be specified explicitly. In this case, we can just use the +default implementation provided by the API function *note +PyType_GenericNew(): 4261. + + .tp_new = PyType_GenericNew, + +Everything else in the file should be familiar, except for some code in +‘PyInit_custom()’: + + if (PyType_Ready(&CustomType) < 0) + return; + +This initializes the ‘Custom’ type, filling in a number of members to +the appropriate default values, including ‘ob_type’ that we initially +set to ‘NULL’. + + Py_INCREF(&CustomType); + if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { + Py_DECREF(&CustomType); + Py_DECREF(m); + return NULL; + } + +This adds the type to the module dictionary. This allows us to create +‘Custom’ instances by calling the ‘Custom’ class: + + >>> import custom + >>> mycustom = custom.Custom() + +That’s it! All that remains is to build it; put the above code in a +file called ‘custom.c’ and: + + from distutils.core import setup, Extension + setup(name="custom", version="1.0", + ext_modules=[Extension("custom", ["custom.c"])]) + +in a file called ‘setup.py’; then typing + + $ python setup.py build + +at a shell should produce a file ‘custom.so’ in a subdirectory; move to +that directory and fire up Python — you should be able to ‘import +custom’ and play around with 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. + + Note: While this documentation showcases the standard *note + distutils: 37. module for building C extensions, it is recommended + in real-world use cases to use the newer and better-maintained + ‘setuptools’ library. Documentation on how to do this is out of + scope for this document and can be found in the Python Packaging + User’s Guide(1). + + ---------- Footnotes ---------- + + (1) https://packaging.python.org/tutorials/distributing-packages/ + + +File: python.info, Node: Adding data and methods to the Basic example, Next: Providing finer control over data attributes, Prev: The Basics, Up: Defining Extension Types Tutorial + +6.2.2.2 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, +‘custom2’ that adds these capabilities: + + #define PY_SSIZE_T_CLEAN + #include + #include "structmember.h" + + typedef struct { + PyObject_HEAD + PyObject *first; /* first name */ + PyObject *last; /* last name */ + int number; + } CustomObject; + + static void + Custom_dealloc(CustomObject *self) + { + Py_XDECREF(self->first); + Py_XDECREF(self->last); + Py_TYPE(self)->tp_free((PyObject *) 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 = 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; + } + + static int + Custom_init(CustomObject *self, PyObject *args, PyObject *kwds) + { + 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; + } + + static PyMemberDef Custom_members[] = { + {"first", T_OBJECT_EX, offsetof(CustomObject, first), 0, + "first name"}, + {"last", T_OBJECT_EX, offsetof(CustomObject, last), 0, + "last name"}, + {"number", T_INT, offsetof(CustomObject, number), 0, + "custom number"}, + {NULL} /* Sentinel */ + }; + + static PyObject * + Custom_name(CustomObject *self, PyObject *Py_UNUSED(ignored)) + { + 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", (PyCFunction) Custom_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ + }; + + static PyTypeObject CustomType = { + 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 = (initproc) Custom_init, + .tp_dealloc = (destructor) Custom_dealloc, + .tp_members = Custom_members, + .tp_methods = Custom_methods, + }; + + static PyModuleDef custommodule = { + PyModuleDef_HEAD_INIT, + .m_name = "custom2", + .m_doc = "Example module that creates an extension type.", + .m_size = -1, + }; + + PyMODINIT_FUNC + PyInit_custom2(void) + { + PyObject *m; + if (PyType_Ready(&CustomType) < 0) + return NULL; + + m = PyModule_Create(&custommodule); + if (m == NULL) + return NULL; + + Py_INCREF(&CustomType); + if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { + Py_DECREF(&CustomType); + Py_DECREF(m); + return NULL; + } + + return m; + } + +This version of the module has a number of changes. + +We’ve added an extra include: + + #include + +This include provides declarations that we use to handle attributes, as +described a bit later. + +The ‘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: + + typedef struct { + PyObject_HEAD + PyObject *first; /* first name */ + PyObject *last; /* last name */ + int number; + } CustomObject; + +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: + + static void + Custom_dealloc(CustomObject *self) + { + Py_XDECREF(self->first); + Py_XDECREF(self->last); + Py_TYPE(self)->tp_free((PyObject *) self); + } + +which is assigned to the *note tp_dealloc: 4263. member: + + .tp_dealloc = (destructor) Custom_dealloc, + +This method first clears the reference counts of the two Python +attributes. *note Py_XDECREF(): 363. correctly handles the case where +its argument is ‘NULL’ (which might happen here if ‘tp_new’ failed +midway). It then calls the *note tp_free: 4264. member of the object’s +type (computed by ‘Py_TYPE(self)’) to free the object’s memory. Note +that the object’s type might not be ‘CustomType’, because the object may +be an instance of a subclass. + + Note: The explicit cast to ‘destructor’ above is needed because we + defined ‘Custom_dealloc’ to take a ‘CustomObject *’ argument, but + the ‘tp_dealloc’ function pointer expects to receive a ‘PyObject *’ + argument. Otherwise, the compiler will emit a warning. This is + object-oriented polymorphism, in C! + +We want to make sure that the first and last names are initialized to +empty strings, so we provide a ‘tp_new’ implementation: + + 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; + } + +and install it in the *note tp_new: 4260. member: + + .tp_new = Custom_new, + +The ‘tp_new’ handler is responsible for creating (as opposed to +initializing) objects of the type. It is exposed in Python as the +‘__new__()’ method. It is not required to define a ‘tp_new’ member, and +indeed many extension types will simply reuse *note PyType_GenericNew(): +4261. as done in the first version of the ‘Custom’ type above. In this +case, we use the ‘tp_new’ handler to initialize the ‘first’ and ‘last’ +attributes to non-‘NULL’ default values. + +‘tp_new’ is passed the type being instantiated (not necessarily +‘CustomType’, if a subclass is instantiated) and any arguments passed +when the type was called, and is expected to return the instance +created. ‘tp_new’ handlers always accept positional and keyword +arguments, but they often ignore the arguments, leaving the argument +handling to initializer (a.k.a. ‘tp_init’ in C or ‘__init__’ in Python) +methods. + + Note: ‘tp_new’ shouldn’t call ‘tp_init’ explicitly, as the + interpreter will do it itself. + +The ‘tp_new’ implementation calls the *note tp_alloc: 4265. slot to +allocate memory: + + self = (CustomObject *) type->tp_alloc(type, 0); + +Since memory allocation may fail, we must check the *note tp_alloc: +4265. result against ‘NULL’ before proceeding. + + Note: We didn’t fill the *note tp_alloc: 4265. slot ourselves. + Rather *note PyType_Ready(): 350. fills it for us by inheriting it + from our base class, which is *note object: 6df. by default. Most + types use the default allocation strategy. + + Note: If you are creating a co-operative *note tp_new: 4260. (one + that calls a base type’s *note tp_new: 4260. or ‘__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 *note tp_new: 4260. directly, + or via ‘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 *note + TypeError: 19c.) + +We also define an initialization function which accepts arguments to +provide initial values for our instance: + + static int + Custom_init(CustomObject *self, PyObject *args, PyObject *kwds) + { + 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; + } + +by filling the *note tp_init: 4266. slot. + + .tp_init = (initproc) Custom_init, + +The *note tp_init: 4266. slot is exposed in Python as the ‘__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 ‘0’ on success or ‘-1’ on error. + +Unlike the ‘tp_new’ handler, there is no guarantee that ‘tp_init’ is +called at all (for example, the *note pickle: c7. module by default +doesn’t call ‘__init__()’ on unpickled instances). It can also be +called multiple times. Anyone can call the ‘__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 ‘first’ member like this: + + if (first) { + Py_XDECREF(self->first); + Py_INCREF(first); + self->first = first; + } + +But this would be risky. Our type doesn’t restrict the type of the +‘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 +‘first’ member; or that destructor could release the *note Global +interpreter Lock: 4df. 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? + + * when we absolutely know that the reference count is greater than 1; + + * when we know that deallocation of the object (1) will neither + release the *note GIL: 4df. nor cause any calls back into our + type’s code; + + * when decrementing a reference count in a *note tp_dealloc: 4263. + handler on a type which doesn’t support cyclic garbage collection + (2). + +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: + + static PyMemberDef Custom_members[] = { + {"first", T_OBJECT_EX, offsetof(CustomObject, first), 0, + "first name"}, + {"last", T_OBJECT_EX, offsetof(CustomObject, last), 0, + "last name"}, + {"number", T_INT, offsetof(CustomObject, number), 0, + "custom number"}, + {NULL} /* Sentinel */ + }; + +and put the definitions in the *note tp_members: 4267. slot: + + .tp_members = Custom_members, + +Each member definition has a member name, type, offset, access flags and +documentation string. See the *note Generic Attribute Management: 4268. +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 ‘NULL’. Even though we can make sure the +members are initialized to non-‘NULL’ values, the members can be set to +‘NULL’ if the attributes are deleted. + +We define a single method, ‘Custom.name()’, that outputs the objects +name as the concatenation of the first and last names. + + static PyObject * + Custom_name(CustomObject *self, PyObject *Py_UNUSED(ignored)) + { + 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); + } + +The method is implemented as a C function that takes a ‘Custom’ (or +‘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: + + def name(self): + return "%s %s" % (self.first, self.last) + +Note that we have to check for the possibility that our ‘first’ and +‘last’ members are ‘NULL’. This is because they can be deleted, in +which case they are set to ‘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: + + static PyMethodDef Custom_methods[] = { + {"name", (PyCFunction) Custom_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ + }; + +(note that we used the *note METH_NOARGS: 1116. flag to indicate that +the method is expecting no arguments other than `self') + +and assign it to the *note tp_methods: 4269. slot: + + .tp_methods = Custom_methods, + +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 *note Py_TPFLAGS_BASETYPE: 426a. to our +class flag definition: + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + +We rename ‘PyInit_custom()’ to ‘PyInit_custom2()’, update the module +name in the *note PyModuleDef: 5d2. struct, and update the full class +name in the *note PyTypeObject: 701. struct. + +Finally, we update our ‘setup.py’ file to build the new module: + + from distutils.core import setup, Extension + setup(name="custom", version="1.0", + ext_modules=[ + Extension("custom", ["custom.c"]), + Extension("custom2", ["custom2.c"]), + ]) + + ---------- Footnotes ---------- + + (1) This is true when we know that the object is a basic type, like a +string or a float. + + (2) We relied on this in the *note tp_dealloc: 4263. handler in this +example, because our type doesn’t support garbage collection. + + +File: python.info, Node: Providing finer control over data attributes, Next: Supporting cyclic garbage collection, Prev: Adding data and methods to the Basic example, Up: Defining Extension Types Tutorial + +6.2.2.3 Providing finer control over data attributes +.................................................... + +In this section, we’ll provide finer control over how the ‘first’ and +‘last’ attributes are set in the ‘Custom’ example. In the previous +version of our module, the instance variables ‘first’ and ‘last’ could +be set to non-string values or even deleted. We want to make sure that +these attributes always contain strings. + + #define PY_SSIZE_T_CLEAN + #include + #include "structmember.h" + + typedef struct { + PyObject_HEAD + PyObject *first; /* first name */ + PyObject *last; /* last name */ + int number; + } CustomObject; + + static void + Custom_dealloc(CustomObject *self) + { + Py_XDECREF(self->first); + Py_XDECREF(self->last); + Py_TYPE(self)->tp_free((PyObject *) 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 = 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; + } + + static int + Custom_init(CustomObject *self, PyObject *args, PyObject *kwds) + { + 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; + } + + static PyMemberDef Custom_members[] = { + {"number", T_INT, offsetof(CustomObject, number), 0, + "custom number"}, + {NULL} /* Sentinel */ + }; + + static PyObject * + Custom_getfirst(CustomObject *self, void *closure) + { + Py_INCREF(self->first); + return self->first; + } + + static int + Custom_setfirst(CustomObject *self, PyObject *value, void *closure) + { + 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; + } + + static PyObject * + Custom_getlast(CustomObject *self, void *closure) + { + Py_INCREF(self->last); + return self->last; + } + + static int + Custom_setlast(CustomObject *self, PyObject *value, void *closure) + { + PyObject *tmp; + 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; + } + tmp = self->last; + Py_INCREF(value); + self->last = value; + Py_DECREF(tmp); + return 0; + } + + static PyGetSetDef Custom_getsetters[] = { + {"first", (getter) Custom_getfirst, (setter) Custom_setfirst, + "first name", NULL}, + {"last", (getter) Custom_getlast, (setter) Custom_setlast, + "last name", NULL}, + {NULL} /* Sentinel */ + }; + + static PyObject * + Custom_name(CustomObject *self, PyObject *Py_UNUSED(ignored)) + { + return PyUnicode_FromFormat("%S %S", self->first, self->last); + } + + static PyMethodDef Custom_methods[] = { + {"name", (PyCFunction) Custom_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ + }; + + static PyTypeObject CustomType = { + 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 = (initproc) Custom_init, + .tp_dealloc = (destructor) Custom_dealloc, + .tp_members = Custom_members, + .tp_methods = Custom_methods, + .tp_getset = Custom_getsetters, + }; + + static PyModuleDef custommodule = { + PyModuleDef_HEAD_INIT, + .m_name = "custom3", + .m_doc = "Example module that creates an extension type.", + .m_size = -1, + }; + + PyMODINIT_FUNC + PyInit_custom3(void) + { + PyObject *m; + if (PyType_Ready(&CustomType) < 0) + return NULL; + + m = PyModule_Create(&custommodule); + if (m == NULL) + return NULL; + + Py_INCREF(&CustomType); + if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { + Py_DECREF(&CustomType); + Py_DECREF(m); + return NULL; + } + + return m; + } + +To provide greater control, over the ‘first’ and ‘last’ attributes, +we’ll use custom getter and setter functions. Here are the functions +for getting and setting the ‘first’ attribute: + + static PyObject * + Custom_getfirst(CustomObject *self, void *closure) + { + Py_INCREF(self->first); + return self->first; + } + + static int + Custom_setfirst(CustomObject *self, PyObject *value, void *closure) + { + 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; + } + +The getter function is passed a ‘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 ‘Custom’ object, the new value, and +the closure. The new value may be ‘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 *note PyGetSetDef: 81b. structures: + + static PyGetSetDef Custom_getsetters[] = { + {"first", (getter) Custom_getfirst, (setter) Custom_setfirst, + "first name", NULL}, + {"last", (getter) Custom_getlast, (setter) Custom_setlast, + "last name", NULL}, + {NULL} /* Sentinel */ + }; + +and register it in the *note tp_getset: 426c. slot: + + .tp_getset = Custom_getsetters, + +The last item in a *note PyGetSetDef: 81b. structure is the “closure” +mentioned above. In this case, we aren’t using a closure, so we just +pass ‘NULL’. + +We also remove the member definitions for these attributes: + + static PyMemberDef Custom_members[] = { + {"number", T_INT, offsetof(CustomObject, number), 0, + "custom number"}, + {NULL} /* Sentinel */ + }; + +We also need to update the *note tp_init: 4266. handler to only allow +strings (1) to be passed: + + static int + Custom_init(CustomObject *self, PyObject *args, PyObject *kwds) + { + 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; + } + +With these changes, we can assure that the ‘first’ and ‘last’ members +are never ‘NULL’ so we can remove checks for ‘NULL’ values in almost all +cases. This means that most of the *note Py_XDECREF(): 363. calls can +be converted to *note Py_DECREF(): 4cd. calls. The only place we can’t +change these calls is in the ‘tp_dealloc’ implementation, where there is +the possibility that the initialization of these members failed in +‘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 ‘setup.py’ file. + + ---------- Footnotes ---------- + + (1) 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. + + +File: python.info, Node: Supporting cyclic garbage collection, Next: Subclassing other types, Prev: Providing finer control over data attributes, Up: Defining Extension Types Tutorial + +6.2.2.4 Supporting cyclic garbage collection +............................................ + +Python has a *note cyclic garbage collector (GC): 131f. 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: + + >>> l = [] + >>> l.append(l) + >>> del l + +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 ‘Custom’ example, we allowed any kind of +object to be stored in the ‘first’ or ‘last’ attributes (1). Besides, +in the second and third versions, we allowed subclassing ‘Custom’, and +subclasses may add arbitrary attributes. For any of those two reasons, +‘Custom’ objects can participate in cycles: + + >>> import custom3 + >>> class Derived(custom3.Custom): pass + ... + >>> n = Derived() + >>> n.some_attribute = n + +To allow a ‘Custom’ instance participating in a reference cycle to be +properly detected and collected by the cyclic GC, our ‘Custom’ type +needs to fill two additional slots and to enable a flag that enables +these slots: + + #define PY_SSIZE_T_CLEAN + #include + #include "structmember.h" + + typedef struct { + PyObject_HEAD + PyObject *first; /* first name */ + PyObject *last; /* last name */ + int number; + } CustomObject; + + static int + Custom_traverse(CustomObject *self, visitproc visit, void *arg) + { + Py_VISIT(self->first); + Py_VISIT(self->last); + return 0; + } + + static int + Custom_clear(CustomObject *self) + { + Py_CLEAR(self->first); + Py_CLEAR(self->last); + return 0; + } + + static void + Custom_dealloc(CustomObject *self) + { + PyObject_GC_UnTrack(self); + Custom_clear(self); + Py_TYPE(self)->tp_free((PyObject *) 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 = 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; + } + + static int + Custom_init(CustomObject *self, PyObject *args, PyObject *kwds) + { + 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; + } + + static PyMemberDef Custom_members[] = { + {"number", T_INT, offsetof(CustomObject, number), 0, + "custom number"}, + {NULL} /* Sentinel */ + }; + + static PyObject * + Custom_getfirst(CustomObject *self, void *closure) + { + Py_INCREF(self->first); + return self->first; + } + + static int + Custom_setfirst(CustomObject *self, PyObject *value, void *closure) + { + 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_INCREF(value); + Py_CLEAR(self->first); + self->first = value; + return 0; + } + + static PyObject * + Custom_getlast(CustomObject *self, void *closure) + { + Py_INCREF(self->last); + return self->last; + } + + static int + Custom_setlast(CustomObject *self, PyObject *value, void *closure) + { + 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_INCREF(value); + Py_CLEAR(self->last); + self->last = value; + return 0; + } + + static PyGetSetDef Custom_getsetters[] = { + {"first", (getter) Custom_getfirst, (setter) Custom_setfirst, + "first name", NULL}, + {"last", (getter) Custom_getlast, (setter) Custom_setlast, + "last name", NULL}, + {NULL} /* Sentinel */ + }; + + static PyObject * + Custom_name(CustomObject *self, PyObject *Py_UNUSED(ignored)) + { + return PyUnicode_FromFormat("%S %S", self->first, self->last); + } + + static PyMethodDef Custom_methods[] = { + {"name", (PyCFunction) Custom_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ + }; + + static PyTypeObject CustomType = { + 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 = (initproc) Custom_init, + .tp_dealloc = (destructor) Custom_dealloc, + .tp_traverse = (traverseproc) Custom_traverse, + .tp_clear = (inquiry) Custom_clear, + .tp_members = Custom_members, + .tp_methods = Custom_methods, + .tp_getset = Custom_getsetters, + }; + + static PyModuleDef custommodule = { + PyModuleDef_HEAD_INIT, + .m_name = "custom4", + .m_doc = "Example module that creates an extension type.", + .m_size = -1, + }; + + PyMODINIT_FUNC + PyInit_custom4(void) + { + PyObject *m; + if (PyType_Ready(&CustomType) < 0) + return NULL; + + m = PyModule_Create(&custommodule); + if (m == NULL) + return NULL; + + Py_INCREF(&CustomType); + if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) { + Py_DECREF(&CustomType); + Py_DECREF(m); + return NULL; + } + + return m; + } + +First, the traversal method lets the cyclic GC know about subobjects +that could participate in cycles: + + static int + Custom_traverse(CustomObject *self, visitproc visit, void *arg) + { + 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; + } + +For each subobject that can participate in cycles, we need to call the +‘visit()’ function, which is passed to the traversal method. The +‘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 *note Py_VISIT(): 426e. macro that automates calling +visit functions. With *note Py_VISIT(): 426e, we can minimize the +amount of boilerplate in ‘Custom_traverse’: + + static int + Custom_traverse(CustomObject *self, visitproc visit, void *arg) + { + Py_VISIT(self->first); + Py_VISIT(self->last); + return 0; + } + + Note: The *note tp_traverse: 352. implementation must name its + arguments exactly `visit' and `arg' in order to use *note + Py_VISIT(): 426e. + +Second, we need to provide a method for clearing any subobjects that can +participate in cycles: + + static int + Custom_clear(CustomObject *self) + { + Py_CLEAR(self->first); + Py_CLEAR(self->last); + return 0; + } + +Notice the use of the *note Py_CLEAR(): 10d7. 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 *note +Py_XDECREF(): 363. instead on the attribute before setting it to ‘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). + + Note: You could emulate *note Py_CLEAR(): 10d7. by writing: + + PyObject *tmp; + tmp = self->first; + self->first = NULL; + Py_XDECREF(tmp); + + Nevertheless, it is much easier and less error-prone to always use + *note Py_CLEAR(): 10d7. when deleting an attribute. Don’t try to + micro-optimize at the expense of robustness! + +The deallocator ‘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 *note PyObject_GC_UnTrack(): +1140. before clearing members. Here is our reimplemented deallocator +using *note PyObject_GC_UnTrack(): 1140. and ‘Custom_clear’: + + static void + Custom_dealloc(CustomObject *self) + { + PyObject_GC_UnTrack(self); + Custom_clear(self); + Py_TYPE(self)->tp_free((PyObject *) self); + } + +Finally, we add the *note Py_TPFLAGS_HAVE_GC: 351. flag to the class +flags: + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + +That’s pretty much it. If we had written custom *note tp_alloc: 4265. +or *note tp_free: 4264. handlers, we’d need to modify them for cyclic +garbage collection. Most extensions will use the versions automatically +provided. + + ---------- Footnotes ---------- + + (1) Also, even with our attributes restricted to strings instances, +the user could pass arbitrary *note str: 1b3. subclasses and therefore +still create reference cycles. + + +File: python.info, Node: Subclassing other types, Prev: Supporting cyclic garbage collection, Up: Defining Extension Types Tutorial + +6.2.2.5 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 *note PyTypeObject: 701. it needs. It +can be difficult to share these *note PyTypeObject: 701. structures +between extension modules. + +In this example we will create a ‘SubList’ type that inherits from the +built-in *note list: 1e9. type. The new type will be completely +compatible with regular lists, but will have an additional ‘increment()’ +method that increases an internal counter: + + >>> import sublist + >>> s = sublist.SubList(range(3)) + >>> s.extend(s) + >>> print(len(s)) + 6 + >>> print(s.increment()) + 1 + >>> print(s.increment()) + 2 + + #define PY_SSIZE_T_CLEAN + #include + + typedef struct { + PyListObject list; + int state; + } SubListObject; + + static PyObject * + SubList_increment(SubListObject *self, PyObject *unused) + { + self->state++; + return PyLong_FromLong(self->state); + } + + static PyMethodDef SubList_methods[] = { + {"increment", (PyCFunction) SubList_increment, METH_NOARGS, + PyDoc_STR("increment state counter")}, + {NULL}, + }; + + static int + SubList_init(SubListObject *self, PyObject *args, PyObject *kwds) + { + if (PyList_Type.tp_init((PyObject *) self, args, kwds) < 0) + return -1; + self->state = 0; + return 0; + } + + static PyTypeObject SubListType = { + 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 = (initproc) SubList_init, + .tp_methods = SubList_methods, + }; + + static PyModuleDef sublistmodule = { + PyModuleDef_HEAD_INIT, + .m_name = "sublist", + .m_doc = "Example module that creates an extension type.", + .m_size = -1, + }; + + PyMODINIT_FUNC + PyInit_sublist(void) + { + PyObject *m; + SubListType.tp_base = &PyList_Type; + if (PyType_Ready(&SubListType) < 0) + return NULL; + + m = PyModule_Create(&sublistmodule); + if (m == NULL) + return NULL; + + Py_INCREF(&SubListType); + if (PyModule_AddObject(m, "SubList", (PyObject *) &SubListType) < 0) { + Py_DECREF(&SubListType); + Py_DECREF(m); + return NULL; + } + + return m; + } + +As you can see, the source code closely resembles the ‘Custom’ examples +in previous sections. We will break down the main differences between +them. + + typedef struct { + PyListObject list; + int state; + } SubListObject; + +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 *note PyObject_HEAD(): f83. at the beginning of its +structure. + +When a Python object is a ‘SubList’ instance, its ‘PyObject *’ pointer +can be safely cast to both ‘PyListObject *’ and ‘SubListObject *’: + + static int + SubList_init(SubListObject *self, PyObject *args, PyObject *kwds) + { + if (PyList_Type.tp_init((PyObject *) self, args, kwds) < 0) + return -1; + self->state = 0; + return 0; + } + +We see above how to call through to the ‘__init__’ method of the base +type. + +This pattern is important when writing a type with custom *note tp_new: +4260. and *note tp_dealloc: 4263. members. The *note tp_new: 4260. +handler should not actually create the memory for the object with its +*note tp_alloc: 4265, but let the base class handle it by calling its +own *note tp_new: 4260. + +The *note PyTypeObject: 701. struct supports a *note tp_base: 4270. +specifying the type’s concrete base class. Due to cross-platform +compiler issues, you can’t fill that field directly with a reference to +*note PyList_Type: 4271.; it should be done later in the module +initialization function: + + PyMODINIT_FUNC + PyInit_sublist(void) + { + PyObject* m; + SubListType.tp_base = &PyList_Type; + if (PyType_Ready(&SubListType) < 0) + return NULL; + + m = PyModule_Create(&sublistmodule); + if (m == NULL) + return NULL; + + Py_INCREF(&SubListType); + if (PyModule_AddObject(m, "SubList", (PyObject *) &SubListType) < 0) { + Py_DECREF(&SubListType); + Py_DECREF(m); + return NULL; + } + + return m; + } + +Before calling *note PyType_Ready(): 350, the type structure must have +the *note tp_base: 4270. slot filled in. When we are deriving an +existing type, it is not necessary to fill out the *note tp_alloc: 4265. +slot with *note PyType_GenericNew(): 4261. – the allocation function +from the base type will be inherited. + +After that, calling *note PyType_Ready(): 350. and adding the type +object to the module is the same as with the basic ‘Custom’ examples. + + +File: python.info, Node: Defining Extension Types Assorted Topics, Next: Building C and C++ Extensions, Prev: Defining Extension Types Tutorial, Up: Creating extensions without third party tools + +6.2.3 Defining Extension Types: Assorted Topics +----------------------------------------------- + +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 *note PyTypeObject: 701, with some fields only +used in *note debug builds: 496. omitted: + + typedef struct _typeobject { + PyObject_VAR_HEAD + const char *tp_name; /* For printing, in format "." */ + 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 */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + // Strong reference on a heap type, borrowed reference on a static type + struct _typeobject *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; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + destructor tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; + + destructor tp_finalize; + vectorcallfunc tp_vectorcall; + } PyTypeObject; + +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. + + const char *tp_name; /* For printing */ + +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! + + Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ + +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 +*note tp_itemsize: 425d. field comes in. This will be dealt with later. + + const char *tp_doc; + +Here you can put a string (or its address) that you want returned when +the Python script references ‘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:: + + +File: python.info, Node: Finalization and De-allocation, Next: Object Presentation, Up: Defining Extension Types Assorted Topics + +6.2.3.1 Finalization and De-allocation +...................................... + + destructor tp_dealloc; + +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: + + static void + newdatatype_dealloc(newdatatypeobject *obj) + { + free(obj->obj_UnderlyingDatatypePtr); + Py_TYPE(obj)->tp_free((PyObject *)obj); + } + +If your type supports garbage collection, the destructor should call +*note PyObject_GC_UnTrack(): 1140. before clearing any member fields: + + static void + newdatatype_dealloc(newdatatypeobject *obj) + { + PyObject_GC_UnTrack(obj); + Py_CLEAR(obj->other_obj); + ... + Py_TYPE(obj)->tp_free((PyObject *)obj); + } + +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 *note PyErr_Fetch(): +cdd. and *note PyErr_Restore(): 4277. functions: + + 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(obj)->tp_free((PyObject*)self); + } + + Note: There are limitations to what you can safely do in a + deallocator function. First, if your type supports garbage + collection (using *note tp_traverse: 352. and/or *note tp_clear: + 4278.), some of the object’s members can have been cleared or + finalized by the time *note tp_dealloc: 4263. is called. Second, + in *note tp_dealloc: 4263, 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 *note + tp_dealloc: 4263. again, causing a double free and a crash. + + Starting with Python 3.4, it is recommended not to put any complex + finalization code in *note tp_dealloc: 4263, and instead use the + new *note tp_finalize: 702. type method. + + See also + ........ + + PEP 442(1) explains the new finalization scheme. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0442/ + + +File: python.info, Node: Object Presentation, Next: Attribute Management, Prev: Finalization and De-allocation, Up: Defining Extension Types Assorted Topics + +6.2.3.2 Object Presentation +........................... + +In Python, there are two ways to generate a textual representation of an +object: the *note repr(): 3ee. function, and the *note str(): 1b3. +function. (The *note print(): c13. function just calls *note str(): +1b3.) These handlers are both optional. + + reprfunc tp_repr; + reprfunc tp_str; + +The *note tp_repr: 427a. handler should return a string object +containing a representation of the instance for which it is called. +Here is a simple example: + + static PyObject * + newdatatype_repr(newdatatypeobject * obj) + { + return PyUnicode_FromFormat("Repr-ified_newdatatype{{size:%d}}", + obj->obj_UnderlyingDatatypePtr->size); + } + +If no *note tp_repr: 427a. handler is specified, the interpreter will +supply a representation that uses the type’s *note tp_name: 12f9. and a +uniquely identifying value for the object. + +The *note tp_str: 427b. handler is to *note str(): 1b3. what the *note +tp_repr: 427a. handler described above is to *note repr(): 3ee.; that +is, it is called when Python code calls *note str(): 1b3. on an instance +of your object. Its implementation is very similar to the *note +tp_repr: 427a. function, but the resulting string is intended for human +consumption. If *note tp_str: 427b. is not specified, the *note +tp_repr: 427a. handler is used instead. + +Here is a simple example: + + static PyObject * + newdatatype_str(newdatatypeobject * obj) + { + return PyUnicode_FromFormat("Stringified_newdatatype{{size:%d}}", + obj->obj_UnderlyingDatatypePtr->size); + } + + +File: python.info, Node: Attribute Management, Next: Object Comparison, Prev: Object Presentation, Up: Defining Extension Types Assorted Topics + +6.2.3.3 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 ‘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 *note PyObject: 4cf.*. Each type can use +whichever pair makes more sense for the implementation’s convenience. + + getattrfunc tp_getattr; /* char * version */ + setattrfunc tp_setattr; + /* ... */ + getattrofunc tp_getattro; /* PyObject * version */ + setattrofunc tp_setattro; + +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 *note PyObject: 4cf.* 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:: + + +File: python.info, Node: Generic Attribute Management, Next: Type-specific Attribute Management, Up: Attribute Management + +6.2.3.4 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: + + 1. The name of the attributes must be known when *note PyType_Ready(): + 350. is called. + + 2. 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. + +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 *note PyType_Ready(): 350. is called, it uses three tables +referenced by the type object to create *note descriptor: 1924.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 ‘NULL’, instances of the type will +only have attributes that are inherited from their base type, and should +leave the *note tp_getattro: 427e. and *note tp_setattro: 427f. fields +‘NULL’ as well, allowing the base type to handle attributes. + +The tables are declared as three fields of the type object: + + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + +If *note tp_methods: 4269. is not ‘NULL’, it must refer to an array of +*note PyMethodDef: 1119. structures. Each entry in the table is an +instance of this structure: + + typedef struct PyMethodDef { + const char *ml_name; /* method name */ + PyCFunction ml_meth; /* implementation function */ + int ml_flags; /* flags */ + const char *ml_doc; /* docstring */ + } PyMethodDef; + +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 ‘ml_name’ field of the sentinel must be ‘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: + + typedef struct PyMemberDef { + const char *name; + int type; + int offset; + int flags; + const char *doc; + } PyMemberDef; + +For each entry in the table, a *note descriptor: 1924. will be +constructed and added to the type which will be able to extract a value +from the instance structure. The *note type: 9c2. field should contain +one of the type codes defined in the ‘structmember.h’ header; the value +will be used to determine how to convert Python values to and from C +values. The ‘flags’ field is used to store flags which control how the +attribute can be accessed. + +The following flag constants are defined in ‘structmember.h’; they may +be combined using bitwise-OR. + +Constant Meaning + +----------------------------------------------------------------------------------- + +‘READONLY’ Never writable. + + +‘PY_AUDIT_READ’ Emit an ‘object.__getattr__’ + *note audit events: 1269. before reading. + + +Changed in version 3.10: ‘RESTRICTED’, ‘READ_RESTRICTED’ and +‘WRITE_RESTRICTED’ are deprecated. However, ‘READ_RESTRICTED’ is an +alias for ‘PY_AUDIT_READ’, so fields that specify either ‘RESTRICTED’ or +‘READ_RESTRICTED’ will also raise an audit event. + +An interesting advantage of using the *note tp_members: 4267. 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 +‘__doc__’ attribute. + +As with the *note tp_methods: 4269. table, a sentinel entry with a +‘name’ value of ‘NULL’ is required. + + +File: python.info, Node: Type-specific Attribute Management, Prev: Generic Attribute Management, Up: Attribute Management + +6.2.3.5 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 +*note PyObject: 4cf.* 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 *note tp_getattr: 4281. handler is called when the object requires +an attribute look-up. It is called in the same situations where the +‘__getattr__()’ method of a class would be called. + +Here is an example: + + static PyObject * + newdatatype_getattr(newdatatypeobject *obj, char *name) + { + if (strcmp(name, "data") == 0) + { + return PyLong_FromLong(obj->data); + } + + PyErr_Format(PyExc_AttributeError, + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, name); + return NULL; + } + +The *note tp_setattr: 4282. handler is called when the ‘__setattr__()’ +or ‘__delattr__()’ method of a class instance would be called. When an +attribute should be deleted, the third parameter will be ‘NULL’. Here +is an example that simply raises an exception; if this were really all +you wanted, the *note tp_setattr: 4282. handler should be set to ‘NULL’. + + static int + newdatatype_setattr(newdatatypeobject *obj, char *name, PyObject *v) + { + PyErr_Format(PyExc_RuntimeError, "Read-only attribute: %s", name); + return -1; + } + + +File: python.info, Node: Object Comparison, Next: Abstract Protocol Support, Prev: Attribute Management, Up: Defining Extension Types Assorted Topics + +6.2.3.6 Object Comparison +......................... + + richcmpfunc tp_richcompare; + +The *note tp_richcompare: 4284. handler is called when comparisons are +needed. It is analogous to the *note rich comparison methods: 190e, +like ‘__lt__()’, and also called by *note PyObject_RichCompare(): 4285. +and *note PyObject_RichCompareBool(): 13c0. + +This function is called with two Python objects and the operator as +arguments, where the operator is one of ‘Py_EQ’, ‘Py_NE’, ‘Py_LE’, +‘Py_GE’, ‘Py_LT’ or ‘Py_GT’. It should compare the two objects with +respect to the specified operator and return ‘Py_True’ or ‘Py_False’ if +the comparison is successful, ‘Py_NotImplemented’ to indicate that +comparison is not implemented and the other object’s comparison method +should be tried, or ‘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: + + static PyObject * + newdatatype_richcmp(PyObject *obj1, PyObject *obj2, int op) + { + 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; + Py_INCREF(result); + return result; + } + + +File: python.info, Node: Abstract Protocol Support, Next: Weak Reference Support, Prev: Object Comparison, Up: Defining Extension Types Assorted Topics + +6.2.3.7 Abstract Protocol Support +................................. + +Python supports a variety of `abstract' ‘protocols;’ the specific +interfaces provided to use these interfaces are documented in *note +Abstract Objects Layer: 4287. + +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-‘NULL’. +The flag may be set to indicate the presence of a slot, but a slot may +still be unfilled.) + + PyNumberMethods *tp_as_number; + PySequenceMethods *tp_as_sequence; + PyMappingMethods *tp_as_mapping; + +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 *note PyNumberMethods: 1081, *note +PySequenceMethods: 4288, or *note PyMappingMethods: 4289, 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 ‘Objects’ directory +of the Python source distribution. + + hashfunc tp_hash; + +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: + + static Py_hash_t + newdatatype_hash(newdatatypeobject *obj) + { + Py_hash_t result; + result = obj->some_size + 32767 * obj->some_number; + if (result == -1) + result = -2; + return result; + } + +‘Py_hash_t’ is a signed integer type with a platform-varying width. +Returning ‘-1’ from *note tp_hash: 428a. indicates an error, which is +why you should be careful to avoid returning it when hash computation is +successful, as seen above. + + ternaryfunc tp_call; + +This function is called when an instance of your data type is “called”, +for example, if ‘obj1’ is an instance of your data type and the Python +script contains ‘obj1('hello')’, the *note tp_call: 428b. handler is +invoked. + +This function takes three arguments: + + 1. `self' is the instance of the data type which is the subject of the + call. If the call is ‘obj1('hello')’, then `self' is ‘obj1’. + + 2. `args' is a tuple containing the arguments to the call. You can + use *note PyArg_ParseTuple(): 4d9. to extract the arguments. + + 3. `kwds' is a dictionary of keyword arguments that were passed. If + this is non-‘NULL’ and you support keyword arguments, use *note + PyArg_ParseTupleAndKeywords(): 987. to extract the arguments. If + you do not want to support keyword arguments and this is + non-‘NULL’, raise a *note TypeError: 19c. with a message saying + that keyword arguments are not supported. + +Here is a toy ‘tp_call’ implementation: + + static PyObject * + newdatatype_call(newdatatypeobject *self, PyObject *args, PyObject *kwds) + { + 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", + obj->obj_UnderlyingDatatypePtr->size, + arg1, arg2, arg3); + return result; + } + + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + +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 ‘NULL’. *note tp_iter: 112d. +corresponds to the Python ‘__iter__()’ method, while *note tp_iternext: +112e. corresponds to the Python *note __next__(): f76. method. + +Any *note iterable: ed9. object must implement the *note tp_iter: 112d. +handler, which must return an *note iterator: 134f. object. Here the +same guidelines apply as for Python classes: + + * 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 *note tp_iter: 112d. + + * Objects which can only be iterated over once (usually due to side + effects of iteration, such as file objects) can implement *note + tp_iter: 112d. by returning a new reference to themselves – and + should also therefore implement the *note tp_iternext: 112e. + handler. + +Any *note iterator: 134f. object should implement both *note tp_iter: +112d. and *note tp_iternext: 112e. An iterator’s *note tp_iter: 112d. +handler should return a new reference to the iterator. Its *note +tp_iternext: 112e. handler should return a new reference to the next +object in the iteration, if there is one. If the iteration has reached +the end, *note tp_iternext: 112e. may return ‘NULL’ without setting an +exception, or it may set *note StopIteration: 865. `in addition' to +returning ‘NULL’; avoiding the exception can yield slightly better +performance. If an actual error occurs, *note tp_iternext: 112e. should +always set an exception and return ‘NULL’. + + +File: python.info, Node: Weak Reference Support, Next: More Suggestions, Prev: Abstract Protocol Support, Up: Defining Extension Types Assorted Topics + +6.2.3.8 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). + +See also +........ + +Documentation for the *note weakref: 132. module. + +For an object to be weakly referencable, the extension type must do two +things: + + 1. Include a *note PyObject: 4cf.* field in the C object structure + dedicated to the weak reference mechanism. The object’s + constructor should leave it ‘NULL’ (which is automatic when using + the default *note tp_alloc: 4265.). + + 2. Set the *note tp_weaklistoffset: 5de. type member to the offset of + the aforementioned field in the C object structure, so that the + interpreter knows how to access and modify that field. + +Concretely, here is how a trivial object structure would be augmented +with the required field: + + typedef struct { + PyObject_HEAD + PyObject *weakreflist; /* List of weak references */ + } TrivialObject; + +And the corresponding member in the statically declared type object: + + static PyTypeObject TrivialType = { + PyVarObject_HEAD_INIT(NULL, 0) + /* ... other members omitted for brevity ... */ + .tp_weaklistoffset = offsetof(TrivialObject, weakreflist), + }; + +The only further addition is that ‘tp_dealloc’ needs to clear any weak +references (by calling ‘PyObject_ClearWeakRefs()’) if the field is +non-‘NULL’: + + static void + Trivial_dealloc(TrivialObject *self) + { + /* Clear weakrefs first before calling any destructors */ + if (self->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) self); + /* ... remainder of destruction code omitted for brevity ... */ + Py_TYPE(self)->tp_free((PyObject *) self); + } + + +File: python.info, Node: More Suggestions, Prev: Weak Reference Support, Up: Defining Extension Types Assorted Topics + +6.2.3.9 More Suggestions +........................ + +In order to learn how to implement any specific method for your new data +type, get the *note CPython: 2b4. source code. Go to the ‘Objects’ +directory, then search the C source files for ‘tp_’ plus the function +you want (for example, ‘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 *note PyObject_TypeCheck(): 12fd. +function. A sample of its use might be something like the following: + + if (!PyObject_TypeCheck(some_object, &MyType)) { + PyErr_SetString(PyExc_TypeError, "arg #1 not a mything"); + return NULL; + } + +See also +........ + +Download CPython source releases. + + ‘https://www.python.org/downloads/source/’ + +The CPython project on GitHub, where the CPython source code is developed. + + ‘https://github.com/python/cpython’ + + +File: python.info, Node: Building C and C++ Extensions, Next: Building C and C++ Extensions on Windows, Prev: Defining Extension Types Assorted Topics, Up: Creating extensions without third party tools + +6.2.4 Building C and C++ Extensions +----------------------------------- + +A C extension for CPython is a shared library (e.g. a ‘.so’ file on +Linux, ‘.pyd’ on Windows), which exports an `initialization function'. + +To be importable, the shared library must be available on *note +PYTHONPATH: cc7, and must be named after the module name, with an +appropriate extension. When using distutils, the correct filename is +generated automatically. + +The initialization function has the signature: + + -- C Function: *note PyObject: 4cf. *PyInit_modulename (void) + +It returns either a fully initialized module, or a *note PyModuleDef: +5d2. instance. See *note Initializing C modules: 4291. for details. + +For modules with ASCII-only names, the function must be named +‘PyInit_’, with ‘’ replaced by the name of the +module. When using *note Multi-phase initialization: 4292, non-ASCII +module names are allowed. In this case, the initialization function +name is ‘PyInitU_’, with ‘’ encoded using +Python’s `punycode' encoding with hyphens replaced by underscores. In +Python: + + 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 + +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”' section in PEP 489(1) for details. + +* Menu: + +* Building C and C++ Extensions with distutils:: +* Distributing your extension modules:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0489/ + + +File: python.info, Node: Building C and C++ Extensions with distutils, Next: Distributing your extension modules, Up: Building C and C++ Extensions + +6.2.4.1 Building C and C++ Extensions with distutils +.................................................... + +Extension modules can be built using distutils, which is included in +Python. Since distutils also supports creation of binary packages, +users don’t necessarily need a compiler and distutils to install the +extension. + +A distutils package contains a driver script, ‘setup.py’. This is a +plain Python file, which, in the most simple case, could look like this: + + from distutils.core import setup, Extension + + module1 = Extension('demo', + sources = ['demo.c']) + + setup (name = 'PackageName', + version = '1.0', + description = 'This is a demo package', + ext_modules = [module1]) + +With this ‘setup.py’, and a file ‘demo.c’, running + + python setup.py build + +will compile ‘demo.c’, and produce an extension module named ‘demo’ in +the ‘build’ directory. Depending on the system, the module file will +end up in a subdirectory ‘build/lib.system’, and may have a name like +‘demo.so’ or ‘demo.pyd’. + +In the ‘setup.py’, all execution is performed by calling the ‘setup’ +function. This takes a variable number of keyword arguments, of which +the example above uses only a subset. Specifically, the example +specifies meta-information to build packages, and it specifies the +contents of the package. Normally, a package will contain additional +modules, like Python source modules, documentation, subpackages, etc. +Please refer to the distutils documentation in *note Distributing Python +Modules (Legacy version): b88. to learn more about the features of +distutils; this section explains building extension modules only. + +It is common to pre-compute arguments to ‘setup()’, to better structure +the driver script. In the example above, the ‘ext_modules’ argument to +*note setup(): 4294. is a list of extension modules, each of which is an +instance of the ‘Extension’. In the example, the instance defines an +extension named ‘demo’ which is build by compiling a single source file, +‘demo.c’. + +In many cases, building an extension is more complex, since additional +preprocessor defines and libraries may be needed. This is demonstrated +in the example below. + + from distutils.core import setup, Extension + + module1 = Extension('demo', + define_macros = [('MAJOR_VERSION', '1'), + ('MINOR_VERSION', '0')], + include_dirs = ['/usr/local/include'], + libraries = ['tcl83'], + library_dirs = ['/usr/local/lib'], + sources = ['demo.c']) + + setup (name = 'PackageName', + version = '1.0', + description = 'This is a demo package', + author = 'Martin v. Loewis', + author_email = 'martin@v.loewis.de', + url = 'https://docs.python.org/extending/building', + long_description = ''' + This is really just a demo package. + ''', + ext_modules = [module1]) + +In this example, *note setup(): 4294. is called with additional +meta-information, which is recommended when distribution packages have +to be built. For the extension itself, it specifies preprocessor +defines, include directories, library directories, and libraries. +Depending on the compiler, distutils passes this information in +different ways to the compiler. For example, on Unix, this may result +in the compilation commands + + gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DMAJOR_VERSION=1 -DMINOR_VERSION=0 -I/usr/local/include -I/usr/local/include/python2.2 -c demo.c -o build/temp.linux-i686-2.2/demo.o + + gcc -shared build/temp.linux-i686-2.2/demo.o -L/usr/local/lib -ltcl83 -o build/lib.linux-i686-2.2/demo.so + +These lines are for demonstration purposes only; distutils users should +trust that distutils gets the invocations right. + + +File: python.info, Node: Distributing your extension modules, Prev: Building C and C++ Extensions with distutils, Up: Building C and C++ Extensions + +6.2.4.2 Distributing your extension modules +........................................... + +When an extension has been successfully built, there are three ways to +use it. + +End-users will typically want to install the module, they do so by +running + + python setup.py install + +Module maintainers should produce source packages; to do so, they run + + python setup.py sdist + +In some cases, additional files need to be included in a source +distribution; this is done through a ‘MANIFEST.in’ file; see *note +Specifying the files to distribute: 4297. for details. + +If the source distribution has been built successfully, maintainers can +also create binary distributions. Depending on the platform, one of the +following commands can be used to do so. + + python setup.py bdist_rpm + python setup.py bdist_dumb + + +File: python.info, Node: Building C and C++ Extensions on Windows, Prev: Building C and C++ Extensions, Up: Creating extensions without third party tools + +6.2.5 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++. + + 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 ‘XY’; in practice, ‘'X'’ will be + the major version number and ‘'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, ‘XY’ will actually be ‘22’. + +* Menu: + +* A Cookbook Approach:: +* Differences Between Unix and Windows:: +* Using DLLs in Practice:: + + +File: python.info, Node: A Cookbook Approach, Next: Differences Between Unix and Windows, Up: Building C and C++ Extensions on Windows + +6.2.5.1 A Cookbook Approach +........................... + +There are two approaches to building extension modules on Windows, just +as there are on Unix: use the *note distutils: 37. package to control +the build process, or do things manually. The distutils approach works +well for most extensions; documentation on using *note distutils: 37. to +build and package extension modules is available in *note Distributing +Python Modules (Legacy version): b88. If you find you really need to do +things manually, it may be instructive to study the project file for the +winsound(1) standard library module. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/PCbuild/winsound.vcxproj + + +File: python.info, Node: Differences Between Unix and Windows, Next: Using DLLs in Practice, Prev: A Cookbook Approach, Up: Building C and C++ Extensions on Windows + +6.2.5.2 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 (‘.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 (‘.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 (‘.a’) which contains +code from several object files (‘.o’). During the link step to create a +shared object file (‘.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 ‘.lib’). A static library is like a Unix +‘.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 ‘A.a’ to +the linker for ‘B.so’ and ‘C.so’; that would cause it to be included +twice, so that B and C would each have their own copy. In Windows, +building ‘A.dll’ will also build ‘A.lib’. You `do' pass ‘A.lib’ to the +linker for B and C. ‘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 ‘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 ‘from spam import +*’; it does create a separate copy. + + +File: python.info, Node: Using DLLs in Practice, Prev: Differences Between Unix and Windows, Up: Building C and C++ Extensions on Windows + +6.2.5.3 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 must pass ‘pythonXY.lib’ to the +linker. To build two DLLs, spam and ni (which uses C functions found in +spam), you could use these commands: + + cl /LD /I/python/include spam.c ../libs/pythonXY.lib + cl /LD /I/python/include ni.c spam.lib ../libs/pythonXY.lib + +The first command created three files: ‘spam.obj’, ‘spam.dll’ and +‘spam.lib’. ‘Spam.dll’ does not contain any Python functions (such as +*note PyArg_ParseTuple(): 4d9.), but it does know how to find the Python +code thanks to ‘pythonXY.lib’. + +The second command created ‘ni.dll’ (and ‘.obj’ and ‘.lib’), which knows +how to find the necessary functions from spam, and also from the Python +executable. + +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 ‘_declspec(dllexport)’, as in ‘void _declspec(dllexport) +initspam(void)’ or ‘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 ‘msvcrtxx.lib’ to the list of libraries. + + +File: python.info, Node: Embedding the CPython runtime in a larger application, Prev: Creating extensions without third party tools, Up: Extending and Embedding the Python Interpreter + +6.3 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:: + + +File: python.info, Node: Embedding Python in Another Application, Up: Embedding the CPython runtime in a larger application + +6.3.1 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 *note +Py_Initialize(): 4e7. 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 *note PyRun_SimpleString(): 42a4, +or you can pass a stdio file pointer and a file name (for identification +in error messages only) to *note PyRun_SimpleFile(): 42a5. You can also +call the lower-level operations described in the previous chapters to +construct and use Python objects. + +See also +........ + +*note Python/C API Reference Manual: 1626. + + The details of Python’s C interface are given in this manual. A + great deal of necessary information can be found here. + +* 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:: + + +File: python.info, Node: Very High Level Embedding, Next: Beyond Very High Level Embedding An overview, Up: Embedding Python in Another Application + +6.3.1.1 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. + + #define PY_SSIZE_T_CLEAN + #include + + int + main(int argc, char *argv[]) + { + wchar_t *program = Py_DecodeLocale(argv[0], NULL); + if (program == NULL) { + fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); + exit(1); + } + Py_SetProgramName(program); /* optional but recommended */ + Py_Initialize(); + PyRun_SimpleString("from time import time,ctime\n" + "print('Today is', ctime(time()))\n"); + if (Py_FinalizeEx() < 0) { + exit(120); + } + PyMem_RawFree(program); + return 0; + } + +The *note Py_SetProgramName(): 36d. function should be called before +*note Py_Initialize(): 4e7. to inform the interpreter about paths to +Python run-time libraries. Next, the Python interpreter is initialized +with *note Py_Initialize(): 4e7, followed by the execution of a +hard-coded Python script that prints the date and time. Afterwards, the +*note Py_FinalizeEx(): 986. 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 *note PyRun_SimpleFile(): 42a5. function, which saves +you the trouble of allocating memory space and loading the file +contents. + + +File: python.info, Node: Beyond Very High Level Embedding An overview, Next: Pure Embedding, Prev: Very High Level Embedding, Up: Embedding Python in Another Application + +6.3.1.2 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: + + 1. Convert data values from Python to C, + + 2. Perform a function call to a C routine using the converted values, + and + + 3. Convert the data values from the call from C to Python. + +When embedding Python, the interface code does: + + 1. Convert data values from C to Python, + + 2. Perform a function call to a Python interface routine using the + converted values, and + + 3. Convert the data values from the call from Python to C. + +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. + + +File: python.info, Node: Pure Embedding, Next: Extending Embedded Python, Prev: Beyond Very High Level Embedding An overview, Up: Embedding Python in Another Application + +6.3.1.3 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: + + #define PY_SSIZE_T_CLEAN + #include + + 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; + } + +This code loads a Python script using ‘argv[1]’, and calls the function +named in ‘argv[2]’. Its integer arguments are the other values of the +‘argv’ array. If you *note compile and link: 42ac. this program (let’s +call the finished executable ‘call’), and use it to execute a Python +script, such as: + + def multiply(a,b): + print("Will compute", a, "times", b) + c = 0 + for i in range(0, a): + c = c + b + return c + +then the result should be: + + $ call multiply multiply 3 2 + Will compute 3 times 2 + Result of call: 6 + +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 + + Py_Initialize(); + pName = PyUnicode_DecodeFSDefault(argv[1]); + /* Error checking of pName left out */ + pModule = PyImport_Import(pName); + +After initializing the interpreter, the script is loaded using *note +PyImport_Import(): 1060. This routine needs a Python string as its +argument, which is constructed using the *note PyUnicode_FromString(): +42ad. data conversion routine. + + pFunc = PyObject_GetAttrString(pModule, argv[2]); + /* pFunc is a new reference */ + + if (pFunc && PyCallable_Check(pFunc)) { + ... + } + Py_XDECREF(pFunc); + +Once the script is loaded, the name we’re looking for is retrieved using +*note PyObject_GetAttrString(): 4246. 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: + + pValue = PyObject_CallObject(pFunc, pArgs); + +Upon return of the function, ‘pValue’ is either ‘NULL’ or it contains a +reference to the return value of the function. Be sure to release the +reference after examining the value. + + +File: python.info, Node: Extending Embedded Python, Next: Embedding Python in C++, Prev: Pure Embedding, Up: Embedding Python in Another Application + +6.3.1.4 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: + + 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 EmbMethods[] = { + {"numargs", emb_numargs, METH_VARARGS, + "Return the number of arguments received by the process."}, + {NULL, NULL, 0, NULL} + }; + + static PyModuleDef EmbModule = { + PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods, + NULL, NULL, NULL, NULL + }; + + static PyObject* + PyInit_emb(void) + { + return PyModule_Create(&EmbModule); + } + +Insert the above code just above the ‘main()’ function. Also, insert +the following two statements before the call to *note Py_Initialize(): +4e7.: + + numargs = argc; + PyImport_AppendInittab("emb", &PyInit_emb); + +These two lines initialize the ‘numargs’ variable, and make the +‘emb.numargs()’ function accessible to the embedded Python interpreter. +With these extensions, the Python script can do things like + + import emb + print("Number of arguments", emb.numargs()) + +In a real application, the methods will expose an API of the application +to Python. + + +File: python.info, Node: Embedding Python in C++, Next: Compiling and Linking under Unix-like systems, Prev: Extending Embedded Python, Up: Embedding Python in Another Application + +6.3.1.5 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++. + + +File: python.info, Node: Compiling and Linking under Unix-like systems, Prev: Embedding Python in C++, Up: Embedding Python in Another Application + +6.3.1.6 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 (‘.so’ files) linked against it. + +To find out the required compiler and linker flags, you can execute the +‘python`X.Y'-config’ script which is generated as part of the +installation process (a ‘python3-config’ script may also be available). +This script has several options, of which the following will be directly +useful to you: + + * ‘pythonX.Y-config --cflags’ will give you the recommended flags + when compiling: + + $ /opt/bin/python3.4-config --cflags + -I/opt/include/python3.4m -I/opt/include/python3.4m -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes + + * ‘pythonX.Y-config --ldflags’ will give you the recommended flags + when linking: + + $ /opt/bin/python3.4-config --ldflags + -L/opt/lib/python3.4/config-3.4m -lpthread -ldl -lutil -lm -lpython3.4m -Xlinker -export-dynamic + + 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 + ‘python`X.Y'-config’, as in the above example. + +If this procedure doesn’t work for you (it is not guaranteed to work for +all Unix-like platforms; however, we welcome *note bug reports: 42b3.) +you will have to read your system’s documentation about dynamic linking +and/or examine Python’s ‘Makefile’ (use *note +sysconfig.get_makefile_filename(): 3be0. to find its location) and +compilation options. In this case, the *note sysconfig: fa. module is a +useful tool to programmatically extract the configuration values that +you will want to combine together. For example: + + >>> import sysconfig + >>> sysconfig.get_config_var('LIBS') + '-lpthread -ldl -lutil' + >>> sysconfig.get_config_var('LINKFORSHARED') + '-Xlinker -export-dynamic' + + +File: python.info, Node: Python/C API Reference Manual, Next: Distributing Python Modules, Prev: Extending and Embedding the Python Interpreter, Up: Top + +7 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 *note +Extending and Embedding the Python Interpreter: 1625, which describes +the general principles of extension writing but does not document the +API functions in detail. + +* Menu: + +* Introduction: Introduction<12>. +* C API Stability:: +* The Very High Level Layer:: +* Reference Counting:: +* Exception Handling:: +* Utilities: Utilities<2>. +* Abstract Objects Layer:: +* Concrete Objects Layer:: +* Initialization, Finalization, and Threads: Initialization Finalization and Threads. +* Python Initialization Configuration:: +* Memory Management:: +* Object Implementation Support:: +* API and ABI Versioning:: + + +File: python.info, Node: Introduction<12>, Next: C API Stability, Up: Python/C API Reference Manual + +7.1 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: + +* Coding standards:: +* Include Files:: +* Useful macros:: +* Objects, Types and Reference Counts: Objects Types and Reference Counts. +* Exceptions: Exceptions<19>. +* Embedding Python: Embedding Python<2>. +* Debugging Builds:: + + +File: python.info, Node: Coding standards, Next: Include Files, Up: Introduction<12> + +7.1.1 Coding standards +---------------------- + +If you’re writing C code for inclusion in CPython, you `must' follow the +guidelines and standards defined in PEP 7(1). 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0007/ + + +File: python.info, Node: Include Files, Next: Useful macros, Prev: Coding standards, Up: Introduction<12> + +7.1.2 Include Files +------------------- + +All function, type and macro definitions needed to use the Python/C API +are included in your code by the following line: + + #define PY_SSIZE_T_CLEAN + #include + +This implies inclusion of the following standard headers: ‘’, +‘’, ‘’, ‘’, ‘’ and ‘’ +(if available). + + Note: Since Python may define some pre-processor definitions which + affect the standard headers on some systems, you `must' include + ‘Python.h’ before any standard headers are included. + + It is recommended to always define ‘PY_SSIZE_T_CLEAN’ before + including ‘Python.h’. See *note Parsing arguments and building + values: 4db. for a description of this macro. + +All user visible names defined by Python.h (except those defined by the +included standard headers) have one of the prefixes ‘Py’ or ‘_Py’. +Names beginning with ‘_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. + + Note: User code should never define names that begin with ‘Py’ or + ‘_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. + +The header files are typically installed with Python. On Unix, these +are located in the directories ‘`prefix'/include/pythonversion/’ and +‘`exec_prefix'/include/pythonversion/’, where ‘prefix’ and ‘exec_prefix’ +are defined by the corresponding parameters to Python’s ‘configure’ +script and `version' is ‘'%d.%d' % sys.version_info[:2]’. On Windows, +the headers are installed in ‘`prefix'/include’, where ‘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 ‘#include +’; this will break on multi-platform builds since +the platform independent headers under ‘prefix’ include the platform +specific headers from ‘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 ‘extern "C"’. +As a result, there is no need to do anything special to use the API from +C++. + + +File: python.info, Node: Useful macros, Next: Objects Types and Reference Counts, Prev: Include Files, Up: Introduction<12> + +7.1.3 Useful macros +------------------- + +Several useful macros are defined in the Python header files. Many are +defined closer to where they are useful (e.g. *note Py_RETURN_NONE: +10d4.). Others of a more general utility are defined here. This is not +necessarily a complete listing. + + -- C Macro: Py_ABS (x) + + Return the absolute value of ‘x’. + + New in version 3.3. + + -- C Macro: Py_ALWAYS_INLINE + + Ask the compiler to always inline a static inline function. The + compiler can ignore it and decides to not inline the function. + + 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 *note built in debug mode: 496. (if the ‘Py_DEBUG’ + macro is defined), the *note Py_ALWAYS_INLINE: 12ba. macro does + nothing. + + It must be specified before the function return type. Usage: + + static inline Py_ALWAYS_INLINE int random(void) { return 4; } + + New in version 3.11. + + -- C Macro: Py_CHARMASK (c) + + Argument must be a character or an integer in the range [-128, 127] + or [0, 255]. This macro returns ‘c’ cast to an ‘unsigned char’. + + -- C Macro: Py_DEPRECATED (version) + + Use this for deprecated declarations. The macro must be placed + before the symbol name. + + Example: + + Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void); + + Changed in version 3.8: MSVC support was added. + + -- C Macro: Py_GETENV (s) + + Like ‘getenv(s)’, but returns ‘NULL’ if *note -E: 5af. was passed + on the command line (i.e. if ‘Py_IgnoreEnvironmentFlag’ is set). + + -- C Macro: Py_MAX (x, y) + + Return the maximum value between ‘x’ and ‘y’. + + New in version 3.3. + + -- C Macro: Py_MEMBER_SIZE (type, member) + + Return the size of a structure (‘type’) ‘member’ in bytes. + + New in version 3.6. + + -- C Macro: Py_MIN (x, y) + + Return the minimum value between ‘x’ and ‘y’. + + New in version 3.3. + + -- 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(1)). + + Usage: + + Py_NO_INLINE static int random(void) { return 4; } + + New in version 3.11. + + -- C Macro: Py_STRINGIFY (x) + + Convert ‘x’ to a C string. E.g. ‘Py_STRINGIFY(123)’ returns + ‘"123"’. + + New in version 3.4. + + -- C Macro: Py_UNREACHABLE () + + Use this when you have a code path that cannot be reached by + design. For example, in the ‘default:’ clause in a ‘switch’ + statement for which all possible values are covered in ‘case’ + statements. Use this in places where you might be tempted to put + an ‘assert(0)’ or ‘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 ‘__builtin_unreachable()’ on GCC in + release mode. + + A use for ‘Py_UNREACHABLE()’ is following a call a function that + never returns but that is not declared ‘_Py_NO_RETURN’. + + 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, *note + Py_FatalError(): 5d9. can be used. + + New in version 3.7. + + -- C Macro: Py_UNUSED (arg) + + Use this for unused arguments in a function definition to silence + compiler warnings. Example: ‘int func(int a, int Py_UNUSED(b)) { + return a; }’. + + New in version 3.4. + + -- C Macro: PyDoc_STRVAR (name, str) + + Creates a variable with name ‘name’ that can be used in docstrings. + If Python is built without docstrings, the value will be empty. + + Use *note PyDoc_STRVAR: 138a. for docstrings to support building + Python without docstrings, as specified in PEP 7(2). + + Example: + + PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element."); + + static PyMethodDef deque_methods[] = { + // ... + {"pop", (PyCFunction)deque_pop, METH_NOARGS, pop_doc}, + // ... + } + + -- C Macro: PyDoc_STR (str) + + Creates a docstring for the given input string or an empty string + if docstrings are disabled. + + Use *note PyDoc_STR: 42c4. in specifying docstrings to support + building Python without docstrings, as specified in PEP 7(3). + + Example: + + static PyMethodDef pysqlite_row_methods[] = { + {"keys", (PyCFunction)pysqlite_row_keys, METH_NOARGS, + PyDoc_STR("Returns the keys of the row.")}, + {NULL, NULL} + }; + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=33720 + + (2) https://peps.python.org/pep-0007/ + + (3) https://peps.python.org/pep-0007/ + + +File: python.info, Node: Objects Types and Reference Counts, Next: Exceptions<19>, Prev: Useful macros, Up: Introduction<12> + +7.1.4 Objects, Types and Reference Counts +----------------------------------------- + +Most Python/C API functions have one or more arguments as well as a +return value of type *note PyObject: 4cf.*. 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 *note PyObject: 4cf, only pointer +variables of type *note PyObject: 4cf.* can be declared. The sole +exception are the type objects; since these must never be deallocated, +they are typically static *note PyTypeObject: 701. 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 *note The standard type hierarchy: 18f3.). For each of the +well-known types there is a macro to check whether an object is of that +type; for instance, ‘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:: + + +File: python.info, Node: Reference Counts<2>, Next: Types, Up: Objects Types and Reference Counts + +7.1.4.1 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 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 an object’s reference count becomes +zero, the object is deallocated. If it contains references to other +objects, their reference count is decremented. Those other objects may +be deallocated in turn, if this decrement makes their reference count +become zero, and so on. (There’s an obvious problem with objects that +reference each other here; for now, the solution is “don’t do that.”) + +Reference counts are always manipulated explicitly. The normal way is +to use the macro *note Py_INCREF(): 4cc. to increment an object’s +reference count by one, and *note Py_DECREF(): 4cd. to decrement it by +one. The *note Py_DECREF(): 4cd. 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 decrementing the +reference counts 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 ‘sizeof(Py_ssize_t) >= sizeof(void*)’). Thus, the reference +count increment is a simple operation. + +It is not necessary to increment an object’s 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 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 incrementing its reference count. Some +other operation might conceivably remove the object from the list, +decrementing its reference count 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 *note Py_DECREF(): 4cd, so almost any +operation is potentially dangerous. + +A safe approach is to always use the generic operations (functions whose +name begins with ‘PyObject_’, ‘PyNumber_’, ‘PySequence_’ or +‘PyMapping_’). These operations always increment the reference count of +the object they return. This leaves the caller with the responsibility +to call *note Py_DECREF(): 4cd. when they are done with the result; this +soon becomes second nature. + +* Menu: + +* Reference Count Details:: + + +File: python.info, Node: Reference Count Details, Up: Reference Counts<2> + +7.1.4.2 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 decref’ing it by +calling *note Py_DECREF(): 4cd. or *note Py_XDECREF(): 363. 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 *note borrowed reference: 42cb. + +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. + +Few functions steal references; the two notable exceptions are *note +PyList_SetItem(): 424c. and *note PyTuple_SetItem(): 424b, 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 ‘(1, 2, "three")’ +could look like this (forgetting about error handling for the moment; a +better way to code this is shown below): + + 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")); + +Here, *note PyLong_FromLong(): 122c. returns a new reference which is +immediately stolen by *note PyTuple_SetItem(): 424b. When you want to +keep using an object although the reference to it will be stolen, use +*note Py_INCREF(): 4cc. to grab another reference before calling the +reference-stealing function. + +Incidentally, *note PyTuple_SetItem(): 424b. is the `only' way to set +tuple items; *note PySequence_SetItem(): 1495. and *note +PyObject_SetItem(): 42cc. refuse to do this since tuples are an +immutable data type. You should only use *note PyTuple_SetItem(): 424b. +for tuples that you are creating yourself. + +Equivalent code for populating a list can be written using *note +PyList_New(): 42cd. and *note PyList_SetItem(): 424c. + +However, in practice, you will rarely use these ways of creating and +populating a tuple or list. There’s a generic function, *note +Py_BuildValue(): 4da, 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): + + PyObject *tuple, *list; + + tuple = Py_BuildValue("(iis)", 1, 2, "three"); + list = Py_BuildValue("[iis]", 1, 2, "three"); + +It is much more common to use *note PyObject_SetItem(): 42cc. 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 reference counts is much saner, since +you don’t have to increment a reference count so you can give a +reference away (“have it be stolen”). For example, this function sets +all items of a list (actually, any mutable sequence) to a given item: + + 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; + } + +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 *note +PyObject_GetItem(): 42ce. and *note PySequence_GetItem(): 1494, 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 *note +PyList_GetItem(): 4248, you don’t own the reference — but if you obtain +the same item from the same list using *note PySequence_GetItem(): 1494. +(which happens to take exactly the same arguments), you do own a +reference to the returned object. + +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 *note +PyList_GetItem(): 4248, and once using *note PySequence_GetItem(): 1494. + + 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; + } + + 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; + } + + +File: python.info, Node: Types, Prev: Reference Counts<2>, Up: Objects Types and Reference Counts + +7.1.4.3 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. + + -- C Type: type Py_ssize_t + ` Part of the *note Stable ABI: 4b8.' A signed integral type such + that ‘sizeof(Py_ssize_t) == sizeof(size_t)’. C99 doesn’t define + such a thing directly (size_t is an unsigned integral type). See + PEP 353(1) for details. ‘PY_SSIZE_T_MAX’ is the largest positive + value of type *note Py_ssize_t: 6b1. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0353/ + + +File: python.info, Node: Exceptions<19>, Next: Embedding Python<2>, Prev: Objects Types and Reference Counts, Up: Introduction<12> + +7.1.5 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. + +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 ‘NULL’ +or ‘-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 +*note PyErr_Occurred(): 12f8. These exceptions are always explicitly +documented. + +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 +*note PyErr_Occurred(): 12f8. can be used to check for this: it returns +a borrowed reference to the exception type object when an exception has +occurred, and ‘NULL’ otherwise. There are a number of functions to set +the exception state: *note PyErr_SetString(): 422b. is the most common +(though not the most general) function to set the exception state, and +*note PyErr_Clear(): cde. clears the exception state. + +The full exception state consists of three objects (all of which can be +‘NULL’): the exception type, the corresponding exception value, and the +traceback. These have the same meanings as the Python result of +‘sys.exc_info()’; however, they are not the same: the Python objects +represent the last exception being handled by a Python *note try: 1073. +… *note except: 17a. 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 ‘sys.exc_info()’ and friends. + +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 +*note sys.exc_info(): 25b, 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. + +A simple example of detecting exceptions and passing them on is shown in +the ‘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: + + def incr_item(dict, key): + try: + item = dict[key] + except KeyError: + item = 0 + dict[key] = item + 1 + +Here is the corresponding C code, in all its glory: + + 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 */ + } + +This example represents an endorsed use of the ‘goto’ statement in C! It +illustrates the use of *note PyErr_ExceptionMatches(): 42d3. and *note +PyErr_Clear(): cde. to handle specific exceptions, and the use of *note +Py_XDECREF(): 363. to dispose of owned references that may be ‘NULL’ +(note the ‘'X'’ in the name; *note Py_DECREF(): 4cd. would crash when +confronted with a ‘NULL’ reference). It is important that the variables +used to hold owned references are initialized to ‘NULL’ for this to +work; likewise, the proposed return value is initialized to ‘-1’ +(failure) and only set to success after the final call made is +successful. + + +File: python.info, Node: Embedding Python<2>, Next: Debugging Builds, Prev: Exceptions<19>, Up: Introduction<12> + +7.1.6 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. + +The basic initialization function is *note Py_Initialize(): 4e7. This +initializes the table of loaded modules, and creates the fundamental +modules *note builtins: 11, *note __main__: 1, and *note sys: f9. It +also initializes the module search path (‘sys.path’). + +*note Py_Initialize(): 4e7. does not set the “script argument list” +(‘sys.argv’). If this variable is needed by Python code that will be +executed later, setting *note PyConfig.argv: 132e. and *note +PyConfig.parse_argv: 132f. must be set: see *note Python Initialization +Configuration: 371. + +On most systems (in particular, on Unix and Windows, although the +details are slightly different), *note Py_Initialize(): 4e7. 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 +‘lib/python`X.Y'’ relative to the parent directory where the executable +named ‘python’ is found on the shell command search path (the +environment variable ‘PATH’). + +For instance, if the Python executable is found in +‘/usr/local/bin/python’, it will assume that the libraries are in +‘/usr/local/lib/python`X.Y'’. (In fact, this particular path is also +the “fallback” location, used when no executable file named ‘python’ is +found along ‘PATH’.) The user can override this behavior by setting the +environment variable *note PYTHONHOME: 8ae, or insert additional +directories in front of the standard path by setting *note PYTHONPATH: +cc7. + +The embedding application can steer the search by calling +‘Py_SetProgramName(file)’ `before' calling *note Py_Initialize(): 4e7. +Note that *note PYTHONHOME: 8ae. still overrides this and *note +PYTHONPATH: cc7. is still inserted in front of the standard path. An +application that requires total control has to provide its own +implementation of *note Py_GetPath(): 4e1, *note Py_GetPrefix(): 4e2, +*note Py_GetExecPrefix(): 4e3, and *note Py_GetProgramFullPath(): 4e4. +(all defined in ‘Modules/getpath.c’). + +Sometimes, it is desirable to “uninitialize” Python. For instance, the +application may want to start over (make another call to *note +Py_Initialize(): 4e7.) 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 *note Py_FinalizeEx(): 986. The function *note +Py_IsInitialized(): 42d6. returns true if Python is currently in the +initialized state. More information about these functions is given in a +later chapter. Notice that *note Py_FinalizeEx(): 986. does `not' free +all memory allocated by the Python interpreter, e.g. memory allocated +by extension modules currently cannot be released. + + +File: python.info, Node: Debugging Builds, Prev: Embedding Python<2>, Up: Introduction<12> + +7.1.7 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 +‘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. + +Compiling the interpreter with the ‘Py_DEBUG’ macro defined produces +what is generally meant by *note a debug build of Python: 496. +‘Py_DEBUG’ is enabled in the Unix build by adding *note –with-pydebug: +17c4. to the ‘./configure’ command. It is also implied by the presence +of the not-Python-specific ‘_DEBUG’ macro. When ‘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 *note Python Debug Build: 496. + +Defining ‘Py_TRACE_REFS’ enables reference tracing (see the *note +configure –with-trace-refs option: 4d0.). When defined, a circular +doubly linked list of active objects is maintained by adding two extra +fields to every *note PyObject: 4cf. 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 ‘Misc/SpecialBuilds.txt’ in the Python source +distribution for more detailed information. + + +File: python.info, Node: C API Stability, Next: The Very High Level Layer, Prev: Introduction<12>, Up: Python/C API Reference Manual + +7.2 C API Stability +=================== + +Python’s C API is covered by the Backwards Compatibility Policy, PEP +387(1). While the C API will change with every minor release (e.g. +from 3.9 to 3.10), most changes will be 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 *note Platform Considerations: 42db. 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.10.x. + +Names prefixed by an underscore, such as ‘_Py_InternalState’, are +private API that can change without notice even in patch releases. + +* Menu: + +* Stable Application Binary Interface:: +* Platform Considerations:: +* Contents of Limited API:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0387/ + + +File: python.info, Node: Stable Application Binary Interface, Next: Platform Considerations, Up: C API Stability + +7.2.1 Stable Application Binary Interface +----------------------------------------- + +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 work +with multiple versions of Python. Contents of the Limited API are *note +listed below: 386. + +To enable this, Python provides a `Stable ABI': a set of symbols that +will remain compatible across Python 3.x versions. The Stable ABI +contains symbols exposed in the Limited API, but also other ones – for +example, functions necessary to support older versions of the Limited +API. + +(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.) + + -- C Macro: Py_LIMITED_API + + Define this macro before including ‘Python.h’ to opt in to only use + the Limited API, and to select the Limited API version. + + Define ‘Py_LIMITED_API’ to the value of *note PY_VERSION_HEX: 326. + corresponding to the lowest Python version your extension supports. + The extension will work without recompilation with all Python 3 + releases from the specified one onward, and can use Limited API + introduced up to that version. + + Rather than using the ‘PY_VERSION_HEX’ macro directly, hardcode a + minimum minor version (e.g. ‘0x030A0000’ for Python 3.10) for + stability when compiling with future Python versions. + + You can also define ‘Py_LIMITED_API’ to ‘3’. This works the same + as ‘0x03020000’ (Python 3.2, the version that introduced Limited + API). + +On Windows, extensions that use the Stable ABI should be linked against +‘python3.dll’ rather than a version-specific library such as +‘python39.dll’. + +On some platforms, Python will look for and load shared library files +named with the ‘abi3’ tag (e.g. ‘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. + +* Menu: + +* Limited API Scope and Performance:: +* Limited API Caveats:: + + +File: python.info, Node: Limited API Scope and Performance, Next: Limited API Caveats, Up: Stable Application Binary Interface + +7.2.1.1 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 *note PyList_GetItem(): 4248. is available, its +“unsafe” macro variant *note PyList_GET_ITEM(): 42de. is not. The macro +can be faster because it can rely on version-specific implementation +details of the list object. + +Without ‘Py_LIMITED_API’ defined, some C API functions are inlined or +replaced by macros. Defining ‘Py_LIMITED_API’ disables this inlining, +allowing stability as Python’s data structures are improved, but +possibly reducing performance. + +By leaving out the ‘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 ‘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. + + +File: python.info, Node: Limited API Caveats, Prev: Limited API Scope and Performance, Up: Stable Application Binary Interface + +7.2.1.2 Limited API Caveats +........................... + +Note that compiling with ‘Py_LIMITED_API’ is `not' a complete guarantee +that code conforms to the Limited API or the Stable ABI. +‘Py_LIMITED_API’ only covers definitions, but an API also includes other +issues, such as expected semantics. + +One issue that ‘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 ‘NULL’ for an +argument. In Python 3.9, ‘NULL’ now selects a default behavior, but in +Python 3.8, the argument will be used directly, causing a ‘NULL’ +dereference and crash. A similar argument works for fields of structs. + +Another issue is that some struct fields are currently not hidden when +‘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 ‘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 +‘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. + + +File: python.info, Node: Platform Considerations, Next: Contents of Limited API, Prev: Stable Application Binary Interface, Up: C API Stability + +7.2.2 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 +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 ‘python.org’ and many third-party distributors. + + +File: python.info, Node: Contents of Limited API, Prev: Platform Considerations, Up: C API Stability + +7.2.3 Contents of Limited API +----------------------------- + +Currently, the Limited API includes the following items: + + * *note PyAIter_Check(): 42e2. + + * *note PyArg_Parse(): 140d. + + * *note PyArg_ParseTuple(): 4d9. + + * *note PyArg_ParseTupleAndKeywords(): 987. + + * *note PyArg_UnpackTuple(): 1141. + + * *note PyArg_VaParse(): 42e3. + + * *note PyArg_VaParseTupleAndKeywords(): 10d8. + + * *note PyArg_ValidateKeywordArguments(): 42e4. + + * ‘PyBaseObject_Type’ + + * *note PyBool_FromLong(): 42e5. + + * ‘PyBool_Type’ + + * *note PyBuffer_FillContiguousStrides(): 32f. + + * *note PyBuffer_FillInfo(): 330. + + * *note PyBuffer_FromContiguous(): 32d. + + * *note PyBuffer_GetPointer(): 32a. + + * *note PyBuffer_IsContiguous(): 32e. + + * *note PyBuffer_Release(): 331. + + * *note PyBuffer_SizeFromFormat(): 32b. + + * *note PyBuffer_ToContiguous(): 32c. + + * ‘PyByteArrayIter_Type’ + + * *note PyByteArray_AsString(): 42e6. + + * *note PyByteArray_Concat(): 42e7. + + * *note PyByteArray_FromObject(): 1027. + + * *note PyByteArray_FromStringAndSize(): 1028. + + * *note PyByteArray_Resize(): 42e8. + + * *note PyByteArray_Size(): 42e9. + + * *note PyByteArray_Type: 42ea. + + * ‘PyBytesIter_Type’ + + * *note PyBytes_AsString(): 4ae. + + * *note PyBytes_AsStringAndSize(): 42eb. + + * *note PyBytes_Concat(): 42ec. + + * *note PyBytes_ConcatAndDel(): 42ed. + + * ‘PyBytes_DecodeEscape()’ + + * *note PyBytes_FromFormat(): 145b. + + * *note PyBytes_FromFormatV(): 42ee. + + * *note PyBytes_FromObject(): 42ef. + + * *note PyBytes_FromString(): 42f0. + + * *note PyBytes_FromStringAndSize(): 1026. + + * ‘PyBytes_Repr()’ + + * *note PyBytes_Size(): 42f1. + + * *note PyBytes_Type: 42f2. + + * *note PyCFunction: 10d9. + + * *note PyCFunctionWithKeywords: 42f3. + + * ‘PyCFunction_Call()’ + + * ‘PyCFunction_GetFlags()’ + + * ‘PyCFunction_GetFunction()’ + + * ‘PyCFunction_GetSelf()’ + + * ‘PyCFunction_New()’ + + * ‘PyCFunction_NewEx()’ + + * ‘PyCFunction_Type’ + + * ‘PyCMethod_New()’ + + * *note PyCallIter_New(): 42f4. + + * *note PyCallIter_Type: 42f5. + + * *note PyCallable_Check(): 42f6. + + * *note PyCapsule_Destructor: 42f7. + + * *note PyCapsule_GetContext(): 42f8. + + * *note PyCapsule_GetDestructor(): 42f9. + + * *note PyCapsule_GetName(): 42fa. + + * *note PyCapsule_GetPointer(): 42fb. + + * *note PyCapsule_Import(): 1266. + + * *note PyCapsule_IsValid(): ff7. + + * *note PyCapsule_New(): 4256. + + * *note PyCapsule_SetContext(): 42fc. + + * *note PyCapsule_SetDestructor(): 42fd. + + * *note PyCapsule_SetName(): 42fe. + + * *note PyCapsule_SetPointer(): 42ff. + + * ‘PyCapsule_Type’ + + * ‘PyClassMethodDescr_Type’ + + * *note PyCodec_BackslashReplaceErrors(): 4300. + + * *note PyCodec_Decode(): 4301. + + * *note PyCodec_Decoder(): 4302. + + * *note PyCodec_Encode(): 4303. + + * *note PyCodec_Encoder(): 4304. + + * *note PyCodec_IgnoreErrors(): 4305. + + * *note PyCodec_IncrementalDecoder(): 4306. + + * *note PyCodec_IncrementalEncoder(): 4307. + + * *note PyCodec_KnownEncoding(): 4308. + + * *note PyCodec_LookupError(): 4309. + + * *note PyCodec_NameReplaceErrors(): b3d. + + * *note PyCodec_Register(): 430a. + + * *note PyCodec_RegisterError(): 430b. + + * *note PyCodec_ReplaceErrors(): 430c. + + * *note PyCodec_StreamReader(): 430d. + + * *note PyCodec_StreamWriter(): 430e. + + * *note PyCodec_StrictErrors(): 430f. + + * *note PyCodec_Unregister(): 4c0. + + * *note PyCodec_XMLCharRefReplaceErrors(): 4310. + + * *note PyComplex_FromDoubles(): 4311. + + * *note PyComplex_ImagAsDouble(): 4312. + + * *note PyComplex_RealAsDouble(): 4313. + + * *note PyComplex_Type: 4314. + + * *note PyDescr_NewClassMethod(): 4315. + + * *note PyDescr_NewGetSet(): 4316. + + * *note PyDescr_NewMember(): 4317. + + * *note PyDescr_NewMethod(): 13a5. + + * ‘PyDictItems_Type’ + + * ‘PyDictIterItem_Type’ + + * ‘PyDictIterKey_Type’ + + * ‘PyDictIterValue_Type’ + + * ‘PyDictKeys_Type’ + + * *note PyDictProxy_New(): 4318. + + * ‘PyDictProxy_Type’ + + * ‘PyDictRevIterItem_Type’ + + * ‘PyDictRevIterKey_Type’ + + * ‘PyDictRevIterValue_Type’ + + * ‘PyDictValues_Type’ + + * *note PyDict_Clear(): 4319. + + * *note PyDict_Contains(): 431a. + + * *note PyDict_Copy(): 431b. + + * *note PyDict_DelItem(): 431c. + + * *note PyDict_DelItemString(): 431d. + + * *note PyDict_GetItem(): 4de. + + * *note PyDict_GetItemString(): 4249. + + * *note PyDict_GetItemWithError(): 431e. + + * *note PyDict_Items(): 431f. + + * *note PyDict_Keys(): 4320. + + * *note PyDict_Merge(): 4321. + + * *note PyDict_MergeFromSeq2(): 4322. + + * *note PyDict_New(): 4323. + + * *note PyDict_Next(): 4324. + + * *note PyDict_SetItem(): 424d. + + * *note PyDict_SetItemString(): 4325. + + * *note PyDict_Size(): 4326. + + * *note PyDict_Type: 4327. + + * *note PyDict_Update(): 4328. + + * *note PyDict_Values(): 4329. + + * ‘PyEllipsis_Type’ + + * ‘PyEnum_Type’ + + * *note PyErr_BadArgument(): 432a. + + * *note PyErr_BadInternalCall(): 432b. + + * *note PyErr_CheckSignals(): 432c. + + * *note PyErr_Clear(): cde. + + * ‘PyErr_Display()’ + + * *note PyErr_ExceptionMatches(): 42d3. + + * *note PyErr_Fetch(): cdd. + + * *note PyErr_Format(): b3f. + + * *note PyErr_FormatV(): b3e. + + * *note PyErr_GetExcInfo(): 344. + + * *note PyErr_GetHandledException(): 341. + + * *note PyErr_GivenExceptionMatches(): 432d. + + * *note PyErr_NewException(): f24. + + * *note PyErr_NewExceptionWithDoc(): f23. + + * *note PyErr_NoMemory(): 422e. + + * *note PyErr_NormalizeException(): 1414. + + * *note PyErr_Occurred(): 12f8. + + * *note PyErr_Print(): 1353. + + * *note PyErr_PrintEx(): 432e. + + * ‘PyErr_ProgramText()’ + + * *note PyErr_ResourceWarning(): 989. + + * *note PyErr_Restore(): 4277. + + * *note PyErr_SetExcFromWindowsErr(): 432f. + + * *note PyErr_SetExcFromWindowsErrWithFilename(): 4330. + + * *note PyErr_SetExcFromWindowsErrWithFilenameObject(): 4331. + + * *note PyErr_SetExcFromWindowsErrWithFilenameObjects(): 4332. + + * *note PyErr_SetExcInfo(): 343. + + * *note PyErr_SetFromErrno(): 422c. + + * *note PyErr_SetFromErrnoWithFilename(): 4333. + + * *note PyErr_SetFromErrnoWithFilenameObject(): 4334. + + * *note PyErr_SetFromErrnoWithFilenameObjects(): 4335. + + * *note PyErr_SetFromWindowsErr(): 4336. + + * *note PyErr_SetFromWindowsErrWithFilename(): 4337. + + * *note PyErr_SetHandledException(): 342. + + * *note PyErr_SetImportError(): 9b2. + + * *note PyErr_SetImportErrorSubclass(): 988. + + * *note PyErr_SetInterrupt(): 4338. + + * *note PyErr_SetInterruptEx(): 4cb. + + * *note PyErr_SetNone(): 4339. + + * *note PyErr_SetObject(): 422d. + + * *note PyErr_SetString(): 422b. + + * *note PyErr_SyntaxLocation(): 433a. + + * *note PyErr_SyntaxLocationEx(): 433b. + + * *note PyErr_WarnEx(): 10b0. + + * *note PyErr_WarnExplicit(): 433c. + + * *note PyErr_WarnFormat(): 433d. + + * *note PyErr_WriteUnraisable(): 1413. + + * *note PyEval_AcquireLock(): 6e1. + + * *note PyEval_AcquireThread(): 6e2. + + * ‘PyEval_CallFunction()’ + + * ‘PyEval_CallMethod()’ + + * ‘PyEval_CallObjectWithKeywords()’ + + * *note PyEval_EvalCode(): 4ab. + + * *note PyEval_EvalCodeEx(): 11fb. + + * *note PyEval_EvalFrame(): 433e. + + * *note PyEval_EvalFrameEx(): cda. + + * *note PyEval_GetBuiltins(): 433f. + + * *note PyEval_GetFrame(): 1182. + + * *note PyEval_GetFuncDesc(): 4340. + + * *note PyEval_GetFuncName(): 4341. + + * *note PyEval_GetGlobals(): 4342. + + * *note PyEval_GetLocals(): 4343. + + * *note PyEval_InitThreads(): 592. + + * *note PyEval_ReleaseLock(): f33. + + * *note PyEval_ReleaseThread(): 4344. + + * *note PyEval_RestoreThread(): 6e3. + + * *note PyEval_SaveThread(): f34. + + * *note PyEval_ThreadsInitialized(): 593. + + * ‘PyExc_ArithmeticError’ + + * ‘PyExc_AssertionError’ + + * ‘PyExc_AttributeError’ + + * ‘PyExc_BaseException’ + + * ‘PyExc_BaseExceptionGroup’ + + * ‘PyExc_BlockingIOError’ + + * ‘PyExc_BrokenPipeError’ + + * ‘PyExc_BufferError’ + + * ‘PyExc_BytesWarning’ + + * ‘PyExc_ChildProcessError’ + + * ‘PyExc_ConnectionAbortedError’ + + * ‘PyExc_ConnectionError’ + + * ‘PyExc_ConnectionRefusedError’ + + * ‘PyExc_ConnectionResetError’ + + * ‘PyExc_DeprecationWarning’ + + * ‘PyExc_EOFError’ + + * ‘PyExc_EncodingWarning’ + + * ‘PyExc_EnvironmentError’ + + * ‘PyExc_Exception’ + + * ‘PyExc_FileExistsError’ + + * ‘PyExc_FileNotFoundError’ + + * ‘PyExc_FloatingPointError’ + + * ‘PyExc_FutureWarning’ + + * ‘PyExc_GeneratorExit’ + + * ‘PyExc_IOError’ + + * ‘PyExc_ImportError’ + + * ‘PyExc_ImportWarning’ + + * ‘PyExc_IndentationError’ + + * ‘PyExc_IndexError’ + + * ‘PyExc_InterruptedError’ + + * ‘PyExc_IsADirectoryError’ + + * ‘PyExc_KeyError’ + + * ‘PyExc_KeyboardInterrupt’ + + * ‘PyExc_LookupError’ + + * ‘PyExc_MemoryError’ + + * ‘PyExc_ModuleNotFoundError’ + + * ‘PyExc_NameError’ + + * ‘PyExc_NotADirectoryError’ + + * ‘PyExc_NotImplementedError’ + + * ‘PyExc_OSError’ + + * ‘PyExc_OverflowError’ + + * ‘PyExc_PendingDeprecationWarning’ + + * ‘PyExc_PermissionError’ + + * ‘PyExc_ProcessLookupError’ + + * ‘PyExc_RecursionError’ + + * ‘PyExc_ReferenceError’ + + * ‘PyExc_ResourceWarning’ + + * ‘PyExc_RuntimeError’ + + * ‘PyExc_RuntimeWarning’ + + * ‘PyExc_StopAsyncIteration’ + + * ‘PyExc_StopIteration’ + + * ‘PyExc_SyntaxError’ + + * ‘PyExc_SyntaxWarning’ + + * ‘PyExc_SystemError’ + + * ‘PyExc_SystemExit’ + + * ‘PyExc_TabError’ + + * ‘PyExc_TimeoutError’ + + * ‘PyExc_TypeError’ + + * ‘PyExc_UnboundLocalError’ + + * ‘PyExc_UnicodeDecodeError’ + + * ‘PyExc_UnicodeEncodeError’ + + * ‘PyExc_UnicodeError’ + + * ‘PyExc_UnicodeTranslateError’ + + * ‘PyExc_UnicodeWarning’ + + * ‘PyExc_UserWarning’ + + * ‘PyExc_ValueError’ + + * ‘PyExc_Warning’ + + * ‘PyExc_WindowsError’ + + * ‘PyExc_ZeroDivisionError’ + + * ‘PyExceptionClass_Name()’ + + * *note PyException_GetCause(): 4345. + + * *note PyException_GetContext(): 4346. + + * *note PyException_GetTraceback(): 4347. + + * *note PyException_SetCause(): 4348. + + * *note PyException_SetContext(): 4349. + + * *note PyException_SetTraceback(): 1415. + + * *note PyFile_FromFd(): 434a. + + * *note PyFile_GetLine(): 434b. + + * *note PyFile_WriteObject(): 434c. + + * *note PyFile_WriteString(): 434d. + + * ‘PyFilter_Type’ + + * *note PyFloat_AsDouble(): 6bb. + + * *note PyFloat_FromDouble(): 434e. + + * *note PyFloat_FromString(): 434f. + + * *note PyFloat_GetInfo(): 1057. + + * *note PyFloat_GetMax(): 1055. + + * *note PyFloat_GetMin(): 1056. + + * *note PyFloat_Type: 4350. + + * *note PyFrameObject: 35d. + + * *note PyFrame_GetCode(): 35e. + + * *note PyFrame_GetLineNumber(): 35f. + + * *note PyFrozenSet_New(): 10ab. + + * *note PyFrozenSet_Type: 4351. + + * *note PyGC_Collect(): 5e4. + + * *note PyGC_Disable(): 4d6. + + * *note PyGC_Enable(): 4d5. + + * *note PyGC_IsEnabled(): 4d7. + + * *note PyGILState_Ensure(): 6e5. + + * *note PyGILState_GetThisThreadState(): 4352. + + * *note PyGILState_Release(): 4353. + + * ‘PyGILState_STATE’ + + * *note PyGetSetDef: 81b. + + * ‘PyGetSetDescr_Type’ + + * *note PyImport_AddModule(): 424a. + + * *note PyImport_AddModuleObject(): 4354. + + * *note PyImport_AppendInittab(): 12bc. + + * *note PyImport_ExecCodeModule(): 4355. + + * *note PyImport_ExecCodeModuleEx(): 4356. + + * *note PyImport_ExecCodeModuleObject(): 4357. + + * *note PyImport_ExecCodeModuleWithPathnames(): 4358. + + * *note PyImport_GetImporter(): 4359. + + * *note PyImport_GetMagicNumber(): e57. + + * *note PyImport_GetMagicTag(): 435a. + + * *note PyImport_GetModule(): 816. + + * *note PyImport_GetModuleDict(): 435b. + + * *note PyImport_Import(): 1060. + + * *note PyImport_ImportFrozenModule(): 435c. + + * *note PyImport_ImportFrozenModuleObject(): 435d. + + * *note PyImport_ImportModule(): 4ac. + + * *note PyImport_ImportModuleLevel(): e58. + + * *note PyImport_ImportModuleLevelObject(): 435e. + + * *note PyImport_ImportModuleNoBlock(): d2b. + + * *note PyImport_ReloadModule(): 435f. + + * *note PyIndex_Check(): 5e0. + + * *note PyInterpreterState: 4fa. + + * *note PyInterpreterState_Clear(): 3a40. + + * *note PyInterpreterState_Delete(): 4360. + + * *note PyInterpreterState_Get(): 5c5. + + * *note PyInterpreterState_GetDict(): 4361. + + * *note PyInterpreterState_GetID(): 82c. + + * *note PyInterpreterState_New(): 3a41. + + * *note PyIter_Check(): 12fa. + + * *note PyIter_Next(): 4362. + + * *note PyIter_Send(): 4c1. + + * ‘PyListIter_Type’ + + * ‘PyListRevIter_Type’ + + * *note PyList_Append(): 4363. + + * *note PyList_AsTuple(): 4364. + + * *note PyList_GetItem(): 4248. + + * *note PyList_GetSlice(): 4365. + + * *note PyList_Insert(): 4366. + + * *note PyList_New(): 42cd. + + * *note PyList_Reverse(): 4367. + + * *note PyList_SetItem(): 424c. + + * *note PyList_SetSlice(): 4368. + + * *note PyList_Size(): 107e. + + * *note PyList_Sort(): 4369. + + * *note PyList_Type: 4271. + + * *note PyLongObject: 436a. + + * ‘PyLongRangeIter_Type’ + + * *note PyLong_AsDouble(): 436b. + + * *note PyLong_AsLong(): 6b7. + + * *note PyLong_AsLongAndOverflow(): f21. + + * *note PyLong_AsLongLong(): 436c. + + * *note PyLong_AsLongLongAndOverflow(): f20. + + * *note PyLong_AsSize_t(): 436d. + + * *note PyLong_AsSsize_t(): 436e. + + * *note PyLong_AsUnsignedLong(): 436f. + + * *note PyLong_AsUnsignedLongLong(): f43. + + * *note PyLong_AsUnsignedLongLongMask(): 140e. + + * *note PyLong_AsUnsignedLongMask(): 4370. + + * *note PyLong_AsVoidPtr(): 4371. + + * *note PyLong_FromDouble(): 58a. + + * *note PyLong_FromLong(): 122c. + + * *note PyLong_FromLongLong(): 122d. + + * *note PyLong_FromSize_t(): 13e4. + + * *note PyLong_FromSsize_t(): 4372. + + * *note PyLong_FromString(): 4373. + + * *note PyLong_FromUnsignedLong(): 13e2. + + * *note PyLong_FromUnsignedLongLong(): 13e3. + + * *note PyLong_FromVoidPtr(): 4374. + + * ‘PyLong_GetInfo()’ + + * *note PyLong_Type: 4375. + + * ‘PyMap_Type’ + + * *note PyMapping_Check(): 4376. + + * *note PyMapping_GetItemString(): 4377. + + * *note PyMapping_HasKey(): 4378. + + * *note PyMapping_HasKeyString(): 4379. + + * *note PyMapping_Items(): 821. + + * *note PyMapping_Keys(): 81f. + + * *note PyMapping_Length(): 437a. + + * *note PyMapping_SetItemString(): 437b. + + * *note PyMapping_Size(): 1497. + + * *note PyMapping_Values(): 820. + + * *note PyMem_Calloc(): b3b. + + * *note PyMem_Free(): 10a8. + + * *note PyMem_Malloc(): 8d7. + + * *note PyMem_Realloc(): ce1. + + * *note PyMemberDef: 81a. + + * ‘PyMemberDescr_Type’ + + * *note PyMemoryView_FromBuffer(): 332. + + * *note PyMemoryView_FromMemory(): e24. + + * *note PyMemoryView_FromObject(): 437c. + + * *note PyMemoryView_GetContiguous(): 437d. + + * ‘PyMemoryView_Type’ + + * *note PyMethodDef: 1119. + + * ‘PyMethodDescr_Type’ + + * *note PyModuleDef: 5d2. + + * ‘PyModuleDef_Base’ + + * *note PyModuleDef_Init(): 437e. + + * ‘PyModuleDef_Type’ + + * *note PyModule_AddFunctions(): 437f. + + * *note PyModule_AddIntConstant(): 4380. + + * *note PyModule_AddObject(): 4c4. + + * *note PyModule_AddObjectRef(): 4c3. + + * *note PyModule_AddStringConstant(): 4381. + + * *note PyModule_AddType(): 5ca. + + * *note PyModule_Create2(): 4382. + + * *note PyModule_ExecDef(): b42. + + * *note PyModule_FromDefAndSpec2(): b41. + + * *note PyModule_GetDef(): 4383. + + * *note PyModule_GetDict(): 4384. + + * *note PyModule_GetFilename(): 4385. + + * *note PyModule_GetFilenameObject(): 4386. + + * *note PyModule_GetName(): 4387. + + * *note PyModule_GetNameObject(): 4388. + + * *note PyModule_GetState(): 5d5. + + * *note PyModule_New(): 4389. + + * *note PyModule_NewObject(): 438a. + + * *note PyModule_SetDocString(): 438b. + + * *note PyModule_Type: 438c. + + * *note PyNumber_Absolute(): 438d. + + * *note PyNumber_Add(): 438e. + + * *note PyNumber_And(): 438f. + + * *note PyNumber_AsSsize_t(): 4390. + + * *note PyNumber_Check(): 6b8. + + * *note PyNumber_Divmod(): 4391. + + * *note PyNumber_Float(): 6ba. + + * *note PyNumber_FloorDivide(): 4392. + + * *note PyNumber_InPlaceAdd(): 4393. + + * *note PyNumber_InPlaceAnd(): 4394. + + * *note PyNumber_InPlaceFloorDivide(): 4395. + + * *note PyNumber_InPlaceLshift(): 4396. + + * *note PyNumber_InPlaceMatrixMultiply(): b44. + + * *note PyNumber_InPlaceMultiply(): 4397. + + * *note PyNumber_InPlaceOr(): 4398. + + * *note PyNumber_InPlacePower(): 4399. + + * *note PyNumber_InPlaceRemainder(): 439a. + + * *note PyNumber_InPlaceRshift(): 439b. + + * *note PyNumber_InPlaceSubtract(): 439c. + + * *note PyNumber_InPlaceTrueDivide(): 439d. + + * *note PyNumber_InPlaceXor(): 439e. + + * *note PyNumber_Index(): 4ba. + + * *note PyNumber_Invert(): 439f. + + * *note PyNumber_Long(): 6b9. + + * *note PyNumber_Lshift(): 43a0. + + * *note PyNumber_MatrixMultiply(): b43. + + * *note PyNumber_Multiply(): 43a1. + + * *note PyNumber_Negative(): 43a2. + + * *note PyNumber_Or(): 43a3. + + * *note PyNumber_Positive(): 43a4. + + * *note PyNumber_Power(): 43a5. + + * *note PyNumber_Remainder(): 43a6. + + * *note PyNumber_Rshift(): 43a7. + + * *note PyNumber_Subtract(): 43a8. + + * *note PyNumber_ToBase(): 13a6. + + * *note PyNumber_TrueDivide(): 43a9. + + * *note PyNumber_Xor(): 43aa. + + * *note PyOS_AfterFork(): 824. + + * *note PyOS_AfterFork_Child(): 6fc. + + * *note PyOS_AfterFork_Parent(): 826. + + * *note PyOS_BeforeFork(): 825. + + * *note PyOS_CheckStack(): 11fd. + + * *note PyOS_FSPath(): 98a. + + * *note PyOS_InputHook: 43ab. + + * ‘PyOS_InterruptOccurred()’ + + * *note PyOS_double_to_string(): 43ac. + + * *note PyOS_getsig(): 43ad. + + * ‘PyOS_mystricmp()’ + + * ‘PyOS_mystrnicmp()’ + + * *note PyOS_setsig(): 43ae. + + * ‘PyOS_sighandler_t’ + + * *note PyOS_snprintf(): 1144. + + * *note PyOS_string_to_double(): f44. + + * ‘PyOS_strtol()’ + + * ‘PyOS_strtoul()’ + + * *note PyOS_vsnprintf(): 1145. + + * *note PyObject: 4cf. + + * *note PyObject.ob_refcnt: 4ce. + + * *note PyObject.ob_type: 43af. + + * *note PyObject_ASCII(): 43b0. + + * *note PyObject_AsCharBuffer(): 43b1. + + * *note PyObject_AsFileDescriptor(): 43b2. + + * *note PyObject_AsReadBuffer(): 43b3. + + * *note PyObject_AsWriteBuffer(): 43b4. + + * *note PyObject_Bytes(): 43b5. + + * *note PyObject_Call(): 5b9. + + * *note PyObject_CallFunction(): 6fd. + + * *note PyObject_CallFunctionObjArgs(): 43b6. + + * *note PyObject_CallMethod(): 4ad. + + * *note PyObject_CallMethodObjArgs(): 142d. + + * *note PyObject_CallNoArgs(): 5c7. + + * *note PyObject_CallObject(): 423b. + + * *note PyObject_Calloc(): b3c. + + * *note PyObject_CheckBuffer(): 328. + + * *note PyObject_CheckReadBuffer(): 43b7. + + * ‘PyObject_ClearWeakRefs()’ + + * *note PyObject_CopyData(): 43b8. + + * *note PyObject_DelItem(): 43b9. + + * ‘PyObject_DelItemString()’ + + * *note PyObject_Dir(): 43ba. + + * ‘PyObject_Format()’ + + * *note PyObject_Free(): 8d6. + + * *note PyObject_GC_Del(): 113e. + + * *note PyObject_GC_IsFinalized(): 5cc. + + * *note PyObject_GC_IsTracked(): 5cb. + + * *note PyObject_GC_Track(): 113f. + + * *note PyObject_GC_UnTrack(): 1140. + + * *note PyObject_GenericGetAttr(): 43bb. + + * *note PyObject_GenericGetDict(): 1344. + + * *note PyObject_GenericSetAttr(): 43bc. + + * *note PyObject_GenericSetDict(): 43bd. + + * *note PyObject_GetAIter(): 43be. + + * *note PyObject_GetAttr(): 43bf. + + * *note PyObject_GetAttrString(): 4246. + + * *note PyObject_GetBuffer(): 329. + + * *note PyObject_GetItem(): 42ce. + + * *note PyObject_GetIter(): 43c0. + + * *note PyObject_HasAttr(): 43c1. + + * *note PyObject_HasAttrString(): 43c2. + + * *note PyObject_Hash(): 373. + + * *note PyObject_HashNotImplemented(): 1034. + + * *note PyObject_Init(): 6bc. + + * *note PyObject_InitVar(): 1368. + + * *note PyObject_IsInstance(): b33. + + * *note PyObject_IsSubclass(): b34. + + * *note PyObject_IsTrue(): 43c3. + + * *note PyObject_Length(): 43c4. + + * *note PyObject_Malloc(): 8d9. + + * *note PyObject_Not(): 43c5. + + * *note PyObject_Realloc(): 10a9. + + * *note PyObject_Repr(): cdb. + + * *note PyObject_RichCompare(): 4285. + + * *note PyObject_RichCompareBool(): 13c0. + + * ‘PyObject_SelfIter()’ + + * *note PyObject_SetAttr(): 43c6. + + * *note PyObject_SetAttrString(): 43c7. + + * *note PyObject_SetItem(): 42cc. + + * *note PyObject_Size(): 43c8. + + * *note PyObject_Str(): cdc. + + * *note PyObject_Type(): 43c9. + + * *note PyProperty_Type: 43ca. + + * ‘PyRangeIter_Type’ + + * ‘PyRange_Type’ + + * ‘PyReversed_Type’ + + * *note PySeqIter_New(): 43cb. + + * *note PySeqIter_Type: 43cc. + + * *note PySequence_Check(): 43cd. + + * *note PySequence_Concat(): 43ce. + + * *note PySequence_Contains(): 43cf. + + * *note PySequence_Count(): 43d0. + + * *note PySequence_DelItem(): 1496. + + * *note PySequence_DelSlice(): 43d1. + + * *note PySequence_Fast(): 43d2. + + * *note PySequence_GetItem(): 1494. + + * *note PySequence_GetSlice(): 43d3. + + * ‘PySequence_In()’ + + * *note PySequence_InPlaceConcat(): 43d4. + + * *note PySequence_InPlaceRepeat(): 43d5. + + * *note PySequence_Index(): 43d6. + + * *note PySequence_Length(): 43d7. + + * *note PySequence_List(): 43d8. + + * *note PySequence_Repeat(): 43d9. + + * *note PySequence_SetItem(): 1495. + + * *note PySequence_SetSlice(): 43da. + + * *note PySequence_Size(): 1493. + + * *note PySequence_Tuple(): 43db. + + * ‘PySetIter_Type’ + + * *note PySet_Add(): 10ac. + + * *note PySet_Clear(): 43dc. + + * *note PySet_Contains(): 10ae. + + * *note PySet_Discard(): 10ad. + + * *note PySet_New(): 10aa. + + * *note PySet_Pop(): 43dd. + + * *note PySet_Size(): 10af. + + * *note PySet_Type: 43de. + + * *note PySlice_AdjustIndices(): 823. + + * *note PySlice_GetIndices(): 43df. + + * *note PySlice_GetIndicesEx(): 85a. + + * *note PySlice_New(): 43e0. + + * *note PySlice_Type: 43e1. + + * *note PySlice_Unpack(): 822. + + * *note PyState_AddModule(): 43e2. + + * *note PyState_FindModule(): 43e3. + + * *note PyState_RemoveModule(): 43e4. + + * *note PyStructSequence_Desc: 81d. + + * *note PyStructSequence_Field: 81c. + + * *note PyStructSequence_GetItem(): 43e5. + + * *note PyStructSequence_New(): 43e6. + + * *note PyStructSequence_NewType(): 43e7. + + * *note PyStructSequence_SetItem(): 43e8. + + * *note PyStructSequence_UnnamedField: 5d8. + + * ‘PySuper_Type’ + + * *note PySys_AddWarnOption(): 367. + + * *note PySys_AddWarnOptionUnicode(): 366. + + * *note PySys_AddXOption(): 368. + + * *note PySys_FormatStderr(): 43e9. + + * *note PySys_FormatStdout(): 43ea. + + * *note PySys_GetObject(): 364. + + * *note PySys_GetXOptions(): 43eb. + + * ‘PySys_HasWarnOptions()’ + + * *note PySys_ResetWarnOptions(): 43ec. + + * *note PySys_SetArgv(): 36a. + + * *note PySys_SetArgvEx(): 369. + + * *note PySys_SetObject(): 43ed. + + * *note PySys_SetPath(): 36b. + + * *note PySys_WriteStderr(): 43ee. + + * *note PySys_WriteStdout(): 43ef. + + * *note PyThreadState: 360. + + * *note PyThreadState_Clear(): 137e. + + * *note PyThreadState_Delete(): 13bd. + + * *note PyThreadState_Get(): 43f0. + + * *note PyThreadState_GetDict(): 43f1. + + * *note PyThreadState_GetFrame(): 361. + + * *note PyThreadState_GetID(): 5c6. + + * *note PyThreadState_GetInterpreter(): 5c4. + + * *note PyThreadState_New(): 43f2. + + * *note PyThreadState_SetAsyncExc(): 82a. + + * *note PyThreadState_Swap(): 43f3. + + * ‘PyThread_GetInfo()’ + + * *note PyThread_ReInitTLS(): 43f4. + + * ‘PyThread_acquire_lock()’ + + * ‘PyThread_acquire_lock_timed()’ + + * ‘PyThread_allocate_lock()’ + + * *note PyThread_create_key(): 43f5. + + * *note PyThread_delete_key(): 43f6. + + * *note PyThread_delete_key_value(): 43f7. + + * ‘PyThread_exit_thread()’ + + * ‘PyThread_free_lock()’ + + * *note PyThread_get_key_value(): 43f8. + + * ‘PyThread_get_stacksize()’ + + * ‘PyThread_get_thread_ident()’ + + * ‘PyThread_get_thread_native_id()’ + + * ‘PyThread_init_thread()’ + + * ‘PyThread_release_lock()’ + + * *note PyThread_set_key_value(): ce2. + + * ‘PyThread_set_stacksize()’ + + * ‘PyThread_start_new_thread()’ + + * *note PyThread_tss_alloc(): 43f9. + + * *note PyThread_tss_create(): 43fa. + + * *note PyThread_tss_delete(): 43fb. + + * *note PyThread_tss_free(): 43fc. + + * *note PyThread_tss_get(): 43fd. + + * *note PyThread_tss_is_created(): 43fe. + + * *note PyThread_tss_set(): 43ff. + + * ‘PyTraceBack_Here()’ + + * ‘PyTraceBack_Print()’ + + * ‘PyTraceBack_Type’ + + * ‘PyTupleIter_Type’ + + * *note PyTuple_GetItem(): 4247. + + * *note PyTuple_GetSlice(): 4400. + + * *note PyTuple_New(): 4401. + + * *note PyTuple_Pack(): 4402. + + * *note PyTuple_SetItem(): 424b. + + * *note PyTuple_Size(): 4403. + + * *note PyTuple_Type: 4404. + + * *note PyTypeObject: 701. + + * *note PyType_ClearCache(): 4405. + + * *note PyType_FromModuleAndSpec(): 4c8. + + * *note PyType_FromSpec(): 5b8. + + * *note PyType_FromSpecWithBases(): 4c7. + + * *note PyType_GenericAlloc(): 6bd. + + * *note PyType_GenericNew(): 4261. + + * *note PyType_GetFlags(): 1367. + + * *note PyType_GetModule(): 5c2. + + * *note PyType_GetModuleState(): 5c3. + + * *note PyType_GetName(): 321. + + * *note PyType_GetQualName(): 322. + + * *note PyType_GetSlot(): 4c9. + + * *note PyType_IsSubtype(): 4406. + + * *note PyType_Modified(): 4407. + + * *note PyType_Ready(): 350. + + * *note PyType_Slot: 4408. + + * *note PyType_Spec: 4409. + + * *note PyType_Type: 440a. + + * *note PyUnicodeDecodeError_Create(): 440b. + + * *note PyUnicodeDecodeError_GetEncoding(): 440c. + + * *note PyUnicodeDecodeError_GetEnd(): 440d. + + * *note PyUnicodeDecodeError_GetObject(): 440e. + + * *note PyUnicodeDecodeError_GetReason(): 440f. + + * *note PyUnicodeDecodeError_GetStart(): 4410. + + * *note PyUnicodeDecodeError_SetEnd(): 4411. + + * *note PyUnicodeDecodeError_SetReason(): 4412. + + * *note PyUnicodeDecodeError_SetStart(): 4413. + + * *note PyUnicodeEncodeError_GetEncoding(): 4414. + + * *note PyUnicodeEncodeError_GetEnd(): 4415. + + * *note PyUnicodeEncodeError_GetObject(): 4416. + + * *note PyUnicodeEncodeError_GetReason(): 4417. + + * *note PyUnicodeEncodeError_GetStart(): 4418. + + * *note PyUnicodeEncodeError_SetEnd(): 4419. + + * *note PyUnicodeEncodeError_SetReason(): 441a. + + * *note PyUnicodeEncodeError_SetStart(): 441b. + + * ‘PyUnicodeIter_Type’ + + * *note PyUnicodeTranslateError_GetEnd(): 441c. + + * *note PyUnicodeTranslateError_GetObject(): 441d. + + * *note PyUnicodeTranslateError_GetReason(): 441e. + + * *note PyUnicodeTranslateError_GetStart(): 441f. + + * *note PyUnicodeTranslateError_SetEnd(): 4420. + + * *note PyUnicodeTranslateError_SetReason(): 4421. + + * *note PyUnicodeTranslateError_SetStart(): 4422. + + * ‘PyUnicode_Append()’ + + * ‘PyUnicode_AppendAndDel()’ + + * *note PyUnicode_AsASCIIString(): e47. + + * *note PyUnicode_AsCharmapString(): 4423. + + * ‘PyUnicode_AsDecodedObject()’ + + * ‘PyUnicode_AsDecodedUnicode()’ + + * ‘PyUnicode_AsEncodedObject()’ + + * *note PyUnicode_AsEncodedString(): 4424. + + * ‘PyUnicode_AsEncodedUnicode()’ + + * *note PyUnicode_AsLatin1String(): e46. + + * *note PyUnicode_AsMBCSString(): e48. + + * *note PyUnicode_AsRawUnicodeEscapeString(): e45. + + * *note PyUnicode_AsUCS4(): e2d. + + * *note PyUnicode_AsUCS4Copy(): 4f8. + + * *note PyUnicode_AsUTF16String(): 4425. + + * *note PyUnicode_AsUTF32String(): 4426. + + * *note PyUnicode_AsUTF8AndSize(): 4c2. + + * *note PyUnicode_AsUTF8String(): e43. + + * *note PyUnicode_AsUnicodeEscapeString(): e44. + + * *note PyUnicode_AsWideChar(): 1498. + + * *note PyUnicode_AsWideCharString(): 4f9. + + * ‘PyUnicode_BuildEncodingMap()’ + + * *note PyUnicode_Compare(): 4f4. + + * *note PyUnicode_CompareWithASCIIString(): f22. + + * *note PyUnicode_Concat(): e55. + + * *note PyUnicode_Contains(): 4427. + + * *note PyUnicode_Count(): 4428. + + * *note PyUnicode_Decode(): 140b. + + * *note PyUnicode_DecodeASCII(): 4429. + + * *note PyUnicode_DecodeCharmap(): 442a. + + * ‘PyUnicode_DecodeCodePageStateful()’ + + * *note PyUnicode_DecodeFSDefault(): 442b. + + * *note PyUnicode_DecodeFSDefaultAndSize(): 442c. + + * *note PyUnicode_DecodeLatin1(): 442d. + + * *note PyUnicode_DecodeLocale(): 442e. + + * *note PyUnicode_DecodeLocaleAndSize(): 82f. + + * *note PyUnicode_DecodeMBCS(): 442f. + + * *note PyUnicode_DecodeMBCSStateful(): 4430. + + * *note PyUnicode_DecodeRawUnicodeEscape(): 4431. + + * *note PyUnicode_DecodeUTF16(): 4432. + + * *note PyUnicode_DecodeUTF16Stateful(): 4433. + + * *note PyUnicode_DecodeUTF32(): 4434. + + * *note PyUnicode_DecodeUTF32Stateful(): 4435. + + * *note PyUnicode_DecodeUTF7(): 4436. + + * *note PyUnicode_DecodeUTF7Stateful(): 4437. + + * *note PyUnicode_DecodeUTF8(): 4438. + + * *note PyUnicode_DecodeUTF8Stateful(): 4439. + + * *note PyUnicode_DecodeUnicodeEscape(): 443a. + + * *note PyUnicode_EncodeCodePage(): e49. + + * *note PyUnicode_EncodeFSDefault(): 1491. + + * *note PyUnicode_EncodeLocale(): 830. + + * *note PyUnicode_FSConverter(): 98b. + + * *note PyUnicode_FSDecoder(): 98c. + + * *note PyUnicode_Find(): 443b. + + * *note PyUnicode_FindChar(): 4f6. + + * *note PyUnicode_Format(): 443c. + + * *note PyUnicode_FromEncodedObject(): 443d. + + * *note PyUnicode_FromFormat(): 4f2. + + * *note PyUnicode_FromFormatV(): 443e. + + * *note PyUnicode_FromObject(): 443f. + + * ‘PyUnicode_FromOrdinal()’ + + * *note PyUnicode_FromString(): 42ad. + + * *note PyUnicode_FromStringAndSize(): 4440. + + * *note PyUnicode_FromWideChar(): e41. + + * ‘PyUnicode_GetDefaultEncoding()’ + + * *note PyUnicode_GetLength(): 4ef. + + * *note PyUnicode_GetSize(): 37c. + + * *note PyUnicode_InternFromString(): 4441. + + * ‘PyUnicode_InternImmortal()’ + + * *note PyUnicode_InternInPlace(): 4ed. + + * *note PyUnicode_IsIdentifier(): 13ba. + + * *note PyUnicode_Join(): e56. + + * ‘PyUnicode_Partition()’ + + * ‘PyUnicode_RPartition()’ + + * ‘PyUnicode_RSplit()’ + + * *note PyUnicode_ReadChar(): e25. + + * *note PyUnicode_Replace(): 4442. + + * ‘PyUnicode_Resize()’ + + * *note PyUnicode_RichCompare(): 4443. + + * *note PyUnicode_Split(): 4444. + + * *note PyUnicode_Splitlines(): 4445. + + * *note PyUnicode_Substring(): 4f3. + + * *note PyUnicode_Tailmatch(): 4f5. + + * *note PyUnicode_Translate(): 4446. + + * *note PyUnicode_Type: 4447. + + * *note PyUnicode_WriteChar(): e26. + + * *note PyVarObject: 39c6. + + * ‘PyVarObject.ob_base’ + + * *note PyVarObject.ob_size: 4448. + + * ‘PyWeakReference’ + + * *note PyWeakref_GetObject(): 4449. + + * *note PyWeakref_NewProxy(): 444a. + + * *note PyWeakref_NewRef(): 1243. + + * ‘PyWrapperDescr_Type’ + + * *note PyWrapper_New(): 444b. + + * ‘PyZip_Type’ + + * *note Py_AddPendingCall(): 5d6. + + * *note Py_AtExit(): 444c. + + * *note Py_BEGIN_ALLOW_THREADS: 4250. + + * *note Py_BLOCK_THREADS: 444d. + + * *note Py_BuildValue(): 4da. + + * *note Py_BytesMain(): 5ff. + + * *note Py_CompileString(): 4aa. + + * *note Py_DecRef(): 444e. + + * *note Py_DecodeLocale(): 82d. + + * *note Py_END_ALLOW_THREADS: 6e4. + + * *note Py_EncodeLocale(): 82e. + + * *note Py_EndInterpreter(): 1255. + + * *note Py_EnterRecursiveCall(): 5c8. + + * *note Py_Exit(): 9ca. + + * *note Py_FatalError(): 5d9. + + * ‘Py_FileSystemDefaultEncodeErrors’ + + * ‘Py_FileSystemDefaultEncoding’ + + * *note Py_Finalize(): ff4. + + * *note Py_FinalizeEx(): 986. + + * *note Py_GenericAlias(): 444f. + + * *note Py_GenericAliasType: 4450. + + * *note Py_GetBuildInfo(): 1099. + + * *note Py_GetCompiler(): 4451. + + * *note Py_GetCopyright(): 4452. + + * *note Py_GetExecPrefix(): 4e3. + + * *note Py_GetPath(): 4e1. + + * *note Py_GetPlatform(): 4453. + + * *note Py_GetPrefix(): 4e2. + + * *note Py_GetProgramFullPath(): 4e4. + + * *note Py_GetProgramName(): 4e6. + + * *note Py_GetPythonHome(): 4e5. + + * ‘Py_GetRecursionLimit()’ + + * *note Py_GetVersion(): 4454. + + * ‘Py_HasFileSystemDefaultEncoding’ + + * *note Py_IncRef(): 4455. + + * *note Py_Initialize(): 4e7. + + * *note Py_InitializeEx(): 4456. + + * *note Py_Is(): 4d1. + + * *note Py_IsFalse(): 4d4. + + * *note Py_IsInitialized(): 42d6. + + * *note Py_IsNone(): 4d2. + + * *note Py_IsTrue(): 4d3. + + * *note Py_LeaveRecursiveCall(): 5c9. + + * *note Py_Main(): 891. + + * ‘Py_MakePendingCalls()’ + + * *note Py_NewInterpreter(): 4457. + + * *note Py_NewRef(): 4c5. + + * *note Py_ReprEnter(): 4458. + + * *note Py_ReprLeave(): 4459. + + * *note Py_SetPath(): 36c. + + * *note Py_SetProgramName(): 36d. + + * *note Py_SetPythonHome(): 36e. + + * ‘Py_SetRecursionLimit()’ + + * *note Py_UCS4: e29. + + * *note Py_UNBLOCK_THREADS: 445a. + + * ‘Py_UTF8Mode’ + + * *note Py_VaBuildValue(): 445b. + + * *note Py_Version: 325. + + * *note Py_XNewRef(): 4c6. + + * *note Py_buffer: 327. + + * ‘Py_intptr_t’ + + * *note Py_ssize_t: 6b1. + + * ‘Py_uintptr_t’ + + * *note allocfunc: 445c. + + * *note binaryfunc: 445d. + + * *note descrgetfunc: 445e. + + * *note descrsetfunc: 445f. + + * *note destructor: 4460. + + * *note getattrfunc: 4461. + + * *note getattrofunc: 4462. + + * *note getiterfunc: 4463. + + * ‘getter’ + + * *note hashfunc: 4464. + + * *note initproc: 4465. + + * *note inquiry: 4466. + + * *note iternextfunc: 4467. + + * *note lenfunc: 4468. + + * *note newfunc: 4469. + + * *note objobjargproc: 446a. + + * *note objobjproc: 446b. + + * *note reprfunc: 446c. + + * *note richcmpfunc: 446d. + + * *note setattrfunc: 446e. + + * *note setattrofunc: 446f. + + * ‘setter’ + + * *note ssizeargfunc: 4470. + + * *note ssizeobjargproc: 4471. + + * ‘ssizessizeargfunc’ + + * ‘ssizessizeobjargproc’ + + * ‘symtable’ + + * *note ternaryfunc: 4472. + + * *note traverseproc: 4473. + + * *note unaryfunc: 4474. + + * *note visitproc: 4475. + + +File: python.info, Node: The Very High Level Layer, Next: Reference Counting, Prev: C API Stability, Up: Python/C API Reference Manual + +7.3 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 ‘Py_eval_input’, +‘Py_file_input’, and ‘Py_single_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 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. + + -- C Function: int Py_Main (int argc, wchar_t **argv) + ` Part of the *note Stable ABI: 4b8.' The main program for the + standard interpreter. This is made available for programs which + embed Python. The `argc' and `argv' parameters should be prepared + exactly as those which are passed to a C program’s ‘main()’ + function (converted to wchar_t according to the user’s locale). It + is important to note that the argument list may be modified (but + the contents of the strings pointed to by the argument list are + not). The return value will be ‘0’ if the interpreter exits + normally (i.e., without an exception), ‘1’ if the interpreter exits + due to an exception, or ‘2’ if the parameter list does not + represent a valid Python command line. + + Note that if an otherwise unhandled *note SystemExit: 9b6. is + raised, this function will not return ‘1’, but exit the process, as + long as ‘Py_InspectFlag’ is not set. + + -- C Function: int Py_BytesMain (int argc, char **argv) + ` Part of the *note Stable ABI: 4b8. since version 3.8.' Similar + to *note Py_Main(): 891. but `argv' is an array of bytes strings. + + New in version 3.8. + + -- C Function: int PyRun_AnyFile (FILE *fp, const char *filename) + + This is a simplified interface to *note PyRun_AnyFileExFlags(): + 447a. below, leaving `closeit' set to ‘0’ and `flags' set to + ‘NULL’. + + -- C Function: int PyRun_AnyFileFlags (FILE *fp, const char *filename, + PyCompilerFlags *flags) + + This is a simplified interface to *note PyRun_AnyFileExFlags(): + 447a. below, leaving the `closeit' argument set to ‘0’. + + -- C Function: int PyRun_AnyFileEx (FILE *fp, const char *filename, int + closeit) + + This is a simplified interface to *note PyRun_AnyFileExFlags(): + 447a. below, leaving the `flags' argument set to ‘NULL’. + + -- 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 *note PyRun_InteractiveLoop(): 447d, otherwise return the + result of *note PyRun_SimpleFile(): 42a5. `filename' is decoded + from the filesystem encoding (*note sys.getfilesystemencoding(): + 8c8.). If `filename' is ‘NULL’, this function uses ‘"???"’ as the + filename. If `closeit' is true, the file is closed before + ‘PyRun_SimpleFileExFlags()’ returns. + + -- C Function: int PyRun_SimpleString (const char *command) + + This is a simplified interface to *note PyRun_SimpleStringFlags(): + 447e. below, leaving the *note PyCompilerFlags: 6fb.* argument set + to ‘NULL’. + + -- C Function: int PyRun_SimpleStringFlags (const char *command, + PyCompilerFlags *flags) + + Executes the Python source code from `command' in the *note + __main__: 1. module according to the `flags' argument. If *note + __main__: 1. does not already exist, it is created. Returns ‘0’ on + success or ‘-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 *note SystemExit: 9b6. is + raised, this function will not return ‘-1’, but exit the process, + as long as ‘Py_InspectFlag’ is not set. + + -- C Function: int PyRun_SimpleFile (FILE *fp, const char *filename) + + This is a simplified interface to *note PyRun_SimpleFileExFlags(): + 130e. below, leaving `closeit' set to ‘0’ and `flags' set to + ‘NULL’. + + -- C Function: int PyRun_SimpleFileEx (FILE *fp, const char *filename, + int closeit) + + This is a simplified interface to *note PyRun_SimpleFileExFlags(): + 130e. below, leaving `flags' set to ‘NULL’. + + -- C Function: int PyRun_SimpleFileExFlags (FILE *fp, const char + *filename, int closeit, PyCompilerFlags *flags) + + Similar to *note PyRun_SimpleStringFlags(): 447e, 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 *note + filesystem encoding and error handler: 1793. If `closeit' is true, + the file is closed before ‘PyRun_SimpleFileExFlags()’ returns. + + Note: On Windows, `fp' should be opened as binary mode (e.g. + ‘fopen(filename, "rb")’). Otherwise, Python may not handle + script file with LF line ending correctly. + + -- C Function: int PyRun_InteractiveOne (FILE *fp, const char + *filename) + + This is a simplified interface to *note + PyRun_InteractiveOneFlags(): 4481. below, leaving `flags' set to + ‘NULL’. + + -- C Function: int PyRun_InteractiveOneFlags (FILE *fp, const char + *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 ‘sys.ps1’ and ‘sys.ps2’. `filename' is + decoded from the *note filesystem encoding and error handler: 1793. + + Returns ‘0’ when the input was executed successfully, ‘-1’ if there + was an exception, or an error code from the ‘errcode.h’ include + file distributed as part of Python if there was a parse error. + (Note that ‘errcode.h’ is not included by ‘Python.h’, so must be + included specifically if needed.) + + -- C Function: int PyRun_InteractiveLoop (FILE *fp, const char + *filename) + + This is a simplified interface to *note + PyRun_InteractiveLoopFlags(): 4482. below, leaving `flags' set to + ‘NULL’. + + -- 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 ‘sys.ps1’ and ‘sys.ps2’. `filename' is decoded from the + *note filesystem encoding and error handler: 1793. Returns ‘0’ at + EOF or a negative number upon failure. + + -- C Variable: int (*PyOS_InputHook)(void) + ` Part of the *note Stable ABI: 4b8.' Can be set to point to a + function with the prototype ‘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 the + ‘Modules/_tkinter.c’ in the Python source code. + + -- C Variable: char *(*PyOS_ReadlineFunctionPointer)(FILE*, FILE*, + const char*) + + Can be set to point to a function with the prototype ‘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 ‘NULL’, and then read a line of input + from the provided standard input file, returning the resulting + string. For example, The *note readline: db. module sets this hook + to provide line-editing and tab-completion features. + + The result must be a string allocated by *note PyMem_RawMalloc(): + cdf. or *note PyMem_RawRealloc(): ce0, or ‘NULL’ if an error + occurred. + + Changed in version 3.4: The result must be allocated by *note + PyMem_RawMalloc(): cdf. or *note PyMem_RawRealloc(): ce0, instead + of being allocated by *note PyMem_Malloc(): 8d7. or *note + PyMem_Realloc(): ce1. + + -- C Function: *note PyObject: 4cf. *PyRun_String (const char *str, int + start, PyObject *globals, PyObject *locals) + `Return value: New reference.' This is a simplified interface to + *note PyRun_StringFlags(): 4483. below, leaving `flags' set to + ‘NULL’. + + -- C Function: *note PyObject: 4cf. *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 + token that should be used to parse the source code. + + Returns the result of executing the code as a Python object, or + ‘NULL’ if an exception was raised. + + -- C Function: *note PyObject: 4cf. *PyRun_File (FILE *fp, const char + *filename, int start, PyObject *globals, PyObject *locals) + `Return value: New reference.' This is a simplified interface to + *note PyRun_FileExFlags(): 4485. below, leaving `closeit' set to + ‘0’ and `flags' set to ‘NULL’. + + -- C Function: *note PyObject: 4cf. *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 + *note PyRun_FileExFlags(): 4485. below, leaving `flags' set to + ‘NULL’. + + -- C Function: *note PyObject: 4cf. *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 + *note PyRun_FileExFlags(): 4485. below, leaving `closeit' set to + ‘0’. + + -- C Function: *note PyObject: 4cf. *PyRun_FileExFlags (FILE *fp, const + char *filename, int start, PyObject *globals, PyObject + *locals, int closeit, PyCompilerFlags *flags) + `Return value: New reference.' Similar to *note + PyRun_StringFlags(): 4483, 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 *note filesystem encoding and + error handler: 1793. If `closeit' is true, the file is closed + before *note PyRun_FileExFlags(): 4485. returns. + + -- C Function: *note PyObject: 4cf. *Py_CompileString (const char *str, + const char *filename, int start) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' This is a simplified interface to *note + Py_CompileStringFlags(): 4488. below, leaving `flags' set to + ‘NULL’. + + -- C Function: *note PyObject: 4cf. *Py_CompileStringFlags (const char + *str, const char *filename, int start, PyCompilerFlags *flags) + `Return value: New reference.' This is a simplified interface to + *note Py_CompileStringExFlags(): 4489. below, with `optimize' set + to ‘-1’. + + -- C Function: *note PyObject: 4cf. *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 + token is given by `start'; this can be used to constrain the code + which can be compiled and should be ‘Py_eval_input’, + ‘Py_file_input’, or ‘Py_single_input’. The filename specified by + `filename' is used to construct the code object and may appear in + tracebacks or *note SyntaxError: 2d6. exception messages. This + returns ‘NULL’ if the code cannot be parsed or compiled. + + The integer `optimize' specifies the optimization level of the + compiler; a value of ‘-1’ selects the optimization level of the + interpreter as given by *note -O: a34. options. Explicit levels + are ‘0’ (no optimization; ‘__debug__’ is true), ‘1’ (asserts are + removed, ‘__debug__’ is false) or ‘2’ (docstrings are removed too). + + New in version 3.4. + + -- C Function: *note PyObject: 4cf. *Py_CompileStringExFlags (const + char *str, const char *filename, int start, PyCompilerFlags + *flags, int optimize) + `Return value: New reference.' Like *note + Py_CompileStringObject(): 448a, but `filename' is a byte string + decoded from the *note filesystem encoding and error handler: 1793. + + New in version 3.2. + + -- C Function: *note PyObject: 4cf. *PyEval_EvalCode (PyObject *co, + PyObject *globals, PyObject *locals) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' This is a simplified interface to *note PyEval_EvalCodeEx(): + 11fb, with just the code object, and global and local variables. + The other arguments are set to ‘NULL’. + + -- C Function: *note PyObject: 4cf. *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 *note Stable ABI: + 4b8.' 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 *note keyword-only: 6dc. arguments and a + closure tuple of cells. + + -- C Function: *note PyObject: 4cf. *PyEval_EvalFrame (PyFrameObject + *f) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Evaluate an execution frame. This is a simplified interface + to *note PyEval_EvalFrameEx(): cda, for backward compatibility. + + -- C Function: *note PyObject: 4cf. *PyEval_EvalFrameEx (PyFrameObject + *f, int throwflag) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 *note throw(): 134b. 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. + + -- 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. + + -- C Variable: int Py_eval_input + + The start symbol from the Python grammar for isolated expressions; + for use with *note Py_CompileString(): 4aa. + + -- C Variable: int Py_file_input + + The start symbol from the Python grammar for sequences of + statements as read from a file or other source; for use with *note + Py_CompileString(): 4aa. This is the symbol to use when compiling + arbitrarily long Python source code. + + -- C Variable: int Py_single_input + + The start symbol from the Python grammar for a single statement; + for use with *note Py_CompileString(): 4aa. This is the symbol + used for the interactive interpreter loop. + + -- 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 ‘int flags’, and in + cases where code is being executed, it is passed as + ‘PyCompilerFlags *flags’. In this case, ‘from __future__ import’ + can modify `flags'. + + Whenever ‘PyCompilerFlags *flags’ is ‘NULL’, ‘cf_flags’ is treated + as equal to ‘0’, and any modification due to ‘from __future__ + import’ is discarded. + + -- C Member: int cf_flags + + Compiler flags. + + -- C Member: int cf_feature_version + + `cf_feature_version' is the minor Python version. It should + be initialized to ‘PY_MINOR_VERSION’. + + The field is ignored by default, it is used if and only if + ‘PyCF_ONLY_AST’ flag is set in `cf_flags'. + + Changed in version 3.8: Added `cf_feature_version' field. + + -- C Variable: int CO_FUTURE_DIVISION + + This bit can be set in `flags' to cause division operator ‘/’ to be + interpreted as “true division” according to PEP 238(1). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0238/ + + +File: python.info, Node: Reference Counting, Next: Exception Handling, Prev: The Very High Level Layer, Up: Python/C API Reference Manual + +7.4 Reference Counting +====================== + +The macros in this section are used for managing reference counts of +Python objects. + + -- C Function: void Py_INCREF (PyObject *o) + + Increment the reference count for object `o'. + + This function is usually used to convert a *note borrowed + reference: 42cb. to a *note strong reference: 362. in-place. The + *note Py_NewRef(): 4c5. function can be used to create a new *note + strong reference: 362. + + The object must not be ‘NULL’; if you aren’t sure that it isn’t + ‘NULL’, use *note Py_XINCREF(): 6b6. + + -- C Function: void Py_XINCREF (PyObject *o) + + Increment the reference count for object `o'. The object may be + ‘NULL’, in which case the macro has no effect. + + See also *note Py_XNewRef(): 4c6. + + -- C Function: *note PyObject: 4cf. *Py_NewRef (PyObject *o) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Create a + new *note strong reference: 362. to an object: increment the + reference count of the object `o' and return the object `o'. + + When the *note strong reference: 362. is no longer needed, *note + Py_DECREF(): 4cd. should be called on it to decrement the object + reference count. + + The object `o' must not be ‘NULL’; use *note Py_XNewRef(): 4c6. if + `o' can be ‘NULL’. + + For example: + + Py_INCREF(obj); + self->attr = obj; + + can be written as: + + self->attr = Py_NewRef(obj); + + See also *note Py_INCREF(): 4cc. + + New in version 3.10. + + -- C Function: *note PyObject: 4cf. *Py_XNewRef (PyObject *o) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Similar + to *note Py_NewRef(): 4c5, but the object `o' can be NULL. + + If the object `o' is ‘NULL’, the function just returns ‘NULL’. + + New in version 3.10. + + -- C Function: void Py_DECREF (PyObject *o) + + Decrement the reference count for object `o'. + + If the reference count reaches zero, the object’s type’s + deallocation function (which must not be ‘NULL’) is invoked. + + This function is usually used to delete a *note strong reference: + 362. before exiting its scope. + + The object must not be ‘NULL’; if you aren’t sure that it isn’t + ‘NULL’, use *note Py_XDECREF(): 363. + + Warning: The deallocation function can cause arbitrary Python + code to be invoked (e.g. when a class instance with a + ‘__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 *note Py_DECREF(): 4cd. 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 *note Py_DECREF(): 4cd. for the + temporary variable. + + -- C Function: void Py_XDECREF (PyObject *o) + + Decrement the reference count for object `o'. The object may be + ‘NULL’, in which case the macro has no effect; otherwise the effect + is the same as for *note Py_DECREF(): 4cd, and the same warning + applies. + + -- C Function: void Py_CLEAR (PyObject *o) + + Decrement the reference count for object `o'. The object may be + ‘NULL’, in which case the macro has no effect; otherwise the effect + is the same as for *note Py_DECREF(): 4cd, except that the argument + is also set to ‘NULL’. The warning for *note Py_DECREF(): 4cd. + does not apply with respect to the object passed because the macro + carefully uses a temporary variable and sets the argument to ‘NULL’ + before decrementing its reference count. + + It is a good idea to use this macro whenever decrementing the + reference count of an object that might be traversed during garbage + collection. + + -- C Function: void Py_IncRef (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Increment the reference + count for object `o'. A function version of *note Py_XINCREF(): + 6b6. It can be used for runtime dynamic embedding of Python. + + -- C Function: void Py_DecRef (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Decrement the reference + count for object `o'. A function version of *note Py_XDECREF(): + 363. It can be used for runtime dynamic embedding of Python. + +The following functions or macros are only for use within the +interpreter core: ‘_Py_Dealloc()’, ‘_Py_ForgetReference()’, +‘_Py_NewReference()’, as well as the global variable ‘_Py_RefTotal’. + + +File: python.info, Node: Exception Handling, Next: Utilities<2>, Prev: Reference Counting, Up: Python/C API Reference Manual + +7.5 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 ‘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 ‘NULL’ if they are +supposed to return a pointer, or ‘-1’ if they return an integer +(exception: the ‘PyArg_*’ functions return ‘1’ for success and ‘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 ‘NULL’ if non-set (although some combinations +are forbidden, for example you can’t have a non-‘NULL’ traceback if the +exception type is ‘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. + + Note: The error indicator is `not' the result of *note + sys.exc_info(): 25b. 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). + +* 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:: +* Standard Exceptions:: +* Standard Warning Categories:: + + +File: python.info, Node: Printing and clearing, Next: Raising exceptions, Up: Exception Handling + +7.5.1 Printing and clearing +--------------------------- + + -- C Function: void PyErr_Clear () + ` Part of the *note Stable ABI: 4b8.' Clear the error indicator. + If the error indicator is not set, there is no effect. + + -- C Function: void PyErr_PrintEx (int set_sys_last_vars) + ` Part of the *note Stable ABI: 4b8.' Print a standard traceback + to ‘sys.stderr’ and clear the error indicator. `Unless' the error + is a ‘SystemExit’, in that case no traceback is printed and the + Python process will exit with the error code specified by the + ‘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 variables *note + sys.last_type: f6f, *note sys.last_value: 3bce. and *note + sys.last_traceback: 3ab6. will be set to the type, value and + traceback of the printed exception, respectively. + + -- C Function: void PyErr_Print () + ` Part of the *note Stable ABI: 4b8.' Alias for + ‘PyErr_PrintEx(1)’. + + -- C Function: void PyErr_WriteUnraisable (PyObject *obj) + ` Part of the *note Stable ABI: 4b8.' Call *note + sys.unraisablehook(): 24e. using the current exception and `obj' + argument. + + This utility function prints a warning message to ‘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 ‘__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. + + An exception must be set when calling this function. + + +File: python.info, Node: Raising exceptions, Next: Issuing warnings, Prev: Printing and clearing, Up: Exception Handling + +7.5.2 Raising exceptions +------------------------ + +These functions help you set the current thread’s error indicator. For +convenience, some of these functions will always return a ‘NULL’ pointer +for use in a ‘return’ statement. + + -- C Function: void PyErr_SetString (PyObject *type, const char + *message) + ` Part of the *note Stable ABI: 4b8.' 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. + ‘PyExc_RuntimeError’. You need not increment its reference count. + The second argument is an error message; it is decoded from + ‘'utf-8'’. + + -- C Function: void PyErr_SetObject (PyObject *type, PyObject *value) + ` Part of the *note Stable ABI: 4b8.' This function is similar to + *note PyErr_SetString(): 422b. but lets you specify an arbitrary + Python object for the “value” of the exception. + + -- C Function: *note PyObject: 4cf. *PyErr_Format (PyObject *exception, + const char *format, ...) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8.' + This function sets the error indicator and returns ‘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 *note PyUnicode_FromFormat(): 4f2. + `format' is an ASCII-encoded string. + + -- C Function: *note PyObject: 4cf. *PyErr_FormatV (PyObject + *exception, const char *format, va_list vargs) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. + since version 3.5.' Same as *note PyErr_Format(): b3f, but taking + a ‘va_list’ argument rather than a variable number of arguments. + + New in version 3.5. + + -- C Function: void PyErr_SetNone (PyObject *type) + ` Part of the *note Stable ABI: 4b8.' This is a shorthand for + ‘PyErr_SetObject(type, Py_None)’. + + -- C Function: int PyErr_BadArgument () + ` Part of the *note Stable ABI: 4b8.' This is a shorthand for + ‘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. + + -- C Function: *note PyObject: 4cf. *PyErr_NoMemory () + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8.' + This is a shorthand for ‘PyErr_SetNone(PyExc_MemoryError)’; it + returns ‘NULL’ so an object allocation function can write ‘return + PyErr_NoMemory();’ when it runs out of memory. + + -- C Function: *note PyObject: 4cf. *PyErr_SetFromErrno (PyObject + *type) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8.' + + This is a convenience function to raise an exception when a C + library function has returned an error and set the C variable + ‘errno’. It constructs a tuple object whose first item is the + integer ‘errno’ value and whose second item is the corresponding + error message (gotten from ‘strerror()’), and then calls + ‘PyErr_SetObject(type, object)’. On Unix, when the ‘errno’ value + is ‘EINTR’, indicating an interrupted system call, this calls *note + PyErr_CheckSignals(): 432c, and if that set the error indicator, + leaves it set to that. The function always returns ‘NULL’, so a + wrapper function around a system call can write ‘return + PyErr_SetFromErrno(type);’ when the system call returns an error. + + -- C Function: *note PyObject: 4cf. + *PyErr_SetFromErrnoWithFilenameObject (PyObject *type, + PyObject *filenameObject) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8.' + Similar to *note PyErr_SetFromErrno(): 422c, with the additional + behavior that if `filenameObject' is not ‘NULL’, it is passed to + the constructor of `type' as a third parameter. In the case of + *note OSError: 413. exception, this is used to define the + ‘filename’ attribute of the exception instance. + + -- C Function: *note PyObject: 4cf. + *PyErr_SetFromErrnoWithFilenameObjects (PyObject *type, + PyObject *filenameObject, PyObject *filenameObject2) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Similar to *note + PyErr_SetFromErrnoWithFilenameObject(): 4334, but takes a second + filename object, for raising errors when a function that takes two + filenames fails. + + New in version 3.4. + + -- C Function: *note PyObject: 4cf. *PyErr_SetFromErrnoWithFilename + (PyObject *type, const char *filename) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8.' + Similar to *note PyErr_SetFromErrnoWithFilenameObject(): 4334, but + the filename is given as a C string. `filename' is decoded from + the *note filesystem encoding and error handler: 1793. + + -- C Function: *note PyObject: 4cf. *PyErr_SetFromWindowsErr (int ierr) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. on + Windows since version 3.7.' This is a convenience function to + raise *note WindowsError: d04. If called with `ierr' of ‘0’, the + error code returned by a call to ‘GetLastError()’ is used instead. + It calls the Win32 function ‘FormatMessage()’ to retrieve the + Windows description of error code given by `ierr' or + ‘GetLastError()’, then it constructs a tuple object whose first + item is the `ierr' value and whose second item is the corresponding + error message (gotten from ‘FormatMessage()’), and then calls + ‘PyErr_SetObject(PyExc_WindowsError, object)’. This function + always returns ‘NULL’. + + *note Availability: 1794.: Windows. + + -- C Function: *note PyObject: 4cf. *PyErr_SetExcFromWindowsErr + (PyObject *type, int ierr) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. on + Windows since version 3.7.' Similar to *note + PyErr_SetFromWindowsErr(): 4336, with an additional parameter + specifying the exception type to be raised. + + *note Availability: 1794.: Windows. + + -- C Function: *note PyObject: 4cf. + *PyErr_SetFromWindowsErrWithFilename (int ierr, const char + *filename) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. on + Windows since version 3.7.' Similar to + ‘PyErr_SetFromWindowsErrWithFilenameObject()’, but the filename is + given as a C string. `filename' is decoded from the filesystem + encoding (*note os.fsdecode(): 8c2.). + + *note Availability: 1794.: Windows. + + -- C Function: *note PyObject: 4cf. + *PyErr_SetExcFromWindowsErrWithFilenameObject (PyObject *type, + int ierr, PyObject *filename) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. on + Windows since version 3.7.' Similar to + ‘PyErr_SetFromWindowsErrWithFilenameObject()’, with an additional + parameter specifying the exception type to be raised. + + *note Availability: 1794.: Windows. + + -- C Function: *note PyObject: 4cf. + *PyErr_SetExcFromWindowsErrWithFilenameObjects (PyObject + *type, int ierr, PyObject *filename, PyObject *filename2) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. on + Windows since version 3.7.' Similar to *note + PyErr_SetExcFromWindowsErrWithFilenameObject(): 4331, but accepts a + second filename object. + + *note Availability: 1794.: Windows. + + New in version 3.4. + + -- C Function: *note PyObject: 4cf. + *PyErr_SetExcFromWindowsErrWithFilename (PyObject *type, int + ierr, const char *filename) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. on + Windows since version 3.7.' Similar to *note + PyErr_SetFromWindowsErrWithFilename(): 4337, with an additional + parameter specifying the exception type to be raised. + + *note Availability: 1794.: Windows. + + -- C Function: *note PyObject: 4cf. *PyErr_SetImportError (PyObject + *msg, PyObject *name, PyObject *path) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' This is a convenience function to raise *note + ImportError: 511. `msg' will be set as the exception’s message + string. `name' and `path', both of which can be ‘NULL’, will be + set as the *note ImportError: 511.’s respective ‘name’ and ‘path’ + attributes. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyErr_SetImportErrorSubclass + (PyObject *exception, PyObject *msg, PyObject *name, PyObject + *path) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8. + since version 3.6.' Much like *note PyErr_SetImportError(): 9b2. + but this function allows for specifying a subclass of *note + ImportError: 511. to raise. + + New in version 3.6. + + -- 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 *note SyntaxError: 2d6, then it + sets additional attributes, which make the exception printing + subsystem think the exception is a *note SyntaxError: 2d6. + + New in version 3.4. + + -- C Function: void PyErr_SyntaxLocationEx (const char *filename, int + lineno, int col_offset) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Like + *note PyErr_SyntaxLocationObject(): 4499, but `filename' is a byte + string decoded from the *note filesystem encoding and error + handler: 1793. + + New in version 3.2. + + -- C Function: void PyErr_SyntaxLocation (const char *filename, int + lineno) + ` Part of the *note Stable ABI: 4b8.' Like *note + PyErr_SyntaxLocationEx(): 433b, but the `col_offset' parameter is + omitted. + + -- C Function: void PyErr_BadInternalCall () + ` Part of the *note Stable ABI: 4b8.' This is a shorthand for + ‘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. + + +File: python.info, Node: Issuing warnings, Next: Querying the error indicator, Prev: Raising exceptions, Up: Exception Handling + +7.5.3 Issuing warnings +---------------------- + +Use these functions to issue warnings from C code. They mirror similar +functions exported by the Python *note warnings: 130. 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 ‘0’ if no exception is +raised, or ‘-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, +*note Py_DECREF(): 4cd. owned references and return an error value). + + -- C Function: int PyErr_WarnEx (PyObject *category, const char + *message, Py_ssize_t stack_level) + ` Part of the *note Stable ABI: 4b8.' Issue a warning message. + The `category' argument is a warning category (see below) or + ‘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 *note PyErr_WarnEx(): 10b0, 2 is the function above that, + and so forth. + + Warning categories must be subclasses of ‘PyExc_Warning’; + ‘PyExc_Warning’ is a subclass of ‘PyExc_Exception’; the default + warning category is ‘PyExc_RuntimeWarning’. The standard Python + warning categories are available as global variables whose names + are enumerated at *note Standard Warning Categories: 449b. + + For information about warning control, see the documentation for + the *note warnings: 130. module and the *note -W: 502. option in + the command line documentation. There is no C API for warning + control. + + -- 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 *note warnings.warn_explicit(): 96f.; see there for more + information. The `module' and `registry' arguments may be set to + ‘NULL’ to get the default effect described there. + + New in version 3.4. + + -- C Function: int PyErr_WarnExplicit (PyObject *category, const char + *message, const char *filename, int lineno, const char + *module, PyObject *registry) + ` Part of the *note Stable ABI: 4b8.' Similar to *note + PyErr_WarnExplicitObject(): 449c. except that `message' and + `module' are UTF-8 encoded strings, and `filename' is decoded from + the *note filesystem encoding and error handler: 1793. + + -- C Function: int PyErr_WarnFormat (PyObject *category, Py_ssize_t + stack_level, const char *format, ...) + ` Part of the *note Stable ABI: 4b8.' Function similar to *note + PyErr_WarnEx(): 10b0, but use *note PyUnicode_FromFormat(): 4f2. to + format the warning message. `format' is an ASCII-encoded string. + + New in version 3.2. + + -- C Function: int PyErr_ResourceWarning (PyObject *source, Py_ssize_t + stack_level, const char *format, ...) + ` Part of the *note Stable ABI: 4b8. since version 3.6.' Function + similar to *note PyErr_WarnFormat(): 433d, but `category' is *note + ResourceWarning: 8a9. and it passes `source' to + ‘warnings.WarningMessage()’. + + New in version 3.6. + + +File: python.info, Node: Querying the error indicator, Next: Signal Handling<2>, Prev: Issuing warnings, Up: Exception Handling + +7.5.4 Querying the error indicator +---------------------------------- + + -- C Function: *note PyObject: 4cf. *PyErr_Occurred () + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Test whether the error indicator is set. If set, return the + exception `type' (the first argument to the last call to one of the + ‘PyErr_Set*’ functions or to *note PyErr_Restore(): 4277.). If not + set, return ‘NULL’. You do not own a reference to the return + value, so you do not need to *note Py_DECREF(): 4cd. it. + + The caller must hold the GIL. + + Note: Do not compare the return value to a specific exception; + use *note PyErr_ExceptionMatches(): 42d3. 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.) + + -- C Function: int PyErr_ExceptionMatches (PyObject *exc) + ` Part of the *note Stable ABI: 4b8.' Equivalent to + ‘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. + + -- C Function: int PyErr_GivenExceptionMatches (PyObject *given, + PyObject *exc) + ` Part of the *note Stable ABI: 4b8.' 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. + + -- C Function: void PyErr_Fetch (PyObject **ptype, PyObject **pvalue, + PyObject **ptraceback) + ` Part of the *note Stable ABI: 4b8.' Retrieve the error indicator + into three variables whose addresses are passed. If the error + indicator is not set, set all three variables to ‘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 ‘NULL’ even when + the type object is not. + + Note: This function is normally only used by code that needs + to catch exceptions or by code that needs to save and restore + the error indicator temporarily, e.g.: + + { + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + + /* ... code that might produce other errors ... */ + + PyErr_Restore(type, value, traceback); + } + + -- C Function: void PyErr_Restore (PyObject *type, PyObject *value, + PyObject *traceback) + ` Part of the *note Stable ABI: 4b8.' Set the error indicator from + the three objects. If the error indicator is already set, it is + cleared first. If the objects are ‘NULL’, the error indicator is + cleared. Do not pass a ‘NULL’ type and non-‘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.) + + Note: This function is normally only used by code that needs + to save and restore the error indicator temporarily. Use + *note PyErr_Fetch(): cdd. to save the current error indicator. + + -- C Function: void PyErr_NormalizeException (PyObject **exc, PyObject + **val, PyObject **tb) + ` Part of the *note Stable ABI: 4b8.' Under certain circumstances, + the values returned by *note PyErr_Fetch(): cdd. below can be + “unnormalized”, meaning that ‘*exc’ is a class object but ‘*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. + + Note: This function `does not' implicitly set the + ‘__traceback__’ attribute on the exception value. If setting + the traceback appropriately is desired, the following + additional snippet is needed: + + if (tb != NULL) { + PyException_SetTraceback(val, tb); + } + + -- C Function: *note PyObject: 4cf. *PyErr_GetHandledException (void) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Retrieve + the active exception instance, as would be returned by *note + sys.exception(): 25c. 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 ‘NULL’. Does not + modify the interpreter’s exception state. + + 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 *note + PyErr_SetHandledException(): 342. to restore or clear the + exception state. + + New in version 3.11. + + -- C Function: void PyErr_SetHandledException (PyObject *exc) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Set the + active exception, as known from ‘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 ‘NULL’. + + 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 *note + PyErr_GetHandledException(): 341. to get the exception state. + + New in version 3.11. + + -- C Function: void PyErr_GetExcInfo (PyObject **ptype, PyObject + **pvalue, PyObject **ptraceback) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Retrieve + the old-style representation of the exception info, as known from + *note sys.exc_info(): 25b. 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 + ‘NULL’. Does not modify the exception info state. This function + is kept for backwards compatibility. Prefer using *note + PyErr_GetHandledException(): 341. + + 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 *note + PyErr_SetExcInfo(): 343. to restore or clear the exception + state. + + New in version 3.3. + + -- C Function: void PyErr_SetExcInfo (PyObject *type, PyObject *value, + PyObject *traceback) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Set the + exception info, as known from ‘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 ‘NULL’ for all three + arguments. This function is kept for backwards compatibility. + Prefer using *note PyErr_SetHandledException(): 342. + + 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 *note + PyErr_GetExcInfo(): 344. to read the exception state. + + New in version 3.3. + + Changed in version 3.11: The ‘type’ and ‘traceback’ arguments are + no longer used and can be NULL. The interpreter now derives them + from the exception instance (the ‘value’ argument). The function + still steals references of all three arguments. + + +File: python.info, Node: Signal Handling<2>, Next: Exception Classes, Prev: Querying the error indicator, Up: Exception Handling + +7.5.5 Signal Handling +--------------------- + + -- C Function: int PyErr_CheckSignals () + ` Part of the *note Stable ABI: 4b8.' + + This function interacts with Python’s signal handling. + + If the function is called from the main thread and under the main + Python interpreter, it checks whether a signal has been sent to the + processes and if so, invokes the corresponding signal handler. If + the *note signal: e7. module is supported, this can invoke a signal + handler written in Python. + + The function attempts to handle all pending signals, and then + returns ‘0’. However, if a Python signal handler raises an + exception, the error indicator is set and the function returns ‘-1’ + immediately (such that other pending signals may not have been + handled yet: they will be on the next *note PyErr_CheckSignals(): + 432c. invocation). + + If the function is called from a non-main thread, or under a + non-main Python interpreter, it does nothing and returns ‘0’. + + This function can be called by long-running C code that wants to be + interruptible by user requests (such as by pressing Ctrl-C). + + Note: The default Python signal handler for ‘SIGINT’ raises + the *note KeyboardInterrupt: 611. exception. + + -- C Function: void PyErr_SetInterrupt () + ` Part of the *note Stable ABI: 4b8.' + + Simulate the effect of a ‘SIGINT’ signal arriving. This is + equivalent to ‘PyErr_SetInterruptEx(SIGINT)’. + + Note: This function is async-signal-safe. It can be called + without the *note GIL: 4df. and from a C signal handler. + + -- C Function: int PyErr_SetInterruptEx (int signum) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' + + Simulate the effect of a signal arriving. The next time *note + PyErr_CheckSignals(): 432c. 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 *note + signal.SIG_DFL: 120e. or *note signal.SIG_IGN: 120d.), it will be + ignored. + + If `signum' is outside of the allowed range of signal numbers, ‘-1’ + is returned. Otherwise, ‘0’ is returned. The error indicator is + never changed by this function. + + Note: This function is async-signal-safe. It can be called + without the *note GIL: 4df. and from a C signal handler. + + New in version 3.10. + + -- 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 ‘-1’ disables the feature; this is the initial state. + This is equivalent to *note signal.set_wakeup_fd(): 7cf. 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. + + +File: python.info, Node: Exception Classes, Next: Exception Objects, Prev: Signal Handling<2>, Up: Exception Handling + +7.5.6 Exception Classes +----------------------- + + -- C Function: *note PyObject: 4cf. *PyErr_NewException (const char + *name, PyObject *base, PyObject *dict) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘module.classname’. The `base' and `dict' + arguments are normally ‘NULL’. This creates a class object derived + from *note Exception: 61c. (accessible in C as ‘PyExc_Exception’). + + The ‘__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. + + -- C Function: *note PyObject: 4cf. *PyErr_NewExceptionWithDoc (const + char *name, const char *doc, PyObject *base, PyObject *dict) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Same as *note PyErr_NewException(): f24, except that the new + exception class can easily be given a docstring: If `doc' is + non-‘NULL’, it will be used as the docstring for the exception + class. + + New in version 3.2. + + +File: python.info, Node: Exception Objects, Next: Unicode Exception Objects, Prev: Exception Classes, Up: Exception Handling + +7.5.7 Exception Objects +----------------------- + + -- C Function: *note PyObject: 4cf. *PyException_GetTraceback (PyObject + *ex) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the traceback associated with the exception as a new + reference, as accessible from Python through ‘__traceback__’. If + there is no traceback associated, this returns ‘NULL’. + + -- C Function: int PyException_SetTraceback (PyObject *ex, PyObject + *tb) + ` Part of the *note Stable ABI: 4b8.' Set the traceback associated + with the exception to `tb'. Use ‘Py_None’ to clear it. + + -- C Function: *note PyObject: 4cf. *PyException_GetContext (PyObject + *ex) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘__context__’. If + there is no context associated, this returns ‘NULL’. + + -- C Function: void PyException_SetContext (PyObject *ex, PyObject + *ctx) + ` Part of the *note Stable ABI: 4b8.' Set the context associated + with the exception to `ctx'. Use ‘NULL’ to clear it. There is no + type check to make sure that `ctx' is an exception instance. This + steals a reference to `ctx'. + + -- C Function: *note PyObject: 4cf. *PyException_GetCause (PyObject + *ex) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the cause (either an exception instance, or *note + None: 243, set by ‘raise ... from ...’) associated with the + exception as a new reference, as accessible from Python through + ‘__cause__’. + + -- C Function: void PyException_SetCause (PyObject *ex, PyObject + *cause) + ` Part of the *note Stable ABI: 4b8.' Set the cause associated + with the exception to `cause'. Use ‘NULL’ to clear it. There is + no type check to make sure that `cause' is either an exception + instance or *note None: 243. This steals a reference to `cause'. + + ‘__suppress_context__’ is implicitly set to ‘True’ by this + function. + + +File: python.info, Node: Unicode Exception Objects, Next: Recursion Control, Prev: Exception Objects, Up: Exception Handling + +7.5.8 Unicode Exception Objects +------------------------------- + +The following functions are used to create and modify Unicode exceptions +from C. + + -- C Function: *note PyObject: 4cf. *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 *note Stable ABI: + 4b8.' Create a *note UnicodeDecodeError: 65c. object with the + attributes `encoding', `object', `length', `start', `end' and + `reason'. `encoding' and `reason' are UTF-8 encoded strings. + + -- C Function: *note PyObject: 4cf. *PyUnicodeDecodeError_GetEncoding + (PyObject *exc) + -- C Function: *note PyObject: 4cf. *PyUnicodeEncodeError_GetEncoding + (PyObject *exc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the `encoding' attribute of the given exception + object. + + -- C Function: *note PyObject: 4cf. *PyUnicodeDecodeError_GetObject + (PyObject *exc) + -- C Function: *note PyObject: 4cf. *PyUnicodeEncodeError_GetObject + (PyObject *exc) + -- C Function: *note PyObject: 4cf. *PyUnicodeTranslateError_GetObject + (PyObject *exc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the `object' attribute of the given exception object. + + -- C Function: int PyUnicodeDecodeError_GetStart (PyObject *exc, + Py_ssize_t *start) + -- C Function: int PyUnicodeEncodeError_GetStart (PyObject *exc, + Py_ssize_t *start) + -- C Function: int PyUnicodeTranslateError_GetStart (PyObject *exc, + Py_ssize_t *start) + ` Part of the *note Stable ABI: 4b8.' Get the `start' attribute of + the given exception object and place it into `*start'. `start' + must not be ‘NULL’. Return ‘0’ on success, ‘-1’ on failure. + + -- C Function: int PyUnicodeDecodeError_SetStart (PyObject *exc, + Py_ssize_t start) + -- C Function: int PyUnicodeEncodeError_SetStart (PyObject *exc, + Py_ssize_t start) + -- C Function: int PyUnicodeTranslateError_SetStart (PyObject *exc, + Py_ssize_t start) + ` Part of the *note Stable ABI: 4b8.' Set the `start' attribute of + the given exception object to `start'. Return ‘0’ on success, ‘-1’ + on failure. + + -- C Function: int PyUnicodeDecodeError_GetEnd (PyObject *exc, + Py_ssize_t *end) + -- C Function: int PyUnicodeEncodeError_GetEnd (PyObject *exc, + Py_ssize_t *end) + -- C Function: int PyUnicodeTranslateError_GetEnd (PyObject *exc, + Py_ssize_t *end) + ` Part of the *note Stable ABI: 4b8.' Get the `end' attribute of + the given exception object and place it into `*end'. `end' must + not be ‘NULL’. Return ‘0’ on success, ‘-1’ on failure. + + -- C Function: int PyUnicodeDecodeError_SetEnd (PyObject *exc, + Py_ssize_t end) + -- C Function: int PyUnicodeEncodeError_SetEnd (PyObject *exc, + Py_ssize_t end) + -- C Function: int PyUnicodeTranslateError_SetEnd (PyObject *exc, + Py_ssize_t end) + ` Part of the *note Stable ABI: 4b8.' Set the `end' attribute of + the given exception object to `end'. Return ‘0’ on success, ‘-1’ + on failure. + + -- C Function: *note PyObject: 4cf. *PyUnicodeDecodeError_GetReason + (PyObject *exc) + -- C Function: *note PyObject: 4cf. *PyUnicodeEncodeError_GetReason + (PyObject *exc) + -- C Function: *note PyObject: 4cf. *PyUnicodeTranslateError_GetReason + (PyObject *exc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the `reason' attribute of the given exception object. + + -- C Function: int PyUnicodeDecodeError_SetReason (PyObject *exc, const + char *reason) + -- C Function: int PyUnicodeEncodeError_SetReason (PyObject *exc, const + char *reason) + -- C Function: int PyUnicodeTranslateError_SetReason (PyObject *exc, + const char *reason) + ` Part of the *note Stable ABI: 4b8.' Set the `reason' attribute + of the given exception object to `reason'. Return ‘0’ on success, + ‘-1’ on failure. + + +File: python.info, Node: Recursion Control, Next: Standard Exceptions, Prev: Unicode Exception Objects, Up: Exception Handling + +7.5.9 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 *note call protocol: 44a5. takes +care of recursion handling. + + -- C Function: int Py_EnterRecursiveCall (const char *where) + ` Part of the *note Stable ABI: 4b8. since version 3.9.' Marks a + point where a recursive C-level call is about to be performed. + + If ‘USE_STACKCHECK’ is defined, this function checks if the OS + stack overflowed using *note PyOS_CheckStack(): 11fd. In this is + the case, it sets a *note MemoryError: 127a. and returns a nonzero + value. + + The function then checks if the recursion limit is reached. If + this is the case, a *note RecursionError: 9e7. is set and a nonzero + value is returned. Otherwise, zero is returned. + + `where' should be a UTF-8 encoded string such as ‘" in instance + check"’ to be concatenated to the *note RecursionError: 9e7. + message caused by the recursion depth limit. + + Changed in version 3.9: This function is now also available in the + limited API. + + -- C Function: void Py_LeaveRecursiveCall (void) + ` Part of the *note Stable ABI: 4b8. since version 3.9.' Ends a + *note Py_EnterRecursiveCall(): 5c8. Must be called once for each + `successful' invocation of *note Py_EnterRecursiveCall(): 5c8. + + Changed in version 3.9: This function is now also available in the + limited API. + +Properly implementing *note tp_repr: 427a. for container types requires +special recursion handling. In addition to protecting the stack, *note +tp_repr: 427a. also needs to track objects to prevent cycles. The +following two functions facilitate this functionality. Effectively, +these are the C equivalent to *note reprlib.recursive_repr(): ea3. + + -- C Function: int Py_ReprEnter (PyObject *object) + ` Part of the *note Stable ABI: 4b8.' Called at the beginning of + the *note tp_repr: 427a. implementation to detect cycles. + + If the object has already been processed, the function returns a + positive integer. In that case the *note tp_repr: 427a. + implementation should return a string object indicating a cycle. + As examples, *note dict: 16e. objects return ‘{...}’ and *note + list: 1e9. objects return ‘[...]’. + + The function will return a negative integer if the recursion limit + is reached. In that case the *note tp_repr: 427a. implementation + should typically return ‘NULL’. + + Otherwise, the function returns zero and the *note tp_repr: 427a. + implementation can continue normally. + + -- C Function: void Py_ReprLeave (PyObject *object) + ` Part of the *note Stable ABI: 4b8.' Ends a *note Py_ReprEnter(): + 4458. Must be called once for each invocation of *note + Py_ReprEnter(): 4458. that returns zero. + + +File: python.info, Node: Standard Exceptions, Next: Standard Warning Categories, Prev: Recursion Control, Up: Exception Handling + +7.5.10 Standard Exceptions +-------------------------- + +All standard Python exceptions are available as global variables whose +names are ‘PyExc_’ followed by the Python exception name. These have +the type *note PyObject: 4cf.*; they are all class objects. For +completeness, here are all the variables: + +C Name Python Name Notes + +--------------------------------------------------------------------------------------------------- + +‘PyExc_BaseException’ *note BaseException: 17d. (1) + + +‘PyExc_Exception’ *note Exception: 61c. (2) + + +‘PyExc_ArithmeticError’ *note ArithmeticError: 1cde. (3) + + +‘PyExc_AssertionError’ *note AssertionError: 26e. + + +‘PyExc_AttributeError’ *note AttributeError: 19d. + + +‘PyExc_BlockingIOError’ *note BlockingIOError: d07. + + +‘PyExc_BrokenPipeError’ *note BrokenPipeError: d0c. + + +‘PyExc_BufferError’ *note BufferError: 1211. + + +‘PyExc_ChildProcessError’ *note ChildProcessError: d08. + + +‘PyExc_ConnectionAbortedError’ *note ConnectionAbortedError: d0d. + + +‘PyExc_ConnectionError’ *note ConnectionError: a8b. + + +‘PyExc_ConnectionRefusedError’ *note ConnectionRefusedError: d0e. + + +‘PyExc_ConnectionResetError’ *note ConnectionResetError: d0f. + + +‘PyExc_EOFError’ *note EOFError: f7d. + + +‘PyExc_FileExistsError’ *note FileExistsError: ccc. + + +‘PyExc_FileNotFoundError’ *note FileNotFoundError: b53. + + +‘PyExc_FloatingPointError’ *note FloatingPointError: 1cdf. + + +‘PyExc_GeneratorExit’ *note GeneratorExit: 1035. + + +‘PyExc_ImportError’ *note ImportError: 511. + + +‘PyExc_IndentationError’ *note IndentationError: 393. + + +‘PyExc_IndexError’ *note IndexError: 116b. + + +‘PyExc_InterruptedError’ *note InterruptedError: a05. + + +‘PyExc_IsADirectoryError’ *note IsADirectoryError: d09. + + +‘PyExc_KeyError’ *note KeyError: 6f5. + + +‘PyExc_KeyboardInterrupt’ *note KeyboardInterrupt: 611. + + +‘PyExc_LookupError’ *note LookupError: 1c1f. (4) + + +‘PyExc_MemoryError’ *note MemoryError: 127a. + + +‘PyExc_ModuleNotFoundError’ *note ModuleNotFoundError: 79e. + + +‘PyExc_NameError’ *note NameError: 396. + + +‘PyExc_NotADirectoryError’ *note NotADirectoryError: d0a. + + +‘PyExc_NotImplementedError’ *note NotImplementedError: 9c7. + + +‘PyExc_OSError’ *note OSError: 413. (5) + + +‘PyExc_OverflowError’ *note OverflowError: 4a4. + + +‘PyExc_PermissionError’ *note PermissionError: 9b9. + + +‘PyExc_ProcessLookupError’ *note ProcessLookupError: d0b. + + +‘PyExc_RecursionError’ *note RecursionError: 9e7. + + +‘PyExc_ReferenceError’ *note ReferenceError: 1148. + + +‘PyExc_RuntimeError’ *note RuntimeError: 6e9. + + +‘PyExc_StopAsyncIteration’ *note StopAsyncIteration: 1460. + + +‘PyExc_StopIteration’ *note StopIteration: 865. + + +‘PyExc_SyntaxError’ *note SyntaxError: 2d6. + + +‘PyExc_SystemError’ *note SystemError: 9b5. + + +‘PyExc_SystemExit’ *note SystemExit: 9b6. + + +‘PyExc_TabError’ *note TabError: 116d. + + +‘PyExc_TimeoutError’ *note TimeoutError: 429. + + +‘PyExc_TypeError’ *note TypeError: 19c. + + +‘PyExc_UnboundLocalError’ *note UnboundLocalError: 116c. + + +‘PyExc_UnicodeDecodeError’ *note UnicodeDecodeError: 65c. + + +‘PyExc_UnicodeEncodeError’ *note UnicodeEncodeError: 246. + + +‘PyExc_UnicodeError’ *note UnicodeError: f52. + + +‘PyExc_UnicodeTranslateError’ *note UnicodeTranslateError: 1cf6. + + +‘PyExc_ValueError’ *note ValueError: 1c8. + + +‘PyExc_ZeroDivisionError’ *note ZeroDivisionError: 58d. + + +New in version 3.3: ‘PyExc_BlockingIOError’, ‘PyExc_BrokenPipeError’, +‘PyExc_ChildProcessError’, ‘PyExc_ConnectionError’, +‘PyExc_ConnectionAbortedError’, ‘PyExc_ConnectionRefusedError’, +‘PyExc_ConnectionResetError’, ‘PyExc_FileExistsError’, +‘PyExc_FileNotFoundError’, ‘PyExc_InterruptedError’, +‘PyExc_IsADirectoryError’, ‘PyExc_NotADirectoryError’, +‘PyExc_PermissionError’, ‘PyExc_ProcessLookupError’ and +‘PyExc_TimeoutError’ were introduced following PEP 3151(6). + +New in version 3.5: ‘PyExc_StopAsyncIteration’ and +‘PyExc_RecursionError’. + +New in version 3.6: ‘PyExc_ModuleNotFoundError’. + +These are compatibility aliases to ‘PyExc_OSError’: + +C Name Notes + +--------------------------------------------------------- + +‘PyExc_EnvironmentError’ + +‘PyExc_IOError’ + +‘PyExc_WindowsError’ (7) + + +Changed in version 3.3: These aliases used to be separate exception +types. + +Notes: + + ---------- Footnotes ---------- + + (1) This is a base class for other standard exceptions. + + (2) This is a base class for other standard exceptions. + + (3) This is a base class for other standard exceptions. + + (4) This is a base class for other standard exceptions. + + (5) This is a base class for other standard exceptions. + + (6) https://peps.python.org/pep-3151/ + + (7) Only defined on Windows; protect code that uses this by testing +that the preprocessor macro ‘MS_WINDOWS’ is defined. + + +File: python.info, Node: Standard Warning Categories, Prev: Standard Exceptions, Up: Exception Handling + +7.5.11 Standard Warning Categories +---------------------------------- + +All standard Python warning categories are available as global variables +whose names are ‘PyExc_’ followed by the Python exception name. These +have the type *note PyObject: 4cf.*; they are all class objects. For +completeness, here are all the variables: + +C Name Python Name Notes + +---------------------------------------------------------------------------------------------------- + +‘PyExc_Warning’ *note Warning: 1d0c. (1) + + +‘PyExc_BytesWarning’ *note BytesWarning: 88f. + + +‘PyExc_DeprecationWarning’ *note DeprecationWarning: 2d4. + + +‘PyExc_FutureWarning’ *note FutureWarning: 73e. + + +‘PyExc_ImportWarning’ *note ImportWarning: 46d. + + +‘PyExc_PendingDeprecationWarning’ *note PendingDeprecationWarning: 503. + + +‘PyExc_ResourceWarning’ *note ResourceWarning: 8a9. + + +‘PyExc_RuntimeWarning’ *note RuntimeWarning: 6ef. + + +‘PyExc_SyntaxWarning’ *note SyntaxWarning: 2d5. + + +‘PyExc_UnicodeWarning’ *note UnicodeWarning: 1087. + + +‘PyExc_UserWarning’ *note UserWarning: 1d0d. + + +New in version 3.2: ‘PyExc_ResourceWarning’. + +Notes: + + ---------- Footnotes ---------- + + (1) This is a base class for other standard warning categories. + + +File: python.info, Node: Utilities<2>, Next: Abstract Objects Layer, Prev: Exception Handling, Up: Python/C API Reference Manual + +7.6 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:: +* Reflection:: +* Codec registry and support functions:: + + +File: python.info, Node: Operating System Utilities, Next: System Functions, Up: Utilities<2> + +7.6.1 Operating System Utilities +-------------------------------- + + -- C Function: *note PyObject: 4cf. *PyOS_FSPath (PyObject *path) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.6.' Return the file system representation for + `path'. If the object is a *note str: 1b3. or *note bytes: 1b4. + object, then its reference count is incremented. If the object + implements the *note os.PathLike: 8bf. interface, then *note + __fspath__(): 8c0. is returned as long as it is a *note str: 1b3. + or *note bytes: 1b4. object. Otherwise *note TypeError: 19c. is + raised and ‘NULL’ is returned. + + New in version 3.6. + + -- 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 ‘isatty(fileno(fp))’ is true. If the global flag *note + Py_InteractiveFlag: 44b0. is true, this function also returns true + if the `filename' pointer is ‘NULL’ or if the name is equal to one + of the strings ‘''’ or ‘'???'’. + + -- C Function: void PyOS_BeforeFork () + ` Part of the *note Stable ABI: 4b8. on platforms with fork() since + version 3.7.' Function to prepare some internal state before a + process fork. This should be called before calling ‘fork()’ or any + similar function that clones the current process. Only available + on systems where ‘fork()’ is defined. + + Warning: The C ‘fork()’ call should only be made from the + *note “main” thread: 44b1. (of the *note “main” interpreter: + 44b2.). The same is true for ‘PyOS_BeforeFork()’. + + New in version 3.7. + + -- C Function: void PyOS_AfterFork_Parent () + ` Part of the *note Stable ABI: 4b8. 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 ‘fork()’ or any similar function that clones the current + process, regardless of whether process cloning was successful. + Only available on systems where ‘fork()’ is defined. + + Warning: The C ‘fork()’ call should only be made from the + *note “main” thread: 44b1. (of the *note “main” interpreter: + 44b2.). The same is true for ‘PyOS_AfterFork_Parent()’. + + New in version 3.7. + + -- C Function: void PyOS_AfterFork_Child () + ` Part of the *note Stable ABI: 4b8. 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 ‘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 ‘fork()’ is + defined. + + Warning: The C ‘fork()’ call should only be made from the + *note “main” thread: 44b1. (of the *note “main” interpreter: + 44b2.). The same is true for ‘PyOS_AfterFork_Child()’. + + New in version 3.7. + + See also + ........ + + *note os.register_at_fork(): 7b8. allows registering custom Python + functions to be called by *note PyOS_BeforeFork(): 825, *note + PyOS_AfterFork_Parent(): 826. and *note PyOS_AfterFork_Child(): + 6fc. + + -- C Function: void PyOS_AfterFork () + ` Part of the *note Stable ABI: 4b8. 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 *note + PyOS_AfterFork_Child(): 6fc. + + -- C Function: int PyOS_CheckStack () + ` Part of the *note Stable ABI: 4b8. on platforms with + USE_STACKCHECK since version 3.7.' Return true when the + interpreter runs out of stack space. This is a reliable check, but + is only available when ‘USE_STACKCHECK’ is defined (currently on + certain versions of Windows using the Microsoft Visual C++ + compiler). ‘USE_STACKCHECK’ will be defined automatically; you + should never change the definition in your own code. + + -- C Function: PyOS_sighandler_t PyOS_getsig (int i) + ` Part of the *note Stable ABI: 4b8.' Return the current signal + handler for signal `i'. This is a thin wrapper around either + ‘sigaction()’ or ‘signal()’. Do not call those functions directly! + ‘PyOS_sighandler_t’ is a typedef alias for void (*)(int). + + -- C Function: PyOS_sighandler_t PyOS_setsig (int i, PyOS_sighandler_t + h) + ` Part of the *note Stable ABI: 4b8.' Set the signal handler for + signal `i' to be `h'; return the old signal handler. This is a + thin wrapper around either ‘sigaction()’ or ‘signal()’. Do not + call those functions directly! ‘PyOS_sighandler_t’ is a typedef + alias for void (*)(int). + + -- C Function: wchar_t *Py_DecodeLocale (const char *arg, size_t *size) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' + Warning: This function should not be called directly: use the + *note PyConfig: 370. API with the ‘PyConfig_SetBytesString()’ + function which ensures that *note Python is preinitialized: + 354d. + + This function must not be called before *note Python is + preinitialized: 354d. and so that the LC_CTYPE locale is + properly configured: see the *note Py_PreInitialize(): 601. + function. + + Decode a byte string from the *note filesystem encoding and error + handler: 1793. If the error handler is *note surrogateescape error + handler: 1e47, 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 + *note PyMem_RawFree(): 44b3. to free the memory. If size is not + ‘NULL’, write the number of wide characters excluding the null + character into ‘*size’ + + Return ‘NULL’ on decoding error or memory allocation error. If + `size' is not ‘NULL’, ‘*size’ is set to ‘(size_t)-1’ on memory + error or set to ‘(size_t)-2’ on decoding error. + + The *note filesystem encoding and error handler: 1793. are selected + by ‘PyConfig_Read()’: see *note filesystem_encoding: 24dd. and + *note filesystem_errors: 24de. members of *note PyConfig: 370. + + Decoding errors should never happen, unless there is a bug in the C + library. + + Use the *note Py_EncodeLocale(): 82e. function to encode the + character string back to a byte string. + + See also + ........ + + The *note PyUnicode_DecodeFSDefaultAndSize(): 442c. and *note + PyUnicode_DecodeLocaleAndSize(): 82f. functions. + + New in version 3.5. + + Changed in version 3.7: The function now uses the UTF-8 encoding in + the *note Python UTF-8 Mode: 229. + + Changed in version 3.8: The function now uses the UTF-8 encoding on + Windows if *note Py_LegacyWindowsFSEncodingFlag: 44b4. is zero; + + -- C Function: char *Py_EncodeLocale (const wchar_t *text, size_t + *error_pos) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Encode a + wide character string to the *note filesystem encoding and error + handler: 1793. If the error handler is *note surrogateescape error + handler: 1e47, 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 *note + PyMem_Free(): 10a8. to free the memory. Return ‘NULL’ on encoding + error or memory allocation error. + + If error_pos is not ‘NULL’, ‘*error_pos’ is set to ‘(size_t)-1’ on + success, or set to the index of the invalid character on encoding + error. + + The *note filesystem encoding and error handler: 1793. are selected + by ‘PyConfig_Read()’: see *note filesystem_encoding: 24dd. and + *note filesystem_errors: 24de. members of *note PyConfig: 370. + + Use the *note Py_DecodeLocale(): 82d. function to decode the bytes + string back to a wide character string. + + Warning: This function must not be called before *note Python + is preinitialized: 354d. and so that the LC_CTYPE locale is + properly configured: see the *note Py_PreInitialize(): 601. + function. + + See also + ........ + + The *note PyUnicode_EncodeFSDefault(): 1491. and *note + PyUnicode_EncodeLocale(): 830. functions. + + New in version 3.5. + + Changed in version 3.7: The function now uses the UTF-8 encoding in + the *note Python UTF-8 Mode: 229. + + Changed in version 3.8: The function now uses the UTF-8 encoding on + Windows if *note Py_LegacyWindowsFSEncodingFlag: 44b4. is zero. + + +File: python.info, Node: System Functions, Next: Process Control, Prev: Operating System Utilities, Up: Utilities<2> + +7.6.2 System Functions +---------------------- + +These are utility functions that make functionality from the *note sys: +f9. module accessible to C code. They all work with the current +interpreter thread’s *note sys: f9. module’s dict, which is contained in +the internal thread state structure. + + -- C Function: *note PyObject: 4cf. *PySys_GetObject (const char *name) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return the object `name' from the *note sys: f9. module or + ‘NULL’ if it does not exist, without setting an exception. + + -- C Function: int PySys_SetObject (const char *name, PyObject *v) + ` Part of the *note Stable ABI: 4b8.' Set `name' in the *note sys: + f9. module to `v' unless `v' is ‘NULL’, in which case `name' is + deleted from the sys module. Returns ‘0’ on success, ‘-1’ on + error. + + -- C Function: void PySys_ResetWarnOptions () + ` Part of the *note Stable ABI: 4b8.' Reset *note sys.warnoptions: + 80d. to an empty list. This function may be called prior to *note + Py_Initialize(): 4e7. + + -- C Function: void PySys_AddWarnOption (const wchar_t *s) + ` Part of the *note Stable ABI: 4b8.' This API is kept for + backward compatibility: setting *note PyConfig.warnoptions: 44b7. + should be used instead, see *note Python Initialization + Configuration: 371. + + Append `s' to *note sys.warnoptions: 80d. This function must be + called prior to *note Py_Initialize(): 4e7. in order to affect the + warnings filter list. + + Deprecated since version 3.11. + + -- C Function: void PySys_AddWarnOptionUnicode (PyObject *unicode) + ` Part of the *note Stable ABI: 4b8.' This API is kept for + backward compatibility: setting *note PyConfig.warnoptions: 44b7. + should be used instead, see *note Python Initialization + Configuration: 371. + + Append `unicode' to *note sys.warnoptions: 80d. + + Note: this function is not currently usable from outside the + CPython implementation, as it must be called prior to the implicit + import of *note warnings: 130. in *note Py_Initialize(): 4e7. to be + effective, but can’t be called until enough of the runtime has been + initialized to permit the creation of Unicode objects. + + Deprecated since version 3.11. + + -- C Function: void PySys_SetPath (const wchar_t *path) + ` Part of the *note Stable ABI: 4b8.' This API is kept for + backward compatibility: setting *note PyConfig.module_search_paths: + 1c1. and *note PyConfig.module_search_paths_set: 1c0. should be + used instead, see *note Python Initialization Configuration: 371. + + Set *note sys.path: 162. to a list object of paths found in `path' + which should be a list of paths separated with the platform’s + search path delimiter (‘:’ on Unix, ‘;’ on Windows). + + Deprecated since version 3.11. + + -- C Function: void PySys_WriteStdout (const char *format, ...) + ` Part of the *note Stable ABI: 4b8.' Write the output string + described by `format' to *note sys.stdout: 72a. 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 “%.s” where + is a decimal number calculated so that 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 *note sys.stdout: 72a. is unset, the + formatted message is written to the real (C level) `stdout'. + + -- C Function: void PySys_WriteStderr (const char *format, ...) + ` Part of the *note Stable ABI: 4b8.' As *note + PySys_WriteStdout(): 43ef, but write to *note sys.stderr: 581. or + `stderr' instead. + + -- C Function: void PySys_FormatStdout (const char *format, ...) + ` Part of the *note Stable ABI: 4b8.' Function similar to + PySys_WriteStdout() but format the message using *note + PyUnicode_FromFormatV(): 443e. and don’t truncate the message to an + arbitrary length. + + New in version 3.2. + + -- C Function: void PySys_FormatStderr (const char *format, ...) + ` Part of the *note Stable ABI: 4b8.' As *note + PySys_FormatStdout(): 43ea, but write to *note sys.stderr: 581. or + `stderr' instead. + + New in version 3.2. + + -- C Function: void PySys_AddXOption (const wchar_t *s) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' This API + is kept for backward compatibility: setting *note + PyConfig.xoptions: 44b8. should be used instead, see *note Python + Initialization Configuration: 371. + + Parse `s' as a set of *note -X: 174. options and add them to the + current options mapping as returned by *note PySys_GetXOptions(): + 43eb. This function may be called prior to *note Py_Initialize(): + 4e7. + + New in version 3.2. + + Deprecated since version 3.11. + + -- C Function: *note PyObject: 4cf. *PySys_GetXOptions () + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8. since version 3.7.' Return the current dictionary of *note + -X: 174. options, similarly to *note sys._xoptions: 1784. On + error, ‘NULL’ is returned and an exception is set. + + New in version 3.2. + + -- C Function: int PySys_Audit (const char *event, const char *format, + ...) + + Raise an auditing event with any active hooks. Return zero for + success and non-zero with an exception set on failure. + + If any hooks have been added, `format' and other arguments will be + used to construct a tuple to pass. Apart from ‘N’, the same format + characters as used in *note Py_BuildValue(): 4da. are available. + If the built value is not a tuple, it will be added into a + single-element tuple. (The ‘N’ format option 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 ‘#’ format characters should always be treated as *note + Py_ssize_t: 6b1, regardless of whether ‘PY_SSIZE_T_CLEAN’ was + defined. + + *note sys.audit(): 1387. performs the same function from Python + code. + + New in version 3.8. + + Changed in version 3.8.2: Require *note Py_ssize_t: 6b1. for ‘#’ + format characters. Previously, an unavoidable deprecation warning + was raised. + + -- 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 *note Py_Initialize(): 4e7. + When called after runtime initialization, existing audit hooks are + notified and may silently abort the operation by raising an error + subclassed from *note Exception: 61c. (other errors will not be + silenced). + + The hook function is of type int (*)(const char *event, *note + PyObject: 4cf. *args, void *userData), where `args' is guaranteed + to be a *note PyTupleObject: 44b9. The hook function is always + called with the GIL held by the Python interpreter that raised the + event. + + See PEP 578(1) for a detailed description of auditing. Functions + in the runtime and standard library that raise events are listed in + the *note audit events table: 1269. Details are in each function’s + documentation. + + If the interpreter is initialized, this function raises a auditing + event ‘sys.addaudithook’ with no arguments. If any existing hooks + raise an exception derived from *note Exception: 61c, 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. + + New in version 3.8. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0578/ + + +File: python.info, Node: Process Control, Next: Importing Modules<2>, Prev: System Functions, Up: Utilities<2> + +7.6.3 Process Control +--------------------- + + -- C Function: void Py_FatalError (const char *message) + ` Part of the *note Stable ABI: 4b8.' + + 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 ‘abort()’ + is called which will attempt to produce a ‘core’ file. + + The ‘Py_FatalError()’ function is replaced with a macro which logs + automatically the name of the current function, unless the + ‘Py_LIMITED_API’ macro is defined. + + Changed in version 3.9: Log the function name automatically. + + -- C Function: void Py_Exit (int status) + ` Part of the *note Stable ABI: 4b8.' + + Exit the current process. This calls *note Py_FinalizeEx(): 986. + and then calls the standard C library function ‘exit(status)’. If + *note Py_FinalizeEx(): 986. indicates an error, the exit status is + set to 120. + + Changed in version 3.6: Errors from finalization no longer ignored. + + -- C Function: int Py_AtExit (void (*func)()) + ` Part of the *note Stable ABI: 4b8.' + + Register a cleanup function to be called by *note Py_FinalizeEx(): + 986. 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, *note + Py_AtExit(): 444c. returns ‘0’; on failure, it returns ‘-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'. + + +File: python.info, Node: Importing Modules<2>, Next: Data marshalling support, Prev: Process Control, Up: Utilities<2> + +7.6.4 Importing Modules +----------------------- + + -- C Function: *note PyObject: 4cf. *PyImport_ImportModule (const char + *name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + This is a simplified interface to *note PyImport_ImportModuleEx(): + e59. below, leaving the `globals' and `locals' arguments set to + ‘NULL’ and `level' set to 0. When the `name' argument contains a + dot (when it specifies a submodule of a package), the `fromlist' + argument is set to the list ‘['*']’ so that the return value is the + named module rather than the top-level package containing it as + would otherwise be the case. (Unfortunately, this has an + additional side effect when `name' in fact specifies a subpackage + instead of a submodule: the submodules specified in the package’s + ‘__all__’ variable are loaded.) Return a new reference to the + imported module, or ‘NULL’ with an exception set on failure. A + failing import of a module doesn’t leave the module in *note + sys.modules: 1382. + + This function always uses absolute imports. + + -- C Function: *note PyObject: 4cf. *PyImport_ImportModuleNoBlock + (const char *name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' This function is a deprecated alias of *note + PyImport_ImportModule(): 4ac. + + 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. + + -- C Function: *note PyObject: 4cf. *PyImport_ImportModuleEx (const + char *name, PyObject *globals, PyObject *locals, PyObject + *fromlist) + `Return value: New reference.' + + Import a module. This is best described by referring to the + built-in Python function *note __import__(): 510. + + The return value is a new reference to the imported module or + top-level package, or ‘NULL’ with an exception set on failure. + Like for *note __import__(): 510, 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 *note + PyImport_ImportModule(): 4ac. + + -- C Function: *note PyObject: 4cf. *PyImport_ImportModuleLevelObject + (PyObject *name, PyObject *globals, PyObject *locals, PyObject + *fromlist, int level) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Import a module. This is best described by + referring to the built-in Python function *note __import__(): 510, + as the standard *note __import__(): 510. function calls this + function directly. + + The return value is a new reference to the imported module or + top-level package, or ‘NULL’ with an exception set on failure. + Like for *note __import__(): 510, the return value when a submodule + of a package was requested is normally the top-level package, + unless a non-empty `fromlist' was given. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyImport_ImportModuleLevel (const + char *name, PyObject *globals, PyObject *locals, PyObject + *fromlist, int level) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Similar to *note PyImport_ImportModuleLevelObject(): 435e, + 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. + + -- C Function: *note PyObject: 4cf. *PyImport_Import (PyObject *name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 *note __import__(): 510. function + from the ‘__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. + + -- C Function: *note PyObject: 4cf. *PyImport_ReloadModule (PyObject + *m) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Reload a module. Return a new reference to the reloaded + module, or ‘NULL’ with an exception set on failure (the module + still exists in this case). + + -- C Function: *note PyObject: 4cf. *PyImport_AddModuleObject (PyObject + *name) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8. since version 3.7.' Return the module object corresponding to + a module name. The `name' argument may be of the form + ‘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 ‘NULL’ with an exception set on + failure. + + Note: This function does not load or import the module; if the + module wasn’t already loaded, you will get an empty module + object. Use *note PyImport_ImportModule(): 4ac. 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. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyImport_AddModule (const char + *name) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Similar to *note PyImport_AddModuleObject(): 4354, but the + name is a UTF-8 encoded string instead of a Unicode object. + + -- C Function: *note PyObject: 4cf. *PyImport_ExecCodeModule (const + char *name, PyObject *co) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Given a module name (possibly of the form ‘package.module’) and a + code object read from a Python bytecode file or obtained from the + built-in function *note compile(): 310, load the module. Return a + new reference to the module object, or ‘NULL’ with an exception set + if an error occurred. `name' is removed from *note sys.modules: + 1382. in error cases, even if `name' was already in *note + sys.modules: 1382. on entry to *note PyImport_ExecCodeModule(): + 4355. Leaving incompletely initialized modules in *note + sys.modules: 1382. 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 *note __spec__: 19bd. and *note __loader__: cca. will + be set, if not set already, with the appropriate values. The + spec’s loader will be set to the module’s ‘__loader__’ (if set) and + to an instance of ‘SourceFileLoader’ otherwise. + + The module’s *note __file__: 1902. attribute will be set to the + code object’s ‘co_filename’. If applicable, *note __cached__: e69. + will also be set. + + This function will reload the module if it was already imported. + See *note PyImport_ReloadModule(): 435f. for the intended way to + reload a module. + + If `name' points to a dotted name of the form ‘package.module’, any + package structures not already created will still not be created. + + See also *note PyImport_ExecCodeModuleEx(): 4356. and *note + PyImport_ExecCodeModuleWithPathnames(): 4358. + + -- C Function: *note PyObject: 4cf. *PyImport_ExecCodeModuleEx (const + char *name, PyObject *co, const char *pathname) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Like *note PyImport_ExecCodeModule(): 4355, but the *note + __file__: 1902. attribute of the module object is set to `pathname' + if it is non-‘NULL’. + + See also *note PyImport_ExecCodeModuleWithPathnames(): 4358. + + -- C Function: *note PyObject: 4cf. *PyImport_ExecCodeModuleObject + (PyObject *name, PyObject *co, PyObject *pathname, PyObject + *cpathname) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Like *note PyImport_ExecCodeModuleEx(): 4356, + but the *note __cached__: e69. attribute of the module object is + set to `cpathname' if it is non-‘NULL’. Of the three functions, + this is the preferred one to use. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. + *PyImport_ExecCodeModuleWithPathnames (const char *name, + PyObject *co, const char *pathname, const char *cpathname) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Like *note PyImport_ExecCodeModuleObject(): 4357, 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 ‘NULL’. + + New in version 3.2. + + Changed in version 3.3: Uses *note imp.source_from_cache(): 4076. + in calculating the source path if only the bytecode path is + provided. + + -- C Function: long PyImport_GetMagicNumber () + ` Part of the *note Stable ABI: 4b8.' Return the magic number for + Python bytecode files (a.k.a. ‘.pyc’ file). The magic number + should be present in the first four bytes of the bytecode file, in + little-endian byte order. Returns ‘-1’ on error. + + Changed in version 3.3: Return value of ‘-1’ upon failure. + + -- C Function: const char *PyImport_GetMagicTag () + ` Part of the *note Stable ABI: 4b8.' Return the magic tag string + for PEP 3147(1) format Python bytecode file names. Keep in mind + that the value at ‘sys.implementation.cache_tag’ is authoritative + and should be used instead of this function. + + New in version 3.2. + + -- C Function: *note PyObject: 4cf. *PyImport_GetModuleDict () + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return the dictionary used for the module administration + (a.k.a. ‘sys.modules’). Note that this is a per-interpreter + variable. + + -- C Function: *note PyObject: 4cf. *PyImport_GetModule (PyObject + *name) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.8.' Return the already imported module with the + given name. If the module has not been imported yet then returns + ‘NULL’ but does not set an error. Returns ‘NULL’ and sets an error + if the lookup failed. + + New in version 3.7. + + -- C Function: *note PyObject: 4cf. *PyImport_GetImporter (PyObject + *path) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a finder object for a *note sys.path: + 162./‘pkg.__path__’ item `path', possibly by fetching it from the + *note sys.path_importer_cache: 1b2. dict. If it wasn’t yet cached, + traverse *note sys.path_hooks: cd0. until a hook is found that can + handle the path item. Return ‘None’ if no hook could; this tells + our caller that the *note path based finder: 19b2. could not find a + finder for this path item. Cache the result in *note + sys.path_importer_cache: 1b2. Return a new reference to the finder + object. + + -- C Function: int PyImport_ImportFrozenModuleObject (PyObject *name) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Load a frozen module named `name'. Return ‘1’ + for success, ‘0’ if the module is not found, and ‘-1’ with an + exception set if the initialization failed. To access the imported + module on a successful load, use *note PyImport_ImportModule(): + 4ac. (Note the misnomer — this function would reload the module if + it was already imported.) + + New in version 3.3. + + Changed in version 3.4: The ‘__file__’ attribute is no longer set + on the module. + + -- C Function: int PyImport_ImportFrozenModule (const char *name) + ` Part of the *note Stable ABI: 4b8.' Similar to *note + PyImport_ImportFrozenModuleObject(): 435d, but the name is a UTF-8 + encoded string instead of a Unicode object. + + -- C Struct: struct _frozen + + This is the structure type definition for frozen module + descriptors, as generated by the ‘freeze’ utility (see + ‘Tools/freeze/’ in the Python source distribution). Its + definition, found in ‘Include/import.h’, is: + + struct _frozen { + const char *name; + const unsigned char *code; + int size; + bool is_package; + }; + + Changed in version 3.11: The new ‘is_package’ field indicates + whether the module is a package or not. This replaces setting the + ‘size’ field to a negative value. + + -- C Variable: const struct *note _frozen: 347. *PyImport_FrozenModules + + This pointer is initialized to point to an array of *note _frozen: + 347. records, terminated by one whose members are all ‘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. + + -- C Function: int PyImport_AppendInittab (const char *name, PyObject + *(*initfunc)(void)) + ` Part of the *note Stable ABI: 4b8.' Add a single module to the + existing table of built-in modules. This is a convenience wrapper + around *note PyImport_ExtendInittab(): 12bd, returning ‘-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 *note Py_Initialize(): 4e7. + + -- C Struct: struct _inittab + + Structure describing a single entry in the list of built-in + modules. Each of these structures gives the name and + initialization function for a module built into the interpreter. + The name is an ASCII encoded string. Programs which embed Python + may use an array of these structures in conjunction with *note + PyImport_ExtendInittab(): 12bd. to provide additional built-in + modules. The structure is defined in ‘Include/import.h’ as: + + struct _inittab { + const char *name; /* ASCII encoded string */ + PyObject* (*initfunc)(void); + }; + + -- 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 ‘NULL’ + for the ‘name’ field; failure to provide the sentinel value can + result in a memory fault. Returns ‘0’ on success or ‘-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 *note Py_Initialize(): + 4e7. + + If Python is initialized multiple times, *note + PyImport_AppendInittab(): 12bc. or *note PyImport_ExtendInittab(): + 12bd. must be called before each Python initialization. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + +File: python.info, Node: Data marshalling support, Next: Parsing arguments and building values, Prev: Importing Modules<2>, Up: Utilities<2> + +7.6.5 Data marshalling support +------------------------------ + +These routines allow C code to work with serialized objects using the +same data format as the *note marshal: ae. 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 two versions of the data format: version 0 is the +historical version, version 1 shares interned strings in the file, and +upon unmarshalling. Version 2 uses a binary format for floating point +numbers. ‘Py_MARSHAL_VERSION’ indicates the current file format +(currently 2). + + -- 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. + + -- C Function: void PyMarshal_WriteObjectToFile (PyObject *value, FILE + *file, int version) + + Marshal a Python object, `value', to `file'. `version' indicates + the file format. + + -- C Function: *note PyObject: 4cf. *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. + +The following functions allow marshalled values to be read back in. + + -- 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 (*note EOFError: f7d.) and + returns ‘-1’. + + -- 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 (*note EOFError: f7d.) and + returns ‘-1’. + + -- C Function: *note PyObject: 4cf. *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 (*note EOFError: f7d, + *note ValueError: 1c8. or *note TypeError: 19c.) and returns + ‘NULL’. + + -- C Function: *note PyObject: 4cf. *PyMarshal_ReadLastObjectFromFile + (FILE *file) + `Return value: New reference.' Return a Python object from the + data stream in a FILE* opened for reading. Unlike *note + PyMarshal_ReadObjectFromFile(): 44c5, 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 these variant if + you are certain that you won’t be reading anything else from the + file. + + On error, sets the appropriate exception (*note EOFError: f7d, + *note ValueError: 1c8. or *note TypeError: 19c.) and returns + ‘NULL’. + + -- C Function: *note PyObject: 4cf. *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 (*note EOFError: f7d, + *note ValueError: 1c8. or *note TypeError: 19c.) and returns + ‘NULL’. + + +File: python.info, Node: Parsing arguments and building values, Next: String conversion and formatting, Prev: Data marshalling support, Up: Utilities<2> + +7.6.6 Parsing arguments and building values +------------------------------------------- + +These functions are useful when creating your own extensions functions +and methods. Additional information and examples are available in *note +Extending and Embedding the Python Interpreter: 1625. + +The first three of these functions described, *note PyArg_ParseTuple(): +4d9, *note PyArg_ParseTupleAndKeywords(): 987, and *note PyArg_Parse(): +140d, 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<3>. +* Building values:: + + +File: python.info, Node: Parsing arguments<3>, Next: Building values, Up: Parsing arguments and building values + +7.6.6.1 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:: + + +File: python.info, Node: Strings and buffers, Next: Numbers<2>, Up: Parsing arguments<3> + +7.6.6.2 Strings and buffers +........................... + +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. + +In general, when a format sets a pointer to a buffer, the buffer is +managed by the corresponding Python object, and the buffer shares the +lifetime of this object. You won’t have to release any memory yourself. +The only exceptions are ‘es’, ‘es#’, ‘et’ and ‘et#’. + +However, when a *note Py_buffer: 327. structure gets filled, the +underlying buffer is locked so that the caller can subsequently use the +buffer even inside a *note Py_BEGIN_ALLOW_THREADS: 4250. block without +the risk of mutable data being resized or destroyed. As a result, `you +have to call' *note PyBuffer_Release(): 331. after you have finished +processing the data (or in any early abort case). + +Unless otherwise stated, buffers are not NUL-terminated. + +Some formats require a read-only *note bytes-like object: 9a2, and set a +pointer instead of a buffer structure. They work by checking that the +object’s *note PyBufferProcs.bf_releasebuffer: 334. field is ‘NULL’, +which disallows mutable objects such as *note bytearray: 1a5. + + Note: For all ‘#’ variants of formats (‘s#’, ‘y#’, etc.), the macro + ‘PY_SSIZE_T_CLEAN’ must be defined before including ‘Python.h’. On + Python 3.9 and older, the type of the length argument is *note + Py_ssize_t: 6b1. if the ‘PY_SSIZE_T_CLEAN’ macro is defined, or int + otherwise. + +‘s’ (*note str: 1b3.) [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 *note ValueError: 1c8. exception is raised. Unicode + objects are converted to C strings using ‘'utf-8'’ encoding. If + this conversion fails, a *note UnicodeError: f52. is raised. + + Note: This format does not accept *note bytes-like objects: + 9a2. If you want to accept filesystem paths and convert them + to C character strings, it is preferable to use the ‘O&’ + format with *note PyUnicode_FSConverter(): 98b. as + `converter'. + + Changed in version 3.5: Previously, *note TypeError: 19c. was + raised when embedded null code points were encountered in the + Python string. + +‘s*’ (*note str: 1b3. or *note bytes-like object: 9a2.) [Py_buffer] + + This format accepts Unicode objects as well as bytes-like objects. + It fills a *note Py_buffer: 327. 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 ‘'utf-8'’ + encoding. + +‘s#’ (*note str: 1b3, read-only *note bytes-like object: 9a2.) [const char *, *note Py_ssize_t: 6b1.] + + Like ‘s*’, except that it doesn’t accept mutable objects. 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 ‘'utf-8'’ encoding. + +‘z’ (*note str: 1b3. or ‘None’) [const char *] + + Like ‘s’, but the Python object may also be ‘None’, in which case + the C pointer is set to ‘NULL’. + +‘z*’ (*note str: 1b3, *note bytes-like object: 9a2. or ‘None’) [Py_buffer] + + Like ‘s*’, but the Python object may also be ‘None’, in which case + the ‘buf’ member of the *note Py_buffer: 327. structure is set to + ‘NULL’. + +‘z#’ (*note str: 1b3, read-only *note bytes-like object: 9a2. or ‘None’) [const char *, *note Py_ssize_t: 6b1.] + + Like ‘s#’, but the Python object may also be ‘None’, in which case + the C pointer is set to ‘NULL’. + +‘y’ (read-only *note bytes-like object: 9a2.) [const char *] + + This format converts a bytes-like object to a C pointer to a + character string; it does not accept Unicode objects. The bytes + buffer must not contain embedded null bytes; if it does, a *note + ValueError: 1c8. exception is raised. + + Changed in version 3.5: Previously, *note TypeError: 19c. was + raised when embedded null bytes were encountered in the bytes + buffer. + +‘y*’ (*note bytes-like object: 9a2.) [Py_buffer] + + This variant on ‘s*’ doesn’t accept Unicode objects, only + bytes-like objects. `This is the recommended way to accept binary + data.' + +‘y#’ (read-only *note bytes-like object: 9a2.) [const char *, *note Py_ssize_t: 6b1.] + + This variant on ‘s#’ doesn’t accept Unicode objects, only + bytes-like objects. + +‘S’ (*note bytes: 1b4.) [PyBytesObject *] + + Requires that the Python object is a *note bytes: 1b4. object, + without attempting any conversion. Raises *note TypeError: 19c. if + the object is not a bytes object. The C variable may also be + declared as *note PyObject: 4cf.*. + +‘Y’ (*note bytearray: 1a5.) [PyByteArrayObject *] + + Requires that the Python object is a *note bytearray: 1a5. object, + without attempting any conversion. Raises *note TypeError: 19c. if + the object is not a *note bytearray: 1a5. object. The C variable + may also be declared as *note PyObject: 4cf.*. + +‘u’ (*note str: 1b3.) [const Py_UNICODE *] + + Convert a Python Unicode object to a C pointer to a NUL-terminated + buffer of Unicode characters. You must pass the address of a *note + Py_UNICODE: 388. pointer variable, which will be filled with the + pointer to an existing Unicode buffer. Please note that the width + of a *note Py_UNICODE: 388. character depends on compilation + options (it is either 16 or 32 bits). The Python string must not + contain embedded null code points; if it does, a *note ValueError: + 1c8. exception is raised. + + Changed in version 3.5: Previously, *note TypeError: 19c. was + raised when embedded null code points were encountered in the + Python string. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style *note Py_UNICODE: 388. API; please migrate to + using *note PyUnicode_AsWideCharString(): 4f9. + +‘u#’ (*note str: 1b3.) [const Py_UNICODE *, *note Py_ssize_t: 6b1.] + + This variant on ‘u’ stores into two C variables, the first one a + pointer to a Unicode data buffer, the second one its length. This + variant allows null code points. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style *note Py_UNICODE: 388. API; please migrate to + using *note PyUnicode_AsWideCharString(): 4f9. + +‘Z’ (*note str: 1b3. or ‘None’) [const Py_UNICODE *] + + Like ‘u’, but the Python object may also be ‘None’, in which case + the *note Py_UNICODE: 388. pointer is set to ‘NULL’. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style *note Py_UNICODE: 388. API; please migrate to + using *note PyUnicode_AsWideCharString(): 4f9. + +‘Z#’ (*note str: 1b3. or ‘None’) [const Py_UNICODE *, *note Py_ssize_t: 6b1.] + + Like ‘u#’, but the Python object may also be ‘None’, in which case + the *note Py_UNICODE: 388. pointer is set to ‘NULL’. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style *note Py_UNICODE: 388. API; please migrate to + using *note PyUnicode_AsWideCharString(): 4f9. + +‘U’ (*note str: 1b3.) [PyObject *] + + Requires that the Python object is a Unicode object, without + attempting any conversion. Raises *note TypeError: 19c. if the + object is not a Unicode object. The C variable may also be + declared as *note PyObject: 4cf.*. + +‘w*’ (read-write *note bytes-like object: 9a2.) [Py_buffer] + + This format accepts any object which implements the read-write + buffer interface. It fills a *note Py_buffer: 327. structure + provided by the caller. The buffer may contain embedded null + bytes. The caller have to call *note PyBuffer_Release(): 331. when + it is done with the buffer. + +‘es’ (*note str: 1b3.) [const char *encoding, char **buffer] + + This variant on ‘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 ‘NULL’, in which case + ‘'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. + + *note PyArg_ParseTuple(): 4d9. 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 *note PyMem_Free(): 10a8. to free the + allocated buffer after use. + +‘et’ (*note str: 1b3, *note bytes: 1b4. or *note bytearray: 1a5.) [const char *encoding, char **buffer] + + Same as ‘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. + +‘es#’ (*note str: 1b3.) [const char *encoding, char **buffer, *note Py_ssize_t: 6b1. *buffer_length] + + This variant on ‘s#’ is used for encoding Unicode into a character + buffer. Unlike the ‘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 ‘NULL’, in which case ‘'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 ‘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 *note PyMem_Free(): 10a8. to free + the allocated buffer after usage. + + If `*buffer' points to a non-‘NULL’ pointer (an already allocated + buffer), *note PyArg_ParseTuple(): 4d9. 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 + *note ValueError: 1c8. will be set. + + In both cases, `*buffer_length' is set to the length of the encoded + data without the trailing NUL byte. + +‘et#’ (*note str: 1b3, *note bytes: 1b4. or *note bytearray: 1a5.) [const char *encoding, char **buffer, *note Py_ssize_t: 6b1. *buffer_length] + + Same as ‘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. + + +File: python.info, Node: Numbers<2>, Next: Other objects, Prev: Strings and buffers, Up: Parsing arguments<3> + +7.6.6.3 Numbers +............... + +‘b’ (*note int: 1c7.) [unsigned char] + + Convert a nonnegative Python integer to an unsigned tiny int, + stored in a C unsigned char. + +‘B’ (*note int: 1c7.) [unsigned char] + + Convert a Python integer to a tiny int without overflow checking, + stored in a C unsigned char. + +‘h’ (*note int: 1c7.) [short int] + + Convert a Python integer to a C short int. + +‘H’ (*note int: 1c7.) [unsigned short int] + + Convert a Python integer to a C unsigned short int, without + overflow checking. + +‘i’ (*note int: 1c7.) [int] + + Convert a Python integer to a plain C int. + +‘I’ (*note int: 1c7.) [unsigned int] + + Convert a Python integer to a C unsigned int, without overflow + checking. + +‘l’ (*note int: 1c7.) [long int] + + Convert a Python integer to a C long int. + +‘k’ (*note int: 1c7.) [unsigned long] + + Convert a Python integer to a C unsigned long without overflow + checking. + +‘L’ (*note int: 1c7.) [long long] + + Convert a Python integer to a C long long. + +‘K’ (*note int: 1c7.) [unsigned long long] + + Convert a Python integer to a C unsigned long long without overflow + checking. + +‘n’ (*note int: 1c7.) [*note Py_ssize_t: 6b1.] + + Convert a Python integer to a C *note Py_ssize_t: 6b1. + +‘c’ (*note bytes: 1b4. or *note bytearray: 1a5. of length 1) [char] + + Convert a Python byte, represented as a *note bytes: 1b4. or *note + bytearray: 1a5. object of length 1, to a C char. + + Changed in version 3.3: Allow *note bytearray: 1a5. objects. + +‘C’ (*note str: 1b3. of length 1) [int] + + Convert a Python character, represented as a *note str: 1b3. object + of length 1, to a C int. + +‘f’ (*note float: 3ca.) [float] + + Convert a Python floating point number to a C float. + +‘d’ (*note float: 3ca.) [double] + + Convert a Python floating point number to a C double. + +‘D’ (*note complex: 1b8.) [Py_complex] + + Convert a Python complex number to a C *note Py_complex: 44cc. + structure. + + +File: python.info, Node: Other objects, Next: API Functions, Prev: Numbers<2>, Up: Parsing arguments<3> + +7.6.6.4 Other objects +..................... + +‘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. The object’s reference count is not increased. The + pointer stored is not ‘NULL’. + +‘O!’ (object) [`typeobject', PyObject *] + + Store a Python object in a C object pointer. This is similar to + ‘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 *note PyObject: 4cf.*) into which the object pointer is + stored. If the Python object does not have the required type, + *note TypeError: 19c. is raised. + +‘O&’ (object) [`converter', `anything'] + + 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: + + status = converter(object, address); + + where `object' is the Python object to be converted and `address' + is the void* argument that was passed to the ‘PyArg_Parse*’ + function. The returned `status' should be ‘1’ for a successful + conversion and ‘0’ if the conversion has failed. When the + conversion fails, the `converter' function should raise an + exception and leave the content of `address' unmodified. + + If the `converter' returns ‘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 ‘NULL’; `address' will have the same value as in the + original call. + + Changed in version 3.1: ‘Py_CLEANUP_SUPPORTED’ was added. + +‘p’ (*note bool: 463.) [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 ‘1’ if the expression was true and ‘0’ if it was + false. This accepts any valid Python value. See *note Truth Value + Testing: 1ba2. for more information about how Python tests values + for truth. + + New in version 3.3. + +‘(items)’ (*note tuple: 539.) [`matching-items'] + + The object must be a Python sequence 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. + +It is possible to pass “long” integers (integers whose value exceeds the +platform’s ‘LONG_MAX’) however no proper range checking is done — the +most significant bits are silently truncated when the receiving field is +too small to receive the value (actually, the semantics are inherited +from downcasts in C — your mileage may vary). + +A few other characters have a meaning in a format string. These may not +occur inside nested parentheses. They are: + +‘|’ + + 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, *note PyArg_ParseTuple(): 4d9. does not + touch the contents of the corresponding C variable(s). + +‘$’ + + *note PyArg_ParseTupleAndKeywords(): 987. 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 ‘|’ must always be specified before ‘$’ in the format + string. + + New in version 3.3. + +‘:’ + + 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 *note PyArg_ParseTuple(): 4d9. raises). + +‘;’ + + The list of format units ends here; the string after the semicolon + is used as the error message `instead' of the default error + message. ‘:’ and ‘;’ mutually exclude each other. + +Note that any Python object references which are provided to the caller +are `borrowed' references; 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 ‘PyArg_Parse*’ +functions return true, otherwise they return false and raise an +appropriate exception. When the ‘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. + + +File: python.info, Node: API Functions, Prev: Other objects, Up: Parsing arguments<3> + +7.6.6.5 API Functions +..................... + + -- C Function: int PyArg_ParseTuple (PyObject *args, const char + *format, ...) + ` Part of the *note Stable ABI: 4b8.' 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. + + -- C Function: int PyArg_VaParse (PyObject *args, const char *format, + va_list vargs) + ` Part of the *note Stable ABI: 4b8.' Identical to *note + PyArg_ParseTuple(): 4d9, except that it accepts a va_list rather + than a variable number of arguments. + + -- C Function: int PyArg_ParseTupleAndKeywords (PyObject *args, + PyObject *kw, const char *format, char *keywords[], ...) + ` Part of the *note Stable ABI: 4b8.' Parse the parameters of a + function that takes both positional and keyword parameters into + local variables. The `keywords' argument is a ‘NULL’-terminated + array of keyword parameter names. Empty names denote *note + positional-only parameters: 6d7. Returns true on success; on + failure, it returns false and raises the appropriate exception. + + Changed in version 3.6: Added support for *note positional-only + parameters: 6d7. + + -- C Function: int PyArg_VaParseTupleAndKeywords (PyObject *args, + PyObject *kw, const char *format, char *keywords[], va_list + vargs) + ` Part of the *note Stable ABI: 4b8.' Identical to *note + PyArg_ParseTupleAndKeywords(): 987, except that it accepts a + va_list rather than a variable number of arguments. + + -- C Function: int PyArg_ValidateKeywordArguments (PyObject*) + ` Part of the *note Stable ABI: 4b8.' Ensure that the keys in the + keywords argument dictionary are strings. This is only needed if + *note PyArg_ParseTupleAndKeywords(): 987. is not used, since the + latter already does this check. + + New in version 3.2. + + -- C Function: int PyArg_Parse (PyObject *args, const char *format, + ...) + ` Part of the *note Stable ABI: 4b8.' Function used to deconstruct + the argument lists of “old-style” functions — these are functions + which use the ‘METH_OLDARGS’ parameter parsing method, which has + been removed in Python 3. This is not recommended for use in + parameter parsing in new code, and most code in the standard + interpreter has been modified to no longer use this for that + purpose. It does remain a convenient way to decompose other + tuples, however, and may continue to be used for that purpose. + + -- C Function: int PyArg_UnpackTuple (PyObject *args, const char *name, + Py_ssize_t min, Py_ssize_t max, ...) + ` Part of the *note Stable ABI: 4b8.' 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 *note METH_VARARGS: 1143. 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 + *note PyObject: 4cf.* variable; these will be filled in with the + values from `args'; they will contain *note borrowed references: + 42cb. 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 ‘_weakref’ helper module for weak references: + + 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; + } + + The call to *note PyArg_UnpackTuple(): 1141. in this example is + entirely equivalent to this call to *note PyArg_ParseTuple(): 4d9.: + + PyArg_ParseTuple(args, "O|O:ref", &object, &callback) + + +File: python.info, Node: Building values, Prev: Parsing arguments<3>, Up: Parsing arguments and building values + +7.6.6.6 Building values +....................... + + -- C Function: *note PyObject: 4cf. *Py_BuildValue (const char *format, + ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a new value based on a format string similar to those + accepted by the ‘PyArg_Parse*’ family of functions and a sequence + of values. Returns the value or ‘NULL’ in the case of an error; an + exception will be raised if ‘NULL’ is returned. + + *note Py_BuildValue(): 4da. 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 ‘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 ‘s’ and ‘s#’ formats, the required data + is copied. Buffers provided by the caller are never referenced by + the objects created by *note Py_BuildValue(): 4da. In other words, + if your code invokes ‘malloc()’ and passes the allocated memory to + *note Py_BuildValue(): 4da, your code is responsible for calling + ‘free()’ for that memory once *note Py_BuildValue(): 4da. 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 ‘s#’). This can be + used to make long format strings a tad more readable. + + ‘s’ (*note str: 1b3. or ‘None’) [const char *] + + Convert a null-terminated C string to a Python *note str: 1b3. + object using ‘'utf-8'’ encoding. If the C string pointer is + ‘NULL’, ‘None’ is used. + + ‘s#’ (*note str: 1b3. or ‘None’) [const char *, *note Py_ssize_t: 6b1.] + + Convert a C string and its length to a Python *note str: 1b3. + object using ‘'utf-8'’ encoding. If the C string pointer is + ‘NULL’, the length is ignored and ‘None’ is returned. + + ‘y’ (*note bytes: 1b4.) [const char *] + + This converts a C string to a Python *note bytes: 1b4. object. + If the C string pointer is ‘NULL’, ‘None’ is returned. + + ‘y#’ (*note bytes: 1b4.) [const char *, *note Py_ssize_t: 6b1.] + + This converts a C string and its lengths to a Python object. + If the C string pointer is ‘NULL’, ‘None’ is returned. + + ‘z’ (*note str: 1b3. or ‘None’) [const char *] + + Same as ‘s’. + + ‘z#’ (*note str: 1b3. or ‘None’) [const char *, *note Py_ssize_t: 6b1.] + + Same as ‘s#’. + + ‘u’ (*note str: 1b3.) [const wchar_t *] + + Convert a null-terminated wchar_t buffer of Unicode (UTF-16 or + UCS-4) data to a Python Unicode object. If the Unicode buffer + pointer is ‘NULL’, ‘None’ is returned. + + ‘u#’ (*note str: 1b3.) [const wchar_t *, *note Py_ssize_t: 6b1.] + + Convert a Unicode (UTF-16 or UCS-4) data buffer and its length + to a Python Unicode object. If the Unicode buffer pointer is + ‘NULL’, the length is ignored and ‘None’ is returned. + + ‘U’ (*note str: 1b3. or ‘None’) [const char *] + + Same as ‘s’. + + ‘U#’ (*note str: 1b3. or ‘None’) [const char *, *note Py_ssize_t: 6b1.] + + Same as ‘s#’. + + ‘i’ (*note int: 1c7.) [int] + + Convert a plain C int to a Python integer object. + + ‘b’ (*note int: 1c7.) [char] + + Convert a plain C char to a Python integer object. + + ‘h’ (*note int: 1c7.) [short int] + + Convert a plain C short int to a Python integer object. + + ‘l’ (*note int: 1c7.) [long int] + + Convert a C long int to a Python integer object. + + ‘B’ (*note int: 1c7.) [unsigned char] + + Convert a C unsigned char to a Python integer object. + + ‘H’ (*note int: 1c7.) [unsigned short int] + + Convert a C unsigned short int to a Python integer object. + + ‘I’ (*note int: 1c7.) [unsigned int] + + Convert a C unsigned int to a Python integer object. + + ‘k’ (*note int: 1c7.) [unsigned long] + + Convert a C unsigned long to a Python integer object. + + ‘L’ (*note int: 1c7.) [long long] + + Convert a C long long to a Python integer object. + + ‘K’ (*note int: 1c7.) [unsigned long long] + + Convert a C unsigned long long to a Python integer object. + + ‘n’ (*note int: 1c7.) [*note Py_ssize_t: 6b1.] + + Convert a C *note Py_ssize_t: 6b1. to a Python integer. + + ‘c’ (*note bytes: 1b4. of length 1) [char] + + Convert a C int representing a byte to a Python *note bytes: + 1b4. object of length 1. + + ‘C’ (*note str: 1b3. of length 1) [int] + + Convert a C int representing a character to Python *note str: + 1b3. object of length 1. + + ‘d’ (*note float: 3ca.) [double] + + Convert a C double to a Python floating point number. + + ‘f’ (*note float: 3ca.) [float] + + Convert a C float to a Python floating point number. + + ‘D’ (*note complex: 1b8.) [Py_complex *] + + Convert a C *note Py_complex: 44cc. structure to a Python + complex number. + + ‘O’ (object) [PyObject *] + + Pass a Python object untouched (except for its reference + count, which is incremented by one). If the object passed in + is a ‘NULL’ pointer, it is assumed that this was caused + because the call producing the argument found an error and set + an exception. Therefore, *note Py_BuildValue(): 4da. will + return ‘NULL’ but won’t raise an exception. If no exception + has been raised yet, *note SystemError: 9b5. is set. + + ‘S’ (object) [PyObject *] + + Same as ‘O’. + + ‘N’ (object) [PyObject *] + + Same as ‘O’, except it doesn’t increment the reference count + on the object. Useful when the object is created by a call to + an object constructor in the argument list. + + ‘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 ‘NULL’ if an error occurred. + + ‘(items)’ (*note tuple: 539.) [`matching-items'] + + Convert a sequence of C values to a Python tuple with the same + number of items. + + ‘[items]’ (*note list: 1e9.) [`matching-items'] + + Convert a sequence of C values to a Python list with the same + number of items. + + ‘{items}’ (*note dict: 16e.) [`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. + + If there is an error in the format string, the *note SystemError: + 9b5. exception is set and ‘NULL’ returned. + + -- C Function: *note PyObject: 4cf. *Py_VaBuildValue (const char + *format, va_list vargs) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Identical to *note Py_BuildValue(): 4da, except that it + accepts a va_list rather than a variable number of arguments. + + +File: python.info, Node: String conversion and formatting, Next: Reflection, Prev: Parsing arguments and building values, Up: Utilities<2> + +7.6.7 String conversion and formatting +-------------------------------------- + +Functions for number conversion and formatted string output. + + -- C Function: int PyOS_snprintf (char *str, size_t size, const char + *format, ...) + ` Part of the *note Stable ABI: 4b8.' Output not more than `size' + bytes to `str' according to the format string `format' and the + extra arguments. See the Unix man page ‘snprintf(3)’. + + -- C Function: int PyOS_vsnprintf (char *str, size_t size, const char + *format, va_list va) + ` Part of the *note Stable ABI: 4b8.' Output not more than `size' + bytes to `str' according to the format string `format' and the + variable argument list `va'. Unix man page ‘vsnprintf(3)’. + +*note PyOS_snprintf(): 1144. and *note PyOS_vsnprintf(): 1145. wrap the +Standard C library functions ‘snprintf()’ and ‘vsnprintf()’. Their +purpose is to guarantee consistent behavior in corner cases, which the +Standard C functions do not. + +The wrappers ensure that ‘str[size-1]’ is always ‘'\0'’ upon return. +They never write more than `size' bytes (including the trailing ‘'\0'’) +into str. Both functions require that ‘str != NULL’, ‘size > 0’, +‘format != NULL’ and ‘size < INT_MAX’. + +The return value (`rv') for these functions should be interpreted as +follows: + + * When ‘0 <= rv < size’, the output conversion was successful and + `rv' characters were written to `str' (excluding the trailing + ‘'\0'’ byte at ‘str[rv]’). + + * When ‘rv >= size’, the output conversion was truncated and a buffer + with ‘rv + 1’ bytes would have been needed to succeed. + ‘str[size-1]’ is ‘'\0'’ in this case. + + * When ‘rv < 0’, “something bad happened.” ‘str[size-1]’ is ‘'\0'’ in + this case too, but the rest of `str' is undefined. The exact cause + of the error depends on the underlying platform. + +The following functions provide locale-independent string to number +conversions. + + -- C Function: double PyOS_string_to_double (const char *s, char + **endptr, PyObject *overflow_exception) + ` Part of the *note Stable ABI: 4b8.' Convert a string ‘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 + *note float(): 3ca. constructor, except that ‘s’ must not have + leading or trailing whitespace. The conversion is independent of + the current locale. + + If ‘endptr’ is ‘NULL’, convert the whole string. Raise *note + ValueError: 1c8. and return ‘-1.0’ if the string is not a valid + representation of a floating-point number. + + If endptr is not ‘NULL’, convert as much of the string as possible + and set ‘*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 ‘*endptr’ to point to the beginning of + the string, raise ValueError, and return ‘-1.0’. + + If ‘s’ represents a value that is too large to store in a float + (for example, ‘"1e500"’ is such a string on many platforms) then if + ‘overflow_exception’ is ‘NULL’ return ‘Py_HUGE_VAL’ (with an + appropriate sign) and don’t set any exception. Otherwise, + ‘overflow_exception’ must point to a Python exception object; raise + that exception and return ‘-1.0’. In both cases, set ‘*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 ‘-1.0’. + + New in version 3.1. + + -- C Function: char *PyOS_double_to_string (double val, char + format_code, int precision, int flags, int *ptype) + ` Part of the *note Stable ABI: 4b8.' Convert a double `val' to a + string using supplied `format_code', `precision', and `flags'. + + `format_code' must be one of ‘'e'’, ‘'E'’, ‘'f'’, ‘'F'’, ‘'g'’, + ‘'G'’ or ‘'r'’. For ‘'r'’, the supplied `precision' must be 0 and + is ignored. The ‘'r'’ format code specifies the standard *note + repr(): 3ee. format. + + `flags' can be zero or more of the values ‘Py_DTSF_SIGN’, + ‘Py_DTSF_ADD_DOT_0’, or ‘Py_DTSF_ALT’, or-ed together: + + * ‘Py_DTSF_SIGN’ means to always precede the returned string + with a sign character, even if `val' is non-negative. + + * ‘Py_DTSF_ADD_DOT_0’ means to ensure that the returned string + will not look like an integer. + + * ‘Py_DTSF_ALT’ means to apply “alternate” formatting rules. + See the documentation for the *note PyOS_snprintf(): 1144. + ‘'#'’ specifier for details. + + If `ptype' is non-‘NULL’, then the value it points to will be set + to one of ‘Py_DTST_FINITE’, ‘Py_DTST_INFINITE’, or ‘Py_DTST_NAN’, + signifying that `val' is a finite number, an infinite number, or + not a number, respectively. + + The return value is a pointer to `buffer' with the converted string + or ‘NULL’ if the conversion failed. The caller is responsible for + freeing the returned string by calling *note PyMem_Free(): 10a8. + + New in version 3.1. + + -- C Function: int PyOS_stricmp (const char *s1, const char *s2) + + Case insensitive comparison of strings. The function works almost + identically to ‘strcmp()’ except that it ignores the case. + + -- C Function: int PyOS_strnicmp (const char *s1, const char *s2, + Py_ssize_t size) + + Case insensitive comparison of strings. The function works almost + identically to ‘strncmp()’ except that it ignores the case. + + +File: python.info, Node: Reflection, Next: Codec registry and support functions, Prev: String conversion and formatting, Up: Utilities<2> + +7.6.8 Reflection +---------------- + + -- C Function: *note PyObject: 4cf. *PyEval_GetBuiltins (void) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return a dictionary of the builtins in the current execution + frame, or the interpreter of the thread state if no frame is + currently executing. + + -- C Function: *note PyObject: 4cf. *PyEval_GetLocals (void) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return a dictionary of the local variables in the current + execution frame, or ‘NULL’ if no frame is currently executing. + + -- C Function: *note PyObject: 4cf. *PyEval_GetGlobals (void) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return a dictionary of the global variables in the current + execution frame, or ‘NULL’ if no frame is currently executing. + + -- C Function: *note PyFrameObject: 35d. *PyEval_GetFrame (void) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return the current thread state’s frame, which is ‘NULL’ if + no frame is currently executing. + + See also *note PyThreadState_GetFrame(): 361. + + -- C Function: const char *PyEval_GetFuncName (PyObject *func) + ` Part of the *note Stable ABI: 4b8.' Return the name of `func' if + it is a function, class or instance object, else the name of + `func's type. + + -- C Function: const char *PyEval_GetFuncDesc (PyObject *func) + ` Part of the *note Stable ABI: 4b8.' 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 *note PyEval_GetFuncName(): 4341, + the result will be a description of `func'. + + +File: python.info, Node: Codec registry and support functions, Prev: Reflection, Up: Utilities<2> + +7.6.9 Codec registry and support functions +------------------------------------------ + + -- C Function: int PyCodec_Register (PyObject *search_function) + ` Part of the *note Stable ABI: 4b8.' Register a new codec search + function. + + As side effect, this tries to load the ‘encodings’ package, if not + yet done, to make sure that it is always first in the list of + search functions. + + -- C Function: int PyCodec_Unregister (PyObject *search_function) + ` Part of the *note Stable ABI: 4b8. 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. + + New in version 3.10. + + -- C Function: int PyCodec_KnownEncoding (const char *encoding) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ or ‘0’ depending + on whether there is a registered codec for the given `encoding'. + This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PyCodec_Encode (PyObject *object, + const char *encoding, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘NULL’ to use the default method defined for the + codec. Raises a *note LookupError: 1c1f. if no encoder can be + found. + + -- C Function: *note PyObject: 4cf. *PyCodec_Decode (PyObject *object, + const char *encoding, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘NULL’ to use the default method defined for the + codec. Raises a *note LookupError: 1c1f. if no encoder can be + found. + +* Menu: + +* Codec lookup API:: +* Registry API for Unicode encoding error handlers:: + + +File: python.info, Node: Codec lookup API, Next: Registry API for Unicode encoding error handlers, Up: Codec registry and support functions + +7.6.9.1 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 +*note KeyError: 6f5. is set and ‘NULL’ returned. + + -- C Function: *note PyObject: 4cf. *PyCodec_Encoder (const char + *encoding) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Get an encoder function for the given `encoding'. + + -- C Function: *note PyObject: 4cf. *PyCodec_Decoder (const char + *encoding) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Get a decoder function for the given `encoding'. + + -- C Function: *note PyObject: 4cf. *PyCodec_IncrementalEncoder (const + char *encoding, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Get an *note IncrementalEncoder: 1e2b. object for the given + `encoding'. + + -- C Function: *note PyObject: 4cf. *PyCodec_IncrementalDecoder (const + char *encoding, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Get an *note IncrementalDecoder: 1e2c. object for the given + `encoding'. + + -- C Function: *note PyObject: 4cf. *PyCodec_StreamReader (const char + *encoding, PyObject *stream, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Get a *note StreamReader: 1e30. factory function for the + given `encoding'. + + -- C Function: *note PyObject: 4cf. *PyCodec_StreamWriter (const char + *encoding, PyObject *stream, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Get a *note StreamWriter: 1e2f. factory function for the + given `encoding'. + + +File: python.info, Node: Registry API for Unicode encoding error handlers, Prev: Codec lookup API, Up: Codec registry and support functions + +7.6.9.2 Registry API for Unicode encoding error handlers +........................................................ + + -- C Function: int PyCodec_RegisterError (const char *name, PyObject + *error) + ` Part of the *note Stable ABI: 4b8.' 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 *note + UnicodeEncodeError: 246, *note UnicodeDecodeError: 65c. or *note + UnicodeTranslateError: 1cf6. that holds information about the + problematic sequence of characters or bytes and their offset in the + original string (see *note Unicode Exception Objects: 44a2. 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 ‘0’ on success, ‘-1’ on error. + + -- C Function: *note PyObject: 4cf. *PyCodec_LookupError (const char + *name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Lookup the error handling callback function registered under + `name'. As a special case ‘NULL’ can be passed, in which case the + error handling callback for “strict” will be returned. + + -- C Function: *note PyObject: 4cf. *PyCodec_StrictErrors (PyObject + *exc) + `Return value: Always NULL.'` Part of the *note Stable ABI: 4b8.' + Raise `exc' as an exception. + + -- C Function: *note PyObject: 4cf. *PyCodec_IgnoreErrors (PyObject + *exc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Ignore the unicode error, skipping the faulty input. + + -- C Function: *note PyObject: 4cf. *PyCodec_ReplaceErrors (PyObject + *exc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Replace the unicode encode error with ‘?’ or ‘U+FFFD’. + + -- C Function: *note PyObject: 4cf. *PyCodec_XMLCharRefReplaceErrors + (PyObject *exc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Replace the unicode encode error with XML character + references. + + -- C Function: *note PyObject: 4cf. *PyCodec_BackslashReplaceErrors + (PyObject *exc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Replace the unicode encode error with backslash escapes + (‘\x’, ‘\u’ and ‘\U’). + + -- C Function: *note PyObject: 4cf. *PyCodec_NameReplaceErrors + (PyObject *exc) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Replace the unicode encode error with + ‘\N{...}’ escapes. + + New in version 3.5. + + +File: python.info, Node: Abstract Objects Layer, Next: Concrete Objects Layer, Prev: Utilities<2>, Up: Python/C API Reference Manual + +7.7 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 +*note PyList_New(): 42cd, but whose items have not been set to some +non-‘NULL’ value yet. + +* Menu: + +* Object Protocol:: +* Call Protocol:: +* Number Protocol:: +* Sequence Protocol:: +* Mapping Protocol:: +* Iterator Protocol:: +* Buffer Protocol:: +* Old Buffer Protocol:: + + +File: python.info, Node: Object Protocol, Next: Call Protocol, Up: Abstract Objects Layer + +7.7.1 Object Protocol +--------------------- + + -- C Variable: *note PyObject: 4cf. *Py_NotImplemented + + The ‘NotImplemented’ singleton, used to signal that an operation is + not implemented for the given type combination. + + -- C Macro: Py_RETURN_NOTIMPLEMENTED + + Properly handle returning *note Py_NotImplemented: 44e2. from + within a C function (that is, increment the reference count of + NotImplemented and return it). + + -- C Function: int PyObject_Print (PyObject *o, FILE *fp, int flags) + + Print an object `o', on file `fp'. Returns ‘-1’ on error. The + flags argument is used to enable certain printing options. The + only option currently supported is ‘Py_PRINT_RAW’; if given, the + *note str(): 1b3. of the object is written instead of the *note + repr(): 3ee. + + -- C Function: int PyObject_HasAttr (PyObject *o, PyObject *attr_name) + ` Part of the *note Stable ABI: 4b8.' Returns ‘1’ if `o' has the + attribute `attr_name', and ‘0’ otherwise. This is equivalent to + the Python expression ‘hasattr(o, attr_name)’. This function + always succeeds. + + Note that exceptions which occur while calling ‘__getattr__()’ and + ‘__getattribute__()’ methods will get suppressed. To get error + reporting use *note PyObject_GetAttr(): 43bf. instead. + + -- C Function: int PyObject_HasAttrString (PyObject *o, const char + *attr_name) + ` Part of the *note Stable ABI: 4b8.' Returns ‘1’ if `o' has the + attribute `attr_name', and ‘0’ otherwise. This is equivalent to + the Python expression ‘hasattr(o, attr_name)’. This function + always succeeds. + + Note that exceptions which occur while calling ‘__getattr__()’ and + ‘__getattribute__()’ methods and creating a temporary string object + will get suppressed. To get error reporting use *note + PyObject_GetAttrString(): 4246. instead. + + -- C Function: *note PyObject: 4cf. *PyObject_GetAttr (PyObject *o, + PyObject *attr_name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Retrieve an attribute named `attr_name' from object `o'. + Returns the attribute value on success, or ‘NULL’ on failure. This + is the equivalent of the Python expression ‘o.attr_name’. + + -- C Function: *note PyObject: 4cf. *PyObject_GetAttrString (PyObject + *o, const char *attr_name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Retrieve an attribute named `attr_name' from object `o'. + Returns the attribute value on success, or ‘NULL’ on failure. This + is the equivalent of the Python expression ‘o.attr_name’. + + -- C Function: *note PyObject: 4cf. *PyObject_GenericGetAttr (PyObject + *o, PyObject *name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Generic attribute getter function that is meant to be put + into a type object’s ‘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 *note __dict__: 8ce. (if present). As + outlined in *note Implementing Descriptors: 8bd, data descriptors + take preference over instance attributes, while non-data + descriptors don’t. Otherwise, an *note AttributeError: 19d. is + raised. + + -- C Function: int PyObject_SetAttr (PyObject *o, PyObject *attr_name, + PyObject *v) + ` Part of the *note Stable ABI: 4b8.' Set the value of the + attribute named `attr_name', for object `o', to the value `v'. + Raise an exception and return ‘-1’ on failure; return ‘0’ on + success. This is the equivalent of the Python statement + ‘o.attr_name = v’. + + If `v' is ‘NULL’, the attribute is deleted. This behaviour is + deprecated in favour of using *note PyObject_DelAttr(): 44e4, but + there are currently no plans to remove it. + + -- C Function: int PyObject_SetAttrString (PyObject *o, const char + *attr_name, PyObject *v) + ` Part of the *note Stable ABI: 4b8.' Set the value of the + attribute named `attr_name', for object `o', to the value `v'. + Raise an exception and return ‘-1’ on failure; return ‘0’ on + success. This is the equivalent of the Python statement + ‘o.attr_name = v’. + + If `v' is ‘NULL’, the attribute is deleted, but this feature is + deprecated in favour of using *note PyObject_DelAttrString(): 44e5. + + -- C Function: int PyObject_GenericSetAttr (PyObject *o, PyObject + *name, PyObject *value) + ` Part of the *note Stable ABI: 4b8.' Generic attribute setter and + deleter function that is meant to be put into a type object’s *note + tp_setattro: 427f. 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 *note __dict__: 8ce. (if present). On success, ‘0’ is + returned, otherwise an *note AttributeError: 19d. is raised and + ‘-1’ is returned. + + -- C Function: int PyObject_DelAttr (PyObject *o, PyObject *attr_name) + + Delete attribute named `attr_name', for object `o'. Returns ‘-1’ + on failure. This is the equivalent of the Python statement ‘del + o.attr_name’. + + -- C Function: int PyObject_DelAttrString (PyObject *o, const char + *attr_name) + + Delete attribute named `attr_name', for object `o'. Returns ‘-1’ + on failure. This is the equivalent of the Python statement ‘del + o.attr_name’. + + -- C Function: *note PyObject: 4cf. *PyObject_GenericGetDict (PyObject + *o, void *context) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.10.' A generic implementation for the getter of a + ‘__dict__’ descriptor. It creates the dictionary if necessary. + + This function may also be called to get the *note __dict__: 8ce. of + the object `o'. Pass ‘NULL’ for `context' when calling it. Since + this function may need to allocate memory for the dictionary, it + may be more efficient to call *note PyObject_GetAttr(): 43bf. when + accessing an attribute on the object. + + On failure, returns ‘NULL’ with an exception set. + + New in version 3.3. + + -- C Function: int PyObject_GenericSetDict (PyObject *o, PyObject + *value, void *context) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' A generic + implementation for the setter of a ‘__dict__’ descriptor. This + implementation does not allow the dictionary to be deleted. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. **_PyObject_GetDictPtr (PyObject + *obj) + + Return a pointer to *note __dict__: 8ce. of the object `obj'. If + there is no ‘__dict__’, return ‘NULL’ without setting an exception. + + This function may need to allocate memory for the dictionary, so it + may be more efficient to call *note PyObject_GetAttr(): 43bf. when + accessing an attribute on the object. + + -- C Function: *note PyObject: 4cf. *PyObject_RichCompare (PyObject + *o1, PyObject *o2, int opid) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Compare the values of `o1' and `o2' using the operation + specified by `opid', which must be one of ‘Py_LT’, ‘Py_LE’, + ‘Py_EQ’, ‘Py_NE’, ‘Py_GT’, or ‘Py_GE’, corresponding to ‘<’, ‘<=’, + ‘==’, ‘!=’, ‘>’, or ‘>=’ respectively. This is the equivalent of + the Python expression ‘o1 op o2’, where ‘op’ is the operator + corresponding to `opid'. Returns the value of the comparison on + success, or ‘NULL’ on failure. + + -- C Function: int PyObject_RichCompareBool (PyObject *o1, PyObject + *o2, int opid) + ` Part of the *note Stable ABI: 4b8.' Compare the values of `o1' + and `o2' using the operation specified by `opid', which must be one + of ‘Py_LT’, ‘Py_LE’, ‘Py_EQ’, ‘Py_NE’, ‘Py_GT’, or ‘Py_GE’, + corresponding to ‘<’, ‘<=’, ‘==’, ‘!=’, ‘>’, or ‘>=’ respectively. + Returns ‘-1’ on error, ‘0’ if the result is false, ‘1’ otherwise. + This is the equivalent of the Python expression ‘o1 op o2’, where + ‘op’ is the operator corresponding to `opid'. + + Note: If `o1' and `o2' are the same object, *note + PyObject_RichCompareBool(): 13c0. will always return ‘1’ for + ‘Py_EQ’ and ‘0’ for ‘Py_NE’. + + -- C Function: *note PyObject: 4cf. *PyObject_Repr (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Compute a string representation of object `o'. Returns the string + representation on success, ‘NULL’ on failure. This is the + equivalent of the Python expression ‘repr(o)’. Called by the *note + repr(): 3ee. built-in function. + + Changed in version 3.4: This function now includes a debug + assertion to help ensure that it does not silently discard an + active exception. + + -- C Function: *note PyObject: 4cf. *PyObject_ASCII (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + As *note PyObject_Repr(): cdb, compute a string representation of + object `o', but escape the non-ASCII characters in the string + returned by *note PyObject_Repr(): cdb. with ‘\x’, ‘\u’ or ‘\U’ + escapes. This generates a string similar to that returned by *note + PyObject_Repr(): cdb. in Python 2. Called by the *note ascii(): + 104d. built-in function. + + -- C Function: *note PyObject: 4cf. *PyObject_Str (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Compute a string representation of object `o'. Returns the + string representation on success, ‘NULL’ on failure. This is the + equivalent of the Python expression ‘str(o)’. Called by the *note + str(): 1b3. built-in function and, therefore, by the *note print(): + c13. function. + + Changed in version 3.4: This function now includes a debug + assertion to help ensure that it does not silently discard an + active exception. + + -- C Function: *note PyObject: 4cf. *PyObject_Bytes (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Compute a bytes representation of object `o'. ‘NULL’ is returned + on failure and a bytes object on success. This is equivalent to + the Python expression ‘bytes(o)’, when `o' is not an integer. + Unlike ‘bytes(o)’, a TypeError is raised when `o' is an integer + instead of a zero-initialized bytes object. + + -- C Function: int PyObject_IsSubclass (PyObject *derived, PyObject + *cls) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if the class + `derived' is identical to or derived from the class `cls', + otherwise return ‘0’. In case of an error, return ‘-1’. + + If `cls' is a tuple, the check will be done against every entry in + `cls'. The result will be ‘1’ when at least one of the checks + returns ‘1’, otherwise it will be ‘0’. + + If `cls' has a *note __subclasscheck__(): 1930. method, it will be + called to determine the subclass status as described in PEP + 3119(1). Otherwise, `derived' is a subclass of `cls' if it is a + direct or indirect subclass, i.e. contained in ‘cls.__mro__’. + + Normally only class objects, i.e. instances of *note type: 9c2. or + a derived class, are considered classes. However, objects can + override this by having a ‘__bases__’ attribute (which must be a + tuple of base classes). + + -- C Function: int PyObject_IsInstance (PyObject *inst, PyObject *cls) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if `inst' is an + instance of the class `cls' or a subclass of `cls', or ‘0’ if not. + On error, returns ‘-1’ and sets an exception. + + If `cls' is a tuple, the check will be done against every entry in + `cls'. The result will be ‘1’ when at least one of the checks + returns ‘1’, otherwise it will be ‘0’. + + If `cls' has a *note __instancecheck__(): 192f. method, it will be + called to determine the subclass status as described in PEP + 3119(2). 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 ‘__class__’ attribute. + + An object `cls' can override if it is considered a class, and what + its base classes are, by having a ‘__bases__’ attribute (which must + be a tuple of base classes). + + -- C Function: Py_hash_t PyObject_Hash (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' + + Compute and return the hash value of an object `o'. On failure, + return ‘-1’. This is the equivalent of the Python expression + ‘hash(o)’. + + Changed in version 3.2: The return type is now Py_hash_t. This is + a signed integer the same size as *note Py_ssize_t: 6b1. + + -- C Function: Py_hash_t PyObject_HashNotImplemented (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Set a *note TypeError: 19c. + indicating that ‘type(o)’ is not hashable and return ‘-1’. This + function receives special treatment when stored in a ‘tp_hash’ + slot, allowing a type to explicitly indicate to the interpreter + that it is not hashable. + + -- C Function: int PyObject_IsTrue (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Returns ‘1’ if the object + `o' is considered to be true, and ‘0’ otherwise. This is + equivalent to the Python expression ‘not not o’. On failure, + return ‘-1’. + + -- C Function: int PyObject_Not (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Returns ‘0’ if the object + `o' is considered to be true, and ‘1’ otherwise. This is + equivalent to the Python expression ‘not o’. On failure, return + ‘-1’. + + -- C Function: *note PyObject: 4cf. *PyObject_Type (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + When `o' is non-‘NULL’, returns a type object corresponding to the + object type of object `o'. On failure, raises *note SystemError: + 9b5. and returns ‘NULL’. This is equivalent to the Python + expression ‘type(o)’. This function increments the reference count + of the return value. There’s really no reason to use this function + instead of the *note Py_TYPE(): 355. function, which returns a + pointer of type *note PyTypeObject: 701.*, except when the + incremented reference count is needed. + + -- 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 ‘0’ otherwise. Both parameters must be non-‘NULL’. + + -- C Function: *note Py_ssize_t: 6b1. PyObject_Size (PyObject *o) + -- C Function: *note Py_ssize_t: 6b1. PyObject_Length (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' + + Return the length of object `o'. If the object `o' provides either + the sequence and mapping protocols, the sequence length is + returned. On error, ‘-1’ is returned. This is the equivalent to + the Python expression ‘len(o)’. + + -- C Function: *note Py_ssize_t: 6b1. 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 *note __length_hint__(): + b9d, and finally return the default value. On error return ‘-1’. + This is the equivalent to the Python expression + ‘operator.length_hint(o, defaultvalue)’. + + New in version 3.4. + + -- C Function: *note PyObject: 4cf. *PyObject_GetItem (PyObject *o, + PyObject *key) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return element of `o' corresponding to the object `key' or + ‘NULL’ on failure. This is the equivalent of the Python expression + ‘o[key]’. + + -- C Function: int PyObject_SetItem (PyObject *o, PyObject *key, + PyObject *v) + ` Part of the *note Stable ABI: 4b8.' Map the object `key' to the + value `v'. Raise an exception and return ‘-1’ on failure; return + ‘0’ on success. This is the equivalent of the Python statement + ‘o[key] = v’. This function `does not' steal a reference to `v'. + + -- C Function: int PyObject_DelItem (PyObject *o, PyObject *key) + ` Part of the *note Stable ABI: 4b8.' Remove the mapping for the + object `key' from the object `o'. Return ‘-1’ on failure. This is + equivalent to the Python statement ‘del o[key]’. + + -- C Function: *note PyObject: 4cf. *PyObject_Dir (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' This is equivalent to the Python expression ‘dir(o)’, + returning a (possibly empty) list of strings appropriate for the + object argument, or ‘NULL’ if there was an error. If the argument + is ‘NULL’, this is like the Python ‘dir()’, returning the names of + the current locals; in this case, if no execution frame is active + then ‘NULL’ is returned but *note PyErr_Occurred(): 12f8. will + return false. + + -- C Function: *note PyObject: 4cf. *PyObject_GetIter (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' This is equivalent to the Python expression ‘iter(o)’. It + returns a new iterator for the object argument, or the object + itself if the object is already an iterator. Raises *note + TypeError: 19c. and returns ‘NULL’ if the object cannot be + iterated. + + -- C Function: *note PyObject: 4cf. *PyObject_GetAIter (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.10.' This is the equivalent to the Python + expression ‘aiter(o)’. Takes an ‘AsyncIterable’ object and returns + an ‘AsyncIterator’ for it. This is typically a new iterator but if + the argument is an ‘AsyncIterator’, this returns itself. Raises + *note TypeError: 19c. and returns ‘NULL’ if the object cannot be + iterated. + + New in version 3.10. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3119/ + + (2) https://peps.python.org/pep-3119/ + + +File: python.info, Node: Call Protocol, Next: Number Protocol, Prev: Object Protocol, Up: Abstract Objects Layer + +7.7.2 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:: + + +File: python.info, Node: The tp_call Protocol, Next: The Vectorcall Protocol, Up: Call Protocol + +7.7.2.1 The `tp_call' Protocol +.............................. + +Instances of classes that set *note tp_call: 428b. are callable. The +signature of the slot is: + + PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs); + +A call is made using a tuple for the positional arguments and a dict for +the keyword arguments, similarly to ‘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': *note tp_new: 4260. and +*note tp_init: 4266. also pass arguments this way. + +To call an object, use *note PyObject_Call(): 5b9. or another *note call +API: 44ea. + + +File: python.info, Node: The Vectorcall Protocol, Next: Object Calling API, Prev: The tp_call Protocol, Up: Call Protocol + +7.7.2.2 The Vectorcall Protocol +............................... + +New in version 3.9. + +The vectorcall protocol was introduced in PEP 590(1) 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 *note PyObject_Call(): 5b9.). Therefore, a class supporting +vectorcall must also implement *note tp_call: 428b. Moreover, the +callable must behave the same regardless of which protocol is used. The +recommended way to achieve this is by setting *note tp_call: 428b. to +*note PyVectorcall_Call(): 44ec. This bears repeating: + + Warning: A class supporting vectorcall `must' also implement *note + tp_call: 428b. with the same semantics. + +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 *note +Py_TPFLAGS_HAVE_VECTORCALL: 44ed. flag and setting *note +tp_vectorcall_offset: 44ee. to the offset inside the object structure +where a `vectorcallfunc' appears. This is a pointer to a function with +the following signature: + + -- C Type: typedef *note PyObject: 4cf. *(*vectorcallfunc)(*note + PyObject: 4cf. *callable, *note PyObject: 4cf. *const *args, + size_t nargsf, *note PyObject: 4cf. *kwnames) + + - `callable' is the object being called. + + - + `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. + + - + `nargsf' is the number of positional arguments plus possibly the + + ‘PY_VECTORCALL_ARGUMENTS_OFFSET’ flag. To get the actual + number of positional arguments from `nargsf', use *note + PyVectorcall_NARGS(): 44f0. + + - + `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 ‘str’ or a subclass) and they must be + unique. If there are no keyword arguments, then `kwnames' can + instead be `NULL'. + + -- C Macro: PY_VECTORCALL_ARGUMENTS_OFFSET + + If this flag is set in a vectorcall `nargsf' argument, the callee + is allowed to temporarily change ‘args[-1]’. In other words, + `args' points to argument 1 (not 0) in the allocated vector. The + callee must restore the value of ‘args[-1]’ before returning. + + For *note PyObject_VectorcallMethod(): 44f2, this flag means + instead that ‘args[0]’ may be changed. + + Whenever they can do so cheaply (without additional allocation), + callers are encouraged to use ‘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. + +To call an object that implements vectorcall, use a *note call API: +44ea. function as with any other callable. *note PyObject_Vectorcall(): +122b. will usually be most efficient. + + Note: In CPython 3.8, the vectorcall API and related functions were + available provisionally under names with a leading underscore: + ‘_PyObject_Vectorcall’, ‘_Py_TPFLAGS_HAVE_VECTORCALL’, + ‘_PyObject_VectorcallMethod’, ‘_PyVectorcall_Function’, + ‘_PyObject_CallOneArg’, ‘_PyObject_CallMethodNoArgs’, + ‘_PyObject_CallMethodOneArg’. Additionally, + ‘PyObject_VectorcallDict’ was available as + ‘_PyObject_FastCallDict’. The old names are still defined as + aliases of the new, non-underscored names. + +* Menu: + +* Recursion Control: Recursion Control<2>. +* Vectorcall Support API:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0590/ + + +File: python.info, Node: Recursion Control<2>, Next: Vectorcall Support API, Up: The Vectorcall Protocol + +7.7.2.3 Recursion Control +......................... + +When using `tp_call', callees do not need to worry about *note +recursion: 44a3.: CPython uses *note Py_EnterRecursiveCall(): 5c8. and +*note Py_LeaveRecursiveCall(): 5c9. 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. + + +File: python.info, Node: Vectorcall Support API, Prev: Recursion Control<2>, Up: The Vectorcall Protocol + +7.7.2.4 Vectorcall Support API +.............................. + + -- C Function: *note Py_ssize_t: 6b1. PyVectorcall_NARGS (size_t + nargsf) + + Given a vectorcall `nargsf' argument, return the actual number of + arguments. Currently equivalent to: + + (Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET) + + However, the function ‘PyVectorcall_NARGS’ should be used to allow + for future extensions. + + New in version 3.8. + + -- C Function: *note vectorcallfunc: 44ef. 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 + ‘PyVectorcall_Function(op) != NULL’. + + New in version 3.8. + + -- C Function: *note PyObject: 4cf. *PyVectorcall_Call (PyObject + *callable, PyObject *tuple, PyObject *dict) + + Call `callable'’s *note vectorcallfunc: 44ef. with positional and + keyword arguments given in a tuple and dict, respectively. + + This is a specialized function, intended to be put in the *note + tp_call: 428b. slot or be used in an implementation of ‘tp_call’. + It does not check the *note Py_TPFLAGS_HAVE_VECTORCALL: 44ed. flag + and it does not fall back to ‘tp_call’. + + New in version 3.8. + + +File: python.info, Node: Object Calling API, Next: Call Support API, Prev: The Vectorcall Protocol, Up: Call Protocol + +7.7.2.5 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. + +Function callable args kwargs + +------------------------------------------------------------------------------------------------------------------- + +*note PyObject_Call(): 5b9. ‘PyObject *’ tuple dict/‘NULL’ + + +*note PyObject_CallNoArgs(): 5c7. ‘PyObject *’ — — + + +*note PyObject_CallOneArg(): 5cd. ‘PyObject *’ 1 object — + + +*note PyObject_CallObject(): 423b. ‘PyObject *’ tuple/‘NULL’ — + + +*note PyObject_CallFunction(): 6fd. ‘PyObject *’ format — + + +*note PyObject_CallMethod(): 4ad. obj + ‘char*’ format — + + +*note PyObject_CallFunctionObjArgs(): 43b6. ‘PyObject *’ variadic — + + +*note PyObject_CallMethodObjArgs(): 142d. obj + name variadic — + + +*note PyObject_CallMethodNoArgs(): 44f7. obj + name — — + + +*note PyObject_CallMethodOneArg(): 44f8. obj + name 1 object — + + +*note PyObject_Vectorcall(): 122b. ‘PyObject *’ vectorcall vectorcall + + +*note PyObject_VectorcallDict(): 44f9. ‘PyObject *’ vectorcall dict/‘NULL’ + + +*note PyObject_VectorcallMethod(): 44f2. arg + name vectorcall vectorcall + + + -- C Function: *note PyObject: 4cf. *PyObject_Call (PyObject *callable, + PyObject *args, PyObject *kwargs) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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: ‘callable(*args, + **kwargs)’. + + -- C Function: *note PyObject: 4cf. *PyObject_CallNoArgs (PyObject + *callable) + ` Part of the *note Stable ABI: 4b8. 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. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyObject_CallOneArg (PyObject + *callable, PyObject *arg) + + 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. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyObject_CallObject (PyObject + *callable, PyObject *args) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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: ‘callable(*args)’. + + -- C Function: *note PyObject: 4cf. *PyObject_CallFunction (PyObject + *callable, const char *format, ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Call a callable Python object `callable', with a variable + number of C arguments. The C arguments are described using a *note + Py_BuildValue(): 4da. 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: ‘callable(*args)’. + + Note that if you only pass *note PyObject: 4cf.* args, *note + PyObject_CallFunctionObjArgs(): 43b6. is a faster alternative. + + Changed in version 3.4: The type of `format' was changed from ‘char + *’. + + -- C Function: *note PyObject: 4cf. *PyObject_CallMethod (PyObject + *obj, const char *name, const char *format, ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Call the method named `name' of object `obj' with a variable + number of C arguments. The C arguments are described by a *note + Py_BuildValue(): 4da. 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: ‘obj.name(arg1, + arg2, ...)’. + + Note that if you only pass *note PyObject: 4cf.* args, *note + PyObject_CallMethodObjArgs(): 142d. is a faster alternative. + + Changed in version 3.4: The types of `name' and `format' were + changed from ‘char *’. + + -- C Function: *note PyObject: 4cf. *PyObject_CallFunctionObjArgs + (PyObject *callable, ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Call a callable Python object `callable', with a variable + number of *note PyObject: 4cf.* 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: ‘callable(arg1, + arg2, ...)’. + + -- C Function: *note PyObject: 4cf. *PyObject_CallMethodObjArgs + (PyObject *obj, PyObject *name, ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 *note PyObject: 4cf.* 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. + + -- C Function: *note PyObject: 4cf. *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. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *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. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyObject_Vectorcall (PyObject + *callable, PyObject *const *args, size_t nargsf, PyObject + *kwnames) + + Call a callable Python object `callable'. The arguments are the + same as for *note vectorcallfunc: 44ef. If `callable' supports + *note vectorcall: 606, 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. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyObject_VectorcallDict (PyObject + *callable, PyObject *const *args, size_t nargsf, PyObject + *kwdict) + + Call `callable' with positional arguments passed exactly as in the + *note vectorcall: 606. 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. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyObject_VectorcallMethod + (PyObject *name, PyObject *const *args, size_t nargsf, + PyObject *kwnames) + + 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 + ‘PY_VECTORCALL_ARGUMENTS_OFFSET’ if the value of ‘args[0]’ may + temporarily be changed. Keyword arguments can be passed just like + in *note PyObject_Vectorcall(): 122b. + + If the object has the *note Py_TPFLAGS_METHOD_DESCRIPTOR: 44fa. + 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. + + New in version 3.9. + + +File: python.info, Node: Call Support API, Prev: Object Calling API, Up: Call Protocol + +7.7.2.6 Call Support API +........................ + + -- C Function: int PyCallable_Check (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Determine if the object `o' + is callable. Return ‘1’ if the object is callable and ‘0’ + otherwise. This function always succeeds. + + +File: python.info, Node: Number Protocol, Next: Sequence Protocol, Prev: Call Protocol, Up: Abstract Objects Layer + +7.7.3 Number Protocol +--------------------- + + -- C Function: int PyNumber_Check (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Returns ‘1’ if the object + `o' provides numeric protocols, and false otherwise. This function + always succeeds. + + Changed in version 3.8: Returns ‘1’ if `o' is an index integer. + + -- C Function: *note PyObject: 4cf. *PyNumber_Add (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of adding `o1' and `o2', or ‘NULL’ on + failure. This is the equivalent of the Python expression ‘o1 + + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Subtract (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of subtracting `o2' from `o1', or ‘NULL’ + on failure. This is the equivalent of the Python expression ‘o1 - + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Multiply (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of multiplying `o1' and `o2', or ‘NULL’ + on failure. This is the equivalent of the Python expression ‘o1 * + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_MatrixMultiply (PyObject + *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Returns the result of matrix multiplication on + `o1' and `o2', or ‘NULL’ on failure. This is the equivalent of the + Python expression ‘o1 @ o2’. + + New in version 3.5. + + -- C Function: *note PyObject: 4cf. *PyNumber_FloorDivide (PyObject + *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the floor of `o1' divided by `o2', or ‘NULL’ on + failure. This is the equivalent of the Python expression ‘o1 // + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_TrueDivide (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a reasonable approximation for the mathematical value + of `o1' divided by `o2', or ‘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 ‘o1 / o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Remainder (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the remainder of dividing `o1' by `o2', or ‘NULL’ on + failure. This is the equivalent of the Python expression ‘o1 % + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Divmod (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + See the built-in function *note divmod(): 5f1. Returns ‘NULL’ on + failure. This is the equivalent of the Python expression + ‘divmod(o1, o2)’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Power (PyObject *o1, + PyObject *o2, PyObject *o3) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + See the built-in function *note pow(): 613. Returns ‘NULL’ on + failure. This is the equivalent of the Python expression ‘pow(o1, + o2, o3)’, where `o3' is optional. If `o3' is to be ignored, pass + *note Py_None: 4231. in its place (passing ‘NULL’ for `o3' would + cause an illegal memory access). + + -- C Function: *note PyObject: 4cf. *PyNumber_Negative (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the negation of `o' on success, or ‘NULL’ on + failure. This is the equivalent of the Python expression ‘-o’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Positive (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns `o' on success, or ‘NULL’ on failure. This is the + equivalent of the Python expression ‘+o’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Absolute (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Returns the absolute value of `o', or ‘NULL’ on failure. This is + the equivalent of the Python expression ‘abs(o)’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Invert (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the bitwise negation of `o' on success, or ‘NULL’ on + failure. This is the equivalent of the Python expression ‘~o’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Lshift (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of left shifting `o1' by `o2' on success, + or ‘NULL’ on failure. This is the equivalent of the Python + expression ‘o1 << o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Rshift (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of right shifting `o1' by `o2' on + success, or ‘NULL’ on failure. This is the equivalent of the + Python expression ‘o1 >> o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_And (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the “bitwise and” of `o1' and `o2' on success and + ‘NULL’ on failure. This is the equivalent of the Python expression + ‘o1 & o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Xor (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the “bitwise exclusive or” of `o1' by `o2' on + success, or ‘NULL’ on failure. This is the equivalent of the + Python expression ‘o1 ^ o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Or (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the “bitwise or” of `o1' and `o2' on success, or + ‘NULL’ on failure. This is the equivalent of the Python expression + ‘o1 | o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceAdd (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of adding `o1' and `o2', or ‘NULL’ on + failure. The operation is done `in-place' when `o1' supports it. + This is the equivalent of the Python statement ‘o1 += o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceSubtract (PyObject + *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of subtracting `o2' from `o1', or ‘NULL’ + on failure. The operation is done `in-place' when `o1' supports + it. This is the equivalent of the Python statement ‘o1 -= o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceMultiply (PyObject + *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of multiplying `o1' and `o2', or ‘NULL’ + on failure. The operation is done `in-place' when `o1' supports + it. This is the equivalent of the Python statement ‘o1 *= o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceMatrixMultiply + (PyObject *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Returns the result of matrix multiplication on + `o1' and `o2', or ‘NULL’ on failure. The operation is done + `in-place' when `o1' supports it. This is the equivalent of the + Python statement ‘o1 @= o2’. + + New in version 3.5. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceFloorDivide + (PyObject *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the mathematical floor of dividing `o1' by `o2', or + ‘NULL’ on failure. The operation is done `in-place' when `o1' + supports it. This is the equivalent of the Python statement ‘o1 + //= o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceTrueDivide + (PyObject *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a reasonable approximation for the mathematical value + of `o1' divided by `o2', or ‘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 ‘o1 /= + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceRemainder + (PyObject *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the remainder of dividing `o1' by `o2', or ‘NULL’ on + failure. The operation is done `in-place' when `o1' supports it. + This is the equivalent of the Python statement ‘o1 %= o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlacePower (PyObject + *o1, PyObject *o2, PyObject *o3) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + See the built-in function *note pow(): 613. Returns ‘NULL’ on + failure. The operation is done `in-place' when `o1' supports it. + This is the equivalent of the Python statement ‘o1 **= o2’ when o3 + is *note Py_None: 4231, or an in-place variant of ‘pow(o1, o2, o3)’ + otherwise. If `o3' is to be ignored, pass *note Py_None: 4231. in + its place (passing ‘NULL’ for `o3' would cause an illegal memory + access). + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceLshift (PyObject + *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of left shifting `o1' by `o2' on success, + or ‘NULL’ on failure. The operation is done `in-place' when `o1' + supports it. This is the equivalent of the Python statement ‘o1 + <<= o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceRshift (PyObject + *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the result of right shifting `o1' by `o2' on + success, or ‘NULL’ on failure. The operation is done `in-place' + when `o1' supports it. This is the equivalent of the Python + statement ‘o1 >>= o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceAnd (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the “bitwise and” of `o1' and `o2' on success and + ‘NULL’ on failure. The operation is done `in-place' when `o1' + supports it. This is the equivalent of the Python statement ‘o1 &= + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceXor (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the “bitwise exclusive or” of `o1' by `o2' on + success, or ‘NULL’ on failure. The operation is done `in-place' + when `o1' supports it. This is the equivalent of the Python + statement ‘o1 ^= o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_InPlaceOr (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the “bitwise or” of `o1' and `o2' on success, or + ‘NULL’ on failure. The operation is done `in-place' when `o1' + supports it. This is the equivalent of the Python statement ‘o1 |= + o2’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Long (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Returns the `o' converted to an integer object on success, or + ‘NULL’ on failure. This is the equivalent of the Python expression + ‘int(o)’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Float (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Returns the `o' converted to a float object on success, or ‘NULL’ + on failure. This is the equivalent of the Python expression + ‘float(o)’. + + -- C Function: *note PyObject: 4cf. *PyNumber_Index (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Returns the `o' converted to a Python int on success or + ‘NULL’ with a *note TypeError: 19c. exception raised on failure. + + Changed in version 3.10: The result always has exact type *note + int: 1c7. Previously, the result could have been an instance of a + subclass of ‘int’. + + -- C Function: *note PyObject: 4cf. *PyNumber_ToBase (PyObject *n, int + base) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘'0b'’, ‘'0o'’, or ‘'0x'’, respectively. If `n' is not a + Python int, it is converted with *note PyNumber_Index(): 4ba. + first. + + -- C Function: *note Py_ssize_t: 6b1. PyNumber_AsSsize_t (PyObject *o, + PyObject *exc) + ` Part of the *note Stable ABI: 4b8.' Returns `o' converted to a + *note Py_ssize_t: 6b1. value if `o' can be interpreted as an + integer. If the call fails, an exception is raised and ‘-1’ is + returned. + + If `o' can be converted to a Python int but the attempt to convert + to a *note Py_ssize_t: 6b1. value would raise an *note + OverflowError: 4a4, then the `exc' argument is the type of + exception that will be raised (usually *note IndexError: 116b. or + *note OverflowError: 4a4.). If `exc' is ‘NULL’, then the exception + is cleared and the value is clipped to ‘PY_SSIZE_T_MIN’ for a + negative integer or ‘PY_SSIZE_T_MAX’ for a positive integer. + + -- C Function: int PyIndex_Check (PyObject *o) + ` Part of the *note Stable ABI: 4b8. since version 3.8.' Returns + ‘1’ if `o' is an index integer (has the ‘nb_index’ slot of the + ‘tp_as_number’ structure filled in), and ‘0’ otherwise. This + function always succeeds. + + +File: python.info, Node: Sequence Protocol, Next: Mapping Protocol, Prev: Number Protocol, Up: Abstract Objects Layer + +7.7.4 Sequence Protocol +----------------------- + + -- C Function: int PySequence_Check (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if the object + provides the sequence protocol, and ‘0’ otherwise. Note that it + returns ‘1’ for Python classes with a ‘__getitem__()’ method, + unless they are *note dict: 16e. subclasses, since in general it is + impossible to determine what type of keys the class supports. This + function always succeeds. + + -- C Function: *note Py_ssize_t: 6b1. PySequence_Size (PyObject *o) + -- C Function: *note Py_ssize_t: 6b1. PySequence_Length (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' + + Returns the number of objects in sequence `o' on success, and ‘-1’ + on failure. This is equivalent to the Python expression ‘len(o)’. + + -- C Function: *note PyObject: 4cf. *PySequence_Concat (PyObject *o1, + PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the concatenation of `o1' and `o2' on success, and + ‘NULL’ on failure. This is the equivalent of the Python expression + ‘o1 + o2’. + + -- C Function: *note PyObject: 4cf. *PySequence_Repeat (PyObject *o, + Py_ssize_t count) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the result of repeating sequence object `o' `count' + times, or ‘NULL’ on failure. This is the equivalent of the Python + expression ‘o * count’. + + -- C Function: *note PyObject: 4cf. *PySequence_InPlaceConcat (PyObject + *o1, PyObject *o2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the concatenation of `o1' and `o2' on success, and + ‘NULL’ on failure. The operation is done `in-place' when `o1' + supports it. This is the equivalent of the Python expression ‘o1 + += o2’. + + -- C Function: *note PyObject: 4cf. *PySequence_InPlaceRepeat (PyObject + *o, Py_ssize_t count) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the result of repeating sequence object `o' `count' + times, or ‘NULL’ on failure. The operation is done `in-place' when + `o' supports it. This is the equivalent of the Python expression + ‘o *= count’. + + -- C Function: *note PyObject: 4cf. *PySequence_GetItem (PyObject *o, + Py_ssize_t i) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the `i'th element of `o', or ‘NULL’ on failure. This + is the equivalent of the Python expression ‘o[i]’. + + -- C Function: *note PyObject: 4cf. *PySequence_GetSlice (PyObject *o, + Py_ssize_t i1, Py_ssize_t i2) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the slice of sequence object `o' between `i1' and + `i2', or ‘NULL’ on failure. This is the equivalent of the Python + expression ‘o[i1:i2]’. + + -- C Function: int PySequence_SetItem (PyObject *o, Py_ssize_t i, + PyObject *v) + ` Part of the *note Stable ABI: 4b8.' Assign object `v' to the + `i'th element of `o'. Raise an exception and return ‘-1’ on + failure; return ‘0’ on success. This is the equivalent of the + Python statement ‘o[i] = v’. This function `does not' steal a + reference to `v'. + + If `v' is ‘NULL’, the element is deleted, but this feature is + deprecated in favour of using *note PySequence_DelItem(): 1496. + + -- C Function: int PySequence_DelItem (PyObject *o, Py_ssize_t i) + ` Part of the *note Stable ABI: 4b8.' Delete the `i'th element of + object `o'. Returns ‘-1’ on failure. This is the equivalent of + the Python statement ‘del o[i]’. + + -- C Function: int PySequence_SetSlice (PyObject *o, Py_ssize_t i1, + Py_ssize_t i2, PyObject *v) + ` Part of the *note Stable ABI: 4b8.' Assign the sequence object + `v' to the slice in sequence object `o' from `i1' to `i2'. This is + the equivalent of the Python statement ‘o[i1:i2] = v’. + + -- C Function: int PySequence_DelSlice (PyObject *o, Py_ssize_t i1, + Py_ssize_t i2) + ` Part of the *note Stable ABI: 4b8.' Delete the slice in sequence + object `o' from `i1' to `i2'. Returns ‘-1’ on failure. This is + the equivalent of the Python statement ‘del o[i1:i2]’. + + -- C Function: *note Py_ssize_t: 6b1. PySequence_Count (PyObject *o, + PyObject *value) + ` Part of the *note Stable ABI: 4b8.' Return the number of + occurrences of `value' in `o', that is, return the number of keys + for which ‘o[key] == value’. On failure, return ‘-1’. This is + equivalent to the Python expression ‘o.count(value)’. + + -- C Function: int PySequence_Contains (PyObject *o, PyObject *value) + ` Part of the *note Stable ABI: 4b8.' Determine if `o' contains + `value'. If an item in `o' is equal to `value', return ‘1’, + otherwise return ‘0’. On error, return ‘-1’. This is equivalent + to the Python expression ‘value in o’. + + -- C Function: *note Py_ssize_t: 6b1. PySequence_Index (PyObject *o, + PyObject *value) + ` Part of the *note Stable ABI: 4b8.' Return the first index `i' + for which ‘o[i] == value’. On error, return ‘-1’. This is + equivalent to the Python expression ‘o.index(value)’. + + -- C Function: *note PyObject: 4cf. *PySequence_List (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a list object with the same contents as the sequence + or iterable `o', or ‘NULL’ on failure. The returned list is + guaranteed to be new. This is equivalent to the Python expression + ‘list(o)’. + + -- C Function: *note PyObject: 4cf. *PySequence_Tuple (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Return a tuple object with the same contents as the sequence or + iterable `o', or ‘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 ‘tuple(o)’. + + -- C Function: *note PyObject: 4cf. *PySequence_Fast (PyObject *o, + const char *m) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the sequence or iterable `o' as an object usable by + the other ‘PySequence_Fast*’ family of functions. If the object is + not a sequence or iterable, raises *note TypeError: 19c. with `m' + as the message text. Returns ‘NULL’ on failure. + + The ‘PySequence_Fast*’ functions are thus named because they assume + `o' is a *note PyTupleObject: 44b9. or a *note PyListObject: 4502. + 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. + + -- C Function: *note Py_ssize_t: 6b1. PySequence_Fast_GET_SIZE + (PyObject *o) + + Returns the length of `o', assuming that `o' was returned by *note + PySequence_Fast(): 43d2. and that `o' is not ‘NULL’. The size can + also be retrieved by calling *note PySequence_Size(): 1493. on `o', + but *note PySequence_Fast_GET_SIZE(): 4503. is faster because it + can assume `o' is a list or tuple. + + -- C Function: *note PyObject: 4cf. *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 *note PySequence_Fast(): + 43d2, `o' is not ‘NULL’, and that `i' is within bounds. + + -- C Function: *note PyObject: 4cf. **PySequence_Fast_ITEMS (PyObject + *o) + + Return the underlying array of PyObject pointers. Assumes that `o' + was returned by *note PySequence_Fast(): 43d2. and `o' is not + ‘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. + + -- C Function: *note PyObject: 4cf. *PySequence_ITEM (PyObject *o, + Py_ssize_t i) + `Return value: New reference.' Return the `i'th element of `o' or + ‘NULL’ on failure. Faster form of *note PySequence_GetItem(): + 1494. but without checking that *note PySequence_Check(): 43cd. on + `o' is true and without adjustment for negative indices. + + +File: python.info, Node: Mapping Protocol, Next: Iterator Protocol, Prev: Sequence Protocol, Up: Abstract Objects Layer + +7.7.5 Mapping Protocol +---------------------- + +See also *note PyObject_GetItem(): 42ce, *note PyObject_SetItem(): 42cc. +and *note PyObject_DelItem(): 43b9. + + -- C Function: int PyMapping_Check (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if the object + provides the mapping protocol or supports slicing, and ‘0’ + otherwise. Note that it returns ‘1’ for Python classes with a + ‘__getitem__()’ method, since in general it is impossible to + determine what type of keys the class supports. This function + always succeeds. + + -- C Function: *note Py_ssize_t: 6b1. PyMapping_Size (PyObject *o) + -- C Function: *note Py_ssize_t: 6b1. PyMapping_Length (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' + + Returns the number of keys in object `o' on success, and ‘-1’ on + failure. This is equivalent to the Python expression ‘len(o)’. + + -- C Function: *note PyObject: 4cf. *PyMapping_GetItemString (PyObject + *o, const char *key) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return element of `o' corresponding to the string `key' or + ‘NULL’ on failure. This is the equivalent of the Python expression + ‘o[key]’. See also *note PyObject_GetItem(): 42ce. + + -- C Function: int PyMapping_SetItemString (PyObject *o, const char + *key, PyObject *v) + ` Part of the *note Stable ABI: 4b8.' Map the string `key' to the + value `v' in object `o'. Returns ‘-1’ on failure. This is the + equivalent of the Python statement ‘o[key] = v’. See also *note + PyObject_SetItem(): 42cc. This function `does not' steal a + reference to `v'. + + -- C Function: int PyMapping_DelItem (PyObject *o, PyObject *key) + + Remove the mapping for the object `key' from the object `o'. + Return ‘-1’ on failure. This is equivalent to the Python statement + ‘del o[key]’. This is an alias of *note PyObject_DelItem(): 43b9. + + -- C Function: int PyMapping_DelItemString (PyObject *o, const char + *key) + + Remove the mapping for the string `key' from the object `o'. + Return ‘-1’ on failure. This is equivalent to the Python statement + ‘del o[key]’. + + -- C Function: int PyMapping_HasKey (PyObject *o, PyObject *key) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if the mapping + object has the key `key' and ‘0’ otherwise. This is equivalent to + the Python expression ‘key in o’. This function always succeeds. + + Note that exceptions which occur while calling the ‘__getitem__()’ + method will get suppressed. To get error reporting use *note + PyObject_GetItem(): 42ce. instead. + + -- C Function: int PyMapping_HasKeyString (PyObject *o, const char + *key) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if the mapping + object has the key `key' and ‘0’ otherwise. This is equivalent to + the Python expression ‘key in o’. This function always succeeds. + + Note that exceptions which occur while calling the ‘__getitem__()’ + method and creating a temporary string object will get suppressed. + To get error reporting use *note PyMapping_GetItemString(): 4377. + instead. + + -- C Function: *note PyObject: 4cf. *PyMapping_Keys (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' On success, return a list of the keys in object `o'. On + failure, return ‘NULL’. + + Changed in version 3.7: Previously, the function returned a list or + a tuple. + + -- C Function: *note PyObject: 4cf. *PyMapping_Values (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' On success, return a list of the values in object `o'. On + failure, return ‘NULL’. + + Changed in version 3.7: Previously, the function returned a list or + a tuple. + + -- C Function: *note PyObject: 4cf. *PyMapping_Items (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘NULL’. + + Changed in version 3.7: Previously, the function returned a list or + a tuple. + + +File: python.info, Node: Iterator Protocol, Next: Buffer Protocol, Prev: Mapping Protocol, Up: Abstract Objects Layer + +7.7.6 Iterator Protocol +----------------------- + +There are two functions specifically for working with iterators. + + -- C Function: int PyIter_Check (PyObject *o) + ` Part of the *note Stable ABI: 4b8. since version 3.8.' Return + non-zero if the object `o' can be safely passed to *note + PyIter_Next(): 4362, and ‘0’ otherwise. This function always + succeeds. + + -- C Function: int PyAIter_Check (PyObject *o) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Return + non-zero if the object `o' provides the ‘AsyncIterator’ protocol, + and ‘0’ otherwise. This function always succeeds. + + New in version 3.10. + + -- C Function: *note PyObject: 4cf. *PyIter_Next (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the next value from the iterator `o'. The object + must be an iterator according to *note PyIter_Check(): 12fa. (it is + up to the caller to check this). If there are no remaining values, + returns ‘NULL’ with no exception set. If an error occurs while + retrieving the item, returns ‘NULL’ and passes along the exception. + +To write a loop which iterates over an iterator, the C code should look +something like this: + + PyObject *iterator = PyObject_GetIter(obj); + PyObject *item; + + if (iterator == NULL) { + /* propagate error */ + } + + while ((item = PyIter_Next(iterator))) { + /* do something with item */ + ... + /* release reference when done */ + Py_DECREF(item); + } + + Py_DECREF(iterator); + + if (PyErr_Occurred()) { + /* propagate error */ + } + else { + /* continue doing useful work */ + } + + -- C Type: type PySendResult + + The enum value used to represent different results of *note + PyIter_Send(): 4c1. + + New in version 3.10. + + -- C Function: *note PySendResult: 450f. PyIter_Send (PyObject *iter, + PyObject *arg, PyObject **presult) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Sends + the `arg' value into the iterator `iter'. Returns: + + - ‘PYGEN_RETURN’ if iterator returns. Return value is returned + via `presult'. + + - ‘PYGEN_NEXT’ if iterator yields. Yielded value is returned + via `presult'. + + - ‘PYGEN_ERROR’ if iterator has raised and exception. `presult' + is set to ‘NULL’. + + New in version 3.10. + + +File: python.info, Node: Buffer Protocol, Next: Old Buffer Protocol, Prev: Iterator Protocol, Up: Abstract Objects Layer + +7.7.7 Buffer Protocol +--------------------- + +Certain objects available in Python wrap access to an underlying memory +array or `buffer'. Such objects include the built-in *note bytes: 1b4. +and *note bytearray: 1a5, and some extension types like *note +array.array: 3d2. 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 level in the form of the *note +buffer protocol: 1ba6. This protocol has two sides: + + - 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 + *note Buffer Object Structures: 4512.; + + - 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). + +Simple objects such as *note bytes: 1b4. and *note bytearray: 1a5. +expose their underlying buffer in byte-oriented form. Other forms are +possible; for example, the elements exposed by an *note array.array: +3d2. can be multi-byte values. + +An example consumer of the buffer interface is the *note write(): 94a. +method of file objects: any object that can export a series of bytes +through the buffer interface can be written to a file. While ‘write()’ +only needs read-only access to the internal contents of the object +passed to it, other methods such as *note readinto(): 25f0. 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: + + * call *note PyObject_GetBuffer(): 329. with the right parameters; + + * call *note PyArg_ParseTuple(): 4d9. (or one of its siblings) with + one of the ‘y*’, ‘w*’ or ‘s*’ *note format codes: 4db. + +In both cases, *note PyBuffer_Release(): 331. must be called when the +buffer isn’t needed anymore. Failure to do so could lead to various +issues such as resource leaks. + +* Menu: + +* Buffer structure:: +* Buffer request types:: +* Complex arrays:: +* Buffer-related functions:: + + +File: python.info, Node: Buffer structure, Next: Buffer request types, Up: Buffer Protocol + +7.7.7.1 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 *note PyObject: 4cf. 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 *note memoryview: 4515. object can +be created. + +For short instructions how to write an exporting object, see *note +Buffer Object Structures: 4512. For obtaining a buffer, see *note +PyObject_GetBuffer(): 329. + + -- C Type: type Py_buffer + ` Part of the *note Stable ABI: 4b8. (including all members) since + version 3.11.' + -- 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 *note strides: 4517. the value may + point to the end of the memory block. + + For *note contiguous: 1c79. arrays, the value points to the + beginning of the memory block. + + -- C Member: *note PyObject: 4cf. *obj + + A new reference to the exporting object. The reference is + owned by the consumer and automatically decremented and set to + ‘NULL’ by *note PyBuffer_Release(): 331. 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 + *note PyMemoryView_FromBuffer(): 332. or *note + PyBuffer_FillInfo(): 330. this field is ‘NULL’. In general, + exporting objects MUST NOT use this scheme. + + -- C Member: *note Py_ssize_t: 6b1. len + + ‘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 ‘((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 + *note PyBUF_SIMPLE: 451a. or *note PyBUF_WRITABLE: 451b. + + -- C Member: int readonly + + An indicator of whether the buffer is read-only. This field + is controlled by the *note PyBUF_WRITABLE: 451b. flag. + + -- C Member: *note Py_ssize_t: 6b1. itemsize + + Item size in bytes of a single element. Same as the value of + *note struct.calcsize(): 13e5. called on non-‘NULL’ *note + format: 451e. values. + + Important exception: If a consumer requests a buffer without + the *note PyBUF_FORMAT: 451f. flag, *note format: 451e. will + be set to ‘NULL’, but *note itemsize: 451d. still has the + value for the original format. + + If *note shape: 4520. is present, the equality ‘product(shape) + * itemsize == len’ still holds and the consumer can use *note + itemsize: 451d. to navigate the buffer. + + If *note shape: 4520. is ‘NULL’ as a result of a *note + PyBUF_SIMPLE: 451a. or a *note PyBUF_WRITABLE: 451b. request, + the consumer must disregard *note itemsize: 451d. and assume + ‘itemsize == 1’. + + -- C Member: const char *format + + A `NUL' terminated string in *note struct: f5. module style + syntax describing the contents of a single item. If this is + ‘NULL’, ‘"B"’ (unsigned bytes) is assumed. + + This field is controlled by the *note PyBUF_FORMAT: 451f. + flag. + + -- C Member: int ndim + + The number of dimensions the memory represents as an + n-dimensional array. If it is ‘0’, *note buf: 4516. points to + a single item representing a scalar. In this case, *note + shape: 4520, *note strides: 4517. and *note suboffsets: 4522. + MUST be ‘NULL’. + + The macro ‘PyBUF_MAX_NDIM’ limits the maximum number of + dimensions to 64. Exporters MUST respect this limit, + consumers of multi-dimensional buffers SHOULD be able to + handle up to ‘PyBUF_MAX_NDIM’ dimensions. + + -- C Member: *note Py_ssize_t: 6b1. *shape + + An array of *note Py_ssize_t: 6b1. of length *note ndim: 4521. + indicating the shape of the memory as an n-dimensional array. + Note that ‘shape[0] * ... * shape[ndim-1] * itemsize’ MUST be + equal to *note len: 4519. + + Shape values are restricted to ‘shape[n] >= 0’. The case + ‘shape[n] == 0’ requires special attention. See *note complex + arrays: 4523. for further information. + + The shape array is read-only for the consumer. + + -- C Member: *note Py_ssize_t: 6b1. *strides + + An array of *note Py_ssize_t: 6b1. of length *note ndim: 4521. + 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 ‘strides[n] <= 0’. See *note complex arrays: 4523. + for further information. + + The strides array is read-only for the consumer. + + -- C Member: *note Py_ssize_t: 6b1. *suboffsets + + An array of *note Py_ssize_t: 6b1. of length *note ndim: 4521. + If ‘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 ‘NULL’ (the default value). + + This type of array representation is used by the Python + Imaging Library (PIL). See *note complex arrays: 4523. for + further information how to access elements of such an array. + + The suboffsets array is read-only for the consumer. + + -- 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. + + +File: python.info, Node: Buffer request types, Next: Complex arrays, Prev: Buffer structure, Up: Buffer Protocol + +7.7.7.2 Buffer request types +............................ + +Buffers are usually obtained by sending a buffer request to an exporting +object via *note PyObject_GetBuffer(): 329. 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 *note Py_buffer: 327. fields are unambiguously defined by the +request type. + +* Menu: + +* request-independent fields:: +* readonly, format: readonly format. +* shape, strides, suboffsets: shape strides suboffsets. +* contiguity requests:: +* compound requests:: + + +File: python.info, Node: request-independent fields, Next: readonly format, Up: Buffer request types + +7.7.7.3 request-independent fields +.................................. + +The following fields are not influenced by `flags' and must always be +filled in with the correct values: *note obj: 4518, *note buf: 4516, +*note len: 4519, *note itemsize: 451d, *note ndim: 4521. + + +File: python.info, Node: readonly format, Next: shape strides suboffsets, Prev: request-independent fields, Up: Buffer request types + +7.7.7.4 readonly, format +........................ + + -- C Macro: PyBUF_WRITABLE + + Controls the *note readonly: 451c. 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. + + -- C Macro: PyBUF_FORMAT + + Controls the *note format: 451e. field. If set, this field + MUST be filled in correctly. Otherwise, this field MUST be + ‘NULL’. + +*note PyBUF_WRITABLE: 451b. can be |’d to any of the flags in the next +section. Since *note PyBUF_SIMPLE: 451a. is defined as 0, *note +PyBUF_WRITABLE: 451b. can be used as a stand-alone flag to request a +simple writable buffer. + +*note PyBUF_FORMAT: 451f. can be |’d to any of the flags except *note +PyBUF_SIMPLE: 451a. The latter already implies format ‘B’ (unsigned +bytes). + + +File: python.info, Node: shape strides suboffsets, Next: contiguity requests, Prev: readonly format, Up: Buffer request types + +7.7.7.5 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. + +Request shape strides suboffsets + +----------------------------------------------------------------------------- + + -- C Macro: PyBUF_INDIRECT yes yes if needed + + + -- C Macro: PyBUF_STRIDES yes yes NULL + + + -- C Macro: PyBUF_ND yes NULL NULL + + + -- C Macro: PyBUF_SIMPLE NULL NULL NULL + + + +File: python.info, Node: contiguity requests, Next: compound requests, Prev: shape strides suboffsets, Up: Buffer request types + +7.7.7.6 contiguity requests +........................... + +C or Fortran *note contiguity: 1c79. can be explicitly requested, with +and without stride information. Without stride information, the buffer +must be C-contiguous. + +Request shape strides suboffsets contig + +------------------------------------------------------------------------------------------------ + + -- C Macro: PyBUF_C_CONTIGUOUS yes yes NULL C + + + -- C Macro: PyBUF_F_CONTIGUOUS yes yes NULL F + + + -- C Macro: PyBUF_ANY_CONTIGUOUS yes yes NULL C or F + + +*note PyBUF_ND: 452c. yes NULL NULL C + + + +File: python.info, Node: compound requests, Prev: contiguity requests, Up: Buffer request types + +7.7.7.7 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 *note PyBuffer_IsContiguous(): 32e. to +determine contiguity. + +Request shape strides suboffsets contig readonly format + +------------------------------------------------------------------------------------------------------------------------ + + -- C Macro: PyBUF_FULL yes yes if needed U 0 yes + + + -- C Macro: PyBUF_FULL_RO yes yes if needed U 1 or 0 yes + + + -- C Macro: PyBUF_RECORDS yes yes NULL U 0 yes + + + -- C Macro: PyBUF_RECORDS_RO yes yes NULL U 1 or 0 yes + + + -- C Macro: PyBUF_STRIDED yes yes NULL U 0 NULL + + + -- C Macro: PyBUF_STRIDED_RO yes yes NULL U 1 or 0 NULL + + + -- C Macro: PyBUF_CONTIG yes NULL NULL C 0 NULL + + + -- C Macro: PyBUF_CONTIG_RO yes NULL NULL C 1 or 0 NULL + + + +File: python.info, Node: Complex arrays, Next: Buffer-related functions, Prev: Buffer request types, Up: Buffer Protocol + +7.7.7.8 Complex arrays +...................... + +* Menu: + +* NumPy-style; shape and strides: NumPy-style shape and strides. +* PIL-style; shape, strides and suboffsets: PIL-style shape strides and suboffsets. + + +File: python.info, Node: NumPy-style shape and strides, Next: PIL-style shape strides and suboffsets, Up: Complex arrays + +7.7.7.9 NumPy-style: shape and strides +...................................... + +The logical structure of NumPy-style arrays is defined by *note +itemsize: 451d, *note ndim: 4521, *note shape: 4520. and *note strides: +4517. + +If ‘ndim == 0’, the memory location pointed to by *note buf: 4516. is +interpreted as a scalar of size *note itemsize: 451d. In that case, +both *note shape: 4520. and *note strides: 4517. are ‘NULL’. + +If *note strides: 4517. is ‘NULL’, the array is interpreted as a +standard n-dimensional C-array. Otherwise, the consumer must access an +n-dimensional array as follows: + + ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1]; + item = *((typeof(item) *)ptr); + +As noted above, *note buf: 4516. can point to any location within the +actual memory block. An exporter can check the validity of a buffer +with this function: + + 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 + + +File: python.info, Node: PIL-style shape strides and suboffsets, Prev: NumPy-style shape and strides, Up: Complex arrays + +7.7.7.10 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 ‘char +v[2][2][3]’ can also be viewed as an array of 2 pointers to 2 +two-dimensional arrays: ‘char (*v[2])[2][3]’. In suboffsets +representation, those two pointers can be embedded at the start of *note +buf: 4516, pointing to two ‘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-‘NULL’ +strides and suboffsets: + + 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; + } + + +File: python.info, Node: Buffer-related functions, Prev: Complex arrays, Up: Buffer Protocol + +7.7.7.11 Buffer-related functions +................................. + + -- C Function: int PyObject_CheckBuffer (PyObject *obj) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Return + ‘1’ if `obj' supports the buffer interface otherwise ‘0’. When ‘1’ + is returned, it doesn’t guarantee that *note PyObject_GetBuffer(): + 329. will succeed. This function always succeeds. + + -- C Function: int PyObject_GetBuffer (PyObject *exporter, Py_buffer + *view, int flags) + ` Part of the *note Stable ABI: 4b8. 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 ‘PyExc_BufferError’, set ‘view->obj’ to ‘NULL’ and return + ‘-1’. + + On success, fill in `view', set ‘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, ‘view->obj’ MAY refer to + this object instead of `exporter' (See *note Buffer Object + Structures: 4512.). + + Successful calls to *note PyObject_GetBuffer(): 329. must be paired + with calls to *note PyBuffer_Release(): 331, similar to ‘malloc()’ + and ‘free()’. Thus, after the consumer is done with the buffer, + *note PyBuffer_Release(): 331. must be called exactly once. + + -- C Function: void PyBuffer_Release (Py_buffer *view) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Release + the buffer `view' and decrement the reference count for + ‘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 *note PyObject_GetBuffer(): 329. + + -- C Function: *note Py_ssize_t: 6b1. PyBuffer_SizeFromFormat (const + char *format) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Return + the implied *note itemsize: 451d. from *note format: 451e. On + error, raise an exception and return -1. + + New in version 3.9. + + -- C Function: int PyBuffer_IsContiguous (const Py_buffer *view, char + order) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Return + ‘1’ if the memory defined by the `view' is C-style (`order' is + ‘'C'’) or Fortran-style (`order' is ‘'F'’) *note contiguous: 1c79. + or either one (`order' is ‘'A'’). Return ‘0’ otherwise. This + function always succeeds. + + -- C Function: void *PyBuffer_GetPointer (const Py_buffer *view, const + Py_ssize_t *indices) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Get the + memory area pointed to by the `indices' inside the given `view'. + `indices' must point to an array of ‘view->ndim’ indices. + + -- C Function: int PyBuffer_FromContiguous (const Py_buffer *view, + const void *buf, Py_ssize_t len, char fort) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Copy + contiguous `len' bytes from `buf' to `view'. `fort' can be ‘'C'’ + or ‘'F'’ (for C-style or Fortran-style ordering). ‘0’ is returned + on success, ‘-1’ on error. + + -- C Function: int PyBuffer_ToContiguous (void *buf, const Py_buffer + *src, Py_ssize_t len, char order) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Copy + `len' bytes from `src' to its contiguous representation in `buf'. + `order' can be ‘'C'’ or ‘'F'’ or ‘'A'’ (for C-style or + Fortran-style ordering or either one). ‘0’ is returned on success, + ‘-1’ on error. + + This function fails if `len' != `src->len'. + + -- C Function: int PyObject_CopyData (Py_buffer *dest, Py_buffer *src) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Copy + data from `src' to `dest' buffer. Can convert between C-style and + or Fortran-style buffers. + + ‘0’ is returned on success, ‘-1’ on error. + + -- C Function: void PyBuffer_FillContiguousStrides (int ndims, + Py_ssize_t *shape, Py_ssize_t *strides, int itemsize, char + order) + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Fill the + `strides' array with byte-strides of a *note contiguous: 1c79. + (C-style if `order' is ‘'C'’ or Fortran-style if `order' is ‘'F'’) + array of the given shape with the given number of bytes per + element. + + -- C Function: int PyBuffer_FillInfo (Py_buffer *view, PyObject + *exporter, void *buf, Py_ssize_t len, int readonly, int flags) + ` Part of the *note Stable ABI: 4b8. 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 *note PyBUF_WRITABLE: 451b. is set in + `flags'. + + On success, set ‘view->obj’ to a new reference to `exporter' and + return 0. Otherwise, raise ‘PyExc_BufferError’, set ‘view->obj’ to + ‘NULL’ and return ‘-1’; + + If this function is used as part of a *note getbufferproc: 4512, + `exporter' MUST be set to the exporting object and `flags' must be + passed unmodified. Otherwise, `exporter' MUST be ‘NULL’. + + +File: python.info, Node: Old Buffer Protocol, Prev: Buffer Protocol, Up: Abstract Objects Layer + +7.7.8 Old Buffer Protocol +------------------------- + +Deprecated since version 3.0. + +These functions were part of the “old buffer protocol” API in Python 2. +In Python 3, this protocol doesn’t exist anymore but the functions are +still exposed to ease porting 2.x code. They act as a compatibility +wrapper around the *note new buffer protocol: 1ba6, but they don’t give +you control over the lifetime of the resources acquired when a buffer is +exported. + +Therefore, it is recommended that you call *note PyObject_GetBuffer(): +329. (or the ‘y*’ or ‘w*’ *note format codes: 4db. with the *note +PyArg_ParseTuple(): 4d9. family of functions) to get a buffer view over +an object, and *note PyBuffer_Release(): 331. when the buffer view can +be released. + + -- C Function: int PyObject_AsCharBuffer (PyObject *obj, const char + **buffer, Py_ssize_t *buffer_len) + ` Part of the *note Stable ABI: 4b8.' Returns a pointer to a + read-only memory location usable as character-based input. The + `obj' argument must support the single-segment character buffer + interface. On success, returns ‘0’, sets `buffer' to the memory + location and `buffer_len' to the buffer length. Returns ‘-1’ and + sets a *note TypeError: 19c. on error. + + -- C Function: int PyObject_AsReadBuffer (PyObject *obj, const void + **buffer, Py_ssize_t *buffer_len) + ` Part of the *note Stable ABI: 4b8.' Returns a pointer to a + read-only memory location containing arbitrary data. The `obj' + argument must support the single-segment readable buffer interface. + On success, returns ‘0’, sets `buffer' to the memory location and + `buffer_len' to the buffer length. Returns ‘-1’ and sets a *note + TypeError: 19c. on error. + + -- C Function: int PyObject_CheckReadBuffer (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Returns ‘1’ if `o' supports + the single-segment readable buffer interface. Otherwise returns + ‘0’. This function always succeeds. + + Note that this function tries to get and release a buffer, and + exceptions which occur while calling corresponding functions will + get suppressed. To get error reporting use *note + PyObject_GetBuffer(): 329. instead. + + -- C Function: int PyObject_AsWriteBuffer (PyObject *obj, void + **buffer, Py_ssize_t *buffer_len) + ` Part of the *note Stable ABI: 4b8.' Returns a pointer to a + writable memory location. The `obj' argument must support the + single-segment, character buffer interface. On success, returns + ‘0’, sets `buffer' to the memory location and `buffer_len' to the + buffer length. Returns ‘-1’ and sets a *note TypeError: 19c. on + error. + + +File: python.info, Node: Concrete Objects Layer, Next: Initialization Finalization and Threads, Prev: Abstract Objects Layer, Up: Python/C API Reference Manual + +7.8 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 *note PyDict_Check(): 4542. +The chapter is structured like the “family tree” of Python object types. + + 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 ‘NULL’ being passed instead of a valid object. + Allowing ‘NULL’ to be passed in can cause memory access violations + and immediate termination of the interpreter. + +* Menu: + +* Fundamental Objects:: +* Numeric Objects:: +* Sequence Objects:: +* Container Objects:: +* Function Objects: Function Objects<2>. +* Other Objects:: + + +File: python.info, Node: Fundamental Objects, Next: Numeric Objects, Up: Concrete Objects Layer + +7.8.1 Fundamental Objects +------------------------- + +This section describes Python type objects and the singleton object +‘None’. + +* Menu: + +* Type Objects: Type Objects<2>. +* The None Object:: + + +File: python.info, Node: Type Objects<2>, Next: The None Object, Up: Fundamental Objects + +7.8.1.1 Type Objects +.................... + + -- C Type: type PyTypeObject + ` Part of the *note Limited API: 4b8. (as an opaque struct).' The + C structure of the objects used to describe built-in types. + + -- C Variable: *note PyTypeObject: 701. PyType_Type + ` Part of the *note Stable ABI: 4b8.' This is the type object for + type objects; it is the same object as *note type: 9c2. in the + Python layer. + + -- 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. + + -- 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. + + -- C Function: unsigned int PyType_ClearCache () + ` Part of the *note Stable ABI: 4b8.' Clear the internal lookup + cache. Return the current version tag. + + -- C Function: unsigned long PyType_GetFlags (PyTypeObject *type) + ` Part of the *note Stable ABI: 4b8.' Return the *note tp_flags: + 12c3. member of `type'. This function is primarily meant for use + with ‘Py_LIMITED_API’; the individual flag bits are guaranteed to + be stable across Python releases, but access to *note tp_flags: + 12c3. itself is not part of the limited API. + + New in version 3.2. + + Changed in version 3.4: The return type is now ‘unsigned long’ + rather than ‘long’. + + -- C Function: void PyType_Modified (PyTypeObject *type) + ` Part of the *note Stable ABI: 4b8.' 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. + + -- 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. + + -- 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 *note Py_TPFLAGS_HAVE_GC: 351. + + -- C Function: int PyType_IsSubtype (PyTypeObject *a, PyTypeObject *b) + ` Part of the *note Stable ABI: 4b8.' Return true if `a' is a + subtype of `b'. + + This function only checks for actual subtypes, which means that + *note __subclasscheck__(): 1930. is not called on `b'. Call *note + PyObject_IsSubclass(): b34. to do the same check that *note + issubclass(): 3ac. would do. + + -- C Function: *note PyObject: 4cf. *PyType_GenericAlloc (PyTypeObject + *type, Py_ssize_t nitems) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Generic handler for the *note tp_alloc: 4265. slot of a type + object. Use Python’s default memory allocation mechanism to + allocate a new instance and initialize all its contents to ‘NULL’. + + -- C Function: *note PyObject: 4cf. *PyType_GenericNew (PyTypeObject + *type, PyObject *args, PyObject *kwds) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Generic handler for the *note tp_new: 4260. slot of a type + object. Create a new instance using the type’s *note tp_alloc: + 4265. slot. + + -- C Function: int PyType_Ready (PyTypeObject *type) + ` Part of the *note Stable ABI: 4b8.' 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 ‘0’ on success, or return + ‘-1’ and sets an exception on error. + + Note: If some of the base classes implements the GC protocol + and the provided type does not include the *note + Py_TPFLAGS_HAVE_GC: 351. in its flags, then the GC protocol + will be automatically implemented from its parents. On the + contrary, if the type being created does include *note + Py_TPFLAGS_HAVE_GC: 351. in its flags then it `must' implement + the GC protocol itself by at least implementing the *note + tp_traverse: 352. handle. + + -- C Function: *note PyObject: 4cf. *PyType_GetName (PyTypeObject + *type) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.11.' Return the type’s name. Equivalent to + getting the type’s ‘__name__’ attribute. + + New in version 3.11. + + -- C Function: *note PyObject: 4cf. *PyType_GetQualName (PyTypeObject + *type) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.11.' Return the type’s qualified name. Equivalent + to getting the type’s ‘__qualname__’ attribute. + + New in version 3.11. + + -- C Function: void *PyType_GetSlot (PyTypeObject *type, int slot) + ` Part of the *note Stable ABI: 4b8. since version 3.4.' Return + the function pointer stored in the given slot. If the result is + ‘NULL’, this indicates that either the slot is ‘NULL’, or that the + function was called with invalid parameters. Callers will + typically cast the result pointer into the appropriate function + type. + + See ‘PyType_Slot.slot’ for possible values of the `slot' argument. + + New in version 3.4. + + Changed in version 3.10: *note PyType_GetSlot(): 4c9. can now + accept all types. Previously, it was limited to *note heap types: + 5b7. + + -- C Function: *note PyObject: 4cf. *PyType_GetModule (PyTypeObject + *type) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Return + the module object associated with the given type when the type was + created using *note PyType_FromModuleAndSpec(): 4c8. + + If no module is associated with the given type, sets *note + TypeError: 19c. and returns ‘NULL’. + + This function is usually used to get the module in which a method + is defined. Note that in such a method, + ‘PyType_GetModule(Py_TYPE(self))’ may not return the intended + result. ‘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 *note PyCMethod: 336. to get the class that + defines the method. See *note PyType_GetModuleByDef(): 335. for + cases when ‘PyCMethod’ cannot be used. + + New in version 3.9. + + -- C Function: void *PyType_GetModuleState (PyTypeObject *type) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Return + the state of the module object associated with the given type. + This is a shortcut for calling *note PyModule_GetState(): 5d5. on + the result of *note PyType_GetModule(): 5c2. + + If no module is associated with the given type, sets *note + TypeError: 19c. and returns ‘NULL’. + + If the `type' has an associated module but its state is ‘NULL’, + returns ‘NULL’ without setting an exception. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyType_GetModuleByDef + (PyTypeObject *type, struct PyModuleDef *def) + + Find the first superclass whose module was created from the given + *note PyModuleDef: 5d2. `def', and return that module. + + If no module is found, raises a *note TypeError: 19c. and returns + ‘NULL’. + + This function is intended to be used together with *note + PyModule_GetState(): 5d5. to get module state from slot methods + (such as *note tp_init: 4266. or *note nb_add: 4549.) and other + places where a method’s defining class cannot be passed using the + *note PyCMethod: 336. calling convention. + + New in version 3.11. + +* Menu: + +* Creating Heap-Allocated Types:: + + +File: python.info, Node: Creating Heap-Allocated Types, Up: Type Objects<2> + +7.8.1.2 Creating Heap-Allocated Types +..................................... + +The following functions and structs are used to create *note heap types: +5b7. + + -- C Function: *note PyObject: 4cf. *PyType_FromModuleAndSpec (PyObject + *module, PyType_Spec *spec, PyObject *bases) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.10.' Creates and returns a *note heap type: 5b7. + from the `spec' (*note Py_TPFLAGS_HEAPTYPE: 454b.). + + 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 + ‘NULL’, the `Py_tp_bases' slot is used instead. If that also is + ‘NULL’, the `Py_tp_base' slot is used instead. If that also is + ‘NULL’, the new type derives from *note object: 6df. + + The `module' argument can be used to record the module in which the + new class is defined. It must be a module object or ‘NULL’. If + not ‘NULL’, the module is associated with the new type and can + later be retrieved with *note PyType_GetModule(): 5c2. The + associated module is not inherited by subclasses; it must be + specified for each class individually. + + This function calls *note PyType_Ready(): 350. on the new type. + + New in version 3.9. + + Changed in version 3.10: The function now accepts a single class as + the `bases' argument and ‘NULL’ as the ‘tp_doc’ slot. + + -- C Function: *note PyObject: 4cf. *PyType_FromSpecWithBases + (PyType_Spec *spec, PyObject *bases) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.3.' Equivalent to ‘PyType_FromModuleAndSpec(NULL, + spec, bases)’. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyType_FromSpec (PyType_Spec + *spec) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Equivalent to ‘PyType_FromSpecWithBases(spec, NULL)’. + + -- C Type: type PyType_Spec + ` Part of the *note Stable ABI: 4b8. (including all members).' + Structure defining a type’s behavior. + + -- C Member: const char *PyType_Spec.name + + Name of the type, used to set *note PyTypeObject.tp_name: + 12f9. + + -- C Member: int PyType_Spec.basicsize + + -- C Member: int PyType_Spec.itemsize + + Size of the instance in bytes, used to set *note + PyTypeObject.tp_basicsize: 5dd. and *note + PyTypeObject.tp_itemsize: 425d. + + -- C Member: int PyType_Spec.flags + + Type flags, used to set *note PyTypeObject.tp_flags: 12c3. + + If the ‘Py_TPFLAGS_HEAPTYPE’ flag is not set, *note + PyType_FromSpecWithBases(): 4c7. sets it automatically. + + -- C Member: *note PyType_Slot: 4408. *PyType_Spec.slots + + Array of *note PyType_Slot: 4408. structures. Terminated by + the special slot value ‘{0, NULL}’. + + -- C Type: type PyType_Slot + ` Part of the *note Stable ABI: 4b8. (including all members).' + Structure defining optional functionality of a type, containing a + slot ID and a value pointer. + + -- C Member: int PyType_Slot.slot + + A slot ID. + + Slot IDs are named like the field names of the structures + *note PyTypeObject: 701, *note PyNumberMethods: 1081, + *note PySequenceMethods: 4288, *note PyMappingMethods: + 4289. and *note PyAsyncMethods: 4552. with an added ‘Py_’ + prefix. For example, use: + + * ‘Py_tp_dealloc’ to set *note + PyTypeObject.tp_dealloc: 4263. + + * ‘Py_nb_add’ to set *note PyNumberMethods.nb_add: + 4549. + + * ‘Py_sq_length’ to set *note + PySequenceMethods.sq_length: 4553. + + The following fields cannot be set at all using *note + PyType_Spec: 4409. and ‘PyType_Slot’: + + * *note tp_dict: 4554. + + * *note tp_mro: 4555. + + * *note tp_cache: 4556. + + * *note tp_subclasses: 4557. + + * *note tp_weaklist: 4558. + + * *note tp_vectorcall: 4559. + + * *note tp_weaklistoffset: 5de. (see *note + PyMemberDef: 455a.) + + * *note tp_dictoffset: 455b. (see *note PyMemberDef: + 455a.) + + * *note tp_vectorcall_offset: 44ee. (see *note + PyMemberDef: 455a.) + + Setting ‘Py_tp_bases’ or ‘Py_tp_base’ may be problematic + on some platforms. To avoid issues, use the `bases' + argument of ‘PyType_FromSpecWithBases()’ instead. + + Changed in version 3.9: Slots in *note PyBufferProcs: 455c. + may be set in the unlimited API. + + Changed in version 3.11: *note bf_getbuffer: 333. and *note + bf_releasebuffer: 334. are now available under the limited + API. + + -- C Member: void *PyType_Slot.pfunc + + The desired value of the slot. In most cases, this is a + pointer to a function. + + Slots other than ‘Py_tp_doc’ may not be ‘NULL’. + + +File: python.info, Node: The None Object, Prev: Type Objects<2>, Up: Fundamental Objects + +7.8.1.3 The ‘None’ Object +......................... + +Note that the *note PyTypeObject: 701. for ‘None’ is not directly +exposed in the Python/C API. Since ‘None’ is a singleton, testing for +object identity (using ‘==’ in C) is sufficient. There is no +‘PyNone_Check()’ function for the same reason. + + -- C Variable: *note PyObject: 4cf. *Py_None + + The Python ‘None’ object, denoting lack of value. This object has + no methods. It needs to be treated just like any other object with + respect to reference counts. + + -- C Macro: Py_RETURN_NONE + + Properly handle returning *note Py_None: 4231. from within a C + function (that is, increment the reference count of ‘None’ and + return it.) + + +File: python.info, Node: Numeric Objects, Next: Sequence Objects, Prev: Fundamental Objects, Up: Concrete Objects Layer + +7.8.2 Numeric Objects +--------------------- + +* Menu: + +* Integer Objects:: +* Boolean Objects:: +* Floating Point Objects:: +* Pack functions:: +* Unpack functions:: +* Complex Number Objects:: + + +File: python.info, Node: Integer Objects, Next: Boolean Objects, Up: Numeric Objects + +7.8.2.1 Integer Objects +....................... + +All integers are implemented as “long” integer objects of arbitrary +size. + +On error, most ‘PyLong_As*’ APIs return ‘(return type)-1’ which cannot +be distinguished from a number. Use *note PyErr_Occurred(): 12f8. to +disambiguate. + + -- C Type: type PyLongObject + ` Part of the *note Limited API: 4b8. (as an opaque struct).' This + subtype of *note PyObject: 4cf. represents a Python integer object. + + -- C Variable: *note PyTypeObject: 701. PyLong_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python integer type. This is the + same object as *note int: 1c7. in the Python layer. + + -- C Function: int PyLong_Check (PyObject *p) + + Return true if its argument is a *note PyLongObject: 436a. or a + subtype of *note PyLongObject: 436a. This function always + succeeds. + + -- C Function: int PyLong_CheckExact (PyObject *p) + + Return true if its argument is a *note PyLongObject: 436a, but not + a subtype of *note PyLongObject: 436a. This function always + succeeds. + + -- C Function: *note PyObject: 4cf. *PyLong_FromLong (long v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. object from `v', or + ‘NULL’ on failure. + + The current implementation keeps an array of integer objects for + all integers between ‘-5’ and ‘256’. When you create an int in + that range you actually just get back a reference to the existing + object. + + -- C Function: *note PyObject: 4cf. *PyLong_FromUnsignedLong (unsigned + long v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. object from a C + unsigned long, or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyLong_FromSsize_t (Py_ssize_t v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. object from a C *note + Py_ssize_t: 6b1, or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyLong_FromSize_t (size_t v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. object from a C + ‘size_t’, or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyLong_FromLongLong (long long v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. object from a C long + long, or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyLong_FromUnsignedLongLong + (unsigned long long v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. object from a C + unsigned long long, or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyLong_FromDouble (double v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. object from the + integer part of `v', or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyLong_FromString (const char + *str, char **pend, int base) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyLongObject: 436a. based on the string + value in `str', which is interpreted according to the radix in + `base'. If `pend' is non-‘NULL’, `*pend' will point to the first + character in `str' which follows the representation of the number. + If `base' is ‘0’, `str' is interpreted using the *note Integer + literals: 18c3. definition; in this case, leading zeros in a + non-zero decimal number raises a *note ValueError: 1c8. If `base' + is not ‘0’, it must be between ‘2’ and ‘36’, inclusive. Leading + spaces and single underscores after a base specifier and between + digits are ignored. If there are no digits, *note ValueError: 1c8. + will be raised. + + -- C Function: *note PyObject: 4cf. *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. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyLong_FromVoidPtr (void *p) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Python integer from the pointer `p'. The pointer + value can be retrieved from the resulting value using *note + PyLong_AsVoidPtr(): 4371. + + -- C Function: long PyLong_AsLong (PyObject *obj) + ` Part of the *note Stable ABI: 4b8.' + + Return a C long representation of `obj'. If `obj' is not an + instance of *note PyLongObject: 436a, first call its ‘__index__()’ + method (if present) to convert it to a *note PyLongObject: 436a. + + Raise *note OverflowError: 4a4. if the value of `obj' is out of + range for a long. + + Returns ‘-1’ on error. Use *note PyErr_Occurred(): 12f8. to + disambiguate. + + Changed in version 3.8: Use ‘__index__()’ if available. + + Changed in version 3.10: This function will no longer use + ‘__int__()’. + + -- C Function: long PyLong_AsLongAndOverflow (PyObject *obj, int + *overflow) + ` Part of the *note Stable ABI: 4b8.' Return a C long + representation of `obj'. If `obj' is not an instance of *note + PyLongObject: 436a, first call its ‘__index__()’ method (if + present) to convert it to a *note PyLongObject: 436a. + + If the value of `obj' is greater than ‘LONG_MAX’ or less than + ‘LONG_MIN’, set `*overflow' to ‘1’ or ‘-1’, respectively, and + return ‘-1’; otherwise, set `*overflow' to ‘0’. If any other + exception occurs set `*overflow' to ‘0’ and return ‘-1’ as usual. + + Returns ‘-1’ on error. Use *note PyErr_Occurred(): 12f8. to + disambiguate. + + Changed in version 3.8: Use ‘__index__()’ if available. + + Changed in version 3.10: This function will no longer use + ‘__int__()’. + + -- C Function: long long PyLong_AsLongLong (PyObject *obj) + ` Part of the *note Stable ABI: 4b8.' + + Return a C long long representation of `obj'. If `obj' is not an + instance of *note PyLongObject: 436a, first call its ‘__index__()’ + method (if present) to convert it to a *note PyLongObject: 436a. + + Raise *note OverflowError: 4a4. if the value of `obj' is out of + range for a long long. + + Returns ‘-1’ on error. Use *note PyErr_Occurred(): 12f8. to + disambiguate. + + Changed in version 3.8: Use ‘__index__()’ if available. + + Changed in version 3.10: This function will no longer use + ‘__int__()’. + + -- C Function: long long PyLong_AsLongLongAndOverflow (PyObject *obj, + int *overflow) + ` Part of the *note Stable ABI: 4b8.' Return a C long long + representation of `obj'. If `obj' is not an instance of *note + PyLongObject: 436a, first call its ‘__index__()’ method (if + present) to convert it to a *note PyLongObject: 436a. + + If the value of `obj' is greater than ‘LLONG_MAX’ or less than + ‘LLONG_MIN’, set `*overflow' to ‘1’ or ‘-1’, respectively, and + return ‘-1’; otherwise, set `*overflow' to ‘0’. If any other + exception occurs set `*overflow' to ‘0’ and return ‘-1’ as usual. + + Returns ‘-1’ on error. Use *note PyErr_Occurred(): 12f8. to + disambiguate. + + New in version 3.2. + + Changed in version 3.8: Use ‘__index__()’ if available. + + Changed in version 3.10: This function will no longer use + ‘__int__()’. + + -- C Function: *note Py_ssize_t: 6b1. PyLong_AsSsize_t (PyObject + *pylong) + ` Part of the *note Stable ABI: 4b8.' + + Return a C *note Py_ssize_t: 6b1. representation of `pylong'. + `pylong' must be an instance of *note PyLongObject: 436a. + + Raise *note OverflowError: 4a4. if the value of `pylong' is out of + range for a *note Py_ssize_t: 6b1. + + Returns ‘-1’ on error. Use *note PyErr_Occurred(): 12f8. to + disambiguate. + + -- C Function: unsigned long PyLong_AsUnsignedLong (PyObject *pylong) + ` Part of the *note Stable ABI: 4b8.' + + Return a C unsigned long representation of `pylong'. `pylong' must + be an instance of *note PyLongObject: 436a. + + Raise *note OverflowError: 4a4. if the value of `pylong' is out of + range for a unsigned long. + + Returns ‘(unsigned long)-1’ on error. Use *note PyErr_Occurred(): + 12f8. to disambiguate. + + -- C Function: size_t PyLong_AsSize_t (PyObject *pylong) + ` Part of the *note Stable ABI: 4b8.' + + Return a C ‘size_t’ representation of `pylong'. `pylong' must be + an instance of *note PyLongObject: 436a. + + Raise *note OverflowError: 4a4. if the value of `pylong' is out of + range for a ‘size_t’. + + Returns ‘(size_t)-1’ on error. Use *note PyErr_Occurred(): 12f8. + to disambiguate. + + -- C Function: unsigned long long PyLong_AsUnsignedLongLong (PyObject + *pylong) + ` Part of the *note Stable ABI: 4b8.' + + Return a C unsigned long long representation of `pylong'. `pylong' + must be an instance of *note PyLongObject: 436a. + + Raise *note OverflowError: 4a4. if the value of `pylong' is out of + range for an unsigned long long. + + Returns ‘(unsigned long long)-1’ on error. Use *note + PyErr_Occurred(): 12f8. to disambiguate. + + Changed in version 3.1: A negative `pylong' now raises *note + OverflowError: 4a4, not *note TypeError: 19c. + + -- C Function: unsigned long PyLong_AsUnsignedLongMask (PyObject *obj) + ` Part of the *note Stable ABI: 4b8.' Return a C unsigned long + representation of `obj'. If `obj' is not an instance of *note + PyLongObject: 436a, first call its ‘__index__()’ method (if + present) to convert it to a *note PyLongObject: 436a. + + If the value of `obj' is out of range for an unsigned long, return + the reduction of that value modulo ‘ULONG_MAX + 1’. + + Returns ‘(unsigned long)-1’ on error. Use *note PyErr_Occurred(): + 12f8. to disambiguate. + + Changed in version 3.8: Use ‘__index__()’ if available. + + Changed in version 3.10: This function will no longer use + ‘__int__()’. + + -- C Function: unsigned long long PyLong_AsUnsignedLongLongMask + (PyObject *obj) + ` Part of the *note Stable ABI: 4b8.' Return a C unsigned long + long representation of `obj'. If `obj' is not an instance of *note + PyLongObject: 436a, first call its ‘__index__()’ method (if + present) to convert it to a *note PyLongObject: 436a. + + If the value of `obj' is out of range for an unsigned long long, + return the reduction of that value modulo ‘ULLONG_MAX + 1’. + + Returns ‘(unsigned long long)-1’ on error. Use *note + PyErr_Occurred(): 12f8. to disambiguate. + + Changed in version 3.8: Use ‘__index__()’ if available. + + Changed in version 3.10: This function will no longer use + ‘__int__()’. + + -- C Function: double PyLong_AsDouble (PyObject *pylong) + ` Part of the *note Stable ABI: 4b8.' Return a C double + representation of `pylong'. `pylong' must be an instance of *note + PyLongObject: 436a. + + Raise *note OverflowError: 4a4. if the value of `pylong' is out of + range for a double. + + Returns ‘-1.0’ on error. Use *note PyErr_Occurred(): 12f8. to + disambiguate. + + -- C Function: void *PyLong_AsVoidPtr (PyObject *pylong) + ` Part of the *note Stable ABI: 4b8.' Convert a Python integer + `pylong' to a C void pointer. If `pylong' cannot be converted, an + *note OverflowError: 4a4. will be raised. This is only assured to + produce a usable void pointer for values created with *note + PyLong_FromVoidPtr(): 4374. + + Returns ‘NULL’ on error. Use *note PyErr_Occurred(): 12f8. to + disambiguate. + + +File: python.info, Node: Boolean Objects, Next: Floating Point Objects, Prev: Integer Objects, Up: Numeric Objects + +7.8.2.2 Boolean Objects +....................... + +Booleans in Python are implemented as a subclass of integers. There are +only two booleans, ‘Py_False’ and ‘Py_True’. As such, the normal +creation and deletion functions don’t apply to booleans. The following +macros are available, however. + + -- C Function: int PyBool_Check (PyObject *o) + + Return true if `o' is of type ‘PyBool_Type’. This function always + succeeds. + + -- C Variable: *note PyObject: 4cf. *Py_False + + The Python ‘False’ object. This object has no methods. It needs + to be treated just like any other object with respect to reference + counts. + + -- C Variable: *note PyObject: 4cf. *Py_True + + The Python ‘True’ object. This object has no methods. It needs to + be treated just like any other object with respect to reference + counts. + + -- C Macro: Py_RETURN_FALSE + + Return ‘Py_False’ from a function, properly incrementing its + reference count. + + -- C Macro: Py_RETURN_TRUE + + Return ‘Py_True’ from a function, properly incrementing its + reference count. + + -- C Function: *note PyObject: 4cf. *PyBool_FromLong (long v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new reference to ‘Py_True’ or ‘Py_False’ depending + on the truth value of `v'. + + +File: python.info, Node: Floating Point Objects, Next: Pack functions, Prev: Boolean Objects, Up: Numeric Objects + +7.8.2.3 Floating Point Objects +.............................. + + -- C Type: type PyFloatObject + + This subtype of *note PyObject: 4cf. represents a Python floating + point object. + + -- C Variable: *note PyTypeObject: 701. PyFloat_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python floating point type. This + is the same object as *note float: 3ca. in the Python layer. + + -- C Function: int PyFloat_Check (PyObject *p) + + Return true if its argument is a *note PyFloatObject: 4571. or a + subtype of *note PyFloatObject: 4571. This function always + succeeds. + + -- C Function: int PyFloat_CheckExact (PyObject *p) + + Return true if its argument is a *note PyFloatObject: 4571, but not + a subtype of *note PyFloatObject: 4571. This function always + succeeds. + + -- C Function: *note PyObject: 4cf. *PyFloat_FromString (PyObject *str) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a *note PyFloatObject: 4571. object based on the + string value in `str', or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyFloat_FromDouble (double v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a *note PyFloatObject: 4571. object from `v', or + ‘NULL’ on failure. + + -- C Function: double PyFloat_AsDouble (PyObject *pyfloat) + ` Part of the *note Stable ABI: 4b8.' Return a C double + representation of the contents of `pyfloat'. If `pyfloat' is not a + Python floating point object but has a ‘__float__()’ method, this + method will first be called to convert `pyfloat' into a float. If + ‘__float__()’ is not defined then it falls back to ‘__index__()’. + This method returns ‘-1.0’ upon failure, so one should call *note + PyErr_Occurred(): 12f8. to check for errors. + + Changed in version 3.8: Use ‘__index__()’ if available. + + -- C Function: double PyFloat_AS_DOUBLE (PyObject *pyfloat) + + Return a C double representation of the contents of `pyfloat', but + without error checking. + + -- C Function: *note PyObject: 4cf. *PyFloat_GetInfo (void) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘float.h’. + + -- C Function: double PyFloat_GetMax () + ` Part of the *note Stable ABI: 4b8.' Return the maximum + representable finite float `DBL_MAX' as C double. + + -- C Function: double PyFloat_GetMin () + ` Part of the *note Stable ABI: 4b8.' Return the minimum + normalized positive float `DBL_MIN' as C double. + +* Menu: + +* Pack and Unpack functions:: + + +File: python.info, Node: Pack and Unpack functions, Up: Floating Point Objects + +7.8.2.4 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. + +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). + +New in version 3.11. + + +File: python.info, Node: Pack functions, Next: Unpack functions, Prev: Floating Point Objects, Up: Numeric Objects + +7.8.2.5 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 ‘p+1’, ‘p+3’, or ‘p+6’ ‘p+7’), zero if you +want big-endian format (exponent first, at `p'). The ‘PY_BIG_ENDIAN’ +constant can be used to use the native endian: it is equal to ‘1’ on big +endian processor, or ‘0’ on little endian processor. + +Return value: ‘0’ if all is OK, ‘-1’ if error (and an exception is set, +most likely *note OverflowError: 4a4.). + +There are two problems on non-IEEE platforms: + + * What this does is undefined if `x' is a NaN or infinity. + + * ‘-0.0’ and ‘+0.0’ produce the same bytes string. + + -- C Function: int PyFloat_Pack2 (double x, unsigned char *p, int le) + + Pack a C double as the IEEE 754 binary16 half-precision format. + + -- C Function: int PyFloat_Pack4 (double x, unsigned char *p, int le) + + Pack a C double as the IEEE 754 binary32 single precision format. + + -- C Function: int PyFloat_Pack8 (double x, unsigned char *p, int le) + + Pack a C double as the IEEE 754 binary64 double precision format. + + +File: python.info, Node: Unpack functions, Next: Complex Number Objects, Prev: Pack functions, Up: Numeric Objects + +7.8.2.6 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 ‘p+1’, ‘p+3’ or ‘p+6’ and ‘p+7’), zero if big-endian +(exponent first, at `p'). The ‘PY_BIG_ENDIAN’ constant can be used to +use the native endian: it is equal to ‘1’ on big endian processor, or +‘0’ on little endian processor. + +Return value: The unpacked double. On error, this is ‘-1.0’ and *note +PyErr_Occurred(): 12f8. is true (and an exception is set, most likely +*note OverflowError: 4a4.). + +Note that on a non-IEEE platform this will refuse to unpack a bytes +string that represents a NaN or infinity. + + -- C Function: double PyFloat_Unpack2 (const unsigned char *p, int le) + + Unpack the IEEE 754 binary16 half-precision format as a C double. + + -- C Function: double PyFloat_Unpack4 (const unsigned char *p, int le) + + Unpack the IEEE 754 binary32 single precision format as a C double. + + -- C Function: double PyFloat_Unpack8 (const unsigned char *p, int le) + + Unpack the IEEE 754 binary64 double precision format as a C double. + + +File: python.info, Node: Complex Number Objects, Prev: Unpack functions, Up: Numeric Objects + +7.8.2.7 Complex Number Objects +.............................. + +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:: + + +File: python.info, Node: Complex Numbers as C Structures, Next: Complex Numbers as Python Objects, Up: Complex Number Objects + +7.8.2.8 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. + + -- 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. It is defined as: + + typedef struct { + double real; + double imag; + } Py_complex; + + -- C Function: *note Py_complex: 44cc. _Py_c_sum (Py_complex left, + Py_complex right) + + Return the sum of two complex numbers, using the C *note + Py_complex: 44cc. representation. + + -- C Function: *note Py_complex: 44cc. _Py_c_diff (Py_complex left, + Py_complex right) + + Return the difference between two complex numbers, using the C + *note Py_complex: 44cc. representation. + + -- C Function: *note Py_complex: 44cc. _Py_c_neg (Py_complex num) + + Return the negation of the complex number `num', using the C *note + Py_complex: 44cc. representation. + + -- C Function: *note Py_complex: 44cc. _Py_c_prod (Py_complex left, + Py_complex right) + + Return the product of two complex numbers, using the C *note + Py_complex: 44cc. representation. + + -- C Function: *note Py_complex: 44cc. _Py_c_quot (Py_complex dividend, + Py_complex divisor) + + Return the quotient of two complex numbers, using the C *note + Py_complex: 44cc. representation. + + If `divisor' is null, this method returns zero and sets ‘errno’ to + ‘EDOM’. + + -- C Function: *note Py_complex: 44cc. _Py_c_pow (Py_complex num, + Py_complex exp) + + Return the exponentiation of `num' by `exp', using the C *note + Py_complex: 44cc. representation. + + If `num' is null and `exp' is not a positive real number, this + method returns zero and sets ‘errno’ to ‘EDOM’. + + +File: python.info, Node: Complex Numbers as Python Objects, Prev: Complex Numbers as C Structures, Up: Complex Number Objects + +7.8.2.9 Complex Numbers as Python Objects +......................................... + + -- C Type: type PyComplexObject + + This subtype of *note PyObject: 4cf. represents a Python complex + number object. + + -- C Variable: *note PyTypeObject: 701. PyComplex_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python complex number type. It + is the same object as *note complex: 1b8. in the Python layer. + + -- C Function: int PyComplex_Check (PyObject *p) + + Return true if its argument is a *note PyComplexObject: 4583. or a + subtype of *note PyComplexObject: 4583. This function always + succeeds. + + -- C Function: int PyComplex_CheckExact (PyObject *p) + + Return true if its argument is a *note PyComplexObject: 4583, but + not a subtype of *note PyComplexObject: 4583. This function always + succeeds. + + -- C Function: *note PyObject: 4cf. *PyComplex_FromCComplex (Py_complex + v) + `Return value: New reference.' Create a new Python complex number + object from a C *note Py_complex: 44cc. value. + + -- C Function: *note PyObject: 4cf. *PyComplex_FromDoubles (double + real, double imag) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note PyComplexObject: 4583. object from `real' + and `imag'. + + -- C Function: double PyComplex_RealAsDouble (PyObject *op) + ` Part of the *note Stable ABI: 4b8.' Return the real part of `op' + as a C double. + + -- C Function: double PyComplex_ImagAsDouble (PyObject *op) + ` Part of the *note Stable ABI: 4b8.' Return the imaginary part of + `op' as a C double. + + -- C Function: *note Py_complex: 44cc. PyComplex_AsCComplex (PyObject + *op) + + Return the *note Py_complex: 44cc. value of the complex number + `op'. + + If `op' is not a Python complex number object but has a + ‘__complex__()’ method, this method will first be called to convert + `op' to a Python complex number object. If ‘__complex__()’ is not + defined then it falls back to ‘__float__()’. If ‘__float__()’ is + not defined then it falls back to ‘__index__()’. Upon failure, + this method returns ‘-1.0’ as a real value. + + Changed in version 3.8: Use ‘__index__()’ if available. + + +File: python.info, Node: Sequence Objects, Next: Container Objects, Prev: Numeric Objects, Up: Concrete Objects Layer + +7.8.3 Sequence Objects +---------------------- + +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. + +* Menu: + +* Bytes Objects: Bytes Objects<2>. +* Byte Array Objects:: +* Unicode Objects and Codecs:: +* Tuple Objects:: +* Struct Sequence Objects:: +* List Objects:: + + +File: python.info, Node: Bytes Objects<2>, Next: Byte Array Objects, Up: Sequence Objects + +7.8.3.1 Bytes Objects +..................... + +These functions raise *note TypeError: 19c. when expecting a bytes +parameter and called with a non-bytes parameter. + + -- C Type: type PyBytesObject + + This subtype of *note PyObject: 4cf. represents a Python bytes + object. + + -- C Variable: *note PyTypeObject: 701. PyBytes_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python bytes type; it is the same + object as *note bytes: 1b4. in the Python layer. + + -- 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. + + -- 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. + + -- C Function: *note PyObject: 4cf. *PyBytes_FromString (const char *v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new bytes object with a copy of the string `v' as + value on success, and ‘NULL’ on failure. The parameter `v' must + not be ‘NULL’; it will not be checked. + + -- C Function: *note PyObject: 4cf. *PyBytes_FromStringAndSize (const + char *v, Py_ssize_t len) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new bytes object with a copy of the string `v' as + value and length `len' on success, and ‘NULL’ on failure. If `v' + is ‘NULL’, the contents of the bytes object are uninitialized. + + -- C Function: *note PyObject: 4cf. *PyBytes_FromFormat (const char + *format, ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Take a C ‘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: + + Format Characters Type Comment + + --------------------------------------------------------------------------------- + + ‘%%’ `n/a' The literal % character. + + + ‘%c’ int A single byte, represented as a C + int. + + + ‘%d’ int Equivalent to ‘printf("%d")’. (1) + + + ‘%u’ unsigned int Equivalent to ‘printf("%u")’. (2) + + + ‘%ld’ long Equivalent to ‘printf("%ld")’. + (3) + + + ‘%lu’ unsigned long Equivalent to ‘printf("%lu")’. + (4) + + + ‘%zd’ *note Py_ssize_t: 6b1.Equivalent to ‘printf("%zd")’. + (5) + + + ‘%zu’ size_t Equivalent to ‘printf("%zu")’. + (6) + + + ‘%i’ int Equivalent to ‘printf("%i")’. (7) + + + ‘%x’ int Equivalent to ‘printf("%x")’. (8) + + + ‘%s’ const char* A null-terminated C character + array. + + + ‘%p’ const void* The hex representation of a C + pointer. Mostly equivalent to + ‘printf("%p")’ except that it is + guaranteed to start with the + literal ‘0x’ regardless of what + the platform’s ‘printf’ yields. + + + 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. + + -- C Function: *note PyObject: 4cf. *PyBytes_FromFormatV (const char + *format, va_list vargs) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Identical to *note PyBytes_FromFormat(): 145b. except that + it takes exactly two arguments. + + -- C Function: *note PyObject: 4cf. *PyBytes_FromObject (PyObject *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the bytes representation of object `o' that + implements the buffer protocol. + + -- C Function: *note Py_ssize_t: 6b1. PyBytes_Size (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Return the length of the + bytes in bytes object `o'. + + -- C Function: *note Py_ssize_t: 6b1. PyBytes_GET_SIZE (PyObject *o) + + Similar to *note PyBytes_Size(): 42f1, but without error checking. + + -- C Function: char *PyBytes_AsString (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Return a pointer to the + contents of `o'. The pointer refers to the internal buffer of `o', + which consists of ‘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 ‘PyBytes_FromStringAndSize(NULL, size)’. It + must not be deallocated. If `o' is not a bytes object at all, + *note PyBytes_AsString(): 4ae. returns ‘NULL’ and raises *note + TypeError: 19c. + + -- C Function: char *PyBytes_AS_STRING (PyObject *string) + + Similar to *note PyBytes_AsString(): 4ae, but without error + checking. + + -- C Function: int PyBytes_AsStringAndSize (PyObject *obj, char + **buffer, Py_ssize_t *length) + ` Part of the *note Stable ABI: 4b8.' Return the null-terminated + contents of the object `obj' through the output variables `buffer' + and `length'. + + If `length' is ‘NULL’, the bytes object may not contain embedded + null bytes; if it does, the function returns ‘-1’ and a *note + ValueError: 1c8. 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 ‘PyBytes_FromStringAndSize(NULL, size)’. It must not + be deallocated. If `obj' is not a bytes object at all, *note + PyBytes_AsStringAndSize(): 42eb. returns ‘-1’ and raises *note + TypeError: 19c. + + Changed in version 3.5: Previously, *note TypeError: 19c. was + raised when embedded null bytes were encountered in the bytes + object. + + -- C Function: void PyBytes_Concat (PyObject **bytes, PyObject + *newpart) + ` Part of the *note Stable ABI: 4b8.' 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 ‘NULL’; the appropriate + exception will be set. + + -- C Function: void PyBytes_ConcatAndDel (PyObject **bytes, PyObject + *newpart) + ` Part of the *note Stable ABI: 4b8.' Create a new bytes object in + `*bytes' containing the contents of `newpart' appended to `bytes'. + This version decrements the reference count of `newpart'. + + -- C Function: int _PyBytes_Resize (PyObject **bytes, Py_ssize_t + newsize) + + A way to resize a bytes object even though it is “immutable”. Only + use this to build up a brand new bytes object; don’t use this if + the bytes may already be known in other parts of the code. It is + an error to call this function if the refcount on the input bytes + object is not one. 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 ‘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 ‘NULL’, *note MemoryError: 127a. is + set, and ‘-1’ is returned. + + ---------- Footnotes ---------- + + (1) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + (2) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + (3) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + (4) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + (5) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + (6) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + (7) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + (8) For integer specifiers (d, u, ld, lu, zd, zu, i, x): the +0-conversion flag has effect even when a precision is given. + + +File: python.info, Node: Byte Array Objects, Next: Unicode Objects and Codecs, Prev: Bytes Objects<2>, Up: Sequence Objects + +7.8.3.2 Byte Array Objects +.......................... + + -- C Type: type PyByteArrayObject + + This subtype of *note PyObject: 4cf. represents a Python bytearray + object. + + -- C Variable: *note PyTypeObject: 701. PyByteArray_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python bytearray type; it is the + same object as *note bytearray: 1a5. in the Python layer. + +* Menu: + +* Type check macros:: +* Direct API functions:: +* Macros:: + + +File: python.info, Node: Type check macros, Next: Direct API functions, Up: Byte Array Objects + +7.8.3.3 Type check macros +......................... + + -- 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. + + -- 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. + + +File: python.info, Node: Direct API functions, Next: Macros, Prev: Type check macros, Up: Byte Array Objects + +7.8.3.4 Direct API functions +............................ + + -- C Function: *note PyObject: 4cf. *PyByteArray_FromObject (PyObject + *o) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new bytearray object from any object, `o', that + implements the *note buffer protocol: 1ba6. + + -- C Function: *note PyObject: 4cf. *PyByteArray_FromStringAndSize + (const char *string, Py_ssize_t len) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a new bytearray object from `string' and its length, + `len'. On failure, ‘NULL’ is returned. + + -- C Function: *note PyObject: 4cf. *PyByteArray_Concat (PyObject *a, + PyObject *b) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Concat bytearrays `a' and `b' and return a new bytearray + with the result. + + -- C Function: *note Py_ssize_t: 6b1. PyByteArray_Size (PyObject + *bytearray) + ` Part of the *note Stable ABI: 4b8.' Return the size of + `bytearray' after checking for a ‘NULL’ pointer. + + -- C Function: char *PyByteArray_AsString (PyObject *bytearray) + ` Part of the *note Stable ABI: 4b8.' Return the contents of + `bytearray' as a char array after checking for a ‘NULL’ pointer. + The returned array always has an extra null byte appended. + + -- C Function: int PyByteArray_Resize (PyObject *bytearray, Py_ssize_t + len) + ` Part of the *note Stable ABI: 4b8.' Resize the internal buffer + of `bytearray' to `len'. + + +File: python.info, Node: Macros, Prev: Direct API functions, Up: Byte Array Objects + +7.8.3.5 Macros +.............. + +These macros trade safety for speed and they don’t check pointers. + + -- C Function: char *PyByteArray_AS_STRING (PyObject *bytearray) + + Similar to *note PyByteArray_AsString(): 42e6, but without error + checking. + + -- C Function: *note Py_ssize_t: 6b1. PyByteArray_GET_SIZE (PyObject + *bytearray) + + Similar to *note PyByteArray_Size(): 42e9, but without error + checking. + + +File: python.info, Node: Unicode Objects and Codecs, Next: Tuple Objects, Prev: Byte Array Objects, Up: Sequence Objects + +7.8.3.6 Unicode Objects and Codecs +.................................. + +* Menu: + +* Unicode Objects:: +* Built-in Codecs:: +* Methods and Slot Functions:: + + +File: python.info, Node: Unicode Objects, Next: Built-in Codecs, Up: Unicode Objects and Codecs + +7.8.3.7 Unicode Objects +....................... + +Since the implementation of PEP 393(1) 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). + +*note Py_UNICODE: 388.* and UTF-8 representations are created on demand +and cached in the Unicode object. The *note Py_UNICODE: 388.* +representation is deprecated and inefficient. + +Due to the transition between the old APIs and the new APIs, Unicode +objects can internally be in two states depending on how they were +created: + + * “canonical” Unicode objects are all objects created by a + non-deprecated Unicode API. They use the most efficient + representation allowed by the implementation. + + * “legacy” Unicode objects have been created through one of the + deprecated APIs (typically *note PyUnicode_FromUnicode(): 379.) and + only bear the *note Py_UNICODE: 388.* representation; you will have + to call *note PyUnicode_READY(): 37d. on them before calling any + other API. + + Note: The “legacy” Unicode object will be removed in Python 3.12 + with deprecated APIs. All Unicode objects will be “canonical” + since then. See PEP 623(2) for more information. + +* Menu: + +* Unicode Type:: +* Unicode Character Properties:: +* Creating and accessing Unicode strings:: +* Deprecated Py_UNICODE APIs:: +* Locale Encoding:: +* File System Encoding:: +* wchar_t Support:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + (2) https://peps.python.org/pep-0623/ + + +File: python.info, Node: Unicode Type, Next: Unicode Character Properties, Up: Unicode Objects + +7.8.3.8 Unicode Type +.................... + +These are the basic Unicode object types used for the Unicode +implementation in Python: + + -- C Type: type Py_UCS4 + -- C Type: type Py_UCS2 + -- C Type: type Py_UCS1 + ` Part of the *note Stable ABI: 4b8.' 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 *note Py_UCS4: e29. + + New in version 3.3. + + -- C Type: type Py_UNICODE + + This is a typedef of wchar_t, which is a 16-bit type or 32-bit type + depending on the platform. + + 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. + + -- C Type: type PyASCIIObject + -- C Type: type PyCompactUnicodeObject + -- C Type: type PyUnicodeObject + + These subtypes of *note PyObject: 4cf. 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 *note PyObject: 4cf. pointers. + + New in version 3.3. + + -- C Variable: *note PyTypeObject: 701. PyUnicode_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python Unicode type. It is + exposed to Python code as ‘str’. + +The following APIs are C macros and static inlined functions for fast +checks and access to internal read-only data of Unicode objects: + + -- C Function: int PyUnicode_Check (PyObject *o) + + Return true if the object `o' is a Unicode object or an instance of + a Unicode subtype. This function always succeeds. + + -- C Function: int PyUnicode_CheckExact (PyObject *o) + + Return true if the object `o' is a Unicode object, but not an + instance of a subtype. This function always succeeds. + + -- C Function: int PyUnicode_READY (PyObject *o) + + Ensure the string object `o' is in the “canonical” representation. + This is required before using any of the access macros described + below. + + Returns ‘0’ on success and ‘-1’ with an exception set on failure, + which in particular happens if memory allocation fails. + + New in version 3.3. + + Deprecated since version 3.10, will be removed in version 3.12: + This API will be removed with *note PyUnicode_FromUnicode(): 379. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_GET_LENGTH (PyObject + *o) + + Return the length of the Unicode string, in code points. `o' has + to be a Unicode object in the “canonical” representation (not + checked). + + New in version 3.3. + + -- C Function: *note Py_UCS1: e27. *PyUnicode_1BYTE_DATA (PyObject *o) + -- C Function: *note Py_UCS2: e28. *PyUnicode_2BYTE_DATA (PyObject *o) + -- C Function: *note Py_UCS4: e29. *PyUnicode_4BYTE_DATA (PyObject *o) + + 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 *note PyUnicode_KIND(): e32. to select the right macro. + Make sure *note PyUnicode_READY(): 37d. has been called before + accessing this. + + New in version 3.3. + + -- C Macro: PyUnicode_WCHAR_KIND + -- C Macro: PyUnicode_1BYTE_KIND + -- C Macro: PyUnicode_2BYTE_KIND + -- C Macro: PyUnicode_4BYTE_KIND + + Return values of the *note PyUnicode_KIND(): e32. macro. + + New in version 3.3. + + Deprecated since version 3.10, will be removed in version 3.12: + ‘PyUnicode_WCHAR_KIND’ is deprecated. + + -- C Function: int PyUnicode_KIND (PyObject *o) + + Return one of the PyUnicode kind constants (see above) that + indicate how many bytes per character this Unicode object uses to + store its data. `o' has to be a Unicode object in the “canonical” + representation (not checked). + + New in version 3.3. + + -- C Function: void *PyUnicode_DATA (PyObject *o) + + Return a void pointer to the raw Unicode buffer. `o' has to be a + Unicode object in the “canonical” representation (not checked). + + New in version 3.3. + + -- C Function: void PyUnicode_WRITE (int kind, void *data, Py_ssize_t + index, Py_UCS4 value) + + Write into a canonical representation `data' (as obtained with + *note PyUnicode_DATA(): e2e.). This function performs no sanity + checks, and is intended for usage in loops. The caller should + cache the `kind' value and `data' pointer as obtained from other + calls. `index' is the index in the string (starts at 0) and + `value' is the new code point value which should be written to that + location. + + New in version 3.3. + + -- C Function: *note Py_UCS4: e29. PyUnicode_READ (int kind, void + *data, Py_ssize_t index) + + Read a code point from a canonical representation `data' (as + obtained with *note PyUnicode_DATA(): e2e.). No checks or ready + calls are performed. + + New in version 3.3. + + -- C Function: *note Py_UCS4: e29. PyUnicode_READ_CHAR (PyObject *o, + Py_ssize_t index) + + Read a character from a Unicode object `o', which must be in the + “canonical” representation. This is less efficient than *note + PyUnicode_READ(): e36. if you do multiple consecutive reads. + + New in version 3.3. + + -- C Function: *note Py_UCS4: e29. PyUnicode_MAX_CHAR_VALUE (PyObject + *o) + + Return the maximum code point that is suitable for creating another + string based on `o', which must be in the “canonical” + representation. This is always an approximation but more efficient + than iterating over the string. + + New in version 3.3. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_GET_SIZE (PyObject *o) + + Return the size of the deprecated *note Py_UNICODE: 388. + representation, in code units (this includes surrogate pairs as 2 + units). `o' has to be a Unicode object (not checked). + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style Unicode API, please migrate to using *note + PyUnicode_GET_LENGTH(): 4f0. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_GET_DATA_SIZE (PyObject + *o) + + Return the size of the deprecated *note Py_UNICODE: 388. + representation in bytes. `o' has to be a Unicode object (not + checked). + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style Unicode API, please migrate to using *note + PyUnicode_GET_LENGTH(): 4f0. + + -- C Function: *note Py_UNICODE: 388. *PyUnicode_AS_UNICODE (PyObject + *o) + -- C Function: const char *PyUnicode_AS_DATA (PyObject *o) + + Return a pointer to a *note Py_UNICODE: 388. representation of the + object. The returned buffer is always terminated with an extra + null code point. It may also contain embedded null code points, + which would cause the string to be truncated when used in most C + functions. The ‘AS_DATA’ form casts the pointer to const char*. + The `o' argument has to be a Unicode object (not checked). + + Changed in version 3.3: This function is now inefficient – because + in many cases the *note Py_UNICODE: 388. representation does not + exist and needs to be created – and can fail (return ‘NULL’ with an + exception set). Try to port the code to use the new + ‘PyUnicode_nBYTE_DATA()’ macros or use *note PyUnicode_WRITE(): + e38. or *note PyUnicode_READ(): e36. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style Unicode API, please migrate to using the + ‘PyUnicode_nBYTE_DATA()’ family of macros. + + -- C Function: int PyUnicode_IsIdentifier (PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if the string is + a valid identifier according to the language definition, section + *note Identifiers and keywords: 1877. Return ‘0’ otherwise. + + Changed in version 3.9: The function does not call *note + Py_FatalError(): 5d9. anymore if the string is not ready. + + +File: python.info, Node: Unicode Character Properties, Next: Creating and accessing Unicode strings, Prev: Unicode Type, Up: Unicode Objects + +7.8.3.9 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. + + -- C Function: int Py_UNICODE_ISSPACE (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a whitespace + character. + + -- C Function: int Py_UNICODE_ISLOWER (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a lowercase + character. + + -- C Function: int Py_UNICODE_ISUPPER (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is an uppercase + character. + + -- C Function: int Py_UNICODE_ISTITLE (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a titlecase + character. + + -- C Function: int Py_UNICODE_ISLINEBREAK (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a linebreak + character. + + -- C Function: int Py_UNICODE_ISDECIMAL (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a decimal character. + + -- C Function: int Py_UNICODE_ISDIGIT (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a digit character. + + -- C Function: int Py_UNICODE_ISNUMERIC (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a numeric character. + + -- C Function: int Py_UNICODE_ISALPHA (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is an alphabetic + character. + + -- C Function: int Py_UNICODE_ISALNUM (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is an alphanumeric + character. + + -- C Function: int Py_UNICODE_ISPRINTABLE (Py_UCS4 ch) + + Return ‘1’ or ‘0’ depending on whether `ch' is a printable + character. Nonprintable characters are those characters defined in + the Unicode character database as “Other” or “Separator”, excepting + the ASCII space (0x20) which is considered printable. (Note that + printable characters in this context are those which should not be + escaped when *note repr(): 3ee. is invoked on a string. It has no + bearing on the handling of strings written to *note sys.stdout: + 72a. or *note sys.stderr: 581.) + +These APIs can be used for fast direct character conversions: + + -- C Function: *note Py_UCS4: e29. Py_UNICODE_TOLOWER (Py_UCS4 ch) + + Return the character `ch' converted to lower case. + + Deprecated since version 3.3: This function uses simple case + mappings. + + -- C Function: *note Py_UCS4: e29. Py_UNICODE_TOUPPER (Py_UCS4 ch) + + Return the character `ch' converted to upper case. + + Deprecated since version 3.3: This function uses simple case + mappings. + + -- C Function: *note Py_UCS4: e29. Py_UNICODE_TOTITLE (Py_UCS4 ch) + + Return the character `ch' converted to title case. + + Deprecated since version 3.3: This function uses simple case + mappings. + + -- C Function: int Py_UNICODE_TODECIMAL (Py_UCS4 ch) + + Return the character `ch' converted to a decimal positive integer. + Return ‘-1’ if this is not possible. This macro does not raise + exceptions. + + -- C Function: int Py_UNICODE_TODIGIT (Py_UCS4 ch) + + Return the character `ch' converted to a single digit integer. + Return ‘-1’ if this is not possible. This macro does not raise + exceptions. + + -- C Function: double Py_UNICODE_TONUMERIC (Py_UCS4 ch) + + Return the character `ch' converted to a double. Return ‘-1.0’ if + this is not possible. This macro does not raise exceptions. + +These APIs can be used to work with surrogates: + + -- C Macro: Py_UNICODE_IS_SURROGATE (ch) + + Check if `ch' is a surrogate (‘0xD800 <= ch <= 0xDFFF’). + + -- C Macro: Py_UNICODE_IS_HIGH_SURROGATE (ch) + + Check if `ch' is a high surrogate (‘0xD800 <= ch <= 0xDBFF’). + + -- C Macro: Py_UNICODE_IS_LOW_SURROGATE (ch) + + Check if `ch' is a low surrogate (‘0xDC00 <= ch <= 0xDFFF’). + + -- C Macro: Py_UNICODE_JOIN_SURROGATES (high, low) + + Join two surrogate characters and return a single Py_UCS4 value. + `high' and `low' are respectively the leading and trailing + surrogates in a surrogate pair. + + +File: python.info, Node: Creating and accessing Unicode strings, Next: Deprecated Py_UNICODE APIs, Prev: Unicode Character Properties, Up: Unicode Objects + +7.8.3.10 Creating and accessing Unicode strings +............................................... + +To create Unicode objects and access their basic sequence properties, +use these APIs: + + -- C Function: *note PyObject: 4cf. *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. + + This is the recommended way to allocate a new Unicode object. + Objects created using this function are not resizable. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *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 *note PyUnicode_1BYTE_KIND: + e33. etc., as returned by *note PyUnicode_KIND(): e32.). 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 (*note PyUnicode_4BYTE_KIND: e35.) and it consists only of + codepoints in the UCS1 range, it will be transformed into UCS1 + (*note PyUnicode_1BYTE_KIND: e33.). + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromStringAndSize (const + char *u, Py_ssize_t size) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object from the char buffer `u'. The bytes + will be interpreted as being UTF-8 encoded. The buffer is copied + into the new object. If the buffer is not ‘NULL’, the return value + might be a shared object, i.e. modification of the data is not + allowed. + + If `u' is ‘NULL’, this function behaves like *note + PyUnicode_FromUnicode(): 379. with the buffer set to ‘NULL’. This + usage is deprecated in favor of *note PyUnicode_New(): 4e0, and + will be removed in Python 3.12. + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromString (const char + *u) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object from a UTF-8 encoded null-terminated + char buffer `u'. + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromFormat (const char + *format, ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Take a C ‘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. The following format characters are allowed: + + Format Characters Type Comment + + ----------------------------------------------------------------------------------------- + + ‘%%’ `n/a' The literal % character. + + + ‘%c’ int A single character, represented as a + C int. + + + ‘%d’ int Equivalent to ‘printf("%d")’. (1) + + + ‘%u’ unsigned int Equivalent to ‘printf("%u")’. (2) + + + ‘%ld’ long Equivalent to ‘printf("%ld")’. (3) + + + ‘%li’ long Equivalent to ‘printf("%li")’. (4) + + + ‘%lu’ unsigned long Equivalent to ‘printf("%lu")’. (5) + + + ‘%lld’ long long Equivalent to ‘printf("%lld")’. (6) + + + ‘%lli’ long long Equivalent to ‘printf("%lli")’. (7) + + + ‘%llu’ unsigned long long Equivalent to ‘printf("%llu")’. (8) + + + ‘%zd’ *note Py_ssize_t: 6b1. Equivalent to ‘printf("%zd")’. (9) + + + ‘%zi’ *note Py_ssize_t: 6b1. Equivalent to ‘printf("%zi")’. (10) + + + ‘%zu’ size_t Equivalent to ‘printf("%zu")’. (11) + + + ‘%i’ int Equivalent to ‘printf("%i")’. (12) + + + ‘%x’ int Equivalent to ‘printf("%x")’. (13) + + + ‘%s’ const char* A null-terminated C character array. + + + ‘%p’ const void* The hex representation of a C + pointer. Mostly equivalent to + ‘printf("%p")’ except that it is + guaranteed to start with the literal + ‘0x’ regardless of what the + platform’s ‘printf’ yields. + + + ‘%A’ PyObject* The result of calling + *note ascii(): 104d. + + + ‘%U’ PyObject* A Unicode object. + + + ‘%V’ PyObject*, const char* A Unicode object (which may be + ‘NULL’) and a null-terminated C + character array as a second + parameter (which will be used, if + the first parameter is ‘NULL’). + + + ‘%S’ PyObject* The result of calling + *note PyObject_Str(): cdc. + + + ‘%R’ PyObject* The result of calling + *note PyObject_Repr(): cdb. + + + An unrecognized format character causes all the rest of the format + string to be copied as-is to the result string, and any extra + arguments discarded. + + Note: The width formatter unit is number of characters rather + than bytes. The precision formatter unit is number of bytes + for ‘"%s"’ and ‘"%V"’ (if the ‘PyObject*’ argument is ‘NULL’), + and a number of characters for ‘"%A"’, ‘"%U"’, ‘"%S"’, ‘"%R"’ + and ‘"%V"’ (if the ‘PyObject*’ argument is not ‘NULL’). + + Changed in version 3.2: Support for ‘"%lld"’ and ‘"%llu"’ added. + + Changed in version 3.3: Support for ‘"%li"’, ‘"%lli"’ and ‘"%zi"’ + added. + + Changed in version 3.4: Support width and precision formatter for + ‘"%s"’, ‘"%A"’, ‘"%U"’, ‘"%V"’, ‘"%S"’, ‘"%R"’ added. + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromFormatV (const char + *format, va_list vargs) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Identical to *note PyUnicode_FromFormat(): 4f2. except that + it takes exactly two arguments. + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromEncodedObject + (PyObject *obj, const char *encoding, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Decode an encoded object `obj' to a Unicode object. + + *note bytes: 1b4, *note bytearray: 1a5. and other *note bytes-like + objects: 9a2. are decoded according to the given `encoding' and + using the error handling defined by `errors'. Both can be ‘NULL’ + to have the interface use the default values (see *note Built-in + Codecs: 45b6. for details). + + All other objects, including Unicode objects, cause a *note + TypeError: 19c. to be set. + + The API returns ‘NULL’ if there was an error. The caller is + responsible for decref’ing the returned objects. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_GetLength (PyObject + *unicode) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Return + the length of the Unicode object, in code points. + + New in version 3.3. + + -- C Function: *note Py_ssize_t: 6b1. 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 ‘memcpy()’ if possible. Returns ‘-1’ and sets an exception + on error, otherwise returns the number of copied characters. + + New in version 3.3. + + -- C Function: *note Py_ssize_t: 6b1. 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 + ‘unicode[start:start+length]’. + + Fail if `fill_char' is bigger than the string maximum character, or + if the string has more than 1 reference. + + Return the number of written character, or return ‘-1’ and raise an + exception on error. + + New in version 3.3. + + -- C Function: int PyUnicode_WriteChar (PyObject *unicode, Py_ssize_t + index, Py_UCS4 character) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Write a + character to a string. The string must have been created through + *note PyUnicode_New(): 4e0. Since Unicode strings are supposed to + be immutable, the string must not be shared, or have been hashed + yet. + + This function checks that `unicode' is a Unicode object, that the + index is not out of bounds, and that the object can be modified + safely (i.e. that it its reference count is one). + + New in version 3.3. + + -- C Function: *note Py_UCS4: e29. PyUnicode_ReadChar (PyObject + *unicode, Py_ssize_t index) + ` Part of the *note Stable ABI: 4b8. 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 + *note PyUnicode_READ_CHAR(): e37, which performs no error checking. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Substring (PyObject + *str, Py_ssize_t start, Py_ssize_t end) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Return a substring of `str', from character + index `start' (included) to character index `end' (excluded). + Negative indices are not supported. + + New in version 3.3. + + -- C Function: *note Py_UCS4: e29. *PyUnicode_AsUCS4 (PyObject *u, + Py_UCS4 *buffer, Py_ssize_t buflen, int copy_null) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Copy the + string `u' into a UCS4 buffer, including a null character, if + `copy_null' is set. Returns ‘NULL’ and sets an exception on error + (in particular, a *note SystemError: 9b5. if `buflen' is smaller + than the length of `u'). `buffer' is returned on success. + + New in version 3.3. + + -- C Function: *note Py_UCS4: e29. *PyUnicode_AsUCS4Copy (PyObject *u) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Copy the + string `u' into a new UCS4 buffer that is allocated using *note + PyMem_Malloc(): 8d7. If this fails, ‘NULL’ is returned with a + *note MemoryError: 127a. set. The returned buffer always has an + extra null code point appended. + + New in version 3.3. + + ---------- Footnotes ---------- + + (1) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (2) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (3) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (4) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (5) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (6) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (7) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (8) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (9) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (10) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (11) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (12) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + (13) For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi, +zu, i, x): the 0-conversion flag has effect even when a precision is +given. + + +File: python.info, Node: Deprecated Py_UNICODE APIs, Next: Locale Encoding, Prev: Creating and accessing Unicode strings, Up: Unicode Objects + +7.8.3.11 Deprecated Py_UNICODE APIs +................................... + +Deprecated since version 3.3, will be removed in version 3.12. + +These API functions are deprecated with the implementation of PEP +393(1). Extension modules can continue using them, as they will not be +removed in Python 3.x, but need to be aware that their use can now cause +performance and memory hits. + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromUnicode (const + Py_UNICODE *u, Py_ssize_t size) + `Return value: New reference.' Create a Unicode object from the + Py_UNICODE buffer `u' of the given size. `u' may be ‘NULL’ which + causes the contents to be undefined. It is the user’s + responsibility to fill in the needed data. The buffer is copied + into the new object. + + If the buffer is not ‘NULL’, the return value might be a shared + object. Therefore, modification of the resulting Unicode object is + only allowed when `u' is ‘NULL’. + + If the buffer is ‘NULL’, *note PyUnicode_READY(): 37d. must be + called once the string content has been filled before using any of + the access macros such as *note PyUnicode_KIND(): e32. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style Unicode API, please migrate to using *note + PyUnicode_FromKindAndData(): e2c, *note PyUnicode_FromWideChar(): + e41, or *note PyUnicode_New(): 4e0. + + -- C Function: *note Py_UNICODE: 388. *PyUnicode_AsUnicode (PyObject + *unicode) + + Return a read-only pointer to the Unicode object’s internal *note + Py_UNICODE: 388. buffer, or ‘NULL’ on error. This will create the + *note Py_UNICODE: 388.* representation of the object if it is not + yet available. The buffer is always terminated with an extra null + code point. Note that the resulting *note Py_UNICODE: 388. string + may also contain embedded null code points, which would cause the + string to be truncated when used in most C functions. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style Unicode API, please migrate to using *note + PyUnicode_AsUCS4(): e2d, *note PyUnicode_AsWideChar(): 1498, *note + PyUnicode_ReadChar(): e25. or similar new APIs. + + -- C Function: *note Py_UNICODE: 388. *PyUnicode_AsUnicodeAndSize + (PyObject *unicode, Py_ssize_t *size) + + Like *note PyUnicode_AsUnicode(): 378, but also saves the *note + Py_UNICODE(): 388. array length (excluding the extra null + terminator) in `size'. Note that the resulting *note Py_UNICODE: + 388.* string may contain embedded null code points, which would + cause the string to be truncated when used in most C functions. + + New in version 3.3. + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style Unicode API, please migrate to using *note + PyUnicode_AsUCS4(): e2d, *note PyUnicode_AsWideChar(): 1498, *note + PyUnicode_ReadChar(): e25. or similar new APIs. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_GetSize (PyObject + *unicode) + ` Part of the *note Stable ABI: 4b8.' Return the size of the + deprecated *note Py_UNICODE: 388. representation, in code units + (this includes surrogate pairs as 2 units). + + Deprecated since version 3.3, will be removed in version 3.12: Part + of the old-style Unicode API, please migrate to using *note + PyUnicode_GET_LENGTH(): 4f0. + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromObject (PyObject + *obj) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 the reference with incremented refcount. + + Objects other than Unicode or its subtypes will cause a *note + TypeError: 19c. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0393/ + + +File: python.info, Node: Locale Encoding, Next: File System Encoding, Prev: Deprecated Py_UNICODE APIs, Up: Unicode Objects + +7.8.3.12 Locale Encoding +........................ + +The current locale encoding can be used to decode text from the +operating system. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeLocaleAndSize + (const char *str, Py_ssize_t len, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + 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 ‘"strict"’ and ‘"surrogateescape"’ + ( PEP 383(1)). The decoder uses ‘"strict"’ error handler if + `errors' is ‘NULL’. `str' must end with a null character but + cannot contain embedded null characters. + + Use *note PyUnicode_DecodeFSDefaultAndSize(): 442c. to decode a + string from ‘Py_FileSystemDefaultEncoding’ (the locale encoding + read at Python startup). + + This function ignores the *note Python UTF-8 Mode: 229. + + See also + ........ + + The *note Py_DecodeLocale(): 82d. function. + + New in version 3.3. + + Changed in version 3.7: The function now also uses the current + locale encoding for the ‘surrogateescape’ error handler, except on + Android. Previously, *note Py_DecodeLocale(): 82d. was used for + the ‘surrogateescape’, and the current locale encoding was used for + ‘strict’. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeLocale (const char + *str, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Similar to *note + PyUnicode_DecodeLocaleAndSize(): 82f, but compute the string length + using ‘strlen()’. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyUnicode_EncodeLocale (PyObject + *unicode, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + 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 ‘"strict"’ and ‘"surrogateescape"’ + ( PEP 383(2)). The encoder uses ‘"strict"’ error handler if + `errors' is ‘NULL’. Return a *note bytes: 1b4. object. `unicode' + cannot contain embedded null characters. + + Use *note PyUnicode_EncodeFSDefault(): 1491. to encode a string to + ‘Py_FileSystemDefaultEncoding’ (the locale encoding read at Python + startup). + + This function ignores the *note Python UTF-8 Mode: 229. + + See also + ........ + + The *note Py_EncodeLocale(): 82e. function. + + New in version 3.3. + + Changed in version 3.7: The function now also uses the current + locale encoding for the ‘surrogateescape’ error handler, except on + Android. Previously, *note Py_EncodeLocale(): 82e. was used for + the ‘surrogateescape’, and the current locale encoding was used for + ‘strict’. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0383/ + + (2) https://peps.python.org/pep-0383/ + + +File: python.info, Node: File System Encoding, Next: wchar_t Support, Prev: Locale Encoding, Up: Unicode Objects + +7.8.3.13 File System Encoding +............................. + +To encode and decode file names and other environment strings, +‘Py_FileSystemDefaultEncoding’ should be used as the encoding, and +‘Py_FileSystemDefaultEncodeErrors’ should be used as the error handler ( +PEP 383(1) and PEP 529(2)). To encode file names to *note bytes: 1b4. +during argument parsing, the ‘"O&"’ converter should be used, passing +*note PyUnicode_FSConverter(): 98b. as the conversion function: + + -- C Function: int PyUnicode_FSConverter (PyObject *obj, void *result) + ` Part of the *note Stable ABI: 4b8.' ParseTuple converter: encode + *note str: 1b3. objects – obtained directly or through the *note + os.PathLike: 8bf. interface – to *note bytes: 1b4. using *note + PyUnicode_EncodeFSDefault(): 1491.; *note bytes: 1b4. objects are + output as-is. `result' must be a *note PyBytesObject: 372.* which + must be released when it is no longer used. + + New in version 3.1. + + Changed in version 3.6: Accepts a *note path-like object: 773. + +To decode file names to *note str: 1b3. during argument parsing, the +‘"O&"’ converter should be used, passing *note PyUnicode_FSDecoder(): +98c. as the conversion function: + + -- C Function: int PyUnicode_FSDecoder (PyObject *obj, void *result) + ` Part of the *note Stable ABI: 4b8.' ParseTuple converter: decode + *note bytes: 1b4. objects – obtained either directly or indirectly + through the *note os.PathLike: 8bf. interface – to *note str: 1b3. + using *note PyUnicode_DecodeFSDefaultAndSize(): 442c.; *note str: + 1b3. objects are output as-is. `result' must be a *note + PyUnicodeObject: 37f.* which must be released when it is no longer + used. + + New in version 3.2. + + Changed in version 3.6: Accepts a *note path-like object: 773. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeFSDefaultAndSize + (const char *s, Py_ssize_t size) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Decode a string from the *note filesystem encoding and error + handler: 1793. + + If ‘Py_FileSystemDefaultEncoding’ is not set, fall back to the + locale encoding. + + ‘Py_FileSystemDefaultEncoding’ is initialized at startup from the + locale encoding and cannot be modified later. If you need to + decode a string from the current locale encoding, use *note + PyUnicode_DecodeLocaleAndSize(): 82f. + + See also + ........ + + The *note Py_DecodeLocale(): 82d. function. + + Changed in version 3.6: Use ‘Py_FileSystemDefaultEncodeErrors’ + error handler. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeFSDefault (const + char *s) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Decode a null-terminated string from the *note filesystem + encoding and error handler: 1793. + + If ‘Py_FileSystemDefaultEncoding’ is not set, fall back to the + locale encoding. + + Use *note PyUnicode_DecodeFSDefaultAndSize(): 442c. if you know the + string length. + + Changed in version 3.6: Use ‘Py_FileSystemDefaultEncodeErrors’ + error handler. + + -- C Function: *note PyObject: 4cf. *PyUnicode_EncodeFSDefault + (PyObject *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Encode a Unicode object to ‘Py_FileSystemDefaultEncoding’ + with the ‘Py_FileSystemDefaultEncodeErrors’ error handler, and + return *note bytes: 1b4. Note that the resulting *note bytes: 1b4. + object may contain null bytes. + + If ‘Py_FileSystemDefaultEncoding’ is not set, fall back to the + locale encoding. + + ‘Py_FileSystemDefaultEncoding’ is initialized at startup from the + locale encoding and cannot be modified later. If you need to + encode a string to the current locale encoding, use *note + PyUnicode_EncodeLocale(): 830. + + See also + ........ + + The *note Py_EncodeLocale(): 82e. function. + + New in version 3.2. + + Changed in version 3.6: Use ‘Py_FileSystemDefaultEncodeErrors’ + error handler. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0383/ + + (2) https://peps.python.org/pep-0529/ + + +File: python.info, Node: wchar_t Support, Prev: File System Encoding, Up: Unicode Objects + +7.8.3.14 wchar_t Support +........................ + +wchar_t support for platforms which support it: + + -- C Function: *note PyObject: 4cf. *PyUnicode_FromWideChar (const + wchar_t *w, Py_ssize_t size) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object from the wchar_t buffer `w' of the + given `size'. Passing ‘-1’ as the `size' indicates that the + function must itself compute the length, using wcslen. Return + ‘NULL’ on failure. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_AsWideChar (PyObject + *unicode, wchar_t *w, Py_ssize_t size) + ` Part of the *note Stable ABI: 4b8.' Copy the Unicode object + contents into the wchar_t buffer `w'. At most `size' wchar_t + characters are copied (excluding a possibly trailing null + termination character). Return the number of wchar_t characters + copied or ‘-1’ in case of an error. 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. + + -- C Function: wchar_t *PyUnicode_AsWideCharString (PyObject *unicode, + Py_ssize_t *size) + ` Part of the *note Stable ABI: 4b8. 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 ‘NULL’, write + the number of wide characters (excluding the trailing null + termination character) into `*size'. Note that the resulting + wchar_t string might contain null characters, which would cause the + string to be truncated when used with most C functions. If `size' + is ‘NULL’ and the wchar_t* string contains null characters a *note + ValueError: 1c8. is raised. + + Returns a buffer allocated by ‘PyMem_Alloc()’ (use *note + PyMem_Free(): 10a8. to free it) on success. On error, returns + ‘NULL’ and `*size' is undefined. Raises a *note MemoryError: 127a. + if memory allocation is failed. + + New in version 3.2. + + Changed in version 3.7: Raises a *note ValueError: 1c8. if `size' + is ‘NULL’ and the wchar_t* string contains null characters. + + +File: python.info, Node: Built-in Codecs, Next: Methods and Slot Functions, Prev: Unicode Objects, Up: Unicode Objects and Codecs + +7.8.3.15 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 *note str(): +1b3. string object constructor. + +Setting encoding to ‘NULL’ causes the default encoding to be used which +is UTF-8. The file system calls should use *note +PyUnicode_FSConverter(): 98b. for encoding file names. This uses the +variable ‘Py_FileSystemDefaultEncoding’ internally. This variable +should be treated as read-only: on some systems, it will be a pointer to +a static string, on others, it will change at run-time (such as when the +application invokes setlocale). + +Error handling is set by errors which may also be set to ‘NULL’ meaning +to use the default handling defined for the codec. Default error +handling for all built-in codecs is “strict” (*note ValueError: 1c8. 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:: +* Methods & Slots:: + + +File: python.info, Node: Generic Codecs, Next: UTF-8 Codecs, Up: Built-in Codecs + +7.8.3.16 Generic Codecs +....................... + +These are the generic codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_Decode (const char *s, + Py_ssize_t size, const char *encoding, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + encoded string `s'. `encoding' and `errors' have the same meaning + as the parameters of the same name in the *note str(): 1b3. + built-in function. The codec to be used is looked up using the + Python codec registry. Return ‘NULL’ if an exception was raised by + the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsEncodedString + (PyObject *unicode, const char *encoding, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 *note encode(): 512. + method. The codec to be used is looked up using the Python codec + registry. Return ‘NULL’ if an exception was raised by the codec. + + +File: python.info, Node: UTF-8 Codecs, Next: UTF-32 Codecs, Prev: Generic Codecs, Up: Built-in Codecs + +7.8.3.17 UTF-8 Codecs +..................... + +These are the UTF-8 codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF8 (const char + *s, Py_ssize_t size, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + UTF-8 encoded string `s'. Return ‘NULL’ if an exception was raised + by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF8Stateful + (const char *s, Py_ssize_t size, const char *errors, + Py_ssize_t *consumed) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' If `consumed' is ‘NULL’, behave like *note + PyUnicode_DecodeUTF8(): 4438. If `consumed' is not ‘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'. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsUTF8String (PyObject + *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Encode a Unicode object using UTF-8 and return the result as + Python bytes object. Error handling is “strict”. Return ‘NULL’ if + an exception was raised by the codec. + + -- C Function: const char *PyUnicode_AsUTF8AndSize (PyObject *unicode, + Py_ssize_t *size) + ` Part of the *note Stable ABI: 4b8. 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 ‘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. + + In the case of an error, ‘NULL’ is returned with an exception set + and no `size' is stored. + + 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. + + New in version 3.3. + + Changed in version 3.7: The return type is now ‘const char *’ + rather of ‘char *’. + + Changed in version 3.10: This function is a part of the *note + limited API: 4b8. + + -- C Function: const char *PyUnicode_AsUTF8 (PyObject *unicode) + + As *note PyUnicode_AsUTF8AndSize(): 4c2, but does not store the + size. + + New in version 3.3. + + Changed in version 3.7: The return type is now ‘const char *’ + rather of ‘char *’. + + +File: python.info, Node: UTF-32 Codecs, Next: UTF-16 Codecs, Prev: UTF-8 Codecs, Up: Built-in Codecs + +7.8.3.18 UTF-32 Codecs +...................... + +These are the UTF-32 codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF32 (const char + *s, Py_ssize_t size, const char *errors, int *byteorder) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Decode `size' bytes from a UTF-32 encoded buffer string and + return the corresponding Unicode object. `errors' (if non-‘NULL’) + defines the error handling. It defaults to “strict”. + + If `byteorder' is non-‘NULL’, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + If ‘*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 ‘*byteorder’ is ‘-1’ or ‘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 ‘NULL’, the codec starts in native order mode. + + Return ‘NULL’ if an exception was raised by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF32Stateful + (const char *s, Py_ssize_t size, const char *errors, int + *byteorder, Py_ssize_t *consumed) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' If `consumed' is ‘NULL’, behave like *note + PyUnicode_DecodeUTF32(): 4434. If `consumed' is not ‘NULL’, *note + PyUnicode_DecodeUTF32Stateful(): 4435. 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'. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsUTF32String (PyObject + *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘NULL’ if an exception was + raised by the codec. + + +File: python.info, Node: UTF-16 Codecs, Next: UTF-7 Codecs, Prev: UTF-32 Codecs, Up: Built-in Codecs + +7.8.3.19 UTF-16 Codecs +...................... + +These are the UTF-16 codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF16 (const char + *s, Py_ssize_t size, const char *errors, int *byteorder) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Decode `size' bytes from a UTF-16 encoded buffer string and + return the corresponding Unicode object. `errors' (if non-‘NULL’) + defines the error handling. It defaults to “strict”. + + If `byteorder' is non-‘NULL’, the decoder starts decoding using the + given byte order: + + *byteorder == -1: little endian + *byteorder == 0: native order + *byteorder == 1: big endian + + If ‘*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 ‘*byteorder’ is ‘-1’ or ‘1’, any byte order mark is copied to + the output (where it will result in either a ‘\ufeff’ or a ‘\ufffe’ + character). + + After completion, ‘*byteorder’ is set to the current byte order at + the end of input data. + + If `byteorder' is ‘NULL’, the codec starts in native order mode. + + Return ‘NULL’ if an exception was raised by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF16Stateful + (const char *s, Py_ssize_t size, const char *errors, int + *byteorder, Py_ssize_t *consumed) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' If `consumed' is ‘NULL’, behave like *note + PyUnicode_DecodeUTF16(): 4432. If `consumed' is not ‘NULL’, *note + PyUnicode_DecodeUTF16Stateful(): 4433. 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'. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsUTF16String (PyObject + *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘NULL’ if an exception was + raised by the codec. + + +File: python.info, Node: UTF-7 Codecs, Next: Unicode-Escape Codecs, Prev: UTF-16 Codecs, Up: Built-in Codecs + +7.8.3.20 UTF-7 Codecs +..................... + +These are the UTF-7 codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF7 (const char + *s, Py_ssize_t size, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + UTF-7 encoded string `s'. Return ‘NULL’ if an exception was raised + by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUTF7Stateful + (const char *s, Py_ssize_t size, const char *errors, + Py_ssize_t *consumed) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' If `consumed' is ‘NULL’, behave like *note + PyUnicode_DecodeUTF7(): 4436. If `consumed' is not ‘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'. + + +File: python.info, Node: Unicode-Escape Codecs, Next: Raw-Unicode-Escape Codecs, Prev: UTF-7 Codecs, Up: Built-in Codecs + +7.8.3.21 Unicode-Escape Codecs +.............................. + +These are the “Unicode Escape” codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeUnicodeEscape + (const char *s, Py_ssize_t size, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + Unicode-Escape encoded string `s'. Return ‘NULL’ if an exception + was raised by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsUnicodeEscapeString + (PyObject *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Encode a Unicode object using Unicode-Escape and return the + result as a bytes object. Error handling is “strict”. Return + ‘NULL’ if an exception was raised by the codec. + + +File: python.info, Node: Raw-Unicode-Escape Codecs, Next: Latin-1 Codecs, Prev: Unicode-Escape Codecs, Up: Built-in Codecs + +7.8.3.22 Raw-Unicode-Escape Codecs +.................................. + +These are the “Raw Unicode Escape” codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeRawUnicodeEscape + (const char *s, Py_ssize_t size, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + Raw-Unicode-Escape encoded string `s'. Return ‘NULL’ if an + exception was raised by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsRawUnicodeEscapeString + (PyObject *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Encode a Unicode object using Raw-Unicode-Escape and return + the result as a bytes object. Error handling is “strict”. Return + ‘NULL’ if an exception was raised by the codec. + + +File: python.info, Node: Latin-1 Codecs, Next: ASCII Codecs, Prev: Raw-Unicode-Escape Codecs, Up: Built-in Codecs + +7.8.3.23 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. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeLatin1 (const char + *s, Py_ssize_t size, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + Latin-1 encoded string `s'. Return ‘NULL’ if an exception was + raised by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsLatin1String (PyObject + *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Encode a Unicode object using Latin-1 and return the result + as Python bytes object. Error handling is “strict”. Return ‘NULL’ + if an exception was raised by the codec. + + +File: python.info, Node: ASCII Codecs, Next: Character Map Codecs, Prev: Latin-1 Codecs, Up: Built-in Codecs + +7.8.3.24 ASCII Codecs +..................... + +These are the ASCII codec APIs. Only 7-bit ASCII data is accepted. All +other codes generate errors. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeASCII (const char + *s, Py_ssize_t size, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + ASCII encoded string `s'. Return ‘NULL’ if an exception was raised + by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsASCIIString (PyObject + *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Encode a Unicode object using ASCII and return the result as + Python bytes object. Error handling is “strict”. Return ‘NULL’ if + an exception was raised by the codec. + + +File: python.info, Node: Character Map Codecs, Next: MBCS codecs for Windows, Prev: ASCII Codecs, Up: Built-in Codecs + +7.8.3.25 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 ‘encodings’ package). The codec uses mappings to +encode and decode characters. The mapping objects provided must support +the ‘__getitem__()’ mapping interface; dictionaries and sequences work +well. + +These are the mapping codec APIs: + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeCharmap (const + char *data, Py_ssize_t size, PyObject *mapping, const char + *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a Unicode object by decoding `size' bytes of the + encoded string `s' using the given `mapping' object. Return ‘NULL’ + if an exception was raised by the codec. + + If `mapping' is ‘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 ‘None’. Unmapped data bytes – ones which + cause a *note LookupError: 1c1f, as well as ones which get mapped + to ‘None’, ‘0xFFFE’ or ‘'\ufffe'’, are treated as undefined + mappings and cause an error. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsCharmapString + (PyObject *unicode, PyObject *mapping) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Encode a Unicode object using the given `mapping' object and + return the result as a bytes object. Error handling is “strict”. + Return ‘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 ‘None’. Unmapped + character ordinals (ones which cause a *note LookupError: 1c1f.) as + well as mapped to ‘None’ are treated as “undefined mapping” and + cause an error. + +The following codec API is special in that maps Unicode to Unicode. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Translate (PyObject + *str, PyObject *table, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Translate a string by applying a character mapping table to + it and return the resulting Unicode object. Return ‘NULL’ if an + exception was raised by the codec. + + The mapping table must map Unicode ordinal integers to Unicode + ordinal integers or ‘None’ (causing deletion of the character). + + Mapping tables need only provide the ‘__getitem__()’ interface; + dictionaries and sequences work well. Unmapped character ordinals + (ones which cause a *note LookupError: 1c1f.) are left untouched + and are copied as-is. + + `errors' has the usual meaning for codecs. It may be ‘NULL’ which + indicates to use the default error handling. + + +File: python.info, Node: MBCS codecs for Windows, Next: Methods & Slots, Prev: Character Map Codecs, Up: Built-in Codecs + +7.8.3.26 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. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeMBCS (const char + *s, Py_ssize_t size, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + on Windows since version 3.7.' Create a Unicode object by decoding + `size' bytes of the MBCS encoded string `s'. Return ‘NULL’ if an + exception was raised by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_DecodeMBCSStateful + (const char *s, Py_ssize_t size, const char *errors, + Py_ssize_t *consumed) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + on Windows since version 3.7.' If `consumed' is ‘NULL’, behave + like *note PyUnicode_DecodeMBCS(): 442f. If `consumed' is not + ‘NULL’, *note PyUnicode_DecodeMBCSStateful(): 4430. will not decode + trailing lead byte and the number of bytes that have been decoded + will be stored in `consumed'. + + -- C Function: *note PyObject: 4cf. *PyUnicode_AsMBCSString (PyObject + *unicode) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + 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 ‘NULL’ if an exception was raised by the codec. + + -- C Function: *note PyObject: 4cf. *PyUnicode_EncodeCodePage (int + code_page, PyObject *unicode, const char *errors) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + on Windows since version 3.7.' Encode the Unicode object using the + specified code page and return a Python bytes object. Return + ‘NULL’ if an exception was raised by the codec. Use ‘CP_ACP’ code + page to get the MBCS encoder. + + New in version 3.3. + + +File: python.info, Node: Methods & Slots, Prev: MBCS codecs for Windows, Up: Built-in Codecs + +7.8.3.27 Methods & Slots +........................ + + +File: python.info, Node: Methods and Slot Functions, Prev: Built-in Codecs, Up: Unicode Objects and Codecs + +7.8.3.28 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 ‘NULL’ or ‘-1’ if an exception occurs. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Concat (PyObject *left, + PyObject *right) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Concat two strings giving a new Unicode string. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Split (PyObject *s, + PyObject *sep, Py_ssize_t maxsplit) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Split a string giving a list of Unicode strings. If `sep' + is ‘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. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Splitlines (PyObject *s, + int keepend) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Split a Unicode string at line breaks, returning a list of + Unicode strings. CRLF is considered to be one line break. If + `keepend' is ‘0’, the line break characters are not included in the + resulting strings. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Join (PyObject + *separator, PyObject *seq) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Join a sequence of strings using the given `separator' and + return the resulting Unicode string. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_Tailmatch (PyObject + *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int + direction) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if `substr' + matches ‘str[start:end]’ at the given tail end (`direction' == ‘-1’ + means to do a prefix match, `direction' == ‘1’ a suffix match), ‘0’ + otherwise. Return ‘-1’ if an error occurred. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_Find (PyObject *str, + PyObject *substr, Py_ssize_t start, Py_ssize_t end, int + direction) + ` Part of the *note Stable ABI: 4b8.' Return the first position of + `substr' in ‘str[start:end]’ using the given `direction' + (`direction' == ‘1’ means to do a forward search, `direction' == + ‘-1’ a backward search). The return value is the index of the + first match; a value of ‘-1’ indicates that no match was found, and + ‘-2’ indicates that an error occurred and an exception has been + set. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_FindChar (PyObject + *str, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int + direction) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Return + the first position of the character `ch' in ‘str[start:end]’ using + the given `direction' (`direction' == ‘1’ means to do a forward + search, `direction' == ‘-1’ a backward search). The return value + is the index of the first match; a value of ‘-1’ indicates that no + match was found, and ‘-2’ indicates that an error occurred and an + exception has been set. + + New in version 3.3. + + Changed in version 3.7: `start' and `end' are now adjusted to + behave like ‘str[start:end]’. + + -- C Function: *note Py_ssize_t: 6b1. PyUnicode_Count (PyObject *str, + PyObject *substr, Py_ssize_t start, Py_ssize_t end) + ` Part of the *note Stable ABI: 4b8.' Return the number of + non-overlapping occurrences of `substr' in ‘str[start:end]’. + Return ‘-1’ if an error occurred. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Replace (PyObject *str, + PyObject *substr, PyObject *replstr, Py_ssize_t maxcount) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Replace at most `maxcount' occurrences of `substr' in `str' + with `replstr' and return the resulting Unicode object. `maxcount' + == ‘-1’ means replace all occurrences. + + -- C Function: int PyUnicode_Compare (PyObject *left, PyObject *right) + ` Part of the *note Stable ABI: 4b8.' Compare two strings and + return ‘-1’, ‘0’, ‘1’ for less than, equal, and greater than, + respectively. + + This function returns ‘-1’ upon failure, so one should call *note + PyErr_Occurred(): 12f8. to check for errors. + + -- C Function: int PyUnicode_CompareWithASCIIString (PyObject *uni, + const char *string) + ` Part of the *note Stable ABI: 4b8.' Compare a Unicode object, + `uni', with `string' and return ‘-1’, ‘0’, ‘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. + + -- C Function: *note PyObject: 4cf. *PyUnicode_RichCompare (PyObject + *left, PyObject *right, int op) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Rich compare two Unicode strings and return one of the + following: + + * ‘NULL’ in case an exception was raised + + * ‘Py_True’ or ‘Py_False’ for successful comparisons + + * ‘Py_NotImplemented’ in case the type combination is unknown + + Possible values for `op' are ‘Py_GT’, ‘Py_GE’, ‘Py_EQ’, ‘Py_NE’, + ‘Py_LT’, and ‘Py_LE’. + + -- C Function: *note PyObject: 4cf. *PyUnicode_Format (PyObject + *format, PyObject *args) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new string object from `format' and `args'; this is + analogous to ‘format % args’. + + -- C Function: int PyUnicode_Contains (PyObject *container, PyObject + *element) + ` Part of the *note Stable ABI: 4b8.' Check whether `element' is + contained in `container' and return true or false accordingly. + + `element' has to coerce to a one element Unicode string. ‘-1’ is + returned if there was an error. + + -- C Function: void PyUnicode_InternInPlace (PyObject **string) + ` Part of the *note Stable ABI: 4b8.' Intern the argument + `*string' 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 `*string', it sets + `*string' to it (decrementing the reference count of the old string + object and incrementing the reference count of the interned string + object), otherwise it leaves `*string' alone and interns it + (incrementing its reference count). (Clarification: even though + there is a lot of talk about reference counts, think of this + function as reference-count-neutral; you own the object after the + call if and only if you owned it before the call.) + + -- C Function: *note PyObject: 4cf. *PyUnicode_InternFromString (const + char *v) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' A combination of *note PyUnicode_FromString(): 42ad. and + *note PyUnicode_InternInPlace(): 4ed, returning either a new + Unicode string object that has been interned, or a new (“owned”) + reference to an earlier interned string object with the same value. + + +File: python.info, Node: Tuple Objects, Next: Struct Sequence Objects, Prev: Unicode Objects and Codecs, Up: Sequence Objects + +7.8.3.29 Tuple Objects +...................... + + -- C Type: type PyTupleObject + + This subtype of *note PyObject: 4cf. represents a Python tuple + object. + + -- C Variable: *note PyTypeObject: 701. PyTuple_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python tuple type; it is the same + object as *note tuple: 539. in the Python layer. + + -- 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. + + -- 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. + + -- C Function: *note PyObject: 4cf. *PyTuple_New (Py_ssize_t len) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new tuple object of size `len', or ‘NULL’ on + failure. + + -- C Function: *note PyObject: 4cf. *PyTuple_Pack (Py_ssize_t n, ...) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new tuple object of size `n', or ‘NULL’ on failure. + The tuple values are initialized to the subsequent `n' C arguments + pointing to Python objects. ‘PyTuple_Pack(2, a, b)’ is equivalent + to ‘Py_BuildValue("(OO)", a, b)’. + + -- C Function: *note Py_ssize_t: 6b1. PyTuple_Size (PyObject *p) + ` Part of the *note Stable ABI: 4b8.' Take a pointer to a tuple + object, and return the size of that tuple. + + -- C Function: *note Py_ssize_t: 6b1. PyTuple_GET_SIZE (PyObject *p) + + Return the size of the tuple `p', which must be non-‘NULL’ and + point to a tuple; no error checking is performed. + + -- C Function: *note PyObject: 4cf. *PyTuple_GetItem (PyObject *p, + Py_ssize_t pos) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return the object at position `pos' in the tuple pointed to + by `p'. If `pos' is negative or out of bounds, return ‘NULL’ and + set an *note IndexError: 116b. exception. + + -- C Function: *note PyObject: 4cf. *PyTuple_GET_ITEM (PyObject *p, + Py_ssize_t pos) + `Return value: Borrowed reference.' Like *note PyTuple_GetItem(): + 4247, but does no checking of its arguments. + + -- C Function: *note PyObject: 4cf. *PyTuple_GetSlice (PyObject *p, + Py_ssize_t low, Py_ssize_t high) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return the slice of the tuple pointed to by `p' between + `low' and `high', or ‘NULL’ on failure. This is the equivalent of + the Python expression ‘p[low:high]’. Indexing from the end of the + list is not supported. + + -- C Function: int PyTuple_SetItem (PyObject *p, Py_ssize_t pos, + PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Insert a reference to object + `o' at position `pos' of the tuple pointed to by `p'. Return ‘0’ + on success. If `pos' is out of bounds, return ‘-1’ and set an + *note IndexError: 116b. exception. + + Note: This function “steals” a reference to `o' and discards a + reference to an item already in the tuple at the affected + position. + + -- C Function: void PyTuple_SET_ITEM (PyObject *p, Py_ssize_t pos, + PyObject *o) + + Like *note PyTuple_SetItem(): 424b, but does no error checking, and + should `only' be used to fill in brand new tuples. + + Note: This function “steals” a reference to `o', and, unlike + *note PyTuple_SetItem(): 424b, does `not' discard a reference + to any item that is being replaced; any reference in the tuple + at position `pos' will be leaked. + + -- 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 ‘0’ on success. Client code should + never assume that the resulting value of ‘*p’ will be the same as + before calling this function. If the object referenced by ‘*p’ is + replaced, the original ‘*p’ is destroyed. On failure, returns ‘-1’ + and sets ‘*p’ to ‘NULL’, and raises *note MemoryError: 127a. or + *note SystemError: 9b5. + + +File: python.info, Node: Struct Sequence Objects, Next: List Objects, Prev: Tuple Objects, Up: Sequence Objects + +7.8.3.30 Struct Sequence Objects +................................ + +Struct sequence objects are the C equivalent of *note namedtuple(): 538. +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. + + -- C Function: *note PyTypeObject: 701. *PyStructSequence_NewType + (PyStructSequence_Desc *desc) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a new struct sequence type from the data in `desc', + described below. Instances of the resulting type can be created + with *note PyStructSequence_New(): 43e6. + + -- C Function: void PyStructSequence_InitType (PyTypeObject *type, + PyStructSequence_Desc *desc) + + Initializes a struct sequence type `type' from `desc' in place. + + -- C Function: int PyStructSequence_InitType2 (PyTypeObject *type, + PyStructSequence_Desc *desc) + + The same as ‘PyStructSequence_InitType’, but returns ‘0’ on success + and ‘-1’ on failure. + + New in version 3.4. + + -- C Type: type PyStructSequence_Desc + ` Part of the *note Stable ABI: 4b8. (including all members).' + Contains the meta information of a struct sequence type to create. + + Field C Type Meaning + + ------------------------------------------------------------------------------------------------------ + + ‘name’ ‘const char *’ name of the struct sequence type + + + ‘doc’ ‘const char *’ pointer to docstring for the type or + ‘NULL’ to omit + + + ‘fields’ ‘PyStructSequence_Field *’ pointer to ‘NULL’-terminated array with + field names of the new type + + + ‘n_in_sequence’ ‘int’ number of fields visible to the Python + side (if used as tuple) + + + -- C Type: type PyStructSequence_Field + ` Part of the *note Stable ABI: 4b8. (including all members).' + Describes a field of a struct sequence. As a struct sequence is + modeled as a tuple, all fields are typed as *note PyObject: 4cf.*. + The index in the ‘fields’ array of the *note PyStructSequence_Desc: + 81d. determines which field of the struct sequence is described. + + Field C Type Meaning + + ------------------------------------------------------------------------------------- + + ‘name’ ‘const char *’ name for the field or ‘NULL’ to end the + list of named fields, set to + *note PyStructSequence_UnnamedField: 5d8. + to leave unnamed + + + ‘doc’ ‘const char *’ field docstring or ‘NULL’ to omit + + + -- C Variable: const char *const PyStructSequence_UnnamedField + ` Part of the *note Stable ABI: 4b8. since version 3.11.' Special + value for a field name to leave it unnamed. + + Changed in version 3.9: The type was changed from ‘char *’. + + -- C Function: *note PyObject: 4cf. *PyStructSequence_New (PyTypeObject + *type) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Creates an instance of `type', which must have been created + with *note PyStructSequence_NewType(): 43e7. + + -- C Function: *note PyObject: 4cf. *PyStructSequence_GetItem (PyObject + *p, Py_ssize_t pos) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return the object at position `pos' in the struct sequence + pointed to by `p'. No bounds checking is performed. + + -- C Function: *note PyObject: 4cf. *PyStructSequence_GET_ITEM + (PyObject *p, Py_ssize_t pos) + `Return value: Borrowed reference.' Macro equivalent of *note + PyStructSequence_GetItem(): 43e5. + + -- C Function: void PyStructSequence_SetItem (PyObject *p, Py_ssize_t + pos, PyObject *o) + ` Part of the *note Stable ABI: 4b8.' Sets the field at index + `pos' of the struct sequence `p' to value `o'. Like *note + PyTuple_SET_ITEM(): 4ea, this should only be used to fill in brand + new instances. + + Note: This function “steals” a reference to `o'. + + -- C Function: void PyStructSequence_SET_ITEM (PyObject *p, Py_ssize_t + *pos, PyObject *o) + + Similar to *note PyStructSequence_SetItem(): 43e8, but implemented + as a static inlined function. + + Note: This function “steals” a reference to `o'. + + +File: python.info, Node: List Objects, Prev: Struct Sequence Objects, Up: Sequence Objects + +7.8.3.31 List Objects +..................... + + -- C Type: type PyListObject + + This subtype of *note PyObject: 4cf. represents a Python list + object. + + -- C Variable: *note PyTypeObject: 701. PyList_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python list type. This is the + same object as *note list: 1e9. in the Python layer. + + -- C Function: int PyList_Check (PyObject *p) + + Return true if `p' is a list object or an instance of a subtype of + the list type. This function always succeeds. + + -- C Function: int PyList_CheckExact (PyObject *p) + + Return true if `p' is a list object, but not an instance of a + subtype of the list type. This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PyList_New (Py_ssize_t len) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new list of length `len' on success, or ‘NULL’ on + failure. + + Note: If `len' is greater than zero, the returned list + object’s items are set to ‘NULL’. Thus you cannot use + abstract API functions such as *note PySequence_SetItem(): + 1495. or expose the object to Python code before setting all + items to a real object with *note PyList_SetItem(): 424c. + + -- C Function: *note Py_ssize_t: 6b1. PyList_Size (PyObject *list) + ` Part of the *note Stable ABI: 4b8.' + + Return the length of the list object in `list'; this is equivalent + to ‘len(list)’ on a list object. + + -- C Function: *note Py_ssize_t: 6b1. PyList_GET_SIZE (PyObject *list) + + Similar to *note PyList_Size(): 107e, but without error checking. + + -- C Function: *note PyObject: 4cf. *PyList_GetItem (PyObject *list, + Py_ssize_t index) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' 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 (<0 + or >=len(list)), return ‘NULL’ and set an *note IndexError: 116b. + exception. + + -- C Function: *note PyObject: 4cf. *PyList_GET_ITEM (PyObject *list, + Py_ssize_t i) + `Return value: Borrowed reference.' Similar to *note + PyList_GetItem(): 4248, but without error checking. + + -- C Function: int PyList_SetItem (PyObject *list, Py_ssize_t index, + PyObject *item) + ` Part of the *note Stable ABI: 4b8.' Set the item at index + `index' in list to `item'. Return ‘0’ on success. If `index' is + out of bounds, return ‘-1’ and set an *note IndexError: 116b. + exception. + + Note: This function “steals” a reference to `item' and + discards a reference to an item already in the list at the + affected position. + + -- C Function: void PyList_SET_ITEM (PyObject *list, Py_ssize_t i, + PyObject *o) + + Macro form of *note PyList_SetItem(): 424c. without error checking. + This is normally only used to fill in new lists where there is no + previous content. + + Note: This macro “steals” a reference to `item', and, unlike + *note PyList_SetItem(): 424c, does `not' discard a reference + to any item that is being replaced; any reference in `list' at + position `i' will be leaked. + + -- C Function: int PyList_Insert (PyObject *list, Py_ssize_t index, + PyObject *item) + ` Part of the *note Stable ABI: 4b8.' Insert the item `item' into + list `list' in front of index `index'. Return ‘0’ if successful; + return ‘-1’ and set an exception if unsuccessful. Analogous to + ‘list.insert(index, item)’. + + -- C Function: int PyList_Append (PyObject *list, PyObject *item) + ` Part of the *note Stable ABI: 4b8.' Append the object `item' at + the end of list `list'. Return ‘0’ if successful; return ‘-1’ and + set an exception if unsuccessful. Analogous to + ‘list.append(item)’. + + -- C Function: *note PyObject: 4cf. *PyList_GetSlice (PyObject *list, + Py_ssize_t low, Py_ssize_t high) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a list of the objects in `list' containing the + objects `between' `low' and `high'. Return ‘NULL’ and set an + exception if unsuccessful. Analogous to ‘list[low:high]’. + Indexing from the end of the list is not supported. + + -- C Function: int PyList_SetSlice (PyObject *list, Py_ssize_t low, + Py_ssize_t high, PyObject *itemlist) + ` Part of the *note Stable ABI: 4b8.' Set the slice of `list' + between `low' and `high' to the contents of `itemlist'. Analogous + to ‘list[low:high] = itemlist’. The `itemlist' may be ‘NULL’, + indicating the assignment of an empty list (slice deletion). + Return ‘0’ on success, ‘-1’ on failure. Indexing from the end of + the list is not supported. + + -- C Function: int PyList_Sort (PyObject *list) + ` Part of the *note Stable ABI: 4b8.' Sort the items of `list' in + place. Return ‘0’ on success, ‘-1’ on failure. This is equivalent + to ‘list.sort()’. + + -- C Function: int PyList_Reverse (PyObject *list) + ` Part of the *note Stable ABI: 4b8.' Reverse the items of `list' + in place. Return ‘0’ on success, ‘-1’ on failure. This is the + equivalent of ‘list.reverse()’. + + -- C Function: *note PyObject: 4cf. *PyList_AsTuple (PyObject *list) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Return a new tuple object containing the contents of `list'; + equivalent to ‘tuple(list)’. + + +File: python.info, Node: Container Objects, Next: Function Objects<2>, Prev: Sequence Objects, Up: Concrete Objects Layer + +7.8.4 Container Objects +----------------------- + +* Menu: + +* Dictionary Objects:: +* Set Objects:: + + +File: python.info, Node: Dictionary Objects, Next: Set Objects, Up: Container Objects + +7.8.4.1 Dictionary Objects +.......................... + + -- C Type: type PyDictObject + + This subtype of *note PyObject: 4cf. represents a Python dictionary + object. + + -- C Variable: *note PyTypeObject: 701. PyDict_Type + ` Part of the *note Stable ABI: 4b8.' This instance of *note + PyTypeObject: 701. represents the Python dictionary type. This is + the same object as *note dict: 16e. in the Python layer. + + -- C Function: int PyDict_Check (PyObject *p) + + Return true if `p' is a dict object or an instance of a subtype of + the dict type. This function always succeeds. + + -- C Function: int PyDict_CheckExact (PyObject *p) + + Return true if `p' is a dict object, but not an instance of a + subtype of the dict type. This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PyDict_New () + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new empty dictionary, or ‘NULL’ on failure. + + -- C Function: *note PyObject: 4cf. *PyDictProxy_New (PyObject + *mapping) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a *note types.MappingProxyType: 3bb. 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. + + -- C Function: void PyDict_Clear (PyObject *p) + ` Part of the *note Stable ABI: 4b8.' Empty an existing dictionary + of all key-value pairs. + + -- C Function: int PyDict_Contains (PyObject *p, PyObject *key) + ` Part of the *note Stable ABI: 4b8.' Determine if dictionary `p' + contains `key'. If an item in `p' is matches `key', return ‘1’, + otherwise return ‘0’. On error, return ‘-1’. This is equivalent + to the Python expression ‘key in p’. + + -- C Function: *note PyObject: 4cf. *PyDict_Copy (PyObject *p) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new dictionary that contains the same key-value + pairs as `p'. + + -- C Function: int PyDict_SetItem (PyObject *p, PyObject *key, PyObject + *val) + ` Part of the *note Stable ABI: 4b8.' Insert `val' into the + dictionary `p' with a key of `key'. `key' must be *note hashable: + 1e8.; if it isn’t, *note TypeError: 19c. will be raised. Return + ‘0’ on success or ‘-1’ on failure. This function `does not' steal + a reference to `val'. + + -- C Function: int PyDict_SetItemString (PyObject *p, const char *key, + PyObject *val) + ` Part of the *note Stable ABI: 4b8.' + + Insert `val' into the dictionary `p' using `key' as a key. `key' + should be a const char*. The key object is created using + ‘PyUnicode_FromString(key)’. Return ‘0’ on success or ‘-1’ on + failure. This function `does not' steal a reference to `val'. + + -- C Function: int PyDict_DelItem (PyObject *p, PyObject *key) + ` Part of the *note Stable ABI: 4b8.' Remove the entry in + dictionary `p' with key `key'. `key' must be hashable; if it + isn’t, *note TypeError: 19c. is raised. If `key' is not in the + dictionary, *note KeyError: 6f5. is raised. Return ‘0’ on success + or ‘-1’ on failure. + + -- C Function: int PyDict_DelItemString (PyObject *p, const char *key) + ` Part of the *note Stable ABI: 4b8.' Remove the entry in + dictionary `p' which has a key specified by the string `key'. If + `key' is not in the dictionary, *note KeyError: 6f5. is raised. + Return ‘0’ on success or ‘-1’ on failure. + + -- C Function: *note PyObject: 4cf. *PyDict_GetItem (PyObject *p, + PyObject *key) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return the object from dictionary `p' which has a key `key'. + Return ‘NULL’ if the key `key' is not present, but `without' + setting an exception. + + Note that exceptions which occur while calling ‘__hash__()’ and + ‘__eq__()’ methods will get suppressed. To get error reporting use + *note PyDict_GetItemWithError(): 431e. instead. + + Changed in version 3.10: Calling this API without *note GIL: 4df. + held had been allowed for historical reason. It is no longer + allowed. + + -- C Function: *note PyObject: 4cf. *PyDict_GetItemWithError (PyObject + *p, PyObject *key) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Variant of *note PyDict_GetItem(): 4de. that does not + suppress exceptions. Return ‘NULL’ `with' an exception set if an + exception occurred. Return ‘NULL’ `without' an exception set if + the key wasn’t present. + + -- C Function: *note PyObject: 4cf. *PyDict_GetItemString (PyObject *p, + const char *key) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' This is the same as *note PyDict_GetItem(): 4de, but `key' + is specified as a const char*, rather than a *note PyObject: 4cf.*. + + Note that exceptions which occur while calling ‘__hash__()’ and + ‘__eq__()’ methods and creating a temporary string object will get + suppressed. To get error reporting use *note + PyDict_GetItemWithError(): 431e. instead. + + -- C Function: *note PyObject: 4cf. *PyDict_SetDefault (PyObject *p, + PyObject *key, PyObject *defaultobj) + `Return value: Borrowed reference.' This is the same as the + Python-level *note dict.setdefault(): d29. 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. + + New in version 3.4. + + -- C Function: *note PyObject: 4cf. *PyDict_Items (PyObject *p) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a *note PyListObject: 4502. containing all the items + from the dictionary. + + -- C Function: *note PyObject: 4cf. *PyDict_Keys (PyObject *p) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a *note PyListObject: 4502. containing all the keys + from the dictionary. + + -- C Function: *note PyObject: 4cf. *PyDict_Values (PyObject *p) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a *note PyListObject: 4502. containing all the values + from the dictionary `p'. + + -- C Function: *note Py_ssize_t: 6b1. PyDict_Size (PyObject *p) + ` Part of the *note Stable ABI: 4b8.' + + Return the number of items in the dictionary. This is equivalent + to ‘len(p)’ on a dictionary. + + -- C Function: int PyDict_Next (PyObject *p, Py_ssize_t *ppos, PyObject + **pkey, PyObject **pvalue) + ` Part of the *note Stable ABI: 4b8.' Iterate over all key-value + pairs in the dictionary `p'. The *note Py_ssize_t: 6b1. referred + to by `ppos' must be initialized to ‘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 *note PyObject: 4cf.* variables that will be filled in with each + key and value, respectively, or may be ‘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: + + PyObject *key, *value; + Py_ssize_t pos = 0; + + while (PyDict_Next(self->dict, &pos, &key, &value)) { + /* do something interesting with the values... */ + ... + } + + 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: + + 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); + } + + -- C Function: int PyDict_Merge (PyObject *a, PyObject *b, int + override) + ` Part of the *note Stable ABI: 4b8.' Iterate over mapping object + `b' adding key-value pairs to dictionary `a'. `b' may be a + dictionary, or any object supporting *note PyMapping_Keys(): 81f. + and *note PyObject_GetItem(): 42ce. 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 ‘0’ on success or ‘-1’ if an exception + was raised. + + -- C Function: int PyDict_Update (PyObject *a, PyObject *b) + ` Part of the *note Stable ABI: 4b8.' This is the same as + ‘PyDict_Merge(a, b, 1)’ in C, and is similar to ‘a.update(b)’ in + Python except that *note PyDict_Update(): 4328. doesn’t fall back + to the iterating over a sequence of key value pairs if the second + argument has no “keys” attribute. Return ‘0’ on success or ‘-1’ if + an exception was raised. + + -- C Function: int PyDict_MergeFromSeq2 (PyObject *a, PyObject *seq2, + int override) + ` Part of the *note Stable ABI: 4b8.' 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 ‘0’ on success or + ‘-1’ if an exception was raised. Equivalent Python (except for the + return value): + + def PyDict_MergeFromSeq2(a, seq2, override): + for key, value in seq2: + if override or key not in a: + a[key] = value + + +File: python.info, Node: Set Objects, Prev: Dictionary Objects, Up: Container Objects + +7.8.4.2 Set Objects +................... + +This section details the public API for *note set: 1a6. and *note +frozenset: 1a7. objects. Any functionality not listed below is best +accessed using either the abstract object protocol (including *note +PyObject_CallMethod(): 4ad, *note PyObject_RichCompareBool(): 13c0, +*note PyObject_Hash(): 373, *note PyObject_Repr(): cdb, *note +PyObject_IsTrue(): 43c3, *note PyObject_Print(): 1492, and *note +PyObject_GetIter(): 43c0.) or the abstract number protocol (including +*note PyNumber_And(): 438f, *note PyNumber_Subtract(): 43a8, *note +PyNumber_Or(): 43a3, *note PyNumber_Xor(): 43aa, *note +PyNumber_InPlaceAnd(): 4394, *note PyNumber_InPlaceSubtract(): 439c, +*note PyNumber_InPlaceOr(): 4398, and *note PyNumber_InPlaceXor(): +439e.). + + -- C Type: type PySetObject + + This subtype of *note PyObject: 4cf. is used to hold the internal + data for both *note set: 1a6. and *note frozenset: 1a7. objects. + It is like a *note PyDictObject: 45df. 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. + + -- C Variable: *note PyTypeObject: 701. PySet_Type + ` Part of the *note Stable ABI: 4b8.' This is an instance of *note + PyTypeObject: 701. representing the Python *note set: 1a6. type. + + -- C Variable: *note PyTypeObject: 701. PyFrozenSet_Type + ` Part of the *note Stable ABI: 4b8.' This is an instance of *note + PyTypeObject: 701. representing the Python *note frozenset: 1a7. + type. + +The following type check macros work on pointers to any Python object. +Likewise, the constructor functions work with any iterable Python +object. + + -- C Function: int PySet_Check (PyObject *p) + + Return true if `p' is a *note set: 1a6. object or an instance of a + subtype. This function always succeeds. + + -- C Function: int PyFrozenSet_Check (PyObject *p) + + Return true if `p' is a *note frozenset: 1a7. object or an instance + of a subtype. This function always succeeds. + + -- C Function: int PyAnySet_Check (PyObject *p) + + Return true if `p' is a *note set: 1a6. object, a *note frozenset: + 1a7. object, or an instance of a subtype. This function always + succeeds. + + -- C Function: int PySet_CheckExact (PyObject *p) + + Return true if `p' is a *note set: 1a6. object but not an instance + of a subtype. This function always succeeds. + + New in version 3.10. + + -- C Function: int PyAnySet_CheckExact (PyObject *p) + + Return true if `p' is a *note set: 1a6. object or a *note + frozenset: 1a7. object but not an instance of a subtype. This + function always succeeds. + + -- C Function: int PyFrozenSet_CheckExact (PyObject *p) + + Return true if `p' is a *note frozenset: 1a7. object but not an + instance of a subtype. This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PySet_New (PyObject *iterable) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note set: 1a6. containing objects returned by + the `iterable'. The `iterable' may be ‘NULL’ to create a new empty + set. Return the new set on success or ‘NULL’ on failure. Raise + *note TypeError: 19c. if `iterable' is not actually iterable. The + constructor is also useful for copying a set (‘c=set(s)’). + + -- C Function: *note PyObject: 4cf. *PyFrozenSet_New (PyObject + *iterable) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new *note frozenset: 1a7. containing objects + returned by the `iterable'. The `iterable' may be ‘NULL’ to create + a new empty frozenset. Return the new set on success or ‘NULL’ on + failure. Raise *note TypeError: 19c. if `iterable' is not actually + iterable. + +The following functions and macros are available for instances of *note +set: 1a6. or *note frozenset: 1a7. or instances of their subtypes. + + -- C Function: *note Py_ssize_t: 6b1. PySet_Size (PyObject *anyset) + ` Part of the *note Stable ABI: 4b8.' + + Return the length of a *note set: 1a6. or *note frozenset: 1a7. + object. Equivalent to ‘len(anyset)’. Raises a ‘PyExc_SystemError’ + if `anyset' is not a *note set: 1a6, *note frozenset: 1a7, or an + instance of a subtype. + + -- C Function: *note Py_ssize_t: 6b1. PySet_GET_SIZE (PyObject *anyset) + + Macro form of *note PySet_Size(): 10af. without error checking. + + -- C Function: int PySet_Contains (PyObject *anyset, PyObject *key) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if found, ‘0’ if + not found, and ‘-1’ if an error is encountered. Unlike the Python + ‘__contains__()’ method, this function does not automatically + convert unhashable sets into temporary frozensets. Raise a *note + TypeError: 19c. if the `key' is unhashable. Raise + ‘PyExc_SystemError’ if `anyset' is not a *note set: 1a6, *note + frozenset: 1a7, or an instance of a subtype. + + -- C Function: int PySet_Add (PyObject *set, PyObject *key) + ` Part of the *note Stable ABI: 4b8.' Add `key' to a *note set: + 1a6. instance. Also works with *note frozenset: 1a7. instances + (like *note PyTuple_SetItem(): 424b. it can be used to fill in the + values of brand new frozensets before they are exposed to other + code). Return ‘0’ on success or ‘-1’ on failure. Raise a *note + TypeError: 19c. if the `key' is unhashable. Raise a *note + MemoryError: 127a. if there is no room to grow. Raise a *note + SystemError: 9b5. if `set' is not an instance of *note set: 1a6. or + its subtype. + +The following functions are available for instances of *note set: 1a6. +or its subtypes but not for instances of *note frozenset: 1a7. or its +subtypes. + + -- C Function: int PySet_Discard (PyObject *set, PyObject *key) + ` Part of the *note Stable ABI: 4b8.' Return ‘1’ if found and + removed, ‘0’ if not found (no action taken), and ‘-1’ if an error + is encountered. Does not raise *note KeyError: 6f5. for missing + keys. Raise a *note TypeError: 19c. if the `key' is unhashable. + Unlike the Python ‘discard()’ method, this function does not + automatically convert unhashable sets into temporary frozensets. + Raise ‘PyExc_SystemError’ if `set' is not an instance of *note set: + 1a6. or its subtype. + + -- C Function: *note PyObject: 4cf. *PySet_Pop (PyObject *set) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return a new reference to an arbitrary object in the `set', + and removes the object from the `set'. Return ‘NULL’ on failure. + Raise *note KeyError: 6f5. if the set is empty. Raise a *note + SystemError: 9b5. if `set' is not an instance of *note set: 1a6. or + its subtype. + + -- C Function: int PySet_Clear (PyObject *set) + ` Part of the *note Stable ABI: 4b8.' Empty an existing set of all + elements. + + +File: python.info, Node: Function Objects<2>, Next: Other Objects, Prev: Container Objects, Up: Concrete Objects Layer + +7.8.5 Function Objects +---------------------- + +* Menu: + +* Function Objects: Function Objects<3>. +* Instance Method Objects:: +* Method Objects: Method Objects<2>. +* Cell Objects:: +* Code Objects: Code Objects<2>. + + +File: python.info, Node: Function Objects<3>, Next: Instance Method Objects, Up: Function Objects<2> + +7.8.5.1 Function Objects +........................ + +There are a few functions specific to Python functions. + + -- C Type: type PyFunctionObject + + The C structure used for functions. + + -- C Variable: *note PyTypeObject: 701. PyFunction_Type + + This is an instance of *note PyTypeObject: 701. and represents the + Python function type. It is exposed to Python programmers as + ‘types.FunctionType’. + + -- C Function: int PyFunction_Check (PyObject *o) + + Return true if `o' is a function object (has type *note + PyFunction_Type: 45f2.). The parameter must not be ‘NULL’. This + function always succeeds. + + -- C Function: *note PyObject: 4cf. *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. `__module__' is retrieved from `globals'. The argument + defaults, annotations and closure are set to ‘NULL’. + `__qualname__' is set to the same value as the code object’s + ‘co_qualname’ field. + + -- C Function: *note PyObject: 4cf. *PyFunction_NewWithQualName + (PyObject *code, PyObject *globals, PyObject *qualname) + `Return value: New reference.' As *note PyFunction_New(): 45f4, + but also allows setting the function object’s ‘__qualname__’ + attribute. `qualname' should be a unicode object or ‘NULL’; if + ‘NULL’, the ‘__qualname__’ attribute is set to the same value as + the code object’s ‘co_qualname’ field. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyFunction_GetCode (PyObject *op) + `Return value: Borrowed reference.' Return the code object + associated with the function object `op'. + + -- C Function: *note PyObject: 4cf. *PyFunction_GetGlobals (PyObject + *op) + `Return value: Borrowed reference.' Return the globals dictionary + associated with the function object `op'. + + -- C Function: *note PyObject: 4cf. *PyFunction_GetModule (PyObject + *op) + `Return value: Borrowed reference.' Return a *note borrowed + reference: 42cb. to the `__module__' attribute of the function + object `op'. It can be `NULL'. + + This is normally a string containing the module name, but can be + set to any other object by Python code. + + -- C Function: *note PyObject: 4cf. *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 ‘NULL’. + + -- C Function: int PyFunction_SetDefaults (PyObject *op, PyObject + *defaults) + + Set the argument default values for the function object `op'. + `defaults' must be ‘Py_None’ or a tuple. + + Raises *note SystemError: 9b5. and returns ‘-1’ on failure. + + -- C Function: *note PyObject: 4cf. *PyFunction_GetClosure (PyObject + *op) + `Return value: Borrowed reference.' Return the closure associated + with the function object `op'. This can be ‘NULL’ or a tuple of + cell objects. + + -- C Function: int PyFunction_SetClosure (PyObject *op, PyObject + *closure) + + Set the closure associated with the function object `op'. + `closure' must be ‘Py_None’ or a tuple of cell objects. + + Raises *note SystemError: 9b5. and returns ‘-1’ on failure. + + -- C Function: *note PyObject: 4cf. *PyFunction_GetAnnotations + (PyObject *op) + `Return value: Borrowed reference.' Return the annotations of the + function object `op'. This can be a mutable dictionary or ‘NULL’. + + -- C Function: int PyFunction_SetAnnotations (PyObject *op, PyObject + *annotations) + + Set the annotations for the function object `op'. `annotations' + must be a dictionary or ‘Py_None’. + + Raises *note SystemError: 9b5. and returns ‘-1’ on failure. + + +File: python.info, Node: Instance Method Objects, Next: Method Objects<2>, Prev: Function Objects<3>, Up: Function Objects<2> + +7.8.5.2 Instance Method Objects +............................... + +An instance method is a wrapper for a *note PyCFunction: 10d9. and the +new way to bind a *note PyCFunction: 10d9. to a class object. It +replaces the former call ‘PyMethod_New(func, NULL, class)’. + + -- C Variable: *note PyTypeObject: 701. PyInstanceMethod_Type + + This instance of *note PyTypeObject: 701. represents the Python + instance method type. It is not exposed to Python programs. + + -- C Function: int PyInstanceMethod_Check (PyObject *o) + + Return true if `o' is an instance method object (has type *note + PyInstanceMethod_Type: 4601.). The parameter must not be ‘NULL’. + This function always succeeds. + + -- C Function: *note PyObject: 4cf. *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. + + -- C Function: *note PyObject: 4cf. *PyInstanceMethod_Function + (PyObject *im) + `Return value: Borrowed reference.' Return the function object + associated with the instance method `im'. + + -- C Function: *note PyObject: 4cf. *PyInstanceMethod_GET_FUNCTION + (PyObject *im) + `Return value: Borrowed reference.' Macro version of *note + PyInstanceMethod_Function(): 4604. which avoids error checking. + + +File: python.info, Node: Method Objects<2>, Next: Cell Objects, Prev: Instance Method Objects, Up: Function Objects<2> + +7.8.5.3 Method Objects +...................... + +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. + + -- C Variable: *note PyTypeObject: 701. PyMethod_Type + + This instance of *note PyTypeObject: 701. represents the Python + method type. This is exposed to Python programs as + ‘types.MethodType’. + + -- C Function: int PyMethod_Check (PyObject *o) + + Return true if `o' is a method object (has type *note + PyMethod_Type: 4608.). The parameter must not be ‘NULL’. This + function always succeeds. + + -- C Function: *note PyObject: 4cf. *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 ‘NULL’. + + -- C Function: *note PyObject: 4cf. *PyMethod_Function (PyObject *meth) + `Return value: Borrowed reference.' Return the function object + associated with the method `meth'. + + -- C Function: *note PyObject: 4cf. *PyMethod_GET_FUNCTION (PyObject + *meth) + `Return value: Borrowed reference.' Macro version of *note + PyMethod_Function(): 460b. which avoids error checking. + + -- C Function: *note PyObject: 4cf. *PyMethod_Self (PyObject *meth) + `Return value: Borrowed reference.' Return the instance associated + with the method `meth'. + + -- C Function: *note PyObject: 4cf. *PyMethod_GET_SELF (PyObject *meth) + `Return value: Borrowed reference.' Macro version of *note + PyMethod_Self(): 460d. which avoids error checking. + + +File: python.info, Node: Cell Objects, Next: Code Objects<2>, Prev: Method Objects<2>, Up: Function Objects<2> + +7.8.5.4 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 +contains 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. + + -- C Type: type PyCellObject + + The C structure used for cell objects. + + -- C Variable: *note PyTypeObject: 701. PyCell_Type + + The type object corresponding to cell objects. + + -- C Function: int PyCell_Check (ob) + + Return true if `ob' is a cell object; `ob' must not be ‘NULL’. + This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PyCell_New (PyObject *ob) + `Return value: New reference.' Create and return a new cell object + containing the value `ob'. The parameter may be ‘NULL’. + + -- C Function: *note PyObject: 4cf. *PyCell_Get (PyObject *cell) + `Return value: New reference.' Return the contents of the cell + `cell'. + + -- C Function: *note PyObject: 4cf. *PyCell_GET (PyObject *cell) + `Return value: Borrowed reference.' Return the contents of the + cell `cell', but without checking that `cell' is non-‘NULL’ and a + cell object. + + -- 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 ‘NULL’. `cell' must be non-‘NULL’; if it is not a cell + object, ‘-1’ will be returned. On success, ‘0’ will be returned. + + -- 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-‘NULL’ and must be a cell object. + + +File: python.info, Node: Code Objects<2>, Prev: Cell Objects, Up: Function Objects<2> + +7.8.5.5 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. + + -- 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. + + -- C Variable: *note PyTypeObject: 701. PyCode_Type + + This is an instance of *note PyTypeObject: 701. representing the + Python *note code: 19. type. + + -- C Function: int PyCode_Check (PyObject *co) + + Return true if `co' is a *note code: 19. object. This function + always succeeds. + + -- C Function: int PyCode_GetNumFree (PyCodeObject *co) + + Return the number of free variables in `co'. + + -- C Function: *note PyCodeObject: 34b. *PyCode_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, int firstlineno, PyObject + *linetable, PyObject *exceptiontable) + `Return value: New reference.' Return a new code object. If you + need a dummy code object to create a frame, use *note + PyCode_NewEmpty(): ff3. instead. Calling *note PyCode_New(): 349. + directly will bind you to a precise Python version since the + definition of the bytecode changes often. 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 ‘exceptiontable’ parameter. + + -- C Function: *note PyCodeObject: 34b. *PyCode_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, int firstlineno, PyObject *linetable, PyObject + *exceptiontable) + `Return value: New reference.' Similar to *note PyCode_New(): 349, + but with an extra “posonlyargcount” for positional-only arguments. + The same caveats that apply to ‘PyCode_New’ also apply to this + function. + + New in version 3.8. + + Changed in version 3.11: Added ‘exceptiontable’ parameter. + + -- C Function: *note PyCodeObject: 34b. *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 ‘Exception’ if executed. + + -- C Function: int PyCode_Addr2Line (PyCodeObject *co, int byte_offset) + + Return the line number of the instruction that occurs on or before + ‘byte_offset’ and ends after it. If you just need the line number + of a frame, use *note PyFrame_GetLineNumber(): 35f. instead. + + For efficiently iterating over the line numbers in a code object, + use the API described in PEP 626(1). + + -- 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 ‘int’ pointers to the source code line and column + numbers for the instruction at ‘byte_offset’. Sets the value to + ‘0’ when information is not available for any particular element. + + Returns ‘1’ if the function succeeds and 0 otherwise. + + -- C Function: *note PyObject: 4cf. *PyCode_GetCode (PyCodeObject *co) + + Equivalent to the Python code ‘getattr(co, 'co_code')’. Returns a + strong reference to a *note PyBytesObject: 372. representing the + bytecode in a code object. On error, ‘NULL’ is returned and an + exception is raised. + + This ‘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. + + New in version 3.11. + + -- C Function: *note PyObject: 4cf. *PyCode_GetVarnames (PyCodeObject + *co) + + Equivalent to the Python code ‘getattr(co, 'co_varnames')’. + Returns a new reference to a *note PyTupleObject: 44b9. containing + the names of the local variables. On error, ‘NULL’ is returned and + an exception is raised. + + New in version 3.11. + + -- C Function: *note PyObject: 4cf. *PyCode_GetCellvars (PyCodeObject + *co) + + Equivalent to the Python code ‘getattr(co, 'co_cellvars')’. + Returns a new reference to a *note PyTupleObject: 44b9. containing + the names of the local variables that are referenced by nested + functions. On error, ‘NULL’ is returned and an exception is + raised. + + New in version 3.11. + + -- C Function: *note PyObject: 4cf. *PyCode_GetFreevars (PyCodeObject + *co) + + Equivalent to the Python code ‘getattr(co, 'co_freevars')’. + Returns a new reference to a *note PyTupleObject: 44b9. containing + the names of the free variables. On error, ‘NULL’ is returned and + an exception is raised. + + New in version 3.11. + + ---------- Footnotes ---------- + + (1) +https://peps.python.org/pep-0626/#out-of-process-debuggers-and-profilers + + +File: python.info, Node: Other Objects, Prev: Function Objects<2>, Up: Concrete Objects Layer + +7.8.6 Other Objects +------------------- + +* Menu: + +* File Objects:: +* Module Objects:: +* Iterator Objects:: +* Descriptor Objects:: +* Slice Objects:: +* Ellipsis Object:: +* MemoryView objects:: +* Weak Reference Objects: Weak Reference Objects<2>. +* Capsules: Capsules<2>. +* Frame Objects:: +* Generator Objects:: +* Coroutine Objects: Coroutine Objects<2>. +* Context Variables Objects:: +* DateTime Objects: DateTime Objects<2>. +* Objects for Type Hinting:: + + +File: python.info, Node: File Objects, Next: Module Objects, Up: Other Objects + +7.8.6.1 File Objects +.................... + +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 +*note io: 9f. 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 *note io: 9f. APIs instead. + + -- C Function: *note PyObject: 4cf. *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 *note Stable ABI: + 4b8.' Create a Python file object from the file descriptor of an + already opened file `fd'. The arguments `name', `encoding', + `errors' and `newline' can be ‘NULL’ to use the defaults; + `buffering' can be `-1' to use the default. `name' is ignored and + kept for backward compatibility. Return ‘NULL’ on failure. For a + more comprehensive description of the arguments, please refer to + the *note io.open(): 30c. function documentation. + + 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). + + Changed in version 3.2: Ignore `name' attribute. + + -- C Function: int PyObject_AsFileDescriptor (PyObject *p) + ` Part of the *note Stable ABI: 4b8.' 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 *note fileno(): 24aa. + 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 ‘-1’ on failure. + + -- C Function: *note PyObject: 4cf. *PyFile_GetLine (PyObject *p, int + n) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Equivalent to ‘p.readline([n])’, this function reads one line from + the object `p'. `p' may be a file object or any object with a + *note readline(): 1ce1. method. If `n' is ‘0’, exactly one line is + read, regardless of the length of the line. If `n' is greater than + ‘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 + ‘0’, however, one line is read regardless of length, but *note + EOFError: f7d. is raised if the end of the file is reached + immediately. + + -- C Function: int PyFile_SetOpenCodeHook (Py_OpenCodeHookFunction + handler) + + Overrides the normal behavior of *note io.open_code(): 1381. to + pass its parameter through the provided handler. + + The handler is a function of type *note PyObject: 4cf. *(*)(*note + PyObject: 4cf. *path, void *userData), where `path' is guaranteed + to be *note PyUnicodeObject: 37f. + + 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 ‘sys.modules’. + + Once a hook has been set, it cannot be removed or replaced, and + later calls to *note PyFile_SetOpenCodeHook(): 25e4. 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 *note Py_Initialize(): 4e7. + + Raises an *note auditing event: 12c0. ‘setopencodehook’ with no + arguments. + + New in version 3.8. + + -- C Function: int PyFile_WriteObject (PyObject *obj, PyObject *p, int + flags) + ` Part of the *note Stable ABI: 4b8.' + + Write object `obj' to file object `p'. The only supported flag for + `flags' is ‘Py_PRINT_RAW’; if given, the *note str(): 1b3. of the + object is written instead of the *note repr(): 3ee. Return ‘0’ on + success or ‘-1’ on failure; the appropriate exception will be set. + + -- C Function: int PyFile_WriteString (const char *s, PyObject *p) + ` Part of the *note Stable ABI: 4b8.' Write string `s' to file + object `p'. Return ‘0’ on success or ‘-1’ on failure; the + appropriate exception will be set. + + +File: python.info, Node: Module Objects, Next: Iterator Objects, Prev: File Objects, Up: Other Objects + +7.8.6.2 Module Objects +...................... + + -- C Variable: *note PyTypeObject: 701. PyModule_Type + ` Part of the *note Stable ABI: 4b8.' + + This instance of *note PyTypeObject: 701. represents the Python + module type. This is exposed to Python programs as + ‘types.ModuleType’. + + -- 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. + + -- C Function: int PyModule_CheckExact (PyObject *p) + + Return true if `p' is a module object, but not a subtype of *note + PyModule_Type: 438c. This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PyModule_NewObject (PyObject + *name) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' + + Return a new module object with the *note __name__: 1019. attribute + set to `name'. The module’s *note __name__: 1019, ‘__doc__’, *note + __package__: cc9, and *note __loader__: cca. attributes are filled + in (all but *note __name__: 1019. are set to ‘None’); the caller is + responsible for providing a *note __file__: 1902. attribute. + + New in version 3.3. + + Changed in version 3.4: *note __package__: cc9. and *note + __loader__: cca. are set to ‘None’. + + -- C Function: *note PyObject: 4cf. *PyModule_New (const char *name) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Similar to *note PyModule_NewObject(): 438a, but the name is + a UTF-8 encoded string instead of a Unicode object. + + -- C Function: *note PyObject: 4cf. *PyModule_GetDict (PyObject + *module) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' + + Return the dictionary object that implements `module'’s namespace; + this object is the same as the *note __dict__: 8ce. attribute of + the module object. If `module' is not a module object (or a + subtype of a module object), *note SystemError: 9b5. is raised and + ‘NULL’ is returned. + + It is recommended extensions use other ‘PyModule_*’ and + ‘PyObject_*’ functions rather than directly manipulate a module’s + *note __dict__: 8ce. + + -- C Function: *note PyObject: 4cf. *PyModule_GetNameObject (PyObject + *module) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' + + Return `module'’s *note __name__: 1019. value. If the module does + not provide one, or if it is not a string, *note SystemError: 9b5. + is raised and ‘NULL’ is returned. + + New in version 3.3. + + -- C Function: const char *PyModule_GetName (PyObject *module) + ` Part of the *note Stable ABI: 4b8.' Similar to *note + PyModule_GetNameObject(): 4388. but return the name encoded to + ‘'utf-8'’. + + -- C Function: void *PyModule_GetState (PyObject *module) + ` Part of the *note Stable ABI: 4b8.' Return the “state” of the + module, that is, a pointer to the block of memory allocated at + module creation time, or ‘NULL’. See *note PyModuleDef.m_size: + 5d4. + + -- C Function: *note PyModuleDef: 5d2. *PyModule_GetDef (PyObject + *module) + ` Part of the *note Stable ABI: 4b8.' Return a pointer to the + *note PyModuleDef: 5d2. struct from which the module was created, + or ‘NULL’ if the module wasn’t created from a definition. + + -- C Function: *note PyObject: 4cf. *PyModule_GetFilenameObject + (PyObject *module) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + Return the name of the file from which `module' was loaded using + `module'’s *note __file__: 1902. attribute. If this is not + defined, or if it is not a unicode string, raise *note SystemError: + 9b5. and return ‘NULL’; otherwise return a reference to a Unicode + object. + + New in version 3.2. + + -- C Function: const char *PyModule_GetFilename (PyObject *module) + ` Part of the *note Stable ABI: 4b8.' Similar to *note + PyModule_GetFilenameObject(): 4386. but return the filename encoded + to ‘utf-8’. + + Deprecated since version 3.2: *note PyModule_GetFilename(): 4385. + raises ‘UnicodeEncodeError’ on unencodable filenames, use *note + PyModule_GetFilenameObject(): 4386. instead. + +* Menu: + +* Initializing C modules:: +* Module lookup:: + + +File: python.info, Node: Initializing C modules, Next: Module lookup, Up: Module Objects + +7.8.6.3 Initializing C modules +.............................. + +Modules objects are usually created from extension modules (shared +libraries which export an initialization function), or compiled-in +modules (where the initialization function is added using *note +PyImport_AppendInittab(): 12bc.). See *note Building C and C++ +Extensions: 4237. or *note Extending Embedded Python: 42af. for details. + +The initialization function can either pass a module definition instance +to *note PyModule_Create(): 4234, and return the resulting module +object, or request “multi-phase initialization” by returning the +definition struct itself. + + -- C Type: type PyModuleDef + ` Part of the *note Stable ABI: 4b8. (including all members).' The + module definition struct, which holds all information needed to + create a module object. There is usually only one statically + initialized variable of this type for each module. + + -- C Member: PyModuleDef_Base m_base + + Always initialize this member to ‘PyModuleDef_HEAD_INIT’. + + -- C Member: const char *m_name + + Name for the new module. + + -- C Member: const char *m_doc + + Docstring for the module; usually a docstring variable created + with *note PyDoc_STRVAR: 138a. is used. + + -- C Member: *note Py_ssize_t: 6b1. m_size + + Module state may be kept in a per-module memory area that can + be retrieved with *note PyModule_GetState(): 5d5, 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 *note m_free: 5d1. function has been called, if + present. + + Setting ‘m_size’ to ‘-1’ means that the module does not + support sub-interpreters, because it has global state. + + 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. Non-negative ‘m_size’ is + required for multi-phase initialization. + + See PEP 3121(1) for more details. + + -- C Member: *note PyMethodDef: 1119. *m_methods + + A pointer to a table of module-level functions, described by + *note PyMethodDef: 1119. values. Can be ‘NULL’ if no + functions are present. + + -- C Member: *note PyModuleDef_Slot: 462d. *m_slots + + An array of slot definitions for multi-phase initialization, + terminated by a ‘{0, NULL}’ entry. When using single-phase + initialization, `m_slots' must be ‘NULL’. + + Changed in version 3.5: Prior to version 3.5, this member was + always set to ‘NULL’, and was defined as: + + -- C Member: *note inquiry: 4466. m_reload + + -- C Member: *note traverseproc: 4473. m_traverse + + A traversal function to call during GC traversal of the module + object, or ‘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 (*note + Py_mod_exec: 5d3. function). More precisely, this function is + not called if *note m_size: 5d4. is greater than 0 and the + module state (as returned by *note PyModule_GetState(): 5d5.) + is ‘NULL’. + + Changed in version 3.9: No longer called before the module + state is allocated. + + -- C Member: *note inquiry: 4466. m_clear + + A clear function to call during GC clearing of the module + object, or ‘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 (*note + Py_mod_exec: 5d3. function). More precisely, this function is + not called if *note m_size: 5d4. is greater than 0 and the + module state (as returned by *note PyModule_GetState(): 5d5.) + is ‘NULL’. + + Like *note PyTypeObject.tp_clear: 4278, 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 *note m_free: 5d1. is called directly. + + Changed in version 3.9: No longer called before the module + state is allocated. + + -- C Member: *note freefunc: 462f. m_free + + A function to call during deallocation of the module object, + or ‘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 (*note + Py_mod_exec: 5d3. function). More precisely, this function is + not called if *note m_size: 5d4. is greater than 0 and the + module state (as returned by *note PyModule_GetState(): 5d5.) + is ‘NULL’. + + Changed in version 3.9: No longer called before the module + state is allocated. + +* Menu: + +* Single-phase initialization:: +* Multi-phase initialization:: +* Low-level module creation functions:: +* Support functions:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3121/ + + +File: python.info, Node: Single-phase initialization, Next: Multi-phase initialization, Up: Initializing C modules + +7.8.6.4 Single-phase initialization +................................... + +The module initialization function may create and return the module +object directly. This is referred to as “single-phase initialization”, +and uses one of the following two module creation functions: + + -- C Function: *note PyObject: 4cf. *PyModule_Create (PyModuleDef *def) + `Return value: New reference.' Create a new module object, given + the definition in `def'. This behaves like *note + PyModule_Create2(): 4382. with `module_api_version' set to + ‘PYTHON_API_VERSION’. + + -- C Function: *note PyObject: 4cf. *PyModule_Create2 (PyModuleDef + *def, int module_api_version) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 *note + RuntimeWarning: 6ef. is emitted. + + Note: Most uses of this function should be using *note + PyModule_Create(): 4234. instead; only use this if you are + sure you need it. + +Before it is returned from in the initialization function, the resulting +module object is typically populated using functions like *note +PyModule_AddObjectRef(): 4c3. + + +File: python.info, Node: Multi-phase initialization, Next: Low-level module creation functions, Prev: Single-phase initialization, Up: Initializing C modules + +7.8.6.5 Multi-phase initialization +.................................. + +An alternate way to specify extensions is to request “multi-phase +initialization”. Extension modules created this way behave more like +Python modules: the initialization is split between the `creation +phase', when the module object is created, and the `execution phase', +when it is populated. The distinction is similar to the ‘__new__()’ and +‘__init__()’ methods of classes. + +Unlike modules created using single-phase initialization, these modules +are not singletons: if the `sys.modules' entry is removed and the module +is re-imported, a new module object is created, and the old module is +subject to normal garbage collection – as with Python modules. By +default, multiple modules created from the same definition should be +independent: changes to one should not affect the others. This means +that all state should be specific to the module object (using e.g. +using *note PyModule_GetState(): 5d5.), or its contents (such as the +module’s ‘__dict__’ or individual classes created with *note +PyType_FromSpec(): 5b8.). + +All modules created using multi-phase initialization are expected to +support *note sub-interpreters: 44b2. Making sure multiple modules are +independent is typically enough to achieve this. + +To request multi-phase initialization, the initialization function +(PyInit_modulename) returns a *note PyModuleDef: 5d2. instance with +non-empty *note m_slots: 462c. Before it is returned, the ‘PyModuleDef’ +instance must be initialized with the following function: + + -- C Function: *note PyObject: 4cf. *PyModuleDef_Init (PyModuleDef + *def) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8. since version 3.5.' Ensures a module definition is a properly + initialized Python object that correctly reports its type and + reference count. + + Returns `def' cast to ‘PyObject*’, or ‘NULL’ if an error occurred. + + New in version 3.5. + +The `m_slots' member of the module definition must point to an array of +‘PyModuleDef_Slot’ structures: + + -- C Type: type PyModuleDef_Slot + + -- C Member: int slot + + A slot ID, chosen from the available values explained below. + + -- C Member: void *value + + Value of the slot, whose meaning depends on the slot ID. + + New in version 3.5. + +The `m_slots' array must be terminated by a slot with id 0. + +The available slot types are: + + -- C Macro: Py_mod_create + + 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: + + -- C Function: *note PyObject: 4cf. *create_module (PyObject + *spec, PyModuleDef *def) + + The function receives a *note ModuleSpec: 19b8. instance, as + defined in PEP 451(1), and the module definition. It should return + a new module object, or set an error and return ‘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 ‘Py_mod_create’ slots may not be specified in one module + definition. + + If ‘Py_mod_create’ is not specified, the import machinery will + create a normal module object using *note PyModule_New(): 4389. + 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 *note PyModule_Type: 438c. Any type can be used, as long as it + supports setting and getting import-related attributes. However, + only ‘PyModule_Type’ instances may be returned if the ‘PyModuleDef’ + has non-‘NULL’ ‘m_traverse’, ‘m_clear’, ‘m_free’; non-zero + ‘m_size’; or slots other than ‘Py_mod_create’. + + -- C Macro: Py_mod_exec + + 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: + + -- C Function: int exec_module (PyObject *module) + + If multiple ‘Py_mod_exec’ slots are specified, they are processed + in the order they appear in the `m_slots' array. + +See PEP 489(2) for more details on multi-phase initialization. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0451/ + + (2) https://peps.python.org/pep-0489/ + + +File: python.info, Node: Low-level module creation functions, Next: Support functions, Prev: Multi-phase initialization, Up: Initializing C modules + +7.8.6.6 Low-level module creation functions +........................................... + +The following functions are called under the hood when using multi-phase +initialization. They can be used directly, for example when creating +module objects dynamically. Note that both ‘PyModule_FromDefAndSpec’ +and ‘PyModule_ExecDef’ must be called to fully initialize a module. + + -- C Function: *note PyObject: 4cf. *PyModule_FromDefAndSpec + (PyModuleDef *def, PyObject *spec) + `Return value: New reference.' Create a new module object, given + the definition in `module' and the ModuleSpec `spec'. This behaves + like *note PyModule_FromDefAndSpec2(): b41. with + `module_api_version' set to ‘PYTHON_API_VERSION’. + + New in version 3.5. + + -- C Function: *note PyObject: 4cf. *PyModule_FromDefAndSpec2 + (PyModuleDef *def, PyObject *spec, int module_api_version) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Create a new module object, given the + definition in `module' and the ModuleSpec `spec', assuming the API + version `module_api_version'. If that version does not match the + version of the running interpreter, a *note RuntimeWarning: 6ef. is + emitted. + + Note: Most uses of this function should be using *note + PyModule_FromDefAndSpec(): b40. instead; only use this if you + are sure you need it. + + New in version 3.5. + + -- C Function: int PyModule_ExecDef (PyObject *module, PyModuleDef + *def) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Process + any execution slots (*note Py_mod_exec: 5d3.) given in `def'. + + New in version 3.5. + + -- C Function: int PyModule_SetDocString (PyObject *module, const char + *docstring) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Set the + docstring for `module' to `docstring'. This function is called + automatically when creating a module from ‘PyModuleDef’, using + either ‘PyModule_Create’ or ‘PyModule_FromDefAndSpec’. + + New in version 3.5. + + -- C Function: int PyModule_AddFunctions (PyObject *module, PyMethodDef + *functions) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Add the + functions from the ‘NULL’ terminated `functions' array to `module'. + Refer to the *note PyMethodDef: 1119. 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 ‘PyModuleDef’, using either + ‘PyModule_Create’ or ‘PyModule_FromDefAndSpec’. + + New in version 3.5. + + +File: python.info, Node: Support functions, Prev: Low-level module creation functions, Up: Initializing C modules + +7.8.6.7 Support functions +......................... + +The module initialization function (if using single phase +initialization) or a function called from a module execution slot (if +using multi-phase initialization), can use the following functions to +help initialize the module state: + + -- C Function: int PyModule_AddObjectRef (PyObject *module, const char + *name, PyObject *value) + ` Part of the *note Stable ABI: 4b8. 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 ‘0’. On error, raise an exception and return + ‘-1’. + + Return ‘NULL’ if `value' is ‘NULL’. It must be called with an + exception raised in this case. + + Example usage: + + 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; + } + + The example can also be written without checking explicitly if + `obj' is ‘NULL’: + + 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; + } + + Note that ‘Py_XDECREF()’ should be used instead of ‘Py_DECREF()’ in + this case, since `obj' can be ‘NULL’. + + New in version 3.10. + + -- C Function: int PyModule_AddObject (PyObject *module, const char + *name, PyObject *value) + ` Part of the *note Stable ABI: 4b8.' Similar to *note + PyModule_AddObjectRef(): 4c3, but steals a reference to `value' on + success (if it returns ‘0’). + + The new *note PyModule_AddObjectRef(): 4c3. function is + recommended, since it is easy to introduce reference leaks by + misusing the *note PyModule_AddObject(): 4c4. function. + + Note: Unlike other functions that steal references, + ‘PyModule_AddObject()’ only decrements the reference count of + `value' `on success'. + + This means that its return value must be checked, and calling + code must *note Py_DECREF(): 4cd. `value' manually on error. + + Example usage: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (obj == NULL) { + return -1; + } + if (PyModule_AddObject(module, "spam", obj) < 0) { + Py_DECREF(obj); + return -1; + } + // PyModule_AddObject() stole a reference to obj: + // Py_DECREF(obj) is not needed here + return 0; + } + + The example can also be written without checking explicitly if + `obj' is ‘NULL’: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (PyModule_AddObject(module, "spam", obj) < 0) { + Py_XDECREF(obj); + return -1; + } + // PyModule_AddObject() stole a reference to obj: + // Py_DECREF(obj) is not needed here + return 0; + } + + Note that ‘Py_XDECREF()’ should be used instead of ‘Py_DECREF()’ in + this case, since `obj' can be ‘NULL’. + + -- C Function: int PyModule_AddIntConstant (PyObject *module, const + char *name, long value) + ` Part of the *note Stable ABI: 4b8.' Add an integer constant to + `module' as `name'. This convenience function can be used from the + module’s initialization function. Return ‘-1’ on error, ‘0’ on + success. + + -- C Function: int PyModule_AddStringConstant (PyObject *module, const + char *name, const char *value) + ` Part of the *note Stable ABI: 4b8.' 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 + ‘NULL’-terminated. Return ‘-1’ on error, ‘0’ on success. + + -- C Function: int PyModule_AddIntMacro (PyObject *module, macro) + + Add an int constant to `module'. The name and the value are taken + from `macro'. For example ‘PyModule_AddIntMacro(module, AF_INET)’ + adds the int constant `AF_INET' with the value of `AF_INET' to + `module'. Return ‘-1’ on error, ‘0’ on success. + + -- C Function: int PyModule_AddStringMacro (PyObject *module, macro) + + Add a string constant to `module'. + + -- C Function: int PyModule_AddType (PyObject *module, PyTypeObject + *type) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Add a + type object to `module'. The type object is finalized by calling + internally *note PyType_Ready(): 350. The name of the type object + is taken from the last component of *note tp_name: 12f9. after dot. + Return ‘-1’ on error, ‘0’ on success. + + New in version 3.9. + + +File: python.info, Node: Module lookup, Prev: Initializing C modules, Up: Module Objects + +7.8.6.8 Module lookup +..................... + +Single-phase initialization 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. + + -- C Function: *note PyObject: 4cf. *PyState_FindModule (PyModuleDef + *def) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' 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 *note + PyState_AddModule(): 43e2. beforehand. In case the corresponding + module object is not found or has not been attached to the + interpreter state yet, it returns ‘NULL’. + + -- C Function: int PyState_AddModule (PyObject *module, PyModuleDef + *def) + ` Part of the *note Stable ABI: 4b8. 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 *note + PyState_FindModule(): 43e3. + + Only effective on modules created using single-phase + initialization. + + Python calls ‘PyState_AddModule’ automatically after importing a + module, 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 ‘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). + + The caller must hold the GIL. + + Return 0 on success or -1 on failure. + + New in version 3.3. + + -- C Function: int PyState_RemoveModule (PyModuleDef *def) + ` Part of the *note Stable ABI: 4b8. since version 3.3.' Removes + the module object created from `def' from the interpreter state. + Return 0 on success or -1 on failure. + + The caller must hold the GIL. + + New in version 3.3. + + +File: python.info, Node: Iterator Objects, Next: Descriptor Objects, Prev: Module Objects, Up: Other Objects + +7.8.6.9 Iterator Objects +........................ + +Python provides two general-purpose iterator objects. The first, a +sequence iterator, works with an arbitrary sequence supporting the +‘__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. + + -- C Variable: *note PyTypeObject: 701. PySeqIter_Type + ` Part of the *note Stable ABI: 4b8.' Type object for iterator + objects returned by *note PySeqIter_New(): 43cb. and the + one-argument form of the *note iter(): 3c6. built-in function for + built-in sequence types. + + -- C Function: int PySeqIter_Check (op) + + Return true if the type of `op' is *note PySeqIter_Type: 43cc. + This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PySeqIter_New (PyObject *seq) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Return an iterator that works with a general sequence + object, `seq'. The iteration ends when the sequence raises *note + IndexError: 116b. for the subscripting operation. + + -- C Variable: *note PyTypeObject: 701. PyCallIter_Type + ` Part of the *note Stable ABI: 4b8.' Type object for iterator + objects returned by *note PyCallIter_New(): 42f4. and the + two-argument form of the *note iter(): 3c6. built-in function. + + -- C Function: int PyCallIter_Check (op) + + Return true if the type of `op' is *note PyCallIter_Type: 42f5. + This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PyCallIter_New (PyObject + *callable, PyObject *sentinel) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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. + + +File: python.info, Node: Descriptor Objects, Next: Slice Objects, Prev: Iterator Objects, Up: Other Objects + +7.8.6.10 Descriptor Objects +........................... + +“Descriptors” are objects that describe some attribute of an object. +They are found in the dictionary of type objects. + + -- C Variable: *note PyTypeObject: 701. PyProperty_Type + ` Part of the *note Stable ABI: 4b8.' The type object for the + built-in descriptor types. + + -- C Function: *note PyObject: 4cf. *PyDescr_NewGetSet (PyTypeObject + *type, struct PyGetSetDef *getset) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + -- C Function: *note PyObject: 4cf. *PyDescr_NewMember (PyTypeObject + *type, struct PyMemberDef *meth) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + -- C Function: *note PyObject: 4cf. *PyDescr_NewMethod (PyTypeObject + *type, struct PyMethodDef *meth) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + -- C Function: *note PyObject: 4cf. *PyDescr_NewWrapper (PyTypeObject + *type, struct wrapperbase *wrapper, void *wrapped) + `Return value: New reference.' + + -- C Function: *note PyObject: 4cf. *PyDescr_NewClassMethod + (PyTypeObject *type, PyMethodDef *method) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + -- C Function: int PyDescr_IsData (PyObject *descr) + + Return non-zero if the descriptor objects `descr' describes a data + attribute, or ‘0’ if it describes a method. `descr' must be a + descriptor object; there is no error checking. + + -- C Function: *note PyObject: 4cf. *PyWrapper_New (PyObject*, + PyObject*) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' + + +File: python.info, Node: Slice Objects, Next: Ellipsis Object, Prev: Descriptor Objects, Up: Other Objects + +7.8.6.11 Slice Objects +...................... + + -- C Variable: *note PyTypeObject: 701. PySlice_Type + ` Part of the *note Stable ABI: 4b8.' The type object for slice + objects. This is the same as *note slice: 1100. in the Python + layer. + + -- C Function: int PySlice_Check (PyObject *ob) + + Return true if `ob' is a slice object; `ob' must not be ‘NULL’. + This function always succeeds. + + -- C Function: *note PyObject: 4cf. *PySlice_New (PyObject *start, + PyObject *stop, PyObject *step) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘NULL’, in which case the ‘None’ will be used for the + corresponding attribute. Return ‘NULL’ if the new object could not + be allocated. + + -- 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 *note Stable ABI: 4b8.' 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 ‘0’ on success and ‘-1’ on error with no exception set + (unless one of the indices was not *note None: 243. and failed to + be converted to an integer, in which case ‘-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 ‘PySliceObject*’ before. + + -- 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 *note Stable ABI: 4b8.' Usable replacement for *note + PySlice_GetIndices(): 43df. 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. + + Returns ‘0’ on success and ‘-1’ on error with exception set. + + Note: This function is considered not safe for resizable + sequences. Its invocation should be replaced by a combination + of *note PySlice_Unpack(): 822. and *note + PySlice_AdjustIndices(): 823. where + + if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) { + // return error + } + + is replaced by + + if (PySlice_Unpack(slice, &start, &stop, &step) < 0) { + // return error + } + slicelength = PySlice_AdjustIndices(length, &start, &stop, step); + + Changed in version 3.2: The parameter type for the `slice' + parameter was ‘PySliceObject*’ before. + + Changed in version 3.6.1: If ‘Py_LIMITED_API’ is not set or set to + the value between ‘0x03050400’ and ‘0x03060000’ (not including) or + ‘0x03060100’ or higher ‘PySlice_GetIndicesEx()’ is implemented as a + macro using ‘PySlice_Unpack()’ and ‘PySlice_AdjustIndices()’. + Arguments `start', `stop' and `step' are evaluated more than once. + + Deprecated since version 3.6.1: If ‘Py_LIMITED_API’ is set to the + value less than ‘0x03050400’ or between ‘0x03060000’ and + ‘0x03060100’ (not including) ‘PySlice_GetIndicesEx()’ is a + deprecated function. + + -- C Function: int PySlice_Unpack (PyObject *slice, Py_ssize_t *start, + Py_ssize_t *stop, Py_ssize_t *step) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Extract + the start, stop and step data members from a slice object as C + integers. Silently reduce values larger than ‘PY_SSIZE_T_MAX’ to + ‘PY_SSIZE_T_MAX’, silently boost the start and stop values less + than ‘PY_SSIZE_T_MIN’ to ‘PY_SSIZE_T_MIN’, and silently boost the + step values less than ‘-PY_SSIZE_T_MAX’ to ‘-PY_SSIZE_T_MAX’. + + Return ‘-1’ on error, ‘0’ on success. + + New in version 3.6.1. + + -- C Function: *note Py_ssize_t: 6b1. PySlice_AdjustIndices (Py_ssize_t + length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step) + ` Part of the *note Stable ABI: 4b8. 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. + + New in version 3.6.1. + + +File: python.info, Node: Ellipsis Object, Next: MemoryView objects, Prev: Slice Objects, Up: Other Objects + +7.8.6.12 Ellipsis Object +........................ + + -- C Variable: *note PyObject: 4cf. *Py_Ellipsis + + The Python ‘Ellipsis’ object. This object has no methods. It + needs to be treated just like any other object with respect to + reference counts. Like *note Py_None: 4231. it is a singleton + object. + + +File: python.info, Node: MemoryView objects, Next: Weak Reference Objects<2>, Prev: Ellipsis Object, Up: Other Objects + +7.8.6.13 MemoryView objects +........................... + +A *note memoryview: 6ad. object exposes the C level *note buffer +interface: 1ba6. as a Python object which can then be passed around like +any other object. + + -- C Function: *note PyObject: 4cf. *PyMemoryView_FromObject (PyObject + *obj) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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. + + -- C Function: *note PyObject: 4cf. *PyMemoryView_FromMemory (char + *mem, Py_ssize_t size, int flags) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.7.' Create a memoryview object using `mem' as the + underlying buffer. `flags' can be one of ‘PyBUF_READ’ or + ‘PyBUF_WRITE’. + + New in version 3.3. + + -- C Function: *note PyObject: 4cf. *PyMemoryView_FromBuffer (const + Py_buffer *view) + `Return value: New reference.'` Part of the *note Stable ABI: 4b8. + since version 3.11.' Create a memoryview object wrapping the given + buffer structure `view'. For simple byte buffers, *note + PyMemoryView_FromMemory(): e24. is the preferred function. + + -- C Function: *note PyObject: 4cf. *PyMemoryView_GetContiguous + (PyObject *obj, int buffertype, char order) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a memoryview object to a *note contiguous: 1c79. + 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. + + -- 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 *note memoryview: 6ad. + This function always succeeds. + + -- C Function: *note Py_buffer: 327. *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. + + -- C Function: *note PyObject: 4cf. *PyMemoryView_GET_BASE (PyObject + *mview) + + Return either a pointer to the exporting object that the memoryview + is based on or ‘NULL’ if the memoryview has been created by one of + the functions *note PyMemoryView_FromMemory(): e24. or *note + PyMemoryView_FromBuffer(): 332. `mview' `must' be a memoryview + instance. + + +File: python.info, Node: Weak Reference Objects<2>, Next: Capsules<2>, Prev: MemoryView objects, Up: Other Objects + +7.8.6.14 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. + + -- C Function: int PyWeakref_Check (ob) + + Return true if `ob' is either a reference or proxy object. This + function always succeeds. + + -- C Function: int PyWeakref_CheckRef (ob) + + Return true if `ob' is a reference object. This function always + succeeds. + + -- C Function: int PyWeakref_CheckProxy (ob) + + Return true if `ob' is a proxy object. This function always + succeeds. + + -- C Function: *note PyObject: 4cf. *PyWeakref_NewRef (PyObject *ob, + PyObject *callback) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘None’ or ‘NULL’. If `ob' is not a + weakly referencable object, or if `callback' is not callable, + ‘None’, or ‘NULL’, this will return ‘NULL’ and raise *note + TypeError: 19c. + + -- C Function: *note PyObject: 4cf. *PyWeakref_NewProxy (PyObject *ob, + PyObject *callback) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' 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 ‘None’ or ‘NULL’. If `ob' is not a + weakly referencable object, or if `callback' is not callable, + ‘None’, or ‘NULL’, this will return ‘NULL’ and raise *note + TypeError: 19c. + + -- C Function: *note PyObject: 4cf. *PyWeakref_GetObject (PyObject + *ref) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Return the referenced object from a weak reference, `ref'. + If the referent is no longer live, returns ‘Py_None’. + + Note: This function returns a *note borrowed reference: 42cb. + to the referenced object. This means that you should always + call *note Py_INCREF(): 4cc. on the object except when it + cannot be destroyed before the last usage of the borrowed + reference. + + -- C Function: *note PyObject: 4cf. *PyWeakref_GET_OBJECT (PyObject + *ref) + `Return value: Borrowed reference.' Similar to *note + PyWeakref_GetObject(): 4449, but does no error checking. + + +File: python.info, Node: Capsules<2>, Next: Frame Objects, Prev: Weak Reference Objects<2>, Up: Other Objects + +7.8.6.15 Capsules +................. + +Refer to *note Providing a C API for an Extension Module: ff8. for more +information on using these objects. + +New in version 3.1. + + -- C Type: type PyCapsule + + This subtype of *note PyObject: 4cf. represents an opaque value, + useful for C extension modules who 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. + + -- C Type: type PyCapsule_Destructor + ` Part of the *note Stable ABI: 4b8.' The type of a destructor + callback for a capsule. Defined as: + + typedef void (*PyCapsule_Destructor)(PyObject *); + + See *note PyCapsule_New(): 4256. for the semantics of + PyCapsule_Destructor callbacks. + + -- C Function: int PyCapsule_CheckExact (PyObject *p) + + Return true if its argument is a *note PyCapsule: f2b. This + function always succeeds. + + -- C Function: *note PyObject: 4cf. *PyCapsule_New (void *pointer, + const char *name, PyCapsule_Destructor destructor) + `Return value: New reference.'` Part of the *note Stable ABI: + 4b8.' Create a *note PyCapsule: f2b. encapsulating the `pointer'. + The `pointer' argument may not be ‘NULL’. + + On failure, set an exception and return ‘NULL’. + + The `name' string may either be ‘NULL’ or a pointer to a valid C + string. If non-‘NULL’, this string must outlive the capsule. + (Though it is permitted to free it inside the `destructor'.) + + If the `destructor' argument is not ‘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 ‘modulename.attributename’. This + will enable other modules to import the capsule using *note + PyCapsule_Import(): 1266. + + -- C Function: void *PyCapsule_GetPointer (PyObject *capsule, const + char *name) + ` Part of the *note Stable ABI: 4b8.' Retrieve the `pointer' + stored in the capsule. On failure, set an exception and return + ‘NULL’. + + The `name' parameter must compare exactly to the name stored in the + capsule. If the name stored in the capsule is ‘NULL’, the `name' + passed in must also be ‘NULL’. Python uses the C function + ‘strcmp()’ to compare capsule names. + + -- C Function: *note PyCapsule_Destructor: 42f7. + PyCapsule_GetDestructor (PyObject *capsule) + ` Part of the *note Stable ABI: 4b8.' Return the current + destructor stored in the capsule. On failure, set an exception and + return ‘NULL’. + + It is legal for a capsule to have a ‘NULL’ destructor. This makes + a ‘NULL’ return code somewhat ambiguous; use *note + PyCapsule_IsValid(): ff7. or *note PyErr_Occurred(): 12f8. to + disambiguate. + + -- C Function: void *PyCapsule_GetContext (PyObject *capsule) + ` Part of the *note Stable ABI: 4b8.' Return the current context + stored in the capsule. On failure, set an exception and return + ‘NULL’. + + It is legal for a capsule to have a ‘NULL’ context. This makes a + ‘NULL’ return code somewhat ambiguous; use *note + PyCapsule_IsValid(): ff7. or *note PyErr_Occurred(): 12f8. to + disambiguate. + + -- C Function: const char *PyCapsule_GetName (PyObject *capsule) + ` Part of the *note Stable ABI: 4b8.' Return the current name + stored in the capsule. On failure, set an exception and return + ‘NULL’. + + It is legal for a capsule to have a ‘NULL’ name. This makes a + ‘NULL’ return code somewhat ambiguous; use *note + PyCapsule_IsValid(): ff7. or *note PyErr_Occurred(): 12f8. to + disambiguate. + + -- C Function: void *PyCapsule_Import (const char *name, int no_block) + ` Part of the *note Stable ABI: 4b8.' 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 + ‘module.attribute’. The `name' stored in the capsule must match + this string exactly. + + Return the capsule’s internal `pointer' on success. On failure, + set an exception and return ‘NULL’. + + Changed in version 3.3: `no_block' has no effect anymore. + + -- C Function: int PyCapsule_IsValid (PyObject *capsule, const char + *name) + ` Part of the *note Stable ABI: 4b8.' Determines whether or not + `capsule' is a valid capsule. A valid capsule is non-‘NULL’, + passes *note PyCapsule_CheckExact(): 4656, has a non-‘NULL’ pointer + stored in it, and its internal name matches the `name' parameter. + (See *note PyCapsule_GetPointer(): 42fb. for information on how + capsule names are compared.) + + In other words, if *note PyCapsule_IsValid(): ff7. returns a true + value, calls to any of the accessors (any function starting with + ‘PyCapsule_Get()’) are guaranteed to succeed. + + Return a nonzero value if the object is valid and matches the name + passed in. Return ‘0’ otherwise. This function will not fail. + + -- C Function: int PyCapsule_SetContext (PyObject *capsule, void + *context) + ` Part of the *note Stable ABI: 4b8.' Set the context pointer + inside `capsule' to `context'. + + Return ‘0’ on success. Return nonzero and set an exception on + failure. + + -- C Function: int PyCapsule_SetDestructor (PyObject *capsule, + PyCapsule_Destructor destructor) + ` Part of the *note Stable ABI: 4b8.' Set the destructor inside + `capsule' to `destructor'. + + Return ‘0’ on success. Return nonzero and set an exception on + failure. + + -- C Function: int PyCapsule_SetName (PyObject *capsule, const char + *name) + ` Part of the *note Stable ABI: 4b8.' Set the name inside + `capsule' to `name'. If non-‘NULL’, the name must outlive the + capsule. If the previous `name' stored in the capsule was not + ‘NULL’, no attempt is made to free it. + + Return ‘0’ on success. Return nonzero and set an exception on + failure. + + -- C Function: int PyCapsule_SetPointer (PyObject *capsule, void + *pointer) + ` Part of the *note Stable ABI: 4b8.' Set the void pointer inside + `capsule' to `pointer'. The pointer may not be ‘NULL’. + + Return ‘0’ on success. Return nonzero and set an exception on + failure. + + +File: python.info, Node: Frame Objects, Next: Generator Objects, Prev: Capsules<2>, Up: Other Objects + +7.8.6.16 Frame Objects +...................... + + -- C Type: type PyFrameObject + ` Part of the *note Limited API: 4b8. (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 *note What’s New entry: 35c. + for details. + +The *note PyEval_GetFrame(): 1182. and *note PyThreadState_GetFrame(): +361. functions can be used to get a frame object. + +See also *note Reflection: 44d8. + + -- C Function: *note PyFrameObject: 35d. *PyFrame_GetBack + (PyFrameObject *frame) + + Get the `frame' next outer frame. + + Return a *note strong reference: 362, or ‘NULL’ if `frame' has no + outer frame. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyFrame_GetBuiltins (PyFrameObject + *frame) + + Get the `frame'’s ‘f_builtins’ attribute. + + Return a *note strong reference: 362. The result cannot be ‘NULL’. + + New in version 3.11. + + -- C Function: *note PyCodeObject: 34b. *PyFrame_GetCode (PyFrameObject + *frame) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Get the + `frame' code. + + Return a *note strong reference: 362. + + The result (frame code) cannot be ‘NULL’. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyFrame_GetGenerator + (PyFrameObject *frame) + + Get the generator, coroutine, or async generator that owns this + frame, or ‘NULL’ if this frame is not owned by a generator. Does + not raise an exception, even if the return value is ‘NULL’. + + Return a *note strong reference: 362, or ‘NULL’. + + New in version 3.11. + + -- C Function: *note PyObject: 4cf. *PyFrame_GetGlobals (PyFrameObject + *frame) + + Get the `frame'’s ‘f_globals’ attribute. + + Return a *note strong reference: 362. The result cannot be ‘NULL’. + + New in version 3.11. + + -- C Function: int PyFrame_GetLasti (PyFrameObject *frame) + + Get the `frame'’s ‘f_lasti’ attribute. + + Returns -1 if ‘frame.f_lasti’ is ‘None’. + + New in version 3.11. + + -- C Function: *note PyObject: 4cf. *PyFrame_GetLocals (PyFrameObject + *frame) + + Get the `frame'’s ‘f_locals’ attribute (*note dict: 16e.). + + Return a *note strong reference: 362. + + New in version 3.11. + + -- C Function: int PyFrame_GetLineNumber (PyFrameObject *frame) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Return + the line number that `frame' is currently executing. + + +File: python.info, Node: Generator Objects, Next: Coroutine Objects<2>, Prev: Frame Objects, Up: Other Objects + +7.8.6.17 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 *note PyGen_New(): 465c. or *note +PyGen_NewWithQualName(): 465d. + + -- C Type: type PyGenObject + + The C structure used for generator objects. + + -- C Variable: *note PyTypeObject: 701. PyGen_Type + + The type object corresponding to generator objects. + + -- C Function: int PyGen_Check (PyObject *ob) + + Return true if `ob' is a generator object; `ob' must not be ‘NULL’. + This function always succeeds. + + -- C Function: int PyGen_CheckExact (PyObject *ob) + + Return true if `ob'’s type is *note PyGen_Type: 465f.; `ob' must + not be ‘NULL’. This function always succeeds. + + -- C Function: *note PyObject: 4cf. *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 ‘NULL’. + + -- C Function: *note PyObject: 4cf. *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 ‘__name__’ and + ‘__qualname__’ set to `name' and `qualname'. A reference to + `frame' is stolen by this function. The `frame' argument must not + be ‘NULL’. + + +File: python.info, Node: Coroutine Objects<2>, Next: Context Variables Objects, Prev: Generator Objects, Up: Other Objects + +7.8.6.18 Coroutine Objects +.......................... + +New in version 3.5. + +Coroutine objects are what functions declared with an ‘async’ keyword +return. + + -- C Type: type PyCoroObject + + The C structure used for coroutine objects. + + -- C Variable: *note PyTypeObject: 701. PyCoro_Type + + The type object corresponding to coroutine objects. + + -- C Function: int PyCoro_CheckExact (PyObject *ob) + + Return true if `ob'’s type is *note PyCoro_Type: 4665.; `ob' must + not be ‘NULL’. This function always succeeds. + + -- C Function: *note PyObject: 4cf. *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 ‘__name__’ and + ‘__qualname__’ set to `name' and `qualname'. A reference to + `frame' is stolen by this function. The `frame' argument must not + be ‘NULL’. + + +File: python.info, Node: Context Variables Objects, Next: DateTime Objects<2>, Prev: Coroutine Objects<2>, Up: Other Objects + +7.8.6.19 Context Variables Objects +.................................. + +Changed in version 3.7.1: + + Note: In Python 3.7.1 the signatures of all context variables C + APIs were `changed' to use *note PyObject: 4cf. pointers instead of + *note PyContext: 466a, *note PyContextVar: 466b, and *note + PyContextToken: 466c, e.g.: + + // in 3.7.0: + PyContext *PyContext_New(void); + + // in 3.7.1+: + PyObject *PyContext_New(void); + + See bpo-34762(1) for more details. + +New in version 3.7. + +This section details the public C API for the *note contextvars: 23. +module. + + -- C Type: type PyContext + + The C structure used to represent a *note contextvars.Context: + 2a9c. object. + + -- C Type: type PyContextVar + + The C structure used to represent a *note contextvars.ContextVar: + 2a9a. object. + + -- C Type: type PyContextToken + + The C structure used to represent a *note contextvars.Token: 2aa1. + object. + + -- C Variable: *note PyTypeObject: 701. PyContext_Type + + The type object representing the `context' type. + + -- C Variable: *note PyTypeObject: 701. PyContextVar_Type + + The type object representing the `context variable' type. + + -- C Variable: *note PyTypeObject: 701. PyContextToken_Type + + The type object representing the `context variable token' type. + +Type-check macros: + + -- C Function: int PyContext_CheckExact (PyObject *o) + + Return true if `o' is of type *note PyContext_Type: 466d. `o' must + not be ‘NULL’. This function always succeeds. + + -- C Function: int PyContextVar_CheckExact (PyObject *o) + + Return true if `o' is of type *note PyContextVar_Type: 466e. `o' + must not be ‘NULL’. This function always succeeds. + + -- C Function: int PyContextToken_CheckExact (PyObject *o) + + Return true if `o' is of type *note PyContextToken_Type: 466f. `o' + must not be ‘NULL’. This function always succeeds. + +Context object management functions: + + -- C Function: *note PyObject: 4cf. *PyContext_New (void) + `Return value: New reference.' Create a new empty context object. + Returns ‘NULL’ if an error has occurred. + + -- C Function: *note PyObject: 4cf. *PyContext_Copy (PyObject *ctx) + `Return value: New reference.' Create a shallow copy of the passed + `ctx' context object. Returns ‘NULL’ if an error has occurred. + + -- C Function: *note PyObject: 4cf. *PyContext_CopyCurrent (void) + `Return value: New reference.' Create a shallow copy of the + current thread context. Returns ‘NULL’ if an error has occurred. + + -- C Function: int PyContext_Enter (PyObject *ctx) + + Set `ctx' as the current context for the current thread. Returns + ‘0’ on success, and ‘-1’ on error. + + -- 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 ‘0’ on + success, and ‘-1’ on error. + +Context variable functions: + + -- C Function: *note PyObject: 4cf. *PyContextVar_New (const char + *name, PyObject *def) + `Return value: New reference.' Create a new ‘ContextVar’ object. + The `name' parameter is used for introspection and debug purposes. + The `def' parameter specifies a default value for the context + variable, or ‘NULL’ for no default. If an error has occurred, this + function returns ‘NULL’. + + -- C Function: int PyContextVar_Get (PyObject *var, PyObject + *default_value, PyObject **value) + + Get the value of a context variable. Returns ‘-1’ if an error has + occurred during lookup, and ‘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: + + - `default_value', if not ‘NULL’; + + - the default value of `var', if not ‘NULL’; + + - ‘NULL’ + + Except for ‘NULL’, the function returns a new reference. + + -- C Function: *note PyObject: 4cf. *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 ‘NULL’ if an error has occurred. + + -- C Function: int PyContextVar_Reset (PyObject *var, PyObject *token) + + Reset the state of the `var' context variable to that it was in + before *note PyContextVar_Set(): 467a. that returned the `token' + was called. This function returns ‘0’ on success and ‘-1’ on + error. + + ---------- Footnotes ---------- + + (1) https://bugs.python.org/issue?@action=redirect&bpo=34762 + + +File: python.info, Node: DateTime Objects<2>, Next: Objects for Type Hinting, Prev: Context Variables Objects, Up: Other Objects + +7.8.6.20 DateTime Objects +......................... + +Various date and time objects are supplied by the *note datetime: 2f. +module. Before using any of these functions, the header file +‘datetime.h’ must be included in your source (note that this is not +included by ‘Python.h’), and the macro ‘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, +‘PyDateTimeAPI’, that is used by the following macros. + +Macro for access to the UTC singleton: + + -- C Variable: *note PyObject: 4cf. *PyDateTime_TimeZone_UTC + + Returns the time zone singleton representing UTC, the same object + as *note datetime.timezone.utc: 1ec. + + New in version 3.7. + +Type-check macros: + + -- C Function: int PyDate_Check (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_DateType’ or a subtype + of ‘PyDateTime_DateType’. `ob' must not be ‘NULL’. This function + always succeeds. + + -- C Function: int PyDate_CheckExact (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_DateType’. `ob' must + not be ‘NULL’. This function always succeeds. + + -- C Function: int PyDateTime_Check (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_DateTimeType’ or a + subtype of ‘PyDateTime_DateTimeType’. `ob' must not be ‘NULL’. + This function always succeeds. + + -- C Function: int PyDateTime_CheckExact (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_DateTimeType’. `ob' + must not be ‘NULL’. This function always succeeds. + + -- C Function: int PyTime_Check (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_TimeType’ or a subtype + of ‘PyDateTime_TimeType’. `ob' must not be ‘NULL’. This function + always succeeds. + + -- C Function: int PyTime_CheckExact (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_TimeType’. `ob' must + not be ‘NULL’. This function always succeeds. + + -- C Function: int PyDelta_Check (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_DeltaType’ or a subtype + of ‘PyDateTime_DeltaType’. `ob' must not be ‘NULL’. This function + always succeeds. + + -- C Function: int PyDelta_CheckExact (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_DeltaType’. `ob' must + not be ‘NULL’. This function always succeeds. + + -- C Function: int PyTZInfo_Check (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_TZInfoType’ or a subtype + of ‘PyDateTime_TZInfoType’. `ob' must not be ‘NULL’. This + function always succeeds. + + -- C Function: int PyTZInfo_CheckExact (PyObject *ob) + + Return true if `ob' is of type ‘PyDateTime_TZInfoType’. `ob' must + not be ‘NULL’. This function always succeeds. + +Macros to create objects: + + -- C Function: *note PyObject: 4cf. *PyDate_FromDate (int year, int + month, int day) + `Return value: New reference.' Return a *note datetime.date: 536. + object with the specified year, month and day. + + -- C Function: *note PyObject: 4cf. *PyDateTime_FromDateAndTime (int + year, int month, int day, int hour, int minute, int second, + int usecond) + `Return value: New reference.' Return a *note datetime.datetime: + 4be. object with the specified year, month, day, hour, minute, + second and microsecond. + + -- C Function: *note PyObject: 4cf. *PyDateTime_FromDateAndTimeAndFold + (int year, int month, int day, int hour, int minute, int + second, int usecond, int fold) + `Return value: New reference.' Return a *note datetime.datetime: + 4be. object with the specified year, month, day, hour, minute, + second, microsecond and fold. + + New in version 3.6. + + -- C Function: *note PyObject: 4cf. *PyTime_FromTime (int hour, int + minute, int second, int usecond) + `Return value: New reference.' Return a *note datetime.time: 4bf. + object with the specified hour, minute, second and microsecond. + + -- C Function: *note PyObject: 4cf. *PyTime_FromTimeAndFold (int hour, + int minute, int second, int usecond, int fold) + `Return value: New reference.' Return a *note datetime.time: 4bf. + object with the specified hour, minute, second, microsecond and + fold. + + New in version 3.6. + + -- C Function: *note PyObject: 4cf. *PyDelta_FromDSU (int days, int + seconds, int useconds) + `Return value: New reference.' Return a *note datetime.timedelta: + 60f. 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 + *note datetime.timedelta: 60f. objects. + + -- C Function: *note PyObject: 4cf. *PyTimeZone_FromOffset + (PyDateTime_DeltaType *offset) + `Return value: New reference.' Return a *note datetime.timezone: + d6a. object with an unnamed fixed offset represented by the + `offset' argument. + + New in version 3.7. + + -- C Function: *note PyObject: 4cf. *PyTimeZone_FromOffsetAndName + (PyDateTime_DeltaType *offset, PyUnicode *name) + `Return value: New reference.' Return a *note datetime.timezone: + d6a. object with a fixed offset represented by the `offset' + argument and with tzname `name'. + + New in version 3.7. + +Macros to extract fields from date objects. The argument must be an +instance of ‘PyDateTime_Date’, including subclasses (such as +‘PyDateTime_DateTime’). The argument must not be ‘NULL’, and the type +is not checked: + + -- C Function: int PyDateTime_GET_YEAR (PyDateTime_Date *o) + + Return the year, as a positive int. + + -- C Function: int PyDateTime_GET_MONTH (PyDateTime_Date *o) + + Return the month, as an int from 1 through 12. + + -- C Function: int PyDateTime_GET_DAY (PyDateTime_Date *o) + + Return the day, as an int from 1 through 31. + +Macros to extract fields from datetime objects. The argument must be an +instance of ‘PyDateTime_DateTime’, including subclasses. The argument +must not be ‘NULL’, and the type is not checked: + + -- C Function: int PyDateTime_DATE_GET_HOUR (PyDateTime_DateTime *o) + + Return the hour, as an int from 0 through 23. + + -- C Function: int PyDateTime_DATE_GET_MINUTE (PyDateTime_DateTime *o) + + Return the minute, as an int from 0 through 59. + + -- C Function: int PyDateTime_DATE_GET_SECOND (PyDateTime_DateTime *o) + + Return the second, as an int from 0 through 59. + + -- C Function: int PyDateTime_DATE_GET_MICROSECOND (PyDateTime_DateTime + *o) + + Return the microsecond, as an int from 0 through 999999. + + -- C Function: int PyDateTime_DATE_GET_FOLD (PyDateTime_DateTime *o) + + Return the fold, as an int from 0 through 1. + + New in version 3.6. + + -- C Function: *note PyObject: 4cf. *PyDateTime_DATE_GET_TZINFO + (PyDateTime_DateTime *o) + + Return the tzinfo (which may be ‘None’). + + New in version 3.10. + +Macros to extract fields from time objects. The argument must be an +instance of ‘PyDateTime_Time’, including subclasses. The argument must +not be ‘NULL’, and the type is not checked: + + -- C Function: int PyDateTime_TIME_GET_HOUR (PyDateTime_Time *o) + + Return the hour, as an int from 0 through 23. + + -- C Function: int PyDateTime_TIME_GET_MINUTE (PyDateTime_Time *o) + + Return the minute, as an int from 0 through 59. + + -- C Function: int PyDateTime_TIME_GET_SECOND (PyDateTime_Time *o) + + Return the second, as an int from 0 through 59. + + -- C Function: int PyDateTime_TIME_GET_MICROSECOND (PyDateTime_Time *o) + + Return the microsecond, as an int from 0 through 999999. + + -- C Function: int PyDateTime_TIME_GET_FOLD (PyDateTime_Time *o) + + Return the fold, as an int from 0 through 1. + + New in version 3.6. + + -- C Function: *note PyObject: 4cf. *PyDateTime_TIME_GET_TZINFO + (PyDateTime_Time *o) + + Return the tzinfo (which may be ‘None’). + + New in version 3.10. + +Macros to extract fields from time delta objects. The argument must be +an instance of ‘PyDateTime_Delta’, including subclasses. The argument +must not be ‘NULL’, and the type is not checked: + + -- C Function: int PyDateTime_DELTA_GET_DAYS (PyDateTime_Delta *o) + + Return the number of days, as an int from -999999999 to 999999999. + + New in version 3.3. + + -- C Function: int PyDateTime_DELTA_GET_SECONDS (PyDateTime_Delta *o) + + Return the number of seconds, as an int from 0 through 86399. + + New in version 3.3. + + -- C Function: int PyDateTime_DELTA_GET_MICROSECONDS (PyDateTime_Delta + *o) + + Return the number of microseconds, as an int from 0 through 999999. + + New in version 3.3. + +Macros for the convenience of modules implementing the DB API: + + -- C Function: *note PyObject: 4cf. *PyDateTime_FromTimestamp (PyObject + *args) + `Return value: New reference.' Create and return a new *note + datetime.datetime: 4be. object given an argument tuple suitable for + passing to *note datetime.datetime.fromtimestamp(): 11d0. + + -- C Function: *note PyObject: 4cf. *PyDate_FromTimestamp (PyObject + *args) + `Return value: New reference.' Create and return a new *note + datetime.date: 536. object given an argument tuple suitable for + passing to *note datetime.date.fromtimestamp(): 1ea6. + + +File: python.info, Node: Objects for Type Hinting, Prev: DateTime Objects<2>, Up: Other Objects + +7.8.6.21 Objects for Type Hinting +................................. + +Various built-in types for type hinting are provided. Currently, two +types exist – *note GenericAlias: 278. and *note Union: 3ad. Only +‘GenericAlias’ is exposed to C. + + -- C Function: *note PyObject: 4cf. *Py_GenericAlias (PyObject *origin, + PyObject *args) + ` Part of the *note Stable ABI: 4b8. since version 3.9.' Create a + *note GenericAlias: 278. object. Equivalent to calling the Python + class *note types.GenericAlias: 3dd. The `origin' and `args' + arguments set the ‘GenericAlias’‘s ‘__origin__’ and ‘__args__’ + attributes respectively. `origin' should be a *note PyTypeObject: + 701.*, and `args' can be a *note PyTupleObject: 44b9.* or any + ‘PyObject*’. If `args' passed is not a tuple, a 1-tuple is + automatically constructed and ‘__args__’ is set to ‘(args,)’. + Minimal checking is done for the arguments, so the function will + succeed even if `origin' is not a type. The ‘GenericAlias’‘s + ‘__parameters__’ attribute is constructed lazily from ‘__args__’. + On failure, an exception is raised and ‘NULL’ is returned. + + Here’s an example of how to make an extension type generic: + + ... + static PyMethodDef my_obj_methods[] = { + // Other methods. + ... + {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, "See PEP 585"} + ... + } + + See also + ........ + + The data model method ‘__class_getitem__()’. + + New in version 3.9. + + -- C Variable: *note PyTypeObject: 701. Py_GenericAliasType + ` Part of the *note Stable ABI: 4b8. since version 3.9.' The C + type of the object returned by *note Py_GenericAlias(): 444f. + Equivalent to *note types.GenericAlias: 3dd. in Python. + + New in version 3.9. + + +File: python.info, Node: Initialization Finalization and Threads, Next: Python Initialization Configuration, Prev: Concrete Objects Layer, Up: Python/C API Reference Manual + +7.9 Initialization, Finalization, and Threads +============================================= + +See also *note Python Initialization Configuration: 371. + +* Menu: + +* Before Python Initialization:: +* Global configuration variables:: +* Initializing and finalizing the interpreter:: +* Process-wide parameters:: +* Thread State and the Global Interpreter Lock:: +* Sub-interpreter support:: +* Asynchronous Notifications:: +* Profiling and Tracing:: +* Advanced Debugger Support:: +* Thread Local Storage Support:: + + +File: python.info, Node: Before Python Initialization, Next: Global configuration variables, Up: Initialization Finalization and Threads + +7.9.1 Before Python Initialization +---------------------------------- + +In an application embedding Python, the *note Py_Initialize(): 4e7. +function must be called before using any other Python/C API functions; +with the exception of a few functions and the *note global configuration +variables: 46a7. + +The following functions can be safely called before Python is +initialized: + + * Configuration functions: + + * *note PyImport_AppendInittab(): 12bc. + + * *note PyImport_ExtendInittab(): 12bd. + + * ‘PyInitFrozenExtensions()’ + + * *note PyMem_SetAllocator(): 46a8. + + * *note PyMem_SetupDebugHooks(): 8da. + + * *note PyObject_SetArenaAllocator(): 46a9. + + * *note Py_SetPath(): 36c. + + * *note Py_SetProgramName(): 36d. + + * *note Py_SetPythonHome(): 36e. + + * *note Py_SetStandardStreamEncoding(): 36f. + + * *note PySys_AddWarnOption(): 367. + + * *note PySys_AddXOption(): 368. + + * *note PySys_ResetWarnOptions(): 43ec. + + * Informative functions: + + * *note Py_IsInitialized(): 42d6. + + * *note PyMem_GetAllocator(): 46aa. + + * *note PyObject_GetArenaAllocator(): 46ab. + + * *note Py_GetBuildInfo(): 1099. + + * *note Py_GetCompiler(): 4451. + + * *note Py_GetCopyright(): 4452. + + * *note Py_GetPlatform(): 4453. + + * *note Py_GetVersion(): 4454. + + * Utilities: + + * *note Py_DecodeLocale(): 82d. + + * Memory allocators: + + * *note PyMem_RawMalloc(): cdf. + + * *note PyMem_RawRealloc(): ce0. + + * *note PyMem_RawCalloc(): b3a. + + * *note PyMem_RawFree(): 44b3. + + Note: The following functions `should not be called' before *note + Py_Initialize(): 4e7.: *note Py_EncodeLocale(): 82e, *note + Py_GetPath(): 4e1, *note Py_GetPrefix(): 4e2, *note + Py_GetExecPrefix(): 4e3, *note Py_GetProgramFullPath(): 4e4, *note + Py_GetPythonHome(): 4e5, *note Py_GetProgramName(): 4e6. and *note + PyEval_InitThreads(): 592. + + +File: python.info, Node: Global configuration variables, Next: Initializing and finalizing the interpreter, Prev: Before Python Initialization, Up: Initialization Finalization and Threads + +7.9.2 Global configuration variables +------------------------------------ + +Python has variables for the global configuration to control different +features and options. By default, these flags are controlled by *note +command line options: 1768. + +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, ‘-b’ sets *note +Py_BytesWarningFlag: 88e. to 1 and ‘-bb’ sets *note Py_BytesWarningFlag: +88e. to 2. + + -- C Variable: int Py_BytesWarningFlag + + Issue a warning when comparing *note bytes: 1b4. or *note + bytearray: 1a5. with *note str: 1b3. or *note bytes: 1b4. with + *note int: 1c7. Issue an error if greater or equal to ‘2’. + + Set by the *note -b: 1b1. option. + + -- C Variable: int Py_DebugFlag + + Turn on parser debugging output (for expert only, depending on + compilation options). + + Set by the *note -d: 1772. option and the *note PYTHONDEBUG: 1773. + environment variable. + + -- C Variable: int Py_DontWriteBytecodeFlag + + If set to non-zero, Python won’t try to write ‘.pyc’ files on the + import of source modules. + + Set by the *note -B: 103a. option and the *note + PYTHONDONTWRITEBYTECODE: 103b. environment variable. + + -- C Variable: int Py_FrozenFlag + + Suppress error messages when calculating the module search path in + *note Py_GetPath(): 4e1. + + Private flag used by ‘_freeze_module’ and ‘frozenmain’ programs. + + -- C Variable: int Py_HashRandomizationFlag + + Set to ‘1’ if the *note PYTHONHASHSEED: d2e. environment variable + is set to a non-empty string. + + If the flag is non-zero, read the *note PYTHONHASHSEED: d2e. + environment variable to initialize the secret hash seed. + + -- C Variable: int Py_IgnoreEnvironmentFlag + + Ignore all ‘PYTHON*’ environment variables, e.g. *note PYTHONPATH: + cc7. and *note PYTHONHOME: 8ae, that might be set. + + Set by the *note -E: 5af. and *note -I: 5b0. options. + + -- C Variable: int Py_InspectFlag + + When a script is passed as first argument or the *note -c: 1ad. + option is used, enter interactive mode after executing the script + or the command, even when *note sys.stdin: 729. does not appear to + be a terminal. + + Set by the *note -i: 111d. option and the *note PYTHONINSPECT: + 111c. environment variable. + + -- C Variable: int Py_InteractiveFlag + + Set by the *note -i: 111d. option. + + -- C Variable: int Py_IsolatedFlag + + Run Python in isolated mode. In isolated mode *note sys.path: 162. + contains neither the script’s directory nor the user’s + site-packages directory. + + Set by the *note -I: 5b0. option. + + New in version 3.4. + + -- C Variable: int Py_LegacyWindowsFSEncodingFlag + + If the flag is non-zero, use the ‘mbcs’ encoding with ‘replace’ + error handler, instead of the UTF-8 encoding with ‘surrogatepass’ + error handler, for the *note filesystem encoding and error handler: + 1793. + + Set to ‘1’ if the *note PYTHONLEGACYWINDOWSFSENCODING: 8c9. + environment variable is set to a non-empty string. + + See PEP 529(1) for more details. + + *note Availability: 1794.: Windows. + + -- C Variable: int Py_LegacyWindowsStdioFlag + + If the flag is non-zero, use *note io.FileIO: faf. instead of + ‘WindowsConsoleIO’ for *note sys: f9. standard streams. + + Set to ‘1’ if the *note PYTHONLEGACYWINDOWSSTDIO: 8cc. environment + variable is set to a non-empty string. + + See PEP 528(2) for more details. + + *note Availability: 1794.: Windows. + + -- C Variable: int Py_NoSiteFlag + + Disable the import of the module *note site: e8. and the + site-dependent manipulations of *note sys.path: 162. that it + entails. Also disable these manipulations if *note site: e8. is + explicitly imported later (call *note site.main(): 177c. if you + want them to be triggered). + + Set by the *note -S: e5c. option. + + -- C Variable: int Py_NoUserSiteDirectory + + Don’t add the *note user site-packages directory: 177b. to *note + sys.path: 162. + + Set by the *note -s: 101c. and *note -I: 5b0. options, and the + *note PYTHONNOUSERSITE: 101d. environment variable. + + -- C Variable: int Py_OptimizeFlag + + Set by the *note -O: a34. option and the *note PYTHONOPTIMIZE: + 1776. environment variable. + + -- C Variable: int Py_QuietFlag + + Don’t display the copyright and version messages even in + interactive mode. + + Set by the *note -q: 1779. option. + + New in version 3.2. + + -- C Variable: int Py_UnbufferedStdioFlag + + Force the stdout and stderr streams to be unbuffered. + + Set by the *note -u: 13c1. option and the *note PYTHONUNBUFFERED: + 13c2. environment variable. + + -- C Variable: int Py_VerboseFlag + + 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 ‘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 *note -v: 1088. option and the *note PYTHONVERBOSE: + 177d. environment variable. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0529/ + + (2) https://peps.python.org/pep-0528/ + + +File: python.info, Node: Initializing and finalizing the interpreter, Next: Process-wide parameters, Prev: Global configuration variables, Up: Initialization Finalization and Threads + +7.9.3 Initializing and finalizing the interpreter +------------------------------------------------- + + -- C Function: void Py_Initialize () + ` Part of the *note Stable ABI: 4b8.' + + Initialize the Python interpreter. In an application embedding + Python, this should be called before using any other Python/C API + functions; see *note Before Python Initialization: 82b. for the few + exceptions. + + This initializes the table of loaded modules (‘sys.modules’), and + creates the fundamental modules *note builtins: 11, *note __main__: + 1. and *note sys: f9. It also initializes the module search path + (‘sys.path’). It does not set ‘sys.argv’; use *note + PySys_SetArgvEx(): 369. for that. This is a no-op when called for + a second time (without calling *note Py_FinalizeEx(): 986. first). + There is no return value; it is a fatal error if the initialization + fails. + + Note: On Windows, changes the console mode from ‘O_TEXT’ to + ‘O_BINARY’, which will also affect non-Python uses of the + console using the C Runtime. + + -- C Function: void Py_InitializeEx (int initsigs) + ` Part of the *note Stable ABI: 4b8.' This function works like + *note Py_Initialize(): 4e7. if `initsigs' is ‘1’. If `initsigs' is + ‘0’, it skips initialization registration of signal handlers, which + might be useful when Python is embedded. + + -- C Function: int Py_IsInitialized () + ` Part of the *note Stable ABI: 4b8.' Return true (nonzero) when + the Python interpreter has been initialized, false (zero) if not. + After *note Py_FinalizeEx(): 986. is called, this returns false + until *note Py_Initialize(): 4e7. is called again. + + -- C Function: int Py_FinalizeEx () + ` Part of the *note Stable ABI: 4b8. since version 3.6.' Undo all + initializations made by *note Py_Initialize(): 4e7. and subsequent + use of Python/C API functions, and destroy all sub-interpreters + (see *note Py_NewInterpreter(): 4457. below) that were created and + not yet destroyed since the last call to *note Py_Initialize(): + 4e7. Ideally, this frees all memory allocated by the Python + interpreter. This is a no-op when called for a second time + (without calling *note Py_Initialize(): 4e7. again first). + Normally the return value is ‘0’. If there were errors during + finalization (flushing buffered data), ‘-1’ is returned. + + 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 + (‘__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. 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 *note Py_Initialize(): 4e7. and + *note Py_FinalizeEx(): 986. more than once. + + Raises an *note auditing event: 12c0. + ‘cpython._PySys_ClearAuditHooks’ with no arguments. + + New in version 3.6. + + -- C Function: void Py_Finalize () + ` Part of the *note Stable ABI: 4b8.' This is a + backwards-compatible version of *note Py_FinalizeEx(): 986. that + disregards the return value. + + +File: python.info, Node: Process-wide parameters, Next: Thread State and the Global Interpreter Lock, Prev: Initializing and finalizing the interpreter, Up: Initialization Finalization and Threads + +7.9.4 Process-wide parameters +----------------------------- + + -- C Function: int Py_SetStandardStreamEncoding (const char *encoding, + const char *errors) + + This API is kept for backward compatibility: setting *note + PyConfig.stdio_encoding: 3bd0. and *note PyConfig.stdio_errors: + 3bd1. should be used instead, see *note Python Initialization + Configuration: 371. + + This function should be called before *note Py_Initialize(): 4e7, + if it is called at all. It specifies which encoding and error + handling to use with standard IO, with the same meanings as in + *note str.encode(): 512. + + It overrides *note PYTHONIOENCODING: cad. values, and allows + embedding code to control IO encoding when the environment variable + does not work. + + `encoding' and/or `errors' may be ‘NULL’ to use *note + PYTHONIOENCODING: cad. and/or default values (depending on other + settings). + + Note that *note sys.stderr: 581. always uses the “backslashreplace” + error handler, regardless of this (or any other) setting. + + If *note Py_FinalizeEx(): 986. is called, this function will need + to be called again in order to affect subsequent calls to *note + Py_Initialize(): 4e7. + + Returns ‘0’ if successful, a nonzero value on error (e.g. calling + after the interpreter has already been initialized). + + New in version 3.4. + + Deprecated since version 3.11. + + -- C Function: void Py_SetProgramName (const wchar_t *name) + ` Part of the *note Stable ABI: 4b8.' + + This API is kept for backward compatibility: setting *note + PyConfig.program_name: 46bb. should be used instead, see *note + Python Initialization Configuration: 371. + + This function should be called before *note Py_Initialize(): 4e7. + is called for the first time, if it is called at all. It tells the + interpreter the value of the ‘argv[0]’ argument to the ‘main()’ + function of the program (converted to wide characters). This is + used by *note Py_GetPath(): 4e1. and some other functions below to + find the Python run-time libraries relative to the interpreter + executable. The default value is ‘'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 *note Py_DecodeLocale(): 82d. to decode a bytes string to get a + wchar_* string. + + Deprecated since version 3.11. + + -- C Function: wchar *Py_GetProgramName () + ` Part of the *note Stable ABI: 4b8.' + + Return the program name set with *note Py_SetProgramName(): 36d, or + the default. The returned string points into static storage; the + caller should not modify its value. + + This function should not be called before *note Py_Initialize(): + 4e7, otherwise it returns ‘NULL’. + + Changed in version 3.10: It now returns ‘NULL’ if called before + *note Py_Initialize(): 4e7. + + -- C Function: wchar_t *Py_GetPrefix () + ` Part of the *note Stable ABI: 4b8.' Return the `prefix' for + installed platform-independent files. This is derived through a + number of complicated rules from the program name set with *note + Py_SetProgramName(): 36d. and some environment variables; for + example, if the program name is ‘'/usr/local/bin/python'’, the + prefix is ‘'/usr/local'’. The returned string points into static + storage; the caller should not modify its value. This corresponds + to the ‘prefix’ variable in the top-level ‘Makefile’ and the + ‘--prefix’ argument to the ‘configure’ script at build time. The + value is available to Python code as ‘sys.prefix’. It is only + useful on Unix. See also the next function. + + This function should not be called before *note Py_Initialize(): + 4e7, otherwise it returns ‘NULL’. + + Changed in version 3.10: It now returns ‘NULL’ if called before + *note Py_Initialize(): 4e7. + + -- C Function: wchar_t *Py_GetExecPrefix () + ` Part of the *note Stable ABI: 4b8.' Return the `exec-prefix' for + installed platform-`dependent' files. This is derived through a + number of complicated rules from the program name set with *note + Py_SetProgramName(): 36d. and some environment variables; for + example, if the program name is ‘'/usr/local/bin/python'’, the + exec-prefix is ‘'/usr/local'’. The returned string points into + static storage; the caller should not modify its value. This + corresponds to the ‘exec_prefix’ variable in the top-level + ‘Makefile’ and the ‘--exec-prefix’ argument to the ‘configure’ + script at build time. The value is available to Python code as + ‘sys.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 + ‘/usr/local/plat’ subtree while platform independent may be + installed in ‘/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 ‘mount’ or + ‘automount’ programs to share ‘/usr/local’ between platforms while + having ‘/usr/local/plat’ be a different filesystem for each + platform. + + This function should not be called before *note Py_Initialize(): + 4e7, otherwise it returns ‘NULL’. + + Changed in version 3.10: It now returns ‘NULL’ if called before + *note Py_Initialize(): 4e7. + + -- C Function: wchar_t *Py_GetProgramFullPath () + ` Part of the *note Stable ABI: 4b8.' + + 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 *note Py_SetProgramName(): 36d. + above). The returned string points into static storage; the caller + should not modify its value. The value is available to Python code + as ‘sys.executable’. + + This function should not be called before *note Py_Initialize(): + 4e7, otherwise it returns ‘NULL’. + + Changed in version 3.10: It now returns ‘NULL’ if called before + *note Py_Initialize(): 4e7. + + -- C Function: wchar_t *Py_GetPath () + ` Part of the *note Stable ABI: 4b8.' + + Return the default module search path; this is computed from the + program name (set by *note Py_SetProgramName(): 36d. above) 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 ‘':'’ on Unix and + macOS, ‘';'’ on Windows. The returned string points into static + storage; the caller should not modify its value. The list *note + sys.path: 162. 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 *note Py_Initialize(): + 4e7, otherwise it returns ‘NULL’. + + Changed in version 3.10: It now returns ‘NULL’ if called before + *note Py_Initialize(): 4e7. + + -- C Function: void Py_SetPath (const wchar_t*) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' + + This API is kept for backward compatibility: setting *note + PyConfig.module_search_paths: 1c1. and *note + PyConfig.module_search_paths_set: 1c0. should be used instead, see + *note Python Initialization Configuration: 371. + + Set the default module search path. If this function is called + before *note Py_Initialize(): 4e7, then *note Py_GetPath(): 4e1. + won’t attempt to compute a default search path but uses the one + provided instead. This is useful if Python is embedded by an + application that has full knowledge of the location of all modules. + The path components should be separated by the platform dependent + delimiter character, which is ‘':'’ on Unix and macOS, ‘';'’ on + Windows. + + This also causes *note sys.executable: 6be. to be set to the + program full path (see *note Py_GetProgramFullPath(): 4e4.) and for + *note sys.prefix: 3b91. and *note sys.exec_prefix: 3b92. to be + empty. It is up to the caller to modify these if required after + calling *note Py_Initialize(): 4e7. + + Use *note Py_DecodeLocale(): 82d. to decode a bytes string to get a + wchar_* string. + + The path argument is copied internally, so the caller may free it + after the call completes. + + Changed in version 3.8: The program full path is now used for *note + sys.executable: 6be, instead of the program name. + + Deprecated since version 3.11. + + -- C Function: const char *Py_GetVersion () + ` Part of the *note Stable ABI: 4b8.' Return the version of this + Python interpreter. This is a string that looks something like + + "3.0a5+ (py3k:63103M, May 12 2008, 00:53:55) \n[GCC 4.2.3]" + + 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 *note sys.version: 990. + + See also the *note Py_Version: 325. constant. + + -- C Function: const char *Py_GetPlatform () + ` Part of the *note Stable ABI: 4b8.' + + 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 ‘'sunos5'’. On macOS, it is ‘'darwin'’. On Windows, it is + ‘'win'’. The returned string points into static storage; the + caller should not modify its value. The value is available to + Python code as ‘sys.platform’. + + -- C Function: const char *Py_GetCopyright () + ` Part of the *note Stable ABI: 4b8.' Return the official + copyright string for the current Python version, for example + + ‘'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'’ + + The returned string points into static storage; the caller should + not modify its value. The value is available to Python code as + ‘sys.copyright’. + + -- C Function: const char *Py_GetCompiler () + ` Part of the *note Stable ABI: 4b8.' Return an indication of the + compiler used to build the current Python version, in square + brackets, for example: + + "[GCC 2.7.2.2]" + + 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 ‘sys.version’. + + -- C Function: const char *Py_GetBuildInfo () + ` Part of the *note Stable ABI: 4b8.' Return information about the + sequence number and build date and time of the current Python + interpreter instance, for example + + "#67, Aug 1 1997, 22:34:28" + + 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 ‘sys.version’. + + -- C Function: void PySys_SetArgvEx (int argc, wchar_t **argv, int + updatepath) + ` Part of the *note Stable ABI: 4b8.' + + This API is kept for backward compatibility: setting *note + PyConfig.argv: 132e, *note PyConfig.parse_argv: 132f. and *note + PyConfig.safe_path: 345. should be used instead, see *note Python + Initialization Configuration: 371. + + Set *note sys.argv: f1f. based on `argc' and `argv'. These + parameters are similar to those passed to the program’s ‘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 *note sys.argv: f1f, a fatal condition is + signalled using *note Py_FatalError(): 5d9. + + If `updatepath' is zero, this is all the function does. If + `updatepath' is non-zero, the function also modifies *note + sys.path: 162. according to the following algorithm: + + - If the name of an existing script is passed in ‘argv[0]’, the + absolute path of the directory where the script is located is + prepended to *note sys.path: 162. + + - Otherwise (that is, if `argc' is ‘0’ or ‘argv[0]’ doesn’t + point to an existing file name), an empty string is prepended + to *note sys.path: 162, which is the same as prepending the + current working directory (‘"."’). + + Use *note Py_DecodeLocale(): 82d. to decode a bytes string to get a + wchar_* string. + + See also *note PyConfig.orig_argv: 4bb. and *note PyConfig.argv: + 132e. members of the *note Python Initialization Configuration: + 371. + + Note: It is recommended that applications embedding the Python + interpreter for purposes other than executing a single script + pass ‘0’ as `updatepath', and update *note sys.path: 162. + themselves if desired. See CVE-2008-5983(1). + + On versions before 3.1.3, you can achieve the same effect by + manually popping the first *note sys.path: 162. element after + having called *note PySys_SetArgv(): 36a, for example using: + + PyRun_SimpleString("import sys; sys.path.pop(0)\n"); + + New in version 3.1.3. + + Deprecated since version 3.11. + + -- C Function: void PySys_SetArgv (int argc, wchar_t **argv) + ` Part of the *note Stable ABI: 4b8.' This API is kept for + backward compatibility: setting *note PyConfig.argv: 132e. and + *note PyConfig.parse_argv: 132f. should be used instead, see *note + Python Initialization Configuration: 371. + + This function works like *note PySys_SetArgvEx(): 369. with + `updatepath' set to ‘1’ unless the ‘python’ interpreter was started + with the *note -I: 5b0. + + Use *note Py_DecodeLocale(): 82d. to decode a bytes string to get a + wchar_* string. + + See also *note PyConfig.orig_argv: 4bb. and *note PyConfig.argv: + 132e. members of the *note Python Initialization Configuration: + 371. + + Changed in version 3.4: The `updatepath' value depends on *note -I: + 5b0. + + Deprecated since version 3.11. + + -- C Function: void Py_SetPythonHome (const wchar_t *home) + ` Part of the *note Stable ABI: 4b8.' This API is kept for + backward compatibility: setting *note PyConfig.home: 46bc. should + be used instead, see *note Python Initialization Configuration: + 371. + + Set the default “home” directory, that is, the location of the + standard Python libraries. See *note PYTHONHOME: 8ae. 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 *note Py_DecodeLocale(): 82d. to decode a bytes string to get a + wchar_* string. + + Deprecated since version 3.11. + + -- C Function: w_char *Py_GetPythonHome () + ` Part of the *note Stable ABI: 4b8.' Return the default “home”, + that is, the value set by a previous call to *note + Py_SetPythonHome(): 36e, or the value of the *note PYTHONHOME: 8ae. + environment variable if it is set. + + This function should not be called before *note Py_Initialize(): + 4e7, otherwise it returns ‘NULL’. + + Changed in version 3.10: It now returns ‘NULL’ if called before + *note Py_Initialize(): 4e7. + + ---------- Footnotes ---------- + + (1) https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983 + + +File: python.info, Node: Thread State and the Global Interpreter Lock, Next: Sub-interpreter support, Prev: Process-wide parameters, Up: Initialization Finalization and Threads + +7.9.5 Thread State and the Global Interpreter Lock +-------------------------------------------------- + +The Python interpreter is not fully thread-safe. In order to support +multi-threaded Python programs, there’s a global lock, called the *note +global interpreter lock: 8d8. or *note GIL: 4df, that must be held by +the current thread before it can safely access 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. + +Therefore, the rule exists that only the thread that has acquired the +*note GIL: 4df. may operate on Python objects or call Python/C API +functions. In order to emulate concurrency of execution, the +interpreter regularly tries to switch threads (see *note +sys.setswitchinterval(): 599.). The lock is also released around +potentially blocking I/O operations like reading or writing a file, so +that other Python threads can run in the meantime. + +The Python interpreter keeps some thread-specific bookkeeping +information inside a data structure called *note PyThreadState: 360. +There’s also one global variable pointing to the current *note +PyThreadState: 360.: it can be retrieved using *note +PyThreadState_Get(): 43f0. + +* Menu: + +* Releasing the GIL from extension code:: +* Non-Python created threads:: +* Cautions about fork(): Cautions about fork. +* High-level API:: +* Low-level API:: + + +File: python.info, Node: Releasing the GIL from extension code, Next: Non-Python created threads, Up: Thread State and the Global Interpreter Lock + +7.9.5.1 Releasing the GIL from extension code +............................................. + +Most extension code manipulating the *note GIL: 4df. has the following +simple structure: + + Save the thread state in a local variable. + Release the global interpreter lock. + ... Do some blocking I/O operation ... + Reacquire the global interpreter lock. + Restore the thread state from the local variable. + +This is so common that a pair of macros exists to simplify it: + + Py_BEGIN_ALLOW_THREADS + ... Do some blocking I/O operation ... + Py_END_ALLOW_THREADS + +The *note Py_BEGIN_ALLOW_THREADS: 4250. macro opens a new block and +declares a hidden local variable; the *note Py_END_ALLOW_THREADS: 6e4. +macro closes the block. + +The block above expands to the following code: + + PyThreadState *_save; + + _save = PyEval_SaveThread(); + ... Do some blocking I/O operation ... + PyEval_RestoreThread(_save); + +Here is how these functions work: the global interpreter lock is used to +protect the pointer to the current thread state. When releasing the +lock and saving the thread state, the current thread state pointer must +be retrieved before the lock is released (since another thread could +immediately acquire the lock and store its own thread state in the +global variable). Conversely, when acquiring the lock and restoring the +thread state, the lock must be acquired before storing the thread state +pointer. + + Note: Calling system I/O functions is the most common use case for + releasing the GIL, but it can also be useful before calling + long-running computations which don’t need access to Python + objects, such as compression or cryptographic functions operating + over memory buffers. For example, the standard *note zlib: 14f. + and *note hashlib: 88. modules release the GIL when compressing or + hashing data. + + +File: python.info, Node: Non-Python created threads, Next: Cautions about fork, Prev: Releasing the GIL from extension code, Up: Thread State and the Global Interpreter Lock + +7.9.5.2 Non-Python created threads +.................................. + +When threads are created using the dedicated Python APIs (such as the +*note threading: 10b. module), a thread state is automatically +associated to them and the code showed above is therefore correct. +However, when threads are created from C (for example by a third-party +library with its own thread management), they don’t hold the GIL, nor is +there a thread state structure for them. + +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 thread state data structure, then acquiring the GIL, and +finally storing their thread state pointer, before you can start using +the Python/C API. When you are done, you should reset the thread state +pointer, release the GIL, and finally free the thread state data +structure. + +The *note PyGILState_Ensure(): 6e5. and *note PyGILState_Release(): +4353. functions do all of the above automatically. The typical idiom +for calling into Python from a C thread is: + + 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); + +Note that the ‘PyGILState_*’ functions assume there is only one global +interpreter (created automatically by *note Py_Initialize(): 4e7.). +Python supports the creation of additional interpreters (using *note +Py_NewInterpreter(): 4457.), but mixing multiple interpreters and the +‘PyGILState_*’ API is unsupported. + + +File: python.info, Node: Cautions about fork, Next: High-level API, Prev: Non-Python created threads, Up: Thread State and the Global Interpreter Lock + +7.9.5.3 Cautions about fork() +............................. + +Another important thing to note about threads is their behaviour in the +face of the C ‘fork()’ call. On most systems with ‘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 *note +os.fork(): cd4. by acquiring the locks it uses internally before the +fork, and releasing them afterwards. In addition, it resets any *note +Lock Objects: 294d. 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 +‘pthread_atfork()’ would need to be used to accomplish the same thing. +Additionally, when extending or embedding Python, calling ‘fork()’ +directly rather than through *note os.fork(): cd4. (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. +*note PyOS_AfterFork_Child(): 6fc. 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 *note os.fork(): +cd4. does. This means finalizing all other *note PyThreadState: 360. +objects belonging to the current interpreter and all other *note +PyInterpreterState: 4fa. objects. Due to this and the special nature of +the *note “main” interpreter: 44b2, ‘fork()’ should only be called in +that interpreter’s “main” thread, where the CPython global runtime was +originally initialized. The only exception is if ‘exec()’ will be +called immediately after. + + +File: python.info, Node: High-level API, Next: Low-level API, Prev: Cautions about fork, Up: Thread State and the Global Interpreter Lock + +7.9.5.4 High-level API +...................... + +These are the most commonly used types and functions when writing C +extension code, or when embedding the Python interpreter: + + -- C Type: type PyInterpreterState + ` Part of the *note Limited API: 4b8. (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. + + -- C Type: type PyThreadState + ` Part of the *note Limited API: 4b8. (as an opaque struct).' This + data structure represents the state of a single thread. The only + public data member is ‘interp’ (*note PyInterpreterState: 4fa.*), + which points to this thread’s interpreter state. + + -- C Function: void PyEval_InitThreads () + ` Part of the *note Stable ABI: 4b8.' + + 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 *note + Py_Initialize(): 4e7, so you don’t have to call it yourself + anymore. + + Changed in version 3.2: This function cannot be called before *note + Py_Initialize(): 4e7. anymore. + + Deprecated since version 3.9, removed in version 3.11. + + -- C Function: int PyEval_ThreadsInitialized () + ` Part of the *note Stable ABI: 4b8.' Returns a non-zero value if + *note PyEval_InitThreads(): 592. has been called. This function + can be called without holding the GIL, and therefore can be used to + avoid calls to the locking API when running single-threaded. + + Changed in version 3.7: The *note GIL: 4df. is now initialized by + *note Py_Initialize(): 4e7. + + Deprecated since version 3.9, removed in version 3.11. + + -- C Function: *note PyThreadState: 360. *PyEval_SaveThread () + ` Part of the *note Stable ABI: 4b8.' Release the global + interpreter lock (if it has been created) and reset the thread + state to ‘NULL’, returning the previous thread state (which is not + ‘NULL’). If the lock has been created, the current thread must + have acquired it. + + -- C Function: void PyEval_RestoreThread (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8.' Acquire the global + interpreter lock (if it has been created) and set the thread state + to `tstate', which must not be ‘NULL’. If the lock has been + created, the current thread must not have acquired it, otherwise + deadlock ensues. + + Note: Calling this function from a thread when the runtime is + finalizing will terminate the thread, even if the thread was + not created by Python. You can use ‘_Py_IsFinalizing()’ or + *note sys.is_finalizing(): afe. to check if the interpreter is + in process of being finalized before calling this function to + avoid unwanted termination. + + -- C Function: *note PyThreadState: 360. *PyThreadState_Get () + ` Part of the *note Stable ABI: 4b8.' Return the current thread + state. The global interpreter lock must be held. When the current + thread state is ‘NULL’, this issues a fatal error (so that the + caller needn’t check for ‘NULL’). + + -- C Function: *note PyThreadState: 360. *PyThreadState_Swap + (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8.' Swap the current thread + state with the thread state given by the argument `tstate', which + may be ‘NULL’. The global interpreter lock must be held and is not + released. + +The following functions use thread-local storage, and are not compatible +with sub-interpreters: + + -- C Function: PyGILState_STATE PyGILState_Ensure () + ` Part of the *note Stable ABI: 4b8.' Ensure that the current + thread is ready to call the Python C API regardless of the current + state of Python, or of the global interpreter lock. This may be + called as many times as desired by a thread as long as each call is + matched with a call to *note PyGILState_Release(): 4353. In + general, other thread-related APIs may be used between *note + PyGILState_Ensure(): 6e5. and *note PyGILState_Release(): 4353. + calls as long as the thread state is restored to its previous state + before the Release(). For example, normal usage of the *note + Py_BEGIN_ALLOW_THREADS: 4250. and *note Py_END_ALLOW_THREADS: 6e4. + macros is acceptable. + + The return value is an opaque “handle” to the thread state when + *note PyGILState_Ensure(): 6e5. was called, and must be passed to + *note PyGILState_Release(): 4353. to ensure Python is left in the + same state. Even though recursive calls are allowed, these handles + `cannot' be shared - each unique call to *note PyGILState_Ensure(): + 6e5. must save the handle for its call to *note + PyGILState_Release(): 4353. + + When the function returns, the current thread will hold the GIL and + be able to call arbitrary Python code. Failure is a fatal error. + + Note: Calling this function from a thread when the runtime is + finalizing will terminate the thread, even if the thread was + not created by Python. You can use ‘_Py_IsFinalizing()’ or + *note sys.is_finalizing(): afe. to check if the interpreter is + in process of being finalized before calling this function to + avoid unwanted termination. + + -- C Function: void PyGILState_Release (PyGILState_STATE) + ` Part of the *note Stable ABI: 4b8.' Release any resources + previously acquired. After this call, Python’s state will be the + same as it was prior to the corresponding *note + PyGILState_Ensure(): 6e5. call (but generally this state will be + unknown to the caller, hence the use of the GILState API). + + Every call to *note PyGILState_Ensure(): 6e5. must be matched by a + call to *note PyGILState_Release(): 4353. on the same thread. + + -- C Function: *note PyThreadState: 360. *PyGILState_GetThisThreadState + () + ` Part of the *note Stable ABI: 4b8.' Get the current thread state + for this thread. May return ‘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. + + -- C Function: int PyGILState_Check () + + Return ‘1’ if the current thread is holding the GIL and ‘0’ + otherwise. This function can be called from any thread at any + time. Only if it has had its Python thread state initialized and + currently is holding the GIL will it return ‘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. + + New in version 3.4. + +The following macros are normally used without a trailing semicolon; +look for example usage in the Python source distribution. + + -- C Macro: Py_BEGIN_ALLOW_THREADS + ` Part of the *note Stable ABI: 4b8.' This macro expands to ‘{ + PyThreadState *_save; _save = PyEval_SaveThread();’. Note that it + contains an opening brace; it must be matched with a following + *note Py_END_ALLOW_THREADS: 6e4. macro. See above for further + discussion of this macro. + + -- C Macro: Py_END_ALLOW_THREADS + ` Part of the *note Stable ABI: 4b8.' This macro expands to + ‘PyEval_RestoreThread(_save); }’. Note that it contains a closing + brace; it must be matched with an earlier *note + Py_BEGIN_ALLOW_THREADS: 4250. macro. See above for further + discussion of this macro. + + -- C Macro: Py_BLOCK_THREADS + ` Part of the *note Stable ABI: 4b8.' This macro expands to + ‘PyEval_RestoreThread(_save);’: it is equivalent to *note + Py_END_ALLOW_THREADS: 6e4. without the closing brace. + + -- C Macro: Py_UNBLOCK_THREADS + ` Part of the *note Stable ABI: 4b8.' This macro expands to ‘_save + = PyEval_SaveThread();’: it is equivalent to *note + Py_BEGIN_ALLOW_THREADS: 4250. without the opening brace and + variable declaration. + + +File: python.info, Node: Low-level API, Prev: High-level API, Up: Thread State and the Global Interpreter Lock + +7.9.5.5 Low-level API +..................... + +All of the following functions must be called after *note +Py_Initialize(): 4e7. + +Changed in version 3.7: *note Py_Initialize(): 4e7. now initializes the +*note GIL: 4df. + + -- C Function: *note PyInterpreterState: 4fa. *PyInterpreterState_New + () + ` Part of the *note Stable ABI: 4b8.' Create a new interpreter + state object. The global interpreter lock need not be held, but + may be held if it is necessary to serialize calls to this function. + + Raises an *note auditing event: 12c0. + ‘cpython.PyInterpreterState_New’ with no arguments. + + -- C Function: void PyInterpreterState_Clear (PyInterpreterState + *interp) + ` Part of the *note Stable ABI: 4b8.' Reset all information in an + interpreter state object. The global interpreter lock must be + held. + + Raises an *note auditing event: 12c0. + ‘cpython.PyInterpreterState_Clear’ with no arguments. + + -- C Function: void PyInterpreterState_Delete (PyInterpreterState + *interp) + ` Part of the *note Stable ABI: 4b8.' Destroy an interpreter state + object. The global interpreter lock need not be held. The + interpreter state must have been reset with a previous call to + *note PyInterpreterState_Clear(): 3a40. + + -- C Function: *note PyThreadState: 360. *PyThreadState_New + (PyInterpreterState *interp) + ` Part of the *note Stable ABI: 4b8.' Create a new thread state + object belonging to the given interpreter object. The global + interpreter lock need not be held, but may be held if it is + necessary to serialize calls to this function. + + -- C Function: void PyThreadState_Clear (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8.' Reset all information in a + thread state object. The global interpreter lock must be held. + + Changed in version 3.9: This function now calls the + ‘PyThreadState.on_delete’ callback. Previously, that happened in + *note PyThreadState_Delete(): 13bd. + + -- C Function: void PyThreadState_Delete (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8.' Destroy a thread state + object. The global interpreter lock need not be held. The thread + state must have been reset with a previous call to *note + PyThreadState_Clear(): 137e. + + -- C Function: void PyThreadState_DeleteCurrent (void) + + Destroy the current thread state and release the global interpreter + lock. Like *note PyThreadState_Delete(): 13bd, the global + interpreter lock need not be held. The thread state must have been + reset with a previous call to *note PyThreadState_Clear(): 137e. + + -- C Function: *note PyFrameObject: 35d. *PyThreadState_GetFrame + (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Get the + current frame of the Python thread state `tstate'. + + Return a *note strong reference: 362. Return ‘NULL’ if no frame is + currently executing. + + See also *note PyEval_GetFrame(): 1182. + + `tstate' must not be ‘NULL’. + + New in version 3.9. + + -- C Function: uint64_t PyThreadState_GetID (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Get the + unique thread state identifier of the Python thread state `tstate'. + + `tstate' must not be ‘NULL’. + + New in version 3.9. + + -- C Function: *note PyInterpreterState: 4fa. + *PyThreadState_GetInterpreter (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Get the + interpreter of the Python thread state `tstate'. + + `tstate' must not be ‘NULL’. + + New in version 3.9. + + -- C Function: void PyThreadState_EnterTracing (PyThreadState *tstate) + + Suspend tracing and profiling in the Python thread state `tstate'. + + Resume them using the *note PyThreadState_LeaveTracing(): 324. + function. + + New in version 3.11. + + -- C Function: void PyThreadState_LeaveTracing (PyThreadState *tstate) + + Resume tracing and profiling in the Python thread state `tstate' + suspended by the *note PyThreadState_EnterTracing(): 323. function. + + See also *note PyEval_SetTrace(): 1137. and *note + PyEval_SetProfile(): 1136. functions. + + New in version 3.11. + + -- C Function: *note PyInterpreterState: 4fa. *PyInterpreterState_Get + (void) + ` Part of the *note Stable ABI: 4b8. since version 3.9.' Get the + current interpreter. + + Issue a fatal error if there no current Python thread state or no + current interpreter. It cannot return NULL. + + The caller must hold the GIL. + + New in version 3.9. + + -- C Function: int64_t PyInterpreterState_GetID (PyInterpreterState + *interp) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Return + the interpreter’s unique ID. If there was any error in doing so + then ‘-1’ is returned and an error is set. + + The caller must hold the GIL. + + New in version 3.7. + + -- C Function: *note PyObject: 4cf. *PyInterpreterState_GetDict + (PyInterpreterState *interp) + ` Part of the *note Stable ABI: 4b8. since version 3.8.' Return a + dictionary in which interpreter-specific data may be stored. If + this function returns ‘NULL’ then no exception has been raised and + the caller should assume no interpreter-specific dict is available. + + This is not a replacement for *note PyModule_GetState(): 5d5, which + extensions should use to store interpreter-specific state + information. + + New in version 3.8. + + -- C Type: typedef *note PyObject: 4cf. *(*_PyFrameEvalFunction)(*note + PyThreadState: 360. *tstate, _PyInterpreterFrame *frame, int + throwflag) + + Type of a frame evaluation function. + + The `throwflag' parameter is used by the ‘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 + ‘PyFrameObject*’ to ‘_PyInterpreterFrame*’. + + -- C Function: *note _PyFrameEvalFunction: 348. + _PyInterpreterState_GetEvalFrameFunc (PyInterpreterState + *interp) + + Get the frame evaluation function. + + See the PEP 523(1) “Adding a frame evaluation API to CPython”. + + New in version 3.9. + + -- C Function: void _PyInterpreterState_SetEvalFrameFunc + (PyInterpreterState *interp, _PyFrameEvalFunction eval_frame) + + Set the frame evaluation function. + + See the PEP 523(2) “Adding a frame evaluation API to CPython”. + + New in version 3.9. + + -- C Function: *note PyObject: 4cf. *PyThreadState_GetDict () + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' 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 current thread state is available. If + this function returns ‘NULL’, no exception has been raised and the + caller should assume no current thread state is available. + + -- C Function: int PyThreadState_SetAsyncExc (unsigned long id, + PyObject *exc) + ` Part of the *note Stable ABI: 4b8.' 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 the GIL held. 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 ‘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. + + -- C Function: void PyEval_AcquireThread (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8.' Acquire the global + interpreter lock and set the current thread state to `tstate', + which must not be ‘NULL’. The lock must have been created earlier. + If this thread already has the lock, deadlock ensues. + + Note: Calling this function from a thread when the runtime is + finalizing will terminate the thread, even if the thread was + not created by Python. You can use ‘_Py_IsFinalizing()’ or + *note sys.is_finalizing(): afe. to check if the interpreter is + in process of being finalized before calling this function to + avoid unwanted termination. + + Changed in version 3.8: Updated to be consistent with *note + PyEval_RestoreThread(): 6e3, *note Py_END_ALLOW_THREADS(): 6e4, and + *note PyGILState_Ensure(): 6e5, and terminate the current thread if + called while the interpreter is finalizing. + + *note PyEval_RestoreThread(): 6e3. is a higher-level function which + is always available (even when threads have not been initialized). + + -- C Function: void PyEval_ReleaseThread (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8.' Reset the current thread + state to ‘NULL’ and release the global interpreter lock. The lock + must have been created earlier and must be held by the current + thread. The `tstate' argument, which must not be ‘NULL’, is only + used to check that it represents the current thread state — if it + isn’t, a fatal error is reported. + + *note PyEval_SaveThread(): f34. is a higher-level function which is + always available (even when threads have not been initialized). + + -- C Function: void PyEval_AcquireLock () + ` Part of the *note Stable ABI: 4b8.' Acquire the global + interpreter lock. The lock must have been created earlier. If + this thread already has the lock, a deadlock ensues. + + Deprecated since version 3.2: This function does not update the + current thread state. Please use *note PyEval_RestoreThread(): + 6e3. or *note PyEval_AcquireThread(): 6e2. instead. + + Note: Calling this function from a thread when the runtime is + finalizing will terminate the thread, even if the thread was + not created by Python. You can use ‘_Py_IsFinalizing()’ or + *note sys.is_finalizing(): afe. to check if the interpreter is + in process of being finalized before calling this function to + avoid unwanted termination. + + Changed in version 3.8: Updated to be consistent with *note + PyEval_RestoreThread(): 6e3, *note Py_END_ALLOW_THREADS(): 6e4, and + *note PyGILState_Ensure(): 6e5, and terminate the current thread if + called while the interpreter is finalizing. + + -- C Function: void PyEval_ReleaseLock () + ` Part of the *note Stable ABI: 4b8.' Release the global + interpreter lock. The lock must have been created earlier. + + Deprecated since version 3.2: This function does not update the + current thread state. Please use *note PyEval_SaveThread(): f34. + or *note PyEval_ReleaseThread(): 4344. instead. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0523/ + + (2) https://peps.python.org/pep-0523/ + + +File: python.info, Node: Sub-interpreter support, Next: Asynchronous Notifications, Prev: Thread State and the Global Interpreter Lock, Up: Initialization Finalization and Threads + +7.9.6 Sub-interpreter support +----------------------------- + +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 *note +PyInterpreterState_Main(): 46c7. function returns a pointer to its +state. + +You can switch between sub-interpreters using the *note +PyThreadState_Swap(): 43f3. function. You can create and destroy them +using the following functions: + + -- C Function: *note PyThreadState: 360. *Py_NewInterpreter () + ` Part of the *note Stable ABI: 4b8.' + + 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 *note builtins: 11, + *note __main__: 1. and *note sys: f9. The table of loaded modules + (‘sys.modules’) and the module search path (‘sys.path’) are also + separate. The new environment has no ‘sys.argv’ variable. It has + new standard I/O stream file objects ‘sys.stdin’, ‘sys.stdout’ and + ‘sys.stderr’ (however these refer to the same underlying file + descriptors). + + The return value points to the first thread state created in the + new sub-interpreter. This thread state is made in the current + thread state. Note that no actual thread is created; see the + discussion of thread states below. If creation of the new + interpreter is unsuccessful, ‘NULL’ is returned; no exception is + set since the exception state is stored in the current thread state + and there may not be a current thread state. (Like all other + Python/C API functions, the global interpreter lock must be held + before calling this function and is still held when it returns; + however, unlike most other Python/C API functions, there needn’t be + a current thread state on entry.) + + Extension modules are shared between (sub-)interpreters as follows: + + * For modules using multi-phase initialization, e.g. *note + PyModule_FromDefAndSpec(): b40, a separate module object is + created and initialized for each interpreter. Only C-level + static and global variables are shared between these module + objects. + + * For modules using single-phase initialization, e.g. *note + PyModule_Create(): 4234, 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 ‘init’ function is not called. Objects + in the module’s dictionary thus end up shared across + (sub-)interpreters, which might cause unwanted behavior (see + *note Bugs and caveats: 46c8. below). + + Note that this is different from what happens when an + extension is imported after the interpreter has been + completely re-initialized by calling *note Py_FinalizeEx(): + 986. and *note Py_Initialize(): 4e7.; in that case, the + extension’s ‘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. + + -- C Function: void Py_EndInterpreter (PyThreadState *tstate) + ` Part of the *note Stable ABI: 4b8.' + + Destroy the (sub-)interpreter represented by the given thread + state. The given thread state must be the current thread state. + See the discussion of thread states below. When the call returns, + the current thread state is ‘NULL’. All thread states associated + with this interpreter are destroyed. (The global interpreter lock + must be held before calling this function and is still held when it + returns.) *note Py_FinalizeEx(): 986. will destroy all + sub-interpreters that haven’t been explicitly destroyed at that + point. + +* Menu: + +* Bugs and caveats:: + + +File: python.info, Node: Bugs and caveats, Up: Sub-interpreter support + +7.9.6.1 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 *note os.close(): 7d3. 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 ‘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 *note PyGILState_Ensure(): +6e5. and *note PyGILState_Release(): 4353. calls. Furthermore, +extensions (such as *note ctypes: 29.) using these APIs to allow calling +of Python code from non-Python created threads will probably be broken +when using sub-interpreters. + + +File: python.info, Node: Asynchronous Notifications, Next: Profiling and Tracing, Prev: Sub-interpreter support, Up: Initialization Finalization and Threads + +7.9.7 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. + + -- C Function: int Py_AddPendingCall (int (*func)(void*), void *arg) + ` Part of the *note Stable ABI: 4b8.' + + Schedule a function to be called from the main interpreter thread. + On success, ‘0’ is returned and `func' is queued for being called + in the main thread. On failure, ‘-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: + + * on a *note bytecode: 16f. boundary; + + * with the main thread holding the *note global interpreter + lock: 8d8. (`func' can therefore use the full C API). + + `func' must return ‘0’ on success, or ‘-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 global interpreter lock is + released. + + This function doesn’t need a current thread state to run, and it + doesn’t need the global interpreter lock. + + To call this function in a subinterpreter, the caller must hold the + GIL. Otherwise, the function `func' can be scheduled to be called + from the wrong interpreter. + + 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 *note PyGILState API: 46c0. + + 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. + + New in version 3.1. + + +File: python.info, Node: Profiling and Tracing, Next: Advanced Debugger Support, Prev: Asynchronous Notifications, Up: Initialization Finalization and Threads + +7.9.8 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. + + -- C Type: typedef int (*Py_tracefunc)(*note PyObject: 4cf. *obj, *note + PyFrameObject: 35d. *frame, int what, *note PyObject: 4cf. + *arg) + + The type of the trace function registered using *note + PyEval_SetProfile(): 1136. and *note PyEval_SetTrace(): 1137. 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 ‘PyTrace_CALL’, ‘PyTrace_EXCEPTION’, + ‘PyTrace_LINE’, ‘PyTrace_RETURN’, ‘PyTrace_C_CALL’, + ‘PyTrace_C_EXCEPTION’, ‘PyTrace_C_RETURN’, or ‘PyTrace_OPCODE’, and + `arg' depends on the value of `what': + + Value of `what' Meaning of `arg' + + -------------------------------------------------------------------------------- + + ‘PyTrace_CALL’ Always *note Py_None: 4231. + + + ‘PyTrace_EXCEPTION’ Exception information as returned by + *note sys.exc_info(): 25b. + + + ‘PyTrace_LINE’ Always *note Py_None: 4231. + + + ‘PyTrace_RETURN’ Value being returned to the caller, or + ‘NULL’ if caused by an exception. + + + ‘PyTrace_C_CALL’ Function object being called. + + + ‘PyTrace_C_EXCEPTION’ Function object being called. + + + ‘PyTrace_C_RETURN’ Function object being called. + + + ‘PyTrace_OPCODE’ Always *note Py_None: 4231. + + + -- C Variable: int PyTrace_CALL + + The value of the `what' parameter to a *note Py_tracefunc: 46cc. + 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. + + -- C Variable: int PyTrace_EXCEPTION + + The value of the `what' parameter to a *note Py_tracefunc: 46cc. + 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 receives these events; they are not needed by the + profiler. + + -- C Variable: int PyTrace_LINE + + The value passed as the `what' parameter to a *note Py_tracefunc: + 46cc. function (but not a profiling function) when a line-number + event is being reported. It may be disabled for a frame by setting + ‘f_trace_lines’ to `0' on that frame. + + -- C Variable: int PyTrace_RETURN + + The value for the `what' parameter to *note Py_tracefunc: 46cc. + functions when a call is about to return. + + -- C Variable: int PyTrace_C_CALL + + The value for the `what' parameter to *note Py_tracefunc: 46cc. + functions when a C function is about to be called. + + -- C Variable: int PyTrace_C_EXCEPTION + + The value for the `what' parameter to *note Py_tracefunc: 46cc. + functions when a C function has raised an exception. + + -- C Variable: int PyTrace_C_RETURN + + The value for the `what' parameter to *note Py_tracefunc: 46cc. + functions when a C function has returned. + + -- C Variable: int PyTrace_OPCODE + + The value for the `what' parameter to *note Py_tracefunc: 46cc. + 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 ‘f_trace_opcodes’ to `1' on the + frame. + + -- 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 ‘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 ‘PyTrace_LINE’ + ‘PyTrace_OPCODE’ and ‘PyTrace_EXCEPTION’. + + See also the *note sys.setprofile(): 1138. function. + + The caller must hold the *note GIL: 4df. + + -- C Function: void PyEval_SetTrace (Py_tracefunc func, PyObject *obj) + + Set the tracing function to `func'. This is similar to *note + PyEval_SetProfile(): 1136, 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 *note PyEval_SetTrace(): 1137. will not + receive ‘PyTrace_C_CALL’, ‘PyTrace_C_EXCEPTION’ or + ‘PyTrace_C_RETURN’ as a value for the `what' parameter. + + See also the *note sys.settrace(): 1139. function. + + The caller must hold the *note GIL: 4df. + + +File: python.info, Node: Advanced Debugger Support, Next: Thread Local Storage Support, Prev: Profiling and Tracing, Up: Initialization Finalization and Threads + +7.9.9 Advanced Debugger Support +------------------------------- + +These functions are only intended to be used by advanced debugging +tools. + + -- C Function: *note PyInterpreterState: 4fa. *PyInterpreterState_Head + () + + Return the interpreter state object at the head of the list of all + such objects. + + -- C Function: *note PyInterpreterState: 4fa. *PyInterpreterState_Main + () + + Return the main interpreter state object. + + -- C Function: *note PyInterpreterState: 4fa. *PyInterpreterState_Next + (PyInterpreterState *interp) + + Return the next interpreter state object after `interp' from the + list of all such objects. + + -- C Function: *note PyThreadState: 360. *PyInterpreterState_ThreadHead + (PyInterpreterState *interp) + + Return the pointer to the first *note PyThreadState: 360. object in + the list of threads associated with the interpreter `interp'. + + -- C Function: *note PyThreadState: 360. *PyThreadState_Next + (PyThreadState *tstate) + + Return the next thread state object after `tstate' from the list of + all such objects belonging to the same *note PyInterpreterState: + 4fa. object. + + +File: python.info, Node: Thread Local Storage Support, Prev: Advanced Debugger Support, Up: Initialization Finalization and Threads + +7.9.10 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 (*note +threading.local: 28e7.). 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. + +The GIL does `not' need to be held when calling these functions; they +supply their own locking. + +Note that ‘Python.h’ does not include the declaration of the TLS APIs, +you need to include ‘pythread.h’ to use thread-local storage. + + 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 *note PyObject: + 4cf.*, these functions don’t do refcount operations on them either. + +* Menu: + +* Thread Specific Storage (TSS) API: Thread Specific Storage TSS API. +* Thread Local Storage (TLS) API: Thread Local Storage TLS API. + + +File: python.info, Node: Thread Specific Storage TSS API, Next: Thread Local Storage TLS API, Up: Thread Local Storage Support + +7.9.10.1 Thread Specific Storage (TSS) API +.......................................... + +TSS API is introduced to supersede the use of the existing TLS API +within the CPython interpreter. This API uses a new type *note +Py_tss_t: 733. instead of int to represent thread keys. + +New in version 3.7. + +See also +........ + +“A New C-API for Thread-Local Storage in CPython” ( PEP 539(1)) + + -- 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 *note Py_LIMITED_API: 4b8. is not defined, static allocation + of this type by *note Py_tss_NEEDS_INIT: 46da. is allowed. + + -- C Macro: Py_tss_NEEDS_INIT + + This macro expands to the initializer for *note Py_tss_t: 733. + variables. Note that this macro won’t be defined with *note + Py_LIMITED_API: 4b8. + +* Menu: + +* Dynamic Allocation:: +* Methods: Methods<4>. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0539/ + + +File: python.info, Node: Dynamic Allocation, Next: Methods<4>, Up: Thread Specific Storage TSS API + +7.9.10.2 Dynamic Allocation +........................... + +Dynamic allocation of the *note Py_tss_t: 733, required in extension +modules built with *note Py_LIMITED_API: 4b8, where static allocation of +this type is not possible due to its implementation being opaque at +build time. + + -- C Function: *note Py_tss_t: 733. *PyThread_tss_alloc () + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Return a + value which is the same state as a value initialized with *note + Py_tss_NEEDS_INIT: 46da, or ‘NULL’ in the case of dynamic + allocation failure. + + -- C Function: void PyThread_tss_free (Py_tss_t *key) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Free the + given `key' allocated by *note PyThread_tss_alloc(): 43f9, after + first calling *note PyThread_tss_delete(): 43fb. to ensure any + associated thread locals have been unassigned. This is a no-op if + the `key' argument is ‘NULL’. + + Note: A freed key becomes a dangling pointer. You should + reset the key to ‘NULL’. + + +File: python.info, Node: Methods<4>, Prev: Dynamic Allocation, Up: Thread Specific Storage TSS API + +7.9.10.3 Methods +................ + +The parameter `key' of these functions must not be ‘NULL’. Moreover, +the behaviors of *note PyThread_tss_set(): 43ff. and *note +PyThread_tss_get(): 43fd. are undefined if the given *note Py_tss_t: +733. has not been initialized by *note PyThread_tss_create(): 43fa. + + -- C Function: int PyThread_tss_is_created (Py_tss_t *key) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Return a + non-zero value if the given *note Py_tss_t: 733. has been + initialized by *note PyThread_tss_create(): 43fa. + + -- C Function: int PyThread_tss_create (Py_tss_t *key) + ` Part of the *note Stable ABI: 4b8. 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 *note Py_tss_NEEDS_INIT: 46da. 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. + + -- C Function: void PyThread_tss_delete (Py_tss_t *key) + ` Part of the *note Stable ABI: 4b8. 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 + *note PyThread_tss_create(): 43fa. This function can be called + repeatedly on the same key – calling it on an already destroyed key + is a no-op. + + -- C Function: int PyThread_tss_set (Py_tss_t *key, void *value) + ` Part of the *note Stable ABI: 4b8. 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. + + -- C Function: void *PyThread_tss_get (Py_tss_t *key) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Return + the void* value associated with a TSS key in the current thread. + This returns ‘NULL’ if no value is associated with the key in the + current thread. + + +File: python.info, Node: Thread Local Storage TLS API, Prev: Thread Specific Storage TSS API, Up: Thread Local Storage Support + +7.9.10.4 Thread Local Storage (TLS) API +....................................... + +Deprecated since version 3.7: This API is superseded by *note Thread +Specific Storage (TSS) API: 732. + + 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 + ‘int’. On such platforms, *note PyThread_create_key(): 43f5. will + return immediately with a failure status, and the other TLS + functions will all be no-ops on such platforms. + +Due to the compatibility problem noted above, this version of the API +should not be used in new code. + + -- C Function: int PyThread_create_key () + ` Part of the *note Stable ABI: 4b8.' + + -- C Function: void PyThread_delete_key (int key) + ` Part of the *note Stable ABI: 4b8.' + + -- C Function: int PyThread_set_key_value (int key, void *value) + ` Part of the *note Stable ABI: 4b8.' + + -- C Function: void *PyThread_get_key_value (int key) + ` Part of the *note Stable ABI: 4b8.' + + -- C Function: void PyThread_delete_key_value (int key) + ` Part of the *note Stable ABI: 4b8.' + + -- C Function: void PyThread_ReInitTLS () + ` Part of the *note Stable ABI: 4b8.' + + +File: python.info, Node: Python Initialization Configuration, Next: Memory Management, Prev: Initialization Finalization and Threads, Up: Python/C API Reference Manual + +7.10 Python Initialization Configuration +======================================== + +New in version 3.8. + +Python can be initialized with *note Py_InitializeFromConfig(): 600. and +the *note PyConfig: 370. structure. It can be preinitialized with *note +Py_PreInitialize(): 601. and the *note PyPreConfig: 5fc. structure. + +There are two kinds of configuration: + + * The *note Python Configuration: 46e0. 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. + + * The *note Isolated Configuration: 46e1. 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. + +The *note Py_RunMain(): 604. function can be used to write a customized +Python program. + +See also *note Initialization, Finalization, and Threads: 46a4. + +See also +........ + +PEP 587(1) “Python Initialization Configuration”. + +* Menu: + +* Example: Example<17>. +* PyWideStringList:: +* PyStatus:: +* PyPreConfig:: +* Preinitialize Python with PyPreConfig:: +* PyConfig:: +* Initialization with PyConfig:: +* Isolated Configuration:: +* Python Configuration:: +* Python Path Configuration:: +* Py_RunMain(): Py_RunMain. +* Py_GetArgcArgv(): Py_GetArgcArgv. +* Multi-Phase Initialization Private Provisional API:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0587/ + + +File: python.info, Node: Example<17>, Next: PyWideStringList, Up: Python Initialization Configuration + +7.10.1 Example +-------------- + +Example of customized Python always running in isolated mode: + + 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); + } + + +File: python.info, Node: PyWideStringList, Next: PyStatus, Prev: Example<17>, Up: Python Initialization Configuration + +7.10.2 PyWideStringList +----------------------- + + -- C Type: type PyWideStringList + + List of ‘wchar_t*’ strings. + + If `length' is non-zero, `items' must be non-‘NULL’ and all strings + must be non-‘NULL’. + + Methods: + + -- C Function: *note PyStatus: 5fd. PyWideStringList_Append + (PyWideStringList *list, const wchar_t *item) + + Append `item' to `list'. + + Python must be preinitialized to call this function. + + -- C Function: *note PyStatus: 5fd. 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 ‘0’. + + Python must be preinitialized to call this function. + + Structure fields: + + -- C Member: *note Py_ssize_t: 6b1. length + + List length. + + -- C Member: wchar_t **items + + List items. + + +File: python.info, Node: PyStatus, Next: PyPreConfig, Prev: PyWideStringList, Up: Python Initialization Configuration + +7.10.3 PyStatus +--------------- + + -- 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: + + -- C Member: int exitcode + + Exit code. Argument passed to ‘exit()’. + + -- C Member: const char *err_msg + + Error message. + + -- C Member: const char *func + + Name of the function which created an error, can be ‘NULL’. + + Functions to create a status: + + -- C Function: *note PyStatus: 5fd. PyStatus_Ok (void) + + Success. + + -- C Function: *note PyStatus: 5fd. PyStatus_Error (const char + *err_msg) + + Initialization error with a message. + + `err_msg' must not be ‘NULL’. + + -- C Function: *note PyStatus: 5fd. PyStatus_NoMemory (void) + + Memory allocation failure (out of memory). + + -- C Function: *note PyStatus: 5fd. PyStatus_Exit (int exitcode) + + Exit Python with the specified exit code. + + Functions to handle a status: + + -- C Function: int PyStatus_Exception (PyStatus status) + + Is the status an error or an exit? If true, the exception + must be handled; by calling *note Py_ExitStatusException(): + 46f1. for example. + + -- C Function: int PyStatus_IsError (PyStatus status) + + Is the result an error? + + -- C Function: int PyStatus_IsExit (PyStatus status) + + Is the result an exit? + + -- C Function: void Py_ExitStatusException (PyStatus status) + + Call ‘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 ‘PyStatus_Exception(status)’ is + non-zero. + + Note: Internally, Python uses macros which set ‘PyStatus.func’, + whereas functions to create a status set ‘func’ to ‘NULL’. + +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; + } + + +File: python.info, Node: PyPreConfig, Next: Preinitialize Python with PyPreConfig, Prev: PyStatus, Up: Python Initialization Configuration + +7.10.4 PyPreConfig +------------------ + + -- C Type: type PyPreConfig + + Structure used to preinitialize Python. + + Function to initialize a preconfiguration: + + -- C Function: void PyPreConfig_InitPythonConfig (PyPreConfig + *preconfig) + + Initialize the preconfiguration with *note Python + Configuration: 46e0. + + -- C Function: void PyPreConfig_InitIsolatedConfig (PyPreConfig + *preconfig) + + Initialize the preconfiguration with *note Isolated + Configuration: 46e1. + + Structure fields: + + -- C Member: int allocator + + Name of the Python memory allocators: + + * ‘PYMEM_ALLOCATOR_NOT_SET’ (‘0’): don’t change memory + allocators (use defaults). + + * ‘PYMEM_ALLOCATOR_DEFAULT’ (‘1’): *note default memory + allocators: 1791. + + * ‘PYMEM_ALLOCATOR_DEBUG’ (‘2’): *note default memory + allocators: 1791. with *note debug hooks: 1792. + + * ‘PYMEM_ALLOCATOR_MALLOC’ (‘3’): use ‘malloc()’ of the C + library. + + * ‘PYMEM_ALLOCATOR_MALLOC_DEBUG’ (‘4’): force usage of + ‘malloc()’ with *note debug hooks: 1792. + + * ‘PYMEM_ALLOCATOR_PYMALLOC’ (‘5’): *note Python pymalloc + memory allocator: 980. + + * ‘PYMEM_ALLOCATOR_PYMALLOC_DEBUG’ (‘6’): *note Python + pymalloc memory allocator: 980. with *note debug hooks: + 1792. + + ‘PYMEM_ALLOCATOR_PYMALLOC’ and + ‘PYMEM_ALLOCATOR_PYMALLOC_DEBUG’ are not supported if Python + is *note configured using –without-pymalloc: 17c0. + + See *note Memory Management: 46f8. + + Default: ‘PYMEM_ALLOCATOR_NOT_SET’. + + -- C Member: int configure_locale + + Set the LC_CTYPE locale to the user preferred locale? + + If equals to ‘0’, set *note coerce_c_locale: 46fa. and *note + coerce_c_locale_warn: 46fb. members to ‘0’. + + See the *note locale encoding: 24df. + + Default: ‘1’ in Python config, ‘0’ in isolated config. + + -- C Member: int coerce_c_locale + + If equals to ‘2’, coerce the C locale. + + If equals to ‘1’, read the LC_CTYPE locale to decide if it + should be coerced. + + See the *note locale encoding: 24df. + + Default: ‘-1’ in Python config, ‘0’ in isolated config. + + -- C Member: int coerce_c_locale_warn + + If non-zero, emit a warning if the C locale is coerced. + + Default: ‘-1’ in Python config, ‘0’ in isolated config. + + -- C Member: int dev_mode + + *note Python Development Mode: 506.: see *note + PyConfig.dev_mode: 46fd. + + Default: ‘-1’ in Python mode, ‘0’ in isolated mode. + + -- C Member: int isolated + + Isolated mode: see *note PyConfig.isolated: 46ff. + + Default: ‘0’ in Python mode, ‘1’ in isolated mode. + + -- C Member: int legacy_windows_fs_encoding + + If non-zero: + + * Set *note PyPreConfig.utf8_mode: 4701. to ‘0’, + + * Set *note PyConfig.filesystem_encoding: 24dd. to + ‘"mbcs"’, + + * Set *note PyConfig.filesystem_errors: 24de. to + ‘"replace"’. + + Initialized the from *note PYTHONLEGACYWINDOWSFSENCODING: 8c9. + environment variable value. + + Only available on Windows. ‘#ifdef MS_WINDOWS’ macro can be + used for Windows specific code. + + Default: ‘0’. + + -- C Member: int parse_argv + + If non-zero, *note Py_PreInitializeFromArgs(): 602. and *note + Py_PreInitializeFromBytesArgs(): 603. parse their ‘argv’ + argument the same way the regular Python parses command line + arguments: see *note Command Line Arguments: ca9. + + Default: ‘1’ in Python config, ‘0’ in isolated config. + + -- C Member: int use_environment + + Use *note environment variables: 1c3.? See *note + PyConfig.use_environment: 5d7. + + Default: ‘1’ in Python config and ‘0’ in isolated config. + + -- C Member: int utf8_mode + + If non-zero, enable the *note Python UTF-8 Mode: 229. + + Set to ‘0’ or ‘1’ by the *note -X utf8: 174. command line + option and the *note PYTHONUTF8: 72c. environment variable. + + Also set to ‘1’ if the ‘LC_CTYPE’ locale is ‘C’ or ‘POSIX’. + + Default: ‘-1’ in Python config and ‘0’ in isolated config. + + +File: python.info, Node: Preinitialize Python with PyPreConfig, Next: PyConfig, Prev: PyPreConfig, Up: Python Initialization Configuration + +7.10.5 Preinitialize Python with PyPreConfig +-------------------------------------------- + +The preinitialization of Python: + + * Set the Python memory allocators (*note PyPreConfig.allocator: + 46f7.) + + * Configure the LC_CTYPE locale (*note locale encoding: 24df.) + + * Set the *note Python UTF-8 Mode: 229. (*note PyPreConfig.utf8_mode: + 4701.) + +The current preconfiguration (‘PyPreConfig’ type) is stored in +‘_PyRuntime.preconfig’. + +Functions to preinitialize Python: + + -- C Function: *note PyStatus: 5fd. Py_PreInitialize (const PyPreConfig + *preconfig) + + Preinitialize Python from `preconfig' preconfiguration. + + `preconfig' must not be ‘NULL’. + + -- C Function: *note PyStatus: 5fd. Py_PreInitializeFromBytesArgs + (const PyPreConfig *preconfig, int argc, char *const *argv) + + Preinitialize Python from `preconfig' preconfiguration. + + Parse `argv' command line arguments (bytes strings) if *note + parse_argv: 4702. of `preconfig' is non-zero. + + `preconfig' must not be ‘NULL’. + + -- C Function: *note PyStatus: 5fd. Py_PreInitializeFromArgs (const + PyPreConfig *preconfig, int argc, wchar_t *const *argv) + + Preinitialize Python from `preconfig' preconfiguration. + + Parse `argv' command line arguments (wide strings) if *note + parse_argv: 4702. of `preconfig' is non-zero. + + `preconfig' must not be ‘NULL’. + +The caller is responsible to handle exceptions (error or exit) using +‘PyStatus_Exception()’ and ‘Py_ExitStatusException()’. + +For *note Python Configuration: 46e0. +(‘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 *note -X utf8: 174. +command line option enables the *note Python UTF-8 Mode: 229. + +‘PyMem_SetAllocator()’ can be called after *note Py_PreInitialize(): +601. and before *note Py_InitializeFromConfig(): 600. to install a +custom memory allocator. It can be called before *note +Py_PreInitialize(): 601. if *note PyPreConfig.allocator: 46f7. is set to +‘PYMEM_ALLOCATOR_NOT_SET’. + +Python memory allocation functions like *note PyMem_RawMalloc(): cdf. +must not be used before the Python preinitialization, whereas calling +directly ‘malloc()’ and ‘free()’ is always safe. *note +Py_DecodeLocale(): 82d. must not be called before the Python +preinitialization. + +Example using the preinitialization to enable the *note Python UTF-8 +Mode: 229.: + + 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(); + + +File: python.info, Node: PyConfig, Next: Initialization with PyConfig, Prev: Preinitialize Python with PyPreConfig, Up: Python Initialization Configuration + +7.10.6 PyConfig +--------------- + + -- C Type: type PyConfig + + Structure containing most parameters to configure Python. + + When done, the *note PyConfig_Clear(): 4706. function must be used + to release the configuration memory. + + Structure methods: + + -- C Function: void PyConfig_InitPythonConfig (PyConfig *config) + + Initialize configuration with the *note Python Configuration: + 46e0. + + -- C Function: void PyConfig_InitIsolatedConfig (PyConfig *config) + + Initialize configuration with the *note Isolated + Configuration: 46e1. + + -- C Function: *note PyStatus: 5fd. PyConfig_SetString (PyConfig + *config, wchar_t *const *config_str, const wchar_t *str) + + Copy the wide character string `str' into ‘*config_str’. + + *note Preinitialize Python: 354d. if needed. + + -- C Function: *note PyStatus: 5fd. PyConfig_SetBytesString + (PyConfig *config, wchar_t *const *config_str, const char + *str) + + Decode `str' using *note Py_DecodeLocale(): 82d. and set the + result into ‘*config_str’. + + *note Preinitialize Python: 354d. if needed. + + -- C Function: *note PyStatus: 5fd. PyConfig_SetArgv (PyConfig + *config, int argc, wchar_t *const *argv) + + Set command line arguments (*note argv: 132e. member of + `config') from the `argv' list of wide character strings. + + *note Preinitialize Python: 354d. if needed. + + -- C Function: *note PyStatus: 5fd. PyConfig_SetBytesArgv + (PyConfig *config, int argc, char *const *argv) + + Set command line arguments (*note argv: 132e. member of + `config') from the `argv' list of bytes strings. Decode bytes + using *note Py_DecodeLocale(): 82d. + + *note Preinitialize Python: 354d. if needed. + + -- C Function: *note PyStatus: 5fd. PyConfig_SetWideStringList + (PyConfig *config, PyWideStringList *list, Py_ssize_t + length, wchar_t **items) + + Set the list of wide strings `list' to `length' and `items'. + + *note Preinitialize Python: 354d. if needed. + + -- C Function: *note PyStatus: 5fd. PyConfig_Read (PyConfig + *config) + + Read all Python configuration. + + Fields which are already initialized are left unchanged. + + Fields for *note path configuration: 4e8. are no longer + calculated or modified when calling this function, as of + Python 3.11. + + The *note PyConfig_Read(): 470e. function only parses *note + PyConfig.argv: 132e. arguments once: *note + PyConfig.parse_argv: 132f. is set to ‘2’ after arguments are + parsed. Since Python arguments are strippped from *note + PyConfig.argv: 132e, parsing arguments twice would parse the + application options as Python options. + + *note Preinitialize Python: 354d. if needed. + + Changed in version 3.10: The *note PyConfig.argv: 132e. + arguments are now only parsed once, *note PyConfig.parse_argv: + 132f. is set to ‘2’ after arguments are parsed, and arguments + are only parsed if *note PyConfig.parse_argv: 132f. equals + ‘1’. + + Changed in version 3.11: *note PyConfig_Read(): 470e. no + longer calculates all paths, and so fields listed under *note + Python Path Configuration: 4e8. may no longer be updated until + *note Py_InitializeFromConfig(): 600. is called. + + -- C Function: void PyConfig_Clear (PyConfig *config) + + Release configuration memory. + + Most ‘PyConfig’ methods *note preinitialize Python: 354d. if + needed. In that case, the Python preinitialization configuration + (*note PyPreConfig: 5fc.) in based on the *note PyConfig: 370. If + configuration fields which are in common with *note PyPreConfig: + 5fc. are tuned, they must be set before calling a *note PyConfig: + 370. method: + + * *note PyConfig.dev_mode: 46fd. + + * *note PyConfig.isolated: 46ff. + + * *note PyConfig.parse_argv: 132f. + + * *note PyConfig.use_environment: 5d7. + + Moreover, if *note PyConfig_SetArgv(): 470b. or *note + PyConfig_SetBytesArgv(): 470c. is used, this method must be called + before other methods, since the preinitialization configuration + depends on command line arguments (if *note parse_argv: 132f. is + non-zero). + + The caller of these methods is responsible to handle exceptions + (error or exit) using ‘PyStatus_Exception()’ and + ‘Py_ExitStatusException()’. + + Structure fields: + + -- C Member: *note PyWideStringList: 5fe. argv + + Command line arguments: *note sys.argv: f1f. + + Set *note parse_argv: 132f. to ‘1’ to parse *note argv: 132e. + the same way the regular Python parses Python command line + arguments and then to strip Python arguments from *note argv: + 132e. + + If *note argv: 132e. is empty, an empty string is added to + ensure that *note sys.argv: f1f. always exists and is never + empty. + + Default: ‘NULL’. + + See also the *note orig_argv: 4bb. member. + + -- C Member: int safe_path + + If equals to zero, ‘Py_RunMain()’ prepends a potentially + unsafe path to *note sys.path: 162. at startup: + + * If *note argv[0]: 132e. is equal to ‘L"-m"’ (‘python -m + module’), prepend the current working directory. + + * If running a script (‘python script.py’), prepend the + script’s directory. If it’s a symbolic link, resolve + symbolic links. + + * Otherwise (‘python -c code’ and ‘python’), prepend an + empty string, which means the current working directory. + + Set to ‘1’ by the *note -P: 15f. command line option and the + *note PYTHONSAFEPATH: 160. environment variable. + + Default: ‘0’ in Python config, ‘1’ in isolated config. + + New in version 3.11. + + -- C Member: wchar_t *base_exec_prefix + + *note sys.base_exec_prefix: 3b93. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. output. + + -- C Member: wchar_t *base_executable + + Python base executable: ‘sys._base_executable’. + + Set by the ‘__PYVENV_LAUNCHER__’ environment variable. + + Set from *note PyConfig.executable: 4711. if ‘NULL’. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. output. + + -- C Member: wchar_t *base_prefix + + *note sys.base_prefix: 3512. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. output. + + -- C Member: int buffered_stdio + + If equals to ‘0’ and *note configure_c_stdio: 4714. is + non-zero, disable buffering on the C streams stdout and + stderr. + + Set to ‘0’ by the *note -u: 13c1. command line option and the + *note PYTHONUNBUFFERED: 13c2. environment variable. + + stdin is always opened in buffered mode. + + Default: ‘1’. + + -- C Member: int bytes_warning + + If equals to ‘1’, issue a warning when comparing *note bytes: + 1b4. or *note bytearray: 1a5. with *note str: 1b3, or + comparing *note bytes: 1b4. with *note int: 1c7. + + If equal or greater to ‘2’, raise a *note BytesWarning: 88f. + exception in these cases. + + Incremented by the *note -b: 1b1. command line option. + + Default: ‘0’. + + -- C Member: int warn_default_encoding + + If non-zero, emit a *note EncodingWarning: 1783. warning when + *note io.TextIOWrapper: 9ad. uses its default encoding. See + *note Opt-in EncodingWarning: 1795. for details. + + Default: ‘0’. + + New in version 3.10. + + -- C Member: int code_debug_ranges + + If equals to ‘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 ‘0’ by the *note PYTHONNODEBUGRANGES: 175. environment + variable and by the *note -X no_debug_ranges: 174. command + line option. + + Default: ‘1’. + + New in version 3.11. + + -- C Member: wchar_t *check_hash_pycs_mode + + Control the validation behavior of hash-based ‘.pyc’ files: + value of the *note –check-hash-based-pycs: 1771. command line + option. + + Valid values: + + - ‘L"always"’: Hash the source file for invalidation + regardless of value of the ‘check_source’ flag. + + - ‘L"never"’: Assume that hash-based pycs always are valid. + + - ‘L"default"’: The ‘check_source’ flag in hash-based pycs + determines invalidation. + + Default: ‘L"default"’. + + See also PEP 552(1) “Deterministic pycs”. + + -- C Member: int configure_c_stdio + + If non-zero, configure C standard streams: + + * On Windows, set the binary mode (‘O_BINARY’) on stdin, + stdout and stderr. + + * If *note buffered_stdio: 4713. equals zero, disable + buffering of stdin, stdout and stderr streams. + + * If *note interactive: 4719. is non-zero, enable stream + buffering on stdin and stdout (only stdout on Windows). + + Default: ‘1’ in Python config, ‘0’ in isolated config. + + -- C Member: int dev_mode + + If non-zero, enable the *note Python Development Mode: 506. + + Set to ‘1’ by the *note -X dev: 174. option and the *note + PYTHONDEVMODE: 743. environment variable. + + Default: ‘-1’ in Python mode, ‘0’ in isolated mode. + + -- C Member: int dump_refs + + Dump Python references? + + If non-zero, dump all objects which are still alive at exit. + + Set to ‘1’ by the *note PYTHONDUMPREFS: 5f6. environment + variable. + + Need a special build of Python with the ‘Py_TRACE_REFS’ macro + defined: see the *note configure –with-trace-refs option: 4d0. + + Default: ‘0’. + + -- C Member: wchar_t *exec_prefix + + The site-specific directory prefix where the + platform-dependent Python files are installed: *note + sys.exec_prefix: 3b92. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. output. + + -- C Member: wchar_t *executable + + The absolute path of the executable binary for the Python + interpreter: *note sys.executable: 6be. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. output. + + -- C Member: int faulthandler + + Enable faulthandler? + + If non-zero, call *note faulthandler.enable(): 911. at + startup. + + Set to ‘1’ by *note -X faulthandler: 174. and the *note + PYTHONFAULTHANDLER: d31. environment variable. + + Default: ‘-1’ in Python mode, ‘0’ in isolated mode. + + -- C Member: wchar_t *filesystem_encoding + + *note Filesystem encoding: 1793.: *note + sys.getfilesystemencoding(): 8c8. + + On macOS, Android and VxWorks: use ‘"utf-8"’ by default. + + On Windows: use ‘"utf-8"’ by default, or ‘"mbcs"’ if *note + legacy_windows_fs_encoding: 4700. of *note PyPreConfig: 5fc. + is non-zero. + + Default encoding on other platforms: + + * ‘"utf-8"’ if *note PyPreConfig.utf8_mode: 4701. is + non-zero. + + * ‘"ascii"’ if Python detects that ‘nl_langinfo(CODESET)’ + announces the ASCII encoding, whereas the ‘mbstowcs()’ + function decodes from a different encoding (usually + Latin1). + + * ‘"utf-8"’ if ‘nl_langinfo(CODESET)’ returns an empty + string. + + * Otherwise, use the *note locale encoding: 24df.: + ‘nl_langinfo(CODESET)’ result. + + At Python startup, the encoding name is normalized to the + Python codec name. For example, ‘"ANSI_X3.4-1968"’ is + replaced with ‘"ascii"’. + + See also the *note filesystem_errors: 24de. member. + + -- C Member: wchar_t *filesystem_errors + + *note Filesystem error handler: 1793.: *note + sys.getfilesystemencodeerrors(): 954. + + On Windows: use ‘"surrogatepass"’ by default, or ‘"replace"’ + if *note legacy_windows_fs_encoding: 4700. of *note + PyPreConfig: 5fc. is non-zero. + + On other platforms: use ‘"surrogateescape"’ by default. + + Supported error handlers: + + * ‘"strict"’ + + * ‘"surrogateescape"’ + + * ‘"surrogatepass"’ (only supported with the UTF-8 + encoding) + + See also the *note filesystem_encoding: 24dd. member. + + -- C Member: unsigned long hash_seed + + -- C Member: int use_hash_seed + + Randomized hash function seed. + + If *note use_hash_seed: 471e. is zero, a seed is chosen + randomly at Python startup, and *note hash_seed: 471d. is + ignored. + + Set by the *note PYTHONHASHSEED: d2e. environment variable. + + Default `use_hash_seed' value: ‘-1’ in Python mode, ‘0’ in + isolated mode. + + -- C Member: wchar_t *home + + Python home directory. + + If *note Py_SetPythonHome(): 36e. has been called, use its + argument if it is not ‘NULL’. + + Set by the *note PYTHONHOME: 8ae. environment variable. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. input. + + -- C Member: int import_time + + If non-zero, profile import time. + + Set the ‘1’ by the *note -X importtime: 174. option and the + *note PYTHONPROFILEIMPORTTIME: 74a. environment variable. + + Default: ‘0’. + + -- C Member: int inspect + + Enter interactive mode after executing a script or a command. + + If greater than ‘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 + *note sys.stdin: 729. does not appear to be a terminal. + + Incremented by the *note -i: 111d. command line option. Set + to ‘1’ if the *note PYTHONINSPECT: 111c. environment variable + is non-empty. + + Default: ‘0’. + + -- C Member: int install_signal_handlers + + Install Python signal handlers? + + Default: ‘1’ in Python mode, ‘0’ in isolated mode. + + -- C Member: int interactive + + If greater than ‘0’, enable the interactive mode (REPL). + + Incremented by the *note -i: 111d. command line option. + + Default: ‘0’. + + -- C Member: int isolated + + If greater than ‘0’, enable isolated mode: + + * Set *note safe_path: 345. to ‘1’: don’t prepend a + potentially unsafe path to *note sys.path: 162. at Python + startup. + + * Set *note use_environment: 5d7. to ‘0’. + + * Set *note user_site_directory: 4721. to ‘0’: don’t add + the user site directory to *note sys.path: 162. + + * Python REPL doesn’t import *note readline: db. nor enable + default readline configuration on interactive prompts. + + Set to ‘1’ by the *note -I: 5b0. command line option. + + Default: ‘0’ in Python mode, ‘1’ in isolated mode. + + See also *note PyPreConfig.isolated: 46fe. + + -- C Member: int legacy_windows_stdio + + If non-zero, use *note io.FileIO: faf. instead of + ‘io.WindowsConsoleIO’ for *note sys.stdin: 729, *note + sys.stdout: 72a. and *note sys.stderr: 581. + + Set to ‘1’ if the *note PYTHONLEGACYWINDOWSSTDIO: 8cc. + environment variable is set to a non-empty string. + + Only available on Windows. ‘#ifdef MS_WINDOWS’ macro can be + used for Windows specific code. + + Default: ‘0’. + + See also the PEP 528(2) (Change Windows console encoding to + UTF-8). + + -- C Member: int malloc_stats + + If non-zero, dump statistics on *note Python pymalloc memory + allocator: 980. at exit. + + Set to ‘1’ by the *note PYTHONMALLOCSTATS: 159c. environment + variable. + + The option is ignored if Python is *note configured using the + –without-pymalloc option: 17c0. + + Default: ‘0’. + + -- C Member: wchar_t *platlibdir + + Platform library directory name: *note sys.platlibdir: 580. + + Set by the *note PYTHONPLATLIBDIR: 134a. environment variable. + + Default: value of the ‘PLATLIBDIR’ macro which is set by the + *note configure –with-platlibdir option: 17b6. (default: + ‘"lib"’, or ‘"DLLs"’ on Windows). + + Part of the *note Python Path Configuration: 4e8. input. + + New 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 + ‘DLLs’. However, for compatibility, note that this value is + ignored for any non-standard layouts, including in-tree builds + and virtual environments. + + -- C Member: wchar_t *pythonpath_env + + Module search paths (*note sys.path: 162.) as a string + separated by ‘DELIM’ (‘os.path.pathsep’). + + Set by the *note PYTHONPATH: cc7. environment variable. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. input. + + -- C Member: *note PyWideStringList: 5fe. module_search_paths + + -- C Member: int module_search_paths_set + + Module search paths: *note sys.path: 162. + + If *note module_search_paths_set: 1c0. is equal to ‘0’, *note + Py_InitializeFromConfig(): 600. will replace *note + module_search_paths: 1c1. and sets *note + module_search_paths_set: 1c0. to ‘1’. + + Default: empty list (‘module_search_paths’) and ‘0’ + (‘module_search_paths_set’). + + Part of the *note Python Path Configuration: 4e8. output. + + -- C Member: int optimization_level + + Compilation optimization level: + + * ‘0’: Peephole optimizer, set ‘__debug__’ to ‘True’. + + * ‘1’: Level 0, remove assertions, set ‘__debug__’ to + ‘False’. + + * ‘2’: Level 1, strip docstrings. + + Incremented by the *note -O: a34. command line option. Set to + the *note PYTHONOPTIMIZE: 1776. environment variable value. + + Default: ‘0’. + + -- C Member: *note PyWideStringList: 5fe. orig_argv + + The list of the original command line arguments passed to the + Python executable: *note sys.orig_argv: 437. + + If *note orig_argv: 4bb. list is empty and *note argv: 132e. + is not a list only containing an empty string, *note + PyConfig_Read(): 470e. copies *note argv: 132e. into *note + orig_argv: 4bb. before modifying *note argv: 132e. (if *note + parse_argv: 132f. is non-zero). + + See also the *note argv: 132e. member and the *note + Py_GetArgcArgv(): 1369. function. + + Default: empty list. + + New in version 3.10. + + -- C Member: int parse_argv + + Parse command line arguments? + + If equals to ‘1’, parse *note argv: 132e. the same way the + regular Python parses *note command line arguments: ca9, and + strip Python arguments from *note argv: 132e. + + The *note PyConfig_Read(): 470e. function only parses *note + PyConfig.argv: 132e. arguments once: *note + PyConfig.parse_argv: 132f. is set to ‘2’ after arguments are + parsed. Since Python arguments are strippped from *note + PyConfig.argv: 132e, parsing arguments twice would parse the + application options as Python options. + + Default: ‘1’ in Python mode, ‘0’ in isolated mode. + + Changed in version 3.10: The *note PyConfig.argv: 132e. + arguments are now only parsed if *note PyConfig.parse_argv: + 132f. equals to ‘1’. + + -- C Member: int parser_debug + + Parser debug mode. If greater than ‘0’, turn on parser + debugging output (for expert only, depending on compilation + options). + + Incremented by the *note -d: 1772. command line option. Set + to the *note PYTHONDEBUG: 1773. environment variable value. + + Default: ‘0’. + + -- C Member: int pathconfig_warnings + + If non-zero, calculation of path configuration is allowed to + log warnings into ‘stderr’. If equals to ‘0’, suppress these + warnings. + + Default: ‘1’ in Python mode, ‘0’ in isolated mode. + + Part of the *note Python Path Configuration: 4e8. input. + + Changed in version 3.11: Now also applies on Windows. + + -- C Member: wchar_t *prefix + + The site-specific directory prefix where the platform + independent Python files are installed: *note sys.prefix: + 3b91. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. output. + + -- C Member: wchar_t *program_name + + Program name used to initialize *note executable: 4711. and in + early error messages during Python initialization. + + * If ‘Py_SetProgramName()’ has been called, use its + argument. + + * On macOS, use *note PYTHONEXECUTABLE: 178d. environment + variable if set. + + * If the ‘WITH_NEXT_FRAMEWORK’ macro is defined, use + ‘__PYVENV_LAUNCHER__’ environment variable if set. + + * Use ‘argv[0]’ of *note argv: 132e. if available and + non-empty. + + * Otherwise, use ‘L"python"’ on Windows, or ‘L"python3"’ on + other platforms. + + Default: ‘NULL’. + + Part of the *note Python Path Configuration: 4e8. input. + + -- C Member: wchar_t *pycache_prefix + + Directory where cached ‘.pyc’ files are written: *note + sys.pycache_prefix: 5f4. + + Set by the *note -X pycache_prefix=PATH: 174. command line + option and the *note PYTHONPYCACHEPREFIX: 5f3. environment + variable. + + If ‘NULL’, *note sys.pycache_prefix: 5f4. is set to ‘None’. + + Default: ‘NULL’. + + -- C Member: int quiet + + Quiet mode. If greater than ‘0’, don’t display the copyright + and version at Python startup in interactive mode. + + Incremented by the *note -q: 1779. command line option. + + Default: ‘0’. + + -- C Member: wchar_t *run_command + + Value of the *note -c: 1ad. command line option. + + Used by *note Py_RunMain(): 604. + + Default: ‘NULL’. + + -- C Member: wchar_t *run_filename + + Filename passed on the command line: trailing command line + argument without *note -c: 1ad. or *note -m: 1ae. It is used + by the *note Py_RunMain(): 604. function. + + For example, it is set to ‘script.py’ by the ‘python3 + script.py arg’ command line. + + See also the *note PyConfig.skip_source_first_line: 472d. + option. + + Default: ‘NULL’. + + -- C Member: wchar_t *run_module + + Value of the *note -m: 1ae. command line option. + + Used by *note Py_RunMain(): 604. + + Default: ‘NULL’. + + -- C Member: int show_ref_count + + Show total reference count at exit? + + Set to ‘1’ by *note -X showrefcount: 174. command line option. + + Need a *note debug build of Python: 496. (the ‘Py_REF_DEBUG’ + macro must be defined). + + Default: ‘0’. + + -- C Member: int site_import + + Import the *note site: e8. module at startup? + + If equal to zero, disable the import of the module site and + the site-dependent manipulations of *note sys.path: 162. that + it entails. + + Also disable these manipulations if the *note site: e8. module + is explicitly imported later (call *note site.main(): 177c. if + you want them to be triggered). + + Set to ‘0’ by the *note -S: e5c. command line option. + + ‘sys.flags.no_site’ is set to the inverted value of *note + site_import: 4730. + + Default: ‘1’. + + -- C Member: int skip_source_first_line + + If non-zero, skip the first line of the *note + PyConfig.run_filename: 472c. source. + + It allows the usage of non-Unix forms of ‘#!cmd’. This is + intended for a DOS specific hack only. + + Set to ‘1’ by the *note -x: 1781. command line option. + + Default: ‘0’. + + -- C Member: wchar_t *stdio_encoding + + -- C Member: wchar_t *stdio_errors + + Encoding and encoding errors of *note sys.stdin: 729, *note + sys.stdout: 72a. and *note sys.stderr: 581. (but *note + sys.stderr: 581. always uses ‘"backslashreplace"’ error + handler). + + If *note Py_SetStandardStreamEncoding(): 36f. has been called, + use its `error' and `errors' arguments if they are not ‘NULL’. + + Use the *note PYTHONIOENCODING: cad. environment variable if + it is non-empty. + + Default encoding: + + * ‘"UTF-8"’ if *note PyPreConfig.utf8_mode: 4701. is + non-zero. + + * Otherwise, use the *note locale encoding: 24df. + + Default error handler: + + * On Windows: use ‘"surrogateescape"’. + + * ‘"surrogateescape"’ if *note PyPreConfig.utf8_mode: 4701. + is non-zero, or if the LC_CTYPE locale is “C” or “POSIX”. + + * ‘"strict"’ otherwise. + + -- C Member: int tracemalloc + + Enable tracemalloc? + + If non-zero, call *note tracemalloc.start(): 1782. at startup. + + Set by *note -X tracemalloc=N: 174. command line option and by + the *note PYTHONTRACEMALLOC: 178e. environment variable. + + Default: ‘-1’ in Python mode, ‘0’ in isolated mode. + + -- C Member: int use_environment + + Use *note environment variables: 1c3.? + + If equals to zero, ignore the *note environment variables: + 1c3. + + Set to ‘0’ by the *note -E: 5af. environment variable. + + Default: ‘1’ in Python config and ‘0’ in isolated config. + + -- C Member: int user_site_directory + + If non-zero, add the user site directory to *note sys.path: + 162. + + Set to ‘0’ by the *note -s: 101c. and *note -I: 5b0. command + line options. + + Set to ‘0’ by the *note PYTHONNOUSERSITE: 101d. environment + variable. + + Default: ‘1’ in Python mode, ‘0’ in isolated mode. + + -- C Member: int verbose + + Verbose mode. If greater than ‘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 or equal to ‘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 *note -v: 1088. command line option. + + Set to the *note PYTHONVERBOSE: 177d. environment variable + value. + + Default: ‘0’. + + -- C Member: *note PyWideStringList: 5fe. warnoptions + + Options of the *note warnings: 130. module to build warnings + filters, lowest to highest priority: *note sys.warnoptions: + 80d. + + The *note warnings: 130. module adds *note sys.warnoptions: + 80d. in the reverse order: the last *note + PyConfig.warnoptions: 44b7. item becomes the first item of + ‘warnings.filters’ which is checked first (highest priority). + + The *note -W: 502. command line options adds its value to + *note warnoptions: 44b7, it can be used multiple times. + + The *note PYTHONWARNINGS: 80e. environment variable can also + be used to add warning options. Multiple options can be + specified, separated by commas (‘,’). + + Default: empty list. + + -- C Member: int write_bytecode + + If equal to ‘0’, Python won’t try to write ‘.pyc’ files on the + import of source modules. + + Set to ‘0’ by the *note -B: 103a. command line option and the + *note PYTHONDONTWRITEBYTECODE: 103b. environment variable. + + *note sys.dont_write_bytecode: 3bc3. is initialized to the + inverted value of *note write_bytecode: 4733. + + Default: ‘1’. + + -- C Member: *note PyWideStringList: 5fe. xoptions + + Values of the *note -X: 174. command line options: *note + sys._xoptions: 1784. + + Default: empty list. + +If *note parse_argv: 132f. is non-zero, *note argv: 132e. arguments are +parsed the same way the regular Python parses *note command line +arguments: ca9, and Python arguments are stripped from *note argv: 132e. + +The *note xoptions: 44b8. options are parsed to set other options: see +the *note -X: 174. command line option. + +Changed in version 3.9: The ‘show_alloc_count’ field has been removed. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0552/ + + (2) https://peps.python.org/pep-0528/ + + +File: python.info, Node: Initialization with PyConfig, Next: Isolated Configuration, Prev: PyConfig, Up: Python Initialization Configuration + +7.10.7 Initialization with PyConfig +----------------------------------- + +Function to initialize Python: + + -- C Function: *note PyStatus: 5fd. Py_InitializeFromConfig (const + PyConfig *config) + + Initialize Python from `config' configuration. + +The caller is responsible to handle exceptions (error or exit) using +‘PyStatus_Exception()’ and ‘Py_ExitStatusException()’. + +If *note PyImport_FrozenModules(): 28eb, *note PyImport_AppendInittab(): +12bc. or *note PyImport_ExtendInittab(): 12bd. are used, they must be +set or called after Python preinitialization and before the Python +initialization. If Python is initialized multiple times, *note +PyImport_AppendInittab(): 12bc. or *note PyImport_ExtendInittab(): 12bd. +must be called before each Python initialization. + +The current configuration (‘PyConfig’ type) is stored in +‘PyInterpreterState.config’. + +Example setting the program name: + + 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); + } + +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: + + 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; + } + + +File: python.info, Node: Isolated Configuration, Next: Python Configuration, Prev: Initialization with PyConfig, Up: Python Initialization Configuration + +7.10.8 Isolated Configuration +----------------------------- + +‘PyPreConfig_InitIsolatedConfig()’ and ‘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 (*note PyConfig.argv: 132e. is not +parsed) and user site directory. The C standard streams (ex: ‘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 *note PyConfig.home: 46bc. is +specified to avoid computing the default path configuration. + + +File: python.info, Node: Python Configuration, Next: Python Path Configuration, Prev: Isolated Configuration, Up: Python Initialization Configuration + +7.10.9 Python Configuration +--------------------------- + +‘PyPreConfig_InitPythonConfig()’ and ‘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 ( PEP 538(1)) and *note Python +UTF-8 Mode: 229. ( PEP 540(2)) depending on the LC_CTYPE locale, *note +PYTHONUTF8: 72c. and *note PYTHONCOERCECLOCALE: 728. environment +variables. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0538/ + + (2) https://peps.python.org/pep-0540/ + + +File: python.info, Node: Python Path Configuration, Next: Py_RunMain, Prev: Python Configuration, Up: Python Initialization Configuration + +7.10.10 Python Path Configuration +--------------------------------- + +*note PyConfig: 370. contains multiple fields for the path +configuration: + + * Path configuration inputs: + + * *note PyConfig.home: 46bc. + + * *note PyConfig.platlibdir: 1348. + + * *note PyConfig.pathconfig_warnings: 4727. + + * *note PyConfig.program_name: 46bb. + + * *note PyConfig.pythonpath_env: 4724. + + * current working directory: to get absolute paths + + * ‘PATH’ environment variable to get the program full path (from + *note PyConfig.program_name: 46bb.) + + * ‘__PYVENV_LAUNCHER__’ environment variable + + * (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). + + * Path configuration output fields: + + * *note PyConfig.base_exec_prefix: 470f. + + * *note PyConfig.base_executable: 4710. + + * *note PyConfig.base_prefix: 4712. + + * *note PyConfig.exec_prefix: 471b. + + * *note PyConfig.executable: 4711. + + * *note PyConfig.module_search_paths_set: 1c0, *note + PyConfig.module_search_paths: 1c1. + + * *note PyConfig.prefix: 4728. + +If at least one “output field” is not set, Python calculates the path +configuration to fill unset fields. If *note module_search_paths_set: +1c0. is equal to ‘0’, *note module_search_paths: 1c1. is overridden and +*note module_search_paths_set: 1c0. is set to ‘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. ‘module_search_paths’ is considered as set if +‘module_search_paths_set’ is set to ‘1’. In this case, +‘module_search_paths’ will be used without modification. + +Set *note pathconfig_warnings: 4727. to ‘0’ to suppress warnings when +calculating the path configuration (Unix only, Windows does not log any +warning). + +If *note base_prefix: 4712. or *note base_exec_prefix: 470f. fields are +not set, they inherit their value from *note prefix: 4728. and *note +exec_prefix: 471b. respectively. + +*note Py_RunMain(): 604. and *note Py_Main(): 891. modify *note +sys.path: 162.: + + * If *note run_filename: 472c. is set and is a directory which + contains a ‘__main__.py’ script, prepend *note run_filename: 472c. + to *note sys.path: 162. + + * If *note isolated: 46ff. is zero: + + * If *note run_module: 472e. is set, prepend the current + directory to *note sys.path: 162. Do nothing if the current + directory cannot be read. + + * If *note run_filename: 472c. is set, prepend the directory of + the filename to *note sys.path: 162. + + * Otherwise, prepend an empty string to *note sys.path: 162. + +If *note site_import: 4730. is non-zero, *note sys.path: 162. can be +modified by the *note site: e8. module. If *note user_site_directory: +4721. is non-zero and the user’s site-package directory exists, the +*note site: e8. module appends the user’s site-package directory to +*note sys.path: 162. + +The following configuration files are used by the path configuration: + + * ‘pyvenv.cfg’ + + * ‘._pth’ file (ex: ‘python._pth’) + + * ‘pybuilddir.txt’ (Unix only) + +If a ‘._pth’ file is present: + + * Set *note isolated: 46ff. to ‘1’. + + * Set *note use_environment: 5d7. to ‘0’. + + * Set *note site_import: 4730. to ‘0’. + + * Set *note safe_path: 345. to ‘1’. + +The ‘__PYVENV_LAUNCHER__’ environment variable is used to set *note +PyConfig.base_executable: 4710. + + +File: python.info, Node: Py_RunMain, Next: Py_GetArgcArgv, Prev: Python Path Configuration, Up: Python Initialization Configuration + +7.10.11 Py_RunMain() +-------------------- + + -- C Function: int Py_RunMain (void) + + Execute the command (*note PyConfig.run_command: 472b.), the script + (*note PyConfig.run_filename: 472c.) or the module (*note + PyConfig.run_module: 472e.) specified on the command line or in the + configuration. + + By default and when if *note -i: 111d. option is used, run the + REPL. + + Finally, finalizes Python and returns an exit status that can be + passed to the ‘exit()’ function. + +See *note Python Configuration: 46e0. for an example of customized +Python always running in isolated mode using *note Py_RunMain(): 604. + + +File: python.info, Node: Py_GetArgcArgv, Next: Multi-Phase Initialization Private Provisional API, Prev: Py_RunMain, Up: Python Initialization Configuration + +7.10.12 Py_GetArgcArgv() +------------------------ + + -- C Function: void Py_GetArgcArgv (int *argc, wchar_t ***argv) + + Get the original command line arguments, before Python modified + them. + + See also *note PyConfig.orig_argv: 4bb. member. + + +File: python.info, Node: Multi-Phase Initialization Private Provisional API, Prev: Py_GetArgcArgv, Up: Python Initialization Configuration + +7.10.13 Multi-Phase Initialization Private Provisional API +---------------------------------------------------------- + +This section is a private provisional API introducing multi-phase +initialization, the core feature of PEP 432(1): + + * “Core” initialization phase, “bare minimum Python”: + + * Builtin types; + + * Builtin exceptions; + + * Builtin and frozen modules; + + * The *note sys: f9. module is only partially initialized (ex: + *note sys.path: 162. doesn’t exist yet). + + * “Main” initialization phase, Python is fully initialized: + + * Install and configure *note importlib: 97.; + + * Apply the *note Path Configuration: 4e8.; + + * Install signal handlers; + + * Finish *note sys: f9. module initialization (ex: create *note + sys.stdout: 72a. and *note sys.path: 162.); + + * Enable optional features like *note faulthandler: 78. and + *note tracemalloc: 11e.; + + * Import the *note site: e8. module; + + * etc. + +Private provisional API: + + * ‘PyConfig._init_main’: if set to ‘0’, *note + Py_InitializeFromConfig(): 600. stops at the “Core” initialization + phase. + + * ‘PyConfig._isolated_interpreter’: if non-zero, disallow threads, + subprocesses and fork. + + -- C Function: *note PyStatus: 5fd. _Py_InitializeMain (void) + + Move to the “Main” initialization phase, finish the Python + initialization. + +No module is imported during the “Core” phase and the ‘importlib’ module +is not configured: the *note Path Configuration: 4e8. is only applied +during the “Main” phase. It may allow to customize Python in Python to +override or tune the *note Path Configuration: 4e8, maybe install a +custom *note sys.meta_path: 9a0. importer or an import hook, etc. + +It may become possible to calculatin the *note Path Configuration: 4e8. +in Python, after the Core phase and before the Main phase, which is one +of the PEP 432(2) motivation. + +The “Core” phase is not properly defined: what should be and what should +not be available at this phase is not specified yet. The API is marked +as private and provisional: the API can be modified or even be removed +anytime until a proper public API is designed. + +Example running Python code between “Core” and “Main” initialization +phases: + + void init_python(void) + { + PyStatus status; + + PyConfig config; + PyConfig_InitPythonConfig(&config); + config._init_main = 0; + + /* ... customize 'config' configuration ... */ + + status = Py_InitializeFromConfig(&config); + PyConfig_Clear(&config); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } + + /* Use sys.stderr because sys.stdout is only created + by _Py_InitializeMain() */ + int res = PyRun_SimpleString( + "import sys; " + "print('Run Python code before _Py_InitializeMain', " + "file=sys.stderr)"); + if (res < 0) { + exit(1); + } + + /* ... put more configuration code here ... */ + + status = _Py_InitializeMain(); + if (PyStatus_Exception(status)) { + Py_ExitStatusException(status); + } + } + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0432/ + + (2) https://peps.python.org/pep-0432/ + + +File: python.info, Node: Memory Management, Next: Object Implementation Support, Prev: Python Initialization Configuration, Up: Python/C API Reference Manual + +7.11 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:: +* tracemalloc C API:: +* Examples: Examples<38>. + + +File: python.info, Node: Overview<4>, Next: Allocator Domains, Up: Memory Management + +7.11.1 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. + +To avoid memory corruption, extension writers should never try to +operate on Python objects with the functions exported by the C library: +‘malloc()’, ‘calloc()’, ‘realloc()’ and ‘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: + + 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; + +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 escapes +completely the Python memory manager. + +See also +........ + +The *note PYTHONMALLOC: 8d5. environment variable can be used to +configure the memory allocators used by Python. + +The *note PYTHONMALLOCSTATS: 159c. environment variable can be used to +print statistics of the *note pymalloc memory allocator: 980. every time +a new pymalloc object arena is created, and on shutdown. + + +File: python.info, Node: Allocator Domains, Next: Raw Memory Interface, Prev: Overview<4>, Up: Memory Management + +7.11.2 Allocator Domains +------------------------ + +All allocating functions belong to one of three different “domains” (see +also *note PyMemAllocatorDomain: 4741.). 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 *note here: 1791. There is no hard requirement to use the +memory returned by the allocation functions belonging to a given domain +for only the purposes hinted by that domain (although this is the +recommended practice). For example, one could use the memory returned +by *note PyMem_RawMalloc(): cdf. for allocating Python objects or the +memory returned by *note PyObject_Malloc(): 8d9. for allocating memory +for buffers. + +The three allocation domains are: + + * 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 the *note GIL: + 4df. The memory is requested directly to the system. + + * “Mem” domain: intended for allocating memory for Python buffers and + general-purpose memory buffers where the allocation must be + performed with the *note GIL: 4df. held. The memory is taken from + the Python private heap. + + * Object domain: intended for allocating memory belonging to Python + objects. The memory is taken from the Python private heap. + +When freeing memory previously allocated by the allocating functions +belonging to a given domain,the matching specific deallocating functions +must be used. For example, *note PyMem_Free(): 10a8. must be used to +free memory allocated using *note PyMem_Malloc(): 8d7. + + +File: python.info, Node: Raw Memory Interface, Next: Memory Interface, Prev: Allocator Domains, Up: Memory Management + +7.11.3 Raw Memory Interface +--------------------------- + +The following function sets are wrappers to the system allocator. These +functions are thread-safe, the *note GIL: 8d8. does not need to be held. + +The *note default raw memory allocator: 1791. uses the following +functions: ‘malloc()’, ‘calloc()’, ‘realloc()’ and ‘free()’; call +‘malloc(1)’ (or ‘calloc(1, 1)’) when requesting zero bytes. + +New in version 3.4. + + -- C Function: void *PyMem_RawMalloc (size_t n) + + Allocates `n' bytes and returns a pointer of type void* to the + allocated memory, or ‘NULL’ if the request fails. + + Requesting zero bytes returns a distinct non-‘NULL’ pointer if + possible, as if ‘PyMem_RawMalloc(1)’ had been called instead. The + memory will not have been initialized in any way. + + -- C Function: void *PyMem_RawCalloc (size_t nelem, size_t elsize) + + Allocates `nelem' elements each whose size in bytes is `elsize' and + returns a pointer of type void* to the allocated memory, or ‘NULL’ + if the request fails. The memory is initialized to zeros. + + Requesting zero elements or elements of size zero bytes returns a + distinct non-‘NULL’ pointer if possible, as if ‘PyMem_RawCalloc(1, + 1)’ had been called instead. + + New in version 3.5. + + -- C Function: void *PyMem_RawRealloc (void *p, size_t n) + + 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 ‘NULL’, the call is equivalent to ‘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-‘NULL’. + + Unless `p' is ‘NULL’, it must have been returned by a previous call + to *note PyMem_RawMalloc(): cdf, *note PyMem_RawRealloc(): ce0. or + *note PyMem_RawCalloc(): b3a. + + If the request fails, *note PyMem_RawRealloc(): ce0. returns ‘NULL’ + and `p' remains a valid pointer to the previous memory area. + + -- C Function: void PyMem_RawFree (void *p) + + Frees the memory block pointed to by `p', which must have been + returned by a previous call to *note PyMem_RawMalloc(): cdf, *note + PyMem_RawRealloc(): ce0. or *note PyMem_RawCalloc(): b3a. + Otherwise, or if ‘PyMem_RawFree(p)’ has been called before, + undefined behavior occurs. + + If `p' is ‘NULL’, no operation is performed. + + +File: python.info, Node: Memory Interface, Next: Object allocators, Prev: Raw Memory Interface, Up: Memory Management + +7.11.4 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. + +The *note default memory allocator: 1791. uses the *note pymalloc memory +allocator: 980. + + Warning: The *note GIL: 8d8. must be held when using these + functions. + +Changed in version 3.6: The default allocator is now pymalloc instead of +system ‘malloc()’. + + -- C Function: void *PyMem_Malloc (size_t n) + ` Part of the *note Stable ABI: 4b8.' Allocates `n' bytes and + returns a pointer of type void* to the allocated memory, or ‘NULL’ + if the request fails. + + Requesting zero bytes returns a distinct non-‘NULL’ pointer if + possible, as if ‘PyMem_Malloc(1)’ had been called instead. The + memory will not have been initialized in any way. + + -- C Function: void *PyMem_Calloc (size_t nelem, size_t elsize) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Allocates + `nelem' elements each whose size in bytes is `elsize' and returns a + pointer of type void* to the allocated memory, or ‘NULL’ if the + request fails. The memory is initialized to zeros. + + Requesting zero elements or elements of size zero bytes returns a + distinct non-‘NULL’ pointer if possible, as if ‘PyMem_Calloc(1, 1)’ + had been called instead. + + New in version 3.5. + + -- C Function: void *PyMem_Realloc (void *p, size_t n) + ` Part of the *note Stable ABI: 4b8.' 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 ‘NULL’, the call is equivalent to ‘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-‘NULL’. + + Unless `p' is ‘NULL’, it must have been returned by a previous call + to *note PyMem_Malloc(): 8d7, *note PyMem_Realloc(): ce1. or *note + PyMem_Calloc(): b3b. + + If the request fails, *note PyMem_Realloc(): ce1. returns ‘NULL’ + and `p' remains a valid pointer to the previous memory area. + + -- C Function: void PyMem_Free (void *p) + ` Part of the *note Stable ABI: 4b8.' Frees the memory block + pointed to by `p', which must have been returned by a previous call + to *note PyMem_Malloc(): 8d7, *note PyMem_Realloc(): ce1. or *note + PyMem_Calloc(): b3b. Otherwise, or if ‘PyMem_Free(p)’ has been + called before, undefined behavior occurs. + + If `p' is ‘NULL’, no operation is performed. + +The following type-oriented macros are provided for convenience. Note +that `TYPE' refers to any C type. + + -- C Function: TYPE *PyMem_New (TYPE, size_t n) + + Same as *note PyMem_Malloc(): 8d7, but allocates ‘(n * + sizeof(TYPE))’ bytes of memory. Returns a pointer cast to TYPE*. + The memory will not have been initialized in any way. + + -- C Function: TYPE *PyMem_Resize (void *p, TYPE, size_t n) + + Same as *note PyMem_Realloc(): ce1, but the memory block is resized + to ‘(n * sizeof(TYPE))’ bytes. Returns a pointer cast to TYPE*. + On return, `p' will be a pointer to the new memory area, or ‘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. + + -- C Function: void PyMem_Del (void *p) + + Same as *note PyMem_Free(): 10a8. + +In addition, the following macro sets are provided for calling the +Python memory allocator directly, without involving the C API functions +listed above. However, note that their use does not preserve binary +compatibility across Python versions and is therefore deprecated in +extension modules. + + * ‘PyMem_MALLOC(size)’ + + * ‘PyMem_NEW(type, size)’ + + * ‘PyMem_REALLOC(ptr, size)’ + + * ‘PyMem_RESIZE(ptr, type, size)’ + + * ‘PyMem_FREE(ptr)’ + + * ‘PyMem_DEL(ptr)’ + + +File: python.info, Node: Object allocators, Next: Default Memory Allocators, Prev: Memory Interface, Up: Memory Management + +7.11.5 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. + + 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 *note Customize Memory Allocators: 4749. section. + +The *note default object allocator: 1791. uses the *note pymalloc memory +allocator: 980. + + Warning: The *note GIL: 8d8. must be held when using these + functions. + + -- C Function: void *PyObject_Malloc (size_t n) + ` Part of the *note Stable ABI: 4b8.' Allocates `n' bytes and + returns a pointer of type void* to the allocated memory, or ‘NULL’ + if the request fails. + + Requesting zero bytes returns a distinct non-‘NULL’ pointer if + possible, as if ‘PyObject_Malloc(1)’ had been called instead. The + memory will not have been initialized in any way. + + -- C Function: void *PyObject_Calloc (size_t nelem, size_t elsize) + ` Part of the *note Stable ABI: 4b8. since version 3.7.' Allocates + `nelem' elements each whose size in bytes is `elsize' and returns a + pointer of type void* to the allocated memory, or ‘NULL’ if the + request fails. The memory is initialized to zeros. + + Requesting zero elements or elements of size zero bytes returns a + distinct non-‘NULL’ pointer if possible, as if ‘PyObject_Calloc(1, + 1)’ had been called instead. + + New in version 3.5. + + -- C Function: void *PyObject_Realloc (void *p, size_t n) + ` Part of the *note Stable ABI: 4b8.' 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 ‘NULL’, the call is equivalent to ‘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-‘NULL’. + + Unless `p' is ‘NULL’, it must have been returned by a previous call + to *note PyObject_Malloc(): 8d9, *note PyObject_Realloc(): 10a9. or + *note PyObject_Calloc(): b3c. + + If the request fails, *note PyObject_Realloc(): 10a9. returns + ‘NULL’ and `p' remains a valid pointer to the previous memory area. + + -- C Function: void PyObject_Free (void *p) + ` Part of the *note Stable ABI: 4b8.' Frees the memory block + pointed to by `p', which must have been returned by a previous call + to *note PyObject_Malloc(): 8d9, *note PyObject_Realloc(): 10a9. or + *note PyObject_Calloc(): b3c. Otherwise, or if ‘PyObject_Free(p)’ + has been called before, undefined behavior occurs. + + If `p' is ‘NULL’, no operation is performed. + + +File: python.info, Node: Default Memory Allocators, Next: Customize Memory Allocators, Prev: Object allocators, Up: Memory Management + +7.11.6 Default Memory Allocators +-------------------------------- + +Default memory allocators: + +Configuration Name PyMem_RawMalloc PyMem_Malloc PyObject_Malloc + +--------------------------------------------------------------------------------------------------------------------------------------- + +Release build ‘"pymalloc"’ ‘malloc’ ‘pymalloc’ ‘pymalloc’ + + +Debug build ‘"pymalloc_debug"’ ‘malloc’ + debug ‘pymalloc’ + debug ‘pymalloc’ + debug + + +Release build, without pymalloc ‘"malloc"’ ‘malloc’ ‘malloc’ ‘malloc’ + + +Debug build, without pymalloc ‘"malloc_debug"’ ‘malloc’ + debug ‘malloc’ + debug ‘malloc’ + debug + + +Legend: + + * Name: value for *note PYTHONMALLOC: 8d5. environment variable. + + * ‘malloc’: system allocators from the standard C library, C + functions: ‘malloc()’, ‘calloc()’, ‘realloc()’ and ‘free()’. + + * ‘pymalloc’: *note pymalloc memory allocator: 980. + + * “+ debug”: with *note debug hooks on the Python memory allocators: + 1792. + + * “Debug build”: *note Python build in debug mode: 496. + + +File: python.info, Node: Customize Memory Allocators, Next: Debug hooks on the Python memory allocators, Prev: Default Memory Allocators, Up: Memory Management + +7.11.7 Customize Memory Allocators +---------------------------------- + +New in version 3.4. + + -- C Type: type PyMemAllocatorEx + + Structure used to describe a memory block allocator. The structure + has the following fields: + + Field Meaning + + ----------------------------------------------------------------------------------------------------------- + + ‘void *ctx’ user context passed as first argument + + + ‘void* malloc(void *ctx, size_t size)’ allocate a memory block + + + ‘void* calloc(void *ctx, size_t nelem, size_t elsize)’ allocate a memory block initialized with + zeros + + + ‘void* realloc(void *ctx, void *ptr, size_t new_size)’ allocate or resize a memory block + + + ‘void free(void *ctx, void *ptr)’ free a memory block + + + Changed in version 3.5: The ‘PyMemAllocator’ structure was renamed + to *note PyMemAllocatorEx: b5d. and a new ‘calloc’ field was added. + + -- C Type: type PyMemAllocatorDomain + + Enum used to identify an allocator domain. Domains: + + -- C Macro: PYMEM_DOMAIN_RAW + + Functions: + + * *note PyMem_RawMalloc(): cdf. + + * *note PyMem_RawRealloc(): ce0. + + * *note PyMem_RawCalloc(): b3a. + + * *note PyMem_RawFree(): 44b3. + + -- C Macro: PYMEM_DOMAIN_MEM + + Functions: + + * *note PyMem_Malloc(): 8d7, + + * *note PyMem_Realloc(): ce1. + + * *note PyMem_Calloc(): b3b. + + * *note PyMem_Free(): 10a8. + + -- C Macro: PYMEM_DOMAIN_OBJ + + Functions: + + * *note PyObject_Malloc(): 8d9. + + * *note PyObject_Realloc(): 10a9. + + * *note PyObject_Calloc(): b3c. + + * *note PyObject_Free(): 8d6. + + -- C Function: void PyMem_GetAllocator (PyMemAllocatorDomain domain, + PyMemAllocatorEx *allocator) + + Get the memory block allocator of the specified domain. + + -- 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-‘NULL’ pointer when + requesting zero bytes. + + For the ‘PYMEM_DOMAIN_RAW’ domain, the allocator must be + thread-safe: the *note GIL: 8d8. is not held when the allocator is + called. + + If the new allocator is not a hook (does not call the previous + allocator), the *note PyMem_SetupDebugHooks(): 8da. function must + be called to reinstall the debug hooks on top on the new allocator. + + See also *note PyPreConfig.allocator: 46f7. and *note Preinitialize + Python with PyPreConfig: 354d. + + -- C Function: void PyMem_SetupDebugHooks (void) + + Setup *note debug hooks in the Python memory allocators: 1792. to + detect memory errors. + + +File: python.info, Node: Debug hooks on the Python memory allocators, Next: The pymalloc allocator, Prev: Customize Memory Allocators, Up: Memory Management + +7.11.8 Debug hooks on the Python memory allocators +-------------------------------------------------- + +When *note Python is built in debug mode: 496, the *note +PyMem_SetupDebugHooks(): 8da. function is called at the *note Python +preinitialization: 354d. to setup debug hooks on Python memory +allocators to detect memory errors. + +The *note PYTHONMALLOC: 8d5. environment variable can be used to install +debug hooks on a Python compiled in release mode (ex: +‘PYTHONMALLOC=debug’). + +The *note PyMem_SetupDebugHooks(): 8da. function can be used to set +debug hooks after calling *note PyMem_SetAllocator(): 46a8. + +These debug hooks fill dynamically allocated memory blocks with special, +recognizable bit patterns. Newly allocated memory is filled with the +byte ‘0xCD’ (‘PYMEM_CLEANBYTE’), freed memory is filled with the byte +‘0xDD’ (‘PYMEM_DEADBYTE’). Memory blocks are surrounded by “forbidden +bytes” filled with the byte ‘0xFD’ (‘PYMEM_FORBIDDENBYTE’). Strings of +these bytes are unlikely to be valid addresses, floats, or ASCII +strings. + +Runtime checks: + + - Detect API violations. For example, detect if *note + PyObject_Free(): 8d6. is called on a memory block allocated by + *note PyMem_Malloc(): 8d7. + + - Detect write before the start of the buffer (buffer underflow). + + - Detect write after the end of the buffer (buffer overflow). + + - Check that the *note GIL: 8d8. is held when allocator functions of + ‘PYMEM_DOMAIN_OBJ’ (ex: *note PyObject_Malloc(): 8d9.) and + ‘PYMEM_DOMAIN_MEM’ (ex: *note PyMem_Malloc(): 8d7.) domains are + called. + +On error, the debug hooks use the *note tracemalloc: 11e. module to get +the traceback where a memory block was allocated. The traceback is only +displayed if *note tracemalloc: 11e. is tracing Python memory +allocations and the memory block was traced. + +Let `S' = ‘sizeof(size_t)’. ‘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 (‘p[i:j]’ means the slice of bytes from ‘*(p+i)’ inclusive up +to ‘*(p+j)’ exclusive; note that the treatment of negative indices +differs from a Python slice): + +‘p[-2*S:-S]’ + + Number of bytes originally asked for. This is a size_t, big-endian + (easier to read in a memory dump). + +‘p[-S]’ + + API identifier (ASCII character): + + * ‘'r'’ for ‘PYMEM_DOMAIN_RAW’. + + * ‘'m'’ for ‘PYMEM_DOMAIN_MEM’. + + * ‘'o'’ for ‘PYMEM_DOMAIN_OBJ’. + +‘p[-S+1:0]’ + + Copies of PYMEM_FORBIDDENBYTE. Used to catch under- writes and + reads. + +‘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. + +‘p[N:N+S]’ + + Copies of PYMEM_FORBIDDENBYTE. Used to catch over- writes and + reads. + +‘p[N+S:N+2*S]’ + + Only used if the ‘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 ‘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. + +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 *note PyMem_SetupDebugHooks(): 8da. function +now also works on Python compiled in release mode. On error, the debug +hooks now use *note tracemalloc: 11e. to get the traceback where a +memory block was allocated. The debug hooks now also check if the GIL +is held when functions of ‘PYMEM_DOMAIN_OBJ’ and ‘PYMEM_DOMAIN_MEM’ +domains are called. + +Changed in version 3.8: Byte patterns ‘0xCB’ (‘PYMEM_CLEANBYTE’), ‘0xDB’ +(‘PYMEM_DEADBYTE’) and ‘0xFB’ (‘PYMEM_FORBIDDENBYTE’) have been replaced +with ‘0xCD’, ‘0xDD’ and ‘0xFD’ to use the same values than Windows CRT +debug ‘malloc()’ and ‘free()’. + + +File: python.info, Node: The pymalloc allocator, Next: tracemalloc C API, Prev: Debug hooks on the Python memory allocators, Up: Memory Management + +7.11.9 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 256 KiB. It falls back to *note +PyMem_RawMalloc(): cdf. and *note PyMem_RawRealloc(): ce0. for +allocations larger than 512 bytes. + +`pymalloc' is the *note default allocator: 1791. of the +‘PYMEM_DOMAIN_MEM’ (ex: *note PyMem_Malloc(): 8d7.) and +‘PYMEM_DOMAIN_OBJ’ (ex: *note PyObject_Malloc(): 8d9.) domains. + +The arena allocator uses the following functions: + + * ‘VirtualAlloc()’ and ‘VirtualFree()’ on Windows, + + * ‘mmap()’ and ‘munmap()’ if available, + + * ‘malloc()’ and ‘free()’ otherwise. + +This allocator is disabled if Python is configured with the *note +–without-pymalloc: 17c0. option. It can also be disabled at runtime +using the *note PYTHONMALLOC: 8d5. environment variable (ex: +‘PYTHONMALLOC=malloc’). + +* Menu: + +* Customize pymalloc Arena Allocator:: + + +File: python.info, Node: Customize pymalloc Arena Allocator, Up: The pymalloc allocator + +7.11.9.1 Customize pymalloc Arena Allocator +........................................... + +New in version 3.4. + + -- C Type: type PyObjectArenaAllocator + + Structure used to describe an arena allocator. The structure has + three fields: + + Field Meaning + + --------------------------------------------------------------------------------------------------- + + ‘void *ctx’ user context passed as first argument + + + ‘void* alloc(void *ctx, size_t size)’ allocate an arena of size bytes + + + ‘void free(void *ctx, void *ptr, size_t size)’ free an arena + + + -- C Function: void PyObject_GetArenaAllocator (PyObjectArenaAllocator + *allocator) + + Get the arena allocator. + + -- C Function: void PyObject_SetArenaAllocator (PyObjectArenaAllocator + *allocator) + + Set the arena allocator. + + +File: python.info, Node: tracemalloc C API, Next: Examples<38>, Prev: The pymalloc allocator, Up: Memory Management + +7.11.10 tracemalloc C API +------------------------- + +New in version 3.7. + + -- C Function: int PyTraceMalloc_Track (unsigned int domain, uintptr_t + ptr, size_t size) + + Track an allocated memory block in the *note tracemalloc: 11e. + module. + + Return ‘0’ on success, return ‘-1’ on error (failed to allocate + memory to store the trace). Return ‘-2’ if tracemalloc is + disabled. + + If memory block is already tracked, update the existing trace. + + -- C Function: int PyTraceMalloc_Untrack (unsigned int domain, + uintptr_t ptr) + + Untrack an allocated memory block in the *note tracemalloc: 11e. + module. Do nothing if the block was not tracked. + + Return ‘-2’ if tracemalloc is disabled, otherwise return ‘0’. + + +File: python.info, Node: Examples<38>, Prev: tracemalloc C API, Up: Memory Management + +7.11.11 Examples +---------------- + +Here is the example from section *note Overview: 473e, rewritten so that +the I/O buffer is allocated from the Python heap by using the first +function set: + + 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; + +The same code using the type-oriented function set: + + 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_Del(buf); /* allocated with PyMem_New */ + return res; + +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. + + 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_Del() */ + +In addition to the functions aimed at handling raw memory blocks from +the Python heap, objects in Python are allocated and released with *note +PyObject_New(): 5db, *note PyObject_NewVar(): 5dc. and *note +PyObject_Del(): 1114. + +These will be explained in the next chapter on defining and implementing +new object types in C. + + +File: python.info, Node: Object Implementation Support, Next: API and ABI Versioning, Prev: Memory Management, Up: Python/C API Reference Manual + +7.12 Object Implementation Support +================================== + +This chapter describes the functions, types, and macros used when +defining new object types. + +* Menu: + +* Allocating Objects on the Heap:: +* Common Object Structures:: +* Type Objects: Type Objects<3>. +* Number Object Structures:: +* Mapping Object Structures:: +* Sequence Object Structures:: +* Buffer Object Structures:: +* Async Object Structures:: +* Slot Type typedefs:: +* Examples: Examples<39>. +* Supporting Cyclic Garbage Collection:: + + +File: python.info, Node: Allocating Objects on the Heap, Next: Common Object Structures, Up: Object Implementation Support + +7.12.1 Allocating Objects on the Heap +------------------------------------- + + -- C Function: *note PyObject: 4cf. *_PyObject_New (PyTypeObject *type) + `Return value: New reference.' + + -- C Function: *note PyVarObject: 39c6. *_PyObject_NewVar (PyTypeObject + *type, Py_ssize_t size) + `Return value: New reference.' + + -- C Function: *note PyObject: 4cf. *PyObject_Init (PyObject *op, + PyTypeObject *type) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' Initialize a newly allocated object `op' with its type and + initial reference. Returns the initialized object. If `type' + indicates that the object participates in the cyclic garbage + detector, it is added to the detector’s set of observed objects. + Other fields of the object are not affected. + + -- C Function: *note PyVarObject: 39c6. *PyObject_InitVar (PyVarObject + *op, PyTypeObject *type, Py_ssize_t size) + `Return value: Borrowed reference.'` Part of the *note Stable ABI: + 4b8.' This does everything *note PyObject_Init(): 6bc. does, and + also initializes the length information for a variable-size object. + + -- C Function: TYPE *PyObject_New (TYPE, PyTypeObject *type) + `Return value: New reference.' Allocate a new Python object using + the C structure type `TYPE' and the Python type object `type'. + Fields not defined by the Python object header are not initialized; + the object’s reference count will be one. The size of the memory + allocation is determined from the *note tp_basicsize: 5dd. field of + the type object. + + -- C Function: TYPE *PyObject_NewVar (TYPE, PyTypeObject *type, + Py_ssize_t size) + `Return value: New reference.' Allocate a new Python object using + the C structure type `TYPE' and the Python type object `type'. + Fields not defined by the Python object header are not initialized. + The allocated memory allows for the `TYPE' structure plus `size' + fields of the size given by the *note tp_itemsize: 425d. field of + `type'. 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. + + -- C Function: void PyObject_Del (void *op) + + Releases memory allocated to an object using *note PyObject_New(): + 5db. or *note PyObject_NewVar(): 5dc. This is normally called from + the *note tp_dealloc: 4263. handler specified in the object’s type. + The fields of the object should not be accessed after this call as + the memory is no longer a valid Python object. + + -- C Variable: *note PyObject: 4cf. _Py_NoneStruct + + Object which is visible in Python as ‘None’. This should only be + accessed using the *note Py_None: 4231. macro, which evaluates to a + pointer to this object. + +See also +........ + +*note PyModule_Create(): 4234. + + To allocate and create extension modules. + + +File: python.info, Node: Common Object Structures, Next: Type Objects<3>, Prev: Allocating Objects on the Heap, Up: Object Implementation Support + +7.12.2 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:: + + +File: python.info, Node: Base object types and macros, Next: Implementing functions and methods, Up: Common Object Structures + +7.12.2.1 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 *note PyObject: 4cf. and *note PyVarObject: 39c6. +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. + + -- C Type: type PyObject + ` Part of the *note Limited API: 4b8. (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 + *note PyObject: 4cf, but every pointer to a Python object can be + cast to a *note PyObject: 4cf.*. Access to the members must be + done by using the macros *note Py_REFCNT: 4dc. and *note Py_TYPE: + 355. + + -- C Type: type PyVarObject + ` Part of the *note Limited API: 4b8. (Only some members are part + of the stable ABI.)' This is an extension of *note PyObject: 4cf. + that adds the ‘ob_size’ field. This is only used for objects that + have some notion of `length'. This type does not often appear in + the Python/C API. Access to the members must be done by using the + macros *note Py_REFCNT: 4dc, *note Py_TYPE: 355, and *note Py_SIZE: + 357. + + -- 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: + + PyObject ob_base; + + See documentation of *note PyObject: 4cf. above. + + -- 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: + + PyVarObject ob_base; + + See documentation of *note PyVarObject: 39c6. above. + + -- C Function: int Py_Is (PyObject *x, PyObject *y) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Test if + the `x' object is the `y' object, the same as ‘x is y’ in Python. + + New in version 3.10. + + -- C Function: int Py_IsNone (PyObject *x) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Test if + an object is the ‘None’ singleton, the same as ‘x is None’ in + Python. + + New in version 3.10. + + -- C Function: int Py_IsTrue (PyObject *x) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Test if + an object is the ‘True’ singleton, the same as ‘x is True’ in + Python. + + New in version 3.10. + + -- C Function: int Py_IsFalse (PyObject *x) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Test if + an object is the ‘False’ singleton, the same as ‘x is False’ in + Python. + + New in version 3.10. + + -- C Function: *note PyTypeObject: 701. *Py_TYPE (PyObject *o) + + Get the type of the Python object `o'. + + Return a *note borrowed reference: 42cb. + + Use the *note Py_SET_TYPE(): 356. function to set an object type. + + Changed in version 3.11: *note Py_TYPE(): 355. is changed to an + inline static function. The parameter type is no longer const + *note PyObject: 4cf.*. + + -- 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: ‘Py_TYPE(o) == type’. + + New in version 3.9. + + -- C Function: void Py_SET_TYPE (PyObject *o, PyTypeObject *type) + + Set the object `o' type to `type'. + + New in version 3.9. + + -- C Function: *note Py_ssize_t: 6b1. Py_REFCNT (PyObject *o) + + Get the reference count of the Python object `o'. + + Use the *note Py_SET_REFCNT(): 4dd. function to set an object + reference count. + + Changed in version 3.11: The parameter type is no longer const + *note PyObject: 4cf.*. + + Changed in version 3.10: *note Py_REFCNT(): 4dc. is changed to the + inline static function. + + -- C Function: void Py_SET_REFCNT (PyObject *o, Py_ssize_t refcnt) + + Set the object `o' reference counter to `refcnt'. + + New in version 3.9. + + -- C Function: *note Py_ssize_t: 6b1. Py_SIZE (PyVarObject *o) + + Get the size of the Python object `o'. + + Use the *note Py_SET_SIZE(): 358. function to set an object size. + + Changed in version 3.11: *note Py_SIZE(): 357. is changed to an + inline static function. The parameter type is no longer const + *note PyVarObject: 39c6.*. + + -- C Function: void Py_SET_SIZE (PyVarObject *o, Py_ssize_t size) + + Set the object `o' size to `size'. + + New in version 3.9. + + -- C Macro: PyObject_HEAD_INIT (type) + + This is a macro which expands to initialization values for a new + *note PyObject: 4cf. type. This macro expands to: + + _PyObject_EXTRA_INIT + 1, type, + + -- C Macro: PyVarObject_HEAD_INIT (type, size) + + This is a macro which expands to initialization values for a new + *note PyVarObject: 39c6. type, including the ‘ob_size’ field. This + macro expands to: + + _PyObject_EXTRA_INIT + 1, type, size, + + +File: python.info, Node: Implementing functions and methods, Next: Accessing attributes of extension types, Prev: Base object types and macros, Up: Common Object Structures + +7.12.2.2 Implementing functions and methods +........................................... + + -- C Type: type PyCFunction + ` Part of the *note Stable ABI: 4b8.' Type of the functions used + to implement most Python callables in C. Functions of this type + take two *note PyObject: 4cf.* parameters and return one such + value. If the return value is ‘NULL’, an exception shall have been + set. If not ‘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: + + PyObject *PyCFunction(PyObject *self, + PyObject *args); + + -- C Type: type PyCFunctionWithKeywords + ` Part of the *note Stable ABI: 4b8.' Type of the functions used + to implement Python callables in C with signature ‘METH_VARARGS | + METH_KEYWORDS’. The function signature is: + + PyObject *PyCFunctionWithKeywords(PyObject *self, + PyObject *args, + PyObject *kwargs); + + -- C Type: type _PyCFunctionFast + + Type of the functions used to implement Python callables in C with + signature *note METH_FASTCALL: 1202. The function signature is: + + PyObject *_PyCFunctionFast(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs); + + -- C Type: type _PyCFunctionFastWithKeywords + + Type of the functions used to implement Python callables in C with + signature ‘METH_FASTCALL | METH_KEYWORDS’. The function signature + is: + + PyObject *_PyCFunctionFastWithKeywords(PyObject *self, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames); + + -- C Type: type PyCMethod + + Type of the functions used to implement Python callables in C with + signature ‘METH_METHOD | METH_FASTCALL | METH_KEYWORDS’. The + function signature is: + + PyObject *PyCMethod(PyObject *self, + PyTypeObject *defining_class, + PyObject *const *args, + Py_ssize_t nargs, + PyObject *kwnames) + + New in version 3.9. + + -- C Type: type PyMethodDef + ` Part of the *note Stable ABI: 4b8. (including all members).' + Structure used to describe a method of an extension type. This + structure has four fields: + + Field C Type Meaning + + ------------------------------------------------------------------------------- + + ‘ml_name’ const char * name of the method + + + ‘ml_meth’ PyCFunction pointer to the C implementation + + + ‘ml_flags’ int flag bits indicating how the call + should be constructed + + + ‘ml_doc’ const char * points to the contents of the + docstring + + +The ‘ml_meth’ is a C function pointer. The functions may be of +different types, but they always return *note PyObject: 4cf.*. If the +function is not of the *note PyCFunction: 10d9, the compiler will +require a cast in the method table. Even though *note PyCFunction: +10d9. defines the first parameter as *note PyObject: 4cf.*, it is common +that the method implementation uses the specific C type of the `self' +object. + +The ‘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: + + -- Data: METH_VARARGS + + This is the typical calling convention, where the methods have the + type *note PyCFunction: 10d9. The function expects two *note + PyObject: 4cf.* 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 *note + PyArg_ParseTuple(): 4d9. or *note PyArg_UnpackTuple(): 1141. + + -- Data: METH_VARARGS | METH_KEYWORDS + + Methods with these flags must be of type *note + PyCFunctionWithKeywords: 42f3. The function expects three + parameters: `self', `args', `kwargs' where `kwargs' is a dictionary + of all the keyword arguments or possibly ‘NULL’ if there are no + keyword arguments. The parameters are typically processed using + *note PyArg_ParseTupleAndKeywords(): 987. + + -- Data: METH_FASTCALL + + Fast calling convention supporting only positional arguments. The + methods have the type *note _PyCFunctionFast: 4767. The first + parameter is `self', the second parameter is a C array of *note + PyObject: 4cf.* values indicating the arguments and the third + parameter is the number of arguments (the length of the array). + + New in version 3.7. + + Changed in version 3.10: ‘METH_FASTCALL’ is now part of the stable + ABI. + + -- Data: METH_FASTCALL | METH_KEYWORDS + + Extension of *note METH_FASTCALL: 1202. supporting also keyword + arguments, with methods of type *note _PyCFunctionFastWithKeywords: + 4768. Keyword arguments are passed the same way as in the *note + vectorcall protocol: 606.: there is an additional fourth *note + PyObject: 4cf.* parameter which is a tuple representing the names + of the keyword arguments (which are guaranteed to be strings) or + possibly ‘NULL’ if there are no keywords. The values of the + keyword arguments are stored in the `args' array, after the + positional arguments. + + New in version 3.7. + + -- Data: METH_METHOD | METH_FASTCALL | METH_KEYWORDS + + Extension of ‘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 + ‘Py_TYPE(self)’. + + The method needs to be of type *note PyCMethod: 336, the same as + for ‘METH_FASTCALL | METH_KEYWORDS’ with ‘defining_class’ argument + added after ‘self’. + + New in version 3.9. + + -- Data: METH_NOARGS + + Methods without parameters don’t need to check whether arguments + are given if they are listed with the *note METH_NOARGS: 1116. + flag. They need to be of type *note PyCFunction: 10d9. 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 ‘NULL’. + + The function must have 2 parameters. Since the second parameter is + unused, *note Py_UNUSED: 42c3. can be used to prevent a compiler + warning. + + -- Data: METH_O + + Methods with a single object argument can be listed with the *note + METH_O: 1142. flag, instead of invoking *note PyArg_ParseTuple(): + 4d9. with a ‘"O"’ argument. They have the type *note PyCFunction: + 10d9, with the `self' parameter, and a *note PyObject: 4cf.* + parameter representing the single argument. + +These two constants are not used to indicate the calling convention but +the binding when use 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. + + -- Data: METH_CLASS + + 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 *note + classmethod(): 18d. built-in function. + + -- Data: METH_STATIC + + The method will be passed ‘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 *note staticmethod(): + 3c8. built-in function. + +One other constant controls whether a method is loaded in place of +another definition with the same method name. + + -- Data: METH_COEXIST + + 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 ‘__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. + + +File: python.info, Node: Accessing attributes of extension types, Prev: Implementing functions and methods, Up: Common Object Structures + +7.12.2.3 Accessing attributes of extension types +................................................ + + -- C Type: type PyMemberDef + ` Part of the *note Stable ABI: 4b8. (including all members).' + Structure which describes an attribute of a type which corresponds + to a C struct member. Its fields are: + + Field C Type Meaning + + ------------------------------------------------------------------------------- + + ‘name’ const char * name of the member + + + ‘type’ int the type of the member in the C + struct + + + ‘offset’ Py_ssize_t the offset in bytes that the + member is located on the type’s + object struct + + + ‘flags’ int flag bits indicating if the field + should be read-only or writable + + + ‘doc’ const char * points to the contents of the + docstring + + + ‘type’ can be one of many ‘T_’ macros corresponding to various C + types. When the member is accessed in Python, it will be converted + to the equivalent Python type. + + Macro name C type + + ------------------------------------------- + + T_SHORT short + + + T_INT int + + + T_LONG long + + + T_FLOAT float + + + T_DOUBLE double + + + T_STRING const char * + + + T_OBJECT PyObject * + + + T_OBJECT_EX PyObject * + + + T_CHAR char + + + T_BYTE char + + + T_UBYTE unsigned char + + + T_UINT unsigned int + + + T_USHORT unsigned short + + + T_ULONG unsigned long + + + T_BOOL char + + + T_LONGLONG long long + + + T_ULONGLONG unsigned long long + + + T_PYSSIZET Py_ssize_t + + + ‘T_OBJECT’ and ‘T_OBJECT_EX’ differ in that ‘T_OBJECT’ returns + ‘None’ if the member is ‘NULL’ and ‘T_OBJECT_EX’ raises an *note + AttributeError: 19d. Try to use ‘T_OBJECT_EX’ over ‘T_OBJECT’ + because ‘T_OBJECT_EX’ handles use of the *note del: 1694. statement + on that attribute more correctly than ‘T_OBJECT’. + + ‘flags’ can be ‘0’ for write and read access or ‘READONLY’ for + read-only access. Using ‘T_STRING’ for *note type: 9c2. implies + ‘READONLY’. ‘T_STRING’ data is interpreted as UTF-8. Only + ‘T_OBJECT’ and ‘T_OBJECT_EX’ members can be deleted. (They are set + to ‘NULL’). Heap allocated types (created using *note + PyType_FromSpec(): 5b8. or similar), ‘PyMemberDef’ may contain + definitions for the special members ‘__dictoffset__’, + ‘__weaklistoffset__’ and ‘__vectorcalloffset__’, corresponding to + *note tp_dictoffset: 455b, *note tp_weaklistoffset: 5de. and *note + tp_vectorcall_offset: 44ee. in type objects. These must be defined + with ‘T_PYSSIZET’ and ‘READONLY’, for example: + + static PyMemberDef spam_type_members[] = { + {"__dictoffset__", T_PYSSIZET, offsetof(Spam_object, dict), READONLY}, + {NULL} /* Sentinel */ + }; + + -- C Function: *note PyObject: 4cf. *PyMember_GetOne (const char + *obj_addr, struct PyMemberDef *m) + + Get an attribute belonging to the object at address `obj_addr'. + The attribute is described by ‘PyMemberDef’ `m'. Returns ‘NULL’ on + error. + + -- C Function: int PyMember_SetOne (char *obj_addr, struct PyMemberDef + *m, PyObject *o) + + Set an attribute belonging to the object at address `obj_addr' to + object `o'. The attribute to set is described by ‘PyMemberDef’ + `m'. Returns ‘0’ if successful and a negative value on failure. + + -- C Type: type PyGetSetDef + ` Part of the *note Stable ABI: 4b8. (including all members).' + Structure to define property-like access for a type. See also + description of the *note PyTypeObject.tp_getset: 426c. slot. + + Field C Type Meaning + + --------------------------------------------------------------------------------- + + name const char * attribute name + + + get getter C function to get the attribute + + + set setter optional C function to set or delete + the attribute, if omitted the + attribute is readonly + + + doc const char * optional docstring + + + closure void * optional function pointer, providing + additional data for getter and setter + + + The ‘get’ function takes one *note PyObject: 4cf.* parameter (the + instance) and a function pointer (the associated ‘closure’): + + typedef PyObject *(*getter)(PyObject *, void *); + + It should return a new reference on success or ‘NULL’ with a set + exception on failure. + + ‘set’ functions take two *note PyObject: 4cf.* parameters (the + instance and the value to be set) and a function pointer (the + associated ‘closure’): + + typedef int (*setter)(PyObject *, PyObject *, void *); + + In case the attribute should be deleted the second parameter is + ‘NULL’. Should return ‘0’ on success or ‘-1’ with a set exception + on failure. + + +File: python.info, Node: Type Objects<3>, Next: Number Object Structures, Prev: Common Object Structures, Up: Object Implementation Support + +7.12.3 Type Objects +------------------- + +Perhaps one of the most important structures of the Python object system +is the structure that defines a new type: the *note PyTypeObject: 701. +structure. Type objects can be handled using any of the ‘PyObject_*’ or +‘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 *note Examples: 476f. +section provides at-a-glance insight into the meaning and use of *note +PyTypeObject: 701. + +* Menu: + +* Quick Reference:: +* PyTypeObject Definition:: +* PyObject Slots:: +* PyVarObject Slots:: +* PyTypeObject Slots:: +* Static Types:: +* Heap Types:: + + +File: python.info, Node: Quick Reference, Next: PyTypeObject Definition, Up: Type Objects<3> + +7.12.3.1 Quick Reference +........................ + +* Menu: + +* “tp slots”:: +* sub-slots:: +* slot typedefs:: + + +File: python.info, Node: “tp slots”, Next: sub-slots, Up: Quick Reference + +7.12.3.2 “tp slots” +................... + +PyTypeObject Slot *note Type: 4773. special Info +(1) methods/attrs (2) + +--------------------------------------------------------------------------------------------- + +O T D I + + + const char * __name__ X X +*note tp_name: 12f9. + +*note tp_basicsize: 5dd.*note Py_ssize_t: 6b1. X X X + + +*note tp_itemsize: 425d.*note Py_ssize_t: 6b1. X X + + +*note tp_dealloc: 4263.*note destructor: 4460. X X X + + +*note tp_vectorcall_offset: 44ee.*note Py_ssize_t: 6b1. X X + + +(*note tp_getattr: 4281.)*note getattrfunc: 4461.__getattribute__, G + __getattr__ + + +(*note tp_setattr: 4282.)*note setattrfunc: 446e.__setattr__, G + __delattr__ + + +*note tp_as_async: 4774.*note PyAsyncMethods: 4552.*note sub-slots: 4775. % + * + + +*note tp_repr: 427a. *note reprfunc: 446c. __repr__ X X X + + +*note tp_as_number: 5e1.*note PyNumberMethods: 1081.*note sub-slots: 4775. % + * + + +*note tp_as_sequence: 4776.*note PySequenceMethods: 4288.*note sub-slots: 4775. % + * + + +*note tp_as_mapping: 4777.*note PyMappingMethods: 4289.*note sub-slots: 4775. % + * + + +*note tp_hash: 428a. *note hashfunc: 4464. __hash__ X G + + +*note tp_call: 428b. *note ternaryfunc: 4472.__call__ X X + + +*note tp_str: 427b. *note reprfunc: 446c. __str__ X X + + +*note tp_getattro: 427e.*note getattrofunc: 4462.__getattribute__, X X G + __getattr__ + + +*note tp_setattro: 427f.*note setattrofunc: 446f.__setattr__, X X G + __delattr__ + + +*note tp_as_buffer: 5df.*note PyBufferProcs: 455c. % + * + + +*note tp_flags: 12c3. unsigned long X X ? + + +*note tp_doc: 425f. const char * __doc__ X X + + +*note tp_traverse: 352.*note traverseproc: 4473. X G + + +*note tp_clear: 4278. *note inquiry: 4466. X G + + +*note tp_richcompare: 4284.*note richcmpfunc: 446d.__lt__, __le__, X G + __eq__, __ne__, + __gt__, __ge__ + + +*note tp_weaklistoffset: 5de.*note Py_ssize_t: 6b1. X ? + + +*note tp_iter: 112d. *note getiterfunc: 4463.__iter__ X + + +*note tp_iternext: 112e.*note iternextfunc: 4467.__next__ X + + +*note tp_methods: 4269.*note PyMethodDef: 1119. X X + [] + + +*note tp_members: 4267.*note PyMemberDef: 81a. X + [] + + +*note tp_getset: 426c. *note PyGetSetDef: 81b. X X + [] + + +*note tp_base: 4270. *note PyTypeObject: 701.__base__ X + * + + +*note tp_dict: 4554. *note PyObject: 4cf. __dict__ ? + * + + +*note tp_descr_get: 4778.*note descrgetfunc: 445e.__get__ X + + +*note tp_descr_set: 12fc.*note descrsetfunc: 445f.__set__, __delete__ X + + +*note tp_dictoffset: 455b.*note Py_ssize_t: 6b1. X ? + + +*note tp_init: 4266. *note initproc: 4465. __init__ X X X + + +*note tp_alloc: 4265. *note allocfunc: 445c. X ? ? + + +*note tp_new: 4260. *note newfunc: 4469. __new__ X X ? ? + + +*note tp_free: 4264. *note freefunc: 462f. X X ? ? + + +*note tp_is_gc: 4779. *note inquiry: 4466. X X + + +<*note tp_bases: 477a.>*note PyObject: 4cf. __bases__ ~ + * + + +<*note tp_mro: 4555.> *note PyObject: 4cf. __mro__ ~ + * + + +[*note tp_cache: 4556.]*note PyObject: 4cf. + * + + +[*note tp_subclasses: 4557.]*note PyObject: 4cf.__subclasses__ + * + + +[*note tp_weaklist: 4558.]*note PyObject: 4cf. + * + + +(*note tp_del: 477b.) *note destructor: 4460. + + +[*note tp_version_tag: 477c.]unsigned int + + +*note tp_finalize: 702.*note destructor: 4460.__del__ X + + +*note tp_vectorcall: 4559.*note vectorcallfunc: 44ef. + + + ---------- Footnotes ---------- + + (1) A slot name in parentheses indicates it is (effectively) +deprecated. Names in angle brackets should be treated as read-only. +Names in square brackets are for internal use only. “” (as a prefix) +means the field is required (must be non-‘NULL’). + + (2) Columns: + +`“O”': set on ‘PyBaseObject_Type’ + +`“T”': set on *note PyType_Type: 440a. + +`“D”': default (if slot is set to ‘NULL’) + + 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"). + +`“I”': inheritance + + 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 + +Note that some slots are effectively inherited through the normal +attribute lookup chain. + + +File: python.info, Node: sub-slots, Next: slot typedefs, Prev: “tp slots”, Up: Quick Reference + +7.12.3.3 sub-slots +.................. + +Slot *note Type: 4773. special + methods + +---------------------------------------------------------------------- + +*note am_await: 477e. *note unaryfunc: 4474.__await__ + + +*note am_aiter: 477f. *note unaryfunc: 4474.__aiter__ + + +*note am_anext: 4780. *note unaryfunc: 4474.__anext__ + + +*note am_send: 4781. *note sendfunc: 4782. + + + +*note nb_add: 4549. *note binaryfunc: 445d.__add__ + __radd__ + + +*note nb_inplace_add: 4783. *note binaryfunc: 445d.__iadd__ + + +*note nb_subtract: 4784. *note binaryfunc: 445d.__sub__ + __rsub__ + + +*note nb_inplace_subtract: 4785.*note binaryfunc: 445d.__isub__ + + +*note nb_multiply: 4786. *note binaryfunc: 445d.__mul__ + __rmul__ + + +*note nb_inplace_multiply: 4787.*note binaryfunc: 445d.__imul__ + + +*note nb_remainder: 4788. *note binaryfunc: 445d.__mod__ + __rmod__ + + +*note nb_inplace_remainder: 4789.*note binaryfunc: 445d.__imod__ + + +*note nb_divmod: 478a. *note binaryfunc: 445d.__divmod__ + __rdivmod__ + + +*note nb_power: 478b. *note ternaryfunc: 4472.__pow__ + __rpow__ + + +*note nb_inplace_power: 478c. *note ternaryfunc: 4472.__ipow__ + + +*note nb_negative: 478d. *note unaryfunc: 4474.__neg__ + + +*note nb_positive: 478e. *note unaryfunc: 4474.__pos__ + + +*note nb_absolute: 478f. *note unaryfunc: 4474.__abs__ + + +*note nb_bool: 4790. *note inquiry: 4466. __bool__ + + +*note nb_invert: 4791. *note unaryfunc: 4474.__invert__ + + +*note nb_lshift: 4792. *note binaryfunc: 445d.__lshift__ + __rlshift__ + + +*note nb_inplace_lshift: 4793. *note binaryfunc: 445d.__ilshift__ + + +*note nb_rshift: 4794. *note binaryfunc: 445d.__rshift__ + __rrshift__ + + +*note nb_inplace_rshift: 4795. *note binaryfunc: 445d.__irshift__ + + +*note nb_and: 4796. *note binaryfunc: 445d.__and__ + __rand__ + + +*note nb_inplace_and: 4797. *note binaryfunc: 445d.__iand__ + + +*note nb_xor: 4798. *note binaryfunc: 445d.__xor__ + __rxor__ + + +*note nb_inplace_xor: 4799. *note binaryfunc: 445d.__ixor__ + + +*note nb_or: 479a. *note binaryfunc: 445d.__or__ __ror__ + + +*note nb_inplace_or: 479b. *note binaryfunc: 445d.__ior__ + + +*note nb_int: 479c. *note unaryfunc: 4474.__int__ + + +*note nb_reserved: 479d. void * + + +*note nb_float: 479e. *note unaryfunc: 4474.__float__ + + +*note nb_floor_divide: 479f. *note binaryfunc: 445d.__floordiv__ + + +*note nb_inplace_floor_divide: 47a0.*note binaryfunc: 445d.__ifloordiv__ + + +*note nb_true_divide: 47a1. *note binaryfunc: 445d.__truediv__ + + +*note nb_inplace_true_divide: 47a2.*note binaryfunc: 445d.__itruediv__ + + +*note nb_index: 47a3. *note unaryfunc: 4474.__index__ + + +*note nb_matrix_multiply: 47a4.*note binaryfunc: 445d.__matmul__ + __rmatmul__ + + +*note nb_inplace_matrix_multiply: 47a5.*note binaryfunc: 445d.__imatmul__ + + + +*note mp_length: 47a6. *note lenfunc: 4468. __len__ + + +*note mp_subscript: 1334. *note binaryfunc: 445d.__getitem__ + + +*note mp_ass_subscript: 47a7. *note objobjargproc: 446a.__setitem__, + __delitem__ + + + +*note sq_length: 4553. *note lenfunc: 4468. __len__ + + +*note sq_concat: 47a8. *note binaryfunc: 445d.__add__ + + +*note sq_repeat: 47a9. *note ssizeargfunc: 4470.__mul__ + + +*note sq_item: 1333. *note ssizeargfunc: 4470.__getitem__ + + +*note sq_ass_item: 47aa. *note ssizeobjargproc: 4471.__setitem__ + __delitem__ + + +*note sq_contains: 47ab. *note objobjproc: 446b.__contains__ + + +*note sq_inplace_concat: 47ac. *note binaryfunc: 445d.__iadd__ + + +*note sq_inplace_repeat: 47ad. *note ssizeargfunc: 4470.__imul__ + + + +*note bf_getbuffer: 333. *note getbufferproc(): 47ae. + + +*note bf_releasebuffer: 334. *note releasebufferproc(): 47af. + + + +File: python.info, Node: slot typedefs, Prev: sub-slots, Up: Quick Reference + +7.12.3.4 slot typedefs +...................... + +typedef Parameter Types Return Type + +----------------------------------------------------------------------------------------------- + +*note allocfunc: 445c. *note PyTypeObject: 701. * *note PyObject: 4cf. * + *note Py_ssize_t: 6b1. + + +*note destructor: 4460. void * void + + +*note freefunc: 462f. void * void + + +*note traverseproc: 4473. void * int + *note visitproc: 4475. + void * + + +*note newfunc: 4469. *note PyObject: 4cf. * *note PyObject: 4cf. * + *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note initproc: 4465. *note PyObject: 4cf. * int + *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note reprfunc: 446c. *note PyObject: 4cf. * *note PyObject: 4cf. * + + +*note getattrfunc: 4461. *note PyObject: 4cf. * *note PyObject: 4cf. * + const char * + + +*note setattrfunc: 446e. *note PyObject: 4cf. * int + const char * + *note PyObject: 4cf. * + + +*note getattrofunc: 4462. *note PyObject: 4cf. * *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note setattrofunc: 446f. *note PyObject: 4cf. * int + *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note descrgetfunc: 445e. *note PyObject: 4cf. * *note PyObject: 4cf. * + *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note descrsetfunc: 445f. *note PyObject: 4cf. * int + *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note hashfunc: 4464. *note PyObject: 4cf. * Py_hash_t + + +*note richcmpfunc: 446d. *note PyObject: 4cf. * *note PyObject: 4cf. * + *note PyObject: 4cf. * + int + + +*note getiterfunc: 4463. *note PyObject: 4cf. * *note PyObject: 4cf. * + + +*note iternextfunc: 4467. *note PyObject: 4cf. * *note PyObject: 4cf. * + + +*note lenfunc: 4468. *note PyObject: 4cf. * *note Py_ssize_t: 6b1. + + +*note getbufferproc: 47ae. *note PyObject: 4cf. * int + *note Py_buffer: 327. * + int + + +*note releasebufferproc: 47af. *note PyObject: 4cf. * void + *note Py_buffer: 327. * + + +*note inquiry: 4466. void * int + + +*note unaryfunc: 4474. *note PyObject: 4cf. * *note PyObject: 4cf. * + + +*note binaryfunc: 445d. *note PyObject: 4cf. * *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note ternaryfunc: 4472. *note PyObject: 4cf. * *note PyObject: 4cf. * + *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +*note ssizeargfunc: 4470. *note PyObject: 4cf. * *note PyObject: 4cf. * + *note Py_ssize_t: 6b1. + + +*note ssizeobjargproc: 4471. *note PyObject: 4cf. * int + *note Py_ssize_t: 6b1. + + +*note objobjproc: 446b. *note PyObject: 4cf. * int + *note PyObject: 4cf. * + + +*note objobjargproc: 446a. *note PyObject: 4cf. * int + *note PyObject: 4cf. * + *note PyObject: 4cf. * + + +See *note Slot Type typedefs: 47b1. below for more detail. + + +File: python.info, Node: PyTypeObject Definition, Next: PyObject Slots, Prev: Quick Reference, Up: Type Objects<3> + +7.12.3.5 PyTypeObject Definition +................................ + +The structure definition for *note PyTypeObject: 701. can be found in +‘Include/object.h’. For convenience of reference, this repeats the +definition found there: + + typedef struct _typeobject { + PyObject_VAR_HEAD + const char *tp_name; /* For printing, in format "." */ + 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 */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + // Strong reference on a heap type, borrowed reference on a static type + struct _typeobject *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; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + destructor tp_del; + + /* Type attribute cache version tag. Added in version 2.6 */ + unsigned int tp_version_tag; + + destructor tp_finalize; + vectorcallfunc tp_vectorcall; + } PyTypeObject; + + +File: python.info, Node: PyObject Slots, Next: PyVarObject Slots, Prev: PyTypeObject Definition, Up: Type Objects<3> + +7.12.3.6 PyObject Slots +....................... + +The type object structure extends the *note PyVarObject: 39c6. +structure. The ‘ob_size’ field is used for dynamic types (created by +‘type_new()’, usually called from a class statement). Note that *note +PyType_Type: 440a. (the metatype) initializes *note tp_itemsize: 425d, +which means that its instances (i.e. type objects) `must' have the +‘ob_size’ field. + + -- C Member: *note Py_ssize_t: 6b1. *note PyObject: 4cf.ob_refcnt + ` Part of the *note Stable ABI: 4b8.' This is the type object’s + reference count, initialized to ‘1’ by the ‘PyObject_HEAD_INIT’ + macro. Note that for *note statically allocated type objects: 354, + the type’s instances (objects whose ‘ob_type’ points back to the + type) do `not' count as references. But for *note dynamically + allocated type objects: 5b7, the instances `do' count as + references. + + `Inheritance:' + + This field is not inherited by subtypes. + + -- C Member: *note PyTypeObject: 701. **note PyObject: 4cf.ob_type + ` Part of the *note Stable ABI: 4b8.' This is the type’s type, in + other words its metatype. It is initialized by the argument to the + ‘PyObject_HEAD_INIT’ macro, and its value should normally be + ‘&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 ‘NULL’ to the ‘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: + + Foo_Type.ob_type = &PyType_Type; + + This should be done before any instances of the type are created. + *note PyType_Ready(): 350. checks if ‘ob_type’ is ‘NULL’, and if + so, initializes it to the ‘ob_type’ field of the base class. *note + PyType_Ready(): 350. will not change this field if it is non-zero. + + `Inheritance:' + + This field is inherited by subtypes. + + -- C Member: *note PyObject: 4cf. **note PyObject: 4cf._ob_next + -- C Member: *note PyObject: 4cf. **note PyObject: 4cf._ob_prev + + These fields are only present when the macro ‘Py_TRACE_REFS’ is + defined (see the *note configure –with-trace-refs option: 4d0.). + + Their initialization to ‘NULL’ is taken care of by the + ‘PyObject_HEAD_INIT’ macro. For *note statically allocated + objects: 354, these fields always remain ‘NULL’. For *note + dynamically allocated objects: 5b7, these two fields are used to + link the object into a doubly linked list of `all' live objects on + the heap. + + This could be used for various debugging purposes; currently the + only uses are the ‘sys.getobjects()’ function and to print the + objects that are still alive at the end of a run when the + environment variable *note PYTHONDUMPREFS: 5f6. is set. + + `Inheritance:' + + These fields are not inherited by subtypes. + + +File: python.info, Node: PyVarObject Slots, Next: PyTypeObject Slots, Prev: PyObject Slots, Up: Type Objects<3> + +7.12.3.7 PyVarObject Slots +.......................... + + -- C Member: *note Py_ssize_t: 6b1. *note PyVarObject: 39c6.ob_size + ` Part of the *note Stable ABI: 4b8.' For *note statically + allocated type objects: 354, this should be initialized to zero. + For *note dynamically allocated type objects: 5b7, this field has a + special internal meaning. + + `Inheritance:' + + This field is not inherited by subtypes. + + +File: python.info, Node: PyTypeObject Slots, Next: Static Types, Prev: PyVarObject Slots, Up: Type Objects<3> + +7.12.3.8 PyTypeObject Slots +........................... + +Each slot has a section describing inheritance. If *note +PyType_Ready(): 350. may set a value when the field is set to ‘NULL’ +then there will also be a “Default” section. (Note that many fields set +on ‘PyBaseObject_Type’ and *note PyType_Type: 440a. effectively act as +defaults.) + + -- C Member: const char **note PyTypeObject: 701.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 ‘T’ defined in + module ‘M’ in subpackage ‘Q’ in package ‘P’ should have the *note + tp_name: 12f9. initializer ‘"P.Q.M.T"’. + + For *note dynamically allocated type objects: 5b7, this should just + be the type name, and the module name explicitly stored in the type + dict as the value for key ‘'__module__'’. + + For *note statically allocated type objects: 354, the `tp_name' + field should contain a dot. Everything before the last dot is made + accessible as the ‘__module__’ attribute, and everything after the + last dot is made accessible as the *note __name__: f79. attribute. + + If no dot is present, the entire *note tp_name: 12f9. field is made + accessible as the *note __name__: f79. attribute, and the + ‘__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 ‘NULL’. It is the only required field in + *note PyTypeObject(): 701. (other than potentially *note + tp_itemsize: 425d.). + + `Inheritance:' + + This field is not inherited by subtypes. + + -- C Member: *note Py_ssize_t: 6b1. *note PyTypeObject: + 701.tp_basicsize + -- C Member: *note Py_ssize_t: 6b1. *note PyTypeObject: 701.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 *note tp_itemsize: 425d. field, types with + variable-length instances have a non-zero *note tp_itemsize: 425d. + field. For a type with fixed-length instances, all instances have + the same size, given in *note tp_basicsize: 5dd. + + For a type with variable-length instances, the instances must have + an ‘ob_size’ field, and the instance size is *note tp_basicsize: + 5dd. plus N times *note tp_itemsize: 425d, where N is the “length” + of the object. The value of N is typically stored in the + instance’s ‘ob_size’ field. There are exceptions: for example, + ints use a negative ‘ob_size’ to indicate a negative number, and N + is ‘abs(ob_size)’ there. Also, the presence of an ‘ob_size’ field + in the instance layout doesn’t mean that the instance structure is + variable-length (for example, the structure for the list type has + fixed-length instances, yet those instances have a meaningful + ‘ob_size’ field). + + The basic size includes the fields in the instance declared by the + macro *note PyObject_HEAD: f83. or *note PyObject_VAR_HEAD: 4763. + (whichever is used to declare the instance struct) and this in turn + includes the ‘_ob_prev’ and ‘_ob_next’ fields if they are present. + This means that the only correct way to get an initializer for the + *note tp_basicsize: 5dd. is to use the ‘sizeof’ operator on the + struct used to declare the instance layout. The basic size does + not include the GC header size. + + A note about alignment: if the variable items require a particular + alignment, this should be taken care of by the value of *note + tp_basicsize: 5dd. Example: suppose a type implements an array of + ‘double’. *note tp_itemsize: 425d. is ‘sizeof(double)’. It is the + programmer’s responsibility that *note tp_basicsize: 5dd. is a + multiple of ‘sizeof(double)’ (assuming this is the alignment + requirement for ‘double’). + + For any type with variable-length instances, this field must not be + ‘NULL’. + + `Inheritance:' + + These fields are inherited separately by subtypes. If the base + type has a non-zero *note tp_itemsize: 425d, it is generally not + safe to set *note tp_itemsize: 425d. to a different non-zero value + in a subtype (though this depends on the implementation of the base + type). + + -- C Member: *note destructor: 4460. *note PyTypeObject: 701.tp_dealloc + + A pointer to the instance destructor function. This function must + be defined unless the type guarantees that its instances will never + be deallocated (as is the case for the singletons ‘None’ and + ‘Ellipsis’). The function signature is: + + void tp_dealloc(PyObject *self); + + The destructor function is called by the *note Py_DECREF(): 4cd. + and *note Py_XDECREF(): 363. macros when the new reference count is + zero. At this point, the instance is still in existence, but there + are no references to it. The destructor function should free all + references which the instance owns, free all memory buffers owned + by the instance (using the freeing function corresponding to the + allocation function used to allocate the buffer), and call the + type’s *note tp_free: 4264. function. If the type is not + subtypable (doesn’t have the *note Py_TPFLAGS_BASETYPE: 426a. flag + bit set), it is permissible to call the object deallocator directly + instead of via *note tp_free: 4264. The object deallocator should + be the one used to allocate the instance; this is normally *note + PyObject_Del(): 1114. if the instance was allocated using *note + PyObject_New(): 5db. or ‘PyObject_VarNew()’, or *note + PyObject_GC_Del(): 113e. if the instance was allocated using *note + PyObject_GC_New(): 6fe. or *note PyObject_GC_NewVar(): 6ff. + + If the type supports garbage collection (has the *note + Py_TPFLAGS_HAVE_GC: 351. flag bit set), the destructor should call + *note PyObject_GC_UnTrack(): 1140. before clearing any member + fields. + + static void foo_dealloc(foo_object *self) { + PyObject_GC_UnTrack(self); + Py_CLEAR(self->ref); + Py_TYPE(self)->tp_free((PyObject *)self); + } + + Finally, if the type is heap allocated (*note Py_TPFLAGS_HEAPTYPE: + 454b.), the deallocator should decrement the reference count for + its type object after calling the type deallocator. In order to + avoid dangling pointers, the recommended way to achieve this is: + + static void foo_dealloc(foo_object *self) { + PyTypeObject *tp = Py_TYPE(self); + // free references and buffers here + tp->tp_free(self); + Py_DECREF(tp); + } + + `Inheritance:' + + This field is inherited by subtypes. + + -- C Member: *note Py_ssize_t: 6b1. *note PyTypeObject: + 701.tp_vectorcall_offset + + An optional offset to a per-instance function that implements + calling the object using the *note vectorcall protocol: 606, a more + efficient alternative of the simpler *note tp_call: 428b. + + This field is only used if the flag *note + Py_TPFLAGS_HAVE_VECTORCALL: 44ed. is set. If so, this must be a + positive integer containing the offset in the instance of a *note + vectorcallfunc: 44ef. pointer. + + The `vectorcallfunc' pointer may be ‘NULL’, in which case the + instance behaves as if *note Py_TPFLAGS_HAVE_VECTORCALL: 44ed. was + not set: calling the instance falls back to *note tp_call: 428b. + + Any class that sets ‘Py_TPFLAGS_HAVE_VECTORCALL’ must also set + *note tp_call: 428b. and make sure its behaviour is consistent with + the `vectorcallfunc' function. This can be done by setting + `tp_call' to *note PyVectorcall_Call(): 44ec. + + Warning: It is not recommended for *note mutable heap types: + 5b7. to implement the vectorcall protocol. When a user sets + ‘__call__’ in Python code, only `tp_call' is updated, likely + making it inconsistent with the vectorcall function. + + Changed in version 3.8: Before version 3.8, this slot was named + ‘tp_print’. In Python 2.x, it was used for printing to a file. In + Python 3.0 to 3.7, it was unused. + + `Inheritance:' + + This field is always inherited. However, the *note + Py_TPFLAGS_HAVE_VECTORCALL: 44ed. flag is not always inherited. If + it’s not, then the subclass won’t use *note vectorcall: 606, except + when *note PyVectorcall_Call(): 44ec. is explicitly called. This + is in particular the case for types without the *note + Py_TPFLAGS_IMMUTABLETYPE: 353. flag set (including subclasses + defined in Python). + + -- C Member: *note getattrfunc: 4461. *note PyTypeObject: + 701.tp_getattr + + 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 *note tp_getattro: 427e. + function, but taking a C string instead of a Python string object + to give the attribute name. + + `Inheritance:' + + Group: ‘tp_getattr’, ‘tp_getattro’ + + This field is inherited by subtypes together with *note + tp_getattro: 427e.: a subtype inherits both *note tp_getattr: 4281. + and *note tp_getattro: 427e. from its base type when the subtype’s + *note tp_getattr: 4281. and *note tp_getattro: 427e. are both + ‘NULL’. + + -- C Member: *note setattrfunc: 446e. *note PyTypeObject: + 701.tp_setattr + + 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 *note tp_setattro: 427f. + function, but taking a C string instead of a Python string object + to give the attribute name. + + `Inheritance:' + + Group: ‘tp_setattr’, ‘tp_setattro’ + + This field is inherited by subtypes together with *note + tp_setattro: 427f.: a subtype inherits both *note tp_setattr: 4282. + and *note tp_setattro: 427f. from its base type when the subtype’s + *note tp_setattr: 4282. and *note tp_setattro: 427f. are both + ‘NULL’. + + -- C Member: *note PyAsyncMethods: 4552. **note PyTypeObject: + 701.tp_as_async + + Pointer to an additional structure that contains fields relevant + only to objects which implement *note awaitable: 8e7. and *note + asynchronous iterator: 9f5. protocols at the C-level. See *note + Async Object Structures: 47b8. for details. + + New in version 3.5: Formerly known as ‘tp_compare’ and + ‘tp_reserved’. + + `Inheritance:' + + The *note tp_as_async: 4774. field is not inherited, but the + contained fields are inherited individually. + + -- C Member: *note reprfunc: 446c. *note PyTypeObject: 701.tp_repr + + An optional pointer to a function that implements the built-in + function *note repr(): 3ee. + + The signature is the same as for *note PyObject_Repr(): cdb.: + + PyObject *tp_repr(PyObject *self); + + The function must return a string or a Unicode object. Ideally, + this function should return a string that, when passed to *note + eval(): 4a7, given a suitable environment, returns an object with + the same value. If this is not feasible, it should return a string + starting with ‘'<'’ and ending with ‘'>'’ 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 ‘<%s object at + %p>’ is returned, where ‘%s’ is replaced by the type name, and ‘%p’ + by the object’s memory address. + + -- C Member: *note PyNumberMethods: 1081. **note PyTypeObject: + 701.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 *note Number Object Structures: 47b9. + + `Inheritance:' + + The *note tp_as_number: 5e1. field is not inherited, but the + contained fields are inherited individually. + + -- C Member: *note PySequenceMethods: 4288. **note PyTypeObject: + 701.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 *note Sequence Object Structures: 47ba. + + `Inheritance:' + + The *note tp_as_sequence: 4776. field is not inherited, but the + contained fields are inherited individually. + + -- C Member: *note PyMappingMethods: 4289. **note PyTypeObject: + 701.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 *note Mapping Object Structures: 47bb. + + `Inheritance:' + + The *note tp_as_mapping: 4777. field is not inherited, but the + contained fields are inherited individually. + + -- C Member: *note hashfunc: 4464. *note PyTypeObject: 701.tp_hash + + An optional pointer to a function that implements the built-in + function *note hash(): 1bc. + + The signature is the same as for *note PyObject_Hash(): 373.: + + Py_hash_t tp_hash(PyObject *); + + The value ‘-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 ‘-1’. + + When this field is not set (`and' ‘tp_richcompare’ is not set), an + attempt to take the hash of the object raises *note TypeError: 19c. + This is the same as setting it to *note + PyObject_HashNotImplemented(): 1034. + + This field can be set explicitly to *note + PyObject_HashNotImplemented(): 1034. to block inheritance of the + hash method from a parent type. This is interpreted as the + equivalent of ‘__hash__ = None’ at the Python level, causing + ‘isinstance(o, collections.Hashable)’ to correctly return ‘False’. + Note that the converse is also true - setting ‘__hash__ = None’ on + a class at the Python level will result in the ‘tp_hash’ slot being + set to *note PyObject_HashNotImplemented(): 1034. + + `Inheritance:' + + Group: ‘tp_hash’, ‘tp_richcompare’ + + This field is inherited by subtypes together with *note + tp_richcompare: 4284.: a subtype inherits both of *note + tp_richcompare: 4284. and *note tp_hash: 428a, when the subtype’s + *note tp_richcompare: 4284. and *note tp_hash: 428a. are both + ‘NULL’. + + -- C Member: *note ternaryfunc: 4472. *note PyTypeObject: 701.tp_call + + An optional pointer to a function that implements calling the + object. This should be ‘NULL’ if the object is not callable. The + signature is the same as for *note PyObject_Call(): 5b9.: + + PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs); + + `Inheritance:' + + This field is inherited by subtypes. + + -- C Member: *note reprfunc: 446c. *note PyTypeObject: 701.tp_str + + An optional pointer to a function that implements the built-in + operation *note str(): 1b3. (Note that *note str: 1b3. is a type + now, and *note str(): 1b3. calls the constructor for that type. + This constructor calls *note PyObject_Str(): cdc. to do the actual + work, and *note PyObject_Str(): cdc. will call this handler.) + + The signature is the same as for *note PyObject_Str(): cdc.: + + PyObject *tp_str(PyObject *self); + + 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 *note + print(): c13. function. + + `Inheritance:' + + This field is inherited by subtypes. + + `Default:' + + When this field is not set, *note PyObject_Repr(): cdb. is called + to return a string representation. + + -- C Member: *note getattrofunc: 4462. *note PyTypeObject: + 701.tp_getattro + + An optional pointer to the get-attribute function. + + The signature is the same as for *note PyObject_GetAttr(): 43bf.: + + PyObject *tp_getattro(PyObject *self, PyObject *attr); + + It is usually convenient to set this field to *note + PyObject_GenericGetAttr(): 43bb, which implements the normal way of + looking for object attributes. + + `Inheritance:' + + Group: ‘tp_getattr’, ‘tp_getattro’ + + This field is inherited by subtypes together with *note tp_getattr: + 4281.: a subtype inherits both *note tp_getattr: 4281. and *note + tp_getattro: 427e. from its base type when the subtype’s *note + tp_getattr: 4281. and *note tp_getattro: 427e. are both ‘NULL’. + + `Default:' + + ‘PyBaseObject_Type’ uses *note PyObject_GenericGetAttr(): 43bb. + + -- C Member: *note setattrofunc: 446f. *note PyTypeObject: + 701.tp_setattro + + An optional pointer to the function for setting and deleting + attributes. + + The signature is the same as for *note PyObject_SetAttr(): 43c6.: + + int tp_setattro(PyObject *self, PyObject *attr, PyObject *value); + + In addition, setting `value' to ‘NULL’ to delete an attribute must + be supported. It is usually convenient to set this field to *note + PyObject_GenericSetAttr(): 43bc, which implements the normal way of + setting object attributes. + + `Inheritance:' + + Group: ‘tp_setattr’, ‘tp_setattro’ + + This field is inherited by subtypes together with *note tp_setattr: + 4282.: a subtype inherits both *note tp_setattr: 4282. and *note + tp_setattro: 427f. from its base type when the subtype’s *note + tp_setattr: 4282. and *note tp_setattro: 427f. are both ‘NULL’. + + `Default:' + + ‘PyBaseObject_Type’ uses *note PyObject_GenericSetAttr(): 43bc. + + -- C Member: *note PyBufferProcs: 455c. **note PyTypeObject: + 701.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 *note Buffer Object Structures: 4512. + + `Inheritance:' + + The *note tp_as_buffer: 5df. field is not inherited, but the + contained fields are inherited individually. + + -- C Member: unsigned long *note PyTypeObject: 701.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 *note tp_as_number: 5e1, *note + tp_as_sequence: 4776, *note tp_as_mapping: 4777, and *note + tp_as_buffer: 5df.) 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 ‘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 *note Py_TPFLAGS_HAVE_GC: 351. flag bit is + inherited together with the *note tp_traverse: 352. and *note + tp_clear: 4278. fields, i.e. if the *note Py_TPFLAGS_HAVE_GC: 351. + flag bit is clear in the subtype and the *note tp_traverse: 352. + and *note tp_clear: 4278. fields in the subtype exist and have + ‘NULL’ values. + + `Default:' + + ‘PyBaseObject_Type’ uses ‘Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE’. + + `Bit Masks:' + + The following bit masks are currently defined; these can be ORed + together using the ‘|’ operator to form the value of the *note + tp_flags: 12c3. field. The macro *note PyType_HasFeature(): 1366. + takes a type and a flags value, `tp' and `f', and checks whether + ‘tp->tp_flags & f’ is non-zero. + + -- Data: Py_TPFLAGS_HEAPTYPE + + This bit is set when the type object itself is allocated on + the heap, for example, types created dynamically using *note + PyType_FromSpec(): 5b8. In this case, the ‘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). + + `Inheritance:' + + ??? + + -- Data: Py_TPFLAGS_BASETYPE + + 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:' + + ??? + + -- Data: Py_TPFLAGS_READY + + This bit is set when the type object has been fully + initialized by *note PyType_Ready(): 350. + + `Inheritance:' + + ??? + + -- Data: Py_TPFLAGS_READYING + + This bit is set while *note PyType_Ready(): 350. is in the + process of initializing the type object. + + `Inheritance:' + + ??? + + -- Data: Py_TPFLAGS_HAVE_GC + + This bit is set when the object supports garbage collection. + If this bit is set, instances must be created using *note + PyObject_GC_New(): 6fe. and destroyed using *note + PyObject_GC_Del(): 113e. More information in section *note + Supporting Cyclic Garbage Collection: 47be. This bit also + implies that the GC-related fields *note tp_traverse: 352. and + *note tp_clear: 4278. are present in the type object. + + `Inheritance:' + + Group: *note Py_TPFLAGS_HAVE_GC: 351, ‘tp_traverse’, + ‘tp_clear’ + + The *note Py_TPFLAGS_HAVE_GC: 351. flag bit is inherited + together with the ‘tp_traverse’ and ‘tp_clear’ fields, i.e. + if the *note Py_TPFLAGS_HAVE_GC: 351. flag bit is clear in the + subtype and the ‘tp_traverse’ and ‘tp_clear’ fields in the + subtype exist and have ‘NULL’ values. + + -- Data: Py_TPFLAGS_DEFAULT + + 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: ‘Py_TPFLAGS_HAVE_STACKLESS_EXTENSION’. + + `Inheritance:' + + ??? + + -- Data: Py_TPFLAGS_METHOD_DESCRIPTOR + + This bit indicates that objects behave like unbound methods. + + If this flag is set for ‘type(meth)’, then: + + - ‘meth.__get__(obj, cls)(*args, **kwds)’ (with ‘obj’ not + None) must be equivalent to ‘meth(obj, *args, **kwds)’. + + - ‘meth.__get__(None, cls)(*args, **kwds)’ must be + equivalent to ‘meth(*args, **kwds)’. + + This flag enables an optimization for typical method calls + like ‘obj.meth()’: it avoids creating a temporary “bound + method” object for ‘obj.meth’. + + New in version 3.8. + + `Inheritance:' + + This flag is never inherited by types without the *note + Py_TPFLAGS_IMMUTABLETYPE: 353. flag set. For extension types, + it is inherited whenever *note tp_descr_get: 4778. is + inherited. + + -- Data: Py_TPFLAGS_LONG_SUBCLASS + + -- Data: Py_TPFLAGS_LIST_SUBCLASS + + -- Data: Py_TPFLAGS_TUPLE_SUBCLASS + + -- Data: Py_TPFLAGS_BYTES_SUBCLASS + + -- Data: Py_TPFLAGS_UNICODE_SUBCLASS + + -- Data: Py_TPFLAGS_DICT_SUBCLASS + + -- Data: Py_TPFLAGS_BASE_EXC_SUBCLASS + + -- Data: Py_TPFLAGS_TYPE_SUBCLASS + + These flags are used by functions such as *note + PyLong_Check(): 4566. to quickly determine if a type is a + subclass of a built-in type; such specific checks are faster + than a generic check, like *note PyObject_IsInstance(): b33. + Custom types that inherit from built-ins should have their + *note tp_flags: 12c3. set appropriately, or the code that + interacts with such types will behave differently depending on + what kind of check is used. + + -- Data: Py_TPFLAGS_HAVE_FINALIZE + + This bit is set when the *note tp_finalize: 702. slot is + present in the type structure. + + New in version 3.4. + + Deprecated since version 3.8: This flag isn’t necessary + anymore, as the interpreter assumes the *note tp_finalize: + 702. slot is always present in the type structure. + + -- Data: Py_TPFLAGS_HAVE_VECTORCALL + + This bit is set when the class implements the *note vectorcall + protocol: 606. See *note tp_vectorcall_offset: 44ee. for + details. + + `Inheritance:' + + This bit is inherited for types with the *note + Py_TPFLAGS_IMMUTABLETYPE: 353. flag set, if *note tp_call: + 428b. is also inherited. + + New in version 3.9. + + -- Data: Py_TPFLAGS_IMMUTABLETYPE + + This bit is set for type objects that are immutable: type + attributes cannot be set nor deleted. + + *note PyType_Ready(): 350. automatically applies this flag to + *note static types: 354. + + `Inheritance:' + + This flag is not inherited. + + New in version 3.10. + + -- Data: Py_TPFLAGS_DISALLOW_INSTANTIATION + + Disallow creating instances of the type: set *note tp_new: + 4260. to NULL and don’t create the ‘__new__’ key in the type + dictionary. + + The flag must be set before creating the type, not after. For + example, it must be set before *note PyType_Ready(): 350. is + called on the type. + + The flag is set automatically on *note static types: 354. if + *note tp_base: 4270. is NULL or ‘&PyBaseObject_Type’ and *note + tp_new: 4260. is NULL. + + `Inheritance:' + + This flag is not inherited. + + New in version 3.10. + + -- Data: Py_TPFLAGS_MAPPING + + This bit indicates that instances of the class may match + mapping patterns when used as the subject of a *note match: + 400. block. It is automatically set when registering or + subclassing *note collections.abc.Mapping: 505, and unset when + registering *note collections.abc.Sequence: 12a3. + + Note: *note Py_TPFLAGS_MAPPING: 12a1. and *note + Py_TPFLAGS_SEQUENCE: 12a2. are mutually exclusive; it is + an error to enable both flags simultaneously. + + `Inheritance:' + + This flag is inherited by types that do not already set *note + Py_TPFLAGS_SEQUENCE: 12a2. + + See also + ........ + + PEP 634(1) – Structural Pattern Matching: Specification + + New in version 3.10. + + -- Data: Py_TPFLAGS_SEQUENCE + + This bit indicates that instances of the class may match + sequence patterns when used as the subject of a *note match: + 400. block. It is automatically set when registering or + subclassing *note collections.abc.Sequence: 12a3, and unset + when registering *note collections.abc.Mapping: 505. + + Note: *note Py_TPFLAGS_MAPPING: 12a1. and *note + Py_TPFLAGS_SEQUENCE: 12a2. are mutually exclusive; it is + an error to enable both flags simultaneously. + + `Inheritance:' + + This flag is inherited by types that do not already set *note + Py_TPFLAGS_MAPPING: 12a1. + + See also + ........ + + PEP 634(2) – Structural Pattern Matching: Specification + + New in version 3.10. + + -- C Member: const char **note PyTypeObject: 701.tp_doc + + An optional pointer to a NUL-terminated C string giving the + docstring for this type object. This is exposed as the ‘__doc__’ + attribute on the type and instances of the type. + + `Inheritance:' + + This field is `not' inherited by subtypes. + + -- C Member: *note traverseproc: 4473. *note PyTypeObject: + 701.tp_traverse + + An optional pointer to a traversal function for the garbage + collector. This is only used if the *note Py_TPFLAGS_HAVE_GC: 351. + flag bit is set. The signature is: + + int tp_traverse(PyObject *self, visitproc visit, void *arg); + + More information about Python’s garbage collection scheme can be + found in section *note Supporting Cyclic Garbage Collection: 47be. + + The *note tp_traverse: 352. pointer is used by the garbage + collector to detect reference cycles. A typical implementation of + a *note tp_traverse: 352. function simply calls *note Py_VISIT(): + 426e. on each of the instance’s members that are Python objects + that the instance owns. For example, this is function + ‘local_traverse()’ from the *note _thread: 2. extension module: + + static int + local_traverse(localobject *self, visitproc visit, void *arg) + { + Py_VISIT(self->args); + Py_VISIT(self->kw); + Py_VISIT(self->dict); + return 0; + } + + Note that *note Py_VISIT(): 426e. is called only on those members + that can participate in reference cycles. Although there is also a + ‘self->key’ member, it can only be ‘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 *note gc: 80. module’s *note get_referents(): 3f6. function + will include it. + + Warning: When implementing *note tp_traverse: 352, only the + members that the instance `owns' (by having *note strong + references: 362. to them) must be visited. For instance, if + an object supports weak references via the *note tp_weaklist: + 4558. 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). + + Note that *note Py_VISIT(): 426e. requires the `visit' and `arg' + parameters to ‘local_traverse()’ to have these specific names; + don’t name them just anything. + + Instances of *note heap-allocated types: 5b7. hold a reference to + their type. Their traversal function must therefore either visit + *note Py_TYPE(self): 355, or delegate this responsibility by + calling ‘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. + + Changed in version 3.9: Heap-allocated types are expected to visit + ‘Py_TYPE(self)’ in ‘tp_traverse’. In earlier versions of Python, + due to bug 40217(3), doing this may lead to crashes in subclasses. + + `Inheritance:' + + Group: *note Py_TPFLAGS_HAVE_GC: 351, ‘tp_traverse’, ‘tp_clear’ + + This field is inherited by subtypes together with *note tp_clear: + 4278. and the *note Py_TPFLAGS_HAVE_GC: 351. flag bit: the flag + bit, *note tp_traverse: 352, and *note tp_clear: 4278. are all + inherited from the base type if they are all zero in the subtype. + + -- C Member: *note inquiry: 4466. *note PyTypeObject: 701.tp_clear + + An optional pointer to a clear function for the garbage collector. + This is only used if the *note Py_TPFLAGS_HAVE_GC: 351. flag bit is + set. The signature is: + + int tp_clear(PyObject *); + + The *note tp_clear: 4278. member function is used to break + reference cycles in cyclic garbage detected by the garbage + collector. Taken together, all *note tp_clear: 4278. functions in + the system must combine to break all reference cycles. This is + subtle, and if in any doubt supply a *note tp_clear: 4278. + function. For example, the tuple type does not implement a *note + tp_clear: 4278. function, because it’s possible to prove that no + reference cycle can be composed entirely of tuples. Therefore the + *note tp_clear: 4278. functions of other types must be sufficient + to break any cycle containing a tuple. This isn’t immediately + obvious, and there’s rarely a good reason to avoid implementing + *note tp_clear: 4278. + + Implementations of *note tp_clear: 4278. should drop the instance’s + references to those of its members that may be Python objects, and + set its pointers to those members to ‘NULL’, as in the following + example: + + static int + local_clear(localobject *self) + { + Py_CLEAR(self->key); + Py_CLEAR(self->args); + Py_CLEAR(self->kw); + Py_CLEAR(self->dict); + return 0; + } + + The *note Py_CLEAR(): 10d7. macro should be used, because clearing + references is delicate: the reference to the contained object must + not be decremented until after the pointer to the contained object + is set to ‘NULL’. This is because decrementing the reference count + 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 ‘NULL’ at that time, so that `self' knows the contained + object can no longer be used. The *note Py_CLEAR(): 10d7. macro + performs the operations in a safe order. + + Note that *note tp_clear: 4278. is not `always' called before an + instance 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 *note tp_dealloc: 4263. is + called directly. + + Because the goal of *note tp_clear: 4278. functions is to break + reference cycles, it’s not necessary to clear contained objects + like Python strings or Python integers, which can’t participate in + reference cycles. On the other hand, it may be convenient to clear + all contained Python objects, and write the type’s *note + tp_dealloc: 4263. function to invoke *note tp_clear: 4278. + + More information about Python’s garbage collection scheme can be + found in section *note Supporting Cyclic Garbage Collection: 47be. + + `Inheritance:' + + Group: *note Py_TPFLAGS_HAVE_GC: 351, ‘tp_traverse’, ‘tp_clear’ + + This field is inherited by subtypes together with *note + tp_traverse: 352. and the *note Py_TPFLAGS_HAVE_GC: 351. flag bit: + the flag bit, *note tp_traverse: 352, and *note tp_clear: 4278. are + all inherited from the base type if they are all zero in the + subtype. + + -- C Member: *note richcmpfunc: 446d. *note PyTypeObject: + 701.tp_richcompare + + An optional pointer to the rich comparison function, whose + signature is: + + PyObject *tp_richcompare(PyObject *self, PyObject *other, int op); + + The first parameter is guaranteed to be an instance of the type + that is defined by *note PyTypeObject: 701. + + The function should return the result of the comparison (usually + ‘Py_True’ or ‘Py_False’). If the comparison is undefined, it must + return ‘Py_NotImplemented’, if another error occurred it must + return ‘NULL’ and set an exception condition. + + The following constants are defined to be used as the third + argument for *note tp_richcompare: 4284. and for *note + PyObject_RichCompare(): 4285.: + + Constant Comparison + + -------------------------------------- + + ‘Py_LT’ ‘<’ + + + ‘Py_LE’ ‘<=’ + + + ‘Py_EQ’ ‘==’ + + + ‘Py_NE’ ‘!=’ + + + ‘Py_GT’ ‘>’ + + + ‘Py_GE’ ‘>=’ + + + The following macro is defined to ease writing rich comparison + functions: + + -- C Macro: Py_RETURN_RICHCOMPARE (VAL_A, VAL_B, op) + + Return ‘Py_True’ or ‘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 *note PyObject_RichCompare(): 4285. + + The return value’s reference count is properly incremented. + + On error, sets an exception and returns ‘NULL’ from the + function. + + New in version 3.7. + + `Inheritance:' + + Group: ‘tp_hash’, ‘tp_richcompare’ + + This field is inherited by subtypes together with *note tp_hash: + 428a.: a subtype inherits *note tp_richcompare: 4284. and *note + tp_hash: 428a. when the subtype’s *note tp_richcompare: 4284. and + *note tp_hash: 428a. are both ‘NULL’. + + `Default:' + + ‘PyBaseObject_Type’ provides a ‘tp_richcompare’ implementation, + which may be inherited. However, if only ‘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. + + -- C Member: *note Py_ssize_t: 6b1. *note PyTypeObject: + 701.tp_weaklistoffset + + 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 ‘PyObject_ClearWeakRefs()’ and + the PyWeakref_* functions. The instance structure needs to include + a field of type *note PyObject: 4cf.* which is initialized to + ‘NULL’. + + Do not confuse this field with *note tp_weaklist: 4558.; that is + the list head for weak references to the type object itself. + + `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 *note + tp_weaklistoffset: 5de, this should not be a problem. + + When a type defined by a class statement has no *note __slots__: + 112a. declaration, and none of its base types are weakly + referenceable, the type is made weakly referenceable by adding a + weak reference list head slot to the instance layout and setting + the *note tp_weaklistoffset: 5de. of that slot’s offset. + + When a type’s ‘__slots__’ declaration contains a slot named + ‘__weakref__’, that slot becomes the weak reference list head for + instances of the type, and the slot’s offset is stored in the + type’s *note tp_weaklistoffset: 5de. + + When a type’s ‘__slots__’ declaration does not contain a slot named + ‘__weakref__’, the type inherits its *note tp_weaklistoffset: 5de. + from its base type. + + -- C Member: *note getiterfunc: 4463. *note PyTypeObject: 701.tp_iter + + An optional pointer to a function that returns an *note iterator: + 134f. for the object. Its presence normally signals that the + instances of this type are *note iterable: ed9. (although sequences + may be iterable without this function). + + This function has the same signature as *note PyObject_GetIter(): + 43c0.: + + PyObject *tp_iter(PyObject *self); + + `Inheritance:' + + This field is inherited by subtypes. + + -- C Member: *note iternextfunc: 4467. *note PyTypeObject: + 701.tp_iternext + + An optional pointer to a function that returns the next item in an + *note iterator: 134f. The signature is: + + PyObject *tp_iternext(PyObject *self); + + When the iterator is exhausted, it must return ‘NULL’; a *note + StopIteration: 865. exception may or may not be set. When another + error occurs, it must return ‘NULL’ too. Its presence signals that + the instances of this type are iterators. + + Iterator types should also define the *note tp_iter: 112d. + function, and that function should return the iterator instance + itself (not a new iterator instance). + + This function has the same signature as *note PyIter_Next(): 4362. + + `Inheritance:' + + This field is inherited by subtypes. + + -- C Member: struct *note PyMethodDef: 1119. **note PyTypeObject: + 701.tp_methods + + An optional pointer to a static ‘NULL’-terminated array of *note + PyMethodDef: 1119. structures, declaring regular methods of this + type. + + For each entry in the array, an entry is added to the type’s + dictionary (see *note tp_dict: 4554. below) containing a method + descriptor. + + `Inheritance:' + + This field is not inherited by subtypes (methods are inherited + through a different mechanism). + + -- C Member: struct *note PyMemberDef: 81a. **note PyTypeObject: + 701.tp_members + + An optional pointer to a static ‘NULL’-terminated array of *note + PyMemberDef: 81a. 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 *note tp_dict: 4554. below) containing a member + descriptor. + + `Inheritance:' + + This field is not inherited by subtypes (members are inherited + through a different mechanism). + + -- C Member: struct *note PyGetSetDef: 81b. **note PyTypeObject: + 701.tp_getset + + An optional pointer to a static ‘NULL’-terminated array of *note + PyGetSetDef: 81b. 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 *note tp_dict: 4554. below) containing a getset + descriptor. + + `Inheritance:' + + This field is not inherited by subtypes (computed attributes are + inherited through a different mechanism). + + -- C Member: *note PyTypeObject: 701. **note PyTypeObject: 701.tp_base + + 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. + + Note: + Slot initialization is subject to the rules of initializing + globals. C99 requires the initializers to be “address + constants”. Function designators like *note + PyType_GenericNew(): 4261, with implicit conversion to a + pointer, are valid C99 address constants. + + However, the unary ‘&’ operator applied to a non-static + variable like ‘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, *note tp_base: 4270. should be set in the + extension module’s init function. + + `Inheritance:' + + This field is not inherited by subtypes (obviously). + + `Default:' + + This field defaults to ‘&PyBaseObject_Type’ (which to Python + programmers is known as the type *note object: 6df.). + + -- C Member: *note PyObject: 4cf. **note PyTypeObject: 701.tp_dict + + The type’s dictionary is stored here by *note PyType_Ready(): 350. + + This field should normally be initialized to ‘NULL’ before + PyType_Ready is called; it may also be initialized to a dictionary + containing initial attributes for the type. Once *note + PyType_Ready(): 350. 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 ‘__add__()’). + + `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 ‘NULL’, *note PyType_Ready(): 350. will assign a + new dictionary to it. + + Warning: It is not safe to use *note PyDict_SetItem(): 424d. + on or otherwise modify *note tp_dict: 4554. with the + dictionary C-API. + + -- C Member: *note descrgetfunc: 445e. *note PyTypeObject: + 701.tp_descr_get + + An optional pointer to a “descriptor get” function. + + The function signature is: + + PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type); + + `Inheritance:' + + This field is inherited by subtypes. + + -- C Member: *note descrsetfunc: 445f. *note PyTypeObject: + 701.tp_descr_set + + An optional pointer to a function for setting and deleting a + descriptor’s value. + + The function signature is: + + int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value); + + The `value' argument is set to ‘NULL’ to delete the value. + + `Inheritance:' + + This field is inherited by subtypes. + + -- C Member: *note Py_ssize_t: 6b1. *note PyTypeObject: + 701.tp_dictoffset + + 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 *note PyObject_GenericGetAttr(): 43bb. + + Do not confuse this field with *note tp_dict: 4554.; that is the + dictionary for attributes of the type object itself. + + If the value of this field is greater than zero, it specifies the + offset from the start of the instance structure. If the value is + less than zero, it specifies the offset from the `end' of the + instance structure. A negative offset is more expensive to use, + and should only be used when the instance structure contains a + variable-length part. This is used for example to add an instance + variable dictionary to subtypes of *note str: 1b3. or *note tuple: + 539. Note that the *note tp_basicsize: 5dd. field should account + for the dictionary added to the end in that case, even though the + dictionary is not included in the basic object layout. On a system + with a pointer size of 4 bytes, *note tp_dictoffset: 455b. should + be set to ‘-4’ to indicate that the dictionary is at the very end + of the structure. + + The *note tp_dictoffset: 455b. should be regarded as write-only. + To get the pointer to the dictionary call *note + PyObject_GenericGetDict(): 1344. Calling *note + PyObject_GenericGetDict(): 1344. may need to allocate memory for + the dictionary, so it is may be more efficient to call *note + PyObject_GetAttr(): 43bf. when accessing an attribute on the + object. + + `Inheritance:' + + This field is inherited by subtypes, but see the rules listed + below. A subtype may override this offset; this means that the + subtype instances store the dictionary at a difference offset than + the base type. Since the dictionary is always found via *note + tp_dictoffset: 455b, this should not be a problem. + + When a type defined by a class statement has no *note __slots__: + 112a. declaration, and none of its base types has an instance + variable dictionary, a dictionary slot is added to the instance + layout and the *note tp_dictoffset: 455b. is set to that slot’s + offset. + + When a type defined by a class statement has a ‘__slots__’ + declaration, the type inherits its *note tp_dictoffset: 455b. from + its base type. + + (Adding a slot named *note __dict__: 8ce. to the ‘__slots__’ + declaration does not have the expected effect, it just causes + confusion. Maybe this should be added as a feature just like + ‘__weakref__’ though.) + + `Default:' + + This slot has no default. For *note static types: 354, if the + field is ‘NULL’ then no ‘__dict__’ gets created for instances. + + -- C Member: *note initproc: 4465. *note PyTypeObject: 701.tp_init + + An optional pointer to an instance initialization function. + + This function corresponds to the ‘__init__()’ method of classes. + Like ‘__init__()’, it is possible to create an instance without + calling ‘__init__()’, and it is possible to reinitialize an + instance by calling its ‘__init__()’ method again. + + The function signature is: + + int tp_init(PyObject *self, PyObject *args, PyObject *kwds); + + The self argument is the instance to be initialized; the `args' and + `kwds' arguments represent positional and keyword arguments of the + call to ‘__init__()’. + + The *note tp_init: 4266. function, if not ‘NULL’, is called when an + instance is created normally by calling its type, after the type’s + *note tp_new: 4260. function has returned an instance of the type. + If the *note tp_new: 4260. function returns an instance of some + other type that is not a subtype of the original type, no *note + tp_init: 4266. function is called; if *note tp_new: 4260. returns + an instance of a subtype of the original type, the subtype’s *note + tp_init: 4266. is called. + + Returns ‘0’ on success, ‘-1’ and sets an exception on error. + + `Inheritance:' + + This field is inherited by subtypes. + + `Default:' + + For *note static types: 354. this field does not have a default. + + -- C Member: *note allocfunc: 445c. *note PyTypeObject: 701.tp_alloc + + An optional pointer to an instance allocation function. + + The function signature is: + + PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems); + + `Inheritance:' + + This field is inherited by static subtypes, but not by dynamic + subtypes (subtypes created by a class statement). + + `Default:' + + For dynamic subtypes, this field is always set to *note + PyType_GenericAlloc(): 6bd, to force a standard heap allocation + strategy. + + For static subtypes, ‘PyBaseObject_Type’ uses *note + PyType_GenericAlloc(): 6bd. That is the recommended value for all + statically defined types. + + -- C Member: *note newfunc: 4469. *note PyTypeObject: 701.tp_new + + An optional pointer to an instance creation function. + + The function signature is: + + PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds); + + 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 *note tp_new: 4260. function is + called; it may be a subtype of that type (but not an unrelated + type). + + The *note tp_new: 4260. function should call + ‘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 *note tp_init: 4266. handler. A + good rule of thumb is that for immutable types, all initialization + should take place in *note tp_new: 4260, while for mutable types, + most initialization should be deferred to *note tp_init: 4266. + + Set the *note Py_TPFLAGS_DISALLOW_INSTANTIATION: 47c7. flag to + disallow creating instances of the type in Python. + + `Inheritance:' + + This field is inherited by subtypes, except it is not inherited by + *note static types: 354. whose *note tp_base: 4270. is ‘NULL’ or + ‘&PyBaseObject_Type’. + + `Default:' + + For *note static types: 354. this field has no default. This means + if the slot is defined as ‘NULL’, the type cannot be called to + create new instances; presumably there is some other way to create + instances, like a factory function. + + -- C Member: *note freefunc: 462f. *note PyTypeObject: 701.tp_free + + An optional pointer to an instance deallocation function. Its + signature is: + + void tp_free(void *self); + + An initializer that is compatible with this signature is *note + PyObject_Free(): 8d6. + + `Inheritance:' + + This field is inherited by static subtypes, but not by dynamic + subtypes (subtypes created by a class statement) + + `Default:' + + In dynamic subtypes, this field is set to a deallocator suitable to + match *note PyType_GenericAlloc(): 6bd. and the value of the *note + Py_TPFLAGS_HAVE_GC: 351. flag bit. + + For static subtypes, ‘PyBaseObject_Type’ uses PyObject_Del. + + -- C Member: *note inquiry: 4466. *note PyTypeObject: 701.tp_is_gc + + 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 *note tp_flags: 12c3. field, and check the *note + Py_TPFLAGS_HAVE_GC: 351. 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 ‘1’ for a collectible + instance, and ‘0’ for a non-collectible instance. The signature + is: + + int tp_is_gc(PyObject *self); + + (The only example of this are types themselves. The metatype, + *note PyType_Type: 440a, defines this function to distinguish + between statically and *note dynamically allocated types: 5b7.) + + `Inheritance:' + + This field is inherited by subtypes. + + `Default:' + + This slot has no default. If this field is ‘NULL’, *note + Py_TPFLAGS_HAVE_GC: 351. is used as the functional equivalent. + + -- C Member: *note PyObject: 4cf. **note PyTypeObject: 701.tp_bases + + Tuple of base types. + + This is set for types created by a class statement. It should be + ‘NULL’ for statically defined types. + + `Inheritance:' + + This field is not inherited. + + -- C Member: *note PyObject: 4cf. **note PyTypeObject: 701.tp_mro + + Tuple containing the expanded set of base types, starting with the + type itself and ending with *note object: 6df, in Method Resolution + Order. + + `Inheritance:' + + This field is not inherited; it is calculated fresh by *note + PyType_Ready(): 350. + + -- C Member: *note PyObject: 4cf. **note PyTypeObject: 701.tp_cache + + Unused. Internal use only. + + `Inheritance:' + + This field is not inherited. + + -- C Member: *note PyObject: 4cf. **note PyTypeObject: + 701.tp_subclasses + + List of weak references to subclasses. Internal use only. + + `Inheritance:' + + This field is not inherited. + + -- C Member: *note PyObject: 4cf. **note PyTypeObject: 701.tp_weaklist + + Weak reference list head, for weak references to this type object. + Not inherited. Internal use only. + + `Inheritance:' + + This field is not inherited. + + -- C Member: *note destructor: 4460. *note PyTypeObject: 701.tp_del + + This field is deprecated. Use *note tp_finalize: 702. instead. + + -- C Member: unsigned int *note PyTypeObject: 701.tp_version_tag + + Used to index into the method cache. Internal use only. + + `Inheritance:' + + This field is not inherited. + + -- C Member: *note destructor: 4460. *note PyTypeObject: + 701.tp_finalize + + An optional pointer to an instance finalization function. Its + signature is: + + void tp_finalize(PyObject *self); + + If *note tp_finalize: 702. is set, the interpreter calls it once + when finalizing an instance. It is called either from the garbage + collector (if the instance is part of an isolated reference cycle) + or just before the object is deallocated. Either way, it is + guaranteed to be called before attempting to break reference + cycles, ensuring that it finds the object in a sane state. + + *note tp_finalize: 702. should not mutate the current exception + status; therefore, a recommended way to write a non-trivial + finalizer is: + + static void + local_finalize(PyObject *self) + { + PyObject *error_type, *error_value, *error_traceback; + + /* Save the current exception, if any. */ + PyErr_Fetch(&error_type, &error_value, &error_traceback); + + /* ... */ + + /* Restore the saved exception. */ + PyErr_Restore(error_type, error_value, error_traceback); + } + + Also, note that, in a garbage collected Python, *note tp_dealloc: + 4263. 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 tp_dealloc is called will own the Global + Interpreter Lock (GIL). However, if the object being destroyed in + turn destroys objects from some other C or C++ library, care should + be taken to ensure that destroying those objects on the thread + which called tp_dealloc will not violate any assumptions of the + library. + + `Inheritance:' + + This field is inherited by subtypes. + + New in version 3.4. + + Changed in version 3.8: Before version 3.8 it was necessary to set + the *note Py_TPFLAGS_HAVE_FINALIZE: 703. flags bit in order for + this field to be used. This is no longer required. + + See also + ........ + + “Safe object finalization” ( PEP 442(4)) + + -- C Member: *note vectorcallfunc: 44ef. *note PyTypeObject: + 701.tp_vectorcall + + Vectorcall function to use for calls of this type object. In other + words, it is used to implement *note vectorcall: 606. for + ‘type.__call__’. If ‘tp_vectorcall’ is ‘NULL’, the default call + implementation using ‘__new__’ and ‘__init__’ is used. + + `Inheritance:' + + This field is never inherited. + + New in version 3.9: (the field exists since 3.8 but it’s only used + since 3.9) + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0634/ + + (2) https://peps.python.org/pep-0634/ + + (3) https://bugs.python.org/issue40217 + + (4) https://peps.python.org/pep-0442/ + + +File: python.info, Node: Static Types, Next: Heap Types, Prev: PyTypeObject Slots, Up: Type Objects<3> + +7.12.3.9 Static Types +..................... + +Traditionally, types defined in C code are `static', that is, a static +*note PyTypeObject: 701. structure is defined directly in code and +initialized using *note PyType_Ready(): 350. + +This results in types that are limited relative to types defined in +Python: + + * Static types are limited to one base, i.e. they cannot use + multiple inheritance. + + * 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. + + * Static type objects are shared across *note sub-interpreters: 44b2, + so they should not include any subinterpreter-specific state. + +Also, since *note PyTypeObject: 701. is only part of the *note Limited +API: 4b8. as an opaque struct, any extension modules using static types +must be compiled for a specific Python minor version. + + +File: python.info, Node: Heap Types, Prev: Static Types, Up: Type Objects<3> + +7.12.3.10 Heap Types +.................... + +An alternative to *note static types: 354. is `heap-allocated types', or +`heap types' for short, which correspond closely to classes created by +Python’s ‘class’ statement. Heap types have the *note +Py_TPFLAGS_HEAPTYPE: 454b. flag set. + +This is done by filling a *note PyType_Spec: 4409. structure and calling +*note PyType_FromSpec(): 5b8, *note PyType_FromSpecWithBases(): 4c7, or +*note PyType_FromModuleAndSpec(): 4c8. + + +File: python.info, Node: Number Object Structures, Next: Mapping Object Structures, Prev: Type Objects<3>, Up: Object Implementation Support + +7.12.4 Number Object Structures +------------------------------- + + -- 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 *note Number Protocol: + 44fd. section. + + Here is the structure definition: + + 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; + + 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 ‘Py_NotImplemented’, if + another error occurred they must return ‘NULL’ and set an + exception. + + Note: The *note nb_reserved: 479d. field should always be + ‘NULL’. It was previously called ‘nb_long’, and was renamed + in Python 3.0.1. + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: 1081.nb_add + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_subtract + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_multiply + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_remainder + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_divmod + + -- C Member: *note ternaryfunc: 4472. *note PyNumberMethods: + 1081.nb_power + + -- C Member: *note unaryfunc: 4474. *note PyNumberMethods: + 1081.nb_negative + + -- C Member: *note unaryfunc: 4474. *note PyNumberMethods: + 1081.nb_positive + + -- C Member: *note unaryfunc: 4474. *note PyNumberMethods: + 1081.nb_absolute + + -- C Member: *note inquiry: 4466. *note PyNumberMethods: 1081.nb_bool + + -- C Member: *note unaryfunc: 4474. *note PyNumberMethods: + 1081.nb_invert + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_lshift + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_rshift + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: 1081.nb_and + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: 1081.nb_xor + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: 1081.nb_or + + -- C Member: *note unaryfunc: 4474. *note PyNumberMethods: 1081.nb_int + + -- C Member: void **note PyNumberMethods: 1081.nb_reserved + + -- C Member: *note unaryfunc: 4474. *note PyNumberMethods: + 1081.nb_float + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_add + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_subtract + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_multiply + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_remainder + + -- C Member: *note ternaryfunc: 4472. *note PyNumberMethods: + 1081.nb_inplace_power + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_lshift + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_rshift + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_and + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_xor + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_or + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_floor_divide + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_true_divide + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_floor_divide + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_true_divide + + -- C Member: *note unaryfunc: 4474. *note PyNumberMethods: + 1081.nb_index + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_matrix_multiply + + -- C Member: *note binaryfunc: 445d. *note PyNumberMethods: + 1081.nb_inplace_matrix_multiply + + +File: python.info, Node: Mapping Object Structures, Next: Sequence Object Structures, Prev: Number Object Structures, Up: Object Implementation Support + +7.12.5 Mapping Object Structures +-------------------------------- + + -- C Type: type PyMappingMethods + + This structure holds pointers to the functions which an object uses + to implement the mapping protocol. It has three members: + + -- C Member: *note lenfunc: 4468. *note PyMappingMethods: + 4289.mp_length + + This function is used by *note PyMapping_Size(): 1497. and *note + PyObject_Size(): 43c8, and has the same signature. This slot may + be set to ‘NULL’ if the object has no defined length. + + -- C Member: *note binaryfunc: 445d. *note PyMappingMethods: + 4289.mp_subscript + + This function is used by *note PyObject_GetItem(): 42ce. and *note + PySequence_GetSlice(): 43d3, and has the same signature as + ‘PyObject_GetItem()’. This slot must be filled for the *note + PyMapping_Check(): 4376. function to return ‘1’, it can be ‘NULL’ + otherwise. + + -- C Member: *note objobjargproc: 446a. *note PyMappingMethods: + 4289.mp_ass_subscript + + This function is used by *note PyObject_SetItem(): 42cc, *note + PyObject_DelItem(): 43b9, ‘PyObject_SetSlice()’ and + ‘PyObject_DelSlice()’. It has the same signature as + ‘PyObject_SetItem()’, but `v' can also be set to ‘NULL’ to delete + an item. If this slot is ‘NULL’, the object does not support item + assignment and deletion. + + +File: python.info, Node: Sequence Object Structures, Next: Buffer Object Structures, Prev: Mapping Object Structures, Up: Object Implementation Support + +7.12.6 Sequence Object Structures +--------------------------------- + + -- C Type: type PySequenceMethods + + This structure holds pointers to the functions which an object uses + to implement the sequence protocol. + + -- C Member: *note lenfunc: 4468. *note PySequenceMethods: + 4288.sq_length + + This function is used by *note PySequence_Size(): 1493. and *note + PyObject_Size(): 43c8, and has the same signature. It is also used + for handling negative indices via the *note sq_item: 1333. and the + *note sq_ass_item: 47aa. slots. + + -- C Member: *note binaryfunc: 445d. *note PySequenceMethods: + 4288.sq_concat + + This function is used by *note PySequence_Concat(): 43ce. and has + the same signature. It is also used by the ‘+’ operator, after + trying the numeric addition via the *note nb_add: 4549. slot. + + -- C Member: *note ssizeargfunc: 4470. *note PySequenceMethods: + 4288.sq_repeat + + This function is used by *note PySequence_Repeat(): 43d9. and has + the same signature. It is also used by the ‘*’ operator, after + trying numeric multiplication via the *note nb_multiply: 4786. + slot. + + -- C Member: *note ssizeargfunc: 4470. *note PySequenceMethods: + 4288.sq_item + + This function is used by *note PySequence_GetItem(): 1494. and has + the same signature. It is also used by *note PyObject_GetItem(): + 42ce, after trying the subscription via the *note mp_subscript: + 1334. slot. This slot must be filled for the *note + PySequence_Check(): 43cd. function to return ‘1’, it can be ‘NULL’ + otherwise. + + Negative indexes are handled as follows: if the ‘sq_length’ slot is + filled, it is called and the sequence length is used to compute a + positive index which is passed to ‘sq_item’. If ‘sq_length’ is + ‘NULL’, the index is passed as is to the function. + + -- C Member: *note ssizeobjargproc: 4471. *note PySequenceMethods: + 4288.sq_ass_item + + This function is used by *note PySequence_SetItem(): 1495. and has + the same signature. It is also used by *note PyObject_SetItem(): + 42cc. and *note PyObject_DelItem(): 43b9, after trying the item + assignment and deletion via the *note mp_ass_subscript: 47a7. slot. + This slot may be left to ‘NULL’ if the object does not support item + assignment and deletion. + + -- C Member: *note objobjproc: 446b. *note PySequenceMethods: + 4288.sq_contains + + This function may be used by *note PySequence_Contains(): 43cf. and + has the same signature. This slot may be left to ‘NULL’, in this + case ‘PySequence_Contains()’ simply traverses the sequence until it + finds a match. + + -- C Member: *note binaryfunc: 445d. *note PySequenceMethods: + 4288.sq_inplace_concat + + This function is used by *note PySequence_InPlaceConcat(): 43d4. + and has the same signature. It should modify its first operand, + and return it. This slot may be left to ‘NULL’, in this case + ‘PySequence_InPlaceConcat()’ will fall back to *note + PySequence_Concat(): 43ce. It is also used by the augmented + assignment ‘+=’, after trying numeric in-place addition via the + *note nb_inplace_add: 4783. slot. + + -- C Member: *note ssizeargfunc: 4470. *note PySequenceMethods: + 4288.sq_inplace_repeat + + This function is used by *note PySequence_InPlaceRepeat(): 43d5. + and has the same signature. It should modify its first operand, + and return it. This slot may be left to ‘NULL’, in this case + ‘PySequence_InPlaceRepeat()’ will fall back to *note + PySequence_Repeat(): 43d9. It is also used by the augmented + assignment ‘*=’, after trying numeric in-place multiplication via + the *note nb_inplace_multiply: 4787. slot. + + +File: python.info, Node: Buffer Object Structures, Next: Async Object Structures, Prev: Sequence Object Structures, Up: Object Implementation Support + +7.12.7 Buffer Object Structures +------------------------------- + + -- C Type: type PyBufferProcs + + This structure holds pointers to the functions required by the + *note Buffer protocol: 1ba6. The protocol defines how an exporter + object can expose its internal data to consumer objects. + + -- C Member: *note getbufferproc: 47ae. *note PyBufferProcs: + 455c.bf_getbuffer + + The signature of this function is: + + int (PyObject *exporter, Py_buffer *view, int flags); + + 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: + + 1. Check if the request can be met. If not, raise + ‘PyExc_BufferError’, set view->obj to ‘NULL’ and return ‘-1’. + + 2. Fill in the requested fields. + + 3. Increment an internal counter for the number of exports. + + 4. Set view->obj to `exporter' and increment view->obj. + + 5. Return ‘0’. + + If `exporter' is part of a chain or tree of buffer providers, two + main schemes can be used: + + * Re-export: Each member of the tree acts as the exporting + object and sets view->obj to a new reference to itself. + + * Redirect: The buffer request is redirected to the root object + of the tree. Here, view->obj will be a new reference to the + root object. + + The individual fields of `view' are described in section *note + Buffer structure: 4513, the rules how an exporter must react to + specific requests are in section *note Buffer request types: 4525. + + All memory pointed to in the *note Py_buffer: 327. structure + belongs to the exporter and must remain valid until there are no + consumers left. *note format: 451e, *note shape: 4520, *note + strides: 4517, *note suboffsets: 4522. and *note internal: 4524. + are read-only for the consumer. + + *note PyBuffer_FillInfo(): 330. provides an easy way of exposing a + simple bytes buffer while dealing correctly with all request types. + + *note PyObject_GetBuffer(): 329. is the interface for the consumer + that wraps this function. + + -- C Member: *note releasebufferproc: 47af. *note PyBufferProcs: + 455c.bf_releasebuffer + + The signature of this function is: + + void (PyObject *exporter, Py_buffer *view); + + Handle a request to release the resources of the buffer. If no + resources need to be released, *note + PyBufferProcs.bf_releasebuffer: 334. may be ‘NULL’. Otherwise, a + standard implementation of this function will take these optional + steps: + + 1. Decrement an internal counter for the number of exports. + + 2. If the counter is ‘0’, free all memory associated with `view'. + + The exporter MUST use the *note internal: 4524. 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 view->obj, since that is done + automatically in *note PyBuffer_Release(): 331. (this scheme is + useful for breaking reference cycles). + + *note PyBuffer_Release(): 331. is the interface for the consumer + that wraps this function. + + +File: python.info, Node: Async Object Structures, Next: Slot Type typedefs, Prev: Buffer Object Structures, Up: Object Implementation Support + +7.12.8 Async Object Structures +------------------------------ + +New in version 3.5. + + -- C Type: type PyAsyncMethods + + This structure holds pointers to the functions required to + implement *note awaitable: 8e7. and *note asynchronous iterator: + 9f5. objects. + + Here is the structure definition: + + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + sendfunc am_send; + } PyAsyncMethods; + + -- C Member: *note unaryfunc: 4474. *note PyAsyncMethods: 4552.am_await + + The signature of this function is: + + PyObject *am_await(PyObject *self); + + The returned object must be an *note iterator: 134f, i.e. *note + PyIter_Check(): 12fa. must return ‘1’ for it. + + This slot may be set to ‘NULL’ if an object is not an *note + awaitable: 8e7. + + -- C Member: *note unaryfunc: 4474. *note PyAsyncMethods: 4552.am_aiter + + The signature of this function is: + + PyObject *am_aiter(PyObject *self); + + Must return an *note asynchronous iterator: 9f5. object. See + ‘__anext__()’ for details. + + This slot may be set to ‘NULL’ if an object does not implement + asynchronous iteration protocol. + + -- C Member: *note unaryfunc: 4474. *note PyAsyncMethods: 4552.am_anext + + The signature of this function is: + + PyObject *am_anext(PyObject *self); + + Must return an *note awaitable: 8e7. object. See ‘__anext__()’ for + details. This slot may be set to ‘NULL’. + + -- C Member: *note sendfunc: 4782. *note PyAsyncMethods: 4552.am_send + + The signature of this function is: + + PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result); + + See *note PyIter_Send(): 4c1. for details. This slot may be set to + ‘NULL’. + + New in version 3.10. + + +File: python.info, Node: Slot Type typedefs, Next: Examples<39>, Prev: Async Object Structures, Up: Object Implementation Support + +7.12.9 Slot Type typedefs +------------------------- + + -- C Type: typedef *note PyObject: 4cf. *(*allocfunc)(*note + PyTypeObject: 701. *cls, *note Py_ssize_t: 6b1. nitems) + ` Part of the *note Stable ABI: 4b8.' 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 + ‘ob_refcnt’ set to ‘1’ and ‘ob_type’ set to the type argument. If + the type’s *note tp_itemsize: 425d. is non-zero, the object’s + ‘ob_size’ field should be initialized to `nitems' and the length of + the allocated memory block should be ‘tp_basicsize + + nitems*tp_itemsize’, rounded up to a multiple of ‘sizeof(void*)’; + otherwise, `nitems' is not used and the length of the block should + be *note tp_basicsize: 5dd. + + This function should not do any other instance initialization, not + even to allocate additional memory; that should be done by *note + tp_new: 4260. + + -- C Type: typedef void (*destructor)(*note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef void (*freefunc)(void*) + + See *note tp_free: 4264. + + -- C Type: typedef *note PyObject: 4cf. *(*newfunc)(*note PyObject: + 4cf.*, *note PyObject: 4cf.*, *note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_new: 4260. + + -- C Type: typedef int (*initproc)(*note PyObject: 4cf.*, *note + PyObject: 4cf.*, *note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_init: 4266. + + -- C Type: typedef *note PyObject: 4cf. *(*reprfunc)(*note PyObject: + 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_repr: 427a. + + -- C Type: typedef *note PyObject: 4cf. *(*getattrfunc)(*note PyObject: + 4cf. *self, char *attr) + ` Part of the *note Stable ABI: 4b8.' Return the value of the + named attribute for the object. + + -- C Type: typedef int (*setattrfunc)(*note PyObject: 4cf. *self, char + *attr, *note PyObject: 4cf. *value) + ` Part of the *note Stable ABI: 4b8.' Set the value of the named + attribute for the object. The value argument is set to ‘NULL’ to + delete the attribute. + + -- C Type: typedef *note PyObject: 4cf. *(*getattrofunc)(*note + PyObject: 4cf. *self, *note PyObject: 4cf. *attr) + ` Part of the *note Stable ABI: 4b8.' Return the value of the + named attribute for the object. + + See *note tp_getattro: 427e. + + -- C Type: typedef int (*setattrofunc)(*note PyObject: 4cf. *self, + *note PyObject: 4cf. *attr, *note PyObject: 4cf. *value) + ` Part of the *note Stable ABI: 4b8.' Set the value of the named + attribute for the object. The value argument is set to ‘NULL’ to + delete the attribute. + + See *note tp_setattro: 427f. + + -- C Type: typedef *note PyObject: 4cf. *(*descrgetfunc)(*note + PyObject: 4cf.*, *note PyObject: 4cf.*, *note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_descr_get: + 4778. + + -- C Type: typedef int (*descrsetfunc)(*note PyObject: 4cf.*, *note + PyObject: 4cf.*, *note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_descr_set: + 12fc. + + -- C Type: typedef Py_hash_t (*hashfunc)(*note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_hash: 428a. + + -- C Type: typedef *note PyObject: 4cf. *(*richcmpfunc)(*note PyObject: + 4cf.*, *note PyObject: 4cf.*, int) + ` Part of the *note Stable ABI: 4b8.' See *note tp_richcompare: + 4284. + + -- C Type: typedef *note PyObject: 4cf. *(*getiterfunc)(*note PyObject: + 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_iter: 112d. + + -- C Type: typedef *note PyObject: 4cf. *(*iternextfunc)(*note + PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' See *note tp_iternext: 112e. + + -- C Type: typedef *note Py_ssize_t: 6b1. (*lenfunc)(*note PyObject: + 4cf.*) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef int (*getbufferproc)(*note PyObject: 4cf.*, *note + Py_buffer: 327.*, int) + + -- C Type: typedef void (*releasebufferproc)(*note PyObject: 4cf.*, + *note Py_buffer: 327.*) + + -- C Type: typedef *note PyObject: 4cf. *(*unaryfunc)(*note PyObject: + 4cf.*) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef *note PyObject: 4cf. *(*binaryfunc)(*note PyObject: + 4cf.*, *note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef *note PySendResult: 450f. (*sendfunc)(*note + PyObject: 4cf.*, *note PyObject: 4cf.*, *note PyObject: + 4cf.**) + + See *note am_send: 4781. + + -- C Type: typedef *note PyObject: 4cf. *(*ternaryfunc)(*note PyObject: + 4cf.*, *note PyObject: 4cf.*, *note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef *note PyObject: 4cf. *(*ssizeargfunc)(*note + PyObject: 4cf.*, *note Py_ssize_t: 6b1.) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef int (*ssizeobjargproc)(*note PyObject: 4cf.*, *note + Py_ssize_t: 6b1.) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef int (*objobjproc)(*note PyObject: 4cf.*, *note + PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' + + -- C Type: typedef int (*objobjargproc)(*note PyObject: 4cf.*, *note + PyObject: 4cf.*, *note PyObject: 4cf.*) + ` Part of the *note Stable ABI: 4b8.' + + +File: python.info, Node: Examples<39>, Next: Supporting Cyclic Garbage Collection, Prev: Slot Type typedefs, Up: Object Implementation Support + +7.12.10 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 *note +Defining Extension Types; Tutorial: 4259. and *note Defining Extension +Types; Assorted Topics: 4274. + +A basic *note static type: 354.: + + 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, + }; + +You may also find older code (especially in the CPython code base) with +a more verbose initializer: + + 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 */ + }; + +A type that supports weakrefs, instance dicts, and hashing: + + typedef struct { + PyObject_HEAD + const char *data; + PyObject *inst_dict; + PyObject *weakreflist; + } 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_weaklistoffset = offsetof(MyObject, weakreflist), + .tp_dictoffset = offsetof(MyObject, inst_dict), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .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, + }; + +A str subclass that cannot be subclassed and cannot be called to create +instances (e.g. uses a separate factory func) using +‘Py_TPFLAGS_DISALLOW_INSTANTIATION’ flag: + + 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, + }; + +The simplest *note static type: 354. with fixed-length instances: + + typedef struct { + PyObject_HEAD + } MyObject; + + static PyTypeObject MyObject_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "mymod.MyObject", + }; + +The simplest *note static type: 354. with variable-length instances: + + 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 *), + }; + + +File: python.info, Node: Supporting Cyclic Garbage Collection, Prev: Examples<39>, Up: Object Implementation Support + +7.12.11 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 *note tp_flags: 12c3. field of the type +object must include the *note Py_TPFLAGS_HAVE_GC: 351. and provide an +implementation of the *note tp_traverse: 352. handler. If instances of +the type are mutable, a *note tp_clear: 4278. implementation must also +be provided. + + -- Data: 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. + +Constructors for container types must conform to two rules: + + 1. The memory for the object must be allocated using *note + PyObject_GC_New(): 6fe. or *note PyObject_GC_NewVar(): 6ff. + + 2. Once all the fields which may contain references to other + containers are initialized, it must call *note PyObject_GC_Track(): + 113f. + +Similarly, the deallocator for the object must conform to a similar pair +of rules: + + 1. Before fields which refer to other containers are invalidated, + *note PyObject_GC_UnTrack(): 1140. must be called. + + 2. The object’s memory must be deallocated using *note + PyObject_GC_Del(): 113e. + + Warning: If a type adds the Py_TPFLAGS_HAVE_GC, then it `must' + implement at least a *note tp_traverse: 352. handler or + explicitly use one from its subclass or subclasses. + + When calling *note PyType_Ready(): 350. or some of the APIs + that indirectly call it like *note PyType_FromSpecWithBases(): + 4c7. or *note PyType_FromSpec(): 5b8. the interpreter will + automatically populate the *note tp_flags: 12c3, *note + tp_traverse: 352. and *note tp_clear: 4278. fields if the type + inherits from a class that implements the garbage collector + protocol and the child class does `not' include the *note + Py_TPFLAGS_HAVE_GC: 351. flag. + + -- C Function: TYPE *PyObject_GC_New (TYPE, PyTypeObject *type) + + Analogous to *note PyObject_New(): 5db. but for container objects + with the *note Py_TPFLAGS_HAVE_GC: 351. flag set. + + -- C Function: TYPE *PyObject_GC_NewVar (TYPE, PyTypeObject *type, + Py_ssize_t size) + + Analogous to *note PyObject_NewVar(): 5dc. but for container + objects with the *note Py_TPFLAGS_HAVE_GC: 351. flag set. + + -- C Function: TYPE *PyObject_GC_Resize (TYPE, PyVarObject *op, + Py_ssize_t newsize) + + Resize an object allocated by *note PyObject_NewVar(): 5dc. + Returns the resized object or ‘NULL’ on failure. `op' must not be + tracked by the collector yet. + + -- C Function: void PyObject_GC_Track (PyObject *op) + ` Part of the *note Stable ABI: 4b8.' 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 + *note tp_traverse: 352. handler become valid, usually near the end + of the constructor. + + -- 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. + + -- C Function: int PyObject_GC_IsTracked (PyObject *op) + ` Part of the *note Stable ABI: 4b8. 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 *note gc.is_tracked(): + fae. + + New in version 3.9. + + -- C Function: int PyObject_GC_IsFinalized (PyObject *op) + ` Part of the *note Stable ABI: 4b8. 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 *note gc.is_finalized(): + 540. + + New in version 3.9. + + -- C Function: void PyObject_GC_Del (void *op) + ` Part of the *note Stable ABI: 4b8.' Releases memory allocated to + an object using *note PyObject_GC_New(): 6fe. or *note + PyObject_GC_NewVar(): 6ff. + + -- C Function: void PyObject_GC_UnTrack (void *op) + ` Part of the *note Stable ABI: 4b8.' Remove the object `op' from + the set of container objects tracked by the collector. Note that + *note PyObject_GC_Track(): 113f. can be called again on this object + to add it back to the set of tracked objects. The deallocator + (*note tp_dealloc: 4263. handler) should call this for the object + before any of the fields used by the *note tp_traverse: 352. + handler become invalid. + +Changed in version 3.8: The ‘_PyObject_GC_TRACK()’ and +‘_PyObject_GC_UNTRACK()’ macros have been removed from the public C API. + +The *note tp_traverse: 352. handler accepts a function parameter of this +type: + + -- C Type: typedef int (*visitproc)(*note PyObject: 4cf. *object, void + *arg) + ` Part of the *note Stable ABI: 4b8.' Type of the visitor function + passed to the *note tp_traverse: 352. handler. The function should + be called with an object to traverse as `object' and the third + parameter to the *note tp_traverse: 352. 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. + +The *note tp_traverse: 352. handler must have the following type: + + -- C Type: typedef int (*traverseproc)(*note PyObject: 4cf. *self, + *note visitproc: 4475. visit, void *arg) + ` Part of the *note Stable ABI: 4b8.' 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 ‘NULL’ + object argument. If `visit' returns a non-zero value that value + should be returned immediately. + +To simplify writing *note tp_traverse: 352. handlers, a *note +Py_VISIT(): 426e. macro is provided. In order to use this macro, the +*note tp_traverse: 352. implementation must name its arguments exactly +`visit' and `arg': + + -- C Function: void Py_VISIT (PyObject *o) + + If `o' is not ‘NULL’, call the `visit' callback, with arguments `o' + and `arg'. If `visit' returns a non-zero value, then return it. + Using this macro, *note tp_traverse: 352. handlers look like: + + static int + my_traverse(Noddy *self, visitproc visit, void *arg) + { + Py_VISIT(self->foo); + Py_VISIT(self->bar); + return 0; + } + +The *note tp_clear: 4278. handler must be of the *note inquiry: 4466. +type, or ‘NULL’ if the object is immutable. + + -- C Type: typedef int (*inquiry)(*note PyObject: 4cf. *self) + ` Part of the *note Stable ABI: 4b8.' 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 *note Py_DECREF(): 4cd. on a + reference). The collector will call this method if it detects that + this object is involved in a reference cycle. + +* Menu: + +* Controlling the Garbage Collector State:: + + +File: python.info, Node: Controlling the Garbage Collector State, Up: Supporting Cyclic Garbage Collection + +7.12.11.1 Controlling the Garbage Collector State +................................................. + +The C-API provides the following functions for controlling garbage +collection runs. + + -- C Function: *note Py_ssize_t: 6b1. PyGC_Collect (void) + ` Part of the *note Stable ABI: 4b8.' Perform a full garbage + collection, if the garbage collector is enabled. (Note that *note + gc.collect(): 687. runs it unconditionally.) + + Returns the number of collected + unreachable objects which cannot + be collected. If the garbage collector is disabled or already + collecting, returns ‘0’ immediately. Errors during garbage + collection are passed to *note sys.unraisablehook: 24e. This + function does not raise exceptions. + + -- C Function: int PyGC_Enable (void) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Enable + the garbage collector: similar to *note gc.enable(): 3c54. Returns + the previous state, 0 for disabled and 1 for enabled. + + New in version 3.10. + + -- C Function: int PyGC_Disable (void) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Disable + the garbage collector: similar to *note gc.disable(): 3c55. + Returns the previous state, 0 for disabled and 1 for enabled. + + New in version 3.10. + + -- C Function: int PyGC_IsEnabled (void) + ` Part of the *note Stable ABI: 4b8. since version 3.10.' Query + the state of the garbage collector: similar to *note + gc.isenabled(): 3c56. Returns the current state, 0 for disabled + and 1 for enabled. + + New in version 3.10. + + +File: python.info, Node: API and ABI Versioning, Prev: Object Implementation Support, Up: Python/C API Reference Manual + +7.13 API and ABI Versioning +=========================== + +CPython exposes its version number in the following macros. Note that +these correspond to the version code is `built' with, not necessarily +the version used at `run time'. + +See *note C API Stability: 4b8. for a discussion of API and ABI +stability across versions. + + -- C Macro: PY_MAJOR_VERSION + + The ‘3’ in ‘3.4.1a2’. + + -- C Macro: PY_MINOR_VERSION + + The ‘4’ in ‘3.4.1a2’. + + -- C Macro: PY_MICRO_VERSION + + The ‘1’ in ‘3.4.1a2’. + + -- C Macro: PY_RELEASE_LEVEL + + The ‘a’ in ‘3.4.1a2’. This can be ‘0xA’ for alpha, ‘0xB’ for beta, + ‘0xC’ for release candidate or ‘0xF’ for final. + + -- C Macro: PY_RELEASE_SERIAL + + The ‘2’ in ‘3.4.1a2’. Zero for final releases. + + -- C Macro: PY_VERSION_HEX + + The Python version number encoded in a single integer. + + The underlying version information can be found by treating it as a + 32 bit number in the following manner: + + Bytes Bits (big endian order) Meaning Value for ‘3.4.1a2’ + + ------------------------------------------------------------------------------------------------------- + + 1 1-8 ‘PY_MAJOR_VERSION’ ‘0x03’ + + + 2 9-16 ‘PY_MINOR_VERSION’ ‘0x04’ + + + 3 17-24 ‘PY_MICRO_VERSION’ ‘0x01’ + + + 4 25-28 ‘PY_RELEASE_LEVEL’ ‘0xA’ + + + 29-32 ‘PY_RELEASE_SERIAL’ ‘0x2’ + + + Thus ‘3.4.1a2’ is hexversion ‘0x030401a2’ and ‘3.10.0’ is + hexversion ‘0x030a00f0’. + + This version is also available via the symbol ‘Py_Version’. + + -- C Variable: const unsigned long Py_Version + ` Part of the *note Stable ABI: 4b8. since version 3.11.' The + Python runtime version number encoded in a single constant integer, + with the same format as the *note PY_VERSION_HEX: 326. macro. This + contains the Python version used at run time. + + New in version 3.11. + +All the given macros are defined in Include/patchlevel.h(1). + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Include/patchlevel.h + + +File: python.info, Node: Distributing Python Modules, Next: Installing Python Modules, Prev: Python/C API Reference Manual, Up: Top + +8 Distributing Python Modules +***************************** + + +Email: + +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 distribution part of the process. For a guide to +installing other Python projects, refer to the *note installation guide: +b85. + + 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. + +* Menu: + +* Key terms:: +* Open source licensing and collaboration:: +* Installing the tools:: +* Reading the Python Packaging User Guide:: +* How do I…?:: + + +File: python.info, Node: Key terms, Next: Open source licensing and collaboration, Up: Distributing Python Modules + +8.1 Key terms +============= + + * the Python Package Index(1) is a public repository of open source + licensed packages made available for use by other Python users + + * the Python Packaging Authority(2) are 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 both GitHub(3) and + Bitbucket(4). + + * *note distutils: 37. is the original build and distribution system + first added to the Python standard library in 1998. While direct + use of *note distutils: 37. is being phased out, it still laid the + foundation for the current packaging and distribution + infrastructure, and it not only remains part of the standard + library, but its name lives on in other ways (such as the name of + the mailing list used to coordinate Python packaging standards + development). + + * setuptools(5) is a (largely) drop-in replacement for *note + distutils: 37. first published in 2004. Its most notable addition + over the unmodified *note distutils: 37. tools was the ability to + declare dependencies on other packages. It is currently + recommended as a more regularly updated alternative to *note + distutils: 37. that offers consistent support for more recent + packaging standards across a wide range of Python versions. + + * wheel(6) (in this context) is a project that adds the ‘bdist_wheel’ + command to *note distutils: 37./setuptools(7). This produces a + cross platform binary packaging format (called “wheels” or “wheel + files” and defined in PEP 427(8)) that allows Python libraries, + even those including binary extensions, to be installed on a system + without needing to be built locally. + + ---------- Footnotes ---------- + + (1) https://pypi.org + + (2) https://www.pypa.io/ + + (3) https://github.com/pypa + + (4) https://bitbucket.org/pypa/ + + (5) https://setuptools.readthedocs.io/en/latest/ + + (6) https://wheel.readthedocs.io/ + + (7) https://setuptools.readthedocs.io/en/latest/ + + (8) https://peps.python.org/pep-0427/ + + +File: python.info, Node: Open source licensing and collaboration, Next: Installing the tools, Prev: Key terms, Up: Distributing Python Modules + +8.2 Open source licensing and collaboration +=========================================== + +In most parts of the world, software is automatically covered by +copyright. This means that other developers require explicit permission +to copy, use, modify and redistribute the software. + +Open source licensing is a way of explicitly granting such permission in +a relatively consistent way, allowing developers to share and +collaborate efficiently by making common solutions to various problems +freely available. This leaves many developers free to spend more time +focusing on the problems that are relatively unique to their specific +situation. + +The distribution tools provided with Python are designed to make it +reasonably straightforward for developers to make their own +contributions back to that common pool of software if they choose to do +so. + +The same distribution tools can also be used to distribute software +within an organisation, regardless of whether that software is published +as open source software or not. + + +File: python.info, Node: Installing the tools, Next: Reading the Python Packaging User Guide, Prev: Open source licensing and collaboration, Up: Distributing Python Modules + +8.3 Installing the tools +======================== + +The standard library does not include build tools that support modern +Python packaging standards, as the core development team has found that +it is important to have standard tools that work consistently, even on +older versions of Python. + +The currently recommended build and distribution tools can be installed +by invoking the ‘pip’ module at the command line: + + python -m pip install setuptools wheel twine + + Note: For POSIX users (including macOS and Linux users), these + instructions assume the use of a *note virtual environment: 1740. + + For Windows users, these instructions assume that the option to + adjust the system PATH environment variable was selected when + installing Python. + +The Python Packaging User Guide includes more details on the currently +recommended tools(1). + + ---------- Footnotes ---------- + + (1) +https://packaging.python.org/guides/tool-recommendations/#packaging-tool-recommendations + + +File: python.info, Node: Reading the Python Packaging User Guide, Next: How do I…?, Prev: Installing the tools, Up: Distributing Python Modules + +8.4 Reading the Python Packaging User Guide +=========================================== + +The Python Packaging User Guide covers the various key steps and +elements involved in creating and publishing a project: + + * Project structure(1) + + * Building and packaging the project(2) + + * Uploading the project to the Python Package Index(3) + + * The .pypirc file(4) + + ---------- Footnotes ---------- + + (1) +https://packaging.python.org/tutorials/packaging-projects/#packaging-python-projects + + (2) +https://packaging.python.org/tutorials/packaging-projects/#creating-the-package-files + + (3) +https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives + + (4) https://packaging.python.org/specifications/pypirc/ + + +File: python.info, Node: How do I…?, Prev: Reading the Python Packaging User Guide, Up: Distributing Python Modules + +8.5 How do I…? +============== + +These are quick answers or links for some common tasks. + +* Menu: + +* … choose a name for my project?:: +* … create and distribute binary extensions?:: + + +File: python.info, Node: … choose a name for my project?, Next: … create and distribute binary extensions?, Up: How do I…? + +8.5.1 … choose a name for my project? +------------------------------------- + +This isn’t an easy topic, but here are a few tips: + + * check the Python Package Index to see if the name is already in use + + * check popular hosting sites like GitHub, Bitbucket, etc to see if + there is already a project with that name + + * check what comes up in a web search for the name you’re considering + + * avoid particularly common words, especially ones with multiple + meanings, as they can make it difficult for users to find your + software when searching for it + + +File: python.info, Node: … create and distribute binary extensions?, Prev: … choose a name for my project?, Up: How do I…? + +8.5.2 … create and distribute binary extensions? +------------------------------------------------ + +This is actually quite a complex topic, with a variety of alternatives +available depending on exactly what you’re aiming to achieve. See the +Python Packaging User Guide for more information and recommendations. + +See also +........ + +Python Packaging User Guide: Binary Extensions(1) + + ---------- Footnotes ---------- + + (1) https://packaging.python.org/guides/packaging-binary-extensions/ + + +File: python.info, Node: Installing Python Modules, Next: Python HOWTOs, Prev: Distributing Python Modules, Up: Top + +9 Installing Python Modules +*************************** + + +Email: + +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 *note +distribution guide: b86. + + 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. + +* Menu: + +* Key terms: Key terms<2>. +* Basic usage:: +* How do I …?:: +* Common installation issues:: + + +File: python.info, Node: Key terms<2>, Next: Basic usage, Up: Installing Python Modules + +9.1 Key terms +============= + + * ‘pip’ is the preferred installer program. Starting with Python + 3.4, it is included by default with the Python binary installers. + + * 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. + + * ‘venv’ is the standard tool for creating virtual environments, and + has been part of Python since Python 3.3. Starting with Python + 3.4, it defaults to installing ‘pip’ into all created virtual + environments. + + * ‘virtualenv’ is a third party alternative (and predecessor) to + ‘venv’. It allows virtual environments to be used on versions of + Python prior to 3.4, which either don’t provide ‘venv’ at all, or + aren’t able to automatically install ‘pip’ into created + environments. + + * The Python Package Index(1) is a public repository of open source + licensed packages made available for use by other Python users. + + * the Python Packaging Authority(2) 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 both GitHub(3) and + Bitbucket(4). + + * ‘distutils’ is the original build and distribution system first + added to the Python standard library in 1998. While direct use of + ‘distutils’ is being phased out, it still laid the foundation for + the current packaging and distribution infrastructure, and it not + only remains part of the standard library, but its name lives on in + other ways (such as the name of the mailing list used to coordinate + Python packaging standards development). + +Changed in version 3.5: The use of ‘venv’ is now recommended for +creating virtual environments. + +See also +........ + +Python Packaging User Guide: Creating and using virtual environments(5) + + ---------- Footnotes ---------- + + (1) https://pypi.org + + (2) https://www.pypa.io/ + + (3) https://github.com/pypa + + (4) https://bitbucket.org/pypa/ + + (5) +https://packaging.python.org/installing/#creating-virtual-environments + + +File: python.info, Node: Basic usage, Next: How do I …?, Prev: Key terms<2>, Up: Installing Python Modules + +9.2 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 the Python Package Index: + + python -m pip install SomePackage + + Note: For POSIX users (including macOS and Linux users), the + examples in this guide assume the use of a *note virtual + environment: 1740. + + For Windows users, the examples in this guide assume that the + option to adjust the system PATH environment variable was selected + when installing Python. + +It’s also possible to specify an exact or minimum version directly on +the command line. When using comparator operators such as ‘>’, ‘<’ or +some other special character which get interpreted by shell, the package +name and the version should be enclosed within double quotes: + + python -m pip install SomePackage==1.0.4 # specific version + python -m pip install "SomePackage>=1.0.4" # minimum version + +Normally, if a suitable module is already installed, attempting to +install it again will have no effect. Upgrading existing modules must +be requested explicitly: + + python -m pip install --upgrade SomePackage + +More information and resources regarding ‘pip’ and its capabilities can +be found in the Python Packaging User Guide(1). + +Creation of virtual environments is done through the *note venv: 12f. +module. Installing packages into an active virtual environment uses the +commands shown above. + +See also +........ + +Python Packaging User Guide: Installing Python Distribution Packages(2) + + ---------- Footnotes ---------- + + (1) https://packaging.python.org + + (2) https://packaging.python.org/installing/ + + +File: python.info, Node: How do I …?, Next: Common installation issues, Prev: Basic usage, Up: Installing Python Modules + +9.3 How do I …? +=============== + +These are quick answers or links for some common tasks. + +* Menu: + +* … install pip in versions of Python prior to Python 3.4?: … install pip in versions of Python prior to Python 3 4?. +* … install packages just for the current user?:: +* … install scientific Python packages?:: +* … work with multiple versions of Python installed in parallel?:: + + +File: python.info, Node: … install pip in versions of Python prior to Python 3 4?, Next: … install packages just for the current user?, Up: How do I …? + +9.3.1 … install ‘pip’ in versions of Python prior to Python 3.4? +---------------------------------------------------------------- + +Python only started bundling ‘pip’ with Python 3.4. For earlier +versions, ‘pip’ needs to be “bootstrapped” as described in the Python +Packaging User Guide. + +See also +........ + +Python Packaging User Guide: Requirements for Installing Packages(1) + + ---------- Footnotes ---------- + + (1) +https://packaging.python.org/installing/#requirements-for-installing-packages + + +File: python.info, Node: … install packages just for the current user?, Next: … install scientific Python packages?, Prev: … install pip in versions of Python prior to Python 3 4?, Up: How do I …? + +9.3.2 … install packages just for the current user? +--------------------------------------------------- + +Passing the ‘--user’ option to ‘python -m pip install’ will install a +package just for the current user, rather than for all users of the +system. + + +File: python.info, Node: … install scientific Python packages?, Next: … work with multiple versions of Python installed in parallel?, Prev: … install packages just for the current user?, Up: How do I …? + +9.3.3 … install scientific Python packages? +------------------------------------------- + +A number of scientific Python packages have complex binary dependencies, +and aren’t currently easy to install using ‘pip’ directly. At this +point in time, it will often be easier for users to install these +packages by other means(1) rather than attempting to install them with +‘pip’. + +See also +........ + +Python Packaging User Guide: Installing Scientific Packages(2) + + ---------- Footnotes ---------- + + (1) https://packaging.python.org/science/ + + (2) https://packaging.python.org/science/ + + +File: python.info, Node: … work with multiple versions of Python installed in parallel?, Prev: … install scientific Python packages?, Up: How do I …? + +9.3.4 … 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 ‘-m’ switch to run the appropriate copy +of ‘pip’: + + python2 -m pip install SomePackage # default Python 2 + python2.7 -m pip install SomePackage # specifically Python 2.7 + python3 -m pip install SomePackage # default Python 3 + python3.4 -m pip install SomePackage # specifically Python 3.4 + +Appropriately versioned ‘pip’ commands may also be available. + +On Windows, use the ‘py’ Python launcher in combination with the ‘-m’ +switch: + + py -2 -m pip install SomePackage # default Python 2 + py -2.7 -m pip install SomePackage # specifically Python 2.7 + py -3 -m pip install SomePackage # default Python 3 + py -3.4 -m pip install SomePackage # specifically Python 3.4 + + +File: python.info, Node: Common installation issues, Prev: How do I …?, Up: Installing Python Modules + +9.4 Common installation issues +============================== + +* Menu: + +* Installing into the system Python on Linux:: +* Pip not installed:: +* Installing binary extensions:: + + +File: python.info, Node: Installing into the system Python on Linux, Next: Pip not installed, Up: Common installation issues + +9.4.1 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 ‘pip’. + +On such systems, it is often better to use a virtual environment or a +per-user installation when installing packages with ‘pip’. + + +File: python.info, Node: Pip not installed, Next: Installing binary extensions, Prev: Installing into the system Python on Linux, Up: Common installation issues + +9.4.2 Pip not installed +----------------------- + +It is possible that ‘pip’ does not get installed by default. One +potential fix is: + + python -m ensurepip --default-pip + +There are also additional resources for installing pip.(1) + + ---------- Footnotes ---------- + + (1) +https://packaging.python.org/en/latest/tutorials/installing-packages/#ensure-pip-setuptools-and-wheel-are-up-to-date + + +File: python.info, Node: Installing binary extensions, Prev: Pip not installed, Up: Common installation issues + +9.4.3 Installing binary extensions +---------------------------------- + +Python has typically 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 support for the binary ‘wheel’ format, and the +ability to publish wheels for at least Windows and macOS through the +Python Package Index, this problem is expected to diminish over time, 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(1) that are not +yet available as pre-built ‘wheel’ files may also help with obtaining +other binary extensions without needing to build them locally. + +See also +........ + +Python Packaging User Guide: Binary Extensions(2) + + ---------- Footnotes ---------- + + (1) https://packaging.python.org/science/ + + (2) https://packaging.python.org/extensions/ + + +File: python.info, Node: Python HOWTOs, Next: Python Frequently Asked Questions, Prev: Installing Python Modules, Up: Top + +10 Python HOWTOs +**************** + +Python HOWTOs are documents that cover a single, specific topic, and +attempt to cover it fairly completely. Modelled 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. + +Currently, the HOWTOs are: + +* Menu: + +* Porting Python 2 Code to Python 3:: +* Porting Extension Modules to Python 3:: +* Curses Programming with Python:: +* Descriptor HowTo Guide:: +* Enum HOWTO:: +* Functional Programming HOWTO:: +* Logging HOWTO:: +* Logging Cookbook:: +* Regular Expression HOWTO:: +* Socket Programming HOWTO:: +* Sorting HOW TO:: +* Unicode HOWTO:: +* HOWTO Fetch Internet Resources Using The urllib Package:: +* Argparse Tutorial:: +* An introduction to the ipaddress module:: +* Argument Clinic How-To:: +* Instrumenting CPython with DTrace and SystemTap:: +* Annotations Best Practices:: +* Isolating Extension Modules:: + + +File: python.info, Node: Porting Python 2 Code to Python 3, Next: Porting Extension Modules to Python 3, Up: Python HOWTOs + +10.1 Porting Python 2 Code to Python 3 +====================================== + + +author: Brett Cannon + +Abstract +........ + +With Python 3 being the future of Python while Python 2 is still in +active use, it is good to have your project available for both major +releases of Python. This guide is meant to help you figure out how best +to support both Python 2 & 3 simultaneously. + +If you are looking to port an extension module instead of pure Python +code, please see *note Porting Extension Modules to Python 3: f87. + +If you would like to read one core Python developer’s take on why Python +3 came into existence, you can read Nick Coghlan’s Python 3 Q & A(1) or +Brett Cannon’s Why Python 3 exists(2). + +For help with porting, you can view the archived python-porting(3) +mailing list. + +* Menu: + +* The Short Explanation:: +* Details:: + + ---------- Footnotes ---------- + + (1) +https://ncoghlan-devs-python-notes.readthedocs.io/en/latest/python3/questions_and_answers.html + + (2) https://snarky.ca/why-python-3-exists + + (3) https://mail.python.org/pipermail/python-porting/ + + +File: python.info, Node: The Short Explanation, Next: Details, Up: Porting Python 2 Code to Python 3 + +10.1.1 The Short Explanation +---------------------------- + +To make your project be single-source Python 2/3 compatible, the basic +steps are: + + 1. Only worry about supporting Python 2.7 + + 2. Make sure you have good test coverage (coverage.py(1) can help; + ‘python -m pip install coverage’) + + 3. Learn the differences between Python 2 & 3 + + 4. Use Futurize(2) (or Modernize(3)) to update your code (e.g. + ‘python -m pip install future’) + + 5. Use Pylint(4) to help make sure you don’t regress on your Python 3 + support (‘python -m pip install pylint’) + + 6. Use caniusepython3(5) to find out which of your dependencies are + blocking your use of Python 3 (‘python -m pip install + caniusepython3’) + + 7. Once your dependencies are no longer blocking you, use continuous + integration to make sure you stay compatible with Python 2 & 3 + (tox(6) can help test against multiple versions of Python; ‘python + -m pip install tox’) + + 8. Consider using optional static type checking to make sure your type + usage works in both Python 2 & 3 (e.g. use mypy(7) to check your + typing under both Python 2 & Python 3; ‘python -m pip install + mypy’). + + Note: Note: Using ‘python -m pip install’ guarantees that the ‘pip’ + you invoke is the one installed for the Python currently in use, + whether it be a system-wide ‘pip’ or one installed within a *note + virtual environment: 173d. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/coverage + + (2) https://python-future.org/automatic_conversion.html + + (3) https://python-modernize.readthedocs.io/ + + (4) https://pypi.org/project/pylint + + (5) https://pypi.org/project/caniusepython3 + + (6) https://pypi.org/project/tox + + (7) http://mypy-lang.org/ + + +File: python.info, Node: Details, Prev: The Short Explanation, Up: Porting Python 2 Code to Python 3 + +10.1.2 Details +-------------- + +A key point about supporting Python 2 & 3 simultaneously is that you can +start `today'! Even if your dependencies are not supporting Python 3 +yet that does not mean you can’t modernize your code `now' to support +Python 3. Most changes required to support Python 3 lead to cleaner +code using newer practices even in Python 2 code. + +Another key point is that modernizing your Python 2 code to also support +Python 3 is largely automated for you. While you might have to make +some API decisions thanks to Python 3 clarifying text data versus binary +data, the lower-level work is now mostly done for you and thus can at +least benefit from the automated changes immediately. + +Keep those key points in mind while you read on about the details of +porting your code to support Python 2 & 3 simultaneously. + +* Menu: + +* Drop support for Python 2.6 and older: Drop support for Python 2 6 and older. +* Make sure you specify the proper version support in your setup.py file: Make sure you specify the proper version support in your setup py file. +* Have good test coverage:: +* Learn the differences between Python 2 & 3:: +* Update your code:: +* Prevent compatibility regressions:: +* Check which dependencies block your transition:: +* Update your setup.py file to denote Python 3 compatibility: Update your setup py file to denote Python 3 compatibility. +* Use continuous integration to stay compatible:: +* Consider using optional static type checking:: + + +File: python.info, Node: Drop support for Python 2 6 and older, Next: Make sure you specify the proper version support in your setup py file, Up: Details + +10.1.2.1 Drop support for Python 2.6 and older +.............................................. + +While you can make Python 2.5 work with Python 3, it is `much' easier if +you only have to work with Python 2.7. If dropping Python 2.5 is not an +option then the six(1) project can help you support Python 2.5 & 3 +simultaneously (‘python -m pip install six’). Do realize, though, that +nearly all the projects listed in this HOWTO will not be available to +you. + +If you are able to skip Python 2.5 and older, then the required changes +to your code should continue to look and feel like idiomatic Python +code. At worst you will have to use a function instead of a method in +some instances or have to import a function instead of using a built-in +one, but otherwise the overall transformation should not feel foreign to +you. + +But you should aim for only supporting Python 2.7. Python 2.6 is no +longer freely supported and thus is not receiving bugfixes. This means +`you' will have to work around any issues you come across with Python +2.6. There are also some tools mentioned in this HOWTO which do not +support Python 2.6 (e.g., Pylint(2)), and this will become more +commonplace as time goes on. It will simply be easier for you if you +only support the versions of Python that you have to support. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/six + + (2) https://pypi.org/project/pylint + + +File: python.info, Node: Make sure you specify the proper version support in your setup py file, Next: Have good test coverage, Prev: Drop support for Python 2 6 and older, Up: Details + +10.1.2.2 Make sure you specify the proper version support in your ‘setup.py’ file +................................................................................. + +In your ‘setup.py’ file you should have the proper trove classifier(1) +specifying what versions of Python you support. As your project does +not support Python 3 yet you should at least have ‘Programming Language +:: Python :: 2 :: Only’ specified. Ideally you should also specify each +major/minor version of Python that you do support, e.g. ‘Programming +Language :: Python :: 2.7’. + + ---------- Footnotes ---------- + + (1) https://pypi.org/classifiers + + +File: python.info, Node: Have good test coverage, Next: Learn the differences between Python 2 & 3, Prev: Make sure you specify the proper version support in your setup py file, Up: Details + +10.1.2.3 Have good test coverage +................................ + +Once you have your code supporting the oldest version of Python 2 you +want it to, you will want to make sure your test suite has good +coverage. A good rule of thumb is that if you want to be confident +enough in your test suite that any failures that appear after having +tools rewrite your code are actual bugs in the tools and not in your +code. If you want a number to aim for, try to get over 80% coverage +(and don’t feel bad if you find it hard to get better than 90% +coverage). If you don’t already have a tool to measure test coverage +then coverage.py(1) is recommended. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/coverage + + +File: python.info, Node: Learn the differences between Python 2 & 3, Next: Update your code, Prev: Have good test coverage, Up: Details + +10.1.2.4 Learn the differences between Python 2 & 3 +................................................... + +Once you have your code well-tested you are ready to begin porting your +code to Python 3! But to fully understand how your code is going to +change and what you want to look out for while you code, you will want +to learn what changes Python 3 makes in terms of Python 2. Typically +the two best ways of doing that is reading the *note “What’s New”: 155. +doc for each release of Python 3 and the Porting to Python 3(1) book +(which is free online). There is also a handy cheat sheet(2) from the +Python-Future project. + + ---------- Footnotes ---------- + + (1) http://python3porting.com/ + + (2) https://python-future.org/compatible_idioms.html + + +File: python.info, Node: Update your code, Next: Prevent compatibility regressions, Prev: Learn the differences between Python 2 & 3, Up: Details + +10.1.2.5 Update your code +......................... + +Once you feel like you know what is different in Python 3 compared to +Python 2, it’s time to update your code! You have a choice between two +tools in porting your code automatically: Futurize(1) and Modernize(2). +Which tool you choose will depend on how much like Python 3 you want +your code to be. Futurize(3) does its best to make Python 3 idioms and +practices exist in Python 2, e.g. backporting the ‘bytes’ type from +Python 3 so that you have semantic parity between the major versions of +Python. Modernize(4), on the other hand, is more conservative and +targets a Python 2/3 subset of Python, directly relying on six(5) to +help provide compatibility. As Python 3 is the future, it might be best +to consider Futurize to begin adjusting to any new practices that Python +3 introduces which you are not accustomed to yet. + +Regardless of which tool you choose, they will update your code to run +under Python 3 while staying compatible with the version of Python 2 you +started with. Depending on how conservative you want to be, you may +want to run the tool over your test suite first and visually inspect the +diff to make sure the transformation is accurate. After you have +transformed your test suite and verified that all the tests still pass +as expected, then you can transform your application code knowing that +any tests which fail is a translation failure. + +Unfortunately the tools can’t automate everything to make your code work +under Python 3 and so there are a handful of things you will need to +update manually to get full Python 3 support (which of these steps are +necessary vary between the tools). Read the documentation for the tool +you choose to use to see what it fixes by default and what it can do +optionally to know what will (not) be fixed for you and what you may +have to fix on your own (e.g. using ‘io.open()’ over the built-in +‘open()’ function is off by default in Modernize). Luckily, though, +there are only a couple of things to watch out for which can be +considered large issues that may be hard to debug if not watched for. + +* Menu: + +* Division:: +* Text versus binary data:: +* Use feature detection instead of version detection:: + + ---------- Footnotes ---------- + + (1) https://python-future.org/automatic_conversion.html + + (2) https://python-modernize.readthedocs.io/ + + (3) https://python-future.org/automatic_conversion.html + + (4) https://python-modernize.readthedocs.io/ + + (5) https://pypi.org/project/six + + +File: python.info, Node: Division, Next: Text versus binary data, Up: Update your code + +10.1.2.6 Division +................. + +In Python 3, ‘5 / 2 == 2.5’ and not ‘2’; all division between ‘int’ +values result in a ‘float’. This change has actually been planned since +Python 2.2 which was released in 2002. Since then users have been +encouraged to add ‘from __future__ import division’ to any and all files +which use the ‘/’ and ‘//’ operators or to be running the interpreter +with the ‘-Q’ flag. If you have not been doing this then you will need +to go through your code and do two things: + + 1. Add ‘from __future__ import division’ to your files + + 2. Update any division operator as necessary to either use ‘//’ to use + floor division or continue using ‘/’ and expect a float + +The reason that ‘/’ isn’t simply translated to ‘//’ automatically is +that if an object defines a ‘__truediv__’ method but not ‘__floordiv__’ +then your code would begin to fail (e.g. a user-defined class that uses +‘/’ to signify some operation but not ‘//’ for the same thing or at +all). + + +File: python.info, Node: Text versus binary data, Next: Use feature detection instead of version detection, Prev: Division, Up: Update your code + +10.1.2.7 Text versus binary data +................................ + +In Python 2 you could use the ‘str’ type for both text and binary data. +Unfortunately this confluence of two different concepts could lead to +brittle code which sometimes worked for either kind of data, sometimes +not. It also could lead to confusing APIs if people didn’t explicitly +state that something that accepted ‘str’ accepted either text or binary +data instead of one specific type. This complicated the situation +especially for anyone supporting multiple languages as APIs wouldn’t +bother explicitly supporting ‘unicode’ when they claimed text data +support. + +To make the distinction between text and binary data clearer and more +pronounced, Python 3 did what most languages created in the age of the +internet have done and made text and binary data distinct types that +cannot blindly be mixed together (Python predates widespread access to +the internet). For any code that deals only with text or only binary +data, this separation doesn’t pose an issue. But for code that has to +deal with both, it does mean you might have to now care about when you +are using text compared to binary data, which is why this cannot be +entirely automated. + +To start, you will need to decide which APIs take text and which take +binary (it is `highly' recommended you don’t design APIs that can take +both due to the difficulty of keeping the code working; as stated +earlier it is difficult to do well). In Python 2 this means making sure +the APIs that take text can work with ‘unicode’ and those that work with +binary data work with the ‘bytes’ type from Python 3 (which is a subset +of ‘str’ in Python 2 and acts as an alias for ‘bytes’ type in Python 2). +Usually the biggest issue is realizing which methods exist on which +types in Python 2 & 3 simultaneously (for text that’s ‘unicode’ in +Python 2 and ‘str’ in Python 3, for binary that’s ‘str’/‘bytes’ in +Python 2 and ‘bytes’ in Python 3). The following table lists the +`unique' methods of each data type across Python 2 & 3 (e.g., the +‘decode()’ method is usable on the equivalent binary data type in either +Python 2 or 3, but it can’t be used by the textual data type +consistently between Python 2 and 3 because ‘str’ in Python 3 doesn’t +have the method). Do note that as of Python 3.5 the ‘__mod__’ method +was added to the bytes type. + +`Text data' `Binary data' + + + decode + + +encode + +format + +isdecimal + +isnumeric + +Making the distinction easier to handle can be accomplished by encoding +and decoding between binary data and text at the edge of your code. +This means that when you receive text in binary data, you should +immediately decode it. And if your code needs to send text as binary +data then encode it as late as possible. This allows your code to work +with only text internally and thus eliminates having to keep track of +what type of data you are working with. + +The next issue is making sure you know whether the string literals in +your code represent text or binary data. You should add a ‘b’ prefix to +any literal that presents binary data. For text you should add a ‘u’ +prefix to the text literal. (there is a *note __future__: 0. import to +force all unspecified literals to be Unicode, but usage has shown it +isn’t as effective as adding a ‘b’ or ‘u’ prefix to all literals +explicitly) + +As part of this dichotomy you also need to be careful about opening +files. Unless you have been working on Windows, there is a chance you +have not always bothered to add the ‘b’ mode when opening a binary file +(e.g., ‘rb’ for binary reading). Under Python 3, binary files and text +files are clearly distinct and mutually incompatible; see the *note io: +9f. module for details. Therefore, you `must' make a decision of +whether a file will be used for binary access (allowing binary data to +be read and/or written) or textual access (allowing text data to be read +and/or written). You should also use *note io.open(): 30c. for opening +files instead of the built-in *note open(): 30b. function as the *note +io: 9f. module is consistent from Python 2 to 3 while the built-in *note +open(): 30b. function is not (in Python 3 it’s actually *note io.open(): +30c.). Do not bother with the outdated practice of using *note +codecs.open(): 30d. as that’s only necessary for keeping compatibility +with Python 2.5. + +The constructors of both ‘str’ and ‘bytes’ have different semantics for +the same arguments between Python 2 & 3. Passing an integer to ‘bytes’ +in Python 2 will give you the string representation of the integer: +‘bytes(3) == '3'’. But in Python 3, an integer argument to ‘bytes’ will +give you a bytes object as long as the integer specified, filled with +null bytes: ‘bytes(3) == b'\x00\x00\x00'’. A similar worry is necessary +when passing a bytes object to ‘str’. In Python 2 you just get the +bytes object back: ‘str(b'3') == b'3'’. But in Python 3 you get the +string representation of the bytes object: ‘str(b'3') == "b'3'"’. + +Finally, the indexing of binary data requires careful handling (slicing +does `not' require any special handling). In Python 2, ‘b'123'[1] == +b'2'’ while in Python 3 ‘b'123'[1] == 50’. Because binary data is +simply a collection of binary numbers, Python 3 returns the integer +value for the byte you index on. But in Python 2 because ‘bytes == +str’, indexing returns a one-item slice of bytes. The six(1) project +has a function named ‘six.indexbytes()’ which will return an integer +like in Python 3: ‘six.indexbytes(b'123', 1)’. + +To summarize: + + 1. Decide which of your APIs take text and which take binary data + + 2. Make sure that your code that works with text also works with + ‘unicode’ and code for binary data works with ‘bytes’ in Python 2 + (see the table above for what methods you cannot use for each type) + + 3. Mark all binary literals with a ‘b’ prefix, textual literals with a + ‘u’ prefix + + 4. Decode binary data to text as soon as possible, encode text as + binary data as late as possible + + 5. Open files using *note io.open(): 30c. and make sure to specify the + ‘b’ mode when appropriate + + 6. Be careful when indexing into binary data + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/six + + +File: python.info, Node: Use feature detection instead of version detection, Prev: Text versus binary data, Up: Update your code + +10.1.2.8 Use feature detection instead of version detection +........................................................... + +Inevitably you will have code that has to choose what to do based on +what version of Python is running. The best way to do this is with +feature detection of whether the version of Python you’re running under +supports what you need. If for some reason that doesn’t work then you +should make the version check be against Python 2 and not Python 3. To +help explain this, let’s look at an example. + +Let’s pretend that you need access to a feature of *note importlib: 97. +that is available in Python’s standard library since Python 3.3 and +available for Python 2 through importlib2(1) on PyPI. You might be +tempted to write code to access e.g. the *note importlib.abc: 98. +module by doing the following: + + import sys + + if sys.version_info[0] == 3: + from importlib import abc + else: + from importlib2 import abc + +The problem with this code is what happens when Python 4 comes out? It +would be better to treat Python 2 as the exceptional case instead of +Python 3 and assume that future Python versions will be more compatible +with Python 3 than Python 2: + + import sys + + if sys.version_info[0] > 2: + from importlib import abc + else: + from importlib2 import abc + +The best solution, though, is to do no version detection at all and +instead rely on feature detection. That avoids any potential issues of +getting the version detection wrong and helps keep you +future-compatible: + + try: + from importlib import abc + except ImportError: + from importlib2 import abc + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/importlib2 + + +File: python.info, Node: Prevent compatibility regressions, Next: Check which dependencies block your transition, Prev: Update your code, Up: Details + +10.1.2.9 Prevent compatibility regressions +.......................................... + +Once you have fully translated your code to be compatible with Python 3, +you will want to make sure your code doesn’t regress and stop working +under Python 3. This is especially true if you have a dependency which +is blocking you from actually running under Python 3 at the moment. + +To help with staying compatible, any new modules you create should have +at least the following block of code at the top of it: + + from __future__ import absolute_import + from __future__ import division + from __future__ import print_function + +You can also run Python 2 with the ‘-3’ flag to be warned about various +compatibility issues your code triggers during execution. If you turn +warnings into errors with ‘-Werror’ then you can make sure that you +don’t accidentally miss a warning. + +You can also use the Pylint(1) project and its ‘--py3k’ flag to lint +your code to receive warnings when your code begins to deviate from +Python 3 compatibility. This also prevents you from having to run +Modernize(2) or Futurize(3) over your code regularly to catch +compatibility regressions. This does require you only support Python +2.7 and Python 3.4 or newer as that is Pylint’s minimum Python version +support. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/pylint + + (2) https://python-modernize.readthedocs.io/ + + (3) https://python-future.org/automatic_conversion.html + + +File: python.info, Node: Check which dependencies block your transition, Next: Update your setup py file to denote Python 3 compatibility, Prev: Prevent compatibility regressions, Up: Details + +10.1.2.10 Check which dependencies block your transition +........................................................ + +`After' you have made your code compatible with Python 3 you should +begin to care about whether your dependencies have also been ported. +The caniusepython3(1) project was created to help you determine which +projects – directly or indirectly – are blocking you from supporting +Python 3. There is both a command-line tool as well as a web interface +at ‘https://caniusepython3.com’. + +The project also provides code which you can integrate into your test +suite so that you will have a failing test when you no longer have +dependencies blocking you from using Python 3. This allows you to avoid +having to manually check your dependencies and to be notified quickly +when you can start running on Python 3. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/caniusepython3 + + +File: python.info, Node: Update your setup py file to denote Python 3 compatibility, Next: Use continuous integration to stay compatible, Prev: Check which dependencies block your transition, Up: Details + +10.1.2.11 Update your ‘setup.py’ file to denote Python 3 compatibility +...................................................................... + +Once your code works under Python 3, you should update the classifiers +in your ‘setup.py’ to contain ‘Programming Language :: Python :: 3’ and +to not specify sole Python 2 support. This will tell anyone using your +code that you support Python 2 `and' 3. Ideally you will also want to +add classifiers for each major/minor version of Python you now support. + + +File: python.info, Node: Use continuous integration to stay compatible, Next: Consider using optional static type checking, Prev: Update your setup py file to denote Python 3 compatibility, Up: Details + +10.1.2.12 Use continuous integration to stay compatible +....................................................... + +Once you are able to fully run under Python 3 you will want to make sure +your code always works under both Python 2 & 3. Probably the best tool +for running your tests under multiple Python interpreters is tox(1). +You can then integrate tox with your continuous integration system so +that you never accidentally break Python 2 or 3 support. + +You may also want to use the ‘-bb’ flag with the Python 3 interpreter to +trigger an exception when you are comparing bytes to strings or bytes to +an int (the latter is available starting in Python 3.5). By default +type-differing comparisons simply return ‘False’, but if you made a +mistake in your separation of text/binary data handling or indexing on +bytes you wouldn’t easily find the mistake. This flag will raise an +exception when these kinds of comparisons occur, making the mistake much +easier to track down. + +And that’s mostly it! At this point your code base is compatible with +both Python 2 and 3 simultaneously. Your testing will also be set up so +that you don’t accidentally break Python 2 or 3 compatibility regardless +of which version you typically run your tests under while developing. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/tox + + +File: python.info, Node: Consider using optional static type checking, Prev: Use continuous integration to stay compatible, Up: Details + +10.1.2.13 Consider using optional static type checking +...................................................... + +Another way to help port your code is to use a static type checker like +mypy(1) or pytype(2) on your code. These tools can be used to analyze +your code as if it’s being run under Python 2, then you can run the tool +a second time as if your code is running under Python 3. By running a +static type checker twice like this you can discover if you’re e.g. +misusing binary data type in one version of Python compared to another. +If you add optional type hints to your code you can also explicitly +state whether your APIs use textual or binary data, helping to make sure +everything functions as expected in both versions of Python. + + ---------- Footnotes ---------- + + (1) http://mypy-lang.org/ + + (2) https://github.com/google/pytype + + +File: python.info, Node: Porting Extension Modules to Python 3, Next: Curses Programming with Python, Prev: Porting Python 2 Code to Python 3, Up: Python HOWTOs + +10.2 Porting Extension Modules to Python 3 +========================================== + +We recommend the following resources for porting extension modules to +Python 3: + + * The Migrating C extensions(1) 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. + + * The Porting guide(2) from the `py3c' project provides opinionated + suggestions with supporting code. + + * The Cython(3) and CFFI(4) libraries offer abstractions over + 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. + + ---------- Footnotes ---------- + + (1) http://python3porting.com/cextensions.html + + (2) https://py3c.readthedocs.io/en/latest/guide.html + + (3) https://cython.org/ + + (4) https://cffi.readthedocs.io/en/latest/ + + +File: python.info, Node: Curses Programming with Python, Next: Descriptor HowTo Guide, Prev: Porting Extension Modules to Python 3, Up: Python HOWTOs + +10.3 Curses Programming with Python +=================================== + + +Author: A.M. Kuchling, Eric S. Raymond + + +Release: 2.04 + +Abstract +........ + +This document describes how to use the *note curses: 2a. 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:: + + +File: python.info, Node: What is curses?, Next: Starting and ending a curses application, Up: Curses Programming with Python + +10.3.1 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(1). + +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 *note curses: 2a. +module. A ported version called UniCurses(2) is available. + +* Menu: + +* The Python curses module:: + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/urwid/ + + (2) https://pypi.org/project/UniCurses + + +File: python.info, Node: The Python curses module, Up: What is curses? + +10.3.1.1 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 ‘addstr()’, ‘mvaddstr()’, and +‘mvwaddstr()’ into a single *note addstr(): 276f. 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. + + +File: python.info, Node: Starting and ending a curses application, Next: Windows and Pads, Prev: What is curses?, Up: Curses Programming with Python + +10.3.2 Starting and ending a curses application +----------------------------------------------- + +Before doing anything, curses must be initialized. This is done by +calling the *note initscr(): 2775. function, which will determine the +terminal type, send any required setup codes to the terminal, and create +various internal data structures. If successful, ‘initscr()’ returns a +window object representing the entire screen; this is usually called +‘stdscr’ after the name of the corresponding C variable. + + import curses + stdscr = curses.initscr() + +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 *note noecho(): 2792. +function. + + curses.noecho() + +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. + + curses.cbreak() + +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 ‘curses.KEY_LEFT’. To get curses to +do the job, you’ll have to enable keypad mode. + + stdscr.keypad(True) + +Terminating a curses application is much easier than starting one. +You’ll need to call: + + curses.nocbreak() + stdscr.keypad(False) + curses.echo() + +to reverse the curses-friendly terminal settings. Then call the *note +endwin(): 2772. function to restore the terminal to its original +operating mode. + + curses.endwin() + +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 *note curses.wrapper(): 6d2. function and using +it like this: + + 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) + +The *note wrapper(): 6d2. function takes a callable object and does the +initializations described above, also initializing colors if color +support is present. ‘wrapper()’ then runs your provided callable. Once +the callable returns, ‘wrapper()’ will restore the original state of the +terminal. The callable is called inside a *note try: 1073.…*note +except: 17a. 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. + + +File: python.info, Node: Windows and Pads, Next: Displaying Text, Prev: Starting and ending a curses application, Up: Curses Programming with Python + +10.3.3 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 ‘stdscr’ object returned by the *note initscr(): 2775. 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 *note +newwin(): 2790. function creates a new window of a given size, returning +the new window object. + + begin_x = 20; begin_y = 7 + height = 5; width = 40 + win = curses.newwin(height, width, begin_y, begin_x) + +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 +‘curses.LINES’ and ‘curses.COLS’ variables to obtain the `y' and `x' +sizes. Legal coordinates will then extend from ‘(0,0)’ to +‘(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 *note +refresh(): 2770. 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 ‘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 ‘stdscr.refresh()’ or the ‘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. + + 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) + +The ‘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. ‘refresh()’ actually does two +things: + + 1. Calls the *note noutrefresh(): 276e. method of each window to + update an underlying data structure representing the desired state + of the screen. + + 2. Calls the function *note doupdate(): 276d. function to change the + physical screen to match the desired state recorded in the data + structure. + +Instead you can call ‘noutrefresh()’ on a number of windows to update +the data structure, and then call ‘doupdate()’ to update the screen. + + +File: python.info, Node: Displaying Text, Next: User Input, Prev: Windows and Pads, Up: Curses Programming with Python + +10.3.4 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, ‘addstr()’ +displays a string at the current cursor location in the ‘stdscr’ window, +while ‘mvaddstr()’ moves to a given y,x coordinate first before +displaying the string. ‘waddstr()’ is just like ‘addstr()’, but allows +specifying a window to use instead of using ‘stdscr’ by default. +‘mvwaddstr()’ allows specifying both a window and a coordinate. + +Fortunately the Python interface hides all these details. ‘stdscr’ is a +window object like any other, and methods such as *note addstr(): 276f. +accept multiple argument forms. Usually there are four different forms. + +Form Description + +------------------------------------------------------------------------------------------ + +`str' or `ch' Display the string `str' or character `ch' at the + current position + + +`str' or `ch', `attr' Display the string `str' or character `ch', using + attribute `attr' at the current position + + +`y', `x', `str' or `ch' Move to position `y,x' within the window, and + display `str' or `ch' + + +`y', `x', `str' or `ch', `attr' Move to position `y,x' within the window, and + display `str' or `ch', using attribute `attr' + + +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 *note addstr(): 276f. 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 ‘encoding’ attribute; this defaults to the default system +encoding as returned by *note locale.getencoding(): 228. + +The *note addch(): 27aa. 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, ‘ACS_PLMINUS’ is a +/- symbol, +and ‘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 ‘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 +‘curs_set(False)’ to make it invisible. For compatibility with older +curses versions, there’s a ‘leaveok(bool)’ function that’s a synonym for +*note curs_set(): 2767. 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:: + + +File: python.info, Node: Attributes and Color, Up: Displaying Text + +10.3.4.1 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. + +Attribute Description + +---------------------------------------------------------------------- + +‘A_BLINK’ Blinking text + + +‘A_BOLD’ Extra bright or bold text + + +‘A_DIM’ Half bright text + + +‘A_REVERSE’ Reverse-video text + + +‘A_STANDOUT’ The best highlighting mode available + + +‘A_UNDERLINE’ Underlined text + + +So, to display a reverse-video status line on the top line of the +screen, you could code: + + stdscr.addstr(0, 0, "Current mode: Typing mode", + curses.A_REVERSE) + stdscr.refresh() + +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 *note start_color(): 279d. function soon +after calling *note initscr(): 2775, to initialize the default color set +(the *note curses.wrapper(): 6d2. function does this automatically). +Once that’s done, the *note has_colors(): 277d. 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 *note +color_pair(): 2765. function; this can be bitwise-OR’ed with other +attributes such as ‘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: + + stdscr.addstr("Pretty text", curses.color_pair(1)) + stdscr.refresh() + +As I said before, a color pair consists of a foreground and background +color. The ‘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 ‘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 *note curses: 2a. module +defines named constants for each of these colors: ‘curses.COLOR_BLACK’, +‘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: + + curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) + +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: + + stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1)) + +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 *note can_change_color(): 2762, which returns ‘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. + + +File: python.info, Node: User Input, Next: For More Information, Prev: Displaying Text, Up: Curses Programming with Python + +10.3.5 User Input +----------------- + +The C curses library offers only very simple input mechanisms. Python’s +*note curses: 2a. module adds a basic text-input widget. (Other +libraries such as Urwid(1) have more extensive collections of widgets.) + +There are two methods for getting input from a window: + + * *note getch(): 2779. refreshes the screen and then waits for the + user to hit a key, displaying the key if *note echo(): 2771. has + been called earlier. You can optionally specify a coordinate to + which the cursor should be moved before pausing. + + * *note getkey(): 27c2. 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 ‘KEY_UP’ or ‘^G’. + +It’s possible to not wait for the user using the *note nodelay(): 27d8. +window method. After ‘nodelay(True)’, ‘getch()’ and ‘getkey()’ for the +window become non-blocking. To signal that no input is ready, ‘getch()’ +returns ‘curses.ERR’ (a value of -1) and ‘getkey()’ raises an exception. +There’s also a *note halfdelay(): 2781. function, which can be used to +(in effect) set a timer on each ‘getch()’; if no input becomes available +within a specified delay (measured in tenths of a second), curses raises +an exception. + +The ‘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 ‘curses.KEY_PPAGE’, +‘curses.KEY_HOME’, or ‘curses.KEY_LEFT’. The main loop of your program +may look something like this: + + 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 + +The *note curses.ascii: 2b. 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, +*note curses.ascii.ctrl(): 280c. returns the control character +corresponding to its argument. + +There’s also a method to retrieve an entire string, *note getstr(): +27c5. 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. + + curses.echo() # Enable echoing of characters + + # Get a 15-character string, with the cursor on the top line + s = stdscr.getstr(0,0, 15) + +The *note curses.textpad: 2d. module supplies a text box that supports +an Emacs-like set of keybindings. Various methods of the *note Textbox: +27f2. class support editing with input validation and gathering the edit +results either with or without trailing spaces. Here’s an 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() + +See the library documentation on *note curses.textpad: 2d. for more +details. + + ---------- Footnotes ---------- + + (1) https://pypi.org/project/urwid/ + + +File: python.info, Node: For More Information, Prev: User Input, Up: Curses Programming with Python + +10.3.6 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 *note curses: 2a. 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 ‘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(1) +to learn more about submitting patches to Python. + + * Writing Programs with NCURSES(2): a lengthy tutorial for C + programmers. + + * The ncurses man page(3) + + * The ncurses FAQ(4) + + * "Use curses... don’t swear"(5): video of a PyCon 2013 talk on + controlling terminals using curses or Urwid. + + * "Console Applications with Urwid"(6): video of a PyCon CA 2012 talk + demonstrating some applications written using Urwid. + + ---------- Footnotes ---------- + + (1) https://devguide.python.org/ + + (2) https://invisible-island.net/ncurses/ncurses-intro.html + + (3) https://linux.die.net/man/3/ncurses + + (4) https://invisible-island.net/ncurses/ncurses.faq.html + + (5) https://www.youtube.com/watch?v=eN1eZtjLEnU + + (6) https://pyvideo.org/video/1568/console-applications-with-urwid + + +File: python.info, Node: Descriptor HowTo Guide, Next: Enum HOWTO, Prev: Curses Programming with Python, Up: Python HOWTOs + +10.4 Descriptor HowTo Guide +=========================== + + +Author: Raymond Hettinger + + +Contact: + +*note Descriptors: 1924. let objects customize attribute lookup, +storage, and deletion. + +This guide has four major sections: + + 1. 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. + + 2. The second section shows a complete, practical descriptor example. + If you already know the basics, start there. + + 3. 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. + + 4. 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 *note classmethod(): 18d, *note + staticmethod(): 3c8, *note property(): 205, and *note __slots__: + 1ac. + +* Menu: + +* Primer:: +* Complete Practical Example:: +* Technical Tutorial:: +* Pure Python Equivalents:: + + +File: python.info, Node: Primer, Next: Complete Practical Example, Up: Descriptor HowTo Guide + +10.4.1 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:: + + +File: python.info, Node: Simple example A descriptor that returns a constant, Next: Dynamic lookups, Up: Primer + +10.4.1.1 Simple example: A descriptor that returns a constant +............................................................. + +The ‘Ten’ class is a descriptor whose ‘__get__()’ method always returns +the constant ‘10’: + + class Ten: + def __get__(self, obj, objtype=None): + return 10 + +To use the descriptor, it must be stored as a class variable in another +class: + + class A: + x = 5 # Regular class attribute + y = Ten() # Descriptor instance + +An interactive session shows the difference between normal attribute +lookup and descriptor lookup: + + >>> a = A() # Make an instance of class A + >>> a.x # Normal attribute lookup + 5 + >>> a.y # Descriptor lookup + 10 + +In the ‘a.x’ attribute lookup, the dot operator finds ‘'x': 5’ in the +class dictionary. In the ‘a.y’ lookup, the dot operator finds a +descriptor instance, recognized by its ‘__get__’ method. Calling that +method returns ‘10’. + +Note that the value ‘10’ is not stored in either the class dictionary or +the instance dictionary. Instead, the value ‘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. + + +File: python.info, Node: Dynamic lookups, Next: Managed attributes, Prev: Simple example A descriptor that returns a constant, Up: Primer + +10.4.1.2 Dynamic lookups +........................ + +Interesting descriptors typically run computations instead of returning +constants: + + 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 + +An interactive session shows that the lookup is dynamic — it computes +different, updated answers each time: + + >>> 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 + +Besides showing how descriptors can run computations, this example also +reveals the purpose of the parameters to ‘__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 ‘__get__()’ method learn the target +directory. The `objtype' parameter is the class `Directory'. + + +File: python.info, Node: Managed attributes, Next: Customized names, Prev: Dynamic lookups, Up: Primer + +10.4.1.3 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 ‘__get__()’ and ‘__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: + + 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__() + +An interactive session shows that all access to the managed attribute +`age' is logged, but that the regular attribute `name' is not logged: + + >>> 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 + +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. + + +File: python.info, Node: Customized names, Next: Closing thoughts, Prev: Managed attributes, Up: Primer + +10.4.1.4 Customized names +......................... + +When a class uses descriptors, it can inform each descriptor about which +variable name was used. + +In this example, the ‘Person’ class has two descriptor instances, `name' +and `age'. When the ‘Person’ class is defined, it makes a callback to +‘__set_name__()’ in `LoggedAccess' so that the field names can be +recorded, giving each descriptor its own `public_name' and +`private_name': + + 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 + +An interactive session shows that the ‘Person’ class has called +‘__set_name__()’ so that the field names would be recorded. Here we +call *note vars(): 1480. to look up the descriptor without triggering +it: + + >>> vars(vars(Person)['name']) + {'public_name': 'name', 'private_name': '_name'} + >>> vars(vars(Person)['age']) + {'public_name': 'age', 'private_name': '_age'} + +The new class now logs access to both `name' and `age': + + >>> 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 + +The two `Person' instances contain only the private names: + + >>> vars(pete) + {'_name': 'Peter P', '_age': 10} + >>> vars(kate) + {'_name': 'Catherine C', '_age': 20} + + +File: python.info, Node: Closing thoughts, Prev: Customized names, Up: Primer + +10.4.1.5 Closing thoughts +......................... + +A *note descriptor: 1924. is what we call any object that defines +‘__get__()’, ‘__set__()’, or ‘__delete__()’. + +Optionally, descriptors can have a ‘__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 +‘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 *note classmethod(): 18d, *note +staticmethod(): 3c8, *note property(): 205, and *note +functools.cached_property(): 633. are all implemented as descriptors. + + +File: python.info, Node: Complete Practical Example, Next: Technical Tutorial, Prev: Primer, Up: Descriptor HowTo Guide + +10.4.2 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:: + + +File: python.info, Node: Validator class, Next: Custom validators, Up: Complete Practical Example + +10.4.2.1 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 ‘Validator’ class is both an *note abstract base class: e6a. and a +managed attribute descriptor: + + 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 + +Custom validators need to inherit from ‘Validator’ and must supply a +‘validate()’ method to test various restrictions as needed. + + +File: python.info, Node: Custom validators, Next: Practical application, Prev: Validator class, Up: Complete Practical Example + +10.4.2.2 Custom validators +.......................... + +Here are three practical data validation utilities: + + 1. ‘OneOf’ verifies that a value is one of a restricted set of + options. + + 2. ‘Number’ verifies that a value is either an *note int: 1c7. or + *note float: 3ca. Optionally, it verifies that a value is between + a given minimum or maximum. + + 3. ‘String’ verifies that a value is a *note str: 1b3. Optionally, it + validates a given minimum or maximum length. It can validate a + user-defined predicate(1) as well. + + 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 an 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}' + ) + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Predicate_(mathematical_logic) + + +File: python.info, Node: Practical application, Prev: Custom validators, Up: Complete Practical Example + +10.4.2.3 Practical application +.............................. + +Here’s how the data validators can be used in a real class: + + 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 + +The descriptors prevent invalid instances from being created: + + >>> Component('Widget', 'metal', 5) # Blocked: 'Widget' is not all uppercase + Traceback (most recent call last): + ... + ValueError: Expected 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 + + +File: python.info, Node: Technical Tutorial, Next: Pure Python Equivalents, Prev: Complete Practical Example, Up: Descriptor HowTo Guide + +10.4.3 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:: + + +File: python.info, Node: Abstract, Next: Definition and introduction, Up: Technical Tutorial + +10.4.3.1 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. + + +File: python.info, Node: Definition and introduction, Next: Descriptor protocol, Prev: Abstract, Up: Technical Tutorial + +10.4.3.2 Definition and introduction +.................................... + +In general, a descriptor is an attribute value that has one of the +methods in the descriptor protocol. Those methods are ‘__get__()’, +‘__set__()’, and ‘__delete__()’. If any of those methods are defined +for an attribute, it is said to be a *note descriptor: 1924. + +The default behavior for attribute access is to get, set, or delete the +attribute from an object’s dictionary. For instance, ‘a.x’ has a lookup +chain starting with ‘a.__dict__['x']’, then ‘type(a).__dict__['x']’, and +continuing through the method resolution order of ‘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 +*note super(): 8b7. They are used throughout Python itself. +Descriptors simplify the underlying C code and offer a flexible set of +new tools for everyday Python programs. + + +File: python.info, Node: Descriptor protocol, Next: Overview of descriptor invocation, Prev: Definition and introduction, Up: Technical Tutorial + +10.4.3.3 Descriptor protocol +............................ + +‘descr.__get__(self, obj, type=None) -> value’ + +‘descr.__set__(self, obj, value) -> None’ + +‘descr.__delete__(self, obj) -> None’ + +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 ‘__set__()’ or ‘__delete__()’, it is considered a +data descriptor. Descriptors that only define ‘__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 ‘__get__()’ and +‘__set__()’ with the ‘__set__()’ raising an *note AttributeError: 19d. +when called. Defining the ‘__set__()’ method with an exception raising +placeholder is enough to make it a data descriptor. + + +File: python.info, Node: Overview of descriptor invocation, Next: Invocation from an instance, Prev: Descriptor protocol, Up: Technical Tutorial + +10.4.3.4 Overview of descriptor invocation +.......................................... + +A descriptor can be called directly with ‘desc.__get__(obj)’ or +‘desc.__get__(None, cls)’. + +But it is more common for a descriptor to be invoked automatically from +attribute access. + +The expression ‘obj.x’ looks up the attribute ‘x’ in the chain of +namespaces for ‘obj’. If the search finds a descriptor outside of the +instance ‘__dict__’, its ‘__get__()’ method is invoked according to the +precedence rules listed below. + +The details of invocation depend on whether ‘obj’ is an object, class, +or instance of super. + + +File: python.info, Node: Invocation from an instance, Next: Invocation from a class, Prev: Overview of descriptor invocation, Up: Technical Tutorial + +10.4.3.5 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 ‘__getattr__()’ +if it is provided. + +If a descriptor is found for ‘a.x’, then it is invoked with: +‘desc.__get__(a, type(a))’. + +The logic for a dotted lookup is in *note object.__getattribute__(): +839. Here is a pure Python equivalent: + + 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) + +Note, there is no ‘__getattr__()’ hook in the ‘__getattribute__()’ code. +That is why calling ‘__getattribute__()’ directly or with +‘super().__getattribute__’ will bypass ‘__getattr__()’ entirely. + +Instead, it is the dot operator and the *note getattr(): 837. function +that are responsible for invoking ‘__getattr__()’ whenever +‘__getattribute__()’ raises an *note AttributeError: 19d. Their logic +is encapsulated in a helper function: + + 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__ + + +File: python.info, Node: Invocation from a class, Next: Invocation from super, Prev: Invocation from an instance, Up: Technical Tutorial + +10.4.3.6 Invocation from a class +................................ + +The logic for a dotted lookup such as ‘A.x’ is in +‘type.__getattribute__()’. The steps are similar to those for *note +object.__getattribute__(): 839. but the instance dictionary lookup is +replaced by a search through the class’s *note method resolution order: +1bc9. + +If a descriptor is found, it is invoked with ‘desc.__get__(None, A)’. + +The full C implementation can be found in ‘type_getattro()’ and +‘_PyType_Lookup()’ in Objects/typeobject.c(1). + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Objects/typeobject.c + + +File: python.info, Node: Invocation from super, Next: Summary of invocation logic, Prev: Invocation from a class, Up: Technical Tutorial + +10.4.3.7 Invocation from super +.............................. + +The logic for super’s dotted lookup is in the ‘__getattribute__()’ +method for object returned by *note super(): 8b7. + +A dotted lookup such as ‘super(A, obj).m’ searches +‘obj.__class__.__mro__’ for the base class ‘B’ immediately following ‘A’ +and then returns ‘B.__dict__['m'].__get__(obj, A)’. If not a +descriptor, ‘m’ is returned unchanged. + +The full C implementation can be found in ‘super_getattro()’ in +Objects/typeobject.c(1). A pure Python equivalent can be found in +Guido’s Tutorial(2). + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Objects/typeobject.c + + (2) +https://www.python.org/download/releases/2.2.3/descrintro/#cooperation + + +File: python.info, Node: Summary of invocation logic, Next: Automatic name notification, Prev: Invocation from super, Up: Technical Tutorial + +10.4.3.8 Summary of invocation logic +.................................... + +The mechanism for descriptors is embedded in the ‘__getattribute__()’ +methods for *note object: 6df, *note type: 9c2, and *note super(): 8b7. + +The important points to remember are: + + * Descriptors are invoked by the ‘__getattribute__()’ method. + + * Classes inherit this machinery from *note object: 6df, *note type: + 9c2, or *note super(): 8b7. + + * Overriding ‘__getattribute__()’ prevents automatic descriptor calls + because all the descriptor logic is in that method. + + * *note object.__getattribute__(): 839. and ‘type.__getattribute__()’ + make different calls to ‘__get__()’. The first includes the + instance and may include the class. The second puts in ‘None’ for + the instance and always includes the class. + + * Data descriptors always override instance dictionaries. + + * Non-data descriptors may be overridden by instance dictionaries. + + +File: python.info, Node: Automatic name notification, Next: ORM example, Prev: Summary of invocation logic, Up: Technical Tutorial + +10.4.3.9 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 *note type: +9c2. metaclass scans the dictionary of the new class. If any of the +entries are descriptors and if they define ‘__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 ‘type_new()’ and ‘set_names()’ in +Objects/typeobject.c(1). + +Since the update logic is in ‘type.__new__()’, notifications only take +place at the time of class creation. If descriptors are added to the +class afterwards, ‘__set_name__()’ will need to be called manually. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Objects/typeobject.c + + +File: python.info, Node: ORM example, Prev: Automatic name notification, Up: Technical Tutorial + +10.4.3.10 ORM example +..................... + +The following code is a simplified skeleton showing how data descriptors +could be used to implement an object relational mapping(1). + +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: + + 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() + +We can use the ‘Field’ class to define models(2) that describe the +schema for each table in a database: + + 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 + +To use the models, first connect to the database: + + >>> import sqlite3 + >>> conn = sqlite3.connect('entertainment.db') + +An interactive session shows how data is retrieved from the database and +how it can be updated: + + >>> 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' + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping + + (2) https://en.wikipedia.org/wiki/Database_model + + +File: python.info, Node: Pure Python Equivalents, Prev: Technical Tutorial, Up: Descriptor HowTo Guide + +10.4.4 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__:: + + +File: python.info, Node: Properties, Next: Functions and methods, Up: Pure Python Equivalents + +10.4.4.1 Properties +................... + +Calling *note property(): 205. is a succinct way of building a data +descriptor that triggers a function call upon access to an attribute. +Its signature is: + + property(fget=None, fset=None, fdel=None, doc=None) -> property + +The documentation shows a typical use to define a managed attribute ‘x’: + + 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.") + +To see how *note property(): 205. is implemented in terms of the +descriptor protocol, here is a pure Python equivalent: + + 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 + self._name = '' + + 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(f"property '{self._name}' has no getter") + return self.fget(obj) + + def __set__(self, obj, value): + if self.fset is None: + raise AttributeError(f"property '{self._name}' has no setter") + self.fset(obj, value) + + def __delete__(self, obj): + if self.fdel is None: + raise AttributeError(f"property '{self._name}' has no deleter") + self.fdel(obj) + + def getter(self, fget): + prop = type(self)(fget, self.fset, self.fdel, self.__doc__) + prop._name = self._name + return prop + + def setter(self, fset): + prop = type(self)(self.fget, fset, self.fdel, self.__doc__) + prop._name = self._name + return prop + + def deleter(self, fdel): + prop = type(self)(self.fget, self.fset, fdel, self.__doc__) + prop._name = self._name + return prop + +The *note property(): 205. 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 ‘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: + + class Cell: + ... + + @property + def value(self): + "Recalculate the cell before returning value" + self.recalc() + return self._value + +Either the built-in *note property(): 205. or our ‘Property()’ +equivalent would work in this example. + + +File: python.info, Node: Functions and methods, Next: Kinds of methods, Prev: Properties, Up: Pure Python Equivalents + +10.4.4.2 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 *note types.MethodType: 11df. which +is roughly equivalent to: + + 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) + +To support automatic creation of methods, functions include the +‘__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: + + 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) + +Running the following class in the interpreter shows how the function +descriptor works in practice: + + class D: + def f(self, x): + return x + +The function has a *note qualified name: 134c. attribute to support +introspection: + + >>> D.f.__qualname__ + 'D.f' + +Accessing the function through the class dictionary does not invoke +‘__get__()’. Instead, it just returns the underlying function object: + + >>> D.__dict__['f'] + + +Dotted access from a class calls ‘__get__()’ which just returns the +underlying function unchanged: + + >>> D.f + + +The interesting behavior occurs during dotted access from an instance. +The dotted lookup calls ‘__get__()’ which returns a bound method object: + + >>> d = D() + >>> d.f + > + +Internally, the bound method stores the underlying function and the +bound instance: + + >>> d.f.__func__ + + + >>> d.f.__self__ + <__main__.D object at 0x1012e1f98> + +If you have ever wondered where `self' comes from in regular methods or +where `cls' comes from in class methods, this is it! + + +File: python.info, Node: Kinds of methods, Next: Static methods, Prev: Functions and methods, Up: Pure Python Equivalents + +10.4.4.3 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 ‘__get__()’ method so that they can be +converted to a method when accessed as attributes. The non-data +descriptor transforms an ‘obj.f(*args)’ call into ‘f(obj, *args)’. +Calling ‘cls.f(*args)’ becomes ‘f(*args)’. + +This chart summarizes the binding and its two most useful variants: + + Transformation Called from an object Called from a class + + ------------------------------------------------------------------------ + + function f(obj, *args) f(*args) + + + staticmethod f(*args) f(*args) + + + classmethod f(type(obj), *args) f(cls, *args) + + + +File: python.info, Node: Static methods, Next: Class methods, Prev: Kinds of methods, Up: Pure Python Equivalents + +10.4.4.4 Static methods +....................... + +Static methods return the underlying function without changes. Calling +either ‘c.f’ or ‘C.f’ is the equivalent of a direct lookup into +‘object.__getattribute__(c, "f")’ or ‘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 +‘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, ‘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: ‘s.erf(1.5) --> .9332’ or ‘Sample.erf(1.5) --> +.9332’. + +Since static methods return the underlying function with no changes, the +example calls are unexciting: + + class E: + @staticmethod + def f(x): + return x * 10 + + >>> E.f(3) + 30 + >>> E().f(3) + 30 + +Using the non-data descriptor protocol, a pure Python version of *note +staticmethod(): 3c8. would look like this: + + class StaticMethod: + "Emulate PyStaticMethod_Type() in Objects/funcobject.c" + + def __init__(self, f): + self.f = f + + def __get__(self, obj, objtype=None): + return self.f + + def __call__(self, *args, **kwds): + return self.f(*args, **kwds) + + +File: python.info, Node: Class methods, Next: Member objects and __slots__, Prev: Static methods, Up: Pure Python Equivalents + +10.4.4.5 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: + + class F: + @classmethod + def f(cls, x): + return cls.__name__, x + + >>> F.f(3) + ('F', 3) + >>> F().f(3) + ('F', 3) + +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 *note dict.fromkeys(): 1c97. creates a new +dictionary from a list of keys. The pure Python equivalent is: + + 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 + +Now a new dictionary of unique keys can be constructed like this: + + >>> d = Dict.fromkeys('abracadabra') + >>> type(d) is Dict + True + >>> d + {'a': None, 'b': None, 'r': None, 'c': None, 'd': None} + +Using the non-data descriptor protocol, a pure Python version of *note +classmethod(): 18d. would look like this: + + class ClassMethod: + "Emulate PyClassMethod_Type() in Objects/funcobject.c" + + def __init__(self, f): + self.f = f + + def __get__(self, obj, cls=None): + if cls is None: + cls = type(obj) + if hasattr(type(self.f), '__get__'): + # This code path was added in Python 3.9 + # and was deprecated in Python 3.11. + return self.f.__get__(cls, cls) + return MethodType(self.f, cls) + +The code path for ‘hasattr(type(self.f), '__get__')’ was added in Python +3.9 and makes it possible for *note classmethod(): 18d. to support +chained decorators. For example, a classmethod and property could be +chained together. In Python 3.11, this functionality was deprecated. + + class G: + @classmethod + @property + def __doc__(cls): + return f'A doc for {cls.__name__!r}' + + >>> G.__doc__ + "A doc for 'G'" + + +File: python.info, Node: Member objects and __slots__, Prev: Class methods, Up: Pure Python Equivalents + +10.4.4.6 Member objects and __slots__ +..................................... + +When a class defines ‘__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 ‘__slots__’ are allowed: + + class Vehicle: + __slots__ = ('id_number', 'make', 'model') + + >>> auto = Vehicle() + >>> auto.id_nubmer = 'VYE483814LQEX' + Traceback (most recent call last): + ... + AttributeError: 'Vehicle' object has no attribute 'id_nubmer' + +2. Helps create immutable objects where descriptors manage access to +private attributes stored in ‘__slots__’: + + 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 + + >>> 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' + +3. Saves memory. On a 64-bit Linux build, an instance with two +attributes takes 48 bytes with ‘__slots__’ and 152 bytes without. This +flyweight design pattern(1) likely only matters when a large number of +instances are going to be created. + +4. Improves speed. Reading instance variables is 35% faster with +‘__slots__’ (as measured with Python 3.10 on an Apple M1 processor). + +5. Blocks tools like *note functools.cached_property(): 633. which +require an instance dictionary to function correctly: + + 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))) + + >>> CP().pi + Traceback (most recent call last): + ... + TypeError: No '__dict__' attribute on 'CP' instance to cache 'pi' property. + +It is not possible to create an exact drop-in pure Python version of +‘__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 ‘_slotvalues’ list. Reads and writes to that private +structure are managed by member descriptors: + + null = object() + + class Member: + + def __init__(self, name, clsname, offset): + 'Emulate PyMemberDef in Include/structmember.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'' + +The ‘type.__new__()’ method takes care of adding member objects to class +variables: + + 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) + +The *note object.__new__(): 18ff. method takes care of creating +instances that have slots instead of an instance dictionary. Here is a +rough simulation in pure Python: + + 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) + +To use the simulation in a real class, just inherit from ‘Object’ and +set the *note metaclass: 193b. to ‘Type’: + + 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 + +At this point, the metaclass has loaded member objects for `x' and `y': + + >>> from pprint import pp + >>> pp(dict(vars(H))) + {'__module__': '__main__', + '__doc__': 'Instance variables stored in slots', + 'slot_names': ['x', 'y'], + '__init__': , + 'x': , + 'y': } + +When instances are created, they have a ‘slot_values’ list where the +attributes are stored: + + >>> h = H(10, 20) + >>> vars(h) + {'_slotvalues': [10, 20]} + >>> h.x = 55 + >>> vars(h) + {'_slotvalues': [55, 20]} + +Misspelled or unassigned attributes will raise an exception: + + >>> h.xz + Traceback (most recent call last): + ... + AttributeError: 'H' object has no attribute 'xz' + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Flyweight_pattern + + +File: python.info, Node: Enum HOWTO, Next: Functional Programming HOWTO, Prev: Descriptor HowTo Guide, Up: Python HOWTOs + +10.5 Enum HOWTO +=============== + +An *note Enum: 20c. is a set of symbolic names bound to unique values. +They are similar to global variables, but they offer a more useful *note +repr(): 3ee, 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: + + >>> from enum import Enum + >>> class Weekday(Enum): + ... MONDAY = 1 + ... TUESDAY = 2 + ... WEDNESDAY = 3 + ... THURSDAY = 4 + ... FRIDAY = 5 + ... SATURDAY = 6 + ... SUNDAY = 7 + +Or perhaps the RGB primary colors: + + >>> from enum import Enum + >>> class Color(Enum): + ... RED = 1 + ... GREEN = 2 + ... BLUE = 3 + +As you can see, creating an *note Enum: 20c. is as simple as writing a +class that inherits from *note Enum: 20c. itself. + + Note: Case of Enum Members + + Because Enums are used to represent constants we recommend using + UPPER_CASE names for members, and will be using that style in our + examples. + +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: + + >>> Weekday(3) + + +As you can see, the ‘repr()’ of a member shows the enum name, the member +name, and the value. The ‘str()’ of a member shows only the enum name +and member name: + + >>> print(Weekday.THURSDAY) + Weekday.THURSDAY + +The `type' of an enumeration member is the enum it belongs to: + + >>> type(Weekday.MONDAY) + + >>> isinstance(Weekday.FRIDAY, Weekday) + True + +Enum members have an attribute that contains just their ‘name’: + + >>> print(Weekday.TUESDAY.name) + TUESDAY + +Likewise, they have an attribute for their ‘value’: + + >>> Weekday.WEDNESDAY.value + 3 + +Unlike many languages that treat enumerations solely as name/value +pairs, Python Enums can have behavior added. For example, *note +datetime.date: 536. has two methods for returning the weekday: +‘weekday()’ and ‘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 ‘Weekday’ enum to extract the day +from the ‘date’ instance and return the matching enum member: + + @classmethod + def from_date(cls, date): + return cls(date.isoweekday()) + +The complete ‘Weekday’ enum now looks like this: + + >>> 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()) + +Now we can find out what today is! Observe: + + >>> from datetime import date + >>> Weekday.from_date(date.today()) + + +Of course, if you’re reading this on some other day, you’ll see that day +instead. + +This ‘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 *note list: 1e9. – we could use a +different type of *note Enum: 20c.: + + >>> from enum import Flag + >>> class Weekday(Flag): + ... MONDAY = 1 + ... TUESDAY = 2 + ... WEDNESDAY = 4 + ... THURSDAY = 8 + ... FRIDAY = 16 + ... SATURDAY = 32 + ... SUNDAY = 64 + +We’ve changed two things: we’re inherited from *note Flag: 1fe, and the +values are all powers of 2. + +Just like the original ‘Weekday’ enum above, we can have a single +selection: + + >>> first_week_day = Weekday.MONDAY + >>> first_week_day + + +But *note Flag: 1fe. also allows us to combine several members into a +single variable: + + >>> weekend = Weekday.SATURDAY | Weekday.SUNDAY + >>> weekend + + +You can even iterate over a *note Flag: 1fe. variable: + + >>> for day in weekend: + ... print(day) + Weekday.SATURDAY + Weekday.SUNDAY + +Okay, let’s get some chores set up: + + >>> chores_for_ethan = { + ... 'feed the cat': Weekday.MONDAY | Weekday.WEDNESDAY | Weekday.FRIDAY, + ... 'do the dishes': Weekday.TUESDAY | Weekday.THURSDAY, + ... 'answer SO questions': Weekday.SATURDAY, + ... } + +And a function to display the chores for a given day: + + >>> 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 + +In cases where the actual values of the members do not matter, you can +save yourself some work and use *note auto(): 90f. for the values: + + >>> from enum import auto + >>> class Weekday(Flag): + ... MONDAY = auto() + ... TUESDAY = auto() + ... WEDNESDAY = auto() + ... THURSDAY = auto() + ... FRIDAY = auto() + ... SATURDAY = auto() + ... SUNDAY = auto() + +* 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:: +* Pickling:: +* Functional API: Functional API<2>. +* Derived Enumerations:: +* When to use __new__() vs. __init__(): When to use __new__ vs __init__. +* How are Enums different?:: +* Subclassing EnumType:: + + +File: python.info, Node: Programmatic access to enumeration members and their attributes, Next: Duplicating enum members and values, Up: Enum HOWTO + +10.5.1 Programmatic access to enumeration members and their attributes +---------------------------------------------------------------------- + +Sometimes it’s useful to access members in enumerations programmatically +(i.e. situations where ‘Color.RED’ won’t do because the exact color is +not known at program-writing time). ‘Enum’ allows such access: + + >>> Color(1) + + >>> Color(3) + + +If you want to access enum members by `name', use item access: + + >>> Color['RED'] + + >>> Color['GREEN'] + + +If you have an enum member and need its ‘name’ or ‘value’: + + >>> member = Color.RED + >>> member.name + 'RED' + >>> member.value + 1 + + +File: python.info, Node: Duplicating enum members and values, Next: Ensuring unique enumeration values, Prev: Programmatic access to enumeration members and their attributes, Up: Enum HOWTO + +10.5.2 Duplicating enum members and values +------------------------------------------ + +Having two enum members with the same name is invalid: + + >>> class Shape(Enum): + ... SQUARE = 2 + ... SQUARE = 3 + ... + Traceback (most recent call last): + ... + TypeError: 'SQUARE' already defined as 2 + +However, an enum member can have other names associated with it. Given +two entries ‘A’ and ‘B’ with the same value (and ‘A’ defined first), ‘B’ +is an alias for the member ‘A’. By-value lookup of the value of ‘A’ +will return the member ‘A’. By-name lookup of ‘A’ will return the +member ‘A’. By-name lookup of ‘B’ will also return the member ‘A’: + + >>> class Shape(Enum): + ... SQUARE = 2 + ... DIAMOND = 1 + ... CIRCLE = 3 + ... ALIAS_FOR_SQUARE = 2 + ... + >>> Shape.SQUARE + + >>> Shape.ALIAS_FOR_SQUARE + + >>> Shape(2) + + + 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. + + +File: python.info, Node: Ensuring unique enumeration values, Next: Using automatic values, Prev: Duplicating enum members and values, Up: Enum HOWTO + +10.5.3 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 *note +unique(): 1ff6. decorator: + + >>> 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 : FOUR -> THREE + + +File: python.info, Node: Using automatic values, Next: Iteration<2>, Prev: Ensuring unique enumeration values, Up: Enum HOWTO + +10.5.4 Using automatic values +----------------------------- + +If the exact value is unimportant you can use *note auto: 90f.: + + >>> from enum import Enum, auto + >>> class Color(Enum): + ... RED = auto() + ... BLUE = auto() + ... GREEN = auto() + ... + >>> [member.value for member in Color] + [1, 2, 3] + +The values are chosen by ‘_generate_next_value_()’, which can be +overridden: + + >>> class AutoName(Enum): + ... 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'] + + Note: The ‘_generate_next_value_()’ method must be defined before + any members. + + +File: python.info, Node: Iteration<2>, Next: Comparisons<3>, Prev: Using automatic values, Up: Enum HOWTO + +10.5.5 Iteration +---------------- + +Iterating over the members of an enum does not provide the aliases: + + >>> list(Shape) + [, , ] + +The special attribute ‘__members__’ is a read-only ordered mapping of +names to members. It includes all names defined in the enumeration, +including the aliases: + + >>> for name, member in Shape.__members__.items(): + ... name, member + ... + ('SQUARE', ) + ('DIAMOND', ) + ('CIRCLE', ) + ('ALIAS_FOR_SQUARE', ) + +The ‘__members__’ attribute can be used for detailed programmatic access +to the enumeration members. For example, finding all the aliases: + + >>> [name for name, member in Shape.__members__.items() if member.name != name] + ['ALIAS_FOR_SQUARE'] + + +File: python.info, Node: Comparisons<3>, Next: Allowed members and attributes of enumerations, Prev: Iteration<2>, Up: Enum HOWTO + +10.5.6 Comparisons +------------------ + +Enumeration members are compared by identity: + + >>> Color.RED is Color.RED + True + >>> Color.RED is Color.BLUE + False + >>> Color.RED is not Color.BLUE + True + +Ordered comparisons between enumeration values are `not' supported. +Enum members are not integers (but see *note IntEnum: 483e. below): + + >>> Color.RED < Color.BLUE + Traceback (most recent call last): + File "", line 1, in + TypeError: '<' not supported between instances of 'Color' and 'Color' + +Equality comparisons are defined though: + + >>> Color.BLUE == Color.RED + False + >>> Color.BLUE != Color.RED + True + >>> Color.BLUE == Color.BLUE + True + +Comparisons against non-enumeration values will always compare not equal +(again, *note IntEnum: 1f9. was explicitly designed to behave +differently, see below): + + >>> Color.BLUE == 2 + False + + +File: python.info, Node: Allowed members and attributes of enumerations, Next: Restricted Enum subclassing, Prev: Comparisons<3>, Up: Enum HOWTO + +10.5.7 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 *note +Functional API: 4840.), 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: + + >>> 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 + ... + +Then: + + >>> Mood.favorite_mood() + + >>> Mood.HAPPY.describe() + ('HAPPY', 3) + >>> str(Mood.FUNKY) + 'my custom str! 1' + +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 (‘__str__()’, +‘__add__()’, etc.), descriptors (methods are also descriptors), and +variable names listed in ‘_ignore_’. + +Note: if your enumeration defines ‘__new__()’ and/or ‘__init__()’ then +any value(s) given to the enum member will be passed into those methods. +See *note Planet: 4841. for an example. + + +File: python.info, Node: Restricted Enum subclassing, Next: Pickling, Prev: Allowed members and attributes of enumerations, Up: Enum HOWTO + +10.5.8 Restricted Enum subclassing +---------------------------------- + +A new *note Enum: 20c. class must have one base enum class, up to one +concrete data type, and as many *note object: 6df.-based mixin classes +as needed. The order of these base classes is: + + class EnumName([mix-in, ...,] [data-type,] base-enum): + pass + +Also, subclassing an enumeration is allowed only if the enumeration does +not define any members. So this is forbidden: + + >>> class MoreColor(Color): + ... PINK = 17 + ... + Traceback (most recent call last): + ... + TypeError: cannot extend + +But this is allowed: + + >>> class Foo(Enum): + ... def some_behavior(self): + ... pass + ... + >>> class Bar(Foo): + ... HAPPY = 1 + ... SAD = 2 + ... + +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 *note OrderedEnum: 4843. for an example.) + + +File: python.info, Node: Pickling, Next: Functional API<2>, Prev: Restricted Enum subclassing, Up: Enum HOWTO + +10.5.9 Pickling +--------------- + +Enumerations can be pickled and unpickled: + + >>> from test.test_enum import Fruit + >>> from pickle import dumps, loads + >>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO)) + True + +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. + + Note: With pickle protocol version 4 it is possible to easily + pickle enums nested in other classes. + +It is possible to modify how enum members are pickled/unpickled by +defining ‘__reduce_ex__()’ in the enumeration class. + + +File: python.info, Node: Functional API<2>, Next: Derived Enumerations, Prev: Pickling, Up: Enum HOWTO + +10.5.10 Functional API +---------------------- + +The *note Enum: 20c. class is callable, providing the following +functional API: + + >>> Animal = Enum('Animal', 'ANT BEE CAT DOG') + >>> Animal + + >>> Animal.ANT + + >>> list(Animal) + [, , , ] + +The semantics of this API resemble *note namedtuple: 538. The first +argument of the call to *note Enum: 20c. 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 ‘start’ parameter to specify a +different starting value). A new class derived from *note Enum: 20c. is +returned. In other words, the above assignment to ‘Animal’ is +equivalent to: + + >>> class Animal(Enum): + ... ANT = 1 + ... BEE = 2 + ... CAT = 3 + ... DOG = 4 + ... + +The reason for defaulting to ‘1’ as the starting number and not ‘0’ is +that ‘0’ is ‘False’ in a boolean sense, but by default enum members all +evaluate to ‘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: + + >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__) + + Warning: If ‘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. + +The new pickle protocol 4 also, in some circumstances, relies on *note +__qualname__: 18fb. 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: + + >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal') + +The complete signature is: + + Enum( + value='NewEnumName', + names=<...>, + *, + module='...', + qualname='...', + type=, + start=1, + ) + + +value: What the new enum class will record as its name. + + +names: The enum members. This can be a whitespace- or comma-separated +string (values will start at 1 unless otherwise specified): + + 'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE' + +or an iterator of names: + + ['RED', 'GREEN', 'BLUE'] + +or an iterator of (name, value) pairs: + + [('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)] + +or a mapping: + + {'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42} + + +module: name of module where new enum class can be found. + + +qualname: where in module new enum class can be found. + + +type: type to mix in to new enum class. + + +start: number to start counting at if only names are passed in. + +Changed in version 3.5: The `start' parameter was added. + + +File: python.info, Node: Derived Enumerations, Next: When to use __new__ vs __init__, Prev: Functional API<2>, Up: Enum HOWTO + +10.5.11 Derived Enumerations +---------------------------- + +* Menu: + +* IntEnum:: +* StrEnum:: +* IntFlag:: +* Flag:: +* Others:: + + +File: python.info, Node: IntEnum, Next: StrEnum, Up: Derived Enumerations + +10.5.11.1 IntEnum +................. + +The first variation of *note Enum: 20c. that is provided is also a +subclass of *note int: 1c7. Members of an *note IntEnum: 1f9. can be +compared to integers; by extension, integer enumerations of different +types can also be compared to each other: + + >>> 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 + +However, they still can’t be compared to standard *note Enum: 20c. +enumerations: + + >>> class Shape(IntEnum): + ... CIRCLE = 1 + ... SQUARE = 2 + ... + >>> class Color(Enum): + ... RED = 1 + ... GREEN = 2 + ... + >>> Shape.CIRCLE == Color.RED + False + +*note IntEnum: 1f9. values behave like integers in other ways you’d +expect: + + >>> int(Shape.CIRCLE) + 1 + >>> ['a', 'b', 'c'][Shape.CIRCLE] + 'b' + >>> [i for i in range(Shape.SQUARE)] + [0, 1] + + +File: python.info, Node: StrEnum, Next: IntFlag, Prev: IntEnum, Up: Derived Enumerations + +10.5.11.2 StrEnum +................. + +The second variation of *note Enum: 20c. that is provided is also a +subclass of *note str: 1b3. Members of a *note StrEnum: 1f3. can be +compared to strings; by extension, string enumerations of different +types can also be compared to each other. + +New in version 3.11. + + +File: python.info, Node: IntFlag, Next: Flag, Prev: StrEnum, Up: Derived Enumerations + +10.5.11.3 IntFlag +................. + +The next variation of *note Enum: 20c. provided, *note IntFlag: 1fa, is +also based on *note int: 1c7. The difference being *note IntFlag: 1fa. +members can be combined using the bitwise operators (&, |, ^, ~) and the +result is still an *note IntFlag: 1fa. member, if possible. Like *note +IntEnum: 1f9, *note IntFlag: 1fa. members are also integers and can be +used wherever an *note int: 1c7. is used. + + Note: Any operation on an *note IntFlag: 1fa. member besides the + bit-wise operations will lose the *note IntFlag: 1fa. membership. + + Bit-wise operations that result in invalid *note IntFlag: 1fa. + values will lose the *note IntFlag: 1fa. membership. See *note + FlagBoundary: 1ff. for details. + +New in version 3.6. + +Changed in version 3.11. + +Sample *note IntFlag: 1fa. class: + + >>> from enum import IntFlag + >>> class Perm(IntFlag): + ... R = 4 + ... W = 2 + ... X = 1 + ... + >>> Perm.R | Perm.W + + >>> Perm.R + Perm.W + 6 + >>> RW = Perm.R | Perm.W + >>> Perm.R in RW + True + +It is also possible to name the combinations: + + >>> class Perm(IntFlag): + ... R = 4 + ... W = 2 + ... X = 1 + ... RWX = 7 + >>> Perm.RWX + + >>> ~Perm.RWX + + >>> Perm(7) + + + Note: Named combinations are considered aliases. Aliases do not + show up during iteration, but can be returned from by-value + lookups. + +Changed in version 3.11. + +Another important difference between *note IntFlag: 1fa. and *note Enum: +20c. is that if no flags are set (the value is 0), its boolean +evaluation is *note False: 78d.: + + >>> Perm.R & Perm.X + + >>> bool(Perm.R & Perm.X) + False + +Because *note IntFlag: 1fa. members are also subclasses of *note int: +1c7. they can be combined with them (but may lose *note IntFlag: 1fa. +membership: + + >>> Perm.X | 4 + + + >>> Perm.X | 8 + 9 + + Note: The negation operator, ‘~’, always returns an *note IntFlag: + 1fa. member with a positive value: + + >>> (~Perm.X).value == (Perm.R|Perm.W).value == 6 + True + +*note IntFlag: 1fa. members can also be iterated over: + + >>> list(RW) + [, ] + +New in version 3.11. + + +File: python.info, Node: Flag, Next: Others, Prev: IntFlag, Up: Derived Enumerations + +10.5.11.4 Flag +.............. + +The last variation is *note Flag: 1fe. Like *note IntFlag: 1fa, *note +Flag: 1fe. members can be combined using the bitwise operators (&, |, ^, +~). Unlike *note IntFlag: 1fa, they cannot be combined with, nor +compared against, any other *note Flag: 1fe. enumeration, nor *note int: +1c7. While it is possible to specify the values directly it is +recommended to use *note auto: 90f. as the value and let *note Flag: +1fe. select an appropriate value. + +New in version 3.6. + +Like *note IntFlag: 1fa, if a combination of *note Flag: 1fe. members +results in no flags being set, the boolean evaluation is *note False: +78d.: + + >>> from enum import Flag, auto + >>> class Color(Flag): + ... RED = auto() + ... BLUE = auto() + ... GREEN = auto() + ... + >>> Color.RED & Color.GREEN + + >>> bool(Color.RED & Color.GREEN) + False + +Individual flags should have values that are powers of two (1, 2, 4, 8, +…), while combinations of flags won’t: + + >>> class Color(Flag): + ... RED = auto() + ... BLUE = auto() + ... GREEN = auto() + ... WHITE = RED | BLUE | GREEN + ... + >>> Color.WHITE + + +Giving a name to the “no flags set” condition does not change its +boolean value: + + >>> class Color(Flag): + ... BLACK = 0 + ... RED = auto() + ... BLUE = auto() + ... GREEN = auto() + ... + >>> Color.BLACK + + >>> bool(Color.BLACK) + False + +*note Flag: 1fe. members can also be iterated over: + + >>> purple = Color.RED | Color.BLUE + >>> list(purple) + [, ] + +New in version 3.11. + + Note: For the majority of new code, *note Enum: 20c. and *note + Flag: 1fe. are strongly recommended, since *note IntEnum: 1f9. and + *note IntFlag: 1fa. break some semantic promises of an enumeration + (by being comparable to integers, and thus by transitivity to other + unrelated enumerations). *note IntEnum: 1f9. and *note IntFlag: + 1fa. should be used only in cases where *note Enum: 20c. and *note + Flag: 1fe. will not do; for example, when integer constants are + replaced with enumerations, or for interoperability with other + systems. + + +File: python.info, Node: Others, Prev: Flag, Up: Derived Enumerations + +10.5.11.5 Others +................ + +While *note IntEnum: 1f9. is part of the *note enum: 76. module, it +would be very simple to implement independently: + + class IntEnum(int, Enum): + pass + +This demonstrates how similar derived enumerations can be defined; for +example a ‘FloatEnum’ that mixes in *note float: 3ca. instead of *note +int: 1c7. + +Some rules: + + 1. When subclassing *note Enum: 20c, mix-in types must appear before + *note Enum: 20c. itself in the sequence of bases, as in the *note + IntEnum: 1f9. example above. + + 2. Mix-in types must be subclassable. For example, *note bool: 463. + and *note range: 58b. are not subclassable and will throw an error + during Enum creation if used as the mix-in type. + + 3. While *note Enum: 20c. can have members of any type, once you mix + in an additional type, all the members must have values of that + type, e.g. *note int: 1c7. above. This restriction does not apply + to mix-ins which only add methods and don’t specify another type. + + 4. When another data type is mixed in, the ‘value’ attribute is `not + the same' as the enum member itself, although it is equivalent and + will compare equal. + + 5. %-style formatting: ‘%s’ and ‘%r’ call the *note Enum: 20c. class’s + ‘__str__()’ and ‘__repr__()’ respectively; other codes (such as + ‘%i’ or ‘%h’ for IntEnum) treat the enum member as its mixed-in + type. + + 6. *note Formatted string literals: 5f9, *note str.format(): 1fc, and + *note format(): 1f7. will use the enum’s ‘__str__()’ method. + + Note: Because *note IntEnum: 1f9, *note IntFlag: 1fa, and *note + StrEnum: 1f3. are designed to be drop-in replacements for existing + constants, their ‘__str__()’ method has been reset to their data + types ‘__str__()’ method. + + +File: python.info, Node: When to use __new__ vs __init__, Next: How are Enums different?, Prev: Derived Enumerations, Up: Enum HOWTO + +10.5.12 When to use ‘__new__()’ vs. ‘__init__()’ +------------------------------------------------ + +‘__new__()’ must be used whenever you want to customize the actual value +of the *note Enum: 20c. member. Any other modifications may go in +either ‘__new__()’ or ‘__init__()’, with ‘__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: + + >>> 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 + +* Menu: + +* Finer Points:: + + +File: python.info, Node: Finer Points, Up: When to use __new__ vs __init__ + +10.5.12.1 Finer Points +...................... + +* Menu: + +* Supported __dunder__ names: Supported __dunder__ names<2>. +* Supported _sunder_ names: Supported _sunder_ names<2>. +* _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:: + + +File: python.info, Node: Supported __dunder__ names<2>, Next: Supported _sunder_ names<2>, Up: Finer Points + +10.5.12.2 Supported ‘__dunder__’ names +...................................... + +‘__members__’ is a read-only ordered mapping of ‘member_name’:‘member’ +items. It is only available on the class. + +‘__new__()’, if specified, must create and return the enum members; it +is also a very good idea to set the member’s ‘_value_’ appropriately. +Once all the members are created it is no longer used. + + +File: python.info, Node: Supported _sunder_ names<2>, Next: _Private__names, Prev: Supported __dunder__ names<2>, Up: Finer Points + +10.5.12.3 Supported ‘_sunder_’ names +.................................... + + - ‘_name_’ – name of the member + + - ‘_value_’ – value of the member; can be set / modified in ‘__new__’ + + - ‘_missing_’ – a lookup function used when a value is not found; may + be overridden + + - ‘_ignore_’ – a list of names, either as a *note list: 1e9. or a + *note str: 1b3, that will not be transformed into members, and will + be removed from the final class + + - ‘_order_’ – used in Python 2/3 code to ensure member order is + consistent (class attribute, removed during class creation) + + - ‘_generate_next_value_’ – used by the *note Functional API: 4840. + and by *note auto: 90f. to get an appropriate value for an enum + member; may be overridden + + Note: For standard *note Enum: 20c. classes the next value chosen + is the last value seen incremented by one. + + For *note Flag: 1fe. classes the next value chosen will be the next + highest power-of-two, regardless of the last value seen. + +New in version 3.6: ‘_missing_’, ‘_order_’, ‘_generate_next_value_’ + +New in version 3.7: ‘_ignore_’ + +To help keep Python 2 / Python 3 code in sync an ‘_order_’ attribute can +be provided. It will be checked against the actual order of the +enumeration and raise an error if the two do not match: + + >>> 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'] + + Note: In Python 2 code the ‘_order_’ attribute is necessary as + definition order is lost before it can be recorded. + + +File: python.info, Node: _Private__names, Next: Enum member type, Prev: Supported _sunder_ names<2>, Up: Finer Points + +10.5.12.4 _Private__names +......................... + +*note Private names: 19e2. are not converted to enum members, but remain +normal attributes. + +Changed in version 3.11. + + +File: python.info, Node: Enum member type, Next: Creating members that are mixed with other data types, Prev: _Private__names, Up: Finer Points + +10.5.12.5 ‘Enum’ member type +............................ + +Enum members are instances of their enum class, and are normally +accessed as ‘EnumClass.member’. In Python versions ‘3.5’ to ‘3.10’ you +could access members from other members – this practice was discouraged, +and in ‘3.11’ *note Enum: 20c. returns to not allowing it: + + >>> class FieldTypes(Enum): + ... name = 0 + ... value = 1 + ... size = 2 + ... + >>> FieldTypes.value.size + Traceback (most recent call last): + ... + AttributeError: member has no attribute 'size' + +Changed in version 3.5. + +Changed in version 3.11. + + +File: python.info, Node: Creating members that are mixed with other data types, Next: Boolean value of Enum classes and members, Prev: Enum member type, Up: Finer Points + +10.5.12.6 Creating members that are mixed with other data types +............................................................... + +When subclassing other data types, such as *note int: 1c7. or *note str: +1b3, with an *note Enum: 20c, all values after the ‘=’ are passed to +that data type’s constructor. For 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 + + +File: python.info, Node: Boolean value of Enum classes and members, Next: Enum classes with methods, Prev: Creating members that are mixed with other data types, Up: Finer Points + +10.5.12.7 Boolean value of ‘Enum’ classes and members +..................................................... + +Enum classes that are mixed with non-*note Enum: 20c. types (such as +*note int: 1c7, *note str: 1b3, etc.) are evaluated according to the +mixed-in type’s rules; otherwise, all members evaluate as *note True: +877. To make your own enum’s boolean evaluation depend on the member’s +value add the following to your class: + + def __bool__(self): + return bool(self.value) + +Plain *note Enum: 20c. classes always evaluate as *note True: 877. + + +File: python.info, Node: Enum classes with methods, Next: Combining members of Flag, Prev: Boolean value of Enum classes and members, Up: Finer Points + +10.5.12.8 ‘Enum’ classes with methods +..................................... + +If you give your enum subclass extra methods, like the *note Planet: +4841. class below, those methods will show up in a *note dir(): 20e. of +the member, but not of the class: + + >>> 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'] + + +File: python.info, Node: Combining members of Flag, Next: Flag and IntFlag minutia, Prev: Enum classes with methods, Up: Finer Points + +10.5.12.9 Combining members of ‘Flag’ +..................................... + +Iterating over a combination of *note Flag: 1fe. members will only +return the members that are comprised of a single bit: + + >>> class Color(Flag): + ... RED = auto() + ... GREEN = auto() + ... BLUE = auto() + ... MAGENTA = RED | BLUE + ... YELLOW = RED | GREEN + ... CYAN = GREEN | BLUE + ... + >>> Color(3) # named combination + + >>> Color(7) # not named combination + + + +File: python.info, Node: Flag and IntFlag minutia, Prev: Combining members of Flag, Up: Finer Points + +10.5.12.10 ‘Flag’ and ‘IntFlag’ minutia +....................................... + +Using the following snippet for our examples: + + >>> class Color(IntFlag): + ... BLACK = 0 + ... RED = 1 + ... GREEN = 2 + ... BLUE = 4 + ... PURPLE = RED | BLUE + ... WHITE = RED | GREEN | BLUE + ... + +the following are true: + + - single-bit flags are canonical + + - multi-bit and zero-bit flags are aliases + + - only canonical flags are returned during iteration: + + >>> list(Color.WHITE) + [, , ] + + - negating a flag or flag set returns a new flag/flag set with the + corresponding positive integer value: + + >>> Color.BLUE + + + >>> ~Color.BLUE + + + - names of pseudo-flags are constructed from their members’ names: + + >>> (Color.RED | Color.GREEN).name + 'RED|GREEN' + + - multi-bit flags, aka aliases, can be returned from operations: + + >>> Color.RED | Color.BLUE + + + >>> Color(7) # or Color(-1) + + + >>> Color(0) + + + - membership / containment checking: zero-valued flags are always + considered to be contained: + + >>> Color.BLACK in Color.WHITE + True + + otherwise, only if all bits of one flag are in the other flag will + True be returned: + + >>> Color.PURPLE in Color.WHITE + True + + >>> Color.GREEN in Color.PURPLE + False + +There is a new boundary mechanism that controls how out-of-range / +invalid bits are handled: ‘STRICT’, ‘CONFORM’, ‘EJECT’, and ‘KEEP’: + + * STRICT –> raises an exception when presented with invalid + values + + * CONFORM –> discards any invalid bits + + * EJECT –> lose Flag status and become a normal int with the + given value + + * + KEEP –> keep the extra bits + + - keeps Flag status and extra bits + + - extra bits do not show up in iteration + + - extra bits do show up in repr() and str() + +The default for Flag is ‘STRICT’, the default for ‘IntFlag’ is ‘EJECT’, +and the default for ‘_convert_’ is ‘KEEP’ (see ‘ssl.Options’ for an +example of when ‘KEEP’ is needed). + + +File: python.info, Node: How are Enums different?, Next: Subclassing EnumType, Prev: When to use __new__ vs __init__, Up: Enum HOWTO + +10.5.13 How are Enums different? +-------------------------------- + +Enums have a custom metaclass that affects many aspects of both derived +*note Enum: 20c. classes and their instances (members). + +* Menu: + +* Enum Classes:: +* Enum Members (aka instances): Enum Members aka instances. +* Omitting values:: +* OrderedEnum:: +* DuplicateFreeEnum:: +* Planet:: +* TimePeriod:: + + +File: python.info, Node: Enum Classes, Next: Enum Members aka instances, Up: How are Enums different? + +10.5.13.1 Enum Classes +...................... + +The *note EnumType: 1f2. metaclass is responsible for providing the +‘__contains__()’, ‘__dir__()’, ‘__iter__()’ and other methods that allow +one to do things with an *note Enum: 20c. class that fail on a typical +class, such as ‘list(Color)’ or ‘some_enum_var in Color’. *note +EnumType: 1f2. is responsible for ensuring that various other methods on +the final *note Enum: 20c. class are correct (such as ‘__new__()’, +‘__getnewargs__()’, ‘__str__()’ and ‘__repr__()’). + + +File: python.info, Node: Enum Members aka instances, Next: Omitting values, Prev: Enum Classes, Up: How are Enums different? + +10.5.13.2 Enum Members (aka instances) +...................................... + +The most interesting thing about enum members is that they are +singletons. *note EnumType: 1f2. creates them all while it is creating +the enum class itself, and then puts a custom ‘__new__()’ in place to +ensure that no new ones are ever instantiated by returning only the +existing member instances. While *note Enum: 20c, *note IntEnum: 1f9, +*note StrEnum: 1f3, *note Flag: 1fe, and *note IntFlag: 1fa. 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. + + +File: python.info, Node: Omitting values, Next: OrderedEnum, Prev: Enum Members aka instances, Up: How are Enums different? + +10.5.13.3 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: + + - use instances of *note auto: 90f. for the value + + - use instances of *note object: 6df. as the value + + - use a descriptive string as the value + + - use a tuple as the value and a custom ‘__new__()’ to replace the + tuple with an *note int: 1c7. value + +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__. + + +File: python.info, Node: Using auto, Next: Using object, Up: Omitting values + +10.5.13.4 Using ‘auto’ +...................... + +Using *note auto: 90f. would look like: + + >>> class Color(Enum): + ... RED = auto() + ... BLUE = auto() + ... GREEN = auto() + ... + >>> Color.GREEN + + + +File: python.info, Node: Using object, Next: Using a descriptive string, Prev: Using auto, Up: Omitting values + +10.5.13.5 Using ‘object’ +........................ + +Using *note object: 6df. would look like: + + >>> class Color(Enum): + ... RED = object() + ... GREEN = object() + ... BLUE = object() + ... + >>> Color.GREEN + > + +This is also a good example of why you might want to write your own +‘__repr__()’: + + >>> class Color(Enum): + ... RED = object() + ... GREEN = object() + ... BLUE = object() + ... def __repr__(self): + ... return "<%s.%s>" % (self.__class__.__name__, self._name_) + ... + >>> Color.GREEN + + + +File: python.info, Node: Using a descriptive string, Next: Using a custom __new__, Prev: Using object, Up: Omitting values + +10.5.13.6 Using a descriptive string +.................................... + +Using a string as the value would look like: + + >>> class Color(Enum): + ... RED = 'stop' + ... GREEN = 'go' + ... BLUE = 'too fast!' + ... + >>> Color.GREEN + + + +File: python.info, Node: Using a custom __new__, Prev: Using a descriptive string, Up: Omitting values + +10.5.13.7 Using a custom ‘__new__()’ +.................................... + +Using an auto-numbering ‘__new__()’ would look like: + + >>> 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 + + +To make a more general purpose ‘AutoNumber’, add ‘*args’ to the +signature: + + >>> 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 + ... + +Then when you inherit from ‘AutoNumber’ you can write your own +‘__init__’ to handle any extra arguments: + + >>> 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.pantone + '1246' + >>> Swatch.BLEACHED_CORAL.pantone + 'unknown' + + Note: The ‘__new__()’ method, if defined, is used during creation + of the Enum members; it is then replaced by Enum’s ‘__new__()’ + which is used after class creation for lookup of existing members. + + +File: python.info, Node: OrderedEnum, Next: DuplicateFreeEnum, Prev: Omitting values, Up: How are Enums different? + +10.5.13.8 OrderedEnum +..................... + +An ordered enumeration that is not based on *note IntEnum: 1f9. and so +maintains the normal *note Enum: 20c. invariants (such as not being +comparable to other enumerations): + + >>> 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 + + +File: python.info, Node: DuplicateFreeEnum, Next: Planet, Prev: OrderedEnum, Up: How are Enums different? + +10.5.13.9 DuplicateFreeEnum +........................... + +Raises an error if a duplicate member name is found instead of creating +an alias: + + >>> 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' + + 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 *note unique(): 1ff6. + decorator can be used instead. + + +File: python.info, Node: Planet, Next: TimePeriod, Prev: DuplicateFreeEnum, Up: How are Enums different? + +10.5.13.10 Planet +................. + +If ‘__new__()’ or ‘__init__()’ is defined, the value of the enum member +will be passed to those methods: + + >>> 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 + + +File: python.info, Node: TimePeriod, Prev: Planet, Up: How are Enums different? + +10.5.13.11 TimePeriod +..................... + +An example to show the ‘_ignore_’ attribute in use: + + >>> from datetime import timedelta + >>> class Period(timedelta, Enum): + ... "different lengths of time" + ... _ignore_ = 'Period i' + ... Period = vars() + ... for i in range(367): + ... Period['day_%d' % i] = i + ... + >>> list(Period)[:2] + [, ] + >>> list(Period)[-2:] + [, ] + + +File: python.info, Node: Subclassing EnumType, Prev: How are Enums different?, Up: Enum HOWTO + +10.5.14 Subclassing EnumType +---------------------------- + +While most enum needs can be met by customizing *note Enum: 20c. +subclasses, either with class decorators or custom functions, *note +EnumType: 1f2. can be subclassed to provide a different Enum experience. + + +File: python.info, Node: Functional Programming HOWTO, Next: Logging HOWTO, Prev: Enum HOWTO, Up: Python HOWTOs + +10.6 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 *note iterator: 134f.s and *note generator: d11.s and relevant +library modules such as *note itertools: a1. and *note functools: 7f. + +* Menu: + +* Introduction: Introduction<13>. +* Iterators: Iterators<2>. +* Generator expressions and list comprehensions:: +* Generators: Generators<2>. +* Built-in functions:: +* The itertools module:: +* The functools module:: +* Small functions and the lambda expression:: +* Revision History and Acknowledgements:: +* References: References<2>. + + +File: python.info, Node: Introduction<13>, Next: Iterators<2>, Up: Functional Programming HOWTO + +10.6.1 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 *note Iterators: 4863. + +Programming languages support decomposing problems in several different +ways: + + * 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. + + * 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. + + * `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. + + * `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. + +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 ‘a=3’ or ‘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 *note print(): c13. or +*note time.sleep(): 266. 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: + + * Formal provability. + + * Modularity. + + * Composability. + + * Ease of debugging and testing. + +* Menu: + +* Formal provability:: +* Modularity:: +* Ease of debugging and testing:: +* Composability:: + + +File: python.info, Node: Formal provability, Next: Modularity, Up: Introduction<13> + +10.6.1.1 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. + + +File: python.info, Node: Modularity, Next: Ease of debugging and testing, Prev: Formal provability, Up: Introduction<13> + +10.6.1.2 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. + + +File: python.info, Node: Ease of debugging and testing, Next: Composability, Prev: Modularity, Up: Introduction<13> + +10.6.1.3 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. + + +File: python.info, Node: Composability, Prev: Ease of debugging and testing, Up: Introduction<13> + +10.6.1.4 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. + + +File: python.info, Node: Iterators<2>, Next: Generator expressions and list comprehensions, Prev: Introduction<13>, Up: Functional Programming HOWTO + +10.6.2 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 *note __next__(): f76. that takes no arguments and +always returns the next element of the stream. If there are no more +elements in the stream, *note __next__(): f76. must raise the *note +StopIteration: 865. 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 *note iter(): 3c6. function takes an arbitrary object and +tries to return an iterator that will return the object’s contents or +elements, raising *note TypeError: 19c. 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 *note +iterable: ed9. if you can get an iterator for it. + +You can experiment with the iteration interface manually: + + >>> 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 "", line 1, in + StopIteration + >>> + +Python expects iterable objects in several different contexts, the most +important being the *note for: 199. statement. In the statement ‘for X +in Y’, Y must be an iterator or some object for which *note iter(): 3c6. +can create an iterator. These two statements are equivalent: + + for i in iter(obj): + print(i) + + for i in obj: + print(i) + +Iterators can be materialized as lists or tuples by using the *note +list(): 1e9. or *note tuple(): 539. constructor functions: + + >>> L = [1, 2, 3] + >>> iterator = iter(L) + >>> t = tuple(iterator) + >>> t + (1, 2, 3) + +Sequence unpacking also supports iterators: if you know an iterator will +return N elements, you can unpack them into an N-tuple: + + >>> L = [1, 2, 3] + >>> iterator = iter(L) + >>> a, b, c = iterator + >>> a, b, c + (1, 2, 3) + +Built-in functions such as *note max(): b9a. and *note min(): b99. can +take a single iterator argument and will return the largest or smallest +element. The ‘"in"’ and ‘"not in"’ operators also support iterators: ‘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; +*note max(): b9a, *note min(): b99. will never return, and if the +element X never appears in the stream, the ‘"in"’ and ‘"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 *note __next__(): f76. +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:: + + +File: python.info, Node: Data Types That Support Iterators, Up: Iterators<2> + +10.6.2.1 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 *note iter(): 3c6. on a dictionary returns an iterator that will +loop over the dictionary’s keys: + + >>> 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 + +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 *note iter(): 3c6. 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 +*note values(): 3b9. or *note items(): 3ba. methods to get an +appropriate iterator. + +The *note dict(): 16e. constructor can accept an iterator that returns a +finite stream of ‘(key, value)’ tuples: + + >>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')] + >>> dict(iter(L)) + {'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'} + +Files also support iteration by calling the *note readline(): 2208. +method until there are no more lines in the file. This means you can +read each line of a file like this: + + for line in file: + # do something for each line + ... + +Sets can take their contents from an iterable and let you iterate over +the set’s elements: + + >>> S = {2, 3, 5, 7, 11, 13} + >>> for i in S: + ... print(i) + 2 + 3 + 5 + 7 + 11 + 13 + + +File: python.info, Node: Generator expressions and list comprehensions, Next: Generators<2>, Prev: Iterators<2>, Up: Functional Programming HOWTO + +10.6.3 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 +(‘https://www.haskell.org/’). You can strip all the whitespace from a +stream of strings with the following code: + + >>> line_list = [' line 1\n', 'line 2 \n', ' \n', ''] + + >>> # 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] + +You can select only certain elements by adding an ‘"if"’ condition: + + >>> stripped_list = [line.strip() for line in line_list + ... if line != ""] + +With a list comprehension, you get back a Python list; ‘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: + + ( 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 ) + +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 +‘expression’. The ‘if’ clauses are all optional; if present, +‘expression’ is only evaluated and added to the result when ‘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: + + obj_total = sum(obj.count for obj in list_all_objects()) + +The ‘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 +‘sequence1’, ‘sequence2’ is looped over from the beginning. ‘sequence3’ +is then looped over for each resulting pair of elements from ‘sequence1’ +and ‘sequence2’. + +To put it another way, a list comprehension or generator expression is +equivalent to the following Python code: + + 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. + +This means that when there are multiple ‘for...in’ clauses but no ‘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: + + >>> 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)] + +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: + + # Syntax error + [x, y for x in seq1 for y in seq2] + # Correct + [(x, y) for x in seq1 for y in seq2] + + +File: python.info, Node: Generators<2>, Next: Built-in functions, Prev: Generator expressions and list comprehensions, Up: Functional Programming HOWTO + +10.6.4 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 ‘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: + + >>> def generate_ints(N): + ... for i in range(N): + ... yield i + +Any function containing a *note yield: 60d. keyword is a generator +function; this is detected by Python’s *note bytecode: 16f. 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 ‘yield’ expression, the generator outputs +the value of ‘i’, similar to a ‘return’ statement. The big difference +between ‘yield’ and a ‘return’ statement is that on reaching a ‘yield’ +the generator’s state of execution is suspended and local variables are +preserved. On the next call to the generator’s *note __next__(): 1708. +method, the function will resume executing. + +Here’s a sample usage of the ‘generate_ints()’ generator: + + >>> gen = generate_ints(3) + >>> gen + + >>> next(gen) + 0 + >>> next(gen) + 1 + >>> next(gen) + 2 + >>> next(gen) + Traceback (most recent call last): + File "stdin", line 1, in + File "stdin", line 2, in generate_ints + StopIteration + +You could equally write ‘for i in generate_ints(5)’, or ‘a, b, c = +generate_ints(3)’. + +Inside a generator function, ‘return value’ causes +‘StopIteration(value)’ to be raised from the *note __next__(): 1708. +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 ‘self.count’ to 0, and having the *note __next__(): f76. method +increment ‘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(1), contains a number of more interesting +examples. Here’s one generator that implements an in-order traversal of +a tree using generators recursively. + + # 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 + +Two other examples in ‘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:: + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/tree/3.11/Lib/test/test_generators.py + + +File: python.info, Node: Passing values into a generator, Up: Generators<2> + +10.6.4.1 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. +*note yield: 60d. became an expression, returning a value that can be +assigned to a variable or otherwise operated on: + + val = (yield i) + +I recommend that you `always' put parentheses around a ‘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. + +( PEP 342(1) explains the exact rules, which are that a +‘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 ‘val = yield i’ but have to use parentheses when +there’s an operation, as in ‘val = (yield i) + 12’.) + +Values are sent into a generator by calling its *note send(value): 1982. +method. This method resumes the generator’s code and the ‘yield’ +expression returns the specified value. If the regular *note +__next__(): 1708. method is called, the ‘yield’ returns ‘None’. + +Here’s a simple counter that increments by 1 and allows changing the +value of the internal counter. + + 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 + +And here’s an example of changing the counter: + + >>> 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 + it.next() + StopIteration + +Because ‘yield’ will often be returning ‘None’, you should always check +for this case. Don’t just use its value in expressions unless you’re +sure that the *note send(): 1982. method will be the only method used to +resume your generator function. + +In addition to *note send(): 1982, there are two other methods on +generators: + + * *note throw(value): 134b. is used to raise an exception inside the + generator; the exception is raised by the ‘yield’ expression where + the generator’s execution is paused. + + * *note close(): 1985. raises a *note GeneratorExit: 1035. exception + inside the generator to terminate the iteration. On receiving this + exception, the generator’s code must either raise *note + GeneratorExit: 1035. or *note StopIteration: 865.; catching the + exception and doing anything else is illegal and will trigger a + *note RuntimeError: 6e9. *note close(): 1985. will also be called + by Python’s garbage collector when the generator is + garbage-collected. + + If you need to run cleanup code when a *note GeneratorExit: 1035. + occurs, I suggest using a ‘try: ... finally:’ suite instead of + catching *note GeneratorExit: 1035. + +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 ‘return’ statement), but +coroutines can be entered, exited, and resumed at many different points +(the ‘yield’ statements). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0342/ + + +File: python.info, Node: Built-in functions, Next: The itertools module, Prev: Generators<2>, Up: Functional Programming HOWTO + +10.6.5 Built-in functions +------------------------- + +Let’s look in more detail at built-in functions often used with +iterators. + +Two of Python’s built-in functions, *note map(): 460. and *note +filter(): 461. duplicate the features of generator expressions: + +*note map(f, iterA, iterB, ...): 460. returns an iterator over the sequence + + ‘f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], + iterB[2]), ...’. + + >>> def upper(s): + ... return s.upper() + + >>> list(map(upper, ['sentence', 'fragment'])) + ['SENTENCE', 'FRAGMENT'] + >>> [upper(s) for s in ['sentence', 'fragment']] + ['SENTENCE', 'FRAGMENT'] + +You can of course achieve the same effect with a list comprehension. + +*note filter(predicate, iter): 461. 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 *note filter(): +461, the predicate must take a single value. + + >>> def is_even(x): + ... return (x % 2) == 0 + + >>> list(filter(is_even, range(10))) + [0, 2, 4, 6, 8] + +This can also be written as a list comprehension: + + >>> list(x for x in range(10) if is_even(x)) + [0, 2, 4, 6, 8] + +*note enumerate(iter, start=0): 10e1. counts off the elements in the +iterable returning 2-tuples containing the count (from `start') and each +element. + + >>> for item in enumerate(['subject', 'verb', 'object']): + ... print(item) + (0, 'subject') + (1, 'verb') + (2, 'object') + +*note enumerate(): 10e1. is often used when looping through a list and +recording the indexes at which certain conditions are met: + + f = open('data.txt', 'r') + for i, line in enumerate(f): + if line.strip() == '': + print('Blank line at line #%i' % i) + +*note sorted(iterable, key=None, reverse=False): 833. 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 *note sort(): 834. method. + + >>> 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] + +(For a more detailed discussion of sorting, see the *note Sorting HOW +TO: 1bc7.) + +The *note any(iter): 1084. and *note all(iter): 1085. built-ins look at +the truth values of an iterable’s contents. *note any(): 1084. returns +‘True’ if any element in the iterable is a true value, and *note all(): +1085. returns ‘True’ if all of the elements are true values: + + >>> 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 + +*note zip(iterA, iterB, ...): 3bc. takes one element from each iterable +and returns them in a tuple: + + zip(['a', 'b', 'c'], (1, 2, 3)) => + ('a', 1), ('b', 2), ('c', 3) + +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(1).) + +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. + + zip(['a', 'b'], (1, 2, 3)) => + ('a', 1), ('b', 2) + +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. + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Lazy_evaluation + + +File: python.info, Node: The itertools module, Next: The functools module, Prev: Built-in functions, Up: Functional Programming HOWTO + +10.6.6 The itertools module +--------------------------- + +The *note itertools: a1. 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: + + * Functions that create a new iterator based on an existing iterator. + + * Functions for treating an iterator’s elements as function + arguments. + + * Functions for selecting portions of an iterator’s output. + + * A function for grouping an iterator’s output. + +* Menu: + +* Creating new iterators:: +* Calling functions on elements:: +* Selecting elements:: +* Combinatoric functions:: +* Grouping elements:: + + +File: python.info, Node: Creating new iterators, Next: Calling functions on elements, Up: The itertools module + +10.6.6.1 Creating new iterators +............................... + +*note itertools.count(start, step): f3d. 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: + + 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, ... + +*note itertools.cycle(iter): 214b. 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. + + itertools.cycle([1, 2, 3, 4, 5]) => + 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... + +*note itertools.repeat(elem, [n]): 14f3. returns the provided element +`n' times, or returns the element endlessly if `n' is not provided. + + itertools.repeat('abc') => + abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ... + itertools.repeat('abc', 5) => + abc, abc, abc, abc, abc + +*note itertools.chain(iterA, iterB, ...): 1bc8. 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. + + itertools.chain(['a', 'b', 'c'], (1, 2, 3)) => + a, b, c, 1, 2, 3 + +*note itertools.islice(iter, [start], stop, [step]): 7a5. 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'. + + 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 + +*note itertools.tee(iter, [n]): 2150. 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. + + 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, ... + + +File: python.info, Node: Calling functions on elements, Next: Selecting elements, Prev: Creating new iterators, Up: The itertools module + +10.6.6.2 Calling functions on elements +...................................... + +The *note operator: c0. module contains a set of functions corresponding +to Python’s operators. Some examples are *note operator.add(a, b): +2173. (adds two values), *note operator.ne(a, b): 2163. (same as ‘a != +b’), and *note operator.attrgetter(’id’): ab7. (returns a callable that +fetches the ‘.id’ attribute). + +*note itertools.starmap(func, iter): d8e. assumes that the iterable will +return a stream of tuples, and calls `func' using these tuples as the +arguments: + + 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 + + +File: python.info, Node: Selecting elements, Next: Combinatoric functions, Prev: Calling functions on elements, Up: The itertools module + +10.6.6.3 Selecting elements +........................... + +Another group of functions chooses a subset of an iterator’s elements +based on a predicate. + +*note itertools.filterfalse(predicate, iter): 1bad. is the opposite of +*note filter(): 461, returning all elements for which the predicate +returns false: + + itertools.filterfalse(is_even, itertools.count()) => + 1, 3, 5, 7, 9, 11, 13, 15, ... + +*note itertools.takewhile(predicate, iter): 214f. returns elements for +as long as the predicate returns true. Once the predicate returns +false, the iterator will signal the end of its results. + + 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 + +*note itertools.dropwhile(predicate, iter): 214d. discards elements +while the predicate returns true, and then returns the rest of the +iterable’s results. + + 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, ... + +*note itertools.compress(data, selectors): f3c. 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: + + itertools.compress([1, 2, 3, 4, 5], [True, True, False, False, True]) => + 1, 2, 5 + + +File: python.info, Node: Combinatoric functions, Next: Grouping elements, Prev: Selecting elements, Up: The itertools module + +10.6.6.4 Combinatoric functions +............................... + +The *note itertools.combinations(iterable, r): fb1. returns an iterator +giving all possible `r'-tuple combinations of the elements contained in +`iterable'. + + 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) + +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, *note +itertools.permutations(iterable, r=None): 1320, removes this constraint +on the order, returning all possible arrangements of length `r': + + 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) + +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: + + itertools.permutations('aba', 3) => + ('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'), + ('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a') + +The identical tuple ‘('a', 'a', 'b')’ occurs twice, but the two ‘a’ +strings came from different positions. + +The *note itertools.combinations_with_replacement(iterable, r): f3b. +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. + + 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) + + +File: python.info, Node: Grouping elements, Prev: Combinatoric functions, Up: The itertools module + +10.6.6.5 Grouping elements +.......................... + +The last function I’ll discuss, *note itertools.groupby(iter, +key_func=None): 214e, is the most complicated. ‘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. + +*note groupby(): 214e. 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. + + 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') + +*note groupby(): 214e. 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. + + +File: python.info, Node: The functools module, Next: Small functions and the lambda expression, Prev: The itertools module, Up: Functional Programming HOWTO + +10.6.7 The functools module +--------------------------- + +The *note functools: 7f. module in Python 2.5 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 *note functools.partial(): b5b. 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 ‘f(a, b, c)’; you may +wish to create a new function ‘g(b, c)’ that’s equivalent to ‘f(1, b, +c)’; you’re filling in a value for one of ‘f()’’s parameters. This is +called “partial function application”. + +The constructor for *note partial(): b5b. takes the arguments +‘(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: + + 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') + +*note functools.reduce(func, iter, [initial_value]): f80. 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. *note +functools.reduce(): f80. takes the first two elements A and B returned +by the iterator and calculates ‘func(A, B)’. It then requests the third +element, C, calculates ‘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 *note TypeError: +19c. exception is raised. If the initial value is supplied, it’s used +as a starting point and ‘func(initial_value, A)’ is the first +calculation. + + >>> import operator, functools + >>> functools.reduce(operator.concat, ['A', 'BB', 'C']) + 'ABBC' + >>> functools.reduce(operator.concat, []) + Traceback (most recent call last): + ... + TypeError: reduce() of empty sequence with no initial value + >>> functools.reduce(operator.mul, [1, 2, 3], 1) + 6 + >>> functools.reduce(operator.mul, [], 1) + 1 + +If you use *note operator.add(): 2173. with *note functools.reduce(): +f80, you’ll add up all the elements of the iterable. This case is so +common that there’s a special built-in called *note sum(): 296. to +compute it: + + >>> import functools, operator + >>> functools.reduce(operator.add, [1, 2, 3, 4], 0) + 10 + >>> sum([1, 2, 3, 4]) + 10 + >>> sum([]) + 0 + +For many uses of *note functools.reduce(): f80, though, it can be +clearer to just write the obvious *note for: 199. loop: + + 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 + +A related function is *note itertools.accumulate(iterable, +func=operator.add): 643. It performs the same calculation, but instead +of returning only the final result, ‘accumulate()’ returns an iterator +that also yields each partial result: + + 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 + +* Menu: + +* The operator module:: + + +File: python.info, Node: The operator module, Up: The functools module + +10.6.7.1 The operator module +............................ + +The *note operator: c0. 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: + + * Math operations: ‘add()’, ‘sub()’, ‘mul()’, ‘floordiv()’, ‘abs()’, + … + + * Logical operations: ‘not_()’, ‘truth()’. + + * Bitwise operations: ‘and_()’, ‘or_()’, ‘invert()’. + + * Comparisons: ‘eq()’, ‘ne()’, ‘lt()’, ‘le()’, ‘gt()’, and ‘ge()’. + + * Object identity: ‘is_()’, ‘is_not()’. + +Consult the operator module’s documentation for a complete list. + + +File: python.info, Node: Small functions and the lambda expression, Next: Revision History and Acknowledgements, Prev: The functools module, Up: Functional Programming HOWTO + +10.6.8 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: + + stripped_lines = [line.strip() for line in lines] + existing_files = filter(os.path.exists, file_list) + +If the function you need doesn’t exist, you need to write it. One way +to write small functions is to use the *note lambda: f4b. expression. +‘lambda’ takes a number of parameters and an expression combining these +parameters, and creates an anonymous function that returns the value of +the expression: + + adder = lambda x, y: x+y + + print_assign = lambda name, value: name + '=' + str(value) + +An alternative is to just use the ‘def’ statement and define a function +in the usual way: + + def adder(x, y): + return x + y + + def print_assign(name, value): + return name + '=' + str(value) + +Which alternative is preferable? That’s a style question; my usual +course is to avoid using ‘lambda’. + +One reason for my preference is that ‘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 ‘if... elif... else’ +comparisons or ‘try... except’ statements. If you try to do too much in +a ‘lambda’ statement, you’ll end up with an overly complicated +expression that’s hard to read. Quick, what’s the following code doing? + + import functools + total = functools.reduce(lambda a, b: (0, a[1] + b[1]), items)[1] + +You can figure it out, but it takes time to disentangle the expression +to figure out what’s going on. Using a short nested ‘def’ statements +makes things a little bit better: + + import functools + def combine(a, b): + return 0, a[1] + b[1] + + total = functools.reduce(combine, items)[1] + +But it would be best of all if I had simply used a ‘for’ loop: + + total = 0 + for a, b in items: + total += b + +Or the *note sum(): 296. built-in and a generator expression: + + total = sum(b for a, b in items) + +Many uses of *note functools.reduce(): f80. are clearer when written as +‘for’ loops. + +Fredrik Lundh once suggested the following set of rules for refactoring +uses of ‘lambda’: + + 1. Write a lambda function. + + 2. Write a comment explaining what the heck that lambda does. + + 3. Study the comment for a while, and think of a name that captures + the essence of the comment. + + 4. Convert the lambda to a def statement, using that name. + + 5. Remove the comment. + +I really like these rules, but you’re free to disagree about whether +this lambda-free style is better. + + +File: python.info, Node: Revision History and Acknowledgements, Next: References<2>, Prev: Small functions and the lambda expression, Up: Functional Programming HOWTO + +10.6.9 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 ‘functional’ module written by +Collin Winter; adds short section on the operator module; a few other +edits. + + +File: python.info, Node: References<2>, Prev: Revision History and Acknowledgements, Up: Functional Programming HOWTO + +10.6.10 References +------------------ + +* Menu: + +* General:: +* Python-specific:: +* Python documentation:: + + +File: python.info, Node: General, Next: Python-specific, Up: References<2> + +10.6.10.1 General +................. + +`Structure and Interpretation of Computer Programs', by Harold Abelson +and Gerald Jay Sussman with Julie Sussman. Full text at +‘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. + +‘https://www.defmacro.org/ramblings/fp.html’: A general introduction to +functional programming that uses Java examples and has a lengthy +historical introduction. + +‘https://en.wikipedia.org/wiki/Functional_programming’: General +Wikipedia entry describing functional programming. + +‘https://en.wikipedia.org/wiki/Coroutine’: Entry for coroutines. + +‘https://en.wikipedia.org/wiki/Currying’: Entry for the concept of +currying. + + +File: python.info, Node: Python-specific, Next: Python documentation, Prev: General, Up: References<2> + +10.6.10.2 Python-specific +......................... + +‘https://gnosis.cx/TPiP/’: The first chapter of David Mertz’s book ‘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(1), part 2(2), and part 3(3), + + ---------- Footnotes ---------- + + (1) https://developer.ibm.com/articles/l-prog/ + + (2) https://developer.ibm.com/tutorials/l-prog2/ + + (3) https://developer.ibm.com/tutorials/l-prog3/ + + +File: python.info, Node: Python documentation, Prev: Python-specific, Up: References<2> + +10.6.10.3 Python documentation +.............................. + +Documentation for the *note itertools: a1. module. + +Documentation for the *note functools: 7f. module. + +Documentation for the *note operator: c0. module. + +PEP 289(1): “Generator Expressions” + +PEP 342(2): “Coroutines via Enhanced Generators” describes the new +generator features in Python 2.5. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0289/ + + (2) https://peps.python.org/pep-0342/ + + +File: python.info, Node: Logging HOWTO, Next: Logging Cookbook, Prev: Functional Programming HOWTO, Up: Python HOWTOs + +10.7 Logging HOWTO +================== + + +Author: Vinay Sajip + +* Menu: + +* Basic Logging Tutorial:: +* Advanced Logging Tutorial:: +* Logging Levels: Logging Levels<2>. +* Useful Handlers:: +* Exceptions raised during logging:: +* Using arbitrary objects as messages:: +* Optimization:: + + +File: python.info, Node: Basic Logging Tutorial, Next: Advanced Logging Tutorial, Up: Logging HOWTO + +10.7.1 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 from multiple modules:: +* Logging variable data:: +* Changing the format of displayed messages:: +* Displaying the date/time in messages:: +* Next Steps:: + + +File: python.info, Node: When to use logging, Next: A simple example, Up: Basic Logging Tutorial + +10.7.1.1 When to use logging +............................ + +Logging provides a set of convenience functions for simple logging +usage. These are *note debug(): 268e, *note info(): 26bb, *note +warning(): 26cd, *note error(): 26ce. and *note critical(): 26cf. To +determine when to use logging, see the table below, which states, for +each of a set of common tasks, the best tool to use for it. + +Task you want to perform The best tool for the task + +------------------------------------------------------------------------------------- + +Display console output for ordinary *note print(): c13. +usage of a command line script or +program + +Report events that occur during normal *note logging.info(): 26bb. (or +operation of a program (e.g. for *note logging.debug(): 268e. for very +status monitoring or fault detailed output for diagnostic purposes) +investigation) + +Issue a warning regarding a particular *note warnings.warn(): 1152. in library +runtime event code if the issue is avoidable and the + client application should be modified to + eliminate the warning + + *note logging.warning(): 26cd. if there + is nothing the client application can do + about the situation, but the event + should still be noted + + +Report an error regarding a particular Raise an exception +runtime event + +Report suppression of an error without *note logging.error(): 26ce, +raising an exception (e.g. error *note logging.exception(): 26d0. or +handler in a long-running server *note logging.critical(): 26cf. as +process) appropriate for the specific error and + application domain + + +The logging functions 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): + +Level When it’s used + +--------------------------------------------------------------------- + +‘DEBUG’ Detailed information, typically of interest + only when diagnosing problems. + + +‘INFO’ Confirmation that things are working as + expected. + + +‘WARNING’ 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. + + +‘ERROR’ Due to a more serious problem, the software has + not been able to perform some function. + + +‘CRITICAL’ A serious error, indicating that the program + itself may be unable to continue running. + + +The default level is ‘WARNING’, which means that only events of this +level and above 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. + + +File: python.info, Node: A simple example, Next: Logging to a file, Prev: When to use logging, Up: Basic Logging Tutorial + +10.7.1.2 A simple example +......................... + +A very simple example is: + + import logging + logging.warning('Watch out!') # will print a message to the console + logging.info('I told you so') # will not print anything + +If you type these lines into a script and run it, you’ll see: + + WARNING:root:Watch out! + +printed out on the console. The ‘INFO’ message doesn’t appear because +the default level is ‘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!’. Don’t worry about the ‘root’ part for +now: it will be explained later. The actual output can be formatted +quite flexibly if you need that; formatting options will also be +explained later. + + +File: python.info, Node: Logging to a file, Next: Logging from multiple modules, Prev: A simple example, Up: Basic Logging Tutorial + +10.7.1.3 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: + + import logging + logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) + logging.debug('This message should go to the log file') + logging.info('So should this') + logging.warning('And this, too') + logging.error('And non-ASCII stuff, too, like Øresund and Malmö') + +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 *note open(): 30b. 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 *note open(): 30b. + +And now if we open the file and look at what we have, we should find the +log messages: + + DEBUG:root:This message should go to the log file + INFO:root:So should this + WARNING:root:And this, too + ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö + +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 ‘DEBUG’, all of the messages were printed. + +If you want to set the logging level from a command-line option such as: + + --log=INFO + +and you have the value of the parameter passed for ‘--log’ in some +variable `loglevel', you can use: + + getattr(logging, loglevel.upper()) + +to get the value which you’ll pass to *note basicConfig(): 646. via the +`level' argument. You may want to error check any user input value, +perhaps as in the following 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, ...) + +The call to *note basicConfig(): 646. should come `before' any calls to +*note debug(): 268e, *note info(): 26bb, etc. Otherwise, those +functions will call *note basicConfig(): 646. for you with the default +options. As it’s intended as a one-off simple configuration facility, +only the first call will actually do anything: subsequent calls are +effectively no-ops. + +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: + + logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG) + +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. + + +File: python.info, Node: Logging from multiple modules, Next: Logging variable data, Prev: Logging to a file, Up: Basic Logging Tutorial + +10.7.1.4 Logging from multiple modules +...................................... + +If your program consists of multiple modules, here’s an example of how +you could organize logging in it: + + # myapp.py + import logging + import mylib + + def main(): + logging.basicConfig(filename='myapp.log', level=logging.INFO) + logging.info('Started') + mylib.do_something() + logging.info('Finished') + + if __name__ == '__main__': + main() + + # mylib.py + import logging + + def do_something(): + logging.info('Doing something') + +If you run `myapp.py', you should see this in `myapp.log': + + INFO:root:Started + INFO:root:Doing something + INFO:root:Finished + +which is hopefully what you were expecting to see. You can generalize +this to multiple modules, using the pattern in `mylib.py'. Note that +for this simple usage pattern, you won’t know, by looking in the log +file, `where' in your application your messages came from, apart from +looking at the event description. If you want to track the location of +your messages, you’ll need to refer to the documentation beyond the +tutorial level – see *note Advanced Logging Tutorial: ea6. + + +File: python.info, Node: Logging variable data, Next: Changing the format of displayed messages, Prev: Logging from multiple modules, Up: Basic Logging Tutorial + +10.7.1.5 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: + + import logging + logging.warning('%s before you %s', 'Look', 'leap!') + +will display: + + WARNING:root:Look before you leap! + +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 *note str.format(): 1fc. and *note string.Template: 259. +These newer formatting options `are' supported, but exploring them is +outside the scope of this tutorial: see *note Using particular +formatting styles throughout your application: 26b0. for more +information. + + +File: python.info, Node: Changing the format of displayed messages, Next: Displaying the date/time in messages, Prev: Logging variable data, Up: Basic Logging Tutorial + +10.7.1.6 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: + + 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') + +which would print: + + DEBUG:This message should appear on the console + INFO:So should this + WARNING:And this, too + +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 *note LogRecord +attributes: 268b, 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. + + +File: python.info, Node: Displaying the date/time in messages, Next: Next Steps, Prev: Changing the format of displayed messages, Up: Basic Logging Tutorial + +10.7.1.7 Displaying the date/time in messages +............................................. + +To display the date and time of an event, you would place ‘%(asctime)s’ +in your format string: + + import logging + logging.basicConfig(format='%(asctime)s %(message)s') + logging.warning('is when this event was logged.') + +which should print something like this: + + 2010-12-12 11:41:42,612 is when this event was logged. + +The default format for date/time display (shown above) is like ISO8601 +or RFC 3339(1). If you need more control over the formatting of the +date/time, provide a `datefmt' argument to ‘basicConfig’, as in this +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.') + +which would display something like this: + + 12/12/2010 11:46:36 AM is when this event was logged. + +The format of the `datefmt' argument is the same as supported by *note +time.strftime(): e99. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc3339.html + + +File: python.info, Node: Next Steps, Prev: Displaying the date/time in messages, Up: Basic Logging Tutorial + +10.7.1.8 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 on the +comp.lang.python Usenet group (available at +‘https://groups.google.com/forum/#!forum/comp.lang.python’) 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 *note Logging Cookbook: +ea7. + + +File: python.info, Node: Advanced Logging Tutorial, Next: Logging Levels<2>, Prev: Basic Logging Tutorial, Up: Logging HOWTO + +10.7.2 Advanced Logging Tutorial +-------------------------------- + +The logging library takes a modular approach and offers several +categories of components: loggers, handlers, filters, and formatters. + + * Loggers expose the interface that application code directly uses. + + * Handlers send the log records (created by loggers) to the + appropriate destination. + + * Filters provide a finer grained facility for determining which log + records to output. + + * Formatters specify the layout of log records in the final output. + +Log event information is passed between loggers, handlers, filters and +formatters in a *note LogRecord: c88. instance. + +Logging is performed by calling methods on instances of the *note +Logger: 7a9. 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: + + logger = logging.getLogger(__name__) + +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 *note debug(): 268e, *note info(): +26bb, *note warning(): 26cd, *note error(): 26ce. and *note critical(): +26cf, 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 *note +basicConfig(): 646. as in the tutorial examples. If you call the +functions *note debug(): 268e, *note info(): 26bb, *note warning(): +26cd, *note error(): 26ce. and *note critical(): 26cf, they will check +to see if no destination is set; and if one is not set, they will set a +destination of the console (‘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 *note basicConfig(): 646. for messages is: + + severity:logger name:message + +You can change this by passing a format string to *note basicConfig(): +646. with the `format' keyword argument. For all options regarding how +a format string is constructed, see *note Formatter Objects: 26ad. + +* Menu: + +* Logging Flow:: +* Loggers:: +* Handlers:: +* Formatters:: +* Configuring Logging:: +* What happens if no configuration is provided:: +* Configuring Logging for a Library:: + + +File: python.info, Node: Logging Flow, Next: Loggers, Up: Advanced Logging Tutorial + +10.7.2.1 Logging Flow +..................... + +The flow of log event information in loggers and handlers is illustrated +in the following diagram. + +[image src="python-figures/logging_flow.png"] + + + +File: python.info, Node: Loggers, Next: Handlers, Prev: Logging Flow, Up: Advanced Logging Tutorial + +10.7.2.2 Loggers +................ + +*note Logger: 7a9. 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: + + * *note Logger.setLevel(): 2688. 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. + + * *note Logger.addHandler(): 2694. and *note Logger.removeHandler(): + 2695. add and remove handler objects from the logger object. + Handlers are covered in more detail in *note Handlers: 488b. + + * *note Logger.addFilter(): 2691. and *note Logger.removeFilter(): + 2692. add and remove filter objects from the logger object. + Filters are covered in more detail in *note Filter Objects: 26b8. + +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: + + * *note Logger.debug(): aae, *note Logger.info(): 268d, *note + Logger.warning(): 268f, *note Logger.error(): 2690, and *note + Logger.critical(): aad. 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 ‘%s’, ‘%d’, ‘%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 ‘**kwargs’, + the logging methods care only about a keyword of ‘exc_info’ and use + it to determine whether to log exception information. + + * *note Logger.exception(): aac. creates a log message similar to + *note Logger.error(): 2690. The difference is that *note + Logger.exception(): aac. dumps a stack trace along with it. Call + this method only from an exception handler. + + * *note Logger.log(): aab. 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. + +*note getLogger(): 5b2. returns a reference to a logger instance with +the specified name if it is provided, or ‘root’ if not. The names are +period-separated hierarchical structures. Multiple calls to *note +getLogger(): 5b2. 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 ‘foo’, loggers with names of ‘foo.bar’, +‘foo.bar.baz’, and ‘foo.bam’ are all descendants of ‘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 (‘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 ‘False’.) + + +File: python.info, Node: Handlers, Next: Formatters, Prev: Loggers, Up: Advanced Logging Tutorial + +10.7.2.3 Handlers +................. + +*note Handler: 268c. objects are responsible for dispatching the +appropriate log messages (based on the log messages’ severity) to the +handler’s specified destination. *note Logger: 7a9. objects can add +zero or more handler objects to themselves with an *note addHandler(): +2694. 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 *note +Useful Handlers: 488d.); the tutorials use mainly *note StreamHandler: +ea8. and *note FileHandler: 129b. 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: + + * The *note setLevel(): 26a1. method, just as in logger objects, + specifies the lowest severity that will be dispatched to the + appropriate destination. Why are there two ‘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. + + * *note setFormatter(): 26a2. selects a Formatter object for this + handler to use. + + * *note addFilter(): 26a3. and *note removeFilter(): 26a4. + respectively configure and deconfigure filter objects on handlers. + +Application code should not directly instantiate and use instances of +*note Handler: 268c. Instead, the *note Handler: 268c. 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). + + +File: python.info, Node: Formatters, Next: Configuring Logging, Prev: Handlers, Up: Advanced Logging Tutorial + +10.7.2.4 Formatters +................... + +Formatter objects configure the final order, structure, and contents of +the log message. Unlike the base *note logging.Handler: 268c. 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. + + -- Method: logging.Formatter.__init__ (fmt=None, datefmt=None, + style='%') + +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: + + %Y-%m-%d %H:%M:%S + +with the milliseconds tacked on at the end. The ‘style’ is one of +‘'%'’, ‘'{'’, or ‘'$'’. If one of these is not specified, then ‘'%'’ +will be used. + +If the ‘style’ is ‘'%'’, the message format string uses ‘%()s’ styled string substitution; the possible keys are documented in +*note LogRecord attributes: 268b. If the style is ‘'{'’, the message +format string is assumed to be compatible with *note str.format(): 1fc. +(using keyword arguments), while if the style is ‘'$'’ then the message +format string should conform to what is expected by *note +string.Template.substitute(): 172d. + +Changed in version 3.2: Added the ‘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: + + '%(asctime)s - %(levelname)s - %(message)s' + +Formatters use a user-configurable function to convert the creation time +of a record to a tuple. By default, *note time.localtime(): 13ad. is +used; to change this for a particular formatter instance, set the +‘converter’ attribute of the instance to a function with the same +signature as *note time.localtime(): 13ad. or *note time.gmtime(): e73. +To change it for all formatters, for example if you want all logging +times to be shown in GMT, set the ‘converter’ attribute in the Formatter +class (to ‘time.gmtime’ for GMT display). + + +File: python.info, Node: Configuring Logging, Next: What happens if no configuration is provided, Prev: Formatters, Up: Advanced Logging Tutorial + +10.7.2.5 Configuring Logging +............................ + +Programmers can configure logging in three ways: + + 1. Creating loggers, handlers, and formatters explicitly using Python + code that calls the configuration methods listed above. + + 2. Creating a logging config file and reading it using the *note + fileConfig(): 7ab. function. + + 3. Creating a dictionary of configuration information and passing it + to the *note dictConfig(): e63. function. + +For the reference documentation on the last two options, see *note +Configuration functions: f98. The following example configures a very +simple logger, a console handler, and a simple formatter using Python +code: + + 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') + +Running this module from the command line produces the following output: + + $ 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 + +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: + + 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') + +Here is the logging.conf file: + + [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 + +The output is nearly identical to that of the non-config-file-based +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 + +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. + + Warning: The *note fileConfig(): 7ab. function takes a default + parameter, ‘disable_existing_loggers’, which defaults to ‘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 + *note fileConfig(): 7ab. 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 + ‘False’ for this parameter if you wish. + + The dictionary passed to *note dictConfig(): e63. can also specify + a Boolean value with key ‘disable_existing_loggers’, which if not + specified explicitly in the dictionary also defaults to being + interpreted as ‘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 ‘False’. + +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 *note +WatchedFileHandler: 2707. (relative to the logging module) or +‘mypackage.mymodule.MyHandler’ (for a class defined in package +‘mypackage’ and module ‘mymodule’, where ‘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: + + 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] + +For more information about logging using a dictionary, see *note +Configuration functions: f98. + + +File: python.info, Node: What happens if no configuration is provided, Next: Configuring Logging for a Library, Prev: Configuring Logging, Up: Advanced Logging Tutorial + +10.7.2.6 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 behaviour of the logging package in +these circumstances is dependent on the Python version. + +For versions of Python prior to 3.2, the behaviour is as follows: + + * If `logging.raiseExceptions' is ‘False’ (production mode), the + event is silently dropped. + + * If `logging.raiseExceptions' is ‘True’ (development mode), a + message ‘No handlers could be found for logger X.Y.Z’ is printed + once. + +In Python 3.2 and later, the behaviour is as follows: + + * The event is output using a ‘handler of last resort’, stored in + ‘logging.lastResort’. This internal handler is not associated with + any logger, and acts like a *note StreamHandler: ea8. which writes + the event description message to the current value of ‘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 ‘WARNING’, so + all events at this and greater severities will be output. + +To obtain the pre-3.2 behaviour, ‘logging.lastResort’ can be set to +‘None’. + + +File: python.info, Node: Configuring Logging for a Library, Prev: What happens if no configuration is provided, Up: Advanced Logging Tutorial + +10.7.2.7 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 ‘WARNING’ and greater will be printed to +‘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: *note +NullHandler: f3e. (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 ‘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: + + import logging + logging.getLogger('foo').addHandler(logging.NullHandler()) + +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’. + + 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 ‘__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. + + Note: It is strongly advised that you `do not add any handlers + other than' *note NullHandler: f3e. `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. + + +File: python.info, Node: Logging Levels<2>, Next: Useful Handlers, Prev: Advanced Logging Tutorial, Up: Logging HOWTO + +10.7.3 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. + +Level Numeric value + +--------------------------------------- + +‘CRITICAL’ 50 + + +‘ERROR’ 40 + + +‘WARNING’ 30 + + +‘INFO’ 20 + + +‘DEBUG’ 10 + + +‘NOTSET’ 0 + + +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 *note LogRecord: c88. +class. When a logger decides to actually log an event, a *note +LogRecord: c88. 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 *note Handler: +268c. class. Handlers are responsible for ensuring that a logged +message (in the form of a *note LogRecord: c88.) 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 *note LogRecord: c88. +instances intended for particular destinations. Each logger can have +zero, one or more handlers associated with it (via the *note +addHandler(): 2694. method of *note Logger: 7a9.). 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 *note +emit(): 26ab. method is used to send the message to its destination. +Most user-defined subclasses of *note Handler: 268c. will need to +override this *note emit(): 26ab. + +* Menu: + +* Custom Levels:: + + +File: python.info, Node: Custom Levels, Up: Logging Levels<2> + +10.7.3.1 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. + + +File: python.info, Node: Useful Handlers, Next: Exceptions raised during logging, Prev: Logging Levels<2>, Up: Logging HOWTO + +10.7.4 Useful Handlers +---------------------- + +In addition to the base *note Handler: 268c. class, many useful +subclasses are provided: + + 1. *note StreamHandler: ea8. instances send messages to streams + (file-like objects). + + 2. *note FileHandler: 129b. instances send messages to disk files. + + 3. *note BaseRotatingHandler: 270b. is the base class for handlers + that rotate log files at a certain point. It is not meant to be + instantiated directly. Instead, use *note RotatingFileHandler: + 26e7. or *note TimedRotatingFileHandler: bfc. + + 4. *note RotatingFileHandler: 26e7. instances send messages to disk + files, with support for maximum log file sizes and log file + rotation. + + 5. *note TimedRotatingFileHandler: bfc. instances send messages to + disk files, rotating the log file at certain timed intervals. + + 6. *note SocketHandler: bfd. instances send messages to TCP/IP + sockets. Since 3.4, Unix domain sockets are also supported. + + 7. *note DatagramHandler: bfe. instances send messages to UDP sockets. + Since 3.4, Unix domain sockets are also supported. + + 8. *note SMTPHandler: 2737. instances send messages to a designated + email address. + + 9. *note SysLogHandler: 22e. instances send messages to a Unix syslog + daemon, possibly on a remote machine. + + 10. *note NTEventLogHandler: 272f. instances send messages to a + Windows NT/2000/XP event log. + + 11. *note MemoryHandler: 26f0. instances send messages to a buffer in + memory, which is flushed whenever specific criteria are met. + + 12. *note HTTPHandler: aaf. instances send messages to an HTTP server + using either ‘GET’ or ‘POST’ semantics. + + 13. *note WatchedFileHandler: 2707. 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. + + 14. *note QueueHandler: 274a. instances send messages to a queue, such + as those implemented in the *note queue: d7. or *note + multiprocessing: b5. modules. + + 15. *note NullHandler: f3e. 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 *note Configuring Logging for a Library: + 2704. for more information. + +New in version 3.1: The *note NullHandler: f3e. class. + +New in version 3.2: The *note QueueHandler: 274a. class. + +The *note NullHandler: f3e, *note StreamHandler: ea8. and *note +FileHandler: 129b. classes are defined in the core logging package. The +other handlers are defined in a sub-module, *note logging.handlers: aa. +(There is also another sub-module, *note logging.config: a9, for +configuration functionality.) + +Logged messages are formatted for presentation through instances of the +*note Formatter: 1351. 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 +‘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 *note Filter: eaa. can be added to both *note Logger: 7a9. +and *note Handler: 268c. instances (through their *note addFilter(): +26a3. 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 *note Filter: eaa. 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. + + +File: python.info, Node: Exceptions raised during logging, Next: Using arbitrary objects as messages, Prev: Useful Handlers, Up: Logging HOWTO + +10.7.5 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. + +*note SystemExit: 9b6. and *note KeyboardInterrupt: 611. exceptions are +never swallowed. Other exceptions which occur during the *note emit(): +26ab. method of a *note Handler: 268c. subclass are passed to its *note +handleError(): 26aa. method. + +The default implementation of *note handleError(): 26aa. in *note +Handler: 268c. checks to see if a module-level variable, +‘raiseExceptions’, is set. If set, a traceback is printed to *note +sys.stderr: 581. If not set, the exception is swallowed. + + Note: The default value of ‘raiseExceptions’ is ‘True’. This is + because during development, you typically want to be notified of + any exceptions that occur. It’s advised that you set + ‘raiseExceptions’ to ‘False’ for production usage. + + +File: python.info, Node: Using arbitrary objects as messages, Next: Optimization, Prev: Exceptions raised during logging, Up: Logging HOWTO + +10.7.6 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 *note __str__(): 1f5. 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 *note SocketHandler: bfd. emits an event by pickling it +and sending it over the wire. + + +File: python.info, Node: Optimization, Prev: Using arbitrary objects as messages, Up: Logging HOWTO + +10.7.7 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 *note +isEnabledFor(): 268a. 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: + + if logger.isEnabledFor(logging.DEBUG): + logger.debug('Message with %s, %s', expensive_func1(), + expensive_func2()) + +so that if the logger’s threshold is set above ‘DEBUG’, the calls to +‘expensive_func1()’ and ‘expensive_func2()’ are never made. + + Note: In some cases, *note isEnabledFor(): 268a. 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 *note isEnabledFor(): + 268a. 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). + +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: + +What you don’t want to collect How to avoid collecting it + +------------------------------------------------------------------------------------------------------------------ + +Information about where calls were made from. Set ‘logging._srcfile’ to ‘None’. This avoids + calling *note sys._getframe(): 115c, which may help + to speed up your code in environments like PyPy + (which can’t speed up code that uses + *note sys._getframe(): 115c.). + + +Threading information. Set ‘logging.logThreads’ to ‘False’. + + +Current process ID (*note os.getpid(): 24d8.) Set ‘logging.logProcesses’ to ‘False’. + + +Current process name when using ‘multiprocessing’ to Set ‘logging.logMultiprocessing’ to ‘False’. +manage multiple processes. + +Also note that the core logging module only includes the basic handlers. +If you don’t import *note logging.handlers: aa. and *note +logging.config: a9, they won’t take up any memory. + +See also +........ + +Module *note logging: a8. + + API reference for the logging module. + +Module *note logging.config: a9. + + Configuration API for the logging module. + +Module *note logging.handlers: aa. + + Useful handlers included with the logging module. + +*note A logging cookbook: ea7. + + +File: python.info, Node: Logging Cookbook, Next: Regular Expression HOWTO, Prev: Logging HOWTO, Up: Python HOWTOs + +10.8 Logging Cookbook +===================== + + +Author: Vinay Sajip + +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 *note Other resources: 489c. + +* 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 - a ZeroMQ example:: +* Subclassing QueueListener - a ZeroMQ 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, 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:: +* Patterns to avoid:: +* Other resources:: + + +File: python.info, Node: Using logging in multiple modules, Next: Logging from multiple threads, Up: Logging Cookbook + +10.8.1 Using logging in multiple modules +---------------------------------------- + +Multiple calls to ‘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: + + 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()') + +Here is the auxiliary module: + + 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"') + +The output looks like this: + + 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() + + +File: python.info, Node: Logging from multiple threads, Next: Multiple handlers and formatters, Prev: Using logging in multiple modules, Up: Logging Cookbook + +10.8.2 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: + + 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() + +When run, the script should print something like the following: + + 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 + +This shows the logging output interspersed as one might expect. This +approach works for more threads than shown here, of course. + + +File: python.info, Node: Multiple handlers and formatters, Next: Logging to multiple destinations, Prev: Logging from multiple threads, Up: Logging Cookbook + +10.8.3 Multiple handlers and formatters +--------------------------------------- + +Loggers are plain Python objects. The *note addHandler(): 2694. 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: + + 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') + +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 ‘print’ statements for debugging, use +‘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. + + +File: python.info, Node: Logging to multiple destinations, Next: Custom handling of levels, Prev: Multiple handlers and formatters, Up: Logging Cookbook + +10.8.4 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: + + 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.') + +When you run this, on the console you will see + + 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. + +and in the file you will see something like + + 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. + +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 ‘/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. + + +File: python.info, Node: Custom handling of levels, Next: Configuration server example, Prev: Logging to multiple destinations, Up: Logging Cookbook + +10.8.5 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: + + * Send messages of severity ‘INFO’ and ‘WARNING’ to ‘sys.stdout’ + + * Send messages of severity ‘ERROR’ and above to ‘sys.stderr’ + + * Send messages of severity ‘DEBUG’ and above to file ‘app.log’ + +Suppose you configure logging with the following JSON: + + { + "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" + ] + } + } + +This configuration does `almost' what we want, except that ‘sys.stdout’ +would show messages of severity ‘ERROR’ and above as well as ‘INFO’ and +‘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 ‘filters’ section parallel to ‘formatters’ and +‘handlers’: + + "filters": { + "warnings_and_below": { + "()" : "__main__.filter_maker", + "level": "WARNING" + } + } + +and changing the section on the ‘stdout’ handler to add it: + + "stdout": { + "class": "logging.StreamHandler", + "level": "INFO", + "formatter": "simple", + "stream": "ext://sys.stdout", + "filters": ["warnings_and_below"] + } + +A filter is just a function, so we can define the ‘filter_maker’ (a +factory function) as follows: + + def filter_maker(level): + level = getattr(logging, level) + + def filter(record): + return record.levelno <= level + + return filter + +This converts the string argument passed in to a numeric level, and +returns a function which only returns ‘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 ‘filter_maker’ in a test script ‘main.py’ that I run +from the command line, so its module will be ‘__main__’ - hence the +‘__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 ‘main.py’, which in full is: + + import json + import logging + import logging.config + + CONFIG = ''' + { + "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" + ] + } + } + ''' + + 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') + +And after running it like this: + + python main.py 2>stderr.log >stdout.log + +We can see the results are as expected: + + $ 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 + + +File: python.info, Node: Configuration server example, Next: Dealing with handlers that block, Prev: Custom handling of levels, Up: Logging Cookbook + +10.8.6 Configuration server example +----------------------------------- + +Here is an example of a module using the logging configuration server: + + 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() + +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: + + #!/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') + + +File: python.info, Node: Dealing with handlers that block, Next: Sending and receiving logging events across a network, Prev: Configuration server example, Up: Logging Cookbook + +10.8.7 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 *note +SMTPHandler: 2737.: 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 *note SocketHandler: bfd. +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 *note QueueHandler: 274a. 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 *note +queue.Full: 299b. 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 +‘QueueHandlers’ to your loggers) for the benefit of other developers who +will use your code. + +The second part of the solution is *note QueueListener: ab0, which has +been designed as the counterpart to *note QueueHandler: 274a. A *note +QueueListener: ab0. 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 ‘QueueHandlers’ (or any other source of +‘LogRecords’, for that matter). The ‘LogRecords’ are removed from the +queue and passed to the handlers for processing. + +The advantage of having a separate *note QueueListener: ab0. class is +that you can use the same instance to service multiple ‘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): + + 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() + +which, when run, will produce: + + MainThread: Look out! + + 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 *note asyncio: 9. 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 + ‘QueueListener’ thread. + +Changed in version 3.5: Prior to Python 3.5, the *note QueueListener: +ab0. 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 ‘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. + + +File: python.info, Node: Sending and receiving logging events across a network, Next: Adding contextual information to your logging output, Prev: Dealing with handlers that block, Up: Logging Cookbook + +10.8.8 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 +*note SocketHandler: bfd. instance to the root logger at the sending +end: + + 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.') + +At the receiving end, you can set up a receiver using the *note +socketserver: ed. module. Here is a basic working 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() + +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: + + 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. + +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 ‘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:: + + +File: python.info, Node: Running a logging socket listener in production, Up: Sending and receiving logging events across a network + +10.8.8.1 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(1). Here(2) is a Gist which +provides the bare-bones files to run the above functionality using +Supervisor: you will need to change the ‘/path/to/’ parts in the Gist to +reflect the actual paths you want to use. + + ---------- Footnotes ---------- + + (1) http://supervisord.org/ + + (2) https://gist.github.com/vsajip/4b227eeec43817465ca835ca66f75e2b + + +File: python.info, Node: Adding contextual information to your logging output, Next: Use of contextvars, Prev: Sending and receiving logging events across a network, Up: Logging Cookbook + +10.8.9 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 ‘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 ‘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 +‘Logger’ instances becomes effectively unbounded. + +* Menu: + +* Using LoggerAdapters to impart contextual information:: +* Using Filters to impart contextual information:: + + +File: python.info, Node: Using LoggerAdapters to impart contextual information, Next: Using Filters to impart contextual information, Up: Adding contextual information to your logging output + +10.8.9.1 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 ‘LoggerAdapter’ +class. This class is designed to look like a ‘Logger’, so that you can +call ‘debug()’, ‘info()’, ‘warning()’, ‘error()’, ‘exception()’, +‘critical()’ and ‘log()’. These methods have the same signatures as +their counterparts in ‘Logger’, so you can use the two types of +instances interchangeably. + +When you create an instance of ‘LoggerAdapter’, you pass it a ‘Logger’ +instance and a dict-like object which contains your contextual +information. When you call one of the logging methods on an instance of +‘LoggerAdapter’, it delegates the call to the underlying instance of +‘Logger’ passed to its constructor, and arranges to pass the contextual +information in the delegated call. Here’s a snippet from the code of +‘LoggerAdapter’: + + 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) + +The ‘process()’ method of ‘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 ‘LogRecord’ instance’s __dict__, allowing you +to use customized strings with your ‘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 ‘LoggerAdapter’ and override +‘process()’ to do what you need. Here is a simple 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 + +which you can use like this: + + logger = logging.getLogger(__name__) + adapter = CustomAdapter(logger, {'connid': some_conn_id}) + +Then any events that you log to the adapter will have the value of +‘some_conn_id’ prepended to the log messages. + +* Menu: + +* Using objects other than dicts to pass contextual information:: + + +File: python.info, Node: Using objects other than dicts to pass contextual information, Up: Using LoggerAdapters to impart contextual information + +10.8.9.2 Using objects other than dicts to pass contextual information +...................................................................... + +You don’t need to pass an actual dict to a ‘LoggerAdapter’ - you could +pass an instance of a class which implements ‘__getitem__’ and +‘__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). + + +File: python.info, Node: Using Filters to impart contextual information, Prev: Using LoggerAdapters to impart contextual information, Up: Adding contextual information to your logging output + +10.8.9.3 Using Filters to impart contextual information +....................................................... + +You can also add contextual information to log output using a +user-defined ‘Filter’. ‘Filter’ instances are allowed to modify the +‘LogRecords’ passed to them, including adding additional attributes +which can then be output using a suitable format string, or if needed a +custom ‘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 +(*note threading.local: 28e7.) variable, and then accessed from a +‘Filter’ to add, say, information from the request - say, the remote IP +address and remote user’s username - to the ‘LogRecord’, using the +attribute names ‘ip’ and ‘user’ as in the ‘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: + + 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') + +which, when run, produces something like: + + 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 + + +File: python.info, Node: Use of contextvars, Next: Imparting contextual information in handlers, Prev: Adding contextual information to your logging output, Up: Logging Cookbook + +10.8.10 Use of ‘contextvars’ +---------------------------- + +Since Python 3.7, the *note contextvars: 23. module has provided +context-local storage which works for both *note threading: 10b. and +*note asyncio: 9. 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: + + # 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) + +We can simulate the multiple web applications by means of two simple +classes, ‘Request’ and ‘WebApp’. These simulate how real threaded web +applications work - each request is handled by a thread: + + # 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', 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() + +If you run the above, you should find that roughly half the requests go +into ‘app1.log’ and the rest into ‘app2.log’, and the all the requests +are logged to ‘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: + + ~/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 + + +File: python.info, Node: Imparting contextual information in handlers, Next: Logging to a single file from multiple processes, Prev: Use of contextvars, Up: Logging Cookbook + +10.8.11 Imparting contextual information in handlers +---------------------------------------------------- + +Each ‘Handler’ has its own chain of filters. If you want to add +contextual information to a ‘LogRecord’ without leaking it to other +handlers, you can use a filter that returns a new ‘LogRecord’ instead of +modifying it in-place, as shown in the following script: + + 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') + + +File: python.info, Node: Logging to a single file from multiple processes, Next: Using file rotation, Prev: Imparting contextual information in handlers, Up: Logging Cookbook + +10.8.12 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 +‘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.) *note This section: 48a7. 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 *note Lock: 297e. +class from the *note multiprocessing: b5. module to serialize access to +the file from your processes. The existing ‘FileHandler’ and subclasses +do not make use of *note multiprocessing: b5. at present, though they +may do so in the future. Note that at present, the *note +multiprocessing: b5. module does not provide working lock functionality +on all platforms (see ‘https://bugs.python.org/issue3770’). + +Alternatively, you can use a ‘Queue’ and a *note QueueHandler: 274a. 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: + + # 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() + +A variant of the above script keeps the logging in the main process, in +a separate thread: + + 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() + +This variant shows how you can e.g. apply configuration for particular +loggers - e.g. the ‘foo’ logger has a special handler which stores all +events in the ‘foo’ subsystem in a file ‘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:: + + +File: python.info, Node: Using concurrent futures ProcessPoolExecutor, Next: Deploying Web applications using Gunicorn and uWSGI, Up: Logging to a single file from multiple processes + +10.8.12.1 Using concurrent.futures.ProcessPoolExecutor +...................................................... + +If you want to use *note concurrent.futures.ProcessPoolExecutor: 52e. to +start your worker processes, you need to create the queue slightly +differently. Instead of + + queue = multiprocessing.Queue(-1) + +you should use + + queue = multiprocessing.Manager().Queue(-1) # also works with the examples above + +and you can then replace the worker creation from this: + + 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() + +to this (remembering to first import *note concurrent.futures: 20.): + + with concurrent.futures.ProcessPoolExecutor(max_workers=10) as executor: + for i in range(10): + executor.submit(worker_process, queue, worker_configurer) + + +File: python.info, Node: Deploying Web applications using Gunicorn and uWSGI, Prev: Using concurrent futures ProcessPoolExecutor, Up: Logging to a single file from multiple processes + +10.8.12.2 Deploying Web applications using Gunicorn and uWSGI +............................................................. + +When deploying Web applications using Gunicorn(1) or uWSGI(2) (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 *note SocketHandler: +bfd. 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 *note Running a logging socket listener in production: +48a9. for more details. + + ---------- Footnotes ---------- + + (1) https://gunicorn.org/ + + (2) https://uwsgi-docs.readthedocs.io/en/latest/ + + +File: python.info, Node: Using file rotation, Next: Use of alternative formatting styles, Prev: Logging to a single file from multiple processes, Up: Logging Cookbook + +10.8.13 Using file rotation +--------------------------- + +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 +‘RotatingFileHandler’: + + 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) + +The result should be 6 separate files, each with part of the log history +for the application: + + 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 + +The most current file is always ‘logging_rotatingfile_example.out’, and +each time it reaches the size limit it is renamed with the suffix ‘.1’. +Each of the existing backup files is renamed to increment the suffix +(‘.1’ becomes ‘.2’, etc.) and the ‘.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. + + +File: python.info, Node: Use of alternative formatting styles, Next: Customizing LogRecord, Prev: Using file rotation, Up: Logging Cookbook + +10.8.14 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: +*note string.Template: 259. (added in Python 2.4) and *note +str.format(): 1fc. (added in Python 2.6). + +Logging (as of 3.2) provides improved support for these two additional +formatting styles. The ‘Formatter’ class been enhanced to take an +additional, optional keyword parameter named ‘style’. This defaults to +‘'%'’, but other possible values are ‘'{'’ and ‘'$'’, 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 *note str.format(): 1fc. or *note +string.Template: 259. Here’s an example console session to show the +possibilities: + + >>> 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 + >>> + +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: + + >>> 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 + >>> + +Logging calls (‘logger.debug()’, ‘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 ‘exc_info’ keyword parameter to +indicate that traceback information should be logged, or the ‘extra’ +keyword parameter to indicate additional contextual information to be +added to the log). So you cannot directly make logging calls using +*note str.format(): 1fc. or *note string.Template: 259. 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 ‘str()’ on that object to get the actual +format string. Consider the following two classes: + + 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) + +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 *note gettext.gettext(): 10cb. 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 ‘wherever’): + + >>> 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 + >>> + +While the above examples use ‘print()’ to show how the formatting works, +you would of course use ‘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 XXXMessage classes. + +If you prefer, you can use a ‘LoggerAdapter’ to achieve a similar effect +to the above, as in the following 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 __init__(self, logger, extra=None): + super().__init__(logger, extra or {}) + + def log(self, level, msg, /, *args, **kwargs): + if self.isEnabledFor(level): + msg, kwargs = self.process(msg, kwargs) + self.logger._log(level, Message(msg, args), (), **kwargs) + + logger = StyleAdapter(logging.getLogger(__name__)) + + def main(): + logger.debug('Hello, {}', 'world!') + + if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + main() + +The above script should log the message ‘Hello, world!’ when run with +Python 3.2 or later. + + +File: python.info, Node: Customizing LogRecord, Next: Subclassing QueueHandler - a ZeroMQ example, Prev: Use of alternative formatting styles, Up: Logging Cookbook + +10.8.15 Customizing ‘LogRecord’ +------------------------------- + +Every logging event is represented by a *note LogRecord: c88. instance. +When an event is logged and not filtered out by a logger’s level, a +*note LogRecord: c88. 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: + + * *note Logger.makeRecord(): 2698, which is called in the normal + process of logging an event. This invoked *note LogRecord: c88. + directly to create an instance. + + * *note makeLogRecord(): 26bf, 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 *note SocketHandler: bfd, + or in JSON form via an *note HTTPHandler: aaf.). + +This has usually meant that if you need to do anything special with a +*note LogRecord: c88, you’ve had to do one of the following. + + * Create your own *note Logger: 7a9. subclass, which overrides *note + Logger.makeRecord(): 2698, and set it using *note setLoggerClass(): + 26cc. before any loggers that you care about are instantiated. + + * Add a *note Filter: eaa. to a logger or handler, which does the + necessary special manipulation you need when its *note filter(): + 26ba. method is called. + +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 *note Logger: 7a9. 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 *note LogRecord: c88. +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 + + logger = logging.getLogger(__name__) + +at module level). It’s probably one too many things to think about. +Developers could also add the filter to a *note NullHandler: f3e. +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, *note LogRecord: c88. creation is done through +a factory, which you can specify. The factory is just a callable you +can set with *note setLogRecordFactory(): 26c2, and interrogate with +*note getLogRecordFactory(): 26c1. The factory is invoked with the same +signature as the *note LogRecord: c88. constructor, as *note LogRecord: +c88. 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: + + old_factory = logging.getLogRecordFactory() + + def record_factory(*args, **kwargs): + record = old_factory(*args, **kwargs) + record.custom_attribute = 0xdecafbad + return record + + logging.setLogRecordFactory(record_factory) + +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 *note Filter: eaa. +does not provide the desired result. + + +File: python.info, Node: Subclassing QueueHandler - a ZeroMQ example, Next: Subclassing QueueListener - a ZeroMQ example, Prev: Customizing LogRecord, Up: Logging Cookbook + +10.8.16 Subclassing QueueHandler - a ZeroMQ example +--------------------------------------------------- + +You can use a ‘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’): + + 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) + +Of course there are other ways of organizing this, for example passing +in the data needed by the handler to create the socket: + + 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() + + +File: python.info, Node: Subclassing QueueListener - a ZeroMQ example, Next: An example dictionary-based configuration, Prev: Subclassing QueueHandler - a ZeroMQ example, Up: Logging Cookbook + +10.8.17 Subclassing QueueListener - a ZeroMQ example +---------------------------------------------------- + +You can also subclass ‘QueueListener’ to get messages from other kinds +of queues, for example a ZeroMQ ‘subscribe’ socket. Here’s an 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, '') # subscribe to everything + socket.connect(uri) + super().__init__(socket, *handlers, **kwargs) + + def dequeue(self): + msg = self.queue.recv_json() + return logging.makeLogRecord(msg) + +See also +........ + +Module *note logging: a8. + + API reference for the logging module. + +Module *note logging.config: a9. + + Configuration API for the logging module. + +Module *note logging.handlers: aa. + + Useful handlers included with the logging module. + +*note A basic logging tutorial: ea5. + +*note A more advanced logging tutorial: ea6. + + +File: python.info, Node: An example dictionary-based configuration, Next: Using a rotator and namer to customize log rotation processing, Prev: Subclassing QueueListener - a ZeroMQ example, Up: Logging Cookbook + +10.8.18 An example dictionary-based configuration +------------------------------------------------- + +Below is an example of a logging configuration dictionary - it’s taken +from the documentation on the Django project(1). This dictionary is +passed to *note dictConfig(): e63. to put the configuration into effect: + + LOGGING = { + 'version': 1, + 'disable_existing_loggers': True, + 'formatters': { + 'verbose': { + 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' + }, + 'simple': { + 'format': '%(levelname)s %(message)s' + }, + }, + 'filters': { + 'special': { + '()': 'project.logging.SpecialFilter', + 'foo': 'bar', + } + }, + 'handlers': { + 'null': { + 'level':'DEBUG', + 'class':'django.utils.log.NullHandler', + }, + 'console':{ + 'level':'DEBUG', + 'class':'logging.StreamHandler', + 'formatter': 'simple' + }, + 'mail_admins': { + 'level': 'ERROR', + 'class': 'django.utils.log.AdminEmailHandler', + 'filters': ['special'] + } + }, + 'loggers': { + 'django': { + 'handlers':['null'], + 'propagate': True, + 'level':'INFO', + }, + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': False, + }, + 'myproject.custom': { + 'handlers': ['console', 'mail_admins'], + 'level': 'INFO', + 'filters': ['special'] + } + } + } + +For more information about this configuration, you can see the relevant +section(2) of the Django documentation. + + ---------- Footnotes ---------- + + (1) +https://docs.djangoproject.com/en/stable/topics/logging/#configuring-logging + + (2) +https://docs.djangoproject.com/en/stable/topics/logging/#configuring-logging + + +File: python.info, Node: Using a rotator and namer to customize log rotation processing, Next: A more elaborate multiprocessing example, Prev: An example dictionary-based configuration, Up: Logging Cookbook + +10.8.19 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 snippet, which shows zlib-based compression of the log file: + + def namer(name): + return name + ".gz" + + def rotator(source, dest): + with open(source, "rb") as sf: + data = sf.read() + compressed = zlib.compress(data, 9) + with open(dest, "wb") as df: + df.write(compressed) + os.remove(source) + + rh = logging.handlers.RotatingFileHandler(...) + rh.rotator = rotator + rh.namer = namer + +These are not “true” .gz files, as they are bare compressed data, with +no “container” such as you’d find in an actual gzip file. This snippet +is just for illustration purposes. + + +File: python.info, Node: A more elaborate multiprocessing example, Next: Inserting a BOM into messages sent to a SysLogHandler, Prev: Using a rotator and namer to customize log rotation processing, Up: Logging Cookbook + +10.8.20 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: + + 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() + + +File: python.info, Node: Inserting a BOM into messages sent to a SysLogHandler, Next: Implementing structured logging, Prev: A more elaborate multiprocessing example, Up: Logging Cookbook + +10.8.21 Inserting a BOM into messages sent to a SysLogHandler +------------------------------------------------------------- + +RFC 5424(1) 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 relevant section of +the specification(2).) + +In Python 3.1, code was added to *note SysLogHandler: 22e. 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 RFC 5424(3)-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: + + 1. Attach a *note Formatter: 1351. instance to your *note + SysLogHandler: 22e. instance, with a format string such as: + + 'ASCII section\ufeffUnicode section' + + The Unicode code point U+FEFF, when encoded using UTF-8, will be + encoded as a UTF-8 BOM – the byte-string ‘b'\xef\xbb\xbf'’. + + 2. 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). + + 3. 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. + +The formatted message `will' be encoded using UTF-8 encoding by +‘SysLogHandler’. If you follow the above rules, you should be able to +produce RFC 5424(4)-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. + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc5424.html + + (2) https://datatracker.ietf.org/doc/html/rfc5424.html#section-6 + + (3) https://datatracker.ietf.org/doc/html/rfc5424.html + + (4) https://datatracker.ietf.org/doc/html/rfc5424.html + + +File: python.info, Node: Implementing structured logging, Next: Customizing handlers with dictConfig, Prev: Inserting a BOM into messages sent to a SysLogHandler, Up: Logging Cookbook + +10.8.22 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: + + 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)) + +If the above script is run, it prints: + + message 1 >>> {"fnum": 123.456, "num": 123, "bar": "baz", "foo": "bar"} + +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: + + 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() + +When the above script is run, it prints: + + message 1 >>> {"snowman": "\u2603", "set_value": [1, 2, 3]} + +Note that the order of items might be different according to the version +of Python used. + + +File: python.info, Node: Customizing handlers with dictConfig, Next: Using particular formatting styles throughout your application, Prev: Implementing structured logging, Up: Logging Cookbook + +10.8.23 Customizing handlers with ‘dictConfig()’ +------------------------------------------------ + +There are times when you want to customize logging handlers in +particular ways, and if you use *note dictConfig(): e63. 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 *note shutil.chown(): dda, but the file handlers in the stdlib +don’t offer built-in support. You can customize handler creation using +a plain function such as: + + 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) + +You can then specify, in a logging configuration passed to *note +dictConfig(): e63, that a logging handler be created by calling this +function: + + 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', + }, + } + +In this example I am setting the ownership using the ‘pulse’ user and +group, just for the purposes of illustration. Putting it together into +a working script, ‘chowntest.py’: + + 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') + +To run this, you will probably need to run as ‘root’: + + $ 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 + +Note that this example uses Python 3.3 because that’s where *note +shutil.chown(): dda. makes an appearance. This approach should work +with any Python version that supports *note dictConfig(): e63. - 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. *note os.chown(): d99. + +In practice, the handler-creating function may be in a utility module +somewhere in your project. Instead of the line in the configuration: + + '()': owned_file_handler, + +you could use e.g.: + + '()': 'ext://project.util.owned_file_handler', + +where ‘project.util’ can be replaced with the actual name of the package +where the function resides. In the above working script, using +‘'ext://__main__.owned_file_handler'’ should work. Here, the actual +callable is resolved by *note dictConfig(): e63. from the ‘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 *note os.chmod(): d98. + +Of course, the approach could also be extended to types of handler other +than a *note FileHandler: 129b. - for example, one of the rotating file +handlers, or a different type of handler altogether. + + +File: python.info, Node: Using particular formatting styles throughout your application, Next: Configuring filters with dictConfig, Prev: Customizing handlers with dictConfig, Up: Logging Cookbook + +10.8.24 Using particular formatting styles throughout your application +---------------------------------------------------------------------- + +In Python 3.2, the *note Formatter: 1351. gained a ‘style’ keyword +parameter which, while defaulting to ‘%’ for backward compatibility, +allowed the specification of ‘{’ or ‘$’ to support the formatting +approaches supported by *note str.format(): 1fc. and *note +string.Template: 259. 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 (*note debug(): aae, *note info(): 268d. 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 ‘exc_info’ keyword parameter to indicate +that traceback information should be logged, or the ‘extra’ keyword +parameter to indicate additional contextual information to be added to +the log). So you cannot directly make logging calls using *note +str.format(): 1fc. or *note string.Template: 259. syntax, because +internally the logging package uses %-formatting to merge the format +string and the variable arguments. There would 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:: + + +File: python.info, Node: Using LogRecord factories, Next: Using custom message objects, Up: Using particular formatting styles throughout your application + +10.8.24.1 Using LogRecord factories +................................... + +In Python 3.2, along with the *note Formatter: 1351. changes mentioned +above, the logging package gained the ability to allow users to set +their own *note LogRecord: c88. subclasses, using the *note +setLogRecordFactory(): 26c2. function. You can use this to set your own +subclass of *note LogRecord: c88, which does the Right Thing by +overriding the *note getMessage(): 26c0. method. The base class +implementation of this method is where the ‘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 ‘str(self.msg)’, just as the +base implementation does. + +Refer to the reference documentation on *note setLogRecordFactory(): +26c2. and *note LogRecord: c88. for more information. + + +File: python.info, Node: Using custom message objects, Prev: Using LogRecord factories, Up: Using particular formatting styles throughout your application + +10.8.24.2 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 *note Using arbitrary objects as messages: 26c4.) that when +logging you can use an arbitrary object as a message format string, and +that the logging package will call *note str(): 1b3. on that object to +get the actual format string. Consider the following two classes: + + 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) + +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 ‘M’ or ‘_’ for the message (or perhaps ‘__’, if +you are using ‘_’ for localization). + +Examples of this approach are given below. Firstly, formatting with +*note str.format(): 1fc.: + + >>> __ = 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) + +Secondly, formatting with *note string.Template: 259.: + + >>> __ = DollarMessage + >>> print(__('Message with $num $what', num=2, what='placeholders')) + Message with 2 placeholders + >>> + +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 ‘XXXMessage’ classes shown above. + + +File: python.info, Node: Configuring filters with dictConfig, Next: Customized exception formatting, Prev: Using particular formatting styles throughout your application, Up: Logging Cookbook + +10.8.25 Configuring filters with ‘dictConfig()’ +----------------------------------------------- + +You `can' configure filters using *note dictConfig(): e63, though it +might not be obvious at first glance how to do it (hence this recipe). +Since *note Filter: eaa. 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 +*note Filter: eaa. subclass with an overridden *note filter(): 26ba. +method. To do this, specify the ‘()’ 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 *note Filter: eaa. instance). Here is a +complete 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') + +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: + + changed: hello + +which shows that the filter is working as configured. + +A couple of extra points to note: + + * 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 ‘ext://...’ as described in *note Access to external objects: + 26ed. For example, you could have used the text + ‘'ext://__main__.MyFilter'’ instead of ‘MyFilter’ in the above + example. + + * As well as for filters, this technique can also be used to + configure custom handlers and formatters. See *note User-defined + objects: 26e2. for more information on how logging supports using + user-defined objects in its configuration, and see the other + cookbook recipe *note Customizing handlers with dictConfig(): 48c1. + above. + + +File: python.info, Node: Customized exception formatting, Next: Speaking logging messages, Prev: Configuring filters with dictConfig, Up: Logging Cookbook + +10.8.26 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: + + 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', '') + '|' + 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() + +When run, this produces a file with exactly two lines: + + 28/01/2015 07:21:23|INFO|Sample message| + 28/01/2015 07:21:23|ERROR|ZeroDivisionError: integer division or modulo by zero|'Traceback (most recent call last):\n File "logtest7.py", line 30, in main\n x = 1 / 0\nZeroDivisionError: integer division or modulo by zero'| + +While the above treatment is simplistic, it points the way to how +exception information can be formatted to your liking. The *note +traceback: 11d. module may be helpful for more specialized needs. + + +File: python.info, Node: Speaking logging messages, Next: Buffering logging messages and outputting them conditionally, Prev: Customized exception formatting, Up: Logging Cookbook + +10.8.27 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 *note subprocess: f6. 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 +‘espeak’ TTS package is available: + + 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()) + +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. + + +File: python.info, Node: Buffering logging messages and outputting them conditionally, Next: Sending logging messages to email with buffering, Prev: Speaking logging messages, Up: Logging Cookbook + +10.8.28 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 *note logging.handlers.MemoryHandler: 26f0, which allows +buffering of logged events until some condition occurs, at which point +the buffered events are ‘flushed’ - passed to another handler (the +‘target’ handler) for processing. By default, the ‘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 ‘MemoryHandler’ if you +want custom flushing behavior. + +The example script has a simple function, ‘foo’, which just cycles +through all the logging levels, writing to ‘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 ‘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 ‘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 *note StreamHandler: ea8. which writes to +‘sys.stderr’, ‘logging.ERROR’ and ‘100’ respectively. + +Here’s the script: + + 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) + +When this script is run, the following output should be observed: + + 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 + +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: + + @log_if_errors(logger) + def foo(fail=False): + ... + + +File: python.info, Node: Sending logging messages to email with buffering, Next: Formatting times using UTC GMT via configuration, Prev: Buffering logging messages and outputting them conditionally, Up: Logging Cookbook + +10.8.29 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 *note +BufferingHandler: 273c. 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 ‘-h’ argument to see the required and optional arguments.) + + 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() + +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. + + +File: python.info, Node: Formatting times using UTC GMT via configuration, Next: Using a context manager for selective logging, Prev: Sending logging messages to email with buffering, Up: Logging Cookbook + +10.8.30 Formatting times using UTC (GMT) via configuration +---------------------------------------------------------- + +Sometimes you want to format times using UTC, which can be done using a +class such as ‘UTCFormatter’, shown below: + + import logging + import time + + class UTCFormatter(logging.Formatter): + converter = time.gmtime + +and you can then use the ‘UTCFormatter’ in your code instead of *note +Formatter: 1351. If you want to do that via configuration, you can use +the *note dictConfig(): e63. API with an approach illustrated by the +following complete 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()) + +When this script is run, it should print something like: + + 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 + +showing how the time is formatted both as local time and UTC, one for +each handler. + + +File: python.info, Node: Using a context manager for selective logging, Next: A CLI application starter template, Prev: Formatting times using UTC GMT via configuration, Up: Logging Cookbook + +10.8.31 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: + + 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 + +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: + + 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.') + +We initially set the logger’s level to ‘INFO’, so message #1 appears and +message #2 doesn’t. We then change the level to ‘DEBUG’ temporarily in +the following ‘with’ block, and so message #3 appears. After the block +exits, the logger’s level is restored to ‘INFO’ and so message #4 +doesn’t appear. In the next ‘with’ block, we set the level to ‘DEBUG’ +again but also add a handler writing to ‘sys.stdout’. Thus, message #5 +appears twice on the console (once via ‘stderr’ and once via ‘stdout’). +After the ‘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: + + $ 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. + +If we run it again, but pipe ‘stderr’ to ‘/dev/null’, we see the +following, which is the only message written to ‘stdout’: + + $ python logctx.py 2>/dev/null + 5. This should appear twice - once on stderr and once on stdout. + +Once again, but piping ‘stdout’ to ‘/dev/null’, we get: + + $ 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. + +In this case, the message #5 printed to ‘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. + + +File: python.info, Node: A CLI application starter template, Next: A Qt GUI for logging, Prev: Using a context manager for selective logging, Up: Logging Cookbook + +10.8.32 A CLI application starter template +------------------------------------------ + +Here’s an example which shows how you can: + + * Use a logging level based on command-line arguments + + * Dispatch to multiple subcommands in separate files, all logging at + the same level in a consistent way + + * Make use of simple, minimal configuration + +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 ‘app.py’ that is the main script for the +application, with individual commands implemented in ‘start.py’, +‘stop.py’ and ‘restart.py’. Suppose further that we want to control the +verbosity of the application via a command-line argument, defaulting to +‘logging.INFO’. Here’s one way that ‘app.py’ could be written: + + 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\'' % 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()) + +And the ‘start’, ‘stop’ and ‘restart’ commands can be implemented in +separate modules, like so for starting: + + # 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) + +and thus for stopping: + + # stop.py + import logging + + logger = logging.getLogger(__name__) + + def command(options): + n = len(options.names) + if n == 1: + plural = '' + services = '\'%s\'' % options.names[0] + else: + plural = 's' + services = ', '.join('\'%s\'' % 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) + +and similarly for restarting: + + # restart.py + import logging + + logger = logging.getLogger(__name__) + + def command(options): + n = len(options.names) + if n == 1: + plural = '' + services = '\'%s\'' % options.names[0] + else: + plural = 's' + services = ', '.join('\'%s\'' % 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) + +If we run this application with the default log level, we get output +like this: + + $ 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. + +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: + + $ 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. + +And if we want less: + + $ 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 + +In this case, the commands don’t print anything to the console, since +nothing at ‘WARNING’ level or above is logged by them. + + +File: python.info, Node: A Qt GUI for logging, Next: Logging to syslog with RFC5424 support, Prev: A CLI application starter template, Up: Logging Cookbook + +10.8.33 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(1) framework is a popular cross-platform UI +framework with Python bindings using PySide2(2) or PyQt5(3) libraries. + +The following example shows how to log to a Qt GUI. This introduces a +simple ‘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 ‘QThread’ class rather than +the *note threading: 10b. module, as there are circumstances where one +has to use ‘QThread’, which offers better integration with other ‘Qt’ +components. + +The code should work with recent releases of either ‘PySide2’ or +‘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. + + import datetime + import logging + import random + import sys + import time + + # Deal with minor differences between PySide2 and PyQt5 + 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) + level = random.choice(LEVELS) + logger.log(level, 'Message after delay of %3.1f: %d', delay, i, 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') + f.setStyleHint(f.Monospace) + 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 = '

    %s
    ' % (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() + sys.exit(app.exec_()) + + if __name__=='__main__': + main() + + ---------- Footnotes ---------- + + (1) https://www.qt.io/ + + (2) https://pypi.org/project/PySide2/ + + (3) https://pypi.org/project/PyQt5/ + + +File: python.info, Node: Logging to syslog with RFC5424 support, Next: How to treat a logger like an output stream, Prev: A Qt GUI for logging, Up: Logging Cookbook + +10.8.34 Logging to syslog with RFC5424 support +---------------------------------------------- + +Although RFC 5424(1) dates from 2009, most syslog servers are configured +by detault to use the older RFC 3164(2), which hails from 2001. When +‘logging’ was added to Python in 2003, it supported the earlier (and +only existing) protocol at the time. Since RFC5424 came out, as there +has not been widespread deployment of it in syslog servers, the *note +SysLogHandler: 22e. 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: + + import datetime + 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 = datetime.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 = ''.join(parts) + return f'{version} {asctime} {hostname} {appname} {procid} {msgid} {sdata} {msg}' + +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: + + 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) + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc5424.html + + (2) https://datatracker.ietf.org/doc/html/rfc3164.html + + +File: python.info, Node: How to treat a logger like an output stream, Next: Patterns to avoid, Prev: Logging to syslog with RFC5424 support, Up: Logging Cookbook + +10.8.35 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: + + 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() + +When this script is run, it prints + + INFO:demo:An INFO message + DEBUG:demo:A DEBUG message + +You could also use ‘LoggerWriter’ to redirect ‘sys.stdout’ and +‘sys.stderr’ by doing something like this: + + import sys + + sys.stdout = LoggerWriter(logger, logging.INFO) + sys.stderr = LoggerWriter(logger, logging.WARNING) + +You should do this `after' configuring logging for your needs. In the +above example, the *note basicConfig(): 646. call does this (using the +‘sys.stderr’ value `before' it is overwritten by a ‘LoggerWriter’ +instance). Then, you’d get this kind of result: + + >>> print('Foo') + INFO:demo:Foo + >>> print('Bar', file=sys.stderr) + WARNING:demo:Bar + >>> + +Of course, these above examples show output according to the format used +by *note basicConfig(): 646, but you can use a different formatter when +you configure logging. + + +File: python.info, Node: Patterns to avoid, Next: Other resources, Prev: How to treat a logger like an output stream, Up: Logging Cookbook + +10.8.36 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:: + + +File: python.info, Node: Opening the same log file multiple times, Next: Using loggers as attributes in a class or passing them as parameters, Up: Patterns to avoid + +10.8.36.1 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: + + * Adding a file handler more than once which references the same file + (e.g. by a copy/paste/forget-to-change error). + + * Opening two files that look different, as they have different + names, but are the same because one is a symbolic link to the + other. + + * Forking a process, following which both parent and child have a + reference to the same file. This might be through use of the *note + multiprocessing: b5. module, for example. + +Opening a file multiple times might `appear' to work most of the time, +but can lead to a number of problems in practice: + + * 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. + + * 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. + +Use the techniques outlined in *note Logging to a single file from +multiple processes: 48b1. to circumvent such issues. + + +File: python.info, Node: Using loggers as attributes in a class or passing them as parameters, Next: Adding handlers other than NullHandler to a logger in a library, Prev: Opening the same log file multiple times, Up: Patterns to avoid + +10.8.36.2 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 +‘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. + + +File: python.info, Node: Adding handlers other than NullHandler to a logger in a library, Next: Creating a lot of loggers, Prev: Using loggers as attributes in a class or passing them as parameters, Up: Patterns to avoid + +10.8.36.3 Adding handlers other than ‘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 *note NullHandler: f3e. instance. + + +File: python.info, Node: Creating a lot of loggers, Prev: Adding handlers other than NullHandler to a logger in a library, Up: Patterns to avoid + +10.8.36.4 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 *note existing mechanisms: 26c7. 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). + + +File: python.info, Node: Other resources, Prev: Patterns to avoid, Up: Logging Cookbook + +10.8.37 Other resources +----------------------- + +See also +........ + +Module *note logging: a8. + + API reference for the logging module. + +Module *note logging.config: a9. + + Configuration API for the logging module. + +Module *note logging.handlers: aa. + + Useful handlers included with the logging module. + +*note Basic Tutorial: ea5. + +*note Advanced Tutorial: ea6. + + +File: python.info, Node: Regular Expression HOWTO, Next: Socket Programming HOWTO, Prev: Logging Cookbook, Up: Python HOWTOs + +10.9 Regular Expression HOWTO +============================= + + +Author: A.M. Kuchling <> + +Abstract +........ + +This document is an introductory tutorial to using regular expressions +in Python with the *note re: da. module. It provides a gentler +introduction than the corresponding section in the Library Reference. + +* Menu: + +* Introduction: Introduction<14>. +* Simple Patterns:: +* Using Regular Expressions:: +* More Pattern Power:: +* Modifying Strings:: +* Common Problems:: +* Feedback:: + + +File: python.info, Node: Introduction<14>, Next: Simple Patterns, Up: Regular Expression HOWTO + +10.9.1 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 *note re: da. 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. + + +File: python.info, Node: Simple Patterns, Next: Using Regular Expressions, Prev: Introduction<14>, Up: Regular Expression HOWTO + +10.9.2 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:: + + +File: python.info, Node: Matching Characters, Next: Repeating Things, Up: Simple Patterns + +10.9.2.1 Matching Characters +............................ + +Most letters and characters will simply match themselves. For example, +the regular expression ‘test’ will match the string ‘test’ exactly. +(You can enable a case-insensitive mode that would let this RE match +‘Test’ or ‘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. + + . ^ $ * + ? { } [ ] \ | ( ) + +The first metacharacters we’ll look at are ‘[’ and ‘]’. 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 ‘'-'’. For example, ‘[abc]’ will match any of the characters ‘a’, +‘b’, or ‘c’; this is the same as ‘[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 ‘[a-z]’. + +Metacharacters (except ‘\’) are not active inside classes. For example, +‘[akm$]’ will match any of the characters ‘'a'’, ‘'k'’, ‘'m'’, or ‘'$'’; +‘'$'’ 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 ‘'^'’ as the +first character of the class. For example, ‘[^5]’ will match any +character except ‘'5'’. If the caret appears elsewhere in a character +class, it does not have special meaning. For example: ‘[5^]’ will match +either a ‘'5'’ or a ‘'^'’. + +Perhaps the most important metacharacter is the backslash, ‘\’. 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 ‘[’ or ‘\’, you can precede them +with a backslash to remove their special meaning: ‘\[’ or ‘\\’. + +Some of the special sequences beginning with ‘'\'’ 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: ‘\w’ matches any alphanumeric character. If the +regex pattern is expressed in bytes, this is equivalent to the class +‘[a-zA-Z0-9_]’. If the regex pattern is a string, ‘\w’ will match all +the characters marked as letters in the Unicode database provided by the +*note unicodedata: 124. module. You can use the more restricted +definition of ‘\w’ in a string pattern by supplying the *note re.ASCII: +207. 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 *note Regular Expression Syntax: 318. in +the Standard Library reference. In general, the Unicode versions match +any character that’s in the appropriate category in the Unicode +database. + +‘\d’ + + Matches any decimal digit; this is equivalent to the class ‘[0-9]’. + +‘\D’ + + Matches any non-digit character; this is equivalent to the class + ‘[^0-9]’. + +‘\s’ + + Matches any whitespace character; this is equivalent to the class + ‘[ \t\n\r\f\v]’. + +‘\S’ + + Matches any non-whitespace character; this is equivalent to the + class ‘[^ \t\n\r\f\v]’. + +‘\w’ + + Matches any alphanumeric character; this is equivalent to the class + ‘[a-zA-Z0-9_]’. + +‘\W’ + + Matches any non-alphanumeric character; this is equivalent to the + class ‘[^a-zA-Z0-9_]’. + +These sequences can be included inside a character class. For example, +‘[\s,.]’ is a character class that will match any whitespace character, +or ‘','’ or ‘'.'’. + +The final metacharacter in this section is ‘.’. It matches anything +except a newline character, and there’s an alternate mode (*note +re.DOTALL: 1d56.) where it will match even a newline. ‘.’ is often used +where you want to match “any character”. + + +File: python.info, Node: Repeating Things, Prev: Matching Characters, Up: Simple Patterns + +10.9.2.2 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 ‘*’. +‘*’ doesn’t match the literal character ‘'*'’; instead, it specifies +that the previous character can be matched zero or more times, instead +of exactly once. + +For example, ‘ca*t’ will match ‘'ct'’ (0 ‘'a'’ characters), ‘'cat'’ (1 +‘'a'’), ‘'caaat'’ (3 ‘'a'’ characters), and so forth. + +Repetitions such as ‘*’ 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 ‘a[bcd]*b’. This matches the letter ‘'a'’, zero or more +letters from the class ‘[bcd]’, and finally ends with a ‘'b'’. Now +imagine matching this RE against the string ‘'abcbd'’. + +Step Matched Explanation + +----------------------------------------------------------------- + +1 ‘a’ The ‘a’ in the RE matches. + + +2 ‘abcbd’ The engine matches ‘[bcd]*’, going + as far as it can, which is to the + end of the string. + + +3 `Failure' The engine tries to match ‘b’, but + the current position is at the end + of the string, so it fails. + + +4 ‘abcb’ Back up, so that ‘[bcd]*’ matches + one less character. + + +5 `Failure' Try ‘b’ again, but the current + position is at the last character, + which is a ‘'d'’. + + +6 ‘abc’ Back up again, so that ‘[bcd]*’ is + only matching ‘bc’. + + +6 ‘abcb’ Try ‘b’ again. This time the + character at the current position + is ‘'b'’, so it succeeds. + + +The end of the RE has now been reached, and it has matched ‘'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 ‘[bcd]*’, and if that subsequently fails, the +engine will conclude that the string doesn’t match the RE at all. + +Another repeating metacharacter is ‘+’, which matches one or more times. +Pay careful attention to the difference between ‘*’ and ‘+’; ‘*’ matches +`zero' or more times, so whatever’s being repeated may not be present at +all, while ‘+’ requires at least `one' occurrence. To use a similar +example, ‘ca+t’ will match ‘'cat'’ (1 ‘'a'’), ‘'caaat'’ (3 ‘'a'’s), but +won’t match ‘'ct'’. + +There are two more repeating operators or quantifiers. The question +mark character, ‘?’, matches either once or zero times; you can think of +it as marking something as being optional. For example, ‘home-?brew’ +matches either ‘'homebrew'’ or ‘'home-brew'’. + +The most complicated quantifier is ‘{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, ‘a/{1,3}b’ will match +‘'a/b'’, ‘'a//b'’, and ‘'a///b'’. It won’t match ‘'ab'’, which has no +slashes, or ‘'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. + +Readers of a reductionist bent may notice that the three other +quantifiers can all be expressed using this notation. ‘{0,}’ is the +same as ‘*’, ‘{1,}’ is equivalent to ‘+’, and ‘{0,1}’ is the same as +‘?’. It’s better to use ‘*’, ‘+’, or ‘?’ when you can, simply because +they’re shorter and easier to read. + + +File: python.info, Node: Using Regular Expressions, Next: More Pattern Power, Prev: Simple Patterns, Up: Regular Expression HOWTO + +10.9.3 Using Regular Expressions +-------------------------------- + +Now that we’ve looked at some simple regular expressions, how do we +actually use them in Python? The *note re: da. 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:: + + +File: python.info, Node: Compiling Regular Expressions, Next: The Backslash Plague, Up: Using Regular Expressions + +10.9.3.1 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. + + >>> import re + >>> p = re.compile('ab*') + >>> p + re.compile('ab*') + +*note re.compile(): 83a. 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: + + >>> p = re.compile('ab*', re.IGNORECASE) + +The RE is passed to *note re.compile(): 83a. 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 +*note re: da. module is simply a C extension module included with +Python, just like the *note socket: ec. or *note zlib: 14f. modules. + +Putting REs in strings keeps the Python language simpler, but has one +disadvantage which is the topic of the next section. + + +File: python.info, Node: The Backslash Plague, Next: Performing Matches, Prev: Compiling Regular Expressions, Up: Using Regular Expressions + +10.9.3.2 The Backslash Plague +............................. + +As stated earlier, regular expressions use the backslash character +(‘'\'’) 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 ‘\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 ‘\\section’. The +resulting string that must be passed to *note re.compile(): 83a. must be +‘\\section’. However, to express this as a Python string literal, both +backslashes must be escaped `again'. + +Characters Stage + +----------------------------------------------------------------------- + +‘\section’ Text string to be matched + + +‘\\section’ Escaped backslash for + *note re.compile(): 83a. + + +‘"\\\\section"’ Escaped backslashes for a string literal + + +In short, to match a literal backslash, one has to write ‘'\\\\'’ as the +RE string, because the regular expression must be ‘\\’, and each +backslash must be expressed as ‘\\’ 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 ‘'r'’, so ‘r"\n"’ is a two-character string +containing ‘'\'’ and ‘'n'’, while ‘"\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 +*note DeprecationWarning: 2d4. and will eventually become a *note +SyntaxError: 2d6, which means the sequences will be invalid if raw +string notation or escaping the backslashes isn’t used. + +Regular String Raw string + +----------------------------------------------- + +‘"ab*"’ ‘r"ab*"’ + + +‘"\\\\section"’ ‘r"\\section"’ + + +‘"\\w+\\s+\\1"’ ‘r"\w+\s+\1"’ + + + +File: python.info, Node: Performing Matches, Next: Module-Level Functions<2>, Prev: The Backslash Plague, Up: Using Regular Expressions + +10.9.3.3 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 *note +re: da. docs for a complete listing. + +Method/Attribute Purpose + +--------------------------------------------------------------------------- + +‘match()’ Determine if the RE matches at the beginning of + the string. + + +‘search()’ Scan through a string, looking for any location + where this RE matches. + + +‘findall()’ Find all substrings where the RE matches, and + returns them as a list. + + +‘finditer()’ Find all substrings where the RE matches, and + returns them as an *note iterator: 134f. + + +*note match(): 1d65. and *note search(): 1d66. return ‘None’ if no match +can be found. If they’re successful, a *note match object: c25. +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 *note +re: da. module. If you have *note tkinter: 10e. available, you may also +want to look at Tools/demo/redemo.py(1), a demonstration program +included with the Python distribution. It allows you to enter REs and +strings, and displays whether the RE matches or fails. ‘redemo.py’ can +be quite useful when trying to debug a complicated RE. + +This HOWTO uses the standard Python interpreter for its examples. +First, run the Python interpreter, import the *note re: da. module, and +compile a RE: + + >>> import re + >>> p = re.compile('[a-z]+') + >>> p + re.compile('[a-z]+') + +Now, you can try matching various strings against the RE ‘[a-z]+’. An +empty string shouldn’t match at all, since ‘+’ means ‘one or more +repetitions’. *note match(): 1d65. should return ‘None’ in this case, +which will cause the interpreter to print no output. You can explicitly +print the result of ‘match()’ to make this clear. + + >>> p.match("") + >>> print(p.match("")) + None + +Now, let’s try it on a string that it should match, such as ‘tempo’. In +this case, *note match(): 1d65. will return a *note match object: c25, +so you should store the result in a variable for later use. + + >>> m = p.match('tempo') + >>> m + + +Now you can query the *note match object: c25. for information about the +matching string. Match object instances also have several methods and +attributes; the most important ones are: + +Method/Attribute Purpose + +------------------------------------------------------------------------ + +‘group()’ Return the string matched by the RE + + +‘start()’ Return the starting position of the match + + +‘end()’ Return the ending position of the match + + +‘span()’ Return a tuple containing the (start, end) + positions of the match + + +Trying these methods will soon clarify their meaning: + + >>> m.group() + 'tempo' + >>> m.start(), m.end() + (0, 5) + >>> m.span() + (0, 5) + +*note group(): 1d76. returns the substring that was matched by the RE. +*note start(): 1d7a. and *note end(): 1d7b. return the starting and +ending index of the match. *note span(): 1d7c. returns both start and +end indexes in a single tuple. Since the *note match(): 1d65. method +only checks if the RE matches at the start of a string, ‘start()’ will +always be zero. However, the *note search(): 1d66. method of patterns +scans through the string, so the match may not start at zero in that +case. + + >>> print(p.match('::: message')) + None + >>> m = p.search('::: message'); print(m) + + >>> m.group() + 'message' + >>> m.span() + (4, 11) + +In actual programs, the most common style is to store the *note match +object: c25. in a variable, and then check if it was ‘None’. This +usually looks like: + + p = re.compile( ... ) + m = p.match( 'string goes here' ) + if m: + print('Match found: ', m.group()) + else: + print('No match') + +Two pattern methods return all of the matches for a pattern. *note +findall(): 1d6c. returns a list of matching strings: + + >>> p = re.compile(r'\d+') + >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') + ['12', '11', '10'] + +The ‘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 *note DeprecationWarning: 2d4. and will +eventually become a *note SyntaxError: 2d6. See *note The Backslash +Plague: 48e9. + +*note findall(): 1d6c. has to create the entire list before it can be +returned as the result. The *note finditer(): 1d6d. method returns a +sequence of *note match object: c25. instances as an *note iterator: +134f.: + + >>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...') + >>> iterator + + >>> for match in iterator: + ... print(match.span()) + ... + (0, 2) + (22, 24) + (29, 31) + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Tools/demo/redemo.py + + +File: python.info, Node: Module-Level Functions<2>, Next: Compilation Flags, Prev: Performing Matches, Up: Using Regular Expressions + +10.9.3.4 Module-Level Functions +............................... + +You don’t have to create a pattern object and call its methods; the +*note re: da. module also provides top-level functions called *note +match(): ee0, *note search(): edf, *note findall(): cd6, *note sub(): +85d, 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 ‘None’ or a *note match object: c25. +instance. + + >>> print(re.match(r'From\s+', 'Fromage amk')) + None + >>> re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998') + + +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. + + +File: python.info, Node: Compilation Flags, Prev: Module-Level Functions<2>, Up: Using Regular Expressions + +10.9.3.5 Compilation Flags +.......................... + +Compilation flags let you modify some aspects of how regular expressions +work. Flags are available in the *note re: da. module under two names, +a long name such as ‘IGNORECASE’ and a short, one-letter form such as +‘I’. (If you’re familiar with Perl’s pattern modifiers, the one-letter +forms use the same letters; the short form of *note re.VERBOSE: 1d63. is +*note re.X: 1d5d, for example.) Multiple flags can be specified by +bitwise OR-ing them; ‘re.I | re.M’ sets both the ‘I’ and ‘M’ flags, for +example. + +Here’s a table of the available flags, followed by a more detailed +explanation of each one. + +Flag Meaning + +--------------------------------------------------------------------------------------- + +‘ASCII’, ‘A’ Makes several escapes like ‘\w’, ‘\b’, ‘\s’ + and ‘\d’ match only on ASCII characters with + the respective property. + + +‘DOTALL’, ‘S’ Make ‘.’ match any character, including + newlines. + + +‘IGNORECASE’, ‘I’ Do case-insensitive matches. + + +‘LOCALE’, ‘L’ Do a locale-aware match. + + +‘MULTILINE’, ‘M’ Multi-line matching, affecting ‘^’ and ‘$’. + + +‘VERBOSE’, ‘X’ (for ‘extended’) Enable verbose REs, which can be organized + more cleanly and understandably. + + + -- Data: I + + -- Data: IGNORECASE + + Perform case-insensitive matching; character class and literal + strings will match letters by ignoring case. For example, ‘[A-Z]’ + will match lowercase letters, too. Full Unicode matching also + works unless the ‘ASCII’ flag is used to disable non-ASCII matches. + When the Unicode patterns ‘[a-z]’ or ‘[A-Z]’ are used in + combination with the ‘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 ‘K’ + (U+212A, Kelvin sign). ‘Spam’ will match ‘'Spam'’, ‘'spam'’, + ‘'spAM'’, or ‘'ſ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 ‘LOCALE’ flag. + + -- Data: L + + -- Data: LOCALE + + Make ‘\w’, ‘\W’, ‘\b’, ‘\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 ‘\w+’ to match words, but ‘\w’ only matches the character + class ‘[A-Za-z]’ in bytes patterns; it won’t match bytes + corresponding to ‘é’ or ‘ç’. If your system is configured properly + and a French locale is selected, certain C functions will tell the + program that the byte corresponding to ‘é’ should also be + considered a letter. Setting the ‘LOCALE’ flag when compiling a + regular expression will cause the resulting compiled object to use + these C functions for ‘\w’; this is slower, but also enables ‘\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. + + -- Data: M + + -- Data: MULTILINE + + (‘^’ and ‘$’ haven’t been explained yet; they’ll be introduced in + section *note More Metacharacters: 48ed.) + + Usually ‘^’ matches only at the beginning of the string, and ‘$’ + 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, ‘^’ matches at the beginning of the string and at the + beginning of each line within the string, immediately following + each newline. Similarly, the ‘$’ metacharacter matches either at + the end of the string and at the end of each line (immediately + preceding each newline). + + -- Data: S + + -- Data: DOTALL + + Makes the ‘'.'’ special character match any character at all, + including a newline; without this flag, ‘'.'’ will match anything + `except' a newline. + + -- Data: A + + -- Data: ASCII + + Make ‘\w’, ‘\W’, ‘\b’, ‘\B’, ‘\s’ and ‘\S’ perform ASCII-only + matching instead of full Unicode matching. This is only meaningful + for Unicode patterns, and is ignored for byte patterns. + + -- Data: X + + -- Data: 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 ‘'#'’ that’s neither in a character class or + preceded by an unescaped backslash. + + For example, here’s a RE that uses *note re.VERBOSE: 1d63.; see how + much easier it is to read? + + 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) + + Without the verbose setting, the RE would look like this: + + charref = re.compile("&#(0[0-7]+" + "|[0-9]+" + "|x[0-9a-fA-F]+);") + + 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 + *note re.VERBOSE: 1d63. + + +File: python.info, Node: More Pattern Power, Next: Modifying Strings, Prev: Using Regular Expressions, Up: Regular Expression HOWTO + +10.9.4 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:: + + +File: python.info, Node: More Metacharacters, Next: Grouping, Up: More Pattern Power + +10.9.4.1 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, ‘\b’ is an assertion that the current position is located +at a word boundary; the position isn’t changed by the ‘\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. + +‘|’ + + Alternation, or the “or” operator. If `A' and `B' are regular + expressions, ‘A|B’ will match any string that matches either `A' or + `B'. ‘|’ has very low precedence in order to make it work + reasonably when you’re alternating multi-character strings. + ‘Crow|Servo’ will match either ‘'Crow'’ or ‘'Servo'’, not ‘'Cro'’, + a ‘'w'’ or an ‘'S'’, and ‘'ervo'’. + + To match a literal ‘'|'’, use ‘\|’, or enclose it inside a + character class, as in ‘[|]’. + +‘^’ + + Matches at the beginning of lines. Unless the ‘MULTILINE’ flag has + been set, this will only match at the beginning of the string. In + ‘MULTILINE’ mode, this also matches immediately after each newline + within the string. + + For example, if you wish to match the word ‘From’ only at the + beginning of a line, the RE to use is ‘^From’. + + >>> print(re.search('^From', 'From Here to Eternity')) + + >>> print(re.search('^From', 'Reciting From Memory')) + None + + To match a literal ‘'^'’, use ‘\^’. + +‘$’ + + 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. + + >>> print(re.search('}$', '{block}')) + + >>> print(re.search('}$', '{block} ')) + None + >>> print(re.search('}$', '{block}\n')) + + + To match a literal ‘'$'’, use ‘\$’ or enclose it inside a character + class, as in ‘[$]’. + +‘\A’ + + Matches only at the start of the string. When not in ‘MULTILINE’ + mode, ‘\A’ and ‘^’ are effectively the same. In ‘MULTILINE’ mode, + they’re different: ‘\A’ still matches only at the beginning of the + string, but ‘^’ may match at any location inside the string that + follows a newline character. + +‘\Z’ + + Matches only at the end of the string. + +‘\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 ‘class’ only when it’s a complete + word; it won’t match when it’s contained inside another word. + + >>> p = re.compile(r'\bclass\b') + >>> print(p.search('no class at all')) + + >>> print(p.search('the declassified algorithm')) + None + >>> print(p.search('one subclass is')) + None + + 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, ‘\b’ is the backspace character, ASCII + value 8. If you’re not using raw strings, then Python will convert + the ‘\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 ‘'r'’ in front of the RE string. + + >>> p = re.compile('\bclass\b') + >>> print(p.search('no class at all')) + None + >>> print(p.search('\b' + 'class' + '\b')) + + + Second, inside a character class, where there’s no use for this + assertion, ‘\b’ represents the backspace character, for + compatibility with Python’s string literals. + +‘\B’ + + Another zero-width assertion, this is the opposite of ‘\b’, only + matching when the current position is not at a word boundary. + + +File: python.info, Node: Grouping, Next: Non-capturing and Named Groups, Prev: More Metacharacters, Up: More Pattern Power + +10.9.4.2 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 ‘':'’, like this: + + From: author@example.com + User-Agent: Thunderbird 1.5.0.9 (X11/20061227) + MIME-Version: 1.0 + To: editor@example.com + +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 ‘'('’, ‘')'’ metacharacters. ‘'('’ and ‘')'’ +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 ‘*’, ‘+’, ‘?’, or +‘{m,n}’. For example, ‘(ab)*’ will match zero or more repetitions of +‘ab’. + + >>> p = re.compile('(ab)*') + >>> print(p.match('ababababab').span()) + (0, 10) + +Groups indicated with ‘'('’, ‘')'’ also capture the starting and ending +index of the text that they match; this can be retrieved by passing an +argument to *note group(): 1d76, *note start(): 1d7a, *note end(): 1d7b, +and *note span(): 1d7c. Groups are numbered starting with 0. Group 0 +is always present; it’s the whole RE, so *note match object: c25. +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. + + >>> p = re.compile('(a)b') + >>> m = p.match('ab') + >>> m.group() + 'ab' + >>> m.group(0) + 'ab' + +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. + + >>> p = re.compile('(a(b)c)d') + >>> m = p.match('abcd') + >>> m.group(0) + 'abcd' + >>> m.group(1) + 'abc' + >>> m.group(2) + 'b' + +*note group(): 1d76. can be passed multiple group numbers at a time, in +which case it will return a tuple containing the corresponding values +for those groups. + + >>> m.group(2,1,2) + ('b', 'abc', 'b') + +The *note groups(): 1d78. method returns a tuple containing the strings +for all the subgroups, from 1 up to however many there are. + + >>> m.groups() + ('abc', 'b') + +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, ‘\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. + + >>> p = re.compile(r'\b(\w+)\s+\1\b') + >>> p.search('Paris in the the spring').group() + 'the the' + +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. + + +File: python.info, Node: Non-capturing and Named Groups, Next: Lookahead Assertions, Prev: Grouping, Up: More Pattern Power + +10.9.4.3 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 ‘\’ without making Perl’s regular expressions confusingly different +from standard REs. If they chose ‘&’ as a new metacharacter, for +example, old expressions would be assuming that ‘&’ was a regular +character and wouldn’t have escaped it by writing ‘\&’ or ‘[&]’. + +The solution chosen by the Perl developers was to use ‘(?...)’ as the +extension syntax. ‘?’ immediately after a parenthesis was a syntax +error because the ‘?’ would have nothing to repeat, so this didn’t +introduce any compatibility problems. The characters immediately after +the ‘?’ indicate what extension is being used, so ‘(?=foo)’ is one thing +(a positive lookahead assertion) and ‘(?:foo)’ is something else (a +non-capturing group containing the subexpression ‘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 ‘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: +‘(?:...)’, where you can replace the ‘...’ with any other regular +expression. + + >>> m = re.match("([abc])+", "abc") + >>> m.groups() + ('c',) + >>> m = re.match("(?:[abc])+", "abc") + >>> m.groups() + () + +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 ‘*’, and nest it within other groups +(capturing or non-capturing). ‘(?:...)’ 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: +‘(?P...)’. `name' is, obviously, the name of the group. Named +groups behave exactly like capturing groups, and additionally associate +a name with a group. The *note match object: c25. 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: + + >>> p = re.compile(r'(?P\b\w+\b)') + >>> m = p.search( '(((( Lots of punctuation )))' ) + >>> m.group('word') + 'Lots' + >>> m.group(1) + 'Lots' + +Additionally, you can retrieve named groups as a dictionary with *note +groupdict(): 1d79.: + + >>> m = re.match(r'(?P\w+) (?P\w+)', 'Jane Doe') + >>> m.groupdict() + {'first': 'Jane', 'last': 'Doe'} + +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 +*note imaplib: 94. module: + + InternalDate = re.compile(r'INTERNALDATE "' + r'(?P[ 123][0-9])-(?P[A-Z][a-z][a-z])-' + r'(?P[0-9][0-9][0-9][0-9])' + r' (?P[0-9][0-9]):(?P[0-9][0-9]):(?P[0-9][0-9])' + r' (?P[-+])(?P[0-9][0-9])(?P[0-9][0-9])' + r'"') + +It’s obviously much easier to retrieve ‘m.group('zonem')’, instead of +having to remember to retrieve group 9. + +The syntax for backreferences in an expression such as ‘(...)\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: +‘(?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, ‘\b(\w+)\s+\1\b’ can also be written as +‘\b(?P\w+)\s+(?P=word)\b’: + + >>> p = re.compile(r'\b(?P\w+)\s+(?P=word)\b') + >>> p.search('Paris in the the spring').group() + 'the the' + + +File: python.info, Node: Lookahead Assertions, Prev: Non-capturing and Named Groups, Up: More Pattern Power + +10.9.4.4 Lookahead Assertions +............................. + +Another zero-width assertion is the lookahead assertion. Lookahead +assertions are available in both positive and negative form, and look +like this: + +‘(?=...)’ + + Positive lookahead assertion. This succeeds if the contained + regular expression, represented here by ‘...’, 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. + +‘(?!...)’ + + 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. + +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 ‘.’. For example, in +‘news.rc’, ‘news’ is the base name, and ‘rc’ is the filename’s +extension. + +The pattern to match this is quite simple: + +‘.*[.].*$’ + +Notice that the ‘.’ 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 ‘$’; this is added to +ensure that all the rest of the string must be included in the +extension. This regular expression matches ‘foo.bar’ and ‘autoexec.bat’ +and ‘sendmail.cf’ and ‘printers.conf’. + +Now, consider complicating the problem a bit; what if you want to match +filenames where the extension is not ‘bat’? Some incorrect attempts: + +‘.*[.][^b].*$’ The first attempt above tries to exclude ‘bat’ by +requiring that the first character of the extension is not a ‘b’. This +is wrong, because the pattern also doesn’t match ‘foo.bar’. + +‘.*[.]([^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 ‘b’; the second character isn’t ‘a’; or the third +character isn’t ‘t’. This accepts ‘foo.bar’ and rejects ‘autoexec.bat’, +but it requires a three-letter extension and won’t accept a filename +with a two-letter extension such as ‘sendmail.cf’. We’ll complicate the +pattern again in an effort to fix it. + +‘.*[.]([^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 ‘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 ‘bat’ and ‘exe’ as extensions, the pattern would get even +more complicated and confusing. + +A negative lookahead cuts through all this confusion: + +‘.*[.](?!bat$)[^.]*$’ The negative lookahead means: if the expression +‘bat’ doesn’t match at this point, try the rest of the pattern; if +‘bat$’ does match, the whole pattern will fail. The trailing ‘$’ is +required to ensure that something like ‘sample.batch’, where the +extension only starts with ‘bat’, will be allowed. The ‘[^.]*’ 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 ‘bat’ or ‘exe’: + +‘.*[.](?!bat$|exe$)[^.]*$’ + + +File: python.info, Node: Modifying Strings, Next: Common Problems, Prev: More Pattern Power, Up: Regular Expression HOWTO + +10.9.5 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: + +Method/Attribute Purpose + +--------------------------------------------------------------------------- + +‘split()’ Split the string into a list, splitting it + wherever the RE matches + + +‘sub()’ Find all substrings where the RE matches, and + replace them with a different string + + +‘subn()’ Does the same thing as ‘sub()’, but returns the + new string and the number of replacements + + +* Menu: + +* Splitting Strings:: +* Search and Replace: Search and Replace<2>. + + +File: python.info, Node: Splitting Strings, Next: Search and Replace<2>, Up: Modifying Strings + +10.9.5.1 Splitting Strings +.......................... + +The *note split(): 1d6b. method of a pattern splits a string apart +wherever the RE matches, returning a list of the pieces. It’s similar +to the *note split(): b37. method of strings but provides much more +generality in the delimiters that you can split by; string ‘split()’ +only supports splitting by whitespace or by a fixed string. As you’d +expect, there’s a module-level *note re.split(): 7cb. function, too. + + -- 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. + +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. + + >>> 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', ''] + >>> p.split('This is a test, short and sweet, of split().', 3) + ['This', 'is', 'a', 'test, short and sweet, of split().'] + +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: + + >>> p = re.compile(r'\W+') + >>> p2 = re.compile(r'(\W+)') + >>> p.split('This... is a test.') + ['This', 'is', 'a', 'test', ''] + >>> p2.split('This... is a test.') + ['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', ''] + +The module-level function *note re.split(): 7cb. adds the RE to be used +as the first argument, but is otherwise the same. + + >>> re.split(r'[\W]+', 'Words, words, words.') + ['Words', 'words', 'words', ''] + >>> re.split(r'([\W]+)', 'Words, words, words.') + ['Words', ', ', 'words', ', ', 'words', '.', ''] + >>> re.split(r'[\W]+', 'Words, words, words.', 1) + ['Words', 'words, words.'] + + +File: python.info, Node: Search and Replace<2>, Prev: Splitting Strings, Up: Modifying Strings + +10.9.5.2 Search and Replace +........................... + +Another common task is to find all the matches for a pattern, and +replace them with a different string. The *note sub(): 1d6e. method +takes a replacement value, which can be either a string or a function, +and the string to be processed. + + -- 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. + +Here’s a simple example of using the *note sub(): 1d6e. method. It +replaces colour names with the word ‘colour’: + + >>> 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' + +The *note subn(): 1d6f. method does the same work, but returns a 2-tuple +containing the new string value and the number of replacements that were +performed: + + >>> 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) + +Empty matches are replaced only when they’re not adjacent to a previous +empty match. + + >>> p = re.compile('x*') + >>> p.sub('-', 'abxd') + '-a-b--d-' + +If `replacement' is a string, any backslash escapes in it are processed. +That is, ‘\n’ is converted to a single newline character, ‘\r’ is +converted to a carriage return, and so forth. Unknown escapes such as +‘\&’ are left alone. Backreferences, such as ‘\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 ‘section’ followed by a string enclosed in +‘{’, ‘}’, and changes ‘section’ to ‘subsection’: + + >>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE) + >>> p.sub(r'subsection{\1}','section{First} section{second}') + 'subsection{First} subsection{second}' + +There’s also a syntax for referring to named groups as defined by the +‘(?P...)’ syntax. ‘\g’ will use the substring matched by +the group named ‘name’, and ‘\g’ uses the corresponding group +number. ‘\g<2>’ is therefore equivalent to ‘\2’, but isn’t ambiguous in +a replacement string such as ‘\g<2>0’. (‘\20’ would be interpreted as a +reference to group 20, not a reference to group 2 followed by the +literal character ‘'0'’.) The following substitutions are all +equivalent, but use all three variations of the replacement string. + + >>> p = re.compile('section{ (?P [^}]* ) }', 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}','section{First}') + 'subsection{First}' + +`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 *note match object: c25. 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: + + >>> 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.' + +When using the module-level *note re.sub(): 85d. 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. ‘sub("(?i)b+", "x", +"bbbb BBBB")’ returns ‘'x x'’. + + +File: python.info, Node: Common Problems, Next: Feedback, Prev: Modifying Strings, Up: Regular Expression HOWTO + +10.9.6 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. + + +File: python.info, Node: Use String Methods, Next: match versus search, Up: Common Problems + +10.9.6.1 Use String Methods +........................... + +Sometimes using the *note re: da. module is a mistake. If you’re +matching a fixed string, or a single character class, and you’re not +using any *note re: da. features such as the *note IGNORECASE: 12df. +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 ‘word’ with ‘deed’. *note re.sub(): 85d. +seems like the function to use for this, but consider the *note +replace(): 1c15. method. Note that ‘replace()’ will also replace ‘word’ +inside words, turning ‘swordfish’ into ‘sdeedfish’, but the naive RE +‘word’ would have done that, too. (To avoid performing the substitution +on parts of words, the pattern would have to be ‘\bword\b’, in order to +require that ‘word’ have a word boundary on either side. This takes the +job beyond ‘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 ‘re.sub('\n', ' ', S)’, but *note +translate(): 1c14. is capable of doing both tasks and will be faster +than any regular expression operation can be. + +In short, before turning to the *note re: da. module, consider whether +your problem can be solved with a faster and simpler string method. + + +File: python.info, Node: match versus search, Next: Greedy versus Non-Greedy, Prev: Use String Methods, Up: Common Problems + +10.9.6.2 match() versus search() +................................ + +The *note match(): ee0. function only checks if the RE matches at the +beginning of the string while *note search(): edf. will scan forward +through the string for a match. It’s important to keep this distinction +in mind. Remember, ‘match()’ will only report a successful match which +will start at 0; if the match wouldn’t start at zero, ‘match()’ will +`not' report it. + + >>> print(re.match('super', 'superstition').span()) + (0, 5) + >>> print(re.match('super', 'insuperable')) + None + +On the other hand, *note search(): edf. will scan forward through the +string, reporting the first match it finds. + + >>> print(re.search('super', 'superstition').span()) + (0, 5) + >>> print(re.search('super', 'insuperable').span()) + (2, 7) + +Sometimes you’ll be tempted to keep using *note re.match(): ee0, and +just add ‘.*’ to the front of your RE. Resist this temptation and use +*note re.search(): edf. 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 ‘Crow’ must match +starting with a ‘'C'’. The analysis lets the engine quickly scan +through the string looking for the starting character, only trying the +full match if a ‘'C'’ is found. + +Adding ‘.*’ 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 *note re.search(): edf. instead. + + +File: python.info, Node: Greedy versus Non-Greedy, Next: Using re VERBOSE, Prev: match versus search, Up: Common Problems + +10.9.6.3 Greedy versus Non-Greedy +................................. + +When repeating a regular expression, as in ‘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 +‘.*’. + + >>> s = 'Title' + >>> len(s) + 32 + >>> print(re.match('<.*>', s).span()) + (0, 32) + >>> print(re.match('<.*>', s).group()) + Title + +The RE matches the ‘'<'’ in ‘''’, and the ‘.*’ consumes the rest +of the string. There’s still more left in the RE, though, and the ‘>’ +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 +‘>’. The final match extends from the ‘'<'’ in ‘''’ to the ‘'>'’ +in ‘''’, which isn’t what you want. + +In this case, the solution is to use the non-greedy quantifiers ‘*?’, +‘+?’, ‘??’, or ‘{m,n}?’, which match as `little' text as possible. In +the above example, the ‘'>'’ is tried immediately after the first ‘'<'’ +matches, and when it fails, the engine advances a character at a time, +retrying the ‘'>'’ at every step. This produces just the right result: + + >>> print(re.match('<.*?>', s).group()) + + +(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.) + + +File: python.info, Node: Using re VERBOSE, Prev: Greedy versus Non-Greedy, Up: Common Problems + +10.9.6.4 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 *note re.VERBOSE: 1d63. flag when compiling +the regular expression can be helpful, because it allows you to format +the regular expression more clearly. + +The ‘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 ‘dog | cat’ is equivalent to the less +readable ‘dog|cat’, but ‘[a b]’ will still match the characters ‘'a'’, +‘'b'’, or a space. In addition, you can also put comments inside a RE; +comments extend from a ‘#’ character to the next newline. When used +with triple-quoted strings, this enables REs to be formatted more +neatly: + + pat = re.compile(r""" + \s* # Skip leading whitespace + (?P
    [^:]+) # Header name + \s* : # Whitespace, and a colon + (?P.*?) # The header's value -- *? used to + # lose the following trailing whitespace + \s*$ # Trailing whitespace to end-of-line + """, re.VERBOSE) + +This is far more readable than: + + pat = re.compile(r"\s*(?P
    [^:]+)\s*:(?P.*?)\s*$") + + +File: python.info, Node: Feedback, Prev: Common Problems, Up: Regular Expression HOWTO + +10.9.7 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 author. + +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 ‘regex’ module, which won’t +help you much.) Consider checking it out from your library. + + +File: python.info, Node: Socket Programming HOWTO, Next: Sorting HOW TO, Prev: Regular Expression HOWTO, Up: Python HOWTOs + +10.10 Socket Programming HOWTO +============================== + + +Author: Gordon McMillan + +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:: + + +File: python.info, Node: Sockets, Next: Creating a Socket, Up: Socket Programming HOWTO + +10.10.1 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:: + + +File: python.info, Node: History, Up: Sockets + +10.10.1.1 History +................. + +Of the various forms of 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). + + +File: python.info, Node: Creating a Socket, Next: Using a Socket, Prev: Sockets, Up: Socket Programming HOWTO + +10.10.2 Creating a Socket +------------------------- + +Roughly speaking, when you clicked on the link that brought you to this +page, your browser did something like the following: + + # 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)) + +When the ‘connect’ completes, the socket ‘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”: + + # 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) + +A couple things to notice: we used ‘socket.gethostname()’ so that the +socket would be visible to the outside world. If we had used +‘s.bind(('localhost', 80))’ or ‘s.bind(('127.0.0.1', 80))’ we would +still have a “server” socket, but one that was only visible within the +same machine. ‘s.bind(('', 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 ‘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: + + 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 = client_thread(clientsocket) + ct.run() + +There’s actually 3 general ways in which this loop could work - +dispatching a thread to handle ‘clientsocket’, create a new process to +handle ‘clientsocket’, or restructure this app to use non-blocking +sockets, and multiplex between our “server” socket and any active +‘clientsocket’s using ‘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 ‘clientsocket’ is created in response +to some `other' “client” socket doing a ‘connect()’ to the host and port +we’re bound to. As soon as we’ve created that ‘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:: + + +File: python.info, Node: IPC, Up: Creating a Socket + +10.10.2.1 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 ‘'localhost'’. On most platforms, +this will take a shortcut around a couple of layers of network code and +be quite a bit faster. + +See also +........ + +The *note multiprocessing: b5. integrates cross-platform IPC into a +higher-level API. + + +File: python.info, Node: Using a Socket, Next: Disconnecting, Prev: Creating a Socket, Up: Socket Programming HOWTO + +10.10.3 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 ‘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 +‘send’ and ‘recv’, or you can transform your client socket into a +file-like beast and use ‘read’ and ‘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 ‘flush’ on sockets. These are buffered +“files”, and a common mistake is to ‘write’ something, and then ‘read’ +for a reply. Without a ‘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 - ‘send’ and ‘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 (‘send’) or emptied +(‘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 ‘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' EOT (End of Transfer) `on a socket.' I +repeat: if a socket ‘send’ or ‘recv’ returns after handling 0 bytes, the +connection has been broken. If the connection has `not' been broken, +you may wait on a ‘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: + + 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'': + raise RuntimeError("socket connection broken") + chunks.append(chunk) + bytes_recd = bytes_recd + len(chunk) + return b''.join(chunks) + +The sending code here is usable for almost any messaging scheme - in +Python you send strings, and you can use ‘len()’ to determine its length +(even if it has embedded ‘\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 ‘strlen’ if the message has embedded ‘\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 ‘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 ‘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 ‘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 ‘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 ‘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:: + + +File: python.info, Node: Binary Data, Up: Using a Socket + +10.10.3.1 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(1) is big-endian, with the most +significant byte first, so a 16 bit integer with the value ‘1’ would be +the two hex bytes ‘00 01’. However, most common processors (x86/AMD64, +ARM, RISC-V), are little-endian, with the least significant byte first - +that same ‘1’ would be ‘01 00’. + +Socket libraries have calls for converting 16 and 32 bit integers - +‘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 ‘"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. + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Endianness#Networking + + +File: python.info, Node: Disconnecting, Next: Non-blocking Sockets, Prev: Using a Socket, Up: Socket Programming HOWTO + +10.10.4 Disconnecting +--------------------- + +Strictly speaking, you’re supposed to use ‘shutdown’ on a socket before +you ‘close’ it. The ‘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 +‘close’ is the same as ‘shutdown(); close()’. So in most situations, an +explicit ‘shutdown’ is not needed. + +One way to use ‘shutdown’ effectively is in an HTTP-like exchange. The +client sends a request and then does a ‘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 ‘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 ‘close’ if it’s +needed. But relying on this is a very bad habit. If your socket just +disappears without doing a ‘close’, the socket at the other end may hang +indefinitely, thinking you’re just being slow. `Please' ‘close’ your +sockets when you’re done. + +* Menu: + +* When Sockets Die:: + + +File: python.info, Node: When Sockets Die, Up: Disconnecting + +10.10.4.1 When Sockets Die +.......................... + +Probably the worst thing about using blocking sockets is what happens +when the other side comes down hard (without doing a ‘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. + + +File: python.info, Node: Non-blocking Sockets, Prev: Disconnecting, Up: Socket Programming HOWTO + +10.10.5 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 ‘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 ‘O_NONBLOCK’ and the almost indistinguishable POSIX +flavor ‘O_NDELAY’, which is completely different from ‘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 ‘send’, ‘recv’, ‘connect’ and +‘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 ‘select’. + +In C, coding ‘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 +‘select’ in Python, you’ll have little trouble with it in C: + + ready_to_read, ready_to_write, in_error = \ + select.select( + potential_readers, + potential_writers, + potential_errs, + timeout) + +You pass ‘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 ‘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 ‘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 ‘accept’ will (almost certainly) +work. If you have created a new socket to ‘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, ‘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, ‘select’ works both with the sockets and +files. Don’t try this on Windows. On Windows, ‘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. + + +File: python.info, Node: Sorting HOW TO, Next: Unicode HOWTO, Prev: Socket Programming HOWTO, Up: Python HOWTOs + +10.11 Sorting HOW TO +==================== + + +Author: Andrew Dalke and Raymond Hettinger + + +Release: 0.1 + +Python lists have a built-in *note list.sort(): 834. method that +modifies the list in-place. There is also a *note sorted(): 833. +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:: +* Ascending and Descending:: +* Sort Stability and Complex Sorts:: +* Decorate-Sort-Undecorate:: +* Comparison Functions:: +* Odds and Ends: Odds and Ends<2>. + + +File: python.info, Node: Sorting Basics, Next: Key Functions, Up: Sorting HOW TO + +10.11.1 Sorting Basics +---------------------- + +A simple ascending sort is very easy: just call the *note sorted(): 833. +function. It returns a new sorted list: + + >>> sorted([5, 2, 3, 1, 4]) + [1, 2, 3, 4, 5] + +You can also use the *note list.sort(): 834. method. It modifies the +list in-place (and returns ‘None’ to avoid confusion). Usually it’s +less convenient than *note sorted(): 833. - but if you don’t need the +original list, it’s slightly more efficient. + + >>> a = [5, 2, 3, 1, 4] + >>> a.sort() + >>> a + [1, 2, 3, 4, 5] + +Another difference is that the *note list.sort(): 834. method is only +defined for lists. In contrast, the *note sorted(): 833. function +accepts any iterable. + + >>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) + [1, 2, 3, 4, 5] + + +File: python.info, Node: Key Functions, Next: Operator Module Functions, Prev: Sorting Basics, Up: Sorting HOW TO + +10.11.2 Key Functions +--------------------- + +Both *note list.sort(): 834. and *note sorted(): 833. 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: + + >>> sorted("This is a test string from Andrew".split(), key=str.lower) + ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] + +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: + + >>> 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)] + +The same technique works for objects with named attributes. For +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)] + + +File: python.info, Node: Operator Module Functions, Next: Ascending and Descending, Prev: Key Functions, Up: Sorting HOW TO + +10.11.3 Operator Module Functions +--------------------------------- + +The key-function patterns shown above are very common, so Python +provides convenience functions to make accessor functions easier and +faster. The *note operator: c0. module has *note itemgetter(): 6b3, +*note attrgetter(): ab7, and a *note methodcaller(): ab8. function. + +Using those functions, the above examples become simpler and faster: + + >>> 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)] + +The operator module functions allow multiple levels of sorting. For +example, to sort by `grade' then by `age': + + >>> 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)] + + +File: python.info, Node: Ascending and Descending, Next: Sort Stability and Complex Sorts, Prev: Operator Module Functions, Up: Sorting HOW TO + +10.11.4 Ascending and Descending +-------------------------------- + +Both *note list.sort(): 834. and *note sorted(): 833. 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: + + >>> 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)] + + +File: python.info, Node: Sort Stability and Complex Sorts, Next: Decorate-Sort-Undecorate, Prev: Ascending and Descending, Up: Sorting HOW TO + +10.11.5 Sort Stability and Complex Sorts +---------------------------------------- + +Sorts are guaranteed to be stable(1). That means that when multiple +records have the same key, their original order is preserved. + + >>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] + >>> sorted(data, key=itemgetter(0)) + [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)] + +Notice how the two records for `blue' retain their original order so +that ‘('blue', 1)’ is guaranteed to precede ‘('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': + + >>> 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)] + +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. + + >>> 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)] + +The Timsort(2) algorithm used in Python does multiple sorts efficiently +because it can take advantage of any ordering already present in a +dataset. + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Sorting_algorithm#Stability + + (2) https://en.wikipedia.org/wiki/Timsort + + +File: python.info, Node: Decorate-Sort-Undecorate, Next: Comparison Functions, Prev: Sort Stability and Complex Sorts, Up: Sorting HOW TO + +10.11.6 Decorate-Sort-Undecorate +-------------------------------- + +This idiom is called Decorate-Sort-Undecorate after its three steps: + + * First, the initial list is decorated with new values that control + the sort order. + + * Second, the decorated list is sorted. + + * Finally, the decorations are removed, creating a list that contains + only the initial values in the new order. + +For example, to sort the student data by `grade' using the DSU approach: + + >>> 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)] + +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: + + * The sort is stable – if two items have the same key, their order + will be preserved in the sorted list. + + * 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. + +Another name for this idiom is Schwartzian transform(1), after Randal L. +Schwartz, who popularized it among Perl programmers. + +Now that Python sorting provides key-functions, this technique is not +often needed. + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Schwartzian_transform + + +File: python.info, Node: Comparison Functions, Next: Odds and Ends<2>, Prev: Decorate-Sort-Undecorate, Up: Sorting HOW TO + +10.11.7 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(1) compares two samples giving a relative +ordering: lighter, equal, or heavier. Likewise, a comparison function +such as ‘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, *note +locale.strcoll(): 354f. is a comparison function. + +To accommodate those situations, Python provides *note +functools.cmp_to_key: e8a. to wrap the comparison function to make it +usable as a key function: + + sorted(words, key=cmp_to_key(strcoll) + + ---------- Footnotes ---------- + + (1) +https://upload.wikimedia.org/wikipedia/commons/1/17/Balance_à_tabac_1850.JPG + + +File: python.info, Node: Odds and Ends<2>, Prev: Comparison Functions, Up: Sorting HOW TO + +10.11.8 Odds and Ends +--------------------- + + * For locale aware sorting, use *note locale.strxfrm(): 3551. for a + key function or *note locale.strcoll(): 354f. for a comparison + function. This is necessary because “alphabetical” sort orderings + can vary across cultures even if the underlying alphabet is the + same. + + * 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 *note reversed(): 462. function twice: + + >>> 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)] + + * The sort routines use ‘<’ when making comparisons between two + objects. So, it is easy to add a standard sort order to a class by + defining an ‘__lt__()’ method: + + >>> Student.__lt__ = lambda self, other: self.age < other.age + >>> sorted(student_objects) + [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] + + However, note that ‘<’ can fall back to using ‘__gt__()’ if + ‘__lt__()’ is not implemented (see *note object.__lt__(): 190f.). + + * 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: + + >>> students = ['dave', 'john', 'jane'] + >>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'} + >>> sorted(students, key=newgrades.__getitem__) + ['jane', 'dave', 'john'] + + +File: python.info, Node: Unicode HOWTO, Next: HOWTO Fetch Internet Resources Using The urllib Package, Prev: Sorting HOW TO, Up: Python HOWTOs + +10.12 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>. + + +File: python.info, Node: Introduction to Unicode, Next: Python’s Unicode Support, Up: Unicode HOWTO + +10.12.1 Introduction to Unicode +------------------------------- + +* Menu: + +* Definitions:: +* Encodings:: +* References: References<3>. + + +File: python.info, Node: Definitions, Next: Encodings, Up: Introduction to Unicode + +10.12.1.1 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 (‘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(1) is less than +that). In the standard and in this document, a code point is written +using the notation ‘U+265E’ to mean the character with value ‘0x265e’ +(9,822 in decimal). + +The Unicode standard contains a lot of tables listing characters and +their corresponding code points: + + 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 + ... + +Strictly, these definitions imply that it’s meaningless to say ‘this is +character ‘U+265E’’. ‘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. + + ---------- Footnotes ---------- + + (1) https://www.unicode.org/versions/latest/#Summary + + +File: python.info, Node: Encodings, Next: References<3>, Prev: Definitions, Up: Introduction to Unicode + +10.12.1.2 Encodings +................... + +To summarize the previous section: a Unicode string is a sequence of +code points, which are numbers from 0 through ‘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: + + 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 + +This representation is straightforward but using it presents a number of +problems. + + 1. It’s not portable; different processors order the bytes + differently. + + 2. 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 ‘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. + + 3. It’s not compatible with existing C functions such as ‘strlen()’, + so a new family of wide string functions would need to be used. + +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: + + 1. If the code point is < 128, it’s represented by the corresponding + byte value. + + 2. 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. + +UTF-8 has several convenient properties: + + 1. It can handle any Unicode code point. + + 2. 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 ‘strcpy()’ and sent through protocols that can’t + handle zero bytes for anything other than end-of-string markers. + + 3. A string of ASCII text is also valid UTF-8 text. + + 4. UTF-8 is fairly compact; the majority of commonly used characters + can be represented with one or two bytes. + + 5. 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. + + 6. 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. + + +File: python.info, Node: References<3>, Prev: Encodings, Up: Introduction to Unicode + +10.12.1.3 References +.................... + +The Unicode Consortium site(1) has character charts, a glossary, and PDF +versions of the Unicode specification. Be prepared for some difficult +reading. A chronology(2) 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(3) (9 minutes 36 seconds). + +To help understand the standard, Jukka Korpela has written an +introductory guide(4) to reading the Unicode character tables. + +Another good introductory article(5) 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(6)” and UTF-8(7), for example. + + ---------- Footnotes ---------- + + (1) https://www.unicode.org + + (2) https://www.unicode.org/history/ + + (3) https://www.youtube.com/watch?v=MijmeoH9LT4 + + (4) https://jkorpela.fi/unicode/guide.html + + (5) +https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/ + + (6) https://en.wikipedia.org/wiki/Character_encoding + + (7) https://en.wikipedia.org/wiki/UTF-8 + + +File: python.info, Node: Python’s Unicode Support, Next: Reading and Writing Unicode Data, Prev: Introduction to Unicode, Up: Unicode HOWTO + +10.12.2 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>. + + +File: python.info, Node: The String Type, Next: Converting to Bytes, Up: Python’s Unicode Support + +10.12.2.1 The String Type +......................... + +Since Python 3.0, the language’s *note str: 1b3. type contains Unicode +characters, meaning any string created using ‘"unicode rocks!"’, +‘'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: + + try: + with open('/tmp/input.txt', 'r') as f: + ... + except OSError: + # 'File not found' error message. + print("Fichier non trouvé") + +Side note: Python 3 also supports using Unicode characters in +identifiers: + + répertoire = "/tmp/records.log" + with open(répertoire, "w") as f: + f.write("test\n") + +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.) + + >>> "\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' + +In addition, one can create a string using the *note decode(): 513. +method of *note bytes: 1b4. This method takes an `encoding' argument, +such as ‘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 ‘'strict'’ (raise a *note UnicodeDecodeError: 65c. +exception), ‘'replace'’ (use ‘U+FFFD’, ‘REPLACEMENT CHARACTER’), +‘'ignore'’ (just leave the character out of the Unicode result), or +‘'backslashreplace'’ (inserts a ‘\xNN’ escape sequence). The following +examples show the differences: + + >>> 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' + +Encodings are specified as strings containing the encoding’s name. +Python comes with roughly 100 different encodings; see the Python +Library Reference at *note Standard Encodings: a38. for a list. Some +encodings have multiple names; for example, ‘'latin-1'’, ‘'iso_8859_1'’ +and ‘'8859’’ are all synonyms for the same encoding. + +One-character Unicode strings can also be created with the *note chr(): +18fa. 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 *note ord(): 18f9. function that takes +a one-character Unicode string and returns the code point value: + + >>> chr(57344) + '\ue000' + >>> ord('\ue000') + 57344 + + +File: python.info, Node: Converting to Bytes, Next: Unicode Literals in Python Source Code, Prev: The String Type, Up: Python’s Unicode Support + +10.12.2.2 Converting to Bytes +............................. + +The opposite method of *note bytes.decode(): 513. is *note str.encode(): +512, which returns a *note bytes: 1b4. representation of the Unicode +string, encoded in the requested `encoding'. + +The `errors' parameter is the same as the parameter of the *note +decode(): 513. method but supports a few more possible handlers. As +well as ‘'strict'’, ‘'ignore'’, and ‘'replace'’ (which in this case +inserts a question mark instead of the unencodable character), there is +also ‘'xmlcharrefreplace'’ (inserts an XML character reference), +‘backslashreplace’ (inserts a ‘\uNNNN’ escape sequence) and +‘namereplace’ (inserts a ‘\N{...}’ escape sequence). + +The following example shows the different results: + + >>> 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'ꀀabcd޴' + >>> u.encode('ascii', 'backslashreplace') + b'\\ua000abcd\\u07b4' + >>> u.encode('ascii', 'namereplace') + b'\\N{YI SYLLABLE IT}abcd\\u07b4' + +The low-level routines for registering and accessing the available +encodings are found in the *note codecs: 1a. module. Implementing new +encodings also requires understanding the *note codecs: 1a. 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. + + +File: python.info, Node: Unicode Literals in Python Source Code, Next: Unicode Properties, Prev: Converting to Bytes, Up: Python’s Unicode Support + +10.12.2.3 Unicode Literals in Python Source Code +................................................ + +In Python source code, specific Unicode code points can be written using +the ‘\u’ escape sequence, which is followed by four hex digits giving +the code point. The ‘\U’ escape sequence is similar, but expects eight +hex digits, not four: + + >>> 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] + +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 +*note chr(): 18fa. 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: + + #!/usr/bin/env python + # -*- coding: latin-1 -*- + + u = 'abcdé' + print(ord(u[-1])) + +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 ‘-*-’ symbols indicate to Emacs that the +comment is special; they have no significance to Python but are a +convention. Python looks for ‘coding: name’ or ‘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 PEP 263(1) for more information. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0263/ + + +File: python.info, Node: Unicode Properties, Next: Comparing Strings, Prev: Unicode Literals in Python Source Code, Up: Python’s Unicode Support + +10.12.2.4 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: + + 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])) + +When run, this prints: + + 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 + +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, ‘'Ll'’ means +‘Letter, lowercase’, ‘'No'’ means “Number, other”, ‘'Mn'’ is “Mark, +nonspacing”, and ‘'So'’ is “Symbol, other”. See the General Category +Values section of the Unicode Character Database documentation(1) for a +list of category codes. + + ---------- Footnotes ---------- + + (1) https://www.unicode.org/reports/tr44/#General_Category_Values + + +File: python.info, Node: Comparing Strings, Next: Unicode Regular Expressions, Prev: Unicode Properties, Up: Python’s Unicode Support + +10.12.2.5 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 *note casefold(): a57. +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’. + + >>> street = 'Gürzenichstraße' + >>> street.casefold() + 'gürzenichstrasse' + +A second tool is the *note unicodedata: 124. module’s *note normalize(): +29e. function that converts strings to one of several normal forms, +where letters followed by a combining character are replaced with single +characters. ‘normalize()’ can be used to perform string comparisons +that won’t falsely report inequality if two strings use combining +characters differently: + + 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)) + +When run, this outputs: + + $ python3 compare-strs.py + length of first string= 1 + length of second string= 2 + True + +The first argument to the *note normalize(): 29e. 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: + + 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)) + +This will print ‘True’. (Why is ‘NFD()’ invoked twice? Because there +are a few characters that make ‘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.) + + +File: python.info, Node: Unicode Regular Expressions, Next: References<4>, Prev: Comparing Strings, Up: Python’s Unicode Support + +10.12.2.6 Unicode Regular Expressions +..................................... + +The regular expressions supported by the *note re: da. module can be +provided either as bytes or strings. Some of the special character +sequences such as ‘\d’ and ‘\w’ have different meanings depending on +whether the pattern is supplied as bytes or a string. For example, ‘\d’ +will match the characters ‘[0-9]’ in bytes but in strings will match any +character that’s in the ‘'Nd'’ category. + +The string in this example has the number 57 written in both Thai and +Arabic numerals: + + import re + p = re.compile(r'\d+') + + s = "Over \u0e55\u0e57 57 flavours" + m = p.search(s) + print(repr(m.group())) + +When executed, ‘\d+’ will match the Thai numerals and print them out. +If you supply the *note re.ASCII: 207. flag to *note compile(): 83a, +‘\d+’ will match the substring “57” instead. + +Similarly, ‘\w’ matches a wide variety of Unicode characters but only +‘[a-zA-Z0-9_]’ in bytes or if *note re.ASCII: 207. is supplied, and ‘\s’ +will match either Unicode whitespace characters or ‘[ \t\n\r\f\v]’. + + +File: python.info, Node: References<4>, Prev: Unicode Regular Expressions, Up: Python’s Unicode Support + +10.12.2.7 References +.................... + +Some good alternative discussions of Python’s Unicode support are: + + * Processing Text Files in Python 3(1), by Nick Coghlan. + + * Pragmatic Unicode(2), a PyCon 2012 presentation by Ned Batchelder. + +The *note str: 1b3. type is described in the Python library reference at +*note Text Sequence Type — str: 1649. + +The documentation for the *note unicodedata: 124. module. + +The documentation for the *note codecs: 1a. module. + +Marc-André Lemburg gave a presentation titled "Python and Unicode" (PDF +slides)(3) 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 ‘unicode’ and literals start with ‘u’). + + ---------- Footnotes ---------- + + (1) +http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html + + (2) https://nedbatchelder.com/text/unipain.html + + (3) https://downloads.egenix.com/python/Unicode-EPC2002-Talk.pdf + + +File: python.info, Node: Reading and Writing Unicode Data, Next: Acknowledgements<10>, Prev: Python’s Unicode Support, Up: Unicode HOWTO + +10.12.3 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 ‘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 *note open(): 30b. 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 +*note read(): 2602. and *note write(): 2605. This works through *note +open(): 30b.’s `encoding' and `errors' parameters which are interpreted +just like those in *note str.encode(): 512. and *note bytes.decode(): +513. + +Reading Unicode from a file is therefore simple: + + with open('unicode.txt', encoding='utf-8') as f: + for line in f: + print(repr(line)) + +It’s also possible to open files in update mode, allowing both reading +and writing: + + 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])) + +The Unicode character ‘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>. + + +File: python.info, Node: Unicode filenames, Next: Tips for Writing Unicode-aware Programs, Up: Reading and Writing Unicode Data + +10.12.3.1 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 +*note filesystem encoding: 1793. if you’ve set the ‘LANG’ or ‘LC_CTYPE’ +environment variables; if you haven’t, the default encoding is again +UTF-8. + +The *note sys.getfilesystemencoding(): 8c8. 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: + + filename = 'filename\u4500abc' + with open(filename, 'w') as f: + f.write('blah\n') + +Functions in the *note os: c2. module such as *note os.stat(): 653. will +also accept Unicode filenames. + +The *note os.listdir(): da5. function returns filenames, which raises an +issue: should it return the Unicode version of filenames, or should it +return bytes containing the encoded versions? *note os.listdir(): da5. +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 *note +filesystem encoding: 1793. is UTF-8, running the following program: + + fn = 'filename\u4500abc' + f = open(fn, 'w') + f.close() + + import os + print(os.listdir(b'.')) + print(os.listdir('.')) + +will produce the following output: + + $ python listdir-test.py + [b'filename\xe4\x94\x80abc', ...] + ['filename\u4500abc', ...] + +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. + + +File: python.info, Node: Tips for Writing Unicode-aware Programs, Next: References<5>, Prev: Unicode filenames, Up: Reading and Writing Unicode Data + +10.12.3.2 Tips for Writing Unicode-aware Programs +................................................. + +This section provides some suggestions on writing software that deals +with Unicode. + +The most important tip is: + + Software should only work with Unicode strings internally, decoding + the input data as soon as possible and encoding the output only at + the end. + +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. ‘str + bytes’, a *note TypeError: +19c. 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:: + + +File: python.info, Node: Converting Between File Encodings, Next: Files in an Unknown Encoding, Up: Tips for Writing Unicode-aware Programs + +10.12.3.3 Converting Between File Encodings +........................................... + +The *note StreamRecoder: 1421. 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 *note StreamRecoder: 1421. to return bytes encoded in +UTF-8: + + 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') ) + + +File: python.info, Node: Files in an Unknown Encoding, Prev: Converting Between File Encodings, Up: Tips for Writing Unicode-aware Programs + +10.12.3.4 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 ‘surrogateescape’ error handler: + + 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) + +The ‘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 +‘surrogateescape’ error handler is used to encode the data and write it +back out. + + +File: python.info, Node: References<5>, Prev: Tips for Writing Unicode-aware Programs, Up: Reading and Writing Unicode Data + +10.12.3.5 References +.................... + +One section of Mastering Python 3 Input/Output(1), 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"(2) 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(3) is a PyCon 2013 talk by Benjamin +Peterson that discusses the internal Unicode representation in Python +3.3. + + ---------- Footnotes ---------- + + (1) https://pyvideo.org/video/289/pycon-2010–mastering-python-3-i-o + + (2) +https://downloads.egenix.com/python/LSM2005-Developing-Unicode-aware-applications-in-Python.pdf + + (3) https://pyvideo.org/video/1768/the-guts-of-unicode-in-python + + +File: python.info, Node: Acknowledgements<10>, Prev: Reading and Writing Unicode Data, Up: Unicode HOWTO + +10.12.4 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. + + +File: python.info, Node: HOWTO Fetch Internet Resources Using The urllib Package, Next: Argparse Tutorial, Prev: Unicode HOWTO, Up: Python HOWTOs + +10.13 HOWTO Fetch Internet Resources Using The urllib Package +============================================================= + + +Author: Michael Foord(1) + + Note: There is a French translation of an earlier revision of this + HOWTO, available at urllib2 - Le Manuel manquant(2). + +* Menu: + +* Introduction: Introduction<15>. +* Fetching URLs:: +* Handling Exceptions: Handling Exceptions<2>. +* info and geturl:: +* Openers and Handlers:: +* Basic Authentication:: +* Proxies:: +* Sockets and Layers:: +* Footnotes:: + + ---------- Footnotes ---------- + + (1) https://agileabstractions.com/ + + (2) +https://web.archive.org/web/20200910051922/http://www.voidspace.org.uk/python/articles/urllib2_francais.shtml + + +File: python.info, Node: Introduction<15>, Next: Fetching URLs, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.1 Introduction +-------------------- + +Related Articles +................ + +You may also find useful the following article on fetching web resources +with Python: + + * Basic Authentication(1) + + A tutorial on `Basic Authentication', with examples in Python. + +`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 ‘":"’ in URL - for example ‘"ftp"’ is the URL +scheme of ‘"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 +RFC 2616(2). 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 *note urllib.request: 12a. docs, but is supplementary to them. + + ---------- Footnotes ---------- + + (1) +https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml + + (2) https://datatracker.ietf.org/doc/html/rfc2616.html + + +File: python.info, Node: Fetching URLs, Next: Handling Exceptions<2>, Prev: Introduction<15>, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.2 Fetching URLs +--------------------- + +The simplest way to use urllib.request is as follows: + + import urllib.request + with urllib.request.urlopen('http://python.org/') as response: + html = response.read() + +If you wish to retrieve a resource via URL and store it in a temporary +location, you can do so via the *note shutil.copyfileobj(): 6ae. and +*note tempfile.NamedTemporaryFile(): 104a. functions: + + 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 + +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 ‘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 ‘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 ‘.read()’ on the response: + + import urllib.request + + req = urllib.request.Request('http://www.voidspace.org.uk') + with urllib.request.urlopen(req) as response: + the_page = response.read() + +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: + + req = urllib.request.Request('ftp://example.com/') + +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:: + + +File: python.info, Node: Data, Next: Headers, Up: Fetching URLs + +10.13.2.1 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 ‘data’ argument. The +encoding is done using a function from the *note urllib.parse: 129. +library. + + 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() + +Note that other encodings are sometimes required (e.g. for file upload +from HTML forms - see HTML Specification, Form Submission(1) for more +details). + +If you do not pass the ‘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: + + >>> 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) + +Notice that the full URL is created by adding a ‘?’ to the URL, followed +by the encoded values. + + ---------- Footnotes ---------- + + (1) https://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13 + + +File: python.info, Node: Headers, Prev: Data, Up: Fetching URLs + +10.13.2.2 Headers +................. + +We’ll discuss here one particular HTTP header, to illustrate how to add +headers to your HTTP request. + +Some websites (1) dislike being browsed by programs, or send different +versions to different browsers (2). By default urllib identifies itself +as ‘Python-urllib/x.y’ (where ‘x’ and ‘y’ are the major and minor +version numbers of the Python release, e.g. ‘Python-urllib/2.5’), which +may confuse the site, or just plain not work. The way a browser +identifies itself is through the ‘User-Agent’ header (3). 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 (4). + + 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() + +The response also has two useful methods. See the section on *note info +and geturl: 492c. which comes after we have a look at what happens when +things go wrong. + + ---------- Footnotes ---------- + + (1) Google for example. + + (2) 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. + + (3) The user agent for MSIE 6 is `‘Mozilla/4.0 (compatible; MSIE 6.0; +Windows NT 5.1; SV1; .NET CLR 1.1.4322)’' + + (4) For details of more HTTP request headers, see Quick Reference to +HTTP Headers (https://jkorpela.fi/http.html). + + +File: python.info, Node: Handling Exceptions<2>, Next: info and geturl, Prev: Fetching URLs, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.3 Handling Exceptions +--------------------------- + +`urlopen' raises ‘URLError’ when it cannot handle a response (though as +usual with Python APIs, built-in exceptions such as *note ValueError: +1c8, *note TypeError: 19c. etc. may also be raised). + +‘HTTPError’ is the subclass of ‘URLError’ raised in the specific case of +HTTP URLs. + +The exception classes are exported from the *note urllib.error: 128. +module. + +* Menu: + +* URLError:: +* HTTPError:: +* Wrapping it Up:: + + +File: python.info, Node: URLError, Next: HTTPError, Up: Handling Exceptions<2> + +10.13.3.1 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. + + >>> 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') + + +File: python.info, Node: HTTPError, Next: Wrapping it Up, Prev: URLError, Up: Handling Exceptions<2> + +10.13.3.2 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 +‘HTTPError’. Typical errors include ‘404’ (page not found), ‘403’ +(request forbidden), and ‘401’ (authentication required). + +See section 10 of RFC 2616(1) for a reference on all the HTTP error +codes. + +The ‘HTTPError’ instance raised will have an integer ‘code’ attribute, +which corresponds to the error sent by the server. + +* Menu: + +* Error Codes:: + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2616.html + + +File: python.info, Node: Error Codes, Up: HTTPError + +10.13.3.3 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. + +*note http.server.BaseHTTPRequestHandler.responses: 328d. is a useful +dictionary of response codes in that shows all the response codes used +by RFC 2616(1). The dictionary is reproduced here for convenience + + # Table mapping response codes to messages; entries have the + # form {code: (shortmessage, longmessage)}. + responses = { + 100: ('Continue', 'Request received, please continue'), + 101: ('Switching Protocols', + 'Switching to new protocol; obey Upgrade header'), + + 200: ('OK', 'Request fulfilled, document follows'), + 201: ('Created', 'Document created, URL follows'), + 202: ('Accepted', + 'Request accepted, processing continues off-line'), + 203: ('Non-Authoritative Information', 'Request fulfilled from cache'), + 204: ('No Content', 'Request fulfilled, nothing follows'), + 205: ('Reset Content', 'Clear input form for further input.'), + 206: ('Partial Content', 'Partial content follows.'), + + 300: ('Multiple Choices', + 'Object has several resources -- see URI list'), + 301: ('Moved Permanently', 'Object moved permanently -- see URI list'), + 302: ('Found', 'Object moved temporarily -- see URI list'), + 303: ('See Other', 'Object moved -- see Method and URL list'), + 304: ('Not Modified', + 'Document has not changed since given time'), + 305: ('Use Proxy', + 'You must use proxy specified in Location to access this ' + 'resource.'), + 307: ('Temporary Redirect', + 'Object moved temporarily -- see URI list'), + + 400: ('Bad Request', + 'Bad request syntax or unsupported method'), + 401: ('Unauthorized', + 'No permission -- see authorization schemes'), + 402: ('Payment Required', + 'No payment -- see charging schemes'), + 403: ('Forbidden', + 'Request forbidden -- authorization will not help'), + 404: ('Not Found', 'Nothing matches the given URI'), + 405: ('Method Not Allowed', + 'Specified method is invalid for this server.'), + 406: ('Not Acceptable', 'URI not available in preferred format.'), + 407: ('Proxy Authentication Required', 'You must authenticate with ' + 'this proxy before proceeding.'), + 408: ('Request Timeout', 'Request timed out; try again later.'), + 409: ('Conflict', 'Request conflict.'), + 410: ('Gone', + 'URI no longer exists and has been permanently removed.'), + 411: ('Length Required', 'Client must specify Content-Length.'), + 412: ('Precondition Failed', 'Precondition in headers is false.'), + 413: ('Request Entity Too Large', 'Entity is too large.'), + 414: ('Request-URI Too Long', 'URI is too long.'), + 415: ('Unsupported Media Type', 'Entity body in unsupported format.'), + 416: ('Requested Range Not Satisfiable', + 'Cannot satisfy request range.'), + 417: ('Expectation Failed', + 'Expect condition could not be satisfied.'), + + 500: ('Internal Server Error', 'Server got itself in trouble'), + 501: ('Not Implemented', + 'Server does not support this operation'), + 502: ('Bad Gateway', 'Invalid responses from another server/proxy.'), + 503: ('Service Unavailable', + 'The server cannot process the request due to a high load'), + 504: ('Gateway Timeout', + 'The gateway server did not receive a timely response'), + 505: ('HTTP Version Not Supported', 'Cannot fulfill request.'), + } + +When an error is raised the server responds by returning an HTTP error +code `and' an error page. You can use the ‘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 ‘urllib.response’ module: + + >>> 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'\n\n\nPage Not Found\n + ... + + ---------- Footnotes ---------- + + (1) https://datatracker.ietf.org/doc/html/rfc2616.html + + +File: python.info, Node: Wrapping it Up, Prev: HTTPError, Up: Handling Exceptions<2> + +10.13.3.4 Wrapping it Up +........................ + +So if you want to be prepared for ‘HTTPError’ `or' ‘URLError’ there are +two basic approaches. I prefer the second approach. + +* Menu: + +* Number 1:: +* Number 2:: + + +File: python.info, Node: Number 1, Next: Number 2, Up: Wrapping it Up + +10.13.3.5 Number 1 +.................. + + 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 + + Note: The ‘except HTTPError’ `must' come first, otherwise ‘except + URLError’ will `also' catch an ‘HTTPError’. + + +File: python.info, Node: Number 2, Prev: Number 1, Up: Wrapping it Up + +10.13.3.6 Number 2 +.................. + + 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 + + +File: python.info, Node: info and geturl, Next: Openers and Handlers, Prev: Handling Exceptions<2>, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.4 info and geturl +----------------------- + +The response returned by urlopen (or the ‘HTTPError’ instance) has two +useful methods ‘info()’ and ‘geturl()’ and is defined in the module +*note urllib.response: 12b.. + +`geturl' - this returns the real URL of the page fetched. This is +useful because ‘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. + +`info' - this returns a dictionary-like object that describes the page +fetched, particularly the headers sent by the server. It is currently +an ‘http.client.HTTPMessage’ instance. + +Typical headers include ‘Content-length’, ‘Content-type’, and so on. +See the Quick Reference to HTTP Headers(1) for a useful listing of HTTP +headers with brief explanations of their meaning and use. + + ---------- Footnotes ---------- + + (1) https://jkorpela.fi/http.html + + +File: python.info, Node: Openers and Handlers, Next: Basic Authentication, Prev: info and geturl, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.5 Openers and Handlers +---------------------------- + +When you fetch a URL you use an opener (an instance of the perhaps +confusingly named *note urllib.request.OpenerDirector: 31eb.). Normally +we have been using the default opener - via ‘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 ‘OpenerDirector’, and then call +‘.add_handler(some_handler_instance)’ repeatedly. + +Alternatively, you can use ‘build_opener’, which is a convenience +function for creating opener objects with a single function call. +‘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. + +‘install_opener’ can be used to make an ‘opener’ object the (global) +default opener. This means that calls to ‘urlopen’ will use the opener +you have installed. + +Opener objects have an ‘open’ method, which can be called directly to +fetch urls in the same way as the ‘urlopen’ function: there’s no need to +call ‘install_opener’, except as a convenience. + + +File: python.info, Node: Basic Authentication, Next: Proxies, Prev: Openers and Handlers, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.6 Basic Authentication +---------------------------- + +To illustrate creating and installing a handler we will use the +‘HTTPBasicAuthHandler’. For a more detailed discussion of this subject +– including an explanation of how Basic Authentication works - see the +Basic Authentication Tutorial(1). + +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: +‘WWW-Authenticate: SCHEME realm="REALM"’. + +e.g. + + WWW-Authenticate: Basic realm="cPanel Users" + +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 ‘HTTPBasicAuthHandler’ and an opener to use this handler. + +The ‘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 ‘HTTPPasswordMgr’. Frequently one doesn’t +care what the realm is. In that case, it is convenient to use +‘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 ‘None’ as the realm argument to the +‘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. + + # 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) + + Note: In the above example we only supplied our + ‘HTTPBasicAuthHandler’ to ‘build_opener’. By default openers have + the handlers for normal situations – ‘ProxyHandler’ (if a proxy + setting such as an ‘http_proxy’ environment variable is set), + ‘UnknownHandler’, ‘HTTPHandler’, ‘HTTPDefaultErrorHandler’, + ‘HTTPRedirectHandler’, ‘FTPHandler’, ‘FileHandler’, ‘DataHandler’, + ‘HTTPErrorProcessor’. + +‘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. +‘"http://example.com/"’ `or' an “authority” (i.e. the hostname, +optionally including the port number) e.g. ‘"example.com"’ or +‘"example.com:8080"’ (the latter example includes a port number). The +authority, if present, must NOT contain the “userinfo” component - for +example ‘"joe:password@example.com"’ is not correct. + + ---------- Footnotes ---------- + + (1) http://www.voidspace.org.uk/python/articles/authentication.shtml + + +File: python.info, Node: Proxies, Next: Sockets and Layers, Prev: Basic Authentication, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.7 Proxies +--------------- + +`urllib' will auto-detect your proxy settings and use those. This is +through the ‘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 (1). One way to do this +is to setup our own ‘ProxyHandler’, with no proxies defined. This is +done using similar steps to setting up a Basic Authentication(2) +handler: + + >>> proxy_support = urllib.request.ProxyHandler({}) + >>> opener = urllib.request.build_opener(proxy_support) + >>> urllib.request.install_opener(opener) + + Note: Currently ‘urllib.request’ `does not' support fetching of + ‘https’ locations through a proxy. However, this can be enabled by + extending urllib.request as shown in the recipe (3). + + Note: ‘HTTP_PROXY’ will be ignored if a variable ‘REQUEST_METHOD’ + is set; see the documentation on *note getproxies(): 31f8. + + ---------- Footnotes ---------- + + (1) 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. + + (2) +https://web.archive.org/web/20201215133350/http://www.voidspace.org.uk/python/articles/authentication.shtml + + (3) urllib opener for SSL proxy (CONNECT method): ASPN Cookbook +Recipe (https://code.activestate.com/recipes/456195/). + + +File: python.info, Node: Sockets and Layers, Next: Footnotes, Prev: Proxies, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.8 Sockets and Layers +-------------------------- + +The Python support for fetching resources from the web is layered. +urllib uses the *note http.client: 8f. 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 + + 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) + +__________________________________________________________________ + + +File: python.info, Node: Footnotes, Prev: Sockets and Layers, Up: HOWTO Fetch Internet Resources Using The urllib Package + +10.13.9 Footnotes +----------------- + +This document was reviewed and revised by John Lee. + + +File: python.info, Node: Argparse Tutorial, Next: An introduction to the ipaddress module, Prev: HOWTO Fetch Internet Resources Using The urllib Package, Up: Python HOWTOs + +10.14 Argparse Tutorial +======================= + + +author: Tshepang Lekhonkhobe + +This tutorial is intended to be a gentle introduction to *note argparse: +5, the recommended command-line parsing module in the Python standard +library. + + Note: There are two other modules that fulfill the same task, + namely *note getopt: 81. (an equivalent for ‘getopt()’ from the C + language) and the deprecated *note optparse: c1. Note also that + *note argparse: 5. is based on *note optparse: c1, and therefore + very similar in terms of usage. + +* Menu: + +* Concepts:: +* The basics:: +* Introducing Positional arguments:: +* Introducing Optional arguments:: +* Combining Positional and Optional arguments:: +* Getting a little more advanced:: +* Conclusion:: + + +File: python.info, Node: Concepts, Next: The basics, Up: Argparse Tutorial + +10.14.1 Concepts +---------------- + +Let’s show the sort of functionality that we are going to explore in +this introductory tutorial by making use of the ‘ls’ command: + + $ 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. + ... + +A few concepts we can learn from the four commands: + + * The ‘ls’ command is useful when run without any options at all. It + defaults to displaying the contents of the current directory. + + * 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, + ‘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 ‘cp’, whose + most basic usage is ‘cp SRC DEST’. The first position is `what you + want copied,' and the second position is `where you want it copied + to'. + + * 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 ‘-l’ in that case is known as an optional + argument. + + * 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. + + +File: python.info, Node: The basics, Next: Introducing Positional arguments, Prev: Concepts, Up: Argparse Tutorial + +10.14.2 The basics +------------------ + +Let us start with a very simple example which does (almost) nothing: + + import argparse + parser = argparse.ArgumentParser() + parser.parse_args() + +Following is a result of running the code: + + $ python3 prog.py + $ python3 prog.py --help + usage: prog.py [-h] + + options: + -h, --help show this help message and exit + $ python3 prog.py --verbose + usage: prog.py [-h] + prog.py: error: unrecognized arguments: --verbose + $ python3 prog.py foo + usage: prog.py [-h] + prog.py: error: unrecognized arguments: foo + +Here is what is happening: + + * Running the script without any options results in nothing displayed + to stdout. Not so useful. + + * The second one starts to display the usefulness of the *note + argparse: 5. module. We have done almost nothing, but already we + get a nice help message. + + * The ‘--help’ option, which can also be shortened to ‘-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. + + +File: python.info, Node: Introducing Positional arguments, Next: Introducing Optional arguments, Prev: The basics, Up: Argparse Tutorial + +10.14.3 Introducing Positional arguments +---------------------------------------- + +An example: + + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("echo") + args = parser.parse_args() + print(args.echo) + +And running the code: + + $ python3 prog.py + usage: prog.py [-h] echo + prog.py: error: the following arguments are required: echo + $ python3 prog.py --help + usage: prog.py [-h] echo + + positional arguments: + echo + + options: + -h, --help show this help message and exit + $ python3 prog.py foo + foo + +Here is what’s happening: + + * We’ve added the ‘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 ‘echo’ so that it’s in line + with its function. + + * Calling our program now requires us to specify an option. + + * The ‘parse_args()’ method actually returns some data from the + options specified, in this case, ‘echo’. + + * The variable is some form of ‘magic’ that *note argparse: 5. + 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, ‘echo’. + +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 ‘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: + + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("echo", help="echo the string you use here") + args = parser.parse_args() + print(args.echo) + +And we get: + + $ python3 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 + +Now, how about doing something even more useful: + + 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) + +Following is a result of running the code: + + $ python3 prog.py 4 + Traceback (most recent call last): + File "prog.py", line 5, in + print(args.square**2) + TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int' + +That didn’t go so well. That’s because *note argparse: 5. treats the +options we give it as strings, unless we tell it otherwise. So, let’s +tell *note argparse: 5. to treat that input as an integer: + + 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) + +Following is a result of running the code: + + $ python3 prog.py 4 + 16 + $ python3 prog.py four + usage: prog.py [-h] square + prog.py: error: argument square: invalid int value: 'four' + +That went well. The program now even helpfully quits on bad illegal +input before proceeding. + + +File: python.info, Node: Introducing Optional arguments, Next: Combining Positional and Optional arguments, Prev: Introducing Positional arguments, Up: Argparse Tutorial + +10.14.4 Introducing Optional arguments +-------------------------------------- + +So far we have been playing with positional arguments. Let us have a +look on how to add optional ones: + + import argparse + parser = argparse.ArgumentParser() + parser.add_argument("--verbosity", help="increase output verbosity") + args = parser.parse_args() + if args.verbosity: + print("verbosity turned on") + +And the output: + + $ python3 prog.py --verbosity 1 + verbosity turned on + $ python3 prog.py + $ python3 prog.py --help + usage: prog.py [-h] [--verbosity VERBOSITY] + + options: + -h, --help show this help message and exit + --verbosity VERBOSITY + increase output verbosity + $ python3 prog.py --verbosity + usage: prog.py [-h] [--verbosity VERBOSITY] + prog.py: error: argument --verbosity: expected one argument + +Here is what is happening: + + * The program is written so as to display something when + ‘--verbosity’ is specified and display nothing when not. + + * 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 + ‘args.verbosity’, is given ‘None’ as a value, which is the reason + it fails the truth test of the *note if: 467. statement. + + * The help message is a bit different. + + * When using the ‘--verbosity’ option, one must also specify some + value, any value. + +The above example accepts arbitrary integer values for ‘--verbosity’, +but for our simple program, only two values are actually useful, ‘True’ +or ‘False’. Let’s modify the code accordingly: + + 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") + +And the output: + + $ python3 prog.py --verbose + verbosity turned on + $ python3 prog.py --verbose 1 + usage: prog.py [-h] [--verbose] + prog.py: error: unrecognized arguments: 1 + $ python3 prog.py --help + usage: prog.py [-h] [--verbose] + + options: + -h, --help show this help message and exit + --verbose increase output verbosity + +Here is what is happening: + + * 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, ‘action’, and give it the + value ‘"store_true"’. This means that, if the option is specified, + assign the value ‘True’ to ‘args.verbose’. Not specifying it + implies ‘False’. + + * It complains when you specify a value, in true spirit of what flags + actually are. + + * Notice the different help text. + +* Menu: + +* Short options:: + + +File: python.info, Node: Short options, Up: Introducing Optional arguments + +10.14.4.1 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: + + 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") + +And here goes: + + $ python3 prog.py -v + verbosity turned on + $ python3 prog.py --help + usage: prog.py [-h] [-v] + + options: + -h, --help show this help message and exit + -v, --verbose increase output verbosity + +Note that the new ability is also reflected in the help text. + + +File: python.info, Node: Combining Positional and Optional arguments, Next: Getting a little more advanced, Prev: Introducing Optional arguments, Up: Argparse Tutorial + +10.14.5 Combining Positional and Optional arguments +--------------------------------------------------- + +Our program keeps growing in complexity: + + 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) + +And now the output: + + $ python3 prog.py + usage: prog.py [-h] [-v] square + prog.py: error: the following arguments are required: square + $ python3 prog.py 4 + 16 + $ python3 prog.py 4 --verbose + the square of 4 equals 16 + $ python3 prog.py --verbose 4 + the square of 4 equals 16 + + * We’ve brought back a positional argument, hence the complaint. + + * Note that the order does not matter. + +How about we give this program of ours back the ability to have multiple +verbosity values, and actually get to use them: + + 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) + +And the output: + + $ python3 prog.py 4 + 16 + $ python3 prog.py 4 -v + usage: prog.py [-h] [-v VERBOSITY] square + prog.py: error: argument -v/--verbosity: expected one argument + $ python3 prog.py 4 -v 1 + 4^2 == 16 + $ python3 prog.py 4 -v 2 + the square of 4 equals 16 + $ python3 prog.py 4 -v 3 + 16 + +These all look good except the last one, which exposes a bug in our +program. Let’s fix it by restricting the values the ‘--verbosity’ +option can accept: + + 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) + +And the output: + + $ python3 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) + $ python3 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 {0,1,2}, --verbosity {0,1,2} + increase output verbosity + +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 ‘python --help’): + + 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) + +We have introduced another action, “count”, to count the number of +occurrences of specific options. + + $ python3 prog.py 4 + 16 + $ python3 prog.py 4 -v + 4^2 == 16 + $ python3 prog.py 4 -vv + the square of 4 equals 16 + $ python3 prog.py 4 --verbosity --verbosity + the square of 4 equals 16 + $ python3 prog.py 4 -v 1 + usage: prog.py [-h] [-v] square + prog.py: error: unrecognized arguments: 1 + $ python3 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 + $ python3 prog.py 4 -vvv + 16 + + * Yes, it’s now more of a flag (similar to ‘action="store_true"’) in + the previous version of our script. That should explain the + complaint. + + * It also behaves similar to “store_true” action. + + * Now here’s a demonstration of what the “count” action gives. + You’ve probably seen this sort of usage before. + + * And if you don’t specify the ‘-v’ flag, that flag is considered to + have ‘None’ value. + + * As should be expected, specifying the long form of the flag, we + should get the same output. + + * 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 ‘help’ keyword + argument). + + * That last output exposes a bug in our program. + +Let’s fix: + + 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) + +And this is what it gives: + + $ python3 prog.py 4 -vvv + the square of 4 equals 16 + $ python3 prog.py 4 -vvvv + the square of 4 equals 16 + $ python3 prog.py 4 + Traceback (most recent call last): + File "prog.py", line 11, in + if args.verbosity >= 2: + TypeError: '>=' not supported between instances of 'NoneType' and 'int' + + * First output went well, and fixes the bug we had before. That is, + we want any value >= 2 to be as verbose as possible. + + * Third output not so good. + +Let’s fix that bug: + + 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) + +We’ve just introduced yet another keyword, ‘default’. We’ve set it to +‘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 +‘None’ value, and that cannot be compared to an int value (hence the +*note TypeError: 19c. exception). + +And: + + $ python3 prog.py 4 + 16 + +You can go quite far just with what we’ve learned so far, and we have +only scratched the surface. The *note argparse: 5. module is very +powerful, and we’ll explore a bit more of it before we end this +tutorial. + + +File: python.info, Node: Getting a little more advanced, Next: Conclusion, Prev: Combining Positional and Optional arguments, Up: Argparse Tutorial + +10.14.6 Getting a little more advanced +-------------------------------------- + +What if we wanted to expand our tiny program to perform other powers, +not just squares: + + 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) + +Output: + + $ python3 prog.py + usage: prog.py [-h] [-v] x y + prog.py: error: the following arguments are required: x, y + $ python3 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 + $ python3 prog.py 4 2 -v + 4^2 == 16 + +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: + + 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) + +Output: + + $ python3 prog.py 4 2 + 16 + $ python3 prog.py 4 2 -v + 4^2 == 16 + $ python3 prog.py 4 2 -vv + Running 'prog.py' + 4^2 == 16 + +* Menu: + +* Conflicting options:: + + +File: python.info, Node: Conflicting options, Up: Getting a little more advanced + +10.14.6.1 Conflicting options +............................. + +So far, we have been working with two methods of an *note +argparse.ArgumentParser: a3e. instance. Let’s introduce a third one, +‘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 ‘--quiet’ option, which will be the opposite of the ‘--verbose’ one: + + 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}") + +Our program is now simpler, and we’ve lost some functionality for the +sake of demonstration. Anyways, here’s the output: + + $ python3 prog.py 4 2 + 4^2 == 16 + $ python3 prog.py 4 2 -q + 16 + $ python3 prog.py 4 2 -v + 4 to the power 2 equals 16 + $ python3 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 + $ python3 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 + +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: + + 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("{} to the power {} equals {}".format(args.x, args.y, answer)) + else: + print("{}^{} == {}".format(args.x, args.y, answer)) + +Note that slight difference in the usage text. Note the ‘[-v | -q]’, +which tells us that we can either use ‘-v’ or ‘-q’, but not both at the +same time: + + $ python3 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 + + +File: python.info, Node: Conclusion, Prev: Getting a little more advanced, Up: Argparse Tutorial + +10.14.7 Conclusion +------------------ + +The *note argparse: 5. 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. + + +File: python.info, Node: An introduction to the ipaddress module, Next: Argument Clinic How-To, Prev: Argparse Tutorial, Up: Python HOWTOs + +10.15 An introduction to the ipaddress module +============================================= + + +author: Peter Moody + + +author: Nick Coghlan + +Overview +........ + +This document aims to provide a gentle introduction to the *note +ipaddress: a0. 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 *note ipaddress: a0. +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:: + + +File: python.info, Node: Creating Address/Network/Interface objects, Next: Inspecting Address/Network/Interface Objects, Up: An introduction to the ipaddress module + +10.15.1 Creating Address/Network/Interface objects +-------------------------------------------------- + +Since *note ipaddress: a0. is a module for inspecting and manipulating +IP addresses, the first thing you’ll want to do is create some objects. +You can use *note ipaddress: a0. to create objects from strings and +integers. + +* Menu: + +* A Note on IP Versions:: +* IP Host Addresses:: +* Defining Networks:: +* Host Interfaces:: + + +File: python.info, Node: A Note on IP Versions, Next: IP Host Addresses, Up: Creating Address/Network/Interface objects + +10.15.1.1 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. + + +File: python.info, Node: IP Host Addresses, Next: Defining Networks, Prev: A Note on IP Versions, Up: Creating Address/Network/Interface objects + +10.15.1.2 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 *note ipaddress.ip_address(): 346c. factory function, +which automatically determines whether to create an IPv4 or IPv6 address +based on the passed in value: + + >>> ipaddress.ip_address('192.0.2.1') + IPv4Address('192.0.2.1') + >>> ipaddress.ip_address('2001:DB8::1') + IPv6Address('2001:db8::1') + +Addresses can also be created directly from integers. Values that will +fit within 32 bits are assumed to be IPv4 addresses: + + >>> ipaddress.ip_address(3221225985) + IPv4Address('192.0.2.1') + >>> ipaddress.ip_address(42540766411282592856903984951653826561) + IPv6Address('2001:db8::1') + +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: + + >>> ipaddress.ip_address(1) + IPv4Address('0.0.0.1') + >>> ipaddress.IPv4Address(1) + IPv4Address('0.0.0.1') + >>> ipaddress.IPv6Address(1) + IPv6Address('::1') + + +File: python.info, Node: Defining Networks, Next: Host Interfaces, Prev: IP Host Addresses, Up: Creating Address/Network/Interface objects + +10.15.1.3 Defining Networks +........................... + +Host addresses are usually grouped together into IP networks, so *note +ipaddress: a0. 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: + + >>> 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') + +Network objects cannot have any host bits set. The practical effect of +this is that ‘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 *note ValueError: 1c8. being raised. To request that the +additional bits instead be coerced to zero, the flag ‘strict=False’ can +be passed to the constructor: + + >>> 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') + +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: + + >>> ipaddress.ip_network(3221225984) + IPv4Network('192.0.2.0/32') + >>> ipaddress.ip_network(42540766411282592856903984951653826560) + IPv6Network('2001:db8::/128') + +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. + + +File: python.info, Node: Host Interfaces, Prev: Defining Networks, Up: Creating Address/Network/Interface objects + +10.15.1.4 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 ‘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 ‘192.0.2.1’ on the network ‘192.0.2.0/24’”, +Accordingly, *note ipaddress: a0. 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. + + >>> 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') + +Integer inputs are accepted (as with networks), and use of a particular +IP version can be forced by calling the relevant constructor directly. + + +File: python.info, Node: Inspecting Address/Network/Interface Objects, Next: Networks as lists of Addresses, Prev: Creating Address/Network/Interface objects, Up: An introduction to the ipaddress module + +10.15.2 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. *note ipaddress: a0. tries to make doing this +easy and intuitive. + +Extracting the IP version: + + >>> addr4 = ipaddress.ip_address('192.0.2.1') + >>> addr6 = ipaddress.ip_address('2001:db8::1') + >>> addr6.version + 6 + >>> addr4.version + 4 + +Obtaining the network from an interface: + + >>> 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') + +Finding out how many individual addresses are in a network: + + >>> 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 + +Iterating through the “usable” addresses on a network: + + >>> 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 + +Obtaining the netmask (i.e. set bits corresponding to the network +prefix) or the hostmask (any bits that are not part of the netmask): + + >>> 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') + +Exploding or compressing the address: + + >>> 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' + +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. + + +File: python.info, Node: Networks as lists of Addresses, Next: Comparisons<4>, Prev: Inspecting Address/Network/Interface Objects, Up: An introduction to the ipaddress module + +10.15.3 Networks as lists of Addresses +-------------------------------------- + +It’s sometimes useful to treat networks as lists. This means it is +possible to index them like this: + + >>> 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') + +It also means that network objects lend themselves to using the list +membership test syntax like this: + + if address in network: + # do something + +Containment testing is done efficiently based on the network prefix: + + >>> 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 + + +File: python.info, Node: Comparisons<4>, Next: Using IP Addresses with other modules, Prev: Networks as lists of Addresses, Up: An introduction to the ipaddress module + +10.15.4 Comparisons +------------------- + +*note ipaddress: a0. provides some simple, hopefully intuitive ways to +compare objects, where it makes sense: + + >>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2') + True + +A *note TypeError: 19c. exception is raised if you try to compare +objects of different versions or different types. + + +File: python.info, Node: Using IP Addresses with other modules, Next: Getting more detail when instance creation fails, Prev: Comparisons<4>, Up: An introduction to the ipaddress module + +10.15.5 Using IP Addresses with other modules +--------------------------------------------- + +Other modules that use IP addresses (such as *note socket: ec.) 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: + + >>> addr4 = ipaddress.ip_address('192.0.2.1') + >>> str(addr4) + '192.0.2.1' + >>> int(addr4) + 3221225985 + + +File: python.info, Node: Getting more detail when instance creation fails, Prev: Using IP Addresses with other modules, Up: An introduction to the ipaddress module + +10.15.6 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 *note +ValueError: 1c8. 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 +*note ValueError: 1c8. subclasses *note ipaddress.AddressValueError: +3472. and *note ipaddress.NetmaskValueError: 3498. 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: + + >>> 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 + +However, both of the module specific exceptions have *note ValueError: +1c8. as their parent class, so if you’re not concerned with the +particular type of error, you can still write code like the following: + + try: + network = ipaddress.IPv4Network(address) + except ValueError: + print('address/netmask is invalid for IPv4:', address) + + +File: python.info, Node: Argument Clinic How-To, Next: Instrumenting CPython with DTrace and SystemTap, Prev: An introduction to the ipaddress module, Up: Python HOWTOs + +10.16 Argument Clinic How-To +============================ + + +author: Larry Hastings + +Abstract +........ + +Argument Clinic is a preprocessor for CPython C files. Its purpose is +to automate all the boilerplate involved with writing argument parsing +code for “builtins”. This document shows you how to convert your first +C function to work with Argument Clinic, and then introduces some +advanced topics on Argument Clinic usage. + +Currently Argument Clinic is considered internal-only for CPython. Its +use is not supported for files outside CPython, and no guarantees are +made regarding backwards compatibility for future versions. In other +words: if you maintain an external C extension for CPython, you’re +welcome to experiment with Argument Clinic in your own code. But the +version of Argument Clinic that ships with the next version of CPython +`could' be totally incompatible and break all your code. + +* Menu: + +* The Goals Of Argument Clinic:: +* Basic Concepts And Usage:: +* Converting Your First Function:: +* Advanced Topics:: + + +File: python.info, Node: The Goals Of Argument Clinic, Next: Basic Concepts And Usage, Up: Argument Clinic How-To + +10.16.1 The Goals Of Argument Clinic +------------------------------------ + +Argument Clinic’s primary goal is to take over responsibility for all +argument parsing code inside CPython. This means that, when you convert +a function to work with Argument Clinic, that function should no longer +do any of its own argument parsing—the code generated by Argument Clinic +should be a “black box” to you, where CPython calls in at the top, and +your code gets called at the bottom, with ‘PyObject *args’ (and maybe +‘PyObject *kwargs’) magically converted into the C variables and types +you need. + +In order for Argument Clinic to accomplish its primary goal, it must be +easy to use. Currently, working with CPython’s argument parsing library +is a chore, requiring maintaining redundant information in a surprising +number of places. When you use Argument Clinic, you don’t have to +repeat yourself. + +Obviously, no one would want to use Argument Clinic unless it’s solving +their problem—and without creating new problems of its own. So it’s +paramount that Argument Clinic generate correct code. It’d be nice if +the code was faster, too, but at the very least it should not introduce +a major speed regression. (Eventually Argument Clinic `should' make a +major speedup possible—we could rewrite its code generator to produce +tailor-made argument parsing code, rather than calling the +general-purpose CPython argument parsing library. That would make for +the fastest argument parsing possible!) + +Additionally, Argument Clinic must be flexible enough to work with any +approach to argument parsing. Python has some functions with some very +strange parsing behaviors; Argument Clinic’s goal is to support all of +them. + +Finally, the original motivation for Argument Clinic was to provide +introspection “signatures” for CPython builtins. It used to be, the +introspection query functions would throw an exception if you passed in +a builtin. With Argument Clinic, that’s a thing of the past! + +One idea you should keep in mind, as you work with Argument Clinic: the +more information you give it, the better job it’ll be able to do. +Argument Clinic is admittedly relatively simple right now. But as it +evolves it will get more sophisticated, and it should be able to do many +interesting and smart things with all the information you give it. + + +File: python.info, Node: Basic Concepts And Usage, Next: Converting Your First Function, Prev: The Goals Of Argument Clinic, Up: Argument Clinic How-To + +10.16.2 Basic Concepts And Usage +-------------------------------- + +Argument Clinic ships with CPython; you’ll find it in +‘Tools/clinic/clinic.py’. If you run that script, specifying a C file +as an argument: + + $ python3 Tools/clinic/clinic.py foo.c + +Argument Clinic will scan over the file looking for lines that look +exactly like this: + + /*[clinic input] + +When it finds one, it reads everything up to a line that looks exactly +like this: + + [clinic start generated code]*/ + +Everything in between these two lines is input for Argument Clinic. All +of these lines, including the beginning and ending comment lines, are +collectively called an Argument Clinic “block”. + +When Argument Clinic parses one of these blocks, it generates output. +This output is rewritten into the C file immediately after the block, +followed by a comment containing a checksum. The Argument Clinic block +now looks like this: + + /*[clinic input] + ... clinic input goes here ... + [clinic start generated code]*/ + ... clinic output goes here ... + /*[clinic end generated code: checksum=...]*/ + +If you run Argument Clinic on the same file a second time, Argument +Clinic will discard the old output and write out the new output with a +fresh checksum line. However, if the input hasn’t changed, the output +won’t change either. + +You should never modify the output portion of an Argument Clinic block. +Instead, change the input until it produces the output you want. +(That’s the purpose of the checksum—to detect if someone changed the +output, as these edits would be lost the next time Argument Clinic +writes out fresh output.) + +For the sake of clarity, here’s the terminology we’ll use with Argument +Clinic: + + * The first line of the comment (‘/*[clinic input]’) is the `start + line'. + + * The last line of the initial comment (‘[clinic start generated + code]*/’) is the `end line'. + + * The last line (‘/*[clinic end generated code: checksum=...]*/’) is + the `checksum line'. + + * In between the start line and the end line is the `input'. + + * In between the end line and the checksum line is the `output'. + + * All the text collectively, from the start line to the checksum line + inclusively, is the `block'. (A block that hasn’t been + successfully processed by Argument Clinic yet doesn’t have output + or a checksum line, but it’s still considered a block.) + + +File: python.info, Node: Converting Your First Function, Next: Advanced Topics, Prev: Basic Concepts And Usage, Up: Argument Clinic How-To + +10.16.3 Converting Your First Function +-------------------------------------- + +The best way to get a sense of how Argument Clinic works is to convert a +function to work with it. Here, then, are the bare minimum steps you’d +need to follow to convert a function to work with Argument Clinic. Note +that for code you plan to check in to CPython, you really should take +the conversion farther, using some of the advanced concepts you’ll see +later on in the document (like “return converters” and “self +converters”). But we’ll keep it simple for this walkthrough so you can +learn. + +Let’s dive in! + + 0. Make sure you’re working with a freshly updated checkout of the + CPython trunk. + + 1. Find a Python builtin that calls either *note PyArg_ParseTuple(): + 4d9. or *note PyArg_ParseTupleAndKeywords(): 987, and hasn’t been + converted to work with Argument Clinic yet. For my example I’m + using ‘_pickle.Pickler.dump()’. + + 2. If the call to the ‘PyArg_Parse’ function uses any of the following + format units: + + O& + O! + es + es# + et + et# + + or if it has multiple calls to *note PyArg_ParseTuple(): 4d9, you + should choose a different function. Argument Clinic `does' support + all of these scenarios. But these are advanced topics—let’s do + something simpler for your first function. + + Also, if the function has multiple calls to *note + PyArg_ParseTuple(): 4d9. or *note PyArg_ParseTupleAndKeywords(): + 987. where it supports different types for the same argument, or if + the function uses something besides PyArg_Parse functions to parse + its arguments, it probably isn’t suitable for conversion to + Argument Clinic. Argument Clinic doesn’t support generic functions + or polymorphic parameters. + + 3. Add the following boilerplate above the function, creating our + block: + + /*[clinic input] + [clinic start generated code]*/ + + 4. Cut the docstring and paste it in between the ‘[clinic]’ lines, + removing all the junk that makes it a properly quoted C string. + When you’re done you should have just the text, based at the left + margin, with no line wider than 80 characters. (Argument Clinic + will preserve indents inside the docstring.) + + If the old docstring had a first line that looked like a function + signature, throw that line away. (The docstring doesn’t need it + anymore—when you use ‘help()’ on your builtin in the future, the + first line will be built automatically based on the function’s + signature.) + + Sample: + + /*[clinic input] + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + 5. If your docstring doesn’t have a “summary” line, Argument Clinic + will complain. So let’s make sure it has one. The “summary” line + should be a paragraph consisting of a single 80-column line at the + beginning of the docstring. + + (Our example docstring consists solely of a summary line, so the + sample code doesn’t have to change for this step.) + + 6. Above the docstring, enter the name of the function, followed by a + blank line. This should be the Python name of the function, and + should be the full dotted path to the function—it should start with + the name of the module, include any sub-modules, and if the + function is a method on a class it should include the class name + too. + + Sample: + + /*[clinic input] + _pickle.Pickler.dump + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + 7. If this is the first time that module or class has been used with + Argument Clinic in this C file, you must declare the module and/or + class. Proper Argument Clinic hygiene prefers declaring these in a + separate block somewhere near the top of the C file, in the same + way that include files and statics go at the top. (In our sample + code we’ll just show the two blocks next to each other.) + + The name of the class and module should be the same as the one seen + by Python. Check the name defined in the *note PyModuleDef: 5d2. + or *note PyTypeObject: 701. as appropriate. + + When you declare a class, you must also specify two aspects of its + type in C: the type declaration you’d use for a pointer to an + instance of this class, and a pointer to the *note PyTypeObject: + 701. for this class. + + Sample: + + /*[clinic input] + module _pickle + class _pickle.Pickler "PicklerObject *" "&Pickler_Type" + [clinic start generated code]*/ + + /*[clinic input] + _pickle.Pickler.dump + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + 8. Declare each of the parameters to the function. Each parameter + should get its own line. All the parameter lines should be + indented from the function name and the docstring. + + The general form of these parameter lines is as follows: + + name_of_parameter: converter + + If the parameter has a default value, add that after the converter: + + name_of_parameter: converter = default_value + + Argument Clinic’s support for “default values” is quite + sophisticated; please see *note the section below on default + values: 4955. for more information. + + Add a blank line below the parameters. + + What’s a “converter”? It establishes both the type of the variable + used in C, and the method to convert the Python value into a C + value at runtime. For now you’re going to use what’s called a + “legacy converter”—a convenience syntax intended to make porting + old code into Argument Clinic easier. + + For each parameter, copy the “format unit” for that parameter from + the ‘PyArg_Parse()’ format argument and specify `that' as its + converter, as a quoted string. (“format unit” is the formal name + for the one-to-three character substring of the ‘format’ parameter + that tells the argument parsing function what the type of the + variable is and how to convert it. For more on format units please + see *note Parsing arguments and building values: 4db.) + + For multicharacter format units like ‘z#’, use the entire + two-or-three character string. + + Sample: + + /*[clinic input] + module _pickle + class _pickle.Pickler "PicklerObject *" "&Pickler_Type" + [clinic start generated code]*/ + + /*[clinic input] + _pickle.Pickler.dump + + obj: 'O' + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + 9. If your function has ‘|’ in the format string, meaning some + parameters have default values, you can ignore it. Argument Clinic + infers which parameters are optional based on whether or not they + have default values. + + If your function has ‘$’ in the format string, meaning it takes + keyword-only arguments, specify ‘*’ on a line by itself before the + first keyword-only argument, indented the same as the parameter + lines. + + (‘_pickle.Pickler.dump’ has neither, so our sample is unchanged.) + + 10. If the existing C function calls *note PyArg_ParseTuple(): 4d9. + (as opposed to *note PyArg_ParseTupleAndKeywords(): 987.), then all + its arguments are positional-only. + + To mark all parameters as positional-only in Argument Clinic, add a + ‘/’ on a line by itself after the last parameter, indented the same + as the parameter lines. + + Currently this is all-or-nothing; either all parameters are + positional-only, or none of them are. (In the future Argument + Clinic may relax this restriction.) + + Sample: + + /*[clinic input] + module _pickle + class _pickle.Pickler "PicklerObject *" "&Pickler_Type" + [clinic start generated code]*/ + + /*[clinic input] + _pickle.Pickler.dump + + obj: 'O' + / + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + 11. It’s helpful to write a per-parameter docstring for each + parameter. But per-parameter docstrings are optional; you can skip + this step if you prefer. + + Here’s how to add a per-parameter docstring. The first line of the + per-parameter docstring must be indented further than the parameter + definition. The left margin of this first line establishes the + left margin for the whole per-parameter docstring; all the text you + write will be outdented by this amount. You can write as much text + as you like, across multiple lines if you wish. + + Sample: + + /*[clinic input] + module _pickle + class _pickle.Pickler "PicklerObject *" "&Pickler_Type" + [clinic start generated code]*/ + + /*[clinic input] + _pickle.Pickler.dump + + obj: 'O' + The object to be pickled. + / + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + 12. Save and close the file, then run ‘Tools/clinic/clinic.py’ on it. + With luck everything worked—your block now has output, and a ‘.c.h’ + file has been generated! Reopen the file in your text editor to + see: + + /*[clinic input] + _pickle.Pickler.dump + + obj: 'O' + The object to be pickled. + / + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + static PyObject * + _pickle_Pickler_dump(PicklerObject *self, PyObject *obj) + /*[clinic end generated code: output=87ecad1261e02ac7 input=552eb1c0f52260d9]*/ + + Obviously, if Argument Clinic didn’t produce any output, it’s + because it found an error in your input. Keep fixing your errors + and retrying until Argument Clinic processes your file without + complaint. + + For readability, most of the glue code has been generated to a + ‘.c.h’ file. You’ll need to include that in your original ‘.c’ + file, typically right after the clinic module block: + + #include "clinic/_pickle.c.h" + + 13. Double-check that the argument-parsing code Argument Clinic + generated looks basically the same as the existing code. + + First, ensure both places use the same argument-parsing function. + The existing code must call either *note PyArg_ParseTuple(): 4d9. + or *note PyArg_ParseTupleAndKeywords(): 987.; ensure that the code + generated by Argument Clinic calls the `exact' same function. + + Second, the format string passed in to *note PyArg_ParseTuple(): + 4d9. or *note PyArg_ParseTupleAndKeywords(): 987. should be + `exactly' the same as the hand-written one in the existing + function, up to the colon or semi-colon. + + (Argument Clinic always generates its format strings with a ‘:’ + followed by the name of the function. If the existing code’s + format string ends with ‘;’, to provide usage help, this change is + harmless—don’t worry about it.) + + Third, for parameters whose format units require two arguments + (like a length variable, or an encoding string, or a pointer to a + conversion function), ensure that the second argument is `exactly' + the same between the two invocations. + + Fourth, inside the output portion of the block you’ll find a + preprocessor macro defining the appropriate static *note + PyMethodDef: 1119. structure for this builtin: + + #define __PICKLE_PICKLER_DUMP_METHODDEF \ + {"dump", (PyCFunction)__pickle_Pickler_dump, METH_O, __pickle_Pickler_dump__doc__}, + + This static structure should be `exactly' the same as the existing + static *note PyMethodDef: 1119. structure for this builtin. + + If any of these items differ in `any way', adjust your Argument + Clinic function specification and rerun ‘Tools/clinic/clinic.py’ + until they `are' the same. + + 14. Notice that the last line of its output is the declaration of your + “impl” function. This is where the builtin’s implementation goes. + Delete the existing prototype of the function you’re modifying, but + leave the opening curly brace. Now delete its argument parsing + code and the declarations of all the variables it dumps the + arguments into. Notice how the Python arguments are now arguments + to this impl function; if the implementation used different names + for these variables, fix it. + + Let’s reiterate, just because it’s kind of weird. Your code should + now look like this: + + static return_type + your_function_impl(...) + /*[clinic end generated code: checksum=...]*/ + { + ... + + Argument Clinic generated the checksum line and the function + prototype just above it. You should write the opening (and + closing) curly braces for the function, and the implementation + inside. + + Sample: + + /*[clinic input] + module _pickle + class _pickle.Pickler "PicklerObject *" "&Pickler_Type" + [clinic start generated code]*/ + /*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ + + /*[clinic input] + _pickle.Pickler.dump + + obj: 'O' + The object to be pickled. + / + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + + PyDoc_STRVAR(__pickle_Pickler_dump__doc__, + "Write a pickled representation of obj to the open file.\n" + "\n" + ... + static PyObject * + _pickle_Pickler_dump_impl(PicklerObject *self, PyObject *obj) + /*[clinic end generated code: checksum=3bd30745bf206a48f8b576a1da3d90f55a0a4187]*/ + { + /* Check whether the Pickler was initialized correctly (issue3664). + Developers often forget to call __init__() in their subclasses, which + would trigger a segfault without this check. */ + if (self->write == NULL) { + PyErr_Format(PicklingError, + "Pickler.__init__() was not called by %s.__init__()", + Py_TYPE(self)->tp_name); + return NULL; + } + + if (_Pickler_ClearBuffer(self) < 0) + return NULL; + + ... + + 15. Remember the macro with the *note PyMethodDef: 1119. structure for + this function? Find the existing *note PyMethodDef: 1119. + structure for this function and replace it with a reference to the + macro. (If the builtin is at module scope, this will probably be + very near the end of the file; if the builtin is a class method, + this will probably be below but relatively near to the + implementation.) + + Note that the body of the macro contains a trailing comma. So when + you replace the existing static *note PyMethodDef: 1119. structure + with the macro, `don’t' add a comma to the end. + + Sample: + + static struct PyMethodDef Pickler_methods[] = { + __PICKLE_PICKLER_DUMP_METHODDEF + __PICKLE_PICKLER_CLEAR_MEMO_METHODDEF + {NULL, NULL} /* sentinel */ + }; + + 16. Compile, then run the relevant portions of the regression-test + suite. This change should not introduce any new compile-time + warnings or errors, and there should be no externally visible + change to Python’s behavior. + + Well, except for one difference: ‘inspect.signature()’ run on your + function should now provide a valid signature! + + Congratulations, you’ve ported your first function to work with + Argument Clinic! + + +File: python.info, Node: Advanced Topics, Prev: Converting Your First Function, Up: Argument Clinic How-To + +10.16.4 Advanced Topics +----------------------- + +Now that you’ve had some experience working with Argument Clinic, it’s +time for some advanced topics. + +* Menu: + +* Symbolic default values:: +* Renaming the C functions and variables generated by Argument Clinic:: +* Converting functions using PyArg_UnpackTuple:: +* Optional Groups:: +* Using real Argument Clinic converters, instead of “legacy converters”: Using real Argument Clinic converters instead of “legacy converters”. +* Py_buffer:: +* Advanced converters:: +* Parameter default values:: +* The NULL default value:: +* Expressions specified as default values:: +* Using a return converter:: +* Cloning existing functions:: +* Calling Python code:: +* Using a “self converter”:: +* Using a “defining class” converter:: +* Writing a custom converter:: +* Writing a custom return converter:: +* METH_O and METH_NOARGS:: +* tp_new and tp_init functions:: +* Changing and redirecting Clinic’s output:: +* The #ifdef trick:: +* Using Argument Clinic in Python files:: + + +File: python.info, Node: Symbolic default values, Next: Renaming the C functions and variables generated by Argument Clinic, Up: Advanced Topics + +10.16.4.1 Symbolic default values +................................. + +The default value you provide for a parameter can’t be any arbitrary +expression. Currently the following are explicitly supported: + + * Numeric constants (integer and float) + + * String constants + + * ‘True’, ‘False’, and ‘None’ + + * Simple symbolic constants like ‘sys.maxsize’, which must start with + the name of the module + +(In the future, this may need to get even more elaborate, to allow full +expressions like ‘CONSTANT - 1’.) + + +File: python.info, Node: Renaming the C functions and variables generated by Argument Clinic, Next: Converting functions using PyArg_UnpackTuple, Prev: Symbolic default values, Up: Advanced Topics + +10.16.4.2 Renaming the C functions and variables generated by Argument Clinic +............................................................................. + +Argument Clinic automatically names the functions it generates for you. +Occasionally this may cause a problem, if the generated name collides +with the name of an existing C function. There’s an easy solution: +override the names used for the C functions. Just add the keyword +‘"as"’ to your function declaration line, followed by the function name +you wish to use. Argument Clinic will use that function name for the +base (generated) function, then add ‘"_impl"’ to the end and use that +for the name of the impl function. + +For example, if we wanted to rename the C function names generated for +‘pickle.Pickler.dump’, it’d look like this: + + /*[clinic input] + pickle.Pickler.dump as pickler_dumper + + ... + +The base function would now be named ‘pickler_dumper()’, and the impl +function would now be named ‘pickler_dumper_impl()’. + +Similarly, you may have a problem where you want to give a parameter a +specific Python name, but that name may be inconvenient in C. Argument +Clinic allows you to give a parameter different names in Python and in +C, using the same ‘"as"’ syntax: + + /*[clinic input] + pickle.Pickler.dump + + obj: object + file as file_obj: object + protocol: object = NULL + * + fix_imports: bool = True + +Here, the name used in Python (in the signature and the ‘keywords’ +array) would be ‘file’, but the C variable would be named ‘file_obj’. + +You can use this to rename the ‘self’ parameter too! + + +File: python.info, Node: Converting functions using PyArg_UnpackTuple, Next: Optional Groups, Prev: Renaming the C functions and variables generated by Argument Clinic, Up: Advanced Topics + +10.16.4.3 Converting functions using PyArg_UnpackTuple +...................................................... + +To convert a function parsing its arguments with *note +PyArg_UnpackTuple(): 1141, simply write out all the arguments, +specifying each as an ‘object’. You may specify the ‘type’ argument to +cast the type as appropriate. All arguments should be marked +positional-only (add a ‘/’ on a line by itself after the last argument). + +Currently the generated code will use *note PyArg_ParseTuple(): 4d9, but +this will change soon. + + +File: python.info, Node: Optional Groups, Next: Using real Argument Clinic converters instead of “legacy converters”, Prev: Converting functions using PyArg_UnpackTuple, Up: Advanced Topics + +10.16.4.4 Optional Groups +......................... + +Some legacy functions have a tricky approach to parsing their arguments: +they count the number of positional arguments, then use a ‘switch’ +statement to call one of several different *note PyArg_ParseTuple(): +4d9. calls depending on how many positional arguments there are. (These +functions cannot accept keyword-only arguments.) This approach was used +to simulate optional arguments back before *note +PyArg_ParseTupleAndKeywords(): 987. was created. + +While functions using this approach can often be converted to use *note +PyArg_ParseTupleAndKeywords(): 987, optional arguments, and default +values, it’s not always possible. Some of these legacy functions have +behaviors *note PyArg_ParseTupleAndKeywords(): 987. doesn’t directly +support. The most obvious example is the builtin function ‘range()’, +which has an optional argument on the `left' side of its required +argument! Another example is ‘curses.window.addch()’, which has a group +of two arguments that must always be specified together. (The arguments +are called ‘x’ and ‘y’; if you call the function passing in ‘x’, you +must also pass in ‘y’—and if you don’t pass in ‘x’ you may not pass in +‘y’ either.) + +In any case, the goal of Argument Clinic is to support argument parsing +for all existing CPython builtins without changing their semantics. +Therefore Argument Clinic supports this alternate approach to parsing, +using what are called `optional groups'. Optional groups are groups of +arguments that must all be passed in together. They can be to the left +or the right of the required arguments. They can `only' be used with +positional-only parameters. + + Note: Optional groups are `only' intended for use when converting + functions that make multiple calls to *note PyArg_ParseTuple(): + 4d9.! Functions that use `any' other approach for parsing + arguments should `almost never' be converted to Argument Clinic + using optional groups. Functions using optional groups currently + cannot have accurate signatures in Python, because Python just + doesn’t understand the concept. Please avoid using optional groups + wherever possible. + +To specify an optional group, add a ‘[’ on a line by itself before the +parameters you wish to group together, and a ‘]’ on a line by itself +after these parameters. As an example, here’s how ‘curses.window.addch’ +uses optional groups to make the first two parameters and the last +parameter optional: + + /*[clinic input] + + curses.window.addch + + [ + x: int + X-coordinate. + y: int + Y-coordinate. + ] + + ch: object + Character to add. + + [ + attr: long + Attributes for the character. + ] + / + + ... + +Notes: + + * For every optional group, one additional parameter will be passed + into the impl function representing the group. The parameter will + be an int named ‘group_{direction}_{number}’, where ‘{direction}’ + is either ‘right’ or ‘left’ depending on whether the group is + before or after the required parameters, and ‘{number}’ is a + monotonically increasing number (starting at 1) indicating how far + away the group is from the required parameters. When the impl is + called, this parameter will be set to zero if this group was + unused, and set to non-zero if this group was used. (By used or + unused, I mean whether or not the parameters received arguments in + this invocation.) + + * If there are no required arguments, the optional groups will behave + as if they’re to the right of the required arguments. + + * In the case of ambiguity, the argument parsing code favors + parameters on the left (before the required parameters). + + * Optional groups can only contain positional-only parameters. + + * Optional groups are `only' intended for legacy code. Please do not + use optional groups for new code. + + +File: python.info, Node: Using real Argument Clinic converters instead of “legacy converters”, Next: Py_buffer, Prev: Optional Groups, Up: Advanced Topics + +10.16.4.5 Using real Argument Clinic converters, instead of “legacy converters” +............................................................................... + +To save time, and to minimize how much you need to learn to achieve your +first port to Argument Clinic, the walkthrough above tells you to use +“legacy converters”. “Legacy converters” are a convenience, designed +explicitly to make porting existing code to Argument Clinic easier. And +to be clear, their use is acceptable when porting code for Python 3.4. + +However, in the long term we probably want all our blocks to use +Argument Clinic’s real syntax for converters. Why? A couple reasons: + + * The proper converters are far easier to read and clearer in their + intent. + + * There are some format units that are unsupported as “legacy + converters”, because they require arguments, and the legacy + converter syntax doesn’t support specifying arguments. + + * In the future we may have a new argument parsing library that isn’t + restricted to what *note PyArg_ParseTuple(): 4d9. supports; this + flexibility won’t be available to parameters using legacy + converters. + +Therefore, if you don’t mind a little extra effort, please use the +normal converters instead of legacy converters. + +In a nutshell, the syntax for Argument Clinic (non-legacy) converters +looks like a Python function call. However, if there are no explicit +arguments to the function (all functions take their default values), you +may omit the parentheses. Thus ‘bool’ and ‘bool()’ are exactly the same +converters. + +All arguments to Argument Clinic converters are keyword-only. All +Argument Clinic converters accept the following arguments: + + ‘c_default’ + + The default value for this parameter when defined in C. + Specifically, this will be the initializer for the variable + declared in the “parse function”. See *note the section on + default values: 4955. for how to use this. Specified as a + string. + + ‘annotation’ + + The annotation value for this parameter. Not currently + supported, because PEP 8(1) mandates that the Python library + may not use annotations. + +In addition, some converters accept additional arguments. Here is a +list of these arguments, along with their meanings: + + ‘accept’ + + A set of Python types (and possibly pseudo-types); this + restricts the allowable Python argument to values of these + types. (This is not a general-purpose facility; as a rule it + only supports specific lists of types as shown in the legacy + converter table.) + + To accept ‘None’, add ‘NoneType’ to this set. + + ‘bitwise’ + + Only supported for unsigned integers. The native integer + value of this Python argument will be written to the parameter + without any range checking, even for negative values. + + ‘converter’ + + Only supported by the ‘object’ converter. Specifies the name + of a *note C “converter function”: 44ce. to use to convert + this object to a native type. + + ‘encoding’ + + Only supported for strings. Specifies the encoding to use + when converting this string from a Python str (Unicode) value + into a C ‘char *’ value. + + ‘subclass_of’ + + Only supported for the ‘object’ converter. Requires that the + Python value be a subclass of a Python type, as expressed in + C. + + ‘type’ + + Only supported for the ‘object’ and ‘self’ converters. + Specifies the C type that will be used to declare the + variable. Default value is ‘"PyObject *"’. + + ‘zeroes’ + + Only supported for strings. If true, embedded NUL bytes + (‘'\\0'’) are permitted inside the value. The length of the + string will be passed in to the impl function, just after the + string parameter, as a parameter named + ‘_length’. + +Please note, not every possible combination of arguments will work. +Usually these arguments are implemented by specific ‘PyArg_ParseTuple’ +`format units', with specific behavior. For example, currently you +cannot call ‘unsigned_short’ without also specifying ‘bitwise=True’. +Although it’s perfectly reasonable to think this would work, these +semantics don’t map to any existing format unit. So Argument Clinic +doesn’t support it. (Or, at least, not yet.) + +Below is a table showing the mapping of legacy converters into real +Argument Clinic converters. On the left is the legacy converter, on the +right is the text you’d replace it with. + +‘'B'’ ‘unsigned_char(bitwise=True)’ + + +‘'b'’ ‘unsigned_char’ + + +‘'c'’ ‘char’ + + +‘'C'’ ‘int(accept={str})’ + + +‘'d'’ ‘double’ + + +‘'D'’ ‘Py_complex’ + + +‘'es'’ ‘str(encoding='name_of_encoding')’ + + +‘'es#'’ ‘str(encoding='name_of_encoding', zeroes=True)’ + + +‘'et'’ ‘str(encoding='name_of_encoding', accept={bytes, bytearray, str})’ + + +‘'et#'’ ‘str(encoding='name_of_encoding', accept={bytes, bytearray, str}, zeroes=True)’ + + +‘'f'’ ‘float’ + + +‘'h'’ ‘short’ + + +‘'H'’ ‘unsigned_short(bitwise=True)’ + + +‘'i'’ ‘int’ + + +‘'I'’ ‘unsigned_int(bitwise=True)’ + + +‘'k'’ ‘unsigned_long(bitwise=True)’ + + +‘'K'’ ‘unsigned_long_long(bitwise=True)’ + + +‘'l'’ ‘long’ + + +‘'L'’ ‘long long’ + + +‘'n'’ ‘Py_ssize_t’ + + +‘'O'’ ‘object’ + + +‘'O!'’ ‘object(subclass_of='&PySomething_Type')’ + + +‘'O&'’ ‘object(converter='name_of_c_function')’ + + +‘'p'’ ‘bool’ + + +‘'S'’ ‘PyBytesObject’ + + +‘'s'’ ‘str’ + + +‘'s#'’ ‘str(zeroes=True)’ + + +‘'s*'’ ‘Py_buffer(accept={buffer, str})’ + + +‘'U'’ ‘unicode’ + + +‘'u'’ ‘Py_UNICODE’ + + +‘'u#'’ ‘Py_UNICODE(zeroes=True)’ + + +‘'w*'’ ‘Py_buffer(accept={rwbuffer})’ + + +‘'Y'’ ‘PyByteArrayObject’ + + +‘'y'’ ‘str(accept={bytes})’ + + +‘'y#'’ ‘str(accept={robuffer}, zeroes=True)’ + + +‘'y*'’ ‘Py_buffer’ + + +‘'Z'’ ‘Py_UNICODE(accept={str, NoneType})’ + + +‘'Z#'’ ‘Py_UNICODE(accept={str, NoneType}, zeroes=True)’ + + +‘'z'’ ‘str(accept={str, NoneType})’ + + +‘'z#'’ ‘str(accept={str, NoneType}, zeroes=True)’ + + +‘'z*'’ ‘Py_buffer(accept={buffer, str, NoneType})’ + + +As an example, here’s our sample ‘pickle.Pickler.dump’ using the proper +converter: + + /*[clinic input] + pickle.Pickler.dump + + obj: object + The object to be pickled. + / + + Write a pickled representation of obj to the open file. + [clinic start generated code]*/ + +One advantage of real converters is that they’re more flexible than +legacy converters. For example, the ‘unsigned_int’ converter (and all +the ‘unsigned_’ converters) can be specified without ‘bitwise=True’. +Their default behavior performs range checking on the value, and they +won’t accept negative numbers. You just can’t do that with a legacy +converter! + +Argument Clinic will show you all the converters it has available. For +each converter it’ll show you all the parameters it accepts, along with +the default value for each parameter. Just run ‘Tools/clinic/clinic.py +--converters’ to see the full list. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0008/ + + +File: python.info, Node: Py_buffer, Next: Advanced converters, Prev: Using real Argument Clinic converters instead of “legacy converters”, Up: Advanced Topics + +10.16.4.6 Py_buffer +................... + +When using the ‘Py_buffer’ converter (or the ‘'s*'’, ‘'w*'’, ‘'*y'’, or +‘'z*'’ legacy converters), you `must' not call *note PyBuffer_Release(): +331. on the provided buffer. Argument Clinic generates code that does +it for you (in the parsing function). + + +File: python.info, Node: Advanced converters, Next: Parameter default values, Prev: Py_buffer, Up: Advanced Topics + +10.16.4.7 Advanced converters +............................. + +Remember those format units you skipped for your first time because they +were advanced? Here’s how to handle those too. + +The trick is, all those format units take arguments—either conversion +functions, or types, or strings specifying an encoding. (But “legacy +converters” don’t support arguments. That’s why we skipped them for +your first function.) The argument you specified to the format unit is +now an argument to the converter; this argument is either ‘converter’ +(for ‘O&’), ‘subclass_of’ (for ‘O!’), or ‘encoding’ (for all the format +units that start with ‘e’). + +When using ‘subclass_of’, you may also want to use the other custom +argument for ‘object()’: ‘type’, which lets you set the type actually +used for the parameter. For example, if you want to ensure that the +object is a subclass of ‘PyUnicode_Type’, you probably want to use the +converter ‘object(type='PyUnicodeObject *', +subclass_of='&PyUnicode_Type')’. + +One possible problem with using Argument Clinic: it takes away some +possible flexibility for the format units starting with ‘e’. When +writing a ‘PyArg_Parse’ call by hand, you could theoretically decide at +runtime what encoding string to pass in to *note PyArg_ParseTuple(): +4d9. But now this string must be hard-coded at +Argument-Clinic-preprocessing-time. This limitation is deliberate; it +made supporting this format unit much easier, and may allow for future +optimizations. This restriction doesn’t seem unreasonable; CPython +itself always passes in static hard-coded encoding strings for +parameters whose format units start with ‘e’. + + +File: python.info, Node: Parameter default values, Next: The NULL default value, Prev: Advanced converters, Up: Advanced Topics + +10.16.4.8 Parameter default values +.................................. + +Default values for parameters can be any of a number of values. At +their simplest, they can be string, int, or float literals: + + foo: str = "abc" + bar: int = 123 + bat: float = 45.6 + +They can also use any of Python’s built-in constants: + + yep: bool = True + nope: bool = False + nada: object = None + +There’s also special support for a default value of ‘NULL’, and for +simple expressions, documented in the following sections. + + +File: python.info, Node: The NULL default value, Next: Expressions specified as default values, Prev: Parameter default values, Up: Advanced Topics + +10.16.4.9 The ‘NULL’ default value +.................................. + +For string and object parameters, you can set them to ‘None’ to indicate +that there’s no default. However, that means the C variable will be +initialized to ‘Py_None’. For convenience’s sakes, there’s a special +value called ‘NULL’ for just this reason: from Python’s perspective it +behaves like a default value of ‘None’, but the C variable is +initialized with ‘NULL’. + + +File: python.info, Node: Expressions specified as default values, Next: Using a return converter, Prev: The NULL default value, Up: Advanced Topics + +10.16.4.10 Expressions specified as default values +.................................................. + +The default value for a parameter can be more than just a literal value. +It can be an entire expression, using math operators and looking up +attributes on objects. However, this support isn’t exactly simple, +because of some non-obvious semantics. + +Consider the following example: + + foo: Py_ssize_t = sys.maxsize - 1 + +‘sys.maxsize’ can have different values on different platforms. +Therefore Argument Clinic can’t simply evaluate that expression locally +and hard-code it in C. So it stores the default in such a way that it +will get evaluated at runtime, when the user asks for the function’s +signature. + +What namespace is available when the expression is evaluated? It’s +evaluated in the context of the module the builtin came from. So, if +your module has an attribute called “‘max_widgets’”, you may simply use +it: + + foo: Py_ssize_t = max_widgets + +If the symbol isn’t found in the current module, it fails over to +looking in ‘sys.modules’. That’s how it can find ‘sys.maxsize’ for +example. (Since you don’t know in advance what modules the user will +load into their interpreter, it’s best to restrict yourself to modules +that are preloaded by Python itself.) + +Evaluating default values only at runtime means Argument Clinic can’t +compute the correct equivalent C default value. So you need to tell it +explicitly. When you use an expression, you must also specify the +equivalent expression in C, using the ‘c_default’ parameter to the +converter: + + foo: Py_ssize_t(c_default="PY_SSIZE_T_MAX - 1") = sys.maxsize - 1 + +Another complication: Argument Clinic can’t know in advance whether or +not the expression you supply is valid. It parses it to make sure it +looks legal, but it can’t `actually' know. You must be very careful +when using expressions to specify values that are guaranteed to be valid +at runtime! + +Finally, because expressions must be representable as static C values, +there are many restrictions on legal expressions. Here’s a list of +Python features you’re not permitted to use: + + * Function calls. + + * Inline if statements (‘3 if foo else 5’). + + * Automatic sequence unpacking (‘*[1, 2, 3]’). + + * List/set/dict comprehensions and generator expressions. + + * Tuple/list/set/dict literals. + + +File: python.info, Node: Using a return converter, Next: Cloning existing functions, Prev: Expressions specified as default values, Up: Advanced Topics + +10.16.4.11 Using a return converter +................................... + +By default the impl function Argument Clinic generates for you returns +‘PyObject *’. But your C function often computes some C type, then +converts it into the ‘PyObject *’ at the last moment. Argument Clinic +handles converting your inputs from Python types into native C types—why +not have it convert your return value from a native C type into a Python +type too? + +That’s what a “return converter” does. It changes your impl function to +return some C type, then adds code to the generated (non-impl) function +to handle converting that value into the appropriate ‘PyObject *’. + +The syntax for return converters is similar to that of parameter +converters. You specify the return converter like it was a return +annotation on the function itself. Return converters behave much the +same as parameter converters; they take arguments, the arguments are all +keyword-only, and if you’re not changing any of the default arguments +you can omit the parentheses. + +(If you use both ‘"as"’ `and' a return converter for your function, the +‘"as"’ should come before the return converter.) + +There’s one additional complication when using return converters: how do +you indicate an error has occurred? Normally, a function returns a +valid (non-‘NULL’) pointer for success, and ‘NULL’ for failure. But if +you use an integer return converter, all integers are valid. How can +Argument Clinic detect an error? Its solution: each return converter +implicitly looks for a special value that indicates an error. If you +return that value, and an error has been set (‘PyErr_Occurred()’ returns +a true value), then the generated code will propagate the error. +Otherwise it will encode the value you return like normal. + +Currently Argument Clinic supports only a few return converters: + + bool + int + unsigned int + long + unsigned int + size_t + Py_ssize_t + float + double + DecodeFSDefault + +None of these take parameters. For the first three, return -1 to +indicate error. For ‘DecodeFSDefault’, the return type is ‘const char +*’; return a ‘NULL’ pointer to indicate an error. + +(There’s also an experimental ‘NoneType’ converter, which lets you +return ‘Py_None’ on success or ‘NULL’ on failure, without having to +increment the reference count on ‘Py_None’. I’m not sure it adds enough +clarity to be worth using.) + +To see all the return converters Argument Clinic supports, along with +their parameters (if any), just run ‘Tools/clinic/clinic.py +--converters’ for the full list. + + +File: python.info, Node: Cloning existing functions, Next: Calling Python code, Prev: Using a return converter, Up: Advanced Topics + +10.16.4.12 Cloning existing functions +..................................... + +If you have a number of functions that look similar, you may be able to +use Clinic’s “clone” feature. When you clone an existing function, you +reuse: + + * its parameters, including + + * their names, + + * their converters, with all parameters, + + * their default values, + + * their per-parameter docstrings, + + * their `kind' (whether they’re positional only, positional or + keyword, or keyword only), and + + * its return converter. + +The only thing not copied from the original function is its docstring; +the syntax allows you to specify a new docstring. + +Here’s the syntax for cloning a function: + + /*[clinic input] + module.class.new_function [as c_basename] = module.class.existing_function + + Docstring for new_function goes here. + [clinic start generated code]*/ + +(The functions can be in different modules or classes. I wrote +‘module.class’ in the sample just to illustrate that you must use the +full path to `both' functions.) + +Sorry, there’s no syntax for partially cloning a function, or cloning a +function then modifying it. Cloning is an all-or nothing proposition. + +Also, the function you are cloning from must have been previously +defined in the current file. + + +File: python.info, Node: Calling Python code, Next: Using a “self converter”, Prev: Cloning existing functions, Up: Advanced Topics + +10.16.4.13 Calling Python code +.............................. + +The rest of the advanced topics require you to write Python code which +lives inside your C file and modifies Argument Clinic’s runtime state. +This is simple: you simply define a Python block. + +A Python block uses different delimiter lines than an Argument Clinic +function block. It looks like this: + + /*[python input] + # python code goes here + [python start generated code]*/ + +All the code inside the Python block is executed at the time it’s +parsed. All text written to stdout inside the block is redirected into +the “output” after the block. + +As an example, here’s a Python block that adds a static integer variable +to the C code: + + /*[python input] + print('static int __ignored_unused_variable__ = 0;') + [python start generated code]*/ + static int __ignored_unused_variable__ = 0; + /*[python checksum:...]*/ + + +File: python.info, Node: Using a “self converter”, Next: Using a “defining class” converter, Prev: Calling Python code, Up: Advanced Topics + +10.16.4.14 Using a “self converter” +................................... + +Argument Clinic automatically adds a “self” parameter for you using a +default converter. It automatically sets the ‘type’ of this parameter +to the “pointer to an instance” you specified when you declared the +type. However, you can override Argument Clinic’s converter and specify +one yourself. Just add your own ‘self’ parameter as the first parameter +in a block, and ensure that its converter is an instance of +‘self_converter’ or a subclass thereof. + +What’s the point? This lets you override the type of ‘self’, or give it +a different default name. + +How do you specify the custom type you want to cast ‘self’ to? If you +only have one or two functions with the same type for ‘self’, you can +directly use Argument Clinic’s existing ‘self’ converter, passing in the +type you want to use as the ‘type’ parameter: + + /*[clinic input] + + _pickle.Pickler.dump + + self: self(type="PicklerObject *") + obj: object + / + + Write a pickled representation of the given object to the open file. + [clinic start generated code]*/ + +On the other hand, if you have a lot of functions that will use the same +type for ‘self’, it’s best to create your own converter, subclassing +‘self_converter’ but overwriting the ‘type’ member: + + /*[python input] + class PicklerObject_converter(self_converter): + type = "PicklerObject *" + [python start generated code]*/ + + /*[clinic input] + + _pickle.Pickler.dump + + self: PicklerObject + obj: object + / + + Write a pickled representation of the given object to the open file. + [clinic start generated code]*/ + + +File: python.info, Node: Using a “defining class” converter, Next: Writing a custom converter, Prev: Using a “self converter”, Up: Advanced Topics + +10.16.4.15 Using a “defining class” converter +............................................. + +Argument Clinic facilitates gaining access to the defining class of a +method. This is useful for *note heap type: 5b7. methods that need to +fetch module level state. Use *note PyType_FromModuleAndSpec(): 4c8. to +associate a new heap type with a module. You can now use *note +PyType_GetModuleState(): 5c3. on the defining class to fetch the module +state, for example from a module method. + +Example from ‘Modules/zlibmodule.c’. First, ‘defining_class’ is added +to the clinic input: + + /*[clinic input] + zlib.Compress.compress + + cls: defining_class + data: Py_buffer + Binary data to be compressed. + / + +After running the Argument Clinic tool, the following function signature +is generated: + + /*[clinic start generated code]*/ + static PyObject * + zlib_Compress_compress_impl(compobject *self, PyTypeObject *cls, + Py_buffer *data) + /*[clinic end generated code: output=6731b3f0ff357ca6 input=04d00f65ab01d260]*/ + +The following code can now use ‘PyType_GetModuleState(cls)’ to fetch the +module state: + + zlibstate *state = PyType_GetModuleState(cls); + +Each method may only have one argument using this converter, and it must +appear after ‘self’, or, if ‘self’ is not used, as the first argument. +The argument will be of type ‘PyTypeObject *’. The argument will not +appear in the ‘__text_signature__’. + +The ‘defining_class’ converter is not compatible with ‘__init__’ and +‘__new__’ methods, which cannot use the ‘METH_METHOD’ convention. + +It is not possible to use ‘defining_class’ with slot methods. In order +to fetch the module state from such methods, use *note +PyType_GetModuleByDef(): 335. to look up the module and then *note +PyModule_GetState(): 5d5. to fetch the module state. Example from the +‘setattro’ slot method in ‘Modules/_threadmodule.c’: + + static int + local_setattro(localobject *self, PyObject *name, PyObject *v) + { + PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &thread_module); + thread_module_state *state = get_thread_state(module); + ... + } + +See also PEP 573(1). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0573/ + + +File: python.info, Node: Writing a custom converter, Next: Writing a custom return converter, Prev: Using a “defining class” converter, Up: Advanced Topics + +10.16.4.16 Writing a custom converter +..................................... + +As we hinted at in the previous section… you can write your own +converters! A converter is simply a Python class that inherits from +‘CConverter’. The main purpose of a custom converter is if you have a +parameter using the ‘O&’ format unit—parsing this parameter means +calling a *note PyArg_ParseTuple(): 4d9. “converter function”. + +Your converter class should be named ‘*something*_converter’. If the +name follows this convention, then your converter class will be +automatically registered with Argument Clinic; its name will be the name +of your class with the ‘_converter’ suffix stripped off. (This is +accomplished with a metaclass.) + +You shouldn’t subclass ‘CConverter.__init__’. Instead, you should write +a ‘converter_init()’ function. ‘converter_init()’ always accepts a +‘self’ parameter; after that, all additional parameters `must' be +keyword-only. Any arguments passed in to the converter in Argument +Clinic will be passed along to your ‘converter_init()’. + +There are some additional members of ‘CConverter’ you may wish to +specify in your subclass. Here’s the current list: + +‘type’ + + The C type to use for this variable. ‘type’ should be a Python + string specifying the type, e.g. ‘int’. If this is a pointer + type, the type string should end with ‘' *'’. + +‘default’ + + The Python default value for this parameter, as a Python value. Or + the magic value ‘unspecified’ if there is no default. + +‘py_default’ + + ‘default’ as it should appear in Python code, as a string. Or + ‘None’ if there is no default. + +‘c_default’ + + ‘default’ as it should appear in C code, as a string. Or ‘None’ if + there is no default. + +‘c_ignored_default’ + + The default value used to initialize the C variable when there is + no default, but not specifying a default may result in an + “uninitialized variable” warning. This can easily happen when + using option groups—although properly written code will never + actually use this value, the variable does get passed in to the + impl, and the C compiler will complain about the “use” of the + uninitialized value. This value should always be a non-empty + string. + +‘converter’ + + The name of the C converter function, as a string. + +‘impl_by_reference’ + + A boolean value. If true, Argument Clinic will add a ‘&’ in front + of the name of the variable when passing it into the impl function. + +‘parse_by_reference’ + + A boolean value. If true, Argument Clinic will add a ‘&’ in front + of the name of the variable when passing it into *note + PyArg_ParseTuple(): 4d9. + +Here’s the simplest example of a custom converter, from +‘Modules/zlibmodule.c’: + + /*[python input] + + class ssize_t_converter(CConverter): + type = 'Py_ssize_t' + converter = 'ssize_t_converter' + + [python start generated code]*/ + /*[python end generated code: output=da39a3ee5e6b4b0d input=35521e4e733823c7]*/ + +This block adds a converter to Argument Clinic named ‘ssize_t’. +Parameters declared as ‘ssize_t’ will be declared as type *note +Py_ssize_t: 6b1, and will be parsed by the ‘'O&'’ format unit, which +will call the ‘ssize_t_converter’ converter function. ‘ssize_t’ +variables automatically support default values. + +More sophisticated custom converters can insert custom C code to handle +initialization and cleanup. You can see more examples of custom +converters in the CPython source tree; grep the C files for the string +‘CConverter’. + + +File: python.info, Node: Writing a custom return converter, Next: METH_O and METH_NOARGS, Prev: Writing a custom converter, Up: Advanced Topics + +10.16.4.17 Writing a custom return converter +............................................ + +Writing a custom return converter is much like writing a custom +converter. Except it’s somewhat simpler, because return converters are +themselves much simpler. + +Return converters must subclass ‘CReturnConverter’. There are no +examples yet of custom return converters, because they are not widely +used yet. If you wish to write your own return converter, please read +‘Tools/clinic/clinic.py’, specifically the implementation of +‘CReturnConverter’ and all its subclasses. + + +File: python.info, Node: METH_O and METH_NOARGS, Next: tp_new and tp_init functions, Prev: Writing a custom return converter, Up: Advanced Topics + +10.16.4.18 METH_O and METH_NOARGS +................................. + +To convert a function using ‘METH_O’, make sure the function’s single +argument is using the ‘object’ converter, and mark the arguments as +positional-only: + + /*[clinic input] + meth_o_sample + + argument: object + / + [clinic start generated code]*/ + +To convert a function using ‘METH_NOARGS’, just don’t specify any +arguments. + +You can still use a self converter, a return converter, and specify a +‘type’ argument to the object converter for ‘METH_O’. + + +File: python.info, Node: tp_new and tp_init functions, Next: Changing and redirecting Clinic’s output, Prev: METH_O and METH_NOARGS, Up: Advanced Topics + +10.16.4.19 tp_new and tp_init functions +....................................... + +You can convert ‘tp_new’ and ‘tp_init’ functions. Just name them +‘__new__’ or ‘__init__’ as appropriate. Notes: + + * The function name generated for ‘__new__’ doesn’t end in ‘__new__’ + like it would by default. It’s just the name of the class, + converted into a valid C identifier. + + * No ‘PyMethodDef’ ‘#define’ is generated for these functions. + + * ‘__init__’ functions return ‘int’, not ‘PyObject *’. + + * Use the docstring as the class docstring. + + * Although ‘__new__’ and ‘__init__’ functions must always accept both + the ‘args’ and ‘kwargs’ objects, when converting you may specify + any signature for these functions that you like. (If your function + doesn’t support keywords, the parsing function generated will throw + an exception if it receives any.) + + +File: python.info, Node: Changing and redirecting Clinic’s output, Next: The #ifdef trick, Prev: tp_new and tp_init functions, Up: Advanced Topics + +10.16.4.20 Changing and redirecting Clinic’s output +................................................... + +It can be inconvenient to have Clinic’s output interspersed with your +conventional hand-edited C code. Luckily, Clinic is configurable: you +can buffer up its output for printing later (or earlier!), or write its +output to a separate file. You can also add a prefix or suffix to every +line of Clinic’s generated output. + +While changing Clinic’s output in this manner can be a boon to +readability, it may result in Clinic code using types before they are +defined, or your code attempting to use Clinic-generated code before it +is defined. These problems can be easily solved by rearranging the +declarations in your file, or moving where Clinic’s generated code goes. +(This is why the default behavior of Clinic is to output everything into +the current block; while many people consider this hampers readability, +it will never require rearranging your code to fix definition-before-use +problems.) + +Let’s start with defining some terminology: + +`field' + + A field, in this context, is a subsection of Clinic’s output. For + example, the ‘#define’ for the ‘PyMethodDef’ structure is a field, + called ‘methoddef_define’. Clinic has seven different fields it + can output per function definition: + + docstring_prototype + docstring_definition + methoddef_define + impl_prototype + parser_prototype + parser_definition + impl_definition + + All the names are of the form ‘"_"’, where ‘""’ is the + semantic object represented (the parsing function, the impl + function, the docstring, or the methoddef structure) and ‘""’ + represents what kind of statement the field is. Field names that + end in ‘"_prototype"’ represent forward declarations of that thing, + without the actual body/data of the thing; field names that end in + ‘"_definition"’ represent the actual definition of the thing, with + the body/data of the thing. (‘"methoddef"’ is special, it’s the + only one that ends with ‘"_define"’, representing that it’s a + preprocessor #define.) + +`destination' + + A destination is a place Clinic can write output to. There are + five built-in destinations: + + ‘block’ + + The default destination: printed in the output section of the + current Clinic block. + + ‘buffer’ + + A text buffer where you can save text for later. Text sent + here is appended to the end of any existing text. It’s an + error to have any text left in the buffer when Clinic finishes + processing a file. + + ‘file’ + + A separate “clinic file” that will be created automatically by + Clinic. The filename chosen for the file is + ‘{basename}.clinic{extension}’, where ‘basename’ and + ‘extension’ were assigned the output from ‘os.path.splitext()’ + run on the current file. (Example: the ‘file’ destination for + ‘_pickle.c’ would be written to ‘_pickle.clinic.c’.) + + `Important: When using a' ‘file’ `destination, you' `must + check in' `the generated file!' + + ‘two-pass’ + + A buffer like ‘buffer’. However, a two-pass buffer can only + be dumped once, and it prints out all text sent to it during + all processing, even from Clinic blocks `after' the dumping + point. + + ‘suppress’ + + The text is suppressed—thrown away. + +Clinic defines five new directives that let you reconfigure its output. + +The first new directive is ‘dump’: + + dump + +This dumps the current contents of the named destination into the output +of the current block, and empties it. This only works with ‘buffer’ and +‘two-pass’ destinations. + +The second new directive is ‘output’. The most basic form of ‘output’ +is like this: + + output + +This tells Clinic to output `field' to `destination'. ‘output’ also +supports a special meta-destination, called ‘everything’, which tells +Clinic to output `all' fields to that `destination'. + +‘output’ has a number of other functions: + + output push + output pop + output preset + +‘output push’ and ‘output pop’ allow you to push and pop configurations +on an internal configuration stack, so that you can temporarily modify +the output configuration, then easily restore the previous +configuration. Simply push before your change to save the current +configuration, then pop when you wish to restore the previous +configuration. + +‘output preset’ sets Clinic’s output to one of several built-in preset +configurations, as follows: + + ‘block’ + + Clinic’s original starting configuration. Writes everything + immediately after the input block. + + Suppress the ‘parser_prototype’ and ‘docstring_prototype’, + write everything else to ‘block’. + + ‘file’ + + Designed to write everything to the “clinic file” that it can. + You then ‘#include’ this file near the top of your file. You + may need to rearrange your file to make this work, though + usually this just means creating forward declarations for + various ‘typedef’ and ‘PyTypeObject’ definitions. + + Suppress the ‘parser_prototype’ and ‘docstring_prototype’, + write the ‘impl_definition’ to ‘block’, and write everything + else to ‘file’. + + The default filename is ‘"{dirname}/clinic/{basename}.h"’. + + ‘buffer’ + + Save up most of the output from Clinic, to be written into + your file near the end. For Python files implementing modules + or builtin types, it’s recommended that you dump the buffer + just above the static structures for your module or builtin + type; these are normally very near the end. Using ‘buffer’ + may require even more editing than ‘file’, if your file has + static ‘PyMethodDef’ arrays defined in the middle of the file. + + Suppress the ‘parser_prototype’, ‘impl_prototype’, and + ‘docstring_prototype’, write the ‘impl_definition’ to ‘block’, + and write everything else to ‘file’. + + ‘two-pass’ + + Similar to the ‘buffer’ preset, but writes forward + declarations to the ‘two-pass’ buffer, and definitions to the + ‘buffer’. This is similar to the ‘buffer’ preset, but may + require less editing than ‘buffer’. Dump the ‘two-pass’ + buffer near the top of your file, and dump the ‘buffer’ near + the end just like you would when using the ‘buffer’ preset. + + Suppresses the ‘impl_prototype’, write the ‘impl_definition’ + to ‘block’, write ‘docstring_prototype’, ‘methoddef_define’, + and ‘parser_prototype’ to ‘two-pass’, write everything else to + ‘buffer’. + + ‘partial-buffer’ + + Similar to the ‘buffer’ preset, but writes more things to + ‘block’, only writing the really big chunks of generated code + to ‘buffer’. This avoids the definition-before-use problem of + ‘buffer’ completely, at the small cost of having slightly more + stuff in the block’s output. Dump the ‘buffer’ near the end, + just like you would when using the ‘buffer’ preset. + + Suppresses the ‘impl_prototype’, write the + ‘docstring_definition’ and ‘parser_definition’ to ‘buffer’, + write everything else to ‘block’. + +The third new directive is ‘destination’: + + destination [...] + +This performs an operation on the destination named ‘name’. + +There are two defined subcommands: ‘new’ and ‘clear’. + +The ‘new’ subcommand works like this: + + destination new + +This creates a new destination with name ‘’ and type ‘’. + +There are five destination types: + + ‘suppress’ + + Throws the text away. + + ‘block’ + + Writes the text to the current block. This is what Clinic + originally did. + + ‘buffer’ + + A simple text buffer, like the “buffer” builtin destination + above. + + ‘file’ + + A text file. The file destination takes an extra argument, a + template to use for building the filename, like so: + + destination new + + The template can use three strings internally that will be + replaced by bits of the filename: + + {path} + + The full path to the file, including directory and + full filename. + + {dirname} + + The name of the directory the file is in. + + {basename} + + Just the name of the file, not including the + directory. + + {basename_root} + + Basename with the extension clipped off (everything + up to but not including the last ‘.’). + + {basename_extension} + + The last ‘.’ and everything after it. If the + basename does not contain a period, this will be the + empty string. + + If there are no periods in the filename, {basename} and + {filename} are the same, and {extension} is empty. + “{basename}{extension}” is always exactly the same as + “{filename}”.” + + ‘two-pass’ + + A two-pass buffer, like the “two-pass” builtin destination + above. + +The ‘clear’ subcommand works like this: + + destination clear + +It removes all the accumulated text up to this point in the destination. +(I don’t know what you’d need this for, but I thought maybe it’d be +useful while someone’s experimenting.) + +The fourth new directive is ‘set’: + + set line_prefix "string" + set line_suffix "string" + +‘set’ lets you set two internal variables in Clinic. ‘line_prefix’ is a +string that will be prepended to every line of Clinic’s output; +‘line_suffix’ is a string that will be appended to every line of +Clinic’s output. + +Both of these support two format strings: + + ‘{block comment start}’ + + Turns into the string ‘/*’, the start-comment text sequence + for C files. + + ‘{block comment end}’ + + Turns into the string ‘*/’, the end-comment text sequence for + C files. + +The final new directive is one you shouldn’t need to use directly, +called ‘preserve’: + + preserve + +This tells Clinic that the current contents of the output should be +kept, unmodified. This is used internally by Clinic when dumping output +into ‘file’ files; wrapping it in a Clinic block lets Clinic use its +existing checksum functionality to ensure the file was not modified by +hand before it gets overwritten. + + +File: python.info, Node: The #ifdef trick, Next: Using Argument Clinic in Python files, Prev: Changing and redirecting Clinic’s output, Up: Advanced Topics + +10.16.4.21 The #ifdef trick +........................... + +If you’re converting a function that isn’t available on all platforms, +there’s a trick you can use to make life a little easier. The existing +code probably looks like this: + + #ifdef HAVE_FUNCTIONNAME + static module_functionname(...) + { + ... + } + #endif /* HAVE_FUNCTIONNAME */ + +And then in the ‘PyMethodDef’ structure at the bottom the existing code +will have: + + #ifdef HAVE_FUNCTIONNAME + {'functionname', ... }, + #endif /* HAVE_FUNCTIONNAME */ + +In this scenario, you should enclose the body of your impl function +inside the ‘#ifdef’, like so: + + #ifdef HAVE_FUNCTIONNAME + /*[clinic input] + module.functionname + ... + [clinic start generated code]*/ + static module_functionname(...) + { + ... + } + #endif /* HAVE_FUNCTIONNAME */ + +Then, remove those three lines from the ‘PyMethodDef’ structure, +replacing them with the macro Argument Clinic generated: + + MODULE_FUNCTIONNAME_METHODDEF + +(You can find the real name for this macro inside the generated code. +Or you can calculate it yourself: it’s the name of your function as +defined on the first line of your block, but with periods changed to +underscores, uppercased, and ‘"_METHODDEF"’ added to the end.) + +Perhaps you’re wondering: what if ‘HAVE_FUNCTIONNAME’ isn’t defined? +The ‘MODULE_FUNCTIONNAME_METHODDEF’ macro won’t be defined either! + +Here’s where Argument Clinic gets very clever. It actually detects that +the Argument Clinic block might be deactivated by the ‘#ifdef’. When +that happens, it generates a little extra code that looks like this: + + #ifndef MODULE_FUNCTIONNAME_METHODDEF + #define MODULE_FUNCTIONNAME_METHODDEF + #endif /* !defined(MODULE_FUNCTIONNAME_METHODDEF) */ + +That means the macro always works. If the function is defined, this +turns into the correct structure, including the trailing comma. If the +function is undefined, this turns into nothing. + +However, this causes one ticklish problem: where should Argument Clinic +put this extra code when using the “block” output preset? It can’t go +in the output block, because that could be deactivated by the ‘#ifdef’. +(That’s the whole point!) + +In this situation, Argument Clinic writes the extra code to the “buffer” +destination. This may mean that you get a complaint from Argument +Clinic: + + Warning in file "Modules/posixmodule.c" on line 12357: + Destination buffer 'buffer' not empty at end of file, emptying. + +When this happens, just open your file, find the ‘dump buffer’ block +that Argument Clinic added to your file (it’ll be at the very bottom), +then move it above the ‘PyMethodDef’ structure where that macro is used. + + +File: python.info, Node: Using Argument Clinic in Python files, Prev: The #ifdef trick, Up: Advanced Topics + +10.16.4.22 Using Argument Clinic in Python files +................................................ + +It’s actually possible to use Argument Clinic to preprocess Python +files. There’s no point to using Argument Clinic blocks, of course, as +the output wouldn’t make any sense to the Python interpreter. But using +Argument Clinic to run Python blocks lets you use Python as a Python +preprocessor! + +Since Python comments are different from C comments, Argument Clinic +blocks embedded in Python files look slightly different. They look like +this: + + #/*[python input] + #print("def foo(): pass") + #[python start generated code]*/ + def foo(): pass + #/*[python checksum:...]*/ + + +File: python.info, Node: Instrumenting CPython with DTrace and SystemTap, Next: Annotations Best Practices, Prev: Argument Clinic How-To, Up: Python HOWTOs + +10.17 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: + + - filter which processes are to be observed + + - gather data from the processes of interest + + - generate reports on the data + +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>. + + +File: python.info, Node: Enabling the static markers, Next: Static DTrace probes, Up: Instrumenting CPython with DTrace and SystemTap + +10.17.1 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: + + $ yum install systemtap-sdt-devel + +or: + + $ sudo apt-get install systemtap-sdt-dev + +CPython must then be *note configured with the –with-dtrace option: +17c9.: + + checking for --with-dtrace... yes + +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: + + $ 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 + +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. + + $ readelf -S ./python | grep .note.stapsdt + [30] .note.stapsdt NOTE 0000000000000000 00308d78 + +If you’ve built Python as a shared library (with the *note +–enable-shared: 45f. configure option), you need to look instead within +the shared library. For example: + + $ readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt + [29] .note.stapsdt NOTE 0000000000000000 00365b68 + +Sufficiently modern readelf can print the metadata: + + $ 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 + +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. + + +File: python.info, Node: Static DTrace probes, Next: Static SystemTap markers, Prev: Enabling the static markers, Up: Instrumenting CPython with DTrace and SystemTap + +10.17.2 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: + + 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; + } + +It can be invoked like this: + + $ sudo dtrace -q -s call_stack.d -c "python3.6 script.py" + +The output looks like this: + + 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 + + +File: python.info, Node: Static SystemTap markers, Next: Available static markers, Prev: Static DTrace probes, Up: Instrumenting CPython with DTrace and SystemTap + +10.17.3 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: + + 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); + } + +It can be invoked like this: + + $ stap \ + show-call-hierarchy.stp \ + -c "./python test.py" + +The output looks like this: + + 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 + +where the columns are: + + - time in microseconds since start of script + + - name of executable + + - PID of process + +and the remainder indicates the call/return hierarchy as the script +executes. + +For a *note –enable-shared: 45f. 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: + + probe process("python").mark("function__entry") { + +should instead read: + + probe process("python").library("libpython3.6dm.so.1.0").mark("function__entry") { + +(assuming a *note debug build: 496. of CPython 3.6) + + +File: python.info, Node: Available static markers, Next: SystemTap Tapsets, Prev: Static SystemTap markers, Up: Instrumenting CPython with DTrace and SystemTap + +10.17.4 Available static markers +-------------------------------- + + -- 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 ‘$arg1’, ‘$arg2’, ‘$arg3’: + + * ‘$arg1’ : ‘(const char *)’ filename, accessible using + ‘user_string($arg1)’ + + * ‘$arg2’ : ‘(const char *)’ function name, accessible + using ‘user_string($arg2)’ + + * ‘$arg3’ : ‘int’ line number + + -- Object: function__return(str filename, str funcname, int lineno) + + This marker is the converse of ‘function__entry()’, and indicates + that execution of a Python function has ended (either via ‘return’, + or via an exception). It is only triggered for pure-Python + (bytecode) functions. + + The arguments are the same as for ‘function__entry()’ + + -- 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 ‘function__entry()’. + + -- Object: gc__start(int generation) + + Fires when the Python interpreter starts a garbage collection + cycle. ‘arg0’ is the generation to scan, like *note gc.collect(): + 687. + + -- Object: gc__done(long collected) + + Fires when the Python interpreter finishes a garbage collection + cycle. ‘arg0’ is the number of collected objects. + + -- Object: import__find__load__start(str modulename) + + Fires before *note importlib: 97. attempts to find and load the + module. ‘arg0’ is the module name. + + New in version 3.7. + + -- Object: import__find__load__done(str modulename, int found) + + Fires after *note importlib: 97.’s find_and_load function is + called. ‘arg0’ is the module name, ‘arg1’ indicates if module was + successfully loaded. + + New in version 3.7. + + -- Object: audit(str event, void *tuple) + + Fires when *note sys.audit(): 1387. or *note PySys_Audit(): 1397. + is called. ‘arg0’ is the event name as C string, ‘arg1’ is a *note + PyObject: 4cf. pointer to a tuple object. + + New in version 3.8. + + +File: python.info, Node: SystemTap Tapsets, Next: Examples<40>, Prev: Available static markers, Up: Instrumenting CPython with DTrace and SystemTap + +10.17.5 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: + + /* + 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 + } + +If this file is installed in SystemTap’s tapset directory (e.g. +‘/usr/share/systemtap/tapset’), then these additional probepoints become +available: + + -- 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. + + -- Object: python.function.return(str filename, str funcname, int + lineno, frameptr) + + This probe point is the converse of ‘python.function.return’, and + indicates that execution of a Python function has ended (either via + ‘return’, or via an exception). It is only triggered for + pure-Python (bytecode) functions. + + +File: python.info, Node: Examples<40>, Prev: SystemTap Tapsets, Up: Instrumenting CPython with DTrace and SystemTap + +10.17.6 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: + + 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); + } + +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: + + 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; + } + + +File: python.info, Node: Annotations Best Practices, Next: Isolating Extension Modules, Prev: Instrumenting CPython with DTrace and SystemTap, Up: Python HOWTOs + +10.18 Annotations Best Practices +================================ + + +author: Larry Hastings + +Abstract +........ + +This document is designed to encapsulate the best practices for working +with annotations dicts. If you write Python code that examines +‘__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 +‘__annotations__’ that apply to any Python version, and quirks of +‘__annotations__’. + +Note that this document is specifically about working with +‘__annotations__’, not uses `for' annotations. If you’re looking for +information on how to use “type hints” in your code, please see the +*note typing: 123. 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:: + + +File: python.info, Node: Accessing The Annotations Dict Of An Object In Python 3 10 And Newer, Next: Accessing The Annotations Dict Of An Object In Python 3 9 And Older, Up: Annotations Best Practices + +10.18.1 Accessing The Annotations Dict Of An Object In Python 3.10 And Newer +---------------------------------------------------------------------------- + + Python 3.10 adds a new function to the standard library: *note + inspect.get_annotations(): 405. In Python versions 3.10 and newer, + 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. + + If for some reason *note inspect.get_annotations(): 405. isn’t + viable for your use case, you may access the ‘__annotations__’ data + member manually. Best practice for this changed in Python 3.10 as + well: as of Python 3.10, ‘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 ‘o.__annotations__’ to get + at the object’s annotations dict. + + However, other types of callables–for example, callables created by + *note functools.partial(): b5b.–may not have an ‘__annotations__’ + attribute defined. When accessing the ‘__annotations__’ of a + possibly unknown object, best practice in Python versions 3.10 and + newer is to call *note getattr(): 837. with three arguments, for + example ‘getattr(o, '__annotations__', None)’. + + +File: python.info, Node: Accessing The Annotations Dict Of An Object In Python 3 9 And Older, Next: Manually Un-Stringizing Stringized Annotations, Prev: Accessing The Annotations Dict Of An Object In Python 3 10 And Newer, Up: Annotations Best Practices + +10.18.2 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 *note + inspect.get_annotations(): 405.: you should use three-argument + *note getattr(): 837. to access the object’s ‘__annotations__’ + attribute. + + Unfortunately, this isn’t best practice for classes. The problem + is that, since ‘__annotations__’ is optional on classes, and + because classes can inherit attributes from their base classes, + accessing the ‘__annotations__’ attribute of a class may + inadvertently return the annotations dict of a `base class.' As an + example: + + class Base: + a: int = 3 + b: str = 'abc' + + class Derived(Base): + pass + + print(Derived.__annotations__) + + This will print the annotations dict from ‘Base’, not ‘Derived’. + + Your code will have to have a separate code path if the object + you’re examining is a class (‘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 ‘__dict__’ dictionary. Since the class may or may not have + annotations defined, best practice is to call the ‘get’ method on + the class dict. + + To put it all together, here is some sample code that safely + accesses the ‘__annotations__’ attribute on an arbitrary object in + Python 3.9 and before: + + if isinstance(o, type): + ann = o.__dict__.get('__annotations__', None) + else: + ann = getattr(o, '__annotations__', None) + + After running this code, ‘ann’ should be either a dictionary or + ‘None’. You’re encouraged to double-check the type of ‘ann’ using + *note isinstance(): 3ab. before further examination. + + Note that some exotic or malformed type objects may not have a + ‘__dict__’ attribute, so for extra safety you may also wish to use + *note getattr(): 837. to access ‘__dict__’. + + +File: python.info, Node: Manually Un-Stringizing Stringized Annotations, Next: Best Practices For __annotations__ In Any Python Version, Prev: Accessing The Annotations Dict Of An Object In Python 3 9 And Older, Up: Annotations Best Practices + +10.18.3 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 *note + inspect.get_annotations(): 405. to do this work for you. + + If you’re using Python 3.9 or older, or if for some reason you + can’t use *note inspect.get_annotations(): 405, you’ll need to + duplicate its logic. You’re encouraged to examine the + implementation of *note inspect.get_annotations(): 405. 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 ‘o’: + + * If ‘o’ is a module, use ‘o.__dict__’ as the ‘globals’ when + calling *note eval(): 4a7. + + * If ‘o’ is a class, use ‘sys.modules[o.__module__].__dict__’ as + the ‘globals’, and ‘dict(vars(o))’ as the ‘locals’, when + calling *note eval(): 4a7. + + * If ‘o’ is a wrapped callable using *note + functools.update_wrapper(): cce, *note functools.wraps(): bf8, + or *note functools.partial(): b5b, iteratively unwrap it by + accessing either ‘o.__wrapped__’ or ‘o.func’ as appropriate, + until you have found the root unwrapped function. + + * If ‘o’ is a callable (but not a class), use ‘o.__globals__’ as + the globals when calling *note eval(): 4a7. + + However, not all string values used as annotations can be + successfully turned into Python values by *note eval(): 4a7. + 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: + + * PEP 604(1) union types using ‘|’, before support for this was + added to Python 3.10. + + * Definitions that aren’t needed at runtime, only imported when + *note typing.TYPE_CHECKING: 963. is true. + + If *note eval(): 4a7. 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. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0604/ + + +File: python.info, Node: Best Practices For __annotations__ In Any Python Version, Next: __annotations__ Quirks, Prev: Manually Un-Stringizing Stringized Annotations, Up: Annotations Best Practices + +10.18.4 Best Practices For ‘__annotations__’ In Any Python Version +------------------------------------------------------------------ + + * You should avoid assigning to the ‘__annotations__’ member of + objects directly. Let Python manage setting + ‘__annotations__’. + + * If you do assign directly to the ‘__annotations__’ member of + an object, you should always set it to a ‘dict’ object. + + * If you directly access the ‘__annotations__’ member of an + object, you should ensure that it’s a dictionary before + attempting to examine its contents. + + * You should avoid modifying ‘__annotations__’ dicts. + + * You should avoid deleting the ‘__annotations__’ attribute of + an object. + + +File: python.info, Node: __annotations__ Quirks, Prev: Best Practices For __annotations__ In Any Python Version, Up: Annotations Best Practices + +10.18.5 ‘__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 ‘__annotations__’ attribute using ‘del + fn.__annotations__’, but if you then access ‘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 + ‘AttributeError’; using ‘del fn.__annotations__’ twice in a row is + guaranteed to always throw an ‘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 ‘__annotations__’ on a + function object to ‘None’. However, subsequently accessing the + annotations on that object using ‘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 ‘__annotations__’ to any + Python value, and will retain whatever value is set. + + If Python stringizes your annotations for you (using ‘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: + + from __future__ import annotations + def foo(a: "str"): pass + + print(foo.__annotations__) + + This prints ‘{'a': "'str'"}’. This shouldn’t really be considered + a “quirk”; it’s mentioned here simply because it might be + surprising. + + +File: python.info, Node: Isolating Extension Modules, Prev: Annotations Best Practices, Up: Python HOWTOs + +10.19 Isolating Extension Modules +================================= + +Abstract +........ + +Traditionally, state belonging to Python extension modules was kept in C +‘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:: + + +File: python.info, Node: Who should read this, Next: Background<2>, Up: Isolating Extension Modules + +10.19.1 Who should read this +---------------------------- + +This guide is written for maintainers of *note C-API: 1626. extensions +who would like to make that extension safer to use in applications where +Python itself is used as a library. + + +File: python.info, Node: Background<2>, Next: Making Modules Safe with Multiple Interpreters, Prev: Who should read this, Up: Isolating Extension Modules + +10.19.2 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: + + - in sequence, with several *note Py_InitializeEx(): 4456./*note + Py_FinalizeEx(): 986. cycles, and + + - in parallel, managing “sub-interpreters” using *note + Py_NewInterpreter(): 4457./*note Py_EndInterpreter(): 1255. + +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 ‘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:: + + +File: python.info, Node: Enter Per-Module State, Next: Isolated Module Objects, Up: Background<2> + +10.19.2.1 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 is 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 *note PyObject: 4cf.*; 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.) + + +File: python.info, Node: Isolated Module Objects, Next: Surprising Edge Cases, Prev: Enter Per-Module State, Up: Background<2> + +10.19.2.2 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: + + >>> import sys + >>> import binascii + >>> old_binascii = binascii + >>> del sys.modules['binascii'] + >>> import binascii # create a new module object + >>> old_binascii == binascii + False + +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 *note Managing Global State: +4982.), 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. + + +File: python.info, Node: Surprising Edge Cases, Prev: Isolated Module Objects, Up: Background<2> + +10.19.2.3 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 *note +example above: 4981, note that ‘old_binascii.Error’ and ‘binascii.Error’ +are separate objects. In the following code, the exception is `not' +caught: + + >>> old_binascii.Error == binascii.Error + False + >>> try: + ... old_binascii.unhexlify(b'qwertyuiop') + ... except binascii.Error: + ... print('boo') + ... + Traceback (most recent call last): + File "", line 2, in + binascii.Error: Non-hexadecimal digit found + +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 ‘sys.modules’ “manually” counts as a +hack. + + +File: python.info, Node: Making Modules Safe with Multiple Interpreters, Next: Heap Types<2>, Prev: Background<2>, Up: Isolating Extension Modules + +10.19.3 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:: + + +File: python.info, Node: Managing Global State, Next: Managing Per-Module State, Up: Making Modules Safe with Multiple Interpreters + +10.19.3.1 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: + + - The ‘readline’ module manages `the' terminal. + + - A module running on a circuit board wants to control `the' on-board + LED. + +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 *note Opt-Out; +Limiting to One Module Object per Process: 4985. + + +File: python.info, Node: Managing Per-Module State, Next: Opt-Out Limiting to One Module Object per Process, Prev: Managing Global State, Up: Making Modules Safe with Multiple Interpreters + +10.19.3.2 Managing Per-Module State +................................... + +To use per-module state, use *note multi-phase extension module +initialization: 4292. This signals that your module supports multiple +interpreters correctly. + +Set ‘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 ‘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. ‘csv’’s *note field_size_limit: 11ed.) which the C code needs to +function. + + Note: Another option is to store state in the module’s ‘__dict__’, + but you must avoid crashing when users modify ‘__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 + ‘__dict__’ only is a good idea. + +If the module state includes ‘PyObject’ pointers, the module object must +hold references to those objects and implement the module-level hooks +‘m_traverse’, ‘m_clear’ and ‘m_free’. These work like ‘tp_traverse’, +‘tp_clear’ and ‘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(1); example module initialization shown at the bottom of the +file. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/blob/master/Modules/xxlimited.c + + +File: python.info, Node: Opt-Out Limiting to One Module Object per Process, Next: Module State Access from Functions, Prev: Managing Per-Module State, Up: Making Modules Safe with Multiple Interpreters + +10.19.3.3 Opt-Out: Limiting to One Module Object per Process +............................................................ + +A non-negative ‘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: + + static int loaded = 0; + + static int + exec_module(PyObject* module) + { + if (loaded) { + PyErr_SetString(PyExc_ImportError, + "cannot load module more than once per process"); + return -1; + } + loaded = 1; + // ... rest of initialization + } + + +File: python.info, Node: Module State Access from Functions, Prev: Opt-Out Limiting to One Module Object per Process, Up: Making Modules Safe with Multiple Interpreters + +10.19.3.4 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 ‘PyModule_GetState’: + + static PyObject * + func(PyObject *module, PyObject *args) + { + my_struct *state = (my_struct*)PyModule_GetState(module); + if (state == NULL) { + return NULL; + } + // ... rest of logic + } + + Note: ‘PyModule_GetState’ may return ‘NULL’ without setting an + exception if there is no module state, i.e. ‘PyModuleDef.m_size’ + was zero. In your own module, you’re in control of ‘m_size’, so + this is easy to prevent. + + +File: python.info, Node: Heap Types<2>, Next: Open Issues, Prev: Making Modules Safe with Multiple Interpreters, Up: Isolating Extension Modules + +10.19.4 Heap Types +------------------ + +Traditionally, types defined in C code are `static'; that is, ‘static +PyTypeObject’ structures defined directly in code and initialized using +‘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 ‘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 ‘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, Getters and Setters: Module State Access from Slot Methods Getters and Setters. +* Lifetime of the Module State:: + + +File: python.info, Node: Changing Static Types to Heap Types, Next: Defining Heap Types, Up: Heap Types<2> + +10.19.4.1 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): + + * Unlike static types, heap type objects are mutable by default. Use + the ‘Py_TPFLAGS_IMMUTABLETYPE’ flag to prevent mutability. + + * Heap types inherit *note tp_new: 4260. by default, so it may become + possible to instantiate them from Python code. You can prevent + this with the ‘Py_TPFLAGS_DISALLOW_INSTANTIATION’ flag. + + +File: python.info, Node: Defining Heap Types, Next: Garbage-Collection Protocol, Prev: Changing Static Types to Heap Types, Up: Heap Types<2> + +10.19.4.2 Defining Heap Types +............................. + +Heap types can be created by filling a *note PyType_Spec: 4409. +structure, a description or “blueprint” of a class, and calling *note +PyType_FromModuleAndSpec(): 4c8. to construct a new class object. + + Note: Other functions, like *note PyType_FromSpec(): 5b8, can also + create heap types, but *note PyType_FromModuleAndSpec(): 4c8. + associates the module with the class, allowing access to the module + state from methods. + +The class should generally be stored in `both' the module state (for +safe access from C) and the module’s ‘__dict__’ (for access from Python +code). + + +File: python.info, Node: Garbage-Collection Protocol, Next: Module State Access from Classes, Prev: Defining Heap Types, Up: Heap Types<2> + +10.19.4.3 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: + + - Have the ‘Py_TPFLAGS_HAVE_GC’ flag. + + - Define a traverse function using ‘Py_tp_traverse’, which visits the + type (e.g. using *note Py_VISIT: 426e.(*note Py_TYPE: + 355.(self))). + +Please refer to the *note the documentation: 5e3. of +‘Py_TPFLAGS_HAVE_GC’ and *note tp_traverse: 352. for additional +considerations. + +If your traverse function delegates to the ‘tp_traverse’ of its base +class (or another type), ensure that ‘Py_TYPE(self)’ is visited only +once. Note that only heap type are expected to visit the type in +‘tp_traverse’. + +For example, if your traverse function includes: + + base->tp_traverse(self, visit, arg) + +…and ‘base’ may be a static type, then it should also include: + + if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { + // a heap type's tp_traverse already visited Py_TYPE(self) + } else { + Py_VISIT(Py_TYPE(self)); + } + +It is not necessary to handle the type’s reference count in ‘tp_new’ and +‘tp_clear’. + + +File: python.info, Node: Module State Access from Classes, Next: Module State Access from Regular Methods, Prev: Garbage-Collection Protocol, Up: Heap Types<2> + +10.19.4.4 Module State Access from Classes +.......................................... + +If you have a type object defined with *note PyType_FromModuleAndSpec(): +4c8, you can call *note PyType_GetModule(): 5c2. to get the associated +module, and then *note PyModule_GetState(): 5d5. to get the module’s +state. + +To save a some tedious error-handling boilerplate code, you can combine +these two steps with *note PyType_GetModuleState(): 5c3, resulting in: + + my_struct *state = (my_struct*)PyType_GetModuleState(type); + if (state === NULL) { + return NULL; + } + + +File: python.info, Node: Module State Access from Regular Methods, Next: Module State Access from Slot Methods Getters and Setters, Prev: Module State Access from Classes, Up: Heap Types<2> + +10.19.4.5 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 *note Py_TYPE: 355.(self). If +the method is called on a `subclass' of your type, ‘Py_TYPE(self)’ will +refer to that subclass, which may be defined in different module than +yours. + + Note: The following Python code can illustrate the concept. + ‘Base.get_defining_class’ returns ‘Base’ even if ‘type(self) == + Sub’: + + class Base: + def get_type_of_self(self): + return type(self) + + def get_defining_class(self): + return __class__ + + class Sub(Base): + pass + +For a method to get its “defining class”, it must use the ‘METH_METHOD | +METH_FASTCALL | METH_KEYWORDS’ *note calling convention: 1119. and the +corresponding *note PyCMethod: 336. signature: + + 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 + +Once you have the defining class, call *note PyType_GetModuleState(): +5c3. to get the state of its associated module. + +For 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}, + } + + +File: python.info, Node: Module State Access from Slot Methods Getters and Setters, Next: Lifetime of the Module State, Prev: Module State Access from Regular Methods, Up: Heap Types<2> + +10.19.4.6 Module State Access from Slot Methods, Getters and Setters +.................................................................... + + Note: This is new in Python 3.11. + +Slot methods—the fast C equivalents for special methods, such as *note +nb_add: 4549. for *note __add__: 1942. or ‘tp_new’ for +initialization—have a very simple API that doesn’t allow passing in the +defining class, unlike with *note PyCMethod: 336. The same goes for +getters and setters defined with *note PyGetSetDef: 81b. + +To access the module state in these cases, use the *note +PyType_GetModuleByDef(): 335. function, and pass in the module +definition. Once you have the module, call *note PyModule_GetState(): +5d5. to get the state: + + PyObject *module = PyType_GetModuleByDef(Py_TYPE(self), &module_def); + my_struct *state = (my_struct*)PyModule_GetState(module); + if (state === NULL) { + return NULL; + } + +‘PyType_GetModuleByDef’ works by searching the *note method resolution +order: 1bc9. (i.e. all superclasses) for the first superclass that has +a corresponding module. + + Note: In very exotic cases (inheritance chains spanning multiple + modules created from the same definition), ‘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. + + +File: python.info, Node: Lifetime of the Module State, Prev: Module State Access from Slot Methods Getters and Setters, Up: Heap Types<2> + +10.19.4.7 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 *note +PyType_FromModuleAndSpec(): 4c8, 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. + + +File: python.info, Node: Open Issues, Prev: Heap Types<2>, Up: Isolating Extension Modules + +10.19.5 Open Issues +------------------- + +Several issues around per-module state and heap types are still open. + +Discussions about improving the situation are best held on the capi-sig +mailing list(1). + +* Menu: + +* Per-Class Scope:: +* Lossless Conversion to Heap Types:: + + ---------- Footnotes ---------- + + (1) https://mail.python.org/mailman3/lists/capi-sig.python.org/ + + +File: python.info, Node: Per-Class Scope, Next: Lossless Conversion to Heap Types, Up: Open Issues + +10.19.5.1 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). + + +File: python.info, Node: Lossless Conversion to Heap Types, Prev: Per-Class Scope, Up: Open Issues + +10.19.5.2 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. + + +File: python.info, Node: Python Frequently Asked Questions, Next: Glossary, Prev: Python HOWTOs, Up: Top + +11 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:: + + +File: python.info, Node: General Python FAQ, Next: Programming FAQ, Up: Python Frequently Asked Questions + +11.1 General Python FAQ +======================= + +* Menu: + +* General Information:: +* Python in the real world:: + + +File: python.info, Node: General Information, Next: Python in the real world, Up: General Python FAQ + +11.1.1 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”?:: + + +File: python.info, Node: What is Python?, Next: What is the Python Software Foundation?, Up: General Information + +11.1.1.1 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 *note The Python Tutorial: 1622. The +Beginner’s Guide to Python(1) links to other introductory tutorials and +resources for learning Python. + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/BeginnersGuide + + +File: python.info, Node: What is the Python Software Foundation?, Next: Are there copyright restrictions on the use of Python?, Prev: What is Python?, Up: General Information + +11.1.1.2 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 ‘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(1). + + ---------- Footnotes ---------- + + (1) https://www.python.org/psf/donations/ + + +File: python.info, Node: Are there copyright restrictions on the use of Python?, Next: Why was Python created in the first place?, Prev: What is the Python Software Foundation?, Up: General Information + +11.1.1.3 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 PSF license page(1) to find further explanations and a link to +the full text of the license. + +The Python logo is trademarked, and in certain cases permission is +required to use it. Consult the Trademark Usage Policy(2) for more +information. + + ---------- Footnotes ---------- + + (1) https://www.python.org/psf/license/ + + (2) https://www.python.org/psf/trademarks/ + + +File: python.info, Node: Why was Python created in the first place?, Next: What is Python good for?, Prev: Are there copyright restrictions on the use of Python?, Up: General Information + +11.1.1.4 Why was Python created in the first place? +................................................... + +Here’s a `very' brief summary of what started it all, written by Guido +van Rossum: + + 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 ‘Misc/HISTORY’ file. + + +File: python.info, Node: What is Python good for?, Next: How does the Python version numbering scheme work?, Prev: Why was Python created in the first place?, Up: General Information + +11.1.1.5 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 +*note The Python Standard Library: 1623. to get an idea of what’s +available. A wide variety of third-party extensions are also available. +Consult the Python Package Index(1) to find packages of interest to you. + + ---------- Footnotes ---------- + + (1) https://pypi.org + + +File: python.info, Node: How does the Python version numbering scheme work?, Next: How do I obtain a copy of the Python source?, Prev: What is Python good for?, Up: General Information + +11.1.1.6 How does the Python version numbering scheme work? +........................................................... + +Python versions are numbered “A.B.C” or “A.B”: + + * `A' is the major version number – it is only incremented for really + major changes in the language. + + * `B' is the minor version number – it is incremented for less + earth-shattering changes. + + * `C' is the micro version number – it is incremented for each bugfix + release. + +See PEP 6(1) for more information about bugfix releases. + +Not all releases are bugfix releases. In the run-up to a new major +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: + + * The suffix for an alpha version is “aN” for some small number `N'. + + * The suffix for a beta version is “bN” for some small number `N'. + + * The suffix for a release candidate version is “rcN” for some small + number `N'. + +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 also the documentation for *note sys.version: 990, *note +sys.hexversion: 3bcc, and *note sys.version_info: 27d. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0006/ + + +File: python.info, Node: How do I obtain a copy of the Python source?, Next: How do I get documentation on Python?, Prev: How does the Python version numbering scheme work?, Up: General Information + +11.1.1.7 How do I obtain a copy of the Python source? +..................................................... + +The latest Python source distribution is always available from +python.org, at ‘https://www.python.org/downloads/’. The latest +development sources can be obtained at +‘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(1) +for more information on getting the source code and compiling it. + + ---------- Footnotes ---------- + + (1) https://devguide.python.org/setup/ + + +File: python.info, Node: How do I get documentation on Python?, Next: I’ve never programmed before Is there a Python tutorial?, Prev: How do I obtain a copy of the Python source?, Up: General Information + +11.1.1.8 How do I get documentation on Python? +.............................................. + +The standard documentation for the current stable version of Python is +available at ‘https://docs.python.org/3/’. PDF, plain text, and +downloadable HTML versions are also available at +‘https://docs.python.org/3/download.html’. + +The documentation is written in reStructuredText and processed by the +Sphinx documentation tool(1). The reStructuredText source for the +documentation is part of the Python source distribution. + + ---------- Footnotes ---------- + + (1) http://sphinx-doc.org/ + + +File: python.info, Node: I’ve never programmed before Is there a Python tutorial?, Next: Is there a newsgroup or mailing list devoted to Python?, Prev: How do I get documentation on Python?, Up: General Information + +11.1.1.9 I’ve never programmed before. Is there a Python tutorial? +.................................................................. + +There are numerous tutorials and books available. The standard +documentation includes *note The Python Tutorial: 1622. + +Consult the Beginner’s Guide(1) to find information for beginning Python +programmers, including lists of tutorials. + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/BeginnersGuide + + +File: python.info, Node: Is there a newsgroup or mailing list devoted to Python?, Next: How do I get a beta test version of Python?, Prev: I’ve never programmed before Is there a Python tutorial?, Up: General Information + +11.1.1.10 Is there a newsgroup or mailing list devoted to Python? +................................................................. + +There is a newsgroup, ‘comp.lang.python’, and a mailing list, +python-list(1). The newsgroup and mailing list are gatewayed into each +other – if you can read news it’s unnecessary to subscribe to the +mailing list. ‘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(2). + +More info about other mailing lists and newsgroups can be found at +‘https://www.python.org/community/lists/’. + + ---------- Footnotes ---------- + + (1) https://mail.python.org/mailman/listinfo/python-list + + (2) https://mail.python.org/mailman/listinfo/python-announce-list + + +File: python.info, Node: How do I get a beta test version of Python?, Next: How do I submit bug reports and patches for Python?, Prev: Is there a newsgroup or mailing list devoted to Python?, Up: General Information + +11.1.1.11 How do I get a beta test version of Python? +..................................................... + +Alpha and beta releases are available from +‘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 ‘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(1) for details. + + ---------- Footnotes ---------- + + (1) https://devguide.python.org/ + + +File: python.info, Node: How do I submit bug reports and patches for Python?, Next: Are there any published articles about Python that I can reference?, Prev: How do I get a beta test version of Python?, Up: General Information + +11.1.1.12 How do I submit bug reports and patches for Python? +............................................................. + +To report a bug or submit a patch, use the issue tracker at +‘https://github.com/python/cpython/issues’. + +For more information on how Python is developed, consult the Python +Developer’s Guide(1). + + ---------- Footnotes ---------- + + (1) https://devguide.python.org/ + + +File: python.info, Node: Are there any published articles about Python that I can reference?, Next: Are there any books on Python?, Prev: How do I submit bug reports and patches for Python?, Up: General Information + +11.1.1.13 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 about Python was written in 1991 and is now quite +outdated. + + 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. + + +File: python.info, Node: Are there any books on Python?, Next: Where in the world is www python org located?, Prev: Are there any published articles about Python that I can reference?, Up: General Information + +11.1.1.14 Are there any books on Python? +........................................ + +Yes, there are many, and more are being published. See the python.org +wiki at ‘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”. + + +File: python.info, Node: Where in the world is www python org located?, Next: Why is it called Python?, Prev: Are there any books on Python?, Up: General Information + +11.1.1.15 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(1). + + ---------- Footnotes ---------- + + (1) http://infra.psf.io + + +File: python.info, Node: Why is it called Python?, Next: Do I have to like “Monty Python’s Flying Circus”?, Prev: Where in the world is www python org located?, Up: General Information + +11.1.1.16 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"(1), 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. + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/Monty_Python + + +File: python.info, Node: Do I have to like “Monty Python’s Flying Circus”?, Prev: Why is it called Python?, Up: General Information + +11.1.1.17 Do I have to like “Monty Python’s Flying Circus”? +........................................................... + +No, but it helps. :) + + +File: python.info, Node: Python in the real world, Prev: General Information, Up: General Python FAQ + +11.1.2 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?:: + + +File: python.info, Node: How stable is Python?, Next: How many people are using Python?, Up: Python in the real world + +11.1.2.1 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 major new release every 12 months ( PEP +602(1)). + +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(2). There are two production-ready versions of Python: 2.x and +3.x. The recommended version is 3.x, which is supported by most widely +used libraries. Although 2.x is still widely used, it is not maintained +anymore(3). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0602/ + + (2) https://www.python.org/downloads/ + + (3) https://peps.python.org/pep-0373/ + + +File: python.info, Node: How many people are using Python?, Next: Have any significant projects been done in Python?, Prev: How stable is Python?, Up: Python in the real world + +11.1.2.2 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. + + +File: python.info, Node: Have any significant projects been done in Python?, Next: What new developments are expected for Python in the future?, Prev: How many people are using Python?, Up: Python in the real world + +11.1.2.3 Have any significant projects been done in Python? +........................................................... + +See ‘https://www.python.org/about/success’ for a list of projects that +use Python. Consulting the proceedings for past Python conferences(1) +will reveal contributions from many different companies and +organizations. + +High-profile Python projects include the Mailman mailing list manager(2) +and the Zope application server(3). Several Linux distributions, most +notably Red Hat(4), 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. + + ---------- Footnotes ---------- + + (1) https://www.python.org/community/workshops/ + + (2) https://www.list.org + + (3) https://www.zope.dev + + (4) https://www.redhat.com + + +File: python.info, Node: What new developments are expected for Python in the future?, Next: Is it reasonable to propose incompatible changes to Python?, Prev: Have any significant projects been done in Python?, Up: Python in the real world + +11.1.2.4 What new developments are expected for Python in the future? +..................................................................... + +See ‘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(1). + + ---------- Footnotes ---------- + + (1) https://mail.python.org/mailman/listinfo/python-dev/ + + +File: python.info, Node: Is it reasonable to propose incompatible changes to Python?, Next: Is Python a good language for beginning programmers?, Prev: What new developments are expected for Python in the future?, Up: Python in the real world + +11.1.2.5 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. PEP 5(1) describes the procedure followed for introducing +backward-incompatible changes while minimizing disruption for users. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0005/ + + +File: python.info, Node: Is Python a good language for beginning programmers?, Prev: Is it reasonable to propose incompatible changes to Python?, Up: Python in the real world + +11.1.2.6 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: + + >>> 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] + +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(1) 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(2). + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/PythonEditors + + (2) https://www.python.org/community/sigs/current/edu-sig + + +File: python.info, Node: Programming FAQ, Next: Design and History FAQ, Prev: General Python FAQ, Up: Python Frequently Asked Questions + +11.2 Programming FAQ +==================== + +* Menu: + +* General Questions:: +* Core Language:: +* Numbers and strings:: +* Performance: Performance<4>. +* Sequences (Tuples/Lists): Sequences Tuples/Lists. +* Objects:: +* Modules: Modules<3>. + + +File: python.info, Node: General Questions, Next: Core Language, Up: Programming FAQ + +11.2.1 General Questions +------------------------ + +* Menu: + +* Is there a source code level debugger with breakpoints, single-stepping, etc.?: Is there a source code level debugger with breakpoints single-stepping etc ?. +* 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?:: + + +File: python.info, Node: Is there a source code level debugger with breakpoints single-stepping etc ?, Next: Are there tools to help find bugs or perform static analysis?, Up: General Questions + +11.2.1.1 Is there a source code level debugger with breakpoints, single-stepping, etc.? +....................................................................................... + +Yes. + +Several debuggers for Python are described below, and the built-in +function *note breakpoint(): 716. 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 *note +documented in the Library Reference Manual: c6. 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 Tools/scripts/idle), +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(1) project and as a part of the +ActivePython(2) distribution. + +Eric(3) is an IDE built on PyQt and the Scintilla editing component. + +trepan3k(4) is a gdb-like debugger. + +Visual Studio Code(5) 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: + + * Wing IDE(6) + + * Komodo IDE(7) + + * PyCharm(8) + + ---------- Footnotes ---------- + + (1) https://github.com/mhammond/pywin32 + + (2) https://www.activestate.com/products/python/ + + (3) https://eric-ide.python-projects.org/ + + (4) https://github.com/rocky/python3-trepan/ + + (5) https://code.visualstudio.com/ + + (6) https://wingware.com/ + + (7) https://www.activestate.com/products/komodo-ide/ + + (8) https://www.jetbrains.com/pycharm/ + + +File: python.info, Node: Are there tools to help find bugs or perform static analysis?, Next: How can I create a stand-alone binary from a Python script?, Prev: Is there a source code level debugger with breakpoints single-stepping etc ?, Up: General Questions + +11.2.1.2 Are there tools to help find bugs or perform static analysis? +...................................................................... + +Yes. + +Pylint(1) and Pyflakes(2) do basic checking that will help you catch +bugs sooner. + +Static type checkers such as Mypy(3), Pyre(4), and Pytype(5) can check +type hints in Python source code. + + ---------- Footnotes ---------- + + (1) https://pylint.pycqa.org/en/latest/index.html + + (2) https://github.com/PyCQA/pyflakes + + (3) http://mypy-lang.org/ + + (4) https://pyre-check.org/ + + (5) https://github.com/google/pytype + + +File: python.info, Node: How can I create a stand-alone binary from a Python script?, Next: Are there coding standards or a style guide for Python programs?, Prev: Are there tools to help find bugs or perform static analysis?, Up: General Questions + +11.2.1.3 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’. 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: + + * Nuitka(1) (Cross-platform) + + * PyInstaller(2) (Cross-platform) + + * PyOxidizer(3) (Cross-platform) + + * cx_Freeze(4) (Cross-platform) + + * py2app(5) (macOS only) + + * py2exe(6) (Windows only) + + ---------- Footnotes ---------- + + (1) https://nuitka.net/ + + (2) https://pyinstaller.org/ + + (3) https://pyoxidizer.readthedocs.io/en/stable/ + + (4) https://marcelotduarte.github.io/cx_Freeze/ + + (5) https://github.com/ronaldoussoren/py2app + + (6) https://www.py2exe.org/ + + +File: python.info, Node: Are there coding standards or a style guide for Python programs?, Prev: How can I create a stand-alone binary from a Python script?, Up: General Questions + +11.2.1.4 Are there coding standards or a style guide for Python programs? +......................................................................... + +Yes. The coding style required for standard library modules is +documented as PEP 8(1). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0008/ + + +File: python.info, Node: Core Language, Next: Numbers and strings, Prev: General Questions, Up: Programming FAQ + +11.2.2 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?. + + +File: python.info, Node: Why am I getting an UnboundLocalError when the variable has a value?, Next: What are the rules for local and global variables in Python?, Up: Core Language + +11.2.2.1 Why am I getting an UnboundLocalError when the variable has a value? +............................................................................. + +It can be a surprise to get the UnboundLocalError in previously working +code when it is modified by adding an assignment statement somewhere in +the body of a function. + +This code: + + >>> x = 10 + >>> def bar(): + ... print(x) + >>> bar() + 10 + +works, but this code: + + >>> x = 10 + >>> def foo(): + ... print(x) + ... x += 1 + +results in an UnboundLocalError: + + >>> foo() + Traceback (most recent call last): + ... + UnboundLocalError: local variable 'x' referenced before assignment + +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 ‘x’, the compiler recognizes it as a local +variable. Consequently when the earlier ‘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: + + >>> x = 10 + >>> def foobar(): + ... global x + ... print(x) + ... x += 1 + >>> foobar() + 10 + +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: + + >>> print(x) + 11 + +You can do a similar thing in a nested scope using the *note nonlocal: +f56. keyword: + + >>> def foo(): + ... x = 10 + ... def bar(): + ... nonlocal x + ... print(x) + ... x += 1 + ... bar() + ... print(x) + >>> foo() + 10 + 11 + + +File: python.info, Node: What are the rules for local and global variables in Python?, Next: Why do lambdas defined in a loop with different values all return the same result?, Prev: Why am I getting an UnboundLocalError when the variable has a value?, Up: Core Language + +11.2.2.2 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 *note global: 166a. for assigned variables +provides a bar against unintended side-effects. On the other hand, if +‘global’ was required for all global references, you’d be using ‘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 ‘global’ declaration for identifying +side-effects. + + +File: python.info, Node: Why do lambdas defined in a loop with different values all return the same result?, Next: How do I share global variables across modules?, Prev: What are the rules for local and global variables in Python?, Up: Core Language + +11.2.2.3 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), e.g.: + + >>> squares = [] + >>> for x in range(5): + ... squares.append(lambda: x**2) + +This gives you a list that contains 5 lambdas that calculate ‘x**2’. +You might expect that, when called, they would return, respectively, +‘0’, ‘1’, ‘4’, ‘9’, and ‘16’. However, when you actually try you will +see that they all return ‘16’: + + >>> squares[2]() + 16 + >>> squares[4]() + 16 + +This happens because ‘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 ‘x’ is ‘4’, so all +the functions now return ‘4**2’, i.e. ‘16’. You can also verify this +by changing the value of ‘x’ and see how the results of the lambdas +change: + + >>> x = 8 + >>> squares[2]() + 64 + +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 ‘x’: + + >>> squares = [] + >>> for x in range(5): + ... squares.append(lambda n=x: n**2) + +Here, ‘n=x’ creates a new variable ‘n’ local to the lambda and computed +when the lambda is defined so that it has the same value that ‘x’ had at +that point in the loop. This means that the value of ‘n’ will be ‘0’ in +the first lambda, ‘1’ in the second, ‘2’ in the third, and so on. +Therefore each lambda will now return the correct result: + + >>> squares[2]() + 4 + >>> squares[4]() + 16 + +Note that this behaviour is not peculiar to lambdas, but applies to +regular functions too. + + +File: python.info, Node: How do I share global variables across modules?, Next: What are the “best practices” for using import in a module?, Prev: Why do lambdas defined in a loop with different values all return the same result?, Up: Core Language + +11.2.2.4 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: + + x = 0 # Default value of the 'x' configuration setting + +mod.py: + + import config + config.x = 1 + +main.py: + + import config + import mod + print(config.x) + +Note that using a module is also the basis for implementing the +Singleton design pattern, for the same reason. + + +File: python.info, Node: What are the “best practices” for using import in a module?, Next: Why are default values shared between objects?, Prev: How do I share global variables across modules?, Up: Core Language + +11.2.2.5 What are the “best practices” for using import in a module? +.................................................................... + +In general, don’t use ‘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: + + 1. standard library modules – e.g. ‘sys’, ‘os’, ‘getopt’, ‘re’ + + 2. third-party library modules (anything installed in Python’s + site-packages directory) – e.g. mx.DateTime, ZODB, PIL.Image, etc. + + 3. locally developed modules + +It is sometimes necessary to move imports to a function or class to +avoid problems with circular imports. Gordon McMillan says: + + Circular imports are fine where both modules use the “import + ” 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. + +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 *note sys.modules: 1382. + + +File: python.info, Node: Why are default values shared between objects?, Next: How can I pass optional or keyword parameters from one function to another?, Prev: What are the “best practices” for using import in a module?, Up: Core Language + +11.2.2.6 Why are default values shared between objects? +....................................................... + +This type of bug commonly bites neophyte programmers. Consider this +function: + + def foo(mydict={}): # Danger: shared reference to one dict for all calls + ... compute something ... + mydict[key] = value + return mydict + +The first time you call this function, ‘mydict’ contains a single item. +The second time, ‘mydict’ contains two items because when ‘foo()’ begins +executing, ‘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 +‘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 ‘None’ as the default +value and inside the function, check if the parameter is ‘None’ and +create a new list/dictionary/whatever if it is. For example, don’t +write: + + def foo(mydict={}): + ... + +but: + + def foo(mydict=None): + if mydict is None: + mydict = {} # create a new dict for local namespace + +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: + + # 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 + +You could use a global variable containing a dictionary instead of the +default value; it’s a matter of taste. + + +File: python.info, Node: How can I pass optional or keyword parameters from one function to another?, Next: What is the difference between arguments and parameters?, Prev: Why are default values shared between objects?, Up: Core Language + +11.2.2.7 How can I pass optional or keyword parameters from one function to another? +.................................................................................... + +Collect the arguments using the ‘*’ and ‘**’ 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 ‘*’ and ‘**’: + + def f(x, *args, **kwargs): + ... + kwargs['width'] = '14.3c' + ... + g(x, *args, **kwargs) + + +File: python.info, Node: What is the difference between arguments and parameters?, Next: Why did changing list ‘y’ also change list ‘x’?, Prev: How can I pass optional or keyword parameters from one function to another?, Up: Core Language + +11.2.2.8 What is the difference between arguments and parameters? +................................................................. + +*note Parameters: 1a44. are defined by the names that appear in a +function definition, whereas *note arguments: 1a35. are the values +actually passed to a function when calling it. Parameters define what +*note kind of arguments: 1a44. a function can accept. For example, +given the function definition: + + def func(foo, bar=None, **kwargs): + pass + +`foo', `bar' and `kwargs' are parameters of ‘func’. However, when +calling ‘func’, for example: + + func(42, bar=314, extra=somevar) + +the values ‘42’, ‘314’, and ‘somevar’ are arguments. + + +File: python.info, Node: Why did changing list ‘y’ also change list ‘x’?, Next: How do I write a function with output parameters call by reference ?, Prev: What is the difference between arguments and parameters?, Up: Core Language + +11.2.2.9 Why did changing list ‘y’ also change list ‘x’? +........................................................ + +If you wrote code like: + + >>> x = [] + >>> y = x + >>> y.append(10) + >>> y + [10] + >>> x + [10] + +you might be wondering why appending an element to ‘y’ changed ‘x’ too. + +There are two factors that produce this result: + + 1. Variables are simply names that refer to objects. Doing ‘y = x’ + doesn’t create a copy of the list – it creates a new variable ‘y’ + that refers to the same object ‘x’ refers to. This means that + there is only one object (the list), and both ‘x’ and ‘y’ refer to + it. + + 2. Lists are *note mutable: 164f, which means that you can change + their content. + +After the call to ‘append()’, the content of the mutable object has +changed from ‘[]’ to ‘[10]’. Since both the variables refer to the same +object, using either name accesses the modified value ‘[10]’. + +If we instead assign an immutable object to ‘x’: + + >>> 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 + +we can see that in this case ‘x’ and ‘y’ are not equal anymore. This is +because integers are *note immutable: 1648, and when we do ‘x = x + 1’ +we are not mutating the int ‘5’ by incrementing its value; instead, we +are creating a new object (the int ‘6’) and assigning it to ‘x’ (that +is, changing which object ‘x’ refers to). After this assignment we have +two objects (the ints ‘6’ and ‘5’) and two variables that refer to them +(‘x’ now refers to ‘6’ but ‘y’ still refers to ‘5’). + +Some operations (for example ‘y.append(10)’ and ‘y.sort()’) mutate the +object, whereas superficially similar operations (for example ‘y = y + +[10]’ and ‘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 ‘None’ to help avoid getting the two types of operations +confused. So if you mistakenly write ‘y.sort()’ thinking it will give +you a sorted copy of ‘y’, you’ll instead end up with ‘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, ‘+=’ mutates lists but not tuples or +ints (‘a_list += [1, 2, 3]’ is equivalent to ‘a_list.extend([1, 2, 3])’ +and mutates ‘a_list’, whereas ‘some_tuple += (1, 2, 3)’ and ‘some_int += +1’ create new objects). + +In other words: + + * If we have a mutable object (*note list: 1e9, *note dict: 16e, + *note set: 1a6, etc.), we can use some specific operations to + mutate it and all the variables that refer to it will see the + change. + + * If we have an immutable object (*note str: 1b3, *note int: 1c7, + *note tuple: 539, etc.), 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. + +If you want to know if two variables refer to the same object or not, +you can use the *note is: 468. operator, or the built-in function *note +id(): 1086. + + +File: python.info, Node: How do I write a function with output parameters call by reference ?, Next: How do you make a higher order function in Python?, Prev: Why did changing list ‘y’ also change list ‘x’?, Up: Core Language + +11.2.2.10 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 so no call-by-reference +per se. You can achieve the desired effect in a number of ways. + + 1. By returning a tuple of the results: + + >>> 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) + + This is almost always the clearest solution. + + 2. By using global variables. This isn’t thread-safe, and is not + recommended. + + 3. By passing a mutable (changeable in-place) object: + + >>> 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] + + 4. By passing in a dictionary that gets mutated: + + >>> 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} + + 5. Or bundle up values in a class instance: + + >>> 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} + + There’s almost never a good reason to get this complicated. + +Your best choice is to return a tuple containing the multiple results. + + +File: python.info, Node: How do you make a higher order function in Python?, Next: How do I copy an object in Python?, Prev: How do I write a function with output parameters call by reference ?, Up: Core Language + +11.2.2.11 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 ‘linear(a,b)’ which +returns a function ‘f(x)’ that computes the value ‘a*x+b’. Using nested +scopes: + + def linear(a, b): + def result(x): + return a * x + b + return result + +Or using a callable object: + + class linear: + + def __init__(self, a, b): + self.a, self.b = a, b + + def __call__(self, x): + return self.a * x + self.b + +In both cases, + + taxes = linear(0.3, 2) + +gives a callable object where ‘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: + + class exponential(linear): + # __init__ inherited + def __call__(self, x): + return self.a * (x ** self.b) + +Object can encapsulate state for several methods: + + 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 + +Here ‘inc()’, ‘dec()’ and ‘reset()’ act like functions which share the +same counting variable. + + +File: python.info, Node: How do I copy an object in Python?, Next: How can I find the methods or attributes of an object?, Prev: How do you make a higher order function in Python?, Up: Core Language + +11.2.2.12 How do I copy an object in Python? +............................................ + +In general, try *note copy.copy(): 7cc. or *note copy.deepcopy(): 7cd. +for the general case. Not all objects can be copied, but most can. + +Some objects can be copied more easily. Dictionaries have a *note +copy(): 835. method: + + newdict = olddict.copy() + +Sequences can be copied by slicing: + + new_l = l[:] + + +File: python.info, Node: How can I find the methods or attributes of an object?, Next: How can my code discover the name of an object?, Prev: How do I copy an object in Python?, Up: Core Language + +11.2.2.13 How can I find the methods or attributes of an object? +................................................................ + +For an instance x of a user-defined class, ‘dir(x)’ returns an +alphabetized list of the names containing the instance attributes and +methods and attributes defined by its class. + + +File: python.info, Node: How can my code discover the name of an object?, Next: What’s up with the comma operator’s precedence?, Prev: How can I find the methods or attributes of an object?, Up: Core Language + +11.2.2.14 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 ‘def’ and ‘class’ statements, but in that case the value is a +callable. Consider the following code: + + >>> class A: + ... pass + ... + >>> B = A + >>> a = B() + >>> b = a + >>> print(b) + <__main__.A object at 0x16D07CC> + >>> print(a) + <__main__.A object at 0x16D07CC> + +Arguably the class has a name: even though it is bound to two names and +invoked through the name B the created instance is still reported as an +instance of class A. However, it is impossible to say whether the +instance’s name is a or 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: + + 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! + + +File: python.info, Node: What’s up with the comma operator’s precedence?, Next: Is there an equivalent of C’s “? ” ternary operator?, Prev: How can my code discover the name of an object?, Up: Core Language + +11.2.2.15 What’s up with the comma operator’s precedence? +......................................................... + +Comma is not an operator in Python. Consider this session: + + >>> "a" in "b", "a" + (False, 'a') + +Since the comma is not an operator, but a separator between expressions +the above is evaluated as if you had entered: + + ("a" in "b"), "a" + +not: + + "a" in ("b", "a") + +The same is true of the various assignment operators (‘=’, ‘+=’ etc). +They are not truly operators but syntactic delimiters in assignment +statements. + + +File: python.info, Node: Is there an equivalent of C’s “? ” ternary operator?, Next: Is it possible to write obfuscated one-liners in Python?, Prev: What’s up with the comma operator’s precedence?, Up: Core Language + +11.2.2.16 Is there an equivalent of C’s “?:” ternary operator? +.............................................................. + +Yes, there is. The syntax is as follows: + + [on_true] if [expression] else [on_false] + + x, y = 50, 25 + small = x if x < y else y + +Before this syntax was introduced in Python 2.5, a common idiom was to +use logical operators: + + [expression] and [on_true] or [on_false] + +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 ‘... if ... else ...’ form. + + +File: python.info, Node: Is it possible to write obfuscated one-liners in Python?, Next: What does the slash / in the parameter list of a function mean?, Prev: Is there an equivalent of C’s “? ” ternary operator?, Up: Core Language + +11.2.2.17 Is it possible to write obfuscated one-liners in Python? +.................................................................. + +Yes. Usually this is done by nesting *note lambda: f4b. within +‘lambda’. See the following three examples, slightly adapted from Ulf +Bartelt: + + 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 + +Don’t try this at home, kids! + + +File: python.info, Node: What does the slash / in the parameter list of a function mean?, Prev: Is it possible to write obfuscated one-liners in Python?, Up: Core Language + +11.2.2.18 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, *note divmod(): 5f1. is a +function that accepts positional-only parameters. Its documentation +looks like this: + + >>> 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. + +The slash at the end of the parameter list means that both parameters +are positional-only. Thus, calling *note divmod(): 5f1. with keyword +arguments would lead to an error: + + >>> divmod(x=3, y=4) + Traceback (most recent call last): + File "", line 1, in + TypeError: divmod() takes no keyword arguments + + +File: python.info, Node: Numbers and strings, Next: Performance<4>, Prev: Core Language, Up: Programming FAQ + +11.2.3 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?:: + + +File: python.info, Node: How do I specify hexadecimal and octal integers?, Next: Why does -22 // 10 return -3?, Up: Numbers and strings + +11.2.3.1 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: + + >>> a = 0o10 + >>> a + 8 + +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: + + >>> a = 0xa5 + >>> a + 165 + >>> b = 0XB2 + >>> b + 178 + + +File: python.info, Node: Why does -22 // 10 return -3?, Next: How do I get int literal attribute instead of SyntaxError?, Prev: How do I specify hexadecimal and octal integers?, Up: Numbers and strings + +11.2.3.2 Why does -22 // 10 return -3? +...................................... + +It’s primarily driven by the desire that ‘i % j’ have the same sign as +‘j’. If you want that, and also want: + + i == (i // j) * j + (i % j) + +then integer division has to return the floor. C also requires that +identity to hold, and then compilers that truncate ‘i // j’ need to make +‘i % j’ have the same sign as ‘i’. + +There are few real use cases for ‘i % j’ when ‘j’ is negative. When ‘j’ +is positive, there are many, and in virtually all of them it’s more +useful for ‘i % j’ to be ‘>= 0’. If the clock says 10 now, what did it +say 200 hours ago? ‘-190 % 12 == 2’ is useful; ‘-190 % 12 == -10’ is a +bug waiting to bite. + + +File: python.info, Node: How do I get int literal attribute instead of SyntaxError?, Next: How do I convert a string to a number?, Prev: Why does -22 // 10 return -3?, Up: Numbers and strings + +11.2.3.3 How do I get int literal attribute instead of SyntaxError? +................................................................... + +Trying to lookup an ‘int’ literal attribute in the normal manner gives a +syntax error because the period is seen as a decimal point: + + >>> 1.__class__ + File "", line 1 + 1.__class__ + ^ + SyntaxError: invalid decimal literal + +The solution is to separate the literal from the period with either a +space or parentheses. + + >>> 1 .__class__ + + >>> (1).__class__ + + + +File: python.info, Node: How do I convert a string to a number?, Next: How do I convert a number to a string?, Prev: How do I get int literal attribute instead of SyntaxError?, Up: Numbers and strings + +11.2.3.4 How do I convert a string to a number? +............................................... + +For integers, use the built-in *note int(): 1c7. type constructor, e.g. +‘int('144') == 144’. Similarly, *note float(): 3ca. converts to +floating-point, e.g. ‘float('144') == 144.0’. + +By default, these interpret the number as decimal, so that ‘int('0144') +== 144’ holds true, and ‘int('0x144')’ raises *note ValueError: 1c8. +‘int(string, base)’ takes the base to convert from as a second optional +argument, so ‘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 *note eval(): 4a7. if all you need is +to convert strings to numbers. *note eval(): 4a7. 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 ‘__import__('os').system("rm -rf $HOME")’ which would erase +your home directory. + +*note eval(): 4a7. also has the effect of interpreting numbers as Python +expressions, so that e.g. ‘eval('09')’ gives a syntax error because +Python does not allow leading ‘0’ in a decimal number (except ‘0’). + + +File: python.info, Node: How do I convert a number to a string?, Next: How do I modify a string in place?, Prev: How do I convert a string to a number?, Up: Numbers and strings + +11.2.3.5 How do I convert a number to a string? +............................................... + +To convert, e.g., the number 144 to the string ‘144’, use the built-in +type constructor *note str(): 1b3. If you want a hexadecimal or octal +representation, use the built-in functions *note hex(): f78. or *note +oct(): f77. For fancy formatting, see the *note Formatted string +literals: 5f9. and *note Format String Syntax: 1021. sections, e.g. +‘"{:04d}".format(144)’ yields ‘'0144'’ and ‘"{:.3f}".format(1.0/3.0)’ +yields ‘'0.333'’. + + +File: python.info, Node: How do I modify a string in place?, Next: How do I use strings to call functions/methods?, Prev: How do I convert a number to a string?, Up: Numbers and strings + +11.2.3.6 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 *note io.StringIO: bbe. +object or the *note array: 6. module: + + >>> 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('u', s) + >>> print(a) + array('u', 'Hello, world') + >>> a[0] = 'y' + >>> print(a) + array('u', 'yello, world') + >>> a.tounicode() + 'yello, world' + + +File: python.info, Node: How do I use strings to call functions/methods?, Next: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?, Prev: How do I modify a string in place?, Up: Numbers and strings + +11.2.3.7 How do I use strings to call functions/methods? +........................................................ + +There are various techniques. + + * 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: + + 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 + + * Use the built-in function *note getattr(): 837.: + + import foo + getattr(foo, 'bar')() + + Note that *note getattr(): 837. works on any object, including + classes, class instances, modules, and so on. + + This is used in several places in the standard library, like this: + + class Foo: + def do_foo(self): + ... + + def do_bar(self): + ... + + f = getattr(foo_instance, 'do_' + opname) + f() + + * Use *note locals(): 842. to resolve the function name: + + def myFunc(): + print("hello") + + fname = "myFunc" + + f = locals()[fname] + f() + + +File: python.info, Node: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?, Next: Is there a scanf or sscanf equivalent?, Prev: How do I use strings to call functions/methods?, Up: Numbers and strings + +11.2.3.8 Is there an equivalent to Perl’s chomp() for removing trailing newlines from strings? +.............................................................................................. + +You can use ‘S.rstrip("\r\n")’ to remove all occurrences of any line +terminator from the end of the string ‘S’ without removing other +trailing whitespace. If the string ‘S’ represents more than one line, +with several empty lines at the end, the line terminators for all the +blank lines will be removed: + + >>> lines = ("line 1 \r\n" + ... "\r\n" + ... "\r\n") + >>> lines.rstrip("\n\r") + 'line 1 ' + +Since this is typically only desired when reading text one line at a +time, using ‘S.rstrip()’ this way works well. + + +File: python.info, Node: Is there a scanf or sscanf equivalent?, Next: What does ‘UnicodeDecodeError’ or ‘UnicodeEncodeError’ error mean?, Prev: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?, Up: Numbers and strings + +11.2.3.9 Is there a scanf() or sscanf() equivalent? +................................................... + +Not as such. + +For simple input parsing, the easiest approach is usually to split the +line into whitespace-delimited words using the *note split(): b37. +method of string objects and then convert decimal strings to numeric +values using *note int(): 1c7. or *note float(): 3ca. ‘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 ‘sscanf()’ and better suited for the task. + + +File: python.info, Node: What does ‘UnicodeDecodeError’ or ‘UnicodeEncodeError’ error mean?, Prev: Is there a scanf or sscanf equivalent?, Up: Numbers and strings + +11.2.3.10 What does ‘UnicodeDecodeError’ or ‘UnicodeEncodeError’ error mean? +............................................................................ + +See the *note Unicode HOWTO: f53. + + +File: python.info, Node: Performance<4>, Next: Sequences Tuples/Lists, Prev: Numbers and strings, Up: Programming FAQ + +11.2.4 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?:: + + +File: python.info, Node: My program is too slow How do I speed it up?, Next: What is the most efficient way to concatenate many strings together?, Up: Performance<4> + +11.2.4.1 My program is too slow. How do I speed it up? +...................................................... + +That’s a tough one, in general. First, here are a list of things to +remember before diving further: + + * Performance characteristics vary across Python implementations. + This FAQ focuses on *note CPython: 2b4. + + * Behaviour can vary across operating systems, especially when + talking about I/O or multi-threading. + + * You should always find the hot spots in your program `before' + attempting to optimize any code (see the *note profile: d0. + module). + + * Writing benchmark scripts will allow you to iterate quickly when + searching for improvements (see the *note timeit: 10d. module). + + * It is highly recommended to have good code coverage (through unit + testing or any other technique) before potentially introducing + regressions hidden in sophisticated optimizations. + +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: + + * 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. + + * Use the right data structures. Study documentation for the *note + Built-in Types: 1bd9. and the *note collections: 1c. module. + + * 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 *note list.sort(): 834. + built-in method or the related *note sorted(): 833. function to do + sorting (and see the *note Sorting HOW TO: 1bc7. for examples of + moderately advanced usage). + + * 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). + +If you have reached the limit of what pure Python can allow, there are +tools to take you further away. For example, Cython(1) 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 *note write a C extension +module: 1625. yourself. + +See also +........ + +The wiki page devoted to performance tips(2). + + ---------- Footnotes ---------- + + (1) https://cython.org + + (2) https://wiki.python.org/moin/PythonSpeed/PerformanceTips + + +File: python.info, Node: What is the most efficient way to concatenate many strings together?, Prev: My program is too slow How do I speed it up?, Up: Performance<4> + +11.2.4.2 What is the most efficient way to concatenate many strings together? +............................................................................. + +*note str: 1b3. and *note bytes: 1b4. 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 *note str: 1b3. objects, the recommended idiom is to +place them into a list and call *note str.join(): 1bf4. at the end: + + chunks = [] + for s in my_strings: + chunks.append(s) + result = ''.join(chunks) + +(another reasonably efficient idiom is to use *note io.StringIO: bbe.) + +To accumulate many *note bytes: 1b4. objects, the recommended idiom is +to extend a *note bytearray: 1a5. object using in-place concatenation +(the ‘+=’ operator): + + result = bytearray() + for b in my_bytes_objects: + result += b + + +File: python.info, Node: Sequences Tuples/Lists, Next: Objects, Prev: Performance<4>, Up: Programming FAQ + +11.2.5 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 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?:: + + +File: python.info, Node: How do I convert between tuples and lists?, Next: What’s a negative index?, Up: Sequences Tuples/Lists + +11.2.5.1 How do I convert between tuples and lists? +................................................... + +The type constructor ‘tuple(seq)’ converts any sequence (actually, any +iterable) into a tuple with the same items in the same order. + +For example, ‘tuple([1, 2, 3])’ yields ‘(1, 2, 3)’ and ‘tuple('abc')’ +yields ‘('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 *note +tuple(): 539. when you aren’t sure that an object is already a tuple. + +The type constructor ‘list(seq)’ converts any sequence or iterable into +a list with the same items in the same order. For example, ‘list((1, 2, +3))’ yields ‘[1, 2, 3]’ and ‘list('abc')’ yields ‘['a', 'b', 'c']’. If +the argument is a list, it makes a copy just like ‘seq[:]’ would. + + +File: python.info, Node: What’s a negative index?, Next: How do I iterate over a sequence in reverse order?, Prev: How do I convert between tuples and lists?, Up: Sequences Tuples/Lists + +11.2.5.2 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 ‘seq[-n]’ as +the same as ‘seq[len(seq)-n]’. + +Using negative indices can be very convenient. For example ‘S[:-1]’ is +all of the string except for its last character, which is useful for +removing the trailing newline from a string. + + +File: python.info, Node: How do I iterate over a sequence in reverse order?, Next: How do you remove duplicates from a list?, Prev: What’s a negative index?, Up: Sequences Tuples/Lists + +11.2.5.3 How do I iterate over a sequence in reverse order? +........................................................... + +Use the *note reversed(): 462. built-in function: + + for x in reversed(sequence): + ... # do something with x ... + +This won’t touch your original sequence, but build a new copy with +reversed order to iterate over. + + +File: python.info, Node: How do you remove duplicates from a list?, Next: How do you remove multiple items from a list, Prev: How do I iterate over a sequence in reverse order?, Up: Sequences Tuples/Lists + +11.2.5.4 How do you remove duplicates from a list? +.................................................. + +See the Python Cookbook for a long discussion of many ways to do this: + + ‘https://code.activestate.com/recipes/52560/’ + +If you don’t mind reordering the list, sort it and then scan from the +end of the list, deleting duplicates as you go: + + 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] + +If all elements of the list may be used as set keys (i.e. they are all +*note hashable: 1e8.) this is often faster + + mylist = list(set(mylist)) + +This converts the list into a set, thereby removing duplicates, and then +back into a list. + + +File: python.info, Node: How do you remove multiple items from a list, Next: How do you make an array in Python?, Prev: How do you remove duplicates from a list?, Up: Sequences Tuples/Lists + +11.2.5.5 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.: + + mylist[:] = filter(keep_function, mylist) + mylist[:] = (x for x in mylist if keep_condition) + mylist[:] = [x for x in mylist if keep_condition] + +The list comprehension may be fastest. + + +File: python.info, Node: How do you make an array in Python?, Next: How do I create a multidimensional list?, Prev: How do you remove multiple items from a list, Up: Sequences Tuples/Lists + +11.2.5.6 How do you make an array in Python? +............................................ + +Use a list: + + ["this", 1, "is", "an", "array"] + +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 ‘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 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: + + lisp_list = ("like", ("this", ("example", None) ) ) + +If mutability is desired, you could use lists instead of tuples. Here +the analogue of lisp car is ‘lisp_list[0]’ and the analogue of cdr is +‘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. + + +File: python.info, Node: How do I create a multidimensional list?, Next: How do I apply a method to a sequence of objects?, Prev: How do you make an array in Python?, Up: Sequences Tuples/Lists + +11.2.5.7 How do I create a multidimensional list? +................................................. + +You probably tried to make a multidimensional array like this: + + >>> A = [[None] * 2] * 3 + +This looks correct if you print it: + + >>> A + [[None, None], [None, None], [None, None]] + +But when you assign a value, it shows up in multiple places: + + >>> A[0][0] = 5 + >>> A + [[5, None], [5, None], [5, None]] + +The reason is that replicating a list with ‘*’ doesn’t create copies, it +only creates references to the existing objects. The ‘*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: + + A = [None] * 3 + for i in range(3): + A[i] = [None] * 2 + +This generates a list containing 3 different lists of length two. You +can also use a list comprehension: + + w, h = 2, 3 + A = [[None] * w for i in range(h)] + +Or, you can use an extension that provides a matrix datatype; NumPy(1) +is the best known. + + ---------- Footnotes ---------- + + (1) http://www.numpy.org/ + + +File: python.info, Node: How do I apply a method to a sequence of objects?, Next: Why does a_tuple[i] += [‘item’] raise an exception when the addition works?, Prev: How do I create a multidimensional list?, Up: Sequences Tuples/Lists + +11.2.5.8 How do I apply a method to a sequence of objects? +.......................................................... + +Use a list comprehension: + + result = [obj.method() for obj in mylist] + + +File: python.info, Node: Why does a_tuple[i] += [‘item’] raise an exception when the addition works?, Next: I want to do a complicated sort can you do a Schwartzian Transform in Python?, Prev: How do I apply a method to a sequence of objects?, Up: Sequences Tuples/Lists + +11.2.5.9 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 ‘list’ and ‘+=’ as our exemplar. + +If you wrote: + + >>> a_tuple = (1, 2) + >>> a_tuple[0] += 1 + Traceback (most recent call last): + ... + TypeError: 'tuple' object does not support item assignment + +The reason for the exception should be immediately clear: ‘1’ is added +to the object ‘a_tuple[0]’ points to (‘1’), producing the result object, +‘2’, but when we attempt to assign the result of the computation, ‘2’, +to element ‘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: + + >>> result = a_tuple[0] + 1 + >>> a_tuple[0] = result + Traceback (most recent call last): + ... + TypeError: 'tuple' object does not support item assignment + +It is the assignment part of the operation that produces the error, +since a tuple is immutable. + +When you write something like: + + >>> a_tuple = (['foo'], 'bar') + >>> a_tuple[0] += ['item'] + Traceback (most recent call last): + ... + TypeError: 'tuple' object does not support item assignment + +The exception is a bit more surprising, and even more surprising is the +fact that even though there was an error, the append worked: + + >>> a_tuple[0] + ['foo', 'item'] + +To see why this happens, you need to know that (a) if an object +implements an ‘__iadd__’ magic method, it gets called when the ‘+=’ +augmented assignment is executed, and its return value is what gets used +in the assignment statement; and (b) for lists, ‘__iadd__’ is equivalent +to calling ‘extend’ on the list and returning the list. That’s why we +say that for lists, ‘+=’ is a “shorthand” for ‘list.extend’: + + >>> a_list = [] + >>> a_list += [1] + >>> a_list + [1] + +This is equivalent to: + + >>> result = a_list.__iadd__([1]) + >>> a_list = result + +The object pointed to by a_list has been mutated, and the pointer to the +mutated object is assigned back to ‘a_list’. The end result of the +assignment is a no-op, since it is a pointer to the same object that +‘a_list’ was previously pointing to, but the assignment still happens. + +Thus, in our tuple example what is happening is equivalent to: + + >>> result = a_tuple[0].__iadd__(['item']) + >>> a_tuple[0] = result + Traceback (most recent call last): + ... + TypeError: 'tuple' object does not support item assignment + +The ‘__iadd__’ succeeds, and thus the list is extended, but even though +‘result’ points to the same object that ‘a_tuple[0]’ already points to, +that final assignment still results in an error, because tuples are +immutable. + + +File: python.info, Node: I want to do a complicated sort can you do a Schwartzian Transform in Python?, Next: How can I sort one list by values from another list?, Prev: Why does a_tuple[i] += [‘item’] raise an exception when the addition works?, Up: Sequences Tuples/Lists + +11.2.5.10 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 ‘key’ argument for the *note +list.sort(): 834. method: + + Isorted = L[:] + Isorted.sort(key=lambda s: int(s[10:15])) + + +File: python.info, Node: How can I sort one list by values from another list?, Prev: I want to do a complicated sort can you do a Schwartzian Transform in Python?, Up: Sequences Tuples/Lists + +11.2.5.11 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. + + >>> 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'] + + +File: python.info, Node: Objects, Next: Modules<3>, Prev: Sequences Tuples/Lists, Up: Programming FAQ + +11.2.6 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?:: + + +File: python.info, Node: What is a class?, Next: What is a method?, Up: Objects + +11.2.6.1 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 ‘Mailbox’ class that provides +basic accessor methods for a mailbox, and subclasses such as +‘MboxMailbox’, ‘MaildirMailbox’, ‘OutlookMailbox’ that handle various +specific mailbox formats. + + +File: python.info, Node: What is a method?, Next: What is self?, Prev: What is a class?, Up: Objects + +11.2.6.2 What is a method? +.......................... + +A method is a function on some object ‘x’ that you normally call as +‘x.name(arguments...)’. Methods are defined as functions inside the +class definition: + + class C: + def meth(self, arg): + return arg * 2 + self.attribute + + +File: python.info, Node: What is self?, Next: How do I check if an object is an instance of a given class or of a subclass of it?, Prev: What is a method?, Up: Objects + +11.2.6.3 What is self? +...................... + +Self is merely a conventional name for the first argument of a method. +A method defined as ‘meth(self, a, b, c)’ should be called as ‘x.meth(a, +b, c)’ for some instance ‘x’ of the class in which the definition +occurs; the called method will think it is called as ‘meth(x, a, b, c)’. + +See also *note Why must ‘self’ be used explicitly in method definitions +and calls?: 49eb. + + +File: python.info, Node: How do I check if an object is an instance of a given class or of a subclass of it?, Next: What is delegation?, Prev: What is self?, Up: Objects + +11.2.6.4 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 ‘isinstance(obj, 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, e.g. ‘isinstance(obj, (class1, class2, +...))’, and can also check whether an object is one of Python’s built-in +types, e.g. ‘isinstance(obj, str)’ or ‘isinstance(obj, (int, float, +complex))’. + +Note that *note isinstance(): 3ab. also checks for virtual inheritance +from an *note abstract base class: e6a. So, the test will return ‘True’ +for a registered class even if hasn’t directly or indirectly inherited +from it. To test for “true inheritance”, scan the *note MRO: 2e48. of +the class: + + from collections.abc import Mapping + + class P: + pass + + class C(P): + pass + + Mapping.register(P) + + >>> c = C() + >>> isinstance(c, C) # direct + True + >>> isinstance(c, P) # indirect + True + >>> isinstance(c, Mapping) # virtual + True + + # Actual inheritance chain + >>> type(c).__mro__ + (, , ) + + # Test for "true inheritance" + >>> Mapping in type(c).__mro__ + False + +Note that most programs do not use *note isinstance(): 3ab. 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: + + def search(obj): + if isinstance(obj, Mailbox): + ... # code to search a mailbox + elif isinstance(obj, Document): + ... # code to search a document + elif ... + +A better approach is to define a ‘search()’ method on all the classes +and just call it: + + class Mailbox: + def search(self): + ... # code to search a mailbox + + class Document: + def search(self): + ... # code to search a document + + obj.search() + + +File: python.info, Node: What is delegation?, Next: How do I call a method defined in a base class from a derived class that extends it?, Prev: How do I check if an object is an instance of a given class or of a subclass of it?, Up: Objects + +11.2.6.5 What is delegation? +............................ + +Delegation is an object oriented technique (also called a design +pattern). Let’s say you have an object ‘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 +‘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: + + 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) + +Here the ‘UpperOut’ class redefines the ‘write()’ method to convert the +argument string to uppercase before calling the underlying +‘self._outfile.write()’ method. All other methods are delegated to the +underlying ‘self._outfile’ object. The delegation is accomplished via +the ‘__getattr__’ method; consult *note the language reference: 1916. +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 +‘__setattr__()’ method too, and it must do so carefully. The basic +implementation of ‘__setattr__()’ is roughly equivalent to the +following: + + class X: + ... + def __setattr__(self, name, value): + self.__dict__[name] = value + ... + +Most ‘__setattr__()’ implementations must modify ‘self.__dict__’ to +store local state for self without causing an infinite recursion. + + +File: python.info, Node: How do I call a method defined in a base class from a derived class that extends it?, Next: How can I organize my code to make it easier to change the base class?, Prev: What is delegation?, Up: Objects + +11.2.6.6 How do I call a method defined in a base class from a derived class that extends it? +............................................................................................. + +Use the built-in *note super(): 8b7. function: + + class Derived(Base): + def meth(self): + super().meth() # calls Base.meth + +In the example, *note super(): 8b7. will automatically determine the +instance from which it was called (the ‘self’ value), look up the *note +method resolution order: 1bc9. (MRO) with ‘type(self).__mro__’, and +return the next in line after ‘Derived’ in the MRO: ‘Base’. + + +File: python.info, Node: How can I organize my code to make it easier to change the base class?, Next: How do I create static class data and static class methods?, Prev: How do I call a method defined in a base class from a derived class that extends it?, Up: Objects + +11.2.6.7 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 +(e.g. depending on availability of resources) which base class to use. +Example: + + class Base: + ... + + BaseAlias = Base + + class Derived(BaseAlias): + ... + + +File: python.info, Node: How do I create static class data and static class methods?, Next: How can I overload constructors or methods in Python?, Prev: How can I organize my code to make it easier to change the base class?, Up: Objects + +11.2.6.8 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: + + 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 + +‘c.count’ also refers to ‘C.count’ for any ‘c’ such that ‘isinstance(c, +C)’ holds, unless overridden by ‘c’ itself or by some class on the +base-class search path from ‘c.__class__’ back to ‘C’. + +Caution: within a method of C, an assignment like ‘self.count = 42’ +creates a new and unrelated instance named “count” in ‘self’’s own dict. +Rebinding of a class-static data name must always specify the class +whether inside a method or not: + + C.count = 314 + +Static methods are possible: + + class C: + @staticmethod + def static(arg1, arg2, arg3): + # No 'self' parameter! + ... + +However, a far more straightforward way to get the effect of a static +method is via a simple module-level function: + + def getcount(): + return C.count + +If your code is structured so as to define one class (or tightly related +class hierarchy) per module, this supplies the desired encapsulation. + + +File: python.info, Node: How can I overload constructors or methods in Python?, Next: I try to use __spam and I get an error about _SomeClassName__spam, Prev: How do I create static class data and static class methods?, Up: Objects + +11.2.6.9 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 + + class C { + C() { cout << "No arguments\n"; } + C(int i) { cout << "Argument is " << i << "\n"; } + } + +In Python you have to write a single constructor that catches all cases +using default arguments. For example: + + class C: + def __init__(self, i=None): + if i is None: + print("No arguments") + else: + print("Argument is", i) + +This is not entirely equivalent, but close enough in practice. + +You could also try a variable-length argument list, e.g. + + def __init__(self, *args): + ... + +The same approach works for all method definitions. + + +File: python.info, Node: I try to use __spam and I get an error about _SomeClassName__spam, Next: My class defines __del__ but it is not called when I delete the object, Prev: How can I overload constructors or methods in Python?, Up: Objects + +11.2.6.10 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 ‘__spam’ (at least two leading underscores, at +most one trailing underscore) is textually replaced with +‘_classname__spam’, where ‘classname’ is the current class name with any +leading underscores stripped. + +This doesn’t guarantee privacy: an outside user can still deliberately +access the “_classname__spam” attribute, and private values are visible +in the object’s ‘__dict__’. Many Python programmers never bother to use +private variable names at all. + + +File: python.info, Node: My class defines __del__ but it is not called when I delete the object, Next: How do I get a list of all instances of a given class?, Prev: I try to use __spam and I get an error about _SomeClassName__spam, Up: Objects + +11.2.6.11 My class defines __del__ but it is not called when I delete the object. +................................................................................. + +There are several possible reasons for this. + +The del statement does not necessarily call ‘__del__()’ – it simply +decrements the object’s reference count, and if this reaches zero +‘__del__()’ is called. + +If your data structures contain circular links (e.g. 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 ‘__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 ‘__del__()’ methods are executed is +arbitrary. You can run *note gc.collect(): 687. 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 ‘close()’ method on objects to be called whenever you’re done +with them. The ‘close()’ method can then remove attributes that refer +to subobjects. Don’t call ‘__del__()’ directly – ‘__del__()’ should +call ‘close()’ and ‘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 *note weakref: +132. 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!). + +Finally, if your ‘__del__()’ method raises an exception, a warning +message is printed to *note sys.stderr: 581. + + +File: python.info, Node: How do I get a list of all instances of a given class?, Next: Why does the result of id appear to be not unique?, Prev: My class defines __del__ but it is not called when I delete the object, Up: Objects + +11.2.6.12 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. + + +File: python.info, Node: Why does the result of id appear to be not unique?, Next: When can I rely on identity tests with the is operator?, Prev: How do I get a list of all instances of a given class?, Up: Objects + +11.2.6.13 Why does the result of ‘id()’ appear to be not unique? +................................................................ + +The *note id(): 1086. 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: + + >>> id(1000) + 13901272 + >>> id(2000) + 13901272 + +The two ids belong to different integer objects that are created before, +and deleted immediately after execution of the ‘id()’ call. To be sure +that objects whose id you want to examine are still alive, create +another reference to the object: + + >>> a = 1000; b = 2000 + >>> id(a) + 13901272 + >>> id(b) + 13891296 + + +File: python.info, Node: When can I rely on identity tests with the is operator?, Next: How can a subclass control what data is stored in an immutable instance?, Prev: Why does the result of id appear to be not unique?, Up: Objects + +11.2.6.14 When can I rely on identity tests with the `is' operator? +................................................................... + +The ‘is’ operator tests for object identity. The test ‘a is b’ is +equivalent to ‘id(a) == id(b)’. + +The most important property of an identity test is that an object is +always identical to itself, ‘a is a’ always returns ‘True’. Identity +tests are usually faster than equality tests. And unlike equality +tests, identity tests are guaranteed to return a boolean ‘True’ or +‘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: + +1) Assignments create new names but do not change object identity. +After the assignment ‘new = old’, it is guaranteed that ‘new is old’. + +2) Putting an object in a container that stores object references does +not change object identity. After the list assignment ‘s[0] = x’, it is +guaranteed that ‘s[0] is x’. + +3) If an object is a singleton, it means that only one instance of that +object can exist. After the assignments ‘a = None’ and ‘b = None’, it +is guaranteed that ‘a is b’ because ‘None’ is a singleton. + +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 *note int: 1c7. and *note str: 1b3. which +aren’t guaranteed to be singletons: + + >>> a = 1000 + >>> b = 500 + >>> c = b + 500 + >>> a is c + False + + >>> a = 'Python' + >>> b = 'Py' + >>> c = b + 'thon' + >>> a is c + False + +Likewise, new instances of mutable containers are never identical: + + >>> a = [] + >>> b = [] + >>> a is b + False + +In the standard library code, you will see several common patterns for +correctly using identity tests: + +1) As recommended by PEP 8(1), an identity test is the preferred way to +check for ‘None’. This reads like plain English in code and avoids +confusion with other objects that may have boolean values that evaluate +to false. + +2) Detecting optional arguments can be tricky when ‘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 *note dict.pop(): 1c9a.: + + _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 + +3) Container implementations sometimes need to augment equality tests +with identity tests. This prevents the code from being confused by +objects such as ‘float('NaN')’ that are not equal to themselves. + +For example, here is the implementation of +‘collections.abc.Sequence.__contains__()’: + + def __contains__(self, value): + for v in self: + if v is value or v == value: + return True + return False + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0008/ + + +File: python.info, Node: How can a subclass control what data is stored in an immutable instance?, Next: How do I cache method calls?, Prev: When can I rely on identity tests with the is operator?, Up: Objects + +11.2.6.15 How can a subclass control what data is stored in an immutable instance? +.................................................................................. + +When subclassing an immutable type, override the ‘__new__()’ method +instead of the ‘__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: + + from datetime import date + + class FirstOfMonthDate(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 = ''.join([c for c in s if c.isalnum() or c == '-']) + return super().__new__(cls, s) + +The classes can be used like this: + + >>> FirstOfMonthDate(2012, 2, 14) + FirstOfMonthDate(2012, 2, 1) + >>> NamedInt('ten') + 10 + >>> NamedInt(20) + 20 + >>> TitleStr('Blog: Why Python Rocks') + 'blog-why-python-rocks' + + +File: python.info, Node: How do I cache method calls?, Prev: How can a subclass control what data is stored in an immutable instance?, Up: Objects + +11.2.6.16 How do I cache method calls? +...................................... + +The two principal tools for caching methods are *note +functools.cached_property(): 633. and *note functools.lru_cache(): 632. +The former stores results at the instance level and the latter at the +class level. + +The `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 `lru_cache' approach works with methods that have 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: + + 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. + +The above example assumes that the `station_id' never changes. If the +relevant instance attributes are mutable, the `cached_property' approach +can’t be made to work because it cannot detect changes to the +attributes. + +To make the `lru_cache' approach work when the `station_id' is mutable, +the class needs to define the `__eq__' and `__hash__' methods so that +the cache can detect relevant attribute updates: + + 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. + + +File: python.info, Node: Modules<3>, Prev: Objects, Up: Programming FAQ + +11.2.7 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 ; how do I get z?: __import__ ‘x y z’ returns ; how do I get z?. +* When I edit an imported module and reimport it, 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?. + + +File: python.info, Node: How do I create a pyc file?, Next: How do I find the current module name?, Up: Modules<3> + +11.2.7.1 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 ‘.pyc’ file +containing the compiled code should be created in a ‘__pycache__’ +subdirectory of the directory containing the ‘.py’ file. The ‘.pyc’ +file will have a filename that starts with the same name as the ‘.py’ +file, and ends with ‘.pyc’, with a middle component that depends on the +particular ‘python’ binary that created it. (See PEP 3147(1) for +details.) + +One reason that a ‘.pyc’ file may not be created is a permissions +problem with the directory containing the source file, meaning that the +‘__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 *note PYTHONDONTWRITEBYTECODE: 103b. 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, etc…) to create a +‘__pycache__’ subdirectory and write the compiled module to that +subdirectory. + +Running Python on a top level script is not considered an import and no +‘.pyc’ will be created. For example, if you have a top-level module +‘foo.py’ that imports another module ‘xyz.py’, when you run ‘foo’ (by +typing ‘python foo.py’ as a shell command), a ‘.pyc’ will be created for +‘xyz’ because ‘xyz’ is imported, but no ‘.pyc’ file will be created for +‘foo’ since ‘foo.py’ isn’t being imported. + +If you need to create a ‘.pyc’ file for ‘foo’ – that is, to create a +‘.pyc’ file for a module that is not imported – you can, using the *note +py_compile: d4. and *note compileall: 1f. modules. + +The *note py_compile: d4. module can manually compile any module. One +way is to use the ‘compile()’ function in that module interactively: + + >>> import py_compile + >>> py_compile.compile('foo.py') + +This will write the ‘.pyc’ to a ‘__pycache__’ subdirectory in the same +location as ‘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 *note compileall: 1f. module. You can do it from +the shell prompt by running ‘compileall.py’ and providing the path of a +directory containing Python files to compile: + + python -m compileall . + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + +File: python.info, Node: How do I find the current module name?, Next: How can I have modules that mutually import each other?, Prev: How do I create a pyc file?, Up: Modules<3> + +11.2.7.2 How do I find the current module name? +............................................... + +A module can find out its own module name by looking at the predefined +global variable ‘__name__’. If this has the value ‘'__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 ‘__name__’: + + def main(): + print('Running test...') + ... + + if __name__ == '__main__': + main() + + +File: python.info, Node: How can I have modules that mutually import each other?, Next: __import__ ‘x y z’ returns ; how do I get z?, Prev: How do I find the current module name?, Up: Modules<3> + +11.2.7.3 How can I have modules that mutually import each other? +................................................................ + +Suppose you have the following modules: + +‘foo.py’: + + from bar import bar_var + foo_var = 1 + +‘bar.py’: + + from foo import foo_var + bar_var = 2 + +The problem is that the interpreter will perform the following steps: + + * main imports ‘foo’ + + * Empty globals for ‘foo’ are created + + * ‘foo’ is compiled and starts executing + + * ‘foo’ imports ‘bar’ + + * Empty globals for ‘bar’ are created + + * ‘bar’ is compiled and starts executing + + * ‘bar’ imports ‘foo’ (which is a no-op since there already is a + module named ‘foo’) + + * The import mechanism tries to read ‘foo_var’ from ‘foo’ globals, to + set ‘bar.foo_var = foo.foo_var’ + +The last step fails, because Python isn’t done with interpreting ‘foo’ +yet and the global symbol dictionary for ‘foo’ is still empty. + +The same thing happens when you use ‘import foo’, and then try to access +‘foo.foo_var’ in global code. + +There are (at least) three possible workarounds for this problem. + +Guido van Rossum recommends avoiding all uses of ‘from 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 +‘.’. + +Jim Roskind suggests performing steps in the following order in each +module: + + * exports (globals, functions, and classes that don’t need imported + base classes) + + * ‘import’ statements + + * active code (including globals that are initialized from imported + values). + +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. + + +File: python.info, Node: __import__ ‘x y z’ returns ; how do I get z?, Next: When I edit an imported module and reimport it the changes don’t show up Why does this happen?, Prev: How can I have modules that mutually import each other?, Up: Modules<3> + +11.2.7.4 __import__(‘x.y.z’) returns ; how do I get z? +.................................................................. + +Consider using the convenience function *note import_module(): e4d. from +*note importlib: 97. instead: + + z = importlib.import_module('x.y.z') + + +File: python.info, Node: When I edit an imported module and reimport it the changes don’t show up Why does this happen?, Prev: __import__ ‘x y z’ returns ; how do I get z?, Up: Modules<3> + +11.2.7.5 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: + + import importlib + import modname + importlib.reload(modname) + +Warning: this technique is not 100% fool-proof. In particular, modules +containing statements like + + from modname import some_objects + +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: + + >>> import importlib + >>> import cls + >>> c = cls.C() # Create an instance of C + >>> importlib.reload(cls) + + >>> isinstance(c, cls.C) # isinstance is false?!? + False + +The nature of the problem is made clear if you print out the “identity” +of the class objects: + + >>> hex(id(c.__class__)) + '0x7352a0' + >>> hex(id(cls.C)) + '0x4198d0' + + +File: python.info, Node: Design and History FAQ, Next: Library and Extension FAQ, Prev: Programming FAQ, Up: Python Frequently Asked Questions + +11.3 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, 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?:: + + +File: python.info, Node: Why does Python use indentation for grouping of statements?, Next: Why am I getting strange results with simple arithmetic operations?, Up: Design and History FAQ + +11.3.1 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: + + if (x <= y) + x++; + y--; + z++; + +Only the ‘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 +‘y’ is being decremented even for ‘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. + + +File: python.info, Node: Why am I getting strange results with simple arithmetic operations?, Next: Why are floating-point calculations so inaccurate?, Prev: Why does Python use indentation for grouping of statements?, Up: Design and History FAQ + +11.3.2 Why am I getting strange results with simple arithmetic operations? +-------------------------------------------------------------------------- + +See the next question. + + +File: python.info, Node: Why are floating-point calculations so inaccurate?, Next: Why are Python strings immutable?, Prev: Why am I getting strange results with simple arithmetic operations?, Up: Design and History FAQ + +11.3.3 Why are floating-point calculations so inaccurate? +--------------------------------------------------------- + +Users are often surprised by results like this: + + >>> 1.2 - 1.0 + 0.19999999999999996 + +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 *note float: 3ca. type in CPython uses a C ‘double’ for storage. A +*note float: 3ca. 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: + + >>> x = 1.2 + +the value stored for ‘x’ is a (very good) approximation to the decimal +value ‘1.2’, but is not exactly equal to it. On a typical machine, the +actual stored value is: + + 1.0011001100110011001100110011001100110011001100110011 (binary) + +which is exactly: + + 1.1999999999999999555910790149937383830547332763671875 (decimal) + +The typical precision of 53 bits provides Python floats with 15–16 +decimal digits of accuracy. + +For a fuller explanation, please see the *note floating point +arithmetic: 1750. chapter in the Python tutorial. + + +File: python.info, Node: Why are Python strings immutable?, Next: Why must ‘self’ be used explicitly in method definitions and calls?, Prev: Why are floating-point calculations so inaccurate?, Up: Design and History FAQ + +11.3.4 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. + + +File: python.info, Node: Why must ‘self’ be used explicitly in method definitions and calls?, Next: Why can’t I use an assignment in an expression?, Prev: Why are Python strings immutable?, Up: Design and History FAQ + +11.3.5 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 ‘self.x’ or +‘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 ‘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 ‘::’ operator – in Python you +can write ‘baseclass.methodname(self, )’. This is +particularly useful for ‘__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 ‘self.var’ +solves this nicely. Similarly, for using instance variables, having to +write ‘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. + + +File: python.info, Node: Why can’t I use an assignment in an expression?, Next: Why does Python use methods for some functionality e g list index but functions for other e g len list ?, Prev: Why must ‘self’ be used explicitly in method definitions and calls?, Up: Design and History FAQ + +11.3.6 Why can’t I use an assignment in an expression? +------------------------------------------------------ + +Starting in Python 3.8, you can! + +Assignment expressions using the walrus operator ‘:=’ assign a variable +in an expression: + + while chunk := fp.read(200): + print(chunk) + +See PEP 572(1) for more information. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0572/ + + +File: python.info, Node: Why does Python use methods for some functionality e g list index but functions for other e g len list ?, Next: Why is join a string method instead of a list or tuple method?, Prev: Why can’t I use an assignment in an expression?, Up: Design and History FAQ + +11.3.7 Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))? +----------------------------------------------------------------------------------------------------------------------- + +As Guido said: + + (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. + +— ‘https://mail.python.org/pipermail/python-3000/2006-November/004643.html’ + + +File: python.info, Node: Why is join a string method instead of a list or tuple method?, Next: How fast are exceptions?, Prev: Why does Python use methods for some functionality e g list index but functions for other e g len list ?, Up: Design and History FAQ + +11.3.8 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: + + ", ".join(['1', '2', '4', '8', '16']) + +which gives the result: + + "1, 2, 4, 8, 16" + +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 *note split(): b37. as a string method, since in that case it is +easy to see that + + "1, 2, 4, 8, 16".split(", ") + +is an instruction to a string literal to return the substrings delimited +by the given separator (or, by default, arbitrary runs of white space). + +*note join(): 1bf4. 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. + + +File: python.info, Node: How fast are exceptions?, Next: Why isn’t there a switch or case statement in Python?, Prev: Why is join a string method instead of a list or tuple method?, Up: Design and History FAQ + +11.3.9 How fast are exceptions? +------------------------------- + +A try/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: + + try: + value = mydict[key] + except KeyError: + mydict[key] = getvalue(key) + value = mydict[key] + +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: + + if key in mydict: + value = mydict[key] + else: + value = mydict[key] = getvalue(key) + +For this specific case, you could also use ‘value = dict.setdefault(key, +getvalue(key))’, but only if the ‘getvalue()’ call is cheap enough +because it is evaluated in all cases. + + +File: python.info, Node: Why isn’t there a switch or case statement in Python?, Next: Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?, Prev: How fast are exceptions?, Up: Design and History FAQ + +11.3.10 Why isn’t there a switch or case statement in Python? +------------------------------------------------------------- + +You can do this easily enough with a sequence of ‘if... elif... elif... +else’. For literal values, or constants within a namespace, you can +also use a ‘match ... case’ statement. + +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: + + functions = {'a': function_1, + 'b': function_2, + 'c': self.method_1} + + func = functions[value] + func() + +For calling methods on objects, you can simplify yet further by using +the *note getattr(): 837. built-in to retrieve methods with a particular +name: + + class MyVisitor: + def visit_a(self): + ... + + def dispatch(self, value): + method_name = 'visit_' + str(value) + method = getattr(self, method_name) + method() + +It’s suggested that you use a prefix for the method names, such as +‘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. + + +File: python.info, Node: Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?, Next: Why can’t lambda expressions contain statements?, Prev: Why isn’t there a switch or case statement in Python?, Up: Design and History FAQ + +11.3.11 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(1), which has a +completely redesigned interpreter loop that avoids the C stack. + + ---------- Footnotes ---------- + + (1) https://github.com/stackless-dev/stackless/wiki + + +File: python.info, Node: Why can’t lambda expressions contain statements?, Next: Can Python be compiled to machine code C or some other language?, Prev: Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?, Up: Design and History FAQ + +11.3.12 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! + + +File: python.info, Node: Can Python be compiled to machine code C or some other language?, Next: How does Python manage memory?, Prev: Why can’t lambda expressions contain statements?, Up: Design and History FAQ + +11.3.13 Can Python be compiled to machine code, C or some other language? +------------------------------------------------------------------------- + +Cython(1) compiles a modified version of Python with optional +annotations into C extensions. Nuitka(2) is an up-and-coming compiler +of Python into C++ code, aiming to support the full Python language. + + ---------- Footnotes ---------- + + (1) https://cython.org/ + + (2) https://www.nuitka.net/ + + +File: python.info, Node: How does Python manage memory?, Next: Why doesn’t CPython use a more traditional garbage collection scheme?, Prev: Can Python be compiled to machine code C or some other language?, Up: Design and History FAQ + +11.3.14 How does Python manage memory? +-------------------------------------- + +The details of Python memory management depend on the implementation. +The standard implementation of Python, *note CPython: 2b4, 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 *note gc: 80. module provides functions to perform a +garbage collection, obtain debugging statistics, and tune the +collector’s parameters. + +Other implementations (such as Jython(1) or PyPy(2)), 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: + + for file in very_long_list_of_files: + f = open(file) + c = f.read(1) + +Indeed, using CPython’s reference counting and destructor scheme, each +new assignment to `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 *note with: 19e. +statement; this will work regardless of memory management scheme: + + for file in very_long_list_of_files: + with open(file) as f: + c = f.read(1) + + ---------- Footnotes ---------- + + (1) https://www.jython.org + + (2) https://www.pypy.org + + +File: python.info, Node: Why doesn’t CPython use a more traditional garbage collection scheme?, Next: Why isn’t all memory freed when CPython exits?, Prev: How does Python manage memory?, Up: Design and History FAQ + +11.3.15 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 malloc() and free() with versions provided by the GC library, +an application embedding Python may want to have its `own' substitute +for malloc() and free(), and may not want Python’s. Right now, CPython +works with anything that implements malloc() and free() properly. + + +File: python.info, Node: Why isn’t all memory freed when CPython exits?, Next: Why are there separate tuple and list data types?, Prev: Why doesn’t CPython use a more traditional garbage collection scheme?, Up: Design and History FAQ + +11.3.16 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 *note atexit: b. module to run a function that will force those +deletions. + + +File: python.info, Node: Why are there separate tuple and list data types?, Next: How are lists implemented in CPython?, Prev: Why isn’t all memory freed when CPython exits?, Up: Design and History FAQ + +11.3.17 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 records or C 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, ‘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. + + +File: python.info, Node: How are lists implemented in CPython?, Next: How are dictionaries implemented in CPython?, Prev: Why are there separate tuple and list data types?, Up: Design and History FAQ + +11.3.18 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 ‘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. + + +File: python.info, Node: How are dictionaries implemented in CPython?, Next: Why must dictionary keys be immutable?, Prev: How are lists implemented in CPython?, Up: Design and History FAQ + +11.3.19 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 *note hash(): 1bc. built-in function. The hash +code varies widely depending on the key and a per-process seed; for +example, “Python” could hash to -539294296 while “python”, a string that +differs by a single bit, could hash to 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. + + +File: python.info, Node: Why must dictionary keys be immutable?, Next: Why doesn’t list sort return the sorted list?, Prev: How are dictionaries implemented in CPython?, Up: Design and History FAQ + +11.3.20 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 ‘tuple(L)’ creates a tuple with the same +entries as the list ‘L’. Tuples are immutable and can therefore be used +as dictionary keys. + +Some unacceptable solutions that have been proposed: + + - 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.: + + mydict = {[1, 2]: '12'} + print(mydict[[1, 2]]) + + would raise a *note KeyError: 6f5. exception because the id of the + ‘[1, 2]’ used in the second line differs from that in the first + line. In other words, dictionary keys should be compared using + ‘==’, not using *note is: 468. + + - 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. + + - 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 ‘d.keys()’ is + usable as a key of the dictionary. + + - 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. + +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 ‘__eq__()’ and a ‘__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). + + 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 + +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 ‘o1 == o2’ (ie +‘o1.__eq__(o2) is True’) then ‘hash(o1) == hash(o2)’ (ie, ‘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 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. + + +File: python.info, Node: Why doesn’t list sort return the sorted list?, Next: How do you specify and enforce an interface spec in Python?, Prev: Why must dictionary keys be immutable?, Up: Design and History FAQ + +11.3.21 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, *note list.sort(): 834. 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 *note sorted(): 833. +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: + + for key in sorted(mydict): + ... # do whatever with mydict[key]... + + +File: python.info, Node: How do you specify and enforce an interface spec in Python?, Next: Why is there no goto?, Prev: Why doesn’t list sort return the sorted list?, Up: Design and History FAQ + +11.3.22 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 *note abc: 3. module that lets you define Abstract +Base Classes (ABCs). You can then use *note isinstance(): 3ab. and +*note issubclass(): 3ac. to check whether an instance or a class +implements a particular ABC. The *note collections.abc: 1d. module +defines a set of useful ABCs such as *note Iterable: 1ca5, *note +Container: 1ca7, and *note MutableMapping: d58. + +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 *note doctest: 63. and *note unittest: 125. 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 ‘append()’ method is +expected to add new elements to the end of some internal list; an +interface specification cannot test that your ‘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. + + +File: python.info, Node: Why is there no goto?, Next: Why can’t raw strings r-strings end with a backslash?, Prev: How do you specify and enforce an interface spec in Python?, Up: Design and History FAQ + +11.3.23 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 ‘if’ statements and ‘or’, ‘and’, and ‘if-else’ +expressions) and loop (with ‘while’ and ‘for’ statements, possibly +containing ‘continue’ and ‘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 “go” or “goto” constructs of C, +Fortran, and other languages. For example: + + class label(Exception): pass # declare a label + + try: + ... + if condition: raise label() # goto label + ... + except label: # where to goto + pass + ... + +This doesn’t allow you to jump into the middle of a loop, but that’s +usually considered an abuse of goto anyway. Use sparingly. + + +File: python.info, Node: Why can’t raw strings r-strings end with a backslash?, Next: Why doesn’t Python have a “with” statement for attribute assignments?, Prev: Why is there no goto?, Up: Design and History FAQ + +11.3.24 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: + + f = open("/mydir/file.txt") # works fine! + +If you’re trying to build a pathname for a DOS command, try e.g. one of + + dir = r"\this\is\my\dos\dir" "\\" + dir = r"\this\is\my\dos\dir\ "[:-1] + dir = "\\this\\is\\my\\dos\\dir\\" + + +File: python.info, Node: Why doesn’t Python have a “with” statement for attribute assignments?, Next: Why don’t generators support the with statement?, Prev: Why can’t raw strings r-strings end with a backslash?, Up: Design and History FAQ + +11.3.25 Why doesn’t Python have a “with” statement for attribute assignments? +----------------------------------------------------------------------------- + +Python has a ‘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: + + with obj: + a = 1 # equivalent to obj.a = 1 + total = total + 1 # obj.total = obj.total + 1 + +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: + + def foo(a): + with a: + print(x) + +The snippet assumes that “a” must have a member attribute called “x”. +However, there is nothing in Python that tells the interpreter this. +What should happen if “a” is, let us say, an integer? If there is a +global variable named “x”, will it be used inside the with block? As +you see, the dynamic nature of Python makes such choices much harder. + +The primary benefit of “with” and similar language features (reduction +of code volume) can, however, easily be achieved in Python by +assignment. Instead of: + + function(args).mydict[index][index].a = 21 + function(args).mydict[index][index].b = 42 + function(args).mydict[index][index].c = 63 + +write this: + + ref = function(args).mydict[index][index] + ref.a = 21 + ref.b = 42 + ref.c = 63 + +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. + + +File: python.info, Node: Why don’t generators support the with statement?, Next: Why are colons required for the if/while/def/class statements?, Prev: Why doesn’t Python have a “with” statement for attribute assignments?, Up: Design and History FAQ + +11.3.26 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 “contextlib.closing(generator)” in the ‘with’ statement. + + +File: python.info, Node: Why are colons required for the if/while/def/class statements?, Next: Why does Python allow commas at the end of lists and tuples?, Prev: Why don’t generators support the with statement?, Up: Design and History FAQ + +11.3.27 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: + + if a == b + print(a) + +versus + + if a == b: + print(a) + +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. + + +File: python.info, Node: Why does Python allow commas at the end of lists and tuples?, Prev: Why are colons required for the if/while/def/class statements?, Up: Design and History FAQ + +11.3.28 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: + + [1, 2, 3,] + ('a', 'b', 'c',) + d = { + "A": [1, 5], + "B": [6, 7], # last trailing comma is optional but good style + } + +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: + + x = [ + "fee", + "fie" + "foo", + "fum" + ] + +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. + + +File: python.info, Node: Library and Extension FAQ, Next: Extending/Embedding FAQ, Prev: Design and History FAQ, Up: Python Frequently Asked Questions + +11.4 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:: + + +File: python.info, Node: General Library Questions, Next: Common tasks, Up: Library and Extension FAQ + +11.4.1 General Library Questions +-------------------------------- + +* Menu: + +* How do I find a module or application to perform task X?:: +* Where is the math.py (socket.py, regex.py, 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?:: + + +File: python.info, Node: How do I find a module or application to perform task X?, Next: Where is the math py socket py regex py etc source file?, Up: General Library Questions + +11.4.1.1 How do I find a module or application to perform task X? +................................................................. + +Check *note the Library Reference: 1623. 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(1) or try +Google(2) or another web search engine. Searching for “Python” plus a +keyword or two for your topic of interest will usually find something +helpful. + + ---------- Footnotes ---------- + + (1) https://pypi.org + + (2) https://www.google.com + + +File: python.info, Node: Where is the math py socket py regex py etc source file?, Next: How do I make a Python script executable on Unix?, Prev: How do I find a module or application to perform task X?, Up: General Library Questions + +11.4.1.2 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 ‘mathmodule.c’, somewhere in a C source directory (not on +the Python Path). + +There are (at least) three kinds of modules in Python: + + 1. modules written in Python (.py); + + 2. modules written in C and dynamically loaded (.dll, .pyd, .so, .sl, + etc); + + 3. modules written in C and linked with the interpreter; to get a list + of these, type: + + import sys + print(sys.builtin_module_names) + + +File: python.info, Node: How do I make a Python script executable on Unix?, Next: Is there a curses/termcap package for Python?, Prev: Where is the math py socket py regex py etc source file?, Up: General Library Questions + +11.4.1.3 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 ‘#!’ followed by the path of the Python +interpreter. + +The first is done by executing ‘chmod +x scriptfile’ or perhaps ‘chmod +755 scriptfile’. + +The second can be done in a number of ways. The most straightforward +way is to write + + #!/usr/local/bin/python + +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 ‘env’ program. Almost all Unix +variants support the following, assuming the Python interpreter is in a +directory on the user’s ‘PATH’: + + #!/usr/bin/env python + +`Don’t' do this for CGI scripts. The ‘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 ‘/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): + + #! /bin/sh + """:" + exec python $0 ${1+"$@"} + """ + +The minor disadvantage is that this defines the script’s __doc__ string. +However, you can fix that by adding + + __doc__ = """...Whatever...""" + + +File: python.info, Node: Is there a curses/termcap package for Python?, Next: Is there an equivalent to C’s onexit in Python?, Prev: How do I make a Python script executable on Unix?, Up: General Library Questions + +11.4.1.4 Is there a curses/termcap package for Python? +...................................................... + +For Unix variants: The standard Python source distribution comes with a +curses module in the Modules(1) 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 *note curses: 2a. 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. + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Modules + + +File: python.info, Node: Is there an equivalent to C’s onexit in Python?, Next: Why don’t my signal handlers work?, Prev: Is there a curses/termcap package for Python?, Up: General Library Questions + +11.4.1.5 Is there an equivalent to C’s onexit() in Python? +.......................................................... + +The *note atexit: b. module provides a register function that is similar +to C’s ‘onexit()’. + + +File: python.info, Node: Why don’t my signal handlers work?, Prev: Is there an equivalent to C’s onexit in Python?, Up: General Library Questions + +11.4.1.6 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 + + handler(signum, frame) + +so it should be declared with two parameters: + + def handler(signum, frame): + ... + + +File: python.info, Node: Common tasks, Next: Threads, Prev: General Library Questions, Up: Library and Extension FAQ + +11.4.2 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?:: + + +File: python.info, Node: How do I test a Python program or component?, Next: How do I create documentation from doc strings?, Up: Common tasks + +11.4.2.1 How do I test a Python program or component? +..................................................... + +Python comes with two testing frameworks. The *note doctest: 63. module +finds examples in the docstrings for a module and runs them, comparing +the output with the expected output given in the docstring. + +The *note unittest: 125. 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 + + if __name__ == "__main__": + main_logic() + +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. + + if __name__ == "__main__": + self_test() + +Even programs that interact with complex external interfaces may be +tested when the external interfaces are unavailable by using “fake” +interfaces implemented in Python. + + +File: python.info, Node: How do I create documentation from doc strings?, Next: How do I get a single keypress at a time?, Prev: How do I test a Python program or component?, Up: Common tasks + +11.4.2.2 How do I create documentation from doc strings? +........................................................ + +The *note pydoc: d6. module can create HTML from the doc strings in your +Python source code. An alternative for creating API documentation +purely from docstrings is epydoc(1). Sphinx(2) can also include +docstring content. + + ---------- Footnotes ---------- + + (1) https://epydoc.sourceforge.net/ + + (2) https://www.sphinx-doc.org + + +File: python.info, Node: How do I get a single keypress at a time?, Prev: How do I create documentation from doc strings?, Up: Common tasks + +11.4.2.3 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. + + +File: python.info, Node: Threads, Next: Input and Output<2>, Prev: Common tasks, Up: Library and Extension FAQ + +11.4.3 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?:: + + +File: python.info, Node: How do I program using threads?, Next: None of my threads seem to run why?, Up: Threads + +11.4.3.1 How do I program using threads? +........................................ + +Be sure to use the *note threading: 10b. module and not the *note +_thread: 2. module. The *note threading: 10b. module builds convenient +abstractions on top of the low-level primitives provided by the *note +_thread: 2. module. + + +File: python.info, Node: None of my threads seem to run why?, Next: How do I parcel out work among a bunch of worker threads?, Prev: How do I program using threads?, Up: Threads + +11.4.3.2 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: + + 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) # <---------------------------! + +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: + + 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) + +Instead of trying to guess a good delay value for *note time.sleep(): +266, it’s better to use some kind of semaphore mechanism. One idea is +to use the *note queue: d7. 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. + + +File: python.info, Node: How do I parcel out work among a bunch of worker threads?, Next: What kinds of global value mutation are thread-safe?, Prev: None of my threads seem to run why?, Up: Threads + +11.4.3.3 How do I parcel out work among a bunch of worker threads? +.................................................................. + +The easiest way is to use the *note concurrent.futures: 20. module, +especially the *note ThreadPoolExecutor: 311. class. + +Or, if you want fine control over the dispatching algorithm, you can +write your own logic manually. Use the *note queue: d7. module to +create a queue containing a list of jobs. The *note Queue: 101f. class +maintains a list of objects and has a ‘.put(obj)’ method that adds items +to the queue and a ‘.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: + + 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) + +When run, this will produce the following output: + + Running worker + Running worker + Running worker + Running worker + Running worker + Main thread sleeping + Worker running with argument 0 + Worker running with argument 1 + Worker running with argument 2 + Worker running with argument 3 + Worker running with argument 4 + Worker running with argument 5 + ... + +Consult the module’s documentation for more details; the *note Queue: +101f. class provides a featureful interface. + + +File: python.info, Node: What kinds of global value mutation are thread-safe?, Next: Can’t we get rid of the Global Interpreter Lock?, Prev: How do I parcel out work among a bunch of worker threads?, Up: Threads + +11.4.3.4 What kinds of global value mutation are thread-safe? +............................................................. + +A *note global interpreter lock: 8d8. (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 *note +sys.setswitchinterval(): 599. 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): + + 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() + +These aren’t: + + i = i+1 + L.append(L[-1]) + L[i] = L[j] + D[x] = D[x] + 1 + +Operations that replace other objects may invoke those other objects’ +‘__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! + + +File: python.info, Node: Can’t we get rid of the Global Interpreter Lock?, Prev: What kinds of global value mutation are thread-safe?, Up: Threads + +11.4.3.5 Can’t we get rid of the Global Interpreter Lock? +......................................................... + +The *note global interpreter lock: 8d8. (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. + +Back 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 recently did +a similar experiment in his python-safethread(1) project. +Unfortunately, both 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. + +This 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 *note +ProcessPoolExecutor: 52e. class in the new *note concurrent.futures: 20. +module provides an easy way of doing so; the *note multiprocessing: b5. +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 *note +zlib: 14f. and *note hashlib: 88. already do this. + +It has been suggested that the GIL should be a per-interpreter-state +lock rather than truly global; interpreters then wouldn’t be able to +share objects. Unfortunately, this isn’t likely to happen either. It +would be a tremendous amount of work, because many object +implementations currently have global state. For example, small +integers and short strings are cached; these caches would have to be +moved to the interpreter state. Other object types have their own free +list; these free lists would have to be moved to the interpreter state. +And so on. + +And I doubt that it can even be done in finite time, because the same +problem exists for 3rd party extensions. It is likely that 3rd party +extensions are being written at a faster rate than you can convert them +to store all their global state in the interpreter state. + +And finally, once you have multiple interpreters not sharing any state, +what have you gained over running each interpreter in a separate +process? + + ---------- Footnotes ---------- + + (1) https://code.google.com/archive/p/python-safethread + + +File: python.info, Node: Input and Output<2>, Next: Network/Internet Programming, Prev: Threads, Up: Library and Extension FAQ + +11.4.4 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, stderr) really close it?: Why doesn’t closing sys stdout stdin stderr really close it?. + + +File: python.info, Node: How do I delete a file? And other file questions…, Next: How do I copy a file?, Up: Input and Output<2> + +11.4.4.1 How do I delete a file? (And other file questions…) +............................................................ + +Use ‘os.remove(filename)’ or ‘os.unlink(filename)’; for documentation, +see the *note os: c2. module. The two functions are identical; *note +unlink(): da1. is simply the name of the Unix system call for this +function. + +To remove a directory, use *note os.rmdir(): d9f.; use *note os.mkdir(): +d9b. to create one. ‘os.makedirs(path)’ will create any intermediate +directories in ‘path’ that don’t exist. ‘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 *note +shutil.rmtree(): 23f. + +To rename a file, use ‘os.rename(old_path, new_path)’. + +To truncate a file, open it using ‘f = open(filename, "rb+")’, and use +‘f.truncate(offset)’; offset defaults to the current seek position. +There’s also ‘os.ftruncate(fd, offset)’ for files opened with *note +os.open(): a10, where `fd' is the file descriptor (a small integer). + +The *note shutil: e6. module also contains a number of functions to work +on files including *note copyfile(): 6a9, *note copytree(): 675, and +*note rmtree(): 23f. + + +File: python.info, Node: How do I copy a file?, Next: How do I read or write binary data?, Prev: How do I delete a file? And other file questions…, Up: Input and Output<2> + +11.4.4.2 How do I copy a file? +.............................. + +The *note shutil: e6. module contains a *note copyfile(): 6a9. function. +Note that on Windows NTFS volumes, it does not copy alternate data +streams(1) nor resource forks(2) on macOS HFS+ volumes, though both are +now rarely used. It also doesn’t copy file permissions and metadata, +though using *note shutil.copy2(): 6ab. instead will preserve most +(though not all) of it. + + ---------- Footnotes ---------- + + (1) https://en.wikipedia.org/wiki/NTFS#Alternate_data_stream_(ADS) + + (2) https://en.wikipedia.org/wiki/Resource_fork + + +File: python.info, Node: How do I read or write binary data?, Next: I can’t seem to use os read on a pipe created with os popen ; why?, Prev: How do I copy a file?, Up: Input and Output<2> + +11.4.4.3 How do I read (or write) binary data? +.............................................. + +To read or write complex binary data formats, it’s best to use the *note +struct: f5. 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: + + import struct + + with open(filename, "rb") as f: + s = f.read(8) + x, y, z = struct.unpack(">hhl", s) + +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 *note array: 6. module. + + Note: To read and write binary data, it is mandatory to open the + file in binary mode (here, passing ‘"rb"’ to *note open(): 30b.). + If you use ‘"r"’ instead (the default), the file will be open in + text mode and ‘f.read()’ will return *note str: 1b3. objects rather + than *note bytes: 1b4. objects. + + +File: python.info, Node: I can’t seem to use os read on a pipe created with os popen ; why?, Next: How do I access the serial RS232 port?, Prev: How do I read or write binary data?, Up: Input and Output<2> + +11.4.4.4 I can’t seem to use os.read() on a pipe created with os.popen(); why? +.............................................................................. + +*note os.read(): a13. is a low-level function which takes a file +descriptor, a small integer representing the opened file. *note +os.popen(): 6d9. creates a high-level file object, the same type +returned by the built-in *note open(): 30b. function. Thus, to read `n' +bytes from a pipe `p' created with *note os.popen(): 6d9, you need to +use ‘p.read(n)’. + + +File: python.info, Node: How do I access the serial RS232 port?, Next: Why doesn’t closing sys stdout stdin stderr really close it?, Prev: I can’t seem to use os read on a pipe created with os popen ; why?, Up: Input and Output<2> + +11.4.4.5 How do I access the serial (RS232) port? +................................................. + +For Win32, OSX, Linux, BSD, Jython, IronPython: + + ‘https://pypi.org/project/pyserial/’ + +For Unix, see a Usenet post by Mitch Chapman: + + ‘https://groups.google.com/groups?selm=34A04430.CF9@ohioee.com’ + + +File: python.info, Node: Why doesn’t closing sys stdout stdin stderr really close it?, Prev: How do I access the serial RS232 port?, Up: Input and Output<2> + +11.4.4.6 Why doesn’t closing sys.stdout (stdin, stderr) really close it? +........................................................................ + +Python *note file objects: e76. 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 *note +open(): 30b. function, ‘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 ‘f’’s +destructor, when ‘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 ‘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 *note +os.close(): 7d3.: + + os.close(stdin.fileno()) + os.close(stdout.fileno()) + os.close(stderr.fileno()) + +Or you can use the numeric constants 0, 1 and 2, respectively. + + +File: python.info, Node: Network/Internet Programming, Next: Databases, Prev: Input and Output<2>, Up: Library and Extension FAQ + +11.4.5 Network/Internet Programming +----------------------------------- + +* Menu: + +* What WWW tools are there for Python?:: +* How can I mimic CGI form submission (METHOD=POST)?: How can I mimic CGI form submission METHOD=POST ?. +* 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?. + + +File: python.info, Node: What WWW tools are there for Python?, Next: How can I mimic CGI form submission METHOD=POST ?, Up: Network/Internet Programming + +11.4.5.1 What WWW tools are there for Python? +............................................. + +See the chapters titled *note Internet Protocols and Support: 3196. and +*note Internet Data Handling: 2d9c. in the Library Reference Manual. +Python has many modules that will help you build server-side and +client-side web systems. + +A summary of available frameworks is maintained by Paul Boddie at +‘https://wiki.python.org/moin/WebProgramming’. + +Cameron Laird maintains a useful set of pages about Python web +technologies at +‘https://web.archive.org/web/20210224183619/http://phaseit.net/claird/comp.lang.python/web_python’. + + +File: python.info, Node: How can I mimic CGI form submission METHOD=POST ?, Next: What module should I use to help with generating HTML?, Prev: What WWW tools are there for Python?, Up: Network/Internet Programming + +11.4.5.2 How can I mimic CGI form submission (METHOD=POST)? +........................................................... + +I would like to retrieve web pages that are the result of POSTing a +form. Is there existing code that would let me do this easily? + +Yes. Here’s a simple example that uses *note urllib.request: 12a.: + + #!/usr/local/bin/python + + import urllib.request + + # build the query string + qs = "First=Josephine&MI=Q&Last=Public" + + # connect and send the server a path + req = urllib.request.urlopen('http://www.some-server.out-there' + '/cgi-bin/some-cgi-script', data=qs) + with req: + msg, hdrs = req.read(), req.info() + +Note that in general for percent-encoded POST operations, query strings +must be quoted using *note urllib.parse.urlencode(): b21. For example, +to send ‘name=Guy Steele, Jr.’: + + >>> import urllib.parse + >>> urllib.parse.urlencode({'name': 'Guy Steele, Jr.'}) + 'name=Guy+Steele%2C+Jr.' + +See also +........ + +*note HOWTO Fetch Internet Resources Using The urllib Package: 3263. for +extensive examples. + + +File: python.info, Node: What module should I use to help with generating HTML?, Next: How do I send mail from a Python script?, Prev: How can I mimic CGI form submission METHOD=POST ?, Up: Network/Internet Programming + +11.4.5.3 What module should I use to help with generating HTML? +............................................................... + +You can find a collection of useful links on the Web Programming wiki +page(1). + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/WebProgramming + + +File: python.info, Node: How do I send mail from a Python script?, Next: How do I avoid blocking in the connect method of a socket?, Prev: What module should I use to help with generating HTML?, Up: Network/Internet Programming + +11.4.5.4 How do I send mail from a Python script? +................................................. + +Use the standard library module *note smtplib: ea. + +Here’s a very simple interactive mail sender that uses it. This method +will work on any host that supports an SMTP listener. + + import sys, smtplib + + fromaddr = input("From: ") + toaddrs = input("To: ").split(',') + print("Enter message, end with ^D:") + msg = '' + 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() + +A Unix-only alternative uses sendmail. The location of the sendmail +program varies between systems; sometimes it is ‘/usr/lib/sendmail’, +sometimes ‘/usr/sbin/sendmail’. The sendmail manual page will help you +out. Here’s some sample code: + + 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) + + +File: python.info, Node: How do I avoid blocking in the connect method of a socket?, Prev: How do I send mail from a Python script?, Up: Network/Internet Programming + +11.4.5.5 How do I avoid blocking in the connect() method of a socket? +..................................................................... + +The *note select: e2. 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 ‘socket.connect()’, you will +either connect immediately (unlikely) or get an exception that contains +the error number as ‘.errno’. ‘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 ‘socket.connect_ex()’ method to avoid creating an +exception. It will just return the errno value. To poll, you can call +‘socket.connect_ex()’ again later – ‘0’ or ‘errno.EISCONN’ indicate that +you’re connected – or you can pass this socket to *note select.select(): +a1e. to check if it’s writable. + + Note: The *note asyncio: 9. 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(1) library is a popular and feature-rich alternative. + + ---------- Footnotes ---------- + + (1) https://twistedmatrix.com/trac/ + + +File: python.info, Node: Databases, Next: Mathematics and Numerics, Prev: Network/Internet Programming, Up: Library and Extension FAQ + +11.4.6 Databases +---------------- + +* Menu: + +* Are there any interfaces to database packages in Python?:: +* How do you implement persistent objects in Python?:: + + +File: python.info, Node: Are there any interfaces to database packages in Python?, Next: How do you implement persistent objects in Python?, Up: Databases + +11.4.6.1 Are there any interfaces to database packages in Python? +................................................................. + +Yes. + +Interfaces to disk-based hashes such as *note DBM: 33. and *note GDBM: +32. are also included with standard Python. There is also the *note +sqlite3: ef. module, which provides a lightweight disk-based relational +database. + +Support for most relational databases is available. See the +DatabaseProgramming wiki page(1) for details. + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/DatabaseProgramming + + +File: python.info, Node: How do you implement persistent objects in Python?, Prev: Are there any interfaces to database packages in Python?, Up: Databases + +11.4.6.2 How do you implement persistent objects in Python? +........................................................... + +The *note pickle: c7. library module solves this in a very general way +(though you still can’t store things like open files, sockets or +windows), and the *note shelve: e4. library module uses pickle and +(g)dbm to create persistent mappings containing arbitrary Python +objects. + + +File: python.info, Node: Mathematics and Numerics, Prev: Databases, Up: Library and Extension FAQ + +11.4.7 Mathematics and Numerics +------------------------------- + +* Menu: + +* How do I generate random numbers in Python?:: + + +File: python.info, Node: How do I generate random numbers in Python?, Up: Mathematics and Numerics + +11.4.7.1 How do I generate random numbers in Python? +.................................................... + +The standard module *note random: d9. implements a random number +generator. Usage is simple: + + import random + random.random() + +This returns a random floating point number in the range [0, 1). + +There are also many other specialized generators in this module, such +as: + + * ‘randrange(a, b)’ chooses an integer in the range [a, b). + + * ‘uniform(a, b)’ chooses a floating point number in the range [a, + b). + + * ‘normalvariate(mean, sdev)’ samples the normal (Gaussian) + distribution. + +Some higher-level functions operate on sequences directly, such as: + + * ‘choice(S)’ chooses a random element from a given sequence. + + * ‘shuffle(L)’ shuffles a list in-place, i.e. permutes it randomly. + +There’s also a ‘Random’ class you can instantiate to create independent +multiple random number generators. + + +File: python.info, Node: Extending/Embedding FAQ, Next: Python on Windows FAQ, Prev: Library and Extension FAQ, Up: Python Frequently Asked Questions + +11.5 Extending/Embedding FAQ +============================ + +* 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, 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 ?. + + +File: python.info, Node: Can I create my own functions in C?, Next: Can I create my own functions in C++?, Up: Extending/Embedding FAQ + +11.5.1 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 +*note Extending and Embedding the Python Interpreter: 1625. + +Most intermediate or advanced Python books will also cover this topic. + + +File: python.info, Node: Can I create my own functions in C++?, Next: Writing C is hard; are there any alternatives?, Prev: Can I create my own functions in C?, Up: Extending/Embedding FAQ + +11.5.2 Can I create my own functions in C++? +-------------------------------------------- + +Yes, using the C compatibility features found in C++. Place ‘extern "C" +{ ... }’ around the Python include files and put ‘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. + + +File: python.info, Node: Writing C is hard; are there any alternatives?, Next: How can I execute arbitrary Python statements from C?, Prev: Can I create my own functions in C++?, Up: Extending/Embedding FAQ + +11.5.3 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. + +Cython(1) and its relative Pyrex(2) are compilers that accept a slightly +modified form of Python and generate the corresponding C code. Cython +and Pyrex make it possible to write an extension without having to learn +Python’s C API. + +If you need to interface to some C or C++ library for which no Python +extension currently exists, you can try wrapping the library’s data +types and functions with a tool such as SWIG(3). SIP(4), CXX(5) +Boost(6), or Weave(7) are also alternatives for wrapping C++ libraries. + + ---------- Footnotes ---------- + + (1) https://cython.org + + (2) https://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/ + + (3) https://www.swig.org + + (4) https://riverbankcomputing.com/software/sip/intro + + (5) https://cxx.sourceforge.net/ + + (6) https://www.boost.org/libs/python/doc/index.html + + (7) https://github.com/scipy/weave + + +File: python.info, Node: How can I execute arbitrary Python statements from C?, Next: How can I evaluate an arbitrary Python expression from C?, Prev: Writing C is hard; are there any alternatives?, Up: Extending/Embedding FAQ + +11.5.4 How can I execute arbitrary Python statements from C? +------------------------------------------------------------ + +The highest-level function to do this is *note PyRun_SimpleString(): +42a4. which takes a single string argument to be executed in the context +of the module ‘__main__’ and returns ‘0’ for success and ‘-1’ when an +exception occurred (including *note SyntaxError: 2d6.). If you want +more control, use *note PyRun_String(): 1404.; see the source for *note +PyRun_SimpleString(): 42a4. in ‘Python/pythonrun.c’. + + +File: python.info, Node: How can I evaluate an arbitrary Python expression from C?, Next: How do I extract C values from a Python object?, Prev: How can I execute arbitrary Python statements from C?, Up: Extending/Embedding FAQ + +11.5.5 How can I evaluate an arbitrary Python expression from C? +---------------------------------------------------------------- + +Call the function *note PyRun_String(): 1404. from the previous question +with the start symbol *note Py_eval_input: 448c.; it parses an +expression, evaluates it and returns its value. + + +File: python.info, Node: How do I extract C values from a Python object?, Next: How do I use Py_BuildValue to create a tuple of arbitrary length?, Prev: How can I evaluate an arbitrary Python expression from C?, Up: Extending/Embedding FAQ + +11.5.6 How do I extract C values from a Python object? +------------------------------------------------------ + +That depends on the object’s type. If it’s a tuple, *note +PyTuple_Size(): 4403. returns its length and *note PyTuple_GetItem(): +4247. returns the item at a specified index. Lists have similar +functions, ‘PyListSize()’ and *note PyList_GetItem(): 4248. + +For bytes, *note PyBytes_Size(): 42f1. returns its length and *note +PyBytes_AsStringAndSize(): 42eb. provides a pointer to its value and its +length. Note that Python bytes objects may contain null bytes so C’s +‘strlen()’ should not be used. + +To test the type of an object, first make sure it isn’t ‘NULL’, and then +use *note PyBytes_Check(): 1025, *note PyTuple_Check(): 45cd, *note +PyList_Check(): 45d7, etc. + +There is also a high-level API to Python objects which is provided by +the so-called ‘abstract’ interface – read ‘Include/abstract.h’ for +further details. It allows interfacing with any kind of Python sequence +using calls like *note PySequence_Length(): 43d7, *note +PySequence_GetItem(): 1494, etc. as well as many other useful protocols +such as numbers (*note PyNumber_Index(): 4ba. et al.) and mappings in +the PyMapping APIs. + + +File: python.info, Node: How do I use Py_BuildValue to create a tuple of arbitrary length?, Next: How do I call an object’s method from C?, Prev: How do I extract C values from a Python object?, Up: Extending/Embedding FAQ + +11.5.7 How do I use Py_BuildValue() to create a tuple of arbitrary length? +-------------------------------------------------------------------------- + +You can’t. Use *note PyTuple_Pack(): 4402. instead. + + +File: python.info, Node: How do I call an object’s method from C?, Next: How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?, Prev: How do I use Py_BuildValue to create a tuple of arbitrary length?, Up: Extending/Embedding FAQ + +11.5.8 How do I call an object’s method from C? +----------------------------------------------- + +The *note PyObject_CallMethod(): 4ad. 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 *note +Py_BuildValue(): 4da, and the argument values: + + PyObject * + PyObject_CallMethod(PyObject *object, const char *method_name, + const char *arg_format, ...); + +This works for any object that has methods – whether built-in or +user-defined. You are responsible for eventually *note Py_DECREF(): +4cd.‘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”): + + res = PyObject_CallMethod(f, "seek", "(ii)", 10, 0); + if (res == NULL) { + ... an exception occurred ... + } + else { + Py_DECREF(res); + } + +Note that since *note PyObject_CallObject(): 423b. `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)”. + + +File: python.info, Node: How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?, Next: How do I access a module written in Python from C?, Prev: How do I call an object’s method from C?, Up: Extending/Embedding FAQ + +11.5.9 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 ‘write()’ method. +Assign this object to *note sys.stdout: 72a. and *note sys.stderr: 581. +Call print_error, or just allow the standard traceback mechanism to +work. Then, the output will go wherever your ‘write()’ method sends it. + +The easiest way to do this is to use the *note io.StringIO: bbe. class: + + >>> import io, sys + >>> sys.stdout = io.StringIO() + >>> print('foo') + >>> print('hello world!') + >>> sys.stderr.write(sys.stdout.getvalue()) + foo + hello world! + +A custom object to do the same would look like this: + + >>> 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(''.join(sys.stdout.data)) + foo + hello world! + + +File: python.info, Node: How do I access a module written in Python from C?, Next: How do I interface to C++ objects from Python?, Prev: How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?, Up: Extending/Embedding FAQ + +11.5.10 How do I access a module written in Python from C? +---------------------------------------------------------- + +You can get a pointer to the module object as follows: + + module = PyImport_ImportModule(""); + +If the module hasn’t been imported yet (i.e. it is not yet present in +*note sys.modules: 1382.), this initializes the module; otherwise it +simply returns the value of ‘sys.modules[""]’. Note that it +doesn’t enter the module into any namespace – it only ensures it has +been initialized and is stored in *note sys.modules: 1382. + +You can then access the module’s attributes (i.e. any name defined in +the module) as follows: + + attr = PyObject_GetAttrString(module, ""); + +Calling *note PyObject_SetAttrString(): 43c7. to assign to variables in +the module also works. + + +File: python.info, Node: How do I interface to C++ objects from Python?, Next: I added a module using the Setup file and the make fails; why?, Prev: How do I access a module written in Python from C?, Up: Extending/Embedding FAQ + +11.5.11 How do I interface to C++ objects from Python? +------------------------------------------------------ + +Depending on your requirements, there are many approaches. To do this +manually, begin by reading *note the “Extending and Embedding” document: +1625. 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 *note Writing C is hard; are there any +alternatives?: 4a46. + + +File: python.info, Node: I added a module using the Setup file and the make fails; why?, Next: How do I debug an extension?, Prev: How do I interface to C++ objects from Python?, Up: Extending/Embedding FAQ + +11.5.12 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.) + + +File: python.info, Node: How do I debug an extension?, Next: I want to compile a Python module on my Linux system but some files are missing Why?, Prev: I added a module using the Setup file and the make fails; why?, Up: Extending/Embedding FAQ + +11.5.13 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 ‘.gdbinit’ file (or interactively), add the command: + + br _PyImport_LoadDynamicModule + +Then, when you run GDB: + + $ 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 + + +File: python.info, Node: I want to compile a Python module on my Linux system but some files are missing Why?, Next: How do I tell “incomplete input” from “invalid input”?, Prev: How do I debug an extension?, Up: Extending/Embedding FAQ + +11.5.14 I want to compile a Python module on my Linux system, but some files are missing. Why? +---------------------------------------------------------------------------------------------- + +Most packaged versions of Python don’t include the +‘/usr/lib/python2.`x'/config/’ directory, which contains various files +required for compiling Python extensions. + +For Red Hat, install the python-devel RPM to get the necessary files. + +For Debian, run ‘apt-get install python-dev’. + + +File: python.info, Node: How do I tell “incomplete input” from “invalid input”?, Next: How do I find undefined g++ symbols __builtin_new or __pure_virtual?, Prev: I want to compile a Python module on my Linux system but some files are missing Why?, Up: Extending/Embedding FAQ + +11.5.15 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 *note codeop: 1b. module, which approximates +the parser’s behavior sufficiently. IDLE uses this, for example. + +The easiest way to do it in C is to call *note PyRun_InteractiveLoop(): +447d. (perhaps in a separate thread) and let the Python interpreter +handle the input for you. You can also set the *note +PyOS_ReadlineFunctionPointer(): 4fc. to point at your custom input +function. See ‘Modules/readline.c’ and ‘Parser/myreadline.c’ for more +hints. + + +File: python.info, Node: How do I find undefined g++ symbols __builtin_new or __pure_virtual?, Next: Can I create an object class with some methods implemented in C and others in Python e g through inheritance ?, Prev: How do I tell “incomplete input” from “invalid input”?, Up: Extending/Embedding FAQ + +11.5.16 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., ‘g++ -shared -o mymodule.so +mymodule.o’). + + +File: python.info, Node: Can I create an object class with some methods implemented in C and others in Python e g through inheritance ?, Prev: How do I find undefined g++ symbols __builtin_new or __pure_virtual?, Up: Extending/Embedding FAQ + +11.5.17 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 *note int: 1c7, *note +list: 1e9, *note dict: 16e, etc. + +The Boost Python Library (BPL, +‘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). + + +File: python.info, Node: Python on Windows FAQ, Next: Graphic User Interface FAQ, Prev: Extending/Embedding FAQ, Up: Python Frequently Asked Questions + +11.6 Python on Windows FAQ +========================== + +* 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?. + + +File: python.info, Node: How do I run a Python program under Windows?, Next: How do I make Python scripts executable?, Up: Python on Windows FAQ + +11.6.1 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 ‘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: + + C:\> + +The letter may be different, and there might be other things after it, +so you might just as easily see something like: + + D:\YourName\Projects\Python> + +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 ‘py’ and +hitting return: + + C:\Users\YourName> py + +You should then see something like: + + 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. + >>> + +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: + + >>> print("Hello") + Hello + >>> "Hello" * 3 + 'HelloHelloHello' + +Many people use the interactive mode as a convenient yet highly +programmable calculator. When you want to end your interactive Python +session, call the *note exit(): 1bd4. function or hold the ‘Ctrl’ key +down while you enter a ‘Z’, then hit the “‘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 ‘>>>’ prompt in a new window. If so, the window will disappear +after you call the *note exit(): 1bd4. function or enter the ‘Ctrl-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 ‘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 ‘hello.py’, and your command prompt +is nicely opened in your home directory so you’re seeing something +similar to: + + C:\Users\YourName> + +So now you’ll ask the ‘py’ command to give your script to Python by +typing ‘py’ followed by your script path: + + C:\Users\YourName> py Desktop\hello.py + hello + + +File: python.info, Node: How do I make Python scripts executable?, Next: Why does Python sometimes take so long to start?, Prev: How do I run a Python program under Windows?, Up: Python on Windows FAQ + +11.6.2 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 (‘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. + + +File: python.info, Node: Why does Python sometimes take so long to start?, Next: How do I make an executable from a Python script?, Prev: How do I make Python scripts executable?, Up: Python on Windows FAQ + +11.6.3 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. + + +File: python.info, Node: How do I make an executable from a Python script?, Next: Is a * pyd file the same as a DLL?, Prev: Why does Python sometimes take so long to start?, Up: Python on Windows FAQ + +11.6.4 How do I make an executable from a Python script? +-------------------------------------------------------- + +See *note How can I create a stand-alone binary from a Python script?: +49b5. for a list of tools that can be used to make executables. + + +File: python.info, Node: Is a * pyd file the same as a DLL?, Next: How can I embed Python into a Windows application?, Prev: How do I make an executable from a Python script?, Up: Python on Windows FAQ + +11.6.5 Is a ‘*.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 ‘foo.pyd’, then it must have a function ‘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 +‘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 ‘import foo’. In a DLL, linkage is declared in the source code with +‘__declspec(dllexport)’. In a .pyd, linkage is defined in a list of +available functions. + + +File: python.info, Node: How can I embed Python into a Windows application?, Next: How do I keep editors from inserting tabs into my Python source?, Prev: Is a * pyd file the same as a DLL?, Up: Python on Windows FAQ + +11.6.6 How can I embed Python into a Windows application? +--------------------------------------------------------- + +Embedding the Python interpreter in a Windows app can be summarized as +follows: + + 1. 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 ‘python`NN'.dll’; it is typically installed in + ‘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 ‘python`NN'.lib’, while run-time linking + means linking against ‘python`NN'.dll’. (General note: + ‘python`NN'.lib’ is the so-called “import lib” corresponding to + ‘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 ‘python`NN'.dll’ using + the Windows ‘LoadLibraryEx()’ routine. The code must also use + access routines and data in ‘python`NN'.dll’ (that is, Python’s C + API’s) using pointers obtained by the Windows ‘GetProcAddress()’ + routine. Macros can make using these pointers transparent to any C + code that calls routines in Python’s C API. + + 2. 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. + + 3. 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.) + + 4. In short, you can use the following code to initialize the Python + interpreter with your extension module. + + #include + ... + Py_Initialize(); // Initialize Python. + initmyAppc(); // Initialize (import) the helper class. + PyRun_SimpleString("import myApp"); // Import the shadow class. + + 5. 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 FILE + * arguments will not work in a multi-compiler environment because + each compiler’s notion of a 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: + + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; + + 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: + + return Py_BuildValue(""); + + It may be possible to use SWIG’s ‘%typemap’ command to make the + change automatically, though I have not been able to get this to + work (I’m a complete SWIG newbie). + + 6. 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. + + +File: python.info, Node: How do I keep editors from inserting tabs into my Python source?, Next: How do I check for a keypress without blocking?, Prev: How can I embed Python into a Windows application?, Up: Python on Windows FAQ + +11.6.7 How do I keep editors from inserting tabs into my Python source? +----------------------------------------------------------------------- + +The FAQ does not recommend using tabs, and the Python style guide, PEP +8(1), 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 *note IndentationError: 393. or *note TabError: 116d. if +mixed tabs and spaces are causing problems in leading whitespace. You +may also run the *note tabnanny: fc. module to check a directory tree in +batch mode. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0008/ + + +File: python.info, Node: How do I check for a keypress without blocking?, Next: How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?, Prev: How do I keep editors from inserting tabs into my Python source?, Up: Python on Windows FAQ + +11.6.8 How do I check for a keypress without blocking? +------------------------------------------------------ + +Use the *note msvcrt: b4. module. This is a standard Windows-specific +extension module. It defines a function ‘kbhit()’ which checks whether +a keyboard hit is present, and ‘getch()’ which gets one character +without echoing it. + + +File: python.info, Node: How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?, Prev: How do I check for a keypress without blocking?, Up: Python on Windows FAQ + +11.6.9 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(1) for guidance on manually +installing the C Runtime update. + + ---------- Footnotes ---------- + + (1) https://support.microsoft.com/en-us/help/3118401/ + + +File: python.info, Node: Graphic User Interface FAQ, Next: “Why is Python Installed on my Computer?” FAQ, Prev: Python on Windows FAQ, Up: Python Frequently Asked Questions + +11.7 Graphic User Interface FAQ +=============================== + +* Menu: + +* General GUI Questions:: +* What GUI toolkits exist for Python?:: +* Tkinter questions:: + + +File: python.info, Node: General GUI Questions, Next: What GUI toolkits exist for Python?, Up: Graphic User Interface FAQ + +11.7.1 General GUI Questions +---------------------------- + + +File: python.info, Node: What GUI toolkits exist for Python?, Next: Tkinter questions, Prev: General GUI Questions, Up: Graphic User Interface FAQ + +11.7.2 What GUI toolkits exist for Python? +------------------------------------------ + +Standard builds of Python include an object-oriented interface to the +Tcl/Tk widget set, called *note tkinter: 363b. This is probably the +easiest to install (since it comes included with most binary +distributions(1) of Python) and use. For more info about Tk, including +pointers to the source, see the Tcl/Tk home page(2). 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(3) and platform-specific(4) GUI +frameworks can be found on the python wiki. + + ---------- Footnotes ---------- + + (1) https://www.python.org/downloads/ + + (2) https://www.tcl.tk + + (3) +https://wiki.python.org/moin/GuiProgramming#Cross-Platform_Frameworks + + (4) +https://wiki.python.org/moin/GuiProgramming#Platform-specific_Frameworks + + +File: python.info, Node: Tkinter questions, Prev: What GUI toolkits exist for Python?, Up: Graphic User Interface FAQ + +11.7.3 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?. + + +File: python.info, Node: How do I freeze Tkinter applications?, Next: Can I have Tk events handled while waiting for I/O?, Up: Tkinter questions + +11.7.3.1 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 ‘TCL_LIBRARY’ and ‘TK_LIBRARY’ +environment variables. + +To get truly stand-alone applications, the Tcl scripts that form the +library have to be integrated into the application as well. One tool +supporting that is SAM (stand-alone modules), which is part of the Tix +distribution (‘https://tix.sourceforge.net/’). + +Build Tix with SAM enabled, perform the appropriate call to +‘Tclsam_init()’, etc. inside Python’s ‘Modules/tkappinit.c’, and link +with libtclsam and libtksam (you might include the Tix libraries as +well). + + +File: python.info, Node: Can I have Tk events handled while waiting for I/O?, Next: I can’t get key bindings to work in Tkinter why?, Prev: How do I freeze Tkinter applications?, Up: Tkinter questions + +11.7.3.2 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 ‘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 *note File Handlers: 3659. + + +File: python.info, Node: I can’t get key bindings to work in Tkinter why?, Prev: Can I have Tk events handled while waiting for I/O?, Up: Tkinter questions + +11.7.3.3 I can’t get key bindings to work in Tkinter: why? +.......................................................... + +An often-heard complaint is that event handlers bound to events with the +‘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). + + +File: python.info, Node: “Why is Python Installed on my Computer?” FAQ, Prev: Graphic User Interface FAQ, Up: Python Frequently Asked Questions + +11.8 “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?:: + + +File: python.info, Node: What is Python?<2>, Next: Why is Python installed on my machine?, Up: “Why is Python Installed on my Computer?” FAQ + +11.8.1 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(1). + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/BeginnersGuide + + +File: python.info, Node: Why is Python installed on my machine?, Next: Can I delete Python?, Prev: What is Python?<2>, Up: “Why is Python Installed on my Computer?” FAQ + +11.8.2 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. + + * 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. + + * 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. + + * 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. + + * Many Unix-compatible operating systems, such as macOS and some + Linux distributions, have Python installed by default; it’s + included in the base installation. + + +File: python.info, Node: Can I delete Python?, Prev: Why is Python installed on my machine?, Up: “Why is Python Installed on my Computer?” FAQ + +11.8.3 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. + + +File: python.info, Node: Glossary, Next: About these documents, Prev: Python Frequently Asked Questions, Up: Top + +12 Glossary +*********** + +‘>>>’ + + The default Python prompt of the interactive shell. Often seen for + code examples which can be executed interactively in the + interpreter. + +‘...’ + + Can refer to: + + * The default Python prompt of the 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. + + * The *note Ellipsis: 1bd0. built-in constant. + +2to3 + + A tool that tries to convert Python 2.x code to Python 3.x code by + handling most of the incompatibilities which can be detected by + parsing the source and traversing the parse tree. + + 2to3 is available in the standard library as *note lib2to3: a5.; a + standalone entry point is provided as ‘Tools/scripts/2to3’. See + *note 2to3 — Automated Python 2 to 3 code translation: f86. + +abstract base class + + Abstract base classes complement *note duck-typing: 4a72. by + providing a way to define interfaces when other techniques like + *note hasattr(): 836. would be clumsy or subtly wrong (for example + with *note magic methods: 1919.). ABCs introduce virtual + subclasses, which are classes that don’t inherit from a class but + are still recognized by *note isinstance(): 3ab. and *note + issubclass(): 3ac.; see the *note abc: 3. module documentation. + Python comes with many built-in ABCs for data structures (in the + *note collections.abc: 1d. module), numbers (in the *note numbers: + bf. module), streams (in the *note io: 9f. module), import finders + and loaders (in the *note importlib.abc: 98. module). You can + create your own ABCs with the *note abc: 3. module. + +annotation + + A label associated with a variable, a class attribute or a function + parameter or return value, used by convention as a *note type hint: + 1936. + + Annotations of local variables cannot be accessed at runtime, but + annotations of global variables, class attributes, and functions + are stored in the ‘__annotations__’ special attribute of modules, + classes, and functions, respectively. + + See *note variable annotation: 9d2, *note function annotation: + 1683, PEP 484(1) and PEP 526(2), which describe this functionality. + Also see *note Annotations Best Practices: 3c9. for best practices + on working with annotations. + +argument + + A value passed to a *note function: 1a34. (or *note method: 4a73.) + when calling the function. There are two kinds of argument: + + * `keyword argument': an argument preceded by an identifier + (e.g. ‘name=’) in a function call or passed as a value in a + dictionary preceded by ‘**’. For example, ‘3’ and ‘5’ are + both keyword arguments in the following calls to *note + complex(): 1b8.: + + complex(real=3, imag=5) + complex(**{'real': 3, 'imag': 5}) + + * `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 *note + iterable: ed9. preceded by ‘*’. For example, ‘3’ and ‘5’ are + both positional arguments in the following calls: + + complex(3, 5) + complex(*(3, 5)) + + Arguments are assigned to the named local variables in a function + body. See the *note Calls: 9f9. 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 *note parameter: 1a44. glossary entry, the FAQ + question on *note the difference between arguments and parameters: + 49c0, and PEP 362(3). + +asynchronous context manager + + An object which controls the environment seen in an *note async + with: 1a1. statement by defining ‘__aenter__()’ and ‘__aexit__()’ + methods. Introduced by PEP 492(4). + +asynchronous generator + + A function which returns an *note asynchronous generator iterator: + 3bcb. It looks like a coroutine function defined with *note async + def: 19b. except that it contains *note yield: 60d. expressions for + producing a series of values usable in an *note async for: 708. + 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 *note await: 2fa. + expressions as well as *note async for: 708, and *note async with: + 1a1. statements. + +asynchronous generator iterator + + An object created by a *note asynchronous generator: 1a0f. + function. + + This is an *note asynchronous iterator: 9f5. which when called + using the ‘__anext__()’ method returns an awaitable object which + will execute the body of the asynchronous generator function until + the next *note yield: 60d. expression. + + Each *note yield: 60d. temporarily suspends processing, remembering + the location execution state (including local variables and pending + try-statements). When the `asynchronous generator iterator' + effectively resumes with another awaitable returned by + ‘__anext__()’, it picks up where it left off. See PEP 492(5) and + PEP 525(6). + +asynchronous iterable + + An object, that can be used in an *note async for: 708. statement. + Must return an *note asynchronous iterator: 9f5. from its + ‘__aiter__()’ method. Introduced by PEP 492(7). + +asynchronous iterator + + An object that implements the ‘__aiter__()’ and ‘__anext__()’ + methods. ‘__anext__’ must return an *note awaitable: 8e7. object. + *note async for: 708. resolves the awaitables returned by an + asynchronous iterator’s ‘__anext__()’ method until it raises a + *note StopAsyncIteration: 1460. exception. Introduced by PEP + 492(8). + +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 *note Identifiers and keywords: 1877, for + example using *note setattr(): 1b9f, if the object allows it. Such + an attribute will not be accessible using a dotted expression, and + would instead need to be retrieved with *note getattr(): 837. + +awaitable + + An object that can be used in an *note await: 2fa. expression. Can + be a *note coroutine: 525. or an object with an ‘__await__()’ + method. See also PEP 492(9). + +BDFL + + Benevolent Dictator For Life, a.k.a. Guido van Rossum(10), + Python’s creator. + +binary file + + A *note file object: e76. able to read and write *note bytes-like + objects: 9a2. Examples of binary files are files opened in binary + mode (‘'rb'’, ‘'wb'’ or ‘'rb+'’), ‘sys.stdin.buffer’, + ‘sys.stdout.buffer’, and instances of *note io.BytesIO: b31. and + *note gzip.GzipFile: 590. + + See also *note text file: 16d0. for a file object able to read and + write *note str: 1b3. objects. + +borrowed reference + + In Python’s C API, a borrowed reference is a reference to an + object. It does not modify the object reference count. It becomes + a dangling pointer if the object is destroyed. For example, a + garbage collection can remove the last *note strong reference: 362. + to the object and so destroy it. + + Calling *note Py_INCREF(): 4cc. on the *note borrowed reference: + 42cb. is recommended to convert it to a *note strong reference: + 362. in-place, except when the object cannot be destroyed before + the last usage of the borrowed reference. The *note Py_NewRef(): + 4c5. function can be used to create a new *note strong reference: + 362. + +bytes-like object + + An object that supports the *note Buffer Protocol: 1ba6. and can + export a C-*note contiguous: 1c79. buffer. This includes all *note + bytes: 1b4, *note bytearray: 1a5, and *note array.array: 3d2. + objects, as well as many common *note memoryview: 6ad. 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 *note bytearray: + 1a5. and a *note memoryview: 6ad. of a *note bytearray: 1a5. Other + operations require the binary data to be stored in immutable + objects (“read-only bytes-like objects”); examples of these include + *note bytes: 1b4. and a *note memoryview: 6ad. of a *note bytes: + 1b4. object. + +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 ‘.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 *note virtual machine: 2d43. 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 *note the dis module: 170. + +callable + + A callable is an object that can be called, possibly with a set of + arguments (see *note argument: 1a35.), with the following syntax: + + callable(argument1, argument2, ...) + + A *note function: 1a34, and by extension a *note method: 4a73, is a + callable. An instance of a class that implements the *note + __call__(): 1900. method is also a callable. + +callback + + A subroutine function which is passed as an argument to be executed + at some point in the future. + +class + + A template for creating user-defined objects. Class definitions + normally contain method definitions which operate on instances of + the class. + +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). + +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 ‘-1’), often written ‘i’ in mathematics or ‘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 ‘j’ suffix, e.g., ‘3+1j’. To get access to complex + equivalents of the *note math: af. module, use *note cmath: 17. + 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. + +context manager + + An object which controls the environment seen in a *note with: 19e. + statement by defining ‘__enter__()’ and ‘__exit__()’ methods. See + PEP 343(11). + +context variable + + A variable which can have different values depending on its + context. This is similar to Thread-Local Storage in which each + execution thread may have a different value for a variable. + However, with context variables, there may be several contexts in + one execution thread and the main usage for context variables is to + keep track of variables in concurrent asynchronous tasks. See + *note contextvars: 23. + +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. + +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 *note async def: 19b. statement. See + also PEP 492(12). + +coroutine function + + A function which returns a *note coroutine: 525. object. A + coroutine function may be defined with the *note async def: 19b. + statement, and may contain *note await: 2fa, *note async for: 708, + and *note async with: 1a1. keywords. These were introduced by PEP + 492(13). + +CPython + + The canonical implementation of the Python programming language, as + distributed on python.org(14). The term “CPython” is used when + necessary to distinguish this implementation from others such as + Jython or IronPython. + +decorator + + A function returning another function, usually applied as a + function transformation using the ‘@wrapper’ syntax. Common + examples for decorators are *note classmethod(): 18d. and *note + staticmethod(): 3c8. + + The decorator syntax is merely syntactic sugar, the following two + function definitions are semantically equivalent: + + def f(arg): + ... + f = staticmethod(f) + + @staticmethod + def f(arg): + ... + + The same concept exists for classes, but is less commonly used + there. See the documentation for *note function definitions: 1682. + and *note class definitions: f7b. for more about decorators. + +descriptor + + Any object which defines the methods ‘__get__()’, ‘__set__()’, or + ‘__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 *note + Implementing Descriptors: 8bd. or the *note Descriptor How To + Guide: 4819. + +dictionary + + An associative array, where arbitrary keys are mapped to values. + The keys can be any object with ‘__hash__()’ and ‘__eq__()’ + methods. Called a hash in Perl. + +dictionary comprehension + + A compact way to process all or part of the elements in an iterable + and return a dictionary with the results. ‘results = {n: n ** 2 + for n in range(10)}’ generates a dictionary containing key ‘n’ + mapped to value ‘n ** 2’. See *note Displays for lists, sets and + dictionaries: 19a. + +dictionary view + + The objects returned from *note dict.keys(): 3b8, *note + dict.values(): 3b9, and *note dict.items(): 3ba. 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 ‘list(dictview)’. See *note Dictionary view objects: + 1c99. + +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 ‘__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. + +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 *note type(): 9c2. or *note isinstance(): 3ab. + (Note, however, that duck-typing can be complemented with *note + abstract base classes: e6a.) Instead, it typically employs *note + hasattr(): 836. tests or *note EAFP: 2546. programming. + +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 *note try: + 1073. and *note except: 17a. statements. The technique contrasts + with the *note LBYL: 4a7b. style common to many other languages + such as C. + +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 *note + statement: 21a1.s which cannot be used as expressions, such as + *note while: 1652. Assignments are also statements, not + expressions. + +extension module + + A module written in C or C++, using Python’s C API to interact with + the core and with user code. + +f-string + + String literals prefixed with ‘'f'’ or ‘'F'’ are commonly called + “f-strings” which is short for *note formatted string literals: + 5f9. See also PEP 498(15). + +file object + + An object exposing a file-oriented API (with methods such as + ‘read()’ or ‘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 *note + binary files: 16d1, buffered *note binary files: 16d1. and *note + text files: 16d0. Their interfaces are defined in the *note io: + 9f. module. The canonical way to create a file object is by using + the *note open(): 30b. function. + +file-like object + + A synonym for *note file object: e76. + +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 *note UnicodeError: f52. + + The *note sys.getfilesystemencoding(): 8c8. and *note + sys.getfilesystemencodeerrors(): 954. functions can be used to get + the filesystem encoding and error handler. + + The *note filesystem encoding and error handler: 1793. are + configured at Python startup by the ‘PyConfig_Read()’ function: see + *note filesystem_encoding: 24dd. and *note filesystem_errors: 24de. + members of *note PyConfig: 370. + + See also the *note locale encoding: 24df. + +finder + + An object that tries to find the *note loader: 19ad. for a module + that is being imported. + + Since Python 3.3, there are two types of finder: *note meta path + finders: d1f. for use with *note sys.meta_path: 9a0, and *note path + entry finders: d20. for use with *note sys.path_hooks: cd0. + + See PEP 302(16), PEP 420(17) and PEP 451(18) for much more detail. + +floor division + + Mathematical division that rounds down to nearest integer. The + floor division operator is ‘//’. For example, the expression ‘11 + // 4’ evaluates to ‘2’ in contrast to the ‘2.75’ returned by float + true division. Note that ‘(-11) // 4’ is ‘-3’ because that is + ‘-2.75’ rounded `downward'. See PEP 238(19). + +function + + A series of statements which returns some value to a caller. It + can also be passed zero or more *note arguments: 1a35. which may be + used in the execution of the body. See also *note parameter: 1a44, + *note method: 4a73, and the *note Function definitions: 1682. + section. + +function annotation + + An *note annotation: 1932. of a function parameter or return value. + + Function annotations are usually used for *note type hints: 1936.: + for example, this function is expected to take two *note int: 1c7. + arguments and is also expected to have an *note int: 1c7. return + value: + + def sum_two_numbers(a: int, b: int) -> int: + return a + b + + Function annotation syntax is explained in section *note Function + definitions: 1682. + + See *note variable annotation: 9d2. and PEP 484(20), which describe + this functionality. Also see *note Annotations Best Practices: + 3c9. for best practices on working with annotations. + +__future__ + + A *note future statement: 196, ‘from __future__ import ’, + directs the compiler to compile the current module using syntax or + semantics that will become standard in a future release of Python. + The *note __future__: 0. 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: + + >>> import __future__ + >>> __future__.division + _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192) + +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 *note + gc: 80. module. + +generator + + A function which returns a *note generator iterator: 844. It looks + like a normal function except that it contains *note yield: 60d. + expressions for producing a series of values usable in a for-loop + or that can be retrieved one at a time with the *note next(): 3c7. + 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. + +generator iterator + + An object created by a *note generator: d11. function. + + Each *note yield: 60d. temporarily suspends processing, remembering + the location 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). + +generator expression + + An expression that returns an iterator. It looks like a normal + expression followed by a ‘for’ clause defining a loop variable, + range, and an optional ‘if’ clause. The combined expression + generates values for an enclosing function: + + >>> sum(i*i for i in range(10)) # sum of squares 0, 1, 4, ... 81 + 285 + +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 *note single dispatch: 636. glossary entry, the *note + functools.singledispatch(): 212. decorator, and PEP 443(21). + +generic type + + A *note type: 133c. that can be parameterized; typically a *note + container class: 193f. such as *note list: 1e9. or *note dict: 16e. + Used for *note type hints: 1936. and *note annotations: 1932. + + For more details, see *note generic alias types: 278, PEP 483(22), + PEP 484(23), PEP 585(24), and the *note typing: 123. module. + +GIL + + See *note global interpreter lock: 8d8. + +global interpreter lock + + The mechanism used by the *note CPython: 2b4. interpreter to assure + that only one thread executes Python *note bytecode: 16f. at a + time. This simplifies the CPython implementation by making the + object model (including critical built-in types such as *note dict: + 16e.) 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. + + Past efforts to create a “free-threaded” interpreter (one which + locks shared data at a much finer granularity) have not been + successful because performance suffered in the common + single-processor case. It is believed that overcoming this + performance issue would make the implementation much more + complicated and therefore costlier to maintain. + +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 *note Cached bytecode invalidation: 1bd. + +hashable + + An object is `hashable' if it has a hash value which never changes + during its lifetime (it needs a ‘__hash__()’ method), and can be + compared to other objects (it needs an ‘__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 *note id(): 1086. + +IDLE + + An Integrated Development and Learning Environment for Python. + *note IDLE: cbf. is a basic editor and interpreter environment + which ships with the standard distribution of Python. + +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. + +import path + + A list of locations (or *note path entries: 19c9.) that are + searched by the *note path based finder: 19b2. for modules to + import. During import, this list of locations usually comes from + *note sys.path: 162, but for subpackages it may also come from the + parent package’s ‘__path__’ attribute. + +importing + + The process by which Python code in one module is made available to + Python code in another module. + +importer + + An object that both finds and loads a module; both a *note finder: + 19ac. and *note loader: 19ad. object. + +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 ‘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 ‘help(x)’). + +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 *note interactive: 4a7f. + +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 *note garbage collector: 131f. 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 ‘__main__’ + module or the script being run has finished executing. + +iterable + + An object capable of returning its members one at a time. Examples + of iterables include all sequence types (such as *note list: 1e9, + *note str: 1b3, and *note tuple: 539.) and some non-sequence types + like *note dict: 16e, *note file objects: e76, and objects of any + classes you define with an ‘__iter__()’ method or with a + ‘__getitem__()’ method that implements *note sequence: 164d. + semantics. + + Iterables can be used in a *note for: 199. loop and in many other + places where a sequence is needed (*note zip(): 3bc, *note map(): + 460, …). When an iterable object is passed as an argument to the + built-in function *note iter(): 3c6, 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 *note + iter(): 3c6. or deal with iterator objects yourself. The ‘for’ + statement does that automatically for you, creating a temporary + unnamed variable to hold the iterator for the duration of the loop. + See also *note iterator: 134f, *note sequence: 164d, and *note + generator: d11. + +iterator + + An object representing a stream of data. Repeated calls to the + iterator’s *note __next__(): f76. method (or passing it to the + built-in function *note next(): 3c7.) return successive items in + the stream. When no more data are available a *note StopIteration: + 865. exception is raised instead. At this point, the iterator + object is exhausted and any further calls to its ‘__next__()’ + method just raise *note StopIteration: 865. again. Iterators are + required to have an ‘__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 *note list: 1e9.) produces a fresh new + iterator each time you pass it to the *note iter(): 3c6. function + or use it in a *note for: 199. 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 *note Iterator Types: 1bba. + + `CPython implementation detail:' CPython does not consistently + apply the requirement that an iterator define ‘__iter__()’. + +key function + + A key function or collation function is a callable that returns a + value used for sorting or ordering. For example, *note + locale.strxfrm(): 3551. 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 *note min(): b99, + *note max(): b9a, *note sorted(): 833, *note list.sort(): 834, + *note heapq.merge(): a85, *note heapq.nsmallest(): 1f70, *note + heapq.nlargest(): 1f6f, and *note itertools.groupby(): 214e. + + There are several ways to create a key function. For example. the + *note str.lower(): 11c3. method can serve as a key function for + case insensitive sorts. Alternatively, a key function can be built + from a *note lambda: f4b. expression such as ‘lambda r: (r[0], + r[2])’. Also, *note operator.attrgetter(): ab7, *note + operator.itemgetter(): 6b3, and *note operator.methodcaller(): ab8. + are three key function constructors. See the *note Sorting HOW TO: + 1bc7. for examples of how to create and use key functions. + +keyword argument + + See *note argument: 1a35. + +lambda + + An anonymous inline function consisting of a single *note + expression: 193a. which is evaluated when the function is called. + The syntax to create a lambda function is ‘lambda [parameters]: + expression’ + +LBYL + + Look before you leap. This coding style explicitly tests for + pre-conditions before making calls or lookups. This style + contrasts with the *note EAFP: 2546. approach and is characterized + by the presence of many *note if: 467. statements. + + In a multi-threaded environment, the LBYL approach can risk + introducing a race condition between “the looking” and “the + leaping”. For example, the 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 locks or by using the EAFP approach. + +locale encoding + + On Unix, it is the encoding of the LC_CTYPE locale. It can be set + with *note locale.setlocale(locale.LC_CTYPE, new_locale): 2de. + + On Windows, it is the ANSI code page (ex: ‘"cp1252"’). + + On Android and VxWorks, Python uses ‘"utf-8"’ as the locale + encoding. + + ‘locale.getencoding()’ can be used to get the locale encoding. + + See also the *note filesystem encoding and error handler: 1793. + +list + + A built-in Python *note sequence: 164d. 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). + +list comprehension + + A compact way to process all or part of the elements in a sequence + and return a list with the results. ‘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 *note if: 467. clause is optional. If omitted, all elements in + ‘range(256)’ are processed. + +loader + + An object that loads a module. It must define a method named + ‘load_module()’. A loader is typically returned by a *note finder: + 19ac. See PEP 302(25) for details and *note importlib.abc.Loader: + b55. for an *note abstract base class: e6a. + +magic method + + An informal synonym for *note special method: 12ab. + +mapping + + A container object that supports arbitrary key lookups and + implements the methods specified in the *note + collections.abc.Mapping: 505. or *note + collections.abc.MutableMapping: d58. *note abstract base classes: + 49a. Examples include *note dict: 16e, *note + collections.defaultdict: e71, *note collections.OrderedDict: 1a8. + and *note collections.Counter: d43. + +meta path finder + + A *note finder: 19ac. returned by a search of *note sys.meta_path: + 9a0. Meta path finders are related to, but different from *note + path entry finders: d20. + + See *note importlib.abc.MetaPathFinder: 473. for the methods that + meta path finders implement. + +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 *note Metaclasses: 1927. + +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 *note argument: 1a35. (which is + usually called ‘self’). See *note function: 1a34. and *note nested + scope: 1bac. + +method resolution order + + Method Resolution Order is the order in which base classes are + searched for a member during lookup. See The Python 2.3 Method + Resolution Order(26) for details of the algorithm used by the + Python interpreter since the 2.3 release. + +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 *note importing: + 199f. + + See also *note package: 19a2. + +module spec + + A namespace containing the import-related information used to load + a module. An instance of *note importlib.machinery.ModuleSpec: + 19b8. + +MRO + + See *note method resolution order: 1bc9. + +mutable + + Mutable objects can change their value but keep their *note id(): + 1086. See also *note immutable: 1648. + +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 *note time.localtime(): 13ad. and *note os.stat(): 653. + Another example is *note sys.float_info: 1416.: + + >>> 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 + + 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 *note tuple: 539. and that defines + named fields. Such a class can be written by hand or it can be + created with the factory function *note collections.namedtuple(): + 538. The latter technique also adds some extra methods that may + not be found in hand-written or built-in named tuples. + +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 *note builtins.open: 30b. and *note + os.open(): a10. are distinguished by their namespaces. Namespaces + also aid readability and maintainability by making it clear which + module implements a function. For instance, writing *note + random.seed(): f2c. or *note itertools.islice(): 7a5. makes it + clear that those functions are implemented by the *note random: d9. + and *note itertools: a1. modules, respectively. + +namespace package + + A PEP 420(27) *note package: 19a2. which serves only as a container + for subpackages. Namespace packages may have no physical + representation, and specifically are not like a *note regular + package: 19a4. because they have no ‘__init__.py’ file. + + See also *note module: 199e. + +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 *note + nonlocal: f56. allows writing to outer scopes. + +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 *note __slots__: 112a, + descriptors, properties, ‘__getattribute__()’, class methods, and + static methods. + +object + + Any data with state (attributes or value) and defined behavior + (methods). Also the ultimate base class of any *note new-style + class: 22aa. + +package + + A Python *note module: 199e. which can contain submodules or + recursively, subpackages. Technically, a package is a Python + module with an ‘__path__’ attribute. + + See also *note regular package: 19a4. and *note namespace package: + 19a5. + +parameter + + A named entity in a *note function: 1a34. (or method) definition + that specifies an *note argument: 1a35. (or in some cases, + arguments) that the function can accept. There are five kinds of + parameter: + + * `positional-or-keyword': specifies an argument that can be + passed either *note positionally: 1a35. or as a *note keyword + argument: 1a35. This is the default kind of parameter, for + example `foo' and `bar' in the following: + + def func(foo, bar=None): ... + + * `positional-only': specifies an argument that can be supplied + only by position. Positional-only parameters can be defined + by including a ‘/’ character in the parameter list of the + function definition after them, for example `posonly1' and + `posonly2' in the following: + + def func(posonly1, posonly2, /, positional_or_keyword): ... + + * `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 ‘*’ in the + parameter list of the function definition before them, for + example `kw_only1' and `kw_only2' in the following: + + def func(arg, *, kw_only1, kw_only2): ... + + * `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 ‘*’, for example `args' in the following: + + def func(*args, **kwargs): ... + + * `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 + ‘**’, for example `kwargs' in the example above. + + Parameters can specify both optional and required arguments, as + well as default values for some optional arguments. + + See also the *note argument: 1a35. glossary entry, the FAQ question + on *note the difference between arguments and parameters: 49c0, the + *note inspect.Parameter: a97. class, the *note Function + definitions: 1682. section, and PEP 362(28). + +path entry + + A single location on the *note import path: 19af. which the *note + path based finder: 19b2. consults to find modules for importing. + +path entry finder + + A *note finder: 19ac. returned by a callable on *note + sys.path_hooks: cd0. (i.e. a *note path entry hook: 19cb.) which + knows how to locate modules given a *note path entry: 19c9. + + See *note importlib.abc.PathEntryFinder: 474. for the methods that + path entry finders implement. + +path entry hook + + A callable on the ‘sys.path_hook’ list which returns a *note path + entry finder: d20. if it knows how to find modules on a specific + *note path entry: 19c9. + +path based finder + + One of the default *note meta path finders: d1f. which searches an + *note import path: 19af. for modules. + +path-like object + + An object representing a file system path. A path-like object is + either a *note str: 1b3. or *note bytes: 1b4. object representing a + path, or an object implementing the *note os.PathLike: 8bf. + protocol. An object that supports the *note os.PathLike: 8bf. + protocol can be converted to a *note str: 1b3. or *note bytes: 1b4. + file system path by calling the *note os.fspath(): 8c1. function; + *note os.fsdecode(): 8c2. and *note os.fsencode(): 8c3. can be used + to guarantee a *note str: 1b3. or *note bytes: 1b4. result instead, + respectively. Introduced by PEP 519(29). + +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 PEP 1(30). + +portion + + A set of files in a single directory (possibly stored in a zip + file) that contribute to a namespace package, as defined in PEP + 420(31). + +positional argument + + See *note argument: 1a35. + +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 PEP 411(32) for more details. + +provisional package + + See *note provisional API: 757. + +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”. + +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 *note + for: 199. statement. Many other languages don’t have this type of + construct, so people unfamiliar with Python sometimes use a + numerical counter instead: + + for i in range(len(food)): + print(food[i]) + + As opposed to the cleaner, Pythonic method: + + for piece in food: + print(piece) + +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 PEP + 3155(33). For top-level functions and classes, the qualified name + is the same as the object’s name: + + >>> class C: + ... class D: + ... def meth(self): + ... pass + ... + >>> C.__qualname__ + 'C' + >>> C.D.__qualname__ + 'C.D' + >>> C.D.meth.__qualname__ + 'C.D.meth' + + When used to refer to modules, the `fully qualified name' means the + entire dotted path to the module, including any parent packages, + e.g. ‘email.mime.text’: + + >>> import email.mime.text + >>> email.mime.text.__name__ + 'email.mime.text' + +reference count + + The number of references to an object. When the reference count of + an object drops to zero, it is deallocated. Reference counting is + generally not visible to Python code, but it is a key element of + the *note CPython: 2b4. implementation. Programmers can call the + *note sys.getrefcount(): 3bca. function to return the reference + count for a particular object. + +regular package + + A traditional *note package: 19a2, such as a directory containing + an ‘__init__.py’ file. + + See also *note namespace package: 19a5. + +__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. + +sequence + + An *note iterable: ed9. which supports efficient element access + using integer indices via the ‘__getitem__()’ special method and + defines a ‘__len__()’ method that returns the length of the + sequence. Some built-in sequence types are *note list: 1e9, *note + str: 1b3, *note tuple: 539, and *note bytes: 1b4. Note that *note + dict: 16e. also supports ‘__getitem__()’ and ‘__len__()’, but is + considered a mapping rather than a sequence because the lookups use + arbitrary *note immutable: 1648. keys rather than integers. + + The *note collections.abc.Sequence: 12a3. abstract base class + defines a much richer interface that goes beyond just + ‘__getitem__()’ and ‘__len__()’, adding ‘count()’, ‘index()’, + ‘__contains__()’, and ‘__reversed__()’. Types that implement this + expanded interface can be registered explicitly using *note + register(): d3a. + +set comprehension + + A compact way to process all or part of the elements in an iterable + and return a set with the results. ‘results = {c for c in + 'abracadabra' if c not in 'abc'}’ generates the set of strings + ‘{'r', 'd'}’. See *note Displays for lists, sets and dictionaries: + 19a. + +single dispatch + + A form of *note generic function: 635. dispatch where the + implementation is chosen based on the type of a single argument. + +slice + + An object usually containing a portion of a *note sequence: 164d. + A slice is created using the subscript notation, ‘[]’ with colons + between numbers when several are given, such as in + ‘variable_name[1:3:5]’. The bracket (subscript) notation uses + *note slice: 1100. objects internally. + +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 *note Special method names: 8de. + +statement + + A statement is part of a suite (a “block” of code). A statement is + either an *note expression: 193a. or one of several constructs with + a keyword, such as *note if: 467, *note while: 1652. or *note for: + 199. + +strong reference + + In Python’s C API, a strong reference is a reference to an object + which increments the object’s reference count when it is created + and decrements the object’s reference count when it is deleted. + + The *note Py_NewRef(): 4c5. function can be used to create a strong + reference to an object. Usually, the *note Py_DECREF(): 4cd. + function must be called on the strong reference before exiting the + scope of the strong reference, to avoid leaking one reference. + + See also *note borrowed reference: 42cb. + +text encoding + + A string in Python is a sequence of Unicode code points (in range + ‘U+0000’–‘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 *note codecs: + a38, which are collectively referred to as “text encodings”. + +text file + + A *note file object: e76. able to read and write *note str: 1b3. + objects. Often, a text file actually accesses a byte-oriented + datastream and handles the *note text encoding: 1bc1. + automatically. Examples of text files are files opened in text + mode (‘'r'’ or ‘'w'’), *note sys.stdin: 729, *note sys.stdout: 72a, + and instances of *note io.StringIO: bbe. + + See also *note binary file: 16d1. for a file object able to read + and write *note bytes-like objects: 9a2. + +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. + +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 + *note __class__: 1104. attribute or can be retrieved with + ‘type(obj)’. + +type alias + + A synonym for a type, created by assigning the type to an + identifier. + + Type aliases are useful for simplifying *note type hints: 1936. + For example: + + def remove_gray_shades( + colors: list[tuple[int, int, int]]) -> list[tuple[int, int, int]]: + pass + + could be made more readable like this: + + Color = tuple[int, int, int] + + def remove_gray_shades(colors: list[Color]) -> list[Color]: + pass + + See *note typing: 123. and PEP 484(34), which describe this + functionality. + +type hint + + An *note annotation: 1932. 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 static type analysis tools, and aid IDEs with code + completion and refactoring. + + Type hints of global variables, class attributes, and functions, + but not local variables, can be accessed using *note + typing.get_type_hints(): 277. + + See *note typing: 123. and PEP 484(35), which describe this + functionality. + +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 + ‘'\n'’, the Windows convention ‘'\r\n'’, and the old Macintosh + convention ‘'\r'’. See PEP 278(36) and PEP 3116(37), as well as + *note bytes.splitlines(): 1c67. for an additional use. + +variable annotation + + An *note annotation: 1932. of a variable or a class attribute. + + When annotating a variable or a class attribute, assignment is + optional: + + class C: + field: 'annotation' + + Variable annotations are usually used for *note type hints: 1936.: + for example this variable is expected to take *note int: 1c7. + values: + + count: int = 0 + + Variable annotation syntax is explained in section *note Annotated + assignment statements: 1aa8. + + See *note function annotation: 1683, PEP 484(38) and PEP 526(39), + which describe this functionality. Also see *note Annotations Best + Practices: 3c9. for best practices on working with annotations. + +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 *note venv: 12f. + +virtual machine + + A computer defined entirely in software. Python’s virtual machine + executes the *note bytecode: 16f. emitted by the bytecode compiler. + +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 “‘import this’” at the interactive prompt. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0484/ + + (2) https://peps.python.org/pep-0526/ + + (3) https://peps.python.org/pep-0362/ + + (4) https://peps.python.org/pep-0492/ + + (5) https://peps.python.org/pep-0492/ + + (6) https://peps.python.org/pep-0525/ + + (7) https://peps.python.org/pep-0492/ + + (8) https://peps.python.org/pep-0492/ + + (9) https://peps.python.org/pep-0492/ + + (10) https://gvanrossum.github.io/ + + (11) https://peps.python.org/pep-0343/ + + (12) https://peps.python.org/pep-0492/ + + (13) https://peps.python.org/pep-0492/ + + (14) https://www.python.org + + (15) https://peps.python.org/pep-0498/ + + (16) https://peps.python.org/pep-0302/ + + (17) https://peps.python.org/pep-0420/ + + (18) https://peps.python.org/pep-0451/ + + (19) https://peps.python.org/pep-0238/ + + (20) https://peps.python.org/pep-0484/ + + (21) https://peps.python.org/pep-0443/ + + (22) https://peps.python.org/pep-0483/ + + (23) https://peps.python.org/pep-0484/ + + (24) https://peps.python.org/pep-0585/ + + (25) https://peps.python.org/pep-0302/ + + (26) https://www.python.org/download/releases/2.3/mro/ + + (27) https://peps.python.org/pep-0420/ + + (28) https://peps.python.org/pep-0362/ + + (29) https://peps.python.org/pep-0519/ + + (30) https://peps.python.org/pep-0001/ + + (31) https://peps.python.org/pep-0420/ + + (32) https://peps.python.org/pep-0411/ + + (33) https://peps.python.org/pep-3155/ + + (34) https://peps.python.org/pep-0484/ + + (35) https://peps.python.org/pep-0484/ + + (36) https://peps.python.org/pep-0278/ + + (37) https://peps.python.org/pep-3116/ + + (38) https://peps.python.org/pep-0484/ + + (39) https://peps.python.org/pep-0526/ + + +File: python.info, Node: About these documents, Next: Dealing with Bugs, Prev: Glossary, Up: Top + +13 About these documents +************************ + +These documents are generated from reStructuredText(1) sources by +Sphinx(2), a document processor specifically written for the Python +documentation. + +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 *note Dealing with Bugs: 42b3. page for +information on how to do so. New volunteers are always welcome! + +Many thanks go to: + + * Fred L. Drake, Jr., the creator of the original Python + documentation toolset and writer of much of the content; + + * the Docutils(3) project for creating reStructuredText and the + Docutils suite; + + * Fredrik Lundh for his Alternative Python Reference project from + which Sphinx got many good ideas. + +* Menu: + +* Contributors to the Python Documentation:: + + ---------- Footnotes ---------- + + (1) https://docutils.sourceforge.io/rst.html + + (2) http://sphinx-doc.org/ + + (3) https://docutils.sourceforge.io/ + + +File: python.info, Node: Contributors to the Python Documentation, Up: About these documents + +13.1 Contributors to the Python Documentation +============================================= + +Many people have contributed to the Python language, the Python standard +library, and the Python documentation. See Misc/ACKS(1) 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! + + ---------- Footnotes ---------- + + (1) https://github.com/python/cpython/tree/3.11/Misc/ACKS + + +File: python.info, Node: Dealing with Bugs, Next: Copyright, Prev: About these documents, Up: Top + +14 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 less people. Learn +how to *note contribute: 4a90. + +* Menu: + +* Documentation bugs:: +* Using the Python issue tracker:: +* Getting started contributing to Python yourself:: + + +File: python.info, Node: Documentation bugs, Next: Using the Python issue tracker, Up: Dealing with Bugs + +14.1 Documentation bugs +======================= + +If you find a bug in this documentation or would like to propose an +improvement, please submit a bug report on the *note tracker: 4a92. If +you have a suggestion on how to fix it, include that as well. + +If you’re short on time, you can also email documentation bug reports to + (behavioral bugs can be sent to +). ‘docs@’ is a mailing list run by volunteers; +your request will be noticed, though it may take a while to be +processed. + +See also +........ + +Documentation bugs(1) + + A list of documentation bugs that have been submitted to the Python + issue tracker. + +Issue Tracking(2) + + Overview of the process involved in reporting an improvement on the + tracker. + +Helping with Documentation(3) + + Comprehensive guide for individuals that are interested in + contributing to Python documentation. + +Documentation Translations(4) + + A list of GitHub pages for documentation translation and their + primary contacts. + + ---------- Footnotes ---------- + + (1) +https://github.com/python/cpython/issues?q=is%3Aissue+is%3Aopen+label%3Adocs + + (2) https://devguide.python.org/tracker/ + + (3) +https://devguide.python.org/docquality/#helping-with-documentation + + (4) https://devguide.python.org/documenting/#translating + + +File: python.info, Node: Using the Python issue tracker, Next: Getting started contributing to Python yourself, Prev: Documentation bugs, Up: Dealing with Bugs + +14.2 Using the Python issue tracker +=================================== + +Issue reports for Python itself should be submitted via the GitHub +issues tracker (‘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; +less 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. + +See also +........ + +How to Report Bugs Effectively(1) + + 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. + +Bug Writing Guidelines(2) + + Information about writing a good bug report. Some of this is + specific to the Mozilla project, but describes general good + practices. + + ---------- Footnotes ---------- + + (1) https://www.chiark.greenend.org.uk/~sgtatham/bugs.html + + (2) https://bugzilla.mozilla.org/page.cgi?id=bug-writing.html + + +File: python.info, Node: Getting started contributing to Python yourself, Prev: Using the Python issue tracker, Up: Dealing with Bugs + +14.3 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(1). If you have +questions, the core-mentorship mailing list(2) is a friendly place to +get answers to any and all questions pertaining to the process of fixing +issues in Python. + + ---------- Footnotes ---------- + + (1) https://devguide.python.org/ + + (2) +https://mail.python.org/mailman3/lists/core-mentorship.python.org/ + + +File: python.info, Node: Copyright, Next: History and License, Prev: Dealing with Bugs, Up: Top + +15 Copyright +************ + +Python and this documentation is: + +Copyright © 2001-2022 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 *note History and License: 4a98. for complete license and +permissions information. + + +File: python.info, Node: History and License, Next: Distributing Python Modules Legacy version, Prev: Copyright, Up: Top + +16 History and License +********************** + +* Menu: + +* History of the software:: +* Terms and conditions for accessing or otherwise using Python:: +* Licenses and Acknowledgements for Incorporated Software:: + + +File: python.info, Node: History of the software, Next: Terms and conditions for accessing or otherwise using Python, Up: History and License + +16.1 History of the software +============================ + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see ‘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 +‘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 (now Zope +Corporation; see ‘https://www.zope.org/’). In 2001, the Python Software +Foundation (PSF, see ‘https://www.python.org/psf/’) was formed, a +non-profit organization created specifically to own Python-related +Intellectual Property. Zope Corporation is a sponsoring member of the +PSF. + +All Python releases are Open Source (see ‘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. + +Release Derived from Year Owner GPL compatible? + +------------------------------------------------------------------------------------------------ + +0.9.0 thru 1.2 n/a 1991-1995 CWI yes + + +1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + + +1.6 1.5.2 2000 CNRI no + + +2.0 1.6 2000 BeOpen.com no + + +1.6.1 1.6 2001 CNRI no + + +2.1 2.0+1.6.1 2001 PSF no + + +2.0.1 2.0+1.6.1 2001 PSF yes + + +2.1.1 2.1+2.0.1 2001 PSF yes + + +2.1.2 2.1.1 2002 PSF yes + + +2.1.3 2.1.2 2002 PSF yes + + +2.2 and above 2.1.1 2001-now PSF yes + + + Note: 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. + +Thanks to the many outside volunteers who have worked under Guido’s +direction to make these releases possible. + + +File: python.info, Node: Terms and conditions for accessing or otherwise using Python, Next: Licenses and Acknowledgements for Incorporated Software, Prev: History of the software, Up: History and License + +16.2 Terms and conditions for accessing or otherwise using Python +================================================================= + +Python software and documentation are licensed under the *note PSF +License Agreement: 4a9d. + +Starting with Python 3.8.6, examples, recipes, and other code in the +documentation are dual licensed under the PSF License Agreement and the +*note Zero-Clause BSD license: 4a9e. + +Some software incorporated into Python is under different licenses. The +licenses are listed with code falling under that license. See *note +Licenses and Acknowledgements for Incorporated Software: 4a9f. for an +incomplete list of these licenses. + +* Menu: + +* PSF LICENSE AGREEMENT FOR PYTHON 3.11.0: PSF LICENSE AGREEMENT FOR PYTHON 3 11 0. +* 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 3.11.0 DOCUMENTATION: ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON 3 11 0 DOCUMENTATION. + + +File: python.info, Node: PSF LICENSE AGREEMENT FOR PYTHON 3 11 0, Next: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0, Up: Terms and conditions for accessing or otherwise using Python + +16.2.1 PSF LICENSE AGREEMENT FOR PYTHON 3.11.0 +---------------------------------------------- + + 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and + the Individual or Organization ("Licensee") accessing and otherwise using Python + 3.11.0 software 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 3.11.0 alone or in any derivative + version, provided, however, that PSF's License Agreement and PSF's notice of + copyright, i.e., "Copyright © 2001-2022 Python Software Foundation; All Rights + Reserved" are retained in Python 3.11.0 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 3.11.0 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 + 3.11.0. + + 4. PSF is making Python 3.11.0 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 3.11.0 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + + 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.11.0 + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF + MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.11.0, 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 3.11.0, Licensee agrees + to be bound by the terms and conditions of this License Agreement. + + +File: python.info, Node: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0, Next: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1, Prev: PSF LICENSE AGREEMENT FOR PYTHON 3 11 0, Up: Terms and conditions for accessing or otherwise using Python + +16.2.2 BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +-------------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + + 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 + ‘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. + + +File: python.info, Node: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1, Next: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2, Prev: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 0, Up: Terms and conditions for accessing or otherwise using Python + +16.2.3 CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +---------------------------------------------- + + 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: ‘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. + + +File: python.info, Node: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2, Next: ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON 3 11 0 DOCUMENTATION, Prev: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 1, Up: Terms and conditions for accessing or otherwise using Python + +16.2.4 CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +--------------------------------------------------------- + + 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. + + +File: python.info, Node: ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON 3 11 0 DOCUMENTATION, Prev: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 2, Up: Terms and conditions for accessing or otherwise using Python + +16.2.5 ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON 3.11.0 DOCUMENTATION +-------------------------------------------------------------------------- + + 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. + + +File: python.info, Node: Licenses and Acknowledgements for Incorporated Software, Prev: Terms and conditions for accessing or otherwise using Python, Up: History and License + +16.3 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:: +* expat:: +* libffi:: +* zlib: zlib<3>. +* cfuhash:: +* libmpdec:: +* W3C C14N test suite:: + + +File: python.info, Node: Mersenne Twister, Next: Sockets<2>, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.1 Mersenne Twister +----------------------- + +The ‘_random’ module includes code based on a download from +‘http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html’. +The following are the verbatim comments from the original code: + + 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) + + +File: python.info, Node: Sockets<2>, Next: Asynchronous socket services, Prev: Mersenne Twister, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.2 Sockets +-------------- + +The *note socket: ec. module uses the functions, ‘getaddrinfo()’, and +‘getnameinfo()’, which are coded in separate source files from the WIDE +Project, ‘https://www.wide.ad.jp/’. + + 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. + + +File: python.info, Node: Asynchronous socket services, Next: Cookie management, Prev: Sockets<2>, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.3 Asynchronous socket services +----------------------------------- + +The *note asynchat: 8. and *note asyncore: a. modules contain the +following notice: + + 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. + + +File: python.info, Node: Cookie management, Next: Execution tracing, Prev: Asynchronous socket services, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.4 Cookie management +------------------------ + +The *note http.cookies: 91. module contains the following notice: + + Copyright 2000 by Timothy O'Malley + + 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. + + +File: python.info, Node: Execution tracing, Next: UUencode and UUdecode functions, Prev: Cookie management, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.5 Execution tracing +------------------------ + +The *note trace: 11c. module contains the following notice: + + 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. + + +File: python.info, Node: UUencode and UUdecode functions, Next: XML Remote Procedure Calls, Prev: Execution tracing, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.6 UUencode and UUdecode functions +-------------------------------------- + +The *note uu: 12d. module contains the following notice: + + 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 + + +File: python.info, Node: XML Remote Procedure Calls, Next: test_epoll, Prev: UUencode and UUdecode functions, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.7 XML Remote Procedure Calls +--------------------------------- + +The *note xmlrpc.client: 14a. module contains the following notice: + + 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. + + +File: python.info, Node: test_epoll, Next: Select kqueue, Prev: XML Remote Procedure Calls, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.8 test_epoll +----------------- + +The ‘test_epoll’ module contains the following notice: + + 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. + + +File: python.info, Node: Select kqueue, Next: SipHash24, Prev: test_epoll, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.9 Select kqueue +-------------------- + +The *note select: e2. module contains the following notice for the +kqueue interface: + + 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. + + +File: python.info, Node: SipHash24, Next: strtod and dtoa, Prev: Select kqueue, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.10 SipHash24 +----------------- + +The file ‘Python/pyhash.c’ contains Marek Majkowski’ implementation of +Dan Bernstein’s SipHash24 algorithm. It contains the following note: + + + Copyright (c) 2013 Marek Majkowski + + 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. + + + 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) + + +File: python.info, Node: strtod and dtoa, Next: OpenSSL, Prev: SipHash24, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.11 strtod and dtoa +----------------------- + +The file ‘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 +‘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: + + /**************************************************************** + * + * 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. + * + ***************************************************************/ + + +File: python.info, Node: OpenSSL, Next: expat, Prev: strtod and dtoa, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.12 OpenSSL +--------------- + +The modules *note hashlib: 88, *note posix: ce, *note ssl: f0, *note +crypt: 27. 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: + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. Actually both licenses are BSD-style + Open Source licenses. In case of any license issues related to OpenSSL + please contact openssl-core@openssl.org. + + OpenSSL License + --------------- + + /* ==================================================================== + * Copyright (c) 1998-2008 The OpenSSL 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. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED 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 OpenSSL PROJECT OR + * ITS 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. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + + /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * 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 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + + +File: python.info, Node: expat, Next: libffi, Prev: OpenSSL, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.13 expat +------------- + +The ‘pyexpat’ extension is built using an included copy of the expat +sources unless the build is configured ‘--with-system-expat’: + + 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. + + +File: python.info, Node: libffi, Next: zlib<3>, Prev: expat, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.14 libffi +-------------- + +The ‘_ctypes’ extension is built using an included copy of the libffi +sources unless the build is configured ‘--with-system-libffi’: + + 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. + + +File: python.info, Node: zlib<3>, Next: cfuhash, Prev: libffi, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.15 zlib +------------ + +The *note zlib: 14f. 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: + + 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 + + +File: python.info, Node: cfuhash, Next: libmpdec, Prev: zlib<3>, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.16 cfuhash +--------------- + +The implementation of the hash table used by the *note tracemalloc: 11e. +is based on the cfuhash project: + + 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. + + +File: python.info, Node: libmpdec, Next: W3C C14N test suite, Prev: cfuhash, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.17 libmpdec +---------------- + +The ‘_decimal’ module is built using an included copy of the libmpdec +library unless the build is configured ‘--with-system-libmpdec’: + + 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. + + +File: python.info, Node: W3C C14N test suite, Prev: libmpdec, Up: Licenses and Acknowledgements for Incorporated Software + +16.3.18 W3C C14N test suite +--------------------------- + +The C14N 2.0 test suite in the *note test: 101. package +(‘Lib/test/xmltestdata/c14n-20/’) was retrieved from the W3C website at +‘https://www.w3.org/TR/xml-c14n2-testcases/’ and is distributed under +the 3-clause BSD license: + + 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. + + +File: python.info, Node: Distributing Python Modules Legacy version, Next: Installing Python Modules Legacy version, Prev: History and License, Up: Top + +17 Distributing Python Modules (Legacy version) +*********************************************** + + +Authors: Greg Ward, Anthony Baxter + + +Email: + +See also +........ + +*note Distributing Python Modules: b86. + + The up to date module distribution documentations + + Note: The entire ‘distutils’ package has been deprecated and will + be removed in Python 3.12. This documentation is retained as a + reference only, and will be removed with the package. See the + *note What’s New: 2f3. entry for more information. + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + + Note: This guide only covers the basic tools for building and + distributing extensions that are provided as part of this version + of Python. Third party tools offer easier to use and more secure + alternatives. Refer to the quick recommendations section(1) in the + Python Packaging User Guide for more information. + +This document describes the Python Distribution Utilities (“Distutils”) +from the module developer’s point of view, describing the underlying +capabilities that ‘setuptools’ builds on to allow Python developers to +make Python modules and extensions readily available to a wider +audience. + +* Menu: + +* An Introduction to Distutils:: +* Writing the Setup Script:: +* Writing the Setup Configuration File:: +* Creating a Source Distribution:: +* Creating Built Distributions:: +* Distutils Examples:: +* Extending Distutils:: +* Command Reference:: +* API Reference:: + + ---------- Footnotes ---------- + + (1) https://packaging.python.org/guides/tool-recommendations/ + + +File: python.info, Node: An Introduction to Distutils, Next: Writing the Setup Script, Up: Distributing Python Modules Legacy version + +17.1 An Introduction to Distutils +================================= + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +This document covers using the Distutils to distribute your Python +modules, concentrating on the role of developer/distributor: if you’re +looking for information on installing Python modules, you should refer +to the *note Installing Python Modules (Legacy version): b87. chapter. + +* Menu: + +* Concepts & Terminology:: +* A Simple Example: A Simple Example<2>. +* General Python terminology:: +* Distutils-specific terminology:: + + +File: python.info, Node: Concepts & Terminology, Next: A Simple Example<2>, Up: An Introduction to Distutils + +17.1.1 Concepts & Terminology +----------------------------- + +Using the Distutils is quite simple, both for module developers and for +users/administrators installing third-party modules. As a developer, +your responsibilities (apart from writing solid, well-documented and +well-tested code, of course!) are: + + * write a setup script (‘setup.py’ by convention) + + * (optional) write a setup configuration file + + * create a source distribution + + * (optional) create one or more built (binary) distributions + +Each of these tasks is covered in this document. + +Not all module developers have access to a multitude of platforms, so +it’s not always feasible to expect them to create a multitude of built +distributions. It is hoped that a class of intermediaries, called +`packagers', will arise to address this need. Packagers will take +source distributions released by module developers, build them on one or +more platforms, and release the resulting built distributions. Thus, +users on the most popular platforms will be able to install most popular +Python module distributions in the most natural way for their platform, +without having to run a single setup script or compile a line of code. + + +File: python.info, Node: A Simple Example<2>, Next: General Python terminology, Prev: Concepts & Terminology, Up: An Introduction to Distutils + +17.1.2 A Simple Example +----------------------- + +The setup script is usually quite simple, although since it’s written in +Python, there are no arbitrary limits to what you can do with it, though +you should be careful about putting arbitrarily expensive operations in +your setup script. Unlike, say, Autoconf-style configure scripts, the +setup script may be run multiple times in the course of building and +installing your module distribution. + +If all you want to do is distribute a module called ‘foo’, contained in +a file ‘foo.py’, then your setup script can be as simple as this: + + from distutils.core import setup + setup(name='foo', + version='1.0', + py_modules=['foo'], + ) + +Some observations: + + * most information that you supply to the Distutils is supplied as + keyword arguments to the ‘setup()’ function + + * those keyword arguments fall into two categories: package metadata + (name, version number) and information about what’s in the package + (a list of pure Python modules, in this case) + + * modules are specified by module name, not filename (the same will + hold true for packages and extensions) + + * it’s recommended that you supply a little more metadata, in + particular your name, email address and a URL for the project (see + section *note Writing the Setup Script: 4ac1. for an example) + +To create a source distribution for this module, you would create a +setup script, ‘setup.py’, containing the above code, and run this +command from a terminal: + + python setup.py sdist + +For Windows, open a command prompt window (Start ‣ Accessories) and +change the command to: + + setup.py sdist + +‘sdist’ will create an archive file (e.g., tarball on Unix, ZIP file on +Windows) containing your setup script ‘setup.py’, and your module +‘foo.py’. The archive file will be named ‘foo-1.0.tar.gz’ (or ‘.zip’), +and will unpack into a directory ‘foo-1.0’. + +If an end-user wishes to install your ‘foo’ module, all they have to do +is download ‘foo-1.0.tar.gz’ (or ‘.zip’), unpack it, and—from the +‘foo-1.0’ directory—run + + python setup.py install + +which will ultimately copy ‘foo.py’ to the appropriate directory for +third-party modules in their Python installation. + +This simple example demonstrates some fundamental concepts of the +Distutils. First, both developers and installers have the same basic +user interface, i.e. the setup script. The difference is which +Distutils `commands' they use: the ‘sdist’ command is almost exclusively +for module developers, while ‘install’ is more often for installers +(although most developers will want to install their own code +occasionally). + +Other useful built distribution formats are RPM, implemented by the +‘bdist_rpm’ command, Solaris ‘pkgtool’ (‘bdist_pkgtool’), and HP-UX +‘swinstall’ (‘bdist_sdux’). For example, the following command will +create an RPM file called ‘foo-1.0.noarch.rpm’: + + python setup.py bdist_rpm + +(The ‘bdist_rpm’ command uses the ‘rpm’ executable, therefore this has +to be run on an RPM-based system such as Red Hat Linux, SuSE Linux, or +Mandrake Linux.) + +You can find out what distribution formats are available at any time by +running + + python setup.py bdist --help-formats + + +File: python.info, Node: General Python terminology, Next: Distutils-specific terminology, Prev: A Simple Example<2>, Up: An Introduction to Distutils + +17.1.3 General Python terminology +--------------------------------- + +If you’re reading this document, you probably have a good idea of what +modules, extensions, and so forth are. Nevertheless, just to be sure +that everyone is operating from a common starting point, we offer the +following glossary of common Python terms: + +module + + the basic unit of code reusability in Python: a block of code + imported by some other code. Three types of modules concern us + here: pure Python modules, extension modules, and packages. + +pure Python module + + a module written in Python and contained in a single ‘.py’ file + (and possibly associated ‘.pyc’ files). Sometimes referred to as a + “pure module.” + +extension module + + a module written in the low-level language of the Python + implementation: C/C++ for Python, Java for Jython. Typically + contained in a single dynamically loadable pre-compiled file, e.g. + a shared object (‘.so’) file for Python extensions on Unix, a DLL + (given the ‘.pyd’ extension) for Python extensions on Windows, or a + Java class file for Jython extensions. (Note that currently, the + Distutils only handles C/C++ extensions for Python.) + +package + + a module that contains other modules; typically contained in a + directory in the filesystem and distinguished from other + directories by the presence of a file ‘__init__.py’. + +root package + + the root of the hierarchy of packages. (This isn’t really a + package, since it doesn’t have an ‘__init__.py’ file. But we have + to call it something.) The vast majority of the standard library + is in the root package, as are many small, standalone third-party + modules that don’t belong to a larger module collection. Unlike + regular packages, modules in the root package can be found in many + directories: in fact, every directory listed in ‘sys.path’ + contributes modules to the root package. + + +File: python.info, Node: Distutils-specific terminology, Prev: General Python terminology, Up: An Introduction to Distutils + +17.1.4 Distutils-specific terminology +------------------------------------- + +The following terms apply more specifically to the domain of +distributing Python modules using the Distutils: + +module distribution + + a collection of Python modules distributed together as a single + downloadable resource and meant to be installed `en masse'. + Examples of some well-known module distributions are NumPy, SciPy, + Pillow, or mxBase. (This would be called a `package', except that + term is already taken in the Python context: a single module + distribution may contain zero, one, or many Python packages.) + +pure module distribution + + a module distribution that contains only pure Python modules and + packages. Sometimes referred to as a “pure distribution.” + +non-pure module distribution + + a module distribution that contains at least one extension module. + Sometimes referred to as a “non-pure distribution.” + +distribution root + + the top-level directory of your source tree (or source + distribution); the directory where ‘setup.py’ exists. Generally + ‘setup.py’ will be run from this directory. + + +File: python.info, Node: Writing the Setup Script, Next: Writing the Setup Configuration File, Prev: An Introduction to Distutils, Up: Distributing Python Modules Legacy version + +17.2 Writing the Setup Script +============================= + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +The setup script is the centre of all activity in building, +distributing, and installing modules using the Distutils. The main +purpose of the setup script is to describe your module distribution to +the Distutils, so that the various commands that operate on your modules +do the right thing. As we saw in section *note A Simple Example: 4ac0. +above, the setup script consists mainly of a call to ‘setup()’, and most +information supplied to the Distutils by the module developer is +supplied as keyword arguments to ‘setup()’. + +Here’s a slightly more involved example, which we’ll follow for the next +couple of sections: the Distutils’ own setup script. (Keep in mind that +although the Distutils are included with Python 1.6 and later, they also +have an independent existence so that Python 1.5.2 users can use them to +install other module distributions. The Distutils’ own setup script, +shown here, is used to install the package into Python 1.5.2.) + + #!/usr/bin/env python + + from distutils.core import setup + + setup(name='Distutils', + version='1.0', + description='Python Distribution Utilities', + author='Greg Ward', + author_email='gward@python.net', + url='https://www.python.org/sigs/distutils-sig/', + packages=['distutils', 'distutils.command'], + ) + +There are only two differences between this and the trivial one-file +distribution presented in section *note A Simple Example: 4ac0.: more +metadata, and the specification of pure Python modules by package, +rather than by module. This is important since the Distutils consist of +a couple of dozen modules split into (so far) two packages; an explicit +list of every module would be tedious to generate and difficult to +maintain. For more information on the additional meta-data, see section +*note Additional meta-data: 4ac8. + +Note that any pathnames (files or directories) supplied in the setup +script should be written using the Unix convention, i.e. +slash-separated. The Distutils will take care of converting this +platform-neutral representation into whatever is appropriate on your +current platform before actually using the pathname. This makes your +setup script portable across operating systems, which of course is one +of the major goals of the Distutils. In this spirit, all pathnames in +this document are slash-separated. + +This, of course, only applies to pathnames given to Distutils functions. +If you, for example, use standard Python functions such as *note +glob.glob(): 3f8. or *note os.listdir(): da5. to specify files, you +should be careful to write portable code instead of hardcoding path +separators: + + glob.glob(os.path.join('mydir', 'subdir', '*.html')) + os.listdir(os.path.join('mydir', 'subdir')) + +* Menu: + +* Listing whole packages:: +* Listing individual modules:: +* Describing extension modules:: +* Relationships between Distributions and Packages:: +* Installing Scripts:: +* Installing Package Data:: +* Installing Additional Files:: +* Additional meta-data:: +* Debugging the setup script:: + + +File: python.info, Node: Listing whole packages, Next: Listing individual modules, Up: Writing the Setup Script + +17.2.1 Listing whole packages +----------------------------- + +The ‘packages’ option tells the Distutils to process (build, distribute, +install, etc.) all pure Python modules found in each package mentioned +in the ‘packages’ list. In order to do this, of course, there has to be +a correspondence between package names and directories in the +filesystem. The default correspondence is the most obvious one, i.e. +package *note distutils: 37. is found in the directory ‘distutils’ +relative to the distribution root. Thus, when you say ‘packages = +['foo']’ in your setup script, you are promising that the Distutils will +find a file ‘foo/__init__.py’ (which might be spelled differently on +your system, but you get the idea) relative to the directory where your +setup script lives. If you break this promise, the Distutils will issue +a warning but still process the broken package anyway. + +If you use a different convention to lay out your source directory, +that’s no problem: you just have to supply the ‘package_dir’ option to +tell the Distutils about your convention. For example, say you keep all +Python source under ‘lib’, so that modules in the “root package” (i.e., +not in any package at all) are in ‘lib’, modules in the ‘foo’ package +are in ‘lib/foo’, and so forth. Then you would put + + package_dir = {'': 'lib'} + +in your setup script. The keys to this dictionary are package names, +and an empty package name stands for the root package. The values are +directory names relative to your distribution root. In this case, when +you say ‘packages = ['foo']’, you are promising that the file +‘lib/foo/__init__.py’ exists. + +Another possible convention is to put the ‘foo’ package right in ‘lib’, +the ‘foo.bar’ package in ‘lib/bar’, etc. This would be written in the +setup script as + + package_dir = {'foo': 'lib'} + +A ‘package: dir’ entry in the ‘package_dir’ dictionary implicitly +applies to all packages below `package', so the ‘foo.bar’ case is +automatically handled here. In this example, having ‘packages = ['foo', +'foo.bar']’ tells the Distutils to look for ‘lib/__init__.py’ and +‘lib/bar/__init__.py’. (Keep in mind that although ‘package_dir’ +applies recursively, you must explicitly list all packages in +‘packages’: the Distutils will `not' recursively scan your source tree +looking for any directory with an ‘__init__.py’ file.) + + +File: python.info, Node: Listing individual modules, Next: Describing extension modules, Prev: Listing whole packages, Up: Writing the Setup Script + +17.2.2 Listing individual modules +--------------------------------- + +For a small module distribution, you might prefer to list all modules +rather than listing packages—especially the case of a single module that +goes in the “root package” (i.e., no package at all). This simplest +case was shown in section *note A Simple Example: 4ac0.; here is a +slightly more involved example: + + py_modules = ['mod1', 'pkg.mod2'] + +This describes two modules, one of them in the “root” package, the other +in the ‘pkg’ package. Again, the default package/directory layout +implies that these two modules can be found in ‘mod1.py’ and +‘pkg/mod2.py’, and that ‘pkg/__init__.py’ exists as well. And again, +you can override the package/directory correspondence using the +‘package_dir’ option. + + +File: python.info, Node: Describing extension modules, Next: Relationships between Distributions and Packages, Prev: Listing individual modules, Up: Writing the Setup Script + +17.2.3 Describing extension modules +----------------------------------- + +Just as writing Python extension modules is a bit more complicated than +writing pure Python modules, describing them to the Distutils is a bit +more complicated. Unlike pure modules, it’s not enough just to list +modules or packages and expect the Distutils to go out and find the +right files; you have to specify the extension name, source file(s), and +any compile/link requirements (include directories, libraries to link +with, etc.). + +All of this is done through another keyword argument to ‘setup()’, the +‘ext_modules’ option. ‘ext_modules’ is just a list of *note Extension: +4acf. instances, each of which describes a single extension module. +Suppose your distribution includes a single extension, called ‘foo’ and +implemented by ‘foo.c’. If no additional instructions to the +compiler/linker are needed, describing this extension is quite simple: + + Extension('foo', ['foo.c']) + +The ‘Extension’ class can be imported from *note distutils.core: 50. +along with ‘setup()’. Thus, the setup script for a module distribution +that contains only this one extension and nothing else might be: + + from distutils.core import setup, Extension + setup(name='foo', + version='1.0', + ext_modules=[Extension('foo', ['foo.c'])], + ) + +The ‘Extension’ class (actually, the underlying extension-building +machinery implemented by the ‘build_ext’ command) supports a great deal +of flexibility in describing Python extensions, which is explained in +the following sections. + +* Menu: + +* Extension names and packages:: +* Extension source files:: +* Preprocessor options:: +* Library options:: +* Other options:: + + +File: python.info, Node: Extension names and packages, Next: Extension source files, Up: Describing extension modules + +17.2.3.1 Extension names and packages +..................................... + +The first argument to the *note Extension: 4acf. constructor is always +the name of the extension, including any package names. For example, + + Extension('foo', ['src/foo1.c', 'src/foo2.c']) + +describes an extension that lives in the root package, while + + Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c']) + +describes the same extension in the ‘pkg’ package. The source files and +resulting object code are identical in both cases; the only difference +is where in the filesystem (and therefore where in Python’s namespace +hierarchy) the resulting extension lives. + +If you have a number of extensions all in the same package (or all under +the same base package), use the ‘ext_package’ keyword argument to +‘setup()’. For example, + + setup(..., + ext_package='pkg', + ext_modules=[Extension('foo', ['foo.c']), + Extension('subpkg.bar', ['bar.c'])], + ) + +will compile ‘foo.c’ to the extension ‘pkg.foo’, and ‘bar.c’ to +‘pkg.subpkg.bar’. + + +File: python.info, Node: Extension source files, Next: Preprocessor options, Prev: Extension names and packages, Up: Describing extension modules + +17.2.3.2 Extension source files +............................... + +The second argument to the *note Extension: 4acf. constructor is a list +of source files. Since the Distutils currently only support C, C++, and +Objective-C extensions, these are normally C/C++/Objective-C source +files. (Be sure to use appropriate extensions to distinguish C++ source +files: ‘.cc’ and ‘.cpp’ seem to be recognized by both Unix and Windows +compilers.) + +However, you can also include SWIG interface (‘.i’) files in the list; +the ‘build_ext’ command knows how to deal with SWIG extensions: it will +run SWIG on the interface file and compile the resulting C/C++ file into +your extension. + +This warning notwithstanding, options to SWIG can be currently passed +like this: + + setup(..., + ext_modules=[Extension('_foo', ['foo.i'], + swig_opts=['-modern', '-I../include'])], + py_modules=['foo'], + ) + +Or on the commandline like this: + + > python setup.py build_ext --swig-opts="-modern -I../include" + +On some platforms, you can include non-source files that are processed +by the compiler and included in your extension. Currently, this just +means Windows message text (‘.mc’) files and resource definition (‘.rc’) +files for Visual C++. These will be compiled to binary resource +(‘.res’) files and linked into the executable. + + +File: python.info, Node: Preprocessor options, Next: Library options, Prev: Extension source files, Up: Describing extension modules + +17.2.3.3 Preprocessor options +............................. + +Three optional arguments to *note Extension: 4acf. will help if you need +to specify include directories to search or preprocessor macros to +define/undefine: ‘include_dirs’, ‘define_macros’, and ‘undef_macros’. + +For example, if your extension requires header files in the ‘include’ +directory under your distribution root, use the ‘include_dirs’ option: + + Extension('foo', ['foo.c'], include_dirs=['include']) + +You can specify absolute directories there; if you know that your +extension will only be built on Unix systems with X11R6 installed to +‘/usr’, you can get away with + + Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11']) + +You should avoid this sort of non-portable usage if you plan to +distribute your code: it’s probably better to write C code like + + #include + +If you need to include header files from some other Python extension, +you can take advantage of the fact that header files are installed in a +consistent way by the Distutils ‘install_headers’ command. For example, +the Numerical Python header files are installed (on a standard Unix +installation) to ‘/usr/local/include/python1.5/Numerical’. (The exact +location will differ according to your platform and Python +installation.) Since the Python include +directory—‘/usr/local/include/python1.5’ in this case—is always included +in the search path when building Python extensions, the best approach is +to write C code like + + #include + +If you must put the ‘Numerical’ include directory right into your header +search path, though, you can find that directory using the Distutils +*note distutils.sysconfig: 5e. module: + + from distutils.sysconfig import get_python_inc + incdir = os.path.join(get_python_inc(plat_specific=1), 'Numerical') + setup(..., + Extension(..., include_dirs=[incdir]), + ) + +Even though this is quite portable—it will work on any Python +installation, regardless of platform—it’s probably easier to just write +your C code in the sensible way. + +You can define and undefine pre-processor macros with the +‘define_macros’ and ‘undef_macros’ options. ‘define_macros’ takes a +list of ‘(name, value)’ tuples, where ‘name’ is the name of the macro to +define (a string) and ‘value’ is its value: either a string or ‘None’. +(Defining a macro ‘FOO’ to ‘None’ is the equivalent of a bare ‘#define +FOO’ in your C source: with most compilers, this sets ‘FOO’ to the +string ‘1’.) ‘undef_macros’ is just a list of macros to undefine. + +For example: + + Extension(..., + define_macros=[('NDEBUG', '1'), + ('HAVE_STRFTIME', None)], + undef_macros=['HAVE_FOO', 'HAVE_BAR']) + +is the equivalent of having this at the top of every C source file: + + #define NDEBUG 1 + #define HAVE_STRFTIME + #undef HAVE_FOO + #undef HAVE_BAR + + +File: python.info, Node: Library options, Next: Other options, Prev: Preprocessor options, Up: Describing extension modules + +17.2.3.4 Library options +........................ + +You can also specify the libraries to link against when building your +extension, and the directories to search for those libraries. The +‘libraries’ option is a list of libraries to link against, +‘library_dirs’ is a list of directories to search for libraries at +link-time, and ‘runtime_library_dirs’ is a list of directories to search +for shared (dynamically loaded) libraries at run-time. + +For example, if you need to link against libraries known to be in the +standard library search path on target systems + + Extension(..., + libraries=['gdbm', 'readline']) + +If you need to link with libraries in a non-standard location, you’ll +have to include the location in ‘library_dirs’: + + Extension(..., + library_dirs=['/usr/X11R6/lib'], + libraries=['X11', 'Xt']) + +(Again, this sort of non-portable construct should be avoided if you +intend to distribute your code.) + + +File: python.info, Node: Other options, Prev: Library options, Up: Describing extension modules + +17.2.3.5 Other options +...................... + +There are still some other options which can be used to handle special +cases. + +The ‘optional’ option is a boolean; if it is true, a build failure in +the extension will not abort the build process, but instead simply not +install the failing extension. + +The ‘extra_objects’ option is a list of object files to be passed to the +linker. These files must not have extensions, as the default extension +for the compiler is used. + +‘extra_compile_args’ and ‘extra_link_args’ can be used to specify +additional command line options for the respective compiler and linker +command lines. + +‘export_symbols’ is only useful on Windows. It can contain a list of +symbols (functions or variables) to be exported. This option is not +needed when building compiled extensions: Distutils will automatically +add ‘initmodule’ to the list of exported symbols. + +The ‘depends’ option is a list of files that the extension depends on +(for example header files). The build command will call the compiler on +the sources to rebuild extension if any on this files has been modified +since the previous build. + + +File: python.info, Node: Relationships between Distributions and Packages, Next: Installing Scripts, Prev: Describing extension modules, Up: Writing the Setup Script + +17.2.4 Relationships between Distributions and Packages +------------------------------------------------------- + +A distribution may relate to packages in three specific ways: + + 1. It can require packages or modules. + + 2. It can provide packages or modules. + + 3. It can obsolete packages or modules. + +These relationships can be specified using keyword arguments to the +*note distutils.core.setup(): 4294. function. + +Dependencies on other Python modules and packages can be specified by +supplying the `requires' keyword argument to ‘setup()’. The value must +be a list of strings. Each string specifies a package that is required, +and optionally what versions are sufficient. + +To specify that any version of a module or package is required, the +string should consist entirely of the module or package name. Examples +include ‘'mymodule'’ and ‘'xml.parsers.expat'’. + +If specific versions are required, a sequence of qualifiers can be +supplied in parentheses. Each qualifier may consist of a comparison +operator and a version number. The accepted comparison operators are: + + < > == + <= >= != + +These can be combined by using multiple qualifiers separated by commas +(and optional whitespace). In this case, all of the qualifiers must be +matched; a logical AND is used to combine the evaluations. + +Let’s look at a bunch of examples: + +Requires Expression Explanation + +--------------------------------------------------------------------------------- + +‘==1.0’ Only version ‘1.0’ is compatible + + +‘>1.0, !=1.5.1, <2.0’ Any version after ‘1.0’ and before ‘2.0’ is + compatible, except ‘1.5.1’ + + +Now that we can specify dependencies, we also need to be able to specify +what we provide that other distributions can require. This is done +using the `provides' keyword argument to ‘setup()’. The value for this +keyword is a list of strings, each of which names a Python module or +package, and optionally identifies the version. If the version is not +specified, it is assumed to match that of the distribution. + +Some examples: + +Provides Expression Explanation + +----------------------------------------------------------------------------- + +‘mypkg’ Provide ‘mypkg’, using the distribution version + + +‘mypkg (1.1)’ Provide ‘mypkg’ version 1.1, regardless of the + distribution version + + +A package can declare that it obsoletes other packages using the +`obsoletes' keyword argument. The value for this is similar to that of +the `requires' keyword: a list of strings giving module or package +specifiers. Each specifier consists of a module or package name +optionally followed by one or more version qualifiers. Version +qualifiers are given in parentheses after the module or package name. + +The versions identified by the qualifiers are those that are obsoleted +by the distribution being described. If no qualifiers are given, all +versions of the named module or package are understood to be obsoleted. + + +File: python.info, Node: Installing Scripts, Next: Installing Package Data, Prev: Relationships between Distributions and Packages, Up: Writing the Setup Script + +17.2.5 Installing Scripts +------------------------- + +So far we have been dealing with pure and non-pure Python modules, which +are usually not run by themselves but imported by scripts. + +Scripts are files containing Python source code, intended to be started +from the command line. Scripts don’t require Distutils to do anything +very complicated. The only clever feature is that if the first line of +the script starts with ‘#!’ and contains the word “python”, the +Distutils will adjust the first line to refer to the current interpreter +location. By default, it is replaced with the current interpreter +location. The ‘--executable’ (or ‘-e’) option will allow the +interpreter path to be explicitly overridden. + +The ‘scripts’ option simply is a list of files to be handled in this +way. From the PyXML setup script: + + setup(..., + scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val'] + ) + +Changed in version 3.1: All the scripts will also be added to the +‘MANIFEST’ file if no template is provided. See *note Specifying the +files to distribute: 4297. + + +File: python.info, Node: Installing Package Data, Next: Installing Additional Files, Prev: Installing Scripts, Up: Writing the Setup Script + +17.2.6 Installing Package Data +------------------------------ + +Often, additional files need to be installed into a package. These +files are often data that’s closely related to the package’s +implementation, or text files containing documentation that might be of +interest to programmers using the package. These files are called +`package data'. + +Package data can be added to packages using the ‘package_data’ keyword +argument to the ‘setup()’ function. The value must be a mapping from +package name to a list of relative path names that should be copied into +the package. The paths are interpreted as relative to the directory +containing the package (information from the ‘package_dir’ mapping is +used if appropriate); that is, the files are expected to be part of the +package in the source directories. They may contain glob patterns as +well. + +The path names may contain directory portions; any necessary directories +will be created in the installation. + +For example, if a package should contain a subdirectory with several +data files, the files can be arranged like this in the source tree: + + setup.py + src/ + mypkg/ + __init__.py + module.py + data/ + tables.dat + spoons.dat + forks.dat + +The corresponding call to ‘setup()’ might be: + + setup(..., + packages=['mypkg'], + package_dir={'mypkg': 'src/mypkg'}, + package_data={'mypkg': ['data/*.dat']}, + ) + +Changed in version 3.1: All the files that match ‘package_data’ will be +added to the ‘MANIFEST’ file if no template is provided. See *note +Specifying the files to distribute: 4297. + + +File: python.info, Node: Installing Additional Files, Next: Additional meta-data, Prev: Installing Package Data, Up: Writing the Setup Script + +17.2.7 Installing Additional Files +---------------------------------- + +The ‘data_files’ option can be used to specify additional files needed +by the module distribution: configuration files, message catalogs, data +files, anything which doesn’t fit in the previous categories. + +‘data_files’ specifies a sequence of (`directory', `files') pairs in the +following way: + + setup(..., + data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), + ('config', ['cfg/data.cfg'])], + ) + +Each (`directory', `files') pair in the sequence specifies the +installation directory and the files to install there. + +Each file name in `files' is interpreted relative to the ‘setup.py’ +script at the top of the package source distribution. Note that you can +specify the directory where the data files will be installed, but you +cannot rename the data files themselves. + +The `directory' should be a relative path. It is interpreted relative +to the installation prefix (Python’s ‘sys.prefix’ for system +installations; ‘site.USER_BASE’ for user installations). Distutils +allows `directory' to be an absolute installation path, but this is +discouraged since it is incompatible with the wheel packaging format. +No directory information from `files' is used to determine the final +location of the installed file; only the name of the file is used. + +You can specify the ‘data_files’ options as a simple sequence of files +without specifying a target directory, but this is not recommended, and +the ‘install’ command will print a warning in this case. To install +data files directly in the target directory, an empty string should be +given as the directory. + +Changed in version 3.1: All the files that match ‘data_files’ will be +added to the ‘MANIFEST’ file if no template is provided. See *note +Specifying the files to distribute: 4297. + + +File: python.info, Node: Additional meta-data, Next: Debugging the setup script, Prev: Installing Additional Files, Up: Writing the Setup Script + +17.2.8 Additional meta-data +--------------------------- + +The setup script may include additional meta-data beyond the name and +version. This information includes: + +Meta-Data Description Value Notes + +---------------------------------------------------------------------------------------------- + +‘name’ name of the package short string (1) + + +‘version’ version of this release short string (1)(2) + + +‘author’ package author’s name short string (3) + + +‘author_email’ email address of the package email address (3) + author + + +‘maintainer’ package maintainer’s name short string (3) + + +‘maintainer_email’ email address of the package email address (3) + maintainer + + +‘url’ home page for the package URL (1) + + +‘description’ short, summary description of short string + the package + + +‘long_description’ longer description of the long string (4) + package + + +‘download_url’ location where the package URL + may be downloaded + + +‘classifiers’ a list of classifiers list of strings (6)(7) + + +‘platforms’ a list of platforms list of strings (6)(8) + + +‘keywords’ a list of keywords list of strings (6)(8) + + +‘license’ license for the package short string (5) + + +Notes: + + 1. These fields are required. + + 2. It is recommended that versions take the form + `major.minor[.patch[.sub]]'. + + 3. Either the author or the maintainer must be identified. If + maintainer is provided, distutils lists it as the author in + ‘PKG-INFO’. + + 4. The ‘long_description’ field is used by PyPI when you publish a + package, to build its project page. + + 5. The ‘license’ field is a text indicating the license covering the + package where the license is not a selection from the “License” + Trove classifiers. See the ‘Classifier’ field. Notice that + there’s a ‘licence’ distribution option which is deprecated but + still acts as an alias for ‘license’. + + 6. This field must be a list. + + 7. The valid classifiers are listed on PyPI(1). + + 8. To preserve backward compatibility, this field also accepts a + string. If you pass a comma-separated string ‘'foo, bar'’, it will + be converted to ‘['foo', 'bar']’, Otherwise, it will be converted + to a list of one string. + +‘short string’ + + A single line of text, not more than 200 characters. + +‘long string’ + + Multiple lines of plain text in reStructuredText format (see + ‘http://docutils.sourceforge.net/’). + +‘list of strings’ + + See below. + +Encoding the version information is an art in itself. Python packages +generally adhere to the version format `major.minor[.patch][sub]'. The +major number is 0 for initial, experimental releases of software. It is +incremented for releases that represent major milestones in a package. +The minor number is incremented when important new features are added to +the package. The patch number increments when bug-fix releases are +made. Additional trailing version information is sometimes used to +indicate sub-releases. These are “a1,a2,…,aN” (for alpha releases, +where functionality and API may change), “b1,b2,…,bN” (for beta +releases, which only fix bugs) and “pr1,pr2,…,prN” (for final +pre-release release testing). Some examples: + +0.1.0 + + the first, experimental release of a package + +1.0.1a2 + + the second alpha release of the first patch version of 1.0 + +‘classifiers’ must be specified in a list: + + setup(..., + classifiers=[ + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Environment :: Web Environment', + 'Intended Audience :: End Users/Desktop', + 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Python Software Foundation License', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX', + 'Programming Language :: Python', + 'Topic :: Communications :: Email', + 'Topic :: Office/Business', + 'Topic :: Software Development :: Bug Tracking', + ], + ) + +Changed in version 3.7: *note setup: 4294. now warns when ‘classifiers’, +‘keywords’ or ‘platforms’ fields are not specified as a list or a +string. + + ---------- Footnotes ---------- + + (1) https://pypi.org/classifiers + + +File: python.info, Node: Debugging the setup script, Prev: Additional meta-data, Up: Writing the Setup Script + +17.2.9 Debugging the setup script +--------------------------------- + +Sometimes things go wrong, and the setup script doesn’t do what the +developer wants. + +Distutils catches any exceptions when running the setup script, and +print a simple error message before the script is terminated. The +motivation for this behaviour is to not confuse administrators who don’t +know much about Python and are trying to install a package. If they get +a big long traceback from deep inside the guts of Distutils, they may +think the package or the Python installation is broken because they +don’t read all the way down to the bottom and see that it’s a permission +problem. + +On the other hand, this doesn’t help the developer to find the cause of +the failure. For this purpose, the ‘DISTUTILS_DEBUG’ environment +variable can be set to anything except an empty string, and distutils +will now print detailed information about what it is doing, dump the +full traceback when an exception occurs, and print the whole command +line when an external program (like a C compiler) fails. + + +File: python.info, Node: Writing the Setup Configuration File, Next: Creating a Source Distribution, Prev: Writing the Setup Script, Up: Distributing Python Modules Legacy version + +17.3 Writing the Setup Configuration File +========================================= + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +Often, it’s not possible to write down everything needed to build a +distribution `a priori': you may need to get some information from the +user, or from the user’s system, in order to proceed. As long as that +information is fairly simple—a list of directories to search for C +header files or libraries, for example—then providing a configuration +file, ‘setup.cfg’, for users to edit is a cheap and easy way to solicit +it. Configuration files also let you provide default values for any +command option, which the installer can then override either on the +command-line or by editing the config file. + +The setup configuration file is a useful middle-ground between the setup +script—which, ideally, would be opaque to installers (1)—and the +command-line to the setup script, which is outside of your control and +entirely up to the installer. In fact, ‘setup.cfg’ (and any other +Distutils configuration files present on the target system) are +processed after the contents of the setup script, but before the +command-line. This has several useful consequences: + + * installers can override some of what you put in ‘setup.py’ by + editing ‘setup.cfg’ + + * you can provide non-standard defaults for options that are not + easily set in ‘setup.py’ + + * installers can override anything in ‘setup.cfg’ using the + command-line options to ‘setup.py’ + +The basic syntax of the configuration file is simple: + + [command] + option=value + ... + +where `command' is one of the Distutils commands (e.g. ‘build_py’, +‘install’), and `option' is one of the options that command supports. +Any number of options can be supplied for each command, and any number +of command sections can be included in the file. Blank lines are +ignored, as are comments, which run from a ‘'#'’ character until the end +of the line. Long option values can be split across multiple lines +simply by indenting the continuation lines. + +You can find out the list of options supported by a particular command +with the universal ‘--help’ option, e.g. + + $ python setup.py --help build_ext + [...] + Options for 'build_ext' command: + --build-lib (-b) directory for compiled extension modules + --build-temp (-t) directory for temporary files (build by-products) + --inplace (-i) ignore build-lib and put compiled extensions into the + source directory alongside your pure Python modules + --include-dirs (-I) list of directories to search for header files + --define (-D) C preprocessor macros to define + --undef (-U) C preprocessor macros to undefine + --swig-opts list of SWIG command line options + [...] + +Note that an option spelled ‘--foo-bar’ on the command-line is spelled +‘foo_bar’ in configuration files. For example, say you want your +extensions to be built “in-place”—that is, you have an extension +‘pkg.ext’, and you want the compiled extension file (‘ext.so’ on Unix, +say) to be put in the same source directory as your pure Python modules +‘pkg.mod1’ and ‘pkg.mod2’. You can always use the ‘--inplace’ option on +the command-line to ensure this: + + python setup.py build_ext --inplace + +But this requires that you always specify the ‘build_ext’ command +explicitly, and remember to provide ‘--inplace’. An easier way is to +“set and forget” this option, by encoding it in ‘setup.cfg’, the +configuration file for this distribution: + + [build_ext] + inplace=1 + +This will affect all builds of this module distribution, whether or not +you explicitly specify ‘build_ext’. If you include ‘setup.cfg’ in your +source distribution, it will also affect end-user builds—which is +probably a bad idea for this option, since always building extensions +in-place would break installation of the module distribution. In +certain peculiar cases, though, modules are built right in their +installation directory, so this is conceivably a useful ability. +(Distributing extensions that expect to be built in their installation +directory is almost always a bad idea, though.) + +Another example: certain commands take a lot of options that don’t +change from run to run; for example, ‘bdist_rpm’ needs to know +everything required to generate a “spec” file for creating an RPM +distribution. Some of this information comes from the setup script, and +some is automatically generated by the Distutils (such as the list of +files installed). But some of it has to be supplied as options to +‘bdist_rpm’, which would be very tedious to do on the command-line for +every run. Hence, here is a snippet from the Distutils’ own +‘setup.cfg’: + + [bdist_rpm] + release = 1 + packager = Greg Ward + doc_files = CHANGES.txt + README.txt + USAGE.txt + doc/ + examples/ + +Note that the ‘doc_files’ option is simply a whitespace-separated string +split across multiple lines for readability. + +See also +........ + +*note Syntax of config files: 4ae3. in “Installing Python Modules” + + More information on the configuration files is available in the + manual for system administrators. + + ---------- Footnotes ---------- + + (1) This ideal probably won’t be achieved until auto-configuration is +fully supported by the Distutils. + + +File: python.info, Node: Creating a Source Distribution, Next: Creating Built Distributions, Prev: Writing the Setup Configuration File, Up: Distributing Python Modules Legacy version + +17.4 Creating a Source Distribution +=================================== + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +As shown in section *note A Simple Example: 4ac0, you use the ‘sdist’ +command to create a source distribution. In the simplest case, + + python setup.py sdist + +(assuming you haven’t specified any ‘sdist’ options in the setup script +or config file), ‘sdist’ creates the archive of the default format for +the current platform. The default format is a gzip’ed tar file +(‘.tar.gz’) on Unix, and ZIP file on Windows. + +You can specify as many formats as you like using the ‘--formats’ +option, for example: + + python setup.py sdist --formats=gztar,zip + +to create a gzipped tarball and a zip file. The available formats are: + +Format Description Notes + +---------------------------------------------------------------- + +‘zip’ zip file (‘.zip’) (1),(3) + + +‘gztar’ gzip’ed tar file (2) + (‘.tar.gz’) + + +‘bztar’ bzip2’ed tar file (5) + (‘.tar.bz2’) + + +‘xztar’ xz’ed tar file (‘.tar.xz’) (5) + + +‘ztar’ compressed tar file (4),(5) + (‘.tar.Z’) + + +‘tar’ tar file (‘.tar’) (5) + + +Changed in version 3.5: Added support for the ‘xztar’ format. + +Notes: + + 1. default on Windows + + 2. default on Unix + + 3. requires either external ‘zip’ utility or *note zipfile: 14d. + module (part of the standard Python library since Python 1.6) + + 4. requires the ‘compress’ program. Notice that this format is now + pending for deprecation and will be removed in the future versions + of Python. + + 5. deprecated by PEP 527(1); PyPI(2) only accepts ‘.zip’ and ‘.tar.gz’ + files. + +When using any ‘tar’ format (‘gztar’, ‘bztar’, ‘xztar’, ‘ztar’ or +‘tar’), under Unix you can specify the ‘owner’ and ‘group’ names that +will be set for each member of the archive. + +For example, if you want all files of the archive to be owned by root: + + python setup.py sdist --owner=root --group=root + +* Menu: + +* Specifying the files to distribute:: +* Manifest-related options:: + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0527/ + + (2) https://pypi.org + + +File: python.info, Node: Specifying the files to distribute, Next: Manifest-related options, Up: Creating a Source Distribution + +17.4.1 Specifying the files to distribute +----------------------------------------- + +If you don’t supply an explicit list of files (or instructions on how to +generate one), the ‘sdist’ command puts a minimal default set into the +source distribution: + + * all Python source files implied by the ‘py_modules’ and ‘packages’ + options + + * all C source files mentioned in the ‘ext_modules’ or ‘libraries’ + options + + * scripts identified by the ‘scripts’ option See *note Installing + Scripts: 4ad6. + + * anything that looks like a test script: ‘test/test*.py’ (currently, + the Distutils don’t do anything with test scripts except include + them in source distributions, but in the future there will be a + standard for testing Python module distributions) + + * Any of the standard README files (‘README’, ‘README.txt’, or + ‘README.rst’), ‘setup.py’ (or whatever you called your setup + script), and ‘setup.cfg’. + + * all files that matches the ‘package_data’ metadata. See *note + Installing Package Data: 4ad8. + + * all files that matches the ‘data_files’ metadata. See *note + Installing Additional Files: 4ada. + +Sometimes this is enough, but usually you will want to specify +additional files to distribute. The typical way to do this is to write +a `manifest template', called ‘MANIFEST.in’ by default. The manifest +template is just a list of instructions for how to generate your +manifest file, ‘MANIFEST’, which is the exact list of files to include +in your source distribution. The ‘sdist’ command processes this +template and generates a manifest based on its instructions and what it +finds in the filesystem. + +If you prefer to roll your own manifest file, the format is simple: one +filename per line, regular files (or symlinks to them) only. If you do +supply your own ‘MANIFEST’, you must specify everything: the default set +of files described above does not apply in this case. + +Changed in version 3.1: An existing generated ‘MANIFEST’ will be +regenerated without ‘sdist’ comparing its modification time to the one +of ‘MANIFEST.in’ or ‘setup.py’. + +Changed in version 3.1.3: ‘MANIFEST’ files start with a comment +indicating they are generated. Files without this comment are not +overwritten or removed. + +Changed in version 3.2.2: ‘sdist’ will read a ‘MANIFEST’ file if no +‘MANIFEST.in’ exists, like it used to do. + +Changed in version 3.7: ‘README.rst’ is now included in the list of +distutils standard READMEs. + +The manifest template has one command per line, where each command +specifies a set of files to include or exclude from the source +distribution. For an example, again we turn to the Distutils’ own +manifest template: + + include *.txt + recursive-include examples *.txt *.py + prune examples/sample?/build + +The meanings should be fairly clear: include all files in the +distribution root matching ‘*.txt’, all files anywhere under the +‘examples’ directory matching ‘*.txt’ or ‘*.py’, and exclude all +directories matching ‘examples/sample?/build’. All of this is done +`after' the standard include set, so you can exclude files from the +standard set with explicit instructions in the manifest template. (Or, +you can use the ‘--no-defaults’ option to disable the standard set +entirely.) There are several other commands available in the manifest +template mini-language; see section *note Creating a source +distribution; the sdist command: 4ae8. + +The order of commands in the manifest template matters: initially, we +have the list of default files as described above, and each command in +the template adds to or removes from that list of files. Once we have +fully processed the manifest template, we remove files that should not +be included in the source distribution: + + * all files in the Distutils “build” tree (default ‘build/’) + + * all files in directories named ‘RCS’, ‘CVS’, ‘.svn’, ‘.hg’, ‘.git’, + ‘.bzr’ or ‘_darcs’ + +Now we have our complete list of files, which is written to the manifest +for future reference, and then used to build the source distribution +archive(s). + +You can disable the default set of included files with the +‘--no-defaults’ option, and you can disable the standard exclude set +with ‘--no-prune’. + +Following the Distutils’ own manifest template, let’s trace how the +‘sdist’ command builds the list of files to include in the Distutils +source distribution: + + 1. include all Python source files in the ‘distutils’ and + ‘distutils/command’ subdirectories (because packages corresponding + to those two directories were mentioned in the ‘packages’ option in + the setup script—see section *note Writing the Setup Script: 4ac1.) + + 2. include ‘README.txt’, ‘setup.py’, and ‘setup.cfg’ (standard files) + + 3. include ‘test/test*.py’ (standard files) + + 4. include ‘*.txt’ in the distribution root (this will find + ‘README.txt’ a second time, but such redundancies are weeded out + later) + + 5. include anything matching ‘*.txt’ or ‘*.py’ in the sub-tree under + ‘examples’, + + 6. exclude all files in the sub-trees starting at directories matching + ‘examples/sample?/build’—this may exclude files included by the + previous two steps, so it’s important that the ‘prune’ command in + the manifest template comes after the ‘recursive-include’ command + + 7. exclude the entire ‘build’ tree, and any ‘RCS’, ‘CVS’, ‘.svn’, + ‘.hg’, ‘.git’, ‘.bzr’ and ‘_darcs’ directories + +Just like in the setup script, file and directory names in the manifest +template should always be slash-separated; the Distutils will take care +of converting them to the standard representation on your platform. +That way, the manifest template is portable across operating systems. + + +File: python.info, Node: Manifest-related options, Prev: Specifying the files to distribute, Up: Creating a Source Distribution + +17.4.2 Manifest-related options +------------------------------- + +The normal course of operations for the ‘sdist’ command is as follows: + + * if the manifest file (‘MANIFEST’ by default) exists and the first + line does not have a comment indicating it is generated from + ‘MANIFEST.in’, then it is used as is, unaltered + + * if the manifest file doesn’t exist or has been previously + automatically generated, read ‘MANIFEST.in’ and create the manifest + + * if neither ‘MANIFEST’ nor ‘MANIFEST.in’ exist, create a manifest + with just the default file set + + * use the list of files now in ‘MANIFEST’ (either just generated or + read in) to create the source distribution archive(s) + +There are a couple of options that modify this behaviour. First, use +the ‘--no-defaults’ and ‘--no-prune’ to disable the standard “include” +and “exclude” sets. + +Second, you might just want to (re)generate the manifest, but not create +a source distribution: + + python setup.py sdist --manifest-only + +‘-o’ is a shortcut for ‘--manifest-only’. + + +File: python.info, Node: Creating Built Distributions, Next: Distutils Examples, Prev: Creating a Source Distribution, Up: Distributing Python Modules Legacy version + +17.5 Creating Built Distributions +================================= + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +A “built distribution” is what you’re probably used to thinking of +either as a “binary package” or an “installer” (depending on your +background). It’s not necessarily binary, though, because it might +contain only Python source code and/or byte-code; and we don’t call it a +package, because that word is already spoken for in Python. (And +“installer” is a term specific to the world of mainstream desktop +systems.) + +A built distribution is how you make life as easy as possible for +installers of your module distribution: for users of RPM-based Linux +systems, it’s a binary RPM; for Windows users, it’s an executable +installer; for Debian-based Linux users, it’s a Debian package; and so +forth. Obviously, no one person will be able to create built +distributions for every platform under the sun, so the Distutils are +designed to enable module developers to concentrate on their +specialty—writing code and creating source distributions—while an +intermediary species called `packagers' springs up to turn source +distributions into built distributions for as many platforms as there +are packagers. + +Of course, the module developer could be their own packager; or the +packager could be a volunteer “out there” somewhere who has access to a +platform which the original developer does not; or it could be software +periodically grabbing new source distributions and turning them into +built distributions for as many platforms as the software has access to. +Regardless of who they are, a packager uses the setup script and the +‘bdist’ command family to generate built distributions. + +As a simple example, if I run the following command in the Distutils +source tree: + + python setup.py bdist + +then the Distutils builds my module distribution (the Distutils itself +in this case), does a “fake” installation (also in the ‘build’ +directory), and creates the default type of built distribution for my +platform. The default format for built distributions is a “dumb” tar +file on Unix, and a simple executable installer on Windows. (That tar +file is considered “dumb” because it has to be unpacked in a specific +location to work.) + +Thus, the above command on a Unix system creates +‘Distutils-1.0.`plat'.tar.gz’; unpacking this tarball from the right +place installs the Distutils just as though you had downloaded the +source distribution and run ‘python setup.py install’. (The “right +place” is either the root of the filesystem or Python’s ‘`prefix'’ +directory, depending on the options given to the ‘bdist_dumb’ command; +the default is to make dumb distributions relative to ‘`prefix'’.) + +Obviously, for pure Python distributions, this isn’t any simpler than +just running ‘python setup.py install’—but for non-pure distributions, +which include extensions that would need to be compiled, it can mean the +difference between someone being able to use your extensions or not. +And creating “smart” built distributions, such as an RPM package or an +executable installer for Windows, is far more convenient for users even +if your distribution doesn’t include any extensions. + +The ‘bdist’ command has a ‘--formats’ option, similar to the ‘sdist’ +command, which you can use to select the types of built distribution to +generate: for example, + + python setup.py bdist --format=zip + +would, when run on a Unix system, create +‘Distutils-1.0.`plat'.zip’—again, this archive would be unpacked from +the root directory to install the Distutils. + +The available formats for built distributions are: + +Format Description Notes + +------------------------------------------------------------------- + +‘gztar’ gzipped tar file (‘.tar.gz’) (1) + + +‘bztar’ bzipped tar file (‘.tar.bz2’) + + +‘xztar’ xzipped tar file (‘.tar.xz’) + + +‘ztar’ compressed tar file (‘.tar.Z’) (3) + + +‘tar’ tar file (‘.tar’) + + +‘zip’ zip file (‘.zip’) (2),(4) + + +‘rpm’ RPM (5) + + +‘pkgtool’ Solaris ‘pkgtool’ + + +‘sdux’ HP-UX ‘swinstall’ + + +‘msi’ Microsoft Installer. + + +Changed in version 3.5: Added support for the ‘xztar’ format. + +Notes: + + 1. default on Unix + + 2. default on Windows + + 3. requires external ‘compress’ utility. + + 4. requires either external ‘zip’ utility or *note zipfile: 14d. + module (part of the standard Python library since Python 1.6) + + 5. requires external ‘rpm’ utility, version 3.0.4 or better (use ‘rpm + --version’ to find out which version you have) + +You don’t have to use the ‘bdist’ command with the ‘--formats’ option; +you can also use the command that directly implements the format you’re +interested in. Some of these ‘bdist’ “sub-commands” actually generate +several similar formats; for instance, the ‘bdist_dumb’ command +generates all the “dumb” archive formats (‘tar’, ‘gztar’, ‘bztar’, +‘xztar’, ‘ztar’, and ‘zip’), and ‘bdist_rpm’ generates both binary and +source RPMs. The ‘bdist’ sub-commands, and the formats generated by +each, are: + +Command Formats + +------------------------------------------------------------------------- + +‘bdist_dumb’ tar, gztar, bztar, xztar, ztar, zip + + +‘bdist_rpm’ rpm, srpm + + +The following sections give details on the individual ‘bdist_*’ +commands. + +* Menu: + +* Creating RPM packages:: +* Cross-compiling on Windows:: + + +File: python.info, Node: Creating RPM packages, Next: Cross-compiling on Windows, Up: Creating Built Distributions + +17.5.1 Creating RPM packages +---------------------------- + +The RPM format is used by many popular Linux distributions, including +Red Hat, SuSE, and Mandrake. If one of these (or any of the other +RPM-based Linux distributions) is your usual environment, creating RPM +packages for other users of that same distribution is trivial. +Depending on the complexity of your module distribution and differences +between Linux distributions, you may also be able to create RPMs that +work on different RPM-based distributions. + +The usual way to create an RPM of your module distribution is to run the +‘bdist_rpm’ command: + + python setup.py bdist_rpm + +or the ‘bdist’ command with the ‘--format’ option: + + python setup.py bdist --formats=rpm + +The former allows you to specify RPM-specific options; the latter allows +you to easily specify multiple formats in one run. If you need to do +both, you can explicitly specify multiple ‘bdist_*’ commands and their +options: + + python setup.py bdist_rpm --packager="John Doe " + +Creating RPM packages is driven by a ‘.spec’ file, much as using the +Distutils is driven by the setup script. To make your life easier, the +‘bdist_rpm’ command normally creates a ‘.spec’ file based on the +information you supply in the setup script, on the command line, and in +any Distutils configuration files. Various options and sections in the +‘.spec’ file are derived from options in the setup script as follows: + +RPM ‘.spec’ file option or section Distutils setup script option + +-------------------------------------------------------------------------------------------------- + +Name ‘name’ + + +Summary (in preamble) ‘description’ + + +Version ‘version’ + + +Vendor ‘author’ and ‘author_email’, or — & ‘maintainer’ + and ‘maintainer_email’ + + +Copyright ‘license’ + + +Url ‘url’ + + +%description (section) ‘long_description’ + + +Additionally, there are many options in ‘.spec’ files that don’t have +corresponding options in the setup script. Most of these are handled +through options to the ‘bdist_rpm’ command as follows: + +RPM ‘.spec’ file option or ‘bdist_rpm’ option default value +section + +---------------------------------------------------------------------------------------------------- + +Release ‘release’ “1” + + +Group ‘group’ “Development/Libraries” + + +Vendor ‘vendor’ (see above) + + +Packager ‘packager’ (none) + + +Provides ‘provides’ (none) + + +Requires ‘requires’ (none) + + +Conflicts ‘conflicts’ (none) + + +Obsoletes ‘obsoletes’ (none) + + +Distribution ‘distribution_name’ (none) + + +BuildRequires ‘build_requires’ (none) + + +Icon ‘icon’ (none) + + +Obviously, supplying even a few of these options on the command-line +would be tedious and error-prone, so it’s usually best to put them in +the setup configuration file, ‘setup.cfg’—see section *note Writing the +Setup Configuration File: 4ae0. If you distribute or package many +Python module distributions, you might want to put options that apply to +all of them in your personal Distutils configuration file +(‘~/.pydistutils.cfg’). If you want to temporarily disable this file, +you can pass the ‘--no-user-cfg’ option to ‘setup.py’. + +There are three steps to building a binary RPM package, all of which are +handled automatically by the Distutils: + + 1. create a ‘.spec’ file, which describes the package (analogous to + the Distutils setup script; in fact, much of the information in the + setup script winds up in the ‘.spec’ file) + + 2. create the source RPM + + 3. create the “binary” RPM (which may or may not contain binary code, + depending on whether your module distribution contains Python + extensions) + +Normally, RPM bundles the last two steps together; when you use the +Distutils, all three steps are typically bundled together. + +If you wish, you can separate these three steps. You can use the +‘--spec-only’ option to make ‘bdist_rpm’ just create the ‘.spec’ file +and exit; in this case, the ‘.spec’ file will be written to the +“distribution directory”—normally ‘dist/’, but customizable with the +‘--dist-dir’ option. (Normally, the ‘.spec’ file winds up deep in the +“build tree,” in a temporary directory created by ‘bdist_rpm’.) + + +File: python.info, Node: Cross-compiling on Windows, Prev: Creating RPM packages, Up: Creating Built Distributions + +17.5.2 Cross-compiling on Windows +--------------------------------- + +Starting with Python 2.6, distutils is capable of cross-compiling +between Windows platforms. In practice, this means that with the +correct tools installed, you can use a 32bit version of Windows to +create 64bit extensions and vice-versa. + +To build for an alternate platform, specify the ‘--plat-name’ option to +the build command. Valid values are currently ‘win32’, and ‘win-amd64’. +For example, on a 32bit version of Windows, you could execute: + + python setup.py build --plat-name=win-amd64 + +to build a 64bit version of your extension. + +would create a 64bit installation executable on your 32bit version of +Windows. + +To cross-compile, you must download the Python source code and +cross-compile Python itself for the platform you are targeting - it is +not possible from a binary installation of Python (as the .lib etc file +for other platforms are not included.) In practice, this means the user +of a 32 bit operating system will need to use Visual Studio 2008 to open +the ‘PCbuild/PCbuild.sln’ solution in the Python source tree and build +the “x64” configuration of the ‘pythoncore’ project before +cross-compiling extensions is possible. + +Note that by default, Visual Studio 2008 does not install 64bit +compilers or tools. You may need to reexecute the Visual Studio setup +process and select these tools (using Control Panel->[Add/Remove] +Programs is a convenient way to check or modify your existing install.) + +* Menu: + +* The Postinstallation script:: + + +File: python.info, Node: The Postinstallation script, Up: Cross-compiling on Windows + +17.5.2.1 The Postinstallation script +.................................... + +Starting with Python 2.3, a postinstallation script can be specified +with the ‘--install-script’ option. The basename of the script must be +specified, and the script filename must also be listed in the scripts +argument to the setup function. + +This script will be run at installation time on the target system after +all the files have been copied, with ‘argv[1]’ set to ‘-install’, and +again at uninstallation time before the files are removed with ‘argv[1]’ +set to ‘-remove’. + +The installation script runs embedded in the windows installer, every +output (‘sys.stdout’, ‘sys.stderr’) is redirected into a buffer and will +be displayed in the GUI after the script has finished. + +Some functions especially useful in this context are available as +additional built-in functions in the installation script. + + -- Function: directory_created (path) + -- Function: file_created (path) + + These functions should be called when a directory or file is + created by the postinstall script at installation time. It will + register `path' with the uninstaller, so that it will be removed + when the distribution is uninstalled. To be safe, directories are + only removed if they are empty. + + -- Function: get_special_folder_path (csidl_string) + + This function can be used to retrieve special folder locations on + Windows like the Start Menu or the Desktop. It returns the full + path to the folder. `csidl_string' must be one of the following + strings: + + "CSIDL_APPDATA" + + "CSIDL_COMMON_STARTMENU" + "CSIDL_STARTMENU" + + "CSIDL_COMMON_DESKTOPDIRECTORY" + "CSIDL_DESKTOPDIRECTORY" + + "CSIDL_COMMON_STARTUP" + "CSIDL_STARTUP" + + "CSIDL_COMMON_PROGRAMS" + "CSIDL_PROGRAMS" + + "CSIDL_FONTS" + + If the folder cannot be retrieved, *note OSError: 413. is raised. + + Which folders are available depends on the exact Windows version, + and probably also the configuration. For details refer to + Microsoft’s documentation of the ‘SHGetSpecialFolderPath()’ + function. + + -- Function: create_shortcut (target, description, filename[, + arguments[, workdir[, iconpath[, iconindex]]]]) + + This function creates a shortcut. `target' is the path to the + program to be started by the shortcut. `description' is the + description of the shortcut. `filename' is the title of the + shortcut that the user will see. `arguments' specifies the command + line arguments, if any. `workdir' is the working directory for the + program. `iconpath' is the file containing the icon for the + shortcut, and `iconindex' is the index of the icon in the file + `iconpath'. Again, for details consult the Microsoft documentation + for the ‘IShellLink’ interface. + + +File: python.info, Node: Distutils Examples, Next: Extending Distutils, Prev: Creating Built Distributions, Up: Distributing Python Modules Legacy version + +17.6 Distutils Examples +======================= + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +This chapter provides a number of basic examples to help get started +with distutils. Additional information about using distutils can be +found in the Distutils Cookbook. + +See also +........ + +Distutils Cookbook(1) + + Collection of recipes showing how to achieve more control over + distutils. + +* Menu: + +* Pure Python distribution (by module): Pure Python distribution by module. +* Pure Python distribution (by package): Pure Python distribution by package. +* Single extension module:: +* Checking a package:: +* Reading the metadata:: + + ---------- Footnotes ---------- + + (1) https://wiki.python.org/moin/Distutils/Cookbook + + +File: python.info, Node: Pure Python distribution by module, Next: Pure Python distribution by package, Up: Distutils Examples + +17.6.1 Pure Python distribution (by module) +------------------------------------------- + +If you’re just distributing a couple of modules, especially if they +don’t live in a particular package, you can specify them individually +using the ‘py_modules’ option in the setup script. + +In the simplest case, you’ll have two files to worry about: a setup +script and the single module you’re distributing, ‘foo.py’ in this +example: + + / + setup.py + foo.py + +(In all diagrams in this section, `' will refer to the +distribution root directory.) A minimal setup script to describe this +situation would be: + + from distutils.core import setup + setup(name='foo', + version='1.0', + py_modules=['foo'], + ) + +Note that the name of the distribution is specified independently with +the ‘name’ option, and there’s no rule that says it has to be the same +as the name of the sole module in the distribution (although that’s +probably a good convention to follow). However, the distribution name +is used to generate filenames, so you should stick to letters, digits, +underscores, and hyphens. + +Since ‘py_modules’ is a list, you can of course specify multiple +modules, eg. if you’re distributing modules ‘foo’ and ‘bar’, your setup +might look like this: + + / + setup.py + foo.py + bar.py + +and the setup script might be + + from distutils.core import setup + setup(name='foobar', + version='1.0', + py_modules=['foo', 'bar'], + ) + +You can put module source files into another directory, but if you have +enough modules to do that, it’s probably easier to specify modules by +package rather than listing them individually. + + +File: python.info, Node: Pure Python distribution by package, Next: Single extension module, Prev: Pure Python distribution by module, Up: Distutils Examples + +17.6.2 Pure Python distribution (by package) +-------------------------------------------- + +If you have more than a couple of modules to distribute, especially if +they are in multiple packages, it’s probably easier to specify whole +packages rather than individual modules. This works even if your +modules are not in a package; you can just tell the Distutils to process +modules from the root package, and that works the same as any other +package (except that you don’t have to have an ‘__init__.py’ file). + +The setup script from the last example could also be written as + + from distutils.core import setup + setup(name='foobar', + version='1.0', + packages=[''], + ) + +(The empty string stands for the root package.) + +If those two files are moved into a subdirectory, but remain in the root +package, e.g.: + + / + setup.py + src/ foo.py + bar.py + +then you would still specify the root package, but you have to tell the +Distutils where source files in the root package live: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + package_dir={'': 'src'}, + packages=[''], + ) + +More typically, though, you will want to distribute multiple modules in +the same package (or in sub-packages). For example, if the ‘foo’ and +‘bar’ modules belong in package ‘foobar’, one way to layout your source +tree is + + / + setup.py + foobar/ + __init__.py + foo.py + bar.py + +This is in fact the default layout expected by the Distutils, and the +one that requires the least work to describe in your setup script: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + packages=['foobar'], + ) + +If you want to put modules in directories not named for their package, +then you need to use the ‘package_dir’ option again. For example, if +the ‘src’ directory holds modules in the ‘foobar’ package: + + / + setup.py + src/ + __init__.py + foo.py + bar.py + +an appropriate setup script would be + + from distutils.core import setup + setup(name='foobar', + version='1.0', + package_dir={'foobar': 'src'}, + packages=['foobar'], + ) + +Or, you might put modules from your main package right in the +distribution root: + + / + setup.py + __init__.py + foo.py + bar.py + +in which case your setup script would be + + from distutils.core import setup + setup(name='foobar', + version='1.0', + package_dir={'foobar': ''}, + packages=['foobar'], + ) + +(The empty string also stands for the current directory.) + +If you have sub-packages, they must be explicitly listed in ‘packages’, +but any entries in ‘package_dir’ automatically extend to sub-packages. +(In other words, the Distutils does `not' scan your source tree, trying +to figure out which directories correspond to Python packages by looking +for ‘__init__.py’ files.) Thus, if the default layout grows a +sub-package: + + / + setup.py + foobar/ + __init__.py + foo.py + bar.py + subfoo/ + __init__.py + blah.py + +then the corresponding setup script would be + + from distutils.core import setup + setup(name='foobar', + version='1.0', + packages=['foobar', 'foobar.subfoo'], + ) + + +File: python.info, Node: Single extension module, Next: Checking a package, Prev: Pure Python distribution by package, Up: Distutils Examples + +17.6.3 Single extension module +------------------------------ + +Extension modules are specified using the ‘ext_modules’ option. +‘package_dir’ has no effect on where extension source files are found; +it only affects the source for pure Python modules. The simplest case, +a single extension module in a single C source file, is: + + / + setup.py + foo.c + +If the ‘foo’ extension belongs in the root package, the setup script for +this could be + + from distutils.core import setup + from distutils.extension import Extension + setup(name='foobar', + version='1.0', + ext_modules=[Extension('foo', ['foo.c'])], + ) + +If the extension actually belongs in a package, say ‘foopkg’, then + +With exactly the same source tree layout, this extension can be put in +the ‘foopkg’ package simply by changing the name of the extension: + + from distutils.core import setup + from distutils.extension import Extension + setup(name='foobar', + version='1.0', + ext_modules=[Extension('foopkg.foo', ['foo.c'])], + ) + + +File: python.info, Node: Checking a package, Next: Reading the metadata, Prev: Single extension module, Up: Distutils Examples + +17.6.4 Checking a package +------------------------- + +The ‘check’ command allows you to verify if your package meta-data meet +the minimum requirements to build a distribution. + +To run it, just call it using your ‘setup.py’ script. If something is +missing, ‘check’ will display a warning. + +Let’s take an example with a simple script: + + from distutils.core import setup + + setup(name='foobar') + +Running the ‘check’ command will display some warnings: + + $ python setup.py check + running check + warning: check: missing required meta-data: version, url + warning: check: missing meta-data: either (author and author_email) or + (maintainer and maintainer_email) should be supplied + +If you use the reStructuredText syntax in the ‘long_description’ field +and docutils(1) is installed you can check if the syntax is fine with +the ‘check’ command, using the ‘restructuredtext’ option. + +For example, if the ‘setup.py’ script is changed like this: + + from distutils.core import setup + + desc = """\ + My description + ============== + + This is the description of the ``foobar`` package. + """ + + setup(name='foobar', version='1', author='tarek', + author_email='tarek@ziade.org', + url='http://example.com', long_description=desc) + +Where the long description is broken, ‘check’ will be able to detect it +by using the ‘docutils’ parser: + + $ python setup.py check --restructuredtext + running check + warning: check: Title underline too short. (line 2) + warning: check: Could not finish the parsing. + + ---------- Footnotes ---------- + + (1) http://docutils.sourceforge.net + + +File: python.info, Node: Reading the metadata, Prev: Checking a package, Up: Distutils Examples + +17.6.5 Reading the metadata +--------------------------- + +The *note distutils.core.setup(): 4294. function provides a command-line +interface that allows you to query the metadata fields of a project +through the ‘setup.py’ script of a given project: + + $ python setup.py --name + distribute + +This call reads the ‘name’ metadata by running the *note +distutils.core.setup(): 4294. function. Although, when a source or +binary distribution is created with Distutils, the metadata fields are +written in a static file called ‘PKG-INFO’. When a Distutils-based +project is installed in Python, the ‘PKG-INFO’ file is copied alongside +the modules and packages of the distribution under +‘NAME-VERSION-pyX.X.egg-info’, where ‘NAME’ is the name of the project, +‘VERSION’ its version as defined in the Metadata, and ‘pyX.X’ the major +and minor version of Python like ‘2.7’ or ‘3.2’. + +You can read back this static file, by using the +‘distutils.dist.DistributionMetadata’ class and its ‘read_pkg_file()’ +method: + + >>> from distutils.dist import DistributionMetadata + >>> metadata = DistributionMetadata() + >>> metadata.read_pkg_file(open('distribute-0.6.8-py2.7.egg-info')) + >>> metadata.name + 'distribute' + >>> metadata.version + '0.6.8' + >>> metadata.description + 'Easily download, build, install, upgrade, and uninstall Python packages' + +Notice that the class can also be instantiated with a metadata file path +to loads its values: + + >>> pkg_info_path = 'distribute-0.6.8-py2.7.egg-info' + >>> DistributionMetadata(pkg_info_path).name + 'distribute' + + +File: python.info, Node: Extending Distutils, Next: Command Reference, Prev: Distutils Examples, Up: Distributing Python Modules Legacy version + +17.7 Extending Distutils +======================== + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +Distutils can be extended in various ways. Most extensions take the +form of new commands or replacements for existing commands. New +commands may be written to support new types of platform-specific +packaging, for example, while replacements for existing commands may be +made to modify details of how the command operates on a package. + +Most extensions of the distutils are made within ‘setup.py’ scripts that +want to modify existing commands; many simply add a few file extensions +that should be copied into packages in addition to ‘.py’ files as a +convenience. + +Most distutils command implementations are subclasses of the *note +distutils.cmd.Command: 4b06. class. New commands may directly inherit +from ‘Command’, while replacements often derive from ‘Command’ +indirectly, directly subclassing the command they are replacing. +Commands are required to derive from ‘Command’. + +* Menu: + +* Integrating new commands:: +* Adding new distribution types:: + + +File: python.info, Node: Integrating new commands, Next: Adding new distribution types, Up: Extending Distutils + +17.7.1 Integrating new commands +------------------------------- + +There are different ways to integrate new command implementations into +distutils. The most difficult is to lobby for the inclusion of the new +features in distutils itself, and wait for (and require) a version of +Python that provides that support. This is really hard for many +reasons. + +The most common, and possibly the most reasonable for most needs, is to +include the new implementations with your ‘setup.py’ script, and cause +the *note distutils.core.setup(): 4294. function use them: + + from distutils.command.build_py import build_py as _build_py + from distutils.core import setup + + class build_py(_build_py): + """Specialized Python source builder.""" + + # implement whatever needs to be different... + + setup(cmdclass={'build_py': build_py}, + ...) + +This approach is most valuable if the new implementations must be used +to use a particular package, as everyone interested in the package will +need to have the new command implementation. + +Beginning with Python 2.4, a third option is available, intended to +allow new commands to be added which can support existing ‘setup.py’ +scripts without requiring modifications to the Python installation. +This is expected to allow third-party extensions to provide support for +additional packaging systems, but the commands can be used for anything +distutils commands can be used for. A new configuration option, +‘command_packages’ (command-line option ‘--command-packages’), can be +used to specify additional packages to be searched for modules +implementing commands. Like all distutils options, this can be +specified on the command line or in a configuration file. This option +can only be set in the ‘[global]’ section of a configuration file, or +before any commands on the command line. If set in a configuration +file, it can be overridden from the command line; setting it to an empty +string on the command line causes the default to be used. This should +never be set in a configuration file provided with a package. + +This new option can be used to add any number of packages to the list of +packages searched for command implementations; multiple package names +should be separated by commas. When not specified, the search is only +performed in the *note distutils.command: 3c. package. When ‘setup.py’ +is run with the option ‘--command-packages distcmds,buildcmds’, however, +the packages *note distutils.command: 3c, ‘distcmds’, and ‘buildcmds’ +will be searched in that order. New commands are expected to be +implemented in modules of the same name as the command by classes +sharing the same name. Given the example command line option above, the +command ‘bdist_openpkg’ could be implemented by the class +‘distcmds.bdist_openpkg.bdist_openpkg’ or +‘buildcmds.bdist_openpkg.bdist_openpkg’. + + +File: python.info, Node: Adding new distribution types, Prev: Integrating new commands, Up: Extending Distutils + +17.7.2 Adding new distribution types +------------------------------------ + +Commands that create distributions (files in the ‘dist/’ directory) need +to add ‘(command, filename)’ pairs to ‘self.distribution.dist_files’ so +that ‘upload’ can upload it to PyPI. The `filename' in the pair contains +no path information, only the name of the file itself. In dry-run mode, +pairs should still be added to represent what would have been created. + + +File: python.info, Node: Command Reference, Next: API Reference, Prev: Extending Distutils, Up: Distributing Python Modules Legacy version + +17.8 Command Reference +====================== + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +* Menu: + +* Installing modules; the install command family: Installing modules the install command family. +* Creating a source distribution; the sdist command: Creating a source distribution the sdist command. + + +File: python.info, Node: Installing modules the install command family, Next: Creating a source distribution the sdist command, Up: Command Reference + +17.8.1 Installing modules: the ‘install’ command family +------------------------------------------------------- + +The install command ensures that the build commands have been run and +then runs the subcommands ‘install_lib’, ‘install_data’ and +‘install_scripts’. + +* Menu: + +* install_data:: +* install_scripts:: + + +File: python.info, Node: install_data, Next: install_scripts, Up: Installing modules the install command family + +17.8.1.1 ‘install_data’ +....................... + +This command installs all data files provided with the distribution. + + +File: python.info, Node: install_scripts, Prev: install_data, Up: Installing modules the install command family + +17.8.1.2 ‘install_scripts’ +.......................... + +This command installs all (Python) scripts in the distribution. + + +File: python.info, Node: Creating a source distribution the sdist command, Prev: Installing modules the install command family, Up: Command Reference + +17.8.2 Creating a source distribution: the ‘sdist’ command +---------------------------------------------------------- + +The manifest template commands are: + +Command Description + +---------------------------------------------------------------------------------------------------- + +‘include pat1 pat2 ...’ include all files matching any of the listed + patterns + + +‘exclude pat1 pat2 ...’ exclude all files matching any of the listed + patterns + + +‘recursive-include dir pat1 pat2 ...’ include all files under `dir' matching any of the + listed patterns + + +‘recursive-exclude dir pat1 pat2 ...’ exclude all files under `dir' matching any of the + listed patterns + + +‘global-include pat1 pat2 ...’ include all files anywhere in the source tree + matching — & any of the listed patterns + + +‘global-exclude pat1 pat2 ...’ exclude all files anywhere in the source tree + matching — & any of the listed patterns + + +‘prune dir’ exclude all files under `dir' + + +‘graft dir’ include all files under `dir' + + +The patterns here are Unix-style “glob” patterns: ‘*’ matches any +sequence of regular filename characters, ‘?’ matches any single regular +filename character, and ‘[range]’ matches any of the characters in +`range' (e.g., ‘a-z’, ‘a-zA-Z’, ‘a-f0-9_.’). The definition of “regular +filename character” is platform-specific: on Unix it is anything except +slash; on Windows anything except backslash or colon. + + +File: python.info, Node: API Reference, Prev: Command Reference, Up: Distributing Python Modules Legacy version + +17.9 API Reference +================== + +See also +........ + +New and changed setup.py arguments in setuptools(1) + + The ‘setuptools’ project adds new capabilities to the ‘setup’ + function and other APIs, makes the API consistent across different + Python versions, and is hence recommended over using ‘distutils’ + directly. + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + +* Menu: + +* distutils.core — Core Distutils functionality: distutils core — Core Distutils functionality. +* distutils.ccompiler — CCompiler base class: distutils ccompiler — CCompiler base class. +* distutils.unixccompiler — Unix C Compiler: distutils unixccompiler — Unix C Compiler. +* distutils.msvccompiler — Microsoft Compiler: distutils msvccompiler — Microsoft Compiler. +* distutils.bcppcompiler — Borland Compiler: distutils bcppcompiler — Borland Compiler. +* distutils.cygwincompiler — Cygwin Compiler: distutils cygwincompiler — Cygwin Compiler. +* distutils.archive_util — Archiving utilities: distutils archive_util — Archiving utilities. +* distutils.dep_util — Dependency checking: distutils dep_util — Dependency checking. +* distutils.dir_util — Directory tree operations: distutils dir_util — Directory tree operations. +* distutils.file_util — Single file operations: distutils file_util — Single file operations. +* distutils.util — Miscellaneous other utility functions: distutils util — Miscellaneous other utility functions. +* distutils.dist — The Distribution class: distutils dist — The Distribution class. +* distutils.extension — The Extension class: distutils extension — The Extension class. +* distutils.debug — Distutils debug mode: distutils debug — Distutils debug mode. +* distutils.errors — Distutils exceptions: distutils errors — Distutils exceptions. +* distutils.fancy_getopt — Wrapper around the standard getopt module: distutils fancy_getopt — Wrapper around the standard getopt module. +* distutils.filelist — The FileList class: distutils filelist — The FileList class. +* distutils.log — Simple PEP 282-style logging: distutils log — Simple PEP 282-style logging. +* distutils.spawn — Spawn a sub-process: distutils spawn — Spawn a sub-process. +* distutils.sysconfig — System configuration information: distutils sysconfig — System configuration information. +* distutils.text_file — The TextFile class: distutils text_file — The TextFile class. +* distutils.version — Version number classes: distutils version — Version number classes. +* distutils.cmd — Abstract base class for Distutils commands: distutils cmd — Abstract base class for Distutils commands. +* Creating a new Distutils command:: +* distutils.command — Individual Distutils commands: distutils command — Individual Distutils commands. +* distutils.command.bdist — Build a binary installer: distutils command bdist — Build a binary installer. +* distutils.command.bdist_packager — Abstract base class for packagers: distutils command bdist_packager — Abstract base class for packagers. +* distutils.command.bdist_dumb — Build a “dumb” installer: distutils command bdist_dumb — Build a “dumb” installer. +* distutils.command.bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM: distutils command bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM. +* distutils.command.sdist — Build a source distribution: distutils command sdist — Build a source distribution. +* distutils.command.build — Build all files of a package: distutils command build — Build all files of a package. +* distutils.command.build_clib — Build any C libraries in a package: distutils command build_clib — Build any C libraries in a package. +* distutils.command.build_ext — Build any extensions in a package: distutils command build_ext — Build any extensions in a package. +* distutils.command.build_py — Build the .py/.pyc files of a package: distutils command build_py — Build the py/ pyc files of a package. +* distutils.command.build_scripts — Build the scripts of a package: distutils command build_scripts — Build the scripts of a package. +* distutils.command.clean — Clean a package build area: distutils command clean — Clean a package build area. +* distutils.command.config — Perform package configuration: distutils command config — Perform package configuration. +* distutils.command.install — Install a package: distutils command install — Install a package. +* distutils.command.install_data — Install data files from a package: distutils command install_data — Install data files from a package. +* distutils.command.install_headers — Install C/C++ header files from a package: distutils command install_headers — Install C/C++ header files from a package. +* distutils.command.install_lib — Install library files from a package: distutils command install_lib — Install library files from a package. +* distutils.command.install_scripts — Install script files from a package: distutils command install_scripts — Install script files from a package. +* distutils.command.register — Register a module with the Python Package Index: distutils command register — Register a module with the Python Package Index. +* distutils.command.check — Check the meta-data of a package: distutils command check — Check the meta-data of a package. + + ---------- Footnotes ---------- + + (1) +https://web.archive.org/web/20210614192516/https://setuptools.pypa.io/en/stable/userguide/keywords.html + + +File: python.info, Node: distutils core — Core Distutils functionality, Next: distutils ccompiler — CCompiler base class, Up: API Reference + +17.9.1 ‘distutils.core’ — Core Distutils functionality +------------------------------------------------------ + +The *note distutils.core: 50. module is the only module that needs to be +installed to use the Distutils. It provides the *note setup(): 4294. +(which is called from the setup script). Indirectly provides the +‘distutils.dist.Distribution’ and *note distutils.cmd.Command: 4b06. +class. + + -- Function: distutils.core.setup (arguments) + + The basic do-everything function that does most everything you + could ever ask for from a Distutils method. + + The setup function takes a large number of arguments. These are + laid out in the following table. + + argument name value type + + -------------------------------------------------------------------------------------------------------------------------------- + + `name' The name of the package a string + + + `version' The version number of the package; a string + see *note distutils.version: 62. + + + `description' A single line describing the a string + package + + + `long_description' Longer description of the package a string + + + `author' The name of the package author a string + + + `author_email' The email address of the package a string + author + + + `maintainer' The name of the current a string + maintainer, if different from the + author. Note that if the + maintainer is provided, distutils + will use it as the author in + ‘PKG-INFO’ + + + `maintainer_email' The email address of the current a string + maintainer, if different from the + author + + + `url' A URL for the package (homepage) a string + + + `download_url' A URL to download the package a string + + + `packages' A list of Python packages that a list of strings + distutils will manipulate + + + `py_modules' A list of Python modules that a list of strings + distutils will manipulate + + + `scripts' A list of standalone script files a list of strings + to be built and installed + + + `ext_modules' A list of Python extensions to be a list of instances of *note distutils.core.Extension: 4acf. + built + + + `classifiers' A list of categories for the a list of strings; valid classifiers are listed on PyPI(1). + package + + + `distclass' the *note Distribution: 4b17. a subclass of *note distutils.core.Distribution: 4b17. + class to use + + + `script_name' The name of the setup.py script - a string + defaults to ‘sys.argv[0]’ + + + `script_args' Arguments to supply to the setup a list of strings + script + + + `options' default options for the setup a dictionary + script + + + `license' The license for the package a string + + + `keywords' Descriptive meta-data, see PEP a list of strings or a comma-separated string + 314(2) + + + `platforms' a list of strings or a comma-separated string + + + `cmdclass' A mapping of command names to a dictionary + *note Command: 4b18. subclasses + + + `data_files' A list of data files to install a list + + + `package_dir' A mapping of package to directory a dictionary + names + + + -- Function: distutils.core.run_setup (script_name[, script_args=None, + stop_after='run']) + + Run a setup script in a somewhat controlled environment, and return + the ‘distutils.dist.Distribution’ instance that drives things. + This is useful if you need to find out the distribution meta-data + (passed as keyword args from `script' to *note setup(): 4294.), or + the contents of the config files or command-line. + + `script_name' is a file that will be read and run with *note + exec(): 4a8. ‘sys.argv[0]’ will be replaced with `script' for the + duration of the call. `script_args' is a list of strings; if + supplied, ‘sys.argv[1:]’ will be replaced by `script_args' for the + duration of the call. + + `stop_after' tells *note setup(): 4294. when to stop processing; + possible values: + + value description + + ---------------------------------------------------------------------- + + `init' Stop after the *note Distribution: 4b17. + instance has been created and populated with + the keyword arguments to *note setup(): 4294. + + + `config' Stop after config files have been parsed (and + their data stored in the + *note Distribution: 4b17. instance) + + + `commandline' Stop after the command-line (‘sys.argv[1:]’ or + `script_args') have been parsed (and the data + stored in the *note Distribution: 4b17. + instance.) + + + `run' Stop after all commands have been run (the same + as if *note setup(): 4294. had been called in + the usual way). This is the default value. + + +In addition, the *note distutils.core: 50. module exposed a number of +classes that live elsewhere. + + * ‘Extension’ from *note distutils.extension: 57. + + * *note Command: 4b06. from *note distutils.cmd: 3b. + + * ‘Distribution’ from *note distutils.dist: 55. + +A short description of each of these follows, but see the relevant +module for the full reference. + + -- Class: distutils.core.Extension + + The Extension class describes a single C or C++ extension module in + a setup script. It accepts the following keyword arguments in its + constructor: + + argument name value type + + -------------------------------------------------------------------------------------------------- + + `name' the full name of the extension, a string + including any packages — ie. + `not' a filename or pathname, but + Python dotted name + + + `sources' list of source filenames, relative a list of strings + to the distribution root (where + the setup script lives), in Unix + form (slash-separated) for + portability. Source files may be + C, C++, SWIG (.i), + platform-specific resource files, + or whatever else is recognized by + the ‘build_ext’ command as source + for a Python extension. + + + `include_dirs' list of directories to search for a list of strings + C/C++ header files (in Unix form + for portability) + + + `define_macros' list of macros to define; each a list of tuples + macro is defined using a 2-tuple + ‘(name, value)’, where `value' is + either the string to define it to + or ‘None’ to define it without a + particular value (equivalent of + ‘#define FOO’ in source or ‘-DFOO’ + on Unix C compiler command line) + + + `undef_macros' list of macros to undefine a list of strings + explicitly + + + `library_dirs' list of directories to search for a list of strings + C/C++ libraries at link time + + + `libraries' list of library names (not a list of strings + filenames or paths) to link + against + + + `runtime_library_dirs' list of directories to search for a list of strings + C/C++ libraries at run time (for + shared extensions, this is when + the extension is loaded) + + + `extra_objects' list of extra files to link with a list of strings + (eg. object files not implied by + ‘sources’, static library that + must be explicitly specified, + binary resource files, etc.) + + + `extra_compile_args' any extra platform- and a list of strings + compiler-specific information to + use when compiling the source + files in ‘sources’. For platforms + and compilers where a command line + makes sense, this is typically a + list of command-line arguments, + but for other platforms it could + be anything. + + + `extra_link_args' any extra platform- and a list of strings + compiler-specific information to + use when linking object files + together to create the extension + (or to create a new static Python + interpreter). Similar + interpretation as for + ‘extra_compile_args’. + + + `export_symbols' list of symbols to be exported a list of strings + from a shared extension. Not used + on all platforms, and not + generally necessary for Python + extensions, which typically export + exactly one symbol: ‘init’ + + extension_name. + + + `depends' list of files that the extension a list of strings + depends on + + + `language' extension language (i.e. ‘'c'’, a string + ‘'c++'’, ‘'objc'’). Will be + detected from the source + extensions if not provided. + + + `optional' specifies that a build failure in a boolean + the extension should not abort the + build process, but simply skip the + extension. + + + Changed in version 3.8: On Unix, C extensions are no longer linked + to libpython except on Android and Cygwin. + + -- Class: distutils.core.Distribution + + A *note Distribution: 4b17. describes how to build, install and + package up a Python software package. + + See the *note setup(): 4294. function for a list of keyword + arguments accepted by the Distribution constructor. *note setup(): + 4294. creates a Distribution instance. + + Changed in version 3.7: *note Distribution: 4b17. now warns if + ‘classifiers’, ‘keywords’ and ‘platforms’ fields are not specified + as a list or a string. + + -- Class: distutils.core.Command + + A *note Command: 4b18. class (or rather, an instance of one of its + subclasses) implement a single distutils command. + + ---------- Footnotes ---------- + + (1) https://pypi.org/classifiers + + (2) https://peps.python.org/pep-0314/ + + +File: python.info, Node: distutils ccompiler — CCompiler base class, Next: distutils unixccompiler — Unix C Compiler, Prev: distutils core — Core Distutils functionality, Up: API Reference + +17.9.2 ‘distutils.ccompiler’ — CCompiler base class +--------------------------------------------------- + +This module provides the abstract base class for the *note CCompiler: +4b1b. classes. A *note CCompiler: 4b1b. instance can be used for all +the compile and link steps needed to build a single project. Methods +are provided to set options for the compiler — macro definitions, +include directories, link path, libraries and the like. + +This module provides the following functions. + + -- Function: distutils.ccompiler.gen_lib_options (compiler, + library_dirs, runtime_library_dirs, libraries) + + Generate linker options for searching library directories and + linking with specific libraries. `libraries' and `library_dirs' + are, respectively, lists of library names (not filenames!) and + search directories. Returns a list of command-line options + suitable for use with some compiler (depending on the two format + strings passed in). + + -- Function: distutils.ccompiler.gen_preprocess_options (macros, + include_dirs) + + Generate C pre-processor options (‘-D’, ‘-U’, ‘-I’) as used by at + least two types of compilers: the typical Unix compiler and Visual + C++. `macros' is the usual thing, a list of 1- or 2-tuples, where + ‘(name,)’ means undefine (‘-U’) macro `name', and ‘(name, value)’ + means define (‘-D’) macro `name' to `value'. `include_dirs' is + just a list of directory names to be added to the header file + search path (‘-I’). Returns a list of command-line options + suitable for either Unix compilers or Visual C++. + + -- Function: distutils.ccompiler.get_default_compiler (osname, + platform) + + Determine the default compiler to use for the given platform. + + `osname' should be one of the standard Python OS names (i.e. the + ones returned by ‘os.name’) and `platform' the common value + returned by ‘sys.platform’ for the platform in question. + + The default values are ‘os.name’ and ‘sys.platform’ in case the + parameters are not given. + + -- Function: distutils.ccompiler.new_compiler (plat=None, + compiler=None, verbose=0, dry_run=0, force=0) + + Factory function to generate an instance of some CCompiler subclass + for the supplied platform/compiler combination. `plat' defaults to + ‘os.name’ (eg. ‘'posix'’, ‘'nt'’), and `compiler' defaults to the + default compiler for that platform. Currently only ‘'posix'’ and + ‘'nt'’ are supported, and the default compilers are “traditional + Unix interface” (‘UnixCCompiler’ class) and Visual C++ + (‘MSVCCompiler’ class). Note that it’s perfectly possible to ask + for a Unix compiler object under Windows, and a Microsoft compiler + object under Unix—if you supply a value for `compiler', `plat' is + ignored. + + -- Function: distutils.ccompiler.show_compilers () + + Print list of available compilers (used by the ‘--help-compiler’ + options to ‘build’, ‘build_ext’, ‘build_clib’). + + -- Class: distutils.ccompiler.CCompiler ([verbose=0, dry_run=0, + force=0]) + + The abstract base class *note CCompiler: 4b1b. defines the + interface that must be implemented by real compiler classes. The + class also has some utility methods used by several compiler + classes. + + The basic idea behind a compiler abstraction class is that each + instance can be used for all the compile/link steps in building a + single project. Thus, attributes common to all of those compile + and link steps — include directories, macros to define, libraries + to link against, etc. — are attributes of the compiler instance. + To allow for variability in how individual files are treated, most + of those attributes may be varied on a per-compilation or per-link + basis. + + The constructor for each subclass creates an instance of the + Compiler object. Flags are `verbose' (show verbose output), + `dry_run' (don’t actually execute the steps) and `force' (rebuild + everything, regardless of dependencies). All of these flags + default to ‘0’ (off). Note that you probably don’t want to + instantiate *note CCompiler: 4b1b. or one of its subclasses + directly - use the ‘distutils.CCompiler.new_compiler()’ factory + function instead. + + The following methods allow you to manually alter compiler options + for the instance of the Compiler class. + + -- Method: add_include_dir (dir) + + Add `dir' to the list of directories that will be searched for + header files. The compiler is instructed to search + directories in the order in which they are supplied by + successive calls to *note add_include_dir(): 4b21. + + -- Method: set_include_dirs (dirs) + + Set the list of directories that will be searched to `dirs' (a + list of strings). Overrides any preceding calls to *note + add_include_dir(): 4b21.; subsequent calls to *note + add_include_dir(): 4b21. add to the list passed to *note + set_include_dirs(): 4b22. This does not affect any list of + standard include directories that the compiler may search by + default. + + -- Method: add_library (libname) + + Add `libname' to the list of libraries that will be included + in all links driven by this compiler object. Note that + `libname' should *not* be the name of a file containing a + library, but the name of the library itself: the actual + filename will be inferred by the linker, the compiler, or the + compiler class (depending on the platform). + + The linker will be instructed to link against libraries in the + order they were supplied to *note add_library(): 4b23. and/or + *note set_libraries(): 4b24. It is perfectly valid to + duplicate library names; the linker will be instructed to link + against libraries as many times as they are mentioned. + + -- Method: set_libraries (libnames) + + Set the list of libraries to be included in all links driven + by this compiler object to `libnames' (a list of strings). + This does not affect any standard system libraries that the + linker may include by default. + + -- Method: add_library_dir (dir) + + Add `dir' to the list of directories that will be searched for + libraries specified to *note add_library(): 4b23. and *note + set_libraries(): 4b24. The linker will be instructed to + search for libraries in the order they are supplied to *note + add_library_dir(): 4b25. and/or *note set_library_dirs(): + 4b26. + + -- Method: set_library_dirs (dirs) + + Set the list of library search directories to `dirs' (a list + of strings). This does not affect any standard library search + path that the linker may search by default. + + -- Method: add_runtime_library_dir (dir) + + Add `dir' to the list of directories that will be searched for + shared libraries at runtime. + + -- Method: set_runtime_library_dirs (dirs) + + Set the list of directories to search for shared libraries at + runtime to `dirs' (a list of strings). This does not affect + any standard search path that the runtime linker may search by + default. + + -- Method: define_macro (name[, value=None]) + + Define a preprocessor macro for all compilations driven by + this compiler object. The optional parameter `value' should + be a string; if it is not supplied, then the macro will be + defined without an explicit value and the exact outcome + depends on the compiler used. + + -- Method: undefine_macro (name) + + Undefine a preprocessor macro for all compilations driven by + this compiler object. If the same macro is defined by *note + define_macro(): 4b29. and undefined by *note undefine_macro(): + 4b2a. the last call takes precedence (including multiple + redefinitions or undefinitions). If the macro is + redefined/undefined on a per-compilation basis (ie. in the + call to *note compile(): 310.), then that takes precedence. + + -- Method: add_link_object (object) + + Add `object' to the list of object files (or analogues, such + as explicitly named library files or the output of “resource + compilers”) to be included in every link driven by this + compiler object. + + -- Method: set_link_objects (objects) + + Set the list of object files (or analogues) to be included in + every link to `objects'. This does not affect any standard + object files that the linker may include by default (such as + system libraries). + + The following methods implement methods for autodetection of + compiler options, providing some functionality similar to GNU + ‘autoconf’. + + -- Method: detect_language (sources) + + Detect the language of a given file, or list of files. Uses + the instance attributes ‘language_map’ (a dictionary), and + ‘language_order’ (a list) to do the job. + + -- Method: find_library_file (dirs, lib[, debug=0]) + + Search the specified list of directories for a static or + shared library file `lib' and return the full path to that + file. If `debug' is true, look for a debugging version (if + that makes sense on the current platform). Return ‘None’ if + `lib' wasn’t found in any of the specified directories. + + -- Method: has_function (funcname[, includes=None, + include_dirs=None, libraries=None, library_dirs=None]) + + Return a boolean indicating whether `funcname' is supported on + the current platform. The optional arguments can be used to + augment the compilation environment by providing additional + include files and paths and libraries and paths. + + -- Method: library_dir_option (dir) + + Return the compiler option to add `dir' to the list of + directories searched for libraries. + + -- Method: library_option (lib) + + Return the compiler option to add `lib' to the list of + libraries linked into the shared library or executable. + + -- Method: runtime_library_dir_option (dir) + + Return the compiler option to add `dir' to the list of + directories searched for runtime libraries. + + -- Method: set_executables (**args) + + Define the executables (and options for them) that will be run + to perform the various stages of compilation. The exact set + of executables that may be specified here depends on the + compiler class (via the ‘executables’ class attribute), but + most will have: + + attribute description + + ------------------------------------------------------------------ + + `compiler' the C/C++ compiler + + + `linker_so' linker used to create shared objects and + libraries + + + `linker_exe' linker used to create binary executables + + + `archiver' static library creator + + + On platforms with a command-line (Unix, DOS/Windows), each of + these is a string that will be split into executable name and + (optional) list of arguments. (Splitting the string is done + similarly to how Unix shells operate: words are delimited by + spaces, but quotes and backslashes can override this. See + *note distutils.util.split_quoted(): 4b34.) + + The following methods invoke stages in the build process. + + -- Method: compile (sources[, output_dir=None, macros=None, + include_dirs=None, debug=0, extra_preargs=None, + extra_postargs=None, depends=None]) + + Compile one or more source files. Generates object files + (e.g. transforms a ‘.c’ file to a ‘.o’ file.) + + `sources' must be a list of filenames, most likely C/C++ + files, but in reality anything that can be handled by a + particular compiler and compiler class (eg. ‘MSVCCompiler’ + can handle resource files in `sources'). Return a list of + object filenames, one per source filename in `sources'. + Depending on the implementation, not all source files will + necessarily be compiled, but all corresponding object + filenames will be returned. + + If `output_dir' is given, object files will be put under it, + while retaining their original path component. That is, + ‘foo/bar.c’ normally compiles to ‘foo/bar.o’ (for a Unix + implementation); if `output_dir' is `build', then it would + compile to ‘build/foo/bar.o’. + + `macros', if given, must be a list of macro definitions. A + macro definition is either a ‘(name, value)’ 2-tuple or a + ‘(name,)’ 1-tuple. The former defines a macro; if the value + is ‘None’, the macro is defined without an explicit value. + The 1-tuple case undefines a macro. Later + definitions/redefinitions/undefinitions take precedence. + + `include_dirs', if given, must be a list of strings, the + directories to add to the default include file search path for + this compilation only. + + `debug' is a boolean; if true, the compiler will be instructed + to output debug symbols in (or alongside) the object file(s). + + `extra_preargs' and `extra_postargs' are + implementation-dependent. On platforms that have the notion + of a command-line (e.g. Unix, DOS/Windows), they are most + likely lists of strings: extra command-line arguments to + prepend/append to the compiler command line. On other + platforms, consult the implementation class documentation. In + any event, they are intended as an escape hatch for those + occasions when the abstract compiler framework doesn’t cut the + mustard. + + `depends', if given, is a list of filenames that all targets + depend on. If a source file is older than any file in + depends, then the source file will be recompiled. This + supports dependency tracking, but only at a coarse + granularity. + + Raises ‘CompileError’ on failure. + + -- Method: create_static_lib (objects, output_libname[, + output_dir=None, debug=0, target_lang=None]) + + Link a bunch of stuff together to create a static library + file. The “bunch of stuff” consists of the list of object + files supplied as `objects', the extra object files supplied + to *note add_link_object(): 4b2b. and/or *note + set_link_objects(): 4b2c, the libraries supplied to *note + add_library(): 4b23. and/or *note set_libraries(): 4b24, and + the libraries supplied as `libraries' (if any). + + `output_libname' should be a library name, not a filename; the + filename will be inferred from the library name. `output_dir' + is the directory where the library file will be put. + + `debug' is a boolean; if true, debugging information will be + included in the library (note that on most platforms, it is + the compile step where this matters: the `debug' flag is + included here just for consistency). + + `target_lang' is the target language for which the given + objects are being compiled. This allows specific linkage time + treatment of certain languages. + + Raises ‘LibError’ on failure. + + -- Method: link (target_desc, objects, output_filename[, + output_dir=None, libraries=None, library_dirs=None, + runtime_library_dirs=None, export_symbols=None, debug=0, + extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None]) + + Link a bunch of stuff together to create an executable or + shared library file. + + The “bunch of stuff” consists of the list of object files + supplied as `objects'. `output_filename' should be a + filename. If `output_dir' is supplied, `output_filename' is + relative to it (i.e. `output_filename' can provide directory + components if needed). + + `libraries' is a list of libraries to link against. These are + library names, not filenames, since they’re translated into + filenames in a platform-specific way (eg. `foo' becomes + ‘libfoo.a’ on Unix and ‘foo.lib’ on DOS/Windows). However, + they can include a directory component, which means the linker + will look in that specific directory rather than searching all + the normal locations. + + `library_dirs', if supplied, should be a list of directories + to search for libraries that were specified as bare library + names (ie. no directory component). These are on top of the + system default and those supplied to *note add_library_dir(): + 4b25. and/or *note set_library_dirs(): 4b26. + `runtime_library_dirs' is a list of directories that will be + embedded into the shared library and used to search for other + shared libraries that *it* depends on at run-time. (This may + only be relevant on Unix.) + + `export_symbols' is a list of symbols that the shared library + will export. (This appears to be relevant only on Windows.) + + `debug' is as for *note compile(): 310. and *note + create_static_lib(): 4b36, with the slight distinction that it + actually matters on most platforms (as opposed to *note + create_static_lib(): 4b36, which includes a `debug' flag + mostly for form’s sake). + + `extra_preargs' and `extra_postargs' are as for *note + compile(): 310. (except of course that they supply + command-line arguments for the particular linker being used). + + `target_lang' is the target language for which the given + objects are being compiled. This allows specific linkage time + treatment of certain languages. + + Raises ‘LinkError’ on failure. + + -- Method: link_executable (objects, output_progname[, + output_dir=None, libraries=None, library_dirs=None, + runtime_library_dirs=None, debug=0, extra_preargs=None, + extra_postargs=None, target_lang=None]) + + Link an executable. `output_progname' is the name of the file + executable, while `objects' are a list of object filenames to + link in. Other arguments are as for the *note link(): 4b37. + method. + + -- Method: link_shared_lib (objects, output_libname[, + output_dir=None, libraries=None, library_dirs=None, + runtime_library_dirs=None, export_symbols=None, debug=0, + extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None]) + + Link a shared library. `output_libname' is the name of the + output library, while `objects' is a list of object filenames + to link in. Other arguments are as for the *note link(): + 4b37. method. + + -- Method: link_shared_object (objects, output_filename[, + output_dir=None, libraries=None, library_dirs=None, + runtime_library_dirs=None, export_symbols=None, debug=0, + extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None]) + + Link a shared object. `output_filename' is the name of the + shared object that will be created, while `objects' is a list + of object filenames to link in. Other arguments are as for + the *note link(): 4b37. method. + + -- Method: preprocess (source[, output_file=None, macros=None, + include_dirs=None, extra_preargs=None, + extra_postargs=None]) + + Preprocess a single C/C++ source file, named in `source'. + Output will be written to file named `output_file', or + `stdout' if `output_file' not supplied. `macros' is a list of + macro definitions as for *note compile(): 310, which will + augment the macros set with *note define_macro(): 4b29. and + *note undefine_macro(): 4b2a. `include_dirs' is a list of + directory names that will be added to the default list, in the + same way as *note add_include_dir(): 4b21. + + Raises ‘PreprocessError’ on failure. + + The following utility methods are defined by the *note CCompiler: + 4b1b. class, for use by the various concrete subclasses. + + -- Method: executable_filename (basename[, strip_dir=0, + output_dir='']) + + Returns the filename of the executable for the given + `basename'. Typically for non-Windows platforms this is the + same as the basename, while Windows will get a ‘.exe’ added. + + -- Method: library_filename (libname[, lib_type='static', + strip_dir=0, output_dir='']) + + Returns the filename for the given library name on the current + platform. On Unix a library with `lib_type' of ‘'static'’ + will typically be of the form ‘liblibname.a’, while a + `lib_type' of ‘'dynamic'’ will be of the form ‘liblibname.so’. + + -- Method: object_filenames (source_filenames[, strip_dir=0, + output_dir='']) + + Returns the name of the object files for the given source + files. `source_filenames' should be a list of filenames. + + -- Method: shared_object_filename (basename[, strip_dir=0, + output_dir='']) + + Returns the name of a shared object file for the given file + name `basename'. + + -- Method: execute (func, args[, msg=None, level=1]) + + Invokes *note distutils.util.execute(): 4b41. This method + invokes a Python function `func' with the given arguments + `args', after logging and taking into account the `dry_run' + flag. + + -- Method: spawn (cmd) + + Invokes ‘distutils.util.spawn()’. This invokes an external + process to run the given command. + + -- Method: mkpath (name[, mode=511]) + + Invokes *note distutils.dir_util.mkpath(): 4b44. This creates + a directory and any missing ancestor directories. + + -- Method: move_file (src, dst) + + Invokes *note distutils.file_util.move_file(): 4b46. Renames + `src' to `dst'. + + -- Method: announce (msg[, level=1]) + + Write a message using ‘distutils.log.debug()’. + + -- Method: warn (msg) + + Write a warning message `msg' to standard error. + + -- Method: debug_print (msg) + + If the `debug' flag is set on this *note CCompiler: 4b1b. + instance, print `msg' to standard output, otherwise do + nothing. + + +File: python.info, Node: distutils unixccompiler — Unix C Compiler, Next: distutils msvccompiler — Microsoft Compiler, Prev: distutils ccompiler — CCompiler base class, Up: API Reference + +17.9.3 ‘distutils.unixccompiler’ — Unix C Compiler +-------------------------------------------------- + +This module provides the ‘UnixCCompiler’ class, a subclass of +‘CCompiler’ that handles the typical Unix-style command-line C compiler: + + * macros defined with ‘-Dname[=value]’ + + * macros undefined with ‘-Uname’ + + * include search directories specified with ‘-Idir’ + + * libraries specified with ‘-llib’ + + * library search directories specified with ‘-Ldir’ + + * compile handled by ‘cc’ (or similar) executable with ‘-c’ option: + compiles ‘.c’ to ‘.o’ + + * link static library handled by ‘ar’ command (possibly with + ‘ranlib’) + + * link shared library handled by ‘cc’ ‘-shared’ + + +File: python.info, Node: distutils msvccompiler — Microsoft Compiler, Next: distutils bcppcompiler — Borland Compiler, Prev: distutils unixccompiler — Unix C Compiler, Up: API Reference + +17.9.4 ‘distutils.msvccompiler’ — Microsoft Compiler +---------------------------------------------------- + +This module provides ‘MSVCCompiler’, an implementation of the abstract +‘CCompiler’ class for Microsoft Visual Studio. Typically, extension +modules need to be compiled with the same compiler that was used to +compile Python. For Python 2.3 and earlier, the compiler was Visual +Studio 6. For Python 2.4 and 2.5, the compiler is Visual Studio .NET +2003. + +‘MSVCCompiler’ will normally choose the right compiler, linker etc. on +its own. To override this choice, the environment variables +`DISTUTILS_USE_SDK' and `MSSdk' must be both set. `MSSdk' indicates +that the current environment has been setup by the SDK’s ‘SetEnv.Cmd’ +script, or that the environment variables had been registered when the +SDK was installed; `DISTUTILS_USE_SDK' indicates that the distutils user +has made an explicit choice to override the compiler selection by +‘MSVCCompiler’. + + +File: python.info, Node: distutils bcppcompiler — Borland Compiler, Next: distutils cygwincompiler — Cygwin Compiler, Prev: distutils msvccompiler — Microsoft Compiler, Up: API Reference + +17.9.5 ‘distutils.bcppcompiler’ — Borland Compiler +-------------------------------------------------- + +This module provides ‘BorlandCCompiler’, a subclass of the abstract +‘CCompiler’ class for the Borland C++ compiler. + + +File: python.info, Node: distutils cygwincompiler — Cygwin Compiler, Next: distutils archive_util — Archiving utilities, Prev: distutils bcppcompiler — Borland Compiler, Up: API Reference + +17.9.6 ‘distutils.cygwincompiler’ — Cygwin Compiler +--------------------------------------------------- + +This module provides the ‘CygwinCCompiler’ class, a subclass of +‘UnixCCompiler’ that handles the Cygwin port of the GNU C compiler to +Windows. It also contains the Mingw32CCompiler class which handles the +mingw32 port of GCC (same as cygwin in no-cygwin mode). + + +File: python.info, Node: distutils archive_util — Archiving utilities, Next: distutils dep_util — Dependency checking, Prev: distutils cygwincompiler — Cygwin Compiler, Up: API Reference + +17.9.7 ‘distutils.archive_util’ — Archiving utilities +----------------------------------------------------- + +This module provides a few functions for creating archive files, such as +tarballs or zipfiles. + + -- Function: distutils.archive_util.make_archive (base_name, format[, + root_dir=None, base_dir=None, verbose=0, dry_run=0]) + + Create an archive file (eg. ‘zip’ or ‘tar’). `base_name' is the + name of the file to create, minus any format-specific extension; + `format' is the archive format: one of ‘zip’, ‘tar’, ‘gztar’, + ‘bztar’, ‘xztar’, or ‘ztar’. `root_dir' is a directory that will + be the root directory of the archive; ie. we typically ‘chdir’ + into `root_dir' before creating the archive. `base_dir' is the + directory where we start archiving from; ie. `base_dir' will be + the common prefix of all files and directories in the archive. + `root_dir' and `base_dir' both default to the current directory. + Returns the name of the archive file. + + Changed in version 3.5: Added support for the ‘xztar’ format. + + -- Function: distutils.archive_util.make_tarball (base_name, base_dir[, + compress='gzip', verbose=0, dry_run=0]) + + ‘Create an (optional compressed) archive as a tar file from all + files in and under `base_dir'. `compress' must be ‘'gzip'’ (the + default), ‘'bzip2'’, ‘'xz'’, ‘'compress'’, or ‘None’. For the + ‘'compress'’ method the compression utility named by ‘compress’ + must be on the default program search path, so this is probably + Unix-specific. The output tar file will be named ‘base_dir.tar’, + possibly plus the appropriate compression extension (‘.gz’, ‘.bz2’, + ‘.xz’ or ‘.Z’). Return the output filename. + + Changed in version 3.5: Added support for the ‘xz’ compression. + + -- Function: distutils.archive_util.make_zipfile (base_name, base_dir[, + verbose=0, dry_run=0]) + + Create a zip file from all files in and under `base_dir'. The + output zip file will be named `base_name' + ‘.zip’. Uses either + the *note zipfile: 14d. Python module (if available) or the InfoZIP + ‘zip’ utility (if installed and found on the default search path). + If neither tool is available, raises ‘DistutilsExecError’. Returns + the name of the output zip file. + + +File: python.info, Node: distutils dep_util — Dependency checking, Next: distutils dir_util — Directory tree operations, Prev: distutils archive_util — Archiving utilities, Up: API Reference + +17.9.8 ‘distutils.dep_util’ — Dependency checking +------------------------------------------------- + +This module provides functions for performing simple, timestamp-based +dependency of files and groups of files; also, functions based entirely +on such timestamp dependency analysis. + + -- Function: distutils.dep_util.newer (source, target) + + Return true if `source' exists and is more recently modified than + `target', or if `source' exists and `target' doesn’t. Return false + if both exist and `target' is the same age or newer than `source'. + Raise ‘DistutilsFileError’ if `source' does not exist. + + -- Function: distutils.dep_util.newer_pairwise (sources, targets) + + Walk two filename lists in parallel, testing if each source is + newer than its corresponding target. Return a pair of lists + (`sources', `targets') where source is newer than target, according + to the semantics of *note newer(): 4b53. + + -- Function: distutils.dep_util.newer_group (sources, target[, + missing='error']) + + Return true if `target' is out-of-date with respect to any file + listed in `sources'. In other words, if `target' exists and is + newer than every file in `sources', return false; otherwise return + true. `missing' controls what we do when a source file is missing; + the default (‘'error'’) is to blow up with an *note OSError: 413. + from inside *note os.stat(): 653.; if it is ‘'ignore'’, we silently + drop any missing source files; if it is ‘'newer'’, any missing + source files make us assume that `target' is out-of-date (this is + handy in “dry-run” mode: it’ll make you pretend to carry out + commands that wouldn’t work because inputs are missing, but that + doesn’t matter because you’re not actually going to run the + commands). + + +File: python.info, Node: distutils dir_util — Directory tree operations, Next: distutils file_util — Single file operations, Prev: distutils dep_util — Dependency checking, Up: API Reference + +17.9.9 ‘distutils.dir_util’ — Directory tree operations +------------------------------------------------------- + +This module provides functions for operating on directories and trees of +directories. + + -- Function: distutils.dir_util.mkpath (name[, mode=0o777, verbose=0, + dry_run=0]) + + Create a directory and any missing ancestor directories. If the + directory already exists (or if `name' is the empty string, which + means the current directory, which of course exists), then do + nothing. Raise ‘DistutilsFileError’ if unable to create some + directory along the way (eg. some sub-path exists, but is a file + rather than a directory). If `verbose' is true, print a one-line + summary of each mkdir to stdout. Return the list of directories + actually created. + + -- Function: distutils.dir_util.create_tree (base_dir, files[, + mode=0o777, verbose=0, dry_run=0]) + + Create all the empty directories under `base_dir' needed to put + `files' there. `base_dir' is just the name of a directory which + doesn’t necessarily exist yet; `files' is a list of filenames to be + interpreted relative to `base_dir'. `base_dir' + the directory + portion of every file in `files' will be created if it doesn’t + already exist. `mode', `verbose' and `dry_run' flags are as for + *note mkpath(): 4b44. + + -- Function: distutils.dir_util.copy_tree (src, dst[, preserve_mode=1, + preserve_times=1, preserve_symlinks=0, update=0, verbose=0, + dry_run=0]) + + Copy an entire directory tree `src' to a new location `dst'. Both + `src' and `dst' must be directory names. If `src' is not a + directory, raise ‘DistutilsFileError’. If `dst' does not exist, it + is created with *note mkpath(): 4b44. The end result of the copy + is that every file in `src' is copied to `dst', and directories + under `src' are recursively copied to `dst'. Return the list of + files that were copied or might have been copied, using their + output name. The return value is unaffected by `update' or + `dry_run': it is simply the list of all files under `src', with the + names changed to be under `dst'. + + `preserve_mode' and `preserve_times' are the same as for *note + distutils.file_util.copy_file(): 4b59.; note that they only apply + to regular files, not to directories. If `preserve_symlinks' is + true, symlinks will be copied as symlinks (on platforms that + support them!); otherwise (the default), the destination of the + symlink will be copied. `update' and `verbose' are the same as for + ‘copy_file()’. + + Files in `src' that begin with ‘.nfs’ are skipped (more information + on these files is available in answer D2 of the NFS FAQ page(1)). + + Changed in version 3.3.1: NFS files are ignored. + + -- Function: distutils.dir_util.remove_tree (directory[, verbose=0, + dry_run=0]) + + Recursively remove `directory' and all files and directories + underneath it. Any errors are ignored (apart from being reported + to ‘sys.stdout’ if `verbose' is true). + + ---------- Footnotes ---------- + + (1) http://nfs.sourceforge.net/#section_d + + +File: python.info, Node: distutils file_util — Single file operations, Next: distutils util — Miscellaneous other utility functions, Prev: distutils dir_util — Directory tree operations, Up: API Reference + +17.9.10 ‘distutils.file_util’ — Single file operations +------------------------------------------------------ + +This module contains some utility functions for operating on individual +files. + + -- Function: distutils.file_util.copy_file (src, dst[, preserve_mode=1, + preserve_times=1, update=0, link=None, verbose=0, dry_run=0]) + + Copy file `src' to `dst'. If `dst' is a directory, then `src' is + copied there with the same name; otherwise, it must be a filename. + (If the file exists, it will be ruthlessly clobbered.) If + `preserve_mode' is true (the default), the file’s mode (type and + permission bits, or whatever is analogous on the current platform) + is copied. If `preserve_times' is true (the default), the + last-modified and last-access times are copied as well. If + `update' is true, `src' will only be copied if `dst' does not + exist, or if `dst' does exist but is older than `src'. + + `link' allows you to make hard links (using *note os.link(): d9a.) + or symbolic links (using *note os.symlink(): da0.) instead of + copying: set it to ‘'hard'’ or ‘'sym'’; if it is ‘None’ (the + default), files are copied. Don’t set `link' on systems that don’t + support it: *note copy_file(): 4b59. doesn’t check if hard or + symbolic linking is available. It uses ‘_copy_file_contents()’ to + copy file contents. + + Return a tuple ‘(dest_name, copied)’: `dest_name' is the actual + name of the output file, and `copied' is true if the file was + copied (or would have been copied, if `dry_run' true). + + -- Function: distutils.file_util.move_file (src, dst[, verbose, + dry_run]) + + Move file `src' to `dst'. If `dst' is a directory, the file will + be moved into it with the same name; otherwise, `src' is just + renamed to `dst'. Returns the new full name of the file. + + Warning: Handles cross-device moves on Unix using *note + copy_file(): 4b59. What about other systems? + + -- Function: distutils.file_util.write_file (filename, contents) + + Create a file called `filename' and write `contents' (a sequence of + strings without line terminators) to it. + + +File: python.info, Node: distutils util — Miscellaneous other utility functions, Next: distutils dist — The Distribution class, Prev: distutils file_util — Single file operations, Up: API Reference + +17.9.11 ‘distutils.util’ — Miscellaneous other utility functions +---------------------------------------------------------------- + +This module contains other assorted bits and pieces that don’t fit into +any other utility module. + + -- Function: distutils.util.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 + ‘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: + + * ‘linux-i586’ + + * ‘linux-alpha’ + + * ‘solaris-2.6-sun4u’ + + For non-POSIX platforms, currently just returns ‘sys.platform’. + + For macOS systems the OS version reflects the minimal version on + which binaries will run (that is, the value of + ‘MACOSX_DEPLOYMENT_TARGET’ during the build of Python), not the OS + version of the current system. + + For universal binary builds on macOS the architecture value + reflects the universal binary status instead of the architecture of + the current processor. For 32-bit universal binaries the + architecture is ‘fat’, for 64-bit universal binaries the + architecture is ‘fat64’, and for 4-way universal binaries the + architecture is ‘universal’. Starting from Python 2.7 and Python + 3.2 the architecture ‘fat3’ is used for a 3-way universal build + (ppc, i386, x86_64) and ‘intel’ is used for a universal build with + the i386 and x86_64 architectures + + Examples of returned values on macOS: + + * ‘macosx-10.3-ppc’ + + * ‘macosx-10.3-fat’ + + * ‘macosx-10.5-universal’ + + * ‘macosx-10.6-intel’ + + For AIX, Python 3.9 and later return a string starting with “aix”, + followed by additional fields (separated by ‘'-'’) that represent + the combined values of AIX Version, Release and Technology Level + (first field), Build Date (second field), and bit-size (third + field). Python 3.8 and earlier returned only a single additional + field with the AIX Version and Release. + + Examples of returned values on AIX: + + * ‘aix-5307-0747-32’ # 32-bit build on AIX ‘oslevel -s’: + 5300-07-00-0000 + + * ‘aix-7105-1731-64’ # 64-bit build on AIX ‘oslevel -s’: + 7100-05-01-1731 + + * ‘aix-7.2’ # Legacy form reported in Python 3.8 and earlier + + Changed in version 3.9: The AIX platform string format now also + includes the technology level, build date, and ABI bit-size. + + -- Function: distutils.util.convert_path (pathname) + + Return ‘pathname’ as a name that will work on the native + filesystem, i.e. split it on ‘/’ and put it back together again + using the current directory separator. Needed because filenames in + the setup script are always supplied in Unix style, and have to be + converted to the local convention before we can actually use them + in the filesystem. Raises *note ValueError: 1c8. on non-Unix-ish + systems if `pathname' either starts or ends with a slash. + + -- Function: distutils.util.change_root (new_root, pathname) + + Return `pathname' with `new_root' prepended. If `pathname' is + relative, this is equivalent to ‘os.path.join(new_root,pathname)’ + Otherwise, it requires making `pathname' relative and then joining + the two, which is tricky on DOS/Windows. + + -- Function: distutils.util.check_environ () + + Ensure that ‘os.environ’ has all the environment variables we + guarantee that users can use in config files, command-line options, + etc. Currently this includes: + + * ‘HOME’ - user’s home directory (Unix only) + + * ‘PLAT’ - description of the current platform, including + hardware and OS (see *note get_platform(): 4b5e.) + + -- Function: distutils.util.subst_vars (s, local_vars) + + Perform shell/Perl-style variable substitution on `s'. Every + occurrence of ‘$’ followed by a name is considered a variable, and + variable is substituted by the value found in the `local_vars' + dictionary, or in ‘os.environ’ if it’s not in `local_vars'. + `os.environ' is first checked/augmented to guarantee that it + contains certain values: see *note check_environ(): 4b61. Raise + *note ValueError: 1c8. for any variables not found in either + `local_vars' or ‘os.environ’. + + Note that this is not a full-fledged string interpolation function. + A valid ‘$variable’ can consist only of upper and lower case + letters, numbers and an underscore. No { } or ( ) style quoting is + available. + + -- Function: distutils.util.split_quoted (s) + + Split a string up according to Unix shell-like rules for quotes and + backslashes. In short: words are delimited by spaces, as long as + those spaces are not escaped by a backslash, or inside a quoted + string. Single and double quotes are equivalent, and the quote + characters can be backslash-escaped. The backslash is stripped + from any two-character escape sequence, leaving only the escaped + character. The quote characters are stripped from any quoted + string. Returns a list of words. + + -- Function: distutils.util.execute (func, args[, msg=None, verbose=0, + dry_run=0]) + + Perform some action that affects the outside world (for instance, + writing to the filesystem). Such actions are special because they + are disabled by the `dry_run' flag. This method takes care of all + that bureaucracy for you; all you have to do is supply the function + to call and an argument tuple for it (to embody the “external + action” being performed), and an optional message to print. + + -- Function: distutils.util.strtobool (val) + + Convert a string representation of truth to true (1) or false (0). + + True values are ‘y’, ‘yes’, ‘t’, ‘true’, ‘on’ and ‘1’; false values + are ‘n’, ‘no’, ‘f’, ‘false’, ‘off’ and ‘0’. Raises *note + ValueError: 1c8. if `val' is anything else. + + -- Function: distutils.util.byte_compile (py_files[, optimize=0, + force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, + direct=None]) + + Byte-compile a collection of Python source files to ‘.pyc’ files in + a ‘__pycache__’ subdirectory (see PEP 3147(1) and PEP 488(2)). + `py_files' is a list of files to compile; any files that don’t end + in ‘.py’ are silently skipped. `optimize' must be one of the + following: + + * ‘0’ - don’t optimize + + * ‘1’ - normal optimization (like ‘python -O’) + + * ‘2’ - extra optimization (like ‘python -OO’) + + If `force' is true, all files are recompiled regardless of + timestamps. + + The source filename encoded in each *note bytecode: 16f. file + defaults to the filenames listed in `py_files'; you can modify + these with `prefix' and `basedir'. `prefix' is a string that will + be stripped off of each source filename, and `base_dir' is a + directory name that will be prepended (after `prefix' is stripped). + You can supply either or both (or neither) of `prefix' and + `base_dir', as you wish. + + If `dry_run' is true, doesn’t actually do anything that would + affect the filesystem. + + Byte-compilation is either done directly in this interpreter + process with the standard *note py_compile: d4. module, or + indirectly by writing a temporary script and executing it. + Normally, you should let *note byte_compile(): 4b64. figure out to + use direct compilation or not (see the source for details). The + `direct' flag is used by the script generated in indirect mode; + unless you know what you’re doing, leave it set to ‘None’. + + Changed in version 3.2.3: Create ‘.pyc’ files with an *note import + magic tag: 4075. in their name, in a ‘__pycache__’ subdirectory + instead of files without tag in the current directory. + + Changed in version 3.5: Create ‘.pyc’ files according to PEP + 488(3). + + -- Function: distutils.util.rfc822_escape (header) + + Return a version of `header' escaped for inclusion in an RFC 822(4) + header, by ensuring there are 8 spaces space after each newline. + Note that it does no other modification of the string. + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-3147/ + + (2) https://peps.python.org/pep-0488/ + + (3) https://peps.python.org/pep-0488/ + + (4) https://datatracker.ietf.org/doc/html/rfc822.html + + +File: python.info, Node: distutils dist — The Distribution class, Next: distutils extension — The Extension class, Prev: distutils util — Miscellaneous other utility functions, Up: API Reference + +17.9.12 ‘distutils.dist’ — The Distribution class +------------------------------------------------- + +This module provides the *note Distribution: 4b17. class, which +represents the module distribution being built/installed/distributed. + + +File: python.info, Node: distutils extension — The Extension class, Next: distutils debug — Distutils debug mode, Prev: distutils dist — The Distribution class, Up: API Reference + +17.9.13 ‘distutils.extension’ — The Extension class +--------------------------------------------------- + +This module provides the ‘Extension’ class, used to describe C/C++ +extension modules in setup scripts. + + +File: python.info, Node: distutils debug — Distutils debug mode, Next: distutils errors — Distutils exceptions, Prev: distutils extension — The Extension class, Up: API Reference + +17.9.14 ‘distutils.debug’ — Distutils debug mode +------------------------------------------------ + +This module provides the DEBUG flag. + + +File: python.info, Node: distutils errors — Distutils exceptions, Next: distutils fancy_getopt — Wrapper around the standard getopt module, Prev: distutils debug — Distutils debug mode, Up: API Reference + +17.9.15 ‘distutils.errors’ — Distutils exceptions +------------------------------------------------- + +Provides exceptions used by the Distutils modules. Note that Distutils +modules may raise standard exceptions; in particular, SystemExit is +usually raised for errors that are obviously the end-user’s fault (eg. +bad command-line arguments). + +This module is safe to use in ‘from ... import *’ mode; it only exports +symbols whose names start with ‘Distutils’ and end with ‘Error’. + + +File: python.info, Node: distutils fancy_getopt — Wrapper around the standard getopt module, Next: distutils filelist — The FileList class, Prev: distutils errors — Distutils exceptions, Up: API Reference + +17.9.16 ‘distutils.fancy_getopt’ — Wrapper around the standard getopt module +---------------------------------------------------------------------------- + +This module provides a wrapper around the standard *note getopt: 81. +module that provides the following additional features: + + * short and long options are tied together + + * options have help strings, so *note fancy_getopt(): 4b6b. could + potentially create a complete usage summary + + * options set attributes of a passed-in object + + * boolean options can have “negative aliases” — eg. if ‘--quiet’ is + the “negative alias” of ‘--verbose’, then ‘--quiet’ on the command + line sets `verbose' to false. + + -- Function: distutils.fancy_getopt.fancy_getopt (options, + negative_opt, object, args) + + Wrapper function. `options' is a list of ‘(long_option, + short_option, help_string)’ 3-tuples as described in the + constructor for *note FancyGetopt: 4b6c. `negative_opt' should be + a dictionary mapping option names to option names, both the key and + value should be in the `options' list. `object' is an object which + will be used to store values (see the *note getopt(): 81. method of + the *note FancyGetopt: 4b6c. class). `args' is the argument list. + Will use ‘sys.argv[1:]’ if you pass ‘None’ as `args'. + + -- Function: distutils.fancy_getopt.wrap_text (text, width) + + Wraps `text' to less than `width' wide. + + -- Class: distutils.fancy_getopt.FancyGetopt ([option_table=None]) + + The option_table is a list of 3-tuples: ‘(long_option, + short_option, help_string)’ + + If an option takes an argument, its `long_option' should have ‘'='’ + appended; `short_option' should just be a single character, no + ‘':'’ in any case. `short_option' should be ‘None’ if a + `long_option' doesn’t have a corresponding `short_option'. All + option tuples must have long options. + +The *note FancyGetopt: 4b6c. class provides the following methods: + + -- Method: FancyGetopt.getopt ([args=None, object=None]) + + Parse command-line options in args. Store as attributes on + `object'. + + If `args' is ‘None’ or not supplied, uses ‘sys.argv[1:]’. If + `object' is ‘None’ or not supplied, creates a new ‘OptionDummy’ + instance, stores option values there, and returns a tuple ‘(args, + object)’. If `object' is supplied, it is modified in place and + *note getopt(): 81. just returns `args'; in both cases, the + returned `args' is a modified copy of the passed-in `args' list, + which is left untouched. + + -- Method: FancyGetopt.get_option_order () + + Returns the list of ‘(option, value)’ tuples processed by the + previous run of *note getopt(): 81. Raises *note RuntimeError: 6e9. + if *note getopt(): 81. hasn’t been called yet. + + -- Method: FancyGetopt.generate_help ([header=None]) + + Generate help text (a list of strings, one per suggested line of + output) from the option table for this *note FancyGetopt: 4b6c. + object. + + If supplied, prints the supplied `header' at the top of the help. + + +File: python.info, Node: distutils filelist — The FileList class, Next: distutils log — Simple PEP 282-style logging, Prev: distutils fancy_getopt — Wrapper around the standard getopt module, Up: API Reference + +17.9.17 ‘distutils.filelist’ — The FileList class +------------------------------------------------- + +This module provides the ‘FileList’ class, used for poking about the +filesystem and building lists of files. + + +File: python.info, Node: distutils log — Simple PEP 282-style logging, Next: distutils spawn — Spawn a sub-process, Prev: distutils filelist — The FileList class, Up: API Reference + +17.9.18 ‘distutils.log’ — Simple +-------------------------------- + +`PEP 282'-style logging + + +File: python.info, Node: distutils spawn — Spawn a sub-process, Next: distutils sysconfig — System configuration information, Prev: distutils log — Simple PEP 282-style logging, Up: API Reference + +17.9.19 ‘distutils.spawn’ — Spawn a sub-process +----------------------------------------------- + +This module provides the ‘spawn()’ function, a front-end to various +platform-specific functions for launching another program in a +sub-process. Also provides ‘find_executable()’ to search the path for a +given executable name. + + +File: python.info, Node: distutils sysconfig — System configuration information, Next: distutils text_file — The TextFile class, Prev: distutils spawn — Spawn a sub-process, Up: API Reference + +17.9.20 ‘distutils.sysconfig’ — System configuration information +---------------------------------------------------------------- + +Deprecated since version 3.10: *note distutils.sysconfig: 5e. has been +merged into *note sysconfig: fa. + +The *note distutils.sysconfig: 5e. module provides access to Python’s +low-level configuration information. The specific configuration +variables available depend heavily on the platform and configuration. +The specific variables depend on the build process for the specific +version of Python being run; the variables are those found in the +‘Makefile’ and configuration header that are installed with Python on +Unix systems. The configuration header is called ‘pyconfig.h’ for +Python versions starting with 2.2, and ‘config.h’ for earlier versions +of Python. + +Some additional functions are provided which perform some useful +manipulations for other parts of the *note distutils: 37. package. + + -- Data: distutils.sysconfig.PREFIX + + The result of ‘os.path.normpath(sys.prefix)’. + + -- Data: distutils.sysconfig.EXEC_PREFIX + + The result of ‘os.path.normpath(sys.exec_prefix)’. + + -- Function: distutils.sysconfig.get_config_var (name) + + Return the value of a single variable. This is equivalent to + ‘get_config_vars().get(name)’. + + -- Function: distutils.sysconfig.get_config_vars (...) + + Return a set of variable definitions. If there are no arguments, + this returns a dictionary mapping names of configuration variables + to values. If arguments are provided, they should be strings, and + the return value will be a sequence giving the associated values. + If a given name does not have a corresponding value, ‘None’ will be + included for that variable. + + -- Function: distutils.sysconfig.get_config_h_filename () + + Return the full path name of the configuration header. For Unix, + this will be the header generated by the ‘configure’ script; for + other platforms the header will have been supplied directly by the + Python source distribution. The file is a platform-specific text + file. + + -- Function: distutils.sysconfig.get_makefile_filename () + + Return the full path name of the ‘Makefile’ used to build Python. + For Unix, this will be a file generated by the ‘configure’ script; + the meaning for other platforms will vary. The file is a + platform-specific text file, if it exists. This function is only + useful on POSIX platforms. + +The following functions are deprecated together with this module and +they have no direct replacement. + + -- Function: distutils.sysconfig.get_python_inc ([plat_specific[, + prefix]]) + + Return the directory for either the general or platform-dependent C + include files. If `plat_specific' is true, the platform-dependent + include directory is returned; if false or omitted, the + platform-independent directory is returned. If `prefix' is given, + it is used as either the prefix instead of *note PREFIX: 4b75, or + as the exec-prefix instead of *note EXEC_PREFIX: 4b76. if + `plat_specific' is true. + + -- Function: distutils.sysconfig.get_python_lib ([plat_specific[, + standard_lib[, prefix]]]) + + Return the directory for either the general or platform-dependent + library installation. If `plat_specific' is true, the + platform-dependent include directory is returned; if false or + omitted, the platform-independent directory is returned. If + `prefix' is given, it is used as either the prefix instead of *note + PREFIX: 4b75, or as the exec-prefix instead of *note EXEC_PREFIX: + 4b76. if `plat_specific' is true. If `standard_lib' is true, the + directory for the standard library is returned rather than the + directory for the installation of third-party extensions. + +The following function is only intended for use within the *note +distutils: 37. package. + + -- Function: distutils.sysconfig.customize_compiler (compiler) + + Do any platform-specific customization of a *note + distutils.ccompiler.CCompiler: 4b1b. instance. + + This function is only needed on Unix at this time, but should be + called consistently to support forward-compatibility. It inserts + the information that varies across Unix flavors and is stored in + Python’s ‘Makefile’. This information includes the selected + compiler, compiler and linker options, and the extension used by + the linker for shared objects. + +This function is even more special-purpose, and should only be used from +Python’s own build procedures. + + -- Function: distutils.sysconfig.set_python_build () + + Inform the *note distutils.sysconfig: 5e. module that it is being + used as part of the build process for Python. This changes a lot + of relative locations for files, allowing them to be located in the + build area rather than in an installed Python. + + +File: python.info, Node: distutils text_file — The TextFile class, Next: distutils version — Version number classes, Prev: distutils sysconfig — System configuration information, Up: API Reference + +17.9.21 ‘distutils.text_file’ — The TextFile class +-------------------------------------------------- + +This module provides the *note TextFile: 4b80. class, which gives an +interface to text files that (optionally) takes care of stripping +comments, ignoring blank lines, and joining lines with backslashes. + + -- Class: distutils.text_file.TextFile ([filename=None, file=None, + **options]) + + This class provides a file-like object that takes care of all the + things you commonly want to do when processing a text file that has + some line-by-line syntax: strip comments (as long as ‘#’ is your + comment character), skip blank lines, join adjacent lines by + escaping the newline (ie. backslash at end of line), strip leading + and/or trailing whitespace. All of these are optional and + independently controllable. + + The class provides a *note warn(): 4b81. method so you can generate + warning messages that report physical line number, even if the + logical line in question spans multiple physical lines. Also + provides *note unreadline(): 4b82. for implementing line-at-a-time + lookahead. + + *note TextFile: 4b80. instances are create with either `filename', + `file', or both. *note RuntimeError: 6e9. is raised if both are + ‘None’. `filename' should be a string, and `file' a file object + (or something that provides *note readline(): db. and *note + close(): 4b83. methods). It is recommended that you supply at + least `filename', so that *note TextFile: 4b80. can include it in + warning messages. If `file' is not supplied, *note TextFile: 4b80. + creates its own using the *note open(): 30b. built-in function. + + The options are all boolean, and affect the values returned by + *note readline(): db. + + option name description default + + -------------------------------------------------------------------------- + + `strip_comments' strip from ‘'#'’ to end-of-line, true + as well as any whitespace leading + up to the ‘'#'’—unless it is + escaped by a backslash + + + `lstrip_ws' strip leading whitespace from each false + line before returning it + + + `rstrip_ws' strip trailing whitespace true + (including line terminator!) from + each line before returning it. + + + `skip_blanks' skip lines that are empty *after* true + stripping comments and whitespace. + (If both lstrip_ws and rstrip_ws + are false, then some lines may + consist of solely whitespace: + these will *not* be skipped, even + if `skip_blanks' is true.) + + + `join_lines' if a backslash is the last false + non-newline character on a line + after stripping comments and + whitespace, join the following + line to it to form one logical + line; if N consecutive lines end + with a backslash, then N+1 + physical lines will be joined to + form one logical line. + + + `collapse_join' strip leading whitespace from false + lines that are joined to their + predecessor; only matters if + ‘(join_lines and not lstrip_ws)’ + + + Note that since `rstrip_ws' can strip the trailing newline, the + semantics of *note readline(): db. must differ from those of the + built-in file object’s *note readline(): db. method! In + particular, *note readline(): db. returns ‘None’ for end-of-file: + an empty string might just be a blank line (or an all-whitespace + line), if `rstrip_ws' is true but `skip_blanks' is not. + + -- Method: open (filename) + + Open a new file `filename'. This overrides any `file' or + `filename' constructor arguments. + + -- Method: close () + + Close the current file and forget everything we know about it + (including the filename and the current line number). + + -- Method: warn (msg[, line=None]) + + Print (to stderr) a warning message tied to the current + logical line in the current file. If the current logical line + in the file spans multiple physical lines, the warning refers + to the whole range, such as ‘"lines 3-5"’. If `line' is + supplied, it overrides the current line number; it may be a + list or tuple to indicate a range of physical lines, or an + integer for a single physical line. + + -- Method: readline () + + Read and return a single logical line from the current file + (or from an internal buffer if lines have previously been + “unread” with *note unreadline(): 4b82.). If the `join_lines' + option is true, this may involve reading multiple physical + lines concatenated into a single string. Updates the current + line number, so calling *note warn(): 4b81. after *note + readline(): db. emits a warning about the physical line(s) + just read. Returns ‘None’ on end-of-file, since the empty + string can occur if `rstrip_ws' is true but `strip_blanks' is + not. + + -- Method: readlines () + + Read and return the list of all logical lines remaining in the + current file. This updates the current line number to the + last line of the file. + + -- Method: unreadline (line) + + Push `line' (a string) onto an internal buffer that will be + checked by future *note readline(): db. calls. Handy for + implementing a parser with line-at-a-time lookahead. Note + that lines that are “unread” with *note unreadline(): 4b82. + are not subsequently re-cleansed (whitespace stripped, or + whatever) when read with *note readline(): db. If multiple + calls are made to *note unreadline(): 4b82. before a call to + *note readline(): db, the lines will be returned most in most + recent first order. + + +File: python.info, Node: distutils version — Version number classes, Next: distutils cmd — Abstract base class for Distutils commands, Prev: distutils text_file — The TextFile class, Up: API Reference + +17.9.22 ‘distutils.version’ — Version number classes +---------------------------------------------------- + + +File: python.info, Node: distutils cmd — Abstract base class for Distutils commands, Next: Creating a new Distutils command, Prev: distutils version — Version number classes, Up: API Reference + +17.9.23 ‘distutils.cmd’ — Abstract base class for Distutils commands +-------------------------------------------------------------------- + +This module supplies the abstract base class *note Command: 4b06. + + -- Class: distutils.cmd.Command (dist) + + Abstract base class for defining command classes, the “worker bees” + of the Distutils. A useful analogy for command classes is to think + of them as subroutines with local variables called `options'. The + options are declared in *note initialize_options(): 4b89. and + defined (given their final values) in *note finalize_options(): + 4b8a, both of which must be defined by every command class. The + distinction between the two is necessary because option values + might come from the outside world (command line, config file, …), + and any options dependent on other options must be computed after + these outside influences have been processed — hence *note + finalize_options(): 4b8a. The body of the subroutine, where it + does all its work based on the values of its options, is the *note + run(): 4b8b. method, which must also be implemented by every + command class. + + The class constructor takes a single argument `dist', a *note + Distribution: 4b17. instance. + + +File: python.info, Node: Creating a new Distutils command, Next: distutils command — Individual Distutils commands, Prev: distutils cmd — Abstract base class for Distutils commands, Up: API Reference + +17.9.24 Creating a new Distutils command +---------------------------------------- + +This section outlines the steps to create a new Distutils command. + +A new command lives in a module in the *note distutils.command: 3c. +package. There is a sample template in that directory called +‘command_template’. Copy this file to a new module with the same name +as the new command you’re implementing. This module should implement a +class with the same name as the module (and the command). So, for +instance, to create the command ‘peel_banana’ (so that users can run +‘setup.py peel_banana’), you’d copy ‘command_template’ to +‘distutils/command/peel_banana.py’, then edit it so that it’s +implementing the class ‘peel_banana’, a subclass of *note +distutils.cmd.Command: 4b06. + +Subclasses of *note Command: 4b06. must define the following methods. + + -- Method: Command.initialize_options () + + Set default values for all the options that this command supports. + Note that these defaults may be overridden by other commands, by + the setup script, by config files, or by the command-line. Thus, + this is not the place to code dependencies between options; + generally, *note initialize_options(): 4b89. implementations are + just a bunch of ‘self.foo = None’ assignments. + + -- Method: Command.finalize_options () + + Set final values for all the options that this command supports. + This is always called as late as possible, ie. after any option + assignments from the command-line or from other commands have been + done. Thus, this is the place to code option dependencies: if + `foo' depends on `bar', then it is safe to set `foo' from `bar' as + long as `foo' still has the same value it was assigned in *note + initialize_options(): 4b89. + + -- Method: Command.run () + + A command’s raison d’etre: carry out the action it exists to + perform, controlled by the options initialized in *note + initialize_options(): 4b89, customized by other commands, the setup + script, the command-line, and config files, and finalized in *note + finalize_options(): 4b8a. All terminal output and filesystem + interaction should be done by *note run(): 4b8b. + + -- Attribute: Command.sub_commands + + `sub_commands' formalizes the notion of a “family” of commands, + e.g. ‘install’ as the parent with sub-commands ‘install_lib’, + ‘install_headers’, etc. The parent of a family of commands defines + `sub_commands' as a class attribute; it’s a list of 2-tuples + ‘(command_name, predicate)’, with `command_name' a string and + `predicate' a function, a string or ‘None’. `predicate' is a + method of the parent command that determines whether the + corresponding command is applicable in the current situation. + (E.g. ‘install_headers’ is only applicable if we have any C header + files to install.) If `predicate' is ‘None’, that command is + always applicable. + + `sub_commands' is usually defined at the `end' of a class, because + predicates can be methods of the class, so they must already have + been defined. The canonical example is the ‘install’ command. + + +File: python.info, Node: distutils command — Individual Distutils commands, Next: distutils command bdist — Build a binary installer, Prev: Creating a new Distutils command, Up: API Reference + +17.9.25 ‘distutils.command’ — Individual Distutils commands +----------------------------------------------------------- + + +File: python.info, Node: distutils command bdist — Build a binary installer, Next: distutils command bdist_packager — Abstract base class for packagers, Prev: distutils command — Individual Distutils commands, Up: API Reference + +17.9.26 ‘distutils.command.bdist’ — Build a binary installer +------------------------------------------------------------ + + +File: python.info, Node: distutils command bdist_packager — Abstract base class for packagers, Next: distutils command bdist_dumb — Build a “dumb” installer, Prev: distutils command bdist — Build a binary installer, Up: API Reference + +17.9.27 ‘distutils.command.bdist_packager’ — Abstract base class for packagers +------------------------------------------------------------------------------ + + +File: python.info, Node: distutils command bdist_dumb — Build a “dumb” installer, Next: distutils command bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM, Prev: distutils command bdist_packager — Abstract base class for packagers, Up: API Reference + +17.9.28 ‘distutils.command.bdist_dumb’ — Build a “dumb” installer +----------------------------------------------------------------- + + +File: python.info, Node: distutils command bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM, Next: distutils command sdist — Build a source distribution, Prev: distutils command bdist_dumb — Build a “dumb” installer, Up: API Reference + +17.9.29 ‘distutils.command.bdist_rpm’ — Build a binary distribution as a Redhat RPM and SRPM +-------------------------------------------------------------------------------------------- + + +File: python.info, Node: distutils command sdist — Build a source distribution, Next: distutils command build — Build all files of a package, Prev: distutils command bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM, Up: API Reference + +17.9.30 ‘distutils.command.sdist’ — Build a source distribution +--------------------------------------------------------------- + + +File: python.info, Node: distutils command build — Build all files of a package, Next: distutils command build_clib — Build any C libraries in a package, Prev: distutils command sdist — Build a source distribution, Up: API Reference + +17.9.31 ‘distutils.command.build’ — Build all files of a package +---------------------------------------------------------------- + + +File: python.info, Node: distutils command build_clib — Build any C libraries in a package, Next: distutils command build_ext — Build any extensions in a package, Prev: distutils command build — Build all files of a package, Up: API Reference + +17.9.32 ‘distutils.command.build_clib’ — Build any C libraries in a package +--------------------------------------------------------------------------- + + +File: python.info, Node: distutils command build_ext — Build any extensions in a package, Next: distutils command build_py — Build the py/ pyc files of a package, Prev: distutils command build_clib — Build any C libraries in a package, Up: API Reference + +17.9.33 ‘distutils.command.build_ext’ — Build any extensions in a package +------------------------------------------------------------------------- + + +File: python.info, Node: distutils command build_py — Build the py/ pyc files of a package, Next: distutils command build_scripts — Build the scripts of a package, Prev: distutils command build_ext — Build any extensions in a package, Up: API Reference + +17.9.34 ‘distutils.command.build_py’ — Build the .py/.pyc files of a package +---------------------------------------------------------------------------- + + -- Class: distutils.command.build_py.build_py + + -- Class: distutils.command.build_py.build_py_2to3 + + Alternative implementation of build_py which also runs the 2to3 + conversion library on each .py file that is going to be installed. + To use this in a setup.py file for a distribution that is designed + to run with both Python 2.x and 3.x, add: + + try: + from distutils.command.build_py import build_py_2to3 as build_py + except ImportError: + from distutils.command.build_py import build_py + + to your setup.py, and later: + + cmdclass = {'build_py': build_py} + + to the invocation of setup(). + + +File: python.info, Node: distutils command build_scripts — Build the scripts of a package, Next: distutils command clean — Clean a package build area, Prev: distutils command build_py — Build the py/ pyc files of a package, Up: API Reference + +17.9.35 ‘distutils.command.build_scripts’ — Build the scripts of a package +-------------------------------------------------------------------------- + + +File: python.info, Node: distutils command clean — Clean a package build area, Next: distutils command config — Perform package configuration, Prev: distutils command build_scripts — Build the scripts of a package, Up: API Reference + +17.9.36 ‘distutils.command.clean’ — Clean a package build area +-------------------------------------------------------------- + +This command removes the temporary files created by ‘build’ and its +subcommands, like intermediary compiled object files. With the ‘--all’ +option, the complete build directory will be removed. + +Extension modules built *note in place: 4ae2. will not be cleaned, as +they are not in the build directory. + + +File: python.info, Node: distutils command config — Perform package configuration, Next: distutils command install — Install a package, Prev: distutils command clean — Clean a package build area, Up: API Reference + +17.9.37 ‘distutils.command.config’ — Perform package configuration +------------------------------------------------------------------ + + +File: python.info, Node: distutils command install — Install a package, Next: distutils command install_data — Install data files from a package, Prev: distutils command config — Perform package configuration, Up: API Reference + +17.9.38 ‘distutils.command.install’ — Install a package +------------------------------------------------------- + + +File: python.info, Node: distutils command install_data — Install data files from a package, Next: distutils command install_headers — Install C/C++ header files from a package, Prev: distutils command install — Install a package, Up: API Reference + +17.9.39 ‘distutils.command.install_data’ — Install data files from a package +---------------------------------------------------------------------------- + + +File: python.info, Node: distutils command install_headers — Install C/C++ header files from a package, Next: distutils command install_lib — Install library files from a package, Prev: distutils command install_data — Install data files from a package, Up: API Reference + +17.9.40 ‘distutils.command.install_headers’ — Install C/C++ header files from a package +--------------------------------------------------------------------------------------- + + +File: python.info, Node: distutils command install_lib — Install library files from a package, Next: distutils command install_scripts — Install script files from a package, Prev: distutils command install_headers — Install C/C++ header files from a package, Up: API Reference + +17.9.41 ‘distutils.command.install_lib’ — Install library files from a package +------------------------------------------------------------------------------ + + +File: python.info, Node: distutils command install_scripts — Install script files from a package, Next: distutils command register — Register a module with the Python Package Index, Prev: distutils command install_lib — Install library files from a package, Up: API Reference + +17.9.42 ‘distutils.command.install_scripts’ — Install script files from a package +--------------------------------------------------------------------------------- + + +File: python.info, Node: distutils command register — Register a module with the Python Package Index, Next: distutils command check — Check the meta-data of a package, Prev: distutils command install_scripts — Install script files from a package, Up: API Reference + +17.9.43 ‘distutils.command.register’ — Register a module with the Python Package Index +-------------------------------------------------------------------------------------- + +The ‘register’ command registers the package with the Python Package +Index. This is described in more detail in PEP 301(1). + + ---------- Footnotes ---------- + + (1) https://peps.python.org/pep-0301/ + + +File: python.info, Node: distutils command check — Check the meta-data of a package, Prev: distutils command register — Register a module with the Python Package Index, Up: API Reference + +17.9.44 ‘distutils.command.check’ — Check the meta-data of a package +-------------------------------------------------------------------- + +The ‘check’ command performs some tests on the meta-data of a package. +For example, it verifies that all required meta-data are provided as the +arguments passed to the ‘setup()’ function. + + +File: python.info, Node: Installing Python Modules Legacy version, Next: Python Module Index, Prev: Distributing Python Modules Legacy version, Up: Top + +18 Installing Python Modules (Legacy version) +********************************************* + + +Author: Greg Ward + + Note: The entire ‘distutils’ package has been deprecated and will + be removed in Python 3.12. This documentation is retained as a + reference only, and will be removed with the package. See the + *note What’s New: 2f3. entry for more information. + +See also +........ + +*note Installing Python Modules: b85. + + The up to date module installation documentation. For regular + Python usage, you almost certainly want that document rather than + this one. + + Note: This document is being retained solely until the ‘setuptools’ + documentation at + ‘https://setuptools.readthedocs.io/en/latest/setuptools.html’ + independently covers all of the relevant information currently + included here. + + Note: This guide only covers the basic tools for building and + distributing extensions that are provided as part of this version + of Python. Third party tools offer easier to use and more secure + alternatives. Refer to the quick recommendations section(1) in the + Python Packaging User Guide for more information. + +* Menu: + +* Introduction: Introduction<16>. +* Standard Build and Install:: +* Alternate Installation:: +* Custom Installation:: +* Distutils Configuration Files:: +* Building Extensions; Tips and Tricks: Building Extensions Tips and Tricks. + + ---------- Footnotes ---------- + + (1) https://packaging.python.org/guides/tool-recommendations/ + + +File: python.info, Node: Introduction<16>, Next: Standard Build and Install, Up: Installing Python Modules Legacy version + +18.1 Introduction +================= + +In Python 2.0, the ‘distutils’ API was first added to the standard +library. This provided Linux distro maintainers with a standard way of +converting Python projects into Linux distro packages, and system +administrators with a standard way of installing them directly onto +target systems. + +In the many years since Python 2.0 was released, tightly coupling the +build system and package installer to the language runtime release cycle +has turned out to be problematic, and it is now recommended that +projects use the ‘pip’ package installer and the ‘setuptools’ build +system, rather than using ‘distutils’ directly. + +See *note Installing Python Modules: b85. and *note Distributing Python +Modules: b86. for more details. + +This legacy documentation is being retained only until we’re confident +that the ‘setuptools’ documentation covers everything needed. + +* Menu: + +* Distutils based source distributions:: + + +File: python.info, Node: Distutils based source distributions, Up: Introduction<16> + +18.1.1 Distutils based source distributions +------------------------------------------- + +If you download a module source distribution, you can tell pretty +quickly if it was packaged and distributed in the standard way, i.e. +using the Distutils. First, the distribution’s name and version number +will be featured prominently in the name of the downloaded archive, e.g. +‘foo-1.0.tar.gz’ or ‘widget-0.9.7.zip’. Next, the archive will unpack +into a similarly named directory: ‘foo-1.0’ or ‘widget-0.9.7’. +Additionally, the distribution will contain a setup script ‘setup.py’, +and a file named ‘README.txt’ or possibly just ‘README’, which should +explain that building and installing the module distribution is a simple +matter of running one command from a terminal: + + python setup.py install + +For Windows, this command should be run from a command prompt window +(Start ‣ Accessories): + + setup.py install + +If all these things are true, then you already know how to build and +install the modules you’ve just downloaded: Run the command above. +Unless you need to install things in a non-standard way or customize the +build process, you don’t really need this manual. Or rather, the above +command is everything you need to get out of this manual. + + +File: python.info, Node: Standard Build and Install, Next: Alternate Installation, Prev: Introduction<16>, Up: Installing Python Modules Legacy version + +18.2 Standard Build and Install +=============================== + +As described in section *note Distutils based source distributions: +4ba9, building and installing a module distribution using the Distutils +is usually one simple command to run from a terminal: + + python setup.py install + +* Menu: + +* Platform variations:: +* Splitting the job up:: +* How building works:: +* How installation works:: + + +File: python.info, Node: Platform variations, Next: Splitting the job up, Up: Standard Build and Install + +18.2.1 Platform variations +-------------------------- + +You should always run the setup command from the distribution root +directory, i.e. the top-level subdirectory that the module source +distribution unpacks into. For example, if you’ve just downloaded a +module source distribution ‘foo-1.0.tar.gz’ onto a Unix system, the +normal thing to do is: + + gunzip -c foo-1.0.tar.gz | tar xf - # unpacks into directory foo-1.0 + cd foo-1.0 + python setup.py install + +On Windows, you’d probably download ‘foo-1.0.zip’. If you downloaded +the archive file to ‘C:\Temp’, then it would unpack into +‘C:\Temp\foo-1.0’; you can use either an archive manipulator with a +graphical user interface (such as WinZip) or a command-line tool (such +as ‘unzip’ or ‘pkunzip’) to unpack the archive. Then, open a command +prompt window and run: + + cd c:\Temp\foo-1.0 + python setup.py install + + +File: python.info, Node: Splitting the job up, Next: How building works, Prev: Platform variations, Up: Standard Build and Install + +18.2.2 Splitting the job up +--------------------------- + +Running ‘setup.py install’ builds and installs all modules in one run. +If you prefer to work incrementally—especially useful if you want to +customize the build process, or if things are going wrong—you can use +the setup script to do one thing at a time. This is particularly +helpful when the build and install will be done by different users—for +example, you might want to build a module distribution and hand it off +to a system administrator for installation (or do it yourself, with +super-user privileges). + +For example, you can build everything in one step, and then install +everything in a second step, by invoking the setup script twice: + + python setup.py build + python setup.py install + +If you do this, you will notice that running the ‘install’ command first +runs the ‘build’ command, which—in this case—quickly notices that it has +nothing to do, since everything in the ‘build’ directory is up-to-date. + +You may not need this ability to break things down often if all you do +is install modules downloaded off the ‘net, but it’s very handy for more +advanced tasks. If you get into distributing your own Python modules +and extensions, you’ll run lots of individual Distutils commands on +their own. + + +File: python.info, Node: How building works, Next: How installation works, Prev: Splitting the job up, Up: Standard Build and Install + +18.2.3 How building works +------------------------- + +As implied above, the ‘build’ command is responsible for putting the +files to install into a `build directory'. By default, this is ‘build’ +under the distribution root; if you’re excessively concerned with speed, +or want to keep the source tree pristine, you can change the build +directory with the ‘--build-base’ option. For example: + + python setup.py build --build-base=/path/to/pybuild/foo-1.0 + +(Or you could do this permanently with a directive in your system or +personal Distutils configuration file; see section *note Distutils +Configuration Files: 4bb2.) Normally, this isn’t necessary. + +The default layout for the build tree is as follows: + + --- build/ --- lib/ + or + --- build/ --- lib./ + temp./ + +where ‘’ expands to a brief description of the current OS/hardware +platform and Python version. The first form, with just a ‘lib’ +directory, is used for “pure module distributions”—that is, module +distributions that include only pure Python modules. If a module +distribution contains any extensions (modules written in C/C++), then +the second form, with two ‘’ directories, is used. In that case, +the ‘temp.`plat'’ directory holds temporary files generated by the +compile/link process that don’t actually get installed. In either case, +the ‘lib’ (or ‘lib.`plat'’) directory contains all Python modules (pure +Python and extensions) that will be installed. + +In the future, more directories will be added to handle Python scripts, +documentation, binary executables, and whatever else is needed to handle +the job of installing Python modules and applications. + + +File: python.info, Node: How installation works, Prev: How building works, Up: Standard Build and Install + +18.2.4 How installation works +----------------------------- + +After the ‘build’ command runs (whether you run it explicitly, or the +‘install’ command does it for you), the work of the ‘install’ command is +relatively simple: all it has to do is copy everything under ‘build/lib’ +(or ‘build/lib.`plat'’) to your chosen installation directory. + +If you don’t choose an installation directory—i.e., if you just run +‘setup.py install’—then the ‘install’ command installs to the standard +location for third-party Python modules. This location varies by +platform and by how you built/installed Python itself. On Unix (and +macOS, which is also Unix-based), it also depends on whether the module +distribution being installed is pure Python or contains extensions +(“non-pure”): + +Platform Standard installation location Default value Notes + +--------------------------------------------------------------------------------------------------------------------------------------------------- + +Unix (pure) ‘`prefix'/lib/python`X.Y'/site-packages’ ‘/usr/local/lib/python`X.Y'/site-packages’ (1) + + +Unix (non-pure) ‘`exec-prefix'/lib/python`X.Y'/site-packages’ ‘/usr/local/lib/python`X.Y'/site-packages’ (1) + + +Windows ‘`prefix'\Lib\site-packages’ ‘C:\Python`XY'\Lib\site-packages’ (2) + + +Notes: + + 1. Most Linux distributions include Python as a standard part of the + system, so ‘`prefix'’ and ‘`exec-prefix'’ are usually both ‘/usr’ + on Linux. If you build Python yourself on Linux (or any Unix-like + system), the default ‘`prefix'’ and ‘`exec-prefix'’ are + ‘/usr/local’. + + 2. The default installation directory on Windows was ‘C:\Program + Files\Python’ under Python 1.6a1, 1.5.2, and earlier. + +‘`prefix'’ and ‘`exec-prefix'’ stand for the directories that Python is +installed to, and where it finds its libraries at run-time. They are +always the same under Windows, and very often the same under Unix and +macOS. You can find out what your Python installation uses for +‘`prefix'’ and ‘`exec-prefix'’ by running Python in interactive mode and +typing a few simple commands. Under Unix, just type ‘python’ at the +shell prompt. Under Windows, choose Start ‣ Programs ‣ Python X.Y ‣ +Python (command line). Once the interpreter is started, you type Python +code at the prompt. For example, on my Linux system, I type the three +Python statements shown below, and get the output as shown, to find out +my ‘`prefix'’ and ‘`exec-prefix'’: + + Python 2.4 (#26, Aug 7 2004, 17:19:02) + Type "help", "copyright", "credits" or "license" for more information. + >>> import sys + >>> sys.prefix + '/usr' + >>> sys.exec_prefix + '/usr' + +A few other placeholders are used in this document: ‘`X.Y'’ stands for +the version of Python, for example ‘3.2’; ‘`abiflags'’ will be replaced +by the value of *note sys.abiflags: 6b5. or the empty string for +platforms which don’t define ABI flags; ‘`distname'’ will be replaced by +the name of the module distribution being installed. Dots and +capitalization are important in the paths; for example, a value that +uses ‘python3.2’ on UNIX will typically use ‘Python32’ on Windows. + +If you don’t want to install modules to the standard location, or if you +don’t have permission to write there, then you need to read about +alternate installations in section *note Alternate Installation: 4bb5. +If you want to customize your installation directories more heavily, see +section *note Custom Installation: 4bb6. on custom installations. + + +File: python.info, Node: Alternate Installation, Next: Custom Installation, Prev: Standard Build and Install, Up: Installing Python Modules Legacy version + +18.3 Alternate Installation +=========================== + +Often, it is necessary or desirable to install modules to a location +other than the standard location for third-party Python modules. For +example, on a Unix system you might not have permission to write to the +standard third-party module directory. Or you might wish to try out a +module before making it a standard part of your local Python +installation. This is especially true when upgrading a distribution +already present: you want to make sure your existing base of scripts +still works with the new version before actually upgrading. + +The Distutils ‘install’ command is designed to make installing module +distributions to an alternate location simple and painless. The basic +idea is that you supply a base directory for the installation, and the +‘install’ command picks a set of directories (called an `installation +scheme') under this base directory in which to install files. The +details differ across platforms, so read whichever of the following +sections applies to you. + +Note that the various alternate installation schemes are mutually +exclusive: you can pass ‘--user’, or ‘--home’, or ‘--prefix’ and +‘--exec-prefix’, or ‘--install-base’ and ‘--install-platbase’, but you +can’t mix from these groups. + +* Menu: + +* Alternate installation; the user scheme: Alternate installation the user scheme. +* Alternate installation; the home scheme: Alternate installation the home scheme. +* Alternate installation; Unix (the prefix scheme): Alternate installation Unix the prefix scheme. +* Alternate installation; Windows (the prefix scheme): Alternate installation Windows the prefix scheme. + + +File: python.info, Node: Alternate installation the user scheme, Next: Alternate installation the home scheme, Up: Alternate Installation + +18.3.1 Alternate installation: the 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. It is enabled with a simple option: + + python setup.py install --user + +Files will be installed into subdirectories of *note site.USER_BASE: +178b. (written as ‘`userbase'’ hereafter). This scheme installs pure +Python modules and extension modules in the same location (also known as +*note site.USER_SITE: 177b.). Here are the values for UNIX, including +macOS: + +Type of file Installation directory + +------------------------------------------------------------------------------------ + +modules ‘`userbase'/lib/python`X.Y'/site-packages’ + + +scripts ‘`userbase'/bin’ + + +data ‘`userbase'’ + + +C headers ‘`userbase'/include/python`X.Y'`abiflags'/`distname'’ + + +And here are the values used on Windows: + +Type of file Installation directory + +------------------------------------------------------------------------------------ + +modules ‘`userbase'\Python`XY'\site-packages’ + + +scripts ‘`userbase'\Python`XY'\Scripts’ + + +data ‘`userbase'’ + + +C headers ‘`userbase'\Python`XY'\Include{distname}’ + + +The advantage of using this scheme compared to the other ones described +below is that the user site-packages directory is under normal +conditions always included in *note sys.path: 162. (see *note site: e8. +for more information), which means that there is no additional step to +perform after running the ‘setup.py’ script to finalize the +installation. + +The ‘build_ext’ command also has a ‘--user’ option to add +‘`userbase'/include’ to the compiler search path for header files and +‘`userbase'/lib’ to the compiler search path for libraries as well as to +the runtime search path for shared C libraries (rpath). + + +File: python.info, Node: Alternate installation the home scheme, Next: Alternate installation Unix the prefix scheme, Prev: Alternate installation the user scheme, Up: Alternate Installation + +18.3.2 Alternate installation: the 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 ‘/usr/’ +or ‘/usr/local/’. This scheme can be used by anyone, regardless of the +operating system they are installing for. + +Installing a new module distribution is as simple as + + python setup.py install --home= + +where you can supply any directory you like for the ‘--home’ option. On +Unix, lazy typists can just type a tilde (‘~’); the ‘install’ command +will expand this to your home directory: + + python setup.py install --home=~ + +To make Python find the distributions installed with this scheme, you +may have to *note modify Python’s search path: 4bbb. or edit +‘sitecustomize’ (see *note site: e8.) to call *note site.addsitedir(): +3cb3. or edit *note sys.path: 162. + +The ‘--home’ option defines the installation base directory. Files are +installed to the following directories under the installation base as +follows: + +Type of file Installation directory + +------------------------------------------------------------------------------------ + +modules ‘`home'/lib/python’ + + +scripts ‘`home'/bin’ + + +data ‘`home'’ + + +C headers ‘`home'/include/python/`distname'’ + + +(Mentally replace slashes with backslashes if you’re on Windows.) + + +File: python.info, Node: Alternate installation Unix the prefix scheme, Next: Alternate installation Windows the prefix scheme, Prev: Alternate installation the home scheme, Up: Alternate Installation + +18.3.3 Alternate installation: Unix (the 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 ‘/usr’, +rather than the more traditional ‘/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 ‘/usr/local/lib/python2.`X'’ +rather than ‘/usr/lib/python2.`X'’. This can be done with + + /usr/bin/python setup.py install --prefix=/usr/local + +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 ‘/usr/local/bin/python’ +might search for modules in ‘/usr/local/lib/python2.`X'’, but those +modules would have to be installed to, say, +‘/mnt/`@server'/export/lib/python2.`X'’. This could be done with + + /usr/local/bin/python setup.py install --prefix=/mnt/@server/export + +In either case, the ‘--prefix’ option defines the installation base, and +the ‘--exec-prefix’ option defines the platform-specific installation +base, which is used for platform-specific files. (Currently, this just +means non-pure module distributions, but could be expanded to C +libraries, binary executables, etc.) If ‘--exec-prefix’ is not +supplied, it defaults to ‘--prefix’. Files are installed as follows: + +Type of file Installation directory + +------------------------------------------------------------------------------------- + +Python modules ‘`prefix'/lib/python`X.Y'/site-packages’ + + +extension modules ‘`exec-prefix'/lib/python`X.Y'/site-packages’ + + +scripts ‘`prefix'/bin’ + + +data ‘`prefix'’ + + +C headers ‘`prefix'/include/python`X.Y'`abiflags'/`distname'’ + + +There is no requirement that ‘--prefix’ or ‘--exec-prefix’ actually +point to an alternate Python installation; if the directories listed +above do not already exist, they are created at installation time. + +Incidentally, the real reason the prefix scheme is important is simply +that a standard Unix installation uses the prefix scheme, but with +‘--prefix’ and ‘--exec-prefix’ supplied by Python itself as ‘sys.prefix’ +and ‘sys.exec_prefix’. Thus, you might think you’ll never use the +prefix scheme, but every time you run ‘python setup.py install’ without +any other options, you’re using it. + +Note that installing extensions to an alternate Python installation has +no effect on how those extensions are built: in particular, the Python +header files (‘Python.h’ and friends) installed with the Python +interpreter used to run the setup script will be used in compiling +extensions. It is your responsibility to ensure that the interpreter +used to run extensions installed in this way is compatible with the +interpreter used to build them. The best way to do this is to ensure +that the two interpreters are the same version of Python (possibly +different builds, or possibly copies of the same build). (Of course, if +your ‘--prefix’ and ‘--exec-prefix’ don’t even point to an alternate +Python installation, this is immaterial.) + + +File: python.info, Node: Alternate installation Windows the prefix scheme, Prev: Alternate installation Unix the prefix scheme, Up: Alternate Installation + +18.3.4 Alternate installation: Windows (the prefix scheme) +---------------------------------------------------------- + +Windows has no concept of a user’s home directory, and since the +standard Python installation under Windows is simpler than under Unix, +the ‘--prefix’ option has traditionally been used to install additional +packages in separate locations on Windows. + + python setup.py install --prefix="\Temp\Python" + +to install modules to the ‘\Temp\Python’ directory on the current drive. + +The installation base is defined by the ‘--prefix’ option; the +‘--exec-prefix’ option is not supported under Windows, which means that +pure Python modules and extension modules are installed into the same +location. Files are installed as follows: + +Type of file Installation directory + +----------------------------------------------------------------------------------- + +modules ‘`prefix'\Lib\site-packages’ + + +scripts ‘`prefix'\Scripts’ + + +data ‘`prefix'’ + + +C headers ‘`prefix'\Include{distname}’ + + + +File: python.info, Node: Custom Installation, Next: Distutils Configuration Files, Prev: Alternate Installation, Up: Installing Python Modules Legacy version + +18.4 Custom Installation +======================== + +Sometimes, the alternate installation schemes described in section *note +Alternate Installation: 4bb5. just don’t do what you want. You might +want to tweak just one or two directories while keeping everything under +the same base directory, or you might want to completely redefine the +installation scheme. In either case, you’re creating a `custom +installation scheme'. + +To create a custom installation scheme, you start with one of the +alternate schemes and override some of the installation directories used +for the various types of files, using these options: + +Type of file Override option + +------------------------------------------------------- + +Python modules ‘--install-purelib’ + + +extension modules ‘--install-platlib’ + + +all modules ‘--install-lib’ + + +scripts ‘--install-scripts’ + + +data ‘--install-data’ + + +C headers ‘--install-headers’ + + +These override options can be relative, absolute, or explicitly defined +in terms of one of the installation base directories. (There are two +installation base directories, and they are normally the same—they only +differ when you use the Unix “prefix scheme” and supply different +‘--prefix’ and ‘--exec-prefix’ options; using ‘--install-lib’ will +override values computed or given for ‘--install-purelib’ and +‘--install-platlib’, and is recommended for schemes that don’t make a +difference between Python and extension modules.) + +For example, say you’re installing a module distribution to your home +directory under Unix—but you want scripts to go in ‘~/scripts’ rather +than ‘~/bin’. As you might expect, you can override this directory with +the ‘--install-scripts’ option; in this case, it makes most sense to +supply a relative path, which will be interpreted relative to the +installation base directory (your home directory, in this case): + + python setup.py install --home=~ --install-scripts=scripts + +Another Unix example: suppose your Python installation was built and +installed with a prefix of ‘/usr/local/python’, so under a standard +installation scripts will wind up in ‘/usr/local/python/bin’. If you +want them in ‘/usr/local/bin’ instead, you would supply this absolute +directory for the ‘--install-scripts’ option: + + python setup.py install --install-scripts=/usr/local/bin + +(This performs an installation using the “prefix scheme”, where the +prefix is whatever your Python interpreter was installed with— +‘/usr/local/python’ in this case.) + +If you maintain Python on Windows, you might want third-party modules to +live in a subdirectory of ‘`prefix'’, rather than right in ‘`prefix'’ +itself. This is almost as easy as customizing the script installation +directory—you just have to remember that there are two types of modules +to worry about, Python and extension modules, which can conveniently be +both controlled by one option: + + python setup.py install --install-lib=Site + +The specified installation directory is relative to ‘`prefix'’. Of +course, you also have to ensure that this directory is in Python’s +module search path, such as by putting a ‘.pth’ file in a site directory +(see *note site: e8.). See section *note Modifying Python’s Search +Path: 4bbb. to find out how to modify Python’s search path. + +If you want to define an entire installation scheme, you just have to +supply all of the installation directory options. The recommended way +to do this is to supply relative paths; for example, if you want to +maintain all Python module-related files under ‘python’ in your home +directory, and you want a separate directory for each platform that you +use your home directory from, you might define the following +installation scheme: + + python setup.py install --home=~ \ + --install-purelib=python/lib \ + --install-platlib=python/lib.$PLAT \ + --install-scripts=python/scripts + --install-data=python/data + +or, equivalently, + + python setup.py install --home=~/python \ + --install-purelib=lib \ + --install-platlib='lib.$PLAT' \ + --install-scripts=scripts + --install-data=data + +‘$PLAT’ is not (necessarily) an environment variable—it will be expanded +by the Distutils as it parses your command line options, just as it does +when parsing your configuration file(s). + +Obviously, specifying the entire installation scheme every time you +install a new module distribution would be very tedious. Thus, you can +put these options into your Distutils config file (see section *note +Distutils Configuration Files: 4bb2.): + + [install] + install-base=$HOME + install-purelib=python/lib + install-platlib=python/lib.$PLAT + install-scripts=python/scripts + install-data=python/data + +or, equivalently, + + [install] + install-base=$HOME/python + install-purelib=lib + install-platlib=lib.$PLAT + install-scripts=scripts + install-data=data + +Note that these two are `not' equivalent if you supply a different +installation base directory when you run the setup script. For example, + + python setup.py install --install-base=/tmp + +would install pure modules to ‘/tmp/python/lib’ in the first case, and +to ‘/tmp/lib’ in the second case. (For the second case, you probably +want to supply an installation base of ‘/tmp/python’.) + +You probably noticed the use of ‘$HOME’ and ‘$PLAT’ in the sample +configuration file input. These are Distutils configuration variables, +which bear a strong resemblance to environment variables. In fact, you +can use environment variables in config files on platforms that have +such a notion but the Distutils additionally define a few extra +variables that may not be in your environment, such as ‘$PLAT’. (And of +course, on systems that don’t have environment variables, such as Mac OS +9, the configuration variables supplied by the Distutils are the only +ones you can use.) See section *note Distutils Configuration Files: +4bb2. for details. + + Note: When a *note virtual environment: 3b90. is activated, any + options that change the installation path will be ignored from all + distutils configuration files to prevent inadvertently installing + projects outside of the virtual environment. + +* Menu: + +* Modifying Python’s Search Path:: + + +File: python.info, Node: Modifying Python’s Search Path, Up: Custom Installation + +18.4.1 Modifying Python’s Search Path +------------------------------------- + +When the Python interpreter executes an *note import: 1af. statement, it +searches for both Python code and extension modules along a search path. +A default value for the path is configured into the Python binary when +the interpreter is built. You can determine the path by importing the +*note sys: f9. module and printing the value of ‘sys.path’. + + $ python + Python 2.2 (#11, Oct 3 2002, 13:31:27) + [GCC 2.96 20000731 (Red Hat Linux 7.3 2.96-112)] on linux2 + Type "help", "copyright", "credits" or "license" for more information. + >>> import sys + >>> sys.path + ['', '/usr/local/lib/python2.3', '/usr/local/lib/python2.3/plat-linux2', + '/usr/local/lib/python2.3/lib-tk', '/usr/local/lib/python2.3/lib-dynload', + '/usr/local/lib/python2.3/site-packages'] + >>> + +The null string in ‘sys.path’ represents the current working directory. + +The expected convention for locally installed packages is to put them in +the ‘`...'/site-packages/’ directory, but you may want to install Python +modules into some arbitrary directory. For example, your site may have +a convention of keeping all software related to the web server under +‘/www’. Add-on Python modules might then belong in ‘/www/python’, and +in order to import them, this directory must be added to ‘sys.path’. +There are several different ways to add the directory. + +The most convenient way is to add a path configuration file to a +directory that’s already on Python’s path, usually to the +‘.../site-packages/’ directory. Path configuration files have an +extension of ‘.pth’, and each line must contain a single path that will +be appended to ‘sys.path’. (Because the new paths are appended to +‘sys.path’, modules in the added directories will not override standard +modules. This means you can’t use this mechanism for installing fixed +versions of standard modules.) + +Paths can be absolute or relative, in which case they’re relative to the +directory containing the ‘.pth’ file. See the documentation of the +*note site: e8. module for more information. + +A slightly less convenient way is to edit the ‘site.py’ file in Python’s +standard library, and modify ‘sys.path’. ‘site.py’ is automatically +imported when the Python interpreter is executed, unless the *note -S: +e5c. switch is supplied to suppress this behaviour. So you could simply +edit ‘site.py’ and add two lines to it: + + import sys + sys.path.append('/www/python/') + +However, if you reinstall the same major version of Python (perhaps when +upgrading from 2.2 to 2.2.2, for example) ‘site.py’ will be overwritten +by the stock version. You’d have to remember that it was modified and +save a copy before doing the installation. + +There are two environment variables that can modify ‘sys.path’. *note +PYTHONHOME: 8ae. sets an alternate value for the prefix of the Python +installation. For example, if *note PYTHONHOME: 8ae. is set to +‘/www/python’, the search path will be set to ‘['', +'/www/python/lib/pythonX.Y/', '/www/python/lib/pythonX.Y/plat-linux2', +...]’. + +The *note PYTHONPATH: cc7. variable can be set to a list of paths that +will be added to the beginning of ‘sys.path’. For example, if *note +PYTHONPATH: cc7. is set to ‘/www/python:/opt/py’, the search path will +begin with ‘['/www/python', '/opt/py']’. (Note that directories must +exist in order to be added to ‘sys.path’; the *note site: e8. module +removes paths that don’t exist.) + +Finally, ‘sys.path’ is just a regular Python list, so any Python +application can modify it by adding or removing entries. + + +File: python.info, Node: Distutils Configuration Files, Next: Building Extensions Tips and Tricks, Prev: Custom Installation, Up: Installing Python Modules Legacy version + +18.5 Distutils Configuration Files +================================== + +As mentioned above, you can use Distutils configuration files to record +personal or site preferences for any Distutils options. That is, any +option to any command can be stored in one of two or three (depending on +your platform) configuration files, which will be consulted before the +command-line is parsed. This means that configuration files will +override default values, and the command-line will in turn override +configuration files. Furthermore, if multiple configuration files +apply, values from “earlier” files are overridden by “later” files. + +* Menu: + +* Location and names of config files:: +* Syntax of config files:: + + +File: python.info, Node: Location and names of config files, Next: Syntax of config files, Up: Distutils Configuration Files + +18.5.1 Location and names of config files +----------------------------------------- + +The names and locations of the configuration files vary slightly across +platforms. On Unix and macOS, the three configuration files (in the +order they are processed) are: + +Type of file Location and filename Notes + +---------------------------------------------------------------------------------------------- + +system ‘`prefix'/lib/python`ver'/distutils/distutils.cfg’ (1) + + +personal ‘$HOME/.pydistutils.cfg’ (2) + + +local ‘setup.cfg’ (3) + + +And on Windows, the configuration files are: + +Type of file Location and filename Notes + +------------------------------------------------------------------------------------- + +system ‘`prefix'\Lib\distutils\distutils.cfg’ (4) + + +personal ‘%HOME%\pydistutils.cfg’ (5) + + +local ‘setup.cfg’ (3) + + +On all platforms, the “personal” file can be temporarily disabled by +passing the ‘--no-user-cfg’ option. + +Notes: + + 1. Strictly speaking, the system-wide configuration file lives in the + directory where the Distutils are installed; under Python 1.6 and + later on Unix, this is as shown. For Python 1.5.2, the Distutils + will normally be installed to + ‘`prefix'/lib/python1.5/site-packages/distutils’, so the system + configuration file should be put there under Python 1.5.2. + + 2. On Unix, if the ‘HOME’ environment variable is not defined, the + user’s home directory will be determined with the ‘getpwuid()’ + function from the standard *note pwd: d3. module. This is done by + the *note os.path.expanduser(): 65d. function used by Distutils. + + 3. I.e., in the current directory (usually the location of the setup + script). + + 4. (See also note (1).) Under Python 1.6 and later, Python’s default + “installation prefix” is ‘C:\Python’, so the system configuration + file is normally ‘C:\Python\Lib\distutils\distutils.cfg’. Under + Python 1.5.2, the default prefix was ‘C:\Program Files\Python’, and + the Distutils were not part of the standard library—so the system + configuration file would be ‘C:\Program + Files\Python\distutils\distutils.cfg’ in a standard Python 1.5.2 + installation under Windows. + + 5. On Windows, if the ‘HOME’ environment variable is not defined, + ‘USERPROFILE’ then ‘HOMEDRIVE’ and ‘HOMEPATH’ will be tried. This + is done by the *note os.path.expanduser(): 65d. function used by + Distutils. + + +File: python.info, Node: Syntax of config files, Prev: Location and names of config files, Up: Distutils Configuration Files + +18.5.2 Syntax of config files +----------------------------- + +The Distutils configuration files all have the same syntax. The config +files are grouped into sections. There is one section for each +Distutils command, plus a ‘global’ section for global options that +affect every command. Each section consists of one option per line, +specified as ‘option=value’. + +For example, the following is a complete config file that just forces +all commands to run quietly by default: + + [global] + verbose=0 + +If this is installed as the system config file, it will affect all +processing of any Python module distribution by any user on the current +system. If it is installed as your personal config file (on systems +that support them), it will affect only module distributions processed +by you. And if it is used as the ‘setup.cfg’ for a particular module +distribution, it affects only that distribution. + +You could override the default “build base” directory and make the +‘build*’ commands always forcibly rebuild all files with the following: + + [build] + build-base=blib + force=1 + +which corresponds to the command-line arguments + + python setup.py build --build-base=blib --force + +except that including the ‘build’ command on the command-line means that +command will be run. Including a particular command in config files has +no such implication; it only means that if the command is run, the +options in the config file will apply. (Or if other commands that +derive values from it are run, they will use the values in the config +file.) + +You can find out the complete list of options for any command using the +‘--help’ option, e.g.: + + python setup.py build --help + +and you can find out the complete list of global options by using +‘--help’ without a command: + + python setup.py --help + +See also the “Reference” section of the “Distributing Python Modules” +manual. + + +File: python.info, Node: Building Extensions Tips and Tricks, Prev: Distutils Configuration Files, Up: Installing Python Modules Legacy version + +18.6 Building Extensions: Tips and Tricks +========================================= + +Whenever possible, the Distutils try to use the configuration +information made available by the Python interpreter used to run the +‘setup.py’ script. For example, the same compiler and linker flags used +to compile Python will also be used for compiling extensions. Usually +this will work well, but in complicated situations this might be +inappropriate. This section discusses how to override the usual +Distutils behaviour. + +* Menu: + +* Tweaking compiler/linker flags:: +* Using non-Microsoft compilers on Windows:: + + +File: python.info, Node: Tweaking compiler/linker flags, Next: Using non-Microsoft compilers on Windows, Up: Building Extensions Tips and Tricks + +18.6.1 Tweaking compiler/linker flags +------------------------------------- + +Compiling a Python extension written in C or C++ will sometimes require +specifying custom flags for the compiler and linker in order to use a +particular library or produce a special kind of object code. This is +especially true if the extension hasn’t been tested on your platform, or +if you’re trying to cross-compile Python. + +In the most general case, the extension author might have foreseen that +compiling the extensions would be complicated, and provided a ‘Setup’ +file for you to edit. This will likely only be done if the module +distribution contains many separate extension modules, or if they often +require elaborate sets of compiler flags in order to work. + +A ‘Setup’ file, if present, is parsed in order to get a list of +extensions to build. Each line in a ‘Setup’ describes a single module. +Lines have the following structure: + + module ... [sourcefile ...] [cpparg ...] [library ...] + +Let’s examine each of the fields in turn. + + * `module' is the name of the extension module to be built, and + should be a valid Python identifier. You can’t just change this in + order to rename a module (edits to the source code would also be + needed), so this should be left alone. + + * `sourcefile' is anything that’s likely to be a source code file, at + least judging by the filename. Filenames ending in ‘.c’ are + assumed to be written in C, filenames ending in ‘.C’, ‘.cc’, and + ‘.c++’ are assumed to be C++, and filenames ending in ‘.m’ or ‘.mm’ + are assumed to be in Objective C. + + * `cpparg' is an argument for the C preprocessor, and is anything + starting with ‘-I’, ‘-D’, ‘-U’ or ‘-C’. + + * `library' is anything ending in ‘.a’ or beginning with ‘-l’ or + ‘-L’. + +If a particular platform requires a special library on your platform, +you can add it by editing the ‘Setup’ file and running ‘python setup.py +build’. For example, if the module defined by the line + + foo foomodule.c + +must be linked with the math library ‘libm.a’ on your platform, simply +add ‘-lm’ to the line: + + foo foomodule.c -lm + +Arbitrary switches intended for the compiler or the linker can be +supplied with the ‘-Xcompiler’ `arg' and ‘-Xlinker’ `arg' options: + + foo foomodule.c -Xcompiler -o32 -Xlinker -shared -lm + +The next option after ‘-Xcompiler’ and ‘-Xlinker’ will be appended to +the proper command line, so in the above example the compiler will be +passed the ‘-o32’ option, and the linker will be passed ‘-shared’. If a +compiler option requires an argument, you’ll have to supply multiple +‘-Xcompiler’ options; for example, to pass ‘-x c++’ the ‘Setup’ file +would have to contain ‘-Xcompiler -x -Xcompiler c++’. + +Compiler flags can also be supplied through setting the *note CFLAGS: +110a. environment variable. If set, the contents of *note CFLAGS: 110a. +will be added to the compiler flags specified in the ‘Setup’ file. + + +File: python.info, Node: Using non-Microsoft compilers on Windows, Prev: Tweaking compiler/linker flags, Up: Building Extensions Tips and Tricks + +18.6.2 Using non-Microsoft compilers on Windows +----------------------------------------------- + +* Menu: + +* Borland/CodeGear C++:: +* GNU C / Cygwin / MinGW:: + + +File: python.info, Node: Borland/CodeGear C++, Next: GNU C / Cygwin / MinGW, Up: Using non-Microsoft compilers on Windows + +18.6.2.1 Borland/CodeGear C++ +............................. + +This subsection describes the necessary steps to use Distutils with the +Borland C++ compiler version 5.5. First you have to know that Borland’s +object file format (OMF) is different from the format used by the Python +version you can download from the Python or ActiveState web site. +(Python is built with Microsoft Visual C++, which uses COFF as the +object file format.) For this reason you have to convert Python’s +library ‘python25.lib’ into the Borland format. You can do this as +follows: + + coff2omf python25.lib python25_bcpp.lib + +The ‘coff2omf’ program comes with the Borland compiler. The file +‘python25.lib’ is in the ‘Libs’ directory of your Python installation. +If your extension uses other libraries (zlib, …) you have to convert +them too. + +The converted files have to reside in the same directories as the normal +libraries. + +How does Distutils manage to use these libraries with their changed +names? If the extension needs a library (eg. ‘foo’) Distutils checks +first if it finds a library with suffix ‘_bcpp’ (eg. ‘foo_bcpp.lib’) +and then uses this library. In the case it doesn’t find such a special +library it uses the default name (‘foo.lib’.) (1) + +To let Distutils compile your extension with Borland C++ you now have to +type: + + python setup.py build --compiler=bcpp + +If you want to use the Borland C++ compiler as the default, you could +specify this in your personal or system-wide configuration file for +Distutils (see section *note Distutils Configuration Files: 4bb2.) + +See also +........ + +C++Builder Compiler(2) + + Information about the free C++ compiler from Borland, including + links to the download pages. + +Creating Python Extensions Using Borland’s Free Compiler(3) + + Document describing how to use Borland’s free command-line C++ + compiler to build Python. + + ---------- Footnotes ---------- + + (1) This also means you could replace all existing COFF-libraries +with OMF-libraries of the same name. + + (2) https://www.embarcadero.com/products + + (3) http://www.cyberus.ca/~g_will/pyExtenDL.shtml + + +File: python.info, Node: GNU C / Cygwin / MinGW, Prev: Borland/CodeGear C++, Up: Using non-Microsoft compilers on Windows + +18.6.2.2 GNU C / Cygwin / MinGW +............................... + +This section describes the necessary steps to use Distutils with the GNU +C/C++ compilers in their Cygwin and MinGW distributions. (1) For a +Python interpreter that was built with Cygwin, everything should work +without any of these following steps. + +Not all extensions can be built with MinGW or Cygwin, but many can. +Extensions most likely to not work are those that use C++ or depend on +Microsoft Visual C extensions. + +To let Distutils compile your extension with Cygwin you have to type: + + python setup.py build --compiler=cygwin + +and for Cygwin in no-cygwin mode (2) or for MinGW type: + + python setup.py build --compiler=mingw32 + +If you want to use any of these options/compilers as default, you should +consider writing it in your personal or system-wide configuration file +for Distutils (see section *note Distutils Configuration Files: 4bb2.) + +* Menu: + +* Older Versions of Python and MinGW:: + + ---------- Footnotes ---------- + + (1) Check ‘https://www.sourceware.org/cygwin/’ for more information + + (2) Then you have no POSIX emulation available, but you also don’t +need ‘cygwin1.dll’. + + +File: python.info, Node: Older Versions of Python and MinGW, Up: GNU C / Cygwin / MinGW + +18.6.2.3 Older Versions of Python and MinGW +........................................... + +The following instructions only apply if you’re using a version of +Python inferior to 2.4.1 with a MinGW inferior to 3.0.0 (with +binutils-2.13.90-20030111-1). + +These compilers require some special libraries. This task is more +complex than for Borland’s C++, because there is no program to convert +the library. First you have to create a list of symbols which the +Python DLL exports. (You can find a good program for this task at +‘https://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/’). + + pexports python25.dll >python25.def + +The location of an installed ‘python25.dll’ will depend on the +installation options and the version and language of Windows. In a +“just for me” installation, it will appear in the root of the +installation directory. In a shared installation, it will be located in +the system directory. + +Then you can create from these information an import library for gcc. + + /cygwin/bin/dlltool --dllname python25.dll --def python25.def --output-lib libpython25.a + +The resulting library has to be placed in the same directory as +‘python25.lib’. (Should be the ‘libs’ directory under your Python +installation directory.) + +If your extension uses other libraries (zlib,…) you might have to +convert them too. The converted files have to reside in the same +directories as the normal libraries do. + +See also +........ + +Building Python modules on MS Windows platform with MinGW(1) + + Information about building the required libraries for the MinGW + environment. + + ---------- Footnotes ---------- + + (1) https://old.zope.dev/Members/als/tips/win32_mingw_modules + + +File: python.info, Node: Python Module Index, Next: Index, Prev: Installing Python Modules Legacy version, Up: Top + +Python Module Index +******************* + +* Menu: + +* __future__: 0. Future statement definitions +* __main__: 1. The environment where top-level code is run. Covers + command-line interfaces, import-time + behavior, and ‘‘__name__ == + ’__main__’‘‘. +* _thread: 2. Low-level threading API. +* abc: 3. Abstract base classes according to :pep:‘3119‘. +* aifc: 4. Read and write audio files in AIFF or AIFC format. +* argparse: 5. Command-line option and argument parsing library. +* array: 6. Space efficient arrays of uniformly typed numeric + values. +* ast: 7. Abstract Syntax Tree classes and manipulation. +* asynchat: 8. Support for asynchronous command/response protocols. +* asyncio: 9. Asynchronous I/O. +* asyncore: a. A base class for developing asynchronous socket + handling services. +* atexit: b. Register and execute cleanup functions. +* audioop: c. Manipulate raw audio data. +* base64: d. RFC 4648: Base16, Base32, Base64 Data + Encodings; Base85 and Ascii85 +* bdb: e. Debugger framework. +* binascii: f. Tools for converting between binary and various ASCII- + encoded binary representations. +* bisect: 10. Array bisection algorithms for binary searching. +* builtins: 11. The module that provides the built-in namespace. +* bz2: 12. Interfaces for bzip2 compression and decompression. +* calendar: 13. Functions for working with calendars, including + some emulation of the Unix cal program. +* cgi: 14. Helpers for running Python scripts via the Common + Gateway Interface. +* cgitb: 15. Configurable traceback handler for CGI scripts. +* chunk: 16. Module to read IFF chunks. +* cmath: 17. Mathematical functions for complex numbers. +* cmd: 18. Build line-oriented command interpreters. +* code: 19. Facilities to implement read-eval-print loops. +* codecs: 1a. Encode and decode data and streams. +* codeop: 1b. Compile (possibly incomplete) Python code. +* collections: 1c. Container datatypes +* collections.abc: 1d. Abstract base classes for containers +* colorsys: 1e. Conversion functions between RGB and other color + systems. +* compileall: 1f. Tools for byte-compiling all Python source files in a + directory tree. +* concurrent.futures: 20. Execute computations concurrently using threads or + processes. +* configparser: 21. Configuration file parser. +* contextlib: 22. Utilities for with-statement contexts. +* contextvars: 23. Context Variables +* copy: 24. Shallow and deep copy operations. +* copyreg: 25. Register pickle support functions. +* cProfile: 26. +* crypt: 27. The crypt() function used to check Unix passwords. +* csv: 28. Write and read tabular data to and from delimited + files. +* ctypes: 29. A foreign function library for Python. +* curses: 2a. An interface to the curses library, providing + portable terminal handling. +* curses.ascii: 2b. Constants and set-membership functions for ASCII + characters. +* curses.panel: 2c. A panel stack extension that adds depth to curses + windows. +* curses.textpad: 2d. Emacs-like input editing in a curses window. +* dataclasses: 2e. Generate special methods on user-defined classes. +* datetime: 2f. Basic date and time types. +* dbm: 30. Interfaces to various Unix "database" formats. +* dbm.dumb: 31. Portable implementation of the simple DBM interface. +* dbm.gnu: 32. GNU’s reinterpretation of dbm. +* dbm.ndbm: 33. The standard "database" interface, based on + ndbm. +* decimal: 34. Implementation of the General Decimal Arithmetic + Specification. +* difflib: 35. Helpers for computing differences between objects. +* dis: 36. Disassembler for Python bytecode. +* distutils: 37. Support for building and installing Python modules + into an existing Python installation. +* distutils.archive_util: 38. Utility functions for creating archive files + (tarballs, zip files, ...) +* distutils.bcppcompiler: 39. +* distutils.ccompiler: 3a. Abstract CCompiler class +* distutils.cmd: 3b. Provides the abstract base class + :class:‘~distutils.cmd.Command‘. This class is + subclassed by the modules in the distutils.command + subpackage. +* distutils.command: 3c. Contains one module for each standard Distutils + command. +* distutils.command.bdist: 3d. Build a binary installer for a package +* distutils.command.bdist_dumb: 3e. Build a "dumb" installer - a simple archive of + files +* distutils.command.bdist_packager: 3f. Abstract base class for packagers +* distutils.command.bdist_rpm: 40. Build a binary distribution as a Redhat RPM and + SRPM +* distutils.command.build: 41. Build all files of a package +* distutils.command.build_clib: 42. Build any C libraries in a package +* distutils.command.build_ext: 43. Build any extensions in a package +* distutils.command.build_py: 44. Build the .py/.pyc files of a package +* distutils.command.build_scripts: 45. Build the scripts of a package +* distutils.command.check: 46. Check the meta-data of a package +* distutils.command.clean: 47. Clean a package build area +* distutils.command.config: 48. Perform package configuration +* distutils.command.install: 49. Install a package +* distutils.command.install_data: 4a. Install data files from a package +* distutils.command.install_headers: 4b. Install C/C++ header files from a package +* distutils.command.install_lib: 4c. Install library files from a package +* distutils.command.install_scripts: 4d. Install script files from a package +* distutils.command.register: 4e. Register a module with the Python Package Index +* distutils.command.sdist: 4f. Build a source distribution +* distutils.core: 50. The core Distutils functionality +* distutils.cygwinccompiler: 51. +* distutils.debug: 52. Provides the debug flag for distutils +* distutils.dep_util: 53. Utility functions for simple dependency checking +* distutils.dir_util: 54. Utility functions for operating on directories and + directory trees +* distutils.dist: 55. Provides the Distribution class, which + represents the module distribution being + built/installed/distributed +* distutils.errors: 56. Provides standard distutils exceptions +* distutils.extension: 57. Provides the Extension class, used to describe + C/C++ extension modules in setup scripts +* distutils.fancy_getopt: 58. Additional getopt functionality +* distutils.file_util: 59. Utility functions for operating on single files +* distutils.filelist: 5a. The FileList class, used for poking about the + file system and building lists of files. +* distutils.log: 5b. A simple logging mechanism, :pep:‘282‘-style +* distutils.msvccompiler: 5c. Microsoft Compiler +* distutils.spawn: 5d. Provides the spawn() function +* distutils.sysconfig: 5e. Low-level access to configuration information of the + Python interpreter. +* distutils.text_file: 5f. Provides the TextFile class, a simple interface + to text files +* distutils.unixccompiler: 60. UNIX C Compiler +* distutils.util: 61. Miscellaneous other utility functions +* distutils.version: 62. Implements classes that represent module version + numbers. +* doctest: 63. Test pieces of code within docstrings. +* email: 64. Package supporting the parsing, + manipulating, and generating email messages. +* email.charset: 65. Character Sets +* email.contentmanager: 66. Storing and Retrieving Content from MIME Parts +* email.encoders: 67. Encoders for email message payloads. +* email.errors: 68. The exception classes used by the email package. +* email.generator: 69. Generate flat text email messages from a message + structure. +* email.header: 6a. Representing non-ASCII headers +* email.headerregistry: 6b. Automatic Parsing of headers based on the field name +* email.iterators: 6c. Iterate over a message object tree. +* email.message: 6d. The base class representing email messages. +* email.mime: 6e. Build MIME messages. +* email.parser: 6f. Parse flat text email messages to produce a message + object structure. +* email.policy: 70. Controlling the parsing and generating of messages +* email.utils: 71. Miscellaneous email package utilities. +* encodings.idna: 72. Internationalized Domain Names implementation +* encodings.mbcs: 73. Windows ANSI codepage +* encodings.utf_8_sig: 74. UTF-8 codec with BOM signature +* ensurepip: 75. Bootstrapping the "pip" installer into an existing + Python installation or virtual environment. +* enum: 76. Implementation of an enumeration class. +* errno: 77. Standard errno system symbols. +* faulthandler: 78. Dump the Python traceback. +* fcntl: 79. The fcntl() and ioctl() system calls. +* filecmp: 7a. Compare files efficiently. +* fileinput: 7b. Loop over standard input or a list of files. +* fnmatch: 7c. Unix shell style filename pattern matching. +* fractions: 7d. Rational numbers. +* ftplib: 7e. FTP protocol client (requires sockets). +* functools: 7f. Higher-order functions and operations on callable + objects. +* gc: 80. Interface to the cycle-detecting garbage collector. +* getopt: 81. Portable parser for command line options; support both + short and long option names. +* getpass: 82. Portable reading of passwords and retrieval of the + userid. +* gettext: 83. Multilingual internationalization services. +* glob: 84. Unix shell style pathname pattern expansion. +* graphlib: 85. Functionality to operate with graph-like structures +* grp: 86. The group database (getgrnam() and friends). +* gzip: 87. Interfaces for gzip compression and decompression + using file objects. +* hashlib: 88. Secure hash and message digest algorithms. +* heapq: 89. Heap queue algorithm (a.k.a. priority queue). +* hmac: 8a. Keyed-Hashing for Message Authentication (HMAC) + implementation +* html: 8b. Helpers for manipulating HTML. +* html.entities: 8c. Definitions of HTML general entities. +* html.parser: 8d. A simple parser that can handle HTML and XHTML. +* http: 8e. HTTP status codes and messages +* http.client: 8f. HTTP and HTTPS protocol client (requires sockets). +* http.cookiejar: 90. Classes for automatic handling of HTTP cookies. +* http.cookies: 91. Support for HTTP state management (cookies). +* http.server: 92. HTTP server and request handlers. +* idlelib: 93. Implementation package for the IDLE shell/editor. +* imaplib: 94. IMAP4 protocol client (requires sockets). +* imghdr: 95. Determine the type of image contained in a file or + byte stream. +* imp: 96. Access the implementation of the import statement. +* importlib: 97. The implementation of the import machinery. +* importlib.abc: 98. Abstract base classes related to import +* importlib.machinery: 99. Importers and path hooks +* importlib.metadata: 9a. The implementation of the importlib metadata. +* importlib.resources: 9b. Package resource reading, opening, and + access +* importlib.resources.abc: 9c. Abstract base classes for resources +* importlib.util: 9d. Utility code for importers +* inspect: 9e. Extract information and source code from live objects. +* io: 9f. Core tools for working with streams. +* ipaddress: a0. IPv4/IPv6 manipulation library. +* itertools: a1. Functions creating iterators for efficient looping. +* json: a2. Encode and decode the JSON format. +* json.tool: a3. A command line to validate and pretty-print JSON. +* keyword: a4. Test whether a string is a keyword in Python. +* lib2to3: a5. The 2to3 library +* linecache: a6. Provides random access to individual lines from text + files. +* locale: a7. Internationalization services. +* logging: a8. Flexible event logging system for applications. +* logging.config: a9. Configuration of the logging module. +* logging.handlers: aa. Handlers for the logging module. +* lzma: ab. A Python wrapper for the liblzma compression library. +* mailbox: ac. Manipulate mailboxes in various formats +* mailcap: ad. Mailcap file handling. +* marshal: ae. Convert Python objects to streams of bytes and back + (with different constraints). +* math: af. Mathematical functions (sin() etc.). +* mimetypes: b0. Mapping of filename extensions to MIME types. +* mmap: b1. Interface to memory-mapped files for Unix and Windows. +* modulefinder: b2. Find modules used by a script. +* msilib: b3. Creation of Microsoft Installer files, and CAB + files. +* msvcrt: b4. Miscellaneous useful routines from the MS VC++ + runtime. +* multiprocessing: b5. Process-based parallelism. +* multiprocessing.connection: b6. API for dealing with sockets. +* multiprocessing.dummy: b7. Dumb wrapper around threading. +* multiprocessing.managers: b8. Share data between process with shared objects. +* multiprocessing.pool: b9. Create pools of processes. +* multiprocessing.shared_memory: ba. Provides shared memory for direct access + across processes. +* multiprocessing.sharedctypes: bb. Allocate ctypes objects from shared memory. +* netrc: bc. Loading of .netrc files. +* nis: bd. Interface to Sun’s NIS (Yellow Pages) library. +* nntplib: be. NNTP protocol client (requires sockets). +* numbers: bf. Numeric abstract base classes (Complex, + Real, Integral, etc.). +* operator: c0. Functions corresponding to the standard operators. +* optparse: c1. Command-line option parsing library. +* os: c2. Miscellaneous operating system interfaces. +* os.path: c3. Operations on pathnames. +* ossaudiodev: c4. Access to OSS-compatible audio devices. +* pathlib: c5. Object-oriented filesystem paths +* pdb: c6. The Python debugger for interactive interpreters. +* pickle: c7. Convert Python objects to streams of bytes and back. +* pickletools: c8. Contains extensive comments about the pickle protocols + and pickle-machine opcodes, as well as some + useful functions. +* pipes: c9. A Python interface to Unix shell pipelines. +* pkgutil: ca. Utilities for the import system. +* platform: cb. Retrieves as much platform identifying data as + possible. +* plistlib: cc. Generate and parse Apple plist files. +* poplib: cd. POP3 protocol client (requires sockets). +* posix: ce. The most common POSIX system calls (normally used via + module os). +* pprint: cf. Data pretty printer. +* profile: d0. Python source profiler. +* pstats: d1. Statistics object for use with the profiler. +* pty: d2. Pseudo-Terminal Handling for Unix. +* pwd: d3. The password database (getpwnam() and friends). +* py_compile: d4. Generate byte-code files from Python source files. +* pyclbr: d5. Supports information extraction for a Python module + browser. +* pydoc: d6. Documentation generator and online help system. +* queue: d7. A synchronized queue class. +* quopri: d8. Encode and decode files using the MIME quoted- + printable encoding. +* random: d9. Generate pseudo-random numbers with various common + distributions. +* re: da. Regular expression operations. +* readline: db. GNU readline support for Python. +* reprlib: dc. Alternate repr() implementation with size limits. +* resource: dd. An interface to provide resource usage information on + the current process. +* rlcompleter: de. Python identifier completion, suitable for the + GNU readline library. +* runpy: df. Locate and run Python modules without importing them + first. +* sched: e0. General purpose event scheduler. +* secrets: e1. Generate secure random numbers for managing secrets. +* select: e2. Wait for I/O completion on multiple streams. +* selectors: e3. High-level I/O multiplexing. +* shelve: e4. Python object persistence. +* shlex: e5. Simple lexical analysis for Unix shell-like languages. +* shutil: e6. High-level file operations, including copying. +* signal: e7. Set handlers for asynchronous events. +* site: e8. Module responsible for site-specific configuration. +* smtpd: e9. A SMTP server implementation in Python. +* smtplib: ea. SMTP protocol client (requires sockets). +* sndhdr: eb. Determine type of a sound file. +* socket: ec. Low-level networking interface. +* socketserver: ed. A framework for network servers. +* spwd: ee. The shadow password database (getspnam() and friends). +* sqlite3: ef. A DB-API 2.0 implementation using SQLite 3.x. +* ssl: f0. TLS/SSL wrapper for socket objects +* stat: f1. Utilities for interpreting the results of + os.stat(), os.lstat() and os.fstat(). +* statistics: f2. Mathematical statistics functions +* string: f3. Common string operations. +* stringprep: f4. String preparation, as per RFC 3453 +* struct: f5. Interpret bytes as packed binary data. +* subprocess: f6. Subprocess management. +* sunau: f7. Provide an interface to the Sun AU sound format. +* symtable: f8. Interface to the compiler’s internal symbol tables. +* sys: f9. Access system-specific parameters and functions. +* sysconfig: fa. Python’s configuration information +* syslog: fb. An interface to the Unix syslog library routines. +* tabnanny: fc. Tool for detecting white space related problems in + Python source files in a directory tree. +* tarfile: fd. Read and write tar-format archive files. +* telnetlib: fe. Telnet client class. +* tempfile: ff. Generate temporary files and directories. +* termios: 100. POSIX style tty control. +* test: 101. Regression tests package containing the testing suite + for Python. +* test.support: 102. Support for Python’s regression test suite. +* test.support.bytecode_helper: 103. Support tools for testing correct bytecode + generation. +* test.support.import_helper: 104. Support for import tests. +* test.support.os_helper: 105. Support for os tests. +* test.support.script_helper: 106. Support for Python’s script execution tests. +* test.support.socket_helper: 107. Support for socket tests. +* test.support.threading_helper: 108. Support for threading tests. +* test.support.warnings_helper: 109. Support for warnings tests. +* textwrap: 10a. Text wrapping and filling +* threading: 10b. Thread-based parallelism. +* time: 10c. Time access and conversions. +* timeit: 10d. Measure the execution time of small code snippets. +* tkinter: 10e. Interface to Tcl/Tk for graphical user interfaces +* tkinter.colorchooser: 10f. Color choosing dialog +* tkinter.commondialog: 110. Tkinter base class for dialogs +* tkinter.dnd: 111. Tkinter drag-and-drop interface +* tkinter.filedialog: 112. Dialog classes for file selection +* tkinter.font: 113. Tkinter font-wrapping class +* tkinter.messagebox: 114. Various types of alert dialogs +* tkinter.scrolledtext: 115. Text widget with a vertical scroll bar. +* tkinter.simpledialog: 116. Simple dialog windows +* tkinter.tix: 117. Tk Extension Widgets for Tkinter +* tkinter.ttk: 118. Tk themed widget set +* token: 119. Constants representing terminal nodes of the parse + tree. +* tokenize: 11a. Lexical scanner for Python source code. +* tomllib: 11b. Parse TOML files. +* trace: 11c. Trace or track Python statement execution. +* traceback: 11d. Print or retrieve a stack traceback. +* tracemalloc: 11e. Trace memory allocations. +* tty: 11f. Utility functions that perform common terminal control + operations. +* turtle: 120. An educational framework for simple graphics + applications +* turtledemo: 121. A viewer for example turtle scripts +* types: 122. Names for built-in types. +* typing: 123. Support for type hints (see :pep:‘484‘). +* unicodedata: 124. Access the Unicode Database. +* unittest: 125. Unit testing framework for Python. +* unittest.mock: 126. Mock object library. +* urllib: 127. +* urllib.error: 128. Exception classes raised by urllib.request. +* urllib.parse: 129. Parse URLs into or assemble them from components. +* urllib.request: 12a. Extensible library for opening URLs. +* urllib.response: 12b. Response classes used by urllib. +* urllib.robotparser: 12c. Load a robots.txt file and answer questions about + fetchability of other URLs. +* uu: 12d. Encode and decode files in uuencode format. +* uuid: 12e. UUID objects (universally unique identifiers) + according to RFC 4122 +* venv: 12f. Creation of virtual environments. +* warnings: 130. Issue warning messages and control their disposition. +* wave: 131. Provide an interface to the WAV sound format. +* weakref: 132. Support for weak references and weak dictionaries. +* webbrowser: 133. Easy-to-use controller for web browsers. +* winreg: 134. Routines and objects for manipulating the Windows + registry. +* winsound: 135. Access to the sound-playing machinery for Windows. +* wsgiref: 136. WSGI Utilities and Reference Implementation. +* wsgiref.handlers: 137. WSGI server/gateway base classes. +* wsgiref.headers: 138. WSGI response header tools. +* wsgiref.simple_server: 139. A simple WSGI HTTP server. +* wsgiref.types: 13a. WSGI types for static type checking +* wsgiref.util: 13b. WSGI environment utilities. +* wsgiref.validate: 13c. WSGI conformance checker. +* xdrlib: 13d. Encoders and decoders for the External Data + Representation (XDR). +* xml: 13e. Package containing XML processing modules +* xml.dom: 13f. Document Object Model API for Python. +* xml.dom.minidom: 140. Minimal Document Object Model (DOM) implementation. +* xml.dom.pulldom: 141. Support for building partial DOM trees from SAX + events. +* xml.etree.ElementTree: 142. Implementation of the ElementTree API. +* xml.parsers.expat: 143. An interface to the Expat non-validating XML parser. +* xml.parsers.expat.errors: 144. +* xml.parsers.expat.model: 145. +* xml.sax: 146. Package containing SAX2 base classes and convenience + functions. +* xml.sax.handler: 147. Base classes for SAX event handlers. +* xml.sax.saxutils: 148. Convenience functions and classes for use with SAX. +* xml.sax.xmlreader: 149. Interface which SAX-compliant XML parsers must + implement. +* xmlrpc.client: 14a. XML-RPC client access. +* xmlrpc.server: 14b. Basic XML-RPC server implementations. +* zipapp: 14c. Manage executable Python zip archives +* zipfile: 14d. Read and write ZIP-format archive files. +* zipimport: 14e. Support for importing Python modules from ZIP + archives. +* zlib: 14f. Low-level interface to compression and decompression + routines compatible with gzip. +* zoneinfo: 150. IANA time zone support + + +File: python.info, Node: Index, Prev: Python Module Index, Up: Top + +Index +***** + +[index] +* Menu: + +* ! (exclamation); in a command interpreter: Cmd Objects. (line 27) +* ! (exclamation); in curses module: curses ascii — Utilities for ASCII characters. + (line 226) +* ! (exclamation); in formatted string literal: String literal concatenation. + (line 24) +* ! (exclamation); in glob-style wildcards: glob — Unix style pathname pattern expansion. + (line 10) +* ! (exclamation); in glob-style wildcards <1>: fnmatch — Unix filename pattern matching. + (line 15) +* ! (exclamation); in string formatting: Format String Syntax. + (line 13) +* ! (exclamation); in struct format strings: Byte Order Size and Alignment. + (line 10) +* ! (pdb command): Debugger Commands. (line 316) +* ! patterns: Patterns. (line 6) +* " (double quote); string literal: Literals. (line 8) +* """; string literal: String and Bytes literals. + (line 36) +* # (hash); comment: An Informal Introduction to Python. + (line 14) +* # (hash); comment <1>: Comments. (line 6) +* # (hash); comment <2>: site — Site-specific configuration hook. + (line 45) +* # (hash); in doctests: Option Flags. (line 172) +* # (hash); in printf-style formatting: printf-style String Formatting. + (line 66) +* # (hash); in printf-style formatting <1>: printf-style Bytes Formatting. + (line 63) +* # (hash); in regular expressions: Flags. (line 107) +* # (hash); in string formatting: Format Specification Mini-Language. + (line 93) +* # (hash); source encoding declaration: Encoding declarations. + (line 6) +* $ (dollar); environment variables expansion: os path — Common pathname manipulations. + (line 154) +* $ (dollar); in regular expressions: Regular Expression Syntax. + (line 57) +* $ (dollar); in template strings: Template strings. (line 13) +* $ (dollar); interpolation in configuration files: Interpolation of values. + (line 41) +* % (percent); datetime format: timezone Objects. (line 71) +* % (percent); datetime format <1>: Functions<4>. (line 279) +* % (percent); datetime format <2>: Functions<4>. (line 411) +* % (percent); environment variables expansion (Windows): os path — Common pathname manipulations. + (line 154) +* % (percent); environment variables expansion (Windows) <1>: Functions<12>. + (line 228) +* % (percent); interpolation in configuration files: Interpolation of values. + (line 10) +* % (percent); printf-style formatting: printf-style String Formatting. + (line 6) +* % (percent); printf-style formatting <1>: printf-style Bytes Formatting. + (line 6) +* %=; augmented assignment: Augmented assignment statements. + (line 6) +* %APPDATA%: Redirection of local data registry and temporary paths. + (line 13) +* &=; augmented assignment: Augmented assignment statements. + (line 6) +* ’ (single quote); string literal: Literals. (line 8) +* ’’’; string literal: String and Bytes literals. + (line 36) +* () (parentheses); call: Slicings. (line 38) +* () (parentheses); class definition: Class definitions. (line 6) +* () (parentheses); function definition: Function definitions. + (line 6) +* () (parentheses); generator expression: Generator expressions. + (line 6) +* () (parentheses); in assignment target list: Assignment statements. + (line 35) +* () (parentheses); in printf-style formatting: printf-style String Formatting. + (line 26) +* () (parentheses); in printf-style formatting <1>: printf-style Bytes Formatting. + (line 23) +* () (parentheses); in regular expressions: Regular Expression Syntax. + (line 233) +* () (parentheses); tuple display: Parenthesized forms. + (line 6) +* (?!; in regular expressions: Regular Expression Syntax. + (line 372) +* (?#; in regular expressions: Regular Expression Syntax. + (line 361) +* (?; in regular expressions: Regular Expression Syntax. + (line 242) +* (?;; in regular expressions: Regular Expression Syntax. + (line 269) +* (?: Calls. (line 73) +* * (asterisk); in glob-style wildcards: glob — Unix style pathname pattern expansion. + (line 10) +* * (asterisk); in glob-style wildcards <1>: fnmatch — Unix filename pattern matching. + (line 15) +* * (asterisk); in printf-style formatting: printf-style String Formatting. + (line 26) +* * (asterisk); in printf-style formatting <1>: printf-style Bytes Formatting. + (line 23) +* * (asterisk); in regular expressions: Regular Expression Syntax. + (line 68) +* **; function definition: Function definitions. + (line 81) +* **; in dictionary displays: Dictionary displays. + (line 23) +* **; in function calls: Unpacking Argument Lists. + (line 19) +* **; in function calls <1>: Calls. (line 100) +* **; in glob-style wildcards: glob — Unix style pathname pattern expansion. + (line 54) +* **=; augmented assignment: Augmented assignment statements. + (line 6) +* *+; in regular expressions: Regular Expression Syntax. + (line 95) +* *=; augmented assignment: Augmented assignment statements. + (line 6) +* *?; in regular expressions: Regular Expression Syntax. + (line 85) +* + (plus); binary operator: Binary arithmetic operations. + (line 69) +* + (plus); binary operator <1>: Numeric Types — int float complex. + (line 27) +* + (plus); in argparse module: nargs. (line 68) +* + (plus); in doctests: Option Flags. (line 172) +* + (plus); in printf-style formatting: printf-style String Formatting. + (line 66) +* + (plus); in printf-style formatting <1>: printf-style Bytes Formatting. + (line 63) +* + (plus); in regular expressions: Regular Expression Syntax. + (line 74) +* + (plus); in string formatting: Format Specification Mini-Language. + (line 71) +* + (plus); unary operator: Unary arithmetic and bitwise operations. + (line 14) +* + (plus); unary operator <1>: Numeric Types — int float complex. + (line 27) +* ++; in regular expressions: Regular Expression Syntax. + (line 95) +* +=; augmented assignment: Augmented assignment statements. + (line 6) +* +?; in regular expressions: Regular Expression Syntax. + (line 85) +* , (comma): Parenthesized forms. + (line 20) +* , (comma); argument list: Slicings. (line 38) +* , (comma); expression list: List displays. (line 6) +* , (comma); expression list <1>: Set displays. (line 6) +* , (comma); expression list <2>: Expression lists. (line 6) +* , (comma); expression list <3>: The assert statement. + (line 6) +* , (comma); expression list <4>: Class definitions. (line 6) +* , (comma); identifier list: The global statement. + (line 6) +* , (comma); identifier list <1>: The nonlocal statement. + (line 6) +* , (comma); import statement: The import statement. + (line 6) +* , (comma); in dictionary displays: Dictionary displays. + (line 6) +* , (comma); in string formatting: Format Specification Mini-Language. + (line 105) +* , (comma); in target list: Assignment statements. + (line 35) +* , (comma); parameter list: Function definitions. + (line 6) +* , (comma); slicing: Slicings. (line 6) +* , (comma); with statement: The with statement. (line 6) +* - (minus); binary operator: Binary arithmetic operations. + (line 78) +* - (minus); binary operator <1>: Numeric Types — int float complex. + (line 27) +* - (minus); in doctests: Option Flags. (line 171) +* - (minus); in glob-style wildcards: glob — Unix style pathname pattern expansion. + (line 10) +* - (minus); in glob-style wildcards <1>: fnmatch — Unix filename pattern matching. + (line 15) +* - (minus); in printf-style formatting: printf-style String Formatting. + (line 66) +* - (minus); in printf-style formatting <1>: printf-style Bytes Formatting. + (line 63) +* - (minus); in regular expressions: Regular Expression Syntax. + (line 177) +* - (minus); in string formatting: Format Specification Mini-Language. + (line 71) +* - (minus); unary operator: Unary arithmetic and bitwise operations. + (line 10) +* - (minus); unary operator <1>: Numeric Types — int float complex. + (line 27) +* -=; augmented assignment: Augmented assignment statements. + (line 6) +* ->; function annotations: Function Annotations. + (line 6) +* ->; function annotations <1>: Function definitions. + (line 97) +* . (dot); attribute reference: Attribute references. + (line 6) +* . (dot); in glob-style wildcards: glob — Unix style pathname pattern expansion. + (line 10) +* . (dot); in numeric literal: Integer literals. (line 40) +* . (dot); in pathnames: Miscellaneous System Information. + (line 83) +* . (dot); in pathnames <1>: Miscellaneous System Information. + (line 111) +* . (dot); in printf-style formatting: printf-style String Formatting. + (line 26) +* . (dot); in printf-style formatting <1>: printf-style Bytes Formatting. + (line 23) +* . (dot); in regular expressions: Regular Expression Syntax. + (line 46) +* . (dot); in string formatting: Format String Syntax. + (line 13) +* ...: Glossary. (line 10) +* ...; ellipsis literal: The standard type hierarchy. + (line 46) +* ...; ellipsis literal <1>: Built-in Constants. (line 58) +* ...; ellipsis literal <2>: The Null Object. (line 12) +* ...; in doctests: Option Flags. (line 49) +* ...; interpreter prompt: How are Docstring Examples Recognized?. + (line 26) +* ...; interpreter prompt <1>: sys — System-specific parameters and functions. + (line 1333) +* ...; placeholder: textwrap — Text wrapping and filling. + (line 277) +* ...; placeholder <1>: pprint — Data pretty printer. + (line 33) +* ...; placeholder <2>: reprlib — Alternate repr implementation. + (line 41) +* ..; in pathnames: Miscellaneous System Information. + (line 89) +* .ini; file: configparser — Configuration file parser. + (line 8) +* .pdbrc; file: Debugger Commands. (line 39) +* / (slash); function definition: Function definitions. + (line 81) +* / (slash); in pathnames: Miscellaneous System Information. + (line 95) +* / (slash); in pathnames <1>: Miscellaneous System Information. + (line 104) +* //=; augmented assignment: Augmented assignment statements. + (line 6) +* /=; augmented assignment: Augmented assignment statements. + (line 6) +* 0b; integer literal: Numeric literals. (line 14) +* 0o; integer literal: Numeric literals. (line 14) +* 0x; integer literal: Numeric literals. (line 14) +* 2-digit years: time — Time access and conversions. + (line 34) +* 2to3: Glossary. (line 23) +* ; (colon); annotated variable: Annotated assignment statements. + (line 6) +* ; (colon); compound statement: The if statement. (line 6) +* ; (colon); compound statement <1>: The while statement. + (line 6) +* ; (colon); compound statement <2>: The for statement. (line 6) +* ; (colon); compound statement <3>: The try statement. (line 6) +* ; (colon); compound statement <4>: The with statement. (line 6) +* ; (colon); compound statement <5>: The match statement. + (line 6) +* ; (colon); compound statement <6>: Function definitions. + (line 6) +* ; (colon); compound statement <7>: Class definitions. (line 6) +* ; (colon); function annotations: Function Annotations. + (line 6) +* ; (colon); function annotations <1>: Function definitions. + (line 97) +* ; (colon); in dictionary expressions: Dictionary displays. + (line 6) +* ; (colon); in formatted string literal: String literal concatenation. + (line 24) +* ; (colon); in SQL statements: Cursor objects. (line 24) +* ; (colon); in string formatting: Format String Syntax. + (line 13) +* ; (colon); lambda expression: Lambdas. (line 6) +* ; (colon); path separator (POSIX): Miscellaneous System Information. + (line 117) +* ; (colon); slicing: Slicings. (line 6) +* ; (semicolon): Compound statements. + (line 18) +* ; (semicolon) <1>: Miscellaneous System Information. + (line 117) +* ;= (colon equals): Boolean operations. (line 38) +* < (less); in string formatting: Format Specification Mini-Language. + (line 42) +* < (less); in struct format strings: Byte Order Size and Alignment. + (line 10) +* <<=; augmented assignment: Augmented assignment statements. + (line 6) +* : Option Flags. (line 30) +* = (equals); assignment statement: Assignment statements. + (line 6) +* = (equals); class definition: Metaclasses. (line 6) +* = (equals); for help in debugging using string literals: String literal concatenation. + (line 23) +* = (equals); function definition: Function definitions. + (line 56) +* = (equals); in function calls: Slicings. (line 37) +* = (equals); in string formatting: Format Specification Mini-Language. + (line 42) +* = (equals); in struct format strings: Byte Order Size and Alignment. + (line 10) +* > (greater); in string formatting: Format Specification Mini-Language. + (line 42) +* > (greater); in struct format strings: Byte Order Size and Alignment. + (line 10) +* >>=; augmented assignment: Augmented assignment statements. + (line 6) +* >>>: Glossary. (line 6) +* >>>; interpreter prompt: How are Docstring Examples Recognized?. + (line 26) +* >>>; interpreter prompt <1>: sys — System-specific parameters and functions. + (line 1333) +* ? (question mark); in a command interpreter: Cmd Objects. (line 27) +* ? (question mark); in argparse module: nargs. (line 23) +* ? (question mark); in AST grammar: Node classes. (line 22) +* ? (question mark); in glob-style wildcards: glob — Unix style pathname pattern expansion. + (line 10) +* ? (question mark); in glob-style wildcards <1>: fnmatch — Unix filename pattern matching. + (line 15) +* ? (question mark); in regular expressions: Regular Expression Syntax. + (line 80) +* ? (question mark); in SQL statements: Cursor objects. (line 24) +* ? (question mark); in struct format strings: Format Characters. + (line 86) +* ? (question mark); in struct format strings <1>: Format Characters. + (line 161) +* ? (question mark); replacement character: Error Handlers. (line 15) +* ?+; in regular expressions: Regular Expression Syntax. + (line 95) +* ??; in regular expressions: Regular Expression Syntax. + (line 85) +* @ (at); class definition: Class definitions. (line 44) +* @ (at); function definition: Function definitions. + (line 32) +* @ (at); in struct format strings: Byte Order Size and Alignment. + (line 10) +* [] (square brackets); in assignment target list: Assignment statements. + (line 35) +* [] (square brackets); in glob-style wildcards: glob — Unix style pathname pattern expansion. + (line 10) +* [] (square brackets); in glob-style wildcards <1>: fnmatch — Unix filename pattern matching. + (line 15) +* [] (square brackets); in regular expressions: Regular Expression Syntax. + (line 170) +* [] (square brackets); in string formatting: Format String Syntax. + (line 13) +* [] (square brackets); list expression: List displays. (line 6) +* [] (square brackets); subscription: Subscriptions. (line 6) +* \ (backslash); escape sequence: String and Bytes literals. + (line 72) +* \ (backslash); escape sequence <1>: Error Handlers. (line 15) +* \ (backslash); in pathnames (Windows): Miscellaneous System Information. + (line 95) +* \ (backslash); in regular expressions: Regular Expression Syntax. + (line 155) +* \ (backslash); in regular expressions <1>: Regular Expression Syntax. + (line 189) +* \ (backslash); in regular expressions <2>: Regular Expression Syntax. + (line 433) +* \a; escape sequence: String and Bytes literals. + (line 72) +* \A; in regular expressions: Regular Expression Syntax. + (line 445) +* \a; in regular expressions: Regular Expression Syntax. + (line 545) +* \b; escape sequence: String and Bytes literals. + (line 72) +* \b; in regular expressions: Regular Expression Syntax. + (line 449) +* \B; in regular expressions: Regular Expression Syntax. + (line 466) +* \b; in regular expressions <1>: Regular Expression Syntax. + (line 545) +* \d; in regular expressions: Regular Expression Syntax. + (line 477) +* \D; in regular expressions: Regular Expression Syntax. + (line 490) +* \f; escape sequence: String and Bytes literals. + (line 72) +* \f; in regular expressions: Regular Expression Syntax. + (line 545) +* \g; in regular expressions: Functions<2>. (line 185) +* \n; escape sequence: String and Bytes literals. + (line 72) +* \N; escape sequence: String and Bytes literals. + (line 72) +* \N; escape sequence <1>: Error Handlers. (line 54) +* \n; in regular expressions: Regular Expression Syntax. + (line 545) +* \N; in regular expressions: Regular Expression Syntax. + (line 545) +* \r; escape sequence: String and Bytes literals. + (line 72) +* \r; in regular expressions: Regular Expression Syntax. + (line 545) +* \s; in regular expressions: Regular Expression Syntax. + (line 496) +* \S; in regular expressions: Regular Expression Syntax. + (line 511) +* \t; escape sequence: String and Bytes literals. + (line 72) +* \t; in regular expressions: Regular Expression Syntax. + (line 545) +* \u; escape sequence: String and Bytes literals. + (line 72) +* \U; escape sequence: String and Bytes literals. + (line 72) +* \u; escape sequence <1>: Error Handlers. (line 15) +* \U; escape sequence <1>: Error Handlers. (line 15) +* \u; in regular expressions: Regular Expression Syntax. + (line 545) +* \U; in regular expressions: Regular Expression Syntax. + (line 545) +* \v; escape sequence: String and Bytes literals. + (line 72) +* \v; in regular expressions: Regular Expression Syntax. + (line 545) +* \w; in regular expressions: Regular Expression Syntax. + (line 517) +* \W; in regular expressions: Regular Expression Syntax. + (line 533) +* \x; escape sequence: String and Bytes literals. + (line 72) +* \x; escape sequence <1>: Error Handlers. (line 15) +* \x; in regular expressions: Regular Expression Syntax. + (line 545) +* \Z; in regular expressions: Regular Expression Syntax. + (line 541) +* \\; escape sequence: String and Bytes literals. + (line 72) +* \\; in regular expressions: Regular Expression Syntax. + (line 545) +* ^ (caret); in curses module: curses ascii — Utilities for ASCII characters. + (line 226) +* ^ (caret); in regular expressions: Regular Expression Syntax. + (line 52) +* ^ (caret); in regular expressions <1>: Regular Expression Syntax. + (line 194) +* ^ (caret); in string formatting: Format Specification Mini-Language. + (line 42) +* ^ (caret); marker: What About Exceptions?. + (line 93) +* ^ (caret); marker <1>: traceback — Print or retrieve a stack traceback. + (line 45) +* ^=; augmented assignment: Augmented assignment statements. + (line 6) +* _ (underscore); gettext: GNU gettext API. (line 32) +* _ (underscore); in numeric literal: Numeric literals. (line 13) +* _ (underscore); in numeric literal <1>: Integer literals. (line 39) +* _ (underscore); in string formatting: Format Specification Mini-Language. + (line 111) +* _, identifiers: Soft Keywords. (line 18) +* _anonymous_ (ctypes.Structure attribute): Structured data types. + (line 86) +* _asdict() (collections.somenamedtuple method): namedtuple Factory Function for Tuples with Named Fields. + (line 110) +* _b_base_ (ctypes._CData attribute): Data types. (line 71) +* _b_needsfree_ (ctypes._CData attribute): Data types. (line 78) +* _callmethod() (multiprocessing.managers.BaseProxy method): Proxy Objects. + (line 96) +* _CData (class in ctypes): Data types. (line 6) +* _clear_type_cache() (in module sys): sys — System-specific parameters and functions. + (line 162) +* _current_exceptions() (in module sys): sys — System-specific parameters and functions. + (line 191) +* _current_frames() (in module sys): sys — System-specific parameters and functions. + (line 171) +* _debugmallocstats() (in module sys): sys — System-specific parameters and functions. + (line 243) +* _emscripten_info (in module sys): sys — System-specific parameters and functions. + (line 308) +* _enablelegacywindowsfsencoding() (in module sys): sys — System-specific parameters and functions. + (line 1586) +* _enter_task() (in module asyncio): Task lifetime support. + (line 22) +* _exit() (in module os): Process Management. (line 120) +* _fields (ast.AST attribute): Node classes. (line 22) +* _fields (collections.somenamedtuple attribute): namedtuple Factory Function for Tuples with Named Fields. + (line 140) +* _fields_ (ctypes.Structure attribute): Structured data types. + (line 43) +* _field_defaults (collections.somenamedtuple attribute): namedtuple Factory Function for Tuples with Named Fields. + (line 153) +* _flush() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 116) +* _frozen (C struct): Importing Modules<2>. + (line 259) +* _FuncPtr (class in ctypes): Foreign functions. (line 12) +* _generate_next_value_() (enum.Enum method): Data Types<2>. (line 174) +* _getframe() (in module sys): sys — System-specific parameters and functions. + (line 800) +* _getvalue() (multiprocessing.managers.BaseProxy method): Proxy Objects. + (line 138) +* _get_child_mock() (unittest.mock.Mock method): The Mock Class. + (line 287) +* _get_preferred_schemes() (in module sysconfig): Installation paths. + (line 103) +* _handle (ctypes.PyDLL attribute): Loading shared libraries. + (line 141) +* _ignore_ (enum.Enum attribute): Data Types<2>. (line 101) +* _inittab (C struct): Importing Modules<2>. + (line 295) +* _leave_task() (in module asyncio): Task lifetime support. + (line 30) +* _length_ (ctypes.Array attribute): Arrays and pointers. + (line 18) +* _make() (collections.somenamedtuple class method): namedtuple Factory Function for Tuples with Named Fields. + (line 101) +* _makeResult() (unittest.TextTestRunner method): Loading and running tests. + (line 471) +* _missing_() (enum.Enum method): Data Types<2>. (line 207) +* _name (ctypes.PyDLL attribute): Loading shared libraries. + (line 145) +* _numeric_repr_() (enum.Flag method): Data Types<2>. (line 420) +* _objects (ctypes._CData attribute): Data types. (line 83) +* _pack_ (ctypes.Structure attribute): Structured data types. + (line 79) +* _parse() (gettext.NullTranslations method): The NullTranslations class. + (line 21) +* _Pointer (class in ctypes): Arrays and pointers. + (line 31) +* _PyBytes_Resize (C function): Bytes Objects<2>. (line 181) +* _PyCFunctionFast (C type): Implementing functions and methods. + (line 29) +* _PyCFunctionFastWithKeywords (C type): Implementing functions and methods. + (line 38) +* _PyFrameEvalFunction (C type): Low-level API. (line 150) +* _PyInterpreterState_GetEvalFrameFunc (C function): Low-level API. + (line 165) +* _PyInterpreterState_SetEvalFrameFunc (C function): Low-level API. + (line 175) +* _PyObject_GetDictPtr (C function): Object Protocol. (line 145) +* _PyObject_New (C function): Allocating Objects on the Heap. + (line 6) +* _PyObject_NewVar (C function): Allocating Objects on the Heap. + (line 9) +* _PyTuple_Resize (C function): Tuple Objects. (line 89) +* _Py_c_diff (C function): Complex Numbers as C Structures. + (line 28) +* _Py_c_neg (C function): Complex Numbers as C Structures. + (line 34) +* _Py_c_pow (C function): Complex Numbers as C Structures. + (line 54) +* _Py_c_prod (C function): Complex Numbers as C Structures. + (line 39) +* _Py_c_quot (C function): Complex Numbers as C Structures. + (line 45) +* _Py_c_sum (C function): Complex Numbers as C Structures. + (line 22) +* _Py_InitializeMain (C function): Multi-Phase Initialization Private Provisional API. + (line 47) +* _Py_NoneStruct (C var): Allocating Objects on the Heap. + (line 56) +* _register_task() (in module asyncio): Task lifetime support. + (line 10) +* _replace() (collections.somenamedtuple method): namedtuple Factory Function for Tuples with Named Fields. + (line 128) +* _setroot() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 15) +* _SimpleCData (class in ctypes): Fundamental data types<2>. + (line 6) +* _structure() (in module email.iterators): email iterators Iterators. + (line 44) +* _type_ (ctypes.Array attribute): Arrays and pointers. + (line 24) +* _type_ (ctypes._Pointer attribute): Arrays and pointers. + (line 46) +* _unregister_task() (in module asyncio): Task lifetime support. + (line 16) +* _write() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 108) +* _xoptions (in module sys): sys — System-specific parameters and functions. + (line 1847) +* __, identifiers: Soft Keywords. (line 17) +* __abs__() (in module operator): operator — Standard operators as functions. + (line 73) +* __abs__() (object method): Emulating numeric types. + (line 106) +* __add__() (in module operator): operator — Standard operators as functions. + (line 78) +* __add__() (object method): Emulating numeric types. + (line 11) +* __aenter__() (object method): Asynchronous Context Managers. + (line 12) +* __aexit__() (object method): Asynchronous Context Managers. + (line 17) +* __aiter__() (object method): Asynchronous Iterators. + (line 12) +* __all__: Importing * From a Package. + (line 6) +* __all__ (optional module attribute): The import statement. + (line 83) +* __all__ (package variable): Importing Modules<2>. + (line 9) +* __and__() (enum.Flag method): Data Types<2>. (line 391) +* __and__() (in module operator): operator — Standard operators as functions. + (line 83) +* __and__() (object method): Emulating numeric types. + (line 11) +* __anext__() (agen method): Asynchronous generator-iterator methods. + (line 10) +* __anext__() (object method): Asynchronous Iterators. + (line 16) +* __annotations__ (class attribute): The standard type hierarchy. + (line 613) +* __annotations__ (function attribute): The standard type hierarchy. + (line 309) +* __annotations__ (module attribute): The standard type hierarchy. + (line 544) +* __args__ (genericalias attribute): Special Attributes of GenericAlias objects. + (line 15) +* __await__() (object method): Awaitable Objects. (line 14) +* __bases__ (class attribute): The standard type hierarchy. + (line 613) +* __bases__ (class attribute) <1>: Special Attributes. (line 19) +* __bool__() (object method): Basic customization. + (line 301) +* __bool__() (object method) <1>: Emulating container types. + (line 40) +* __breakpointhook__ (in module sys): sys — System-specific parameters and functions. + (line 386) +* __bytes__() (email.message.EmailMessage method): email message Representing an email message. + (line 129) +* __bytes__() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 138) +* __bytes__() (object method): Basic customization. + (line 143) +* __cached__: Import-related module attributes. + (line 69) +* __callback__ (weakref.ref attribute): weakref — Weak references. + (line 126) +* __call__() (email.headerregistry.HeaderRegistry method): email headerregistry Custom Header Objects. + (line 389) +* __call__() (enum.Enum method): Data Types<2>. (line 110) +* __call__() (in module operator): operator — Standard operators as functions. + (line 221) +* __call__() (object method): Emulating callable objects. + (line 6) +* __call__() (object method) <1>: Calls. (line 156) +* __call__() (weakref.finalize method): weakref — Weak references. + (line 263) +* __cause__ (exception attribute): The raise statement. + (line 30) +* __cause__ (traceback.TracebackException attribute): TracebackException Objects. + (line 26) +* __ceil__() (fractions.Fraction method): fractions — Rational numbers. + (line 170) +* __ceil__() (object method): Emulating numeric types. + (line 136) +* __classcell__ (class namespace entry): Creating the class object. + (line 6) +* __class_getitem__() (object class method): Emulating generic types. + (line 32) +* __class__ (instance attribute): The standard type hierarchy. + (line 670) +* __class__ (instance attribute) <1>: Special Attributes. (line 15) +* __class__ (method cell): Creating the class object. + (line 6) +* __class__ (module attribute): Customizing module attribute access. + (line 6) +* __class__ (unittest.mock.Mock attribute): The Mock Class. (line 538) +* __closure__ (function attribute): The standard type hierarchy. + (line 309) +* __code__ (function attribute): The standard type hierarchy. + (line 309) +* __code__ (function object attribute): Code Objects. (line 6) +* __complex__() (object method): Emulating numeric types. + (line 114) +* __concat__() (in module operator): operator — Standard operators as functions. + (line 176) +* __contains__() (email.message.EmailMessage method): email message Representing an email message. + (line 179) +* __contains__() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 300) +* __contains__() (enum.EnumType method): Data Types<2>. (line 17) +* __contains__() (enum.Flag method): Data Types<2>. (line 334) +* __contains__() (in module operator): operator — Standard operators as functions. + (line 181) +* __contains__() (mailbox.Mailbox method): Mailbox objects. (line 195) +* __contains__() (object method): Emulating container types. + (line 151) +* __context__ (exception attribute): The raise statement. + (line 30) +* __context__ (traceback.TracebackException attribute): TracebackException Objects. + (line 30) +* __copy__() (copy protocol): copy — Shallow and deep copy operations. + (line 73) +* __debug__: The assert statement. + (line 21) +* __debug__ (built-in variable): Built-in Constants. (line 65) +* __deepcopy__() (copy protocol): copy — Shallow and deep copy operations. + (line 73) +* __defaults__ (function attribute): The standard type hierarchy. + (line 309) +* __delattr__() (object method): Customizing attribute access. + (line 68) +* __delete__() (object method): Implementing Descriptors. + (line 40) +* __delitem__() (email.message.EmailMessage method): email message Representing an email message. + (line 226) +* __delitem__() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 334) +* __delitem__() (in module operator): operator — Standard operators as functions. + (line 191) +* __delitem__() (mailbox.Mailbox method): Mailbox objects. (line 76) +* __delitem__() (mailbox.MH method): MH. (line 76) +* __delitem__() (object method): Emulating container types. + (line 109) +* __del__() (io.IOBase method): I/O Base Classes. (line 166) +* __del__() (object method): Basic customization. + (line 53) +* __dict__ (class attribute): The standard type hierarchy. + (line 613) +* __dict__ (function attribute): The standard type hierarchy. + (line 309) +* __dict__ (instance attribute): The standard type hierarchy. + (line 670) +* __dict__ (module attribute): The standard type hierarchy. + (line 572) +* __dict__ (module attribute) <1>: Module Objects. (line 47) +* __dict__ (object attribute): Special Attributes. (line 10) +* __dir__ (module attribute): Customizing module attribute access. + (line 6) +* __dir__() (enum.Enum method): Data Types<2>. (line 154) +* __dir__() (enum.EnumType method): Data Types<2>. (line 30) +* __dir__() (object method): Customizing attribute access. + (line 77) +* __dir__() (unittest.mock.Mock method): The Mock Class. (line 278) +* __displayhook__ (in module sys): sys — System-specific parameters and functions. + (line 386) +* __divmod__() (object method): Emulating numeric types. + (line 11) +* __doc__ (class attribute): The standard type hierarchy. + (line 613) +* __doc__ (function attribute): The standard type hierarchy. + (line 309) +* __doc__ (method attribute): The standard type hierarchy. + (line 399) +* __doc__ (module attribute): The standard type hierarchy. + (line 544) +* __doc__ (module attribute) <1>: Module Objects. (line 26) +* __doc__ (types.ModuleType attribute): Standard Interpreter Types. + (line 138) +* __enter__() (contextmanager method): Context Manager Types. + (line 12) +* __enter__() (object method): With Statement Context Managers. + (line 21) +* __enter__() (winreg.PyHKEY method): Registry Handle Objects. + (line 56) +* __eq__() (email.charset.Charset method): email charset Representing character sets. + (line 150) +* __eq__() (email.header.Header method): email header Internationalized headers. + (line 170) +* __eq__() (in module operator): operator — Standard operators as functions. + (line 24) +* __eq__() (instance method): Comparisons<2>. (line 50) +* __eq__() (memoryview method): Memory Views. (line 109) +* __eq__() (object method): Basic customization. + (line 172) +* __excepthook__ (in module sys): sys — System-specific parameters and functions. + (line 386) +* __excepthook__ (in module threading): threading — Thread-based parallelism. + (line 110) +* __exit__() (contextmanager method): Context Manager Types. + (line 32) +* __exit__() (object method): With Statement Context Managers. + (line 27) +* __exit__() (winreg.PyHKEY method): Registry Handle Objects. + (line 56) +* __file__: Import-related module attributes. + (line 67) +* __file__ (module attribute): The standard type hierarchy. + (line 544) +* __file__ (module attribute) <1>: Module Objects. (line 26) +* __file__ (module attribute) <2>: Module Objects. (line 90) +* __float__() (object method): Emulating numeric types. + (line 114) +* __floordiv__() (in module operator): operator — Standard operators as functions. + (line 88) +* __floordiv__() (object method): Emulating numeric types. + (line 11) +* __floor__() (fractions.Fraction method): fractions — Rational numbers. + (line 160) +* __floor__() (object method): Emulating numeric types. + (line 136) +* __format__: Built-in Functions. (line 689) +* __format__() (datetime.date method): date Objects. (line 280) +* __format__() (datetime.datetime method): datetime Objects. (line 714) +* __format__() (datetime.time method): time Objects. (line 231) +* __format__() (enum.Enum method): Data Types<2>. (line 260) +* __format__() (ipaddress.IPv4Address method): Address objects. + (line 136) +* __format__() (ipaddress.IPv6Address method): Address objects. + (line 268) +* __format__() (object method): Basic customization. + (line 149) +* __fspath__() (os.PathLike method): Process Parameters. (line 122) +* __func__ (method attribute): The standard type hierarchy. + (line 399) +* __future__: Glossary. (line 528) +* __future__; future statement: Future statements. (line 6) +* __getattribute__() (object method): Customizing attribute access. + (line 32) +* __getattr__ (module attribute): Customizing module attribute access. + (line 6) +* __getattr__() (enum.EnumType method): Data Types<2>. (line 38) +* __getattr__() (object method): Customizing attribute access. + (line 10) +* __getitem__() (email.headerregistry.HeaderRegistry method): email headerregistry Custom Header Objects. + (line 384) +* __getitem__() (email.message.EmailMessage method): email message Representing an email message. + (line 189) +* __getitem__() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 309) +* __getitem__() (enum.EnumType method): Data Types<2>. (line 46) +* __getitem__() (in module operator): operator — Standard operators as functions. + (line 196) +* __getitem__() (mailbox.Mailbox method): Mailbox objects. (line 140) +* __getitem__() (mapping object method): Special method names. + (line 6) +* __getitem__() (object method): Emulating container types. + (line 77) +* __getitem__() (re.Match method): Match Objects. (line 83) +* __getnewargs_ex__() (object method): Pickling Class Instances. + (line 29) +* __getnewargs__() (object method): Pickling Class Instances. + (line 47) +* __getstate__() (copy protocol): Handling Stateful Objects. + (line 6) +* __getstate__() (object method): Pickling Class Instances. + (line 61) +* __get__() (object method): Implementing Descriptors. + (line 13) +* __ge__() (in module operator): operator — Standard operators as functions. + (line 24) +* __ge__() (instance method): Comparisons<2>. (line 50) +* __ge__() (object method): Basic customization. + (line 172) +* __globals__ (function attribute): The standard type hierarchy. + (line 309) +* __gt__() (in module operator): operator — Standard operators as functions. + (line 24) +* __gt__() (instance method): Comparisons<2>. (line 50) +* __gt__() (object method): Basic customization. + (line 172) +* __hash__() (object method): Basic customization. + (line 220) +* __iadd__() (in module operator): In-place Operators. (line 36) +* __iadd__() (object method): Emulating numeric types. + (line 77) +* __iand__() (in module operator): In-place Operators. (line 41) +* __iand__() (object method): Emulating numeric types. + (line 77) +* __iconcat__() (in module operator): In-place Operators. (line 46) +* __ifloordiv__() (in module operator): In-place Operators. (line 52) +* __ifloordiv__() (object method): Emulating numeric types. + (line 77) +* __ilshift__() (in module operator): In-place Operators. (line 57) +* __ilshift__() (object method): Emulating numeric types. + (line 77) +* __imatmul__() (in module operator): In-place Operators. (line 72) +* __imatmul__() (object method): Emulating numeric types. + (line 77) +* __imod__() (in module operator): In-place Operators. (line 62) +* __imod__() (object method): Emulating numeric types. + (line 77) +* __import__() (in module importlib): Functions<11>. (line 6) +* __imul__() (in module operator): In-place Operators. (line 67) +* __imul__() (object method): Emulating numeric types. + (line 77) +* __index__() (in module operator): operator — Standard operators as functions. + (line 93) +* __index__() (object method): Emulating numeric types. + (line 122) +* __init_subclass__() (enum.Enum method): Data Types<2>. (line 202) +* __init_subclass__() (object class method): Customizing class creation. + (line 13) +* __init__() (asyncio.Future method): Future and Task private constructors. + (line 17) +* __init__() (asyncio.Task method): Future and Task private constructors. + (line 23) +* __init__() (difflib.HtmlDiff method): difflib — Helpers for computing deltas. + (line 91) +* __init__() (logging.Handler method): Handler Objects. (line 13) +* __init__() (logging.logging.Formatter method): Formatters. (line 13) +* __init__() (object method): Basic customization. + (line 37) +* __instancecheck__() (class method): Customizing instance and subclass checks. + (line 15) +* __interactivehook__ (in module sys): sys — System-specific parameters and functions. + (line 1048) +* __int__() (object method): Emulating numeric types. + (line 114) +* __invert__() (in module operator): operator — Standard operators as functions. + (line 102) +* __invert__() (object method): Emulating numeric types. + (line 106) +* __inv__() (in module operator): operator — Standard operators as functions. + (line 102) +* __ior__() (in module operator): In-place Operators. (line 79) +* __ior__() (object method): Emulating numeric types. + (line 77) +* __ipow__() (in module operator): In-place Operators. (line 84) +* __ipow__() (object method): Emulating numeric types. + (line 77) +* __irshift__() (in module operator): In-place Operators. (line 89) +* __irshift__() (object method): Emulating numeric types. + (line 77) +* __isub__() (in module operator): In-place Operators. (line 94) +* __isub__() (object method): Emulating numeric types. + (line 77) +* __iter__() (container method): Iterator Types. (line 14) +* __iter__() (enum.EnumType method): Data Types<2>. (line 54) +* __iter__() (iterator method): Iterator Types. (line 29) +* __iter__() (mailbox.Mailbox method): Mailbox objects. (line 114) +* __iter__() (object method): Emulating container types. + (line 123) +* __iter__() (unittest.TestSuite method): Grouping tests. (line 60) +* __itruediv__() (in module operator): In-place Operators. (line 99) +* __itruediv__() (object method): Emulating numeric types. + (line 77) +* __ixor__() (in module operator): In-place Operators. (line 104) +* __ixor__() (object method): Emulating numeric types. + (line 77) +* __kwdefaults__ (function attribute): The standard type hierarchy. + (line 309) +* __length_hint__() (object method): Emulating container types. + (line 53) +* __len__() (email.message.EmailMessage method): email message Representing an email message. + (line 175) +* __len__() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 296) +* __len__() (enum.EnumType method): Data Types<2>. (line 61) +* __len__() (mailbox.Mailbox method): Mailbox objects. (line 200) +* __len__() (mapping object method): Basic customization. + (line 303) +* __len__() (object method): Emulating container types. + (line 38) +* __le__() (in module operator): operator — Standard operators as functions. + (line 24) +* __le__() (instance method): Comparisons<2>. (line 50) +* __le__() (object method): Basic customization. + (line 172) +* __loader__: Import-related module attributes. + (line 16) +* __loader__ (module attribute): Module Objects. (line 26) +* __loader__ (types.ModuleType attribute): Standard Interpreter Types. + (line 142) +* __lshift__() (in module operator): operator — Standard operators as functions. + (line 110) +* __lshift__() (object method): Emulating numeric types. + (line 11) +* __lt__() (in module operator): operator — Standard operators as functions. + (line 24) +* __lt__() (instance method): Comparisons<2>. (line 50) +* __lt__() (object method): Basic customization. + (line 172) +* __matmul__() (in module operator): operator — Standard operators as functions. + (line 125) +* __matmul__() (object method): Emulating numeric types. + (line 11) +* __missing__(): Mapping Types — dict. + (line 92) +* __missing__() (collections.defaultdict method): defaultdict objects. + (line 22) +* __missing__() (object method): Emulating container types. + (line 118) +* __module__ (class attribute): The standard type hierarchy. + (line 613) +* __module__ (function attribute): The standard type hierarchy. + (line 309) +* __module__ (method attribute): The standard type hierarchy. + (line 399) +* __mod__() (in module operator): operator — Standard operators as functions. + (line 115) +* __mod__() (object method): Emulating numeric types. + (line 11) +* __mro__ (class attribute): Special Attributes. (line 35) +* __mul__() (in module operator): operator — Standard operators as functions. + (line 120) +* __mul__() (object method): Emulating numeric types. + (line 11) +* __name__: Import-related module attributes. + (line 10) +* __name__ (class attribute): The standard type hierarchy. + (line 613) +* __name__ (definition attribute): Special Attributes. (line 23) +* __name__ (function attribute): The standard type hierarchy. + (line 309) +* __name__ (method attribute): The standard type hierarchy. + (line 399) +* __name__ (module attribute): The standard type hierarchy. + (line 544) +* __name__ (module attribute) <1>: Module Objects. (line 26) +* __name__ (module attribute) <2>: Module Objects. (line 62) +* __name__ (types.ModuleType attribute): Standard Interpreter Types. + (line 160) +* __neg__() (in module operator): operator — Standard operators as functions. + (line 132) +* __neg__() (object method): Emulating numeric types. + (line 106) +* __new__() (object method): Basic customization. + (line 6) +* __next__() (csv.csvreader method): Reader Objects. (line 9) +* __next__() (generator method): Generator-iterator methods. + (line 12) +* __next__() (iterator method): Iterator Types. (line 37) +* __ne__() (email.charset.Charset method): email charset Representing character sets. + (line 155) +* __ne__() (email.header.Header method): email header Internationalized headers. + (line 175) +* __ne__() (in module operator): operator — Standard operators as functions. + (line 24) +* __ne__() (instance method): Comparisons<2>. (line 50) +* __ne__() (object method): Basic customization. + (line 172) +* __notes__ (BaseException attribute): Base classes. (line 52) +* __notes__ (traceback.TracebackException attribute): TracebackException Objects. + (line 39) +* __not__() (in module operator): operator — Standard operators as functions. + (line 49) +* __optional_keys__ (typing.TypedDict attribute): Other special directives. + (line 250) +* __origin__ (genericalias attribute): Special Attributes of GenericAlias objects. + (line 8) +* __or__() (enum.Flag method): Data Types<2>. (line 384) +* __or__() (in module operator): operator — Standard operators as functions. + (line 137) +* __or__() (object method): Emulating numeric types. + (line 11) +* __package__: Import-related module attributes. + (line 23) +* __package__ (module attribute): Module Objects. (line 26) +* __package__ (types.ModuleType attribute): Standard Interpreter Types. + (line 165) +* __parameters__ (genericalias attribute): Special Attributes of GenericAlias objects. + (line 24) +* __path__: Import-related module attributes. + (line 56) +* __pos__() (in module operator): operator — Standard operators as functions. + (line 142) +* __pos__() (object method): Emulating numeric types. + (line 106) +* __pow__() (in module operator): operator — Standard operators as functions. + (line 147) +* __pow__() (object method): Emulating numeric types. + (line 11) +* __prepare__ (metaclass method): Preparing the class namespace. + (line 6) +* __PYVENV_LAUNCHER__: PyConfig. (line 179) +* __PYVENV_LAUNCHER__ <1>: PyConfig. (line 653) +* __qualname__ (definition attribute): Special Attributes. (line 28) +* __radd__() (object method): Emulating numeric types. + (line 41) +* __rand__() (object method): Emulating numeric types. + (line 41) +* __rdivmod__() (object method): Emulating numeric types. + (line 41) +* __reduce_ex__() (object method): Pickling Class Instances. + (line 179) +* __reduce__() (object method): Pickling Class Instances. + (line 124) +* __repr__() (enum.Enum method): Data Types<2>. (line 229) +* __repr__() (multiprocessing.managers.BaseProxy method): Proxy Objects. + (line 145) +* __repr__() (netrc.netrc method): netrc Objects. (line 16) +* __repr__() (object method): Basic customization. + (line 112) +* __required_keys__ (typing.TypedDict attribute): Other special directives. + (line 246) +* __reversed__() (enum.EnumType method): Data Types<2>. (line 68) +* __reversed__() (object method): Emulating container types. + (line 130) +* __rfloordiv__() (object method): Emulating numeric types. + (line 41) +* __rlshift__() (object method): Emulating numeric types. + (line 41) +* __rmatmul__() (object method): Emulating numeric types. + (line 41) +* __rmod__() (object method): Emulating numeric types. + (line 41) +* __rmul__() (object method): Emulating numeric types. + (line 41) +* __ror__() (object method): Emulating numeric types. + (line 41) +* __round__() (fractions.Fraction method): fractions — Rational numbers. + (line 176) +* __round__() (object method): Emulating numeric types. + (line 136) +* __rpow__() (object method): Emulating numeric types. + (line 41) +* __rrshift__() (object method): Emulating numeric types. + (line 41) +* __rshift__() (in module operator): operator — Standard operators as functions. + (line 152) +* __rshift__() (object method): Emulating numeric types. + (line 11) +* __rsub__() (object method): Emulating numeric types. + (line 41) +* __rtruediv__() (object method): Emulating numeric types. + (line 41) +* __rxor__() (object method): Emulating numeric types. + (line 41) +* __self__ (method attribute): The standard type hierarchy. + (line 399) +* __setattr__() (object method): Customizing attribute access. + (line 53) +* __setitem__() (email.message.EmailMessage method): email message Representing an email message. + (line 204) +* __setitem__() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 320) +* __setitem__() (in module operator): operator — Standard operators as functions. + (line 205) +* __setitem__() (mailbox.Mailbox method): Mailbox objects. (line 90) +* __setitem__() (mailbox.Maildir method): Maildir. (line 91) +* __setitem__() (object method): Emulating container types. + (line 100) +* __setstate__() (copy protocol): Handling Stateful Objects. + (line 6) +* __setstate__() (object method): Pickling Class Instances. + (line 88) +* __set_name__() (object method): Customizing class creation. + (line 47) +* __set__() (object method): Implementing Descriptors. + (line 31) +* __slots__: Glossary. (line 1213) +* __spec__: Import-related module attributes. + (line 40) +* __spec__ (types.ModuleType attribute): Standard Interpreter Types. + (line 186) +* __stderr__ (in module sys): sys — System-specific parameters and functions. + (line 1672) +* __stdin__ (in module sys): sys — System-specific parameters and functions. + (line 1672) +* __stdout__ (in module sys): sys — System-specific parameters and functions. + (line 1672) +* __str__() (datetime.date method): date Objects. (line 253) +* __str__() (datetime.datetime method): datetime Objects. (line 684) +* __str__() (datetime.time method): time Objects. (line 221) +* __str__() (email.charset.Charset method): email charset Representing character sets. + (line 145) +* __str__() (email.header.Header method): email header Internationalized headers. + (line 158) +* __str__() (email.headerregistry.Address method): email headerregistry Custom Header Objects. + (line 446) +* __str__() (email.headerregistry.Group method): email headerregistry Custom Header Objects. + (line 481) +* __str__() (email.message.EmailMessage method): email message Representing an email message. + (line 95) +* __str__() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 101) +* __str__() (enum.Enum method): Data Types<2>. (line 245) +* __str__() (multiprocessing.managers.BaseProxy method): Proxy Objects. + (line 149) +* __str__() (object method): Basic customization. + (line 128) +* __subclasscheck__() (class method): Customizing instance and subclass checks. + (line 21) +* __subclasses__() (class method): Special Attributes. (line 46) +* __subclasshook__() (abc.ABCMeta method): abc — Abstract Base Classes. + (line 92) +* __sub__() (in module operator): operator — Standard operators as functions. + (line 157) +* __sub__() (object method): Emulating numeric types. + (line 11) +* __suppress_context__ (traceback.TracebackException attribute): TracebackException Objects. + (line 35) +* __total__ (typing.TypedDict attribute): Other special directives. + (line 230) +* __traceback__ (exception attribute): The raise statement. + (line 6) +* __truediv__() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 113) +* __truediv__() (in module operator): operator — Standard operators as functions. + (line 162) +* __truediv__() (object method): Emulating numeric types. + (line 11) +* __trunc__() (object method): Emulating numeric types. + (line 136) +* __unpacked__ (genericalias attribute): Special Attributes of GenericAlias objects. + (line 40) +* __unraisablehook__ (in module sys): sys — System-specific parameters and functions. + (line 386) +* __xor__() (enum.Flag method): Data Types<2>. (line 400) +* __xor__() (in module operator): operator — Standard operators as functions. + (line 168) +* __xor__() (object method): Emulating numeric types. + (line 11) +* {} (curly brackets); dictionary expression: Dictionary displays. + (line 6) +* {} (curly brackets); in formatted string literal: String literal concatenation. + (line 24) +* {} (curly brackets); in regular expressions: Regular Expression Syntax. + (line 114) +* {} (curly brackets); in string formatting: Format String Syntax. + (line 13) +* {} (curly brackets); set expression: Set displays. (line 6) +* | (vertical bar); in regular expressions: Regular Expression Syntax. + (line 220) +* |=; augmented assignment: Augmented assignment statements. + (line 6) +* ~ (tilde); home directory expansion: os path — Common pathname manipulations. + (line 130) +* A (in module re): Flags. (line 16) +* A-LAW: aifc — Read and write AIFF and AIFC files. + (line 163) +* a-LAW: audioop — Manipulate raw audio data. + (line 20) +* A-LAW <1>: sndhdr — Determine type of sound file. + (line 8) +* a2b_base64() (in module binascii): binascii — Convert between binary and ASCII. + (line 40) +* a2b_hex() (in module binascii): binascii — Convert between binary and ASCII. + (line 144) +* a2b_qp() (in module binascii): binascii — Convert between binary and ASCII. + (line 70) +* a2b_uu() (in module binascii): binascii — Convert between binary and ASCII. + (line 25) +* a85decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 185) +* a85encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 162) +* ABC (class in abc): abc — Abstract Base Classes. + (line 26) +* ABCMeta (class in abc): abc — Abstract Base Classes. + (line 52) +* abiflags (in module sys): sys — System-specific parameters and functions. + (line 12) +* abort(): Process Control. (line 7) +* abort() (asyncio.Barrier method): Barrier. (line 87) +* abort() (asyncio.DatagramTransport method): Datagram Transports. + (line 15) +* abort() (asyncio.WriteTransport method): Write-only Transports. + (line 6) +* abort() (ftplib.FTP method): FTP Objects. (line 61) +* abort() (in module os): Process Management. (line 16) +* abort() (threading.Barrier method): Barrier Objects. (line 82) +* above() (curses.panel.Panel method): Panel Objects. (line 13) +* ABOVE_NORMAL_PRIORITY_CLASS (in module subprocess): Windows Constants. + (line 52) +* abs() (decimal.Context method): Context objects. (line 248) +* abs() (in module operator): operator — Standard operators as functions. + (line 73) +* absolute() (pathlib.Path method): Methods<2>. (line 363) +* abspath() (in module os.path): os path — Common pathname manipulations. + (line 49) +* abstract base class: Glossary. (line 32) +* AbstractAsyncContextManager (class in contextlib): Utilities. + (line 19) +* AbstractBasicAuthHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 335) +* AbstractChildWatcher (class in asyncio): Process Watchers. (line 39) +* abstractclassmethod() (in module abc): abc — Abstract Base Classes. + (line 238) +* AbstractContextManager (class in contextlib): Utilities. (line 8) +* AbstractDigestAuthHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 374) +* AbstractEventLoop (class in asyncio): Event Loop Implementations. + (line 43) +* AbstractEventLoopPolicy (class in asyncio): Policy Objects. + (line 8) +* abstractmethod() (in module abc): abc — Abstract Base Classes. + (line 161) +* abstractproperty() (in module abc): abc — Abstract Base Classes. + (line 282) +* AbstractSet (class in typing): Corresponding to collections in collections abc. + (line 6) +* abstractstaticmethod() (in module abc): abc — Abstract Base Classes. + (line 260) +* accept() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 238) +* accept() (multiprocessing.connection.Listener method): Listeners and Clients. + (line 84) +* accept() (socket.socket method): Socket Objects. (line 13) +* access() (in module os): Files and Directories. + (line 51) +* accumulate() (in module itertools): Itertool functions. (line 10) +* aclose() (agen method): Asynchronous generator-iterator methods. + (line 55) +* aclose() (contextlib.AsyncExitStack method): Utilities. (line 631) +* aclosing() (in module contextlib): Utilities. (line 179) +* acos() (in module cmath): Trigonometric functions<2>. + (line 6) +* acos() (in module math): Trigonometric functions. + (line 6) +* acosh() (in module cmath): Hyperbolic functions<2>. + (line 6) +* acosh() (in module math): Hyperbolic functions. + (line 9) +* acquire() (asyncio.Condition method): Condition. (line 47) +* acquire() (asyncio.Lock method): Lock. (line 35) +* acquire() (asyncio.Semaphore method): Semaphore. (line 42) +* acquire() (logging.Handler method): Handler Objects. (line 26) +* acquire() (multiprocessing.Lock method): Synchronization primitives. + (line 64) +* acquire() (multiprocessing.RLock method): Synchronization primitives. + (line 118) +* acquire() (threading.Condition method): Condition Objects. (line 85) +* acquire() (threading.Lock method): Lock Objects. (line 43) +* acquire() (threading.RLock method): RLock Objects. (line 35) +* acquire() (threading.Semaphore method): Semaphore Objects. (line 34) +* acquire() (_thread.lock method): _thread — Low-level threading API. + (line 139) +* acquire_lock() (in module imp): imp — Access the import internals. + (line 277) +* Action (class in argparse): Action classes. (line 11) +* action (optparse.Option attribute): Option attributes. (line 11) +* ACTIONS (optparse.Option attribute): Adding new actions. (line 31) +* active_children() (in module multiprocessing): Miscellaneous<3>. + (line 6) +* active_count() (in module threading): threading — Thread-based parallelism. + (line 53) +* actual() (tkinter.font.Font method): tkinter font — Tkinter font wrapper. + (line 47) +* Add (class in ast): Expressions<2>. (line 54) +* add() (decimal.Context method): Context objects. (line 252) +* add() (frozenset method): Set Types — set frozenset. + (line 195) +* add() (graphlib.TopologicalSorter method): graphlib — Functionality to operate with graph-like structures. + (line 81) +* add() (in module audioop): audioop — Manipulate raw audio data. + (line 34) +* add() (in module operator): operator — Standard operators as functions. + (line 78) +* add() (mailbox.Mailbox method): Mailbox objects. (line 59) +* add() (mailbox.Maildir method): Maildir. (line 91) +* add() (msilib.RadioButtonGroup method): GUI classes. (line 32) +* add() (pstats.Stats method): The Stats Class. (line 49) +* add() (tarfile.TarFile method): TarFile Objects. (line 202) +* add() (tkinter.ttk.Notebook method): ttk Notebook. (line 8) +* addAsyncCleanup() (unittest.IsolatedAsyncioTestCase method): Test cases. + (line 882) +* addaudithook() (in module sys): sys — System-specific parameters and functions. + (line 23) +* addch() (curses.window method): Window Objects. (line 9) +* addClassCleanup() (unittest.TestCase class method): Test cases. + (line 809) +* addCleanup() (unittest.TestCase method): Test cases. (line 770) +* addcomponent() (turtle.Shape method): Public classes. (line 66) +* addError() (unittest.TestResult method): Loading and running tests. + (line 356) +* addExpectedFailure() (unittest.TestResult method): Loading and running tests. + (line 392) +* addFailure() (unittest.TestResult method): Loading and running tests. + (line 367) +* addfile() (tarfile.TarFile method): TarFile Objects. (line 220) +* addFilter() (logging.Handler method): Handler Objects. (line 52) +* addFilter() (logging.Logger method): Logger Objects. (line 268) +* addHandler() (logging.Logger method): Logger Objects. (line 285) +* addinfourl (class in urllib.response): urllib response — Response classes used by urllib. + (line 12) +* addition: Binary arithmetic operations. + (line 69) +* addLevelName() (in module logging): Module-Level Functions. + (line 183) +* addModuleCleanup() (in module unittest): setUpModule and tearDownModule. + (line 22) +* addnstr() (curses.window method): Window Objects. (line 23) +* AddPackagePath() (in module modulefinder): modulefinder — Find modules used by a script. + (line 16) +* addr (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 52) +* Address (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 402) +* address (email.headerregistry.SingleAddressHeader attribute): email headerregistry Custom Header Objects. + (line 222) +* address (multiprocessing.connection.Listener attribute): Listeners and Clients. + (line 99) +* address (multiprocessing.managers.BaseManager attribute): Managers. + (line 137) +* addresses (email.headerregistry.AddressHeader attribute): email headerregistry Custom Header Objects. + (line 195) +* addresses (email.headerregistry.Group attribute): email headerregistry Custom Header Objects. + (line 476) +* AddressHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 180) +* addressof() (in module ctypes): Utility functions. (line 6) +* AddressValueError: Custom Exceptions. (line 9) +* address_exclude() (ipaddress.IPv4Network method): Network objects. + (line 160) +* address_exclude() (ipaddress.IPv6Network method): Network objects. + (line 342) +* address_family (socketserver.BaseServer attribute): Server Objects<2>. + (line 65) +* address_string() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 333) +* addr_spec (email.headerregistry.Address attribute): email headerregistry Custom Header Objects. + (line 440) +* addshape() (in module turtle): Settings and special methods. + (line 71) +* addsitedir() (in module site): Module contents<5>. (line 51) +* addSkip() (unittest.TestResult method): Loading and running tests. + (line 384) +* addstr() (curses.window method): Window Objects. (line 31) +* addSubTest() (unittest.TestResult method): Loading and running tests. + (line 410) +* addSuccess() (unittest.TestResult method): Loading and running tests. + (line 378) +* addTest() (unittest.TestSuite method): Grouping tests. (line 25) +* addTests() (unittest.TestSuite method): Grouping tests. (line 30) +* addTypeEqualityFunc() (unittest.TestCase method): Test cases. + (line 588) +* addUnexpectedSuccess() (unittest.TestResult method): Loading and running tests. + (line 402) +* add_alias() (in module email.charset): email charset Representing character sets. + (line 193) +* add_alternative() (email.message.EmailMessage method): email message Representing an email message. + (line 640) +* add_argument() (argparse.ArgumentParser method): The add_argument method. + (line 6) +* add_argument_group() (argparse.ArgumentParser method): Argument groups. + (line 6) +* add_attachment() (email.message.EmailMessage method): email message Representing an email message. + (line 652) +* add_cgi_vars() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 134) +* add_charset() (in module email.charset): email charset Representing character sets. + (line 164) +* add_child_handler() (asyncio.AbstractChildWatcher method): Process Watchers. + (line 41) +* add_codec() (in module email.charset): email charset Representing character sets. + (line 202) +* add_cookie_header() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 11) +* add_data() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 76) +* add_dll_directory() (in module os): Process Management. (line 24) +* add_done_callback() (asyncio.Future method): Future Object. + (line 81) +* add_done_callback() (asyncio.Task method): Task Object. (line 87) +* add_done_callback() (concurrent.futures.Future method): Future Objects. + (line 70) +* add_fallback() (gettext.NullTranslations method): The NullTranslations class. + (line 28) +* add_file() (msilib.Directory method): Directory Objects. (line 30) +* add_flag() (mailbox.MaildirMessage method): MaildirMessage. + (line 76) +* add_flag() (mailbox.mboxMessage method): mboxMessage. (line 79) +* add_flag() (mailbox.MMDFMessage method): MMDFMessage. (line 78) +* add_folder() (mailbox.Maildir method): Maildir. (line 71) +* add_folder() (mailbox.MH method): MH. (line 42) +* add_get_handler() (email.contentmanager.ContentManager method): email contentmanager Managing MIME Content. + (line 75) +* add_handler() (urllib.request.OpenerDirector method): OpenerDirector Objects. + (line 8) +* add_header() (email.message.EmailMessage method): email message Representing an email message. + (line 260) +* add_header() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 368) +* add_header() (urllib.request.Request method): Request Objects. + (line 79) +* add_header() (wsgiref.headers.Headers method): wsgiref headers – WSGI response header tools. + (line 60) +* add_history() (in module readline): History list. (line 38) +* add_include_dir() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 96) +* add_label() (mailbox.BabylMessage method): BabylMessage. (line 55) +* add_library() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 113) +* add_library_dir() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 135) +* add_link_object() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 180) +* add_mutually_exclusive_group() (argparse.ArgumentParser method): Mutual exclusion. + (line 6) +* add_note() (BaseException method): Base classes. (line 44) +* add_option() (optparse.OptionParser method): Defining options. + (line 14) +* add_parent() (urllib.request.BaseHandler method): BaseHandler Objects. + (line 10) +* add_password() (urllib.request.HTTPPasswordMgr method): HTTPPasswordMgr Objects. + (line 9) +* add_password() (urllib.request.HTTPPasswordMgrWithPriorAuth method): HTTPPasswordMgrWithPriorAuth Objects. + (line 10) +* add_reader() (asyncio.loop method): Watching file descriptors. + (line 6) +* add_related() (email.message.EmailMessage method): email message Representing an email message. + (line 627) +* add_runtime_library_dir() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 150) +* add_section() (configparser.ConfigParser method): ConfigParser Objects. + (line 86) +* add_section() (configparser.RawConfigParser method): RawConfigParser Objects. + (line 26) +* add_sequence() (mailbox.MHMessage method): MHMessage. (line 41) +* add_set_handler() (email.contentmanager.ContentManager method): email contentmanager Managing MIME Content. + (line 80) +* add_signal_handler() (asyncio.loop method): Unix signals. (line 6) +* add_stream() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 106) +* add_subparsers() (argparse.ArgumentParser method): Sub-commands. + (line 6) +* add_tables() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 97) +* add_type() (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 107) +* add_unredirected_header() (urllib.request.Request method): Request Objects. + (line 91) +* add_writer() (asyncio.loop method): Watching file descriptors. + (line 16) +* adjusted() (decimal.Decimal method): Decimal objects. (line 114) +* adjust_int_max_str_digits() (in module test.support): test support — Utilities for the Python test suite. + (line 705) +* adler32() (in module zlib): zlib — Compression compatible with gzip. + (line 28) +* ADPCM, Intel/DVI: audioop — Manipulate raw audio data. + (line 20) +* adpcm2lin() (in module audioop): audioop — Manipulate raw audio data. + (line 41) +* AF_ALG (in module socket): Constants<8>. (line 212) +* AF_CAN (in module socket): Constants<8>. (line 100) +* AF_INET (in module socket): Constants<8>. (line 11) +* AF_INET6 (in module socket): Constants<8>. (line 11) +* AF_LINK (in module socket): Constants<8>. (line 236) +* AF_PACKET (in module socket): Constants<8>. (line 173) +* AF_QIPCRTR (in module socket): Constants<8>. (line 264) +* AF_RDS (in module socket): Constants<8>. (line 183) +* AF_UNIX (in module socket): Constants<8>. (line 11) +* AF_VSOCK (in module socket): Constants<8>. (line 223) +* aifc() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 137) +* AIFF: aifc — Read and write AIFF and AIFC files. + (line 8) +* AIFF <1>: chunk — Read IFF chunked data. + (line 8) +* aiff() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 131) +* AIFF-C: aifc — Read and write AIFF and AIFC files. + (line 8) +* AIFF-C <1>: chunk — Read IFF chunked data. + (line 8) +* alarm() (in module signal): Module contents<2>. (line 264) +* alaw2lin() (in module audioop): audioop — Manipulate raw audio data. + (line 48) +* AlertDescription (class in ssl): Constants<9>. (line 511) +* ALERT_DESCRIPTION_HANDSHAKE_FAILURE (in module ssl): Constants<9>. + (line 497) +* ALERT_DESCRIPTION_INTERNAL_ERROR (in module ssl): Constants<9>. + (line 497) +* algorithms_available (in module hashlib): Hash algorithms. (line 89) +* algorithms_guaranteed (in module hashlib): Hash algorithms. + (line 80) +* alias (class in ast): Imports. (line 40) +* alias (pdb command): Debugger Commands. (line 288) +* alignment() (in module ctypes): Utility functions. (line 14) +* alive (weakref.finalize attribute): weakref — Weak references. + (line 280) +* allocate_lock() (in module _thread): _thread — Low-level threading API. + (line 80) +* allocfunc (C type): Slot Type typedefs. (line 6) +* allowed_domains() (http.cookiejar.DefaultCookiePolicy method): DefaultCookiePolicy Objects. + (line 65) +* allow_reuse_address (socketserver.BaseServer attribute): Server Objects<2>. + (line 92) +* all_errors (in module ftplib): ftplib — FTP protocol client. + (line 157) +* all_features (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 95) +* all_frames (tracemalloc.Filter attribute): Filter. (line 58) +* all_properties (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 127) +* all_suffixes() (in module importlib.machinery): importlib machinery – Importers and path hooks. + (line 57) +* all_tasks() (in module asyncio): Introspection. (line 16) +* alt() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 218) +* altsep (in module os): Miscellaneous System Information. + (line 104) +* altzone (in module time): Timezone Constants. (line 6) +* ALT_DIGITS (in module locale): locale — Internationalization services. + (line 296) +* ALWAYS_EQ (in module test.support): test support — Utilities for the Python test suite. + (line 168) +* ALWAYS_TYPED_ACTIONS (optparse.Option attribute): Adding new actions. + (line 43) +* AMPER (in module token): token — Constants used with Python parse trees. + (line 102) +* AMPEREQUAL (in module token): token — Constants used with Python parse trees. + (line 190) +* And (class in ast): Expressions<2>. (line 87) +* and_() (in module operator): operator — Standard operators as functions. + (line 83) +* AnnAssign (class in ast): Statements. (line 43) +* Annotated (in module typing): Special forms. (line 313) +* annotated; assignment: Annotated assignment statements. + (line 6) +* annotation: Glossary. (line 47) +* annotation (inspect.Parameter attribute): Introspecting callables with the Signature object. + (line 196) +* annotation; type annotation; type hint: Type Annotation Types — Generic Alias Union. + (line 6) +* announce() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 500) +* anonymous; function: Lambdas. (line 6) +* answer_challenge() (in module multiprocessing.connection): Listeners and Clients. + (line 25) +* anticipate_failure() (in module test.support): test support — Utilities for the Python test suite. + (line 428) +* Any (in module typing): Special types. (line 8) +* ANY (in module unittest.mock): ANY. (line 6) +* AnyStr (in module typing): Building generic types. + (line 343) +* apilevel (in module sqlite3): Module constants. (line 53) +* api_version (in module sys): sys — System-specific parameters and functions. + (line 1811) +* apop() (poplib.POP3 method): POP3 Objects. (line 41) +* APPDATA: PEP 370 Per-user site-packages Directory. + (line 26) +* append() (array.array method): array — Efficient arrays of numeric values. + (line 113) +* append() (collections.deque method): deque objects. (line 35) +* append() (email.header.Header method): email header Internationalized headers. + (line 96) +* append() (imaplib.IMAP4 method): IMAP4 Objects. (line 33) +* append() (msilib.CAB method): CAB Objects. (line 15) +* append() (pipes.Template method): Template Objects. (line 22) +* append() (sequence method): Mutable Sequence Types. + (line 16) +* append() (xml.etree.ElementTree.Element method): Element Objects. + (line 87) +* appendChild() (xml.dom.Node method): Node Objects. (line 115) +* appendleft() (collections.deque method): deque objects. (line 39) +* append_history_file() (in module readline): History file. (line 20) +* application_uri() (in module wsgiref.util): wsgiref util – WSGI environment utilities. + (line 34) +* apply (2to3 fixer): Fixers. (line 10) +* apply() (multiprocessing.pool.Pool method): Process Pools. (line 63) +* apply_async() (multiprocessing.pool.Pool method): Process Pools. + (line 71) +* apply_defaults() (inspect.BoundArguments method): Introspecting callables with the Signature object. + (line 336) +* architecture() (in module platform): Cross Platform. (line 6) +* archive (zipimport.zipimporter attribute): zipimporter Objects. + (line 112) +* aRepr (in module reprlib): reprlib — Alternate repr implementation. + (line 24) +* arg (class in ast): Function and class definitions. + (line 69) +* args (BaseException attribute): Base classes. (line 17) +* args (functools.partial attribute): partial Objects. (line 15) +* args (inspect.BoundArguments attribute): Introspecting callables with the Signature object. + (line 322) +* args (pdb command): Debugger Commands. (line 234) +* args (subprocess.CompletedProcess attribute): Using the subprocess Module. + (line 92) +* args (subprocess.Popen attribute): Popen Objects. (line 99) +* args (typing.ParamSpec attribute): Building generic types. + (line 290) +* args_from_interpreter_flags() (in module test.support): test support — Utilities for the Python test suite. + (line 295) +* argtypes (ctypes._FuncPtr attribute): Foreign functions. (line 36) +* argument: Glossary. (line 63) +* argument; call semantics: Slicings. (line 38) +* argument; difference from parameter: How can I pass optional or keyword parameters from one function to another?. + (line 17) +* argument; function definition: Function definitions. + (line 56) +* ArgumentDefaultsHelpFormatter (class in argparse): formatter_class. + (line 10) +* ArgumentError: Foreign functions. (line 83) +* ArgumentParser (class in argparse): ArgumentParser objects. + (line 6) +* arguments (class in ast): Function and class definitions. + (line 50) +* arguments (inspect.BoundArguments attribute): Introspecting callables with the Signature object. + (line 303) +* argv (in module sys): sys — System-specific parameters and functions. + (line 56) +* argv (in module sys) <1>: Process-wide parameters. + (line 271) +* arithmetic: Numeric Types — int float complex. + (line 27) +* arithmetic; conversion: Arithmetic conversions. + (line 6) +* ArithmeticError: Base classes. (line 66) +* array (class in array): array — Efficient arrays of numeric values. + (line 75) +* Array (class in ctypes): Arrays and pointers. + (line 6) +* Array() (in module multiprocessing): Shared ctypes Objects. + (line 42) +* Array() (in module multiprocessing.sharedctypes): The multiprocessing sharedctypes module. + (line 51) +* Array() (multiprocessing.managers.SyncManager method): Managers. + (line 213) +* arrays: array — Efficient arrays of numeric values. + (line 6) +* arraysize (sqlite3.Cursor attribute): Cursor objects. (line 127) +* article() (nntplib.NNTP method): Methods<3>. (line 241) +* AS pattern, OR pattern, capture pattern, wildcard pattern: Patterns. + (line 6) +* as; except clause: except clause. (line 30) +* as; import statement: The import statement. + (line 38) +* as; with statement: The with statement. (line 6) +* ASCII: Notation. (line 31) +* ASCII <1>: Literals. (line 8) +* ASCII (in module re): Flags. (line 16) +* ascii() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 209) +* ascii_letters (in module string): String constants. (line 8) +* ascii_lowercase (in module string): String constants. (line 14) +* ascii_uppercase (in module string): String constants. (line 19) +* asctime() (in module time): Functions<4>. (line 6) +* asdict() (in module dataclasses): Module contents<4>. (line 312) +* asend() (agen method): Asynchronous generator-iterator methods. + (line 28) +* asin() (in module cmath): Trigonometric functions<2>. + (line 13) +* asin() (in module math): Trigonometric functions. + (line 11) +* asinh() (in module cmath): Hyperbolic functions<2>. + (line 12) +* asinh() (in module math): Hyperbolic functions. + (line 13) +* askcolor() (in module tkinter.colorchooser): tkinter colorchooser — Color choosing dialog. + (line 17) +* askdirectory() (in module tkinter.filedialog): Native Load/Save Dialogs. + (line 54) +* askfloat() (in module tkinter.simpledialog): tkinter simpledialog — Standard Tkinter input dialogs. + (line 14) +* askinteger() (in module tkinter.simpledialog): tkinter simpledialog — Standard Tkinter input dialogs. + (line 14) +* askokcancel() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 38) +* askopenfile() (in module tkinter.filedialog): Native Load/Save Dialogs. + (line 31) +* askopenfilename() (in module tkinter.filedialog): Native Load/Save Dialogs. + (line 42) +* askopenfilenames() (in module tkinter.filedialog): Native Load/Save Dialogs. + (line 42) +* askopenfiles() (in module tkinter.filedialog): Native Load/Save Dialogs. + (line 31) +* askquestion() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 38) +* askretrycancel() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 38) +* asksaveasfile() (in module tkinter.filedialog): Native Load/Save Dialogs. + (line 37) +* asksaveasfilename() (in module tkinter.filedialog): Native Load/Save Dialogs. + (line 49) +* askstring() (in module tkinter.simpledialog): tkinter simpledialog — Standard Tkinter input dialogs. + (line 14) +* askyesno() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 38) +* askyesnocancel() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 38) +* Assert (class in ast): Statements. (line 130) +* assertAlmostEqual() (unittest.TestCase method): Test cases. + (line 508) +* assertCountEqual() (unittest.TestCase method): Test cases. (line 567) +* assertDictEqual() (unittest.TestCase method): Test cases. (line 676) +* assertEqual() (unittest.TestCase method): Test cases. (line 177) +* assertFalse() (unittest.TestCase method): Test cases. (line 202) +* assertGreater() (unittest.TestCase method): Test cases. (line 533) +* assertGreaterEqual() (unittest.TestCase method): Test cases. + (line 533) +* assertIn() (unittest.TestCase method): Test cases. (line 229) +* assertInBytecode() (test.support.bytecode_helper.BytecodeTestCase method): test support bytecode_helper — Support tools for testing correct bytecode generation. + (line 22) +* AssertionError: Concrete exceptions. + (line 8) +* assertIs() (unittest.TestCase method): Test cases. (line 214) +* assertIsInstance() (unittest.TestCase method): Test cases. (line 236) +* assertIsNone() (unittest.TestCase method): Test cases. (line 222) +* assertIsNot() (unittest.TestCase method): Test cases. (line 214) +* assertIsNotNone() (unittest.TestCase method): Test cases. (line 222) +* assertLess() (unittest.TestCase method): Test cases. (line 533) +* assertLessEqual() (unittest.TestCase method): Test cases. (line 533) +* assertListEqual() (unittest.TestCase method): Test cases. (line 653) +* assertLogs() (unittest.TestCase method): Test cases. (line 410) +* assertMultiLineEqual() (unittest.TestCase method): Test cases. + (line 628) +* assertNoLogs() (unittest.TestCase method): Test cases. (line 453) +* assertNotAlmostEqual() (unittest.TestCase method): Test cases. + (line 508) +* assertNotEqual() (unittest.TestCase method): Test cases. (line 197) +* assertNotIn() (unittest.TestCase method): Test cases. (line 229) +* assertNotInBytecode() (test.support.bytecode_helper.BytecodeTestCase method): test support bytecode_helper — Support tools for testing correct bytecode generation. + (line 28) +* assertNotIsInstance() (unittest.TestCase method): Test cases. + (line 236) +* assertNotRegex() (unittest.TestCase method): Test cases. (line 546) +* assertRaises() (unittest.TestCase method): Test cases. (line 276) +* assertRaisesRegex() (unittest.TestCase method): Test cases. + (line 317) +* assertRegex() (unittest.TestCase method): Test cases. (line 546) +* asserts (2to3 fixer): Fixers. (line 15) +* assertSequenceEqual() (unittest.TestCase method): Test cases. + (line 638) +* assertSetEqual() (unittest.TestCase method): Test cases. (line 664) +* assertTrue() (unittest.TestCase method): Test cases. (line 202) +* assertTupleEqual() (unittest.TestCase method): Test cases. (line 653) +* assertWarns() (unittest.TestCase method): Test cases. (line 344) +* assertWarnsRegex() (unittest.TestCase method): Test cases. (line 385) +* assert_any_await() (unittest.mock.AsyncMock method): The Mock Class. + (line 810) +* assert_any_call() (unittest.mock.Mock method): The Mock Class. + (line 148) +* assert_awaited() (unittest.mock.AsyncMock method): The Mock Class. + (line 740) +* assert_awaited_once() (unittest.mock.AsyncMock method): The Mock Class. + (line 760) +* assert_awaited_once_with() (unittest.mock.AsyncMock method): The Mock Class. + (line 793) +* assert_awaited_with() (unittest.mock.AsyncMock method): The Mock Class. + (line 776) +* assert_called() (unittest.mock.Mock method): The Mock Class. + (line 96) +* assert_called_once() (unittest.mock.Mock method): The Mock Class. + (line 107) +* assert_called_once_with() (unittest.mock.Mock method): The Mock Class. + (line 134) +* assert_called_with() (unittest.mock.Mock method): The Mock Class. + (line 124) +* assert_has_awaits() (unittest.mock.AsyncMock method): The Mock Class. + (line 827) +* assert_has_calls() (unittest.mock.Mock method): The Mock Class. + (line 164) +* assert_never() (in module typing): Functions and decorators. + (line 43) +* assert_not_awaited() (unittest.mock.AsyncMock method): The Mock Class. + (line 854) +* assert_not_called() (unittest.mock.Mock method): The Mock Class. + (line 185) +* assert_python_failure() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 57) +* assert_python_ok() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 40) +* assert_type() (in module typing): Functions and decorators. + (line 15) +* Assign (class in ast): Statements. (line 6) +* assignment expression: Boolean operations. (line 38) +* assignment; statement: The standard type hierarchy. + (line 197) +* assignment; statement <1>: Assignment statements. + (line 6) +* AST (class in ast): Node classes. (line 6) +* ast command line option; -a: Command-Line Usage<2>. + (line 29) +* ast command line option; -h: Command-Line Usage<2>. + (line 15) +* ast command line option; –help: Command-Line Usage<2>. + (line 15) +* ast command line option; -i: Command-Line Usage<2>. + (line 33) +* ast command line option; –include-attributes: Command-Line Usage<2>. + (line 29) +* ast command line option; –indent: Command-Line Usage<2>. + (line 33) +* ast command line option; -m: Command-Line Usage<2>. + (line 19) +* ast command line option; –mode: Command-Line Usage<2>. + (line 19) +* ast command line option; –no-type-comments: Command-Line Usage<2>. + (line 25) +* astimezone() (datetime.datetime method): datetime Objects. (line 434) +* astuple() (in module dataclasses): Module contents<4>. (line 344) +* ASYNC (in module token): token — Constants used with Python parse trees. + (line 246) +* async for; in comprehensions: Displays for lists sets and dictionaries. + (line 14) +* AsyncContextDecorator (class in contextlib): Utilities. (line 445) +* AsyncContextManager (class in typing): Context manager types. + (line 18) +* asynccontextmanager() (in module contextlib): Utilities. (line 93) +* AsyncExitStack (class in contextlib): Utilities. (line 603) +* AsyncFor (class in ast): Async and await. (line 41) +* AsyncFunctionDef (class in ast): Async and await. (line 6) +* AsyncGenerator (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 145) +* AsyncGenerator (class in typing): Asynchronous programming. + (line 25) +* AsyncGeneratorType (in module types): Standard Interpreter Types. + (line 49) +* asynchronous context manager: Glossary. (line 96) +* asynchronous generator: Glossary. (line 102) +* asynchronous generator iterator: Glossary. (line 119) +* asynchronous generator; asynchronous iterator: The standard type hierarchy. + (line 475) +* asynchronous generator; function: The standard type hierarchy. + (line 475) +* asynchronous iterable: Glossary. (line 136) +* asynchronous iterator: Glossary. (line 142) +* asyncio.subprocess.DEVNULL (built-in variable): Constants<7>. + (line 23) +* asyncio.subprocess.PIPE (built-in variable): Constants<7>. (line 6) +* asyncio.subprocess.Process (built-in class): Interacting with Subprocesses. + (line 11) +* asyncio.subprocess.STDOUT (built-in variable): Constants<7>. + (line 17) +* AsyncIterable (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 131) +* AsyncIterable (class in typing): Asynchronous programming. + (line 63) +* AsyncIterator (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 138) +* AsyncIterator (class in typing): Asynchronous programming. + (line 73) +* AsyncMock (class in unittest.mock): The Mock Class. (line 668) +* AsyncResult (class in multiprocessing.pool): Process Pools. + (line 191) +* asyncSetUp() (unittest.IsolatedAsyncioTestCase method): Test cases. + (line 858) +* asyncTearDown() (unittest.IsolatedAsyncioTestCase method): Test cases. + (line 867) +* AsyncWith (class in ast): Async and await. (line 41) +* async_chat (class in asynchat): asynchat — Asynchronous socket command/response handler. + (line 35) +* async_chat.ac_in_buffer_size (in module asynchat): asynchat — Asynchronous socket command/response handler. + (line 54) +* async_chat.ac_out_buffer_size (in module asynchat): asynchat — Asynchronous socket command/response handler. + (line 58) +* ASYNC_GEN_WRAP (opcode): Python Bytecode Instructions. + (line 971) +* as_bytes() (email.message.EmailMessage method): email message Representing an email message. + (line 107) +* as_bytes() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 106) +* as_completed() (in module asyncio): Waiting Primitives. (line 57) +* as_completed() (in module concurrent.futures): Module Functions. + (line 44) +* as_file() (in module importlib.resources): importlib resources – Resources. + (line 57) +* as_integer_ratio() (decimal.Decimal method): Decimal objects. + (line 122) +* as_integer_ratio() (float method): Additional Methods on Float. + (line 9) +* as_integer_ratio() (fractions.Fraction method): fractions — Rational numbers. + (line 111) +* as_integer_ratio() (int method): Additional Methods on Integer Types. + (line 161) +* as_posix() (pathlib.PurePath method): Methods and properties. + (line 163) +* as_string() (email.message.EmailMessage method): email message Representing an email message. + (line 61) +* as_string() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 60) +* as_tuple() (decimal.Decimal method): Decimal objects. (line 136) +* as_uri() (pathlib.PurePath method): Methods and properties. + (line 174) +* AT (in module token): token — Constants used with Python parse trees. + (line 222) +* atan() (in module cmath): Trigonometric functions<2>. + (line 18) +* atan() (in module math): Trigonometric functions. + (line 16) +* atan2() (in module math): Trigonometric functions. + (line 21) +* atanh() (in module cmath): Hyperbolic functions<2>. + (line 19) +* atanh() (in module math): Hyperbolic functions. + (line 17) +* ATEQUAL (in module token): token — Constants used with Python parse trees. + (line 226) +* atexit (weakref.finalize attribute): weakref — Weak references. + (line 285) +* athrow() (agen method): Asynchronous generator-iterator methods. + (line 43) +* atof() (in module locale): locale — Internationalization services. + (line 485) +* atoi() (in module locale): locale — Internationalization services. + (line 491) +* atom: Atoms. (line 6) +* attach() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 167) +* attach_loop() (asyncio.AbstractChildWatcher method): Process Watchers. + (line 59) +* attach_mock() (unittest.mock.Mock method): The Mock Class. (line 236) +* AttlistDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 208) +* attrgetter() (in module operator): operator — Standard operators as functions. + (line 234) +* attrib (xml.etree.ElementTree.Element attribute): Element Objects. + (line 45) +* attribute: The standard type hierarchy. + (line 13) +* attribute <1>: Glossary. (line 151) +* Attribute (class in ast): Expressions<2>. (line 171) +* attribute; assignment: Assignment statements. + (line 6) +* attribute; assignment <1>: Assignment statements. + (line 76) +* attribute; deletion: The del statement<2>. + (line 20) +* attribute; reference: Attribute references. + (line 6) +* AttributeError: Concrete exceptions. + (line 12) +* attributes (xml.dom.Node attribute): Node Objects. (line 26) +* AttributesImpl (class in xml.sax.xmlreader): xml sax xmlreader — Interface for XML parsers. + (line 69) +* AttributesNSImpl (class in xml.sax.xmlreader): xml sax xmlreader — Interface for XML parsers. + (line 80) +* attroff() (curses.window method): Window Objects. (line 53) +* attron() (curses.window method): Window Objects. (line 58) +* attrset() (curses.window method): Window Objects. (line 63) +* at_eof() (asyncio.StreamReader method): StreamReader. (line 64) +* Audio Interchange File Format: aifc — Read and write AIFF and AIFC files. + (line 8) +* Audio Interchange File Format <1>: chunk — Read IFF chunked data. + (line 8) +* AUDIODEV: ossaudiodev — Access to OSS-compatible audio devices. + (line 58) +* AUDIO_FILE_ENCODING_ADPCM_G721 (in module sunau): sunau — Read and write Sun AU files. + (line 94) +* AUDIO_FILE_ENCODING_ADPCM_G722 (in module sunau): sunau — Read and write Sun AU files. + (line 94) +* AUDIO_FILE_ENCODING_ADPCM_G723_3 (in module sunau): sunau — Read and write Sun AU files. + (line 94) +* AUDIO_FILE_ENCODING_ADPCM_G723_5 (in module sunau): sunau — Read and write Sun AU files. + (line 94) +* AUDIO_FILE_ENCODING_ALAW_8 (in module sunau): sunau — Read and write Sun AU files. + (line 84) +* AUDIO_FILE_ENCODING_DOUBLE (in module sunau): sunau — Read and write Sun AU files. + (line 94) +* AUDIO_FILE_ENCODING_FLOAT (in module sunau): sunau — Read and write Sun AU files. + (line 94) +* AUDIO_FILE_ENCODING_LINEAR_16 (in module sunau): sunau — Read and write Sun AU files. + (line 84) +* AUDIO_FILE_ENCODING_LINEAR_24 (in module sunau): sunau — Read and write Sun AU files. + (line 84) +* AUDIO_FILE_ENCODING_LINEAR_32 (in module sunau): sunau — Read and write Sun AU files. + (line 84) +* AUDIO_FILE_ENCODING_LINEAR_8 (in module sunau): sunau — Read and write Sun AU files. + (line 84) +* AUDIO_FILE_ENCODING_MULAW_8 (in module sunau): sunau — Read and write Sun AU files. + (line 84) +* AUDIO_FILE_MAGIC (in module sunau): sunau — Read and write Sun AU files. + (line 78) +* audit events: Debugging and Profiling. + (line 11) +* audit() (in module sys): sys — System-specific parameters and functions. + (line 76) +* auditing: sys — System-specific parameters and functions. + (line 78) +* AugAssign (class in ast): Statements. (line 96) +* augmented; assignment: Augmented assignment statements. + (line 6) +* auth() (ftplib.FTP_TLS method): FTP_TLS Objects. (line 14) +* auth() (smtplib.SMTP method): SMTP Objects. (line 141) +* authenticate() (imaplib.IMAP4 method): IMAP4 Objects. (line 37) +* AuthenticationError: Process and exceptions. + (line 239) +* authenticators() (netrc.netrc method): netrc Objects. (line 8) +* authkey (multiprocessing.Process attribute): Process and exceptions. + (line 141) +* auto (class in enum): Utilities and Decorators. + (line 6) +* autorange() (timeit.Timer method): Python Interface. (line 90) +* available_timezones() (in module zoneinfo): Functions<3>. (line 6) +* avg() (in module audioop): audioop — Manipulate raw audio data. + (line 54) +* avgpp() (in module audioop): audioop — Manipulate raw audio data. + (line 58) +* avoids_symlink_attacks (shutil.rmtree attribute): Directory and files operations. + (line 306) +* Await (class in ast): Async and await. (line 12) +* AWAIT (in module token): token — Constants used with Python parse trees. + (line 244) +* await; in comprehensions: Displays for lists sets and dictionaries. + (line 45) +* awaitable: Glossary. (line 163) +* Awaitable (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 95) +* Awaitable (class in typing): Asynchronous programming. + (line 83) +* await_args (unittest.mock.AsyncMock attribute): The Mock Class. + (line 883) +* await_args_list (unittest.mock.AsyncMock attribute): The Mock Class. + (line 901) +* await_count (unittest.mock.AsyncMock attribute): The Mock Class. + (line 867) +* b"; bytes literal: String and Bytes literals. + (line 43) +* b’; bytes literal: String and Bytes literals. + (line 43) +* b16decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 150) +* b16encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 145) +* b2a_base64() (in module binascii): binascii — Convert between binary and ASCII. + (line 61) +* b2a_hex() (in module binascii): binascii — Convert between binary and ASCII. + (line 114) +* b2a_qp() (in module binascii): binascii — Convert between binary and ASCII. + (line 77) +* b2a_uu() (in module binascii): binascii — Convert between binary and ASCII. + (line 31) +* b32decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 106) +* b32encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 101) +* b32hexdecode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 133) +* b32hexencode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 126) +* b64decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 55) +* b64encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 43) +* b85decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 217) +* b85encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 206) +* Babyl (class in mailbox): Babyl. (line 6) +* BabylMessage (class in mailbox): BabylMessage. (line 6) +* back() (in module turtle): Turtle motion. (line 24) +* backslash character: Explicit line joining. + (line 6) +* backslashreplace; error handler’s name: Error Handlers. (line 15) +* backslashreplace_errors() (in module codecs): Error Handlers. + (line 161) +* backup() (sqlite3.Connection method): Connection objects. (line 472) +* backward() (in module turtle): Turtle motion. (line 24) +* BadGzipFile: gzip — Support for gzip files. + (line 63) +* BadStatusLine: http client — HTTP protocol client. + (line 184) +* BadZipFile: zipfile — Work with ZIP archives. + (line 24) +* BadZipfile: zipfile — Work with ZIP archives. + (line 30) +* Balloon (class in tkinter.tix): Basic Widgets. (line 6) +* Barrier (class in asyncio): Barrier. (line 6) +* Barrier (class in multiprocessing): Synchronization primitives. + (line 13) +* Barrier (class in threading): Barrier Objects. (line 36) +* Barrier() (multiprocessing.managers.SyncManager method): Managers. + (line 160) +* base64; encoding: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 8) +* BaseCGIHandler (class in wsgiref.handlers): wsgiref handlers – server/gateway base classes. + (line 53) +* BaseCookie (class in http.cookies): http cookies — HTTP state management. + (line 38) +* BaseException: Base classes. (line 9) +* BaseExceptionGroup: Exception groups. (line 14) +* BaseHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 275) +* BaseHandler (class in wsgiref.handlers): wsgiref handlers – server/gateway base classes. + (line 88) +* BaseHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 37) +* BaseHTTPRequestHandler (class in http.server): http server — HTTP servers. + (line 51) +* BaseManager (class in multiprocessing.managers): Managers. (line 23) +* basename() (in module os.path): os path — Common pathname manipulations. + (line 57) +* BaseProtocol (class in asyncio): Base Protocols. (line 6) +* BaseProxy (class in multiprocessing.managers): Proxy Objects. + (line 92) +* BaseRequestHandler (class in socketserver): Request Handler Objects. + (line 6) +* BaseRotatingHandler (class in logging.handlers): BaseRotatingHandler. + (line 12) +* BaseSelector (class in selectors): Classes<3>. (line 53) +* BaseServer (class in socketserver): Server Objects<2>. (line 6) +* basestring (2to3 fixer): Fixers. (line 60) +* BaseTransport (class in asyncio): Transports Hierarchy. + (line 6) +* base_exec_prefix (in module sys): sys — System-specific parameters and functions. + (line 107) +* base_prefix (in module sys): sys — System-specific parameters and functions. + (line 121) +* basicConfig() (in module logging): Module-Level Functions. + (line 246) +* BasicContext (class in decimal): Context objects. (line 65) +* BasicInterpolation (class in configparser): Interpolation of values. + (line 10) +* BasicTestRunner (class in test.support): test support — Utilities for the Python test suite. + (line 757) +* baudrate() (in module curses): Functions<5>. (line 18) +* bbox() (tkinter.ttk.Treeview method): ttk Treeview. (line 8) +* BDADDR_ANY (in module socket): Constants<8>. (line 247) +* BDADDR_LOCAL (in module socket): Constants<8>. (line 247) +* Bdb (class in bdb): bdb — Debugger framework. + (line 129) +* BdbQuit: bdb — Debugger framework. + (line 15) +* BDFL: Glossary. (line 169) +* beep() (in module curses): Functions<5>. (line 26) +* Beep() (in module winsound): winsound — Sound-playing interface for Windows. + (line 12) +* BEFORE_ASYNC_WITH (opcode): Python Bytecode Instructions. + (line 230) +* BEFORE_WITH (opcode): Python Bytecode Instructions. + (line 376) +* begin_fill() (in module turtle): Filling. (line 16) +* begin_poly() (in module turtle): Special Turtle methods. + (line 6) +* below() (curses.panel.Panel method): Panel Objects. (line 17) +* BELOW_NORMAL_PRIORITY_CLASS (in module subprocess): Windows Constants. + (line 59) +* benchmarking: Functions<4>. (line 199) +* benchmarking <1>: Functions<4>. (line 223) +* benchmarking <2>: Functions<4>. (line 536) +* Benchmarking: timeit — Measure execution time of small code snippets. + (line 8) +* betavariate() (in module random): Real-valued distributions. + (line 33) +* bgcolor() (in module turtle): Window control. (line 6) +* bgpic() (in module turtle): Window control. (line 21) +* bias() (in module audioop): audioop — Manipulate raw audio data. + (line 64) +* bidirectional() (in module unicodedata): unicodedata — Unicode Database. + (line 54) +* bigaddrspacetest() (in module test.support): test support — Utilities for the Python test suite. + (line 533) +* BigEndianStructure (class in ctypes): Structured data types. + (line 22) +* BigEndianUnion (class in ctypes): Structured data types. + (line 10) +* bigmemtest() (in module test.support): test support — Utilities for the Python test suite. + (line 517) +* Binary (class in msilib): msilib — Read and write Microsoft Installer files. + (line 91) +* Binary (class in xmlrpc.client): Binary Objects. (line 6) +* binary file: Glossary. (line 174) +* binary literal: Numeric literals. (line 6) +* binary mode: Built-in Functions. (line 1307) +* binary semaphores: _thread — Low-level threading API. + (line 6) +* binary; arithmetic; operation: Binary arithmetic operations. + (line 6) +* binary; bitwise; operation: Binary bitwise operations. + (line 6) +* binary; literals: Numeric Types — int float complex. + (line 19) +* binaryfunc (C type): Slot Type typedefs. (line 109) +* BinaryIO (class in typing): Other concrete types. + (line 6) +* BINARY_OP (opcode): Python Bytecode Instructions. + (line 161) +* BINARY_SUBSCR (opcode): Python Bytecode Instructions. + (line 168) +* bind (widgets): Bindings and Events. + (line 6) +* bind() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 229) +* bind() (inspect.Signature method): Introspecting callables with the Signature object. + (line 112) +* bind() (socket.socket method): Socket Objects. (line 30) +* binding; name: Binding of names. (line 6) +* binding; name <1>: Assignment statements. + (line 6) +* bindtextdomain() (in module gettext): GNU gettext API. (line 14) +* bindtextdomain() (in module locale): Access to message catalogs. + (line 14) +* bind_partial() (inspect.Signature method): Introspecting callables with the Signature object. + (line 119) +* bind_port() (in module test.support.socket_helper): test support socket_helper — Utilities for socket tests. + (line 37) +* bind_unix_socket() (in module test.support.socket_helper): test support socket_helper — Utilities for socket tests. + (line 54) +* BinOp (class in ast): Expressions<2>. (line 42) +* bisect() (in module bisect): bisect — Array bisection algorithm. + (line 44) +* bisect_left() (in module bisect): bisect — Array bisection algorithm. + (line 20) +* bisect_right() (in module bisect): bisect — Array bisection algorithm. + (line 44) +* BitAnd (class in ast): Expressions<2>. (line 54) +* bitmap() (msilib.Dialog method): GUI classes. (line 58) +* BitOr (class in ast): Expressions<2>. (line 54) +* bitwise; and: Binary bitwise operations. + (line 12) +* bitwise; operations: Bitwise Operations on Integer Types. + (line 6) +* bitwise; or: Binary bitwise operations. + (line 20) +* bitwise; xor: Binary bitwise operations. + (line 16) +* BitXor (class in ast): Expressions<2>. (line 54) +* bit_count() (int method): Additional Methods on Integer Types. + (line 35) +* bit_length() (int method): Additional Methods on Integer Types. + (line 9) +* bk() (in module turtle): Turtle motion. (line 24) +* bkgd() (curses.window method): Window Objects. (line 68) +* bkgdset() (curses.window method): Window Objects. (line 80) +* blake2b() (in module hashlib): Creating hash objects. + (line 8) +* blake2b, blake2s: BLAKE2. (line 6) +* blake2b.MAX_DIGEST_SIZE (in module hashlib): Constants<5>. (line 24) +* blake2b.MAX_KEY_SIZE (in module hashlib): Constants<5>. (line 18) +* blake2b.PERSON_SIZE (in module hashlib): Constants<5>. (line 12) +* blake2b.SALT_SIZE (in module hashlib): Constants<5>. (line 6) +* blake2s() (in module hashlib): Creating hash objects. + (line 13) +* blake2s.MAX_DIGEST_SIZE (in module hashlib): Constants<5>. (line 26) +* blake2s.MAX_KEY_SIZE (in module hashlib): Constants<5>. (line 20) +* blake2s.PERSON_SIZE (in module hashlib): Constants<5>. (line 14) +* blake2s.SALT_SIZE (in module hashlib): Constants<5>. (line 8) +* blank line: Blank lines. (line 6) +* Blob (class in sqlite3): Blob objects. (line 8) +* blobopen() (sqlite3.Connection method): Connection objects. + (line 30) +* block: Structure of a program. + (line 6) +* blocked_domains() (http.cookiejar.DefaultCookiePolicy method): DefaultCookiePolicy Objects. + (line 52) +* BlockingIOError: OS exceptions. (line 9) +* BlockingIOError <1>: High-level Module Interface. + (line 67) +* blocksize (http.client.HTTPConnection attribute): HTTPConnection Objects. + (line 118) +* block_size (hmac.HMAC attribute): hmac — Keyed-Hashing for Message Authentication. + (line 94) +* BNF: Notation. (line 6) +* BNF <1>: Expressions. (line 6) +* body() (nntplib.NNTP method): Methods<3>. (line 272) +* body() (tkinter.simpledialog.Dialog method): tkinter simpledialog — Standard Tkinter input dialogs. + (line 25) +* body_encode() (email.charset.Charset method): email charset Representing character sets. + (line 135) +* body_encoding (email.charset.Charset attribute): email charset Representing character sets. + (line 67) +* body_line_iterator() (in module email.iterators): email iterators Iterators. + (line 14) +* BOLD (in module tkinter.font): tkinter font — Tkinter font wrapper. + (line 15) +* BOM (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_BE (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_LE (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_UTF16 (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_UTF16_BE (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_UTF16_LE (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_UTF32 (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_UTF32_BE (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_UTF32_LE (in module codecs): codecs — Codec registry and base classes. + (line 249) +* BOM_UTF8 (in module codecs): codecs — Codec registry and base classes. + (line 249) +* bool (built-in class): Built-in Functions. (line 131) +* Boolean; operation: Boolean operations. (line 6) +* Boolean; operations: Truth Value Testing. + (line 6) +* Boolean; operations <1>: Boolean Operations — and or not. + (line 6) +* Boolean; type: Built-in Functions. (line 141) +* Boolean; values: Boolean Values. (line 15) +* BOOLEAN_STATES (configparser.ConfigParser attribute): Customizing Parser Behaviour. + (line 245) +* BoolOp (class in ast): Expressions<2>. (line 70) +* bootstrap() (in module ensurepip): Module API. (line 13) +* border() (curses.window method): Window Objects. (line 91) +* borrowed reference: Glossary. (line 185) +* bottom() (curses.panel.Panel method): Panel Objects. (line 21) +* bottom_panel() (in module curses.panel): Functions<6>. (line 8) +* BoundArguments (class in inspect): Introspecting callables with the Signature object. + (line 297) +* BoundaryError: email errors Exception and Defect classes. + (line 38) +* BoundedSemaphore (class in asyncio): BoundedSemaphore. (line 6) +* BoundedSemaphore (class in multiprocessing): Synchronization primitives. + (line 19) +* BoundedSemaphore (class in threading): Semaphore Objects. (line 73) +* BoundedSemaphore() (multiprocessing.managers.SyncManager method): Managers. + (line 167) +* box() (curses.window method): Window Objects. (line 130) +* bpbynumber (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 110) +* bpformat() (bdb.Breakpoint method): bdb — Debugger framework. + (line 56) +* bplist (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 115) +* bpprint() (bdb.Breakpoint method): bdb — Debugger framework. + (line 75) +* Break (class in ast): Control flow. (line 101) +* break (pdb command): Debugger Commands. (line 76) +* Breakpoint (class in bdb): bdb — Debugger framework. + (line 22) +* breakpointhook() (in module sys): sys — System-specific parameters and functions. + (line 206) +* breakpoints: Help menu Shell and Editor. + (line 29) +* break_anywhere() (bdb.Bdb method): bdb — Debugger framework. + (line 261) +* break_here() (bdb.Bdb method): bdb — Debugger framework. + (line 253) +* break_long_words (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 249) +* break_on_hyphens (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 259) +* broadcast_address (ipaddress.IPv4Network attribute): Network objects. + (line 91) +* broadcast_address (ipaddress.IPv6Network attribute): Network objects. + (line 311) +* broken (asyncio.Barrier attribute): Barrier. (line 103) +* broken (threading.Barrier attribute): Barrier Objects. (line 101) +* BrokenBarrierError: Barrier Objects. (line 106) +* BrokenBarrierError <1>: Barrier. (line 108) +* BrokenExecutor: Exception classes. (line 18) +* BrokenPipeError: OS exceptions. (line 38) +* BrokenProcessPool: Exception classes. (line 41) +* BrokenThreadPool: Exception classes. (line 33) +* BROWSER: webbrowser — Convenient web-browser controller. + (line 20) +* BROWSER <1>: webbrowser — Convenient web-browser controller. + (line 100) +* BsdDbShelf (class in shelve): Restrictions. (line 56) +* buf (multiprocessing.shared_memory.SharedMemory attribute): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 87) +* buffer (2to3 fixer): Fixers. (line 64) +* buffer (io.TextIOBase attribute): Text I/O<2>. (line 29) +* buffer (unittest.TestResult attribute): Loading and running tests. + (line 281) +* buffer interface; (see buffer protocol): Iterator Protocol. + (line 78) +* buffer object; (see buffer protocol): Iterator Protocol. (line 77) +* buffer protocol: Iterator Protocol. (line 78) +* buffer protocol; binary sequence types: printf-style String Formatting. + (line 189) +* buffer protocol; str (built-in class): Text Sequence Type — str. + (line 60) +* buffer size, I/O: Built-in Functions. (line 1307) +* BufferedIOBase (class in io): I/O Base Classes. (line 225) +* BufferedProtocol (class in asyncio): Base Protocols. (line 15) +* BufferedRandom (class in io): Buffered Streams. (line 138) +* BufferedReader (class in io): Buffered Streams. (line 56) +* BufferedRWPair (class in io): Buffered Streams. (line 152) +* BufferedWriter (class in io): Buffered Streams. (line 97) +* BufferError: Base classes. (line 72) +* BufferingFormatter (class in logging): Formatter Objects. (line 138) +* BufferingHandler (class in logging.handlers): MemoryHandler. + (line 19) +* BufferTooShort: Process and exceptions. + (line 231) +* buffer_info() (array.array method): array — Efficient arrays of numeric values. + (line 117) +* buffer_size (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 84) +* buffer_text (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 91) +* buffer_updated() (asyncio.BufferedProtocol method): Buffered Streaming Protocols. + (line 33) +* buffer_used (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 100) +* bufsize() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 214) +* BUILD_CONST_KEY_MAP (opcode): Python Bytecode Instructions. + (line 498) +* BUILD_LIST (opcode): Python Bytecode Instructions. + (line 480) +* BUILD_MAP (opcode): Python Bytecode Instructions. + (line 488) +* build_opener() (in module urllib.request): urllib request — Extensible library for opening URLs. + (line 128) +* build_py (class in distutils.command.build_py): distutils command build_py — Build the py/ pyc files of a package. + (line 6) +* build_py_2to3 (class in distutils.command.build_py): distutils command build_py — Build the py/ pyc files of a package. + (line 8) +* BUILD_SET (opcode): Python Bytecode Instructions. + (line 484) +* BUILD_SLICE (opcode): Python Bytecode Instructions. + (line 884) +* BUILD_STRING (opcode): Python Bytecode Instructions. + (line 507) +* BUILD_TUPLE (opcode): Python Bytecode Instructions. + (line 475) +* built-in function; abs: Emulating numeric types. + (line 111) +* built-in function; abs <1>: Number Protocol. (line 100) +* built-in function; abs(): Built-in Functions. (line 43) +* built-in function; aiter(): Built-in Functions. (line 50) +* built-in function; all(): Built-in Functions. (line 60) +* built-in function; anext(): Built-in Functions. (line 71) +* built-in function; any(): Built-in Functions. (line 90) +* built-in function; ascii: Object Protocol. (line 195) +* built-in function; ascii(): Built-in Functions. (line 101) +* built-in function; bin(): Built-in Functions. (line 109) +* built-in function; breakpoint(): Built-in Functions. (line 143) +* built-in function; bytes: Basic customization. + (line 145) +* built-in function; bytes <1>: Object Protocol. (line 218) +* built-in function; call: Calls. (line 141) +* built-in function; callable(): Built-in Functions. (line 219) +* built-in function; chr: The standard type hierarchy. + (line 161) +* built-in function; chr(): Built-in Functions. (line 231) +* built-in function; classmethod: Implementing functions and methods. + (line 187) +* built-in function; classmethod(): Built-in Functions. (line 242) +* built-in function; compile: The global statement. + (line 28) +* built-in function; compile <1>: Code Objects. (line 6) +* built-in function; compile <2>: Standard Interpreter Types. + (line 58) +* built-in function; compile <3>: Importing Modules<2>. + (line 127) +* built-in function; compile(): Built-in Functions. (line 278) +* built-in function; complex: Emulating numeric types. + (line 118) +* built-in function; complex <1>: Numeric Types — int float complex. + (line 27) +* built-in function; create_shortcut(): The Postinstallation script. + (line 62) +* built-in function; delattr(): Built-in Functions. (line 390) +* built-in function; dir(): Built-in Functions. (line 413) +* built-in function; directory_created(): The Postinstallation script. + (line 23) +* built-in function; divmod: Emulating numeric types. + (line 26) +* built-in function; divmod <1>: Emulating numeric types. + (line 56) +* built-in function; divmod <2>: Number Protocol. (line 71) +* built-in function; divmod(): Built-in Functions. (line 473) +* built-in function; enumerate(): Built-in Functions. (line 485) +* built-in function; eval: The global statement. + (line 28) +* built-in function; eval <1>: Expression input. (line 6) +* built-in function; eval <2>: Code Objects. (line 17) +* built-in function; eval <3>: pprint — Data pretty printer. + (line 153) +* built-in function; eval <4>: PrettyPrinter Objects. + (line 26) +* built-in function; eval(): Built-in Functions. (line 507) +* built-in function; exec: The global statement. + (line 28) +* built-in function; exec <1>: Built-in Functions. (line 557) +* built-in function; exec <2>: Code Objects. (line 17) +* built-in function; exec(): Built-in Functions. (line 557) +* built-in function; file_created(): The Postinstallation script. + (line 23) +* built-in function; filter(): Built-in Functions. (line 611) +* built-in function; float: Emulating numeric types. + (line 118) +* built-in function; float <1>: Numeric Types — int float complex. + (line 27) +* built-in function; float <2>: Number Protocol. (line 266) +* built-in function; format(): Built-in Functions. (line 689) +* built-in function; getattr(): Built-in Functions. (line 722) +* built-in function; get_special_folder_path(): The Postinstallation script. + (line 32) +* built-in function; globals(): Built-in Functions. (line 739) +* built-in function; hasattr(): Built-in Functions. (line 745) +* built-in function; hash: Basic customization. + (line 222) +* built-in function; hash <1>: Immutable Sequence Types. + (line 6) +* built-in function; hash <2>: Object Protocol. (line 268) +* built-in function; hash <3>: PyTypeObject Slots. (line 314) +* built-in function; hash(): Built-in Functions. (line 752) +* built-in function; help: Operating System Interface. + (line 20) +* built-in function; help(): Built-in Functions. (line 764) +* built-in function; hex(): Built-in Functions. (line 788) +* built-in function; id: Objects values and types. + (line 11) +* built-in function; id(): Built-in Functions. (line 819) +* built-in function; input(): Built-in Functions. (line 832) +* built-in function; int: Emulating numeric types. + (line 118) +* built-in function; int <1>: Numeric Types — int float complex. + (line 27) +* built-in function; int <2>: Number Protocol. (line 258) +* built-in function; isinstance(): Built-in Functions. (line 910) +* built-in function; issubclass(): Built-in Functions. (line 926) +* built-in function; iter(): Built-in Functions. (line 939) +* built-in function; len: The standard type hierarchy. + (line 132) +* built-in function; len <1>: The standard type hierarchy. + (line 224) +* built-in function; len <2>: The standard type hierarchy. + (line 254) +* built-in function; len <3>: Emulating container types. + (line 40) +* built-in function; len <4>: Common Sequence Operations. + (line 21) +* built-in function; len <5>: Mapping Types — dict. + (line 6) +* built-in function; len <6>: Object Protocol. (line 316) +* built-in function; len <7>: Sequence Protocol. (line 16) +* built-in function; len <8>: Mapping Protocol. (line 19) +* built-in function; len <9>: List Objects. (line 38) +* built-in function; len <10>: Dictionary Objects. (line 145) +* built-in function; len <11>: Set Objects. (line 99) +* built-in function; len(): Built-in Functions. (line 968) +* built-in function; locals(): Built-in Functions. (line 986) +* built-in function; map(): Built-in Functions. (line 998) +* built-in function; max: Common Sequence Operations. + (line 21) +* built-in function; max(): Built-in Functions. (line 1008) +* built-in function; min: Common Sequence Operations. + (line 21) +* built-in function; min(): Built-in Functions. (line 1042) +* built-in function; multiprocessing.Manager(): Managers. (line 12) +* built-in function; next(): Built-in Functions. (line 1071) +* built-in function; oct(): Built-in Functions. (line 1090) +* built-in function; open: Reading and Writing Files. + (line 6) +* built-in function; open <1>: The standard type hierarchy. + (line 675) +* built-in function; open(): Built-in Functions. (line 1115) +* built-in function; ord: The standard type hierarchy. + (line 161) +* built-in function; ord(): Built-in Functions. (line 1352) +* built-in function; pow: Emulating numeric types. + (line 26) +* built-in function; pow <1>: Emulating numeric types. + (line 26) +* built-in function; pow <2>: Emulating numeric types. + (line 56) +* built-in function; pow <3>: Emulating numeric types. + (line 67) +* built-in function; pow <4>: Number Protocol. (line 80) +* built-in function; pow <5>: Number Protocol. (line 206) +* built-in function; pow(): Built-in Functions. (line 1359) +* built-in function; print: Basic customization. + (line 149) +* built-in function; print(): Built-in Functions. (line 1397) +* built-in function; range: The for statement. (line 37) +* built-in function; repr: Expression statements. + (line 17) +* built-in function; repr <1>: Finalization and De-allocation. + (line 90) +* built-in function; repr <2>: Object Protocol. (line 182) +* built-in function; repr <3>: PyTypeObject Slots. (line 252) +* built-in function; repr(): Built-in Functions. (line 1509) +* built-in function; reversed(): Built-in Functions. (line 1522) +* built-in function; round: Emulating numeric types. + (line 141) +* built-in function; round(): Built-in Functions. (line 1529) +* built-in function; setattr(): Built-in Functions. (line 1568) +* built-in function; slice: The standard type hierarchy. + (line 892) +* built-in function; slice <1>: Python Bytecode Instructions. + (line 886) +* built-in function; sorted(): Built-in Functions. (line 1605) +* built-in function; staticmethod: Implementing functions and methods. + (line 194) +* built-in function; staticmethod(): Built-in Functions. (line 1641) +* built-in function; sum(): Built-in Functions. (line 1694) +* built-in function; tuple: Sequence Protocol. (line 120) +* built-in function; tuple <1>: List Objects. (line 126) +* built-in function; type: Objects values and types. + (line 11) +* built-in function; type <1>: Metaclasses. (line 6) +* built-in function; type <2>: Type Objects. (line 6) +* built-in function; type <3>: Object Protocol. (line 298) +* built-in function; vars(): Built-in Functions. (line 1834) +* built-in function; xml.etree.ElementInclude.default_loader(): Functions<9>. + (line 6) +* built-in function; xml.etree.ElementInclude.include(): Functions<9>. + (line 17) +* built-in function; zip(): Built-in Functions. (line 1857) +* built-in function; __import__: Importing Modules<2>. + (line 41) +* built-in function; __import__(): Built-in Functions. (line 1950) +* built-in method; call: Calls. (line 141) +* built-in; method: The standard type hierarchy. + (line 506) +* built-in; types: Built-in Types. (line 9) +* BuiltinFunctionType (in module types): Standard Interpreter Types. + (line 87) +* BuiltinImporter (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 67) +* BuiltinMethodType (in module types): Standard Interpreter Types. + (line 87) +* builtin_module_names (in module sys): sys — System-specific parameters and functions. + (line 142) +* ButtonBox (class in tkinter.tix): Basic Widgets. (line 13) +* buttonbox() (tkinter.simpledialog.Dialog method): tkinter simpledialog — Standard Tkinter input dialogs. + (line 30) +* bye() (in module turtle): Methods specific to Screen not inherited from TurtleScreen. + (line 6) +* byref() (in module ctypes): Utility functions. (line 19) +* byte: The standard type hierarchy. + (line 188) +* bytearray: The standard type hierarchy. + (line 212) +* bytearray (built-in class): Bytearray Objects. (line 9) +* bytearray; formatting: printf-style Bytes Formatting. + (line 6) +* bytearray; interpolation: printf-style Bytes Formatting. + (line 6) +* bytearray; methods: Bytes and Bytearray Operations. + (line 6) +* bytecode: The standard type hierarchy. + (line 694) +* bytecode <1>: Glossary. (line 219) +* Bytecode (class in dis): Bytecode analysis. (line 12) +* Bytecode.codeobj (in module dis): Bytecode analysis. (line 40) +* Bytecode.first_line (in module dis): Bytecode analysis. (line 44) +* BytecodeTestCase (class in test.support.bytecode_helper): test support bytecode_helper — Support tools for testing correct bytecode generation. + (line 13) +* BYTECODE_SUFFIXES (in module importlib.machinery): importlib machinery – Importers and path hooks. + (line 40) +* byteorder (in module sys): sys — System-specific parameters and functions. + (line 135) +* bytes: The standard type hierarchy. + (line 188) +* bytes (built-in class): Bytes Objects. (line 12) +* bytes (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 86) +* bytes literal: Literals. (line 8) +* bytes-like object: Glossary. (line 200) +* bytes; formatting: printf-style Bytes Formatting. + (line 6) +* bytes; interpolation: printf-style Bytes Formatting. + (line 6) +* bytes; methods: Bytes and Bytearray Operations. + (line 6) +* bytes; str (built-in class): Text Sequence Type — str. + (line 60) +* BytesFeedParser (class in email.parser): FeedParser API. (line 28) +* BytesGenerator (class in email.generator): email generator Generating MIME documents. + (line 43) +* BytesHeaderParser (class in email.parser): Parser API. (line 67) +* BytesIO (class in io): Buffered Streams. (line 9) +* BytesParser (class in email.parser): Parser API. (line 17) +* ByteString (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 60) +* ByteString (class in typing): Corresponding to collections in collections abc. + (line 13) +* byteswap() (array.array method): array — Efficient arrays of numeric values. + (line 136) +* byteswap() (in module audioop): audioop — Manipulate raw audio data. + (line 69) +* BytesWarning: Warnings. (line 76) +* bytes_le (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 91) +* byte_compile() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 147) +* BZ2Compressor (class in bz2): Incremental de compression. + (line 6) +* BZ2Decompressor (class in bz2): Incremental de compression. + (line 33) +* BZ2File (class in bz2): De compression of files. + (line 40) +* C: String and Bytes literals. + (line 72) +* C-contiguous: shape strides suboffsets. + (line 26) +* C-contiguous <1>: Glossary. (line 295) +* C14NWriterTarget (class in xml.etree.ElementTree): TreeBuilder Objects. + (line 93) +* C; language: The standard type hierarchy. + (line 6) +* C; language <1>: The standard type hierarchy. + (line 112) +* C; language <2>: The standard type hierarchy. + (line 493) +* C; language <3>: Comparisons. (line 6) +* C; language <4>: Numeric Types — int float complex. + (line 6) +* C; language <5>: Numeric Types — int float complex. + (line 104) +* C; structures: struct — Interpret bytes as packed binary data. + (line 8) +* CAB (class in msilib): CAB Objects. (line 6) +* CACHE (opcode): Python Bytecode Instructions. + (line 100) +* cache() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 16) +* cached (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 430) +* cached_property() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 41) +* CacheFTPHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 433) +* cache_from_source() (in module imp): imp — Access the import internals. + (line 205) +* cache_from_source() (in module importlib.util): importlib util – Utility code for importers. + (line 21) +* calcobjsize() (in module test.support): test support — Utilities for the Python test suite. + (line 411) +* calcsize() (in module struct): Functions and Exceptions. + (line 55) +* calcvobjsize() (in module test.support): test support — Utilities for the Python test suite. + (line 417) +* Calendar (class in calendar): calendar — General calendar-related functions. + (line 27) +* calendar() (in module calendar): calendar — General calendar-related functions. + (line 346) +* call: Slicings. (line 38) +* Call (class in ast): Expressions<2>. (line 122) +* CALL (opcode): Python Bytecode Instructions. + (line 778) +* call() (in module operator): operator — Standard operators as functions. + (line 221) +* call() (in module subprocess): Older high-level API. + (line 10) +* call() (in module unittest.mock): call. (line 6) +* call; instance: Emulating callable objects. + (line 8) +* callable: Glossary. (line 234) +* Callable (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 18) +* Callable (in module typing): Special forms. (line 86) +* CallableProxyType (in module weakref): weakref — Weak references. + (line 308) +* callback: Glossary. (line 245) +* callback (optparse.Option attribute): Option attributes. (line 60) +* callback() (contextlib.ExitStack method): Utilities. (line 564) +* callbacks (in module gc): gc — Garbage Collector interface. + (line 248) +* callback_args (optparse.Option attribute): Option attributes. + (line 66) +* callback_kwargs (optparse.Option attribute): Option attributes. + (line 66) +* called (unittest.mock.Mock attribute): The Mock Class. (line 297) +* CalledProcessError: Using the subprocess Module. + (line 192) +* calloc(): Overview<4>. (line 33) +* call_args (unittest.mock.Mock attribute): The Mock Class. (line 416) +* call_args_list (unittest.mock.Mock attribute): The Mock Class. + (line 460) +* call_at() (asyncio.loop method): Scheduling delayed callbacks. + (line 37) +* call_count (unittest.mock.Mock attribute): The Mock Class. (line 309) +* call_exception_handler() (asyncio.loop method): Error Handling API. + (line 37) +* CALL_FUNCTION_EX (opcode): Python Bytecode Instructions. + (line 812) +* call_later() (asyncio.loop method): Scheduling delayed callbacks. + (line 10) +* call_list() (unittest.mock.call method): call. (line 20) +* call_soon() (asyncio.loop method): Scheduling callbacks. + (line 6) +* call_soon_threadsafe() (asyncio.loop method): Scheduling callbacks. + (line 23) +* call_tracing() (in module sys): sys — System-specific parameters and functions. + (line 151) +* cancel() (asyncio.Future method): Future Object. (line 113) +* cancel() (asyncio.Handle method): Callback Handles. (line 11) +* cancel() (asyncio.Task method): Task Object. (line 171) +* cancel() (concurrent.futures.Future method): Future Objects. + (line 16) +* cancel() (sched.scheduler method): Scheduler Objects. (line 41) +* cancel() (threading.Timer method): Timer Objects. (line 35) +* cancel() (tkinter.dnd.DndHandler method): tkinter dnd — Drag and drop support. + (line 48) +* cancelled() (asyncio.Future method): Future Object. (line 71) +* cancelled() (asyncio.Handle method): Callback Handles. (line 16) +* cancelled() (asyncio.Task method): Task Object. (line 229) +* cancelled() (concurrent.futures.Future method): Future Objects. + (line 24) +* CancelledError: Exception classes. (line 6) +* CancelledError <1>: Exceptions<10>. (line 18) +* cancelling() (asyncio.Task method): Task Object. (line 274) +* cancel_command() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 82) +* cancel_dump_traceback_later() (in module faulthandler): Dumping the tracebacks after a timeout. + (line 29) +* cancel_join_thread() (multiprocessing.Queue method): Pipes and Queues. + (line 182) +* CannotSendHeader: http client — HTTP protocol client. + (line 176) +* CannotSendRequest: http client — HTTP protocol client. + (line 172) +* canonic() (bdb.Bdb method): bdb — Debugger framework. + (line 149) +* canonical() (decimal.Context method): Context objects. (line 256) +* canonical() (decimal.Decimal method): Decimal objects. (line 141) +* canonicalize() (in module xml.etree.ElementTree): Functions<8>. + (line 6) +* CAN_BCM (in module socket): Constants<8>. (line 116) +* can_change_color() (in module curses): Functions<5>. (line 30) +* can_fetch() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 33) +* CAN_ISOTP (in module socket): Constants<8>. (line 155) +* CAN_J1939 (in module socket): Constants<8>. (line 164) +* CAN_RAW_FD_FRAMES (in module socket): Constants<8>. (line 131) +* CAN_RAW_JOIN_FILTERS (in module socket): Constants<8>. (line 144) +* can_symlink() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 75) +* can_write_eof() (asyncio.StreamWriter method): StreamWriter. + (line 47) +* can_write_eof() (asyncio.WriteTransport method): Write-only Transports. + (line 14) +* can_xattr() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 79) +* capa() (poplib.POP3 method): POP3 Objects. (line 24) +* capitalize() (bytearray method): Bytes and Bytearray Operations. + (line 464) +* capitalize() (bytes method): Bytes and Bytearray Operations. + (line 464) +* capitalize() (str method): String Methods<2>. (line 22) +* captured_stderr() (in module test.support): test support — Utilities for the Python test suite. + (line 305) +* captured_stdin() (in module test.support): test support — Utilities for the Python test suite. + (line 305) +* captured_stdout() (in module test.support): test support — Utilities for the Python test suite. + (line 305) +* captureWarnings() (in module logging): Integration with the warnings module. + (line 9) +* capwords() (in module string): Helper functions. (line 6) +* case block: Irrefutable Case Blocks. + (line 6) +* casefold() (str method): String Methods<2>. (line 32) +* cast() (in module ctypes): Utility functions. (line 33) +* cast() (in module typing): Functions and decorators. + (line 6) +* cast() (memoryview method): Memory Views. (line 270) +* cat() (in module nis): nis — Interface to Sun’s NIS Yellow Pages. + (line 37) +* catch_threading_exception() (in module test.support.threading_helper): test support threading_helper — Utilities for threading tests. + (line 47) +* catch_unraisable_exception() (in module test.support): test support — Utilities for the Python test suite. + (line 563) +* catch_warnings (class in warnings): Available Context Managers. + (line 6) +* category() (in module unicodedata): unicodedata — Unicode Database. + (line 49) +* cbreak() (in module curses): Functions<5>. (line 35) +* cbrt() (in module math): Power and logarithmic functions. + (line 6) +* CC: New Improved and Deprecated Modules<4>. + (line 58) +* ccc() (ftplib.FTP_TLS method): FTP_TLS Objects. (line 23) +* CCompiler (class in distutils.ccompiler): distutils ccompiler — CCompiler base class. + (line 67) +* cdf() (statistics.NormalDist method): NormalDist objects. (line 80) +* CDLL (class in ctypes): Loading shared libraries. + (line 9) +* ceil() (in module math): Numeric Types — int float complex. + (line 104) +* ceil() (in module math) <1>: Number-theoretic and representation functions. + (line 6) +* CellType (in module types): Standard Interpreter Types. + (line 76) +* center() (bytearray method): Bytes and Bytearray Operations. + (line 284) +* center() (bytes method): Bytes and Bytearray Operations. + (line 284) +* center() (str method): String Methods<2>. (line 48) +* CertificateError: Exceptions<13>. (line 94) +* certificates: SSL Contexts. (line 648) +* CERT_NONE (in module ssl): Constants<9>. (line 11) +* CERT_OPTIONAL (in module ssl): Constants<9>. (line 25) +* CERT_REQUIRED (in module ssl): Constants<9>. (line 43) +* cert_store_stats() (ssl.SSLContext method): SSL Contexts. (line 79) +* cert_time_to_seconds() (in module ssl): Certificate handling. + (line 48) +* CFLAGS: New Improved and Deprecated Modules<4>. + (line 59) +* CFLAGS <1>: Compiler flags. (line 38) +* CFLAGS <2>: Compiler flags. (line 41) +* CFLAGS <3>: Compiler flags. (line 45) +* CFLAGS <4>: Compiler flags. (line 60) +* CFLAGS <5>: Linker flags. (line 18) +* CFLAGS <6>: Tweaking compiler/linker flags. + (line 66) +* CFLAGS <7>: Tweaking compiler/linker flags. + (line 67) +* CFLAGS_NODIST: Compiler flags. (line 36) +* CFLAGS_NODIST <1>: Compiler flags. (line 67) +* CFLAGS_NODIST <2>: Linker flags. (line 26) +* CFUNCTYPE() (in module ctypes): Function prototypes. + (line 15) +* cget() (tkinter.font.Font method): tkinter font — Tkinter font wrapper. + (line 51) +* CGI; debugging: Debugging CGI scripts. + (line 6) +* CGI; exceptions: cgitb — Traceback manager for CGI scripts. + (line 8) +* CGI; protocol: cgi — Common Gateway Interface support. + (line 8) +* CGI; security: Caring about security. + (line 6) +* CGI; tracebacks: cgitb — Traceback manager for CGI scripts. + (line 8) +* CGIHandler (class in wsgiref.handlers): wsgiref handlers – server/gateway base classes. + (line 11) +* CGIHTTPRequestHandler (class in http.server): http server — HTTP servers. + (line 476) +* CGIXMLRPCRequestHandler (class in xmlrpc.server): xmlrpc server — Basic XML-RPC servers. + (line 50) +* cgi_directories (http.server.CGIHTTPRequestHandler attribute): http server — HTTP servers. + (line 502) +* chain() (in module itertools): Itertool functions. (line 85) +* chaining; comparisons: Comparisons. (line 19) +* chaining; comparisons <1>: Comparisons<2>. (line 6) +* ChainMap (class in collections): ChainMap objects. (line 16) +* ChainMap (class in typing): Corresponding to types in collections. + (line 28) +* change_cwd() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 83) +* change_root() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 84) +* channels() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 133) +* CHANNEL_BINDING_TYPES (in module ssl): Constants<9>. (line 458) +* channel_class (smtpd.SMTPServer attribute): SMTPServer Objects. + (line 80) +* character: The standard type hierarchy. + (line 161) +* character <1>: Subscriptions. (line 55) +* character <2>: unicodedata — Unicode Database. + (line 6) +* CharacterDataHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 240) +* characters() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 129) +* characters_written (BlockingIOError attribute): OS exceptions. + (line 19) +* Charset (class in email.charset): email charset Representing character sets. + (line 24) +* charset() (gettext.NullTranslations method): The NullTranslations class. + (line 68) +* CHAR_MAX (in module locale): locale — Internationalization services. + (line 542) +* chdir() (in module contextlib): Utilities. (line 347) +* chdir() (in module os): Files and Directories. + (line 115) +* check (lzma.LZMADecompressor attribute): Compressing and decompressing data in memory. + (line 159) +* check() (imaplib.IMAP4 method): IMAP4 Objects. (line 58) +* check() (in module tabnanny): tabnanny — Detection of ambiguous indentation. + (line 17) +* checkbox() (msilib.Dialog method): GUI classes. (line 76) +* checkcache() (in module linecache): linecache — Random access to text lines. + (line 43) +* CHECKED_HASH (py_compile.PycInvalidationMode attribute): py_compile — Compile Python source files. + (line 109) +* checkfuncname() (in module bdb): bdb — Debugger framework. + (line 446) +* CheckList (class in tkinter.tix): Hierarchical ListBox. + (line 13) +* checksizeof() (in module test.support): test support — Utilities for the Python test suite. + (line 423) +* checksum; Cyclic Redundancy Check: zlib — Compression compatible with gzip. + (line 123) +* check_call() (in module subprocess): Older high-level API. + (line 36) +* check_disallow_instantiation() (in module test.support): test support — Utilities for the Python test suite. + (line 697) +* CHECK_EG_MATCH (opcode): Python Bytecode Instructions. + (line 329) +* check_environ() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 91) +* CHECK_EXC_MATCH (opcode): Python Bytecode Instructions. + (line 321) +* check_free_after_iterating() (in module test.support): test support — Utilities for the Python test suite. + (line 631) +* check_hostname (ssl.SSLContext attribute): SSL Contexts. (line 480) +* check_impl_detail() (in module test.support): test support — Utilities for the Python test suite. + (line 269) +* check_no_resource_warning() (in module test.support.warnings_helper): test support warnings_helper — Utilities for warnings tests. + (line 11) +* check_output() (doctest.OutputChecker method): OutputChecker objects. + (line 17) +* check_output() (in module subprocess): Older high-level API. + (line 66) +* check_returncode() (subprocess.CompletedProcess method): Using the subprocess Module. + (line 121) +* check_syntax_error() (in module test.support): test support — Utilities for the Python test suite. + (line 537) +* check_syntax_warning() (in module test.support.warnings_helper): test support warnings_helper — Utilities for warnings tests. + (line 18) +* check_unused_args() (string.Formatter method): Custom String Formatting. + (line 91) +* check_warnings() (in module test.support.warnings_helper): test support warnings_helper — Utilities for warnings tests. + (line 34) +* check__all__() (in module test.support): test support — Utilities for the Python test suite. + (line 643) +* chflags() (in module os): Files and Directories. + (line 134) +* chgat() (curses.window method): Window Objects. (line 136) +* childNodes (xml.dom.Node attribute): Node Objects. (line 49) +* ChildProcessError: OS exceptions. (line 25) +* children (pyclbr.Class attribute): Class Objects<2>. (line 31) +* children (pyclbr.Function attribute): Function Objects. (line 31) +* children (tkinter.Tk attribute): Tkinter Modules. (line 88) +* chmod() (in module os): Files and Directories. + (line 175) +* chmod() (pathlib.Path method): Methods<2>. (line 54) +* choice() (in module random): Functions for sequences. + (line 6) +* choice() (in module secrets): Random numbers. (line 15) +* choices (optparse.Option attribute): Option attributes. (line 55) +* choices() (in module random): Functions for sequences. + (line 11) +* Chooser (class in tkinter.colorchooser): tkinter colorchooser — Color choosing dialog. + (line 15) +* chown() (in module os): Files and Directories. + (line 240) +* chown() (in module shutil): Directory and files operations. + (line 370) +* chroot() (in module os): Files and Directories. + (line 265) +* Chunk (class in chunk): chunk — Read IFF chunked data. + (line 52) +* cipher() (ssl.SSLSocket method): SSL Sockets. (line 214) +* cipher; DES: crypt — Function to check Unix passwords. + (line 8) +* circle() (in module turtle): Turtle motion. (line 177) +* CIRCUMFLEX (in module token): token — Constants used with Python parse trees. + (line 154) +* CIRCUMFLEXEQUAL (in module token): token — Constants used with Python parse trees. + (line 198) +* Clamped (class in decimal): Signals. (line 20) +* class: Glossary. (line 250) +* Class (class in symtable): Examining Symbol Tables. + (line 90) +* class instance; attribute: The standard type hierarchy. + (line 645) +* class instance; attribute; assignment: The standard type hierarchy. + (line 661) +* class instance; call: Calls. (line 150) +* class object; call: The standard type hierarchy. + (line 598) +* class object; call <1>: The standard type hierarchy. + (line 610) +* class object; call <2>: Calls. (line 146) +* class variable: Glossary. (line 256) +* class; attribute: The standard type hierarchy. + (line 598) +* class; attribute; assignment: The standard type hierarchy. + (line 607) +* class; body: Executing the class body. + (line 6) +* class; constructor: Basic customization. + (line 39) +* class; definition: The return statement. + (line 6) +* class; definition <1>: Class definitions. (line 6) +* class; instance: The standard type hierarchy. + (line 645) +* class; name: Class definitions. (line 6) +* ClassDef (class in ast): Function and class definitions. + (line 177) +* ClassMethodDescriptorType (in module types): Standard Interpreter Types. + (line 122) +* ClassVar (in module typing): Special forms. (line 255) +* clause: Compound statements. + (line 18) +* CLD_CONTINUED (in module os): Process Management. (line 830) +* CLD_DUMPED (in module os): Process Management. (line 830) +* CLD_EXITED (in module os): Process Management. (line 830) +* CLD_KILLED (in module os): Process Management. (line 830) +* CLD_STOPPED (in module os): Process Management. (line 830) +* CLD_TRAPPED (in module os): Process Management. (line 830) +* clean() (mailbox.Maildir method): Maildir. (line 82) +* cleandoc() (in module inspect): Retrieving source code. + (line 68) +* CleanImport (class in test.support.import_helper): test support import_helper — Utilities for import tests. + (line 87) +* cleanup functions: Process Control. (line 33) +* clear (pdb command): Debugger Commands. (line 98) +* Clear Breakpoint: Help menu Shell and Editor. + (line 30) +* clear() (asyncio.Event method): Event. (line 58) +* clear() (collections.deque method): deque objects. (line 43) +* clear() (curses.window method): Window Objects. (line 152) +* clear() (dict method): Mapping Types — dict. + (line 137) +* clear() (email.message.EmailMessage method): email message Representing an email message. + (line 668) +* clear() (frame method): The standard type hierarchy. + (line 831) +* clear() (frozenset method): Set Types — set frozenset. + (line 213) +* clear() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 78) +* clear() (in module turtle): More drawing control. + (line 23) +* clear() (mailbox.Mailbox method): Mailbox objects. (line 204) +* clear() (sequence method): Mutable Sequence Types. + (line 16) +* clear() (threading.Event method): Event Objects. (line 35) +* clear() (xml.etree.ElementTree.Element method): Element Objects. + (line 58) +* clearcache() (in module linecache): linecache — Random access to text lines. + (line 38) +* ClearData() (msilib.Record method): Record Objects. (line 37) +* clearok() (curses.window method): Window Objects. (line 157) +* clearscreen() (in module turtle): Window control. (line 46) +* clearstamp() (in module turtle): Turtle motion. (line 249) +* clearstamps() (in module turtle): Turtle motion. (line 268) +* clear_all_breaks() (bdb.Bdb method): bdb — Debugger framework. + (line 360) +* clear_all_file_breaks() (bdb.Bdb method): bdb — Debugger framework. + (line 355) +* clear_bpbynumber() (bdb.Bdb method): bdb — Debugger framework. + (line 349) +* clear_break() (bdb.Bdb method): bdb — Debugger framework. + (line 344) +* clear_cache() (in module filecmp): filecmp — File and Directory Comparisons. + (line 56) +* clear_cache() (zoneinfo.ZoneInfo class method): The ZoneInfo class. + (line 58) +* clear_content() (email.message.EmailMessage method): email message Representing an email message. + (line 672) +* clear_flags() (decimal.Context method): Context objects. (line 170) +* clear_frames() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 168) +* clear_history() (in module readline): History list. (line 8) +* clear_overloads() (in module typing): Functions and decorators. + (line 271) +* clear_session_cookies() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 90) +* clear_traces() (in module tracemalloc): Functions<10>. (line 6) +* clear_traps() (decimal.Context method): Context objects. (line 174) +* Client() (in module multiprocessing.connection): Listeners and Clients. + (line 34) +* client_address (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 71) +* CLOCK_BOOTTIME (in module time): Clock ID Constants. (line 9) +* clock_getres() (in module time): Functions<4>. (line 38) +* clock_gettime() (in module time): Functions<4>. (line 48) +* clock_gettime_ns() (in module time): Functions<4>. (line 61) +* CLOCK_HIGHRES (in module time): Clock ID Constants. (line 23) +* CLOCK_MONOTONIC (in module time): Clock ID Constants. (line 34) +* CLOCK_MONOTONIC_RAW (in module time): Clock ID Constants. (line 43) +* CLOCK_PROCESS_CPUTIME_ID (in module time): Clock ID Constants. + (line 52) +* CLOCK_PROF (in module time): Clock ID Constants. (line 60) +* CLOCK_REALTIME (in module time): Clock ID Constants. (line 111) +* clock_settime() (in module time): Functions<4>. (line 70) +* clock_settime_ns() (in module time): Functions<4>. (line 82) +* CLOCK_TAI (in module time): Clock ID Constants. (line 68) +* CLOCK_THREAD_CPUTIME_ID (in module time): Clock ID Constants. + (line 80) +* CLOCK_UPTIME (in module time): Clock ID Constants. (line 88) +* CLOCK_UPTIME_RAW (in module time): Clock ID Constants. (line 98) +* clone() (email.generator.BytesGenerator method): email generator Generating MIME documents. + (line 112) +* clone() (email.generator.Generator method): email generator Generating MIME documents. + (line 208) +* clone() (email.policy.Policy method): email policy Policy Objects. + (line 207) +* clone() (in module turtle): Special Turtle methods. + (line 32) +* clone() (pipes.Template method): Template Objects. (line 12) +* cloneNode() (xml.dom.Node method): Node Objects. (line 147) +* close() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 119) +* close() (asyncio.AbstractChildWatcher method): Process Watchers. + (line 77) +* close() (asyncio.BaseTransport method): Base Transport. (line 6) +* close() (asyncio.loop method): Running and stopping the loop. + (line 43) +* close() (asyncio.Runner method): Runner context manager. + (line 49) +* close() (asyncio.Server method): Server Objects. (line 29) +* close() (asyncio.StreamWriter method): StreamWriter. (line 37) +* close() (asyncio.SubprocessTransport method): Subprocess Transports. + (line 59) +* close() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 250) +* close() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 81) +* close() (contextlib.ExitStack method): Utilities. (line 596) +* close() (coroutine method): Coroutine Objects. (line 46) +* close() (dbm.dumb.dumbdbm method): dbm dumb — Portable DBM implementation. + (line 86) +* close() (dbm.gnu.gdbm method): dbm gnu — GNU’s reinterpretation of dbm. + (line 121) +* close() (dbm.ndbm.ndbm method): dbm ndbm — Interface based on ndbm. + (line 69) +* close() (distutils.text_file.TextFile method): distutils text_file — The TextFile class. + (line 96) +* close() (email.parser.BytesFeedParser method): FeedParser API. + (line 65) +* close() (ftplib.FTP method): FTP Objects. (line 246) +* close() (generator method): Generator-iterator methods. + (line 61) +* close() (html.parser.HTMLParser method): HTMLParser Methods. + (line 15) +* close() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 114) +* close() (imaplib.IMAP4 method): IMAP4 Objects. (line 62) +* close() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 132) +* close() (in module os): File Descriptor Operations. + (line 21) +* close() (in module os) <1>: Sub-interpreter support. + (line 77) +* close() (in module socket): Other functions<2>. (line 9) +* close() (io.IOBase method): I/O Base Classes. (line 48) +* close() (logging.FileHandler method): FileHandler. (line 27) +* close() (logging.Handler method): Handler Objects. (line 73) +* close() (logging.handlers.MemoryHandler method): MemoryHandler. + (line 55) +* close() (logging.handlers.NTEventLogHandler method): NTEventLogHandler. + (line 29) +* close() (logging.handlers.SocketHandler method): SocketHandler. + (line 20) +* close() (logging.handlers.SysLogHandler method): SysLogHandler. + (line 46) +* close() (mailbox.Mailbox method): Mailbox objects. (line 262) +* close() (mailbox.Maildir method): Maildir. (line 113) +* close() (mailbox.MH method): MH. (line 104) +* close() (mmap.mmap method): mmap — Memory-mapped file support. + (line 173) +* Close() (msilib.Database method): Database Objects. (line 22) +* Close() (msilib.View method): View Objects. (line 35) +* close() (multiprocessing.connection.Connection method): Connection Objects. + (line 35) +* close() (multiprocessing.connection.Listener method): Listeners and Clients. + (line 91) +* close() (multiprocessing.pool.Pool method): Process Pools. (line 168) +* close() (multiprocessing.Process method): Process and exceptions. + (line 196) +* close() (multiprocessing.Queue method): Pipes and Queues. (line 163) +* close() (multiprocessing.shared_memory.SharedMemory method): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 65) +* close() (multiprocessing.SimpleQueue method): Pipes and Queues. + (line 209) +* close() (os.scandir method): Files and Directories. + (line 789) +* close() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 22) +* close() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 8) +* close() (select.devpoll method): /dev/poll Polling Objects. + (line 12) +* close() (select.epoll method): Edge and Level Trigger Polling epoll Objects. + (line 65) +* close() (select.kqueue method): Kqueue Objects. (line 6) +* close() (selectors.BaseSelector method): Classes<3>. (line 137) +* close() (shelve.Shelf method): shelve — Python object persistence. + (line 77) +* close() (socket.socket method): Socket Objects. (line 41) +* close() (sqlite3.Blob method): Blob objects. (line 36) +* close() (sqlite3.Connection method): Connection objects. (line 78) +* close() (sqlite3.Cursor method): Cursor objects. (line 110) +* close() (sunau.AU_read method): AU_read Objects. (line 9) +* close() (sunau.AU_write method): AU_write Objects. (line 59) +* close() (tarfile.TarFile method): TarFile Objects. (line 250) +* close() (telnetlib.Telnet method): Telnet Objects. (line 88) +* close() (urllib.request.BaseHandler method): BaseHandler Objects. + (line 14) +* close() (wave.Wave_read method): Wave_read Objects. (line 9) +* close() (wave.Wave_write method): Wave_write Objects. (line 23) +* Close() (winreg.PyHKEY method): Registry Handle Objects. + (line 34) +* close() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 28) +* close() (xml.etree.ElementTree.XMLParser method): XMLParser Objects. + (line 20) +* close() (xml.etree.ElementTree.XMLPullParser method): XMLPullParser Objects. + (line 22) +* close() (xml.sax.xmlreader.IncrementalParser method): IncrementalParser Objects. + (line 13) +* close() (zipfile.ZipFile method): ZipFile Objects. (line 106) +* closed (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 75) +* closed (io.IOBase attribute): I/O Base Classes. (line 58) +* closed (mmap.mmap attribute): mmap — Memory-mapped file support. + (line 179) +* closed (ossaudiodev.oss_audio_device attribute): Audio Device Objects. + (line 230) +* closed (select.devpoll attribute): /dev/poll Polling Objects. + (line 18) +* closed (select.epoll attribute): Edge and Level Trigger Polling epoll Objects. + (line 69) +* closed (select.kqueue attribute): Kqueue Objects. (line 10) +* CloseKey() (in module winreg): Functions<12>. (line 8) +* closelog() (in module syslog): syslog — Unix syslog library routines. + (line 68) +* closerange() (in module os): File Descriptor Operations. + (line 32) +* close_connection (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 80) +* close_when_done() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 80) +* closing() (in module contextlib): Utilities. (line 152) +* clrtobot() (curses.window method): Window Objects. (line 162) +* clrtoeol() (curses.window method): Window Objects. (line 168) +* Cmd (class in cmd): cmd — Support for line-oriented command interpreters. + (line 15) +* cmd (subprocess.CalledProcessError attribute): Using the subprocess Module. + (line 203) +* cmd (subprocess.TimeoutExpired attribute): Using the subprocess Module. + (line 160) +* cmdloop() (cmd.Cmd method): Cmd Objects. (line 8) +* cmdqueue (cmd.Cmd attribute): Cmd Objects. (line 141) +* cmp() (in module filecmp): filecmp — File and Directory Comparisons. + (line 16) +* cmpfiles() (in module filecmp): filecmp — File and Directory Comparisons. + (line 36) +* cmp_op (in module dis): Opcode collections. (line 17) +* cmp_to_key() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 102) +* CMSG_LEN() (in module socket): Other functions<2>. (line 308) +* CMSG_SPACE() (in module socket): Other functions<2>. (line 324) +* code (SystemExit attribute): Concrete exceptions. + (line 367) +* code (urllib.error.HTTPError attribute): urllib error — Exception classes raised by urllib request. + (line 38) +* code (urllib.response.addinfourl attribute): urllib response — Response classes used by urllib. + (line 40) +* code (xml.etree.ElementTree.ParseError attribute): Exceptions<16>. + (line 14) +* code (xml.parsers.expat.ExpatError attribute): ExpatError Exceptions. + (line 9) +* code object: The standard type hierarchy. + (line 694) +* code object <1>: Methods. (line 42) +* code object <2>: marshal — Internal Python object serialization. + (line 30) +* code object <3>: Cell Objects. (line 54) +* code; block: Execution model. (line 6) +* CodecInfo (class in codecs): codecs — Codec registry and base classes. + (line 58) +* Codecs: codecs — Codec registry and base classes. + (line 8) +* Codecs; decode: codecs — Codec registry and base classes. + (line 8) +* Codecs; encode: codecs — Codec registry and base classes. + (line 8) +* coded_value (http.cookies.Morsel attribute): Morsel Objects. + (line 56) +* codepoint2name (in module html.entities): html entities — Definitions of HTML general entities. + (line 35) +* codes (in module xml.parsers.expat.errors): Expat error constants. + (line 16) +* CODESET (in module locale): locale — Internationalization services. + (line 184) +* CodeType (class in types): Standard Interpreter Types. + (line 56) +* code_context (inspect.FrameInfo attribute): The interpreter stack. + (line 32) +* code_context (inspect.Traceback attribute): The interpreter stack. + (line 72) +* code_info() (in module dis): Analysis functions. (line 11) +* coding; style: Intermezzo Coding Style. + (line 6) +* collapse_addresses() (in module ipaddress): Other Module Level Functions. + (line 43) +* collapse_rfc2231_value() (in module email.utils): email utils Miscellaneous utilities. + (line 189) +* collect() (in module gc): gc — Garbage Collector interface. + (line 34) +* Collection (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 32) +* Collection (class in typing): Corresponding to collections in collections abc. + (line 27) +* collect_incoming_data() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 85) +* colno (json.JSONDecodeError attribute): Exceptions<14>. (line 27) +* colno (re.error attribute): Exceptions<3>. (line 32) +* COLON (in module token): token — Constants used with Python parse trees. + (line 70) +* COLONEQUAL (in module token): token — Constants used with Python parse trees. + (line 238) +* color() (in module turtle): Color control. (line 104) +* colormode() (in module turtle): Settings and special methods. + (line 34) +* color_content() (in module curses): Functions<5>. (line 45) +* color_pair() (in module curses): Functions<5>. (line 53) +* COLS: curses<4>. (line 7) +* COLS <1>: Functions<5>. (line 569) +* column() (tkinter.ttk.Treeview method): ttk Treeview. (line 35) +* columnize() (cmd.Cmd method): Cmd Objects. (line 86) +* COLUMNS: Functions<5>. (line 593) +* COLUMNS <1>: Functions<5>. (line 596) +* columns (os.terminal_size attribute): Querying the size of a terminal. + (line 30) +* col_offset (ast.AST attribute): Node classes. (line 39) +* comb() (in module math): Number-theoretic and representation functions. + (line 13) +* combinations() (in module itertools): Itertool functions. (line 110) +* combinations_with_replacement() (in module itertools): Itertool functions. + (line 161) +* combine() (datetime.datetime class method): datetime Objects. + (line 170) +* combining() (in module unicodedata): unicodedata — Unicode Database. + (line 59) +* ComboBox (class in tkinter.tix): Basic Widgets. (line 18) +* Combobox (class in tkinter.ttk): ttk Combobox. (line 6) +* comma: Parenthesized forms. + (line 20) +* COMMA (in module token): token — Constants used with Python parse trees. + (line 74) +* Command (class in distutils.cmd): distutils cmd — Abstract base class for Distutils commands. + (line 8) +* Command (class in distutils.core): distutils core — Core Distutils functionality. + (line 307) +* command (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 93) +* command line: Complete Python programs. + (line 25) +* command line option; -?: Generic options. (line 6) +* command line option; -b: Miscellaneous options. + (line 6) +* command line option; -B: Miscellaneous options. + (line 16) +* command line option; –build: Cross Compiling Options. + (line 12) +* command line option; -c: Interface options. (line 36) +* command line option; –check-hash-based-pycs: Miscellaneous options. + (line 21) +* command line option; -d: Miscellaneous options. + (line 35) +* command line option; –disable-ipv6: General Options. (line 16) +* command line option; –disable-test-modules: Install Options. + (line 6) +* command line option; -E: Miscellaneous options. + (line 40) +* command line option; –enable-big-digits: General Options. (line 21) +* command line option; –enable-framework: macOS Options. (line 15) +* command line option; –enable-framework <1>: macOS Options. (line 17) +* command line option; –enable-loadable-sqlite-extensions: General Options. + (line 6) +* command line option; –enable-optimizations: Performance options. + (line 9) +* command line option; –enable-profiling: Performance options. + (line 70) +* command line option; –enable-pystats: General Options. (line 133) +* command line option; –enable-shared: Linker options. (line 6) +* command line option; –enable-universalsdk: macOS Options. (line 8) +* command line option; –enable-universalsdk <1>: macOS Options. + (line 10) +* command line option; –enable-wasm-dynamic-linking: WebAssembly Options. + (line 16) +* command line option; –enable-wasm-pthreads: WebAssembly Options. + (line 26) +* command line option; -h: Generic options. (line 6) +* command line option; –help: Generic options. (line 6) +* command line option; –help-all: Generic options. (line 27) +* command line option; –help-env: Generic options. (line 13) +* command line option; –help-xoptions: Generic options. (line 20) +* command line option; –host: Cross Compiling Options. + (line 16) +* command line option; -i: Miscellaneous options. + (line 47) +* command line option; -I: Miscellaneous options. + (line 58) +* command line option; -J: Options you shouldn’t use. + (line 6) +* command line option; -m: Interface options. (line 50) +* command line option; -O: Miscellaneous options. + (line 70) +* command line option; -OO: Miscellaneous options. + (line 80) +* command line option; -P: Miscellaneous options. + (line 89) +* command line option; -q: Miscellaneous options. + (line 108) +* command line option; -R: Miscellaneous options. + (line 115) +* command line option; -s: Miscellaneous options. + (line 140) +* command line option; -S: Miscellaneous options. + (line 150) +* command line option; -u: Miscellaneous options. + (line 158) +* command line option; -V: Generic options. (line 33) +* command line option; -v: Miscellaneous options. + (line 168) +* command line option; –version: Generic options. (line 33) +* command line option; -W: Miscellaneous options. + (line 180) +* command line option; –with-address-sanitizer: Debug options. + (line 54) +* command line option; –with-assertions: Debug options. (line 29) +* command line option; –with-build-python: Cross Compiling Options. + (line 20) +* command line option; –with-builtin-hashlib-hashes: Security Options. + (line 21) +* command line option; –with-computed-gotos: Performance options. + (line 48) +* command line option; –with-cxx-main: General Options. (line 32) +* command line option; –with-cxx-main <1>: General Options. (line 34) +* command line option; –with-dbmliborder: General Options. (line 76) +* command line option; –with-dtrace: Debug options. (line 46) +* command line option; –with-emscripten-target: WebAssembly Options. + (line 6) +* command line option; –with-ensurepip: Install Options. (line 14) +* command line option; –with-framework-name: macOS Options. (line 46) +* command line option; –with-hash-algorithm: Security Options. + (line 6) +* command line option; –with-libc: Libraries options. (line 50) +* command line option; –with-libm: Libraries options. (line 45) +* command line option; –with-libs: Libraries options. (line 6) +* command line option; –with-lto: Performance options. + (line 35) +* command line option; –with-memory-sanitizer: Debug options. + (line 61) +* command line option; –with-openssl: Libraries options. (line 55) +* command line option; –with-openssl-rpath: Libraries options. + (line 61) +* command line option; –with-pkg-config: General Options. (line 120) +* command line option; –with-platlibdir: General Options. (line 98) +* command line option; –with-pydebug: Debug options. (line 6) +* command line option; –with-readline: Libraries options. (line 28) +* command line option; –with-ssl-default-suites: Security Options. + (line 40) +* command line option; –with-suffix: General Options. (line 39) +* command line option; –with-system-expat: Libraries options. + (line 10) +* command line option; –with-system-ffi: Libraries options. (line 15) +* command line option; –with-system-libmpdec: Libraries options. + (line 21) +* command line option; –with-trace-refs: Debug options. (line 11) +* command line option; –with-tzpath: General Options. (line 51) +* command line option; –with-undefined-behavior-sanitizer: Debug options. + (line 68) +* command line option; –with-universal-archs: macOS Options. (line 23) +* command line option; –with-valgrind: Debug options. (line 42) +* command line option; –with-wheel-pkg-dir: General Options. (line 108) +* command line option; –without-c-locale-coercion: General Options. + (line 89) +* command line option; –without-decimal-contextvar: General Options. + (line 65) +* command line option; –without-doc-strings: Performance options. + (line 60) +* command line option; –without-pymalloc: Performance options. + (line 53) +* command line option; –without-readline: Libraries options. (line 37) +* command line option; –without-static-libpython: Linker options. + (line 11) +* command line option; -x: Miscellaneous options. + (line 240) +* command line option; -X: Miscellaneous options. + (line 245) +* command line option; CONFIG_SITE: Cross Compiling Options. + (line 26) +* CommandCompiler (class in codeop): codeop — Compile Python code. + (line 64) +* commands (pdb command): Debugger Commands. (line 131) +* comment: Comments. (line 6) +* comment (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 58) +* COMMENT (in module token): token — Constants used with Python parse trees. + (line 263) +* comment (zipfile.ZipFile attribute): ZipFile Objects. (line 352) +* comment (zipfile.ZipInfo attribute): ZipInfo Objects. (line 88) +* Comment() (in module xml.etree.ElementTree): Functions<8>. (line 72) +* comment() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 49) +* comment() (xml.sax.handler.LexicalHandler method): LexicalHandler Objects. + (line 18) +* commenters (shlex.shlex attribute): shlex Objects. (line 85) +* CommentHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 295) +* comment_url (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 63) +* commit() (msilib.CAB method): CAB Objects. (line 24) +* Commit() (msilib.Database method): Database Objects. (line 11) +* commit() (sqlite3.Connection method): Connection objects. (line 68) +* common (filecmp.dircmp attribute): The dircmp class. (line 59) +* Common Gateway Interface: cgi — Common Gateway Interface support. + (line 8) +* commonpath() (in module os.path): os path — Common pathname manipulations. + (line 68) +* commonprefix() (in module os.path): os path — Common pathname manipulations. + (line 83) +* common_dirs (filecmp.dircmp attribute): The dircmp class. (line 71) +* common_files (filecmp.dircmp attribute): The dircmp class. (line 75) +* common_funny (filecmp.dircmp attribute): The dircmp class. (line 79) +* common_types (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 144) +* communicate() (asyncio.subprocess.Process method): Interacting with Subprocesses. + (line 50) +* communicate() (subprocess.Popen method): Popen Objects. (line 35) +* Compare (class in ast): Expressions<2>. (line 92) +* compare() (decimal.Context method): Context objects. (line 260) +* compare() (decimal.Decimal method): Decimal objects. (line 147) +* compare() (difflib.Differ method): Differ Objects. (line 38) +* compare_digest() (in module hmac): hmac — Keyed-Hashing for Message Authentication. + (line 113) +* compare_digest() (in module secrets): Other functions. (line 6) +* compare_networks() (ipaddress.IPv4Network method): Network objects. + (line 237) +* compare_networks() (ipaddress.IPv6Network method): Network objects. + (line 352) +* COMPARE_OP (opcode): Python Bytecode Instructions. + (line 550) +* compare_signal() (decimal.Context method): Context objects. + (line 264) +* compare_signal() (decimal.Decimal method): Decimal objects. + (line 158) +* compare_to() (tracemalloc.Snapshot method): Snapshot. (line 13) +* compare_total() (decimal.Context method): Context objects. (line 268) +* compare_total() (decimal.Decimal method): Decimal objects. (line 165) +* compare_total_mag() (decimal.Context method): Context objects. + (line 272) +* compare_total_mag() (decimal.Decimal method): Decimal objects. + (line 190) +* comparison: Comparisons. (line 6) +* comparisons: Basic customization. + (line 179) +* COMPARISON_FLAGS (in module doctest): Option Flags. (line 104) +* Compat32 (class in email.policy): email policy Policy Objects. + (line 547) +* compat32 (in module email.policy): email policy Policy Objects. + (line 602) +* Compile (class in codeop): codeop — Compile Python code. + (line 55) +* compile() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 269) +* compile() (in module py_compile): py_compile — Compile Python source files. + (line 24) +* compile() (in module re): Functions<2>. (line 6) +* compileall command line option; -b: Command-line use. (line 59) +* compileall command line option; -d: Command-line use. (line 32) +* compileall command line option; -e: Command-line use. (line 101) +* compileall command line option; -f: Command-line use. (line 22) +* compileall command line option; –hardlink-dupes: Command-line use. + (line 105) +* compileall command line option; -i: Command-line use. (line 53) +* compileall command line option; –invalidation-mode: Command-line use. + (line 80) +* compileall command line option; -j: Command-line use. (line 74) +* compileall command line option; -l: Command-line use. (line 17) +* compileall command line option; -o: Command-line use. (line 95) +* compileall command line option; -p: Command-line use. (line 42) +* compileall command line option; -q: Command-line use. (line 26) +* compileall command line option; -r: Command-line use. (line 67) +* compileall command line option; -s: Command-line use. (line 40) +* compileall command line option; -x: Command-line use. (line 47) +* compileall command line option; directory: Command-line use. + (line 9) +* compileall command line option; file: Command-line use. (line 9) +* compile_command() (in module code): code — Interpreter base classes. + (line 47) +* compile_command() (in module codeop): codeop — Compile Python code. + (line 29) +* compile_dir() (in module compileall): Public functions. (line 6) +* compile_file() (in module compileall): Public functions. (line 96) +* compile_path() (in module compileall): Public functions. (line 161) +* complete() (rlcompleter.Completer method): Completer Objects. + (line 8) +* completedefault() (cmd.Cmd method): Cmd Objects. (line 80) +* CompletedProcess (class in subprocess): Using the subprocess Module. + (line 87) +* complete_statement() (in module sqlite3): Module functions. + (line 84) +* complex (built-in class): Built-in Functions. (line 357) +* Complex (class in numbers): The numeric tower. (line 6) +* complex literal: Numeric literals. (line 6) +* complex number: Glossary. (line 261) +* complex number; literals: Numeric Types — int float complex. + (line 19) +* complex; number: The standard type hierarchy. + (line 124) +* compound; statement: Compound statements. + (line 6) +* comprehension (class in ast): Comprehensions. (line 52) +* comprehensions: Displays for lists sets and dictionaries. + (line 6) +* compress() (bz2.BZ2Compressor method): Incremental de compression. + (line 15) +* compress() (in module bz2): One-shot de compression. + (line 6) +* compress() (in module gzip): gzip — Support for gzip files. + (line 177) +* compress() (in module itertools): Itertool functions. (line 212) +* compress() (in module lzma): Compressing and decompressing data in memory. + (line 183) +* compress() (in module zlib): zlib — Compression compatible with gzip. + (line 43) +* compress() (lzma.LZMACompressor method): Compressing and decompressing data in memory. + (line 81) +* compress() (zlib.Compress method): zlib — Compression compatible with gzip. + (line 203) +* compressed (ipaddress.IPv4Address attribute): Address objects. + (line 64) +* compressed (ipaddress.IPv4Network attribute): Network objects. + (line 107) +* compressed (ipaddress.IPv6Address attribute): Address objects. + (line 192) +* compressed (ipaddress.IPv6Network attribute): Network objects. + (line 319) +* compression() (ssl.SSLSocket method): SSL Sockets. (line 232) +* CompressionError: tarfile — Read and write tar archive files. + (line 198) +* compressobj() (in module zlib): zlib — Compression compatible with gzip. + (line 80) +* compress_size (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 139) +* compress_type (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 84) +* COMSPEC: Process Management. (line 715) +* COMSPEC <1>: Popen Constructor. (line 112) +* concat() (in module operator): operator — Standard operators as functions. + (line 176) +* Concatenate (in module typing): Special forms. (line 125) +* concatenation; operation: Common Sequence Operations. + (line 21) +* cond (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 96) +* Condition (class in asyncio): Condition. (line 6) +* Condition (class in multiprocessing): Synchronization primitives. + (line 32) +* Condition (class in threading): Condition Objects. (line 72) +* condition (pdb command): Debugger Commands. (line 124) +* condition() (msilib.Control method): GUI classes. (line 22) +* Condition() (multiprocessing.managers.SyncManager method): Managers. + (line 172) +* Conditional; expression: Boolean operations. (line 6) +* conditional; expression: Conditional expressions. + (line 6) +* config() (tkinter.font.Font method): tkinter font — Tkinter font wrapper. + (line 55) +* ConfigParser (class in configparser): ConfigParser Objects. + (line 6) +* configuration information: sysconfig — Provide access to Python’s configuration information. + (line 10) +* configuration; file: configparser — Configuration file parser. + (line 8) +* configure() (tkinter.ttk.Style method): Ttk Styling. (line 24) +* configure_mock() (unittest.mock.Mock method): The Mock Class. + (line 243) +* CONFORM (enum.FlagBoundary attribute): Data Types<2>. (line 556) +* confstr() (in module os): Miscellaneous System Information. + (line 6) +* confstr_names (in module os): Miscellaneous System Information. + (line 28) +* conjugate() (complex number method): Numeric Types — int float complex. + (line 94) +* conjugate() (decimal.Decimal method): Decimal objects. (line 202) +* conjugate() (numbers.Complex method): The numeric tower. (line 23) +* conn (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 48) +* connect() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 201) +* connect() (ftplib.FTP method): FTP Objects. (line 22) +* connect() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 105) +* connect() (in module sqlite3): Module functions. (line 6) +* connect() (multiprocessing.managers.BaseManager method): Managers. + (line 76) +* connect() (smtplib.SMTP method): SMTP Objects. (line 33) +* connect() (socket.socket method): Socket Objects. (line 62) +* Connection (class in multiprocessing.connection): Connection Objects. + (line 13) +* Connection (class in sqlite3): Connection objects. (line 6) +* connection (sqlite3.Cursor attribute): Cursor objects. (line 133) +* ConnectionAbortedError: OS exceptions. (line 45) +* ConnectionError: OS exceptions. (line 30) +* ConnectionRefusedError: OS exceptions. (line 51) +* ConnectionResetError: OS exceptions. (line 57) +* connection_lost() (asyncio.BaseProtocol method): Base Protocol. + (line 23) +* connection_made() (asyncio.BaseProtocol method): Base Protocol. + (line 15) +* ConnectRegistry() (in module winreg): Functions<12>. (line 17) +* connect_accepted_socket() (asyncio.loop method): Creating network servers. + (line 133) +* connect_ex() (socket.socket method): Socket Objects. (line 86) +* connect_read_pipe() (asyncio.loop method): Working with pipes. + (line 6) +* connect_write_pipe() (asyncio.loop method): Working with pipes. + (line 22) +* const (optparse.Option attribute): Option attributes. (line 50) +* constant: Literals. (line 6) +* Constant (class in ast): Literals<3>. (line 6) +* constructor() (in module copyreg): copyreg — Register pickle support functions. + (line 17) +* consumed (asyncio.LimitOverrunError attribute): Exceptions<10>. + (line 66) +* container: Objects values and types. + (line 67) +* container <1>: The standard type hierarchy. + (line 598) +* Container (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 6) +* Container (class in typing): Corresponding to collections in collections abc. + (line 37) +* container; iteration over: Iterator Types. (line 6) +* contains() (in module operator): operator — Standard operators as functions. + (line 181) +* CONTAINS_OP (opcode): Python Bytecode Instructions. + (line 561) +* ContentDispositionHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 280) +* ContentHandler (class in xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 18) +* ContentManager (class in email.contentmanager): email contentmanager Managing MIME Content. + (line 12) +* contents (ctypes._Pointer attribute): Arrays and pointers. + (line 50) +* contents() (importlib.resources.abc.ResourceReader method): importlib resources abc – Abstract base classes for resources. + (line 67) +* contents() (in module importlib.resources): Deprecated functions. + (line 123) +* ContentTooShortError: urllib error — Exception classes raised by urllib request. + (line 56) +* ContentTransferEncoding (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 290) +* ContentTypeHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 267) +* content_disposition (email.headerregistry.ContentDispositionHeader attribute): email headerregistry Custom Header Objects. + (line 285) +* content_manager (email.policy.EmailPolicy attribute): email policy Policy Objects. + (line 402) +* content_type (email.headerregistry.ContentTypeHeader attribute): email headerregistry Custom Header Objects. + (line 272) +* Context (class in contextvars): Manual Context Management. + (line 20) +* Context (class in decimal): Context objects. (line 114) +* context (ssl.SSLSocket attribute): SSL Sockets. (line 325) +* context management protocol: Context Manager Types. + (line 6) +* context manager: With Statement Context Managers. + (line 14) +* context manager <1>: Context Manager Types. + (line 6) +* context manager <2>: Glossary. (line 275) +* context variable: Glossary. (line 281) +* ContextDecorator (class in contextlib): Utilities. (line 365) +* ContextManager (class in typing): Context manager types. + (line 6) +* contextmanager() (in module contextlib): Utilities. (line 30) +* ContextVar (class in contextvars): Context Variables. (line 6) +* context_diff() (in module difflib): difflib — Helpers for computing deltas. + (line 157) +* contiguous: shape strides suboffsets. + (line 26) +* contiguous <1>: Glossary. (line 291) +* contiguous (memoryview attribute): Memory Views. (line 483) +* Continue (class in ast): Control flow. (line 101) +* continue (pdb command): Debugger Commands. (line 197) +* CONTINUOUS (enum.EnumCheck attribute): Data Types<2>. (line 496) +* Control (class in msilib): GUI classes. (line 9) +* Control (class in tkinter.tix): Basic Widgets. (line 24) +* control() (msilib.Dialog method): GUI classes. (line 45) +* control() (select.kqueue method): Kqueue Objects. (line 22) +* controlnames (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 237) +* controls() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 23) +* ConversionError: Exceptions<18>. (line 13) +* convert_arg_line_to_args() (argparse.ArgumentParser method): Customizing file parsing. + (line 6) +* convert_field() (string.Formatter method): Custom String Formatting. + (line 108) +* convert_path() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 74) +* Cookie (class in http.cookiejar): http cookiejar — Cookie handling for HTTP clients. + (line 112) +* CookieError: http cookies — HTTP state management. + (line 33) +* CookieJar (class in http.cookiejar): http cookiejar — Cookie handling for HTTP clients. + (line 45) +* cookiejar (urllib.request.HTTPCookieProcessor attribute): HTTPCookieProcessor Objects. + (line 8) +* CookiePolicy (class in http.cookiejar): http cookiejar — Cookie handling for HTTP clients. + (line 76) +* Coordinated Universal Time: time — Time access and conversions. + (line 39) +* Copy: Help menu Shell and Editor. + (line 30) +* COPY (opcode): Python Bytecode Instructions. + (line 87) +* copy() (collections.deque method): deque objects. (line 47) +* copy() (contextvars.Context method): Manual Context Management. + (line 70) +* copy() (decimal.Context method): Context objects. (line 180) +* copy() (dict method): Mapping Types — dict. + (line 141) +* copy() (frozenset method): Set Types — set frozenset. + (line 123) +* copy() (hashlib.hash method): Hash algorithms. (line 149) +* copy() (hmac.HMAC method): hmac — Keyed-Hashing for Message Authentication. + (line 82) +* copy() (http.cookies.Morsel method): Morsel Objects. (line 102) +* copy() (imaplib.IMAP4 method): IMAP4 Objects. (line 68) +* copy() (in module copy): copy — Shallow and deep copy operations. + (line 18) +* copy() (in module multiprocessing.sharedctypes): The multiprocessing sharedctypes module. + (line 83) +* copy() (in module shutil): Directory and files operations. + (line 121) +* copy() (pipes.Template method): Template Objects. (line 48) +* copy() (sequence method): Mutable Sequence Types. + (line 16) +* copy() (tkinter.font.Font method): tkinter font — Tkinter font wrapper. + (line 59) +* copy() (types.MappingProxyType method): Standard Interpreter Types. + (line 292) +* copy() (zlib.Compress method): zlib — Compression compatible with gzip. + (line 224) +* copy() (zlib.Decompress method): zlib — Compression compatible with gzip. + (line 293) +* copy2() (in module shutil): Directory and files operations. + (line 153) +* copy; protocol: Pickling Class Instances. + (line 111) +* copyfile() (in module shutil): Directory and files operations. + (line 17) +* copyfileobj() (in module shutil): Directory and files operations. + (line 6) +* copying files: shutil — High-level file operations. + (line 8) +* copymode() (in module shutil): Directory and files operations. + (line 59) +* copyright (built-in variable): Constants added by the site module. + (line 18) +* copyright (in module sys): sys — System-specific parameters and functions. + (line 157) +* copyright (in module sys) <1>: Process-wide parameters. + (line 243) +* copysign() (in module math): Number-theoretic and representation functions. + (line 30) +* copystat() (in module shutil): Directory and files operations. + (line 77) +* copytree() (in module shutil): Directory and files operations. + (line 192) +* copy_abs() (decimal.Context method): Context objects. (line 277) +* copy_abs() (decimal.Decimal method): Decimal objects. (line 207) +* copy_context() (in module contextvars): Manual Context Management. + (line 6) +* copy_decimal() (decimal.Context method): Context objects. (line 184) +* copy_file() (in module distutils.file_util): distutils file_util — Single file operations. + (line 9) +* copy_file_range() (in module os): File Descriptor Operations. + (line 44) +* COPY_FREE_VARS (opcode): Python Bytecode Instructions. + (line 758) +* copy_location() (in module ast): ast Helpers. (line 139) +* copy_negate() (decimal.Context method): Context objects. (line 281) +* copy_negate() (decimal.Decimal method): Decimal objects. (line 213) +* copy_sign() (decimal.Context method): Context objects. (line 285) +* copy_sign() (decimal.Decimal method): Decimal objects. (line 219) +* copy_tree() (in module distutils.dir_util): distutils dir_util — Directory tree operations. + (line 32) +* coroutine: Special method lookup. + (line 74) +* coroutine <1>: Yield expressions. (line 52) +* coroutine <2>: Glossary. (line 302) +* Coroutine (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 113) +* Coroutine (class in typing): Asynchronous programming. + (line 6) +* coroutine function: Glossary. (line 310) +* coroutine() (in module types): Coroutine Utility Functions. + (line 6) +* coroutine; function: The standard type hierarchy. + (line 466) +* CoroutineType (in module types): Standard Interpreter Types. + (line 42) +* correlation() (in module statistics): Function details. (line 490) +* cos() (in module cmath): Trigonometric functions<2>. + (line 25) +* cos() (in module math): Trigonometric functions. + (line 31) +* cosh() (in module cmath): Hyperbolic functions<2>. + (line 26) +* cosh() (in module math): Hyperbolic functions. + (line 21) +* count (tracemalloc.Statistic attribute): Statistic. (line 15) +* count (tracemalloc.StatisticDiff attribute): StatisticDiff. + (line 15) +* count() (array.array method): array — Efficient arrays of numeric values. + (line 144) +* count() (bytearray method): Bytes and Bytearray Operations. + (line 36) +* count() (bytes method): Bytes and Bytearray Operations. + (line 36) +* count() (collections.deque method): deque objects. (line 53) +* count() (in module itertools): Itertool functions. (line 225) +* count() (multiprocessing.shared_memory.ShareableList method): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 264) +* count() (sequence method): Common Sequence Operations. + (line 21) +* count() (str method): String Methods<2>. (line 55) +* Counter (class in collections): Counter objects. (line 23) +* Counter (class in typing): Corresponding to types in collections. + (line 40) +* countOf() (in module operator): operator — Standard operators as functions. + (line 187) +* countTestCases() (unittest.TestCase method): Test cases. (line 736) +* countTestCases() (unittest.TestSuite method): Grouping tests. + (line 55) +* count_diff (tracemalloc.StatisticDiff attribute): StatisticDiff. + (line 20) +* covariance() (in module statistics): Function details. (line 468) +* CoverageResults (class in trace): Programmatic Interface. + (line 47) +* co_argcount (code object attribute): The standard type hierarchy. + (line 707) +* CO_ASYNC_GENERATOR (in module inspect): Code Objects Bit Flags. + (line 52) +* co_cellvars (code object attribute): The standard type hierarchy. + (line 707) +* co_code (code object attribute): The standard type hierarchy. + (line 707) +* co_consts (code object attribute): The standard type hierarchy. + (line 707) +* CO_COROUTINE (in module inspect): Code Objects Bit Flags. + (line 35) +* co_filename (code object attribute): The standard type hierarchy. + (line 707) +* co_firstlineno (code object attribute): The standard type hierarchy. + (line 707) +* co_flags (code object attribute): The standard type hierarchy. + (line 707) +* co_freevars (code object attribute): The standard type hierarchy. + (line 707) +* CO_FUTURE_DIVISION (C var): The Very High Level Layer. + (line 370) +* CO_GENERATOR (in module inspect): Code Objects Bit Flags. + (line 30) +* CO_ITERABLE_COROUTINE (in module inspect): Code Objects Bit Flags. + (line 43) +* co_kwonlyargcount (code object attribute): The standard type hierarchy. + (line 707) +* co_lnotab (code object attribute): The standard type hierarchy. + (line 707) +* co_name (code object attribute): The standard type hierarchy. + (line 707) +* co_names (code object attribute): The standard type hierarchy. + (line 707) +* CO_NESTED (in module inspect): Code Objects Bit Flags. + (line 26) +* CO_NEWLOCALS (in module inspect): Code Objects Bit Flags. + (line 13) +* co_nlocals (code object attribute): The standard type hierarchy. + (line 707) +* CO_OPTIMIZED (in module inspect): Code Objects Bit Flags. + (line 9) +* co_positions() (codeobject method): The standard type hierarchy. + (line 753) +* co_posonlyargcount (code object attribute): The standard type hierarchy. + (line 707) +* co_qualname (code object attribute): The standard type hierarchy. + (line 707) +* co_stacksize (code object attribute): The standard type hierarchy. + (line 707) +* CO_VARARGS (in module inspect): Code Objects Bit Flags. + (line 18) +* CO_VARKEYWORDS (in module inspect): Code Objects Bit Flags. + (line 22) +* co_varnames (code object attribute): The standard type hierarchy. + (line 707) +* CPP: New Improved and Deprecated Modules<4>. + (line 59) +* CPPFLAGS: New Improved and Deprecated Modules<4>. + (line 59) +* CPPFLAGS <1>: Preprocessor flags. (line 8) +* CPPFLAGS <2>: Preprocessor flags. (line 18) +* CPPFLAGS <3>: Linker flags. (line 50) +* CPU time: Functions<4>. (line 223) +* CPU time <1>: Functions<4>. (line 536) +* cpu_count() (in module multiprocessing): Miscellaneous<3>. (line 13) +* cpu_count() (in module os): Miscellaneous System Information. + (line 37) +* CPython: Glossary. (line 318) +* cpython_only() (in module test.support): test support — Utilities for the Python test suite. + (line 495) +* crawl_delay() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 50) +* CRC (zipfile.ZipInfo attribute): ZipInfo Objects. (line 135) +* crc32() (in module binascii): binascii — Convert between binary and ASCII. + (line 98) +* crc32() (in module zlib): zlib — Compression compatible with gzip. + (line 121) +* crc_hqx() (in module binascii): binascii — Convert between binary and ASCII. + (line 91) +* create() (imaplib.IMAP4 method): IMAP4 Objects. (line 72) +* create() (in module venv): API<2>. (line 176) +* create() (venv.EnvBuilder method): API<2>. (line 57) +* createAttribute() (xml.dom.Document method): Document Objects. + (line 46) +* createAttributeNS() (xml.dom.Document method): Document Objects. + (line 53) +* createComment() (xml.dom.Document method): Document Objects. + (line 34) +* createDocument() (xml.dom.DOMImplementation method): DOMImplementation Objects. + (line 16) +* createDocumentType() (xml.dom.DOMImplementation method): DOMImplementation Objects. + (line 26) +* createElement() (xml.dom.Document method): Document Objects. + (line 14) +* createElementNS() (xml.dom.Document method): Document Objects. + (line 21) +* createfilehandler() (tkinter.Widget.tk method): File Handlers. + (line 27) +* CreateKey() (in module winreg): Functions<12>. (line 35) +* CreateKeyEx() (in module winreg): Functions<12>. (line 63) +* createLock() (logging.Handler method): Handler Objects. (line 20) +* createLock() (logging.NullHandler method): NullHandler. (line 24) +* createProcessingInstruction() (xml.dom.Document method): Document Objects. + (line 40) +* CreateRecord() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 57) +* createSocket() (logging.handlers.SocketHandler method): SocketHandler. + (line 72) +* createTextNode() (xml.dom.Document method): Document Objects. + (line 28) +* create_aggregate() (sqlite3.Connection method): Connection objects. + (line 142) +* create_archive() (in module zipapp): Python API. (line 8) +* create_autospec() (in module unittest.mock): create_autospec. + (line 6) +* CREATE_BREAKAWAY_FROM_JOB (in module subprocess): Windows Constants. + (line 124) +* create_collation() (sqlite3.Connection method): Connection objects. + (line 281) +* create_configuration() (venv.EnvBuilder method): API<2>. (line 99) +* create_connection() (asyncio.loop method): Opening network connections. + (line 6) +* create_connection() (in module socket): Creating sockets. (line 82) +* create_datagram_endpoint() (asyncio.loop method): Opening network connections. + (line 146) +* create_decimal() (decimal.Context method): Context objects. + (line 188) +* create_decimal_from_float() (decimal.Context method): Context objects. + (line 212) +* create_default_context() (in module ssl): Context creation. + (line 9) +* CREATE_DEFAULT_ERROR_MODE (in module subprocess): Windows Constants. + (line 114) +* create_empty_file() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 92) +* create_function() (sqlite3.Connection method): Connection objects. + (line 102) +* create_future() (asyncio.loop method): Creating Futures and Tasks. + (line 6) +* create_module() (importlib.abc.Loader method): importlib abc – Abstract base classes related to import. + (line 176) +* create_module() (importlib.machinery.ExtensionFileLoader method): importlib machinery – Importers and path hooks. + (line 322) +* create_module() (zipimport.zipimporter method): zipimporter Objects. + (line 19) +* CREATE_NEW_CONSOLE (in module subprocess): Windows Constants. + (line 38) +* CREATE_NEW_PROCESS_GROUP (in module subprocess): Windows Constants. + (line 43) +* CREATE_NO_WINDOW (in module subprocess): Windows Constants. + (line 99) +* create_server() (asyncio.loop method): Creating network servers. + (line 6) +* create_server() (in module socket): Creating sockets. (line 113) +* create_socket() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 191) +* create_static_lib() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 323) +* create_stats() (profile.Profile method): profile and cProfile Module Reference. + (line 86) +* create_string_buffer() (in module ctypes): Utility functions. + (line 40) +* create_subprocess_exec() (in module asyncio): Creating Subprocesses. + (line 6) +* create_subprocess_shell() (in module asyncio): Creating Subprocesses. + (line 23) +* create_system (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 99) +* create_task() (asyncio.loop method): Creating Futures and Tasks. + (line 17) +* create_task() (asyncio.TaskGroup method): Task Groups. (line 17) +* create_task() (in module asyncio): Creating Tasks. (line 6) +* create_tree() (in module distutils.dir_util): distutils dir_util — Directory tree operations. + (line 21) +* create_unicode_buffer() (in module ctypes): Utility functions. + (line 58) +* create_unix_connection() (asyncio.loop method): Opening network connections. + (line 227) +* create_unix_server() (asyncio.loop method): Creating network servers. + (line 109) +* create_version (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 103) +* create_window_function() (sqlite3.Connection method): Connection objects. + (line 193) +* credits (built-in variable): Constants added by the site module. + (line 18) +* critical() (in module logging): Module-Level Functions. + (line 143) +* critical() (logging.Logger method): Logger Objects. (line 251) +* CRNCYSTR (in module locale): locale — Internationalization services. + (line 257) +* cross() (in module audioop): audioop — Manipulate raw audio data. + (line 77) +* crypt() (in module crypt): Module Functions<2>. + (line 8) +* crypt(3): crypt — Function to check Unix passwords. + (line 8) +* crypt(3) <1>: crypt — Function to check Unix passwords. + (line 21) +* crypt(3) <2>: Module Functions<2>. + (line 32) +* cryptography: Cryptographic Services. + (line 6) +* cssclasses (calendar.HTMLCalendar attribute): calendar — General calendar-related functions. + (line 193) +* cssclasses_weekday_head (calendar.HTMLCalendar attribute): calendar — General calendar-related functions. + (line 213) +* cssclass_month (calendar.HTMLCalendar attribute): calendar — General calendar-related functions. + (line 227) +* cssclass_month_head (calendar.HTMLCalendar attribute): calendar — General calendar-related functions. + (line 220) +* cssclass_noday (calendar.HTMLCalendar attribute): calendar — General calendar-related functions. + (line 206) +* cssclass_year (calendar.HTMLCalendar attribute): calendar — General calendar-related functions. + (line 234) +* cssclass_year_head (calendar.HTMLCalendar attribute): calendar — General calendar-related functions. + (line 241) +* csv: csv — CSV File Reading and Writing. + (line 8) +* cte (email.headerregistry.ContentTransferEncoding attribute): email headerregistry Custom Header Objects. + (line 294) +* ctermid() (in module os): Process Parameters. (line 9) +* cte_type (email.policy.Policy attribute): email policy Policy Objects. + (line 159) +* ctime() (datetime.date method): date Objects. (line 257) +* ctime() (datetime.datetime method): datetime Objects. (line 689) +* ctime() (in module time): Functions<4>. (line 91) +* ctrl() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 213) +* CTRL_BREAK_EVENT (in module signal): Module contents<2>. (line 194) +* CTRL_C_EVENT (in module signal): Module contents<2>. (line 185) +* curdir (in module os): Miscellaneous System Information. + (line 83) +* currency() (in module locale): locale — Internationalization services. + (line 450) +* current() (tkinter.ttk.Combobox method): ttk Combobox. (line 8) +* CurrentByteIndex (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 157) +* CurrentColumnNumber (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 161) +* currentframe() (in module inspect): The interpreter stack. + (line 161) +* CurrentLineNumber (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 165) +* current_process() (in module multiprocessing): Miscellaneous<3>. + (line 29) +* current_task() (in module asyncio): Introspection. (line 6) +* current_thread() (in module threading): threading — Thread-based parallelism. + (line 61) +* Cursor (class in sqlite3): Cursor objects. (line 19) +* cursor() (sqlite3.Connection method): Connection objects. (line 23) +* cursyncup() (curses.window method): Window Objects. (line 172) +* curs_set() (in module curses): Functions<5>. (line 61) +* customize_compiler() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 90) +* Cut: Help menu Shell and Editor. + (line 30) +* cwd() (ftplib.FTP method): FTP Objects. (line 213) +* cwd() (pathlib.Path class method): Methods<2>. (line 17) +* cycle() (in module itertools): Itertool functions. (line 247) +* CycleError: Exceptions<4>. (line 8) +* Cyclic Redundancy Check: zlib — Compression compatible with gzip. + (line 123) +* c_bool (class in ctypes): Fundamental data types<2>. + (line 201) +* C_BUILTIN (in module imp): imp — Access the import internals. + (line 333) +* c_byte (class in ctypes): Fundamental data types<2>. + (line 45) +* c_char (class in ctypes): Fundamental data types<2>. + (line 51) +* c_char_p (class in ctypes): Fundamental data types<2>. + (line 58) +* c_contiguous (memoryview attribute): Memory Views. (line 469) +* c_double (class in ctypes): Fundamental data types<2>. + (line 65) +* C_EXTENSION (in module imp): imp — Access the import internals. + (line 321) +* c_float (class in ctypes): Fundamental data types<2>. + (line 76) +* c_int (class in ctypes): Fundamental data types<2>. + (line 81) +* c_int16 (class in ctypes): Fundamental data types<2>. + (line 93) +* c_int32 (class in ctypes): Fundamental data types<2>. + (line 98) +* c_int64 (class in ctypes): Fundamental data types<2>. + (line 103) +* c_int8 (class in ctypes): Fundamental data types<2>. + (line 88) +* c_long (class in ctypes): Fundamental data types<2>. + (line 108) +* c_longdouble (class in ctypes): Fundamental data types<2>. + (line 70) +* c_longlong (class in ctypes): Fundamental data types<2>. + (line 113) +* c_short (class in ctypes): Fundamental data types<2>. + (line 119) +* c_size_t (class in ctypes): Fundamental data types<2>. + (line 124) +* c_ssize_t (class in ctypes): Fundamental data types<2>. + (line 128) +* c_ubyte (class in ctypes): Fundamental data types<2>. + (line 134) +* c_uint (class in ctypes): Fundamental data types<2>. + (line 140) +* c_uint16 (class in ctypes): Fundamental data types<2>. + (line 152) +* c_uint32 (class in ctypes): Fundamental data types<2>. + (line 157) +* c_uint64 (class in ctypes): Fundamental data types<2>. + (line 162) +* c_uint8 (class in ctypes): Fundamental data types<2>. + (line 147) +* c_ulong (class in ctypes): Fundamental data types<2>. + (line 167) +* c_ulonglong (class in ctypes): Fundamental data types<2>. + (line 172) +* c_ushort (class in ctypes): Fundamental data types<2>. + (line 178) +* c_void_p (class in ctypes): Fundamental data types<2>. + (line 183) +* c_wchar (class in ctypes): Fundamental data types<2>. + (line 188) +* c_wchar_p (class in ctypes): Fundamental data types<2>. + (line 195) +* daemon (multiprocessing.Process attribute): Process and exceptions. + (line 101) +* daemon (threading.Thread attribute): Thread Objects. (line 201) +* dangling; else: Compound statements. + (line 55) +* data: Objects values and types. + (line 6) +* data (collections.UserDict attribute): UserDict objects. (line 24) +* data (collections.UserList attribute): UserList objects. (line 29) +* data (collections.UserString attribute): UserString objects. + (line 24) +* data (select.kevent attribute): Kevent Objects. (line 175) +* data (selectors.SelectorKey attribute): Classes<3>. (line 48) +* data (urllib.request.Request attribute): Request Objects. (line 39) +* data (xml.dom.Comment attribute): Comment Objects. (line 9) +* data (xml.dom.ProcessingInstruction attribute): ProcessingInstruction Objects. + (line 14) +* data (xml.dom.Text attribute): Text and CDATASection Objects. + (line 15) +* data (xmlrpc.client.Binary attribute): Binary Objects. (line 12) +* data() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 33) +* data; tabular: csv — CSV File Reading and Writing. + (line 8) +* data; type: The standard type hierarchy. + (line 6) +* DatabaseError: Exceptions<6>. (line 44) +* databases: dbm dumb — Portable DBM implementation. + (line 8) +* dataclass() (in module dataclasses): Module contents<4>. (line 6) +* dataclass_transform() (in module typing): Functions and decorators. + (line 111) +* DataError: Exceptions<6>. (line 51) +* DatagramHandler (class in logging.handlers): DatagramHandler. + (line 10) +* DatagramProtocol (class in asyncio): Base Protocols. (line 20) +* DatagramRequestHandler (class in socketserver): Request Handler Objects. + (line 42) +* DatagramTransport (class in asyncio): Transports Hierarchy. + (line 43) +* datagram_received() (asyncio.DatagramProtocol method): Datagram Protocols. + (line 9) +* DataHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 423) +* data_open() (urllib.request.DataHandler method): DataHandler Objects. + (line 6) +* data_received() (asyncio.Protocol method): Streaming Protocols. + (line 13) +* date (class in datetime): date Objects. (line 13) +* date() (datetime.datetime method): datetime Objects. (line 399) +* date() (nntplib.NNTP method): Methods<3>. (line 298) +* DateHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 136) +* datetime (class in datetime): datetime Objects. (line 17) +* DateTime (class in xmlrpc.client): DateTime Objects. (line 6) +* datetime (email.headerregistry.DateHeader attribute): email headerregistry Custom Header Objects. + (line 145) +* date_time (zipfile.ZipInfo attribute): ZipInfo Objects. (line 54) +* date_time_string() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 320) +* datum: Dictionary displays. + (line 6) +* day (datetime.date attribute): date Objects. (line 114) +* day (datetime.datetime attribute): datetime Objects. (line 280) +* daylight (in module time): Timezone Constants. (line 13) +* Daylight Saving Time: time — Time access and conversions. + (line 43) +* day_abbr (in module calendar): calendar — General calendar-related functions. + (line 368) +* day_name (in module calendar): calendar — General calendar-related functions. + (line 363) +* DbfilenameShelf (class in shelve): Restrictions. (line 68) +* dcgettext() (in module locale): Access to message catalogs. + (line 10) +* deallocation, object: Finalization and De-allocation. + (line 6) +* debug (imaplib.IMAP4 attribute): IMAP4 Objects. (line 397) +* DEBUG (in module re): Flags. (line 30) +* debug (pdb command): Debugger Commands. (line 340) +* debug (shlex.shlex attribute): shlex Objects. (line 162) +* debug (zipfile.ZipFile attribute): ZipFile Objects. (line 346) +* debug() (in module doctest): Debugging. (line 124) +* debug() (in module logging): Module-Level Functions. + (line 44) +* debug() (logging.Logger method): Logger Objects. (line 130) +* debug() (pipes.Template method): Template Objects. (line 16) +* debug() (unittest.TestCase method): Test cases. (line 120) +* debug() (unittest.TestSuite method): Grouping tests. (line 48) +* debugger: threading — Thread-based parallelism. + (line 166) +* debugger <1>: Debug menu Shell window only. + (line 15) +* debugger <2>: sys — System-specific parameters and functions. + (line 821) +* debugger <3>: sys — System-specific parameters and functions. + (line 1447) +* debugger; configuration; file: Debugger Commands. (line 39) +* debugging: pdb — The Python Debugger. + (line 8) +* debugging; assertions: The assert statement. + (line 6) +* DebuggingServer (class in smtpd): DebuggingServer Objects. + (line 6) +* debuglevel (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 69) +* DebugRunner (class in doctest): Debugging. (line 168) +* DEBUG_BYTECODE_SUFFIXES (in module importlib.machinery): importlib machinery – Importers and path hooks. + (line 20) +* DEBUG_COLLECTABLE (in module gc): gc — Garbage Collector interface. + (line 292) +* DEBUG_LEAK (in module gc): gc — Garbage Collector interface. + (line 312) +* debug_print() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 508) +* DEBUG_SAVEALL (in module gc): gc — Garbage Collector interface. + (line 306) +* debug_src() (in module doctest): Debugging. (line 147) +* DEBUG_STATS (in module gc): gc — Garbage Collector interface. + (line 287) +* DEBUG_UNCOLLECTABLE (in module gc): gc — Garbage Collector interface. + (line 296) +* Decimal (class in decimal): Decimal objects. (line 6) +* decimal literal: Numeric literals. (line 6) +* decimal() (in module unicodedata): unicodedata — Unicode Database. + (line 31) +* DecimalException (class in decimal): Signals. (line 28) +* decode (codecs.CodecInfo attribute): codecs — Codec registry and base classes. + (line 69) +* decode() (bytearray method): Bytes and Bytearray Operations. + (line 89) +* decode() (bytes method): Bytes and Bytearray Operations. + (line 89) +* decode() (codecs.Codec method): Stateless Encoding and Decoding. + (line 26) +* decode() (codecs.IncrementalDecoder method): IncrementalDecoder Objects. + (line 28) +* decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 227) +* decode() (in module codecs): codecs — Codec registry and base classes. + (line 34) +* decode() (in module quopri): quopri — Encode and decode MIME quoted-printable data. + (line 19) +* decode() (in module uu): uu — Encode and decode uuencode files. + (line 41) +* decode() (json.JSONDecoder method): Encoders and Decoders. + (line 86) +* decode() (xmlrpc.client.Binary method): Binary Objects. (line 20) +* decode() (xmlrpc.client.DateTime method): DateTime Objects. + (line 13) +* decodebytes() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 234) +* DecodedGenerator (class in email.generator): email generator Generating MIME documents. + (line 232) +* decodestring() (in module quopri): quopri — Encode and decode MIME quoted-printable data. + (line 41) +* decode_header() (in module email.header): email header Internationalized headers. + (line 183) +* decode_header() (in module nntplib): Utility functions<2>. + (line 8) +* decode_params() (in module email.utils): email utils Miscellaneous utilities. + (line 206) +* decode_rfc2231() (in module email.utils): email utils Miscellaneous utilities. + (line 176) +* decode_source() (in module importlib.util): importlib util – Utility code for importers. + (line 72) +* decomposition() (in module unicodedata): unicodedata — Unicode Database. + (line 75) +* decompress() (bz2.BZ2Decompressor method): Incremental de compression. + (line 45) +* decompress() (in module bz2): One-shot de compression. + (line 16) +* decompress() (in module gzip): gzip — Support for gzip files. + (line 196) +* decompress() (in module lzma): Compressing and decompressing data in memory. + (line 192) +* decompress() (in module zlib): zlib — Compression compatible with gzip. + (line 135) +* decompress() (lzma.LZMADecompressor method): Compressing and decompressing data in memory. + (line 132) +* decompress() (zlib.Decompress method): zlib — Compression compatible with gzip. + (line 262) +* decompressobj() (in module zlib): zlib — Compression compatible with gzip. + (line 180) +* decorator: Glossary. (line 325) +* DEDENT (in module token): token — Constants used with Python parse trees. + (line 52) +* DEDENT token: Indentation. (line 33) +* DEDENT token <1>: Compound statements. + (line 55) +* dedent() (in module textwrap): textwrap — Text wrapping and filling. + (line 76) +* deepcopy() (in module copy): copy — Shallow and deep copy operations. + (line 22) +* default (in module email.policy): email policy Policy Objects. + (line 487) +* DEFAULT (in module unittest.mock): DEFAULT. (line 6) +* default (inspect.Parameter attribute): Introspecting callables with the Signature object. + (line 190) +* default (optparse.Option attribute): Option attributes. (line 36) +* default() (cmd.Cmd method): Cmd Objects. (line 74) +* default() (json.JSONEncoder method): Encoders and Decoders. + (line 198) +* default; parameter; value: Function definitions. + (line 56) +* DefaultContext (class in decimal): Context objects. (line 90) +* DefaultCookiePolicy (class in http.cookiejar): http cookiejar — Cookie handling for HTTP clients. + (line 81) +* defaultdict (class in collections): defaultdict objects. + (line 6) +* DefaultDict (class in typing): Corresponding to types in collections. + (line 6) +* DefaultEventLoopPolicy (class in asyncio): Policy Objects. (line 49) +* DefaultHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 310) +* DefaultHandlerExpand() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 317) +* defaults() (configparser.ConfigParser method): ConfigParser Objects. + (line 77) +* DefaultSelector (class in selectors): Classes<3>. (line 161) +* defaultTestLoader (in module unittest): Loading and running tests. + (line 435) +* defaultTestResult() (unittest.TestCase method): Test cases. + (line 741) +* DEFAULT_BUFFER_SIZE (in module io): High-level Module Interface. + (line 6) +* default_bufsize (in module xml.dom.pulldom): xml dom pulldom — Support for building partial DOM trees. + (line 104) +* default_exception_handler() (asyncio.loop method): Error Handling API. + (line 26) +* default_factory (collections.defaultdict attribute): defaultdict objects. + (line 49) +* DEFAULT_FORMAT (in module tarfile): tarfile — Read and write tar archive files. + (line 241) +* DEFAULT_IGNORES (in module filecmp): The dircmp class. (line 111) +* default_open() (urllib.request.BaseHandler method): BaseHandler Objects. + (line 30) +* DEFAULT_PROTOCOL (in module pickle): Module Interface. (line 21) +* default_timer() (in module timeit): Python Interface. (line 32) +* defects (email.headerregistry.BaseHeader attribute): email headerregistry Custom Header Objects. + (line 52) +* defects (email.message.EmailMessage attribute): email message Representing an email message. + (line 712) +* defects (email.message.Message attribute): email message Message Representing an email message using the compat32 API. + (line 724) +* define_macro() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 162) +* defpath (in module os): Miscellaneous System Information. + (line 123) +* DefragResult (class in urllib.parse): Structured Parse Results. + (line 40) +* DefragResultBytes (class in urllib.parse): Structured Parse Results. + (line 65) +* def_prog_mode() (in module curses): Functions<5>. (line 70) +* def_shell_mode() (in module curses): Functions<5>. (line 77) +* degrees() (in module math): Angular conversion. (line 6) +* degrees() (in module turtle): Settings for measurement. + (line 6) +* Del (class in ast): Variables. (line 11) +* delay() (in module turtle): Animation control. (line 6) +* delayload (http.cookiejar.FileCookieJar attribute): CookieJar and FileCookieJar Objects. + (line 159) +* delay_output() (in module curses): Functions<5>. (line 85) +* delch() (curses.window method): Window Objects. (line 177) +* dele() (poplib.POP3 method): POP3 Objects. (line 67) +* Delete (class in ast): Statements. (line 143) +* delete() (ftplib.FTP method): FTP Objects. (line 206) +* delete() (imaplib.IMAP4 method): IMAP4 Objects. (line 76) +* delete() (tkinter.ttk.Treeview method): ttk Treeview. (line 79) +* deleteacl() (imaplib.IMAP4 method): IMAP4 Objects. (line 80) +* deletefilehandler() (tkinter.Widget.tk method): File Handlers. + (line 37) +* DeleteKey() (in module winreg): Functions<12>. (line 102) +* DeleteKeyEx() (in module winreg): Functions<12>. (line 124) +* deleteln() (curses.window method): Window Objects. (line 181) +* deleteMe() (bdb.Breakpoint method): bdb — Debugger framework. + (line 42) +* DeleteValue() (in module winreg): Functions<12>. (line 160) +* DELETE_ATTR (opcode): Python Bytecode Instructions. + (line 455) +* DELETE_DEREF (opcode): Python Bytecode Instructions. + (line 748) +* DELETE_FAST (opcode): Python Bytecode Instructions. + (line 698) +* DELETE_GLOBAL (opcode): Python Bytecode Instructions. + (line 463) +* DELETE_NAME (opcode): Python Bytecode Instructions. + (line 429) +* DELETE_SUBSCR (opcode): Python Bytecode Instructions. + (line 176) +* deletion; target: The del statement<2>. + (line 6) +* deletion; target; list: The del statement<2>. + (line 6) +* delimiter (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 19) +* delimiters: Delimiters. (line 6) +* delitem() (in module operator): operator — Standard operators as functions. + (line 191) +* deliver_challenge() (in module multiprocessing.connection): Listeners and Clients. + (line 15) +* delocalize() (in module locale): locale — Internationalization services. + (line 471) +* del_param() (email.message.EmailMessage method): email message Representing an email message. + (line 383) +* del_param() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 543) +* demo_app() (in module wsgiref.simple_server): wsgiref simple_server – a simple WSGI HTTP server. + (line 36) +* denominator (fractions.Fraction attribute): fractions — Rational numbers. + (line 107) +* denominator (numbers.Rational attribute): The numeric tower. + (line 55) +* DeprecationWarning: Warnings. (line 17) +* deque (class in collections): deque objects. (line 6) +* Deque (class in typing): Corresponding to types in collections. + (line 51) +* dequeue() (logging.handlers.QueueListener method): QueueListener. + (line 50) +* derive() (BaseExceptionGroup method): Exception groups. (line 71) +* derwin() (curses.window method): Window Objects. (line 186) +* DER_cert_to_PEM_cert() (in module ssl): Certificate handling. + (line 94) +* descrgetfunc (C type): Slot Type typedefs. (line 69) +* description (inspect.Parameter.kind attribute): Introspecting callables with the Signature object. + (line 255) +* description (sqlite3.Cursor attribute): Cursor objects. (line 145) +* description() (nntplib.NNTP method): Methods<3>. (line 149) +* descriptions() (nntplib.NNTP method): Methods<3>. (line 135) +* descriptor: Glossary. (line 347) +* descrsetfunc (C type): Slot Type typedefs. (line 74) +* deserialize() (sqlite3.Connection method): Connection objects. + (line 604) +* dest (optparse.Option attribute): Option attributes. (line 27) +* destructor: Basic customization. + (line 55) +* destructor <1>: Assignment statements. + (line 71) +* destructor (C type): Slot Type typedefs. (line 24) +* detach() (io.BufferedIOBase method): I/O Base Classes. (line 259) +* detach() (io.TextIOBase method): Text I/O<2>. (line 36) +* detach() (socket.socket method): Socket Objects. (line 100) +* detach() (tkinter.ttk.Treeview method): ttk Treeview. (line 85) +* detach() (weakref.finalize method): weakref — Weak references. + (line 269) +* Detach() (winreg.PyHKEY method): Registry Handle Objects. + (line 40) +* DETACHED_PROCESS (in module subprocess): Windows Constants. + (line 106) +* detect_api_mismatch() (in module test.support): test support — Utilities for the Python test suite. + (line 605) +* detect_encoding() (in module tokenize): Tokenizing Input. (line 77) +* detect_language() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 198) +* deterministic profiling: Introduction to the profilers. + (line 6) +* device_encoding() (in module os): File Descriptor Operations. + (line 67) +* devnull (in module os): Miscellaneous System Information. + (line 138) +* DEVNULL (in module subprocess): Using the subprocess Module. + (line 128) +* devpoll() (in module select): select — Waiting for I/O completion. + (line 36) +* DevpollSelector (class in selectors): Classes<3>. (line 184) +* dgettext() (in module gettext): GNU gettext API. (line 39) +* dgettext() (in module locale): Access to message catalogs. + (line 8) +* Dialect (class in csv): Module Contents<3>. (line 177) +* dialect (csv.csvreader attribute): Reader Objects. (line 19) +* dialect (csv.csvwriter attribute): Writer Objects. (line 32) +* Dialog (class in msilib): GUI classes. (line 38) +* Dialog (class in tkinter.commondialog): tkinter commondialog — Dialog window templates. + (line 14) +* Dialog (class in tkinter.simpledialog): tkinter simpledialog — Standard Tkinter input dialogs. + (line 21) +* dict (2to3 fixer): Fixers. (line 70) +* dict (built-in class): Mapping Types — dict. + (line 22) +* Dict (class in ast): Literals<3>. (line 105) +* Dict (class in typing): Corresponding to built-in types. + (line 6) +* dict() (multiprocessing.managers.SyncManager method): Managers. + (line 222) +* DictComp (class in ast): Comprehensions. (line 6) +* dictConfig() (in module logging.config): Configuration functions. + (line 13) +* dictionary: Glossary. (line 364) +* dictionary comprehension: Glossary. (line 370) +* dictionary view: Glossary. (line 378) +* dictionary; comprehensions: Dictionary displays. + (line 6) +* dictionary; display: Dictionary displays. + (line 6) +* DictReader (class in csv): Module Contents<3>. (line 103) +* DictWriter (class in csv): Module Contents<3>. (line 144) +* DICT_MERGE (opcode): Python Bytecode Instructions. + (line 539) +* DICT_UPDATE (opcode): Python Bytecode Instructions. + (line 533) +* Differ (class in difflib): difflib — Helpers for computing deltas. + (line 50) +* difference() (frozenset method): Set Types — set frozenset. + (line 109) +* difference_update() (frozenset method): Set Types — set frozenset. + (line 182) +* diff_bytes() (in module difflib): difflib — Helpers for computing deltas. + (line 337) +* diff_files (filecmp.dircmp attribute): The dircmp class. (line 90) +* digest() (hashlib.hash method): Hash algorithms. (line 136) +* digest() (hashlib.shake method): SHAKE variable length digests. + (line 11) +* digest() (hmac.HMAC method): hmac — Keyed-Hashing for Message Authentication. + (line 56) +* digest() (in module hmac): hmac — Keyed-Hashing for Message Authentication. + (line 31) +* digest_size (hmac.HMAC attribute): hmac — Keyed-Hashing for Message Authentication. + (line 90) +* digit() (in module unicodedata): unicodedata — Unicode Database. + (line 37) +* digits (in module string): String constants. (line 24) +* dir() (ftplib.FTP method): FTP Objects. (line 189) +* dircmp (class in filecmp): The dircmp class. (line 6) +* Directory (class in msilib): Directory Objects. (line 6) +* Directory (class in tkinter.filedialog): Native Load/Save Dialogs. + (line 71) +* directory; changing: Files and Directories. + (line 117) +* directory; creating: Files and Directories. + (line 459) +* directory; deleting: Directory and files operations. + (line 265) +* directory; deleting <1>: Files and Directories. + (line 650) +* directory; traversal: Files and Directories. + (line 1502) +* directory; traversal <1>: Files and Directories. + (line 1601) +* directory; walking: Files and Directories. + (line 1502) +* directory; walking <1>: Files and Directories. + (line 1601) +* DirEntry (class in os): Files and Directories. + (line 827) +* DirList (class in tkinter.tix): File Selectors. (line 6) +* dirname() (in module os.path): os path — Common pathname manipulations. + (line 101) +* DirSelectBox (class in tkinter.tix): File Selectors. (line 26) +* DirSelectDialog (class in tkinter.tix): File Selectors. (line 20) +* DirsOnSysPath (class in test.support.import_helper): test support import_helper — Utilities for import tests. + (line 97) +* dirs_double_event() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 86) +* dirs_select_event() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 90) +* DirTree (class in tkinter.tix): File Selectors. (line 13) +* dis() (dis.Bytecode method): Bytecode analysis. (line 48) +* dis() (in module dis): Analysis functions. (line 40) +* dis() (in module pickletools): Programmatic Interface<2>. + (line 6) +* disable (pdb command): Debugger Commands. (line 105) +* disable() (bdb.Breakpoint method): bdb — Debugger framework. + (line 52) +* disable() (in module faulthandler): Fault handler state. + (line 25) +* disable() (in module gc): gc — Garbage Collector interface. + (line 26) +* disable() (in module logging): Module-Level Functions. + (line 160) +* disable() (profile.Profile method): profile and cProfile Module Reference. + (line 82) +* DisableReflectionKey() (in module winreg): Functions<12>. (line 482) +* disable_faulthandler() (in module test.support): test support — Utilities for the Python test suite. + (line 329) +* disable_gc() (in module test.support): test support — Utilities for the Python test suite. + (line 341) +* disable_interspersed_args() (optparse.OptionParser method): Querying and manipulating your option parser. + (line 10) +* disassemble() (in module dis): Analysis functions. (line 86) +* discard (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 54) +* discard() (frozenset method): Set Types — set frozenset. + (line 204) +* discard() (mailbox.Mailbox method): Mailbox objects. (line 76) +* discard() (mailbox.MH method): MH. (line 76) +* discard_buffers() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 91) +* disco() (in module dis): Analysis functions. (line 86) +* discover() (unittest.TestLoader method): Loading and running tests. + (line 117) +* disk_usage() (in module shutil): Directory and files operations. + (line 356) +* dispatcher (class in asyncore): asyncore — Asynchronous socket handler. + (line 74) +* dispatcher_with_send (class in asyncore): asyncore — Asynchronous socket handler. + (line 257) +* dispatch_call() (bdb.Bdb method): bdb — Debugger framework. + (line 210) +* dispatch_exception() (bdb.Bdb method): bdb — Debugger framework. + (line 230) +* dispatch_line() (bdb.Bdb method): bdb — Debugger framework. + (line 200) +* dispatch_return() (bdb.Bdb method): bdb — Debugger framework. + (line 220) +* dispatch_table (pickle.Pickler attribute): Module Interface. + (line 176) +* DISPLAY: Tkinter Modules. (line 27) +* display (pdb command): Debugger Commands. (line 262) +* displayhook() (in module sys): sys — System-specific parameters and functions. + (line 264) +* display_name (email.headerregistry.Address attribute): email headerregistry Custom Header Objects. + (line 425) +* display_name (email.headerregistry.Group attribute): email headerregistry Custom Header Objects. + (line 470) +* dist() (in module math): Trigonometric functions. + (line 35) +* distance() (in module turtle): Tell Turtle’s state. + (line 68) +* distb() (in module dis): Analysis functions. (line 73) +* Distribution (class in distutils.core): distutils core — Core Distutils functionality. + (line 294) +* DISTUTILS_DEBUG: Debugging the setup script. + (line 19) +* Div (class in ast): Expressions<2>. (line 54) +* divide() (decimal.Context method): Context objects. (line 289) +* divide_int() (decimal.Context method): Context objects. (line 293) +* division: Binary arithmetic operations. + (line 31) +* DivisionByZero (class in decimal): Signals. (line 33) +* divmod() (decimal.Context method): Context objects. (line 297) +* DllCanUnloadNow() (in module ctypes): Utility functions. (line 76) +* DllGetClassObject() (in module ctypes): Utility functions. (line 82) +* dllhandle (in module sys): sys — System-specific parameters and functions. + (line 258) +* DndHandler (class in tkinter.dnd): tkinter dnd — Drag and drop support. + (line 43) +* dnd_start() (in module tkinter.dnd): tkinter dnd — Drag and drop support. + (line 65) +* dngettext() (in module gettext): GNU gettext API. (line 58) +* dnpgettext() (in module gettext): GNU gettext API. (line 69) +* doc (json.JSONDecodeError attribute): Exceptions<14>. (line 15) +* DocCGIXMLRPCRequestHandler (class in xmlrpc.server): Documenting XMLRPC server. + (line 22) +* DocFileSuite() (in module doctest): Unittest API. (line 24) +* doClassCleanups() (unittest.TestCase class method): Test cases. + (line 834) +* doCleanups() (unittest.TestCase method): Test cases. (line 793) +* docmd() (smtplib.SMTP method): SMTP Objects. (line 17) +* docstring: Class definitions. (line 6) +* docstring <1>: Glossary. (line 388) +* docstring (doctest.DocTest attribute): DocTest Objects. (line 49) +* docstrings: Defining Functions. (line 21) +* docstrings <1>: Documentation Strings. + (line 6) +* DocTest (class in doctest): DocTest Objects. (line 6) +* DocTestFailure: Debugging. (line 186) +* DocTestFinder (class in doctest): DocTestFinder objects. + (line 6) +* DocTestParser (class in doctest): DocTestParser objects. + (line 6) +* DocTestRunner (class in doctest): DocTestRunner objects. + (line 6) +* DocTestSuite() (in module doctest): Unittest API. (line 99) +* doctype() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 66) +* documentation string: The standard type hierarchy. + (line 749) +* documentation strings: Defining Functions. (line 21) +* documentation strings <1>: Documentation Strings. + (line 6) +* documentation; generation: pydoc — Documentation generator and online help system. + (line 8) +* documentation; online: pydoc — Documentation generator and online help system. + (line 8) +* documentElement (xml.dom.Document attribute): Document Objects. + (line 10) +* DocXMLRPCRequestHandler (class in xmlrpc.server): Documenting XMLRPC server. + (line 27) +* DocXMLRPCServer (class in xmlrpc.server): Documenting XMLRPC server. + (line 11) +* doc_header (cmd.Cmd attribute): Cmd Objects. (line 153) +* domain (email.headerregistry.Address attribute): email headerregistry Custom Header Objects. + (line 436) +* domain (tracemalloc.DomainFilter attribute): DomainFilter. (line 20) +* domain (tracemalloc.Filter attribute): Filter. (line 31) +* domain (tracemalloc.Trace attribute): Trace. (line 15) +* DomainFilter (class in tracemalloc): DomainFilter. (line 6) +* DomainLiberal (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 156) +* DomainRFC2965Match (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 149) +* DomainStrict (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 161) +* DomainStrictNoDots (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 136) +* DomainStrictNonDomain (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 142) +* domain_initial_dot (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 86) +* domain_return_ok() (http.cookiejar.CookiePolicy method): CookiePolicy Objects. + (line 27) +* domain_specified (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 82) +* DOMEventStream (class in xml.dom.pulldom): DOMEventStream Objects. + (line 6) +* DOMException: Exceptions<17>. (line 18) +* doModuleCleanups() (in module unittest): setUpModule and tearDownModule. + (line 44) +* DomstringSizeErr: Exceptions<17>. (line 23) +* done() (asyncio.Future method): Future Object. (line 63) +* done() (asyncio.Task method): Task Object. (line 52) +* done() (concurrent.futures.Future method): Future Objects. (line 33) +* done() (graphlib.TopologicalSorter method): graphlib — Functionality to operate with graph-like structures. + (line 134) +* done() (in module turtle): Using screen events. + (line 106) +* done() (xdrlib.Unpacker method): Unpacker Objects. (line 26) +* DONT_ACCEPT_BLANKLINE (in module doctest): Option Flags. (line 30) +* DONT_ACCEPT_TRUE_FOR_1 (in module doctest): Option Flags. (line 18) +* dont_write_bytecode (in module sys): sys — System-specific parameters and functions. + (line 300) +* doRollover() (logging.handlers.RotatingFileHandler method): RotatingFileHandler. + (line 43) +* doRollover() (logging.handlers.TimedRotatingFileHandler method): TimedRotatingFileHandler. + (line 106) +* DOT (in module token): token — Constants used with Python parse trees. + (line 118) +* dot() (in module turtle): Turtle motion. (line 218) +* DOTALL (in module re): Flags. (line 97) +* doublequote (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 24) +* DOUBLESLASH (in module token): token — Constants used with Python parse trees. + (line 214) +* DOUBLESLASHEQUAL (in module token): token — Constants used with Python parse trees. + (line 218) +* DOUBLESTAR (in module token): token — Constants used with Python parse trees. + (line 166) +* DOUBLESTAREQUAL (in module token): token — Constants used with Python parse trees. + (line 210) +* doupdate() (in module curses): Functions<5>. (line 89) +* down (pdb command): Debugger Commands. (line 66) +* down() (in module turtle): Drawing state. (line 6) +* do_clear() (bdb.Bdb method): bdb — Debugger framework. + (line 289) +* do_command() (curses.textpad.Textbox method): Textbox objects. + (line 30) +* do_GET() (http.server.SimpleHTTPRequestHandler method): http server — HTTP servers. + (line 385) +* do_handshake() (ssl.SSLSocket method): SSL Sockets. (line 126) +* do_HEAD() (http.server.SimpleHTTPRequestHandler method): http server — HTTP servers. + (line 378) +* do_POST() (http.server.CGIHTTPRequestHandler method): http server — HTTP servers. + (line 510) +* dpgettext() (in module gettext): GNU gettext API. (line 65) +* drain() (asyncio.StreamWriter method): StreamWriter. (line 66) +* dropwhile() (in module itertools): Itertool functions. (line 266) +* drop_whitespace (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 201) +* dst() (datetime.datetime method): datetime Objects. (line 493) +* dst() (datetime.time method): time Objects. (line 249) +* dst() (datetime.timezone method): timezone Objects. (line 57) +* dst() (datetime.tzinfo method): tzinfo Objects. (line 65) +* DTDHandler (class in xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 24) +* duck-typing: Glossary. (line 397) +* dump() (in module ast): ast Helpers. (line 242) +* dump() (in module json): Basic Usage. (line 6) +* dump() (in module marshal): marshal — Internal Python object serialization. + (line 47) +* dump() (in module pickle): Module Interface. (line 35) +* dump() (in module plistlib): plistlib — Generate and parse Apple plist files. + (line 81) +* dump() (in module xml.etree.ElementTree): Functions<8>. (line 86) +* dump() (pickle.Pickler method): Module Interface. (line 155) +* dump() (tracemalloc.Snapshot method): Snapshot. (line 29) +* dumps() (in module json): Basic Usage. (line 78) +* dumps() (in module marshal): marshal — Internal Python object serialization. + (line 82) +* dumps() (in module pickle): Module Interface. (line 47) +* dumps() (in module plistlib): plistlib — Generate and parse Apple plist files. + (line 111) +* dumps() (in module xmlrpc.client): Convenience Functions. + (line 6) +* dump_stats() (profile.Profile method): profile and cProfile Module Reference. + (line 96) +* dump_stats() (pstats.Stats method): The Stats Class. (line 59) +* dump_traceback() (in module faulthandler): Dumping the traceback. + (line 6) +* dump_traceback_later() (in module faulthandler): Dumping the tracebacks after a timeout. + (line 6) +* dup() (in module os): File Descriptor Operations. + (line 79) +* dup() (socket.socket method): Socket Objects. (line 108) +* dup2() (in module os): File Descriptor Operations. + (line 93) +* DuplicateOptionError: Exceptions<7>. (line 24) +* DuplicateSectionError: Exceptions<7>. (line 14) +* dwFlags (subprocess.STARTUPINFO attribute): Windows Popen Helpers. + (line 19) +* DynamicClassAttribute() (in module types): Additional Utility Classes and Functions. + (line 40) +* D_FMT (in module locale): locale — Internationalization services. + (line 195) +* D_T_FMT (in module locale): locale — Internationalization services. + (line 189) +* e (in module cmath): Constants<3>. (line 10) +* e (in module math): Constants<2>. (line 10) +* E2BIG (in module errno): errno — Standard errno system symbols. + (line 54) +* e; in numeric literal: Integer literals. (line 40) +* EACCES (in module errno): errno — Standard errno system symbols. + (line 80) +* EADDRINUSE (in module errno): errno — Standard errno system symbols. + (line 426) +* EADDRNOTAVAIL (in module errno): errno — Standard errno system symbols. + (line 430) +* EADV (in module errno): errno — Standard errno system symbols. + (line 306) +* EAFNOSUPPORT (in module errno): errno — Standard errno system symbols. + (line 422) +* EAFP: Glossary. (line 410) +* EAGAIN (in module errno): errno — Standard errno system symbols. + (line 71) +* EALREADY (in module errno): errno — Standard errno system symbols. + (line 495) +* east_asian_width() (in module unicodedata): unicodedata — Unicode Database. + (line 64) +* EBADE (in module errno): errno — Standard errno system symbols. + (line 242) +* EBADF (in module errno): errno — Standard errno system symbols. + (line 62) +* EBADFD (in module errno): errno — Standard errno system symbols. + (line 342) +* EBADMSG (in module errno): errno — Standard errno system symbols. + (line 330) +* EBADR (in module errno): errno — Standard errno system symbols. + (line 246) +* EBADRQC (in module errno): errno — Standard errno system symbols. + (line 258) +* EBADSLT (in module errno): errno — Standard errno system symbols. + (line 262) +* EBFONT (in module errno): errno — Standard errno system symbols. + (line 270) +* EBUSY (in module errno): errno — Standard errno system symbols. + (line 93) +* ECHILD (in module errno): errno — Standard errno system symbols. + (line 66) +* echo() (in module curses): Functions<5>. (line 105) +* echochar() (curses.window method): Window Objects. (line 196) +* ECHRNG (in module errno): errno — Standard errno system symbols. + (line 210) +* ECOMM (in module errno): errno — Standard errno system symbols. + (line 314) +* ECONNABORTED (in module errno): errno — Standard errno system symbols. + (line 446) +* ECONNREFUSED (in module errno): errno — Standard errno system symbols. + (line 482) +* ECONNRESET (in module errno): errno — Standard errno system symbols. + (line 451) +* EDEADLK (in module errno): errno — Standard errno system symbols. + (line 173) +* EDEADLOCK (in module errno): errno — Standard errno system symbols. + (line 266) +* EDESTADDRREQ (in module errno): errno — Standard errno system symbols. + (line 390) +* edit() (curses.textpad.Textbox method): Textbox objects. (line 19) +* EDOM (in module errno): errno — Standard errno system symbols. + (line 165) +* EDOTDOT (in module errno): errno — Standard errno system symbols. + (line 326) +* EDQUOT (in module errno): errno — Standard errno system symbols. + (line 529) +* EEXIST (in module errno): errno — Standard errno system symbols. + (line 97) +* EFAULT (in module errno): errno — Standard errno system symbols. + (line 85) +* EFBIG (in module errno): errno — Standard errno system symbols. + (line 140) +* EFD_CLOEXEC (in module os): Files and Directories. + (line 1774) +* EFD_NONBLOCK (in module os): Files and Directories. + (line 1783) +* EFD_SEMAPHORE (in module os): Files and Directories. + (line 1792) +* effective() (in module bdb): bdb — Debugger framework. + (line 457) +* ehlo() (smtplib.SMTP method): SMTP Objects. (line 58) +* ehlo_or_helo_if_needed() (smtplib.SMTP method): SMTP Objects. + (line 75) +* EHOSTDOWN (in module errno): errno — Standard errno system symbols. + (line 487) +* EHOSTUNREACH (in module errno): errno — Standard errno system symbols. + (line 491) +* EIDRM (in module errno): errno — Standard errno system symbols. + (line 206) +* EILSEQ (in module errno): errno — Standard errno system symbols. + (line 370) +* EINPROGRESS (in module errno): errno — Standard errno system symbols. + (line 500) +* EINTR (in module errno): errno — Standard errno system symbols. + (line 41) +* EINVAL (in module errno): errno — Standard errno system symbols. + (line 120) +* EIO (in module errno): errno — Standard errno system symbols. + (line 46) +* EISCONN (in module errno): errno — Standard errno system symbols. + (line 460) +* EISDIR (in module errno): errno — Standard errno system symbols. + (line 115) +* EISNAM (in module errno): errno — Standard errno system symbols. + (line 521) +* EJECT (enum.FlagBoundary attribute): Data Types<2>. (line 569) +* EL2HLT (in module errno): errno — Standard errno system symbols. + (line 238) +* EL2NSYNC (in module errno): errno — Standard errno system symbols. + (line 214) +* EL3HLT (in module errno): errno — Standard errno system symbols. + (line 218) +* EL3RST (in module errno): errno — Standard errno system symbols. + (line 222) +* Element (class in xml.etree.ElementTree): Element Objects. (line 6) +* ElementDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 202) +* elements() (collections.Counter method): Counter objects. (line 66) +* ElementTree (class in xml.etree.ElementTree): ElementTree Objects. + (line 6) +* element_create() (tkinter.ttk.Style method): Ttk Styling. (line 131) +* element_names() (tkinter.ttk.Style method): Ttk Styling. (line 183) +* element_options() (tkinter.ttk.Style method): Ttk Styling. (line 187) +* ELIBACC (in module errno): errno — Standard errno system symbols. + (line 350) +* ELIBBAD (in module errno): errno — Standard errno system symbols. + (line 354) +* ELIBEXEC (in module errno): errno — Standard errno system symbols. + (line 366) +* ELIBMAX (in module errno): errno — Standard errno system symbols. + (line 362) +* ELIBSCN (in module errno): errno — Standard errno system symbols. + (line 358) +* Ellinghouse, Lance: uu — Encode and decode uuencode files. + (line 24) +* Ellipsis (built-in variable): Built-in Constants. (line 58) +* ELLIPSIS (in module doctest): Option Flags. (line 49) +* ELLIPSIS (in module token): token — Constants used with Python parse trees. + (line 234) +* EllipsisType (in module types): Standard Interpreter Types. + (line 194) +* ELNRNG (in module errno): errno — Standard errno system symbols. + (line 226) +* ELOOP (in module errno): errno — Standard errno system symbols. + (line 193) +* else; conditional expression: Conditional expressions. + (line 6) +* EmailMessage (class in email.message): email message Representing an email message. + (line 52) +* EmailPolicy (class in email.policy): email policy Policy Objects. + (line 343) +* EMFILE (in module errno): errno — Standard errno system symbols. + (line 128) +* emit() (logging.FileHandler method): FileHandler. (line 31) +* emit() (logging.Handler method): Handler Objects. (line 107) +* emit() (logging.handlers.BufferingHandler method): MemoryHandler. + (line 24) +* emit() (logging.handlers.DatagramHandler method): DatagramHandler. + (line 29) +* emit() (logging.handlers.HTTPHandler method): HTTPHandler. (line 36) +* emit() (logging.handlers.NTEventLogHandler method): NTEventLogHandler. + (line 38) +* emit() (logging.handlers.QueueHandler method): QueueHandler. + (line 35) +* emit() (logging.handlers.RotatingFileHandler method): RotatingFileHandler. + (line 47) +* emit() (logging.handlers.SMTPHandler method): SMTPHandler. (line 35) +* emit() (logging.handlers.SocketHandler method): SocketHandler. + (line 24) +* emit() (logging.handlers.SysLogHandler method): SysLogHandler. + (line 50) +* emit() (logging.handlers.TimedRotatingFileHandler method): TimedRotatingFileHandler. + (line 110) +* emit() (logging.handlers.WatchedFileHandler method): WatchedFileHandler. + (line 50) +* emit() (logging.NullHandler method): NullHandler. (line 16) +* emit() (logging.StreamHandler method): StreamHandler. (line 17) +* EMLINK (in module errno): errno — Standard errno system symbols. + (line 156) +* Empty: queue — A synchronized queue class. + (line 82) +* empty (inspect.Parameter attribute): Introspecting callables with the Signature object. + (line 173) +* empty (inspect.Signature attribute): Introspecting callables with the Signature object. + (line 90) +* empty() (asyncio.Queue method): Queue. (line 27) +* empty() (multiprocessing.Queue method): Pipes and Queues. (line 108) +* empty() (multiprocessing.SimpleQueue method): Pipes and Queues. + (line 219) +* empty() (queue.Queue method): Queue Objects. (line 15) +* empty() (queue.SimpleQueue method): SimpleQueue Objects. + (line 14) +* empty() (sched.scheduler method): Scheduler Objects. (line 47) +* empty; list: List displays. (line 6) +* empty; tuple: The standard type hierarchy. + (line 177) +* empty; tuple <1>: Parenthesized forms. + (line 16) +* emptyline() (cmd.Cmd method): Cmd Objects. (line 68) +* EMPTY_NAMESPACE (in module xml.dom): Module Contents<4>. (line 35) +* EMSGSIZE (in module errno): errno — Standard errno system symbols. + (line 394) +* EMULTIHOP (in module errno): errno — Standard errno system symbols. + (line 322) +* enable (pdb command): Debugger Commands. (line 112) +* enable() (bdb.Breakpoint method): bdb — Debugger framework. + (line 48) +* enable() (imaplib.IMAP4 method): IMAP4 Objects. (line 84) +* enable() (in module cgitb): cgitb — Traceback manager for CGI scripts. + (line 33) +* enable() (in module faulthandler): Fault handler state. + (line 6) +* enable() (in module gc): gc — Garbage Collector interface. + (line 22) +* enable() (profile.Profile method): profile and cProfile Module Reference. + (line 78) +* EnableControlFlowGuard: Build<15>. (line 47) +* enabled (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 106) +* EnableReflectionKey() (in module winreg): Functions<12>. (line 500) +* enable_callback_tracebacks() (in module sqlite3): Module functions. + (line 103) +* enable_interspersed_args() (optparse.OptionParser method): Querying and manipulating your option parser. + (line 31) +* enable_load_extension() (sqlite3.Connection method): Connection objects. + (line 392) +* enable_traversal() (tkinter.ttk.Notebook method): ttk Notebook. + (line 75) +* ENABLE_USER_SITE (in module site): Module contents<5>. (line 10) +* ENAMETOOLONG (in module errno): errno — Standard errno system symbols. + (line 177) +* ENAVAIL (in module errno): errno — Standard errno system symbols. + (line 517) +* enclose() (curses.window method): Window Objects. (line 201) +* encode (codecs.CodecInfo attribute): codecs — Codec registry and base classes. + (line 69) +* encode() (codecs.Codec method): Stateless Encoding and Decoding. + (line 9) +* encode() (codecs.IncrementalEncoder method): IncrementalEncoder Objects. + (line 28) +* encode() (email.header.Header method): email header Internationalized headers. + (line 125) +* encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 242) +* encode() (in module codecs): codecs — Codec registry and base classes. + (line 23) +* encode() (in module quopri): quopri — Encode and decode MIME quoted-printable data. + (line 29) +* encode() (in module uu): uu — Encode and decode uuencode files. + (line 29) +* encode() (json.JSONEncoder method): Encoders and Decoders. + (line 217) +* encode() (str method): String Methods<2>. (line 61) +* encode() (xmlrpc.client.Binary method): Binary Objects. (line 25) +* encode() (xmlrpc.client.DateTime method): DateTime Objects. + (line 17) +* encodebytes() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 252) +* EncodedFile() (in module codecs): codecs — Codec registry and base classes. + (line 202) +* encodePriority() (logging.handlers.SysLogHandler method): SysLogHandler. + (line 84) +* encodestring() (in module quopri): quopri — Encode and decode MIME quoted-printable data. + (line 46) +* encode_7or8bit() (in module email.encoders): email encoders Encoders. + (line 57) +* encode_base64() (in module email.encoders): email encoders Encoders. + (line 49) +* encode_noop() (in module email.encoders): email encoders Encoders. + (line 63) +* encode_quopri() (in module email.encoders): email encoders Encoders. + (line 42) +* encode_rfc2231() (in module email.utils): email utils Miscellaneous utilities. + (line 180) +* encoding (curses.window attribute): Window Objects. (line 211) +* ENCODING (in module tarfile): tarfile — Read and write tar archive files. + (line 220) +* ENCODING (in module token): token — Constants used with Python parse trees. + (line 274) +* encoding (io.TextIOBase attribute): Text I/O<2>. (line 14) +* encoding (UnicodeError attribute): Concrete exceptions. + (line 405) +* encoding declarations (source file): Encoding declarations. + (line 6) +* encodings_map (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 136) +* encodings_map (mimetypes.MimeTypes attribute): MimeTypes Objects. + (line 33) +* EncodingWarning: Warnings. (line 68) +* end (UnicodeError attribute): Concrete exceptions. + (line 421) +* end() (re.Match method): Match Objects. (line 140) +* end() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 38) +* endCDATA() (xml.sax.handler.LexicalHandler method): LexicalHandler Objects. + (line 39) +* EndCdataSectionHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 306) +* EndDoctypeDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 197) +* endDocument() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 40) +* endDTD() (xml.sax.handler.LexicalHandler method): LexicalHandler Objects. + (line 28) +* endElement() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 95) +* EndElementHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 232) +* endElementNS() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 121) +* endheaders() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 146) +* ENDMARKER (in module token): token — Constants used with Python parse trees. + (line 40) +* EndNamespaceDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 285) +* endpos (re.Match attribute): Match Objects. (line 179) +* endPrefixMapping() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 73) +* endswith() (bytearray method): Bytes and Bytearray Operations. + (line 115) +* endswith() (bytes method): Bytes and Bytearray Operations. + (line 115) +* endswith() (str method): String Methods<2>. (line 83) +* endwin() (in module curses): Functions<5>. (line 110) +* END_ASYNC_FOR (opcode): Python Bytecode Instructions. + (line 216) +* end_col_offset (ast.AST attribute): Node classes. (line 39) +* end_fill() (in module turtle): Filling. (line 20) +* end_headers() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 275) +* end_lineno (ast.AST attribute): Node classes. (line 39) +* end_lineno (SyntaxError attribute): Concrete exceptions. + (line 300) +* end_ns() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 85) +* end_offset (SyntaxError attribute): Concrete exceptions. + (line 306) +* end_poly() (in module turtle): Special Turtle methods. + (line 11) +* ENETDOWN (in module errno): errno — Standard errno system symbols. + (line 434) +* ENETRESET (in module errno): errno — Standard errno system symbols. + (line 442) +* ENETUNREACH (in module errno): errno — Standard errno system symbols. + (line 438) +* ENFILE (in module errno): errno — Standard errno system symbols. + (line 124) +* ENOANO (in module errno): errno — Standard errno system symbols. + (line 254) +* ENOBUFS (in module errno): errno — Standard errno system symbols. + (line 456) +* ENOCSI (in module errno): errno — Standard errno system symbols. + (line 234) +* ENODATA (in module errno): errno — Standard errno system symbols. + (line 278) +* ENODEV (in module errno): errno — Standard errno system symbols. + (line 106) +* ENOENT (in module errno): errno — Standard errno system symbols. + (line 31) +* ENOEXEC (in module errno): errno — Standard errno system symbols. + (line 58) +* ENOLCK (in module errno): errno — Standard errno system symbols. + (line 181) +* ENOLINK (in module errno): errno — Standard errno system symbols. + (line 302) +* ENOMEM (in module errno): errno — Standard errno system symbols. + (line 76) +* ENOMSG (in module errno): errno — Standard errno system symbols. + (line 202) +* ENONET (in module errno): errno — Standard errno system symbols. + (line 290) +* ENOPKG (in module errno): errno — Standard errno system symbols. + (line 294) +* ENOPROTOOPT (in module errno): errno — Standard errno system symbols. + (line 402) +* ENOSPC (in module errno): errno — Standard errno system symbols. + (line 144) +* ENOSR (in module errno): errno — Standard errno system symbols. + (line 286) +* ENOSTR (in module errno): errno — Standard errno system symbols. + (line 274) +* ENOSYS (in module errno): errno — Standard errno system symbols. + (line 185) +* ENOTBLK (in module errno): errno — Standard errno system symbols. + (line 89) +* ENOTCONN (in module errno): errno — Standard errno system symbols. + (line 464) +* ENOTDIR (in module errno): errno — Standard errno system symbols. + (line 110) +* ENOTEMPTY (in module errno): errno — Standard errno system symbols. + (line 189) +* ENOTNAM (in module errno): errno — Standard errno system symbols. + (line 513) +* ENOTSOCK (in module errno): errno — Standard errno system symbols. + (line 386) +* ENOTTY (in module errno): errno — Standard errno system symbols. + (line 132) +* ENOTUNIQ (in module errno): errno — Standard errno system symbols. + (line 338) +* enqueue() (logging.handlers.QueueHandler method): QueueHandler. + (line 77) +* enqueue_sentinel() (logging.handlers.QueueListener method): QueueListener. + (line 91) +* ensure_directories() (venv.EnvBuilder method): API<2>. (line 85) +* ensure_future() (in module asyncio): Future Functions. (line 19) +* enter() (sched.scheduler method): Scheduler Objects. (line 30) +* enterabs() (sched.scheduler method): Scheduler Objects. (line 9) +* enterAsyncContext() (unittest.IsolatedAsyncioTestCase method): Test cases. + (line 887) +* enterClassContext() (unittest.TestCase class method): Test cases. + (line 825) +* enterContext() (unittest.TestCase method): Test cases. (line 784) +* enterModuleContext() (in module unittest): setUpModule and tearDownModule. + (line 35) +* enter_async_context() (contextlib.AsyncExitStack method): Utilities. + (line 613) +* enter_context() (contextlib.ExitStack method): Utilities. (line 529) +* entities (xml.dom.DocumentType attribute): DocumentType Objects. + (line 38) +* EntityDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 258) +* entitydefs (in module html.entities): html entities — Definitions of HTML general entities. + (line 25) +* EntityResolver (class in xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 31) +* Enum (class in enum): Data Types<2>. (line 75) +* EnumCheck (class in enum): Data Types<2>. (line 475) +* enumerate() (in module threading): threading — Thread-based parallelism. + (line 141) +* EnumKey() (in module winreg): Functions<12>. (line 172) +* EnumType (class in enum): Data Types<2>. (line 6) +* EnumValue() (in module winreg): Functions<12>. (line 191) +* enum_certificates() (in module ssl): Certificate handling. + (line 129) +* enum_crls() (in module ssl): Certificate handling. + (line 152) +* EnvBuilder (class in venv): API<2>. (line 11) +* environ (in module os): Process Parameters. (line 16) +* environ (in module posix): Notable Module Contents. + (line 9) +* environb (in module os): Process Parameters. (line 53) +* environment: Resolution of names. + (line 12) +* environment variable; %APPDATA%: Redirection of local data registry and temporary paths. + (line 13) +* environment variable; APPDATA: PEP 370 Per-user site-packages Directory. + (line 26) +* environment variable; AUDIODEV: ossaudiodev — Access to OSS-compatible audio devices. + (line 58) +* environment variable; BASECFLAGS: Compiler flags. (line 72) +* environment variable; BASECPPFLAGS: Preprocessor flags. (line 23) +* environment variable; BLDSHARED: Linker flags. (line 68) +* environment variable; BROWSER: webbrowser — Convenient web-browser controller. + (line 20) +* environment variable; BROWSER <1>: webbrowser — Convenient web-browser controller. + (line 100) +* environment variable; CC: New Improved and Deprecated Modules<4>. + (line 58) +* environment variable; CC <1>: Compiler flags. (line 6) +* environment variable; CCSHARED: Compiler flags. (line 87) +* environment variable; CFLAGS: New Improved and Deprecated Modules<4>. + (line 59) +* environment variable; CFLAGS <1>: Compiler flags. (line 30) +* environment variable; CFLAGS <2>: Compiler flags. (line 38) +* environment variable; CFLAGS <3>: Compiler flags. (line 41) +* environment variable; CFLAGS <4>: Compiler flags. (line 45) +* environment variable; CFLAGS <5>: Compiler flags. (line 60) +* environment variable; CFLAGS <6>: Linker flags. (line 18) +* environment variable; CFLAGS <7>: Tweaking compiler/linker flags. + (line 66) +* environment variable; CFLAGS <8>: Tweaking compiler/linker flags. + (line 67) +* environment variable; CFLAGSFORSHARED: Compiler flags. (line 93) +* environment variable; CFLAGS_ALIASING: Compiler flags. (line 80) +* environment variable; CFLAGS_NODIST: Compiler flags. (line 34) +* environment variable; CFLAGS_NODIST <1>: Compiler flags. (line 36) +* environment variable; CFLAGS_NODIST <2>: Compiler flags. (line 67) +* environment variable; CFLAGS_NODIST <3>: Linker flags. (line 26) +* environment variable; COLS: curses<4>. (line 7) +* environment variable; COLS <1>: Functions<5>. (line 569) +* environment variable; COLUMNS: Functions<5>. (line 593) +* environment variable; COLUMNS <1>: Functions<5>. (line 596) +* environment variable; COMSPEC: Process Management. (line 715) +* environment variable; COMSPEC <1>: Popen Constructor. (line 112) +* environment variable; CONFIGURE_CFLAGS: Compiler flags. (line 58) +* environment variable; CONFIGURE_CFLAGS_NODIST: Compiler flags. + (line 65) +* environment variable; CONFIGURE_CPPFLAGS: Preprocessor flags. + (line 6) +* environment variable; CONFIGURE_LDFLAGS: Linker flags. (line 13) +* environment variable; CONFIGURE_LDFLAGS_NODIST: Linker flags. + (line 38) +* environment variable; CPP: New Improved and Deprecated Modules<4>. + (line 59) +* environment variable; CPPFLAGS: New Improved and Deprecated Modules<4>. + (line 59) +* environment variable; CPPFLAGS <1>: Preprocessor flags. (line 8) +* environment variable; CPPFLAGS <2>: Preprocessor flags. (line 13) +* environment variable; CPPFLAGS <3>: Preprocessor flags. (line 18) +* environment variable; CPPFLAGS <4>: Linker flags. (line 50) +* environment variable; CXX: Compiler flags. (line 22) +* environment variable; DISPLAY: Tkinter Modules. (line 27) +* environment variable; DISTUTILS_DEBUG: Debugging the setup script. + (line 19) +* environment variable; EnableControlFlowGuard: Build<15>. (line 47) +* environment variable; exec_prefix: Python-related paths and files. + (line 7) +* environment variable; exec_prefix <1>: Include Files. (line 37) +* environment variable; exec_prefix <2>: Include Files. (line 48) +* environment variable; EXTRA_CFLAGS: Compiler flags. (line 54) +* environment variable; HOME: os path<2>. (line 15) +* environment variable; HOME <1>: Changes in the Python API<3>. + (line 117) +* environment variable; HOME <2>: Windows<25>. (line 15) +* environment variable; HOME <3>: Windows<25>. (line 18) +* environment variable; HOME <4>: os path — Common pathname manipulations. + (line 135) +* environment variable; HOME <5>: os path — Common pathname manipulations. + (line 152) +* environment variable; HOME <6>: Tkinter Modules. (line 66) +* environment variable; HOME <7>: distutils util — Miscellaneous other utility functions. + (line 97) +* environment variable; HOME <8>: Location and names of config files. + (line 50) +* environment variable; HOME <9>: Location and names of config files. + (line 67) +* environment variable; HOMEDRIVE: os path — Common pathname manipulations. + (line 142) +* environment variable; HOMEDRIVE <1>: Location and names of config files. + (line 68) +* environment variable; HOMEPATH: os path — Common pathname manipulations. + (line 142) +* environment variable; HOMEPATH <1>: Location and names of config files. + (line 68) +* environment variable; http_proxy: urllib request — Extensible library for opening URLs. + (line 83) +* environment variable; http_proxy <1>: Examples<25>. (line 97) +* environment variable; http_proxy <2>: Basic Authentication. + (line 62) +* environment variable; IDLESTARTUP: IDLE<25>. (line 176) +* environment variable; IDLESTARTUP <1>: IDLE<29>. (line 9) +* environment variable; IDLESTARTUP <2>: IDLE<35>. (line 9) +* environment variable; IDLESTARTUP <3>: Startup and Code Execution. + (line 7) +* environment variable; KDEDIR: webbrowser — Convenient web-browser controller. + (line 189) +* environment variable; LANG: GNU gettext API. (line 21) +* environment variable; LANG <1>: Class-based API. (line 26) +* environment variable; LANG <2>: locale — Internationalization services. + (line 49) +* environment variable; LANG <3>: locale — Internationalization services. + (line 309) +* environment variable; LANG <4>: locale — Internationalization services. + (line 313) +* environment variable; LANGUAGE: GNU gettext API. (line 20) +* environment variable; LANGUAGE <1>: Class-based API. (line 25) +* environment variable; LC_ALL: GNU gettext API. (line 20) +* environment variable; LC_ALL <1>: Class-based API. (line 25) +* environment variable; LC_MESSAGES: GNU gettext API. (line 20) +* environment variable; LC_MESSAGES <1>: Class-based API. (line 26) +* environment variable; LDCXXSHARED: Build and C API Changes<8>. + (line 153) +* environment variable; LDFLAGS: New Improved and Deprecated Modules<4>. + (line 59) +* environment variable; LDFLAGS <1>: Preprocessor flags. (line 18) +* environment variable; LDFLAGS <2>: Linker flags. (line 15) +* environment variable; LDFLAGS <3>: Linker flags. (line 18) +* environment variable; LDFLAGS <4>: Linker flags. (line 28) +* environment variable; LDFLAGS <5>: Linker flags. (line 31) +* environment variable; LDFLAGS <6>: Linker flags. (line 35) +* environment variable; LDFLAGS <7>: Linker flags. (line 45) +* environment variable; LDFLAGS <8>: Linker flags. (line 50) +* environment variable; LDFLAGS_NODIST: Linker flags. (line 24) +* environment variable; LDFLAGS_NODIST <1>: Linker flags. (line 26) +* environment variable; LDFLAGS_NODIST <2>: Linker flags. (line 40) +* environment variable; LDSHARED: Linker flags. (line 62) +* environment variable; LIBS: Linker flags. (line 55) +* environment variable; LINES: curses<4>. (line 6) +* environment variable; LINES <1>: Functions<5>. (line 125) +* environment variable; LINES <2>: Functions<5>. (line 569) +* environment variable; LINES <3>: Functions<5>. (line 593) +* environment variable; LINES <4>: Functions<5>. (line 595) +* environment variable; LINKCC: Linker flags. (line 6) +* environment variable; LNAME: getpass — Portable password input. + (line 43) +* environment variable; LOGNAME: Process Parameters. (line 233) +* environment variable; LOGNAME <1>: getpass — Portable password input. + (line 43) +* environment variable; MAINCC: Compiler flags. (line 12) +* environment variable; MIXERDEV: ossaudiodev — Access to OSS-compatible audio devices. + (line 78) +* environment variable; no_proxy: urllib request — Extensible library for opening URLs. + (line 306) +* environment variable; OPT: Debug options. (line 34) +* environment variable; OPT <1>: Compiler flags. (line 76) +* environment variable; PAGER: pydoc — Documentation generator and online help system. + (line 47) +* environment variable; PATH: Changes in the Python API<3>. + (line 144) +* environment variable; PATH <1>: Changes in ‘python’ Command Behavior<2>. + (line 6) +* environment variable; PATH <2>: Changes in ‘python’ Command Behavior<2>. + (line 11) +* environment variable; PATH <3>: Changes in ‘python’ Command Behavior<2>. + (line 12) +* environment variable; PATH <4>: Windows<3>. (line 15) +* environment variable; PATH <5>: Windows<10>. (line 14) +* environment variable; PATH <6>: Security<20>. (line 16) +* environment variable; PATH <7>: Security<20>. (line 20) +* environment variable; PATH <8>: The Module Search Path. + (line 17) +* environment variable; PATH <9>: Executable Python Scripts. + (line 11) +* environment variable; PATH <10>: Environment variables. + (line 27) +* environment variable; PATH <11>: Miscellaneous. (line 16) +* environment variable; PATH <12>: Installation steps. (line 33) +* environment variable; PATH <13>: Installation steps. (line 57) +* environment variable; PATH <14>: Installing Without UI. + (line 58) +* environment variable; PATH <15>: Installing Without UI. + (line 62) +* environment variable; PATH <16>: Excursus Setting environment variables. + (line 23) +* environment variable; PATH <17>: Excursus Setting environment variables. + (line 35) +* environment variable; PATH <18>: Finding the Python executable. + (line 14) +* environment variable; PATH <19>: Finding the Python executable. + (line 21) +* environment variable; PATH <20>: Finding the Python executable. + (line 22) +* environment variable; PATH <21>: Python Launcher for Windows. + (line 13) +* environment variable; PATH <22>: From the command-line. + (line 9) +* environment variable; PATH <23>: From the command-line. + (line 38) +* environment variable; PATH <24>: Shebang Lines. (line 53) +* environment variable; PATH <25>: Shebang Lines. (line 55) +* environment variable; PATH <26>: Process Management. (line 45) +* environment variable; PATH <27>: Process Management. (line 86) +* environment variable; PATH <28>: Process Management. (line 89) +* environment variable; PATH <29>: Process Management. (line 92) +* environment variable; PATH <30>: Process Management. (line 485) +* environment variable; PATH <31>: Process Management. (line 571) +* environment variable; PATH <32>: Process Management. (line 575) +* environment variable; PATH <33>: Process Management. (line 577) +* environment variable; PATH <34>: Miscellaneous System Information. + (line 120) +* environment variable; PATH <35>: Popen Constructor. (line 34) +* environment variable; PATH <36>: webbrowser — Convenient web-browser controller. + (line 222) +* environment variable; PATH <37>: site — Site-specific configuration hook. + (line 59) +* environment variable; PATH <38>: Installing your CGI script on a Unix system. + (line 29) +* environment variable; PATH <39>: Common problems and solutions. + (line 23) +* environment variable; PATH <40>: Embedding Python<2>. + (line 31) +* environment variable; PATH <41>: Embedding Python<2>. + (line 37) +* environment variable; PATH <42>: How do I make a Python script executable on Unix?. + (line 24) +* environment variable; PATH <43>: How do I make a Python script executable on Unix?. + (line 28) +* environment variable; PATHEXT: Other Improvements<2>. + (line 30) +* environment variable; PATHEXT <1>: Library<21>. (line 138) +* environment variable; PATHEXT <2>: Installing Without UI. + (line 58) +* environment variable; PATHEXT <3>: Installing Without UI. + (line 62) +* environment variable; PIP_USER: Windows<27>. (line 102) +* environment variable; PLAT: distutils util — Miscellaneous other utility functions. + (line 99) +* environment variable; POSIXLY_CORRECT: getopt — C-style parser for command line options. + (line 71) +* environment variable; prefix: Python-related paths and files. + (line 7) +* environment variable; prefix <1>: Include Files. (line 37) +* environment variable; prefix <2>: Include Files. (line 40) +* environment variable; prefix <3>: Include Files. (line 47) +* environment variable; PROFILE_TASK: Performance options. + (line 11) +* environment variable; PROFILE_TASK <1>: Performance options. + (line 26) +* environment variable; PURIFY: Compiler flags. (line 136) +* environment variable; PYLAUNCHER_ALLOW_INSTALL: Windows<8>. + (line 14) +* environment variable; PYLAUNCHER_ALLOW_INSTALL <1>: Install on demand. + (line 6) +* environment variable; PYLAUNCHER_ALWAYS_INSTALL: Install on demand. + (line 12) +* environment variable; PYLAUNCHER_DEBUG: Diagnostics. (line 6) +* environment variable; PYLAUNCHER_DRYRUN: Dry Run. (line 6) +* environment variable; PYLAUNCHER_DRYRUN <1>: Install on demand. + (line 14) +* environment variable; PYLAUNCHER_NO_SEARCH_PATH: Shebang Lines. + (line 57) +* environment variable; PYTHON*: Other Improvements<2>. + (line 9) +* environment variable; PYTHON* <1>: Interface options. (line 80) +* environment variable; PYTHON* <2>: Interface options. (line 140) +* environment variable; PYTHON* <3>: Miscellaneous options. + (line 42) +* environment variable; PYTHON* <4>: Miscellaneous options. + (line 64) +* environment variable; PYTHON* <5>: Global configuration variables. + (line 56) +* environment variable; PYTHONASYNCIODEBUG: Environment variables. + (line 261) +* environment variable; PYTHONASYNCIODEBUG <1>: Enabling debug mode. + (line 10) +* environment variable; PYTHONASYNCIODEBUG <2>: Debug Mode. (line 11) +* environment variable; PYTHONASYNCIODEBUG <3>: Effects of the Python Development Mode. + (line 64) +* environment variable; PYTHONBREAKPOINT: PEP 553 Built-in breakpoint. + (line 13) +* environment variable; PYTHONBREAKPOINT <1>: Environment variables. + (line 81) +* environment variable; PYTHONBREAKPOINT <2>: sys — System-specific parameters and functions. + (line 221) +* environment variable; PYTHONBREAKPOINT <3>: sys — System-specific parameters and functions. + (line 235) +* environment variable; PYTHONBREAKPOINT <4>: sys — System-specific parameters and functions. + (line 239) +* environment variable; PYTHONCASEOK: Changes in the Python API<2>. + (line 29) +* environment variable; PYTHONCASEOK <1>: PEP 235 Importing Modules on Case-Insensitive Platforms. + (line 17) +* environment variable; PYTHONCASEOK <2>: Library<25>. (line 144) +* environment variable; PYTHONCASEOK <3>: Environment variables. + (line 119) +* environment variable; PYTHONCASEOK <4>: Built-in Functions. + (line 2018) +* environment variable; PYTHONCOERCECLOCALE: PEP 538 Legacy C Locale Coercion. + (line 13) +* environment variable; PYTHONCOERCECLOCALE <1>: Environment variables. + (line 340) +* environment variable; PYTHONCOERCECLOCALE <2>: General Options. + (line 96) +* environment variable; PYTHONCOERCECLOCALE <3>: Python UTF-8 Mode. + (line 56) +* environment variable; PYTHONCOERCECLOCALE <4>: Python Configuration. + (line 15) +* environment variable; PYTHONDEBUG: Miscellaneous options. + (line 38) +* environment variable; PYTHONDEBUG <1>: Environment variables. + (line 94) +* environment variable; PYTHONDEBUG <2>: Global configuration variables. + (line 28) +* environment variable; PYTHONDEBUG <3>: PyConfig. (line 616) +* environment variable; PYTHONDEVMODE: Python Development Mode -X dev. + (line 6) +* environment variable; PYTHONDEVMODE <1>: Environment variables. + (line 396) +* environment variable; PYTHONDEVMODE <2>: Python Development Mode. + (line 14) +* environment variable; PYTHONDEVMODE <3>: PyConfig. (line 284) +* environment variable; PYTHONDOCS: pydoc — Documentation generator and online help system. + (line 85) +* environment variable; PYTHONDONTWRITEBYTECODE: Interpreter Changes<2>. + (line 16) +* environment variable; PYTHONDONTWRITEBYTECODE <1>: New and Improved Modules<2>. + (line 624) +* environment variable; PYTHONDONTWRITEBYTECODE <2>: Miscellaneous options. + (line 19) +* environment variable; PYTHONDONTWRITEBYTECODE <3>: Environment variables. + (line 124) +* environment variable; PYTHONDONTWRITEBYTECODE <4>: sys — System-specific parameters and functions. + (line 305) +* environment variable; PYTHONDONTWRITEBYTECODE <5>: Global configuration variables. + (line 36) +* environment variable; PYTHONDONTWRITEBYTECODE <6>: PyConfig. + (line 868) +* environment variable; PYTHONDONTWRITEBYTECODE <7>: How do I create a pyc file?. + (line 21) +* environment variable; PYTHONDUMPREFS: Debug build uses the same ABI as release build. + (line 15) +* environment variable; PYTHONDUMPREFS <1>: Build<32>. (line 54) +* environment variable; PYTHONDUMPREFS <2>: Debug-mode variables. + (line 14) +* environment variable; PYTHONDUMPREFS <3>: Debug options. (line 22) +* environment variable; PYTHONDUMPREFS <4>: PyConfig. (line 295) +* environment variable; PYTHONDUMPREFS <5>: PyObject Slots. (line 65) +* environment variable; PYTHONDUMPREFSFILE: Core and Builtins<15>. + (line 154) +* environment variable; PYTHONDUMPREFSFILE=FILENAME: Debug-mode variables. + (line 22) +* environment variable; PYTHONEXECUTABLE: Environment variables. + (line 205) +* environment variable; PYTHONEXECUTABLE <1>: PyConfig. (line 650) +* environment variable; PYTHONFAULTHANDLER: faulthandler<4>. (line 11) +* environment variable; PYTHONFAULTHANDLER <1>: Environment variables. + (line 232) +* environment variable; PYTHONFAULTHANDLER <2>: Effects of the Python Development Mode. + (line 58) +* environment variable; PYTHONFAULTHANDLER <3>: faulthandler — Dump the Python traceback. + (line 14) +* environment variable; PYTHONFAULTHANDLER <4>: PyConfig. (line 329) +* environment variable; PYTHONHASHSEED: Builtin functions and types. + (line 17) +* environment variable; PYTHONHASHSEED <1>: Porting Python code. + (line 6) +* environment variable; PYTHONHASHSEED <2>: Core and Builtins<42>. + (line 30) +* environment variable; PYTHONHASHSEED <3>: Miscellaneous options. + (line 117) +* environment variable; PYTHONHASHSEED <4>: Miscellaneous options. + (line 133) +* environment variable; PYTHONHASHSEED <5>: Environment variables. + (line 139) +* environment variable; PYTHONHASHSEED <6>: Environment variables. + (line 144) +* environment variable; PYTHONHASHSEED <7>: Basic customization. + (line 297) +* environment variable; PYTHONHASHSEED <8>: Global configuration variables. + (line 48) +* environment variable; PYTHONHASHSEED <9>: Global configuration variables. + (line 51) +* environment variable; PYTHONHASHSEED <10>: PyConfig. (line 399) +* environment variable; PYTHONHOME: Summary – Release highlights<5>. + (line 107) +* environment variable; PYTHONHOME <1>: Miscellaneous options. + (line 43) +* environment variable; PYTHONHOME <2>: Environment variables. + (line 11) +* environment variable; PYTHONHOME <3>: Environment variables. + (line 19) +* environment variable; PYTHONHOME <4>: Environment variables. + (line 21) +* environment variable; PYTHONHOME <5>: Environment variables. + (line 38) +* environment variable; PYTHONHOME <6>: Finding modules. (line 29) +* environment variable; PYTHONHOME <7>: Finding modules. (line 47) +* environment variable; PYTHONHOME <8>: Finding modules. (line 81) +* environment variable; PYTHONHOME <9>: test support script_helper — Utilities for the Python execution tests. + (line 25) +* environment variable; PYTHONHOME <10>: The initialization of the sys path module search path. + (line 30) +* environment variable; PYTHONHOME <11>: Virtual environments<2>. + (line 14) +* environment variable; PYTHONHOME <12>: Embedding Python<2>. + (line 38) +* environment variable; PYTHONHOME <13>: Embedding Python<2>. + (line 44) +* environment variable; PYTHONHOME <14>: Global configuration variables. + (line 57) +* environment variable; PYTHONHOME <15>: Process-wide parameters. + (line 351) +* environment variable; PYTHONHOME <16>: Process-wide parameters. + (line 367) +* environment variable; PYTHONHOME <17>: PyConfig. (line 411) +* environment variable; PYTHONHOME <18>: Modifying Python’s Search Path. + (line 60) +* environment variable; PYTHONHOME <19>: Modifying Python’s Search Path. + (line 62) +* environment variable; PYTHONINSPECT: Other Changes and Fixes<2>. + (line 13) +* environment variable; PYTHONINSPECT <1>: Miscellaneous options. + (line 55) +* environment variable; PYTHONINSPECT <2>: Environment variables. + (line 100) +* environment variable; PYTHONINSPECT <3>: Global configuration variables. + (line 68) +* environment variable; PYTHONINSPECT <4>: PyConfig. (line 436) +* environment variable; PYTHONINTMAXSTRDIGITS: Core and Builtins. + (line 18) +* environment variable; PYTHONINTMAXSTRDIGITS <1>: Miscellaneous options. + (line 265) +* environment variable; PYTHONINTMAXSTRDIGITS <2>: Environment variables. + (line 157) +* environment variable; PYTHONINTMAXSTRDIGITS <3>: Configuring the limit. + (line 9) +* environment variable; PYTHONINTMAXSTRDIGITS <4>: Configuring the limit. + (line 16) +* environment variable; PYTHONINTMAXSTRDIGITS <5>: sys — System-specific parameters and functions. + (line 1038) +* environment variable; PYTHONIOENCODING: Other Improvements<2>. + (line 75) +* environment variable; PYTHONIOENCODING <1>: Interpreter Changes<2>. + (line 23) +* environment variable; PYTHONIOENCODING <2>: Environment variables. + (line 165) +* environment variable; PYTHONIOENCODING <3>: Environment variables. + (line 377) +* environment variable; PYTHONIOENCODING <4>: Python UTF-8 Mode. + (line 29) +* environment variable; PYTHONIOENCODING <5>: sys — System-specific parameters and functions. + (line 1644) +* environment variable; PYTHONIOENCODING <6>: Process-wide parameters. + (line 19) +* environment variable; PYTHONIOENCODING <7>: Process-wide parameters. + (line 23) +* environment variable; PYTHONIOENCODING <8>: PyConfig. (line 772) +* environment variable; PYTHONLEGACYWINDOWSFSENCODING: PEP 529 Change Windows filesystem encoding to UTF-8. + (line 18) +* environment variable; PYTHONLEGACYWINDOWSFSENCODING <1>: Environment variables. + (line 313) +* environment variable; PYTHONLEGACYWINDOWSFSENCODING <2>: sys — System-specific parameters and functions. + (line 1592) +* environment variable; PYTHONLEGACYWINDOWSFSENCODING <3>: Global configuration variables. + (line 92) +* environment variable; PYTHONLEGACYWINDOWSFSENCODING <4>: PyPreConfig. + (line 113) +* environment variable; PYTHONLEGACYWINDOWSSTDIO: PEP 528 Change Windows console encoding to UTF-8. + (line 12) +* environment variable; PYTHONLEGACYWINDOWSSTDIO <1>: Environment variables. + (line 179) +* environment variable; PYTHONLEGACYWINDOWSSTDIO <2>: Environment variables. + (line 327) +* environment variable; PYTHONLEGACYWINDOWSSTDIO <3>: sys — System-specific parameters and functions. + (line 1648) +* environment variable; PYTHONLEGACYWINDOWSSTDIO <4>: Global configuration variables. + (line 104) +* environment variable; PYTHONLEGACYWINDOWSSTDIO <5>: PyConfig. + (line 483) +* environment variable; PYTHONMALLOC: PYTHONMALLOC environment variable. + (line 6) +* environment variable; PYTHONMALLOC <1>: Changes in the C API<5>. + (line 9) +* environment variable; PYTHONMALLOC <2>: Core and Builtins<62>. + (line 90) +* environment variable; PYTHONMALLOC <3>: Environment variables. + (line 268) +* environment variable; PYTHONMALLOC <4>: Environment variables. + (line 304) +* environment variable; PYTHONMALLOC <5>: Performance options. + (line 58) +* environment variable; PYTHONMALLOC <6>: Effects of the Python Development Mode. + (line 46) +* environment variable; PYTHONMALLOC <7>: Effects of the Python Development Mode. + (line 50) +* environment variable; PYTHONMALLOC <8>: Overview<4>. (line 75) +* environment variable; PYTHONMALLOC <9>: Default Memory Allocators. + (line 26) +* environment variable; PYTHONMALLOC <10>: Debug hooks on the Python memory allocators. + (line 11) +* environment variable; PYTHONMALLOC <11>: The pymalloc allocator. + (line 26) +* environment variable; PYTHONMALLOCSTATS: Core and Builtins<62>. + (line 96) +* environment variable; PYTHONMALLOCSTATS <1>: Environment variables. + (line 298) +* environment variable; PYTHONMALLOCSTATS <2>: PyConfig. (line 499) +* environment variable; PYTHONMALLOCSTATS <3>: Overview<4>. (line 78) +* environment variable; PYTHONNODEBUGRANGES: PEP 657 Fine-grained error locations in tracebacks. + (line 63) +* environment variable; PYTHONNODEBUGRANGES <1>: Miscellaneous options. + (line 297) +* environment variable; PYTHONNODEBUGRANGES <2>: Environment variables. + (line 425) +* environment variable; PYTHONNODEBUGRANGES <3>: The standard type hierarchy. + (line 790) +* environment variable; PYTHONNODEBUGRANGES <4>: PyConfig. (line 237) +* environment variable; PYTHONNOUSERSITE: PEP 370 Per-user site-packages Directory. + (line 30) +* environment variable; PYTHONNOUSERSITE <1>: Environment variables. + (line 183) +* environment variable; PYTHONNOUSERSITE <2>: Module contents<5>. + (line 15) +* environment variable; PYTHONNOUSERSITE <3>: Global configuration variables. + (line 126) +* environment variable; PYTHONNOUSERSITE <4>: PyConfig. (line 821) +* environment variable; PYTHONOPTIMIZE: Miscellaneous options. + (line 75) +* environment variable; PYTHONOPTIMIZE <1>: Environment variables. + (line 75) +* environment variable; PYTHONOPTIMIZE <2>: Global configuration variables. + (line 131) +* environment variable; PYTHONOPTIMIZE <3>: PyConfig. (line 566) +* environment variable; PYTHONPATH: Changes in ‘python’ Command Behavior<2>. + (line 8) +* environment variable; PYTHONPATH <1>: Changes in ‘python’ Command Behavior<2>. + (line 9) +* environment variable; PYTHONPATH <2>: The Module Search Path. + (line 16) +* environment variable; PYTHONPATH <3>: Standard Modules. (line 34) +* environment variable; PYTHONPATH <4>: Standard Modules. (line 35) +* environment variable; PYTHONPATH <5>: Miscellaneous options. + (line 42) +* environment variable; PYTHONPATH <6>: Environment variables. + (line 24) +* environment variable; PYTHONPATH <7>: Environment variables. + (line 32) +* environment variable; PYTHONPATH <8>: Environment variables. + (line 39) +* environment variable; PYTHONPATH <9>: Environment variables. + (line 42) +* environment variable; PYTHONPATH <10>: Excursus Setting environment variables. + (line 38) +* environment variable; PYTHONPATH <11>: Finding modules. (line 15) +* environment variable; PYTHONPATH <12>: Finding modules. (line 38) +* environment variable; PYTHONPATH <13>: Finding modules. (line 81) +* environment variable; PYTHONPATH <14>: Configuration. (line 6) +* environment variable; PYTHONPATH <15>: test support script_helper — Utilities for the Python execution tests. + (line 26) +* environment variable; PYTHONPATH <16>: sys — System-specific parameters and functions. + (line 1172) +* environment variable; PYTHONPATH <17>: sys — System-specific parameters and functions. + (line 1177) +* environment variable; PYTHONPATH <18>: The initialization of the sys path module search path. + (line 14) +* environment variable; PYTHONPATH <19>: The initialization of the sys path module search path. + (line 18) +* environment variable; PYTHONPATH <20>: Installing your CGI script on a Unix system. + (line 29) +* environment variable; PYTHONPATH <21>: Building C and C++ Extensions. + (line 9) +* environment variable; PYTHONPATH <22>: Embedding Python<2>. + (line 39) +* environment variable; PYTHONPATH <23>: Embedding Python<2>. + (line 44) +* environment variable; PYTHONPATH <24>: Global configuration variables. + (line 56) +* environment variable; PYTHONPATH <25>: PyConfig. (line 532) +* environment variable; PYTHONPATH <26>: Modifying Python’s Search Path. + (line 67) +* environment variable; PYTHONPATH <27>: Modifying Python’s Search Path. + (line 68) +* environment variable; PYTHONPLATLIBDIR: Core and Builtins<23>. + (line 275) +* environment variable; PYTHONPLATLIBDIR <1>: Environment variables. + (line 54) +* environment variable; PYTHONPLATLIBDIR <2>: The initialization of the sys path module search path. + (line 51) +* environment variable; PYTHONPLATLIBDIR <3>: PyConfig. (line 511) +* environment variable; PYTHONPROFILEIMPORTTIME: Other Language Changes<5>. + (line 47) +* environment variable; PYTHONPROFILEIMPORTTIME <1>: Core and Builtins<44>. + (line 66) +* environment variable; PYTHONPROFILEIMPORTTIME <2>: Miscellaneous options. + (line 272) +* environment variable; PYTHONPROFILEIMPORTTIME <3>: Environment variables. + (line 253) +* environment variable; PYTHONPROFILEIMPORTTIME <4>: PyConfig. + (line 421) +* environment variable; PYTHONPYCACHEPREFIX: Parallel filesystem cache for compiled bytecode files. + (line 6) +* environment variable; PYTHONPYCACHEPREFIX <1>: Core and Builtins<35>. + (line 402) +* environment variable; PYTHONPYCACHEPREFIX <2>: Miscellaneous options. + (line 285) +* environment variable; PYTHONPYCACHEPREFIX <3>: Environment variables. + (line 130) +* environment variable; PYTHONPYCACHEPREFIX <4>: sys — System-specific parameters and functions. + (line 353) +* environment variable; PYTHONPYCACHEPREFIX <5>: PyConfig. (line 672) +* environment variable; PYTHONREGRTEST_UNICODE_GUARD: Tests<7>. + (line 13) +* environment variable; PYTHONSAFEPATH: Summary – Release highlights. + (line 27) +* environment variable; PYTHONSAFEPATH <1>: Other Language Changes. + (line 33) +* environment variable; PYTHONSAFEPATH <2>: Security<4>. (line 6) +* environment variable; PYTHONSAFEPATH <3>: Miscellaneous options. + (line 103) +* environment variable; PYTHONSAFEPATH <4>: Environment variables. + (line 46) +* environment variable; PYTHONSAFEPATH <5>: sys — System-specific parameters and functions. + (line 1189) +* environment variable; PYTHONSAFEPATH <6>: Security Considerations<4>. + (line 49) +* environment variable; PYTHONSAFEPATH <7>: PyConfig. (line 160) +* environment variable; PYTHONSHOWALLOCCOUNT: Two new environment variables for debug mode. + (line 11) +* environment variable; PYTHONSHOWREFCOUNT: Two new environment variables for debug mode. + (line 7) +* environment variable; PYTHONSTARTUP: sys<9>. (line 17) +* environment variable; PYTHONSTARTUP <1>: sys<9>. (line 21) +* environment variable; PYTHONSTARTUP <2>: IDLE<25>. (line 176) +* environment variable; PYTHONSTARTUP <3>: IDLE<29>. (line 9) +* environment variable; PYTHONSTARTUP <4>: IDLE<35>. (line 9) +* environment variable; PYTHONSTARTUP <5>: The Interactive Startup File. + (line 8) +* environment variable; PYTHONSTARTUP <6>: Miscellaneous options. + (line 52) +* environment variable; PYTHONSTARTUP <7>: Environment variables. + (line 61) +* environment variable; PYTHONSTARTUP <8>: Example. (line 10) +* environment variable; PYTHONSTARTUP <9>: Startup and Code Execution. + (line 7) +* environment variable; PYTHONSTARTUP <10>: sys — System-specific parameters and functions. + (line 1052) +* environment variable; PYTHONSTARTUP <11>: Readline configuration. + (line 12) +* environment variable; PYTHONTHREADDEBUG: Pending Removal in Python 3 12. + (line 15) +* environment variable; PYTHONTHREADDEBUG <1>: Deprecated<3>. + (line 198) +* environment variable; PYTHONTHREADDEBUG <2>: Core and Builtins<15>. + (line 316) +* environment variable; PYTHONTHREADDEBUG <3>: Debug-mode variables. + (line 6) +* environment variable; PYTHONTHREADDEBUG <4>: Python Debug Build. + (line 20) +* environment variable; PYTHONTRACEMALLOC: Environment variables. + (line 242) +* environment variable; PYTHONTRACEMALLOC <1>: tracemalloc — Trace memory allocations. + (line 25) +* environment variable; PYTHONTRACEMALLOC <2>: tracemalloc — Trace memory allocations. + (line 32) +* environment variable; PYTHONTRACEMALLOC <3>: Functions<10>. + (line 90) +* environment variable; PYTHONTRACEMALLOC <4>: PyConfig. (line 798) +* environment variable; PYTHONTZPATH: Environment configuration. + (line 11) +* environment variable; PYTHONTZPATH <1>: Exceptions and warnings. + (line 14) +* environment variable; PYTHONUNBUFFERED: Core and Builtins<28>. + (line 107) +* environment variable; PYTHONUNBUFFERED <1>: Miscellaneous options. + (line 163) +* environment variable; PYTHONUNBUFFERED <2>: Environment variables. + (line 108) +* environment variable; PYTHONUNBUFFERED <3>: sys — System-specific parameters and functions. + (line 1655) +* environment variable; PYTHONUNBUFFERED <4>: Global configuration variables. + (line 147) +* environment variable; PYTHONUNBUFFERED <5>: PyConfig. (line 201) +* environment variable; PYTHONUSERBASE: PEP 370 Per-user site-packages Directory. + (line 23) +* environment variable; PYTHONUSERBASE <1>: Environment variables. + (line 193) +* environment variable; PYTHONUSERBASE <2>: Module contents<5>. + (line 39) +* environment variable; PYTHONUSERBASE <3>: Module contents<5>. + (line 66) +* environment variable; PYTHONUSERSITE: test support script_helper — Utilities for the Python execution tests. + (line 26) +* environment variable; PYTHONUTF8: PEP 540 Forced UTF-8 Runtime Mode. + (line 6) +* environment variable; PYTHONUTF8 <1>: Environment variables. + (line 387) +* environment variable; PYTHONUTF8 <2>: Environment variables. + (line 404) +* environment variable; PYTHONUTF8 <3>: UTF-8 mode. (line 18) +* environment variable; PYTHONUTF8 <4>: Python UTF-8 Mode. (line 51) +* environment variable; PYTHONUTF8 <5>: Python UTF-8 Mode. (line 53) +* environment variable; PYTHONUTF8 <6>: sys — System-specific parameters and functions. + (line 1646) +* environment variable; PYTHONUTF8 <7>: PyPreConfig. (line 142) +* environment variable; PYTHONUTF8 <8>: Python Configuration. + (line 14) +* environment variable; PYTHONVERBOSE: Miscellaneous options. + (line 179) +* environment variable; PYTHONVERBOSE <1>: Environment variables. + (line 113) +* environment variable; PYTHONVERBOSE <2>: Global configuration variables. + (line 158) +* environment variable; PYTHONVERBOSE <3>: PyConfig. (line 838) +* environment variable; PYTHONWARNDEFAULTENCODING: Optional EncodingWarning and encoding="locale" option. + (line 19) +* environment variable; PYTHONWARNDEFAULTENCODING <1>: Library<16>. + (line 45) +* environment variable; PYTHONWARNDEFAULTENCODING <2>: Miscellaneous options. + (line 289) +* environment variable; PYTHONWARNDEFAULTENCODING <3>: Environment variables. + (line 415) +* environment variable; PYTHONWARNDEFAULTENCODING <4>: Opt-in EncodingWarning. + (line 9) +* environment variable; PYTHONWARNINGS: warnings<2>. (line 21) +* environment variable; PYTHONWARNINGS <1>: Other Language Changes<10>. + (line 158) +* environment variable; PYTHONWARNINGS <2>: Changes to the Handling of Deprecation Warnings. + (line 25) +* environment variable; PYTHONWARNINGS <3>: Interpreter Changes. + (line 6) +* environment variable; PYTHONWARNINGS <4>: Documentation<6>. + (line 6) +* environment variable; PYTHONWARNINGS <5>: Miscellaneous options. + (line 231) +* environment variable; PYTHONWARNINGS <6>: Environment variables. + (line 211) +* environment variable; PYTHONWARNINGS <7>: Effects of the Python Development Mode. + (line 30) +* environment variable; PYTHONWARNINGS <8>: The Warnings Filter. + (line 46) +* environment variable; PYTHONWARNINGS <9>: The Warnings Filter. + (line 56) +* environment variable; PYTHONWARNINGS <10>: Describing Warning Filters. + (line 7) +* environment variable; PYTHONWARNINGS <11>: Describing Warning Filters. + (line 21) +* environment variable; PYTHONWARNINGS <12>: Default Warning Filter. + (line 7) +* environment variable; PYTHONWARNINGS <13>: PyConfig. (line 857) +* environment variable; PYTHON_DOM: Module Contents<4>. (line 23) +* environment variable; PY_BUILTIN_MODULE_CFLAGS: Compiler flags. + (line 127) +* environment variable; PY_CFLAGS: Compiler flags. (line 100) +* environment variable; PY_CFLAGS_NODIST: Compiler flags. (line 105) +* environment variable; PY_CORE_CFLAGS: Compiler flags. (line 121) +* environment variable; PY_CORE_LDFLAGS: Linker flags. (line 84) +* environment variable; PY_CPPFLAGS: Preprocessor flags. (line 27) +* environment variable; PY_LDFLAGS: Linker flags. (line 74) +* environment variable; PY_LDFLAGS_NODIST: Linker flags. (line 78) +* environment variable; PY_PYTHON: Customizing default Python versions. + (line 18) +* environment variable; PY_STDMODULE_CFLAGS: Compiler flags. (line 112) +* environment variable; SOURCE_DATE_EPOCH: py_compile<3>. (line 7) +* environment variable; SOURCE_DATE_EPOCH <1>: Library<34>. (line 453) +* environment variable; SOURCE_DATE_EPOCH <2>: Build<40>. (line 15) +* environment variable; SOURCE_DATE_EPOCH <3>: py_compile — Compile Python source files. + (line 66) +* environment variable; SOURCE_DATE_EPOCH <4>: py_compile — Compile Python source files. + (line 82) +* environment variable; SOURCE_DATE_EPOCH <5>: py_compile — Compile Python source files. + (line 86) +* environment variable; SOURCE_DATE_EPOCH <6>: Command-line use. + (line 91) +* environment variable; SSLKEYLOGFILE: Context creation. (line 34) +* environment variable; SSLKEYLOGFILE <1>: Context creation. (line 68) +* environment variable; SystemRoot: Popen Constructor. (line 301) +* environment variable; TCL_LIBRARY: How do I freeze Tkinter applications?. + (line 11) +* environment variable; TEMP: Redirection of local data registry and temporary paths. + (line 7) +* environment variable; TEMP <1>: tempfile — Generate temporary files and directories. + (line 258) +* environment variable; TERM: Functions<5>. (line 483) +* environment variable; TERM <1>: Functions<5>. (line 510) +* environment variable; TK_LIBRARY: How do I freeze Tkinter applications?. + (line 11) +* environment variable; TMP: tempfile — Generate temporary files and directories. + (line 260) +* environment variable; TMPDIR: tempfile — Generate temporary files and directories. + (line 256) +* environment variable; TZ: Functions<4>. (line 561) +* environment variable; TZ <1>: Functions<4>. (line 562) +* environment variable; TZ <2>: Functions<4>. (line 570) +* environment variable; TZ <3>: Functions<4>. (line 575) +* environment variable; TZ <4>: Functions<4>. (line 577) +* environment variable; TZ <5>: Functions<4>. (line 637) +* environment variable; USER: getpass — Portable password input. + (line 43) +* environment variable; USERNAME: os path — Common pathname manipulations. + (line 144) +* environment variable; USERNAME <1>: Process Parameters. (line 233) +* environment variable; USERNAME <2>: getpass — Portable password input. + (line 44) +* environment variable; USERPROFILE: os path<2>. (line 14) +* environment variable; USERPROFILE <1>: Changes in the Python API<3>. + (line 116) +* environment variable; USERPROFILE <2>: Windows<25>. (line 15) +* environment variable; USERPROFILE <3>: os path — Common pathname manipulations. + (line 141) +* environment variable; USERPROFILE <4>: Location and names of config files. + (line 67) +* environment variable; USER_BASE: New and Improved Modules. + (line 469) +* environment variable; VIRTUAL_ENV: Creating virtual environments. + (line 134) +* environment variable; __PYVENV_LAUNCHER__: PyConfig. (line 179) +* environment variable; __PYVENV_LAUNCHER__ <1>: PyConfig. (line 653) +* environment variables; deleting: Process Parameters. (line 523) +* environment variables; setting: Process Parameters. (line 335) +* EnvironmentError: Concrete exceptions. + (line 457) +* Environments; virtual: venv — Creation of virtual environments. + (line 10) +* EnvironmentVarGuard (class in test.support.os_helper): test support os_helper — Utilities for os tests. + (line 49) +* ENXIO (in module errno): errno — Standard errno system symbols. + (line 50) +* eof (bz2.BZ2Decompressor attribute): Incremental de compression. + (line 72) +* eof (lzma.LZMADecompressor attribute): Compressing and decompressing data in memory. + (line 165) +* eof (shlex.shlex attribute): shlex Objects. (line 178) +* eof (ssl.MemoryBIO attribute): Memory BIO Support<2>. + (line 143) +* eof (zlib.Decompress attribute): zlib — Compression compatible with gzip. + (line 252) +* EOFError: Concrete exceptions. + (line 26) +* EOFError (built-in exception): File Objects. (line 44) +* eof_received() (asyncio.BufferedProtocol method): Buffered Streaming Protocols. + (line 40) +* eof_received() (asyncio.Protocol method): Streaming Protocols. + (line 30) +* EOPNOTSUPP (in module errno): errno — Standard errno system symbols. + (line 414) +* EOVERFLOW (in module errno): errno — Standard errno system symbols. + (line 334) +* EPERM (in module errno): errno — Standard errno system symbols. + (line 26) +* EPFNOSUPPORT (in module errno): errno — Standard errno system symbols. + (line 418) +* epilogue (email.message.EmailMessage attribute): email message Representing an email message. + (line 704) +* epilogue (email.message.Message attribute): email message Message Representing an email message using the compat32 API. + (line 714) +* EPIPE (in module errno): errno — Standard errno system symbols. + (line 160) +* epoch: time — Time access and conversions. + (line 18) +* epoll() (in module select): select — Waiting for I/O completion. + (line 55) +* EpollSelector (class in selectors): Classes<3>. (line 175) +* EPROTO (in module errno): errno — Standard errno system symbols. + (line 318) +* EPROTONOSUPPORT (in module errno): errno — Standard errno system symbols. + (line 406) +* EPROTOTYPE (in module errno): errno — Standard errno system symbols. + (line 398) +* Eq (class in ast): Expressions<2>. (line 109) +* eq() (in module operator): operator — Standard operators as functions. + (line 24) +* EQEQUAL (in module token): token — Constants used with Python parse trees. + (line 134) +* EQFULL (in module errno): errno — Standard errno system symbols. + (line 533) +* EQUAL (in module token): token — Constants used with Python parse trees. + (line 114) +* ERA (in module locale): locale — Internationalization services. + (line 264) +* ERANGE (in module errno): errno — Standard errno system symbols. + (line 169) +* erase() (curses.window method): Window Objects. (line 221) +* erasechar() (in module curses): Functions<5>. (line 114) +* ERA_D_FMT (in module locale): locale — Internationalization services. + (line 286) +* ERA_D_T_FMT (in module locale): locale — Internationalization services. + (line 281) +* ERA_T_FMT (in module locale): locale — Internationalization services. + (line 291) +* EREMCHG (in module errno): errno — Standard errno system symbols. + (line 346) +* EREMOTE (in module errno): errno — Standard errno system symbols. + (line 298) +* EREMOTEIO (in module errno): errno — Standard errno system symbols. + (line 525) +* ERESTART (in module errno): errno — Standard errno system symbols. + (line 374) +* erf() (in module math): Special functions. (line 6) +* erfc() (in module math): Special functions. (line 20) +* EROFS (in module errno): errno — Standard errno system symbols. + (line 152) +* ERR (in module curses): Constants<6>. (line 8) +* errcheck (ctypes._FuncPtr attribute): Foreign functions. (line 59) +* errcode (xmlrpc.client.ProtocolError attribute): ProtocolError Objects. + (line 17) +* errmsg (xmlrpc.client.ProtocolError attribute): ProtocolError Objects. + (line 21) +* errno (OSError attribute): Concrete exceptions. + (line 156) +* error: Exceptions<3>. (line 6) +* error <1>: Functions and Exceptions. + (line 8) +* Error: copy — Shallow and deep copy operations. + (line 26) +* Error <1>: Directory and files operations. + (line 416) +* error <2>: dbm — Interfaces to Unix “databases”. + (line 16) +* error <3>: dbm gnu — GNU’s reinterpretation of dbm. + (line 21) +* error <4>: dbm ndbm — Interface based on ndbm. + (line 21) +* error <5>: dbm dumb — Portable DBM implementation. + (line 24) +* Error <2>: Exceptions<6>. (line 15) +* error <6>: zlib — Compression compatible with gzip. + (line 24) +* Error <3>: Module Contents<3>. (line 294) +* Error <4>: Exceptions<7>. (line 6) +* error <7>: os — Miscellaneous operating system interfaces. + (line 51) +* error <8>: getopt — C-style parser for command line options. + (line 85) +* error <9>: Functions<5>. (line 8) +* error <10>: _thread — Low-level threading API. + (line 21) +* error <11>: Exceptions<12>. (line 6) +* error <12>: select — Waiting for I/O completion. + (line 29) +* Error <5>: Exceptions<15>. (line 9) +* Error <6>: binascii — Convert between binary and ASCII. + (line 157) +* error <13>: xml parsers expat — Fast XML parsing using Expat. + (line 31) +* Error <7>: webbrowser — Convenient web-browser controller. + (line 49) +* Error <8>: wave — Read and write WAV files. + (line 49) +* Error <9>: locale — Internationalization services. + (line 22) +* error <14>: resource — Resource usage information. + (line 22) +* error <15>: audioop — Manipulate raw audio data. + (line 29) +* error <16>: nis — Interface to Sun’s NIS Yellow Pages. + (line 62) +* Error <10>: sunau — Read and write Sun AU files. + (line 71) +* Error <11>: uu — Encode and decode uuencode files. + (line 55) +* Error <12>: Exceptions<18>. (line 8) +* error handling: Exceptions<2>. (line 6) +* error() (argparse.ArgumentParser method): Exiting methods. (line 18) +* error() (in module logging): Module-Level Functions. + (line 138) +* error() (logging.Logger method): Logger Objects. (line 246) +* error() (urllib.request.OpenerDirector method): OpenerDirector Objects. + (line 58) +* error() (xml.sax.handler.ErrorHandler method): ErrorHandler Objects. + (line 16) +* ErrorByteIndex (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 132) +* errorcode (in module errno): errno — Standard errno system symbols. + (line 13) +* ErrorCode (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 136) +* ErrorColumnNumber (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 142) +* ErrorHandler (class in xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 38) +* ErrorLineNumber (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 146) +* errors: Exceptions<2>. (line 6) +* errors (io.TextIOBase attribute): Text I/O<2>. (line 19) +* errors (unittest.TestLoader attribute): Loading and running tests. + (line 17) +* errors (unittest.TestResult attribute): Loading and running tests. + (line 241) +* Errors; logging: logging — Logging facility for Python. + (line 8) +* ErrorStream (class in wsgiref.types): wsgiref types – WSGI types for static type checking. + (line 28) +* ErrorString() (in module xml.parsers.expat): xml parsers expat — Fast XML parsing using Expat. + (line 42) +* ERRORTOKEN (in module token): token — Constants used with Python parse trees. + (line 254) +* error_body (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 262) +* error_content_type (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 157) +* error_headers (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 255) +* error_leader() (shlex.shlex method): shlex Objects. (line 69) +* error_message_format (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 149) +* error_output() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 227) +* error_perm: ftplib — FTP protocol client. + (line 146) +* error_proto: ftplib — FTP protocol client. + (line 151) +* error_proto <1>: poplib — POP3 protocol client. + (line 96) +* error_received() (asyncio.DatagramProtocol method): Datagram Protocols. + (line 15) +* error_reply: ftplib — FTP protocol client. + (line 136) +* error_status (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 249) +* error_temp: ftplib — FTP protocol client. + (line 141) +* escape (shlex.shlex attribute): shlex Objects. (line 110) +* escape sequence: String and Bytes literals. + (line 72) +* escape() (in module glob): glob — Unix style pathname pattern expansion. + (line 97) +* escape() (in module html): html — HyperText Markup Language support. + (line 12) +* escape() (in module re): Functions<2>. (line 223) +* escape() (in module xml.sax.saxutils): xml sax saxutils — SAX Utilities. + (line 14) +* escapechar (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 35) +* escapedquotes (shlex.shlex attribute): shlex Objects. (line 122) +* ESHUTDOWN (in module errno): errno — Standard errno system symbols. + (line 468) +* ESOCKTNOSUPPORT (in module errno): errno — Standard errno system symbols. + (line 410) +* ESPIPE (in module errno): errno — Standard errno system symbols. + (line 148) +* ESRCH (in module errno): errno — Standard errno system symbols. + (line 36) +* ESRMNT (in module errno): errno — Standard errno system symbols. + (line 310) +* ESTALE (in module errno): errno — Standard errno system symbols. + (line 505) +* ESTRPIPE (in module errno): errno — Standard errno system symbols. + (line 378) +* ETIME (in module errno): errno — Standard errno system symbols. + (line 282) +* ETIMEDOUT (in module errno): errno — Standard errno system symbols. + (line 477) +* Etiny() (decimal.Context method): Context objects. (line 231) +* ETOOMANYREFS (in module errno): errno — Standard errno system symbols. + (line 473) +* Etop() (decimal.Context method): Context objects. (line 237) +* ETXTBSY (in module errno): errno — Standard errno system symbols. + (line 136) +* EUCLEAN (in module errno): errno — Standard errno system symbols. + (line 509) +* EUNATCH (in module errno): errno — Standard errno system symbols. + (line 230) +* EUSERS (in module errno): errno — Standard errno system symbols. + (line 382) +* evaluation; order: Evaluation order. (line 6) +* Event (class in asyncio): Event. (line 6) +* Event (class in multiprocessing): Synchronization primitives. + (line 42) +* Event (class in threading): Event Objects. (line 14) +* event scheduling: sched — Event scheduler. + (line 8) +* event() (msilib.Control method): GUI classes. (line 14) +* Event() (multiprocessing.managers.SyncManager method): Managers. + (line 183) +* eventfd() (in module os): Files and Directories. + (line 1701) +* eventfd_read() (in module os): Files and Directories. + (line 1754) +* eventfd_write() (in module os): Files and Directories. + (line 1764) +* events (selectors.SelectorKey attribute): Classes<3>. (line 44) +* events (widgets): Bindings and Events. + (line 6) +* EWOULDBLOCK (in module errno): errno — Standard errno system symbols. + (line 197) +* Example (class in doctest): Example Objects. (line 6) +* example (doctest.DocTestFailure attribute): Debugging. (line 200) +* example (doctest.UnexpectedException attribute): Debugging. + (line 221) +* examples (doctest.DocTest attribute): DocTest Objects. (line 17) +* excel (class in csv): Module Contents<3>. (line 197) +* excel_tab (class in csv): Module Contents<3>. (line 203) +* except (2to3 fixer): Fixers. (line 82) +* ExceptHandler (class in ast): Control flow. (line 207) +* excepthook() (in module sys): sys — System-specific parameters and functions. + (line 359) +* excepthook() (in module sys) <1>: cgitb — Traceback manager for CGI scripts. + (line 36) +* excepthook() (in module threading): threading — Thread-based parallelism. + (line 71) +* exception: Exceptions<2>. (line 6) +* exception <1>: The raise statement. + (line 6) +* Exception: Base classes. (line 60) +* EXCEPTION (in module tkinter): File Handlers. (line 41) +* exception handler: Exceptions<2>. (line 6) +* exception() (asyncio.Future method): Future Object. (line 123) +* exception() (asyncio.Task method): Task Object. (line 73) +* exception() (concurrent.futures.Future method): Future Objects. + (line 54) +* exception() (in module logging): Module-Level Functions. + (line 148) +* exception() (in module sys): sys — System-specific parameters and functions. + (line 402) +* exception() (logging.Logger method): Logger Objects. (line 261) +* exception; AssertionError: The assert statement. + (line 21) +* exception; AttributeError: Attribute references. + (line 10) +* exception; chaining: The raise statement. + (line 30) +* exception; GeneratorExit: Generator-iterator methods. + (line 61) +* exception; GeneratorExit <1>: Asynchronous generator-iterator methods. + (line 55) +* exception; handler: The standard type hierarchy. + (line 847) +* exception; ImportError: The import statement. + (line 6) +* exception; NameError: Identifiers Names. (line 10) +* exception; StopAsyncIteration: Asynchronous generator-iterator methods. + (line 10) +* exception; StopIteration: Generator-iterator methods. + (line 12) +* exception; StopIteration <1>: The yield statement. + (line 6) +* exception; TypeError: Unary arithmetic and bitwise operations. + (line 22) +* exception; ValueError: Shifting operations. + (line 18) +* exception; ZeroDivisionError: Binary arithmetic operations. + (line 31) +* ExceptionGroup: Exception groups. (line 12) +* exceptions (BaseExceptionGroup attribute): Exception groups. + (line 38) +* exceptions; in CGI scripts: cgitb — Traceback manager for CGI scripts. + (line 8) +* exclusive; or: Binary bitwise operations. + (line 16) +* exc_info (doctest.UnexpectedException attribute): Debugging. + (line 225) +* exc_info (in module sys): The standard type hierarchy. + (line 847) +* exc_info() (in module sys): sys — System-specific parameters and functions. + (line 414) +* exc_info() (in module sys) <1>: Exceptions<19>. (line 45) +* exc_msg (doctest.Example attribute): Example Objects. (line 31) +* exc_type (traceback.TracebackException attribute): TracebackException Objects. + (line 51) +* EXDEV (in module errno): errno — Standard errno system symbols. + (line 102) +* exec (2to3 fixer): Fixers. (line 86) +* execfile (2to3 fixer): Fixers. (line 90) +* execl() (in module os): Process Management. (line 53) +* execle() (in module os): Process Management. (line 53) +* execlp() (in module os): Process Management. (line 53) +* execlpe() (in module os): Process Management. (line 53) +* executable (in module sys): sys — System-specific parameters and functions. + (line 451) +* executable (in module sys) <1>: Process-wide parameters. + (line 142) +* Executable Zip Files: zipapp — Manage executable Python zip archives. + (line 10) +* executable_filename() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 451) +* execute() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 478) +* execute() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 129) +* Execute() (msilib.View method): View Objects. (line 6) +* execute() (sqlite3.Connection method): Connection objects. (line 84) +* execute() (sqlite3.Cursor method): Cursor objects. (line 24) +* executemany() (sqlite3.Connection method): Connection objects. + (line 90) +* executemany() (sqlite3.Cursor method): Cursor objects. (line 41) +* executescript() (sqlite3.Connection method): Connection objects. + (line 96) +* executescript() (sqlite3.Cursor method): Cursor objects. (line 58) +* execution model: Execution model. (line 6) +* execution; frame: Structure of a program. + (line 18) +* execution; frame <1>: Class definitions. (line 6) +* execution; stack: The standard type hierarchy. + (line 847) +* ExecutionLoader (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 390) +* Executor (class in concurrent.futures): Executor Objects. (line 6) +* execv() (in module os): Process Management. (line 53) +* execve() (in module os): Process Management. (line 53) +* execvp() (in module os): Process Management. (line 53) +* execvpe() (in module os): Process Management. (line 53) +* exec_module() (importlib.abc.InspectLoader method): importlib abc – Abstract base classes related to import. + (line 377) +* exec_module() (importlib.abc.Loader method): importlib abc – Abstract base classes related to import. + (line 187) +* exec_module() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 524) +* exec_module() (importlib.machinery.ExtensionFileLoader method): importlib machinery – Importers and path hooks. + (line 329) +* exec_module() (zipimport.zipimporter method): zipimporter Objects. + (line 27) +* exec_prefix: Python-related paths and files. + (line 7) +* exec_prefix <1>: Include Files. (line 37) +* exec_prefix <2>: Include Files. (line 48) +* EXEC_PREFIX (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 26) +* exec_prefix (in module sys): sys — System-specific parameters and functions. + (line 434) +* ExFileSelectBox (class in tkinter.tix): File Selectors. (line 34) +* EXFULL (in module errno): errno — Standard errno system symbols. + (line 250) +* exists() (in module os.path): os path — Common pathname manipulations. + (line 109) +* exists() (pathlib.Path method): Methods<2>. (line 72) +* exists() (tkinter.ttk.Treeview method): ttk Treeview. (line 95) +* exists() (zipfile.Path method): Path Objects. (line 49) +* exit (built-in variable): Constants added by the site module. + (line 11) +* exit(): Process Control. (line 23) +* exit() (argparse.ArgumentParser method): Exiting methods. (line 6) +* exit() (in module sys): sys — System-specific parameters and functions. + (line 458) +* exit() (in module _thread): _thread — Low-level threading API. + (line 75) +* exitcode (multiprocessing.Process attribute): Process and exceptions. + (line 126) +* exitfunc (2to3 fixer): Fixers. (line 96) +* exitonclick() (in module turtle): Methods specific to Screen not inherited from TurtleScreen. + (line 10) +* ExitStack (class in contextlib): Utilities. (line 486) +* exp() (decimal.Context method): Context objects. (line 302) +* exp() (decimal.Decimal method): Decimal objects. (line 232) +* exp() (in module cmath): Power and logarithmic functions<2>. + (line 6) +* exp() (in module math): Power and logarithmic functions. + (line 12) +* exp2() (in module math): Power and logarithmic functions. + (line 18) +* expand() (re.Match method): Match Objects. (line 17) +* ExpandEnvironmentStrings() (in module winreg): Functions<12>. + (line 228) +* expandNode() (xml.dom.pulldom.DOMEventStream method): DOMEventStream Objects. + (line 21) +* expandtabs() (bytearray method): Bytes and Bytearray Operations. + (line 475) +* expandtabs() (bytes method): Bytes and Bytearray Operations. + (line 475) +* expandtabs() (str method): String Methods<2>. (line 90) +* expanduser() (in module os.path): os path — Common pathname manipulations. + (line 130) +* expanduser() (pathlib.Path method): Methods<2>. (line 89) +* expandvars() (in module os.path): os path — Common pathname manipulations. + (line 154) +* expand_tabs (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 167) +* Expat: xml parsers expat — Fast XML parsing using Expat. + (line 12) +* ExpatError: xml parsers expat — Fast XML parsing using Expat. + (line 25) +* expect() (telnetlib.Telnet method): Telnet Objects. (line 120) +* expected (asyncio.IncompleteReadError attribute): Exceptions<10>. + (line 51) +* expectedFailure() (in module unittest): Skipping tests and expected failures. + (line 98) +* expectedFailures (unittest.TestResult attribute): Loading and running tests. + (line 261) +* expired() (asyncio.Timeout method): Timeouts. (line 79) +* expires (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 49) +* exploded (ipaddress.IPv4Address attribute): Address objects. + (line 66) +* exploded (ipaddress.IPv4Network attribute): Network objects. + (line 109) +* exploded (ipaddress.IPv6Address attribute): Address objects. + (line 200) +* exploded (ipaddress.IPv6Network attribute): Network objects. + (line 321) +* expm1() (in module math): Power and logarithmic functions. + (line 24) +* expovariate() (in module random): Real-valued distributions. + (line 38) +* Expr (class in ast): Expressions<2>. (line 6) +* expression: Expressions. (line 6) +* expression <1>: Glossary. (line 420) +* expression; list: Expression lists. (line 6) +* expression; list <1>: Expression statements. + (line 6) +* expression; list <2>: Expression statements. + (line 6) +* expression; statement: Expression statements. + (line 6) +* expunge() (imaplib.IMAP4 method): IMAP4 Objects. (line 93) +* extend() (array.array method): array — Efficient arrays of numeric values. + (line 148) +* extend() (collections.deque method): deque objects. (line 59) +* extend() (sequence method): Mutable Sequence Types. + (line 16) +* extend() (xml.etree.ElementTree.Element method): Element Objects. + (line 93) +* ExtendedContext (class in decimal): Context objects. (line 76) +* ExtendedInterpolation (class in configparser): Interpolation of values. + (line 41) +* EXTENDED_ARG (opcode): Python Bytecode Instructions. + (line 891) +* extendleft() (collections.deque method): deque objects. (line 64) +* extend_path() (in module pkgutil): pkgutil — Package extension utility. + (line 19) +* Extension (class in distutils.core): distutils core — Core Distutils functionality. + (line 176) +* extension module: Glossary. (line 431) +* extension; module: The standard type hierarchy. + (line 6) +* ExtensionFileLoader (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 303) +* extensions_map (http.server.SimpleHTTPRequestHandler attribute): http server — HTTP servers. + (line 365) +* EXTENSION_SUFFIXES (in module importlib.machinery): importlib machinery – Importers and path hooks. + (line 50) +* External Data Representation: Data stream format. (line 6) +* External Data Representation <1>: xdrlib — Encode and decode XDR data. + (line 8) +* ExternalClashError: Exceptions<15>. (line 25) +* ExternalEntityParserCreate() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 44) +* ExternalEntityRefHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 333) +* external_attr (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 127) +* extra (zipfile.ZipInfo attribute): ZipInfo Objects. (line 93) +* extract() (tarfile.TarFile method): TarFile Objects. (line 162) +* extract() (traceback.StackSummary class method): StackSummary Objects. + (line 13) +* extract() (zipfile.ZipFile method): ZipFile Objects. (line 178) +* extractall() (tarfile.TarFile method): TarFile Objects. (line 136) +* extractall() (zipfile.ZipFile method): ZipFile Objects. (line 205) +* ExtractError: tarfile — Read and write tar archive files. + (line 208) +* extractfile() (tarfile.TarFile method): TarFile Objects. (line 190) +* extract_cookies() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 31) +* extract_stack() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 103) +* extract_tb() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 90) +* extract_version (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 107) +* extsep (in module os): Miscellaneous System Information. + (line 111) +* EX_CANTCREAT (in module os): Process Management. (line 204) +* EX_CONFIG (in module os): Process Management. (line 240) +* EX_DATAERR (in module os): Process Management. (line 153) +* EX_IOERR (in module os): Process Management. (line 211) +* EX_NOHOST (in module os): Process Management. (line 172) +* EX_NOINPUT (in module os): Process Management. (line 159) +* EX_NOPERM (in module os): Process Management. (line 233) +* EX_NOTFOUND (in module os): Process Management. (line 247) +* EX_NOUSER (in module os): Process Management. (line 166) +* EX_OK (in module os): Process Management. (line 138) +* EX_OSERR (in module os): Process Management. (line 190) +* EX_OSFILE (in module os): Process Management. (line 197) +* EX_PROTOCOL (in module os): Process Management. (line 226) +* EX_SOFTWARE (in module os): Process Management. (line 184) +* EX_TEMPFAIL (in module os): Process Management. (line 218) +* EX_UNAVAILABLE (in module os): Process Management. (line 178) +* EX_USAGE (in module os): Process Management. (line 146) +* f"; formatted string literal: String and Bytes literals. + (line 62) +* f’; formatted string literal: String and Bytes literals. + (line 62) +* f-string: String literal concatenation. + (line 24) +* f-string <1>: Glossary. (line 436) +* fabs() (in module math): Number-theoretic and representation functions. + (line 36) +* factorial() (in module math): Number-theoretic and representation functions. + (line 40) +* factory() (importlib.util.LazyLoader class method): importlib util – Utility code for importers. + (line 259) +* fail() (unittest.TestCase method): Test cases. (line 688) +* failfast (unittest.TestResult attribute): Loading and running tests. + (line 292) +* failureException (unittest.TestCase attribute): Test cases. + (line 693) +* failures (unittest.TestResult attribute): Loading and running tests. + (line 247) +* FAIL_FAST (in module doctest): Option Flags. (line 140) +* FakePath (class in test.support.os_helper): test support os_helper — Utilities for os tests. + (line 60) +* False: The standard type hierarchy. + (line 98) +* false: Truth Value Testing. + (line 6) +* False <1>: Truth Value Testing. + (line 23) +* False <2>: Boolean Values. (line 15) +* False (Built-in object): Truth Value Testing. + (line 15) +* False (built-in variable): Built-in Constants. (line 8) +* families() (in module tkinter.font): tkinter font — Tkinter font wrapper. + (line 88) +* family (socket.socket attribute): Socket Objects. (line 610) +* FancyGetopt (class in distutils.fancy_getopt): distutils fancy_getopt — Wrapper around the standard getopt module. + (line 36) +* FancyURLopener (class in urllib.request): Legacy interface. + (line 147) +* fancy_getopt() (in module distutils.fancy_getopt): distutils fancy_getopt — Wrapper around the standard getopt module. + (line 20) +* fast (pickle.Pickler attribute): Module Interface. (line 214) +* FastChildWatcher (class in asyncio): Process Watchers. (line 132) +* fatalError() (xml.sax.handler.ErrorHandler method): ErrorHandler Objects. + (line 24) +* Fault (class in xmlrpc.client): Fault Objects. (line 6) +* faultCode (xmlrpc.client.Fault attribute): Fault Objects. (line 11) +* faultString (xmlrpc.client.Fault attribute): Fault Objects. + (line 15) +* fchdir() (in module os): Files and Directories. + (line 273) +* fchmod() (in module os): File Descriptor Operations. + (line 107) +* fchown() (in module os): File Descriptor Operations. + (line 120) +* FCICreate() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 28) +* fcntl() (in module fcntl): fcntl — The fcntl and ioctl system calls. + (line 47) +* fd (selectors.SelectorKey attribute): Classes<3>. (line 40) +* fd() (in module turtle): Turtle motion. (line 6) +* fdatasync() (in module os): File Descriptor Operations. + (line 134) +* fdopen() (in module os): File Object Creation. + (line 9) +* fd_count() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 97) +* Feature (class in msilib): Features<3>. (line 6) +* feature_external_ges (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 81) +* feature_external_pes (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 88) +* feature_namespaces (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 53) +* feature_namespace_prefixes (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 60) +* feature_string_interning (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 67) +* feature_validation (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 74) +* feed() (email.parser.BytesFeedParser method): FeedParser API. + (line 56) +* feed() (html.parser.HTMLParser method): HTMLParser Methods. + (line 8) +* feed() (xml.etree.ElementTree.XMLParser method): XMLParser Objects. + (line 27) +* feed() (xml.etree.ElementTree.XMLPullParser method): XMLPullParser Objects. + (line 18) +* feed() (xml.sax.xmlreader.IncrementalParser method): IncrementalParser Objects. + (line 9) +* FeedParser (class in email.parser): FeedParser API. (line 71) +* fetch() (imaplib.IMAP4 method): IMAP4 Objects. (line 99) +* Fetch() (msilib.View method): View Objects. (line 18) +* fetchall() (sqlite3.Cursor method): Cursor objects. (line 103) +* fetchmany() (sqlite3.Cursor method): Cursor objects. (line 86) +* fetchone() (sqlite3.Cursor method): Cursor objects. (line 79) +* fflags (select.kevent attribute): Kevent Objects. (line 90) +* Field (class in dataclasses): Module contents<4>. (line 284) +* field() (in module dataclasses): Module contents<4>. (line 190) +* fieldnames (csv.csvreader attribute): Reader Objects. (line 31) +* fields (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 96) +* fields() (in module dataclasses): Module contents<4>. (line 304) +* field_size_limit() (in module csv): Module Contents<3>. (line 96) +* file (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 82) +* file (pyclbr.Class attribute): Class Objects<2>. (line 9) +* file (pyclbr.Function attribute): Function Objects. (line 9) +* file object: Glossary. (line 442) +* file object; io module: Overview<2>. (line 6) +* file object; open() built-in function: Built-in Functions. (line 1115) +* file-like object: Glossary. (line 458) +* file; byte-code: py_compile — Compile Python source files. + (line 8) +* file; byte-code <1>: imp — Access the import internals. + (line 19) +* file; copying: shutil — High-level file operations. + (line 8) +* file; large files: Large File Support. (line 6) +* file; mime.types: mimetypes — Map filenames to MIME types. + (line 124) +* file; modes: Built-in Functions. (line 1139) +* fileConfig() (in module logging.config): Configuration functions. + (line 61) +* FileCookieJar (class in http.cookiejar): http cookiejar — Cookie handling for HTTP clients. + (line 56) +* FileDialog (class in tkinter.filedialog): Native Load/Save Dialogs. + (line 78) +* FileEntry (class in tkinter.tix): File Selectors. (line 50) +* FileExistsError: OS exceptions. (line 63) +* FileFinder (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 160) +* FileHandler (class in logging): FileHandler. (line 10) +* FileHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 419) +* FileInput (class in fileinput): fileinput — Iterate over lines from multiple input streams. + (line 139) +* FileIO (class in io): Raw File I/O. (line 6) +* filelineno() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 104) +* FileLoader (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 409) +* filemode() (in module stat): stat — Interpreting stat results. + (line 121) +* filename (doctest.DocTest attribute): DocTest Objects. (line 36) +* filename (http.cookiejar.FileCookieJar attribute): CookieJar and FileCookieJar Objects. + (line 154) +* filename (inspect.FrameInfo attribute): The interpreter stack. + (line 17) +* filename (inspect.Traceback attribute): The interpreter stack. + (line 57) +* filename (OSError attribute): Concrete exceptions. + (line 178) +* filename (SyntaxError attribute): Concrete exceptions. + (line 281) +* filename (traceback.TracebackException attribute): TracebackException Objects. + (line 55) +* filename (tracemalloc.Frame attribute): Frame. (line 13) +* filename (zipfile.ZipFile attribute): ZipFile Objects. (line 342) +* filename (zipfile.ZipInfo attribute): ZipInfo Objects. (line 50) +* filename() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 86) +* filename2 (OSError attribute): Concrete exceptions. + (line 178) +* filenames; pathname expansion: glob — Unix style pathname pattern expansion. + (line 8) +* filenames; wildcard expansion: fnmatch — Unix filename pattern matching. + (line 8) +* filename_only (in module tabnanny): tabnanny — Detection of ambiguous indentation. + (line 31) +* filename_pattern (tracemalloc.Filter attribute): Filter. (line 54) +* fileno() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 36) +* fileno() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 91) +* fileno() (io.IOBase method): I/O Base Classes. (line 62) +* fileno() (multiprocessing.connection.Connection method): Connection Objects. + (line 31) +* fileno() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 28) +* fileno() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 14) +* fileno() (select.devpoll method): /dev/poll Polling Objects. + (line 24) +* fileno() (select.epoll method): Edge and Level Trigger Polling epoll Objects. + (line 73) +* fileno() (select.kqueue method): Kqueue Objects. (line 14) +* fileno() (selectors.DevpollSelector method): Classes<3>. (line 188) +* fileno() (selectors.EpollSelector method): Classes<3>. (line 179) +* fileno() (selectors.KqueueSelector method): Classes<3>. (line 199) +* fileno() (socket.socket method): Socket Objects. (line 118) +* fileno() (socketserver.BaseServer method): Server Objects<2>. + (line 14) +* fileno() (telnetlib.Telnet method): Telnet Objects. (line 96) +* FileNotFoundError: OS exceptions. (line 68) +* fileobj (selectors.SelectorKey attribute): Classes<3>. (line 36) +* files() (importlib.resources.abc.TraversableResources method): importlib resources abc – Abstract base classes for resources. + (line 149) +* files() (in module importlib.resources): importlib resources – Resources. + (line 45) +* FileSelectBox (class in tkinter.tix): File Selectors. (line 42) +* filesystem encoding and error handler: Glossary. (line 462) +* files_double_event() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 94) +* files_select_event() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 98) +* FileType (class in argparse): FileType objects. (line 6) +* FileWrapper (class in wsgiref.types): wsgiref types – WSGI types for static type checking. + (line 32) +* FileWrapper (class in wsgiref.util): wsgiref util – WSGI environment utilities. + (line 116) +* FILE_ATTRIBUTE_ARCHIVE (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_COMPRESSED (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_DEVICE (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_DIRECTORY (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_ENCRYPTED (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_HIDDEN (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_INTEGRITY_STREAM (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_NORMAL (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_NOT_CONTENT_INDEXED (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_NO_SCRUB_DATA (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_OFFLINE (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_READONLY (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_REPARSE_POINT (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_SPARSE_FILE (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_SYSTEM (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_TEMPORARY (in module stat): stat — Interpreting stat results. + (line 394) +* FILE_ATTRIBUTE_VIRTUAL (in module stat): stat — Interpreting stat results. + (line 394) +* file_digest() (in module hashlib): File hashing. (line 9) +* file_dispatcher (class in asyncore): asyncore — Asynchronous socket handler. + (line 263) +* file_open() (urllib.request.FileHandler method): FileHandler Objects. + (line 6) +* file_size (zipfile.ZipInfo attribute): ZipInfo Objects. (line 143) +* file_wrapper (class in asyncore): asyncore — Asynchronous socket handler. + (line 273) +* fill() (in module textwrap): textwrap — Text wrapping and filling. + (line 33) +* fill() (textwrap.TextWrapper method): textwrap — Text wrapping and filling. + (line 296) +* fillcolor() (in module turtle): Color control. (line 58) +* filling() (in module turtle): Filling. (line 6) +* fillvalue (reprlib.Repr attribute): Repr Objects. (line 10) +* filter (2to3 fixer): Fixers. (line 101) +* Filter (class in logging): Filter Objects. (line 13) +* Filter (class in tracemalloc): Filter. (line 6) +* filter (select.kevent attribute): Kevent Objects. (line 15) +* filter() (in module curses): Functions<5>. (line 121) +* filter() (in module fnmatch): fnmatch — Unix filename pattern matching. + (line 70) +* filter() (logging.Filter method): Filter Objects. (line 20) +* filter() (logging.Handler method): Handler Objects. (line 60) +* filter() (logging.Logger method): Logger Objects. (line 276) +* filterfalse() (in module itertools): Itertool functions. (line 284) +* filterwarnings() (in module warnings): Available Functions. + (line 77) +* filter_command() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 102) +* FILTER_DIR (in module unittest.mock): FILTER_DIR. (line 6) +* filter_traces() (tracemalloc.Snapshot method): Snapshot. (line 35) +* Final (in module typing): Special forms. (line 283) +* final() (in module typing): Functions and decorators. + (line 278) +* finalization, of objects: Finalization and De-allocation. + (line 6) +* finalize (class in weakref): weakref — Weak references. + (line 237) +* finalizer: Basic customization. + (line 55) +* finalize_options() (distutils.cmd.Command method): Creating a new Distutils command. + (line 30) +* find() (bytearray method): Bytes and Bytearray Operations. + (line 126) +* find() (bytes method): Bytes and Bytearray Operations. + (line 126) +* find() (doctest.DocTestFinder method): DocTestFinder objects. + (line 32) +* find() (in module gettext): Class-based API. (line 14) +* find() (mmap.mmap method): mmap — Memory-mapped file support. + (line 185) +* find() (str method): String Methods<2>. (line 111) +* find() (xml.etree.ElementTree.Element method): Element Objects. + (line 101) +* find() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 21) +* findall() (in module re): Functions<2>. (line 112) +* findall() (re.Pattern method): Regular Expression Objects. + (line 79) +* findall() (xml.etree.ElementTree.Element method): Element Objects. + (line 110) +* findall() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 26) +* findCaller() (logging.Logger method): Logger Objects. (line 293) +* finder: Finders and loaders. + (line 6) +* finder <1>: Glossary. (line 482) +* Finder (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 28) +* finder; find_spec: The meta path. (line 6) +* findfactor() (in module audioop): audioop — Manipulate raw audio data. + (line 82) +* findfile() (in module test.support): test support — Utilities for the Python test suite. + (line 216) +* findfit() (in module audioop): audioop — Manipulate raw audio data. + (line 91) +* finditer() (in module re): Functions<2>. (line 134) +* finditer() (re.Pattern method): Regular Expression Objects. + (line 85) +* findlabels() (in module dis): Analysis functions. (line 150) +* findlinestarts() (in module dis): Analysis functions. (line 137) +* findmatch() (in module mailcap): mailcap — Mailcap file handling. + (line 28) +* findmax() (in module audioop): audioop — Manipulate raw audio data. + (line 102) +* findtext() (xml.etree.ElementTree.Element method): Element Objects. + (line 119) +* findtext() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 31) +* find_class() (pickle protocol): Restricting Globals. + (line 6) +* find_class() (pickle.Unpickler method): Module Interface. (line 286) +* find_library() (in module ctypes.util): Utility functions. (line 89) +* find_library_file() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 204) +* find_loader() (importlib.abc.PathEntryFinder method): importlib abc – Abstract base classes related to import. + (line 125) +* find_loader() (importlib.machinery.FileFinder method): importlib machinery – Importers and path hooks. + (line 197) +* find_loader() (in module importlib): Functions<11>. (line 40) +* find_loader() (in module pkgutil): pkgutil — Package extension utility. + (line 77) +* find_loader() (zipimport.zipimporter method): zipimporter Objects. + (line 34) +* find_longest_match() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 64) +* find_module() (imp.NullImporter method): imp — Access the import internals. + (line 355) +* find_module() (importlib.abc.Finder method): importlib abc – Abstract base classes related to import. + (line 35) +* find_module() (importlib.abc.MetaPathFinder method): importlib abc – Abstract base classes related to import. + (line 71) +* find_module() (importlib.abc.PathEntryFinder method): importlib abc – Abstract base classes related to import. + (line 149) +* find_module() (importlib.machinery.PathFinder class method): importlib machinery – Importers and path hooks. + (line 139) +* find_module() (in module imp): imp — Access the import internals. + (line 41) +* find_module() (zipimport.zipimporter method): zipimporter Objects. + (line 42) +* find_msvcrt() (in module ctypes.util): Utility functions. (line 98) +* find_spec() (importlib.abc.MetaPathFinder method): importlib abc – Abstract base classes related to import. + (line 57) +* find_spec() (importlib.abc.PathEntryFinder method): importlib abc – Abstract base classes related to import. + (line 112) +* find_spec() (importlib.machinery.FileFinder method): importlib machinery – Importers and path hooks. + (line 190) +* find_spec() (importlib.machinery.PathFinder class method): importlib machinery – Importers and path hooks. + (line 116) +* find_spec() (in module importlib.util): importlib util – Utility code for importers. + (line 101) +* find_spec() (zipimport.zipimporter method): zipimporter Objects. + (line 54) +* find_unused_port() (in module test.support.socket_helper): test support socket_helper — Utilities for socket tests. + (line 15) +* find_user_password() (urllib.request.HTTPPasswordMgr method): HTTPPasswordMgr Objects. + (line 16) +* find_user_password() (urllib.request.HTTPPasswordMgrWithPriorAuth method): HTTPPasswordMgrWithPriorAuth Objects. + (line 19) +* finish() (socketserver.BaseRequestHandler method): Request Handler Objects. + (line 35) +* finish() (tkinter.dnd.DndHandler method): tkinter dnd — Drag and drop support. + (line 52) +* finish_request() (socketserver.BaseServer method): Server Objects<2>. + (line 125) +* firstChild (xml.dom.Node attribute): Node Objects. (line 54) +* firstkey() (dbm.gnu.gdbm method): dbm gnu — GNU’s reinterpretation of dbm. + (line 88) +* firstweekday() (in module calendar): calendar — General calendar-related functions. + (line 294) +* fix_missing_locations() (in module ast): ast Helpers. (line 124) +* fix_sentence_endings (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 222) +* Flag (class in enum): Data Types<2>. (line 328) +* FlagBoundary (class in enum): Data Types<2>. (line 534) +* flags (in module sys): sys — System-specific parameters and functions. + (line 489) +* flags (re.Pattern attribute): Regular Expression Objects. + (line 101) +* flags (select.kevent attribute): Kevent Objects. (line 52) +* flag_bits (zipfile.ZipInfo attribute): ZipInfo Objects. (line 115) +* flash() (in module curses): Functions<5>. (line 132) +* flatten() (email.generator.BytesGenerator method): email generator Generating MIME documents. + (line 80) +* flatten() (email.generator.Generator method): email generator Generating MIME documents. + (line 175) +* flattening; objects: pickle — Python object serialization. + (line 8) +* float (built-in class): Built-in Functions. (line 628) +* floating point literal: Numeric literals. (line 6) +* floating point; literals: Numeric Types — int float complex. + (line 19) +* floating point; number: The standard type hierarchy. + (line 112) +* FloatingPointError: Concrete exceptions. + (line 33) +* FloatOperation (class in decimal): Signals. (line 100) +* float_info (in module sys): sys — System-specific parameters and functions. + (line 569) +* float_repr_style (in module sys): sys — System-specific parameters and functions. + (line 653) +* flock() (in module fcntl): fcntl — The fcntl and ioctl system calls. + (line 127) +* floor division: Glossary. (line 494) +* floor() (in module math): Numeric Types — int float complex. + (line 104) +* floor() (in module math) <1>: Number-theoretic and representation functions. + (line 48) +* FloorDiv (class in ast): Expressions<2>. (line 54) +* floordiv() (in module operator): operator — Standard operators as functions. + (line 88) +* flush() (bz2.BZ2Compressor method): Incremental de compression. + (line 25) +* flush() (io.BufferedWriter method): Buffered Streams. (line 125) +* flush() (io.IOBase method): I/O Base Classes. (line 68) +* flush() (logging.Handler method): Handler Objects. (line 68) +* flush() (logging.handlers.BufferingHandler method): MemoryHandler. + (line 30) +* flush() (logging.handlers.MemoryHandler method): MemoryHandler. + (line 60) +* flush() (logging.StreamHandler method): StreamHandler. (line 25) +* flush() (lzma.LZMACompressor method): Compressing and decompressing data in memory. + (line 91) +* flush() (mailbox.Mailbox method): Mailbox objects. (line 242) +* flush() (mailbox.Maildir method): Maildir. (line 102) +* flush() (mailbox.MH method): MH. (line 99) +* flush() (mmap.mmap method): mmap — Memory-mapped file support. + (line 195) +* flush() (zlib.Compress method): zlib — Compression compatible with gzip. + (line 211) +* flush() (zlib.Decompress method): zlib — Compression compatible with gzip. + (line 283) +* flushinp() (in module curses): Functions<5>. (line 139) +* FlushKey() (in module winreg): Functions<12>. (line 239) +* flush_headers() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 284) +* flush_std_streams() (in module test.support): test support — Utilities for the Python test suite. + (line 380) +* fma() (decimal.Context method): Context objects. (line 306) +* fma() (decimal.Decimal method): Decimal objects. (line 270) +* fmean() (in module statistics): Function details. (line 49) +* fmod() (in module math): Number-theoretic and representation functions. + (line 54) +* FMT_BINARY (in module plistlib): plistlib — Generate and parse Apple plist files. + (line 141) +* FMT_XML (in module plistlib): plistlib — Generate and parse Apple plist files. + (line 135) +* fnmatch() (in module fnmatch): fnmatch — Unix filename pattern matching. + (line 45) +* fnmatchcase() (in module fnmatch): fnmatch — Unix filename pattern matching. + (line 64) +* focus() (tkinter.ttk.Treeview method): ttk Treeview. (line 99) +* fold (datetime.datetime attribute): datetime Objects. (line 306) +* fold (datetime.time attribute): time Objects. (line 71) +* fold() (email.headerregistry.BaseHeader method): email headerregistry Custom Header Objects. + (line 72) +* fold() (email.policy.Compat32 method): email policy Policy Objects. + (line 584) +* fold() (email.policy.EmailPolicy method): email policy Policy Objects. + (line 450) +* fold() (email.policy.Policy method): email policy Policy Objects. + (line 319) +* fold_binary() (email.policy.Compat32 method): email policy Policy Objects. + (line 592) +* fold_binary() (email.policy.EmailPolicy method): email policy Policy Objects. + (line 470) +* fold_binary() (email.policy.Policy method): email policy Policy Objects. + (line 334) +* Font (class in tkinter.font): tkinter font — Tkinter font wrapper. + (line 20) +* For (class in ast): Control flow. (line 45) +* for; in comprehensions: Displays for lists sets and dictionaries. + (line 14) +* forget() (in module test.support.import_helper): test support import_helper — Utilities for import tests. + (line 11) +* forget() (tkinter.ttk.Notebook method): ttk Notebook. (line 18) +* fork() (in module os): Process Management. (line 253) +* fork() (in module pty): pty — Pseudo-terminal utilities. + (line 20) +* ForkingMixIn (class in socketserver): Server Creation Notes. + (line 28) +* ForkingTCPServer (class in socketserver): Server Creation Notes. + (line 62) +* ForkingUDPServer (class in socketserver): Server Creation Notes. + (line 62) +* forkpty() (in module os): Process Management. (line 272) +* Form (class in tkinter.tix): Form Geometry Manager. + (line 9) +* format (memoryview attribute): Memory Views. (line 417) +* format (multiprocessing.shared_memory.ShareableList attribute): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 273) +* format (struct.Struct attribute): Classes<2>. (line 55) +* format() (built-in function); __str__() (object method): Basic customization. + (line 128) +* format() (in module locale): locale — Internationalization services. + (line 437) +* format() (logging.BufferingFormatter method): Formatter Objects. + (line 161) +* format() (logging.Formatter method): Formatter Objects. (line 58) +* format() (logging.Handler method): Handler Objects. (line 102) +* format() (pprint.PrettyPrinter method): PrettyPrinter Objects. + (line 40) +* format() (str method): String Methods<2>. (line 125) +* format() (string.Formatter method): Custom String Formatting. + (line 17) +* format() (traceback.StackSummary method): StackSummary Objects. + (line 36) +* format() (traceback.TracebackException method): TracebackException Objects. + (line 93) +* format() (tracemalloc.Traceback method): Traceback. (line 37) +* formataddr() (in module email.utils): email utils Miscellaneous utilities. + (line 67) +* formatargvalues() (in module inspect): Classes and functions<2>. + (line 73) +* formatdate() (in module email.utils): email utils Miscellaneous utilities. + (line 141) +* FormatError: Exceptions<15>. (line 32) +* FormatError() (in module ctypes): Utility functions. (line 108) +* formatException() (logging.Formatter method): Formatter Objects. + (line 123) +* formatFooter() (logging.BufferingFormatter method): Formatter Objects. + (line 154) +* formatHeader() (logging.BufferingFormatter method): Formatter Objects. + (line 147) +* formatmonth() (calendar.HTMLCalendar method): calendar — General calendar-related functions. + (line 169) +* formatmonth() (calendar.TextCalendar method): calendar — General calendar-related functions. + (line 134) +* formatStack() (logging.Formatter method): Formatter Objects. + (line 131) +* formatted string literal: String literal concatenation. + (line 24) +* FormattedValue (class in ast): Literals<3>. (line 18) +* Formatter (class in logging): Formatter Objects. (line 26) +* Formatter (class in string): Custom String Formatting. + (line 13) +* formatTime() (logging.Formatter method): Formatter Objects. + (line 83) +* formatting, string (%): printf-style String Formatting. + (line 6) +* formatting; bytearray (%): printf-style Bytes Formatting. + (line 6) +* formatting; bytes (%): printf-style Bytes Formatting. + (line 6) +* formatwarning() (in module warnings): Available Functions. + (line 68) +* formatyear() (calendar.HTMLCalendar method): calendar — General calendar-related functions. + (line 175) +* formatyear() (calendar.TextCalendar method): calendar — General calendar-related functions. + (line 148) +* formatyearpage() (calendar.HTMLCalendar method): calendar — General calendar-related functions. + (line 180) +* format_datetime() (in module email.utils): email utils Miscellaneous utilities. + (line 162) +* format_exc() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 155) +* format_exception() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 139) +* format_exception_only() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 120) +* format_exception_only() (traceback.TracebackException method): TracebackException Objects. + (line 108) +* format_field() (string.Formatter method): Custom String Formatting. + (line 102) +* format_frame_summary() (traceback.StackSummary method): StackSummary Objects. + (line 51) +* format_help() (argparse.ArgumentParser method): Printing help. + (line 30) +* format_list() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 110) +* format_map() (str method): String Methods<2>. (line 155) +* format_stack() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 164) +* format_stack_entry() (bdb.Bdb method): bdb — Debugger framework. + (line 405) +* format_string() (in module locale): locale — Internationalization services. + (line 420) +* format_tb() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 160) +* format_usage() (argparse.ArgumentParser method): Printing help. + (line 25) +* FORMAT_VALUE (opcode): Python Bytecode Instructions. + (line 899) +* Fortran contiguous: shape strides suboffsets. + (line 25) +* Fortran contiguous <1>: Glossary. (line 295) +* forward() (in module turtle): Turtle motion. (line 6) +* ForwardRef (class in typing): Introspection helpers. + (line 82) +* FOR_ITER (opcode): Python Bytecode Instructions. + (line 675) +* found_terminator() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 96) +* fpathconf() (in module os): File Descriptor Operations. + (line 143) +* fqdn (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 90) +* Fraction (class in fractions): fractions — Rational numbers. + (line 16) +* Frame (class in tracemalloc): Frame. (line 6) +* frame (inspect.FrameInfo attribute): The interpreter stack. + (line 13) +* frame (tkinter.scrolledtext.ScrolledText attribute): tkinter scrolledtext — Scrolled Text Widget. + (line 26) +* FrameInfo (class in inspect): The interpreter stack. + (line 11) +* FrameSummary (class in traceback): FrameSummary Objects. + (line 11) +* FrameType (in module types): Standard Interpreter Types. + (line 233) +* free(): Overview<4>. (line 33) +* free; variable: Binding of names. (line 44) +* freedesktop_os_release() (in module platform): Linux Platforms. + (line 6) +* freefunc (C type): Slot Type typedefs. (line 27) +* freeze utility: Importing Modules<2>. + (line 261) +* freeze() (in module gc): gc — Garbage Collector interface. + (line 202) +* freeze_support() (in module multiprocessing): Miscellaneous<3>. + (line 44) +* frexp() (in module math): Number-theoretic and representation functions. + (line 70) +* FRIDAY (in module calendar): calendar — General calendar-related functions. + (line 387) +* from; import statement: Binding of names. (line 9) +* from; import statement <1>: The import statement. + (line 51) +* from; yield from expression: Yield expressions. (line 64) +* frombuf() (tarfile.TarInfo class method): TarInfo Objects. (line 19) +* frombytes() (array.array method): array — Efficient arrays of numeric values. + (line 156) +* fromfd() (in module socket): Creating sockets. (line 156) +* fromfd() (select.epoll method): Edge and Level Trigger Polling epoll Objects. + (line 77) +* fromfd() (select.kqueue method): Kqueue Objects. (line 18) +* fromfile() (array.array method): array — Efficient arrays of numeric values. + (line 165) +* fromhex() (bytearray class method): Bytearray Objects. (line 36) +* fromhex() (bytes class method): Bytes Objects. (line 62) +* fromhex() (float class method): Additional Methods on Float. + (line 39) +* fromisocalendar() (datetime.date class method): date Objects. + (line 81) +* fromisocalendar() (datetime.datetime class method): datetime Objects. + (line 230) +* fromisoformat() (datetime.date class method): date Objects. + (line 63) +* fromisoformat() (datetime.datetime class method): datetime Objects. + (line 187) +* fromisoformat() (datetime.time class method): time Objects. + (line 113) +* fromkeys() (collections.Counter method): Counter objects. (line 116) +* fromkeys() (dict class method): Mapping Types — dict. + (line 145) +* fromlist() (array.array method): array — Efficient arrays of numeric values. + (line 172) +* fromordinal() (datetime.date class method): date Objects. (line 54) +* fromordinal() (datetime.datetime class method): datetime Objects. + (line 161) +* fromshare() (in module socket): Creating sockets. (line 173) +* fromstring() (in module xml.etree.ElementTree): Functions<8>. + (line 99) +* fromstringlist() (in module xml.etree.ElementTree): Functions<8>. + (line 107) +* fromtarfile() (tarfile.TarInfo class method): TarInfo Objects. + (line 26) +* fromtimestamp() (datetime.date class method): date Objects. + (line 35) +* fromtimestamp() (datetime.datetime class method): datetime Objects. + (line 93) +* fromunicode() (array.array method): array — Efficient arrays of numeric values. + (line 178) +* fromutc() (datetime.timezone method): timezone Objects. (line 61) +* fromutc() (datetime.tzinfo method): tzinfo Objects. (line 163) +* from_address() (ctypes._CData method): Data types. (line 42) +* from_buffer() (ctypes._CData method): Data types. (line 19) +* from_buffer_copy() (ctypes._CData method): Data types. (line 31) +* from_bytes() (int class method): Additional Methods on Integer Types. + (line 110) +* from_callable() (inspect.Signature class method): Introspecting callables with the Signature object. + (line 143) +* from_decimal() (fractions.Fraction class method): fractions — Rational numbers. + (line 129) +* from_exception() (traceback.TracebackException class method): TracebackException Objects. + (line 76) +* from_file() (zipfile.ZipInfo class method): ZipInfo Objects. + (line 14) +* from_file() (zoneinfo.ZoneInfo class method): The ZoneInfo class. + (line 28) +* from_float() (decimal.Decimal class method): Decimal objects. + (line 243) +* from_float() (fractions.Fraction class method): fractions — Rational numbers. + (line 118) +* from_iterable() (itertools.chain class method): Itertool functions. + (line 98) +* from_list() (traceback.StackSummary class method): StackSummary Objects. + (line 29) +* from_param() (ctypes._CData method): Data types. (line 51) +* from_samples() (statistics.NormalDist class method): NormalDist objects. + (line 45) +* from_traceback() (dis.Bytecode class method): Bytecode analysis. + (line 34) +* FrozenImporter (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 80) +* FrozenInstanceError: Module contents<4>. (line 474) +* frozenset (built-in class): Set Types — set frozenset. + (line 33) +* FrozenSet (class in typing): Corresponding to built-in types. + (line 49) +* fsdecode() (in module os): Process Parameters. (line 90) +* fsencode() (in module os): Process Parameters. (line 77) +* fspath() (in module os): Process Parameters. (line 103) +* fstat() (in module os): File Descriptor Operations. + (line 165) +* fstatvfs() (in module os): File Descriptor Operations. + (line 177) +* fstring: String literal concatenation. + (line 24) +* fsum() (in module math): Number-theoretic and representation functions. + (line 78) +* fsync() (in module os): File Descriptor Operations. + (line 185) +* fs_is_case_insensitive() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 101) +* FS_NONASCII (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 11) +* FTP: urllib request Restrictions. + (line 37) +* FTP (class in ftplib): ftplib — FTP protocol client. + (line 48) +* FTP; ftplib (standard module): ftplib — FTP protocol client. + (line 8) +* FTP; protocol: urllib request Restrictions. + (line 6) +* FTP; protocol <1>: ftplib — FTP protocol client. + (line 8) +* FTPHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 429) +* ftp_open() (urllib.request.FTPHandler method): FTPHandler Objects. + (line 6) +* FTP_TLS (class in ftplib): ftplib — FTP protocol client. + (line 88) +* ftruncate() (in module os): File Descriptor Operations. + (line 198) +* Full: queue — A synchronized queue class. + (line 88) +* full() (asyncio.Queue method): Queue. (line 31) +* full() (multiprocessing.Queue method): Pipes and Queues. (line 114) +* full() (queue.Queue method): Queue Objects. (line 22) +* fullmatch() (in module re): Functions<2>. (line 60) +* fullmatch() (re.Pattern method): Regular Expression Objects. + (line 56) +* full_url (urllib.request.Request attribute): Request Objects. + (line 11) +* func (functools.partial attribute): partial Objects. (line 9) +* funcattrs (2to3 fixer): Fixers. (line 105) +* funcname (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 101) +* function: Glossary. (line 501) +* Function (class in symtable): Examining Symbol Tables. + (line 63) +* function (inspect.FrameInfo attribute): The interpreter stack. + (line 27) +* function (inspect.Traceback attribute): The interpreter stack. + (line 67) +* function annotation: Glossary. (line 509) +* function; annotations: Function Annotations. + (line 6) +* function; annotations <1>: Function definitions. + (line 97) +* function; argument: The standard type hierarchy. + (line 297) +* function; call: The standard type hierarchy. + (line 297) +* function; call <1>: Calls. (line 132) +* function; call <2>: Calls. (line 141) +* function; definition: The return statement. + (line 6) +* function; definition <1>: Function definitions. + (line 6) +* function; generator: The yield statement. + (line 6) +* function; name: Function definitions. + (line 6) +* function; name <1>: Function definitions. + (line 6) +* FunctionDef (class in ast): Function and class definitions. + (line 6) +* FunctionTestCase (class in unittest): Test cases. (line 946) +* FunctionType (in module types): Standard Interpreter Types. + (line 25) +* funny_files (filecmp.dircmp attribute): The dircmp class. (line 95) +* future (2to3 fixer): Fixers. (line 111) +* Future (class in asyncio): Future Object. (line 6) +* Future (class in concurrent.futures): Future Objects. (line 10) +* future; statement: Future statements. (line 6) +* FutureWarning: Warnings. (line 51) +* fwalk() (in module os): Files and Directories. + (line 1598) +* f_back (frame attribute): The standard type hierarchy. + (line 800) +* f_builtins (frame attribute): The standard type hierarchy. + (line 800) +* f_code (frame attribute): The standard type hierarchy. + (line 800) +* f_contiguous (memoryview attribute): Memory Views. (line 476) +* f_globals (frame attribute): The standard type hierarchy. + (line 800) +* f_lasti (frame attribute): The standard type hierarchy. + (line 800) +* f_lineno (frame attribute): The standard type hierarchy. + (line 812) +* f_locals (frame attribute): The standard type hierarchy. + (line 800) +* F_LOCK (in module os): File Descriptor Operations. + (line 245) +* F_OK (in module os): Files and Directories. + (line 106) +* F_TEST (in module os): File Descriptor Operations. + (line 245) +* F_TLOCK (in module os): File Descriptor Operations. + (line 245) +* f_trace (frame attribute): The standard type hierarchy. + (line 812) +* f_trace_lines (frame attribute): The standard type hierarchy. + (line 812) +* f_trace_opcodes (frame attribute): The standard type hierarchy. + (line 812) +* F_ULOCK (in module os): File Descriptor Operations. + (line 245) +* G.722: aifc — Read and write AIFF and AIFC files. + (line 163) +* gaierror: Exceptions<12>. (line 27) +* gamma() (in module math): Special functions. (line 29) +* gammavariate() (in module random): Real-valued distributions. + (line 46) +* garbage (in module gc): gc — Garbage Collector interface. + (line 230) +* garbage collection: Objects values and types. + (line 37) +* garbage collection <1>: Glossary. (line 543) +* gather() (curses.textpad.Textbox method): Textbox objects. (line 109) +* gather() (in module asyncio): Running Tasks Concurrently. + (line 6) +* gauss() (in module random): Real-valued distributions. + (line 57) +* gcd() (in module math): Number-theoretic and representation functions. + (line 98) +* gc_collect() (in module test.support): test support — Utilities for the Python test suite. + (line 333) +* ge() (in module operator): operator — Standard operators as functions. + (line 24) +* generate_help() (distutils.fancy_getopt.FancyGetopt method): distutils fancy_getopt — Wrapper around the standard getopt module. + (line 68) +* generate_tokens() (in module tokenize): Tokenizing Input. (line 38) +* generator: Glossary. (line 552) +* generator <1>: Glossary. (line 552) +* Generator (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 51) +* Generator (class in email.generator): email generator Generating MIME documents. + (line 140) +* Generator (class in typing): Corresponding to other types in collections abc. + (line 22) +* generator expression: Glossary. (line 574) +* generator expression <1>: Glossary. (line 574) +* generator iterator: Glossary. (line 562) +* generator; expression: Generator expressions. + (line 6) +* generator; function: The standard type hierarchy. + (line 452) +* generator; function <1>: Yield expressions. (line 6) +* generator; function <2>: The yield statement. + (line 6) +* generator; iterator: The standard type hierarchy. + (line 452) +* generator; iterator <1>: The yield statement. + (line 6) +* GeneratorExit: Concrete exceptions. + (line 37) +* GeneratorExp (class in ast): Comprehensions. (line 6) +* GeneratorType (in module types): Standard Interpreter Types. + (line 37) +* Generic (class in typing): Building generic types. + (line 9) +* generic function: Glossary. (line 583) +* generic type: Glossary. (line 591) +* Generic; Alias: Generic Alias Type. (line 6) +* generic; special; attribute: The standard type hierarchy. + (line 13) +* GenericAlias (class in types): Standard Interpreter Types. + (line 200) +* generic_visit() (ast.NodeVisitor method): ast Helpers. (line 179) +* genops() (in module pickletools): Programmatic Interface<2>. + (line 22) +* gen_lib_options() (in module distutils.ccompiler): distutils ccompiler — CCompiler base class. + (line 14) +* gen_preprocess_options() (in module distutils.ccompiler): distutils ccompiler — CCompiler base class. + (line 24) +* gen_uuid() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 111) +* geometric_mean() (in module statistics): Function details. (line 77) +* get() (asyncio.Queue method): Queue. (line 39) +* get() (configparser.ConfigParser method): ConfigParser Objects. + (line 188) +* get() (contextvars.Context method): Manual Context Management. + (line 85) +* get() (contextvars.ContextVar method): Context Variables. (line 30) +* get() (dict method): Mapping Types — dict. + (line 157) +* get() (email.message.EmailMessage method): email message Representing an email message. + (line 245) +* get() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 353) +* get() (in module webbrowser): webbrowser — Convenient web-browser controller. + (line 82) +* get() (mailbox.Mailbox method): Mailbox objects. (line 140) +* get() (multiprocessing.pool.AsyncResult method): Process Pools. + (line 196) +* get() (multiprocessing.Queue method): Pipes and Queues. (line 140) +* get() (multiprocessing.SimpleQueue method): Pipes and Queues. + (line 223) +* get() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 60) +* get() (queue.Queue method): Queue Objects. (line 44) +* get() (queue.SimpleQueue method): SimpleQueue Objects. + (line 40) +* get() (tkinter.ttk.Combobox method): ttk Combobox. (line 15) +* get() (tkinter.ttk.Spinbox method): ttk Spinbox. (line 8) +* get() (types.MappingProxyType method): Standard Interpreter Types. + (line 296) +* get() (xml.etree.ElementTree.Element method): Element Objects. + (line 64) +* getacl() (imaplib.IMAP4 method): IMAP4 Objects. (line 106) +* getaddresses() (in module email.utils): email utils Miscellaneous utilities. + (line 81) +* getaddrinfo() (asyncio.loop method): DNS. (line 6) +* getaddrinfo() (in module socket): Other functions<2>. (line 17) +* getallocatedblocks() (in module sys): sys — System-specific parameters and functions. + (line 665) +* getandroidapilevel() (in module sys): sys — System-specific parameters and functions. + (line 680) +* getannotation() (imaplib.IMAP4 method): IMAP4 Objects. (line 111) +* getargvalues() (in module inspect): Classes and functions<2>. + (line 62) +* getatime() (in module os.path): os path — Common pathname manipulations. + (line 166) +* getattrfunc (C type): Slot Type typedefs. (line 43) +* getAttribute() (xml.dom.Element method): Element Objects<2>. + (line 31) +* getAttributeNode() (xml.dom.Element method): Element Objects<2>. + (line 37) +* getAttributeNodeNS() (xml.dom.Element method): Element Objects<2>. + (line 47) +* getAttributeNS() (xml.dom.Element method): Element Objects<2>. + (line 41) +* getattrofunc (C type): Slot Type typedefs. (line 54) +* getattr_static() (in module inspect): Fetching attributes statically. + (line 16) +* GetBase() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 31) +* getbegyx() (curses.window method): Window Objects. (line 225) +* getbkgd() (curses.window method): Window Objects. (line 229) +* getblocking() (socket.socket method): Socket Objects. (line 163) +* getboolean() (configparser.ConfigParser method): ConfigParser Objects. + (line 222) +* getbuffer() (io.BytesIO method): Buffered Streams. (line 21) +* getbufferproc (C type): Slot Type typedefs. (line 99) +* getByteStream() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 48) +* getcallargs() (in module inspect): Classes and functions<2>. + (line 92) +* getcanvas() (in module turtle): Settings and special methods. + (line 55) +* getcapabilities() (nntplib.NNTP method): Methods<3>. (line 34) +* getcaps() (in module mailcap): mailcap — Mailcap file handling. + (line 78) +* getch() (curses.window method): Window Objects. (line 234) +* getch() (in module msvcrt): Console I/O. (line 10) +* getCharacterStream() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 64) +* getche() (in module msvcrt): Console I/O. (line 25) +* getChild() (logging.Logger method): Logger Objects. (line 118) +* getclasstree() (in module inspect): Classes and functions<2>. + (line 6) +* getclosurevars() (in module inspect): Classes and functions<2>. + (line 122) +* GetColumnInfo() (msilib.View method): View Objects. (line 12) +* getColumnNumber() (xml.sax.xmlreader.Locator method): Locator Objects. + (line 8) +* getcomments() (in module inspect): Retrieving source code. + (line 18) +* getcompname() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 76) +* getcompname() (sunau.AU_read method): AU_read Objects. (line 35) +* getcompname() (wave.Wave_read method): Wave_read Objects. (line 35) +* getcomptype() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 70) +* getcomptype() (sunau.AU_read method): AU_read Objects. (line 30) +* getcomptype() (wave.Wave_read method): Wave_read Objects. (line 31) +* getContentHandler() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 21) +* getcontext() (in module decimal): Context objects. (line 14) +* getcoroutinelocals() (in module inspect): Current State of Generators and Coroutines. + (line 73) +* getcoroutinestate() (in module inspect): Current State of Generators and Coroutines. + (line 28) +* getctime() (in module os.path): os path — Common pathname manipulations. + (line 182) +* getcwd() (in module os): Files and Directories. + (line 285) +* getcwdb() (in module os): Files and Directories. + (line 289) +* getcwdu (2to3 fixer): Fixers. (line 115) +* getdecoder() (in module codecs): codecs — Codec registry and base classes. + (line 107) +* getdefaultencoding() (in module sys): sys — System-specific parameters and functions. + (line 688) +* getdefaultlocale() (in module locale): locale — Internationalization services. + (line 301) +* getdefaulttimeout() (in module socket): Other functions<2>. + (line 345) +* getdlopenflags() (in module sys): sys — System-specific parameters and functions. + (line 693) +* getdoc() (in module inspect): Retrieving source code. + (line 6) +* getDOMImplementation() (in module xml.dom): Module Contents<4>. + (line 17) +* getDTDHandler() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 30) +* getEffectiveLevel() (logging.Logger method): Logger Objects. + (line 109) +* getegid() (in module os): Process Parameters. (line 172) +* getElementsByTagName() (xml.dom.Document method): Document Objects. + (line 61) +* getElementsByTagName() (xml.dom.Element method): Element Objects<2>. + (line 14) +* getElementsByTagNameNS() (xml.dom.Document method): Document Objects. + (line 66) +* getElementsByTagNameNS() (xml.dom.Element method): Element Objects<2>. + (line 18) +* getencoder() (in module codecs): codecs — Codec registry and base classes. + (line 99) +* getencoding() (in module locale): locale — Internationalization services. + (line 362) +* getEncoding() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 32) +* getEntityResolver() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 39) +* getenv() (in module os): Process Parameters. (line 130) +* getenvb() (in module os): Process Parameters. (line 146) +* getErrorHandler() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 50) +* geteuid() (in module os): Process Parameters. (line 180) +* getEvent() (xml.dom.pulldom.DOMEventStream method): DOMEventStream Objects. + (line 11) +* getEventCategory() (logging.handlers.NTEventLogHandler method): NTEventLogHandler. + (line 43) +* getEventType() (logging.handlers.NTEventLogHandler method): NTEventLogHandler. + (line 49) +* getException() (xml.sax.SAXException method): SAXException Objects. + (line 13) +* getFeature() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 69) +* GetFieldCount() (msilib.Record method): Record Objects. (line 6) +* getfile() (in module inspect): Retrieving source code. + (line 27) +* getFilesToDelete() (logging.handlers.TimedRotatingFileHandler method): TimedRotatingFileHandler. + (line 115) +* getfilesystemencodeerrors() (in module sys): sys — System-specific parameters and functions. + (line 733) +* getfilesystemencoding() (in module sys): sys — System-specific parameters and functions. + (line 702) +* getfirst() (cgi.FieldStorage method): Higher Level Interface. + (line 56) +* getfloat() (configparser.ConfigParser method): ConfigParser Objects. + (line 215) +* getfmts() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 80) +* getfqdn() (in module socket): Other functions<2>. (line 71) +* getframeinfo() (in module inspect): The interpreter stack. + (line 123) +* getframerate() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 62) +* getframerate() (sunau.AU_read method): AU_read Objects. (line 22) +* getframerate() (wave.Wave_read method): Wave_read Objects. (line 23) +* getfullargspec() (in module inspect): Classes and functions<2>. + (line 17) +* getgeneratorlocals() (in module inspect): Current State of Generators and Coroutines. + (line 53) +* getgeneratorstate() (in module inspect): Current State of Generators and Coroutines. + (line 12) +* getgid() (in module os): Process Parameters. (line 186) +* getgrall() (in module grp): grp — The group database. + (line 61) +* getgrgid() (in module grp): grp — The group database. + (line 47) +* getgrnam() (in module grp): grp — The group database. + (line 56) +* getgrouplist() (in module os): Process Parameters. (line 194) +* getgroups() (in module os): Process Parameters. (line 205) +* getheader() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 24) +* getheaders() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 32) +* gethostbyaddr() (in module socket): Process Parameters. (line 493) +* gethostbyaddr() (in module socket) <1>: Other functions<2>. + (line 128) +* gethostbyname() (in module socket): Other functions<2>. (line 83) +* gethostbyname_ex() (in module socket): Other functions<2>. (line 98) +* gethostname() (in module socket): Process Parameters. (line 493) +* gethostname() (in module socket) <1>: Other functions<2>. (line 115) +* getincrementaldecoder() (in module codecs): codecs — Codec registry and base classes. + (line 123) +* getincrementalencoder() (in module codecs): codecs — Codec registry and base classes. + (line 115) +* getinfo() (zipfile.ZipFile method): ZipFile Objects. (line 111) +* getinnerframes() (in module inspect): The interpreter stack. + (line 146) +* GetInputContext() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 37) +* getint() (configparser.ConfigParser method): ConfigParser Objects. + (line 208) +* GetInteger() (msilib.Record method): Record Objects. (line 11) +* getitem() (in module operator): operator — Standard operators as functions. + (line 196) +* getiterfunc (C type): Slot Type typedefs. (line 87) +* getitimer() (in module signal): Module contents<2>. (line 424) +* getkey() (curses.window method): Window Objects. (line 249) +* GetLastError() (in module ctypes): Utility functions. (line 114) +* getLength() (xml.sax.xmlreader.Attributes method): The Attributes Interface. + (line 11) +* getLevelName() (in module logging): Module-Level Functions. + (line 205) +* getLevelNamesMapping() (in module logging): Module-Level Functions. + (line 196) +* getlimit() (sqlite3.Connection method): Connection objects. + (line 527) +* getline() (in module linecache): linecache — Random access to text lines. + (line 23) +* getLineNumber() (xml.sax.xmlreader.Locator method): Locator Objects. + (line 12) +* getlist() (cgi.FieldStorage method): Higher Level Interface. + (line 67) +* getloadavg() (in module os): Miscellaneous System Information. + (line 48) +* getlocale() (in module locale): locale — Internationalization services. + (line 327) +* getLogger() (in module logging): Module-Level Functions. + (line 9) +* getLoggerClass() (in module logging): Module-Level Functions. + (line 21) +* getlogin() (in module os): Process Parameters. (line 228) +* getLogRecordFactory() (in module logging): Module-Level Functions. + (line 32) +* getmark() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 95) +* getmark() (sunau.AU_read method): AU_read Objects. (line 77) +* getmark() (wave.Wave_read method): Wave_read Objects. (line 62) +* getmarkers() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 88) +* getmarkers() (sunau.AU_read method): AU_read Objects. (line 73) +* getmarkers() (wave.Wave_read method): Wave_read Objects. (line 58) +* getmaxyx() (curses.window method): Window Objects. (line 256) +* getmember() (tarfile.TarFile method): TarFile Objects. (line 101) +* getmembers() (in module inspect): Types and members. (line 286) +* getmembers() (tarfile.TarFile method): TarFile Objects. (line 109) +* getmembers_static() (in module inspect): Types and members. + (line 299) +* getMessage() (logging.LogRecord method): LogRecord Objects. + (line 62) +* getMessage() (xml.sax.SAXException method): SAXException Objects. + (line 9) +* getMessageID() (logging.handlers.NTEventLogHandler method): NTEventLogHandler. + (line 60) +* getmodule() (in module inspect): Retrieving source code. + (line 33) +* getmodulename() (in module inspect): Types and members. (line 315) +* getmouse() (in module curses): Functions<5>. (line 145) +* getmro() (in module inspect): Classes and functions<2>. + (line 84) +* getmtime() (in module os.path): os path — Common pathname manipulations. + (line 173) +* getname() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 72) +* getName() (threading.Thread method): Thread Objects. (line 158) +* getNameByQName() (xml.sax.xmlreader.AttributesNS method): The AttributesNS Interface. + (line 16) +* getnameinfo() (asyncio.loop method): DNS. (line 11) +* getnameinfo() (in module socket): Other functions<2>. (line 144) +* getnames() (tarfile.TarFile method): TarFile Objects. (line 115) +* getNames() (xml.sax.xmlreader.Attributes method): The Attributes Interface. + (line 15) +* getnchannels() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 54) +* getnchannels() (sunau.AU_read method): AU_read Objects. (line 14) +* getnchannels() (wave.Wave_read method): Wave_read Objects. (line 15) +* getnframes() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 66) +* getnframes() (sunau.AU_read method): AU_read Objects. (line 26) +* getnframes() (wave.Wave_read method): Wave_read Objects. (line 27) +* getnode: uuid — UUID objects according to RFC 4122. + (line 180) +* getnode() (in module uuid): uuid — UUID objects according to RFC 4122. + (line 162) +* getopt() (distutils.fancy_getopt.FancyGetopt method): distutils fancy_getopt — Wrapper around the standard getopt module. + (line 49) +* getopt() (in module getopt): getopt — C-style parser for command line options. + (line 25) +* GetoptError: getopt — C-style parser for command line options. + (line 74) +* getouterframes() (in module inspect): The interpreter stack. + (line 131) +* getoutput() (in module subprocess): Legacy Shell Invocation Functions. + (line 44) +* getpagesize() (in module resource): Resource Usage. (line 101) +* getparams() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 82) +* getparams() (sunau.AU_read method): AU_read Objects. (line 41) +* getparams() (wave.Wave_read method): Wave_read Objects. (line 40) +* getparyx() (curses.window method): Window Objects. (line 260) +* getpass() (in module getpass): getpass — Portable password input. + (line 17) +* GetPassWarning: getpass — Portable password input. + (line 34) +* getpeercert() (ssl.SSLSocket method): SSL Sockets. (line 144) +* getpeername() (socket.socket method): Socket Objects. (line 135) +* getpen() (in module turtle): Special Turtle methods. + (line 40) +* getpgid() (in module os): Process Parameters. (line 239) +* getpgrp() (in module os): Process Parameters. (line 247) +* getpid() (in module os): Process Parameters. (line 253) +* getpos() (html.parser.HTMLParser method): HTMLParser Methods. + (line 28) +* getppid() (in module os): Process Parameters. (line 260) +* getpreferredencoding() (in module locale): locale — Internationalization services. + (line 338) +* getpriority() (in module os): Process Parameters. (line 271) +* getprofile() (in module sys): sys — System-specific parameters and functions. + (line 815) +* getprofile() (in module threading): threading — Thread-based parallelism. + (line 177) +* GetProperty() (msilib.SummaryInformation method): Summary Information Objects. + (line 6) +* getProperty() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 83) +* GetPropertyCount() (msilib.SummaryInformation method): Summary Information Objects. + (line 17) +* getprotobyname() (in module socket): Other functions<2>. (line 164) +* getproxies() (in module urllib.request): urllib request — Extensible library for opening URLs. + (line 163) +* getPublicId() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 10) +* getPublicId() (xml.sax.xmlreader.Locator method): Locator Objects. + (line 16) +* getpwall() (in module pwd): pwd — The password database. + (line 70) +* getpwnam() (in module pwd): pwd — The password database. + (line 66) +* getpwuid() (in module pwd): pwd — The password database. + (line 62) +* getQNameByName() (xml.sax.xmlreader.AttributesNS method): The AttributesNS Interface. + (line 20) +* getQNames() (xml.sax.xmlreader.AttributesNS method): The AttributesNS Interface. + (line 24) +* getquota() (imaplib.IMAP4 method): IMAP4 Objects. (line 116) +* getquotaroot() (imaplib.IMAP4 method): IMAP4 Objects. (line 121) +* getrandbits() (in module random): Functions for integers. + (line 38) +* getrandom() (in module os): Random numbers<2>. (line 6) +* getreader() (in module codecs): codecs — Codec registry and base classes. + (line 131) +* getrecursionlimit() (in module sys): sys — System-specific parameters and functions. + (line 764) +* getrefcount() (in module sys): sys — System-specific parameters and functions. + (line 758) +* getresgid() (in module os): Process Parameters. (line 306) +* getresponse() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 59) +* getresuid() (in module os): Process Parameters. (line 297) +* getrlimit() (in module resource): Resource Limits. (line 24) +* getroot() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 36) +* getrusage() (in module resource): Resource Usage. (line 8) +* getsample() (in module audioop): audioop — Manipulate raw audio data. + (line 111) +* getsampwidth() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 58) +* getsampwidth() (sunau.AU_read method): AU_read Objects. (line 18) +* getsampwidth() (wave.Wave_read method): Wave_read Objects. (line 19) +* getscreen() (in module turtle): Special Turtle methods. + (line 51) +* getservbyname() (in module socket): Other functions<2>. (line 175) +* getservbyport() (in module socket): Other functions<2>. (line 186) +* GetSetDescriptorType (in module types): Standard Interpreter Types. + (line 241) +* getshapes() (in module turtle): Settings and special methods. + (line 64) +* getsid() (in module os): Process Parameters. (line 451) +* getsignal() (in module signal): Module contents<2>. (line 278) +* getsitepackages() (in module site): Module contents<5>. (line 56) +* getsize() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 77) +* getsize() (in module os.path): os path — Common pathname manipulations. + (line 193) +* getsizeof() (in module sys): sys — System-specific parameters and functions. + (line 771) +* getsockname() (socket.socket method): Socket Objects. (line 143) +* getsockopt() (socket.socket method): Socket Objects. (line 149) +* getsource() (in module inspect): Retrieving source code. + (line 58) +* getsourcefile() (in module inspect): Retrieving source code. + (line 38) +* getsourcelines() (in module inspect): Retrieving source code. + (line 45) +* getspall() (in module spwd): spwd — The shadow password database. + (line 76) +* getspnam() (in module spwd): spwd — The shadow password database. + (line 68) +* getstate() (codecs.IncrementalDecoder method): IncrementalDecoder Objects. + (line 44) +* getstate() (codecs.IncrementalEncoder method): IncrementalEncoder Objects. + (line 42) +* getstate() (in module random): Bookkeeping functions. + (line 32) +* getstatus() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 89) +* getstatus() (urllib.response.addinfourl method): urllib response — Response classes used by urllib. + (line 45) +* getstatusoutput() (in module subprocess): Legacy Shell Invocation Functions. + (line 11) +* getstr() (curses.window method): Window Objects. (line 266) +* GetString() (msilib.Record method): Record Objects. (line 16) +* getSubject() (logging.handlers.SMTPHandler method): SMTPHandler. + (line 39) +* GetSummaryInformation() (msilib.Database method): Database Objects. + (line 16) +* getswitchinterval() (in module sys): sys — System-specific parameters and functions. + (line 793) +* getSystemId() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 18) +* getSystemId() (xml.sax.xmlreader.Locator method): Locator Objects. + (line 20) +* getsyx() (in module curses): Functions<5>. (line 162) +* gettarinfo() (tarfile.TarFile method): TarFile Objects. (line 228) +* gettempdir() (in module tempfile): tempfile — Generate temporary files and directories. + (line 247) +* gettempdirb() (in module tempfile): tempfile — Generate temporary files and directories. + (line 279) +* gettempprefix() (in module tempfile): tempfile — Generate temporary files and directories. + (line 285) +* gettempprefixb() (in module tempfile): tempfile — Generate temporary files and directories. + (line 290) +* getTestCaseNames() (unittest.TestLoader method): Loading and running tests. + (line 111) +* gettext() (gettext.GNUTranslations method): The GNUTranslations class. + (line 38) +* gettext() (gettext.NullTranslations method): The NullTranslations class. + (line 35) +* gettext() (in module gettext): GNU gettext API. (line 32) +* gettext() (in module locale): Access to message catalogs. + (line 6) +* gettimeout() (socket.socket method): Socket Objects. (line 172) +* gettrace() (in module sys): sys — System-specific parameters and functions. + (line 819) +* gettrace() (in module threading): threading — Thread-based parallelism. + (line 164) +* getturtle() (in module turtle): Special Turtle methods. + (line 40) +* getType() (xml.sax.xmlreader.Attributes method): The Attributes Interface. + (line 19) +* getuid() (in module os): Process Parameters. (line 315) +* geturl() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 79) +* geturl() (urllib.parse.urllib.parse.SplitResult method): Structured Parse Results. + (line 12) +* geturl() (urllib.response.addinfourl method): urllib response — Response classes used by urllib. + (line 30) +* getuser() (in module getpass): getpass — Portable password input. + (line 39) +* getuserbase() (in module site): Module contents<5>. (line 62) +* getusersitepackages() (in module site): Module contents<5>. + (line 70) +* getvalue() (io.BytesIO method): Buffered Streams. (line 38) +* getvalue() (io.StringIO method): Text I/O<2>. (line 227) +* getValue() (xml.sax.xmlreader.Attributes method): The Attributes Interface. + (line 24) +* getValueByQName() (xml.sax.xmlreader.AttributesNS method): The AttributesNS Interface. + (line 12) +* getwch() (in module msvcrt): Console I/O. (line 20) +* getwche() (in module msvcrt): Console I/O. (line 30) +* getweakrefcount() (in module weakref): weakref — Weak references. + (line 153) +* getweakrefs() (in module weakref): weakref — Weak references. + (line 158) +* getwelcome() (ftplib.FTP method): FTP Objects. (line 42) +* getwelcome() (nntplib.NNTP method): Methods<3>. (line 28) +* getwelcome() (poplib.POP3 method): POP3 Objects. (line 20) +* getwin() (in module curses): Functions<5>. (line 168) +* getwindowsversion() (in module sys): sys — System-specific parameters and functions. + (line 830) +* getwriter() (in module codecs): codecs — Codec registry and base classes. + (line 139) +* getxattr() (in module os): Linux extended attributes. + (line 10) +* getyx() (curses.window method): Window Objects. (line 277) +* GET_AITER (opcode): Python Bytecode Instructions. + (line 200) +* get_all() (email.message.EmailMessage method): email message Representing an email message. + (line 254) +* get_all() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 362) +* get_all() (wsgiref.headers.Headers method): wsgiref headers – WSGI response header tools. + (line 50) +* get_all_breaks() (bdb.Bdb method): bdb — Debugger framework. + (line 389) +* get_all_start_methods() (in module multiprocessing): Miscellaneous<3>. + (line 71) +* GET_ANEXT (opcode): Python Bytecode Instructions. + (line 209) +* get_annotations() (in module inspect): Classes and functions<2>. + (line 155) +* get_app() (wsgiref.simple_server.WSGIServer method): wsgiref simple_server – a simple WSGI HTTP server. + (line 66) +* get_archive_formats() (in module shutil): Archiving operations. + (line 65) +* get_args() (in module typing): Introspection helpers. + (line 43) +* get_asyncgen_hooks() (in module sys): sys — System-specific parameters and functions. + (line 883) +* get_attribute() (in module test.support): test support — Utilities for the Python test suite. + (line 558) +* GET_AWAITABLE (opcode): Python Bytecode Instructions. + (line 182) +* get_begidx() (in module readline): Completion. (line 40) +* get_blocking() (in module os): File Descriptor Operations. + (line 211) +* get_body() (email.message.EmailMessage method): email message Representing an email message. + (line 518) +* get_body_encoding() (email.charset.Charset method): email charset Representing character sets. + (line 96) +* get_boundary() (email.message.EmailMessage method): email message Representing an email message. + (line 403) +* get_boundary() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 579) +* get_bpbynumber() (bdb.Bdb method): bdb — Debugger framework. + (line 365) +* get_break() (bdb.Bdb method): bdb — Debugger framework. + (line 374) +* get_breaks() (bdb.Bdb method): bdb — Debugger framework. + (line 379) +* get_buffer() (asyncio.BufferedProtocol method): Buffered Streaming Protocols. + (line 21) +* get_buffer() (xdrlib.Packer method): Packer Objects. (line 8) +* get_buffer() (xdrlib.Unpacker method): Unpacker Objects. (line 22) +* get_bytes() (mailbox.Mailbox method): Mailbox objects. (line 159) +* get_cache_token() (in module abc): abc — Abstract Base Classes. + (line 326) +* get_ca_certs() (ssl.SSLContext method): SSL Contexts. (line 169) +* get_channel_binding() (ssl.SSLSocket method): SSL Sockets. (line 243) +* get_charset() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 265) +* get_charsets() (email.message.EmailMessage method): email message Representing an email message. + (line 431) +* get_charsets() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 613) +* get_children() (symtable.SymbolTable method): Examining Symbol Tables. + (line 59) +* get_children() (tkinter.ttk.Treeview method): ttk Treeview. + (line 19) +* get_child_watcher() (asyncio.AbstractEventLoopPolicy method): Policy Objects. + (line 33) +* get_child_watcher() (in module asyncio): Process Watchers. (line 25) +* get_ciphers() (ssl.SSLContext method): SSL Contexts. (line 183) +* get_clock_info() (in module time): Functions<4>. (line 103) +* get_close_matches() (in module difflib): difflib — Helpers for computing deltas. + (line 203) +* get_code() (importlib.abc.InspectLoader method): importlib abc – Abstract base classes related to import. + (line 325) +* get_code() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 519) +* get_code() (importlib.machinery.ExtensionFileLoader method): importlib machinery – Importers and path hooks. + (line 341) +* get_code() (importlib.machinery.SourcelessFileLoader method): importlib machinery – Importers and path hooks. + (line 284) +* get_code() (zipimport.zipimporter method): zipimporter Objects. + (line 61) +* get_completer() (in module readline): Completion. (line 29) +* get_completer_delims() (in module readline): Completion. (line 50) +* get_completion_type() (in module readline): Completion. (line 34) +* get_config_h_filename() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 44) +* get_config_h_filename() (in module sysconfig): Other functions<3>. + (line 68) +* get_config_var() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 30) +* get_config_var() (in module sysconfig): Configuration variables. + (line 26) +* get_config_vars() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 35) +* get_config_vars() (in module sysconfig): Configuration variables. + (line 16) +* get_content() (email.contentmanager.ContentManager method): email contentmanager Managing MIME Content. + (line 19) +* get_content() (email.message.EmailMessage method): email message Representing an email message. + (line 582) +* get_content() (in module email.contentmanager): Content Manager Instances. + (line 24) +* get_content_charset() (email.message.EmailMessage method): email message Representing an email message. + (line 424) +* get_content_charset() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 602) +* get_content_disposition() (email.message.EmailMessage method): email message Representing an email message. + (line 455) +* get_content_disposition() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 627) +* get_content_maintype() (email.message.EmailMessage method): email message Representing an email message. + (line 324) +* get_content_maintype() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 432) +* get_content_subtype() (email.message.EmailMessage method): email message Representing an email message. + (line 330) +* get_content_subtype() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 438) +* get_content_type() (email.message.EmailMessage method): email message Representing an email message. + (line 308) +* get_content_type() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 416) +* get_context() (in module multiprocessing): Miscellaneous<3>. + (line 81) +* get_coro() (asyncio.Task method): Task Object. (line 143) +* get_coroutine_origin_tracking_depth() (in module sys): sys — System-specific parameters and functions. + (line 897) +* get_count() (in module gc): gc — Garbage Collector interface. + (line 110) +* get_current_history_length() (in module readline): History list. + (line 14) +* get_data() (importlib.abc.FileLoader method): importlib abc – Abstract base classes related to import. + (line 441) +* get_data() (importlib.abc.ResourceLoader method): importlib abc – Abstract base classes related to import. + (line 306) +* get_data() (in module pkgutil): pkgutil — Package extension utility. + (line 201) +* get_data() (zipimport.zipimporter method): zipimporter Objects. + (line 66) +* get_date() (mailbox.MaildirMessage method): MaildirMessage. + (line 92) +* get_debug() (asyncio.loop method): Enabling debug mode. + (line 6) +* get_debug() (in module gc): gc — Garbage Collector interface. + (line 55) +* get_default() (argparse.ArgumentParser method): Parser defaults. + (line 33) +* get_default_compiler() (in module distutils.ccompiler): distutils ccompiler — CCompiler base class. + (line 36) +* get_default_domain() (in module nis): nis — Interface to Sun’s NIS Yellow Pages. + (line 56) +* get_default_scheme() (in module sysconfig): Installation paths. + (line 76) +* get_default_type() (email.message.EmailMessage method): email message Representing an email message. + (line 335) +* get_default_type() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 443) +* get_default_verify_paths() (in module ssl): Certificate handling. + (line 104) +* get_dialect() (in module csv): Module Contents<3>. (line 86) +* get_disassembly_as_string() (test.support.bytecode_helper.BytecodeTestCase method): test support bytecode_helper — Support tools for testing correct bytecode generation. + (line 18) +* get_docstring() (in module ast): ast Helpers. (line 102) +* get_doctest() (doctest.DocTestParser method): DocTestParser objects. + (line 13) +* get_endidx() (in module readline): Completion. (line 40) +* get_environ() (wsgiref.simple_server.WSGIRequestHandler method): wsgiref simple_server – a simple WSGI HTTP server. + (line 88) +* get_errno() (in module ctypes): Utility functions. (line 121) +* get_escdelay() (in module curses): Functions<5>. (line 446) +* get_event_loop() (asyncio.AbstractEventLoopPolicy method): Policy Objects. + (line 12) +* get_event_loop() (in module asyncio): Event Loop. (line 39) +* get_event_loop_policy() (in module asyncio): Getting and Setting the Policy. + (line 9) +* get_examples() (doctest.DocTestParser method): DocTestParser objects. + (line 22) +* get_exception_handler() (asyncio.loop method): Error Handling API. + (line 19) +* get_exec_path() (in module os): Process Parameters. (line 162) +* get_extra_info() (asyncio.BaseTransport method): Base Transport. + (line 20) +* get_extra_info() (asyncio.StreamWriter method): StreamWriter. + (line 61) +* get_field() (string.Formatter method): Custom String Formatting. + (line 55) +* get_file() (mailbox.Babyl method): Babyl. (line 49) +* get_file() (mailbox.Mailbox method): Mailbox objects. (line 175) +* get_file() (mailbox.Maildir method): Maildir. (line 119) +* get_file() (mailbox.mbox method): mbox. (line 33) +* get_file() (mailbox.MH method): MH. (line 93) +* get_file() (mailbox.MMDF method): MMDF. (line 29) +* get_filename() (email.message.EmailMessage method): email message Representing an email message. + (line 393) +* get_filename() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 569) +* get_filename() (importlib.abc.ExecutionLoader method): importlib abc – Abstract base classes related to import. + (line 396) +* get_filename() (importlib.abc.FileLoader method): importlib abc – Abstract base classes related to import. + (line 437) +* get_filename() (importlib.machinery.ExtensionFileLoader method): importlib machinery – Importers and path hooks. + (line 349) +* get_filename() (zipimport.zipimporter method): zipimporter Objects. + (line 74) +* get_file_breaks() (bdb.Bdb method): bdb — Debugger framework. + (line 384) +* get_filter() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 106) +* get_flags() (mailbox.MaildirMessage method): MaildirMessage. + (line 63) +* get_flags() (mailbox.mboxMessage method): mboxMessage. (line 64) +* get_flags() (mailbox.MMDFMessage method): MMDFMessage. (line 63) +* get_folder() (mailbox.Maildir method): Maildir. (line 65) +* get_folder() (mailbox.MH method): MH. (line 36) +* get_frees() (symtable.Function method): Examining Symbol Tables. + (line 85) +* get_freeze_count() (in module gc): gc — Garbage Collector interface. + (line 221) +* get_from() (mailbox.mboxMessage method): mboxMessage. (line 47) +* get_from() (mailbox.MMDFMessage method): MMDFMessage. (line 46) +* get_full_url() (urllib.request.Request method): Request Objects. + (line 107) +* get_globals() (symtable.Function method): Examining Symbol Tables. + (line 77) +* get_grouped_opcodes() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 168) +* get_handle_inheritable() (in module os): Inheritance of File Descriptors. + (line 35) +* get_header() (urllib.request.Request method): Request Objects. + (line 121) +* get_history_item() (in module readline): History list. (line 20) +* get_history_length() (in module readline): History file. (line 30) +* get_id() (symtable.SymbolTable method): Examining Symbol Tables. + (line 15) +* get_ident() (in module threading): threading — Thread-based parallelism. + (line 118) +* get_ident() (in module _thread): _thread — Low-level threading API. + (line 85) +* get_identifiers() (string.Template method): Template strings. + (line 75) +* get_identifiers() (symtable.SymbolTable method): Examining Symbol Tables. + (line 44) +* get_importer() (in module pkgutil): pkgutil — Package extension utility. + (line 92) +* get_info() (mailbox.MaildirMessage method): MaildirMessage. + (line 102) +* get_inheritable() (in module os): Inheritance of File Descriptors. + (line 26) +* get_inheritable() (socket.socket method): Socket Objects. (line 127) +* get_instructions() (in module dis): Analysis functions. (line 119) +* get_interpreter() (in module zipapp): Python API. (line 82) +* get_int_max_str_digits() (in module sys): sys — System-specific parameters and functions. + (line 750) +* GET_ITER (opcode): Python Bytecode Instructions. + (line 138) +* get_key() (selectors.BaseSelector method): Classes<3>. (line 145) +* get_labels() (mailbox.Babyl method): Babyl. (line 35) +* get_labels() (mailbox.BabylMessage method): BabylMessage. (line 47) +* get_last_error() (in module ctypes): Utility functions. (line 129) +* GET_LEN (opcode): Python Bytecode Instructions. + (line 387) +* get_lineno() (symtable.SymbolTable method): Examining Symbol Tables. + (line 26) +* get_line_buffer() (in module readline): Line buffer. (line 8) +* get_loader() (in module pkgutil): pkgutil — Package extension utility. + (line 106) +* get_locals() (symtable.Function method): Examining Symbol Tables. + (line 73) +* get_logger() (in module multiprocessing): Logging<2>. (line 11) +* get_loop() (asyncio.Future method): Future Object. (line 136) +* get_loop() (asyncio.Runner method): Runner context manager. + (line 57) +* get_loop() (asyncio.Server method): Server Objects. (line 41) +* get_magic() (in module imp): imp — Access the import internals. + (line 17) +* get_makefile_filename() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 52) +* get_makefile_filename() (in module sysconfig): Other functions<3>. + (line 72) +* get_map() (selectors.BaseSelector method): Classes<3>. (line 153) +* get_matching_blocks() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 107) +* get_message() (mailbox.Mailbox method): Mailbox objects. (line 152) +* get_method() (urllib.request.Request method): Request Objects. + (line 69) +* get_methods() (symtable.Class method): Examining Symbol Tables. + (line 95) +* get_mixed_type_key() (in module ipaddress): Other Module Level Functions. + (line 56) +* get_name() (asyncio.Task method): Task Object. (line 149) +* get_name() (symtable.Symbol method): Examining Symbol Tables. + (line 105) +* get_name() (symtable.SymbolTable method): Examining Symbol Tables. + (line 19) +* get_namespace() (symtable.Symbol method): Examining Symbol Tables. + (line 176) +* get_namespaces() (symtable.Symbol method): Examining Symbol Tables. + (line 172) +* get_native_id() (in module threading): threading — Thread-based parallelism. + (line 128) +* get_native_id() (in module _thread): _thread — Low-level threading API. + (line 93) +* get_nonlocals() (symtable.Function method): Examining Symbol Tables. + (line 81) +* get_nonstandard_attr() (http.cookiejar.Cookie method): Cookie Objects<2>. + (line 98) +* get_nowait() (asyncio.Queue method): Queue. (line 44) +* get_nowait() (multiprocessing.Queue method): Pipes and Queues. + (line 155) +* get_nowait() (queue.Queue method): Queue Objects. (line 61) +* get_nowait() (queue.SimpleQueue method): SimpleQueue Objects. + (line 51) +* get_objects() (in module gc): gc — Garbage Collector interface. + (line 59) +* get_object_traceback() (in module tracemalloc): Functions<10>. + (line 12) +* get_opcodes() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 125) +* get_option() (optparse.OptionParser method): Querying and manipulating your option parser. + (line 37) +* get_option_group() (optparse.OptionParser method): Grouping Options. + (line 103) +* get_option_order() (distutils.fancy_getopt.FancyGetopt method): distutils fancy_getopt — Wrapper around the standard getopt module. + (line 62) +* get_origin() (in module typing): Introspection helpers. + (line 45) +* get_original_stdout() (in module test.support): test support — Utilities for the Python test suite. + (line 290) +* get_osfhandle() (in module msvcrt): File Operations. (line 55) +* get_output_charset() (email.charset.Charset method): email charset Representing character sets. + (line 111) +* get_overloads() (in module typing): Functions and decorators. + (line 256) +* get_param() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 478) +* get_parameters() (symtable.Function method): Examining Symbol Tables. + (line 68) +* get_params() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 457) +* get_path() (in module sysconfig): Installation paths. (line 124) +* get_paths() (in module sysconfig): Installation paths. (line 154) +* get_path_names() (in module sysconfig): Installation paths. + (line 119) +* get_payload() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 180) +* get_pid() (asyncio.SubprocessTransport method): Subprocess Transports. + (line 6) +* get_pipe_transport() (asyncio.SubprocessTransport method): Subprocess Transports. + (line 10) +* get_platform() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 9) +* get_platform() (in module sysconfig): Other functions<3>. (line 11) +* get_poly() (in module turtle): Special Turtle methods. + (line 17) +* get_position() (xdrlib.Unpacker method): Unpacker Objects. (line 12) +* get_preferred_scheme() (in module sysconfig): Installation paths. + (line 86) +* get_protocol() (asyncio.BaseTransport method): Base Transport. + (line 87) +* get_python_inc() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 63) +* get_python_lib() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 74) +* get_python_version() (in module sysconfig): Other functions<3>. + (line 6) +* get_ready() (graphlib.TopologicalSorter method): graphlib — Functionality to operate with graph-like structures. + (line 149) +* get_recsrc() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 84) +* get_referents() (in module gc): gc — Garbage Collector interface. + (line 142) +* get_referrers() (in module gc): gc — Garbage Collector interface. + (line 120) +* get_request() (socketserver.BaseServer method): Server Objects<2>. + (line 131) +* get_returncode() (asyncio.SubprocessTransport method): Subprocess Transports. + (line 29) +* get_running_loop() (in module asyncio): Event Loop. (line 29) +* get_scheme() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 190) +* get_scheme_names() (in module sysconfig): Installation paths. + (line 71) +* get_selection() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 110) +* get_sequences() (mailbox.MH method): MH. (line 53) +* get_sequences() (mailbox.MHMessage method): MHMessage. (line 32) +* get_server() (multiprocessing.managers.BaseManager method): Managers. + (line 63) +* get_server_certificate() (in module ssl): Certificate handling. + (line 71) +* get_shapepoly() (in module turtle): Appearance. (line 189) +* get_socket() (telnetlib.Telnet method): Telnet Objects. (line 92) +* get_source() (importlib.abc.InspectLoader method): importlib abc – Abstract base classes related to import. + (line 339) +* get_source() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 537) +* get_source() (importlib.machinery.ExtensionFileLoader method): importlib machinery – Importers and path hooks. + (line 345) +* get_source() (importlib.machinery.SourcelessFileLoader method): importlib machinery – Importers and path hooks. + (line 289) +* get_source() (zipimport.zipimporter method): zipimporter Objects. + (line 82) +* get_source_segment() (in module ast): ast Helpers. (line 113) +* get_stack() (asyncio.Task method): Task Object. (line 107) +* get_stack() (bdb.Bdb method): bdb — Debugger framework. + (line 396) +* get_starttag_text() (html.parser.HTMLParser method): HTMLParser Methods. + (line 32) +* get_start_method() (in module multiprocessing): Miscellaneous<3>. + (line 93) +* get_stats() (in module gc): gc — Garbage Collector interface. + (line 70) +* get_stats_profile() (pstats.Stats method): The Stats Class. + (line 225) +* get_stderr() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 128) +* get_stderr() (wsgiref.simple_server.WSGIRequestHandler method): wsgiref simple_server – a simple WSGI HTTP server. + (line 98) +* get_stdin() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 122) +* get_string() (mailbox.Mailbox method): Mailbox objects. (line 167) +* get_subdir() (mailbox.MaildirMessage method): MaildirMessage. + (line 47) +* get_suffixes() (in module imp): imp — Access the import internals. + (line 26) +* get_symbols() (symtable.SymbolTable method): Examining Symbol Tables. + (line 54) +* get_tabsize() (in module curses): Functions<5>. (line 461) +* get_tag() (in module imp): imp — Access the import internals. + (line 244) +* get_task_factory() (asyncio.loop method): Creating Futures and Tasks. + (line 49) +* get_terminal_size() (in module os): Querying the size of a terminal. + (line 8) +* get_terminal_size() (in module shutil): Querying the size of the output terminal. + (line 6) +* get_terminator() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 104) +* get_threshold() (in module gc): gc — Garbage Collector interface. + (line 115) +* get_token() (shlex.shlex method): shlex Objects. (line 8) +* get_traceback_limit() (in module tracemalloc): Functions<10>. + (line 22) +* get_traced_memory() (in module tracemalloc): Functions<10>. + (line 32) +* get_tracemalloc_memory() (in module tracemalloc): Functions<10>. + (line 56) +* get_type() (symtable.SymbolTable method): Examining Symbol Tables. + (line 10) +* get_type_hints() (in module typing): Introspection helpers. + (line 6) +* get_unixfrom() (email.message.EmailMessage method): email message Representing an email message. + (line 152) +* get_unixfrom() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 162) +* get_unpack_formats() (in module shutil): Archiving operations. + (line 161) +* get_usage() (optparse.OptionParser method): Other methods. (line 22) +* get_value() (string.Formatter method): Custom String Formatting. + (line 65) +* get_version() (optparse.OptionParser method): Printing a version string. + (line 34) +* get_visible() (mailbox.BabylMessage method): BabylMessage. (line 63) +* get_wch() (curses.window method): Window Objects. (line 241) +* get_write_buffer_limits() (asyncio.WriteTransport method): Write-only Transports. + (line 23) +* get_write_buffer_size() (asyncio.WriteTransport method): Write-only Transports. + (line 19) +* GET_YIELD_FROM_ITER (opcode): Python Bytecode Instructions. + (line 142) +* gid (tarfile.TarInfo attribute): TarInfo Objects. (line 76) +* GIL: Glossary. (line 600) +* glob() (in module glob): glob — Unix style pathname pattern expansion. + (line 32) +* glob() (msilib.Directory method): Directory Objects. (line 39) +* glob() (pathlib.Path method): Methods<2>. (line 101) +* Global (class in ast): Function and class definitions. + (line 151) +* global interpreter lock: Thread State and the Global Interpreter Lock. + (line 6) +* global interpreter lock <1>: Glossary. (line 604) +* global; name; binding: The global statement. + (line 6) +* global; namespace: The standard type hierarchy. + (line 309) +* globs (doctest.DocTest attribute): DocTest Objects. (line 22) +* gmtime() (in module time): Functions<4>. (line 137) +* gname (tarfile.TarInfo attribute): TarInfo Objects. (line 84) +* GNOME: The Catalog constructor. + (line 6) +* GNUTranslations (class in gettext): The GNUTranslations class. + (line 33) +* GNU_FORMAT (in module tarfile): tarfile — Read and write tar archive files. + (line 233) +* gnu_getopt() (in module getopt): getopt — C-style parser for command line options. + (line 62) +* go() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 114) +* got (doctest.DocTestFailure attribute): Debugging. (line 204) +* goto() (in module turtle): Turtle motion. (line 74) +* grammar: Notation. (line 6) +* Graphical User Interface: Graphical User Interfaces with Tk. + (line 6) +* GREATER (in module token): token — Constants used with Python parse trees. + (line 110) +* GREATEREQUAL (in module token): token — Constants used with Python parse trees. + (line 146) +* Greenwich Mean Time: time — Time access and conversions. + (line 39) +* GRND_NONBLOCK (in module os): Random numbers<2>. (line 76) +* GRND_RANDOM (in module os): Random numbers<2>. (line 89) +* Group (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 456) +* group() (nntplib.NNTP method): Methods<3>. (line 158) +* group() (pathlib.Path method): Methods<2>. (line 132) +* group() (re.Match method): Match Objects. (line 29) +* groupby() (in module itertools): Itertool functions. (line 298) +* groupdict() (re.Match method): Match Objects. (line 129) +* groupindex (re.Pattern attribute): Regular Expression Objects. + (line 112) +* grouping: Indentation. (line 6) +* groups (email.headerregistry.AddressHeader attribute): email headerregistry Custom Header Objects. + (line 188) +* groups (re.Pattern attribute): Regular Expression Objects. + (line 108) +* groups() (re.Match method): Match Objects. (line 106) +* Gt (class in ast): Expressions<2>. (line 109) +* gt() (in module operator): operator — Standard operators as functions. + (line 24) +* GtE (class in ast): Expressions<2>. (line 109) +* guard: Guards. (line 6) +* guess_all_extensions() (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 51) +* guess_all_extensions() (mimetypes.MimeTypes method): MimeTypes Objects. + (line 65) +* guess_extension() (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 63) +* guess_extension() (mimetypes.MimeTypes method): MimeTypes Objects. + (line 55) +* guess_scheme() (in module wsgiref.util): wsgiref util – WSGI environment utilities. + (line 14) +* guess_type() (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 24) +* guess_type() (mimetypes.MimeTypes method): MimeTypes Objects. + (line 60) +* GUI: Graphical User Interfaces with Tk. + (line 6) +* gzip command line option; –best: Command line options. + (line 14) +* gzip command line option; -d: Command line options. + (line 18) +* gzip command line option; –decompress: Command line options. + (line 18) +* gzip command line option; –fast: Command line options. + (line 10) +* gzip command line option; -h: Command line options. + (line 22) +* gzip command line option; –help: Command line options. + (line 22) +* gzip command line option; file: Command line options. + (line 6) +* GzipFile (class in gzip): gzip — Support for gzip files. + (line 71) +* halfdelay() (in module curses): Functions<5>. (line 209) +* Handle (class in asyncio): Callback Handles. (line 6) +* handle an exception: Exceptions<2>. (line 6) +* handle() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 192) +* handle() (logging.Handler method): Handler Objects. (line 81) +* handle() (logging.handlers.QueueListener method): QueueListener. + (line 67) +* handle() (logging.Logger method): Logger Objects. (line 308) +* handle() (logging.NullHandler method): NullHandler. (line 20) +* handle() (socketserver.BaseRequestHandler method): Request Handler Objects. + (line 20) +* handle() (wsgiref.simple_server.WSGIRequestHandler method): wsgiref simple_server – a simple WSGI HTTP server. + (line 103) +* handleError() (logging.Handler method): Handler Objects. (line 88) +* handleError() (logging.handlers.SocketHandler method): SocketHandler. + (line 33) +* Handler (class in logging): Handler Objects. (line 11) +* handler() (in module cgitb): cgitb — Traceback manager for CGI scripts. + (line 69) +* Handlers (class in signal): Module contents<2>. (line 24) +* handle_accept() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 150) +* handle_accepted() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 160) +* handle_charref() (html.parser.HTMLParser method): HTMLParser Methods. + (line 93) +* handle_close() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 141) +* handle_comment() (html.parser.HTMLParser method): HTMLParser Methods. + (line 102) +* handle_connect() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 135) +* handle_data() (html.parser.HTMLParser method): HTMLParser Methods. + (line 80) +* handle_decl() (html.parser.HTMLParser method): HTMLParser Methods. + (line 115) +* handle_defect() (email.policy.Policy method): email policy Policy Objects. + (line 218) +* handle_endtag() (html.parser.HTMLParser method): HTMLParser Methods. + (line 64) +* handle_entityref() (html.parser.HTMLParser method): HTMLParser Methods. + (line 86) +* handle_error() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 145) +* handle_error() (socketserver.BaseServer method): Server Objects<2>. + (line 137) +* handle_expect_100() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 205) +* handle_expt() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 129) +* handle_one_request() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 199) +* handle_pi() (html.parser.HTMLParser method): HTMLParser Methods. + (line 123) +* handle_read() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 114) +* handle_request() (socketserver.BaseServer method): Server Objects<2>. + (line 21) +* handle_request() (xmlrpc.server.CGIXMLRPCRequestHandler method): CGIXMLRPCRequestHandler. + (line 50) +* handle_startendtag() (html.parser.HTMLParser method): HTMLParser Methods. + (line 71) +* handle_starttag() (html.parser.HTMLParser method): HTMLParser Methods. + (line 45) +* handle_timeout() (socketserver.BaseServer method): Server Objects<2>. + (line 147) +* handle_write() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 119) +* hardlink_to() (pathlib.Path method): Methods<2>. (line 463) +* harmonic_mean() (in module statistics): Function details. (line 97) +* hasAttribute() (xml.dom.Element method): Element Objects<2>. + (line 22) +* hasAttributeNS() (xml.dom.Element method): Element Objects<2>. + (line 26) +* hasAttributes() (xml.dom.Node method): Node Objects. (line 94) +* hasChildNodes() (xml.dom.Node method): Node Objects. (line 98) +* hascompare (in module dis): Opcode collections. (line 49) +* hasconst (in module dis): Opcode collections. (line 21) +* hasFeature() (xml.dom.DOMImplementation method): DOMImplementation Objects. + (line 11) +* hasfree (in module dis): Opcode collections. (line 25) +* hash character: Comments. (line 6) +* hash-based pyc: Glossary. (line 627) +* hash.block_size (in module hashlib): Hash algorithms. (line 107) +* hash.digest_size (in module hashlib): Hash algorithms. (line 103) +* hashable: Dictionary displays. + (line 37) +* hashable <1>: Glossary. (line 633) +* Hashable (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 10) +* Hashable (class in typing): Corresponding to other types in collections abc. + (line 58) +* hasHandlers() (logging.Logger method): Logger Objects. (line 323) +* hashfunc (C type): Slot Type typedefs. (line 79) +* hash_info (in module sys): sys — System-specific parameters and functions. + (line 907) +* hasjabs (in module dis): Opcode collections. (line 41) +* hasjrel (in module dis): Opcode collections. (line 37) +* haslocal (in module dis): Opcode collections. (line 45) +* hasname (in module dis): Opcode collections. (line 33) +* HAS_ALPN (in module ssl): Constants<9>. (line 375) +* has_children() (symtable.SymbolTable method): Examining Symbol Tables. + (line 39) +* has_colors() (in module curses): Functions<5>. (line 174) +* has_dualstack_ipv6() (in module socket): Creating sockets. (line 149) +* HAS_ECDH (in module ssl): Constants<9>. (line 391) +* has_extended_color_support() (in module curses): Functions<5>. + (line 179) +* has_extn() (smtplib.SMTP method): SMTP Objects. (line 85) +* has_function() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 212) +* has_header() (csv.Sniffer method): Module Contents<3>. (line 232) +* has_header() (urllib.request.Request method): Request Objects. + (line 95) +* has_ic() (in module curses): Functions<5>. (line 190) +* has_il() (in module curses): Functions<5>. (line 197) +* has_ipv6 (in module socket): Constants<8>. (line 242) +* has_key (2to3 fixer): Fixers. (line 119) +* has_key() (in module curses): Functions<5>. (line 204) +* has_location (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 446) +* HAS_NEVER_CHECK_COMMON_NAME (in module ssl): Constants<9>. (line 383) +* has_nonstandard_attr() (http.cookiejar.Cookie method): Cookie Objects<2>. + (line 94) +* HAS_NPN (in module ssl): Constants<9>. (line 406) +* has_option() (configparser.ConfigParser method): ConfigParser Objects. + (line 106) +* has_option() (optparse.OptionParser method): Querying and manipulating your option parser. + (line 42) +* has_section() (configparser.ConfigParser method): ConfigParser Objects. + (line 97) +* HAS_SNI (in module ssl): Constants<9>. (line 399) +* HAS_SSLv2 (in module ssl): Constants<9>. (line 416) +* HAS_SSLv3 (in module ssl): Constants<9>. (line 423) +* has_ticket (ssl.SSLSession attribute): SSL session. (line 20) +* HAS_TLSv1 (in module ssl): Constants<9>. (line 430) +* HAS_TLSv1_1 (in module ssl): Constants<9>. (line 437) +* HAS_TLSv1_2 (in module ssl): Constants<9>. (line 444) +* HAS_TLSv1_3 (in module ssl): Constants<9>. (line 451) +* HAVE_ARGUMENT (opcode): Python Bytecode Instructions. + (line 979) +* HAVE_CONTEXTVAR (in module decimal): Constants<4>. (line 32) +* HAVE_DOCSTRINGS (in module test.support): test support — Utilities for the Python test suite. + (line 156) +* HAVE_THREADS (in module decimal): Constants<4>. (line 25) +* HCI_DATA_DIR (in module socket): Constants<8>. (line 255) +* HCI_FILTER (in module socket): Constants<8>. (line 255) +* HCI_TIME_STAMP (in module socket): Constants<8>. (line 255) +* head() (nntplib.NNTP method): Methods<3>. (line 266) +* Header (class in email.header): email header Internationalized headers. + (line 60) +* HeaderError: tarfile — Read and write tar archive files. + (line 213) +* HeaderParseError: email errors Exception and Defect classes. + (line 26) +* HeaderParser (class in email.parser): Parser API. (line 106) +* HeaderRegistry (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 299) +* Headers (class in wsgiref.headers): wsgiref headers – WSGI response header tools. + (line 9) +* headers (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 56) +* headers (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 109) +* headers (urllib.error.HTTPError attribute): urllib error — Exception classes raised by urllib request. + (line 49) +* headers (urllib.response.addinfourl attribute): urllib response — Response classes used by urllib. + (line 19) +* headers (xmlrpc.client.ProtocolError attribute): ProtocolError Objects. + (line 25) +* header_encode() (email.charset.Charset method): email charset Representing character sets. + (line 118) +* header_encode_lines() (email.charset.Charset method): email charset Representing character sets. + (line 125) +* header_encoding (email.charset.Charset attribute): email charset Representing character sets. + (line 59) +* header_factory (email.policy.EmailPolicy attribute): email policy Policy Objects. + (line 391) +* header_fetch_parse() (email.policy.Compat32 method): email policy Policy Objects. + (line 578) +* header_fetch_parse() (email.policy.EmailPolicy method): email policy Policy Objects. + (line 441) +* header_fetch_parse() (email.policy.Policy method): email policy Policy Objects. + (line 302) +* header_items() (urllib.request.Request method): Request Objects. + (line 126) +* header_max_count() (email.policy.EmailPolicy method): email policy Policy Objects. + (line 418) +* header_max_count() (email.policy.Policy method): email policy Policy Objects. + (line 243) +* header_offset (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 131) +* header_source_parse() (email.policy.Compat32 method): email policy Policy Objects. + (line 566) +* header_source_parse() (email.policy.EmailPolicy method): email policy Policy Objects. + (line 424) +* header_source_parse() (email.policy.Policy method): email policy Policy Objects. + (line 265) +* header_store_parse() (email.policy.Compat32 method): email policy Policy Objects. + (line 574) +* header_store_parse() (email.policy.EmailPolicy method): email policy Policy Objects. + (line 432) +* header_store_parse() (email.policy.Policy method): email policy Policy Objects. + (line 286) +* heading() (in module turtle): Tell Turtle’s state. + (line 58) +* heading() (tkinter.ttk.Treeview method): ttk Treeview. (line 105) +* heapify() (in module heapq): heapq — Heap queue algorithm. + (line 56) +* heapmin() (in module msvcrt): Other Functions. (line 6) +* heappop() (in module heapq): heapq — Heap queue algorithm. + (line 42) +* heappush() (in module heapq): heapq — Heap queue algorithm. + (line 37) +* heappushpop() (in module heapq): heapq — Heap queue algorithm. + (line 49) +* heapreplace() (in module heapq): heapq — Heap queue algorithm. + (line 60) +* helo() (smtplib.SMTP method): SMTP Objects. (line 47) +* help (optparse.Option attribute): Option attributes. (line 72) +* help (pdb command): Debugger Commands. (line 52) +* help() (nntplib.NNTP method): Methods<3>. (line 214) +* help; online: pydoc — Documentation generator and online help system. + (line 8) +* herror: Exceptions<12>. (line 13) +* hex (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 129) +* hex() (bytearray method): Bytearray Objects. (line 52) +* hex() (bytes method): Bytes Objects. (line 78) +* hex() (float method): Additional Methods on Float. + (line 33) +* hex() (memoryview method): Memory Views. (line 185) +* hexadecimal literal: Numeric literals. (line 6) +* hexadecimal; literals: Numeric Types — int float complex. + (line 19) +* hexdigest() (hashlib.hash method): Hash algorithms. (line 142) +* hexdigest() (hashlib.shake method): SHAKE variable length digests. + (line 17) +* hexdigest() (hmac.HMAC method): hmac — Keyed-Hashing for Message Authentication. + (line 69) +* hexdigits (in module string): String constants. (line 28) +* hexlify() (in module binascii): binascii — Convert between binary and ASCII. + (line 114) +* hexversion (in module sys): sys — System-specific parameters and functions. + (line 948) +* hidden() (curses.panel.Panel method): Panel Objects. (line 25) +* hide() (curses.panel.Panel method): Panel Objects. (line 30) +* hide() (tkinter.ttk.Notebook method): ttk Notebook. (line 23) +* hideturtle() (in module turtle): Visibility. (line 6) +* hide_cookie2 (http.cookiejar.CookiePolicy attribute): CookiePolicy Objects. + (line 76) +* HierarchyRequestErr: Exceptions<17>. (line 29) +* HIGHEST_PROTOCOL (in module pickle): Module Interface. (line 14) +* HIGH_PRIORITY_CLASS (in module subprocess): Windows Constants. + (line 66) +* hits (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 124) +* HKEY_CLASSES_ROOT (in module winreg): HKEY_* Constants. (line 6) +* HKEY_CURRENT_CONFIG (in module winreg): HKEY_* Constants. (line 38) +* HKEY_CURRENT_USER (in module winreg): HKEY_* Constants. (line 12) +* HKEY_DYN_DATA (in module winreg): HKEY_* Constants. (line 43) +* HKEY_LOCAL_MACHINE (in module winreg): HKEY_* Constants. (line 19) +* HKEY_PERFORMANCE_DATA (in module winreg): HKEY_* Constants. + (line 31) +* HKEY_USERS (in module winreg): HKEY_* Constants. (line 25) +* hline() (curses.window method): Window Objects. (line 282) +* HList (class in tkinter.tix): Hierarchical ListBox. + (line 6) +* hls_to_rgb() (in module colorsys): colorsys — Conversions between color systems. + (line 40) +* HOME: os path<2>. (line 15) +* HOME <1>: Changes in the Python API<3>. + (line 117) +* HOME <2>: Windows<25>. (line 15) +* HOME <3>: Windows<25>. (line 18) +* HOME <4>: os path — Common pathname manipulations. + (line 135) +* HOME <5>: os path — Common pathname manipulations. + (line 152) +* HOME <6>: Tkinter Modules. (line 66) +* HOME <7>: distutils util — Miscellaneous other utility functions. + (line 97) +* HOME <8>: Location and names of config files. + (line 50) +* HOME <9>: Location and names of config files. + (line 67) +* home() (in module turtle): Turtle motion. (line 161) +* home() (pathlib.Path class method): Methods<2>. (line 25) +* HOMEDRIVE: os path — Common pathname manipulations. + (line 142) +* HOMEDRIVE <1>: Location and names of config files. + (line 68) +* HOMEPATH: os path — Common pathname manipulations. + (line 142) +* HOMEPATH <1>: Location and names of config files. + (line 68) +* hooks; import: Import hooks. (line 6) +* hooks; meta: Import hooks. (line 6) +* hooks; path: Import hooks. (line 6) +* hook_compressed() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 196) +* hook_encoded() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 216) +* host (urllib.request.Request attribute): Request Objects. (line 25) +* hostmask (ipaddress.IPv4Network attribute): Network objects. + (line 97) +* hostmask (ipaddress.IPv6Network attribute): Network objects. + (line 313) +* hostname_checks_common_name (ssl.SSLContext attribute): SSL Contexts. + (line 601) +* hosts (netrc.netrc attribute): netrc Objects. (line 23) +* hosts() (ipaddress.IPv4Network method): Network objects. (line 136) +* hosts() (ipaddress.IPv6Network method): Network objects. (line 331) +* hour (datetime.datetime attribute): datetime Objects. (line 285) +* hour (datetime.time attribute): time Objects. (line 50) +* HRESULT (class in ctypes): Fundamental data types<2>. + (line 207) +* hStdError (subprocess.STARTUPINFO attribute): Windows Popen Helpers. + (line 42) +* hStdInput (subprocess.STARTUPINFO attribute): Windows Popen Helpers. + (line 27) +* hStdOutput (subprocess.STARTUPINFO attribute): Windows Popen Helpers. + (line 35) +* hsv_to_rgb() (in module colorsys): colorsys — Conversions between color systems. + (line 48) +* ht() (in module turtle): Visibility. (line 6) +* HTML: html parser — Simple HTML and XHTML parser. + (line 8) +* HTML <1>: urllib request Restrictions. + (line 29) +* html() (in module cgitb): cgitb — Traceback manager for CGI scripts. + (line 60) +* html5 (in module html.entities): html entities — Definitions of HTML general entities. + (line 14) +* HTMLCalendar (class in calendar): calendar — General calendar-related functions. + (line 163) +* HtmlDiff (class in difflib): difflib — Helpers for computing deltas. + (line 81) +* HTMLParser (class in html.parser): html parser — Simple HTML and XHTML parser. + (line 14) +* htonl() (in module socket): Other functions<2>. (line 214) +* htons() (in module socket): Other functions<2>. (line 221) +* HTTP (in module email.policy): email policy Policy Objects. + (line 508) +* http.server; security: Security Considerations<3>. + (line 6) +* HTTP; http (standard module): http — HTTP modules. + (line 8) +* HTTP; http.client (standard module): http client — HTTP protocol client. + (line 8) +* HTTP; protocol: urllib request Restrictions. + (line 6) +* HTTP; protocol <1>: urllib request Restrictions. + (line 29) +* HTTP; protocol <2>: http — HTTP modules. + (line 8) +* HTTP; protocol <3>: http client — HTTP protocol client. + (line 8) +* HTTP; protocol <4>: http server — HTTP servers. + (line 8) +* HTTP; protocol <5>: cgi — Common Gateway Interface support. + (line 8) +* HTTPBasicAuthHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 358) +* HTTPConnection (class in http.client): http client — HTTP protocol client. + (line 31) +* HTTPCookieProcessor (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 289) +* httpd: http server — HTTP servers. + (line 8) +* HTTPDefaultErrorHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 280) +* HTTPDigestAuthHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 382) +* HTTPError: urllib error — Exception classes raised by urllib request. + (line 30) +* HTTPErrorProcessor (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 442) +* HTTPException: http client — HTTP protocol client. + (line 138) +* HTTPHandler (class in logging.handlers): HTTPHandler. (line 10) +* HTTPHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 406) +* HTTPMethod (class in http): HTTP status codes. (line 212) +* HTTPPasswordMgr (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 315) +* HTTPPasswordMgrWithDefaultRealm (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 319) +* HTTPPasswordMgrWithPriorAuth (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 325) +* HTTPRedirectHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 285) +* HTTPResponse (class in http.client): http client — HTTP protocol client. + (line 107) +* HTTPSConnection (class in http.client): http client — HTTP protocol client. + (line 62) +* HTTPServer (class in http.server): http server — HTTP servers. + (line 30) +* HTTPSHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 410) +* HTTPStatus (class in http): http — HTTP modules. + (line 27) +* https_open() (urllib.request.HTTPSHandler method): HTTPSHandler Objects. + (line 6) +* HTTPS_PORT (in module http.client): http client — HTTP protocol client. + (line 211) +* https_response() (urllib.request.HTTPErrorProcessor method): HTTPErrorProcessor Objects. + (line 18) +* http_error_301() (urllib.request.HTTPRedirectHandler method): HTTPRedirectHandler Objects. + (line 35) +* http_error_302() (urllib.request.HTTPRedirectHandler method): HTTPRedirectHandler Objects. + (line 42) +* http_error_303() (urllib.request.HTTPRedirectHandler method): HTTPRedirectHandler Objects. + (line 48) +* http_error_307() (urllib.request.HTTPRedirectHandler method): HTTPRedirectHandler Objects. + (line 54) +* http_error_308() (urllib.request.HTTPRedirectHandler method): HTTPRedirectHandler Objects. + (line 61) +* http_error_401() (urllib.request.HTTPBasicAuthHandler method): HTTPBasicAuthHandler Objects. + (line 6) +* http_error_401() (urllib.request.HTTPDigestAuthHandler method): HTTPDigestAuthHandler Objects. + (line 6) +* http_error_407() (urllib.request.ProxyBasicAuthHandler method): ProxyBasicAuthHandler Objects. + (line 6) +* http_error_407() (urllib.request.ProxyDigestAuthHandler method): ProxyDigestAuthHandler Objects. + (line 6) +* http_error_auth_reqed() (urllib.request.AbstractBasicAuthHandler method): AbstractBasicAuthHandler Objects. + (line 6) +* http_error_auth_reqed() (urllib.request.AbstractDigestAuthHandler method): AbstractDigestAuthHandler Objects. + (line 6) +* http_error_default() (urllib.request.BaseHandler method): BaseHandler Objects. + (line 66) +* http_open() (urllib.request.HTTPHandler method): HTTPHandler Objects. + (line 6) +* HTTP_PORT (in module http.client): http client — HTTP protocol client. + (line 207) +* http_proxy: urllib request — Extensible library for opening URLs. + (line 83) +* http_proxy <1>: Examples<25>. (line 97) +* http_proxy <2>: Basic Authentication. + (line 62) +* http_response() (urllib.request.HTTPErrorProcessor method): HTTPErrorProcessor Objects. + (line 6) +* http_version (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 303) +* hypot() (in module math): Trigonometric functions. + (line 47) +* I (in module re): Flags. (line 35) +* I/O control; buffering: Built-in Functions. (line 1307) +* I/O control; buffering <1>: Socket Objects. (line 211) +* iadd() (in module operator): In-place Operators. (line 36) +* iand() (in module operator): In-place Operators. (line 41) +* iconcat() (in module operator): In-place Operators. (line 46) +* id (ssl.SSLSession attribute): SSL session. (line 12) +* id() (unittest.TestCase method): Test cases. (line 751) +* idcok() (curses.window method): Window Objects. (line 289) +* ident (select.kevent attribute): Kevent Objects. (line 8) +* ident (threading.Thread attribute): Thread Objects. (line 166) +* identchars (cmd.Cmd attribute): Cmd Objects. (line 133) +* identifier: Identifiers and keywords. + (line 6) +* identifier <1>: Identifiers Names. (line 6) +* identify() (tkinter.ttk.Notebook method): ttk Notebook. (line 32) +* identify() (tkinter.ttk.Treeview method): ttk Treeview. (line 143) +* identify() (tkinter.ttk.Widget method): ttk Widget. (line 11) +* identify_column() (tkinter.ttk.Treeview method): ttk Treeview. + (line 153) +* identify_element() (tkinter.ttk.Treeview method): ttk Treeview. + (line 182) +* identify_region() (tkinter.ttk.Treeview method): ttk Treeview. + (line 160) +* identify_row() (tkinter.ttk.Treeview method): ttk Treeview. + (line 149) +* identity of an object: Objects values and types. + (line 11) +* identity; test: Membership test operations. + (line 39) +* idioms (2to3 fixer): Fixers. (line 123) +* IDLE: IDLE<52>. (line 8) +* IDLE <1>: Glossary. (line 652) +* IDLESTARTUP: IDLE<25>. (line 176) +* IDLESTARTUP <1>: IDLE<29>. (line 9) +* IDLESTARTUP <2>: IDLE<35>. (line 9) +* IDLESTARTUP <3>: Startup and Code Execution. + (line 7) +* IDLE_PRIORITY_CLASS (in module subprocess): Windows Constants. + (line 73) +* idlok() (curses.window method): Window Objects. (line 297) +* If (class in ast): Control flow. (line 9) +* if; conditional expression: Conditional expressions. + (line 6) +* if; in comprehensions: Displays for lists sets and dictionaries. + (line 14) +* IfExp (class in ast): Expressions<2>. (line 158) +* ifloordiv() (in module operator): In-place Operators. (line 52) +* if_indextoname() (in module socket): Other functions<2>. (line 414) +* if_nameindex() (in module socket): Other functions<2>. (line 371) +* if_nametoindex() (in module socket): Other functions<2>. (line 396) +* iglob() (in module glob): glob — Unix style pathname pattern expansion. + (line 78) +* ignorableWhitespace() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 150) +* ignore (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 120) +* ignore (pdb command): Debugger Commands. (line 116) +* ignore; error handler’s name: Error Handlers. (line 15) +* IGNORECASE (in module re): Flags. (line 35) +* ignore_errors() (in module codecs): Error Handlers. (line 147) +* IGNORE_EXCEPTION_DETAIL (in module doctest): Option Flags. (line 58) +* ignore_patterns() (in module shutil): Directory and files operations. + (line 185) +* ihave() (nntplib.NNTP method): Methods<3>. (line 291) +* IISCGIHandler (class in wsgiref.handlers): wsgiref handlers – server/gateway base classes. + (line 24) +* ilshift() (in module operator): In-place Operators. (line 57) +* imag (numbers.Complex attribute): The numeric tower. (line 19) +* imaginary literal: Numeric literals. (line 6) +* imap() (multiprocessing.pool.Pool method): Process Pools. (line 126) +* IMAP4 (class in imaplib): imaplib — IMAP4 protocol client. + (line 25) +* IMAP4.abort: imaplib — IMAP4 protocol client. + (line 58) +* IMAP4.error: imaplib — IMAP4 protocol client. + (line 53) +* IMAP4.readonly: imaplib — IMAP4 protocol client. + (line 65) +* IMAP4; protocol: imaplib — IMAP4 protocol client. + (line 8) +* IMAP4_SSL (class in imaplib): imaplib — IMAP4 protocol client. + (line 74) +* IMAP4_SSL; protocol: imaplib — IMAP4 protocol client. + (line 8) +* IMAP4_stream (class in imaplib): imaplib — IMAP4 protocol client. + (line 114) +* IMAP4_stream; protocol: imaplib — IMAP4 protocol client. + (line 8) +* imap_unordered() (multiprocessing.pool.Pool method): Process Pools. + (line 141) +* imatmul() (in module operator): In-place Operators. (line 72) +* immedok() (curses.window method): Window Objects. (line 303) +* immutable: Glossary. (line 658) +* immutable object: Objects values and types. + (line 11) +* immutable; data; type: Literals<2>. (line 17) +* immutable; object: Literals<2>. (line 17) +* immutable; object <1>: Dictionary displays. + (line 37) +* immutable; sequence; types: Immutable Sequence Types. + (line 6) +* imod() (in module operator): In-place Operators. (line 62) +* ImpImporter (class in pkgutil): pkgutil — Package extension utility. + (line 53) +* implementation (in module sys): sys — System-specific parameters and functions. + (line 971) +* ImpLoader (class in pkgutil): pkgutil — Package extension utility. + (line 69) +* impl_detail() (in module test.support): test support — Utilities for the Python test suite. + (line 499) +* import (2to3 fixer): Fixers. (line 139) +* Import (class in ast): Imports. (line 6) +* import hooks: Import hooks. (line 6) +* import machinery: The import system. (line 6) +* import path: Glossary. (line 666) +* importer: Glossary. (line 679) +* ImportError: Concrete exceptions. + (line 45) +* ImportFrom (class in ast): Imports. (line 21) +* importing: Glossary. (line 674) +* imports (2to3 fixer): Fixers. (line 143) +* imports2 (2to3 fixer): Fixers. (line 147) +* ImportWarning: Warnings. (line 57) +* import_fresh_module() (in module test.support.import_helper): test support import_helper — Utilities for import tests. + (line 16) +* IMPORT_FROM (opcode): Python Bytecode Instructions. + (line 576) +* import_module() (in module importlib): Functions<11>. (line 15) +* import_module() (in module test.support.import_helper): test support import_helper — Utilities for import tests. + (line 52) +* IMPORT_NAME (opcode): Python Bytecode Instructions. + (line 567) +* IMPORT_STAR (opcode): Python Bytecode Instructions. + (line 288) +* ImproperConnectionState: http client — HTTP protocol client. + (line 168) +* imul() (in module operator): In-place Operators. (line 67) +* In (class in ast): Expressions<2>. (line 109) +* inch() (curses.window method): Window Objects. (line 311) +* inclusive (tracemalloc.DomainFilter attribute): DomainFilter. + (line 12) +* inclusive (tracemalloc.Filter attribute): Filter. (line 39) +* inclusive; or: Binary bitwise operations. + (line 20) +* Incomplete: binascii — Convert between binary and ASCII. + (line 161) +* IncompleteRead: http client — HTTP protocol client. + (line 164) +* IncompleteReadError: Exceptions<10>. (line 43) +* IncrementalDecoder (class in codecs): IncrementalDecoder Objects. + (line 11) +* incrementaldecoder (codecs.CodecInfo attribute): codecs — Codec registry and base classes. + (line 78) +* IncrementalEncoder (class in codecs): IncrementalEncoder Objects. + (line 11) +* incrementalencoder (codecs.CodecInfo attribute): codecs — Codec registry and base classes. + (line 78) +* IncrementalNewlineDecoder (class in io): Text I/O<2>. (line 249) +* IncrementalParser (class in xml.sax.xmlreader): xml sax xmlreader — Interface for XML parsers. + (line 20) +* increment_lineno() (in module ast): ast Helpers. (line 133) +* incr_item(): Exceptions<19>. (line 78) +* incr_item() <1>: Exceptions<19>. (line 123) +* indent (doctest.Example attribute): Example Objects. (line 47) +* INDENT (in module token): token — Constants used with Python parse trees. + (line 50) +* INDENT token: Indentation. (line 33) +* indent() (in module textwrap): textwrap — Text wrapping and filling. + (line 102) +* indent() (in module xml.etree.ElementTree): Functions<8>. (line 118) +* indentation: Indentation. (line 6) +* IndentationError: Concrete exceptions. + (line 321) +* index (inspect.FrameInfo attribute): The interpreter stack. + (line 37) +* index (inspect.Traceback attribute): The interpreter stack. + (line 77) +* index operation: The standard type hierarchy. + (line 132) +* index() (array.array method): array — Efficient arrays of numeric values. + (line 185) +* index() (bytearray method): Bytes and Bytearray Operations. + (line 147) +* index() (bytes method): Bytes and Bytearray Operations. + (line 147) +* index() (collections.deque method): deque objects. (line 70) +* index() (in module operator): operator — Standard operators as functions. + (line 93) +* index() (multiprocessing.shared_memory.ShareableList method): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 268) +* index() (sequence method): Common Sequence Operations. + (line 21) +* index() (str method): String Methods<2>. (line 170) +* index() (tkinter.ttk.Notebook method): ttk Notebook. (line 37) +* index() (tkinter.ttk.Treeview method): ttk Treeview. (line 188) +* IndexError: Concrete exceptions. + (line 66) +* indexOf() (in module operator): operator — Standard operators as functions. + (line 201) +* IndexSizeErr: Exceptions<17>. (line 34) +* indices() (slice method): The standard type hierarchy. + (line 902) +* inet_aton() (in module socket): Other functions<2>. (line 231) +* inet_ntoa() (in module socket): Other functions<2>. (line 251) +* inet_ntop() (in module socket): Other functions<2>. (line 286) +* inet_pton() (in module socket): Other functions<2>. (line 268) +* Inexact (class in decimal): Signals. (line 42) +* inf (in module cmath): Constants<3>. (line 20) +* inf (in module math): Constants<2>. (line 24) +* infile (shlex.shlex attribute): shlex Objects. (line 140) +* Infinity: Built-in Functions. (line 630) +* infj (in module cmath): Constants<3>. (line 26) +* info() (dis.Bytecode method): Bytecode analysis. (line 54) +* info() (gettext.NullTranslations method): The NullTranslations class. + (line 63) +* info() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 84) +* info() (in module logging): Module-Level Functions. + (line 124) +* info() (logging.Logger method): Logger Objects. (line 232) +* info() (urllib.response.addinfourl method): urllib response — Response classes used by urllib. + (line 35) +* infolist() (zipfile.ZipFile method): ZipFile Objects. (line 118) +* inheritance: Class definitions. (line 6) +* ini file: configparser — Configuration file parser. + (line 8) +* init() (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 78) +* inited (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 117) +* initgroups() (in module os): Process Parameters. (line 323) +* initialize_options() (distutils.cmd.Command method): Creating a new Distutils command. + (line 21) +* initial_indent (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 210) +* initproc (C type): Slot Type typedefs. (line 35) +* initscr() (in module curses): Functions<5>. (line 243) +* init_color() (in module curses): Functions<5>. (line 218) +* init_database() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 62) +* init_pair() (in module curses): Functions<5>. (line 230) +* inode() (os.DirEntry method): Files and Directories. + (line 878) +* input: Expression input. (line 6) +* input (2to3 fixer): Fixers. (line 153) +* input() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 56) +* InputOnly (class in tkinter.tix): Miscellaneous Widgets. + (line 6) +* InputSource (class in xml.sax.xmlreader): xml sax xmlreader — Interface for XML parsers. + (line 51) +* InputStream (class in wsgiref.types): wsgiref types – WSGI types for static type checking. + (line 24) +* input_charset (email.charset.Charset attribute): email charset Representing character sets. + (line 53) +* input_codec (email.charset.Charset attribute): email charset Representing character sets. + (line 82) +* inquiry (C type): Supporting Cyclic Garbage Collection. + (line 174) +* insch() (curses.window method): Window Objects. (line 317) +* insdelln() (curses.window method): Window Objects. (line 324) +* insert() (array.array method): array — Efficient arrays of numeric values. + (line 195) +* insert() (collections.deque method): deque objects. (line 78) +* insert() (sequence method): Mutable Sequence Types. + (line 16) +* insert() (tkinter.ttk.Notebook method): ttk Notebook. (line 42) +* insert() (tkinter.ttk.Treeview method): ttk Treeview. (line 193) +* insert() (xml.etree.ElementTree.Element method): Element Objects. + (line 130) +* insertBefore() (xml.dom.Node method): Node Objects. (line 121) +* insertln() (curses.window method): Window Objects. (line 332) +* insert_text() (in module readline): Line buffer. (line 13) +* insnstr() (curses.window method): Window Objects. (line 337) +* insort() (in module bisect): bisect — Array bisection algorithm. + (line 82) +* insort_left() (in module bisect): bisect — Array bisection algorithm. + (line 65) +* insort_right() (in module bisect): bisect — Array bisection algorithm. + (line 82) +* inspect command line option; –details: Command Line Interface<3>. + (line 13) +* InspectLoader (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 320) +* insstr() (curses.window method): Window Objects. (line 348) +* install() (gettext.NullTranslations method): The NullTranslations class. + (line 72) +* install() (in module gettext): Class-based API. (line 71) +* installHandler() (in module unittest): Signal Handling. (line 29) +* install_opener() (in module urllib.request): urllib request — Extensible library for opening URLs. + (line 119) +* install_scripts() (venv.EnvBuilder method): API<2>. (line 146) +* instance; call: Calls. (line 156) +* instate() (tkinter.ttk.Widget method): ttk Widget. (line 18) +* instr() (curses.window method): Window Objects. (line 358) +* instream (shlex.shlex attribute): shlex Objects. (line 146) +* Instruction (class in dis): Python Bytecode Instructions. + (line 10) +* Instruction.arg (in module dis): Python Bytecode Instructions. + (line 24) +* Instruction.argrepr (in module dis): Python Bytecode Instructions. + (line 32) +* Instruction.argval (in module dis): Python Bytecode Instructions. + (line 28) +* Instruction.is_jump_target (in module dis): Python Bytecode Instructions. + (line 45) +* Instruction.offset (in module dis): Python Bytecode Instructions. + (line 37) +* Instruction.opcode (in module dis): Python Bytecode Instructions. + (line 14) +* Instruction.opname (in module dis): Python Bytecode Instructions. + (line 20) +* Instruction.positions (in module dis): Python Bytecode Instructions. + (line 49) +* Instruction.starts_line (in module dis): Python Bytecode Instructions. + (line 41) +* int (built-in class): Built-in Functions. (line 857) +* int (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 133) +* Int2AP() (in module imaplib): imaplib — IMAP4 protocol client. + (line 128) +* integer: The standard type hierarchy. + (line 161) +* integer literal: Numeric literals. (line 6) +* integer; literals: Numeric Types — int float complex. + (line 19) +* integer; representation: The standard type hierarchy. + (line 106) +* Integral (class in numbers): The numeric tower. (line 59) +* Integrated Development Environment: IDLE<52>. (line 8) +* IntegrityError: Exceptions<6>. (line 65) +* Intel/DVI ADPCM: audioop — Manipulate raw audio data. + (line 20) +* IntEnum (class in enum): Data Types<2>. (line 278) +* interact (pdb command): Debugger Commands. (line 280) +* interact() (code.InteractiveConsole method): Interactive Console Objects. + (line 10) +* interact() (in module code): code — Interpreter base classes. + (line 32) +* interact() (telnetlib.Telnet method): Telnet Objects. (line 112) +* interactive: Glossary. (line 684) +* interactive mode: Complete Python programs. + (line 19) +* InteractiveConsole (class in code): code — Interpreter base classes. + (line 25) +* InteractiveInterpreter (class in code): code — Interpreter base classes. + (line 15) +* InterfaceError: Exceptions<6>. (line 37) +* intern (2to3 fixer): Fixers. (line 157) +* intern() (in module sys): sys — System-specific parameters and functions. + (line 1062) +* internal type: The standard type hierarchy. + (line 690) +* Internaldate2tuple() (in module imaplib): imaplib — IMAP4 protocol client. + (line 122) +* InternalError: Exceptions<6>. (line 71) +* internalSubset (xml.dom.DocumentType attribute): DocumentType Objects. + (line 27) +* internal_attr (zipfile.ZipInfo attribute): ZipInfo Objects. + (line 123) +* Internet: Internet Protocols and Support. + (line 6) +* INTERNET_TIMEOUT (in module test.support): test support — Utilities for the Python test suite. + (line 65) +* interpolated string literal: String literal concatenation. + (line 24) +* interpolation, string (%): printf-style String Formatting. + (line 6) +* interpolation; bytearray (%): printf-style Bytes Formatting. + (line 6) +* interpolation; bytes (%): printf-style Bytes Formatting. + (line 6) +* InterpolationDepthError: Exceptions<7>. (line 42) +* InterpolationError: Exceptions<7>. (line 37) +* InterpolationMissingOptionError: Exceptions<7>. (line 49) +* InterpolationSyntaxError: Exceptions<7>. (line 54) +* interpreted: Glossary. (line 693) +* interpreter: Top-level components. + (line 6) +* interpreter lock: Thread State and the Global Interpreter Lock. + (line 6) +* interpreter prompts: sys — System-specific parameters and functions. + (line 1333) +* interpreter shutdown: Glossary. (line 704) +* interpreter_requires_environment() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 9) +* interrupt() (sqlite3.Connection method): Connection objects. + (line 319) +* InterruptedError: OS exceptions. (line 73) +* interrupt_main() (in module _thread): _thread — Low-level threading API. + (line 53) +* intersection() (frozenset method): Set Types — set frozenset. + (line 102) +* intersection_update() (frozenset method): Set Types — set frozenset. + (line 175) +* IntFlag (class in enum): Data Types<2>. (line 435) +* intro (cmd.Cmd attribute): Cmd Objects. (line 148) +* int_info (in module sys): sys — System-specific parameters and functions. + (line 1014) +* InuseAttributeErr: Exceptions<17>. (line 39) +* inv() (in module operator): operator — Standard operators as functions. + (line 102) +* InvalidAccessErr: Exceptions<17>. (line 44) +* invalidate_caches() (importlib.abc.MetaPathFinder method): importlib abc – Abstract base classes related to import. + (line 90) +* invalidate_caches() (importlib.abc.PathEntryFinder method): importlib abc – Abstract base classes related to import. + (line 157) +* invalidate_caches() (importlib.machinery.FileFinder method): importlib machinery – Importers and path hooks. + (line 205) +* invalidate_caches() (importlib.machinery.PathFinder class method): importlib machinery – Importers and path hooks. + (line 146) +* invalidate_caches() (in module importlib): Functions<11>. (line 62) +* invalidate_caches() (zipimport.zipimporter method): zipimporter Objects. + (line 105) +* InvalidCharacterErr: Exceptions<17>. (line 49) +* InvalidModificationErr: Exceptions<17>. (line 57) +* InvalidOperation (class in decimal): Signals. (line 50) +* InvalidStateErr: Exceptions<17>. (line 61) +* InvalidStateError: Exception classes. (line 26) +* InvalidStateError <1>: Exceptions<10>. (line 29) +* InvalidTZPathWarning: Exceptions and warnings. + (line 12) +* InvalidURL: http client — HTTP protocol client. + (line 147) +* inversion: Unary arithmetic and bitwise operations. + (line 17) +* Invert (class in ast): Expressions<2>. (line 28) +* invert() (in module operator): operator — Standard operators as functions. + (line 102) +* invocation: The standard type hierarchy. + (line 297) +* inv_cdf() (statistics.NormalDist method): NormalDist objects. + (line 86) +* in_dll() (ctypes._CData method): Data types. (line 63) +* in_table_a1() (in module stringprep): stringprep — Internet String Preparation. + (line 40) +* in_table_b1() (in module stringprep): stringprep — Internet String Preparation. + (line 45) +* in_table_c11() (in module stringprep): stringprep — Internet String Preparation. + (line 60) +* in_table_c11_c12() (in module stringprep): stringprep — Internet String Preparation. + (line 69) +* in_table_c12() (in module stringprep): stringprep — Internet String Preparation. + (line 64) +* in_table_c21() (in module stringprep): stringprep — Internet String Preparation. + (line 74) +* in_table_c21_c22() (in module stringprep): stringprep — Internet String Preparation. + (line 84) +* in_table_c22() (in module stringprep): stringprep — Internet String Preparation. + (line 79) +* in_table_c3() (in module stringprep): stringprep — Internet String Preparation. + (line 89) +* in_table_c4() (in module stringprep): stringprep — Internet String Preparation. + (line 93) +* in_table_c5() (in module stringprep): stringprep — Internet String Preparation. + (line 98) +* in_table_c6() (in module stringprep): stringprep — Internet String Preparation. + (line 102) +* in_table_c7() (in module stringprep): stringprep — Internet String Preparation. + (line 107) +* in_table_c8() (in module stringprep): stringprep — Internet String Preparation. + (line 112) +* in_table_c9() (in module stringprep): stringprep — Internet String Preparation. + (line 117) +* in_table_d1() (in module stringprep): stringprep — Internet String Preparation. + (line 121) +* in_table_d2() (in module stringprep): stringprep — Internet String Preparation. + (line 126) +* in_transaction (sqlite3.Connection attribute): Connection objects. + (line 638) +* IO (class in typing): Other concrete types. + (line 6) +* IOBase (class in io): I/O Base Classes. (line 6) +* ioctl() (in module fcntl): fcntl — The fcntl and ioctl system calls. + (line 73) +* ioctl() (socket.socket method): Socket Objects. (line 178) +* IOCTL_VM_SOCKETS_GET_LOCAL_CID (in module socket): Constants<8>. + (line 223) +* IOError: Concrete exceptions. + (line 459) +* ior() (in module operator): In-place Operators. (line 79) +* IO_REPARSE_TAG_APPEXECLINK (in module stat): stat — Interpreting stat results. + (line 418) +* IO_REPARSE_TAG_MOUNT_POINT (in module stat): stat — Interpreting stat results. + (line 418) +* IO_REPARSE_TAG_SYMLINK (in module stat): stat — Interpreting stat results. + (line 418) +* ip (ipaddress.IPv4Interface attribute): Interface objects. (line 19) +* ip (ipaddress.IPv6Interface attribute): Interface objects. (line 74) +* ipow() (in module operator): In-place Operators. (line 84) +* IPv4Address (class in ipaddress): Address objects. (line 13) +* IPv4Interface (class in ipaddress): Interface objects. (line 9) +* IPv4Network (class in ipaddress): Network objects. (line 13) +* ipv4_mapped (ipaddress.IPv6Address attribute): Address objects. + (line 240) +* IPv6Address (class in ipaddress): Address objects. (line 161) +* IPv6Interface (class in ipaddress): Interface objects. (line 64) +* IPv6Network (class in ipaddress): Network objects. (line 253) +* IPV6_ENABLED (in module test.support.socket_helper): test support socket_helper — Utilities for socket tests. + (line 11) +* ip_address() (in module ipaddress): Convenience factory functions. + (line 9) +* ip_interface() (in module ipaddress): Convenience factory functions. + (line 37) +* ip_network() (in module ipaddress): Convenience factory functions. + (line 23) +* irrefutable case block: Irrefutable Case Blocks. + (line 6) +* irshift() (in module operator): In-place Operators. (line 89) +* Is (class in ast): Expressions<2>. (line 109) +* isabs() (in module os.path): os path — Common pathname manipulations. + (line 200) +* isabstract() (in module inspect): Types and members. (line 455) +* IsADirectoryError: OS exceptions. (line 83) +* isalnum() (bytearray method): Bytes and Bytearray Operations. + (line 502) +* isalnum() (bytes method): Bytes and Bytearray Operations. + (line 502) +* isalnum() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 131) +* isalnum() (str method): String Methods<2>. (line 175) +* isalpha() (bytearray method): Bytes and Bytearray Operations. + (line 520) +* isalpha() (bytes method): Bytes and Bytearray Operations. + (line 520) +* isalpha() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 136) +* isalpha() (str method): String Methods<2>. (line 182) +* isascii() (bytearray method): Bytes and Bytearray Operations. + (line 535) +* isascii() (bytes method): Bytes and Bytearray Operations. + (line 535) +* isascii() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 141) +* isascii() (str method): String Methods<2>. (line 192) +* isasyncgen() (in module inspect): Types and members. (line 415) +* isasyncgenfunction() (in module inspect): Types and members. + (line 398) +* isatty() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 91) +* isatty() (in module os): File Descriptor Operations. + (line 225) +* isatty() (io.IOBase method): I/O Base Classes. (line 73) +* isawaitable() (in module inspect): Types and members. (line 379) +* isblank() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 145) +* isblk() (tarfile.TarInfo method): TarInfo Objects. (line 120) +* isbuiltin() (in module inspect): Types and members. (line 435) +* ischr() (tarfile.TarInfo method): TarInfo Objects. (line 116) +* isclass() (in module inspect): Types and members. (line 335) +* isclose() (in module cmath): Classification functions. + (line 23) +* isclose() (in module math): Number-theoretic and representation functions. + (line 111) +* iscntrl() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 149) +* iscode() (in module inspect): Types and members. (line 431) +* iscoroutine() (in module inspect): Types and members. (line 372) +* iscoroutinefunction() (in module inspect): Types and members. + (line 361) +* isctrl() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 190) +* isDaemon() (threading.Thread method): Thread Objects. (line 214) +* isdatadescriptor() (in module inspect): Types and members. (line 477) +* isdecimal() (str method): String Methods<2>. (line 200) +* isdev() (tarfile.TarInfo method): TarInfo Objects. (line 128) +* isdigit() (bytearray method): Bytes and Bytearray Operations. + (line 543) +* isdigit() (bytes method): Bytes and Bytearray Operations. + (line 543) +* isdigit() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 154) +* isdigit() (str method): String Methods<2>. (line 208) +* isdir() (in module os.path): os path — Common pathname manipulations. + (line 216) +* isdir() (tarfile.TarInfo method): TarInfo Objects. (line 104) +* isdisjoint() (frozenset method): Set Types — set frozenset. + (line 68) +* isdown() (in module turtle): Drawing state. (line 86) +* iselement() (in module xml.etree.ElementTree): Functions<8>. + (line 130) +* isenabled() (in module gc): gc — Garbage Collector interface. + (line 30) +* isEnabledFor() (logging.Logger method): Logger Objects. (line 101) +* isendwin() (in module curses): Functions<5>. (line 256) +* ISEOF() (in module token): token — Constants used with Python parse trees. + (line 34) +* isfifo() (tarfile.TarInfo method): TarInfo Objects. (line 124) +* isfile() (in module os.path): os path — Common pathname manipulations. + (line 208) +* isfile() (tarfile.TarInfo method): TarInfo Objects. (line 96) +* isfinite() (in module cmath): Classification functions. + (line 6) +* isfinite() (in module math): Number-theoretic and representation functions. + (line 144) +* isfirstline() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 111) +* isframe() (in module inspect): Types and members. (line 427) +* isfunction() (in module inspect): Types and members. (line 344) +* isfuture() (in module asyncio): Future Functions. (line 6) +* isgenerator() (in module inspect): Types and members. (line 357) +* isgeneratorfunction() (in module inspect): Types and members. + (line 349) +* isgetsetdescriptor() (in module inspect): Types and members. + (line 490) +* isgraph() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 159) +* isidentifier() (str method): String Methods<2>. (line 218) +* isinf() (in module cmath): Classification functions. + (line 13) +* isinf() (in module math): Number-theoretic and representation functions. + (line 151) +* isinstance (2to3 fixer): Fixers. (line 161) +* iskeyword() (in module keyword): keyword — Testing for Python keywords. + (line 13) +* isleap() (in module calendar): calendar — General calendar-related functions. + (line 298) +* islice() (in module itertools): Itertool functions. (line 355) +* islink() (in module os.path): os path — Common pathname manipulations. + (line 224) +* islnk() (tarfile.TarInfo method): TarInfo Objects. (line 112) +* islower() (bytearray method): Bytes and Bytearray Operations. + (line 557) +* islower() (bytes method): Bytes and Bytearray Operations. + (line 557) +* islower() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 163) +* islower() (str method): String Methods<2>. (line 236) +* ismemberdescriptor() (in module inspect): Types and members. + (line 499) +* ismeta() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 194) +* ismethod() (in module inspect): Types and members. (line 340) +* ismethoddescriptor() (in module inspect): Types and members. + (line 459) +* ismethodwrapper() (in module inspect): Types and members. (line 440) +* ismodule() (in module inspect): Types and members. (line 331) +* ismount() (in module os.path): os path — Common pathname manipulations. + (line 232) +* isnan() (in module cmath): Classification functions. + (line 18) +* isnan() (in module math): Number-theoretic and representation functions. + (line 156) +* ISNONTERMINAL() (in module token): token — Constants used with Python parse trees. + (line 30) +* IsNot (class in ast): Expressions<2>. (line 109) +* isnumeric() (str method): String Methods<2>. (line 242) +* isocalendar() (datetime.date method): date Objects. (line 217) +* isocalendar() (datetime.datetime method): datetime Objects. + (line 602) +* isoformat() (datetime.date method): date Objects. (line 244) +* isoformat() (datetime.datetime method): datetime Objects. (line 607) +* isoformat() (datetime.time method): time Objects. (line 167) +* IsolatedAsyncioTestCase (class in unittest): Test cases. (line 851) +* isolation_level (sqlite3.Connection attribute): Connection objects. + (line 648) +* isoweekday() (datetime.date method): date Objects. (line 210) +* isoweekday() (datetime.datetime method): datetime Objects. (line 596) +* isprint() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 167) +* isprintable() (str method): String Methods<2>. (line 252) +* ispunct() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 171) +* isqrt() (in module math): Number-theoretic and representation functions. + (line 161) +* isreadable() (in module pprint): pprint — Data pretty printer. + (line 151) +* isreadable() (pprint.PrettyPrinter method): PrettyPrinter Objects. + (line 24) +* isrecursive() (in module pprint): pprint — Data pretty printer. + (line 160) +* isrecursive() (pprint.PrettyPrinter method): PrettyPrinter Objects. + (line 32) +* isreg() (tarfile.TarInfo method): TarInfo Objects. (line 100) +* isReservedKey() (http.cookies.Morsel method): Morsel Objects. + (line 68) +* isroutine() (in module inspect): Types and members. (line 450) +* isSameNode() (xml.dom.Node method): Node Objects. (line 102) +* issoftkeyword() (in module keyword): keyword — Testing for Python keywords. + (line 24) +* isspace() (bytearray method): Bytes and Bytearray Operations. + (line 574) +* isspace() (bytes method): Bytes and Bytearray Operations. + (line 574) +* isspace() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 176) +* isspace() (str method): String Methods<2>. (line 264) +* isstdin() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 116) +* issubset() (frozenset method): Set Types — set frozenset. + (line 74) +* issuperset() (frozenset method): Set Types — set frozenset. + (line 85) +* issym() (tarfile.TarInfo method): TarInfo Objects. (line 108) +* ISTERMINAL() (in module token): token — Constants used with Python parse trees. + (line 26) +* istitle() (bytearray method): Bytes and Bytearray Operations. + (line 582) +* istitle() (bytes method): Bytes and Bytearray Operations. + (line 582) +* istitle() (str method): String Methods<2>. (line 274) +* istraceback() (in module inspect): Types and members. (line 423) +* isub() (in module operator): In-place Operators. (line 94) +* isupper() (bytearray method): Bytes and Bytearray Operations. + (line 596) +* isupper() (bytes method): Bytes and Bytearray Operations. + (line 596) +* isupper() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 181) +* isupper() (str method): String Methods<2>. (line 281) +* isvisible() (in module turtle): Visibility. (line 22) +* isxdigit() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 185) +* is_() (in module operator): operator — Standard operators as functions. + (line 63) +* is_absolute() (pathlib.PurePath method): Methods and properties. + (line 186) +* is_active() (asyncio.AbstractChildWatcher method): Process Watchers. + (line 68) +* is_active() (graphlib.TopologicalSorter method): graphlib — Functionality to operate with graph-like structures. + (line 109) +* is_alive() (multiprocessing.Process method): Process and exceptions. + (line 93) +* is_alive() (threading.Thread method): Thread Objects. (line 192) +* is_android (in module test.support): test support — Utilities for the Python test suite. + (line 40) +* is_annotated() (symtable.Symbol method): Examining Symbol Tables. + (line 139) +* is_assigned() (symtable.Symbol method): Examining Symbol Tables. + (line 150) +* is_async (pyclbr.Function attribute): Function Objects. (line 38) +* is_attachment() (email.message.EmailMessage method): email message Representing an email message. + (line 445) +* is_authenticated() (urllib.request.HTTPPasswordMgrWithPriorAuth method): HTTPPasswordMgrWithPriorAuth Objects. + (line 30) +* is_blocked() (http.cookiejar.DefaultCookiePolicy method): DefaultCookiePolicy Objects. + (line 60) +* is_block_device() (pathlib.Path method): Methods<2>. (line 192) +* is_canonical() (decimal.Context method): Context objects. (line 310) +* is_canonical() (decimal.Decimal method): Decimal objects. (line 278) +* IS_CHARACTER_JUNK() (in module difflib): difflib — Helpers for computing deltas. + (line 362) +* is_char_device() (pathlib.Path method): Methods<2>. (line 201) +* is_check_supported() (in module lzma): Miscellaneous<2>. (line 6) +* is_closed() (asyncio.loop method): Running and stopping the loop. + (line 39) +* is_closing() (asyncio.BaseTransport method): Base Transport. + (line 16) +* is_closing() (asyncio.StreamWriter method): StreamWriter. (line 100) +* is_dataclass() (in module dataclasses): Module contents<4>. + (line 430) +* is_declared_global() (symtable.Symbol method): Examining Symbol Tables. + (line 130) +* is_dir() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 101) +* is_dir() (os.DirEntry method): Files and Directories. + (line 889) +* is_dir() (pathlib.Path method): Methods<2>. (line 137) +* is_dir() (zipfile.Path method): Path Objects. (line 41) +* is_dir() (zipfile.ZipInfo method): ZipInfo Objects. (line 42) +* is_enabled() (in module faulthandler): Fault handler state. + (line 30) +* is_expired() (http.cookiejar.Cookie method): Cookie Objects<2>. + (line 109) +* is_fifo() (pathlib.Path method): Methods<2>. (line 184) +* is_file() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 105) +* is_file() (os.DirEntry method): Files and Directories. + (line 918) +* is_file() (pathlib.Path method): Methods<2>. (line 146) +* is_file() (zipfile.Path method): Path Objects. (line 45) +* is_finalized() (in module gc): gc — Garbage Collector interface. + (line 182) +* is_finalizing() (in module sys): sys — System-specific parameters and functions. + (line 1077) +* is_finite() (decimal.Context method): Context objects. (line 314) +* is_finite() (decimal.Decimal method): Decimal objects. (line 285) +* is_free() (symtable.Symbol method): Examining Symbol Tables. + (line 145) +* is_global (ipaddress.IPv4Address attribute): Address objects. + (line 109) +* is_global (ipaddress.IPv6Address attribute): Address objects. + (line 220) +* is_global() (symtable.Symbol method): Examining Symbol Tables. + (line 122) +* is_hop_by_hop() (in module wsgiref.util): wsgiref util – WSGI environment utilities. + (line 111) +* is_imported() (symtable.Symbol method): Examining Symbol Tables. + (line 113) +* is_infinite() (decimal.Context method): Context objects. (line 318) +* is_infinite() (decimal.Decimal method): Decimal objects. (line 290) +* is_integer() (float method): Additional Methods on Float. + (line 16) +* is_jython (in module test.support): test support — Utilities for the Python test suite. + (line 36) +* is_linetouched() (curses.window method): Window Objects. (line 368) +* IS_LINE_JUNK() (in module difflib): difflib — Helpers for computing deltas. + (line 355) +* is_link_local (ipaddress.IPv4Address attribute): Address objects. + (line 131) +* is_link_local (ipaddress.IPv4Network attribute): Network objects. + (line 80) +* is_link_local (ipaddress.IPv6Address attribute): Address objects. + (line 228) +* is_link_local (ipaddress.IPv6Network attribute): Network objects. + (line 307) +* is_local() (symtable.Symbol method): Examining Symbol Tables. + (line 135) +* is_loopback (ipaddress.IPv4Address attribute): Address objects. + (line 126) +* is_loopback (ipaddress.IPv4Network attribute): Network objects. + (line 78) +* is_loopback (ipaddress.IPv6Address attribute): Address objects. + (line 226) +* is_loopback (ipaddress.IPv6Network attribute): Network objects. + (line 305) +* is_mount() (pathlib.Path method): Methods<2>. (line 155) +* is_multicast (ipaddress.IPv4Address attribute): Address objects. + (line 98) +* is_multicast (ipaddress.IPv4Network attribute): Network objects. + (line 70) +* is_multicast (ipaddress.IPv6Address attribute): Address objects. + (line 216) +* is_multicast (ipaddress.IPv6Network attribute): Network objects. + (line 297) +* is_multipart() (email.message.EmailMessage method): email message Representing an email message. + (line 134) +* is_multipart() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 145) +* is_namespace() (symtable.Symbol method): Examining Symbol Tables. + (line 154) +* is_nan() (decimal.Context method): Context objects. (line 322) +* is_nan() (decimal.Decimal method): Decimal objects. (line 295) +* is_nested() (symtable.SymbolTable method): Examining Symbol Tables. + (line 35) +* is_nonlocal() (symtable.Symbol method): Examining Symbol Tables. + (line 126) +* is_normal() (decimal.Context method): Context objects. (line 327) +* is_normal() (decimal.Decimal method): Decimal objects. (line 300) +* is_normalized() (in module unicodedata): unicodedata — Unicode Database. + (line 117) +* is_not() (in module operator): operator — Standard operators as functions. + (line 67) +* is_not_allowed() (http.cookiejar.DefaultCookiePolicy method): DefaultCookiePolicy Objects. + (line 74) +* IS_OP (opcode): Python Bytecode Instructions. + (line 555) +* is_optimized() (symtable.SymbolTable method): Examining Symbol Tables. + (line 31) +* is_package() (importlib.abc.InspectLoader method): importlib abc – Abstract base classes related to import. + (line 351) +* is_package() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 542) +* is_package() (importlib.machinery.ExtensionFileLoader method): importlib machinery – Importers and path hooks. + (line 336) +* is_package() (importlib.machinery.SourceFileLoader method): importlib machinery – Importers and path hooks. + (line 235) +* is_package() (importlib.machinery.SourcelessFileLoader method): importlib machinery – Importers and path hooks. + (line 279) +* is_package() (zipimport.zipimporter method): zipimporter Objects. + (line 89) +* is_parameter() (symtable.Symbol method): Examining Symbol Tables. + (line 118) +* is_private (ipaddress.IPv4Address attribute): Address objects. + (line 103) +* is_private (ipaddress.IPv4Network attribute): Network objects. + (line 72) +* is_private (ipaddress.IPv6Address attribute): Address objects. + (line 218) +* is_private (ipaddress.IPv6Network attribute): Network objects. + (line 299) +* is_python_build() (in module sysconfig): Other functions<3>. + (line 50) +* is_qnan() (decimal.Context method): Context objects. (line 332) +* is_qnan() (decimal.Decimal method): Decimal objects. (line 306) +* is_reading() (asyncio.ReadTransport method): Read-only Transports. + (line 6) +* is_referenced() (symtable.Symbol method): Examining Symbol Tables. + (line 109) +* is_relative_to() (pathlib.PurePath method): Methods and properties. + (line 205) +* is_reserved (ipaddress.IPv4Address attribute): Address objects. + (line 122) +* is_reserved (ipaddress.IPv4Network attribute): Network objects. + (line 76) +* is_reserved (ipaddress.IPv6Address attribute): Address objects. + (line 224) +* is_reserved (ipaddress.IPv6Network attribute): Network objects. + (line 303) +* is_reserved() (pathlib.PurePath method): Methods and properties. + (line 217) +* is_resource() (importlib.resources.abc.ResourceReader method): importlib resources abc – Abstract base classes for resources. + (line 61) +* is_resource() (in module importlib.resources): Deprecated functions. + (line 111) +* is_resource_enabled() (in module test.support): test support — Utilities for the Python test suite. + (line 190) +* is_running() (asyncio.loop method): Running and stopping the loop. + (line 35) +* is_safe (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 153) +* is_serving() (asyncio.Server method): Server Objects. (line 89) +* is_set() (asyncio.Event method): Event. (line 65) +* is_set() (threading.Event method): Event Objects. (line 23) +* is_signed() (decimal.Context method): Context objects. (line 337) +* is_signed() (decimal.Decimal method): Decimal objects. (line 311) +* is_site_local (ipaddress.IPv6Address attribute): Address objects. + (line 232) +* is_site_local (ipaddress.IPv6Network attribute): Network objects. + (line 357) +* is_skipped_line() (bdb.Bdb method): bdb — Debugger framework. + (line 244) +* is_snan() (decimal.Context method): Context objects. (line 341) +* is_snan() (decimal.Decimal method): Decimal objects. (line 317) +* is_socket() (pathlib.Path method): Methods<2>. (line 175) +* is_subnormal() (decimal.Context method): Context objects. (line 346) +* is_subnormal() (decimal.Decimal method): Decimal objects. (line 322) +* is_symlink() (os.DirEntry method): Files and Directories. + (line 934) +* is_symlink() (pathlib.Path method): Methods<2>. (line 167) +* is_tarfile() (in module tarfile): tarfile — Read and write tar archive files. + (line 179) +* is_term_resized() (in module curses): Functions<5>. (line 251) +* is_tracing() (in module tracemalloc): Functions<10>. (line 61) +* is_tracked() (in module gc): gc — Garbage Collector interface. + (line 157) +* is_typeddict() (in module typing): Introspection helpers. + (line 67) +* is_unspecified (ipaddress.IPv4Address attribute): Address objects. + (line 117) +* is_unspecified (ipaddress.IPv4Network attribute): Network objects. + (line 74) +* is_unspecified (ipaddress.IPv6Address attribute): Address objects. + (line 222) +* is_unspecified (ipaddress.IPv6Network attribute): Network objects. + (line 301) +* is_valid() (string.Template method): Template strings. (line 67) +* is_wintouched() (curses.window method): Window Objects. (line 375) +* is_zero() (decimal.Context method): Context objects. (line 350) +* is_zero() (decimal.Decimal method): Decimal objects. (line 327) +* is_zipfile() (in module zipfile): zipfile — Work with ZIP archives. + (line 71) +* ITALIC (in module tkinter.font): tkinter font — Tkinter font wrapper. + (line 15) +* item selection: The standard type hierarchy. + (line 132) +* item() (tkinter.ttk.Treeview method): ttk Treeview. (line 212) +* item() (xml.dom.NamedNodeMap method): NamedNodeMap Objects. + (line 12) +* item() (xml.dom.NodeList method): NodeList Objects. (line 15) +* itemgetter() (in module operator): operator — Standard operators as functions. + (line 271) +* items() (configparser.ConfigParser method): ConfigParser Objects. + (line 235) +* items() (contextvars.Context method): Manual Context Management. + (line 108) +* items() (dict method): Mapping Types — dict. + (line 163) +* items() (email.message.EmailMessage method): email message Representing an email message. + (line 240) +* items() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 348) +* items() (mailbox.Mailbox method): Mailbox objects. (line 129) +* items() (types.MappingProxyType method): Standard Interpreter Types. + (line 303) +* items() (xml.etree.ElementTree.Element method): Element Objects. + (line 71) +* itemsize (array.array attribute): array — Efficient arrays of numeric values. + (line 108) +* itemsize (memoryview attribute): Memory Views. (line 429) +* ItemsView (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 88) +* ItemsView (class in typing): Corresponding to collections in collections abc. + (line 45) +* iter() (xml.etree.ElementTree.Element method): Element Objects. + (line 136) +* iter() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 40) +* iterable: Glossary. (line 718) +* Iterable (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 22) +* Iterable (class in typing): Corresponding to other types in collections abc. + (line 6) +* iterable; unpacking: Expression lists. (line 16) +* iterator: Glossary. (line 740) +* Iterator (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 38) +* Iterator (class in typing): Corresponding to other types in collections abc. + (line 14) +* iterator protocol: Iterator Types. (line 6) +* iterdecode() (in module codecs): codecs — Codec registry and base classes. + (line 233) +* iterdir() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 97) +* iterdir() (pathlib.Path method): Methods<2>. (line 210) +* iterdir() (zipfile.Path method): Path Objects. (line 37) +* iterdump() (sqlite3.Connection method): Connection objects. + (line 456) +* iterencode() (in module codecs): codecs — Codec registry and base classes. + (line 221) +* iterencode() (json.JSONEncoder method): Encoders and Decoders. + (line 225) +* iterfind() (xml.etree.ElementTree.Element method): Element Objects. + (line 147) +* iterfind() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 47) +* iteritems() (mailbox.Mailbox method): Mailbox objects. (line 129) +* iterkeys() (mailbox.Mailbox method): Mailbox objects. (line 107) +* itermonthdates() (calendar.Calendar method): calendar — General calendar-related functions. + (line 45) +* itermonthdays() (calendar.Calendar method): calendar — General calendar-related functions. + (line 53) +* itermonthdays2() (calendar.Calendar method): calendar — General calendar-related functions. + (line 61) +* itermonthdays3() (calendar.Calendar method): calendar — General calendar-related functions. + (line 69) +* itermonthdays4() (calendar.Calendar method): calendar — General calendar-related functions. + (line 79) +* iternextfunc (C type): Slot Type typedefs. (line 91) +* iterparse() (in module xml.etree.ElementTree): Functions<8>. + (line 136) +* itertext() (xml.etree.ElementTree.Element method): Element Objects. + (line 156) +* itertools (2to3 fixer): Fixers. (line 174) +* itertools_imports (2to3 fixer): Fixers. (line 168) +* itervalues() (mailbox.Mailbox method): Mailbox objects. (line 114) +* iterweekdays() (calendar.Calendar method): calendar — General calendar-related functions. + (line 39) +* iter_attachments() (email.message.EmailMessage method): email message Representing an email message. + (line 560) +* iter_child_nodes() (in module ast): ast Helpers. (line 150) +* iter_fields() (in module ast): ast Helpers. (line 145) +* iter_importers() (in module pkgutil): pkgutil — Package extension utility. + (line 123) +* iter_modules() (in module pkgutil): pkgutil — Package extension utility. + (line 141) +* iter_parts() (email.message.EmailMessage method): email message Representing an email message. + (line 576) +* iter_unpack() (in module struct): Functions and Exceptions. + (line 42) +* iter_unpack() (struct.Struct method): Classes<2>. (line 47) +* ItimerError: Module contents<2>. (line 251) +* ITIMER_PROF (in module signal): Module contents<2>. (line 218) +* ITIMER_REAL (in module signal): Module contents<2>. (line 208) +* ITIMER_VIRTUAL (in module signal): Module contents<2>. (line 213) +* itruediv() (in module operator): In-place Operators. (line 99) +* ixor() (in module operator): In-place Operators. (line 104) +* j; in numeric literal: Floating point literals. + (line 28) +* Jansen, Jack: uu — Encode and decode uuencode files. + (line 24) +* Java; language: The standard type hierarchy. + (line 112) +* java_ver() (in module platform): Java Platform. (line 6) +* join() (asyncio.Queue method): Queue. (line 49) +* join() (bytearray method): Bytes and Bytearray Operations. + (line 159) +* join() (bytes method): Bytes and Bytearray Operations. + (line 159) +* join() (in module os.path): os path — Common pathname manipulations. + (line 250) +* join() (in module shlex): shlex — Simple lexical analysis. + (line 33) +* join() (multiprocessing.JoinableQueue method): Pipes and Queues. + (line 252) +* join() (multiprocessing.pool.Pool method): Process Pools. (line 180) +* join() (multiprocessing.Process method): Process and exceptions. + (line 66) +* join() (queue.Queue method): Queue Objects. (line 83) +* join() (str method): String Methods<2>. (line 295) +* join() (threading.Thread method): Thread Objects. (line 126) +* JoinableQueue (class in multiprocessing): Pipes and Queues. + (line 231) +* JoinedStr (class in ast): Literals<3>. (line 42) +* joinpath() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 109) +* joinpath() (pathlib.PurePath method): Methods and properties. + (line 231) +* joinpath() (zipfile.Path method): Path Objects. (line 82) +* join_thread() (in module test.support.threading_helper): test support threading_helper — Utilities for threading tests. + (line 11) +* join_thread() (multiprocessing.Queue method): Pipes and Queues. + (line 170) +* json.tool command line option; –compact: Command line options<2>. + (line 48) +* json.tool command line option; -h: Command line options<2>. + (line 54) +* json.tool command line option; –help: Command line options<2>. + (line 54) +* json.tool command line option; –indent: Command line options<2>. + (line 48) +* json.tool command line option; –json-lines: Command line options<2>. + (line 42) +* json.tool command line option; –no-ensure-ascii: Command line options<2>. + (line 35) +* json.tool command line option; –no-indent: Command line options<2>. + (line 48) +* json.tool command line option; –sort-keys: Command line options<2>. + (line 29) +* json.tool command line option; –tab: Command line options<2>. + (line 48) +* json.tool command line option; infile: Command line options<2>. + (line 6) +* json.tool command line option; outfile: Command line options<2>. + (line 24) +* JSONDecodeError: Exceptions<14>. (line 6) +* JSONDecoder (class in json): Encoders and Decoders. + (line 6) +* JSONEncoder (class in json): Encoders and Decoders. + (line 103) +* js_output() (http.cookies.BaseCookie method): Cookie Objects. + (line 32) +* js_output() (http.cookies.Morsel method): Morsel Objects. (line 79) +* jump (pdb command): Debugger Commands. (line 201) +* JUMP_BACKWARD (opcode): Python Bytecode Instructions. + (line 586) +* JUMP_BACKWARD_NO_INTERRUPT (opcode): Python Bytecode Instructions. + (line 592) +* JUMP_FORWARD (opcode): Python Bytecode Instructions. + (line 582) +* JUMP_IF_FALSE_OR_POP (opcode): Python Bytecode Instructions. + (line 665) +* JUMP_IF_TRUE_OR_POP (opcode): Python Bytecode Instructions. + (line 655) +* kbhit() (in module msvcrt): Console I/O. (line 6) +* KDEDIR: webbrowser — Convenient web-browser controller. + (line 189) +* KEEP (enum.FlagBoundary attribute): Data Types<2>. (line 582) +* kevent() (in module select): select — Waiting for I/O completion. + (line 108) +* key: Dictionary displays. + (line 6) +* key (http.cookies.Morsel attribute): Morsel Objects. (line 60) +* key (zoneinfo.ZoneInfo attribute): The ZoneInfo class. (line 75) +* key function: Glossary. (line 765) +* key/datum pair: Dictionary displays. + (line 6) +* KeyboardInterrupt: Concrete exceptions. + (line 77) +* KeyboardInterrupt (built-in exception): Signal Handling<2>. + (line 7) +* KeyboardInterrupt (built-in exception) <1>: Signal Handling<2>. + (line 34) +* KeyboardInterrupt (built-in exception) <2>: Signal Handling<2>. + (line 43) +* KeyError: Concrete exceptions. + (line 72) +* keylog_filename (ssl.SSLContext attribute): SSL Contexts. (line 515) +* keyname() (in module curses): Functions<5>. (line 261) +* keypad() (curses.window method): Window Objects. (line 380) +* keyrefs() (weakref.WeakKeyDictionary method): weakref — Weak references. + (line 182) +* keys() (contextvars.Context method): Manual Context Management. + (line 100) +* keys() (dict method): Mapping Types — dict. + (line 168) +* keys() (email.message.EmailMessage method): email message Representing an email message. + (line 232) +* keys() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 340) +* keys() (mailbox.Mailbox method): Mailbox objects. (line 107) +* keys() (sqlite3.Row method): Row objects. (line 16) +* keys() (types.MappingProxyType method): Standard Interpreter Types. + (line 308) +* keys() (xml.etree.ElementTree.Element method): Element Objects. + (line 76) +* KeysView (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 88) +* KeysView (class in typing): Corresponding to collections in collections abc. + (line 53) +* keyword: Keywords. (line 6) +* keyword <1>: Soft Keywords. (line 6) +* keyword (class in ast): Expressions<2>. (line 152) +* keyword argument: Glossary. (line 787) +* keyword; as: The import statement. + (line 6) +* keyword; as <1>: The try statement. (line 6) +* keyword; as <2>: The with statement. (line 6) +* keyword; as <3>: The match statement. + (line 6) +* keyword; async: Coroutine function definition. + (line 9) +* keyword; await: Calls. (line 158) +* keyword; await <1>: Coroutine function definition. + (line 9) +* keyword; case: The match statement. + (line 6) +* keyword; elif: The if statement. (line 6) +* keyword; else: The break statement. + (line 12) +* keyword; else <1>: The if statement. (line 6) +* keyword; else <2>: The while statement. + (line 6) +* keyword; else <3>: The for statement. (line 6) +* keyword; else <4>: The try statement. (line 6) +* keyword; else <5>: except* clause. (line 44) +* keyword; except: The try statement. (line 6) +* keyword; except_star: except clause. (line 85) +* keyword; finally: The return statement. + (line 17) +* keyword; finally <1>: The break statement. + (line 18) +* keyword; finally <2>: The continue statement. + (line 6) +* keyword; finally <3>: The try statement. (line 6) +* keyword; finally <4>: else clause. (line 11) +* keyword; from: Yield expressions. (line 6) +* keyword; from <1>: The import statement. + (line 6) +* keyword; if: The match statement. + (line 6) +* keyword; in: The for statement. (line 6) +* keyword; yield: Yield expressions. (line 6) +* keywords (functools.partial attribute): partial Objects. (line 20) +* KEY_ALL_ACCESS (in module winreg): Access Rights. (line 8) +* KEY_CREATE_LINK (in module winreg): Access Rights. (line 51) +* KEY_CREATE_SUB_KEY (in module winreg): Access Rights. (line 38) +* KEY_ENUMERATE_SUB_KEYS (in module winreg): Access Rights. (line 42) +* KEY_EXECUTE (in module winreg): Access Rights. (line 26) +* KEY_NOTIFY (in module winreg): Access Rights. (line 46) +* KEY_QUERY_VALUE (in module winreg): Access Rights. (line 30) +* KEY_READ (in module winreg): Access Rights. (line 20) +* KEY_SET_VALUE (in module winreg): Access Rights. (line 34) +* KEY_WOW64_32KEY (in module winreg): 64-bit Specific. (line 14) +* KEY_WOW64_64KEY (in module winreg): 64-bit Specific. (line 8) +* KEY_WRITE (in module winreg): Access Rights. (line 15) +* kill() (asyncio.subprocess.Process method): Interacting with Subprocesses. + (line 100) +* kill() (asyncio.SubprocessTransport method): Subprocess Transports. + (line 35) +* kill() (in module os): Process Management. (line 289) +* kill() (multiprocessing.Process method): Process and exceptions. + (line 189) +* kill() (subprocess.Popen method): Popen Objects. (line 91) +* killchar() (in module curses): Functions<5>. (line 271) +* killpg() (in module os): Process Management. (line 313) +* kill_python() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 77) +* kind (inspect.Parameter attribute): Introspecting callables with the Signature object. + (line 202) +* knownfiles (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 122) +* kqueue() (in module select): select — Waiting for I/O completion. + (line 97) +* KqueueSelector (class in selectors): Classes<3>. (line 195) +* kwargs (inspect.BoundArguments attribute): Introspecting callables with the Signature object. + (line 327) +* kwargs (typing.ParamSpec attribute): Building generic types. + (line 292) +* kwlist (in module keyword): keyword — Testing for Python keywords. + (line 17) +* KW_NAMES (opcode): Python Bytecode Instructions. + (line 853) +* KW_ONLY (in module dataclasses): Module contents<4>. (line 446) +* L (in module re): Flags. (line 53) +* LabelEntry (class in tkinter.tix): Basic Widgets. (line 31) +* LabelFrame (class in tkinter.tix): Basic Widgets. (line 37) +* lambda: Glossary. (line 791) +* Lambda (class in ast): Function and class definitions. + (line 28) +* lambda; expression: Lambdas. (line 6) +* lambda; expression <1>: Function definitions. + (line 112) +* lambda; form: Lambdas. (line 6) +* LambdaType (in module types): Standard Interpreter Types. + (line 25) +* LANG: GNU gettext API. (line 21) +* LANG <1>: Class-based API. (line 26) +* LANG <2>: locale — Internationalization services. + (line 49) +* LANG <3>: locale — Internationalization services. + (line 309) +* LANG <4>: locale — Internationalization services. + (line 313) +* LANGUAGE: GNU gettext API. (line 20) +* LANGUAGE <1>: Class-based API. (line 25) +* large files: Large File Support. (line 6) +* LARGEST (in module test.support): test support — Utilities for the Python test suite. + (line 178) +* LargeZipFile: zipfile — Work with ZIP archives. + (line 37) +* last() (nntplib.NNTP method): Methods<3>. (line 237) +* lastChild (xml.dom.Node attribute): Node Objects. (line 59) +* lastcmd (cmd.Cmd attribute): Cmd Objects. (line 137) +* lastgroup (re.Match attribute): Match Objects. (line 194) +* lastindex (re.Match attribute): Match Objects. (line 186) +* lastResort (in module logging): Module-Level Attributes. + (line 6) +* lastrowid (sqlite3.Cursor attribute): Cursor objects. (line 155) +* last_accepted (multiprocessing.connection.Listener attribute): Listeners and Clients. + (line 103) +* last_traceback (in module sys): The standard type hierarchy. + (line 847) +* last_traceback (in module sys) <1>: sys — System-specific parameters and functions. + (line 1084) +* last_type (in module sys): sys — System-specific parameters and functions. + (line 1084) +* last_value (in module sys): sys — System-specific parameters and functions. + (line 1084) +* layout() (tkinter.ttk.Style method): Ttk Styling. (line 96) +* lazycache() (in module linecache): linecache — Random access to text lines. + (line 50) +* LazyLoader (class in importlib.util): importlib util – Utility code for importers. + (line 229) +* LBRACE (in module token): token — Constants used with Python parse trees. + (line 126) +* LBYL: Glossary. (line 798) +* lchflags() (in module os): Files and Directories. + (line 297) +* lchmod() (in module os): Files and Directories. + (line 311) +* lchmod() (pathlib.Path method): Methods<2>. (line 231) +* lchown() (in module os): Files and Directories. + (line 326) +* lcm() (in module math): Number-theoretic and representation functions. + (line 174) +* LC_ALL: GNU gettext API. (line 20) +* LC_ALL <1>: Class-based API. (line 25) +* LC_ALL (in module locale): locale — Internationalization services. + (line 533) +* LC_COLLATE (in module locale): locale — Internationalization services. + (line 502) +* LC_CTYPE (in module locale): locale — Internationalization services. + (line 496) +* LC_MESSAGES: GNU gettext API. (line 20) +* LC_MESSAGES <1>: Class-based API. (line 26) +* LC_MESSAGES (in module locale): locale — Internationalization services. + (line 518) +* LC_MONETARY (in module locale): locale — Internationalization services. + (line 513) +* LC_NUMERIC (in module locale): locale — Internationalization services. + (line 525) +* LC_TIME (in module locale): locale — Internationalization services. + (line 508) +* LDCXXSHARED: Build and C API Changes<8>. + (line 153) +* ldexp() (in module math): Number-theoretic and representation functions. + (line 184) +* LDFLAGS: New Improved and Deprecated Modules<4>. + (line 59) +* LDFLAGS <1>: Preprocessor flags. (line 18) +* LDFLAGS <2>: Linker flags. (line 15) +* LDFLAGS <3>: Linker flags. (line 18) +* LDFLAGS <4>: Linker flags. (line 28) +* LDFLAGS <5>: Linker flags. (line 31) +* LDFLAGS <6>: Linker flags. (line 35) +* LDFLAGS <7>: Linker flags. (line 50) +* LDFLAGS_NODIST: Linker flags. (line 26) +* LDFLAGS_NODIST <1>: Linker flags. (line 40) +* le() (in module operator): operator — Standard operators as functions. + (line 24) +* leading whitespace: Indentation. (line 6) +* leapdays() (in module calendar): calendar — General calendar-related functions. + (line 303) +* leaveok() (curses.window method): Window Objects. (line 387) +* left (filecmp.dircmp attribute): The dircmp class. (line 41) +* left() (in module turtle): Turtle motion. (line 57) +* LEFTSHIFT (in module token): token — Constants used with Python parse trees. + (line 158) +* LEFTSHIFTEQUAL (in module token): token — Constants used with Python parse trees. + (line 202) +* left_list (filecmp.dircmp attribute): The dircmp class. (line 49) +* left_only (filecmp.dircmp attribute): The dircmp class. (line 63) +* lenfunc (C type): Slot Type typedefs. (line 95) +* length (xml.dom.NamedNodeMap attribute): NamedNodeMap Objects. + (line 8) +* length (xml.dom.NodeList attribute): NodeList Objects. (line 21) +* length_hint() (in module operator): operator — Standard operators as functions. + (line 210) +* LESS (in module token): token — Constants used with Python parse trees. + (line 106) +* LESSEQUAL (in module token): token — Constants used with Python parse trees. + (line 142) +* lexical analysis: Lexical analysis. (line 6) +* lexical definitions: Notation. (line 31) +* LexicalHandler (class in xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 45) +* lexists() (in module os.path): os path — Common pathname manipulations. + (line 122) +* lgamma() (in module math): Special functions. (line 35) +* libc_ver() (in module platform): Unix Platforms. (line 6) +* library (in module dbm.ndbm): dbm ndbm — Interface based on ndbm. + (line 27) +* library (ssl.SSLError attribute): Exceptions<13>. (line 19) +* LibraryLoader (class in ctypes): Loading shared libraries. + (line 154) +* library_dir_option() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 220) +* library_filename() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 458) +* library_option() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 225) +* license (built-in variable): Constants added by the site module. + (line 24) +* LifoQueue (class in asyncio): LIFO Queue. (line 6) +* LifoQueue (class in queue): queue — A synchronized queue class. + (line 42) +* light-weight processes: _thread — Low-level threading API. + (line 6) +* LimitOverrunError: Exceptions<10>. (line 60) +* limit_denominator() (fractions.Fraction method): fractions — Rational numbers. + (line 138) +* lin2adpcm() (in module audioop): audioop — Manipulate raw audio data. + (line 115) +* lin2alaw() (in module audioop): audioop — Manipulate raw audio data. + (line 129) +* lin2lin() (in module audioop): audioop — Manipulate raw audio data. + (line 136) +* lin2ulaw() (in module audioop): audioop — Manipulate raw audio data. + (line 151) +* line (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 86) +* line continuation: Explicit line joining. + (line 6) +* line joining: Logical lines. (line 6) +* line joining <1>: Explicit line joining. + (line 6) +* line structure: Line structure. (line 6) +* line() (msilib.Dialog method): GUI classes. (line 62) +* line-buffered I/O: Built-in Functions. (line 1307) +* linear_regression() (in module statistics): Function details. + (line 514) +* lineno (ast.AST attribute): Node classes. (line 39) +* lineno (doctest.DocTest attribute): DocTest Objects. (line 42) +* lineno (doctest.Example attribute): Example Objects. (line 41) +* lineno (inspect.FrameInfo attribute): The interpreter stack. + (line 22) +* lineno (inspect.Traceback attribute): The interpreter stack. + (line 62) +* lineno (json.JSONDecodeError attribute): Exceptions<14>. (line 23) +* lineno (pyclbr.Class attribute): Class Objects<2>. (line 21) +* lineno (pyclbr.Function attribute): Function Objects. (line 21) +* lineno (re.error attribute): Exceptions<3>. (line 28) +* lineno (shlex.shlex attribute): shlex Objects. (line 169) +* lineno (SyntaxError attribute): Concrete exceptions. + (line 285) +* lineno (traceback.TracebackException attribute): TracebackException Objects. + (line 59) +* lineno (tracemalloc.Filter attribute): Filter. (line 49) +* lineno (tracemalloc.Frame attribute): Frame. (line 17) +* lineno (xml.parsers.expat.ExpatError attribute): ExpatError Exceptions. + (line 27) +* lineno() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 97) +* LINES: curses<4>. (line 6) +* LINES <1>: Functions<5>. (line 125) +* LINES <2>: Functions<5>. (line 569) +* LINES <3>: Functions<5>. (line 593) +* LINES <4>: Functions<5>. (line 595) +* lines (os.terminal_size attribute): Querying the size of a terminal. + (line 34) +* linesep (email.policy.Policy attribute): email policy Policy Objects. + (line 152) +* linesep (in module os): Miscellaneous System Information. + (line 129) +* lineterminator (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 45) +* LineTooLong: http client — HTTP protocol client. + (line 189) +* line_buffering (io.TextIOWrapper attribute): Text I/O<2>. (line 168) +* line_num (csv.csvreader attribute): Reader Objects. (line 23) +* link() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 349) +* link() (in module os): Files and Directories. + (line 340) +* linkname (tarfile.TarInfo attribute): TarInfo Objects. (line 67) +* link_executable() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 401) +* link_shared_lib() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 411) +* link_shared_object() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 422) +* link_to() (pathlib.Path method): Methods<2>. (line 472) +* list: Glossary. (line 826) +* list (built-in class): Lists<2>. (line 10) +* List (class in ast): Literals<3>. (line 67) +* List (class in typing): Corresponding to built-in types. + (line 20) +* list (pdb command): Debugger Commands. (line 211) +* list comprehension: Glossary. (line 832) +* list() (imaplib.IMAP4 method): IMAP4 Objects. (line 126) +* list() (multiprocessing.managers.SyncManager method): Managers. + (line 231) +* list() (nntplib.NNTP method): Methods<3>. (line 104) +* list() (poplib.POP3 method): POP3 Objects. (line 56) +* list() (tarfile.TarFile method): TarFile Objects. (line 120) +* list; comprehensions: List displays. (line 6) +* list; display: List displays. (line 6) +* ListComp (class in ast): Comprehensions. (line 6) +* listdir() (in module os): Files and Directories. + (line 362) +* listen() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 222) +* listen() (in module logging.config): Configuration functions. + (line 117) +* listen() (in module turtle): Using screen events. + (line 6) +* listen() (socket.socket method): Socket Objects. (line 196) +* Listener (class in multiprocessing.connection): Listeners and Clients. + (line 50) +* listMethods() (xmlrpc.client.ServerProxy.system method): ServerProxy Objects. + (line 17) +* ListNoteBook (class in tkinter.tix): Manager Widgets. (line 13) +* listxattr() (in module os): Linux extended attributes. + (line 26) +* LIST_APPEND (opcode): Python Bytecode Instructions. + (line 251) +* list_dialects() (in module csv): Module Contents<3>. (line 92) +* LIST_EXTEND (opcode): Python Bytecode Instructions. + (line 521) +* list_folders() (mailbox.Maildir method): Maildir. (line 61) +* list_folders() (mailbox.MH method): MH. (line 32) +* LIST_TO_TUPLE (opcode): Python Bytecode Instructions. + (line 514) +* literal: Literals. (line 6) +* literal <1>: Literals<2>. (line 6) +* Literal (in module typing): Special forms. (line 226) +* LiteralString (in module typing): Special types. (line 20) +* literal_eval() (in module ast): ast Helpers. (line 73) +* LittleEndianStructure (class in ctypes): Structured data types. + (line 26) +* LittleEndianUnion (class in ctypes): Structured data types. + (line 16) +* ljust() (bytearray method): Bytes and Bytearray Operations. + (line 296) +* ljust() (bytes method): Bytes and Bytearray Operations. + (line 296) +* ljust() (str method): String Methods<2>. (line 303) +* LK_LOCK (in module msvcrt): File Operations. (line 19) +* LK_NBLCK (in module msvcrt): File Operations. (line 27) +* LK_NBRLCK (in module msvcrt): File Operations. (line 27) +* LK_RLCK (in module msvcrt): File Operations. (line 19) +* LK_UNLCK (in module msvcrt): File Operations. (line 33) +* ll (pdb command): Debugger Commands. (line 227) +* LMTP (class in smtplib): smtplib — SMTP protocol client. + (line 113) +* ln() (decimal.Context method): Context objects. (line 354) +* ln() (decimal.Decimal method): Decimal objects. (line 332) +* LNAME: getpass — Portable password input. + (line 43) +* Load (class in ast): Variables. (line 11) +* load() (http.cookiejar.FileCookieJar method): CookieJar and FileCookieJar Objects. + (line 126) +* load() (http.cookies.BaseCookie method): Cookie Objects. (line 40) +* load() (in module json): Basic Usage. (line 94) +* load() (in module marshal): marshal — Internal Python object serialization. + (line 63) +* load() (in module pickle): Module Interface. (line 58) +* load() (in module plistlib): plistlib — Generate and parse Apple plist files. + (line 46) +* load() (in module tomllib): tomllib — Parse TOML files. + (line 32) +* load() (pickle.Unpickler method): Module Interface. (line 267) +* load() (tracemalloc.Snapshot class method): Snapshot. (line 50) +* loader: Finders and loaders. + (line 6) +* loader <1>: Glossary. (line 841) +* Loader (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 164) +* loader (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 395) +* LoadError: http cookiejar — Cookie handling for HTTP clients. + (line 34) +* loader_state (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 424) +* LoadFileDialog (class in tkinter.filedialog): Native Load/Save Dialogs. + (line 135) +* LoadKey() (in module winreg): Functions<12>. (line 258) +* LoadLibrary() (ctypes.LibraryLoader method): Loading shared libraries. + (line 165) +* loads() (in module json): Basic Usage. (line 154) +* loads() (in module marshal): marshal — Internal Python object serialization. + (line 95) +* loads() (in module pickle): Module Interface. (line 76) +* loads() (in module plistlib): plistlib — Generate and parse Apple plist files. + (line 74) +* loads() (in module tomllib): tomllib — Parse TOML files. + (line 48) +* loads() (in module xmlrpc.client): Convenience Functions. + (line 19) +* loadTestsFromModule() (unittest.TestLoader method): Loading and running tests. + (line 41) +* loadTestsFromName() (unittest.TestLoader method): Loading and running tests. + (line 70) +* loadTestsFromNames() (unittest.TestLoader method): Loading and running tests. + (line 104) +* loadTestsFromTestCase() (unittest.TestLoader method): Loading and running tests. + (line 29) +* LOAD_ASSERTION_ERROR (opcode): Python Bytecode Instructions. + (line 364) +* LOAD_ATTR (opcode): Python Bytecode Instructions. + (line 546) +* LOAD_BUILD_CLASS (opcode): Python Bytecode Instructions. + (line 371) +* load_cert_chain() (ssl.SSLContext method): SSL Contexts. (line 92) +* LOAD_CLASSDEREF (opcode): Python Bytecode Instructions. + (line 729) +* LOAD_CLOSURE (opcode): Python Bytecode Instructions. + (line 709) +* LOAD_CONST (opcode): Python Bytecode Instructions. + (line 467) +* load_default_certs() (ssl.SSLContext method): SSL Contexts. + (line 123) +* LOAD_DEREF (opcode): Python Bytecode Instructions. + (line 721) +* load_dh_params() (ssl.SSLContext method): SSL Contexts. (line 343) +* load_extension() (sqlite3.Connection method): Connection objects. + (line 442) +* LOAD_FAST (opcode): Python Bytecode Instructions. + (line 689) +* LOAD_GLOBAL (opcode): Python Bytecode Instructions. + (line 682) +* LOAD_METHOD (opcode): Python Bytecode Instructions. + (line 826) +* load_module() (importlib.abc.FileLoader method): importlib abc – Abstract base classes related to import. + (line 430) +* load_module() (importlib.abc.InspectLoader method): importlib abc – Abstract base classes related to import. + (line 383) +* load_module() (importlib.abc.Loader method): importlib abc – Abstract base classes related to import. + (line 200) +* load_module() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 530) +* load_module() (importlib.machinery.SourceFileLoader method): importlib machinery – Importers and path hooks. + (line 250) +* load_module() (importlib.machinery.SourcelessFileLoader method): importlib machinery – Importers and path hooks. + (line 294) +* load_module() (in module imp): imp — Access the import internals. + (line 90) +* load_module() (zipimport.zipimporter method): zipimporter Objects. + (line 95) +* LOAD_NAME (opcode): Python Bytecode Instructions. + (line 471) +* load_package_tests() (in module test.support): test support — Utilities for the Python test suite. + (line 590) +* load_verify_locations() (ssl.SSLContext method): SSL Contexts. + (line 140) +* local (class in threading): Thread-Local Data. (line 15) +* localcontext() (in module decimal): Context objects. (line 25) +* LOCALE (in module re): Flags. (line 53) +* locale encoding: Glossary. (line 812) +* localeconv() (in module locale): locale — Internationalization services. + (line 53) +* LocaleHTMLCalendar (class in calendar): calendar — General calendar-related functions. + (line 270) +* LocaleTextCalendar (class in calendar): calendar — General calendar-related functions. + (line 264) +* localize() (in module locale): locale — Internationalization services. + (line 478) +* localName (xml.dom.Attr attribute): Attr Objects. (line 13) +* localName (xml.dom.Node attribute): Node Objects. (line 64) +* localtime() (in module email.utils): email utils Miscellaneous utilities. + (line 13) +* localtime() (in module time): Functions<4>. (line 147) +* LOCAL_CREDS (in module socket): Constants<8>. (line 271) +* LOCAL_CREDS_PERSISTENT (in module socket): Constants<8>. (line 271) +* Locator (class in xml.sax.xmlreader): xml sax xmlreader — Interface for XML parsers. + (line 43) +* Lock (class in asyncio): Lock. (line 6) +* Lock (class in multiprocessing): Synchronization primitives. + (line 46) +* Lock (class in threading): Lock Objects. (line 33) +* lock() (mailbox.Babyl method): Babyl. (line 59) +* lock() (mailbox.Mailbox method): Mailbox objects. (line 249) +* lock() (mailbox.Maildir method): Maildir. (line 107) +* lock() (mailbox.mbox method): mbox. (line 39) +* lock() (mailbox.MH method): MH. (line 84) +* lock() (mailbox.MMDF method): MMDF. (line 35) +* Lock() (multiprocessing.managers.SyncManager method): Managers. + (line 188) +* lock, interpreter: Thread State and the Global Interpreter Lock. + (line 6) +* locked() (asyncio.Condition method): Condition. (line 63) +* locked() (asyncio.Lock method): Lock. (line 58) +* locked() (asyncio.Semaphore method): Semaphore. (line 50) +* locked() (threading.Lock method): Lock Objects. (line 87) +* locked() (_thread.lock method): _thread — Low-level threading API. + (line 169) +* lockf() (in module fcntl): fcntl — The fcntl and ioctl system calls. + (line 139) +* lockf() (in module os): File Descriptor Operations. + (line 230) +* locking() (in module msvcrt): File Operations. (line 6) +* LockType (in module _thread): _thread — Low-level threading API. + (line 28) +* lock_held() (in module imp): imp — Access the import internals. + (line 257) +* log() (in module cmath): Power and logarithmic functions<2>. + (line 11) +* log() (in module logging): Module-Level Functions. + (line 155) +* log() (in module math): Power and logarithmic functions. + (line 40) +* log() (logging.Logger method): Logger Objects. (line 256) +* log10() (decimal.Context method): Context objects. (line 358) +* log10() (decimal.Decimal method): Decimal objects. (line 338) +* log10() (in module cmath): Power and logarithmic functions<2>. + (line 18) +* log10() (in module math): Power and logarithmic functions. + (line 67) +* log1p() (in module math): Power and logarithmic functions. + (line 48) +* log2() (in module math): Power and logarithmic functions. + (line 53) +* logb() (decimal.Context method): Context objects. (line 362) +* logb() (decimal.Decimal method): Decimal objects. (line 344) +* Logger (class in logging): Logger Objects. (line 23) +* LoggerAdapter (class in logging): LoggerAdapter Objects. + (line 11) +* logical line: Logical lines. (line 6) +* logical_and() (decimal.Context method): Context objects. (line 366) +* logical_and() (decimal.Decimal method): Decimal objects. (line 352) +* logical_invert() (decimal.Context method): Context objects. + (line 371) +* logical_invert() (decimal.Decimal method): Decimal objects. + (line 358) +* logical_or() (decimal.Context method): Context objects. (line 375) +* logical_or() (decimal.Decimal method): Decimal objects. (line 363) +* logical_xor() (decimal.Context method): Context objects. (line 380) +* logical_xor() (decimal.Decimal method): Decimal objects. (line 369) +* login() (ftplib.FTP method): FTP Objects. (line 48) +* login() (imaplib.IMAP4 method): IMAP4 Objects. (line 132) +* login() (nntplib.NNTP method): Methods<3>. (line 48) +* login() (smtplib.SMTP method): SMTP Objects. (line 102) +* login_cram_md5() (imaplib.IMAP4 method): IMAP4 Objects. (line 137) +* login_tty() (in module os): File Descriptor Operations. + (line 256) +* LOGNAME: Process Parameters. (line 233) +* LOGNAME <1>: getpass — Portable password input. + (line 43) +* lognormvariate() (in module random): Real-valued distributions. + (line 74) +* logout() (imaplib.IMAP4 method): IMAP4 Objects. (line 143) +* LogRecord (class in logging): LogRecord Objects. (line 11) +* log_date_time_string() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 329) +* log_error() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 298) +* log_exception() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 211) +* log_message() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 304) +* log_request() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 291) +* log_to_stderr() (in module multiprocessing): Logging<2>. (line 24) +* long (2to3 fixer): Fixers. (line 181) +* longMessage (unittest.TestCase attribute): Test cases. (line 702) +* longname() (in module curses): Functions<5>. (line 278) +* LONG_MAX: Integer Objects. (line 105) +* LONG_TIMEOUT (in module test.support): test support — Utilities for the Python test suite. + (line 93) +* lookup() (in module codecs): codecs — Codec registry and base classes. + (line 47) +* lookup() (in module unicodedata): unicodedata — Unicode Database. + (line 16) +* lookup() (symtable.SymbolTable method): Examining Symbol Tables. + (line 49) +* lookup() (tkinter.ttk.Style method): Ttk Styling. (line 81) +* LookupError: Base classes. (line 77) +* lookup_error() (in module codecs): Error Handlers. (line 130) +* loop control; target: The break statement. + (line 12) +* loop() (in module asyncore): asyncore — Asynchronous socket handler. + (line 56) +* loop; over mutable sequence: Common Sequence Operations. + (line 75) +* loop; statement: The break statement. + (line 6) +* loop; statement <1>: The continue statement. + (line 6) +* loop; statement <2>: The while statement. + (line 6) +* loop; statement <3>: The for statement. (line 6) +* LOOPBACK_TIMEOUT (in module test.support): test support — Utilities for the Python test suite. + (line 48) +* lower() (bytearray method): Bytes and Bytearray Operations. + (line 614) +* lower() (bytes method): Bytes and Bytearray Operations. + (line 614) +* lower() (str method): String Methods<2>. (line 310) +* LPAR (in module token): token — Constants used with Python parse trees. + (line 54) +* lpAttributeList (subprocess.STARTUPINFO attribute): Windows Popen Helpers. + (line 60) +* lru_cache() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 127) +* lseek() (in module os): File Descriptor Operations. + (line 267) +* LShift (class in ast): Expressions<2>. (line 54) +* lshift() (in module operator): operator — Standard operators as functions. + (line 110) +* LSQB (in module token): token — Constants used with Python parse trees. + (line 62) +* lstat() (in module os): Files and Directories. + (line 399) +* lstat() (pathlib.Path method): Methods<2>. (line 236) +* lstrip() (bytearray method): Bytes and Bytearray Operations. + (line 308) +* lstrip() (bytes method): Bytes and Bytearray Operations. + (line 308) +* lstrip() (str method): String Methods<2>. (line 318) +* lsub() (imaplib.IMAP4 method): IMAP4 Objects. (line 150) +* Lt (class in ast): Expressions<2>. (line 109) +* lt() (in module operator): operator — Standard operators as functions. + (line 24) +* lt() (in module turtle): Turtle motion. (line 57) +* LtE (class in ast): Expressions<2>. (line 109) +* LWPCookieJar (class in http.cookiejar): FileCookieJar subclasses and co-operation with web browsers. + (line 28) +* LZMACompressor (class in lzma): Compressing and decompressing data in memory. + (line 6) +* LZMADecompressor (class in lzma): Compressing and decompressing data in memory. + (line 100) +* LZMAError: lzma — Compression using the LZMA algorithm. + (line 24) +* LZMAFile (class in lzma): Reading and writing compressed files. + (line 45) +* M (in module re): Flags. (line 73) +* machine() (in module platform): Cross Platform. (line 35) +* macros (netrc.netrc attribute): netrc Objects. (line 29) +* mac_ver() (in module platform): macOS Platform. (line 6) +* madvise() (mmap.mmap method): mmap — Memory-mapped file support. + (line 213) +* MADV_AUTOSYNC (in module mmap): MADV_* Constants. (line 6) +* MADV_CORE (in module mmap): MADV_* Constants. (line 6) +* MADV_DODUMP (in module mmap): MADV_* Constants. (line 6) +* MADV_DOFORK (in module mmap): MADV_* Constants. (line 6) +* MADV_DONTDUMP (in module mmap): MADV_* Constants. (line 6) +* MADV_DONTFORK (in module mmap): MADV_* Constants. (line 6) +* MADV_DONTNEED (in module mmap): MADV_* Constants. (line 6) +* MADV_FREE (in module mmap): MADV_* Constants. (line 6) +* MADV_FREE_REUSABLE (in module mmap): MADV_* Constants. (line 6) +* MADV_FREE_REUSE (in module mmap): MADV_* Constants. (line 6) +* MADV_HUGEPAGE (in module mmap): MADV_* Constants. (line 6) +* MADV_HWPOISON (in module mmap): MADV_* Constants. (line 6) +* MADV_MERGEABLE (in module mmap): MADV_* Constants. (line 6) +* MADV_NOCORE (in module mmap): MADV_* Constants. (line 6) +* MADV_NOHUGEPAGE (in module mmap): MADV_* Constants. (line 6) +* MADV_NORMAL (in module mmap): MADV_* Constants. (line 6) +* MADV_NOSYNC (in module mmap): MADV_* Constants. (line 6) +* MADV_PROTECT (in module mmap): MADV_* Constants. (line 6) +* MADV_RANDOM (in module mmap): MADV_* Constants. (line 6) +* MADV_REMOVE (in module mmap): MADV_* Constants. (line 6) +* MADV_SEQUENTIAL (in module mmap): MADV_* Constants. (line 6) +* MADV_SOFT_OFFLINE (in module mmap): MADV_* Constants. (line 6) +* MADV_UNMERGEABLE (in module mmap): MADV_* Constants. (line 6) +* MADV_WILLNEED (in module mmap): MADV_* Constants. (line 6) +* magic method: Glossary. (line 848) +* magic; method: Glossary. (line 852) +* MagicMock (class in unittest.mock): Magic Mock. (line 9) +* MAGIC_NUMBER (in module importlib.util): importlib util – Utility code for importers. + (line 13) +* Mailbox (class in mailbox): Mailbox objects. (line 6) +* Maildir (class in mailbox): Maildir. (line 6) +* MaildirMessage (class in mailbox): MaildirMessage. (line 6) +* mailfrom (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 74) +* main(): Process-wide parameters. + (line 9) +* main() <1>: Process-wide parameters. + (line 42) +* main() <2>: Process-wide parameters. + (line 271) +* main() (in module site): Module contents<5>. (line 41) +* main() (in module unittest): Loading and running tests. + (line 494) +* mainloop() (in module turtle): Using screen events. + (line 106) +* maintype (email.headerregistry.ContentTypeHeader attribute): email headerregistry Custom Header Objects. + (line 276) +* main_thread() (in module threading): threading — Thread-based parallelism. + (line 149) +* major (email.headerregistry.MIMEVersionHeader attribute): email headerregistry Custom Header Objects. + (line 247) +* major() (in module os): Files and Directories. + (line 538) +* makedev() (in module os): Files and Directories. + (line 548) +* makedirs() (in module os): Files and Directories. + (line 457) +* makeelement() (xml.etree.ElementTree.Element method): Element Objects. + (line 164) +* makefile() (socket method): The standard type hierarchy. + (line 675) +* makefile() (socket.socket method): Socket Objects. (line 208) +* makeLogRecord() (in module logging): Module-Level Functions. + (line 238) +* makePickle() (logging.handlers.SocketHandler method): SocketHandler. + (line 45) +* makeRecord() (logging.Logger method): Logger Objects. (line 317) +* makeSocket() (logging.handlers.DatagramHandler method): DatagramHandler. + (line 37) +* makeSocket() (logging.handlers.SocketHandler method): SocketHandler. + (line 39) +* maketrans() (bytearray static method): Bytes and Bytearray Operations. + (line 169) +* maketrans() (bytes static method): Bytes and Bytearray Operations. + (line 169) +* maketrans() (str static method): String Methods<2>. (line 340) +* make_alternative() (email.message.EmailMessage method): email message Representing an email message. + (line 607) +* make_archive() (in module distutils.archive_util): distutils archive_util — Archiving utilities. + (line 9) +* make_archive() (in module shutil): Archiving operations. + (line 14) +* make_bad_fd() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 106) +* MAKE_CELL (opcode): Python Bytecode Instructions. + (line 702) +* make_cookies() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 61) +* make_dataclass() (in module dataclasses): Module contents<4>. + (line 364) +* make_file() (difflib.HtmlDiff method): difflib — Helpers for computing deltas. + (line 111) +* MAKE_FUNCTION (opcode): Python Bytecode Instructions. + (line 861) +* make_header() (in module email.header): email header Internationalized headers. + (line 200) +* make_legacy_pyc() (in module test.support.import_helper): test support import_helper — Utilities for import tests. + (line 80) +* make_mixed() (email.message.EmailMessage method): email message Representing an email message. + (line 617) +* make_msgid() (in module email.utils): email utils Miscellaneous utilities. + (line 29) +* make_parser() (in module xml.sax): xml sax — Support for SAX2 parsers. + (line 28) +* make_pkg() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 97) +* make_related() (email.message.EmailMessage method): email message Representing an email message. + (line 598) +* make_script() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 82) +* make_server() (in module wsgiref.simple_server): wsgiref simple_server – a simple WSGI HTTP server. + (line 14) +* make_table() (difflib.HtmlDiff method): difflib — Helpers for computing deltas. + (line 143) +* make_tarball() (in module distutils.archive_util): distutils archive_util — Archiving utilities. + (line 25) +* make_zipfile() (in module distutils.archive_util): distutils archive_util — Archiving utilities. + (line 39) +* make_zip_pkg() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 103) +* make_zip_script() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 89) +* malloc(): Overview<4>. (line 33) +* mangle_from_ (email.policy.Compat32 attribute): email policy Policy Objects. + (line 559) +* mangle_from_ (email.policy.Policy attribute): email policy Policy Objects. + (line 186) +* map (2to3 fixer): Fixers. (line 185) +* map() (concurrent.futures.Executor method): Executor Objects. + (line 22) +* map() (multiprocessing.pool.Pool method): Process Pools. (line 90) +* map() (tkinter.ttk.Style method): Ttk Styling. (line 48) +* mapLogRecord() (logging.handlers.HTTPHandler method): HTTPHandler. + (line 27) +* mapping: Glossary. (line 852) +* Mapping (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 83) +* Mapping (class in typing): Corresponding to collections in collections abc. + (line 61) +* mapping() (msilib.Control method): GUI classes. (line 18) +* MappingProxyType (class in types): Standard Interpreter Types. + (line 260) +* MappingView (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 88) +* MappingView (class in typing): Corresponding to collections in collections abc. + (line 73) +* mapPriority() (logging.handlers.SysLogHandler method): SysLogHandler. + (line 190) +* maps (collections.ChainMap attribute): ChainMap objects. (line 39) +* maps() (in module nis): nis — Interface to Sun’s NIS Yellow Pages. + (line 49) +* MAP_ADD (opcode): Python Bytecode Instructions. + (line 256) +* MAP_ANON (in module mmap): MAP_* Constants. (line 6) +* MAP_ANONYMOUS (in module mmap): MAP_* Constants. (line 6) +* map_async() (multiprocessing.pool.Pool method): Process Pools. + (line 107) +* MAP_DENYWRITE (in module mmap): MAP_* Constants. (line 6) +* MAP_EXECUTABLE (in module mmap): MAP_* Constants. (line 6) +* MAP_POPULATE (in module mmap): MAP_* Constants. (line 6) +* MAP_PRIVATE (in module mmap): MAP_* Constants. (line 6) +* MAP_SHARED (in module mmap): MAP_* Constants. (line 6) +* MAP_STACK (in module mmap): MAP_* Constants. (line 6) +* map_table_b2() (in module stringprep): stringprep — Internet String Preparation. + (line 50) +* map_table_b3() (in module stringprep): stringprep — Internet String Preparation. + (line 55) +* map_to_type() (email.headerregistry.HeaderRegistry method): email headerregistry Custom Header Objects. + (line 376) +* marshalling; objects: pickle — Python object serialization. + (line 8) +* masking; operations: Bitwise Operations on Integer Types. + (line 6) +* master (tkinter.Tk attribute): Tkinter Modules. (line 77) +* Match (class in ast): Pattern matching. (line 6) +* Match (class in typing): Other concrete types. + (line 18) +* match() (in module nis): nis — Interface to Sun’s NIS Yellow Pages. + (line 24) +* match() (in module re): Functions<2>. (line 45) +* match() (pathlib.PurePath method): Methods and properties. + (line 245) +* match() (re.Pattern method): Regular Expression Objects. + (line 37) +* match; case: The match statement. + (line 6) +* MatchAs (class in ast): Pattern matching. (line 290) +* MatchClass (class in ast): Pattern matching. (line 225) +* Matcher (class in test.support): test support — Utilities for the Python test suite. + (line 746) +* matches() (test.support.Matcher method): test support — Utilities for the Python test suite. + (line 748) +* MatchMapping (class in ast): Pattern matching. (line 180) +* MatchOr (class in ast): Pattern matching. (line 329) +* MatchSequence (class in ast): Pattern matching. (line 112) +* MatchSingleton (class in ast): Pattern matching. (line 89) +* MatchStar (class in ast): Pattern matching. (line 141) +* MatchValue (class in ast): Pattern matching. (line 63) +* match_case (class in ast): Pattern matching. (line 13) +* MATCH_CLASS (opcode): Python Bytecode Instructions. + (line 924) +* match_hostname() (in module ssl): Certificate handling. + (line 6) +* MATCH_KEYS (opcode): Python Bytecode Instructions. + (line 412) +* MATCH_MAPPING (opcode): Python Bytecode Instructions. + (line 393) +* MATCH_SEQUENCE (opcode): Python Bytecode Instructions. + (line 402) +* match_test() (in module test.support): test support — Utilities for the Python test suite. + (line 225) +* match_value() (test.support.Matcher method): test support — Utilities for the Python test suite. + (line 752) +* matmul() (in module operator): operator — Standard operators as functions. + (line 125) +* MatMult (class in ast): Expressions<2>. (line 54) +* matrix multiplication: Binary arithmetic operations. + (line 26) +* max (datetime.date attribute): date Objects. (line 95) +* max (datetime.datetime attribute): datetime Objects. (line 260) +* max (datetime.time attribute): time Objects. (line 37) +* max (datetime.timedelta attribute): timedelta Objects. (line 78) +* max() (decimal.Context method): Context objects. (line 385) +* max() (decimal.Decimal method): Decimal objects. (line 375) +* max() (in module audioop): audioop — Manipulate raw audio data. + (line 158) +* maxarray (reprlib.Repr attribute): Repr Objects. (line 22) +* maxdeque (reprlib.Repr attribute): Repr Objects. (line 22) +* maxdict (reprlib.Repr attribute): Repr Objects. (line 22) +* maxDiff (unittest.TestCase attribute): Test cases. (line 719) +* maxfrozenset (reprlib.Repr attribute): Repr Objects. (line 22) +* MAXIMUM_SUPPORTED (ssl.TLSVersion attribute): Constants<9>. + (line 552) +* maximum_version (ssl.SSLContext attribute): SSL Contexts. (line 526) +* maxlen (collections.deque attribute): deque objects. (line 120) +* maxlevel (reprlib.Repr attribute): Repr Objects. (line 17) +* maxlist (reprlib.Repr attribute): Repr Objects. (line 22) +* maxlong (reprlib.Repr attribute): Repr Objects. (line 34) +* maxother (reprlib.Repr attribute): Repr Objects. (line 47) +* maxpp() (in module audioop): audioop — Manipulate raw audio data. + (line 163) +* maxset (reprlib.Repr attribute): Repr Objects. (line 22) +* maxsize (asyncio.Queue attribute): Queue. (line 23) +* maxsize (in module sys): sys — System-specific parameters and functions. + (line 1100) +* maxstring (reprlib.Repr attribute): Repr Objects. (line 39) +* maxtuple (reprlib.Repr attribute): Repr Objects. (line 22) +* maxunicode (in module sys): sys — System-specific parameters and functions. + (line 1106) +* MAXYEAR (in module datetime): Constants. (line 13) +* max_count (email.headerregistry.BaseHeader attribute): email headerregistry Custom Header Objects. + (line 60) +* MAX_EMAX (in module decimal): Constants<4>. (line 16) +* MAX_INTERPOLATION_DEPTH (in module configparser): ConfigParser Objects. + (line 326) +* max_lines (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 269) +* max_line_length (email.policy.Policy attribute): email policy Policy Objects. + (line 145) +* max_mag() (decimal.Context method): Context objects. (line 389) +* max_mag() (decimal.Decimal method): Decimal objects. (line 382) +* max_memuse (in module test.support): test support — Utilities for the Python test suite. + (line 138) +* MAX_PREC (in module decimal): Constants<4>. (line 13) +* max_prefixlen (ipaddress.IPv4Address attribute): Address objects. + (line 55) +* max_prefixlen (ipaddress.IPv4Network attribute): Network objects. + (line 65) +* max_prefixlen (ipaddress.IPv6Address attribute): Address objects. + (line 214) +* max_prefixlen (ipaddress.IPv6Network attribute): Network objects. + (line 295) +* MAX_Py_ssize_t (in module test.support): test support — Utilities for the Python test suite. + (line 134) +* mbox (class in mailbox): mbox. (line 6) +* mboxMessage (class in mailbox): mboxMessage. (line 6) +* MB_ICONASTERISK (in module winsound): winsound — Sound-playing interface for Windows. + (line 128) +* MB_ICONEXCLAMATION (in module winsound): winsound — Sound-playing interface for Windows. + (line 132) +* MB_ICONHAND (in module winsound): winsound — Sound-playing interface for Windows. + (line 136) +* MB_ICONQUESTION (in module winsound): winsound — Sound-playing interface for Windows. + (line 140) +* MB_OK (in module winsound): winsound — Sound-playing interface for Windows. + (line 144) +* mean (statistics.NormalDist attribute): NormalDist objects. + (line 21) +* mean() (in module statistics): Function details. (line 10) +* measure() (tkinter.font.Font method): tkinter font — Tkinter font wrapper. + (line 63) +* median (statistics.NormalDist attribute): NormalDist objects. + (line 26) +* median() (in module statistics): Function details. (line 137) +* median_grouped() (in module statistics): Function details. (line 200) +* median_high() (in module statistics): Function details. (line 182) +* median_low() (in module statistics): Function details. (line 164) +* member() (in module enum): Utilities and Decorators. + (line 63) +* MemberDescriptorType (in module types): Standard Interpreter Types. + (line 249) +* membership; test: Membership test operations. + (line 36) +* memfd_create() (in module os): Files and Directories. + (line 1658) +* memmove() (in module ctypes): Utility functions. (line 137) +* MemoryBIO (class in ssl): Memory BIO Support<2>. + (line 134) +* MemoryError: Concrete exceptions. + (line 93) +* MemoryHandler (class in logging.handlers): MemoryHandler. (line 40) +* memoryview (built-in class): Memory Views. (line 10) +* memset() (in module ctypes): Utility functions. (line 143) +* merge() (in module heapq): heapq — Heap queue algorithm. + (line 79) +* message (BaseExceptionGroup attribute): Exception groups. (line 33) +* Message (class in email.message): email message Message Representing an email message using the compat32 API. + (line 49) +* Message (class in mailbox): Message objects. (line 6) +* Message (class in tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 20) +* message digest, MD5: hashlib — Secure hashes and message digests. + (line 8) +* MessageBeep() (in module winsound): winsound — Sound-playing interface for Windows. + (line 31) +* MessageClass (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 173) +* MessageError: email errors Exception and Defect classes. + (line 13) +* MessageParseError: email errors Exception and Defect classes. + (line 19) +* messages (in module xml.parsers.expat.errors): Expat error constants. + (line 22) +* message_factory (email.policy.Policy attribute): email policy Policy Objects. + (line 195) +* message_from_binary_file() (in module email): Parser API. (line 129) +* message_from_bytes() (in module email): Parser API. (line 116) +* message_from_file() (in module email): Parser API. (line 152) +* message_from_string() (in module email): Parser API. (line 142) +* meta hooks: Import hooks. (line 6) +* meta path finder: Glossary. (line 862) +* meta() (in module curses): Functions<5>. (line 285) +* metaclass: Metaclasses. (line 6) +* metaclass <1>: Glossary. (line 871) +* metaclass (2to3 fixer): Fixers. (line 191) +* metaclass hint: Determining the appropriate metaclass. + (line 6) +* MetaPathFinder (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 49) +* metavar (optparse.Option attribute): Option attributes. (line 80) +* MetavarTypeHelpFormatter (class in argparse): formatter_class. + (line 10) +* meta_path (in module sys): sys — System-specific parameters and functions. + (line 1116) +* Meter (class in tkinter.tix): Basic Widgets. (line 44) +* method: Glossary. (line 886) +* method (urllib.request.Request attribute): Request Objects. + (line 52) +* method resolution order: Glossary. (line 894) +* method; call: Calls. (line 141) +* methodattrs (2to3 fixer): Fixers. (line 196) +* methodcaller() (in module operator): operator — Standard operators as functions. + (line 320) +* MethodDescriptorType (in module types): Standard Interpreter Types. + (line 115) +* methodHelp() (xmlrpc.client.ServerProxy.system method): ServerProxy Objects. + (line 43) +* methods (in module crypt): Module Attributes. (line 8) +* methods (pyclbr.Class attribute): Class Objects<2>. (line 46) +* methodSignature() (xmlrpc.client.ServerProxy.system method): ServerProxy Objects. + (line 22) +* MethodType (in module types): Standard Interpreter Types. + (line 83) +* MethodType (in module types) <1>: Function Objects<3>. + (line 14) +* MethodType (in module types) <2>: Method Objects<2>. (line 12) +* MethodWrapperType (in module types): Standard Interpreter Types. + (line 102) +* METHOD_BLOWFISH (in module crypt): Hashing Methods. (line 22) +* method_calls (unittest.mock.Mock attribute): The Mock Class. + (line 483) +* METHOD_CRYPT (in module crypt): Hashing Methods. (line 34) +* METHOD_MD5 (in module crypt): Hashing Methods. (line 29) +* METHOD_SHA256 (in module crypt): Hashing Methods. (line 17) +* METHOD_SHA512 (in module crypt): Hashing Methods. (line 11) +* METH_CLASS (built-in variable): Implementing functions and methods. + (line 185) +* METH_COEXIST (built-in variable): Implementing functions and methods. + (line 202) +* METH_FASTCALL (built-in variable): Implementing functions and methods. + (line 119) +* METH_NOARGS (built-in variable): Implementing functions and methods. + (line 159) +* METH_O (built-in variable): Implementing functions and methods. + (line 172) +* METH_STATIC (built-in variable): Implementing functions and methods. + (line 192) +* METH_VARARGS (built-in variable): Implementing functions and methods. + (line 100) +* metrics() (tkinter.font.Font method): tkinter font — Tkinter font wrapper. + (line 69) +* MFD_ALLOW_SEALING (in module os): Files and Directories. + (line 1676) +* MFD_CLOEXEC (in module os): Files and Directories. + (line 1676) +* MFD_HUGETLB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_16GB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_16MB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_1GB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_1MB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_256MB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_2GB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_2MB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_32MB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_512KB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_512MB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_64KB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_8MB (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_MASK (in module os): Files and Directories. + (line 1676) +* MFD_HUGE_SHIFT (in module os): Files and Directories. + (line 1676) +* MH (class in mailbox): MH. (line 6) +* MHMessage (class in mailbox): MHMessage. (line 6) +* microsecond (datetime.datetime attribute): datetime Objects. + (line 297) +* microsecond (datetime.time attribute): time Objects. (line 62) +* MIME; base64 encoding: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 8) +* MIME; content type: mimetypes — Map filenames to MIME types. + (line 8) +* MIME; headers: mimetypes — Map filenames to MIME types. + (line 26) +* MIME; headers <1>: cgi — Common Gateway Interface support. + (line 8) +* MIME; quoted-printable encoding: quopri — Encode and decode MIME quoted-printable data. + (line 8) +* MIMEApplication (class in email.mime.application): email mime Creating email and MIME objects from scratch. + (line 95) +* MIMEAudio (class in email.mime.audio): email mime Creating email and MIME objects from scratch. + (line 125) +* MIMEBase (class in email.mime.base): email mime Creating email and MIME objects from scratch. + (line 30) +* MIMEImage (class in email.mime.image): email mime Creating email and MIME objects from scratch. + (line 157) +* MIMEMessage (class in email.mime.message): email mime Creating email and MIME objects from scratch. + (line 190) +* MIMEMultipart (class in email.mime.multipart): email mime Creating email and MIME objects from scratch. + (line 66) +* MIMENonMultipart (class in email.mime.nonmultipart): email mime Creating email and MIME objects from scratch. + (line 55) +* MIMEPart (class in email.message): email message Representing an email message. + (line 718) +* MIMEText (class in email.mime.text): email mime Creating email and MIME objects from scratch. + (line 208) +* MimeTypes (class in mimetypes): MimeTypes Objects. (line 10) +* MIMEVersionHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 234) +* min (datetime.date attribute): date Objects. (line 91) +* min (datetime.datetime attribute): datetime Objects. (line 255) +* min (datetime.time attribute): time Objects. (line 33) +* min (datetime.timedelta attribute): timedelta Objects. (line 73) +* min() (decimal.Context method): Context objects. (line 393) +* min() (decimal.Decimal method): Decimal objects. (line 387) +* MINEQUAL (in module token): token — Constants used with Python parse trees. + (line 174) +* MINIMUM_SUPPORTED (ssl.TLSVersion attribute): Constants<9>. + (line 550) +* minimum_version (ssl.SSLContext attribute): SSL Contexts. (line 544) +* minmax() (in module audioop): audioop — Manipulate raw audio data. + (line 167) +* minor (email.headerregistry.MIMEVersionHeader attribute): email headerregistry Custom Header Objects. + (line 251) +* minor() (in module os): Files and Directories. + (line 543) +* minus: Unary arithmetic and bitwise operations. + (line 10) +* MINUS (in module token): token — Constants used with Python parse trees. + (line 86) +* minus() (decimal.Context method): Context objects. (line 401) +* minute (datetime.datetime attribute): datetime Objects. (line 289) +* minute (datetime.time attribute): time Objects. (line 54) +* MINYEAR (in module datetime): Constants. (line 8) +* MIN_EMIN (in module decimal): Constants<4>. (line 19) +* MIN_ETINY (in module decimal): Constants<4>. (line 22) +* min_mag() (decimal.Context method): Context objects. (line 397) +* min_mag() (decimal.Decimal method): Decimal objects. (line 394) +* mirrored() (in module unicodedata): unicodedata — Unicode Database. + (line 69) +* misc_header (cmd.Cmd attribute): Cmd Objects. (line 158) +* MISSING (contextvars.Token attribute): Context Variables. (line 94) +* MISSING (in module dataclasses): Module contents<4>. (line 442) +* MissingSectionHeaderError: Exceptions<7>. (line 60) +* missing_compiler_executable() (in module test.support): test support — Utilities for the Python test suite. + (line 636) +* MISSING_C_DOCSTRINGS (in module test.support): test support — Utilities for the Python test suite. + (line 148) +* MIXERDEV: ossaudiodev — Access to OSS-compatible audio devices. + (line 78) +* mkd() (ftplib.FTP method): FTP Objects. (line 217) +* mkdir() (in module os): Files and Directories. + (line 431) +* mkdir() (pathlib.Path method): Methods<2>. (line 242) +* mkdir() (zipfile.ZipFile method): ZipFile Objects. (line 328) +* mkdtemp() (in module tempfile): tempfile — Generate temporary files and directories. + (line 219) +* mkfifo() (in module os): Files and Directories. + (line 497) +* mknod() (in module os): Files and Directories. + (line 518) +* mkpath() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 490) +* mkpath() (in module distutils.dir_util): distutils dir_util — Directory tree operations. + (line 9) +* mksalt() (in module crypt): Module Functions<2>. + (line 39) +* mkstemp() (in module tempfile): tempfile — Generate temporary files and directories. + (line 161) +* mktemp() (in module tempfile): Deprecated functions and variables. + (line 15) +* mktime() (in module time): Functions<4>. (line 160) +* mktime_tz() (in module email.utils): email utils Miscellaneous utilities. + (line 135) +* mlsd() (ftplib.FTP method): FTP Objects. (line 165) +* mmap (class in mmap): mmap — Memory-mapped file support. + (line 53) +* MMDF (class in mailbox): MMDF. (line 6) +* MMDFMessage (class in mailbox): MMDFMessage. (line 6) +* Mock (class in unittest.mock): The Mock Class. (line 24) +* mock_add_spec() (unittest.mock.Mock method): The Mock Class. + (line 227) +* mock_calls (unittest.mock.Mock attribute): The Mock Class. (line 501) +* mock_open() (in module unittest.mock): mock_open. (line 6) +* Mod (class in ast): Expressions<2>. (line 54) +* mod() (in module operator): operator — Standard operators as functions. + (line 115) +* mode (io.FileIO attribute): Raw File I/O. (line 55) +* mode (ossaudiodev.oss_audio_device attribute): Audio Device Objects. + (line 238) +* mode (statistics.NormalDist attribute): NormalDist objects. + (line 31) +* mode (tarfile.TarInfo attribute): TarInfo Objects. (line 55) +* mode() (in module statistics): Function details. (line 245) +* mode() (in module turtle): Settings and special methods. + (line 6) +* modf() (in module math): Number-theoretic and representation functions. + (line 189) +* modified() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 45) +* Modify() (msilib.View method): View Objects. (line 23) +* modify() (select.devpoll method): /dev/poll Polling Objects. + (line 49) +* modify() (select.epoll method): Edge and Level Trigger Polling epoll Objects. + (line 85) +* modify() (select.poll method): Polling Objects. (line 60) +* modify() (selectors.BaseSelector method): Classes<3>. (line 94) +* module: Glossary. (line 901) +* module (pyclbr.Class attribute): Class Objects<2>. (line 13) +* module (pyclbr.Function attribute): Function Objects. (line 13) +* Module browser: File menu Shell and Editor. + (line 22) +* module spec: Finders and loaders. + (line 6) +* module spec <1>: Glossary. (line 910) +* module; abc: abc — Abstract Base Classes. + (line 6) +* module; aifc: aifc — Read and write AIFF and AIFC files. + (line 6) +* module; argparse: argparse — Parser for command-line options arguments and sub-commands. + (line 6) +* module; array: The standard type hierarchy. + (line 218) +* module; array <1>: Binary Sequence Types — bytes bytearray memoryview. + (line 6) +* module; array <2>: array — Efficient arrays of numeric values. + (line 6) +* module; ast: ast — Abstract Syntax Trees. + (line 6) +* module; asynchat: asynchat — Asynchronous socket command/response handler. + (line 6) +* module; asyncio: asyncio — Asynchronous I/O. + (line 6) +* module; asyncore: asyncore — Asynchronous socket handler. + (line 6) +* module; atexit: atexit — Exit handlers. + (line 6) +* module; audioop: audioop — Manipulate raw audio data. + (line 6) +* module; base64: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 6) +* module; base64 <1>: binascii — Convert between binary and ASCII. + (line 6) +* module; bdb: bdb — Debugger framework. + (line 6) +* module; bdb <1>: pdb — The Python Debugger. + (line 17) +* module; binascii: binascii — Convert between binary and ASCII. + (line 6) +* module; bisect: bisect — Array bisection algorithm. + (line 6) +* module; builtins: The dir Function. (line 47) +* module; builtins <1>: Complete Python programs. + (line 6) +* module; builtins <2>: builtins — Built-in objects. + (line 6) +* module; builtins <3>: Embedding Python<2>. + (line 12) +* module; builtins <4>: Initializing and finalizing the interpreter. + (line 7) +* module; builtins <5>: Sub-interpreter support. + (line 25) +* module; bz2: bz2 — Support for bzip2 compression. + (line 6) +* module; calendar: calendar — General calendar-related functions. + (line 6) +* module; cgi: cgi — Common Gateway Interface support. + (line 6) +* module; cgitb: cgitb — Traceback manager for CGI scripts. + (line 6) +* module; chunk: chunk — Read IFF chunked data. + (line 6) +* module; cmath: cmath — Mathematical functions for complex numbers. + (line 6) +* module; cmd: cmd — Support for line-oriented command interpreters. + (line 6) +* module; cmd <1>: pdb — The Python Debugger. + (line 17) +* module; code: code — Interpreter base classes. + (line 6) +* module; codecs: codecs — Codec registry and base classes. + (line 6) +* module; codeop: codeop — Compile Python code. + (line 6) +* module; collections: collections — Container datatypes. + (line 6) +* module; collections.abc: collections abc — Abstract Base Classes for Containers. + (line 6) +* module; colorsys: colorsys — Conversions between color systems. + (line 6) +* module; compileall: compileall — Byte-compile Python libraries. + (line 6) +* module; concurrent.futures: concurrent futures — Launching parallel tasks. + (line 6) +* module; configparser: configparser — Configuration file parser. + (line 6) +* module; contextlib: contextlib — Utilities for with-statement contexts. + (line 6) +* module; contextvars: contextvars — Context Variables. + (line 6) +* module; copy: copy — Shallow and deep copy operations. + (line 6) +* module; copy <1>: copyreg — Register pickle support functions. + (line 8) +* module; copyreg: copyreg — Register pickle support functions. + (line 6) +* module; cProfile: profile and cProfile Module Reference. + (line 6) +* module; crypt: pwd — The password database. + (line 48) +* module; crypt <1>: crypt — Function to check Unix passwords. + (line 6) +* module; csv: csv — CSV File Reading and Writing. + (line 6) +* module; ctypes: ctypes — A foreign function library for Python. + (line 6) +* module; curses: curses — Terminal handling for character-cell displays. + (line 6) +* module; curses.ascii: curses ascii — Utilities for ASCII characters. + (line 6) +* module; curses.panel: curses panel — A panel stack extension for curses. + (line 6) +* module; curses.textpad: curses textpad — Text input widget for curses programs. + (line 6) +* module; dataclasses: dataclasses — Data Classes. + (line 6) +* module; datetime: datetime — Basic date and time types. + (line 6) +* module; dbm: dbm — Interfaces to Unix “databases”. + (line 6) +* module; dbm.dumb: dbm dumb — Portable DBM implementation. + (line 6) +* module; dbm.gnu: The standard type hierarchy. + (line 285) +* module; dbm.gnu <1>: Restrictions. (line 6) +* module; dbm.gnu <2>: dbm gnu — GNU’s reinterpretation of dbm. + (line 6) +* module; dbm.ndbm: The standard type hierarchy. + (line 285) +* module; dbm.ndbm <1>: Restrictions. (line 6) +* module; dbm.ndbm <2>: dbm ndbm — Interface based on ndbm. + (line 6) +* module; decimal: decimal — Decimal fixed point and floating point arithmetic. + (line 6) +* module; difflib: difflib — Helpers for computing deltas. + (line 6) +* module; dis: dis — Disassembler for Python bytecode. + (line 6) +* module; distutils: distutils — Building and installing Python modules. + (line 6) +* module; distutils.archive_util: distutils archive_util — Archiving utilities. + (line 6) +* module; distutils.bcppcompiler: distutils bcppcompiler — Borland Compiler. + (line 6) +* module; distutils.ccompiler: distutils ccompiler — CCompiler base class. + (line 6) +* module; distutils.cmd: distutils cmd — Abstract base class for Distutils commands. + (line 6) +* module; distutils.command: distutils command — Individual Distutils commands. + (line 5) +* module; distutils.command.bdist: distutils command bdist — Build a binary installer. + (line 5) +* module; distutils.command.bdist_dumb: distutils command bdist_dumb — Build a “dumb” installer. + (line 5) +* module; distutils.command.bdist_packager: distutils command bdist_packager — Abstract base class for packagers. + (line 5) +* module; distutils.command.bdist_rpm: distutils command bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM. + (line 5) +* module; distutils.command.build: distutils command build — Build all files of a package. + (line 5) +* module; distutils.command.build_clib: distutils command build_clib — Build any C libraries in a package. + (line 5) +* module; distutils.command.build_ext: distutils command build_ext — Build any extensions in a package. + (line 5) +* module; distutils.command.build_py: distutils command build_py — Build the py/ pyc files of a package. + (line 6) +* module; distutils.command.build_scripts: distutils command build_scripts — Build the scripts of a package. + (line 5) +* module; distutils.command.check: distutils command check — Check the meta-data of a package. + (line 6) +* module; distutils.command.clean: distutils command clean — Clean a package build area. + (line 6) +* module; distutils.command.config: distutils command config — Perform package configuration. + (line 5) +* module; distutils.command.install: distutils command install — Install a package. + (line 5) +* module; distutils.command.install_data: distutils command install_data — Install data files from a package. + (line 5) +* module; distutils.command.install_headers: distutils command install_headers — Install C/C++ header files from a package. + (line 5) +* module; distutils.command.install_lib: distutils command install_lib — Install library files from a package. + (line 5) +* module; distutils.command.install_scripts: distutils command install_scripts — Install script files from a package. + (line 5) +* module; distutils.command.register: distutils command register — Register a module with the Python Package Index. + (line 6) +* module; distutils.command.sdist: distutils command sdist — Build a source distribution. + (line 5) +* module; distutils.core: distutils core — Core Distutils functionality. + (line 6) +* module; distutils.cygwinccompiler: distutils cygwincompiler — Cygwin Compiler. + (line 6) +* module; distutils.debug: distutils debug — Distutils debug mode. + (line 6) +* module; distutils.dep_util: distutils dep_util — Dependency checking. + (line 6) +* module; distutils.dir_util: distutils dir_util — Directory tree operations. + (line 6) +* module; distutils.dist: distutils dist — The Distribution class. + (line 6) +* module; distutils.errors: distutils errors — Distutils exceptions. + (line 6) +* module; distutils.extension: distutils extension — The Extension class. + (line 6) +* module; distutils.fancy_getopt: distutils fancy_getopt — Wrapper around the standard getopt module. + (line 6) +* module; distutils.filelist: distutils filelist — The FileList class. + (line 6) +* module; distutils.file_util: distutils file_util — Single file operations. + (line 6) +* module; distutils.log: distutils log — Simple PEP 282-style logging. + (line 7) +* module; distutils.msvccompiler: distutils msvccompiler — Microsoft Compiler. + (line 6) +* module; distutils.spawn: distutils spawn — Spawn a sub-process. + (line 6) +* module; distutils.sysconfig: distutils sysconfig — System configuration information. + (line 6) +* module; distutils.text_file: distutils text_file — The TextFile class. + (line 6) +* module; distutils.unixccompiler: distutils unixccompiler — Unix C Compiler. + (line 6) +* module; distutils.util: distutils util — Miscellaneous other utility functions. + (line 6) +* module; distutils.version: distutils version — Version number classes. + (line 5) +* module; doctest: doctest — Test interactive Python examples. + (line 6) +* module; email: email — An email and MIME handling package. + (line 6) +* module; email.charset: email charset Representing character sets. + (line 6) +* module; email.contentmanager: email contentmanager Managing MIME Content. + (line 6) +* module; email.encoders: email encoders Encoders. + (line 6) +* module; email.errors: email errors Exception and Defect classes. + (line 6) +* module; email.generator: email generator Generating MIME documents. + (line 6) +* module; email.header: email header Internationalized headers. + (line 6) +* module; email.headerregistry: email headerregistry Custom Header Objects. + (line 6) +* module; email.iterators: email iterators Iterators. + (line 6) +* module; email.message: email message Representing an email message. + (line 6) +* module; email.mime: email mime Creating email and MIME objects from scratch. + (line 6) +* module; email.parser: email parser Parsing email messages. + (line 6) +* module; email.policy: email policy Policy Objects. + (line 6) +* module; email.utils: email utils Miscellaneous utilities. + (line 6) +* module; encodings.idna: encodings idna — Internationalized Domain Names in Applications. + (line 6) +* module; encodings.mbcs: encodings mbcs — Windows ANSI codepage. + (line 6) +* module; encodings.utf_8_sig: encodings utf_8_sig — UTF-8 codec with BOM signature. + (line 6) +* module; ensurepip: ensurepip — Bootstrapping the pip installer. + (line 6) +* module; enum: enum — Support for enumerations. + (line 6) +* module; errno: Concrete exceptions. + (line 139) +* module; errno <1>: errno — Standard errno system symbols. + (line 6) +* module; faulthandler: faulthandler — Dump the Python traceback. + (line 6) +* module; fcntl: fcntl — The fcntl and ioctl system calls. + (line 6) +* module; filecmp: filecmp — File and Directory Comparisons. + (line 6) +* module; fileinput: fileinput — Iterate over lines from multiple input streams. + (line 6) +* module; fnmatch: fnmatch — Unix filename pattern matching. + (line 6) +* module; fractions: fractions — Rational numbers. + (line 6) +* module; ftplib: ftplib — FTP protocol client. + (line 6) +* module; functools: functools — Higher-order functions and operations on callable objects. + (line 6) +* module; gc: gc — Garbage Collector interface. + (line 6) +* module; getopt: getopt — C-style parser for command line options. + (line 6) +* module; getpass: getpass — Portable password input. + (line 6) +* module; gettext: gettext — Multilingual internationalization services. + (line 6) +* module; glob: glob — Unix style pathname pattern expansion. + (line 6) +* module; glob <1>: fnmatch — Unix filename pattern matching. + (line 34) +* module; graphlib: graphlib — Functionality to operate with graph-like structures. + (line 6) +* module; grp: grp — The group database. + (line 6) +* module; gzip: gzip — Support for gzip files. + (line 6) +* module; hashlib: hashlib — Secure hashes and message digests. + (line 6) +* module; heapq: heapq — Heap queue algorithm. + (line 6) +* module; hmac: hmac — Keyed-Hashing for Message Authentication. + (line 6) +* module; html: html — HyperText Markup Language support. + (line 6) +* module; html.entities: html entities — Definitions of HTML general entities. + (line 6) +* module; html.parser: html parser — Simple HTML and XHTML parser. + (line 6) +* module; http: http — HTTP modules. + (line 6) +* module; http.client: http client — HTTP protocol client. + (line 6) +* module; http.cookiejar: http cookiejar — Cookie handling for HTTP clients. + (line 6) +* module; http.cookies: http cookies — HTTP state management. + (line 6) +* module; http.server: http server — HTTP servers. + (line 6) +* module; idlelib: idlelib. (line 6) +* module; imaplib: imaplib — IMAP4 protocol client. + (line 6) +* module; imghdr: imghdr — Determine the type of an image. + (line 6) +* module; imp: Built-in Functions. (line 1953) +* module; imp <1>: imp — Access the import internals. + (line 6) +* module; importing: The import statement. + (line 6) +* module; importlib: importlib — The implementation of import. + (line 6) +* module; importlib.abc: importlib abc – Abstract base classes related to import. + (line 6) +* module; importlib.machinery: importlib machinery – Importers and path hooks. + (line 6) +* module; importlib.metadata: Using importlib metadata. + (line 6) +* module; importlib.resources: importlib resources – Resources. + (line 6) +* module; importlib.resources.abc: importlib resources abc – Abstract base classes for resources. + (line 6) +* module; importlib.util: importlib util – Utility code for importers. + (line 6) +* module; inspect: inspect — Inspect live objects. + (line 6) +* module; io: The standard type hierarchy. + (line 675) +* module; io <1>: io — Core tools for working with streams. + (line 6) +* module; ipaddress: ipaddress — IPv4/IPv6 manipulation library. + (line 6) +* module; itertools: itertools — Functions creating iterators for efficient looping. + (line 6) +* module; json: Saving structured data with json. + (line 6) +* module; json <1>: json — JSON encoder and decoder. + (line 6) +* module; json.tool: Command Line Interface<2>. + (line 6) +* module; keyword: keyword — Testing for Python keywords. + (line 6) +* module; lib2to3: lib2to3 — 2to3’s library. + (line 6) +* module; linecache: linecache — Random access to text lines. + (line 6) +* module; locale: locale — Internationalization services. + (line 6) +* module; logging: logging — Logging facility for Python. + (line 6) +* module; logging.config: logging config — Logging configuration. + (line 6) +* module; logging.handlers: logging handlers — Logging handlers. + (line 6) +* module; lzma: lzma — Compression using the LZMA algorithm. + (line 6) +* module; mailbox: mailbox — Manipulate mailboxes in various formats. + (line 6) +* module; mailcap: mailcap — Mailcap file handling. + (line 6) +* module; marshal: marshal — Internal Python object serialization. + (line 6) +* module; math: Numeric Types — int float complex. + (line 104) +* module; math <1>: math — Mathematical functions. + (line 6) +* module; math <2>: Constants<3>. (line 47) +* module; mimetypes: mimetypes — Map filenames to MIME types. + (line 6) +* module; mmap: mmap — Memory-mapped file support. + (line 6) +* module; modulefinder: modulefinder — Find modules used by a script. + (line 6) +* module; msilib: msilib — Read and write Microsoft Installer files. + (line 6) +* module; msvcrt: msvcrt — Useful routines from the MS VC++ runtime. + (line 6) +* module; multiprocessing: multiprocessing — Process-based parallelism. + (line 6) +* module; multiprocessing.connection: Listeners and Clients. + (line 6) +* module; multiprocessing.dummy: The multiprocessing dummy module. + (line 6) +* module; multiprocessing.managers: Managers. (line 18) +* module; multiprocessing.pool: Process Pools. (line 6) +* module; multiprocessing.sharedctypes: The multiprocessing sharedctypes module. + (line 6) +* module; multiprocessing.shared_memory: multiprocessing shared_memory — Shared memory for direct access across processes. + (line 6) +* module; namespace: The standard type hierarchy. + (line 544) +* module; netrc: netrc — netrc file processing. + (line 6) +* module; nis: nis — Interface to Sun’s NIS Yellow Pages. + (line 6) +* module; nntplib: nntplib — NNTP protocol client. + (line 6) +* module; numbers: numbers — Numeric abstract base classes. + (line 6) +* module; operator: operator — Standard operators as functions. + (line 6) +* module; optparse: optparse — Parser for command line options. + (line 6) +* module; os: os — Miscellaneous operating system interfaces. + (line 6) +* module; os <1>: posix — The most common POSIX system calls. + (line 12) +* module; os.path: os path — Common pathname manipulations. + (line 6) +* module; ossaudiodev: ossaudiodev — Access to OSS-compatible audio devices. + (line 6) +* module; pathlib: pathlib — Object-oriented filesystem paths. + (line 6) +* module; pdb: pdb — The Python Debugger. + (line 6) +* module; pickle: copy — Shallow and deep copy operations. + (line 68) +* module; pickle <1>: pickle — Python object serialization. + (line 6) +* module; pickle <2>: copyreg — Register pickle support functions. + (line 8) +* module; pickle <3>: shelve — Python object persistence. + (line 8) +* module; pickle <4>: marshal — Internal Python object serialization. + (line 15) +* module; pickletools: pickletools — Tools for pickle developers. + (line 6) +* module; pipes: pipes — Interface to shell pipelines. + (line 6) +* module; pkgutil: pkgutil — Package extension utility. + (line 6) +* module; platform: platform — Access to underlying platform’s identifying data. + (line 6) +* module; plistlib: plistlib — Generate and parse Apple plist files. + (line 6) +* module; poplib: poplib — POP3 protocol client. + (line 6) +* module; posix: posix — The most common POSIX system calls. + (line 6) +* module; pprint: pprint — Data pretty printer. + (line 6) +* module; profile: profile and cProfile Module Reference. + (line 6) +* module; pstats: The Stats Class. (line 7) +* module; pty: File Descriptor Operations. + (line 393) +* module; pty <1>: pty — Pseudo-terminal utilities. + (line 6) +* module; pwd: os path — Common pathname manipulations. + (line 135) +* module; pwd <1>: pwd — The password database. + (line 6) +* module; pyclbr: pyclbr — Python module browser support. + (line 6) +* module; pydoc: pydoc — Documentation generator and online help system. + (line 6) +* module; pyexpat: xml parsers expat — Fast XML parsing using Expat. + (line 20) +* module; py_compile: py_compile — Compile Python source files. + (line 6) +* module; queue: queue — A synchronized queue class. + (line 6) +* module; quopri: quopri — Encode and decode MIME quoted-printable data. + (line 6) +* module; random: random — Generate pseudo-random numbers. + (line 6) +* module; re: String Methods<2>. (line 6) +* module; re <1>: re — Regular expression operations. + (line 6) +* module; re <2>: fnmatch — Unix filename pattern matching. + (line 8) +* module; readline: readline — GNU readline interface. + (line 6) +* module; reprlib: reprlib — Alternate repr implementation. + (line 6) +* module; resource: resource — Resource usage information. + (line 6) +* module; rlcompleter: rlcompleter — Completion function for GNU readline. + (line 6) +* module; runpy: runpy — Locating and executing Python modules. + (line 6) +* module; sched: sched — Event scheduler. + (line 6) +* module; search; path: The Module Search Path. + (line 6) +* module; search; path <1>: linecache — Random access to text lines. + (line 30) +* module; search; path <2>: sys — System-specific parameters and functions. + (line 1171) +* module; search; path <3>: site — Site-specific configuration hook. + (line 14) +* module; search; path <4>: Embedding Python<2>. + (line 12) +* module; search; path <5>: Initializing and finalizing the interpreter. + (line 7) +* module; search; path <6>: Process-wide parameters. + (line 158) +* module; search; path <7>: Process-wide parameters. + (line 178) +* module; secrets: secrets — Generate secure random numbers for managing secrets. + (line 6) +* module; select: select — Waiting for I/O completion. + (line 6) +* module; selectors: selectors — High-level I/O multiplexing. + (line 6) +* module; shelve: shelve — Python object persistence. + (line 6) +* module; shelve <1>: marshal — Internal Python object serialization. + (line 15) +* module; shlex: shlex — Simple lexical analysis. + (line 6) +* module; shutil: shutil — High-level file operations. + (line 6) +* module; signal: _thread — Low-level threading API. + (line 186) +* module; signal <1>: signal — Set handlers for asynchronous events. + (line 6) +* module; signal <2>: Signal Handling<2>. (line 7) +* module; signal <3>: Signal Handling<2>. (line 34) +* module; signal <4>: Signal Handling<2>. (line 43) +* module; site: site — Site-specific configuration hook. + (line 6) +* module; sitecustomize: site — Site-specific configuration hook. + (line 94) +* module; smtpd: smtpd — SMTP Server. + (line 6) +* module; smtplib: smtplib — SMTP protocol client. + (line 6) +* module; sndhdr: sndhdr — Determine type of sound file. + (line 6) +* module; socket: socket — Low-level networking interface. + (line 6) +* module; socket <1>: Internet Protocols and Support. + (line 6) +* module; socketserver: socketserver — A framework for network servers. + (line 6) +* module; spwd: spwd — The shadow password database. + (line 6) +* module; sqlite3: sqlite3 — DB-API 2 0 interface for SQLite databases. + (line 6) +* module; ssl: ssl — TLS/SSL wrapper for socket objects. + (line 6) +* module; stat: stat — Interpreting stat results. + (line 6) +* module; stat <1>: Files and Directories. + (line 1008) +* module; statistics: statistics — Mathematical statistics functions. + (line 6) +* module; string: string — Common string operations. + (line 6) +* module; string <1>: locale — Internationalization services. + (line 498) +* module; stringprep: stringprep — Internet String Preparation. + (line 6) +* module; struct: struct — Interpret bytes as packed binary data. + (line 6) +* module; struct <1>: Socket Objects. (line 562) +* module; subprocess: subprocess — Subprocess management. + (line 6) +* module; sunau: sunau — Read and write Sun AU files. + (line 6) +* module; symtable: symtable — Access to the compiler’s symbol tables. + (line 6) +* module; sys: Standard Modules. (line 6) +* module; sys <1>: except clause. (line 59) +* module; sys <2>: Complete Python programs. + (line 6) +* module; sys <3>: Built-in Functions. (line 1307) +* module; sys <4>: sys — System-specific parameters and functions. + (line 6) +* module; sys <5>: Embedding Python<2>. + (line 12) +* module; sys <6>: Initializing and finalizing the interpreter. + (line 7) +* module; sys <7>: Sub-interpreter support. + (line 25) +* module; sysconfig: sysconfig — Provide access to Python’s configuration information. + (line 6) +* module; syslog: syslog — Unix syslog library routines. + (line 6) +* module; tabnanny: tabnanny — Detection of ambiguous indentation. + (line 6) +* module; tarfile: tarfile — Read and write tar archive files. + (line 6) +* module; telnetlib: telnetlib — Telnet client. + (line 6) +* module; tempfile: tempfile — Generate temporary files and directories. + (line 6) +* module; termios: termios — POSIX style tty control. + (line 6) +* module; test: test — Regression tests package for Python. + (line 6) +* module; test.support: test support — Utilities for the Python test suite. + (line 6) +* module; test.support.bytecode_helper: test support bytecode_helper — Support tools for testing correct bytecode generation. + (line 6) +* module; test.support.import_helper: test support import_helper — Utilities for import tests. + (line 6) +* module; test.support.os_helper: test support os_helper — Utilities for os tests. + (line 6) +* module; test.support.script_helper: test support script_helper — Utilities for the Python execution tests. + (line 6) +* module; test.support.socket_helper: test support socket_helper — Utilities for socket tests. + (line 6) +* module; test.support.threading_helper: test support threading_helper — Utilities for threading tests. + (line 6) +* module; test.support.warnings_helper: test support warnings_helper — Utilities for warnings tests. + (line 6) +* module; textwrap: textwrap — Text wrapping and filling. + (line 6) +* module; threading: threading — Thread-based parallelism. + (line 6) +* module; time: time — Time access and conversions. + (line 6) +* module; timeit: timeit — Measure execution time of small code snippets. + (line 6) +* module; tkinter: tkinter — Python interface to Tcl/Tk. + (line 6) +* module; tkinter.colorchooser: tkinter colorchooser — Color choosing dialog. + (line 6) +* module; tkinter.commondialog: tkinter commondialog — Dialog window templates. + (line 6) +* module; tkinter.dnd: tkinter dnd — Drag and drop support. + (line 6) +* module; tkinter.filedialog: tkinter filedialog — File selection dialogs. + (line 6) +* module; tkinter.font: tkinter font — Tkinter font wrapper. + (line 6) +* module; tkinter.messagebox: tkinter messagebox — Tkinter message prompts. + (line 6) +* module; tkinter.scrolledtext: tkinter scrolledtext — Scrolled Text Widget. + (line 6) +* module; tkinter.simpledialog: tkinter simpledialog — Standard Tkinter input dialogs. + (line 6) +* module; tkinter.tix: tkinter tix — Extension widgets for Tk. + (line 6) +* module; tkinter.ttk: tkinter ttk — Tk themed widgets. + (line 6) +* module; token: token — Constants used with Python parse trees. + (line 6) +* module; tokenize: tokenize — Tokenizer for Python source. + (line 6) +* module; tomllib: tomllib — Parse TOML files. + (line 6) +* module; trace: trace — Trace or track Python statement execution. + (line 6) +* module; traceback: traceback — Print or retrieve a stack traceback. + (line 6) +* module; tracemalloc: tracemalloc — Trace memory allocations. + (line 6) +* module; tty: tty — Terminal control functions. + (line 6) +* module; turtle: turtle — Turtle graphics. + (line 6) +* module; turtledemo: turtledemo — Demo scripts. + (line 6) +* module; types: Type Objects. (line 6) +* module; types <1>: types — Dynamic type creation and names for built-in types. + (line 6) +* module; typing: typing — Support for type hints. + (line 6) +* module; unicodedata: unicodedata — Unicode Database. + (line 6) +* module; unittest: unittest — Unit testing framework. + (line 6) +* module; unittest.mock: unittest mock — mock object library. + (line 6) +* module; urllib: urllib — URL handling modules. + (line 6) +* module; urllib.error: urllib error — Exception classes raised by urllib request. + (line 6) +* module; urllib.parse: urllib parse — Parse URLs into components. + (line 6) +* module; urllib.request: urllib request — Extensible library for opening URLs. + (line 6) +* module; urllib.request <1>: http client — HTTP protocol client. + (line 8) +* module; urllib.response: urllib response — Response classes used by urllib. + (line 6) +* module; urllib.robotparser: urllib robotparser — Parser for robots txt. + (line 6) +* module; usercustomize: site — Site-specific configuration hook. + (line 105) +* module; uu: binascii — Convert between binary and ASCII. + (line 6) +* module; uu <1>: uu — Encode and decode uuencode files. + (line 6) +* module; uuid: uuid — UUID objects according to RFC 4122. + (line 8) +* module; venv: venv — Creation of virtual environments. + (line 6) +* module; warnings: warnings — Warning control. + (line 6) +* module; wave: wave — Read and write WAV files. + (line 6) +* module; weakref: weakref — Weak references. + (line 6) +* module; webbrowser: webbrowser — Convenient web-browser controller. + (line 6) +* module; winreg: winreg — Windows registry access. + (line 6) +* module; winsound: winsound — Sound-playing interface for Windows. + (line 6) +* module; wsgiref: wsgiref — WSGI Utilities and Reference Implementation. + (line 6) +* module; wsgiref.handlers: wsgiref handlers – server/gateway base classes. + (line 6) +* module; wsgiref.headers: wsgiref headers – WSGI response header tools. + (line 6) +* module; wsgiref.simple_server: wsgiref simple_server – a simple WSGI HTTP server. + (line 6) +* module; wsgiref.types: wsgiref types – WSGI types for static type checking. + (line 6) +* module; wsgiref.util: wsgiref util – WSGI environment utilities. + (line 6) +* module; wsgiref.validate: wsgiref validate — WSGI conformance checker. + (line 6) +* module; xdrlib: xdrlib — Encode and decode XDR data. + (line 6) +* module; xml: XML Processing Modules. + (line 6) +* module; xml.dom: xml dom — The Document Object Model API. + (line 6) +* module; xml.dom.minidom: xml dom minidom — Minimal DOM implementation. + (line 6) +* module; xml.dom.pulldom: xml dom pulldom — Support for building partial DOM trees. + (line 6) +* module; xml.etree.ElementTree: xml etree ElementTree — The ElementTree XML API. + (line 6) +* module; xml.parsers.expat: xml parsers expat — Fast XML parsing using Expat. + (line 6) +* module; xml.parsers.expat.errors: Expat error constants. + (line 6) +* module; xml.parsers.expat.model: Content Model Descriptions. + (line 6) +* module; xml.sax: xml sax — Support for SAX2 parsers. + (line 6) +* module; xml.sax.handler: xml sax handler — Base classes for SAX handlers. + (line 6) +* module; xml.sax.saxutils: xml sax saxutils — SAX Utilities. + (line 6) +* module; xml.sax.xmlreader: xml sax xmlreader — Interface for XML parsers. + (line 6) +* module; xmlrpc.client: xmlrpc client — XML-RPC client access. + (line 6) +* module; xmlrpc.server: xmlrpc server — Basic XML-RPC servers. + (line 6) +* module; zipapp: zipapp — Manage executable Python zip archives. + (line 6) +* module; zipfile: zipfile — Work with ZIP archives. + (line 6) +* module; zipimport: zipimport — Import modules from Zip archives. + (line 6) +* module; zlib: zlib — Compression compatible with gzip. + (line 6) +* module; zoneinfo: zoneinfo — IANA time zone support. + (line 6) +* module; _locale: locale — Internationalization services. + (line 16) +* module; _thread: _thread — Low-level threading API. + (line 6) +* module; _thread <1>: High-level API. (line 46) +* module; __future__: __future__ — Future statement definitions. + (line 6) +* module; __main__: Resolution of names. + (line 51) +* module; __main__ <1>: Complete Python programs. + (line 6) +* module; __main__ <2>: Complete Python programs. + (line 19) +* module; __main__ <3>: __main__ — Top-level code environment. + (line 6) +* module; __main__ <4>: runpy — Locating and executing Python modules. + (line 30) +* module; __main__ <5>: runpy — Locating and executing Python modules. + (line 98) +* module; __main__ <6>: Embedding Python<2>. + (line 12) +* module; __main__ <7>: Initializing and finalizing the interpreter. + (line 7) +* module; __main__ <8>: Sub-interpreter support. + (line 25) +* ModuleFinder (class in modulefinder): modulefinder — Find modules used by a script. + (line 26) +* ModuleInfo (class in pkgutil): pkgutil — Package extension utility. + (line 13) +* ModuleNotFoundError: Concrete exceptions. + (line 58) +* modules (in module sys): sys — System-specific parameters and functions. + (line 1148) +* modules (in module sys) <1>: Importing Modules<2>. + (line 9) +* modules (in module sys) <2>: Initializing and finalizing the interpreter. + (line 7) +* modules (modulefinder.ModuleFinder attribute): modulefinder — Find modules used by a script. + (line 49) +* ModuleSpec (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 372) +* modules_cleanup() (in module test.support.import_helper): test support import_helper — Utilities for import tests. + (line 71) +* modules_setup() (in module test.support.import_helper): test support import_helper — Utilities for import tests. + (line 67) +* ModuleType (class in types): Standard Interpreter Types. + (line 129) +* ModuleType (in module types): Module Objects. (line 7) +* module_for_loader() (in module importlib.util): importlib util – Utility code for importers. + (line 137) +* module_from_spec() (in module importlib.util): importlib util – Utility code for importers. + (line 121) +* module_repr() (importlib.abc.Loader method): importlib abc – Abstract base classes related to import. + (line 281) +* modulo: Binary arithmetic operations. + (line 41) +* MONDAY (in module calendar): calendar — General calendar-related functions. + (line 387) +* monotonic() (in module time): Functions<4>. (line 173) +* monotonic_ns() (in module time): Functions<4>. (line 191) +* month (datetime.date attribute): date Objects. (line 110) +* month (datetime.datetime attribute): datetime Objects. (line 276) +* month() (in module calendar): calendar — General calendar-related functions. + (line 336) +* monthcalendar() (in module calendar): calendar — General calendar-related functions. + (line 325) +* monthdatescalendar() (calendar.Calendar method): calendar — General calendar-related functions. + (line 89) +* monthdays2calendar() (calendar.Calendar method): calendar — General calendar-related functions. + (line 95) +* monthdayscalendar() (calendar.Calendar method): calendar — General calendar-related functions. + (line 101) +* monthrange() (in module calendar): calendar — General calendar-related functions. + (line 320) +* month_abbr (in module calendar): calendar — General calendar-related functions. + (line 380) +* month_name (in module calendar): calendar — General calendar-related functions. + (line 373) +* Morsel (class in http.cookies): Morsel Objects. (line 6) +* most_common() (collections.Counter method): Counter objects. + (line 77) +* mouseinterval() (in module curses): Functions<5>. (line 290) +* mousemask() (in module curses): Functions<5>. (line 297) +* move() (curses.panel.Panel method): Panel Objects. (line 35) +* move() (curses.window method): Window Objects. (line 396) +* move() (in module shutil): Directory and files operations. + (line 315) +* move() (mmap.mmap method): mmap — Memory-mapped file support. + (line 226) +* move() (tkinter.ttk.Treeview method): ttk Treeview. (line 221) +* move_file() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 495) +* move_file() (in module distutils.file_util): distutils file_util — Single file operations. + (line 34) +* move_to_end() (collections.OrderedDict method): OrderedDict objects. + (line 74) +* MozillaCookieJar (class in http.cookiejar): FileCookieJar subclasses and co-operation with web browsers. + (line 9) +* MRO: Glossary. (line 916) +* mro() (class method): Special Attributes. (line 40) +* msg (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 40) +* msg (json.JSONDecodeError attribute): Exceptions<14>. (line 11) +* msg (re.error attribute): Exceptions<3>. (line 15) +* msg (traceback.TracebackException attribute): TracebackException Objects. + (line 72) +* msg() (telnetlib.Telnet method): Telnet Objects. (line 77) +* msi: msilib — Read and write Microsoft Installer files. + (line 8) +* mtime (gzip.GzipFile attribute): gzip — Support for gzip files. + (line 142) +* mtime (tarfile.TarInfo attribute): TarInfo Objects. (line 51) +* mtime() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 39) +* mt_interact() (telnetlib.Telnet method): Telnet Objects. (line 116) +* mul() (in module audioop): audioop — Manipulate raw audio data. + (line 172) +* mul() (in module operator): operator — Standard operators as functions. + (line 120) +* Mult (class in ast): Expressions<2>. (line 54) +* MultiCall (class in xmlrpc.client): MultiCall Objects. (line 9) +* MULTILINE (in module re): Flags. (line 73) +* MultiLoopChildWatcher (class in asyncio): Process Watchers. + (line 100) +* multimode() (in module statistics): Function details. (line 273) +* MultipartConversionError: email errors Exception and Defect classes. + (line 42) +* multiplication: Binary arithmetic operations. + (line 16) +* multiply() (decimal.Context method): Context objects. (line 406) +* mutable: Glossary. (line 920) +* mutable object: Objects values and types. + (line 11) +* mutable sequence; loop over: Common Sequence Operations. + (line 75) +* mutable; sequence; types: Mutable Sequence Types. + (line 6) +* MutableMapping (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 83) +* MutableMapping (class in typing): Corresponding to collections in collections abc. + (line 81) +* MutableSequence (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 60) +* MutableSequence (class in typing): Corresponding to collections in collections abc. + (line 89) +* MutableSet (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 78) +* MutableSet (class in typing): Corresponding to collections in collections abc. + (line 97) +* mvderwin() (curses.window method): Window Objects. (line 400) +* mvwin() (curses.window method): Window Objects. (line 407) +* myrights() (imaplib.IMAP4 method): IMAP4 Objects. (line 157) +* name: Identifiers and keywords. + (line 6) +* name <1>: Binding of names. (line 6) +* name <2>: Identifiers Names. (line 6) +* Name (class in ast): Variables. (line 6) +* name (codecs.CodecInfo attribute): codecs — Codec registry and base classes. + (line 65) +* name (contextvars.ContextVar attribute): Context Variables. + (line 24) +* name (doctest.DocTest attribute): DocTest Objects. (line 30) +* name (email.headerregistry.BaseHeader attribute): email headerregistry Custom Header Objects. + (line 45) +* name (enum.Enum attribute): Data Types<2>. (line 79) +* name (hashlib.hash attribute): Hash algorithms. (line 113) +* name (hmac.HMAC attribute): hmac — Keyed-Hashing for Message Authentication. + (line 100) +* name (http.cookiejar.Cookie attribute): Cookie Objects<2>. (line 28) +* name (importlib.abc.FileLoader attribute): importlib abc – Abstract base classes related to import. + (line 422) +* name (importlib.machinery.ExtensionFileLoader attribute): importlib machinery – Importers and path hooks. + (line 314) +* name (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 388) +* name (importlib.machinery.SourceFileLoader attribute): importlib machinery – Importers and path hooks. + (line 227) +* name (importlib.machinery.SourcelessFileLoader attribute): importlib machinery – Importers and path hooks. + (line 271) +* name (importlib.resources.abc.Traversable attribute): importlib resources abc – Abstract base classes for resources. + (line 92) +* name (in module os): os — Miscellaneous operating system interfaces. + (line 55) +* NAME (in module token): token — Constants used with Python parse trees. + (line 42) +* name (in module webbrowser): Browser Controller Objects. + (line 9) +* name (inspect.Parameter attribute): Introspecting callables with the Signature object. + (line 178) +* name (io.FileIO attribute): Raw File I/O. (line 59) +* name (multiprocessing.Process attribute): Process and exceptions. + (line 82) +* name (multiprocessing.shared_memory.SharedMemory attribute): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 91) +* name (os.DirEntry attribute): Files and Directories. + (line 853) +* name (ossaudiodev.oss_audio_device attribute): Audio Device Objects. + (line 234) +* name (pyclbr.Class attribute): Class Objects<2>. (line 17) +* name (pyclbr.Function attribute): Function Objects. (line 17) +* name (tarfile.TarInfo attribute): TarInfo Objects. (line 43) +* name (threading.Thread attribute): Thread Objects. (line 152) +* name (xml.dom.Attr attribute): Attr Objects. (line 8) +* name (xml.dom.DocumentType attribute): DocumentType Objects. + (line 33) +* name (zipfile.Path attribute): Path Objects. (line 21) +* name() (in module unicodedata): unicodedata — Unicode Database. + (line 25) +* name2codepoint (in module html.entities): html entities — Definitions of HTML general entities. + (line 30) +* name; binding: The import statement. + (line 6) +* name; binding <1>: The import statement. + (line 51) +* name; binding <2>: Function definitions. + (line 6) +* name; binding <3>: Function definitions. + (line 6) +* name; binding <4>: Class definitions. (line 6) +* name; mangling: Private Variables. (line 13) +* name; mangling <1>: Identifiers Names. (line 12) +* named expression: Boolean operations. (line 37) +* Named Shared Memory: multiprocessing shared_memory — Shared memory for direct access across processes. + (line 10) +* named tuple: Glossary. (line 925) +* NamedExpr (class in ast): Expressions<2>. (line 185) +* NamedTemporaryFile() (in module tempfile): tempfile — Generate temporary files and directories. + (line 74) +* NamedTuple (class in typing): Other special directives. + (line 9) +* namedtuple() (in module collections): namedtuple Factory Function for Tuples with Named Fields. + (line 11) +* NAMED_FLAGS (enum.EnumCheck attribute): Data Types<2>. (line 511) +* NameError: Concrete exceptions. + (line 104) +* NameError (built-in exception): Resolution of names. + (line 16) +* namelist() (zipfile.ZipFile method): ZipFile Objects. (line 125) +* nameprep() (in module encodings.idna): encodings idna — Internationalized Domain Names in Applications. + (line 50) +* namer (logging.handlers.BaseRotatingHandler attribute): BaseRotatingHandler. + (line 17) +* namereplace; error handler’s name: Error Handlers. (line 54) +* namereplace_errors() (in module codecs): Error Handlers. (line 181) +* names() (in module tkinter.font): tkinter font — Tkinter font wrapper. + (line 92) +* namespace: Naming and binding. (line 6) +* namespace <1>: Glossary. (line 951) +* Namespace (class in argparse): The Namespace object. + (line 6) +* Namespace (class in multiprocessing.managers): Managers. (line 243) +* namespace package: Glossary. (line 965) +* namespace() (imaplib.IMAP4 method): IMAP4 Objects. (line 162) +* Namespace() (multiprocessing.managers.SyncManager method): Managers. + (line 193) +* NamespaceErr: Exceptions<17>. (line 66) +* namespaceURI (xml.dom.Node attribute): Node Objects. (line 74) +* NAMESPACE_DNS (in module uuid): uuid — UUID objects according to RFC 4122. + (line 205) +* NAMESPACE_OID (in module uuid): uuid — UUID objects according to RFC 4122. + (line 214) +* NAMESPACE_URL (in module uuid): uuid — UUID objects according to RFC 4122. + (line 210) +* NAMESPACE_X500 (in module uuid): uuid — UUID objects according to RFC 4122. + (line 218) +* nametofont() (in module tkinter.font): tkinter font — Tkinter font wrapper. + (line 96) +* NaN: Built-in Functions. (line 630) +* nan (in module cmath): Constants<3>. (line 33) +* nan (in module math): Constants<2>. (line 31) +* nanj (in module cmath): Constants<3>. (line 40) +* NannyNag: tabnanny — Detection of ambiguous indentation. + (line 37) +* napms() (in module curses): Functions<5>. (line 306) +* nargs (optparse.Option attribute): Option attributes. (line 42) +* native_id (threading.Thread attribute): Thread Objects. (line 174) +* nbytes (memoryview attribute): Memory Views. (line 376) +* ncurses_version (in module curses): Constants<6>. (line 23) +* ndiff() (in module difflib): difflib — Helpers for computing deltas. + (line 231) +* ndim (memoryview attribute): Memory Views. (line 442) +* ne (2to3 fixer): Fixers. (line 201) +* ne() (in module operator): operator — Standard operators as functions. + (line 24) +* needs_input (bz2.BZ2Decompressor attribute): Incremental de compression. + (line 85) +* needs_input (lzma.LZMADecompressor attribute): Compressing and decompressing data in memory. + (line 175) +* neg() (in module operator): operator — Standard operators as functions. + (line 132) +* negation: Unary arithmetic and bitwise operations. + (line 10) +* nested scope: Glossary. (line 974) +* netmask (ipaddress.IPv4Network attribute): Network objects. + (line 101) +* netmask (ipaddress.IPv6Network attribute): Network objects. + (line 315) +* NetmaskValueError: Custom Exceptions. (line 13) +* netrc (class in netrc): netrc — netrc file processing. + (line 13) +* NetrcParseError: netrc — netrc file processing. + (line 44) +* netscape (http.cookiejar.CookiePolicy attribute): CookiePolicy Objects. + (line 68) +* network (ipaddress.IPv4Interface attribute): Interface objects. + (line 28) +* network (ipaddress.IPv6Interface attribute): Interface objects. + (line 76) +* Network News Transfer Protocol: nntplib — NNTP protocol client. + (line 8) +* network_address (ipaddress.IPv4Network attribute): Network objects. + (line 86) +* network_address (ipaddress.IPv6Network attribute): Network objects. + (line 309) +* Never (in module typing): Special types. (line 51) +* NEVER_EQ (in module test.support): test support — Utilities for the Python test suite. + (line 173) +* new() (in module hashlib): Hash algorithms. (line 63) +* new() (in module hmac): hmac — Keyed-Hashing for Message Authentication. + (line 12) +* new-style class: Glossary. (line 984) +* newer() (in module distutils.dep_util): distutils dep_util — Dependency checking. + (line 10) +* newer_group() (in module distutils.dep_util): distutils dep_util — Dependency checking. + (line 24) +* newer_pairwise() (in module distutils.dep_util): distutils dep_util — Dependency checking. + (line 17) +* newfunc (C type): Slot Type typedefs. (line 31) +* newgroups() (nntplib.NNTP method): Methods<3>. (line 80) +* NEWLINE (in module token): token — Constants used with Python parse trees. + (line 48) +* NEWLINE token: Logical lines. (line 6) +* NEWLINE token <1>: Compound statements. + (line 55) +* newlines (io.TextIOBase attribute): Text I/O<2>. (line 23) +* newnews() (nntplib.NNTP method): Methods<3>. (line 95) +* newpad() (in module curses): Functions<5>. (line 310) +* NewType (class in typing): Other special directives. + (line 78) +* newwin() (in module curses): Functions<5>. (line 330) +* new_child() (collections.ChainMap method): ChainMap objects. + (line 46) +* new_class() (in module types): Dynamic Type Creation. + (line 6) +* new_compiler() (in module distutils.ccompiler): distutils ccompiler — CCompiler base class. + (line 48) +* new_event_loop() (asyncio.AbstractEventLoopPolicy method): Policy Objects. + (line 27) +* new_event_loop() (in module asyncio): Event Loop. (line 65) +* new_module() (in module imp): imp — Access the import internals. + (line 124) +* new_panel() (in module curses.panel): Functions<6>. (line 12) +* next (2to3 fixer): Fixers. (line 205) +* next (pdb command): Debugger Commands. (line 173) +* next() (nntplib.NNTP method): Methods<3>. (line 233) +* next() (tarfile.TarFile method): TarFile Objects. (line 130) +* next() (tkinter.ttk.Treeview method): ttk Treeview. (line 232) +* nextafter() (in module math): Number-theoretic and representation functions. + (line 194) +* nextfile() (in module fileinput): fileinput — Iterate over lines from multiple input streams. + (line 121) +* nextkey() (dbm.gnu.gdbm method): dbm gnu — GNU’s reinterpretation of dbm. + (line 96) +* nextSibling (xml.dom.Node attribute): Node Objects. (line 42) +* next_minus() (decimal.Context method): Context objects. (line 410) +* next_minus() (decimal.Decimal method): Decimal objects. (line 399) +* next_plus() (decimal.Context method): Context objects. (line 414) +* next_plus() (decimal.Decimal method): Decimal objects. (line 405) +* next_toward() (decimal.Context method): Context objects. (line 418) +* next_toward() (decimal.Decimal method): Decimal objects. (line 411) +* ngettext() (gettext.GNUTranslations method): The GNUTranslations class. + (line 47) +* ngettext() (gettext.NullTranslations method): The NullTranslations class. + (line 41) +* ngettext() (in module gettext): GNU gettext API. (line 44) +* nice() (in module os): Process Management. (line 322) +* NL (in module token): token — Constants used with Python parse trees. + (line 267) +* nl() (in module curses): Functions<5>. (line 340) +* nlargest() (in module heapq): heapq — Heap queue algorithm. + (line 106) +* nlst() (ftplib.FTP method): FTP Objects. (line 179) +* nl_langinfo() (in module locale): locale — Internationalization services. + (line 172) +* NNTP (class in nntplib): nntplib — NNTP protocol client. + (line 62) +* NNTP; protocol: nntplib — NNTP protocol client. + (line 8) +* NNTPDataError: nntplib — NNTP protocol client. + (line 169) +* NNTPError: nntplib — NNTP protocol client. + (line 138) +* NNTPPermanentError: nntplib — NNTP protocol client. + (line 159) +* NNTPProtocolError: nntplib — NNTP protocol client. + (line 164) +* NNTPReplyError: nntplib — NNTP protocol client. + (line 149) +* NNTPTemporaryError: nntplib — NNTP protocol client. + (line 154) +* nntp_implementation (nntplib.NNTP attribute): Attributes. (line 14) +* NNTP_SSL (class in nntplib): nntplib — NNTP protocol client. + (line 105) +* nntp_version (nntplib.NNTP attribute): Attributes. (line 6) +* nocbreak() (in module curses): Functions<5>. (line 346) +* NoDataAllowedErr: Exceptions<17>. (line 83) +* node() (in module platform): Cross Platform. (line 40) +* nodelay() (curses.window method): Window Objects. (line 411) +* nodeName (xml.dom.Node attribute): Node Objects. (line 79) +* NodeTransformer (class in ast): ast Helpers. (line 197) +* nodeType (xml.dom.Node attribute): Node Objects. (line 8) +* nodeValue (xml.dom.Node attribute): Node Objects. (line 88) +* NodeVisitor (class in ast): ast Helpers. (line 162) +* noecho() (in module curses): Functions<5>. (line 351) +* NOEXPR (in module locale): locale — Internationalization services. + (line 251) +* NOFLAG (in module re): Flags. (line 85) +* NoModificationAllowedErr: Exceptions<17>. (line 88) +* nonblock() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 75) +* NonCallableMagicMock (class in unittest.mock): Magic Mock. (line 21) +* NonCallableMock (class in unittest.mock): The Mock Class. (line 559) +* None (Built-in object): Truth Value Testing. + (line 15) +* None (built-in variable): Built-in Constants. (line 18) +* NoneType (in module types): Standard Interpreter Types. + (line 19) +* nonl() (in module curses): Functions<5>. (line 355) +* Nonlocal (class in ast): Function and class definitions. + (line 151) +* nonmember() (in module enum): Utilities and Decorators. + (line 69) +* nonzero (2to3 fixer): Fixers. (line 211) +* noop() (imaplib.IMAP4 method): IMAP4 Objects. (line 166) +* noop() (poplib.POP3 method): POP3 Objects. (line 78) +* NoOptionError: Exceptions<7>. (line 32) +* NOP (opcode): Python Bytecode Instructions. + (line 78) +* noqiflush() (in module curses): Functions<5>. (line 365) +* noraw() (in module curses): Functions<5>. (line 373) +* NoReturn (in module typing): Special types. (line 77) +* NORMAL (in module tkinter.font): tkinter font — Tkinter font wrapper. + (line 15) +* NormalDist (class in statistics): NormalDist objects. (line 13) +* normalize() (decimal.Context method): Context objects. (line 422) +* normalize() (decimal.Decimal method): Decimal objects. (line 419) +* normalize() (in module locale): locale — Internationalization services. + (line 384) +* normalize() (in module unicodedata): unicodedata — Unicode Database. + (line 81) +* normalize() (xml.dom.Node method): Node Objects. (line 141) +* NORMALIZE_WHITESPACE (in module doctest): Option Flags. (line 39) +* normalvariate() (in module random): Real-valued distributions. + (line 81) +* NORMAL_PRIORITY_CLASS (in module subprocess): Windows Constants. + (line 80) +* normcase() (in module os.path): os path — Common pathname manipulations. + (line 271) +* normpath() (in module os.path): os path — Common pathname manipulations. + (line 280) +* NoSectionError: Exceptions<7>. (line 10) +* NoSuchMailboxError: Exceptions<15>. (line 13) +* Not (class in ast): Expressions<2>. (line 28) +* NotADirectoryError: OS exceptions. (line 89) +* notation: Notation. (line 6) +* notationDecl() (xml.sax.handler.DTDHandler method): DTDHandler Objects. + (line 8) +* NotationDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 272) +* notations (xml.dom.DocumentType attribute): DocumentType Objects. + (line 46) +* NotConnected: http client — HTTP protocol client. + (line 143) +* NoteBook (class in tkinter.tix): Manager Widgets. (line 22) +* Notebook (class in tkinter.ttk): ttk Notebook. (line 6) +* NotEmptyError: Exceptions<15>. (line 20) +* NotEq (class in ast): Expressions<2>. (line 109) +* NOTEQUAL (in module token): token — Constants used with Python parse trees. + (line 138) +* NotFoundErr: Exceptions<17>. (line 72) +* notify() (asyncio.Condition method): Condition. (line 54) +* notify() (threading.Condition method): Condition Objects. (line 152) +* notify_all() (asyncio.Condition method): Condition. (line 67) +* notify_all() (threading.Condition method): Condition Objects. + (line 172) +* notimeout() (curses.window method): Window Objects. (line 415) +* NotImplemented (built-in variable): Built-in Constants. (line 25) +* NotImplementedError: Concrete exceptions. + (line 116) +* NotImplementedType (in module types): Standard Interpreter Types. + (line 109) +* NotIn (class in ast): Expressions<2>. (line 109) +* NotRequired (in module typing): Special forms. (line 304) +* NotStandaloneHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 323) +* NotSupportedErr: Exceptions<17>. (line 78) +* NotSupportedError: Exceptions<6>. (line 85) +* not_() (in module operator): operator — Standard operators as functions. + (line 49) +* noutrefresh() (curses.window method): Window Objects. (line 423) +* now() (datetime.datetime class method): datetime Objects. (line 60) +* no_cache() (zoneinfo.ZoneInfo class method): The ZoneInfo class. + (line 41) +* no_proxy: urllib request — Extensible library for opening URLs. + (line 306) +* no_tracing() (in module test.support): test support — Utilities for the Python test suite. + (line 505) +* no_type_check() (in module typing): Functions and decorators. + (line 310) +* no_type_check_decorator() (in module typing): Functions and decorators. + (line 321) +* npgettext() (gettext.GNUTranslations method): The GNUTranslations class. + (line 79) +* npgettext() (gettext.NullTranslations method): The NullTranslations class. + (line 55) +* npgettext() (in module gettext): GNU gettext API. (line 67) +* NSIG (in module signal): Module contents<2>. (line 203) +* nsmallest() (in module heapq): heapq — Heap queue algorithm. + (line 114) +* NTEventLogHandler (class in logging.handlers): NTEventLogHandler. + (line 11) +* ntohl() (in module socket): Other functions<2>. (line 197) +* ntohs() (in module socket): Other functions<2>. (line 204) +* ntransfercmd() (ftplib.FTP method): FTP Objects. (line 157) +* NT_OFFSET (in module token): token — Constants used with Python parse trees. + (line 258) +* null; operation: The pass statement. (line 6) +* null; operation <1>: The pass statement. (line 6) +* nullcontext() (in module contextlib): Utilities. (line 212) +* NullHandler (class in logging): NullHandler. (line 12) +* NullImporter (class in imp): imp — Access the import internals. + (line 345) +* NullTranslations (class in gettext): The NullTranslations class. + (line 13) +* number: Numeric literals. (line 6) +* Number (class in numbers): numbers — Numeric abstract base classes. + (line 15) +* NUMBER (in module token): token — Constants used with Python parse trees. + (line 44) +* number_class() (decimal.Context method): Context objects. (line 426) +* number_class() (decimal.Decimal method): Decimal objects. (line 428) +* numerator (fractions.Fraction attribute): fractions — Rational numbers. + (line 103) +* numerator (numbers.Rational attribute): The numeric tower. (line 51) +* numeric literal: Numeric literals. (line 6) +* numeric() (in module unicodedata): unicodedata — Unicode Database. + (line 43) +* numeric; conversions: Numeric Types — int float complex. + (line 104) +* numeric; literals: Numeric Types — int float complex. + (line 19) +* numinput() (in module turtle): Input methods. (line 22) +* numliterals (2to3 fixer): Fixers. (line 216) +* num_addresses (ipaddress.IPv4Network attribute): Network objects. + (line 128) +* num_addresses (ipaddress.IPv6Network attribute): Network objects. + (line 327) +* num_tickets (ssl.SSLContext attribute): SSL Contexts. (line 551) +* N_TOKENS (in module token): token — Constants used with Python parse trees. + (line 256) +* n_waiting (asyncio.Barrier attribute): Barrier. (line 98) +* n_waiting (threading.Barrier attribute): Barrier Objects. (line 97) +* obj (memoryview attribute): Memory Views. (line 365) +* object: Objects values and types. + (line 6) +* object <1>: Glossary. (line 992) +* object (built-in class): Built-in Functions. (line 1080) +* object (UnicodeError attribute): Concrete exceptions. + (line 413) +* object.__match_args__ (built-in variable): Customizing positional arguments in class pattern matching. + (line 12) +* object.__slots__ (built-in variable): __slots__<2>. (line 14) +* object; asynchronous-generator: Asynchronous generator functions. + (line 66) +* object; Boolean: The standard type hierarchy. + (line 98) +* object; Boolean <1>: Numeric Types — int float complex. + (line 6) +* object; built-in function: The standard type hierarchy. + (line 493) +* object; built-in function <1>: Calls. (line 141) +* object; built-in method: The standard type hierarchy. + (line 506) +* object; built-in method <1>: Calls. (line 141) +* object; bytearray: Mutable Sequence Types. + (line 6) +* object; bytearray <1>: Binary Sequence Types — bytes bytearray memoryview. + (line 6) +* object; bytearray <2>: Bytearray Objects. (line 6) +* object; bytearray <3>: Byte Array Objects. (line 6) +* object; bytes: Binary Sequence Types — bytes bytearray memoryview. + (line 6) +* object; bytes <1>: Bytes Objects. (line 6) +* object; bytes <2>: Bytes Objects<2>. (line 9) +* object; callable: The standard type hierarchy. + (line 297) +* object; callable <1>: Slicings. (line 38) +* object; Capsule: Capsules<2>. (line 6) +* object; class: The standard type hierarchy. + (line 598) +* object; class <1>: Calls. (line 146) +* object; class <2>: Class definitions. (line 6) +* object; class instance: The standard type hierarchy. + (line 598) +* object; class instance <1>: The standard type hierarchy. + (line 645) +* object; class instance <2>: Calls. (line 150) +* object; code: The standard type hierarchy. + (line 694) +* object; code <1>: Methods. (line 43) +* object; code <2>: marshal — Internal Python object serialization. + (line 30) +* object; code <3>: Cell Objects. (line 55) +* object; complex: The standard type hierarchy. + (line 124) +* object; complex number: Numeric Types — int float complex. + (line 6) +* object; complex number <1>: Complex Number Objects. + (line 6) +* object; deallocation: Finalization and De-allocation. + (line 6) +* object; dictionary: The standard type hierarchy. + (line 265) +* object; dictionary <1>: The standard type hierarchy. + (line 598) +* object; dictionary <2>: Basic customization. + (line 222) +* object; dictionary <3>: Dictionary displays. + (line 6) +* object; dictionary <4>: Subscriptions. (line 6) +* object; dictionary <5>: Assignment statements. + (line 115) +* object; dictionary <6>: Mapping Types — dict. + (line 6) +* object; dictionary <7>: Dictionary Objects. (line 6) +* object; Ellipsis: The standard type hierarchy. + (line 46) +* object; file: Reading and Writing Files. + (line 6) +* object; file <1>: File Objects. (line 6) +* object; finalization: Finalization and De-allocation. + (line 6) +* object; floating point: The standard type hierarchy. + (line 112) +* object; floating point <1>: Numeric Types — int float complex. + (line 6) +* object; floating point <2>: Floating Point Objects. + (line 6) +* object; frame: The standard type hierarchy. + (line 796) +* object; frozenset: The standard type hierarchy. + (line 247) +* object; frozenset <1>: Set Objects. (line 6) +* object; function: The standard type hierarchy. + (line 302) +* object; function <1>: The standard type hierarchy. + (line 493) +* object; function <2>: Calls. (line 132) +* object; function <3>: Calls. (line 141) +* object; function <4>: Function definitions. + (line 6) +* object; function <5>: Function Objects<3>. + (line 6) +* object; generator: The standard type hierarchy. + (line 733) +* object; generator <1>: Generator expressions. + (line 6) +* object; generator <2>: Yield expressions. (line 109) +* object; GenericAlias: Generic Alias Type. (line 6) +* object; immutable: The standard type hierarchy. + (line 151) +* object; immutable sequence: The standard type hierarchy. + (line 151) +* object; instance: The standard type hierarchy. + (line 598) +* object; instance <1>: The standard type hierarchy. + (line 645) +* object; instance <2>: Calls. (line 150) +* object; instancemethod: Instance Method Objects. + (line 6) +* object; integer: The standard type hierarchy. + (line 82) +* object; integer <1>: Numeric Types — int float complex. + (line 6) +* object; integer <2>: Integer Objects. (line 6) +* object; io.StringIO: Text Sequence Type — str. + (line 35) +* object; list: The standard type hierarchy. + (line 205) +* object; list <1>: List displays. (line 6) +* object; list <2>: Attribute references. + (line 10) +* object; list <3>: Subscriptions. (line 6) +* object; list <4>: Slicings. (line 6) +* object; list <5>: Assignment statements. + (line 106) +* object; list <6>: Mutable Sequence Types. + (line 6) +* object; list <7>: Lists<2>. (line 6) +* object; list <8>: List Objects. (line 6) +* object; long integer: Integer Objects. (line 6) +* object; mapping: The standard type hierarchy. + (line 254) +* object; mapping <1>: The standard type hierarchy. + (line 666) +* object; mapping <2>: Subscriptions. (line 6) +* object; mapping <3>: Assignment statements. + (line 115) +* object; mapping <4>: Mapping Types — dict. + (line 6) +* object; mapping <5>: Container Objects. (line 6) +* object; memoryview: Binary Sequence Types — bytes bytearray memoryview. + (line 6) +* object; memoryview <1>: Ellipsis Object. (line 11) +* object; method: Instance Objects. (line 31) +* object; method <1>: The standard type hierarchy. + (line 396) +* object; method <2>: The standard type hierarchy. + (line 506) +* object; method <3>: Calls. (line 141) +* object; method <4>: Methods. (line 6) +* object; method <5>: Method Objects<2>. (line 6) +* object; module: The standard type hierarchy. + (line 529) +* object; module <1>: Attribute references. + (line 10) +* object; module <2>: Module Objects. (line 6) +* object; mutable: The standard type hierarchy. + (line 197) +* object; mutable <1>: Assignment statements. + (line 6) +* object; mutable <2>: Assignment statements. + (line 101) +* object; mutable sequence: The standard type hierarchy. + (line 197) +* object; None: The standard type hierarchy. + (line 20) +* object; None <1>: Expression statements. + (line 17) +* object; None <2>: The None Object. (line 6) +* object; NotImplemented: The standard type hierarchy. + (line 28) +* object; numeric: The standard type hierarchy. + (line 52) +* object; numeric <1>: The standard type hierarchy. + (line 666) +* object; numeric <2>: Comparisons<2>. (line 43) +* object; numeric <3>: Numeric Types — int float complex. + (line 6) +* object; numeric <4>: Numeric Objects. (line 6) +* object; range: Ranges. (line 6) +* object; sequence: The standard type hierarchy. + (line 132) +* object; sequence <1>: The standard type hierarchy. + (line 666) +* object; sequence <2>: Subscriptions. (line 6) +* object; sequence <3>: Slicings. (line 6) +* object; sequence <4>: Membership test operations. + (line 36) +* object; sequence <5>: Assignment statements. + (line 106) +* object; sequence <6>: The for statement. (line 6) +* object; sequence <7>: Common Sequence Operations. + (line 6) +* object; sequence <8>: Sequence Objects. (line 6) +* object; set: The standard type hierarchy. + (line 241) +* object; set <1>: Set displays. (line 6) +* object; set <2>: Set Types — set frozenset. + (line 6) +* object; set <3>: Set Objects. (line 6) +* object; set type: The standard type hierarchy. + (line 224) +* object; slice: Emulating container types. + (line 65) +* object; socket: socket — Low-level networking interface. + (line 22) +* object; string: Subscriptions. (line 6) +* object; string <1>: Slicings. (line 6) +* object; string <2>: Ranges. (line 125) +* object; traceback: The standard type hierarchy. + (line 847) +* object; traceback <1>: The raise statement. + (line 21) +* object; traceback <2>: except clause. (line 59) +* object; traceback <3>: sys — System-specific parameters and functions. + (line 425) +* object; traceback <4>: traceback — Print or retrieve a stack traceback. + (line 16) +* object; tuple: The standard type hierarchy. + (line 177) +* object; tuple <1>: Subscriptions. (line 6) +* object; tuple <2>: Slicings. (line 6) +* object; tuple <3>: Expression lists. (line 11) +* object; tuple <4>: Immutable Sequence Types. + (line 6) +* object; tuple <5>: Tuples. (line 6) +* object; tuple <6>: Tuple Objects. (line 6) +* object; type: Built-in Functions. (line 1797) +* object; type <1>: Objects Types and Reference Counts. + (line 6) +* object; type <2>: Type Objects<2>. (line 6) +* object; Union: Union Type. (line 6) +* object; user-defined function: The standard type hierarchy. + (line 302) +* object; user-defined function <1>: Calls. (line 132) +* object; user-defined function <2>: Function definitions. + (line 6) +* object; user-defined method: The standard type hierarchy. + (line 396) +* objects; comparing: Comparisons<2>. (line 43) +* object_filenames() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 466) +* objobjargproc (C type): Slot Type typedefs. (line 135) +* objobjproc (C type): Slot Type typedefs. (line 131) +* obufcount() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 218) +* obuffree() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 223) +* octal literal: Numeric literals. (line 6) +* octal; literals: Numeric Types — int float complex. + (line 19) +* octdigits (in module string): String constants. (line 32) +* offset (SyntaxError attribute): Concrete exceptions. + (line 290) +* offset (traceback.TracebackException attribute): TracebackException Objects. + (line 67) +* offset (xml.parsers.expat.ExpatError attribute): ExpatError Exceptions. + (line 32) +* OK (in module curses): Constants<6>. (line 13) +* ok_command() (tkinter.filedialog.LoadFileDialog method): Native Load/Save Dialogs. + (line 140) +* ok_command() (tkinter.filedialog.SaveFileDialog method): Native Load/Save Dialogs. + (line 150) +* ok_event() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 119) +* old_value (contextvars.Token attribute): Context Variables. + (line 87) +* OleDLL (class in ctypes): Loading shared libraries. + (line 32) +* onclick() (in module turtle): Using screen events. + (line 56) +* ondrag() (in module turtle): Using events. (line 57) +* onecmd() (cmd.Cmd method): Cmd Objects. (line 57) +* onkey() (in module turtle): Using screen events. + (line 12) +* onkeypress() (in module turtle): Using screen events. + (line 35) +* onkeyrelease() (in module turtle): Using screen events. + (line 12) +* onrelease() (in module turtle): Using events. (line 30) +* onscreenclick() (in module turtle): Using screen events. + (line 56) +* ontimer() (in module turtle): Using screen events. + (line 86) +* on_motion() (tkinter.dnd.DndHandler method): tkinter dnd — Drag and drop support. + (line 56) +* on_release() (tkinter.dnd.DndHandler method): tkinter dnd — Drag and drop support. + (line 61) +* OP (in module token): token — Constants used with Python parse trees. + (line 242) +* Open (class in tkinter.filedialog): Native Load/Save Dialogs. + (line 60) +* open() (distutils.text_file.TextFile method): distutils text_file — The TextFile class. + (line 91) +* open() (imaplib.IMAP4 method): IMAP4 Objects. (line 170) +* open() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 117) +* open() (in module aifc): aifc — Read and write AIFF and AIFC files. + (line 33) +* open() (in module bz2): De compression of files. + (line 6) +* open() (in module codecs): codecs — Codec registry and base classes. + (line 173) +* open() (in module dbm): dbm — Interfaces to Unix “databases”. + (line 38) +* open() (in module dbm.dumb): dbm dumb — Portable DBM implementation. + (line 30) +* open() (in module dbm.gnu): dbm gnu — GNU’s reinterpretation of dbm. + (line 27) +* open() (in module dbm.ndbm): dbm ndbm — Interface based on ndbm. + (line 31) +* open() (in module gzip): gzip — Support for gzip files. + (line 28) +* open() (in module io): High-level Module Interface. + (line 12) +* open() (in module lzma): Reading and writing compressed files. + (line 6) +* open() (in module os): File Descriptor Operations. + (line 286) +* open() (in module ossaudiodev): ossaudiodev — Access to OSS-compatible audio devices. + (line 46) +* open() (in module shelve): shelve — Python object persistence. + (line 17) +* open() (in module sunau): sunau — Read and write Sun AU files. + (line 51) +* open() (in module tarfile): tarfile — Read and write tar archive files. + (line 35) +* open() (in module tokenize): Tokenizing Input. (line 100) +* open() (in module wave): wave — Read and write WAV files. + (line 18) +* open() (in module webbrowser): webbrowser — Convenient web-browser controller. + (line 55) +* open() (pathlib.Path method): Methods<2>. (line 267) +* open() (pipes.Template method): Template Objects. (line 42) +* open() (tarfile.TarFile class method): TarFile Objects. (line 96) +* open() (telnetlib.Telnet method): Telnet Objects. (line 64) +* open() (urllib.request.OpenerDirector method): OpenerDirector Objects. + (line 46) +* open() (urllib.request.URLopener method): Legacy interface. + (line 98) +* open() (webbrowser.controller method): Browser Controller Objects. + (line 13) +* open() (zipfile.Path method): Path Objects. (line 25) +* open() (zipfile.ZipFile method): ZipFile Objects. (line 129) +* OpenDatabase() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 47) +* OpenerDirector (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 269) +* OpenKey() (in module winreg): Functions<12>. (line 286) +* OpenKeyEx() (in module winreg): Functions<12>. (line 286) +* openlog() (in module syslog): syslog — Unix syslog library routines. + (line 47) +* openmixer() (in module ossaudiodev): ossaudiodev — Access to OSS-compatible audio devices. + (line 74) +* openpty() (in module os): File Descriptor Operations. + (line 391) +* openpty() (in module pty): pty — Pseudo-terminal utilities. + (line 29) +* OpenSSL; (use in module hashlib): Hash algorithms. (line 21) +* OpenSSL; (use in module ssl): ssl — TLS/SSL wrapper for socket objects. + (line 8) +* OPENSSL_VERSION (in module ssl): Constants<9>. (line 466) +* OPENSSL_VERSION_INFO (in module ssl): Constants<9>. (line 476) +* OPENSSL_VERSION_NUMBER (in module ssl): Constants<9>. (line 486) +* OpenView() (msilib.Database method): Database Objects. (line 6) +* open_binary() (in module importlib.resources): Deprecated functions. + (line 19) +* open_code() (in module io): High-level Module Interface. + (line 22) +* open_connection() (in module asyncio): Streams. (line 42) +* open_new() (in module webbrowser): webbrowser — Convenient web-browser controller. + (line 72) +* open_new() (webbrowser.controller method): Browser Controller Objects. + (line 19) +* open_new_tab() (in module webbrowser): webbrowser — Convenient web-browser controller. + (line 77) +* open_new_tab() (webbrowser.controller method): Browser Controller Objects. + (line 25) +* open_osfhandle() (in module msvcrt): File Operations. (line 44) +* open_resource() (importlib.resources.abc.ResourceReader method): importlib resources abc – Abstract base classes for resources. + (line 46) +* open_text() (in module importlib.resources): Deprecated functions. + (line 35) +* open_unix_connection() (in module asyncio): Streams. (line 109) +* open_unknown() (urllib.request.URLopener method): Legacy interface. + (line 109) +* open_urlresource() (in module test.support): test support — Utilities for the Python test suite. + (line 547) +* OperationalError: Exceptions<6>. (line 57) +* operations on; dictionary; type: Mapping Types — dict. + (line 6) +* operations on; integer; types: Bitwise Operations on Integer Types. + (line 6) +* operations on; list; type: Mutable Sequence Types. + (line 16) +* operations on; mapping; types: Mapping Types — dict. + (line 6) +* operations on; numeric; types: Numeric Types — int float complex. + (line 94) +* operations on; sequence; types: Common Sequence Operations. + (line 21) +* operations on; sequence; types <1>: Mutable Sequence Types. + (line 16) +* operator (2to3 fixer): Fixers. (line 220) +* operator; !=: Comparisons. (line 6) +* operator; != <1>: Comparisons<2>. (line 6) +* operator; % (percent): Binary arithmetic operations. + (line 41) +* operator; % (percent) <1>: Numeric Types — int float complex. + (line 27) +* operator; & (ampersand): Binary bitwise operations. + (line 12) +* operator; & (ampersand) <1>: Bitwise Operations on Integer Types. + (line 6) +* operator; * (asterisk): Binary arithmetic operations. + (line 16) +* operator; * (asterisk) <1>: Numeric Types — int float complex. + (line 27) +* operator; **: The power operator. (line 6) +* operator; ** <1>: Numeric Types — int float complex. + (line 27) +* operator; + (plus): Unary arithmetic and bitwise operations. + (line 14) +* operator; + (plus) <1>: Binary arithmetic operations. + (line 69) +* operator; + (plus) <2>: Numeric Types — int float complex. + (line 27) +* operator; - (minus): Unary arithmetic and bitwise operations. + (line 10) +* operator; - (minus) <1>: Binary arithmetic operations. + (line 78) +* operator; - (minus) <2>: Numeric Types — int float complex. + (line 27) +* operator; / (slash): Binary arithmetic operations. + (line 31) +* operator; / (slash) <1>: Numeric Types — int float complex. + (line 27) +* operator; //: Binary arithmetic operations. + (line 31) +* operator; // <1>: Numeric Types — int float complex. + (line 27) +* operator; < (less): Comparisons. (line 6) +* operator; < (less) <1>: Comparisons<2>. (line 6) +* operator; <<: Shifting operations. + (line 6) +* operator; << <1>: Bitwise Operations on Integer Types. + (line 6) +* operator; <=: Comparisons. (line 6) +* operator; <= <1>: Comparisons<2>. (line 6) +* operator; ==: Comparisons. (line 6) +* operator; == <1>: Comparisons<2>. (line 6) +* operator; > (greater): Comparisons. (line 6) +* operator; > (greater) <1>: Comparisons<2>. (line 6) +* operator; >=: Comparisons. (line 6) +* operator; >= <1>: Comparisons<2>. (line 6) +* operator; >>: Shifting operations. + (line 6) +* operator; >> <1>: Bitwise Operations on Integer Types. + (line 6) +* operator; @ (at): Binary arithmetic operations. + (line 26) +* operator; and: Boolean operations. (line 21) +* operator; and <1>: Truth Value Testing. + (line 23) +* operator; and <2>: Boolean Operations — and or not. + (line 22) +* operator; comparison: Comparisons<2>. (line 6) +* operator; in: Membership test operations. + (line 36) +* operator; in <1>: Comparisons<2>. (line 64) +* operator; in <2>: Common Sequence Operations. + (line 21) +* operator; is: Membership test operations. + (line 39) +* operator; is <1>: Comparisons<2>. (line 6) +* operator; is not: Membership test operations. + (line 39) +* operator; is not <1>: Comparisons<2>. (line 6) +* operator; not: Boolean operations. (line 18) +* operator; not <1>: Boolean Operations — and or not. + (line 22) +* operator; not in: Membership test operations. + (line 36) +* operator; not in <1>: Comparisons<2>. (line 64) +* operator; not in <2>: Common Sequence Operations. + (line 21) +* operator; or: Boolean operations. (line 25) +* operator; or <1>: Truth Value Testing. + (line 23) +* operator; or <2>: Boolean Operations — and or not. + (line 22) +* operator; overloading: Special method names. + (line 6) +* operator; precedence: Operator precedence. + (line 6) +* operator; ^ (caret): Binary bitwise operations. + (line 16) +* operator; ^ (caret) <1>: Bitwise Operations on Integer Types. + (line 6) +* operator; | (vertical bar): Binary bitwise operations. + (line 20) +* operator; | (vertical bar) <1>: Bitwise Operations on Integer Types. + (line 6) +* operator; ~ (tilde): Unary arithmetic and bitwise operations. + (line 17) +* operator; ~ (tilde) <1>: Bitwise Operations on Integer Types. + (line 6) +* operators: Operators. (line 6) +* opmap (in module dis): Opcode collections. (line 13) +* opname (in module dis): Opcode collections. (line 9) +* OPT: Debug options. (line 34) +* optimize() (in module pickletools): Programmatic Interface<2>. + (line 31) +* OPTIMIZED_BYTECODE_SUFFIXES (in module importlib.machinery): importlib machinery – Importers and path hooks. + (line 30) +* optim_args_from_interpreter_flags() (in module test.support): test support — Utilities for the Python test suite. + (line 300) +* Optional (in module typing): Special forms. (line 62) +* OptionGroup (class in optparse): Grouping Options. (line 12) +* OptionMenu (class in tkinter.tix): Basic Widgets. (line 49) +* OptionParser (class in optparse): Creating the parser. + (line 9) +* Options (class in ssl): Constants<9>. (line 357) +* options (doctest.Example attribute): Example Objects. (line 53) +* options (ssl.SSLContext attribute): SSL Contexts. (line 559) +* options() (configparser.ConfigParser method): ConfigParser Objects. + (line 102) +* optionxform() (configparser.ConfigParser method): ConfigParser Objects. + (line 284) +* OP_ALL (in module ssl): Constants<9>. (line 228) +* OP_CIPHER_SERVER_PREFERENCE (in module ssl): Constants<9>. (line 317) +* OP_ENABLE_MIDDLEBOX_COMPAT (in module ssl): Constants<9>. (line 341) +* OP_IGNORE_UNEXPECTED_EOF (in module ssl): Constants<9>. (line 367) +* OP_NO_COMPRESSION (in module ssl): Constants<9>. (line 350) +* OP_NO_RENEGOTIATION (in module ssl): Constants<9>. (line 307) +* OP_NO_SSLv2 (in module ssl): Constants<9>. (line 236) +* OP_NO_SSLv3 (in module ssl): Constants<9>. (line 246) +* OP_NO_TICKET (in module ssl): Constants<9>. (line 361) +* OP_NO_TLSv1 (in module ssl): Constants<9>. (line 256) +* OP_NO_TLSv1_1 (in module ssl): Constants<9>. (line 268) +* OP_NO_TLSv1_2 (in module ssl): Constants<9>. (line 280) +* OP_NO_TLSv1_3 (in module ssl): Constants<9>. (line 292) +* OP_SINGLE_DH_USE (in module ssl): Constants<9>. (line 325) +* OP_SINGLE_ECDH_USE (in module ssl): Constants<9>. (line 333) +* Or (class in ast): Expressions<2>. (line 87) +* OrderedDict (class in collections): OrderedDict objects. + (line 60) +* OrderedDict (class in typing): Corresponding to types in collections. + (line 17) +* ordered_attributes (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 107) +* origin (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 402) +* origin_req_host (urllib.request.Request attribute): Request Objects. + (line 30) +* origin_server (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 291) +* orig_argv (in module sys): sys — System-specific parameters and functions. + (line 1160) +* or_() (in module operator): operator — Standard operators as functions. + (line 137) +* OSError: Concrete exceptions. + (line 134) +* OSSAudioError: ossaudiodev — Access to OSS-compatible audio devices. + (line 33) +* os_environ (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 168) +* output: Expression statements. + (line 17) +* output (subprocess.CalledProcessError attribute): Using the subprocess Module. + (line 207) +* output (subprocess.TimeoutExpired attribute): Using the subprocess Module. + (line 168) +* output (unittest.TestCase attribute): Test cases. (line 438) +* output() (http.cookies.BaseCookie method): Cookie Objects. (line 24) +* output() (http.cookies.Morsel method): Morsel Objects. (line 72) +* OutputChecker (class in doctest): OutputChecker objects. + (line 6) +* OutputString() (http.cookies.Morsel method): Morsel Objects. + (line 87) +* output_charset (email.charset.Charset attribute): email charset Representing character sets. + (line 74) +* output_codec (email.charset.Charset attribute): email charset Representing character sets. + (line 88) +* output_difference() (doctest.OutputChecker method): OutputChecker objects. + (line 27) +* over() (nntplib.NNTP method): Methods<3>. (line 167) +* Overflow (class in decimal): Signals. (line 67) +* OverflowError: Concrete exceptions. + (line 199) +* OverflowError (built-in exception): Integer Objects. (line 105) +* OverflowError (built-in exception) <1>: Integer Objects. (line 143) +* OverflowError (built-in exception) <2>: Integer Objects. (line 184) +* OverflowError (built-in exception) <3>: Integer Objects. (line 196) +* OverflowError (built-in exception) <4>: Integer Objects. (line 208) +* OverflowError (built-in exception) <5>: Integer Objects. (line 221) +* overlap() (statistics.NormalDist method): NormalDist objects. + (line 96) +* overlaps() (ipaddress.IPv4Network method): Network objects. + (line 155) +* overlaps() (ipaddress.IPv6Network method): Network objects. + (line 340) +* overlay() (curses.window method): Window Objects. (line 430) +* overload() (in module typing): Functions and decorators. + (line 223) +* overwrite() (curses.window method): Window Objects. (line 443) +* owner() (pathlib.Path method): Methods<2>. (line 279) +* O_APPEND (in module os): File Descriptor Operations. + (line 331) +* O_ASYNC (in module os): File Descriptor Operations. + (line 374) +* O_BINARY (in module os): File Descriptor Operations. + (line 353) +* O_CLOEXEC (in module os): File Descriptor Operations. + (line 341) +* O_CREAT (in module os): File Descriptor Operations. + (line 331) +* O_DIRECT (in module os): File Descriptor Operations. + (line 374) +* O_DIRECTORY (in module os): File Descriptor Operations. + (line 374) +* O_DSYNC (in module os): File Descriptor Operations. + (line 341) +* O_EVTONLY (in module os): File Descriptor Operations. + (line 363) +* O_EXCL (in module os): File Descriptor Operations. + (line 331) +* O_EXLOCK (in module os): File Descriptor Operations. + (line 374) +* O_FSYNC (in module os): File Descriptor Operations. + (line 363) +* O_NDELAY (in module os): File Descriptor Operations. + (line 341) +* O_NOATIME (in module os): File Descriptor Operations. + (line 374) +* O_NOCTTY (in module os): File Descriptor Operations. + (line 341) +* O_NOFOLLOW (in module os): File Descriptor Operations. + (line 374) +* O_NOFOLLOW_ANY (in module os): File Descriptor Operations. + (line 363) +* O_NOINHERIT (in module os): File Descriptor Operations. + (line 353) +* O_NONBLOCK (in module os): File Descriptor Operations. + (line 341) +* O_PATH (in module os): File Descriptor Operations. + (line 374) +* O_RANDOM (in module os): File Descriptor Operations. + (line 353) +* O_RDONLY (in module os): File Descriptor Operations. + (line 331) +* O_RDWR (in module os): File Descriptor Operations. + (line 331) +* O_RSYNC (in module os): File Descriptor Operations. + (line 341) +* O_SEQUENTIAL (in module os): File Descriptor Operations. + (line 353) +* O_SHLOCK (in module os): File Descriptor Operations. + (line 374) +* O_SHORT_LIVED (in module os): File Descriptor Operations. + (line 353) +* O_SYMLINK (in module os): File Descriptor Operations. + (line 363) +* O_SYNC (in module os): File Descriptor Operations. + (line 341) +* O_TEMPORARY (in module os): File Descriptor Operations. + (line 353) +* O_TEXT (in module os): File Descriptor Operations. + (line 353) +* O_TMPFILE (in module os): File Descriptor Operations. + (line 374) +* O_TRUNC (in module os): File Descriptor Operations. + (line 331) +* O_WRONLY (in module os): File Descriptor Operations. + (line 331) +* p (pdb command): Debugger Commands. (line 238) +* pack() (in module struct): Functions and Exceptions. + (line 13) +* pack() (mailbox.MH method): MH. (line 64) +* pack() (struct.Struct method): Classes<2>. (line 25) +* package: Packages<2>. (line 6) +* package <1>: site — Site-specific configuration hook. + (line 64) +* package <2>: Glossary. (line 998) +* Package (in module importlib.resources): importlib resources – Resources. + (line 36) +* package variable; __all__: Importing Modules<2>. + (line 9) +* package; namespace: Namespace packages. (line 6) +* package; portion: Namespace packages. (line 6) +* package; regular: Regular packages. (line 6) +* packed (ipaddress.IPv4Address attribute): Address objects. (line 77) +* packed (ipaddress.IPv6Address attribute): Address objects. (line 208) +* Packer (class in xdrlib): xdrlib — Encode and decode XDR data. + (line 21) +* packing (widgets): The Packer. (line 6) +* packing; binary; data: struct — Interpret bytes as packed binary data. + (line 8) +* pack_array() (xdrlib.Packer method): Packer Objects. (line 86) +* pack_bytes() (xdrlib.Packer method): Packer Objects. (line 54) +* pack_double() (xdrlib.Packer method): Packer Objects. (line 26) +* pack_farray() (xdrlib.Packer method): Packer Objects. (line 78) +* pack_float() (xdrlib.Packer method): Packer Objects. (line 22) +* pack_fopaque() (xdrlib.Packer method): Packer Objects. (line 38) +* pack_fstring() (xdrlib.Packer method): Packer Objects. (line 32) +* pack_into() (in module struct): Functions and Exceptions. + (line 19) +* pack_into() (struct.Struct method): Classes<2>. (line 30) +* pack_list() (xdrlib.Packer method): Packer Objects. (line 61) +* pack_opaque() (xdrlib.Packer method): Packer Objects. (line 49) +* pack_string() (xdrlib.Packer method): Packer Objects. (line 43) +* PAGER: pydoc — Documentation generator and online help system. + (line 47) +* pairwise() (in module itertools): Itertool functions. (line 400) +* pair_content() (in module curses): Functions<5>. (line 378) +* pair_number() (in module curses): Functions<5>. (line 384) +* PanedWindow (class in tkinter.tix): Manager Widgets. (line 6) +* parameter: Glossary. (line 1007) +* Parameter (class in inspect): Introspecting callables with the Signature object. + (line 163) +* parameter; call semantics: Calls. (line 25) +* parameter; difference from argument: How can I pass optional or keyword parameters from one function to another?. + (line 16) +* parameter; function definition: Class Patterns. (line 141) +* ParameterizedMIMEHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 255) +* parameters (inspect.Signature attribute): Introspecting callables with the Signature object. + (line 95) +* params (email.headerregistry.ParameterizedMIMEHeader attribute): email headerregistry Custom Header Objects. + (line 263) +* ParamSpec (class in typing): Building generic types. + (line 235) +* ParamSpecArgs (in module typing): Building generic types. + (line 324) +* ParamSpecKwargs (in module typing): Building generic types. + (line 326) +* paramstyle (in module sqlite3): Module constants. (line 58) +* pardir (in module os): Miscellaneous System Information. + (line 89) +* paren (2to3 fixer): Fixers. (line 252) +* parent (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 438) +* parent (pyclbr.Class attribute): Class Objects<2>. (line 25) +* parent (pyclbr.Function attribute): Function Objects. (line 25) +* parent (urllib.request.BaseHandler attribute): BaseHandler Objects. + (line 25) +* parent() (tkinter.ttk.Treeview method): ttk Treeview. (line 237) +* parenthesized form: Parenthesized forms. + (line 6) +* parentNode (xml.dom.Node attribute): Node Objects. (line 17) +* parents (collections.ChainMap attribute): ChainMap objects. + (line 62) +* parent_process() (in module multiprocessing): Miscellaneous<3>. + (line 36) +* paretovariate() (in module random): Real-valued distributions. + (line 97) +* parse() (doctest.DocTestParser method): DocTestParser objects. + (line 29) +* parse() (email.parser.BytesParser method): Parser API. (line 34) +* parse() (email.parser.Parser method): Parser API. (line 86) +* parse() (in module ast): ast Helpers. (line 9) +* parse() (in module cgi): Functions<13>. (line 9) +* parse() (in module xml.dom.minidom): xml dom minidom — Minimal DOM implementation. + (line 37) +* parse() (in module xml.dom.pulldom): xml dom pulldom — Support for building partial DOM trees. + (line 86) +* parse() (in module xml.etree.ElementTree): Functions<8>. (line 172) +* parse() (in module xml.sax): xml sax — Support for SAX2 parsers. + (line 39) +* parse() (string.Formatter method): Custom String Formatting. + (line 40) +* parse() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 29) +* parse() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 54) +* Parse() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 8) +* parse() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 8) +* parseaddr() (in module email.utils): email utils Miscellaneous utilities. + (line 59) +* parsebytes() (email.parser.BytesParser method): Parser API. + (line 54) +* parsedate() (in module email.utils): email utils Miscellaneous utilities. + (line 96) +* parsedate_to_datetime() (in module email.utils): email utils Miscellaneous utilities. + (line 119) +* parsedate_tz() (in module email.utils): email utils Miscellaneous utilities. + (line 108) +* ParseError (class in xml.etree.ElementTree): Exceptions<16>. + (line 6) +* ParseFile() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 16) +* ParseFlags() (in module imaplib): imaplib — IMAP4 protocol client. + (line 133) +* parser: Lexical analysis. (line 6) +* Parser (class in email.parser): Parser API. (line 75) +* ParserCreate() (in module xml.parsers.expat): xml parsers expat — Fast XML parsing using Expat. + (line 46) +* ParseResult (class in urllib.parse): Structured Parse Results. + (line 48) +* ParseResultBytes (class in urllib.parse): Structured Parse Results. + (line 73) +* parsestr() (email.parser.Parser method): Parser API. (line 96) +* parseString() (in module xml.dom.minidom): xml dom minidom — Minimal DOM implementation. + (line 50) +* parseString() (in module xml.dom.pulldom): xml dom pulldom — Support for building partial DOM trees. + (line 99) +* parseString() (in module xml.sax): xml sax — Support for SAX2 parsers. + (line 50) +* parse_and_bind() (in module readline): Init file. (line 8) +* parse_args() (argparse.ArgumentParser method): The parse_args method. + (line 6) +* PARSE_COLNAMES (in module sqlite3): Module constants. (line 6) +* parse_config_h() (in module sysconfig): Other functions<3>. + (line 57) +* PARSE_DECLTYPES (in module sqlite3): Module constants. (line 19) +* parse_header() (in module cgi): Functions<13>. (line 53) +* parse_headers() (in module http.client): http client — HTTP protocol client. + (line 118) +* parse_intermixed_args() (argparse.ArgumentParser method): Intermixed parsing. + (line 6) +* parse_known_args() (argparse.ArgumentParser method): Partial parsing. + (line 6) +* parse_known_intermixed_args() (argparse.ArgumentParser method): Intermixed parsing. + (line 9) +* parse_multipart() (in module cgi): Functions<13>. (line 24) +* parse_qs() (in module urllib.parse): URL Parsing. (line 149) +* parse_qsl() (in module urllib.parse): URL Parsing. (line 195) +* ParsingError: Exceptions<7>. (line 65) +* partial (asyncio.IncompleteReadError attribute): Exceptions<10>. + (line 55) +* partial() (imaplib.IMAP4 method): IMAP4 Objects. (line 188) +* partial() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 295) +* partialmethod (class in functools): functools — Higher-order functions and operations on callable objects. + (line 326) +* parties (asyncio.Barrier attribute): Barrier. (line 94) +* parties (threading.Barrier attribute): Barrier Objects. (line 93) +* partition() (bytearray method): Bytes and Bytearray Operations. + (line 180) +* partition() (bytes method): Bytes and Bytearray Operations. + (line 180) +* partition() (str method): String Methods<2>. (line 356) +* Pass (class in ast): Statements. (line 159) +* pass_() (poplib.POP3 method): POP3 Objects. (line 36) +* Paste: Help menu Shell and Editor. + (line 30) +* patch() (in module test.support): test support — Utilities for the Python test suite. + (line 618) +* patch() (in module unittest.mock): patch. (line 9) +* patch.dict() (in module unittest.mock): patch dict. (line 6) +* patch.multiple() (in module unittest.mock): patch multiple. + (line 6) +* patch.object() (in module unittest.mock): patch object. (line 6) +* patch.stopall() (in module unittest.mock): patch methods start and stop. + (line 70) +* PATH: Changes in the Python API<3>. + (line 144) +* PATH <1>: Changes in ‘python’ Command Behavior<2>. + (line 6) +* PATH <2>: Changes in ‘python’ Command Behavior<2>. + (line 11) +* PATH <3>: Changes in ‘python’ Command Behavior<2>. + (line 12) +* PATH <4>: Windows<3>. (line 15) +* PATH <5>: Windows<10>. (line 14) +* PATH <6>: Security<20>. (line 16) +* PATH <7>: Security<20>. (line 20) +* PATH <8>: The Module Search Path. + (line 17) +* PATH <9>: Executable Python Scripts. + (line 11) +* PATH <10>: Environment variables. + (line 27) +* PATH <11>: Miscellaneous. (line 16) +* PATH <12>: Installation steps. (line 33) +* PATH <13>: Installation steps. (line 57) +* PATH <14>: Installing Without UI. + (line 58) +* PATH <15>: Installing Without UI. + (line 62) +* PATH <16>: Excursus Setting environment variables. + (line 23) +* PATH <17>: Excursus Setting environment variables. + (line 35) +* PATH <18>: Finding the Python executable. + (line 14) +* PATH <19>: Finding the Python executable. + (line 21) +* PATH <20>: Finding the Python executable. + (line 22) +* PATH <21>: Python Launcher for Windows. + (line 13) +* PATH <22>: From the command-line. + (line 9) +* PATH <23>: From the command-line. + (line 38) +* PATH <24>: Shebang Lines. (line 53) +* PATH <25>: Shebang Lines. (line 55) +* PATH <26>: Process Management. (line 45) +* PATH <27>: Process Management. (line 86) +* PATH <28>: Process Management. (line 89) +* PATH <29>: Process Management. (line 92) +* PATH <30>: Process Management. (line 485) +* PATH <31>: Process Management. (line 571) +* PATH <32>: Process Management. (line 575) +* PATH <33>: Process Management. (line 577) +* PATH <34>: Miscellaneous System Information. + (line 120) +* PATH <35>: Popen Constructor. (line 34) +* PATH <36>: webbrowser — Convenient web-browser controller. + (line 222) +* PATH <37>: site — Site-specific configuration hook. + (line 59) +* PATH <38>: Installing your CGI script on a Unix system. + (line 29) +* PATH <39>: Common problems and solutions. + (line 23) +* PATH <40>: Embedding Python<2>. + (line 31) +* PATH <41>: Embedding Python<2>. + (line 37) +* PATH <42>: How do I make a Python script executable on Unix?. + (line 24) +* PATH <43>: How do I make a Python script executable on Unix?. + (line 28) +* Path (class in pathlib): Concrete paths. (line 11) +* Path (class in zipfile): Path Objects. (line 6) +* path (http.cookiejar.Cookie attribute): Cookie Objects<2>. (line 41) +* path (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 97) +* path (importlib.abc.FileLoader attribute): importlib abc – Abstract base classes related to import. + (line 426) +* path (importlib.machinery.ExtensionFileLoader attribute): importlib machinery – Importers and path hooks. + (line 318) +* path (importlib.machinery.FileFinder attribute): importlib machinery – Importers and path hooks. + (line 186) +* path (importlib.machinery.SourceFileLoader attribute): importlib machinery – Importers and path hooks. + (line 231) +* path (importlib.machinery.SourcelessFileLoader attribute): importlib machinery – Importers and path hooks. + (line 275) +* path (in module sys): sys — System-specific parameters and functions. + (line 1169) +* path (in module sys) <1>: Embedding Python<2>. + (line 12) +* path (in module sys) <2>: Initializing and finalizing the interpreter. + (line 7) +* path (in module sys) <3>: Process-wide parameters. + (line 158) +* path (in module sys) <4>: Process-wide parameters. + (line 178) +* path (os.DirEntry attribute): Files and Directories. + (line 863) +* path based finder: The Path Based Finder. + (line 6) +* path based finder <1>: Glossary. (line 1079) +* Path browser: File menu Shell and Editor. + (line 22) +* path entry: Glossary. (line 1059) +* path entry finder: Glossary. (line 1064) +* path entry hook: Glossary. (line 1073) +* path hooks: Import hooks. (line 6) +* path() (in module importlib.resources): Deprecated functions. + (line 91) +* path-like object: Glossary. (line 1084) +* Path.stem (in module zipfile): Path Objects. (line 60) +* Path.suffix (in module zipfile): Path Objects. (line 54) +* Path.suffixes (in module zipfile): Path Objects. (line 66) +* path; configuration; file: site — Site-specific configuration hook. + (line 64) +* path; operations: pathlib — Object-oriented filesystem paths. + (line 10) +* path; operations <1>: os path — Common pathname manipulations. + (line 9) +* pathconf() (in module os): Files and Directories. + (line 553) +* pathconf_names (in module os): Files and Directories. + (line 577) +* PathEntryFinder (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 100) +* PATHEXT: Other Improvements<2>. + (line 30) +* PATHEXT <1>: Library<21>. (line 138) +* PATHEXT <2>: Installing Without UI. + (line 58) +* PATHEXT <3>: Installing Without UI. + (line 62) +* PathFinder (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 107) +* PathLike (class in os): Process Parameters. (line 115) +* pathname2url() (in module urllib.request): urllib request — Extensible library for opening URLs. + (line 150) +* pathsep (in module os): Miscellaneous System Information. + (line 117) +* path_hook() (importlib.machinery.FileFinder class method): importlib machinery – Importers and path hooks. + (line 209) +* path_hooks (in module sys): sys — System-specific parameters and functions. + (line 1202) +* path_importer_cache (in module sys): sys — System-specific parameters and functions. + (line 1211) +* path_mtime() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 492) +* path_return_ok() (http.cookiejar.CookiePolicy method): CookiePolicy Objects. + (line 56) +* path_stats() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 470) +* path_stats() (importlib.machinery.SourceFileLoader method): importlib machinery – Importers and path hooks. + (line 240) +* Pattern (class in typing): Other concrete types. + (line 18) +* pattern (re.error attribute): Exceptions<3>. (line 19) +* pattern (re.Pattern attribute): Regular Expression Objects. + (line 118) +* pattern matching: The match statement. + (line 6) +* pause() (in module signal): Module contents<2>. (line 305) +* pause_reading() (asyncio.ReadTransport method): Read-only Transports. + (line 12) +* pause_writing() (asyncio.BaseProtocol method): Base Protocol. + (line 40) +* PAX_FORMAT (in module tarfile): tarfile — Read and write tar archive files. + (line 237) +* pax_headers (tarfile.TarFile attribute): TarFile Objects. (line 255) +* pax_headers (tarfile.TarInfo attribute): TarInfo Objects. (line 88) +* pbkdf2_hmac() (in module hashlib): Key derivation. (line 11) +* pd() (in module turtle): Drawing state. (line 6) +* Pdb (class in pdb): pdb — The Python Debugger. + (line 17) +* Pdb (class in pdb) <1>: pdb — The Python Debugger. + (line 146) +* pdf() (statistics.NormalDist method): NormalDist objects. (line 68) +* peek() (bz2.BZ2File method): De compression of files. + (line 73) +* peek() (gzip.GzipFile method): gzip — Support for gzip files. + (line 127) +* peek() (io.BufferedReader method): Buffered Streams. (line 75) +* peek() (lzma.LZMAFile method): Reading and writing compressed files. + (line 85) +* peek() (weakref.finalize method): weakref — Weak references. + (line 275) +* peer (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 95) +* PEM_cert_to_DER_cert() (in module ssl): Certificate handling. + (line 99) +* pen() (in module turtle): Drawing state. (line 33) +* pencolor() (in module turtle): Color control. (line 6) +* pending (ssl.MemoryBIO attribute): Memory BIO Support<2>. + (line 139) +* pending() (ssl.SSLSocket method): SSL Sockets. (line 320) +* PendingDeprecationWarning: Warnings. (line 28) +* pendown() (in module turtle): Drawing state. (line 6) +* pensize() (in module turtle): Drawing state. (line 18) +* penup() (in module turtle): Drawing state. (line 12) +* PEP: Glossary. (line 1096) +* PERCENT (in module token): token — Constants used with Python parse trees. + (line 122) +* PERCENTEQUAL (in module token): token — Constants used with Python parse trees. + (line 186) +* Performance: timeit — Measure execution time of small code snippets. + (line 8) +* perf_counter() (in module time): Functions<4>. (line 197) +* perf_counter_ns() (in module time): Functions<4>. (line 214) +* perm() (in module math): Number-theoretic and representation functions. + (line 217) +* PermissionError: OS exceptions. (line 97) +* permutations() (in module itertools): Itertool functions. (line 419) +* Persist() (msilib.SummaryInformation method): Summary Information Objects. + (line 29) +* persistence: pickle — Python object serialization. + (line 8) +* persistent; objects: pickle — Python object serialization. + (line 8) +* persistent_id (pickle protocol): Persistence of External Objects. + (line 6) +* persistent_id() (pickle.Pickler method): Module Interface. (line 160) +* persistent_load (pickle protocol): Persistence of External Objects. + (line 6) +* persistent_load() (pickle.Unpickler method): Module Interface. + (line 274) +* pformat() (in module pprint): pprint — Data pretty printer. + (line 106) +* pformat() (pprint.PrettyPrinter method): PrettyPrinter Objects. + (line 8) +* PF_CAN (in module socket): Constants<8>. (line 100) +* PF_PACKET (in module socket): Constants<8>. (line 173) +* PF_RDS (in module socket): Constants<8>. (line 183) +* pgettext() (gettext.GNUTranslations method): The GNUTranslations class. + (line 68) +* pgettext() (gettext.NullTranslations method): The NullTranslations class. + (line 47) +* pgettext() (in module gettext): GNU gettext API. (line 63) +* PGO (in module test.support): test support — Utilities for the Python test suite. + (line 107) +* phase() (in module cmath): Conversions to and from polar coordinates. + (line 22) +* Philbrick, Geoff: Keyword Parameters for Extension Functions. + (line 25) +* physical line: Logical lines. (line 6) +* physical line <1>: Explicit line joining. + (line 6) +* physical line <2>: String and Bytes literals. + (line 72) +* pi (in module cmath): Constants<3>. (line 6) +* pi (in module math): Constants<2>. (line 6) +* pi() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 56) +* pickle() (in module copyreg): copyreg — Register pickle support functions. + (line 23) +* PickleBuffer (class in pickle): Module Interface. (line 301) +* PickleError: Module Interface. (line 95) +* Pickler (class in pickle): Module Interface. (line 121) +* pickletools command line option; -a: Command line options<3>. + (line 6) +* pickletools command line option; –annotate: Command line options<3>. + (line 6) +* pickletools command line option; –indentlevel: Command line options<3>. + (line 14) +* pickletools command line option; -l: Command line options<3>. + (line 14) +* pickletools command line option; -m: Command line options<3>. + (line 18) +* pickletools command line option; –memo: Command line options<3>. + (line 18) +* pickletools command line option; -o: Command line options<3>. + (line 10) +* pickletools command line option; –output: Command line options<3>. + (line 10) +* pickletools command line option; -p: Command line options<3>. + (line 23) +* pickletools command line option; –preamble: Command line options<3>. + (line 23) +* pickling; objects: pickle — Python object serialization. + (line 8) +* PicklingError: Module Interface. (line 100) +* pid (asyncio.subprocess.Process attribute): Interacting with Subprocesses. + (line 132) +* pid (multiprocessing.Process attribute): Process and exceptions. + (line 121) +* pid (subprocess.Popen attribute): Popen Objects. (line 140) +* PidfdChildWatcher (class in asyncio): Process Watchers. (line 144) +* pidfd_open() (in module os): Process Management. (line 329) +* pidfd_send_signal() (in module signal): Module contents<2>. + (line 322) +* PIPE (in module subprocess): Using the subprocess Module. + (line 136) +* Pipe() (in module multiprocessing): Pipes and Queues. (line 74) +* pipe() (in module os): File Descriptor Operations. + (line 403) +* pipe2() (in module os): File Descriptor Operations. + (line 414) +* PIPE_BUF (in module select): select — Waiting for I/O completion. + (line 162) +* pipe_connection_lost() (asyncio.SubprocessProtocol method): Subprocess Protocols. + (line 19) +* pipe_data_received() (asyncio.SubprocessProtocol method): Subprocess Protocols. + (line 10) +* PIPE_MAX_SIZE (in module test.support): test support — Utilities for the Python test suite. + (line 111) +* PIP_USER: Windows<27>. (line 102) +* PKG_DIRECTORY (in module imp): imp — Access the import internals. + (line 327) +* placeholder (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 277) +* PLAT: distutils util — Miscellaneous other utility functions. + (line 99) +* platform (in module sys): sys — System-specific parameters and functions. + (line 1224) +* platform (in module sys) <1>: Process-wide parameters. + (line 226) +* platform() (in module platform): Cross Platform. (line 45) +* platlibdir (in module sys): sys — System-specific parameters and functions. + (line 1292) +* PlaySound() (in module winsound): winsound — Sound-playing interface for Windows. + (line 20) +* plist; file: plistlib — Generate and parse Apple plist files. + (line 8) +* plock() (in module os): Process Management. (line 342) +* plus: Unary arithmetic and bitwise operations. + (line 14) +* PLUS (in module token): token — Constants used with Python parse trees. + (line 82) +* plus() (decimal.Context method): Context objects. (line 430) +* PLUSEQUAL (in module token): token — Constants used with Python parse trees. + (line 170) +* pm() (in module pdb): pdb — The Python Debugger. + (line 136) +* POINTER() (in module ctypes): Utility functions. (line 149) +* pointer() (in module ctypes): Utility functions. (line 155) +* polar() (in module cmath): Conversions to and from polar coordinates. + (line 42) +* Policy (class in email.policy): email policy Policy Objects. + (line 128) +* poll() (in module select): select — Waiting for I/O completion. + (line 89) +* poll() (multiprocessing.connection.Connection method): Connection Objects. + (line 42) +* poll() (select.devpoll method): /dev/poll Polling Objects. + (line 65) +* poll() (select.epoll method): Edge and Level Trigger Polling epoll Objects. + (line 96) +* poll() (select.poll method): Polling Objects. (line 77) +* poll() (subprocess.Popen method): Popen Objects. (line 8) +* PollSelector (class in selectors): Classes<3>. (line 171) +* Pool (class in multiprocessing.pool): Process Pools. (line 9) +* pop() (array.array method): array — Efficient arrays of numeric values. + (line 201) +* pop() (collections.deque method): deque objects. (line 87) +* pop() (dict method): Mapping Types — dict. + (line 173) +* pop() (frozenset method): Set Types — set frozenset. + (line 208) +* pop() (mailbox.Mailbox method): Mailbox objects. (line 208) +* pop() (sequence method): Mutable Sequence Types. + (line 16) +* POP3 (class in poplib): poplib — POP3 protocol client. + (line 34) +* POP3; protocol: poplib — POP3 protocol client. + (line 8) +* POP3_SSL (class in poplib): poplib — POP3 protocol client. + (line 54) +* Popen (class in subprocess): Popen Constructor. (line 11) +* popen() (in module os): The standard type hierarchy. + (line 675) +* popen() (in module os) <1>: Process Management. (line 349) +* popen() (in module os) <2>: select — Waiting for I/O completion. + (line 143) +* popitem() (collections.OrderedDict method): OrderedDict objects. + (line 67) +* popitem() (dict method): Mapping Types — dict. + (line 179) +* popitem() (mailbox.Mailbox method): Mailbox objects. (line 217) +* popleft() (collections.deque method): deque objects. (line 92) +* PopupMenu (class in tkinter.tix): Basic Widgets. (line 53) +* pop_all() (contextlib.ExitStack method): Utilities. (line 576) +* POP_EXCEPT (opcode): Python Bytecode Instructions. + (line 294) +* POP_JUMP_BACKWARD_IF_FALSE (opcode): Python Bytecode Instructions. + (line 620) +* POP_JUMP_BACKWARD_IF_NONE (opcode): Python Bytecode Instructions. + (line 648) +* POP_JUMP_BACKWARD_IF_NOT_NONE (opcode): Python Bytecode Instructions. + (line 634) +* POP_JUMP_BACKWARD_IF_TRUE (opcode): Python Bytecode Instructions. + (line 606) +* POP_JUMP_FORWARD_IF_FALSE (opcode): Python Bytecode Instructions. + (line 613) +* POP_JUMP_FORWARD_IF_NONE (opcode): Python Bytecode Instructions. + (line 641) +* POP_JUMP_FORWARD_IF_NOT_NONE (opcode): Python Bytecode Instructions. + (line 627) +* POP_JUMP_FORWARD_IF_TRUE (opcode): Python Bytecode Instructions. + (line 599) +* pop_source() (shlex.shlex method): shlex Objects. (line 63) +* POP_TOP (opcode): Python Bytecode Instructions. + (line 83) +* port (http.cookiejar.Cookie attribute): Cookie Objects<2>. (line 36) +* portion: Glossary. (line 1112) +* port_specified (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 77) +* pos (json.JSONDecodeError attribute): Exceptions<14>. (line 19) +* pos (re.error attribute): Exceptions<3>. (line 23) +* pos (re.Match attribute): Match Objects. (line 172) +* pos() (in module operator): operator — Standard operators as functions. + (line 142) +* pos() (in module turtle): Tell Turtle’s state. + (line 6) +* position (xml.etree.ElementTree.ParseError attribute): Exceptions<16>. + (line 20) +* position() (in module turtle): Tell Turtle’s state. + (line 6) +* positional argument: Glossary. (line 1118) +* Positions (class in dis): Python Bytecode Instructions. + (line 58) +* positions (inspect.FrameInfo attribute): The interpreter stack. + (line 42) +* positions (inspect.Traceback attribute): The interpreter stack. + (line 82) +* Positions.col_offset (in module dis): Python Bytecode Instructions. + (line 67) +* Positions.end_col_offset (in module dis): Python Bytecode Instructions. + (line 69) +* Positions.end_lineno (in module dis): Python Bytecode Instructions. + (line 65) +* Positions.lineno (in module dis): Python Bytecode Instructions. + (line 63) +* POSIX Shared Memory: multiprocessing shared_memory — Shared memory for direct access across processes. + (line 10) +* POSIX; I/O control: termios — POSIX style tty control. + (line 6) +* POSIXLY_CORRECT: getopt — C-style parser for command line options. + (line 71) +* PosixPath (class in pathlib): Concrete paths. (line 22) +* posix_fadvise() (in module os): File Descriptor Operations. + (line 434) +* POSIX_FADV_DONTNEED (in module os): File Descriptor Operations. + (line 448) +* POSIX_FADV_NOREUSE (in module os): File Descriptor Operations. + (line 448) +* POSIX_FADV_NORMAL (in module os): File Descriptor Operations. + (line 448) +* POSIX_FADV_RANDOM (in module os): File Descriptor Operations. + (line 448) +* POSIX_FADV_SEQUENTIAL (in module os): File Descriptor Operations. + (line 448) +* POSIX_FADV_WILLNEED (in module os): File Descriptor Operations. + (line 448) +* posix_fallocate() (in module os): File Descriptor Operations. + (line 425) +* posix_spawn() (in module os): Process Management. (line 387) +* posix_spawnp() (in module os): Process Management. (line 477) +* POSIX_SPAWN_CLOSE (in module os): Process Management. (line 415) +* POSIX_SPAWN_DUP2 (in module os): Process Management. (line 421) +* POSIX_SPAWN_OPEN (in module os): Process Management. (line 409) +* post() (nntplib.NNTP method): Methods<3>. (line 278) +* post() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 179) +* postcmd() (cmd.Cmd method): Cmd Objects. (line 102) +* postloop() (cmd.Cmd method): Cmd Objects. (line 120) +* post_handshake_auth (ssl.SSLContext attribute): SSL Contexts. + (line 577) +* post_mortem() (in module pdb): pdb — The Python Debugger. + (line 129) +* post_setup() (venv.EnvBuilder method): API<2>. (line 125) +* Pow (class in ast): Expressions<2>. (line 54) +* pow() (in module math): Power and logarithmic functions. + (line 72) +* pow() (in module operator): operator — Standard operators as functions. + (line 147) +* power() (decimal.Context method): Context objects. (line 436) +* power; operation: The power operator. (line 6) +* pp (pdb command): Debugger Commands. (line 247) +* pp() (in module pprint): pprint — Data pretty printer. + (line 115) +* pprint() (in module pprint): pprint — Data pretty printer. + (line 125) +* pprint() (pprint.PrettyPrinter method): PrettyPrinter Objects. + (line 14) +* prcal() (in module calendar): calendar — General calendar-related functions. + (line 341) +* pread() (in module os): File Descriptor Operations. + (line 462) +* preadv() (in module os): File Descriptor Operations. + (line 475) +* preamble (email.message.EmailMessage attribute): email message Representing an email message. + (line 680) +* preamble (email.message.Message attribute): email message Message Representing an email message using the compat32 API. + (line 690) +* PRECALL (opcode): Python Bytecode Instructions. + (line 837) +* precmd() (cmd.Cmd method): Cmd Objects. (line 92) +* prefix: Python-related paths and files. + (line 7) +* prefix <1>: Include Files. (line 37) +* prefix <2>: Include Files. (line 40) +* prefix <3>: Include Files. (line 47) +* PREFIX (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 22) +* prefix (in module sys): sys — System-specific parameters and functions. + (line 1317) +* prefix (xml.dom.Attr attribute): Attr Objects. (line 18) +* prefix (xml.dom.Node attribute): Node Objects. (line 69) +* prefix (zipimport.zipimporter attribute): zipimporter Objects. + (line 117) +* PREFIXES (in module site): Module contents<5>. (line 6) +* prefixlen (ipaddress.IPv4Network attribute): Network objects. + (line 132) +* prefixlen (ipaddress.IPv6Network attribute): Network objects. + (line 329) +* preloop() (cmd.Cmd method): Cmd Objects. (line 114) +* prepare() (graphlib.TopologicalSorter method): graphlib — Functionality to operate with graph-like structures. + (line 99) +* prepare() (logging.handlers.QueueHandler method): QueueHandler. + (line 44) +* prepare() (logging.handlers.QueueListener method): QueueListener. + (line 58) +* PrepareProtocol (class in sqlite3): PrepareProtocol objects. + (line 6) +* prepare_class() (in module types): Dynamic Type Creation. + (line 23) +* prepare_input_source() (in module xml.sax.saxutils): xml sax saxutils — SAX Utilities. + (line 77) +* prepend() (pipes.Template method): Template Objects. (line 37) +* preprocess() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 433) +* PREP_RERAISE_STAR (opcode): Python Bytecode Instructions. + (line 341) +* PrettyPrinter (class in pprint): pprint — Data pretty printer. + (line 33) +* prev() (tkinter.ttk.Treeview method): ttk Treeview. (line 242) +* previousSibling (xml.dom.Node attribute): Node Objects. (line 32) +* primary: Primaries. (line 6) +* print (2to3 fixer): Fixers. (line 258) +* print() (built-in function); __str__() (object method): Basic customization. + (line 128) +* print() (traceback.TracebackException method): TracebackException Objects. + (line 86) +* printable (in module string): String constants. (line 41) +* printdir() (zipfile.ZipFile method): ZipFile Objects. (line 227) +* printf-style formatting: printf-style String Formatting. + (line 6) +* printf-style formatting <1>: printf-style Bytes Formatting. + (line 6) +* print_callees() (pstats.Stats method): The Stats Class. (line 217) +* print_callers() (pstats.Stats method): The Stats Class. (line 196) +* print_directory() (in module cgi): Functions<13>. (line 84) +* print_environ() (in module cgi): Functions<13>. (line 76) +* print_environ_usage() (in module cgi): Functions<13>. (line 88) +* print_exc() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 67) +* print_exc() (timeit.Timer method): Python Interface. (line 133) +* print_exception() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 33) +* PRINT_EXPR (opcode): Python Bytecode Instructions. + (line 240) +* print_form() (in module cgi): Functions<13>. (line 80) +* print_help() (argparse.ArgumentParser method): Printing help. + (line 16) +* print_last() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 72) +* print_stack() (asyncio.Task method): Task Object. (line 129) +* print_stack() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 79) +* print_stats() (profile.Profile method): profile and cProfile Module Reference. + (line 91) +* print_stats() (pstats.Stats method): The Stats Class. (line 164) +* print_tb() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 22) +* print_usage() (argparse.ArgumentParser method): Printing help. + (line 10) +* print_usage() (optparse.OptionParser method): Other methods. + (line 15) +* print_version() (optparse.OptionParser method): Printing a version string. + (line 26) +* print_warning() (in module test.support): test support — Utilities for the Python test suite. + (line 388) +* PriorityQueue (class in asyncio): Priority Queue. (line 6) +* PriorityQueue (class in queue): queue — A synchronized queue class. + (line 50) +* PRIO_PGRP (in module os): Process Parameters. (line 286) +* PRIO_PROCESS (in module os): Process Parameters. (line 286) +* PRIO_USER (in module os): Process Parameters. (line 286) +* private; names: Identifiers Names. (line 12) +* prlimit() (in module resource): Resource Limits. (line 56) +* prmonth() (calendar.TextCalendar method): calendar — General calendar-related functions. + (line 143) +* prmonth() (in module calendar): calendar — General calendar-related functions. + (line 332) +* ProactorEventLoop (class in asyncio): Event Loop Implementations. + (line 32) +* procedure; call: Expression statements. + (line 17) +* Process (class in multiprocessing): Process and exceptions. + (line 6) +* process() (logging.LoggerAdapter method): LoggerAdapter Objects. + (line 16) +* process; group: Process Parameters. (line 188) +* process; group <1>: Process Parameters. (line 249) +* process; id: Process Parameters. (line 255) +* process; id of parent: Process Parameters. (line 262) +* process; killing: Process Management. (line 291) +* process; killing <1>: Process Management. (line 315) +* process; scheduling priority: Process Parameters. (line 273) +* process; scheduling priority <1>: Process Parameters. (line 408) +* process; signalling: Process Management. (line 291) +* process; signalling <1>: Process Management. (line 315) +* ProcessError: Process and exceptions. + (line 227) +* processes, light-weight: _thread — Low-level threading API. + (line 6) +* ProcessingInstruction() (in module xml.etree.ElementTree): Functions<8>. + (line 179) +* processingInstruction() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 164) +* ProcessingInstructionHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 236) +* ProcessLookupError: OS exceptions. (line 103) +* processor time: Functions<4>. (line 223) +* processor time <1>: Functions<4>. (line 536) +* processor() (in module platform): Cross Platform. (line 66) +* ProcessPoolExecutor (class in concurrent.futures): ProcessPoolExecutor. + (line 21) +* process_exited() (asyncio.SubprocessProtocol method): Subprocess Protocols. + (line 26) +* process_message() (smtpd.SMTPServer method): SMTPServer Objects. + (line 41) +* process_request() (socketserver.BaseServer method): Server Objects<2>. + (line 156) +* process_time() (in module time): Functions<4>. (line 221) +* process_time_ns() (in module time): Functions<4>. (line 234) +* process_tokens() (in module tabnanny): tabnanny — Detection of ambiguous indentation. + (line 42) +* prod() (in module math): Number-theoretic and representation functions. + (line 234) +* product() (in module itertools): Itertool functions. (line 480) +* Profile (class in profile): profile and cProfile Module Reference. + (line 35) +* profile function: threading — Thread-based parallelism. + (line 172) +* profile function <1>: threading — Thread-based parallelism. + (line 179) +* profile function <2>: sys — System-specific parameters and functions. + (line 817) +* profile function <3>: sys — System-specific parameters and functions. + (line 1364) +* profiler: sys — System-specific parameters and functions. + (line 817) +* profiler <1>: sys — System-specific parameters and functions. + (line 1364) +* PROFILE_TASK: Performance options. + (line 11) +* profiling, deterministic: Introduction to the profilers. + (line 6) +* program: Complete Python programs. + (line 6) +* ProgrammingError: Exceptions<6>. (line 78) +* Progressbar (class in tkinter.ttk): ttk Progressbar. (line 6) +* prompt (cmd.Cmd attribute): Cmd Objects. (line 129) +* prompts, interpreter: sys — System-specific parameters and functions. + (line 1333) +* prompt_user_passwd() (urllib.request.FancyURLopener method): Legacy interface. + (line 184) +* propagate (logging.Logger attribute): Logger Objects. (line 25) +* property (built-in class): Built-in Functions. (line 1422) +* property list: plistlib — Generate and parse Apple plist files. + (line 8) +* property() (in module enum): Utilities and Decorators. + (line 22) +* PropertyMock (class in unittest.mock): The Mock Class. (line 628) +* property_declaration_handler (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 106) +* property_dom_node (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 113) +* property_lexical_handler (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 99) +* property_xml_string (in module xml.sax.handler): xml sax handler — Base classes for SAX handlers. + (line 120) +* proto (socket.socket attribute): Socket Objects. (line 618) +* Protocol (class in asyncio): Base Protocols. (line 10) +* Protocol (class in typing): Building generic types. + (line 359) +* protocol (ssl.SSLContext attribute): SSL Contexts. (line 596) +* protocol; context management: Context Manager Types. + (line 6) +* protocol; iterator: Iterator Types. (line 6) +* protocol; Telnet: telnetlib — Telnet client. + (line 8) +* ProtocolError (class in xmlrpc.client): ProtocolError Objects. + (line 6) +* PROTOCOL_SSLv2 (in module ssl): Constants<9>. (line 172) +* PROTOCOL_SSLv23 (in module ssl): Constants<9>. (line 166) +* PROTOCOL_SSLv3 (in module ssl): Constants<9>. (line 185) +* PROTOCOL_TLS (in module ssl): Constants<9>. (line 136) +* PROTOCOL_TLSv1 (in module ssl): Constants<9>. (line 201) +* PROTOCOL_TLSv1_1 (in module ssl): Constants<9>. (line 208) +* PROTOCOL_TLSv1_2 (in module ssl): Constants<9>. (line 218) +* PROTOCOL_TLS_CLIENT (in module ssl): Constants<9>. (line 149) +* PROTOCOL_TLS_SERVER (in module ssl): Constants<9>. (line 158) +* protocol_version (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 162) +* PROTOCOL_VERSION (imaplib.IMAP4 attribute): IMAP4 Objects. (line 392) +* prot_c() (ftplib.FTP_TLS method): FTP_TLS Objects. (line 35) +* prot_p() (ftplib.FTP_TLS method): FTP_TLS Objects. (line 31) +* provisional API: Glossary. (line 1122) +* provisional package: Glossary. (line 1142) +* proxy() (in module weakref): weakref — Weak references. + (line 136) +* proxyauth() (imaplib.IMAP4 method): IMAP4 Objects. (line 193) +* ProxyBasicAuthHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 367) +* ProxyDigestAuthHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 399) +* ProxyHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 293) +* ProxyType (in module weakref): weakref — Weak references. + (line 304) +* ProxyTypes (in module weakref): weakref — Weak references. + (line 312) +* pryear() (calendar.TextCalendar method): calendar — General calendar-related functions. + (line 158) +* ps1 (in module sys): sys — System-specific parameters and functions. + (line 1330) +* ps2 (in module sys): sys — System-specific parameters and functions. + (line 1330) +* pstdev() (in module statistics): Function details. (line 287) +* pthreads: _thread — Low-level threading API. + (line 16) +* pthread_getcpuclockid() (in module time): Functions<4>. (line 21) +* pthread_kill() (in module signal): Module contents<2>. (line 336) +* pthread_sigmask() (in module signal): Module contents<2>. (line 365) +* pu() (in module turtle): Drawing state. (line 12) +* publicId (xml.dom.DocumentType attribute): DocumentType Objects. + (line 17) +* PullDom (class in xml.dom.pulldom): xml dom pulldom — Support for building partial DOM trees. + (line 78) +* punctuation (in module string): String constants. (line 36) +* punctuation_chars (shlex.shlex attribute): shlex Objects. (line 183) +* PurePath (class in pathlib): Pure paths. (line 10) +* PurePath.anchor (in module pathlib): Methods and properties. + (line 58) +* PurePath.drive (in module pathlib): Methods and properties. + (line 8) +* PurePath.name (in module pathlib): Methods and properties. + (line 115) +* PurePath.parent (in module pathlib): Methods and properties. + (line 87) +* PurePath.parents (in module pathlib): Methods and properties. + (line 71) +* PurePath.parts (in module pathlib): Accessing individual parts. + (line 9) +* PurePath.root (in module pathlib): Methods and properties. + (line 24) +* PurePath.stem (in module pathlib): Methods and properties. + (line 152) +* PurePath.suffix (in module pathlib): Methods and properties. + (line 130) +* PurePath.suffixes (in module pathlib): Methods and properties. + (line 141) +* PurePosixPath (class in pathlib): Pure paths. (line 71) +* PureProxy (class in smtpd): PureProxy Objects. (line 6) +* PureWindowsPath (class in pathlib): Pure paths. (line 81) +* purge() (in module re): Functions<2>. (line 256) +* Purpose.CLIENT_AUTH (in module ssl): Constants<9>. (line 527) +* Purpose.SERVER_AUTH (in module ssl): Constants<9>. (line 518) +* push() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 108) +* push() (code.InteractiveConsole method): Interactive Console Objects. + (line 28) +* push() (contextlib.ExitStack method): Utilities. (line 543) +* pushbutton() (msilib.Dialog method): GUI classes. (line 66) +* push_async_callback() (contextlib.AsyncExitStack method): Utilities. + (line 627) +* push_async_exit() (contextlib.AsyncExitStack method): Utilities. + (line 622) +* PUSH_EXC_INFO (opcode): Python Bytecode Instructions. + (line 313) +* PUSH_NULL (opcode): Python Bytecode Instructions. + (line 845) +* push_source() (shlex.shlex method): shlex Objects. (line 56) +* push_token() (shlex.shlex method): shlex Objects. (line 16) +* push_with_producer() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 116) +* put() (asyncio.Queue method): Queue. (line 61) +* put() (multiprocessing.Queue method): Pipes and Queues. (line 120) +* put() (multiprocessing.SimpleQueue method): Pipes and Queues. + (line 227) +* put() (queue.Queue method): Queue Objects. (line 29) +* put() (queue.SimpleQueue method): SimpleQueue Objects. + (line 20) +* putch() (in module msvcrt): Console I/O. (line 35) +* putenv() (in module os): Process Parameters. (line 333) +* putheader() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 139) +* putp() (in module curses): Functions<5>. (line 390) +* putrequest() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 128) +* putwch() (in module msvcrt): Console I/O. (line 39) +* putwin() (curses.window method): Window Objects. (line 456) +* put_nowait() (asyncio.Queue method): Queue. (line 66) +* put_nowait() (multiprocessing.Queue method): Pipes and Queues. + (line 136) +* put_nowait() (queue.Queue method): Queue Objects. (line 40) +* put_nowait() (queue.SimpleQueue method): SimpleQueue Objects. + (line 35) +* pvariance() (in module statistics): Function details. (line 296) +* pwd() (ftplib.FTP method): FTP Objects. (line 221) +* pwrite() (in module os): File Descriptor Operations. + (line 532) +* pwritev() (in module os): File Descriptor Operations. + (line 543) +* PyAIter_Check (C function): Iterator Protocol. (line 14) +* PyAnySet_Check (C function): Set Objects. (line 54) +* PyAnySet_CheckExact (C function): Set Objects. (line 67) +* PyArg_Parse (C function): API Functions. (line 46) +* PyArg_ParseTuple (C function): API Functions. (line 6) +* PyArg_ParseTuple(): Extracting Parameters in Extension Functions. + (line 6) +* PyArg_ParseTupleAndKeywords (C function): API Functions. (line 19) +* PyArg_ParseTupleAndKeywords(): Keyword Parameters for Extension Functions. + (line 6) +* PyArg_UnpackTuple (C function): API Functions. (line 57) +* PyArg_ValidateKeywordArguments (C function): API Functions. + (line 38) +* PyArg_VaParse (C function): API Functions. (line 13) +* PyArg_VaParseTupleAndKeywords (C function): API Functions. (line 31) +* PyASCIIObject (C type): Unicode Type. (line 28) +* PyAsyncMethods (C type): Async Object Structures. + (line 8) +* PyAsyncMethods.am_aiter (C member): Async Object Structures. + (line 35) +* PyAsyncMethods.am_anext (C member): Async Object Structures. + (line 47) +* PyAsyncMethods.am_await (C member): Async Object Structures. + (line 23) +* PyAsyncMethods.am_send (C member): Async Object Structures. + (line 56) +* PyBool_Check (C function): Boolean Objects. (line 11) +* PyBool_FromLong (C function): Boolean Objects. (line 38) +* PyBufferProcs: Buffer Protocol. (line 20) +* PyBufferProcs (C type): Buffer Object Structures. + (line 6) +* PyBufferProcs.bf_getbuffer (C member): Buffer Object Structures. + (line 12) +* PyBufferProcs.bf_releasebuffer (C member): Buffer Object Structures. + (line 60) +* PyBuffer_FillContiguousStrides (C function): Buffer-related functions. + (line 86) +* PyBuffer_FillInfo (C function): Buffer-related functions. + (line 95) +* PyBuffer_FromContiguous (C function): Buffer-related functions. + (line 62) +* PyBuffer_GetPointer (C function): Buffer-related functions. + (line 56) +* PyBuffer_IsContiguous (C function): Buffer-related functions. + (line 48) +* PyBuffer_Release (C function): Buffer-related functions. + (line 31) +* PyBuffer_SizeFromFormat (C function): Buffer-related functions. + (line 40) +* PyBuffer_ToContiguous (C function): Buffer-related functions. + (line 69) +* PyBUF_ANY_CONTIGUOUS (C macro): contiguity requests. + (line 20) +* PyBUF_CONTIG (C macro): compound requests. (line 36) +* PyBUF_CONTIG_RO (C macro): compound requests. (line 39) +* PyBUF_C_CONTIGUOUS (C macro): contiguity requests. + (line 14) +* PyBUF_FORMAT (C macro): readonly format. (line 14) +* PyBUF_FULL (C macro): compound requests. (line 18) +* PyBUF_FULL_RO (C macro): compound requests. (line 21) +* PyBUF_F_CONTIGUOUS (C macro): contiguity requests. + (line 17) +* PyBUF_INDIRECT (C macro): shape strides suboffsets. + (line 14) +* PyBUF_ND (C macro): shape strides suboffsets. + (line 20) +* PyBUF_RECORDS (C macro): compound requests. (line 24) +* PyBUF_RECORDS_RO (C macro): compound requests. (line 27) +* PyBUF_SIMPLE (C macro): shape strides suboffsets. + (line 23) +* PyBUF_STRIDED (C macro): compound requests. (line 30) +* PyBUF_STRIDED_RO (C macro): compound requests. (line 33) +* PyBUF_STRIDES (C macro): shape strides suboffsets. + (line 17) +* PyBUF_WRITABLE (C macro): readonly format. (line 6) +* PyByteArrayObject (C type): Byte Array Objects. (line 6) +* PyByteArray_AsString (C function): Direct API functions. + (line 29) +* PyByteArray_AS_STRING (C function): Macros. (line 8) +* PyByteArray_Check (C function): Type check macros. (line 6) +* PyByteArray_CheckExact (C function): Type check macros. (line 11) +* PyByteArray_Concat (C function): Direct API functions. + (line 18) +* PyByteArray_FromObject (C function): Direct API functions. + (line 6) +* PyByteArray_FromStringAndSize (C function): Direct API functions. + (line 12) +* PyByteArray_GET_SIZE (C function): Macros. (line 13) +* PyByteArray_Resize (C function): Direct API functions. + (line 34) +* PyByteArray_Size (C function): Direct API functions. + (line 24) +* PyByteArray_Type (C var): Byte Array Objects. (line 11) +* PyBytesObject (C type): Bytes Objects<2>. (line 9) +* PyBytes_AsString (C function): Bytes Objects<2>. (line 127) +* PyBytes_AsStringAndSize (C function): Bytes Objects<2>. (line 143) +* PyBytes_AS_STRING (C function): Bytes Objects<2>. (line 138) +* PyBytes_Check (C function): Bytes Objects<2>. (line 19) +* PyBytes_CheckExact (C function): Bytes Objects<2>. (line 24) +* PyBytes_Concat (C function): Bytes Objects<2>. (line 165) +* PyBytes_ConcatAndDel (C function): Bytes Objects<2>. (line 175) +* PyBytes_FromFormat (C function): Bytes Objects<2>. (line 43) +* PyBytes_FromFormatV (C function): Bytes Objects<2>. (line 108) +* PyBytes_FromObject (C function): Bytes Objects<2>. (line 114) +* PyBytes_FromString (C function): Bytes Objects<2>. (line 30) +* PyBytes_FromStringAndSize (C function): Bytes Objects<2>. (line 36) +* PyBytes_GET_SIZE (C function): Bytes Objects<2>. (line 123) +* PyBytes_Size (C function): Bytes Objects<2>. (line 119) +* PyBytes_Type (C var): Bytes Objects<2>. (line 14) +* pycache_prefix (in module sys): sys — System-specific parameters and functions. + (line 338) +* PyCallable_Check (C function): Call Support API. (line 6) +* PyCallIter_Check (C function): Iterator Objects. (line 34) +* PyCallIter_New (C function): Iterator Objects. (line 39) +* PyCallIter_Type (C var): Iterator Objects. (line 29) +* PyCapsule (C type): Capsules<2>. (line 11) +* PyCapsule_CheckExact (C function): Capsules<2>. (line 29) +* PyCapsule_Destructor (C type): Capsules<2>. (line 20) +* PyCapsule_GetContext (C function): Capsules<2>. (line 76) +* PyCapsule_GetDestructor (C function): Capsules<2>. (line 65) +* PyCapsule_GetName (C function): Capsules<2>. (line 86) +* PyCapsule_GetPointer (C function): Capsules<2>. (line 54) +* PyCapsule_Import (C function): Capsules<2>. (line 96) +* PyCapsule_IsValid (C function): Capsules<2>. (line 108) +* PyCapsule_New (C function): Capsules<2>. (line 34) +* PyCapsule_SetContext (C function): Capsules<2>. (line 124) +* PyCapsule_SetDestructor (C function): Capsules<2>. (line 132) +* PyCapsule_SetName (C function): Capsules<2>. (line 140) +* PyCapsule_SetPointer (C function): Capsules<2>. (line 150) +* PyCellObject (C type): Cell Objects. (line 16) +* PyCell_Check (C function): Cell Objects. (line 24) +* PyCell_Get (C function): Cell Objects. (line 33) +* PyCell_GET (C function): Cell Objects. (line 37) +* PyCell_New (C function): Cell Objects. (line 29) +* PyCell_Set (C function): Cell Objects. (line 42) +* PyCell_SET (C function): Cell Objects. (line 49) +* PyCell_Type (C var): Cell Objects. (line 20) +* PyCFunction (C type): Implementing functions and methods. + (line 6) +* PyCFunctionWithKeywords (C type): Implementing functions and methods. + (line 20) +* PyCF_ALLOW_TOP_LEVEL_AWAIT (in module ast): Compiler Flags. + (line 9) +* PyCF_ONLY_AST (in module ast): Compiler Flags. (line 16) +* PyCF_TYPE_COMMENTS (in module ast): Compiler Flags. (line 21) +* PycInvalidationMode (class in py_compile): py_compile — Compile Python source files. + (line 92) +* PyCMethod (C type): Implementing functions and methods. + (line 49) +* PyCodec_BackslashReplaceErrors (C function): Registry API for Unicode encoding error handlers. + (line 55) +* PyCodec_Decode (C function): Codec registry and support functions. + (line 38) +* PyCodec_Decoder (C function): Codec lookup API. (line 16) +* PyCodec_Encode (C function): Codec registry and support functions. + (line 27) +* PyCodec_Encoder (C function): Codec lookup API. (line 11) +* PyCodec_IgnoreErrors (C function): Registry API for Unicode encoding error handlers. + (line 39) +* PyCodec_IncrementalDecoder (C function): Codec lookup API. (line 27) +* PyCodec_IncrementalEncoder (C function): Codec lookup API. (line 21) +* PyCodec_KnownEncoding (C function): Codec registry and support functions. + (line 22) +* PyCodec_LookupError (C function): Registry API for Unicode encoding error handlers. + (line 27) +* PyCodec_NameReplaceErrors (C function): Registry API for Unicode encoding error handlers. + (line 61) +* PyCodec_Register (C function): Codec registry and support functions. + (line 6) +* PyCodec_RegisterError (C function): Registry API for Unicode encoding error handlers. + (line 6) +* PyCodec_ReplaceErrors (C function): Registry API for Unicode encoding error handlers. + (line 44) +* PyCodec_StreamReader (C function): Codec lookup API. (line 33) +* PyCodec_StreamWriter (C function): Codec lookup API. (line 39) +* PyCodec_StrictErrors (C function): Registry API for Unicode encoding error handlers. + (line 34) +* PyCodec_Unregister (C function): Codec registry and support functions. + (line 14) +* PyCodec_XMLCharRefReplaceErrors (C function): Registry API for Unicode encoding error handlers. + (line 49) +* PyCodeObject (C type): Code Objects<2>. (line 10) +* PyCode_Addr2Line (C function): Code Objects<2>. (line 68) +* PyCode_Addr2Location (C function): Code Objects<2>. (line 77) +* PyCode_Check (C function): Code Objects<2>. (line 20) +* PyCode_GetCellvars (C function): Code Objects<2>. (line 111) +* PyCode_GetCode (C function): Code Objects<2>. (line 87) +* PyCode_GetFreevars (C function): Code Objects<2>. (line 122) +* PyCode_GetNumFree (C function): Code Objects<2>. (line 25) +* PyCode_GetVarnames (C function): Code Objects<2>. (line 101) +* PyCode_New (C function): Code Objects<2>. (line 29) +* PyCode_NewEmpty (C function): Code Objects<2>. (line 62) +* PyCode_NewWithPosOnlyArgs (C function): Code Objects<2>. (line 46) +* PyCode_Type (C var): Code Objects<2>. (line 15) +* PyCompactUnicodeObject (C type): Unicode Type. (line 28) +* PyCompileError: py_compile — Compile Python source files. + (line 19) +* PyCompilerFlags (C struct): The Very High Level Layer. + (line 344) +* PyCompilerFlags.cf_feature_version (C member): The Very High Level Layer. + (line 360) +* PyCompilerFlags.cf_flags (C member): The Very High Level Layer. + (line 356) +* PyComplexObject (C type): Complex Numbers as Python Objects. + (line 6) +* PyComplex_AsCComplex (C function): Complex Numbers as Python Objects. + (line 47) +* PyComplex_Check (C function): Complex Numbers as Python Objects. + (line 16) +* PyComplex_CheckExact (C function): Complex Numbers as Python Objects. + (line 22) +* PyComplex_FromCComplex (C function): Complex Numbers as Python Objects. + (line 28) +* PyComplex_FromDoubles (C function): Complex Numbers as Python Objects. + (line 33) +* PyComplex_ImagAsDouble (C function): Complex Numbers as Python Objects. + (line 43) +* PyComplex_RealAsDouble (C function): Complex Numbers as Python Objects. + (line 39) +* PyComplex_Type (C var): Complex Numbers as Python Objects. + (line 11) +* PyConfig (C type): PyConfig. (line 6) +* PyConfig.argv (C member): PyConfig. (line 128) +* PyConfig.base_executable (C member): PyConfig. (line 175) +* PyConfig.base_exec_prefix (C member): PyConfig. (line 167) +* PyConfig.base_prefix (C member): PyConfig. (line 187) +* PyConfig.buffered_stdio (C member): PyConfig. (line 195) +* PyConfig.bytes_warning (C member): PyConfig. (line 208) +* PyConfig.check_hash_pycs_mode (C member): PyConfig. (line 245) +* PyConfig.code_debug_ranges (C member): PyConfig. (line 231) +* PyConfig.configure_c_stdio (C member): PyConfig. (line 265) +* PyConfig.dev_mode (C member): PyConfig. (line 280) +* PyConfig.dump_refs (C member): PyConfig. (line 289) +* PyConfig.executable (C member): PyConfig. (line 313) +* PyConfig.exec_prefix (C member): PyConfig. (line 303) +* PyConfig.faulthandler (C member): PyConfig. (line 322) +* PyConfig.filesystem_encoding (C member): PyConfig. (line 334) +* PyConfig.filesystem_errors (C member): PyConfig. (line 367) +* PyConfig.hash_seed (C member): PyConfig. (line 389) +* PyConfig.home (C member): PyConfig. (line 404) +* PyConfig.import_time (C member): PyConfig. (line 417) +* PyConfig.inspect (C member): PyConfig. (line 426) +* PyConfig.install_signal_handlers (C member): PyConfig. (line 441) +* PyConfig.interactive (C member): PyConfig. (line 447) +* PyConfig.isolated (C member): PyConfig. (line 455) +* PyConfig.legacy_windows_stdio (C member): PyConfig. (line 477) +* PyConfig.malloc_stats (C member): PyConfig. (line 494) +* PyConfig.module_search_paths (C member): PyConfig. (line 538) +* PyConfig.module_search_paths_set (C member): PyConfig. (line 540) +* PyConfig.optimization_level (C member): PyConfig. (line 554) +* PyConfig.orig_argv (C member): PyConfig. (line 570) +* PyConfig.parser_debug (C member): PyConfig. (line 609) +* PyConfig.parse_argv (C member): PyConfig. (line 588) +* PyConfig.pathconfig_warnings (C member): PyConfig. (line 620) +* PyConfig.platlibdir (C member): PyConfig. (line 507) +* PyConfig.prefix (C member): PyConfig. (line 632) +* PyConfig.program_name (C member): PyConfig. (line 642) +* PyConfig.pycache_prefix (C member): PyConfig. (line 666) +* PyConfig.PyConfig_Clear (C function): PyConfig. (line 97) +* PyConfig.PyConfig_InitIsolatedConfig (C function): PyConfig. + (line 20) +* PyConfig.PyConfig_InitPythonConfig (C function): PyConfig. (line 15) +* PyConfig.PyConfig_Read (C function): PyConfig. (line 66) +* PyConfig.PyConfig_SetArgv (C function): PyConfig. (line 41) +* PyConfig.PyConfig_SetBytesArgv (C function): PyConfig. (line 49) +* PyConfig.PyConfig_SetBytesString (C function): PyConfig. (line 32) +* PyConfig.PyConfig_SetString (C function): PyConfig. (line 25) +* PyConfig.PyConfig_SetWideStringList (C function): PyConfig. + (line 58) +* PyConfig.pythonpath_env (C member): PyConfig. (line 527) +* PyConfig.quiet (C member): PyConfig. (line 679) +* PyConfig.run_command (C member): PyConfig. (line 688) +* PyConfig.run_filename (C member): PyConfig. (line 696) +* PyConfig.run_module (C member): PyConfig. (line 710) +* PyConfig.safe_path (C member): PyConfig. (line 145) +* PyConfig.show_ref_count (C member): PyConfig. (line 718) +* PyConfig.site_import (C member): PyConfig. (line 729) +* PyConfig.skip_source_first_line (C member): PyConfig. (line 748) +* PyConfig.stdio_encoding (C member): PyConfig. (line 760) +* PyConfig.stdio_errors (C member): PyConfig. (line 762) +* PyConfig.tracemalloc (C member): PyConfig. (line 791) +* PyConfig.user_site_directory (C member): PyConfig. (line 813) +* PyConfig.use_environment (C member): PyConfig. (line 802) +* PyConfig.use_hash_seed (C member): PyConfig. (line 391) +* PyConfig.verbose (C member): PyConfig. (line 826) +* PyConfig.warnoptions (C member): PyConfig. (line 843) +* PyConfig.warn_default_encoding (C member): PyConfig. (line 221) +* PyConfig.write_bytecode (C member): PyConfig. (line 863) +* PyConfig.xoptions (C member): PyConfig. (line 876) +* PyContext (C type): Context Variables Objects. + (line 26) +* PyContextToken (C type): Context Variables Objects. + (line 36) +* PyContextToken_CheckExact (C function): Context Variables Objects. + (line 65) +* PyContextToken_Type (C var): Context Variables Objects. + (line 49) +* PyContextVar (C type): Context Variables Objects. + (line 31) +* PyContextVar_CheckExact (C function): Context Variables Objects. + (line 60) +* PyContextVar_Get (C function): Context Variables Objects. + (line 105) +* PyContextVar_New (C function): Context Variables Objects. + (line 97) +* PyContextVar_Reset (C function): Context Variables Objects. + (line 129) +* PyContextVar_Set (C function): Context Variables Objects. + (line 123) +* PyContextVar_Type (C var): Context Variables Objects. + (line 45) +* PyContext_CheckExact (C function): Context Variables Objects. + (line 55) +* PyContext_Copy (C function): Context Variables Objects. + (line 76) +* PyContext_CopyCurrent (C function): Context Variables Objects. + (line 80) +* PyContext_Enter (C function): Context Variables Objects. + (line 84) +* PyContext_Exit (C function): Context Variables Objects. + (line 89) +* PyContext_New (C function): Context Variables Objects. + (line 72) +* PyContext_Type (C var): Context Variables Objects. + (line 41) +* PyCoroObject (C type): Coroutine Objects<2>. + (line 11) +* PyCoro_CheckExact (C function): Coroutine Objects<2>. + (line 19) +* PyCoro_New (C function): Coroutine Objects<2>. + (line 24) +* PyCoro_Type (C var): Coroutine Objects<2>. + (line 15) +* PyDateTime_Check (C function): DateTime Objects<2>. + (line 36) +* PyDateTime_CheckExact (C function): DateTime Objects<2>. + (line 42) +* PyDateTime_DATE_GET_FOLD (C function): DateTime Objects<2>. + (line 178) +* PyDateTime_DATE_GET_HOUR (C function): DateTime Objects<2>. + (line 161) +* PyDateTime_DATE_GET_MICROSECOND (C function): DateTime Objects<2>. + (line 173) +* PyDateTime_DATE_GET_MINUTE (C function): DateTime Objects<2>. + (line 165) +* PyDateTime_DATE_GET_SECOND (C function): DateTime Objects<2>. + (line 169) +* PyDateTime_DATE_GET_TZINFO (C function): DateTime Objects<2>. + (line 184) +* PyDateTime_DELTA_GET_DAYS (C function): DateTime Objects<2>. + (line 228) +* PyDateTime_DELTA_GET_MICROSECONDS (C function): DateTime Objects<2>. + (line 240) +* PyDateTime_DELTA_GET_SECONDS (C function): DateTime Objects<2>. + (line 234) +* PyDateTime_FromDateAndTime (C function): DateTime Objects<2>. + (line 87) +* PyDateTime_FromDateAndTimeAndFold (C function): DateTime Objects<2>. + (line 94) +* PyDateTime_FromTimestamp (C function): DateTime Objects<2>. + (line 249) +* PyDateTime_GET_DAY (C function): DateTime Objects<2>. + (line 153) +* PyDateTime_GET_MONTH (C function): DateTime Objects<2>. + (line 149) +* PyDateTime_GET_YEAR (C function): DateTime Objects<2>. + (line 145) +* PyDateTime_TimeZone_UTC (C var): DateTime Objects<2>. + (line 16) +* PyDateTime_TIME_GET_FOLD (C function): DateTime Objects<2>. + (line 211) +* PyDateTime_TIME_GET_HOUR (C function): DateTime Objects<2>. + (line 195) +* PyDateTime_TIME_GET_MICROSECOND (C function): DateTime Objects<2>. + (line 207) +* PyDateTime_TIME_GET_MINUTE (C function): DateTime Objects<2>. + (line 199) +* PyDateTime_TIME_GET_SECOND (C function): DateTime Objects<2>. + (line 203) +* PyDateTime_TIME_GET_TZINFO (C function): DateTime Objects<2>. + (line 217) +* PyDate_Check (C function): DateTime Objects<2>. + (line 25) +* PyDate_CheckExact (C function): DateTime Objects<2>. + (line 31) +* PyDate_FromDate (C function): DateTime Objects<2>. + (line 82) +* PyDate_FromTimestamp (C function): DateTime Objects<2>. + (line 255) +* PyDelta_Check (C function): DateTime Objects<2>. + (line 58) +* PyDelta_CheckExact (C function): DateTime Objects<2>. + (line 64) +* PyDelta_FromDSU (C function): DateTime Objects<2>. + (line 116) +* PyDescr_IsData (C function): Descriptor Objects. (line 37) +* PyDescr_NewClassMethod (C function): Descriptor Objects. (line 32) +* PyDescr_NewGetSet (C function): Descriptor Objects. (line 13) +* PyDescr_NewMember (C function): Descriptor Objects. (line 18) +* PyDescr_NewMethod (C function): Descriptor Objects. (line 23) +* PyDescr_NewWrapper (C function): Descriptor Objects. (line 28) +* PyDictObject (C type): Dictionary Objects. (line 6) +* PyDictProxy_New (C function): Dictionary Objects. (line 30) +* PyDict_Check (C function): Dictionary Objects. (line 16) +* PyDict_CheckExact (C function): Dictionary Objects. (line 21) +* PyDict_Clear (C function): Dictionary Objects. (line 38) +* PyDict_Contains (C function): Dictionary Objects. (line 42) +* PyDict_Copy (C function): Dictionary Objects. (line 48) +* PyDict_DelItem (C function): Dictionary Objects. (line 70) +* PyDict_DelItemString (C function): Dictionary Objects. (line 77) +* PyDict_GetItem (C function): Dictionary Objects. (line 83) +* PyDict_GetItemString (C function): Dictionary Objects. (line 106) +* PyDict_GetItemWithError (C function): Dictionary Objects. (line 98) +* PyDict_Items (C function): Dictionary Objects. (line 129) +* PyDict_Keys (C function): Dictionary Objects. (line 134) +* PyDict_Merge (C function): Dictionary Objects. (line 198) +* PyDict_MergeFromSeq2 (C function): Dictionary Objects. (line 217) +* PyDict_New (C function): Dictionary Objects. (line 26) +* PyDict_Next (C function): Dictionary Objects. (line 150) +* PyDict_SetDefault (C function): Dictionary Objects. (line 117) +* PyDict_SetItem (C function): Dictionary Objects. (line 53) +* PyDict_SetItemString (C function): Dictionary Objects. (line 61) +* PyDict_Size (C function): Dictionary Objects. (line 144) +* PyDict_Type (C var): Dictionary Objects. (line 11) +* PyDict_Update (C function): Dictionary Objects. (line 209) +* PyDict_Values (C function): Dictionary Objects. (line 139) +* PyDLL (class in ctypes): Loading shared libraries. + (line 57) +* PyDoc_STR (C macro): Useful macros. (line 151) +* PyDoc_STRVAR (C macro): Useful macros. (line 133) +* PyErr_BadArgument (C function): Raising exceptions. (line 45) +* PyErr_BadInternalCall (C function): Raising exceptions. (line 214) +* PyErr_CheckSignals (C function): Signal Handling<2>. (line 6) +* PyErr_Clear (C function): Printing and clearing. + (line 6) +* PyErr_Clear(): Exceptions<19>. (line 25) +* PyErr_Clear() <1>: Exceptions<19>. (line 123) +* PyErr_ExceptionMatches (C function): Querying the error indicator. + (line 22) +* PyErr_ExceptionMatches(): Exceptions<19>. (line 123) +* PyErr_Fetch (C function): Querying the error indicator. + (line 36) +* PyErr_Fetch(): Finalization and De-allocation. + (line 33) +* PyErr_Format (C function): Raising exceptions. (line 24) +* PyErr_FormatV (C function): Raising exceptions. (line 33) +* PyErr_GetExcInfo (C function): Querying the error indicator. + (line 123) +* PyErr_GetHandledException (C function): Querying the error indicator. + (line 94) +* PyErr_GivenExceptionMatches (C function): Querying the error indicator. + (line 28) +* PyErr_NewException (C function): Exception Classes. (line 6) +* PyErr_NewExceptionWithDoc (C function): Exception Classes. (line 23) +* PyErr_NoMemory (C function): Raising exceptions. (line 51) +* PyErr_NormalizeException (C function): Querying the error indicator. + (line 75) +* PyErr_Occurred (C function): Querying the error indicator. + (line 6) +* PyErr_Occurred(): Exceptions<19>. (line 12) +* PyErr_Print (C function): Printing and clearing. + (line 25) +* PyErr_PrintEx (C function): Printing and clearing. + (line 10) +* PyErr_ResourceWarning (C function): Issuing warnings. (line 69) +* PyErr_Restore (C function): Querying the error indicator. + (line 58) +* PyErr_Restore(): Finalization and De-allocation. + (line 33) +* PyErr_SetExcFromWindowsErr (C function): Raising exceptions. + (line 116) +* PyErr_SetExcFromWindowsErrWithFilename (C function): Raising exceptions. + (line 158) +* PyErr_SetExcFromWindowsErrWithFilenameObject (C function): Raising exceptions. + (line 136) +* PyErr_SetExcFromWindowsErrWithFilenameObjects (C function): Raising exceptions. + (line 146) +* PyErr_SetExcInfo (C function): Querying the error indicator. + (line 142) +* PyErr_SetFromErrno (C function): Raising exceptions. (line 57) +* PyErr_SetFromErrnoWithFilename (C function): Raising exceptions. + (line 94) +* PyErr_SetFromErrnoWithFilenameObject (C function): Raising exceptions. + (line 73) +* PyErr_SetFromErrnoWithFilenameObjects (C function): Raising exceptions. + (line 83) +* PyErr_SetFromWindowsErr (C function): Raising exceptions. (line 101) +* PyErr_SetFromWindowsErrWithFilename (C function): Raising exceptions. + (line 125) +* PyErr_SetHandledException (C function): Querying the error indicator. + (line 110) +* PyErr_SetImportError (C function): Raising exceptions. (line 168) +* PyErr_SetImportErrorSubclass (C function): Raising exceptions. + (line 179) +* PyErr_SetInterrupt (C function): Signal Handling<2>. (line 33) +* PyErr_SetInterruptEx (C function): Signal Handling<2>. (line 42) +* PyErr_SetNone (C function): Raising exceptions. (line 41) +* PyErr_SetObject (C function): Raising exceptions. (line 19) +* PyErr_SetString (C function): Raising exceptions. (line 10) +* PyErr_SetString(): Exceptions<19>. (line 25) +* PyErr_SyntaxLocation (C function): Raising exceptions. (line 208) +* PyErr_SyntaxLocationEx (C function): Raising exceptions. (line 199) +* PyErr_SyntaxLocationObject (C function): Raising exceptions. + (line 189) +* PyErr_WarnEx (C function): Issuing warnings. (line 19) +* PyErr_WarnExplicit (C function): Issuing warnings. (line 53) +* PyErr_WarnExplicitObject (C function): Issuing warnings. (line 41) +* PyErr_WarnFormat (C function): Issuing warnings. (line 61) +* PyErr_WriteUnraisable (C function): Printing and clearing. + (line 29) +* PyEval_AcquireLock (C function): Low-level API. (line 240) +* PyEval_AcquireThread (C function): Low-level API. (line 208) +* PyEval_AcquireThread(): High-level API. (line 28) +* PyEval_EvalCode (C function): The Very High Level Layer. + (line 280) +* PyEval_EvalCodeEx (C function): The Very High Level Layer. + (line 287) +* PyEval_EvalFrame (C function): The Very High Level Layer. + (line 300) +* PyEval_EvalFrameEx (C function): The Very High Level Layer. + (line 306) +* PyEval_GetBuiltins (C function): Reflection. (line 6) +* PyEval_GetFrame (C function): Reflection. (line 22) +* PyEval_GetFuncDesc (C function): Reflection. (line 34) +* PyEval_GetFuncName (C function): Reflection. (line 29) +* PyEval_GetGlobals (C function): Reflection. (line 17) +* PyEval_GetLocals (C function): Reflection. (line 12) +* PyEval_InitThreads (C function): High-level API. (line 27) +* PyEval_InitThreads(): Initializing and finalizing the interpreter. + (line 7) +* PyEval_MergeCompilerFlags (C function): The Very High Level Layer. + (line 321) +* PyEval_ReleaseLock (C function): Low-level API. (line 261) +* PyEval_ReleaseThread (C function): Low-level API. (line 229) +* PyEval_ReleaseThread(): High-level API. (line 28) +* PyEval_RestoreThread (C function): High-level API. (line 64) +* PyEval_RestoreThread(): Releasing the GIL from extension code. + (line 33) +* PyEval_RestoreThread() <1>: High-level API. (line 28) +* PyEval_SaveThread (C function): High-level API. (line 57) +* PyEval_SaveThread(): Releasing the GIL from extension code. + (line 33) +* PyEval_SaveThread() <1>: High-level API. (line 28) +* PyEval_SetProfile (C function): Profiling and Tracing. + (line 116) +* PyEval_SetTrace (C function): Profiling and Tracing. + (line 131) +* PyEval_ThreadsInitialized (C function): High-level API. (line 46) +* PyException_GetCause (C function): Exception Objects. (line 33) +* PyException_GetContext (C function): Exception Objects. (line 18) +* PyException_GetTraceback (C function): Exception Objects. (line 6) +* PyException_SetCause (C function): Exception Objects. (line 41) +* PyException_SetContext (C function): Exception Objects. (line 26) +* PyException_SetTraceback (C function): Exception Objects. (line 13) +* PyExc_ArithmeticError: Standard Exceptions. + (line 11) +* PyExc_AssertionError: Standard Exceptions. + (line 11) +* PyExc_AttributeError: Standard Exceptions. + (line 11) +* PyExc_BaseException: Standard Exceptions. + (line 11) +* PyExc_BlockingIOError: Standard Exceptions. + (line 11) +* PyExc_BrokenPipeError: Standard Exceptions. + (line 11) +* PyExc_BufferError: Standard Exceptions. + (line 11) +* PyExc_BytesWarning: Standard Warning Categories. + (line 11) +* PyExc_ChildProcessError: Standard Exceptions. + (line 11) +* PyExc_ConnectionAbortedError: Standard Exceptions. + (line 11) +* PyExc_ConnectionError: Standard Exceptions. + (line 11) +* PyExc_ConnectionRefusedError: Standard Exceptions. + (line 11) +* PyExc_ConnectionResetError: Standard Exceptions. + (line 11) +* PyExc_DeprecationWarning: Standard Warning Categories. + (line 11) +* PyExc_EnvironmentError: Standard Exceptions. + (line 190) +* PyExc_EOFError: Standard Exceptions. + (line 11) +* PyExc_Exception: Standard Exceptions. + (line 11) +* PyExc_FileExistsError: Standard Exceptions. + (line 11) +* PyExc_FileNotFoundError: Standard Exceptions. + (line 11) +* PyExc_FloatingPointError: Standard Exceptions. + (line 11) +* PyExc_FutureWarning: Standard Warning Categories. + (line 11) +* PyExc_GeneratorExit: Standard Exceptions. + (line 11) +* PyExc_ImportError: Standard Exceptions. + (line 11) +* PyExc_ImportWarning: Standard Warning Categories. + (line 11) +* PyExc_IndentationError: Standard Exceptions. + (line 11) +* PyExc_IndexError: Standard Exceptions. + (line 11) +* PyExc_InterruptedError: Standard Exceptions. + (line 11) +* PyExc_IOError: Standard Exceptions. + (line 190) +* PyExc_IsADirectoryError: Standard Exceptions. + (line 11) +* PyExc_KeyboardInterrupt: Standard Exceptions. + (line 11) +* PyExc_KeyError: Standard Exceptions. + (line 11) +* PyExc_LookupError: Standard Exceptions. + (line 11) +* PyExc_MemoryError: Standard Exceptions. + (line 11) +* PyExc_ModuleNotFoundError: Standard Exceptions. + (line 11) +* PyExc_NameError: Standard Exceptions. + (line 11) +* PyExc_NotADirectoryError: Standard Exceptions. + (line 11) +* PyExc_NotImplementedError: Standard Exceptions. + (line 11) +* PyExc_OSError: Standard Exceptions. + (line 11) +* PyExc_OverflowError: Standard Exceptions. + (line 11) +* PyExc_PendingDeprecationWarning: Standard Warning Categories. + (line 11) +* PyExc_PermissionError: Standard Exceptions. + (line 11) +* PyExc_ProcessLookupError: Standard Exceptions. + (line 11) +* PyExc_RecursionError: Standard Exceptions. + (line 11) +* PyExc_ReferenceError: Standard Exceptions. + (line 11) +* PyExc_ResourceWarning: Standard Warning Categories. + (line 11) +* PyExc_RuntimeError: Standard Exceptions. + (line 11) +* PyExc_RuntimeWarning: Standard Warning Categories. + (line 11) +* PyExc_StopAsyncIteration: Standard Exceptions. + (line 11) +* PyExc_StopIteration: Standard Exceptions. + (line 11) +* PyExc_SyntaxError: Standard Exceptions. + (line 11) +* PyExc_SyntaxWarning: Standard Warning Categories. + (line 11) +* PyExc_SystemError: Standard Exceptions. + (line 11) +* PyExc_SystemExit: Standard Exceptions. + (line 11) +* PyExc_TabError: Standard Exceptions. + (line 11) +* PyExc_TimeoutError: Standard Exceptions. + (line 11) +* PyExc_TypeError: Standard Exceptions. + (line 11) +* PyExc_UnboundLocalError: Standard Exceptions. + (line 11) +* PyExc_UnicodeDecodeError: Standard Exceptions. + (line 11) +* PyExc_UnicodeEncodeError: Standard Exceptions. + (line 11) +* PyExc_UnicodeError: Standard Exceptions. + (line 11) +* PyExc_UnicodeTranslateError: Standard Exceptions. + (line 11) +* PyExc_UnicodeWarning: Standard Warning Categories. + (line 11) +* PyExc_UserWarning: Standard Warning Categories. + (line 11) +* PyExc_ValueError: Standard Exceptions. + (line 11) +* PyExc_Warning: Standard Warning Categories. + (line 11) +* PyExc_WindowsError: Standard Exceptions. + (line 190) +* PyExc_ZeroDivisionError: Standard Exceptions. + (line 11) +* PyFile_FromFd (C function): File Objects. (line 15) +* PyFile_GetLine (C function): File Objects. (line 41) +* PyFile_SetOpenCodeHook (C function): File Objects. (line 57) +* PyFile_WriteObject (C function): File Objects. (line 87) +* PyFile_WriteString (C function): File Objects. (line 96) +* PyFloatObject (C type): Floating Point Objects. + (line 6) +* PyFloat_AsDouble (C function): Floating Point Objects. + (line 38) +* PyFloat_AS_DOUBLE (C function): Floating Point Objects. + (line 49) +* PyFloat_Check (C function): Floating Point Objects. + (line 16) +* PyFloat_CheckExact (C function): Floating Point Objects. + (line 22) +* PyFloat_FromDouble (C function): Floating Point Objects. + (line 33) +* PyFloat_FromString (C function): Floating Point Objects. + (line 28) +* PyFloat_GetInfo (C function): Floating Point Objects. + (line 54) +* PyFloat_GetMax (C function): Floating Point Objects. + (line 60) +* PyFloat_GetMin (C function): Floating Point Objects. + (line 64) +* PyFloat_Pack2 (C function): Pack functions. (line 22) +* PyFloat_Pack4 (C function): Pack functions. (line 26) +* PyFloat_Pack8 (C function): Pack functions. (line 30) +* PyFloat_Type (C var): Floating Point Objects. + (line 11) +* PyFloat_Unpack2 (C function): Unpack functions. (line 20) +* PyFloat_Unpack4 (C function): Unpack functions. (line 24) +* PyFloat_Unpack8 (C function): Unpack functions. (line 28) +* PyFrameObject (C type): Frame Objects. (line 6) +* PyFrame_GetBack (C function): Frame Objects. (line 21) +* PyFrame_GetBuiltins (C function): Frame Objects. (line 31) +* PyFrame_GetCode (C function): Frame Objects. (line 40) +* PyFrame_GetGenerator (C function): Frame Objects. (line 51) +* PyFrame_GetGlobals (C function): Frame Objects. (line 62) +* PyFrame_GetLasti (C function): Frame Objects. (line 71) +* PyFrame_GetLineNumber (C function): Frame Objects. (line 88) +* PyFrame_GetLocals (C function): Frame Objects. (line 79) +* PyFrozenSet_Check (C function): Set Objects. (line 49) +* PyFrozenSet_CheckExact (C function): Set Objects. (line 73) +* PyFrozenSet_New (C function): Set Objects. (line 86) +* PyFrozenSet_Type (C var): Set Objects. (line 35) +* PyFunctionObject (C type): Function Objects<3>. + (line 8) +* PyFunction_Check (C function): Function Objects<3>. + (line 18) +* PyFunction_GetAnnotations (C function): Function Objects<3>. + (line 92) +* PyFunction_GetClosure (C function): Function Objects<3>. + (line 78) +* PyFunction_GetCode (C function): Function Objects<3>. + (line 46) +* PyFunction_GetDefaults (C function): Function Objects<3>. + (line 64) +* PyFunction_GetGlobals (C function): Function Objects<3>. + (line 50) +* PyFunction_GetModule (C function): Function Objects<3>. + (line 55) +* PyFunction_New (C function): Function Objects<3>. + (line 24) +* PyFunction_NewWithQualName (C function): Function Objects<3>. + (line 36) +* PyFunction_SetAnnotations (C function): Function Objects<3>. + (line 97) +* PyFunction_SetClosure (C function): Function Objects<3>. + (line 84) +* PyFunction_SetDefaults (C function): Function Objects<3>. + (line 70) +* PyFunction_Type (C var): Function Objects<3>. + (line 12) +* PYFUNCTYPE() (in module ctypes): Function prototypes. + (line 33) +* PyGC_Collect (C function): Controlling the Garbage Collector State. + (line 9) +* PyGC_Disable (C function): Controlling the Garbage Collector State. + (line 27) +* PyGC_Enable (C function): Controlling the Garbage Collector State. + (line 20) +* PyGC_IsEnabled (C function): Controlling the Garbage Collector State. + (line 34) +* PyGenObject (C type): Generator Objects. (line 11) +* PyGen_Check (C function): Generator Objects. (line 19) +* PyGen_CheckExact (C function): Generator Objects. (line 24) +* PyGen_New (C function): Generator Objects. (line 29) +* PyGen_NewWithQualName (C function): Generator Objects. (line 34) +* PyGen_Type (C var): Generator Objects. (line 15) +* PyGetSetDef (C type): Accessing attributes of extension types. + (line 134) +* PyGILState_Check (C function): High-level API. (line 144) +* PyGILState_Ensure (C function): High-level API. (line 94) +* PyGILState_GetThisThreadState (C function): High-level API. + (line 135) +* PyGILState_Release (C function): High-level API. (line 125) +* PyImport_AddModule (C function): Importing Modules<2>. + (line 118) +* PyImport_AddModuleObject (C function): Importing Modules<2>. + (line 100) +* PyImport_AppendInittab (C function): Importing Modules<2>. + (line 285) +* PyImport_ExecCodeModule (C function): Importing Modules<2>. + (line 124) +* PyImport_ExecCodeModuleEx (C function): Importing Modules<2>. + (line 160) +* PyImport_ExecCodeModuleObject (C function): Importing Modules<2>. + (line 169) +* PyImport_ExecCodeModuleWithPathnames (C function): Importing Modules<2>. + (line 180) +* PyImport_ExtendInittab (C function): Importing Modules<2>. + (line 310) +* PyImport_FrozenModules (C var): Importing Modules<2>. + (line 277) +* PyImport_GetImporter (C function): Importing Modules<2>. + (line 227) +* PyImport_GetMagicNumber (C function): Importing Modules<2>. + (line 195) +* PyImport_GetMagicTag (C function): Importing Modules<2>. + (line 203) +* PyImport_GetModule (C function): Importing Modules<2>. + (line 217) +* PyImport_GetModuleDict (C function): Importing Modules<2>. + (line 211) +* PyImport_Import (C function): Importing Modules<2>. + (line 82) +* PyImport_ImportFrozenModule (C function): Importing Modules<2>. + (line 254) +* PyImport_ImportFrozenModuleObject (C function): Importing Modules<2>. + (line 240) +* PyImport_ImportModule (C function): Importing Modules<2>. + (line 6) +* PyImport_ImportModuleEx (C function): Importing Modules<2>. + (line 38) +* PyImport_ImportModuleLevel (C function): Importing Modules<2>. + (line 72) +* PyImport_ImportModuleLevelObject (C function): Importing Modules<2>. + (line 55) +* PyImport_ImportModuleNoBlock (C function): Importing Modules<2>. + (line 27) +* PyImport_ReloadModule (C function): Importing Modules<2>. + (line 93) +* PyIndex_Check (C function): Number Protocol. (line 306) +* PyInit_modulename (C function): Building C and C++ Extensions. + (line 16) +* PyInstanceMethod_Check (C function): Instance Method Objects. + (line 15) +* PyInstanceMethod_Function (C function): Instance Method Objects. + (line 27) +* PyInstanceMethod_GET_FUNCTION (C function): Instance Method Objects. + (line 32) +* PyInstanceMethod_New (C function): Instance Method Objects. + (line 21) +* PyInstanceMethod_Type (C var): Instance Method Objects. + (line 10) +* PyInterpreterState (C type): High-level API. (line 9) +* PyInterpreterState_Clear (C function): Low-level API. (line 21) +* PyInterpreterState_Delete (C function): Low-level API. (line 30) +* PyInterpreterState_Get (C function): Low-level API. (line 115) +* PyInterpreterState_GetDict (C function): Low-level API. (line 137) +* PyInterpreterState_GetID (C function): Low-level API. (line 127) +* PyInterpreterState_Head (C function): Advanced Debugger Support. + (line 9) +* PyInterpreterState_Main (C function): Advanced Debugger Support. + (line 15) +* PyInterpreterState_New (C function): Low-level API. (line 12) +* PyInterpreterState_Next (C function): Advanced Debugger Support. + (line 20) +* PyInterpreterState_ThreadHead (C function): Advanced Debugger Support. + (line 26) +* PyIter_Check (C function): Iterator Protocol. (line 8) +* PyIter_Next (C function): Iterator Protocol. (line 21) +* PyIter_Send (C function): Iterator Protocol. (line 62) +* PYLAUNCHER_ALLOW_INSTALL: Windows<8>. (line 14) +* PYLAUNCHER_ALLOW_INSTALL <1>: Install on demand. (line 6) +* PYLAUNCHER_ALWAYS_INSTALL: Install on demand. (line 12) +* PYLAUNCHER_DEBUG: Diagnostics. (line 6) +* PYLAUNCHER_DRYRUN: Dry Run. (line 6) +* PYLAUNCHER_DRYRUN <1>: Install on demand. (line 14) +* PYLAUNCHER_NO_SEARCH_PATH: Shebang Lines. (line 57) +* PyListObject (C type): List Objects. (line 6) +* PyList_Append (C function): List Objects. (line 91) +* PyList_AsTuple (C function): List Objects. (line 124) +* PyList_Check (C function): List Objects. (line 16) +* PyList_CheckExact (C function): List Objects. (line 21) +* PyList_GetItem (C function): List Objects. (line 47) +* PyList_GetItem(): Reference Count Details. + (line 117) +* PyList_GetSlice (C function): List Objects. (line 97) +* PyList_GET_ITEM (C function): List Objects. (line 56) +* PyList_GET_SIZE (C function): List Objects. (line 43) +* PyList_Insert (C function): List Objects. (line 84) +* PyList_New (C function): List Objects. (line 26) +* PyList_Reverse (C function): List Objects. (line 119) +* PyList_SetItem (C function): List Objects. (line 61) +* PyList_SetItem(): Reference Count Details. + (line 26) +* PyList_SetSlice (C function): List Objects. (line 105) +* PyList_SET_ITEM (C function): List Objects. (line 72) +* PyList_Size (C function): List Objects. (line 37) +* PyList_Sort (C function): List Objects. (line 114) +* PyList_Type (C var): List Objects. (line 11) +* PyLongObject (C type): Integer Objects. (line 13) +* PyLong_AsDouble (C function): Integer Objects. (line 270) +* PyLong_AsLong (C function): Integer Objects. (line 104) +* PyLong_AsLongAndOverflow (C function): Integer Objects. (line 122) +* PyLong_AsLongLong (C function): Integer Objects. (line 142) +* PyLong_AsLongLongAndOverflow (C function): Integer Objects. + (line 160) +* PyLong_AsSize_t (C function): Integer Objects. (line 207) +* PyLong_AsSsize_t (C function): Integer Objects. (line 182) +* PyLong_AsUnsignedLong (C function): Integer Objects. (line 195) +* PyLong_AsUnsignedLongLong (C function): Integer Objects. (line 219) +* PyLong_AsUnsignedLongLongMask (C function): Integer Objects. + (line 252) +* PyLong_AsUnsignedLongMask (C function): Integer Objects. (line 235) +* PyLong_AsVoidPtr (C function): Integer Objects. (line 281) +* PyLong_Check (C function): Integer Objects. (line 22) +* PyLong_CheckExact (C function): Integer Objects. (line 28) +* PyLong_FromDouble (C function): Integer Objects. (line 71) +* PyLong_FromLong (C function): Integer Objects. (line 34) +* PyLong_FromLongLong (C function): Integer Objects. (line 60) +* PyLong_FromSize_t (C function): Integer Objects. (line 55) +* PyLong_FromSsize_t (C function): Integer Objects. (line 50) +* PyLong_FromString (C function): Integer Objects. (line 76) +* PyLong_FromUnicodeObject (C function): Integer Objects. (line 91) +* PyLong_FromUnsignedLong (C function): Integer Objects. (line 44) +* PyLong_FromUnsignedLongLong (C function): Integer Objects. (line 65) +* PyLong_FromVoidPtr (C function): Integer Objects. (line 98) +* PyLong_Type (C var): Integer Objects. (line 17) +* PyMappingMethods (C type): Mapping Object Structures. + (line 6) +* PyMappingMethods.mp_ass_subscript (C member): Mapping Object Structures. + (line 27) +* PyMappingMethods.mp_length (C member): Mapping Object Structures. + (line 11) +* PyMappingMethods.mp_subscript (C member): Mapping Object Structures. + (line 18) +* PyMapping_Check (C function): Mapping Protocol. (line 9) +* PyMapping_DelItem (C function): Mapping Protocol. (line 39) +* PyMapping_DelItemString (C function): Mapping Protocol. (line 45) +* PyMapping_GetItemString (C function): Mapping Protocol. (line 24) +* PyMapping_HasKey (C function): Mapping Protocol. (line 52) +* PyMapping_HasKeyString (C function): Mapping Protocol. (line 61) +* PyMapping_Items (C function): Mapping Protocol. (line 88) +* PyMapping_Keys (C function): Mapping Protocol. (line 72) +* PyMapping_Length (C function): Mapping Protocol. (line 17) +* PyMapping_SetItemString (C function): Mapping Protocol. (line 31) +* PyMapping_Size (C function): Mapping Protocol. (line 17) +* PyMapping_Values (C function): Mapping Protocol. (line 80) +* PyMarshal_ReadLastObjectFromFile (C function): Data marshalling support. + (line 68) +* PyMarshal_ReadLongFromFile (C function): Data marshalling support. + (line 41) +* PyMarshal_ReadObjectFromFile (C function): Data marshalling support. + (line 59) +* PyMarshal_ReadObjectFromString (C function): Data marshalling support. + (line 84) +* PyMarshal_ReadShortFromFile (C function): Data marshalling support. + (line 50) +* PyMarshal_WriteLongToFile (C function): Data marshalling support. + (line 20) +* PyMarshal_WriteObjectToFile (C function): Data marshalling support. + (line 27) +* PyMarshal_WriteObjectToString (C function): Data marshalling support. + (line 33) +* PyMemAllocatorDomain (C type): Customize Memory Allocators. + (line 36) +* PyMemAllocatorDomain.PYMEM_DOMAIN_MEM (C macro): Customize Memory Allocators. + (line 52) +* PyMemAllocatorDomain.PYMEM_DOMAIN_OBJ (C macro): Customize Memory Allocators. + (line 64) +* PyMemAllocatorDomain.PYMEM_DOMAIN_RAW (C macro): Customize Memory Allocators. + (line 40) +* PyMemAllocatorEx (C type): Customize Memory Allocators. + (line 8) +* PyMemberDef (C type): Accessing attributes of extension types. + (line 6) +* PyMember_GetOne (C function): Accessing attributes of extension types. + (line 120) +* PyMember_SetOne (C function): Accessing attributes of extension types. + (line 127) +* PyMemoryView_Check (C function): MemoryView objects. (line 43) +* PyMemoryView_FromBuffer (C function): MemoryView objects. (line 27) +* PyMemoryView_FromMemory (C function): MemoryView objects. (line 18) +* PyMemoryView_FromObject (C function): MemoryView objects. (line 10) +* PyMemoryView_GetContiguous (C function): MemoryView objects. + (line 34) +* PyMemoryView_GET_BASE (C function): MemoryView objects. (line 57) +* PyMemoryView_GET_BUFFER (C function): MemoryView objects. (line 49) +* PyMem_Calloc (C function): Memory Interface. (line 28) +* PyMem_Del (C function): Memory Interface. (line 84) +* PyMem_Free (C function): Memory Interface. (line 56) +* PyMem_GetAllocator (C function): Customize Memory Allocators. + (line 76) +* PyMem_Malloc (C function): Memory Interface. (line 19) +* PyMem_New (C function): Memory Interface. (line 68) +* PyMem_RawCalloc (C function): Raw Memory Interface. + (line 24) +* PyMem_RawFree (C function): Raw Memory Interface. + (line 53) +* PyMem_RawMalloc (C function): Raw Memory Interface. + (line 15) +* PyMem_RawRealloc (C function): Raw Memory Interface. + (line 36) +* PyMem_Realloc (C function): Memory Interface. (line 40) +* PyMem_Resize (C function): Memory Interface. (line 74) +* PyMem_SetAllocator (C function): Customize Memory Allocators. + (line 81) +* PyMem_SetupDebugHooks (C function): Customize Memory Allocators. + (line 100) +* PyMethodDef (C type): Implementing functions and methods. + (line 63) +* PyMethod_Check (C function): Method Objects<2>. (line 16) +* PyMethod_Function (C function): Method Objects<2>. (line 29) +* PyMethod_GET_FUNCTION (C function): Method Objects<2>. (line 33) +* PyMethod_GET_SELF (C function): Method Objects<2>. (line 42) +* PyMethod_New (C function): Method Objects<2>. (line 22) +* PyMethod_Self (C function): Method Objects<2>. (line 38) +* PyMethod_Type (C var): Method Objects<2>. (line 10) +* PyModuleDef (C type): Initializing C modules. + (line 17) +* PyModuleDef.m_base (C member): Initializing C modules. + (line 23) +* PyModuleDef.m_clear (C member): Initializing C modules. + (line 91) +* PyModuleDef.m_doc (C member): Initializing C modules. + (line 31) +* PyModuleDef.m_free (C member): Initializing C modules. + (line 113) +* PyModuleDef.m_methods (C member): Initializing C modules. + (line 58) +* PyModuleDef.m_name (C member): Initializing C modules. + (line 27) +* PyModuleDef.m_size (C member): Initializing C modules. + (line 36) +* PyModuleDef.m_slots (C member): Initializing C modules. + (line 64) +* PyModuleDef.m_slots.m_reload (C member): Initializing C modules. + (line 73) +* PyModuleDef.m_traverse (C member): Initializing C modules. + (line 75) +* PyModuleDef_Init (C function): Multi-phase initialization. + (line 33) +* PyModuleDef_Slot (C type): Multi-phase initialization. + (line 47) +* PyModuleDef_Slot.slot (C member): Multi-phase initialization. + (line 49) +* PyModuleDef_Slot.value (C member): Multi-phase initialization. + (line 53) +* PyModule_AddFunctions (C function): Low-level module creation functions. + (line 51) +* PyModule_AddIntConstant (C function): Support functions. (line 108) +* PyModule_AddIntMacro (C function): Support functions. (line 122) +* PyModule_AddObject (C function): Support functions. (line 54) +* PyModule_AddObjectRef (C function): Support functions. (line 11) +* PyModule_AddStringConstant (C function): Support functions. + (line 115) +* PyModule_AddStringMacro (C function): Support functions. (line 129) +* PyModule_AddType (C function): Support functions. (line 133) +* PyModule_Check (C function): Module Objects. (line 13) +* PyModule_CheckExact (C function): Module Objects. (line 18) +* PyModule_Create (C function): Single-phase initialization. + (line 10) +* PyModule_Create2 (C function): Single-phase initialization. + (line 16) +* PyModule_ExecDef (C function): Low-level module creation functions. + (line 35) +* PyModule_FromDefAndSpec (C function): Low-level module creation functions. + (line 11) +* PyModule_FromDefAndSpec2 (C function): Low-level module creation functions. + (line 20) +* PyModule_GetDef (C function): Module Objects. (line 81) +* PyModule_GetDict (C function): Module Objects. (line 44) +* PyModule_GetFilename (C function): Module Objects. (line 100) +* PyModule_GetFilenameObject (C function): Module Objects. (line 87) +* PyModule_GetName (C function): Module Objects. (line 70) +* PyModule_GetNameObject (C function): Module Objects. (line 59) +* PyModule_GetState (C function): Module Objects. (line 75) +* PyModule_New (C function): Module Objects. (line 39) +* PyModule_NewObject (C function): Module Objects. (line 23) +* PyModule_SetDocString (C function): Low-level module creation functions. + (line 42) +* PyModule_Type (C var): Module Objects. (line 6) +* PyNumberMethods (C type): Number Object Structures. + (line 6) +* PyNumberMethods.nb_absolute (C member): Number Object Structures. + (line 93) +* PyNumberMethods.nb_add (C member): Number Object Structures. + (line 70) +* PyNumberMethods.nb_and (C member): Number Object Structures. + (line 107) +* PyNumberMethods.nb_bool (C member): Number Object Structures. + (line 96) +* PyNumberMethods.nb_divmod (C member): Number Object Structures. + (line 81) +* PyNumberMethods.nb_float (C member): Number Object Structures. + (line 117) +* PyNumberMethods.nb_floor_divide (C member): Number Object Structures. + (line 150) +* PyNumberMethods.nb_index (C member): Number Object Structures. + (line 162) +* PyNumberMethods.nb_inplace_add (C member): Number Object Structures. + (line 120) +* PyNumberMethods.nb_inplace_and (C member): Number Object Structures. + (line 141) +* PyNumberMethods.nb_inplace_floor_divide (C member): Number Object Structures. + (line 156) +* PyNumberMethods.nb_inplace_lshift (C member): Number Object Structures. + (line 135) +* PyNumberMethods.nb_inplace_matrix_multiply (C member): Number Object Structures. + (line 168) +* PyNumberMethods.nb_inplace_multiply (C member): Number Object Structures. + (line 126) +* PyNumberMethods.nb_inplace_or (C member): Number Object Structures. + (line 147) +* PyNumberMethods.nb_inplace_power (C member): Number Object Structures. + (line 132) +* PyNumberMethods.nb_inplace_remainder (C member): Number Object Structures. + (line 129) +* PyNumberMethods.nb_inplace_rshift (C member): Number Object Structures. + (line 138) +* PyNumberMethods.nb_inplace_subtract (C member): Number Object Structures. + (line 123) +* PyNumberMethods.nb_inplace_true_divide (C member): Number Object Structures. + (line 159) +* PyNumberMethods.nb_inplace_xor (C member): Number Object Structures. + (line 144) +* PyNumberMethods.nb_int (C member): Number Object Structures. + (line 113) +* PyNumberMethods.nb_invert (C member): Number Object Structures. + (line 98) +* PyNumberMethods.nb_lshift (C member): Number Object Structures. + (line 101) +* PyNumberMethods.nb_matrix_multiply (C member): Number Object Structures. + (line 165) +* PyNumberMethods.nb_multiply (C member): Number Object Structures. + (line 75) +* PyNumberMethods.nb_negative (C member): Number Object Structures. + (line 87) +* PyNumberMethods.nb_or (C member): Number Object Structures. + (line 111) +* PyNumberMethods.nb_positive (C member): Number Object Structures. + (line 90) +* PyNumberMethods.nb_power (C member): Number Object Structures. + (line 84) +* PyNumberMethods.nb_remainder (C member): Number Object Structures. + (line 78) +* PyNumberMethods.nb_reserved (C member): Number Object Structures. + (line 115) +* PyNumberMethods.nb_rshift (C member): Number Object Structures. + (line 104) +* PyNumberMethods.nb_subtract (C member): Number Object Structures. + (line 72) +* PyNumberMethods.nb_true_divide (C member): Number Object Structures. + (line 153) +* PyNumberMethods.nb_xor (C member): Number Object Structures. + (line 109) +* PyNumber_Absolute (C function): Number Protocol. (line 98) +* PyNumber_Add (C function): Number Protocol. (line 13) +* PyNumber_And (C function): Number Protocol. (line 124) +* PyNumber_AsSsize_t (C function): Number Protocol. (line 291) +* PyNumber_Check (C function): Number Protocol. (line 6) +* PyNumber_Divmod (C function): Number Protocol. (line 68) +* PyNumber_Float (C function): Number Protocol. (line 264) +* PyNumber_FloorDivide (C function): Number Protocol. (line 43) +* PyNumber_Index (C function): Number Protocol. (line 272) +* PyNumber_InPlaceAdd (C function): Number Protocol. (line 145) +* PyNumber_InPlaceAnd (C function): Number Protocol. (line 232) +* PyNumber_InPlaceFloorDivide (C function): Number Protocol. (line 176) +* PyNumber_InPlaceLshift (C function): Number Protocol. (line 216) +* PyNumber_InPlaceMatrixMultiply (C function): Number Protocol. + (line 166) +* PyNumber_InPlaceMultiply (C function): Number Protocol. (line 159) +* PyNumber_InPlaceOr (C function): Number Protocol. (line 248) +* PyNumber_InPlacePower (C function): Number Protocol. (line 203) +* PyNumber_InPlaceRemainder (C function): Number Protocol. (line 196) +* PyNumber_InPlaceRshift (C function): Number Protocol. (line 224) +* PyNumber_InPlaceSubtract (C function): Number Protocol. (line 152) +* PyNumber_InPlaceTrueDivide (C function): Number Protocol. (line 184) +* PyNumber_InPlaceXor (C function): Number Protocol. (line 240) +* PyNumber_Invert (C function): Number Protocol. (line 105) +* PyNumber_Long (C function): Number Protocol. (line 256) +* PyNumber_Lshift (C function): Number Protocol. (line 110) +* PyNumber_MatrixMultiply (C function): Number Protocol. (line 34) +* PyNumber_Multiply (C function): Number Protocol. (line 27) +* PyNumber_Negative (C function): Number Protocol. (line 88) +* PyNumber_Or (C function): Number Protocol. (line 138) +* PyNumber_Positive (C function): Number Protocol. (line 93) +* PyNumber_Power (C function): Number Protocol. (line 77) +* PyNumber_Remainder (C function): Number Protocol. (line 61) +* PyNumber_Rshift (C function): Number Protocol. (line 117) +* PyNumber_Subtract (C function): Number Protocol. (line 20) +* PyNumber_ToBase (C function): Number Protocol. (line 281) +* PyNumber_TrueDivide (C function): Number Protocol. (line 50) +* PyNumber_Xor (C function): Number Protocol. (line 131) +* PyObject (C type): Base object types and macros. + (line 13) +* PyObject.ob_refcnt (C member): PyObject Slots. (line 13) +* PyObject.ob_type (C member): PyObject Slots. (line 26) +* PyObject._ob_next (C member): PyObject Slots. (line 49) +* PyObject._ob_prev (C member): PyObject Slots. (line 49) +* PyObjectArenaAllocator (C type): Customize pymalloc Arena Allocator. + (line 8) +* PyObject_AsCharBuffer (C function): Old Buffer Protocol. + (line 21) +* PyObject_ASCII (C function): Object Protocol. (line 193) +* PyObject_AsFileDescriptor (C function): File Objects. (line 33) +* PyObject_AsReadBuffer (C function): Old Buffer Protocol. + (line 30) +* PyObject_AsWriteBuffer (C function): Old Buffer Protocol. + (line 49) +* PyObject_Bytes (C function): Object Protocol. (line 216) +* PyObject_Call (C function): Object Calling API. (line 57) +* PyObject_CallFunction (C function): Object Calling API. (line 108) +* PyObject_CallFunctionObjArgs (C function): Object Calling API. + (line 149) +* PyObject_CallMethod (C function): Object Calling API. (line 127) +* PyObject_CallMethodNoArgs (C function): Object Calling API. + (line 174) +* PyObject_CallMethodObjArgs (C function): Object Calling API. + (line 162) +* PyObject_CallMethodOneArg (C function): Object Calling API. + (line 186) +* PyObject_CallNoArgs (C function): Object Calling API. (line 73) +* PyObject_CallObject (C function): Object Calling API. (line 96) +* PyObject_CallObject(): Calling Python Functions from C. + (line 64) +* PyObject_Calloc (C function): Object allocators. (line 30) +* PyObject_CallOneArg (C function): Object Calling API. (line 85) +* PyObject_CheckBuffer (C function): Buffer-related functions. + (line 6) +* PyObject_CheckReadBuffer (C function): Old Buffer Protocol. + (line 39) +* PyObject_CopyData (C function): Buffer-related functions. + (line 79) +* PyObject_Del (C function): Allocating Objects on the Heap. + (line 48) +* PyObject_DelAttr (C function): Object Protocol. (line 108) +* PyObject_DelAttrString (C function): Object Protocol. (line 114) +* PyObject_DelItem (C function): Object Protocol. (line 348) +* PyObject_Dir (C function): Object Protocol. (line 353) +* PyObject_Free (C function): Object allocators. (line 58) +* PyObject_GC_Del (C function): Supporting Cyclic Garbage Collection. + (line 110) +* PyObject_GC_IsFinalized (C function): Supporting Cyclic Garbage Collection. + (line 100) +* PyObject_GC_IsTracked (C function): Supporting Cyclic Garbage Collection. + (line 90) +* PyObject_GC_New (C function): Supporting Cyclic Garbage Collection. + (line 56) +* PyObject_GC_NewVar (C function): Supporting Cyclic Garbage Collection. + (line 61) +* PyObject_GC_Resize (C function): Supporting Cyclic Garbage Collection. + (line 67) +* PyObject_GC_Track (C function): Supporting Cyclic Garbage Collection. + (line 74) +* PyObject_GC_UnTrack (C function): Supporting Cyclic Garbage Collection. + (line 115) +* PyObject_GenericGetAttr (C function): Object Protocol. (line 61) +* PyObject_GenericGetDict (C function): Object Protocol. (line 121) +* PyObject_GenericSetAttr (C function): Object Protocol. (line 96) +* PyObject_GenericSetDict (C function): Object Protocol. (line 137) +* PyObject_GetAIter (C function): Object Protocol. (line 371) +* PyObject_GetArenaAllocator (C function): Customize pymalloc Arena Allocator. + (line 26) +* PyObject_GetAttr (C function): Object Protocol. (line 47) +* PyObject_GetAttrString (C function): Object Protocol. (line 54) +* PyObject_GetBuffer (C function): Buffer-related functions. + (line 12) +* PyObject_GetItem (C function): Object Protocol. (line 334) +* PyObject_GetIter (C function): Object Protocol. (line 363) +* PyObject_HasAttr (C function): Object Protocol. (line 25) +* PyObject_HasAttrString (C function): Object Protocol. (line 35) +* PyObject_Hash (C function): Object Protocol. (line 267) +* PyObject_HashNotImplemented (C function): Object Protocol. (line 277) +* PyObject_HEAD (C macro): Base object types and macros. + (line 34) +* PyObject_HEAD_INIT (C macro): Base object types and macros. + (line 141) +* PyObject_Init (C function): Allocating Objects on the Heap. + (line 13) +* PyObject_InitVar (C function): Allocating Objects on the Heap. + (line 22) +* PyObject_IsInstance (C function): Object Protocol. (line 246) +* PyObject_IsSubclass (C function): Object Protocol. (line 226) +* PyObject_IsTrue (C function): Object Protocol. (line 284) +* PyObject_IS_GC (C function): Supporting Cyclic Garbage Collection. + (line 82) +* PyObject_Length (C function): Object Protocol. (line 314) +* PyObject_LengthHint (C function): Object Protocol. (line 323) +* PyObject_Malloc (C function): Object allocators. (line 21) +* PyObject_New (C function): Allocating Objects on the Heap. + (line 28) +* PyObject_NewVar (C function): Allocating Objects on the Heap. + (line 36) +* PyObject_Not (C function): Object Protocol. (line 290) +* PyObject_Print (C function): Object Protocol. (line 17) +* PyObject_Realloc (C function): Object allocators. (line 42) +* PyObject_Repr (C function): Object Protocol. (line 180) +* PyObject_RichCompare (C function): Object Protocol. (line 155) +* PyObject_RichCompareBool (C function): Object Protocol. (line 166) +* PyObject_SetArenaAllocator (C function): Customize pymalloc Arena Allocator. + (line 31) +* PyObject_SetAttr (C function): Object Protocol. (line 73) +* PyObject_SetAttrString (C function): Object Protocol. (line 85) +* PyObject_SetItem (C function): Object Protocol. (line 341) +* PyObject_Size (C function): Object Protocol. (line 314) +* PyObject_Str (C function): Object Protocol. (line 204) +* PyObject_Type (C function): Object Protocol. (line 296) +* PyObject_TypeCheck (C function): Object Protocol. (line 309) +* PyObject_VAR_HEAD (C macro): Base object types and macros. + (line 44) +* PyObject_Vectorcall (C function): Object Calling API. (line 198) +* PyObject_VectorcallDict (C function): Object Calling API. (line 212) +* PyObject_VectorcallMethod (C function): Object Calling API. + (line 228) +* PyOS_AfterFork (C function): Operating System Utilities. + (line 77) +* PyOS_AfterFork_Child (C function): Operating System Utilities. + (line 54) +* PyOS_AfterFork_Parent (C function): Operating System Utilities. + (line 40) +* PyOS_BeforeFork (C function): Operating System Utilities. + (line 27) +* PyOS_CheckStack (C function): Operating System Utilities. + (line 87) +* PyOS_double_to_string (C function): String conversion and formatting. + (line 81) +* PyOS_FSPath (C function): Operating System Utilities. + (line 6) +* PyOS_getsig (C function): Operating System Utilities. + (line 96) +* PyOS_InputHook (C var): The Very High Level Layer. + (line 159) +* PyOS_ReadlineFunctionPointer (C var): The Very High Level Layer. + (line 168) +* PyOS_setsig (C function): Operating System Utilities. + (line 102) +* PyOS_snprintf (C function): String conversion and formatting. + (line 8) +* PyOS_stricmp (C function): String conversion and formatting. + (line 115) +* PyOS_string_to_double (C function): String conversion and formatting. + (line 48) +* PyOS_strnicmp (C function): String conversion and formatting. + (line 120) +* PyOS_vsnprintf (C function): String conversion and formatting. + (line 14) +* PyPI; (see Python Package Index (PyPI)): Installing the tools. + (line 25) +* PyPreConfig (C type): PyPreConfig. (line 6) +* PyPreConfig.allocator (C member): PyPreConfig. (line 26) +* PyPreConfig.coerce_c_locale (C member): PyPreConfig. (line 71) +* PyPreConfig.coerce_c_locale_warn (C member): PyPreConfig. (line 82) +* PyPreConfig.configure_locale (C member): PyPreConfig. (line 60) +* PyPreConfig.dev_mode (C member): PyPreConfig. (line 88) +* PyPreConfig.isolated (C member): PyPreConfig. (line 95) +* PyPreConfig.legacy_windows_fs_encoding (C member): PyPreConfig. + (line 101) +* PyPreConfig.parse_argv (C member): PyPreConfig. (line 121) +* PyPreConfig.PyPreConfig_InitIsolatedConfig (C function): PyPreConfig. + (line 18) +* PyPreConfig.PyPreConfig_InitPythonConfig (C function): PyPreConfig. + (line 12) +* PyPreConfig.use_environment (C member): PyPreConfig. (line 130) +* PyPreConfig.utf8_mode (C member): PyPreConfig. (line 137) +* PyProperty_Type (C var): Descriptor Objects. (line 9) +* PyRun_AnyFile (C function): The Very High Level Layer. + (line 47) +* PyRun_AnyFileEx (C function): The Very High Level Layer. + (line 59) +* PyRun_AnyFileExFlags (C function): The Very High Level Layer. + (line 65) +* PyRun_AnyFileFlags (C function): The Very High Level Layer. + (line 53) +* PyRun_File (C function): The Very High Level Layer. + (line 208) +* PyRun_FileEx (C function): The Very High Level Layer. + (line 214) +* PyRun_FileExFlags (C function): The Very High Level Layer. + (line 228) +* PyRun_FileFlags (C function): The Very High Level Layer. + (line 221) +* PyRun_InteractiveLoop (C function): The Very High Level Layer. + (line 143) +* PyRun_InteractiveLoopFlags (C function): The Very High Level Layer. + (line 150) +* PyRun_InteractiveOne (C function): The Very High Level Layer. + (line 122) +* PyRun_InteractiveOneFlags (C function): The Very High Level Layer. + (line 129) +* PyRun_SimpleFile (C function): The Very High Level Layer. + (line 97) +* PyRun_SimpleFileEx (C function): The Very High Level Layer. + (line 103) +* PyRun_SimpleFileExFlags (C function): The Very High Level Layer. + (line 109) +* PyRun_SimpleString (C function): The Very High Level Layer. + (line 77) +* PyRun_SimpleStringFlags (C function): The Very High Level Layer. + (line 83) +* PyRun_String (C function): The Very High Level Layer. + (line 189) +* PyRun_StringFlags (C function): The Very High Level Layer. + (line 195) +* PySendResult (C type): Iterator Protocol. (line 55) +* PySeqIter_Check (C function): Iterator Objects. (line 18) +* PySeqIter_New (C function): Iterator Objects. (line 23) +* PySeqIter_Type (C var): Iterator Objects. (line 12) +* PySequenceMethods (C type): Sequence Object Structures. + (line 6) +* PySequenceMethods.sq_ass_item (C member): Sequence Object Structures. + (line 49) +* PySequenceMethods.sq_concat (C member): Sequence Object Structures. + (line 19) +* PySequenceMethods.sq_contains (C member): Sequence Object Structures. + (line 59) +* PySequenceMethods.sq_inplace_concat (C member): Sequence Object Structures. + (line 67) +* PySequenceMethods.sq_inplace_repeat (C member): Sequence Object Structures. + (line 78) +* PySequenceMethods.sq_item (C member): Sequence Object Structures. + (line 34) +* PySequenceMethods.sq_length (C member): Sequence Object Structures. + (line 11) +* PySequenceMethods.sq_repeat (C member): Sequence Object Structures. + (line 26) +* PySequence_Check (C function): Sequence Protocol. (line 6) +* PySequence_Concat (C function): Sequence Protocol. (line 21) +* PySequence_Contains (C function): Sequence Protocol. (line 99) +* PySequence_Count (C function): Sequence Protocol. (line 92) +* PySequence_DelItem (C function): Sequence Protocol. (line 75) +* PySequence_DelSlice (C function): Sequence Protocol. (line 86) +* PySequence_Fast (C function): Sequence Protocol. (line 128) +* PySequence_Fast_GET_ITEM (C function): Sequence Protocol. (line 152) +* PySequence_Fast_GET_SIZE (C function): Sequence Protocol. (line 143) +* PySequence_Fast_ITEMS (C function): Sequence Protocol. (line 158) +* PySequence_GetItem (C function): Sequence Protocol. (line 51) +* PySequence_GetItem(): Reference Count Details. + (line 117) +* PySequence_GetSlice (C function): Sequence Protocol. (line 57) +* PySequence_Index (C function): Sequence Protocol. (line 105) +* PySequence_InPlaceConcat (C function): Sequence Protocol. (line 35) +* PySequence_InPlaceRepeat (C function): Sequence Protocol. (line 43) +* PySequence_ITEM (C function): Sequence Protocol. (line 169) +* PySequence_Length (C function): Sequence Protocol. (line 14) +* PySequence_List (C function): Sequence Protocol. (line 111) +* PySequence_Repeat (C function): Sequence Protocol. (line 28) +* PySequence_SetItem (C function): Sequence Protocol. (line 64) +* PySequence_SetSlice (C function): Sequence Protocol. (line 80) +* PySequence_Size (C function): Sequence Protocol. (line 14) +* PySequence_Tuple (C function): Sequence Protocol. (line 118) +* PySetObject (C type): Set Objects. (line 19) +* PySet_Add (C function): Set Objects. (line 119) +* PySet_Check (C function): Set Objects. (line 44) +* PySet_CheckExact (C function): Set Objects. (line 60) +* PySet_Clear (C function): Set Objects. (line 152) +* PySet_Contains (C function): Set Objects. (line 110) +* PySet_Discard (C function): Set Objects. (line 134) +* PySet_GET_SIZE (C function): Set Objects. (line 106) +* PySet_New (C function): Set Objects. (line 78) +* PySet_Pop (C function): Set Objects. (line 144) +* PySet_Size (C function): Set Objects. (line 98) +* PySet_Type (C var): Set Objects. (line 31) +* PySignal_SetWakeupFd (C function): Signal Handling<2>. (line 67) +* PySlice_AdjustIndices (C function): Slice Objects. (line 97) +* PySlice_Check (C function): Slice Objects. (line 11) +* PySlice_GetIndices (C function): Slice Objects. (line 26) +* PySlice_GetIndicesEx (C function): Slice Objects. (line 42) +* PySlice_New (C function): Slice Objects. (line 16) +* PySlice_Type (C var): Slice Objects. (line 6) +* PySlice_Unpack (C function): Slice Objects. (line 84) +* PyState_AddModule (C function): Module lookup. (line 25) +* PyState_FindModule (C function): Module lookup. (line 15) +* PyState_RemoveModule (C function): Module lookup. (line 49) +* PyStatus (C type): PyStatus. (line 6) +* PyStatus.err_msg (C member): PyStatus. (line 20) +* PyStatus.exitcode (C member): PyStatus. (line 16) +* PyStatus.func (C member): PyStatus. (line 24) +* PyStatus.PyStatus_Error (C function): PyStatus. (line 34) +* PyStatus.PyStatus_Exception (C function): PyStatus. (line 51) +* PyStatus.PyStatus_Exit (C function): PyStatus. (line 45) +* PyStatus.PyStatus_IsError (C function): PyStatus. (line 57) +* PyStatus.PyStatus_IsExit (C function): PyStatus. (line 61) +* PyStatus.PyStatus_NoMemory (C function): PyStatus. (line 41) +* PyStatus.PyStatus_Ok (C function): PyStatus. (line 30) +* PyStatus.Py_ExitStatusException (C function): PyStatus. (line 65) +* PyStructSequence_Desc (C type): Struct Sequence Objects. + (line 31) +* PyStructSequence_Field (C type): Struct Sequence Objects. + (line 54) +* PyStructSequence_GetItem (C function): Struct Sequence Objects. + (line 86) +* PyStructSequence_GET_ITEM (C function): Struct Sequence Objects. + (line 92) +* PyStructSequence_InitType (C function): Struct Sequence Objects. + (line 18) +* PyStructSequence_InitType2 (C function): Struct Sequence Objects. + (line 23) +* PyStructSequence_New (C function): Struct Sequence Objects. + (line 80) +* PyStructSequence_NewType (C function): Struct Sequence Objects. + (line 11) +* PyStructSequence_SetItem (C function): Struct Sequence Objects. + (line 97) +* PyStructSequence_SET_ITEM (C function): Struct Sequence Objects. + (line 106) +* PyStructSequence_UnnamedField (C var): Struct Sequence Objects. + (line 74) +* PySys_AddAuditHook (C function): System Functions. (line 154) +* PySys_AddWarnOption (C function): System Functions. (line 27) +* PySys_AddWarnOptionUnicode (C function): System Functions. (line 39) +* PySys_AddXOption (C function): System Functions. (line 104) +* PySys_Audit (C function): System Functions. (line 127) +* PySys_FormatStderr (C function): System Functions. (line 97) +* PySys_FormatStdout (C function): System Functions. (line 89) +* PySys_GetObject (C function): System Functions. (line 11) +* PySys_GetXOptions (C function): System Functions. (line 119) +* PySys_ResetWarnOptions (C function): System Functions. (line 22) +* PySys_SetArgv (C function): Process-wide parameters. + (line 322) +* PySys_SetArgv(): Initializing and finalizing the interpreter. + (line 7) +* PySys_SetArgvEx (C function): Process-wide parameters. + (line 269) +* PySys_SetArgvEx(): Initializing and finalizing the interpreter. + (line 7) +* PySys_SetObject (C function): System Functions. (line 16) +* PySys_SetPath (C function): System Functions. (line 55) +* PySys_WriteStderr (C function): System Functions. (line 84) +* PySys_WriteStdout (C function): System Functions. (line 67) +* Python 3000: Glossary. (line 1146) +* Python Editor: IDLE<52>. (line 8) +* Python Enhancement Proposals; PEP 1: New Development Process. + (line 67) +* Python Enhancement Proposals; PEP 1 <1>: New Development Process. + (line 82) +* Python Enhancement Proposals; PEP 1 <2>: Glossary. (line 1112) +* Python Enhancement Proposals; PEP 100: Unicode<2>. (line 15) +* Python Enhancement Proposals; PEP 11: Build Changes. (line 6) +* Python Enhancement Proposals; PEP 11 <1>: PEP 538 Legacy C Locale Coercion. + (line 19) +* Python Enhancement Proposals; PEP 11 <2>: Unsupported Operating Systems. + (line 6) +* Python Enhancement Proposals; PEP 11 <3>: Library Changes. (line 15) +* Python Enhancement Proposals; PEP 11 <4>: Build<3>. (line 22) +* Python Enhancement Proposals; PEP 11 <5>: Build<5>. (line 15) +* Python Enhancement Proposals; PEP 11 <6>: Build<43>. (line 14) +* Python Enhancement Proposals; PEP 11 <7>: Using Python on Windows. + (line 18) +* Python Enhancement Proposals; PEP 11 <8>: Other Platforms. (line 8) +* Python Enhancement Proposals; PEP 11#tier-3: Build Changes. + (line 6) +* Python Enhancement Proposals; PEP 201: New Development Process. + (line 86) +* Python Enhancement Proposals; PEP 205: PEP 205 Weak References. + (line 82) +* Python Enhancement Proposals; PEP 205 <1>: weakref — Weak references. + (line 321) +* Python Enhancement Proposals; PEP 207: PEP 207 Rich Comparisons. + (line 71) +* Python Enhancement Proposals; PEP 207 <1>: PEP 207 Rich Comparisons. + (line 77) +* Python Enhancement Proposals; PEP 208: PEP 208 New Coercion Model. + (line 30) +* Python Enhancement Proposals; PEP 217: PEP 217 Interactive Display Hook. + (line 27) +* Python Enhancement Proposals; PEP 218: PEP 218 Built-In Set Objects. + (line 50) +* Python Enhancement Proposals; PEP 218 <1>: Other Language Changes<15>. + (line 12) +* Python Enhancement Proposals; PEP 218 <2>: PEP 218 A Standard Set Datatype. + (line 80) +* Python Enhancement Proposals; PEP 227: PEP 227 Nested Scopes. + (line 96) +* Python Enhancement Proposals; PEP 227 <1>: PEP 227 Nested Scopes<2>. + (line 96) +* Python Enhancement Proposals; PEP 227 <2>: __future__ — Future statement definitions. + (line 71) +* Python Enhancement Proposals; PEP 229: PEP 229 New Build System. + (line 39) +* Python Enhancement Proposals; PEP 230: PEP 230 Warning Framework. + (line 73) +* Python Enhancement Proposals; PEP 232: PEP 232 Function Attributes. + (line 36) +* Python Enhancement Proposals; PEP 234: PEP 234 Iterators. (line 123) +* Python Enhancement Proposals; PEP 235: Introduction<10>. (line 51) +* Python Enhancement Proposals; PEP 236: PEP 227 Nested Scopes<2>. + (line 87) +* Python Enhancement Proposals; PEP 236 <1>: PEP 227 Nested Scopes<2>. + (line 88) +* Python Enhancement Proposals; PEP 236 <2>: PEP 236 __future__ Directives. + (line 29) +* Python Enhancement Proposals; PEP 236 <3>: Future statements. + (line 85) +* Python Enhancement Proposals; PEP 237: Integers. (line 6) +* Python Enhancement Proposals; PEP 237 <1>: PEP 237 Unifying Long Integers and Integers. + (line 22) +* Python Enhancement Proposals; PEP 237 <2>: Other Language Changes<15>. + (line 18) +* Python Enhancement Proposals; PEP 237 <3>: PEP 237 Unifying Long Integers and Integers<2>. + (line 37) +* Python Enhancement Proposals; PEP 237 <4>: printf-style String Formatting. + (line 182) +* Python Enhancement Proposals; PEP 237 <5>: printf-style Bytes Formatting. + (line 188) +* Python Enhancement Proposals; PEP 238: Integers. (line 10) +* Python Enhancement Proposals; PEP 238 <1>: PEP 238 Changing the Division Operator. + (line 21) +* Python Enhancement Proposals; PEP 238 <2>: PEP 238 Changing the Division Operator. + (line 27) +* Python Enhancement Proposals; PEP 238 <3>: PEP 238 Changing the Division Operator. + (line 68) +* Python Enhancement Proposals; PEP 238 <4>: __future__ — Future statement definitions. + (line 77) +* Python Enhancement Proposals; PEP 238 <5>: The Very High Level Layer. + (line 373) +* Python Enhancement Proposals; PEP 238 <6>: Glossary. (line 501) +* Python Enhancement Proposals; PEP 241: PEP 241 Metadata in Python Packages. + (line 16) +* Python Enhancement Proposals; PEP 241 <1>: PEP 241 Metadata in Python Packages. + (line 29) +* Python Enhancement Proposals; PEP 241 <2>: PEP 241 Metadata in Python Packages. + (line 36) +* Python Enhancement Proposals; PEP 243: PEP 241 Metadata in Python Packages. + (line 40) +* Python Enhancement Proposals; PEP 246: Documentation<5>. (line 6) +* Python Enhancement Proposals; PEP 246 <1>: PrepareProtocol objects. + (line 8) +* Python Enhancement Proposals; PEP 247: hmac<3>. (line 20) +* Python Enhancement Proposals; PEP 249: The sqlite3 package. + (line 18) +* Python Enhancement Proposals; PEP 249 <1>: The sqlite3 package. + (line 110) +* Python Enhancement Proposals; PEP 249 <2>: Library<8>. (line 296) +* Python Enhancement Proposals; PEP 249 <3>: sqlite3 — DB-API 2 0 interface for SQLite databases. + (line 16) +* Python Enhancement Proposals; PEP 249 <4>: sqlite3 — DB-API 2 0 interface for SQLite databases. + (line 43) +* Python Enhancement Proposals; PEP 249 <5>: Exceptions<6>. (line 6) +* Python Enhancement Proposals; PEP 249 <6>: Transaction control. + (line 7) +* Python Enhancement Proposals; PEP 252: Related Links. (line 17) +* Python Enhancement Proposals; PEP 252 <1>: Related Links. (line 17) +* Python Enhancement Proposals; PEP 252 <2>: Implementing Descriptors. + (line 24) +* Python Enhancement Proposals; PEP 253: Old and New Classes. + (line 28) +* Python Enhancement Proposals; PEP 253 <1>: Multiple Inheritance The Diamond Rule. + (line 8) +* Python Enhancement Proposals; PEP 253 <2>: Related Links. (line 17) +* Python Enhancement Proposals; PEP 253 <3>: Related Links. (line 19) +* Python Enhancement Proposals; PEP 253 <4>: Related Links. (line 21) +* Python Enhancement Proposals; PEP 255: PEP 255 Simple Generators. + (line 45) +* Python Enhancement Proposals; PEP 255 <1>: PEP 255 Simple Generators. + (line 131) +* Python Enhancement Proposals; PEP 255 <2>: PEP 255 Simple Generators<2>. + (line 43) +* Python Enhancement Proposals; PEP 255 <3>: PEP 255 Simple Generators<2>. + (line 129) +* Python Enhancement Proposals; PEP 255 <4>: Yield expressions. + (line 89) +* Python Enhancement Proposals; PEP 255 <5>: __future__ — Future statement definitions. + (line 74) +* Python Enhancement Proposals; PEP 261: Unicode Changes. (line 18) +* Python Enhancement Proposals; PEP 261 <1>: Unicode Changes. + (line 61) +* Python Enhancement Proposals; PEP 263: Other Language Changes<14>. + (line 99) +* Python Enhancement Proposals; PEP 263 <1>: PEP 263 Source Code Encodings. + (line 29) +* Python Enhancement Proposals; PEP 263 <2>: Core and Builtins<13>. + (line 84) +* Python Enhancement Proposals; PEP 263 <3>: Introduction<10>. + (line 55) +* Python Enhancement Proposals; PEP 263 <4>: Tokenizing Input. + (line 35) +* Python Enhancement Proposals; PEP 263 <5>: Tokenizing Input. + (line 89) +* Python Enhancement Proposals; PEP 263 <6>: Unicode Literals in Python Source Code. + (line 48) +* Python Enhancement Proposals; PEP 264: Other Changes and Fixes<3>. + (line 55) +* Python Enhancement Proposals; PEP 273: PEP 273 Importing Modules from ZIP Archives. + (line 41) +* Python Enhancement Proposals; PEP 273 <1>: PEP 273 Importing Modules from ZIP Archives. + (line 44) +* Python Enhancement Proposals; PEP 273 <2>: zipimport — Import modules from Zip archives. + (line 42) +* Python Enhancement Proposals; PEP 273 <3>: zipimport — Import modules from Zip archives. + (line 45) +* Python Enhancement Proposals; PEP 274: New Syntax. (line 38) +* Python Enhancement Proposals; PEP 277: PEP 277 Unicode file name support for Windows NT. + (line 32) +* Python Enhancement Proposals; PEP 278: PEP 278 Universal Newline Support. + (line 33) +* Python Enhancement Proposals; PEP 278 <1>: Glossary. (line 1375) +* Python Enhancement Proposals; PEP 279: PEP 279 enumerate. (line 27) +* Python Enhancement Proposals; PEP 282: PEP 282 The logging Package. + (line 101) +* Python Enhancement Proposals; PEP 282 <1>: PEP 282 The logging Package. + (line 107) +* Python Enhancement Proposals; PEP 282 <2>: Archiving operations. + (line 45) +* Python Enhancement Proposals; PEP 282 <3>: Integration with the warnings module. + (line 36) +* Python Enhancement Proposals; PEP 282 <4>: distutils log — Simple PEP 282-style logging. + (line 6) +* Python Enhancement Proposals; PEP 285: PEP 285 A Boolean Type. + (line 47) +* Python Enhancement Proposals; PEP 285 <1>: PEP 285 A Boolean Type. + (line 70) +* Python Enhancement Proposals; PEP 288: PEP 342 New Generator Features. + (line 146) +* Python Enhancement Proposals; PEP 289: PEP 289 Generator Expressions. + (line 55) +* Python Enhancement Proposals; PEP 289 <1>: Other Language Changes<15>. + (line 15) +* Python Enhancement Proposals; PEP 289 <2>: Python documentation. + (line 12) +* Python Enhancement Proposals; PEP 292: PEP 292 Simpler String Substitutions. + (line 45) +* Python Enhancement Proposals; PEP 292 <1>: Template strings. + (line 6) +* Python Enhancement Proposals; PEP 293: PEP 293 Codec Error Handling Callbacks. + (line 33) +* Python Enhancement Proposals; PEP 3000: Python 3 0. (line 43) +* Python Enhancement Proposals; PEP 301: PEP 301 Package Index and Metadata for Distutils. + (line 45) +* Python Enhancement Proposals; PEP 301 <1>: distutils command register — Register a module with the Python Package Index. + (line 7) +* Python Enhancement Proposals; PEP 302: Using importlib as the Implementation of Import. + (line 13) +* Python Enhancement Proposals; PEP 302 <1>: Visible Changes. + (line 18) +* Python Enhancement Proposals; PEP 302 <2>: Porting Python code. + (line 71) +* Python Enhancement Proposals; PEP 302 <3>: New Improved and Deprecated Modules<2>. + (line 106) +* Python Enhancement Proposals; PEP 302 <4>: New Improved and Removed Modules. + (line 290) +* Python Enhancement Proposals; PEP 302 <5>: PEP 273 Importing Modules from ZIP Archives. + (line 46) +* Python Enhancement Proposals; PEP 302 <6>: PEP 302 New Import Hooks. + (line 13) +* Python Enhancement Proposals; PEP 302 <7>: PEP 302 New Import Hooks. + (line 38) +* Python Enhancement Proposals; PEP 302 <8>: PEP 302 New Import Hooks. + (line 62) +* Python Enhancement Proposals; PEP 302 <9>: The import system. + (line 42) +* Python Enhancement Proposals; PEP 302 <10>: References. (line 10) +* Python Enhancement Proposals; PEP 302 <11>: Built-in Functions. + (line 1961) +* Python Enhancement Proposals; PEP 302 <12>: linecache — Random access to text lines. + (line 31) +* Python Enhancement Proposals; PEP 302 <13>: sys — System-specific parameters and functions. + (line 1209) +* Python Enhancement Proposals; PEP 302 <14>: sys — System-specific parameters and functions. + (line 1219) +* Python Enhancement Proposals; PEP 302 <15>: zipimport — Import modules from Zip archives. + (line 47) +* Python Enhancement Proposals; PEP 302 <16>: pkgutil — Package extension utility. + (line 55) +* Python Enhancement Proposals; PEP 302 <17>: pkgutil — Package extension utility. + (line 57) +* Python Enhancement Proposals; PEP 302 <18>: pkgutil — Package extension utility. + (line 58) +* Python Enhancement Proposals; PEP 302 <19>: pkgutil — Package extension utility. + (line 66) +* Python Enhancement Proposals; PEP 302 <20>: pkgutil — Package extension utility. + (line 74) +* Python Enhancement Proposals; PEP 302 <21>: pkgutil — Package extension utility. + (line 87) +* Python Enhancement Proposals; PEP 302 <22>: pkgutil — Package extension utility. + (line 103) +* Python Enhancement Proposals; PEP 302 <23>: pkgutil — Package extension utility. + (line 118) +* Python Enhancement Proposals; PEP 302 <24>: pkgutil — Package extension utility. + (line 138) +* Python Enhancement Proposals; PEP 302 <25>: pkgutil — Package extension utility. + (line 159) +* Python Enhancement Proposals; PEP 302 <26>: pkgutil — Package extension utility. + (line 198) +* Python Enhancement Proposals; PEP 302 <27>: runpy — Locating and executing Python modules. + (line 32) +* Python Enhancement Proposals; PEP 302 <28>: Introduction<10>. + (line 59) +* Python Enhancement Proposals; PEP 302 <29>: importlib abc – Abstract base classes related to import. + (line 38) +* Python Enhancement Proposals; PEP 302 <30>: importlib abc – Abstract base classes related to import. + (line 166) +* Python Enhancement Proposals; PEP 302 <31>: importlib abc – Abstract base classes related to import. + (line 299) +* Python Enhancement Proposals; PEP 302 <32>: importlib abc – Abstract base classes related to import. + (line 323) +* Python Enhancement Proposals; PEP 302 <33>: importlib abc – Abstract base classes related to import. + (line 394) +* Python Enhancement Proposals; PEP 302 <34>: imp — Access the import internals. + (line 347) +* Python Enhancement Proposals; PEP 302 <35>: Glossary. (line 493) +* Python Enhancement Proposals; PEP 302 <36>: Glossary. (line 847) +* Python Enhancement Proposals; PEP 305: PEP 305 Comma-separated Files. + (line 42) +* Python Enhancement Proposals; PEP 305 <1>: csv — CSV File Reading and Writing. + (line 38) +* Python Enhancement Proposals; PEP 307: PEP 307 Pickle Enhancements. + (line 8) +* Python Enhancement Proposals; PEP 307 <1>: PEP 307 Pickle Enhancements. + (line 29) +* Python Enhancement Proposals; PEP 307 <2>: PEP 307 Pickle Enhancements. + (line 41) +* Python Enhancement Proposals; PEP 307 <3>: Data stream format. + (line 32) +* Python Enhancement Proposals; PEP 308: PEP 308 Conditional Expressions. + (line 72) +* Python Enhancement Proposals; PEP 308 <1>: PEP 308 Conditional Expressions. + (line 78) +* Python Enhancement Proposals; PEP 308 <2>: Conditional expressions. + (line 16) +* Python Enhancement Proposals; PEP 309: PEP 309 Partial Function Application. + (line 73) +* Python Enhancement Proposals; PEP 3100: Python 3 0. (line 44) +* Python Enhancement Proposals; PEP 3101: PEP 3101 A New Approach To String Formatting. + (line 3) +* Python Enhancement Proposals; PEP 3101 <1>: PEP 3101 A New Approach To String Formatting. + (line 8) +* Python Enhancement Proposals; PEP 3101 <2>: PEP 3101 Advanced String Formatting. + (line 161) +* Python Enhancement Proposals; PEP 3101 <3>: Custom String Formatting. + (line 8) +* Python Enhancement Proposals; PEP 3101 <4>: Custom String Formatting. + (line 60) +* Python Enhancement Proposals; PEP 3102: New Syntax. (line 13) +* Python Enhancement Proposals; PEP 3104: New Syntax. (line 24) +* Python Enhancement Proposals; PEP 3104 <1>: The nonlocal statement. + (line 26) +* Python Enhancement Proposals; PEP 3105: Print Is A Function. + (line 8) +* Python Enhancement Proposals; PEP 3105 <1>: PEP 3105 print As a Function. + (line 35) +* Python Enhancement Proposals; PEP 3105 <2>: __future__ — Future statement definitions. + (line 87) +* Python Enhancement Proposals; PEP 3106: PEP 3106 Dictionary Views. + (line 58) +* Python Enhancement Proposals; PEP 3107: PEP 563 Postponed Evaluation of Annotations. + (line 7) +* Python Enhancement Proposals; PEP 3107 <1>: PEP 484 - Type Hints. + (line 7) +* Python Enhancement Proposals; PEP 3107 <2>: New Syntax. (line 6) +* Python Enhancement Proposals; PEP 3107 <3>: Function Annotations. + (line 7) +* Python Enhancement Proposals; PEP 3107 <4>: Function definitions. + (line 131) +* Python Enhancement Proposals; PEP 3108: Library Changes. (line 7) +* Python Enhancement Proposals; PEP 3108 <1>: Library Changes. + (line 17) +* Python Enhancement Proposals; PEP 3108 <2>: Library Changes. + (line 95) +* Python Enhancement Proposals; PEP 3109: Changed Syntax. (line 6) +* Python Enhancement Proposals; PEP 3109 <1>: Changes To Exceptions. + (line 29) +* Python Enhancement Proposals; PEP 3110: Changed Syntax. (line 16) +* Python Enhancement Proposals; PEP 3110 <1>: Changes To Exceptions. + (line 35) +* Python Enhancement Proposals; PEP 3110 <2>: PEP 3110 Exception-Handling Changes. + (line 48) +* Python Enhancement Proposals; PEP 3111: Builtins. (line 12) +* Python Enhancement Proposals; PEP 3112: PEP 3112 Byte Literals. + (line 75) +* Python Enhancement Proposals; PEP 3112 <1>: __future__ — Future statement definitions. + (line 90) +* Python Enhancement Proposals; PEP 3113: Removed Syntax. (line 6) +* Python Enhancement Proposals; PEP 3114: Operators And Special Methods. + (line 19) +* Python Enhancement Proposals; PEP 3115: types<5>. (line 10) +* Python Enhancement Proposals; PEP 3115 <1>: Changed Syntax. + (line 18) +* Python Enhancement Proposals; PEP 3115 <2>: Preparing the class namespace. + (line 21) +* Python Enhancement Proposals; PEP 3115 <3>: Class definitions. + (line 75) +* Python Enhancement Proposals; PEP 3115 <4>: Dynamic Type Creation. + (line 54) +* Python Enhancement Proposals; PEP 3116: Optimizations<10>. (line 8) +* Python Enhancement Proposals; PEP 3116 <1>: PEP 3116 New I/O Library. + (line 69) +* Python Enhancement Proposals; PEP 3116 <2>: Glossary. (line 1375) +* Python Enhancement Proposals; PEP 3118: Pickle protocol 5 with out-of-band data buffers. + (line 13) +* Python Enhancement Proposals; PEP 3118 <1>: PEP 3118 New memoryview implementation and buffer protocol documentation. + (line 6) +* Python Enhancement Proposals; PEP 3118 <2>: API changes. (line 29) +* Python Enhancement Proposals; PEP 3118 <3>: Build and C API Changes<4>. + (line 8) +* Python Enhancement Proposals; PEP 3118 <4>: Build and C API Changes<7>. + (line 12) +* Python Enhancement Proposals; PEP 3118 <5>: PEP 3118 Revised Buffer Protocol. + (line 46) +* Python Enhancement Proposals; PEP 3118 <6>: Library<45>. (line 99) +* Python Enhancement Proposals; PEP 3118 <7>: Library<50>. (line 61) +* Python Enhancement Proposals; PEP 3118 <8>: Library<79>. (line 956) +* Python Enhancement Proposals; PEP 3118 <9>: Memory Views. (line 111) +* Python Enhancement Proposals; PEP 3119: PEP 3119 Abstract Base Classes. + (line 139) +* Python Enhancement Proposals; PEP 3119 <1>: Customizing instance and subclass checks. + (line 35) +* Python Enhancement Proposals; PEP 3119 <2>: Examples and Recipes. + (line 71) +* Python Enhancement Proposals; PEP 3119 <3>: abc — Abstract Base Classes. + (line 11) +* Python Enhancement Proposals; PEP 3119 <4>: Object Protocol. + (line 237) +* Python Enhancement Proposals; PEP 3119 <5>: Object Protocol. + (line 256) +* Python Enhancement Proposals; PEP 3120: Text Vs Data Instead Of Unicode Vs 8-bit. + (line 107) +* Python Enhancement Proposals; PEP 3120 <1>: Lexical analysis. + (line 12) +* Python Enhancement Proposals; PEP 3120 <2>: Introduction<10>. + (line 91) +* Python Enhancement Proposals; PEP 3121: Build and C API Changes<7>. + (line 14) +* Python Enhancement Proposals; PEP 3121 <1>: Core and Builtins<23>. + (line 230) +* Python Enhancement Proposals; PEP 3121 <2>: Initializing C modules. + (line 56) +* Python Enhancement Proposals; PEP 3123: Build and C API Changes<7>. + (line 16) +* Python Enhancement Proposals; PEP 3127: PEP 3127 Integer Literal Support and Syntax. + (line 47) +* Python Enhancement Proposals; PEP 3129: PEP 3129 Class Decorators. + (line 24) +* Python Enhancement Proposals; PEP 3129 <1>: Class definitions. + (line 81) +* Python Enhancement Proposals; PEP 3131: Text Vs Data Instead Of Unicode Vs 8-bit. + (line 109) +* Python Enhancement Proposals; PEP 3131 <1>: Identifiers and keywords. + (line 10) +* Python Enhancement Proposals; PEP 3131 <2>: Identifiers and keywords. + (line 19) +* Python Enhancement Proposals; PEP 3132: New Syntax. (line 28) +* Python Enhancement Proposals; PEP 3132 <1>: Assignment statements. + (line 158) +* Python Enhancement Proposals; PEP 3134: Changed Syntax. (line 6) +* Python Enhancement Proposals; PEP 3134 <1>: Changes To Exceptions. + (line 40) +* Python Enhancement Proposals; PEP 3134 <2>: Changes To Exceptions. + (line 60) +* Python Enhancement Proposals; PEP 3134 <3>: Library<8>. (line 48) +* Python Enhancement Proposals; PEP 3134 <4>: Base classes. (line 29) +* Python Enhancement Proposals; PEP 3135: Builtins. (line 6) +* Python Enhancement Proposals; PEP 3135 <1>: Creating the class object. + (line 53) +* Python Enhancement Proposals; PEP 3137: PEP 3137 The memoryview Object. + (line 49) +* Python Enhancement Proposals; PEP 3138: Text Vs Data Instead Of Unicode Vs 8-bit. + (line 103) +* Python Enhancement Proposals; PEP 314: PEP 314 Metadata for Python Software Packages v1 1. + (line 42) +* Python Enhancement Proposals; PEP 314 <1>: distutils core — Core Distutils functionality. + (line 103) +* Python Enhancement Proposals; PEP 3141: PEP 3141 A Type Hierarchy for Numbers. + (line 43) +* Python Enhancement Proposals; PEP 3141 <1>: numbers — Numeric abstract base classes. + (line 10) +* Python Enhancement Proposals; PEP 3141 <2>: abc — Abstract Base Classes. + (line 12) +* Python Enhancement Proposals; PEP 3144: ipaddress<5>. (line 10) +* Python Enhancement Proposals; PEP 3147: PEP 421 Adding sys implementation. + (line 21) +* Python Enhancement Proposals; PEP 3147 <1>: PEP 3147 PYC Repository Directories. + (line 69) +* Python Enhancement Proposals; PEP 3147 <2>: “Compiled” Python files. + (line 47) +* Python Enhancement Proposals; PEP 3147 <3>: Import-related module attributes. + (line 84) +* Python Enhancement Proposals; PEP 3147 <4>: test support import_helper — Utilities for import tests. + (line 82) +* Python Enhancement Proposals; PEP 3147 <5>: runpy — Locating and executing Python modules. + (line 87) +* Python Enhancement Proposals; PEP 3147 <6>: Introduction<10>. + (line 95) +* Python Enhancement Proposals; PEP 3147 <7>: importlib util – Utility code for importers. + (line 24) +* Python Enhancement Proposals; PEP 3147 <8>: importlib util – Utility code for importers. + (line 60) +* Python Enhancement Proposals; PEP 3147 <9>: importlib util – Utility code for importers. + (line 64) +* Python Enhancement Proposals; PEP 3147 <10>: py_compile — Compile Python source files. + (line 30) +* Python Enhancement Proposals; PEP 3147 <11>: py_compile — Compile Python source files. + (line 70) +* Python Enhancement Proposals; PEP 3147 <12>: Command-line use. + (line 63) +* Python Enhancement Proposals; PEP 3147 <13>: Public functions. + (line 40) +* Python Enhancement Proposals; PEP 3147 <14>: Public functions. + (line 122) +* Python Enhancement Proposals; PEP 3147 <15>: imp — Access the import internals. + (line 200) +* Python Enhancement Proposals; PEP 3147 <16>: imp — Access the import internals. + (line 207) +* Python Enhancement Proposals; PEP 3147 <17>: imp — Access the import internals. + (line 230) +* Python Enhancement Proposals; PEP 3147 <18>: imp — Access the import internals. + (line 234) +* Python Enhancement Proposals; PEP 3147 <19>: imp — Access the import internals. + (line 246) +* Python Enhancement Proposals; PEP 3147 <20>: Importing Modules<2>. + (line 205) +* Python Enhancement Proposals; PEP 3147 <21>: How do I create a pyc file?. + (line 12) +* Python Enhancement Proposals; PEP 3147 <22>: distutils util — Miscellaneous other utility functions. + (line 152) +* Python Enhancement Proposals; PEP 3148: PEP 3148 The concurrent futures module. + (line 51) +* Python Enhancement Proposals; PEP 3148 <1>: Module Functions. + (line 61) +* Python Enhancement Proposals; PEP 3149: PEP 3149 ABI Version Tagged so Files. + (line 33) +* Python Enhancement Proposals; PEP 3149 <1>: Core and Builtins<77>. + (line 9) +* Python Enhancement Proposals; PEP 3149 <2>: sys — System-specific parameters and functions. + (line 15) +* Python Enhancement Proposals; PEP 3151: PEP 3151 Reworking the OS and IO exception hierarchy. + (line 84) +* Python Enhancement Proposals; PEP 3151 <1>: OS exceptions. (line 119) +* Python Enhancement Proposals; PEP 3151 <2>: Exceptions<12>. + (line 10) +* Python Enhancement Proposals; PEP 3151 <3>: select — Waiting for I/O completion. + (line 33) +* Python Enhancement Proposals; PEP 3151 <4>: resource — Resource usage information. + (line 26) +* Python Enhancement Proposals; PEP 3151 <5>: Standard Exceptions. + (line 181) +* Python Enhancement Proposals; PEP 3154: Summary – Release Highlights<2>. + (line 57) +* Python Enhancement Proposals; PEP 3154 <1>: pickle<4>. (line 16) +* Python Enhancement Proposals; PEP 3154 <2>: Library<34>. (line 1283) +* Python Enhancement Proposals; PEP 3154 <3>: Data stream format. + (line 42) +* Python Enhancement Proposals; PEP 3155: PEP 3155 Qualified name for classes and functions. + (line 62) +* Python Enhancement Proposals; PEP 3155 <1>: Glossary. (line 1175) +* Python Enhancement Proposals; PEP 3156: Summary – Release Highlights<2>. + (line 31) +* Python Enhancement Proposals; PEP 3156 <1>: Summary – Release Highlights<2>. + (line 44) +* Python Enhancement Proposals; PEP 3156 <2>: asyncio<9>. (line 6) +* Python Enhancement Proposals; PEP 3156 <3>: asyncio<9>. (line 17) +* Python Enhancement Proposals; PEP 3156 <4>: selectors<2>. (line 6) +* Python Enhancement Proposals; PEP 318: PEP 318 Decorators for Functions and Methods. + (line 101) +* Python Enhancement Proposals; PEP 318 <1>: PEP 318 Decorators for Functions and Methods. + (line 125) +* Python Enhancement Proposals; PEP 318 <2>: Other Language Changes<15>. + (line 9) +* Python Enhancement Proposals; PEP 318 <3>: Class definitions. + (line 84) +* Python Enhancement Proposals; PEP 322: PEP 322 Reverse Iteration. + (line 35) +* Python Enhancement Proposals; PEP 322 <1>: Other Language Changes<15>. + (line 13) +* Python Enhancement Proposals; PEP 324: PEP 324 New subprocess Module. + (line 86) +* Python Enhancement Proposals; PEP 324 <1>: subprocess — Subprocess management. + (line 25) +* Python Enhancement Proposals; PEP 325: PEP 342 New Generator Features. + (line 147) +* Python Enhancement Proposals; PEP 327: The Context type. (line 56) +* Python Enhancement Proposals; PEP 328: Porting Python code. + (line 36) +* Python Enhancement Proposals; PEP 328 <1>: Removed Syntax. (line 29) +* Python Enhancement Proposals; PEP 328 <2>: PEP 328 Absolute and Relative Imports. + (line 6) +* Python Enhancement Proposals; PEP 328 <3>: PEP 328 Absolute and Relative Imports. + (line 82) +* Python Enhancement Proposals; PEP 328 <4>: PEP 328 Multi-line Imports. + (line 35) +* Python Enhancement Proposals; PEP 328 <5>: Other Language Changes<15>. + (line 21) +* Python Enhancement Proposals; PEP 328 <6>: References. (line 20) +* Python Enhancement Proposals; PEP 328 <7>: Built-in Functions. + (line 1979) +* Python Enhancement Proposals; PEP 328 <8>: __future__ — Future statement definitions. + (line 80) +* Python Enhancement Proposals; PEP 328 <9>: Introduction<10>. + (line 63) +* Python Enhancement Proposals; PEP 331: PEP 331 Locale-Independent Float/String Conversions. + (line 38) +* Python Enhancement Proposals; PEP 333: The wsgiref package. + (line 8) +* Python Enhancement Proposals; PEP 333 <1>: The wsgiref package. + (line 31) +* Python Enhancement Proposals; PEP 3333: New Modules. (line 9) +* Python Enhancement Proposals; PEP 3333 <1>: PEP 3333 Python Web Server Gateway Interface v1 0 1. + (line 50) +* Python Enhancement Proposals; PEP 3333 <2>: wsgiref — WSGI Utilities and Reference Implementation. + (line 24) +* Python Enhancement Proposals; PEP 3333 <3>: wsgiref util – WSGI environment utilities. + (line 8) +* Python Enhancement Proposals; PEP 3333 <4>: wsgiref util – WSGI environment utilities. + (line 10) +* Python Enhancement Proposals; PEP 3333 <5>: wsgiref util – WSGI environment utilities. + (line 30) +* Python Enhancement Proposals; PEP 3333 <6>: wsgiref util – WSGI environment utilities. + (line 76) +* Python Enhancement Proposals; PEP 3333 <7>: wsgiref headers – WSGI response header tools. + (line 12) +* Python Enhancement Proposals; PEP 3333 <8>: wsgiref simple_server – a simple WSGI HTTP server. + (line 21) +* Python Enhancement Proposals; PEP 3333 <9>: wsgiref simple_server – a simple WSGI HTTP server. + (line 96) +* Python Enhancement Proposals; PEP 3333 <10>: wsgiref validate — WSGI conformance checker. + (line 13) +* Python Enhancement Proposals; PEP 3333 <11>: wsgiref validate — WSGI conformance checker. + (line 40) +* Python Enhancement Proposals; PEP 3333 <12>: wsgiref handlers – server/gateway base classes. + (line 236) +* Python Enhancement Proposals; PEP 3333 <13>: wsgiref handlers – server/gateway base classes. + (line 252) +* Python Enhancement Proposals; PEP 3333 <14>: wsgiref handlers – server/gateway base classes. + (line 259) +* Python Enhancement Proposals; PEP 3333 <15>: wsgiref handlers – server/gateway base classes. + (line 268) +* Python Enhancement Proposals; PEP 3333 <16>: wsgiref handlers – server/gateway base classes. + (line 311) +* Python Enhancement Proposals; PEP 3333 <17>: wsgiref types – WSGI types for static type checking. + (line 7) +* Python Enhancement Proposals; PEP 3333 <18>: wsgiref types – WSGI types for static type checking. + (line 14) +* Python Enhancement Proposals; PEP 338: PEP 338 Executing Modules as Scripts. + (line 21) +* Python Enhancement Proposals; PEP 338 <1>: Interface options. + (line 100) +* Python Enhancement Proposals; PEP 338 <2>: References. (line 24) +* Python Enhancement Proposals; PEP 338 <3>: runpy — Locating and executing Python modules. + (line 171) +* Python Enhancement Proposals; PEP 339: Build and C API Changes<10>. + (line 46) +* Python Enhancement Proposals; PEP 341: PEP 341 Unified try/except/finally. + (line 44) +* Python Enhancement Proposals; PEP 342: PEP 342 New Generator Features. + (line 42) +* Python Enhancement Proposals; PEP 342 <1>: PEP 342 New Generator Features. + (line 140) +* Python Enhancement Proposals; PEP 342 <2>: Porting to Python 2 5. + (line 15) +* Python Enhancement Proposals; PEP 342 <3>: Yield expressions. + (line 94) +* Python Enhancement Proposals; PEP 342 <4>: Collections Abstract Base Classes – Detailed Descriptions. + (line 53) +* Python Enhancement Proposals; PEP 342 <5>: Passing values into a generator. + (line 25) +* Python Enhancement Proposals; PEP 342 <6>: Python documentation. + (line 14) +* Python Enhancement Proposals; PEP 343: The contextlib module. + (line 63) +* Python Enhancement Proposals; PEP 343 <1>: PEP 342 New Generator Features. + (line 129) +* Python Enhancement Proposals; PEP 343 <2>: The contextlib module<2>. + (line 63) +* Python Enhancement Proposals; PEP 343 <3>: With Statement Context Managers. + (line 45) +* Python Enhancement Proposals; PEP 343 <4>: The with statement. + (line 108) +* Python Enhancement Proposals; PEP 343 <5>: Using a context manager as a function decorator. + (line 51) +* Python Enhancement Proposals; PEP 343 <6>: __future__ — Future statement definitions. + (line 84) +* Python Enhancement Proposals; PEP 343 <7>: Glossary. (line 280) +* Python Enhancement Proposals; PEP 347: Build and C API Changes<10>. + (line 10) +* Python Enhancement Proposals; PEP 352: Changes To Exceptions. + (line 9) +* Python Enhancement Proposals; PEP 352 <1>: Deprecations and Removals. + (line 9) +* Python Enhancement Proposals; PEP 352 <2>: PEP 352 Exceptions as New-Style Classes. + (line 57) +* Python Enhancement Proposals; PEP 353: Porting to Python 3 10<2>. + (line 9) +* Python Enhancement Proposals; PEP 353 <1>: PEP 353 Using ssize_t as the index type. + (line 49) +* Python Enhancement Proposals; PEP 353 <2>: PEP 353 Using ssize_t as the index type. + (line 55) +* Python Enhancement Proposals; PEP 353 <3>: Build and C API Changes<10>. + (line 20) +* Python Enhancement Proposals; PEP 353 <4>: C API<20>. (line 78) +* Python Enhancement Proposals; PEP 353 <5>: Types. (line 17) +* Python Enhancement Proposals; PEP 356: What’s New in Python 2 5. + (line 10) +* Python Enhancement Proposals; PEP 357: PEP 357 The ‘__index__’ method. + (line 39) +* Python Enhancement Proposals; PEP 361: What’s New in Python 2 6. + (line 10) +* Python Enhancement Proposals; PEP 362: PEP 362 Function Signature Object. + (line 19) +* Python Enhancement Proposals; PEP 362 <1>: Introspecting callables with the Signature object. + (line 367) +* Python Enhancement Proposals; PEP 362 <2>: Glossary. (line 96) +* Python Enhancement Proposals; PEP 362 <3>: Glossary. (line 1059) +* Python Enhancement Proposals; PEP 366: Visible Changes. (line 24) +* Python Enhancement Proposals; PEP 366 <1>: Import-related module attributes. + (line 30) +* Python Enhancement Proposals; PEP 366 <2>: Import-related module attributes. + (line 34) +* Python Enhancement Proposals; PEP 366 <3>: References. (line 17) +* Python Enhancement Proposals; PEP 366 <4>: References. (line 21) +* Python Enhancement Proposals; PEP 366 <5>: runpy — Locating and executing Python modules. + (line 175) +* Python Enhancement Proposals; PEP 366 <6>: Introduction<10>. + (line 67) +* Python Enhancement Proposals; PEP 370: PEP 370 Per-user site-packages Directory. + (line 36) +* Python Enhancement Proposals; PEP 370 <1>: Library<5>. (line 95) +* Python Enhancement Proposals; PEP 370 <2>: Miscellaneous options. + (line 148) +* Python Enhancement Proposals; PEP 370 <3>: Environment variables. + (line 191) +* Python Enhancement Proposals; PEP 370 <4>: Environment variables. + (line 203) +* Python Enhancement Proposals; PEP 370 <5>: Command Line Interface<4>. + (line 37) +* Python Enhancement Proposals; PEP 371: PEP 371 The multiprocessing Package. + (line 145) +* Python Enhancement Proposals; PEP 372: PEP 372 Ordered Dictionaries. + (line 31) +* Python Enhancement Proposals; PEP 372 <1>: PEP 372 Adding an Ordered Dictionary to collections. + (line 97) +* Python Enhancement Proposals; PEP 373: The Future for Python 2 x. + (line 23) +* Python Enhancement Proposals; PEP 378: PEP 378 Format Specifier for Thousands Separator. + (line 32) +* Python Enhancement Proposals; PEP 378 <1>: PEP 378 Format Specifier for Thousands Separator<2>. + (line 37) +* Python Enhancement Proposals; PEP 378 <2>: Format Specification Mini-Language. + (line 109) +* Python Enhancement Proposals; PEP 380: PEP 380 Syntax for Delegating to a Subgenerator. + (line 66) +* Python Enhancement Proposals; PEP 380 <1>: Yield expressions. + (line 99) +* Python Enhancement Proposals; PEP 383: Documentation<7>. (line 29) +* Python Enhancement Proposals; PEP 383 <1>: Error Handlers. (line 50) +* Python Enhancement Proposals; PEP 383 <2>: Socket families. + (line 15) +* Python Enhancement Proposals; PEP 383 <3>: Locale Encoding. + (line 15) +* Python Enhancement Proposals; PEP 383 <4>: Locale Encoding. + (line 53) +* Python Enhancement Proposals; PEP 383 <5>: File System Encoding. + (line 9) +* Python Enhancement Proposals; PEP 384: Removed<4>. (line 55) +* Python Enhancement Proposals; PEP 384 <1>: PEP 384 Defining a Stable ABI. + (line 24) +* Python Enhancement Proposals; PEP 384 <2>: C API<14>. (line 100) +* Python Enhancement Proposals; PEP 385: Code Repository. (line 13) +* Python Enhancement Proposals; PEP 387: Warnings. (line 26) +* Python Enhancement Proposals; PEP 387 <1>: Warnings. (line 41) +* Python Enhancement Proposals; PEP 387 <2>: C API Stability. + (line 6) +* Python Enhancement Proposals; PEP 389: PEP 389 Argparse Command Line Parsing Module. + (line 92) +* Python Enhancement Proposals; PEP 389 <1>: PEP 389 The argparse Module for Parsing Command Lines. + (line 100) +* Python Enhancement Proposals; PEP 391: PEP 391 Dictionary Based Configuration for Logging. + (line 52) +* Python Enhancement Proposals; PEP 391 <1>: PEP 391 Dictionary-Based Configuration For Logging. + (line 94) +* Python Enhancement Proposals; PEP 392: What’s New In Python 3 2. + (line 17) +* Python Enhancement Proposals; PEP 393: Removed<4>. (line 28) +* Python Enhancement Proposals; PEP 393 <1>: Porting to Python 3 9<2>. + (line 46) +* Python Enhancement Proposals; PEP 393 <2>: Removed<6>. (line 101) +* Python Enhancement Proposals; PEP 393 <3>: PEP 393 Flexible String Representation. + (line 16) +* Python Enhancement Proposals; PEP 393 <4>: Functionality. (line 6) +* Python Enhancement Proposals; PEP 393 <5>: Performance and resource usage. + (line 29) +* Python Enhancement Proposals; PEP 393 <6>: Optimizations<8>. + (line 8) +* Python Enhancement Proposals; PEP 393 <7>: Build and C API Changes<4>. + (line 12) +* Python Enhancement Proposals; PEP 393 <8>: Deprecated Python modules functions and methods<4>. + (line 10) +* Python Enhancement Proposals; PEP 393 <9>: Deprecated functions and types of the C API<3>. + (line 6) +* Python Enhancement Proposals; PEP 393 <10>: Porting C code. + (line 17) +* Python Enhancement Proposals; PEP 393 <11>: C API<12>. (line 143) +* Python Enhancement Proposals; PEP 393 <12>: Encodings and Unicode. + (line 7) +* Python Enhancement Proposals; PEP 393 <13>: sys — System-specific parameters and functions. + (line 1111) +* Python Enhancement Proposals; PEP 393 <14>: Unicode Objects. + (line 6) +* Python Enhancement Proposals; PEP 393 <15>: Deprecated Py_UNICODE APIs. + (line 8) +* Python Enhancement Proposals; PEP 397: PEP 486 Make the Python Launcher aware of virtual environments. + (line 6) +* Python Enhancement Proposals; PEP 397 <1>: PEP 397 Python Launcher for Windows. + (line 31) +* Python Enhancement Proposals; PEP 397 <2>: Python Launcher for Windows. + (line 18) +* Python Enhancement Proposals; PEP 397 <3>: Creating virtual environments. + (line 200) +* Python Enhancement Proposals; PEP 398: What’s New In Python 3 3. + (line 13) +* Python Enhancement Proposals; PEP 4: Library Changes. (line 13) +* Python Enhancement Proposals; PEP 405: PEP 405 Virtual Environments. + (line 22) +* Python Enhancement Proposals; PEP 405 <1>: venv — Creation of virtual environments. + (line 19) +* Python Enhancement Proposals; PEP 409: PEP 409 Suppressing exception context. + (line 63) +* Python Enhancement Proposals; PEP 411: sys — System-specific parameters and functions. + (line 895) +* Python Enhancement Proposals; PEP 411 <1>: sys — System-specific parameters and functions. + (line 905) +* Python Enhancement Proposals; PEP 411 <2>: sys — System-specific parameters and functions. + (line 1564) +* Python Enhancement Proposals; PEP 411 <3>: sys — System-specific parameters and functions. + (line 1584) +* Python Enhancement Proposals; PEP 411 <4>: Glossary. (line 1142) +* Python Enhancement Proposals; PEP 412: PEP 412 Key-Sharing Dictionary. + (line 15) +* Python Enhancement Proposals; PEP 412 <1>: functools — Higher-order functions and operations on callable objects. + (line 74) +* Python Enhancement Proposals; PEP 414: PEP 414 Explicit Unicode literals. + (line 17) +* Python Enhancement Proposals; PEP 414 <1>: String and Bytes literals. + (line 60) +* Python Enhancement Proposals; PEP 418: time<7>. (line 6) +* Python Enhancement Proposals; PEP 420: PEP 420 Implicit Namespace Packages. + (line 9) +* Python Enhancement Proposals; PEP 420 <1>: PEP 420 Implicit Namespace Packages. + (line 14) +* Python Enhancement Proposals; PEP 420 <2>: Core and Builtins<62>. + (line 56) +* Python Enhancement Proposals; PEP 420 <3>: Core and Builtins<67>. + (line 114) +* Python Enhancement Proposals; PEP 420 <4>: The import system. + (line 45) +* Python Enhancement Proposals; PEP 420 <5>: Namespace packages. + (line 27) +* Python Enhancement Proposals; PEP 420 <6>: module __path__. + (line 21) +* Python Enhancement Proposals; PEP 420 <7>: module __path__. + (line 21) +* Python Enhancement Proposals; PEP 420 <8>: References. (line 11) +* Python Enhancement Proposals; PEP 420 <9>: References. (line 13) +* Python Enhancement Proposals; PEP 420 <10>: References. (line 13) +* Python Enhancement Proposals; PEP 420 <11>: Introduction<10>. + (line 71) +* Python Enhancement Proposals; PEP 420 <12>: Glossary. (line 493) +* Python Enhancement Proposals; PEP 420 <13>: Glossary. (line 969) +* Python Enhancement Proposals; PEP 420 <14>: Glossary. (line 1117) +* Python Enhancement Proposals; PEP 421: SimpleNamespace. (line 16) +* Python Enhancement Proposals; PEP 421 <1>: sys — System-specific parameters and functions. + (line 1007) +* Python Enhancement Proposals; PEP 421 <2>: sys — System-specific parameters and functions. + (line 1012) +* Python Enhancement Proposals; PEP 424: Other Language Changes<8>. + (line 57) +* Python Enhancement Proposals; PEP 424 <1>: operator<3>. (line 8) +* Python Enhancement Proposals; PEP 427: Key terms. (line 36) +* Python Enhancement Proposals; PEP 428: Summary – Release Highlights<2>. + (line 39) +* Python Enhancement Proposals; PEP 428 <1>: pathlib<8>. (line 17) +* Python Enhancement Proposals; PEP 428 <2>: pathlib — Object-oriented filesystem paths. + (line 40) +* Python Enhancement Proposals; PEP 429: What’s New In Python 3 4. + (line 16) +* Python Enhancement Proposals; PEP 432: Other CPython implementation changes. + (line 7) +* Python Enhancement Proposals; PEP 432 <1>: Core and Builtins<45>. + (line 313) +* Python Enhancement Proposals; PEP 432 <2>: Multi-Phase Initialization Private Provisional API. + (line 7) +* Python Enhancement Proposals; PEP 432 <3>: Multi-Phase Initialization Private Provisional API. + (line 60) +* Python Enhancement Proposals; PEP 434: PEP 434 IDLE Enhancement Exception for All Branches. + (line 6) +* Python Enhancement Proposals; PEP 434 <1>: idlelib. (line 17) +* Python Enhancement Proposals; PEP 435: Summary – Release Highlights<2>. + (line 36) +* Python Enhancement Proposals; PEP 435 <1>: enum<7>. (line 6) +* Python Enhancement Proposals; PEP 435 <2>: enum<7>. (line 15) +* Python Enhancement Proposals; PEP 436: Summary – Release Highlights<2>. + (line 120) +* Python Enhancement Proposals; PEP 436 <1>: PEP 436 Argument Clinic. + (line 6) +* Python Enhancement Proposals; PEP 436 <2>: PEP 436 Argument Clinic. + (line 28) +* Python Enhancement Proposals; PEP 441: zipapp<2>. (line 6) +* Python Enhancement Proposals; PEP 441 <1>: zipapp<2>. (line 24) +* Python Enhancement Proposals; PEP 442: Removed<5>. (line 69) +* Python Enhancement Proposals; PEP 442 <1>: Summary – Release Highlights<2>. + (line 113) +* Python Enhancement Proposals; PEP 442 <2>: Summary – Release Highlights<2>. + (line 115) +* Python Enhancement Proposals; PEP 442 <3>: PEP 442 Safe Object Finalization. + (line 6) +* Python Enhancement Proposals; PEP 442 <4>: PEP 442 Safe Object Finalization. + (line 21) +* Python Enhancement Proposals; PEP 442 <5>: C API<27>. (line 57) +* Python Enhancement Proposals; PEP 442 <6>: gc — Garbage Collector interface. + (line 245) +* Python Enhancement Proposals; PEP 442 <7>: Finalization and De-allocation. + (line 89) +* Python Enhancement Proposals; PEP 442 <8>: PyTypeObject Slots. + (line 1500) +* Python Enhancement Proposals; PEP 443: Summary – Release Highlights<2>. + (line 55) +* Python Enhancement Proposals; PEP 443 <1>: functools<5>. (line 22) +* Python Enhancement Proposals; PEP 443 <2>: Glossary. (line 591) +* Python Enhancement Proposals; PEP 445: Summary – Release Highlights<2>. + (line 118) +* Python Enhancement Proposals; PEP 445 <1>: PEP 445 Customization of CPython Memory Allocators. + (line 6) +* Python Enhancement Proposals; PEP 445 <2>: PEP 445 Customization of CPython Memory Allocators. + (line 12) +* Python Enhancement Proposals; PEP 445 <3>: Other Improvements<2>. + (line 63) +* Python Enhancement Proposals; PEP 446: Summary – Release Highlights<2>. + (line 14) +* Python Enhancement Proposals; PEP 446 <1>: Summary – Release Highlights<2>. + (line 78) +* Python Enhancement Proposals; PEP 446 <2>: PEP 446 Newly Created File Descriptors Are Non-Inheritable. + (line 6) +* Python Enhancement Proposals; PEP 446 <3>: PEP 446 Newly Created File Descriptors Are Non-Inheritable. + (line 26) +* Python Enhancement Proposals; PEP 448: PEP 448 - Additional Unpacking Generalizations. + (line 6) +* Python Enhancement Proposals; PEP 448 <1>: PEP 448 - Additional Unpacking Generalizations. + (line 39) +* Python Enhancement Proposals; PEP 448 <2>: Documentation<54>. + (line 10) +* Python Enhancement Proposals; PEP 448 <3>: Documentation<58>. + (line 9) +* Python Enhancement Proposals; PEP 448 <4>: Core and Builtins<70>. + (line 12) +* Python Enhancement Proposals; PEP 448 <5>: Core and Builtins<73>. + (line 9) +* Python Enhancement Proposals; PEP 448 <6>: Dictionary displays. + (line 29) +* Python Enhancement Proposals; PEP 448 <7>: Calls. (line 122) +* Python Enhancement Proposals; PEP 448 <8>: Expression lists. + (line 22) +* Python Enhancement Proposals; PEP 450: Summary – Release Highlights<2>. + (line 47) +* Python Enhancement Proposals; PEP 450 <1>: statistics<4>. (line 6) +* Python Enhancement Proposals; PEP 450 <2>: statistics<4>. (line 14) +* Python Enhancement Proposals; PEP 451: zipimport. (line 6) +* Python Enhancement Proposals; PEP 451 <1>: PEP 489 Multi-phase extension module initialization. + (line 7) +* Python Enhancement Proposals; PEP 451 <2>: Summary – Release Highlights<2>. + (line 22) +* Python Enhancement Proposals; PEP 451 <3>: PEP 451 A ModuleSpec Type for the Import System. + (line 6) +* Python Enhancement Proposals; PEP 451 <4>: Core and Builtins<62>. + (line 75) +* Python Enhancement Proposals; PEP 451 <5>: References. (line 26) +* Python Enhancement Proposals; PEP 451 <6>: sys — System-specific parameters and functions. + (line 1143) +* Python Enhancement Proposals; PEP 451 <7>: pkgutil — Package extension utility. + (line 90) +* Python Enhancement Proposals; PEP 451 <8>: pkgutil — Package extension utility. + (line 121) +* Python Enhancement Proposals; PEP 451 <9>: runpy — Locating and executing Python modules. + (line 91) +* Python Enhancement Proposals; PEP 451 <10>: runpy — Locating and executing Python modules. + (line 164) +* Python Enhancement Proposals; PEP 451 <11>: runpy — Locating and executing Python modules. + (line 179) +* Python Enhancement Proposals; PEP 451 <12>: Introduction<10>. + (line 75) +* Python Enhancement Proposals; PEP 451 <13>: Multi-phase initialization. + (line 73) +* Python Enhancement Proposals; PEP 451 <14>: Glossary. (line 493) +* Python Enhancement Proposals; PEP 453: Summary – Release Highlights<2>. + (line 12) +* Python Enhancement Proposals; PEP 453 <1>: Summary – Release Highlights<2>. + (line 34) +* Python Enhancement Proposals; PEP 453 <2>: Bootstrapping pip By Default. + (line 6) +* Python Enhancement Proposals; PEP 453 <3>: Documentation Changes. + (line 21) +* Python Enhancement Proposals; PEP 453 <4>: ensurepip. (line 7) +* Python Enhancement Proposals; PEP 453 <5>: venv<6>. (line 13) +* Python Enhancement Proposals; PEP 453 <6>: Other Improvements<2>. + (line 73) +* Python Enhancement Proposals; PEP 453 <7>: PEP 477 Backport ensurepip PEP 453 to Python 2 7. + (line 6) +* Python Enhancement Proposals; PEP 453 <8>: Bootstrapping pip By Default<2>. + (line 6) +* Python Enhancement Proposals; PEP 453 <9>: Documentation Changes<2>. + (line 21) +* Python Enhancement Proposals; PEP 453 <10>: ensurepip — Bootstrapping the pip installer. + (line 33) +* Python Enhancement Proposals; PEP 454: Summary – Release Highlights<2>. + (line 50) +* Python Enhancement Proposals; PEP 454 <1>: tracemalloc<4>. (line 6) +* Python Enhancement Proposals; PEP 454 <2>: tracemalloc<4>. (line 22) +* Python Enhancement Proposals; PEP 456: Summary – Release Highlights<2>. + (line 75) +* Python Enhancement Proposals; PEP 456 <1>: PEP 456 Secure and Interchangeable Hash Algorithm. + (line 6) +* Python Enhancement Proposals; PEP 461: PEP 461 - percent formatting support for bytes and bytearray. + (line 6) +* Python Enhancement Proposals; PEP 461 <1>: PEP 461 - percent formatting support for bytes and bytearray. + (line 41) +* Python Enhancement Proposals; PEP 461 <2>: printf-style Bytes Formatting. + (line 197) +* Python Enhancement Proposals; PEP 465: PEP 465 - A dedicated infix operator for matrix multiplication. + (line 6) +* Python Enhancement Proposals; PEP 465 <1>: PEP 465 - A dedicated infix operator for matrix multiplication. + (line 44) +* Python Enhancement Proposals; PEP 465 <2>: Build and C API Changes<3>. + (line 43) +* Python Enhancement Proposals; PEP 465 <3>: Tools/Demos<38>. + (line 39) +* Python Enhancement Proposals; PEP 466: PEP 466 Network Security Enhancements for Python 2 7. + (line 6) +* Python Enhancement Proposals; PEP 466 <1>: PEP 466 Network Security Enhancements for Python 2 7. + (line 11) +* Python Enhancement Proposals; PEP 466 <2>: PEP 466 Network Security Enhancements for Python 2 7. + (line 21) +* Python Enhancement Proposals; PEP 466 <3>: PEP 466 Network Security Enhancements for Python 2 7. + (line 32) +* Python Enhancement Proposals; PEP 468: PEP 468 Preserving Keyword Argument Order. + (line 12) +* Python Enhancement Proposals; PEP 468 <1>: Library<52>. (line 87) +* Python Enhancement Proposals; PEP 468 <2>: OrderedDict objects. + (line 106) +* Python Enhancement Proposals; PEP 471: PEP 471 - os scandir function – a better and faster directory iterator. + (line 6) +* Python Enhancement Proposals; PEP 471 <1>: PEP 471 - os scandir function – a better and faster directory iterator. + (line 29) +* Python Enhancement Proposals; PEP 471 <2>: Library<78>. (line 6) +* Python Enhancement Proposals; PEP 475: PEP 475 Retry system calls failing with EINTR. + (line 32) +* Python Enhancement Proposals; PEP 475 <1>: PEP 475 Retry system calls failing with EINTR. + (line 77) +* Python Enhancement Proposals; PEP 475 <2>: Changes in the Python API<6>. + (line 6) +* Python Enhancement Proposals; PEP 475 <3>: Library<43>. (line 229) +* Python Enhancement Proposals; PEP 475 <4>: Library<76>. (line 143) +* Python Enhancement Proposals; PEP 475 <5>: Built-in Functions. + (line 1338) +* Python Enhancement Proposals; PEP 475 <6>: OS exceptions. (line 80) +* Python Enhancement Proposals; PEP 475 <7>: File Descriptor Operations. + (line 320) +* Python Enhancement Proposals; PEP 475 <8>: File Descriptor Operations. + (line 625) +* Python Enhancement Proposals; PEP 475 <9>: File Descriptor Operations. + (line 794) +* Python Enhancement Proposals; PEP 475 <10>: Process Management. + (line 886) +* Python Enhancement Proposals; PEP 475 <11>: Functions<4>. (line 277) +* Python Enhancement Proposals; PEP 475 <12>: Socket Objects. + (line 28) +* Python Enhancement Proposals; PEP 475 <13>: Socket Objects. + (line 82) +* Python Enhancement Proposals; PEP 475 <14>: Socket Objects. + (line 246) +* Python Enhancement Proposals; PEP 475 <15>: Socket Objects. + (line 260) +* Python Enhancement Proposals; PEP 475 <16>: Socket Objects. + (line 334) +* Python Enhancement Proposals; PEP 475 <17>: Socket Objects. + (line 406) +* Python Enhancement Proposals; PEP 475 <18>: Socket Objects. + (line 425) +* Python Enhancement Proposals; PEP 475 <19>: Socket Objects. + (line 444) +* Python Enhancement Proposals; PEP 475 <20>: Socket Objects. + (line 486) +* Python Enhancement Proposals; PEP 475 <21>: select — Waiting for I/O completion. + (line 159) +* Python Enhancement Proposals; PEP 475 <22>: /dev/poll Polling Objects. + (line 82) +* Python Enhancement Proposals; PEP 475 <23>: Edge and Level Trigger Polling epoll Objects. + (line 102) +* Python Enhancement Proposals; PEP 475 <24>: Polling Objects. + (line 94) +* Python Enhancement Proposals; PEP 475 <25>: Kqueue Objects. + (line 36) +* Python Enhancement Proposals; PEP 475 <26>: Classes<3>. (line 133) +* Python Enhancement Proposals; PEP 475 <27>: Module contents<2>. + (line 572) +* Python Enhancement Proposals; PEP 475 <28>: Module contents<2>. + (line 590) +* Python Enhancement Proposals; PEP 476: PEP 476 Enabling certificate verification by default for stdlib http clients<2>. + (line 6) +* Python Enhancement Proposals; PEP 477: PEP 477 Backport ensurepip PEP 453 to Python 2 7. + (line 6) +* Python Enhancement Proposals; PEP 478: What’s New In Python 3 5. + (line 17) +* Python Enhancement Proposals; PEP 479: Changes in Python Behavior. + (line 11) +* Python Enhancement Proposals; PEP 479 <1>: PEP 479 Change StopIteration handling inside generators. + (line 12) +* Python Enhancement Proposals; PEP 479 <2>: PEP 479 Change StopIteration handling inside generators. + (line 47) +* Python Enhancement Proposals; PEP 479 <3>: Library<34>. (line 1271) +* Python Enhancement Proposals; PEP 479 <4>: Library<38>. (line 52) +* Python Enhancement Proposals; PEP 479 <5>: Core and Builtins<41>. + (line 34) +* Python Enhancement Proposals; PEP 479 <6>: Library<46>. (line 95) +* Python Enhancement Proposals; PEP 479 <7>: Library<59>. (line 80) +* Python Enhancement Proposals; PEP 479 <8>: Library<65>. (line 326) +* Python Enhancement Proposals; PEP 479 <9>: Concrete exceptions. + (line 256) +* Python Enhancement Proposals; PEP 479 <10>: Concrete exceptions. + (line 258) +* Python Enhancement Proposals; PEP 479 <11>: __future__ — Future statement definitions. + (line 93) +* Python Enhancement Proposals; PEP 483: PEP 484 - Type Hints. + (line 47) +* Python Enhancement Proposals; PEP 483 <1>: typing — Support for type hints. + (line 20) +* Python Enhancement Proposals; PEP 483 <2>: Relevant PEPs. (line 6) +* Python Enhancement Proposals; PEP 483 <3>: Glossary. (line 599) +* Python Enhancement Proposals; PEP 484: New Features Related to Type Hints. + (line 6) +* Python Enhancement Proposals; PEP 484 <1>: PEP 646 Variadic generics. + (line 6) +* Python Enhancement Proposals; PEP 484 <2>: New Features Related to Type Hints<2>. + (line 6) +* Python Enhancement Proposals; PEP 484 <3>: PEP 612 Parameter Specification Variables. + (line 7) +* Python Enhancement Proposals; PEP 484 <4>: PEP 613 TypeAlias. + (line 6) +* Python Enhancement Proposals; PEP 484 <5>: ast<2>. (line 17) +* Python Enhancement Proposals; PEP 484 <6>: ast<2>. (line 20) +* Python Enhancement Proposals; PEP 484 <7>: PEP 560 Core Support for typing module and Generic Types. + (line 6) +* Python Enhancement Proposals; PEP 484 <8>: PEP 526 Syntax for variable annotations. + (line 6) +* Python Enhancement Proposals; PEP 484 <9>: PEP 484 - Type Hints. + (line 16) +* Python Enhancement Proposals; PEP 484 <10>: PEP 484 - Type Hints. + (line 41) +* Python Enhancement Proposals; PEP 484 <11>: Function Annotations. + (line 8) +* Python Enhancement Proposals; PEP 484 <12>: Emulating generic types. + (line 15) +* Python Enhancement Proposals; PEP 484 <13>: Annotated assignment statements. + (line 45) +* Python Enhancement Proposals; PEP 484 <14>: Function definitions. + (line 135) +* Python Enhancement Proposals; PEP 484 <15>: Special Attributes of GenericAlias objects. + (line 50) +* Python Enhancement Proposals; PEP 484 <16>: typing — Support for type hints. + (line 19) +* Python Enhancement Proposals; PEP 484 <17>: Relevant PEPs. (line 6) +* Python Enhancement Proposals; PEP 484 <18>: NewType. (line 63) +* Python Enhancement Proposals; PEP 484 <19>: Nominal vs structural subtyping. + (line 6) +* Python Enhancement Proposals; PEP 484 <20>: Nominal vs structural subtyping. + (line 14) +* Python Enhancement Proposals; PEP 484 <21>: Special forms. (line 210) +* Python Enhancement Proposals; PEP 484 <22>: Building generic types. + (line 106) +* Python Enhancement Proposals; PEP 484 <23>: Functions and decorators. + (line 250) +* Python Enhancement Proposals; PEP 484 <24>: ast Helpers. (line 16) +* Python Enhancement Proposals; PEP 484 <25>: ast Helpers. (line 26) +* Python Enhancement Proposals; PEP 484 <26>: Compiler Flags. + (line 23) +* Python Enhancement Proposals; PEP 484 <27>: Glossary. (line 61) +* Python Enhancement Proposals; PEP 484 <28>: Glossary. (line 526) +* Python Enhancement Proposals; PEP 484 <29>: Glossary. (line 599) +* Python Enhancement Proposals; PEP 484 <30>: Glossary. (line 1350) +* Python Enhancement Proposals; PEP 484 <31>: Glossary. (line 1367) +* Python Enhancement Proposals; PEP 484 <32>: Glossary. (line 1397) +* Python Enhancement Proposals; PEP 484#annotating-instance-and-class-methods: PEP 673 Self type. + (line 8) +* Python Enhancement Proposals; PEP 485: PEP 485 A function for testing approximate equality. + (line 6) +* Python Enhancement Proposals; PEP 485 <1>: PEP 485 A function for testing approximate equality. + (line 36) +* Python Enhancement Proposals; PEP 485 <2>: Library<74>. (line 10) +* Python Enhancement Proposals; PEP 485 <3>: Number-theoretic and representation functions. + (line 142) +* Python Enhancement Proposals; PEP 485 <4>: Classification functions. + (line 54) +* Python Enhancement Proposals; PEP 486: PEP 486 Make the Python Launcher aware of virtual environments. + (line 6) +* Python Enhancement Proposals; PEP 486 <1>: PEP 486 Make the Python Launcher aware of virtual environments. + (line 14) +* Python Enhancement Proposals; PEP 486 <2>: Windows<59>. (line 6) +* Python Enhancement Proposals; PEP 487: PEP 487 Simpler customization of class creation. + (line 32) +* Python Enhancement Proposals; PEP 487 <1>: PEP 487 Descriptor Protocol Enhancements. + (line 6) +* Python Enhancement Proposals; PEP 487 <2>: PEP 487 Descriptor Protocol Enhancements. + (line 33) +* Python Enhancement Proposals; PEP 487 <3>: Changes in the Python API<5>. + (line 104) +* Python Enhancement Proposals; PEP 487 <4>: Documentation<44>. + (line 52) +* Python Enhancement Proposals; PEP 487 <5>: Documentation<51>. + (line 8) +* Python Enhancement Proposals; PEP 487 <6>: Core and Builtins<59>. + (line 46) +* Python Enhancement Proposals; PEP 488: PEP 488 Elimination of PYO files. + (line 6) +* Python Enhancement Proposals; PEP 488 <1>: PEP 488 Elimination of PYO files. + (line 20) +* Python Enhancement Proposals; PEP 488 <2>: Changes in the Python API<6>. + (line 79) +* Python Enhancement Proposals; PEP 488 <3>: Core and Builtins<77>. + (line 15) +* Python Enhancement Proposals; PEP 488 <4>: Miscellaneous options. + (line 75) +* Python Enhancement Proposals; PEP 488 <5>: Miscellaneous options. + (line 77) +* Python Enhancement Proposals; PEP 488 <6>: Miscellaneous options. + (line 84) +* Python Enhancement Proposals; PEP 488 <7>: Miscellaneous options. + (line 86) +* Python Enhancement Proposals; PEP 488 <8>: test support import_helper — Utilities for import tests. + (line 82) +* Python Enhancement Proposals; PEP 488 <9>: Introduction<10>. + (line 79) +* Python Enhancement Proposals; PEP 488 <10>: importlib util – Utility code for importers. + (line 24) +* Python Enhancement Proposals; PEP 488 <11>: importlib util – Utility code for importers. + (line 64) +* Python Enhancement Proposals; PEP 488 <12>: py_compile — Compile Python source files. + (line 31) +* Python Enhancement Proposals; PEP 488 <13>: distutils util — Miscellaneous other utility functions. + (line 152) +* Python Enhancement Proposals; PEP 488 <14>: distutils util — Miscellaneous other utility functions. + (line 189) +* Python Enhancement Proposals; PEP 489: PEP 489 Multi-phase extension module initialization. + (line 6) +* Python Enhancement Proposals; PEP 489 <1>: PEP 489 Multi-phase extension module initialization. + (line 18) +* Python Enhancement Proposals; PEP 489 <2>: Build and C API Changes<3>. + (line 37) +* Python Enhancement Proposals; PEP 489 <3>: Library<18>. (line 64) +* Python Enhancement Proposals; PEP 489 <4>: Library<18>. (line 79) +* Python Enhancement Proposals; PEP 489 <5>: Core and Builtins<20>. + (line 70) +* Python Enhancement Proposals; PEP 489 <6>: Library<19>. (line 68) +* Python Enhancement Proposals; PEP 489 <7>: Library<19>. (line 177) +* Python Enhancement Proposals; PEP 489 <8>: Core and Builtins<21>. + (line 50) +* Python Enhancement Proposals; PEP 489 <9>: Library<20>. (line 103) +* Python Enhancement Proposals; PEP 489 <10>: C API<18>. (line 11) +* Python Enhancement Proposals; PEP 489 <11>: C API<18>. (line 14) +* Python Enhancement Proposals; PEP 489 <12>: C API<18>. (line 17) +* Python Enhancement Proposals; PEP 489 <13>: C API<18>. (line 20) +* Python Enhancement Proposals; PEP 489 <14>: C API<18>. (line 23) +* Python Enhancement Proposals; PEP 489 <15>: C API<18>. (line 26) +* Python Enhancement Proposals; PEP 489 <16>: C API<18>. (line 29) +* Python Enhancement Proposals; PEP 489 <17>: C API<18>. (line 38) +* Python Enhancement Proposals; PEP 489 <18>: C API<18>. (line 41) +* Python Enhancement Proposals; PEP 489 <19>: C API<18>. (line 44) +* Python Enhancement Proposals; PEP 489 <20>: C API<18>. (line 47) +* Python Enhancement Proposals; PEP 489 <21>: Library<21>. (line 31) +* Python Enhancement Proposals; PEP 489 <22>: Core and Builtins<23>. + (line 20) +* Python Enhancement Proposals; PEP 489 <23>: Core and Builtins<23>. + (line 30) +* Python Enhancement Proposals; PEP 489 <24>: Core and Builtins<23>. + (line 33) +* Python Enhancement Proposals; PEP 489 <25>: Core and Builtins<23>. + (line 36) +* Python Enhancement Proposals; PEP 489 <26>: Core and Builtins<23>. + (line 39) +* Python Enhancement Proposals; PEP 489 <27>: Core and Builtins<23>. + (line 49) +* Python Enhancement Proposals; PEP 489 <28>: Core and Builtins<23>. + (line 52) +* Python Enhancement Proposals; PEP 489 <29>: Core and Builtins<23>. + (line 55) +* Python Enhancement Proposals; PEP 489 <30>: Core and Builtins<23>. + (line 74) +* Python Enhancement Proposals; PEP 489 <31>: Core and Builtins<23>. + (line 90) +* Python Enhancement Proposals; PEP 489 <32>: Core and Builtins<23>. + (line 102) +* Python Enhancement Proposals; PEP 489 <33>: Library<22>. (line 75) +* Python Enhancement Proposals; PEP 489 <34>: Library<22>. (line 78) +* Python Enhancement Proposals; PEP 489 <35>: Library<22>. (line 424) +* Python Enhancement Proposals; PEP 489 <36>: Core and Builtins<24>. + (line 28) +* Python Enhancement Proposals; PEP 489 <37>: Core and Builtins<24>. + (line 35) +* Python Enhancement Proposals; PEP 489 <38>: Core and Builtins<24>. + (line 50) +* Python Enhancement Proposals; PEP 489 <39>: Core and Builtins<25>. + (line 46) +* Python Enhancement Proposals; PEP 489 <40>: Core and Builtins<25>. + (line 49) +* Python Enhancement Proposals; PEP 489 <41>: Core and Builtins<25>. + (line 51) +* Python Enhancement Proposals; PEP 489 <42>: Core and Builtins<25>. + (line 71) +* Python Enhancement Proposals; PEP 489 <43>: Core and Builtins<25>. + (line 75) +* Python Enhancement Proposals; PEP 489 <44>: Core and Builtins<26>. + (line 17) +* Python Enhancement Proposals; PEP 489 <45>: Core and Builtins<26>. + (line 20) +* Python Enhancement Proposals; PEP 489 <46>: Core and Builtins<26>. + (line 40) +* Python Enhancement Proposals; PEP 489 <47>: Core and Builtins<26>. + (line 54) +* Python Enhancement Proposals; PEP 489 <48>: Core and Builtins<26>. + (line 109) +* Python Enhancement Proposals; PEP 489 <49>: Core and Builtins<26>. + (line 118) +* Python Enhancement Proposals; PEP 489 <50>: Core and Builtins<27>. + (line 29) +* Python Enhancement Proposals; PEP 489 <51>: Core and Builtins<27>. + (line 32) +* Python Enhancement Proposals; PEP 489 <52>: Core and Builtins<27>. + (line 52) +* Python Enhancement Proposals; PEP 489 <53>: Core and Builtins<27>. + (line 55) +* Python Enhancement Proposals; PEP 489 <54>: Core and Builtins<27>. + (line 58) +* Python Enhancement Proposals; PEP 489 <55>: Core and Builtins<28>. + (line 62) +* Python Enhancement Proposals; PEP 489 <56>: Introduction<10>. + (line 83) +* Python Enhancement Proposals; PEP 489 <57>: importlib machinery – Importers and path hooks. + (line 77) +* Python Enhancement Proposals; PEP 489 <58>: importlib machinery – Importers and path hooks. + (line 325) +* Python Enhancement Proposals; PEP 489 <59>: importlib machinery – Importers and path hooks. + (line 331) +* Python Enhancement Proposals; PEP 489 <60>: The Module’s Method Table and Initialization Function. + (line 129) +* Python Enhancement Proposals; PEP 489 <61>: Building C and C++ Extensions. + (line 40) +* Python Enhancement Proposals; PEP 489 <62>: Multi-phase initialization. + (line 109) +* Python Enhancement Proposals; PEP 492: PEP 525 Asynchronous Generators. + (line 6) +* Python Enhancement Proposals; PEP 492 <1>: New Keywords. (line 7) +* Python Enhancement Proposals; PEP 492 <2>: PEP 492 - Coroutines with async and await syntax. + (line 6) +* Python Enhancement Proposals; PEP 492 <3>: PEP 492 - Coroutines with async and await syntax. + (line 97) +* Python Enhancement Proposals; PEP 492 <4>: New Keywords<2>. + (line 7) +* Python Enhancement Proposals; PEP 492 <5>: Changes in the C API<6>. + (line 25) +* Python Enhancement Proposals; PEP 492 <6>: Core and Builtins<44>. + (line 98) +* Python Enhancement Proposals; PEP 492 <7>: Library<60>. (line 51) +* Python Enhancement Proposals; PEP 492 <8>: Library<66>. (line 16) +* Python Enhancement Proposals; PEP 492 <9>: Core and Builtins<74>. + (line 14) +* Python Enhancement Proposals; PEP 492 <10>: Awaitable Objects. + (line 26) +* Python Enhancement Proposals; PEP 492 <11>: Yield expressions. + (line 106) +* Python Enhancement Proposals; PEP 492 <12>: The async with statement. + (line 45) +* Python Enhancement Proposals; PEP 492 <13>: Collections Abstract Base Classes – Detailed Descriptions. + (line 148) +* Python Enhancement Proposals; PEP 492 <14>: Code Objects Bit Flags. + (line 38) +* Python Enhancement Proposals; PEP 492 <15>: Code Objects Bit Flags. + (line 47) +* Python Enhancement Proposals; PEP 492 <16>: Glossary. (line 102) +* Python Enhancement Proposals; PEP 492 <17>: Glossary. (line 135) +* Python Enhancement Proposals; PEP 492 <18>: Glossary. (line 142) +* Python Enhancement Proposals; PEP 492 <19>: Glossary. (line 150) +* Python Enhancement Proposals; PEP 492 <20>: Glossary. (line 169) +* Python Enhancement Proposals; PEP 492 <21>: Glossary. (line 310) +* Python Enhancement Proposals; PEP 492 <22>: Glossary. (line 317) +* Python Enhancement Proposals; PEP 493: PEP 493 HTTPS verification migration tools for Python 2 7. + (line 6) +* Python Enhancement Proposals; PEP 494: What’s New In Python 3 6. + (line 17) +* Python Enhancement Proposals; PEP 495: PEP 495 Local Time Disambiguation. + (line 13) +* Python Enhancement Proposals; PEP 495 <1>: PEP 495 Local Time Disambiguation. + (line 36) +* Python Enhancement Proposals; PEP 495 <2>: Library<58>. (line 96) +* Python Enhancement Proposals; PEP 495 <3>: Using ZoneInfo. (line 34) +* Python Enhancement Proposals; PEP 498: PEP 498 Formatted string literals. + (line 6) +* Python Enhancement Proposals; PEP 498 <1>: PEP 498 Formatted string literals. + (line 27) +* Python Enhancement Proposals; PEP 498 <2>: Core and Builtins<62>. + (line 283) +* Python Enhancement Proposals; PEP 498 <3>: Formatted string literals. + (line 141) +* Python Enhancement Proposals; PEP 498 <4>: Glossary. (line 442) +* Python Enhancement Proposals; PEP 5: PEP 230 Warning Framework. + (line 66) +* Python Enhancement Proposals; PEP 5 <1>: Is it reasonable to propose incompatible changes to Python?. + (line 14) +* Python Enhancement Proposals; PEP 506: secrets. (line 19) +* Python Enhancement Proposals; PEP 506 <1>: Library<61>. (line 60) +* Python Enhancement Proposals; PEP 506 <2>: secrets — Generate secure random numbers for managing secrets. + (line 24) +* Python Enhancement Proposals; PEP 511: Changes in the Python API<5>. + (line 32) +* Python Enhancement Proposals; PEP 514: Windows py exe launcher improvements. + (line 8) +* Python Enhancement Proposals; PEP 514 <1>: Windows<8>. (line 12) +* Python Enhancement Proposals; PEP 514 <2>: Windows<51>. (line 8) +* Python Enhancement Proposals; PEP 515: fractions. (line 6) +* Python Enhancement Proposals; PEP 515 <1>: PEP 515 Underscores in Numeric Literals. + (line 6) +* Python Enhancement Proposals; PEP 515 <2>: PEP 515 Underscores in Numeric Literals. + (line 32) +* Python Enhancement Proposals; PEP 515 <3>: Core and Builtins<58>. + (line 15) +* Python Enhancement Proposals; PEP 515 <4>: Core and Builtins<58>. + (line 43) +* Python Enhancement Proposals; PEP 515 <5>: Format Specification Mini-Language. + (line 117) +* Python Enhancement Proposals; PEP 515 <6>: fractions — Rational numbers. + (line 97) +* Python Enhancement Proposals; PEP 519: PEP 519 Adding a file system path protocol. + (line 62) +* Python Enhancement Proposals; PEP 519 <1>: Library<58>. (line 6) +* Python Enhancement Proposals; PEP 519 <2>: Core and Builtins<61>. + (line 19) +* Python Enhancement Proposals; PEP 519 <3>: Library<60>. (line 31) +* Python Enhancement Proposals; PEP 519 <4>: Library<60>. (line 42) +* Python Enhancement Proposals; PEP 519 <5>: Library<60>. (line 44) +* Python Enhancement Proposals; PEP 519 <6>: C API<48>. (line 6) +* Python Enhancement Proposals; PEP 519 <7>: Glossary. (line 1096) +* Python Enhancement Proposals; PEP 520: PEP 520 Preserving Class Attribute Definition Order. + (line 17) +* Python Enhancement Proposals; PEP 523: Porting to Python 3 11<2>. + (line 33) +* Python Enhancement Proposals; PEP 523 <1>: Porting to Python 3 9<2>. + (line 6) +* Python Enhancement Proposals; PEP 523 <2>: PEP 523 Adding a frame evaluation API to CPython. + (line 12) +* Python Enhancement Proposals; PEP 523 <3>: PEP 523 Adding a frame evaluation API to CPython. + (line 26) +* Python Enhancement Proposals; PEP 523 <4>: Tools/Demos<20>. + (line 7) +* Python Enhancement Proposals; PEP 523 <5>: Tools/Demos<24>. + (line 7) +* Python Enhancement Proposals; PEP 523 <6>: Core and Builtins<58>. + (line 83) +* Python Enhancement Proposals; PEP 523 <7>: Low-level API. (line 171) +* Python Enhancement Proposals; PEP 523 <8>: Low-level API. (line 180) +* Python Enhancement Proposals; PEP 524: Summary – Release highlights<5>. + (line 77) +* Python Enhancement Proposals; PEP 524 <1>: os<6>. (line 20) +* Python Enhancement Proposals; PEP 524 <2>: os<6>. (line 25) +* Python Enhancement Proposals; PEP 524 <3>: Library<57>. (line 150) +* Python Enhancement Proposals; PEP 524 <4>: Library<57>. (line 154) +* Python Enhancement Proposals; PEP 524 <5>: Random numbers<2>. + (line 42) +* Python Enhancement Proposals; PEP 525: PEP 525 Asynchronous Generators. + (line 23) +* Python Enhancement Proposals; PEP 525 <1>: Core and Builtins<58>. + (line 49) +* Python Enhancement Proposals; PEP 525 <2>: Yield expressions. + (line 104) +* Python Enhancement Proposals; PEP 525 <3>: Collections Abstract Base Classes – Detailed Descriptions. + (line 148) +* Python Enhancement Proposals; PEP 525 <4>: sys — System-specific parameters and functions. + (line 892) +* Python Enhancement Proposals; PEP 525 <5>: sys — System-specific parameters and functions. + (line 1559) +* Python Enhancement Proposals; PEP 525 <6>: Code Objects Bit Flags. + (line 56) +* Python Enhancement Proposals; PEP 525 <7>: Glossary. (line 135) +* Python Enhancement Proposals; PEP 526: Other Language Changes<2>. + (line 56) +* Python Enhancement Proposals; PEP 526 <1>: ast<2>. (line 18) +* Python Enhancement Proposals; PEP 526 <2>: PEP 563 Postponed Evaluation of Annotations. + (line 8) +* Python Enhancement Proposals; PEP 526 <3>: PEP 526 Syntax for variable annotations. + (line 30) +* Python Enhancement Proposals; PEP 526 <4>: typing<6>. (line 23) +* Python Enhancement Proposals; PEP 526 <5>: Core and Builtins<58>. + (line 51) +* Python Enhancement Proposals; PEP 526 <6>: Annotated assignment statements. + (line 39) +* Python Enhancement Proposals; PEP 526 <7>: Function definitions. + (line 139) +* Python Enhancement Proposals; PEP 526 <8>: Relevant PEPs. (line 11) +* Python Enhancement Proposals; PEP 526 <9>: Special forms. (line 259) +* Python Enhancement Proposals; PEP 526 <10>: Other special directives. + (line 62) +* Python Enhancement Proposals; PEP 526 <11>: Other special directives. + (line 114) +* Python Enhancement Proposals; PEP 526 <12>: dataclasses — Data Classes. + (line 16) +* Python Enhancement Proposals; PEP 526 <13>: Class variables. + (line 8) +* Python Enhancement Proposals; PEP 526 <14>: ast Helpers. (line 16) +* Python Enhancement Proposals; PEP 526 <15>: Compiler Flags. + (line 23) +* Python Enhancement Proposals; PEP 526 <16>: Glossary. (line 61) +* Python Enhancement Proposals; PEP 526 <17>: Glossary. (line 1397) +* Python Enhancement Proposals; PEP 528: PEP 528 Change Windows console encoding to UTF-8. + (line 17) +* Python Enhancement Proposals; PEP 528 <1>: UTF-8 mode. (line 34) +* Python Enhancement Proposals; PEP 528 <2>: Global configuration variables. + (line 107) +* Python Enhancement Proposals; PEP 528 <3>: PyConfig. (line 491) +* Python Enhancement Proposals; PEP 529: Changes in the Python API<3>. + (line 7) +* Python Enhancement Proposals; PEP 529 <1>: PEP 529 Change Windows filesystem encoding to UTF-8. + (line 22) +* Python Enhancement Proposals; PEP 529 <2>: Documentation<7>. + (line 29) +* Python Enhancement Proposals; PEP 529 <3>: Library<29>. (line 621) +* Python Enhancement Proposals; PEP 529 <4>: Windows<46>. (line 14) +* Python Enhancement Proposals; PEP 529 <5>: Environment variables. + (line 325) +* Python Enhancement Proposals; PEP 529 <6>: UTF-8 mode. (line 37) +* Python Enhancement Proposals; PEP 529 <7>: Files and Directories. + (line 294) +* Python Enhancement Proposals; PEP 529 <8>: sys — System-specific parameters and functions. + (line 727) +* Python Enhancement Proposals; PEP 529 <9>: sys — System-specific parameters and functions. + (line 1601) +* Python Enhancement Proposals; PEP 529 <10>: File System Encoding. + (line 9) +* Python Enhancement Proposals; PEP 529 <11>: Global configuration variables. + (line 95) +* Python Enhancement Proposals; PEP 530: PEP 530 Asynchronous Comprehensions. + (line 6) +* Python Enhancement Proposals; PEP 530 <1>: PEP 530 Asynchronous Comprehensions. + (line 19) +* Python Enhancement Proposals; PEP 530 <2>: Core and Builtins<58>. + (line 145) +* Python Enhancement Proposals; PEP 530 <3>: Displays for lists sets and dictionaries. + (line 54) +* Python Enhancement Proposals; PEP 538: PEP 538 Legacy C Locale Coercion. + (line 11) +* Python Enhancement Proposals; PEP 538 <1>: PEP 538 Legacy C Locale Coercion. + (line 36) +* Python Enhancement Proposals; PEP 538 <2>: PEP 538 Legacy C Locale Coercion. + (line 48) +* Python Enhancement Proposals; PEP 538 <3>: PEP 540 Forced UTF-8 Runtime Mode. + (line 27) +* Python Enhancement Proposals; PEP 538 <4>: Documentation<34>. + (line 68) +* Python Enhancement Proposals; PEP 538 <5>: Documentation<35>. + (line 6) +* Python Enhancement Proposals; PEP 538 <6>: Core and Builtins<45>. + (line 135) +* Python Enhancement Proposals; PEP 538 <7>: Environment variables. + (line 394) +* Python Enhancement Proposals; PEP 538 <8>: General Options. + (line 96) +* Python Enhancement Proposals; PEP 538 <9>: Python Configuration. + (line 13) +* Python Enhancement Proposals; PEP 539: PEP 539 New C API for Thread-Local Storage. + (line 12) +* Python Enhancement Proposals; PEP 539 <1>: PEP 539 New C API for Thread-Local Storage. + (line 30) +* Python Enhancement Proposals; PEP 539 <2>: C API<37>. (line 13) +* Python Enhancement Proposals; PEP 539 <3>: Thread Specific Storage TSS API. + (line 15) +* Python Enhancement Proposals; PEP 540: PEP 540 Forced UTF-8 Runtime Mode. + (line 18) +* Python Enhancement Proposals; PEP 540 <1>: PEP 540 Forced UTF-8 Runtime Mode. + (line 35) +* Python Enhancement Proposals; PEP 540 <2>: Core and Builtins<42>. + (line 63) +* Python Enhancement Proposals; PEP 540 <3>: Python UTF-8 Mode. + (line 6) +* Python Enhancement Proposals; PEP 540 <4>: Python Configuration. + (line 14) +* Python Enhancement Proposals; PEP 544: typing<5>. (line 32) +* Python Enhancement Proposals; PEP 544 <1>: Relevant PEPs. (line 17) +* Python Enhancement Proposals; PEP 544 <2>: Nominal vs structural subtyping. + (line 23) +* Python Enhancement Proposals; PEP 544 <3>: Building generic types. + (line 380) +* Python Enhancement Proposals; PEP 545: PEP 545 Python Documentation Translations. + (line 6) +* Python Enhancement Proposals; PEP 545 <1>: PEP 545 Python Documentation Translations. + (line 20) +* Python Enhancement Proposals; PEP 552: Other CPython Implementation Changes. + (line 16) +* Python Enhancement Proposals; PEP 552 <1>: PEP 552 Hash-based pyc Files. + (line 15) +* Python Enhancement Proposals; PEP 552 <2>: PEP 552 Hash-based pyc Files. + (line 35) +* Python Enhancement Proposals; PEP 552 <3>: Library<34>. (line 797) +* Python Enhancement Proposals; PEP 552 <4>: Core and Builtins<42>. + (line 75) +* Python Enhancement Proposals; PEP 552 <5>: Introduction<10>. + (line 87) +* Python Enhancement Proposals; PEP 552 <6>: py_compile — Compile Python source files. + (line 82) +* Python Enhancement Proposals; PEP 552 <7>: PyConfig. (line 263) +* Python Enhancement Proposals; PEP 553: PEP 553 Built-in breakpoint. + (line 20) +* Python Enhancement Proposals; PEP 553 <1>: Core and Builtins<44>. + (line 72) +* Python Enhancement Proposals; PEP 557: dataclasses<3>. (line 26) +* Python Enhancement Proposals; PEP 557 <1>: dataclasses — Data Classes. + (line 12) +* Python Enhancement Proposals; PEP 560: PEP 560 Core Support for typing module and Generic Types. + (line 19) +* Python Enhancement Proposals; PEP 560 <1>: types<2>. (line 12) +* Python Enhancement Proposals; PEP 560 <2>: Core and Builtins<42>. + (line 66) +* Python Enhancement Proposals; PEP 560 <3>: Resolving MRO entries. + (line 15) +* Python Enhancement Proposals; PEP 560 <4>: __class_getitem__ versus __getitem__. + (line 85) +* Python Enhancement Proposals; PEP 560 <5>: Dynamic Type Creation. + (line 60) +* Python Enhancement Proposals; PEP 560 <6>: Dynamic Type Creation. + (line 74) +* Python Enhancement Proposals; PEP 562: PEP 562 Customization of Access to Module Attributes. + (line 16) +* Python Enhancement Proposals; PEP 562 <1>: Library<41>. (line 63) +* Python Enhancement Proposals; PEP 562 <2>: Core and Builtins<42>. + (line 69) +* Python Enhancement Proposals; PEP 562 <3>: Customizing module attribute access. + (line 52) +* Python Enhancement Proposals; PEP 563: PEP 563 may not be the future. + (line 6) +* Python Enhancement Proposals; PEP 563 <1>: PEP 563 Postponed Evaluation of Annotations. + (line 51) +* Python Enhancement Proposals; PEP 563 <2>: Library<15>. (line 300) +* Python Enhancement Proposals; PEP 563 <3>: Core and Builtins<22>. + (line 83) +* Python Enhancement Proposals; PEP 563 <4>: Future statements. + (line 34) +* Python Enhancement Proposals; PEP 563 <5>: Function definitions. + (line 144) +* Python Enhancement Proposals; PEP 563 <6>: Introspection helpers. + (line 33) +* Python Enhancement Proposals; PEP 563 <7>: Constant. (line 27) +* Python Enhancement Proposals; PEP 563 <8>: __future__ — Future statement definitions. + (line 134) +* Python Enhancement Proposals; PEP 563 <9>: __future__ — Future statement definitions. + (line 97) +* Python Enhancement Proposals; PEP 564: PEP 564 New Time Functions With Nanosecond Resolution. + (line 8) +* Python Enhancement Proposals; PEP 564 <1>: PEP 564 New Time Functions With Nanosecond Resolution. + (line 33) +* Python Enhancement Proposals; PEP 564 <2>: time<4>. (line 6) +* Python Enhancement Proposals; PEP 564 <3>: Library<43>. (line 300) +* Python Enhancement Proposals; PEP 565: PEP 565 Show DeprecationWarning in __main__. + (line 41) +* Python Enhancement Proposals; PEP 565 <1>: Warnings. (line 23) +* Python Enhancement Proposals; PEP 566: Using importlib metadata. + (line 23) +* Python Enhancement Proposals; PEP 566 <1>: Distribution metadata. + (line 19) +* Python Enhancement Proposals; PEP 566 <2>: Distributions. (line 28) +* Python Enhancement Proposals; PEP 567: contextvars. (line 20) +* Python Enhancement Proposals; PEP 567 <1>: asyncio<5>. (line 19) +* Python Enhancement Proposals; PEP 567 <2>: Documentation<34>. + (line 86) +* Python Enhancement Proposals; PEP 567 <3>: Documentation<36>. + (line 9) +* Python Enhancement Proposals; PEP 567 <4>: Core and Builtins<41>. + (line 63) +* Python Enhancement Proposals; PEP 567 <5>: contextvars — Context Variables. + (line 18) +* Python Enhancement Proposals; PEP 567 <6>: Scheduling callbacks. + (line 36) +* Python Enhancement Proposals; PEP 567 <7>: Scheduling delayed callbacks. + (line 31) +* Python Enhancement Proposals; PEP 567 <8>: Scheduling delayed callbacks. + (line 49) +* Python Enhancement Proposals; PEP 567 <9>: Future Object. (line 104) +* Python Enhancement Proposals; PEP 570: Positional-only parameters. + (line 70) +* Python Enhancement Proposals; PEP 570 <1>: Changes in the Python API<3>. + (line 160) +* Python Enhancement Proposals; PEP 570 <2>: Core and Builtins<32>. + (line 36) +* Python Enhancement Proposals; PEP 570 <3>: Function definitions. + (line 95) +* Python Enhancement Proposals; PEP 572: Assignment expressions. + (line 41) +* Python Enhancement Proposals; PEP 572 <1>: CPython bytecode changes<4>. + (line 27) +* Python Enhancement Proposals; PEP 572 <2>: Documentation<25>. + (line 6) +* Python Enhancement Proposals; PEP 572 <3>: Core and Builtins<30>. + (line 184) +* Python Enhancement Proposals; PEP 572 <4>: Core and Builtins<35>. + (line 92) +* Python Enhancement Proposals; PEP 572 <5>: Dictionary displays. + (line 47) +* Python Enhancement Proposals; PEP 572 <6>: Assignment expressions<2>. + (line 28) +* Python Enhancement Proposals; PEP 572 <7>: Capture Patterns. + (line 17) +* Python Enhancement Proposals; PEP 572 <8>: Why can’t I use an assignment in an expression?. + (line 14) +* Python Enhancement Proposals; PEP 573: Summary – Release highlights<3>. + (line 27) +* Python Enhancement Proposals; PEP 573 <1>: New Features<6>. + (line 6) +* Python Enhancement Proposals; PEP 573 <2>: Core and Builtins<24>. + (line 19) +* Python Enhancement Proposals; PEP 573 <3>: C API<21>. (line 57) +* Python Enhancement Proposals; PEP 573 <4>: Using a “defining class” converter. + (line 60) +* Python Enhancement Proposals; PEP 574: Pickle protocol 5 with out-of-band data buffers. + (line 17) +* Python Enhancement Proposals; PEP 574 <1>: Data stream format. + (line 46) +* Python Enhancement Proposals; PEP 574 <2>: Example<4>. (line 63) +* Python Enhancement Proposals; PEP 578: PEP 578 Python Runtime Audit Hooks. + (line 12) +* Python Enhancement Proposals; PEP 578 <1>: Audit events table. + (line 8) +* Python Enhancement Proposals; PEP 578 <2>: sys — System-specific parameters and functions. + (line 44) +* Python Enhancement Proposals; PEP 578 <3>: System Functions. + (line 179) +* Python Enhancement Proposals; PEP 584: Summary – Release highlights<3>. + (line 8) +* Python Enhancement Proposals; PEP 584 <1>: Dictionary Merge & Update Operators. + (line 19) +* Python Enhancement Proposals; PEP 584 <2>: Library<24>. (line 192) +* Python Enhancement Proposals; PEP 584 <3>: Library<24>. (line 195) +* Python Enhancement Proposals; PEP 584 <4>: Library<24>. (line 209) +* Python Enhancement Proposals; PEP 584 <5>: Library<25>. (line 49) +* Python Enhancement Proposals; PEP 584 <6>: Library<25>. (line 62) +* Python Enhancement Proposals; PEP 584 <7>: Library<25>. (line 120) +* Python Enhancement Proposals; PEP 584 <8>: Library<25>. (line 142) +* Python Enhancement Proposals; PEP 584 <9>: ChainMap objects. + (line 90) +* Python Enhancement Proposals; PEP 584 <10>: defaultdict objects. + (line 56) +* Python Enhancement Proposals; PEP 584 <11>: OrderedDict objects. + (line 111) +* Python Enhancement Proposals; PEP 584 <12>: weakref — Weak references. + (line 173) +* Python Enhancement Proposals; PEP 584 <13>: weakref — Weak references. + (line 193) +* Python Enhancement Proposals; PEP 584 <14>: Standard Interpreter Types. + (line 269) +* Python Enhancement Proposals; PEP 584 <15>: Process Parameters. + (line 50) +* Python Enhancement Proposals; PEP 584 <16>: Process Parameters. + (line 66) +* Python Enhancement Proposals; PEP 585: Summary – Release highlights<3>. + (line 10) +* Python Enhancement Proposals; PEP 585 <1>: Type Hinting Generics in Standard Collections. + (line 18) +* Python Enhancement Proposals; PEP 585 <2>: Library<12>. (line 123) +* Python Enhancement Proposals; PEP 585 <3>: Documentation<13>. + (line 31) +* Python Enhancement Proposals; PEP 585 <4>: Special Attributes of GenericAlias objects. + (line 54) +* Python Enhancement Proposals; PEP 585 <5>: collections abc — Abstract Base Classes for Containers. + (line 85) +* Python Enhancement Proposals; PEP 585 <6>: Relevant PEPs. (line 23) +* Python Enhancement Proposals; PEP 585 <7>: Module contents<3>. + (line 21) +* Python Enhancement Proposals; PEP 585 <8>: Special forms. (line 24) +* Python Enhancement Proposals; PEP 585 <9>: Special forms. (line 113) +* Python Enhancement Proposals; PEP 585 <10>: Special forms. (line 224) +* Python Enhancement Proposals; PEP 585 <11>: Corresponding to built-in types. + (line 18) +* Python Enhancement Proposals; PEP 585 <12>: Corresponding to built-in types. + (line 38) +* Python Enhancement Proposals; PEP 585 <13>: Corresponding to built-in types. + (line 47) +* Python Enhancement Proposals; PEP 585 <14>: Corresponding to built-in types. + (line 54) +* Python Enhancement Proposals; PEP 585 <15>: Corresponding to types in collections. + (line 14) +* Python Enhancement Proposals; PEP 585 <16>: Corresponding to types in collections. + (line 25) +* Python Enhancement Proposals; PEP 585 <17>: Corresponding to types in collections. + (line 38) +* Python Enhancement Proposals; PEP 585 <18>: Corresponding to types in collections. + (line 49) +* Python Enhancement Proposals; PEP 585 <19>: Corresponding to types in collections. + (line 60) +* Python Enhancement Proposals; PEP 585 <20>: Other concrete types. + (line 32) +* Python Enhancement Proposals; PEP 585 <21>: Corresponding to collections in collections abc. + (line 11) +* Python Enhancement Proposals; PEP 585 <22>: Corresponding to collections in collections abc. + (line 24) +* Python Enhancement Proposals; PEP 585 <23>: Corresponding to collections in collections abc. + (line 34) +* Python Enhancement Proposals; PEP 585 <24>: Corresponding to collections in collections abc. + (line 42) +* Python Enhancement Proposals; PEP 585 <25>: Corresponding to collections in collections abc. + (line 50) +* Python Enhancement Proposals; PEP 585 <26>: Corresponding to collections in collections abc. + (line 58) +* Python Enhancement Proposals; PEP 585 <27>: Corresponding to collections in collections abc. + (line 70) +* Python Enhancement Proposals; PEP 585 <28>: Corresponding to collections in collections abc. + (line 78) +* Python Enhancement Proposals; PEP 585 <29>: Corresponding to collections in collections abc. + (line 86) +* Python Enhancement Proposals; PEP 585 <30>: Corresponding to collections in collections abc. + (line 94) +* Python Enhancement Proposals; PEP 585 <31>: Corresponding to collections in collections abc. + (line 102) +* Python Enhancement Proposals; PEP 585 <32>: Corresponding to collections in collections abc. + (line 110) +* Python Enhancement Proposals; PEP 585 <33>: Corresponding to collections in collections abc. + (line 118) +* Python Enhancement Proposals; PEP 585 <34>: Corresponding to other types in collections abc. + (line 11) +* Python Enhancement Proposals; PEP 585 <35>: Corresponding to other types in collections abc. + (line 19) +* Python Enhancement Proposals; PEP 585 <36>: Corresponding to other types in collections abc. + (line 55) +* Python Enhancement Proposals; PEP 585 <37>: Corresponding to other types in collections abc. + (line 67) +* Python Enhancement Proposals; PEP 585 <38>: Asynchronous programming. + (line 22) +* Python Enhancement Proposals; PEP 585 <39>: Asynchronous programming. + (line 60) +* Python Enhancement Proposals; PEP 585 <40>: Asynchronous programming. + (line 70) +* Python Enhancement Proposals; PEP 585 <41>: Asynchronous programming. + (line 80) +* Python Enhancement Proposals; PEP 585 <42>: Asynchronous programming. + (line 90) +* Python Enhancement Proposals; PEP 585 <43>: Context manager types. + (line 15) +* Python Enhancement Proposals; PEP 585 <44>: Context manager types. + (line 29) +* Python Enhancement Proposals; PEP 585 <45>: Introspection helpers. + (line 90) +* Python Enhancement Proposals; PEP 585 <46>: Deprecation Timeline of Major Features. + (line 18) +* Python Enhancement Proposals; PEP 585 <47>: Glossary. (line 600) +* Python Enhancement Proposals; PEP 586: typing<2>. (line 8) +* Python Enhancement Proposals; PEP 586 <1>: typing<4>. (line 6) +* Python Enhancement Proposals; PEP 586 <2>: typing<5>. (line 18) +* Python Enhancement Proposals; PEP 586 <3>: Relevant PEPs. (line 29) +* Python Enhancement Proposals; PEP 586 <4>: Special forms. (line 244) +* Python Enhancement Proposals; PEP 587: Deprecated<2>. (line 34) +* Python Enhancement Proposals; PEP 587 <1>: PEP 587 Python Initialization Configuration. + (line 6) +* Python Enhancement Proposals; PEP 587 <2>: PEP 587 Python Initialization Configuration. + (line 83) +* Python Enhancement Proposals; PEP 587 <3>: C API<12>. (line 125) +* Python Enhancement Proposals; PEP 587 <4>: Core and Builtins<30>. + (line 76) +* Python Enhancement Proposals; PEP 587 <5>: C API<28>. (line 6) +* Python Enhancement Proposals; PEP 587 <6>: Python Initialization Configuration. + (line 32) +* Python Enhancement Proposals; PEP 589: typing<5>. (line 8) +* Python Enhancement Proposals; PEP 589 <1>: Relevant PEPs. (line 34) +* Python Enhancement Proposals; PEP 589 <2>: Other special directives. + (line 281) +* Python Enhancement Proposals; PEP 590: Porting to Python 3 11<2>. + (line 98) +* Python Enhancement Proposals; PEP 590 <1>: Optimizations<2>. + (line 55) +* Python Enhancement Proposals; PEP 590 <2>: Summary – Release highlights<3>. + (line 33) +* Python Enhancement Proposals; PEP 590 <3>: Optimizations<3>. + (line 37) +* Python Enhancement Proposals; PEP 590 <4>: PEP 590 Vectorcall a fast calling protocol for CPython. + (line 14) +* Python Enhancement Proposals; PEP 590 <5>: Library<8>. (line 69) +* Python Enhancement Proposals; PEP 590 <6>: Core and Builtins<11>. + (line 57) +* Python Enhancement Proposals; PEP 590 <7>: Core and Builtins<14>. + (line 118) +* Python Enhancement Proposals; PEP 590 <8>: Core and Builtins<15>. + (line 347) +* Python Enhancement Proposals; PEP 590 <9>: Core and Builtins<17>. + (line 27) +* Python Enhancement Proposals; PEP 590 <10>: Core and Builtins<17>. + (line 74) +* Python Enhancement Proposals; PEP 590 <11>: Core and Builtins<23>. + (line 10) +* Python Enhancement Proposals; PEP 590 <12>: Core and Builtins<23>. + (line 16) +* Python Enhancement Proposals; PEP 590 <13>: Core and Builtins<25>. + (line 39) +* Python Enhancement Proposals; PEP 590 <14>: Core and Builtins<25>. + (line 91) +* Python Enhancement Proposals; PEP 590 <15>: Core and Builtins<26>. + (line 42) +* Python Enhancement Proposals; PEP 590 <16>: Core and Builtins<26>. + (line 50) +* Python Enhancement Proposals; PEP 590 <17>: Core and Builtins<26>. + (line 67) +* Python Enhancement Proposals; PEP 590 <18>: C API<28>. (line 17) +* Python Enhancement Proposals; PEP 590 <19>: The Vectorcall Protocol. + (line 8) +* Python Enhancement Proposals; PEP 591: typing<5>. (line 25) +* Python Enhancement Proposals; PEP 591 <1>: Relevant PEPs. (line 39) +* Python Enhancement Proposals; PEP 591 <2>: Special forms. (line 297) +* Python Enhancement Proposals; PEP 591 <3>: Functions and decorators. + (line 298) +* Python Enhancement Proposals; PEP 593: Summary – Release highlights<3>. + (line 20) +* Python Enhancement Proposals; PEP 593 <1>: typing<3>. (line 6) +* Python Enhancement Proposals; PEP 593 <2>: Library<26>. (line 91) +* Python Enhancement Proposals; PEP 593 <3>: Relevant PEPs. (line 45) +* Python Enhancement Proposals; PEP 593 <4>: Special forms. (line 315) +* Python Enhancement Proposals; PEP 593 <5>: Introspection helpers. + (line 37) +* Python Enhancement Proposals; PEP 594: Summary – Release highlights. + (line 46) +* Python Enhancement Proposals; PEP 594 <1>: Deprecated. (line 102) +* Python Enhancement Proposals; PEP 594 <2>: Library<7>. (line 93) +* Python Enhancement Proposals; PEP 594 <3>: Library<8>. (line 124) +* Python Enhancement Proposals; PEP 594 <4>: Library<8>. (line 150) +* Python Enhancement Proposals; PEP 594 <5>: Tests<8>. (line 25) +* Python Enhancement Proposals; PEP 594 <6>: nntplib — NNTP protocol client. + (line 9) +* Python Enhancement Proposals; PEP 594#aifc: aifc — Read and write AIFF and AIFC files. + (line 9) +* Python Enhancement Proposals; PEP 594#asynchat: asynchat — Asynchronous socket command/response handler. + (line 9) +* Python Enhancement Proposals; PEP 594#asyncore: asyncore — Asynchronous socket handler. + (line 9) +* Python Enhancement Proposals; PEP 594#audioop: audioop — Manipulate raw audio data. + (line 7) +* Python Enhancement Proposals; PEP 594#cgi: cgi — Common Gateway Interface support. + (line 9) +* Python Enhancement Proposals; PEP 594#cgitb: cgitb — Traceback manager for CGI scripts. + (line 9) +* Python Enhancement Proposals; PEP 594#chunk: chunk — Read IFF chunked data. + (line 9) +* Python Enhancement Proposals; PEP 594#crypt: crypt — Function to check Unix passwords. + (line 9) +* Python Enhancement Proposals; PEP 594#imghdr: imghdr — Determine the type of an image. + (line 9) +* Python Enhancement Proposals; PEP 594#mailcap: mailcap — Mailcap file handling. + (line 9) +* Python Enhancement Proposals; PEP 594#msilib: msilib — Read and write Microsoft Installer files. + (line 9) +* Python Enhancement Proposals; PEP 594#nis: nis — Interface to Sun’s NIS Yellow Pages. + (line 7) +* Python Enhancement Proposals; PEP 594#ossaudiodev: ossaudiodev — Access to OSS-compatible audio devices. + (line 7) +* Python Enhancement Proposals; PEP 594#pipes: pipes — Interface to shell pipelines. + (line 9) +* Python Enhancement Proposals; PEP 594#smtpd: smtpd — SMTP Server. + (line 13) +* Python Enhancement Proposals; PEP 594#sndhdr: sndhdr — Determine type of sound file. + (line 9) +* Python Enhancement Proposals; PEP 594#spwd: spwd — The shadow password database. + (line 7) +* Python Enhancement Proposals; PEP 594#sunau: sunau — Read and write Sun AU files. + (line 9) +* Python Enhancement Proposals; PEP 594#telnetlib: telnetlib — Telnet client. + (line 9) +* Python Enhancement Proposals; PEP 594#uu-and-the-uu-encoding: uu — Encode and decode uuencode files. + (line 9) +* Python Enhancement Proposals; PEP 594#xdrlib: xdrlib — Encode and decode XDR data. + (line 9) +* Python Enhancement Proposals; PEP 596: What’s New In Python 3 9. + (line 23) +* Python Enhancement Proposals; PEP 597: Summary – Release highlights<2>. + (line 44) +* Python Enhancement Proposals; PEP 597 <1>: Library<16>. (line 44) +* Python Enhancement Proposals; PEP 597 <2>: Opt-in EncodingWarning. + (line 6) +* Python Enhancement Proposals; PEP 6: How does the Python version numbering scheme work?. + (line 17) +* Python Enhancement Proposals; PEP 602: Summary – Release highlights<3>. + (line 59) +* Python Enhancement Proposals; PEP 602 <1>: How stable is Python?. + (line 8) +* Python Enhancement Proposals; PEP 604: Summary – Release highlights<2>. + (line 27) +* Python Enhancement Proposals; PEP 604 <1>: PEP 604 New Type Union Operator. + (line 28) +* Python Enhancement Proposals; PEP 604 <2>: Library<19>. (line 25) +* Python Enhancement Proposals; PEP 604 <3>: Documentation<22>. + (line 6) +* Python Enhancement Proposals; PEP 604 <4>: Union Type. (line 95) +* Python Enhancement Proposals; PEP 604 <5>: Relevant PEPs. (line 50) +* Python Enhancement Proposals; PEP 604 <6>: Manually Un-Stringizing Stringized Annotations. + (line 43) +* Python Enhancement Proposals; PEP 612: Summary – Release highlights<2>. + (line 31) +* Python Enhancement Proposals; PEP 612 <1>: PEP 612 Parameter Specification Variables. + (line 25) +* Python Enhancement Proposals; PEP 612 <2>: Library<14>. (line 691) +* Python Enhancement Proposals; PEP 612 <3>: Library<15>. (line 95) +* Python Enhancement Proposals; PEP 612 <4>: Core and Builtins<20>. + (line 59) +* Python Enhancement Proposals; PEP 612 <5>: Library<19>. (line 25) +* Python Enhancement Proposals; PEP 612 <6>: Library<19>. (line 119) +* Python Enhancement Proposals; PEP 612 <7>: Relevant PEPs. (line 57) +* Python Enhancement Proposals; PEP 612 <8>: Callable. (line 37) +* Python Enhancement Proposals; PEP 612 <9>: User-defined generic types. + (line 151) +* Python Enhancement Proposals; PEP 612 <10>: Special forms. (line 117) +* Python Enhancement Proposals; PEP 612 <11>: Special forms. (line 176) +* Python Enhancement Proposals; PEP 612 <12>: Building generic types. + (line 319) +* Python Enhancement Proposals; PEP 613: Summary – Release highlights<2>. + (line 29) +* Python Enhancement Proposals; PEP 613 <1>: PEP 613 TypeAlias. + (line 21) +* Python Enhancement Proposals; PEP 613 <2>: Library<21>. (line 98) +* Python Enhancement Proposals; PEP 613 <3>: Relevant PEPs. (line 63) +* Python Enhancement Proposals; PEP 613 <4>: Special types. (line 151) +* Python Enhancement Proposals; PEP 614: Summary – Release highlights<3>. + (line 12) +* Python Enhancement Proposals; PEP 614 <1>: Other Language Changes<3>. + (line 38) +* Python Enhancement Proposals; PEP 614 <2>: Core and Builtins<26>. + (line 112) +* Python Enhancement Proposals; PEP 614 <3>: Function definitions. + (line 54) +* Python Enhancement Proposals; PEP 614 <4>: Class definitions. + (line 60) +* Python Enhancement Proposals; PEP 615: Summary – Release highlights<3>. + (line 51) +* Python Enhancement Proposals; PEP 615 <1>: zoneinfo. (line 37) +* Python Enhancement Proposals; PEP 615 <2>: Library<23>. (line 54) +* Python Enhancement Proposals; PEP 615 <3>: zoneinfo — IANA time zone support. + (line 12) +* Python Enhancement Proposals; PEP 616: Summary – Release highlights<3>. + (line 16) +* Python Enhancement Proposals; PEP 616 <1>: New String Methods to Remove Prefixes and Suffixes. + (line 9) +* Python Enhancement Proposals; PEP 616 <2>: Core and Builtins<25>. + (line 82) +* Python Enhancement Proposals; PEP 617: Deprecated. (line 25) +* Python Enhancement Proposals; PEP 617 <1>: Parenthesized context managers. + (line 45) +* Python Enhancement Proposals; PEP 617 <2>: Summary – Release highlights<3>. + (line 30) +* Python Enhancement Proposals; PEP 617 <3>: New Parser. (line 21) +* Python Enhancement Proposals; PEP 617 <4>: Deprecated<5>. (line 97) +* Python Enhancement Proposals; PEP 617 <5>: Library<14>. (line 178) +* Python Enhancement Proposals; PEP 617 <6>: Library<24>. (line 35) +* Python Enhancement Proposals; PEP 617 <7>: Full Grammar specification. + (line 16) +* Python Enhancement Proposals; PEP 617 <8>: lib2to3 — 2to3’s library. + (line 11) +* Python Enhancement Proposals; PEP 618: Summary – Release highlights<2>. + (line 19) +* Python Enhancement Proposals; PEP 618 <1>: Other Language Changes<2>. + (line 17) +* Python Enhancement Proposals; PEP 618 <2>: Core and Builtins<23>. + (line 209) +* Python Enhancement Proposals; PEP 623: Summary – Release highlights<2>. + (line 39) +* Python Enhancement Proposals; PEP 623 <1>: C API<5>. (line 22) +* Python Enhancement Proposals; PEP 623 <2>: Core and Builtins<18>. + (line 10) +* Python Enhancement Proposals; PEP 623 <3>: Documentation<17>. + (line 10) +* Python Enhancement Proposals; PEP 623 <4>: Unicode Objects. + (line 33) +* Python Enhancement Proposals; PEP 624: Summary – Release highlights. + (line 49) +* Python Enhancement Proposals; PEP 624 <1>: Removed<2>. (line 97) +* Python Enhancement Proposals; PEP 624 <2>: Summary – Release highlights<2>. + (line 42) +* Python Enhancement Proposals; PEP 624 <3>: C API<12>. (line 143) +* Python Enhancement Proposals; PEP 624#alternative-apis: Removed<2>. + (line 97) +* Python Enhancement Proposals; PEP 626: Summary – Release highlights<2>. + (line 23) +* Python Enhancement Proposals; PEP 626 <1>: Core and Builtins<5>. + (line 25) +* Python Enhancement Proposals; PEP 626 <2>: Analysis functions. + (line 146) +* Python Enhancement Proposals; PEP 628: cmath. (line 7) +* Python Enhancement Proposals; PEP 628 <1>: math<5>. (line 7) +* Python Enhancement Proposals; PEP 628 <2>: Library<58>. (line 32) +* Python Enhancement Proposals; PEP 632: Summary – Release highlights<2>. + (line 37) +* Python Enhancement Proposals; PEP 632 <1>: distutils. (line 14) +* Python Enhancement Proposals; PEP 634: Summary – Release highlights<2>. + (line 8) +* Python Enhancement Proposals; PEP 634 <1>: Other Key Features. + (line 52) +* Python Enhancement Proposals; PEP 634 <2>: Core and Builtins<8>. + (line 55) +* Python Enhancement Proposals; PEP 634 <3>: Core and Builtins<16>. + (line 54) +* Python Enhancement Proposals; PEP 634 <4>: Core and Builtins<18>. + (line 57) +* Python Enhancement Proposals; PEP 634 <5>: Customizing positional arguments in class pattern matching. + (line 32) +* Python Enhancement Proposals; PEP 634 <6>: The match statement. + (line 33) +* Python Enhancement Proposals; PEP 634 <7>: Class Patterns. (line 137) +* Python Enhancement Proposals; PEP 634 <8>: lib2to3 — 2to3’s library. + (line 13) +* Python Enhancement Proposals; PEP 634 <9>: PyTypeObject Slots. + (line 697) +* Python Enhancement Proposals; PEP 634 <10>: PyTypeObject Slots. + (line 721) +* Python Enhancement Proposals; PEP 635: Summary – Release highlights<2>. + (line 10) +* Python Enhancement Proposals; PEP 635 <1>: Other Key Features. + (line 53) +* Python Enhancement Proposals; PEP 636: Summary – Release highlights<2>. + (line 12) +* Python Enhancement Proposals; PEP 636 <1>: Other Key Features. + (line 53) +* Python Enhancement Proposals; PEP 636 <2>: match Statements. + (line 172) +* Python Enhancement Proposals; PEP 636 <3>: The match statement. + (line 35) +* Python Enhancement Proposals; PEP 636 <4>: Class Patterns. (line 139) +* Python Enhancement Proposals; PEP 644: Summary – Release highlights<2>. + (line 35) +* Python Enhancement Proposals; PEP 644 <1>: hashlib<2>. (line 7) +* Python Enhancement Proposals; PEP 644 <2>: ssl. (line 7) +* Python Enhancement Proposals; PEP 644 <3>: Build Changes<2>. + (line 6) +* Python Enhancement Proposals; PEP 644 <4>: Build<16>. (line 9) +* Python Enhancement Proposals; PEP 644 <5>: ssl — TLS/SSL wrapper for socket objects. + (line 56) +* Python Enhancement Proposals; PEP 646: PEP 646 Variadic generics. + (line 7) +* Python Enhancement Proposals; PEP 646 <1>: PEP 646 Variadic generics. + (line 18) +* Python Enhancement Proposals; PEP 646 <2>: Relevant PEPs. (line 68) +* Python Enhancement Proposals; PEP 646 <3>: Building generic types. + (line 204) +* Python Enhancement Proposals; PEP 647: PEP 647 User-Defined Type Guards. + (line 9) +* Python Enhancement Proposals; PEP 647 <1>: Library<15>. (line 182) +* Python Enhancement Proposals; PEP 647 <2>: Relevant PEPs. (line 73) +* Python Enhancement Proposals; PEP 647 <3>: Special forms. (line 463) +* Python Enhancement Proposals; PEP 649: __future__ — Future statement definitions. + (line 135) +* Python Enhancement Proposals; PEP 652: PEP 652 Maintaining the Stable ABI. + (line 11) +* Python Enhancement Proposals; PEP 652 <1>: C API<13>. (line 40) +* Python Enhancement Proposals; PEP 654: PEP 654 Exception Groups and except*. + (line 6) +* Python Enhancement Proposals; PEP 654 <1>: PEP 654 Exception Groups and except*. + (line 13) +* Python Enhancement Proposals; PEP 654 <2>: Core and Builtins. + (line 29) +* Python Enhancement Proposals; PEP 654 <3>: Core and Builtins<12>. + (line 146) +* Python Enhancement Proposals; PEP 654 <4>: Core and Builtins<14>. + (line 88) +* Python Enhancement Proposals; PEP 655: PEP 655 Marking individual TypedDict items as required or not-required. + (line 30) +* Python Enhancement Proposals; PEP 655 <1>: Library<7>. (line 265) +* Python Enhancement Proposals; PEP 655 <2>: Relevant PEPs. (line 78) +* Python Enhancement Proposals; PEP 655 <3>: Special forms. (line 309) +* Python Enhancement Proposals; PEP 655 <4>: Other special directives. + (line 287) +* Python Enhancement Proposals; PEP 657: PEP 657 Fine-grained error locations in tracebacks. + (line 55) +* Python Enhancement Proposals; PEP 657 <1>: inspect. (line 17) +* Python Enhancement Proposals; PEP 657 <2>: Library<7>. (line 222) +* Python Enhancement Proposals; PEP 657 <3>: Core and Builtins<15>. + (line 336) +* Python Enhancement Proposals; PEP 659: PEP 659 Specializing Adaptive Interpreter. + (line 6) +* Python Enhancement Proposals; PEP 659 <1>: PEP 659 Specializing Adaptive Interpreter. + (line 30) +* Python Enhancement Proposals; PEP 670: Summary – Release highlights. + (line 51) +* Python Enhancement Proposals; PEP 670 <1>: Porting to Python 3 11<2>. + (line 12) +* Python Enhancement Proposals; PEP 673: PEP 673 Self type. (line 32) +* Python Enhancement Proposals; PEP 673 <1>: Library<9>. (line 134) +* Python Enhancement Proposals; PEP 673 <2>: Relevant PEPs. (line 83) +* Python Enhancement Proposals; PEP 673 <3>: Special types. (line 138) +* Python Enhancement Proposals; PEP 675: PEP 675 Arbitrary literal string type. + (line 32) +* Python Enhancement Proposals; PEP 675 <1>: Library<8>. (line 59) +* Python Enhancement Proposals; PEP 675 <2>: Relevant PEPs. (line 88) +* Python Enhancement Proposals; PEP 675 <3>: Special types. (line 47) +* Python Enhancement Proposals; PEP 676: Documentation<8>. (line 8) +* Python Enhancement Proposals; PEP 678: PEP 678 Exceptions can be enriched with notes. + (line 11) +* Python Enhancement Proposals; PEP 678 <1>: Core and Builtins<8>. + (line 118) +* Python Enhancement Proposals; PEP 680: Summary – Release highlights. + (line 20) +* Python Enhancement Proposals; PEP 680 <1>: New Modules. (line 6) +* Python Enhancement Proposals; PEP 680 <2>: Library<8>. (line 205) +* Python Enhancement Proposals; PEP 681: PEP 681 Data class transforms. + (line 30) +* Python Enhancement Proposals; PEP 681 <1>: Library<7>. (line 109) +* Python Enhancement Proposals; PEP 681 <2>: Relevant PEPs. (line 93) +* Python Enhancement Proposals; PEP 681 <3>: Functions and decorators. + (line 219) +* Python Enhancement Proposals; PEP 682: Other Language Changes. + (line 45) +* Python Enhancement Proposals; PEP 682 <1>: Format Specification Mini-Language. + (line 91) +* Python Enhancement Proposals; PEP 686: Python UTF-8 Mode. (line 70) +* Python Enhancement Proposals; PEP 686 <1>: Text Encoding. (line 32) +* Python Enhancement Proposals; PEP 7: Build and C API Changes<2>. + (line 9) +* Python Enhancement Proposals; PEP 7 <1>: Coding standards. (line 7) +* Python Enhancement Proposals; PEP 7 <2>: Useful macros. (line 139) +* Python Enhancement Proposals; PEP 7 <3>: Useful macros. (line 157) +* Python Enhancement Proposals; PEP 8: Library Changes. (line 26) +* Python Enhancement Proposals; PEP 8 <1>: Library<43>. (line 125) +* Python Enhancement Proposals; PEP 8 <2>: IDLE<51>. (line 81) +* Python Enhancement Proposals; PEP 8 <3>: Intermezzo Coding Style. + (line 13) +* Python Enhancement Proposals; PEP 8 <4>: Editors and IDEs. (line 7) +* Python Enhancement Proposals; PEP 8 <5>: Value comparisons. + (line 61) +* Python Enhancement Proposals; PEP 8 <6>: Built-in Functions. + (line 1630) +* Python Enhancement Proposals; PEP 8 <7>: Using real Argument Clinic converters instead of “legacy converters”. + (line 50) +* Python Enhancement Proposals; PEP 8 <8>: Are there coding standards or a style guide for Python programs?. + (line 7) +* Python Enhancement Proposals; PEP 8 <9>: When can I rely on identity tests with the is operator?. + (line 57) +* Python Enhancement Proposals; PEP 8 <10>: How do I keep editors from inserting tabs into my Python source?. + (line 6) +* Python Package Index (PyPI): Installing the tools. + (line 26) +* PYTHON*: Other Improvements<2>. + (line 9) +* PYTHON* <1>: Interface options. (line 80) +* PYTHON* <2>: Interface options. (line 140) +* PYTHON* <3>: Miscellaneous options. + (line 42) +* PYTHON* <4>: Miscellaneous options. + (line 64) +* PYTHON* <5>: Global configuration variables. + (line 56) +* python–m-py_compile command line option; -: Command-Line Interface<6>. + (line 13) +* python–m-py_compile command line option; -q: Command-Line Interface<6>. + (line 19) +* python–m-py_compile command line option; –quiet: Command-Line Interface<6>. + (line 19) +* python–m-py_compile command line option; : Command-Line Interface<6>. + (line 13) +* PYTHONASYNCIODEBUG: Enabling debug mode. + (line 10) +* PYTHONASYNCIODEBUG <1>: Debug Mode. (line 11) +* PYTHONASYNCIODEBUG <2>: Effects of the Python Development Mode. + (line 64) +* PYTHONBREAKPOINT: PEP 553 Built-in breakpoint. + (line 13) +* PYTHONBREAKPOINT <1>: sys — System-specific parameters and functions. + (line 221) +* PYTHONBREAKPOINT <2>: sys — System-specific parameters and functions. + (line 235) +* PYTHONBREAKPOINT <3>: sys — System-specific parameters and functions. + (line 239) +* PYTHONCASEOK: Changes in the Python API<2>. + (line 29) +* PYTHONCASEOK <1>: PEP 235 Importing Modules on Case-Insensitive Platforms. + (line 17) +* PYTHONCASEOK <2>: Library<25>. (line 144) +* PYTHONCASEOK <3>: Built-in Functions. (line 2018) +* PYTHONCOERCECLOCALE: PEP 538 Legacy C Locale Coercion. + (line 13) +* PYTHONCOERCECLOCALE <1>: General Options. (line 96) +* PYTHONCOERCECLOCALE <2>: Python UTF-8 Mode. (line 56) +* PYTHONCOERCECLOCALE <3>: Python Configuration. + (line 15) +* PYTHONDEBUG: Miscellaneous options. + (line 38) +* PYTHONDEBUG <1>: Global configuration variables. + (line 28) +* PYTHONDEBUG <2>: PyConfig. (line 616) +* PYTHONDEVMODE: Python Development Mode -X dev. + (line 6) +* PYTHONDEVMODE <1>: Python Development Mode. + (line 14) +* PYTHONDEVMODE <2>: PyConfig. (line 284) +* PYTHONDOCS: pydoc — Documentation generator and online help system. + (line 85) +* PYTHONDONTWRITEBYTECODE: Interpreter Changes<2>. + (line 16) +* PYTHONDONTWRITEBYTECODE <1>: New and Improved Modules<2>. + (line 624) +* PYTHONDONTWRITEBYTECODE <2>: Miscellaneous options. + (line 19) +* PYTHONDONTWRITEBYTECODE <3>: sys — System-specific parameters and functions. + (line 305) +* PYTHONDONTWRITEBYTECODE <4>: Global configuration variables. + (line 36) +* PYTHONDONTWRITEBYTECODE <5>: PyConfig. (line 868) +* PYTHONDONTWRITEBYTECODE <6>: How do I create a pyc file?. + (line 21) +* PYTHONDUMPREFS: Debug build uses the same ABI as release build. + (line 15) +* PYTHONDUMPREFS <1>: Build<32>. (line 54) +* PYTHONDUMPREFS <2>: Debug options. (line 22) +* PYTHONDUMPREFS <3>: PyConfig. (line 295) +* PYTHONDUMPREFS <4>: PyObject Slots. (line 65) +* PYTHONDUMPREFSFILE: Core and Builtins<15>. + (line 154) +* PYTHONEXECUTABLE: PyConfig. (line 650) +* PYTHONFAULTHANDLER: faulthandler<4>. (line 11) +* PYTHONFAULTHANDLER <1>: Effects of the Python Development Mode. + (line 58) +* PYTHONFAULTHANDLER <2>: faulthandler — Dump the Python traceback. + (line 14) +* PYTHONFAULTHANDLER <3>: PyConfig. (line 329) +* PYTHONHASHSEED: Builtin functions and types. + (line 17) +* PYTHONHASHSEED <1>: Porting Python code. + (line 6) +* PYTHONHASHSEED <2>: Core and Builtins<42>. + (line 30) +* PYTHONHASHSEED <3>: Miscellaneous options. + (line 117) +* PYTHONHASHSEED <4>: Miscellaneous options. + (line 133) +* PYTHONHASHSEED <5>: Environment variables. + (line 144) +* PYTHONHASHSEED <6>: Basic customization. + (line 297) +* PYTHONHASHSEED <7>: Global configuration variables. + (line 48) +* PYTHONHASHSEED <8>: Global configuration variables. + (line 51) +* PYTHONHASHSEED <9>: PyConfig. (line 399) +* PYTHONHOME: Summary – Release highlights<5>. + (line 107) +* PYTHONHOME <1>: Miscellaneous options. + (line 43) +* PYTHONHOME <2>: Environment variables. + (line 19) +* PYTHONHOME <3>: Environment variables. + (line 21) +* PYTHONHOME <4>: Environment variables. + (line 38) +* PYTHONHOME <5>: Finding modules. (line 29) +* PYTHONHOME <6>: Finding modules. (line 47) +* PYTHONHOME <7>: Finding modules. (line 81) +* PYTHONHOME <8>: test support script_helper — Utilities for the Python execution tests. + (line 25) +* PYTHONHOME <9>: The initialization of the sys path module search path. + (line 30) +* PYTHONHOME <10>: Virtual environments<2>. + (line 14) +* PYTHONHOME <11>: Embedding Python<2>. + (line 38) +* PYTHONHOME <12>: Embedding Python<2>. + (line 44) +* PYTHONHOME <13>: Global configuration variables. + (line 57) +* PYTHONHOME <14>: Process-wide parameters. + (line 351) +* PYTHONHOME <15>: Process-wide parameters. + (line 367) +* PYTHONHOME <16>: PyConfig. (line 411) +* PYTHONHOME <17>: Modifying Python’s Search Path. + (line 60) +* PYTHONHOME <18>: Modifying Python’s Search Path. + (line 62) +* Pythonic: Glossary. (line 1152) +* PYTHONINSPECT: Other Changes and Fixes<2>. + (line 13) +* PYTHONINSPECT <1>: Miscellaneous options. + (line 55) +* PYTHONINSPECT <2>: Global configuration variables. + (line 68) +* PYTHONINSPECT <3>: PyConfig. (line 436) +* PYTHONINTMAXSTRDIGITS: Core and Builtins. (line 18) +* PYTHONINTMAXSTRDIGITS <1>: Miscellaneous options. + (line 265) +* PYTHONINTMAXSTRDIGITS <2>: Configuring the limit. + (line 9) +* PYTHONINTMAXSTRDIGITS <3>: Configuring the limit. + (line 16) +* PYTHONINTMAXSTRDIGITS <4>: sys — System-specific parameters and functions. + (line 1038) +* PYTHONIOENCODING: Other Improvements<2>. + (line 75) +* PYTHONIOENCODING <1>: Interpreter Changes<2>. + (line 23) +* PYTHONIOENCODING <2>: Environment variables. + (line 377) +* PYTHONIOENCODING <3>: Python UTF-8 Mode. (line 29) +* PYTHONIOENCODING <4>: sys — System-specific parameters and functions. + (line 1644) +* PYTHONIOENCODING <5>: Process-wide parameters. + (line 19) +* PYTHONIOENCODING <6>: Process-wide parameters. + (line 23) +* PYTHONIOENCODING <7>: PyConfig. (line 772) +* PYTHONLEGACYWINDOWSFSENCODING: PEP 529 Change Windows filesystem encoding to UTF-8. + (line 18) +* PYTHONLEGACYWINDOWSFSENCODING <1>: sys — System-specific parameters and functions. + (line 1592) +* PYTHONLEGACYWINDOWSFSENCODING <2>: Global configuration variables. + (line 92) +* PYTHONLEGACYWINDOWSFSENCODING <3>: PyPreConfig. (line 113) +* PYTHONLEGACYWINDOWSSTDIO: PEP 528 Change Windows console encoding to UTF-8. + (line 12) +* PYTHONLEGACYWINDOWSSTDIO <1>: Environment variables. + (line 179) +* PYTHONLEGACYWINDOWSSTDIO <2>: sys — System-specific parameters and functions. + (line 1648) +* PYTHONLEGACYWINDOWSSTDIO <3>: Global configuration variables. + (line 104) +* PYTHONLEGACYWINDOWSSTDIO <4>: PyConfig. (line 483) +* PYTHONMALLOC: PYTHONMALLOC environment variable. + (line 6) +* PYTHONMALLOC <1>: Changes in the C API<5>. + (line 9) +* PYTHONMALLOC <2>: Core and Builtins<62>. + (line 90) +* PYTHONMALLOC <3>: Environment variables. + (line 304) +* PYTHONMALLOC <4>: Performance options. + (line 58) +* PYTHONMALLOC <5>: Effects of the Python Development Mode. + (line 46) +* PYTHONMALLOC <6>: Effects of the Python Development Mode. + (line 50) +* PYTHONMALLOC <7>: Overview<4>. (line 75) +* PYTHONMALLOC <8>: Default Memory Allocators. + (line 26) +* PYTHONMALLOC <9>: Debug hooks on the Python memory allocators. + (line 11) +* PYTHONMALLOC <10>: The pymalloc allocator. + (line 26) +* PYTHONMALLOCSTATS: Core and Builtins<62>. + (line 96) +* PYTHONMALLOCSTATS <1>: PyConfig. (line 499) +* PYTHONMALLOCSTATS <2>: Overview<4>. (line 78) +* PYTHONNODEBUGRANGES: PEP 657 Fine-grained error locations in tracebacks. + (line 63) +* PYTHONNODEBUGRANGES <1>: Miscellaneous options. + (line 297) +* PYTHONNODEBUGRANGES <2>: The standard type hierarchy. + (line 790) +* PYTHONNODEBUGRANGES <3>: PyConfig. (line 237) +* PYTHONNOUSERSITE: PEP 370 Per-user site-packages Directory. + (line 30) +* PYTHONNOUSERSITE <1>: Module contents<5>. (line 15) +* PYTHONNOUSERSITE <2>: Global configuration variables. + (line 126) +* PYTHONNOUSERSITE <3>: PyConfig. (line 821) +* PYTHONOPTIMIZE: Miscellaneous options. + (line 75) +* PYTHONOPTIMIZE <1>: Global configuration variables. + (line 131) +* PYTHONOPTIMIZE <2>: PyConfig. (line 566) +* PYTHONPATH: Changes in ‘python’ Command Behavior<2>. + (line 8) +* PYTHONPATH <1>: Changes in ‘python’ Command Behavior<2>. + (line 9) +* PYTHONPATH <2>: The Module Search Path. + (line 16) +* PYTHONPATH <3>: Standard Modules. (line 34) +* PYTHONPATH <4>: Standard Modules. (line 35) +* PYTHONPATH <5>: Miscellaneous options. + (line 42) +* PYTHONPATH <6>: Environment variables. + (line 32) +* PYTHONPATH <7>: Environment variables. + (line 39) +* PYTHONPATH <8>: Environment variables. + (line 42) +* PYTHONPATH <9>: Excursus Setting environment variables. + (line 38) +* PYTHONPATH <10>: Finding modules. (line 15) +* PYTHONPATH <11>: Finding modules. (line 38) +* PYTHONPATH <12>: Finding modules. (line 81) +* PYTHONPATH <13>: Configuration. (line 6) +* PYTHONPATH <14>: Path entry finders. (line 6) +* PYTHONPATH <15>: test support script_helper — Utilities for the Python execution tests. + (line 26) +* PYTHONPATH <16>: sys — System-specific parameters and functions. + (line 1172) +* PYTHONPATH <17>: sys — System-specific parameters and functions. + (line 1177) +* PYTHONPATH <18>: The initialization of the sys path module search path. + (line 14) +* PYTHONPATH <19>: The initialization of the sys path module search path. + (line 18) +* PYTHONPATH <20>: Installing your CGI script on a Unix system. + (line 29) +* PYTHONPATH <21>: Building C and C++ Extensions. + (line 9) +* PYTHONPATH <22>: Embedding Python<2>. + (line 39) +* PYTHONPATH <23>: Embedding Python<2>. + (line 44) +* PYTHONPATH <24>: Global configuration variables. + (line 56) +* PYTHONPATH <25>: PyConfig. (line 532) +* PYTHONPATH <26>: Modifying Python’s Search Path. + (line 67) +* PYTHONPATH <27>: Modifying Python’s Search Path. + (line 68) +* PYTHONPLATLIBDIR: Core and Builtins<23>. + (line 275) +* PYTHONPLATLIBDIR <1>: The initialization of the sys path module search path. + (line 51) +* PYTHONPLATLIBDIR <2>: PyConfig. (line 511) +* PYTHONPROFILEIMPORTTIME: Other Language Changes<5>. + (line 47) +* PYTHONPROFILEIMPORTTIME <1>: Core and Builtins<44>. + (line 66) +* PYTHONPROFILEIMPORTTIME <2>: Miscellaneous options. + (line 272) +* PYTHONPROFILEIMPORTTIME <3>: PyConfig. (line 421) +* PYTHONPYCACHEPREFIX: Parallel filesystem cache for compiled bytecode files. + (line 6) +* PYTHONPYCACHEPREFIX <1>: Core and Builtins<35>. + (line 402) +* PYTHONPYCACHEPREFIX <2>: Miscellaneous options. + (line 285) +* PYTHONPYCACHEPREFIX <3>: sys — System-specific parameters and functions. + (line 353) +* PYTHONPYCACHEPREFIX <4>: PyConfig. (line 672) +* PYTHONREGRTEST_UNICODE_GUARD: Tests<7>. (line 13) +* PYTHONSAFEPATH: Summary – Release highlights. + (line 27) +* PYTHONSAFEPATH <1>: Other Language Changes. + (line 33) +* PYTHONSAFEPATH <2>: Security<4>. (line 6) +* PYTHONSAFEPATH <3>: Miscellaneous options. + (line 103) +* PYTHONSAFEPATH <4>: sys — System-specific parameters and functions. + (line 1189) +* PYTHONSAFEPATH <5>: Security Considerations<4>. + (line 49) +* PYTHONSAFEPATH <6>: PyConfig. (line 160) +* PYTHONSHOWALLOCCOUNT: Two new environment variables for debug mode. + (line 11) +* PYTHONSHOWREFCOUNT: Two new environment variables for debug mode. + (line 7) +* PYTHONSTARTUP: sys<9>. (line 17) +* PYTHONSTARTUP <1>: sys<9>. (line 21) +* PYTHONSTARTUP <2>: IDLE<25>. (line 176) +* PYTHONSTARTUP <3>: IDLE<29>. (line 9) +* PYTHONSTARTUP <4>: IDLE<35>. (line 9) +* PYTHONSTARTUP <5>: The Interactive Startup File. + (line 8) +* PYTHONSTARTUP <6>: Miscellaneous options. + (line 52) +* PYTHONSTARTUP <7>: Example. (line 10) +* PYTHONSTARTUP <8>: Startup and Code Execution. + (line 7) +* PYTHONSTARTUP <9>: sys — System-specific parameters and functions. + (line 1052) +* PYTHONSTARTUP <10>: Readline configuration. + (line 12) +* PYTHONTHREADDEBUG: Pending Removal in Python 3 12. + (line 15) +* PYTHONTHREADDEBUG <1>: Deprecated<3>. (line 198) +* PYTHONTHREADDEBUG <2>: Core and Builtins<15>. + (line 316) +* PYTHONTHREADDEBUG <3>: Python Debug Build. (line 20) +* PYTHONTRACEMALLOC: tracemalloc — Trace memory allocations. + (line 25) +* PYTHONTRACEMALLOC <1>: tracemalloc — Trace memory allocations. + (line 32) +* PYTHONTRACEMALLOC <2>: Functions<10>. (line 90) +* PYTHONTRACEMALLOC <3>: PyConfig. (line 798) +* PYTHONTZPATH: Exceptions and warnings. + (line 14) +* PYTHONUNBUFFERED: Core and Builtins<28>. + (line 107) +* PYTHONUNBUFFERED <1>: Miscellaneous options. + (line 163) +* PYTHONUNBUFFERED <2>: sys — System-specific parameters and functions. + (line 1655) +* PYTHONUNBUFFERED <3>: Global configuration variables. + (line 147) +* PYTHONUNBUFFERED <4>: PyConfig. (line 201) +* PYTHONUSERBASE: PEP 370 Per-user site-packages Directory. + (line 23) +* PYTHONUSERBASE <1>: Module contents<5>. (line 39) +* PYTHONUSERBASE <2>: Module contents<5>. (line 66) +* PYTHONUSERSITE: test support script_helper — Utilities for the Python execution tests. + (line 26) +* PYTHONUTF8: PEP 540 Forced UTF-8 Runtime Mode. + (line 6) +* PYTHONUTF8 <1>: Environment variables. + (line 387) +* PYTHONUTF8 <2>: UTF-8 mode. (line 18) +* PYTHONUTF8 <3>: Python UTF-8 Mode. (line 51) +* PYTHONUTF8 <4>: Python UTF-8 Mode. (line 53) +* PYTHONUTF8 <5>: sys — System-specific parameters and functions. + (line 1646) +* PYTHONUTF8 <6>: PyPreConfig. (line 142) +* PYTHONUTF8 <7>: Python Configuration. + (line 14) +* PYTHONVERBOSE: Miscellaneous options. + (line 179) +* PYTHONVERBOSE <1>: Global configuration variables. + (line 158) +* PYTHONVERBOSE <2>: PyConfig. (line 838) +* PYTHONWARNDEFAULTENCODING: Optional EncodingWarning and encoding="locale" option. + (line 19) +* PYTHONWARNDEFAULTENCODING <1>: Library<16>. (line 45) +* PYTHONWARNDEFAULTENCODING <2>: Miscellaneous options. + (line 289) +* PYTHONWARNDEFAULTENCODING <3>: Opt-in EncodingWarning. + (line 9) +* PYTHONWARNINGS: warnings<2>. (line 21) +* PYTHONWARNINGS <1>: Other Language Changes<10>. + (line 158) +* PYTHONWARNINGS <2>: Changes to the Handling of Deprecation Warnings. + (line 25) +* PYTHONWARNINGS <3>: Interpreter Changes. + (line 6) +* PYTHONWARNINGS <4>: Documentation<6>. (line 6) +* PYTHONWARNINGS <5>: Miscellaneous options. + (line 231) +* PYTHONWARNINGS <6>: Effects of the Python Development Mode. + (line 30) +* PYTHONWARNINGS <7>: The Warnings Filter. + (line 46) +* PYTHONWARNINGS <8>: The Warnings Filter. + (line 56) +* PYTHONWARNINGS <9>: Describing Warning Filters. + (line 7) +* PYTHONWARNINGS <10>: Describing Warning Filters. + (line 21) +* PYTHONWARNINGS <11>: Default Warning Filter. + (line 7) +* PYTHONWARNINGS <12>: PyConfig. (line 857) +* python_branch() (in module platform): Cross Platform. (line 85) +* python_build() (in module platform): Cross Platform. (line 75) +* python_compiler() (in module platform): Cross Platform. (line 80) +* PYTHON_DOM: Module Contents<4>. (line 23) +* python_implementation() (in module platform): Cross Platform. + (line 89) +* python_is_optimized() (in module test.support): test support — Utilities for the Python test suite. + (line 196) +* python_revision() (in module platform): Cross Platform. (line 94) +* python_version() (in module platform): Cross Platform. (line 99) +* python_version_tuple() (in module platform): Cross Platform. + (line 106) +* PyThreadState: Thread State and the Global Interpreter Lock. + (line 23) +* PyThreadState <1>: Thread State and the Global Interpreter Lock. + (line 23) +* PyThreadState (C type): High-level API. (line 21) +* PyThreadState_Clear (C function): Low-level API. (line 44) +* PyThreadState_Delete (C function): Low-level API. (line 52) +* PyThreadState_DeleteCurrent (C function): Low-level API. (line 58) +* PyThreadState_EnterTracing (C function): Low-level API. (line 96) +* PyThreadState_Get (C function): High-level API. (line 78) +* PyThreadState_GetDict (C function): Low-level API. (line 184) +* PyThreadState_GetFrame (C function): Low-level API. (line 65) +* PyThreadState_GetID (C function): Low-level API. (line 79) +* PyThreadState_GetInterpreter (C function): Low-level API. (line 87) +* PyThreadState_LeaveTracing (C function): Low-level API. (line 105) +* PyThreadState_New (C function): Low-level API. (line 37) +* PyThreadState_Next (C function): Advanced Debugger Support. + (line 32) +* PyThreadState_SetAsyncExc (C function): Low-level API. (line 193) +* PyThreadState_Swap (C function): High-level API. (line 84) +* PyThread_create_key (C function): Thread Local Storage TLS API. + (line 18) +* PyThread_delete_key (C function): Thread Local Storage TLS API. + (line 21) +* PyThread_delete_key_value (C function): Thread Local Storage TLS API. + (line 30) +* PyThread_get_key_value (C function): Thread Local Storage TLS API. + (line 27) +* PyThread_ReInitTLS (C function): Thread Local Storage TLS API. + (line 33) +* PyThread_set_key_value (C function): Thread Local Storage TLS API. + (line 24) +* PyThread_tss_alloc (C function): Dynamic Allocation. (line 11) +* PyThread_tss_create (C function): Methods<4>. (line 16) +* PyThread_tss_delete (C function): Methods<4>. (line 24) +* PyThread_tss_free (C function): Dynamic Allocation. (line 17) +* PyThread_tss_get (C function): Methods<4>. (line 39) +* PyThread_tss_is_created (C function): Methods<4>. (line 11) +* PyThread_tss_set (C function): Methods<4>. (line 33) +* PyTimeZone_FromOffset (C function): DateTime Objects<2>. + (line 124) +* PyTimeZone_FromOffsetAndName (C function): DateTime Objects<2>. + (line 132) +* PyTime_Check (C function): DateTime Objects<2>. + (line 47) +* PyTime_CheckExact (C function): DateTime Objects<2>. + (line 53) +* PyTime_FromTime (C function): DateTime Objects<2>. + (line 103) +* PyTime_FromTimeAndFold (C function): DateTime Objects<2>. + (line 108) +* PyTraceMalloc_Track (C function): tracemalloc C API. (line 8) +* PyTraceMalloc_Untrack (C function): tracemalloc C API. (line 20) +* PyTrace_CALL (C var): Profiling and Tracing. + (line 61) +* PyTrace_C_CALL (C var): Profiling and Tracing. + (line 93) +* PyTrace_C_EXCEPTION (C var): Profiling and Tracing. + (line 98) +* PyTrace_C_RETURN (C var): Profiling and Tracing. + (line 103) +* PyTrace_EXCEPTION (C var): Profiling and Tracing. + (line 69) +* PyTrace_LINE (C var): Profiling and Tracing. + (line 81) +* PyTrace_OPCODE (C var): Profiling and Tracing. + (line 108) +* PyTrace_RETURN (C var): Profiling and Tracing. + (line 88) +* PyTupleObject (C type): Tuple Objects. (line 6) +* PyTuple_Check (C function): Tuple Objects. (line 16) +* PyTuple_CheckExact (C function): Tuple Objects. (line 21) +* PyTuple_GetItem (C function): Tuple Objects. (line 47) +* PyTuple_GetSlice (C function): Tuple Objects. (line 59) +* PyTuple_GET_ITEM (C function): Tuple Objects. (line 54) +* PyTuple_GET_SIZE (C function): Tuple Objects. (line 42) +* PyTuple_New (C function): Tuple Objects. (line 26) +* PyTuple_Pack (C function): Tuple Objects. (line 31) +* PyTuple_SetItem (C function): Tuple Objects. (line 67) +* PyTuple_SetItem(): Reference Count Details. + (line 26) +* PyTuple_SET_ITEM (C function): Tuple Objects. (line 78) +* PyTuple_Size (C function): Tuple Objects. (line 38) +* PyTuple_Type (C var): Tuple Objects. (line 11) +* PyTypeObject (C type): Type Objects<2>. (line 6) +* PyTypeObject.tp_alloc (C member): PyTypeObject Slots. (line 1267) +* PyTypeObject.tp_as_async (C member): PyTypeObject Slots. (line 234) +* PyTypeObject.tp_as_buffer (C member): PyTypeObject Slots. (line 441) +* PyTypeObject.tp_as_mapping (C member): PyTypeObject Slots. (line 300) +* PyTypeObject.tp_as_number (C member): PyTypeObject Slots. (line 276) +* PyTypeObject.tp_as_sequence (C member): PyTypeObject Slots. + (line 288) +* PyTypeObject.tp_base (C member): PyTypeObject Slots. (line 1084) +* PyTypeObject.tp_bases (C member): PyTypeObject Slots. (line 1382) +* PyTypeObject.tp_basicsize (C member): PyTypeObject Slots. (line 47) +* PyTypeObject.tp_cache (C member): PyTypeObject Slots. (line 1404) +* PyTypeObject.tp_call (C member): PyTypeObject Slots. (line 349) +* PyTypeObject.tp_clear (C member): PyTypeObject Slots. (line 809) +* PyTypeObject.tp_dealloc (C member): PyTypeObject Slots. (line 100) +* PyTypeObject.tp_del (C member): PyTypeObject Slots. (line 1430) +* PyTypeObject.tp_descr_get (C member): PyTypeObject Slots. (line 1141) +* PyTypeObject.tp_descr_set (C member): PyTypeObject Slots. (line 1154) +* PyTypeObject.tp_dict (C member): PyTypeObject Slots. (line 1116) +* PyTypeObject.tp_dictoffset (C member): PyTypeObject Slots. (line 1170) +* PyTypeObject.tp_doc (C member): PyTypeObject Slots. (line 725) +* PyTypeObject.tp_finalize (C member): PyTypeObject Slots. (line 1442) +* PyTypeObject.tp_flags (C member): PyTypeObject Slots. (line 453) +* PyTypeObject.tp_free (C member): PyTypeObject Slots. (line 1330) +* PyTypeObject.tp_getattr (C member): PyTypeObject Slots. (line 193) +* PyTypeObject.tp_getattro (C member): PyTypeObject Slots. (line 387) +* PyTypeObject.tp_getset (C member): PyTypeObject Slots. (line 1068) +* PyTypeObject.tp_hash (C member): PyTypeObject Slots. (line 312) +* PyTypeObject.tp_init (C member): PyTypeObject Slots. (line 1231) +* PyTypeObject.tp_is_gc (C member): PyTypeObject Slots. (line 1353) +* PyTypeObject.tp_itemsize (C member): PyTypeObject Slots. (line 47) +* PyTypeObject.tp_iter (C member): PyTypeObject Slots. (line 997) +* PyTypeObject.tp_iternext (C member): PyTypeObject Slots. (line 1013) +* PyTypeObject.tp_members (C member): PyTypeObject Slots. (line 1052) +* PyTypeObject.tp_methods (C member): PyTypeObject Slots. (line 1036) +* PyTypeObject.tp_mro (C member): PyTypeObject Slots. (line 1393) +* PyTypeObject.tp_name (C member): PyTypeObject Slots. (line 12) +* PyTypeObject.tp_new (C member): PyTypeObject Slots. (line 1290) +* PyTypeObject.tp_repr (C member): PyTypeObject Slots. (line 250) +* PyTypeObject.tp_richcompare (C member): PyTypeObject Slots. + (line 884) +* PyTypeObject.tp_richcompare.Py_RETURN_RICHCOMPARE (C macro): PyTypeObject Slots. + (line 929) +* PyTypeObject.tp_setattr (C member): PyTypeObject Slots. (line 213) +* PyTypeObject.tp_setattro (C member): PyTypeObject Slots. (line 413) +* PyTypeObject.tp_str (C member): PyTypeObject Slots. (line 361) +* PyTypeObject.tp_subclasses (C member): PyTypeObject Slots. (line 1412) +* PyTypeObject.tp_traverse (C member): PyTypeObject Slots. (line 735) +* PyTypeObject.tp_vectorcall (C member): PyTypeObject Slots. (line 1502) +* PyTypeObject.tp_vectorcall_offset (C member): PyTypeObject Slots. + (line 153) +* PyTypeObject.tp_version_tag (C member): PyTypeObject Slots. + (line 1434) +* PyTypeObject.tp_weaklist (C member): PyTypeObject Slots. (line 1421) +* PyTypeObject.tp_weaklistoffset (C member): PyTypeObject Slots. + (line 960) +* PyType_Check (C function): Type Objects<2>. (line 15) +* PyType_CheckExact (C function): Type Objects<2>. (line 21) +* PyType_ClearCache (C function): Type Objects<2>. (line 27) +* PyType_FromModuleAndSpec (C function): Creating Heap-Allocated Types. + (line 9) +* PyType_FromSpec (C function): Creating Heap-Allocated Types. + (line 43) +* PyType_FromSpecWithBases (C function): Creating Heap-Allocated Types. + (line 35) +* PyType_GenericAlloc (C function): Type Objects<2>. (line 68) +* PyType_GenericNew (C function): Type Objects<2>. (line 75) +* PyType_GetFlags (C function): Type Objects<2>. (line 31) +* PyType_GetModule (C function): Type Objects<2>. (line 130) +* PyType_GetModuleByDef (C function): Type Objects<2>. (line 164) +* PyType_GetModuleState (C function): Type Objects<2>. (line 150) +* PyType_GetName (C function): Type Objects<2>. (line 98) +* PyType_GetQualName (C function): Type Objects<2>. (line 106) +* PyType_GetSlot (C function): Type Objects<2>. (line 114) +* PyType_HasFeature (C function): Type Objects<2>. (line 49) +* PyType_IsSubtype (C function): Type Objects<2>. (line 59) +* PyType_IS_GC (C function): Type Objects<2>. (line 54) +* PyType_Modified (C function): Type Objects<2>. (line 43) +* PyType_Ready (C function): Type Objects<2>. (line 82) +* PyType_Slot (C type): Creating Heap-Allocated Types. + (line 77) +* PyType_Slot.PyType_Slot.pfunc (C member): Creating Heap-Allocated Types. + (line 136) +* PyType_Slot.PyType_Slot.slot (C member): Creating Heap-Allocated Types. + (line 82) +* PyType_Spec (C type): Creating Heap-Allocated Types. + (line 48) +* PyType_Spec.PyType_Spec.basicsize (C member): Creating Heap-Allocated Types. + (line 57) +* PyType_Spec.PyType_Spec.flags (C member): Creating Heap-Allocated Types. + (line 65) +* PyType_Spec.PyType_Spec.itemsize (C member): Creating Heap-Allocated Types. + (line 59) +* PyType_Spec.PyType_Spec.name (C member): Creating Heap-Allocated Types. + (line 52) +* PyType_Spec.PyType_Spec.slots (C member): Creating Heap-Allocated Types. + (line 72) +* PyType_Type (C var): Type Objects<2>. (line 10) +* PyTZInfo_Check (C function): DateTime Objects<2>. + (line 69) +* PyTZInfo_CheckExact (C function): DateTime Objects<2>. + (line 75) +* PyUnicodeDecodeError_Create (C function): Unicode Exception Objects. + (line 9) +* PyUnicodeDecodeError_GetEncoding (C function): Unicode Exception Objects. + (line 17) +* PyUnicodeDecodeError_GetEnd (C function): Unicode Exception Objects. + (line 54) +* PyUnicodeDecodeError_GetObject (C function): Unicode Exception Objects. + (line 25) +* PyUnicodeDecodeError_GetReason (C function): Unicode Exception Objects. + (line 74) +* PyUnicodeDecodeError_GetStart (C function): Unicode Exception Objects. + (line 34) +* PyUnicodeDecodeError_SetEnd (C function): Unicode Exception Objects. + (line 64) +* PyUnicodeDecodeError_SetReason (C function): Unicode Exception Objects. + (line 83) +* PyUnicodeDecodeError_SetStart (C function): Unicode Exception Objects. + (line 44) +* PyUnicodeEncodeError_GetEncoding (C function): Unicode Exception Objects. + (line 17) +* PyUnicodeEncodeError_GetEnd (C function): Unicode Exception Objects. + (line 54) +* PyUnicodeEncodeError_GetObject (C function): Unicode Exception Objects. + (line 25) +* PyUnicodeEncodeError_GetReason (C function): Unicode Exception Objects. + (line 74) +* PyUnicodeEncodeError_GetStart (C function): Unicode Exception Objects. + (line 34) +* PyUnicodeEncodeError_SetEnd (C function): Unicode Exception Objects. + (line 64) +* PyUnicodeEncodeError_SetReason (C function): Unicode Exception Objects. + (line 83) +* PyUnicodeEncodeError_SetStart (C function): Unicode Exception Objects. + (line 44) +* PyUnicodeObject (C type): Unicode Type. (line 28) +* PyUnicodeTranslateError_GetEnd (C function): Unicode Exception Objects. + (line 54) +* PyUnicodeTranslateError_GetObject (C function): Unicode Exception Objects. + (line 25) +* PyUnicodeTranslateError_GetReason (C function): Unicode Exception Objects. + (line 74) +* PyUnicodeTranslateError_GetStart (C function): Unicode Exception Objects. + (line 34) +* PyUnicodeTranslateError_SetEnd (C function): Unicode Exception Objects. + (line 64) +* PyUnicodeTranslateError_SetReason (C function): Unicode Exception Objects. + (line 83) +* PyUnicodeTranslateError_SetStart (C function): Unicode Exception Objects. + (line 44) +* PyUnicode_1BYTE_DATA (C function): Unicode Type. (line 80) +* PyUnicode_1BYTE_KIND (C macro): Unicode Type. (line 93) +* PyUnicode_2BYTE_DATA (C function): Unicode Type. (line 80) +* PyUnicode_2BYTE_KIND (C macro): Unicode Type. (line 93) +* PyUnicode_4BYTE_DATA (C function): Unicode Type. (line 80) +* PyUnicode_4BYTE_KIND (C macro): Unicode Type. (line 93) +* PyUnicode_AsASCIIString (C function): ASCII Codecs. (line 16) +* PyUnicode_AsCharmapString (C function): Character Map Codecs. + (line 31) +* PyUnicode_AsEncodedString (C function): Generic Codecs. (line 18) +* PyUnicode_AsLatin1String (C function): Latin-1 Codecs. (line 17) +* PyUnicode_AsMBCSString (C function): MBCS codecs for Windows. + (line 29) +* PyUnicode_AsRawUnicodeEscapeString (C function): Raw-Unicode-Escape Codecs. + (line 15) +* PyUnicode_AsUCS4 (C function): Creating and accessing Unicode strings. + (line 256) +* PyUnicode_AsUCS4Copy (C function): Creating and accessing Unicode strings. + (line 266) +* PyUnicode_AsUnicode (C function): Deprecated Py_UNICODE APIs. + (line 34) +* PyUnicode_AsUnicodeAndSize (C function): Deprecated Py_UNICODE APIs. + (line 50) +* PyUnicode_AsUnicodeEscapeString (C function): Unicode-Escape Codecs. + (line 15) +* PyUnicode_AsUTF16String (C function): UTF-16 Codecs. (line 48) +* PyUnicode_AsUTF32String (C function): UTF-32 Codecs. (line 47) +* PyUnicode_AsUTF8 (C function): UTF-8 Codecs. (line 59) +* PyUnicode_AsUTF8AndSize (C function): UTF-8 Codecs. (line 32) +* PyUnicode_AsUTF8String (C function): UTF-8 Codecs. (line 25) +* PyUnicode_AsWideChar (C function): wchar_t Support. (line 16) +* PyUnicode_AsWideCharString (C function): wchar_t Support. (line 30) +* PyUnicode_AS_DATA (C function): Unicode Type. (line 183) +* PyUnicode_AS_UNICODE (C function): Unicode Type. (line 183) +* PyUnicode_Check (C function): Unicode Type. (line 47) +* PyUnicode_CheckExact (C function): Unicode Type. (line 52) +* PyUnicode_Compare (C function): Methods and Slot Functions. + (line 88) +* PyUnicode_CompareWithASCIIString (C function): Methods and Slot Functions. + (line 96) +* PyUnicode_Concat (C function): Methods and Slot Functions. + (line 12) +* PyUnicode_Contains (C function): Methods and Slot Functions. + (line 127) +* PyUnicode_CopyCharacters (C function): Creating and accessing Unicode strings. + (line 198) +* PyUnicode_Count (C function): Methods and Slot Functions. + (line 75) +* PyUnicode_DATA (C function): Unicode Type. (line 114) +* PyUnicode_Decode (C function): Generic Codecs. (line 8) +* PyUnicode_DecodeASCII (C function): ASCII Codecs. (line 9) +* PyUnicode_DecodeCharmap (C function): Character Map Codecs. + (line 15) +* PyUnicode_DecodeFSDefault (C function): File System Encoding. + (line 64) +* PyUnicode_DecodeFSDefaultAndSize (C function): File System Encoding. + (line 42) +* PyUnicode_DecodeLatin1 (C function): Latin-1 Codecs. (line 10) +* PyUnicode_DecodeLocale (C function): Locale Encoding. (line 38) +* PyUnicode_DecodeLocaleAndSize (C function): Locale Encoding. + (line 9) +* PyUnicode_DecodeMBCS (C function): MBCS codecs for Windows. + (line 12) +* PyUnicode_DecodeMBCSStateful (C function): MBCS codecs for Windows. + (line 19) +* PyUnicode_DecodeRawUnicodeEscape (C function): Raw-Unicode-Escape Codecs. + (line 8) +* PyUnicode_DecodeUnicodeEscape (C function): Unicode-Escape Codecs. + (line 8) +* PyUnicode_DecodeUTF16 (C function): UTF-16 Codecs. (line 8) +* PyUnicode_DecodeUTF16Stateful (C function): UTF-16 Codecs. (line 36) +* PyUnicode_DecodeUTF32 (C function): UTF-32 Codecs. (line 8) +* PyUnicode_DecodeUTF32Stateful (C function): UTF-32 Codecs. (line 35) +* PyUnicode_DecodeUTF7 (C function): UTF-7 Codecs. (line 8) +* PyUnicode_DecodeUTF7Stateful (C function): UTF-7 Codecs. (line 15) +* PyUnicode_DecodeUTF8 (C function): UTF-8 Codecs. (line 8) +* PyUnicode_DecodeUTF8Stateful (C function): UTF-8 Codecs. (line 15) +* PyUnicode_EncodeCodePage (C function): MBCS codecs for Windows. + (line 36) +* PyUnicode_EncodeFSDefault (C function): File System Encoding. + (line 79) +* PyUnicode_EncodeLocale (C function): Locale Encoding. (line 47) +* PyUnicode_Fill (C function): Creating and accessing Unicode strings. + (line 209) +* PyUnicode_Find (C function): Methods and Slot Functions. + (line 48) +* PyUnicode_FindChar (C function): Methods and Slot Functions. + (line 59) +* PyUnicode_Format (C function): Methods and Slot Functions. + (line 121) +* PyUnicode_FromEncodedObject (C function): Creating and accessing Unicode strings. + (line 174) +* PyUnicode_FromFormat (C function): Creating and accessing Unicode strings. + (line 57) +* PyUnicode_FromFormatV (C function): Creating and accessing Unicode strings. + (line 168) +* PyUnicode_FromKindAndData (C function): Creating and accessing Unicode strings. + (line 21) +* PyUnicode_FromObject (C function): Deprecated Py_UNICODE APIs. + (line 76) +* PyUnicode_FromString (C function): Creating and accessing Unicode strings. + (line 51) +* PyUnicode_FromString(): Dictionary Objects. (line 63) +* PyUnicode_FromStringAndSize (C function): Creating and accessing Unicode strings. + (line 37) +* PyUnicode_FromUnicode (C function): Deprecated Py_UNICODE APIs. + (line 13) +* PyUnicode_FromWideChar (C function): wchar_t Support. (line 8) +* PyUnicode_FSConverter (C function): File System Encoding. + (line 13) +* PyUnicode_FSDecoder (C function): File System Encoding. + (line 29) +* PyUnicode_GetLength (C function): Creating and accessing Unicode strings. + (line 191) +* PyUnicode_GetSize (C function): Deprecated Py_UNICODE APIs. + (line 66) +* PyUnicode_GET_DATA_SIZE (C function): Unicode Type. (line 172) +* PyUnicode_GET_LENGTH (C function): Unicode Type. (line 71) +* PyUnicode_GET_SIZE (C function): Unicode Type. (line 162) +* PyUnicode_InternFromString (C function): Methods and Slot Functions. + (line 148) +* PyUnicode_InternInPlace (C function): Methods and Slot Functions. + (line 135) +* PyUnicode_IsIdentifier (C function): Unicode Type. (line 205) +* PyUnicode_Join (C function): Methods and Slot Functions. + (line 34) +* PyUnicode_KIND (C function): Unicode Type. (line 105) +* PyUnicode_MAX_CHAR_VALUE (C function): Unicode Type. (line 152) +* PyUnicode_New (C function): Creating and accessing Unicode strings. + (line 9) +* PyUnicode_READ (C function): Unicode Type. (line 134) +* PyUnicode_ReadChar (C function): Creating and accessing Unicode strings. + (line 238) +* PyUnicode_READY (C function): Unicode Type. (line 57) +* PyUnicode_READ_CHAR (C function): Unicode Type. (line 143) +* PyUnicode_Replace (C function): Methods and Slot Functions. + (line 81) +* PyUnicode_RichCompare (C function): Methods and Slot Functions. + (line 106) +* PyUnicode_Split (C function): Methods and Slot Functions. + (line 17) +* PyUnicode_Splitlines (C function): Methods and Slot Functions. + (line 26) +* PyUnicode_Substring (C function): Creating and accessing Unicode strings. + (line 247) +* PyUnicode_Tailmatch (C function): Methods and Slot Functions. + (line 40) +* PyUnicode_Translate (C function): Character Map Codecs. + (line 46) +* PyUnicode_Type (C var): Unicode Type. (line 39) +* PyUnicode_WCHAR_KIND (C macro): Unicode Type. (line 93) +* PyUnicode_WRITE (C function): Unicode Type. (line 121) +* PyUnicode_WriteChar (C function): Creating and accessing Unicode strings. + (line 224) +* PyVarObject (C type): Base object types and macros. + (line 25) +* PyVarObject.ob_size (C member): PyVarObject Slots. (line 6) +* PyVarObject_HEAD_INIT (C macro): Base object types and macros. + (line 149) +* PyVectorcall_Call (C function): Vectorcall Support API. + (line 33) +* PyVectorcall_Function (C function): Vectorcall Support API. + (line 19) +* PyVectorcall_NARGS (C function): Vectorcall Support API. + (line 6) +* PyWeakref_Check (C function): Weak Reference Objects<2>. + (line 11) +* PyWeakref_CheckProxy (C function): Weak Reference Objects<2>. + (line 21) +* PyWeakref_CheckRef (C function): Weak Reference Objects<2>. + (line 16) +* PyWeakref_GetObject (C function): Weak Reference Objects<2>. + (line 54) +* PyWeakref_GET_OBJECT (C function): Weak Reference Objects<2>. + (line 66) +* PyWeakref_NewProxy (C function): Weak Reference Objects<2>. + (line 40) +* PyWeakref_NewRef (C function): Weak Reference Objects<2>. + (line 26) +* PyWideStringList (C type): PyWideStringList. (line 6) +* PyWideStringList.items (C member): PyWideStringList. (line 41) +* PyWideStringList.length (C member): PyWideStringList. (line 37) +* PyWideStringList.PyWideStringList_Append (C function): PyWideStringList. + (line 15) +* PyWideStringList.PyWideStringList_Insert (C function): PyWideStringList. + (line 22) +* PyWrapper_New (C function): Descriptor Objects. (line 43) +* PyZipFile (class in zipfile): PyZipFile Objects. (line 10) +* Py_ABS (C macro): Useful macros. (line 11) +* Py_AddPendingCall (C function): Asynchronous Notifications. + (line 10) +* Py_AddPendingCall(): Asynchronous Notifications. + (line 11) +* Py_ALWAYS_INLINE (C macro): Useful macros. (line 17) +* Py_AtExit (C function): Process Control. (line 32) +* PY_AUDIT_READ: Generic Attribute Management. + (line 92) +* Py_BEGIN_ALLOW_THREADS: Releasing the GIL from extension code. + (line 21) +* Py_BEGIN_ALLOW_THREADS (C macro): High-level API. (line 160) +* Py_BLOCK_THREADS (C macro): High-level API. (line 174) +* Py_buffer (C type): Buffer structure. (line 25) +* Py_buffer.buf (C member): Buffer structure. (line 27) +* Py_buffer.format (C member): Buffer structure. (line 88) +* Py_buffer.internal (C member): Buffer structure. (line 155) +* Py_buffer.itemsize (C member): Buffer structure. (line 68) +* Py_buffer.len (C member): Buffer structure. (line 51) +* Py_buffer.ndim (C member): Buffer structure. (line 97) +* Py_buffer.obj (C member): Buffer structure. (line 39) +* Py_buffer.readonly (C member): Buffer structure. (line 63) +* Py_buffer.shape (C member): Buffer structure. (line 110) +* Py_buffer.strides (C member): Buffer structure. (line 123) +* Py_buffer.suboffsets (C member): Buffer structure. (line 136) +* Py_BuildValue (C function): Building values. (line 6) +* Py_BytesMain (C function): The Very High Level Layer. + (line 41) +* Py_BytesWarningFlag (C var): Global configuration variables. + (line 15) +* Py_CHARMASK (C macro): Useful macros. (line 42) +* Py_CLEAR (C function): Reference Counting. (line 93) +* PY_COMPILED (in module imp): imp — Access the import internals. + (line 315) +* Py_CompileString (C function): The Very High Level Layer. + (line 238) +* Py_CompileString(): The Very High Level Layer. + (line 328) +* Py_CompileString() <1>: The Very High Level Layer. + (line 333) +* Py_CompileString() <2>: The Very High Level Layer. + (line 340) +* Py_CompileStringExFlags (C function): The Very High Level Layer. + (line 271) +* Py_CompileStringFlags (C function): The Very High Level Layer. + (line 245) +* Py_CompileStringObject (C function): The Very High Level Layer. + (line 251) +* Py_complex (C type): Complex Numbers as C Structures. + (line 10) +* Py_DebugFlag (C var): Global configuration variables. + (line 23) +* Py_DecodeLocale (C function): Operating System Utilities. + (line 110) +* Py_DECREF (C function): Reference Counting. (line 61) +* Py_DecRef (C function): Reference Counting. (line 112) +* Py_DECREF(): Reference Counts<2>. + (line 17) +* Py_DEPRECATED (C macro): Useful macros. (line 47) +* Py_DontWriteBytecodeFlag (C var): Global configuration variables. + (line 31) +* Py_Ellipsis (C var): Ellipsis Object. (line 6) +* Py_EncodeLocale (C function): Operating System Utilities. + (line 162) +* Py_EndInterpreter (C function): Sub-interpreter support. + (line 77) +* Py_END_ALLOW_THREADS: Releasing the GIL from extension code. + (line 21) +* Py_END_ALLOW_THREADS (C macro): High-level API. (line 167) +* Py_EnterRecursiveCall (C function): Recursion Control. (line 13) +* Py_eval_input (C var): The Very High Level Layer. + (line 326) +* Py_Exit (C function): Process Control. (line 22) +* Py_False (C var): Boolean Objects. (line 16) +* Py_FatalError (C function): Process Control. (line 6) +* Py_FatalError(): Process-wide parameters. + (line 271) +* Py_FdIsInteractive (C function): Operating System Utilities. + (line 18) +* Py_file_input (C var): The Very High Level Layer. + (line 331) +* Py_Finalize (C function): Initializing and finalizing the interpreter. + (line 78) +* Py_FinalizeEx (C function): Initializing and finalizing the interpreter. + (line 39) +* Py_FinalizeEx(): Process Control. (line 23) +* Py_FinalizeEx() <1>: Process Control. (line 33) +* Py_FinalizeEx() <2>: Initializing and finalizing the interpreter. + (line 7) +* Py_FinalizeEx() <3>: Sub-interpreter support. + (line 50) +* Py_FinalizeEx() <4>: Sub-interpreter support. + (line 78) +* PY_FROZEN (in module imp): imp — Access the import internals. + (line 339) +* Py_FrozenFlag (C var): Global configuration variables. + (line 39) +* Py_GenericAlias (C function): Objects for Type Hinting. + (line 10) +* Py_GenericAliasType (C var): Objects for Type Hinting. + (line 42) +* Py_GetArgcArgv (C function): Py_GetArgcArgv. (line 6) +* Py_GetBuildInfo (C function): Process-wide parameters. + (line 258) +* Py_GetCompiler (C function): Process-wide parameters. + (line 247) +* Py_GetCopyright (C function): Process-wide parameters. + (line 237) +* Py_GETENV (C macro): Useful macros. (line 58) +* Py_GetExecPrefix (C function): Process-wide parameters. + (line 97) +* Py_GetExecPrefix(): Embedding Python<2>. + (line 42) +* Py_GetPath (C function): Process-wide parameters. + (line 157) +* Py_GetPath(): Embedding Python<2>. + (line 42) +* Py_GetPath() <1>: Process-wide parameters. + (line 42) +* Py_GetPath() <2>: Process-wide parameters. + (line 178) +* Py_GetPlatform (C function): Process-wide parameters. + (line 225) +* Py_GetPrefix (C function): Process-wide parameters. + (line 78) +* Py_GetPrefix(): Embedding Python<2>. + (line 42) +* Py_GetProgramFullPath (C function): Process-wide parameters. + (line 141) +* Py_GetProgramFullPath(): Embedding Python<2>. + (line 42) +* Py_GetProgramName (C function): Process-wide parameters. + (line 65) +* Py_GetPythonHome (C function): Process-wide parameters. + (line 364) +* Py_GetVersion (C function): Process-wide parameters. + (line 211) +* Py_HashRandomizationFlag (C var): Global configuration variables. + (line 46) +* Py_IgnoreEnvironmentFlag (C var): Global configuration variables. + (line 54) +* Py_INCREF (C function): Reference Counting. (line 9) +* Py_IncRef (C function): Reference Counting. (line 107) +* Py_INCREF(): Reference Counts<2>. + (line 17) +* Py_Initialize (C function): Initializing and finalizing the interpreter. + (line 6) +* Py_Initialize(): Embedding Python<2>. + (line 12) +* Py_Initialize() <1>: Process-wide parameters. + (line 9) +* Py_Initialize() <2>: Process-wide parameters. + (line 42) +* Py_Initialize() <3>: Sub-interpreter support. + (line 50) +* Py_InitializeEx (C function): Initializing and finalizing the interpreter. + (line 27) +* Py_InitializeFromConfig (C function): Initialization with PyConfig. + (line 8) +* Py_InspectFlag (C var): Global configuration variables. + (line 61) +* Py_InteractiveFlag (C var): Global configuration variables. + (line 71) +* Py_Is (C function): Base object types and macros. + (line 54) +* Py_IsFalse (C function): Base object types and macros. + (line 74) +* Py_IsInitialized (C function): Initializing and finalizing the interpreter. + (line 33) +* Py_IsInitialized(): Embedding Python<2>. + (line 51) +* Py_IsNone (C function): Base object types and macros. + (line 60) +* Py_IsolatedFlag (C var): Global configuration variables. + (line 75) +* Py_IsTrue (C function): Base object types and macros. + (line 67) +* Py_IS_TYPE (C function): Base object types and macros. + (line 93) +* Py_LeaveRecursiveCall (C function): Recursion Control. (line 33) +* Py_LegacyWindowsFSEncodingFlag (C var): Global configuration variables. + (line 85) +* Py_LegacyWindowsStdioFlag (C var): Global configuration variables. + (line 99) +* Py_LIMITED_API (C macro): Stable Application Binary Interface. + (line 21) +* Py_Main (C function): The Very High Level Layer. + (line 24) +* PY_MAJOR_VERSION (C macro): API and ABI Versioning. + (line 13) +* Py_MAX (C macro): Useful macros. (line 63) +* Py_MEMBER_SIZE (C macro): Useful macros. (line 69) +* PY_MICRO_VERSION (C macro): API and ABI Versioning. + (line 21) +* Py_MIN (C macro): Useful macros. (line 75) +* PY_MINOR_VERSION (C macro): API and ABI Versioning. + (line 17) +* Py_mod_create (C macro): Multi-phase initialization. + (line 63) +* Py_mod_create.create_module (C function): Multi-phase initialization. + (line 69) +* Py_mod_exec (C macro): Multi-phase initialization. + (line 97) +* Py_mod_exec.exec_module (C function): Multi-phase initialization. + (line 104) +* Py_NewInterpreter (C function): Sub-interpreter support. + (line 24) +* Py_NewRef (C function): Reference Counting. (line 28) +* Py_None (C var): The None Object. (line 11) +* Py_NoSiteFlag (C var): Global configuration variables. + (line 111) +* Py_NotImplemented (C var): Object Protocol. (line 6) +* Py_NoUserSiteDirectory (C var): Global configuration variables. + (line 121) +* Py_NO_INLINE (C macro): Useful macros. (line 81) +* py_object (class in ctypes): Fundamental data types<2>. + (line 212) +* Py_OptimizeFlag (C var): Global configuration variables. + (line 129) +* Py_PreInitialize (C function): Preinitialize Python with PyPreConfig. + (line 21) +* Py_PreInitializeFromArgs (C function): Preinitialize Python with PyPreConfig. + (line 38) +* Py_PreInitializeFromBytesArgs (C function): Preinitialize Python with PyPreConfig. + (line 28) +* Py_PRINT_RAW: File Objects. (line 89) +* PY_PYTHON: Customizing default Python versions. + (line 18) +* Py_QuietFlag (C var): Global configuration variables. + (line 134) +* Py_REFCNT (C function): Base object types and macros. + (line 106) +* PY_RELEASE_LEVEL (C macro): API and ABI Versioning. + (line 25) +* PY_RELEASE_SERIAL (C macro): API and ABI Versioning. + (line 30) +* Py_ReprEnter (C function): Recursion Control. (line 47) +* Py_ReprLeave (C function): Recursion Control. (line 64) +* Py_RETURN_FALSE (C macro): Boolean Objects. (line 28) +* Py_RETURN_NONE (C macro): The None Object. (line 17) +* Py_RETURN_NOTIMPLEMENTED (C macro): Object Protocol. (line 11) +* Py_RETURN_TRUE (C macro): Boolean Objects. (line 33) +* Py_RunMain (C function): Py_RunMain. (line 6) +* Py_SetPath (C function): Process-wide parameters. + (line 177) +* Py_SetPath(): Process-wide parameters. + (line 158) +* Py_SetProgramName (C function): Process-wide parameters. + (line 41) +* Py_SetProgramName(): Embedding Python<2>. + (line 42) +* Py_SetProgramName() <1>: Initializing and finalizing the interpreter. + (line 7) +* Py_SetProgramName() <2>: Process-wide parameters. + (line 66) +* Py_SetProgramName() <3>: Process-wide parameters. + (line 142) +* Py_SetPythonHome (C function): Process-wide parameters. + (line 344) +* Py_SetStandardStreamEncoding (C function): Process-wide parameters. + (line 6) +* Py_SET_REFCNT (C function): Base object types and macros. + (line 119) +* Py_SET_SIZE (C function): Base object types and macros. + (line 135) +* Py_SET_TYPE (C function): Base object types and macros. + (line 100) +* Py_single_input (C var): The Very High Level Layer. + (line 338) +* Py_SIZE (C function): Base object types and macros. + (line 125) +* PY_SOURCE (in module imp): imp — Access the import internals. + (line 309) +* Py_ssize_t (C type): Types. (line 14) +* PY_SSIZE_T_MAX: Integer Objects. (line 184) +* Py_STRINGIFY (C macro): Useful macros. (line 93) +* Py_TPFLAGS_BASETYPE (built-in variable): PyTypeObject Slots. + (line 508) +* Py_TPFLAGS_BASE_EXC_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 605) +* Py_TPFLAGS_BYTES_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 599) +* Py_TPFLAGS_DEFAULT (built-in variable): PyTypeObject Slots. + (line 557) +* Py_TPFLAGS_DICT_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 603) +* Py_TPFLAGS_DISALLOW_INSTANTIATION (built-in variable): PyTypeObject Slots. + (line 657) +* Py_TPFLAGS_HAVE_FINALIZE (built-in variable): PyTypeObject Slots. + (line 618) +* Py_TPFLAGS_HAVE_GC (built-in variable): PyTypeObject Slots. + (line 536) +* Py_TPFLAGS_HAVE_VECTORCALL (built-in variable): PyTypeObject Slots. + (line 629) +* Py_TPFLAGS_HEAPTYPE (built-in variable): PyTypeObject Slots. + (line 493) +* Py_TPFLAGS_IMMUTABLETYPE (built-in variable): PyTypeObject Slots. + (line 643) +* Py_TPFLAGS_LIST_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 595) +* Py_TPFLAGS_LONG_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 593) +* Py_TPFLAGS_MAPPING (built-in variable): PyTypeObject Slots. + (line 677) +* Py_TPFLAGS_METHOD_DESCRIPTOR (built-in variable): PyTypeObject Slots. + (line 568) +* Py_TPFLAGS_READY (built-in variable): PyTypeObject Slots. (line 518) +* Py_TPFLAGS_READYING (built-in variable): PyTypeObject Slots. + (line 527) +* Py_TPFLAGS_SEQUENCE (built-in variable): PyTypeObject Slots. + (line 701) +* Py_TPFLAGS_TUPLE_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 597) +* Py_TPFLAGS_TYPE_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 607) +* Py_TPFLAGS_UNICODE_SUBCLASS (built-in variable): PyTypeObject Slots. + (line 601) +* Py_tracefunc (C type): Profiling and Tracing. + (line 18) +* Py_True (C var): Boolean Objects. (line 22) +* Py_tss_NEEDS_INIT (C macro): Thread Specific Storage TSS API. + (line 28) +* Py_tss_t (C type): Thread Specific Storage TSS API. + (line 17) +* Py_TYPE (C function): Base object types and macros. + (line 81) +* Py_UCS1 (C type): Unicode Type. (line 9) +* Py_UCS2 (C type): Unicode Type. (line 9) +* Py_UCS4 (C type): Unicode Type. (line 9) +* Py_UNBLOCK_THREADS (C macro): High-level API. (line 179) +* Py_UnbufferedStdioFlag (C var): Global configuration variables. + (line 143) +* Py_UNICODE (C type): Unicode Type. (line 19) +* Py_UNICODE_ISALNUM (C function): Unicode Character Properties. + (line 52) +* Py_UNICODE_ISALPHA (C function): Unicode Character Properties. + (line 47) +* Py_UNICODE_ISDECIMAL (C function): Unicode Character Properties. + (line 35) +* Py_UNICODE_ISDIGIT (C function): Unicode Character Properties. + (line 39) +* Py_UNICODE_ISLINEBREAK (C function): Unicode Character Properties. + (line 30) +* Py_UNICODE_ISLOWER (C function): Unicode Character Properties. + (line 15) +* Py_UNICODE_ISNUMERIC (C function): Unicode Character Properties. + (line 43) +* Py_UNICODE_ISPRINTABLE (C function): Unicode Character Properties. + (line 57) +* Py_UNICODE_ISSPACE (C function): Unicode Character Properties. + (line 10) +* Py_UNICODE_ISTITLE (C function): Unicode Character Properties. + (line 25) +* Py_UNICODE_ISUPPER (C function): Unicode Character Properties. + (line 20) +* Py_UNICODE_IS_HIGH_SURROGATE (C macro): Unicode Character Properties. + (line 114) +* Py_UNICODE_IS_LOW_SURROGATE (C macro): Unicode Character Properties. + (line 118) +* Py_UNICODE_IS_SURROGATE (C macro): Unicode Character Properties. + (line 110) +* Py_UNICODE_JOIN_SURROGATES (C macro): Unicode Character Properties. + (line 122) +* Py_UNICODE_TODECIMAL (C function): Unicode Character Properties. + (line 91) +* Py_UNICODE_TODIGIT (C function): Unicode Character Properties. + (line 97) +* Py_UNICODE_TOLOWER (C function): Unicode Character Properties. + (line 70) +* Py_UNICODE_TONUMERIC (C function): Unicode Character Properties. + (line 103) +* Py_UNICODE_TOTITLE (C function): Unicode Character Properties. + (line 84) +* Py_UNICODE_TOUPPER (C function): Unicode Character Properties. + (line 77) +* Py_UNREACHABLE (C macro): Useful macros. (line 100) +* Py_UNUSED (C macro): Useful macros. (line 125) +* Py_VaBuildValue (C function): Building values. (line 201) +* PY_VECTORCALL_ARGUMENTS_OFFSET (C macro): The Vectorcall Protocol. + (line 61) +* Py_VerboseFlag (C var): Global configuration variables. + (line 150) +* Py_Version (C var): API and ABI Versioning. + (line 65) +* PY_VERSION_HEX (C macro): API and ABI Versioning. + (line 34) +* Py_VISIT (C function): Supporting Cyclic Garbage Collection. + (line 157) +* Py_XDECREF (C function): Reference Counting. (line 86) +* Py_XDECREF(): Exceptions<19>. (line 123) +* Py_XINCREF (C function): Reference Counting. (line 21) +* Py_XNewRef (C function): Reference Counting. (line 53) +* P_ALL (in module os): Process Management. (line 799) +* P_DETACH (in module os): Process Management. (line 632) +* P_NOWAIT (in module os): Process Management. (line 612) +* P_NOWAITO (in module os): Process Management. (line 612) +* P_OVERLAY (in module os): Process Management. (line 632) +* P_PGID (in module os): Process Management. (line 799) +* P_PID (in module os): Process Management. (line 799) +* P_PIDFD (in module os): Process Management. (line 810) +* P_WAIT (in module os): Process Management. (line 622) +* qiflush() (in module curses): Functions<5>. (line 396) +* QName (class in xml.etree.ElementTree): QName Objects. (line 6) +* qsize() (asyncio.Queue method): Queue. (line 73) +* qsize() (multiprocessing.Queue method): Pipes and Queues. (line 98) +* qsize() (queue.Queue method): Queue Objects. (line 9) +* qsize() (queue.SimpleQueue method): SimpleQueue Objects. + (line 9) +* qualified name: Glossary. (line 1171) +* quantiles() (in module statistics): Function details. (line 416) +* quantiles() (statistics.NormalDist method): NormalDist objects. + (line 103) +* quantize() (decimal.Context method): Context objects. (line 477) +* quantize() (decimal.Decimal method): Decimal objects. (line 462) +* QueryInfoKey() (in module winreg): Functions<12>. (line 319) +* QueryReflectionKey() (in module winreg): Functions<12>. (line 516) +* QueryValue() (in module winreg): Functions<12>. (line 348) +* QueryValueEx() (in module winreg): Functions<12>. (line 368) +* Queue (class in asyncio): Queue. (line 6) +* Queue (class in multiprocessing): Pipes and Queues. (line 84) +* Queue (class in queue): queue — A synchronized queue class. + (line 34) +* queue (sched.scheduler attribute): Scheduler Objects. (line 74) +* Queue() (multiprocessing.managers.SyncManager method): Managers. + (line 198) +* QueueEmpty: Exceptions<9>. (line 6) +* QueueFull: Exceptions<9>. (line 11) +* QueueHandler (class in logging.handlers): QueueHandler. (line 21) +* QueueListener (class in logging.handlers): QueueListener. (line 25) +* quick_ratio() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 204) +* quit (built-in variable): Constants added by the site module. + (line 11) +* quit (pdb command): Debugger Commands. (line 336) +* quit() (ftplib.FTP method): FTP Objects. (line 237) +* quit() (nntplib.NNTP method): Methods<3>. (line 22) +* quit() (poplib.POP3 method): POP3 Objects. (line 82) +* quit() (smtplib.SMTP method): SMTP Objects. (line 344) +* quit() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 123) +* quote() (in module email.utils): email utils Miscellaneous utilities. + (line 47) +* quote() (in module shlex): shlex — Simple lexical analysis. + (line 47) +* quote() (in module urllib.parse): URL Quoting. (line 13) +* quoteattr() (in module xml.sax.saxutils): xml sax saxutils — SAX Utilities. + (line 34) +* quotechar (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 54) +* quoted-printable; encoding: quopri — Encode and decode MIME quoted-printable data. + (line 8) +* quotes (shlex.shlex attribute): shlex Objects. (line 115) +* QUOTE_ALL (in module csv): Module Contents<3>. (line 263) +* quote_from_bytes() (in module urllib.parse): URL Quoting. (line 53) +* QUOTE_MINIMAL (in module csv): Module Contents<3>. (line 267) +* QUOTE_NONE (in module csv): Module Contents<3>. (line 281) +* QUOTE_NONNUMERIC (in module csv): Module Contents<3>. (line 273) +* quote_plus() (in module urllib.parse): URL Quoting. (line 42) +* quoting (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 62) +* r"; raw string literal: String and Bytes literals. + (line 48) +* r’; raw string literal: String and Bytes literals. + (line 48) +* radians() (in module math): Angular conversion. (line 10) +* radians() (in module turtle): Settings for measurement. + (line 28) +* RadioButtonGroup (class in msilib): GUI classes. (line 27) +* radiogroup() (msilib.Dialog method): GUI classes. (line 71) +* radix() (decimal.Context method): Context objects. (line 482) +* radix() (decimal.Decimal method): Decimal objects. (line 490) +* RADIXCHAR (in module locale): locale — Internationalization services. + (line 232) +* raise (2to3 fixer): Fixers. (line 262) +* Raise (class in ast): Statements. (line 115) +* raise an exception: Exceptions<2>. (line 6) +* raise_on_defect (email.policy.Policy attribute): email policy Policy Objects. + (line 180) +* raise_signal() (in module signal): Module contents<2>. (line 316) +* RAISE_VARARGS (opcode): Python Bytecode Instructions. + (line 766) +* raising; exception: The raise statement. + (line 6) +* randbelow() (in module secrets): Random numbers. (line 19) +* randbits() (in module secrets): Random numbers. (line 23) +* randbytes() (in module random): Functions for bytes. + (line 6) +* randint() (in module random): Functions for integers. + (line 33) +* Random (class in random): Alternative Generator. + (line 6) +* random() (in module random): Real-valued distributions. + (line 11) +* randrange() (in module random): Functions for integers. + (line 6) +* RAND_add() (in module ssl): Random generation. (line 50) +* RAND_bytes() (in module ssl): Random generation. (line 6) +* RAND_pseudo_bytes() (in module ssl): Random generation. (line 23) +* RAND_status() (in module ssl): Random generation. (line 43) +* range (built-in class): Ranges. (line 10) +* RARROW (in module token): token — Constants used with Python parse trees. + (line 230) +* ratecv() (in module audioop): audioop — Manipulate raw audio data. + (line 178) +* ratio() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 180) +* Rational (class in numbers): The numeric tower. (line 41) +* raw (io.BufferedIOBase attribute): I/O Base Classes. (line 252) +* raw string: String and Bytes literals. + (line 36) +* raw() (in module curses): Functions<5>. (line 403) +* raw() (pickle.PickleBuffer method): Module Interface. (line 317) +* RawArray() (in module multiprocessing.sharedctypes): The multiprocessing sharedctypes module. + (line 16) +* RawConfigParser (class in configparser): RawConfigParser Objects. + (line 6) +* RawDescriptionHelpFormatter (class in argparse): formatter_class. + (line 10) +* RawIOBase (class in io): I/O Base Classes. (line 172) +* RawPen (class in turtle): Public classes. (line 6) +* RawTextHelpFormatter (class in argparse): formatter_class. (line 10) +* RawTurtle (class in turtle): Public classes. (line 6) +* RawValue() (in module multiprocessing.sharedctypes): The multiprocessing sharedctypes module. + (line 33) +* raw_data_manager (in module email.contentmanager): Content Manager Instances. + (line 11) +* raw_decode() (json.JSONDecoder method): Encoders and Decoders. + (line 94) +* raw_input (2to3 fixer): Fixers. (line 269) +* raw_input() (code.InteractiveConsole method): Interactive Console Objects. + (line 44) +* RBRACE (in module token): token — Constants used with Python parse trees. + (line 130) +* rcpttos (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 79) +* re (re.Match attribute): Match Objects. (line 199) +* read() (asyncio.StreamReader method): StreamReader. (line 15) +* read() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 108) +* read() (codecs.StreamReader method): StreamReader Objects. + (line 34) +* read() (configparser.ConfigParser method): ConfigParser Objects. + (line 113) +* read() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 13) +* read() (imaplib.IMAP4 method): IMAP4 Objects. (line 198) +* read() (in module os): File Descriptor Operations. + (line 607) +* read() (io.BufferedIOBase method): I/O Base Classes. (line 273) +* read() (io.BufferedReader method): Buffered Streams. (line 82) +* read() (io.RawIOBase method): I/O Base Classes. (line 185) +* read() (io.TextIOBase method): Text I/O<2>. (line 51) +* read() (mimetypes.MimeTypes method): MimeTypes Objects. (line 70) +* read() (mmap.mmap method): mmap — Memory-mapped file support. + (line 233) +* read() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 32) +* read() (sqlite3.Blob method): Blob objects. (line 44) +* read() (ssl.MemoryBIO method): Memory BIO Support<2>. + (line 148) +* read() (ssl.SSLSocket method): SSL Sockets. (line 76) +* read() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 25) +* read() (zipfile.ZipFile method): ZipFile Objects. (line 235) +* read1() (io.BufferedIOBase method): I/O Base Classes. (line 290) +* read1() (io.BufferedReader method): Buffered Streams. (line 88) +* read1() (io.BytesIO method): Buffered Streams. (line 43) +* READABLE (in module tkinter): File Handlers. (line 41) +* readable() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 171) +* readable() (io.IOBase method): I/O Base Classes. (line 78) +* readall() (io.RawIOBase method): I/O Base Classes. (line 200) +* reader() (in module csv): Module Contents<3>. (line 8) +* ReadError: tarfile — Read and write tar archive files. + (line 193) +* readexactly() (asyncio.StreamReader method): StreamReader. (line 34) +* readfp() (configparser.ConfigParser method): ConfigParser Objects. + (line 305) +* readfp() (mimetypes.MimeTypes method): MimeTypes Objects. (line 78) +* readframes() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 100) +* readframes() (sunau.AU_read method): AU_read Objects. (line 47) +* readframes() (wave.Wave_read method): Wave_read Objects. (line 46) +* readinto() (http.client.HTTPResponse method): HTTPResponse Objects. + (line 17) +* readinto() (io.BufferedIOBase method): I/O Base Classes. (line 301) +* readinto() (io.RawIOBase method): I/O Base Classes. (line 205) +* readinto1() (io.BufferedIOBase method): I/O Base Classes. (line 314) +* readinto1() (io.BytesIO method): Buffered Streams. (line 49) +* readline() (asyncio.StreamReader method): StreamReader. (line 23) +* readline() (codecs.StreamReader method): StreamReader Objects. + (line 60) +* readline() (distutils.text_file.TextFile method): distutils text_file — The TextFile class. + (line 111) +* readline() (imaplib.IMAP4 method): IMAP4 Objects. (line 203) +* readline() (io.IOBase method): I/O Base Classes. (line 83) +* readline() (io.TextIOBase method): Text I/O<2>. (line 57) +* readline() (mmap.mmap method): mmap — Memory-mapped file support. + (line 248) +* readlines() (codecs.StreamReader method): StreamReader Objects. + (line 71) +* readlines() (distutils.text_file.TextFile method): distutils text_file — The TextFile class. + (line 124) +* readlines() (io.IOBase method): I/O Base Classes. (line 92) +* readlink() (in module os): Files and Directories. + (line 586) +* readlink() (pathlib.Path method): Methods<2>. (line 312) +* readmodule() (in module pyclbr): pyclbr — Python module browser support. + (line 19) +* readmodule_ex() (in module pyclbr): pyclbr — Python module browser support. + (line 31) +* READONLY: Generic Attribute Management. + (line 92) +* readonly (memoryview attribute): Memory Views. (line 413) +* ReadTransport (class in asyncio): Transports Hierarchy. + (line 20) +* readuntil() (asyncio.StreamReader method): StreamReader. (line 43) +* readv() (in module os): File Descriptor Operations. + (line 738) +* ready() (multiprocessing.pool.AsyncResult method): Process Pools. + (line 209) +* read_all() (telnetlib.Telnet method): Telnet Objects. (line 17) +* read_binary() (in module importlib.resources): Deprecated functions. + (line 56) +* read_byte() (mmap.mmap method): mmap — Memory-mapped file support. + (line 243) +* read_bytes() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 126) +* read_bytes() (pathlib.Path method): Methods<2>. (line 284) +* read_bytes() (zipfile.Path method): Path Objects. (line 78) +* read_dict() (configparser.ConfigParser method): ConfigParser Objects. + (line 172) +* read_eager() (telnetlib.Telnet method): Telnet Objects. (line 34) +* read_environ() (in module wsgiref.handlers): wsgiref handlers – server/gateway base classes. + (line 309) +* read_events() (xml.etree.ElementTree.XMLPullParser method): XMLPullParser Objects. + (line 29) +* read_file() (configparser.ConfigParser method): ConfigParser Objects. + (line 150) +* read_history_file() (in module readline): History file. (line 8) +* read_init_file() (in module readline): Init file. (line 13) +* read_lazy() (telnetlib.Telnet method): Telnet Objects. (line 42) +* read_mime_types() (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 99) +* READ_RESTRICTED: Generic Attribute Management. + (line 92) +* read_sb_data() (telnetlib.Telnet method): Telnet Objects. (line 58) +* read_some() (telnetlib.Telnet method): Telnet Objects. (line 21) +* read_string() (configparser.ConfigParser method): ConfigParser Objects. + (line 162) +* read_text() (importlib.resources.abc.Traversable method): importlib resources abc – Abstract base classes for resources. + (line 130) +* read_text() (in module importlib.resources): Deprecated functions. + (line 72) +* read_text() (pathlib.Path method): Methods<2>. (line 297) +* read_text() (zipfile.Path method): Path Objects. (line 72) +* read_token() (shlex.shlex method): shlex Objects. (line 20) +* read_until() (telnetlib.Telnet method): Telnet Objects. (line 8) +* read_very_eager() (telnetlib.Telnet method): Telnet Objects. + (line 26) +* read_very_lazy() (telnetlib.Telnet method): Telnet Objects. + (line 50) +* read_windows_registry() (mimetypes.MimeTypes method): MimeTypes Objects. + (line 86) +* Real (class in numbers): The numeric tower. (line 28) +* real (numbers.Complex attribute): The numeric tower. (line 15) +* Real Media File Format: chunk — Read IFF chunked data. + (line 8) +* realloc(): Overview<4>. (line 33) +* realpath() (in module os.path): os path — Common pathname manipulations. + (line 300) +* REALTIME_PRIORITY_CLASS (in module subprocess): Windows Constants. + (line 87) +* real_max_memuse (in module test.support): test support — Utilities for the Python test suite. + (line 143) +* real_quick_ratio() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 209) +* reap_children() (in module test.support): test support — Utilities for the Python test suite. + (line 551) +* reap_threads() (in module test.support.threading_helper): test support threading_helper — Utilities for threading tests. + (line 17) +* reason (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 65) +* reason (ssl.SSLError attribute): Exceptions<13>. (line 27) +* reason (UnicodeError attribute): Concrete exceptions. + (line 409) +* reason (urllib.error.HTTPError attribute): urllib error — Exception classes raised by urllib request. + (line 45) +* reason (urllib.error.URLError attribute): urllib error — Exception classes raised by urllib request. + (line 22) +* reattach() (tkinter.ttk.Treeview method): ttk Treeview. (line 247) +* rebinding; name: Assignment statements. + (line 6) +* reccontrols() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 54) +* received_data (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 84) +* received_lines (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 57) +* recent() (imaplib.IMAP4 method): IMAP4 Objects. (line 208) +* reconfigure() (io.TextIOWrapper method): Text I/O<2>. (line 179) +* records (unittest.TestCase attribute): Test cases. (line 433) +* record_original_stdout() (in module test.support): test support — Utilities for the Python test suite. + (line 285) +* rect() (in module cmath): Conversions to and from polar coordinates. + (line 48) +* rectangle() (in module curses.textpad): curses textpad — Text input widget for curses programs. + (line 15) +* RecursionError: Concrete exceptions. + (line 209) +* recursive_repr() (in module reprlib): reprlib — Alternate repr implementation. + (line 41) +* recv() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 211) +* recv() (multiprocessing.connection.Connection method): Connection Objects. + (line 24) +* recv() (socket.socket method): Socket Objects. (line 231) +* recvfrom() (socket.socket method): Socket Objects. (line 248) +* recvfrom_into() (socket.socket method): Socket Objects. (line 373) +* recvmsg() (socket.socket method): Socket Objects. (line 266) +* recvmsg_into() (socket.socket method): Socket Objects. (line 336) +* recv_bytes() (multiprocessing.connection.Connection method): Connection Objects. + (line 65) +* recv_bytes_into() (multiprocessing.connection.Connection method): Connection Objects. + (line 79) +* recv_fds() (in module socket): Other functions<2>. (line 445) +* recv_into() (socket.socket method): Socket Objects. (line 383) +* redirect_request() (urllib.request.HTTPRedirectHandler method): HTTPRedirectHandler Objects. + (line 15) +* redirect_stderr() (in module contextlib): Utilities. (line 338) +* redirect_stdout() (in module contextlib): Utilities. (line 298) +* redisplay() (in module readline): Line buffer. (line 19) +* redrawln() (curses.window method): Window Objects. (line 462) +* redrawwin() (curses.window method): Window Objects. (line 468) +* reduce (2to3 fixer): Fixers. (line 273) +* reduce() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 371) +* reducer_override() (pickle.Pickler method): Module Interface. + (line 200) +* ref (class in weakref): weakref — Weak references. + (line 90) +* refcount_test() (in module test.support): test support — Utilities for the Python test suite. + (line 510) +* reference count: Glossary. (line 1198) +* reference counting: Objects values and types. + (line 37) +* ReferenceError: Concrete exceptions. + (line 218) +* ReferenceType (in module weakref): weakref — Weak references. + (line 300) +* refold_source (email.policy.EmailPolicy attribute): email policy Policy Objects. + (line 371) +* refresh() (curses.window method): Window Objects. (line 473) +* RegexFlag (class in re): Flags. (line 9) +* register() (abc.ABCMeta method): abc — Abstract Base Classes. + (line 69) +* register() (in module atexit): atexit — Exit handlers. + (line 22) +* register() (in module codecs): codecs — Codec registry and base classes. + (line 150) +* register() (in module faulthandler): Dumping the traceback on a user signal. + (line 6) +* register() (in module webbrowser): webbrowser — Convenient web-browser controller. + (line 88) +* register() (multiprocessing.managers.BaseManager method): Managers. + (line 92) +* register() (select.devpoll method): /dev/poll Polling Objects. + (line 30) +* register() (select.epoll method): Edge and Level Trigger Polling epoll Objects. + (line 81) +* register() (select.poll method): Polling Objects. (line 15) +* register() (selectors.BaseSelector method): Classes<3>. (line 65) +* registerDOMImplementation() (in module xml.dom): Module Contents<4>. + (line 8) +* registerResult() (in module unittest): Signal Handling. (line 35) +* register_adapter() (in module sqlite3): Module functions. (line 129) +* register_archive_format() (in module shutil): Archiving operations. + (line 89) +* register_at_fork() (in module os): Process Management. (line 496) +* register_converter() (in module sqlite3): Module functions. + (line 136) +* register_defect() (email.policy.Policy method): email policy Policy Objects. + (line 229) +* register_dialect() (in module csv): Module Contents<3>. (line 71) +* register_error() (in module codecs): Error Handlers. (line 101) +* register_function() (xmlrpc.server.CGIXMLRPCRequestHandler method): CGIXMLRPCRequestHandler. + (line 9) +* register_function() (xmlrpc.server.SimpleXMLRPCServer method): SimpleXMLRPCServer Objects. + (line 10) +* register_instance() (xmlrpc.server.CGIXMLRPCRequestHandler method): CGIXMLRPCRequestHandler. + (line 26) +* register_instance() (xmlrpc.server.SimpleXMLRPCServer method): SimpleXMLRPCServer Objects. + (line 27) +* register_introspection_functions() (xmlrpc.server.CGIXMLRPCRequestHandler method): CGIXMLRPCRequestHandler. + (line 41) +* register_introspection_functions() (xmlrpc.server.SimpleXMLRPCServer method): SimpleXMLRPCServer Objects. + (line 55) +* register_multicall_functions() (xmlrpc.server.CGIXMLRPCRequestHandler method): CGIXMLRPCRequestHandler. + (line 46) +* register_multicall_functions() (xmlrpc.server.SimpleXMLRPCServer method): SimpleXMLRPCServer Objects. + (line 60) +* register_namespace() (in module xml.etree.ElementTree): Functions<8>. + (line 194) +* register_optionflag() (in module doctest): Option Flags. (line 161) +* register_shape() (in module turtle): Settings and special methods. + (line 71) +* register_unpack_format() (in module shutil): Archiving operations. + (line 140) +* regular package: Glossary. (line 1206) +* REG_BINARY (in module winreg): Value Types. (line 8) +* REG_DWORD (in module winreg): Value Types. (line 12) +* REG_DWORD_BIG_ENDIAN (in module winreg): Value Types. (line 21) +* REG_DWORD_LITTLE_ENDIAN (in module winreg): Value Types. (line 16) +* REG_EXPAND_SZ (in module winreg): Value Types. (line 25) +* REG_FULL_RESOURCE_DESCRIPTOR (in module winreg): Value Types. + (line 60) +* REG_LINK (in module winreg): Value Types. (line 30) +* REG_MULTI_SZ (in module winreg): Value Types. (line 34) +* REG_NONE (in module winreg): Value Types. (line 39) +* REG_QWORD (in module winreg): Value Types. (line 43) +* REG_QWORD_LITTLE_ENDIAN (in module winreg): Value Types. (line 49) +* REG_RESOURCE_LIST (in module winreg): Value Types. (line 56) +* REG_RESOURCE_REQUIREMENTS_LIST (in module winreg): Value Types. + (line 64) +* REG_SZ (in module winreg): Value Types. (line 68) +* relative; import: The import statement. + (line 98) +* relative; URL: urllib parse — Parse URLs into components. + (line 8) +* relative_to() (pathlib.PurePath method): Methods and properties. + (line 275) +* release() (asyncio.Condition method): Condition. (line 78) +* release() (asyncio.Lock method): Lock. (line 49) +* release() (asyncio.Semaphore method): Semaphore. (line 54) +* release() (in module platform): Cross Platform. (line 114) +* release() (logging.Handler method): Handler Objects. (line 31) +* release() (memoryview method): Memory Views. (line 236) +* release() (multiprocessing.Lock method): Synchronization primitives. + (line 92) +* release() (multiprocessing.RLock method): Synchronization primitives. + (line 148) +* release() (pickle.PickleBuffer method): Module Interface. (line 325) +* release() (threading.Condition method): Condition Objects. (line 91) +* release() (threading.Lock method): Lock Objects. (line 73) +* release() (threading.RLock method): RLock Objects. (line 66) +* release() (threading.Semaphore method): Semaphore Objects. (line 63) +* release() (_thread.lock method): _thread — Low-level threading API. + (line 164) +* releasebufferproc (C type): Slot Type typedefs. (line 102) +* release_lock() (in module imp): imp — Access the import internals. + (line 295) +* reload (2to3 fixer): Fixers. (line 277) +* reload() (in module imp): imp — Access the import internals. + (line 132) +* reload() (in module importlib): Functions<11>. (line 77) +* relpath() (in module os.path): os path — Common pathname manipulations. + (line 326) +* remainder() (decimal.Context method): Context objects. (line 486) +* remainder() (in module math): Number-theoretic and representation functions. + (line 245) +* remainder_near() (decimal.Context method): Context objects. + (line 493) +* remainder_near() (decimal.Decimal method): Decimal objects. + (line 496) +* RemoteDisconnected: http client — HTTP protocol client. + (line 194) +* remove() (array.array method): array — Efficient arrays of numeric values. + (line 207) +* remove() (collections.deque method): deque objects. (line 97) +* remove() (frozenset method): Set Types — set frozenset. + (line 199) +* remove() (in module os): Files and Directories. + (line 624) +* remove() (mailbox.Mailbox method): Mailbox objects. (line 76) +* remove() (mailbox.MH method): MH. (line 76) +* remove() (sequence method): Mutable Sequence Types. + (line 16) +* remove() (xml.etree.ElementTree.Element method): Element Objects. + (line 170) +* removeAttribute() (xml.dom.Element method): Element Objects<2>. + (line 52) +* removeAttributeNode() (xml.dom.Element method): Element Objects<2>. + (line 57) +* removeAttributeNS() (xml.dom.Element method): Element Objects<2>. + (line 62) +* removeChild() (xml.dom.Node method): Node Objects. (line 128) +* removedirs() (in module os): Files and Directories. + (line 648) +* removeFilter() (logging.Handler method): Handler Objects. (line 56) +* removeFilter() (logging.Logger method): Logger Objects. (line 272) +* removeHandler() (in module unittest): Signal Handling. (line 52) +* removeHandler() (logging.Logger method): Logger Objects. (line 289) +* removeprefix() (bytearray method): Bytes and Bytearray Operations. + (line 49) +* removeprefix() (bytes method): Bytes and Bytearray Operations. + (line 49) +* removeprefix() (str method): String Methods<2>. (line 364) +* removeResult() (in module unittest): Signal Handling. (line 46) +* removesuffix() (bytearray method): Bytes and Bytearray Operations. + (line 69) +* removesuffix() (bytes method): Bytes and Bytearray Operations. + (line 69) +* removesuffix() (str method): String Methods<2>. (line 377) +* removexattr() (in module os): Linux extended attributes. + (line 41) +* remove_child_handler() (asyncio.AbstractChildWatcher method): Process Watchers. + (line 52) +* remove_done_callback() (asyncio.Future method): Future Object. + (line 106) +* remove_done_callback() (asyncio.Task method): Task Object. (line 97) +* remove_flag() (mailbox.MaildirMessage method): MaildirMessage. + (line 84) +* remove_flag() (mailbox.mboxMessage method): mboxMessage. (line 85) +* remove_flag() (mailbox.MMDFMessage method): MMDFMessage. (line 84) +* remove_folder() (mailbox.Maildir method): Maildir. (line 76) +* remove_folder() (mailbox.MH method): MH. (line 47) +* remove_header() (urllib.request.Request method): Request Objects. + (line 100) +* remove_history_item() (in module readline): History list. (line 26) +* remove_label() (mailbox.BabylMessage method): BabylMessage. + (line 59) +* remove_option() (configparser.ConfigParser method): ConfigParser Objects. + (line 271) +* remove_option() (optparse.OptionParser method): Querying and manipulating your option parser. + (line 47) +* remove_pyc() (msilib.Directory method): Directory Objects. (line 45) +* remove_reader() (asyncio.loop method): Watching file descriptors. + (line 12) +* remove_section() (configparser.ConfigParser method): ConfigParser Objects. + (line 278) +* remove_sequence() (mailbox.MHMessage method): MHMessage. (line 46) +* remove_signal_handler() (asyncio.loop method): Unix signals. + (line 26) +* remove_tree() (in module distutils.dir_util): distutils dir_util — Directory tree operations. + (line 60) +* remove_writer() (asyncio.loop method): Watching file descriptors. + (line 25) +* rename() (ftplib.FTP method): FTP Objects. (line 202) +* rename() (imaplib.IMAP4 method): IMAP4 Objects. (line 213) +* rename() (in module os): Files and Directories. + (line 665) +* rename() (pathlib.Path method): Methods<2>. (line 324) +* renames (2to3 fixer): Fixers. (line 281) +* renames() (in module os): Files and Directories. + (line 699) +* reopenIfNeeded() (logging.handlers.WatchedFileHandler method): WatchedFileHandler. + (line 41) +* reorganize() (dbm.gnu.gdbm method): dbm gnu — GNU’s reinterpretation of dbm. + (line 107) +* repeat() (in module itertools): Itertool functions. (line 516) +* repeat() (in module timeit): Python Interface. (line 18) +* repeat() (timeit.Timer method): Python Interface. (line 108) +* repetition; operation: Common Sequence Operations. + (line 21) +* replace() (bytearray method): Bytes and Bytearray Operations. + (line 193) +* replace() (bytes method): Bytes and Bytearray Operations. + (line 193) +* replace() (curses.panel.Panel method): Panel Objects. (line 39) +* replace() (datetime.date method): date Objects. (line 170) +* replace() (datetime.datetime method): datetime Objects. (line 421) +* replace() (datetime.time method): time Objects. (line 155) +* replace() (in module dataclasses): Module contents<4>. (line 402) +* replace() (in module os): Files and Directories. + (line 717) +* replace() (inspect.Parameter method): Introspecting callables with the Signature object. + (line 274) +* replace() (inspect.Signature method): Introspecting callables with the Signature object. + (line 127) +* replace() (pathlib.Path method): Methods<2>. (line 349) +* replace() (str method): String Methods<2>. (line 390) +* replace() (types.CodeType method): Standard Interpreter Types. + (line 69) +* replace; error handler’s name: Error Handlers. (line 15) +* replaceChild() (xml.dom.Node method): Node Objects. (line 135) +* ReplacePackage() (in module modulefinder): modulefinder — Find modules used by a script. + (line 21) +* replace_errors() (in module codecs): Error Handlers. (line 154) +* replace_header() (email.message.EmailMessage method): email message Representing an email message. + (line 301) +* replace_header() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 409) +* replace_history_item() (in module readline): History list. (line 32) +* replace_whitespace (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 182) +* report() (filecmp.dircmp method): The dircmp class. (line 18) +* report() (modulefinder.ModuleFinder method): modulefinder — Find modules used by a script. + (line 38) +* REPORTING_FLAGS (in module doctest): Option Flags. (line 153) +* REPORT_CDIFF (in module doctest): Option Flags. (line 115) +* report_failure() (doctest.DocTestRunner method): DocTestRunner objects. + (line 70) +* report_full_closure() (filecmp.dircmp method): The dircmp class. + (line 28) +* REPORT_NDIFF (in module doctest): Option Flags. (line 120) +* REPORT_ONLY_FIRST_FAILURE (in module doctest): Option Flags. + (line 129) +* report_partial_closure() (filecmp.dircmp method): The dircmp class. + (line 23) +* report_start() (doctest.DocTestRunner method): DocTestRunner objects. + (line 48) +* report_success() (doctest.DocTestRunner method): DocTestRunner objects. + (line 59) +* REPORT_UDIFF (in module doctest): Option Flags. (line 110) +* report_unexpected_exception() (doctest.DocTestRunner method): DocTestRunner objects. + (line 81) +* repr (2to3 fixer): Fixers. (line 285) +* Repr (class in reprlib): reprlib — Alternate repr implementation. + (line 17) +* repr() (built-in function); __repr__() (object method): Basic customization. + (line 112) +* repr() (in module reprlib): reprlib — Alternate repr implementation. + (line 31) +* repr() (reprlib.Repr method): Repr Objects. (line 54) +* repr1() (reprlib.Repr method): Repr Objects. (line 59) +* reprfunc (C type): Slot Type typedefs. (line 39) +* Request (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 184) +* request() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 8) +* RequestHandlerClass (socketserver.BaseServer attribute): Server Objects<2>. + (line 71) +* requestline (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 86) +* request_queue_size (socketserver.BaseServer attribute): Server Objects<2>. + (line 98) +* request_rate() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 60) +* request_uri() (in module wsgiref.util): wsgiref util – WSGI environment utilities. + (line 27) +* request_version (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 104) +* Required (in module typing): Special forms. (line 302) +* requires() (in module test.support): test support — Utilities for the Python test suite. + (line 204) +* requires_bz2() (in module test.support): test support — Utilities for the Python test suite. + (line 479) +* requires_docstrings() (in module test.support): test support — Utilities for the Python test suite. + (line 491) +* requires_freebsd_version() (in module test.support): test support — Utilities for the Python test suite. + (line 452) +* requires_gzip() (in module test.support): test support — Utilities for the Python test suite. + (line 475) +* requires_IEEE_754() (in module test.support): test support — Utilities for the Python test suite. + (line 467) +* requires_linux_version() (in module test.support): test support — Utilities for the Python test suite. + (line 457) +* requires_lzma() (in module test.support): test support — Utilities for the Python test suite. + (line 483) +* requires_mac_version() (in module test.support): test support — Utilities for the Python test suite. + (line 462) +* requires_resource() (in module test.support): test support — Utilities for the Python test suite. + (line 487) +* requires_zlib() (in module test.support): test support — Utilities for the Python test suite. + (line 471) +* RERAISE (opcode): Python Bytecode Instructions. + (line 302) +* reschedule() (asyncio.Timeout method): Timeouts. (line 66) +* reserved (zipfile.ZipInfo attribute): ZipInfo Objects. (line 111) +* reserved word: Keywords. (line 6) +* RESERVED_FUTURE (in module uuid): uuid — UUID objects according to RFC 4122. + (line 238) +* RESERVED_MICROSOFT (in module uuid): uuid — UUID objects according to RFC 4122. + (line 234) +* RESERVED_NCS (in module uuid): uuid — UUID objects according to RFC 4122. + (line 226) +* reset() (asyncio.Barrier method): Barrier. (line 78) +* reset() (bdb.Bdb method): bdb — Debugger framework. + (line 159) +* reset() (codecs.IncrementalDecoder method): IncrementalDecoder Objects. + (line 40) +* reset() (codecs.IncrementalEncoder method): IncrementalEncoder Objects. + (line 35) +* reset() (codecs.StreamReader method): StreamReader Objects. + (line 83) +* reset() (codecs.StreamWriter method): StreamWriter Objects. + (line 42) +* reset() (contextvars.ContextVar method): Context Variables. + (line 58) +* reset() (html.parser.HTMLParser method): HTMLParser Methods. + (line 23) +* reset() (in module turtle): More drawing control. + (line 6) +* reset() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 172) +* reset() (pipes.Template method): Template Objects. (line 8) +* reset() (threading.Barrier method): Barrier Objects. (line 71) +* reset() (xdrlib.Packer method): Packer Objects. (line 12) +* reset() (xdrlib.Unpacker method): Unpacker Objects. (line 8) +* reset() (xml.dom.pulldom.DOMEventStream method): DOMEventStream Objects. + (line 37) +* reset() (xml.sax.xmlreader.IncrementalParser method): IncrementalParser Objects. + (line 19) +* resetbuffer() (code.InteractiveConsole method): Interactive Console Objects. + (line 40) +* resetlocale() (in module locale): locale — Internationalization services. + (line 395) +* resetscreen() (in module turtle): Window control. (line 59) +* resetty() (in module curses): Functions<5>. (line 419) +* resetwarnings() (in module warnings): Available Functions. + (line 99) +* reset_mock() (unittest.mock.AsyncMock method): The Mock Class. + (line 861) +* reset_mock() (unittest.mock.Mock method): The Mock Class. (line 199) +* reset_peak() (in module tracemalloc): Functions<10>. (line 38) +* reset_prog_mode() (in module curses): Functions<5>. (line 409) +* reset_shell_mode() (in module curses): Functions<5>. (line 414) +* reset_tzpath() (in module zoneinfo): Functions<3>. (line 27) +* resize() (curses.window method): Window Objects. (line 492) +* resize() (in module ctypes): Utility functions. (line 163) +* resize() (mmap.mmap method): mmap — Memory-mapped file support. + (line 254) +* resizemode() (in module turtle): Appearance. (line 24) +* resizeterm() (in module curses): Functions<5>. (line 434) +* resize_term() (in module curses): Functions<5>. (line 424) +* resolution (datetime.date attribute): date Objects. (line 99) +* resolution (datetime.datetime attribute): datetime Objects. + (line 265) +* resolution (datetime.time attribute): time Objects. (line 42) +* resolution (datetime.timedelta attribute): timedelta Objects. + (line 84) +* resolve() (pathlib.Path method): Methods<2>. (line 374) +* resolveEntity() (xml.sax.handler.EntityResolver method): EntityResolver Objects. + (line 6) +* resolve_bases() (in module types): Dynamic Type Creation. + (line 58) +* resolve_name() (in module importlib.util): importlib util – Utility code for importers. + (line 80) +* resolve_name() (in module pkgutil): pkgutil — Package extension utility. + (line 227) +* Resource (in module importlib.resources): Deprecated functions. + (line 11) +* ResourceDenied: test support — Utilities for the Python test suite. + (line 22) +* ResourceLoader (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 296) +* ResourceReader (class in importlib.resources.abc): importlib resources abc – Abstract base classes for resources. + (line 12) +* ResourceWarning: Warnings. (line 81) +* resource_path() (importlib.resources.abc.ResourceReader method): importlib resources abc – Abstract base classes for resources. + (line 54) +* response (nntplib.NNTPError attribute): nntplib — NNTP protocol client. + (line 144) +* response() (imaplib.IMAP4 method): IMAP4 Objects. (line 217) +* ResponseNotReady: http client — HTTP protocol client. + (line 180) +* responses (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 179) +* responses (in module http.client): http client — HTTP protocol client. + (line 215) +* restart (pdb command): Debugger Commands. (line 327) +* restore() (in module difflib): difflib — Helpers for computing deltas. + (line 272) +* restore() (test.support.SaveSignals method): test support — Utilities for the Python test suite. + (line 741) +* RESTRICTED: Generic Attribute Management. + (line 92) +* restricted; execution: Builtins and restricted execution. + (line 6) +* restype (ctypes._FuncPtr attribute): Foreign functions. (line 22) +* result() (asyncio.Future method): Future Object. (line 32) +* result() (asyncio.Task method): Task Object. (line 59) +* result() (concurrent.futures.Future method): Future Objects. + (line 38) +* results() (trace.Trace method): Programmatic Interface. + (line 40) +* RESUME (opcode): Python Bytecode Instructions. + (line 939) +* resume_reading() (asyncio.ReadTransport method): Read-only Transports. + (line 21) +* resume_writing() (asyncio.BaseProtocol method): Base Protocol. + (line 44) +* retr() (poplib.POP3 method): POP3 Objects. (line 62) +* retrbinary() (ftplib.FTP method): FTP Objects. (line 84) +* retrieve() (urllib.request.URLopener method): Legacy interface. + (line 113) +* retrlines() (ftplib.FTP method): FTP Objects. (line 96) +* Return (class in ast): Function and class definitions. + (line 117) +* return (pdb command): Debugger Commands. (line 193) +* returncode (asyncio.subprocess.Process attribute): Interacting with Subprocesses. + (line 140) +* returncode (subprocess.CalledProcessError attribute): Using the subprocess Module. + (line 198) +* returncode (subprocess.CompletedProcess attribute): Using the subprocess Module. + (line 97) +* returncode (subprocess.Popen attribute): Popen Objects. (line 147) +* return_annotation (inspect.Signature attribute): Introspecting callables with the Signature object. + (line 106) +* RETURN_GENERATOR (opcode): Python Bytecode Instructions. + (line 956) +* return_ok() (http.cookiejar.CookiePolicy method): CookiePolicy Objects. + (line 18) +* RETURN_VALUE (opcode): Python Bytecode Instructions. + (line 271) +* return_value (unittest.mock.Mock attribute): The Mock Class. + (line 322) +* retval (pdb command): Debugger Commands. (line 346) +* reveal_type() (in module typing): Functions and decorators. + (line 80) +* reverse() (array.array method): array — Efficient arrays of numeric values. + (line 211) +* reverse() (collections.deque method): deque objects. (line 102) +* reverse() (in module audioop): audioop — Manipulate raw audio data. + (line 191) +* reverse() (sequence method): Mutable Sequence Types. + (line 16) +* reverse_order() (pstats.Stats method): The Stats Class. (line 157) +* reverse_pointer (ipaddress.IPv4Address attribute): Address objects. + (line 83) +* reverse_pointer (ipaddress.IPv6Address attribute): Address objects. + (line 210) +* Reversible (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 44) +* Reversible (class in typing): Corresponding to other types in collections abc. + (line 62) +* revert() (http.cookiejar.FileCookieJar method): CookieJar and FileCookieJar Objects. + (line 142) +* rewind() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 106) +* rewind() (sunau.AU_read method): AU_read Objects. (line 53) +* rewind() (wave.Wave_read method): Wave_read Objects. (line 51) +* rfc2109 (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 68) +* rfc2109_as_netscape (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 83) +* rfc2965 (http.cookiejar.CookiePolicy attribute): CookiePolicy Objects. + (line 72) +* rfc822_escape() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 192) +* RFC; RFC 1014: xdrlib — Encode and decode XDR data. + (line 14) +* RFC; RFC 1014 <1>: xdrlib — Encode and decode XDR data. + (line 35) +* RFC; RFC 1123: Functions<4>. (line 667) +* RFC; RFC 1123 <1>: Functions<4>. (line 678) +* RFC; RFC 1123 <2>: Functions<4>. (line 693) +* RFC; RFC 1321: hashlib — Secure hashes and message digests. + (line 13) +* RFC; RFC 1422: Certificates. (line 38) +* RFC; RFC 1422 <1>: TLS 1 3. (line 41) +* RFC; RFC 1521: Security Considerations<2>. + (line 18) +* RFC; RFC 1521 <1>: quopri — Encode and decode MIME quoted-printable data. + (line 11) +* RFC; RFC 1521 <2>: quopri — Encode and decode MIME quoted-printable data. + (line 37) +* RFC; RFC 1522: binascii — Convert between binary and ASCII. + (line 86) +* RFC; RFC 1522 <1>: quopri — Encode and decode MIME quoted-printable data. + (line 25) +* RFC; RFC 1522 <2>: quopri — Encode and decode MIME quoted-printable data. + (line 39) +* RFC; RFC 1524: mailcap — Mailcap file handling. + (line 23) +* RFC; RFC 1524 <1>: mailcap — Mailcap file handling. + (line 42) +* RFC; RFC 1730: imaplib — IMAP4 protocol client. + (line 14) +* RFC; RFC 1738: URL Quoting. (line 187) +* RFC; RFC 1750: Random generation. (line 54) +* RFC; RFC 1766: locale — Internationalization services. + (line 321) +* RFC; RFC 1766 <1>: locale — Internationalization services. + (line 334) +* RFC; RFC 1808: urllib. (line 23) +* RFC; RFC 1808 <1>: URL Parsing. (line 42) +* RFC; RFC 1808 <2>: URL Quoting. (line 181) +* RFC; RFC 1832: xdrlib — Encode and decode XDR data. + (line 39) +* RFC; RFC 1832 <1>: xdrlib — Encode and decode XDR data. + (line 41) +* RFC; RFC 1869: smtplib — SMTP protocol client. + (line 13) +* RFC; RFC 1869 <1>: smtplib — SMTP protocol client. + (line 199) +* RFC; RFC 1870: smtpd<3>. (line 7) +* RFC; RFC 1870 <1>: smtpd — SMTP Server. + (line 24) +* RFC; RFC 1870 <2>: SMTPChannel Objects. + (line 125) +* RFC; RFC 1939: poplib — POP3 protocol client. + (line 11) +* RFC; RFC 1939 <1>: poplib — POP3 protocol client. + (line 13) +* RFC; RFC 2033: New and Improved Modules<2>. + (line 568) +* RFC; RFC 2045: email — An email and MIME handling package. + (line 16) +* RFC; RFC 2045 <1>: email message Representing an email message. + (line 316) +* RFC; RFC 2045 <2>: email message Representing an email message. + (line 318) +* RFC; RFC 2045 <3>: email message Representing an email message. + (line 321) +* RFC; RFC 2045 <4>: email headerregistry Custom Header Objects. + (line 239) +* RFC; RFC 2045 <5>: email headerregistry Custom Header Objects. + (line 297) +* RFC; RFC 2045 <6>: email message Message Representing an email message using the compat32 API. + (line 422) +* RFC; RFC 2045 <7>: email message Message Representing an email message using the compat32 API. + (line 426) +* RFC; RFC 2045 <8>: email message Message Representing an email message using the compat32 API. + (line 429) +* RFC; RFC 2045 <9>: email message Message Representing an email message using the compat32 API. + (line 526) +* RFC; RFC 2045 <10>: email header Internationalized headers. + (line 31) +* RFC; RFC 2045 <11>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 30) +* RFC; RFC 2045 <12>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 31) +* RFC; RFC 2045 <13>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 250) +* RFC; RFC 2045 <14>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 258) +* RFC; RFC 2045#section-6.8: Binary Objects. (line 31) +* RFC; RFC 2046: email — An email and MIME handling package. + (line 16) +* RFC; RFC 2046 <1>: Content Manager Instances. + (line 85) +* RFC; RFC 2046 <2>: email header Internationalized headers. + (line 32) +* RFC; RFC 2047: PEP 3333 Python Web Server Gateway Interface v1 0 1. + (line 21) +* RFC; RFC 2047 <1>: email<5>. (line 27) +* RFC; RFC 2047 <2>: email — An email and MIME handling package. + (line 16) +* RFC; RFC 2047 <3>: email policy Policy Objects. + (line 347) +* RFC; RFC 2047 <4>: email policy Policy Objects. + (line 353) +* RFC; RFC 2047 <5>: email headerregistry Custom Header Objects. + (line 78) +* RFC; RFC 2047 <6>: email headerregistry Custom Header Objects. + (line 123) +* RFC; RFC 2047 <7>: email headerregistry Custom Header Objects. + (line 128) +* RFC; RFC 2047 <8>: email header Internationalized headers. + (line 32) +* RFC; RFC 2047 <9>: email header Internationalized headers. + (line 55) +* RFC; RFC 2047 <10>: email header Internationalized headers. + (line 117) +* RFC; RFC 2047 <11>: email header Internationalized headers. + (line 141) +* RFC; RFC 2047 <12>: email utils Miscellaneous utilities. + (line 74) +* RFC; RFC 2060: imaplib — IMAP4 protocol client. + (line 13) +* RFC; RFC 2060 <1>: IMAP4 Objects. (line 316) +* RFC; RFC 2068: http cookies — HTTP state management. + (line 16) +* RFC; RFC 2104: New and Improved Modules<3>. + (line 35) +* RFC; RFC 2104 <1>: hmac — Keyed-Hashing for Message Authentication. + (line 10) +* RFC; RFC 2109: http cookies — HTTP state management. + (line 15) +* RFC; RFC 2109 <1>: http cookies — HTTP state management. + (line 35) +* RFC; RFC 2109 <2>: http cookies — HTTP state management. + (line 65) +* RFC; RFC 2109 <3>: Morsel Objects. (line 8) +* RFC; RFC 2109 <4>: Morsel Objects. (line 11) +* RFC; RFC 2109 <5>: Morsel Objects. (line 98) +* RFC; RFC 2109 <6>: Morsel Objects. (line 110) +* RFC; RFC 2109 <7>: http cookiejar — Cookie handling for HTTP clients. + (line 18) +* RFC; RFC 2109 <8>: http cookiejar — Cookie handling for HTTP clients. + (line 102) +* RFC; RFC 2109 <9>: http cookiejar — Cookie handling for HTTP clients. + (line 114) +* RFC; RFC 2109 <10>: http cookiejar — Cookie handling for HTTP clients. + (line 141) +* RFC; RFC 2109 <11>: DefaultCookiePolicy Objects. + (line 86) +* RFC; RFC 2109 <12>: Cookie Objects<2>. (line 11) +* RFC; RFC 2109 <13>: Cookie Objects<2>. (line 23) +* RFC; RFC 2109 <14>: Cookie Objects<2>. (line 70) +* RFC; RFC 2183: email — An email and MIME handling package. + (line 16) +* RFC; RFC 2183 <1>: email message Representing an email message. + (line 460) +* RFC; RFC 2183 <2>: email message Message Representing an email message using the compat32 API. + (line 632) +* RFC; RFC 2231: email — An email and MIME handling package. + (line 16) +* RFC; RFC 2231 <1>: email message Representing an email message. + (line 280) +* RFC; RFC 2231 <2>: email message Representing an email message. + (line 283) +* RFC; RFC 2231 <3>: email message Representing an email message. + (line 365) +* RFC; RFC 2231 <4>: email message Message Representing an email message using the compat32 API. + (line 385) +* RFC; RFC 2231 <5>: email message Message Representing an email message using the compat32 API. + (line 389) +* RFC; RFC 2231 <6>: email message Message Representing an email message using the compat32 API. + (line 491) +* RFC; RFC 2231 <7>: email message Message Representing an email message using the compat32 API. + (line 499) +* RFC; RFC 2231 <8>: email message Message Representing an email message using the compat32 API. + (line 533) +* RFC; RFC 2231 <9>: email header Internationalized headers. + (line 32) +* RFC; RFC 2231 <10>: email utils Miscellaneous utilities. + (line 178) +* RFC; RFC 2231 <11>: email utils Miscellaneous utilities. + (line 183) +* RFC; RFC 2231 <12>: email utils Miscellaneous utilities. + (line 192) +* RFC; RFC 2231 <13>: email utils Miscellaneous utilities. + (line 199) +* RFC; RFC 2231 <14>: email utils Miscellaneous utilities. + (line 208) +* RFC; RFC 2295: HTTP status codes. (line 184) +* RFC; RFC 2324: HTTP status codes. (line 133) +* RFC; RFC 2342: New and Improved Modules<3>. + (line 93) +* RFC; RFC 2342 <1>: IMAP4 Objects. (line 164) +* RFC; RFC 2368: URL Quoting. (line 177) +* RFC; RFC 2373: Address objects. (line 101) +* RFC; RFC 2373 <1>: Address objects. (line 120) +* RFC; RFC 2373 <2>: Address objects. (line 129) +* RFC; RFC 2396: urllib parse<3>. (line 6) +* RFC; RFC 2396 <1>: urllib. (line 24) +* RFC; RFC 2396 <2>: URL Parsing. (line 254) +* RFC; RFC 2396 <3>: URL Quoting. (line 25) +* RFC; RFC 2396 <4>: URL Quoting. (line 172) +* RFC; RFC 2397: DataHandler Objects. + (line 9) +* RFC; RFC 2449: POP3 Objects. (line 26) +* RFC; RFC 2487: New and Improved Modules<3>. + (line 85) +* RFC; RFC 2518: HTTP status codes. (line 19) +* RFC; RFC 2595: poplib — POP3 protocol client. + (line 14) +* RFC; RFC 2595 <1>: POP3 Objects. (line 115) +* RFC; RFC 2616: PEP 3333 Python Web Server Gateway Interface v1 0 1. + (line 20) +* RFC; RFC 2616 <1>: wsgiref util – WSGI environment utilities. + (line 114) +* RFC; RFC 2616 <2>: wsgiref validate — WSGI conformance checker. + (line 27) +* RFC; RFC 2616 <3>: HTTPRedirectHandler Objects. + (line 8) +* RFC; RFC 2616 <4>: HTTPRedirectHandler Objects. + (line 28) +* RFC; RFC 2616 <5>: Legacy interface. (line 164) +* RFC; RFC 2616 <6>: urllib error — Exception classes raised by urllib request. + (line 40) +* RFC; RFC 2616 <7>: Introduction<15>. (line 34) +* RFC; RFC 2616 <8>: HTTPError. (line 15) +* RFC; RFC 2616 <9>: Error Codes. (line 12) +* RFC; RFC 2640: Changes in the Python API<2>. + (line 36) +* RFC; RFC 2640 <1>: Tests<24>. (line 22) +* RFC; RFC 2640 <2>: ftplib — FTP protocol client. + (line 18) +* RFC; RFC 2640 <3>: ftplib — FTP protocol client. + (line 85) +* RFC; RFC 2640 <4>: ftplib — FTP protocol client. + (line 123) +* RFC; RFC 2732: urllib parse<4>. (line 10) +* RFC; RFC 2732 <1>: New and Improved Modules. + (line 638) +* RFC; RFC 2732 <2>: URL Quoting. (line 168) +* RFC; RFC 2774: HTTP status codes. (line 193) +* RFC; RFC 2818: ssl<10>. (line 16) +* RFC; RFC 2818 <1>: Certificate handling. + (line 11) +* RFC; RFC 2821: email — An email and MIME handling package. + (line 12) +* RFC; RFC 2822: New and Improved Modules<3>. + (line 97) +* RFC; RFC 2822 <1>: Batteries Included. (line 16) +* RFC; RFC 2822 <2>: Functions<4>. (line 669) +* RFC; RFC 2822 <3>: Functions<4>. (line 680) +* RFC; RFC 2822 <4>: Functions<4>. (line 395) +* RFC; RFC 2822 <5>: Functions<4>. (line 695) +* RFC; RFC 2822 <6>: email message Message Representing an email message using the compat32 API. + (line 274) +* RFC; RFC 2822 <7>: email header Internationalized headers. + (line 20) +* RFC; RFC 2822 <8>: email header Internationalized headers. + (line 23) +* RFC; RFC 2822 <9>: email header Internationalized headers. + (line 31) +* RFC; RFC 2822 <10>: email header Internationalized headers. + (line 88) +* RFC; RFC 2822 <11>: email header Internationalized headers. + (line 116) +* RFC; RFC 2822 <12>: email header Internationalized headers. + (line 134) +* RFC; RFC 2822 <13>: email utils Miscellaneous utilities. + (line 31) +* RFC; RFC 2822 <14>: email utils Miscellaneous utilities. + (line 98) +* RFC; RFC 2822 <15>: email utils Miscellaneous utilities. + (line 101) +* RFC; RFC 2822 <16>: email utils Miscellaneous utilities. + (line 226) +* RFC; RFC 2822 <17>: email utils Miscellaneous utilities. + (line 144) +* RFC; RFC 2822 <18>: Message objects. (line 17) +* RFC; RFC 2822 <19>: http client — HTTP protocol client. + (line 122) +* RFC; RFC 2822 <20>: http server — HTTP servers. + (line 116) +* RFC; RFC 2964: http cookiejar — Cookie handling for HTTP clients. + (line 154) +* RFC; RFC 2965: urllib request — Extensible library for opening URLs. + (line 228) +* RFC; RFC 2965 <1>: urllib request — Extensible library for opening URLs. + (line 236) +* RFC; RFC 2965 <2>: Request Objects. (line 50) +* RFC; RFC 2965 <3>: http cookiejar — Cookie handling for HTTP clients. + (line 16) +* RFC; RFC 2965 <4>: http cookiejar — Cookie handling for HTTP clients. + (line 102) +* RFC; RFC 2965 <5>: http cookiejar — Cookie handling for HTTP clients. + (line 114) +* RFC; RFC 2965 <6>: http cookiejar — Cookie handling for HTTP clients. + (line 143) +* RFC; RFC 2965 <7>: http cookiejar — Cookie handling for HTTP clients. + (line 145) +* RFC; RFC 2965 <8>: http cookiejar — Cookie handling for HTTP clients. + (line 152) +* RFC; RFC 2965 <9>: FileCookieJar subclasses and co-operation with web browsers. + (line 16) +* RFC; RFC 2965 <10>: CookiePolicy Objects. + (line 74) +* RFC; RFC 2965 <11>: CookiePolicy Objects. + (line 79) +* RFC; RFC 2965 <12>: DefaultCookiePolicy Objects. + (line 8) +* RFC; RFC 2965 <13>: DefaultCookiePolicy Objects. + (line 90) +* RFC; RFC 2965 <14>: DefaultCookiePolicy Objects. + (line 101) +* RFC; RFC 2965 <15>: DefaultCookiePolicy Objects. + (line 105) +* RFC; RFC 2965 <16>: DefaultCookiePolicy Objects. + (line 114) +* RFC; RFC 2965 <17>: DefaultCookiePolicy Objects. + (line 151) +* RFC; RFC 2965 <18>: Cookie Objects<2>. (line 23) +* RFC; RFC 2965 <19>: Examples<28>. (line 25) +* RFC; RFC 2980: nntplib — NNTP protocol client. + (line 16) +* RFC; RFC 2980 <1>: Methods<3>. (line 317) +* RFC; RFC 3056: Address objects. (line 257) +* RFC; RFC 3164: Logging to syslog with RFC5424 support. + (line 7) +* RFC; RFC 3171: Address objects. (line 100) +* RFC; RFC 3207: New and Improved Modules<2>. + (line 573) +* RFC; RFC 3229: HTTP status codes. (line 52) +* RFC; RFC 3280: SSL Sockets. (line 157) +* RFC; RFC 3330: Address objects. (line 128) +* RFC; RFC 3339: Displaying the date/time in messages. + (line 18) +* RFC; RFC 3454: stringprep — Internet String Preparation. + (line 17) +* RFC; RFC 3454 <1>: stringprep — Internet String Preparation. + (line 26) +* RFC; RFC 3490: Text Encodings. (line 14) +* RFC; RFC 3490 <1>: encodings idna — Internationalized Domain Names in Applications. + (line 6) +* RFC; RFC 3490 <2>: encodings idna — Internationalized Domain Names in Applications. + (line 57) +* RFC; RFC 3490 <3>: encodings idna — Internationalized Domain Names in Applications. + (line 62) +* RFC; RFC 3490#section-3.1: encodings idna — Internationalized Domain Names in Applications. + (line 27) +* RFC; RFC 3492: Text Encodings. (line 36) +* RFC; RFC 3492 <1>: encodings idna — Internationalized Domain Names in Applications. + (line 7) +* RFC; RFC 3493: Example<8>. (line 227) +* RFC; RFC 3501: IMAP4 Objects. (line 327) +* RFC; RFC 3542: Library<34>. (line 352) +* RFC; RFC 3542 <1>: Other functions<2>. (line 313) +* RFC; RFC 3548: New Improved and Deprecated Modules<3>. + (line 16) +* RFC; RFC 3548 <1>: binascii — Convert between binary and ASCII. + (line 50) +* RFC; RFC 3548 <2>: binascii — Convert between binary and ASCII. + (line 65) +* RFC; RFC 3659: FTP Objects. (line 168) +* RFC; RFC 3879: Address objects. (line 235) +* RFC; RFC 3927: Address objects. (line 133) +* RFC; RFC 3977: nntplib — NNTP protocol client. + (line 16) +* RFC; RFC 3977 <1>: Attributes. (line 10) +* RFC; RFC 3977 <2>: Methods<3>. (line 36) +* RFC; RFC 3977 <3>: Methods<3>. (line 138) +* RFC; RFC 3977 <4>: Methods<3>. (line 318) +* RFC; RFC 3986: urllib parse<3>. (line 6) +* RFC; RFC 3986 <1>: urllib. (line 22) +* RFC; RFC 3986 <2>: New and Improved Modules. + (line 617) +* RFC; RFC 3986 <3>: Porting to Python 2 7. + (line 80) +* RFC; RFC 3986 <4>: URL Parsing. (line 139) +* RFC; RFC 3986 <5>: URL Parsing. (line 357) +* RFC; RFC 3986 <6>: URL Quoting. (line 25) +* RFC; RFC 3986 <7>: URL Quoting. (line 160) +* RFC; RFC 3986 <8>: http server — HTTP servers. + (line 101) +* RFC; RFC 4007: Address objects. (line 178) +* RFC; RFC 4007 <1>: Address objects. (line 249) +* RFC; RFC 4086: TLS 1 3. (line 45) +* RFC; RFC 4122: New Improved and Removed Modules. + (line 418) +* RFC; RFC 4122 <1>: New Improved and Removed Modules. + (line 423) +* RFC; RFC 4122 <2>: uuid — UUID objects according to RFC 4122. + (line 6) +* RFC; RFC 4122 <3>: uuid — UUID objects according to RFC 4122. + (line 15) +* RFC; RFC 4122 <4>: uuid — UUID objects according to RFC 4122. + (line 73) +* RFC; RFC 4122 <5>: uuid — UUID objects according to RFC 4122. + (line 139) +* RFC; RFC 4122 <6>: uuid — UUID objects according to RFC 4122. + (line 168) +* RFC; RFC 4122 <7>: uuid — UUID objects according to RFC 4122. + (line 232) +* RFC; RFC 4122 <8>: uuid — UUID objects according to RFC 4122. + (line 245) +* RFC; RFC 4180: csv — CSV File Reading and Writing. + (line 13) +* RFC; RFC 4193: Address objects. (line 237) +* RFC; RFC 4217: ftplib — FTP protocol client. + (line 93) +* RFC; RFC 4291: Library<14>. (line 653) +* RFC; RFC 4291 <1>: Address objects. (line 172) +* RFC; RFC 4380: Address objects. (line 264) +* RFC; RFC 4627: json — JSON encoder and decoder. + (line 11) +* RFC; RFC 4627 <1>: Top-level Non-Object Non-Array Values. + (line 6) +* RFC; RFC 4642: nntplib — NNTP protocol client. + (line 117) +* RFC; RFC 4648: Documentation<14>. (line 32) +* RFC; RFC 4648 <1>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 12) +* RFC; RFC 4648 <2>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 16) +* RFC; RFC 4648 <3>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 24) +* RFC; RFC 4648 <4>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 115) +* RFC; RFC 4648 <5>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 129) +* RFC; RFC 4648 <6>: base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 136) +* RFC; RFC 4648 <7>: Security Considerations<2>. + (line 6) +* RFC; RFC 4648 <8>: Security Considerations<4>. + (line 8) +* RFC; RFC 4918: HTTP status codes. (line 46) +* RFC; RFC 4918 <1>: HTTP status codes. (line 139) +* RFC; RFC 4918 <2>: HTTP status codes. (line 142) +* RFC; RFC 4918 <3>: HTTP status codes. (line 145) +* RFC; RFC 4918 <4>: HTTP status codes. (line 187) +* RFC; RFC 4954: SMTP Objects. (line 135) +* RFC; RFC 4954 <1>: SMTP Objects. (line 158) +* RFC; RFC 5161: imaplib<2>. (line 11) +* RFC; RFC 5161 <1>: IMAP4 Objects. (line 86) +* RFC; RFC 5246: Constants<9>. (line 502) +* RFC; RFC 5246 <1>: TLS 1 3. (line 53) +* RFC; RFC 5280: Other Changes. (line 20) +* RFC; RFC 5280 <1>: Changes in the Python API<6>. + (line 95) +* RFC; RFC 5280 <2>: Certificate handling. + (line 11) +* RFC; RFC 5280 <3>: Certificate handling. + (line 64) +* RFC; RFC 5280 <4>: TLS 1 3. (line 49) +* RFC; RFC 5321: smtpd<3>. (line 6) +* RFC; RFC 5321 <1>: email headerregistry Custom Header Objects. + (line 452) +* RFC; RFC 5321 <2>: smtpd — SMTP Server. + (line 24) +* RFC; RFC 5321 <3>: SMTPServer Objects. (line 50) +* RFC; RFC 5321 <4>: SMTPServer Objects. (line 78) +* RFC; RFC 5322: email — An email and MIME handling package. + (line 15) +* RFC; RFC 5322 <1>: email message Representing an email message. + (line 20) +* RFC; RFC 5322 <2>: email message Representing an email message. + (line 31) +* RFC; RFC 5322 <3>: Parser API. (line 41) +* RFC; RFC 5322 <4>: email generator Generating MIME documents. + (line 102) +* RFC; RFC 5322 <5>: email generator Generating MIME documents. + (line 195) +* RFC; RFC 5322 <6>: email policy Policy Objects. + (line 148) +* RFC; RFC 5322 <7>: email policy Policy Objects. + (line 326) +* RFC; RFC 5322 <8>: email policy Policy Objects. + (line 347) +* RFC; RFC 5322 <9>: email policy Policy Objects. + (line 353) +* RFC; RFC 5322 <10>: email policy Policy Objects. + (line 365) +* RFC; RFC 5322 <11>: email policy Policy Objects. + (line 398) +* RFC; RFC 5322 <12>: email errors Exception and Defect classes. + (line 28) +* RFC; RFC 5322 <13>: email headerregistry Custom Header Objects. + (line 16) +* RFC; RFC 5322 <14>: email headerregistry Custom Header Objects. + (line 117) +* RFC; RFC 5322 <15>: email headerregistry Custom Header Objects. + (line 122) +* RFC; RFC 5322 <16>: email headerregistry Custom Header Objects. + (line 123) +* RFC; RFC 5322 <17>: email headerregistry Custom Header Objects. + (line 138) +* RFC; RFC 5322 <18>: email headerregistry Custom Header Objects. + (line 159) +* RFC; RFC 5322 <19>: email headerregistry Custom Header Objects. + (line 415) +* RFC; RFC 5322 <20>: email headerregistry Custom Header Objects. + (line 449) +* RFC; RFC 5322 <21>: email headerregistry Custom Header Objects. + (line 483) +* RFC; RFC 5322 <22>: email message Message Representing an email message using the compat32 API. + (line 21) +* RFC; RFC 5322 <23>: SMTP Objects. (line 317) +* RFC; RFC 5424: SysLogHandler. (line 60) +* RFC; RFC 5424 <1>: Inserting a BOM into messages sent to a SysLogHandler. + (line 6) +* RFC; RFC 5424 <2>: Inserting a BOM into messages sent to a SysLogHandler. + (line 19) +* RFC; RFC 5424 <3>: Inserting a BOM into messages sent to a SysLogHandler. + (line 43) +* RFC; RFC 5424 <4>: Logging to syslog with RFC5424 support. + (line 6) +* RFC; RFC 5424#section-6: Inserting a BOM into messages sent to a SysLogHandler. + (line 9) +* RFC; RFC 5735: Address objects. (line 119) +* RFC; RFC 5789: HTTP methods. (line 37) +* RFC; RFC 5842: HTTP status codes. (line 49) +* RFC; RFC 5842 <1>: HTTP status codes. (line 190) +* RFC; RFC 5891: encodings idna — Internationalized Domain Names in Applications. + (line 11) +* RFC; RFC 5895: encodings idna — Internationalized Domain Names in Applications. + (line 11) +* RFC; RFC 5929: SSL Sockets. (line 252) +* RFC; RFC 6066: Constants<9>. (line 402) +* RFC; RFC 6066 <1>: SSL Contexts. (line 281) +* RFC; RFC 6066 <2>: TLS 1 3. (line 57) +* RFC; RFC 6125: Certificate handling. + (line 11) +* RFC; RFC 6125 <1>: Certificate handling. + (line 29) +* RFC; RFC 6152: smtpd. (line 17) +* RFC; RFC 6152 <1>: SMTPServer Objects. (line 35) +* RFC; RFC 6531: email<2>. (line 19) +* RFC; RFC 6531 <1>: smtpd. (line 23) +* RFC; RFC 6531 <2>: smtplib<2>. (line 15) +* RFC; RFC 6531 <3>: email message Representing an email message. + (line 103) +* RFC; RFC 6531 <4>: email policy Policy Objects. + (line 369) +* RFC; RFC 6531 <5>: smtplib — SMTP protocol client. + (line 68) +* RFC; RFC 6531 <6>: smtpd — SMTP Server. + (line 24) +* RFC; RFC 6531 <7>: SMTPServer Objects. (line 26) +* RFC; RFC 6531 <8>: SMTPChannel Objects. + (line 21) +* RFC; RFC 6532: email<2>. (line 18) +* RFC; RFC 6532 <1>: email — An email and MIME handling package. + (line 15) +* RFC; RFC 6532 <2>: email message Representing an email message. + (line 20) +* RFC; RFC 6532 <3>: Parser API. (line 42) +* RFC; RFC 6532 <4>: email policy Policy Objects. + (line 367) +* RFC; RFC 6585: HTTP status codes. (line 154) +* RFC; RFC 6585 <1>: HTTP status codes. (line 157) +* RFC; RFC 6585 <2>: HTTP status codes. (line 160) +* RFC; RFC 6585 <3>: HTTP status codes. (line 196) +* RFC; RFC 6855: imaplib<2>. (line 12) +* RFC; RFC 6855 <1>: imaplib<2>. (line 14) +* RFC; RFC 6855 <2>: IMAP4 Objects. (line 88) +* RFC; RFC 6855 <3>: IMAP4 Objects. (line 90) +* RFC; RFC 6856: poplib<2>. (line 6) +* RFC; RFC 6856 <1>: POP3 Objects. (line 108) +* RFC; RFC 7159: json — JSON encoder and decoder. + (line 10) +* RFC; RFC 7159 <1>: Standard Compliance and Interoperability. + (line 6) +* RFC; RFC 7159 <2>: Top-level Non-Object Non-Array Values. + (line 9) +* RFC; RFC 7230: urllib request — Extensible library for opening URLs. + (line 199) +* RFC; RFC 7230 <1>: HTTPConnection Objects. + (line 154) +* RFC; RFC 7231: HTTP status codes. (line 13) +* RFC; RFC 7231 <1>: HTTP status codes. (line 16) +* RFC; RFC 7231 <2>: HTTP status codes. (line 25) +* RFC; RFC 7231 <3>: HTTP status codes. (line 28) +* RFC; RFC 7231 <4>: HTTP status codes. (line 31) +* RFC; RFC 7231 <5>: HTTP status codes. (line 34) +* RFC; RFC 7231 <6>: HTTP status codes. (line 37) +* RFC; RFC 7231 <7>: HTTP status codes. (line 40) +* RFC; RFC 7231 <8>: HTTP status codes. (line 55) +* RFC; RFC 7231 <9>: HTTP status codes. (line 58) +* RFC; RFC 7231 <10>: HTTP status codes. (line 61) +* RFC; RFC 7231 <11>: HTTP status codes. (line 64) +* RFC; RFC 7231 <12>: HTTP status codes. (line 70) +* RFC; RFC 7231 <13>: HTTP status codes. (line 73) +* RFC; RFC 7231 <14>: HTTP status codes. (line 79) +* RFC; RFC 7231 <15>: HTTP status codes. (line 85) +* RFC; RFC 7231 <16>: HTTP status codes. (line 88) +* RFC; RFC 7231 <17>: HTTP status codes. (line 91) +* RFC; RFC 7231 <18>: HTTP status codes. (line 94) +* RFC; RFC 7231 <19>: HTTP status codes. (line 97) +* RFC; RFC 7231 <20>: HTTP status codes. (line 103) +* RFC; RFC 7231 <21>: HTTP status codes. (line 106) +* RFC; RFC 7231 <22>: HTTP status codes. (line 109) +* RFC; RFC 7231 <23>: HTTP status codes. (line 112) +* RFC; RFC 7231 <24>: HTTP status codes. (line 118) +* RFC; RFC 7231 <25>: HTTP status codes. (line 121) +* RFC; RFC 7231 <26>: HTTP status codes. (line 124) +* RFC; RFC 7231 <27>: HTTP status codes. (line 130) +* RFC; RFC 7231 <28>: HTTP status codes. (line 151) +* RFC; RFC 7231 <29>: HTTP status codes. (line 166) +* RFC; RFC 7231 <30>: HTTP status codes. (line 169) +* RFC; RFC 7231 <31>: HTTP status codes. (line 172) +* RFC; RFC 7231 <32>: HTTP status codes. (line 175) +* RFC; RFC 7231 <33>: HTTP status codes. (line 178) +* RFC; RFC 7231 <34>: HTTP status codes. (line 181) +* RFC; RFC 7231 <35>: HTTP methods. (line 13) +* RFC; RFC 7231 <36>: HTTP methods. (line 16) +* RFC; RFC 7231 <37>: HTTP methods. (line 19) +* RFC; RFC 7231 <38>: HTTP methods. (line 22) +* RFC; RFC 7231 <39>: HTTP methods. (line 25) +* RFC; RFC 7231 <40>: HTTP methods. (line 28) +* RFC; RFC 7231 <41>: HTTP methods. (line 31) +* RFC; RFC 7231 <42>: HTTP methods. (line 34) +* RFC; RFC 7232: HTTP status codes. (line 67) +* RFC; RFC 7232 <1>: HTTP status codes. (line 115) +* RFC; RFC 7233: HTTP status codes. (line 43) +* RFC; RFC 7233 <1>: HTTP status codes. (line 127) +* RFC; RFC 7235: HTTP status codes. (line 82) +* RFC; RFC 7235 <1>: HTTP status codes. (line 100) +* RFC; RFC 7238: HTTP status codes. (line 76) +* RFC; RFC 7301: Application-Layer Protocol Negotiation Support. + (line 10) +* RFC; RFC 7301 <1>: Constants<9>. (line 379) +* RFC; RFC 7301 <2>: SSL Contexts. (line 249) +* RFC; RFC 7525: TLS 1 3. (line 65) +* RFC; RFC 7538: Library<13>. (line 170) +* RFC; RFC 7540: HTTP status codes. (line 136) +* RFC; RFC 7693: BLAKE2. (line 6) +* RFC; RFC 7725: HTTP status codes. (line 163) +* RFC; RFC 7914: Key derivation. (line 56) +* RFC; RFC 821: smtplib — SMTP protocol client. + (line 12) +* RFC; RFC 821 <1>: smtplib — SMTP protocol client. + (line 194) +* RFC; RFC 822: New and Improved Modules<3>. + (line 97) +* RFC; RFC 822 <1>: Functions<4>. (line 662) +* RFC; RFC 822 <2>: Functions<4>. (line 665) +* RFC; RFC 822 <3>: Functions<4>. (line 673) +* RFC; RFC 822 <4>: Functions<4>. (line 676) +* RFC; RFC 822 <5>: Functions<4>. (line 688) +* RFC; RFC 822 <6>: Functions<4>. (line 691) +* RFC; RFC 822 <7>: email Examples. (line 36) +* RFC; RFC 822 <8>: email header Internationalized headers. + (line 21) +* RFC; RFC 822 <9>: HTTPConnection Objects. + (line 141) +* RFC; RFC 822 <10>: SMTP Objects. (line 94) +* RFC; RFC 822 <11>: SMTP Objects. (line 232) +* RFC; RFC 822 <12>: SMTP Objects. (line 233) +* RFC; RFC 822 <13>: SMTP Example. (line 10) +* RFC; RFC 822 <14>: The GNUTranslations class. + (line 13) +* RFC; RFC 822 <15>: distutils util — Miscellaneous other utility functions. + (line 194) +* RFC; RFC 8297: HTTP status codes. (line 22) +* RFC; RFC 8305: Opening network connections. + (line 77) +* RFC; RFC 8305 <1>: Opening network connections. + (line 86) +* RFC; RFC 8470: HTTP status codes. (line 148) +* RFC; RFC 854: telnetlib — Telnet client. + (line 15) +* RFC; RFC 854 <1>: telnetlib — Telnet client. + (line 67) +* RFC; RFC 959: ftplib — FTP protocol client. + (line 16) +* RFC; RFC 977: nntplib — NNTP protocol client. + (line 16) +* RFC_4122 (in module uuid): uuid — UUID objects according to RFC 4122. + (line 230) +* rfile (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 118) +* rfind() (bytearray method): Bytes and Bytearray Operations. + (line 207) +* rfind() (bytes method): Bytes and Bytearray Operations. + (line 207) +* rfind() (mmap.mmap method): mmap — Memory-mapped file support. + (line 270) +* rfind() (str method): String Methods<2>. (line 396) +* rgb_to_hls() (in module colorsys): colorsys — Conversions between color systems. + (line 36) +* rgb_to_hsv() (in module colorsys): colorsys — Conversions between color systems. + (line 44) +* rgb_to_yiq() (in module colorsys): colorsys — Conversions between color systems. + (line 28) +* rglob() (pathlib.Path method): Methods<2>. (line 402) +* richcmpfunc (C type): Slot Type typedefs. (line 82) +* right (filecmp.dircmp attribute): The dircmp class. (line 45) +* right() (in module turtle): Turtle motion. (line 40) +* RIGHTSHIFT (in module token): token — Constants used with Python parse trees. + (line 162) +* RIGHTSHIFTEQUAL (in module token): token — Constants used with Python parse trees. + (line 206) +* right_list (filecmp.dircmp attribute): The dircmp class. (line 54) +* right_only (filecmp.dircmp attribute): The dircmp class. (line 67) +* rindex() (bytearray method): Bytes and Bytearray Operations. + (line 221) +* rindex() (bytes method): Bytes and Bytearray Operations. + (line 221) +* rindex() (str method): String Methods<2>. (line 403) +* rjust() (bytearray method): Bytes and Bytearray Operations. + (line 338) +* rjust() (bytes method): Bytes and Bytearray Operations. + (line 338) +* rjust() (str method): String Methods<2>. (line 408) +* RLIMIT_AS (in module resource): Resource Limits. (line 146) +* RLIMIT_CORE (in module resource): Resource Limits. (line 91) +* RLIMIT_CPU (in module resource): Resource Limits. (line 98) +* RLIMIT_DATA (in module resource): Resource Limits. (line 110) +* RLIMIT_FSIZE (in module resource): Resource Limits. (line 106) +* RLIMIT_KQUEUES (in module resource): Resource Limits. (line 222) +* RLIMIT_MEMLOCK (in module resource): Resource Limits. (line 138) +* RLIMIT_MSGQUEUE (in module resource): Resource Limits. (line 151) +* RLIMIT_NICE (in module resource): Resource Limits. (line 159) +* RLIMIT_NOFILE (in module resource): Resource Limits. (line 129) +* RLIMIT_NPROC (in module resource): Resource Limits. (line 125) +* RLIMIT_NPTS (in module resource): Resource Limits. (line 214) +* RLIMIT_OFILE (in module resource): Resource Limits. (line 134) +* RLIMIT_RSS (in module resource): Resource Limits. (line 120) +* RLIMIT_RTPRIO (in module resource): Resource Limits. (line 168) +* RLIMIT_RTTIME (in module resource): Resource Limits. (line 176) +* RLIMIT_SBSIZE (in module resource): Resource Limits. (line 193) +* RLIMIT_SIGPENDING (in module resource): Resource Limits. (line 185) +* RLIMIT_STACK (in module resource): Resource Limits. (line 114) +* RLIMIT_SWAP (in module resource): Resource Limits. (line 203) +* RLIMIT_VMEM (in module resource): Resource Limits. (line 142) +* RLIM_INFINITY (in module resource): Resource Limits. (line 20) +* RLock (class in multiprocessing): Synchronization primitives. + (line 102) +* RLock (class in threading): RLock Objects. (line 23) +* RLock() (multiprocessing.managers.SyncManager method): Managers. + (line 203) +* rmd() (ftplib.FTP method): FTP Objects. (line 225) +* rmdir() (in module os): Files and Directories. + (line 738) +* rmdir() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 111) +* rmdir() (pathlib.Path method): Methods<2>. (line 421) +* RMFF: chunk — Read IFF chunked data. + (line 8) +* rms() (in module audioop): audioop — Manipulate raw audio data. + (line 196) +* rmtree() (in module shutil): Directory and files operations. + (line 262) +* rmtree() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 118) +* RobotFileParser (class in urllib.robotparser): urllib robotparser — Parser for robots txt. + (line 16) +* robots.txt: urllib robotparser — Parser for robots txt. + (line 8) +* rollback() (sqlite3.Connection method): Connection objects. + (line 73) +* ROMAN (in module tkinter.font): tkinter font — Tkinter font wrapper. + (line 15) +* rotate() (collections.deque method): deque objects. (line 109) +* rotate() (decimal.Context method): Context objects. (line 499) +* rotate() (decimal.Decimal method): Decimal objects. (line 515) +* rotate() (logging.handlers.BaseRotatingHandler method): BaseRotatingHandler. + (line 75) +* RotatingFileHandler (class in logging.handlers): RotatingFileHandler. + (line 9) +* rotation_filename() (logging.handlers.BaseRotatingHandler method): BaseRotatingHandler. + (line 58) +* rotator (logging.handlers.BaseRotatingHandler attribute): BaseRotatingHandler. + (line 49) +* Rounded (class in decimal): Signals. (line 77) +* ROUND_05UP (in module decimal): Rounding modes. (line 34) +* ROUND_CEILING (in module decimal): Rounding modes. (line 6) +* ROUND_DOWN (in module decimal): Rounding modes. (line 10) +* ROUND_FLOOR (in module decimal): Rounding modes. (line 14) +* ROUND_HALF_DOWN (in module decimal): Rounding modes. (line 18) +* ROUND_HALF_EVEN (in module decimal): Rounding modes. (line 22) +* ROUND_HALF_UP (in module decimal): Rounding modes. (line 26) +* ROUND_UP (in module decimal): Rounding modes. (line 30) +* Row (class in sqlite3): Row objects. (line 6) +* rowcount (sqlite3.Cursor attribute): Cursor objects. (line 171) +* row_factory (sqlite3.Connection attribute): Connection objects. + (line 661) +* RPAR (in module token): token — Constants used with Python parse trees. + (line 58) +* rpartition() (bytearray method): Bytes and Bytearray Operations. + (line 233) +* rpartition() (bytes method): Bytes and Bytearray Operations. + (line 233) +* rpartition() (str method): String Methods<2>. (line 415) +* rpc_paths (xmlrpc.server.SimpleXMLRPCRequestHandler attribute): SimpleXMLRPCServer Objects. + (line 64) +* rpop() (poplib.POP3 method): POP3 Objects. (line 46) +* rset() (poplib.POP3 method): POP3 Objects. (line 74) +* RShift (class in ast): Expressions<2>. (line 54) +* rshift() (in module operator): operator — Standard operators as functions. + (line 152) +* rsplit() (bytearray method): Bytes and Bytearray Operations. + (line 350) +* rsplit() (bytes method): Bytes and Bytearray Operations. + (line 350) +* rsplit() (str method): String Methods<2>. (line 423) +* RSQB (in module token): token — Constants used with Python parse trees. + (line 66) +* rstrip() (bytearray method): Bytes and Bytearray Operations. + (line 361) +* rstrip() (bytes method): Bytes and Bytearray Operations. + (line 361) +* rstrip() (str method): String Methods<2>. (line 432) +* rt() (in module turtle): Turtle motion. (line 40) +* RTLD_DEEPBIND (in module os): Miscellaneous System Information. + (line 143) +* RTLD_GLOBAL (in module os): Miscellaneous System Information. + (line 143) +* RTLD_LAZY (in module os): Miscellaneous System Information. + (line 143) +* RTLD_LOCAL (in module os): Miscellaneous System Information. + (line 143) +* RTLD_NODELETE (in module os): Miscellaneous System Information. + (line 143) +* RTLD_NOLOAD (in module os): Miscellaneous System Information. + (line 143) +* RTLD_NOW (in module os): Miscellaneous System Information. + (line 143) +* ruler (cmd.Cmd attribute): Cmd Objects. (line 170) +* run (pdb command): Debugger Commands. (line 327) +* Run script: Format menu Editor window only. + (line 53) +* run() (asyncio.Runner method): Runner context manager. + (line 36) +* run() (bdb.Bdb method): bdb — Debugger framework. + (line 423) +* run() (contextvars.Context method): Manual Context Management. + (line 31) +* run() (distutils.cmd.Command method): Creating a new Distutils command. + (line 40) +* run() (doctest.DocTestRunner method): DocTestRunner objects. + (line 95) +* run() (in module asyncio): Running an asyncio Program. + (line 6) +* run() (in module pdb): pdb — The Python Debugger. + (line 93) +* run() (in module profile): profile and cProfile Module Reference. + (line 9) +* run() (in module subprocess): Using the subprocess Module. + (line 11) +* run() (multiprocessing.Process method): Process and exceptions. + (line 35) +* run() (pdb.Pdb method): pdb — The Python Debugger. + (line 180) +* run() (profile.Profile method): profile and cProfile Module Reference. + (line 100) +* run() (sched.scheduler method): Scheduler Objects. (line 51) +* run() (test.support.BasicTestRunner method): test support — Utilities for the Python test suite. + (line 759) +* run() (threading.Thread method): Thread Objects. (line 104) +* run() (trace.Trace method): Programmatic Interface. + (line 22) +* run() (unittest.IsolatedAsyncioTestCase method): Test cases. + (line 896) +* run() (unittest.TestCase method): Test cases. (line 83) +* run() (unittest.TestSuite method): Grouping tests. (line 41) +* run() (unittest.TextTestRunner method): Loading and running tests. + (line 486) +* run() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 98) +* runcall() (bdb.Bdb method): bdb — Debugger framework. + (line 440) +* runcall() (in module pdb): pdb — The Python Debugger. + (line 112) +* runcall() (pdb.Pdb method): pdb — The Python Debugger. + (line 180) +* runcall() (profile.Profile method): profile and cProfile Module Reference. + (line 109) +* runcode() (code.InteractiveInterpreter method): Interactive Interpreter Objects. + (line 33) +* runctx() (bdb.Bdb method): bdb — Debugger framework. + (line 435) +* runctx() (in module profile): profile and cProfile Module Reference. + (line 23) +* runctx() (profile.Profile method): profile and cProfile Module Reference. + (line 104) +* runctx() (trace.Trace method): Programmatic Interface. + (line 28) +* runeval() (bdb.Bdb method): bdb — Debugger framework. + (line 429) +* runeval() (in module pdb): pdb — The Python Debugger. + (line 105) +* runeval() (pdb.Pdb method): pdb — The Python Debugger. + (line 180) +* runfunc() (trace.Trace method): Programmatic Interface. + (line 35) +* Runner (class in asyncio): Runner context manager. + (line 6) +* running() (concurrent.futures.Future method): Future Objects. + (line 28) +* runsource() (code.InteractiveInterpreter method): Interactive Interpreter Objects. + (line 6) +* RuntimeError: Concrete exceptions. + (line 226) +* RuntimeWarning: Warnings. (line 47) +* runtime_checkable() (in module typing): Building generic types. + (line 393) +* runtime_library_dir_option() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 230) +* run_coroutine_threadsafe() (in module asyncio): Scheduling From Other Threads. + (line 6) +* run_docstring_examples() (in module doctest): Basic API. (line 128) +* run_doctest() (in module test.support): test support — Utilities for the Python test suite. + (line 252) +* run_forever() (asyncio.loop method): Running and stopping the loop. + (line 16) +* run_in_executor() (asyncio.loop method): Executing code in thread or process pools. + (line 6) +* run_in_subinterp() (in module test.support): test support — Utilities for the Python test suite. + (line 626) +* run_module() (in module runpy): runpy — Locating and executing Python modules. + (line 27) +* run_path() (in module runpy): runpy — Locating and executing Python modules. + (line 95) +* run_python_until_end() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 30) +* run_script() (modulefinder.ModuleFinder method): modulefinder — Find modules used by a script. + (line 44) +* run_setup() (in module distutils.core): distutils core — Core Distutils functionality. + (line 121) +* run_unittest() (in module test.support): test support — Utilities for the Python test suite. + (line 236) +* run_until_complete() (asyncio.loop method): Running and stopping the loop. + (line 6) +* run_with_locale() (in module test.support): test support — Utilities for the Python test suite. + (line 439) +* run_with_tz() (in module test.support): test support — Utilities for the Python test suite. + (line 447) +* RUSAGE_BOTH (in module resource): Resource Usage. (line 122) +* RUSAGE_CHILDREN (in module resource): Resource Usage. (line 116) +* RUSAGE_SELF (in module resource): Resource Usage. (line 110) +* RUSAGE_THREAD (in module resource): Resource Usage. (line 128) +* RWF_APPEND (in module os): File Descriptor Operations. + (line 593) +* RWF_DSYNC (in module os): File Descriptor Operations. + (line 573) +* RWF_HIPRI (in module os): File Descriptor Operations. + (line 519) +* RWF_NOWAIT (in module os): File Descriptor Operations. + (line 504) +* RWF_SYNC (in module os): File Descriptor Operations. + (line 583) +* R_OK (in module os): Files and Directories. + (line 106) +* S (in module re): Flags. (line 97) +* safe (uuid.SafeUUID attribute): uuid — UUID objects according to RFC 4122. + (line 33) +* SafeChildWatcher (class in asyncio): Process Watchers. (line 118) +* saferepr() (in module pprint): pprint — Data pretty printer. + (line 166) +* SafeUUID (class in uuid): uuid — UUID objects according to RFC 4122. + (line 29) +* safe_substitute() (string.Template method): Template strings. + (line 50) +* samefile() (in module os.path): os path — Common pathname manipulations. + (line 341) +* samefile() (pathlib.Path method): Methods<2>. (line 425) +* SameFileError: Directory and files operations. + (line 52) +* sameopenfile() (in module os.path): os path — Common pathname manipulations. + (line 357) +* samestat() (in module os.path): os path — Common pathname manipulations. + (line 368) +* same_files (filecmp.dircmp attribute): The dircmp class. (line 85) +* same_quantum() (decimal.Context method): Context objects. (line 503) +* same_quantum() (decimal.Decimal method): Decimal objects. (line 527) +* sample() (in module random): Functions for sequences. + (line 71) +* samples() (statistics.NormalDist method): NormalDist objects. + (line 58) +* SATURDAY (in module calendar): calendar — General calendar-related functions. + (line 387) +* save() (http.cookiejar.FileCookieJar method): CookieJar and FileCookieJar Objects. + (line 106) +* save() (test.support.SaveSignals method): test support — Utilities for the Python test suite. + (line 736) +* SaveAs (class in tkinter.filedialog): Native Load/Save Dialogs. + (line 60) +* SAVEDCWD (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 15) +* SaveFileDialog (class in tkinter.filedialog): Native Load/Save Dialogs. + (line 145) +* SaveKey() (in module winreg): Functions<12>. (line 395) +* SaveSignals (class in test.support): test support — Utilities for the Python test suite. + (line 731) +* savetty() (in module curses): Functions<5>. (line 441) +* SAX2DOM (class in xml.dom.pulldom): xml dom pulldom — Support for building partial DOM trees. + (line 82) +* SAXException: xml sax — Support for SAX2 parsers. + (line 86) +* SAXNotRecognizedException: xml sax — Support for SAX2 parsers. + (line 111) +* SAXNotSupportedException: xml sax — Support for SAX2 parsers. + (line 118) +* SAXParseException: xml sax — Support for SAX2 parsers. + (line 103) +* scaleb() (decimal.Context method): Context objects. (line 507) +* scaleb() (decimal.Decimal method): Decimal objects. (line 537) +* scandir() (in module os): Files and Directories. + (line 755) +* scanf(): Simulating scanf. (line 6) +* scheduler (class in sched): sched — Event scheduler. + (line 13) +* SCHED_BATCH (in module os): Interface to the scheduler. + (line 19) +* SCHED_FIFO (in module os): Interface to the scheduler. + (line 32) +* sched_getaffinity() (in module os): Interface to the scheduler. + (line 109) +* sched_getparam() (in module os): Interface to the scheduler. + (line 87) +* sched_getscheduler() (in module os): Interface to the scheduler. + (line 75) +* sched_get_priority_max() (in module os): Interface to the scheduler. + (line 63) +* sched_get_priority_min() (in module os): Interface to the scheduler. + (line 58) +* SCHED_IDLE (in module os): Interface to the scheduler. + (line 24) +* SCHED_OTHER (in module os): Interface to the scheduler. + (line 15) +* sched_param (class in os): Interface to the scheduler. + (line 46) +* sched_priority (os.sched_param attribute): Interface to the scheduler. + (line 54) +* SCHED_RESET_ON_FORK (in module os): Interface to the scheduler. + (line 40) +* SCHED_RR (in module os): Interface to the scheduler. + (line 36) +* sched_rr_get_interval() (in module os): Interface to the scheduler. + (line 93) +* sched_setaffinity() (in module os): Interface to the scheduler. + (line 102) +* sched_setparam() (in module os): Interface to the scheduler. + (line 81) +* sched_setscheduler() (in module os): Interface to the scheduler. + (line 68) +* SCHED_SPORADIC (in module os): Interface to the scheduler. + (line 28) +* sched_yield() (in module os): Interface to the scheduler. + (line 98) +* schema (in module msilib): Precomputed tables. (line 10) +* SCM_CREDS2 (in module socket): Constants<8>. (line 271) +* scope: Naming and binding. (line 6) +* scope <1>: Resolution of names. + (line 6) +* scope_id (ipaddress.IPv6Address attribute): Address objects. + (line 247) +* Screen (class in turtle): Public classes. (line 30) +* screensize() (in module turtle): Window control. (line 63) +* script_from_examples() (in module doctest): Debugging. (line 72) +* scroll() (curses.window method): Window Objects. (line 500) +* ScrolledCanvas (class in turtle): Public classes. (line 34) +* ScrolledText (class in tkinter.scrolledtext): tkinter scrolledtext — Scrolled Text Widget. + (line 24) +* scrollok() (curses.window method): Window Objects. (line 504) +* scrypt() (in module hashlib): Key derivation. (line 52) +* seal() (in module unittest.mock): Sealing mocks. (line 6) +* search() (imaplib.IMAP4 method): IMAP4 Objects. (line 222) +* search() (in module re): Functions<2>. (line 36) +* search() (re.Pattern method): Regular Expression Objects. + (line 9) +* second (datetime.datetime attribute): datetime Objects. (line 293) +* second (datetime.time attribute): time Objects. (line 58) +* seconds since the epoch: time — Time access and conversions. + (line 24) +* SECTCRE (configparser.ConfigParser attribute): Customizing Parser Behaviour. + (line 300) +* sections() (configparser.ConfigParser method): ConfigParser Objects. + (line 81) +* secure (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 45) +* secure hash algorithm, SHA1, SHA224, SHA256, SHA384, SHA512: hashlib — Secure hashes and message digests. + (line 8) +* Secure Sockets Layer: ssl — TLS/SSL wrapper for socket objects. + (line 8) +* security considerations: Exceptions<18>. (line 25) +* security_level (ssl.SSLContext attribute): SSL Contexts. (line 613) +* see() (tkinter.ttk.Treeview method): ttk Treeview. (line 251) +* seed() (in module random): Bookkeeping functions. + (line 6) +* seek() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 95) +* seek() (io.IOBase method): I/O Base Classes. (line 106) +* seek() (io.TextIOBase method): Text I/O<2>. (line 65) +* seek() (mmap.mmap method): mmap — Memory-mapped file support. + (line 280) +* seek() (sqlite3.Blob method): Blob objects. (line 62) +* seekable() (io.IOBase method): I/O Base Classes. (line 131) +* SEEK_CUR (in module os): File Descriptor Operations. + (line 276) +* SEEK_END (in module os): File Descriptor Operations. + (line 276) +* SEEK_SET (in module os): File Descriptor Operations. + (line 276) +* seen_greeting (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 69) +* Select (class in tkinter.tix): Basic Widgets. (line 59) +* select() (imaplib.IMAP4 method): IMAP4 Objects. (line 239) +* select() (in module select): select — Waiting for I/O completion. + (line 115) +* select() (selectors.BaseSelector method): Classes<3>. (line 108) +* select() (tkinter.ttk.Notebook method): ttk Notebook. (line 53) +* selected_alpn_protocol() (ssl.SSLSocket method): SSL Sockets. + (line 258) +* selected_npn_protocol() (ssl.SSLSocket method): SSL Sockets. + (line 268) +* selection() (tkinter.ttk.Treeview method): ttk Treeview. (line 259) +* selection_add() (tkinter.ttk.Treeview method): ttk Treeview. + (line 274) +* selection_remove() (tkinter.ttk.Treeview method): ttk Treeview. + (line 281) +* selection_set() (tkinter.ttk.Treeview method): ttk Treeview. + (line 267) +* selection_toggle() (tkinter.ttk.Treeview method): ttk Treeview. + (line 288) +* selector (urllib.request.Request attribute): Request Objects. + (line 34) +* SelectorEventLoop (class in asyncio): Event Loop Implementations. + (line 12) +* SelectorKey (class in selectors): Classes<3>. (line 29) +* SelectSelector (class in selectors): Classes<3>. (line 167) +* Self (in module typing): Special types. (line 96) +* Semaphore (class in asyncio): Semaphore. (line 6) +* Semaphore (class in multiprocessing): Synchronization primitives. + (line 167) +* Semaphore (class in threading): Semaphore Objects. (line 19) +* Semaphore() (multiprocessing.managers.SyncManager method): Managers. + (line 208) +* semaphores, binary: _thread — Low-level threading API. + (line 6) +* SEMI (in module token): token — Constants used with Python parse trees. + (line 78) +* SEND (opcode): Python Bytecode Instructions. + (line 964) +* send() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 207) +* send() (coroutine method): Coroutine Objects. (line 23) +* send() (generator method): Generator-iterator methods. + (line 27) +* send() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 173) +* send() (imaplib.IMAP4 method): IMAP4 Objects. (line 246) +* send() (logging.handlers.DatagramHandler method): DatagramHandler. + (line 43) +* send() (logging.handlers.SocketHandler method): SocketHandler. + (line 63) +* send() (multiprocessing.connection.Connection method): Connection Objects. + (line 15) +* send() (socket.socket method): Socket Objects. (line 392) +* sendall() (socket.socket method): Socket Objects. (line 408) +* sendcmd() (ftplib.FTP method): FTP Objects. (line 66) +* sendfile() (asyncio.loop method): Transferring files. (line 6) +* sendfile() (in module os): File Descriptor Operations. + (line 628) +* sendfile() (socket.socket method): Socket Objects. (line 499) +* sendfile() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 278) +* SendfileNotAvailableError: Exceptions<10>. (line 36) +* sendfunc (C type): Slot Type typedefs. (line 113) +* sendmail() (smtplib.SMTP method): SMTP Objects. (line 229) +* sendmsg() (socket.socket method): Socket Objects. (line 446) +* sendmsg_afalg() (socket.socket method): Socket Objects. (line 488) +* sendto() (asyncio.DatagramTransport method): Datagram Transports. + (line 6) +* sendto() (socket.socket method): Socket Objects. (line 427) +* send_bytes() (multiprocessing.connection.Connection method): Connection Objects. + (line 54) +* send_error() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 216) +* send_fds() (in module socket): Other functions<2>. (line 432) +* send_header() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 252) +* send_message() (smtplib.SMTP method): SMTP Objects. (line 307) +* send_response() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 236) +* send_response_only() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 265) +* send_signal() (asyncio.subprocess.Process method): Interacting with Subprocesses. + (line 81) +* send_signal() (asyncio.SubprocessTransport method): Subprocess Transports. + (line 44) +* send_signal() (subprocess.Popen method): Popen Objects. (line 74) +* sentinel (in module unittest.mock): sentinel. (line 6) +* sentinel (multiprocessing.Process attribute): Process and exceptions. + (line 156) +* sep (in module os): Miscellaneous System Information. + (line 95) +* sequence: Glossary. (line 1221) +* Sequence (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 60) +* Sequence (class in typing): Corresponding to collections in collections abc. + (line 105) +* sequence (in module msilib): Precomputed tables. (line 16) +* sequence; item: Subscriptions. (line 6) +* sequence; iteration: Iterator Types. (line 6) +* SequenceMatcher (class in difflib): SequenceMatcher Objects. + (line 8) +* serialize() (sqlite3.Connection method): Connection objects. + (line 583) +* serializing; objects: pickle — Python object serialization. + (line 8) +* Server (class in asyncio): Server Objects. (line 12) +* server (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 76) +* ServerProxy (class in xmlrpc.client): xmlrpc client — XML-RPC client access. + (line 29) +* server_activate() (socketserver.BaseServer method): Server Objects<2>. + (line 164) +* server_address (socketserver.BaseServer attribute): Server Objects<2>. + (line 76) +* server_bind() (socketserver.BaseServer method): Server Objects<2>. + (line 170) +* server_close() (socketserver.BaseServer method): Server Objects<2>. + (line 61) +* server_hostname (ssl.SSLSocket attribute): SSL Sockets. (line 342) +* server_side (ssl.SSLSocket attribute): SSL Sockets. (line 335) +* server_software (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 178) +* server_version (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 135) +* server_version (http.server.SimpleHTTPRequestHandler attribute): http server — HTTP servers. + (line 360) +* serve_forever() (asyncio.Server method): Server Objects. (line 63) +* serve_forever() (socketserver.BaseServer method): Server Objects<2>. + (line 32) +* service_actions() (socketserver.BaseServer method): Server Objects<2>. + (line 45) +* session (ssl.SSLSocket attribute): SSL Sockets. (line 355) +* session_reused (ssl.SSLSocket attribute): SSL Sockets. (line 365) +* session_stats() (ssl.SSLContext method): SSL Contexts. (line 468) +* set (built-in class): Set Types — set frozenset. + (line 33) +* Set (class in ast): Literals<3>. (line 92) +* Set (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 78) +* Set (class in typing): Corresponding to built-in types. + (line 40) +* Set Breakpoint: Help menu Shell and Editor. + (line 30) +* set comprehension: Glossary. (line 1239) +* set() (asyncio.Event method): Event. (line 51) +* set() (configparser.ConfigParser method): ConfigParser Objects. + (line 250) +* set() (configparser.RawConfigParser method): RawConfigParser Objects. + (line 37) +* set() (contextvars.ContextVar method): Context Variables. (line 46) +* set() (http.cookies.Morsel method): Morsel Objects. (line 64) +* set() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 72) +* set() (test.support.os_helper.EnvironmentVarGuard method): test support os_helper — Utilities for os tests. + (line 66) +* set() (threading.Event method): Event Objects. (line 29) +* set() (tkinter.ttk.Combobox method): ttk Combobox. (line 19) +* set() (tkinter.ttk.Spinbox method): ttk Spinbox. (line 12) +* set() (tkinter.ttk.Treeview method): ttk Treeview. (line 295) +* set() (xml.etree.ElementTree.Element method): Element Objects. + (line 81) +* set; comprehensions: Set displays. (line 6) +* set; display: Set displays. (line 6) +* setacl() (imaplib.IMAP4 method): IMAP4 Objects. (line 253) +* setannotation() (imaplib.IMAP4 method): IMAP4 Objects. (line 258) +* setattrfunc (C type): Slot Type typedefs. (line 48) +* setAttribute() (xml.dom.Element method): Element Objects<2>. + (line 67) +* setAttributeNode() (xml.dom.Element method): Element Objects<2>. + (line 71) +* setAttributeNodeNS() (xml.dom.Element method): Element Objects<2>. + (line 79) +* setAttributeNS() (xml.dom.Element method): Element Objects<2>. + (line 87) +* setattrofunc (C type): Slot Type typedefs. (line 61) +* SetBase() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 22) +* setblocking() (socket.socket method): Socket Objects. (line 523) +* setByteStream() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 36) +* setcbreak() (in module tty): tty — Terminal control functions. + (line 24) +* setCharacterStream() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 55) +* SetComp (class in ast): Comprehensions. (line 6) +* setcomptype() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 161) +* setcomptype() (sunau.AU_write method): AU_write Objects. (line 28) +* setcomptype() (wave.Wave_write method): Wave_write Objects. + (line 51) +* setContentHandler() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 25) +* setcontext() (in module decimal): Context objects. (line 18) +* setDaemon() (threading.Thread method): Thread Objects. (line 214) +* setdefault() (dict method): Mapping Types — dict. + (line 200) +* setdefault() (http.cookies.Morsel method): Morsel Objects. (line 108) +* setdefaulttimeout() (in module socket): Other functions<2>. + (line 352) +* setdlopenflags() (in module sys): sys — System-specific parameters and functions. + (line 1341) +* setDocumentLocator() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 10) +* setDTDHandler() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 34) +* setegid() (in module os): Process Parameters. (line 357) +* setEncoding() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 22) +* setEntityResolver() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 43) +* setErrorHandler() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 54) +* seteuid() (in module os): Process Parameters. (line 363) +* setFeature() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 76) +* setfirstweekday() (in module calendar): calendar — General calendar-related functions. + (line 283) +* setfmt() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 125) +* setFormatter() (logging.Handler method): Handler Objects. (line 48) +* setframerate() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 151) +* setframerate() (sunau.AU_write method): AU_write Objects. (line 19) +* setframerate() (wave.Wave_write method): Wave_write Objects. + (line 38) +* setgid() (in module os): Process Parameters. (line 369) +* setgroups() (in module os): Process Parameters. (line 375) +* seth() (in module turtle): Turtle motion. (line 132) +* setheading() (in module turtle): Turtle motion. (line 132) +* sethostname() (in module socket): Other functions<2>. (line 359) +* setinputsizes() (sqlite3.Cursor method): Cursor objects. (line 119) +* SetInteger() (msilib.Record method): Record Objects. (line 32) +* setitem() (in module operator): operator — Standard operators as functions. + (line 205) +* setitimer() (in module signal): Module contents<2>. (line 402) +* setLevel() (logging.Handler method): Handler Objects. (line 35) +* setLevel() (logging.Logger method): Logger Objects. (line 62) +* setlimit() (sqlite3.Connection method): Connection objects. + (line 550) +* setlocale() (in module locale): locale — Internationalization services. + (line 27) +* setLocale() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 60) +* setLoggerClass() (in module logging): Module-Level Functions. + (line 365) +* setlogmask() (in module syslog): syslog — Unix syslog library routines. + (line 82) +* setLogRecordFactory() (in module logging): Module-Level Functions. + (line 376) +* setmark() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 179) +* setMaxConns() (urllib.request.CacheFTPHandler method): CacheFTPHandler Objects. + (line 13) +* setmode() (in module msvcrt): File Operations. (line 38) +* setName() (threading.Thread method): Thread Objects. (line 158) +* setnchannels() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 143) +* setnchannels() (sunau.AU_write method): AU_write Objects. (line 9) +* setnchannels() (wave.Wave_write method): Wave_write Objects. + (line 30) +* setnframes() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 155) +* setnframes() (sunau.AU_write method): AU_write Objects. (line 23) +* setnframes() (wave.Wave_write method): Wave_write Objects. (line 45) +* setoutputsize() (sqlite3.Cursor method): Cursor objects. (line 123) +* SetParamEntityParsing() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 54) +* setparameters() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 189) +* setparams() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 171) +* setparams() (sunau.AU_write method): AU_write Objects. (line 33) +* setparams() (wave.Wave_write method): Wave_write Objects. (line 56) +* setpassword() (zipfile.ZipFile method): ZipFile Objects. (line 231) +* setpgid() (in module os): Process Parameters. (line 398) +* setpgrp() (in module os): Process Parameters. (line 390) +* setpos() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 111) +* setpos() (in module turtle): Turtle motion. (line 74) +* setpos() (sunau.AU_read method): AU_read Objects. (line 60) +* setpos() (wave.Wave_read method): Wave_read Objects. (line 69) +* setposition() (in module turtle): Turtle motion. (line 74) +* setpriority() (in module os): Process Parameters. (line 406) +* setprofile() (in module sys): sys — System-specific parameters and functions. + (line 1362) +* setprofile() (in module threading): threading — Thread-based parallelism. + (line 170) +* SetProperty() (msilib.SummaryInformation method): Summary Information Objects. + (line 22) +* setProperty() (xml.sax.xmlreader.XMLReader method): XMLReader Objects. + (line 90) +* setPublicId() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 6) +* setquota() (imaplib.IMAP4 method): IMAP4 Objects. (line 263) +* setraw() (in module tty): tty — Terminal control functions. + (line 18) +* setrecursionlimit() (in module sys): sys — System-specific parameters and functions. + (line 1414) +* setregid() (in module os): Process Parameters. (line 423) +* setresgid() (in module os): Process Parameters. (line 429) +* setresuid() (in module os): Process Parameters. (line 437) +* setreuid() (in module os): Process Parameters. (line 445) +* setrlimit() (in module resource): Resource Limits. (line 31) +* setsampwidth() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 147) +* setsampwidth() (sunau.AU_write method): AU_write Objects. (line 13) +* setsampwidth() (wave.Wave_write method): Wave_write Objects. + (line 34) +* setscrreg() (curses.window method): Window Objects. (line 514) +* setsid() (in module os): Process Parameters. (line 458) +* setsockopt() (socket.socket method): Socket Objects. (line 556) +* setstate() (codecs.IncrementalDecoder method): IncrementalDecoder Objects. + (line 60) +* setstate() (codecs.IncrementalEncoder method): IncrementalEncoder Objects. + (line 51) +* setstate() (in module random): Bookkeeping functions. + (line 38) +* setStream() (logging.StreamHandler method): StreamHandler. (line 32) +* SetStream() (msilib.Record method): Record Objects. (line 26) +* SetString() (msilib.Record method): Record Objects. (line 21) +* setswitchinterval() (in module sys): sys — System-specific parameters and functions. + (line 1432) +* setswitchinterval() (in module sys) <1>: Thread State and the Global Interpreter Lock. + (line 15) +* setswitchinterval() (in module test.support): test support — Utilities for the Python test suite. + (line 263) +* setSystemId() (xml.sax.xmlreader.InputSource method): InputSource Objects. + (line 14) +* setsyx() (in module curses): Functions<5>. (line 475) +* setTarget() (logging.handlers.MemoryHandler method): MemoryHandler. + (line 67) +* settiltangle() (in module turtle): Appearance. (line 118) +* settimeout() (socket.socket method): Socket Objects. (line 540) +* setTimeout() (urllib.request.CacheFTPHandler method): CacheFTPHandler Objects. + (line 9) +* settrace() (in module sys): sys — System-specific parameters and functions. + (line 1445) +* settrace() (in module threading): threading — Thread-based parallelism. + (line 157) +* setuid() (in module os): Process Parameters. (line 465) +* setundobuffer() (in module turtle): Special Turtle methods. + (line 61) +* setup() (in module distutils.core): distutils core — Core Distutils functionality. + (line 12) +* setup() (in module turtle): Methods specific to Screen not inherited from TurtleScreen. + (line 20) +* setup() (socketserver.BaseRequestHandler method): Request Handler Objects. + (line 14) +* setUp() (unittest.TestCase method): Test cases. (line 33) +* setUpClass() (unittest.TestCase method): Test cases. (line 55) +* setupterm() (in module curses): Functions<5>. (line 480) +* SETUP_ANNOTATIONS (opcode): Python Bytecode Instructions. + (line 279) +* setup_environ() (wsgiref.handlers.BaseHandler method): wsgiref handlers – server/gateway base classes. + (line 198) +* setup_python() (venv.EnvBuilder method): API<2>. (line 104) +* setup_scripts() (venv.EnvBuilder method): API<2>. (line 112) +* setup_testing_defaults() (in module wsgiref.util): wsgiref util – WSGI environment utilities. + (line 70) +* SetValue() (in module winreg): Functions<12>. (line 419) +* SetValueEx() (in module winreg): Functions<12>. (line 450) +* setworldcoordinates() (in module turtle): Window control. (line 90) +* setx() (in module turtle): Turtle motion. (line 104) +* setxattr() (in module os): Linux extended attributes. + (line 57) +* sety() (in module turtle): Turtle motion. (line 118) +* SET_ADD (opcode): Python Bytecode Instructions. + (line 246) +* set_all(): Reference Count Details. + (line 98) +* set_allowed_domains() (http.cookiejar.DefaultCookiePolicy method): DefaultCookiePolicy Objects. + (line 70) +* set_alpn_protocols() (ssl.SSLContext method): SSL Contexts. + (line 243) +* set_app() (wsgiref.simple_server.WSGIServer method): wsgiref simple_server – a simple WSGI HTTP server. + (line 61) +* set_asyncgen_hooks() (in module sys): sys — System-specific parameters and functions. + (line 1541) +* set_authorizer() (sqlite3.Connection method): Connection objects. + (line 325) +* set_auto_history() (in module readline): History list. (line 43) +* set_blocked_domains() (http.cookiejar.DefaultCookiePolicy method): DefaultCookiePolicy Objects. + (line 56) +* set_blocking() (in module os): File Descriptor Operations. + (line 668) +* set_boundary() (email.message.EmailMessage method): email message Representing an email message. + (line 411) +* set_boundary() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 587) +* set_break() (bdb.Bdb method): bdb — Debugger framework. + (line 336) +* set_charset() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 235) +* set_children() (tkinter.ttk.Treeview method): ttk Treeview. + (line 25) +* set_child_watcher() (asyncio.AbstractEventLoopPolicy method): Policy Objects. + (line 42) +* set_child_watcher() (in module asyncio): Process Watchers. (line 29) +* set_ciphers() (ssl.SSLContext method): SSL Contexts. (line 229) +* set_completer() (in module readline): Completion. (line 14) +* set_completer_delims() (in module readline): Completion. (line 50) +* set_completion_display_matches_hook() (in module readline): Completion. + (line 59) +* set_content() (email.contentmanager.ContentManager method): email contentmanager Managing MIME Content. + (line 40) +* set_content() (email.message.EmailMessage method): email message Representing an email message. + (line 590) +* set_content() (in module email.contentmanager): Content Manager Instances. + (line 35) +* set_continue() (bdb.Bdb method): bdb — Debugger framework. + (line 321) +* set_cookie() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 73) +* set_cookie_if_ok() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 69) +* set_coroutine_origin_tracking_depth() (in module sys): sys — System-specific parameters and functions. + (line 1566) +* set_current() (msilib.Feature method): Features<3>. (line 14) +* set_data() (importlib.abc.SourceLoader method): importlib abc – Abstract base classes related to import. + (line 506) +* set_data() (importlib.machinery.SourceFileLoader method): importlib machinery – Importers and path hooks. + (line 245) +* set_date() (mailbox.MaildirMessage method): MaildirMessage. + (line 97) +* set_debug() (asyncio.loop method): Enabling debug mode. + (line 14) +* set_debug() (in module gc): gc — Garbage Collector interface. + (line 48) +* set_debuglevel() (ftplib.FTP method): FTP Objects. (line 13) +* set_debuglevel() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 71) +* set_debuglevel() (nntplib.NNTP method): Methods<3>. (line 307) +* set_debuglevel() (poplib.POP3 method): POP3 Objects. (line 11) +* set_debuglevel() (smtplib.SMTP method): SMTP Objects. (line 8) +* set_debuglevel() (telnetlib.Telnet method): Telnet Objects. + (line 83) +* set_defaults() (argparse.ArgumentParser method): Parser defaults. + (line 6) +* set_defaults() (optparse.OptionParser method): Other methods. + (line 27) +* set_default_executor() (asyncio.loop method): Executing code in thread or process pools. + (line 71) +* set_default_type() (email.message.EmailMessage method): email message Representing an email message. + (line 342) +* set_default_type() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 450) +* set_default_verify_paths() (ssl.SSLContext method): SSL Contexts. + (line 220) +* set_ecdh_curve() (ssl.SSLContext method): SSL Contexts. (line 356) +* set_errno() (in module ctypes): Utility functions. (line 171) +* set_escdelay() (in module curses): Functions<5>. (line 452) +* set_event_loop() (asyncio.AbstractEventLoopPolicy method): Policy Objects. + (line 23) +* set_event_loop() (in module asyncio): Event Loop. (line 61) +* set_event_loop_policy() (in module asyncio): Getting and Setting the Policy. + (line 13) +* set_exception() (asyncio.Future method): Future Object. (line 56) +* set_exception() (concurrent.futures.Future method): Future Objects. + (line 123) +* set_exception_handler() (asyncio.loop method): Error Handling API. + (line 8) +* set_executable() (in module multiprocessing): Miscellaneous<3>. + (line 112) +* set_executables() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 235) +* set_filter() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 127) +* set_flags() (mailbox.MaildirMessage method): MaildirMessage. + (line 72) +* set_flags() (mailbox.mboxMessage method): mboxMessage. (line 72) +* set_flags() (mailbox.MMDFMessage method): MMDFMessage. (line 71) +* set_from() (mailbox.mboxMessage method): mboxMessage. (line 53) +* set_from() (mailbox.MMDFMessage method): MMDFMessage. (line 52) +* set_handle_inheritable() (in module os): Inheritance of File Descriptors. + (line 41) +* set_history_length() (in module readline): History file. (line 30) +* set_include_dirs() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 103) +* set_info() (mailbox.MaildirMessage method): MaildirMessage. + (line 108) +* set_inheritable() (in module os): Inheritance of File Descriptors. + (line 31) +* set_inheritable() (socket.socket method): Socket Objects. (line 516) +* set_int_max_str_digits() (in module sys): sys — System-specific parameters and functions. + (line 1354) +* set_labels() (mailbox.BabylMessage method): BabylMessage. (line 51) +* set_last_error() (in module ctypes): Utility functions. (line 180) +* set_libraries() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 128) +* set_library_dirs() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 144) +* set_link_objects() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 187) +* set_literal (2to3 fixer): Fixers. (line 289) +* set_loader() (in module importlib.util): importlib util – Utility code for importers. + (line 172) +* set_match_tests() (in module test.support): test support — Utilities for the Python test suite. + (line 230) +* set_memlimit() (in module test.support): test support — Utilities for the Python test suite. + (line 280) +* set_name() (asyncio.Task method): Task Object. (line 159) +* set_next() (bdb.Bdb method): bdb — Debugger framework. + (line 303) +* set_nonstandard_attr() (http.cookiejar.Cookie method): Cookie Objects<2>. + (line 103) +* set_npn_protocols() (ssl.SSLContext method): SSL Contexts. (line 258) +* set_ok() (http.cookiejar.CookiePolicy method): CookiePolicy Objects. + (line 9) +* set_option_negotiation_callback() (telnetlib.Telnet method): Telnet Objects. + (line 142) +* set_package() (in module importlib.util): importlib util – Utility code for importers. + (line 187) +* set_param() (email.message.EmailMessage method): email message Representing an email message. + (line 351) +* set_param() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 518) +* set_pasv() (ftplib.FTP method): FTP Objects. (line 108) +* set_payload() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 225) +* set_policy() (http.cookiejar.CookieJar method): CookieJar and FileCookieJar Objects. + (line 57) +* set_position() (xdrlib.Unpacker method): Unpacker Objects. (line 16) +* set_pre_input_hook() (in module readline): Startup hooks. (line 14) +* set_progress_handler() (sqlite3.Connection method): Connection objects. + (line 354) +* set_protocol() (asyncio.BaseTransport method): Base Transport. + (line 80) +* set_proxy() (urllib.request.Request method): Request Objects. + (line 115) +* set_python_build() (in module distutils.sysconfig): distutils sysconfig — System configuration information. + (line 105) +* set_quit() (bdb.Bdb method): bdb — Debugger framework. + (line 326) +* set_recsrc() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 89) +* set_result() (asyncio.Future method): Future Object. (line 49) +* set_result() (concurrent.futures.Future method): Future Objects. + (line 111) +* set_return() (bdb.Bdb method): bdb — Debugger framework. + (line 307) +* set_running_or_notify_cancel() (concurrent.futures.Future method): Future Objects. + (line 89) +* set_runtime_library_dirs() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 155) +* set_selection() (tkinter.filedialog.FileDialog method): Native Load/Save Dialogs. + (line 131) +* set_seq1() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 54) +* set_seq2() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 59) +* set_seqs() (difflib.SequenceMatcher method): SequenceMatcher Objects. + (line 44) +* set_sequences() (mailbox.MH method): MH. (line 58) +* set_sequences() (mailbox.MHMessage method): MHMessage. (line 37) +* set_servername_callback (ssl.SSLContext attribute): SSL Contexts. + (line 327) +* set_server_documentation() (xmlrpc.server.DocCGIXMLRPCRequestHandler method): DocCGIXMLRPCRequestHandler. + (line 24) +* set_server_documentation() (xmlrpc.server.DocXMLRPCServer method): DocXMLRPCServer Objects. + (line 24) +* set_server_name() (xmlrpc.server.DocCGIXMLRPCRequestHandler method): DocCGIXMLRPCRequestHandler. + (line 18) +* set_server_name() (xmlrpc.server.DocXMLRPCServer method): DocXMLRPCServer Objects. + (line 18) +* set_server_title() (xmlrpc.server.DocCGIXMLRPCRequestHandler method): DocCGIXMLRPCRequestHandler. + (line 13) +* set_server_title() (xmlrpc.server.DocXMLRPCServer method): DocXMLRPCServer Objects. + (line 13) +* set_startup_hook() (in module readline): Startup hooks. (line 6) +* set_start_method() (in module multiprocessing): Miscellaneous<3>. + (line 127) +* set_step() (bdb.Bdb method): bdb — Debugger framework. + (line 299) +* set_subdir() (mailbox.MaildirMessage method): MaildirMessage. + (line 58) +* set_tabsize() (in module curses): Functions<5>. (line 467) +* set_task_factory() (asyncio.loop method): Creating Futures and Tasks. + (line 37) +* set_terminator() (asynchat.async_chat method): asynchat — Asynchronous socket command/response handler. + (line 124) +* set_threshold() (in module gc): gc — Garbage Collector interface. + (line 89) +* set_trace() (bdb.Bdb method): bdb — Debugger framework. + (line 316) +* set_trace() (in module bdb): bdb — Debugger framework. + (line 473) +* set_trace() (in module pdb): pdb — The Python Debugger. + (line 119) +* set_trace() (pdb.Pdb method): pdb — The Python Debugger. + (line 180) +* set_trace_callback() (sqlite3.Connection method): Connection objects. + (line 368) +* set_tunnel() (http.client.HTTPConnection method): HTTPConnection Objects. + (line 81) +* set_type() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 551) +* set_unittest_reportflags() (in module doctest): Unittest API. + (line 165) +* set_unixfrom() (email.message.EmailMessage method): email message Representing an email message. + (line 146) +* set_unixfrom() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 157) +* set_until() (bdb.Bdb method): bdb — Debugger framework. + (line 311) +* SET_UPDATE (opcode): Python Bytecode Instructions. + (line 527) +* set_url() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 21) +* set_usage() (optparse.OptionParser method): Other methods. (line 8) +* set_userptr() (curses.panel.Panel method): Panel Objects. (line 43) +* set_visible() (mailbox.BabylMessage method): BabylMessage. (line 68) +* set_wakeup_fd() (in module signal): Module contents<2>. (line 431) +* set_write_buffer_limits() (asyncio.WriteTransport method): Write-only Transports. + (line 33) +* SF_APPEND (in module stat): stat — Interpreting stat results. + (line 374) +* SF_ARCHIVED (in module stat): stat — Interpreting stat results. + (line 366) +* SF_IMMUTABLE (in module stat): stat — Interpreting stat results. + (line 370) +* SF_MNOWAIT (in module os): File Descriptor Operations. + (line 683) +* SF_NOCACHE (in module os): File Descriptor Operations. + (line 694) +* SF_NODISKIO (in module os): File Descriptor Operations. + (line 683) +* SF_NOUNLINK (in module stat): stat — Interpreting stat results. + (line 378) +* SF_SNAPSHOT (in module stat): stat — Interpreting stat results. + (line 382) +* SF_SYNC (in module os): File Descriptor Operations. + (line 683) +* Shape (class in turtle): Public classes. (line 43) +* shape (memoryview attribute): Memory Views. (line 447) +* shape() (in module turtle): Appearance. (line 6) +* shapesize() (in module turtle): Appearance. (line 52) +* shapetransform() (in module turtle): Appearance. (line 157) +* share() (socket.socket method): Socket Objects. (line 590) +* ShareableList (class in multiprocessing.shared_memory): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 243) +* ShareableList() (multiprocessing.managers.SharedMemoryManager method): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 203) +* Shared Memory: multiprocessing shared_memory — Shared memory for direct access across processes. + (line 10) +* SharedMemory (class in multiprocessing.shared_memory): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 33) +* SharedMemory() (multiprocessing.managers.SharedMemoryManager method): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 198) +* SharedMemoryManager (class in multiprocessing.managers): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 171) +* shared_ciphers() (ssl.SSLSocket method): SSL Sockets. (line 221) +* shared_object_filename() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 472) +* shearfactor() (in module turtle): Appearance. (line 84) +* Shelf (class in shelve): Restrictions. (line 23) +* shield() (in module asyncio): Shielding From Cancellation. + (line 6) +* shift() (decimal.Context method): Context objects. (line 512) +* shift() (decimal.Decimal method): Decimal objects. (line 543) +* shifting; operation: Shifting operations. + (line 6) +* shifting; operations: Bitwise Operations on Integer Types. + (line 6) +* shift_path_info() (in module wsgiref.util): wsgiref util – WSGI environment utilities. + (line 40) +* shlex (class in shlex): shlex — Simple lexical analysis. + (line 96) +* shm (multiprocessing.shared_memory.ShareableList attribute): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 278) +* shortDescription() (unittest.TestCase method): Test cases. (line 757) +* shorten() (in module textwrap): textwrap — Text wrapping and filling. + (line 49) +* SHORT_TIMEOUT (in module test.support): test support — Utilities for the Python test suite. + (line 80) +* shouldFlush() (logging.handlers.BufferingHandler method): MemoryHandler. + (line 35) +* shouldFlush() (logging.handlers.MemoryHandler method): MemoryHandler. + (line 71) +* shouldStop (unittest.TestResult attribute): Loading and running tests. + (line 272) +* show() (curses.panel.Panel method): Panel Objects. (line 49) +* show() (tkinter.commondialog.Dialog method): tkinter commondialog — Dialog window templates. + (line 16) +* showerror() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 31) +* showinfo() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 26) +* showsyntaxerror() (code.InteractiveInterpreter method): Interactive Interpreter Objects. + (line 44) +* showtraceback() (code.InteractiveInterpreter method): Interactive Interpreter Objects. + (line 53) +* showturtle() (in module turtle): Visibility. (line 15) +* showwarning() (in module tkinter.messagebox): tkinter messagebox — Tkinter message prompts. + (line 31) +* showwarning() (in module warnings): Available Functions. + (line 56) +* show_code() (in module dis): Analysis functions. (line 26) +* show_compilers() (in module distutils.ccompiler): distutils ccompiler — CCompiler base class. + (line 62) +* shuffle() (in module random): Functions for sequences. + (line 54) +* shutdown() (concurrent.futures.Executor method): Executor Objects. + (line 55) +* shutdown() (imaplib.IMAP4 method): IMAP4 Objects. (line 268) +* shutdown() (in module logging): Module-Level Functions. + (line 354) +* shutdown() (multiprocessing.managers.BaseManager method): Managers. + (line 84) +* shutdown() (socket.socket method): Socket Objects. (line 581) +* shutdown() (socketserver.BaseServer method): Server Objects<2>. + (line 54) +* shutdown_asyncgens() (asyncio.loop method): Running and stopping the loop. + (line 56) +* shutdown_default_executor() (asyncio.loop method): Running and stopping the loop. + (line 77) +* side_effect (unittest.mock.Mock attribute): The Mock Class. + (line 348) +* SIGABRT (in module signal): Module contents<2>. (line 56) +* SIGALRM (in module signal): Module contents<2>. (line 60) +* SIGBREAK (in module signal): Module contents<2>. (line 66) +* SIGBUS (in module signal): Module contents<2>. (line 72) +* SIGCHLD (in module signal): Module contents<2>. (line 78) +* SIGCLD (in module signal): Module contents<2>. (line 84) +* SIGCONT (in module signal): Module contents<2>. (line 88) +* SIGFPE (in module signal): Module contents<2>. (line 94) +* SIGHUP (in module signal): Module contents<2>. (line 104) +* SIGILL (in module signal): Module contents<2>. (line 111) +* SIGINT: Signal Handling<2>. (line 7) +* SIGINT <1>: Signal Handling<2>. (line 34) +* SIGINT (in module signal): Module contents<2>. (line 115) +* siginterrupt() (in module signal): Module contents<2>. (line 474) +* SIGKILL (in module signal): Module contents<2>. (line 121) +* Sigmasks (class in signal): Module contents<2>. (line 31) +* signal() (in module signal): Module contents<2>. (line 488) +* Signals (class in signal): Module contents<2>. (line 17) +* Signature (class in inspect): Introspecting callables with the Signature object. + (line 66) +* signature (inspect.BoundArguments attribute): Introspecting callables with the Signature object. + (line 332) +* signature() (in module inspect): Introspecting callables with the Signature object. + (line 12) +* sigpending() (in module signal): Module contents<2>. (line 516) +* SIGPIPE (in module signal): Module contents<2>. (line 129) +* SIGSEGV (in module signal): Module contents<2>. (line 137) +* SIGSTKFLT (in module signal): Module contents<2>. (line 141) +* SIGTERM (in module signal): Module contents<2>. (line 152) +* sigtimedwait() (in module signal): Module contents<2>. (line 574) +* SIGUSR1 (in module signal): Module contents<2>. (line 156) +* SIGUSR2 (in module signal): Module contents<2>. (line 162) +* sigwait() (in module signal): Module contents<2>. (line 530) +* sigwaitinfo() (in module signal): Module contents<2>. (line 546) +* SIGWINCH (in module signal): Module contents<2>. (line 168) +* SIG_BLOCK (in module signal): Module contents<2>. (line 226) +* SIG_DFL (in module signal): Module contents<2>. (line 43) +* SIG_IGN (in module signal): Module contents<2>. (line 51) +* SIG_SETMASK (in module signal): Module contents<2>. (line 241) +* SIG_UNBLOCK (in module signal): Module contents<2>. (line 233) +* Simple Mail Transfer Protocol: smtplib — SMTP protocol client. + (line 8) +* simple; statement: Simple statements. (line 6) +* SimpleCookie (class in http.cookies): http cookies — HTTP state management. + (line 48) +* simplefilter() (in module warnings): Available Functions. + (line 90) +* SimpleHandler (class in wsgiref.handlers): wsgiref handlers – server/gateway base classes. + (line 70) +* SimpleHTTPRequestHandler (class in http.server): http server — HTTP servers. + (line 341) +* SimpleNamespace (class in types): Additional Utility Classes and Functions. + (line 6) +* SimpleQueue (class in multiprocessing): Pipes and Queues. (line 204) +* SimpleQueue (class in queue): queue — A synchronized queue class. + (line 75) +* SimpleXMLRPCRequestHandler (class in xmlrpc.server): xmlrpc server — Basic XML-RPC servers. + (line 63) +* SimpleXMLRPCServer (class in xmlrpc.server): xmlrpc server — Basic XML-RPC servers. + (line 24) +* sin() (in module cmath): Trigonometric functions<2>. + (line 29) +* sin() (in module math): Trigonometric functions. + (line 65) +* single dispatch: Glossary. (line 1247) +* SingleAddressHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 217) +* singledispatch() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 399) +* singledispatchmethod (class in functools): functools — Higher-order functions and operations on callable objects. + (line 555) +* singleton; tuple: The standard type hierarchy. + (line 177) +* sinh() (in module cmath): Hyperbolic functions<2>. + (line 30) +* sinh() (in module math): Hyperbolic functions. + (line 25) +* SIO_KEEPALIVE_VALS (in module socket): Constants<8>. (line 196) +* SIO_LOOPBACK_FAST_PATH (in module socket): Constants<8>. (line 196) +* SIO_RCVALL (in module socket): Constants<8>. (line 196) +* site command line option; –user-base: Command Line Interface<4>. + (line 18) +* site command line option; –user-site: Command Line Interface<4>. + (line 22) +* site-packages; directory: site — Site-specific configuration hook. + (line 24) +* site_maps() (urllib.robotparser.RobotFileParser method): urllib robotparser — Parser for robots txt. + (line 71) +* sixtofour (ipaddress.IPv6Address attribute): Address objects. + (line 254) +* size (multiprocessing.shared_memory.SharedMemory attribute): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 96) +* size (struct.Struct attribute): Classes<2>. (line 62) +* size (tarfile.TarInfo attribute): TarInfo Objects. (line 47) +* size (tracemalloc.Statistic attribute): Statistic. (line 19) +* size (tracemalloc.StatisticDiff attribute): StatisticDiff. (line 26) +* size (tracemalloc.Trace attribute): Trace. (line 23) +* size() (ftplib.FTP method): FTP Objects. (line 229) +* size() (mmap.mmap method): mmap — Memory-mapped file support. + (line 288) +* Sized (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 14) +* Sized (class in typing): Corresponding to other types in collections abc. + (line 70) +* sizeof() (in module ctypes): Utility functions. (line 189) +* size_diff (tracemalloc.StatisticDiff attribute): StatisticDiff. + (line 32) +* SIZE_MAX: Integer Objects. (line 208) +* SKIP (in module doctest): Option Flags. (line 92) +* skip() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 116) +* skip() (in module unittest): Skipping tests and expected failures. + (line 85) +* skipIf() (in module unittest): Skipping tests and expected failures. + (line 90) +* skipinitialspace (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 69) +* skipped (unittest.TestResult attribute): Loading and running tests. + (line 254) +* skippedEntity() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 176) +* SkipTest: Skipping tests and expected failures. + (line 105) +* skipTest() (unittest.TestCase method): Test cases. (line 97) +* skipUnless() (in module unittest): Skipping tests and expected failures. + (line 94) +* skip_if_broken_multiprocessing_synchronize() (in module test.support): test support — Utilities for the Python test suite. + (line 689) +* skip_unless_bind_unix_socket() (in module test.support.socket_helper): test support socket_helper — Utilities for socket tests. + (line 59) +* skip_unless_symlink() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 126) +* skip_unless_xattr() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 131) +* SLASH (in module token): token — Constants used with Python parse trees. + (line 94) +* SLASHEQUAL (in module token): token — Constants used with Python parse trees. + (line 182) +* slave() (nntplib.NNTP method): Methods<3>. (line 303) +* sleep() (in module asyncio): Sleeping. (line 6) +* sleep() (in module time): Functions<4>. (line 241) +* slice: Slicings. (line 6) +* slice <1>: Glossary. (line 1252) +* slice (built-in class): Built-in Functions. (line 1589) +* Slice (class in ast): Subscripting. (line 27) +* slice; assignment: Mutable Sequence Types. + (line 16) +* slice; operation: Common Sequence Operations. + (line 21) +* slicing: The standard type hierarchy. + (line 138) +* slicing <1>: The standard type hierarchy. + (line 197) +* slicing <2>: Slicings. (line 6) +* slicing; assignment: Assignment statements. + (line 125) +* SMALLEST (in module test.support): test support — Utilities for the Python test suite. + (line 183) +* SMTP (class in smtplib): smtplib — SMTP protocol client. + (line 21) +* SMTP (in module email.policy): email policy Policy Objects. + (line 493) +* SMTP; protocol: smtplib — SMTP protocol client. + (line 8) +* SMTPAuthenticationError: smtplib — SMTP protocol client. + (line 186) +* SMTPChannel (class in smtpd): SMTPChannel Objects. + (line 6) +* SMTPConnectError: smtplib — SMTP protocol client. + (line 171) +* SMTPDataError: smtplib — SMTP protocol client. + (line 167) +* SMTPException: smtplib — SMTP protocol client. + (line 132) +* SMTPHandler (class in logging.handlers): SMTPHandler. (line 10) +* SMTPHeloError: smtplib — SMTP protocol client. + (line 176) +* SMTPNotSupportedError: smtplib — SMTP protocol client. + (line 180) +* SMTPRecipientsRefused: smtplib — SMTP protocol client. + (line 160) +* SMTPResponseException: smtplib — SMTP protocol client. + (line 146) +* SMTPSenderRefused: smtplib — SMTP protocol client. + (line 154) +* SMTPServer (class in smtpd): SMTPServer Objects. (line 6) +* SMTPServerDisconnected: smtplib — SMTP protocol client. + (line 140) +* SMTPUTF8 (in module email.policy): email policy Policy Objects. + (line 499) +* smtp_server (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 44) +* SMTP_SSL (class in smtplib): smtplib — SMTP protocol client. + (line 75) +* smtp_state (smtpd.SMTPChannel attribute): SMTPChannel Objects. + (line 63) +* Snapshot (class in tracemalloc): Snapshot. (line 6) +* SND_ALIAS (in module winsound): winsound — Sound-playing interface for Windows. + (line 47) +* SND_ASYNC (in module winsound): winsound — Sound-playing interface for Windows. + (line 109) +* SND_FILENAME (in module winsound): winsound — Sound-playing interface for Windows. + (line 42) +* SND_LOOP (in module winsound): winsound — Sound-playing interface for Windows. + (line 88) +* SND_MEMORY (in module winsound): winsound — Sound-playing interface for Windows. + (line 94) +* SND_NODEFAULT (in module winsound): winsound — Sound-playing interface for Windows. + (line 113) +* SND_NOSTOP (in module winsound): winsound — Sound-playing interface for Windows. + (line 118) +* SND_NOWAIT (in module winsound): winsound — Sound-playing interface for Windows. + (line 122) +* SND_PURGE (in module winsound): winsound — Sound-playing interface for Windows. + (line 103) +* sniff() (csv.Sniffer method): Module Contents<3>. (line 225) +* Sniffer (class in csv): Module Contents<3>. (line 218) +* sni_callback (ssl.SSLContext attribute): SSL Contexts. (line 276) +* socket (class in socket): Creating sockets. (line 8) +* socket (socketserver.BaseServer attribute): Server Objects<2>. + (line 85) +* socket() (imaplib.IMAP4 method): IMAP4 Objects. (line 274) +* socket() (in module socket): select — Waiting for I/O completion. + (line 143) +* SocketHandler (class in logging.handlers): SocketHandler. (line 10) +* socketpair() (in module socket): Creating sockets. (line 64) +* sockets (asyncio.Server attribute): Server Objects. (line 99) +* SocketType (in module socket): Creating sockets. (line 183) +* socket_type (socketserver.BaseServer attribute): Server Objects<2>. + (line 108) +* sock_accept() (asyncio.loop method): Working with socket objects directly. + (line 107) +* SOCK_CLOEXEC (in module socket): Constants<8>. (line 31) +* sock_connect() (asyncio.loop method): Working with socket objects directly. + (line 88) +* SOCK_DGRAM (in module socket): Constants<8>. (line 20) +* SOCK_MAX_SIZE (in module test.support): test support — Utilities for the Python test suite. + (line 116) +* SOCK_NONBLOCK (in module socket): Constants<8>. (line 31) +* SOCK_RAW (in module socket): Constants<8>. (line 20) +* SOCK_RDM (in module socket): Constants<8>. (line 20) +* sock_recv() (asyncio.loop method): Working with socket objects directly. + (line 12) +* sock_recvfrom() (asyncio.loop method): Working with socket objects directly. + (line 37) +* sock_recvfrom_into() (asyncio.loop method): Working with socket objects directly. + (line 48) +* sock_recv_into() (asyncio.loop method): Working with socket objects directly. + (line 26) +* sock_sendall() (asyncio.loop method): Working with socket objects directly. + (line 59) +* sock_sendfile() (asyncio.loop method): Working with socket objects directly. + (line 130) +* sock_sendto() (asyncio.loop method): Working with socket objects directly. + (line 77) +* SOCK_SEQPACKET (in module socket): Constants<8>. (line 20) +* SOCK_STREAM (in module socket): Constants<8>. (line 20) +* soft keyword: Soft Keywords. (line 6) +* softkwlist (in module keyword): keyword — Testing for Python keywords. + (line 30) +* SOFT_KEYWORD (in module token): token — Constants used with Python parse trees. + (line 252) +* SOL_ALG (in module socket): Constants<8>. (line 212) +* SOL_RDS (in module socket): Constants<8>. (line 183) +* SOMAXCONN (in module socket): Constants<8>. (line 47) +* sort() (imaplib.IMAP4 method): IMAP4 Objects. (line 278) +* sort() (list method): Lists<2>. (line 39) +* sortdict() (in module test.support): test support — Utilities for the Python test suite. + (line 212) +* sortTestMethodsUsing (unittest.TestLoader attribute): Loading and running tests. + (line 190) +* sort_stats() (pstats.Stats method): The Stats Class. (line 67) +* source (doctest.Example attribute): Example Objects. (line 17) +* source (pdb command): Debugger Commands. (line 256) +* source (shlex.shlex attribute): shlex Objects. (line 151) +* source character set: Encoding declarations. + (line 6) +* SourceFileLoader (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 219) +* sourcehook() (shlex.shlex method): shlex Objects. (line 26) +* SourcelessFileLoader (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 259) +* SourceLoader (class in importlib.abc): importlib abc – Abstract base classes related to import. + (line 445) +* SOURCE_DATE_EPOCH: py_compile<3>. (line 7) +* SOURCE_DATE_EPOCH <1>: Library<34>. (line 453) +* SOURCE_DATE_EPOCH <2>: Build<40>. (line 15) +* SOURCE_DATE_EPOCH <3>: py_compile — Compile Python source files. + (line 66) +* SOURCE_DATE_EPOCH <4>: py_compile — Compile Python source files. + (line 82) +* SOURCE_DATE_EPOCH <5>: py_compile — Compile Python source files. + (line 86) +* SOURCE_DATE_EPOCH <6>: Command-line use. (line 91) +* source_from_cache() (in module imp): imp — Access the import internals. + (line 228) +* source_from_cache() (in module importlib.util): importlib util – Utility code for importers. + (line 58) +* source_hash() (in module importlib.util): importlib util – Utility code for importers. + (line 221) +* SOURCE_SUFFIXES (in module importlib.machinery): importlib machinery – Importers and path hooks. + (line 13) +* source_to_code() (importlib.abc.InspectLoader static method): importlib abc – Abstract base classes related to import. + (line 360) +* SO_INCOMING_CPU (in module socket): Constants<8>. (line 285) +* space: Indentation. (line 6) +* space; in printf-style formatting: printf-style String Formatting. + (line 66) +* space; in printf-style formatting <1>: printf-style Bytes Formatting. + (line 63) +* space; in string formatting: Format Specification Mini-Language. + (line 71) +* span() (re.Match method): Match Objects. (line 165) +* spawn() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 485) +* spawn() (in module pty): pty — Pseudo-terminal utilities. + (line 36) +* spawnl() (in module os): Process Management. (line 532) +* spawnle() (in module os): Process Management. (line 532) +* spawnlp() (in module os): Process Management. (line 532) +* spawnlpe() (in module os): Process Management. (line 532) +* spawnv() (in module os): Process Management. (line 532) +* spawnve() (in module os): Process Management. (line 532) +* spawnvp() (in module os): Process Management. (line 532) +* spawnvpe() (in module os): Process Management. (line 532) +* spawn_python() (in module test.support.script_helper): test support script_helper — Utilities for the Python execution tests. + (line 69) +* special method: Glossary. (line 1260) +* special; attribute: The standard type hierarchy. + (line 13) +* special; method: Glossary. (line 1264) +* specified_attributes (xml.parsers.expat.xmlparser attribute): XMLParser Objects<2>. + (line 117) +* spec_from_file_location() (in module importlib.util): importlib util – Utility code for importers. + (line 209) +* spec_from_loader() (in module importlib.util): importlib util – Utility code for importers. + (line 198) +* speed() (in module turtle): Turtle motion. (line 302) +* speed() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 140) +* Spinbox (class in tkinter.ttk): ttk Spinbox. (line 6) +* splice() (in module os): File Descriptor Operations. + (line 704) +* SPLICE_F_MORE (in module os): File Descriptor Operations. + (line 732) +* SPLICE_F_MOVE (in module os): File Descriptor Operations. + (line 732) +* SPLICE_F_NONBLOCK (in module os): File Descriptor Operations. + (line 732) +* split() (BaseExceptionGroup method): Exception groups. (line 65) +* split() (bytearray method): Bytes and Bytearray Operations. + (line 391) +* split() (bytes method): Bytes and Bytearray Operations. + (line 391) +* split() (in module os.path): os path — Common pathname manipulations. + (line 382) +* split() (in module re): Functions<2>. (line 69) +* split() (in module shlex): shlex — Simple lexical analysis. + (line 17) +* split() (re.Pattern method): Regular Expression Objects. + (line 74) +* split() (str method): String Methods<2>. (line 454) +* splitdrive() (in module os.path): os path — Common pathname manipulations. + (line 397) +* splitext() (in module os.path): os path — Common pathname manipulations. + (line 421) +* splitlines() (bytearray method): Bytes and Bytearray Operations. + (line 633) +* splitlines() (bytes method): Bytes and Bytearray Operations. + (line 633) +* splitlines() (str method): String Methods<2>. (line 494) +* SplitResult (class in urllib.parse): Structured Parse Results. + (line 55) +* SplitResultBytes (class in urllib.parse): Structured Parse Results. + (line 82) +* split_quoted() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 118) +* SpooledTemporaryFile (class in tempfile): tempfile — Generate temporary files and directories. + (line 99) +* sprintf-style formatting: printf-style String Formatting. + (line 6) +* sprintf-style formatting <1>: printf-style Bytes Formatting. + (line 6) +* SQLITE_DENY (in module sqlite3): Module constants. (line 37) +* sqlite_errorcode (sqlite3.Error attribute): Exceptions<6>. (line 24) +* sqlite_errorname (sqlite3.Error attribute): Exceptions<6>. (line 30) +* SQLITE_IGNORE (in module sqlite3): Module constants. (line 37) +* SQLITE_OK (in module sqlite3): Module constants. (line 37) +* sqlite_version (in module sqlite3): Module constants. (line 69) +* sqlite_version_info (in module sqlite3): Module constants. (line 74) +* sqrt() (decimal.Context method): Context objects. (line 516) +* sqrt() (decimal.Decimal method): Decimal objects. (line 554) +* sqrt() (in module cmath): Power and logarithmic functions<2>. + (line 23) +* sqrt() (in module math): Power and logarithmic functions. + (line 90) +* ssizeargfunc (C type): Slot Type typedefs. (line 123) +* ssizeobjargproc (C type): Slot Type typedefs. (line 127) +* SSL: ssl — TLS/SSL wrapper for socket objects. + (line 8) +* SSLCertVerificationError: Exceptions<13>. (line 79) +* SSLContext (class in ssl): SSL Contexts. (line 14) +* SSLEOFError: Exceptions<13>. (line 71) +* SSLError: Exceptions<13>. (line 6) +* SSLErrorNumber (class in ssl): Constants<9>. (line 536) +* SSLKEYLOGFILE: Context creation. (line 34) +* SSLKEYLOGFILE <1>: Context creation. (line 68) +* SSLObject (class in ssl): Memory BIO Support<2>. + (line 30) +* sslobject_class (ssl.SSLContext attribute): SSL Contexts. (line 459) +* SSLSession (class in ssl): SSL session. (line 8) +* SSLSocket (class in ssl): SSL Sockets. (line 6) +* sslsocket_class (ssl.SSLContext attribute): SSL Contexts. (line 433) +* SSLSyscallError: Exceptions<13>. (line 62) +* SSLv3 (ssl.TLSVersion attribute): Constants<9>. (line 558) +* SSLWantReadError: Exceptions<13>. (line 44) +* SSLWantWriteError: Exceptions<13>. (line 53) +* SSLZeroReturnError: Exceptions<13>. (line 35) +* ssl_version (ftplib.FTP_TLS attribute): FTP_TLS Objects. (line 9) +* st() (in module turtle): Visibility. (line 15) +* stack (traceback.TracebackException attribute): TracebackException Objects. + (line 47) +* stack viewer: Debug menu Shell window only. + (line 15) +* stack() (in module inspect): The interpreter stack. + (line 171) +* stack; trace: The standard type hierarchy. + (line 847) +* stackable; streams: codecs — Codec registry and base classes. + (line 8) +* StackSummary (class in traceback): StackSummary Objects. + (line 11) +* stack_effect() (in module dis): Analysis functions. (line 155) +* stack_size() (in module threading): threading — Thread-based parallelism. + (line 183) +* stack_size() (in module _thread): _thread — Low-level threading API. + (line 106) +* stamp() (in module turtle): Turtle motion. (line 238) +* Standard C: String and Bytes literals. + (line 72) +* standard input: Complete Python programs. + (line 25) +* standard; output: Expression statements. + (line 17) +* standarderror (2to3 fixer): Fixers. (line 294) +* standard_b64decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 82) +* standard_b64encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 77) +* standend() (curses.window method): Window Objects. (line 519) +* standout() (curses.window method): Window Objects. (line 524) +* STAR (in module token): token — Constants used with Python parse trees. + (line 90) +* STAREQUAL (in module token): token — Constants used with Python parse trees. + (line 178) +* starmap() (in module itertools): Itertool functions. (line 541) +* starmap() (multiprocessing.pool.Pool method): Process Pools. + (line 148) +* starmap_async() (multiprocessing.pool.Pool method): Process Pools. + (line 159) +* Starred (class in ast): Variables. (line 43) +* start (range attribute): Ranges. (line 61) +* start (slice object attribute): The standard type hierarchy. + (line 896) +* start (slice object attribute) <1>: Slicings. (line 26) +* start (UnicodeError attribute): Concrete exceptions. + (line 417) +* start() (in module tracemalloc): Functions<10>. (line 68) +* start() (logging.handlers.QueueListener method): QueueListener. + (line 75) +* start() (multiprocessing.managers.BaseManager method): Managers. + (line 57) +* start() (multiprocessing.Process method): Process and exceptions. + (line 58) +* start() (re.Match method): Match Objects. (line 140) +* start() (threading.Thread method): Thread Objects. (line 93) +* start() (tkinter.ttk.Progressbar method): ttk Progressbar. (line 8) +* start() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 43) +* startCDATA() (xml.sax.handler.LexicalHandler method): LexicalHandler Objects. + (line 32) +* StartCdataSectionHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 300) +* StartDoctypeDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 186) +* startDocument() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 32) +* startDTD() (xml.sax.handler.LexicalHandler method): LexicalHandler Objects. + (line 23) +* startElement() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 82) +* StartElementHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 224) +* startElementNS() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 102) +* startfile() (in module os): Process Management. (line 644) +* STARTF_USESHOWWINDOW (in module subprocess): Windows Constants. + (line 33) +* STARTF_USESTDHANDLES (in module subprocess): Windows Constants. + (line 27) +* StartNamespaceDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 279) +* startPrefixMapping() (xml.sax.handler.ContentHandler method): ContentHandler Objects. + (line 49) +* StartResponse (class in wsgiref.types): wsgiref types – WSGI types for static type checking. + (line 11) +* startswith() (bytearray method): Bytes and Bytearray Operations. + (line 246) +* startswith() (bytes method): Bytes and Bytearray Operations. + (line 246) +* startswith() (str method): String Methods<2>. (line 567) +* startTest() (unittest.TestResult method): Loading and running tests. + (line 335) +* startTestRun() (unittest.TestResult method): Loading and running tests. + (line 344) +* starttls() (imaplib.IMAP4 method): IMAP4 Objects. (line 296) +* starttls() (nntplib.NNTP method): Methods<3>. (line 62) +* starttls() (smtplib.SMTP method): SMTP Objects. (line 185) +* STARTUPINFO (class in subprocess): Windows Popen Helpers. + (line 9) +* start_color() (in module curses): Functions<5>. (line 488) +* start_component() (msilib.Directory method): Directory Objects. + (line 20) +* start_new_thread() (in module _thread): _thread — Low-level threading API. + (line 32) +* start_ns() (xml.etree.ElementTree.TreeBuilder method): TreeBuilder Objects. + (line 75) +* start_server() (in module asyncio): Streams. (line 73) +* start_serving() (asyncio.Server method): Server Objects. (line 47) +* start_threads() (in module test.support.threading_helper): test support threading_helper — Utilities for threading tests. + (line 22) +* start_tls() (asyncio.loop method): TLS Upgrade. (line 6) +* start_tls() (asyncio.StreamWriter method): StreamWriter. (line 81) +* start_unix_server() (in module asyncio): Streams. (line 134) +* stat() (in module os): Files and Directories. + (line 982) +* stat() (nntplib.NNTP method): Methods<3>. (line 219) +* stat() (os.DirEntry method): Files and Directories. + (line 953) +* stat() (pathlib.Path method): Methods<2>. (line 37) +* stat() (poplib.POP3 method): POP3 Objects. (line 51) +* state() (tkinter.ttk.Widget method): ttk Widget. (line 25) +* statement: Glossary. (line 1267) +* statement grouping: Indentation. (line 6) +* statement; assert: The assert statement. + (line 6) +* statement; assert <1>: Concrete exceptions. + (line 10) +* statement; assignment, annotated: Annotated assignment statements. + (line 6) +* statement; assignment, augmented: Augmented assignment statements. + (line 6) +* statement; async def: Coroutines<2>. (line 8) +* statement; async for: Coroutine function definition. + (line 28) +* statement; async with: The async for statement. + (line 43) +* statement; break: The break statement. + (line 6) +* statement; break <1>: The while statement. + (line 17) +* statement; break <2>: The for statement. (line 21) +* statement; break <3>: except* clause. (line 44) +* statement; break <4>: finally clause. (line 29) +* statement; class: Class definitions. (line 6) +* statement; continue: The continue statement. + (line 6) +* statement; continue <1>: The while statement. + (line 17) +* statement; continue <2>: The for statement. (line 21) +* statement; continue <3>: except* clause. (line 43) +* statement; continue <4>: finally clause. (line 29) +* statement; def: Function definitions. + (line 6) +* statement; del: Basic customization. + (line 55) +* statement; del <1>: The del statement<2>. + (line 6) +* statement; del <2>: Mutable Sequence Types. + (line 16) +* statement; del <3>: Mapping Types — dict. + (line 6) +* statement; except: Built-in Exceptions. + (line 6) +* statement; for: for Statements. (line 6) +* statement; for <1>: The break statement. + (line 6) +* statement; for <2>: The continue statement. + (line 6) +* statement; for <3>: The for statement. (line 6) +* statement; global: The del statement<2>. + (line 15) +* statement; global <1>: The global statement. + (line 6) +* statement; if: The if statement. (line 6) +* statement; if <1>: Truth Value Testing. + (line 6) +* statement; import: The standard type hierarchy. + (line 529) +* statement; import <1>: The import statement. + (line 6) +* statement; import <2>: Built-in Functions. (line 1953) +* statement; import <3>: site — Site-specific configuration hook. + (line 45) +* statement; import <4>: imp — Access the import internals. + (line 11) +* statement; match: The match statement. + (line 6) +* statement; nonlocal: The nonlocal statement. + (line 6) +* statement; pass: The pass statement. (line 6) +* statement; raise: The raise statement. + (line 6) +* statement; raise <1>: Built-in Exceptions. + (line 14) +* statement; return: The return statement. + (line 6) +* statement; return <1>: except* clause. (line 44) +* statement; return <2>: finally clause. (line 29) +* statement; try: The standard type hierarchy. + (line 870) +* statement; try <1>: The try statement. (line 6) +* statement; try <2>: Built-in Exceptions. + (line 6) +* statement; while: The break statement. + (line 6) +* statement; while <1>: The continue statement. + (line 6) +* statement; while <2>: The while statement. + (line 6) +* statement; while <3>: Truth Value Testing. + (line 6) +* statement; with: With Statement Context Managers. + (line 14) +* statement; with <1>: The with statement. (line 6) +* statement; yield: The yield statement. + (line 6) +* static_order() (graphlib.TopologicalSorter method): graphlib — Functionality to operate with graph-like structures. + (line 161) +* Statistic (class in tracemalloc): Statistic. (line 6) +* StatisticDiff (class in tracemalloc): StatisticDiff. (line 6) +* statistics() (tracemalloc.Snapshot method): Snapshot. (line 56) +* StatisticsError: Exceptions<5>. (line 8) +* Stats (class in pstats): The Stats Class. (line 9) +* status (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 61) +* status (urllib.response.addinfourl attribute): urllib response — Response classes used by urllib. + (line 24) +* status() (imaplib.IMAP4 method): IMAP4 Objects. (line 309) +* statvfs() (in module os): Files and Directories. + (line 1242) +* stat_result (class in os): Files and Directories. + (line 1037) +* StdButtonBox (class in tkinter.tix): Basic Widgets. (line 65) +* stderr (asyncio.subprocess.Process attribute): Interacting with Subprocesses. + (line 120) +* stderr (in module sys): The standard type hierarchy. + (line 675) +* stderr (in module sys) <1>: sys — System-specific parameters and functions. + (line 1603) +* stderr (in module sys) <2>: Sub-interpreter support. + (line 25) +* stderr (subprocess.CalledProcessError attribute): Using the subprocess Module. + (line 216) +* stderr (subprocess.CompletedProcess attribute): Using the subprocess Module. + (line 115) +* stderr (subprocess.Popen attribute): Popen Objects. (line 125) +* stderr (subprocess.TimeoutExpired attribute): Using the subprocess Module. + (line 180) +* stdev (statistics.NormalDist attribute): NormalDist objects. + (line 35) +* stdev() (in module statistics): Function details. (line 351) +* stdin (asyncio.subprocess.Process attribute): Interacting with Subprocesses. + (line 110) +* stdin (in module sys): The standard type hierarchy. + (line 675) +* stdin (in module sys) <1>: sys — System-specific parameters and functions. + (line 1603) +* stdin (in module sys) <2>: Sub-interpreter support. + (line 25) +* stdin (subprocess.Popen attribute): Popen Objects. (line 106) +* stdin; stdout; sdterr: Process-wide parameters. + (line 9) +* stdio: The standard type hierarchy. + (line 675) +* stdlib_module_names (in module sys): sys — System-specific parameters and functions. + (line 1693) +* stdout (asyncio.subprocess.Process attribute): Interacting with Subprocesses. + (line 115) +* STDOUT (in module subprocess): Using the subprocess Module. + (line 143) +* stdout (in module sys): The standard type hierarchy. + (line 675) +* stdout (in module sys) <1>: sys — System-specific parameters and functions. + (line 1603) +* stdout (in module sys) <2>: Sub-interpreter support. + (line 25) +* stdout (subprocess.CalledProcessError attribute): Using the subprocess Module. + (line 212) +* stdout (subprocess.CompletedProcess attribute): Using the subprocess Module. + (line 105) +* stdout (subprocess.Popen attribute): Popen Objects. (line 115) +* stdout (subprocess.TimeoutExpired attribute): Using the subprocess Module. + (line 176) +* STD_ERROR_HANDLE (in module subprocess): Windows Constants. + (line 18) +* STD_INPUT_HANDLE (in module subprocess): Windows Constants. + (line 8) +* STD_OUTPUT_HANDLE (in module subprocess): Windows Constants. + (line 13) +* step (pdb command): Debugger Commands. (line 167) +* step (range attribute): Ranges. (line 70) +* step (slice object attribute): The standard type hierarchy. + (line 896) +* step (slice object attribute) <1>: Slicings. (line 26) +* step() (tkinter.ttk.Progressbar method): ttk Progressbar. (line 15) +* stereocontrols() (ossaudiodev.oss_mixer_device method): Mixer Device Objects. + (line 44) +* stls() (poplib.POP3 method): POP3 Objects. (line 113) +* stop (range attribute): Ranges. (line 66) +* stop (slice object attribute): The standard type hierarchy. + (line 896) +* stop (slice object attribute) <1>: Slicings. (line 26) +* stop() (asyncio.loop method): Running and stopping the loop. + (line 31) +* stop() (in module tracemalloc): Functions<10>. (line 98) +* stop() (logging.handlers.QueueListener method): QueueListener. + (line 82) +* stop() (tkinter.ttk.Progressbar method): ttk Progressbar. (line 21) +* stop() (unittest.TestResult method): Loading and running tests. + (line 315) +* StopAsyncIteration: Concrete exceptions. + (line 262) +* StopIteration: Concrete exceptions. + (line 232) +* stopListening() (in module logging.config): Configuration functions. + (line 173) +* stopTest() (unittest.TestResult method): Loading and running tests. + (line 339) +* stopTestRun() (unittest.TestResult method): Loading and running tests. + (line 350) +* stop_here() (bdb.Bdb method): bdb — Debugger framework. + (line 248) +* storbinary() (ftplib.FTP method): FTP Objects. (line 113) +* Store (class in ast): Variables. (line 11) +* store() (imaplib.IMAP4 method): IMAP4 Objects. (line 313) +* STORE_ACTIONS (optparse.Option attribute): Adding new actions. + (line 35) +* STORE_ATTR (opcode): Python Bytecode Instructions. + (line 450) +* STORE_DEREF (opcode): Python Bytecode Instructions. + (line 740) +* STORE_FAST (opcode): Python Bytecode Instructions. + (line 694) +* STORE_GLOBAL (opcode): Python Bytecode Instructions. + (line 459) +* STORE_NAME (opcode): Python Bytecode Instructions. + (line 423) +* STORE_SUBSCR (opcode): Python Bytecode Instructions. + (line 172) +* storlines() (ftplib.FTP method): FTP Objects. (line 127) +* str (built-in class): Text Sequence Type — str. + (line 44) +* str (built-in class); (see also string): Ranges. (line 126) +* str() (in module locale): locale — Internationalization services. + (line 465) +* strcoll() (in module locale): locale — Internationalization services. + (line 405) +* StreamError: tarfile — Read and write tar archive files. + (line 203) +* StreamHandler (class in logging): StreamHandler. (line 11) +* StreamReader (class in asyncio): StreamReader. (line 6) +* StreamReader (class in codecs): StreamReader Objects. + (line 10) +* streamreader (codecs.CodecInfo attribute): codecs — Codec registry and base classes. + (line 87) +* StreamReaderWriter (class in codecs): StreamReaderWriter Objects. + (line 12) +* StreamRecoder (class in codecs): StreamRecoder Objects. + (line 13) +* StreamRequestHandler (class in socketserver): Request Handler Objects. + (line 42) +* streams: codecs — Codec registry and base classes. + (line 8) +* StreamWriter (class in asyncio): StreamWriter. (line 6) +* StreamWriter (class in codecs): StreamWriter Objects. + (line 10) +* streamwriter (codecs.CodecInfo attribute): codecs — Codec registry and base classes. + (line 87) +* StrEnum (class in enum): Data Types<2>. (line 306) +* strerror (OSError attribute): Concrete exceptions. + (line 172) +* strerror(): Raising exceptions. (line 59) +* strerror() (in module os): Process Parameters. (line 471) +* strftime() (datetime.date method): date Objects. (line 273) +* strftime() (datetime.datetime method): datetime Objects. (line 708) +* strftime() (datetime.time method): time Objects. (line 225) +* strftime() (in module time): Functions<4>. (line 279) +* strict (csv.Dialect attribute): Dialects and Formatting Parameters. + (line 74) +* STRICT (enum.FlagBoundary attribute): Data Types<2>. (line 539) +* strict (in module email.policy): email policy Policy Objects. + (line 514) +* strict; error handler’s name: Error Handlers. (line 15) +* strict_domain (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 95) +* strict_errors() (in module codecs): Error Handlers. (line 141) +* strict_ns_domain (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 117) +* strict_ns_set_initial_dollar (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 122) +* strict_ns_set_path (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 127) +* strict_ns_unverifiable (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 112) +* strict_rfc2965_unverifiable (http.cookiejar.DefaultCookiePolicy attribute): DefaultCookiePolicy Objects. + (line 103) +* strides (memoryview attribute): Memory Views. (line 455) +* STRING (in module token): token — Constants used with Python parse trees. + (line 46) +* string (re.Match attribute): Match Objects. (line 204) +* string literal: Literals. (line 8) +* string; conversion: Basic customization. + (line 149) +* string; conversion <1>: Expression statements. + (line 17) +* string; format() (built-in function): Built-in Functions. (line 689) +* string; formatted literal: String literal concatenation. + (line 24) +* string; formatting, printf: printf-style String Formatting. + (line 6) +* string; immutable sequences: The standard type hierarchy. + (line 159) +* string; interpolated literal: String literal concatenation. + (line 24) +* string; interpolation, printf: printf-style String Formatting. + (line 6) +* string; item: Subscriptions. (line 55) +* string; methods: Text Sequence Type — str. + (line 85) +* string; object representation: Finalization and De-allocation. + (line 91) +* string; PyObject_Str (C function): Object Protocol. (line 204) +* string; str (built-in class): Text Sequence Type — str. + (line 44) +* string; str() (built-in function): Built-in Functions. (line 1683) +* string; text sequence type: Ranges. (line 126) +* string; __format__() (object method): Basic customization. + (line 149) +* string; __str__() (object method): Basic customization. + (line 128) +* StringIO (class in io): Text I/O<2>. (line 202) +* strings, documentation: Defining Functions. (line 21) +* strings, documentation <1>: Documentation Strings. + (line 6) +* string_at() (in module ctypes): Utility functions. (line 194) +* strip() (bytearray method): Bytes and Bytearray Operations. + (line 436) +* strip() (bytes method): Bytes and Bytearray Operations. + (line 436) +* strip() (str method): String Methods<2>. (line 574) +* stripspaces (curses.textpad.Textbox attribute): Textbox objects. + (line 115) +* strip_dirs() (pstats.Stats method): The Stats Class. (line 34) +* strong reference: Glossary. (line 1274) +* strptime() (datetime.datetime class method): datetime Objects. + (line 239) +* strptime() (in module time): Functions<4>. (line 411) +* strsignal() (in module signal): Module contents<2>. (line 289) +* strtobool() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 139) +* Struct (class in struct): Classes<2>. (line 8) +* Structure (class in ctypes): Structured data types. + (line 33) +* struct_time (class in time): Functions<4>. (line 445) +* strxfrm() (in module locale): locale — Internationalization services. + (line 412) +* Style (class in tkinter.ttk): Ttk Styling. (line 20) +* ST_ATIME (in module stat): stat — Interpreting stat results. + (line 163) +* st_atime (os.stat_result attribute): Files and Directories. + (line 1082) +* st_atime_ns (os.stat_result attribute): Files and Directories. + (line 1098) +* st_birthtime (os.stat_result attribute): Files and Directories. + (line 1166) +* st_blksize (os.stat_result attribute): Files and Directories. + (line 1144) +* st_blocks (os.stat_result attribute): Files and Directories. + (line 1139) +* st_creator (os.stat_result attribute): Files and Directories. + (line 1184) +* ST_CTIME (in module stat): stat — Interpreting stat results. + (line 171) +* st_ctime (os.stat_result attribute): Files and Directories. + (line 1090) +* st_ctime_ns (os.stat_result attribute): Files and Directories. + (line 1108) +* ST_DEV (in module stat): stat — Interpreting stat results. + (line 142) +* st_dev (os.stat_result attribute): Files and Directories. + (line 1058) +* st_file_attributes (os.stat_result attribute): Files and Directories. + (line 1194) +* st_flags (os.stat_result attribute): Files and Directories. + (line 1154) +* st_fstype (os.stat_result attribute): Files and Directories. + (line 1173) +* st_gen (os.stat_result attribute): Files and Directories. + (line 1162) +* ST_GID (in module stat): stat — Interpreting stat results. + (line 154) +* st_gid (os.stat_result attribute): Files and Directories. + (line 1070) +* ST_INO (in module stat): stat — Interpreting stat results. + (line 138) +* st_ino (os.stat_result attribute): Files and Directories. + (line 1049) +* ST_MODE (in module stat): stat — Interpreting stat results. + (line 134) +* st_mode (os.stat_result attribute): Files and Directories. + (line 1045) +* ST_MTIME (in module stat): stat — Interpreting stat results. + (line 167) +* st_mtime (os.stat_result attribute): Files and Directories. + (line 1086) +* st_mtime_ns (os.stat_result attribute): Files and Directories. + (line 1103) +* ST_NLINK (in module stat): stat — Interpreting stat results. + (line 146) +* st_nlink (os.stat_result attribute): Files and Directories. + (line 1062) +* st_rdev (os.stat_result attribute): Files and Directories. + (line 1150) +* st_reparse_tag (os.stat_result attribute): Files and Directories. + (line 1201) +* st_rsize (os.stat_result attribute): Files and Directories. + (line 1180) +* ST_SIZE (in module stat): stat — Interpreting stat results. + (line 158) +* st_size (os.stat_result attribute): Files and Directories. + (line 1074) +* st_type (os.stat_result attribute): Files and Directories. + (line 1188) +* ST_UID (in module stat): stat — Interpreting stat results. + (line 150) +* st_uid (os.stat_result attribute): Files and Directories. + (line 1066) +* Sub (class in ast): Expressions<2>. (line 54) +* sub() (in module operator): operator — Standard operators as functions. + (line 157) +* sub() (in module re): Functions<2>. (line 144) +* sub() (re.Pattern method): Regular Expression Objects. + (line 91) +* subclassing; immutable types: Basic customization. + (line 8) +* subdirs (filecmp.dircmp attribute): The dircmp class. (line 100) +* SubElement() (in module xml.etree.ElementTree): Functions<8>. + (line 204) +* subgroup() (BaseExceptionGroup method): Exception groups. (line 43) +* submit() (concurrent.futures.Executor method): Executor Objects. + (line 12) +* submodule_search_locations (importlib.machinery.ModuleSpec attribute): importlib machinery – Importers and path hooks. + (line 413) +* subn() (in module re): Functions<2>. (line 213) +* subn() (re.Pattern method): Regular Expression Objects. + (line 96) +* subnets() (ipaddress.IPv4Network method): Network objects. (line 173) +* subnets() (ipaddress.IPv6Network method): Network objects. (line 344) +* subnet_of() (ipaddress.IPv4Network method): Network objects. + (line 215) +* subnet_of() (ipaddress.IPv6Network method): Network objects. + (line 348) +* Subnormal (class in decimal): Signals. (line 86) +* suboffsets (memoryview attribute): Memory Views. (line 464) +* subpad() (curses.window method): Window Objects. (line 528) +* SubprocessError: Using the subprocess Module. + (line 149) +* SubprocessProtocol (class in asyncio): Base Protocols. (line 24) +* SubprocessTransport (class in asyncio): Transports Hierarchy. + (line 50) +* subprocess_exec() (asyncio.loop method): Running Subprocesses. + (line 16) +* subprocess_shell() (asyncio.loop method): Running Subprocesses. + (line 113) +* subscribe() (imaplib.IMAP4 method): IMAP4 Objects. (line 337) +* Subscript (class in ast): Subscripting. (line 6) +* subscript; assignment: Mutable Sequence Types. + (line 16) +* subscript; operation: Common Sequence Operations. + (line 21) +* subscription: The standard type hierarchy. + (line 132) +* subscription <1>: The standard type hierarchy. + (line 197) +* subscription <2>: The standard type hierarchy. + (line 254) +* subscription <3>: Subscriptions. (line 6) +* subscription; assignment: Assignment statements. + (line 101) +* subsequent_indent (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 216) +* substitute() (string.Template method): Template strings. (line 40) +* subst_vars() (in module distutils.util): distutils util — Miscellaneous other utility functions. + (line 102) +* subTest() (unittest.TestCase method): Test cases. (line 105) +* subtract() (collections.Counter method): Counter objects. (line 88) +* subtract() (decimal.Context method): Context objects. (line 520) +* subtraction: Binary arithmetic operations. + (line 78) +* subtype (email.headerregistry.ContentTypeHeader attribute): email headerregistry Custom Header Objects. + (line 278) +* subwin() (curses.window method): Window Objects. (line 535) +* sub_commands (distutils.cmd.Command attribute): Creating a new Distutils command. + (line 49) +* successful() (multiprocessing.pool.AsyncResult method): Process Pools. + (line 213) +* suffix_map (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 128) +* suffix_map (mimetypes.MimeTypes attribute): MimeTypes Objects. + (line 23) +* suite: Compound statements. + (line 18) +* suiteClass (unittest.TestLoader attribute): Loading and running tests. + (line 196) +* summarize() (doctest.DocTestRunner method): DocTestRunner objects. + (line 116) +* summarize_address_range() (in module ipaddress): Other Module Level Functions. + (line 27) +* sum_list(): Reference Count Details. + (line 143) +* sum_sequence(): Reference Count Details. + (line 170) +* sum_sequence() <1>: Exceptions<19>. (line 65) +* SUNDAY (in module calendar): calendar — General calendar-related functions. + (line 387) +* super (built-in class): Built-in Functions. (line 1710) +* super (pyclbr.Class attribute): Class Objects<2>. (line 38) +* supernet() (ipaddress.IPv4Network method): Network objects. + (line 199) +* supernet() (ipaddress.IPv6Network method): Network objects. + (line 346) +* supernet_of() (ipaddress.IPv4Network method): Network objects. + (line 226) +* supernet_of() (ipaddress.IPv6Network method): Network objects. + (line 350) +* SupportsAbs (class in typing): Protocols<3>. (line 8) +* SupportsBytes (class in typing): Protocols<3>. (line 13) +* SupportsComplex (class in typing): Protocols<3>. (line 17) +* SupportsFloat (class in typing): Protocols<3>. (line 21) +* SupportsIndex (class in typing): Protocols<3>. (line 25) +* SupportsInt (class in typing): Protocols<3>. (line 31) +* SupportsRound (class in typing): Protocols<3>. (line 35) +* supports_bytes_environ (in module os): Process Parameters. (line 477) +* supports_dir_fd (in module os): Files and Directories. + (line 1285) +* supports_effective_ids (in module os): Files and Directories. + (line 1310) +* supports_fd (in module os): Files and Directories. + (line 1329) +* supports_follow_symlinks (in module os): Files and Directories. + (line 1348) +* supports_unicode_filenames (in module os.path): os path — Common pathname manipulations. + (line 451) +* suppress() (in module contextlib): Utilities. (line 260) +* SuppressCrashReport (class in test.support): test support — Utilities for the Python test suite. + (line 717) +* surrogateescape; error handler’s name: Error Handlers. (line 15) +* surrogatepass; error handler’s name: Error Handlers. (line 73) +* SWAP (opcode): Python Bytecode Instructions. + (line 94) +* swapcase() (bytearray method): Bytes and Bytearray Operations. + (line 657) +* swapcase() (bytes method): Bytes and Bytearray Operations. + (line 657) +* swapcase() (str method): String Methods<2>. (line 598) +* swap_attr() (in module test.support): test support — Utilities for the Python test suite. + (line 346) +* swap_item() (in module test.support): test support — Utilities for the Python test suite. + (line 363) +* SW_HIDE (in module subprocess): Windows Constants. (line 23) +* Symbol (class in symtable): Examining Symbol Tables. + (line 100) +* SymbolTable (class in symtable): Examining Symbol Tables. + (line 6) +* symlink() (in module os): Files and Directories. + (line 1371) +* symlink_to() (pathlib.Path method): Methods<2>. (line 444) +* symmetric_difference() (frozenset method): Set Types — set frozenset. + (line 116) +* symmetric_difference_update() (frozenset method): Set Types — set frozenset. + (line 188) +* symtable() (in module symtable): Generating Symbol Tables. + (line 6) +* sync() (dbm.dumb.dumbdbm method): dbm dumb — Portable DBM implementation. + (line 81) +* sync() (dbm.gnu.gdbm method): dbm gnu — GNU’s reinterpretation of dbm. + (line 116) +* sync() (in module os): Files and Directories. + (line 1415) +* sync() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 165) +* sync() (shelve.Shelf method): shelve — Python object persistence. + (line 69) +* syncdown() (curses.window method): Window Objects. (line 545) +* synchronized() (in module multiprocessing.sharedctypes): The multiprocessing sharedctypes module. + (line 88) +* SyncManager (class in multiprocessing.managers): Managers. (line 150) +* syncok() (curses.window method): Window Objects. (line 551) +* syncup() (curses.window method): Window Objects. (line 556) +* syntax: Notation. (line 6) +* SyntaxErr: Exceptions<17>. (line 93) +* SyntaxError: Concrete exceptions. + (line 269) +* SyntaxWarning: Warnings. (line 43) +* sys.exc_info: The standard type hierarchy. + (line 847) +* sys.last_traceback: The standard type hierarchy. + (line 847) +* sys.meta_path: The meta path. (line 6) +* sys.modules: The module cache. (line 6) +* sys.path: Path entry finders. (line 6) +* sys.path_hooks: Path entry finders. (line 6) +* sys.path_importer_cache: Path entry finders. (line 6) +* sys.stderr: The standard type hierarchy. + (line 675) +* sys.stdin: The standard type hierarchy. + (line 675) +* sys.stdout: The standard type hierarchy. + (line 675) +* sysconf() (in module os): Miscellaneous System Information. + (line 56) +* sysconf_names (in module os): Miscellaneous System Information. + (line 66) +* syslog() (in module syslog): syslog — Unix syslog library routines. + (line 23) +* SysLogHandler (class in logging.handlers): SysLogHandler. (line 10) +* system() (in module os): Process Management. (line 699) +* system() (in module platform): Cross Platform. (line 119) +* SystemError: Concrete exceptions. + (line 331) +* SystemError (built-in exception): Module Objects. (line 62) +* SystemError (built-in exception) <1>: Module Objects. (line 90) +* SystemExit: Concrete exceptions. + (line 345) +* SystemExit (built-in exception): Exceptions<2>. (line 26) +* systemId (xml.dom.DocumentType attribute): DocumentType Objects. + (line 22) +* SystemRandom (class in random): Alternative Generator. + (line 15) +* SystemRandom (class in secrets): Random numbers. (line 9) +* SystemRoot: Popen Constructor. (line 301) +* system_alias() (in module platform): Cross Platform. (line 125) +* system_must_validate_cert() (in module test.support): test support — Utilities for the Python test suite. + (line 434) +* sys_exc (2to3 fixer): Fixers. (line 298) +* sys_version (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 142) +* S_ENFMT (in module stat): stat — Interpreting stat results. + (line 317) +* S_IEXEC (in module stat): stat — Interpreting stat results. + (line 331) +* S_IFBLK (in module stat): stat — Interpreting stat results. + (line 206) +* S_IFCHR (in module stat): stat — Interpreting stat results. + (line 214) +* S_IFDIR (in module stat): stat — Interpreting stat results. + (line 210) +* S_IFDOOR (in module stat): stat — Interpreting stat results. + (line 222) +* S_IFIFO (in module stat): stat — Interpreting stat results. + (line 218) +* S_IFLNK (in module stat): stat — Interpreting stat results. + (line 198) +* S_IFMT() (in module stat): stat — Interpreting stat results. + (line 78) +* S_IFPORT (in module stat): stat — Interpreting stat results. + (line 228) +* S_IFREG (in module stat): stat — Interpreting stat results. + (line 202) +* S_IFSOCK (in module stat): stat — Interpreting stat results. + (line 194) +* S_IFWHT (in module stat): stat — Interpreting stat results. + (line 234) +* S_IMODE() (in module stat): stat — Interpreting stat results. + (line 71) +* S_IREAD (in module stat): stat — Interpreting stat results. + (line 323) +* S_IRGRP (in module stat): stat — Interpreting stat results. + (line 289) +* S_IROTH (in module stat): stat — Interpreting stat results. + (line 305) +* S_IRUSR (in module stat): stat — Interpreting stat results. + (line 273) +* S_IRWXG (in module stat): stat — Interpreting stat results. + (line 285) +* S_IRWXO (in module stat): stat — Interpreting stat results. + (line 301) +* S_IRWXU (in module stat): stat — Interpreting stat results. + (line 269) +* S_ISBLK() (in module stat): stat — Interpreting stat results. + (line 30) +* S_ISCHR() (in module stat): stat — Interpreting stat results. + (line 25) +* S_ISDIR() (in module stat): stat — Interpreting stat results. + (line 21) +* S_ISDOOR() (in module stat): stat — Interpreting stat results. + (line 50) +* S_ISFIFO() (in module stat): stat — Interpreting stat results. + (line 38) +* S_ISGID (in module stat): stat — Interpreting stat results. + (line 251) +* S_ISLNK() (in module stat): stat — Interpreting stat results. + (line 42) +* S_ISPORT() (in module stat): stat — Interpreting stat results. + (line 56) +* S_ISREG() (in module stat): stat — Interpreting stat results. + (line 34) +* S_ISSOCK() (in module stat): stat — Interpreting stat results. + (line 46) +* S_ISUID (in module stat): stat — Interpreting stat results. + (line 247) +* S_ISVTX (in module stat): stat — Interpreting stat results. + (line 262) +* S_ISWHT() (in module stat): stat — Interpreting stat results. + (line 62) +* S_IWGRP (in module stat): stat — Interpreting stat results. + (line 293) +* S_IWOTH (in module stat): stat — Interpreting stat results. + (line 309) +* S_IWRITE (in module stat): stat — Interpreting stat results. + (line 327) +* S_IWUSR (in module stat): stat — Interpreting stat results. + (line 277) +* S_IXGRP (in module stat): stat — Interpreting stat results. + (line 297) +* S_IXOTH (in module stat): stat — Interpreting stat results. + (line 313) +* S_IXUSR (in module stat): stat — Interpreting stat results. + (line 281) +* tab: Indentation. (line 6) +* tab() (tkinter.ttk.Notebook method): ttk Notebook. (line 62) +* TabError: Concrete exceptions. + (line 326) +* tabs() (tkinter.ttk.Notebook method): ttk Notebook. (line 71) +* tabsize (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 173) +* tag (xml.etree.ElementTree.Element attribute): Element Objects. + (line 16) +* tagName (xml.dom.Element attribute): Element Objects<2>. (line 9) +* tag_bind() (tkinter.ttk.Treeview method): ttk Treeview. (line 303) +* tag_configure() (tkinter.ttk.Treeview method): ttk Treeview. + (line 309) +* tag_has() (tkinter.ttk.Treeview method): ttk Treeview. (line 319) +* tail (xml.etree.ElementTree.Element attribute): Element Objects. + (line 21) +* takewhile() (in module itertools): Itertool functions. (line 556) +* take_snapshot() (in module tracemalloc): Functions<10>. (line 110) +* tan() (in module cmath): Trigonometric functions<2>. + (line 33) +* tan() (in module math): Trigonometric functions. + (line 69) +* tanh() (in module cmath): Hyperbolic functions<2>. + (line 34) +* tanh() (in module math): Hyperbolic functions. + (line 29) +* TarError: tarfile — Read and write tar archive files. + (line 189) +* TarFile (class in tarfile): TarFile Objects. (line 22) +* tarfile command line option; -c: Command-line options<2>. + (line 11) +* tarfile command line option; –create: Command-line options<2>. + (line 11) +* tarfile command line option; -e: Command-line options<2>. + (line 16) +* tarfile command line option; –extract: Command-line options<2>. + (line 16) +* tarfile command line option; -l: Command-line options<2>. + (line 6) +* tarfile command line option; –list: Command-line options<2>. + (line 6) +* tarfile command line option; -t: Command-line options<2>. + (line 22) +* tarfile command line option; –test: Command-line options<2>. + (line 22) +* tarfile command line option; -v: Command-line options<2>. + (line 27) +* tarfile command line option; –verbose: Command-line options<2>. + (line 27) +* target: Assignment statements. + (line 27) +* target (xml.dom.ProcessingInstruction attribute): ProcessingInstruction Objects. + (line 9) +* target; list: Assignment statements. + (line 27) +* target; list <1>: The for statement. (line 6) +* target; list; assignment: Assignment statements. + (line 35) +* TarInfo (class in tarfile): TarInfo Objects. (line 15) +* Task (class in asyncio): Task Object. (line 6) +* TaskGroup (class in asyncio): Task Groups. (line 9) +* task_done() (asyncio.Queue method): Queue. (line 77) +* task_done() (multiprocessing.JoinableQueue method): Pipes and Queues. + (line 237) +* task_done() (queue.Queue method): Queue Objects. (line 68) +* tau (in module cmath): Constants<3>. (line 14) +* tau (in module math): Constants<2>. (line 14) +* tbreak (pdb command): Debugger Commands. (line 93) +* tb_frame (traceback attribute): The standard type hierarchy. + (line 870) +* tb_lasti (traceback attribute): The standard type hierarchy. + (line 870) +* tb_lineno (traceback attribute): The standard type hierarchy. + (line 870) +* tb_locals (unittest.TestResult attribute): Loading and running tests. + (line 299) +* tb_next (traceback attribute): The standard type hierarchy. + (line 882) +* tcdrain() (in module termios): termios — POSIX style tty control. + (line 53) +* tcflow() (in module termios): termios — POSIX style tty control. + (line 64) +* tcflush() (in module termios): termios — POSIX style tty control. + (line 58) +* tcgetattr() (in module termios): termios — POSIX style tty control. + (line 26) +* tcgetpgrp() (in module os): File Descriptor Operations. + (line 755) +* tcgetwinsize() (in module termios): termios — POSIX style tty control. + (line 71) +* Tcl() (in module tkinter): Tkinter Modules. (line 94) +* TCL_LIBRARY: How do I freeze Tkinter applications?. + (line 11) +* TCPServer (class in socketserver): socketserver — A framework for network servers. + (line 20) +* tcsendbreak() (in module termios): termios — POSIX style tty control. + (line 47) +* tcsetattr() (in module termios): termios — POSIX style tty control. + (line 37) +* tcsetpgrp() (in module os): File Descriptor Operations. + (line 762) +* tcsetwinsize() (in module termios): termios — POSIX style tty control. + (line 79) +* tearDown() (unittest.TestCase method): Test cases. (line 41) +* tearDownClass() (unittest.TestCase method): Test cases. (line 69) +* tee() (in module itertools): Itertool functions. (line 569) +* tell() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 115) +* tell() (chunk.Chunk method): chunk — Read IFF chunked data. + (line 104) +* tell() (io.IOBase method): I/O Base Classes. (line 137) +* tell() (io.TextIOBase method): Text I/O<2>. (line 87) +* tell() (mmap.mmap method): mmap — Memory-mapped file support. + (line 293) +* tell() (sqlite3.Blob method): Blob objects. (line 58) +* tell() (sunau.AU_read method): AU_read Objects. (line 65) +* tell() (sunau.AU_write method): AU_write Objects. (line 39) +* tell() (wave.Wave_read method): Wave_read Objects. (line 73) +* tell() (wave.Wave_write method): Wave_write Objects. (line 62) +* Telnet (class in telnetlib): telnetlib — Telnet client. + (line 34) +* TEMP: Redirection of local data registry and temporary paths. + (line 7) +* TEMP <1>: tempfile — Generate temporary files and directories. + (line 258) +* tempdir (in module tempfile): tempfile — Generate temporary files and directories. + (line 305) +* Template (class in pipes): pipes — Interface to shell pipelines. + (line 25) +* Template (class in string): Template strings. (line 35) +* template (string.Template attribute): Template strings. (line 85) +* temporary (bdb.Breakpoint attribute): bdb — Debugger framework. + (line 91) +* temporary; file: tempfile — Generate temporary files and directories. + (line 8) +* temporary; file name: tempfile — Generate temporary files and directories. + (line 8) +* TemporaryDirectory (class in tempfile): tempfile — Generate temporary files and directories. + (line 129) +* TemporaryFile() (in module tempfile): tempfile — Generate temporary files and directories. + (line 28) +* temp_cwd() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 135) +* temp_dir() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 150) +* temp_umask() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 160) +* teredo (ipaddress.IPv6Address attribute): Address objects. (line 261) +* TERM: Functions<5>. (line 483) +* TERM <1>: Functions<5>. (line 510) +* termattrs() (in module curses): Functions<5>. (line 502) +* terminal_size (class in os): Querying the size of a terminal. + (line 25) +* terminate() (asyncio.subprocess.Process method): Interacting with Subprocesses. + (line 90) +* terminate() (asyncio.SubprocessTransport method): Subprocess Transports. + (line 49) +* terminate() (multiprocessing.pool.Pool method): Process Pools. + (line 174) +* terminate() (multiprocessing.Process method): Process and exceptions. + (line 172) +* terminate() (subprocess.Popen method): Popen Objects. (line 85) +* termination model: Exceptions<2>. (line 20) +* terminator (logging.StreamHandler attribute): StreamHandler. + (line 47) +* termname() (in module curses): Functions<5>. (line 508) +* ternary; operator: Conditional expressions. + (line 6) +* ternaryfunc (C type): Slot Type typedefs. (line 119) +* test (doctest.DocTestFailure attribute): Debugging. (line 195) +* test (doctest.UnexpectedException attribute): Debugging. (line 216) +* test() (in module cgi): Functions<13>. (line 70) +* TestCase (class in unittest): Test cases. (line 6) +* TestFailed: test support — Utilities for the Python test suite. + (line 16) +* testfile() (in module doctest): Basic API. (line 12) +* TESTFN (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 19) +* TESTFN_NONASCII (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 25) +* TESTFN_UNDECODABLE (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 39) +* TESTFN_UNENCODABLE (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 33) +* TESTFN_UNICODE (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 45) +* TestLoader (class in unittest): Loading and running tests. + (line 6) +* testMethodPrefix (unittest.TestLoader attribute): Loading and running tests. + (line 182) +* testmod() (in module doctest): Basic API. (line 90) +* testNamePatterns (unittest.TestLoader attribute): Loading and running tests. + (line 204) +* TestResult (class in unittest): Loading and running tests. + (line 221) +* tests (in module imghdr): imghdr — Determine the type of an image. + (line 79) +* testsource() (in module doctest): Debugging. (line 106) +* testsRun (unittest.TestResult attribute): Loading and running tests. + (line 277) +* TestSuite (class in unittest): Grouping tests. (line 6) +* testzip() (zipfile.ZipFile method): ZipFile Objects. (line 252) +* TEST_DATA_DIR (in module test.support): test support — Utilities for the Python test suite. + (line 130) +* TEST_HOME_DIR (in module test.support): test support — Utilities for the Python test suite. + (line 126) +* TEST_HTTP_URL (in module test.support): test support — Utilities for the Python test suite. + (line 164) +* TEST_SUPPORT_DIR (in module test.support): test support — Utilities for the Python test suite. + (line 121) +* Text (class in typing): Other concrete types. + (line 35) +* text (in module msilib): Precomputed tables. (line 23) +* text (SyntaxError attribute): Concrete exceptions. + (line 296) +* text (traceback.TracebackException attribute): TracebackException Objects. + (line 63) +* text (xml.etree.ElementTree.Element attribute): Element Objects. + (line 21) +* text encoding: Glossary. (line 1287) +* text file: Glossary. (line 1300) +* text mode: Built-in Functions. (line 1307) +* text() (in module cgitb): cgitb — Traceback manager for CGI scripts. + (line 51) +* text() (msilib.Dialog method): GUI classes. (line 54) +* Textbox (class in curses.textpad): Textbox objects. (line 8) +* TextCalendar (class in calendar): calendar — General calendar-related functions. + (line 128) +* textdomain() (in module gettext): GNU gettext API. (line 26) +* textdomain() (in module locale): Access to message catalogs. + (line 12) +* TextFile (class in distutils.text_file): distutils text_file — The TextFile class. + (line 10) +* textinput() (in module turtle): Input methods. (line 6) +* TextIO (class in typing): Other concrete types. + (line 6) +* TextIOBase (class in io): Text I/O<2>. (line 6) +* TextIOWrapper (class in io): Text I/O<2>. (line 98) +* TextTestResult (class in unittest): Loading and running tests. + (line 426) +* TextTestRunner (class in unittest): Loading and running tests. + (line 441) +* TextWrapper (class in textwrap): textwrap — Text wrapping and filling. + (line 140) +* text_encoding() (in module io): High-level Module Interface. + (line 38) +* text_factory (sqlite3.Connection attribute): Connection objects. + (line 687) +* theme_create() (tkinter.ttk.Style method): Ttk Styling. (line 191) +* theme_names() (tkinter.ttk.Style method): Ttk Styling. (line 239) +* theme_settings() (tkinter.ttk.Style method): Ttk Styling. (line 201) +* theme_use() (tkinter.ttk.Style method): Ttk Styling. (line 243) +* THOUSEP (in module locale): locale — Internationalization services. + (line 236) +* Thread (class in threading): Thread Objects. (line 57) +* thread() (imaplib.IMAP4 method): IMAP4 Objects. (line 341) +* ThreadedChildWatcher (class in asyncio): Process Watchers. (line 84) +* ThreadingHTTPServer (class in http.server): http server — HTTP servers. + (line 37) +* ThreadingMixIn (class in socketserver): Server Creation Notes. + (line 28) +* ThreadingTCPServer (class in socketserver): Server Creation Notes. + (line 62) +* ThreadingUDPServer (class in socketserver): Server Creation Notes. + (line 62) +* threading_cleanup() (in module test.support.threading_helper): test support threading_helper — Utilities for threading tests. + (line 31) +* threading_setup() (in module test.support.threading_helper): test support threading_helper — Utilities for threading tests. + (line 37) +* ThreadPool (class in multiprocessing.pool): The multiprocessing dummy module. + (line 16) +* ThreadPoolExecutor (class in concurrent.futures): ThreadPoolExecutor. + (line 39) +* threads; POSIX: _thread — Low-level threading API. + (line 16) +* threadsafety (in module sqlite3): Module constants. (line 79) +* thread_info (in module sys): sys — System-specific parameters and functions. + (line 1712) +* thread_time() (in module time): Functions<4>. (line 534) +* thread_time_ns() (in module time): Functions<4>. (line 551) +* throw (2to3 fixer): Fixers. (line 303) +* throw() (coroutine method): Coroutine Objects. (line 33) +* throw() (generator method): Generator-iterator methods. + (line 38) +* THURSDAY (in module calendar): calendar — General calendar-related functions. + (line 387) +* ticket_lifetime_hint (ssl.SSLSession attribute): SSL session. + (line 18) +* tigetflag() (in module curses): Functions<5>. (line 513) +* tigetnum() (in module curses): Functions<5>. (line 520) +* tigetstr() (in module curses): Functions<5>. (line 527) +* TILDE (in module token): token — Constants used with Python parse trees. + (line 150) +* tilt() (in module turtle): Appearance. (line 102) +* tiltangle() (in module turtle): Appearance. (line 137) +* time (class in datetime): time Objects. (line 10) +* time (ssl.SSLSession attribute): SSL session. (line 14) +* time() (asyncio.loop method): Scheduling delayed callbacks. + (line 56) +* time() (datetime.datetime method): datetime Objects. (line 403) +* time() (in module time): Functions<4>. (line 503) +* Time2Internaldate() (in module imaplib): imaplib — IMAP4 protocol client. + (line 137) +* timedelta (class in datetime): timedelta Objects. (line 9) +* TimedRotatingFileHandler (class in logging.handlers): TimedRotatingFileHandler. + (line 10) +* timegm() (in module calendar): calendar — General calendar-related functions. + (line 352) +* timeit command line option; -h: Command-Line Interface<4>. + (line 44) +* timeit command line option; –help: Command-Line Interface<4>. + (line 44) +* timeit command line option; -n: Command-Line Interface<4>. + (line 13) +* timeit command line option; –number: Command-Line Interface<4>. + (line 13) +* timeit command line option; -p: Command-Line Interface<4>. + (line 25) +* timeit command line option; –process: Command-Line Interface<4>. + (line 25) +* timeit command line option; -r: Command-Line Interface<4>. + (line 17) +* timeit command line option; –repeat: Command-Line Interface<4>. + (line 17) +* timeit command line option; -s: Command-Line Interface<4>. + (line 21) +* timeit command line option; –setup: Command-Line Interface<4>. + (line 21) +* timeit command line option; -u: Command-Line Interface<4>. + (line 33) +* timeit command line option; –unit: Command-Line Interface<4>. + (line 33) +* timeit command line option; -v: Command-Line Interface<4>. + (line 40) +* timeit command line option; –verbose: Command-Line Interface<4>. + (line 40) +* timeit() (in module timeit): Python Interface. (line 8) +* timeit() (timeit.Timer method): Python Interface. (line 69) +* timeout: Exceptions<12>. (line 40) +* Timeout (class in asyncio): Timeouts. (line 51) +* timeout (socketserver.BaseServer attribute): Server Objects<2>. + (line 114) +* timeout (ssl.SSLSession attribute): SSL session. (line 16) +* timeout (subprocess.TimeoutExpired attribute): Using the subprocess Module. + (line 164) +* timeout() (curses.window method): Window Objects. (line 561) +* timeout() (in module asyncio): Timeouts. (line 6) +* TimeoutError: OS exceptions. (line 108) +* TimeoutError <1>: Process and exceptions. + (line 243) +* TimeoutError <2>: Exception classes. (line 10) +* TimeoutError <3>: Exceptions<10>. (line 10) +* TimeoutExpired: Using the subprocess Module. + (line 155) +* timeout_at() (in module asyncio): Timeouts. (line 105) +* TIMEOUT_MAX (in module threading): threading — Thread-based parallelism. + (line 208) +* TIMEOUT_MAX (in module _thread): _thread — Low-level threading API. + (line 129) +* Timer (class in threading): Timer Objects. (line 25) +* Timer (class in timeit): Python Interface. (line 39) +* TimerHandle (class in asyncio): Callback Handles. (line 22) +* times() (in module os): Process Management. (line 735) +* TIMESTAMP (py_compile.PycInvalidationMode attribute): py_compile — Compile Python source files. + (line 102) +* timestamp() (datetime.datetime method): datetime Objects. (line 554) +* timetuple() (datetime.date method): date Objects. (line 183) +* timetuple() (datetime.datetime method): datetime Objects. (line 509) +* timetz() (datetime.datetime method): datetime Objects. (line 412) +* timezone (class in datetime): timezone Objects. (line 14) +* timezone (in module time): Timezone Constants. (line 17) +* time_ns() (in module time): Functions<4>. (line 527) +* title() (bytearray method): Bytes and Bytearray Operations. + (line 682) +* title() (bytes method): Bytes and Bytearray Operations. + (line 682) +* title() (in module turtle): Methods specific to Screen not inherited from TurtleScreen. + (line 49) +* title() (str method): String Methods<2>. (line 604) +* Tix: tkinter tix — Extension widgets for Tk. + (line 8) +* tixCommand (class in tkinter.tix): Tix Commands. (line 6) +* tix_addbitmapdir() (tkinter.tix.tixCommand method): Tix Commands. + (line 47) +* tix_cget() (tkinter.tix.tixCommand method): Tix Commands. (line 32) +* tix_configure() (tkinter.tix.tixCommand method): Tix Commands. + (line 20) +* tix_filedialog() (tkinter.tix.tixCommand method): Tix Commands. + (line 57) +* tix_getbitmap() (tkinter.tix.tixCommand method): Tix Commands. + (line 37) +* tix_getimage() (tkinter.tix.tixCommand method): Tix Commands. + (line 68) +* tix_option_get() (tkinter.tix.tixCommand method): Tix Commands. + (line 82) +* tix_resetoptions() (tkinter.tix.tixCommand method): Tix Commands. + (line 86) +* Tk: Graphical User Interfaces with Tk. + (line 6) +* Tk (class in tkinter): Tkinter Modules. (line 14) +* Tk (class in tkinter.tix): Using Tix. (line 6) +* tk (tkinter.Tk attribute): Tkinter Modules. (line 70) +* Tk Option Data Types: Tk Option Data Types. + (line 6) +* Tkinter: Graphical User Interfaces with Tk. + (line 6) +* TK_LIBRARY: How do I freeze Tkinter applications?. + (line 11) +* TList (class in tkinter.tix): Tabular ListBox. (line 6) +* TLS: ssl — TLS/SSL wrapper for socket objects. + (line 8) +* TLSv1 (ssl.TLSVersion attribute): Constants<9>. (line 560) +* TLSv1_1 (ssl.TLSVersion attribute): Constants<9>. (line 562) +* TLSv1_2 (ssl.TLSVersion attribute): Constants<9>. (line 564) +* TLSv1_3 (ssl.TLSVersion attribute): Constants<9>. (line 566) +* TLSVersion (class in ssl): Constants<9>. (line 542) +* TMP: tempfile — Generate temporary files and directories. + (line 260) +* TMPDIR: tempfile — Generate temporary files and directories. + (line 256) +* ToASCII() (in module encodings.idna): encodings idna — Internationalized Domain Names in Applications. + (line 55) +* tobuf() (tarfile.TarInfo method): TarInfo Objects. (line 31) +* tobytes() (array.array method): array — Efficient arrays of numeric values. + (line 215) +* tobytes() (memoryview method): Memory Views. (line 160) +* today() (datetime.date class method): date Objects. (line 29) +* today() (datetime.datetime class method): datetime Objects. + (line 47) +* tofile() (array.array method): array — Efficient arrays of numeric values. + (line 224) +* token: Lexical analysis. (line 6) +* Token (class in contextvars): Context Variables. (line 75) +* token (shlex.shlex attribute): shlex Objects. (line 173) +* TokenError: Tokenizing Input. (line 107) +* tokenize command line option; -e: Command-Line Usage<3>. + (line 19) +* tokenize command line option; –exact: Command-Line Usage<3>. + (line 19) +* tokenize command line option; -h: Command-Line Usage<3>. + (line 15) +* tokenize command line option; –help: Command-Line Usage<3>. + (line 15) +* tokenize() (in module tokenize): Tokenizing Input. (line 8) +* token_bytes() (in module secrets): Generating tokens. (line 10) +* token_hex() (in module secrets): Generating tokens. (line 19) +* token_urlsafe() (in module secrets): Generating tokens. (line 28) +* tok_name (in module token): token — Constants used with Python parse trees. + (line 20) +* tolist() (array.array method): array — Efficient arrays of numeric values. + (line 229) +* tolist() (memoryview method): Memory Views. (line 201) +* TOMLDecodeError: tomllib — Parse TOML files. + (line 60) +* tomono() (in module audioop): audioop — Manipulate raw audio data. + (line 203) +* toordinal() (datetime.date method): date Objects. (line 198) +* toordinal() (datetime.datetime method): datetime Objects. (line 549) +* top() (curses.panel.Panel method): Panel Objects. (line 53) +* top() (poplib.POP3 method): POP3 Objects. (line 86) +* TopologicalSorter (class in graphlib): graphlib — Functionality to operate with graph-like structures. + (line 10) +* toprettyxml() (xml.dom.minidom.Node method): DOM Objects. (line 72) +* top_panel() (in module curses.panel): Functions<6>. (line 19) +* toreadonly() (memoryview method): Memory Views. (line 217) +* tostereo() (in module audioop): audioop — Manipulate raw audio data. + (line 209) +* tostring() (in module xml.etree.ElementTree): Functions<8>. + (line 217) +* tostringlist() (in module xml.etree.ElementTree): Functions<8>. + (line 239) +* total() (collections.Counter method): Counter objects. (line 103) +* total_changes (sqlite3.Connection attribute): Connection objects. + (line 725) +* total_nframe (tracemalloc.Traceback attribute): Traceback. (line 28) +* total_ordering() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 246) +* total_seconds() (datetime.timedelta method): timedelta Objects. + (line 245) +* touch() (pathlib.Path method): Methods<2>. (line 489) +* touchline() (curses.window method): Window Objects. (line 571) +* touchwin() (curses.window method): Window Objects. (line 578) +* tounicode() (array.array method): array — Efficient arrays of numeric values. + (line 233) +* ToUnicode() (in module encodings.idna): encodings idna — Internationalized Domain Names in Applications. + (line 60) +* towards() (in module turtle): Tell Turtle’s state. + (line 15) +* toxml() (xml.dom.minidom.Node method): DOM Objects. (line 52) +* to_bytes() (int method): Additional Methods on Integer Types. + (line 56) +* to_eng_string() (decimal.Context method): Context objects. (line 524) +* to_eng_string() (decimal.Decimal method): Decimal objects. (line 558) +* to_integral() (decimal.Decimal method): Decimal objects. (line 571) +* to_integral_exact() (decimal.Context method): Context objects. + (line 534) +* to_integral_exact() (decimal.Decimal method): Decimal objects. + (line 577) +* to_integral_value() (decimal.Decimal method): Decimal objects. + (line 585) +* to_sci_string() (decimal.Context method): Context objects. (line 538) +* to_thread() (in module asyncio): Running in Threads. (line 6) +* tparm() (in module curses): Functions<5>. (line 534) +* Trace (class in trace): Programmatic Interface. + (line 6) +* Trace (class in tracemalloc): Trace. (line 6) +* trace command line option; -c: Main options. (line 12) +* trace command line option; -C: Modifiers. (line 11) +* trace command line option; –count: Main options. (line 12) +* trace command line option; –coverdir: Modifiers. (line 11) +* trace command line option; -f: Modifiers. (line 6) +* trace command line option; –file: Modifiers. (line 6) +* trace command line option; -g: Modifiers. (line 33) +* trace command line option; –help: Command-Line Usage. (line 15) +* trace command line option; –ignore-dir: Filters. (line 14) +* trace command line option; –ignore-module: Filters. (line 8) +* trace command line option; -l: Main options. (line 23) +* trace command line option; –listfuncs: Main options. (line 23) +* trace command line option; -m: Modifiers. (line 17) +* trace command line option; –missing: Modifiers. (line 17) +* trace command line option; –no-report: Modifiers. (line 27) +* trace command line option; -r: Main options. (line 27) +* trace command line option; -R: Modifiers. (line 27) +* trace command line option; –report: Main options. (line 27) +* trace command line option; -s: Modifiers. (line 22) +* trace command line option; –summary: Modifiers. (line 22) +* trace command line option; -t: Main options. (line 19) +* trace command line option; -T: Main options. (line 33) +* trace command line option; –timing: Modifiers. (line 33) +* trace command line option; –trace: Main options. (line 19) +* trace command line option; –trackcalls: Main options. (line 33) +* trace command line option; –version: Command-Line Usage. (line 19) +* trace function: threading — Thread-based parallelism. + (line 159) +* trace function <1>: threading — Thread-based parallelism. + (line 166) +* trace function <2>: sys — System-specific parameters and functions. + (line 821) +* trace function <3>: sys — System-specific parameters and functions. + (line 1447) +* trace() (in module inspect): The interpreter stack. + (line 184) +* Traceback (class in inspect): The interpreter stack. + (line 55) +* Traceback (class in tracemalloc): Traceback. (line 6) +* traceback (tracemalloc.Statistic attribute): Statistic. (line 23) +* traceback (tracemalloc.StatisticDiff attribute): StatisticDiff. + (line 38) +* traceback (tracemalloc.Trace attribute): Trace. (line 27) +* TracebackException (class in traceback): TracebackException Objects. + (line 11) +* tracebacklimit (in module sys): sys — System-specific parameters and functions. + (line 1749) +* tracebacks; in CGI scripts: cgitb — Traceback manager for CGI scripts. + (line 8) +* TracebackType (class in types): Standard Interpreter Types. + (line 225) +* traceback_limit (tracemalloc.Snapshot attribute): Snapshot. + (line 83) +* traceback_limit (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 221) +* tracer() (in module turtle): Animation control. (line 23) +* traces (tracemalloc.Snapshot attribute): Snapshot. (line 89) +* trace_dispatch() (bdb.Bdb method): bdb — Debugger framework. + (line 164) +* trailing; comma: Expression lists. (line 24) +* transfercmd() (ftplib.FTP method): FTP Objects. (line 136) +* transient_internet() (in module test.support.socket_helper): test support socket_helper — Utilities for socket tests. + (line 64) +* translate() (bytearray method): Bytes and Bytearray Operations. + (line 258) +* translate() (bytes method): Bytes and Bytearray Operations. + (line 258) +* translate() (in module fnmatch): fnmatch — Unix filename pattern matching. + (line 76) +* translate() (str method): String Methods<2>. (line 638) +* translation() (in module gettext): Class-based API. (line 44) +* transport (asyncio.StreamWriter attribute): StreamWriter. (line 57) +* Transport (class in asyncio): Transports Hierarchy. + (line 29) +* Transport Layer Security: ssl — TLS/SSL wrapper for socket objects. + (line 8) +* Traversable (class in importlib.resources.abc): importlib resources abc – Abstract base classes for resources. + (line 85) +* TraversableResources (class in importlib.resources.abc): importlib resources abc – Abstract base classes for resources. + (line 134) +* traverseproc (C type): Supporting Cyclic Garbage Collection. + (line 142) +* Tree (class in tkinter.tix): Hierarchical ListBox. + (line 20) +* TreeBuilder (class in xml.etree.ElementTree): TreeBuilder Objects. + (line 6) +* Treeview (class in tkinter.ttk): ttk Treeview. (line 6) +* triangular() (in module random): Real-valued distributions. + (line 25) +* triple-quoted string: String and Bytes literals. + (line 36) +* triple-quoted string <1>: Glossary. (line 1312) +* True: The standard type hierarchy. + (line 98) +* true: Truth Value Testing. + (line 10) +* True <1>: Truth Value Testing. + (line 23) +* True <2>: Boolean Values. (line 15) +* True (built-in variable): Built-in Constants. (line 13) +* truediv() (in module operator): operator — Standard operators as functions. + (line 162) +* trunc() (in module math): Numeric Types — int float complex. + (line 104) +* trunc() (in module math) <1>: Number-theoretic and representation functions. + (line 267) +* truncate() (in module os): Files and Directories. + (line 1423) +* truncate() (io.IOBase method): I/O Base Classes. (line 141) +* truth() (in module operator): operator — Standard operators as functions. + (line 57) +* truth; value: Truth Value Testing. + (line 6) +* Try (class in ast): Control flow. (line 134) +* TryStar (class in ast): Control flow. (line 178) +* ttk: tkinter ttk — Tk themed widgets. + (line 8) +* tty; I/O control: termios — POSIX style tty control. + (line 6) +* ttyname() (in module os): File Descriptor Operations. + (line 770) +* TUESDAY (in module calendar): calendar — General calendar-related functions. + (line 387) +* tuple (built-in class): Tuples. (line 12) +* Tuple (class in ast): Literals<3>. (line 67) +* Tuple (in module typing): Special forms. (line 9) +* tuple_params (2to3 fixer): Fixers. (line 307) +* Turtle (class in turtle): Public classes. (line 16) +* turtles() (in module turtle): Settings and special methods. + (line 97) +* TurtleScreen (class in turtle): Public classes. (line 22) +* turtlesize() (in module turtle): Appearance. (line 52) +* type: The standard type hierarchy. + (line 6) +* type <1>: Glossary. (line 1322) +* type (built-in class): Built-in Functions. (line 1793) +* Type (class in typing): Special forms. (line 181) +* type (optparse.Option attribute): Option attributes. (line 19) +* type (socket.socket attribute): Socket Objects. (line 614) +* type (tarfile.TarInfo attribute): TarInfo Objects. (line 59) +* type (urllib.request.Request attribute): Request Objects. (line 21) +* type alias: Glossary. (line 1329) +* type hint: Glossary. (line 1351) +* type of an object: Objects values and types. + (line 11) +* type; hierarchy: The standard type hierarchy. + (line 6) +* typeahead() (in module curses): Functions<5>. (line 542) +* TypeAlias (in module typing): Special types. (line 142) +* typecode (array.array attribute): array — Efficient arrays of numeric values. + (line 104) +* typecodes (in module array): array — Efficient arrays of numeric values. + (line 91) +* TypedDict (class in typing): Other special directives. + (line 92) +* TYPED_ACTIONS (optparse.Option attribute): Adding new actions. + (line 39) +* typed_subpart_iterator() (in module email.iterators): email iterators Iterators. + (line 26) +* TypeError: Concrete exceptions. + (line 372) +* TypeGuard (in module typing): Special forms. (line 398) +* types (2to3 fixer): Fixers. (line 312) +* TYPES (optparse.Option attribute): Adding new types. (line 11) +* types, internal: The standard type hierarchy. + (line 690) +* types_map (in module mimetypes): mimetypes — Map filenames to MIME types. + (line 140) +* types_map (mimetypes.MimeTypes attribute): MimeTypes Objects. + (line 39) +* types_map_inv (mimetypes.MimeTypes attribute): MimeTypes Objects. + (line 47) +* TypeVar (class in typing): Building generic types. + (line 33) +* TypeVarTuple (class in typing): Building generic types. + (line 109) +* TYPE_CHECKER (optparse.Option attribute): Adding new types. + (line 16) +* TYPE_CHECKING (in module typing): Constant. (line 6) +* type_check_only() (in module typing): Functions and decorators. + (line 329) +* type_comment (ast.arg attribute): Function and class definitions. + (line 75) +* type_comment (ast.Assign attribute): Statements. (line 15) +* type_comment (ast.For attribute): Control flow. (line 54) +* type_comment (ast.FunctionDef attribute): Function and class definitions. + (line 23) +* type_comment (ast.With attribute): Control flow. (line 245) +* TYPE_COMMENT (in module token): token — Constants used with Python parse trees. + (line 250) +* TYPE_IGNORE (in module token): token — Constants used with Python parse trees. + (line 248) +* TZ: Functions<4>. (line 561) +* TZ <1>: Functions<4>. (line 562) +* TZ <2>: Functions<4>. (line 570) +* TZ <3>: Functions<4>. (line 575) +* TZ <4>: Functions<4>. (line 577) +* TZ <5>: Functions<4>. (line 637) +* tzinfo (class in datetime): tzinfo Objects. (line 6) +* tzinfo (datetime.datetime attribute): datetime Objects. (line 301) +* tzinfo (datetime.time attribute): time Objects. (line 66) +* tzname (in module time): Timezone Constants. (line 23) +* tzname() (datetime.datetime method): datetime Objects. (line 503) +* tzname() (datetime.time method): time Objects. (line 259) +* tzname() (datetime.timezone method): timezone Objects. (line 42) +* tzname() (datetime.tzinfo method): tzinfo Objects. (line 123) +* TZPATH (in module zoneinfo): Globals. (line 6) +* tzset() (in module time): Functions<4>. (line 558) +* T_FMT (in module locale): locale — Internationalization services. + (line 201) +* T_FMT_AMPM (in module locale): locale — Internationalization services. + (line 207) +* u"; string literal: Literals. (line 8) +* u’; string literal: Literals. (line 8) +* u-LAW: aifc — Read and write AIFF and AIFC files. + (line 163) +* u-LAW <1>: audioop — Manipulate raw audio data. + (line 20) +* u-LAW <2>: sndhdr — Determine type of sound file. + (line 8) +* UAdd (class in ast): Expressions<2>. (line 28) +* ucd_3_2_0 (in module unicodedata): unicodedata — Unicode Database. + (line 131) +* udata (select.kevent attribute): Kevent Objects. (line 179) +* UDPServer (class in socketserver): socketserver — A framework for network servers. + (line 30) +* UF_APPEND (in module stat): stat — Interpreting stat results. + (line 346) +* UF_COMPRESSED (in module stat): stat — Interpreting stat results. + (line 358) +* UF_HIDDEN (in module stat): stat — Interpreting stat results. + (line 362) +* UF_IMMUTABLE (in module stat): stat — Interpreting stat results. + (line 342) +* UF_NODUMP (in module stat): stat — Interpreting stat results. + (line 338) +* UF_NOUNLINK (in module stat): stat — Interpreting stat results. + (line 354) +* UF_OPAQUE (in module stat): stat — Interpreting stat results. + (line 350) +* UID (class in plistlib): plistlib — Generate and parse Apple plist files. + (line 122) +* uid (tarfile.TarInfo attribute): TarInfo Objects. (line 72) +* uid() (imaplib.IMAP4 method): IMAP4 Objects. (line 364) +* uidl() (poplib.POP3 method): POP3 Objects. (line 98) +* ulaw2lin() (in module audioop): audioop — Manipulate raw audio data. + (line 216) +* ULONG_MAX: Integer Objects. (line 196) +* ulp() (in module math): Number-theoretic and representation functions. + (line 276) +* umask() (in module os): Process Parameters. (line 484) +* unalias (pdb command): Debugger Commands. (line 312) +* uname (tarfile.TarInfo attribute): TarInfo Objects. (line 80) +* uname() (in module os): Process Parameters. (line 491) +* uname() (in module platform): Cross Platform. (line 136) +* unary; arithmetic; operation: Unary arithmetic and bitwise operations. + (line 6) +* unary; bitwise; operation: Unary arithmetic and bitwise operations. + (line 6) +* unaryfunc (C type): Slot Type typedefs. (line 105) +* UnaryOp (class in ast): Expressions<2>. (line 23) +* UNARY_INVERT (opcode): Python Bytecode Instructions. + (line 134) +* UNARY_NEGATIVE (opcode): Python Bytecode Instructions. + (line 126) +* UNARY_NOT (opcode): Python Bytecode Instructions. + (line 130) +* UNARY_POSITIVE (opcode): Python Bytecode Instructions. + (line 122) +* unbinding; name: The del statement<2>. + (line 15) +* UnboundLocalError: Resolution of names. + (line 16) +* UnboundLocalError <1>: Concrete exceptions. + (line 390) +* unbuffered I/O: Built-in Functions. (line 1307) +* UNC paths; and os.makedirs(): Files and Directories. + (line 459) +* uncancel() (asyncio.Task method): Task Object. (line 238) +* UNCHECKED_HASH (py_compile.PycInvalidationMode attribute): py_compile — Compile Python source files. + (line 115) +* unconsumed_tail (zlib.Decompress attribute): zlib — Compression compatible with gzip. + (line 243) +* unctrl() (in module curses): Functions<5>. (line 554) +* unctrl() (in module curses.ascii): curses ascii — Utilities for ASCII characters. + (line 226) +* undefine_macro() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 170) +* Underflow (class in decimal): Signals. (line 93) +* undisplay (pdb command): Debugger Commands. (line 272) +* undo() (in module turtle): Turtle motion. (line 291) +* undobufferentries() (in module turtle): Special Turtle methods. + (line 74) +* undoc_header (cmd.Cmd attribute): Cmd Objects. (line 164) +* unescape() (in module html): html — HyperText Markup Language support. + (line 23) +* unescape() (in module xml.sax.saxutils): xml sax saxutils — SAX Utilities. + (line 24) +* UnexpectedException: Debugging. (line 208) +* unexpectedSuccesses (unittest.TestResult attribute): Loading and running tests. + (line 267) +* unfreeze() (in module gc): gc — Garbage Collector interface. + (line 214) +* ungetch() (in module curses): Functions<5>. (line 561) +* ungetch() (in module msvcrt): Console I/O. (line 44) +* ungetmouse() (in module curses): Functions<5>. (line 583) +* ungetwch() (in module msvcrt): Console I/O. (line 50) +* unget_wch() (in module curses): Functions<5>. (line 574) +* unhexlify() (in module binascii): binascii — Convert between binary and ASCII. + (line 144) +* Unicode: The standard type hierarchy. + (line 161) +* Unicode <1>: unicodedata — Unicode Database. + (line 6) +* Unicode <2>: codecs — Codec registry and base classes. + (line 8) +* unicode (2to3 fixer): Fixers. (line 317) +* Unicode Consortium: String and Bytes literals. + (line 36) +* Unicode; database: unicodedata — Unicode Database. + (line 6) +* UnicodeDecodeError: Concrete exceptions. + (line 430) +* UnicodeEncodeError: Concrete exceptions. + (line 425) +* UnicodeError: Concrete exceptions. + (line 396) +* UnicodeTranslateError: Concrete exceptions. + (line 435) +* UnicodeWarning: Warnings. (line 64) +* unidata_version (in module unicodedata): unicodedata — Unicode Database. + (line 127) +* unified_diff() (in module difflib): difflib — Helpers for computing deltas. + (line 294) +* uniform() (in module random): Real-valued distributions. + (line 16) +* UnimplementedFileMode: http client — HTTP protocol client. + (line 160) +* Union (class in ctypes): Structured data types. + (line 6) +* Union (in module typing): Special forms. (line 26) +* union() (frozenset method): Set Types — set frozenset. + (line 96) +* union; type: Union Type. (line 6) +* UnionType (class in types): Standard Interpreter Types. + (line 219) +* UNIQUE (enum.EnumCheck attribute): Data Types<2>. (line 481) +* unique() (in module enum): Utilities and Decorators. + (line 36) +* unittest command line option; -b: Command-line options<3>. + (line 8) +* unittest command line option; –buffer: Command-line options<3>. + (line 8) +* unittest command line option; -c: Command-line options<3>. + (line 15) +* unittest command line option; –catch: Command-line options<3>. + (line 15) +* unittest command line option; -f: Command-line options<3>. + (line 24) +* unittest command line option; –failfast: Command-line options<3>. + (line 24) +* unittest command line option; -k: Command-line options<3>. + (line 28) +* unittest command line option; –locals: Command-line options<3>. + (line 45) +* unittest-discover command line option; -p: Test Discovery. (line 35) +* unittest-discover command line option; –pattern: Test Discovery. + (line 35) +* unittest-discover command line option; -s: Test Discovery. (line 31) +* unittest-discover command line option; –start-directory: Test Discovery. + (line 31) +* unittest-discover command line option; -t: Test Discovery. (line 39) +* unittest-discover command line option; –top-level-directory: Test Discovery. + (line 39) +* unittest-discover command line option; -v: Test Discovery. (line 27) +* unittest-discover command line option; –verbose: Test Discovery. + (line 27) +* universal newlines: Glossary. (line 1368) +* universal newlines; bytearray.splitlines method: Bytes and Bytearray Operations. + (line 633) +* universal newlines; bytes.splitlines method: Bytes and Bytearray Operations. + (line 633) +* universal newlines; csv.reader function: Module Contents<3>. + (line 8) +* universal newlines; importlib.abc.InspectLoader.get_source method: importlib abc – Abstract base classes related to import. + (line 336) +* universal newlines; io.IncrementalNewlineDecoder class: Text I/O<2>. + (line 249) +* universal newlines; io.TextIOWrapper class: Text I/O<2>. (line 125) +* universal newlines; open() built-in function: Built-in Functions. + (line 1245) +* universal newlines; str.splitlines method: String Methods<2>. + (line 494) +* universal newlines; subprocess module: Frequently Used Arguments. + (line 34) +* universal newlines; What’s new: PEP 3116 New I/O Library. + (line 42) +* universal newlines; What’s new <1>: New Improved and Removed Modules. + (line 138) +* universal newlines; What’s new <2>: PEP 324 New subprocess Module. + (line 36) +* universal newlines; What’s new <3>: PEP 277 Unicode file name support for Windows NT. + (line 36) +* UNIX: Complete Python programs. + (line 25) +* UNIX; file control: fcntl — The fcntl and ioctl system calls. + (line 6) +* UNIX; I/O control: fcntl — The fcntl and ioctl system calls. + (line 6) +* UnixDatagramServer (class in socketserver): socketserver — A framework for network servers. + (line 37) +* UnixStreamServer (class in socketserver): socketserver — A framework for network servers. + (line 37) +* unix_dialect (class in csv): Module Contents<3>. (line 209) +* unix_shell (in module test.support): test support — Utilities for the Python test suite. + (line 44) +* unknown (uuid.SafeUUID attribute): uuid — UUID objects according to RFC 4122. + (line 42) +* UnknownHandler (class in urllib.request): urllib request — Extensible library for opening URLs. + (line 438) +* UnknownProtocol: http client — HTTP protocol client. + (line 152) +* UnknownTransferEncoding: http client — HTTP protocol client. + (line 156) +* unknown_decl() (html.parser.HTMLParser method): HTMLParser Methods. + (line 137) +* unknown_open() (urllib.request.BaseHandler method): BaseHandler Objects. + (line 56) +* unknown_open() (urllib.request.UnknownHandler method): UnknownHandler Objects. + (line 6) +* unlink() (in module os): Files and Directories. + (line 1441) +* unlink() (in module test.support.os_helper): test support os_helper — Utilities for os tests. + (line 164) +* unlink() (multiprocessing.shared_memory.SharedMemory method): multiprocessing shared_memory — Shared memory for direct access across processes. + (line 73) +* unlink() (pathlib.Path method): Methods<2>. (line 498) +* unlink() (xml.dom.minidom.Node method): DOM Objects. (line 10) +* unload() (in module test.support.import_helper): test support import_helper — Utilities for import tests. + (line 76) +* unlock() (mailbox.Babyl method): Babyl. (line 59) +* unlock() (mailbox.Mailbox method): Mailbox objects. (line 258) +* unlock() (mailbox.Maildir method): Maildir. (line 107) +* unlock() (mailbox.mbox method): mbox. (line 39) +* unlock() (mailbox.MH method): MH. (line 84) +* unlock() (mailbox.MMDF method): MMDF. (line 35) +* Unpack (in module typing): Building generic types. + (line 208) +* unpack() (in module struct): Functions and Exceptions. + (line 26) +* unpack() (struct.Struct method): Classes<2>. (line 35) +* Unpacker (class in xdrlib): xdrlib — Encode and decode XDR data. + (line 27) +* unpacking; dictionary: Dictionary displays. + (line 23) +* unpacking; in function calls: Calls. (line 73) +* unpack_archive() (in module shutil): Archiving operations. + (line 113) +* unpack_array() (xdrlib.Unpacker method): Unpacker Objects. (line 91) +* unpack_bytes() (xdrlib.Unpacker method): Unpacker Objects. (line 70) +* unpack_double() (xdrlib.Unpacker method): Unpacker Objects. + (line 40) +* UNPACK_EX (opcode): Python Bytecode Instructions. + (line 439) +* unpack_farray() (xdrlib.Unpacker method): Unpacker Objects. + (line 85) +* unpack_float() (xdrlib.Unpacker method): Unpacker Objects. (line 36) +* unpack_fopaque() (xdrlib.Unpacker method): Unpacker Objects. + (line 54) +* unpack_from() (in module struct): Functions and Exceptions. + (line 34) +* unpack_from() (struct.Struct method): Classes<2>. (line 41) +* unpack_fstring() (xdrlib.Unpacker method): Unpacker Objects. + (line 48) +* unpack_list() (xdrlib.Unpacker method): Unpacker Objects. (line 77) +* unpack_opaque() (xdrlib.Unpacker method): Unpacker Objects. + (line 65) +* UNPACK_SEQUENCE (opcode): Python Bytecode Instructions. + (line 434) +* unpack_string() (xdrlib.Unpacker method): Unpacker Objects. + (line 59) +* unparse() (in module ast): ast Helpers. (line 57) +* unparsedEntityDecl() (xml.sax.handler.DTDHandler method): DTDHandler Objects. + (line 12) +* UnparsedEntityDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 249) +* Unpickler (class in pickle): Module Interface. (line 226) +* UnpicklingError: Module Interface. (line 108) +* unquote() (in module email.utils): email utils Miscellaneous utilities. + (line 52) +* unquote() (in module urllib.parse): URL Quoting. (line 61) +* unquote_plus() (in module urllib.parse): URL Quoting. (line 81) +* unquote_to_bytes() (in module urllib.parse): URL Quoting. (line 91) +* unraisablehook() (in module sys): sys — System-specific parameters and functions. + (line 1757) +* unreachable object: Objects values and types. + (line 37) +* unreadline() (distutils.text_file.TextFile method): distutils text_file — The TextFile class. + (line 130) +* unrecognized escape sequence: String and Bytes literals. + (line 171) +* unregister() (in module atexit): atexit — Exit handlers. + (line 43) +* unregister() (in module codecs): codecs — Codec registry and base classes. + (line 161) +* unregister() (in module faulthandler): Dumping the traceback on a user signal. + (line 23) +* unregister() (select.devpoll method): /dev/poll Polling Objects. + (line 55) +* unregister() (select.epoll method): Edge and Level Trigger Polling epoll Objects. + (line 89) +* unregister() (select.poll method): Polling Objects. (line 67) +* unregister() (selectors.BaseSelector method): Classes<3>. (line 80) +* unregister_archive_format() (in module shutil): Archiving operations. + (line 108) +* unregister_dialect() (in module csv): Module Contents<3>. (line 80) +* unregister_unpack_format() (in module shutil): Archiving operations. + (line 157) +* unsafe (uuid.SafeUUID attribute): uuid — UUID objects according to RFC 4122. + (line 38) +* unselect() (imaplib.IMAP4 method): IMAP4 Objects. (line 375) +* unset() (test.support.os_helper.EnvironmentVarGuard method): test support os_helper — Utilities for os tests. + (line 71) +* unsetenv() (in module os): Process Parameters. (line 521) +* UnstructuredHeader (class in email.headerregistry): email headerregistry Custom Header Objects. + (line 115) +* unsubscribe() (imaplib.IMAP4 method): IMAP4 Objects. (line 371) +* UnsupportedOperation: High-level Module Interface. + (line 72) +* until (pdb command): Debugger Commands. (line 182) +* untokenize() (in module tokenize): Tokenizing Input. (line 57) +* untouchwin() (curses.window method): Window Objects. (line 583) +* unused_data (bz2.BZ2Decompressor attribute): Incremental de compression. + (line 78) +* unused_data (lzma.LZMADecompressor attribute): Compressing and decompressing data in memory. + (line 169) +* unused_data (zlib.Decompress attribute): zlib — Compression compatible with gzip. + (line 235) +* unverifiable (urllib.request.Request attribute): Request Objects. + (line 47) +* unwrap() (in module inspect): Classes and functions<2>. + (line 138) +* unwrap() (in module urllib.parse): URL Parsing. (line 385) +* unwrap() (ssl.SSLSocket method): SSL Sockets. (line 279) +* up (pdb command): Debugger Commands. (line 71) +* up() (in module turtle): Drawing state. (line 12) +* update() (collections.Counter method): Counter objects. (line 121) +* update() (dict method): Mapping Types — dict. + (line 206) +* update() (frozenset method): Set Types — set frozenset. + (line 169) +* update() (hashlib.hash method): Hash algorithms. (line 125) +* update() (hmac.HMAC method): hmac — Keyed-Hashing for Message Authentication. + (line 47) +* update() (http.cookies.Morsel method): Morsel Objects. (line 94) +* update() (in module turtle): Animation control. (line 46) +* update() (mailbox.Mailbox method): Mailbox objects. (line 227) +* update() (mailbox.Maildir method): Maildir. (line 91) +* update() (trace.CoverageResults method): Programmatic Interface. + (line 52) +* update_abstractmethods() (in module abc): abc — Abstract Base Classes. + (line 337) +* update_authenticated() (urllib.request.HTTPPasswordMgrWithPriorAuth method): HTTPPasswordMgrWithPriorAuth Objects. + (line 24) +* update_lines_cols() (in module curses): Functions<5>. (line 567) +* update_panels() (in module curses.panel): Functions<6>. (line 23) +* update_visible() (mailbox.BabylMessage method): BabylMessage. + (line 76) +* update_wrapper() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 605) +* upgrade_dependencies() (venv.EnvBuilder method): API<2>. (line 117) +* upper() (bytearray method): Bytes and Bytearray Operations. + (line 725) +* upper() (bytes method): Bytes and Bytearray Operations. + (line 725) +* upper() (str method): String Methods<2>. (line 656) +* urandom() (in module os): Random numbers<2>. (line 29) +* URL: urllib parse — Parse URLs into components. + (line 8) +* URL <1>: urllib robotparser — Parser for robots txt. + (line 8) +* URL <2>: http server — HTTP servers. + (line 8) +* URL <3>: cgi — Common Gateway Interface support. + (line 8) +* url (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 51) +* url (urllib.response.addinfourl attribute): urllib response — Response classes used by urllib. + (line 14) +* url (xmlrpc.client.ProtocolError attribute): ProtocolError Objects. + (line 13) +* url2pathname() (in module urllib.request): urllib request — Extensible library for opening URLs. + (line 157) +* URL; parsing: urllib parse — Parse URLs into components. + (line 8) +* urlcleanup() (in module urllib.request): Legacy interface. (line 62) +* urldefrag() (in module urllib.parse): URL Parsing. (line 359) +* urlencode() (in module urllib.parse): URL Quoting. (line 104) +* URLError: urllib error — Exception classes raised by urllib request. + (line 17) +* urljoin() (in module urllib.parse): URL Parsing. (line 329) +* urllib (2to3 fixer): Fixers. (line 321) +* urlopen() (in module urllib.request): urllib request — Extensible library for opening URLs. + (line 27) +* URLopener (class in urllib.request): Legacy interface. (line 67) +* urlparse() (in module urllib.parse): URL Parsing. (line 9) +* urlretrieve() (in module urllib.request): Legacy interface. + (line 10) +* urlsafe_b64decode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 94) +* urlsafe_b64encode() (in module base64): base64 — Base16 Base32 Base64 Base85 Data Encodings. + (line 87) +* urlsplit() (in module urllib.parse): URL Parsing. (line 247) +* urlunparse() (in module urllib.parse): URL Parsing. (line 239) +* urlunsplit() (in module urllib.parse): URL Parsing. (line 320) +* urn (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 137) +* UseForeignDTD() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 63) +* USER: getpass — Portable password input. + (line 43) +* user() (poplib.POP3 method): POP3 Objects. (line 31) +* user-defined; function: The standard type hierarchy. + (line 302) +* user-defined; function; call: Calls. (line 132) +* user-defined; method: The standard type hierarchy. + (line 396) +* user; effective id: Process Parameters. (line 182) +* user; id: Process Parameters. (line 317) +* user; id, setting: Process Parameters. (line 467) +* UserDict (class in collections): UserDict objects. (line 12) +* UserList (class in collections): UserList objects. (line 16) +* USERNAME: os path — Common pathname manipulations. + (line 144) +* USERNAME <1>: Process Parameters. (line 233) +* USERNAME <2>: getpass — Portable password input. + (line 44) +* username (email.headerregistry.Address attribute): email headerregistry Custom Header Objects. + (line 431) +* USERPROFILE: os path<2>. (line 14) +* USERPROFILE <1>: Changes in the Python API<3>. + (line 116) +* USERPROFILE <2>: Windows<25>. (line 15) +* USERPROFILE <3>: os path — Common pathname manipulations. + (line 141) +* USERPROFILE <4>: Location and names of config files. + (line 67) +* userptr() (curses.panel.Panel method): Panel Objects. (line 57) +* UserString (class in collections): UserString objects. (line 12) +* UserWarning: Warnings. (line 13) +* USER_BASE: New and Improved Modules. + (line 469) +* USER_BASE (in module site): Module contents<5>. (line 30) +* user_call() (bdb.Bdb method): bdb — Debugger framework. + (line 268) +* user_exception() (bdb.Bdb method): bdb — Debugger framework. + (line 284) +* user_line() (bdb.Bdb method): bdb — Debugger framework. + (line 273) +* user_return() (bdb.Bdb method): bdb — Debugger framework. + (line 279) +* USER_SITE (in module site): Module contents<5>. (line 19) +* use_default_colors() (in module curses): Functions<5>. (line 598) +* use_env() (in module curses): Functions<5>. (line 588) +* use_rawinput (cmd.Cmd attribute): Cmd Objects. (line 175) +* USTAR_FORMAT (in module tarfile): tarfile — Read and write tar archive files. + (line 229) +* USub (class in ast): Expressions<2>. (line 28) +* UTC: time — Time access and conversions. + (line 39) +* utc (datetime.timezone attribute): timezone Objects. (line 68) +* UTC (in module datetime): Constants. (line 18) +* utcfromtimestamp() (datetime.datetime class method): datetime Objects. + (line 124) +* utcnow() (datetime.datetime class method): datetime Objects. + (line 77) +* utcoffset() (datetime.datetime method): datetime Objects. (line 483) +* utcoffset() (datetime.time method): time Objects. (line 239) +* utcoffset() (datetime.timezone method): timezone Objects. (line 30) +* utcoffset() (datetime.tzinfo method): tzinfo Objects. (line 38) +* utctimetuple() (datetime.datetime method): datetime Objects. + (line 528) +* utf8 (email.policy.EmailPolicy attribute): email policy Policy Objects. + (line 363) +* utf8() (poplib.POP3 method): POP3 Objects. (line 105) +* utf8_enabled (imaplib.IMAP4 attribute): IMAP4 Objects. (line 403) +* utime() (in module os): Files and Directories. + (line 1455) +* UUID (class in uuid): uuid — UUID objects according to RFC 4122. + (line 47) +* uuid1: uuid — UUID objects according to RFC 4122. + (line 188) +* uuid1() (in module uuid): uuid — UUID objects according to RFC 4122. + (line 180) +* uuid3: uuid — UUID objects according to RFC 4122. + (line 193) +* uuid3() (in module uuid): uuid — UUID objects according to RFC 4122. + (line 188) +* uuid4: uuid — UUID objects according to RFC 4122. + (line 197) +* uuid4() (in module uuid): uuid — UUID objects according to RFC 4122. + (line 193) +* uuid5: uuid — UUID objects according to RFC 4122. + (line 202) +* uuid5() (in module uuid): uuid — UUID objects according to RFC 4122. + (line 197) +* UuidCreate() (in module msilib): msilib — Read and write Microsoft Installer files. + (line 41) +* v4_int_to_packed() (in module ipaddress): Other Module Level Functions. + (line 8) +* v6_int_to_packed() (in module ipaddress): Other Module Level Functions. + (line 20) +* validator() (in module wsgiref.validate): wsgiref validate — WSGI conformance checker. + (line 22) +* valid_signals() (in module signal): Module contents<2>. (line 297) +* value (ctypes._SimpleCData attribute): Fundamental data types<2>. + (line 17) +* value (enum.Enum attribute): Data Types<2>. (line 86) +* value (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 32) +* value (http.cookies.Morsel attribute): Morsel Objects. (line 52) +* value (xml.dom.Attr attribute): Attr Objects. (line 23) +* value of an object: Objects values and types. + (line 11) +* Value() (in module multiprocessing): Shared ctypes Objects. + (line 9) +* Value() (in module multiprocessing.sharedctypes): The multiprocessing sharedctypes module. + (line 67) +* Value() (multiprocessing.managers.SyncManager method): Managers. + (line 217) +* ValueError: Concrete exceptions. + (line 440) +* valuerefs() (weakref.WeakValueDictionary method): weakref — Weak references. + (line 199) +* values() (contextvars.Context method): Manual Context Management. + (line 104) +* values() (dict method): Mapping Types — dict. + (line 217) +* values() (email.message.EmailMessage method): email message Representing an email message. + (line 236) +* values() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 344) +* values() (mailbox.Mailbox method): Mailbox objects. (line 114) +* values() (types.MappingProxyType method): Standard Interpreter Types. + (line 312) +* ValuesView (class in collections.abc): Collections Abstract Base Classes – Detailed Descriptions. + (line 88) +* ValuesView (class in typing): Corresponding to collections in collections abc. + (line 113) +* value_decode() (http.cookies.BaseCookie method): Cookie Objects. + (line 6) +* value_encode() (http.cookies.BaseCookie method): Cookie Objects. + (line 13) +* var (contextvars.Token attribute): Context Variables. (line 82) +* variable annotation: Glossary. (line 1376) +* variance (statistics.NormalDist attribute): NormalDist objects. + (line 40) +* variance() (in module statistics): Function details. (line 360) +* variant (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 141) +* VBAR (in module token): token — Constants used with Python parse trees. + (line 98) +* vbar (tkinter.scrolledtext.ScrolledText attribute): tkinter scrolledtext — Scrolled Text Widget. + (line 30) +* VBAREQUAL (in module token): token — Constants used with Python parse trees. + (line 194) +* Vec2D (class in turtle): Public classes. (line 86) +* vectorcallfunc (C type): The Vectorcall Protocol. + (line 34) +* VERBOSE (in module re): Flags. (line 104) +* verbose (in module tabnanny): tabnanny — Detection of ambiguous indentation. + (line 26) +* verbose (in module test.support): test support — Utilities for the Python test suite. + (line 30) +* verify() (in module enum): Utilities and Decorators. + (line 55) +* verify() (smtplib.SMTP method): SMTP Objects. (line 91) +* VerifyFlags (class in ssl): Constants<9>. (line 130) +* VerifyMode (class in ssl): Constants<9>. (line 64) +* VERIFY_ALLOW_PROXY_CERTS (in module ssl): Constants<9>. (line 103) +* verify_client_post_handshake() (ssl.SSLSocket method): SSL Sockets. + (line 288) +* verify_code (ssl.SSLCertVerificationError attribute): Exceptions<13>. + (line 86) +* VERIFY_CRL_CHECK_CHAIN (in module ssl): Constants<9>. (line 89) +* VERIFY_CRL_CHECK_LEAF (in module ssl): Constants<9>. (line 78) +* VERIFY_DEFAULT (in module ssl): Constants<9>. (line 70) +* verify_flags (ssl.SSLContext attribute): SSL Contexts. (line 620) +* verify_message (ssl.SSLCertVerificationError attribute): Exceptions<13>. + (line 90) +* verify_mode (ssl.SSLContext attribute): SSL Contexts. (line 635) +* verify_request() (socketserver.BaseServer method): Server Objects<2>. + (line 175) +* VERIFY_X509_PARTIAL_CHAIN (in module ssl): Constants<9>. (line 119) +* VERIFY_X509_STRICT (in module ssl): Constants<9>. (line 96) +* VERIFY_X509_TRUSTED_FIRST (in module ssl): Constants<9>. (line 110) +* version (email.headerregistry.MIMEVersionHeader attribute): email headerregistry Custom Header Objects. + (line 242) +* version (http.client.HTTPResponse attribute): HTTPResponse Objects. + (line 46) +* version (http.cookiejar.Cookie attribute): Cookie Objects<2>. + (line 20) +* version (in module curses): Constants<6>. (line 18) +* version (in module marshal): marshal — Internal Python object serialization. + (line 110) +* version (in module sqlite3): Module constants. (line 119) +* version (in module sys): sys — System-specific parameters and functions. + (line 1802) +* version (in module sys) <1>: Process-wide parameters. + (line 217) +* version (in module sys) <2>: Process-wide parameters. + (line 254) +* version (in module sys) <3>: Process-wide parameters. + (line 265) +* version (ipaddress.IPv4Address attribute): Address objects. + (line 51) +* version (ipaddress.IPv4Network attribute): Network objects. + (line 63) +* version (ipaddress.IPv6Address attribute): Address objects. + (line 212) +* version (ipaddress.IPv6Network attribute): Network objects. + (line 293) +* version (urllib.request.URLopener attribute): Legacy interface. + (line 139) +* version (uuid.UUID attribute): uuid — UUID objects according to RFC 4122. + (line 148) +* version() (in module ensurepip): Module API. (line 8) +* version() (in module platform): Cross Platform. (line 131) +* version() (ssl.SSLSocket method): SSL Sockets. (line 310) +* version_info (in module sqlite3): Module constants. (line 124) +* version_info (in module sys): sys — System-specific parameters and functions. + (line 1817) +* version_string() (http.server.BaseHTTPRequestHandler method): http server — HTTP servers. + (line 314) +* vformat() (string.Formatter method): Custom String Formatting. + (line 26) +* virtual environment: Glossary. (line 1399) +* virtual machine: Glossary. (line 1408) +* VIRTUAL_ENV: Creating virtual environments. + (line 134) +* visit() (ast.NodeVisitor method): ast Helpers. (line 172) +* visitproc (C type): Supporting Cyclic Garbage Collection. + (line 130) +* vline() (curses.window method): Window Objects. (line 588) +* voidcmd() (ftplib.FTP method): FTP Objects. (line 74) +* volume (zipfile.ZipInfo attribute): ZipInfo Objects. (line 119) +* vonmisesvariate() (in module random): Real-valued distributions. + (line 89) +* wait() (asyncio.Barrier method): Barrier. (line 52) +* wait() (asyncio.Condition method): Condition. (line 85) +* wait() (asyncio.Event method): Event. (line 44) +* wait() (asyncio.subprocess.Process method): Interacting with Subprocesses. + (line 38) +* wait() (in module asyncio): Waiting Primitives. (line 6) +* wait() (in module concurrent.futures): Module Functions. (line 6) +* wait() (in module multiprocessing.connection): Listeners and Clients. + (line 113) +* wait() (in module os): Process Management. (line 763) +* wait() (multiprocessing.pool.AsyncResult method): Process Pools. + (line 204) +* wait() (subprocess.Popen method): Popen Objects. (line 13) +* wait() (threading.Barrier method): Barrier Objects. (line 43) +* wait() (threading.Condition method): Condition Objects. (line 97) +* wait() (threading.Event method): Event Objects. (line 41) +* wait3() (in module os): Process Management. (line 889) +* wait4() (in module os): Process Management. (line 903) +* waitid() (in module os): Process Management. (line 782) +* waitpid() (in module os): Process Management. (line 847) +* waitstatus_to_exitcode() (in module os): Process Management. + (line 917) +* wait_closed() (asyncio.Server method): Server Objects. (line 95) +* wait_closed() (asyncio.StreamWriter method): StreamWriter. (line 107) +* wait_for() (asyncio.Condition method): Condition. (line 97) +* wait_for() (in module asyncio): Timeouts. (line 125) +* wait_for() (threading.Condition method): Condition Objects. + (line 128) +* wait_process() (in module test.support): test support — Utilities for the Python test suite. + (line 396) +* wait_threads_exit() (in module test.support.threading_helper): test support threading_helper — Utilities for threading tests. + (line 41) +* walk() (email.message.EmailMessage method): email message Representing an email message. + (line 467) +* walk() (email.message.Message method): email message Message Representing an email message using the compat32 API. + (line 636) +* walk() (in module ast): ast Helpers. (line 155) +* walk() (in module os): Files and Directories. + (line 1499) +* walk_packages() (in module pkgutil): pkgutil — Package extension utility. + (line 162) +* walk_stack() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 175) +* walk_tb() (in module traceback): traceback — Print or retrieve a stack traceback. + (line 184) +* walrus operator: Boolean operations. (line 38) +* want (doctest.Example attribute): Example Objects. (line 23) +* warn() (distutils.ccompiler.CCompiler method): distutils ccompiler — CCompiler base class. + (line 504) +* warn() (distutils.text_file.TextFile method): distutils text_file — The TextFile class. + (line 101) +* warn() (in module warnings): Available Functions. + (line 6) +* Warning: Warnings. (line 9) +* Warning <1>: Exceptions<6>. (line 8) +* warning() (in module logging): Module-Level Functions. + (line 129) +* warning() (logging.Logger method): Logger Objects. (line 237) +* warning() (xml.sax.handler.ErrorHandler method): ErrorHandler Objects. + (line 29) +* warnings: warnings — Warning control. + (line 8) +* WarningsRecorder (class in test.support.warnings_helper): test support warnings_helper — Utilities for warnings tests. + (line 104) +* warnoptions (in module sys): sys — System-specific parameters and functions. + (line 1830) +* warn_explicit() (in module warnings): Available Functions. + (line 32) +* wasSuccessful() (unittest.TestResult method): Loading and running tests. + (line 306) +* WatchedFileHandler (class in logging.handlers): WatchedFileHandler. + (line 24) +* WCONTINUED (in module os): Process Management. (line 960) +* WCOREDUMP() (in module os): Process Management. (line 981) +* WeakKeyDictionary (class in weakref): weakref — Weak references. + (line 163) +* WeakMethod (class in weakref): weakref — Weak references. + (line 208) +* WeakSet (class in weakref): weakref — Weak references. + (line 203) +* WeakValueDictionary (class in weakref): weakref — Weak references. + (line 186) +* WEDNESDAY (in module calendar): calendar — General calendar-related functions. + (line 387) +* weekday() (datetime.date method): date Objects. (line 204) +* weekday() (datetime.datetime method): datetime Objects. (line 590) +* weekday() (in module calendar): calendar — General calendar-related functions. + (line 310) +* weekheader() (in module calendar): calendar — General calendar-related functions. + (line 315) +* weibullvariate() (in module random): Real-valued distributions. + (line 101) +* WEXITED (in module os): Process Management. (line 819) +* WEXITSTATUS() (in module os): Process Management. (line 1027) +* wfile (http.server.BaseHTTPRequestHandler attribute): http server — HTTP servers. + (line 123) +* what() (in module imghdr): imghdr — Determine the type of an image. + (line 19) +* what() (in module sndhdr): sndhdr — Determine type of sound file. + (line 29) +* whathdr() (in module sndhdr): sndhdr — Determine type of sound file. + (line 38) +* whatis (pdb command): Debugger Commands. (line 252) +* when() (asyncio.Timeout method): Timeouts. (line 58) +* when() (asyncio.TimerHandle method): Callback Handles. (line 29) +* where (pdb command): Debugger Commands. (line 60) +* which() (in module shutil): Directory and files operations. + (line 386) +* whichdb() (in module dbm): dbm — Interfaces to Unix “databases”. + (line 23) +* While (class in ast): Control flow. (line 78) +* whitespace (in module string): String constants. (line 47) +* whitespace (shlex.shlex attribute): shlex Objects. (line 104) +* whitespace_split (shlex.shlex attribute): shlex Objects. (line 128) +* Widget (class in tkinter.ttk): ttk Widget. (line 9) +* width (textwrap.TextWrapper attribute): textwrap — Text wrapping and filling. + (line 160) +* width() (in module turtle): Drawing state. (line 18) +* WIFCONTINUED() (in module os): Process Management. (line 991) +* WIFEXITED() (in module os): Process Management. (line 1019) +* WIFSIGNALED() (in module os): Process Management. (line 1012) +* WIFSTOPPED() (in module os): Process Management. (line 1001) +* win32_edition() (in module platform): Windows Platform. (line 22) +* win32_is_iot() (in module platform): Windows Platform. (line 31) +* win32_ver() (in module platform): Windows Platform. (line 6) +* WinDLL (class in ctypes): Loading shared libraries. + (line 46) +* window manager (widgets): The Window Manager. (line 6) +* window() (curses.panel.Panel method): Panel Objects. (line 62) +* Windows: Complete Python programs. + (line 25) +* Windows ini file: configparser — Configuration file parser. + (line 8) +* WindowsError: Concrete exceptions. + (line 461) +* WindowsPath (class in pathlib): Concrete paths. (line 32) +* WindowsProactorEventLoopPolicy (class in asyncio): Policy Objects. + (line 67) +* WindowsRegistryFinder (class in importlib.machinery): importlib machinery – Importers and path hooks. + (line 92) +* WindowsSelectorEventLoopPolicy (class in asyncio): Policy Objects. + (line 60) +* window_height() (in module turtle): Settings and special methods. + (line 104) +* window_width() (in module turtle): Settings and special methods. + (line 111) +* winerror (OSError attribute): Concrete exceptions. + (line 160) +* WinError() (in module ctypes): Utility functions. (line 203) +* WINFUNCTYPE() (in module ctypes): Function prototypes. + (line 25) +* WinSock: select — Waiting for I/O completion. + (line 151) +* winver (in module sys): sys — System-specific parameters and functions. + (line 1836) +* With (class in ast): Control flow. (line 239) +* withitem (class in ast): Control flow. (line 250) +* WITH_EXCEPT_START (opcode): Python Bytecode Instructions. + (line 351) +* with_hostmask (ipaddress.IPv4Interface attribute): Interface objects. + (line 55) +* with_hostmask (ipaddress.IPv4Network attribute): Network objects. + (line 123) +* with_hostmask (ipaddress.IPv6Interface attribute): Interface objects. + (line 82) +* with_hostmask (ipaddress.IPv6Network attribute): Network objects. + (line 325) +* with_name() (pathlib.PurePath method): Methods and properties. + (line 296) +* with_netmask (ipaddress.IPv4Interface attribute): Interface objects. + (line 46) +* with_netmask (ipaddress.IPv4Network attribute): Network objects. + (line 118) +* with_netmask (ipaddress.IPv6Interface attribute): Interface objects. + (line 80) +* with_netmask (ipaddress.IPv6Network attribute): Network objects. + (line 323) +* with_prefixlen (ipaddress.IPv4Interface attribute): Interface objects. + (line 37) +* with_prefixlen (ipaddress.IPv4Network attribute): Network objects. + (line 105) +* with_prefixlen (ipaddress.IPv6Interface attribute): Interface objects. + (line 78) +* with_prefixlen (ipaddress.IPv6Network attribute): Network objects. + (line 317) +* with_pymalloc() (in module test.support): test support — Utilities for the Python test suite. + (line 200) +* with_stem() (pathlib.PurePath method): Methods and properties. + (line 312) +* with_suffix() (pathlib.PurePath method): Methods and properties. + (line 335) +* with_traceback() (BaseException method): Base classes. (line 25) +* WNOHANG (in module os): Process Management. (line 952) +* WNOWAIT (in module os): Process Management. (line 819) +* wordchars (shlex.shlex attribute): shlex Objects. (line 91) +* World Wide Web: Internet Protocols and Support. + (line 6) +* World Wide Web <1>: urllib parse — Parse URLs into components. + (line 8) +* World Wide Web <2>: urllib robotparser — Parser for robots txt. + (line 8) +* wrap() (in module textwrap): textwrap — Text wrapping and filling. + (line 16) +* wrap() (textwrap.TextWrapper method): textwrap — Text wrapping and filling. + (line 287) +* wrapper() (in module curses): Functions<5>. (line 607) +* WrapperDescriptorType (in module types): Standard Interpreter Types. + (line 94) +* wraps() (in module functools): functools — Higher-order functions and operations on callable objects. + (line 653) +* wrap_bio() (ssl.SSLContext method): SSL Contexts. (line 442) +* wrap_future() (in module asyncio): Future Functions. (line 50) +* wrap_socket() (in module ssl): Certificate handling. + (line 167) +* wrap_socket() (ssl.SSLContext method): SSL Contexts. (line 378) +* wrap_text() (in module distutils.fancy_getopt): distutils fancy_getopt — Wrapper around the standard getopt module. + (line 32) +* WRITABLE (in module tkinter): File Handlers. (line 41) +* writable() (asyncore.dispatcher method): asyncore — Asynchronous socket handler. + (line 179) +* writable() (io.IOBase method): I/O Base Classes. (line 154) +* write() (asyncio.StreamWriter method): StreamWriter. (line 15) +* write() (asyncio.WriteTransport method): Write-only Transports. + (line 60) +* write() (code.InteractiveInterpreter method): Interactive Interpreter Objects. + (line 63) +* write() (codecs.StreamWriter method): StreamWriter Objects. + (line 31) +* write() (configparser.ConfigParser method): ConfigParser Objects. + (line 257) +* write() (email.generator.BytesGenerator method): email generator Generating MIME documents. + (line 118) +* write() (email.generator.Generator method): email generator Generating MIME documents. + (line 214) +* write() (in module os): File Descriptor Operations. + (line 778) +* write() (in module turtle): More drawing control. + (line 29) +* write() (io.BufferedIOBase method): I/O Base Classes. (line 327) +* write() (io.BufferedWriter method): Buffered Streams. (line 131) +* write() (io.RawIOBase method): I/O Base Classes. (line 213) +* write() (io.TextIOBase method): Text I/O<2>. (line 93) +* write() (mmap.mmap method): mmap — Memory-mapped file support. + (line 297) +* write() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 39) +* write() (sqlite3.Blob method): Blob objects. (line 52) +* write() (ssl.MemoryBIO method): Memory BIO Support<2>. + (line 153) +* write() (ssl.SSLSocket method): SSL Sockets. (line 96) +* write() (telnetlib.Telnet method): Telnet Objects. (line 100) +* write() (xml.etree.ElementTree.ElementTree method): ElementTree Objects. + (line 62) +* write() (zipfile.ZipFile method): ZipFile Objects. (line 262) +* writeall() (ossaudiodev.oss_audio_device method): Audio Device Objects. + (line 51) +* writeframes() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 190) +* writeframes() (sunau.AU_write method): AU_write Objects. (line 52) +* writeframes() (wave.Wave_write method): Wave_write Objects. + (line 75) +* writeframesraw() (aifc.aifc method): aifc — Read and write AIFF and AIFC files. + (line 198) +* writeframesraw() (sunau.AU_write method): AU_write Objects. + (line 45) +* writeframesraw() (wave.Wave_write method): Wave_write Objects. + (line 68) +* writeheader() (csv.DictWriter method): Writer Objects. (line 38) +* writelines() (asyncio.StreamWriter method): StreamWriter. (line 26) +* writelines() (asyncio.WriteTransport method): Write-only Transports. + (line 67) +* writelines() (codecs.StreamWriter method): StreamWriter Objects. + (line 35) +* writelines() (io.IOBase method): I/O Base Classes. (line 160) +* writepy() (zipfile.PyZipFile method): PyZipFile Objects. (line 20) +* writer() (in module csv): Module Contents<3>. (line 40) +* writerow() (csv.csvwriter method): Writer Objects. (line 15) +* writerows() (csv.csvwriter method): Writer Objects. (line 24) +* writestr() (zipfile.ZipFile method): ZipFile Objects. (line 298) +* WriteTransport (class in asyncio): Transports Hierarchy. + (line 11) +* writev() (in module os): File Descriptor Operations. + (line 797) +* writexml() (xml.dom.minidom.Node method): DOM Objects. (line 27) +* write_byte() (mmap.mmap method): mmap — Memory-mapped file support. + (line 313) +* write_bytes() (pathlib.Path method): Methods<2>. (line 511) +* write_docstringdict() (in module turtle): Translation of docstrings into different languages. + (line 10) +* write_eof() (asyncio.StreamWriter method): StreamWriter. (line 52) +* write_eof() (asyncio.WriteTransport method): Write-only Transports. + (line 74) +* write_eof() (ssl.MemoryBIO method): Memory BIO Support<2>. + (line 161) +* write_file() (in module distutils.file_util): distutils file_util — Single file operations. + (line 44) +* write_history_file() (in module readline): History file. (line 14) +* WRITE_RESTRICTED: Generic Attribute Management. + (line 92) +* write_results() (trace.CoverageResults method): Programmatic Interface. + (line 57) +* write_text() (pathlib.Path method): Methods<2>. (line 526) +* write_through (io.TextIOWrapper attribute): Text I/O<2>. (line 172) +* writing; values: Expression statements. + (line 17) +* WrongDocumentErr: Exceptions<17>. (line 97) +* WSGIApplication (in module wsgiref.types): wsgiref types – WSGI types for static type checking. + (line 20) +* WSGIEnvironment (in module wsgiref.types): wsgiref types – WSGI types for static type checking. + (line 16) +* WSGIRequestHandler (class in wsgiref.simple_server): wsgiref simple_server – a simple WSGI HTTP server. + (line 75) +* WSGIServer (class in wsgiref.simple_server): wsgiref simple_server – a simple WSGI HTTP server. + (line 45) +* wsgi_file_wrapper (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 271) +* wsgi_multiprocess (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 155) +* wsgi_multithread (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 148) +* wsgi_run_once (wsgiref.handlers.BaseHandler attribute): wsgiref handlers – server/gateway base classes. + (line 162) +* wShowWindow (subprocess.STARTUPINFO attribute): Windows Popen Helpers. + (line 49) +* WSTOPPED (in module os): Process Management. (line 819) +* WSTOPSIG() (in module os): Process Management. (line 1036) +* wstring_at() (in module ctypes): Utility functions. (line 214) +* ws_comma (2to3 fixer): Fixers. (line 326) +* WTERMSIG() (in module os): Process Management. (line 1045) +* WUNTRACED (in module os): Process Management. (line 969) +* WWW: Internet Protocols and Support. + (line 6) +* WWW <1>: urllib parse — Parse URLs into components. + (line 8) +* WWW <2>: urllib robotparser — Parser for robots txt. + (line 8) +* WWW; server: http server — HTTP servers. + (line 8) +* WWW; server <1>: cgi — Common Gateway Interface support. + (line 8) +* W_OK (in module os): Files and Directories. + (line 106) +* X (in module re): Flags. (line 104) +* X509 certificate: SSL Contexts. (line 647) +* xatom() (imaplib.IMAP4 method): IMAP4 Objects. (line 385) +* XATTR_CREATE (in module os): Linux extended attributes. + (line 88) +* XATTR_REPLACE (in module os): Linux extended attributes. + (line 94) +* XATTR_SIZE_MAX (in module os): Linux extended attributes. + (line 83) +* xcor() (in module turtle): Tell Turtle’s state. + (line 34) +* XDR: xdrlib — Encode and decode XDR data. + (line 8) +* xhdr() (nntplib.NNTP method): Methods<3>. (line 320) +* XHTML: html parser — Simple HTML and XHTML parser. + (line 8) +* XHTML_NAMESPACE (in module xml.dom): Module Contents<4>. (line 53) +* XML() (in module xml.etree.ElementTree): Functions<8>. (line 265) +* xmlcharrefreplace; error handler’s name: Error Handlers. (line 54) +* xmlcharrefreplace_errors() (in module codecs): Error Handlers. + (line 172) +* XmlDeclHandler() (xml.parsers.expat.xmlparser method): XMLParser Objects<2>. + (line 175) +* XMLFilterBase (class in xml.sax.saxutils): xml sax saxutils — SAX Utilities. + (line 68) +* XMLGenerator (class in xml.sax.saxutils): xml sax saxutils — SAX Utilities. + (line 52) +* XMLID() (in module xml.etree.ElementTree): Functions<8>. (line 273) +* XMLNS_NAMESPACE (in module xml.dom): Module Contents<4>. (line 47) +* XMLParser (class in xml.etree.ElementTree): XMLParser Objects. + (line 6) +* XMLParserType (in module xml.parsers.expat): xml parsers expat — Fast XML parsing using Expat. + (line 35) +* XMLPullParser (class in xml.etree.ElementTree): XMLPullParser Objects. + (line 6) +* XMLReader (class in xml.sax.xmlreader): xml sax xmlreader — Interface for XML parsers. + (line 16) +* XML_ERROR_ABORTED (in module xml.parsers.expat.errors): Expat error constants. + (line 180) +* XML_ERROR_AMPLIFICATION_LIMIT_BREACH (in module xml.parsers.expat.errors): Expat error constants. + (line 215) +* XML_ERROR_ASYNC_ENTITY (in module xml.parsers.expat.errors): Expat error constants. + (line 29) +* XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF (in module xml.parsers.expat.errors): Expat error constants. + (line 31) +* XML_ERROR_BAD_CHAR_REF (in module xml.parsers.expat.errors): Expat error constants. + (line 37) +* XML_ERROR_BINARY_ENTITY_REF (in module xml.parsers.expat.errors): Expat error constants. + (line 42) +* XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING (in module xml.parsers.expat.errors): Expat error constants. + (line 135) +* XML_ERROR_DUPLICATE_ATTRIBUTE (in module xml.parsers.expat.errors): Expat error constants. + (line 47) +* XML_ERROR_ENTITY_DECLARED_IN_PE (in module xml.parsers.expat.errors): Expat error constants. + (line 126) +* XML_ERROR_EXTERNAL_ENTITY_HANDLING (in module xml.parsers.expat.errors): Expat error constants. + (line 116) +* XML_ERROR_FEATURE_REQUIRES_XML_DTD (in module xml.parsers.expat.errors): Expat error constants. + (line 128) +* XML_ERROR_FINISHED (in module xml.parsers.expat.errors): Expat error constants. + (line 184) +* XML_ERROR_INCOMPLETE_PE (in module xml.parsers.expat.errors): Expat error constants. + (line 152) +* XML_ERROR_INCORRECT_ENCODING (in module xml.parsers.expat.errors): Expat error constants. + (line 51) +* XML_ERROR_INVALID_ARGUMENT (in module xml.parsers.expat.errors): Expat error constants. + (line 207) +* XML_ERROR_INVALID_TOKEN (in module xml.parsers.expat.errors): Expat error constants. + (line 53) +* XML_ERROR_JUNK_AFTER_DOC_ELEMENT (in module xml.parsers.expat.errors): Expat error constants. + (line 59) +* XML_ERROR_MISPLACED_XML_PI (in module xml.parsers.expat.errors): Expat error constants. + (line 64) +* XML_ERROR_NOT_STANDALONE (in module xml.parsers.expat.errors): Expat error constants. + (line 118) +* XML_ERROR_NOT_SUSPENDED (in module xml.parsers.expat.errors): Expat error constants. + (line 175) +* XML_ERROR_NO_BUFFER (in module xml.parsers.expat.errors): Expat error constants. + (line 211) +* XML_ERROR_NO_ELEMENTS (in module xml.parsers.expat.errors): Expat error constants. + (line 69) +* XML_ERROR_NO_MEMORY (in module xml.parsers.expat.errors): Expat error constants. + (line 74) +* XML_ERROR_PARAM_ENTITY_REF (in module xml.parsers.expat.errors): Expat error constants. + (line 78) +* XML_ERROR_PARTIAL_CHAR (in module xml.parsers.expat.errors): Expat error constants. + (line 82) +* XML_ERROR_PUBLICID (in module xml.parsers.expat.errors): Expat error constants. + (line 165) +* XML_ERROR_RECURSIVE_ENTITY_REF (in module xml.parsers.expat.errors): Expat error constants. + (line 86) +* XML_ERROR_RESERVED_NAMESPACE_URI (in module xml.parsers.expat.errors): Expat error constants. + (line 202) +* XML_ERROR_RESERVED_PREFIX_XML (in module xml.parsers.expat.errors): Expat error constants. + (line 192) +* XML_ERROR_RESERVED_PREFIX_XMLNS (in module xml.parsers.expat.errors): Expat error constants. + (line 197) +* XML_ERROR_SUSPENDED (in module xml.parsers.expat.errors): Expat error constants. + (line 169) +* XML_ERROR_SUSPEND_PE (in module xml.parsers.expat.errors): Expat error constants. + (line 190) +* XML_ERROR_SYNTAX (in module xml.parsers.expat.errors): Expat error constants. + (line 91) +* XML_ERROR_TAG_MISMATCH (in module xml.parsers.expat.errors): Expat error constants. + (line 95) +* XML_ERROR_TEXT_DECL (in module xml.parsers.expat.errors): Expat error constants. + (line 160) +* XML_ERROR_UNBOUND_PREFIX (in module xml.parsers.expat.errors): Expat error constants. + (line 142) +* XML_ERROR_UNCLOSED_CDATA_SECTION (in module xml.parsers.expat.errors): Expat error constants. + (line 112) +* XML_ERROR_UNCLOSED_TOKEN (in module xml.parsers.expat.errors): Expat error constants. + (line 99) +* XML_ERROR_UNDECLARING_PREFIX (in module xml.parsers.expat.errors): Expat error constants. + (line 147) +* XML_ERROR_UNDEFINED_ENTITY (in module xml.parsers.expat.errors): Expat error constants. + (line 104) +* XML_ERROR_UNEXPECTED_STATE (in module xml.parsers.expat.errors): Expat error constants. + (line 124) +* XML_ERROR_UNKNOWN_ENCODING (in module xml.parsers.expat.errors): Expat error constants. + (line 108) +* XML_ERROR_XML_DECL (in module xml.parsers.expat.errors): Expat error constants. + (line 156) +* XML_NAMESPACE (in module xml.dom): Module Contents<4>. (line 42) +* xor() (in module operator): operator — Standard operators as functions. + (line 168) +* xover() (nntplib.NNTP method): Methods<3>. (line 336) +* xrange (2to3 fixer): Fixers. (line 331) +* xreadlines (2to3 fixer): Fixers. (line 336) +* xview() (tkinter.ttk.Treeview method): ttk Treeview. (line 327) +* X_OK (in module os): Files and Directories. + (line 106) +* ycor() (in module turtle): Tell Turtle’s state. + (line 46) +* year (datetime.date attribute): date Objects. (line 106) +* year (datetime.datetime attribute): datetime Objects. (line 272) +* Year 2038: time — Time access and conversions. + (line 29) +* yeardatescalendar() (calendar.Calendar method): calendar — General calendar-related functions. + (line 106) +* yeardays2calendar() (calendar.Calendar method): calendar — General calendar-related functions. + (line 114) +* yeardayscalendar() (calendar.Calendar method): calendar — General calendar-related functions. + (line 121) +* YESEXPR (in module locale): locale — Internationalization services. + (line 241) +* Yield (class in ast): Function and class definitions. + (line 128) +* yield; examples: Generator-iterator methods. + (line 71) +* yield; expression: Yield expressions. (line 6) +* yield; yield from (in What’s New): PEP 3151 Reworking the OS and IO exception hierarchy. + (line 87) +* YieldFrom (class in ast): Function and class definitions. + (line 128) +* YIELD_VALUE (opcode): Python Bytecode Instructions. + (line 275) +* yiq_to_rgb() (in module colorsys): colorsys — Conversions between color systems. + (line 32) +* yview() (tkinter.ttk.Treeview method): ttk Treeview. (line 331) +* z; in string formatting: Format Specification Mini-Language. + (line 87) +* Zen of Python: Glossary. (line 1414) +* ZeroDivisionError: Concrete exceptions. + (line 447) +* zfill() (bytearray method): Bytes and Bytearray Operations. + (line 744) +* zfill() (bytes method): Bytes and Bytearray Operations. + (line 744) +* zfill() (str method): String Methods<2>. (line 667) +* zip (2to3 fixer): Fixers. (line 340) +* zipapp command line option; -c: Command-Line Interface<5>. + (line 45) +* zipapp command line option; –compress: Command-Line Interface<5>. + (line 45) +* zipapp command line option; -h: Command-Line Interface<5>. + (line 61) +* zipapp command line option; –help: Command-Line Interface<5>. + (line 61) +* zipapp command line option; –info: Command-Line Interface<5>. + (line 55) +* zipapp command line option; -m: Command-Line Interface<5>. + (line 35) +* zipapp command line option; –main: Command-Line Interface<5>. + (line 35) +* zipapp command line option; -o: Command-Line Interface<5>. + (line 18) +* zipapp command line option; –output: Command-Line Interface<5>. + (line 18) +* zipapp command line option; -p: Command-Line Interface<5>. + (line 29) +* zipapp command line option; –python: Command-Line Interface<5>. + (line 29) +* ZipFile (class in zipfile): ZipFile Objects. (line 6) +* zipfile command line option; -c: Command-line options. + (line 11) +* zipfile command line option; –create: Command-line options. + (line 11) +* zipfile command line option; -e: Command-line options. + (line 16) +* zipfile command line option; –extract: Command-line options. + (line 16) +* zipfile command line option; -l: Command-line options. + (line 6) +* zipfile command line option; –list: Command-line options. + (line 6) +* zipfile command line option; –metadata-encoding: Command-line options. + (line 26) +* zipfile command line option; -t: Command-line options. + (line 21) +* zipfile command line option; –test: Command-line options. + (line 21) +* zipimporter (class in zipimport): zipimporter Objects. + (line 8) +* ZipImportError: zipimport — Import modules from Zip archives. + (line 56) +* ZipInfo (class in zipfile): zipfile — Work with ZIP archives. + (line 58) +* ZIP_BZIP2 (in module zipfile): zipfile — Work with ZIP archives. + (line 88) +* ZIP_DEFLATED (in module zipfile): zipfile — Work with ZIP archives. + (line 83) +* zip_longest() (in module itertools): Itertool functions. (line 609) +* ZIP_LZMA (in module zipfile): zipfile — Work with ZIP archives. + (line 95) +* ZIP_STORED (in module zipfile): zipfile — Work with ZIP archives. + (line 79) +* ZLIB_RUNTIME_VERSION (in module zlib): zlib — Compression compatible with gzip. + (line 313) +* ZLIB_VERSION (in module zlib): zlib — Compression compatible with gzip. + (line 306) +* ZoneInfo (class in zoneinfo): The ZoneInfo class. (line 6) +* ZoneInfoNotFoundError: Exceptions and warnings. + (line 6) +* zscore() (statistics.NormalDist method): NormalDist objects. + (line 114) + + + + + + +Tag Table: +Node: Top343 +Ref: contents doc541 +Ref: 151541 +Node: What’s New in Python209869 +Ref: whatsnew/index doc209971 +Ref: 152209971 +Ref: whatsnew/index python-documentation-contents209971 +Ref: 153209971 +Ref: whatsnew/index what-s-new-in-python209971 +Ref: 154209971 +Ref: whatsnew/index whatsnew-index209971 +Ref: 155209971 +Node: What’s New In Python 3 11211424 +Ref: whatsnew/3 11 doc211546 +Ref: 156211546 +Ref: whatsnew/3 11 what-s-new-in-python-3-11211546 +Ref: 157211546 +Node: Summary – Release highlights212224 +Ref: whatsnew/3 11 summary-release-highlights212339 +Ref: 159212339 +Ref: whatsnew/3 11 whatsnew311-summary212339 +Ref: 15a212339 +Ref: Summary – Release highlights-Footnote-1213867 +Ref: Summary – Release highlights-Footnote-2213909 +Ref: Summary – Release highlights-Footnote-3213934 +Ref: Summary – Release highlights-Footnote-4213976 +Ref: Summary – Release highlights-Footnote-5214018 +Node: New Features214060 +Ref: whatsnew/3 11 new-features214218 +Ref: 16b214218 +Ref: whatsnew/3 11 whatsnew311-features214218 +Ref: 16c214218 +Node: PEP 657 Fine-grained error locations in tracebacks214628 +Ref: whatsnew/3 11 pep-657-fine-grained-error-locations-in-tracebacks214772 +Ref: 16d214772 +Ref: whatsnew/3 11 whatsnew311-pep657214772 +Ref: 15e214772 +Ref: PEP 657 Fine-grained error locations in tracebacks-Footnote-1217543 +Ref: PEP 657 Fine-grained error locations in tracebacks-Footnote-2217585 +Node: PEP 654 Exception Groups and except*217650 +Ref: whatsnew/3 11 pep-654-exception-groups-and-except217848 +Ref: 176217848 +Ref: whatsnew/3 11 whatsnew311-pep654217848 +Ref: 15c217848 +Ref: PEP 654 Exception Groups and except*-Footnote-1218516 +Ref: PEP 654 Exception Groups and except*-Footnote-2218558 +Ref: PEP 654 Exception Groups and except*-Footnote-3218600 +Node: PEP 678 Exceptions can be enriched with notes218665 +Ref: whatsnew/3 11 pep-678-exceptions-can-be-enriched-with-notes218849 +Ref: 17b218849 +Ref: whatsnew/3 11 whatsnew311-pep678218849 +Ref: 15d218849 +Ref: PEP 678 Exceptions can be enriched with notes-Footnote-1219362 +Ref: PEP 678 Exceptions can be enriched with notes-Footnote-2219404 +Node: Windows py exe launcher improvements219469 +Ref: whatsnew/3 11 whatsnew311-windows-launcher219608 +Ref: 17e219608 +Ref: whatsnew/3 11 windows-py-exe-launcher-improvements219608 +Ref: 17f219608 +Ref: whatsnew/3 11 new-feat-related-type-hints-311220932 +Ref: 181220932 +Ref: Windows py exe launcher improvements-Footnote-1220970 +Ref: Windows py exe launcher improvements-Footnote-2221012 +Node: New Features Related to Type Hints221039 +Ref: whatsnew/3 11 new-features-related-to-type-hints221189 +Ref: 182221189 +Ref: whatsnew/3 11 whatsnew311-typing-features221189 +Ref: 183221189 +Ref: New Features Related to Type Hints-Footnote-1221845 +Node: PEP 646 Variadic generics221887 +Ref: whatsnew/3 11 pep-646-variadic-generics222062 +Ref: 184222062 +Ref: whatsnew/3 11 whatsnew311-pep646222062 +Ref: 163222062 +Ref: PEP 646 Variadic generics-Footnote-1223040 +Ref: PEP 646 Variadic generics-Footnote-2223082 +Ref: PEP 646 Variadic generics-Footnote-3223124 +Ref: PEP 646 Variadic generics-Footnote-4223166 +Node: PEP 655 Marking individual TypedDict items as required or not-required223231 +Ref: whatsnew/3 11 pep-655-marking-individual-typeddict-items-as-required-or-not-required223432 +Ref: 187223432 +Ref: whatsnew/3 11 whatsnew311-pep655223432 +Ref: 164223432 +Ref: PEP 655 Marking individual TypedDict items as required or not-required-Footnote-1224652 +Ref: PEP 655 Marking individual TypedDict items as required or not-required-Footnote-2224694 +Node: PEP 673 Self type224759 +Ref: whatsnew/3 11 pep-673-self-type224972 +Ref: 18b224972 +Ref: whatsnew/3 11 whatsnew311-pep673224972 +Ref: 165224972 +Ref: PEP 673 Self type-Footnote-1226016 +Ref: PEP 673 Self type-Footnote-2226097 +Ref: PEP 673 Self type-Footnote-3226139 +Node: PEP 675 Arbitrary literal string type226204 +Ref: whatsnew/3 11 pep-675-arbitrary-literal-string-type226376 +Ref: 18f226376 +Ref: whatsnew/3 11 whatsnew311-pep675226376 +Ref: 166226376 +Ref: PEP 675 Arbitrary literal string type-Footnote-1227770 +Ref: PEP 675 Arbitrary literal string type-Footnote-2227812 +Node: PEP 681 Data class transforms227877 +Ref: whatsnew/3 11 pep-681-data-class-transforms228061 +Ref: 191228061 +Ref: whatsnew/3 11 whatsnew311-pep681228061 +Ref: 167228061 +Ref: PEP 681 Data class transforms-Footnote-1229094 +Ref: PEP 681 Data class transforms-Footnote-2229136 +Node: PEP 563 may not be the future229191 +Ref: whatsnew/3 11 pep-563-may-not-be-the-future229329 +Ref: 194229329 +Ref: whatsnew/3 11 whatsnew311-pep563-deferred229329 +Ref: 195229329 +Ref: PEP 563 may not be the future-Footnote-1229724 +Ref: PEP 563 may not be the future-Footnote-2229766 +Node: Other Language Changes229877 +Ref: whatsnew/3 11 other-language-changes230051 +Ref: 197230051 +Ref: whatsnew/3 11 whatsnew311-other-lang-changes230051 +Ref: 198230051 +Ref: whatsnew/3 11 whatsnew311-pythonsafepath231587 +Ref: 161231587 +Ref: Other Language Changes-Footnote-1232934 +Ref: Other Language Changes-Footnote-2232999 +Ref: Other Language Changes-Footnote-3233064 +Ref: Other Language Changes-Footnote-4233129 +Ref: Other Language Changes-Footnote-5233194 +Ref: Other Language Changes-Footnote-6233259 +Ref: Other Language Changes-Footnote-7233314 +Ref: Other Language Changes-Footnote-8233356 +Ref: Other Language Changes-Footnote-9233411 +Node: Other CPython Implementation Changes233466 +Ref: whatsnew/3 11 other-cpython-implementation-changes233617 +Ref: 1b5233617 +Ref: whatsnew/3 11 whatsnew311-other-implementation-changes233617 +Ref: 1b6233617 +Ref: Other CPython Implementation Changes-Footnote-1236880 +Ref: Other CPython Implementation Changes-Footnote-2236945 +Ref: Other CPython Implementation Changes-Footnote-3236987 +Ref: Other CPython Implementation Changes-Footnote-4237052 +Ref: Other CPython Implementation Changes-Footnote-5237117 +Ref: Other CPython Implementation Changes-Footnote-6237182 +Ref: Other CPython Implementation Changes-Footnote-7237247 +Ref: Other CPython Implementation Changes-Footnote-8237312 +Node: New Modules237382 +Ref: whatsnew/3 11 new-modules237527 +Ref: 1ca237527 +Ref: whatsnew/3 11 whatsnew311-new-modules237527 +Ref: 1cb237527 +Ref: New Modules-Footnote-1237876 +Ref: New Modules-Footnote-2237901 +Ref: New Modules-Footnote-3237943 +Ref: New Modules-Footnote-4238008 +Ref: New Modules-Footnote-5238050 +Node: Improved Modules238115 +Ref: whatsnew/3 11 improved-modules238237 +Ref: 1cc238237 +Ref: whatsnew/3 11 whatsnew311-improved-modules238237 +Ref: 1cd238237 +Node: asyncio238703 +Ref: whatsnew/3 11 asyncio238782 +Ref: 1ce238782 +Ref: whatsnew/3 11 whatsnew311-asyncio238782 +Ref: 1cf238782 +Ref: asyncio-Footnote-1240700 +Ref: asyncio-Footnote-2240755 +Ref: asyncio-Footnote-3240810 +Ref: asyncio-Footnote-4240865 +Ref: asyncio-Footnote-5240920 +Ref: asyncio-Footnote-6240985 +Node: contextlib241050 +Ref: whatsnew/3 11 contextlib241149 +Ref: 1e4241149 +Ref: contextlib-Footnote-1241445 +Node: dataclasses241510 +Ref: whatsnew/3 11 dataclasses241610 +Ref: 1e7241610 +Ref: dataclasses-Footnote-1241952 +Node: datetime242017 +Ref: whatsnew/3 11 datetime242111 +Ref: 1ea242111 +Ref: datetime-Footnote-1242650 +Ref: datetime-Footnote-2242705 +Node: enum242760 +Ref: whatsnew/3 11 enum242852 +Ref: 1f0242852 +Ref: whatsnew/3 11 whatsnew311-enum242852 +Ref: 1f1242852 +Node: fractions245936 +Ref: whatsnew/3 11 fractions246029 +Ref: 20f246029 +Ref: fractions-Footnote-1246447 +Ref: fractions-Footnote-2246489 +Ref: fractions-Footnote-3246554 +Node: functools246619 +Ref: whatsnew/3 11 functools246715 +Ref: 211246715 +Ref: functools-Footnote-1247787 +Node: hashlib247852 +Ref: whatsnew/3 11 hashlib247955 +Ref: 215247955 +Ref: hashlib-Footnote-1248776 +Ref: hashlib-Footnote-2248808 +Ref: hashlib-Footnote-3248873 +Ref: hashlib-Footnote-4248938 +Node: IDLE and idlelib248993 +Ref: whatsnew/3 11 idle-and-idlelib249094 +Ref: 219249094 +Ref: IDLE and idlelib-Footnote-1249426 +Ref: IDLE and idlelib-Footnote-2249491 +Node: inspect249546 +Ref: whatsnew/3 11 inspect249646 +Ref: 21a249646 +Ref: whatsnew/3 11 whatsnew311-inspect249646 +Ref: 21b249646 +Ref: inspect-Footnote-1250733 +Ref: inspect-Footnote-2250798 +Ref: inspect-Footnote-3250863 +Ref: inspect-Footnote-4250905 +Node: locale250960 +Ref: whatsnew/3 11 locale251051 +Ref: 227251051 +Node: logging251278 +Ref: whatsnew/3 11 logging251366 +Ref: 22a251366 +Ref: whatsnew/3 11 whatsnew311-logging251366 +Ref: 22b251366 +Ref: logging-Footnote-1252019 +Ref: logging-Footnote-2252074 +Node: math252129 +Ref: whatsnew/3 11 math252219 +Ref: 230252219 +Ref: math-Footnote-1252992 +Ref: math-Footnote-2253057 +Ref: math-Footnote-3253122 +Ref: math-Footnote-4253187 +Node: operator253252 +Ref: whatsnew/3 11 operator253337 +Ref: 235253337 +Ref: operator-Footnote-1253599 +Node: os253664 +Ref: whatsnew/3 11 os253752 +Ref: 236253752 +Ref: os-Footnote-1254002 +Node: pathlib254067 +Ref: whatsnew/3 11 pathlib254149 +Ref: 238254149 +Ref: pathlib-Footnote-1254470 +Ref: pathlib-Footnote-2254535 +Node: re254600 +Ref: whatsnew/3 11 re254686 +Ref: 23d254686 +Ref: re-Footnote-1254988 +Node: shutil255054 +Ref: whatsnew/3 11 shutil255139 +Ref: 23e255139 +Ref: shutil-Footnote-1255333 +Node: socket255398 +Ref: whatsnew/3 11 socket255488 +Ref: 240255488 +Ref: socket-Footnote-1255901 +Ref: socket-Footnote-2255966 +Node: sqlite3256031 +Ref: whatsnew/3 11 sqlite3256121 +Ref: 242256121 +Ref: sqlite3-Footnote-1258465 +Ref: sqlite3-Footnote-2258530 +Ref: sqlite3-Footnote-3258595 +Ref: sqlite3-Footnote-4258660 +Ref: sqlite3-Footnote-5258725 +Ref: sqlite3-Footnote-6258790 +Ref: sqlite3-Footnote-7258855 +Ref: sqlite3-Footnote-8258920 +Ref: sqlite3-Footnote-9258985 +Ref: sqlite3-Footnote-10259050 +Ref: sqlite3-Footnote-11259116 +Node: string259182 +Ref: whatsnew/3 11 string259269 +Ref: 255259269 +Ref: whatsnew/3 11 whatsnew311-string259269 +Ref: 256259269 +Ref: string-Footnote-1259594 +Node: sys259649 +Ref: whatsnew/3 11 sys259738 +Ref: 25a259738 +Ref: sys-Footnote-1260431 +Ref: sys-Footnote-2260496 +Ref: sys-Footnote-3260561 +Node: sysconfig260616 +Ref: whatsnew/3 11 sysconfig260708 +Ref: 25e260708 +Ref: sysconfig-Footnote-1261521 +Node: threading261586 +Ref: whatsnew/3 11 threading261679 +Ref: 261261679 +Ref: threading-Footnote-1262184 +Node: time262249 +Ref: whatsnew/3 11 time262342 +Ref: 265262342 +Ref: time-Footnote-1263144 +Ref: time-Footnote-2263209 +Ref: time-Footnote-3263306 +Ref: time-Footnote-4263371 +Node: traceback263436 +Ref: whatsnew/3 11 traceback263526 +Ref: 267263526 +Ref: traceback-Footnote-1264018 +Ref: traceback-Footnote-2264083 +Node: typing264148 +Ref: whatsnew/3 11 typing264241 +Ref: 26b264241 +Ref: typing-Footnote-1267527 +Ref: typing-Footnote-2267582 +Ref: typing-Footnote-3267637 +Ref: typing-Footnote-4267692 +Ref: typing-Footnote-5267747 +Ref: typing-Footnote-6267812 +Ref: typing-Footnote-7267867 +Ref: typing-Footnote-8267922 +Ref: typing-Footnote-9267977 +Ref: typing-Footnote-10268032 +Ref: typing-Footnote-11268088 +Ref: typing-Footnote-12268144 +Ref: typing-Footnote-13268200 +Ref: typing-Footnote-14268256 +Ref: typing-Footnote-15268312 +Node: tkinter268368 +Ref: whatsnew/3 11 tkinter268463 +Ref: 27c268463 +Ref: tkinter-Footnote-1268746 +Node: unicodedata268801 +Ref: whatsnew/3 11 unicodedata268898 +Ref: 27e268898 +Ref: unicodedata-Footnote-1269097 +Node: unittest269162 +Ref: whatsnew/3 11 unittest269256 +Ref: 27f269256 +Ref: unittest-Footnote-1269658 +Node: venv269723 +Ref: whatsnew/3 11 venv269814 +Ref: 286269814 +Ref: venv-Footnote-1270437 +Node: warnings270502 +Ref: whatsnew/3 11 warnings270592 +Ref: 287270592 +Ref: warnings-Footnote-1270923 +Node: zipfile270988 +Ref: whatsnew/3 11 whatsnew311-zipfile271079 +Ref: 28a271079 +Ref: whatsnew/3 11 zipfile271079 +Ref: 28b271079 +Ref: zipfile-Footnote-1271670 +Ref: zipfile-Footnote-2271735 +Ref: zipfile-Footnote-3271790 +Node: fcntl271845 +Ref: whatsnew/3 11 fcntl271919 +Ref: 292271919 +Node: Optimizations272156 +Ref: whatsnew/3 11 optimizations272281 +Ref: 293272281 +Ref: whatsnew/3 11 whatsnew311-optimizations272281 +Ref: 294272281 +Ref: Optimizations-Footnote-1274683 +Ref: Optimizations-Footnote-2274748 +Ref: Optimizations-Footnote-3274803 +Ref: Optimizations-Footnote-4274858 +Ref: Optimizations-Footnote-5274913 +Ref: Optimizations-Footnote-6274978 +Ref: Optimizations-Footnote-7275033 +Ref: Optimizations-Footnote-8275098 +Ref: Optimizations-Footnote-9275153 +Node: Faster CPython275218 +Ref: whatsnew/3 11 faster-cpython275351 +Ref: 29f275351 +Ref: whatsnew/3 11 whatsnew311-faster-cpython275351 +Ref: 15b275351 +Ref: Faster CPython-Footnote-1275903 +Ref: Faster CPython-Footnote-2275969 +Node: Faster Startup276017 +Ref: whatsnew/3 11 faster-startup276105 +Ref: 2a0276105 +Ref: whatsnew/3 11 whatsnew311-faster-startup276105 +Ref: 2a1276105 +Node: Frozen imports / Static code objects276203 +Ref: whatsnew/3 11 frozen-imports-static-code-objects276290 +Ref: 2a2276290 +Ref: whatsnew/3 11 whatsnew311-faster-imports276290 +Ref: 2a3276290 +Node: Faster Runtime277109 +Ref: whatsnew/3 11 faster-runtime277210 +Ref: 2a5277210 +Ref: whatsnew/3 11 whatsnew311-faster-runtime277210 +Ref: 2a6277210 +Node: Cheaper lazy Python frames277449 +Ref: whatsnew/3 11 cheaper-lazy-python-frames277564 +Ref: 2a7277564 +Ref: whatsnew/3 11 whatsnew311-lazy-python-frames277564 +Ref: 2a8277564 +Ref: whatsnew/3 11 inline-calls278488 +Ref: 2a9278488 +Ref: Cheaper lazy Python frames-Footnote-1278526 +Node: Inlined Python function calls278591 +Ref: whatsnew/3 11 inlined-python-function-calls278756 +Ref: 2aa278756 +Ref: whatsnew/3 11 whatsnew311-inline-calls278756 +Ref: 2ab278756 +Ref: Inlined Python function calls-Footnote-1279690 +Node: PEP 659 Specializing Adaptive Interpreter279755 +Ref: whatsnew/3 11 pep-659-specializing-adaptive-interpreter279885 +Ref: 2ac279885 +Ref: whatsnew/3 11 whatsnew311-pep659279885 +Ref: 2ad279885 +Ref: PEP 659 Specializing Adaptive Interpreter-Footnote-1287222 +Ref: PEP 659 Specializing Adaptive Interpreter-Footnote-2287264 +Ref: PEP 659 Specializing Adaptive Interpreter-Footnote-3287306 +Ref: PEP 659 Specializing Adaptive Interpreter-Footnote-4287431 +Node: Misc287656 +Ref: whatsnew/3 11 misc287746 +Ref: 2ae287746 +Ref: whatsnew/3 11 whatsnew311-faster-cpython-misc287746 +Ref: 2af287746 +Ref: Misc-Footnote-1288220 +Ref: Misc-Footnote-2288285 +Ref: Misc-Footnote-3288350 +Node: FAQ288415 +Ref: whatsnew/3 11 faq288496 +Ref: 2b0288496 +Ref: whatsnew/3 11 whatsnew311-faster-cpython-faq288496 +Ref: 2b1288496 +Node: About289698 +Ref: whatsnew/3 11 about289766 +Ref: 2b2289766 +Ref: whatsnew/3 11 whatsnew311-faster-cpython-about289766 +Ref: 2b3289766 +Node: CPython bytecode changes290073 +Ref: whatsnew/3 11 cpython-bytecode-changes290203 +Ref: 2b5290203 +Ref: whatsnew/3 11 whatsnew311-bytecode-changes290203 +Ref: 2b6290203 +Ref: whatsnew/3 11 whatsnew311-deprecated292914 +Ref: 2d0292914 +Node: Deprecated292915 +Ref: whatsnew/3 11 deprecated293061 +Ref: 2d1293061 +Ref: whatsnew/3 11 whatsnew311-python-api-deprecated293061 +Ref: 2d2293061 +Ref: whatsnew/3 11 whatsnew311-pep594297359 +Ref: 168297359 +Ref: whatsnew/3 11 whatsnew311-pending-removal299715 +Ref: 2e3299715 +Ref: Deprecated-Footnote-1299752 +Ref: Deprecated-Footnote-2299817 +Ref: Deprecated-Footnote-3299872 +Ref: Deprecated-Footnote-4299927 +Ref: Deprecated-Footnote-5299969 +Ref: Deprecated-Footnote-6300034 +Ref: Deprecated-Footnote-7300099 +Ref: Deprecated-Footnote-8300164 +Ref: Deprecated-Footnote-9300228 +Ref: Deprecated-Footnote-10300293 +Ref: Deprecated-Footnote-11300359 +Ref: Deprecated-Footnote-12300425 +Ref: Deprecated-Footnote-13300491 +Ref: Deprecated-Footnote-14300547 +Ref: Deprecated-Footnote-15300603 +Ref: Deprecated-Footnote-16300646 +Ref: Deprecated-Footnote-17300712 +Ref: Deprecated-Footnote-18300768 +Ref: Deprecated-Footnote-19300834 +Ref: Deprecated-Footnote-20300890 +Ref: Deprecated-Footnote-21300946 +Ref: Deprecated-Footnote-22301002 +Node: Pending Removal in Python 3 12301058 +Ref: whatsnew/3 11 pending-removal-in-python-3-12301187 +Ref: 2e4301187 +Ref: whatsnew/3 11 whatsnew311-python-api-pending-removal301187 +Ref: 2e5301187 +Ref: whatsnew/3 11 whatsnew311-removed302766 +Ref: 2f4302766 +Node: Removed302767 +Ref: whatsnew/3 11 removed302908 +Ref: 2f5302908 +Ref: whatsnew/3 11 whatsnew311-python-api-removed302908 +Ref: 2f6302908 +Ref: whatsnew/3 11 whatsnew311-porting307584 +Ref: 307307584 +Ref: Removed-Footnote-1307621 +Ref: Removed-Footnote-2307686 +Ref: Removed-Footnote-3307751 +Ref: Removed-Footnote-4307816 +Ref: Removed-Footnote-5307881 +Ref: Removed-Footnote-6307946 +Ref: Removed-Footnote-7308011 +Ref: Removed-Footnote-8308076 +Ref: Removed-Footnote-9308141 +Ref: Removed-Footnote-10308206 +Ref: Removed-Footnote-11308272 +Ref: Removed-Footnote-12308338 +Ref: Removed-Footnote-13308404 +Ref: Removed-Footnote-14308470 +Ref: Removed-Footnote-15308512 +Node: Porting to Python 3 11308566 +Ref: whatsnew/3 11 porting-to-python-3-11308690 +Ref: 308308690 +Ref: whatsnew/3 11 whatsnew311-python-api-porting308690 +Ref: 309308690 +Ref: Porting to Python 3 11-Footnote-1311739 +Ref: Porting to Python 3 11-Footnote-2311804 +Ref: Porting to Python 3 11-Footnote-3311859 +Ref: Porting to Python 3 11-Footnote-4311924 +Ref: Porting to Python 3 11-Footnote-5311989 +Ref: Porting to Python 3 11-Footnote-6312054 +Ref: Porting to Python 3 11-Footnote-7312119 +Ref: Porting to Python 3 11-Footnote-8312184 +Node: Build Changes312249 +Ref: whatsnew/3 11 build-changes312379 +Ref: 319312379 +Ref: whatsnew/3 11 whatsnew311-build-changes312379 +Ref: 31a312379 +Ref: Build Changes-Footnote-1316920 +Ref: Build Changes-Footnote-2316962 +Ref: Build Changes-Footnote-3317011 +Ref: Build Changes-Footnote-4317044 +Ref: Build Changes-Footnote-5317076 +Ref: Build Changes-Footnote-6317102 +Ref: Build Changes-Footnote-7317131 +Ref: Build Changes-Footnote-8317186 +Ref: Build Changes-Footnote-9317241 +Ref: Build Changes-Footnote-10317296 +Ref: Build Changes-Footnote-11317340 +Ref: Build Changes-Footnote-12317424 +Ref: Build Changes-Footnote-13317490 +Ref: Build Changes-Footnote-14317538 +Ref: Build Changes-Footnote-15317604 +Ref: Build Changes-Footnote-16317662 +Ref: Build Changes-Footnote-17317728 +Ref: Build Changes-Footnote-18317772 +Ref: Build Changes-Footnote-19317838 +Ref: Build Changes-Footnote-20317904 +Ref: Build Changes-Footnote-21317932 +Ref: Build Changes-Footnote-22317998 +Ref: Build Changes-Footnote-23318061 +Ref: Build Changes-Footnote-24318089 +Ref: Build Changes-Footnote-25318155 +Ref: Build Changes-Footnote-26318221 +Ref: Build Changes-Footnote-27318287 +Ref: Build Changes-Footnote-28318353 +Ref: Build Changes-Footnote-29318403 +Ref: Build Changes-Footnote-30318469 +Ref: Build Changes-Footnote-31318535 +Ref: Build Changes-Footnote-32318601 +Ref: Build Changes-Footnote-33318667 +Ref: Build Changes-Footnote-34318733 +Ref: Build Changes-Footnote-35318799 +Node: C API Changes318865 +Ref: whatsnew/3 11 c-api-changes318964 +Ref: 31d318964 +Ref: whatsnew/3 11 whatsnew311-c-api318964 +Ref: 31e318964 +Node: New Features<2>319224 +Ref: whatsnew/3 11 id6319323 +Ref: 31f319323 +Ref: whatsnew/3 11 whatsnew311-c-api-new-features319323 +Ref: 320319323 +Ref: New Features<2>-Footnote-1322169 +Ref: New Features<2>-Footnote-2322234 +Ref: New Features<2>-Footnote-3322299 +Ref: New Features<2>-Footnote-4322364 +Ref: New Features<2>-Footnote-5322429 +Ref: New Features<2>-Footnote-6322494 +Ref: New Features<2>-Footnote-7322559 +Ref: New Features<2>-Footnote-8322624 +Ref: New Features<2>-Footnote-9322689 +Node: Porting to Python 3 11<2>322744 +Ref: whatsnew/3 11 id7322865 +Ref: 346322865 +Ref: whatsnew/3 11 whatsnew311-c-api-porting322865 +Ref: 30a322865 +Ref: whatsnew/3 11 whatsnew311-pep670322930 +Ref: 16a322930 +Ref: whatsnew/3 11 pyframeobject-3-11-hiding330365 +Ref: 35c330365 +Ref: Porting to Python 3 11<2>-Footnote-1336299 +Ref: Porting to Python 3 11<2>-Footnote-2336362 +Ref: Porting to Python 3 11<2>-Footnote-3336404 +Ref: Porting to Python 3 11<2>-Footnote-4336459 +Ref: Porting to Python 3 11<2>-Footnote-5336524 +Ref: Porting to Python 3 11<2>-Footnote-6336589 +Ref: Porting to Python 3 11<2>-Footnote-7336654 +Ref: Porting to Python 3 11<2>-Footnote-8336696 +Ref: Porting to Python 3 11<2>-Footnote-9336761 +Ref: Porting to Python 3 11<2>-Footnote-10336816 +Ref: Porting to Python 3 11<2>-Footnote-11336872 +Ref: Porting to Python 3 11<2>-Footnote-12336938 +Ref: Porting to Python 3 11<2>-Footnote-13336981 +Ref: Porting to Python 3 11<2>-Footnote-14337047 +Ref: Porting to Python 3 11<2>-Footnote-15337113 +Ref: Porting to Python 3 11<2>-Footnote-16337179 +Ref: Porting to Python 3 11<2>-Footnote-17337245 +Ref: Porting to Python 3 11<2>-Footnote-18337311 +Ref: Porting to Python 3 11<2>-Footnote-19337377 +Ref: Porting to Python 3 11<2>-Footnote-20337433 +Ref: Porting to Python 3 11<2>-Footnote-21337486 +Ref: Porting to Python 3 11<2>-Footnote-22337552 +Ref: Porting to Python 3 11<2>-Footnote-23337618 +Ref: Porting to Python 3 11<2>-Footnote-24337671 +Node: Deprecated<2>337704 +Ref: whatsnew/3 11 id8337843 +Ref: 365337843 +Ref: whatsnew/3 11 whatsnew311-c-api-deprecated337843 +Ref: 2d3337843 +Ref: Deprecated<2>-Footnote-1338872 +Ref: Deprecated<2>-Footnote-2338914 +Ref: Deprecated<2>-Footnote-3338969 +Node: Pending Removal in Python 3 12<2>339034 +Ref: whatsnew/3 11 id9339158 +Ref: 374339158 +Ref: whatsnew/3 11 whatsnew311-c-api-pending-removal339158 +Ref: 2e6339158 +Node: Removed<2>339963 +Ref: whatsnew/3 11 id10340065 +Ref: 380340065 +Ref: whatsnew/3 11 whatsnew311-c-api-removed340065 +Ref: 2f7340065 +Ref: whatsnew/3 11 whatsnew311-pep624342325 +Ref: 169342325 +Ref: Removed<2>-Footnote-1343265 +Ref: Removed<2>-Footnote-2343330 +Ref: Removed<2>-Footnote-3343395 +Ref: Removed<2>-Footnote-4343460 +Ref: Removed<2>-Footnote-5343525 +Ref: Removed<2>-Footnote-6343590 +Ref: Removed<2>-Footnote-7343655 +Ref: Removed<2>-Footnote-8343720 +Ref: Removed<2>-Footnote-9343785 +Ref: Removed<2>-Footnote-10343850 +Ref: Removed<2>-Footnote-11343893 +Ref: Removed<2>-Footnote-12343953 +Node: What’s New In Python 3 10344019 +Ref: whatsnew/3 10 doc344176 +Ref: 389344176 +Ref: whatsnew/3 10 libb2344176 +Ref: 38a344176 +Ref: whatsnew/3 10 what-s-new-in-python-3-10344176 +Ref: 38b344176 +Node: Summary – Release highlights<2>345057 +Ref: whatsnew/3 10 summary-release-highlights345178 +Ref: 38c345178 +Ref: Summary – Release highlights<2>-Footnote-1346287 +Ref: Summary – Release highlights<2>-Footnote-2346329 +Ref: Summary – Release highlights<2>-Footnote-3346371 +Ref: Summary – Release highlights<2>-Footnote-4346413 +Ref: Summary – Release highlights<2>-Footnote-5346478 +Ref: Summary – Release highlights<2>-Footnote-6346520 +Ref: Summary – Release highlights<2>-Footnote-7346562 +Ref: Summary – Release highlights<2>-Footnote-8346604 +Ref: Summary – Release highlights<2>-Footnote-9346646 +Ref: Summary – Release highlights<2>-Footnote-10346688 +Ref: Summary – Release highlights<2>-Footnote-11346731 +Ref: Summary – Release highlights<2>-Footnote-12346774 +Ref: Summary – Release highlights<2>-Footnote-13346817 +Ref: Summary – Release highlights<2>-Footnote-14346860 +Node: New Features<3>346903 +Ref: whatsnew/3 10 new-features347070 +Ref: 38d347070 +Node: Parenthesized context managers347438 +Ref: whatsnew/3 10 parenthesized-context-managers347550 +Ref: 38e347550 +Ref: whatsnew/3 10 whatsnew310-pep563347550 +Ref: 38f347550 +Ref: Parenthesized context managers-Footnote-1348794 +Ref: Parenthesized context managers-Footnote-2348836 +Ref: Parenthesized context managers-Footnote-3348901 +Node: Better error messages348966 +Ref: whatsnew/3 10 better-error-messages349145 +Ref: 390349145 +Node: SyntaxErrors349290 +Ref: whatsnew/3 10 syntaxerrors349386 +Ref: 391349386 +Ref: SyntaxErrors-Footnote-1355043 +Ref: SyntaxErrors-Footnote-2355108 +Ref: SyntaxErrors-Footnote-3355173 +Ref: SyntaxErrors-Footnote-4355238 +Ref: SyntaxErrors-Footnote-5355303 +Ref: SyntaxErrors-Footnote-6355368 +Ref: SyntaxErrors-Footnote-7355433 +Ref: SyntaxErrors-Footnote-8355498 +Ref: SyntaxErrors-Footnote-9355563 +Ref: SyntaxErrors-Footnote-10355628 +Ref: SyntaxErrors-Footnote-11355694 +Node: IndentationErrors355760 +Ref: whatsnew/3 10 indentationerrors355880 +Ref: 392355880 +Node: AttributeErrors356297 +Ref: whatsnew/3 10 attributeerrors356415 +Ref: 394356415 +Ref: AttributeErrors-Footnote-1357188 +Node: NameErrors357253 +Ref: whatsnew/3 10 nameerrors357345 +Ref: 395357345 +Ref: NameErrors-Footnote-1358178 +Node: PEP 626 Precise line numbers for debugging and other tools358243 +Ref: whatsnew/3 10 pep-626-precise-line-numbers-for-debugging-and-other-tools358427 +Ref: 397358427 +Node: PEP 634 Structural Pattern Matching359092 +Ref: whatsnew/3 10 pep-634-structural-pattern-matching359308 +Ref: 398359308 +Node: Syntax and operations360095 +Ref: whatsnew/3 10 syntax-and-operations360217 +Ref: 399360217 +Node: Declarative approach361333 +Ref: whatsnew/3 10 declarative-approach361497 +Ref: 39a361497 +Node: Simple pattern match to a literal362676 +Ref: whatsnew/3 10 simple-pattern-match-to-a-literal362855 +Ref: 39b362855 +Node: Behavior without the wildcard364230 +Ref: whatsnew/3 10 behavior-without-the-wildcard364329 +Ref: 39c364329 +Node: Patterns with a literal and variable364911 +Ref: whatsnew/3 10 patterns-with-a-literal-and-variable365090 +Ref: 39d365090 +Node: Patterns and classes366058 +Ref: whatsnew/3 10 patterns-and-classes366219 +Ref: 39e366219 +Node: Patterns with positional parameters367104 +Ref: whatsnew/3 10 patterns-with-positional-parameters367196 +Ref: 39f367196 +Node: Nested patterns367785 +Ref: whatsnew/3 10 nested-patterns367943 +Ref: 3a0367943 +Node: Complex patterns and the wildcard368582 +Ref: whatsnew/3 10 complex-patterns-and-the-wildcard368725 +Ref: 3a1368725 +Node: Guard369299 +Ref: whatsnew/3 10 guard369445 +Ref: 3a2369445 +Node: Other Key Features369889 +Ref: whatsnew/3 10 other-key-features369993 +Ref: 3a3369993 +Ref: Other Key Features-Footnote-1372135 +Ref: Other Key Features-Footnote-2372177 +Ref: Other Key Features-Footnote-3372219 +Node: Optional EncodingWarning and encoding="locale" option372261 +Ref: whatsnew/3 10 optional-encodingwarning-and-encoding-locale-option372410 +Ref: 3a4372410 +Ref: whatsnew/3 10 whatsnew310-pep597372410 +Ref: 3a5372410 +Node: New Features Related to Type Hints<2>373304 +Ref: whatsnew/3 10 new-feat-related-type-hints373463 +Ref: 3a8373463 +Ref: whatsnew/3 10 new-features-related-to-type-hints373463 +Ref: 3a9373463 +Ref: New Features Related to Type Hints<2>-Footnote-1373964 +Node: PEP 604 New Type Union Operator374006 +Ref: whatsnew/3 10 pep-604-new-type-union-operator374161 +Ref: 3aa374161 +Ref: PEP 604 New Type Union Operator-Footnote-1375235 +Ref: PEP 604 New Type Union Operator-Footnote-2375277 +Ref: PEP 604 New Type Union Operator-Footnote-3375342 +Node: PEP 612 Parameter Specification Variables375407 +Ref: whatsnew/3 10 pep-612-parameter-specification-variables375588 +Ref: 3ae375588 +Ref: PEP 612 Parameter Specification Variables-Footnote-1376875 +Ref: PEP 612 Parameter Specification Variables-Footnote-2376917 +Ref: PEP 612 Parameter Specification Variables-Footnote-3376959 +Ref: PEP 612 Parameter Specification Variables-Footnote-4377024 +Node: PEP 613 TypeAlias377089 +Ref: whatsnew/3 10 pep-613-typealias377271 +Ref: 3b4377271 +Ref: PEP 613 TypeAlias-Footnote-1378093 +Ref: PEP 613 TypeAlias-Footnote-2378135 +Ref: PEP 613 TypeAlias-Footnote-3378177 +Node: PEP 647 User-Defined Type Guards378242 +Ref: whatsnew/3 10 pep-647-user-defined-type-guards378374 +Ref: 3b5378374 +Ref: PEP 647 User-Defined Type Guards-Footnote-1378850 +Ref: PEP 647 User-Defined Type Guards-Footnote-2378892 +Node: Other Language Changes<2>378957 +Ref: whatsnew/3 10 other-language-changes379115 +Ref: 3b6379115 +Ref: Other Language Changes<2>-Footnote-1383800 +Ref: Other Language Changes<2>-Footnote-2383865 +Ref: Other Language Changes<2>-Footnote-3383930 +Ref: Other Language Changes<2>-Footnote-4383972 +Ref: Other Language Changes<2>-Footnote-5384037 +Ref: Other Language Changes<2>-Footnote-6384102 +Ref: Other Language Changes<2>-Footnote-7384167 +Ref: Other Language Changes<2>-Footnote-8384232 +Ref: Other Language Changes<2>-Footnote-9384297 +Ref: Other Language Changes<2>-Footnote-10384339 +Ref: Other Language Changes<2>-Footnote-11384405 +Ref: Other Language Changes<2>-Footnote-12384471 +Ref: Other Language Changes<2>-Footnote-13384537 +Ref: Other Language Changes<2>-Footnote-14384603 +Ref: Other Language Changes<2>-Footnote-15384669 +Ref: Other Language Changes<2>-Footnote-16384735 +Node: New Modules<2>384801 +Ref: whatsnew/3 10 new-modules384941 +Ref: 3cc384941 +Node: Improved Modules<2>384994 +Ref: whatsnew/3 10 improved-modules385125 +Ref: 3cd385125 +Node: asyncio<2>386082 +Ref: whatsnew/3 10 asyncio386165 +Ref: 3ce386165 +Ref: asyncio<2>-Footnote-1386337 +Node: argparse386402 +Ref: whatsnew/3 10 argparse386499 +Ref: 3cf386499 +Ref: argparse-Footnote-1386789 +Node: array386853 +Ref: whatsnew/3 10 array386963 +Ref: 3d0386963 +Ref: array-Footnote-1387205 +Node: asynchat asyncore smtpd387270 +Ref: whatsnew/3 10 asynchat-asyncore-smtpd387378 +Ref: 3d3387378 +Node: base64387638 +Ref: whatsnew/3 10 base64387744 +Ref: 3d4387744 +Node: bdb387911 +Ref: whatsnew/3 10 bdb388000 +Ref: 3d7388000 +Ref: bdb-Footnote-1388169 +Node: bisect388234 +Ref: whatsnew/3 10 bisect388323 +Ref: 3d8388323 +Ref: bisect-Footnote-1388540 +Node: codecs388604 +Ref: whatsnew/3 10 codecs388705 +Ref: 3d9388705 +Ref: codecs-Footnote-1388902 +Node: collections abc388967 +Ref: whatsnew/3 10 collections-abc389075 +Ref: 3db389075 +Ref: collections abc-Footnote-1389996 +Node: contextlib<2>390061 +Ref: whatsnew/3 10 contextlib390169 +Ref: 3de390169 +Ref: contextlib<2>-Footnote-1390686 +Ref: contextlib<2>-Footnote-2390751 +Node: curses390816 +Ref: whatsnew/3 10 curses390923 +Ref: 3e1390923 +Ref: curses-Footnote-1391620 +Ref: curses-Footnote-2391685 +Node: dataclasses<2>391750 +Ref: whatsnew/3 10 dataclasses391853 +Ref: 3e7391853 +Node: __slots__391944 +Ref: whatsnew/3 10 slots392032 +Ref: 3e8392032 +Ref: __slots__-Footnote-1392234 +Node: Keyword-only fields392299 +Ref: whatsnew/3 10 keyword-only-fields392387 +Ref: 3e9392387 +Ref: Keyword-only fields-Footnote-1393860 +Node: distutils393925 +Ref: whatsnew/3 10 distutils394029 +Ref: 3ea394029 +Ref: whatsnew/3 10 distutils-deprecated394029 +Ref: 2f3394029 +Ref: distutils-Footnote-1394937 +Ref: distutils-Footnote-2394979 +Node: doctest395044 +Ref: whatsnew/3 10 doctest395143 +Ref: 3eb395143 +Ref: doctest-Footnote-1395347 +Node: encodings395412 +Ref: whatsnew/3 10 encodings395509 +Ref: 3ec395509 +Ref: encodings-Footnote-1395698 +Node: enum<2>395763 +Ref: whatsnew/3 10 enum395862 +Ref: 3ed395862 +Ref: enum<2>-Footnote-1396317 +Ref: enum<2>-Footnote-2396382 +Node: fileinput396447 +Ref: whatsnew/3 10 fileinput396549 +Ref: 3ef396549 +Ref: fileinput-Footnote-1396978 +Ref: fileinput-Footnote-2397043 +Node: faulthandler397107 +Ref: whatsnew/3 10 faulthandler397204 +Ref: 3f2397204 +Ref: faulthandler-Footnote-1397446 +Node: gc397511 +Ref: whatsnew/3 10 gc397603 +Ref: 3f3397603 +Ref: gc-Footnote-1397828 +Node: glob397893 +Ref: whatsnew/3 10 glob397983 +Ref: 3f7397983 +Ref: glob-Footnote-1398247 +Node: hashlib<2>398312 +Ref: whatsnew/3 10 hashlib398404 +Ref: 3fa398404 +Ref: hashlib<2>-Footnote-1398947 +Ref: hashlib<2>-Footnote-2398989 +Ref: hashlib<2>-Footnote-3399054 +Ref: hashlib<2>-Footnote-4399119 +Node: hmac399184 +Ref: whatsnew/3 10 hmac399291 +Ref: 3fc399291 +Ref: hmac-Footnote-1399477 +Node: IDLE and idlelib<2>399542 +Ref: whatsnew/3 10 idle-and-idlelib399657 +Ref: 3fd399657 +Ref: IDLE and idlelib<2>-Footnote-1401747 +Ref: IDLE and idlelib<2>-Footnote-2401812 +Ref: IDLE and idlelib<2>-Footnote-3401877 +Ref: IDLE and idlelib<2>-Footnote-4401942 +Ref: IDLE and idlelib<2>-Footnote-5402007 +Ref: IDLE and idlelib<2>-Footnote-6402072 +Ref: IDLE and idlelib<2>-Footnote-7402137 +Ref: IDLE and idlelib<2>-Footnote-8402202 +Node: importlib metadata402257 +Ref: whatsnew/3 10 importlib-metadata402378 +Ref: 402402378 +Ref: importlib metadata-Footnote-1402955 +Node: inspect<2>403028 +Ref: whatsnew/3 10 inspect403139 +Ref: 404403139 +Ref: inspect<2>-Footnote-1404342 +Ref: inspect<2>-Footnote-2404407 +Node: itertools404472 +Ref: whatsnew/3 10 itertools404574 +Ref: 406404574 +Ref: itertools-Footnote-1404740 +Node: linecache404805 +Ref: whatsnew/3 10 linecache404902 +Ref: 408404902 +Ref: linecache-Footnote-1405110 +Node: os<2>405175 +Ref: whatsnew/3 10 os405270 +Ref: 409405270 +Ref: os<2>-Footnote-1406010 +Ref: os<2>-Footnote-2406075 +Ref: os<2>-Footnote-3406140 +Ref: os<2>-Footnote-4406205 +Node: os path406270 +Ref: whatsnew/3 10 os-path406366 +Ref: 411406366 +Ref: os path-Footnote-1406677 +Node: pathlib<2>406742 +Ref: whatsnew/3 10 pathlib406841 +Ref: 414406841 +Ref: pathlib<2>-Footnote-1407557 +Ref: pathlib<2>-Footnote-2407622 +Ref: pathlib<2>-Footnote-3407687 +Ref: pathlib<2>-Footnote-4407752 +Node: platform407817 +Ref: whatsnew/3 10 platform407915 +Ref: 41a407915 +Ref: platform-Footnote-1408184 +Ref: platform-Footnote-2408257 +Node: pprint408322 +Ref: whatsnew/3 10 pprint408420 +Ref: 41c408420 +Ref: pprint-Footnote-1408754 +Ref: pprint-Footnote-2408819 +Node: py_compile408884 +Ref: whatsnew/3 10 py-compile408980 +Ref: 41e408980 +Ref: py_compile-Footnote-1409188 +Node: pyclbr409253 +Ref: whatsnew/3 10 pyclbr409349 +Ref: 41f409349 +Ref: pyclbr-Footnote-1409679 +Node: shelve409744 +Ref: whatsnew/3 10 shelve409840 +Ref: 420409840 +Ref: shelve-Footnote-1410113 +Node: statistics410178 +Ref: whatsnew/3 10 statistics410272 +Ref: 422410272 +Ref: statistics-Footnote-1410527 +Node: site410592 +Ref: whatsnew/3 10 site410689 +Ref: 426410689 +Ref: site-Footnote-1410887 +Node: socket<2>410952 +Ref: whatsnew/3 10 socket411042 +Ref: 427411042 +Ref: socket<2>-Footnote-1411488 +Ref: socket<2>-Footnote-2411553 +Ref: socket<2>-Footnote-3411618 +Node: ssl411683 +Ref: whatsnew/3 10 ssl411779 +Ref: 42a411779 +Ref: ssl-Footnote-1413620 +Ref: ssl-Footnote-2413662 +Ref: ssl-Footnote-3413727 +Ref: ssl-Footnote-4413792 +Ref: ssl-Footnote-5413857 +Ref: ssl-Footnote-6413922 +Ref: ssl-Footnote-7413987 +Ref: ssl-Footnote-8414052 +Ref: ssl-Footnote-9414117 +Ref: ssl-Footnote-10414182 +Ref: ssl-Footnote-11414248 +Ref: ssl-Footnote-12414314 +Ref: ssl-Footnote-13414380 +Ref: ssl-Footnote-14414446 +Ref: ssl-Footnote-15414512 +Node: sqlite3<2>414578 +Ref: whatsnew/3 10 sqlite3414671 +Ref: 433414671 +Ref: sqlite3<2>-Footnote-1414910 +Node: sys<2>414975 +Ref: whatsnew/3 10 sys415072 +Ref: 436415072 +Ref: sys<2>-Footnote-1415457 +Ref: sys<2>-Footnote-2415522 +Node: _thread415587 +Ref: whatsnew/3 10 thread415686 +Ref: 439415686 +Ref: _thread-Footnote-1415942 +Node: threading<2>416007 +Ref: whatsnew/3 10 threading416112 +Ref: 43c416112 +Ref: threading<2>-Footnote-1416654 +Ref: threading<2>-Footnote-2416719 +Node: traceback<2>416784 +Ref: whatsnew/3 10 traceback416887 +Ref: 443416887 +Ref: traceback<2>-Footnote-1417215 +Node: types417280 +Ref: whatsnew/3 10 types417380 +Ref: 447417380 +Ref: types-Footnote-1417689 +Node: typing<2>417754 +Ref: whatsnew/3 10 typing417853 +Ref: 44b417853 +Ref: typing<2>-Footnote-1420068 +Ref: typing<2>-Footnote-2420110 +Ref: typing<2>-Footnote-3420175 +Ref: typing<2>-Footnote-4420240 +Ref: typing<2>-Footnote-5420305 +Node: unittest<2>420370 +Ref: whatsnew/3 10 unittest420476 +Ref: 44e420476 +Ref: unittest<2>-Footnote-1420692 +Node: urllib parse420757 +Ref: whatsnew/3 10 urllib-parse420857 +Ref: 451420857 +Ref: urllib parse-Footnote-1421570 +Node: xml421635 +Ref: whatsnew/3 10 xml421733 +Ref: 456421733 +Ref: xml-Footnote-1421949 +Node: zipimport422014 +Ref: whatsnew/3 10 zipimport422091 +Ref: 458422091 +Ref: zipimport-Footnote-1422471 +Ref: zipimport-Footnote-2422513 +Ref: zipimport-Footnote-3422578 +Node: Optimizations<2>422643 +Ref: whatsnew/3 10 optimizations422773 +Ref: 45d422773 +Ref: Optimizations<2>-Footnote-1426263 +Ref: Optimizations<2>-Footnote-2426328 +Ref: Optimizations<2>-Footnote-3426393 +Ref: Optimizations<2>-Footnote-4426458 +Ref: Optimizations<2>-Footnote-5426523 +Ref: Optimizations<2>-Footnote-6426588 +Ref: Optimizations<2>-Footnote-7426709 +Ref: Optimizations<2>-Footnote-8426774 +Ref: Optimizations<2>-Footnote-9426839 +Ref: Optimizations<2>-Footnote-10426904 +Ref: Optimizations<2>-Footnote-11426970 +Ref: Optimizations<2>-Footnote-12427036 +Ref: Optimizations<2>-Footnote-13427079 +Ref: Optimizations<2>-Footnote-14427145 +Ref: Optimizations<2>-Footnote-15427211 +Ref: Optimizations<2>-Footnote-16427277 +Ref: Optimizations<2>-Footnote-17427343 +Ref: Optimizations<2>-Footnote-18427409 +Node: Deprecated<3>427475 +Ref: whatsnew/3 10 deprecated427596 +Ref: 464427596 +Ref: whatsnew/3 10 whatsnew310-deprecated427596 +Ref: 42f427596 +Ref: Deprecated<3>-Footnote-1438002 +Ref: Deprecated<3>-Footnote-2438067 +Ref: Deprecated<3>-Footnote-3438132 +Ref: Deprecated<3>-Footnote-4438197 +Ref: Deprecated<3>-Footnote-5438262 +Ref: Deprecated<3>-Footnote-6438327 +Ref: Deprecated<3>-Footnote-7438392 +Ref: Deprecated<3>-Footnote-8438457 +Ref: Deprecated<3>-Footnote-9438522 +Ref: Deprecated<3>-Footnote-10438587 +Ref: Deprecated<3>-Footnote-11438653 +Ref: Deprecated<3>-Footnote-12438719 +Ref: Deprecated<3>-Footnote-13438785 +Ref: Deprecated<3>-Footnote-14438851 +Ref: Deprecated<3>-Footnote-15438917 +Ref: Deprecated<3>-Footnote-16438976 +Ref: Deprecated<3>-Footnote-17439042 +Ref: Deprecated<3>-Footnote-18439098 +Ref: Deprecated<3>-Footnote-19439164 +Ref: Deprecated<3>-Footnote-20439230 +Ref: Deprecated<3>-Footnote-21439296 +Node: Removed<3>439362 +Ref: whatsnew/3 10 removed439489 +Ref: 497439489 +Ref: whatsnew/3 10 whatsnew310-removed439489 +Ref: 498439489 +Ref: Removed<3>-Footnote-1442724 +Ref: Removed<3>-Footnote-2442789 +Ref: Removed<3>-Footnote-3442854 +Ref: Removed<3>-Footnote-4442919 +Ref: Removed<3>-Footnote-5442984 +Ref: Removed<3>-Footnote-6443049 +Ref: Removed<3>-Footnote-7443114 +Node: Porting to Python 3 10443179 +Ref: whatsnew/3 10 porting-to-python-3-10443320 +Ref: 49d443320 +Node: Changes in the Python syntax443586 +Ref: whatsnew/3 10 changes-in-the-python-syntax443707 +Ref: 49e443707 +Ref: Changes in the Python syntax-Footnote-1444302 +Node: Changes in the Python API444367 +Ref: whatsnew/3 10 changes-in-the-python-api444517 +Ref: 49f444517 +Ref: whatsnew/3 10 changes-python-api444517 +Ref: 49c444517 +Ref: Changes in the Python API-Footnote-1447446 +Ref: Changes in the Python API-Footnote-2447511 +Ref: Changes in the Python API-Footnote-3447576 +Ref: Changes in the Python API-Footnote-4447641 +Ref: Changes in the Python API-Footnote-5447706 +Ref: Changes in the Python API-Footnote-6447771 +Node: Changes in the C API447836 +Ref: whatsnew/3 10 changes-in-the-c-api447949 +Ref: 4a9447949 +Node: CPython bytecode changes<2>450416 +Ref: whatsnew/3 10 cpython-bytecode-changes450563 +Ref: 4b0450563 +Ref: CPython bytecode changes<2>-Footnote-1450862 +Node: Build Changes<2>450927 +Ref: whatsnew/3 10 build-changes451068 +Ref: 4b1451068 +Ref: Build Changes<2>-Footnote-1453540 +Ref: Build Changes<2>-Footnote-2453582 +Ref: Build Changes<2>-Footnote-3453647 +Ref: Build Changes<2>-Footnote-4453712 +Ref: Build Changes<2>-Footnote-5453777 +Ref: Build Changes<2>-Footnote-6453842 +Ref: Build Changes<2>-Footnote-7453907 +Ref: Build Changes<2>-Footnote-8453972 +Ref: Build Changes<2>-Footnote-9454037 +Ref: Build Changes<2>-Footnote-10454102 +Ref: Build Changes<2>-Footnote-11454168 +Node: C API Changes<2>454234 +Ref: whatsnew/3 10 c-api-changes454339 +Ref: 4b6454339 +Node: PEP 652 Maintaining the Stable ABI454605 +Ref: whatsnew/3 10 pep-652-maintaining-the-stable-abi454716 +Ref: 4b7454716 +Ref: PEP 652 Maintaining the Stable ABI-Footnote-1455149 +Ref: PEP 652 Maintaining the Stable ABI-Footnote-2455191 +Node: New Features<4>455256 +Ref: whatsnew/3 10 id1455401 +Ref: 4b9455401 +Ref: New Features<4>-Footnote-1460017 +Ref: New Features<4>-Footnote-2460082 +Ref: New Features<4>-Footnote-3460147 +Ref: New Features<4>-Footnote-4460212 +Ref: New Features<4>-Footnote-5460277 +Ref: New Features<4>-Footnote-6460342 +Ref: New Features<4>-Footnote-7460407 +Ref: New Features<4>-Footnote-8460474 +Ref: New Features<4>-Footnote-9460539 +Ref: New Features<4>-Footnote-10460604 +Ref: New Features<4>-Footnote-11460670 +Ref: New Features<4>-Footnote-12460736 +Ref: New Features<4>-Footnote-13460802 +Ref: New Features<4>-Footnote-14460868 +Ref: New Features<4>-Footnote-15460934 +Ref: New Features<4>-Footnote-16461000 +Ref: New Features<4>-Footnote-17461066 +Ref: New Features<4>-Footnote-18461132 +Node: Porting to Python 3 10<2>461198 +Ref: whatsnew/3 10 id2461322 +Ref: 4d8461322 +Ref: Porting to Python 3 10<2>-Footnote-1464990 +Ref: Porting to Python 3 10<2>-Footnote-2465032 +Ref: Porting to Python 3 10<2>-Footnote-3465097 +Ref: Porting to Python 3 10<2>-Footnote-4465162 +Ref: Porting to Python 3 10<2>-Footnote-5465227 +Ref: Porting to Python 3 10<2>-Footnote-6465292 +Ref: Porting to Python 3 10<2>-Footnote-7465357 +Ref: Porting to Python 3 10<2>-Footnote-8465422 +Ref: Porting to Python 3 10<2>-Footnote-9465487 +Ref: Porting to Python 3 10<2>-Footnote-10465552 +Ref: Porting to Python 3 10<2>-Footnote-11465618 +Node: Deprecated<4>465684 +Ref: whatsnew/3 10 id3465803 +Ref: 4ec465803 +Ref: Deprecated<4>-Footnote-1466102 +Node: Removed<4>466167 +Ref: whatsnew/3 10 id4466252 +Ref: 4ee466252 +Ref: Removed<4>-Footnote-1471341 +Ref: Removed<4>-Footnote-2471406 +Ref: Removed<4>-Footnote-3471448 +Ref: Removed<4>-Footnote-4471513 +Ref: Removed<4>-Footnote-5471578 +Ref: Removed<4>-Footnote-6471643 +Ref: Removed<4>-Footnote-7471708 +Ref: Removed<4>-Footnote-8471773 +Ref: Removed<4>-Footnote-9471838 +Ref: Removed<4>-Footnote-10471880 +Ref: Removed<4>-Footnote-11471946 +Ref: Removed<4>-Footnote-12472012 +Ref: Removed<4>-Footnote-13472078 +Ref: Removed<4>-Footnote-14472144 +Ref: Removed<4>-Footnote-15472210 +Ref: Removed<4>-Footnote-16472276 +Node: What’s New In Python 3 9472342 +Ref: whatsnew/3 9 doc472498 +Ref: 4fd472498 +Ref: whatsnew/3 9 what-s-new-in-python-3-9472498 +Ref: 4fe472498 +Ref: What’s New In Python 3 9-Footnote-1473521 +Node: Summary – Release highlights<3>473563 +Ref: whatsnew/3 9 summary-release-highlights473720 +Ref: 4ff473720 +Ref: Summary – Release highlights<3>-Footnote-1475687 +Ref: Summary – Release highlights<3>-Footnote-2475729 +Ref: Summary – Release highlights<3>-Footnote-3475771 +Ref: Summary – Release highlights<3>-Footnote-4475813 +Ref: Summary – Release highlights<3>-Footnote-5475855 +Ref: Summary – Release highlights<3>-Footnote-6475897 +Ref: Summary – Release highlights<3>-Footnote-7475939 +Ref: Summary – Release highlights<3>-Footnote-8475981 +Ref: Summary – Release highlights<3>-Footnote-9476023 +Ref: Summary – Release highlights<3>-Footnote-10476065 +Node: You should check for DeprecationWarning in your code476108 +Ref: whatsnew/3 9 you-should-check-for-deprecationwarning-in-your-code476289 +Ref: 501476289 +Node: New Features<5>477979 +Ref: whatsnew/3 9 new-features478152 +Ref: 508478152 +Node: Dictionary Merge & Update Operators478361 +Ref: whatsnew/3 9 dictionary-merge-update-operators478507 +Ref: 509478507 +Ref: Dictionary Merge & Update Operators-Footnote-1479262 +Ref: Dictionary Merge & Update Operators-Footnote-2479304 +Node: New String Methods to Remove Prefixes and Suffixes479369 +Ref: whatsnew/3 9 new-string-methods-to-remove-prefixes-and-suffixes479569 +Ref: 50a479569 +Ref: New String Methods to Remove Prefixes and Suffixes-Footnote-1480080 +Ref: New String Methods to Remove Prefixes and Suffixes-Footnote-2480122 +Node: Type Hinting Generics in Standard Collections480187 +Ref: whatsnew/3 9 type-hinting-generics-in-standard-collections480362 +Ref: 50d480362 +Ref: Type Hinting Generics in Standard Collections-Footnote-1481064 +Ref: Type Hinting Generics in Standard Collections-Footnote-2481106 +Node: New Parser481171 +Ref: whatsnew/3 9 new-parser481287 +Ref: 50e481287 +Ref: New Parser-Footnote-1482222 +Ref: New Parser-Footnote-2482287 +Ref: New Parser-Footnote-3482335 +Ref: New Parser-Footnote-4482377 +Node: Other Language Changes<3>482442 +Ref: whatsnew/3 9 other-language-changes482577 +Ref: 50f482577 +Ref: Other Language Changes<3>-Footnote-1485683 +Ref: Other Language Changes<3>-Footnote-2485748 +Ref: Other Language Changes<3>-Footnote-3485813 +Ref: Other Language Changes<3>-Footnote-4485878 +Ref: Other Language Changes<3>-Footnote-5485943 +Ref: Other Language Changes<3>-Footnote-6485985 +Ref: Other Language Changes<3>-Footnote-7486050 +Ref: Other Language Changes<3>-Footnote-8486115 +Ref: Other Language Changes<3>-Footnote-9486180 +Ref: Other Language Changes<3>-Footnote-10486245 +Ref: Other Language Changes<3>-Footnote-11486311 +Node: New Modules<3>486377 +Ref: whatsnew/3 9 new-modules486516 +Ref: 51b486516 +Node: zoneinfo486589 +Ref: whatsnew/3 9 zoneinfo486665 +Ref: 51c486665 +Ref: zoneinfo-Footnote-1487773 +Ref: zoneinfo-Footnote-2487814 +Node: graphlib487856 +Ref: whatsnew/3 9 graphlib487932 +Ref: 51e487932 +Ref: graphlib-Footnote-1488256 +Node: Improved Modules<3>488321 +Ref: whatsnew/3 9 improved-modules488451 +Ref: 520488451 +Node: ast489170 +Ref: whatsnew/3 9 ast489248 +Ref: 521489248 +Ref: ast-Footnote-1489916 +Ref: ast-Footnote-2489981 +Ref: ast-Footnote-3490046 +Node: asyncio<3>490111 +Ref: whatsnew/3 9 asyncio490208 +Ref: 524490208 +Ref: asyncio<3>-Footnote-1491931 +Ref: asyncio<3>-Footnote-2491996 +Ref: asyncio<3>-Footnote-3492061 +Ref: asyncio<3>-Footnote-4492126 +Ref: asyncio<3>-Footnote-5492191 +Ref: asyncio<3>-Footnote-6492256 +Node: compileall492321 +Ref: whatsnew/3 9 compileall492433 +Ref: 52b492433 +Ref: compileall-Footnote-1493023 +Ref: compileall-Footnote-2493088 +Node: concurrent futures493153 +Ref: whatsnew/3 9 concurrent-futures493264 +Ref: 52c493264 +Ref: concurrent futures-Footnote-1494143 +Ref: concurrent futures-Footnote-2494208 +Ref: concurrent futures-Footnote-3494273 +Node: curses<2>494338 +Ref: whatsnew/3 9 curses494450 +Ref: 52f494450 +Ref: curses<2>-Footnote-1494724 +Node: datetime<2>494789 +Ref: whatsnew/3 9 datetime494895 +Ref: 534494895 +Ref: datetime<2>-Footnote-1495214 +Node: distutils<2>495279 +Ref: whatsnew/3 9 distutils495384 +Ref: 53a495384 +Ref: distutils<2>-Footnote-1495635 +Node: fcntl<2>495700 +Ref: whatsnew/3 9 fcntl495800 +Ref: 53b495800 +Ref: fcntl<2>-Footnote-1495989 +Node: ftplib496054 +Ref: whatsnew/3 9 ftplib496147 +Ref: 53c496147 +Ref: ftplib-Footnote-1496438 +Node: gc<2>496503 +Ref: whatsnew/3 9 gc496598 +Ref: 53f496598 +Ref: gc<2>-Footnote-1497136 +Ref: gc<2>-Footnote-2497201 +Node: hashlib<3>497266 +Ref: whatsnew/3 9 hashlib497359 +Ref: 541497359 +Ref: hashlib<3>-Footnote-1497868 +Ref: hashlib<3>-Footnote-2497933 +Node: http497998 +Ref: whatsnew/3 9 http498105 +Ref: 542498105 +Ref: http-Footnote-1498378 +Ref: http-Footnote-2498443 +Node: IDLE and idlelib<3>498508 +Ref: whatsnew/3 9 idle-and-idlelib498612 +Ref: 544498612 +Ref: IDLE and idlelib<3>-Footnote-1499824 +Ref: IDLE and idlelib<3>-Footnote-2499888 +Ref: IDLE and idlelib<3>-Footnote-3499953 +Ref: IDLE and idlelib<3>-Footnote-4500018 +Ref: IDLE and idlelib<3>-Footnote-5500083 +Ref: IDLE and idlelib<3>-Footnote-6500148 +Ref: IDLE and idlelib<3>-Footnote-7500213 +Node: imaplib500278 +Ref: whatsnew/3 9 imaplib500387 +Ref: 545500387 +Ref: imaplib-Footnote-1501225 +Ref: imaplib-Footnote-2501290 +Node: importlib501355 +Ref: whatsnew/3 9 importlib501455 +Ref: 54c501455 +Ref: importlib-Footnote-1502247 +Ref: importlib-Footnote-2502312 +Ref: importlib-Footnote-3502377 +Node: inspect<3>502442 +Ref: whatsnew/3 9 inspect502544 +Ref: 54f502544 +Ref: inspect<3>-Footnote-1502776 +Ref: inspect<3>-Footnote-2502841 +Node: ipaddress502906 +Ref: whatsnew/3 9 ipaddress503006 +Ref: 551503006 +Ref: ipaddress-Footnote-1503571 +Ref: ipaddress-Footnote-2503636 +Node: math<2>503701 +Ref: whatsnew/3 9 math503806 +Ref: 554503806 +Ref: math<2>-Footnote-1504522 +Ref: math<2>-Footnote-2504587 +Ref: math<2>-Footnote-3504652 +Ref: math<2>-Footnote-4504717 +Ref: math<2>-Footnote-5504782 +Node: multiprocessing504847 +Ref: whatsnew/3 9 multiprocessing504950 +Ref: 559504950 +Ref: multiprocessing-Footnote-1505206 +Node: nntplib505271 +Ref: whatsnew/3 9 nntplib505372 +Ref: 55c505372 +Ref: nntplib-Footnote-1505669 +Node: os<3>505734 +Ref: whatsnew/3 9 os505830 +Ref: 55f505830 +Ref: os<3>-Footnote-1506587 +Ref: os<3>-Footnote-2506652 +Ref: os<3>-Footnote-3506717 +Ref: os<3>-Footnote-4506782 +Ref: os<3>-Footnote-5506847 +Ref: os<3>-Footnote-6506912 +Node: pathlib<3>506977 +Ref: whatsnew/3 9 pathlib507069 +Ref: 566507069 +Ref: pathlib<3>-Footnote-1507283 +Node: pdb507348 +Ref: whatsnew/3 9 pdb507441 +Ref: 569507441 +Ref: pdb-Footnote-1507629 +Node: poplib507694 +Ref: whatsnew/3 9 poplib507786 +Ref: 56b507786 +Ref: poplib-Footnote-1508081 +Node: pprint<2>508146 +Ref: whatsnew/3 9 pprint508240 +Ref: 56e508240 +Ref: pprint<2>-Footnote-1508436 +Node: pydoc508501 +Ref: whatsnew/3 9 pydoc508595 +Ref: 570508595 +Ref: pydoc-Footnote-1508855 +Node: random508920 +Ref: whatsnew/3 9 random509011 +Ref: 571509011 +Ref: random-Footnote-1509203 +Node: signal509268 +Ref: whatsnew/3 9 signal509361 +Ref: 572509361 +Ref: signal-Footnote-1509591 +Node: smtplib509656 +Ref: whatsnew/3 9 smtplib509752 +Ref: 574509752 +Ref: smtplib-Footnote-1510166 +Ref: smtplib-Footnote-2510231 +Node: socket<3>510296 +Ref: whatsnew/3 9 socket510393 +Ref: 578510393 +Ref: socket<3>-Footnote-1510979 +Ref: socket<3>-Footnote-2511044 +Ref: socket<3>-Footnote-3511109 +Node: time<2>511174 +Ref: whatsnew/3 9 time511270 +Ref: 57d511270 +Ref: time<2>-Footnote-1511600 +Node: sys<3>511665 +Ref: whatsnew/3 9 sys511763 +Ref: 57f511763 +Ref: sys<3>-Footnote-1512428 +Ref: sys<3>-Footnote-2512495 +Node: tracemalloc512560 +Ref: whatsnew/3 9 tracemalloc512660 +Ref: 582512660 +Ref: tracemalloc-Footnote-1512944 +Node: typing<3>513009 +Ref: whatsnew/3 9 typing513117 +Ref: 584513117 +Ref: typing<3>-Footnote-1513473 +Node: unicodedata<2>513515 +Ref: whatsnew/3 9 unicodedata513619 +Ref: 586513619 +Ref: unicodedata<2>-Footnote-1513772 +Node: venv<2>513837 +Ref: whatsnew/3 9 venv513938 +Ref: 587513938 +Ref: venv<2>-Footnote-1514400 +Node: xml<2>514465 +Ref: whatsnew/3 9 xml514543 +Ref: 588514543 +Ref: xml<2>-Footnote-1514905 +Node: Optimizations<3>514970 +Ref: whatsnew/3 9 optimizations515099 +Ref: 589515099 +Ref: Optimizations<3>-Footnote-1520862 +Ref: Optimizations<3>-Footnote-2520927 +Ref: Optimizations<3>-Footnote-3520992 +Ref: Optimizations<3>-Footnote-4521057 +Ref: Optimizations<3>-Footnote-5521122 +Ref: Optimizations<3>-Footnote-6521164 +Ref: Optimizations<3>-Footnote-7521229 +Ref: Optimizations<3>-Footnote-8521293 +Ref: Optimizations<3>-Footnote-9521358 +Ref: Optimizations<3>-Footnote-10521423 +Ref: Optimizations<3>-Footnote-11521489 +Ref: Optimizations<3>-Footnote-12521618 +Node: Deprecated<5>521669 +Ref: whatsnew/3 9 deprecated521789 +Ref: 58e521789 +Ref: Deprecated<5>-Footnote-1526853 +Ref: Deprecated<5>-Footnote-2526918 +Ref: Deprecated<5>-Footnote-3526983 +Ref: Deprecated<5>-Footnote-4527048 +Ref: Deprecated<5>-Footnote-5527113 +Ref: Deprecated<5>-Footnote-6527178 +Ref: Deprecated<5>-Footnote-7527243 +Ref: Deprecated<5>-Footnote-8527308 +Ref: Deprecated<5>-Footnote-9527373 +Ref: Deprecated<5>-Footnote-10527438 +Ref: Deprecated<5>-Footnote-11527504 +Ref: Deprecated<5>-Footnote-12527570 +Ref: Deprecated<5>-Footnote-13527636 +Ref: Deprecated<5>-Footnote-14527702 +Ref: Deprecated<5>-Footnote-15527768 +Ref: Deprecated<5>-Footnote-16527811 +Ref: Deprecated<5>-Footnote-17527851 +Ref: Deprecated<5>-Footnote-18527890 +Ref: Deprecated<5>-Footnote-19527956 +Node: Removed<5>528022 +Ref: whatsnew/3 9 removed528147 +Ref: 595528147 +Ref: whatsnew/3 9 removed-in-python-39528147 +Ref: 507528147 +Ref: Removed<5>-Footnote-1534322 +Ref: Removed<5>-Footnote-2534387 +Ref: Removed<5>-Footnote-3534452 +Ref: Removed<5>-Footnote-4534517 +Ref: Removed<5>-Footnote-5534582 +Ref: Removed<5>-Footnote-6534647 +Ref: Removed<5>-Footnote-7534712 +Ref: Removed<5>-Footnote-8534777 +Ref: Removed<5>-Footnote-9534842 +Ref: Removed<5>-Footnote-10534907 +Ref: Removed<5>-Footnote-11534973 +Ref: Removed<5>-Footnote-12535016 +Ref: Removed<5>-Footnote-13535082 +Ref: Removed<5>-Footnote-14535148 +Ref: Removed<5>-Footnote-15535214 +Ref: Removed<5>-Footnote-16535280 +Ref: Removed<5>-Footnote-17535346 +Ref: Removed<5>-Footnote-18535412 +Ref: Removed<5>-Footnote-19535478 +Ref: Removed<5>-Footnote-20535544 +Ref: Removed<5>-Footnote-21535610 +Ref: Removed<5>-Footnote-22535676 +Node: Porting to Python 3 9535742 +Ref: whatsnew/3 9 porting-to-python-3-9535870 +Ref: 5aa535870 +Node: Changes in the Python API<2>536211 +Ref: whatsnew/3 9 changes-in-the-python-api536329 +Ref: 5ab536329 +Ref: Changes in the Python API<2>-Footnote-1540515 +Ref: Changes in the Python API<2>-Footnote-2540580 +Ref: Changes in the Python API<2>-Footnote-3540645 +Ref: Changes in the Python API<2>-Footnote-4540710 +Ref: Changes in the Python API<2>-Footnote-5540769 +Ref: Changes in the Python API<2>-Footnote-6540834 +Ref: Changes in the Python API<2>-Footnote-7540899 +Ref: Changes in the Python API<2>-Footnote-8540964 +Ref: Changes in the Python API<2>-Footnote-9541029 +Ref: Changes in the Python API<2>-Footnote-10541094 +Ref: Changes in the Python API<2>-Footnote-11541160 +Node: Changes in the C API<2>541226 +Ref: whatsnew/3 9 changes-in-the-c-api541380 +Ref: 5b6541380 +Ref: Changes in the C API<2>-Footnote-1543504 +Ref: Changes in the C API<2>-Footnote-2543569 +Ref: Changes in the C API<2>-Footnote-3543634 +Node: CPython bytecode changes<3>543699 +Ref: whatsnew/3 9 cpython-bytecode-changes543816 +Ref: 5ba543816 +Ref: CPython bytecode changes<3>-Footnote-1544639 +Ref: CPython bytecode changes<3>-Footnote-2544704 +Node: Build Changes<3>544769 +Ref: whatsnew/3 9 build-changes544903 +Ref: 5be544903 +Ref: Build Changes<3>-Footnote-1547321 +Ref: Build Changes<3>-Footnote-2547388 +Ref: Build Changes<3>-Footnote-3547453 +Ref: Build Changes<3>-Footnote-4547518 +Ref: Build Changes<3>-Footnote-5547583 +Ref: Build Changes<3>-Footnote-6547648 +Ref: Build Changes<3>-Footnote-7547713 +Ref: Build Changes<3>-Footnote-8547778 +Node: C API Changes<3>547843 +Ref: whatsnew/3 9 c-api-changes547987 +Ref: 5c0547987 +Node: New Features<6>548147 +Ref: whatsnew/3 9 id1548248 +Ref: 5c1548248 +Ref: New Features<6>-Footnote-1551266 +Ref: New Features<6>-Footnote-2551308 +Ref: New Features<6>-Footnote-3551373 +Ref: New Features<6>-Footnote-4551438 +Ref: New Features<6>-Footnote-5551503 +Ref: New Features<6>-Footnote-6551568 +Ref: New Features<6>-Footnote-7551633 +Ref: New Features<6>-Footnote-8551698 +Ref: New Features<6>-Footnote-9551763 +Ref: New Features<6>-Footnote-10551828 +Ref: New Features<6>-Footnote-11551894 +Ref: New Features<6>-Footnote-12551960 +Node: Porting to Python 3 9<2>552026 +Ref: whatsnew/3 9 id2552146 +Ref: 5ce552146 +Ref: Porting to Python 3 9<2>-Footnote-1555993 +Ref: Porting to Python 3 9<2>-Footnote-2556035 +Ref: Porting to Python 3 9<2>-Footnote-3556100 +Ref: Porting to Python 3 9<2>-Footnote-4556165 +Ref: Porting to Python 3 9<2>-Footnote-5556229 +Ref: Porting to Python 3 9<2>-Footnote-6556294 +Ref: Porting to Python 3 9<2>-Footnote-7556359 +Ref: Porting to Python 3 9<2>-Footnote-8556401 +Ref: Porting to Python 3 9<2>-Footnote-9556466 +Ref: Porting to Python 3 9<2>-Footnote-10556531 +Ref: Porting to Python 3 9<2>-Footnote-11556597 +Node: Removed<6>556663 +Ref: whatsnew/3 9 id3556759 +Ref: 5e2556759 +Ref: Removed<6>-Footnote-1560700 +Ref: Removed<6>-Footnote-2560765 +Ref: Removed<6>-Footnote-3560830 +Ref: Removed<6>-Footnote-4560895 +Ref: Removed<6>-Footnote-5560960 +Ref: Removed<6>-Footnote-6561025 +Ref: Removed<6>-Footnote-7561090 +Ref: Removed<6>-Footnote-8561155 +Ref: Removed<6>-Footnote-9561220 +Ref: Removed<6>-Footnote-10561285 +Ref: Removed<6>-Footnote-11561351 +Ref: Removed<6>-Footnote-12561394 +Ref: Removed<6>-Footnote-13561460 +Node: Notable changes in Python 3 9 1561526 +Ref: whatsnew/3 9 notable-changes-in-python-3-9-1561685 +Ref: 5e5561685 +Node: typing<4>561899 +Ref: whatsnew/3 9 id4562033 +Ref: 5e6562033 +Ref: typing<4>-Footnote-1563225 +Ref: typing<4>-Footnote-2563267 +Node: macOS 11 0 Big Sur and Apple Silicon Mac support563332 +Ref: whatsnew/3 9 macos-11-0-big-sur-and-apple-silicon-mac-support563466 +Ref: 5e7563466 +Ref: macOS 11 0 Big Sur and Apple Silicon Mac support-Footnote-1564276 +Node: Notable changes in Python 3 9 2564341 +Ref: whatsnew/3 9 notable-changes-in-python-3-9-2564475 +Ref: 5e8564475 +Node: collections abc<2>564636 +Ref: whatsnew/3 9 collections-abc564746 +Ref: 5e9564746 +Ref: collections abc<2>-Footnote-1565725 +Node: urllib parse<2>565790 +Ref: whatsnew/3 9 urllib-parse565900 +Ref: 5ea565900 +Ref: urllib parse<2>-Footnote-1566596 +Node: What’s New In Python 3 8566661 +Ref: whatsnew/3 8 doc566816 +Ref: 5eb566816 +Ref: whatsnew/3 8 what-s-new-in-python-3-8566816 +Ref: 5ec566816 +Node: Summary – Release highlights<4>567683 +Ref: whatsnew/3 8 summary-release-highlights567803 +Ref: 5ed567803 +Node: New Features<7>567876 +Ref: whatsnew/3 8 new-features568030 +Ref: 5ee568030 +Node: Assignment expressions568653 +Ref: whatsnew/3 8 assignment-expressions568762 +Ref: 5ef568762 +Ref: Assignment expressions-Footnote-1570268 +Ref: Assignment expressions-Footnote-2570365 +Ref: Assignment expressions-Footnote-3570407 +Node: Positional-only parameters570472 +Ref: whatsnew/3 8 positional-only-parameters570643 +Ref: 5f0570643 +Ref: Positional-only parameters-Footnote-1573325 +Ref: Positional-only parameters-Footnote-2573377 +Ref: Positional-only parameters-Footnote-3573419 +Node: Parallel filesystem cache for compiled bytecode files573484 +Ref: whatsnew/3 8 parallel-filesystem-cache-for-compiled-bytecode-files573679 +Ref: 5f2573679 +Ref: Parallel filesystem cache for compiled bytecode files-Footnote-1574321 +Node: Debug build uses the same ABI as release build574386 +Ref: whatsnew/3 8 debug-build-uses-the-same-abi-as-release-build574621 +Ref: 5f5574621 +Ref: Debug build uses the same ABI as release build-Footnote-1576974 +Ref: Debug build uses the same ABI as release build-Footnote-2577039 +Ref: Debug build uses the same ABI as release build-Footnote-3577104 +Ref: Debug build uses the same ABI as release build-Footnote-4577169 +Node: f-strings support = for self-documenting expressions and debugging577234 +Ref: whatsnew/3 8 bpo-36817-whatsnew577450 +Ref: 5f7577450 +Ref: whatsnew/3 8 f-strings-support-for-self-documenting-expressions-and-debugging577450 +Ref: 5f8577450 +Ref: f-strings support = for self-documenting expressions and debugging-Footnote-1578539 +Node: PEP 578 Python Runtime Audit Hooks578604 +Ref: whatsnew/3 8 pep-578-python-runtime-audit-hooks578817 +Ref: 5fa578817 +Ref: PEP 578 Python Runtime Audit Hooks-Footnote-1579300 +Node: PEP 587 Python Initialization Configuration579342 +Ref: whatsnew/3 8 pep-587-python-initialization-configuration579543 +Ref: 5fb579543 +Ref: PEP 587 Python Initialization Configuration-Footnote-1581410 +Ref: PEP 587 Python Initialization Configuration-Footnote-2581452 +Ref: PEP 587 Python Initialization Configuration-Footnote-3581494 +Node: PEP 590 Vectorcall a fast calling protocol for CPython581559 +Ref: whatsnew/3 8 pep-590-vectorcall-a-fast-calling-protocol-for-cpython581773 +Ref: 605581773 +Ref: PEP 590 Vectorcall a fast calling protocol for CPython-Footnote-1582381 +Ref: PEP 590 Vectorcall a fast calling protocol for CPython-Footnote-2582423 +Node: Pickle protocol 5 with out-of-band data buffers582488 +Ref: whatsnew/3 8 pickle-protocol-5-with-out-of-band-data-buffers582650 +Ref: 607582650 +Ref: Pickle protocol 5 with out-of-band data buffers-Footnote-1583402 +Ref: Pickle protocol 5 with out-of-band data buffers-Footnote-2583444 +Ref: Pickle protocol 5 with out-of-band data buffers-Footnote-3583486 +Node: Other Language Changes<4>583551 +Ref: whatsnew/3 8 other-language-changes583686 +Ref: 608583686 +Ref: Other Language Changes<4>-Footnote-1591059 +Ref: Other Language Changes<4>-Footnote-2591124 +Ref: Other Language Changes<4>-Footnote-3591189 +Ref: Other Language Changes<4>-Footnote-4591254 +Ref: Other Language Changes<4>-Footnote-5591319 +Ref: Other Language Changes<4>-Footnote-6591384 +Ref: Other Language Changes<4>-Footnote-7591449 +Ref: Other Language Changes<4>-Footnote-8591514 +Ref: Other Language Changes<4>-Footnote-9591579 +Ref: Other Language Changes<4>-Footnote-10591644 +Ref: Other Language Changes<4>-Footnote-11591710 +Ref: Other Language Changes<4>-Footnote-12591778 +Ref: Other Language Changes<4>-Footnote-13591844 +Ref: Other Language Changes<4>-Footnote-14591914 +Ref: Other Language Changes<4>-Footnote-15591974 +Ref: Other Language Changes<4>-Footnote-16592040 +Ref: Other Language Changes<4>-Footnote-17592106 +Node: New Modules<4>592172 +Ref: whatsnew/3 8 new-modules592311 +Ref: 615592311 +Ref: New Modules<4>-Footnote-1593389 +Node: Improved Modules<4>593454 +Ref: whatsnew/3 8 improved-modules593584 +Ref: 616593584 +Node: ast<2>594525 +Ref: whatsnew/3 8 ast594606 +Ref: 617594606 +Ref: ast<2>-Footnote-1595638 +Ref: ast<2>-Footnote-2595703 +Ref: ast<2>-Footnote-3595745 +Ref: ast<2>-Footnote-4595787 +Ref: ast<2>-Footnote-5595829 +Node: asyncio<4>595894 +Ref: whatsnew/3 8 asyncio595992 +Ref: 61a595992 +Ref: asyncio<4>-Footnote-1599148 +Ref: asyncio<4>-Footnote-2599213 +Ref: asyncio<4>-Footnote-3599278 +Ref: asyncio<4>-Footnote-4599343 +Ref: asyncio<4>-Footnote-5599408 +Ref: asyncio<4>-Footnote-6599473 +Ref: asyncio<4>-Footnote-7599538 +Ref: asyncio<4>-Footnote-8599603 +Ref: asyncio<4>-Footnote-9599668 +Ref: asyncio<4>-Footnote-10599721 +Node: builtins599787 +Ref: whatsnew/3 8 builtins599890 +Ref: 622599890 +Ref: builtins-Footnote-1600389 +Node: collections600454 +Ref: whatsnew/3 8 collections600555 +Ref: 623600555 +Ref: collections-Footnote-1601077 +Node: cProfile601142 +Ref: whatsnew/3 8 cprofile601238 +Ref: 625601238 +Ref: cProfile-Footnote-1601588 +Node: csv601653 +Ref: whatsnew/3 8 csv601747 +Ref: 627601747 +Ref: csv-Footnote-1602064 +Node: curses<3>602129 +Ref: whatsnew/3 8 curses602221 +Ref: 629602221 +Ref: curses<3>-Footnote-1602465 +Node: ctypes602530 +Ref: whatsnew/3 8 ctypes602630 +Ref: 62b602630 +Ref: ctypes-Footnote-1603119 +Node: datetime<3>603184 +Ref: whatsnew/3 8 datetime603287 +Ref: 62e603287 +Ref: datetime<3>-Footnote-1603715 +Node: functools<2>603780 +Ref: whatsnew/3 8 functools603882 +Ref: 631603882 +Ref: functools<2>-Footnote-1605424 +Ref: functools<2>-Footnote-2605489 +Ref: functools<2>-Footnote-3605554 +Node: gc<3>605619 +Ref: whatsnew/3 8 gc605717 +Ref: 637605717 +Ref: gc<3>-Footnote-1605950 +Node: gettext606015 +Ref: whatsnew/3 8 gettext606105 +Ref: 638606105 +Ref: gettext-Footnote-1606306 +Node: gzip606370 +Ref: whatsnew/3 8 gzip606474 +Ref: 63a606474 +Ref: gzip-Footnote-1606891 +Ref: gzip-Footnote-2606956 +Node: IDLE and idlelib<4>607020 +Ref: whatsnew/3 8 idle-and-idlelib607127 +Ref: 63d607127 +Ref: IDLE and idlelib<4>-Footnote-1609096 +Ref: IDLE and idlelib<4>-Footnote-2609163 +Ref: IDLE and idlelib<4>-Footnote-3609227 +Ref: IDLE and idlelib<4>-Footnote-4609292 +Ref: IDLE and idlelib<4>-Footnote-5609357 +Ref: IDLE and idlelib<4>-Footnote-6609422 +Ref: IDLE and idlelib<4>-Footnote-7609486 +Ref: IDLE and idlelib<4>-Footnote-8609551 +Node: inspect<4>609616 +Ref: whatsnew/3 8 inspect609721 +Ref: 63e609721 +Ref: inspect<4>-Footnote-1610487 +Node: io610552 +Ref: whatsnew/3 8 io610650 +Ref: 640610650 +Ref: io-Footnote-1610998 +Node: itertools<2>611063 +Ref: whatsnew/3 8 itertools611160 +Ref: 642611160 +Ref: itertools<2>-Footnote-1611538 +Node: json tool611603 +Ref: whatsnew/3 8 json-tool611708 +Ref: 644611708 +Ref: json tool-Footnote-1611915 +Node: logging<2>611980 +Ref: whatsnew/3 8 logging612080 +Ref: 645612080 +Ref: logging<2>-Footnote-1612796 +Node: math<3>612861 +Ref: whatsnew/3 8 math612956 +Ref: 647612956 +Ref: math<3>-Footnote-1614705 +Ref: math<3>-Footnote-2614770 +Ref: math<3>-Footnote-3614835 +Ref: math<3>-Footnote-4614900 +Ref: math<3>-Footnote-5614965 +Ref: math<3>-Footnote-6615030 +Ref: math<3>-Footnote-7615095 +Ref: math<3>-Footnote-8615160 +Node: mmap615225 +Ref: whatsnew/3 8 mmap615328 +Ref: 64d615328 +Ref: mmap-Footnote-1615558 +Node: multiprocessing<2>615623 +Ref: whatsnew/3 8 multiprocessing615724 +Ref: 650615724 +Ref: multiprocessing<2>-Footnote-1616028 +Ref: multiprocessing<2>-Footnote-2616093 +Node: os<4>616158 +Ref: whatsnew/3 8 os616265 +Ref: 651616265 +Ref: os<4>-Footnote-1617773 +Ref: os<4>-Footnote-2617838 +Ref: os<4>-Footnote-3617903 +Node: os path<2>617968 +Ref: whatsnew/3 8 os-path618067 +Ref: 656618067 +Ref: os path<2>-Footnote-1619090 +Ref: os path<2>-Footnote-2619155 +Ref: os path<2>-Footnote-3619220 +Node: pathlib<4>619285 +Ref: whatsnew/3 8 pathlib619385 +Ref: 65e619385 +Ref: pathlib<4>-Footnote-1620111 +Ref: pathlib<4>-Footnote-2620176 +Node: pickle620241 +Ref: whatsnew/3 8 pickle620339 +Ref: 669620339 +Ref: pickle-Footnote-1620677 +Node: plistlib620742 +Ref: whatsnew/3 8 plistlib620839 +Ref: 66c620839 +Ref: plistlib-Footnote-1621077 +Node: pprint<3>621142 +Ref: whatsnew/3 8 pprint621246 +Ref: 66e621246 +Ref: pprint<3>-Footnote-1622311 +Node: py_compile<2>622376 +Ref: whatsnew/3 8 py-compile622477 +Ref: 670622477 +Ref: py_compile<2>-Footnote-1622666 +Node: shlex622731 +Ref: whatsnew/3 8 shlex622832 +Ref: 672622832 +Ref: shlex-Footnote-1623036 +Node: shutil<2>623101 +Ref: whatsnew/3 8 shutil623198 +Ref: 674623198 +Ref: shutil<2>-Footnote-1623851 +Ref: shutil<2>-Footnote-2623916 +Ref: shutil<2>-Footnote-3623981 +Node: socket<4>624046 +Ref: whatsnew/3 8 socket624144 +Ref: 677624144 +Ref: socket<4>-Footnote-1624719 +Ref: socket<4>-Footnote-2624784 +Node: ssl<2>624849 +Ref: whatsnew/3 8 ssl624951 +Ref: 67d624951 +Ref: ssl<2>-Footnote-1625213 +Node: statistics<2>625278 +Ref: whatsnew/3 8 statistics625377 +Ref: 680625377 +Ref: statistics<2>-Footnote-1627108 +Ref: statistics<2>-Footnote-2627173 +Ref: statistics<2>-Footnote-3627238 +Ref: statistics<2>-Footnote-4627303 +Ref: statistics<2>-Footnote-5627368 +Node: sys<4>627433 +Ref: whatsnew/3 8 sys627533 +Ref: 686627533 +Ref: sys<4>-Footnote-1627976 +Node: tarfile628041 +Ref: whatsnew/3 8 tarfile628140 +Ref: 688628140 +Ref: tarfile-Footnote-1628558 +Node: threading<3>628623 +Ref: whatsnew/3 8 threading628724 +Ref: 689628724 +Ref: threading<3>-Footnote-1629460 +Ref: threading<3>-Footnote-2629527 +Node: tokenize629592 +Ref: whatsnew/3 8 tokenize629696 +Ref: 68d629696 +Ref: tokenize-Footnote-1630022 +Node: tkinter<2>630087 +Ref: whatsnew/3 8 tkinter630186 +Ref: 68e630186 +Ref: tkinter<2>-Footnote-1630729 +Ref: tkinter<2>-Footnote-2630794 +Ref: tkinter<2>-Footnote-3630859 +Node: time<3>630924 +Ref: whatsnew/3 8 time631024 +Ref: 68f631024 +Ref: time<3>-Footnote-1631203 +Node: typing<5>631268 +Ref: whatsnew/3 8 typing631372 +Ref: 691631372 +Ref: typing<5>-Footnote-1632846 +Ref: typing<5>-Footnote-2632888 +Ref: typing<5>-Footnote-3632930 +Ref: typing<5>-Footnote-4632972 +Node: unicodedata<3>633014 +Ref: whatsnew/3 8 unicodedata633122 +Ref: 697633122 +Ref: unicodedata<3>-Footnote-1633551 +Ref: unicodedata<3>-Footnote-2633613 +Ref: unicodedata<3>-Footnote-3633678 +Node: unittest<3>633743 +Ref: whatsnew/3 8 unittest633849 +Ref: 699633849 +Ref: unittest<3>-Footnote-1635139 +Ref: unittest<3>-Footnote-2635204 +Ref: unittest<3>-Footnote-3635269 +Ref: unittest<3>-Footnote-4635334 +Node: venv<3>635399 +Ref: whatsnew/3 8 venv635498 +Ref: 69f635498 +Ref: venv<3>-Footnote-1635750 +Node: weakref635815 +Ref: whatsnew/3 8 weakref635909 +Ref: 6a0635909 +Ref: weakref-Footnote-1636202 +Node: xml<3>636267 +Ref: whatsnew/3 8 xml636360 +Ref: 6a2636360 +Ref: xml<3>-Footnote-1637534 +Ref: xml<3>-Footnote-2637599 +Ref: xml<3>-Footnote-3637664 +Ref: xml<3>-Footnote-4637729 +Ref: xml<3>-Footnote-5637794 +Node: xmlrpc637859 +Ref: whatsnew/3 8 xmlrpc637936 +Ref: 6a5637936 +Ref: xmlrpc-Footnote-1638328 +Node: Optimizations<4>638393 +Ref: whatsnew/3 8 optimizations638532 +Ref: 6a7638532 +Ref: Optimizations<4>-Footnote-1642906 +Ref: Optimizations<4>-Footnote-2642971 +Ref: Optimizations<4>-Footnote-3643036 +Ref: Optimizations<4>-Footnote-4643101 +Ref: Optimizations<4>-Footnote-5643166 +Ref: Optimizations<4>-Footnote-6643231 +Ref: Optimizations<4>-Footnote-7643296 +Ref: Optimizations<4>-Footnote-8643361 +Ref: Optimizations<4>-Footnote-9643426 +Ref: Optimizations<4>-Footnote-10643491 +Ref: Optimizations<4>-Footnote-11643557 +Ref: Optimizations<4>-Footnote-12643623 +Ref: Optimizations<4>-Footnote-13643689 +Node: Build and C API Changes643755 +Ref: whatsnew/3 8 build-and-c-api-changes643888 +Ref: 6b4643888 +Ref: Build and C API Changes-Footnote-1649479 +Ref: Build and C API Changes-Footnote-2649544 +Ref: Build and C API Changes-Footnote-3649609 +Ref: Build and C API Changes-Footnote-4649674 +Ref: Build and C API Changes-Footnote-5649739 +Ref: Build and C API Changes-Footnote-6649804 +Ref: Build and C API Changes-Footnote-7649869 +Ref: Build and C API Changes-Footnote-8649934 +Ref: Build and C API Changes-Footnote-9649999 +Ref: Build and C API Changes-Footnote-10650064 +Ref: Build and C API Changes-Footnote-11650130 +Ref: Build and C API Changes-Footnote-12650196 +Node: Deprecated<6>650262 +Ref: whatsnew/3 8 deprecated650403 +Ref: 6bf650403 +Ref: Deprecated<6>-Footnote-1656214 +Ref: Deprecated<6>-Footnote-2656279 +Ref: Deprecated<6>-Footnote-3656344 +Ref: Deprecated<6>-Footnote-4656409 +Ref: Deprecated<6>-Footnote-5656473 +Ref: Deprecated<6>-Footnote-6656538 +Ref: Deprecated<6>-Footnote-7656603 +Ref: Deprecated<6>-Footnote-8656668 +Ref: Deprecated<6>-Footnote-9656733 +Ref: Deprecated<6>-Footnote-10656798 +Ref: Deprecated<6>-Footnote-11656864 +Ref: Deprecated<6>-Footnote-12656930 +Ref: Deprecated<6>-Footnote-13656996 +Node: API and Feature Removals657062 +Ref: whatsnew/3 8 api-and-feature-removals657201 +Ref: 6d8657201 +Ref: API and Feature Removals-Footnote-1660034 +Ref: API and Feature Removals-Footnote-2660099 +Ref: API and Feature Removals-Footnote-3660164 +Ref: API and Feature Removals-Footnote-4660229 +Ref: API and Feature Removals-Footnote-5660294 +Ref: API and Feature Removals-Footnote-6660359 +Ref: API and Feature Removals-Footnote-7660424 +Ref: API and Feature Removals-Footnote-8660489 +Ref: API and Feature Removals-Footnote-9660554 +Ref: API and Feature Removals-Footnote-10660619 +Ref: API and Feature Removals-Footnote-11660685 +Node: Porting to Python 3 8660751 +Ref: whatsnew/3 8 porting-to-python-3-8660908 +Ref: 6dd660908 +Node: Changes in Python behavior661300 +Ref: whatsnew/3 8 changes-in-python-behavior661421 +Ref: 6de661421 +Ref: Changes in Python behavior-Footnote-1663801 +Ref: Changes in Python behavior-Footnote-2663866 +Ref: Changes in Python behavior-Footnote-3663931 +Ref: Changes in Python behavior-Footnote-4663996 +Ref: Changes in Python behavior-Footnote-5664061 +Ref: Changes in Python behavior-Footnote-6664126 +Node: Changes in the Python API<3>664191 +Ref: whatsnew/3 8 changes-in-the-python-api664344 +Ref: 6e6664344 +Ref: whatsnew/3 8 bpo-36085-whatsnew671321 +Ref: 6f8671321 +Ref: Changes in the Python API<3>-Footnote-1672981 +Ref: Changes in the Python API<3>-Footnote-2673023 +Ref: Changes in the Python API<3>-Footnote-3673088 +Ref: Changes in the Python API<3>-Footnote-4673153 +Ref: Changes in the Python API<3>-Footnote-5673218 +Ref: Changes in the Python API<3>-Footnote-6673283 +Ref: Changes in the Python API<3>-Footnote-7673348 +Ref: Changes in the Python API<3>-Footnote-8673413 +Ref: Changes in the Python API<3>-Footnote-9673478 +Ref: Changes in the Python API<3>-Footnote-10673543 +Ref: Changes in the Python API<3>-Footnote-11673609 +Ref: Changes in the Python API<3>-Footnote-12673675 +Ref: Changes in the Python API<3>-Footnote-13673741 +Ref: Changes in the Python API<3>-Footnote-14673807 +Ref: Changes in the Python API<3>-Footnote-15673873 +Ref: Changes in the Python API<3>-Footnote-16673939 +Ref: Changes in the Python API<3>-Footnote-17674005 +Ref: Changes in the Python API<3>-Footnote-18674070 +Ref: Changes in the Python API<3>-Footnote-19674136 +Ref: Changes in the Python API<3>-Footnote-20674202 +Ref: Changes in the Python API<3>-Footnote-21674268 +Ref: Changes in the Python API<3>-Footnote-22674334 +Ref: Changes in the Python API<3>-Footnote-23674400 +Ref: Changes in the Python API<3>-Footnote-24674466 +Ref: Changes in the Python API<3>-Footnote-25674532 +Ref: Changes in the Python API<3>-Footnote-26674598 +Ref: Changes in the Python API<3>-Footnote-27674664 +Node: Changes in the C API<3>674707 +Ref: whatsnew/3 8 changes-in-the-c-api674861 +Ref: 6fa674861 +Ref: Changes in the C API<3>-Footnote-1680706 +Ref: Changes in the C API<3>-Footnote-2680771 +Ref: Changes in the C API<3>-Footnote-3680836 +Ref: Changes in the C API<3>-Footnote-4680901 +Ref: Changes in the C API<3>-Footnote-5680966 +Ref: Changes in the C API<3>-Footnote-6681031 +Ref: Changes in the C API<3>-Footnote-7681096 +Ref: Changes in the C API<3>-Footnote-8681161 +Node: CPython bytecode changes<4>681226 +Ref: whatsnew/3 8 cpython-bytecode-changes681367 +Ref: 705681367 +Ref: CPython bytecode changes<4>-Footnote-1682692 +Ref: CPython bytecode changes<4>-Footnote-2682757 +Ref: CPython bytecode changes<4>-Footnote-3682822 +Ref: CPython bytecode changes<4>-Footnote-4682864 +Node: Demos and Tools682929 +Ref: whatsnew/3 8 demos-and-tools683038 +Ref: 70a683038 +Ref: Demos and Tools-Footnote-1686335 +Ref: Demos and Tools-Footnote-2686400 +Ref: Demos and Tools-Footnote-3686528 +Node: Notable changes in Python 3 8 1686578 +Ref: whatsnew/3 8 notable-changes-in-python-3-8-1686742 +Ref: 70b686742 +Ref: Notable changes in Python 3 8 1-Footnote-1687253 +Node: Notable changes in Python 3 8 8687318 +Ref: whatsnew/3 8 notable-changes-in-python-3-8-8687493 +Ref: 70c687493 +Ref: Notable changes in Python 3 8 8-Footnote-1688223 +Node: Notable changes in Python 3 8 12688288 +Ref: whatsnew/3 8 notable-changes-in-python-3-8-12688423 +Ref: 70d688423 +Ref: Notable changes in Python 3 8 12-Footnote-1689044 +Node: What’s New In Python 3 7689109 +Ref: whatsnew/3 7 doc689264 +Ref: 70e689264 +Ref: whatsnew/3 7 what-s-new-in-python-3-7689264 +Ref: 70f689264 +Node: Summary – Release Highlights690560 +Ref: whatsnew/3 7 summary-release-highlights690677 +Ref: 710690677 +Ref: Summary – Release Highlights-Footnote-1692825 +Ref: Summary – Release Highlights-Footnote-2692905 +Ref: Summary – Release Highlights-Footnote-3692941 +Ref: Summary – Release Highlights-Footnote-4692977 +Node: New Features<8>693013 +Ref: whatsnew/3 7 new-features693164 +Ref: 725693164 +Node: PEP 563 Postponed Evaluation of Annotations694261 +Ref: whatsnew/3 7 pep-563-postponed-evaluation-of-annotations694397 +Ref: 726694397 +Ref: whatsnew/3 7 whatsnew37-pep563694397 +Ref: 711694397 +Ref: PEP 563 Postponed Evaluation of Annotations-Footnote-1696161 +Ref: PEP 563 Postponed Evaluation of Annotations-Footnote-2696203 +Ref: PEP 563 Postponed Evaluation of Annotations-Footnote-3696245 +Node: PEP 538 Legacy C Locale Coercion696287 +Ref: whatsnew/3 7 pep-538-legacy-c-locale-coercion696465 +Ref: 727696465 +Ref: whatsnew/3 7 whatsnew37-pep538696465 +Ref: 71c696465 +Ref: PEP 538 Legacy C Locale Coercion-Footnote-1698852 +Ref: PEP 538 Legacy C Locale Coercion-Footnote-2698894 +Ref: PEP 538 Legacy C Locale Coercion-Footnote-3698936 +Ref: PEP 538 Legacy C Locale Coercion-Footnote-4698978 +Node: PEP 540 Forced UTF-8 Runtime Mode699020 +Ref: whatsnew/3 7 pep-540-forced-utf-8-runtime-mode699182 +Ref: 72b699182 +Ref: whatsnew/3 7 whatsnew37-pep540699182 +Ref: 71d699182 +Ref: PEP 540 Forced UTF-8 Runtime Mode-Footnote-1700746 +Ref: PEP 540 Forced UTF-8 Runtime Mode-Footnote-2700788 +Ref: PEP 540 Forced UTF-8 Runtime Mode-Footnote-3700830 +Node: PEP 553 Built-in breakpoint700872 +Ref: whatsnew/3 7 pep-553-built-in-breakpoint701044 +Ref: 72d701044 +Ref: whatsnew/3 7 whatsnew37-pep553701044 +Ref: 715701044 +Ref: PEP 553 Built-in breakpoint-Footnote-1701883 +Node: PEP 539 New C API for Thread-Local Storage701925 +Ref: whatsnew/3 7 pep-539-new-c-api-for-thread-local-storage702116 +Ref: 730702116 +Ref: whatsnew/3 7 whatsnew37-pep539702116 +Ref: 721702116 +Ref: PEP 539 New C API for Thread-Local Storage-Footnote-1703611 +Ref: PEP 539 New C API for Thread-Local Storage-Footnote-2703653 +Node: PEP 562 Customization of Access to Module Attributes703695 +Ref: whatsnew/3 7 pep-562-customization-of-access-to-module-attributes703912 +Ref: 734703912 +Ref: whatsnew/3 7 whatsnew37-pep562703912 +Ref: 717703912 +Ref: PEP 562 Customization of Access to Module Attributes-Footnote-1704487 +Node: PEP 564 New Time Functions With Nanosecond Resolution704529 +Ref: whatsnew/3 7 pep-564-new-time-functions-with-nanosecond-resolution704747 +Ref: 735704747 +Ref: whatsnew/3 7 whatsnew37-pep564704747 +Ref: 71b704747 +Ref: PEP 564 New Time Functions With Nanosecond Resolution-Footnote-1705833 +Ref: PEP 564 New Time Functions With Nanosecond Resolution-Footnote-2705875 +Ref: PEP 564 New Time Functions With Nanosecond Resolution-Footnote-3705952 +Node: PEP 565 Show DeprecationWarning in __main__705994 +Ref: whatsnew/3 7 pep-565-show-deprecationwarning-in-main706216 +Ref: 73d706216 +Ref: whatsnew/3 7 whatsnew37-pep565706216 +Ref: 720706216 +Ref: PEP 565 Show DeprecationWarning in __main__-Footnote-1708148 +Node: PEP 560 Core Support for typing module and Generic Types708190 +Ref: whatsnew/3 7 pep-560-core-support-for-typing-module-and-generic-types708387 +Ref: 73f708387 +Ref: whatsnew/3 7 whatsnew37-pep560708387 +Ref: 718708387 +Ref: PEP 560 Core Support for typing module and Generic Types-Footnote-1709337 +Ref: PEP 560 Core Support for typing module and Generic Types-Footnote-2709379 +Node: PEP 552 Hash-based pyc Files709421 +Ref: whatsnew/3 7 pep-552-hash-based-pyc-files709616 +Ref: 740709616 +Ref: whatsnew/3 7 whatsnew37-pep552709616 +Ref: 71e709616 +Ref: PEP 552 Hash-based pyc Files-Footnote-1711290 +Ref: PEP 552 Hash-based pyc Files-Footnote-2711331 +Ref: PEP 552 Hash-based pyc Files-Footnote-3711373 +Node: PEP 545 Python Documentation Translations711415 +Ref: whatsnew/3 7 pep-545-python-documentation-translations711584 +Ref: 741711584 +Ref: whatsnew/3 7 whatsnew37-pep545711584 +Ref: 722711584 +Ref: PEP 545 Python Documentation Translations-Footnote-1712168 +Ref: PEP 545 Python Documentation Translations-Footnote-2712210 +Node: Python Development Mode -X dev712252 +Ref: whatsnew/3 7 python-development-mode-x-dev712384 +Ref: 742712384 +Ref: whatsnew/3 7 whatsnew37-devmode712384 +Ref: 71f712384 +Node: Other Language Changes<5>712838 +Ref: whatsnew/3 7 other-language-changes712973 +Ref: 744712973 +Ref: Other Language Changes<5>-Footnote-1715359 +Ref: Other Language Changes<5>-Footnote-2715424 +Ref: Other Language Changes<5>-Footnote-3715489 +Ref: Other Language Changes<5>-Footnote-4715554 +Ref: Other Language Changes<5>-Footnote-5715619 +Ref: Other Language Changes<5>-Footnote-6715684 +Ref: Other Language Changes<5>-Footnote-7715749 +Ref: Other Language Changes<5>-Footnote-8715814 +Ref: Other Language Changes<5>-Footnote-9715879 +Ref: Other Language Changes<5>-Footnote-10715944 +Node: New Modules<5>716010 +Ref: whatsnew/3 7 new-modules716149 +Ref: 74b716149 +Node: contextvars716287 +Ref: whatsnew/3 7 contextvars716372 +Ref: 74c716372 +Ref: whatsnew/3 7 whatsnew37-pep567716372 +Ref: 712716372 +Ref: contextvars-Footnote-1717101 +Node: dataclasses<3>717143 +Ref: whatsnew/3 7 dataclasses717256 +Ref: 74e717256 +Ref: whatsnew/3 7 whatsnew37-pep557717256 +Ref: 713717256 +Ref: dataclasses<3>-Footnote-1717927 +Node: importlib resources717969 +Ref: whatsnew/3 7 importlib-resources718062 +Ref: 751718062 +Ref: whatsnew/3 7 whatsnew37-importlib-resources718062 +Ref: 714718062 +Ref: importlib resources-Footnote-1718804 +Ref: importlib resources-Footnote-2718869 +Node: Improved Modules<5>718931 +Ref: whatsnew/3 7 improved-modules719061 +Ref: 752719061 +Node: argparse<2>720423 +Ref: whatsnew/3 7 argparse720509 +Ref: 753720509 +Ref: argparse<2>-Footnote-1720743 +Node: asyncio<5>720808 +Ref: whatsnew/3 7 asyncio720911 +Ref: 755720911 +Ref: whatsnew/3 7 whatsnew37-asyncio720911 +Ref: 71a720911 +Ref: asyncio<5>-Footnote-1727202 +Ref: asyncio<5>-Footnote-2727267 +Ref: asyncio<5>-Footnote-3727309 +Ref: asyncio<5>-Footnote-4727374 +Ref: asyncio<5>-Footnote-5727439 +Ref: asyncio<5>-Footnote-6727504 +Ref: asyncio<5>-Footnote-7727569 +Ref: asyncio<5>-Footnote-8727634 +Ref: asyncio<5>-Footnote-9727699 +Ref: asyncio<5>-Footnote-10727764 +Ref: asyncio<5>-Footnote-11727830 +Ref: asyncio<5>-Footnote-12727896 +Ref: asyncio<5>-Footnote-13727962 +Ref: asyncio<5>-Footnote-14728028 +Ref: asyncio<5>-Footnote-15728094 +Ref: asyncio<5>-Footnote-16728160 +Ref: asyncio<5>-Footnote-17728226 +Ref: asyncio<5>-Footnote-18728292 +Ref: asyncio<5>-Footnote-19728358 +Ref: asyncio<5>-Footnote-20728424 +Ref: asyncio<5>-Footnote-21728490 +Ref: asyncio<5>-Footnote-22728556 +Ref: asyncio<5>-Footnote-23728622 +Ref: asyncio<5>-Footnote-24728688 +Node: binascii728754 +Ref: whatsnew/3 7 binascii728854 +Ref: 775728854 +Ref: binascii-Footnote-1729133 +Node: calendar729198 +Ref: whatsnew/3 7 calendar729302 +Ref: 777729302 +Ref: calendar-Footnote-1729552 +Node: collections<2>729617 +Ref: whatsnew/3 7 collections729726 +Ref: 779729726 +Ref: collections<2>-Footnote-1729917 +Node: compileall<2>729982 +Ref: whatsnew/3 7 compileall730104 +Ref: 77a730104 +Ref: compileall<2>-Footnote-1730501 +Node: concurrent futures<2>730566 +Ref: whatsnew/3 7 concurrent-futures730687 +Ref: 77c730687 +Ref: concurrent futures<2>-Footnote-1731129 +Ref: concurrent futures<2>-Footnote-2731194 +Node: contextlib<3>731259 +Ref: whatsnew/3 7 contextlib731378 +Ref: 77d731378 +Ref: contextlib<3>-Footnote-1731908 +Ref: contextlib<3>-Footnote-2731973 +Ref: contextlib<3>-Footnote-3732038 +Ref: contextlib<3>-Footnote-4732103 +Node: cProfile<2>732168 +Ref: whatsnew/3 7 cprofile732271 +Ref: 782732271 +Ref: cProfile<2>-Footnote-1732497 +Node: crypt732562 +Ref: whatsnew/3 7 crypt732663 +Ref: 783732663 +Ref: crypt-Footnote-1732995 +Ref: crypt-Footnote-2733060 +Node: datetime<4>733125 +Ref: whatsnew/3 7 datetime733218 +Ref: 785733218 +Ref: datetime<4>-Footnote-1733629 +Ref: datetime<4>-Footnote-2733694 +Node: dbm733758 +Ref: whatsnew/3 7 dbm733853 +Ref: 787733853 +Node: decimal733998 +Ref: whatsnew/3 7 decimal734085 +Ref: 788734085 +Ref: decimal-Footnote-1734306 +Node: dis734371 +Ref: whatsnew/3 7 dis734467 +Ref: 789734467 +Ref: dis-Footnote-1734870 +Node: distutils<3>734935 +Ref: whatsnew/3 7 distutils735031 +Ref: 78b735031 +Ref: distutils<3>-Footnote-1735279 +Node: enum<3>735344 +Ref: whatsnew/3 7 enum735449 +Ref: 78c735449 +Ref: enum<3>-Footnote-1736117 +Ref: enum<3>-Footnote-2736182 +Node: functools<3>736247 +Ref: whatsnew/3 7 functools736345 +Ref: 78e736345 +Ref: functools<3>-Footnote-1736574 +Node: gc<4>736639 +Ref: whatsnew/3 7 gc736737 +Ref: 78f736737 +Ref: gc<4>-Footnote-1737276 +Node: hmac<2>737341 +Ref: whatsnew/3 7 hmac737438 +Ref: 793737438 +Ref: hmac<2>-Footnote-1737696 +Node: http client737761 +Ref: whatsnew/3 7 http-client737864 +Ref: 795737864 +Ref: http client-Footnote-1738121 +Node: http server738186 +Ref: whatsnew/3 7 http-server738298 +Ref: 798738298 +Ref: http server-Footnote-1739176 +Ref: http server-Footnote-2739241 +Ref: http server-Footnote-3739306 +Node: idlelib and IDLE739371 +Ref: whatsnew/3 7 idlelib-and-idle739484 +Ref: 79b739484 +Ref: idlelib and IDLE-Footnote-1742493 +Ref: idlelib and IDLE-Footnote-2742558 +Ref: idlelib and IDLE-Footnote-3742625 +Ref: idlelib and IDLE-Footnote-4742690 +Ref: idlelib and IDLE-Footnote-5742755 +Ref: idlelib and IDLE-Footnote-6742820 +Ref: idlelib and IDLE-Footnote-7742885 +Ref: idlelib and IDLE-Footnote-8742950 +Ref: idlelib and IDLE-Footnote-9743015 +Ref: idlelib and IDLE-Footnote-10743080 +Ref: idlelib and IDLE-Footnote-11743148 +Ref: idlelib and IDLE-Footnote-12743213 +Ref: idlelib and IDLE-Footnote-13743279 +Node: importlib<2>743345 +Ref: whatsnew/3 7 importlib743452 +Ref: 79c743452 +Ref: importlib<2>-Footnote-1744317 +Ref: importlib<2>-Footnote-2744382 +Ref: importlib<2>-Footnote-3744447 +Node: io<2>744512 +Ref: whatsnew/3 7 io744615 +Ref: 79f744615 +Ref: io<2>-Footnote-1744880 +Ref: io<2>-Footnote-2744945 +Node: ipaddress<2>745010 +Ref: whatsnew/3 7 ipaddress745113 +Ref: 7a1745113 +Ref: ipaddress<2>-Footnote-1745433 +Node: itertools<3>745498 +Ref: whatsnew/3 7 itertools745605 +Ref: 7a4745605 +Ref: itertools<3>-Footnote-1745842 +Node: locale<2>745907 +Ref: whatsnew/3 7 locale746012 +Ref: 7a6746012 +Ref: locale<2>-Footnote-1746426 +Node: logging<3>746491 +Ref: whatsnew/3 7 logging746591 +Ref: 7a8746591 +Ref: logging<3>-Footnote-1747115 +Ref: logging<3>-Footnote-2747180 +Ref: logging<3>-Footnote-3747245 +Node: math<4>747310 +Ref: whatsnew/3 7 math747410 +Ref: 7ac747410 +Ref: math<4>-Footnote-1747623 +Node: mimetypes747688 +Ref: whatsnew/3 7 mimetypes747784 +Ref: 7ae747784 +Ref: mimetypes-Footnote-1747999 +Node: msilib748064 +Ref: whatsnew/3 7 msilib748171 +Ref: 7af748171 +Ref: msilib-Footnote-1748373 +Node: multiprocessing<3>748438 +Ref: whatsnew/3 7 multiprocessing748541 +Ref: 7b1748541 +Ref: multiprocessing<3>-Footnote-1749188 +Ref: multiprocessing<3>-Footnote-2749253 +Ref: multiprocessing<3>-Footnote-3749318 +Node: os<5>749383 +Ref: whatsnew/3 7 os749490 +Ref: 7b5749490 +Ref: os<5>-Footnote-1750788 +Ref: os<5>-Footnote-2750853 +Ref: os<5>-Footnote-3750918 +Ref: os<5>-Footnote-4750983 +Ref: os<5>-Footnote-5751048 +Ref: os<5>-Footnote-6751113 +Ref: os<5>-Footnote-7751178 +Node: pathlib<5>751243 +Ref: whatsnew/3 7 pathlib751338 +Ref: 7c2751338 +Ref: pathlib<5>-Footnote-1751598 +Node: pdb<2>751663 +Ref: whatsnew/3 7 pdb751766 +Ref: 7c3751766 +Ref: pdb<2>-Footnote-1752176 +Ref: pdb<2>-Footnote-2752241 +Node: py_compile<3>752306 +Ref: whatsnew/3 7 py-compile752407 +Ref: 7c5752407 +Ref: py_compile<3>-Footnote-1752861 +Ref: py_compile<3>-Footnote-2752902 +Node: pydoc<2>752967 +Ref: whatsnew/3 7 pydoc753067 +Ref: 7c6753067 +Ref: pydoc<2>-Footnote-1753291 +Node: queue753356 +Ref: whatsnew/3 7 queue753448 +Ref: 7c7753448 +Ref: queue-Footnote-1753631 +Node: re<2>753696 +Ref: whatsnew/3 7 re753789 +Ref: 7c9753789 +Ref: re<2>-Footnote-1754865 +Ref: re<2>-Footnote-2754930 +Ref: re<2>-Footnote-3754995 +Ref: re<2>-Footnote-4755060 +Ref: re<2>-Footnote-5755125 +Node: signal<2>755190 +Ref: whatsnew/3 7 signal755287 +Ref: 7ce755287 +Ref: signal<2>-Footnote-1755606 +Node: socket<5>755671 +Ref: whatsnew/3 7 socket755775 +Ref: 7d0755775 +Ref: socket<5>-Footnote-1756863 +Ref: socket<5>-Footnote-2756928 +Ref: socket<5>-Footnote-3756993 +Ref: socket<5>-Footnote-4757058 +Ref: socket<5>-Footnote-5757123 +Ref: socket<5>-Footnote-6757188 +Node: socketserver757253 +Ref: whatsnew/3 7 socketserver757358 +Ref: 7d5757358 +Node: sqlite3<3>757834 +Ref: whatsnew/3 7 sqlite3757936 +Ref: 7d8757936 +Ref: sqlite3<3>-Footnote-1758378 +Ref: sqlite3<3>-Footnote-2758443 +Node: ssl<3>758508 +Ref: whatsnew/3 7 ssl758607 +Ref: 7db758607 +Ref: ssl<3>-Footnote-1761656 +Ref: ssl<3>-Footnote-2761721 +Ref: ssl<3>-Footnote-3761786 +Ref: ssl<3>-Footnote-4761851 +Ref: ssl<3>-Footnote-5761916 +Ref: ssl<3>-Footnote-6761981 +Ref: ssl<3>-Footnote-7762046 +Ref: ssl<3>-Footnote-8762111 +Ref: ssl<3>-Footnote-9762176 +Ref: ssl<3>-Footnote-10762241 +Ref: ssl<3>-Footnote-11762307 +Ref: ssl<3>-Footnote-12762373 +Ref: ssl<3>-Footnote-13762439 +Node: string<2>762505 +Ref: whatsnew/3 7 string762604 +Ref: 7e6762604 +Ref: string<2>-Footnote-1762881 +Node: subprocess762948 +Ref: whatsnew/3 7 subprocess763047 +Ref: 7e7763047 +Ref: subprocess-Footnote-1764369 +Ref: subprocess-Footnote-2764434 +Ref: subprocess-Footnote-3764499 +Ref: subprocess-Footnote-4764564 +Node: sys<5>764629 +Ref: whatsnew/3 7 sys764726 +Ref: 7eb764726 +Ref: sys<5>-Footnote-1765466 +Ref: sys<5>-Footnote-2765531 +Ref: sys<5>-Footnote-3765596 +Node: time<4>765661 +Ref: whatsnew/3 7 time765758 +Ref: 7ef765758 +Ref: time<4>-Footnote-1766968 +Ref: time<4>-Footnote-2767010 +Node: tkinter<3>767075 +Ref: whatsnew/3 7 tkinter767180 +Ref: 7f5767180 +Ref: tkinter<3>-Footnote-1767361 +Node: tracemalloc<2>767426 +Ref: whatsnew/3 7 tracemalloc767532 +Ref: 7f7767532 +Ref: tracemalloc<2>-Footnote-1767998 +Node: types<2>768063 +Ref: whatsnew/3 7 types768173 +Ref: 7fa768173 +Ref: types<2>-Footnote-1768688 +Ref: types<2>-Footnote-2768753 +Ref: types<2>-Footnote-3768818 +Ref: types<2>-Footnote-4768860 +Node: unicodedata<4>768925 +Ref: whatsnew/3 7 unicodedata769032 +Ref: 7ff769032 +Ref: unicodedata<4>-Footnote-1769235 +Node: unittest<4>769291 +Ref: whatsnew/3 7 unittest769403 +Ref: 800769403 +Ref: unittest<4>-Footnote-1769808 +Node: unittest mock769873 +Ref: whatsnew/3 7 unittest-mock769986 +Ref: 801769986 +Ref: unittest mock-Footnote-1770504 +Ref: unittest mock-Footnote-2770569 +Node: urllib parse<3>770634 +Ref: whatsnew/3 7 urllib-parse770738 +Ref: 804770738 +Ref: urllib parse<3>-Footnote-1771051 +Ref: urllib parse<3>-Footnote-2771110 +Ref: urllib parse<3>-Footnote-3771169 +Node: uu771234 +Ref: whatsnew/3 7 uu771329 +Ref: 806771329 +Ref: uu-Footnote-1771601 +Node: uuid771666 +Ref: whatsnew/3 7 uuid771757 +Ref: 808771757 +Ref: uuid-Footnote-1772397 +Ref: uuid-Footnote-2772462 +Node: warnings<2>772527 +Ref: whatsnew/3 7 warnings772625 +Ref: 80c772625 +Ref: warnings<2>-Footnote-1774090 +Ref: warnings<2>-Footnote-2774155 +Ref: warnings<2>-Footnote-3774220 +Ref: warnings<2>-Footnote-4774285 +Node: xml etree774350 +Ref: whatsnew/3 7 xml-etree774457 +Ref: 80f774457 +Ref: xml etree-Footnote-1774798 +Node: xmlrpc server774863 +Ref: whatsnew/3 7 xmlrpc-server774965 +Ref: 811774965 +Ref: xmlrpc server-Footnote-1775174 +Node: zipapp775238 +Ref: whatsnew/3 7 zipapp775341 +Ref: 812775341 +Ref: zipapp-Footnote-1775865 +Ref: zipapp-Footnote-2775930 +Node: zipfile<2>775995 +Ref: whatsnew/3 7 zipfile776076 +Ref: 814776076 +Ref: zipfile<2>-Footnote-1776441 +Ref: zipfile<2>-Footnote-2776506 +Node: C API Changes<4>776571 +Ref: whatsnew/3 7 c-api-changes776703 +Ref: 815776703 +Ref: C API Changes<4>-Footnote-1781190 +Ref: C API Changes<4>-Footnote-2781255 +Ref: C API Changes<4>-Footnote-3781320 +Ref: C API Changes<4>-Footnote-4781385 +Ref: C API Changes<4>-Footnote-5781450 +Ref: C API Changes<4>-Footnote-6781515 +Ref: C API Changes<4>-Footnote-7781580 +Ref: C API Changes<4>-Footnote-8781645 +Ref: C API Changes<4>-Footnote-9781710 +Ref: C API Changes<4>-Footnote-10781775 +Ref: C API Changes<4>-Footnote-11781841 +Ref: C API Changes<4>-Footnote-12781907 +Ref: C API Changes<4>-Footnote-13781973 +Ref: C API Changes<4>-Footnote-14782039 +Ref: C API Changes<4>-Footnote-15782105 +Ref: C API Changes<4>-Footnote-16782170 +Ref: C API Changes<4>-Footnote-17782236 +Ref: C API Changes<4>-Footnote-18782302 +Ref: C API Changes<4>-Footnote-19782368 +Ref: C API Changes<4>-Footnote-20782434 +Node: Build Changes<4>782500 +Ref: whatsnew/3 7 build-changes782629 +Ref: 831782629 +Ref: Build Changes<4>-Footnote-1783763 +Ref: Build Changes<4>-Footnote-2783828 +Ref: Build Changes<4>-Footnote-3783893 +Node: Optimizations<5>783958 +Ref: whatsnew/3 7 optimizations784110 +Ref: 832784110 +Ref: whatsnew/3 7 whatsnew37-perf784110 +Ref: 723784110 +Ref: whatsnew/3 7 whatsnew37-asyncio-perf784804 +Ref: 756784804 +Ref: Optimizations<5>-Footnote-1789358 +Ref: Optimizations<5>-Footnote-2789423 +Ref: Optimizations<5>-Footnote-3789488 +Ref: Optimizations<5>-Footnote-4789553 +Ref: Optimizations<5>-Footnote-5789618 +Ref: Optimizations<5>-Footnote-6789683 +Ref: Optimizations<5>-Footnote-7789748 +Ref: Optimizations<5>-Footnote-8789813 +Ref: Optimizations<5>-Footnote-9789878 +Ref: Optimizations<5>-Footnote-10789943 +Ref: Optimizations<5>-Footnote-11790009 +Ref: Optimizations<5>-Footnote-12790075 +Ref: Optimizations<5>-Footnote-13790141 +Ref: Optimizations<5>-Footnote-14790207 +Ref: Optimizations<5>-Footnote-15790273 +Ref: Optimizations<5>-Footnote-16790339 +Ref: Optimizations<5>-Footnote-17790405 +Ref: Optimizations<5>-Footnote-18790471 +Ref: Optimizations<5>-Footnote-19790537 +Ref: Optimizations<5>-Footnote-20790603 +Ref: Optimizations<5>-Footnote-21790669 +Ref: Optimizations<5>-Footnote-22790735 +Ref: Optimizations<5>-Footnote-23790801 +Ref: Optimizations<5>-Footnote-24790867 +Ref: Optimizations<5>-Footnote-25790933 +Ref: Optimizations<5>-Footnote-26790999 +Ref: Optimizations<5>-Footnote-27791065 +Ref: Optimizations<5>-Footnote-28791131 +Ref: Optimizations<5>-Footnote-29791197 +Ref: Optimizations<5>-Footnote-30791263 +Node: Other CPython Implementation Changes<2>791329 +Ref: whatsnew/3 7 other-cpython-implementation-changes791491 +Ref: 841791491 +Ref: Other CPython Implementation Changes<2>-Footnote-1792892 +Ref: Other CPython Implementation Changes<2>-Footnote-2792957 +Ref: Other CPython Implementation Changes<2>-Footnote-3793022 +Ref: Other CPython Implementation Changes<2>-Footnote-4793087 +Ref: Other CPython Implementation Changes<2>-Footnote-5793152 +Node: Deprecated Python Behavior793217 +Ref: whatsnew/3 7 deprecated-python-behavior793410 +Ref: 843793410 +Ref: Deprecated Python Behavior-Footnote-1794519 +Ref: Deprecated Python Behavior-Footnote-2794584 +Node: Deprecated Python modules functions and methods794649 +Ref: whatsnew/3 7 deprecated-python-modules-functions-and-methods794846 +Ref: 845794846 +Node: aifc795244 +Ref: whatsnew/3 7 aifc795351 +Ref: 846795351 +Ref: aifc-Footnote-1795577 +Node: asyncio<6>795642 +Ref: whatsnew/3 7 id2795772 +Ref: 848795772 +Ref: whatsnew/3 7 whatsnew37-asyncio-deprecated795772 +Ref: 774795772 +Ref: asyncio<6>-Footnote-1796297 +Ref: asyncio<6>-Footnote-2796362 +Node: collections<3>796427 +Ref: whatsnew/3 7 id3796559 +Ref: 849796559 +Ref: collections<3>-Footnote-1796938 +Node: dbm<2>797003 +Ref: whatsnew/3 7 id4797132 +Ref: 84a797132 +Ref: dbm<2>-Footnote-1797533 +Node: enum<4>797598 +Ref: whatsnew/3 7 id5797723 +Ref: 84b797723 +Ref: enum<4>-Footnote-1798173 +Node: gettext<2>798238 +Ref: whatsnew/3 7 gettext798369 +Ref: 84c798369 +Ref: gettext<2>-Footnote-1798614 +Node: importlib<3>798679 +Ref: whatsnew/3 7 id6798812 +Ref: 84d798812 +Ref: importlib<3>-Footnote-1799333 +Node: locale<3>799398 +Ref: whatsnew/3 7 id7799528 +Ref: 84f799528 +Ref: locale<3>-Footnote-1799737 +Node: macpath799802 +Ref: whatsnew/3 7 macpath799932 +Ref: 851799932 +Ref: macpath-Footnote-1800122 +Node: threading<4>800186 +Ref: whatsnew/3 7 threading800316 +Ref: 852800316 +Ref: threading<4>-Footnote-1800615 +Node: socket<6>800680 +Ref: whatsnew/3 7 id8800809 +Ref: 853800809 +Ref: socket<6>-Footnote-1801154 +Node: ssl<4>801219 +Ref: whatsnew/3 7 id9801341 +Ref: 854801341 +Ref: ssl<4>-Footnote-1801559 +Node: sunau801624 +Ref: whatsnew/3 7 sunau801743 +Ref: 855801743 +Ref: sunau-Footnote-1801975 +Node: sys<6>802040 +Ref: whatsnew/3 7 id10802157 +Ref: 857802157 +Ref: sys<6>-Footnote-1802474 +Node: wave802539 +Ref: whatsnew/3 7 wave802642 +Ref: 858802642 +Ref: wave-Footnote-1802870 +Node: Deprecated functions and types of the C API802935 +Ref: whatsnew/3 7 deprecated-functions-and-types-of-the-c-api803131 +Ref: 859803131 +Ref: Deprecated functions and types of the C API-Footnote-1803789 +Ref: Deprecated functions and types of the C API-Footnote-2803854 +Node: Platform Support Removals803919 +Ref: whatsnew/3 7 id11804095 +Ref: 85b804095 +Ref: whatsnew/3 7 platform-support-removals804095 +Ref: 7de804095 +Ref: Platform Support Removals-Footnote-1805507 +Ref: Platform Support Removals-Footnote-2805574 +Node: API and Feature Removals<2>805654 +Ref: whatsnew/3 7 api-and-feature-removals805802 +Ref: 85c805802 +Ref: API and Feature Removals<2>-Footnote-1808759 +Ref: API and Feature Removals<2>-Footnote-2808824 +Ref: API and Feature Removals<2>-Footnote-3808889 +Node: Module Removals808954 +Ref: whatsnew/3 7 module-removals809097 +Ref: 861809097 +Ref: Module Removals-Footnote-1809432 +Node: Windows-only Changes809497 +Ref: whatsnew/3 7 windows-only-changes809634 +Ref: 862809634 +Ref: Windows-only Changes-Footnote-1810511 +Ref: Windows-only Changes-Footnote-2810576 +Node: Porting to Python 3 7810641 +Ref: whatsnew/3 7 porting-to-python-3-7810794 +Ref: 863810794 +Ref: whatsnew/3 7 porting-to-python-37810794 +Ref: 724810794 +Node: Changes in Python Behavior811256 +Ref: whatsnew/3 7 changes-in-python-behavior811377 +Ref: 864811377 +Ref: Changes in Python Behavior-Footnote-1813243 +Ref: Changes in Python Behavior-Footnote-2813308 +Ref: Changes in Python Behavior-Footnote-3813350 +Ref: Changes in Python Behavior-Footnote-4813415 +Ref: Changes in Python Behavior-Footnote-5813480 +Ref: Changes in Python Behavior-Footnote-6813545 +Node: Changes in the Python API<4>813610 +Ref: whatsnew/3 7 changes-in-the-python-api813763 +Ref: 867813763 +Ref: Changes in the Python API<4>-Footnote-1823314 +Ref: Changes in the Python API<4>-Footnote-2823379 +Ref: Changes in the Python API<4>-Footnote-3823444 +Ref: Changes in the Python API<4>-Footnote-4823509 +Ref: Changes in the Python API<4>-Footnote-5823574 +Ref: Changes in the Python API<4>-Footnote-6823639 +Ref: Changes in the Python API<4>-Footnote-7823704 +Ref: Changes in the Python API<4>-Footnote-8823769 +Ref: Changes in the Python API<4>-Footnote-9823834 +Ref: Changes in the Python API<4>-Footnote-10823899 +Ref: Changes in the Python API<4>-Footnote-11823965 +Ref: Changes in the Python API<4>-Footnote-12824031 +Ref: Changes in the Python API<4>-Footnote-13824097 +Ref: Changes in the Python API<4>-Footnote-14824163 +Ref: Changes in the Python API<4>-Footnote-15824206 +Ref: Changes in the Python API<4>-Footnote-16824272 +Ref: Changes in the Python API<4>-Footnote-17824338 +Ref: Changes in the Python API<4>-Footnote-18824404 +Ref: Changes in the Python API<4>-Footnote-19824470 +Ref: Changes in the Python API<4>-Footnote-20824536 +Ref: Changes in the Python API<4>-Footnote-21824602 +Ref: Changes in the Python API<4>-Footnote-22824668 +Ref: Changes in the Python API<4>-Footnote-23824734 +Ref: Changes in the Python API<4>-Footnote-24824800 +Ref: Changes in the Python API<4>-Footnote-25824866 +Ref: Changes in the Python API<4>-Footnote-26824932 +Ref: Changes in the Python API<4>-Footnote-27824998 +Ref: Changes in the Python API<4>-Footnote-28825064 +Ref: Changes in the Python API<4>-Footnote-29825130 +Ref: Changes in the Python API<4>-Footnote-30825196 +Node: Changes in the C API<4>825262 +Ref: whatsnew/3 7 changes-in-the-c-api825416 +Ref: 888825416 +Ref: Changes in the C API<4>-Footnote-1826052 +Node: CPython bytecode changes<5>826117 +Ref: whatsnew/3 7 cpython-bytecode-changes826266 +Ref: 889826266 +Ref: CPython bytecode changes<5>-Footnote-1826612 +Ref: CPython bytecode changes<5>-Footnote-2826677 +Node: Windows-only Changes<2>826742 +Ref: whatsnew/3 7 id12826904 +Ref: 88b826904 +Ref: Windows-only Changes<2>-Footnote-1827225 +Node: Other CPython implementation changes827290 +Ref: whatsnew/3 7 id13827416 +Ref: 88d827416 +Ref: Other CPython implementation changes-Footnote-1829764 +Ref: Other CPython implementation changes-Footnote-2829806 +Ref: Other CPython implementation changes-Footnote-3829871 +Node: Notable changes in Python 3 7 1829936 +Ref: whatsnew/3 7 notable-changes-in-python-3-7-1830100 +Ref: 890830100 +Ref: Notable changes in Python 3 7 1-Footnote-1831040 +Ref: Notable changes in Python 3 7 1-Footnote-2831105 +Ref: Notable changes in Python 3 7 1-Footnote-3831170 +Node: Notable changes in Python 3 7 2831235 +Ref: whatsnew/3 7 notable-changes-in-python-3-7-2831409 +Ref: 894831409 +Node: Notable changes in Python 3 7 6831904 +Ref: whatsnew/3 7 notable-changes-in-python-3-7-6832079 +Ref: 895832079 +Ref: Notable changes in Python 3 7 6-Footnote-1832590 +Node: Notable changes in Python 3 7 10832655 +Ref: whatsnew/3 7 notable-changes-in-python-3-7-10832790 +Ref: 896832790 +Ref: Notable changes in Python 3 7 10-Footnote-1833522 +Node: What’s New In Python 3 6833587 +Ref: whatsnew/3 6 doc833742 +Ref: 897833742 +Ref: whatsnew/3 6 what-s-new-in-python-3-6833742 +Ref: 898833742 +Ref: What’s New In Python 3 6-Footnote-1835016 +Ref: What’s New In Python 3 6-Footnote-2835076 +Node: Summary – Release highlights<5>835118 +Ref: whatsnew/3 6 summary-release-highlights835238 +Ref: 899835238 +Ref: Summary – Release highlights<5>-Footnote-1839479 +Ref: Summary – Release highlights<5>-Footnote-2839559 +Ref: Summary – Release highlights<5>-Footnote-3839649 +Node: New Features<9>839691 +Ref: whatsnew/3 6 new-features839845 +Ref: 8af839845 +Ref: whatsnew/3 6 pypy-dict-implementation839845 +Ref: 8b0839845 +Node: PEP 498 Formatted string literals841255 +Ref: whatsnew/3 6 pep-498-formatted-string-literals841388 +Ref: 8b1841388 +Ref: whatsnew/3 6 whatsnew36-pep498841388 +Ref: 89a841388 +Ref: PEP 498 Formatted string literals-Footnote-1842372 +Ref: PEP 498 Formatted string literals-Footnote-2842414 +Node: PEP 526 Syntax for variable annotations842456 +Ref: whatsnew/3 6 pep-526-syntax-for-variable-annotations842637 +Ref: 8b2842637 +Ref: whatsnew/3 6 whatsnew36-pep526842637 +Ref: 89c842637 +Ref: PEP 526 Syntax for variable annotations-Footnote-1843881 +Ref: PEP 526 Syntax for variable annotations-Footnote-2843923 +Ref: PEP 526 Syntax for variable annotations-Footnote-3843965 +Ref: PEP 526 Syntax for variable annotations-Footnote-4843999 +Node: PEP 515 Underscores in Numeric Literals844040 +Ref: whatsnew/3 6 pep-515-underscores-in-numeric-literals844219 +Ref: 8b3844219 +Ref: whatsnew/3 6 whatsnew36-pep515844219 +Ref: 89b844219 +Ref: PEP 515 Underscores in Numeric Literals-Footnote-1845288 +Ref: PEP 515 Underscores in Numeric Literals-Footnote-2845330 +Node: PEP 525 Asynchronous Generators845372 +Ref: whatsnew/3 6 pep-525-asynchronous-generators845547 +Ref: 8b4845547 +Ref: whatsnew/3 6 whatsnew36-pep525845547 +Ref: 89d845547 +Ref: PEP 525 Asynchronous Generators-Footnote-1846382 +Ref: PEP 525 Asynchronous Generators-Footnote-2846424 +Node: PEP 530 Asynchronous Comprehensions846466 +Ref: whatsnew/3 6 pep-530-asynchronous-comprehensions846649 +Ref: 8b5846649 +Ref: whatsnew/3 6 whatsnew36-pep530846649 +Ref: 89e846649 +Ref: PEP 530 Asynchronous Comprehensions-Footnote-1847207 +Ref: PEP 530 Asynchronous Comprehensions-Footnote-2847249 +Node: PEP 487 Simpler customization of class creation847291 +Ref: whatsnew/3 6 pep-487-simpler-customization-of-class-creation847483 +Ref: 8b6847483 +Ref: whatsnew/3 6 whatsnew36-pep487847483 +Ref: 8a1847483 +Ref: PEP 487 Simpler customization of class creation-Footnote-1848575 +Node: PEP 487 Descriptor Protocol Enhancements848617 +Ref: whatsnew/3 6 pep-487-descriptor-protocol-enhancements848816 +Ref: 8ba848816 +Ref: whatsnew/3 6 whatsnew36-pep487-descriptors848816 +Ref: 8bb848816 +Ref: PEP 487 Descriptor Protocol Enhancements-Footnote-1850067 +Ref: PEP 487 Descriptor Protocol Enhancements-Footnote-2850109 +Node: PEP 519 Adding a file system path protocol850151 +Ref: whatsnew/3 6 pep-519-adding-a-file-system-path-protocol850336 +Ref: 8be850336 +Ref: whatsnew/3 6 whatsnew36-pep519850336 +Ref: 8a6850336 +Ref: PEP 519 Adding a file system path protocol-Footnote-1853163 +Node: PEP 495 Local Time Disambiguation853205 +Ref: whatsnew/3 6 pep-495-local-time-disambiguation853401 +Ref: 8c5853401 +Ref: whatsnew/3 6 whatsnew36-pep495853401 +Ref: 8a7853401 +Ref: PEP 495 Local Time Disambiguation-Footnote-1854814 +Ref: PEP 495 Local Time Disambiguation-Footnote-2854856 +Node: PEP 529 Change Windows filesystem encoding to UTF-8854898 +Ref: whatsnew/3 6 pep-529-change-windows-filesystem-encoding-to-utf-8855100 +Ref: 8c7855100 +Ref: whatsnew/3 6 whatsnew36-pep529855100 +Ref: 8ac855100 +Ref: PEP 529 Change Windows filesystem encoding to UTF-8-Footnote-1856130 +Node: PEP 528 Change Windows console encoding to UTF-8856172 +Ref: whatsnew/3 6 pep-528-change-windows-console-encoding-to-utf-8856392 +Ref: 8cb856392 +Ref: whatsnew/3 6 whatsnew36-pep528856392 +Ref: 8ab856392 +Ref: PEP 528 Change Windows console encoding to UTF-8-Footnote-1857095 +Node: PEP 520 Preserving Class Attribute Definition Order857137 +Ref: whatsnew/3 6 pep-520-preserving-class-attribute-definition-order857347 +Ref: 8cd857347 +Ref: whatsnew/3 6 whatsnew36-pep520857347 +Ref: 8a2857347 +Ref: PEP 520 Preserving Class Attribute Definition Order-Footnote-1857987 +Node: PEP 468 Preserving Keyword Argument Order858029 +Ref: whatsnew/3 6 pep-468-preserving-keyword-argument-order858214 +Ref: 8d0858214 +Ref: whatsnew/3 6 whatsnew36-pep468858214 +Ref: 8a3858214 +Ref: PEP 468 Preserving Keyword Argument Order-Footnote-1858575 +Node: New dict implementation858617 +Ref: whatsnew/3 6 new-dict-implementation858799 +Ref: 8d1858799 +Ref: whatsnew/3 6 whatsnew36-compactdict858799 +Ref: 8a0858799 +Ref: New dict implementation-Footnote-1859777 +Ref: New dict implementation-Footnote-2859857 +Ref: New dict implementation-Footnote-3859947 +Ref: New dict implementation-Footnote-4860012 +Node: PEP 523 Adding a frame evaluation API to CPython860092 +Ref: whatsnew/3 6 pep-523-adding-a-frame-evaluation-api-to-cpython860266 +Ref: 8d2860266 +Ref: whatsnew/3 6 whatsnew36-pep523860266 +Ref: 8d3860266 +Ref: PEP 523 Adding a frame evaluation API to CPython-Footnote-1861437 +Ref: PEP 523 Adding a frame evaluation API to CPython-Footnote-2861479 +Node: PYTHONMALLOC environment variable861521 +Ref: whatsnew/3 6 pythonmalloc-environment-variable861708 +Ref: 8d4861708 +Ref: whatsnew/3 6 whatsnew36-pythonmalloc861708 +Ref: 8a5861708 +Ref: PYTHONMALLOC environment variable-Footnote-1864879 +Ref: PYTHONMALLOC environment variable-Footnote-2864944 +Node: DTrace and SystemTap probing support865009 +Ref: whatsnew/3 6 dtrace-and-systemtap-probing-support865139 +Ref: 8db865139 +Ref: whatsnew/3 6 whatsnew36-tracing865139 +Ref: 8a4865139 +Ref: DTrace and SystemTap probing support-Footnote-1865982 +Node: Other Language Changes<6>866047 +Ref: whatsnew/3 6 other-language-changes866182 +Ref: 8dd866182 +Ref: Other Language Changes<6>-Footnote-1867561 +Ref: Other Language Changes<6>-Footnote-2867626 +Ref: Other Language Changes<6>-Footnote-3867691 +Ref: Other Language Changes<6>-Footnote-4867756 +Node: New Modules<6>867821 +Ref: whatsnew/3 6 new-modules867960 +Ref: 8e0867960 +Node: secrets868019 +Ref: whatsnew/3 6 secrets868077 +Ref: 8e1868077 +Ref: whatsnew/3 6 whatsnew36-pep506868077 +Ref: 89f868077 +Ref: secrets-Footnote-1868760 +Node: Improved Modules<6>868802 +Ref: whatsnew/3 6 improved-modules868932 +Ref: 8e2868932 +Node: array<2>870406 +Ref: whatsnew/3 6 array870485 +Ref: 8e3870485 +Ref: array<2>-Footnote-1870778 +Node: ast<3>870843 +Ref: whatsnew/3 6 ast870941 +Ref: 8e4870941 +Ref: ast<3>-Footnote-1871190 +Node: asyncio<7>871255 +Ref: whatsnew/3 6 asyncio871356 +Ref: 8e5871356 +Ref: asyncio<7>-Footnote-1874696 +Ref: asyncio<7>-Footnote-2874761 +Ref: asyncio<7>-Footnote-3874806 +Ref: asyncio<7>-Footnote-4874871 +Ref: asyncio<7>-Footnote-5874936 +Ref: asyncio<7>-Footnote-6875001 +Ref: asyncio<7>-Footnote-7875066 +Ref: asyncio<7>-Footnote-8875131 +Ref: asyncio<7>-Footnote-9875196 +Ref: asyncio<7>-Footnote-10875261 +Ref: asyncio<7>-Footnote-11875327 +Ref: asyncio<7>-Footnote-12875393 +Node: binascii<2>875459 +Ref: whatsnew/3 6 binascii875559 +Ref: 8ef875559 +Ref: binascii<2>-Footnote-1875844 +Node: cmath875909 +Ref: whatsnew/3 6 cmath876013 +Ref: 8f1876013 +Ref: cmath-Footnote-1876484 +Ref: cmath-Footnote-2876549 +Ref: cmath-Footnote-3876591 +Node: collections<4>876656 +Ref: whatsnew/3 6 collections876770 +Ref: 8f8876770 +Ref: collections<4>-Footnote-1877866 +Ref: collections<4>-Footnote-2877931 +Ref: collections<4>-Footnote-3877996 +Ref: collections<4>-Footnote-4878061 +Ref: collections<4>-Footnote-5878126 +Ref: collections<4>-Footnote-6878191 +Node: concurrent futures<3>878256 +Ref: whatsnew/3 6 concurrent-futures878378 +Ref: 8fc878378 +Ref: concurrent futures<3>-Footnote-1878708 +Node: contextlib<4>878773 +Ref: whatsnew/3 6 contextlib878892 +Ref: 8fd878892 +Ref: contextlib<4>-Footnote-1879388 +Node: datetime<5>879453 +Ref: whatsnew/3 6 datetime879561 +Ref: 900879561 +Ref: datetime<5>-Footnote-1880578 +Ref: datetime<5>-Footnote-2880643 +Ref: datetime<5>-Footnote-3880708 +Ref: datetime<5>-Footnote-4880773 +Node: decimal<2>880838 +Ref: whatsnew/3 6 decimal880945 +Ref: 904880945 +Ref: decimal<2>-Footnote-1881358 +Node: distutils<4>881423 +Ref: whatsnew/3 6 distutils881524 +Ref: 906881524 +Ref: distutils<4>-Footnote-1881898 +Node: email881963 +Ref: whatsnew/3 6 email882066 +Ref: 907882066 +Ref: email-Footnote-1882982 +Ref: email-Footnote-2883047 +Ref: email-Footnote-3883112 +Node: encodings<2>883177 +Ref: whatsnew/3 6 encodings883275 +Ref: 90d883275 +Ref: encodings<2>-Footnote-1883570 +Node: enum<5>883635 +Ref: whatsnew/3 6 enum883743 +Ref: 90e883743 +Ref: enum<5>-Footnote-1884491 +Node: faulthandler<2>884556 +Ref: whatsnew/3 6 faulthandler884664 +Ref: 910884664 +Ref: faulthandler<2>-Footnote-1884927 +Node: fileinput<2>884992 +Ref: whatsnew/3 6 fileinput885103 +Ref: 912885103 +Ref: fileinput<2>-Footnote-1885291 +Node: hashlib<4>885356 +Ref: whatsnew/3 6 hashlib885466 +Ref: 914885466 +Ref: hashlib<4>-Footnote-1886484 +Ref: hashlib<4>-Footnote-2886549 +Ref: hashlib<4>-Footnote-3886614 +Ref: hashlib<4>-Footnote-4886679 +Node: http client<2>886744 +Ref: whatsnew/3 6 http-client886861 +Ref: 915886861 +Ref: http client<2>-Footnote-1887121 +Node: idlelib and IDLE<2>887186 +Ref: whatsnew/3 6 idlelib-and-idle887305 +Ref: 918887305 +Ref: idlelib and IDLE<2>-Footnote-1890779 +Ref: idlelib and IDLE<2>-Footnote-2890844 +Ref: idlelib and IDLE<2>-Footnote-3890909 +Ref: idlelib and IDLE<2>-Footnote-4890976 +Ref: idlelib and IDLE<2>-Footnote-5891041 +Ref: idlelib and IDLE<2>-Footnote-6891106 +Ref: idlelib and IDLE<2>-Footnote-7891171 +Ref: idlelib and IDLE<2>-Footnote-8891236 +Ref: idlelib and IDLE<2>-Footnote-9891301 +Ref: idlelib and IDLE<2>-Footnote-10891366 +Ref: idlelib and IDLE<2>-Footnote-11891432 +Node: importlib<4>891500 +Ref: whatsnew/3 6 importlib891615 +Ref: 919891615 +Ref: importlib<4>-Footnote-1892442 +Node: inspect<5>892507 +Ref: whatsnew/3 6 inspect892607 +Ref: 921892607 +Ref: inspect<5>-Footnote-1893382 +Ref: inspect<5>-Footnote-2893447 +Node: json893512 +Ref: whatsnew/3 6 json893610 +Ref: 922893610 +Ref: json-Footnote-1893882 +Node: logging<4>893947 +Ref: whatsnew/3 6 logging894042 +Ref: 924894042 +Ref: logging<4>-Footnote-1894306 +Node: math<5>894371 +Ref: whatsnew/3 6 math894480 +Ref: 926894480 +Ref: math<5>-Footnote-1894712 +Ref: math<5>-Footnote-2894777 +Node: multiprocessing<4>894819 +Ref: whatsnew/3 6 multiprocessing894923 +Ref: 927894923 +Ref: multiprocessing<4>-Footnote-1895152 +Node: os<6>895216 +Ref: whatsnew/3 6 os895323 +Ref: 92a895323 +Ref: os<6>-Footnote-1896323 +Ref: os<6>-Footnote-2896388 +Ref: os<6>-Footnote-3896430 +Node: pathlib<6>896472 +Ref: whatsnew/3 6 pathlib896567 +Ref: 92d896567 +Ref: pathlib<6>-Footnote-1896801 +Node: pdb<3>896866 +Ref: whatsnew/3 6 pdb896965 +Ref: 92e896965 +Node: pickle<2>897122 +Ref: whatsnew/3 6 pickle897222 +Ref: 92f897222 +Ref: pickle<2>-Footnote-1897539 +Node: pickletools897604 +Ref: whatsnew/3 6 pickletools897706 +Ref: 931897706 +Ref: pickletools-Footnote-1897934 +Node: pydoc<3>897999 +Ref: whatsnew/3 6 pydoc898101 +Ref: 933898101 +Ref: pydoc<3>-Footnote-1898495 +Ref: pydoc<3>-Footnote-2898559 +Node: random<2>898624 +Ref: whatsnew/3 6 random898720 +Ref: 934898720 +Ref: random<2>-Footnote-1898975 +Node: re<3>899040 +Ref: whatsnew/3 6 re899136 +Ref: 936899136 +Ref: re<3>-Footnote-1899841 +Ref: re<3>-Footnote-2899907 +Ref: re<3>-Footnote-3899972 +Node: readline900037 +Ref: whatsnew/3 6 readline900135 +Ref: 937900135 +Ref: readline-Footnote-1900366 +Node: rlcompleter900431 +Ref: whatsnew/3 6 rlcompleter900532 +Ref: 939900532 +Ref: rlcompleter-Footnote-1900836 +Ref: rlcompleter-Footnote-2900901 +Node: shlex<2>900966 +Ref: whatsnew/3 6 shlex901066 +Ref: 93a901066 +Ref: shlex<2>-Footnote-1901356 +Node: site<2>901423 +Ref: whatsnew/3 6 site901522 +Ref: 93d901522 +Ref: site<2>-Footnote-1901786 +Node: sqlite3<4>901851 +Ref: whatsnew/3 6 sqlite3901951 +Ref: 93e901951 +Ref: sqlite3<4>-Footnote-1902154 +Node: socket<7>902219 +Ref: whatsnew/3 6 socket902327 +Ref: 940902327 +Ref: socket<7>-Footnote-1903284 +Ref: socket<7>-Footnote-2903349 +Ref: socket<7>-Footnote-3903414 +Ref: socket<7>-Footnote-4903479 +Ref: socket<7>-Footnote-5903544 +Node: socketserver<2>903609 +Ref: whatsnew/3 6 socketserver903713 +Ref: 947903713 +Ref: socketserver<2>-Footnote-1904342 +Ref: socketserver<2>-Footnote-2904407 +Node: ssl<5>904472 +Ref: whatsnew/3 6 ssl904580 +Ref: 94b904580 +Ref: ssl<5>-Footnote-1905776 +Ref: ssl<5>-Footnote-2905841 +Ref: ssl<5>-Footnote-3905906 +Ref: ssl<5>-Footnote-4905971 +Ref: ssl<5>-Footnote-5906036 +Ref: ssl<5>-Footnote-6906101 +Ref: ssl<5>-Footnote-7906166 +Node: statistics<3>906231 +Ref: whatsnew/3 6 statistics906330 +Ref: 94e906330 +Ref: statistics<3>-Footnote-1906520 +Node: struct906585 +Ref: whatsnew/3 6 struct906691 +Ref: 950906691 +Ref: struct-Footnote-1906922 +Node: subprocess<2>906987 +Ref: whatsnew/3 6 subprocess907086 +Ref: 951907086 +Ref: subprocess<2>-Footnote-1907779 +Ref: subprocess<2>-Footnote-2907844 +Node: sys<7>907908 +Ref: whatsnew/3 6 sys908010 +Ref: 953908010 +Ref: sys<7>-Footnote-1908611 +Ref: sys<7>-Footnote-2908676 +Node: telnetlib908741 +Ref: whatsnew/3 6 telnetlib908837 +Ref: 956908837 +Ref: telnetlib-Footnote-1909008 +Node: time<5>909073 +Ref: whatsnew/3 6 time909169 +Ref: 958909169 +Node: timeit909308 +Ref: whatsnew/3 6 timeit909405 +Ref: 95a909405 +Ref: timeit-Footnote-1909865 +Ref: timeit-Footnote-2909929 +Node: tkinter<4>909994 +Ref: whatsnew/3 6 tkinter910096 +Ref: 95d910096 +Ref: tkinter<4>-Footnote-1910522 +Node: traceback<3>910587 +Ref: whatsnew/3 6 traceback910697 +Ref: 95e910697 +Ref: whatsnew/3 6 whatsnew36-traceback910697 +Ref: 8df910697 +Ref: traceback<3>-Footnote-1911332 +Node: tracemalloc<3>911397 +Ref: whatsnew/3 6 tracemalloc911506 +Ref: 95f911506 +Ref: tracemalloc<3>-Footnote-1911867 +Node: typing<6>911932 +Ref: whatsnew/3 6 typing912043 +Ref: 961912043 +Ref: whatsnew/3 6 whatsnew36-typing912043 +Ref: 8a8912043 +Ref: typing<6>-Footnote-1913695 +Ref: typing<6>-Footnote-2913745 +Ref: typing<6>-Footnote-3913810 +Ref: typing<6>-Footnote-4913875 +Ref: typing<6>-Footnote-5913917 +Ref: typing<6>-Footnote-6913967 +Ref: typing<6>-Footnote-7914019 +Node: unicodedata<5>914071 +Ref: whatsnew/3 6 unicodedata914184 +Ref: 965914184 +Ref: unicodedata<5>-Footnote-1914372 +Node: unittest mock<2>914423 +Ref: whatsnew/3 6 unittest-mock914541 +Ref: 966914541 +Ref: unittest mock<2>-Footnote-1915058 +Ref: unittest mock<2>-Footnote-2915123 +Node: urllib request915188 +Ref: whatsnew/3 6 urllib-request915310 +Ref: 96a915310 +Ref: urllib request-Footnote-1915675 +Node: urllib robotparser915740 +Ref: whatsnew/3 6 urllib-robotparser915853 +Ref: 96b915853 +Ref: urllib robotparser-Footnote-1916098 +Node: venv<4>916163 +Ref: whatsnew/3 6 venv916273 +Ref: 96d916273 +Ref: venv<4>-Footnote-1916560 +Node: warnings<3>916625 +Ref: whatsnew/3 6 warnings916723 +Ref: 96e916723 +Ref: warnings<3>-Footnote-1917998 +Ref: warnings<3>-Footnote-2918063 +Node: winreg918128 +Ref: whatsnew/3 6 winreg918227 +Ref: 970918227 +Ref: winreg-Footnote-1918400 +Node: winsound918465 +Ref: whatsnew/3 6 winsound918566 +Ref: 972918566 +Ref: winsound-Footnote-1918765 +Node: xmlrpc client918830 +Ref: whatsnew/3 6 xmlrpc-client918935 +Ref: 976918935 +Ref: xmlrpc client-Footnote-1919228 +Node: zipfile<3>919293 +Ref: whatsnew/3 6 zipfile919394 +Ref: 977919394 +Ref: zipfile<3>-Footnote-1919928 +Ref: zipfile<3>-Footnote-2919993 +Node: zlib920058 +Ref: whatsnew/3 6 zlib920137 +Ref: 97c920137 +Ref: zlib-Footnote-1920393 +Ref: zlib-Footnote-2920458 +Node: Optimizations<6>920523 +Ref: whatsnew/3 6 optimizations920665 +Ref: 97f920665 +Ref: Optimizations<6>-Footnote-1924528 +Ref: Optimizations<6>-Footnote-2924593 +Ref: Optimizations<6>-Footnote-3924658 +Ref: Optimizations<6>-Footnote-4924723 +Ref: Optimizations<6>-Footnote-5924788 +Ref: Optimizations<6>-Footnote-6924853 +Ref: Optimizations<6>-Footnote-7924918 +Ref: Optimizations<6>-Footnote-8924983 +Ref: Optimizations<6>-Footnote-9925048 +Ref: Optimizations<6>-Footnote-10925113 +Ref: Optimizations<6>-Footnote-11925179 +Ref: Optimizations<6>-Footnote-12925245 +Ref: Optimizations<6>-Footnote-13925311 +Ref: Optimizations<6>-Footnote-14925377 +Ref: Optimizations<6>-Footnote-15925443 +Ref: Optimizations<6>-Footnote-16925509 +Ref: Optimizations<6>-Footnote-17925575 +Ref: Optimizations<6>-Footnote-18925641 +Ref: Optimizations<6>-Footnote-19925707 +Ref: Optimizations<6>-Footnote-20925773 +Ref: Optimizations<6>-Footnote-21925839 +Node: Build and C API Changes<2>925905 +Ref: whatsnew/3 6 build-and-c-api-changes926046 +Ref: 985926046 +Ref: Build and C API Changes<2>-Footnote-1928487 +Ref: Build and C API Changes<2>-Footnote-2928529 +Ref: Build and C API Changes<2>-Footnote-3928594 +Ref: Build and C API Changes<2>-Footnote-4928659 +Ref: Build and C API Changes<2>-Footnote-5928724 +Ref: Build and C API Changes<2>-Footnote-6928788 +Ref: Build and C API Changes<2>-Footnote-7928853 +Ref: Build and C API Changes<2>-Footnote-8928918 +Ref: Build and C API Changes<2>-Footnote-9928983 +Ref: Build and C API Changes<2>-Footnote-10929048 +Node: Other Improvements929114 +Ref: whatsnew/3 6 other-improvements929252 +Ref: 98d929252 +Node: Deprecated<7>929623 +Ref: whatsnew/3 6 deprecated929745 +Ref: 991929745 +Node: New Keywords930066 +Ref: whatsnew/3 6 new-keywords930163 +Ref: 992930163 +Ref: New Keywords-Footnote-1930556 +Node: Deprecated Python behavior930598 +Ref: whatsnew/3 6 deprecated-python-behavior930754 +Ref: 993930754 +Ref: Deprecated Python behavior-Footnote-1931955 +Ref: Deprecated Python behavior-Footnote-2932020 +Ref: Deprecated Python behavior-Footnote-3932085 +Node: Deprecated Python modules functions and methods<2>932150 +Ref: whatsnew/3 6 deprecated-python-modules-functions-and-methods932340 +Ref: 995932340 +Node: asynchat932649 +Ref: whatsnew/3 6 asynchat932761 +Ref: 996932761 +Ref: asynchat-Footnote-1932949 +Node: asyncore933014 +Ref: whatsnew/3 6 asyncore933141 +Ref: 997933141 +Ref: asyncore-Footnote-1933329 +Node: dbm<3>933394 +Ref: whatsnew/3 6 dbm933525 +Ref: 998933525 +Ref: dbm<3>-Footnote-1933885 +Node: distutils<5>933950 +Ref: whatsnew/3 6 id2934076 +Ref: 999934076 +Ref: distutils<5>-Footnote-1934396 +Node: grp934461 +Ref: whatsnew/3 6 grp934593 +Ref: 99a934593 +Ref: grp-Footnote-1934791 +Node: importlib<5>934856 +Ref: whatsnew/3 6 id3934981 +Ref: 99c934981 +Node: os<7>935635 +Ref: whatsnew/3 6 id4935762 +Ref: 9a1935762 +Ref: os<7>-Footnote-1936056 +Ref: os<7>-Footnote-2936121 +Node: re<4>936186 +Ref: whatsnew/3 6 id5936307 +Ref: 9a3936307 +Ref: re<4>-Footnote-1936633 +Node: ssl<6>936698 +Ref: whatsnew/3 6 id6936824 +Ref: 9a4936824 +Ref: ssl<6>-Footnote-1937619 +Ref: ssl<6>-Footnote-2937684 +Ref: ssl<6>-Footnote-3937749 +Node: tkinter<5>937814 +Ref: whatsnew/3 6 id7937942 +Ref: 9a5937942 +Node: venv<5>938103 +Ref: whatsnew/3 6 id8938216 +Ref: 9a6938216 +Ref: venv<5>-Footnote-1938567 +Node: Deprecated functions and types of the C API<2>938632 +Ref: whatsnew/3 6 deprecated-functions-and-types-of-the-c-api938820 +Ref: 9a7938820 +Node: Deprecated Build Options939169 +Ref: whatsnew/3 6 deprecated-build-options939298 +Ref: 9a9939298 +Node: Removed<7>939739 +Ref: whatsnew/3 6 removed939864 +Ref: 9aa939864 +Node: API and Feature Removals<3>939962 +Ref: whatsnew/3 6 api-and-feature-removals940036 +Ref: 9ab940036 +Ref: API and Feature Removals<3>-Footnote-1942128 +Ref: API and Feature Removals<3>-Footnote-2942193 +Node: Porting to Python 3 6942271 +Ref: whatsnew/3 6 porting-to-python-3-6942414 +Ref: 9af942414 +Node: Changes in ‘python’ Command Behavior942800 +Ref: whatsnew/3 6 changes-in-python-command-behavior942935 +Ref: 9b0942935 +Ref: Changes in ‘python’ Command Behavior-Footnote-1943415 +Node: Changes in the Python API<5>943480 +Ref: whatsnew/3 6 changes-in-the-python-api943647 +Ref: 9b1943647 +Ref: Changes in the Python API<5>-Footnote-1953769 +Ref: Changes in the Python API<5>-Footnote-2953833 +Ref: Changes in the Python API<5>-Footnote-3953875 +Ref: Changes in the Python API<5>-Footnote-4953940 +Ref: Changes in the Python API<5>-Footnote-5954005 +Ref: Changes in the Python API<5>-Footnote-6954070 +Ref: Changes in the Python API<5>-Footnote-7954135 +Ref: Changes in the Python API<5>-Footnote-8954200 +Ref: Changes in the Python API<5>-Footnote-9954265 +Ref: Changes in the Python API<5>-Footnote-10954330 +Ref: Changes in the Python API<5>-Footnote-11954396 +Ref: Changes in the Python API<5>-Footnote-12954439 +Ref: Changes in the Python API<5>-Footnote-13954505 +Ref: Changes in the Python API<5>-Footnote-14954571 +Ref: Changes in the Python API<5>-Footnote-15954637 +Ref: Changes in the Python API<5>-Footnote-16954703 +Ref: Changes in the Python API<5>-Footnote-17954768 +Ref: Changes in the Python API<5>-Footnote-18954834 +Ref: Changes in the Python API<5>-Footnote-19954900 +Ref: Changes in the Python API<5>-Footnote-20954966 +Node: Changes in the C API<5>955032 +Ref: whatsnew/3 6 changes-in-the-c-api955186 +Ref: 9c9955186 +Ref: Changes in the C API<5>-Footnote-1955840 +Ref: Changes in the C API<5>-Footnote-2955905 +Node: CPython bytecode changes<6>955969 +Ref: whatsnew/3 6 cpython-bytecode-changes956086 +Ref: 9cb956086 +Ref: CPython bytecode changes<6>-Footnote-1957719 +Ref: CPython bytecode changes<6>-Footnote-2957784 +Ref: CPython bytecode changes<6>-Footnote-3957849 +Ref: CPython bytecode changes<6>-Footnote-4957914 +Ref: CPython bytecode changes<6>-Footnote-5957979 +Ref: CPython bytecode changes<6>-Footnote-6958044 +Ref: CPython bytecode changes<6>-Footnote-7958109 +Ref: CPython bytecode changes<6>-Footnote-8958174 +Ref: CPython bytecode changes<6>-Footnote-9958239 +Node: Notable changes in Python 3 6 2958304 +Ref: whatsnew/3 6 notable-changes-in-python-3-6-2958468 +Ref: 9d3958468 +Node: New make regen-all build target958632 +Ref: whatsnew/3 6 new-make-regen-all-build-target958774 +Ref: 9d4958774 +Ref: New make regen-all build target-Footnote-1959561 +Ref: New make regen-all build target-Footnote-2959629 +Node: Removal of make touch build target959694 +Ref: whatsnew/3 6 removal-of-make-touch-build-target959836 +Ref: 9d5959836 +Ref: Removal of make touch build target-Footnote-1960266 +Node: Notable changes in Python 3 6 4960331 +Ref: whatsnew/3 6 notable-changes-in-python-3-6-4960505 +Ref: 9d6960505 +Ref: Notable changes in Python 3 6 4-Footnote-1960878 +Ref: Notable changes in Python 3 6 4-Footnote-2960943 +Node: Notable changes in Python 3 6 5961008 +Ref: whatsnew/3 6 notable-changes-in-python-3-6-5961182 +Ref: 9d7961182 +Ref: Notable changes in Python 3 6 5-Footnote-1961485 +Node: Notable changes in Python 3 6 7961550 +Ref: whatsnew/3 6 notable-changes-in-python-3-6-7961725 +Ref: 9d8961725 +Ref: Notable changes in Python 3 6 7-Footnote-1962102 +Node: Notable changes in Python 3 6 10962167 +Ref: whatsnew/3 6 notable-changes-in-python-3-6-10962343 +Ref: 9d9962343 +Ref: Notable changes in Python 3 6 10-Footnote-1962856 +Node: Notable changes in Python 3 6 13962921 +Ref: whatsnew/3 6 notable-changes-in-python-3-6-13963057 +Ref: 9da963057 +Ref: Notable changes in Python 3 6 13-Footnote-1963789 +Node: What’s New In Python 3 5963854 +Ref: whatsnew/3 5 doc964009 +Ref: 9db964009 +Ref: whatsnew/3 5 what-s-new-in-python-3-5964009 +Ref: 9dc964009 +Ref: What’s New In Python 3 5-Footnote-1964949 +Ref: What’s New In Python 3 5-Footnote-2965009 +Node: Summary – Release highlights<6>965051 +Ref: whatsnew/3 5 summary-release-highlights965172 +Ref: 9dd965172 +Ref: Summary – Release highlights<6>-Footnote-1968901 +Ref: Summary – Release highlights<6>-Footnote-2968965 +Ref: Summary – Release highlights<6>-Footnote-3969030 +Ref: Summary – Release highlights<6>-Footnote-4969095 +Ref: Summary – Release highlights<6>-Footnote-5969160 +Ref: Summary – Release highlights<6>-Footnote-6969225 +Ref: Summary – Release highlights<6>-Footnote-7969290 +Node: New Features<10>969355 +Ref: whatsnew/3 5 new-features969510 +Ref: 9f0969510 +Node: PEP 492 - Coroutines with async and await syntax970606 +Ref: whatsnew/3 5 pep-492-coroutines-with-async-and-await-syntax970778 +Ref: 9f1970778 +Ref: whatsnew/3 5 whatsnew-pep-492970778 +Ref: 9de970778 +Ref: PEP 492 - Coroutines with async and await syntax-Footnote-1973851 +Ref: PEP 492 - Coroutines with async and await syntax-Footnote-2973893 +Node: PEP 465 - A dedicated infix operator for matrix multiplication973935 +Ref: whatsnew/3 5 pep-465-a-dedicated-infix-operator-for-matrix-multiplication974162 +Ref: 9f7974162 +Ref: whatsnew/3 5 whatsnew-pep-465974162 +Ref: 9df974162 +Ref: PEP 465 - A dedicated infix operator for matrix multiplication-Footnote-1975549 +Ref: PEP 465 - A dedicated infix operator for matrix multiplication-Footnote-2975591 +Node: PEP 448 - Additional Unpacking Generalizations975633 +Ref: whatsnew/3 5 pep-448-additional-unpacking-generalizations975872 +Ref: 9f8975872 +Ref: whatsnew/3 5 whatsnew-pep-448975872 +Ref: 9e0975872 +Ref: PEP 448 - Additional Unpacking Generalizations-Footnote-1976965 +Ref: PEP 448 - Additional Unpacking Generalizations-Footnote-2977007 +Node: PEP 461 - percent formatting support for bytes and bytearray977049 +Ref: whatsnew/3 5 pep-461-percent-formatting-support-for-bytes-and-bytearray977246 +Ref: 9fc977246 +Ref: whatsnew/3 5 whatsnew-pep-461977246 +Ref: 9e3977246 +Ref: PEP 461 - percent formatting support for bytes and bytearray-Footnote-1978782 +Ref: PEP 461 - percent formatting support for bytes and bytearray-Footnote-2978824 +Node: PEP 484 - Type Hints978866 +Ref: whatsnew/3 5 pep-484-type-hints979089 +Ref: 9fe979089 +Ref: whatsnew/3 5 whatsnew-pep-484979089 +Ref: 9e1979089 +Ref: PEP 484 - Type Hints-Footnote-1980736 +Ref: PEP 484 - Type Hints-Footnote-2980778 +Ref: PEP 484 - Type Hints-Footnote-3980820 +Ref: PEP 484 - Type Hints-Footnote-4980849 +Ref: PEP 484 - Type Hints-Footnote-5980891 +Node: PEP 471 - os scandir function – a better and faster directory iterator980933 +Ref: whatsnew/3 5 pep-471-os-scandir-function-a-better-and-faster-directory-iterator981141 +Ref: 9ff981141 +Ref: whatsnew/3 5 whatsnew-pep-471981141 +Ref: 9ec981141 +Ref: PEP 471 - os scandir function – a better and faster directory iterator-Footnote-1982497 +Ref: PEP 471 - os scandir function – a better and faster directory iterator-Footnote-2982539 +Node: PEP 475 Retry system calls failing with EINTR982581 +Ref: whatsnew/3 5 pep-475-retry-system-calls-failing-with-eintr982824 +Ref: a02982824 +Ref: whatsnew/3 5 whatsnew-pep-475982824 +Ref: a03982824 +Ref: PEP 475 Retry system calls failing with EINTR-Footnote-1985888 +Ref: PEP 475 Retry system calls failing with EINTR-Footnote-2985930 +Node: PEP 479 Change StopIteration handling inside generators985972 +Ref: whatsnew/3 5 pep-479-change-stopiteration-handling-inside-generators986194 +Ref: a2b986194 +Ref: whatsnew/3 5 whatsnew-pep-479986194 +Ref: 994986194 +Ref: PEP 479 Change StopIteration handling inside generators-Footnote-1988124 +Ref: PEP 479 Change StopIteration handling inside generators-Footnote-2988166 +Node: PEP 485 A function for testing approximate equality988208 +Ref: whatsnew/3 5 pep-485-a-function-for-testing-approximate-equality988447 +Ref: a2d988447 +Ref: whatsnew/3 5 whatsnew-pep-485988447 +Ref: a2e988447 +Ref: PEP 485 A function for testing approximate equality-Footnote-1989630 +Ref: PEP 485 A function for testing approximate equality-Footnote-2989672 +Node: PEP 486 Make the Python Launcher aware of virtual environments989714 +Ref: whatsnew/3 5 pep-486-make-the-python-launcher-aware-of-virtual-environments989930 +Ref: a31989930 +Ref: whatsnew/3 5 whatsnew-pep-486989930 +Ref: a32989930 +Ref: PEP 486 Make the Python Launcher aware of virtual environments-Footnote-1990504 +Ref: PEP 486 Make the Python Launcher aware of virtual environments-Footnote-2990546 +Ref: PEP 486 Make the Python Launcher aware of virtual environments-Footnote-3990588 +Node: PEP 488 Elimination of PYO files990630 +Ref: whatsnew/3 5 pep-488-elimination-of-pyo-files990846 +Ref: a33990846 +Ref: whatsnew/3 5 whatsnew-pep-488990846 +Ref: 9e8990846 +Ref: PEP 488 Elimination of PYO files-Footnote-1991712 +Ref: PEP 488 Elimination of PYO files-Footnote-2991754 +Node: PEP 489 Multi-phase extension module initialization991796 +Ref: whatsnew/3 5 pep-489-multi-phase-extension-module-initialization991941 +Ref: a36991941 +Ref: whatsnew/3 5 whatsnew-pep-489991941 +Ref: 9e9991941 +Ref: PEP 489 Multi-phase extension module initialization-Footnote-1992704 +Ref: PEP 489 Multi-phase extension module initialization-Footnote-2992746 +Ref: PEP 489 Multi-phase extension module initialization-Footnote-3992788 +Node: Other Language Changes<7>992830 +Ref: whatsnew/3 5 other-language-changes992966 +Ref: a37992966 +Ref: Other Language Changes<7>-Footnote-1993964 +Ref: Other Language Changes<7>-Footnote-2994029 +Ref: Other Language Changes<7>-Footnote-3994094 +Ref: Other Language Changes<7>-Footnote-4994159 +Ref: Other Language Changes<7>-Footnote-5994224 +Ref: Other Language Changes<7>-Footnote-6994289 +Ref: Other Language Changes<7>-Footnote-7994354 +Node: New Modules<7>994419 +Ref: whatsnew/3 5 new-modules994558 +Ref: a39994558 +Node: typing<7>994647 +Ref: whatsnew/3 5 typing994725 +Ref: a3a994725 +Node: zipapp<2>994936 +Ref: whatsnew/3 5 whatsnew-zipapp995014 +Ref: 9e2995014 +Ref: whatsnew/3 5 zipapp995014 +Ref: a3b995014 +Ref: zipapp<2>-Footnote-1995724 +Ref: zipapp<2>-Footnote-2995766 +Ref: zipapp<2>-Footnote-3995833 +Ref: zipapp<2>-Footnote-4995898 +Node: Improved Modules<7>995940 +Ref: whatsnew/3 5 improved-modules996080 +Ref: a3c996080 +Node: argparse<3>997744 +Ref: whatsnew/3 5 argparse997830 +Ref: a3d997830 +Ref: argparse<3>-Footnote-1998153 +Node: asyncio<8>998218 +Ref: whatsnew/3 5 asyncio998316 +Ref: a41998316 +Ref: asyncio<8>-Footnote-11001794 +Ref: asyncio<8>-Footnote-21001859 +Ref: asyncio<8>-Footnote-31001924 +Node: bz21001969 +Ref: whatsnew/3 5 bz21002059 +Ref: a4b1002059 +Ref: bz2-Footnote-11002314 +Node: cgi1002379 +Ref: whatsnew/3 5 cgi1002467 +Ref: a4d1002467 +Ref: cgi-Footnote-11002662 +Node: cmath<2>1002727 +Ref: whatsnew/3 5 cmath1002816 +Ref: a4e1002816 +Ref: cmath<2>-Footnote-11003030 +Node: code1003095 +Ref: whatsnew/3 5 code1003195 +Ref: a4f1003195 +Ref: code-Footnote-11003446 +Node: collections<5>1003511 +Ref: whatsnew/3 5 collections1003621 +Ref: a511003621 +Ref: whatsnew/3 5 whatsnew-ordereddict1003662 +Ref: 9ea1003662 +Ref: collections<5>-Footnote-11004931 +Ref: collections<5>-Footnote-21004996 +Ref: collections<5>-Footnote-31005061 +Ref: collections<5>-Footnote-41005126 +Ref: collections<5>-Footnote-51005191 +Node: collections abc<3>1005256 +Ref: whatsnew/3 5 collections-abc1005375 +Ref: a5b1005375 +Ref: collections abc<3>-Footnote-11006045 +Ref: collections abc<3>-Footnote-21006110 +Ref: collections abc<3>-Footnote-31006175 +Ref: collections abc<3>-Footnote-41006240 +Node: compileall<3>1006287 +Ref: whatsnew/3 5 compileall1006413 +Ref: a611006413 +Ref: compileall<3>-Footnote-11007288 +Ref: compileall<3>-Footnote-21007353 +Ref: compileall<3>-Footnote-31007418 +Node: concurrent futures<4>1007483 +Ref: whatsnew/3 5 concurrent-futures1007603 +Ref: a641007603 +Ref: concurrent futures<4>-Footnote-11008105 +Ref: concurrent futures<4>-Footnote-21008170 +Node: configparser1008235 +Ref: whatsnew/3 5 configparser1008355 +Ref: a661008355 +Ref: configparser-Footnote-11009306 +Node: contextlib<5>1009371 +Ref: whatsnew/3 5 contextlib1009476 +Ref: a671009476 +Ref: contextlib<5>-Footnote-11010086 +Node: csv<2>1010151 +Ref: whatsnew/3 5 csv1010253 +Ref: a6a1010253 +Ref: csv<2>-Footnote-11010457 +Node: curses<4>1010522 +Ref: whatsnew/3 5 curses1010617 +Ref: a6c1010617 +Ref: curses<4>-Footnote-11010898 +Node: dbm<4>1010962 +Ref: whatsnew/3 5 dbm1011058 +Ref: a6e1011058 +Ref: dbm<4>-Footnote-11011261 +Node: difflib1011326 +Ref: whatsnew/3 5 difflib1011425 +Ref: a6f1011425 +Ref: difflib-Footnote-11011961 +Ref: difflib-Footnote-21012025 +Node: distutils<6>1012090 +Ref: whatsnew/3 5 distutils1012193 +Ref: a721012193 +Ref: distutils<6>-Footnote-11012648 +Ref: distutils<6>-Footnote-21012712 +Node: doctest<2>1012777 +Ref: whatsnew/3 5 doctest1012881 +Ref: a731012881 +Ref: doctest<2>-Footnote-11013166 +Node: email<2>1013231 +Ref: whatsnew/3 5 email1013330 +Ref: a761013330 +Ref: email<2>-Footnote-11014441 +Ref: email<2>-Footnote-21014506 +Ref: email<2>-Footnote-31014571 +Ref: email<2>-Footnote-41014630 +Ref: email<2>-Footnote-51014689 +Ref: email<2>-Footnote-61014754 +Node: enum<6>1014819 +Ref: whatsnew/3 5 enum1014923 +Ref: a7c1014923 +Ref: enum<6>-Footnote-11015314 +Node: faulthandler<3>1015379 +Ref: whatsnew/3 5 faulthandler1015487 +Ref: a7d1015487 +Ref: faulthandler<3>-Footnote-11015799 +Node: functools<4>1015864 +Ref: whatsnew/3 5 functools1015972 +Ref: a811015972 +Ref: whatsnew/3 5 whatsnew-lrucache1016011 +Ref: 9ed1016011 +Ref: functools<4>-Footnote-11016237 +Node: glob<2>1016302 +Ref: whatsnew/3 5 glob1016402 +Ref: a821016402 +Ref: glob<2>-Footnote-11016654 +Node: gzip<2>1016719 +Ref: whatsnew/3 5 gzip1016812 +Ref: a831016812 +Ref: gzip<2>-Footnote-11017037 +Node: heapq1017102 +Ref: whatsnew/3 5 heapq1017195 +Ref: a841017195 +Ref: heapq-Footnote-11017835 +Node: http<2>1017900 +Ref: whatsnew/3 5 http1018000 +Ref: a871018000 +Ref: http<2>-Footnote-11018246 +Node: http client<3>1018311 +Ref: whatsnew/3 5 http-client1018425 +Ref: a881018425 +Ref: http client<3>-Footnote-11019169 +Node: idlelib and IDLE<3>1019233 +Ref: whatsnew/3 5 idlelib-and-idle1019350 +Ref: a8c1019350 +Node: imaplib<2>1019744 +Ref: whatsnew/3 5 imaplib1019853 +Ref: a8d1019853 +Ref: imaplib<2>-Footnote-11020732 +Ref: imaplib<2>-Footnote-21020796 +Ref: imaplib<2>-Footnote-31020855 +Ref: imaplib<2>-Footnote-41020914 +Ref: imaplib<2>-Footnote-51020973 +Ref: imaplib<2>-Footnote-61021038 +Node: imghdr1021103 +Ref: whatsnew/3 5 imghdr1021205 +Ref: a901021205 +Ref: imghdr-Footnote-11021499 +Ref: imghdr-Footnote-21021531 +Ref: imghdr-Footnote-31021596 +Ref: imghdr-Footnote-41021639 +Node: importlib<6>1021704 +Ref: whatsnew/3 5 importlib1021806 +Ref: a921021806 +Ref: importlib<6>-Footnote-11022641 +Ref: importlib<6>-Footnote-21022706 +Ref: importlib<6>-Footnote-31022771 +Node: inspect<6>1022836 +Ref: whatsnew/3 5 inspect1022937 +Ref: a961022937 +Ref: inspect<6>-Footnote-11024494 +Ref: inspect<6>-Footnote-21024559 +Ref: inspect<6>-Footnote-31024624 +Ref: inspect<6>-Footnote-41024689 +Ref: inspect<6>-Footnote-51024754 +Ref: inspect<6>-Footnote-61024819 +Ref: inspect<6>-Footnote-71024884 +Ref: inspect<6>-Footnote-81024949 +Node: io<3>1025014 +Ref: whatsnew/3 5 io1025115 +Ref: a9e1025115 +Ref: io<3>-Footnote-11025413 +Node: ipaddress<3>1025478 +Ref: whatsnew/3 5 ipaddress1025576 +Ref: aa21025576 +Ref: ipaddress<3>-Footnote-11026604 +Ref: ipaddress<3>-Footnote-21026669 +Node: json<2>1026734 +Ref: whatsnew/3 5 json1026839 +Ref: aa31026839 +Ref: json<2>-Footnote-11027339 +Ref: json<2>-Footnote-21027404 +Node: linecache<2>1027469 +Ref: whatsnew/3 5 linecache1027571 +Ref: aa51027571 +Ref: linecache<2>-Footnote-11027981 +Node: locale<4>1028046 +Ref: whatsnew/3 5 locale1028151 +Ref: aa81028151 +Ref: locale<4>-Footnote-11028716 +Node: logging<5>1028781 +Ref: whatsnew/3 5 logging1028878 +Ref: aaa1028878 +Ref: logging<5>-Footnote-11029848 +Ref: logging<5>-Footnote-21029913 +Node: lzma1029978 +Ref: whatsnew/3 5 lzma1030073 +Ref: ab11030073 +Ref: lzma-Footnote-11030335 +Node: math<6>1030400 +Ref: whatsnew/3 5 math1030503 +Ref: ab31030503 +Ref: math<6>-Footnote-11031045 +Ref: math<6>-Footnote-21031110 +Ref: math<6>-Footnote-31031175 +Node: multiprocessing<5>1031240 +Ref: whatsnew/3 5 multiprocessing1031350 +Ref: ab41031350 +Ref: multiprocessing<5>-Footnote-11031600 +Node: operator<2>1031665 +Ref: whatsnew/3 5 operator1031773 +Ref: ab61031773 +Ref: operator<2>-Footnote-11032178 +Ref: operator<2>-Footnote-21032243 +Node: os<8>1032308 +Ref: whatsnew/3 5 os1032408 +Ref: abb1032408 +Ref: os<8>-Footnote-11034256 +Ref: os<8>-Footnote-21034321 +Ref: os<8>-Footnote-31034386 +Ref: os<8>-Footnote-41034451 +Ref: os<8>-Footnote-51034516 +Ref: os<8>-Footnote-61034581 +Node: pathlib<7>1034646 +Ref: whatsnew/3 5 pathlib1034744 +Ref: ac31034744 +Ref: pathlib<7>-Footnote-11036215 +Ref: pathlib<7>-Footnote-21036280 +Ref: pathlib<7>-Footnote-31036345 +Ref: pathlib<7>-Footnote-41036410 +Ref: pathlib<7>-Footnote-51036475 +Node: pickle<3>1036540 +Ref: whatsnew/3 5 pickle1036642 +Ref: acc1036642 +Ref: pickle<3>-Footnote-11036958 +Node: poplib<2>1037023 +Ref: whatsnew/3 5 poplib1037120 +Ref: acd1037120 +Ref: poplib<2>-Footnote-11037362 +Ref: poplib<2>-Footnote-21037421 +Node: re<5>1037486 +Ref: whatsnew/3 5 re1037585 +Ref: acf1037585 +Ref: re<5>-Footnote-11038821 +Ref: re<5>-Footnote-21038885 +Ref: re<5>-Footnote-31038950 +Ref: re<5>-Footnote-41039017 +Node: readline<2>1039082 +Ref: whatsnew/3 5 readline1039181 +Ref: ad71039181 +Ref: readline<2>-Footnote-11039444 +Node: selectors1039509 +Ref: whatsnew/3 5 selectors1039612 +Ref: ad91039612 +Ref: selectors-Footnote-11039834 +Node: shutil<3>1039899 +Ref: whatsnew/3 5 shutil1040000 +Ref: ada1040000 +Ref: shutil<3>-Footnote-11040479 +Ref: shutil<3>-Footnote-21040544 +Node: signal<3>1040608 +Ref: whatsnew/3 5 signal1040705 +Ref: adb1040705 +Ref: signal<3>-Footnote-11041172 +Ref: signal<3>-Footnote-21041237 +Node: smtpd1041302 +Ref: whatsnew/3 5 smtpd1041400 +Ref: adc1041400 +Ref: smtpd-Footnote-11043084 +Ref: smtpd-Footnote-21043149 +Ref: smtpd-Footnote-31043208 +Ref: smtpd-Footnote-41043273 +Ref: smtpd-Footnote-51043332 +Ref: smtpd-Footnote-61043397 +Node: smtplib<2>1043462 +Ref: whatsnew/3 5 smtplib1043557 +Ref: add1043557 +Ref: smtplib<2>-Footnote-11044178 +Ref: smtplib<2>-Footnote-21044243 +Ref: smtplib<2>-Footnote-31044308 +Ref: smtplib<2>-Footnote-41044367 +Node: sndhdr1044432 +Ref: whatsnew/3 5 sndhdr1044531 +Ref: ae21044531 +Ref: sndhdr-Footnote-11044746 +Node: socket<8>1044811 +Ref: whatsnew/3 5 socket1044906 +Ref: ae51044906 +Ref: socket<8>-Footnote-11045877 +Ref: socket<8>-Footnote-21045942 +Ref: socket<8>-Footnote-31046007 +Ref: socket<8>-Footnote-41046072 +Node: ssl<7>1046137 +Ref: whatsnew/3 5 ssl1046236 +Ref: ae91046236 +Node: Memory BIO Support1046365 +Ref: whatsnew/3 5 memory-bio-support1046481 +Ref: aea1046481 +Ref: whatsnew/3 5 whatsnew-sslmemorybio1046481 +Ref: 9eb1046481 +Ref: Memory BIO Support-Footnote-11047364 +Node: Application-Layer Protocol Negotiation Support1047429 +Ref: whatsnew/3 5 application-layer-protocol-negotiation-support1047567 +Ref: aec1047567 +Ref: Application-Layer Protocol Negotiation Support-Footnote-11048272 +Ref: Application-Layer Protocol Negotiation Support-Footnote-21048337 +Node: Other Changes1048396 +Ref: whatsnew/3 5 other-changes1048507 +Ref: af01048507 +Ref: Other Changes-Footnote-11050100 +Ref: Other Changes-Footnote-21050165 +Ref: Other Changes-Footnote-31050230 +Ref: Other Changes-Footnote-41050295 +Ref: Other Changes-Footnote-51050354 +Ref: Other Changes-Footnote-61050419 +Ref: Other Changes-Footnote-71050484 +Ref: Other Changes-Footnote-81050549 +Node: sqlite3<5>1050614 +Ref: whatsnew/3 5 sqlite31050717 +Ref: af91050717 +Ref: sqlite3<5>-Footnote-11051046 +Ref: sqlite3<5>-Footnote-21051111 +Node: subprocess<3>1051176 +Ref: whatsnew/3 5 subprocess1051279 +Ref: afb1051279 +Ref: whatsnew/3 5 whatsnew-subprocess1051279 +Ref: 9ee1051279 +Ref: subprocess<3>-Footnote-11052293 +Node: sys<8>1052358 +Ref: whatsnew/3 5 sys1052463 +Ref: afd1052463 +Ref: sys<8>-Footnote-11053113 +Ref: sys<8>-Footnote-21053178 +Node: sysconfig<2>1053243 +Ref: whatsnew/3 5 sysconfig1053345 +Ref: b001053345 +Ref: sysconfig<2>-Footnote-11053578 +Node: tarfile<2>1053643 +Ref: whatsnew/3 5 tarfile1053751 +Ref: b011053751 +Ref: tarfile<2>-Footnote-11054662 +Ref: tarfile<2>-Footnote-21054727 +Ref: tarfile<2>-Footnote-31054792 +Node: threading<5>1054857 +Ref: whatsnew/3 5 threading1054960 +Ref: b071054960 +Ref: threading<5>-Footnote-11055212 +Node: time<6>1055277 +Ref: whatsnew/3 5 time1055379 +Ref: b091055379 +Ref: time<6>-Footnote-11055556 +Node: timeit<2>1055621 +Ref: whatsnew/3 5 timeit1055721 +Ref: b0b1055721 +Ref: timeit<2>-Footnote-11056186 +Ref: timeit<2>-Footnote-21056251 +Node: tkinter<6>1056315 +Ref: whatsnew/3 5 tkinter1056420 +Ref: b0d1056420 +Ref: tkinter<6>-Footnote-11056752 +Node: traceback<4>1056817 +Ref: whatsnew/3 5 traceback1056921 +Ref: b0e1056921 +Ref: whatsnew/3 5 whatsnew-traceback1056921 +Ref: 9ef1056921 +Ref: traceback<4>-Footnote-11057504 +Ref: traceback<4>-Footnote-21057569 +Ref: traceback<4>-Footnote-31057634 +Node: types<3>1057699 +Ref: whatsnew/3 5 types1057807 +Ref: b151057807 +Ref: types<3>-Footnote-11058251 +Ref: types<3>-Footnote-21058316 +Node: unicodedata<6>1058381 +Ref: whatsnew/3 5 unicodedata1058488 +Ref: b181058488 +Ref: unicodedata<6>-Footnote-11058640 +Node: unittest<5>1058691 +Ref: whatsnew/3 5 unittest1058806 +Ref: b191058806 +Ref: unittest<5>-Footnote-11059600 +Ref: unittest<5>-Footnote-21059665 +Ref: unittest<5>-Footnote-31059730 +Node: unittest mock<3>1059795 +Ref: whatsnew/3 5 unittest-mock1059902 +Ref: b1b1059902 +Ref: unittest mock<3>-Footnote-11060827 +Ref: unittest mock<3>-Footnote-21060892 +Ref: unittest mock<3>-Footnote-31060957 +Ref: unittest mock<3>-Footnote-41061022 +Ref: unittest mock<3>-Footnote-51061087 +Ref: unittest mock<3>-Footnote-61061152 +Node: urllib1061217 +Ref: whatsnew/3 5 urllib1061320 +Ref: b1f1061320 +Ref: urllib-Footnote-11062480 +Ref: urllib-Footnote-21062545 +Ref: urllib-Footnote-31062609 +Ref: urllib-Footnote-41062674 +Ref: urllib-Footnote-51062739 +Ref: urllib-Footnote-61062798 +Ref: urllib-Footnote-71062857 +Ref: urllib-Footnote-81062916 +Node: wsgiref1062981 +Ref: whatsnew/3 5 wsgiref1063077 +Ref: b241063077 +Ref: wsgiref-Footnote-11063315 +Node: xmlrpc<2>1063379 +Ref: whatsnew/3 5 xmlrpc1063476 +Ref: b261063476 +Ref: xmlrpc<2>-Footnote-11063846 +Ref: xmlrpc<2>-Footnote-21063911 +Node: xml sax1063976 +Ref: whatsnew/3 5 xml-sax1064076 +Ref: b271064076 +Ref: xml sax-Footnote-11064409 +Ref: xml sax-Footnote-21064473 +Node: zipfile<4>1064538 +Ref: whatsnew/3 5 zipfile1064620 +Ref: b2a1064620 +Ref: zipfile<4>-Footnote-11064960 +Ref: zipfile<4>-Footnote-21065025 +Node: Other module-level changes1065090 +Ref: whatsnew/3 5 other-module-level-changes1065232 +Ref: b2b1065232 +Ref: Other module-level changes-Footnote-11065563 +Node: Optimizations<7>1065628 +Ref: whatsnew/3 5 optimizations1065777 +Ref: b2c1065777 +Ref: Optimizations<7>-Footnote-11068834 +Ref: Optimizations<7>-Footnote-21068899 +Ref: Optimizations<7>-Footnote-31068964 +Ref: Optimizations<7>-Footnote-41069029 +Ref: Optimizations<7>-Footnote-51069094 +Ref: Optimizations<7>-Footnote-61069159 +Ref: Optimizations<7>-Footnote-71069224 +Ref: Optimizations<7>-Footnote-81069289 +Ref: Optimizations<7>-Footnote-91069354 +Ref: Optimizations<7>-Footnote-101069419 +Ref: Optimizations<7>-Footnote-111069485 +Ref: Optimizations<7>-Footnote-121069551 +Ref: Optimizations<7>-Footnote-131069617 +Ref: Optimizations<7>-Footnote-141069683 +Ref: Optimizations<7>-Footnote-151069749 +Ref: Optimizations<7>-Footnote-161069815 +Ref: Optimizations<7>-Footnote-171069881 +Ref: Optimizations<7>-Footnote-181069947 +Ref: Optimizations<7>-Footnote-191070013 +Ref: Optimizations<7>-Footnote-201070079 +Node: Build and C API Changes<3>1070145 +Ref: whatsnew/3 5 build-and-c-api-changes1070281 +Ref: b391070281 +Ref: Build and C API Changes<3>-Footnote-11073831 +Ref: Build and C API Changes<3>-Footnote-21073896 +Ref: Build and C API Changes<3>-Footnote-31073961 +Ref: Build and C API Changes<3>-Footnote-41074026 +Ref: Build and C API Changes<3>-Footnote-51074091 +Ref: Build and C API Changes<3>-Footnote-61074156 +Ref: Build and C API Changes<3>-Footnote-71074198 +Ref: Build and C API Changes<3>-Footnote-81074263 +Ref: Build and C API Changes<3>-Footnote-91074328 +Ref: Build and C API Changes<3>-Footnote-101074370 +Node: Deprecated<8>1074409 +Ref: whatsnew/3 5 deprecated1074539 +Ref: b451074539 +Node: New Keywords<2>1074816 +Ref: whatsnew/3 5 new-keywords1074919 +Ref: b461074919 +Ref: New Keywords<2>-Footnote-11075193 +Node: Deprecated Python Behavior<2>1075235 +Ref: whatsnew/3 5 deprecated-python-behavior1075376 +Ref: b471075376 +Node: Unsupported Operating Systems1075791 +Ref: whatsnew/3 5 unsupported-operating-systems1075967 +Ref: b481075967 +Ref: Unsupported Operating Systems-Footnote-11076208 +Node: Deprecated Python modules functions and methods<3>1076250 +Ref: whatsnew/3 5 deprecated-python-modules-functions-and-methods1076388 +Ref: b491076388 +Ref: Deprecated Python modules functions and methods<3>-Footnote-11079309 +Ref: Deprecated Python modules functions and methods<3>-Footnote-21079374 +Ref: Deprecated Python modules functions and methods<3>-Footnote-31079438 +Ref: Deprecated Python modules functions and methods<3>-Footnote-41079503 +Ref: Deprecated Python modules functions and methods<3>-Footnote-51079568 +Ref: Deprecated Python modules functions and methods<3>-Footnote-61079633 +Ref: Deprecated Python modules functions and methods<3>-Footnote-71079698 +Ref: Deprecated Python modules functions and methods<3>-Footnote-81079763 +Node: Removed<8>1079828 +Ref: whatsnew/3 5 removed1079953 +Ref: b4e1079953 +Node: API and Feature Removals<4>1080051 +Ref: whatsnew/3 5 api-and-feature-removals1080125 +Ref: b4f1080125 +Ref: API and Feature Removals<4>-Footnote-11080982 +Ref: API and Feature Removals<4>-Footnote-21081046 +Node: Porting to Python 3 51081111 +Ref: whatsnew/3 5 porting-to-python-3-51081254 +Ref: b501081254 +Node: Changes in Python behavior<2>1081599 +Ref: whatsnew/3 5 changes-in-python-behavior1081723 +Ref: b511081723 +Node: Changes in the Python API<6>1082133 +Ref: whatsnew/3 5 changes-in-the-python-api1082289 +Ref: b521082289 +Ref: Changes in the Python API<6>-Footnote-11089215 +Ref: Changes in the Python API<6>-Footnote-21089257 +Ref: Changes in the Python API<6>-Footnote-31089322 +Ref: Changes in the Python API<6>-Footnote-41089387 +Ref: Changes in the Python API<6>-Footnote-51089452 +Ref: Changes in the Python API<6>-Footnote-61089517 +Ref: Changes in the Python API<6>-Footnote-71089582 +Ref: Changes in the Python API<6>-Footnote-81089647 +Ref: Changes in the Python API<6>-Footnote-91089712 +Ref: Changes in the Python API<6>-Footnote-101089777 +Ref: Changes in the Python API<6>-Footnote-111089843 +Ref: Changes in the Python API<6>-Footnote-121089909 +Ref: Changes in the Python API<6>-Footnote-131089974 +Ref: Changes in the Python API<6>-Footnote-141090017 +Ref: Changes in the Python API<6>-Footnote-151090077 +Ref: Changes in the Python API<6>-Footnote-161090143 +Ref: Changes in the Python API<6>-Footnote-171090209 +Ref: Changes in the Python API<6>-Footnote-181090275 +Node: Changes in the C API<6>1090340 +Ref: whatsnew/3 5 changes-in-the-c-api1090458 +Ref: b5c1090458 +Ref: Changes in the C API<6>-Footnote-11091730 +Ref: Changes in the C API<6>-Footnote-21091795 +Ref: Changes in the C API<6>-Footnote-31091860 +Node: Notable changes in Python 3 5 41091902 +Ref: whatsnew/3 5 notable-changes-in-python-3-5-41092026 +Ref: b5f1092026 +Node: New make regen-all build target<2>1092263 +Ref: whatsnew/3 5 new-make-regen-all-build-target1092411 +Ref: b601092411 +Ref: New make regen-all build target<2>-Footnote-11093198 +Ref: New make regen-all build target<2>-Footnote-21093266 +Node: Removal of make touch build target<2>1093331 +Ref: whatsnew/3 5 removal-of-make-touch-build-target1093479 +Ref: b611093479 +Ref: Removal of make touch build target<2>-Footnote-11093909 +Node: What’s New In Python 3 41093974 +Ref: whatsnew/3 4 doc1094129 +Ref: b621094129 +Ref: whatsnew/3 4 what-s-new-in-python-3-41094129 +Ref: b631094129 +Ref: What’s New In Python 3 4-Footnote-11094864 +Ref: What’s New In Python 3 4-Footnote-21094924 +Node: Summary – Release Highlights<2>1094966 +Ref: whatsnew/3 4 summary-release-highlights1095087 +Ref: b641095087 +Ref: Summary – Release Highlights<2>-Footnote-11099383 +Ref: Summary – Release Highlights<2>-Footnote-21099425 +Ref: Summary – Release Highlights<2>-Footnote-31099467 +Ref: Summary – Release Highlights<2>-Footnote-41099532 +Ref: Summary – Release Highlights<2>-Footnote-51099574 +Ref: Summary – Release Highlights<2>-Footnote-61099639 +Ref: Summary – Release Highlights<2>-Footnote-71099681 +Ref: Summary – Release Highlights<2>-Footnote-81099723 +Ref: Summary – Release Highlights<2>-Footnote-91099765 +Ref: Summary – Release Highlights<2>-Footnote-101099807 +Ref: Summary – Release Highlights<2>-Footnote-111099850 +Ref: Summary – Release Highlights<2>-Footnote-121099893 +Ref: Summary – Release Highlights<2>-Footnote-131099936 +Ref: Summary – Release Highlights<2>-Footnote-141099979 +Ref: Summary – Release Highlights<2>-Footnote-151100022 +Ref: Summary – Release Highlights<2>-Footnote-161100087 +Ref: Summary – Release Highlights<2>-Footnote-171100153 +Ref: Summary – Release Highlights<2>-Footnote-181100196 +Ref: Summary – Release Highlights<2>-Footnote-191100239 +Ref: Summary – Release Highlights<2>-Footnote-201100305 +Ref: Summary – Release Highlights<2>-Footnote-211100351 +Ref: Summary – Release Highlights<2>-Footnote-221100394 +Ref: Summary – Release Highlights<2>-Footnote-231100437 +Ref: Summary – Release Highlights<2>-Footnote-241100503 +Ref: Summary – Release Highlights<2>-Footnote-251100546 +Node: New Features<11>1100589 +Ref: whatsnew/3 4 new-features1100733 +Ref: b7f1100733 +Node: PEP 453 Explicit Bootstrapping of PIP in Python Installations1101223 +Ref: whatsnew/3 4 pep-453-explicit-bootstrapping-of-pip-in-python-installations1101404 +Ref: b801101404 +Ref: whatsnew/3 4 whatsnew-pep-4531101404 +Ref: b651101404 +Node: Bootstrapping pip By Default1101616 +Ref: whatsnew/3 4 bootstrapping-pip-by-default1101772 +Ref: b811101772 +Ref: Bootstrapping pip By Default-Footnote-11104672 +Ref: Bootstrapping pip By Default-Footnote-21104714 +Node: Documentation Changes1104801 +Ref: whatsnew/3 4 documentation-changes1104957 +Ref: b841104957 +Ref: Documentation Changes-Footnote-11105908 +Ref: Documentation Changes-Footnote-21105945 +Node: PEP 446 Newly Created File Descriptors Are Non-Inheritable1105987 +Ref: whatsnew/3 4 pep-446-newly-created-file-descriptors-are-non-inheritable1106207 +Ref: b891106207 +Ref: whatsnew/3 4 whatsnew-pep-4461106207 +Ref: b661106207 +Ref: PEP 446 Newly Created File Descriptors Are Non-Inheritable-Footnote-11107225 +Ref: PEP 446 Newly Created File Descriptors Are Non-Inheritable-Footnote-21107267 +Node: Improvements to Codec Handling1107309 +Ref: whatsnew/3 4 codec-handling-improvements1107515 +Ref: b681107515 +Ref: whatsnew/3 4 improvements-to-codec-handling1107515 +Ref: b911107515 +Ref: Improvements to Codec Handling-Footnote-11111721 +Ref: Improvements to Codec Handling-Footnote-21111785 +Ref: Improvements to Codec Handling-Footnote-31111850 +Ref: Improvements to Codec Handling-Footnote-41111915 +Node: PEP 451 A ModuleSpec Type for the Import System1111980 +Ref: whatsnew/3 4 pep-451-a-modulespec-type-for-the-import-system1112153 +Ref: b961112153 +Ref: whatsnew/3 4 whatsnew-pep-4511112153 +Ref: b691112153 +Ref: PEP 451 A ModuleSpec Type for the Import System-Footnote-11113104 +Ref: PEP 451 A ModuleSpec Type for the Import System-Footnote-21113146 +Node: Other Language Changes<8>1113226 +Ref: whatsnew/3 4 other-language-changes1113360 +Ref: b981113360 +Ref: Other Language Changes<8>-Footnote-11116002 +Ref: Other Language Changes<8>-Footnote-21116067 +Ref: Other Language Changes<8>-Footnote-31116132 +Ref: Other Language Changes<8>-Footnote-41116197 +Ref: Other Language Changes<8>-Footnote-51116264 +Ref: Other Language Changes<8>-Footnote-61116329 +Ref: Other Language Changes<8>-Footnote-71116394 +Ref: Other Language Changes<8>-Footnote-81116459 +Ref: Other Language Changes<8>-Footnote-91116524 +Ref: Other Language Changes<8>-Footnote-101116589 +Ref: Other Language Changes<8>-Footnote-111116655 +Ref: Other Language Changes<8>-Footnote-121116698 +Node: New Modules<8>1116764 +Ref: whatsnew/3 4 new-modules1116894 +Ref: b9e1116894 +Node: asyncio<9>1117105 +Ref: whatsnew/3 4 asyncio1117184 +Ref: b9f1117184 +Ref: whatsnew/3 4 whatsnew-asyncio1117184 +Ref: b6b1117184 +Ref: asyncio<9>-Footnote-11117782 +Ref: asyncio<9>-Footnote-21117824 +Node: ensurepip1117866 +Ref: whatsnew/3 4 ensurepip1117961 +Ref: ba01117961 +Ref: whatsnew/3 4 whatsnew-ensurepip1117961 +Ref: b6c1117961 +Ref: ensurepip-Footnote-11119233 +Node: enum<7>1119275 +Ref: whatsnew/3 4 enum1119370 +Ref: ba11119370 +Ref: whatsnew/3 4 whatsnew-enum1119370 +Ref: b6d1119370 +Ref: enum<7>-Footnote-11119940 +Ref: enum<7>-Footnote-21119982 +Node: pathlib<8>1120024 +Ref: whatsnew/3 4 pathlib1120122 +Ref: ba21120122 +Ref: whatsnew/3 4 whatsnew-pathlib1120122 +Ref: b6e1120122 +Ref: pathlib<8>-Footnote-11120740 +Node: selectors<2>1120782 +Ref: whatsnew/3 4 selectors1120886 +Ref: ba31120886 +Ref: whatsnew/3 4 whatsnew-selectors1120886 +Ref: b6f1120886 +Ref: selectors<2>-Footnote-11121144 +Node: statistics<4>1121186 +Ref: whatsnew/3 4 statistics1121294 +Ref: ba41121294 +Ref: whatsnew/3 4 whatsnew-statistics1121294 +Ref: b701121294 +Ref: statistics<4>-Footnote-11121759 +Ref: statistics<4>-Footnote-21121801 +Node: tracemalloc<4>1121843 +Ref: whatsnew/3 4 tracemalloc1121930 +Ref: ba51121930 +Ref: whatsnew/3 4 whatsnew-tracemalloc1121930 +Ref: b711121930 +Ref: tracemalloc<4>-Footnote-11122595 +Ref: tracemalloc<4>-Footnote-21122637 +Node: Improved Modules<8>1122679 +Ref: whatsnew/3 4 improved-modules1122823 +Ref: ba61122823 +Node: abc1124155 +Ref: whatsnew/3 4 abc1124230 +Ref: ba71124230 +Ref: abc-Footnote-11124751 +Ref: abc-Footnote-21124816 +Node: aifc<2>1124881 +Ref: whatsnew/3 4 aifc1124976 +Ref: bab1124976 +Ref: aifc<2>-Footnote-11125614 +Ref: aifc<2>-Footnote-21125679 +Ref: aifc<2>-Footnote-31125744 +Node: argparse<4>1125808 +Ref: whatsnew/3 4 argparse1125907 +Ref: bb01125907 +Ref: argparse<4>-Footnote-11126153 +Node: audioop1126218 +Ref: whatsnew/3 4 audioop1126319 +Ref: bb21126319 +Ref: audioop-Footnote-11126858 +Ref: audioop-Footnote-21126923 +Ref: audioop-Footnote-31126988 +Node: base64<2>1127053 +Ref: whatsnew/3 4 base641127157 +Ref: bb41127157 +Ref: base64<2>-Footnote-11127988 +Ref: base64<2>-Footnote-21128053 +Node: collections<6>1128118 +Ref: whatsnew/3 4 collections1128223 +Ref: bb91128223 +Ref: collections<6>-Footnote-11128553 +Node: colorsys1128618 +Ref: whatsnew/3 4 colorsys1128727 +Ref: bbb1128727 +Ref: colorsys-Footnote-11129095 +Node: contextlib<6>1129160 +Ref: whatsnew/3 4 contextlib1129261 +Ref: bbc1129261 +Ref: contextlib<6>-Footnote-11130446 +Ref: contextlib<6>-Footnote-21130511 +Ref: contextlib<6>-Footnote-31130576 +Node: dbm<5>1130641 +Ref: whatsnew/3 4 dbm1130740 +Ref: bc01130740 +Ref: dbm<5>-Footnote-11131087 +Node: dis<2>1131152 +Ref: whatsnew/3 4 dis1131248 +Ref: bc21131248 +Ref: dis<2>-Footnote-11133847 +Ref: dis<2>-Footnote-21133912 +Ref: dis<2>-Footnote-31133977 +Node: doctest<3>1134042 +Ref: whatsnew/3 4 doctest1134140 +Ref: bcc1134140 +Ref: doctest<3>-Footnote-11134908 +Ref: doctest<3>-Footnote-21134973 +Ref: doctest<3>-Footnote-31135038 +Node: email<3>1135102 +Ref: whatsnew/3 4 email1135201 +Ref: bcf1135201 +Ref: whatsnew/3 4 whatsnew-email-contentmanager1136449 +Ref: b751136449 +Ref: email<3>-Footnote-11137378 +Ref: email<3>-Footnote-21137443 +Ref: email<3>-Footnote-31137508 +Ref: email<3>-Footnote-41137573 +Node: filecmp1137638 +Ref: whatsnew/3 4 filecmp1137739 +Ref: bd71137739 +Ref: filecmp-Footnote-11138485 +Ref: filecmp-Footnote-21138550 +Node: functools<5>1138615 +Ref: whatsnew/3 4 functools1138713 +Ref: whatsnew/3 4 whatsnew-singledispatch1139160 +Ref: b721139160 +Ref: functools<5>-Footnote-11140119 +Ref: functools<5>-Footnote-21140183 +Ref: functools<5>-Footnote-31140225 +Ref: functools<5>-Footnote-41140290 +Node: gc<5>1140355 +Ref: whatsnew/3 4 gc1140453 +Ref: bdd1140453 +Ref: gc<5>-Footnote-11140719 +Node: glob<3>1140784 +Ref: whatsnew/3 4 glob1140880 +Ref: bdf1140880 +Ref: glob<3>-Footnote-11141184 +Node: hashlib<5>1141248 +Ref: whatsnew/3 4 hashlib1141346 +Ref: be11141346 +Ref: hashlib<5>-Footnote-11141979 +Ref: hashlib<5>-Footnote-21142024 +Ref: hashlib<5>-Footnote-31142089 +Node: hmac<3>1142154 +Ref: whatsnew/3 4 hmac1142249 +Ref: be31142249 +Ref: hmac<3>-Footnote-11143275 +Ref: hmac<3>-Footnote-21143340 +Ref: hmac<3>-Footnote-31143405 +Ref: hmac<3>-Footnote-41143447 +Node: html1143512 +Ref: whatsnew/3 4 html1143604 +Ref: be81143604 +Ref: html-Footnote-11144361 +Ref: html-Footnote-21144425 +Ref: html-Footnote-31144490 +Node: http<3>1144555 +Ref: whatsnew/3 4 http1144659 +Ref: be91144659 +Ref: http<3>-Footnote-11145300 +Ref: http<3>-Footnote-21145365 +Node: idlelib and IDLE<4>1145430 +Ref: whatsnew/3 4 idlelib-and-idle1145542 +Ref: bec1145542 +Node: importlib<7>1145936 +Ref: whatsnew/3 4 importlib1146051 +Ref: bed1146051 +Ref: importlib<7>-Footnote-11148052 +Ref: importlib<7>-Footnote-21148117 +Ref: importlib<7>-Footnote-31148182 +Ref: importlib<7>-Footnote-41148247 +Ref: importlib<7>-Footnote-51148312 +Ref: importlib<7>-Footnote-61148377 +Ref: importlib<7>-Footnote-71148442 +Node: inspect<7>1148507 +Ref: whatsnew/3 4 inspect1148615 +Ref: bf51148615 +Ref: inspect<7>-Footnote-11150323 +Ref: inspect<7>-Footnote-21150388 +Ref: inspect<7>-Footnote-31150453 +Ref: inspect<7>-Footnote-41150518 +Ref: inspect<7>-Footnote-51150583 +Ref: inspect<7>-Footnote-61150648 +Node: ipaddress<4>1150713 +Ref: whatsnew/3 4 ipaddress1150819 +Ref: bf91150819 +Ref: ipaddress<4>-Footnote-11151345 +Node: logging<6>1151410 +Ref: whatsnew/3 4 logging1151513 +Ref: bfb1151513 +Ref: logging<6>-Footnote-11152643 +Ref: logging<6>-Footnote-21152707 +Ref: logging<6>-Footnote-31152772 +Node: marshal1152837 +Ref: whatsnew/3 4 marshal1152935 +Ref: c011152935 +Ref: whatsnew/3 4 whatsnew-marshal-31152935 +Ref: b6a1152935 +Ref: marshal-Footnote-11153614 +Ref: marshal-Footnote-21153679 +Node: mmap<2>1153744 +Ref: whatsnew/3 4 mmap1153850 +Ref: c021153850 +Ref: mmap<2>-Footnote-11154020 +Node: multiprocessing<6>1154084 +Ref: whatsnew/3 4 multiprocessing1154194 +Ref: c031154194 +Ref: whatsnew/3 4 whatsnew-multiprocessing-no-fork1154245 +Ref: b741154245 +Ref: multiprocessing<6>-Footnote-11156057 +Ref: multiprocessing<6>-Footnote-21156121 +Ref: multiprocessing<6>-Footnote-31156186 +Ref: multiprocessing<6>-Footnote-41156250 +Node: operator<3>1156315 +Ref: whatsnew/3 4 operator1156423 +Ref: c0a1156423 +Ref: operator<3>-Footnote-11156974 +Ref: operator<3>-Footnote-21157016 +Ref: operator<3>-Footnote-31157081 +Node: os<9>1157146 +Ref: whatsnew/3 4 os1157242 +Ref: c0c1157242 +Ref: os<9>-Footnote-11158687 +Ref: os<9>-Footnote-21158752 +Ref: os<9>-Footnote-31158817 +Ref: os<9>-Footnote-41158881 +Node: pdb<4>1158946 +Ref: whatsnew/3 4 pdb1159040 +Ref: c121159040 +Ref: pdb<4>-Footnote-11160034 +Ref: pdb<4>-Footnote-21160099 +Node: pickle<4>1160164 +Ref: whatsnew/3 4 pickle1160264 +Ref: c151160264 +Ref: whatsnew/3 4 whatsnew-protocol-41160264 +Ref: b731160264 +Ref: pickle<4>-Footnote-11160854 +Node: plistlib<2>1160896 +Ref: whatsnew/3 4 plistlib1160999 +Ref: c161160999 +Ref: plistlib<2>-Footnote-11161533 +Node: poplib<3>1161598 +Ref: whatsnew/3 4 poplib1161701 +Ref: c191161701 +Ref: poplib<3>-Footnote-11162089 +Node: pprint<4>1162153 +Ref: whatsnew/3 4 pprint1162248 +Ref: c1c1162248 +Ref: pprint<4>-Footnote-11162866 +Ref: pprint<4>-Footnote-21162931 +Node: pty1162996 +Ref: whatsnew/3 4 pty1163090 +Ref: c1f1163090 +Node: pydoc<4>1163281 +Ref: whatsnew/3 4 pydoc1163371 +Ref: c211163371 +Ref: pydoc<4>-Footnote-11164426 +Ref: pydoc<4>-Footnote-21164491 +Node: re<6>1164556 +Ref: whatsnew/3 4 re1164651 +Ref: c221164651 +Ref: re<6>-Footnote-11165392 +Ref: re<6>-Footnote-21165457 +Ref: re<6>-Footnote-31165522 +Node: resource1165587 +Ref: whatsnew/3 4 resource1165680 +Ref: c261165680 +Ref: resource-Footnote-11166531 +Ref: resource-Footnote-21166596 +Ref: resource-Footnote-31166661 +Node: select1166726 +Ref: whatsnew/3 4 select1166823 +Ref: c301166823 +Ref: select-Footnote-11167330 +Ref: select-Footnote-21167395 +Node: shelve<2>1167460 +Ref: whatsnew/3 4 shelve1167558 +Ref: c371167558 +Ref: shelve<2>-Footnote-11167828 +Node: shutil<4>1167893 +Ref: whatsnew/3 4 shutil1167993 +Ref: c391167993 +Ref: shutil<4>-Footnote-11168364 +Node: smtpd<2>1168431 +Ref: whatsnew/3 4 smtpd1168532 +Ref: c3c1168532 +Ref: smtpd<2>-Footnote-11168908 +Node: smtplib<3>1168973 +Ref: whatsnew/3 4 smtplib1169074 +Ref: c3e1169074 +Ref: smtplib<3>-Footnote-11169434 +Node: socket<9>1169498 +Ref: whatsnew/3 4 socket1169601 +Ref: c401169601 +Ref: socket<9>-Footnote-11170382 +Ref: socket<9>-Footnote-21170447 +Node: sqlite3<6>1170511 +Ref: whatsnew/3 4 sqlite31170610 +Ref: c441170610 +Ref: sqlite3<6>-Footnote-11170899 +Ref: sqlite3<6>-Footnote-21170939 +Node: ssl<8>1171004 +Ref: whatsnew/3 4 ssl1171098 +Ref: c451171098 +Ref: whatsnew/3 4 whatsnew-tls-11-121171125 +Ref: b771171125 +Ref: whatsnew/3 4 whatsnew34-sslcontext1171395 +Ref: b7a1171395 +Ref: whatsnew/3 4 whatsnew34-win-cert-store1174069 +Ref: b781174069 +Ref: whatsnew/3 4 whatsnew34-sni1174323 +Ref: b791174323 +Ref: ssl<8>-Footnote-11174772 +Ref: ssl<8>-Footnote-21174837 +Ref: ssl<8>-Footnote-31174902 +Ref: ssl<8>-Footnote-41174967 +Ref: ssl<8>-Footnote-51175032 +Ref: ssl<8>-Footnote-61175097 +Ref: ssl<8>-Footnote-71175161 +Ref: ssl<8>-Footnote-81175226 +Ref: ssl<8>-Footnote-91175291 +Ref: ssl<8>-Footnote-101175355 +Node: stat1175421 +Ref: whatsnew/3 4 stat1175514 +Ref: c571175514 +Ref: stat-Footnote-11175985 +Ref: stat-Footnote-21176050 +Node: struct<2>1176115 +Ref: whatsnew/3 4 struct1176215 +Ref: c5c1176215 +Ref: struct<2>-Footnote-11176545 +Node: subprocess<4>1176610 +Ref: whatsnew/3 4 subprocess1176714 +Ref: c5f1176714 +Ref: subprocess<4>-Footnote-11177158 +Ref: subprocess<4>-Footnote-21177223 +Node: sunau<2>1177288 +Ref: whatsnew/3 4 sunau1177389 +Ref: c621177389 +Ref: sunau<2>-Footnote-11178194 +Ref: sunau<2>-Footnote-21178259 +Ref: sunau<2>-Footnote-31178324 +Ref: sunau<2>-Footnote-41178389 +Node: sys<9>1178453 +Ref: whatsnew/3 4 sys1178551 +Ref: c661178551 +Ref: sys<9>-Footnote-11179829 +Ref: sys<9>-Footnote-21179894 +Node: tarfile<3>1179958 +Ref: whatsnew/3 4 tarfile1180056 +Ref: c6c1180056 +Ref: tarfile<3>-Footnote-11180372 +Node: textwrap1180437 +Ref: whatsnew/3 4 textwrap1180541 +Ref: c6e1180541 +Ref: textwrap-Footnote-11181240 +Ref: textwrap-Footnote-21181305 +Node: threading<6>1181370 +Ref: whatsnew/3 4 threading1181476 +Ref: c731181476 +Ref: threading<6>-Footnote-11181819 +Node: traceback<5>1181884 +Ref: whatsnew/3 4 traceback1181990 +Ref: c751181990 +Ref: traceback<5>-Footnote-11182303 +Node: types<4>1182370 +Ref: whatsnew/3 4 types1182473 +Ref: c771182473 +Ref: types<4>-Footnote-11182977 +Node: urllib<2>1183042 +Ref: whatsnew/3 4 urllib1183144 +Ref: c781183144 +Ref: urllib<2>-Footnote-11184458 +Ref: urllib<2>-Footnote-21184523 +Ref: urllib<2>-Footnote-31184588 +Ref: urllib<2>-Footnote-41184653 +Ref: urllib<2>-Footnote-51184718 +Ref: urllib<2>-Footnote-61184783 +Node: unittest<6>1184848 +Ref: whatsnew/3 4 unittest1184949 +Ref: c821184949 +Ref: unittest<6>-Footnote-11188103 +Ref: unittest<6>-Footnote-21188168 +Ref: unittest<6>-Footnote-31188233 +Ref: unittest<6>-Footnote-41188298 +Ref: unittest<6>-Footnote-51188363 +Ref: unittest<6>-Footnote-61188428 +Ref: unittest<6>-Footnote-71188493 +Ref: unittest<6>-Footnote-81188558 +Ref: unittest<6>-Footnote-91188623 +Node: venv<6>1188688 +Ref: whatsnew/3 4 venv1188787 +Ref: c891188787 +Ref: venv<6>-Footnote-11189343 +Ref: venv<6>-Footnote-21189408 +Ref: venv<6>-Footnote-31189473 +Node: wave<2>1189515 +Ref: whatsnew/3 4 wave1189613 +Ref: c8c1189613 +Ref: wave<2>-Footnote-11190248 +Ref: wave<2>-Footnote-21190313 +Ref: wave<2>-Footnote-31190378 +Ref: wave<2>-Footnote-41190442 +Node: weakref<2>1190506 +Ref: whatsnew/3 4 weakref1190609 +Ref: c901190609 +Ref: weakref<2>-Footnote-11191228 +Ref: weakref<2>-Footnote-21191293 +Ref: weakref<2>-Footnote-31191358 +Node: xml etree<2>1191423 +Ref: whatsnew/3 4 xml-etree1191529 +Ref: c941191529 +Ref: xml etree<2>-Footnote-11192266 +Ref: xml etree<2>-Footnote-21192331 +Node: zipfile<5>1192396 +Ref: whatsnew/3 4 zipfile1192483 +Ref: c9a1192483 +Ref: zipfile<5>-Footnote-11193012 +Ref: zipfile<5>-Footnote-21193077 +Node: CPython Implementation Changes1193142 +Ref: whatsnew/3 4 cpython-implementation-changes1193285 +Ref: c9d1193285 +Node: PEP 445 Customization of CPython Memory Allocators1193815 +Ref: whatsnew/3 4 pep-445-customization-of-cpython-memory-allocators1193973 +Ref: c9e1193973 +Ref: whatsnew/3 4 whatsnew-pep-4451193973 +Ref: b7d1193973 +Ref: PEP 445 Customization of CPython Memory Allocators-Footnote-11194368 +Ref: PEP 445 Customization of CPython Memory Allocators-Footnote-21194410 +Node: PEP 442 Safe Object Finalization1194452 +Ref: whatsnew/3 4 pep-442-safe-object-finalization1194668 +Ref: c9f1194668 +Ref: whatsnew/3 4 whatsnew-pep-4421194668 +Ref: b7c1194668 +Ref: PEP 442 Safe Object Finalization-Footnote-11195529 +Ref: PEP 442 Safe Object Finalization-Footnote-21195571 +Node: PEP 456 Secure and Interchangeable Hash Algorithm1195613 +Ref: whatsnew/3 4 pep-456-secure-and-interchangeable-hash-algorithm1195802 +Ref: ca01195802 +Ref: whatsnew/3 4 whatsnew-pep-4561195802 +Ref: b761195802 +Ref: PEP 456 Secure and Interchangeable Hash Algorithm-Footnote-11196748 +Ref: PEP 456 Secure and Interchangeable Hash Algorithm-Footnote-21196790 +Node: PEP 436 Argument Clinic1196855 +Ref: whatsnew/3 4 pep-436-argument-clinic1197041 +Ref: ca21197041 +Ref: whatsnew/3 4 whatsnew-pep-4361197041 +Ref: b7e1197041 +Ref: PEP 436 Argument Clinic-Footnote-11198147 +Ref: PEP 436 Argument Clinic-Footnote-21198189 +Node: Other Build and C API Changes1198231 +Ref: whatsnew/3 4 other-build-and-c-api-changes1198389 +Ref: ca31198389 +Ref: Other Build and C API Changes-Footnote-11200473 +Ref: Other Build and C API Changes-Footnote-21200538 +Ref: Other Build and C API Changes-Footnote-31200603 +Ref: Other Build and C API Changes-Footnote-41200670 +Ref: Other Build and C API Changes-Footnote-51200734 +Ref: Other Build and C API Changes-Footnote-61200799 +Ref: Other Build and C API Changes-Footnote-71200872 +Ref: Other Build and C API Changes-Footnote-81200936 +Ref: Other Build and C API Changes-Footnote-91201001 +Node: Other Improvements<2>1201066 +Ref: whatsnew/3 4 other-improvements1201226 +Ref: ca71201226 +Ref: whatsnew/3 4 other-improvements-3-41201226 +Ref: ca81201226 +Ref: whatsnew/3 4 whatsnew-isolated-mode1201281 +Ref: b671201281 +Ref: Other Improvements<2>-Footnote-11205406 +Ref: Other Improvements<2>-Footnote-21205471 +Ref: Other Improvements<2>-Footnote-31205535 +Ref: Other Improvements<2>-Footnote-41205600 +Ref: Other Improvements<2>-Footnote-51205665 +Ref: Other Improvements<2>-Footnote-61205730 +Ref: Other Improvements<2>-Footnote-71205795 +Ref: Other Improvements<2>-Footnote-81205890 +Ref: Other Improvements<2>-Footnote-91205944 +Ref: Other Improvements<2>-Footnote-101206009 +Ref: Other Improvements<2>-Footnote-111206075 +Ref: Other Improvements<2>-Footnote-121206141 +Ref: Other Improvements<2>-Footnote-131206184 +Ref: Other Improvements<2>-Footnote-141206250 +Ref: Other Improvements<2>-Footnote-151206316 +Ref: Other Improvements<2>-Footnote-161206382 +Ref: Other Improvements<2>-Footnote-171206448 +Ref: Other Improvements<2>-Footnote-181206491 +Ref: Other Improvements<2>-Footnote-191206557 +Ref: Other Improvements<2>-Footnote-201206623 +Ref: Other Improvements<2>-Footnote-211206689 +Node: Significant Optimizations1206755 +Ref: whatsnew/3 4 significant-optimizations1206877 +Ref: cae1206877 +Ref: Significant Optimizations-Footnote-11209680 +Ref: Significant Optimizations-Footnote-21209745 +Ref: Significant Optimizations-Footnote-31209810 +Ref: Significant Optimizations-Footnote-41209875 +Ref: Significant Optimizations-Footnote-51209940 +Ref: Significant Optimizations-Footnote-61210005 +Ref: Significant Optimizations-Footnote-71210070 +Ref: Significant Optimizations-Footnote-81210134 +Ref: Significant Optimizations-Footnote-91210199 +Ref: Significant Optimizations-Footnote-101210264 +Ref: Significant Optimizations-Footnote-111210330 +Ref: Significant Optimizations-Footnote-121210396 +Ref: Significant Optimizations-Footnote-131210462 +Node: Deprecated<9>1210528 +Ref: whatsnew/3 4 deprecated1210662 +Ref: cb21210662 +Ref: whatsnew/3 4 deprecated-3-41210662 +Ref: b971210662 +Node: Deprecations in the Python API1211102 +Ref: whatsnew/3 4 deprecations-in-the-python-api1211210 +Ref: cb31211210 +Node: Deprecated Features1214935 +Ref: whatsnew/3 4 deprecated-features1215043 +Ref: cbe1215043 +Ref: Deprecated Features-Footnote-11215426 +Ref: Deprecated Features-Footnote-21215491 +Node: Removed<9>1215556 +Ref: whatsnew/3 4 removed1215681 +Ref: cc01215681 +Node: Operating Systems No Longer Supported1215837 +Ref: whatsnew/3 4 operating-systems-no-longer-supported1215957 +Ref: cc11215957 +Ref: Operating Systems No Longer Supported-Footnote-11216370 +Ref: Operating Systems No Longer Supported-Footnote-21216435 +Ref: Operating Systems No Longer Supported-Footnote-31216500 +Node: API and Feature Removals<5>1216565 +Ref: whatsnew/3 4 api-and-feature-removals1216707 +Ref: cc21216707 +Ref: API and Feature Removals<5>-Footnote-11219161 +Ref: API and Feature Removals<5>-Footnote-21219197 +Ref: API and Feature Removals<5>-Footnote-31219262 +Ref: API and Feature Removals<5>-Footnote-41219327 +Ref: API and Feature Removals<5>-Footnote-51219392 +Ref: API and Feature Removals<5>-Footnote-61219457 +Ref: API and Feature Removals<5>-Footnote-71219521 +Node: Code Cleanups1219586 +Ref: whatsnew/3 4 code-cleanups1219682 +Ref: cc41219682 +Ref: Code Cleanups-Footnote-11220344 +Node: Porting to Python 3 41220409 +Ref: whatsnew/3 4 porting-to-python-3-41220537 +Ref: cc51220537 +Node: Changes in ‘python’ Command Behavior<2>1220908 +Ref: whatsnew/3 4 changes-in-python-command-behavior1221046 +Ref: cc61221046 +Ref: Changes in ‘python’ Command Behavior<2>-Footnote-11222157 +Node: Changes in the Python API<7>1222222 +Ref: whatsnew/3 4 changes-in-the-python-api1222392 +Ref: cc81222392 +Ref: Changes in the Python API<7>-Footnote-11235774 +Ref: Changes in the Python API<7>-Footnote-21235839 +Ref: Changes in the Python API<7>-Footnote-31235904 +Ref: Changes in the Python API<7>-Footnote-41235969 +Ref: Changes in the Python API<7>-Footnote-51236034 +Ref: Changes in the Python API<7>-Footnote-61236099 +Ref: Changes in the Python API<7>-Footnote-71236164 +Ref: Changes in the Python API<7>-Footnote-81236229 +Ref: Changes in the Python API<7>-Footnote-91236293 +Ref: Changes in the Python API<7>-Footnote-101236358 +Ref: Changes in the Python API<7>-Footnote-111236424 +Ref: Changes in the Python API<7>-Footnote-121236490 +Ref: Changes in the Python API<7>-Footnote-131236556 +Ref: Changes in the Python API<7>-Footnote-141236622 +Ref: Changes in the Python API<7>-Footnote-151236688 +Ref: Changes in the Python API<7>-Footnote-161236754 +Ref: Changes in the Python API<7>-Footnote-171236820 +Ref: Changes in the Python API<7>-Footnote-181236886 +Ref: Changes in the Python API<7>-Footnote-191236952 +Ref: Changes in the Python API<7>-Footnote-201237018 +Ref: Changes in the Python API<7>-Footnote-211237084 +Ref: Changes in the Python API<7>-Footnote-221237150 +Ref: Changes in the Python API<7>-Footnote-231237216 +Ref: Changes in the Python API<7>-Footnote-241237281 +Node: Changes in the C API<7>1237347 +Ref: whatsnew/3 4 changes-in-the-c-api1237465 +Ref: cd91237465 +Ref: Changes in the C API<7>-Footnote-11239225 +Ref: Changes in the C API<7>-Footnote-21239290 +Node: Changed in 3 4 31239355 +Ref: whatsnew/3 4 changed-in-3-4-31239464 +Ref: ce31239464 +Node: PEP 476 Enabling certificate verification by default for stdlib http clients1239680 +Ref: whatsnew/3 4 pep-4761239809 +Ref: ce41239809 +Ref: whatsnew/3 4 pep-476-enabling-certificate-verification-by-default-for-stdlib-http-clients1239809 +Ref: ce51239809 +Node: What’s New In Python 3 31240808 +Ref: whatsnew/3 3 doc1240963 +Ref: ce61240963 +Ref: whatsnew/3 3 what-s-new-in-python-3-31240963 +Ref: ce71240963 +Ref: What’s New In Python 3 3-Footnote-11242904 +Ref: What’s New In Python 3 3-Footnote-21242964 +Node: Summary – Release highlights<7>1243006 +Ref: whatsnew/3 3 summary-release-highlights1243139 +Ref: ce81243139 +Node: PEP 405 Virtual Environments1244468 +Ref: whatsnew/3 3 pep-4051244645 +Ref: cea1244645 +Ref: whatsnew/3 3 pep-405-virtual-environments1244645 +Ref: cf21244645 +Ref: PEP 405 Virtual Environments-Footnote-11245633 +Node: PEP 420 Implicit Namespace Packages1245675 +Ref: whatsnew/3 3 pep-420-implicit-namespace-packages1245891 +Ref: cf31245891 +Ref: PEP 420 Implicit Namespace Packages-Footnote-11246402 +Ref: PEP 420 Implicit Namespace Packages-Footnote-21246444 +Node: PEP 3118 New memoryview implementation and buffer protocol documentation1246486 +Ref: whatsnew/3 3 pep-3118-new-memoryview-implementation-and-buffer-protocol-documentation1246712 +Ref: cf41246712 +Ref: whatsnew/3 3 pep-3118-update1246712 +Ref: cf51246712 +Ref: PEP 3118 New memoryview implementation and buffer protocol documentation-Footnote-11247842 +Node: Features1247884 +Ref: whatsnew/3 3 features1248021 +Ref: cf61248021 +Ref: Features-Footnote-11248821 +Node: API changes1248886 +Ref: whatsnew/3 3 api-changes1249023 +Ref: cf71249023 +Ref: API changes-Footnote-11250038 +Ref: API changes-Footnote-21250103 +Node: PEP 393 Flexible String Representation1250145 +Ref: whatsnew/3 3 pep-3931250371 +Ref: ced1250371 +Ref: whatsnew/3 3 pep-393-flexible-string-representation1250371 +Ref: cfa1250371 +Ref: PEP 393 Flexible String Representation-Footnote-11251430 +Node: Functionality1251472 +Ref: whatsnew/3 3 functionality1251599 +Ref: cfb1251599 +Ref: Functionality-Footnote-11253046 +Ref: Functionality-Footnote-21253088 +Node: Performance and resource usage1253153 +Ref: whatsnew/3 3 performance-and-resource-usage1253280 +Ref: cfd1253280 +Ref: Performance and resource usage-Footnote-11254511 +Node: PEP 397 Python Launcher for Windows1254553 +Ref: whatsnew/3 3 pep-3971254759 +Ref: cfe1254759 +Ref: whatsnew/3 3 pep-397-python-launcher-for-windows1254759 +Ref: cff1254759 +Ref: PEP 397 Python Launcher for Windows-Footnote-11256301 +Ref: PEP 397 Python Launcher for Windows-Footnote-21256365 +Node: PEP 3151 Reworking the OS and IO exception hierarchy1256407 +Ref: whatsnew/3 3 pep-31511256622 +Ref: ceb1256622 +Ref: whatsnew/3 3 pep-3151-reworking-the-os-and-io-exception-hierarchy1256622 +Ref: d011256622 +Ref: PEP 3151 Reworking the OS and IO exception hierarchy-Footnote-11259191 +Node: PEP 380 Syntax for Delegating to a Subgenerator1259233 +Ref: whatsnew/3 3 pep-3801259450 +Ref: ce91259450 +Ref: whatsnew/3 3 pep-380-syntax-for-delegating-to-a-subgenerator1259450 +Ref: d101259450 +Ref: PEP 380 Syntax for Delegating to a Subgenerator-Footnote-11261893 +Node: PEP 409 Suppressing exception context1261935 +Ref: whatsnew/3 3 pep-409-suppressing-exception-context1262133 +Ref: d121262133 +Ref: PEP 409 Suppressing exception context-Footnote-11264221 +Node: PEP 414 Explicit Unicode literals1264263 +Ref: whatsnew/3 3 pep-414-explicit-unicode-literals1264463 +Ref: d131264463 +Ref: PEP 414 Explicit Unicode literals-Footnote-11265176 +Node: PEP 3155 Qualified name for classes and functions1265218 +Ref: whatsnew/3 3 pep-3155-qualified-name-for-classes-and-functions1265411 +Ref: d141265411 +Ref: PEP 3155 Qualified name for classes and functions-Footnote-11267003 +Node: PEP 412 Key-Sharing Dictionary1267045 +Ref: whatsnew/3 3 pep-4121267238 +Ref: cee1267238 +Ref: whatsnew/3 3 pep-412-key-sharing-dictionary1267238 +Ref: d151267238 +Ref: PEP 412 Key-Sharing Dictionary-Footnote-11267757 +Node: PEP 362 Function Signature Object1267799 +Ref: whatsnew/3 3 pep-362-function-signature-object1267976 +Ref: d161267976 +Ref: PEP 362 Function Signature Object-Footnote-11268870 +Node: PEP 421 Adding sys implementation1268912 +Ref: whatsnew/3 3 pep-421-adding-sys-implementation1269106 +Ref: d181269106 +Ref: PEP 421 Adding sys implementation-Footnote-11270320 +Node: SimpleNamespace1270362 +Ref: whatsnew/3 3 simplenamespace1270447 +Ref: d1a1270447 +Ref: SimpleNamespace-Footnote-11271065 +Node: Using importlib as the Implementation of Import1271107 +Ref: whatsnew/3 3 importlib1271293 +Ref: cec1271293 +Ref: whatsnew/3 3 using-importlib-as-the-implementation-of-import1271293 +Ref: d1b1271293 +Ref: Using importlib as the Implementation of Import-Footnote-11272574 +Ref: Using importlib as the Implementation of Import-Footnote-21272638 +Ref: Using importlib as the Implementation of Import-Footnote-31272703 +Ref: Using importlib as the Implementation of Import-Footnote-41272768 +Ref: Using importlib as the Implementation of Import-Footnote-51272833 +Node: New APIs1272875 +Ref: whatsnew/3 3 new-apis1272991 +Ref: d1e1272991 +Node: Visible Changes1274833 +Ref: whatsnew/3 3 visible-changes1274949 +Ref: d251274949 +Ref: Visible Changes-Footnote-11276803 +Ref: Visible Changes-Footnote-21276845 +Node: Other Language Changes<9>1276887 +Ref: whatsnew/3 3 other-language-changes1277067 +Ref: d271277067 +Ref: Other Language Changes<9>-Footnote-11279027 +Ref: Other Language Changes<9>-Footnote-21279092 +Ref: Other Language Changes<9>-Footnote-31279157 +Ref: Other Language Changes<9>-Footnote-41279222 +Ref: Other Language Changes<9>-Footnote-51279287 +Ref: Other Language Changes<9>-Footnote-61279352 +Ref: Other Language Changes<9>-Footnote-71279417 +Ref: Other Language Changes<9>-Footnote-81279482 +Node: A Finer-Grained Import Lock1279547 +Ref: whatsnew/3 3 a-finer-grained-import-lock1279707 +Ref: d2a1279707 +Ref: A Finer-Grained Import Lock-Footnote-11280450 +Node: Builtin functions and types1280514 +Ref: whatsnew/3 3 builtin-functions-and-types1280663 +Ref: d2c1280663 +Ref: Builtin functions and types-Footnote-11281896 +Node: New Modules<9>1281960 +Ref: whatsnew/3 3 new-modules1282101 +Ref: d2f1282101 +Node: faulthandler<4>1282227 +Ref: whatsnew/3 3 faulthandler1282314 +Ref: d301282314 +Node: ipaddress<5>1283239 +Ref: whatsnew/3 3 ipaddress1283342 +Ref: d321283342 +Ref: ipaddress<5>-Footnote-11283686 +Node: lzma<2>1283728 +Ref: whatsnew/3 3 lzma1283807 +Ref: d331283807 +Ref: lzma<2>-Footnote-11284119 +Node: Improved Modules<9>1284183 +Ref: whatsnew/3 3 improved-modules1284313 +Ref: d341284313 +Node: abc<2>1285614 +Ref: whatsnew/3 3 abc1285693 +Ref: d351285693 +Ref: abc<2>-Footnote-11286725 +Ref: abc<2>-Footnote-21286790 +Node: array<3>1286855 +Ref: whatsnew/3 3 array1286952 +Ref: d3b1286952 +Ref: array<3>-Footnote-11287184 +Node: base64<3>1287251 +Ref: whatsnew/3 3 base641287353 +Ref: d3c1287353 +Ref: base64<3>-Footnote-11287651 +Node: binascii<3>1287716 +Ref: whatsnew/3 3 binascii1287816 +Ref: d3d1287816 +Ref: binascii<3>-Footnote-11288070 +Node: bz2<2>1288135 +Ref: whatsnew/3 3 bz21288235 +Ref: d3e1288235 +Ref: bz2<2>-Footnote-11289206 +Ref: bz2<2>-Footnote-21289270 +Node: codecs<2>1289334 +Ref: whatsnew/3 3 codecs1289437 +Ref: d411289437 +Ref: codecs<2>-Footnote-11290757 +Ref: codecs<2>-Footnote-21290822 +Ref: codecs<2>-Footnote-31290887 +Node: collections<7>1290952 +Ref: whatsnew/3 3 collections1291062 +Ref: d421291062 +Ref: collections<7>-Footnote-11291827 +Ref: collections<7>-Footnote-21291892 +Ref: collections<7>-Footnote-31291957 +Ref: collections<7>-Footnote-41292022 +Node: contextlib<7>1292087 +Ref: whatsnew/3 3 contextlib1292196 +Ref: d441292196 +Ref: contextlib<7>-Footnote-11292790 +Node: crypt<2>1292855 +Ref: whatsnew/3 3 crypt1292959 +Ref: d451292959 +Ref: crypt<2>-Footnote-11293172 +Node: curses<5>1293237 +Ref: whatsnew/3 3 curses1293339 +Ref: d461293339 +Ref: curses<5>-Footnote-11294197 +Node: datetime<6>1294261 +Ref: whatsnew/3 3 datetime1294365 +Ref: d4a1294365 +Ref: datetime<6>-Footnote-11295083 +Node: decimal<3>1295148 +Ref: whatsnew/3 3 decimal1295251 +Ref: d4c1295251 +Ref: whatsnew/3 3 new-decimal1295251 +Ref: cef1295251 +Ref: decimal<3>-Footnote-11296955 +Node: Features<2>1297019 +Ref: whatsnew/3 3 id11297100 +Ref: d4d1297100 +Node: API changes<2>1297472 +Ref: whatsnew/3 3 id21297553 +Ref: d501297553 +Node: email<4>1300331 +Ref: whatsnew/3 3 email1300432 +Ref: d5b1300432 +Ref: whatsnew/3 3 new-email1300432 +Ref: cf01300432 +Node: Policy Framework1300561 +Ref: whatsnew/3 3 policy-framework1300669 +Ref: d5c1300669 +Node: Provisional Policy with New Header API1303677 +Ref: whatsnew/3 3 provisional-policy-with-new-header-api1303811 +Ref: d601303811 +Node: Other API Changes1308447 +Ref: whatsnew/3 3 other-api-changes1308556 +Ref: d641308556 +Node: ftplib<2>1309447 +Ref: whatsnew/3 3 ftplib1309550 +Ref: d6b1309550 +Ref: ftplib<2>-Footnote-11310457 +Ref: ftplib<2>-Footnote-21310521 +Ref: ftplib<2>-Footnote-31310586 +Node: functools<6>1310651 +Ref: whatsnew/3 3 functools1310751 +Ref: d701310751 +Ref: functools<6>-Footnote-11311097 +Node: gc<6>1311162 +Ref: whatsnew/3 3 gc1311260 +Ref: d711311260 +Node: hmac<4>1311432 +Ref: whatsnew/3 3 hmac1311525 +Ref: d731311525 +Ref: hmac<4>-Footnote-11311789 +Node: http<4>1311854 +Ref: whatsnew/3 3 http1311949 +Ref: d751311949 +Ref: http<4>-Footnote-11312627 +Ref: http<4>-Footnote-21312691 +Ref: http<4>-Footnote-31312756 +Node: html<2>1312821 +Ref: whatsnew/3 3 html1312919 +Ref: d7c1312919 +Ref: html<2>-Footnote-11313917 +Ref: html<2>-Footnote-21313982 +Ref: html<2>-Footnote-31314047 +Ref: html<2>-Footnote-41314112 +Ref: html<2>-Footnote-51314177 +Ref: html<2>-Footnote-61314242 +Ref: html<2>-Footnote-71314309 +Ref: html<2>-Footnote-81314375 +Ref: html<2>-Footnote-91314440 +Ref: html<2>-Footnote-101314505 +Ref: html<2>-Footnote-111314573 +Ref: html<2>-Footnote-121314640 +Ref: html<2>-Footnote-131314706 +Ref: html<2>-Footnote-141314772 +Ref: html<2>-Footnote-151314837 +Ref: html<2>-Footnote-161314903 +Node: imaplib<3>1314969 +Ref: whatsnew/3 3 imaplib1315070 +Ref: d7e1315070 +Ref: imaplib<3>-Footnote-11315310 +Node: inspect<8>1315374 +Ref: whatsnew/3 3 inspect1315473 +Ref: d7f1315473 +Ref: inspect<8>-Footnote-11316183 +Ref: inspect<8>-Footnote-21316248 +Node: io<4>1316313 +Ref: whatsnew/3 3 io1316414 +Ref: d821316414 +Ref: io<4>-Footnote-11317061 +Node: itertools<4>1317126 +Ref: whatsnew/3 3 itertools1317227 +Ref: d831317227 +Node: logging<7>1317383 +Ref: whatsnew/3 3 logging1317486 +Ref: d841317486 +Node: math<7>1317937 +Ref: whatsnew/3 3 math1318035 +Ref: d851318035 +Ref: math<7>-Footnote-11318258 +Node: mmap<3>1318323 +Ref: whatsnew/3 3 mmap1318429 +Ref: d871318429 +Ref: mmap<3>-Footnote-11318764 +Node: multiprocessing<7>1318829 +Ref: whatsnew/3 3 multiprocessing1318938 +Ref: d891318938 +Ref: multiprocessing<7>-Footnote-11320088 +Ref: multiprocessing<7>-Footnote-21320153 +Ref: multiprocessing<7>-Footnote-31320217 +Ref: multiprocessing<7>-Footnote-41320281 +Node: nntplib<2>1320346 +Ref: whatsnew/3 3 nntplib1320454 +Ref: d911320454 +Ref: nntplib<2>-Footnote-11321017 +Node: os<10>1321081 +Ref: whatsnew/3 3 os1321177 +Ref: d921321177 +Ref: os<10>-Footnote-11328555 +Ref: os<10>-Footnote-21328620 +Ref: os<10>-Footnote-31328684 +Ref: os<10>-Footnote-41328749 +Ref: os<10>-Footnote-51328814 +Ref: os<10>-Footnote-61328879 +Ref: os<10>-Footnote-71328943 +Ref: os<10>-Footnote-81329008 +Ref: os<10>-Footnote-91329073 +Ref: os<10>-Footnote-101329138 +Ref: os<10>-Footnote-111329203 +Node: pdb<5>1329269 +Ref: whatsnew/3 3 pdb1329364 +Ref: dcb1329364 +Ref: pdb<5>-Footnote-11329645 +Node: pickle<5>1329710 +Ref: whatsnew/3 3 pickle1329807 +Ref: dcc1329807 +Ref: pickle<5>-Footnote-11330075 +Node: pydoc<5>1330140 +Ref: whatsnew/3 3 pydoc1330236 +Ref: dce1330236 +Node: re<7>1330433 +Ref: whatsnew/3 3 re1330525 +Ref: dcf1330525 +Ref: re<7>-Footnote-11330719 +Node: sched1330783 +Ref: whatsnew/3 3 sched1330876 +Ref: dd01330876 +Ref: sched-Footnote-11332008 +Ref: sched-Footnote-21332073 +Ref: sched-Footnote-31332137 +Ref: sched-Footnote-41332202 +Ref: sched-Footnote-51332267 +Node: select<2>1332332 +Ref: whatsnew/3 3 select1332428 +Ref: dd51332428 +Ref: select<2>-Footnote-11332691 +Node: shlex<3>1332755 +Ref: whatsnew/3 3 shlex1332855 +Ref: dd61332855 +Node: shutil<5>1333166 +Ref: whatsnew/3 3 shutil1333266 +Ref: dd81333266 +Ref: shutil<5>-Footnote-11335136 +Ref: shutil<5>-Footnote-21335201 +Ref: shutil<5>-Footnote-31335266 +Ref: shutil<5>-Footnote-41335331 +Ref: shutil<5>-Footnote-51335396 +Ref: shutil<5>-Footnote-61335461 +Ref: shutil<5>-Footnote-71335526 +Ref: shutil<5>-Footnote-81335590 +Node: signal<4>1335654 +Ref: whatsnew/3 3 signal1335754 +Ref: ddc1335754 +Ref: signal<4>-Footnote-11336819 +Node: smtpd<3>1336883 +Ref: whatsnew/3 3 smtpd1336984 +Ref: de31336984 +Ref: smtpd<3>-Footnote-11337470 +Ref: smtpd<3>-Footnote-21337529 +Ref: smtpd<3>-Footnote-31337588 +Node: smtplib<4>1337652 +Ref: whatsnew/3 3 smtplib1337754 +Ref: de41337754 +Ref: smtplib<4>-Footnote-11338505 +Ref: smtplib<4>-Footnote-21338570 +Ref: smtplib<4>-Footnote-31338635 +Node: socket<10>1338699 +Ref: whatsnew/3 3 socket1338808 +Ref: de61338808 +Ref: socket<10>-Footnote-11340050 +Ref: socket<10>-Footnote-21340114 +Ref: socket<10>-Footnote-31340179 +Ref: socket<10>-Footnote-41340244 +Node: socketserver<3>1340309 +Ref: whatsnew/3 3 socketserver1340418 +Ref: de91340418 +Ref: socketserver<3>-Footnote-11340791 +Node: sqlite3<7>1340856 +Ref: whatsnew/3 3 sqlite31340961 +Ref: ded1340961 +Ref: sqlite3<7>-Footnote-11341236 +Node: ssl<9>1341301 +Ref: whatsnew/3 3 ssl1341398 +Ref: def1341398 +Ref: ssl<9>-Footnote-11343615 +Ref: ssl<9>-Footnote-21343680 +Ref: ssl<9>-Footnote-31343745 +Ref: ssl<9>-Footnote-41343810 +Ref: ssl<9>-Footnote-51343875 +Ref: ssl<9>-Footnote-61343940 +Ref: ssl<9>-Footnote-71344005 +Ref: ssl<9>-Footnote-81344070 +Ref: ssl<9>-Footnote-91344135 +Ref: ssl<9>-Footnote-101344200 +Ref: ssl<9>-Footnote-111344266 +Node: stat<2>1344332 +Ref: whatsnew/3 3 stat1344428 +Ref: dfa1344428 +Ref: stat<2>-Footnote-11344723 +Node: struct<3>1344788 +Ref: whatsnew/3 3 struct1344891 +Ref: dfc1344891 +Ref: struct<3>-Footnote-11345138 +Node: subprocess<5>1345202 +Ref: whatsnew/3 3 subprocess1345305 +Ref: dfd1345305 +Ref: subprocess<5>-Footnote-11345640 +Ref: subprocess<5>-Footnote-21345704 +Node: sys<10>1345768 +Ref: whatsnew/3 3 sys1345872 +Ref: dff1345872 +Ref: sys<10>-Footnote-11346090 +Node: tarfile<4>1346155 +Ref: whatsnew/3 3 tarfile1346254 +Ref: e011346254 +Ref: tarfile<4>-Footnote-11346461 +Node: tempfile1346525 +Ref: whatsnew/3 3 tempfile1346628 +Ref: e021346628 +Ref: tempfile-Footnote-11346855 +Node: textwrap<2>1346919 +Ref: whatsnew/3 3 textwrap1347024 +Ref: e041347024 +Ref: textwrap<2>-Footnote-11347269 +Node: threading<7>1347334 +Ref: whatsnew/3 3 threading1347438 +Ref: e061347438 +Ref: threading<7>-Footnote-11348369 +Ref: threading<7>-Footnote-21348434 +Node: time<7>1348498 +Ref: whatsnew/3 3 time1348599 +Ref: e0d1348599 +Ref: time<7>-Footnote-11349566 +Ref: time<7>-Footnote-21349608 +Node: types<5>1349673 +Ref: whatsnew/3 3 types1349773 +Ref: e121349773 +Ref: types<5>-Footnote-11350109 +Ref: types<5>-Footnote-21350174 +Ref: types<5>-Footnote-31350216 +Node: unittest<7>1350281 +Ref: whatsnew/3 3 unittest1350383 +Ref: e151350383 +Ref: unittest<7>-Footnote-11350796 +Node: urllib<3>1350861 +Ref: whatsnew/3 3 urllib1350965 +Ref: e1c1350965 +Ref: urllib<3>-Footnote-11351317 +Node: webbrowser1351384 +Ref: whatsnew/3 3 webbrowser1351498 +Ref: e1e1351498 +Ref: webbrowser-Footnote-11352040 +Ref: webbrowser-Footnote-21352105 +Node: xml etree ElementTree1352170 +Ref: whatsnew/3 3 xml-etree-elementtree1352282 +Ref: e1f1352282 +Node: zlib<2>1352801 +Ref: whatsnew/3 3 zlib1352894 +Ref: e201352894 +Ref: zlib<2>-Footnote-11353366 +Ref: zlib<2>-Footnote-21353431 +Node: Optimizations<8>1353496 +Ref: whatsnew/3 3 optimizations1353638 +Ref: e231353638 +Ref: Optimizations<8>-Footnote-11354449 +Ref: Optimizations<8>-Footnote-21354491 +Ref: Optimizations<8>-Footnote-31354556 +Ref: Optimizations<8>-Footnote-41354621 +Node: Build and C API Changes<4>1354686 +Ref: whatsnew/3 3 build-and-c-api-changes1354823 +Ref: cf81354823 +Ref: Build and C API Changes<4>-Footnote-11356696 +Ref: Build and C API Changes<4>-Footnote-21356738 +Ref: Build and C API Changes<4>-Footnote-31356780 +Node: Deprecated<10>1356845 +Ref: whatsnew/3 3 deprecated1356987 +Ref: e3a1356987 +Node: Unsupported Operating Systems<2>1357324 +Ref: whatsnew/3 3 unsupported-operating-systems1357466 +Ref: e3b1357466 +Node: Deprecated Python modules functions and methods<4>1357820 +Ref: whatsnew/3 3 deprecated-python-modules-functions-and-methods1358017 +Ref: e3c1358017 +Ref: Deprecated Python modules functions and methods<4>-Footnote-11360355 +Ref: Deprecated Python modules functions and methods<4>-Footnote-21360419 +Ref: Deprecated Python modules functions and methods<4>-Footnote-31360461 +Ref: Deprecated Python modules functions and methods<4>-Footnote-41360526 +Ref: Deprecated Python modules functions and methods<4>-Footnote-51360591 +Node: Deprecated functions and types of the C API<3>1360656 +Ref: whatsnew/3 3 deprecated-functions-and-types-of-the-c-api1360840 +Ref: e401360840 +Ref: Deprecated functions and types of the C API<3>-Footnote-11363881 +Node: Deprecated features1363923 +Ref: whatsnew/3 3 deprecated-features1364048 +Ref: e4a1364048 +Node: Porting to Python 3 31364271 +Ref: whatsnew/3 3 porting-to-python-3-31364378 +Ref: e4b1364378 +Node: Porting Python code1364655 +Ref: whatsnew/3 3 porting-python-code1364755 +Ref: d1d1364755 +Ref: whatsnew/3 3 portingpythoncode1364755 +Ref: e4c1364755 +Ref: Porting Python code-Footnote-11371783 +Ref: Porting Python code-Footnote-21371848 +Ref: Porting Python code-Footnote-31371913 +Ref: Porting Python code-Footnote-41371978 +Ref: Porting Python code-Footnote-51372020 +Ref: Porting Python code-Footnote-61372062 +Ref: Porting Python code-Footnote-71372126 +Ref: Porting Python code-Footnote-81372193 +Ref: Porting Python code-Footnote-91372258 +Ref: Porting Python code-Footnote-101372322 +Node: Porting C code1372388 +Ref: whatsnew/3 3 porting-c-code1372518 +Ref: cf91372518 +Ref: Porting C code-Footnote-11374010 +Node: Building C extensions1374052 +Ref: whatsnew/3 3 building-c-extensions1374190 +Ref: e5a1374190 +Ref: Building C extensions-Footnote-11374788 +Node: Command Line Switch Changes1374853 +Ref: whatsnew/3 3 command-line-switch-changes1374968 +Ref: e5b1374968 +Ref: Command Line Switch Changes-Footnote-11375533 +Ref: Command Line Switch Changes-Footnote-21375598 +Node: What’s New In Python 3 21375663 +Ref: whatsnew/3 2 doc1375818 +Ref: e5d1375818 +Ref: whatsnew/3 2 what-s-new-in-python-3-21375818 +Ref: e5e1375818 +Ref: What’s New In Python 3 2-Footnote-11377216 +Ref: What’s New In Python 3 2-Footnote-21377315 +Node: PEP 384 Defining a Stable ABI1377357 +Ref: whatsnew/3 2 pep-384-defining-a-stable-abi1377502 +Ref: e5f1377502 +Ref: PEP 384 Defining a Stable ABI-Footnote-11378595 +Node: PEP 389 Argparse Command Line Parsing Module1378637 +Ref: whatsnew/3 2 pep-389-argparse-command-line-parsing-module1378841 +Ref: e601378841 +Ref: PEP 389 Argparse Command Line Parsing Module-Footnote-11382969 +Node: PEP 391 Dictionary Based Configuration for Logging1383011 +Ref: whatsnew/3 2 pep-391-dictionary-based-configuration-for-logging1383224 +Ref: e621383224 +Ref: PEP 391 Dictionary Based Configuration for Logging-Footnote-11385517 +Node: PEP 3148 The concurrent futures module1385559 +Ref: whatsnew/3 2 pep-3148-the-concurrent-futures-module1385763 +Ref: e641385763 +Ref: PEP 3148 The concurrent futures module-Footnote-11388463 +Node: PEP 3147 PYC Repository Directories1388505 +Ref: whatsnew/3 2 pep-3147-pyc-repository-directories1388695 +Ref: e681388695 +Ref: PEP 3147 PYC Repository Directories-Footnote-11391775 +Node: PEP 3149 ABI Version Tagged so Files1391817 +Ref: whatsnew/3 2 pep-3149-abi-version-tagged-so-files1392020 +Ref: e6b1392020 +Ref: PEP 3149 ABI Version Tagged so Files-Footnote-11393280 +Node: PEP 3333 Python Web Server Gateway Interface v1 0 11393322 +Ref: whatsnew/3 2 pep-3333-python-web-server-gateway-interface-v1-0-11393516 +Ref: e6c1393516 +Ref: PEP 3333 Python Web Server Gateway Interface v1 0 1-Footnote-11395880 +Ref: PEP 3333 Python Web Server Gateway Interface v1 0 1-Footnote-21395939 +Ref: PEP 3333 Python Web Server Gateway Interface v1 0 1-Footnote-31395998 +Node: Other Language Changes<10>1396040 +Ref: whatsnew/3 2 other-language-changes1396233 +Ref: e6f1396233 +Ref: Other Language Changes<10>-Footnote-11405716 +Ref: Other Language Changes<10>-Footnote-21405780 +Ref: Other Language Changes<10>-Footnote-31405844 +Ref: Other Language Changes<10>-Footnote-41405911 +Ref: Other Language Changes<10>-Footnote-51405975 +Ref: Other Language Changes<10>-Footnote-61406039 +Ref: Other Language Changes<10>-Footnote-71406103 +Ref: Other Language Changes<10>-Footnote-81406167 +Ref: Other Language Changes<10>-Footnote-91406231 +Ref: Other Language Changes<10>-Footnote-101406295 +Ref: Other Language Changes<10>-Footnote-111406361 +Ref: Other Language Changes<10>-Footnote-121406428 +Ref: Other Language Changes<10>-Footnote-131406493 +Ref: Other Language Changes<10>-Footnote-141406558 +Ref: Other Language Changes<10>-Footnote-151406624 +Ref: Other Language Changes<10>-Footnote-161406690 +Node: New Improved and Deprecated Modules1406755 +Ref: whatsnew/3 2 new-improved-and-deprecated-modules1406912 +Ref: e791406912 +Node: email<5>1408943 +Ref: whatsnew/3 2 email1409043 +Ref: e7a1409043 +Ref: email<5>-Footnote-11411019 +Ref: email<5>-Footnote-21411078 +Ref: email<5>-Footnote-31411142 +Node: elementtree1411207 +Ref: whatsnew/3 2 elementtree1411328 +Ref: e821411328 +Ref: elementtree-Footnote-11412808 +Ref: elementtree-Footnote-21412908 +Node: functools<7>1412972 +Ref: whatsnew/3 2 functools1413097 +Ref: e891413097 +Ref: functools<7>-Footnote-11416554 +Ref: functools<7>-Footnote-21416606 +Ref: functools<7>-Footnote-31416658 +Ref: functools<7>-Footnote-41416723 +Ref: functools<7>-Footnote-51416788 +Ref: functools<7>-Footnote-61416852 +Ref: functools<7>-Footnote-71416916 +Ref: functools<7>-Footnote-81416980 +Node: itertools<5>1417032 +Ref: whatsnew/3 2 itertools1417160 +Ref: e8b1417160 +Node: collections<8>1417852 +Ref: whatsnew/3 2 collections1417980 +Ref: e8d1417980 +Ref: collections<8>-Footnote-11420224 +Ref: collections<8>-Footnote-21420284 +Node: threading<8>1420331 +Ref: whatsnew/3 2 threading1420464 +Ref: e921420464 +Ref: threading<8>-Footnote-11423227 +Ref: threading<8>-Footnote-21423288 +Ref: threading<8>-Footnote-31423387 +Ref: threading<8>-Footnote-41423459 +Node: datetime and time1423523 +Ref: whatsnew/3 2 datetime-and-time1423649 +Ref: e961423649 +Ref: datetime and time-Footnote-11426439 +Ref: datetime and time-Footnote-21426506 +Ref: datetime and time-Footnote-31426570 +Ref: datetime and time-Footnote-41426634 +Ref: datetime and time-Footnote-51426698 +Ref: datetime and time-Footnote-61426765 +Ref: datetime and time-Footnote-71426829 +Node: math<8>1426894 +Ref: whatsnew/3 2 math1427014 +Ref: e9a1427014 +Ref: math<8>-Footnote-11428893 +Node: abc<3>1428946 +Ref: whatsnew/3 2 abc1429054 +Ref: e9f1429054 +Ref: abc<3>-Footnote-11429678 +Node: io<5>1429742 +Ref: whatsnew/3 2 io1429850 +Ref: ea01429850 +Ref: io<5>-Footnote-11431017 +Node: reprlib1431081 +Ref: whatsnew/3 2 reprlib1431193 +Ref: ea21431193 +Ref: reprlib-Footnote-11432165 +Ref: reprlib-Footnote-21432229 +Node: logging<8>1432293 +Ref: whatsnew/3 2 logging1432406 +Ref: ea41432406 +Node: csv<3>1434259 +Ref: whatsnew/3 2 csv1434378 +Ref: eab1434378 +Ref: csv<3>-Footnote-11435241 +Ref: csv<3>-Footnote-21435305 +Node: contextlib<8>1435372 +Ref: whatsnew/3 2 contextlib1435502 +Ref: eaf1435502 +Ref: contextlib<8>-Footnote-11437717 +Node: decimal and fractions1437781 +Ref: whatsnew/3 2 decimal-and-fractions1437908 +Ref: eb21437908 +Ref: decimal and fractions-Footnote-11440332 +Ref: decimal and fractions-Footnote-21440396 +Ref: decimal and fractions-Footnote-31440460 +Ref: decimal and fractions-Footnote-41440524 +Ref: decimal and fractions-Footnote-51440588 +Ref: decimal and fractions-Footnote-61440652 +Node: ftp1440716 +Ref: whatsnew/3 2 ftp1440835 +Ref: eb61440835 +Ref: ftp-Footnote-11442179 +Ref: ftp-Footnote-21442243 +Ref: ftp-Footnote-31442307 +Ref: ftp-Footnote-41442371 +Node: popen1442435 +Ref: whatsnew/3 2 popen1442542 +Ref: eb71442542 +Ref: popen-Footnote-11442849 +Ref: popen-Footnote-21442913 +Node: select<3>1442978 +Ref: whatsnew/3 2 select1443098 +Ref: eb81443098 +Ref: select<3>-Footnote-11443531 +Node: gzip and zipfile1443595 +Ref: whatsnew/3 2 gzip-and-zipfile1443720 +Ref: eba1443720 +Ref: gzip and zipfile-Footnote-11445277 +Ref: gzip and zipfile-Footnote-21445341 +Ref: gzip and zipfile-Footnote-31445405 +Ref: gzip and zipfile-Footnote-41445472 +Ref: gzip and zipfile-Footnote-51445536 +Ref: gzip and zipfile-Footnote-61445600 +Node: tarfile<5>1445664 +Ref: whatsnew/3 2 tarfile1445790 +Ref: ebe1445790 +Ref: tarfile<5>-Footnote-11447363 +Node: hashlib<6>1447427 +Ref: whatsnew/3 2 hashlib1447543 +Ref: ec11447543 +Ref: hashlib<6>-Footnote-11448300 +Node: ast<4>1448364 +Ref: whatsnew/3 2 ast1448476 +Ref: ec21448476 +Node: os<11>1449415 +Ref: whatsnew/3 2 os1449526 +Ref: ec31449526 +Node: shutil<6>1450297 +Ref: whatsnew/3 2 shutil1450412 +Ref: ec71450412 +Node: sqlite3<8>1452581 +Ref: whatsnew/3 2 sqlite31452697 +Ref: eca1452697 +Ref: sqlite3<8>-Footnote-11453348 +Node: html<3>1453412 +Ref: whatsnew/3 2 html1453529 +Ref: ecb1453529 +Node: socket<11>1453817 +Ref: whatsnew/3 2 socket1453931 +Ref: ecc1453931 +Ref: socket<11>-Footnote-11454575 +Ref: socket<11>-Footnote-21454639 +Node: ssl<10>1454703 +Ref: whatsnew/3 2 ssl1454814 +Ref: ece1454814 +Ref: ssl<10>-Footnote-11456918 +Ref: ssl<10>-Footnote-21456977 +Ref: ssl<10>-Footnote-31457061 +Ref: ssl<10>-Footnote-41457125 +Ref: ssl<10>-Footnote-51457189 +Ref: ssl<10>-Footnote-61457253 +Ref: ssl<10>-Footnote-71457317 +Ref: ssl<10>-Footnote-81457381 +Ref: ssl<10>-Footnote-91457445 +Node: nntp1457509 +Ref: whatsnew/3 2 nntp1457622 +Ref: ed21457622 +Ref: nntp-Footnote-11458194 +Ref: nntp-Footnote-21458258 +Node: certificates1458322 +Ref: whatsnew/3 2 certificates1458438 +Ref: ed41458438 +Ref: certificates-Footnote-11458835 +Node: imaplib<4>1458899 +Ref: whatsnew/3 2 imaplib1459025 +Ref: ed61459025 +Ref: imaplib<4>-Footnote-11459298 +Node: http client<4>1459362 +Ref: whatsnew/3 2 http-client1459487 +Ref: ed81459487 +Ref: http client<4>-Footnote-11460911 +Node: unittest<8>1460976 +Ref: whatsnew/3 2 unittest1461100 +Ref: edb1461100 +Ref: unittest<8>-Footnote-11465883 +Ref: unittest<8>-Footnote-21465948 +Ref: unittest<8>-Footnote-31466012 +Node: random<3>1466076 +Ref: whatsnew/3 2 random1466195 +Ref: ee71466195 +Ref: random<3>-Footnote-11466859 +Node: poplib<4>1466923 +Ref: whatsnew/3 2 poplib1467042 +Ref: eea1467042 +Ref: poplib<4>-Footnote-11467396 +Node: asyncore<2>1467460 +Ref: whatsnew/3 2 asyncore1467581 +Ref: eeb1467581 +Ref: asyncore<2>-Footnote-11468059 +Node: tempfile<2>1468123 +Ref: whatsnew/3 2 tempfile1468245 +Ref: ef01468245 +Ref: tempfile<2>-Footnote-11468653 +Node: inspect<9>1468717 +Ref: whatsnew/3 2 inspect1468836 +Ref: ef21468836 +Ref: inspect<9>-Footnote-11470196 +Node: pydoc<6>1470261 +Ref: whatsnew/3 2 pydoc1470375 +Ref: ef51470375 +Ref: pydoc<6>-Footnote-11470694 +Node: dis<3>1470758 +Ref: whatsnew/3 2 dis1470868 +Ref: ef61470868 +Ref: dis<3>-Footnote-11473018 +Node: dbm<6>1473082 +Ref: whatsnew/3 2 dbm1473193 +Ref: ef81473193 +Ref: dbm<6>-Footnote-11473382 +Node: ctypes<2>1473446 +Ref: whatsnew/3 2 ctypes1473558 +Ref: ef91473558 +Node: site<3>1473676 +Ref: whatsnew/3 2 site1473794 +Ref: efb1473794 +Ref: site<3>-Footnote-11475025 +Node: sysconfig<3>1475089 +Ref: whatsnew/3 2 sysconfig1475204 +Ref: eff1475204 +Node: pdb<6>1477435 +Ref: whatsnew/3 2 pdb1477558 +Ref: f031477558 +Node: configparser<2>1478458 +Ref: whatsnew/3 2 configparser1478584 +Ref: f041478584 +Node: urllib parse<4>1481450 +Ref: whatsnew/3 2 urllib-parse1481577 +Ref: f051481577 +Ref: urllib parse<4>-Footnote-11483587 +Ref: urllib parse<4>-Footnote-21483630 +Ref: urllib parse<4>-Footnote-31483689 +Ref: urllib parse<4>-Footnote-41483753 +Ref: urllib parse<4>-Footnote-51483817 +Node: mailbox1483881 +Ref: whatsnew/3 2 mailbox1484003 +Ref: f091484003 +Ref: mailbox-Footnote-11485577 +Node: turtledemo1485641 +Ref: whatsnew/3 2 turtledemo1485739 +Ref: f101485739 +Ref: turtledemo-Footnote-11486176 +Node: Multi-threading1486241 +Ref: whatsnew/3 2 multi-threading1486388 +Ref: f111486388 +Ref: Multi-threading-Footnote-11488027 +Ref: Multi-threading-Footnote-21488106 +Ref: Multi-threading-Footnote-31488170 +Ref: Multi-threading-Footnote-41488236 +Node: Optimizations<9>1488300 +Ref: whatsnew/3 2 optimizations1488419 +Ref: f131488419 +Ref: Optimizations<9>-Footnote-11491860 +Ref: Optimizations<9>-Footnote-21491924 +Ref: Optimizations<9>-Footnote-31491988 +Ref: Optimizations<9>-Footnote-41492052 +Ref: Optimizations<9>-Footnote-51492098 +Ref: Optimizations<9>-Footnote-61492162 +Ref: Optimizations<9>-Footnote-71492226 +Ref: Optimizations<9>-Footnote-81492291 +Ref: Optimizations<9>-Footnote-91492355 +Ref: Optimizations<9>-Footnote-101492419 +Ref: Optimizations<9>-Footnote-111492484 +Ref: Optimizations<9>-Footnote-121492549 +Ref: Optimizations<9>-Footnote-131492614 +Ref: Optimizations<9>-Footnote-141492682 +Ref: Optimizations<9>-Footnote-151492747 +Ref: Optimizations<9>-Footnote-161492813 +Node: Unicode1492878 +Ref: whatsnew/3 2 unicode1492988 +Ref: f151492988 +Ref: Unicode-Footnote-11493540 +Ref: Unicode-Footnote-21493591 +Ref: Unicode-Footnote-31493635 +Node: Codecs1493707 +Ref: whatsnew/3 2 codecs1493814 +Ref: f161493814 +Ref: Codecs-Footnote-11494744 +Node: Documentation1494811 +Ref: whatsnew/3 2 documentation1494915 +Ref: f171494915 +Ref: Documentation-Footnote-11496561 +Ref: Documentation-Footnote-21496630 +Ref: Documentation-Footnote-31496706 +Ref: Documentation-Footnote-41496770 +Node: IDLE1496834 +Ref: whatsnew/3 2 idle1496947 +Ref: f1b1496947 +Ref: IDLE-Footnote-11497333 +Ref: IDLE-Footnote-21497397 +Node: Code Repository1497461 +Ref: whatsnew/3 2 code-repository1497587 +Ref: f1c1497587 +Ref: Code Repository-Footnote-11498196 +Ref: Code Repository-Footnote-21498235 +Ref: Code Repository-Footnote-31498277 +Ref: Code Repository-Footnote-41498331 +Node: Build and C API Changes<5>1498375 +Ref: whatsnew/3 2 build-and-c-api-changes1498518 +Ref: f1d1498518 +Ref: Build and C API Changes<5>-Footnote-11502657 +Ref: Build and C API Changes<5>-Footnote-21502722 +Ref: Build and C API Changes<5>-Footnote-31502786 +Ref: Build and C API Changes<5>-Footnote-41502850 +Ref: Build and C API Changes<5>-Footnote-51502914 +Ref: Build and C API Changes<5>-Footnote-61502978 +Ref: Build and C API Changes<5>-Footnote-71503042 +Ref: Build and C API Changes<5>-Footnote-81503106 +Ref: Build and C API Changes<5>-Footnote-91503170 +Ref: Build and C API Changes<5>-Footnote-101503234 +Ref: Build and C API Changes<5>-Footnote-111503299 +Ref: Build and C API Changes<5>-Footnote-121503364 +Ref: Build and C API Changes<5>-Footnote-131503429 +Ref: Build and C API Changes<5>-Footnote-141503494 +Ref: Build and C API Changes<5>-Footnote-151503577 +Node: Porting to Python 3 21503634 +Ref: whatsnew/3 2 porting-to-python-3-21503753 +Ref: f251503753 +Ref: Porting to Python 3 2-Footnote-11510598 +Ref: Porting to Python 3 2-Footnote-21510662 +Ref: Porting to Python 3 2-Footnote-31510726 +Ref: Porting to Python 3 2-Footnote-41510771 +Ref: Porting to Python 3 2-Footnote-51510836 +Ref: Porting to Python 3 2-Footnote-61510901 +Ref: Porting to Python 3 2-Footnote-71510966 +Node: What’s New In Python 3 11511030 +Ref: whatsnew/3 1 doc1511185 +Ref: f351511185 +Ref: whatsnew/3 1 what-s-new-in-python-3-11511185 +Ref: f361511185 +Node: PEP 372 Ordered Dictionaries1511858 +Ref: whatsnew/3 1 pep-372-ordered-dictionaries1512006 +Ref: f371512006 +Ref: PEP 372 Ordered Dictionaries-Footnote-11513557 +Ref: PEP 372 Ordered Dictionaries-Footnote-21513585 +Node: PEP 378 Format Specifier for Thousands Separator1513627 +Ref: whatsnew/3 1 pep-378-format-specifier-for-thousands-separator1513810 +Ref: f381513810 +Ref: PEP 378 Format Specifier for Thousands Separator-Footnote-11515051 +Node: Other Language Changes<11>1515093 +Ref: whatsnew/3 1 other-language-changes1515286 +Ref: f391515286 +Ref: Other Language Changes<11>-Footnote-11520085 +Ref: Other Language Changes<11>-Footnote-21520152 +Ref: Other Language Changes<11>-Footnote-31520216 +Ref: Other Language Changes<11>-Footnote-41520280 +Ref: Other Language Changes<11>-Footnote-51520344 +Ref: Other Language Changes<11>-Footnote-61520389 +Ref: Other Language Changes<11>-Footnote-71520453 +Node: New Improved and Deprecated Modules<2>1520517 +Ref: whatsnew/3 1 new-improved-and-deprecated-modules1520679 +Ref: f3a1520679 +Ref: New Improved and Deprecated Modules<2>-Footnote-11529209 +Ref: New Improved and Deprecated Modules<2>-Footnote-21529276 +Ref: New Improved and Deprecated Modules<2>-Footnote-31529340 +Ref: New Improved and Deprecated Modules<2>-Footnote-41529404 +Ref: New Improved and Deprecated Modules<2>-Footnote-51529468 +Ref: New Improved and Deprecated Modules<2>-Footnote-61529532 +Ref: New Improved and Deprecated Modules<2>-Footnote-71529574 +Ref: New Improved and Deprecated Modules<2>-Footnote-81529638 +Ref: New Improved and Deprecated Modules<2>-Footnote-91529702 +Ref: New Improved and Deprecated Modules<2>-Footnote-101529766 +Ref: New Improved and Deprecated Modules<2>-Footnote-111529831 +Ref: New Improved and Deprecated Modules<2>-Footnote-121529896 +Ref: New Improved and Deprecated Modules<2>-Footnote-131529961 +Node: Optimizations<10>1530026 +Ref: whatsnew/3 1 optimizations1530169 +Ref: f3f1530169 +Ref: Optimizations<10>-Footnote-11532348 +Ref: Optimizations<10>-Footnote-21532390 +Ref: Optimizations<10>-Footnote-31532454 +Ref: Optimizations<10>-Footnote-41532518 +Ref: Optimizations<10>-Footnote-51532582 +Ref: Optimizations<10>-Footnote-61532607 +Ref: Optimizations<10>-Footnote-71532671 +Node: IDLE<2>1532735 +Ref: whatsnew/3 1 idle1532866 +Ref: f401532866 +Ref: IDLE<2>-Footnote-11533083 +Node: Build and C API Changes<6>1533147 +Ref: whatsnew/3 1 build-and-c-api-changes1533282 +Ref: f411533282 +Ref: Build and C API Changes<6>-Footnote-11535545 +Ref: Build and C API Changes<6>-Footnote-21535609 +Ref: Build and C API Changes<6>-Footnote-31535673 +Ref: Build and C API Changes<6>-Footnote-41535737 +Ref: Build and C API Changes<6>-Footnote-51535801 +Node: Porting to Python 3 11535865 +Ref: whatsnew/3 1 porting-to-python-3-11535984 +Ref: f451535984 +Node: What’s New In Python 3 01537116 +Ref: whatsnew/3 0 doc1537271 +Ref: f461537271 +Ref: whatsnew/3 0 what-s-new-in-python-3-01537271 +Ref: f471537271 +Node: Common Stumbling Blocks1539129 +Ref: whatsnew/3 0 common-stumbling-blocks1539250 +Ref: f481539250 +Node: Print Is A Function1539620 +Ref: whatsnew/3 0 print-is-a-function1539744 +Ref: f491539744 +Ref: Print Is A Function-Footnote-11541430 +Node: Views And Iterators Instead Of Lists1541472 +Ref: whatsnew/3 0 views-and-iterators-instead-of-lists1541625 +Ref: f4a1541625 +Node: Ordering Comparisons1543467 +Ref: whatsnew/3 0 ordering-comparisons1543609 +Ref: f4d1543609 +Node: Integers1545039 +Ref: whatsnew/3 0 integers1545185 +Ref: f4e1545185 +Ref: Integers-Footnote-11546409 +Ref: Integers-Footnote-21546451 +Node: Text Vs Data Instead Of Unicode Vs 8-bit1546493 +Ref: whatsnew/3 0 text-vs-data-instead-of-unicode-vs-8-bit1546610 +Ref: f4f1546610 +Ref: Text Vs Data Instead Of Unicode Vs 8-bit-Footnote-11553196 +Ref: Text Vs Data Instead Of Unicode Vs 8-bit-Footnote-21553238 +Ref: Text Vs Data Instead Of Unicode Vs 8-bit-Footnote-31553280 +Node: Overview Of Syntax Changes1553322 +Ref: whatsnew/3 0 overview-of-syntax-changes1553489 +Ref: f541553489 +Node: New Syntax1553701 +Ref: whatsnew/3 0 new-syntax1553797 +Ref: f551553797 +Ref: New Syntax-Footnote-11556345 +Ref: New Syntax-Footnote-21556387 +Ref: New Syntax-Footnote-31556429 +Ref: New Syntax-Footnote-41556471 +Ref: New Syntax-Footnote-51556513 +Node: Changed Syntax1556555 +Ref: whatsnew/3 0 changed-syntax1556674 +Ref: f581556674 +Ref: Changed Syntax-Footnote-11558353 +Ref: Changed Syntax-Footnote-21558395 +Ref: Changed Syntax-Footnote-31558437 +Ref: Changed Syntax-Footnote-41558479 +Node: Removed Syntax1558521 +Ref: whatsnew/3 0 removed-syntax1558621 +Ref: f591558621 +Ref: Removed Syntax-Footnote-11559804 +Ref: Removed Syntax-Footnote-21559846 +Node: Changes Already Present In Python 2 61559888 +Ref: whatsnew/3 0 changes-already-present-in-python-2-61560047 +Ref: f5b1560047 +Node: Library Changes1563886 +Ref: whatsnew/3 0 library-changes1564063 +Ref: f6e1564063 +Ref: Library Changes-Footnote-11570292 +Ref: Library Changes-Footnote-21570334 +Ref: Library Changes-Footnote-31570376 +Ref: Library Changes-Footnote-41570418 +Ref: Library Changes-Footnote-51570460 +Ref: Library Changes-Footnote-61570502 +Node: PEP 3101 A New Approach To String Formatting1570544 +Ref: whatsnew/3 0 pep-3101-a-new-approach-to-string-formatting1570705 +Ref: f721570705 +Ref: PEP 3101 A New Approach To String Formatting-Footnote-11571097 +Node: Changes To Exceptions1571139 +Ref: whatsnew/3 0 changes-to-exceptions1571312 +Ref: f731571312 +Ref: Changes To Exceptions-Footnote-11574803 +Ref: Changes To Exceptions-Footnote-21574845 +Ref: Changes To Exceptions-Footnote-31574887 +Ref: Changes To Exceptions-Footnote-41574929 +Ref: Changes To Exceptions-Footnote-51574971 +Node: Miscellaneous Other Changes1575013 +Ref: whatsnew/3 0 miscellaneous-other-changes1575168 +Ref: f741575168 +Node: Operators And Special Methods1575296 +Ref: whatsnew/3 0 operators-and-special-methods1575406 +Ref: f751575406 +Ref: Operators And Special Methods-Footnote-11577026 +Node: Builtins1577068 +Ref: whatsnew/3 0 builtins1577178 +Ref: f7a1577178 +Ref: Builtins-Footnote-11579651 +Ref: Builtins-Footnote-21579693 +Node: Build and C API Changes<7>1579735 +Ref: whatsnew/3 0 build-and-c-api-changes1579880 +Ref: f821579880 +Ref: Build and C API Changes<7>-Footnote-11580915 +Ref: Build and C API Changes<7>-Footnote-21580957 +Ref: Build and C API Changes<7>-Footnote-31580999 +Node: Performance1581041 +Ref: whatsnew/3 0 performance1581180 +Ref: f841581180 +Node: Porting To Python 3 01581501 +Ref: whatsnew/3 0 porting-to-python-3-01581605 +Ref: f851581605 +Node: What’s New in Python 2 71583210 +Ref: whatsnew/2 7 doc1583365 +Ref: f881583365 +Ref: whatsnew/2 7 what-s-new-in-python-2-71583365 +Ref: f891583365 +Node: The Future for Python 2 x1585829 +Ref: whatsnew/2 7 the-future-for-python-2-x1585973 +Ref: f8a1585973 +Ref: whatsnew/2 7 whatsnew27-python311585973 +Ref: f8b1585973 +Ref: The Future for Python 2 x-Footnote-11589320 +Ref: The Future for Python 2 x-Footnote-21589362 +Node: Changes to the Handling of Deprecation Warnings1589399 +Ref: whatsnew/2 7 changes-to-the-handling-of-deprecation-warnings1589571 +Ref: f8e1589571 +Ref: Changes to the Handling of Deprecation Warnings-Footnote-11591146 +Node: Python 3 1 Features1591210 +Ref: whatsnew/2 7 python-3-1-features1591408 +Ref: f8f1591408 +Node: PEP 372 Adding an Ordered Dictionary to collections1593327 +Ref: whatsnew/2 7 pep-03721593529 +Ref: f901593529 +Ref: whatsnew/2 7 pep-372-adding-an-ordered-dictionary-to-collections1593529 +Ref: f931593529 +Ref: PEP 372 Adding an Ordered Dictionary to collections-Footnote-11597133 +Ref: PEP 372 Adding an Ordered Dictionary to collections-Footnote-21597161 +Node: PEP 378 Format Specifier for Thousands Separator<2>1597203 +Ref: whatsnew/2 7 pep-03781597439 +Ref: f911597439 +Ref: whatsnew/2 7 pep-378-format-specifier-for-thousands-separator1597439 +Ref: f951597439 +Ref: PEP 378 Format Specifier for Thousands Separator<2>-Footnote-11598956 +Node: PEP 389 The argparse Module for Parsing Command Lines1598998 +Ref: whatsnew/2 7 pep-389-the-argparse-module-for-parsing-command-lines1599233 +Ref: f961599233 +Ref: PEP 389 The argparse Module for Parsing Command Lines-Footnote-11603257 +Node: PEP 391 Dictionary-Based Configuration For Logging1603299 +Ref: whatsnew/2 7 pep-391-dictionary-based-configuration-for-logging1603508 +Ref: f971603508 +Ref: PEP 391 Dictionary-Based Configuration For Logging-Footnote-11607376 +Node: PEP 3106 Dictionary Views1607418 +Ref: whatsnew/2 7 pep-3106-dictionary-views1607604 +Ref: f9d1607604 +Ref: PEP 3106 Dictionary Views-Footnote-11609721 +Ref: PEP 3106 Dictionary Views-Footnote-21609763 +Node: PEP 3137 The memoryview Object1609827 +Ref: whatsnew/2 7 pep-3137-the-memoryview-object1609989 +Ref: f9e1609989 +Ref: PEP 3137 The memoryview Object-Footnote-11611654 +Ref: PEP 3137 The memoryview Object-Footnote-21611696 +Node: Other Language Changes<12>1611760 +Ref: whatsnew/2 7 other-language-changes1611921 +Ref: f9f1611921 +Ref: Other Language Changes<12>-Footnote-11621873 +Ref: Other Language Changes<12>-Footnote-21621937 +Ref: Other Language Changes<12>-Footnote-31622001 +Ref: Other Language Changes<12>-Footnote-41622065 +Ref: Other Language Changes<12>-Footnote-51622129 +Ref: Other Language Changes<12>-Footnote-61622193 +Ref: Other Language Changes<12>-Footnote-71622257 +Ref: Other Language Changes<12>-Footnote-81622321 +Ref: Other Language Changes<12>-Footnote-91622385 +Ref: Other Language Changes<12>-Footnote-101622449 +Ref: Other Language Changes<12>-Footnote-111622514 +Ref: Other Language Changes<12>-Footnote-121622579 +Ref: Other Language Changes<12>-Footnote-131622644 +Ref: Other Language Changes<12>-Footnote-141622709 +Ref: Other Language Changes<12>-Footnote-151622777 +Ref: Other Language Changes<12>-Footnote-161622842 +Ref: Other Language Changes<12>-Footnote-171622907 +Ref: Other Language Changes<12>-Footnote-181622972 +Ref: Other Language Changes<12>-Footnote-191623040 +Ref: Other Language Changes<12>-Footnote-201623105 +Ref: Other Language Changes<12>-Footnote-211623170 +Ref: Other Language Changes<12>-Footnote-221623235 +Ref: Other Language Changes<12>-Footnote-231623300 +Ref: Other Language Changes<12>-Footnote-241623365 +Node: Interpreter Changes1623430 +Ref: whatsnew/2 7 interpreter-changes1623538 +Ref: fa21623538 +Ref: whatsnew/2 7 new-27-interpreter1623538 +Ref: fa31623538 +Ref: Interpreter Changes-Footnote-11624192 +Node: Optimizations<11>1624256 +Ref: whatsnew/2 7 optimizations1624364 +Ref: fa41624364 +Ref: Optimizations<11>-Footnote-11629238 +Ref: Optimizations<11>-Footnote-21629302 +Ref: Optimizations<11>-Footnote-31629366 +Ref: Optimizations<11>-Footnote-41629430 +Ref: Optimizations<11>-Footnote-51629494 +Ref: Optimizations<11>-Footnote-61629558 +Ref: Optimizations<11>-Footnote-71629625 +Ref: Optimizations<11>-Footnote-81629689 +Ref: Optimizations<11>-Footnote-91629753 +Ref: Optimizations<11>-Footnote-101629817 +Ref: Optimizations<11>-Footnote-111629882 +Ref: Optimizations<11>-Footnote-121629947 +Ref: Optimizations<11>-Footnote-131630012 +Node: New and Improved Modules1630077 +Ref: whatsnew/2 7 new-and-improved-modules1630234 +Ref: fa51630234 +Ref: New and Improved Modules-Footnote-11665370 +Ref: New and Improved Modules-Footnote-21665434 +Ref: New and Improved Modules-Footnote-31665498 +Ref: New and Improved Modules-Footnote-41665551 +Ref: New and Improved Modules-Footnote-51665615 +Ref: New and Improved Modules-Footnote-61665679 +Ref: New and Improved Modules-Footnote-71665746 +Ref: New and Improved Modules-Footnote-81665810 +Ref: New and Improved Modules-Footnote-91665874 +Ref: New and Improved Modules-Footnote-101665938 +Ref: New and Improved Modules-Footnote-111666003 +Ref: New and Improved Modules-Footnote-121666068 +Ref: New and Improved Modules-Footnote-131666133 +Ref: New and Improved Modules-Footnote-141666173 +Ref: New and Improved Modules-Footnote-151666238 +Ref: New and Improved Modules-Footnote-161666303 +Ref: New and Improved Modules-Footnote-171666368 +Ref: New and Improved Modules-Footnote-181666433 +Ref: New and Improved Modules-Footnote-191666498 +Ref: New and Improved Modules-Footnote-201666563 +Ref: New and Improved Modules-Footnote-211666628 +Ref: New and Improved Modules-Footnote-221666693 +Ref: New and Improved Modules-Footnote-231666758 +Ref: New and Improved Modules-Footnote-241666823 +Ref: New and Improved Modules-Footnote-251666888 +Ref: New and Improved Modules-Footnote-261666953 +Ref: New and Improved Modules-Footnote-271667021 +Ref: New and Improved Modules-Footnote-281667086 +Ref: New and Improved Modules-Footnote-291667151 +Ref: New and Improved Modules-Footnote-301667216 +Ref: New and Improved Modules-Footnote-311667281 +Ref: New and Improved Modules-Footnote-321667346 +Ref: New and Improved Modules-Footnote-331667411 +Ref: New and Improved Modules-Footnote-341667476 +Ref: New and Improved Modules-Footnote-351667541 +Ref: New and Improved Modules-Footnote-361667606 +Ref: New and Improved Modules-Footnote-371667671 +Ref: New and Improved Modules-Footnote-381667736 +Ref: New and Improved Modules-Footnote-391667801 +Ref: New and Improved Modules-Footnote-401667866 +Ref: New and Improved Modules-Footnote-411667931 +Ref: New and Improved Modules-Footnote-421667996 +Ref: New and Improved Modules-Footnote-431668061 +Ref: New and Improved Modules-Footnote-441668126 +Ref: New and Improved Modules-Footnote-451668191 +Ref: New and Improved Modules-Footnote-461668256 +Ref: New and Improved Modules-Footnote-471668321 +Ref: New and Improved Modules-Footnote-481668386 +Ref: New and Improved Modules-Footnote-491668454 +Ref: New and Improved Modules-Footnote-501668519 +Ref: New and Improved Modules-Footnote-511668584 +Ref: New and Improved Modules-Footnote-521668649 +Ref: New and Improved Modules-Footnote-531668714 +Ref: New and Improved Modules-Footnote-541668779 +Ref: New and Improved Modules-Footnote-551668844 +Ref: New and Improved Modules-Footnote-561668909 +Ref: New and Improved Modules-Footnote-571668974 +Ref: New and Improved Modules-Footnote-581669039 +Ref: New and Improved Modules-Footnote-591669104 +Ref: New and Improved Modules-Footnote-601669169 +Ref: New and Improved Modules-Footnote-611669234 +Ref: New and Improved Modules-Footnote-621669299 +Ref: New and Improved Modules-Footnote-631669364 +Ref: New and Improved Modules-Footnote-641669429 +Ref: New and Improved Modules-Footnote-651669494 +Ref: New and Improved Modules-Footnote-661669559 +Ref: New and Improved Modules-Footnote-671669624 +Ref: New and Improved Modules-Footnote-681669689 +Ref: New and Improved Modules-Footnote-691669754 +Ref: New and Improved Modules-Footnote-701669800 +Ref: New and Improved Modules-Footnote-711669865 +Ref: New and Improved Modules-Footnote-721669930 +Ref: New and Improved Modules-Footnote-731669995 +Ref: New and Improved Modules-Footnote-741670060 +Ref: New and Improved Modules-Footnote-751670125 +Ref: New and Improved Modules-Footnote-761670190 +Ref: New and Improved Modules-Footnote-771670255 +Ref: New and Improved Modules-Footnote-781670320 +Ref: New and Improved Modules-Footnote-791670388 +Ref: New and Improved Modules-Footnote-801670453 +Ref: New and Improved Modules-Footnote-811670518 +Ref: New and Improved Modules-Footnote-821670583 +Ref: New and Improved Modules-Footnote-831670648 +Ref: New and Improved Modules-Footnote-841670713 +Ref: New and Improved Modules-Footnote-851670778 +Ref: New and Improved Modules-Footnote-861670846 +Ref: New and Improved Modules-Footnote-871670914 +Ref: New and Improved Modules-Footnote-881670979 +Ref: New and Improved Modules-Footnote-891671039 +Ref: New and Improved Modules-Footnote-901671099 +Ref: New and Improved Modules-Footnote-911671164 +Ref: New and Improved Modules-Footnote-921671229 +Ref: New and Improved Modules-Footnote-931671294 +Ref: New and Improved Modules-Footnote-941671359 +Ref: New and Improved Modules-Footnote-951671424 +Ref: New and Improved Modules-Footnote-961671489 +Ref: New and Improved Modules-Footnote-971671554 +Node: New module importlib1671619 +Ref: whatsnew/2 7 importlib-section1671729 +Ref: f921671729 +Ref: whatsnew/2 7 new-module-importlib1671729 +Ref: fc61671729 +Node: New module sysconfig1673269 +Ref: whatsnew/2 7 new-module-sysconfig1673413 +Ref: fc71673413 +Node: ttk Themed Widgets for Tk1674739 +Ref: whatsnew/2 7 ttk-themed-widgets-for-tk1674886 +Ref: fca1674886 +Ref: ttk Themed Widgets for Tk-Footnote-11675958 +Ref: ttk Themed Widgets for Tk-Footnote-21676022 +Node: Updated module unittest1676086 +Ref: whatsnew/2 7 unittest-section1676243 +Ref: fcb1676243 +Ref: whatsnew/2 7 updated-module-unittest1676243 +Ref: fcc1676243 +Ref: Updated module unittest-Footnote-11685141 +Ref: Updated module unittest-Footnote-21685168 +Ref: Updated module unittest-Footnote-31685205 +Ref: Updated module unittest-Footnote-41685269 +Ref: Updated module unittest-Footnote-51685333 +Ref: Updated module unittest-Footnote-61685400 +Ref: Updated module unittest-Footnote-71685464 +Ref: Updated module unittest-Footnote-81685528 +Ref: Updated module unittest-Footnote-91685592 +Ref: Updated module unittest-Footnote-101685656 +Ref: Updated module unittest-Footnote-111685721 +Ref: Updated module unittest-Footnote-121685786 +Ref: Updated module unittest-Footnote-131685851 +Ref: Updated module unittest-Footnote-141685916 +Node: Updated module ElementTree 1 31685981 +Ref: whatsnew/2 7 elementtree-section1686104 +Ref: fef1686104 +Ref: whatsnew/2 7 updated-module-elementtree-1-31686104 +Ref: ff01686104 +Ref: Updated module ElementTree 1 3-Footnote-11690101 +Node: Build and C API Changes<8>1690165 +Ref: whatsnew/2 7 build-and-c-api-changes1690319 +Ref: ff21690319 +Ref: Build and C API Changes<8>-Footnote-11698972 +Ref: Build and C API Changes<8>-Footnote-21699042 +Ref: Build and C API Changes<8>-Footnote-31699106 +Ref: Build and C API Changes<8>-Footnote-41699170 +Ref: Build and C API Changes<8>-Footnote-51699234 +Ref: Build and C API Changes<8>-Footnote-61699298 +Ref: Build and C API Changes<8>-Footnote-71699362 +Ref: Build and C API Changes<8>-Footnote-81699426 +Ref: Build and C API Changes<8>-Footnote-91699495 +Ref: Build and C API Changes<8>-Footnote-101699559 +Ref: Build and C API Changes<8>-Footnote-111699624 +Ref: Build and C API Changes<8>-Footnote-121699689 +Ref: Build and C API Changes<8>-Footnote-131699754 +Ref: Build and C API Changes<8>-Footnote-141699822 +Ref: Build and C API Changes<8>-Footnote-151699890 +Ref: Build and C API Changes<8>-Footnote-161699955 +Ref: Build and C API Changes<8>-Footnote-171700020 +Ref: Build and C API Changes<8>-Footnote-181700085 +Ref: Build and C API Changes<8>-Footnote-191700150 +Ref: Build and C API Changes<8>-Footnote-201700215 +Ref: Build and C API Changes<8>-Footnote-211700283 +Ref: Build and C API Changes<8>-Footnote-221700348 +Node: Capsules1700413 +Ref: whatsnew/2 7 capsules1700522 +Ref: ff51700522 +Ref: whatsnew/2 7 whatsnew27-capsules1700522 +Ref: ff61700522 +Ref: Capsules-Footnote-11702521 +Node: Port-Specific Changes Windows1702585 +Ref: whatsnew/2 7 port-specific-changes-windows1702733 +Ref: ff91702733 +Ref: Port-Specific Changes Windows-Footnote-11704425 +Ref: Port-Specific Changes Windows-Footnote-21704489 +Ref: Port-Specific Changes Windows-Footnote-31704553 +Ref: Port-Specific Changes Windows-Footnote-41704617 +Ref: Port-Specific Changes Windows-Footnote-51704684 +Ref: Port-Specific Changes Windows-Footnote-61704748 +Node: Port-Specific Changes Mac OS X1704812 +Ref: whatsnew/2 7 port-specific-changes-mac-os-x1704981 +Ref: ffb1704981 +Ref: Port-Specific Changes Mac OS X-Footnote-11706026 +Ref: Port-Specific Changes Mac OS X-Footnote-21706090 +Node: Port-Specific Changes FreeBSD1706155 +Ref: whatsnew/2 7 port-specific-changes-freebsd1706286 +Ref: ffc1706286 +Ref: Port-Specific Changes FreeBSD-Footnote-11706646 +Node: Other Changes and Fixes1706710 +Ref: whatsnew/2 7 other-changes-and-fixes1706861 +Ref: ffd1706861 +Ref: Other Changes and Fixes-Footnote-11709049 +Ref: Other Changes and Fixes-Footnote-21709113 +Ref: Other Changes and Fixes-Footnote-31709180 +Ref: Other Changes and Fixes-Footnote-41709244 +Ref: Other Changes and Fixes-Footnote-51709308 +Node: Porting to Python 2 71709372 +Ref: whatsnew/2 7 porting-to-python-2-71709550 +Ref: ffe1709550 +Ref: Porting to Python 2 7-Footnote-11715086 +Ref: Porting to Python 2 7-Footnote-21715150 +Ref: Porting to Python 2 7-Footnote-31715214 +Ref: Porting to Python 2 7-Footnote-41715278 +Ref: Porting to Python 2 7-Footnote-51715342 +Ref: Porting to Python 2 7-Footnote-61715406 +Ref: Porting to Python 2 7-Footnote-71715470 +Ref: Porting to Python 2 7-Footnote-81715534 +Ref: Porting to Python 2 7-Footnote-91715598 +Ref: Porting to Python 2 7-Footnote-101715662 +Ref: Porting to Python 2 7-Footnote-111715727 +Ref: Porting to Python 2 7-Footnote-121715792 +Ref: Porting to Python 2 7-Footnote-131715857 +Ref: Porting to Python 2 7-Footnote-141715917 +Node: New Features Added to Python 2 7 Maintenance Releases1715982 +Ref: whatsnew/2 7 new-features-added-to-python-2-7-maintenance-releases1716153 +Ref: fff1716153 +Ref: whatsnew/2 7 py27-maintenance-enhancements1716153 +Ref: f8c1716153 +Node: Two new environment variables for debug mode1717618 +Ref: whatsnew/2 7 two-new-environment-variables-for-debug-mode1717812 +Ref: 10001717812 +Ref: Two new environment variables for debug mode-Footnote-11718491 +Ref: Two new environment variables for debug mode-Footnote-21718556 +Node: PEP 434 IDLE Enhancement Exception for All Branches1718621 +Ref: whatsnew/2 7 pep-434-idle-enhancement-exception-for-all-branches1718876 +Ref: 10011718876 +Ref: PEP 434 IDLE Enhancement Exception for All Branches-Footnote-11719396 +Node: PEP 466 Network Security Enhancements for Python 2 71719438 +Ref: whatsnew/2 7 pep-466-network-security-enhancements-for-python-2-71719697 +Ref: 10021719697 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-11721928 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-21721970 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-31722012 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-41722077 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-51722142 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-61722184 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-71722249 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-81722314 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-91722356 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-101722421 +Ref: PEP 466 Network Security Enhancements for Python 2 7-Footnote-111722487 +Node: PEP 477 Backport ensurepip PEP 453 to Python 2 71722553 +Ref: whatsnew/2 7 pep-477-backport-ensurepip-pep-453-to-python-2-71722840 +Ref: 10051722840 +Ref: PEP 477 Backport ensurepip PEP 453 to Python 2 7-Footnote-11723336 +Ref: PEP 477 Backport ensurepip PEP 453 to Python 2 7-Footnote-21723378 +Node: Bootstrapping pip By Default<2>1723420 +Ref: whatsnew/2 7 bootstrapping-pip-by-default1723569 +Ref: 10061723569 +Ref: Bootstrapping pip By Default<2>-Footnote-11725237 +Ref: Bootstrapping pip By Default<2>-Footnote-21725279 +Node: Documentation Changes<2>1725369 +Ref: whatsnew/2 7 documentation-changes1725518 +Ref: 10071725518 +Ref: whatsnew/2 7 id11725518 +Ref: 10081725518 +Ref: Documentation Changes<2>-Footnote-11726473 +Ref: Documentation Changes<2>-Footnote-21726510 +Node: PEP 476 Enabling certificate verification by default for stdlib http clients<2>1726552 +Ref: whatsnew/2 7 pep-476-enabling-certificate-verification-by-default-for-stdlib-http-clients1726844 +Ref: 10091726844 +Ref: PEP 476 Enabling certificate verification by default for stdlib http clients<2>-Footnote-11727925 +Node: PEP 493 HTTPS verification migration tools for Python 2 71727967 +Ref: whatsnew/2 7 pep-493-https-verification-migration-tools-for-python-2-71728245 +Ref: 100a1728245 +Ref: PEP 493 HTTPS verification migration tools for Python 2 7-Footnote-11729409 +Node: New make regen-all build target<3>1729451 +Ref: whatsnew/2 7 new-make-regen-all-build-target1729687 +Ref: 100b1729687 +Ref: New make regen-all build target<3>-Footnote-11730477 +Ref: New make regen-all build target<3>-Footnote-21730545 +Node: Removal of make touch build target<3>1730610 +Ref: whatsnew/2 7 removal-of-make-touch-build-target1730780 +Ref: 100c1730780 +Ref: Removal of make touch build target<3>-Footnote-11731215 +Node: Acknowledgements1731280 +Ref: whatsnew/2 7 acknowledgements1731421 +Ref: 100d1731421 +Ref: whatsnew/2 7 acks271731421 +Ref: 100e1731421 +Node: What’s New in Python 2 61731694 +Ref: whatsnew/2 6 doc1731849 +Ref: 100f1731849 +Ref: whatsnew/2 6 what-s-new-in-python-2-61731849 +Ref: 10101731849 +Ref: whatsnew/2 6 whats-new-in-2-61731849 +Ref: f5c1731849 +Ref: What’s New in Python 2 6-Footnote-11734913 +Node: Python 3 01734955 +Ref: whatsnew/2 6 python-3-01735071 +Ref: 10111735071 +Ref: Python 3 0-Footnote-11737179 +Ref: Python 3 0-Footnote-21737221 +Node: Changes to the Development Process1737263 +Ref: whatsnew/2 6 changes-to-the-development-process1737420 +Ref: 10121737420 +Node: New Issue Tracker Roundup1737938 +Ref: whatsnew/2 6 new-issue-tracker-roundup1738097 +Ref: 10131738097 +Ref: New Issue Tracker Roundup-Footnote-11740147 +Ref: New Issue Tracker Roundup-Footnote-21740196 +Ref: New Issue Tracker Roundup-Footnote-31740227 +Ref: New Issue Tracker Roundup-Footnote-41740267 +Ref: New Issue Tracker Roundup-Footnote-51740302 +Node: New Documentation Format reStructuredText Using Sphinx1740343 +Ref: whatsnew/2 6 new-documentation-format-restructuredtext-using-sphinx1740502 +Ref: 10141740502 +Ref: New Documentation Format reStructuredText Using Sphinx-Footnote-11742612 +Ref: New Documentation Format reStructuredText Using Sphinx-Footnote-21742671 +Ref: New Documentation Format reStructuredText Using Sphinx-Footnote-31742720 +Ref: New Documentation Format reStructuredText Using Sphinx-Footnote-41742751 +Node: PEP 343 The ‘with’ statement1742791 +Ref: whatsnew/2 6 pep-03431742990 +Ref: f5d1742990 +Ref: whatsnew/2 6 pep-343-the-with-statement1742990 +Ref: 10151742990 +Node: Writing Context Managers1746242 +Ref: whatsnew/2 6 new-26-context-managers1746365 +Ref: f5e1746365 +Ref: whatsnew/2 6 writing-context-managers1746365 +Ref: 10161746365 +Node: The contextlib module1750832 +Ref: whatsnew/2 6 new-module-contextlib1750955 +Ref: f5f1750955 +Ref: whatsnew/2 6 the-contextlib-module1750955 +Ref: 10171750955 +Ref: The contextlib module-Footnote-11753445 +Node: PEP 366 Explicit Relative Imports From a Main Module1753487 +Ref: whatsnew/2 6 pep-03661753692 +Ref: f601753692 +Ref: whatsnew/2 6 pep-366-explicit-relative-imports-from-a-main-module1753692 +Ref: 10181753692 +Node: PEP 370 Per-user site-packages Directory1754456 +Ref: whatsnew/2 6 pep-03701754664 +Ref: f611754664 +Ref: whatsnew/2 6 pep-370-per-user-site-packages-directory1754664 +Ref: 101a1754664 +Ref: PEP 370 Per-user site-packages Directory-Footnote-11756126 +Node: PEP 371 The multiprocessing Package1756168 +Ref: whatsnew/2 6 pep-03711756359 +Ref: f621756359 +Ref: whatsnew/2 6 pep-371-the-multiprocessing-package1756359 +Ref: 101e1756359 +Ref: PEP 371 The multiprocessing Package-Footnote-11761501 +Node: PEP 3101 Advanced String Formatting1761543 +Ref: whatsnew/2 6 pep-31011761722 +Ref: f631761722 +Ref: whatsnew/2 6 pep-3101-advanced-string-formatting1761722 +Ref: 10201761722 +Ref: PEP 3101 Advanced String Formatting-Footnote-11767425 +Node: PEP 3105 print As a Function1767467 +Ref: whatsnew/2 6 pep-31051767646 +Ref: f641767646 +Ref: whatsnew/2 6 pep-3105-print-as-a-function1767646 +Ref: 10221767646 +Ref: PEP 3105 print As a Function-Footnote-11768800 +Node: PEP 3110 Exception-Handling Changes1768842 +Ref: whatsnew/2 6 pep-31101769008 +Ref: f651769008 +Ref: whatsnew/2 6 pep-3110-exception-handling-changes1769008 +Ref: 10231769008 +Ref: PEP 3110 Exception-Handling Changes-Footnote-11770609 +Node: PEP 3112 Byte Literals1770651 +Ref: whatsnew/2 6 pep-31121770813 +Ref: f661770813 +Ref: whatsnew/2 6 pep-3112-byte-literals1770813 +Ref: 10241770813 +Ref: PEP 3112 Byte Literals-Footnote-11773831 +Node: PEP 3116 New I/O Library1773873 +Ref: whatsnew/2 6 pep-31161774032 +Ref: f671774032 +Ref: whatsnew/2 6 pep-3116-new-i-o-library1774032 +Ref: 10291774032 +Ref: PEP 3116 New I/O Library-Footnote-11777658 +Node: PEP 3118 Revised Buffer Protocol1777700 +Ref: whatsnew/2 6 pep-31181777867 +Ref: f681777867 +Ref: whatsnew/2 6 pep-3118-revised-buffer-protocol1777867 +Ref: 102a1777867 +Ref: PEP 3118 Revised Buffer Protocol-Footnote-11780006 +Node: PEP 3119 Abstract Base Classes1780048 +Ref: whatsnew/2 6 pep-31191780234 +Ref: f691780234 +Ref: whatsnew/2 6 pep-3119-abstract-base-classes1780234 +Ref: 102b1780234 +Ref: PEP 3119 Abstract Base Classes-Footnote-11785592 +Node: PEP 3127 Integer Literal Support and Syntax1785634 +Ref: whatsnew/2 6 pep-31271785813 +Ref: f6a1785813 +Ref: whatsnew/2 6 pep-3127-integer-literal-support-and-syntax1785813 +Ref: 102c1785813 +Ref: PEP 3127 Integer Literal Support and Syntax-Footnote-11787178 +Node: PEP 3129 Class Decorators1787220 +Ref: whatsnew/2 6 pep-31291787406 +Ref: f6b1787406 +Ref: whatsnew/2 6 pep-3129-class-decorators1787406 +Ref: 102d1787406 +Ref: PEP 3129 Class Decorators-Footnote-11787806 +Node: PEP 3141 A Type Hierarchy for Numbers1787848 +Ref: whatsnew/2 6 pep-31411788017 +Ref: f6c1788017 +Ref: whatsnew/2 6 pep-3141-a-type-hierarchy-for-numbers1788017 +Ref: 102e1788017 +Ref: PEP 3141 A Type Hierarchy for Numbers-Footnote-11790222 +Ref: PEP 3141 A Type Hierarchy for Numbers-Footnote-21790264 +Ref: PEP 3141 A Type Hierarchy for Numbers-Footnote-31790362 +Node: The fractions Module1790448 +Ref: whatsnew/2 6 the-fractions-module1790542 +Ref: 10321790542 +Node: Other Language Changes<13>1792149 +Ref: whatsnew/2 6 other-language-changes1792320 +Ref: 10331792320 +Ref: Other Language Changes<13>-Footnote-11801115 +Ref: Other Language Changes<13>-Footnote-21801182 +Ref: Other Language Changes<13>-Footnote-31801246 +Ref: Other Language Changes<13>-Footnote-41801313 +Ref: Other Language Changes<13>-Footnote-51801377 +Ref: Other Language Changes<13>-Footnote-61801441 +Ref: Other Language Changes<13>-Footnote-71801505 +Ref: Other Language Changes<13>-Footnote-81801569 +Ref: Other Language Changes<13>-Footnote-91801633 +Ref: Other Language Changes<13>-Footnote-101801697 +Ref: Other Language Changes<13>-Footnote-111801762 +Ref: Other Language Changes<13>-Footnote-121801827 +Ref: Other Language Changes<13>-Footnote-131801895 +Ref: Other Language Changes<13>-Footnote-141801963 +Ref: Other Language Changes<13>-Footnote-151802031 +Ref: Other Language Changes<13>-Footnote-161802099 +Node: Optimizations<12>1802167 +Ref: whatsnew/2 6 optimizations1802278 +Ref: 10361802278 +Ref: Optimizations<12>-Footnote-11805128 +Ref: Optimizations<12>-Footnote-21805195 +Ref: Optimizations<12>-Footnote-31805262 +Ref: Optimizations<12>-Footnote-41805326 +Node: Interpreter Changes<2>1805390 +Ref: whatsnew/2 6 interpreter-changes1805501 +Ref: 10371805501 +Ref: whatsnew/2 6 new-26-interpreter1805501 +Ref: 10381805501 +Node: New and Improved Modules<2>1807090 +Ref: whatsnew/2 6 new-and-improved-modules1807249 +Ref: 103c1807249 +Ref: New and Improved Modules<2>-Footnote-11849690 +Ref: New and Improved Modules<2>-Footnote-21849757 +Ref: New and Improved Modules<2>-Footnote-31849810 +Ref: New and Improved Modules<2>-Footnote-41849874 +Ref: New and Improved Modules<2>-Footnote-51849940 +Ref: New and Improved Modules<2>-Footnote-61850004 +Ref: New and Improved Modules<2>-Footnote-71850071 +Ref: New and Improved Modules<2>-Footnote-81850135 +Ref: New and Improved Modules<2>-Footnote-91850188 +Ref: New and Improved Modules<2>-Footnote-101850255 +Ref: New and Improved Modules<2>-Footnote-111850323 +Ref: New and Improved Modules<2>-Footnote-121850391 +Ref: New and Improved Modules<2>-Footnote-131850456 +Ref: New and Improved Modules<2>-Footnote-141850521 +Ref: New and Improved Modules<2>-Footnote-151850588 +Ref: New and Improved Modules<2>-Footnote-161850653 +Ref: New and Improved Modules<2>-Footnote-171850721 +Ref: New and Improved Modules<2>-Footnote-181850786 +Ref: New and Improved Modules<2>-Footnote-191850854 +Ref: New and Improved Modules<2>-Footnote-201850922 +Ref: New and Improved Modules<2>-Footnote-211850990 +Ref: New and Improved Modules<2>-Footnote-221851057 +Ref: New and Improved Modules<2>-Footnote-231851125 +Ref: New and Improved Modules<2>-Footnote-241851193 +Ref: New and Improved Modules<2>-Footnote-251851258 +Ref: New and Improved Modules<2>-Footnote-261851323 +Ref: New and Improved Modules<2>-Footnote-271851391 +Ref: New and Improved Modules<2>-Footnote-281851459 +Ref: New and Improved Modules<2>-Footnote-291851526 +Ref: New and Improved Modules<2>-Footnote-301851591 +Ref: New and Improved Modules<2>-Footnote-311851656 +Ref: New and Improved Modules<2>-Footnote-321851721 +Ref: New and Improved Modules<2>-Footnote-331851786 +Ref: New and Improved Modules<2>-Footnote-341851851 +Ref: New and Improved Modules<2>-Footnote-351851916 +Ref: New and Improved Modules<2>-Footnote-361851981 +Ref: New and Improved Modules<2>-Footnote-371852041 +Ref: New and Improved Modules<2>-Footnote-381852108 +Ref: New and Improved Modules<2>-Footnote-391852168 +Ref: New and Improved Modules<2>-Footnote-401852235 +Ref: New and Improved Modules<2>-Footnote-411852300 +Ref: New and Improved Modules<2>-Footnote-421852367 +Ref: New and Improved Modules<2>-Footnote-431852435 +Ref: New and Improved Modules<2>-Footnote-441852500 +Ref: New and Improved Modules<2>-Footnote-451852565 +Ref: New and Improved Modules<2>-Footnote-461852630 +Ref: New and Improved Modules<2>-Footnote-471852698 +Ref: New and Improved Modules<2>-Footnote-481852763 +Ref: New and Improved Modules<2>-Footnote-491852828 +Ref: New and Improved Modules<2>-Footnote-501852896 +Ref: New and Improved Modules<2>-Footnote-511852961 +Ref: New and Improved Modules<2>-Footnote-521853029 +Ref: New and Improved Modules<2>-Footnote-531853094 +Ref: New and Improved Modules<2>-Footnote-541853162 +Ref: New and Improved Modules<2>-Footnote-551853227 +Ref: New and Improved Modules<2>-Footnote-561853295 +Ref: New and Improved Modules<2>-Footnote-571853360 +Ref: New and Improved Modules<2>-Footnote-581853428 +Ref: New and Improved Modules<2>-Footnote-591853496 +Ref: New and Improved Modules<2>-Footnote-601853561 +Ref: New and Improved Modules<2>-Footnote-611853626 +Ref: New and Improved Modules<2>-Footnote-621853693 +Ref: New and Improved Modules<2>-Footnote-631853761 +Node: The ast module1853829 +Ref: whatsnew/2 6 the-ast-module1853942 +Ref: 104b1853942 +Node: The future_builtins module1856603 +Ref: whatsnew/2 6 the-future-builtins-module1856767 +Ref: 104c1856767 +Node: The json module JavaScript Object Notation1857872 +Ref: whatsnew/2 6 the-json-module-javascript-object-notation1858064 +Ref: 104e1858064 +Node: The plistlib module A Property-List Parser1859076 +Ref: whatsnew/2 6 the-plistlib-module-a-property-list-parser1859261 +Ref: 104f1859261 +Node: ctypes Enhancements1860632 +Ref: whatsnew/2 6 ctypes-enhancements1860795 +Ref: 10501860795 +Ref: ctypes Enhancements-Footnote-11862562 +Ref: ctypes Enhancements-Footnote-21862629 +Node: Improved SSL Support1862693 +Ref: whatsnew/2 6 improved-ssl-support1862805 +Ref: 10511862805 +Ref: Improved SSL Support-Footnote-11863758 +Node: Deprecations and Removals1863791 +Ref: whatsnew/2 6 deprecations-and-removals1863950 +Ref: 10521863950 +Ref: Deprecations and Removals-Footnote-11865806 +Node: Build and C API Changes<9>1865848 +Ref: whatsnew/2 6 build-and-c-api-changes1866001 +Ref: 10541866001 +Ref: Build and C API Changes<9>-Footnote-11872062 +Ref: Build and C API Changes<9>-Footnote-21872126 +Ref: Build and C API Changes<9>-Footnote-31872193 +Ref: Build and C API Changes<9>-Footnote-41872257 +Ref: Build and C API Changes<9>-Footnote-51872321 +Node: Port-Specific Changes Windows<2>1872388 +Ref: whatsnew/2 6 port-specific-changes-windows1872525 +Ref: 105b1872525 +Ref: Port-Specific Changes Windows<2>-Footnote-11874936 +Ref: Port-Specific Changes Windows<2>-Footnote-21875002 +Ref: Port-Specific Changes Windows<2>-Footnote-31875069 +Node: Port-Specific Changes Mac OS X<2>1875133 +Ref: whatsnew/2 6 port-specific-changes-mac-os-x1875305 +Ref: 105c1875305 +Ref: Port-Specific Changes Mac OS X<2>-Footnote-11876576 +Node: Port-Specific Changes IRIX1876643 +Ref: whatsnew/2 6 port-specific-changes-irix1876774 +Ref: 105d1876774 +Node: Porting to Python 2 61877293 +Ref: whatsnew/2 6 porting-to-python-2-61877440 +Ref: 105e1877440 +Ref: Porting to Python 2 6-Footnote-11880846 +Ref: Porting to Python 2 6-Footnote-21880913 +Ref: Porting to Python 2 6-Footnote-31880980 +Node: Acknowledgements<2>1881047 +Ref: whatsnew/2 6 acknowledgements1881159 +Ref: 10611881159 +Ref: whatsnew/2 6 acks1881159 +Ref: 10621881159 +Node: What’s New in Python 2 51881501 +Ref: whatsnew/2 5 doc1881656 +Ref: 10631881656 +Ref: whatsnew/2 5 what-s-new-in-python-2-51881656 +Ref: 10641881656 +Ref: What’s New in Python 2 5-Footnote-11885312 +Node: PEP 308 Conditional Expressions1885354 +Ref: whatsnew/2 5 pep-3081885493 +Ref: 10651885493 +Ref: whatsnew/2 5 pep-308-conditional-expressions1885493 +Ref: 106a1885493 +Ref: PEP 308 Conditional Expressions-Footnote-11888977 +Ref: PEP 308 Conditional Expressions-Footnote-21889019 +Node: PEP 309 Partial Function Application1889061 +Ref: whatsnew/2 5 pep-3091889259 +Ref: 106b1889259 +Ref: whatsnew/2 5 pep-309-partial-function-application1889259 +Ref: 106c1889259 +Ref: PEP 309 Partial Function Application-Footnote-11892106 +Node: PEP 314 Metadata for Python Software Packages v1 11892148 +Ref: whatsnew/2 5 pep-3141892352 +Ref: 106d1892352 +Ref: whatsnew/2 5 pep-314-metadata-for-python-software-packages-v1-11892352 +Ref: 106e1892352 +Ref: PEP 314 Metadata for Python Software Packages v1 1-Footnote-11894186 +Node: PEP 328 Absolute and Relative Imports1894228 +Ref: whatsnew/2 5 pep-3281894432 +Ref: 10681894432 +Ref: whatsnew/2 5 pep-328-absolute-and-relative-imports1894432 +Ref: 106f1894432 +Ref: PEP 328 Absolute and Relative Imports-Footnote-11898244 +Ref: PEP 328 Absolute and Relative Imports-Footnote-21898286 +Node: PEP 338 Executing Modules as Scripts1898328 +Ref: whatsnew/2 5 pep-3381898516 +Ref: 10701898516 +Ref: whatsnew/2 5 pep-338-executing-modules-as-scripts1898516 +Ref: 10711898516 +Ref: PEP 338 Executing Modules as Scripts-Footnote-11899411 +Node: PEP 341 Unified try/except/finally1899453 +Ref: whatsnew/2 5 pep-3411899634 +Ref: 10691899634 +Ref: whatsnew/2 5 pep-341-unified-try-except-finally1899634 +Ref: 10721899634 +Ref: PEP 341 Unified try/except/finally-Footnote-11901402 +Node: PEP 342 New Generator Features1901444 +Ref: whatsnew/2 5 pep-3421901624 +Ref: 10671901624 +Ref: whatsnew/2 5 pep-342-new-generator-features1901624 +Ref: 10741901624 +Ref: PEP 342 New Generator Features-Footnote-11908289 +Ref: PEP 342 New Generator Features-Footnote-21908331 +Ref: PEP 342 New Generator Features-Footnote-31908373 +Ref: PEP 342 New Generator Features-Footnote-41908415 +Ref: PEP 342 New Generator Features-Footnote-51908457 +Node: PEP 343 The ‘with’ statement<2>1908499 +Ref: whatsnew/2 5 pep-3431908684 +Ref: 10661908684 +Ref: whatsnew/2 5 pep-343-the-with-statement1908684 +Ref: 10751908684 +Node: Writing Context Managers<2>1911680 +Ref: whatsnew/2 5 new-25-context-managers1911812 +Ref: 10761911812 +Ref: whatsnew/2 5 writing-context-managers1911812 +Ref: 10771911812 +Node: The contextlib module<2>1916168 +Ref: whatsnew/2 5 contextlibmod1916300 +Ref: 10781916300 +Ref: whatsnew/2 5 the-contextlib-module1916300 +Ref: 10791916300 +Ref: The contextlib module<2>-Footnote-11918781 +Node: PEP 352 Exceptions as New-Style Classes1918823 +Ref: whatsnew/2 5 pep-3521919017 +Ref: 107a1919017 +Ref: whatsnew/2 5 pep-352-exceptions-as-new-style-classes1919017 +Ref: 107b1919017 +Ref: PEP 352 Exceptions as New-Style Classes-Footnote-11921499 +Node: PEP 353 Using ssize_t as the index type1921541 +Ref: whatsnew/2 5 pep-3531921734 +Ref: 107c1921734 +Ref: whatsnew/2 5 pep-353-using-ssize-t-as-the-index-type1921734 +Ref: 107d1921734 +Ref: PEP 353 Using ssize_t as the index type-Footnote-11924632 +Ref: PEP 353 Using ssize_t as the index type-Footnote-21924674 +Node: PEP 357 The ‘__index__’ method1924716 +Ref: whatsnew/2 5 pep-3571924896 +Ref: 107f1924896 +Ref: whatsnew/2 5 pep-357-the-index-method1924896 +Ref: 10801924896 +Ref: PEP 357 The ‘__index__’ method-Footnote-11926598 +Node: Other Language Changes<14>1926640 +Ref: whatsnew/2 5 other-lang1926813 +Ref: 10821926813 +Ref: whatsnew/2 5 other-language-changes1926813 +Ref: 10831926813 +Ref: Other Language Changes<14>-Footnote-11933768 +Node: Interactive Interpreter Changes1933810 +Ref: whatsnew/2 5 interactive1933930 +Ref: 10891933930 +Ref: whatsnew/2 5 interactive-interpreter-changes1933930 +Ref: 108a1933930 +Node: Optimizations<13>1934711 +Ref: whatsnew/2 5 optimizations1934831 +Ref: 108c1934831 +Ref: whatsnew/2 5 opts1934831 +Ref: 108d1934831 +Node: New Improved and Removed Modules1938649 +Ref: whatsnew/2 5 modules1938815 +Ref: 108e1938815 +Ref: whatsnew/2 5 new-improved-and-removed-modules1938815 +Ref: 108f1938815 +Ref: New Improved and Removed Modules-Footnote-11963319 +Ref: New Improved and Removed Modules-Footnote-21963361 +Ref: New Improved and Removed Modules-Footnote-31963420 +Node: The ctypes package1963479 +Ref: whatsnew/2 5 module-ctypes1963598 +Ref: 109c1963598 +Ref: whatsnew/2 5 the-ctypes-package1963598 +Ref: 109d1963598 +Node: The ElementTree package1966866 +Ref: whatsnew/2 5 module-etree1967013 +Ref: 109e1967013 +Ref: whatsnew/2 5 the-elementtree-package1967013 +Ref: 109f1967013 +Node: The hashlib package1972311 +Ref: whatsnew/2 5 module-hashlib1972459 +Ref: 10a01972459 +Ref: whatsnew/2 5 the-hashlib-package1972459 +Ref: 10a11972459 +Node: The sqlite3 package1974044 +Ref: whatsnew/2 5 module-sqlite1974188 +Ref: 10a21974188 +Ref: whatsnew/2 5 the-sqlite3-package1974188 +Ref: 10a31974188 +Ref: The sqlite3 package-Footnote-11978199 +Ref: The sqlite3 package-Footnote-21978241 +Node: The wsgiref package1978283 +Ref: whatsnew/2 5 module-wsgiref1978399 +Ref: 10a41978399 +Ref: whatsnew/2 5 the-wsgiref-package1978399 +Ref: 10a51978399 +Ref: The wsgiref package-Footnote-11979382 +Ref: The wsgiref package-Footnote-21979424 +Node: Build and C API Changes<10>1979466 +Ref: whatsnew/2 5 build-and-c-api-changes1979627 +Ref: 10a61979627 +Ref: whatsnew/2 5 build-api1979627 +Ref: 10a71979627 +Ref: Build and C API Changes<10>-Footnote-11986662 +Ref: Build and C API Changes<10>-Footnote-21986704 +Ref: Build and C API Changes<10>-Footnote-31986746 +Node: Port-Specific Changes1986788 +Ref: whatsnew/2 5 port-specific-changes1986873 +Ref: 10b11986873 +Ref: whatsnew/2 5 ports1986873 +Ref: 10b21986873 +Ref: Port-Specific Changes-Footnote-11987550 +Node: Porting to Python 2 51987614 +Ref: whatsnew/2 5 porting1987762 +Ref: 10b31987762 +Ref: whatsnew/2 5 porting-to-python-2-51987762 +Ref: 10b41987762 +Ref: Porting to Python 2 5-Footnote-11990568 +Node: Acknowledgements<3>1990610 +Ref: whatsnew/2 5 acknowledgements1990722 +Ref: 10b51990722 +Node: What’s New in Python 2 41991216 +Ref: whatsnew/2 4 doc1991371 +Ref: 10b61991371 +Ref: whatsnew/2 4 what-s-new-in-python-2-41991371 +Ref: 10b71991371 +Node: PEP 218 Built-In Set Objects1993476 +Ref: whatsnew/2 4 pep-218-built-in-set-objects1993619 +Ref: 10b81993619 +Ref: PEP 218 Built-In Set Objects-Footnote-11995855 +Node: PEP 237 Unifying Long Integers and Integers1995897 +Ref: whatsnew/2 4 pep-237-unifying-long-integers-and-integers1996078 +Ref: 10b91996078 +Ref: PEP 237 Unifying Long Integers and Integers-Footnote-11997119 +Node: PEP 289 Generator Expressions1997161 +Ref: whatsnew/2 4 pep-289-generator-expressions1997350 +Ref: 10ba1997350 +Ref: PEP 289 Generator Expressions-Footnote-11999622 +Node: PEP 292 Simpler String Substitutions1999664 +Ref: whatsnew/2 4 pep-292-simpler-string-substitutions1999854 +Ref: 10bb1999854 +Ref: PEP 292 Simpler String Substitutions-Footnote-12001653 +Node: PEP 318 Decorators for Functions and Methods2001695 +Ref: whatsnew/2 4 pep-318-decorators-for-functions-and-methods2001881 +Ref: 10bc2001881 +Ref: PEP 318 Decorators for Functions and Methods-Footnote-12006403 +Ref: PEP 318 Decorators for Functions and Methods-Footnote-22006445 +Node: PEP 322 Reverse Iteration2006487 +Ref: whatsnew/2 4 pep-322-reverse-iteration2006666 +Ref: 10be2006666 +Ref: PEP 322 Reverse Iteration-Footnote-12007628 +Node: PEP 324 New subprocess Module2007670 +Ref: whatsnew/2 4 pep-324-new-subprocess-module2007830 +Ref: 10bf2007830 +Ref: PEP 324 New subprocess Module-Footnote-12011596 +Node: PEP 327 Decimal Data Type2011638 +Ref: whatsnew/2 4 pep-327-decimal-data-type2011799 +Ref: 10c12011799 +Node: Why is Decimal needed?2012371 +Ref: whatsnew/2 4 why-is-decimal-needed2012480 +Ref: 10c22012480 +Node: The Decimal type2015064 +Ref: whatsnew/2 4 the-decimal-type2015198 +Ref: 10c32015198 +Node: The Context type2018370 +Ref: whatsnew/2 4 the-context-type2018473 +Ref: 10c42018473 +Ref: The Context type-Footnote-12021082 +Node: PEP 328 Multi-line Imports2021124 +Ref: whatsnew/2 4 pep-328-multi-line-imports2021307 +Ref: 10c52021307 +Ref: PEP 328 Multi-line Imports-Footnote-12022801 +Node: PEP 331 Locale-Independent Float/String Conversions2022843 +Ref: whatsnew/2 4 pep-331-locale-independent-float-string-conversions2023027 +Ref: 10c62023027 +Ref: PEP 331 Locale-Independent Float/String Conversions-Footnote-12024755 +Node: Other Language Changes<15>2024797 +Ref: whatsnew/2 4 other-language-changes2024993 +Ref: 10c72024993 +Ref: Other Language Changes<15>-Footnote-12031976 +Ref: Other Language Changes<15>-Footnote-22032018 +Ref: Other Language Changes<15>-Footnote-32032060 +Ref: Other Language Changes<15>-Footnote-42032102 +Ref: Other Language Changes<15>-Footnote-52032144 +Ref: Other Language Changes<15>-Footnote-62032186 +Node: Optimizations<14>2032228 +Ref: whatsnew/2 4 optimizations2032308 +Ref: 10c92032308 +Node: New Improved and Deprecated Modules<3>2035056 +Ref: whatsnew/2 4 new-improved-and-deprecated-modules2035228 +Ref: 10ca2035228 +Ref: New Improved and Deprecated Modules<3>-Footnote-12052515 +Node: cookielib2052574 +Ref: whatsnew/2 4 cookielib2052677 +Ref: 10cc2052677 +Node: doctest<4>2053596 +Ref: whatsnew/2 4 doctest2053699 +Ref: 10cd2053699 +Node: Build and C API Changes<11>2056439 +Ref: whatsnew/2 4 build-and-c-api-changes2056606 +Ref: 10d32056606 +Node: Port-Specific Changes<2>2059231 +Ref: whatsnew/2 4 port-specific-changes2059319 +Ref: 10da2059319 +Node: Porting to Python 2 42059498 +Ref: whatsnew/2 4 porting-to-python-2-42059646 +Ref: 10db2059646 +Node: Acknowledgements<4>2061614 +Ref: whatsnew/2 4 acknowledgements2061726 +Ref: 10dd2061726 +Ref: whatsnew/2 4 acks2061726 +Ref: 10de2061726 +Node: What’s New in Python 2 32062059 +Ref: whatsnew/2 3 doc2062214 +Ref: 10df2062214 +Ref: whatsnew/2 3 what-s-new-in-python-2-32062214 +Ref: 10e02062214 +Node: PEP 218 A Standard Set Datatype2065233 +Ref: whatsnew/2 3 pep-218-a-standard-set-datatype2065361 +Ref: 10e22065361 +Ref: PEP 218 A Standard Set Datatype-Footnote-12067852 +Node: PEP 255 Simple Generators2067894 +Ref: whatsnew/2 3 pep-255-simple-generators2068060 +Ref: 10e32068060 +Ref: whatsnew/2 3 section-generators2068060 +Ref: 10e42068060 +Ref: PEP 255 Simple Generators-Footnote-12074243 +Ref: PEP 255 Simple Generators-Footnote-22074285 +Node: PEP 263 Source Code Encodings2074327 +Ref: whatsnew/2 3 pep-263-source-code-encodings2074505 +Ref: 10e52074505 +Ref: whatsnew/2 3 section-encodings2074505 +Ref: 10e62074505 +Ref: PEP 263 Source Code Encodings-Footnote-12075717 +Node: PEP 273 Importing Modules from ZIP Archives2075759 +Ref: whatsnew/2 3 pep-273-importing-modules-from-zip-archives2075960 +Ref: 10e72075960 +Ref: PEP 273 Importing Modules from ZIP Archives-Footnote-12077994 +Ref: PEP 273 Importing Modules from ZIP Archives-Footnote-22078036 +Ref: PEP 273 Importing Modules from ZIP Archives-Footnote-32078078 +Node: PEP 277 Unicode file name support for Windows NT2078120 +Ref: whatsnew/2 3 pep-277-unicode-file-name-support-for-windows-nt2078325 +Ref: 10e92078325 +Ref: PEP 277 Unicode file name support for Windows NT-Footnote-12079804 +Node: PEP 278 Universal Newline Support2079846 +Ref: whatsnew/2 3 pep-278-universal-newline-support2080025 +Ref: 10eb2080025 +Ref: PEP 278 Universal Newline Support-Footnote-12081540 +Node: PEP 279 enumerate2081582 +Ref: whatsnew/2 3 pep-279-enumerate2081740 +Ref: 10ec2081740 +Ref: whatsnew/2 3 section-enumerate2081740 +Ref: 10ed2081740 +Ref: PEP 279 enumerate-Footnote-12082598 +Node: PEP 282 The logging Package2082640 +Ref: whatsnew/2 3 pep-282-the-logging-package2082787 +Ref: 10ee2082787 +Ref: PEP 282 The logging Package-Footnote-12087481 +Ref: PEP 282 The logging Package-Footnote-22087523 +Node: PEP 285 A Boolean Type2087565 +Ref: whatsnew/2 3 pep-285-a-boolean-type2087733 +Ref: 10ef2087733 +Ref: whatsnew/2 3 section-bool2087733 +Ref: 10f02087733 +Ref: PEP 285 A Boolean Type-Footnote-12090182 +Ref: PEP 285 A Boolean Type-Footnote-22090224 +Node: PEP 293 Codec Error Handling Callbacks2090266 +Ref: whatsnew/2 3 pep-293-codec-error-handling-callbacks2090455 +Ref: 10f12090455 +Ref: PEP 293 Codec Error Handling Callbacks-Footnote-12092006 +Node: PEP 301 Package Index and Metadata for Distutils2092048 +Ref: whatsnew/2 3 pep-301-package-index-and-metadata-for-distutils2092239 +Ref: 10f42092239 +Ref: whatsnew/2 3 section-pep3012092239 +Ref: 10f52092239 +Ref: PEP 301 Package Index and Metadata for Distutils-Footnote-12093883 +Ref: PEP 301 Package Index and Metadata for Distutils-Footnote-22093919 +Node: PEP 302 New Import Hooks2093961 +Ref: whatsnew/2 3 pep-302-new-import-hooks2094143 +Ref: 10f62094143 +Ref: whatsnew/2 3 section-pep3022094143 +Ref: 10e82094143 +Ref: PEP 302 New Import Hooks-Footnote-12096750 +Ref: PEP 302 New Import Hooks-Footnote-22096792 +Ref: PEP 302 New Import Hooks-Footnote-32096834 +Node: PEP 305 Comma-separated Files2096876 +Ref: whatsnew/2 3 pep-305-comma-separated-files2097037 +Ref: 10f72097037 +Ref: whatsnew/2 3 section-pep3052097037 +Ref: 10f82097037 +Ref: PEP 305 Comma-separated Files-Footnote-12098514 +Node: PEP 307 Pickle Enhancements2098556 +Ref: whatsnew/2 3 pep-307-pickle-enhancements2098708 +Ref: 10fa2098708 +Ref: whatsnew/2 3 section-pep3072098708 +Ref: 10fb2098708 +Ref: PEP 307 Pickle Enhancements-Footnote-12100666 +Ref: PEP 307 Pickle Enhancements-Footnote-22100708 +Ref: PEP 307 Pickle Enhancements-Footnote-32100750 +Node: Extended Slices2100792 +Ref: whatsnew/2 3 extended-slices2100941 +Ref: 10fe2100941 +Ref: whatsnew/2 3 section-slices2100941 +Ref: 10ff2100941 +Node: Other Language Changes<16>2104328 +Ref: whatsnew/2 3 other-language-changes2104488 +Ref: 11012104488 +Ref: Other Language Changes<16>-Footnote-12112275 +Ref: Other Language Changes<16>-Footnote-22112348 +Node: String Changes2112402 +Ref: whatsnew/2 3 string-changes2112505 +Ref: 11052112505 +Node: Optimizations<15>2114958 +Ref: whatsnew/2 3 optimizations2115061 +Ref: 11062115061 +Node: New Improved and Deprecated Modules<4>2116509 +Ref: whatsnew/2 3 new-improved-and-deprecated-modules2116693 +Ref: 11082116693 +Ref: New Improved and Deprecated Modules<4>-Footnote-12141306 +Node: Date/Time Type2141346 +Ref: whatsnew/2 3 date-time-type2141463 +Ref: 11102141463 +Node: The optparse Module2143727 +Ref: whatsnew/2 3 the-optparse-module2143844 +Ref: 11112143844 +Node: Pymalloc A Specialized Object Allocator2145904 +Ref: whatsnew/2 3 pymalloc-a-specialized-object-allocator2146089 +Ref: 11122146089 +Ref: whatsnew/2 3 section-pymalloc2146089 +Ref: 11132146089 +Node: Build and C API Changes<12>2149994 +Ref: whatsnew/2 3 build-and-c-api-changes2150167 +Ref: 11152150167 +Node: Port-Specific Changes<3>2153570 +Ref: whatsnew/2 3 port-specific-changes2153658 +Ref: 111a2153658 +Node: Other Changes and Fixes<2>2154893 +Ref: whatsnew/2 3 other-changes-and-fixes2155048 +Ref: 111b2155048 +Ref: whatsnew/2 3 section-other2155048 +Ref: 11072155048 +Node: Porting to Python 2 32157540 +Ref: whatsnew/2 3 porting-to-python-2-32157687 +Ref: 111e2157687 +Node: Acknowledgements<5>2160496 +Ref: whatsnew/2 3 acknowledgements2160608 +Ref: 111f2160608 +Ref: whatsnew/2 3 acks2160608 +Ref: 11202160608 +Node: What’s New in Python 2 22161229 +Ref: whatsnew/2 2 doc2161384 +Ref: 11212161384 +Ref: whatsnew/2 2 what-s-new-in-python-2-22161384 +Ref: 11222161384 +Node: Introduction2162119 +Ref: whatsnew/2 2 introduction2162242 +Ref: 11232162242 +Ref: Introduction-Footnote-12163214 +Ref: Introduction-Footnote-22163263 +Node: PEPs 252 and 253 Type and Class Changes2163312 +Ref: whatsnew/2 2 peps-252-and-253-type-and-class-changes2163461 +Ref: 11242163461 +Node: Old and New Classes2166882 +Ref: whatsnew/2 2 old-and-new-classes2166997 +Ref: 11262166997 +Ref: Old and New Classes-Footnote-12169402 +Node: Descriptors2169444 +Ref: whatsnew/2 2 descriptors2169605 +Ref: 11272169605 +Node: Multiple Inheritance The Diamond Rule2173459 +Ref: whatsnew/2 2 multiple-inheritance-the-diamond-rule2173617 +Ref: 11282173617 +Ref: Multiple Inheritance The Diamond Rule-Footnote-12176502 +Node: Attribute Access2176544 +Ref: whatsnew/2 2 attribute-access2176704 +Ref: 11292176704 +Node: Related Links2180475 +Ref: whatsnew/2 2 related-links2180589 +Ref: 112b2180589 +Ref: whatsnew/2 2 sect-rellinks2180589 +Ref: 11252180589 +Ref: Related Links-Footnote-12182090 +Ref: Related Links-Footnote-22182132 +Ref: Related Links-Footnote-32182174 +Ref: Related Links-Footnote-42182216 +Ref: Related Links-Footnote-52182258 +Node: PEP 234 Iterators2182300 +Ref: whatsnew/2 2 pep-234-iterators2182465 +Ref: 112c2182465 +Ref: PEP 234 Iterators-Footnote-12187313 +Node: PEP 255 Simple Generators<2>2187355 +Ref: whatsnew/2 2 pep-255-simple-generators2187527 +Ref: 112f2187527 +Ref: PEP 255 Simple Generators<2>-Footnote-12193585 +Ref: PEP 255 Simple Generators<2>-Footnote-22193627 +Node: PEP 237 Unifying Long Integers and Integers<2>2193669 +Ref: whatsnew/2 2 pep-237-unifying-long-integers-and-integers2193862 +Ref: 11302193862 +Ref: PEP 237 Unifying Long Integers and Integers<2>-Footnote-12195587 +Node: PEP 238 Changing the Division Operator2195629 +Ref: whatsnew/2 2 pep-238-changing-the-division-operator2195809 +Ref: 11312195809 +Ref: PEP 238 Changing the Division Operator-Footnote-12199451 +Ref: PEP 238 Changing the Division Operator-Footnote-22199493 +Ref: PEP 238 Changing the Division Operator-Footnote-32199535 +Node: Unicode Changes2199577 +Ref: whatsnew/2 2 unicode-changes2199732 +Ref: 11322199732 +Ref: Unicode Changes-Footnote-12202364 +Ref: Unicode Changes-Footnote-22202406 +Node: PEP 227 Nested Scopes2202448 +Ref: whatsnew/2 2 pep-227-nested-scopes2202592 +Ref: 11332202592 +Ref: PEP 227 Nested Scopes-Footnote-12206935 +Node: New and Improved Modules<3>2206977 +Ref: whatsnew/2 2 new-and-improved-modules2207135 +Ref: 11342207135 +Ref: New and Improved Modules<3>-Footnote-12213759 +Ref: New and Improved Modules<3>-Footnote-22213818 +Ref: New and Improved Modules<3>-Footnote-32213877 +Ref: New and Improved Modules<3>-Footnote-42213936 +Ref: New and Improved Modules<3>-Footnote-52213995 +Node: Interpreter Changes and Fixes2214053 +Ref: whatsnew/2 2 interpreter-changes-and-fixes2214216 +Ref: 11352214216 +Node: Other Changes and Fixes<3>2219001 +Ref: whatsnew/2 2 other-changes-and-fixes2219156 +Ref: 11472219156 +Ref: Other Changes and Fixes<3>-Footnote-12225824 +Node: Acknowledgements<6>2225866 +Ref: whatsnew/2 2 acknowledgements2225983 +Ref: 114a2225983 +Node: What’s New in Python 2 12226584 +Ref: whatsnew/2 1 doc2226739 +Ref: 114b2226739 +Ref: whatsnew/2 1 what-s-new-in-python-2-12226739 +Ref: 114c2226739 +Node: Introduction<2>2227744 +Ref: whatsnew/2 1 introduction2227855 +Ref: 114d2227855 +Node: PEP 227 Nested Scopes<2>2228951 +Ref: whatsnew/2 1 pep-227-nested-scopes2229100 +Ref: 114e2229100 +Ref: PEP 227 Nested Scopes<2>-Footnote-12233462 +Ref: PEP 227 Nested Scopes<2>-Footnote-22233504 +Ref: PEP 227 Nested Scopes<2>-Footnote-32233546 +Node: PEP 236 __future__ Directives2233588 +Ref: whatsnew/2 1 pep-236-future-directives2233746 +Ref: 114f2233746 +Ref: PEP 236 __future__ Directives-Footnote-12234983 +Node: PEP 207 Rich Comparisons2235025 +Ref: whatsnew/2 1 pep-207-rich-comparisons2235184 +Ref: 11502235184 +Ref: PEP 207 Rich Comparisons-Footnote-12238543 +Ref: PEP 207 Rich Comparisons-Footnote-22238585 +Node: PEP 230 Warning Framework2238627 +Ref: whatsnew/2 1 pep-230-warning-framework2238781 +Ref: 11512238781 +Ref: PEP 230 Warning Framework-Footnote-12242062 +Ref: PEP 230 Warning Framework-Footnote-22242104 +Node: PEP 229 New Build System2242146 +Ref: whatsnew/2 1 pep-229-new-build-system2242299 +Ref: 11532242299 +Ref: PEP 229 New Build System-Footnote-12244219 +Node: PEP 205 Weak References2244261 +Ref: whatsnew/2 1 pep-205-weak-references2244416 +Ref: 11542244416 +Ref: PEP 205 Weak References-Footnote-12247529 +Node: PEP 232 Function Attributes2247571 +Ref: whatsnew/2 1 pep-232-function-attributes2247757 +Ref: 11552247757 +Ref: PEP 232 Function Attributes-Footnote-12249268 +Node: PEP 235 Importing Modules on Case-Insensitive Platforms2249310 +Ref: whatsnew/2 1 pep-235-importing-modules-on-case-insensitive-platforms2249505 +Ref: 11562249505 +Node: PEP 217 Interactive Display Hook2250408 +Ref: whatsnew/2 1 pep-217-interactive-display-hook2250602 +Ref: 11572250602 +Ref: PEP 217 Interactive Display Hook-Footnote-12251531 +Node: PEP 208 New Coercion Model2251573 +Ref: whatsnew/2 1 pep-208-new-coercion-model2251747 +Ref: 11592251747 +Ref: PEP 208 New Coercion Model-Footnote-12253369 +Node: PEP 241 Metadata in Python Packages2253411 +Ref: whatsnew/2 1 pep-241-metadata-in-python-packages2253580 +Ref: 115a2253580 +Ref: PEP 241 Metadata in Python Packages-Footnote-12255697 +Ref: PEP 241 Metadata in Python Packages-Footnote-22255779 +Ref: PEP 241 Metadata in Python Packages-Footnote-32255821 +Ref: PEP 241 Metadata in Python Packages-Footnote-42255863 +Ref: PEP 241 Metadata in Python Packages-Footnote-52255905 +Node: New and Improved Modules<4>2255947 +Ref: whatsnew/2 1 new-and-improved-modules2256116 +Ref: 115b2256116 +Node: Other Changes and Fixes<4>2261951 +Ref: whatsnew/2 1 other-changes-and-fixes2262104 +Ref: 115d2262104 +Node: Acknowledgements<7>2268038 +Ref: whatsnew/2 1 acknowledgements2268155 +Ref: 115e2268155 +Node: What’s New in Python 2 02268446 +Ref: whatsnew/2 0 doc2268584 +Ref: 115f2268584 +Ref: whatsnew/2 0 what-s-new-in-python-2-02268584 +Ref: 11602268584 +Node: Introduction<3>2269257 +Ref: whatsnew/2 0 introduction2269366 +Ref: 11612269366 +Node: What About Python 1 6?2270250 +Ref: whatsnew/2 0 what-about-python-1-62270391 +Ref: 11622270391 +Node: New Development Process2271632 +Ref: whatsnew/2 0 new-development-process2271768 +Ref: 11632271768 +Ref: New Development Process-Footnote-12276908 +Ref: New Development Process-Footnote-22276950 +Ref: New Development Process-Footnote-32276992 +Node: Unicode<2>2277034 +Ref: whatsnew/2 0 unicode2277167 +Ref: 11642277167 +Ref: Unicode<2>-Footnote-12283341 +Node: List Comprehensions2283383 +Ref: whatsnew/2 0 list-comprehensions2283513 +Ref: 11652283513 +Node: Augmented Assignment2287244 +Ref: whatsnew/2 0 augmented-assignment2287378 +Ref: 11662287378 +Node: String Methods2288908 +Ref: whatsnew/2 0 string-methods2289051 +Ref: 11672289051 +Node: Garbage Collection of Cycles2290904 +Ref: whatsnew/2 0 garbage-collection-of-cycles2291045 +Ref: 11682291045 +Node: Other Core Changes2294392 +Ref: whatsnew/2 0 other-core-changes2294533 +Ref: 11692294533 +Node: Minor Language Changes2294818 +Ref: whatsnew/2 0 minor-language-changes2294933 +Ref: 116a2294933 +Node: Changes to Built-in Functions2300019 +Ref: whatsnew/2 0 changes-to-built-in-functions2300134 +Ref: 116e2300134 +Node: Porting to 2 02302426 +Ref: whatsnew/2 0 porting-to-2-02302566 +Ref: 11712302566 +Node: Extending/Embedding Changes2307885 +Ref: whatsnew/2 0 extending-embedding-changes2308047 +Ref: 11722308047 +Node: Distutils Making Modules Easy to Install2311869 +Ref: whatsnew/2 0 distutils-making-modules-easy-to-install2312028 +Ref: 11732312028 +Node: XML Modules2315394 +Ref: whatsnew/2 0 xml-modules2315540 +Ref: 11742315540 +Node: SAX2 Support2316439 +Ref: whatsnew/2 0 sax2-support2316519 +Ref: 11752316519 +Node: DOM Support2318157 +Ref: whatsnew/2 0 dom-support2318267 +Ref: 11762318267 +Node: Relationship to PyXML2321095 +Ref: whatsnew/2 0 relationship-to-pyxml2321184 +Ref: 11772321184 +Node: Module changes2322474 +Ref: whatsnew/2 0 module-changes2322591 +Ref: 11782322591 +Node: New modules2325063 +Ref: whatsnew/2 0 new-modules2325186 +Ref: 11792325186 +Node: IDLE Improvements2329177 +Ref: whatsnew/2 0 idle-improvements2329316 +Ref: 117a2329316 +Node: Deleted and Deprecated Modules2330439 +Ref: whatsnew/2 0 deleted-and-deprecated-modules2330586 +Ref: 117b2330586 +Node: Acknowledgements<8>2331338 +Ref: whatsnew/2 0 acknowledgements2331459 +Ref: 117c2331459 +Ref: Acknowledgements<8>-Footnote-12332058 +Ref: Acknowledgements<8>-Footnote-22332097 +Node: Changelog2332161 +Ref: whatsnew/changelog doc2332264 +Ref: 117d2332264 +Ref: whatsnew/changelog changelog2332264 +Ref: 1582332264 +Ref: whatsnew/changelog id12332264 +Ref: 117e2332264 +Node: Python 3 11 0 final2337031 +Ref: whatsnew/changelog python-3-11-0-final2337138 +Ref: 117f2337138 +Node: Security2337355 +Ref: whatsnew/changelog security2337445 +Ref: 11802337445 +Ref: Security-Footnote-12338530 +Ref: Security-Footnote-22338585 +Ref: Security-Footnote-32338640 +Ref: Security-Footnote-42338712 +Node: Core and Builtins2338782 +Ref: whatsnew/changelog core-and-builtins2338888 +Ref: 11812338888 +Ref: Core and Builtins-Footnote-12340248 +Ref: Core and Builtins-Footnote-22340303 +Ref: Core and Builtins-Footnote-32340358 +Ref: Core and Builtins-Footnote-42340413 +Ref: Core and Builtins-Footnote-52340468 +Ref: Core and Builtins-Footnote-62340523 +Ref: Core and Builtins-Footnote-72340578 +Ref: Core and Builtins-Footnote-82340633 +Ref: Core and Builtins-Footnote-92340675 +Node: Library2340740 +Ref: whatsnew/changelog library2340854 +Ref: 11852340854 +Ref: Library-Footnote-12341592 +Ref: Library-Footnote-22341647 +Ref: Library-Footnote-32341702 +Ref: Library-Footnote-42341757 +Ref: Library-Footnote-52341812 +Node: Documentation<2>2341867 +Ref: whatsnew/changelog documentation2341969 +Ref: 11862341969 +Ref: Documentation<2>-Footnote-12342303 +Ref: Documentation<2>-Footnote-22342358 +Node: Tests2342413 +Ref: whatsnew/changelog tests2342513 +Ref: 11872342513 +Ref: Tests-Footnote-12342850 +Node: Build2342905 +Ref: whatsnew/changelog build2342996 +Ref: 11882342996 +Ref: Build-Footnote-12343218 +Node: Windows2343273 +Ref: whatsnew/changelog windows2343364 +Ref: 11892343364 +Ref: Windows-Footnote-12343965 +Ref: Windows-Footnote-22344020 +Ref: Windows-Footnote-32344075 +Node: macOS2344130 +Ref: whatsnew/changelog macos2344207 +Ref: 118a2344207 +Ref: macOS-Footnote-12344755 +Node: Python 3 11 0 release candidate 22344810 +Ref: whatsnew/changelog python-3-11-0-release-candidate-22344959 +Ref: 118b2344959 +Node: Security<2>2345267 +Ref: whatsnew/changelog id22345377 +Ref: 118c2345377 +Ref: Security<2>-Footnote-12346302 +Ref: Security<2>-Footnote-22346357 +Node: Core and Builtins<2>2346427 +Ref: whatsnew/changelog id32346556 +Ref: 118d2346556 +Ref: Core and Builtins<2>-Footnote-12349083 +Ref: Core and Builtins<2>-Footnote-22349138 +Ref: Core and Builtins<2>-Footnote-32349193 +Ref: Core and Builtins<2>-Footnote-42349248 +Ref: Core and Builtins<2>-Footnote-52349303 +Ref: Core and Builtins<2>-Footnote-62349358 +Ref: Core and Builtins<2>-Footnote-72349413 +Ref: Core and Builtins<2>-Footnote-82349468 +Ref: Core and Builtins<2>-Footnote-92349523 +Ref: Core and Builtins<2>-Footnote-102349578 +Ref: Core and Builtins<2>-Footnote-112349634 +Ref: Core and Builtins<2>-Footnote-122349690 +Ref: Core and Builtins<2>-Footnote-132349746 +Ref: Core and Builtins<2>-Footnote-142349802 +Ref: Core and Builtins<2>-Footnote-152349858 +Ref: Core and Builtins<2>-Footnote-162349914 +Ref: Core and Builtins<2>-Footnote-172349970 +Node: Library<2>2350026 +Ref: whatsnew/changelog id42350160 +Ref: 118e2350160 +Ref: Library<2>-Footnote-12352661 +Ref: Library<2>-Footnote-22352716 +Ref: Library<2>-Footnote-32352771 +Ref: Library<2>-Footnote-42352826 +Ref: Library<2>-Footnote-52352881 +Ref: Library<2>-Footnote-62352936 +Ref: Library<2>-Footnote-72352991 +Ref: Library<2>-Footnote-82353046 +Ref: Library<2>-Footnote-92353101 +Ref: Library<2>-Footnote-102353156 +Ref: Library<2>-Footnote-112353222 +Ref: Library<2>-Footnote-122353278 +Ref: Library<2>-Footnote-132353334 +Ref: Library<2>-Footnote-142353390 +Ref: Library<2>-Footnote-152353446 +Ref: Library<2>-Footnote-162353502 +Node: Documentation<3>2353558 +Ref: whatsnew/changelog id52353680 +Ref: 11942353680 +Ref: Documentation<3>-Footnote-12354109 +Ref: Documentation<3>-Footnote-22354164 +Node: Tests<2>2354219 +Ref: whatsnew/changelog id62354339 +Ref: 11952354339 +Ref: Tests<2>-Footnote-12354604 +Node: Build<2>2354659 +Ref: whatsnew/changelog id72354773 +Ref: 11962354773 +Ref: Build<2>-Footnote-12354894 +Node: Windows<2>2354949 +Ref: whatsnew/changelog id82355046 +Ref: 11972355046 +Ref: Windows<2>-Footnote-12355370 +Ref: Windows<2>-Footnote-22355425 +Node: Python 3 11 0 release candidate 12355480 +Ref: whatsnew/changelog python-3-11-0-release-candidate-12355630 +Ref: 11982355630 +Node: Core and Builtins<3>2355940 +Ref: whatsnew/changelog id92356049 +Ref: 11992356049 +Ref: Core and Builtins<3>-Footnote-12357509 +Ref: Core and Builtins<3>-Footnote-22357564 +Ref: Core and Builtins<3>-Footnote-32357619 +Ref: Core and Builtins<3>-Footnote-42357674 +Ref: Core and Builtins<3>-Footnote-52357729 +Ref: Core and Builtins<3>-Footnote-62357784 +Ref: Core and Builtins<3>-Footnote-72357839 +Node: Library<3>2357894 +Ref: whatsnew/changelog id102358028 +Ref: 119a2358028 +Ref: Library<3>-Footnote-12359601 +Ref: Library<3>-Footnote-22359656 +Ref: Library<3>-Footnote-32359711 +Ref: Library<3>-Footnote-42359766 +Ref: Library<3>-Footnote-52359821 +Ref: Library<3>-Footnote-62359876 +Ref: Library<3>-Footnote-72359931 +Ref: Library<3>-Footnote-82359986 +Ref: Library<3>-Footnote-92360041 +Ref: Library<3>-Footnote-102360096 +Node: Documentation<4>2360152 +Ref: whatsnew/changelog id112360274 +Ref: 119f2360274 +Ref: Documentation<4>-Footnote-12361004 +Ref: Documentation<4>-Footnote-22361059 +Ref: Documentation<4>-Footnote-32361114 +Ref: Documentation<4>-Footnote-42361169 +Node: Tests<3>2361224 +Ref: whatsnew/changelog id122361344 +Ref: 11a12361344 +Ref: Tests<3>-Footnote-12362090 +Ref: Tests<3>-Footnote-22362145 +Ref: Tests<3>-Footnote-32362232 +Ref: Tests<3>-Footnote-42362287 +Node: Build<3>2362342 +Ref: whatsnew/changelog id132362456 +Ref: 11a32362456 +Ref: Build<3>-Footnote-12363354 +Ref: Build<3>-Footnote-22363409 +Ref: Build<3>-Footnote-32363464 +Ref: Build<3>-Footnote-42363519 +Ref: Build<3>-Footnote-52363574 +Ref: Build<3>-Footnote-62363629 +Ref: Build<3>-Footnote-72363684 +Node: Windows<3>2363726 +Ref: whatsnew/changelog id142363839 +Ref: 11a42363839 +Ref: Windows<3>-Footnote-12364915 +Ref: Windows<3>-Footnote-22364970 +Ref: Windows<3>-Footnote-32365025 +Ref: Windows<3>-Footnote-42365080 +Ref: Windows<3>-Footnote-52365135 +Ref: Windows<3>-Footnote-62365190 +Node: IDLE<3>2365245 +Ref: whatsnew/changelog idle2365355 +Ref: 11a52365355 +Ref: IDLE<3>-Footnote-12366027 +Ref: IDLE<3>-Footnote-22366082 +Ref: IDLE<3>-Footnote-32366137 +Ref: IDLE<3>-Footnote-42366192 +Ref: IDLE<3>-Footnote-52366247 +Ref: IDLE<3>-Footnote-62366302 +Node: C API2366357 +Ref: whatsnew/changelog c-api2366448 +Ref: 11a62366448 +Ref: C API-Footnote-12366916 +Ref: C API-Footnote-22366971 +Node: Python 3 11 0 beta 52367026 +Ref: whatsnew/changelog python-3-11-0-beta-52367163 +Ref: 11a72367163 +Node: Core and Builtins<4>2367404 +Ref: whatsnew/changelog id152367500 +Ref: 11a82367500 +Ref: Core and Builtins<4>-Footnote-12369973 +Ref: Core and Builtins<4>-Footnote-22370028 +Ref: Core and Builtins<4>-Footnote-32370083 +Ref: Core and Builtins<4>-Footnote-42370138 +Ref: Core and Builtins<4>-Footnote-52370193 +Ref: Core and Builtins<4>-Footnote-62370248 +Ref: Core and Builtins<4>-Footnote-72370303 +Ref: Core and Builtins<4>-Footnote-82370358 +Ref: Core and Builtins<4>-Footnote-92370413 +Ref: Core and Builtins<4>-Footnote-102370468 +Ref: Core and Builtins<4>-Footnote-112370524 +Ref: Core and Builtins<4>-Footnote-122370580 +Ref: Core and Builtins<4>-Footnote-132370636 +Ref: Core and Builtins<4>-Footnote-142370692 +Node: Library<4>2370748 +Ref: whatsnew/changelog id162370861 +Ref: 11aa2370861 +Ref: Library<4>-Footnote-12372184 +Ref: Library<4>-Footnote-22372239 +Ref: Library<4>-Footnote-32372294 +Ref: Library<4>-Footnote-42372349 +Ref: Library<4>-Footnote-52372404 +Ref: Library<4>-Footnote-62372459 +Ref: Library<4>-Footnote-72372514 +Ref: Library<4>-Footnote-82372569 +Ref: Library<4>-Footnote-92372624 +Ref: Library<4>-Footnote-102372679 +Ref: Library<4>-Footnote-112372735 +Node: Tests<4>2372801 +Ref: whatsnew/changelog id172372902 +Ref: 11ab2372902 +Ref: Tests<4>-Footnote-12373073 +Node: Build<4>2373128 +Ref: whatsnew/changelog id182373229 +Ref: 11ac2373229 +Ref: Build<4>-Footnote-12373867 +Ref: Build<4>-Footnote-22373922 +Ref: Build<4>-Footnote-32373977 +Ref: Build<4>-Footnote-42374032 +Node: Windows<4>2374087 +Ref: whatsnew/changelog id192374188 +Ref: 11ad2374188 +Ref: Windows<4>-Footnote-12374448 +Ref: Windows<4>-Footnote-22374503 +Node: C API<2>2374558 +Ref: whatsnew/changelog id202374642 +Ref: 11ae2374642 +Ref: C API<2>-Footnote-12375548 +Ref: C API<2>-Footnote-22375603 +Ref: C API<2>-Footnote-32375658 +Ref: C API<2>-Footnote-42375713 +Node: Python 3 11 0 beta 42375768 +Ref: whatsnew/changelog python-3-11-0-beta-42375892 +Ref: 11af2375892 +Node: Security<3>2376209 +Ref: whatsnew/changelog id212376306 +Ref: 11b02376306 +Ref: Security<3>-Footnote-12377129 +Ref: Security<3>-Footnote-22377184 +Ref: Security<3>-Footnote-32377239 +Ref: Security<3>-Footnote-42377294 +Node: Core and Builtins<5>2377349 +Ref: whatsnew/changelog id222377465 +Ref: 11b12377465 +Ref: Core and Builtins<5>-Footnote-12382449 +Ref: Core and Builtins<5>-Footnote-22382504 +Ref: Core and Builtins<5>-Footnote-32382559 +Ref: Core and Builtins<5>-Footnote-42382614 +Ref: Core and Builtins<5>-Footnote-52382669 +Ref: Core and Builtins<5>-Footnote-62382724 +Ref: Core and Builtins<5>-Footnote-72382766 +Ref: Core and Builtins<5>-Footnote-82382821 +Ref: Core and Builtins<5>-Footnote-92382876 +Ref: Core and Builtins<5>-Footnote-102382931 +Ref: Core and Builtins<5>-Footnote-112382987 +Ref: Core and Builtins<5>-Footnote-122383043 +Ref: Core and Builtins<5>-Footnote-132383099 +Ref: Core and Builtins<5>-Footnote-142383155 +Ref: Core and Builtins<5>-Footnote-152383211 +Ref: Core and Builtins<5>-Footnote-162383267 +Ref: Core and Builtins<5>-Footnote-172383323 +Ref: Core and Builtins<5>-Footnote-182383379 +Ref: Core and Builtins<5>-Footnote-192383435 +Ref: Core and Builtins<5>-Footnote-202383491 +Ref: Core and Builtins<5>-Footnote-212383547 +Ref: Core and Builtins<5>-Footnote-222383603 +Ref: Core and Builtins<5>-Footnote-232383659 +Ref: Core and Builtins<5>-Footnote-242383715 +Ref: Core and Builtins<5>-Footnote-252383771 +Ref: Core and Builtins<5>-Footnote-262383827 +Ref: Core and Builtins<5>-Footnote-272383883 +Ref: Core and Builtins<5>-Footnote-282383939 +Ref: Core and Builtins<5>-Footnote-292383995 +Node: Library<5>2384061 +Ref: whatsnew/changelog id232384182 +Ref: 11b22384182 +Ref: Library<5>-Footnote-12392000 +Ref: Library<5>-Footnote-22392055 +Ref: Library<5>-Footnote-32392110 +Ref: Library<5>-Footnote-42392165 +Ref: Library<5>-Footnote-52392220 +Ref: Library<5>-Footnote-62392275 +Ref: Library<5>-Footnote-72392330 +Ref: Library<5>-Footnote-82392385 +Ref: Library<5>-Footnote-92392440 +Ref: Library<5>-Footnote-102392495 +Ref: Library<5>-Footnote-112392551 +Ref: Library<5>-Footnote-122392607 +Ref: Library<5>-Footnote-132392663 +Ref: Library<5>-Footnote-142392719 +Ref: Library<5>-Footnote-152392775 +Ref: Library<5>-Footnote-162392831 +Ref: Library<5>-Footnote-172392887 +Ref: Library<5>-Footnote-182392943 +Ref: Library<5>-Footnote-192392999 +Ref: Library<5>-Footnote-202393055 +Ref: Library<5>-Footnote-212393111 +Ref: Library<5>-Footnote-222393167 +Ref: Library<5>-Footnote-232393223 +Ref: Library<5>-Footnote-242393279 +Ref: Library<5>-Footnote-252393322 +Ref: Library<5>-Footnote-262393378 +Ref: Library<5>-Footnote-272393434 +Ref: Library<5>-Footnote-282393490 +Ref: Library<5>-Footnote-292393546 +Ref: Library<5>-Footnote-302393602 +Ref: Library<5>-Footnote-312393658 +Ref: Library<5>-Footnote-322393714 +Ref: Library<5>-Footnote-332393770 +Ref: Library<5>-Footnote-342393826 +Ref: Library<5>-Footnote-352393882 +Ref: Library<5>-Footnote-362393938 +Ref: Library<5>-Footnote-372393994 +Ref: Library<5>-Footnote-382394050 +Ref: Library<5>-Footnote-392394106 +Ref: Library<5>-Footnote-402394172 +Ref: Library<5>-Footnote-412394238 +Ref: Library<5>-Footnote-422394304 +Ref: Library<5>-Footnote-432394370 +Node: Documentation<5>2394436 +Ref: whatsnew/changelog id242394545 +Ref: 11bb2394545 +Ref: Documentation<5>-Footnote-12395372 +Ref: Documentation<5>-Footnote-22395427 +Ref: Documentation<5>-Footnote-32395469 +Ref: Documentation<5>-Footnote-42395524 +Ref: Documentation<5>-Footnote-52395579 +Ref: Documentation<5>-Footnote-62395634 +Ref: Documentation<5>-Footnote-72395689 +Node: Tests<5>2395754 +Ref: whatsnew/changelog id252395861 +Ref: 11be2395861 +Ref: Tests<5>-Footnote-12398062 +Ref: Tests<5>-Footnote-22398117 +Ref: Tests<5>-Footnote-32398172 +Ref: Tests<5>-Footnote-42398227 +Ref: Tests<5>-Footnote-52398282 +Ref: Tests<5>-Footnote-62398337 +Ref: Tests<5>-Footnote-72398392 +Ref: Tests<5>-Footnote-82398447 +Ref: Tests<5>-Footnote-92398502 +Ref: Tests<5>-Footnote-102398557 +Ref: Tests<5>-Footnote-112398613 +Ref: Tests<5>-Footnote-122398669 +Ref: Tests<5>-Footnote-132398725 +Ref: Tests<5>-Footnote-142398781 +Ref: Tests<5>-Footnote-152398837 +Ref: Tests<5>-Footnote-162398893 +Node: Build<5>2398959 +Ref: whatsnew/changelog id262399060 +Ref: 11c12399060 +Ref: Build<5>-Footnote-12399648 +Ref: Build<5>-Footnote-22399703 +Ref: Build<5>-Footnote-32399758 +Ref: Build<5>-Footnote-42399813 +Node: Windows<5>2399855 +Ref: whatsnew/changelog id272399959 +Ref: 11c22399959 +Ref: Windows<5>-Footnote-12400390 +Ref: Windows<5>-Footnote-22400445 +Node: Tools/Demos2400510 +Ref: whatsnew/changelog tools-demos2400614 +Ref: 11c42400614 +Ref: Tools/Demos-Footnote-12400945 +Ref: Tools/Demos-Footnote-22401000 +Node: C API<3>2401055 +Ref: whatsnew/changelog id282401140 +Ref: 11c52401140 +Ref: C API<3>-Footnote-12402252 +Ref: C API<3>-Footnote-22402307 +Ref: C API<3>-Footnote-32402362 +Ref: C API<3>-Footnote-42402417 +Node: Python 3 11 0 beta 32402472 +Ref: whatsnew/changelog python-3-11-0-beta-32402596 +Ref: 11c62402596 +Node: Core and Builtins<6>2402753 +Ref: whatsnew/changelog id292402847 +Ref: 11c72402847 +Ref: Core and Builtins<6>-Footnote-12403195 +Ref: Core and Builtins<6>-Footnote-22403250 +Node: Build<6>2403305 +Ref: whatsnew/changelog id302403399 +Ref: 11c82403399 +Ref: Build<6>-Footnote-12403559 +Node: Python 3 11 0 beta 22403614 +Ref: whatsnew/changelog python-3-11-0-beta-22403738 +Ref: 11c92403738 +Node: Core and Builtins<7>2404014 +Ref: whatsnew/changelog id312404110 +Ref: 11ca2404110 +Ref: Core and Builtins<7>-Footnote-12405494 +Ref: Core and Builtins<7>-Footnote-22405549 +Ref: Core and Builtins<7>-Footnote-32405604 +Ref: Core and Builtins<7>-Footnote-42405659 +Ref: Core and Builtins<7>-Footnote-52405714 +Ref: Core and Builtins<7>-Footnote-62405773 +Ref: Core and Builtins<7>-Footnote-72405828 +Ref: Core and Builtins<7>-Footnote-82405883 +Ref: Core and Builtins<7>-Footnote-92405938 +Ref: Core and Builtins<7>-Footnote-102405993 +Node: Library<6>2406049 +Ref: whatsnew/changelog id322406170 +Ref: 11cb2406170 +Ref: Library<6>-Footnote-12410685 +Ref: Library<6>-Footnote-22410740 +Ref: Library<6>-Footnote-32410795 +Ref: Library<6>-Footnote-42410850 +Ref: Library<6>-Footnote-52410905 +Ref: Library<6>-Footnote-62410960 +Ref: Library<6>-Footnote-72411015 +Ref: Library<6>-Footnote-82411070 +Ref: Library<6>-Footnote-92411125 +Ref: Library<6>-Footnote-102411180 +Ref: Library<6>-Footnote-112411236 +Ref: Library<6>-Footnote-122411292 +Ref: Library<6>-Footnote-132411348 +Ref: Library<6>-Footnote-142411404 +Ref: Library<6>-Footnote-152411460 +Ref: Library<6>-Footnote-162411516 +Ref: Library<6>-Footnote-172411572 +Ref: Library<6>-Footnote-182411628 +Ref: Library<6>-Footnote-192411684 +Ref: Library<6>-Footnote-202411750 +Ref: Library<6>-Footnote-212411816 +Ref: Library<6>-Footnote-222411882 +Ref: Library<6>-Footnote-232411948 +Node: Documentation<6>2412014 +Ref: whatsnew/changelog id332412123 +Ref: 11d32412123 +Ref: Documentation<6>-Footnote-12412832 +Ref: Documentation<6>-Footnote-22412887 +Ref: Documentation<6>-Footnote-32412942 +Ref: Documentation<6>-Footnote-42413007 +Ref: Documentation<6>-Footnote-52413072 +Node: Tests<6>2413137 +Ref: whatsnew/changelog id342413244 +Ref: 11d72413244 +Ref: Tests<6>-Footnote-12413581 +Node: Build<7>2413636 +Ref: whatsnew/changelog id352413737 +Ref: 11d82413737 +Ref: Build<7>-Footnote-12414003 +Ref: Build<7>-Footnote-22414058 +Node: Windows<6>2414123 +Ref: whatsnew/changelog id362414224 +Ref: 11d92414224 +Ref: Windows<6>-Footnote-12414815 +Ref: Windows<6>-Footnote-22414870 +Ref: Windows<6>-Footnote-32414925 +Ref: Windows<6>-Footnote-42414980 +Node: C API<4>2415045 +Ref: whatsnew/changelog id372415129 +Ref: 11da2415129 +Ref: C API<4>-Footnote-12415704 +Ref: C API<4>-Footnote-22415759 +Ref: C API<4>-Footnote-32415814 +Node: Python 3 11 0 beta 12415869 +Ref: whatsnew/changelog python-3-11-0-beta-12415994 +Ref: 11db2415994 +Node: Security<4>2416345 +Ref: whatsnew/changelog id382416442 +Ref: 11dc2416442 +Ref: Security<4>-Footnote-12416739 +Node: Core and Builtins<8>2416794 +Ref: whatsnew/changelog id392416910 +Ref: 11dd2416910 +Ref: Core and Builtins<8>-Footnote-12426382 +Ref: Core and Builtins<8>-Footnote-22426437 +Ref: Core and Builtins<8>-Footnote-32426502 +Ref: Core and Builtins<8>-Footnote-42426557 +Ref: Core and Builtins<8>-Footnote-52426622 +Ref: Core and Builtins<8>-Footnote-62426677 +Ref: Core and Builtins<8>-Footnote-72426732 +Ref: Core and Builtins<8>-Footnote-82426787 +Ref: Core and Builtins<8>-Footnote-92426842 +Ref: Core and Builtins<8>-Footnote-102426897 +Ref: Core and Builtins<8>-Footnote-112426953 +Ref: Core and Builtins<8>-Footnote-122427009 +Ref: Core and Builtins<8>-Footnote-132427065 +Ref: Core and Builtins<8>-Footnote-142427121 +Ref: Core and Builtins<8>-Footnote-152427164 +Ref: Core and Builtins<8>-Footnote-162427220 +Ref: Core and Builtins<8>-Footnote-172427276 +Ref: Core and Builtins<8>-Footnote-182427332 +Ref: Core and Builtins<8>-Footnote-192427388 +Ref: Core and Builtins<8>-Footnote-202427444 +Ref: Core and Builtins<8>-Footnote-212427500 +Ref: Core and Builtins<8>-Footnote-222427566 +Ref: Core and Builtins<8>-Footnote-232427622 +Ref: Core and Builtins<8>-Footnote-242427678 +Ref: Core and Builtins<8>-Footnote-252427734 +Ref: Core and Builtins<8>-Footnote-262427790 +Ref: Core and Builtins<8>-Footnote-272427846 +Ref: Core and Builtins<8>-Footnote-282427902 +Ref: Core and Builtins<8>-Footnote-292427958 +Ref: Core and Builtins<8>-Footnote-302428014 +Ref: Core and Builtins<8>-Footnote-312428070 +Ref: Core and Builtins<8>-Footnote-322428126 +Ref: Core and Builtins<8>-Footnote-332428169 +Ref: Core and Builtins<8>-Footnote-342428225 +Ref: Core and Builtins<8>-Footnote-352428281 +Ref: Core and Builtins<8>-Footnote-362428337 +Ref: Core and Builtins<8>-Footnote-372428403 +Ref: Core and Builtins<8>-Footnote-382428459 +Ref: Core and Builtins<8>-Footnote-392428515 +Ref: Core and Builtins<8>-Footnote-402428581 +Ref: Core and Builtins<8>-Footnote-412428647 +Ref: Core and Builtins<8>-Footnote-422428713 +Ref: Core and Builtins<8>-Footnote-432428779 +Ref: Core and Builtins<8>-Footnote-442428845 +Ref: Core and Builtins<8>-Footnote-452428911 +Ref: Core and Builtins<8>-Footnote-462428977 +Ref: Core and Builtins<8>-Footnote-472429043 +Ref: Core and Builtins<8>-Footnote-482429109 +Ref: Core and Builtins<8>-Footnote-492429175 +Ref: Core and Builtins<8>-Footnote-502429241 +Ref: Core and Builtins<8>-Footnote-512429307 +Ref: Core and Builtins<8>-Footnote-522429373 +Ref: Core and Builtins<8>-Footnote-532429439 +Ref: Core and Builtins<8>-Footnote-542429505 +Node: Library<7>2429571 +Ref: whatsnew/changelog id402429692 +Ref: 11e02429692 +Ref: Library<7>-Footnote-12447173 +Ref: Library<7>-Footnote-22447228 +Ref: Library<7>-Footnote-32447283 +Ref: Library<7>-Footnote-42447338 +Ref: Library<7>-Footnote-52447393 +Ref: Library<7>-Footnote-62447448 +Ref: Library<7>-Footnote-72447503 +Ref: Library<7>-Footnote-82447558 +Ref: Library<7>-Footnote-92447613 +Ref: Library<7>-Footnote-102447668 +Ref: Library<7>-Footnote-112447724 +Ref: Library<7>-Footnote-122447780 +Ref: Library<7>-Footnote-132447836 +Ref: Library<7>-Footnote-142447892 +Ref: Library<7>-Footnote-152447948 +Ref: Library<7>-Footnote-162448004 +Ref: Library<7>-Footnote-172448060 +Ref: Library<7>-Footnote-182448116 +Ref: Library<7>-Footnote-192448172 +Ref: Library<7>-Footnote-202448228 +Ref: Library<7>-Footnote-212448284 +Ref: Library<7>-Footnote-222448340 +Ref: Library<7>-Footnote-232448396 +Ref: Library<7>-Footnote-242448462 +Ref: Library<7>-Footnote-252448518 +Ref: Library<7>-Footnote-262448574 +Ref: Library<7>-Footnote-272448617 +Ref: Library<7>-Footnote-282448673 +Ref: Library<7>-Footnote-292448729 +Ref: Library<7>-Footnote-302448785 +Ref: Library<7>-Footnote-312448841 +Ref: Library<7>-Footnote-322448884 +Ref: Library<7>-Footnote-332448940 +Ref: Library<7>-Footnote-342448996 +Ref: Library<7>-Footnote-352449052 +Ref: Library<7>-Footnote-362449108 +Ref: Library<7>-Footnote-372449164 +Ref: Library<7>-Footnote-382449220 +Ref: Library<7>-Footnote-392449276 +Ref: Library<7>-Footnote-402449332 +Ref: Library<7>-Footnote-412449388 +Ref: Library<7>-Footnote-422449444 +Ref: Library<7>-Footnote-432449500 +Ref: Library<7>-Footnote-442449556 +Ref: Library<7>-Footnote-452449612 +Ref: Library<7>-Footnote-462449668 +Ref: Library<7>-Footnote-472449724 +Ref: Library<7>-Footnote-482449780 +Ref: Library<7>-Footnote-492449836 +Ref: Library<7>-Footnote-502449892 +Ref: Library<7>-Footnote-512449948 +Ref: Library<7>-Footnote-522450004 +Ref: Library<7>-Footnote-532450060 +Ref: Library<7>-Footnote-542450116 +Ref: Library<7>-Footnote-552450172 +Ref: Library<7>-Footnote-562450238 +Ref: Library<7>-Footnote-572450294 +Ref: Library<7>-Footnote-582450350 +Ref: Library<7>-Footnote-592450406 +Ref: Library<7>-Footnote-602450462 +Ref: Library<7>-Footnote-612450518 +Ref: Library<7>-Footnote-622450574 +Ref: Library<7>-Footnote-632450630 +Ref: Library<7>-Footnote-642450686 +Ref: Library<7>-Footnote-652450742 +Ref: Library<7>-Footnote-662450785 +Ref: Library<7>-Footnote-672450841 +Ref: Library<7>-Footnote-682450897 +Ref: Library<7>-Footnote-692450953 +Ref: Library<7>-Footnote-702451009 +Ref: Library<7>-Footnote-712451065 +Ref: Library<7>-Footnote-722451121 +Ref: Library<7>-Footnote-732451177 +Ref: Library<7>-Footnote-742451233 +Ref: Library<7>-Footnote-752451299 +Ref: Library<7>-Footnote-762451355 +Ref: Library<7>-Footnote-772451411 +Ref: Library<7>-Footnote-782451477 +Ref: Library<7>-Footnote-792451543 +Ref: Library<7>-Footnote-802451586 +Ref: Library<7>-Footnote-812451652 +Ref: Library<7>-Footnote-822451718 +Ref: Library<7>-Footnote-832451784 +Ref: Library<7>-Footnote-842451850 +Ref: Library<7>-Footnote-852451916 +Ref: Library<7>-Footnote-862451982 +Ref: Library<7>-Footnote-872452048 +Ref: Library<7>-Footnote-882452114 +Ref: Library<7>-Footnote-892452180 +Ref: Library<7>-Footnote-902452246 +Ref: Library<7>-Footnote-912452312 +Ref: Library<7>-Footnote-922452378 +Ref: Library<7>-Footnote-932452444 +Ref: Library<7>-Footnote-942452510 +Ref: Library<7>-Footnote-952452576 +Ref: Library<7>-Footnote-962452642 +Ref: Library<7>-Footnote-972452708 +Ref: Library<7>-Footnote-982452774 +Ref: Library<7>-Footnote-992452840 +Ref: Library<7>-Footnote-1002452906 +Ref: Library<7>-Footnote-1012452973 +Ref: Library<7>-Footnote-1022453040 +Ref: Library<7>-Footnote-1032453107 +Ref: Library<7>-Footnote-1042453174 +Ref: Library<7>-Footnote-1052453241 +Ref: Library<7>-Footnote-1062453308 +Ref: Library<7>-Footnote-1072453375 +Ref: Library<7>-Footnote-1082453442 +Ref: Library<7>-Footnote-1092453509 +Ref: Library<7>-Footnote-1102453576 +Ref: Library<7>-Footnote-1112453643 +Ref: Library<7>-Footnote-1122453710 +Ref: Library<7>-Footnote-1132453777 +Ref: Library<7>-Footnote-1142453844 +Ref: Library<7>-Footnote-1152453911 +Ref: Library<7>-Footnote-1162453978 +Ref: Library<7>-Footnote-1172454045 +Ref: Library<7>-Footnote-1182454112 +Node: Documentation<7>2454179 +Ref: whatsnew/changelog id412454288 +Ref: 11f12454288 +Ref: Documentation<7>-Footnote-12455839 +Ref: Documentation<7>-Footnote-22455894 +Ref: Documentation<7>-Footnote-32455949 +Ref: Documentation<7>-Footnote-42456004 +Ref: Documentation<7>-Footnote-52456059 +Ref: Documentation<7>-Footnote-62456124 +Ref: Documentation<7>-Footnote-72456189 +Ref: Documentation<7>-Footnote-82456254 +Ref: Documentation<7>-Footnote-92456319 +Ref: Documentation<7>-Footnote-102456361 +Ref: Documentation<7>-Footnote-112456404 +Ref: Documentation<7>-Footnote-122456470 +Ref: Documentation<7>-Footnote-132456536 +Ref: Documentation<7>-Footnote-142456609 +Node: Tests<7>2456675 +Ref: whatsnew/changelog id422456782 +Ref: 11f32456782 +Ref: Tests<7>-Footnote-12458122 +Ref: Tests<7>-Footnote-22458177 +Ref: Tests<7>-Footnote-32458232 +Ref: Tests<7>-Footnote-42458287 +Ref: Tests<7>-Footnote-52458342 +Ref: Tests<7>-Footnote-62458397 +Ref: Tests<7>-Footnote-72458462 +Ref: Tests<7>-Footnote-82458527 +Node: Build<8>2458592 +Ref: whatsnew/changelog id432458693 +Ref: 11f62458693 +Ref: Build<8>-Footnote-12459318 +Ref: Build<8>-Footnote-22459373 +Ref: Build<8>-Footnote-32459428 +Ref: Build<8>-Footnote-42459493 +Node: Windows<7>2459558 +Ref: whatsnew/changelog id442459659 +Ref: 11f72459659 +Ref: Windows<7>-Footnote-12460291 +Ref: Windows<7>-Footnote-22460356 +Ref: Windows<7>-Footnote-32460421 +Ref: Windows<7>-Footnote-42460486 +Ref: Windows<7>-Footnote-52460551 +Node: macOS<2>2460616 +Ref: whatsnew/changelog id452460723 +Ref: 11f82460723 +Ref: macOS<2>-Footnote-12460851 +Node: Tools/Demos<2>2460916 +Ref: whatsnew/changelog id462461021 +Ref: 11f92461021 +Ref: Tools/Demos<2>-Footnote-12461576 +Ref: Tools/Demos<2>-Footnote-22461631 +Ref: Tools/Demos<2>-Footnote-32461686 +Node: C API<5>2461741 +Ref: whatsnew/changelog id472461829 +Ref: 11fa2461829 +Ref: C API<5>-Footnote-12464017 +Ref: C API<5>-Footnote-22464072 +Ref: C API<5>-Footnote-32464127 +Ref: C API<5>-Footnote-42464182 +Ref: C API<5>-Footnote-52464237 +Ref: C API<5>-Footnote-62464292 +Ref: C API<5>-Footnote-72464334 +Ref: C API<5>-Footnote-82464389 +Ref: C API<5>-Footnote-92464444 +Ref: C API<5>-Footnote-102464509 +Ref: C API<5>-Footnote-112464575 +Ref: C API<5>-Footnote-122464641 +Ref: C API<5>-Footnote-132464707 +Node: Python 3 11 0 alpha 72464773 +Ref: whatsnew/changelog python-3-11-0-alpha-72464899 +Ref: 11fe2464899 +Node: Core and Builtins<9>2465227 +Ref: whatsnew/changelog id482465324 +Ref: 11ff2465324 +Ref: Core and Builtins<9>-Footnote-12470863 +Ref: Core and Builtins<9>-Footnote-22470928 +Ref: Core and Builtins<9>-Footnote-32470993 +Ref: Core and Builtins<9>-Footnote-42471058 +Ref: Core and Builtins<9>-Footnote-52471123 +Ref: Core and Builtins<9>-Footnote-62471188 +Ref: Core and Builtins<9>-Footnote-72471253 +Ref: Core and Builtins<9>-Footnote-82471318 +Ref: Core and Builtins<9>-Footnote-92471383 +Ref: Core and Builtins<9>-Footnote-102471448 +Ref: Core and Builtins<9>-Footnote-112471514 +Ref: Core and Builtins<9>-Footnote-122471580 +Ref: Core and Builtins<9>-Footnote-132471646 +Ref: Core and Builtins<9>-Footnote-142471712 +Ref: Core and Builtins<9>-Footnote-152471778 +Ref: Core and Builtins<9>-Footnote-162471844 +Ref: Core and Builtins<9>-Footnote-172471910 +Ref: Core and Builtins<9>-Footnote-182471976 +Ref: Core and Builtins<9>-Footnote-192472042 +Ref: Core and Builtins<9>-Footnote-202472108 +Ref: Core and Builtins<9>-Footnote-212472174 +Ref: Core and Builtins<9>-Footnote-222472240 +Ref: Core and Builtins<9>-Footnote-232472306 +Ref: Core and Builtins<9>-Footnote-242472372 +Ref: Core and Builtins<9>-Footnote-252472438 +Ref: Core and Builtins<9>-Footnote-262472504 +Ref: Core and Builtins<9>-Footnote-272472570 +Ref: Core and Builtins<9>-Footnote-282472636 +Ref: Core and Builtins<9>-Footnote-292472702 +Ref: Core and Builtins<9>-Footnote-302472768 +Ref: Core and Builtins<9>-Footnote-312472834 +Ref: Core and Builtins<9>-Footnote-322472900 +Ref: Core and Builtins<9>-Footnote-332472966 +Node: Library<8>2473032 +Ref: whatsnew/changelog id492473154 +Ref: 12042473154 +Ref: Library<8>-Footnote-12487330 +Ref: Library<8>-Footnote-22487395 +Ref: Library<8>-Footnote-32487460 +Ref: Library<8>-Footnote-42487525 +Ref: Library<8>-Footnote-52487590 +Ref: Library<8>-Footnote-62487655 +Ref: Library<8>-Footnote-72487719 +Ref: Library<8>-Footnote-82487784 +Ref: Library<8>-Footnote-92487849 +Ref: Library<8>-Footnote-102487914 +Ref: Library<8>-Footnote-112487980 +Ref: Library<8>-Footnote-122488046 +Ref: Library<8>-Footnote-132488112 +Ref: Library<8>-Footnote-142488178 +Ref: Library<8>-Footnote-152488221 +Ref: Library<8>-Footnote-162488287 +Ref: Library<8>-Footnote-172488353 +Ref: Library<8>-Footnote-182488419 +Ref: Library<8>-Footnote-192488462 +Ref: Library<8>-Footnote-202488528 +Ref: Library<8>-Footnote-212488594 +Ref: Library<8>-Footnote-222488660 +Ref: Library<8>-Footnote-232488703 +Ref: Library<8>-Footnote-242488769 +Ref: Library<8>-Footnote-252488835 +Ref: Library<8>-Footnote-262488901 +Ref: Library<8>-Footnote-272488967 +Ref: Library<8>-Footnote-282489033 +Ref: Library<8>-Footnote-292489099 +Ref: Library<8>-Footnote-302489166 +Ref: Library<8>-Footnote-312489232 +Ref: Library<8>-Footnote-322489298 +Ref: Library<8>-Footnote-332489364 +Ref: Library<8>-Footnote-342489430 +Ref: Library<8>-Footnote-352489473 +Ref: Library<8>-Footnote-362489539 +Ref: Library<8>-Footnote-372489605 +Ref: Library<8>-Footnote-382489670 +Ref: Library<8>-Footnote-392489736 +Ref: Library<8>-Footnote-402489802 +Ref: Library<8>-Footnote-412489868 +Ref: Library<8>-Footnote-422489934 +Ref: Library<8>-Footnote-432489977 +Ref: Library<8>-Footnote-442490043 +Ref: Library<8>-Footnote-452490109 +Ref: Library<8>-Footnote-462490175 +Ref: Library<8>-Footnote-472490241 +Ref: Library<8>-Footnote-482490307 +Ref: Library<8>-Footnote-492490373 +Ref: Library<8>-Footnote-502490439 +Ref: Library<8>-Footnote-512490505 +Ref: Library<8>-Footnote-522490571 +Ref: Library<8>-Footnote-532490637 +Ref: Library<8>-Footnote-542490703 +Ref: Library<8>-Footnote-552490769 +Ref: Library<8>-Footnote-562490835 +Ref: Library<8>-Footnote-572490901 +Ref: Library<8>-Footnote-582490967 +Ref: Library<8>-Footnote-592491033 +Ref: Library<8>-Footnote-602491076 +Ref: Library<8>-Footnote-612491143 +Ref: Library<8>-Footnote-622491209 +Ref: Library<8>-Footnote-632491275 +Ref: Library<8>-Footnote-642491341 +Ref: Library<8>-Footnote-652491407 +Ref: Library<8>-Footnote-662491473 +Ref: Library<8>-Footnote-672491539 +Ref: Library<8>-Footnote-682491605 +Ref: Library<8>-Footnote-692491671 +Ref: Library<8>-Footnote-702491737 +Ref: Library<8>-Footnote-712491803 +Ref: Library<8>-Footnote-722491869 +Ref: Library<8>-Footnote-732491935 +Ref: Library<8>-Footnote-742492001 +Ref: Library<8>-Footnote-752492067 +Ref: Library<8>-Footnote-762492133 +Ref: Library<8>-Footnote-772492199 +Ref: Library<8>-Footnote-782492265 +Ref: Library<8>-Footnote-792492331 +Ref: Library<8>-Footnote-802492397 +Ref: Library<8>-Footnote-812492463 +Ref: Library<8>-Footnote-822492529 +Ref: Library<8>-Footnote-832492595 +Ref: Library<8>-Footnote-842492638 +Ref: Library<8>-Footnote-852492704 +Ref: Library<8>-Footnote-862492770 +Ref: Library<8>-Footnote-872492836 +Ref: Library<8>-Footnote-882492902 +Node: Documentation<8>2492968 +Ref: whatsnew/changelog id502493078 +Ref: 12162493078 +Ref: Documentation<8>-Footnote-12494213 +Ref: Documentation<8>-Footnote-22494278 +Ref: Documentation<8>-Footnote-32494343 +Ref: Documentation<8>-Footnote-42494385 +Ref: Documentation<8>-Footnote-52494450 +Ref: Documentation<8>-Footnote-62494515 +Ref: Documentation<8>-Footnote-72494580 +Ref: Documentation<8>-Footnote-82494645 +Node: Tests<8>2494710 +Ref: whatsnew/changelog id512494818 +Ref: 12192494818 +Ref: Tests<8>-Footnote-12495787 +Ref: Tests<8>-Footnote-22495852 +Ref: Tests<8>-Footnote-32495917 +Ref: Tests<8>-Footnote-42495982 +Ref: Tests<8>-Footnote-52496047 +Ref: Tests<8>-Footnote-62496112 +Ref: Tests<8>-Footnote-72496177 +Ref: Tests<8>-Footnote-82496242 +Node: Build<9>2496284 +Ref: whatsnew/changelog id522496386 +Ref: 121a2496386 +Ref: Build<9>-Footnote-12497675 +Ref: Build<9>-Footnote-22497740 +Ref: Build<9>-Footnote-32497805 +Ref: Build<9>-Footnote-42497870 +Ref: Build<9>-Footnote-52497935 +Ref: Build<9>-Footnote-62498000 +Ref: Build<9>-Footnote-72498065 +Ref: Build<9>-Footnote-82498130 +Ref: Build<9>-Footnote-92498195 +Node: Windows<8>2498260 +Ref: whatsnew/changelog id532498362 +Ref: 121c2498362 +Ref: Windows<8>-Footnote-12499530 +Ref: Windows<8>-Footnote-22499595 +Ref: Windows<8>-Footnote-32499660 +Ref: Windows<8>-Footnote-42499725 +Ref: Windows<8>-Footnote-52499767 +Ref: Windows<8>-Footnote-62499832 +Ref: Windows<8>-Footnote-72499897 +Ref: Windows<8>-Footnote-82499962 +Node: macOS<3>2500027 +Ref: whatsnew/changelog id542500135 +Ref: 121d2500135 +Ref: macOS<3>-Footnote-12500469 +Ref: macOS<3>-Footnote-22500534 +Node: Tools/Demos<3>2500599 +Ref: whatsnew/changelog id552500705 +Ref: 121e2500705 +Ref: Tools/Demos<3>-Footnote-12500908 +Node: C API<6>2500973 +Ref: whatsnew/changelog id562501062 +Ref: 121f2501062 +Ref: C API<6>-Footnote-12503318 +Ref: C API<6>-Footnote-22503383 +Ref: C API<6>-Footnote-32503448 +Ref: C API<6>-Footnote-42503513 +Ref: C API<6>-Footnote-52503578 +Ref: C API<6>-Footnote-62503643 +Ref: C API<6>-Footnote-72503708 +Ref: C API<6>-Footnote-82503773 +Node: Python 3 11 0 alpha 62503838 +Ref: whatsnew/changelog python-3-11-0-alpha-62503965 +Ref: 12232503965 +Node: Core and Builtins<10>2504264 +Ref: whatsnew/changelog id572504362 +Ref: 12242504362 +Ref: Core and Builtins<10>-Footnote-12511371 +Ref: Core and Builtins<10>-Footnote-22511436 +Ref: Core and Builtins<10>-Footnote-32511501 +Ref: Core and Builtins<10>-Footnote-42511566 +Ref: Core and Builtins<10>-Footnote-52511631 +Ref: Core and Builtins<10>-Footnote-62511696 +Ref: Core and Builtins<10>-Footnote-72511761 +Ref: Core and Builtins<10>-Footnote-82511826 +Ref: Core and Builtins<10>-Footnote-92511891 +Ref: Core and Builtins<10>-Footnote-102511956 +Ref: Core and Builtins<10>-Footnote-112512022 +Ref: Core and Builtins<10>-Footnote-122512088 +Ref: Core and Builtins<10>-Footnote-132512154 +Ref: Core and Builtins<10>-Footnote-142512220 +Ref: Core and Builtins<10>-Footnote-152512286 +Ref: Core and Builtins<10>-Footnote-162512352 +Ref: Core and Builtins<10>-Footnote-172512418 +Ref: Core and Builtins<10>-Footnote-182512484 +Ref: Core and Builtins<10>-Footnote-192512550 +Ref: Core and Builtins<10>-Footnote-202512616 +Ref: Core and Builtins<10>-Footnote-212512682 +Ref: Core and Builtins<10>-Footnote-222512748 +Ref: Core and Builtins<10>-Footnote-232512814 +Ref: Core and Builtins<10>-Footnote-242512880 +Ref: Core and Builtins<10>-Footnote-252512946 +Ref: Core and Builtins<10>-Footnote-262513012 +Ref: Core and Builtins<10>-Footnote-272513078 +Ref: Core and Builtins<10>-Footnote-282513144 +Ref: Core and Builtins<10>-Footnote-292513210 +Ref: Core and Builtins<10>-Footnote-302513276 +Ref: Core and Builtins<10>-Footnote-312513342 +Ref: Core and Builtins<10>-Footnote-322513408 +Ref: Core and Builtins<10>-Footnote-332513474 +Ref: Core and Builtins<10>-Footnote-342513540 +Ref: Core and Builtins<10>-Footnote-352513606 +Ref: Core and Builtins<10>-Footnote-362513672 +Ref: Core and Builtins<10>-Footnote-372513738 +Ref: Core and Builtins<10>-Footnote-382513804 +Ref: Core and Builtins<10>-Footnote-392513870 +Ref: Core and Builtins<10>-Footnote-402513936 +Ref: Core and Builtins<10>-Footnote-412514002 +Ref: Core and Builtins<10>-Footnote-422514068 +Ref: Core and Builtins<10>-Footnote-432514134 +Ref: Core and Builtins<10>-Footnote-442514200 +Ref: Core and Builtins<10>-Footnote-452514266 +Ref: Core and Builtins<10>-Footnote-462514332 +Ref: Core and Builtins<10>-Footnote-472514398 +Ref: Core and Builtins<10>-Footnote-482514464 +Node: Library<9>2514530 +Ref: whatsnew/changelog id582514653 +Ref: 122e2514653 +Ref: Library<9>-Footnote-12522879 +Ref: Library<9>-Footnote-22522944 +Ref: Library<9>-Footnote-32523009 +Ref: Library<9>-Footnote-42523074 +Ref: Library<9>-Footnote-52523139 +Ref: Library<9>-Footnote-62523204 +Ref: Library<9>-Footnote-72523269 +Ref: Library<9>-Footnote-82523334 +Ref: Library<9>-Footnote-92523399 +Ref: Library<9>-Footnote-102523464 +Ref: Library<9>-Footnote-112523530 +Ref: Library<9>-Footnote-122523596 +Ref: Library<9>-Footnote-132523662 +Ref: Library<9>-Footnote-142523728 +Ref: Library<9>-Footnote-152523794 +Ref: Library<9>-Footnote-162523860 +Ref: Library<9>-Footnote-172523926 +Ref: Library<9>-Footnote-182523992 +Ref: Library<9>-Footnote-192524058 +Ref: Library<9>-Footnote-202524124 +Ref: Library<9>-Footnote-212524190 +Ref: Library<9>-Footnote-222524256 +Ref: Library<9>-Footnote-232524322 +Ref: Library<9>-Footnote-242524388 +Ref: Library<9>-Footnote-252524454 +Ref: Library<9>-Footnote-262524520 +Ref: Library<9>-Footnote-272524586 +Ref: Library<9>-Footnote-282524652 +Ref: Library<9>-Footnote-292524718 +Ref: Library<9>-Footnote-302524784 +Ref: Library<9>-Footnote-312524850 +Ref: Library<9>-Footnote-322524916 +Ref: Library<9>-Footnote-332524982 +Ref: Library<9>-Footnote-342525048 +Ref: Library<9>-Footnote-352525091 +Ref: Library<9>-Footnote-362525157 +Ref: Library<9>-Footnote-372525223 +Ref: Library<9>-Footnote-382525289 +Ref: Library<9>-Footnote-392525355 +Ref: Library<9>-Footnote-402525421 +Ref: Library<9>-Footnote-412525487 +Ref: Library<9>-Footnote-422525553 +Ref: Library<9>-Footnote-432525619 +Ref: Library<9>-Footnote-442525685 +Ref: Library<9>-Footnote-452525751 +Ref: Library<9>-Footnote-462525817 +Ref: Library<9>-Footnote-472525883 +Ref: Library<9>-Footnote-482525949 +Node: Documentation<9>2526015 +Ref: whatsnew/changelog id592526125 +Ref: 123b2526125 +Ref: Documentation<9>-Footnote-12526344 +Node: Tests<9>2526409 +Ref: whatsnew/changelog id602526518 +Ref: 123c2526518 +Ref: Tests<9>-Footnote-12527487 +Ref: Tests<9>-Footnote-22527552 +Ref: Tests<9>-Footnote-32527617 +Ref: Tests<9>-Footnote-42527682 +Ref: Tests<9>-Footnote-52527747 +Node: Build<10>2527812 +Ref: whatsnew/changelog id612527915 +Ref: 123d2527915 +Ref: Build<10>-Footnote-12529347 +Ref: Build<10>-Footnote-22529412 +Ref: Build<10>-Footnote-32529477 +Ref: Build<10>-Footnote-42529542 +Ref: Build<10>-Footnote-52529607 +Ref: Build<10>-Footnote-62529672 +Ref: Build<10>-Footnote-72529737 +Node: Windows<9>2529802 +Ref: whatsnew/changelog id622529904 +Ref: 123e2529904 +Ref: Windows<9>-Footnote-12530562 +Ref: Windows<9>-Footnote-22530627 +Ref: Windows<9>-Footnote-32530692 +Node: IDLE<4>2530757 +Ref: whatsnew/changelog id632530858 +Ref: 123f2530858 +Ref: IDLE<4>-Footnote-12531138 +Ref: IDLE<4>-Footnote-22531203 +Node: C API<7>2531268 +Ref: whatsnew/changelog id642531350 +Ref: 12402531350 +Ref: C API<7>-Footnote-12532297 +Ref: C API<7>-Footnote-22532362 +Ref: C API<7>-Footnote-32532427 +Ref: C API<7>-Footnote-42532492 +Ref: C API<7>-Footnote-52532557 +Node: Python 3 11 0 alpha 52532622 +Ref: whatsnew/changelog python-3-11-0-alpha-52532749 +Ref: 12412532749 +Node: Core and Builtins<11>2533071 +Ref: whatsnew/changelog id652533170 +Ref: 12422533170 +Ref: Core and Builtins<11>-Footnote-12538235 +Ref: Core and Builtins<11>-Footnote-22538300 +Ref: Core and Builtins<11>-Footnote-32538365 +Ref: Core and Builtins<11>-Footnote-42538430 +Ref: Core and Builtins<11>-Footnote-52538495 +Ref: Core and Builtins<11>-Footnote-62538560 +Ref: Core and Builtins<11>-Footnote-72538625 +Ref: Core and Builtins<11>-Footnote-82538690 +Ref: Core and Builtins<11>-Footnote-92538755 +Ref: Core and Builtins<11>-Footnote-102538820 +Ref: Core and Builtins<11>-Footnote-112538886 +Ref: Core and Builtins<11>-Footnote-122538952 +Ref: Core and Builtins<11>-Footnote-132539018 +Ref: Core and Builtins<11>-Footnote-142539061 +Ref: Core and Builtins<11>-Footnote-152539127 +Ref: Core and Builtins<11>-Footnote-162539193 +Ref: Core and Builtins<11>-Footnote-172539259 +Ref: Core and Builtins<11>-Footnote-182539325 +Ref: Core and Builtins<11>-Footnote-192539391 +Ref: Core and Builtins<11>-Footnote-202539457 +Ref: Core and Builtins<11>-Footnote-212539523 +Ref: Core and Builtins<11>-Footnote-222539589 +Ref: Core and Builtins<11>-Footnote-232539655 +Ref: Core and Builtins<11>-Footnote-242539721 +Ref: Core and Builtins<11>-Footnote-252539787 +Ref: Core and Builtins<11>-Footnote-262539853 +Ref: Core and Builtins<11>-Footnote-272539919 +Node: Library<10>2539985 +Ref: whatsnew/changelog id662540110 +Ref: 12452540110 +Ref: Library<10>-Footnote-12546049 +Ref: Library<10>-Footnote-22546114 +Ref: Library<10>-Footnote-32546179 +Ref: Library<10>-Footnote-42546244 +Ref: Library<10>-Footnote-52546309 +Ref: Library<10>-Footnote-62546374 +Ref: Library<10>-Footnote-72546439 +Ref: Library<10>-Footnote-82546504 +Ref: Library<10>-Footnote-92546569 +Ref: Library<10>-Footnote-102546634 +Ref: Library<10>-Footnote-112546700 +Ref: Library<10>-Footnote-122546766 +Ref: Library<10>-Footnote-132546832 +Ref: Library<10>-Footnote-142546898 +Ref: Library<10>-Footnote-152546964 +Ref: Library<10>-Footnote-162547030 +Ref: Library<10>-Footnote-172547096 +Ref: Library<10>-Footnote-182547162 +Ref: Library<10>-Footnote-192547228 +Ref: Library<10>-Footnote-202547294 +Ref: Library<10>-Footnote-212547360 +Ref: Library<10>-Footnote-222547426 +Ref: Library<10>-Footnote-232547492 +Ref: Library<10>-Footnote-242547558 +Ref: Library<10>-Footnote-252547624 +Ref: Library<10>-Footnote-262547690 +Ref: Library<10>-Footnote-272547756 +Ref: Library<10>-Footnote-282547822 +Ref: Library<10>-Footnote-292547888 +Ref: Library<10>-Footnote-302547954 +Ref: Library<10>-Footnote-312548020 +Ref: Library<10>-Footnote-322548086 +Ref: Library<10>-Footnote-332548152 +Ref: Library<10>-Footnote-342548218 +Ref: Library<10>-Footnote-352548284 +Ref: Library<10>-Footnote-362548350 +Ref: Library<10>-Footnote-372548416 +Node: Documentation<10>2548482 +Ref: whatsnew/changelog id672548595 +Ref: 124c2548595 +Ref: Documentation<10>-Footnote-12548784 +Node: Tests<10>2548849 +Ref: whatsnew/changelog id682548960 +Ref: 124d2548960 +Ref: Tests<10>-Footnote-12551109 +Ref: Tests<10>-Footnote-22551174 +Ref: Tests<10>-Footnote-32551239 +Ref: Tests<10>-Footnote-42551304 +Ref: Tests<10>-Footnote-52551369 +Ref: Tests<10>-Footnote-62551434 +Ref: Tests<10>-Footnote-72551499 +Ref: Tests<10>-Footnote-82551564 +Ref: Tests<10>-Footnote-92551629 +Ref: Tests<10>-Footnote-102551694 +Ref: Tests<10>-Footnote-112551760 +Node: Build<11>2551826 +Ref: whatsnew/changelog id692551931 +Ref: 124e2551931 +Ref: Build<11>-Footnote-12553665 +Ref: Build<11>-Footnote-22553730 +Ref: Build<11>-Footnote-32553795 +Ref: Build<11>-Footnote-42553860 +Ref: Build<11>-Footnote-52553925 +Ref: Build<11>-Footnote-62553990 +Ref: Build<11>-Footnote-72554055 +Ref: Build<11>-Footnote-82554120 +Ref: Build<11>-Footnote-92554185 +Ref: Build<11>-Footnote-102554250 +Node: Windows<10>2554316 +Ref: whatsnew/changelog id702554420 +Ref: 124f2554420 +Ref: Windows<10>-Footnote-12554956 +Ref: Windows<10>-Footnote-22555021 +Ref: Windows<10>-Footnote-32555086 +Node: macOS<4>2555151 +Ref: whatsnew/changelog id712555253 +Ref: 12502555253 +Ref: macOS<4>-Footnote-12555383 +Node: IDLE<5>2555448 +Ref: whatsnew/changelog id722555547 +Ref: 12512555547 +Ref: IDLE<5>-Footnote-12555966 +Node: C API<8>2556031 +Ref: whatsnew/changelog id732556113 +Ref: 12522556113 +Ref: C API<8>-Footnote-12557004 +Ref: C API<8>-Footnote-22557069 +Ref: C API<8>-Footnote-32557134 +Ref: C API<8>-Footnote-42557199 +Ref: C API<8>-Footnote-52557264 +Node: Python 3 11 0 alpha 42557329 +Ref: whatsnew/changelog python-3-11-0-alpha-42557456 +Ref: 12532557456 +Node: Core and Builtins<12>2557761 +Ref: whatsnew/changelog id742557860 +Ref: 12542557860 +Ref: Core and Builtins<12>-Footnote-12564651 +Ref: Core and Builtins<12>-Footnote-22564716 +Ref: Core and Builtins<12>-Footnote-32564781 +Ref: Core and Builtins<12>-Footnote-42564846 +Ref: Core and Builtins<12>-Footnote-52564911 +Ref: Core and Builtins<12>-Footnote-62564976 +Ref: Core and Builtins<12>-Footnote-72565041 +Ref: Core and Builtins<12>-Footnote-82565106 +Ref: Core and Builtins<12>-Footnote-92565171 +Ref: Core and Builtins<12>-Footnote-102565236 +Ref: Core and Builtins<12>-Footnote-112565302 +Ref: Core and Builtins<12>-Footnote-122565368 +Ref: Core and Builtins<12>-Footnote-132565434 +Ref: Core and Builtins<12>-Footnote-142565500 +Ref: Core and Builtins<12>-Footnote-152565566 +Ref: Core and Builtins<12>-Footnote-162565632 +Ref: Core and Builtins<12>-Footnote-172565698 +Ref: Core and Builtins<12>-Footnote-182565764 +Ref: Core and Builtins<12>-Footnote-192565830 +Ref: Core and Builtins<12>-Footnote-202565896 +Ref: Core and Builtins<12>-Footnote-212565962 +Ref: Core and Builtins<12>-Footnote-222566028 +Ref: Core and Builtins<12>-Footnote-232566094 +Ref: Core and Builtins<12>-Footnote-242566160 +Ref: Core and Builtins<12>-Footnote-252566226 +Ref: Core and Builtins<12>-Footnote-262566292 +Ref: Core and Builtins<12>-Footnote-272566358 +Ref: Core and Builtins<12>-Footnote-282566424 +Ref: Core and Builtins<12>-Footnote-292566490 +Ref: Core and Builtins<12>-Footnote-302566556 +Ref: Core and Builtins<12>-Footnote-312566622 +Ref: Core and Builtins<12>-Footnote-322566688 +Ref: Core and Builtins<12>-Footnote-332566754 +Ref: Core and Builtins<12>-Footnote-342566820 +Ref: Core and Builtins<12>-Footnote-352566886 +Ref: Core and Builtins<12>-Footnote-362566952 +Ref: Core and Builtins<12>-Footnote-372567018 +Ref: Core and Builtins<12>-Footnote-382567084 +Ref: Core and Builtins<12>-Footnote-392567150 +Ref: Core and Builtins<12>-Footnote-402567193 +Ref: Core and Builtins<12>-Footnote-412567259 +Node: Library<11>2567325 +Ref: whatsnew/changelog id752567450 +Ref: 12572567450 +Ref: Library<11>-Footnote-12574721 +Ref: Library<11>-Footnote-22574786 +Ref: Library<11>-Footnote-32574851 +Ref: Library<11>-Footnote-42574916 +Ref: Library<11>-Footnote-52574981 +Ref: Library<11>-Footnote-62575046 +Ref: Library<11>-Footnote-72575111 +Ref: Library<11>-Footnote-82575176 +Ref: Library<11>-Footnote-92575241 +Ref: Library<11>-Footnote-102575306 +Ref: Library<11>-Footnote-112575372 +Ref: Library<11>-Footnote-122575438 +Ref: Library<11>-Footnote-132575504 +Ref: Library<11>-Footnote-142575570 +Ref: Library<11>-Footnote-152575636 +Ref: Library<11>-Footnote-162575702 +Ref: Library<11>-Footnote-172575768 +Ref: Library<11>-Footnote-182575834 +Ref: Library<11>-Footnote-192575900 +Ref: Library<11>-Footnote-202575966 +Ref: Library<11>-Footnote-212576032 +Ref: Library<11>-Footnote-222576098 +Ref: Library<11>-Footnote-232576164 +Ref: Library<11>-Footnote-242576230 +Ref: Library<11>-Footnote-252576296 +Ref: Library<11>-Footnote-262576362 +Ref: Library<11>-Footnote-272576428 +Ref: Library<11>-Footnote-282576494 +Ref: Library<11>-Footnote-292576560 +Ref: Library<11>-Footnote-302576626 +Ref: Library<11>-Footnote-312576692 +Ref: Library<11>-Footnote-322576758 +Ref: Library<11>-Footnote-332576824 +Ref: Library<11>-Footnote-342576890 +Ref: Library<11>-Footnote-352576956 +Ref: Library<11>-Footnote-362577022 +Ref: Library<11>-Footnote-372577088 +Ref: Library<11>-Footnote-382577154 +Ref: Library<11>-Footnote-392577220 +Ref: Library<11>-Footnote-402577286 +Ref: Library<11>-Footnote-412577352 +Ref: Library<11>-Footnote-422577418 +Ref: Library<11>-Footnote-432577484 +Ref: Library<11>-Footnote-442577550 +Node: Documentation<11>2577616 +Ref: whatsnew/changelog id762577729 +Ref: 125d2577729 +Ref: Documentation<11>-Footnote-12578226 +Ref: Documentation<11>-Footnote-22578291 +Ref: Documentation<11>-Footnote-32578356 +Ref: Documentation<11>-Footnote-42578421 +Node: Tests<11>2578486 +Ref: whatsnew/changelog id772578597 +Ref: 12602578597 +Ref: Tests<11>-Footnote-12579525 +Ref: Tests<11>-Footnote-22579590 +Ref: Tests<11>-Footnote-32579655 +Ref: Tests<11>-Footnote-42579720 +Ref: Tests<11>-Footnote-52579785 +Ref: Tests<11>-Footnote-62579850 +Ref: Tests<11>-Footnote-72579915 +Ref: Tests<11>-Footnote-82579980 +Node: Build<12>2580045 +Ref: whatsnew/changelog id782580150 +Ref: 12612580150 +Ref: Build<12>-Footnote-12582216 +Ref: Build<12>-Footnote-22582281 +Ref: Build<12>-Footnote-32582346 +Ref: Build<12>-Footnote-42582411 +Ref: Build<12>-Footnote-52582476 +Ref: Build<12>-Footnote-62582541 +Ref: Build<12>-Footnote-72582606 +Ref: Build<12>-Footnote-82582671 +Ref: Build<12>-Footnote-92582736 +Ref: Build<12>-Footnote-102582801 +Ref: Build<12>-Footnote-112582867 +Ref: Build<12>-Footnote-122582933 +Node: Windows<11>2582999 +Ref: whatsnew/changelog id792583103 +Ref: 12622583103 +Ref: Windows<11>-Footnote-12583322 +Node: macOS<5>2583387 +Ref: whatsnew/changelog id802583490 +Ref: 12632583490 +Ref: macOS<5>-Footnote-12583728 +Node: C API<9>2583793 +Ref: whatsnew/changelog id812583876 +Ref: 12642583876 +Ref: C API<9>-Footnote-12585152 +Ref: C API<9>-Footnote-22585217 +Ref: C API<9>-Footnote-32585282 +Ref: C API<9>-Footnote-42585347 +Ref: C API<9>-Footnote-52585412 +Node: Python 3 11 0 alpha 32585477 +Ref: whatsnew/changelog python-3-11-0-alpha-32585604 +Ref: 12672585604 +Node: Core and Builtins<13>2585910 +Ref: whatsnew/changelog id822586009 +Ref: 12682586009 +Ref: Core and Builtins<13>-Footnote-12591641 +Ref: Core and Builtins<13>-Footnote-22591706 +Ref: Core and Builtins<13>-Footnote-32591771 +Ref: Core and Builtins<13>-Footnote-42591836 +Ref: Core and Builtins<13>-Footnote-52591901 +Ref: Core and Builtins<13>-Footnote-62591966 +Ref: Core and Builtins<13>-Footnote-72592031 +Ref: Core and Builtins<13>-Footnote-82592096 +Ref: Core and Builtins<13>-Footnote-92592161 +Ref: Core and Builtins<13>-Footnote-102592226 +Ref: Core and Builtins<13>-Footnote-112592292 +Ref: Core and Builtins<13>-Footnote-122592358 +Ref: Core and Builtins<13>-Footnote-132592424 +Ref: Core and Builtins<13>-Footnote-142592490 +Ref: Core and Builtins<13>-Footnote-152592556 +Ref: Core and Builtins<13>-Footnote-162592622 +Ref: Core and Builtins<13>-Footnote-172592688 +Ref: Core and Builtins<13>-Footnote-182592754 +Ref: Core and Builtins<13>-Footnote-192592820 +Ref: Core and Builtins<13>-Footnote-202592886 +Ref: Core and Builtins<13>-Footnote-212592952 +Ref: Core and Builtins<13>-Footnote-222593018 +Ref: Core and Builtins<13>-Footnote-232593061 +Ref: Core and Builtins<13>-Footnote-242593127 +Ref: Core and Builtins<13>-Footnote-252593193 +Ref: Core and Builtins<13>-Footnote-262593259 +Ref: Core and Builtins<13>-Footnote-272593325 +Ref: Core and Builtins<13>-Footnote-282593391 +Ref: Core and Builtins<13>-Footnote-292593457 +Ref: Core and Builtins<13>-Footnote-302593523 +Ref: Core and Builtins<13>-Footnote-312593589 +Ref: Core and Builtins<13>-Footnote-322593655 +Ref: Core and Builtins<13>-Footnote-332593721 +Ref: Core and Builtins<13>-Footnote-342593787 +Node: Library<12>2593853 +Ref: whatsnew/changelog id832593978 +Ref: 126b2593978 +Ref: Library<12>-Footnote-12599947 +Ref: Library<12>-Footnote-22600012 +Ref: Library<12>-Footnote-32600077 +Ref: Library<12>-Footnote-42600142 +Ref: Library<12>-Footnote-52600207 +Ref: Library<12>-Footnote-62600272 +Ref: Library<12>-Footnote-72600337 +Ref: Library<12>-Footnote-82600402 +Ref: Library<12>-Footnote-92600467 +Ref: Library<12>-Footnote-102600532 +Ref: Library<12>-Footnote-112600598 +Ref: Library<12>-Footnote-122600664 +Ref: Library<12>-Footnote-132600730 +Ref: Library<12>-Footnote-142600796 +Ref: Library<12>-Footnote-152600862 +Ref: Library<12>-Footnote-162600928 +Ref: Library<12>-Footnote-172600994 +Ref: Library<12>-Footnote-182601060 +Ref: Library<12>-Footnote-192601126 +Ref: Library<12>-Footnote-202601192 +Ref: Library<12>-Footnote-212601258 +Ref: Library<12>-Footnote-222601324 +Ref: Library<12>-Footnote-232601390 +Ref: Library<12>-Footnote-242601456 +Ref: Library<12>-Footnote-252601522 +Ref: Library<12>-Footnote-262601588 +Ref: Library<12>-Footnote-272601654 +Ref: Library<12>-Footnote-282601720 +Ref: Library<12>-Footnote-292601786 +Ref: Library<12>-Footnote-302601852 +Ref: Library<12>-Footnote-312601918 +Ref: Library<12>-Footnote-322601961 +Ref: Library<12>-Footnote-332602027 +Ref: Library<12>-Footnote-342602093 +Ref: Library<12>-Footnote-352602159 +Ref: Library<12>-Footnote-362602225 +Node: Documentation<12>2602291 +Ref: whatsnew/changelog id842602404 +Ref: 126e2602404 +Ref: Documentation<12>-Footnote-12603712 +Ref: Documentation<12>-Footnote-22603777 +Ref: Documentation<12>-Footnote-32603842 +Ref: Documentation<12>-Footnote-42603907 +Ref: Documentation<12>-Footnote-52603972 +Ref: Documentation<12>-Footnote-62604037 +Ref: Documentation<12>-Footnote-72604102 +Ref: Documentation<12>-Footnote-82604167 +Ref: Documentation<12>-Footnote-92604232 +Node: Tests<12>2604297 +Ref: whatsnew/changelog id852604408 +Ref: 12712604408 +Ref: Tests<12>-Footnote-12605219 +Ref: Tests<12>-Footnote-22605284 +Ref: Tests<12>-Footnote-32605349 +Ref: Tests<12>-Footnote-42605414 +Ref: Tests<12>-Footnote-52605479 +Ref: Tests<12>-Footnote-62605544 +Node: Build<13>2605609 +Ref: whatsnew/changelog id862605714 +Ref: 12722605714 +Ref: Build<13>-Footnote-12611513 +Ref: Build<13>-Footnote-22611578 +Ref: Build<13>-Footnote-32611643 +Ref: Build<13>-Footnote-42611708 +Ref: Build<13>-Footnote-52611773 +Ref: Build<13>-Footnote-62611838 +Ref: Build<13>-Footnote-72611903 +Ref: Build<13>-Footnote-82611968 +Ref: Build<13>-Footnote-92612033 +Ref: Build<13>-Footnote-102612098 +Ref: Build<13>-Footnote-112612164 +Ref: Build<13>-Footnote-122612230 +Ref: Build<13>-Footnote-132612296 +Ref: Build<13>-Footnote-142612362 +Ref: Build<13>-Footnote-152612428 +Ref: Build<13>-Footnote-162612494 +Ref: Build<13>-Footnote-172612560 +Ref: Build<13>-Footnote-182612626 +Ref: Build<13>-Footnote-192612692 +Ref: Build<13>-Footnote-202612758 +Ref: Build<13>-Footnote-212612824 +Ref: Build<13>-Footnote-222612890 +Ref: Build<13>-Footnote-232612956 +Ref: Build<13>-Footnote-242613022 +Ref: Build<13>-Footnote-252613088 +Ref: Build<13>-Footnote-262613154 +Ref: Build<13>-Footnote-272613220 +Ref: Build<13>-Footnote-282613286 +Ref: Build<13>-Footnote-292613352 +Ref: Build<13>-Footnote-302613418 +Ref: Build<13>-Footnote-312613484 +Ref: Build<13>-Footnote-322613550 +Ref: Build<13>-Footnote-332613616 +Node: Windows<12>2613682 +Ref: whatsnew/changelog id872613786 +Ref: 12732613786 +Ref: Windows<12>-Footnote-12614977 +Ref: Windows<12>-Footnote-22615042 +Ref: Windows<12>-Footnote-32615107 +Ref: Windows<12>-Footnote-42615172 +Ref: Windows<12>-Footnote-52615237 +Ref: Windows<12>-Footnote-62615302 +Node: macOS<6>2615367 +Ref: whatsnew/changelog id882615471 +Ref: 12742615471 +Ref: macOS<6>-Footnote-12615621 +Node: C API<10>2615686 +Ref: whatsnew/changelog id892615770 +Ref: 12752615770 +Ref: C API<10>-Footnote-12615975 +Node: Python 3 11 0 alpha 22616040 +Ref: whatsnew/changelog python-3-11-0-alpha-22616167 +Ref: 12762616167 +Node: Core and Builtins<14>2616490 +Ref: whatsnew/changelog id902616589 +Ref: 12772616589 +Ref: Core and Builtins<14>-Footnote-12621966 +Ref: Core and Builtins<14>-Footnote-22622031 +Ref: Core and Builtins<14>-Footnote-32622096 +Ref: Core and Builtins<14>-Footnote-42622161 +Ref: Core and Builtins<14>-Footnote-52622226 +Ref: Core and Builtins<14>-Footnote-62622291 +Ref: Core and Builtins<14>-Footnote-72622356 +Ref: Core and Builtins<14>-Footnote-82622421 +Ref: Core and Builtins<14>-Footnote-92622486 +Ref: Core and Builtins<14>-Footnote-102622551 +Ref: Core and Builtins<14>-Footnote-112622617 +Ref: Core and Builtins<14>-Footnote-122622683 +Ref: Core and Builtins<14>-Footnote-132622749 +Ref: Core and Builtins<14>-Footnote-142622815 +Ref: Core and Builtins<14>-Footnote-152622881 +Ref: Core and Builtins<14>-Footnote-162622947 +Ref: Core and Builtins<14>-Footnote-172623013 +Ref: Core and Builtins<14>-Footnote-182623079 +Ref: Core and Builtins<14>-Footnote-192623145 +Ref: Core and Builtins<14>-Footnote-202623211 +Ref: Core and Builtins<14>-Footnote-212623254 +Ref: Core and Builtins<14>-Footnote-222623320 +Ref: Core and Builtins<14>-Footnote-232623386 +Ref: Core and Builtins<14>-Footnote-242623452 +Ref: Core and Builtins<14>-Footnote-252623518 +Ref: Core and Builtins<14>-Footnote-262623584 +Node: Library<13>2623627 +Ref: whatsnew/changelog id912623752 +Ref: 12792623752 +Ref: Library<13>-Footnote-12631297 +Ref: Library<13>-Footnote-22631362 +Ref: Library<13>-Footnote-32631427 +Ref: Library<13>-Footnote-42631492 +Ref: Library<13>-Footnote-52631557 +Ref: Library<13>-Footnote-62631622 +Ref: Library<13>-Footnote-72631687 +Ref: Library<13>-Footnote-82631752 +Ref: Library<13>-Footnote-92631817 +Ref: Library<13>-Footnote-102631882 +Ref: Library<13>-Footnote-112631948 +Ref: Library<13>-Footnote-122632014 +Ref: Library<13>-Footnote-132632080 +Ref: Library<13>-Footnote-142632146 +Ref: Library<13>-Footnote-152632212 +Ref: Library<13>-Footnote-162632278 +Ref: Library<13>-Footnote-172632344 +Ref: Library<13>-Footnote-182632410 +Ref: Library<13>-Footnote-192632476 +Ref: Library<13>-Footnote-202632542 +Ref: Library<13>-Footnote-212632608 +Ref: Library<13>-Footnote-222632674 +Ref: Library<13>-Footnote-232632740 +Ref: Library<13>-Footnote-242632806 +Ref: Library<13>-Footnote-252632872 +Ref: Library<13>-Footnote-262632938 +Ref: Library<13>-Footnote-272633004 +Ref: Library<13>-Footnote-282633070 +Ref: Library<13>-Footnote-292633136 +Ref: Library<13>-Footnote-302633202 +Ref: Library<13>-Footnote-312633268 +Ref: Library<13>-Footnote-322633334 +Ref: Library<13>-Footnote-332633400 +Ref: Library<13>-Footnote-342633466 +Ref: Library<13>-Footnote-352633532 +Ref: Library<13>-Footnote-362633598 +Ref: Library<13>-Footnote-372633664 +Ref: Library<13>-Footnote-382633730 +Ref: Library<13>-Footnote-392633796 +Ref: Library<13>-Footnote-402633862 +Ref: Library<13>-Footnote-412633928 +Ref: Library<13>-Footnote-422633994 +Ref: Library<13>-Footnote-432634060 +Ref: Library<13>-Footnote-442634120 +Ref: Library<13>-Footnote-452634186 +Node: Documentation<13>2634252 +Ref: whatsnew/changelog id922634365 +Ref: 12802634365 +Ref: Documentation<13>-Footnote-12635847 +Ref: Documentation<13>-Footnote-22635912 +Ref: Documentation<13>-Footnote-32635977 +Ref: Documentation<13>-Footnote-42636042 +Ref: Documentation<13>-Footnote-52636107 +Ref: Documentation<13>-Footnote-62636172 +Ref: Documentation<13>-Footnote-72636237 +Ref: Documentation<13>-Footnote-82636302 +Ref: Documentation<13>-Footnote-92636367 +Ref: Documentation<13>-Footnote-102636409 +Ref: Documentation<13>-Footnote-112636475 +Node: Tests<13>2636541 +Ref: whatsnew/changelog id932636652 +Ref: 12822636652 +Ref: Tests<13>-Footnote-12638926 +Ref: Tests<13>-Footnote-22638991 +Ref: Tests<13>-Footnote-32639056 +Ref: Tests<13>-Footnote-42639121 +Ref: Tests<13>-Footnote-52639186 +Ref: Tests<13>-Footnote-62639251 +Ref: Tests<13>-Footnote-72639316 +Ref: Tests<13>-Footnote-82639381 +Ref: Tests<13>-Footnote-92639446 +Ref: Tests<13>-Footnote-102639511 +Ref: Tests<13>-Footnote-112639577 +Ref: Tests<13>-Footnote-122639643 +Ref: Tests<13>-Footnote-132639709 +Node: Build<14>2639775 +Ref: whatsnew/changelog id942639880 +Ref: 12832639880 +Ref: Build<14>-Footnote-12642557 +Ref: Build<14>-Footnote-22642622 +Ref: Build<14>-Footnote-32642687 +Ref: Build<14>-Footnote-42642752 +Ref: Build<14>-Footnote-52642817 +Ref: Build<14>-Footnote-62642882 +Ref: Build<14>-Footnote-72642947 +Ref: Build<14>-Footnote-82643012 +Ref: Build<14>-Footnote-92643077 +Ref: Build<14>-Footnote-102643142 +Ref: Build<14>-Footnote-112643208 +Ref: Build<14>-Footnote-122643274 +Ref: Build<14>-Footnote-132643340 +Ref: Build<14>-Footnote-142643406 +Ref: Build<14>-Footnote-152643472 +Node: Windows<13>2643538 +Ref: whatsnew/changelog id952643642 +Ref: 12842643642 +Ref: Windows<13>-Footnote-12644197 +Ref: Windows<13>-Footnote-22644262 +Ref: Windows<13>-Footnote-32644327 +Node: macOS<7>2644392 +Ref: whatsnew/changelog id962644494 +Ref: 12852644494 +Ref: macOS<7>-Footnote-12644755 +Node: IDLE<6>2644820 +Ref: whatsnew/changelog id972644920 +Ref: 12862644920 +Ref: IDLE<6>-Footnote-12645081 +Node: C API<11>2645146 +Ref: whatsnew/changelog id982645229 +Ref: 12872645229 +Ref: C API<11>-Footnote-12648959 +Ref: C API<11>-Footnote-22649024 +Ref: C API<11>-Footnote-32649089 +Ref: C API<11>-Footnote-42649154 +Ref: C API<11>-Footnote-52649219 +Ref: C API<11>-Footnote-62649284 +Ref: C API<11>-Footnote-72649349 +Ref: C API<11>-Footnote-82649414 +Ref: C API<11>-Footnote-92649479 +Ref: C API<11>-Footnote-102649544 +Ref: C API<11>-Footnote-112649610 +Ref: C API<11>-Footnote-122649676 +Ref: C API<11>-Footnote-132649742 +Ref: C API<11>-Footnote-142649808 +Node: Python 3 11 0 alpha 12649874 +Ref: whatsnew/changelog python-3-11-0-alpha-12650000 +Ref: 12882650000 +Node: Security<5>2650379 +Ref: whatsnew/changelog id992650478 +Ref: 12892650478 +Ref: Security<5>-Footnote-12651828 +Ref: Security<5>-Footnote-22651893 +Ref: Security<5>-Footnote-32651958 +Ref: Security<5>-Footnote-42652023 +Ref: Security<5>-Footnote-52652088 +Ref: Security<5>-Footnote-62652153 +Node: Core and Builtins<15>2652218 +Ref: whatsnew/changelog id1002652337 +Ref: 128b2652337 +Ref: Core and Builtins<15>-Footnote-12676104 +Ref: Core and Builtins<15>-Footnote-22676169 +Ref: Core and Builtins<15>-Footnote-32676234 +Ref: Core and Builtins<15>-Footnote-42676299 +Ref: Core and Builtins<15>-Footnote-52676364 +Ref: Core and Builtins<15>-Footnote-62676429 +Ref: Core and Builtins<15>-Footnote-72676494 +Ref: Core and Builtins<15>-Footnote-82676559 +Ref: Core and Builtins<15>-Footnote-92676624 +Ref: Core and Builtins<15>-Footnote-102676689 +Ref: Core and Builtins<15>-Footnote-112676755 +Ref: Core and Builtins<15>-Footnote-122676821 +Ref: Core and Builtins<15>-Footnote-132676887 +Ref: Core and Builtins<15>-Footnote-142676955 +Ref: Core and Builtins<15>-Footnote-152677021 +Ref: Core and Builtins<15>-Footnote-162677087 +Ref: Core and Builtins<15>-Footnote-172677153 +Ref: Core and Builtins<15>-Footnote-182677219 +Ref: Core and Builtins<15>-Footnote-192677285 +Ref: Core and Builtins<15>-Footnote-202677351 +Ref: Core and Builtins<15>-Footnote-212677417 +Ref: Core and Builtins<15>-Footnote-222677483 +Ref: Core and Builtins<15>-Footnote-232677549 +Ref: Core and Builtins<15>-Footnote-242677615 +Ref: Core and Builtins<15>-Footnote-252677681 +Ref: Core and Builtins<15>-Footnote-262677747 +Ref: Core and Builtins<15>-Footnote-272677813 +Ref: Core and Builtins<15>-Footnote-282677879 +Ref: Core and Builtins<15>-Footnote-292677945 +Ref: Core and Builtins<15>-Footnote-302678011 +Ref: Core and Builtins<15>-Footnote-312678077 +Ref: Core and Builtins<15>-Footnote-322678143 +Ref: Core and Builtins<15>-Footnote-332678209 +Ref: Core and Builtins<15>-Footnote-342678275 +Ref: Core and Builtins<15>-Footnote-352678341 +Ref: Core and Builtins<15>-Footnote-362678407 +Ref: Core and Builtins<15>-Footnote-372678473 +Ref: Core and Builtins<15>-Footnote-382678539 +Ref: Core and Builtins<15>-Footnote-392678605 +Ref: Core and Builtins<15>-Footnote-402678671 +Ref: Core and Builtins<15>-Footnote-412678737 +Ref: Core and Builtins<15>-Footnote-422678803 +Ref: Core and Builtins<15>-Footnote-432678869 +Ref: Core and Builtins<15>-Footnote-442678935 +Ref: Core and Builtins<15>-Footnote-452679001 +Ref: Core and Builtins<15>-Footnote-462679067 +Ref: Core and Builtins<15>-Footnote-472679133 +Ref: Core and Builtins<15>-Footnote-482679199 +Ref: Core and Builtins<15>-Footnote-492679265 +Ref: Core and Builtins<15>-Footnote-502679331 +Ref: Core and Builtins<15>-Footnote-512679397 +Ref: Core and Builtins<15>-Footnote-522679463 +Ref: Core and Builtins<15>-Footnote-532679529 +Ref: Core and Builtins<15>-Footnote-542679595 +Ref: Core and Builtins<15>-Footnote-552679661 +Ref: Core and Builtins<15>-Footnote-562679727 +Ref: Core and Builtins<15>-Footnote-572679793 +Ref: Core and Builtins<15>-Footnote-582679859 +Ref: Core and Builtins<15>-Footnote-592679925 +Ref: Core and Builtins<15>-Footnote-602679991 +Ref: Core and Builtins<15>-Footnote-612680057 +Ref: Core and Builtins<15>-Footnote-622680123 +Ref: Core and Builtins<15>-Footnote-632680189 +Ref: Core and Builtins<15>-Footnote-642680255 +Ref: Core and Builtins<15>-Footnote-652680321 +Ref: Core and Builtins<15>-Footnote-662680387 +Ref: Core and Builtins<15>-Footnote-672680453 +Ref: Core and Builtins<15>-Footnote-682680519 +Ref: Core and Builtins<15>-Footnote-692680585 +Ref: Core and Builtins<15>-Footnote-702680651 +Ref: Core and Builtins<15>-Footnote-712680717 +Ref: Core and Builtins<15>-Footnote-722680783 +Ref: Core and Builtins<15>-Footnote-732680849 +Ref: Core and Builtins<15>-Footnote-742680915 +Ref: Core and Builtins<15>-Footnote-752680981 +Ref: Core and Builtins<15>-Footnote-762681024 +Ref: Core and Builtins<15>-Footnote-772681090 +Ref: Core and Builtins<15>-Footnote-782681156 +Ref: Core and Builtins<15>-Footnote-792681222 +Ref: Core and Builtins<15>-Footnote-802681265 +Ref: Core and Builtins<15>-Footnote-812681331 +Ref: Core and Builtins<15>-Footnote-822681397 +Ref: Core and Builtins<15>-Footnote-832681463 +Ref: Core and Builtins<15>-Footnote-842681529 +Ref: Core and Builtins<15>-Footnote-852681595 +Ref: Core and Builtins<15>-Footnote-862681661 +Ref: Core and Builtins<15>-Footnote-872681727 +Ref: Core and Builtins<15>-Footnote-882681793 +Ref: Core and Builtins<15>-Footnote-892681859 +Ref: Core and Builtins<15>-Footnote-902681925 +Ref: Core and Builtins<15>-Footnote-912681991 +Ref: Core and Builtins<15>-Footnote-922682057 +Ref: Core and Builtins<15>-Footnote-932682123 +Ref: Core and Builtins<15>-Footnote-942682189 +Ref: Core and Builtins<15>-Footnote-952682255 +Ref: Core and Builtins<15>-Footnote-962682321 +Ref: Core and Builtins<15>-Footnote-972682387 +Ref: Core and Builtins<15>-Footnote-982682453 +Ref: Core and Builtins<15>-Footnote-992682519 +Ref: Core and Builtins<15>-Footnote-1002682585 +Ref: Core and Builtins<15>-Footnote-1012682652 +Ref: Core and Builtins<15>-Footnote-1022682719 +Ref: Core and Builtins<15>-Footnote-1032682786 +Ref: Core and Builtins<15>-Footnote-1042682853 +Ref: Core and Builtins<15>-Footnote-1052682920 +Ref: Core and Builtins<15>-Footnote-1062682987 +Ref: Core and Builtins<15>-Footnote-1072683054 +Ref: Core and Builtins<15>-Footnote-1082683121 +Ref: Core and Builtins<15>-Footnote-1092683188 +Ref: Core and Builtins<15>-Footnote-1102683255 +Ref: Core and Builtins<15>-Footnote-1112683322 +Ref: Core and Builtins<15>-Footnote-1122683389 +Ref: Core and Builtins<15>-Footnote-1132683456 +Ref: Core and Builtins<15>-Footnote-1142683523 +Ref: Core and Builtins<15>-Footnote-1152683590 +Ref: Core and Builtins<15>-Footnote-1162683657 +Ref: Core and Builtins<15>-Footnote-1172683724 +Ref: Core and Builtins<15>-Footnote-1182683791 +Ref: Core and Builtins<15>-Footnote-1192683858 +Ref: Core and Builtins<15>-Footnote-1202683925 +Ref: Core and Builtins<15>-Footnote-1212683992 +Ref: Core and Builtins<15>-Footnote-1222684059 +Ref: Core and Builtins<15>-Footnote-1232684126 +Ref: Core and Builtins<15>-Footnote-1242684193 +Ref: Core and Builtins<15>-Footnote-1252684260 +Ref: Core and Builtins<15>-Footnote-1262684327 +Ref: Core and Builtins<15>-Footnote-1272684394 +Ref: Core and Builtins<15>-Footnote-1282684461 +Ref: Core and Builtins<15>-Footnote-1292684528 +Ref: Core and Builtins<15>-Footnote-1302684595 +Node: Library<14>2684662 +Ref: whatsnew/changelog id1012684787 +Ref: 12902684787 +Ref: Library<14>-Footnote-12724562 +Ref: Library<14>-Footnote-22724627 +Ref: Library<14>-Footnote-32724692 +Ref: Library<14>-Footnote-42724757 +Ref: Library<14>-Footnote-52724824 +Ref: Library<14>-Footnote-62724889 +Ref: Library<14>-Footnote-72724954 +Ref: Library<14>-Footnote-82725019 +Ref: Library<14>-Footnote-92725084 +Ref: Library<14>-Footnote-102725149 +Ref: Library<14>-Footnote-112725215 +Ref: Library<14>-Footnote-122725281 +Ref: Library<14>-Footnote-132725347 +Ref: Library<14>-Footnote-142725413 +Ref: Library<14>-Footnote-152725479 +Ref: Library<14>-Footnote-162725545 +Ref: Library<14>-Footnote-172725611 +Ref: Library<14>-Footnote-182725677 +Ref: Library<14>-Footnote-192725743 +Ref: Library<14>-Footnote-202725809 +Ref: Library<14>-Footnote-212725875 +Ref: Library<14>-Footnote-222725941 +Ref: Library<14>-Footnote-232726007 +Ref: Library<14>-Footnote-242726073 +Ref: Library<14>-Footnote-252726139 +Ref: Library<14>-Footnote-262726205 +Ref: Library<14>-Footnote-272726271 +Ref: Library<14>-Footnote-282726337 +Ref: Library<14>-Footnote-292726403 +Ref: Library<14>-Footnote-302726469 +Ref: Library<14>-Footnote-312726535 +Ref: Library<14>-Footnote-322726601 +Ref: Library<14>-Footnote-332726667 +Ref: Library<14>-Footnote-342726733 +Ref: Library<14>-Footnote-352726799 +Ref: Library<14>-Footnote-362726842 +Ref: Library<14>-Footnote-372726908 +Ref: Library<14>-Footnote-382726974 +Ref: Library<14>-Footnote-392727040 +Ref: Library<14>-Footnote-402727106 +Ref: Library<14>-Footnote-412727172 +Ref: Library<14>-Footnote-422727238 +Ref: Library<14>-Footnote-432727304 +Ref: Library<14>-Footnote-442727370 +Ref: Library<14>-Footnote-452727436 +Ref: Library<14>-Footnote-462727502 +Ref: Library<14>-Footnote-472727568 +Ref: Library<14>-Footnote-482727634 +Ref: Library<14>-Footnote-492727700 +Ref: Library<14>-Footnote-502727766 +Ref: Library<14>-Footnote-512727832 +Ref: Library<14>-Footnote-522727898 +Ref: Library<14>-Footnote-532727964 +Ref: Library<14>-Footnote-542728030 +Ref: Library<14>-Footnote-552728096 +Ref: Library<14>-Footnote-562728162 +Ref: Library<14>-Footnote-572728228 +Ref: Library<14>-Footnote-582728294 +Ref: Library<14>-Footnote-592728360 +Ref: Library<14>-Footnote-602728426 +Ref: Library<14>-Footnote-612728492 +Ref: Library<14>-Footnote-622728558 +Ref: Library<14>-Footnote-632728624 +Ref: Library<14>-Footnote-642728690 +Ref: Library<14>-Footnote-652728756 +Ref: Library<14>-Footnote-662728822 +Ref: Library<14>-Footnote-672728888 +Ref: Library<14>-Footnote-682728954 +Ref: Library<14>-Footnote-692729020 +Ref: Library<14>-Footnote-702729086 +Ref: Library<14>-Footnote-712729152 +Ref: Library<14>-Footnote-722729218 +Ref: Library<14>-Footnote-732729284 +Ref: Library<14>-Footnote-742729350 +Ref: Library<14>-Footnote-752729416 +Ref: Library<14>-Footnote-762729482 +Ref: Library<14>-Footnote-772729548 +Ref: Library<14>-Footnote-782729614 +Ref: Library<14>-Footnote-792729680 +Ref: Library<14>-Footnote-802729746 +Ref: Library<14>-Footnote-812729812 +Ref: Library<14>-Footnote-822729878 +Ref: Library<14>-Footnote-832729944 +Ref: Library<14>-Footnote-842730010 +Ref: Library<14>-Footnote-852730076 +Ref: Library<14>-Footnote-862730142 +Ref: Library<14>-Footnote-872730208 +Ref: Library<14>-Footnote-882730274 +Ref: Library<14>-Footnote-892730340 +Ref: Library<14>-Footnote-902730406 +Ref: Library<14>-Footnote-912730472 +Ref: Library<14>-Footnote-922730538 +Ref: Library<14>-Footnote-932730604 +Ref: Library<14>-Footnote-942730670 +Ref: Library<14>-Footnote-952730736 +Ref: Library<14>-Footnote-962730802 +Ref: Library<14>-Footnote-972730868 +Ref: Library<14>-Footnote-982730934 +Ref: Library<14>-Footnote-992731000 +Ref: Library<14>-Footnote-1002731066 +Ref: Library<14>-Footnote-1012731133 +Ref: Library<14>-Footnote-1022731200 +Ref: Library<14>-Footnote-1032731267 +Ref: Library<14>-Footnote-1042731334 +Ref: Library<14>-Footnote-1052731401 +Ref: Library<14>-Footnote-1062731468 +Ref: Library<14>-Footnote-1072731535 +Ref: Library<14>-Footnote-1082731602 +Ref: Library<14>-Footnote-1092731669 +Ref: Library<14>-Footnote-1102731736 +Ref: Library<14>-Footnote-1112731803 +Ref: Library<14>-Footnote-1122731870 +Ref: Library<14>-Footnote-1132731937 +Ref: Library<14>-Footnote-1142732004 +Ref: Library<14>-Footnote-1152732071 +Ref: Library<14>-Footnote-1162732138 +Ref: Library<14>-Footnote-1172732205 +Ref: Library<14>-Footnote-1182732272 +Ref: Library<14>-Footnote-1192732339 +Ref: Library<14>-Footnote-1202732406 +Ref: Library<14>-Footnote-1212732473 +Ref: Library<14>-Footnote-1222732540 +Ref: Library<14>-Footnote-1232732607 +Ref: Library<14>-Footnote-1242732674 +Ref: Library<14>-Footnote-1252732741 +Ref: Library<14>-Footnote-1262732808 +Ref: Library<14>-Footnote-1272732875 +Ref: Library<14>-Footnote-1282732942 +Ref: Library<14>-Footnote-1292733009 +Ref: Library<14>-Footnote-1302733076 +Ref: Library<14>-Footnote-1312733143 +Ref: Library<14>-Footnote-1322733210 +Ref: Library<14>-Footnote-1332733277 +Ref: Library<14>-Footnote-1342733344 +Ref: Library<14>-Footnote-1352733411 +Ref: Library<14>-Footnote-1362733478 +Ref: Library<14>-Footnote-1372733545 +Ref: Library<14>-Footnote-1382733612 +Ref: Library<14>-Footnote-1392733679 +Ref: Library<14>-Footnote-1402733746 +Ref: Library<14>-Footnote-1412733813 +Ref: Library<14>-Footnote-1422733880 +Ref: Library<14>-Footnote-1432733947 +Ref: Library<14>-Footnote-1442734014 +Ref: Library<14>-Footnote-1452734081 +Ref: Library<14>-Footnote-1462734148 +Ref: Library<14>-Footnote-1472734215 +Ref: Library<14>-Footnote-1482734281 +Ref: Library<14>-Footnote-1492734348 +Ref: Library<14>-Footnote-1502734415 +Ref: Library<14>-Footnote-1512734476 +Ref: Library<14>-Footnote-1522734543 +Ref: Library<14>-Footnote-1532734610 +Ref: Library<14>-Footnote-1542734677 +Ref: Library<14>-Footnote-1552734744 +Ref: Library<14>-Footnote-1562734811 +Ref: Library<14>-Footnote-1572734878 +Ref: Library<14>-Footnote-1582734945 +Ref: Library<14>-Footnote-1592735012 +Ref: Library<14>-Footnote-1602735056 +Ref: Library<14>-Footnote-1612735123 +Ref: Library<14>-Footnote-1622735190 +Ref: Library<14>-Footnote-1632735257 +Ref: Library<14>-Footnote-1642735324 +Ref: Library<14>-Footnote-1652735391 +Ref: Library<14>-Footnote-1662735458 +Ref: Library<14>-Footnote-1672735525 +Ref: Library<14>-Footnote-1682735592 +Ref: Library<14>-Footnote-1692735659 +Ref: Library<14>-Footnote-1702735726 +Ref: Library<14>-Footnote-1712735793 +Ref: Library<14>-Footnote-1722735860 +Ref: Library<14>-Footnote-1732735927 +Ref: Library<14>-Footnote-1742735994 +Ref: Library<14>-Footnote-1752736061 +Ref: Library<14>-Footnote-1762736128 +Ref: Library<14>-Footnote-1772736195 +Ref: Library<14>-Footnote-1782736262 +Ref: Library<14>-Footnote-1792736329 +Ref: Library<14>-Footnote-1802736396 +Ref: Library<14>-Footnote-1812736463 +Ref: Library<14>-Footnote-1822736530 +Ref: Library<14>-Footnote-1832736597 +Ref: Library<14>-Footnote-1842736664 +Ref: Library<14>-Footnote-1852736731 +Ref: Library<14>-Footnote-1862736798 +Ref: Library<14>-Footnote-1872736865 +Ref: Library<14>-Footnote-1882736932 +Ref: Library<14>-Footnote-1892736999 +Ref: Library<14>-Footnote-1902737066 +Ref: Library<14>-Footnote-1912737133 +Ref: Library<14>-Footnote-1922737200 +Ref: Library<14>-Footnote-1932737267 +Ref: Library<14>-Footnote-1942737334 +Ref: Library<14>-Footnote-1952737401 +Ref: Library<14>-Footnote-1962737467 +Ref: Library<14>-Footnote-1972737534 +Ref: Library<14>-Footnote-1982737601 +Ref: Library<14>-Footnote-1992737668 +Ref: Library<14>-Footnote-2002737735 +Ref: Library<14>-Footnote-2012737802 +Ref: Library<14>-Footnote-2022737869 +Ref: Library<14>-Footnote-2032737936 +Ref: Library<14>-Footnote-2042738003 +Ref: Library<14>-Footnote-2052738070 +Ref: Library<14>-Footnote-2062738137 +Ref: Library<14>-Footnote-2072738204 +Ref: Library<14>-Footnote-2082738271 +Ref: Library<14>-Footnote-2092738338 +Node: Documentation<14>2738405 +Ref: whatsnew/changelog id1022738518 +Ref: 12aa2738518 +Ref: Documentation<14>-Footnote-12744847 +Ref: Documentation<14>-Footnote-22744912 +Ref: Documentation<14>-Footnote-32744977 +Ref: Documentation<14>-Footnote-42745042 +Ref: Documentation<14>-Footnote-52745107 +Ref: Documentation<14>-Footnote-62745172 +Ref: Documentation<14>-Footnote-72745237 +Ref: Documentation<14>-Footnote-82745302 +Ref: Documentation<14>-Footnote-92745361 +Ref: Documentation<14>-Footnote-102745426 +Ref: Documentation<14>-Footnote-112745492 +Ref: Documentation<14>-Footnote-122745558 +Ref: Documentation<14>-Footnote-132745624 +Ref: Documentation<14>-Footnote-142745690 +Ref: Documentation<14>-Footnote-152745756 +Ref: Documentation<14>-Footnote-162745822 +Ref: Documentation<14>-Footnote-172745888 +Ref: Documentation<14>-Footnote-182745954 +Ref: Documentation<14>-Footnote-192746020 +Ref: Documentation<14>-Footnote-202746086 +Ref: Documentation<14>-Footnote-212746152 +Ref: Documentation<14>-Footnote-222746218 +Ref: Documentation<14>-Footnote-232746284 +Ref: Documentation<14>-Footnote-242746350 +Ref: Documentation<14>-Footnote-252746416 +Ref: Documentation<14>-Footnote-262746482 +Ref: Documentation<14>-Footnote-272746548 +Ref: Documentation<14>-Footnote-282746614 +Ref: Documentation<14>-Footnote-292746680 +Ref: Documentation<14>-Footnote-302746746 +Ref: Documentation<14>-Footnote-312746812 +Ref: Documentation<14>-Footnote-322746878 +Ref: Documentation<14>-Footnote-332746944 +Ref: Documentation<14>-Footnote-342747010 +Ref: Documentation<14>-Footnote-352747076 +Ref: Documentation<14>-Footnote-362747142 +Ref: Documentation<14>-Footnote-372747208 +Ref: Documentation<14>-Footnote-382747274 +Ref: Documentation<14>-Footnote-392747340 +Ref: Documentation<14>-Footnote-402747406 +Ref: Documentation<14>-Footnote-412747472 +Node: Tests<14>2747538 +Ref: whatsnew/changelog id1032747649 +Ref: 12af2747649 +Ref: Tests<14>-Footnote-12753509 +Ref: Tests<14>-Footnote-22753574 +Ref: Tests<14>-Footnote-32753639 +Ref: Tests<14>-Footnote-42753704 +Ref: Tests<14>-Footnote-52753769 +Ref: Tests<14>-Footnote-62753834 +Ref: Tests<14>-Footnote-72753899 +Ref: Tests<14>-Footnote-82753964 +Ref: Tests<14>-Footnote-92754029 +Ref: Tests<14>-Footnote-102754094 +Ref: Tests<14>-Footnote-112754160 +Ref: Tests<14>-Footnote-122754226 +Ref: Tests<14>-Footnote-132754292 +Ref: Tests<14>-Footnote-142754358 +Ref: Tests<14>-Footnote-152754424 +Ref: Tests<14>-Footnote-162754490 +Ref: Tests<14>-Footnote-172754556 +Ref: Tests<14>-Footnote-182754622 +Ref: Tests<14>-Footnote-192754688 +Ref: Tests<14>-Footnote-202754754 +Ref: Tests<14>-Footnote-212754820 +Ref: Tests<14>-Footnote-222754886 +Ref: Tests<14>-Footnote-232754952 +Ref: Tests<14>-Footnote-242755018 +Ref: Tests<14>-Footnote-252755084 +Ref: Tests<14>-Footnote-262755150 +Ref: Tests<14>-Footnote-272755216 +Ref: Tests<14>-Footnote-282755282 +Ref: Tests<14>-Footnote-292755348 +Ref: Tests<14>-Footnote-302755414 +Ref: Tests<14>-Footnote-312755480 +Ref: Tests<14>-Footnote-322755546 +Ref: Tests<14>-Footnote-332755612 +Ref: Tests<14>-Footnote-342755678 +Ref: Tests<14>-Footnote-352755744 +Node: Build<15>2755810 +Ref: whatsnew/changelog id1042755915 +Ref: 12b32755915 +Ref: Build<15>-Footnote-12757993 +Ref: Build<15>-Footnote-22758058 +Ref: Build<15>-Footnote-32758123 +Ref: Build<15>-Footnote-42758188 +Ref: Build<15>-Footnote-52758253 +Ref: Build<15>-Footnote-62758318 +Ref: Build<15>-Footnote-72758383 +Ref: Build<15>-Footnote-82758448 +Ref: Build<15>-Footnote-92758513 +Ref: Build<15>-Footnote-102758578 +Ref: Build<15>-Footnote-112758644 +Node: Windows<14>2758710 +Ref: whatsnew/changelog id1052758814 +Ref: 12b42758814 +Ref: Windows<14>-Footnote-12759923 +Ref: Windows<14>-Footnote-22759988 +Ref: Windows<14>-Footnote-32760053 +Ref: Windows<14>-Footnote-42760118 +Ref: Windows<14>-Footnote-52760183 +Ref: Windows<14>-Footnote-62760248 +Ref: Windows<14>-Footnote-72760313 +Ref: Windows<14>-Footnote-82760378 +Ref: Windows<14>-Footnote-92760443 +Node: macOS<8>2760508 +Ref: whatsnew/changelog id1062760610 +Ref: 12b62760610 +Ref: macOS<8>-Footnote-12761765 +Ref: macOS<8>-Footnote-22761830 +Ref: macOS<8>-Footnote-32761895 +Ref: macOS<8>-Footnote-42761960 +Ref: macOS<8>-Footnote-52762025 +Ref: macOS<8>-Footnote-62762090 +Ref: macOS<8>-Footnote-72762155 +Node: IDLE<7>2762220 +Ref: whatsnew/changelog id1072762325 +Ref: 12b72762325 +Ref: IDLE<7>-Footnote-12763854 +Ref: IDLE<7>-Footnote-22763919 +Ref: IDLE<7>-Footnote-32763984 +Ref: IDLE<7>-Footnote-42764049 +Ref: IDLE<7>-Footnote-52764114 +Ref: IDLE<7>-Footnote-62764179 +Ref: IDLE<7>-Footnote-72764244 +Ref: IDLE<7>-Footnote-82764309 +Ref: IDLE<7>-Footnote-92764374 +Node: Tools/Demos<4>2764439 +Ref: whatsnew/changelog id1082764545 +Ref: 12b82764545 +Ref: Tools/Demos<4>-Footnote-12765350 +Ref: Tools/Demos<4>-Footnote-22765415 +Ref: Tools/Demos<4>-Footnote-32765480 +Ref: Tools/Demos<4>-Footnote-42765545 +Ref: Tools/Demos<4>-Footnote-52765610 +Ref: Tools/Demos<4>-Footnote-62765675 +Node: C API<12>2765740 +Ref: whatsnew/changelog id1092765830 +Ref: 12b92765830 +Ref: C API<12>-Footnote-12771723 +Ref: C API<12>-Footnote-22771788 +Ref: C API<12>-Footnote-32771853 +Ref: C API<12>-Footnote-42771918 +Ref: C API<12>-Footnote-52771983 +Ref: C API<12>-Footnote-62772048 +Ref: C API<12>-Footnote-72772113 +Ref: C API<12>-Footnote-82772178 +Ref: C API<12>-Footnote-92772243 +Ref: C API<12>-Footnote-102772308 +Ref: C API<12>-Footnote-112772374 +Ref: C API<12>-Footnote-122772440 +Ref: C API<12>-Footnote-132772506 +Ref: C API<12>-Footnote-142772572 +Ref: C API<12>-Footnote-152772638 +Ref: C API<12>-Footnote-162772704 +Ref: C API<12>-Footnote-172772770 +Ref: C API<12>-Footnote-182772836 +Ref: C API<12>-Footnote-192772902 +Ref: C API<12>-Footnote-202772968 +Ref: C API<12>-Footnote-212773011 +Ref: C API<12>-Footnote-222773077 +Ref: C API<12>-Footnote-232773143 +Ref: C API<12>-Footnote-242773209 +Ref: C API<12>-Footnote-252773252 +Ref: C API<12>-Footnote-262773295 +Node: Python 3 10 0 beta 12773361 +Ref: whatsnew/changelog python-3-10-0-beta-12773487 +Ref: 12be2773487 +Node: Security<6>2773833 +Ref: whatsnew/changelog id1102773931 +Ref: 12bf2773931 +Ref: Security<6>-Footnote-12776867 +Ref: Security<6>-Footnote-22776932 +Ref: Security<6>-Footnote-32776997 +Ref: Security<6>-Footnote-42777062 +Ref: Security<6>-Footnote-52777127 +Ref: Security<6>-Footnote-62777192 +Ref: Security<6>-Footnote-72777257 +Ref: Security<6>-Footnote-82777322 +Ref: Security<6>-Footnote-92777387 +Ref: Security<6>-Footnote-102777452 +Ref: Security<6>-Footnote-112777518 +Node: Core and Builtins<16>2777584 +Ref: whatsnew/changelog id1112777702 +Ref: 12c22777702 +Ref: Core and Builtins<16>-Footnote-12783867 +Ref: Core and Builtins<16>-Footnote-22783932 +Ref: Core and Builtins<16>-Footnote-32783997 +Ref: Core and Builtins<16>-Footnote-42784062 +Ref: Core and Builtins<16>-Footnote-52784127 +Ref: Core and Builtins<16>-Footnote-62784192 +Ref: Core and Builtins<16>-Footnote-72784257 +Ref: Core and Builtins<16>-Footnote-82784322 +Ref: Core and Builtins<16>-Footnote-92784387 +Ref: Core and Builtins<16>-Footnote-102784452 +Ref: Core and Builtins<16>-Footnote-112784518 +Ref: Core and Builtins<16>-Footnote-122784584 +Ref: Core and Builtins<16>-Footnote-132784650 +Ref: Core and Builtins<16>-Footnote-142784716 +Ref: Core and Builtins<16>-Footnote-152784759 +Ref: Core and Builtins<16>-Footnote-162784825 +Ref: Core and Builtins<16>-Footnote-172784891 +Ref: Core and Builtins<16>-Footnote-182784957 +Ref: Core and Builtins<16>-Footnote-192785023 +Ref: Core and Builtins<16>-Footnote-202785089 +Ref: Core and Builtins<16>-Footnote-212785155 +Ref: Core and Builtins<16>-Footnote-222785221 +Ref: Core and Builtins<16>-Footnote-232785287 +Ref: Core and Builtins<16>-Footnote-242785353 +Ref: Core and Builtins<16>-Footnote-252785419 +Ref: Core and Builtins<16>-Footnote-262785485 +Ref: Core and Builtins<16>-Footnote-272785551 +Ref: Core and Builtins<16>-Footnote-282785617 +Ref: Core and Builtins<16>-Footnote-292785683 +Ref: Core and Builtins<16>-Footnote-302785749 +Ref: Core and Builtins<16>-Footnote-312785815 +Ref: Core and Builtins<16>-Footnote-322785881 +Ref: Core and Builtins<16>-Footnote-332785947 +Ref: Core and Builtins<16>-Footnote-342786013 +Ref: Core and Builtins<16>-Footnote-352786079 +Node: Library<15>2786145 +Ref: whatsnew/changelog id1122786269 +Ref: 12c62786269 +Ref: Library<15>-Footnote-12803084 +Ref: Library<15>-Footnote-22803149 +Ref: Library<15>-Footnote-32803214 +Ref: Library<15>-Footnote-42803279 +Ref: Library<15>-Footnote-52803344 +Ref: Library<15>-Footnote-62803409 +Ref: Library<15>-Footnote-72803474 +Ref: Library<15>-Footnote-82803539 +Ref: Library<15>-Footnote-92803604 +Ref: Library<15>-Footnote-102803669 +Ref: Library<15>-Footnote-112803735 +Ref: Library<15>-Footnote-122803801 +Ref: Library<15>-Footnote-132803867 +Ref: Library<15>-Footnote-142803933 +Ref: Library<15>-Footnote-152803999 +Ref: Library<15>-Footnote-162804065 +Ref: Library<15>-Footnote-172804131 +Ref: Library<15>-Footnote-182804197 +Ref: Library<15>-Footnote-192804263 +Ref: Library<15>-Footnote-202804329 +Ref: Library<15>-Footnote-212804395 +Ref: Library<15>-Footnote-222804461 +Ref: Library<15>-Footnote-232804504 +Ref: Library<15>-Footnote-242804570 +Ref: Library<15>-Footnote-252804636 +Ref: Library<15>-Footnote-262804702 +Ref: Library<15>-Footnote-272804768 +Ref: Library<15>-Footnote-282804834 +Ref: Library<15>-Footnote-292804900 +Ref: Library<15>-Footnote-302804966 +Ref: Library<15>-Footnote-312805032 +Ref: Library<15>-Footnote-322805098 +Ref: Library<15>-Footnote-332805164 +Ref: Library<15>-Footnote-342805230 +Ref: Library<15>-Footnote-352805296 +Ref: Library<15>-Footnote-362805362 +Ref: Library<15>-Footnote-372805428 +Ref: Library<15>-Footnote-382805494 +Ref: Library<15>-Footnote-392805560 +Ref: Library<15>-Footnote-402805626 +Ref: Library<15>-Footnote-412805692 +Ref: Library<15>-Footnote-422805758 +Ref: Library<15>-Footnote-432805801 +Ref: Library<15>-Footnote-442805867 +Ref: Library<15>-Footnote-452805933 +Ref: Library<15>-Footnote-462805999 +Ref: Library<15>-Footnote-472806065 +Ref: Library<15>-Footnote-482806131 +Ref: Library<15>-Footnote-492806197 +Ref: Library<15>-Footnote-502806263 +Ref: Library<15>-Footnote-512806329 +Ref: Library<15>-Footnote-522806395 +Ref: Library<15>-Footnote-532806460 +Ref: Library<15>-Footnote-542806526 +Ref: Library<15>-Footnote-552806592 +Ref: Library<15>-Footnote-562806658 +Ref: Library<15>-Footnote-572806723 +Ref: Library<15>-Footnote-582806789 +Ref: Library<15>-Footnote-592806855 +Ref: Library<15>-Footnote-602806921 +Ref: Library<15>-Footnote-612806987 +Ref: Library<15>-Footnote-622807053 +Ref: Library<15>-Footnote-632807119 +Ref: Library<15>-Footnote-642807185 +Ref: Library<15>-Footnote-652807251 +Ref: Library<15>-Footnote-662807317 +Ref: Library<15>-Footnote-672807383 +Ref: Library<15>-Footnote-682807426 +Ref: Library<15>-Footnote-692807492 +Ref: Library<15>-Footnote-702807558 +Ref: Library<15>-Footnote-712807624 +Ref: Library<15>-Footnote-722807690 +Ref: Library<15>-Footnote-732807756 +Ref: Library<15>-Footnote-742807822 +Ref: Library<15>-Footnote-752807888 +Ref: Library<15>-Footnote-762807954 +Ref: Library<15>-Footnote-772808020 +Ref: Library<15>-Footnote-782808086 +Ref: Library<15>-Footnote-792808152 +Ref: Library<15>-Footnote-802808218 +Ref: Library<15>-Footnote-812808284 +Ref: Library<15>-Footnote-822808350 +Node: Documentation<15>2808416 +Ref: whatsnew/changelog id1132808528 +Ref: 12cd2808528 +Ref: Documentation<15>-Footnote-12809542 +Ref: Documentation<15>-Footnote-22809607 +Ref: Documentation<15>-Footnote-32809672 +Ref: Documentation<15>-Footnote-42809737 +Ref: Documentation<15>-Footnote-52809802 +Ref: Documentation<15>-Footnote-62809867 +Ref: Documentation<15>-Footnote-72809932 +Node: Tests<15>2809997 +Ref: whatsnew/changelog id1142810107 +Ref: 12ce2810107 +Ref: Tests<15>-Footnote-12811184 +Ref: Tests<15>-Footnote-22811249 +Ref: Tests<15>-Footnote-32811314 +Ref: Tests<15>-Footnote-42811379 +Ref: Tests<15>-Footnote-52811444 +Node: Build<16>2811509 +Ref: whatsnew/changelog id1152811613 +Ref: 12cf2811613 +Ref: Build<16>-Footnote-12811873 +Ref: Build<16>-Footnote-22811938 +Ref: Build<16>-Footnote-32812003 +Node: Windows<15>2812045 +Ref: whatsnew/changelog id1162812148 +Ref: 12d02812148 +Ref: Windows<15>-Footnote-12813491 +Ref: Windows<15>-Footnote-22813556 +Ref: Windows<15>-Footnote-32813621 +Ref: Windows<15>-Footnote-42813686 +Ref: Windows<15>-Footnote-52813751 +Ref: Windows<15>-Footnote-62813816 +Ref: Windows<15>-Footnote-72813881 +Ref: Windows<15>-Footnote-82813946 +Ref: Windows<15>-Footnote-92814011 +Node: macOS<9>2814076 +Ref: whatsnew/changelog id1172814177 +Ref: 12d42814177 +Ref: macOS<9>-Footnote-12815485 +Ref: macOS<9>-Footnote-22815550 +Ref: macOS<9>-Footnote-32815615 +Ref: macOS<9>-Footnote-42815680 +Ref: macOS<9>-Footnote-52815745 +Ref: macOS<9>-Footnote-62815810 +Node: IDLE<8>2815875 +Ref: whatsnew/changelog id1182815974 +Ref: 12d52815974 +Ref: IDLE<8>-Footnote-12816774 +Ref: IDLE<8>-Footnote-22816839 +Ref: IDLE<8>-Footnote-32816904 +Ref: IDLE<8>-Footnote-42816969 +Ref: IDLE<8>-Footnote-52817034 +Node: C API<13>2817099 +Ref: whatsnew/changelog id1192817181 +Ref: 12d62817181 +Ref: C API<13>-Footnote-12819418 +Ref: C API<13>-Footnote-22819483 +Ref: C API<13>-Footnote-32819548 +Ref: C API<13>-Footnote-42819613 +Ref: C API<13>-Footnote-52819678 +Ref: C API<13>-Footnote-62819743 +Ref: C API<13>-Footnote-72819808 +Ref: C API<13>-Footnote-82819873 +Ref: C API<13>-Footnote-92819938 +Ref: C API<13>-Footnote-102819980 +Node: Python 3 10 0 alpha 72820046 +Ref: whatsnew/changelog python-3-10-0-alpha-72820172 +Ref: 12d72820172 +Node: Security<7>2820501 +Ref: whatsnew/changelog id1202820600 +Ref: 12d82820600 +Ref: Security<7>-Footnote-12821681 +Ref: Security<7>-Footnote-22821746 +Ref: Security<7>-Footnote-32821811 +Node: Core and Builtins<17>2821876 +Ref: whatsnew/changelog id1212821995 +Ref: 12d92821995 +Ref: Core and Builtins<17>-Footnote-12826515 +Ref: Core and Builtins<17>-Footnote-22826580 +Ref: Core and Builtins<17>-Footnote-32826645 +Ref: Core and Builtins<17>-Footnote-42826710 +Ref: Core and Builtins<17>-Footnote-52826775 +Ref: Core and Builtins<17>-Footnote-62826840 +Ref: Core and Builtins<17>-Footnote-72826905 +Ref: Core and Builtins<17>-Footnote-82826970 +Ref: Core and Builtins<17>-Footnote-92827035 +Ref: Core and Builtins<17>-Footnote-102827077 +Ref: Core and Builtins<17>-Footnote-112827143 +Ref: Core and Builtins<17>-Footnote-122827209 +Ref: Core and Builtins<17>-Footnote-132827275 +Ref: Core and Builtins<17>-Footnote-142827341 +Ref: Core and Builtins<17>-Footnote-152827407 +Ref: Core and Builtins<17>-Footnote-162827473 +Ref: Core and Builtins<17>-Footnote-172827539 +Ref: Core and Builtins<17>-Footnote-182827605 +Ref: Core and Builtins<17>-Footnote-192827671 +Ref: Core and Builtins<17>-Footnote-202827737 +Ref: Core and Builtins<17>-Footnote-212827803 +Ref: Core and Builtins<17>-Footnote-222827869 +Ref: Core and Builtins<17>-Footnote-232827912 +Ref: Core and Builtins<17>-Footnote-242827978 +Node: Library<16>2828044 +Ref: whatsnew/changelog id1222828169 +Ref: 12da2828169 +Ref: Library<16>-Footnote-12835904 +Ref: Library<16>-Footnote-22835969 +Ref: Library<16>-Footnote-32836034 +Ref: Library<16>-Footnote-42836099 +Ref: Library<16>-Footnote-52836164 +Ref: Library<16>-Footnote-62836229 +Ref: Library<16>-Footnote-72836294 +Ref: Library<16>-Footnote-82836359 +Ref: Library<16>-Footnote-92836424 +Ref: Library<16>-Footnote-102836489 +Ref: Library<16>-Footnote-112836555 +Ref: Library<16>-Footnote-122836621 +Ref: Library<16>-Footnote-132836687 +Ref: Library<16>-Footnote-142836753 +Ref: Library<16>-Footnote-152836819 +Ref: Library<16>-Footnote-162836862 +Ref: Library<16>-Footnote-172836928 +Ref: Library<16>-Footnote-182836994 +Ref: Library<16>-Footnote-192837060 +Ref: Library<16>-Footnote-202837126 +Ref: Library<16>-Footnote-212837192 +Ref: Library<16>-Footnote-222837258 +Ref: Library<16>-Footnote-232837324 +Ref: Library<16>-Footnote-242837390 +Ref: Library<16>-Footnote-252837456 +Ref: Library<16>-Footnote-262837538 +Ref: Library<16>-Footnote-272837604 +Ref: Library<16>-Footnote-282837670 +Ref: Library<16>-Footnote-292837736 +Ref: Library<16>-Footnote-302837802 +Ref: Library<16>-Footnote-312837868 +Ref: Library<16>-Footnote-322837934 +Ref: Library<16>-Footnote-332838000 +Ref: Library<16>-Footnote-342838066 +Ref: Library<16>-Footnote-352838132 +Ref: Library<16>-Footnote-362838198 +Ref: Library<16>-Footnote-372838264 +Ref: Library<16>-Footnote-382838330 +Ref: Library<16>-Footnote-392838396 +Ref: Library<16>-Footnote-402838462 +Ref: Library<16>-Footnote-412838528 +Ref: Library<16>-Footnote-422838594 +Ref: Library<16>-Footnote-432838660 +Ref: Library<16>-Footnote-442838726 +Ref: Library<16>-Footnote-452838792 +Node: Documentation<16>2838858 +Ref: whatsnew/changelog id1232838971 +Ref: 12e42838971 +Ref: Documentation<16>-Footnote-12839668 +Ref: Documentation<16>-Footnote-22839733 +Ref: Documentation<16>-Footnote-32839798 +Ref: Documentation<16>-Footnote-42839863 +Node: Tests<16>2839928 +Ref: whatsnew/changelog id1242840039 +Ref: 12e52840039 +Ref: Tests<16>-Footnote-12840344 +Ref: Tests<16>-Footnote-22840409 +Node: Build<17>2840474 +Ref: whatsnew/changelog id1252840579 +Ref: 12e62840579 +Ref: Build<17>-Footnote-12841550 +Ref: Build<17>-Footnote-22841615 +Ref: Build<17>-Footnote-32841680 +Ref: Build<17>-Footnote-42841745 +Ref: Build<17>-Footnote-52841810 +Ref: Build<17>-Footnote-62841875 +Node: Windows<16>2841940 +Ref: whatsnew/changelog id1262842043 +Ref: 12e72842043 +Ref: Windows<16>-Footnote-12842233 +Node: IDLE<9>2842298 +Ref: whatsnew/changelog id1272842401 +Ref: 12e82842401 +Ref: IDLE<9>-Footnote-12842642 +Node: C API<14>2842707 +Ref: whatsnew/changelog id1282842790 +Ref: 12e92842790 +Ref: C API<14>-Footnote-12846254 +Ref: C API<14>-Footnote-22846319 +Ref: C API<14>-Footnote-32846384 +Ref: C API<14>-Footnote-42846449 +Ref: C API<14>-Footnote-52846514 +Ref: C API<14>-Footnote-62846579 +Ref: C API<14>-Footnote-72846644 +Ref: C API<14>-Footnote-82846709 +Ref: C API<14>-Footnote-92846774 +Node: Python 3 10 0 alpha 62846816 +Ref: whatsnew/changelog python-3-10-0-alpha-62846943 +Ref: 12ea2846943 +Node: Security<8>2847293 +Ref: whatsnew/changelog id1292847392 +Ref: 12eb2847392 +Ref: Security<8>-Footnote-12847638 +Node: Core and Builtins<18>2847703 +Ref: whatsnew/changelog id1302847822 +Ref: 12ec2847822 +Ref: Core and Builtins<18>-Footnote-12851259 +Ref: Core and Builtins<18>-Footnote-22851324 +Ref: Core and Builtins<18>-Footnote-32851389 +Ref: Core and Builtins<18>-Footnote-42851431 +Ref: Core and Builtins<18>-Footnote-52851496 +Ref: Core and Builtins<18>-Footnote-62851561 +Ref: Core and Builtins<18>-Footnote-72851626 +Ref: Core and Builtins<18>-Footnote-82851691 +Ref: Core and Builtins<18>-Footnote-92851756 +Ref: Core and Builtins<18>-Footnote-102851821 +Ref: Core and Builtins<18>-Footnote-112851887 +Ref: Core and Builtins<18>-Footnote-122851953 +Ref: Core and Builtins<18>-Footnote-132852019 +Ref: Core and Builtins<18>-Footnote-142852085 +Ref: Core and Builtins<18>-Footnote-152852128 +Ref: Core and Builtins<18>-Footnote-162852194 +Node: Library<17>2852260 +Ref: whatsnew/changelog id1312852385 +Ref: 12ed2852385 +Ref: Library<17>-Footnote-12855222 +Ref: Library<17>-Footnote-22855287 +Ref: Library<17>-Footnote-32855352 +Ref: Library<17>-Footnote-42855417 +Ref: Library<17>-Footnote-52855482 +Ref: Library<17>-Footnote-62855547 +Ref: Library<17>-Footnote-72855612 +Ref: Library<17>-Footnote-82855677 +Ref: Library<17>-Footnote-92855742 +Ref: Library<17>-Footnote-102855807 +Ref: Library<17>-Footnote-112855873 +Ref: Library<17>-Footnote-122855939 +Ref: Library<17>-Footnote-132856005 +Ref: Library<17>-Footnote-142856071 +Ref: Library<17>-Footnote-152856137 +Ref: Library<17>-Footnote-162856203 +Node: Documentation<17>2856269 +Ref: whatsnew/changelog id1322856382 +Ref: 12f12856382 +Ref: Documentation<17>-Footnote-12856736 +Ref: Documentation<17>-Footnote-22856801 +Ref: Documentation<17>-Footnote-32856866 +Node: Tests<17>2856908 +Ref: whatsnew/changelog id1332857019 +Ref: 12f22857019 +Ref: Tests<17>-Footnote-12857210 +Node: Build<18>2857275 +Ref: whatsnew/changelog id1342857380 +Ref: 12f32857380 +Ref: Build<18>-Footnote-12858449 +Ref: Build<18>-Footnote-22858514 +Ref: Build<18>-Footnote-32858579 +Ref: Build<18>-Footnote-42858644 +Ref: Build<18>-Footnote-52858709 +Node: Windows<17>2858774 +Ref: whatsnew/changelog id1352858879 +Ref: 12f42858879 +Ref: Windows<17>-Footnote-12859031 +Node: macOS<10>2859096 +Ref: whatsnew/changelog id1362859200 +Ref: 12f52859200 +Ref: macOS<10>-Footnote-12859341 +Node: IDLE<10>2859406 +Ref: whatsnew/changelog id1372859508 +Ref: 12f62859508 +Ref: IDLE<10>-Footnote-12859778 +Node: C API<15>2859843 +Ref: whatsnew/changelog id1382859927 +Ref: 12f72859927 +Ref: C API<15>-Footnote-12861670 +Ref: C API<15>-Footnote-22861735 +Ref: C API<15>-Footnote-32861800 +Ref: C API<15>-Footnote-42861865 +Ref: C API<15>-Footnote-52861930 +Ref: C API<15>-Footnote-62861995 +Ref: C API<15>-Footnote-72862060 +Ref: C API<15>-Footnote-82862125 +Ref: C API<15>-Footnote-92862190 +Node: Python 3 10 0 alpha 52862255 +Ref: whatsnew/changelog python-3-10-0-alpha-52862382 +Ref: 12fe2862382 +Node: Security<9>2862732 +Ref: whatsnew/changelog id1392862831 +Ref: 12ff2862831 +Ref: Security<9>-Footnote-12863053 +Node: Core and Builtins<19>2863118 +Ref: whatsnew/changelog id1402863237 +Ref: 13022863237 +Ref: Core and Builtins<19>-Footnote-12865756 +Ref: Core and Builtins<19>-Footnote-22865821 +Ref: Core and Builtins<19>-Footnote-32865886 +Ref: Core and Builtins<19>-Footnote-42865951 +Ref: Core and Builtins<19>-Footnote-52866016 +Ref: Core and Builtins<19>-Footnote-62866081 +Ref: Core and Builtins<19>-Footnote-72866146 +Ref: Core and Builtins<19>-Footnote-82866211 +Ref: Core and Builtins<19>-Footnote-92866276 +Ref: Core and Builtins<19>-Footnote-102866341 +Ref: Core and Builtins<19>-Footnote-112866407 +Ref: Core and Builtins<19>-Footnote-122866473 +Ref: Core and Builtins<19>-Footnote-132866539 +Ref: Core and Builtins<19>-Footnote-142866605 +Ref: Core and Builtins<19>-Footnote-152866671 +Node: Library<18>2866737 +Ref: whatsnew/changelog id1412866862 +Ref: 13032866862 +Ref: Library<18>-Footnote-12871807 +Ref: Library<18>-Footnote-22871872 +Ref: Library<18>-Footnote-32871937 +Ref: Library<18>-Footnote-42872002 +Ref: Library<18>-Footnote-52872067 +Ref: Library<18>-Footnote-62872132 +Ref: Library<18>-Footnote-72872197 +Ref: Library<18>-Footnote-82872262 +Ref: Library<18>-Footnote-92872327 +Ref: Library<18>-Footnote-102872392 +Ref: Library<18>-Footnote-112872458 +Ref: Library<18>-Footnote-122872524 +Ref: Library<18>-Footnote-132872590 +Ref: Library<18>-Footnote-142872656 +Ref: Library<18>-Footnote-152872722 +Ref: Library<18>-Footnote-162872788 +Ref: Library<18>-Footnote-172872854 +Ref: Library<18>-Footnote-182872920 +Ref: Library<18>-Footnote-192872963 +Ref: Library<18>-Footnote-202873029 +Ref: Library<18>-Footnote-212873095 +Ref: Library<18>-Footnote-222873161 +Ref: Library<18>-Footnote-232873227 +Ref: Library<18>-Footnote-242873295 +Ref: Library<18>-Footnote-252873338 +Ref: Library<18>-Footnote-262873404 +Ref: Library<18>-Footnote-272873470 +Ref: Library<18>-Footnote-282873536 +Ref: Library<18>-Footnote-292873602 +Ref: Library<18>-Footnote-302873668 +Ref: Library<18>-Footnote-312873734 +Ref: Library<18>-Footnote-322873800 +Ref: Library<18>-Footnote-332873866 +Ref: Library<18>-Footnote-342873932 +Node: Documentation<18>2873998 +Ref: whatsnew/changelog id1422874111 +Ref: 13042874111 +Ref: Documentation<18>-Footnote-12874440 +Ref: Documentation<18>-Footnote-22874505 +Node: Tests<18>2874570 +Ref: whatsnew/changelog id1432874681 +Ref: 13052874681 +Ref: Tests<18>-Footnote-12875037 +Ref: Tests<18>-Footnote-22875102 +Node: Build<19>2875167 +Ref: whatsnew/changelog id1442875272 +Ref: 13062875272 +Ref: Build<19>-Footnote-12876467 +Ref: Build<19>-Footnote-22876532 +Ref: Build<19>-Footnote-32876597 +Ref: Build<19>-Footnote-42876662 +Ref: Build<19>-Footnote-52876727 +Node: Windows<18>2876792 +Ref: whatsnew/changelog id1452876897 +Ref: 13072876897 +Ref: Windows<18>-Footnote-12877110 +Ref: Windows<18>-Footnote-22877175 +Node: macOS<11>2877240 +Ref: whatsnew/changelog id1462877344 +Ref: 13082877344 +Ref: macOS<11>-Footnote-12877595 +Node: IDLE<11>2877660 +Ref: whatsnew/changelog id1472877762 +Ref: 13092877762 +Ref: IDLE<11>-Footnote-12878324 +Ref: IDLE<11>-Footnote-22878389 +Ref: IDLE<11>-Footnote-32878454 +Ref: IDLE<11>-Footnote-42878519 +Node: C API<16>2878584 +Ref: whatsnew/changelog id1482878668 +Ref: 130a2878668 +Ref: C API<16>-Footnote-12879274 +Ref: C API<16>-Footnote-22879339 +Node: Python 3 10 0 alpha 42879404 +Ref: whatsnew/changelog python-3-10-0-alpha-42879531 +Ref: 130c2879531 +Node: Core and Builtins<20>2879845 +Ref: whatsnew/changelog id1492879944 +Ref: 130d2879944 +Ref: Core and Builtins<20>-Footnote-12883363 +Ref: Core and Builtins<20>-Footnote-22883428 +Ref: Core and Builtins<20>-Footnote-32883493 +Ref: Core and Builtins<20>-Footnote-42883558 +Ref: Core and Builtins<20>-Footnote-52883623 +Ref: Core and Builtins<20>-Footnote-62883688 +Ref: Core and Builtins<20>-Footnote-72883753 +Ref: Core and Builtins<20>-Footnote-82883818 +Ref: Core and Builtins<20>-Footnote-92883883 +Ref: Core and Builtins<20>-Footnote-102883948 +Ref: Core and Builtins<20>-Footnote-112884014 +Ref: Core and Builtins<20>-Footnote-122884080 +Ref: Core and Builtins<20>-Footnote-132884146 +Ref: Core and Builtins<20>-Footnote-142884212 +Ref: Core and Builtins<20>-Footnote-152884255 +Ref: Core and Builtins<20>-Footnote-162884321 +Ref: Core and Builtins<20>-Footnote-172884387 +Ref: Core and Builtins<20>-Footnote-182884453 +Ref: Core and Builtins<20>-Footnote-192884521 +Ref: Core and Builtins<20>-Footnote-202884564 +Ref: Core and Builtins<20>-Footnote-212884630 +Node: Library<19>2884696 +Ref: whatsnew/changelog id1502884821 +Ref: 130f2884821 +Ref: Library<19>-Footnote-12893656 +Ref: Library<19>-Footnote-22893721 +Ref: Library<19>-Footnote-32893786 +Ref: Library<19>-Footnote-42893851 +Ref: Library<19>-Footnote-52893916 +Ref: Library<19>-Footnote-62893981 +Ref: Library<19>-Footnote-72894046 +Ref: Library<19>-Footnote-82894088 +Ref: Library<19>-Footnote-92894130 +Ref: Library<19>-Footnote-102894195 +Ref: Library<19>-Footnote-112894261 +Ref: Library<19>-Footnote-122894327 +Ref: Library<19>-Footnote-132894393 +Ref: Library<19>-Footnote-142894459 +Ref: Library<19>-Footnote-152894525 +Ref: Library<19>-Footnote-162894591 +Ref: Library<19>-Footnote-172894657 +Ref: Library<19>-Footnote-182894723 +Ref: Library<19>-Footnote-192894788 +Ref: Library<19>-Footnote-202894856 +Ref: Library<19>-Footnote-212894899 +Ref: Library<19>-Footnote-222894965 +Ref: Library<19>-Footnote-232895031 +Ref: Library<19>-Footnote-242895097 +Ref: Library<19>-Footnote-252895163 +Ref: Library<19>-Footnote-262895229 +Ref: Library<19>-Footnote-272895295 +Ref: Library<19>-Footnote-282895361 +Ref: Library<19>-Footnote-292895427 +Ref: Library<19>-Footnote-302895493 +Ref: Library<19>-Footnote-312895559 +Ref: Library<19>-Footnote-322895625 +Ref: Library<19>-Footnote-332895668 +Ref: Library<19>-Footnote-342895734 +Ref: Library<19>-Footnote-352895800 +Ref: Library<19>-Footnote-362895866 +Ref: Library<19>-Footnote-372895932 +Ref: Library<19>-Footnote-382895998 +Ref: Library<19>-Footnote-392896064 +Ref: Library<19>-Footnote-402896130 +Ref: Library<19>-Footnote-412896196 +Ref: Library<19>-Footnote-422896262 +Ref: Library<19>-Footnote-432896328 +Ref: Library<19>-Footnote-442896394 +Ref: Library<19>-Footnote-452896460 +Ref: Library<19>-Footnote-462896526 +Ref: Library<19>-Footnote-472896592 +Ref: Library<19>-Footnote-482896660 +Ref: Library<19>-Footnote-492896703 +Ref: Library<19>-Footnote-502896769 +Ref: Library<19>-Footnote-512896835 +Ref: Library<19>-Footnote-522896901 +Ref: Library<19>-Footnote-532896967 +Ref: Library<19>-Footnote-542897033 +Ref: Library<19>-Footnote-552897099 +Ref: Library<19>-Footnote-562897165 +Ref: Library<19>-Footnote-572897231 +Ref: Library<19>-Footnote-582897297 +Node: Documentation<19>2897363 +Ref: whatsnew/changelog id1512897476 +Ref: 13152897476 +Ref: Documentation<19>-Footnote-12897792 +Ref: Documentation<19>-Footnote-22897857 +Node: Tests<19>2897922 +Ref: whatsnew/changelog id1522898033 +Ref: 13172898033 +Ref: Tests<19>-Footnote-12898811 +Ref: Tests<19>-Footnote-22898876 +Ref: Tests<19>-Footnote-32898941 +Ref: Tests<19>-Footnote-42899006 +Ref: Tests<19>-Footnote-52899071 +Ref: Tests<19>-Footnote-62899136 +Ref: Tests<19>-Footnote-72899201 +Ref: Tests<19>-Footnote-82899266 +Node: Build<20>2899331 +Ref: whatsnew/changelog id1532899434 +Ref: 13182899434 +Ref: Build<20>-Footnote-12900425 +Ref: Build<20>-Footnote-22900490 +Ref: Build<20>-Footnote-32900555 +Ref: Build<20>-Footnote-42900620 +Ref: Build<20>-Footnote-52900685 +Ref: Build<20>-Footnote-62900750 +Node: macOS<12>2900815 +Ref: whatsnew/changelog id1542900923 +Ref: 13192900923 +Ref: macOS<12>-Footnote-12901241 +Ref: macOS<12>-Footnote-22901306 +Ref: macOS<12>-Footnote-32901371 +Node: Tools/Demos<5>2901436 +Ref: whatsnew/changelog id1552901544 +Ref: 131a2901544 +Ref: Tools/Demos<5>-Footnote-12901868 +Ref: Tools/Demos<5>-Footnote-22901933 +Node: C API<17>2901998 +Ref: whatsnew/changelog id1562902088 +Ref: 131b2902088 +Ref: C API<17>-Footnote-12902929 +Ref: C API<17>-Footnote-22902994 +Ref: C API<17>-Footnote-32903059 +Ref: C API<17>-Footnote-42903126 +Ref: C API<17>-Footnote-52903191 +Node: Python 3 10 0 alpha 32903256 +Ref: whatsnew/changelog python-3-10-0-alpha-32903383 +Ref: 131c2903383 +Node: Security<10>2903765 +Ref: whatsnew/changelog id1572903865 +Ref: 131d2903865 +Ref: Security<10>-Footnote-12904105 +Node: Core and Builtins<21>2904170 +Ref: whatsnew/changelog id1582904290 +Ref: 131e2904290 +Ref: Core and Builtins<21>-Footnote-12908591 +Ref: Core and Builtins<21>-Footnote-22908656 +Ref: Core and Builtins<21>-Footnote-32908721 +Ref: Core and Builtins<21>-Footnote-42908786 +Ref: Core and Builtins<21>-Footnote-52908851 +Ref: Core and Builtins<21>-Footnote-62908916 +Ref: Core and Builtins<21>-Footnote-72908983 +Ref: Core and Builtins<21>-Footnote-82909025 +Ref: Core and Builtins<21>-Footnote-92909090 +Ref: Core and Builtins<21>-Footnote-102909155 +Ref: Core and Builtins<21>-Footnote-112909221 +Ref: Core and Builtins<21>-Footnote-122909287 +Ref: Core and Builtins<21>-Footnote-132909353 +Ref: Core and Builtins<21>-Footnote-142909419 +Ref: Core and Builtins<21>-Footnote-152909485 +Ref: Core and Builtins<21>-Footnote-162909551 +Ref: Core and Builtins<21>-Footnote-172909617 +Ref: Core and Builtins<21>-Footnote-182909683 +Ref: Core and Builtins<21>-Footnote-192909749 +Ref: Core and Builtins<21>-Footnote-202909815 +Ref: Core and Builtins<21>-Footnote-212909881 +Ref: Core and Builtins<21>-Footnote-222909947 +Ref: Core and Builtins<21>-Footnote-232910013 +Node: Library<20>2910079 +Ref: whatsnew/changelog id1592910204 +Ref: 13212910204 +Ref: Library<20>-Footnote-12921291 +Ref: Library<20>-Footnote-22921355 +Ref: Library<20>-Footnote-32921420 +Ref: Library<20>-Footnote-42921485 +Ref: Library<20>-Footnote-52921550 +Ref: Library<20>-Footnote-62921615 +Ref: Library<20>-Footnote-72921680 +Ref: Library<20>-Footnote-82921745 +Ref: Library<20>-Footnote-92921810 +Ref: Library<20>-Footnote-102921875 +Ref: Library<20>-Footnote-112921941 +Ref: Library<20>-Footnote-122922007 +Ref: Library<20>-Footnote-132922073 +Ref: Library<20>-Footnote-142922139 +Ref: Library<20>-Footnote-152922205 +Ref: Library<20>-Footnote-162922271 +Ref: Library<20>-Footnote-172922337 +Ref: Library<20>-Footnote-182922403 +Ref: Library<20>-Footnote-192922469 +Ref: Library<20>-Footnote-202922535 +Ref: Library<20>-Footnote-212922601 +Ref: Library<20>-Footnote-222922667 +Ref: Library<20>-Footnote-232922733 +Ref: Library<20>-Footnote-242922801 +Ref: Library<20>-Footnote-252922867 +Ref: Library<20>-Footnote-262922933 +Ref: Library<20>-Footnote-272922976 +Ref: Library<20>-Footnote-282923042 +Ref: Library<20>-Footnote-292923108 +Ref: Library<20>-Footnote-302923174 +Ref: Library<20>-Footnote-312923240 +Ref: Library<20>-Footnote-322923306 +Ref: Library<20>-Footnote-332923372 +Ref: Library<20>-Footnote-342923438 +Ref: Library<20>-Footnote-352923504 +Ref: Library<20>-Footnote-362923570 +Ref: Library<20>-Footnote-372923636 +Ref: Library<20>-Footnote-382923702 +Ref: Library<20>-Footnote-392923768 +Ref: Library<20>-Footnote-402923834 +Ref: Library<20>-Footnote-412923900 +Ref: Library<20>-Footnote-422923966 +Ref: Library<20>-Footnote-432924032 +Ref: Library<20>-Footnote-442924098 +Ref: Library<20>-Footnote-452924164 +Ref: Library<20>-Footnote-462924230 +Ref: Library<20>-Footnote-472924296 +Ref: Library<20>-Footnote-482924362 +Ref: Library<20>-Footnote-492924428 +Ref: Library<20>-Footnote-502924494 +Ref: Library<20>-Footnote-512924560 +Ref: Library<20>-Footnote-522924626 +Ref: Library<20>-Footnote-532924692 +Ref: Library<20>-Footnote-542924758 +Ref: Library<20>-Footnote-552924824 +Ref: Library<20>-Footnote-562924890 +Ref: Library<20>-Footnote-572924956 +Ref: Library<20>-Footnote-582925022 +Ref: Library<20>-Footnote-592925088 +Ref: Library<20>-Footnote-602925154 +Ref: Library<20>-Footnote-612925220 +Ref: Library<20>-Footnote-622925286 +Ref: Library<20>-Footnote-632925352 +Ref: Library<20>-Footnote-642925418 +Ref: Library<20>-Footnote-652925484 +Node: Documentation<20>2925550 +Ref: whatsnew/changelog id1602925663 +Ref: 13262925663 +Ref: Documentation<20>-Footnote-12926129 +Ref: Documentation<20>-Footnote-22926194 +Ref: Documentation<20>-Footnote-32926259 +Node: Tests<20>2926324 +Ref: whatsnew/changelog id1612926435 +Ref: 13272926435 +Ref: Tests<20>-Footnote-12927643 +Ref: Tests<20>-Footnote-22927708 +Ref: Tests<20>-Footnote-32927773 +Ref: Tests<20>-Footnote-42927838 +Ref: Tests<20>-Footnote-52927903 +Ref: Tests<20>-Footnote-62927968 +Ref: Tests<20>-Footnote-72928033 +Ref: Tests<20>-Footnote-82928098 +Ref: Tests<20>-Footnote-92928163 +Ref: Tests<20>-Footnote-102928228 +Ref: Tests<20>-Footnote-112928294 +Ref: Tests<20>-Footnote-122928360 +Node: Build<21>2928426 +Ref: whatsnew/changelog id1622928531 +Ref: 13282928531 +Ref: Build<21>-Footnote-12929672 +Ref: Build<21>-Footnote-22929737 +Ref: Build<21>-Footnote-32929802 +Ref: Build<21>-Footnote-42929867 +Ref: Build<21>-Footnote-52929932 +Ref: Build<21>-Footnote-62929997 +Ref: Build<21>-Footnote-72930062 +Node: Windows<19>2930127 +Ref: whatsnew/changelog id1632930232 +Ref: 13292930232 +Ref: Windows<19>-Footnote-12930524 +Ref: Windows<19>-Footnote-22930589 +Node: macOS<13>2930654 +Ref: whatsnew/changelog id1642930758 +Ref: 132a2930758 +Ref: macOS<13>-Footnote-12931706 +Ref: macOS<13>-Footnote-22931771 +Ref: macOS<13>-Footnote-32931836 +Ref: macOS<13>-Footnote-42931901 +Ref: macOS<13>-Footnote-52931966 +Node: IDLE<12>2932031 +Ref: whatsnew/changelog id1652932138 +Ref: 132b2932138 +Ref: IDLE<12>-Footnote-12932558 +Ref: IDLE<12>-Footnote-22932623 +Ref: IDLE<12>-Footnote-32932688 +Node: Tools/Demos<6>2932753 +Ref: whatsnew/changelog id1662932860 +Ref: 132c2932860 +Ref: Tools/Demos<6>-Footnote-12933262 +Ref: Tools/Demos<6>-Footnote-22933327 +Node: C API<18>2933392 +Ref: whatsnew/changelog id1672933482 +Ref: 132d2933482 +Ref: C API<18>-Footnote-12938247 +Ref: C API<18>-Footnote-22938312 +Ref: C API<18>-Footnote-32938379 +Ref: C API<18>-Footnote-42938421 +Ref: C API<18>-Footnote-52938488 +Ref: C API<18>-Footnote-62938530 +Ref: C API<18>-Footnote-72938597 +Ref: C API<18>-Footnote-82938639 +Ref: C API<18>-Footnote-92938706 +Ref: C API<18>-Footnote-102938748 +Ref: C API<18>-Footnote-112938816 +Ref: C API<18>-Footnote-122938859 +Ref: C API<18>-Footnote-132938927 +Ref: C API<18>-Footnote-142938970 +Ref: C API<18>-Footnote-152939038 +Ref: C API<18>-Footnote-162939081 +Ref: C API<18>-Footnote-172939147 +Ref: C API<18>-Footnote-182939215 +Ref: C API<18>-Footnote-192939258 +Ref: C API<18>-Footnote-202939326 +Ref: C API<18>-Footnote-212939369 +Ref: C API<18>-Footnote-222939437 +Ref: C API<18>-Footnote-232939480 +Ref: C API<18>-Footnote-242939548 +Ref: C API<18>-Footnote-252939591 +Ref: C API<18>-Footnote-262939657 +Ref: C API<18>-Footnote-272939723 +Ref: C API<18>-Footnote-282939789 +Ref: C API<18>-Footnote-292939855 +Ref: C API<18>-Footnote-302939921 +Ref: C API<18>-Footnote-312939987 +Ref: C API<18>-Footnote-322940053 +Ref: C API<18>-Footnote-332940121 +Ref: C API<18>-Footnote-342940187 +Ref: C API<18>-Footnote-352940253 +Ref: C API<18>-Footnote-362940319 +Node: Python 3 10 0 alpha 22940385 +Ref: whatsnew/changelog python-3-10-0-alpha-22940512 +Ref: 13302940512 +Node: Security<11>2940863 +Ref: whatsnew/changelog id1682940963 +Ref: 13312940963 +Ref: Security<11>-Footnote-12941439 +Ref: Security<11>-Footnote-22941504 +Node: Core and Builtins<22>2941569 +Ref: whatsnew/changelog id1692941689 +Ref: 13322941689 +Ref: Core and Builtins<22>-Footnote-12945513 +Ref: Core and Builtins<22>-Footnote-22945578 +Ref: Core and Builtins<22>-Footnote-32945643 +Ref: Core and Builtins<22>-Footnote-42945708 +Ref: Core and Builtins<22>-Footnote-52945773 +Ref: Core and Builtins<22>-Footnote-62945838 +Ref: Core and Builtins<22>-Footnote-72945903 +Ref: Core and Builtins<22>-Footnote-82945968 +Ref: Core and Builtins<22>-Footnote-92946033 +Ref: Core and Builtins<22>-Footnote-102946098 +Ref: Core and Builtins<22>-Footnote-112946164 +Ref: Core and Builtins<22>-Footnote-122946230 +Ref: Core and Builtins<22>-Footnote-132946296 +Ref: Core and Builtins<22>-Footnote-142946362 +Ref: Core and Builtins<22>-Footnote-152946428 +Ref: Core and Builtins<22>-Footnote-162946494 +Ref: Core and Builtins<22>-Footnote-172946560 +Ref: Core and Builtins<22>-Footnote-182946626 +Ref: Core and Builtins<22>-Footnote-192946692 +Ref: Core and Builtins<22>-Footnote-202946758 +Ref: Core and Builtins<22>-Footnote-212946824 +Node: Library<21>2946867 +Ref: whatsnew/changelog id1702946992 +Ref: 13362946992 +Ref: Library<21>-Footnote-12954020 +Ref: Library<21>-Footnote-22954085 +Ref: Library<21>-Footnote-32954150 +Ref: Library<21>-Footnote-42954215 +Ref: Library<21>-Footnote-52954280 +Ref: Library<21>-Footnote-62954345 +Ref: Library<21>-Footnote-72954410 +Ref: Library<21>-Footnote-82954452 +Ref: Library<21>-Footnote-92954517 +Ref: Library<21>-Footnote-102954582 +Ref: Library<21>-Footnote-112954648 +Ref: Library<21>-Footnote-122954714 +Ref: Library<21>-Footnote-132954780 +Ref: Library<21>-Footnote-142954846 +Ref: Library<21>-Footnote-152954912 +Ref: Library<21>-Footnote-162954978 +Ref: Library<21>-Footnote-172955044 +Ref: Library<21>-Footnote-182955110 +Ref: Library<21>-Footnote-192955176 +Ref: Library<21>-Footnote-202955242 +Ref: Library<21>-Footnote-212955308 +Ref: Library<21>-Footnote-222955374 +Ref: Library<21>-Footnote-232955440 +Ref: Library<21>-Footnote-242955506 +Ref: Library<21>-Footnote-252955572 +Ref: Library<21>-Footnote-262955615 +Ref: Library<21>-Footnote-272955681 +Ref: Library<21>-Footnote-282955747 +Ref: Library<21>-Footnote-292955813 +Ref: Library<21>-Footnote-302955879 +Ref: Library<21>-Footnote-312955945 +Ref: Library<21>-Footnote-322956011 +Ref: Library<21>-Footnote-332956077 +Ref: Library<21>-Footnote-342956143 +Ref: Library<21>-Footnote-352956209 +Ref: Library<21>-Footnote-362956275 +Ref: Library<21>-Footnote-372956340 +Ref: Library<21>-Footnote-382956406 +Ref: Library<21>-Footnote-392956472 +Ref: Library<21>-Footnote-402956538 +Ref: Library<21>-Footnote-412956604 +Node: Documentation<21>2956670 +Ref: whatsnew/changelog id1712956783 +Ref: 133a2956783 +Ref: Documentation<21>-Footnote-12957639 +Ref: Documentation<21>-Footnote-22957704 +Ref: Documentation<21>-Footnote-32957769 +Ref: Documentation<21>-Footnote-42957834 +Ref: Documentation<21>-Footnote-52957899 +Ref: Documentation<21>-Footnote-62957964 +Node: Tests<21>2958029 +Ref: whatsnew/changelog id1722958140 +Ref: 133e2958140 +Ref: Tests<21>-Footnote-12958777 +Ref: Tests<21>-Footnote-22958842 +Ref: Tests<21>-Footnote-32958907 +Ref: Tests<21>-Footnote-42958972 +Node: Build<22>2959037 +Ref: whatsnew/changelog id1732959142 +Ref: 133f2959142 +Ref: Build<22>-Footnote-12959406 +Node: Windows<20>2959471 +Ref: whatsnew/changelog id1742959576 +Ref: 13402959576 +Ref: Windows<20>-Footnote-12960052 +Ref: Windows<20>-Footnote-22960117 +Ref: Windows<20>-Footnote-32960182 +Ref: Windows<20>-Footnote-42960247 +Ref: Windows<20>-Footnote-52960312 +Node: macOS<14>2960377 +Ref: whatsnew/changelog id1752960481 +Ref: 13412960481 +Ref: macOS<14>-Footnote-12960631 +Node: IDLE<13>2960696 +Ref: whatsnew/changelog id1762960798 +Ref: 13422960798 +Ref: IDLE<13>-Footnote-12961411 +Ref: IDLE<13>-Footnote-22961476 +Ref: IDLE<13>-Footnote-32961541 +Node: C API<19>2961606 +Ref: whatsnew/changelog id1772961690 +Ref: 13432961690 +Ref: C API<19>-Footnote-12963012 +Ref: C API<19>-Footnote-22963077 +Ref: C API<19>-Footnote-32963142 +Ref: C API<19>-Footnote-42963207 +Ref: C API<19>-Footnote-52963272 +Ref: C API<19>-Footnote-62963337 +Ref: C API<19>-Footnote-72963402 +Ref: C API<19>-Footnote-82963467 +Node: Python 3 10 0 alpha 12963532 +Ref: whatsnew/changelog python-3-10-0-alpha-12963657 +Ref: 13452963657 +Node: Security<12>2964008 +Ref: whatsnew/changelog id1782964108 +Ref: 13462964108 +Ref: Security<12>-Footnote-12965003 +Ref: Security<12>-Footnote-22965068 +Ref: Security<12>-Footnote-32965133 +Ref: Security<12>-Footnote-42965198 +Ref: Security<12>-Footnote-52965263 +Ref: Security<12>-Footnote-62965328 +Node: Core and Builtins<23>2965393 +Ref: whatsnew/changelog id1792965513 +Ref: 13472965513 +Ref: Core and Builtins<23>-Footnote-12981064 +Ref: Core and Builtins<23>-Footnote-22981129 +Ref: Core and Builtins<23>-Footnote-32981194 +Ref: Core and Builtins<23>-Footnote-42981236 +Ref: Core and Builtins<23>-Footnote-52981301 +Ref: Core and Builtins<23>-Footnote-62981366 +Ref: Core and Builtins<23>-Footnote-72981408 +Ref: Core and Builtins<23>-Footnote-82981475 +Ref: Core and Builtins<23>-Footnote-92981517 +Ref: Core and Builtins<23>-Footnote-102981582 +Ref: Core and Builtins<23>-Footnote-112981648 +Ref: Core and Builtins<23>-Footnote-122981716 +Ref: Core and Builtins<23>-Footnote-132981759 +Ref: Core and Builtins<23>-Footnote-142981827 +Ref: Core and Builtins<23>-Footnote-152981870 +Ref: Core and Builtins<23>-Footnote-162981938 +Ref: Core and Builtins<23>-Footnote-172981981 +Ref: Core and Builtins<23>-Footnote-182982049 +Ref: Core and Builtins<23>-Footnote-192982092 +Ref: Core and Builtins<23>-Footnote-202982160 +Ref: Core and Builtins<23>-Footnote-212982226 +Ref: Core and Builtins<23>-Footnote-222982294 +Ref: Core and Builtins<23>-Footnote-232982337 +Ref: Core and Builtins<23>-Footnote-242982405 +Ref: Core and Builtins<23>-Footnote-252982448 +Ref: Core and Builtins<23>-Footnote-262982516 +Ref: Core and Builtins<23>-Footnote-272982559 +Ref: Core and Builtins<23>-Footnote-282982625 +Ref: Core and Builtins<23>-Footnote-292982691 +Ref: Core and Builtins<23>-Footnote-302982757 +Ref: Core and Builtins<23>-Footnote-312982823 +Ref: Core and Builtins<23>-Footnote-322982891 +Ref: Core and Builtins<23>-Footnote-332982934 +Ref: Core and Builtins<23>-Footnote-342983000 +Ref: Core and Builtins<23>-Footnote-352983066 +Ref: Core and Builtins<23>-Footnote-362983134 +Ref: Core and Builtins<23>-Footnote-372983202 +Ref: Core and Builtins<23>-Footnote-382983245 +Ref: Core and Builtins<23>-Footnote-392983311 +Ref: Core and Builtins<23>-Footnote-402983377 +Ref: Core and Builtins<23>-Footnote-412983443 +Ref: Core and Builtins<23>-Footnote-422983511 +Ref: Core and Builtins<23>-Footnote-432983554 +Ref: Core and Builtins<23>-Footnote-442983620 +Ref: Core and Builtins<23>-Footnote-452983686 +Ref: Core and Builtins<23>-Footnote-462983752 +Ref: Core and Builtins<23>-Footnote-472983818 +Ref: Core and Builtins<23>-Footnote-482983884 +Ref: Core and Builtins<23>-Footnote-492983950 +Ref: Core and Builtins<23>-Footnote-502984016 +Ref: Core and Builtins<23>-Footnote-512984082 +Ref: Core and Builtins<23>-Footnote-522984148 +Ref: Core and Builtins<23>-Footnote-532984214 +Ref: Core and Builtins<23>-Footnote-542984282 +Ref: Core and Builtins<23>-Footnote-552984350 +Ref: Core and Builtins<23>-Footnote-562984416 +Ref: Core and Builtins<23>-Footnote-572984482 +Ref: Core and Builtins<23>-Footnote-582984550 +Ref: Core and Builtins<23>-Footnote-592984618 +Ref: Core and Builtins<23>-Footnote-602984684 +Ref: Core and Builtins<23>-Footnote-612984750 +Ref: Core and Builtins<23>-Footnote-622984816 +Ref: Core and Builtins<23>-Footnote-632984882 +Ref: Core and Builtins<23>-Footnote-642984948 +Ref: Core and Builtins<23>-Footnote-652985014 +Ref: Core and Builtins<23>-Footnote-662985080 +Ref: Core and Builtins<23>-Footnote-672985146 +Ref: Core and Builtins<23>-Footnote-682985212 +Ref: Core and Builtins<23>-Footnote-692985278 +Ref: Core and Builtins<23>-Footnote-702985344 +Ref: Core and Builtins<23>-Footnote-712985410 +Ref: Core and Builtins<23>-Footnote-722985476 +Ref: Core and Builtins<23>-Footnote-732985542 +Ref: Core and Builtins<23>-Footnote-742985608 +Ref: Core and Builtins<23>-Footnote-752985674 +Ref: Core and Builtins<23>-Footnote-762985717 +Ref: Core and Builtins<23>-Footnote-772985785 +Ref: Core and Builtins<23>-Footnote-782985851 +Ref: Core and Builtins<23>-Footnote-792985917 +Ref: Core and Builtins<23>-Footnote-802985985 +Ref: Core and Builtins<23>-Footnote-812986051 +Ref: Core and Builtins<23>-Footnote-822986117 +Ref: Core and Builtins<23>-Footnote-832986160 +Ref: Core and Builtins<23>-Footnote-842986226 +Ref: Core and Builtins<23>-Footnote-852986292 +Ref: Core and Builtins<23>-Footnote-862986358 +Ref: Core and Builtins<23>-Footnote-872986424 +Ref: Core and Builtins<23>-Footnote-882986490 +Ref: Core and Builtins<23>-Footnote-892986556 +Ref: Core and Builtins<23>-Footnote-902986622 +Ref: Core and Builtins<23>-Footnote-912986688 +Ref: Core and Builtins<23>-Footnote-922986754 +Ref: Core and Builtins<23>-Footnote-932986820 +Ref: Core and Builtins<23>-Footnote-942986886 +Ref: Core and Builtins<23>-Footnote-952986952 +Ref: Core and Builtins<23>-Footnote-962987020 +Ref: Core and Builtins<23>-Footnote-972987086 +Ref: Core and Builtins<23>-Footnote-982987152 +Ref: Core and Builtins<23>-Footnote-992987218 +Ref: Core and Builtins<23>-Footnote-1002987284 +Ref: Core and Builtins<23>-Footnote-1012987351 +Ref: Core and Builtins<23>-Footnote-1022987418 +Ref: Core and Builtins<23>-Footnote-1032987485 +Ref: Core and Builtins<23>-Footnote-1042987552 +Ref: Core and Builtins<23>-Footnote-1052987619 +Ref: Core and Builtins<23>-Footnote-1062987686 +Ref: Core and Builtins<23>-Footnote-1072987753 +Ref: Core and Builtins<23>-Footnote-1082987820 +Ref: Core and Builtins<23>-Footnote-1092987886 +Ref: Core and Builtins<23>-Footnote-1102987955 +Ref: Core and Builtins<23>-Footnote-1112988024 +Ref: Core and Builtins<23>-Footnote-1122988091 +Ref: Core and Builtins<23>-Footnote-1132988158 +Ref: Core and Builtins<23>-Footnote-1142988225 +Ref: Core and Builtins<23>-Footnote-1152988292 +Node: Library<22>2988359 +Ref: whatsnew/changelog id1802988484 +Ref: 134d2988484 +Ref: Library<22>-Footnote-13010710 +Ref: Library<22>-Footnote-23010775 +Ref: Library<22>-Footnote-33010840 +Ref: Library<22>-Footnote-43010905 +Ref: Library<22>-Footnote-53010970 +Ref: Library<22>-Footnote-63011035 +Ref: Library<22>-Footnote-73011100 +Ref: Library<22>-Footnote-83011165 +Ref: Library<22>-Footnote-93011230 +Ref: Library<22>-Footnote-103011295 +Ref: Library<22>-Footnote-113011361 +Ref: Library<22>-Footnote-123011427 +Ref: Library<22>-Footnote-133011493 +Ref: Library<22>-Footnote-143011559 +Ref: Library<22>-Footnote-153011625 +Ref: Library<22>-Footnote-163011691 +Ref: Library<22>-Footnote-173011757 +Ref: Library<22>-Footnote-183011823 +Ref: Library<22>-Footnote-193011889 +Ref: Library<22>-Footnote-203011957 +Ref: Library<22>-Footnote-213012000 +Ref: Library<22>-Footnote-223012068 +Ref: Library<22>-Footnote-233012111 +Ref: Library<22>-Footnote-243012177 +Ref: Library<22>-Footnote-253012243 +Ref: Library<22>-Footnote-263012309 +Ref: Library<22>-Footnote-273012375 +Ref: Library<22>-Footnote-283012441 +Ref: Library<22>-Footnote-293012507 +Ref: Library<22>-Footnote-303012573 +Ref: Library<22>-Footnote-313012639 +Ref: Library<22>-Footnote-323012705 +Ref: Library<22>-Footnote-333012771 +Ref: Library<22>-Footnote-343012837 +Ref: Library<22>-Footnote-353012903 +Ref: Library<22>-Footnote-363012969 +Ref: Library<22>-Footnote-373013035 +Ref: Library<22>-Footnote-383013101 +Ref: Library<22>-Footnote-393013167 +Ref: Library<22>-Footnote-403013233 +Ref: Library<22>-Footnote-413013299 +Ref: Library<22>-Footnote-423013365 +Ref: Library<22>-Footnote-433013431 +Ref: Library<22>-Footnote-443013497 +Ref: Library<22>-Footnote-453013563 +Ref: Library<22>-Footnote-463013629 +Ref: Library<22>-Footnote-473013695 +Ref: Library<22>-Footnote-483013761 +Ref: Library<22>-Footnote-493013827 +Ref: Library<22>-Footnote-503013893 +Ref: Library<22>-Footnote-513013959 +Ref: Library<22>-Footnote-523014025 +Ref: Library<22>-Footnote-533014091 +Ref: Library<22>-Footnote-543014157 +Ref: Library<22>-Footnote-553014223 +Ref: Library<22>-Footnote-563014289 +Ref: Library<22>-Footnote-573014355 +Ref: Library<22>-Footnote-583014421 +Ref: Library<22>-Footnote-593014487 +Ref: Library<22>-Footnote-603014553 +Ref: Library<22>-Footnote-613014619 +Ref: Library<22>-Footnote-623014685 +Ref: Library<22>-Footnote-633014751 +Ref: Library<22>-Footnote-643014817 +Ref: Library<22>-Footnote-653014883 +Ref: Library<22>-Footnote-663014949 +Ref: Library<22>-Footnote-673015015 +Ref: Library<22>-Footnote-683015081 +Ref: Library<22>-Footnote-693015147 +Ref: Library<22>-Footnote-703015213 +Ref: Library<22>-Footnote-713015279 +Ref: Library<22>-Footnote-723015345 +Ref: Library<22>-Footnote-733015411 +Ref: Library<22>-Footnote-743015477 +Ref: Library<22>-Footnote-753015543 +Ref: Library<22>-Footnote-763015609 +Ref: Library<22>-Footnote-773015675 +Ref: Library<22>-Footnote-783015741 +Ref: Library<22>-Footnote-793015807 +Ref: Library<22>-Footnote-803015873 +Ref: Library<22>-Footnote-813015939 +Ref: Library<22>-Footnote-823016005 +Ref: Library<22>-Footnote-833016071 +Ref: Library<22>-Footnote-843016137 +Ref: Library<22>-Footnote-853016203 +Ref: Library<22>-Footnote-863016269 +Ref: Library<22>-Footnote-873016335 +Ref: Library<22>-Footnote-883016401 +Ref: Library<22>-Footnote-893016467 +Ref: Library<22>-Footnote-903016533 +Ref: Library<22>-Footnote-913016599 +Ref: Library<22>-Footnote-923016665 +Ref: Library<22>-Footnote-933016731 +Ref: Library<22>-Footnote-943016797 +Ref: Library<22>-Footnote-953016863 +Ref: Library<22>-Footnote-963016929 +Ref: Library<22>-Footnote-973016995 +Ref: Library<22>-Footnote-983017061 +Ref: Library<22>-Footnote-993017127 +Ref: Library<22>-Footnote-1003017193 +Ref: Library<22>-Footnote-1013017260 +Ref: Library<22>-Footnote-1023017327 +Ref: Library<22>-Footnote-1033017394 +Ref: Library<22>-Footnote-1043017461 +Ref: Library<22>-Footnote-1053017528 +Ref: Library<22>-Footnote-1063017595 +Ref: Library<22>-Footnote-1073017662 +Ref: Library<22>-Footnote-1083017729 +Ref: Library<22>-Footnote-1093017796 +Ref: Library<22>-Footnote-1103017863 +Ref: Library<22>-Footnote-1113017930 +Ref: Library<22>-Footnote-1123017997 +Ref: Library<22>-Footnote-1133018064 +Ref: Library<22>-Footnote-1143018131 +Ref: Library<22>-Footnote-1153018198 +Ref: Library<22>-Footnote-1163018265 +Ref: Library<22>-Footnote-1173018332 +Ref: Library<22>-Footnote-1183018399 +Ref: Library<22>-Footnote-1193018465 +Ref: Library<22>-Footnote-1203018532 +Ref: Library<22>-Footnote-1213018599 +Ref: Library<22>-Footnote-1223018666 +Ref: Library<22>-Footnote-1233018733 +Ref: Library<22>-Footnote-1243018777 +Ref: Library<22>-Footnote-1253018844 +Ref: Library<22>-Footnote-1263018911 +Ref: Library<22>-Footnote-1273018978 +Ref: Library<22>-Footnote-1283019045 +Ref: Library<22>-Footnote-1293019112 +Ref: Library<22>-Footnote-1303019179 +Ref: Library<22>-Footnote-1313019246 +Ref: Library<22>-Footnote-1323019313 +Ref: Library<22>-Footnote-1333019380 +Ref: Library<22>-Footnote-1343019447 +Ref: Library<22>-Footnote-1353019514 +Ref: Library<22>-Footnote-1363019581 +Ref: Library<22>-Footnote-1373019648 +Ref: Library<22>-Footnote-1383019715 +Ref: Library<22>-Footnote-1393019782 +Ref: Library<22>-Footnote-1403019849 +Ref: Library<22>-Footnote-1413019916 +Ref: Library<22>-Footnote-1423019983 +Ref: Library<22>-Footnote-1433020050 +Ref: Library<22>-Footnote-1443020117 +Ref: Library<22>-Footnote-1453020184 +Ref: Library<22>-Footnote-1463020251 +Ref: Library<22>-Footnote-1473020318 +Ref: Library<22>-Footnote-1483020385 +Ref: Library<22>-Footnote-1493020452 +Ref: Library<22>-Footnote-1503020519 +Ref: Library<22>-Footnote-1513020586 +Ref: Library<22>-Footnote-1523020653 +Node: Documentation<22>3020720 +Ref: whatsnew/changelog id1813020833 +Ref: 13593020833 +Ref: Documentation<22>-Footnote-13022599 +Ref: Documentation<22>-Footnote-23022664 +Ref: Documentation<22>-Footnote-33022706 +Ref: Documentation<22>-Footnote-43022771 +Ref: Documentation<22>-Footnote-53022836 +Ref: Documentation<22>-Footnote-63022901 +Ref: Documentation<22>-Footnote-73022966 +Ref: Documentation<22>-Footnote-83023031 +Ref: Documentation<22>-Footnote-93023096 +Ref: Documentation<22>-Footnote-103023161 +Ref: Documentation<22>-Footnote-113023227 +Ref: Documentation<22>-Footnote-123023293 +Ref: Documentation<22>-Footnote-133023359 +Ref: Documentation<22>-Footnote-143023425 +Node: Tests<22>3023491 +Ref: whatsnew/changelog id1823023602 +Ref: 135b3023602 +Ref: Tests<22>-Footnote-13025757 +Ref: Tests<22>-Footnote-23025822 +Ref: Tests<22>-Footnote-33025887 +Ref: Tests<22>-Footnote-43025952 +Ref: Tests<22>-Footnote-53026017 +Ref: Tests<22>-Footnote-63026082 +Ref: Tests<22>-Footnote-73026147 +Ref: Tests<22>-Footnote-83026212 +Ref: Tests<22>-Footnote-93026277 +Ref: Tests<22>-Footnote-103026342 +Ref: Tests<22>-Footnote-113026408 +Ref: Tests<22>-Footnote-123026474 +Ref: Tests<22>-Footnote-133026540 +Ref: Tests<22>-Footnote-143026606 +Ref: Tests<22>-Footnote-153026672 +Ref: Tests<22>-Footnote-163026738 +Node: Build<23>3026804 +Ref: whatsnew/changelog id1833026909 +Ref: 135e3026909 +Ref: Build<23>-Footnote-13027829 +Ref: Build<23>-Footnote-23027894 +Ref: Build<23>-Footnote-33027959 +Ref: Build<23>-Footnote-43028024 +Ref: Build<23>-Footnote-53028089 +Ref: Build<23>-Footnote-63028154 +Node: Windows<21>3028219 +Ref: whatsnew/changelog id1843028324 +Ref: 135f3028324 +Ref: Windows<21>-Footnote-13030125 +Ref: Windows<21>-Footnote-23030190 +Ref: Windows<21>-Footnote-33030255 +Ref: Windows<21>-Footnote-43030320 +Ref: Windows<21>-Footnote-53030385 +Ref: Windows<21>-Footnote-63030450 +Ref: Windows<21>-Footnote-73030515 +Ref: Windows<21>-Footnote-83030580 +Ref: Windows<21>-Footnote-93030645 +Ref: Windows<21>-Footnote-103030710 +Ref: Windows<21>-Footnote-113030776 +Ref: Windows<21>-Footnote-123030842 +Ref: Windows<21>-Footnote-133030908 +Ref: Windows<21>-Footnote-143030974 +Node: macOS<15>3031040 +Ref: whatsnew/changelog id1853031144 +Ref: 13633031144 +Ref: macOS<15>-Footnote-13032033 +Ref: macOS<15>-Footnote-23032098 +Ref: macOS<15>-Footnote-33032163 +Ref: macOS<15>-Footnote-43032228 +Ref: macOS<15>-Footnote-53032293 +Ref: macOS<15>-Footnote-63032358 +Node: IDLE<14>3032423 +Ref: whatsnew/changelog id1863032525 +Ref: 13643032525 +Ref: IDLE<14>-Footnote-13033688 +Ref: IDLE<14>-Footnote-23033753 +Ref: IDLE<14>-Footnote-33033818 +Ref: IDLE<14>-Footnote-43033883 +Ref: IDLE<14>-Footnote-53033948 +Ref: IDLE<14>-Footnote-63034013 +Ref: IDLE<14>-Footnote-73034078 +Ref: IDLE<14>-Footnote-83034143 +Ref: IDLE<14>-Footnote-93034208 +Ref: IDLE<14>-Footnote-103034273 +Ref: IDLE<14>-Footnote-113034339 +Node: C API<20>3034405 +Ref: whatsnew/changelog id1873034489 +Ref: 13653034489 +Ref: C API<20>-Footnote-13039616 +Ref: C API<20>-Footnote-23039681 +Ref: C API<20>-Footnote-33039746 +Ref: C API<20>-Footnote-43039811 +Ref: C API<20>-Footnote-53039876 +Ref: C API<20>-Footnote-63039941 +Ref: C API<20>-Footnote-73040006 +Ref: C API<20>-Footnote-83040071 +Ref: C API<20>-Footnote-93040136 +Ref: C API<20>-Footnote-103040201 +Ref: C API<20>-Footnote-113040267 +Ref: C API<20>-Footnote-123040333 +Ref: C API<20>-Footnote-133040399 +Ref: C API<20>-Footnote-143040465 +Ref: C API<20>-Footnote-153040531 +Ref: C API<20>-Footnote-163040597 +Ref: C API<20>-Footnote-173040663 +Ref: C API<20>-Footnote-183040729 +Ref: C API<20>-Footnote-193040795 +Ref: C API<20>-Footnote-203040861 +Ref: C API<20>-Footnote-213040904 +Ref: C API<20>-Footnote-223040970 +Ref: C API<20>-Footnote-233041036 +Ref: C API<20>-Footnote-243041102 +Ref: C API<20>-Footnote-253041168 +Ref: C API<20>-Footnote-263041234 +Ref: C API<20>-Footnote-273041300 +Ref: C API<20>-Footnote-283041366 +Ref: C API<20>-Footnote-293041432 +Node: Python 3 9 0 beta 13041498 +Ref: whatsnew/changelog python-3-9-0-beta-13041622 +Ref: 136a3041622 +Node: Security<13>3041982 +Ref: whatsnew/changelog id1883042080 +Ref: 136b3042080 +Ref: Security<13>-Footnote-13042284 +Node: Core and Builtins<24>3042349 +Ref: whatsnew/changelog id1893042467 +Ref: 136c3042467 +Ref: Core and Builtins<24>-Footnote-13045011 +Ref: Core and Builtins<24>-Footnote-23045076 +Ref: Core and Builtins<24>-Footnote-33045141 +Ref: Core and Builtins<24>-Footnote-43045206 +Ref: Core and Builtins<24>-Footnote-53045271 +Ref: Core and Builtins<24>-Footnote-63045336 +Ref: Core and Builtins<24>-Footnote-73045378 +Ref: Core and Builtins<24>-Footnote-83045443 +Ref: Core and Builtins<24>-Footnote-93045508 +Ref: Core and Builtins<24>-Footnote-103045575 +Ref: Core and Builtins<24>-Footnote-113045618 +Ref: Core and Builtins<24>-Footnote-123045684 +Ref: Core and Builtins<24>-Footnote-133045752 +Ref: Core and Builtins<24>-Footnote-143045795 +Ref: Core and Builtins<24>-Footnote-153045861 +Ref: Core and Builtins<24>-Footnote-163045927 +Ref: Core and Builtins<24>-Footnote-173045993 +Ref: Core and Builtins<24>-Footnote-183046059 +Ref: Core and Builtins<24>-Footnote-193046127 +Ref: Core and Builtins<24>-Footnote-203046170 +Ref: Core and Builtins<24>-Footnote-213046236 +Ref: Core and Builtins<24>-Footnote-223046302 +Ref: Core and Builtins<24>-Footnote-233046368 +Ref: Core and Builtins<24>-Footnote-243046434 +Node: Library<23>3046500 +Ref: whatsnew/changelog id1903046623 +Ref: 136f3046623 +Ref: Library<23>-Footnote-13054024 +Ref: Library<23>-Footnote-23054089 +Ref: Library<23>-Footnote-33054154 +Ref: Library<23>-Footnote-43054219 +Ref: Library<23>-Footnote-53054284 +Ref: Library<23>-Footnote-63054349 +Ref: Library<23>-Footnote-73054414 +Ref: Library<23>-Footnote-83054479 +Ref: Library<23>-Footnote-93054544 +Ref: Library<23>-Footnote-103054609 +Ref: Library<23>-Footnote-113054675 +Ref: Library<23>-Footnote-123054741 +Ref: Library<23>-Footnote-133054807 +Ref: Library<23>-Footnote-143054873 +Ref: Library<23>-Footnote-153054939 +Ref: Library<23>-Footnote-163054982 +Ref: Library<23>-Footnote-173055048 +Ref: Library<23>-Footnote-183055114 +Ref: Library<23>-Footnote-193055180 +Ref: Library<23>-Footnote-203055246 +Ref: Library<23>-Footnote-213055312 +Ref: Library<23>-Footnote-223055378 +Ref: Library<23>-Footnote-233055444 +Ref: Library<23>-Footnote-243055510 +Ref: Library<23>-Footnote-253055576 +Ref: Library<23>-Footnote-263055642 +Ref: Library<23>-Footnote-273055708 +Ref: Library<23>-Footnote-283055774 +Ref: Library<23>-Footnote-293055840 +Ref: Library<23>-Footnote-303055906 +Ref: Library<23>-Footnote-313055972 +Ref: Library<23>-Footnote-323056038 +Ref: Library<23>-Footnote-333056104 +Ref: Library<23>-Footnote-343056170 +Ref: Library<23>-Footnote-353056236 +Ref: Library<23>-Footnote-363056302 +Ref: Library<23>-Footnote-373056368 +Ref: Library<23>-Footnote-383056434 +Ref: Library<23>-Footnote-393056500 +Ref: Library<23>-Footnote-403056566 +Ref: Library<23>-Footnote-413056632 +Ref: Library<23>-Footnote-423056698 +Ref: Library<23>-Footnote-433056764 +Ref: Library<23>-Footnote-443056830 +Ref: Library<23>-Footnote-453056896 +Ref: Library<23>-Footnote-463056962 +Ref: Library<23>-Footnote-473057028 +Ref: Library<23>-Footnote-483057094 +Ref: Library<23>-Footnote-493057160 +Ref: Library<23>-Footnote-503057226 +Node: Documentation<23>3057292 +Ref: whatsnew/changelog id1913057403 +Ref: 13743057403 +Ref: Documentation<23>-Footnote-13058078 +Ref: Documentation<23>-Footnote-23058143 +Ref: Documentation<23>-Footnote-33058208 +Ref: Documentation<23>-Footnote-43058273 +Ref: Documentation<23>-Footnote-53058338 +Node: Tests<23>3058403 +Ref: whatsnew/changelog id1923058512 +Ref: 13753058512 +Ref: Tests<23>-Footnote-13058867 +Ref: Tests<23>-Footnote-23058932 +Node: Build<24>3058997 +Ref: whatsnew/changelog id1933059100 +Ref: 13763059100 +Ref: Build<24>-Footnote-13059440 +Ref: Build<24>-Footnote-23059505 +Node: Windows<22>3059570 +Ref: whatsnew/changelog id1943059673 +Ref: 13773059673 +Ref: Windows<22>-Footnote-13060128 +Ref: Windows<22>-Footnote-23060193 +Ref: Windows<22>-Footnote-33060258 +Node: macOS<16>3060323 +Ref: whatsnew/changelog id1953060431 +Ref: 13783060431 +Ref: macOS<16>-Footnote-13061054 +Ref: macOS<16>-Footnote-23061119 +Node: Tools/Demos<7>3061184 +Ref: whatsnew/changelog id1963061290 +Ref: 13793061290 +Ref: Tools/Demos<7>-Footnote-13061775 +Ref: Tools/Demos<7>-Footnote-23061840 +Ref: Tools/Demos<7>-Footnote-33061905 +Node: C API<21>3061970 +Ref: whatsnew/changelog id1973062058 +Ref: 137a3062058 +Ref: C API<21>-Footnote-13064084 +Ref: C API<21>-Footnote-23064149 +Ref: C API<21>-Footnote-33064214 +Ref: C API<21>-Footnote-43064279 +Ref: C API<21>-Footnote-53064344 +Ref: C API<21>-Footnote-63064409 +Ref: C API<21>-Footnote-73064474 +Ref: C API<21>-Footnote-83064539 +Ref: C API<21>-Footnote-93064604 +Ref: C API<21>-Footnote-103064669 +Ref: C API<21>-Footnote-113064735 +Node: Python 3 9 0 alpha 63064778 +Ref: whatsnew/changelog python-3-9-0-alpha-63064901 +Ref: 137b3064901 +Node: Security<14>3065281 +Ref: whatsnew/changelog id1983065380 +Ref: 137c3065380 +Ref: Security<14>-Footnote-13066025 +Ref: Security<14>-Footnote-23066090 +Ref: Security<14>-Footnote-33066155 +Node: Core and Builtins<25>3066220 +Ref: whatsnew/changelog id1993066339 +Ref: 137d3066339 +Ref: Core and Builtins<25>-Footnote-13070106 +Ref: Core and Builtins<25>-Footnote-23070171 +Ref: Core and Builtins<25>-Footnote-33070236 +Ref: Core and Builtins<25>-Footnote-43070301 +Ref: Core and Builtins<25>-Footnote-53070366 +Ref: Core and Builtins<25>-Footnote-63070431 +Ref: Core and Builtins<25>-Footnote-73070496 +Ref: Core and Builtins<25>-Footnote-83070561 +Ref: Core and Builtins<25>-Footnote-93070626 +Ref: Core and Builtins<25>-Footnote-103070691 +Ref: Core and Builtins<25>-Footnote-113070734 +Ref: Core and Builtins<25>-Footnote-123070800 +Ref: Core and Builtins<25>-Footnote-133070868 +Ref: Core and Builtins<25>-Footnote-143070911 +Ref: Core and Builtins<25>-Footnote-153070979 +Ref: Core and Builtins<25>-Footnote-163071022 +Ref: Core and Builtins<25>-Footnote-173071090 +Ref: Core and Builtins<25>-Footnote-183071133 +Ref: Core and Builtins<25>-Footnote-193071199 +Ref: Core and Builtins<25>-Footnote-203071265 +Ref: Core and Builtins<25>-Footnote-213071333 +Ref: Core and Builtins<25>-Footnote-223071401 +Ref: Core and Builtins<25>-Footnote-233071467 +Ref: Core and Builtins<25>-Footnote-243071535 +Ref: Core and Builtins<25>-Footnote-253071578 +Ref: Core and Builtins<25>-Footnote-263071646 +Ref: Core and Builtins<25>-Footnote-273071689 +Ref: Core and Builtins<25>-Footnote-283071755 +Ref: Core and Builtins<25>-Footnote-293071821 +Ref: Core and Builtins<25>-Footnote-303071864 +Ref: Core and Builtins<25>-Footnote-313071930 +Ref: Core and Builtins<25>-Footnote-323071996 +Ref: Core and Builtins<25>-Footnote-333072062 +Node: Library<24>3072105 +Ref: whatsnew/changelog id2003072229 +Ref: 137f3072229 +Ref: Library<24>-Footnote-13082496 +Ref: Library<24>-Footnote-23082561 +Ref: Library<24>-Footnote-33082626 +Ref: Library<24>-Footnote-43082691 +Ref: Library<24>-Footnote-53082756 +Ref: Library<24>-Footnote-63082821 +Ref: Library<24>-Footnote-73082863 +Ref: Library<24>-Footnote-83082928 +Ref: Library<24>-Footnote-93082993 +Ref: Library<24>-Footnote-103083058 +Ref: Library<24>-Footnote-113083124 +Ref: Library<24>-Footnote-123083190 +Ref: Library<24>-Footnote-133083256 +Ref: Library<24>-Footnote-143083322 +Ref: Library<24>-Footnote-153083388 +Ref: Library<24>-Footnote-163083454 +Ref: Library<24>-Footnote-173083520 +Ref: Library<24>-Footnote-183083586 +Ref: Library<24>-Footnote-193083652 +Ref: Library<24>-Footnote-203083718 +Ref: Library<24>-Footnote-213083784 +Ref: Library<24>-Footnote-223083850 +Ref: Library<24>-Footnote-233083916 +Ref: Library<24>-Footnote-243083982 +Ref: Library<24>-Footnote-253084048 +Ref: Library<24>-Footnote-263084114 +Ref: Library<24>-Footnote-273084180 +Ref: Library<24>-Footnote-283084246 +Ref: Library<24>-Footnote-293084312 +Ref: Library<24>-Footnote-303084378 +Ref: Library<24>-Footnote-313084444 +Ref: Library<24>-Footnote-323084510 +Ref: Library<24>-Footnote-333084576 +Ref: Library<24>-Footnote-343084642 +Ref: Library<24>-Footnote-353084708 +Ref: Library<24>-Footnote-363084774 +Ref: Library<24>-Footnote-373084840 +Ref: Library<24>-Footnote-383084906 +Ref: Library<24>-Footnote-393084972 +Ref: Library<24>-Footnote-403085038 +Ref: Library<24>-Footnote-413085104 +Ref: Library<24>-Footnote-423085170 +Ref: Library<24>-Footnote-433085236 +Ref: Library<24>-Footnote-443085302 +Ref: Library<24>-Footnote-453085368 +Ref: Library<24>-Footnote-463085434 +Ref: Library<24>-Footnote-473085500 +Ref: Library<24>-Footnote-483085566 +Ref: Library<24>-Footnote-493085609 +Ref: Library<24>-Footnote-503085675 +Ref: Library<24>-Footnote-513085718 +Ref: Library<24>-Footnote-523085784 +Ref: Library<24>-Footnote-533085850 +Ref: Library<24>-Footnote-543085916 +Ref: Library<24>-Footnote-553085959 +Ref: Library<24>-Footnote-563086025 +Ref: Library<24>-Footnote-573086091 +Ref: Library<24>-Footnote-583086157 +Ref: Library<24>-Footnote-593086223 +Ref: Library<24>-Footnote-603086289 +Ref: Library<24>-Footnote-613086355 +Node: Documentation<24>3086421 +Ref: whatsnew/changelog id2013086533 +Ref: 13883086533 +Ref: Documentation<24>-Footnote-13087108 +Ref: Documentation<24>-Footnote-23087173 +Ref: Documentation<24>-Footnote-33087238 +Ref: Documentation<24>-Footnote-43087303 +Node: Tests<24>3087368 +Ref: whatsnew/changelog id2023087478 +Ref: 138b3087478 +Ref: Tests<24>-Footnote-13088559 +Ref: Tests<24>-Footnote-23088624 +Ref: Tests<24>-Footnote-33088689 +Ref: Tests<24>-Footnote-43088754 +Ref: Tests<24>-Footnote-53088819 +Ref: Tests<24>-Footnote-63088884 +Ref: Tests<24>-Footnote-73088949 +Ref: Tests<24>-Footnote-83089008 +Ref: Tests<24>-Footnote-93089073 +Node: Build<25>3089137 +Ref: whatsnew/changelog id2033089241 +Ref: 138d3089241 +Ref: Build<25>-Footnote-13089662 +Ref: Build<25>-Footnote-23089727 +Ref: Build<25>-Footnote-33089792 +Node: Windows<23>3089857 +Ref: whatsnew/changelog id2043089961 +Ref: 138e3089961 +Ref: Windows<23>-Footnote-13090174 +Ref: Windows<23>-Footnote-23090239 +Node: macOS<17>3090303 +Ref: whatsnew/changelog id2053090406 +Ref: 138f3090406 +Ref: macOS<17>-Footnote-13090862 +Ref: macOS<17>-Footnote-23090927 +Node: IDLE<15>3090992 +Ref: whatsnew/changelog id2063091098 +Ref: 13903091098 +Ref: IDLE<15>-Footnote-13091442 +Ref: IDLE<15>-Footnote-23091507 +Node: Tools/Demos<8>3091572 +Ref: whatsnew/changelog id2073091678 +Ref: 13913091678 +Ref: Tools/Demos<8>-Footnote-13092145 +Ref: Tools/Demos<8>-Footnote-23092210 +Ref: Tools/Demos<8>-Footnote-33092275 +Node: C API<22>3092340 +Ref: whatsnew/changelog id2083092429 +Ref: 13923092429 +Ref: C API<22>-Footnote-13094404 +Ref: C API<22>-Footnote-23094469 +Ref: C API<22>-Footnote-33094534 +Ref: C API<22>-Footnote-43094599 +Ref: C API<22>-Footnote-53094664 +Ref: C API<22>-Footnote-63094729 +Ref: C API<22>-Footnote-73094794 +Ref: C API<22>-Footnote-83094859 +Ref: C API<22>-Footnote-93094924 +Node: Python 3 9 0 alpha 53094989 +Ref: whatsnew/changelog python-3-9-0-alpha-53095113 +Ref: 13933095113 +Node: Security<15>3095493 +Ref: whatsnew/changelog id2093095592 +Ref: 13943095592 +Ref: Security<15>-Footnote-13095868 +Node: Core and Builtins<26>3095933 +Ref: whatsnew/changelog id2103096052 +Ref: 13953096052 +Ref: Core and Builtins<26>-Footnote-13101912 +Ref: Core and Builtins<26>-Footnote-23101977 +Ref: Core and Builtins<26>-Footnote-33102044 +Ref: Core and Builtins<26>-Footnote-43102086 +Ref: Core and Builtins<26>-Footnote-53102153 +Ref: Core and Builtins<26>-Footnote-63102195 +Ref: Core and Builtins<26>-Footnote-73102260 +Ref: Core and Builtins<26>-Footnote-83102325 +Ref: Core and Builtins<26>-Footnote-93102392 +Ref: Core and Builtins<26>-Footnote-103102459 +Ref: Core and Builtins<26>-Footnote-113102502 +Ref: Core and Builtins<26>-Footnote-123102568 +Ref: Core and Builtins<26>-Footnote-133102611 +Ref: Core and Builtins<26>-Footnote-143102677 +Ref: Core and Builtins<26>-Footnote-153102743 +Ref: Core and Builtins<26>-Footnote-163102786 +Ref: Core and Builtins<26>-Footnote-173102854 +Ref: Core and Builtins<26>-Footnote-183102897 +Ref: Core and Builtins<26>-Footnote-193102963 +Ref: Core and Builtins<26>-Footnote-203103029 +Ref: Core and Builtins<26>-Footnote-213103095 +Ref: Core and Builtins<26>-Footnote-223103161 +Ref: Core and Builtins<26>-Footnote-233103204 +Ref: Core and Builtins<26>-Footnote-243103270 +Ref: Core and Builtins<26>-Footnote-253103336 +Ref: Core and Builtins<26>-Footnote-263103402 +Ref: Core and Builtins<26>-Footnote-273103468 +Ref: Core and Builtins<26>-Footnote-283103534 +Ref: Core and Builtins<26>-Footnote-293103600 +Ref: Core and Builtins<26>-Footnote-303103666 +Ref: Core and Builtins<26>-Footnote-313103732 +Ref: Core and Builtins<26>-Footnote-323103800 +Ref: Core and Builtins<26>-Footnote-333103843 +Ref: Core and Builtins<26>-Footnote-343103909 +Ref: Core and Builtins<26>-Footnote-353103952 +Ref: Core and Builtins<26>-Footnote-363104018 +Ref: Core and Builtins<26>-Footnote-373104086 +Ref: Core and Builtins<26>-Footnote-383104129 +Ref: Core and Builtins<26>-Footnote-393104195 +Ref: Core and Builtins<26>-Footnote-403104261 +Ref: Core and Builtins<26>-Footnote-413104327 +Ref: Core and Builtins<26>-Footnote-423104393 +Node: Library<25>3104459 +Ref: whatsnew/changelog id2113104583 +Ref: 13963104583 +Ref: Library<25>-Footnote-13113750 +Ref: Library<25>-Footnote-23113815 +Ref: Library<25>-Footnote-33113880 +Ref: Library<25>-Footnote-43113945 +Ref: Library<25>-Footnote-53114010 +Ref: Library<25>-Footnote-63114075 +Ref: Library<25>-Footnote-73114140 +Ref: Library<25>-Footnote-83114205 +Ref: Library<25>-Footnote-93114270 +Ref: Library<25>-Footnote-103114335 +Ref: Library<25>-Footnote-113114401 +Ref: Library<25>-Footnote-123114467 +Ref: Library<25>-Footnote-133114510 +Ref: Library<25>-Footnote-143114576 +Ref: Library<25>-Footnote-153114642 +Ref: Library<25>-Footnote-163114708 +Ref: Library<25>-Footnote-173114751 +Ref: Library<25>-Footnote-183114817 +Ref: Library<25>-Footnote-193114883 +Ref: Library<25>-Footnote-203114949 +Ref: Library<25>-Footnote-213115015 +Ref: Library<25>-Footnote-223115081 +Ref: Library<25>-Footnote-233115147 +Ref: Library<25>-Footnote-243115213 +Ref: Library<25>-Footnote-253115279 +Ref: Library<25>-Footnote-263115345 +Ref: Library<25>-Footnote-273115411 +Ref: Library<25>-Footnote-283115477 +Ref: Library<25>-Footnote-293115543 +Ref: Library<25>-Footnote-303115609 +Ref: Library<25>-Footnote-313115675 +Ref: Library<25>-Footnote-323115741 +Ref: Library<25>-Footnote-333115784 +Ref: Library<25>-Footnote-343115850 +Ref: Library<25>-Footnote-353115916 +Ref: Library<25>-Footnote-363115982 +Ref: Library<25>-Footnote-373116048 +Ref: Library<25>-Footnote-383116114 +Ref: Library<25>-Footnote-393116180 +Ref: Library<25>-Footnote-403116223 +Ref: Library<25>-Footnote-413116289 +Ref: Library<25>-Footnote-423116355 +Ref: Library<25>-Footnote-433116421 +Ref: Library<25>-Footnote-443116487 +Ref: Library<25>-Footnote-453116553 +Ref: Library<25>-Footnote-463116619 +Ref: Library<25>-Footnote-473116685 +Ref: Library<25>-Footnote-483116751 +Ref: Library<25>-Footnote-493116817 +Ref: Library<25>-Footnote-503116883 +Ref: Library<25>-Footnote-513116949 +Ref: Library<25>-Footnote-523117015 +Ref: Library<25>-Footnote-533117081 +Ref: Library<25>-Footnote-543117147 +Node: Documentation<25>3117213 +Ref: whatsnew/changelog id2123117325 +Ref: 139d3117325 +Ref: Documentation<25>-Footnote-13117968 +Ref: Documentation<25>-Footnote-23118033 +Ref: Documentation<25>-Footnote-33118075 +Ref: Documentation<25>-Footnote-43118140 +Ref: Documentation<25>-Footnote-53118205 +Ref: Documentation<25>-Footnote-63118270 +Ref: Documentation<25>-Footnote-73118335 +Node: Tests<25>3118400 +Ref: whatsnew/changelog id2133118510 +Ref: 139e3118510 +Ref: Tests<25>-Footnote-13119196 +Ref: Tests<25>-Footnote-23119261 +Ref: Tests<25>-Footnote-33119326 +Ref: Tests<25>-Footnote-43119391 +Node: Build<26>3119456 +Ref: whatsnew/changelog id2143119560 +Ref: 139f3119560 +Ref: Build<26>-Footnote-13120435 +Ref: Build<26>-Footnote-23120500 +Ref: Build<26>-Footnote-33120565 +Node: Windows<24>3120632 +Ref: whatsnew/changelog id2153120736 +Ref: 13a03120736 +Ref: Windows<24>-Footnote-13121624 +Ref: Windows<24>-Footnote-23121689 +Ref: Windows<24>-Footnote-33121754 +Ref: Windows<24>-Footnote-43121819 +Ref: Windows<24>-Footnote-53121884 +Ref: Windows<24>-Footnote-63121949 +Node: macOS<18>3122014 +Ref: whatsnew/changelog id2163122117 +Ref: 13a13122117 +Ref: macOS<18>-Footnote-13122247 +Node: IDLE<16>3122312 +Ref: whatsnew/changelog id2173122418 +Ref: 13a23122418 +Ref: IDLE<16>-Footnote-13122980 +Ref: IDLE<16>-Footnote-23123045 +Ref: IDLE<16>-Footnote-33123110 +Ref: IDLE<16>-Footnote-43123175 +Node: Tools/Demos<9>3123240 +Ref: whatsnew/changelog id2183123346 +Ref: 13a33123346 +Ref: Tools/Demos<9>-Footnote-13123883 +Ref: Tools/Demos<9>-Footnote-23123948 +Node: C API<23>3124013 +Ref: whatsnew/changelog id2193124102 +Ref: 13a43124102 +Ref: C API<23>-Footnote-13127668 +Ref: C API<23>-Footnote-23127733 +Ref: C API<23>-Footnote-33127798 +Ref: C API<23>-Footnote-43127863 +Ref: C API<23>-Footnote-53127928 +Ref: C API<23>-Footnote-63127993 +Ref: C API<23>-Footnote-73128058 +Ref: C API<23>-Footnote-83128123 +Ref: C API<23>-Footnote-93128188 +Ref: C API<23>-Footnote-103128253 +Ref: C API<23>-Footnote-113128319 +Ref: C API<23>-Footnote-123128385 +Ref: C API<23>-Footnote-133128451 +Ref: C API<23>-Footnote-143128517 +Ref: C API<23>-Footnote-153128583 +Ref: C API<23>-Footnote-163128649 +Ref: C API<23>-Footnote-173128715 +Node: Python 3 9 0 alpha 43128781 +Ref: whatsnew/changelog python-3-9-0-alpha-43128905 +Ref: 13a93128905 +Node: Security<16>3129234 +Ref: whatsnew/changelog id2203129333 +Ref: 13aa3129333 +Ref: Security<16>-Footnote-13129778 +Ref: Security<16>-Footnote-23129843 +Ref: Security<16>-Footnote-33129908 +Node: Core and Builtins<27>3129973 +Ref: whatsnew/changelog id2213130092 +Ref: 13ab3130092 +Ref: Core and Builtins<27>-Footnote-13133508 +Ref: Core and Builtins<27>-Footnote-23133573 +Ref: Core and Builtins<27>-Footnote-33133638 +Ref: Core and Builtins<27>-Footnote-43133703 +Ref: Core and Builtins<27>-Footnote-53133768 +Ref: Core and Builtins<27>-Footnote-63133833 +Ref: Core and Builtins<27>-Footnote-73133898 +Ref: Core and Builtins<27>-Footnote-83133963 +Ref: Core and Builtins<27>-Footnote-93134030 +Ref: Core and Builtins<27>-Footnote-103134072 +Ref: Core and Builtins<27>-Footnote-113134140 +Ref: Core and Builtins<27>-Footnote-123134183 +Ref: Core and Builtins<27>-Footnote-133134249 +Ref: Core and Builtins<27>-Footnote-143134315 +Ref: Core and Builtins<27>-Footnote-153134381 +Ref: Core and Builtins<27>-Footnote-163134447 +Ref: Core and Builtins<27>-Footnote-173134513 +Ref: Core and Builtins<27>-Footnote-183134581 +Ref: Core and Builtins<27>-Footnote-193134624 +Ref: Core and Builtins<27>-Footnote-203134692 +Ref: Core and Builtins<27>-Footnote-213134735 +Ref: Core and Builtins<27>-Footnote-223134803 +Ref: Core and Builtins<27>-Footnote-233134846 +Ref: Core and Builtins<27>-Footnote-243134912 +Ref: Core and Builtins<27>-Footnote-253134978 +Ref: Core and Builtins<27>-Footnote-263135044 +Ref: Core and Builtins<27>-Footnote-273135110 +Ref: Core and Builtins<27>-Footnote-283135176 +Ref: Core and Builtins<27>-Footnote-293135242 +Node: Library<26>3135308 +Ref: whatsnew/changelog id2223135432 +Ref: 13af3135432 +Ref: Library<26>-Footnote-13141641 +Ref: Library<26>-Footnote-23141706 +Ref: Library<26>-Footnote-33141771 +Ref: Library<26>-Footnote-43141836 +Ref: Library<26>-Footnote-53141901 +Ref: Library<26>-Footnote-63141966 +Ref: Library<26>-Footnote-73142031 +Ref: Library<26>-Footnote-83142096 +Ref: Library<26>-Footnote-93142161 +Ref: Library<26>-Footnote-103142226 +Ref: Library<26>-Footnote-113142292 +Ref: Library<26>-Footnote-123142358 +Ref: Library<26>-Footnote-133142424 +Ref: Library<26>-Footnote-143142490 +Ref: Library<26>-Footnote-153142556 +Ref: Library<26>-Footnote-163142622 +Ref: Library<26>-Footnote-173142716 +Ref: Library<26>-Footnote-183142782 +Ref: Library<26>-Footnote-193142848 +Ref: Library<26>-Footnote-203142914 +Ref: Library<26>-Footnote-213142980 +Ref: Library<26>-Footnote-223143046 +Ref: Library<26>-Footnote-233143112 +Ref: Library<26>-Footnote-243143178 +Ref: Library<26>-Footnote-253143244 +Ref: Library<26>-Footnote-263143310 +Ref: Library<26>-Footnote-273143376 +Ref: Library<26>-Footnote-283143419 +Ref: Library<26>-Footnote-293143485 +Ref: Library<26>-Footnote-303143551 +Ref: Library<26>-Footnote-313143617 +Ref: Library<26>-Footnote-323143683 +Ref: Library<26>-Footnote-333143749 +Ref: Library<26>-Footnote-343143815 +Ref: Library<26>-Footnote-353143881 +Ref: Library<26>-Footnote-363143947 +Ref: Library<26>-Footnote-373144013 +Ref: Library<26>-Footnote-383144079 +Ref: Library<26>-Footnote-393144145 +Node: Documentation<26>3144211 +Ref: whatsnew/changelog id2233144323 +Ref: 13b43144323 +Ref: Documentation<26>-Footnote-13145364 +Ref: Documentation<26>-Footnote-23145429 +Ref: Documentation<26>-Footnote-33145494 +Ref: Documentation<26>-Footnote-43145559 +Ref: Documentation<26>-Footnote-53145624 +Ref: Documentation<26>-Footnote-63145689 +Ref: Documentation<26>-Footnote-73145754 +Node: Tests<26>3145818 +Ref: whatsnew/changelog id2243145928 +Ref: 13b53145928 +Ref: Tests<26>-Footnote-13146262 +Ref: Tests<26>-Footnote-23146327 +Node: Build<27>3146392 +Ref: whatsnew/changelog id2253146496 +Ref: 13b63146496 +Ref: Build<27>-Footnote-13146626 +Node: Windows<25>3146691 +Ref: whatsnew/changelog id2263146794 +Ref: 13b73146794 +Ref: Windows<25>-Footnote-13147600 +Ref: Windows<25>-Footnote-23147665 +Ref: Windows<25>-Footnote-33147730 +Ref: Windows<25>-Footnote-43147795 +Ref: Windows<25>-Footnote-53147860 +Ref: Windows<25>-Footnote-63147925 +Node: IDLE<17>3147990 +Ref: whatsnew/changelog id2273148093 +Ref: 13b83148093 +Ref: IDLE<17>-Footnote-13148640 +Ref: IDLE<17>-Footnote-23148705 +Ref: IDLE<17>-Footnote-33148770 +Ref: IDLE<17>-Footnote-43148835 +Ref: IDLE<17>-Footnote-53148900 +Node: C API<24>3148965 +Ref: whatsnew/changelog id2283149048 +Ref: 13b93149048 +Ref: C API<24>-Footnote-13151707 +Ref: C API<24>-Footnote-23151772 +Ref: C API<24>-Footnote-33151837 +Ref: C API<24>-Footnote-43151902 +Ref: C API<24>-Footnote-53151967 +Ref: C API<24>-Footnote-63152032 +Ref: C API<24>-Footnote-73152097 +Ref: C API<24>-Footnote-83152162 +Ref: C API<24>-Footnote-93152227 +Ref: C API<24>-Footnote-103152292 +Ref: C API<24>-Footnote-113152358 +Ref: C API<24>-Footnote-123152424 +Node: Python 3 9 0 alpha 33152490 +Ref: whatsnew/changelog python-3-9-0-alpha-33152614 +Ref: 13be3152614 +Node: Core and Builtins<28>3152873 +Ref: whatsnew/changelog id2293152971 +Ref: 13bf3152971 +Ref: Core and Builtins<28>-Footnote-13157076 +Ref: Core and Builtins<28>-Footnote-23157141 +Ref: Core and Builtins<28>-Footnote-33157206 +Ref: Core and Builtins<28>-Footnote-43157271 +Ref: Core and Builtins<28>-Footnote-53157336 +Ref: Core and Builtins<28>-Footnote-63157401 +Ref: Core and Builtins<28>-Footnote-73157466 +Ref: Core and Builtins<28>-Footnote-83157531 +Ref: Core and Builtins<28>-Footnote-93157596 +Ref: Core and Builtins<28>-Footnote-103157661 +Ref: Core and Builtins<28>-Footnote-113157727 +Ref: Core and Builtins<28>-Footnote-123157795 +Ref: Core and Builtins<28>-Footnote-133157838 +Ref: Core and Builtins<28>-Footnote-143157904 +Ref: Core and Builtins<28>-Footnote-153157970 +Ref: Core and Builtins<28>-Footnote-163158036 +Ref: Core and Builtins<28>-Footnote-173158102 +Ref: Core and Builtins<28>-Footnote-183158168 +Ref: Core and Builtins<28>-Footnote-193158234 +Ref: Core and Builtins<28>-Footnote-203158300 +Ref: Core and Builtins<28>-Footnote-213158366 +Ref: Core and Builtins<28>-Footnote-223158432 +Ref: Core and Builtins<28>-Footnote-233158498 +Ref: Core and Builtins<28>-Footnote-243158564 +Node: Library<27>3158630 +Ref: whatsnew/changelog id2303158754 +Ref: 13c33158754 +Ref: Library<27>-Footnote-13168430 +Ref: Library<27>-Footnote-23168495 +Ref: Library<27>-Footnote-33168560 +Ref: Library<27>-Footnote-43168625 +Ref: Library<27>-Footnote-53168690 +Ref: Library<27>-Footnote-63168755 +Ref: Library<27>-Footnote-73168820 +Ref: Library<27>-Footnote-83168885 +Ref: Library<27>-Footnote-93168950 +Ref: Library<27>-Footnote-103169015 +Ref: Library<27>-Footnote-113169081 +Ref: Library<27>-Footnote-123169147 +Ref: Library<27>-Footnote-133169213 +Ref: Library<27>-Footnote-143169279 +Ref: Library<27>-Footnote-153169345 +Ref: Library<27>-Footnote-163169411 +Ref: Library<27>-Footnote-173169477 +Ref: Library<27>-Footnote-183169543 +Ref: Library<27>-Footnote-193169609 +Ref: Library<27>-Footnote-203169675 +Ref: Library<27>-Footnote-213169741 +Ref: Library<27>-Footnote-223169807 +Ref: Library<27>-Footnote-233169873 +Ref: Library<27>-Footnote-243169939 +Ref: Library<27>-Footnote-253170005 +Ref: Library<27>-Footnote-263170071 +Ref: Library<27>-Footnote-273170137 +Ref: Library<27>-Footnote-283170203 +Ref: Library<27>-Footnote-293170269 +Ref: Library<27>-Footnote-303170335 +Ref: Library<27>-Footnote-313170401 +Ref: Library<27>-Footnote-323170467 +Ref: Library<27>-Footnote-333170533 +Ref: Library<27>-Footnote-343170599 +Ref: Library<27>-Footnote-353170665 +Ref: Library<27>-Footnote-363170731 +Ref: Library<27>-Footnote-373170797 +Ref: Library<27>-Footnote-383170863 +Ref: Library<27>-Footnote-393170929 +Ref: Library<27>-Footnote-403170995 +Ref: Library<27>-Footnote-413171061 +Ref: Library<27>-Footnote-423171127 +Ref: Library<27>-Footnote-433171193 +Ref: Library<27>-Footnote-443171259 +Ref: Library<27>-Footnote-453171325 +Ref: Library<27>-Footnote-463171391 +Ref: Library<27>-Footnote-473171457 +Ref: Library<27>-Footnote-483171523 +Ref: Library<27>-Footnote-493171589 +Ref: Library<27>-Footnote-503171655 +Ref: Library<27>-Footnote-513171721 +Ref: Library<27>-Footnote-523171787 +Ref: Library<27>-Footnote-533171853 +Node: Documentation<27>3171919 +Ref: whatsnew/changelog id2313172031 +Ref: 13ca3172031 +Ref: Documentation<27>-Footnote-13172618 +Ref: Documentation<27>-Footnote-23172683 +Ref: Documentation<27>-Footnote-33172748 +Ref: Documentation<27>-Footnote-43172821 +Node: Build<28>3172885 +Ref: whatsnew/changelog id2323172994 +Ref: 13cb3172994 +Ref: Build<28>-Footnote-13173519 +Ref: Build<28>-Footnote-23173584 +Ref: Build<28>-Footnote-33173649 +Node: IDLE<18>3173714 +Ref: whatsnew/changelog id2333173815 +Ref: 13cc3173815 +Ref: IDLE<18>-Footnote-13174236 +Ref: IDLE<18>-Footnote-23174301 +Ref: IDLE<18>-Footnote-33174366 +Node: C API<25>3174431 +Ref: whatsnew/changelog id2343174514 +Ref: 13cd3174514 +Ref: C API<25>-Footnote-13175279 +Ref: C API<25>-Footnote-23175344 +Node: Python 3 9 0 alpha 23175409 +Ref: whatsnew/changelog python-3-9-0-alpha-23175533 +Ref: 13ce3175533 +Node: Security<17>3175882 +Ref: whatsnew/changelog id2353175981 +Ref: 13cf3175981 +Ref: Security<17>-Footnote-13176854 +Ref: Security<17>-Footnote-23176919 +Ref: Security<17>-Footnote-33176984 +Ref: Security<17>-Footnote-43177049 +Node: Core and Builtins<29>3177114 +Ref: whatsnew/changelog id2363177233 +Ref: 13d03177233 +Ref: Core and Builtins<29>-Footnote-13180943 +Ref: Core and Builtins<29>-Footnote-23181008 +Ref: Core and Builtins<29>-Footnote-33181073 +Ref: Core and Builtins<29>-Footnote-43181138 +Ref: Core and Builtins<29>-Footnote-53181203 +Ref: Core and Builtins<29>-Footnote-63181268 +Ref: Core and Builtins<29>-Footnote-73181333 +Ref: Core and Builtins<29>-Footnote-83181398 +Ref: Core and Builtins<29>-Footnote-93181463 +Ref: Core and Builtins<29>-Footnote-103181528 +Ref: Core and Builtins<29>-Footnote-113181594 +Ref: Core and Builtins<29>-Footnote-123181660 +Ref: Core and Builtins<29>-Footnote-133181726 +Ref: Core and Builtins<29>-Footnote-143181792 +Ref: Core and Builtins<29>-Footnote-153181858 +Ref: Core and Builtins<29>-Footnote-163181924 +Ref: Core and Builtins<29>-Footnote-173181990 +Ref: Core and Builtins<29>-Footnote-183182056 +Ref: Core and Builtins<29>-Footnote-193182122 +Ref: Core and Builtins<29>-Footnote-203182188 +Node: Library<28>3182254 +Ref: whatsnew/changelog id2373182378 +Ref: 13d13182378 +Ref: Library<28>-Footnote-13190182 +Ref: Library<28>-Footnote-23190247 +Ref: Library<28>-Footnote-33190312 +Ref: Library<28>-Footnote-43190377 +Ref: Library<28>-Footnote-53190442 +Ref: Library<28>-Footnote-63190507 +Ref: Library<28>-Footnote-73190572 +Ref: Library<28>-Footnote-83190637 +Ref: Library<28>-Footnote-93190702 +Ref: Library<28>-Footnote-103190767 +Ref: Library<28>-Footnote-113190833 +Ref: Library<28>-Footnote-123190899 +Ref: Library<28>-Footnote-133190965 +Ref: Library<28>-Footnote-143191031 +Ref: Library<28>-Footnote-153191097 +Ref: Library<28>-Footnote-163191163 +Ref: Library<28>-Footnote-173191229 +Ref: Library<28>-Footnote-183191295 +Ref: Library<28>-Footnote-193191361 +Ref: Library<28>-Footnote-203191427 +Ref: Library<28>-Footnote-213191493 +Ref: Library<28>-Footnote-223191559 +Ref: Library<28>-Footnote-233191625 +Ref: Library<28>-Footnote-243191691 +Ref: Library<28>-Footnote-253191757 +Ref: Library<28>-Footnote-263191823 +Ref: Library<28>-Footnote-273191889 +Ref: Library<28>-Footnote-283191955 +Ref: Library<28>-Footnote-293192021 +Ref: Library<28>-Footnote-303192087 +Ref: Library<28>-Footnote-313192153 +Ref: Library<28>-Footnote-323192219 +Ref: Library<28>-Footnote-333192285 +Ref: Library<28>-Footnote-343192351 +Ref: Library<28>-Footnote-353192417 +Ref: Library<28>-Footnote-363192483 +Ref: Library<28>-Footnote-373192549 +Ref: Library<28>-Footnote-383192615 +Ref: Library<28>-Footnote-393192681 +Ref: Library<28>-Footnote-403192747 +Node: Documentation<28>3192813 +Ref: whatsnew/changelog id2383192925 +Ref: 13d23192925 +Ref: Documentation<28>-Footnote-13193515 +Ref: Documentation<28>-Footnote-23193580 +Ref: Documentation<28>-Footnote-33193645 +Node: Tests<27>3193710 +Ref: whatsnew/changelog id2393193820 +Ref: 13d33193820 +Ref: Tests<27>-Footnote-13196402 +Ref: Tests<27>-Footnote-23196467 +Ref: Tests<27>-Footnote-33196532 +Ref: Tests<27>-Footnote-43196597 +Ref: Tests<27>-Footnote-53196662 +Ref: Tests<27>-Footnote-63196727 +Ref: Tests<27>-Footnote-73196792 +Ref: Tests<27>-Footnote-83196857 +Ref: Tests<27>-Footnote-93196922 +Ref: Tests<27>-Footnote-103196987 +Ref: Tests<27>-Footnote-113197053 +Ref: Tests<27>-Footnote-123197119 +Ref: Tests<27>-Footnote-133197185 +Node: Build<29>3197251 +Ref: whatsnew/changelog id2403197355 +Ref: 13d83197355 +Ref: Build<29>-Footnote-13197752 +Ref: Build<29>-Footnote-23197817 +Node: Windows<26>3197882 +Ref: whatsnew/changelog id2413197986 +Ref: 13d93197986 +Ref: Windows<26>-Footnote-13198227 +Ref: Windows<26>-Footnote-23198292 +Node: macOS<19>3198357 +Ref: whatsnew/changelog id2423198460 +Ref: 13da3198460 +Ref: macOS<19>-Footnote-13198768 +Node: IDLE<19>3198833 +Ref: whatsnew/changelog id2433198934 +Ref: 13db3198934 +Ref: IDLE<19>-Footnote-13199529 +Ref: IDLE<19>-Footnote-23199594 +Ref: IDLE<19>-Footnote-33199659 +Ref: IDLE<19>-Footnote-43199724 +Node: C API<26>3199789 +Ref: whatsnew/changelog id2443199872 +Ref: 13dc3199872 +Ref: C API<26>-Footnote-13200406 +Ref: C API<26>-Footnote-23200471 +Ref: C API<26>-Footnote-33200536 +Node: Python 3 9 0 alpha 13200601 +Ref: whatsnew/changelog python-3-9-0-alpha-13200724 +Ref: 13dd3200724 +Node: Security<18>3201105 +Ref: whatsnew/changelog id2453201204 +Ref: 13de3201204 +Ref: Security<18>-Footnote-13203531 +Ref: Security<18>-Footnote-23203596 +Ref: Security<18>-Footnote-33203661 +Ref: Security<18>-Footnote-43203726 +Ref: Security<18>-Footnote-53203791 +Ref: Security<18>-Footnote-63203856 +Ref: Security<18>-Footnote-73203921 +Ref: Security<18>-Footnote-83203986 +Ref: Security<18>-Footnote-93204051 +Ref: Security<18>-Footnote-103204116 +Ref: Security<18>-Footnote-113204182 +Ref: Security<18>-Footnote-123204248 +Ref: Security<18>-Footnote-133204314 +Ref: Security<18>-Footnote-143204380 +Node: Core and Builtins<30>3204446 +Ref: whatsnew/changelog id2463204565 +Ref: 13e13204565 +Ref: Core and Builtins<30>-Footnote-13220099 +Ref: Core and Builtins<30>-Footnote-23220164 +Ref: Core and Builtins<30>-Footnote-33220229 +Ref: Core and Builtins<30>-Footnote-43220294 +Ref: Core and Builtins<30>-Footnote-53220359 +Ref: Core and Builtins<30>-Footnote-63220424 +Ref: Core and Builtins<30>-Footnote-73220489 +Ref: Core and Builtins<30>-Footnote-83220554 +Ref: Core and Builtins<30>-Footnote-93220619 +Ref: Core and Builtins<30>-Footnote-103220684 +Ref: Core and Builtins<30>-Footnote-113220750 +Ref: Core and Builtins<30>-Footnote-123220816 +Ref: Core and Builtins<30>-Footnote-133220882 +Ref: Core and Builtins<30>-Footnote-143220948 +Ref: Core and Builtins<30>-Footnote-153221014 +Ref: Core and Builtins<30>-Footnote-163221080 +Ref: Core and Builtins<30>-Footnote-173221146 +Ref: Core and Builtins<30>-Footnote-183221212 +Ref: Core and Builtins<30>-Footnote-193221278 +Ref: Core and Builtins<30>-Footnote-203221344 +Ref: Core and Builtins<30>-Footnote-213221387 +Ref: Core and Builtins<30>-Footnote-223221453 +Ref: Core and Builtins<30>-Footnote-233221519 +Ref: Core and Builtins<30>-Footnote-243221585 +Ref: Core and Builtins<30>-Footnote-253221651 +Ref: Core and Builtins<30>-Footnote-263221717 +Ref: Core and Builtins<30>-Footnote-273221783 +Ref: Core and Builtins<30>-Footnote-283221849 +Ref: Core and Builtins<30>-Footnote-293221915 +Ref: Core and Builtins<30>-Footnote-303221981 +Ref: Core and Builtins<30>-Footnote-313222047 +Ref: Core and Builtins<30>-Footnote-323222113 +Ref: Core and Builtins<30>-Footnote-333222179 +Ref: Core and Builtins<30>-Footnote-343222245 +Ref: Core and Builtins<30>-Footnote-353222311 +Ref: Core and Builtins<30>-Footnote-363222377 +Ref: Core and Builtins<30>-Footnote-373222443 +Ref: Core and Builtins<30>-Footnote-383222509 +Ref: Core and Builtins<30>-Footnote-393222575 +Ref: Core and Builtins<30>-Footnote-403222641 +Ref: Core and Builtins<30>-Footnote-413222706 +Ref: Core and Builtins<30>-Footnote-423222772 +Ref: Core and Builtins<30>-Footnote-433222838 +Ref: Core and Builtins<30>-Footnote-443222904 +Ref: Core and Builtins<30>-Footnote-453222970 +Ref: Core and Builtins<30>-Footnote-463223036 +Ref: Core and Builtins<30>-Footnote-473223102 +Ref: Core and Builtins<30>-Footnote-483223168 +Ref: Core and Builtins<30>-Footnote-493223234 +Ref: Core and Builtins<30>-Footnote-503223300 +Ref: Core and Builtins<30>-Footnote-513223366 +Ref: Core and Builtins<30>-Footnote-523223432 +Ref: Core and Builtins<30>-Footnote-533223498 +Ref: Core and Builtins<30>-Footnote-543223541 +Ref: Core and Builtins<30>-Footnote-553223607 +Ref: Core and Builtins<30>-Footnote-563223673 +Ref: Core and Builtins<30>-Footnote-573223739 +Ref: Core and Builtins<30>-Footnote-583223805 +Ref: Core and Builtins<30>-Footnote-593223871 +Ref: Core and Builtins<30>-Footnote-603223937 +Ref: Core and Builtins<30>-Footnote-613224003 +Ref: Core and Builtins<30>-Footnote-623224069 +Ref: Core and Builtins<30>-Footnote-633224135 +Ref: Core and Builtins<30>-Footnote-643224201 +Ref: Core and Builtins<30>-Footnote-653224267 +Ref: Core and Builtins<30>-Footnote-663224333 +Ref: Core and Builtins<30>-Footnote-673224399 +Ref: Core and Builtins<30>-Footnote-683224465 +Ref: Core and Builtins<30>-Footnote-693224531 +Ref: Core and Builtins<30>-Footnote-703224597 +Ref: Core and Builtins<30>-Footnote-713224663 +Ref: Core and Builtins<30>-Footnote-723224729 +Ref: Core and Builtins<30>-Footnote-733224795 +Ref: Core and Builtins<30>-Footnote-743224861 +Ref: Core and Builtins<30>-Footnote-753224927 +Ref: Core and Builtins<30>-Footnote-763224993 +Ref: Core and Builtins<30>-Footnote-773225059 +Ref: Core and Builtins<30>-Footnote-783225125 +Ref: Core and Builtins<30>-Footnote-793225191 +Ref: Core and Builtins<30>-Footnote-803225257 +Ref: Core and Builtins<30>-Footnote-813225323 +Ref: Core and Builtins<30>-Footnote-823225389 +Ref: Core and Builtins<30>-Footnote-833225455 +Ref: Core and Builtins<30>-Footnote-843225521 +Ref: Core and Builtins<30>-Footnote-853225587 +Ref: Core and Builtins<30>-Footnote-863225653 +Ref: Core and Builtins<30>-Footnote-873225719 +Ref: Core and Builtins<30>-Footnote-883225785 +Ref: Core and Builtins<30>-Footnote-893225851 +Ref: Core and Builtins<30>-Footnote-903225917 +Ref: Core and Builtins<30>-Footnote-913225983 +Ref: Core and Builtins<30>-Footnote-923226049 +Ref: Core and Builtins<30>-Footnote-933226115 +Ref: Core and Builtins<30>-Footnote-943226181 +Node: Library<29>3226247 +Ref: whatsnew/changelog id2473226371 +Ref: 13e63226371 +Ref: Library<29>-Footnote-13265944 +Ref: Library<29>-Footnote-23266009 +Ref: Library<29>-Footnote-33266074 +Ref: Library<29>-Footnote-43266139 +Ref: Library<29>-Footnote-53266204 +Ref: Library<29>-Footnote-63266269 +Ref: Library<29>-Footnote-73266334 +Ref: Library<29>-Footnote-83266399 +Ref: Library<29>-Footnote-93266464 +Ref: Library<29>-Footnote-103266529 +Ref: Library<29>-Footnote-113266595 +Ref: Library<29>-Footnote-123266661 +Ref: Library<29>-Footnote-133266727 +Ref: Library<29>-Footnote-143266793 +Ref: Library<29>-Footnote-153266859 +Ref: Library<29>-Footnote-163266925 +Ref: Library<29>-Footnote-173266991 +Ref: Library<29>-Footnote-183267057 +Ref: Library<29>-Footnote-193267123 +Ref: Library<29>-Footnote-203267189 +Ref: Library<29>-Footnote-213267255 +Ref: Library<29>-Footnote-223267321 +Ref: Library<29>-Footnote-233267387 +Ref: Library<29>-Footnote-243267453 +Ref: Library<29>-Footnote-253267519 +Ref: Library<29>-Footnote-263267585 +Ref: Library<29>-Footnote-273267651 +Ref: Library<29>-Footnote-283267717 +Ref: Library<29>-Footnote-293267783 +Ref: Library<29>-Footnote-303267849 +Ref: Library<29>-Footnote-313267915 +Ref: Library<29>-Footnote-323267981 +Ref: Library<29>-Footnote-333268047 +Ref: Library<29>-Footnote-343268113 +Ref: Library<29>-Footnote-353268179 +Ref: Library<29>-Footnote-363268245 +Ref: Library<29>-Footnote-373268311 +Ref: Library<29>-Footnote-383268377 +Ref: Library<29>-Footnote-393268443 +Ref: Library<29>-Footnote-403268509 +Ref: Library<29>-Footnote-413268575 +Ref: Library<29>-Footnote-423268641 +Ref: Library<29>-Footnote-433268707 +Ref: Library<29>-Footnote-443268773 +Ref: Library<29>-Footnote-453268839 +Ref: Library<29>-Footnote-463268905 +Ref: Library<29>-Footnote-473268971 +Ref: Library<29>-Footnote-483269037 +Ref: Library<29>-Footnote-493269103 +Ref: Library<29>-Footnote-503269169 +Ref: Library<29>-Footnote-513269235 +Ref: Library<29>-Footnote-523269301 +Ref: Library<29>-Footnote-533269367 +Ref: Library<29>-Footnote-543269433 +Ref: Library<29>-Footnote-553269499 +Ref: Library<29>-Footnote-563269565 +Ref: Library<29>-Footnote-573269631 +Ref: Library<29>-Footnote-583269697 +Ref: Library<29>-Footnote-593269763 +Ref: Library<29>-Footnote-603269829 +Ref: Library<29>-Footnote-613269895 +Ref: Library<29>-Footnote-623269961 +Ref: Library<29>-Footnote-633270027 +Ref: Library<29>-Footnote-643270092 +Ref: Library<29>-Footnote-653270158 +Ref: Library<29>-Footnote-663270224 +Ref: Library<29>-Footnote-673270290 +Ref: Library<29>-Footnote-683270356 +Ref: Library<29>-Footnote-693270422 +Ref: Library<29>-Footnote-703270488 +Ref: Library<29>-Footnote-713270554 +Ref: Library<29>-Footnote-723270620 +Ref: Library<29>-Footnote-733270686 +Ref: Library<29>-Footnote-743270752 +Ref: Library<29>-Footnote-753270818 +Ref: Library<29>-Footnote-763270884 +Ref: Library<29>-Footnote-773270992 +Ref: Library<29>-Footnote-783271058 +Ref: Library<29>-Footnote-793271124 +Ref: Library<29>-Footnote-803271190 +Ref: Library<29>-Footnote-813271256 +Ref: Library<29>-Footnote-823271322 +Ref: Library<29>-Footnote-833271388 +Ref: Library<29>-Footnote-843271454 +Ref: Library<29>-Footnote-853271520 +Ref: Library<29>-Footnote-863271586 +Ref: Library<29>-Footnote-873271652 +Ref: Library<29>-Footnote-883271718 +Ref: Library<29>-Footnote-893271784 +Ref: Library<29>-Footnote-903271850 +Ref: Library<29>-Footnote-913271916 +Ref: Library<29>-Footnote-923271982 +Ref: Library<29>-Footnote-933272048 +Ref: Library<29>-Footnote-943272114 +Ref: Library<29>-Footnote-953272180 +Ref: Library<29>-Footnote-963272246 +Ref: Library<29>-Footnote-973272312 +Ref: Library<29>-Footnote-983272378 +Ref: Library<29>-Footnote-993272444 +Ref: Library<29>-Footnote-1003272510 +Ref: Library<29>-Footnote-1013272577 +Ref: Library<29>-Footnote-1023272644 +Ref: Library<29>-Footnote-1033272711 +Ref: Library<29>-Footnote-1043272778 +Ref: Library<29>-Footnote-1053272845 +Ref: Library<29>-Footnote-1063272912 +Ref: Library<29>-Footnote-1073272979 +Ref: Library<29>-Footnote-1083273045 +Ref: Library<29>-Footnote-1093273112 +Ref: Library<29>-Footnote-1103273179 +Ref: Library<29>-Footnote-1113273246 +Ref: Library<29>-Footnote-1123273313 +Ref: Library<29>-Footnote-1133273380 +Ref: Library<29>-Footnote-1143273447 +Ref: Library<29>-Footnote-1153273514 +Ref: Library<29>-Footnote-1163273581 +Ref: Library<29>-Footnote-1173273648 +Ref: Library<29>-Footnote-1183273715 +Ref: Library<29>-Footnote-1193273782 +Ref: Library<29>-Footnote-1203273849 +Ref: Library<29>-Footnote-1213273916 +Ref: Library<29>-Footnote-1223273983 +Ref: Library<29>-Footnote-1233274050 +Ref: Library<29>-Footnote-1243274117 +Ref: Library<29>-Footnote-1253274184 +Ref: Library<29>-Footnote-1263274251 +Ref: Library<29>-Footnote-1273274318 +Ref: Library<29>-Footnote-1283274385 +Ref: Library<29>-Footnote-1293274452 +Ref: Library<29>-Footnote-1303274519 +Ref: Library<29>-Footnote-1313274586 +Ref: Library<29>-Footnote-1323274653 +Ref: Library<29>-Footnote-1333274720 +Ref: Library<29>-Footnote-1343274787 +Ref: Library<29>-Footnote-1353274854 +Ref: Library<29>-Footnote-1363274921 +Ref: Library<29>-Footnote-1373274998 +Ref: Library<29>-Footnote-1383275065 +Ref: Library<29>-Footnote-1393275132 +Ref: Library<29>-Footnote-1403275199 +Ref: Library<29>-Footnote-1413275266 +Ref: Library<29>-Footnote-1423275333 +Ref: Library<29>-Footnote-1433275400 +Ref: Library<29>-Footnote-1443275467 +Ref: Library<29>-Footnote-1453275534 +Ref: Library<29>-Footnote-1463275601 +Ref: Library<29>-Footnote-1473275668 +Ref: Library<29>-Footnote-1483275735 +Ref: Library<29>-Footnote-1493275802 +Ref: Library<29>-Footnote-1503275869 +Ref: Library<29>-Footnote-1513275936 +Ref: Library<29>-Footnote-1523276003 +Ref: Library<29>-Footnote-1533276070 +Ref: Library<29>-Footnote-1543276137 +Ref: Library<29>-Footnote-1553276204 +Ref: Library<29>-Footnote-1563276271 +Ref: Library<29>-Footnote-1573276338 +Ref: Library<29>-Footnote-1583276405 +Ref: Library<29>-Footnote-1593276472 +Ref: Library<29>-Footnote-1603276539 +Ref: Library<29>-Footnote-1613276606 +Ref: Library<29>-Footnote-1623276673 +Ref: Library<29>-Footnote-1633276740 +Ref: Library<29>-Footnote-1643276807 +Ref: Library<29>-Footnote-1653276874 +Ref: Library<29>-Footnote-1663276941 +Ref: Library<29>-Footnote-1673277008 +Ref: Library<29>-Footnote-1683277075 +Ref: Library<29>-Footnote-1693277142 +Ref: Library<29>-Footnote-1703277209 +Ref: Library<29>-Footnote-1713277276 +Ref: Library<29>-Footnote-1723277343 +Ref: Library<29>-Footnote-1733277387 +Ref: Library<29>-Footnote-1743277454 +Ref: Library<29>-Footnote-1753277521 +Ref: Library<29>-Footnote-1763277588 +Ref: Library<29>-Footnote-1773277655 +Ref: Library<29>-Footnote-1783277722 +Ref: Library<29>-Footnote-1793277789 +Ref: Library<29>-Footnote-1803277856 +Ref: Library<29>-Footnote-1813277923 +Ref: Library<29>-Footnote-1823277990 +Ref: Library<29>-Footnote-1833278057 +Ref: Library<29>-Footnote-1843278124 +Ref: Library<29>-Footnote-1853278191 +Ref: Library<29>-Footnote-1863278258 +Ref: Library<29>-Footnote-1873278325 +Ref: Library<29>-Footnote-1883278392 +Ref: Library<29>-Footnote-1893278459 +Ref: Library<29>-Footnote-1903278526 +Ref: Library<29>-Footnote-1913278593 +Ref: Library<29>-Footnote-1923278660 +Ref: Library<29>-Footnote-1933278727 +Ref: Library<29>-Footnote-1943278794 +Ref: Library<29>-Footnote-1953278861 +Ref: Library<29>-Footnote-1963278928 +Ref: Library<29>-Footnote-1973278995 +Ref: Library<29>-Footnote-1983279062 +Ref: Library<29>-Footnote-1993279129 +Ref: Library<29>-Footnote-2003279196 +Ref: Library<29>-Footnote-2013279263 +Ref: Library<29>-Footnote-2023279330 +Ref: Library<29>-Footnote-2033279397 +Ref: Library<29>-Footnote-2043279464 +Ref: Library<29>-Footnote-2053279531 +Ref: Library<29>-Footnote-2063279598 +Ref: Library<29>-Footnote-2073279665 +Ref: Library<29>-Footnote-2083279732 +Ref: Library<29>-Footnote-2093279799 +Ref: Library<29>-Footnote-2103279866 +Ref: Library<29>-Footnote-2113279933 +Ref: Library<29>-Footnote-2123280000 +Ref: Library<29>-Footnote-2133280067 +Ref: Library<29>-Footnote-2143280134 +Ref: Library<29>-Footnote-2153280201 +Ref: Library<29>-Footnote-2163280268 +Ref: Library<29>-Footnote-2173280335 +Ref: Library<29>-Footnote-2183280402 +Ref: Library<29>-Footnote-2193280469 +Ref: Library<29>-Footnote-2203280536 +Ref: Library<29>-Footnote-2213280603 +Ref: Library<29>-Footnote-2223280670 +Ref: Library<29>-Footnote-2233280737 +Ref: Library<29>-Footnote-2243280804 +Ref: Library<29>-Footnote-2253280871 +Ref: Library<29>-Footnote-2263280938 +Ref: Library<29>-Footnote-2273281005 +Ref: Library<29>-Footnote-2283281072 +Ref: Library<29>-Footnote-2293281139 +Ref: Library<29>-Footnote-2303281206 +Ref: Library<29>-Footnote-2313281273 +Ref: Library<29>-Footnote-2323281340 +Ref: Library<29>-Footnote-2333281407 +Ref: Library<29>-Footnote-2343281474 +Ref: Library<29>-Footnote-2353281541 +Ref: Library<29>-Footnote-2363281608 +Ref: Library<29>-Footnote-2373281675 +Ref: Library<29>-Footnote-2383281742 +Ref: Library<29>-Footnote-2393281809 +Ref: Library<29>-Footnote-2403281875 +Ref: Library<29>-Footnote-2413281942 +Ref: Library<29>-Footnote-2423282009 +Ref: Library<29>-Footnote-2433282076 +Ref: Library<29>-Footnote-2443282143 +Ref: Library<29>-Footnote-2453282210 +Ref: Library<29>-Footnote-2463282277 +Ref: Library<29>-Footnote-2473282344 +Ref: Library<29>-Footnote-2483282411 +Ref: Library<29>-Footnote-2493282478 +Ref: Library<29>-Footnote-2503282545 +Ref: Library<29>-Footnote-2513282612 +Ref: Library<29>-Footnote-2523282679 +Ref: Library<29>-Footnote-2533282746 +Node: Documentation<29>3282812 +Ref: whatsnew/changelog id2483282924 +Ref: 13fb3282924 +Ref: Documentation<29>-Footnote-13287405 +Ref: Documentation<29>-Footnote-23287470 +Ref: Documentation<29>-Footnote-33287535 +Ref: Documentation<29>-Footnote-43287600 +Ref: Documentation<29>-Footnote-53287665 +Ref: Documentation<29>-Footnote-63287730 +Ref: Documentation<29>-Footnote-73287795 +Ref: Documentation<29>-Footnote-83287860 +Ref: Documentation<29>-Footnote-93287925 +Ref: Documentation<29>-Footnote-103287990 +Ref: Documentation<29>-Footnote-113288056 +Ref: Documentation<29>-Footnote-123288122 +Ref: Documentation<29>-Footnote-133288188 +Ref: Documentation<29>-Footnote-143288254 +Ref: Documentation<29>-Footnote-153288320 +Ref: Documentation<29>-Footnote-163288386 +Ref: Documentation<29>-Footnote-173288452 +Ref: Documentation<29>-Footnote-183288518 +Ref: Documentation<29>-Footnote-193288584 +Ref: Documentation<29>-Footnote-203288650 +Ref: Documentation<29>-Footnote-213288716 +Ref: Documentation<29>-Footnote-223288782 +Ref: Documentation<29>-Footnote-233288848 +Ref: Documentation<29>-Footnote-243288914 +Ref: Documentation<29>-Footnote-253288980 +Ref: Documentation<29>-Footnote-263289046 +Ref: Documentation<29>-Footnote-273289112 +Ref: Documentation<29>-Footnote-283289178 +Ref: Documentation<29>-Footnote-293289244 +Ref: Documentation<29>-Footnote-303289310 +Ref: Documentation<29>-Footnote-313289376 +Ref: Documentation<29>-Footnote-323289442 +Ref: Documentation<29>-Footnote-333289508 +Ref: Documentation<29>-Footnote-343289574 +Ref: Documentation<29>-Footnote-353289640 +Node: Tests<28>3289706 +Ref: whatsnew/changelog id2493289816 +Ref: 13fd3289816 +Ref: Tests<28>-Footnote-13297949 +Ref: Tests<28>-Footnote-23298014 +Ref: Tests<28>-Footnote-33298079 +Ref: Tests<28>-Footnote-43298144 +Ref: Tests<28>-Footnote-53298209 +Ref: Tests<28>-Footnote-63298274 +Ref: Tests<28>-Footnote-73298339 +Ref: Tests<28>-Footnote-83298404 +Ref: Tests<28>-Footnote-93298469 +Ref: Tests<28>-Footnote-103298534 +Ref: Tests<28>-Footnote-113298600 +Ref: Tests<28>-Footnote-123298666 +Ref: Tests<28>-Footnote-133298732 +Ref: Tests<28>-Footnote-143298798 +Ref: Tests<28>-Footnote-153298864 +Ref: Tests<28>-Footnote-163298930 +Ref: Tests<28>-Footnote-173298996 +Ref: Tests<28>-Footnote-183299062 +Ref: Tests<28>-Footnote-193299128 +Ref: Tests<28>-Footnote-203299194 +Ref: Tests<28>-Footnote-213299260 +Ref: Tests<28>-Footnote-223299326 +Ref: Tests<28>-Footnote-233299392 +Ref: Tests<28>-Footnote-243299458 +Ref: Tests<28>-Footnote-253299524 +Ref: Tests<28>-Footnote-263299590 +Ref: Tests<28>-Footnote-273299656 +Ref: Tests<28>-Footnote-283299722 +Ref: Tests<28>-Footnote-293299788 +Ref: Tests<28>-Footnote-303299854 +Ref: Tests<28>-Footnote-313299920 +Ref: Tests<28>-Footnote-323299986 +Ref: Tests<28>-Footnote-333300052 +Ref: Tests<28>-Footnote-343300118 +Ref: Tests<28>-Footnote-353300184 +Ref: Tests<28>-Footnote-363300250 +Ref: Tests<28>-Footnote-373300316 +Ref: Tests<28>-Footnote-383300382 +Ref: Tests<28>-Footnote-393300448 +Ref: Tests<28>-Footnote-403300514 +Ref: Tests<28>-Footnote-413300580 +Ref: Tests<28>-Footnote-423300646 +Ref: Tests<28>-Footnote-433300712 +Ref: Tests<28>-Footnote-443300778 +Ref: Tests<28>-Footnote-453300844 +Ref: Tests<28>-Footnote-463300910 +Ref: Tests<28>-Footnote-473300976 +Ref: Tests<28>-Footnote-483301042 +Node: Build<30>3301108 +Ref: whatsnew/changelog id2503301212 +Ref: 14033301212 +Ref: Build<30>-Footnote-13305057 +Ref: Build<30>-Footnote-23305122 +Ref: Build<30>-Footnote-33305187 +Ref: Build<30>-Footnote-43305252 +Ref: Build<30>-Footnote-53305317 +Ref: Build<30>-Footnote-63305382 +Ref: Build<30>-Footnote-73305447 +Ref: Build<30>-Footnote-83305512 +Ref: Build<30>-Footnote-93305577 +Ref: Build<30>-Footnote-103305642 +Ref: Build<30>-Footnote-113305708 +Ref: Build<30>-Footnote-123305774 +Ref: Build<30>-Footnote-133305840 +Ref: Build<30>-Footnote-143305906 +Ref: Build<30>-Footnote-153305972 +Ref: Build<30>-Footnote-163306038 +Node: Windows<27>3306104 +Ref: whatsnew/changelog id2513306208 +Ref: 14053306208 +Ref: Windows<27>-Footnote-13311125 +Ref: Windows<27>-Footnote-23311190 +Ref: Windows<27>-Footnote-33311255 +Ref: Windows<27>-Footnote-43311320 +Ref: Windows<27>-Footnote-53311385 +Ref: Windows<27>-Footnote-63311450 +Ref: Windows<27>-Footnote-73311515 +Ref: Windows<27>-Footnote-83311580 +Ref: Windows<27>-Footnote-93311645 +Ref: Windows<27>-Footnote-103311710 +Ref: Windows<27>-Footnote-113311776 +Ref: Windows<27>-Footnote-123311842 +Ref: Windows<27>-Footnote-133311908 +Ref: Windows<27>-Footnote-143311974 +Ref: Windows<27>-Footnote-153312040 +Ref: Windows<27>-Footnote-163312106 +Ref: Windows<27>-Footnote-173312172 +Ref: Windows<27>-Footnote-183312238 +Ref: Windows<27>-Footnote-193312304 +Ref: Windows<27>-Footnote-203312370 +Ref: Windows<27>-Footnote-213312436 +Ref: Windows<27>-Footnote-223312502 +Ref: Windows<27>-Footnote-233312568 +Ref: Windows<27>-Footnote-243312633 +Ref: Windows<27>-Footnote-253312698 +Ref: Windows<27>-Footnote-263312764 +Ref: Windows<27>-Footnote-273312830 +Ref: Windows<27>-Footnote-283312896 +Ref: Windows<27>-Footnote-293312962 +Ref: Windows<27>-Footnote-303313028 +Ref: Windows<27>-Footnote-313313094 +Ref: Windows<27>-Footnote-323313160 +Ref: Windows<27>-Footnote-333313226 +Ref: Windows<27>-Footnote-343313292 +Ref: Windows<27>-Footnote-353313358 +Ref: Windows<27>-Footnote-363313424 +Ref: Windows<27>-Footnote-373313490 +Ref: Windows<27>-Footnote-383313556 +Ref: Windows<27>-Footnote-393313622 +Ref: Windows<27>-Footnote-403313688 +Ref: Windows<27>-Footnote-413313754 +Ref: Windows<27>-Footnote-423313820 +Node: macOS<20>3313886 +Ref: whatsnew/changelog id2523313989 +Ref: 14083313989 +Ref: macOS<20>-Footnote-13314822 +Ref: macOS<20>-Footnote-23314887 +Ref: macOS<20>-Footnote-33314952 +Ref: macOS<20>-Footnote-43315017 +Ref: macOS<20>-Footnote-53315082 +Ref: macOS<20>-Footnote-63315147 +Node: IDLE<20>3315212 +Ref: whatsnew/changelog id2533315319 +Ref: 14093315319 +Ref: IDLE<20>-Footnote-13320058 +Ref: IDLE<20>-Footnote-23320123 +Ref: IDLE<20>-Footnote-33320187 +Ref: IDLE<20>-Footnote-43320252 +Ref: IDLE<20>-Footnote-53320317 +Ref: IDLE<20>-Footnote-63320382 +Ref: IDLE<20>-Footnote-73320447 +Ref: IDLE<20>-Footnote-83320512 +Ref: IDLE<20>-Footnote-93320577 +Ref: IDLE<20>-Footnote-103320642 +Ref: IDLE<20>-Footnote-113320708 +Ref: IDLE<20>-Footnote-123320774 +Ref: IDLE<20>-Footnote-133320840 +Ref: IDLE<20>-Footnote-143320906 +Ref: IDLE<20>-Footnote-153320972 +Ref: IDLE<20>-Footnote-163321038 +Ref: IDLE<20>-Footnote-173321104 +Ref: IDLE<20>-Footnote-183321170 +Ref: IDLE<20>-Footnote-193321236 +Ref: IDLE<20>-Footnote-203321302 +Ref: IDLE<20>-Footnote-213321368 +Ref: IDLE<20>-Footnote-223321434 +Ref: IDLE<20>-Footnote-233321500 +Ref: IDLE<20>-Footnote-243321566 +Ref: IDLE<20>-Footnote-253321632 +Ref: IDLE<20>-Footnote-263321698 +Ref: IDLE<20>-Footnote-273321764 +Ref: IDLE<20>-Footnote-283321830 +Ref: IDLE<20>-Footnote-293321896 +Ref: IDLE<20>-Footnote-303321961 +Node: Tools/Demos<10>3322027 +Ref: whatsnew/changelog id2543322134 +Ref: 140a3322134 +Ref: Tools/Demos<10>-Footnote-13323135 +Ref: Tools/Demos<10>-Footnote-23323200 +Ref: Tools/Demos<10>-Footnote-33323265 +Ref: Tools/Demos<10>-Footnote-43323330 +Ref: Tools/Demos<10>-Footnote-53323395 +Ref: Tools/Demos<10>-Footnote-63323460 +Ref: Tools/Demos<10>-Footnote-73323525 +Ref: Tools/Demos<10>-Footnote-83323590 +Node: C API<27>3323655 +Ref: whatsnew/changelog id2553323745 +Ref: 140c3323745 +Ref: C API<27>-Footnote-13329171 +Ref: C API<27>-Footnote-23329236 +Ref: C API<27>-Footnote-33329301 +Ref: C API<27>-Footnote-43329366 +Ref: C API<27>-Footnote-53329431 +Ref: C API<27>-Footnote-63329496 +Ref: C API<27>-Footnote-73329561 +Ref: C API<27>-Footnote-83329626 +Ref: C API<27>-Footnote-93329691 +Ref: C API<27>-Footnote-103329756 +Ref: C API<27>-Footnote-113329822 +Ref: C API<27>-Footnote-123329888 +Ref: C API<27>-Footnote-133329954 +Ref: C API<27>-Footnote-143330020 +Ref: C API<27>-Footnote-153330063 +Ref: C API<27>-Footnote-163330129 +Ref: C API<27>-Footnote-173330195 +Ref: C API<27>-Footnote-183330261 +Ref: C API<27>-Footnote-193330327 +Ref: C API<27>-Footnote-203330393 +Ref: C API<27>-Footnote-213330459 +Ref: C API<27>-Footnote-223330525 +Ref: C API<27>-Footnote-233330591 +Ref: C API<27>-Footnote-243330657 +Ref: C API<27>-Footnote-253330723 +Ref: C API<27>-Footnote-263330789 +Ref: C API<27>-Footnote-273330855 +Ref: C API<27>-Footnote-283330921 +Ref: C API<27>-Footnote-293330987 +Ref: C API<27>-Footnote-303331053 +Ref: C API<27>-Footnote-313331119 +Ref: C API<27>-Footnote-323331185 +Ref: C API<27>-Footnote-333331251 +Ref: C API<27>-Footnote-343331317 +Node: Python 3 8 0 beta 13331383 +Ref: whatsnew/changelog python-3-8-0-beta-13331506 +Ref: 140f3331506 +Node: Security<19>3331885 +Ref: whatsnew/changelog id2563331983 +Ref: 14103331983 +Ref: Security<19>-Footnote-13332574 +Ref: Security<19>-Footnote-23332639 +Ref: Security<19>-Footnote-33332704 +Node: Core and Builtins<31>3332769 +Ref: whatsnew/changelog id2573332887 +Ref: 14113332887 +Ref: Core and Builtins<31>-Footnote-13340965 +Ref: Core and Builtins<31>-Footnote-23341030 +Ref: Core and Builtins<31>-Footnote-33341095 +Ref: Core and Builtins<31>-Footnote-43341160 +Ref: Core and Builtins<31>-Footnote-53341225 +Ref: Core and Builtins<31>-Footnote-63341290 +Ref: Core and Builtins<31>-Footnote-73341355 +Ref: Core and Builtins<31>-Footnote-83341420 +Ref: Core and Builtins<31>-Footnote-93341485 +Ref: Core and Builtins<31>-Footnote-103341550 +Ref: Core and Builtins<31>-Footnote-113341616 +Ref: Core and Builtins<31>-Footnote-123341682 +Ref: Core and Builtins<31>-Footnote-133341748 +Ref: Core and Builtins<31>-Footnote-143341814 +Ref: Core and Builtins<31>-Footnote-153341880 +Ref: Core and Builtins<31>-Footnote-163341946 +Ref: Core and Builtins<31>-Footnote-173342012 +Ref: Core and Builtins<31>-Footnote-183342078 +Ref: Core and Builtins<31>-Footnote-193342143 +Ref: Core and Builtins<31>-Footnote-203342209 +Ref: Core and Builtins<31>-Footnote-213342275 +Ref: Core and Builtins<31>-Footnote-223342341 +Ref: Core and Builtins<31>-Footnote-233342406 +Ref: Core and Builtins<31>-Footnote-243342472 +Ref: Core and Builtins<31>-Footnote-253342538 +Ref: Core and Builtins<31>-Footnote-263342604 +Ref: Core and Builtins<31>-Footnote-273342670 +Ref: Core and Builtins<31>-Footnote-283342736 +Ref: Core and Builtins<31>-Footnote-293342802 +Ref: Core and Builtins<31>-Footnote-303342868 +Ref: Core and Builtins<31>-Footnote-313342934 +Ref: Core and Builtins<31>-Footnote-323343000 +Ref: Core and Builtins<31>-Footnote-333343066 +Ref: Core and Builtins<31>-Footnote-343343132 +Ref: Core and Builtins<31>-Footnote-353343198 +Ref: Core and Builtins<31>-Footnote-363343264 +Ref: Core and Builtins<31>-Footnote-373343330 +Ref: Core and Builtins<31>-Footnote-383343396 +Ref: Core and Builtins<31>-Footnote-393343462 +Ref: Core and Builtins<31>-Footnote-403343528 +Ref: Core and Builtins<31>-Footnote-413343594 +Ref: Core and Builtins<31>-Footnote-423343660 +Ref: Core and Builtins<31>-Footnote-433343726 +Ref: Core and Builtins<31>-Footnote-443343792 +Node: Library<30>3343858 +Ref: whatsnew/changelog id2583343981 +Ref: 14173343981 +Ref: Library<30>-Footnote-13362293 +Ref: Library<30>-Footnote-23362358 +Ref: Library<30>-Footnote-33362423 +Ref: Library<30>-Footnote-43362488 +Ref: Library<30>-Footnote-53362553 +Ref: Library<30>-Footnote-63362618 +Ref: Library<30>-Footnote-73362683 +Ref: Library<30>-Footnote-83362748 +Ref: Library<30>-Footnote-93362813 +Ref: Library<30>-Footnote-103362878 +Ref: Library<30>-Footnote-113362944 +Ref: Library<30>-Footnote-123363010 +Ref: Library<30>-Footnote-133363076 +Ref: Library<30>-Footnote-143363142 +Ref: Library<30>-Footnote-153363208 +Ref: Library<30>-Footnote-163363274 +Ref: Library<30>-Footnote-173363340 +Ref: Library<30>-Footnote-183363406 +Ref: Library<30>-Footnote-193363472 +Ref: Library<30>-Footnote-203363538 +Ref: Library<30>-Footnote-213363604 +Ref: Library<30>-Footnote-223363670 +Ref: Library<30>-Footnote-233363736 +Ref: Library<30>-Footnote-243363802 +Ref: Library<30>-Footnote-253363870 +Ref: Library<30>-Footnote-263363936 +Ref: Library<30>-Footnote-273364002 +Ref: Library<30>-Footnote-283364068 +Ref: Library<30>-Footnote-293364134 +Ref: Library<30>-Footnote-303364200 +Ref: Library<30>-Footnote-313364266 +Ref: Library<30>-Footnote-323364332 +Ref: Library<30>-Footnote-333364398 +Ref: Library<30>-Footnote-343364464 +Ref: Library<30>-Footnote-353364530 +Ref: Library<30>-Footnote-363364596 +Ref: Library<30>-Footnote-373364662 +Ref: Library<30>-Footnote-383364728 +Ref: Library<30>-Footnote-393364794 +Ref: Library<30>-Footnote-403364860 +Ref: Library<30>-Footnote-413364926 +Ref: Library<30>-Footnote-423364992 +Ref: Library<30>-Footnote-433365058 +Ref: Library<30>-Footnote-443365124 +Ref: Library<30>-Footnote-453365190 +Ref: Library<30>-Footnote-463365256 +Ref: Library<30>-Footnote-473365322 +Ref: Library<30>-Footnote-483365388 +Ref: Library<30>-Footnote-493365454 +Ref: Library<30>-Footnote-503365520 +Ref: Library<30>-Footnote-513365586 +Ref: Library<30>-Footnote-523365652 +Ref: Library<30>-Footnote-533365718 +Ref: Library<30>-Footnote-543365784 +Ref: Library<30>-Footnote-553365850 +Ref: Library<30>-Footnote-563365916 +Ref: Library<30>-Footnote-573365982 +Ref: Library<30>-Footnote-583366048 +Ref: Library<30>-Footnote-593366114 +Ref: Library<30>-Footnote-603366180 +Ref: Library<30>-Footnote-613366246 +Ref: Library<30>-Footnote-623366312 +Ref: Library<30>-Footnote-633366378 +Ref: Library<30>-Footnote-643366444 +Ref: Library<30>-Footnote-653366510 +Ref: Library<30>-Footnote-663366576 +Ref: Library<30>-Footnote-673366642 +Ref: Library<30>-Footnote-683366708 +Ref: Library<30>-Footnote-693366773 +Ref: Library<30>-Footnote-703366839 +Ref: Library<30>-Footnote-713366904 +Ref: Library<30>-Footnote-723366970 +Ref: Library<30>-Footnote-733367036 +Ref: Library<30>-Footnote-743367102 +Ref: Library<30>-Footnote-753367168 +Ref: Library<30>-Footnote-763367234 +Ref: Library<30>-Footnote-773367300 +Ref: Library<30>-Footnote-783367366 +Ref: Library<30>-Footnote-793367432 +Ref: Library<30>-Footnote-803367498 +Ref: Library<30>-Footnote-813367564 +Ref: Library<30>-Footnote-823367630 +Ref: Library<30>-Footnote-833367696 +Ref: Library<30>-Footnote-843367762 +Ref: Library<30>-Footnote-853367828 +Ref: Library<30>-Footnote-863367894 +Ref: Library<30>-Footnote-873367960 +Ref: Library<30>-Footnote-883368026 +Ref: Library<30>-Footnote-893368092 +Ref: Library<30>-Footnote-903368158 +Ref: Library<30>-Footnote-913368224 +Ref: Library<30>-Footnote-923368290 +Ref: Library<30>-Footnote-933368356 +Ref: Library<30>-Footnote-943368422 +Ref: Library<30>-Footnote-953368488 +Ref: Library<30>-Footnote-963368554 +Ref: Library<30>-Footnote-973368620 +Ref: Library<30>-Footnote-983368686 +Ref: Library<30>-Footnote-993368752 +Ref: Library<30>-Footnote-1003368818 +Ref: Library<30>-Footnote-1013368885 +Ref: Library<30>-Footnote-1023368952 +Ref: Library<30>-Footnote-1033369019 +Ref: Library<30>-Footnote-1043369086 +Ref: Library<30>-Footnote-1053369153 +Ref: Library<30>-Footnote-1063369220 +Ref: Library<30>-Footnote-1073369287 +Node: Documentation<30>3369354 +Ref: whatsnew/changelog id2593369465 +Ref: 14243369465 +Ref: Documentation<30>-Footnote-13371554 +Ref: Documentation<30>-Footnote-23371619 +Ref: Documentation<30>-Footnote-33371684 +Ref: Documentation<30>-Footnote-43371749 +Ref: Documentation<30>-Footnote-53371814 +Ref: Documentation<30>-Footnote-63371879 +Ref: Documentation<30>-Footnote-73371944 +Ref: Documentation<30>-Footnote-83372009 +Ref: Documentation<30>-Footnote-93372074 +Ref: Documentation<30>-Footnote-103372139 +Ref: Documentation<30>-Footnote-113372205 +Ref: Documentation<30>-Footnote-123372271 +Ref: Documentation<30>-Footnote-133372337 +Ref: Documentation<30>-Footnote-143372403 +Node: Tests<29>3372469 +Ref: whatsnew/changelog id2603372578 +Ref: 14253372578 +Ref: Tests<29>-Footnote-13374216 +Ref: Tests<29>-Footnote-23374281 +Ref: Tests<29>-Footnote-33374346 +Ref: Tests<29>-Footnote-43374411 +Ref: Tests<29>-Footnote-53374476 +Ref: Tests<29>-Footnote-63374541 +Ref: Tests<29>-Footnote-73374606 +Ref: Tests<29>-Footnote-83374671 +Ref: Tests<29>-Footnote-93374736 +Ref: Tests<29>-Footnote-103374801 +Node: Build<31>3374867 +Ref: whatsnew/changelog id2613374970 +Ref: 14273374970 +Ref: Build<31>-Footnote-13376186 +Ref: Build<31>-Footnote-23376251 +Node: Windows<28>3376316 +Ref: whatsnew/changelog id2623376419 +Ref: 14283376419 +Ref: Windows<28>-Footnote-13376851 +Ref: Windows<28>-Footnote-23376916 +Ref: Windows<28>-Footnote-33376981 +Ref: Windows<28>-Footnote-43377046 +Node: macOS<21>3377111 +Ref: whatsnew/changelog id2633377213 +Ref: 14293377213 +Ref: macOS<21>-Footnote-13377515 +Node: IDLE<21>3377580 +Ref: whatsnew/changelog id2643377686 +Ref: 142a3377686 +Ref: IDLE<21>-Footnote-13378288 +Ref: IDLE<21>-Footnote-23378353 +Ref: IDLE<21>-Footnote-33378418 +Ref: IDLE<21>-Footnote-43378483 +Ref: IDLE<21>-Footnote-53378548 +Ref: IDLE<21>-Footnote-63378613 +Node: Tools/Demos<11>3378678 +Ref: whatsnew/changelog id2653378784 +Ref: 142b3378784 +Ref: Tools/Demos<11>-Footnote-13378987 +Node: C API<28>3379052 +Ref: whatsnew/changelog id2663379141 +Ref: 142c3379141 +Ref: C API<28>-Footnote-13380481 +Ref: C API<28>-Footnote-23380546 +Ref: C API<28>-Footnote-33380588 +Ref: C API<28>-Footnote-43380653 +Ref: C API<28>-Footnote-53380718 +Ref: C API<28>-Footnote-63380783 +Ref: C API<28>-Footnote-73380825 +Ref: C API<28>-Footnote-83380890 +Ref: C API<28>-Footnote-93380955 +Node: Python 3 8 0 alpha 43381020 +Ref: whatsnew/changelog python-3-8-0-alpha-43381143 +Ref: 142e3381143 +Node: Security<20>3381524 +Ref: whatsnew/changelog id2673381623 +Ref: 142f3381623 +Ref: Security<20>-Footnote-13382507 +Ref: Security<20>-Footnote-23382572 +Ref: Security<20>-Footnote-33382637 +Node: Core and Builtins<32>3382702 +Ref: whatsnew/changelog id2683382821 +Ref: 14303382821 +Ref: Core and Builtins<32>-Footnote-13386114 +Ref: Core and Builtins<32>-Footnote-23386179 +Ref: Core and Builtins<32>-Footnote-33386244 +Ref: Core and Builtins<32>-Footnote-43386309 +Ref: Core and Builtins<32>-Footnote-53386374 +Ref: Core and Builtins<32>-Footnote-63386439 +Ref: Core and Builtins<32>-Footnote-73386504 +Ref: Core and Builtins<32>-Footnote-83386569 +Ref: Core and Builtins<32>-Footnote-93386634 +Ref: Core and Builtins<32>-Footnote-103386676 +Ref: Core and Builtins<32>-Footnote-113386742 +Ref: Core and Builtins<32>-Footnote-123386808 +Ref: Core and Builtins<32>-Footnote-133386874 +Ref: Core and Builtins<32>-Footnote-143386940 +Ref: Core and Builtins<32>-Footnote-153387006 +Ref: Core and Builtins<32>-Footnote-163387072 +Ref: Core and Builtins<32>-Footnote-173387138 +Ref: Core and Builtins<32>-Footnote-183387204 +Ref: Core and Builtins<32>-Footnote-193387270 +Ref: Core and Builtins<32>-Footnote-203387336 +Node: Library<31>3387402 +Ref: whatsnew/changelog id2693387526 +Ref: 14313387526 +Ref: Library<31>-Footnote-13396862 +Ref: Library<31>-Footnote-23396927 +Ref: Library<31>-Footnote-33396992 +Ref: Library<31>-Footnote-43397057 +Ref: Library<31>-Footnote-53397124 +Ref: Library<31>-Footnote-63397189 +Ref: Library<31>-Footnote-73397254 +Ref: Library<31>-Footnote-83397319 +Ref: Library<31>-Footnote-93397384 +Ref: Library<31>-Footnote-103397449 +Ref: Library<31>-Footnote-113397515 +Ref: Library<31>-Footnote-123397581 +Ref: Library<31>-Footnote-133397647 +Ref: Library<31>-Footnote-143397713 +Ref: Library<31>-Footnote-153397779 +Ref: Library<31>-Footnote-163397845 +Ref: Library<31>-Footnote-173397911 +Ref: Library<31>-Footnote-183397977 +Ref: Library<31>-Footnote-193398043 +Ref: Library<31>-Footnote-203398109 +Ref: Library<31>-Footnote-213398175 +Ref: Library<31>-Footnote-223398241 +Ref: Library<31>-Footnote-233398307 +Ref: Library<31>-Footnote-243398373 +Ref: Library<31>-Footnote-253398439 +Ref: Library<31>-Footnote-263398505 +Ref: Library<31>-Footnote-273398571 +Ref: Library<31>-Footnote-283398637 +Ref: Library<31>-Footnote-293398703 +Ref: Library<31>-Footnote-303398769 +Ref: Library<31>-Footnote-313398835 +Ref: Library<31>-Footnote-323398901 +Ref: Library<31>-Footnote-333398967 +Ref: Library<31>-Footnote-343399033 +Ref: Library<31>-Footnote-353399099 +Ref: Library<31>-Footnote-363399165 +Ref: Library<31>-Footnote-373399231 +Ref: Library<31>-Footnote-383399297 +Ref: Library<31>-Footnote-393399363 +Ref: Library<31>-Footnote-403399429 +Ref: Library<31>-Footnote-413399495 +Ref: Library<31>-Footnote-423399561 +Ref: Library<31>-Footnote-433399627 +Ref: Library<31>-Footnote-443399693 +Ref: Library<31>-Footnote-453399759 +Ref: Library<31>-Footnote-463399825 +Ref: Library<31>-Footnote-473399891 +Ref: Library<31>-Footnote-483399957 +Ref: Library<31>-Footnote-493400023 +Ref: Library<31>-Footnote-503400089 +Ref: Library<31>-Footnote-513400155 +Ref: Library<31>-Footnote-523400221 +Ref: Library<31>-Footnote-533400287 +Ref: Library<31>-Footnote-543400353 +Node: Documentation<31>3400419 +Ref: whatsnew/changelog id2703400531 +Ref: 14363400531 +Ref: Documentation<31>-Footnote-13401980 +Ref: Documentation<31>-Footnote-23402045 +Ref: Documentation<31>-Footnote-33402110 +Ref: Documentation<31>-Footnote-43402175 +Ref: Documentation<31>-Footnote-53402240 +Ref: Documentation<31>-Footnote-63402279 +Ref: Documentation<31>-Footnote-73402344 +Ref: Documentation<31>-Footnote-83402409 +Ref: Documentation<31>-Footnote-93402474 +Ref: Documentation<31>-Footnote-103402539 +Ref: Documentation<31>-Footnote-113402605 +Ref: Documentation<31>-Footnote-123402671 +Node: Tests<30>3402737 +Ref: whatsnew/changelog id2713402847 +Ref: 14373402847 +Ref: Tests<30>-Footnote-13405098 +Ref: Tests<30>-Footnote-23405163 +Ref: Tests<30>-Footnote-33405228 +Ref: Tests<30>-Footnote-43405293 +Ref: Tests<30>-Footnote-53405358 +Ref: Tests<30>-Footnote-63405423 +Ref: Tests<30>-Footnote-73405488 +Ref: Tests<30>-Footnote-83405553 +Ref: Tests<30>-Footnote-93405618 +Ref: Tests<30>-Footnote-103405683 +Ref: Tests<30>-Footnote-113405749 +Ref: Tests<30>-Footnote-123405815 +Ref: Tests<30>-Footnote-133405881 +Ref: Tests<30>-Footnote-143405947 +Ref: Tests<30>-Footnote-153406013 +Node: Build<32>3406079 +Ref: whatsnew/changelog id2723406183 +Ref: 14393406183 +Ref: Build<32>-Footnote-13409342 +Ref: Build<32>-Footnote-23409407 +Ref: Build<32>-Footnote-33409472 +Ref: Build<32>-Footnote-43409537 +Ref: Build<32>-Footnote-53409602 +Ref: Build<32>-Footnote-63409667 +Ref: Build<32>-Footnote-73409732 +Ref: Build<32>-Footnote-83409797 +Ref: Build<32>-Footnote-93409862 +Ref: Build<32>-Footnote-103409927 +Ref: Build<32>-Footnote-113409993 +Ref: Build<32>-Footnote-123410059 +Ref: Build<32>-Footnote-133410125 +Node: Windows<29>3410191 +Ref: whatsnew/changelog id2733410295 +Ref: 143a3410295 +Ref: Windows<29>-Footnote-13412947 +Ref: Windows<29>-Footnote-23413012 +Ref: Windows<29>-Footnote-33413077 +Ref: Windows<29>-Footnote-43413142 +Ref: Windows<29>-Footnote-53413207 +Ref: Windows<29>-Footnote-63413272 +Ref: Windows<29>-Footnote-73413337 +Ref: Windows<29>-Footnote-83413402 +Ref: Windows<29>-Footnote-93413467 +Ref: Windows<29>-Footnote-103413532 +Ref: Windows<29>-Footnote-113413598 +Ref: Windows<29>-Footnote-123413664 +Node: macOS<22>3413730 +Ref: whatsnew/changelog id2743413833 +Ref: 143b3413833 +Ref: macOS<22>-Footnote-13414147 +Ref: macOS<22>-Footnote-23414212 +Node: IDLE<22>3414277 +Ref: whatsnew/changelog id2753414384 +Ref: 143c3414384 +Ref: IDLE<22>-Footnote-13414631 +Node: Tools/Demos<12>3414696 +Ref: whatsnew/changelog id2763414803 +Ref: 143d3414803 +Ref: Tools/Demos<12>-Footnote-13414957 +Node: C API<29>3415022 +Ref: whatsnew/changelog id2773415112 +Ref: 143e3415112 +Ref: C API<29>-Footnote-13417116 +Ref: C API<29>-Footnote-23417181 +Ref: C API<29>-Footnote-33417246 +Ref: C API<29>-Footnote-43417311 +Ref: C API<29>-Footnote-53417376 +Ref: C API<29>-Footnote-63417441 +Node: Python 3 8 0 alpha 33417506 +Ref: whatsnew/changelog python-3-8-0-alpha-33417630 +Ref: 14403417630 +Node: Security<21>3417991 +Ref: whatsnew/changelog id2783418090 +Ref: 14413418090 +Ref: Security<21>-Footnote-13418654 +Ref: Security<21>-Footnote-23418719 +Node: Core and Builtins<33>3418784 +Ref: whatsnew/changelog id2793418903 +Ref: 14433418903 +Ref: Core and Builtins<33>-Footnote-13422485 +Ref: Core and Builtins<33>-Footnote-23422550 +Ref: Core and Builtins<33>-Footnote-33422615 +Ref: Core and Builtins<33>-Footnote-43422680 +Ref: Core and Builtins<33>-Footnote-53422745 +Ref: Core and Builtins<33>-Footnote-63422810 +Ref: Core and Builtins<33>-Footnote-73422875 +Ref: Core and Builtins<33>-Footnote-83422940 +Ref: Core and Builtins<33>-Footnote-93423005 +Ref: Core and Builtins<33>-Footnote-103423070 +Ref: Core and Builtins<33>-Footnote-113423136 +Ref: Core and Builtins<33>-Footnote-123423202 +Ref: Core and Builtins<33>-Footnote-133423268 +Ref: Core and Builtins<33>-Footnote-143423334 +Ref: Core and Builtins<33>-Footnote-153423400 +Ref: Core and Builtins<33>-Footnote-163423466 +Ref: Core and Builtins<33>-Footnote-173423532 +Ref: Core and Builtins<33>-Footnote-183423598 +Ref: Core and Builtins<33>-Footnote-193423664 +Ref: Core and Builtins<33>-Footnote-203423730 +Ref: Core and Builtins<33>-Footnote-213423796 +Ref: Core and Builtins<33>-Footnote-223423862 +Node: Library<32>3423928 +Ref: whatsnew/changelog id2803424052 +Ref: 14453424052 +Ref: Library<32>-Footnote-13429695 +Ref: Library<32>-Footnote-23429760 +Ref: Library<32>-Footnote-33429825 +Ref: Library<32>-Footnote-43429890 +Ref: Library<32>-Footnote-53429955 +Ref: Library<32>-Footnote-63430020 +Ref: Library<32>-Footnote-73430085 +Ref: Library<32>-Footnote-83430150 +Ref: Library<32>-Footnote-93430215 +Ref: Library<32>-Footnote-103430280 +Ref: Library<32>-Footnote-113430346 +Ref: Library<32>-Footnote-123430412 +Ref: Library<32>-Footnote-133430478 +Ref: Library<32>-Footnote-143430544 +Ref: Library<32>-Footnote-153430610 +Ref: Library<32>-Footnote-163430676 +Ref: Library<32>-Footnote-173430742 +Ref: Library<32>-Footnote-183430808 +Ref: Library<32>-Footnote-193430874 +Ref: Library<32>-Footnote-203430940 +Ref: Library<32>-Footnote-213431006 +Ref: Library<32>-Footnote-223431072 +Ref: Library<32>-Footnote-233431138 +Ref: Library<32>-Footnote-243431204 +Ref: Library<32>-Footnote-253431270 +Ref: Library<32>-Footnote-263431336 +Ref: Library<32>-Footnote-273431402 +Ref: Library<32>-Footnote-283431468 +Ref: Library<32>-Footnote-293431534 +Ref: Library<32>-Footnote-303431600 +Ref: Library<32>-Footnote-313431666 +Ref: Library<32>-Footnote-323431732 +Ref: Library<32>-Footnote-333431798 +Ref: Library<32>-Footnote-343431864 +Ref: Library<32>-Footnote-353431930 +Ref: Library<32>-Footnote-363431996 +Ref: Library<32>-Footnote-373432062 +Node: Documentation<32>3432128 +Ref: whatsnew/changelog id2813432240 +Ref: 14473432240 +Ref: Documentation<32>-Footnote-13432811 +Ref: Documentation<32>-Footnote-23432876 +Ref: Documentation<32>-Footnote-33432941 +Node: Tests<31>3433006 +Ref: whatsnew/changelog id2823433116 +Ref: 14483433116 +Ref: Tests<31>-Footnote-13433628 +Ref: Tests<31>-Footnote-23433693 +Ref: Tests<31>-Footnote-33433758 +Node: Build<33>3433823 +Ref: whatsnew/changelog id2833433927 +Ref: 14493433927 +Ref: Build<33>-Footnote-13434447 +Ref: Build<33>-Footnote-23434512 +Ref: Build<33>-Footnote-33434577 +Ref: Build<33>-Footnote-43434642 +Node: Windows<30>3434707 +Ref: whatsnew/changelog id2843434810 +Ref: 144a3434810 +Ref: Windows<30>-Footnote-13435261 +Ref: Windows<30>-Footnote-23435326 +Ref: Windows<30>-Footnote-33435391 +Node: IDLE<23>3435456 +Ref: whatsnew/changelog id2853435565 +Ref: 144b3435565 +Ref: IDLE<23>-Footnote-13436674 +Ref: IDLE<23>-Footnote-23436739 +Ref: IDLE<23>-Footnote-33436804 +Ref: IDLE<23>-Footnote-43436869 +Ref: IDLE<23>-Footnote-53436934 +Ref: IDLE<23>-Footnote-63436999 +Ref: IDLE<23>-Footnote-73437064 +Ref: IDLE<23>-Footnote-83437129 +Ref: IDLE<23>-Footnote-93437194 +Node: Tools/Demos<13>3437259 +Ref: whatsnew/changelog id2863437366 +Ref: 144c3437366 +Ref: Tools/Demos<13>-Footnote-13437579 +Ref: Tools/Demos<13>-Footnote-23437644 +Node: C API<30>3437709 +Ref: whatsnew/changelog id2873437799 +Ref: 144d3437799 +Ref: C API<30>-Footnote-13438191 +Ref: C API<30>-Footnote-23438256 +Node: Python 3 8 0 alpha 23438321 +Ref: whatsnew/changelog python-3-8-0-alpha-23438445 +Ref: 144e3438445 +Node: Core and Builtins<34>3438708 +Ref: whatsnew/changelog id2883438806 +Ref: 144f3438806 +Ref: Core and Builtins<34>-Footnote-13441950 +Ref: Core and Builtins<34>-Footnote-23442015 +Ref: Core and Builtins<34>-Footnote-33442080 +Ref: Core and Builtins<34>-Footnote-43442145 +Ref: Core and Builtins<34>-Footnote-53442210 +Ref: Core and Builtins<34>-Footnote-63442277 +Ref: Core and Builtins<34>-Footnote-73442342 +Ref: Core and Builtins<34>-Footnote-83442407 +Ref: Core and Builtins<34>-Footnote-93442472 +Ref: Core and Builtins<34>-Footnote-103442537 +Ref: Core and Builtins<34>-Footnote-113442603 +Ref: Core and Builtins<34>-Footnote-123442669 +Ref: Core and Builtins<34>-Footnote-133442735 +Ref: Core and Builtins<34>-Footnote-143442801 +Ref: Core and Builtins<34>-Footnote-153442867 +Ref: Core and Builtins<34>-Footnote-163442933 +Ref: Core and Builtins<34>-Footnote-173442999 +Node: Library<33>3443065 +Ref: whatsnew/changelog id2893443189 +Ref: 14503443189 +Ref: Library<33>-Footnote-13446904 +Ref: Library<33>-Footnote-23446969 +Ref: Library<33>-Footnote-33447034 +Ref: Library<33>-Footnote-43447099 +Ref: Library<33>-Footnote-53447164 +Ref: Library<33>-Footnote-63447229 +Ref: Library<33>-Footnote-73447294 +Ref: Library<33>-Footnote-83447359 +Ref: Library<33>-Footnote-93447424 +Ref: Library<33>-Footnote-103447489 +Ref: Library<33>-Footnote-113447555 +Ref: Library<33>-Footnote-123447621 +Ref: Library<33>-Footnote-133447687 +Ref: Library<33>-Footnote-143447753 +Ref: Library<33>-Footnote-153447819 +Ref: Library<33>-Footnote-163447885 +Ref: Library<33>-Footnote-173447951 +Node: Documentation<33>3448017 +Ref: whatsnew/changelog id2903448129 +Ref: 14543448129 +Ref: Documentation<33>-Footnote-13448507 +Ref: Documentation<33>-Footnote-23448572 +Ref: Documentation<33>-Footnote-33448637 +Node: Tests<32>3448702 +Ref: whatsnew/changelog id2913448814 +Ref: 14553448814 +Ref: Tests<32>-Footnote-13450179 +Ref: Tests<32>-Footnote-23450244 +Ref: Tests<32>-Footnote-33450309 +Ref: Tests<32>-Footnote-43450374 +Ref: Tests<32>-Footnote-53450439 +Ref: Tests<32>-Footnote-63450504 +Ref: Tests<32>-Footnote-73450569 +Ref: Tests<32>-Footnote-83450634 +Node: Windows<31>3450699 +Ref: whatsnew/changelog id2923450802 +Ref: 14563450802 +Ref: Windows<31>-Footnote-13451399 +Ref: Windows<31>-Footnote-23451464 +Ref: Windows<31>-Footnote-33451529 +Ref: Windows<31>-Footnote-43451594 +Ref: Windows<31>-Footnote-53451659 +Node: IDLE<24>3451724 +Ref: whatsnew/changelog id2933451809 +Ref: 14573451809 +Ref: IDLE<24>-Footnote-13452115 +Ref: IDLE<24>-Footnote-23452180 +Ref: IDLE<24>-Footnote-33452245 +Node: Python 3 8 0 alpha 13452310 +Ref: whatsnew/changelog python-3-8-0-alpha-13452432 +Ref: 14583452432 +Node: Security<22>3452813 +Ref: whatsnew/changelog id2943452912 +Ref: 14593452912 +Ref: Security<22>-Footnote-13455230 +Ref: Security<22>-Footnote-23455295 +Ref: Security<22>-Footnote-33455360 +Ref: Security<22>-Footnote-43455425 +Ref: Security<22>-Footnote-53455490 +Ref: Security<22>-Footnote-63455555 +Ref: Security<22>-Footnote-73455620 +Ref: Security<22>-Footnote-83455685 +Ref: Security<22>-Footnote-93455750 +Ref: Security<22>-Footnote-103455815 +Ref: Security<22>-Footnote-113455881 +Ref: Security<22>-Footnote-123455947 +Node: Core and Builtins<35>3456013 +Ref: whatsnew/changelog id2953456132 +Ref: 145a3456132 +Ref: Core and Builtins<35>-Footnote-13482328 +Ref: Core and Builtins<35>-Footnote-23482393 +Ref: Core and Builtins<35>-Footnote-33482458 +Ref: Core and Builtins<35>-Footnote-43482523 +Ref: Core and Builtins<35>-Footnote-53482588 +Ref: Core and Builtins<35>-Footnote-63482653 +Ref: Core and Builtins<35>-Footnote-73482718 +Ref: Core and Builtins<35>-Footnote-83482783 +Ref: Core and Builtins<35>-Footnote-93482848 +Ref: Core and Builtins<35>-Footnote-103482913 +Ref: Core and Builtins<35>-Footnote-113482979 +Ref: Core and Builtins<35>-Footnote-123483045 +Ref: Core and Builtins<35>-Footnote-133483111 +Ref: Core and Builtins<35>-Footnote-143483177 +Ref: Core and Builtins<35>-Footnote-153483243 +Ref: Core and Builtins<35>-Footnote-163483309 +Ref: Core and Builtins<35>-Footnote-173483375 +Ref: Core and Builtins<35>-Footnote-183483441 +Ref: Core and Builtins<35>-Footnote-193483507 +Ref: Core and Builtins<35>-Footnote-203483573 +Ref: Core and Builtins<35>-Footnote-213483639 +Ref: Core and Builtins<35>-Footnote-223483705 +Ref: Core and Builtins<35>-Footnote-233483771 +Ref: Core and Builtins<35>-Footnote-243483837 +Ref: Core and Builtins<35>-Footnote-253483903 +Ref: Core and Builtins<35>-Footnote-263483946 +Ref: Core and Builtins<35>-Footnote-273484012 +Ref: Core and Builtins<35>-Footnote-283484078 +Ref: Core and Builtins<35>-Footnote-293484144 +Ref: Core and Builtins<35>-Footnote-303484210 +Ref: Core and Builtins<35>-Footnote-313484276 +Ref: Core and Builtins<35>-Footnote-323484342 +Ref: Core and Builtins<35>-Footnote-333484408 +Ref: Core and Builtins<35>-Footnote-343484474 +Ref: Core and Builtins<35>-Footnote-353484540 +Ref: Core and Builtins<35>-Footnote-363484606 +Ref: Core and Builtins<35>-Footnote-373484672 +Ref: Core and Builtins<35>-Footnote-383484738 +Ref: Core and Builtins<35>-Footnote-393484804 +Ref: Core and Builtins<35>-Footnote-403484870 +Ref: Core and Builtins<35>-Footnote-413484936 +Ref: Core and Builtins<35>-Footnote-423485002 +Ref: Core and Builtins<35>-Footnote-433485068 +Ref: Core and Builtins<35>-Footnote-443485134 +Ref: Core and Builtins<35>-Footnote-453485200 +Ref: Core and Builtins<35>-Footnote-463485266 +Ref: Core and Builtins<35>-Footnote-473485332 +Ref: Core and Builtins<35>-Footnote-483485398 +Ref: Core and Builtins<35>-Footnote-493485464 +Ref: Core and Builtins<35>-Footnote-503485530 +Ref: Core and Builtins<35>-Footnote-513485596 +Ref: Core and Builtins<35>-Footnote-523485662 +Ref: Core and Builtins<35>-Footnote-533485728 +Ref: Core and Builtins<35>-Footnote-543485794 +Ref: Core and Builtins<35>-Footnote-553485860 +Ref: Core and Builtins<35>-Footnote-563485926 +Ref: Core and Builtins<35>-Footnote-573485992 +Ref: Core and Builtins<35>-Footnote-583486058 +Ref: Core and Builtins<35>-Footnote-593486124 +Ref: Core and Builtins<35>-Footnote-603486189 +Ref: Core and Builtins<35>-Footnote-613486255 +Ref: Core and Builtins<35>-Footnote-623486321 +Ref: Core and Builtins<35>-Footnote-633486387 +Ref: Core and Builtins<35>-Footnote-643486453 +Ref: Core and Builtins<35>-Footnote-653486519 +Ref: Core and Builtins<35>-Footnote-663486585 +Ref: Core and Builtins<35>-Footnote-673486651 +Ref: Core and Builtins<35>-Footnote-683486717 +Ref: Core and Builtins<35>-Footnote-693486783 +Ref: Core and Builtins<35>-Footnote-703486849 +Ref: Core and Builtins<35>-Footnote-713486915 +Ref: Core and Builtins<35>-Footnote-723486981 +Ref: Core and Builtins<35>-Footnote-733487047 +Ref: Core and Builtins<35>-Footnote-743487113 +Ref: Core and Builtins<35>-Footnote-753487179 +Ref: Core and Builtins<35>-Footnote-763487245 +Ref: Core and Builtins<35>-Footnote-773487311 +Ref: Core and Builtins<35>-Footnote-783487377 +Ref: Core and Builtins<35>-Footnote-793487443 +Ref: Core and Builtins<35>-Footnote-803487509 +Ref: Core and Builtins<35>-Footnote-813487575 +Ref: Core and Builtins<35>-Footnote-823487641 +Ref: Core and Builtins<35>-Footnote-833487707 +Ref: Core and Builtins<35>-Footnote-843487773 +Ref: Core and Builtins<35>-Footnote-853487839 +Ref: Core and Builtins<35>-Footnote-863487905 +Ref: Core and Builtins<35>-Footnote-873487971 +Ref: Core and Builtins<35>-Footnote-883488037 +Ref: Core and Builtins<35>-Footnote-893488103 +Ref: Core and Builtins<35>-Footnote-903488169 +Ref: Core and Builtins<35>-Footnote-913488235 +Ref: Core and Builtins<35>-Footnote-923488301 +Ref: Core and Builtins<35>-Footnote-933488367 +Ref: Core and Builtins<35>-Footnote-943488433 +Ref: Core and Builtins<35>-Footnote-953488499 +Ref: Core and Builtins<35>-Footnote-963488565 +Ref: Core and Builtins<35>-Footnote-973488633 +Ref: Core and Builtins<35>-Footnote-983488699 +Ref: Core and Builtins<35>-Footnote-993488765 +Ref: Core and Builtins<35>-Footnote-1003488831 +Ref: Core and Builtins<35>-Footnote-1013488898 +Ref: Core and Builtins<35>-Footnote-1023488965 +Ref: Core and Builtins<35>-Footnote-1033489032 +Ref: Core and Builtins<35>-Footnote-1043489099 +Ref: Core and Builtins<35>-Footnote-1053489166 +Ref: Core and Builtins<35>-Footnote-1063489233 +Ref: Core and Builtins<35>-Footnote-1073489300 +Ref: Core and Builtins<35>-Footnote-1083489367 +Ref: Core and Builtins<35>-Footnote-1093489434 +Ref: Core and Builtins<35>-Footnote-1103489501 +Ref: Core and Builtins<35>-Footnote-1113489568 +Ref: Core and Builtins<35>-Footnote-1123489635 +Ref: Core and Builtins<35>-Footnote-1133489702 +Ref: Core and Builtins<35>-Footnote-1143489769 +Ref: Core and Builtins<35>-Footnote-1153489836 +Ref: Core and Builtins<35>-Footnote-1163489903 +Ref: Core and Builtins<35>-Footnote-1173489970 +Ref: Core and Builtins<35>-Footnote-1183490037 +Ref: Core and Builtins<35>-Footnote-1193490104 +Ref: Core and Builtins<35>-Footnote-1203490171 +Ref: Core and Builtins<35>-Footnote-1213490238 +Ref: Core and Builtins<35>-Footnote-1223490305 +Ref: Core and Builtins<35>-Footnote-1233490372 +Ref: Core and Builtins<35>-Footnote-1243490439 +Ref: Core and Builtins<35>-Footnote-1253490506 +Ref: Core and Builtins<35>-Footnote-1263490573 +Ref: Core and Builtins<35>-Footnote-1273490640 +Ref: Core and Builtins<35>-Footnote-1283490707 +Ref: Core and Builtins<35>-Footnote-1293490774 +Ref: Core and Builtins<35>-Footnote-1303490841 +Ref: Core and Builtins<35>-Footnote-1313490908 +Ref: Core and Builtins<35>-Footnote-1323490975 +Ref: Core and Builtins<35>-Footnote-1333491042 +Ref: Core and Builtins<35>-Footnote-1343491109 +Ref: Core and Builtins<35>-Footnote-1353491176 +Ref: Core and Builtins<35>-Footnote-1363491243 +Ref: Core and Builtins<35>-Footnote-1373491310 +Ref: Core and Builtins<35>-Footnote-1383491377 +Ref: Core and Builtins<35>-Footnote-1393491444 +Ref: Core and Builtins<35>-Footnote-1403491511 +Ref: Core and Builtins<35>-Footnote-1413491578 +Ref: Core and Builtins<35>-Footnote-1423491645 +Ref: Core and Builtins<35>-Footnote-1433491712 +Ref: Core and Builtins<35>-Footnote-1443491779 +Ref: Core and Builtins<35>-Footnote-1453491846 +Ref: Core and Builtins<35>-Footnote-1463491913 +Ref: Core and Builtins<35>-Footnote-1473491980 +Ref: Core and Builtins<35>-Footnote-1483492047 +Ref: Core and Builtins<35>-Footnote-1493492114 +Ref: Core and Builtins<35>-Footnote-1503492181 +Ref: Core and Builtins<35>-Footnote-1513492248 +Ref: Core and Builtins<35>-Footnote-1523492315 +Ref: Core and Builtins<35>-Footnote-1533492382 +Ref: Core and Builtins<35>-Footnote-1543492449 +Ref: Core and Builtins<35>-Footnote-1553492516 +Ref: Core and Builtins<35>-Footnote-1563492583 +Ref: Core and Builtins<35>-Footnote-1573492650 +Ref: Core and Builtins<35>-Footnote-1583492717 +Ref: Core and Builtins<35>-Footnote-1593492784 +Ref: Core and Builtins<35>-Footnote-1603492851 +Ref: Core and Builtins<35>-Footnote-1613492918 +Ref: Core and Builtins<35>-Footnote-1623492985 +Node: Library<34>3493052 +Ref: whatsnew/changelog id2963493176 +Ref: 14623493176 +Ref: Library<34>-Footnote-13564434 +Ref: Library<34>-Footnote-23564499 +Ref: Library<34>-Footnote-33564564 +Ref: Library<34>-Footnote-43564629 +Ref: Library<34>-Footnote-53564694 +Ref: Library<34>-Footnote-63564759 +Ref: Library<34>-Footnote-73564824 +Ref: Library<34>-Footnote-83564889 +Ref: Library<34>-Footnote-93564954 +Ref: Library<34>-Footnote-103565019 +Ref: Library<34>-Footnote-113565085 +Ref: Library<34>-Footnote-123565151 +Ref: Library<34>-Footnote-133565217 +Ref: Library<34>-Footnote-143565283 +Ref: Library<34>-Footnote-153565349 +Ref: Library<34>-Footnote-163565415 +Ref: Library<34>-Footnote-173565481 +Ref: Library<34>-Footnote-183565547 +Ref: Library<34>-Footnote-193565613 +Ref: Library<34>-Footnote-203565679 +Ref: Library<34>-Footnote-213565745 +Ref: Library<34>-Footnote-223565811 +Ref: Library<34>-Footnote-233565877 +Ref: Library<34>-Footnote-243565943 +Ref: Library<34>-Footnote-253566009 +Ref: Library<34>-Footnote-263566075 +Ref: Library<34>-Footnote-273566141 +Ref: Library<34>-Footnote-283566207 +Ref: Library<34>-Footnote-293566273 +Ref: Library<34>-Footnote-303566339 +Ref: Library<34>-Footnote-313566405 +Ref: Library<34>-Footnote-323566471 +Ref: Library<34>-Footnote-333566537 +Ref: Library<34>-Footnote-343566603 +Ref: Library<34>-Footnote-353566669 +Ref: Library<34>-Footnote-363566735 +Ref: Library<34>-Footnote-373566801 +Ref: Library<34>-Footnote-383566867 +Ref: Library<34>-Footnote-393566933 +Ref: Library<34>-Footnote-403566999 +Ref: Library<34>-Footnote-413567065 +Ref: Library<34>-Footnote-423567131 +Ref: Library<34>-Footnote-433567197 +Ref: Library<34>-Footnote-443567263 +Ref: Library<34>-Footnote-453567329 +Ref: Library<34>-Footnote-463567395 +Ref: Library<34>-Footnote-473567461 +Ref: Library<34>-Footnote-483567527 +Ref: Library<34>-Footnote-493567593 +Ref: Library<34>-Footnote-503567659 +Ref: Library<34>-Footnote-513567725 +Ref: Library<34>-Footnote-523567791 +Ref: Library<34>-Footnote-533567857 +Ref: Library<34>-Footnote-543567923 +Ref: Library<34>-Footnote-553567989 +Ref: Library<34>-Footnote-563568055 +Ref: Library<34>-Footnote-573568121 +Ref: Library<34>-Footnote-583568187 +Ref: Library<34>-Footnote-593568253 +Ref: Library<34>-Footnote-603568319 +Ref: Library<34>-Footnote-613568385 +Ref: Library<34>-Footnote-623568451 +Ref: Library<34>-Footnote-633568517 +Ref: Library<34>-Footnote-643568583 +Ref: Library<34>-Footnote-653568649 +Ref: Library<34>-Footnote-663568715 +Ref: Library<34>-Footnote-673568781 +Ref: Library<34>-Footnote-683568847 +Ref: Library<34>-Footnote-693568913 +Ref: Library<34>-Footnote-703568979 +Ref: Library<34>-Footnote-713569045 +Ref: Library<34>-Footnote-723569111 +Ref: Library<34>-Footnote-733569177 +Ref: Library<34>-Footnote-743569243 +Ref: Library<34>-Footnote-753569309 +Ref: Library<34>-Footnote-763569375 +Ref: Library<34>-Footnote-773569441 +Ref: Library<34>-Footnote-783569507 +Ref: Library<34>-Footnote-793569573 +Ref: Library<34>-Footnote-803569639 +Ref: Library<34>-Footnote-813569705 +Ref: Library<34>-Footnote-823569771 +Ref: Library<34>-Footnote-833569837 +Ref: Library<34>-Footnote-843569903 +Ref: Library<34>-Footnote-853569969 +Ref: Library<34>-Footnote-863570035 +Ref: Library<34>-Footnote-873570101 +Ref: Library<34>-Footnote-883570167 +Ref: Library<34>-Footnote-893570233 +Ref: Library<34>-Footnote-903570299 +Ref: Library<34>-Footnote-913570365 +Ref: Library<34>-Footnote-923570431 +Ref: Library<34>-Footnote-933570497 +Ref: Library<34>-Footnote-943570557 +Ref: Library<34>-Footnote-953570623 +Ref: Library<34>-Footnote-963570689 +Ref: Library<34>-Footnote-973570755 +Ref: Library<34>-Footnote-983570821 +Ref: Library<34>-Footnote-993570887 +Ref: Library<34>-Footnote-1003570953 +Ref: Library<34>-Footnote-1013571020 +Ref: Library<34>-Footnote-1023571087 +Ref: Library<34>-Footnote-1033571154 +Ref: Library<34>-Footnote-1043571221 +Ref: Library<34>-Footnote-1053571288 +Ref: Library<34>-Footnote-1063571355 +Ref: Library<34>-Footnote-1073571422 +Ref: Library<34>-Footnote-1083571489 +Ref: Library<34>-Footnote-1093571556 +Ref: Library<34>-Footnote-1103571623 +Ref: Library<34>-Footnote-1113571690 +Ref: Library<34>-Footnote-1123571757 +Ref: Library<34>-Footnote-1133571824 +Ref: Library<34>-Footnote-1143571891 +Ref: Library<34>-Footnote-1153571958 +Ref: Library<34>-Footnote-1163572025 +Ref: Library<34>-Footnote-1173572092 +Ref: Library<34>-Footnote-1183572159 +Ref: Library<34>-Footnote-1193572226 +Ref: Library<34>-Footnote-1203572293 +Ref: Library<34>-Footnote-1213572360 +Ref: Library<34>-Footnote-1223572427 +Ref: Library<34>-Footnote-1233572494 +Ref: Library<34>-Footnote-1243572561 +Ref: Library<34>-Footnote-1253572628 +Ref: Library<34>-Footnote-1263572694 +Ref: Library<34>-Footnote-1273572761 +Ref: Library<34>-Footnote-1283572828 +Ref: Library<34>-Footnote-1293572895 +Ref: Library<34>-Footnote-1303572962 +Ref: Library<34>-Footnote-1313573029 +Ref: Library<34>-Footnote-1323573096 +Ref: Library<34>-Footnote-1333573163 +Ref: Library<34>-Footnote-1343573230 +Ref: Library<34>-Footnote-1353573297 +Ref: Library<34>-Footnote-1363573364 +Ref: Library<34>-Footnote-1373573430 +Ref: Library<34>-Footnote-1383573497 +Ref: Library<34>-Footnote-1393573564 +Ref: Library<34>-Footnote-1403573631 +Ref: Library<34>-Footnote-1413573698 +Ref: Library<34>-Footnote-1423573765 +Ref: Library<34>-Footnote-1433573832 +Ref: Library<34>-Footnote-1443573899 +Ref: Library<34>-Footnote-1453573966 +Ref: Library<34>-Footnote-1463574033 +Ref: Library<34>-Footnote-1473574100 +Ref: Library<34>-Footnote-1483574167 +Ref: Library<34>-Footnote-1493574234 +Ref: Library<34>-Footnote-1503574301 +Ref: Library<34>-Footnote-1513574368 +Ref: Library<34>-Footnote-1523574435 +Ref: Library<34>-Footnote-1533574502 +Ref: Library<34>-Footnote-1543574569 +Ref: Library<34>-Footnote-1553574635 +Ref: Library<34>-Footnote-1563574702 +Ref: Library<34>-Footnote-1573574769 +Ref: Library<34>-Footnote-1583574836 +Ref: Library<34>-Footnote-1593574903 +Ref: Library<34>-Footnote-1603574970 +Ref: Library<34>-Footnote-1613575037 +Ref: Library<34>-Footnote-1623575104 +Ref: Library<34>-Footnote-1633575171 +Ref: Library<34>-Footnote-1643575238 +Ref: Library<34>-Footnote-1653575304 +Ref: Library<34>-Footnote-1663575371 +Ref: Library<34>-Footnote-1673575438 +Ref: Library<34>-Footnote-1683575505 +Ref: Library<34>-Footnote-1693575572 +Ref: Library<34>-Footnote-1703575639 +Ref: Library<34>-Footnote-1713575706 +Ref: Library<34>-Footnote-1723575773 +Ref: Library<34>-Footnote-1733575840 +Ref: Library<34>-Footnote-1743575906 +Ref: Library<34>-Footnote-1753575973 +Ref: Library<34>-Footnote-1763576040 +Ref: Library<34>-Footnote-1773576107 +Ref: Library<34>-Footnote-1783576174 +Ref: Library<34>-Footnote-1793576241 +Ref: Library<34>-Footnote-1803576307 +Ref: Library<34>-Footnote-1813576374 +Ref: Library<34>-Footnote-1823576441 +Ref: Library<34>-Footnote-1833576508 +Ref: Library<34>-Footnote-1843576575 +Ref: Library<34>-Footnote-1853576642 +Ref: Library<34>-Footnote-1863576709 +Ref: Library<34>-Footnote-1873576776 +Ref: Library<34>-Footnote-1883576843 +Ref: Library<34>-Footnote-1893576910 +Ref: Library<34>-Footnote-1903576977 +Ref: Library<34>-Footnote-1913577044 +Ref: Library<34>-Footnote-1923577111 +Ref: Library<34>-Footnote-1933577178 +Ref: Library<34>-Footnote-1943577245 +Ref: Library<34>-Footnote-1953577312 +Ref: Library<34>-Footnote-1963577379 +Ref: Library<34>-Footnote-1973577446 +Ref: Library<34>-Footnote-1983577513 +Ref: Library<34>-Footnote-1993577580 +Ref: Library<34>-Footnote-2003577647 +Ref: Library<34>-Footnote-2013577714 +Ref: Library<34>-Footnote-2023577782 +Ref: Library<34>-Footnote-2033577849 +Ref: Library<34>-Footnote-2043577916 +Ref: Library<34>-Footnote-2053577983 +Ref: Library<34>-Footnote-2063578050 +Ref: Library<34>-Footnote-2073578117 +Ref: Library<34>-Footnote-2083578184 +Ref: Library<34>-Footnote-2093578251 +Ref: Library<34>-Footnote-2103578318 +Ref: Library<34>-Footnote-2113578385 +Ref: Library<34>-Footnote-2123578452 +Ref: Library<34>-Footnote-2133578496 +Ref: Library<34>-Footnote-2143578563 +Ref: Library<34>-Footnote-2153578630 +Ref: Library<34>-Footnote-2163578697 +Ref: Library<34>-Footnote-2173578764 +Ref: Library<34>-Footnote-2183578831 +Ref: Library<34>-Footnote-2193578898 +Ref: Library<34>-Footnote-2203578965 +Ref: Library<34>-Footnote-2213579032 +Ref: Library<34>-Footnote-2223579099 +Ref: Library<34>-Footnote-2233579166 +Ref: Library<34>-Footnote-2243579233 +Ref: Library<34>-Footnote-2253579300 +Ref: Library<34>-Footnote-2263579367 +Ref: Library<34>-Footnote-2273579434 +Ref: Library<34>-Footnote-2283579501 +Ref: Library<34>-Footnote-2293579568 +Ref: Library<34>-Footnote-2303579635 +Ref: Library<34>-Footnote-2313579702 +Ref: Library<34>-Footnote-2323579769 +Ref: Library<34>-Footnote-2333579836 +Ref: Library<34>-Footnote-2343579903 +Ref: Library<34>-Footnote-2353579970 +Ref: Library<34>-Footnote-2363580037 +Ref: Library<34>-Footnote-2373580104 +Ref: Library<34>-Footnote-2383580171 +Ref: Library<34>-Footnote-2393580238 +Ref: Library<34>-Footnote-2403580305 +Ref: Library<34>-Footnote-2413580372 +Ref: Library<34>-Footnote-2423580439 +Ref: Library<34>-Footnote-2433580506 +Ref: Library<34>-Footnote-2443580573 +Ref: Library<34>-Footnote-2453580640 +Ref: Library<34>-Footnote-2463580707 +Ref: Library<34>-Footnote-2473580774 +Ref: Library<34>-Footnote-2483580841 +Ref: Library<34>-Footnote-2493580908 +Ref: Library<34>-Footnote-2503580975 +Ref: Library<34>-Footnote-2513581042 +Ref: Library<34>-Footnote-2523581109 +Ref: Library<34>-Footnote-2533581176 +Ref: Library<34>-Footnote-2543581243 +Ref: Library<34>-Footnote-2553581310 +Ref: Library<34>-Footnote-2563581377 +Ref: Library<34>-Footnote-2573581444 +Ref: Library<34>-Footnote-2583581511 +Ref: Library<34>-Footnote-2593581578 +Ref: Library<34>-Footnote-2603581644 +Ref: Library<34>-Footnote-2613581711 +Ref: Library<34>-Footnote-2623581778 +Ref: Library<34>-Footnote-2633581845 +Ref: Library<34>-Footnote-2643581912 +Ref: Library<34>-Footnote-2653581979 +Ref: Library<34>-Footnote-2663582046 +Ref: Library<34>-Footnote-2673582113 +Ref: Library<34>-Footnote-2683582180 +Ref: Library<34>-Footnote-2693582247 +Ref: Library<34>-Footnote-2703582314 +Ref: Library<34>-Footnote-2713582381 +Ref: Library<34>-Footnote-2723582448 +Ref: Library<34>-Footnote-2733582515 +Ref: Library<34>-Footnote-2743582582 +Ref: Library<34>-Footnote-2753582649 +Ref: Library<34>-Footnote-2763582716 +Ref: Library<34>-Footnote-2773582783 +Ref: Library<34>-Footnote-2783582850 +Ref: Library<34>-Footnote-2793582917 +Ref: Library<34>-Footnote-2803582984 +Ref: Library<34>-Footnote-2813583051 +Ref: Library<34>-Footnote-2823583118 +Ref: Library<34>-Footnote-2833583185 +Ref: Library<34>-Footnote-2843583252 +Ref: Library<34>-Footnote-2853583319 +Ref: Library<34>-Footnote-2863583386 +Ref: Library<34>-Footnote-2873583453 +Ref: Library<34>-Footnote-2883583520 +Ref: Library<34>-Footnote-2893583587 +Ref: Library<34>-Footnote-2903583654 +Ref: Library<34>-Footnote-2913583721 +Ref: Library<34>-Footnote-2923583788 +Ref: Library<34>-Footnote-2933583855 +Ref: Library<34>-Footnote-2943583922 +Ref: Library<34>-Footnote-2953583989 +Ref: Library<34>-Footnote-2963584056 +Ref: Library<34>-Footnote-2973584123 +Ref: Library<34>-Footnote-2983584190 +Ref: Library<34>-Footnote-2993584257 +Ref: Library<34>-Footnote-3003584324 +Ref: Library<34>-Footnote-3013584391 +Ref: Library<34>-Footnote-3023584458 +Ref: Library<34>-Footnote-3033584525 +Ref: Library<34>-Footnote-3043584592 +Ref: Library<34>-Footnote-3053584659 +Ref: Library<34>-Footnote-3063584726 +Ref: Library<34>-Footnote-3073584793 +Ref: Library<34>-Footnote-3083584860 +Ref: Library<34>-Footnote-3093584927 +Ref: Library<34>-Footnote-3103584994 +Ref: Library<34>-Footnote-3113585061 +Ref: Library<34>-Footnote-3123585128 +Ref: Library<34>-Footnote-3133585195 +Ref: Library<34>-Footnote-3143585262 +Ref: Library<34>-Footnote-3153585329 +Ref: Library<34>-Footnote-3163585396 +Ref: Library<34>-Footnote-3173585463 +Ref: Library<34>-Footnote-3183585530 +Ref: Library<34>-Footnote-3193585597 +Ref: Library<34>-Footnote-3203585664 +Ref: Library<34>-Footnote-3213585731 +Ref: Library<34>-Footnote-3223585798 +Ref: Library<34>-Footnote-3233585865 +Ref: Library<34>-Footnote-3243585932 +Ref: Library<34>-Footnote-3253585999 +Ref: Library<34>-Footnote-3263586066 +Ref: Library<34>-Footnote-3273586133 +Ref: Library<34>-Footnote-3283586201 +Ref: Library<34>-Footnote-3293586268 +Ref: Library<34>-Footnote-3303586335 +Ref: Library<34>-Footnote-3313586402 +Ref: Library<34>-Footnote-3323586469 +Ref: Library<34>-Footnote-3333586536 +Ref: Library<34>-Footnote-3343586603 +Ref: Library<34>-Footnote-3353586670 +Ref: Library<34>-Footnote-3363586737 +Ref: Library<34>-Footnote-3373586804 +Ref: Library<34>-Footnote-3383586871 +Ref: Library<34>-Footnote-3393586938 +Ref: Library<34>-Footnote-3403587005 +Ref: Library<34>-Footnote-3413587072 +Ref: Library<34>-Footnote-3423587139 +Ref: Library<34>-Footnote-3433587206 +Ref: Library<34>-Footnote-3443587273 +Ref: Library<34>-Footnote-3453587317 +Ref: Library<34>-Footnote-3463587384 +Ref: Library<34>-Footnote-3473587451 +Ref: Library<34>-Footnote-3483587518 +Ref: Library<34>-Footnote-3493587562 +Ref: Library<34>-Footnote-3503587629 +Ref: Library<34>-Footnote-3513587696 +Ref: Library<34>-Footnote-3523587763 +Ref: Library<34>-Footnote-3533587830 +Ref: Library<34>-Footnote-3543587897 +Ref: Library<34>-Footnote-3553587964 +Ref: Library<34>-Footnote-3563588031 +Ref: Library<34>-Footnote-3573588098 +Ref: Library<34>-Footnote-3583588165 +Ref: Library<34>-Footnote-3593588232 +Ref: Library<34>-Footnote-3603588299 +Ref: Library<34>-Footnote-3613588366 +Ref: Library<34>-Footnote-3623588433 +Ref: Library<34>-Footnote-3633588500 +Ref: Library<34>-Footnote-3643588567 +Ref: Library<34>-Footnote-3653588634 +Ref: Library<34>-Footnote-3663588701 +Ref: Library<34>-Footnote-3673588768 +Ref: Library<34>-Footnote-3683588835 +Ref: Library<34>-Footnote-3693588902 +Ref: Library<34>-Footnote-3703588969 +Ref: Library<34>-Footnote-3713589036 +Ref: Library<34>-Footnote-3723589103 +Ref: Library<34>-Footnote-3733589170 +Ref: Library<34>-Footnote-3743589237 +Ref: Library<34>-Footnote-3753589304 +Ref: Library<34>-Footnote-3763589371 +Ref: Library<34>-Footnote-3773589438 +Ref: Library<34>-Footnote-3783589505 +Ref: Library<34>-Footnote-3793589572 +Ref: Library<34>-Footnote-3803589639 +Ref: Library<34>-Footnote-3813589706 +Ref: Library<34>-Footnote-3823589773 +Ref: Library<34>-Footnote-3833589840 +Ref: Library<34>-Footnote-3843589907 +Ref: Library<34>-Footnote-3853589974 +Ref: Library<34>-Footnote-3863590041 +Ref: Library<34>-Footnote-3873590108 +Ref: Library<34>-Footnote-3883590175 +Ref: Library<34>-Footnote-3893590242 +Ref: Library<34>-Footnote-3903590309 +Ref: Library<34>-Footnote-3913590376 +Ref: Library<34>-Footnote-3923590443 +Ref: Library<34>-Footnote-3933590510 +Ref: Library<34>-Footnote-3943590577 +Ref: Library<34>-Footnote-3953590644 +Ref: Library<34>-Footnote-3963590711 +Ref: Library<34>-Footnote-3973590778 +Ref: Library<34>-Footnote-3983590845 +Ref: Library<34>-Footnote-3993590912 +Ref: Library<34>-Footnote-4003590979 +Ref: Library<34>-Footnote-4013591046 +Ref: Library<34>-Footnote-4023591113 +Ref: Library<34>-Footnote-4033591180 +Ref: Library<34>-Footnote-4043591247 +Ref: Library<34>-Footnote-4053591314 +Ref: Library<34>-Footnote-4063591381 +Ref: Library<34>-Footnote-4073591448 +Ref: Library<34>-Footnote-4083591515 +Ref: Library<34>-Footnote-4093591582 +Ref: Library<34>-Footnote-4103591649 +Ref: Library<34>-Footnote-4113591716 +Ref: Library<34>-Footnote-4123591783 +Ref: Library<34>-Footnote-4133591850 +Ref: Library<34>-Footnote-4143591917 +Ref: Library<34>-Footnote-4153591984 +Ref: Library<34>-Footnote-4163592051 +Ref: Library<34>-Footnote-4173592118 +Ref: Library<34>-Footnote-4183592185 +Ref: Library<34>-Footnote-4193592252 +Ref: Library<34>-Footnote-4203592319 +Ref: Library<34>-Footnote-4213592386 +Ref: Library<34>-Footnote-4223592452 +Ref: Library<34>-Footnote-4233592519 +Ref: Library<34>-Footnote-4243592586 +Ref: Library<34>-Footnote-4253592653 +Ref: Library<34>-Footnote-4263592720 +Ref: Library<34>-Footnote-4273592787 +Ref: Library<34>-Footnote-4283592854 +Ref: Library<34>-Footnote-4293592921 +Ref: Library<34>-Footnote-4303592988 +Ref: Library<34>-Footnote-4313593055 +Ref: Library<34>-Footnote-4323593122 +Ref: Library<34>-Footnote-4333593189 +Ref: Library<34>-Footnote-4343593256 +Ref: Library<34>-Footnote-4353593323 +Ref: Library<34>-Footnote-4363593390 +Node: Documentation<34>3593457 +Ref: whatsnew/changelog id2973593569 +Ref: 14863593569 +Ref: Documentation<34>-Footnote-13600272 +Ref: Documentation<34>-Footnote-23600337 +Ref: Documentation<34>-Footnote-33600402 +Ref: Documentation<34>-Footnote-43600467 +Ref: Documentation<34>-Footnote-53600532 +Ref: Documentation<34>-Footnote-63600597 +Ref: Documentation<34>-Footnote-73600662 +Ref: Documentation<34>-Footnote-83600727 +Ref: Documentation<34>-Footnote-93600792 +Ref: Documentation<34>-Footnote-103600857 +Ref: Documentation<34>-Footnote-113600923 +Ref: Documentation<34>-Footnote-123600989 +Ref: Documentation<34>-Footnote-133601055 +Ref: Documentation<34>-Footnote-143601121 +Ref: Documentation<34>-Footnote-153601187 +Ref: Documentation<34>-Footnote-163601253 +Ref: Documentation<34>-Footnote-173601319 +Ref: Documentation<34>-Footnote-183601385 +Ref: Documentation<34>-Footnote-193601451 +Ref: Documentation<34>-Footnote-203601517 +Ref: Documentation<34>-Footnote-213601583 +Ref: Documentation<34>-Footnote-223601649 +Ref: Documentation<34>-Footnote-233601715 +Ref: Documentation<34>-Footnote-243601758 +Ref: Documentation<34>-Footnote-253601824 +Ref: Documentation<34>-Footnote-263601890 +Ref: Documentation<34>-Footnote-273601956 +Ref: Documentation<34>-Footnote-283602022 +Ref: Documentation<34>-Footnote-293602088 +Ref: Documentation<34>-Footnote-303602131 +Ref: Documentation<34>-Footnote-313602197 +Ref: Documentation<34>-Footnote-323602263 +Ref: Documentation<34>-Footnote-333602329 +Ref: Documentation<34>-Footnote-343602395 +Ref: Documentation<34>-Footnote-353602461 +Ref: Documentation<34>-Footnote-363602527 +Ref: Documentation<34>-Footnote-373602593 +Ref: Documentation<34>-Footnote-383602659 +Ref: Documentation<34>-Footnote-393602725 +Ref: Documentation<34>-Footnote-403602791 +Ref: Documentation<34>-Footnote-413602857 +Ref: Documentation<34>-Footnote-423602923 +Ref: Documentation<34>-Footnote-433602989 +Ref: Documentation<34>-Footnote-443603055 +Ref: Documentation<34>-Footnote-453603121 +Ref: Documentation<34>-Footnote-463603187 +Ref: Documentation<34>-Footnote-473603253 +Ref: Documentation<34>-Footnote-483603319 +Ref: Documentation<34>-Footnote-493603385 +Ref: Documentation<34>-Footnote-503603451 +Ref: Documentation<34>-Footnote-513603516 +Ref: Documentation<34>-Footnote-523603582 +Ref: Documentation<34>-Footnote-533603648 +Ref: Documentation<34>-Footnote-543603714 +Ref: Documentation<34>-Footnote-553603780 +Ref: Documentation<34>-Footnote-563603846 +Ref: Documentation<34>-Footnote-573603911 +Ref: Documentation<34>-Footnote-583603977 +Ref: Documentation<34>-Footnote-593604043 +Node: Tests<33>3604109 +Ref: whatsnew/changelog id2983604219 +Ref: 14883604219 +Ref: Tests<33>-Footnote-13611825 +Ref: Tests<33>-Footnote-23611890 +Ref: Tests<33>-Footnote-33611955 +Ref: Tests<33>-Footnote-43612020 +Ref: Tests<33>-Footnote-53612085 +Ref: Tests<33>-Footnote-63612150 +Ref: Tests<33>-Footnote-73612215 +Ref: Tests<33>-Footnote-83612280 +Ref: Tests<33>-Footnote-93612345 +Ref: Tests<33>-Footnote-103612410 +Ref: Tests<33>-Footnote-113612476 +Ref: Tests<33>-Footnote-123612542 +Ref: Tests<33>-Footnote-133612608 +Ref: Tests<33>-Footnote-143612674 +Ref: Tests<33>-Footnote-153612740 +Ref: Tests<33>-Footnote-163612806 +Ref: Tests<33>-Footnote-173612872 +Ref: Tests<33>-Footnote-183612938 +Ref: Tests<33>-Footnote-193613004 +Ref: Tests<33>-Footnote-203613070 +Ref: Tests<33>-Footnote-213613136 +Ref: Tests<33>-Footnote-223613202 +Ref: Tests<33>-Footnote-233613268 +Ref: Tests<33>-Footnote-243613334 +Ref: Tests<33>-Footnote-253613400 +Ref: Tests<33>-Footnote-263613466 +Ref: Tests<33>-Footnote-273613532 +Ref: Tests<33>-Footnote-283613598 +Ref: Tests<33>-Footnote-293613664 +Ref: Tests<33>-Footnote-303613730 +Ref: Tests<33>-Footnote-313613796 +Ref: Tests<33>-Footnote-323613862 +Ref: Tests<33>-Footnote-333613928 +Ref: Tests<33>-Footnote-343613994 +Ref: Tests<33>-Footnote-353614060 +Ref: Tests<33>-Footnote-363614126 +Ref: Tests<33>-Footnote-373614192 +Ref: Tests<33>-Footnote-383614258 +Ref: Tests<33>-Footnote-393614324 +Ref: Tests<33>-Footnote-403614390 +Ref: Tests<33>-Footnote-413614456 +Ref: Tests<33>-Footnote-423614522 +Ref: Tests<33>-Footnote-433614588 +Ref: Tests<33>-Footnote-443614654 +Ref: Tests<33>-Footnote-453614720 +Ref: Tests<33>-Footnote-463614786 +Ref: Tests<33>-Footnote-473614852 +Ref: Tests<33>-Footnote-483614918 +Node: Build<34>3614984 +Ref: whatsnew/changelog id2993615088 +Ref: 148a3615088 +Ref: Build<34>-Footnote-13620209 +Ref: Build<34>-Footnote-23620274 +Ref: Build<34>-Footnote-33620339 +Ref: Build<34>-Footnote-43620404 +Ref: Build<34>-Footnote-53620469 +Ref: Build<34>-Footnote-63620534 +Ref: Build<34>-Footnote-73620599 +Ref: Build<34>-Footnote-83620664 +Ref: Build<34>-Footnote-93620729 +Ref: Build<34>-Footnote-103620794 +Ref: Build<34>-Footnote-113620860 +Ref: Build<34>-Footnote-123620926 +Ref: Build<34>-Footnote-133620992 +Ref: Build<34>-Footnote-143621058 +Ref: Build<34>-Footnote-153621124 +Ref: Build<34>-Footnote-163621190 +Ref: Build<34>-Footnote-173621256 +Ref: Build<34>-Footnote-183621322 +Ref: Build<34>-Footnote-193621388 +Ref: Build<34>-Footnote-203621454 +Ref: Build<34>-Footnote-213621520 +Ref: Build<34>-Footnote-223621586 +Ref: Build<34>-Footnote-233621652 +Ref: Build<34>-Footnote-243621717 +Ref: Build<34>-Footnote-253621783 +Ref: Build<34>-Footnote-263621849 +Ref: Build<34>-Footnote-273621915 +Ref: Build<34>-Footnote-283621981 +Ref: Build<34>-Footnote-293622047 +Ref: Build<34>-Footnote-303622113 +Ref: Build<34>-Footnote-313622179 +Ref: Build<34>-Footnote-323622245 +Ref: Build<34>-Footnote-333622311 +Ref: Build<34>-Footnote-343622377 +Ref: Build<34>-Footnote-353622443 +Ref: Build<34>-Footnote-363622509 +Ref: Build<34>-Footnote-373622575 +Node: Windows<32>3622641 +Ref: whatsnew/changelog id3003622745 +Ref: 148b3622745 +Ref: Windows<32>-Footnote-13627168 +Ref: Windows<32>-Footnote-23627233 +Ref: Windows<32>-Footnote-33627298 +Ref: Windows<32>-Footnote-43627363 +Ref: Windows<32>-Footnote-53627428 +Ref: Windows<32>-Footnote-63627493 +Ref: Windows<32>-Footnote-73627558 +Ref: Windows<32>-Footnote-83627623 +Ref: Windows<32>-Footnote-93627688 +Ref: Windows<32>-Footnote-103627753 +Ref: Windows<32>-Footnote-113627819 +Ref: Windows<32>-Footnote-123627885 +Ref: Windows<32>-Footnote-133627951 +Ref: Windows<32>-Footnote-143628017 +Ref: Windows<32>-Footnote-153628083 +Ref: Windows<32>-Footnote-163628149 +Ref: Windows<32>-Footnote-173628215 +Ref: Windows<32>-Footnote-183628281 +Ref: Windows<32>-Footnote-193628347 +Ref: Windows<32>-Footnote-203628413 +Ref: Windows<32>-Footnote-213628479 +Ref: Windows<32>-Footnote-223628545 +Ref: Windows<32>-Footnote-233628611 +Ref: Windows<32>-Footnote-243628677 +Ref: Windows<32>-Footnote-253628743 +Ref: Windows<32>-Footnote-263628809 +Ref: Windows<32>-Footnote-273628875 +Ref: Windows<32>-Footnote-283628941 +Ref: Windows<32>-Footnote-293629007 +Ref: Windows<32>-Footnote-303629073 +Ref: Windows<32>-Footnote-313629139 +Ref: Windows<32>-Footnote-323629205 +Ref: Windows<32>-Footnote-333629271 +Ref: Windows<32>-Footnote-343629337 +Ref: Windows<32>-Footnote-353629403 +Ref: Windows<32>-Footnote-363629469 +Ref: Windows<32>-Footnote-373629535 +Ref: Windows<32>-Footnote-383629601 +Ref: Windows<32>-Footnote-393629667 +Ref: Windows<32>-Footnote-403629733 +Node: macOS<23>3629798 +Ref: whatsnew/changelog id3013629901 +Ref: 148c3629901 +Ref: macOS<23>-Footnote-13631508 +Ref: macOS<23>-Footnote-23631573 +Ref: macOS<23>-Footnote-33631638 +Ref: macOS<23>-Footnote-43631703 +Ref: macOS<23>-Footnote-53631768 +Ref: macOS<23>-Footnote-63631833 +Ref: macOS<23>-Footnote-73631898 +Ref: macOS<23>-Footnote-83631963 +Ref: macOS<23>-Footnote-93632028 +Ref: macOS<23>-Footnote-103632093 +Node: IDLE<25>3632159 +Ref: whatsnew/changelog id3023632266 +Ref: 148d3632266 +Ref: IDLE<25>-Footnote-13640722 +Ref: IDLE<25>-Footnote-23640787 +Ref: IDLE<25>-Footnote-33640852 +Ref: IDLE<25>-Footnote-43640917 +Ref: IDLE<25>-Footnote-53640982 +Ref: IDLE<25>-Footnote-63641047 +Ref: IDLE<25>-Footnote-73641112 +Ref: IDLE<25>-Footnote-83641177 +Ref: IDLE<25>-Footnote-93641242 +Ref: IDLE<25>-Footnote-103641307 +Ref: IDLE<25>-Footnote-113641373 +Ref: IDLE<25>-Footnote-123641439 +Ref: IDLE<25>-Footnote-133641505 +Ref: IDLE<25>-Footnote-143641571 +Ref: IDLE<25>-Footnote-153641637 +Ref: IDLE<25>-Footnote-163641703 +Ref: IDLE<25>-Footnote-173641769 +Ref: IDLE<25>-Footnote-183641835 +Ref: IDLE<25>-Footnote-193641901 +Ref: IDLE<25>-Footnote-203641967 +Ref: IDLE<25>-Footnote-213642033 +Ref: IDLE<25>-Footnote-223642099 +Ref: IDLE<25>-Footnote-233642165 +Ref: IDLE<25>-Footnote-243642231 +Ref: IDLE<25>-Footnote-253642297 +Ref: IDLE<25>-Footnote-263642363 +Ref: IDLE<25>-Footnote-273642429 +Ref: IDLE<25>-Footnote-283642497 +Ref: IDLE<25>-Footnote-293642563 +Ref: IDLE<25>-Footnote-303642629 +Ref: IDLE<25>-Footnote-313642695 +Ref: IDLE<25>-Footnote-323642761 +Ref: IDLE<25>-Footnote-333642827 +Ref: IDLE<25>-Footnote-343642893 +Ref: IDLE<25>-Footnote-353642959 +Ref: IDLE<25>-Footnote-363643025 +Ref: IDLE<25>-Footnote-373643091 +Ref: IDLE<25>-Footnote-383643157 +Ref: IDLE<25>-Footnote-393643223 +Ref: IDLE<25>-Footnote-403643289 +Ref: IDLE<25>-Footnote-413643355 +Ref: IDLE<25>-Footnote-423643421 +Ref: IDLE<25>-Footnote-433643487 +Ref: IDLE<25>-Footnote-443643553 +Ref: IDLE<25>-Footnote-453643619 +Ref: IDLE<25>-Footnote-463643685 +Ref: IDLE<25>-Footnote-473643751 +Ref: IDLE<25>-Footnote-483643817 +Ref: IDLE<25>-Footnote-493643883 +Ref: IDLE<25>-Footnote-503643949 +Ref: IDLE<25>-Footnote-513644015 +Ref: IDLE<25>-Footnote-523644081 +Ref: IDLE<25>-Footnote-533644147 +Ref: IDLE<25>-Footnote-543644213 +Ref: IDLE<25>-Footnote-553644279 +Ref: IDLE<25>-Footnote-563644345 +Ref: IDLE<25>-Footnote-573644411 +Ref: IDLE<25>-Footnote-583644477 +Ref: IDLE<25>-Footnote-593644543 +Node: Tools/Demos<14>3644609 +Ref: whatsnew/changelog id3033644716 +Ref: 148e3644716 +Ref: Tools/Demos<14>-Footnote-13646365 +Ref: Tools/Demos<14>-Footnote-23646430 +Ref: Tools/Demos<14>-Footnote-33646495 +Ref: Tools/Demos<14>-Footnote-43646560 +Ref: Tools/Demos<14>-Footnote-53646625 +Ref: Tools/Demos<14>-Footnote-63646690 +Ref: Tools/Demos<14>-Footnote-73646755 +Ref: Tools/Demos<14>-Footnote-83646820 +Ref: Tools/Demos<14>-Footnote-93646885 +Ref: Tools/Demos<14>-Footnote-103646950 +Ref: Tools/Demos<14>-Footnote-113647016 +Ref: Tools/Demos<14>-Footnote-123647082 +Node: C API<31>3647148 +Ref: whatsnew/changelog id3043647238 +Ref: 148f3647238 +Ref: C API<31>-Footnote-13650642 +Ref: C API<31>-Footnote-23650707 +Ref: C API<31>-Footnote-33650772 +Ref: C API<31>-Footnote-43650837 +Ref: C API<31>-Footnote-53650902 +Ref: C API<31>-Footnote-63650967 +Ref: C API<31>-Footnote-73651032 +Ref: C API<31>-Footnote-83651097 +Ref: C API<31>-Footnote-93651162 +Ref: C API<31>-Footnote-103651227 +Ref: C API<31>-Footnote-113651293 +Ref: C API<31>-Footnote-123651359 +Ref: C API<31>-Footnote-133651425 +Ref: C API<31>-Footnote-143651491 +Ref: C API<31>-Footnote-153651557 +Ref: C API<31>-Footnote-163651623 +Ref: C API<31>-Footnote-173651689 +Ref: C API<31>-Footnote-183651755 +Ref: C API<31>-Footnote-193651821 +Ref: C API<31>-Footnote-203651887 +Ref: C API<31>-Footnote-213651953 +Ref: C API<31>-Footnote-223652019 +Node: Python 3 7 0 final3652085 +Ref: whatsnew/changelog python-3-7-0-final3652219 +Ref: 14993652219 +Node: Library<35>3652356 +Ref: whatsnew/changelog id3053652440 +Ref: 149a3652440 +Ref: Library<35>-Footnote-13652610 +Node: C API<32>3652675 +Ref: whatsnew/changelog id3063652759 +Ref: 149c3652759 +Ref: C API<32>-Footnote-13652970 +Node: Python 3 7 0 release candidate 13653035 +Ref: whatsnew/changelog python-3-7-0-release-candidate-13653168 +Ref: 149d3653168 +Node: Core and Builtins<36>3653455 +Ref: whatsnew/changelog id3073653565 +Ref: 149e3653565 +Ref: Core and Builtins<36>-Footnote-13654209 +Ref: Core and Builtins<36>-Footnote-23654274 +Ref: Core and Builtins<36>-Footnote-33654339 +Ref: Core and Builtins<36>-Footnote-43654404 +Node: Library<36>3654469 +Ref: whatsnew/changelog id3083654605 +Ref: 149f3654605 +Ref: Library<36>-Footnote-13656303 +Ref: Library<36>-Footnote-23656368 +Ref: Library<36>-Footnote-33656433 +Ref: Library<36>-Footnote-43656498 +Ref: Library<36>-Footnote-53656563 +Ref: Library<36>-Footnote-63656628 +Ref: Library<36>-Footnote-73656693 +Ref: Library<36>-Footnote-83656758 +Ref: Library<36>-Footnote-93656823 +Ref: Library<36>-Footnote-103656888 +Ref: Library<36>-Footnote-113656954 +Ref: Library<36>-Footnote-123657020 +Ref: Library<36>-Footnote-133657086 +Node: Documentation<35>3657152 +Ref: whatsnew/changelog id3093657276 +Ref: 14a03657276 +Ref: Documentation<35>-Footnote-13657783 +Ref: Documentation<35>-Footnote-23657848 +Ref: Documentation<35>-Footnote-33657890 +Ref: Documentation<35>-Footnote-43657955 +Node: Build<35>3658020 +Ref: whatsnew/changelog id3103658144 +Ref: 14a13658144 +Ref: Build<35>-Footnote-13658406 +Node: Windows<33>3658470 +Ref: whatsnew/changelog id3113658585 +Ref: 14a23658585 +Ref: Windows<33>-Footnote-13658742 +Node: IDLE<26>3658807 +Ref: whatsnew/changelog id3123658904 +Ref: 14a33658904 +Ref: IDLE<26>-Footnote-13660124 +Ref: IDLE<26>-Footnote-23660189 +Ref: IDLE<26>-Footnote-33660254 +Ref: IDLE<26>-Footnote-43660319 +Ref: IDLE<26>-Footnote-53660384 +Ref: IDLE<26>-Footnote-63660449 +Node: Python 3 7 0 beta 53660514 +Ref: whatsnew/changelog python-3-7-0-beta-53660648 +Ref: 14a43660648 +Node: Core and Builtins<37>3660925 +Ref: whatsnew/changelog id3133661022 +Ref: 14a53661022 +Ref: Core and Builtins<37>-Footnote-13662548 +Ref: Core and Builtins<37>-Footnote-23662613 +Ref: Core and Builtins<37>-Footnote-33662678 +Ref: Core and Builtins<37>-Footnote-43662743 +Ref: Core and Builtins<37>-Footnote-53662808 +Ref: Core and Builtins<37>-Footnote-63662873 +Ref: Core and Builtins<37>-Footnote-73662938 +Ref: Core and Builtins<37>-Footnote-83663003 +Ref: Core and Builtins<37>-Footnote-93663068 +Node: Library<37>3663133 +Ref: whatsnew/changelog id3143663256 +Ref: 14a63663256 +Ref: Library<37>-Footnote-13668898 +Ref: Library<37>-Footnote-23668963 +Ref: Library<37>-Footnote-33669028 +Ref: Library<37>-Footnote-43669093 +Ref: Library<37>-Footnote-53669158 +Ref: Library<37>-Footnote-63669223 +Ref: Library<37>-Footnote-73669288 +Ref: Library<37>-Footnote-83669353 +Ref: Library<37>-Footnote-93669418 +Ref: Library<37>-Footnote-103669483 +Ref: Library<37>-Footnote-113669549 +Ref: Library<37>-Footnote-123669615 +Ref: Library<37>-Footnote-133669681 +Ref: Library<37>-Footnote-143669747 +Ref: Library<37>-Footnote-153669813 +Ref: Library<37>-Footnote-163669879 +Ref: Library<37>-Footnote-173669945 +Ref: Library<37>-Footnote-183670011 +Ref: Library<37>-Footnote-193670077 +Ref: Library<37>-Footnote-203670143 +Ref: Library<37>-Footnote-213670209 +Ref: Library<37>-Footnote-223670275 +Ref: Library<37>-Footnote-233670341 +Ref: Library<37>-Footnote-243670407 +Ref: Library<37>-Footnote-253670473 +Ref: Library<37>-Footnote-263670539 +Ref: Library<37>-Footnote-273670605 +Ref: Library<37>-Footnote-283670671 +Ref: Library<37>-Footnote-293670737 +Ref: Library<37>-Footnote-303670803 +Ref: Library<37>-Footnote-313670869 +Ref: Library<37>-Footnote-323670935 +Ref: Library<37>-Footnote-333671001 +Ref: Library<37>-Footnote-343671067 +Ref: Library<37>-Footnote-353671133 +Ref: Library<37>-Footnote-363671199 +Ref: Library<37>-Footnote-373671265 +Ref: Library<37>-Footnote-383671331 +Node: Documentation<36>3671397 +Ref: whatsnew/changelog id3153671508 +Ref: 14a73671508 +Ref: Documentation<36>-Footnote-13671984 +Ref: Documentation<36>-Footnote-23672049 +Ref: Documentation<36>-Footnote-33672114 +Ref: Documentation<36>-Footnote-43672156 +Ref: Documentation<36>-Footnote-53672221 +Ref: Documentation<36>-Footnote-63672286 +Node: Tests<34>3672351 +Ref: whatsnew/changelog id3163672460 +Ref: 14a83672460 +Ref: Tests<34>-Footnote-13672809 +Ref: Tests<34>-Footnote-23672874 +Node: Build<36>3672939 +Ref: whatsnew/changelog id3173673040 +Ref: 14a93673040 +Ref: Build<36>-Footnote-13673519 +Ref: Build<36>-Footnote-23673584 +Ref: Build<36>-Footnote-33673649 +Node: macOS<24>3673714 +Ref: whatsnew/changelog id3183673814 +Ref: 14aa3673814 +Ref: macOS<24>-Footnote-13674056 +Node: IDLE<27>3674121 +Ref: whatsnew/changelog id3193674203 +Ref: 14ab3674203 +Ref: IDLE<27>-Footnote-13674482 +Ref: IDLE<27>-Footnote-23674547 +Ref: IDLE<27>-Footnote-33674612 +Node: Python 3 7 0 beta 43674677 +Ref: whatsnew/changelog python-3-7-0-beta-43674798 +Ref: 14ac3674798 +Node: Core and Builtins<38>3675131 +Ref: whatsnew/changelog id3203675228 +Ref: 14ad3675228 +Ref: Core and Builtins<38>-Footnote-13676362 +Ref: Core and Builtins<38>-Footnote-23676427 +Ref: Core and Builtins<38>-Footnote-33676492 +Ref: Core and Builtins<38>-Footnote-43676557 +Ref: Core and Builtins<38>-Footnote-53676622 +Ref: Core and Builtins<38>-Footnote-63676687 +Ref: Core and Builtins<38>-Footnote-73676752 +Node: Library<38>3676817 +Ref: whatsnew/changelog id3213676940 +Ref: 14ae3676940 +Ref: Library<38>-Footnote-13679771 +Ref: Library<38>-Footnote-23679836 +Ref: Library<38>-Footnote-33679901 +Ref: Library<38>-Footnote-43679966 +Ref: Library<38>-Footnote-53680032 +Ref: Library<38>-Footnote-63680097 +Ref: Library<38>-Footnote-73680162 +Ref: Library<38>-Footnote-83680227 +Ref: Library<38>-Footnote-93680292 +Ref: Library<38>-Footnote-103680357 +Ref: Library<38>-Footnote-113680423 +Ref: Library<38>-Footnote-123680489 +Ref: Library<38>-Footnote-133680555 +Ref: Library<38>-Footnote-143680621 +Ref: Library<38>-Footnote-153680687 +Ref: Library<38>-Footnote-163680753 +Ref: Library<38>-Footnote-173680819 +Ref: Library<38>-Footnote-183680862 +Ref: Library<38>-Footnote-193680928 +Ref: Library<38>-Footnote-203680994 +Ref: Library<38>-Footnote-213681060 +Ref: Library<38>-Footnote-223681126 +Node: Documentation<37>3681192 +Ref: whatsnew/changelog id3223681303 +Ref: 14af3681303 +Ref: Documentation<37>-Footnote-13682054 +Ref: Documentation<37>-Footnote-23682119 +Ref: Documentation<37>-Footnote-33682184 +Ref: Documentation<37>-Footnote-43682249 +Ref: Documentation<37>-Footnote-53682314 +Ref: Documentation<37>-Footnote-63682378 +Node: Tests<35>3682443 +Ref: whatsnew/changelog id3233682552 +Ref: 14b03682552 +Ref: Tests<35>-Footnote-13682768 +Node: Build<37>3682833 +Ref: whatsnew/changelog id3243682936 +Ref: 14b13682936 +Ref: Build<37>-Footnote-13683626 +Ref: Build<37>-Footnote-23683691 +Ref: Build<37>-Footnote-33683756 +Ref: Build<37>-Footnote-43683821 +Ref: Build<37>-Footnote-53683886 +Node: Windows<34>3683951 +Ref: whatsnew/changelog id3253684054 +Ref: 14b23684054 +Ref: Windows<34>-Footnote-13684195 +Node: macOS<25>3684260 +Ref: whatsnew/changelog id3263684362 +Ref: 14b33684362 +Ref: macOS<25>-Footnote-13684503 +Node: IDLE<28>3684568 +Ref: whatsnew/changelog id3273684674 +Ref: 14b43684674 +Ref: IDLE<28>-Footnote-13685264 +Ref: IDLE<28>-Footnote-23685329 +Node: Tools/Demos<15>3685394 +Ref: whatsnew/changelog id3283685482 +Ref: 14b53685482 +Ref: Tools/Demos<15>-Footnote-13686090 +Ref: Tools/Demos<15>-Footnote-23686155 +Ref: Tools/Demos<15>-Footnote-33686220 +Ref: Tools/Demos<15>-Footnote-43686285 +Node: Python 3 7 0 beta 33686350 +Ref: whatsnew/changelog python-3-7-0-beta-33686471 +Ref: 14b63686471 +Node: Security<23>3686850 +Ref: whatsnew/changelog id3293686948 +Ref: 14b73686948 +Ref: Security<23>-Footnote-13687571 +Ref: Security<23>-Footnote-23687636 +Ref: Security<23>-Footnote-33687701 +Node: Core and Builtins<39>3687766 +Ref: whatsnew/changelog id3303687884 +Ref: 14b83687884 +Ref: Core and Builtins<39>-Footnote-13689094 +Ref: Core and Builtins<39>-Footnote-23689159 +Ref: Core and Builtins<39>-Footnote-33689224 +Ref: Core and Builtins<39>-Footnote-43689289 +Ref: Core and Builtins<39>-Footnote-53689354 +Ref: Core and Builtins<39>-Footnote-63689419 +Ref: Core and Builtins<39>-Footnote-73689484 +Node: Library<39>3689549 +Ref: whatsnew/changelog id3313689672 +Ref: 14b93689672 +Ref: Library<39>-Footnote-13693735 +Ref: Library<39>-Footnote-23693800 +Ref: Library<39>-Footnote-33693865 +Ref: Library<39>-Footnote-43693930 +Ref: Library<39>-Footnote-53693995 +Ref: Library<39>-Footnote-63694060 +Ref: Library<39>-Footnote-73694125 +Ref: Library<39>-Footnote-83694190 +Ref: Library<39>-Footnote-93694255 +Ref: Library<39>-Footnote-103694320 +Ref: Library<39>-Footnote-113694386 +Ref: Library<39>-Footnote-123694452 +Ref: Library<39>-Footnote-133694518 +Ref: Library<39>-Footnote-143694584 +Ref: Library<39>-Footnote-153694650 +Ref: Library<39>-Footnote-163694716 +Ref: Library<39>-Footnote-173694782 +Ref: Library<39>-Footnote-183694848 +Ref: Library<39>-Footnote-193694914 +Ref: Library<39>-Footnote-203694980 +Ref: Library<39>-Footnote-213695046 +Ref: Library<39>-Footnote-223695112 +Ref: Library<39>-Footnote-233695178 +Ref: Library<39>-Footnote-243695244 +Ref: Library<39>-Footnote-253695310 +Ref: Library<39>-Footnote-263695376 +Ref: Library<39>-Footnote-273695442 +Node: Documentation<38>3695508 +Ref: whatsnew/changelog id3323695619 +Ref: 14ba3695619 +Ref: Documentation<38>-Footnote-13696256 +Ref: Documentation<38>-Footnote-23696321 +Ref: Documentation<38>-Footnote-33696386 +Ref: Documentation<38>-Footnote-43696451 +Ref: Documentation<38>-Footnote-53696516 +Node: Tests<36>3696581 +Ref: whatsnew/changelog id3333696690 +Ref: 14bb3696690 +Ref: Tests<36>-Footnote-13697023 +Ref: Tests<36>-Footnote-23697088 +Ref: Tests<36>-Footnote-33697153 +Node: Build<38>3697218 +Ref: whatsnew/changelog id3343697321 +Ref: 14bc3697321 +Ref: Build<38>-Footnote-13697458 +Node: Windows<35>3697523 +Ref: whatsnew/changelog id3353697626 +Ref: 14bd3697626 +Ref: Windows<35>-Footnote-13697905 +Ref: Windows<35>-Footnote-23697970 +Node: macOS<26>3698035 +Ref: whatsnew/changelog id3363698137 +Ref: 14be3698137 +Ref: macOS<26>-Footnote-13698569 +Node: IDLE<29>3698634 +Ref: whatsnew/changelog id3373698740 +Ref: 14bf3698740 +Ref: IDLE<29>-Footnote-13699454 +Ref: IDLE<29>-Footnote-23699519 +Node: Tools/Demos<16>3699584 +Ref: whatsnew/changelog id3383699690 +Ref: 14c03699690 +Ref: Tools/Demos<16>-Footnote-13699920 +Node: C API<33>3699985 +Ref: whatsnew/changelog id3393700074 +Ref: 14c13700074 +Ref: C API<33>-Footnote-13700458 +Ref: C API<33>-Footnote-23700523 +Node: Python 3 7 0 beta 23700588 +Ref: whatsnew/changelog python-3-7-0-beta-23700709 +Ref: 14c23700709 +Node: Security<24>3701068 +Ref: whatsnew/changelog id3403701166 +Ref: 14c33701166 +Ref: Security<24>-Footnote-13701351 +Node: Core and Builtins<40>3701416 +Ref: whatsnew/changelog id3413701534 +Ref: 14c43701534 +Ref: Core and Builtins<40>-Footnote-13702365 +Ref: Core and Builtins<40>-Footnote-23702430 +Ref: Core and Builtins<40>-Footnote-33702495 +Ref: Core and Builtins<40>-Footnote-43702560 +Ref: Core and Builtins<40>-Footnote-53702625 +Ref: Core and Builtins<40>-Footnote-63702690 +Ref: Core and Builtins<40>-Footnote-73702755 +Node: Library<40>3702820 +Ref: whatsnew/changelog id3423702943 +Ref: 14c53702943 +Ref: Library<40>-Footnote-13709342 +Ref: Library<40>-Footnote-23709407 +Ref: Library<40>-Footnote-33709472 +Ref: Library<40>-Footnote-43709537 +Ref: Library<40>-Footnote-53709602 +Ref: Library<40>-Footnote-63709667 +Ref: Library<40>-Footnote-73709732 +Ref: Library<40>-Footnote-83709797 +Ref: Library<40>-Footnote-93709862 +Ref: Library<40>-Footnote-103709927 +Ref: Library<40>-Footnote-113709993 +Ref: Library<40>-Footnote-123710059 +Ref: Library<40>-Footnote-133710125 +Ref: Library<40>-Footnote-143710191 +Ref: Library<40>-Footnote-153710257 +Ref: Library<40>-Footnote-163710323 +Ref: Library<40>-Footnote-173710389 +Ref: Library<40>-Footnote-183710455 +Ref: Library<40>-Footnote-193710521 +Ref: Library<40>-Footnote-203710587 +Ref: Library<40>-Footnote-213710653 +Ref: Library<40>-Footnote-223710719 +Ref: Library<40>-Footnote-233710785 +Ref: Library<40>-Footnote-243710851 +Ref: Library<40>-Footnote-253710917 +Ref: Library<40>-Footnote-263710983 +Ref: Library<40>-Footnote-273711049 +Ref: Library<40>-Footnote-283711115 +Ref: Library<40>-Footnote-293711181 +Ref: Library<40>-Footnote-303711247 +Ref: Library<40>-Footnote-313711313 +Ref: Library<40>-Footnote-323711379 +Ref: Library<40>-Footnote-333711445 +Ref: Library<40>-Footnote-343711511 +Node: Documentation<39>3711577 +Ref: whatsnew/changelog id3433711688 +Ref: 14c63711688 +Ref: Documentation<39>-Footnote-13712651 +Ref: Documentation<39>-Footnote-23712716 +Ref: Documentation<39>-Footnote-33712781 +Ref: Documentation<39>-Footnote-43712846 +Ref: Documentation<39>-Footnote-53712911 +Ref: Documentation<39>-Footnote-63712976 +Ref: Documentation<39>-Footnote-73713040 +Ref: Documentation<39>-Footnote-83713105 +Node: Tests<37>3713170 +Ref: whatsnew/changelog id3443713279 +Ref: 14c73713279 +Ref: Tests<37>-Footnote-13713422 +Node: Build<39>3713487 +Ref: whatsnew/changelog id3453713590 +Ref: 14c83713590 +Ref: Build<39>-Footnote-13713731 +Node: Windows<36>3713796 +Ref: whatsnew/changelog id3463713899 +Ref: 14c93713899 +Ref: Windows<36>-Footnote-13714635 +Ref: Windows<36>-Footnote-23714700 +Ref: Windows<36>-Footnote-33714765 +Ref: Windows<36>-Footnote-43714830 +Ref: Windows<36>-Footnote-53714895 +Ref: Windows<36>-Footnote-63714960 +Node: macOS<27>3715025 +Ref: whatsnew/changelog id3473715127 +Ref: 14ca3715127 +Ref: macOS<27>-Footnote-13715262 +Node: IDLE<30>3715327 +Ref: whatsnew/changelog id3483715433 +Ref: 14cb3715433 +Ref: IDLE<30>-Footnote-13716280 +Ref: IDLE<30>-Footnote-23716345 +Ref: IDLE<30>-Footnote-33716410 +Ref: IDLE<30>-Footnote-43716475 +Ref: IDLE<30>-Footnote-53716540 +Ref: IDLE<30>-Footnote-63716605 +Node: Tools/Demos<17>3716670 +Ref: whatsnew/changelog id3493716758 +Ref: 14cc3716758 +Ref: Tools/Demos<17>-Footnote-13716977 +Node: Python 3 7 0 beta 13717042 +Ref: whatsnew/changelog python-3-7-0-beta-13717164 +Ref: 14cd3717164 +Node: Core and Builtins<41>3717467 +Ref: whatsnew/changelog id3503717564 +Ref: 14ce3717564 +Ref: Core and Builtins<41>-Footnote-13720998 +Ref: Core and Builtins<41>-Footnote-23721063 +Ref: Core and Builtins<41>-Footnote-33721128 +Ref: Core and Builtins<41>-Footnote-43721193 +Ref: Core and Builtins<41>-Footnote-53721258 +Ref: Core and Builtins<41>-Footnote-63721323 +Ref: Core and Builtins<41>-Footnote-73721388 +Ref: Core and Builtins<41>-Footnote-83721453 +Ref: Core and Builtins<41>-Footnote-93721518 +Ref: Core and Builtins<41>-Footnote-103721560 +Ref: Core and Builtins<41>-Footnote-113721626 +Ref: Core and Builtins<41>-Footnote-123721692 +Ref: Core and Builtins<41>-Footnote-133721758 +Ref: Core and Builtins<41>-Footnote-143721824 +Ref: Core and Builtins<41>-Footnote-153721890 +Ref: Core and Builtins<41>-Footnote-163721956 +Ref: Core and Builtins<41>-Footnote-173722022 +Ref: Core and Builtins<41>-Footnote-183722088 +Ref: Core and Builtins<41>-Footnote-193722131 +Ref: Core and Builtins<41>-Footnote-203722197 +Ref: Core and Builtins<41>-Footnote-213722263 +Ref: Core and Builtins<41>-Footnote-223722329 +Ref: Core and Builtins<41>-Footnote-233722395 +Node: Library<41>3722461 +Ref: whatsnew/changelog id3513722584 +Ref: 14cf3722584 +Ref: Library<41>-Footnote-13729962 +Ref: Library<41>-Footnote-23730027 +Ref: Library<41>-Footnote-33730092 +Ref: Library<41>-Footnote-43730157 +Ref: Library<41>-Footnote-53730222 +Ref: Library<41>-Footnote-63730287 +Ref: Library<41>-Footnote-73730352 +Ref: Library<41>-Footnote-83730417 +Ref: Library<41>-Footnote-93730482 +Ref: Library<41>-Footnote-103730547 +Ref: Library<41>-Footnote-113730613 +Ref: Library<41>-Footnote-123730679 +Ref: Library<41>-Footnote-133730745 +Ref: Library<41>-Footnote-143730811 +Ref: Library<41>-Footnote-153730877 +Ref: Library<41>-Footnote-163730943 +Ref: Library<41>-Footnote-173731009 +Ref: Library<41>-Footnote-183731075 +Ref: Library<41>-Footnote-193731118 +Ref: Library<41>-Footnote-203731184 +Ref: Library<41>-Footnote-213731250 +Ref: Library<41>-Footnote-223731316 +Ref: Library<41>-Footnote-233731382 +Ref: Library<41>-Footnote-243731448 +Ref: Library<41>-Footnote-253731514 +Ref: Library<41>-Footnote-263731580 +Ref: Library<41>-Footnote-273731646 +Ref: Library<41>-Footnote-283731712 +Ref: Library<41>-Footnote-293731778 +Ref: Library<41>-Footnote-303731844 +Ref: Library<41>-Footnote-313731910 +Ref: Library<41>-Footnote-323731976 +Ref: Library<41>-Footnote-333732042 +Ref: Library<41>-Footnote-343732108 +Ref: Library<41>-Footnote-353732174 +Ref: Library<41>-Footnote-363732240 +Ref: Library<41>-Footnote-373732306 +Ref: Library<41>-Footnote-383732372 +Ref: Library<41>-Footnote-393732438 +Ref: Library<41>-Footnote-403732504 +Ref: Library<41>-Footnote-413732570 +Ref: Library<41>-Footnote-423732636 +Ref: Library<41>-Footnote-433732702 +Ref: Library<41>-Footnote-443732768 +Ref: Library<41>-Footnote-453732834 +Ref: Library<41>-Footnote-463732900 +Ref: Library<41>-Footnote-473732966 +Node: Documentation<40>3733032 +Ref: whatsnew/changelog id3523733143 +Ref: 14d13733143 +Ref: Documentation<40>-Footnote-13733684 +Ref: Documentation<40>-Footnote-23733749 +Ref: Documentation<40>-Footnote-33733814 +Node: Tests<38>3733879 +Ref: whatsnew/changelog id3533733988 +Ref: 14d23733988 +Ref: Tests<38>-Footnote-13734900 +Ref: Tests<38>-Footnote-23734965 +Ref: Tests<38>-Footnote-33735030 +Ref: Tests<38>-Footnote-43735095 +Ref: Tests<38>-Footnote-53735160 +Ref: Tests<38>-Footnote-63735225 +Node: Build<40>3735290 +Ref: whatsnew/changelog id3543735393 +Ref: 14d33735393 +Ref: Build<40>-Footnote-13735996 +Ref: Build<40>-Footnote-23736061 +Ref: Build<40>-Footnote-33736126 +Ref: Build<40>-Footnote-43736191 +Node: Windows<37>3736256 +Ref: whatsnew/changelog id3553736359 +Ref: 14d43736359 +Ref: Windows<37>-Footnote-13736740 +Ref: Windows<37>-Footnote-23736805 +Ref: Windows<37>-Footnote-33736870 +Node: macOS<28>3736935 +Ref: whatsnew/changelog id3563737038 +Ref: 14d53737038 +Ref: macOS<28>-Footnote-13737560 +Ref: macOS<28>-Footnote-23737625 +Node: C API<34>3737690 +Ref: whatsnew/changelog id3573737773 +Ref: 14d63737773 +Ref: C API<34>-Footnote-13738094 +Ref: C API<34>-Footnote-23738159 +Node: Python 3 7 0 alpha 43738224 +Ref: whatsnew/changelog python-3-7-0-alpha-43738347 +Ref: 14d73738347 +Node: Core and Builtins<42>3738644 +Ref: whatsnew/changelog id3583738742 +Ref: 14d83738742 +Ref: Core and Builtins<42>-Footnote-13742252 +Ref: Core and Builtins<42>-Footnote-23742317 +Ref: Core and Builtins<42>-Footnote-33742382 +Ref: Core and Builtins<42>-Footnote-43742447 +Ref: Core and Builtins<42>-Footnote-53742512 +Ref: Core and Builtins<42>-Footnote-63742577 +Ref: Core and Builtins<42>-Footnote-73742642 +Ref: Core and Builtins<42>-Footnote-83742707 +Ref: Core and Builtins<42>-Footnote-93742772 +Ref: Core and Builtins<42>-Footnote-103742837 +Ref: Core and Builtins<42>-Footnote-113742903 +Ref: Core and Builtins<42>-Footnote-123742969 +Ref: Core and Builtins<42>-Footnote-133743035 +Ref: Core and Builtins<42>-Footnote-143743101 +Ref: Core and Builtins<42>-Footnote-153743167 +Ref: Core and Builtins<42>-Footnote-163743233 +Ref: Core and Builtins<42>-Footnote-173743299 +Ref: Core and Builtins<42>-Footnote-183743365 +Ref: Core and Builtins<42>-Footnote-193743431 +Ref: Core and Builtins<42>-Footnote-203743474 +Ref: Core and Builtins<42>-Footnote-213743540 +Ref: Core and Builtins<42>-Footnote-223743583 +Ref: Core and Builtins<42>-Footnote-233743649 +Ref: Core and Builtins<42>-Footnote-243743692 +Ref: Core and Builtins<42>-Footnote-253743758 +Ref: Core and Builtins<42>-Footnote-263743824 +Ref: Core and Builtins<42>-Footnote-273743867 +Node: Library<42>3743933 +Ref: whatsnew/changelog id3593744057 +Ref: 14da3744057 +Ref: Library<42>-Footnote-13752069 +Ref: Library<42>-Footnote-23752134 +Ref: Library<42>-Footnote-33752199 +Ref: Library<42>-Footnote-43752264 +Ref: Library<42>-Footnote-53752329 +Ref: Library<42>-Footnote-63752394 +Ref: Library<42>-Footnote-73752459 +Ref: Library<42>-Footnote-83752524 +Ref: Library<42>-Footnote-93752589 +Ref: Library<42>-Footnote-103752654 +Ref: Library<42>-Footnote-113752720 +Ref: Library<42>-Footnote-123752786 +Ref: Library<42>-Footnote-133752852 +Ref: Library<42>-Footnote-143752918 +Ref: Library<42>-Footnote-153752984 +Ref: Library<42>-Footnote-163753050 +Ref: Library<42>-Footnote-173753116 +Ref: Library<42>-Footnote-183753182 +Ref: Library<42>-Footnote-193753248 +Ref: Library<42>-Footnote-203753314 +Ref: Library<42>-Footnote-213753380 +Ref: Library<42>-Footnote-223753446 +Ref: Library<42>-Footnote-233753512 +Ref: Library<42>-Footnote-243753578 +Ref: Library<42>-Footnote-253753644 +Ref: Library<42>-Footnote-263753710 +Ref: Library<42>-Footnote-273753776 +Ref: Library<42>-Footnote-283753842 +Ref: Library<42>-Footnote-293753908 +Ref: Library<42>-Footnote-303753974 +Ref: Library<42>-Footnote-313754040 +Ref: Library<42>-Footnote-323754106 +Ref: Library<42>-Footnote-333754172 +Ref: Library<42>-Footnote-343754238 +Ref: Library<42>-Footnote-353754304 +Ref: Library<42>-Footnote-363754370 +Ref: Library<42>-Footnote-373754436 +Ref: Library<42>-Footnote-383754502 +Ref: Library<42>-Footnote-393754568 +Ref: Library<42>-Footnote-403754634 +Ref: Library<42>-Footnote-413754700 +Ref: Library<42>-Footnote-423754766 +Ref: Library<42>-Footnote-433754832 +Ref: Library<42>-Footnote-443754898 +Ref: Library<42>-Footnote-453754964 +Ref: Library<42>-Footnote-463755030 +Ref: Library<42>-Footnote-473755096 +Ref: Library<42>-Footnote-483755162 +Ref: Library<42>-Footnote-493755228 +Ref: Library<42>-Footnote-503755294 +Ref: Library<42>-Footnote-513755360 +Ref: Library<42>-Footnote-523755426 +Ref: Library<42>-Footnote-533755492 +Ref: Library<42>-Footnote-543755558 +Node: Documentation<41>3755624 +Ref: whatsnew/changelog id3603755736 +Ref: 14db3755736 +Ref: Documentation<41>-Footnote-13755906 +Node: Tests<39>3755971 +Ref: whatsnew/changelog id3613756083 +Ref: 14dc3756083 +Ref: Tests<39>-Footnote-13756478 +Ref: Tests<39>-Footnote-23756543 +Node: Windows<38>3756608 +Ref: whatsnew/changelog id3623756718 +Ref: 14dd3756718 +Ref: Windows<38>-Footnote-13756917 +Node: Tools/Demos<18>3756982 +Ref: whatsnew/changelog id3633757092 +Ref: 14de3757092 +Ref: Tools/Demos<18>-Footnote-13757374 +Node: C API<35>3757439 +Ref: whatsnew/changelog id3643757529 +Ref: 14df3757529 +Ref: C API<35>-Footnote-13758190 +Ref: C API<35>-Footnote-23758255 +Ref: C API<35>-Footnote-33758320 +Ref: C API<35>-Footnote-43758385 +Node: Python 3 7 0 alpha 33758450 +Ref: whatsnew/changelog python-3-7-0-alpha-33758574 +Ref: 14e03758574 +Node: Core and Builtins<43>3758929 +Ref: whatsnew/changelog id3653759027 +Ref: 14e13759027 +Ref: Core and Builtins<43>-Footnote-13764162 +Ref: Core and Builtins<43>-Footnote-23764227 +Ref: Core and Builtins<43>-Footnote-33764292 +Ref: Core and Builtins<43>-Footnote-43764357 +Ref: Core and Builtins<43>-Footnote-53764422 +Ref: Core and Builtins<43>-Footnote-63764487 +Ref: Core and Builtins<43>-Footnote-73764552 +Ref: Core and Builtins<43>-Footnote-83764617 +Ref: Core and Builtins<43>-Footnote-93764682 +Ref: Core and Builtins<43>-Footnote-103764747 +Ref: Core and Builtins<43>-Footnote-113764813 +Ref: Core and Builtins<43>-Footnote-123764879 +Ref: Core and Builtins<43>-Footnote-133764945 +Ref: Core and Builtins<43>-Footnote-143765011 +Ref: Core and Builtins<43>-Footnote-153765077 +Ref: Core and Builtins<43>-Footnote-163765143 +Ref: Core and Builtins<43>-Footnote-173765209 +Ref: Core and Builtins<43>-Footnote-183765275 +Ref: Core and Builtins<43>-Footnote-193765341 +Ref: Core and Builtins<43>-Footnote-203765407 +Ref: Core and Builtins<43>-Footnote-213765473 +Ref: Core and Builtins<43>-Footnote-223765539 +Node: Library<43>3765605 +Ref: whatsnew/changelog id3663765729 +Ref: 14e23765729 +Ref: Library<43>-Footnote-13781809 +Ref: Library<43>-Footnote-23781874 +Ref: Library<43>-Footnote-33781939 +Ref: Library<43>-Footnote-43782004 +Ref: Library<43>-Footnote-53782069 +Ref: Library<43>-Footnote-63782134 +Ref: Library<43>-Footnote-73782199 +Ref: Library<43>-Footnote-83782264 +Ref: Library<43>-Footnote-93782329 +Ref: Library<43>-Footnote-103782394 +Ref: Library<43>-Footnote-113782460 +Ref: Library<43>-Footnote-123782526 +Ref: Library<43>-Footnote-133782592 +Ref: Library<43>-Footnote-143782658 +Ref: Library<43>-Footnote-153782724 +Ref: Library<43>-Footnote-163782790 +Ref: Library<43>-Footnote-173782856 +Ref: Library<43>-Footnote-183782922 +Ref: Library<43>-Footnote-193782988 +Ref: Library<43>-Footnote-203783054 +Ref: Library<43>-Footnote-213783120 +Ref: Library<43>-Footnote-223783186 +Ref: Library<43>-Footnote-233783252 +Ref: Library<43>-Footnote-243783318 +Ref: Library<43>-Footnote-253783384 +Ref: Library<43>-Footnote-263783452 +Ref: Library<43>-Footnote-273783518 +Ref: Library<43>-Footnote-283783584 +Ref: Library<43>-Footnote-293783650 +Ref: Library<43>-Footnote-303783716 +Ref: Library<43>-Footnote-313783782 +Ref: Library<43>-Footnote-323783848 +Ref: Library<43>-Footnote-333783891 +Ref: Library<43>-Footnote-343783957 +Ref: Library<43>-Footnote-353784023 +Ref: Library<43>-Footnote-363784089 +Ref: Library<43>-Footnote-373784155 +Ref: Library<43>-Footnote-383784221 +Ref: Library<43>-Footnote-393784287 +Ref: Library<43>-Footnote-403784353 +Ref: Library<43>-Footnote-413784419 +Ref: Library<43>-Footnote-423784485 +Ref: Library<43>-Footnote-433784551 +Ref: Library<43>-Footnote-443784617 +Ref: Library<43>-Footnote-453784683 +Ref: Library<43>-Footnote-463784749 +Ref: Library<43>-Footnote-473784814 +Ref: Library<43>-Footnote-483784880 +Ref: Library<43>-Footnote-493784946 +Ref: Library<43>-Footnote-503785012 +Ref: Library<43>-Footnote-513785078 +Ref: Library<43>-Footnote-523785144 +Ref: Library<43>-Footnote-533785210 +Ref: Library<43>-Footnote-543785276 +Ref: Library<43>-Footnote-553785342 +Ref: Library<43>-Footnote-563785408 +Ref: Library<43>-Footnote-573785474 +Ref: Library<43>-Footnote-583785540 +Ref: Library<43>-Footnote-593785606 +Ref: Library<43>-Footnote-603785672 +Ref: Library<43>-Footnote-613785738 +Ref: Library<43>-Footnote-623785804 +Ref: Library<43>-Footnote-633785847 +Ref: Library<43>-Footnote-643785913 +Ref: Library<43>-Footnote-653785979 +Ref: Library<43>-Footnote-663786045 +Ref: Library<43>-Footnote-673786111 +Ref: Library<43>-Footnote-683786177 +Ref: Library<43>-Footnote-693786243 +Ref: Library<43>-Footnote-703786309 +Ref: Library<43>-Footnote-713786375 +Ref: Library<43>-Footnote-723786441 +Ref: Library<43>-Footnote-733786507 +Ref: Library<43>-Footnote-743786573 +Ref: Library<43>-Footnote-753786639 +Ref: Library<43>-Footnote-763786705 +Ref: Library<43>-Footnote-773786771 +Ref: Library<43>-Footnote-783786837 +Ref: Library<43>-Footnote-793786903 +Ref: Library<43>-Footnote-803786969 +Ref: Library<43>-Footnote-813787035 +Ref: Library<43>-Footnote-823787101 +Ref: Library<43>-Footnote-833787144 +Ref: Library<43>-Footnote-843787210 +Ref: Library<43>-Footnote-853787276 +Ref: Library<43>-Footnote-863787342 +Ref: Library<43>-Footnote-873787408 +Ref: Library<43>-Footnote-883787474 +Ref: Library<43>-Footnote-893787540 +Ref: Library<43>-Footnote-903787606 +Ref: Library<43>-Footnote-913787672 +Ref: Library<43>-Footnote-923787738 +Ref: Library<43>-Footnote-933787804 +Ref: Library<43>-Footnote-943787870 +Ref: Library<43>-Footnote-953787936 +Ref: Library<43>-Footnote-963788002 +Ref: Library<43>-Footnote-973788068 +Ref: Library<43>-Footnote-983788134 +Node: Documentation<42>3788200 +Ref: whatsnew/changelog id3673788312 +Ref: 14e73788312 +Ref: Documentation<42>-Footnote-13788495 +Node: Tests<40>3788560 +Ref: whatsnew/changelog id3683788670 +Ref: 14e83788670 +Ref: Tests<40>-Footnote-13789880 +Ref: Tests<40>-Footnote-23789945 +Ref: Tests<40>-Footnote-33790010 +Ref: Tests<40>-Footnote-43790075 +Ref: Tests<40>-Footnote-53790140 +Ref: Tests<40>-Footnote-63790205 +Ref: Tests<40>-Footnote-73790270 +Node: Build<41>3790335 +Ref: whatsnew/changelog id3693790439 +Ref: 14e93790439 +Ref: Build<41>-Footnote-13791653 +Ref: Build<41>-Footnote-23791718 +Ref: Build<41>-Footnote-33791783 +Ref: Build<41>-Footnote-43791848 +Ref: Build<41>-Footnote-53791913 +Ref: Build<41>-Footnote-63791978 +Ref: Build<41>-Footnote-73792043 +Ref: Build<41>-Footnote-83792108 +Ref: Build<41>-Footnote-93792173 +Ref: Build<41>-Footnote-103792238 +Ref: Build<41>-Footnote-113792304 +Ref: Build<41>-Footnote-123792370 +Node: Windows<39>3792436 +Ref: whatsnew/changelog id3703792540 +Ref: 14ea3792540 +Ref: Windows<39>-Footnote-13793073 +Ref: Windows<39>-Footnote-23793137 +Ref: Windows<39>-Footnote-33793202 +Ref: Windows<39>-Footnote-43793267 +Node: macOS<29>3793332 +Ref: whatsnew/changelog id3713793435 +Ref: 14eb3793435 +Ref: macOS<29>-Footnote-13793569 +Node: IDLE<31>3793634 +Ref: whatsnew/changelog id3723793741 +Ref: 14ec3793741 +Ref: IDLE<31>-Footnote-13795834 +Ref: IDLE<31>-Footnote-23795899 +Ref: IDLE<31>-Footnote-33795964 +Ref: IDLE<31>-Footnote-43796029 +Ref: IDLE<31>-Footnote-53796094 +Ref: IDLE<31>-Footnote-63796159 +Ref: IDLE<31>-Footnote-73796224 +Ref: IDLE<31>-Footnote-83796289 +Node: Tools/Demos<19>3796354 +Ref: whatsnew/changelog id3733796461 +Ref: 14ed3796461 +Ref: Tools/Demos<19>-Footnote-13796993 +Ref: Tools/Demos<19>-Footnote-23797058 +Node: C API<36>3797123 +Ref: whatsnew/changelog id3743797213 +Ref: 14ee3797213 +Ref: C API<36>-Footnote-13798341 +Ref: C API<36>-Footnote-23798406 +Ref: C API<36>-Footnote-33798471 +Ref: C API<36>-Footnote-43798536 +Ref: C API<36>-Footnote-53798601 +Ref: C API<36>-Footnote-63798666 +Node: Python 3 7 0 alpha 23798731 +Ref: whatsnew/changelog python-3-7-0-alpha-23798855 +Ref: 14ef3798855 +Node: Core and Builtins<44>3799114 +Ref: whatsnew/changelog id3753799212 +Ref: 14f03799212 +Ref: Core and Builtins<44>-Footnote-13803413 +Ref: Core and Builtins<44>-Footnote-23803478 +Ref: Core and Builtins<44>-Footnote-33803543 +Ref: Core and Builtins<44>-Footnote-43803608 +Ref: Core and Builtins<44>-Footnote-53803673 +Ref: Core and Builtins<44>-Footnote-63803738 +Ref: Core and Builtins<44>-Footnote-73803803 +Ref: Core and Builtins<44>-Footnote-83803868 +Ref: Core and Builtins<44>-Footnote-93803933 +Ref: Core and Builtins<44>-Footnote-103803998 +Ref: Core and Builtins<44>-Footnote-113804064 +Ref: Core and Builtins<44>-Footnote-123804130 +Ref: Core and Builtins<44>-Footnote-133804196 +Ref: Core and Builtins<44>-Footnote-143804262 +Ref: Core and Builtins<44>-Footnote-153804328 +Ref: Core and Builtins<44>-Footnote-163804394 +Ref: Core and Builtins<44>-Footnote-173804460 +Ref: Core and Builtins<44>-Footnote-183804526 +Ref: Core and Builtins<44>-Footnote-193804592 +Ref: Core and Builtins<44>-Footnote-203804658 +Ref: Core and Builtins<44>-Footnote-213804701 +Ref: Core and Builtins<44>-Footnote-223804767 +Ref: Core and Builtins<44>-Footnote-233804833 +Ref: Core and Builtins<44>-Footnote-243804899 +Ref: Core and Builtins<44>-Footnote-253804965 +Ref: Core and Builtins<44>-Footnote-263805031 +Ref: Core and Builtins<44>-Footnote-273805097 +Node: Library<44>3805140 +Ref: whatsnew/changelog id3763805264 +Ref: 14f23805264 +Ref: Library<44>-Footnote-13809357 +Ref: Library<44>-Footnote-23809422 +Ref: Library<44>-Footnote-33809487 +Ref: Library<44>-Footnote-43809552 +Ref: Library<44>-Footnote-53809617 +Ref: Library<44>-Footnote-63809682 +Ref: Library<44>-Footnote-73809747 +Ref: Library<44>-Footnote-83809812 +Ref: Library<44>-Footnote-93809877 +Ref: Library<44>-Footnote-103809942 +Ref: Library<44>-Footnote-113810008 +Ref: Library<44>-Footnote-123810074 +Ref: Library<44>-Footnote-133810140 +Ref: Library<44>-Footnote-143810206 +Ref: Library<44>-Footnote-153810272 +Ref: Library<44>-Footnote-163810338 +Ref: Library<44>-Footnote-173810404 +Ref: Library<44>-Footnote-183810470 +Ref: Library<44>-Footnote-193810536 +Ref: Library<44>-Footnote-203810602 +Ref: Library<44>-Footnote-213810668 +Ref: Library<44>-Footnote-223810734 +Ref: Library<44>-Footnote-233810800 +Ref: Library<44>-Footnote-243810866 +Ref: Library<44>-Footnote-253810932 +Ref: Library<44>-Footnote-263810998 +Node: Documentation<43>3811064 +Ref: whatsnew/changelog id3773811176 +Ref: 14f43811176 +Ref: Documentation<43>-Footnote-13811567 +Ref: Documentation<43>-Footnote-23811632 +Node: Build<42>3811697 +Ref: whatsnew/changelog id3783811806 +Ref: 14f53811806 +Ref: Build<42>-Footnote-13812433 +Ref: Build<42>-Footnote-23812498 +Ref: Build<42>-Footnote-33812563 +Ref: Build<42>-Footnote-43812628 +Ref: Build<42>-Footnote-53812693 +Ref: Build<42>-Footnote-63812758 +Node: IDLE<32>3812823 +Ref: whatsnew/changelog id3793812924 +Ref: 14f63812924 +Ref: IDLE<32>-Footnote-13814230 +Ref: IDLE<32>-Footnote-23814295 +Ref: IDLE<32>-Footnote-33814360 +Ref: IDLE<32>-Footnote-43814425 +Ref: IDLE<32>-Footnote-53814490 +Ref: IDLE<32>-Footnote-63814555 +Node: C API<37>3814622 +Ref: whatsnew/changelog id3803814705 +Ref: 14f73814705 +Ref: C API<37>-Footnote-13815447 +Ref: C API<37>-Footnote-23815512 +Ref: C API<37>-Footnote-33815577 +Ref: C API<37>-Footnote-43815642 +Node: Python 3 7 0 alpha 13815684 +Ref: whatsnew/changelog python-3-7-0-alpha-13815806 +Ref: 14f83815806 +Node: Security<25>3816167 +Ref: whatsnew/changelog id3813816266 +Ref: 14f93816266 +Ref: Security<25>-Footnote-13817890 +Ref: Security<25>-Footnote-23817955 +Ref: Security<25>-Footnote-33818020 +Ref: Security<25>-Footnote-43818085 +Ref: Security<25>-Footnote-53818150 +Ref: Security<25>-Footnote-63818215 +Ref: Security<25>-Footnote-73818280 +Node: Core and Builtins<45>3818345 +Ref: whatsnew/changelog id3823818464 +Ref: 14fa3818464 +Ref: Core and Builtins<45>-Footnote-13839390 +Ref: Core and Builtins<45>-Footnote-23839455 +Ref: Core and Builtins<45>-Footnote-33839520 +Ref: Core and Builtins<45>-Footnote-43839585 +Ref: Core and Builtins<45>-Footnote-53839650 +Ref: Core and Builtins<45>-Footnote-63839715 +Ref: Core and Builtins<45>-Footnote-73839780 +Ref: Core and Builtins<45>-Footnote-83839845 +Ref: Core and Builtins<45>-Footnote-93839910 +Ref: Core and Builtins<45>-Footnote-103839975 +Ref: Core and Builtins<45>-Footnote-113840041 +Ref: Core and Builtins<45>-Footnote-123840107 +Ref: Core and Builtins<45>-Footnote-133840173 +Ref: Core and Builtins<45>-Footnote-143840239 +Ref: Core and Builtins<45>-Footnote-153840305 +Ref: Core and Builtins<45>-Footnote-163840371 +Ref: Core and Builtins<45>-Footnote-173840437 +Ref: Core and Builtins<45>-Footnote-183840503 +Ref: Core and Builtins<45>-Footnote-193840569 +Ref: Core and Builtins<45>-Footnote-203840635 +Ref: Core and Builtins<45>-Footnote-213840701 +Ref: Core and Builtins<45>-Footnote-223840767 +Ref: Core and Builtins<45>-Footnote-233840833 +Ref: Core and Builtins<45>-Footnote-243840899 +Ref: Core and Builtins<45>-Footnote-253840965 +Ref: Core and Builtins<45>-Footnote-263841031 +Ref: Core and Builtins<45>-Footnote-273841097 +Ref: Core and Builtins<45>-Footnote-283841163 +Ref: Core and Builtins<45>-Footnote-293841229 +Ref: Core and Builtins<45>-Footnote-303841295 +Ref: Core and Builtins<45>-Footnote-313841361 +Ref: Core and Builtins<45>-Footnote-323841427 +Ref: Core and Builtins<45>-Footnote-333841493 +Ref: Core and Builtins<45>-Footnote-343841559 +Ref: Core and Builtins<45>-Footnote-353841625 +Ref: Core and Builtins<45>-Footnote-363841668 +Ref: Core and Builtins<45>-Footnote-373841734 +Ref: Core and Builtins<45>-Footnote-383841800 +Ref: Core and Builtins<45>-Footnote-393841866 +Ref: Core and Builtins<45>-Footnote-403841932 +Ref: Core and Builtins<45>-Footnote-413841998 +Ref: Core and Builtins<45>-Footnote-423842064 +Ref: Core and Builtins<45>-Footnote-433842130 +Ref: Core and Builtins<45>-Footnote-443842196 +Ref: Core and Builtins<45>-Footnote-453842262 +Ref: Core and Builtins<45>-Footnote-463842328 +Ref: Core and Builtins<45>-Footnote-473842394 +Ref: Core and Builtins<45>-Footnote-483842460 +Ref: Core and Builtins<45>-Footnote-493842526 +Ref: Core and Builtins<45>-Footnote-503842592 +Ref: Core and Builtins<45>-Footnote-513842658 +Ref: Core and Builtins<45>-Footnote-523842724 +Ref: Core and Builtins<45>-Footnote-533842790 +Ref: Core and Builtins<45>-Footnote-543842856 +Ref: Core and Builtins<45>-Footnote-553842922 +Ref: Core and Builtins<45>-Footnote-563842988 +Ref: Core and Builtins<45>-Footnote-573843054 +Ref: Core and Builtins<45>-Footnote-583843120 +Ref: Core and Builtins<45>-Footnote-593843186 +Ref: Core and Builtins<45>-Footnote-603843252 +Ref: Core and Builtins<45>-Footnote-613843318 +Ref: Core and Builtins<45>-Footnote-623843384 +Ref: Core and Builtins<45>-Footnote-633843450 +Ref: Core and Builtins<45>-Footnote-643843516 +Ref: Core and Builtins<45>-Footnote-653843582 +Ref: Core and Builtins<45>-Footnote-663843648 +Ref: Core and Builtins<45>-Footnote-673843714 +Ref: Core and Builtins<45>-Footnote-683843780 +Ref: Core and Builtins<45>-Footnote-693843846 +Ref: Core and Builtins<45>-Footnote-703843912 +Ref: Core and Builtins<45>-Footnote-713843978 +Ref: Core and Builtins<45>-Footnote-723844044 +Ref: Core and Builtins<45>-Footnote-733844110 +Ref: Core and Builtins<45>-Footnote-743844176 +Ref: Core and Builtins<45>-Footnote-753844242 +Ref: Core and Builtins<45>-Footnote-763844308 +Ref: Core and Builtins<45>-Footnote-773844374 +Ref: Core and Builtins<45>-Footnote-783844440 +Ref: Core and Builtins<45>-Footnote-793844506 +Ref: Core and Builtins<45>-Footnote-803844572 +Ref: Core and Builtins<45>-Footnote-813844638 +Ref: Core and Builtins<45>-Footnote-823844704 +Ref: Core and Builtins<45>-Footnote-833844770 +Ref: Core and Builtins<45>-Footnote-843844836 +Ref: Core and Builtins<45>-Footnote-853844902 +Ref: Core and Builtins<45>-Footnote-863844968 +Ref: Core and Builtins<45>-Footnote-873845034 +Ref: Core and Builtins<45>-Footnote-883845100 +Ref: Core and Builtins<45>-Footnote-893845166 +Ref: Core and Builtins<45>-Footnote-903845232 +Ref: Core and Builtins<45>-Footnote-913845275 +Ref: Core and Builtins<45>-Footnote-923845341 +Ref: Core and Builtins<45>-Footnote-933845407 +Ref: Core and Builtins<45>-Footnote-943845473 +Ref: Core and Builtins<45>-Footnote-953845539 +Ref: Core and Builtins<45>-Footnote-963845605 +Ref: Core and Builtins<45>-Footnote-973845671 +Ref: Core and Builtins<45>-Footnote-983845737 +Ref: Core and Builtins<45>-Footnote-993845803 +Ref: Core and Builtins<45>-Footnote-1003845869 +Ref: Core and Builtins<45>-Footnote-1013845936 +Ref: Core and Builtins<45>-Footnote-1023846003 +Ref: Core and Builtins<45>-Footnote-1033846070 +Ref: Core and Builtins<45>-Footnote-1043846137 +Ref: Core and Builtins<45>-Footnote-1053846204 +Ref: Core and Builtins<45>-Footnote-1063846271 +Ref: Core and Builtins<45>-Footnote-1073846338 +Ref: Core and Builtins<45>-Footnote-1083846405 +Ref: Core and Builtins<45>-Footnote-1093846472 +Ref: Core and Builtins<45>-Footnote-1103846539 +Ref: Core and Builtins<45>-Footnote-1113846606 +Ref: Core and Builtins<45>-Footnote-1123846673 +Ref: Core and Builtins<45>-Footnote-1133846740 +Ref: Core and Builtins<45>-Footnote-1143846807 +Ref: Core and Builtins<45>-Footnote-1153846874 +Ref: Core and Builtins<45>-Footnote-1163846941 +Ref: Core and Builtins<45>-Footnote-1173847008 +Ref: Core and Builtins<45>-Footnote-1183847075 +Ref: Core and Builtins<45>-Footnote-1193847142 +Ref: Core and Builtins<45>-Footnote-1203847209 +Ref: Core and Builtins<45>-Footnote-1213847276 +Ref: Core and Builtins<45>-Footnote-1223847343 +Ref: Core and Builtins<45>-Footnote-1233847410 +Ref: Core and Builtins<45>-Footnote-1243847477 +Ref: Core and Builtins<45>-Footnote-1253847544 +Ref: Core and Builtins<45>-Footnote-1263847611 +Ref: Core and Builtins<45>-Footnote-1273847678 +Ref: Core and Builtins<45>-Footnote-1283847745 +Ref: Core and Builtins<45>-Footnote-1293847812 +Ref: Core and Builtins<45>-Footnote-1303847879 +Ref: Core and Builtins<45>-Footnote-1313847946 +Ref: Core and Builtins<45>-Footnote-1323848013 +Ref: Core and Builtins<45>-Footnote-1333848080 +Ref: Core and Builtins<45>-Footnote-1343848147 +Ref: Core and Builtins<45>-Footnote-1353848214 +Ref: Core and Builtins<45>-Footnote-1363848281 +Ref: Core and Builtins<45>-Footnote-1373848348 +Ref: Core and Builtins<45>-Footnote-1383848415 +Ref: Core and Builtins<45>-Footnote-1393848482 +Ref: Core and Builtins<45>-Footnote-1403848549 +Ref: Core and Builtins<45>-Footnote-1413848616 +Ref: Core and Builtins<45>-Footnote-1423848683 +Ref: Core and Builtins<45>-Footnote-1433848750 +Ref: Core and Builtins<45>-Footnote-1443848817 +Ref: Core and Builtins<45>-Footnote-1453848884 +Ref: Core and Builtins<45>-Footnote-1463848951 +Ref: Core and Builtins<45>-Footnote-1473849018 +Ref: Core and Builtins<45>-Footnote-1483849085 +Node: Library<45>3849152 +Ref: whatsnew/changelog id3833849276 +Ref: 14fc3849276 +Ref: Library<45>-Footnote-13895956 +Ref: Library<45>-Footnote-23896021 +Ref: Library<45>-Footnote-33896086 +Ref: Library<45>-Footnote-43896151 +Ref: Library<45>-Footnote-53896216 +Ref: Library<45>-Footnote-63896281 +Ref: Library<45>-Footnote-73896346 +Ref: Library<45>-Footnote-83896411 +Ref: Library<45>-Footnote-93896476 +Ref: Library<45>-Footnote-103896541 +Ref: Library<45>-Footnote-113896607 +Ref: Library<45>-Footnote-123896673 +Ref: Library<45>-Footnote-133896739 +Ref: Library<45>-Footnote-143896805 +Ref: Library<45>-Footnote-153896871 +Ref: Library<45>-Footnote-163896937 +Ref: Library<45>-Footnote-173897003 +Ref: Library<45>-Footnote-183897069 +Ref: Library<45>-Footnote-193897135 +Ref: Library<45>-Footnote-203897201 +Ref: Library<45>-Footnote-213897267 +Ref: Library<45>-Footnote-223897335 +Ref: Library<45>-Footnote-233897401 +Ref: Library<45>-Footnote-243897467 +Ref: Library<45>-Footnote-253897533 +Ref: Library<45>-Footnote-263897599 +Ref: Library<45>-Footnote-273897642 +Ref: Library<45>-Footnote-283897708 +Ref: Library<45>-Footnote-293897774 +Ref: Library<45>-Footnote-303897840 +Ref: Library<45>-Footnote-313897906 +Ref: Library<45>-Footnote-323897972 +Ref: Library<45>-Footnote-333898038 +Ref: Library<45>-Footnote-343898104 +Ref: Library<45>-Footnote-353898169 +Ref: Library<45>-Footnote-363898235 +Ref: Library<45>-Footnote-373898301 +Ref: Library<45>-Footnote-383898367 +Ref: Library<45>-Footnote-393898433 +Ref: Library<45>-Footnote-403898498 +Ref: Library<45>-Footnote-413898564 +Ref: Library<45>-Footnote-423898630 +Ref: Library<45>-Footnote-433898696 +Ref: Library<45>-Footnote-443898762 +Ref: Library<45>-Footnote-453898828 +Ref: Library<45>-Footnote-463898894 +Ref: Library<45>-Footnote-473898960 +Ref: Library<45>-Footnote-483899026 +Ref: Library<45>-Footnote-493899092 +Ref: Library<45>-Footnote-503899158 +Ref: Library<45>-Footnote-513899224 +Ref: Library<45>-Footnote-523899290 +Ref: Library<45>-Footnote-533899355 +Ref: Library<45>-Footnote-543899421 +Ref: Library<45>-Footnote-553899487 +Ref: Library<45>-Footnote-563899553 +Ref: Library<45>-Footnote-573899619 +Ref: Library<45>-Footnote-583899685 +Ref: Library<45>-Footnote-593899751 +Ref: Library<45>-Footnote-603899817 +Ref: Library<45>-Footnote-613899883 +Ref: Library<45>-Footnote-623899949 +Ref: Library<45>-Footnote-633900015 +Ref: Library<45>-Footnote-643900081 +Ref: Library<45>-Footnote-653900147 +Ref: Library<45>-Footnote-663900213 +Ref: Library<45>-Footnote-673900279 +Ref: Library<45>-Footnote-683900345 +Ref: Library<45>-Footnote-693900411 +Ref: Library<45>-Footnote-703900477 +Ref: Library<45>-Footnote-713900543 +Ref: Library<45>-Footnote-723900609 +Ref: Library<45>-Footnote-733900674 +Ref: Library<45>-Footnote-743900740 +Ref: Library<45>-Footnote-753900806 +Ref: Library<45>-Footnote-763900872 +Ref: Library<45>-Footnote-773900938 +Ref: Library<45>-Footnote-783901004 +Ref: Library<45>-Footnote-793901070 +Ref: Library<45>-Footnote-803901136 +Ref: Library<45>-Footnote-813901202 +Ref: Library<45>-Footnote-823901268 +Ref: Library<45>-Footnote-833901334 +Ref: Library<45>-Footnote-843901400 +Ref: Library<45>-Footnote-853901466 +Ref: Library<45>-Footnote-863901532 +Ref: Library<45>-Footnote-873901598 +Ref: Library<45>-Footnote-883901664 +Ref: Library<45>-Footnote-893901730 +Ref: Library<45>-Footnote-903901796 +Ref: Library<45>-Footnote-913901862 +Ref: Library<45>-Footnote-923901928 +Ref: Library<45>-Footnote-933901994 +Ref: Library<45>-Footnote-943902060 +Ref: Library<45>-Footnote-953902126 +Ref: Library<45>-Footnote-963902192 +Ref: Library<45>-Footnote-973902258 +Ref: Library<45>-Footnote-983902324 +Ref: Library<45>-Footnote-993902390 +Ref: Library<45>-Footnote-1003902456 +Ref: Library<45>-Footnote-1013902523 +Ref: Library<45>-Footnote-1023902590 +Ref: Library<45>-Footnote-1033902657 +Ref: Library<45>-Footnote-1043902724 +Ref: Library<45>-Footnote-1053902791 +Ref: Library<45>-Footnote-1063902858 +Ref: Library<45>-Footnote-1073902925 +Ref: Library<45>-Footnote-1083902992 +Ref: Library<45>-Footnote-1093903059 +Ref: Library<45>-Footnote-1103903126 +Ref: Library<45>-Footnote-1113903193 +Ref: Library<45>-Footnote-1123903260 +Ref: Library<45>-Footnote-1133903327 +Ref: Library<45>-Footnote-1143903394 +Ref: Library<45>-Footnote-1153903461 +Ref: Library<45>-Footnote-1163903528 +Ref: Library<45>-Footnote-1173903594 +Ref: Library<45>-Footnote-1183903661 +Ref: Library<45>-Footnote-1193903728 +Ref: Library<45>-Footnote-1203903795 +Ref: Library<45>-Footnote-1213903862 +Ref: Library<45>-Footnote-1223903929 +Ref: Library<45>-Footnote-1233903996 +Ref: Library<45>-Footnote-1243904063 +Ref: Library<45>-Footnote-1253904130 +Ref: Library<45>-Footnote-1263904197 +Ref: Library<45>-Footnote-1273904264 +Ref: Library<45>-Footnote-1283904331 +Ref: Library<45>-Footnote-1293904398 +Ref: Library<45>-Footnote-1303904465 +Ref: Library<45>-Footnote-1313904532 +Ref: Library<45>-Footnote-1323904599 +Ref: Library<45>-Footnote-1333904666 +Ref: Library<45>-Footnote-1343904733 +Ref: Library<45>-Footnote-1353904800 +Ref: Library<45>-Footnote-1363904867 +Ref: Library<45>-Footnote-1373904934 +Ref: Library<45>-Footnote-1383905001 +Ref: Library<45>-Footnote-1393905068 +Ref: Library<45>-Footnote-1403905135 +Ref: Library<45>-Footnote-1413905202 +Ref: Library<45>-Footnote-1423905269 +Ref: Library<45>-Footnote-1433905336 +Ref: Library<45>-Footnote-1443905403 +Ref: Library<45>-Footnote-1453905470 +Ref: Library<45>-Footnote-1463905537 +Ref: Library<45>-Footnote-1473905603 +Ref: Library<45>-Footnote-1483905670 +Ref: Library<45>-Footnote-1493905737 +Ref: Library<45>-Footnote-1503905804 +Ref: Library<45>-Footnote-1513905871 +Ref: Library<45>-Footnote-1523905938 +Ref: Library<45>-Footnote-1533906005 +Ref: Library<45>-Footnote-1543906072 +Ref: Library<45>-Footnote-1553906139 +Ref: Library<45>-Footnote-1563906206 +Ref: Library<45>-Footnote-1573906273 +Ref: Library<45>-Footnote-1583906340 +Ref: Library<45>-Footnote-1593906407 +Ref: Library<45>-Footnote-1603906474 +Ref: Library<45>-Footnote-1613906541 +Ref: Library<45>-Footnote-1623906608 +Ref: Library<45>-Footnote-1633906675 +Ref: Library<45>-Footnote-1643906742 +Ref: Library<45>-Footnote-1653906809 +Ref: Library<45>-Footnote-1663906876 +Ref: Library<45>-Footnote-1673906943 +Ref: Library<45>-Footnote-1683907010 +Ref: Library<45>-Footnote-1693907077 +Ref: Library<45>-Footnote-1703907143 +Ref: Library<45>-Footnote-1713907210 +Ref: Library<45>-Footnote-1723907277 +Ref: Library<45>-Footnote-1733907344 +Ref: Library<45>-Footnote-1743907411 +Ref: Library<45>-Footnote-1753907478 +Ref: Library<45>-Footnote-1763907545 +Ref: Library<45>-Footnote-1773907612 +Ref: Library<45>-Footnote-1783907679 +Ref: Library<45>-Footnote-1793907746 +Ref: Library<45>-Footnote-1803907813 +Ref: Library<45>-Footnote-1813907879 +Ref: Library<45>-Footnote-1823907946 +Ref: Library<45>-Footnote-1833908013 +Ref: Library<45>-Footnote-1843908080 +Ref: Library<45>-Footnote-1853908147 +Ref: Library<45>-Footnote-1863908214 +Ref: Library<45>-Footnote-1873908280 +Ref: Library<45>-Footnote-1883908347 +Ref: Library<45>-Footnote-1893908414 +Ref: Library<45>-Footnote-1903908481 +Ref: Library<45>-Footnote-1913908548 +Ref: Library<45>-Footnote-1923908615 +Ref: Library<45>-Footnote-1933908682 +Ref: Library<45>-Footnote-1943908749 +Ref: Library<45>-Footnote-1953908816 +Ref: Library<45>-Footnote-1963908883 +Ref: Library<45>-Footnote-1973908950 +Ref: Library<45>-Footnote-1983909017 +Ref: Library<45>-Footnote-1993909084 +Ref: Library<45>-Footnote-2003909151 +Ref: Library<45>-Footnote-2013909218 +Ref: Library<45>-Footnote-2023909285 +Ref: Library<45>-Footnote-2033909352 +Ref: Library<45>-Footnote-2043909419 +Ref: Library<45>-Footnote-2053909486 +Ref: Library<45>-Footnote-2063909553 +Ref: Library<45>-Footnote-2073909620 +Ref: Library<45>-Footnote-2083909687 +Ref: Library<45>-Footnote-2093909754 +Ref: Library<45>-Footnote-2103909821 +Ref: Library<45>-Footnote-2113909888 +Ref: Library<45>-Footnote-2123909955 +Ref: Library<45>-Footnote-2133910022 +Ref: Library<45>-Footnote-2143910089 +Ref: Library<45>-Footnote-2153910156 +Ref: Library<45>-Footnote-2163910223 +Ref: Library<45>-Footnote-2173910290 +Ref: Library<45>-Footnote-2183910357 +Ref: Library<45>-Footnote-2193910424 +Ref: Library<45>-Footnote-2203910491 +Ref: Library<45>-Footnote-2213910558 +Ref: Library<45>-Footnote-2223910625 +Ref: Library<45>-Footnote-2233910692 +Ref: Library<45>-Footnote-2243910759 +Ref: Library<45>-Footnote-2253910825 +Ref: Library<45>-Footnote-2263910892 +Ref: Library<45>-Footnote-2273910959 +Ref: Library<45>-Footnote-2283911026 +Ref: Library<45>-Footnote-2293911093 +Ref: Library<45>-Footnote-2303911160 +Ref: Library<45>-Footnote-2313911227 +Ref: Library<45>-Footnote-2323911294 +Ref: Library<45>-Footnote-2333911361 +Ref: Library<45>-Footnote-2343911428 +Ref: Library<45>-Footnote-2353911495 +Ref: Library<45>-Footnote-2363911562 +Ref: Library<45>-Footnote-2373911629 +Ref: Library<45>-Footnote-2383911696 +Ref: Library<45>-Footnote-2393911763 +Ref: Library<45>-Footnote-2403911830 +Ref: Library<45>-Footnote-2413911897 +Ref: Library<45>-Footnote-2423911964 +Ref: Library<45>-Footnote-2433912031 +Ref: Library<45>-Footnote-2443912098 +Ref: Library<45>-Footnote-2453912165 +Ref: Library<45>-Footnote-2463912232 +Ref: Library<45>-Footnote-2473912299 +Ref: Library<45>-Footnote-2483912366 +Ref: Library<45>-Footnote-2493912433 +Ref: Library<45>-Footnote-2503912500 +Ref: Library<45>-Footnote-2513912567 +Ref: Library<45>-Footnote-2523912634 +Ref: Library<45>-Footnote-2533912701 +Ref: Library<45>-Footnote-2543912768 +Ref: Library<45>-Footnote-2553912835 +Ref: Library<45>-Footnote-2563912902 +Ref: Library<45>-Footnote-2573912969 +Ref: Library<45>-Footnote-2583913036 +Ref: Library<45>-Footnote-2593913103 +Ref: Library<45>-Footnote-2603913170 +Ref: Library<45>-Footnote-2613913237 +Ref: Library<45>-Footnote-2623913304 +Ref: Library<45>-Footnote-2633913371 +Ref: Library<45>-Footnote-2643913438 +Ref: Library<45>-Footnote-2653913505 +Ref: Library<45>-Footnote-2663913572 +Ref: Library<45>-Footnote-2673913639 +Ref: Library<45>-Footnote-2683913706 +Ref: Library<45>-Footnote-2693913773 +Ref: Library<45>-Footnote-2703913840 +Ref: Library<45>-Footnote-2713913907 +Ref: Library<45>-Footnote-2723913974 +Ref: Library<45>-Footnote-2733914030 +Ref: Library<45>-Footnote-2743914097 +Ref: Library<45>-Footnote-2753914164 +Ref: Library<45>-Footnote-2763914231 +Ref: Library<45>-Footnote-2773914298 +Ref: Library<45>-Footnote-2783914365 +Ref: Library<45>-Footnote-2793914432 +Ref: Library<45>-Footnote-2803914499 +Ref: Library<45>-Footnote-2813914566 +Ref: Library<45>-Footnote-2823914633 +Ref: Library<45>-Footnote-2833914700 +Ref: Library<45>-Footnote-2843914767 +Ref: Library<45>-Footnote-2853914834 +Ref: Library<45>-Footnote-2863914901 +Ref: Library<45>-Footnote-2873914968 +Ref: Library<45>-Footnote-2883915035 +Ref: Library<45>-Footnote-2893915102 +Ref: Library<45>-Footnote-2903915169 +Ref: Library<45>-Footnote-2913915236 +Ref: Library<45>-Footnote-2923915303 +Ref: Library<45>-Footnote-2933915370 +Ref: Library<45>-Footnote-2943915437 +Ref: Library<45>-Footnote-2953915504 +Ref: Library<45>-Footnote-2963915571 +Ref: Library<45>-Footnote-2973915638 +Ref: Library<45>-Footnote-2983915705 +Ref: Library<45>-Footnote-2993915772 +Ref: Library<45>-Footnote-3003915839 +Ref: Library<45>-Footnote-3013915906 +Ref: Library<45>-Footnote-3023915973 +Ref: Library<45>-Footnote-3033916040 +Ref: Library<45>-Footnote-3043916107 +Ref: Library<45>-Footnote-3053916174 +Ref: Library<45>-Footnote-3063916241 +Ref: Library<45>-Footnote-3073916308 +Ref: Library<45>-Footnote-3083916375 +Ref: Library<45>-Footnote-3093916442 +Ref: Library<45>-Footnote-3103916509 +Ref: Library<45>-Footnote-3113916576 +Ref: Library<45>-Footnote-3123916643 +Ref: Library<45>-Footnote-3133916710 +Ref: Library<45>-Footnote-3143916777 +Ref: Library<45>-Footnote-3153916844 +Ref: Library<45>-Footnote-3163916911 +Ref: Library<45>-Footnote-3173916978 +Ref: Library<45>-Footnote-3183917045 +Ref: Library<45>-Footnote-3193917112 +Ref: Library<45>-Footnote-3203917179 +Ref: Library<45>-Footnote-3213917246 +Ref: Library<45>-Footnote-3223917313 +Ref: Library<45>-Footnote-3233917380 +Ref: Library<45>-Footnote-3243917447 +Ref: Library<45>-Footnote-3253917514 +Ref: Library<45>-Footnote-3263917581 +Node: Documentation<44>3917648 +Ref: whatsnew/changelog id3843917760 +Ref: 14fd3917760 +Ref: Documentation<44>-Footnote-13919926 +Ref: Documentation<44>-Footnote-23919991 +Ref: Documentation<44>-Footnote-33920056 +Ref: Documentation<44>-Footnote-43920121 +Ref: Documentation<44>-Footnote-53920186 +Ref: Documentation<44>-Footnote-63920251 +Ref: Documentation<44>-Footnote-73920316 +Ref: Documentation<44>-Footnote-83920381 +Ref: Documentation<44>-Footnote-93920446 +Ref: Documentation<44>-Footnote-103920511 +Ref: Documentation<44>-Footnote-113920577 +Ref: Documentation<44>-Footnote-123920643 +Ref: Documentation<44>-Footnote-133920709 +Ref: Documentation<44>-Footnote-143920775 +Ref: Documentation<44>-Footnote-153920841 +Ref: Documentation<44>-Footnote-163920907 +Ref: Documentation<44>-Footnote-173920950 +Node: Tests<41>3921016 +Ref: whatsnew/changelog id3853921126 +Ref: 15003921126 +Ref: Tests<41>-Footnote-13923884 +Ref: Tests<41>-Footnote-23923949 +Ref: Tests<41>-Footnote-33924014 +Ref: Tests<41>-Footnote-43924079 +Ref: Tests<41>-Footnote-53924144 +Ref: Tests<41>-Footnote-63924209 +Ref: Tests<41>-Footnote-73924274 +Ref: Tests<41>-Footnote-83924339 +Ref: Tests<41>-Footnote-93924404 +Ref: Tests<41>-Footnote-103924469 +Ref: Tests<41>-Footnote-113924535 +Ref: Tests<41>-Footnote-123924601 +Ref: Tests<41>-Footnote-133924667 +Ref: Tests<41>-Footnote-143924733 +Ref: Tests<41>-Footnote-153924799 +Ref: Tests<41>-Footnote-163924865 +Ref: Tests<41>-Footnote-173924931 +Ref: Tests<41>-Footnote-183924997 +Ref: Tests<41>-Footnote-193925063 +Node: Build<43>3925129 +Ref: whatsnew/changelog id3863925233 +Ref: 15013925233 +Ref: Build<43>-Footnote-13929997 +Ref: Build<43>-Footnote-23930062 +Ref: Build<43>-Footnote-33930127 +Ref: Build<43>-Footnote-43930192 +Ref: Build<43>-Footnote-53930234 +Ref: Build<43>-Footnote-63930299 +Ref: Build<43>-Footnote-73930364 +Ref: Build<43>-Footnote-83930429 +Ref: Build<43>-Footnote-93930494 +Ref: Build<43>-Footnote-103930559 +Ref: Build<43>-Footnote-113930625 +Ref: Build<43>-Footnote-123930691 +Ref: Build<43>-Footnote-133930757 +Ref: Build<43>-Footnote-143930823 +Ref: Build<43>-Footnote-153930889 +Ref: Build<43>-Footnote-163930955 +Ref: Build<43>-Footnote-173931021 +Ref: Build<43>-Footnote-183931087 +Ref: Build<43>-Footnote-193931153 +Ref: Build<43>-Footnote-203931219 +Ref: Build<43>-Footnote-213931285 +Ref: Build<43>-Footnote-223931351 +Ref: Build<43>-Footnote-233931417 +Ref: Build<43>-Footnote-243931483 +Ref: Build<43>-Footnote-253931549 +Ref: Build<43>-Footnote-263931615 +Ref: Build<43>-Footnote-273931681 +Ref: Build<43>-Footnote-283931747 +Ref: Build<43>-Footnote-293931813 +Ref: Build<43>-Footnote-303931879 +Ref: Build<43>-Footnote-313931945 +Ref: Build<43>-Footnote-323932011 +Ref: Build<43>-Footnote-333932077 +Ref: Build<43>-Footnote-343932143 +Ref: Build<43>-Footnote-353932209 +Ref: Build<43>-Footnote-363932275 +Ref: Build<43>-Footnote-373932341 +Node: Windows<40>3932407 +Ref: whatsnew/changelog id3873932510 +Ref: 15023932510 +Ref: Windows<40>-Footnote-13934996 +Ref: Windows<40>-Footnote-23935061 +Ref: Windows<40>-Footnote-33935126 +Ref: Windows<40>-Footnote-43935191 +Ref: Windows<40>-Footnote-53935256 +Ref: Windows<40>-Footnote-63935321 +Ref: Windows<40>-Footnote-73935386 +Ref: Windows<40>-Footnote-83935451 +Ref: Windows<40>-Footnote-93935516 +Ref: Windows<40>-Footnote-103935581 +Ref: Windows<40>-Footnote-113935647 +Ref: Windows<40>-Footnote-123935713 +Ref: Windows<40>-Footnote-133935779 +Ref: Windows<40>-Footnote-143935845 +Ref: Windows<40>-Footnote-153935911 +Ref: Windows<40>-Footnote-163935977 +Ref: Windows<40>-Footnote-173936043 +Ref: Windows<40>-Footnote-183936109 +Ref: Windows<40>-Footnote-193936175 +Ref: Windows<40>-Footnote-203936241 +Ref: Windows<40>-Footnote-213936307 +Ref: Windows<40>-Footnote-223936373 +Ref: Windows<40>-Footnote-233936439 +Ref: Windows<40>-Footnote-243936505 +Ref: Windows<40>-Footnote-253936571 +Node: IDLE<33>3936637 +Ref: whatsnew/changelog id3883936746 +Ref: 15033936746 +Ref: IDLE<33>-Footnote-13946763 +Ref: IDLE<33>-Footnote-23946828 +Ref: IDLE<33>-Footnote-33946893 +Ref: IDLE<33>-Footnote-43946958 +Ref: IDLE<33>-Footnote-53947023 +Ref: IDLE<33>-Footnote-63947088 +Ref: IDLE<33>-Footnote-73947153 +Ref: IDLE<33>-Footnote-83947218 +Ref: IDLE<33>-Footnote-93947283 +Ref: IDLE<33>-Footnote-103947348 +Ref: IDLE<33>-Footnote-113947414 +Ref: IDLE<33>-Footnote-123947480 +Ref: IDLE<33>-Footnote-133947546 +Ref: IDLE<33>-Footnote-143947612 +Ref: IDLE<33>-Footnote-153947678 +Ref: IDLE<33>-Footnote-163947744 +Ref: IDLE<33>-Footnote-173947810 +Ref: IDLE<33>-Footnote-183947876 +Ref: IDLE<33>-Footnote-193947942 +Ref: IDLE<33>-Footnote-203948008 +Ref: IDLE<33>-Footnote-213948074 +Ref: IDLE<33>-Footnote-223948140 +Ref: IDLE<33>-Footnote-233948206 +Ref: IDLE<33>-Footnote-243948272 +Ref: IDLE<33>-Footnote-253948338 +Ref: IDLE<33>-Footnote-263948404 +Ref: IDLE<33>-Footnote-273948470 +Ref: IDLE<33>-Footnote-283948536 +Ref: IDLE<33>-Footnote-293948602 +Ref: IDLE<33>-Footnote-303948668 +Ref: IDLE<33>-Footnote-313948734 +Ref: IDLE<33>-Footnote-323948800 +Ref: IDLE<33>-Footnote-333948866 +Ref: IDLE<33>-Footnote-343948932 +Ref: IDLE<33>-Footnote-353948997 +Ref: IDLE<33>-Footnote-363949063 +Ref: IDLE<33>-Footnote-373949129 +Ref: IDLE<33>-Footnote-383949195 +Ref: IDLE<33>-Footnote-393949261 +Ref: IDLE<33>-Footnote-403949327 +Ref: IDLE<33>-Footnote-413949393 +Ref: IDLE<33>-Footnote-423949459 +Ref: IDLE<33>-Footnote-433949525 +Ref: IDLE<33>-Footnote-443949590 +Ref: IDLE<33>-Footnote-453949656 +Ref: IDLE<33>-Footnote-463949722 +Ref: IDLE<33>-Footnote-473949788 +Ref: IDLE<33>-Footnote-483949854 +Ref: IDLE<33>-Footnote-493949920 +Ref: IDLE<33>-Footnote-503949986 +Ref: IDLE<33>-Footnote-513950052 +Node: Tools/Demos<20>3950118 +Ref: whatsnew/changelog id3893950225 +Ref: 15043950225 +Ref: Tools/Demos<20>-Footnote-13951724 +Ref: Tools/Demos<20>-Footnote-23951789 +Ref: Tools/Demos<20>-Footnote-33951831 +Ref: Tools/Demos<20>-Footnote-43951896 +Ref: Tools/Demos<20>-Footnote-53951961 +Ref: Tools/Demos<20>-Footnote-63952026 +Ref: Tools/Demos<20>-Footnote-73952091 +Ref: Tools/Demos<20>-Footnote-83952156 +Node: C API<38>3952221 +Ref: whatsnew/changelog id3903952311 +Ref: 15053952311 +Ref: C API<38>-Footnote-13955375 +Ref: C API<38>-Footnote-23955440 +Ref: C API<38>-Footnote-33955505 +Ref: C API<38>-Footnote-43955570 +Ref: C API<38>-Footnote-53955635 +Ref: C API<38>-Footnote-63955699 +Ref: C API<38>-Footnote-73955764 +Ref: C API<38>-Footnote-83955829 +Ref: C API<38>-Footnote-93955894 +Ref: C API<38>-Footnote-103955959 +Ref: C API<38>-Footnote-113956025 +Ref: C API<38>-Footnote-123956091 +Ref: C API<38>-Footnote-133956157 +Ref: C API<38>-Footnote-143956223 +Ref: C API<38>-Footnote-153956289 +Node: Python 3 6 6 final3956355 +Ref: whatsnew/changelog python-3-6-6-final3956489 +Ref: 15063956489 +Node: Python 3 6 6 release candidate 13956617 +Ref: whatsnew/changelog python-3-6-6-release-candidate-13956749 +Ref: 15073956749 +Node: Core and Builtins<46>3957128 +Ref: whatsnew/changelog id3913957238 +Ref: 15083957238 +Ref: Core and Builtins<46>-Footnote-13958826 +Ref: Core and Builtins<46>-Footnote-23958891 +Ref: Core and Builtins<46>-Footnote-33958956 +Ref: Core and Builtins<46>-Footnote-43959021 +Ref: Core and Builtins<46>-Footnote-53959086 +Ref: Core and Builtins<46>-Footnote-63959151 +Ref: Core and Builtins<46>-Footnote-73959216 +Ref: Core and Builtins<46>-Footnote-83959281 +Ref: Core and Builtins<46>-Footnote-93959346 +Ref: Core and Builtins<46>-Footnote-103959411 +Ref: Core and Builtins<46>-Footnote-113959477 +Ref: Core and Builtins<46>-Footnote-123959543 +Node: Library<46>3959609 +Ref: whatsnew/changelog id3923959745 +Ref: 15093959745 +Ref: Library<46>-Footnote-13965227 +Ref: Library<46>-Footnote-23965292 +Ref: Library<46>-Footnote-33965357 +Ref: Library<46>-Footnote-43965422 +Ref: Library<46>-Footnote-53965487 +Ref: Library<46>-Footnote-63965552 +Ref: Library<46>-Footnote-73965617 +Ref: Library<46>-Footnote-83965682 +Ref: Library<46>-Footnote-93965747 +Ref: Library<46>-Footnote-103965812 +Ref: Library<46>-Footnote-113965878 +Ref: Library<46>-Footnote-123965944 +Ref: Library<46>-Footnote-133966010 +Ref: Library<46>-Footnote-143966076 +Ref: Library<46>-Footnote-153966142 +Ref: Library<46>-Footnote-163966208 +Ref: Library<46>-Footnote-173966274 +Ref: Library<46>-Footnote-183966340 +Ref: Library<46>-Footnote-193966406 +Ref: Library<46>-Footnote-203966472 +Ref: Library<46>-Footnote-213966538 +Ref: Library<46>-Footnote-223966605 +Ref: Library<46>-Footnote-233966671 +Ref: Library<46>-Footnote-243966737 +Ref: Library<46>-Footnote-253966803 +Ref: Library<46>-Footnote-263966869 +Ref: Library<46>-Footnote-273966935 +Ref: Library<46>-Footnote-283967001 +Ref: Library<46>-Footnote-293967044 +Ref: Library<46>-Footnote-303967110 +Ref: Library<46>-Footnote-313967176 +Ref: Library<46>-Footnote-323967242 +Ref: Library<46>-Footnote-333967308 +Ref: Library<46>-Footnote-343967374 +Ref: Library<46>-Footnote-353967440 +Ref: Library<46>-Footnote-363967506 +Ref: Library<46>-Footnote-373967572 +Ref: Library<46>-Footnote-383967638 +Ref: Library<46>-Footnote-393967704 +Node: Documentation<45>3967770 +Ref: whatsnew/changelog id3933967894 +Ref: 150a3967894 +Ref: Documentation<45>-Footnote-13969385 +Ref: Documentation<45>-Footnote-23969450 +Ref: Documentation<45>-Footnote-33969515 +Ref: Documentation<45>-Footnote-43969580 +Ref: Documentation<45>-Footnote-53969645 +Ref: Documentation<45>-Footnote-63969710 +Ref: Documentation<45>-Footnote-73969775 +Ref: Documentation<45>-Footnote-83969840 +Ref: Documentation<45>-Footnote-93969905 +Ref: Documentation<45>-Footnote-103969970 +Ref: Documentation<45>-Footnote-113970036 +Ref: Documentation<45>-Footnote-123970102 +Ref: Documentation<45>-Footnote-133970167 +Node: Tests<42>3970233 +Ref: whatsnew/changelog id3943970355 +Ref: 150b3970355 +Ref: Tests<42>-Footnote-13970577 +Ref: Tests<42>-Footnote-23970642 +Node: Build<44>3970707 +Ref: whatsnew/changelog id3953970823 +Ref: 150c3970823 +Ref: Build<44>-Footnote-13971620 +Ref: Build<44>-Footnote-23971684 +Ref: Build<44>-Footnote-33971749 +Ref: Build<44>-Footnote-43971814 +Ref: Build<44>-Footnote-53971879 +Node: Windows<41>3971944 +Ref: whatsnew/changelog id3963972060 +Ref: 150d3972060 +Ref: Windows<41>-Footnote-13972197 +Node: macOS<30>3972262 +Ref: whatsnew/changelog id3973972377 +Ref: 150e3972377 +Ref: macOS<30>-Footnote-13972518 +Node: IDLE<34>3972583 +Ref: whatsnew/changelog id3983972702 +Ref: 150f3972702 +Ref: IDLE<34>-Footnote-13974771 +Ref: IDLE<34>-Footnote-23974836 +Ref: IDLE<34>-Footnote-33974901 +Ref: IDLE<34>-Footnote-43974966 +Ref: IDLE<34>-Footnote-53975031 +Ref: IDLE<34>-Footnote-63975096 +Ref: IDLE<34>-Footnote-73975161 +Ref: IDLE<34>-Footnote-83975226 +Ref: IDLE<34>-Footnote-93975291 +Ref: IDLE<34>-Footnote-103975356 +Ref: IDLE<34>-Footnote-113975422 +Ref: IDLE<34>-Footnote-123975488 +Node: Tools/Demos<21>3975554 +Ref: whatsnew/changelog id3993975673 +Ref: 15103975673 +Ref: Tools/Demos<21>-Footnote-13976428 +Ref: Tools/Demos<21>-Footnote-23976493 +Ref: Tools/Demos<21>-Footnote-33976558 +Ref: Tools/Demos<21>-Footnote-43976623 +Ref: Tools/Demos<21>-Footnote-53976688 +Node: C API<39>3976753 +Ref: whatsnew/changelog id4003976855 +Ref: 15113976855 +Ref: C API<39>-Footnote-13977068 +Node: Python 3 6 5 final3977133 +Ref: whatsnew/changelog python-3-6-5-final3977279 +Ref: 15123977279 +Node: Tests<43>3977412 +Ref: whatsnew/changelog id4013977494 +Ref: 15133977494 +Ref: Tests<43>-Footnote-13977648 +Node: Build<45>3977713 +Ref: whatsnew/changelog id4023977795 +Ref: 15143977795 +Ref: Build<45>-Footnote-13977932 +Node: Python 3 6 5 release candidate 13977997 +Ref: whatsnew/changelog python-3-6-5-release-candidate-13978129 +Ref: 15153978129 +Node: Security<26>3978534 +Ref: whatsnew/changelog id4033978645 +Ref: 15163978645 +Ref: Security<26>-Footnote-13979070 +Ref: Security<26>-Footnote-23979135 +Node: Core and Builtins<47>3979200 +Ref: whatsnew/changelog id4043979331 +Ref: 15173979331 +Ref: Core and Builtins<47>-Footnote-13981505 +Ref: Core and Builtins<47>-Footnote-23981570 +Ref: Core and Builtins<47>-Footnote-33981635 +Ref: Core and Builtins<47>-Footnote-43981700 +Ref: Core and Builtins<47>-Footnote-53981765 +Ref: Core and Builtins<47>-Footnote-63981830 +Ref: Core and Builtins<47>-Footnote-73981895 +Ref: Core and Builtins<47>-Footnote-83981960 +Ref: Core and Builtins<47>-Footnote-93982025 +Ref: Core and Builtins<47>-Footnote-103982090 +Ref: Core and Builtins<47>-Footnote-113982156 +Ref: Core and Builtins<47>-Footnote-123982222 +Ref: Core and Builtins<47>-Footnote-133982288 +Ref: Core and Builtins<47>-Footnote-143982354 +Node: Library<47>3982420 +Ref: whatsnew/changelog id4053982556 +Ref: 15183982556 +Ref: Library<47>-Footnote-13988494 +Ref: Library<47>-Footnote-23988559 +Ref: Library<47>-Footnote-33988624 +Ref: Library<47>-Footnote-43988689 +Ref: Library<47>-Footnote-53988754 +Ref: Library<47>-Footnote-63988819 +Ref: Library<47>-Footnote-73988884 +Ref: Library<47>-Footnote-83988949 +Ref: Library<47>-Footnote-93989014 +Ref: Library<47>-Footnote-103989079 +Ref: Library<47>-Footnote-113989145 +Ref: Library<47>-Footnote-123989211 +Ref: Library<47>-Footnote-133989277 +Ref: Library<47>-Footnote-143989343 +Ref: Library<47>-Footnote-153989409 +Ref: Library<47>-Footnote-163989475 +Ref: Library<47>-Footnote-173989541 +Ref: Library<47>-Footnote-183989607 +Ref: Library<47>-Footnote-193989673 +Ref: Library<47>-Footnote-203989739 +Ref: Library<47>-Footnote-213989805 +Ref: Library<47>-Footnote-223989871 +Ref: Library<47>-Footnote-233989937 +Ref: Library<47>-Footnote-243990003 +Ref: Library<47>-Footnote-253990069 +Ref: Library<47>-Footnote-263990135 +Ref: Library<47>-Footnote-273990201 +Ref: Library<47>-Footnote-283990267 +Ref: Library<47>-Footnote-293990333 +Ref: Library<47>-Footnote-303990399 +Ref: Library<47>-Footnote-313990465 +Ref: Library<47>-Footnote-323990531 +Ref: Library<47>-Footnote-333990597 +Ref: Library<47>-Footnote-343990663 +Ref: Library<47>-Footnote-353990729 +Ref: Library<47>-Footnote-363990795 +Ref: Library<47>-Footnote-373990861 +Ref: Library<47>-Footnote-383990927 +Ref: Library<47>-Footnote-393990993 +Ref: Library<47>-Footnote-403991059 +Node: Documentation<46>3991125 +Ref: whatsnew/changelog id4063991249 +Ref: 15193991249 +Ref: Documentation<46>-Footnote-13992096 +Ref: Documentation<46>-Footnote-23992161 +Ref: Documentation<46>-Footnote-33992226 +Ref: Documentation<46>-Footnote-43992290 +Ref: Documentation<46>-Footnote-53992355 +Ref: Documentation<46>-Footnote-63992420 +Node: Tests<44>3992485 +Ref: whatsnew/changelog id4073992607 +Ref: 151a3992607 +Ref: Tests<44>-Footnote-13993268 +Ref: Tests<44>-Footnote-23993333 +Ref: Tests<44>-Footnote-33993398 +Ref: Tests<44>-Footnote-43993463 +Node: Build<46>3993528 +Ref: whatsnew/changelog id4083993644 +Ref: 151b3993644 +Ref: Build<46>-Footnote-13993833 +Node: Windows<42>3993898 +Ref: whatsnew/changelog id4093994014 +Ref: 151c3994014 +Ref: Windows<42>-Footnote-13994964 +Ref: Windows<42>-Footnote-23995029 +Ref: Windows<42>-Footnote-33995094 +Ref: Windows<42>-Footnote-43995159 +Ref: Windows<42>-Footnote-53995224 +Ref: Windows<42>-Footnote-63995289 +Ref: Windows<42>-Footnote-73995354 +Ref: Windows<42>-Footnote-83995419 +Node: macOS<31>3995484 +Ref: whatsnew/changelog id4103995599 +Ref: 151d3995599 +Ref: macOS<31>-Footnote-13995992 +Node: IDLE<35>3996057 +Ref: whatsnew/changelog id4113996176 +Ref: 151e3996176 +Ref: IDLE<35>-Footnote-13997670 +Ref: IDLE<35>-Footnote-23997735 +Ref: IDLE<35>-Footnote-33997800 +Ref: IDLE<35>-Footnote-43997865 +Ref: IDLE<35>-Footnote-53997930 +Ref: IDLE<35>-Footnote-63997995 +Ref: IDLE<35>-Footnote-73998060 +Ref: IDLE<35>-Footnote-83998125 +Node: Tools/Demos<22>3998190 +Ref: whatsnew/changelog id4123998309 +Ref: 151f3998309 +Ref: Tools/Demos<22>-Footnote-13998729 +Ref: Tools/Demos<22>-Footnote-23998794 +Node: C API<40>3998859 +Ref: whatsnew/changelog id4133998961 +Ref: 15203998961 +Ref: C API<40>-Footnote-13999211 +Node: Python 3 6 4 final3999276 +Ref: whatsnew/changelog python-3-6-4-final3999422 +Ref: 15213999422 +Node: Python 3 6 4 release candidate 13999571 +Ref: whatsnew/changelog python-3-6-4-release-candidate-13999703 +Ref: 15223999703 +Node: Core and Builtins<48>4000082 +Ref: whatsnew/changelog id4144000192 +Ref: 15234000192 +Ref: Core and Builtins<48>-Footnote-14004943 +Ref: Core and Builtins<48>-Footnote-24005008 +Ref: Core and Builtins<48>-Footnote-34005073 +Ref: Core and Builtins<48>-Footnote-44005138 +Ref: Core and Builtins<48>-Footnote-54005203 +Ref: Core and Builtins<48>-Footnote-64005268 +Ref: Core and Builtins<48>-Footnote-74005333 +Ref: Core and Builtins<48>-Footnote-84005398 +Ref: Core and Builtins<48>-Footnote-94005463 +Ref: Core and Builtins<48>-Footnote-104005528 +Ref: Core and Builtins<48>-Footnote-114005594 +Ref: Core and Builtins<48>-Footnote-124005660 +Ref: Core and Builtins<48>-Footnote-134005726 +Ref: Core and Builtins<48>-Footnote-144005792 +Ref: Core and Builtins<48>-Footnote-154005858 +Ref: Core and Builtins<48>-Footnote-164005924 +Ref: Core and Builtins<48>-Footnote-174005990 +Ref: Core and Builtins<48>-Footnote-184006056 +Ref: Core and Builtins<48>-Footnote-194006122 +Ref: Core and Builtins<48>-Footnote-204006188 +Ref: Core and Builtins<48>-Footnote-214006254 +Ref: Core and Builtins<48>-Footnote-224006320 +Ref: Core and Builtins<48>-Footnote-234006386 +Ref: Core and Builtins<48>-Footnote-244006452 +Node: Library<48>4006518 +Ref: whatsnew/changelog id4154006654 +Ref: 15244006654 +Ref: Library<48>-Footnote-14013992 +Ref: Library<48>-Footnote-24014057 +Ref: Library<48>-Footnote-34014122 +Ref: Library<48>-Footnote-44014187 +Ref: Library<48>-Footnote-54014252 +Ref: Library<48>-Footnote-64014317 +Ref: Library<48>-Footnote-74014382 +Ref: Library<48>-Footnote-84014447 +Ref: Library<48>-Footnote-94014512 +Ref: Library<48>-Footnote-104014577 +Ref: Library<48>-Footnote-114014643 +Ref: Library<48>-Footnote-124014709 +Ref: Library<48>-Footnote-134014775 +Ref: Library<48>-Footnote-144014841 +Ref: Library<48>-Footnote-154014907 +Ref: Library<48>-Footnote-164014973 +Ref: Library<48>-Footnote-174015038 +Ref: Library<48>-Footnote-184015104 +Ref: Library<48>-Footnote-194015170 +Ref: Library<48>-Footnote-204015236 +Ref: Library<48>-Footnote-214015302 +Ref: Library<48>-Footnote-224015368 +Ref: Library<48>-Footnote-234015434 +Ref: Library<48>-Footnote-244015500 +Ref: Library<48>-Footnote-254015566 +Ref: Library<48>-Footnote-264015632 +Ref: Library<48>-Footnote-274015698 +Ref: Library<48>-Footnote-284015764 +Ref: Library<48>-Footnote-294015830 +Ref: Library<48>-Footnote-304015896 +Ref: Library<48>-Footnote-314015962 +Ref: Library<48>-Footnote-324016028 +Ref: Library<48>-Footnote-334016094 +Ref: Library<48>-Footnote-344016160 +Ref: Library<48>-Footnote-354016226 +Ref: Library<48>-Footnote-364016292 +Ref: Library<48>-Footnote-374016358 +Ref: Library<48>-Footnote-384016424 +Ref: Library<48>-Footnote-394016490 +Ref: Library<48>-Footnote-404016556 +Ref: Library<48>-Footnote-414016622 +Ref: Library<48>-Footnote-424016688 +Ref: Library<48>-Footnote-434016754 +Ref: Library<48>-Footnote-444016820 +Ref: Library<48>-Footnote-454016886 +Ref: Library<48>-Footnote-464016952 +Ref: Library<48>-Footnote-474017018 +Ref: Library<48>-Footnote-484017084 +Ref: Library<48>-Footnote-494017150 +Ref: Library<48>-Footnote-504017216 +Ref: Library<48>-Footnote-514017282 +Ref: Library<48>-Footnote-524017348 +Node: Documentation<47>4017414 +Ref: whatsnew/changelog id4164017538 +Ref: 15254017538 +Ref: Documentation<47>-Footnote-14018027 +Ref: Documentation<47>-Footnote-24018092 +Ref: Documentation<47>-Footnote-34018157 +Node: Tests<45>4018222 +Ref: whatsnew/changelog id4174018344 +Ref: 15264018344 +Ref: Tests<45>-Footnote-14019016 +Ref: Tests<45>-Footnote-24019081 +Ref: Tests<45>-Footnote-34019146 +Ref: Tests<45>-Footnote-44019211 +Node: Build<47>4019276 +Ref: whatsnew/changelog id4184019392 +Ref: 15274019392 +Ref: Build<47>-Footnote-14020296 +Ref: Build<47>-Footnote-24020361 +Ref: Build<47>-Footnote-34020426 +Ref: Build<47>-Footnote-44020491 +Ref: Build<47>-Footnote-54020556 +Ref: Build<47>-Footnote-64020621 +Ref: Build<47>-Footnote-74020686 +Ref: Build<47>-Footnote-84020751 +Ref: Build<47>-Footnote-94020816 +Node: Windows<43>4020881 +Ref: whatsnew/changelog id4194020997 +Ref: 15284020997 +Ref: Windows<43>-Footnote-14021315 +Ref: Windows<43>-Footnote-24021379 +Node: macOS<32>4021444 +Ref: whatsnew/changelog id4204021559 +Ref: 15294021559 +Ref: macOS<32>-Footnote-14021693 +Node: IDLE<36>4021758 +Ref: whatsnew/changelog id4214021877 +Ref: 152a4021877 +Ref: IDLE<36>-Footnote-14025214 +Ref: IDLE<36>-Footnote-24025279 +Ref: IDLE<36>-Footnote-34025344 +Ref: IDLE<36>-Footnote-44025409 +Ref: IDLE<36>-Footnote-54025474 +Ref: IDLE<36>-Footnote-64025539 +Ref: IDLE<36>-Footnote-74025604 +Ref: IDLE<36>-Footnote-84025669 +Ref: IDLE<36>-Footnote-94025734 +Ref: IDLE<36>-Footnote-104025799 +Ref: IDLE<36>-Footnote-114025865 +Ref: IDLE<36>-Footnote-124025931 +Ref: IDLE<36>-Footnote-134025997 +Ref: IDLE<36>-Footnote-144026063 +Node: Tools/Demos<23>4026131 +Ref: whatsnew/changelog id4224026250 +Ref: 152b4026250 +Ref: Tools/Demos<23>-Footnote-14026540 +Node: C API<41>4026605 +Ref: whatsnew/changelog id4234026707 +Ref: 152c4026707 +Ref: C API<41>-Footnote-14027435 +Ref: C API<41>-Footnote-24027500 +Ref: C API<41>-Footnote-34027565 +Ref: C API<41>-Footnote-44027630 +Node: Python 3 6 3 final4027695 +Ref: whatsnew/changelog python-3-6-3-final4027841 +Ref: 152d4027841 +Node: Library<49>4027978 +Ref: whatsnew/changelog id4244028062 +Ref: 152e4028062 +Ref: Library<49>-Footnote-14028275 +Node: Build<48>4028340 +Ref: whatsnew/changelog id4254028424 +Ref: 15304028424 +Ref: Build<48>-Footnote-14028715 +Ref: Build<48>-Footnote-24028780 +Node: Python 3 6 3 release candidate 14028845 +Ref: whatsnew/changelog python-3-6-3-release-candidate-14028977 +Ref: 15314028977 +Node: Security<27>4029342 +Ref: whatsnew/changelog id4264029453 +Ref: 15324029453 +Ref: Security<27>-Footnote-14029759 +Ref: Security<27>-Footnote-24029824 +Node: Core and Builtins<49>4029889 +Ref: whatsnew/changelog id4274030020 +Ref: 15334030020 +Ref: Core and Builtins<49>-Footnote-14033567 +Ref: Core and Builtins<49>-Footnote-24033632 +Ref: Core and Builtins<49>-Footnote-34033697 +Ref: Core and Builtins<49>-Footnote-44033762 +Ref: Core and Builtins<49>-Footnote-54033827 +Ref: Core and Builtins<49>-Footnote-64033892 +Ref: Core and Builtins<49>-Footnote-74033957 +Ref: Core and Builtins<49>-Footnote-84034022 +Ref: Core and Builtins<49>-Footnote-94034087 +Ref: Core and Builtins<49>-Footnote-104034152 +Ref: Core and Builtins<49>-Footnote-114034218 +Ref: Core and Builtins<49>-Footnote-124034284 +Ref: Core and Builtins<49>-Footnote-134034350 +Ref: Core and Builtins<49>-Footnote-144034416 +Ref: Core and Builtins<49>-Footnote-154034482 +Ref: Core and Builtins<49>-Footnote-164034548 +Ref: Core and Builtins<49>-Footnote-174034614 +Ref: Core and Builtins<49>-Footnote-184034680 +Ref: Core and Builtins<49>-Footnote-194034746 +Ref: Core and Builtins<49>-Footnote-204034812 +Ref: Core and Builtins<49>-Footnote-214034878 +Ref: Core and Builtins<49>-Footnote-224034944 +Node: Library<50>4035010 +Ref: whatsnew/changelog id4284035146 +Ref: 15344035146 +Ref: Library<50>-Footnote-14041148 +Ref: Library<50>-Footnote-24041213 +Ref: Library<50>-Footnote-34041278 +Ref: Library<50>-Footnote-44041343 +Ref: Library<50>-Footnote-54041408 +Ref: Library<50>-Footnote-64041473 +Ref: Library<50>-Footnote-74041538 +Ref: Library<50>-Footnote-84041603 +Ref: Library<50>-Footnote-94041668 +Ref: Library<50>-Footnote-104041733 +Ref: Library<50>-Footnote-114041799 +Ref: Library<50>-Footnote-124041865 +Ref: Library<50>-Footnote-134041931 +Ref: Library<50>-Footnote-144041997 +Ref: Library<50>-Footnote-154042063 +Ref: Library<50>-Footnote-164042128 +Ref: Library<50>-Footnote-174042194 +Ref: Library<50>-Footnote-184042260 +Ref: Library<50>-Footnote-194042303 +Ref: Library<50>-Footnote-204042369 +Ref: Library<50>-Footnote-214042435 +Ref: Library<50>-Footnote-224042501 +Ref: Library<50>-Footnote-234042567 +Ref: Library<50>-Footnote-244042633 +Ref: Library<50>-Footnote-254042699 +Ref: Library<50>-Footnote-264042765 +Ref: Library<50>-Footnote-274042831 +Ref: Library<50>-Footnote-284042897 +Ref: Library<50>-Footnote-294042963 +Ref: Library<50>-Footnote-304043029 +Ref: Library<50>-Footnote-314043095 +Ref: Library<50>-Footnote-324043161 +Ref: Library<50>-Footnote-334043227 +Ref: Library<50>-Footnote-344043293 +Ref: Library<50>-Footnote-354043359 +Ref: Library<50>-Footnote-364043425 +Ref: Library<50>-Footnote-374043491 +Ref: Library<50>-Footnote-384043557 +Ref: Library<50>-Footnote-394043623 +Ref: Library<50>-Footnote-404043689 +Ref: Library<50>-Footnote-414043755 +Ref: Library<50>-Footnote-424043821 +Node: Documentation<48>4043887 +Ref: whatsnew/changelog id4294044011 +Ref: 15354044011 +Ref: Documentation<48>-Footnote-14044434 +Ref: Documentation<48>-Footnote-24044499 +Ref: Documentation<48>-Footnote-34044564 +Node: Tests<46>4044629 +Ref: whatsnew/changelog id4304044751 +Ref: 15364044751 +Ref: Tests<46>-Footnote-14045456 +Ref: Tests<46>-Footnote-24045521 +Ref: Tests<46>-Footnote-34045586 +Ref: Tests<46>-Footnote-44045651 +Node: Build<49>4045716 +Ref: whatsnew/changelog id4314045832 +Ref: 15374045832 +Ref: Build<49>-Footnote-14046007 +Node: Windows<44>4046072 +Ref: whatsnew/changelog id4324046187 +Ref: 15384046187 +Ref: Windows<44>-Footnote-14046695 +Ref: Windows<44>-Footnote-24046760 +Ref: Windows<44>-Footnote-34046825 +Ref: Windows<44>-Footnote-44046890 +Node: IDLE<37>4046955 +Ref: whatsnew/changelog id4334047076 +Ref: 15394047076 +Ref: IDLE<37>-Footnote-14055925 +Ref: IDLE<37>-Footnote-24055990 +Ref: IDLE<37>-Footnote-34056055 +Ref: IDLE<37>-Footnote-44056120 +Ref: IDLE<37>-Footnote-54056185 +Ref: IDLE<37>-Footnote-64056250 +Ref: IDLE<37>-Footnote-74056315 +Ref: IDLE<37>-Footnote-84056380 +Ref: IDLE<37>-Footnote-94056445 +Ref: IDLE<37>-Footnote-104056510 +Ref: IDLE<37>-Footnote-114056576 +Ref: IDLE<37>-Footnote-124056642 +Ref: IDLE<37>-Footnote-134056708 +Ref: IDLE<37>-Footnote-144056774 +Ref: IDLE<37>-Footnote-154056840 +Ref: IDLE<37>-Footnote-164056906 +Ref: IDLE<37>-Footnote-174056972 +Ref: IDLE<37>-Footnote-184057038 +Ref: IDLE<37>-Footnote-194057104 +Ref: IDLE<37>-Footnote-204057170 +Ref: IDLE<37>-Footnote-214057236 +Ref: IDLE<37>-Footnote-224057302 +Ref: IDLE<37>-Footnote-234057368 +Ref: IDLE<37>-Footnote-244057434 +Ref: IDLE<37>-Footnote-254057500 +Ref: IDLE<37>-Footnote-264057566 +Ref: IDLE<37>-Footnote-274057632 +Ref: IDLE<37>-Footnote-284057698 +Ref: IDLE<37>-Footnote-294057764 +Ref: IDLE<37>-Footnote-304057830 +Ref: IDLE<37>-Footnote-314057896 +Ref: IDLE<37>-Footnote-324057962 +Ref: IDLE<37>-Footnote-334058028 +Ref: IDLE<37>-Footnote-344058094 +Ref: IDLE<37>-Footnote-354058159 +Ref: IDLE<37>-Footnote-364058225 +Ref: IDLE<37>-Footnote-374058291 +Ref: IDLE<37>-Footnote-384058357 +Ref: IDLE<37>-Footnote-394058423 +Ref: IDLE<37>-Footnote-404058489 +Ref: IDLE<37>-Footnote-414058555 +Ref: IDLE<37>-Footnote-424058621 +Ref: IDLE<37>-Footnote-434058687 +Node: Tools/Demos<24>4058752 +Ref: whatsnew/changelog id4344058853 +Ref: 153a4058853 +Ref: Tools/Demos<24>-Footnote-14059415 +Ref: Tools/Demos<24>-Footnote-24059480 +Node: Python 3 6 2 final4059522 +Ref: whatsnew/changelog python-3-6-2-final4059668 +Ref: 153b4059668 +Node: Python 3 6 2 release candidate 24059789 +Ref: whatsnew/changelog python-3-6-2-release-candidate-24059935 +Ref: 153c4059935 +Node: Security<28>4060082 +Ref: whatsnew/changelog id4354060163 +Ref: 153d4060163 +Ref: Security<28>-Footnote-14061270 +Ref: Security<28>-Footnote-24061335 +Ref: Security<28>-Footnote-34061400 +Node: Python 3 6 2 release candidate 14061465 +Ref: whatsnew/changelog python-3-6-2-release-candidate-14061611 +Ref: 153e4061611 +Node: Security<29>4061996 +Ref: whatsnew/changelog id4364062107 +Ref: 153f4062107 +Ref: Security<29>-Footnote-14062374 +Node: Core and Builtins<50>4062439 +Ref: whatsnew/changelog id4374062570 +Ref: 15404062570 +Ref: Core and Builtins<50>-Footnote-14064571 +Ref: Core and Builtins<50>-Footnote-24064636 +Ref: Core and Builtins<50>-Footnote-34064701 +Ref: Core and Builtins<50>-Footnote-44064766 +Ref: Core and Builtins<50>-Footnote-54064831 +Ref: Core and Builtins<50>-Footnote-64064896 +Ref: Core and Builtins<50>-Footnote-74064961 +Ref: Core and Builtins<50>-Footnote-84065026 +Ref: Core and Builtins<50>-Footnote-94065091 +Ref: Core and Builtins<50>-Footnote-104065156 +Ref: Core and Builtins<50>-Footnote-114065222 +Ref: Core and Builtins<50>-Footnote-124065288 +Ref: Core and Builtins<50>-Footnote-134065354 +Ref: Core and Builtins<50>-Footnote-144065420 +Ref: Core and Builtins<50>-Footnote-154065486 +Node: Library<51>4065552 +Ref: whatsnew/changelog id4384065679 +Ref: 15414065679 +Ref: Library<51>-Footnote-14074109 +Ref: Library<51>-Footnote-24074174 +Ref: Library<51>-Footnote-34074239 +Ref: Library<51>-Footnote-44074304 +Ref: Library<51>-Footnote-54074369 +Ref: Library<51>-Footnote-64074434 +Ref: Library<51>-Footnote-74074499 +Ref: Library<51>-Footnote-84074564 +Ref: Library<51>-Footnote-94074629 +Ref: Library<51>-Footnote-104074694 +Ref: Library<51>-Footnote-114074760 +Ref: Library<51>-Footnote-124074826 +Ref: Library<51>-Footnote-134074892 +Ref: Library<51>-Footnote-144074958 +Ref: Library<51>-Footnote-154075024 +Ref: Library<51>-Footnote-164075090 +Ref: Library<51>-Footnote-174075156 +Ref: Library<51>-Footnote-184075222 +Ref: Library<51>-Footnote-194075288 +Ref: Library<51>-Footnote-204075354 +Ref: Library<51>-Footnote-214075420 +Ref: Library<51>-Footnote-224075486 +Ref: Library<51>-Footnote-234075552 +Ref: Library<51>-Footnote-244075618 +Ref: Library<51>-Footnote-254075684 +Ref: Library<51>-Footnote-264075750 +Ref: Library<51>-Footnote-274075816 +Ref: Library<51>-Footnote-284075882 +Ref: Library<51>-Footnote-294075948 +Ref: Library<51>-Footnote-304076014 +Ref: Library<51>-Footnote-314076080 +Ref: Library<51>-Footnote-324076146 +Ref: Library<51>-Footnote-334076212 +Ref: Library<51>-Footnote-344076278 +Ref: Library<51>-Footnote-354076344 +Ref: Library<51>-Footnote-364076410 +Ref: Library<51>-Footnote-374076476 +Ref: Library<51>-Footnote-384076542 +Ref: Library<51>-Footnote-394076608 +Ref: Library<51>-Footnote-404076674 +Ref: Library<51>-Footnote-414076740 +Ref: Library<51>-Footnote-424076806 +Ref: Library<51>-Footnote-434076872 +Ref: Library<51>-Footnote-444076938 +Ref: Library<51>-Footnote-454077004 +Ref: Library<51>-Footnote-464077070 +Ref: Library<51>-Footnote-474077136 +Ref: Library<51>-Footnote-484077202 +Ref: Library<51>-Footnote-494077268 +Ref: Library<51>-Footnote-504077334 +Ref: Library<51>-Footnote-514077400 +Ref: Library<51>-Footnote-524077466 +Ref: Library<51>-Footnote-534077532 +Ref: Library<51>-Footnote-544077598 +Ref: Library<51>-Footnote-554077664 +Ref: Library<51>-Footnote-564077729 +Ref: Library<51>-Footnote-574077795 +Ref: Library<51>-Footnote-584077861 +Ref: Library<51>-Footnote-594077927 +Ref: Library<51>-Footnote-604077993 +Node: IDLE<38>4078059 +Ref: whatsnew/changelog id4394078174 +Ref: 15424078174 +Ref: IDLE<38>-Footnote-14079179 +Ref: IDLE<38>-Footnote-24079244 +Ref: IDLE<38>-Footnote-34079309 +Ref: IDLE<38>-Footnote-44079374 +Ref: IDLE<38>-Footnote-54079439 +Ref: IDLE<38>-Footnote-64079504 +Node: C API<42>4079569 +Ref: whatsnew/changelog id4404079682 +Ref: 15434079682 +Ref: C API<42>-Footnote-14079870 +Node: Build<50>4079935 +Ref: whatsnew/changelog id4414080057 +Ref: 15444080057 +Ref: Build<50>-Footnote-14080866 +Ref: Build<50>-Footnote-24080931 +Ref: Build<50>-Footnote-34080996 +Ref: Build<50>-Footnote-44081061 +Ref: Build<50>-Footnote-54081126 +Node: Documentation<49>4081191 +Ref: whatsnew/changelog id4424081319 +Ref: 15454081319 +Ref: Documentation<49>-Footnote-14082048 +Ref: Documentation<49>-Footnote-24082113 +Ref: Documentation<49>-Footnote-34082178 +Node: Tools/Demos<25>4082243 +Ref: whatsnew/changelog id4434082371 +Ref: 15464082371 +Ref: Tools/Demos<25>-Footnote-14082561 +Node: Tests<47>4082626 +Ref: whatsnew/changelog id4444082748 +Ref: 15474082748 +Ref: Tests<47>-Footnote-14083409 +Ref: Tests<47>-Footnote-24083474 +Node: Windows<45>4083539 +Ref: whatsnew/changelog id4454083637 +Ref: 15484083637 +Ref: Windows<45>-Footnote-14084081 +Ref: Windows<45>-Footnote-24084146 +Node: Python 3 6 1 final4084211 +Ref: whatsnew/changelog python-3-6-1-final4084357 +Ref: 15494084357 +Node: Core and Builtins<51>4084514 +Ref: whatsnew/changelog id4464084608 +Ref: 154a4084608 +Ref: Core and Builtins<51>-Footnote-14085227 +Ref: Core and Builtins<51>-Footnote-24085292 +Node: Build<51>4085357 +Ref: whatsnew/changelog id4474085451 +Ref: 154b4085451 +Ref: Build<51>-Footnote-14085633 +Node: Python 3 6 1 release candidate 14085698 +Ref: whatsnew/changelog python-3-6-1-release-candidate-14085830 +Ref: 154c4085830 +Node: Core and Builtins<52>4086157 +Ref: whatsnew/changelog id4484086267 +Ref: 154d4086267 +Ref: Core and Builtins<52>-Footnote-14089099 +Ref: Core and Builtins<52>-Footnote-24089164 +Ref: Core and Builtins<52>-Footnote-34089229 +Ref: Core and Builtins<52>-Footnote-44089294 +Ref: Core and Builtins<52>-Footnote-54089359 +Ref: Core and Builtins<52>-Footnote-64089424 +Ref: Core and Builtins<52>-Footnote-74089489 +Ref: Core and Builtins<52>-Footnote-84089554 +Ref: Core and Builtins<52>-Footnote-94089619 +Ref: Core and Builtins<52>-Footnote-104089684 +Ref: Core and Builtins<52>-Footnote-114089750 +Ref: Core and Builtins<52>-Footnote-124089816 +Ref: Core and Builtins<52>-Footnote-134089882 +Ref: Core and Builtins<52>-Footnote-144089948 +Ref: Core and Builtins<52>-Footnote-154090014 +Ref: Core and Builtins<52>-Footnote-164090080 +Ref: Core and Builtins<52>-Footnote-174090146 +Ref: Core and Builtins<52>-Footnote-184090212 +Ref: Core and Builtins<52>-Footnote-194090278 +Ref: Core and Builtins<52>-Footnote-204090344 +Ref: Core and Builtins<52>-Footnote-214090410 +Ref: Core and Builtins<52>-Footnote-224090476 +Node: Library<52>4090542 +Ref: whatsnew/changelog id4494090669 +Ref: 154e4090669 +Ref: Library<52>-Footnote-14096316 +Ref: Library<52>-Footnote-24096381 +Ref: Library<52>-Footnote-34096446 +Ref: Library<52>-Footnote-44096511 +Ref: Library<52>-Footnote-54096576 +Ref: Library<52>-Footnote-64096641 +Ref: Library<52>-Footnote-74096706 +Ref: Library<52>-Footnote-84096771 +Ref: Library<52>-Footnote-94096836 +Ref: Library<52>-Footnote-104096901 +Ref: Library<52>-Footnote-114096967 +Ref: Library<52>-Footnote-124097033 +Ref: Library<52>-Footnote-134097099 +Ref: Library<52>-Footnote-144097165 +Ref: Library<52>-Footnote-154097231 +Ref: Library<52>-Footnote-164097297 +Ref: Library<52>-Footnote-174097363 +Ref: Library<52>-Footnote-184097429 +Ref: Library<52>-Footnote-194097495 +Ref: Library<52>-Footnote-204097561 +Ref: Library<52>-Footnote-214097627 +Ref: Library<52>-Footnote-224097693 +Ref: Library<52>-Footnote-234097759 +Ref: Library<52>-Footnote-244097825 +Ref: Library<52>-Footnote-254097891 +Ref: Library<52>-Footnote-264097957 +Ref: Library<52>-Footnote-274098023 +Ref: Library<52>-Footnote-284098066 +Ref: Library<52>-Footnote-294098132 +Ref: Library<52>-Footnote-304098198 +Ref: Library<52>-Footnote-314098264 +Ref: Library<52>-Footnote-324098330 +Ref: Library<52>-Footnote-334098396 +Ref: Library<52>-Footnote-344098462 +Ref: Library<52>-Footnote-354098528 +Ref: Library<52>-Footnote-364098593 +Ref: Library<52>-Footnote-374098659 +Ref: Library<52>-Footnote-384098725 +Ref: Library<52>-Footnote-394098791 +Ref: Library<52>-Footnote-404098857 +Ref: Library<52>-Footnote-414098923 +Ref: Library<52>-Footnote-424098989 +Ref: Library<52>-Footnote-434099055 +Ref: Library<52>-Footnote-444099121 +Node: IDLE<39>4099187 +Ref: whatsnew/changelog id4504099304 +Ref: 154f4099304 +Ref: IDLE<39>-Footnote-14099593 +Ref: IDLE<39>-Footnote-24099658 +Node: Windows<46>4099723 +Ref: whatsnew/changelog id4514099838 +Ref: 15504099838 +Ref: Windows<46>-Footnote-14100485 +Ref: Windows<46>-Footnote-24100550 +Ref: Windows<46>-Footnote-34100615 +Ref: Windows<46>-Footnote-44100680 +Ref: Windows<46>-Footnote-54100745 +Ref: Windows<46>-Footnote-64100787 +Ref: Windows<46>-Footnote-74100852 +Ref: Windows<46>-Footnote-84100917 +Node: C API<43>4100982 +Ref: whatsnew/changelog id4524101106 +Ref: 15514101106 +Ref: C API<43>-Footnote-14101932 +Ref: C API<43>-Footnote-24101997 +Ref: C API<43>-Footnote-34102062 +Node: Documentation<50>4102127 +Ref: whatsnew/changelog id4534102249 +Ref: 15524102249 +Ref: Documentation<50>-Footnote-14102786 +Ref: Documentation<50>-Footnote-24102851 +Ref: Documentation<50>-Footnote-34102916 +Ref: Documentation<50>-Footnote-44102981 +Node: Tests<48>4103046 +Ref: whatsnew/changelog id4544103168 +Ref: 15534103168 +Ref: Tests<48>-Footnote-14104153 +Ref: Tests<48>-Footnote-24104218 +Ref: Tests<48>-Footnote-34104283 +Ref: Tests<48>-Footnote-44104348 +Ref: Tests<48>-Footnote-54104413 +Node: Build<52>4104478 +Ref: whatsnew/changelog id4554104574 +Ref: 15544104574 +Ref: Build<52>-Footnote-14105835 +Ref: Build<52>-Footnote-24105900 +Ref: Build<52>-Footnote-34105965 +Ref: Build<52>-Footnote-44106030 +Ref: Build<52>-Footnote-54106095 +Ref: Build<52>-Footnote-64106160 +Ref: Build<52>-Footnote-74106225 +Ref: Build<52>-Footnote-84106290 +Ref: Build<52>-Footnote-94106355 +Ref: Build<52>-Footnote-104106420 +Node: Python 3 6 0 final4106486 +Ref: whatsnew/changelog python-3-6-0-final4106632 +Ref: 15554106632 +Node: Python 3 6 0 release candidate 24106753 +Ref: whatsnew/changelog python-3-6-0-release-candidate-24106899 +Ref: 15564106899 +Node: Core and Builtins<53>4107140 +Ref: whatsnew/changelog id4564107254 +Ref: 15574107254 +Ref: Core and Builtins<53>-Footnote-14107639 +Ref: Core and Builtins<53>-Footnote-24107704 +Node: Tools/Demos<26>4107769 +Ref: whatsnew/changelog id4574107903 +Ref: 15584107903 +Ref: Tools/Demos<26>-Footnote-14108037 +Node: Windows<47>4108102 +Ref: whatsnew/changelog id4584108224 +Ref: 15594108224 +Ref: Windows<47>-Footnote-14108350 +Node: Build<53>4108415 +Ref: whatsnew/changelog id4594108513 +Ref: 155a4108513 +Ref: Build<53>-Footnote-14108668 +Node: Python 3 6 0 release candidate 14108733 +Ref: whatsnew/changelog python-3-6-0-release-candidate-14108880 +Ref: 155b4108880 +Node: Core and Builtins<54>4109157 +Ref: whatsnew/changelog id4604109267 +Ref: 155c4109267 +Ref: Core and Builtins<54>-Footnote-14110076 +Ref: Core and Builtins<54>-Footnote-24110141 +Ref: Core and Builtins<54>-Footnote-34110206 +Ref: Core and Builtins<54>-Footnote-44110271 +Node: Library<53>4110336 +Ref: whatsnew/changelog id4614110464 +Ref: 155d4110464 +Ref: Library<53>-Footnote-14111503 +Ref: Library<53>-Footnote-24111568 +Ref: Library<53>-Footnote-34111633 +Ref: Library<53>-Footnote-44111698 +Ref: Library<53>-Footnote-54111763 +Ref: Library<53>-Footnote-64111828 +Node: C API<44>4111893 +Ref: whatsnew/changelog id4624112017 +Ref: 155e4112017 +Ref: C API<44>-Footnote-14112175 +Node: Documentation<51>4112240 +Ref: whatsnew/changelog id4634112368 +Ref: 155f4112368 +Ref: Documentation<51>-Footnote-14112708 +Ref: Documentation<51>-Footnote-24112773 +Node: Tools/Demos<27>4112815 +Ref: whatsnew/changelog id4644112925 +Ref: 15604112925 +Ref: Tools/Demos<27>-Footnote-14113091 +Node: Python 3 6 0 beta 44113156 +Ref: whatsnew/changelog python-3-6-0-beta-44113290 +Ref: 15614113290 +Node: Core and Builtins<55>4113529 +Ref: whatsnew/changelog id4654113626 +Ref: 15624113626 +Ref: Core and Builtins<55>-Footnote-14115178 +Ref: Core and Builtins<55>-Footnote-24115243 +Ref: Core and Builtins<55>-Footnote-34115308 +Ref: Core and Builtins<55>-Footnote-44115373 +Ref: Core and Builtins<55>-Footnote-54115438 +Ref: Core and Builtins<55>-Footnote-64115503 +Ref: Core and Builtins<55>-Footnote-74115568 +Ref: Core and Builtins<55>-Footnote-84115633 +Ref: Core and Builtins<55>-Footnote-94115698 +Ref: Core and Builtins<55>-Footnote-104115763 +Ref: Core and Builtins<55>-Footnote-114115829 +Node: Library<54>4115895 +Ref: whatsnew/changelog id4664116018 +Ref: 15634116018 +Ref: Library<54>-Footnote-14118020 +Ref: Library<54>-Footnote-24118085 +Ref: Library<54>-Footnote-34118150 +Ref: Library<54>-Footnote-44118215 +Ref: Library<54>-Footnote-54118280 +Ref: Library<54>-Footnote-64118345 +Ref: Library<54>-Footnote-74118410 +Ref: Library<54>-Footnote-84118475 +Ref: Library<54>-Footnote-94118540 +Ref: Library<54>-Footnote-104118605 +Ref: Library<54>-Footnote-114118671 +Ref: Library<54>-Footnote-124118737 +Ref: Library<54>-Footnote-134118803 +Ref: Library<54>-Footnote-144118869 +Ref: Library<54>-Footnote-154118935 +Ref: Library<54>-Footnote-164119001 +Ref: Library<54>-Footnote-174119067 +Ref: Library<54>-Footnote-184119133 +Node: Documentation<52>4119199 +Ref: whatsnew/changelog id4674119310 +Ref: 15644119310 +Ref: Documentation<52>-Footnote-14119461 +Node: Tests<49>4119526 +Ref: whatsnew/changelog id4684119635 +Ref: 15654119635 +Ref: Tests<49>-Footnote-14119897 +Ref: Tests<49>-Footnote-24119962 +Node: Build<54>4120027 +Ref: whatsnew/changelog id4694120110 +Ref: 15664120110 +Ref: Build<54>-Footnote-14120473 +Ref: Build<54>-Footnote-24120538 +Ref: Build<54>-Footnote-34120603 +Node: Python 3 6 0 beta 34120668 +Ref: whatsnew/changelog python-3-6-0-beta-34120789 +Ref: 15674120789 +Node: Core and Builtins<56>4121016 +Ref: whatsnew/changelog id4704121113 +Ref: 15684121113 +Ref: Core and Builtins<56>-Footnote-14122020 +Ref: Core and Builtins<56>-Footnote-24122085 +Ref: Core and Builtins<56>-Footnote-34122150 +Ref: Core and Builtins<56>-Footnote-44122215 +Ref: Core and Builtins<56>-Footnote-54122280 +Ref: Core and Builtins<56>-Footnote-64122345 +Ref: Core and Builtins<56>-Footnote-74122410 +Node: Library<55>4122475 +Ref: whatsnew/changelog id4714122592 +Ref: 15694122592 +Ref: Library<55>-Footnote-14125639 +Ref: Library<55>-Footnote-24125704 +Ref: Library<55>-Footnote-34125769 +Ref: Library<55>-Footnote-44125834 +Ref: Library<55>-Footnote-54125899 +Ref: Library<55>-Footnote-64125964 +Ref: Library<55>-Footnote-74126029 +Ref: Library<55>-Footnote-84126094 +Ref: Library<55>-Footnote-94126159 +Ref: Library<55>-Footnote-104126224 +Ref: Library<55>-Footnote-114126290 +Ref: Library<55>-Footnote-124126356 +Ref: Library<55>-Footnote-134126422 +Ref: Library<55>-Footnote-144126488 +Ref: Library<55>-Footnote-154126554 +Ref: Library<55>-Footnote-164126620 +Ref: Library<55>-Footnote-174126686 +Ref: Library<55>-Footnote-184126752 +Ref: Library<55>-Footnote-194126818 +Ref: Library<55>-Footnote-204126884 +Ref: Library<55>-Footnote-214126950 +Ref: Library<55>-Footnote-224127016 +Ref: Library<55>-Footnote-234127082 +Ref: Library<55>-Footnote-244127148 +Node: Windows<48>4127214 +Ref: whatsnew/changelog id4724127319 +Ref: 156a4127319 +Ref: Windows<48>-Footnote-14127463 +Node: Build<55>4127528 +Ref: whatsnew/changelog id4734127631 +Ref: 156b4127631 +Ref: Build<55>-Footnote-14127950 +Ref: Build<55>-Footnote-24128015 +Ref: Build<55>-Footnote-34128080 +Node: Tests<50>4128145 +Ref: whatsnew/changelog id4744128228 +Ref: 156c4128228 +Ref: Tests<50>-Footnote-14128487 +Ref: Tests<50>-Footnote-24128552 +Node: Python 3 6 0 beta 24128617 +Ref: whatsnew/changelog python-3-6-0-beta-24128738 +Ref: 156d4128738 +Node: Core and Builtins<57>4128985 +Ref: whatsnew/changelog id4754129082 +Ref: 156e4129082 +Ref: Core and Builtins<57>-Footnote-14131826 +Ref: Core and Builtins<57>-Footnote-24131891 +Ref: Core and Builtins<57>-Footnote-34131956 +Ref: Core and Builtins<57>-Footnote-44132021 +Ref: Core and Builtins<57>-Footnote-54132086 +Ref: Core and Builtins<57>-Footnote-64132151 +Ref: Core and Builtins<57>-Footnote-74132216 +Ref: Core and Builtins<57>-Footnote-84132281 +Ref: Core and Builtins<57>-Footnote-94132346 +Ref: Core and Builtins<57>-Footnote-104132411 +Ref: Core and Builtins<57>-Footnote-114132477 +Ref: Core and Builtins<57>-Footnote-124132543 +Ref: Core and Builtins<57>-Footnote-134132609 +Ref: Core and Builtins<57>-Footnote-144132675 +Ref: Core and Builtins<57>-Footnote-154132741 +Ref: Core and Builtins<57>-Footnote-164132807 +Ref: Core and Builtins<57>-Footnote-174132873 +Ref: Core and Builtins<57>-Footnote-184132939 +Ref: Core and Builtins<57>-Footnote-194133005 +Ref: Core and Builtins<57>-Footnote-204133071 +Ref: Core and Builtins<57>-Footnote-214133137 +Ref: Core and Builtins<57>-Footnote-224133203 +Ref: Core and Builtins<57>-Footnote-234133269 +Node: Library<56>4133335 +Ref: whatsnew/changelog id4764133452 +Ref: 156f4133452 +Ref: Library<56>-Footnote-14139242 +Ref: Library<56>-Footnote-24139307 +Ref: Library<56>-Footnote-34139372 +Ref: Library<56>-Footnote-44139437 +Ref: Library<56>-Footnote-54139502 +Ref: Library<56>-Footnote-64139567 +Ref: Library<56>-Footnote-74139632 +Ref: Library<56>-Footnote-84139697 +Ref: Library<56>-Footnote-94139762 +Ref: Library<56>-Footnote-104139827 +Ref: Library<56>-Footnote-114139893 +Ref: Library<56>-Footnote-124139959 +Ref: Library<56>-Footnote-134140025 +Ref: Library<56>-Footnote-144140091 +Ref: Library<56>-Footnote-154140157 +Ref: Library<56>-Footnote-164140223 +Ref: Library<56>-Footnote-174140289 +Ref: Library<56>-Footnote-184140355 +Ref: Library<56>-Footnote-194140421 +Ref: Library<56>-Footnote-204140487 +Ref: Library<56>-Footnote-214140553 +Ref: Library<56>-Footnote-224140619 +Ref: Library<56>-Footnote-234140685 +Ref: Library<56>-Footnote-244140751 +Ref: Library<56>-Footnote-254140817 +Ref: Library<56>-Footnote-264140883 +Ref: Library<56>-Footnote-274140949 +Ref: Library<56>-Footnote-284141015 +Ref: Library<56>-Footnote-294141081 +Ref: Library<56>-Footnote-304141147 +Ref: Library<56>-Footnote-314141213 +Ref: Library<56>-Footnote-324141279 +Ref: Library<56>-Footnote-334141345 +Ref: Library<56>-Footnote-344141411 +Ref: Library<56>-Footnote-354141477 +Ref: Library<56>-Footnote-364141543 +Ref: Library<56>-Footnote-374141609 +Ref: Library<56>-Footnote-384141675 +Ref: Library<56>-Footnote-394141741 +Ref: Library<56>-Footnote-404141807 +Ref: Library<56>-Footnote-414141873 +Ref: Library<56>-Footnote-424141939 +Ref: Library<56>-Footnote-434142005 +Ref: Library<56>-Footnote-444142071 +Ref: Library<56>-Footnote-454142137 +Ref: Library<56>-Footnote-464142203 +Ref: Library<56>-Footnote-474142269 +Ref: Library<56>-Footnote-484142335 +Node: Windows<49>4142401 +Ref: whatsnew/changelog id4774142506 +Ref: 15704142506 +Ref: Windows<49>-Footnote-14143317 +Ref: Windows<49>-Footnote-24143382 +Ref: Windows<49>-Footnote-34143447 +Ref: Windows<49>-Footnote-44143512 +Ref: Windows<49>-Footnote-54143577 +Ref: Windows<49>-Footnote-64143642 +Ref: Windows<49>-Footnote-74143707 +Ref: Windows<49>-Footnote-84143772 +Ref: Windows<49>-Footnote-94143837 +Ref: Windows<49>-Footnote-104143902 +Node: C API<45>4143968 +Ref: whatsnew/changelog id4784144071 +Ref: 15714144071 +Ref: C API<45>-Footnote-14144325 +Node: Build<56>4144390 +Ref: whatsnew/changelog id4794144491 +Ref: 15724144491 +Ref: Build<56>-Footnote-14144917 +Ref: Build<56>-Footnote-24144982 +Ref: Build<56>-Footnote-34145047 +Node: Tests<51>4145112 +Ref: whatsnew/changelog id4804145195 +Ref: 15734145195 +Ref: Tests<51>-Footnote-14145332 +Node: Python 3 6 0 beta 14145397 +Ref: whatsnew/changelog python-3-6-0-beta-14145519 +Ref: 15744145519 +Node: Core and Builtins<58>4145816 +Ref: whatsnew/changelog id4814145913 +Ref: 15754145913 +Ref: Core and Builtins<58>-Footnote-14152118 +Ref: Core and Builtins<58>-Footnote-24152183 +Ref: Core and Builtins<58>-Footnote-34152248 +Ref: Core and Builtins<58>-Footnote-44152313 +Ref: Core and Builtins<58>-Footnote-54152355 +Ref: Core and Builtins<58>-Footnote-64152420 +Ref: Core and Builtins<58>-Footnote-74152485 +Ref: Core and Builtins<58>-Footnote-84152550 +Ref: Core and Builtins<58>-Footnote-94152615 +Ref: Core and Builtins<58>-Footnote-104152680 +Ref: Core and Builtins<58>-Footnote-114152746 +Ref: Core and Builtins<58>-Footnote-124152812 +Ref: Core and Builtins<58>-Footnote-134152878 +Ref: Core and Builtins<58>-Footnote-144152921 +Ref: Core and Builtins<58>-Footnote-154152987 +Ref: Core and Builtins<58>-Footnote-164153053 +Ref: Core and Builtins<58>-Footnote-174153096 +Ref: Core and Builtins<58>-Footnote-184153162 +Ref: Core and Builtins<58>-Footnote-194153205 +Ref: Core and Builtins<58>-Footnote-204153271 +Ref: Core and Builtins<58>-Footnote-214153337 +Ref: Core and Builtins<58>-Footnote-224153403 +Ref: Core and Builtins<58>-Footnote-234153469 +Ref: Core and Builtins<58>-Footnote-244153535 +Ref: Core and Builtins<58>-Footnote-254153601 +Ref: Core and Builtins<58>-Footnote-264153667 +Ref: Core and Builtins<58>-Footnote-274153733 +Ref: Core and Builtins<58>-Footnote-284153776 +Ref: Core and Builtins<58>-Footnote-294153842 +Ref: Core and Builtins<58>-Footnote-304153908 +Ref: Core and Builtins<58>-Footnote-314153974 +Ref: Core and Builtins<58>-Footnote-324154040 +Ref: Core and Builtins<58>-Footnote-334154106 +Ref: Core and Builtins<58>-Footnote-344154172 +Ref: Core and Builtins<58>-Footnote-354154238 +Ref: Core and Builtins<58>-Footnote-364154304 +Ref: Core and Builtins<58>-Footnote-374154370 +Ref: Core and Builtins<58>-Footnote-384154436 +Ref: Core and Builtins<58>-Footnote-394154502 +Ref: Core and Builtins<58>-Footnote-404154568 +Ref: Core and Builtins<58>-Footnote-414154634 +Ref: Core and Builtins<58>-Footnote-424154700 +Ref: Core and Builtins<58>-Footnote-434154766 +Ref: Core and Builtins<58>-Footnote-444154832 +Ref: Core and Builtins<58>-Footnote-454154898 +Ref: Core and Builtins<58>-Footnote-464154964 +Ref: Core and Builtins<58>-Footnote-474155007 +Node: Library<57>4155073 +Ref: whatsnew/changelog id4824155187 +Ref: 15764155187 +Ref: Library<57>-Footnote-14166174 +Ref: Library<57>-Footnote-24166239 +Ref: Library<57>-Footnote-34166304 +Ref: Library<57>-Footnote-44166369 +Ref: Library<57>-Footnote-54166434 +Ref: Library<57>-Footnote-64166499 +Ref: Library<57>-Footnote-74166564 +Ref: Library<57>-Footnote-84166629 +Ref: Library<57>-Footnote-94166694 +Ref: Library<57>-Footnote-104166759 +Ref: Library<57>-Footnote-114166825 +Ref: Library<57>-Footnote-124166891 +Ref: Library<57>-Footnote-134166957 +Ref: Library<57>-Footnote-144167023 +Ref: Library<57>-Footnote-154167089 +Ref: Library<57>-Footnote-164167155 +Ref: Library<57>-Footnote-174167221 +Ref: Library<57>-Footnote-184167289 +Ref: Library<57>-Footnote-194167355 +Ref: Library<57>-Footnote-204167421 +Ref: Library<57>-Footnote-214167487 +Ref: Library<57>-Footnote-224167553 +Ref: Library<57>-Footnote-234167619 +Ref: Library<57>-Footnote-244167685 +Ref: Library<57>-Footnote-254167751 +Ref: Library<57>-Footnote-264167818 +Ref: Library<57>-Footnote-274167884 +Ref: Library<57>-Footnote-284167950 +Ref: Library<57>-Footnote-294168016 +Ref: Library<57>-Footnote-304168082 +Ref: Library<57>-Footnote-314168148 +Ref: Library<57>-Footnote-324168214 +Ref: Library<57>-Footnote-334168280 +Ref: Library<57>-Footnote-344168346 +Ref: Library<57>-Footnote-354168412 +Ref: Library<57>-Footnote-364168478 +Ref: Library<57>-Footnote-374168544 +Ref: Library<57>-Footnote-384168610 +Ref: Library<57>-Footnote-394168676 +Ref: Library<57>-Footnote-404168742 +Ref: Library<57>-Footnote-414168808 +Ref: Library<57>-Footnote-424168874 +Ref: Library<57>-Footnote-434168917 +Ref: Library<57>-Footnote-444168983 +Ref: Library<57>-Footnote-454169026 +Ref: Library<57>-Footnote-464169092 +Ref: Library<57>-Footnote-474169158 +Ref: Library<57>-Footnote-484169224 +Ref: Library<57>-Footnote-494169290 +Ref: Library<57>-Footnote-504169356 +Ref: Library<57>-Footnote-514169422 +Ref: Library<57>-Footnote-524169488 +Ref: Library<57>-Footnote-534169554 +Ref: Library<57>-Footnote-544169620 +Ref: Library<57>-Footnote-554169686 +Ref: Library<57>-Footnote-564169752 +Ref: Library<57>-Footnote-574169818 +Ref: Library<57>-Footnote-584169884 +Ref: Library<57>-Footnote-594169950 +Ref: Library<57>-Footnote-604170016 +Ref: Library<57>-Footnote-614170082 +Ref: Library<57>-Footnote-624170148 +Ref: Library<57>-Footnote-634170214 +Ref: Library<57>-Footnote-644170280 +Ref: Library<57>-Footnote-654170346 +Ref: Library<57>-Footnote-664170412 +Ref: Library<57>-Footnote-674170478 +Ref: Library<57>-Footnote-684170544 +Ref: Library<57>-Footnote-694170610 +Ref: Library<57>-Footnote-704170676 +Ref: Library<57>-Footnote-714170742 +Ref: Library<57>-Footnote-724170808 +Ref: Library<57>-Footnote-734170874 +Ref: Library<57>-Footnote-744170940 +Ref: Library<57>-Footnote-754171006 +Ref: Library<57>-Footnote-764171071 +Ref: Library<57>-Footnote-774171136 +Ref: Library<57>-Footnote-784171202 +Ref: Library<57>-Footnote-794171268 +Ref: Library<57>-Footnote-804171333 +Ref: Library<57>-Footnote-814171399 +Node: IDLE<40>4171465 +Ref: whatsnew/changelog id4834171567 +Ref: 15774171567 +Ref: IDLE<40>-Footnote-14172333 +Ref: IDLE<40>-Footnote-24172398 +Ref: IDLE<40>-Footnote-34172463 +Ref: IDLE<40>-Footnote-44172528 +Ref: IDLE<40>-Footnote-54172593 +Ref: IDLE<40>-Footnote-64172658 +Node: C API<46>4172723 +Ref: whatsnew/changelog id4844172823 +Ref: 15784172823 +Ref: C API<46>-Footnote-14173095 +Ref: C API<46>-Footnote-24173160 +Node: Tests<52>4173225 +Ref: whatsnew/changelog id4854173326 +Ref: 15794173326 +Ref: Tests<52>-Footnote-14173846 +Ref: Tests<52>-Footnote-24173911 +Ref: Tests<52>-Footnote-34173976 +Ref: Tests<52>-Footnote-44174041 +Node: Build<57>4174106 +Ref: whatsnew/changelog id4864174213 +Ref: 157a4174213 +Ref: Build<57>-Footnote-14175598 +Ref: Build<57>-Footnote-24175663 +Ref: Build<57>-Footnote-34175728 +Ref: Build<57>-Footnote-44175793 +Ref: Build<57>-Footnote-54175858 +Ref: Build<57>-Footnote-64175923 +Ref: Build<57>-Footnote-74175988 +Ref: Build<57>-Footnote-84176053 +Ref: Build<57>-Footnote-94176118 +Ref: Build<57>-Footnote-104176183 +Ref: Build<57>-Footnote-114176249 +Node: Tools/Demos<28>4176315 +Ref: whatsnew/changelog id4874176424 +Ref: 157b4176424 +Ref: Tools/Demos<28>-Footnote-14176703 +Node: Windows<50>4176768 +Ref: whatsnew/changelog id4884176859 +Ref: 157c4176859 +Ref: Windows<50>-Footnote-14177828 +Ref: Windows<50>-Footnote-24177893 +Ref: Windows<50>-Footnote-34177958 +Ref: Windows<50>-Footnote-44178022 +Ref: Windows<50>-Footnote-54178087 +Ref: Windows<50>-Footnote-64178152 +Ref: Windows<50>-Footnote-74178216 +Ref: Windows<50>-Footnote-84178281 +Ref: Windows<50>-Footnote-94178346 +Ref: Windows<50>-Footnote-104178411 +Ref: Windows<50>-Footnote-114178477 +Node: Python 3 6 0 alpha 44178543 +Ref: whatsnew/changelog python-3-6-0-alpha-44178666 +Ref: 157d4178666 +Node: Core and Builtins<59>4178913 +Ref: whatsnew/changelog id4894179011 +Ref: 157e4179011 +Ref: Core and Builtins<59>-Footnote-14180969 +Ref: Core and Builtins<59>-Footnote-24181034 +Ref: Core and Builtins<59>-Footnote-34181099 +Ref: Core and Builtins<59>-Footnote-44181164 +Ref: Core and Builtins<59>-Footnote-54181229 +Ref: Core and Builtins<59>-Footnote-64181294 +Ref: Core and Builtins<59>-Footnote-74181359 +Ref: Core and Builtins<59>-Footnote-84181424 +Ref: Core and Builtins<59>-Footnote-94181489 +Ref: Core and Builtins<59>-Footnote-104181553 +Ref: Core and Builtins<59>-Footnote-114181619 +Ref: Core and Builtins<59>-Footnote-124181685 +Ref: Core and Builtins<59>-Footnote-134181751 +Ref: Core and Builtins<59>-Footnote-144181817 +Node: Library<58>4181860 +Ref: whatsnew/changelog id4904181975 +Ref: 157f4181975 +Ref: Library<58>-Footnote-14186484 +Ref: Library<58>-Footnote-24186549 +Ref: Library<58>-Footnote-34186591 +Ref: Library<58>-Footnote-44186656 +Ref: Library<58>-Footnote-54186721 +Ref: Library<58>-Footnote-64186786 +Ref: Library<58>-Footnote-74186851 +Ref: Library<58>-Footnote-84186916 +Ref: Library<58>-Footnote-94186981 +Ref: Library<58>-Footnote-104187046 +Ref: Library<58>-Footnote-114187112 +Ref: Library<58>-Footnote-124187155 +Ref: Library<58>-Footnote-134187221 +Ref: Library<58>-Footnote-144187287 +Ref: Library<58>-Footnote-154187353 +Ref: Library<58>-Footnote-164187419 +Ref: Library<58>-Footnote-174187484 +Ref: Library<58>-Footnote-184187550 +Ref: Library<58>-Footnote-194187616 +Ref: Library<58>-Footnote-204187682 +Ref: Library<58>-Footnote-214187748 +Ref: Library<58>-Footnote-224187814 +Ref: Library<58>-Footnote-234187880 +Ref: Library<58>-Footnote-244187946 +Ref: Library<58>-Footnote-254188012 +Ref: Library<58>-Footnote-264188078 +Ref: Library<58>-Footnote-274188144 +Ref: Library<58>-Footnote-284188210 +Ref: Library<58>-Footnote-294188275 +Ref: Library<58>-Footnote-304188341 +Ref: Library<58>-Footnote-314188407 +Ref: Library<58>-Footnote-324188473 +Ref: Library<58>-Footnote-334188516 +Ref: Library<58>-Footnote-344188582 +Ref: Library<58>-Footnote-354188647 +Ref: Library<58>-Footnote-364188713 +Ref: Library<58>-Footnote-374188779 +Ref: Library<58>-Footnote-384188845 +Node: IDLE<41>4188911 +Ref: whatsnew/changelog id4914189014 +Ref: 15804189014 +Ref: IDLE<41>-Footnote-14190338 +Ref: IDLE<41>-Footnote-24190403 +Ref: IDLE<41>-Footnote-34190468 +Ref: IDLE<41>-Footnote-44190533 +Ref: IDLE<41>-Footnote-54190598 +Ref: IDLE<41>-Footnote-64190663 +Ref: IDLE<41>-Footnote-74190728 +Ref: IDLE<41>-Footnote-84190793 +Node: Tests<53>4190858 +Ref: whatsnew/changelog id4924190961 +Ref: 15814190961 +Ref: Tests<53>-Footnote-14191550 +Ref: Tests<53>-Footnote-24191615 +Ref: Tests<53>-Footnote-34191680 +Ref: Tests<53>-Footnote-44191745 +Node: Windows<51>4191810 +Ref: whatsnew/changelog id4934191914 +Ref: 15824191914 +Ref: Windows<51>-Footnote-14192290 +Ref: Windows<51>-Footnote-24192355 +Ref: Windows<51>-Footnote-34192420 +Ref: Windows<51>-Footnote-44192462 +Ref: Windows<51>-Footnote-54192527 +Node: Build<58>4192592 +Ref: whatsnew/changelog id4944192678 +Ref: 15834192678 +Ref: Build<58>-Footnote-14193579 +Ref: Build<58>-Footnote-24193644 +Ref: Build<58>-Footnote-34193709 +Ref: Build<58>-Footnote-44193774 +Ref: Build<58>-Footnote-54193839 +Ref: Build<58>-Footnote-64193904 +Node: Python 3 6 0 alpha 34193969 +Ref: whatsnew/changelog python-3-6-0-alpha-34194093 +Ref: 15844194093 +Node: Security<30>4194430 +Ref: whatsnew/changelog id4954194529 +Ref: 15854194529 +Ref: Security<30>-Footnote-14194907 +Ref: Security<30>-Footnote-24194972 +Node: Core and Builtins<60>4195037 +Ref: whatsnew/changelog id4964195156 +Ref: 15864195156 +Ref: Core and Builtins<60>-Footnote-14195907 +Ref: Core and Builtins<60>-Footnote-24195972 +Ref: Core and Builtins<60>-Footnote-34196037 +Ref: Core and Builtins<60>-Footnote-44196102 +Node: Library<59>4196167 +Ref: whatsnew/changelog id4974196282 +Ref: 15874196282 +Ref: Library<59>-Footnote-14200395 +Ref: Library<59>-Footnote-24200460 +Ref: Library<59>-Footnote-34200525 +Ref: Library<59>-Footnote-44200590 +Ref: Library<59>-Footnote-54200655 +Ref: Library<59>-Footnote-64200720 +Ref: Library<59>-Footnote-74200785 +Ref: Library<59>-Footnote-84200850 +Ref: Library<59>-Footnote-94200915 +Ref: Library<59>-Footnote-104200980 +Ref: Library<59>-Footnote-114201046 +Ref: Library<59>-Footnote-124201112 +Ref: Library<59>-Footnote-134201178 +Ref: Library<59>-Footnote-144201244 +Ref: Library<59>-Footnote-154201310 +Ref: Library<59>-Footnote-164201376 +Ref: Library<59>-Footnote-174201442 +Ref: Library<59>-Footnote-184201508 +Ref: Library<59>-Footnote-194201574 +Ref: Library<59>-Footnote-204201640 +Ref: Library<59>-Footnote-214201706 +Ref: Library<59>-Footnote-224201749 +Ref: Library<59>-Footnote-234201815 +Ref: Library<59>-Footnote-244201881 +Ref: Library<59>-Footnote-254201946 +Ref: Library<59>-Footnote-264202012 +Node: IDLE<42>4202078 +Ref: whatsnew/changelog id4984202181 +Ref: 15884202181 +Ref: IDLE<42>-Footnote-14203847 +Ref: IDLE<42>-Footnote-24203912 +Ref: IDLE<42>-Footnote-34203977 +Ref: IDLE<42>-Footnote-44204042 +Ref: IDLE<42>-Footnote-54204107 +Ref: IDLE<42>-Footnote-64204172 +Ref: IDLE<42>-Footnote-74204237 +Ref: IDLE<42>-Footnote-84204302 +Ref: IDLE<42>-Footnote-94204367 +Ref: IDLE<42>-Footnote-104204432 +Node: C API<47>4204498 +Ref: whatsnew/changelog id4994204599 +Ref: 15894204599 +Ref: C API<47>-Footnote-14204839 +Node: Build<59>4204904 +Ref: whatsnew/changelog id5004205012 +Ref: 158a4205012 +Ref: Build<59>-Footnote-14205989 +Ref: Build<59>-Footnote-24206054 +Ref: Build<59>-Footnote-34206119 +Ref: Build<59>-Footnote-44206184 +Ref: Build<59>-Footnote-54206249 +Node: Tools/Demos<29>4206314 +Ref: whatsnew/changelog id5014206430 +Ref: 158b4206430 +Ref: Tools/Demos<29>-Footnote-14206714 +Ref: Tools/Demos<29>-Footnote-24206779 +Node: Documentation<53>4206844 +Ref: whatsnew/changelog id5024206960 +Ref: 158c4206960 +Ref: Documentation<53>-Footnote-14207341 +Ref: Documentation<53>-Footnote-24207406 +Node: Tests<54>4207471 +Ref: whatsnew/changelog id5034207563 +Ref: 158d4207563 +Ref: Tests<54>-Footnote-14207731 +Node: Python 3 6 0 alpha 24207796 +Ref: whatsnew/changelog python-3-6-0-alpha-24207920 +Ref: 158e4207920 +Node: Security<31>4208281 +Ref: whatsnew/changelog id5044208380 +Ref: 158f4208380 +Ref: Security<31>-Footnote-14208865 +Ref: Security<31>-Footnote-24208930 +Node: Core and Builtins<61>4208995 +Ref: whatsnew/changelog id5054209114 +Ref: 15904209114 +Ref: Core and Builtins<61>-Footnote-14210746 +Ref: Core and Builtins<61>-Footnote-24210811 +Ref: Core and Builtins<61>-Footnote-34210876 +Ref: Core and Builtins<61>-Footnote-44210941 +Ref: Core and Builtins<61>-Footnote-54211006 +Ref: Core and Builtins<61>-Footnote-64211071 +Ref: Core and Builtins<61>-Footnote-74211113 +Ref: Core and Builtins<61>-Footnote-84211178 +Ref: Core and Builtins<61>-Footnote-94211243 +Ref: Core and Builtins<61>-Footnote-104211308 +Ref: Core and Builtins<61>-Footnote-114211374 +Ref: Core and Builtins<61>-Footnote-124211440 +Node: Library<60>4211506 +Ref: whatsnew/changelog id5064211621 +Ref: 15914211621 +Ref: Library<60>-Footnote-14216832 +Ref: Library<60>-Footnote-24216897 +Ref: Library<60>-Footnote-34216962 +Ref: Library<60>-Footnote-44217027 +Ref: Library<60>-Footnote-54217092 +Ref: Library<60>-Footnote-64217157 +Ref: Library<60>-Footnote-74217222 +Ref: Library<60>-Footnote-84217287 +Ref: Library<60>-Footnote-94217352 +Ref: Library<60>-Footnote-104217394 +Ref: Library<60>-Footnote-114217460 +Ref: Library<60>-Footnote-124217526 +Ref: Library<60>-Footnote-134217592 +Ref: Library<60>-Footnote-144217635 +Ref: Library<60>-Footnote-154217701 +Ref: Library<60>-Footnote-164217744 +Ref: Library<60>-Footnote-174217787 +Ref: Library<60>-Footnote-184217853 +Ref: Library<60>-Footnote-194217919 +Ref: Library<60>-Footnote-204217985 +Ref: Library<60>-Footnote-214218051 +Ref: Library<60>-Footnote-224218117 +Ref: Library<60>-Footnote-234218183 +Ref: Library<60>-Footnote-244218249 +Ref: Library<60>-Footnote-254218315 +Ref: Library<60>-Footnote-264218381 +Ref: Library<60>-Footnote-274218447 +Ref: Library<60>-Footnote-284218513 +Ref: Library<60>-Footnote-294218579 +Ref: Library<60>-Footnote-304218645 +Ref: Library<60>-Footnote-314218711 +Ref: Library<60>-Footnote-324218777 +Ref: Library<60>-Footnote-334218843 +Ref: Library<60>-Footnote-344218909 +Ref: Library<60>-Footnote-354218975 +Node: IDLE<43>4219041 +Ref: whatsnew/changelog id5074219152 +Ref: 15924219152 +Ref: IDLE<43>-Footnote-14221805 +Ref: IDLE<43>-Footnote-24221869 +Ref: IDLE<43>-Footnote-34221934 +Ref: IDLE<43>-Footnote-44221999 +Ref: IDLE<43>-Footnote-54222064 +Ref: IDLE<43>-Footnote-64222129 +Ref: IDLE<43>-Footnote-74222194 +Ref: IDLE<43>-Footnote-84222259 +Ref: IDLE<43>-Footnote-94222324 +Ref: IDLE<43>-Footnote-104222389 +Ref: IDLE<43>-Footnote-114222455 +Ref: IDLE<43>-Footnote-124222521 +Ref: IDLE<43>-Footnote-134222587 +Ref: IDLE<43>-Footnote-144222653 +Ref: IDLE<43>-Footnote-154222719 +Ref: IDLE<43>-Footnote-164222785 +Ref: IDLE<43>-Footnote-174222851 +Ref: IDLE<43>-Footnote-184222917 +Ref: IDLE<43>-Footnote-194222983 +Node: Documentation<54>4223049 +Ref: whatsnew/changelog id5084223158 +Ref: 15934223158 +Ref: Documentation<54>-Footnote-14223605 +Ref: Documentation<54>-Footnote-24223670 +Ref: Documentation<54>-Footnote-34223735 +Ref: Documentation<54>-Footnote-44223777 +Node: Tests<55>4223842 +Ref: whatsnew/changelog id5094223954 +Ref: 15944223954 +Ref: Tests<55>-Footnote-14224334 +Ref: Tests<55>-Footnote-24224399 +Node: Windows<52>4224464 +Ref: whatsnew/changelog id5104224568 +Ref: 15954224568 +Ref: Windows<52>-Footnote-14224978 +Ref: Windows<52>-Footnote-24225043 +Node: Build<60>4225108 +Ref: whatsnew/changelog id5114225212 +Ref: 15964225212 +Ref: Build<60>-Footnote-14225489 +Ref: Build<60>-Footnote-24225554 +Node: C API<48>4225619 +Ref: whatsnew/changelog id5124225727 +Ref: 15974225727 +Ref: C API<48>-Footnote-14225965 +Ref: C API<48>-Footnote-24226030 +Ref: C API<48>-Footnote-34226072 +Node: Tools/Demos<30>4226137 +Ref: whatsnew/changelog id5134226227 +Ref: 15984226227 +Ref: Tools/Demos<30>-Footnote-14226425 +Node: Python 3 6 0 alpha 14226490 +Ref: whatsnew/changelog python-3-6-0-alpha-14226612 +Ref: 15994226612 +Node: Security<32>4226973 +Ref: whatsnew/changelog id5144227072 +Ref: 159a4227072 +Ref: Security<32>-Footnote-14227563 +Ref: Security<32>-Footnote-24227628 +Ref: Security<32>-Footnote-34227693 +Node: Core and Builtins<62>4227758 +Ref: whatsnew/changelog id5154227877 +Ref: 159b4227877 +Ref: Core and Builtins<62>-Footnote-14241064 +Ref: Core and Builtins<62>-Footnote-24241129 +Ref: Core and Builtins<62>-Footnote-34241194 +Ref: Core and Builtins<62>-Footnote-44241259 +Ref: Core and Builtins<62>-Footnote-54241324 +Ref: Core and Builtins<62>-Footnote-64241389 +Ref: Core and Builtins<62>-Footnote-74241454 +Ref: Core and Builtins<62>-Footnote-84241519 +Ref: Core and Builtins<62>-Footnote-94241584 +Ref: Core and Builtins<62>-Footnote-104241649 +Ref: Core and Builtins<62>-Footnote-114241715 +Ref: Core and Builtins<62>-Footnote-124241781 +Ref: Core and Builtins<62>-Footnote-134241847 +Ref: Core and Builtins<62>-Footnote-144241913 +Ref: Core and Builtins<62>-Footnote-154241979 +Ref: Core and Builtins<62>-Footnote-164242045 +Ref: Core and Builtins<62>-Footnote-174242088 +Ref: Core and Builtins<62>-Footnote-184242154 +Ref: Core and Builtins<62>-Footnote-194242220 +Ref: Core and Builtins<62>-Footnote-204242286 +Ref: Core and Builtins<62>-Footnote-214242352 +Ref: Core and Builtins<62>-Footnote-224242418 +Ref: Core and Builtins<62>-Footnote-234242484 +Ref: Core and Builtins<62>-Footnote-244242527 +Ref: Core and Builtins<62>-Footnote-254242593 +Ref: Core and Builtins<62>-Footnote-264242659 +Ref: Core and Builtins<62>-Footnote-274242725 +Ref: Core and Builtins<62>-Footnote-284242791 +Ref: Core and Builtins<62>-Footnote-294242857 +Ref: Core and Builtins<62>-Footnote-304242923 +Ref: Core and Builtins<62>-Footnote-314242989 +Ref: Core and Builtins<62>-Footnote-324243055 +Ref: Core and Builtins<62>-Footnote-334243121 +Ref: Core and Builtins<62>-Footnote-344243187 +Ref: Core and Builtins<62>-Footnote-354243253 +Ref: Core and Builtins<62>-Footnote-364243319 +Ref: Core and Builtins<62>-Footnote-374243384 +Ref: Core and Builtins<62>-Footnote-384243450 +Ref: Core and Builtins<62>-Footnote-394243516 +Ref: Core and Builtins<62>-Footnote-404243582 +Ref: Core and Builtins<62>-Footnote-414243648 +Ref: Core and Builtins<62>-Footnote-424243714 +Ref: Core and Builtins<62>-Footnote-434243780 +Ref: Core and Builtins<62>-Footnote-444243846 +Ref: Core and Builtins<62>-Footnote-454243912 +Ref: Core and Builtins<62>-Footnote-464243978 +Ref: Core and Builtins<62>-Footnote-474244044 +Ref: Core and Builtins<62>-Footnote-484244110 +Ref: Core and Builtins<62>-Footnote-494244176 +Ref: Core and Builtins<62>-Footnote-504244242 +Ref: Core and Builtins<62>-Footnote-514244308 +Ref: Core and Builtins<62>-Footnote-524244374 +Ref: Core and Builtins<62>-Footnote-534244439 +Ref: Core and Builtins<62>-Footnote-544244505 +Ref: Core and Builtins<62>-Footnote-554244571 +Ref: Core and Builtins<62>-Footnote-564244637 +Ref: Core and Builtins<62>-Footnote-574244703 +Ref: Core and Builtins<62>-Footnote-584244769 +Ref: Core and Builtins<62>-Footnote-594244835 +Ref: Core and Builtins<62>-Footnote-604244901 +Ref: Core and Builtins<62>-Footnote-614244967 +Ref: Core and Builtins<62>-Footnote-624245033 +Ref: Core and Builtins<62>-Footnote-634245099 +Ref: Core and Builtins<62>-Footnote-644245165 +Ref: Core and Builtins<62>-Footnote-654245231 +Ref: Core and Builtins<62>-Footnote-664245297 +Ref: Core and Builtins<62>-Footnote-674245363 +Ref: Core and Builtins<62>-Footnote-684245429 +Ref: Core and Builtins<62>-Footnote-694245495 +Ref: Core and Builtins<62>-Footnote-704245561 +Ref: Core and Builtins<62>-Footnote-714245627 +Ref: Core and Builtins<62>-Footnote-724245693 +Ref: Core and Builtins<62>-Footnote-734245759 +Ref: Core and Builtins<62>-Footnote-744245825 +Ref: Core and Builtins<62>-Footnote-754245891 +Ref: Core and Builtins<62>-Footnote-764245957 +Ref: Core and Builtins<62>-Footnote-774246023 +Ref: Core and Builtins<62>-Footnote-784246089 +Ref: Core and Builtins<62>-Footnote-794246154 +Ref: Core and Builtins<62>-Footnote-804246220 +Ref: Core and Builtins<62>-Footnote-814246263 +Ref: Core and Builtins<62>-Footnote-824246329 +Ref: Core and Builtins<62>-Footnote-834246395 +Ref: Core and Builtins<62>-Footnote-844246461 +Ref: Core and Builtins<62>-Footnote-854246527 +Ref: Core and Builtins<62>-Footnote-864246593 +Ref: Core and Builtins<62>-Footnote-874246659 +Node: Library<61>4246725 +Ref: whatsnew/changelog id5164246840 +Ref: 159d4246840 +Ref: Library<61>-Footnote-14277912 +Ref: Library<61>-Footnote-24277977 +Ref: Library<61>-Footnote-34278042 +Ref: Library<61>-Footnote-44278107 +Ref: Library<61>-Footnote-54278172 +Ref: Library<61>-Footnote-64278237 +Ref: Library<61>-Footnote-74278302 +Ref: Library<61>-Footnote-84278367 +Ref: Library<61>-Footnote-94278432 +Ref: Library<61>-Footnote-104278497 +Ref: Library<61>-Footnote-114278563 +Ref: Library<61>-Footnote-124278629 +Ref: Library<61>-Footnote-134278695 +Ref: Library<61>-Footnote-144278761 +Ref: Library<61>-Footnote-154278827 +Ref: Library<61>-Footnote-164278893 +Ref: Library<61>-Footnote-174278959 +Ref: Library<61>-Footnote-184279025 +Ref: Library<61>-Footnote-194279068 +Ref: Library<61>-Footnote-204279134 +Ref: Library<61>-Footnote-214279200 +Ref: Library<61>-Footnote-224279266 +Ref: Library<61>-Footnote-234279332 +Ref: Library<61>-Footnote-244279398 +Ref: Library<61>-Footnote-254279464 +Ref: Library<61>-Footnote-264279530 +Ref: Library<61>-Footnote-274279596 +Ref: Library<61>-Footnote-284279662 +Ref: Library<61>-Footnote-294279728 +Ref: Library<61>-Footnote-304279794 +Ref: Library<61>-Footnote-314279860 +Ref: Library<61>-Footnote-324279926 +Ref: Library<61>-Footnote-334279992 +Ref: Library<61>-Footnote-344280058 +Ref: Library<61>-Footnote-354280124 +Ref: Library<61>-Footnote-364280190 +Ref: Library<61>-Footnote-374280256 +Ref: Library<61>-Footnote-384280322 +Ref: Library<61>-Footnote-394280388 +Ref: Library<61>-Footnote-404280454 +Ref: Library<61>-Footnote-414280520 +Ref: Library<61>-Footnote-424280586 +Ref: Library<61>-Footnote-434280652 +Ref: Library<61>-Footnote-444280718 +Ref: Library<61>-Footnote-454280784 +Ref: Library<61>-Footnote-464280850 +Ref: Library<61>-Footnote-474280916 +Ref: Library<61>-Footnote-484280982 +Ref: Library<61>-Footnote-494281048 +Ref: Library<61>-Footnote-504281114 +Ref: Library<61>-Footnote-514281180 +Ref: Library<61>-Footnote-524281246 +Ref: Library<61>-Footnote-534281312 +Ref: Library<61>-Footnote-544281378 +Ref: Library<61>-Footnote-554281444 +Ref: Library<61>-Footnote-564281510 +Ref: Library<61>-Footnote-574281576 +Ref: Library<61>-Footnote-584281642 +Ref: Library<61>-Footnote-594281708 +Ref: Library<61>-Footnote-604281774 +Ref: Library<61>-Footnote-614281840 +Ref: Library<61>-Footnote-624281906 +Ref: Library<61>-Footnote-634281972 +Ref: Library<61>-Footnote-644282038 +Ref: Library<61>-Footnote-654282104 +Ref: Library<61>-Footnote-664282170 +Ref: Library<61>-Footnote-674282236 +Ref: Library<61>-Footnote-684282302 +Ref: Library<61>-Footnote-694282368 +Ref: Library<61>-Footnote-704282434 +Ref: Library<61>-Footnote-714282500 +Ref: Library<61>-Footnote-724282566 +Ref: Library<61>-Footnote-734282632 +Ref: Library<61>-Footnote-744282698 +Ref: Library<61>-Footnote-754282764 +Ref: Library<61>-Footnote-764282830 +Ref: Library<61>-Footnote-774282896 +Ref: Library<61>-Footnote-784282962 +Ref: Library<61>-Footnote-794283028 +Ref: Library<61>-Footnote-804283094 +Ref: Library<61>-Footnote-814283159 +Ref: Library<61>-Footnote-824283225 +Ref: Library<61>-Footnote-834283291 +Ref: Library<61>-Footnote-844283357 +Ref: Library<61>-Footnote-854283423 +Ref: Library<61>-Footnote-864283489 +Ref: Library<61>-Footnote-874283555 +Ref: Library<61>-Footnote-884283621 +Ref: Library<61>-Footnote-894283687 +Ref: Library<61>-Footnote-904283753 +Ref: Library<61>-Footnote-914283819 +Ref: Library<61>-Footnote-924283885 +Ref: Library<61>-Footnote-934283951 +Ref: Library<61>-Footnote-944284017 +Ref: Library<61>-Footnote-954284083 +Ref: Library<61>-Footnote-964284149 +Ref: Library<61>-Footnote-974284215 +Ref: Library<61>-Footnote-984284281 +Ref: Library<61>-Footnote-994284347 +Ref: Library<61>-Footnote-1004284413 +Ref: Library<61>-Footnote-1014284480 +Ref: Library<61>-Footnote-1024284547 +Ref: Library<61>-Footnote-1034284614 +Ref: Library<61>-Footnote-1044284681 +Ref: Library<61>-Footnote-1054284748 +Ref: Library<61>-Footnote-1064284815 +Ref: Library<61>-Footnote-1074284882 +Ref: Library<61>-Footnote-1084284949 +Ref: Library<61>-Footnote-1094285016 +Ref: Library<61>-Footnote-1104285083 +Ref: Library<61>-Footnote-1114285150 +Ref: Library<61>-Footnote-1124285217 +Ref: Library<61>-Footnote-1134285284 +Ref: Library<61>-Footnote-1144285351 +Ref: Library<61>-Footnote-1154285418 +Ref: Library<61>-Footnote-1164285485 +Ref: Library<61>-Footnote-1174285552 +Ref: Library<61>-Footnote-1184285619 +Ref: Library<61>-Footnote-1194285686 +Ref: Library<61>-Footnote-1204285753 +Ref: Library<61>-Footnote-1214285820 +Ref: Library<61>-Footnote-1224285887 +Ref: Library<61>-Footnote-1234285954 +Ref: Library<61>-Footnote-1244286021 +Ref: Library<61>-Footnote-1254286088 +Ref: Library<61>-Footnote-1264286155 +Ref: Library<61>-Footnote-1274286222 +Ref: Library<61>-Footnote-1284286289 +Ref: Library<61>-Footnote-1294286356 +Ref: Library<61>-Footnote-1304286423 +Ref: Library<61>-Footnote-1314286490 +Ref: Library<61>-Footnote-1324286557 +Ref: Library<61>-Footnote-1334286624 +Ref: Library<61>-Footnote-1344286691 +Ref: Library<61>-Footnote-1354286758 +Ref: Library<61>-Footnote-1364286825 +Ref: Library<61>-Footnote-1374286892 +Ref: Library<61>-Footnote-1384286959 +Ref: Library<61>-Footnote-1394287026 +Ref: Library<61>-Footnote-1404287093 +Ref: Library<61>-Footnote-1414287160 +Ref: Library<61>-Footnote-1424287227 +Ref: Library<61>-Footnote-1434287294 +Ref: Library<61>-Footnote-1444287361 +Ref: Library<61>-Footnote-1454287427 +Ref: Library<61>-Footnote-1464287494 +Ref: Library<61>-Footnote-1474287561 +Ref: Library<61>-Footnote-1484287628 +Ref: Library<61>-Footnote-1494287695 +Ref: Library<61>-Footnote-1504287762 +Ref: Library<61>-Footnote-1514287828 +Ref: Library<61>-Footnote-1524287895 +Ref: Library<61>-Footnote-1534287962 +Ref: Library<61>-Footnote-1544288029 +Ref: Library<61>-Footnote-1554288096 +Ref: Library<61>-Footnote-1564288163 +Ref: Library<61>-Footnote-1574288230 +Ref: Library<61>-Footnote-1584288297 +Ref: Library<61>-Footnote-1594288364 +Ref: Library<61>-Footnote-1604288431 +Ref: Library<61>-Footnote-1614288497 +Ref: Library<61>-Footnote-1624288564 +Ref: Library<61>-Footnote-1634288631 +Ref: Library<61>-Footnote-1644288698 +Ref: Library<61>-Footnote-1654288765 +Ref: Library<61>-Footnote-1664288832 +Ref: Library<61>-Footnote-1674288899 +Ref: Library<61>-Footnote-1684288966 +Ref: Library<61>-Footnote-1694289033 +Ref: Library<61>-Footnote-1704289100 +Ref: Library<61>-Footnote-1714289167 +Ref: Library<61>-Footnote-1724289234 +Ref: Library<61>-Footnote-1734289301 +Ref: Library<61>-Footnote-1744289368 +Ref: Library<61>-Footnote-1754289435 +Ref: Library<61>-Footnote-1764289502 +Ref: Library<61>-Footnote-1774289569 +Ref: Library<61>-Footnote-1784289636 +Ref: Library<61>-Footnote-1794289703 +Ref: Library<61>-Footnote-1804289770 +Ref: Library<61>-Footnote-1814289837 +Ref: Library<61>-Footnote-1824289904 +Ref: Library<61>-Footnote-1834289971 +Ref: Library<61>-Footnote-1844290038 +Ref: Library<61>-Footnote-1854290105 +Ref: Library<61>-Footnote-1864290172 +Ref: Library<61>-Footnote-1874290239 +Ref: Library<61>-Footnote-1884290306 +Ref: Library<61>-Footnote-1894290373 +Ref: Library<61>-Footnote-1904290440 +Ref: Library<61>-Footnote-1914290507 +Ref: Library<61>-Footnote-1924290574 +Ref: Library<61>-Footnote-1934290641 +Ref: Library<61>-Footnote-1944290708 +Ref: Library<61>-Footnote-1954290775 +Ref: Library<61>-Footnote-1964290842 +Ref: Library<61>-Footnote-1974290909 +Ref: Library<61>-Footnote-1984290976 +Ref: Library<61>-Footnote-1994291043 +Ref: Library<61>-Footnote-2004291110 +Ref: Library<61>-Footnote-2014291177 +Ref: Library<61>-Footnote-2024291244 +Ref: Library<61>-Footnote-2034291311 +Ref: Library<61>-Footnote-2044291378 +Ref: Library<61>-Footnote-2054291445 +Ref: Library<61>-Footnote-2064291512 +Ref: Library<61>-Footnote-2074291579 +Ref: Library<61>-Footnote-2084291646 +Ref: Library<61>-Footnote-2094291712 +Ref: Library<61>-Footnote-2104291778 +Ref: Library<61>-Footnote-2114291845 +Ref: Library<61>-Footnote-2124291912 +Ref: Library<61>-Footnote-2134291979 +Ref: Library<61>-Footnote-2144292046 +Ref: Library<61>-Footnote-2154292113 +Ref: Library<61>-Footnote-2164292180 +Ref: Library<61>-Footnote-2174292247 +Ref: Library<61>-Footnote-2184292314 +Ref: Library<61>-Footnote-2194292381 +Ref: Library<61>-Footnote-2204292448 +Ref: Library<61>-Footnote-2214292515 +Ref: Library<61>-Footnote-2224292582 +Ref: Library<61>-Footnote-2234292649 +Ref: Library<61>-Footnote-2244292716 +Node: IDLE<44>4292783 +Ref: whatsnew/changelog id5174292894 +Ref: 15a14292894 +Ref: IDLE<44>-Footnote-14298473 +Ref: IDLE<44>-Footnote-24298538 +Ref: IDLE<44>-Footnote-34298603 +Ref: IDLE<44>-Footnote-44298668 +Ref: IDLE<44>-Footnote-54298733 +Ref: IDLE<44>-Footnote-64298798 +Ref: IDLE<44>-Footnote-74298863 +Ref: IDLE<44>-Footnote-84298928 +Ref: IDLE<44>-Footnote-94298993 +Ref: IDLE<44>-Footnote-104299058 +Ref: IDLE<44>-Footnote-114299124 +Ref: IDLE<44>-Footnote-124299190 +Ref: IDLE<44>-Footnote-134299256 +Ref: IDLE<44>-Footnote-144299322 +Ref: IDLE<44>-Footnote-154299388 +Ref: IDLE<44>-Footnote-164299454 +Ref: IDLE<44>-Footnote-174299520 +Ref: IDLE<44>-Footnote-184299586 +Ref: IDLE<44>-Footnote-194299652 +Ref: IDLE<44>-Footnote-204299718 +Ref: IDLE<44>-Footnote-214299784 +Ref: IDLE<44>-Footnote-224299850 +Ref: IDLE<44>-Footnote-234299916 +Ref: IDLE<44>-Footnote-244299982 +Ref: IDLE<44>-Footnote-254300048 +Ref: IDLE<44>-Footnote-264300114 +Ref: IDLE<44>-Footnote-274300180 +Ref: IDLE<44>-Footnote-284300246 +Node: Documentation<55>4300312 +Ref: whatsnew/changelog id5184300421 +Ref: 15a24300421 +Ref: Documentation<55>-Footnote-14301217 +Ref: Documentation<55>-Footnote-24301282 +Ref: Documentation<55>-Footnote-34301346 +Ref: Documentation<55>-Footnote-44301411 +Ref: Documentation<55>-Footnote-54301476 +Node: Tests<56>4301541 +Ref: whatsnew/changelog id5194301651 +Ref: 15a34301651 +Ref: Tests<56>-Footnote-14303407 +Ref: Tests<56>-Footnote-24303472 +Ref: Tests<56>-Footnote-34303537 +Ref: Tests<56>-Footnote-44303602 +Ref: Tests<56>-Footnote-54303667 +Ref: Tests<56>-Footnote-64303732 +Ref: Tests<56>-Footnote-74303797 +Ref: Tests<56>-Footnote-84303862 +Ref: Tests<56>-Footnote-94303927 +Ref: Tests<56>-Footnote-104303992 +Ref: Tests<56>-Footnote-114304058 +Ref: Tests<56>-Footnote-124304124 +Ref: Tests<56>-Footnote-134304190 +Node: Build<61>4304256 +Ref: whatsnew/changelog id5204304360 +Ref: 15a44304360 +Ref: Build<61>-Footnote-14307090 +Ref: Build<61>-Footnote-24307155 +Ref: Build<61>-Footnote-34307220 +Ref: Build<61>-Footnote-44307285 +Ref: Build<61>-Footnote-54307350 +Ref: Build<61>-Footnote-64307415 +Ref: Build<61>-Footnote-74307480 +Ref: Build<61>-Footnote-84307545 +Ref: Build<61>-Footnote-94307610 +Ref: Build<61>-Footnote-104307675 +Ref: Build<61>-Footnote-114307741 +Ref: Build<61>-Footnote-124307807 +Ref: Build<61>-Footnote-134307873 +Ref: Build<61>-Footnote-144307939 +Ref: Build<61>-Footnote-154308005 +Ref: Build<61>-Footnote-164308071 +Ref: Build<61>-Footnote-174308137 +Ref: Build<61>-Footnote-184308203 +Ref: Build<61>-Footnote-194308269 +Node: Windows<53>4308335 +Ref: whatsnew/changelog id5214308445 +Ref: 15a54308445 +Ref: Windows<53>-Footnote-14309093 +Ref: Windows<53>-Footnote-24309158 +Ref: Windows<53>-Footnote-34309223 +Ref: Windows<53>-Footnote-44309288 +Ref: Windows<53>-Footnote-54309353 +Ref: Windows<53>-Footnote-64309418 +Node: Tools/Demos<31>4309483 +Ref: whatsnew/changelog id5224309593 +Ref: 15a64309593 +Ref: Tools/Demos<31>-Footnote-14310383 +Ref: Tools/Demos<31>-Footnote-24310448 +Ref: Tools/Demos<31>-Footnote-34310513 +Ref: Tools/Demos<31>-Footnote-44310578 +Ref: Tools/Demos<31>-Footnote-54310643 +Ref: Tools/Demos<31>-Footnote-64310708 +Node: C API<49>4310773 +Ref: whatsnew/changelog id5234310863 +Ref: 15a74310863 +Ref: C API<49>-Footnote-14311360 +Ref: C API<49>-Footnote-24311425 +Node: Python 3 5 5 final4311490 +Ref: whatsnew/changelog python-3-5-5-final4311624 +Ref: 15a84311624 +Node: Python 3 5 5 release candidate 14311752 +Ref: whatsnew/changelog python-3-5-5-release-candidate-14311884 +Ref: 15a94311884 +Node: Security<33>4312099 +Ref: whatsnew/changelog id5244312210 +Ref: 15aa4312210 +Ref: Security<33>-Footnote-14313478 +Ref: Security<33>-Footnote-24313543 +Ref: Security<33>-Footnote-34313608 +Ref: Security<33>-Footnote-44313673 +Ref: Security<33>-Footnote-54313738 +Node: Core and Builtins<63>4313803 +Ref: whatsnew/changelog id5254313934 +Ref: 15ab4313934 +Ref: Core and Builtins<63>-Footnote-14314159 +Node: Library<62>4314224 +Ref: whatsnew/changelog id5264314334 +Ref: 15ac4314334 +Ref: Library<62>-Footnote-14314861 +Ref: Library<62>-Footnote-24314926 +Node: Python 3 5 4 final4314991 +Ref: whatsnew/changelog python-3-5-4-final4315137 +Ref: 15ad4315137 +Node: Library<63>4315254 +Ref: whatsnew/changelog id5274315320 +Ref: 15ae4315320 +Ref: Library<63>-Footnote-14315519 +Node: Python 3 5 4 release candidate 14315584 +Ref: whatsnew/changelog python-3-5-4-release-candidate-14315716 +Ref: 15af4315716 +Node: Security<34>4316051 +Ref: whatsnew/changelog id5284316162 +Ref: 15b04316162 +Ref: Security<34>-Footnote-14317461 +Ref: Security<34>-Footnote-24317526 +Ref: Security<34>-Footnote-34317591 +Ref: Security<34>-Footnote-44317656 +Node: Core and Builtins<64>4317721 +Ref: whatsnew/changelog id5294317852 +Ref: 15b14317852 +Ref: Core and Builtins<64>-Footnote-14320107 +Ref: Core and Builtins<64>-Footnote-24320172 +Ref: Core and Builtins<64>-Footnote-34320237 +Ref: Core and Builtins<64>-Footnote-44320302 +Ref: Core and Builtins<64>-Footnote-54320367 +Ref: Core and Builtins<64>-Footnote-64320432 +Ref: Core and Builtins<64>-Footnote-74320497 +Ref: Core and Builtins<64>-Footnote-84320562 +Ref: Core and Builtins<64>-Footnote-94320627 +Ref: Core and Builtins<64>-Footnote-104320692 +Ref: Core and Builtins<64>-Footnote-114320758 +Ref: Core and Builtins<64>-Footnote-124320824 +Ref: Core and Builtins<64>-Footnote-134320890 +Ref: Core and Builtins<64>-Footnote-144320956 +Ref: Core and Builtins<64>-Footnote-154321022 +Node: Library<64>4321088 +Ref: whatsnew/changelog id5304321224 +Ref: 15b24321224 +Ref: Library<64>-Footnote-14331426 +Ref: Library<64>-Footnote-24331491 +Ref: Library<64>-Footnote-34331556 +Ref: Library<64>-Footnote-44331621 +Ref: Library<64>-Footnote-54331686 +Ref: Library<64>-Footnote-64331751 +Ref: Library<64>-Footnote-74331816 +Ref: Library<64>-Footnote-84331881 +Ref: Library<64>-Footnote-94331946 +Ref: Library<64>-Footnote-104332011 +Ref: Library<64>-Footnote-114332077 +Ref: Library<64>-Footnote-124332143 +Ref: Library<64>-Footnote-134332209 +Ref: Library<64>-Footnote-144332275 +Ref: Library<64>-Footnote-154332341 +Ref: Library<64>-Footnote-164332407 +Ref: Library<64>-Footnote-174332473 +Ref: Library<64>-Footnote-184332539 +Ref: Library<64>-Footnote-194332605 +Ref: Library<64>-Footnote-204332671 +Ref: Library<64>-Footnote-214332737 +Ref: Library<64>-Footnote-224332803 +Ref: Library<64>-Footnote-234332869 +Ref: Library<64>-Footnote-244332935 +Ref: Library<64>-Footnote-254333001 +Ref: Library<64>-Footnote-264333067 +Ref: Library<64>-Footnote-274333133 +Ref: Library<64>-Footnote-284333199 +Ref: Library<64>-Footnote-294333265 +Ref: Library<64>-Footnote-304333331 +Ref: Library<64>-Footnote-314333397 +Ref: Library<64>-Footnote-324333463 +Ref: Library<64>-Footnote-334333529 +Ref: Library<64>-Footnote-344333595 +Ref: Library<64>-Footnote-354333661 +Ref: Library<64>-Footnote-364333727 +Ref: Library<64>-Footnote-374333793 +Ref: Library<64>-Footnote-384333859 +Ref: Library<64>-Footnote-394333925 +Ref: Library<64>-Footnote-404333991 +Ref: Library<64>-Footnote-414334057 +Ref: Library<64>-Footnote-424334123 +Ref: Library<64>-Footnote-434334189 +Ref: Library<64>-Footnote-444334255 +Ref: Library<64>-Footnote-454334321 +Ref: Library<64>-Footnote-464334387 +Ref: Library<64>-Footnote-474334453 +Ref: Library<64>-Footnote-484334519 +Ref: Library<64>-Footnote-494334585 +Ref: Library<64>-Footnote-504334651 +Ref: Library<64>-Footnote-514334717 +Ref: Library<64>-Footnote-524334783 +Ref: Library<64>-Footnote-534334849 +Ref: Library<64>-Footnote-544334915 +Ref: Library<64>-Footnote-554334980 +Ref: Library<64>-Footnote-564335046 +Ref: Library<64>-Footnote-574335112 +Ref: Library<64>-Footnote-584335178 +Ref: Library<64>-Footnote-594335244 +Ref: Library<64>-Footnote-604335310 +Ref: Library<64>-Footnote-614335376 +Ref: Library<64>-Footnote-624335442 +Ref: Library<64>-Footnote-634335508 +Ref: Library<64>-Footnote-644335574 +Ref: Library<64>-Footnote-654335640 +Ref: Library<64>-Footnote-664335706 +Ref: Library<64>-Footnote-674335772 +Ref: Library<64>-Footnote-684335838 +Ref: Library<64>-Footnote-694335904 +Ref: Library<64>-Footnote-704335970 +Ref: Library<64>-Footnote-714336036 +Ref: Library<64>-Footnote-724336102 +Ref: Library<64>-Footnote-734336168 +Ref: Library<64>-Footnote-744336234 +Node: Documentation<56>4336300 +Ref: whatsnew/changelog id5314336424 +Ref: 15b34336424 +Ref: Documentation<56>-Footnote-14337134 +Ref: Documentation<56>-Footnote-24337199 +Ref: Documentation<56>-Footnote-34337264 +Ref: Documentation<56>-Footnote-44337329 +Ref: Documentation<56>-Footnote-54337394 +Ref: Documentation<56>-Footnote-64337459 +Node: Tests<57>4337524 +Ref: whatsnew/changelog id5324337646 +Ref: 15b44337646 +Ref: Tests<57>-Footnote-14339753 +Ref: Tests<57>-Footnote-24339818 +Ref: Tests<57>-Footnote-34339883 +Ref: Tests<57>-Footnote-44339948 +Ref: Tests<57>-Footnote-54340013 +Ref: Tests<57>-Footnote-64340078 +Ref: Tests<57>-Footnote-74340143 +Ref: Tests<57>-Footnote-84340208 +Ref: Tests<57>-Footnote-94340273 +Node: Build<62>4340338 +Ref: whatsnew/changelog id5334340454 +Ref: 15b54340454 +Ref: Build<62>-Footnote-14340970 +Ref: Build<62>-Footnote-24341035 +Ref: Build<62>-Footnote-34341100 +Node: Windows<54>4341165 +Ref: whatsnew/changelog id5344341281 +Ref: 15b64341281 +Ref: Windows<54>-Footnote-14341539 +Ref: Windows<54>-Footnote-24341604 +Node: C API<50>4341669 +Ref: whatsnew/changelog id5354341767 +Ref: 15b74341767 +Ref: C API<50>-Footnote-14342374 +Ref: C API<50>-Footnote-24342439 +Node: Python 3 5 3 final4342504 +Ref: whatsnew/changelog python-3-5-3-final4342650 +Ref: 15b84342650 +Node: Python 3 5 3 release candidate 14342795 +Ref: whatsnew/changelog python-3-5-3-release-candidate-14342927 +Ref: 15b94342927 +Node: Security<35>4343312 +Ref: whatsnew/changelog id5364343423 +Ref: 15ba4343423 +Ref: Security<35>-Footnote-14343801 +Ref: Security<35>-Footnote-24343866 +Node: Core and Builtins<65>4343931 +Ref: whatsnew/changelog id5374344062 +Ref: 15bb4344062 +Ref: Core and Builtins<65>-Footnote-14349520 +Ref: Core and Builtins<65>-Footnote-24349585 +Ref: Core and Builtins<65>-Footnote-34349650 +Ref: Core and Builtins<65>-Footnote-44349715 +Ref: Core and Builtins<65>-Footnote-54349780 +Ref: Core and Builtins<65>-Footnote-64349845 +Ref: Core and Builtins<65>-Footnote-74349910 +Ref: Core and Builtins<65>-Footnote-84349975 +Ref: Core and Builtins<65>-Footnote-94350040 +Ref: Core and Builtins<65>-Footnote-104350105 +Ref: Core and Builtins<65>-Footnote-114350171 +Ref: Core and Builtins<65>-Footnote-124350237 +Ref: Core and Builtins<65>-Footnote-134350303 +Ref: Core and Builtins<65>-Footnote-144350369 +Ref: Core and Builtins<65>-Footnote-154350435 +Ref: Core and Builtins<65>-Footnote-164350501 +Ref: Core and Builtins<65>-Footnote-174350567 +Ref: Core and Builtins<65>-Footnote-184350633 +Ref: Core and Builtins<65>-Footnote-194350699 +Ref: Core and Builtins<65>-Footnote-204350765 +Ref: Core and Builtins<65>-Footnote-214350831 +Ref: Core and Builtins<65>-Footnote-224350897 +Ref: Core and Builtins<65>-Footnote-234350963 +Ref: Core and Builtins<65>-Footnote-244351029 +Ref: Core and Builtins<65>-Footnote-254351095 +Ref: Core and Builtins<65>-Footnote-264351161 +Ref: Core and Builtins<65>-Footnote-274351227 +Ref: Core and Builtins<65>-Footnote-284351293 +Ref: Core and Builtins<65>-Footnote-294351359 +Ref: Core and Builtins<65>-Footnote-304351425 +Ref: Core and Builtins<65>-Footnote-314351491 +Ref: Core and Builtins<65>-Footnote-324351557 +Ref: Core and Builtins<65>-Footnote-334351623 +Ref: Core and Builtins<65>-Footnote-344351689 +Ref: Core and Builtins<65>-Footnote-354351755 +Ref: Core and Builtins<65>-Footnote-364351821 +Ref: Core and Builtins<65>-Footnote-374351887 +Ref: Core and Builtins<65>-Footnote-384351953 +Ref: Core and Builtins<65>-Footnote-394352019 +Ref: Core and Builtins<65>-Footnote-404352085 +Ref: Core and Builtins<65>-Footnote-414352151 +Ref: Core and Builtins<65>-Footnote-424352217 +Ref: Core and Builtins<65>-Footnote-434352283 +Node: Library<65>4352349 +Ref: whatsnew/changelog id5384352476 +Ref: 15bc4352476 +Ref: Library<65>-Footnote-14368478 +Ref: Library<65>-Footnote-24368543 +Ref: Library<65>-Footnote-34368608 +Ref: Library<65>-Footnote-44368673 +Ref: Library<65>-Footnote-54368738 +Ref: Library<65>-Footnote-64368802 +Ref: Library<65>-Footnote-74368867 +Ref: Library<65>-Footnote-84368932 +Ref: Library<65>-Footnote-94368997 +Ref: Library<65>-Footnote-104369062 +Ref: Library<65>-Footnote-114369128 +Ref: Library<65>-Footnote-124369194 +Ref: Library<65>-Footnote-134369260 +Ref: Library<65>-Footnote-144369326 +Ref: Library<65>-Footnote-154369392 +Ref: Library<65>-Footnote-164369458 +Ref: Library<65>-Footnote-174369524 +Ref: Library<65>-Footnote-184369590 +Ref: Library<65>-Footnote-194369656 +Ref: Library<65>-Footnote-204369722 +Ref: Library<65>-Footnote-214369788 +Ref: Library<65>-Footnote-224369854 +Ref: Library<65>-Footnote-234369920 +Ref: Library<65>-Footnote-244369986 +Ref: Library<65>-Footnote-254370052 +Ref: Library<65>-Footnote-264370118 +Ref: Library<65>-Footnote-274370184 +Ref: Library<65>-Footnote-284370250 +Ref: Library<65>-Footnote-294370316 +Ref: Library<65>-Footnote-304370382 +Ref: Library<65>-Footnote-314370448 +Ref: Library<65>-Footnote-324370514 +Ref: Library<65>-Footnote-334370582 +Ref: Library<65>-Footnote-344370648 +Ref: Library<65>-Footnote-354370714 +Ref: Library<65>-Footnote-364370780 +Ref: Library<65>-Footnote-374370846 +Ref: Library<65>-Footnote-384370912 +Ref: Library<65>-Footnote-394370978 +Ref: Library<65>-Footnote-404371044 +Ref: Library<65>-Footnote-414371110 +Ref: Library<65>-Footnote-424371176 +Ref: Library<65>-Footnote-434371242 +Ref: Library<65>-Footnote-444371308 +Ref: Library<65>-Footnote-454371374 +Ref: Library<65>-Footnote-464371440 +Ref: Library<65>-Footnote-474371506 +Ref: Library<65>-Footnote-484371572 +Ref: Library<65>-Footnote-494371638 +Ref: Library<65>-Footnote-504371704 +Ref: Library<65>-Footnote-514371770 +Ref: Library<65>-Footnote-524371836 +Ref: Library<65>-Footnote-534371902 +Ref: Library<65>-Footnote-544371968 +Ref: Library<65>-Footnote-554372034 +Ref: Library<65>-Footnote-564372100 +Ref: Library<65>-Footnote-574372166 +Ref: Library<65>-Footnote-584372232 +Ref: Library<65>-Footnote-594372298 +Ref: Library<65>-Footnote-604372364 +Ref: Library<65>-Footnote-614372430 +Ref: Library<65>-Footnote-624372496 +Ref: Library<65>-Footnote-634372562 +Ref: Library<65>-Footnote-644372628 +Ref: Library<65>-Footnote-654372694 +Ref: Library<65>-Footnote-664372760 +Ref: Library<65>-Footnote-674372826 +Ref: Library<65>-Footnote-684372892 +Ref: Library<65>-Footnote-694372958 +Ref: Library<65>-Footnote-704373024 +Ref: Library<65>-Footnote-714373090 +Ref: Library<65>-Footnote-724373155 +Ref: Library<65>-Footnote-734373221 +Ref: Library<65>-Footnote-744373287 +Ref: Library<65>-Footnote-754373353 +Ref: Library<65>-Footnote-764373419 +Ref: Library<65>-Footnote-774373485 +Ref: Library<65>-Footnote-784373551 +Ref: Library<65>-Footnote-794373617 +Ref: Library<65>-Footnote-804373683 +Ref: Library<65>-Footnote-814373749 +Ref: Library<65>-Footnote-824373815 +Ref: Library<65>-Footnote-834373881 +Ref: Library<65>-Footnote-844373947 +Ref: Library<65>-Footnote-854374013 +Ref: Library<65>-Footnote-864374079 +Ref: Library<65>-Footnote-874374145 +Ref: Library<65>-Footnote-884374211 +Ref: Library<65>-Footnote-894374277 +Ref: Library<65>-Footnote-904374343 +Ref: Library<65>-Footnote-914374409 +Ref: Library<65>-Footnote-924374475 +Ref: Library<65>-Footnote-934374541 +Ref: Library<65>-Footnote-944374607 +Ref: Library<65>-Footnote-954374673 +Ref: Library<65>-Footnote-964374716 +Ref: Library<65>-Footnote-974374782 +Ref: Library<65>-Footnote-984374848 +Ref: Library<65>-Footnote-994374914 +Ref: Library<65>-Footnote-1004374980 +Ref: Library<65>-Footnote-1014375047 +Ref: Library<65>-Footnote-1024375114 +Ref: Library<65>-Footnote-1034375181 +Ref: Library<65>-Footnote-1044375248 +Ref: Library<65>-Footnote-1054375315 +Ref: Library<65>-Footnote-1064375382 +Ref: Library<65>-Footnote-1074375449 +Ref: Library<65>-Footnote-1084375516 +Ref: Library<65>-Footnote-1094375583 +Ref: Library<65>-Footnote-1104375650 +Ref: Library<65>-Footnote-1114375717 +Ref: Library<65>-Footnote-1124375784 +Ref: Library<65>-Footnote-1134375851 +Ref: Library<65>-Footnote-1144375918 +Ref: Library<65>-Footnote-1154375985 +Ref: Library<65>-Footnote-1164376052 +Ref: Library<65>-Footnote-1174376119 +Ref: Library<65>-Footnote-1184376186 +Ref: Library<65>-Footnote-1194376253 +Ref: Library<65>-Footnote-1204376320 +Ref: Library<65>-Footnote-1214376387 +Ref: Library<65>-Footnote-1224376454 +Ref: Library<65>-Footnote-1234376521 +Ref: Library<65>-Footnote-1244376588 +Node: IDLE<45>4376655 +Ref: whatsnew/changelog id5394376770 +Ref: 15bd4376770 +Ref: IDLE<45>-Footnote-14378019 +Ref: IDLE<45>-Footnote-24378084 +Ref: IDLE<45>-Footnote-34378149 +Ref: IDLE<45>-Footnote-44378214 +Ref: IDLE<45>-Footnote-54378279 +Ref: IDLE<45>-Footnote-64378344 +Ref: IDLE<45>-Footnote-74378409 +Ref: IDLE<45>-Footnote-84378474 +Node: C API<51>4378539 +Ref: whatsnew/changelog id5404378660 +Ref: 15be4378660 +Ref: C API<51>-Footnote-14378990 +Ref: C API<51>-Footnote-24379055 +Node: Documentation<57>4379120 +Ref: whatsnew/changelog id5414379242 +Ref: 15bf4379242 +Ref: Documentation<57>-Footnote-14379393 +Node: Tests<58>4379458 +Ref: whatsnew/changelog id5424379586 +Ref: 15c04379586 +Ref: Tests<58>-Footnote-14380277 +Ref: Tests<58>-Footnote-24380342 +Ref: Tests<58>-Footnote-34380407 +Ref: Tests<58>-Footnote-44380472 +Ref: Tests<58>-Footnote-54380537 +Ref: Tests<58>-Footnote-64380602 +Node: Tools/Demos<32>4380667 +Ref: whatsnew/changelog id5434380789 +Ref: 15c14380789 +Ref: Tools/Demos<32>-Footnote-14381271 +Ref: Tools/Demos<32>-Footnote-24381336 +Ref: Tools/Demos<32>-Footnote-34381401 +Node: Windows<55>4381466 +Ref: whatsnew/changelog id5444381588 +Ref: 15c24381588 +Ref: Windows<55>-Footnote-14382088 +Ref: Windows<55>-Footnote-24382153 +Ref: Windows<55>-Footnote-34382218 +Ref: Windows<55>-Footnote-44382283 +Ref: Windows<55>-Footnote-54382348 +Node: Build<63>4382413 +Ref: whatsnew/changelog id5454382511 +Ref: 15c34382511 +Ref: Build<63>-Footnote-14385218 +Ref: Build<63>-Footnote-24385283 +Ref: Build<63>-Footnote-34385348 +Ref: Build<63>-Footnote-44385413 +Ref: Build<63>-Footnote-54385478 +Ref: Build<63>-Footnote-64385543 +Ref: Build<63>-Footnote-74385608 +Ref: Build<63>-Footnote-84385673 +Ref: Build<63>-Footnote-94385738 +Ref: Build<63>-Footnote-104385803 +Ref: Build<63>-Footnote-114385869 +Ref: Build<63>-Footnote-124385935 +Ref: Build<63>-Footnote-134386001 +Ref: Build<63>-Footnote-144386067 +Ref: Build<63>-Footnote-154386133 +Ref: Build<63>-Footnote-164386199 +Ref: Build<63>-Footnote-174386265 +Ref: Build<63>-Footnote-184386331 +Ref: Build<63>-Footnote-194386397 +Ref: Build<63>-Footnote-204386463 +Ref: Build<63>-Footnote-214386529 +Ref: Build<63>-Footnote-224386595 +Node: Python 3 5 2 final4386661 +Ref: whatsnew/changelog python-3-5-2-final4386807 +Ref: 15c44386807 +Node: Core and Builtins<66>4386982 +Ref: whatsnew/changelog id5464387076 +Ref: 15c54387076 +Ref: Core and Builtins<66>-Footnote-14387234 +Node: Tests<59>4387299 +Ref: whatsnew/changelog id5474387410 +Ref: 15c64387410 +Ref: Tests<59>-Footnote-14387570 +Node: IDLE<46>4387635 +Ref: whatsnew/changelog id5484387716 +Ref: 15c74387716 +Ref: IDLE<46>-Footnote-14387870 +Node: Python 3 5 2 release candidate 14387935 +Ref: whatsnew/changelog python-3-5-2-release-candidate-14388067 +Ref: 15c84388067 +Node: Security<36>4388432 +Ref: whatsnew/changelog id5494388543 +Ref: 15c94388543 +Ref: Security<36>-Footnote-14389443 +Ref: Security<36>-Footnote-24389508 +Ref: Security<36>-Footnote-34389573 +Ref: Security<36>-Footnote-44389638 +Ref: Security<36>-Footnote-54389703 +Node: Core and Builtins<67>4389768 +Ref: whatsnew/changelog id5504389899 +Ref: 15ca4389899 +Ref: Core and Builtins<67>-Footnote-14395750 +Ref: Core and Builtins<67>-Footnote-24395815 +Ref: Core and Builtins<67>-Footnote-34395880 +Ref: Core and Builtins<67>-Footnote-44395945 +Ref: Core and Builtins<67>-Footnote-54396010 +Ref: Core and Builtins<67>-Footnote-64396075 +Ref: Core and Builtins<67>-Footnote-74396140 +Ref: Core and Builtins<67>-Footnote-84396205 +Ref: Core and Builtins<67>-Footnote-94396270 +Ref: Core and Builtins<67>-Footnote-104396335 +Ref: Core and Builtins<67>-Footnote-114396401 +Ref: Core and Builtins<67>-Footnote-124396467 +Ref: Core and Builtins<67>-Footnote-134396533 +Ref: Core and Builtins<67>-Footnote-144396599 +Ref: Core and Builtins<67>-Footnote-154396665 +Ref: Core and Builtins<67>-Footnote-164396731 +Ref: Core and Builtins<67>-Footnote-174396797 +Ref: Core and Builtins<67>-Footnote-184396862 +Ref: Core and Builtins<67>-Footnote-194396928 +Ref: Core and Builtins<67>-Footnote-204396994 +Ref: Core and Builtins<67>-Footnote-214397060 +Ref: Core and Builtins<67>-Footnote-224397126 +Ref: Core and Builtins<67>-Footnote-234397192 +Ref: Core and Builtins<67>-Footnote-244397258 +Ref: Core and Builtins<67>-Footnote-254397324 +Ref: Core and Builtins<67>-Footnote-264397390 +Ref: Core and Builtins<67>-Footnote-274397456 +Ref: Core and Builtins<67>-Footnote-284397522 +Ref: Core and Builtins<67>-Footnote-294397588 +Ref: Core and Builtins<67>-Footnote-304397654 +Ref: Core and Builtins<67>-Footnote-314397720 +Ref: Core and Builtins<67>-Footnote-324397763 +Ref: Core and Builtins<67>-Footnote-334397829 +Ref: Core and Builtins<67>-Footnote-344397895 +Ref: Core and Builtins<67>-Footnote-354397961 +Ref: Core and Builtins<67>-Footnote-364398027 +Ref: Core and Builtins<67>-Footnote-374398093 +Ref: Core and Builtins<67>-Footnote-384398159 +Node: Library<66>4398225 +Ref: whatsnew/changelog id5514398352 +Ref: 15cb4398352 +Ref: Library<66>-Footnote-14415172 +Ref: Library<66>-Footnote-24415237 +Ref: Library<66>-Footnote-34415302 +Ref: Library<66>-Footnote-44415344 +Ref: Library<66>-Footnote-54415409 +Ref: Library<66>-Footnote-64415474 +Ref: Library<66>-Footnote-74415539 +Ref: Library<66>-Footnote-84415604 +Ref: Library<66>-Footnote-94415669 +Ref: Library<66>-Footnote-104415734 +Ref: Library<66>-Footnote-114415800 +Ref: Library<66>-Footnote-124415866 +Ref: Library<66>-Footnote-134415932 +Ref: Library<66>-Footnote-144415998 +Ref: Library<66>-Footnote-154416064 +Ref: Library<66>-Footnote-164416130 +Ref: Library<66>-Footnote-174416196 +Ref: Library<66>-Footnote-184416262 +Ref: Library<66>-Footnote-194416328 +Ref: Library<66>-Footnote-204416394 +Ref: Library<66>-Footnote-214416460 +Ref: Library<66>-Footnote-224416526 +Ref: Library<66>-Footnote-234416592 +Ref: Library<66>-Footnote-244416658 +Ref: Library<66>-Footnote-254416724 +Ref: Library<66>-Footnote-264416790 +Ref: Library<66>-Footnote-274416856 +Ref: Library<66>-Footnote-284416922 +Ref: Library<66>-Footnote-294416988 +Ref: Library<66>-Footnote-304417054 +Ref: Library<66>-Footnote-314417120 +Ref: Library<66>-Footnote-324417186 +Ref: Library<66>-Footnote-334417252 +Ref: Library<66>-Footnote-344417318 +Ref: Library<66>-Footnote-354417384 +Ref: Library<66>-Footnote-364417450 +Ref: Library<66>-Footnote-374417516 +Ref: Library<66>-Footnote-384417582 +Ref: Library<66>-Footnote-394417648 +Ref: Library<66>-Footnote-404417714 +Ref: Library<66>-Footnote-414417780 +Ref: Library<66>-Footnote-424417846 +Ref: Library<66>-Footnote-434417912 +Ref: Library<66>-Footnote-444417978 +Ref: Library<66>-Footnote-454418044 +Ref: Library<66>-Footnote-464418110 +Ref: Library<66>-Footnote-474418176 +Ref: Library<66>-Footnote-484418242 +Ref: Library<66>-Footnote-494418308 +Ref: Library<66>-Footnote-504418374 +Ref: Library<66>-Footnote-514418440 +Ref: Library<66>-Footnote-524418506 +Ref: Library<66>-Footnote-534418572 +Ref: Library<66>-Footnote-544418638 +Ref: Library<66>-Footnote-554418704 +Ref: Library<66>-Footnote-564418770 +Ref: Library<66>-Footnote-574418836 +Ref: Library<66>-Footnote-584418902 +Ref: Library<66>-Footnote-594418968 +Ref: Library<66>-Footnote-604419034 +Ref: Library<66>-Footnote-614419100 +Ref: Library<66>-Footnote-624419165 +Ref: Library<66>-Footnote-634419231 +Ref: Library<66>-Footnote-644419297 +Ref: Library<66>-Footnote-654419363 +Ref: Library<66>-Footnote-664419429 +Ref: Library<66>-Footnote-674419495 +Ref: Library<66>-Footnote-684419561 +Ref: Library<66>-Footnote-694419627 +Ref: Library<66>-Footnote-704419693 +Ref: Library<66>-Footnote-714419759 +Ref: Library<66>-Footnote-724419825 +Ref: Library<66>-Footnote-734419891 +Ref: Library<66>-Footnote-744419957 +Ref: Library<66>-Footnote-754420023 +Ref: Library<66>-Footnote-764420089 +Ref: Library<66>-Footnote-774420155 +Ref: Library<66>-Footnote-784420221 +Ref: Library<66>-Footnote-794420287 +Ref: Library<66>-Footnote-804420353 +Ref: Library<66>-Footnote-814420419 +Ref: Library<66>-Footnote-824420485 +Ref: Library<66>-Footnote-834420551 +Ref: Library<66>-Footnote-844420617 +Ref: Library<66>-Footnote-854420683 +Ref: Library<66>-Footnote-864420749 +Ref: Library<66>-Footnote-874420815 +Ref: Library<66>-Footnote-884420881 +Ref: Library<66>-Footnote-894420947 +Ref: Library<66>-Footnote-904421013 +Ref: Library<66>-Footnote-914421079 +Ref: Library<66>-Footnote-924421145 +Ref: Library<66>-Footnote-934421211 +Ref: Library<66>-Footnote-944421277 +Ref: Library<66>-Footnote-954421343 +Ref: Library<66>-Footnote-964421409 +Ref: Library<66>-Footnote-974421475 +Ref: Library<66>-Footnote-984421541 +Ref: Library<66>-Footnote-994421607 +Ref: Library<66>-Footnote-1004421673 +Ref: Library<66>-Footnote-1014421740 +Ref: Library<66>-Footnote-1024421806 +Ref: Library<66>-Footnote-1034421873 +Ref: Library<66>-Footnote-1044421940 +Ref: Library<66>-Footnote-1054422007 +Ref: Library<66>-Footnote-1064422074 +Ref: Library<66>-Footnote-1074422141 +Ref: Library<66>-Footnote-1084422208 +Ref: Library<66>-Footnote-1094422275 +Ref: Library<66>-Footnote-1104422342 +Ref: Library<66>-Footnote-1114422409 +Ref: Library<66>-Footnote-1124422476 +Ref: Library<66>-Footnote-1134422543 +Ref: Library<66>-Footnote-1144422610 +Ref: Library<66>-Footnote-1154422677 +Ref: Library<66>-Footnote-1164422744 +Ref: Library<66>-Footnote-1174422811 +Ref: Library<66>-Footnote-1184422878 +Ref: Library<66>-Footnote-1194422945 +Ref: Library<66>-Footnote-1204423012 +Node: IDLE<47>4423079 +Ref: whatsnew/changelog id5524423202 +Ref: 15cc4423202 +Ref: IDLE<47>-Footnote-14425563 +Ref: IDLE<47>-Footnote-24425627 +Ref: IDLE<47>-Footnote-34425692 +Ref: IDLE<47>-Footnote-44425757 +Ref: IDLE<47>-Footnote-54425822 +Ref: IDLE<47>-Footnote-64425887 +Ref: IDLE<47>-Footnote-74425952 +Ref: IDLE<47>-Footnote-84426017 +Ref: IDLE<47>-Footnote-94426082 +Ref: IDLE<47>-Footnote-104426147 +Ref: IDLE<47>-Footnote-114426213 +Ref: IDLE<47>-Footnote-124426279 +Ref: IDLE<47>-Footnote-134426345 +Ref: IDLE<47>-Footnote-144426411 +Ref: IDLE<47>-Footnote-154426477 +Node: Documentation<58>4426543 +Ref: whatsnew/changelog id5534426664 +Ref: 15cd4426664 +Ref: Documentation<58>-Footnote-14427622 +Ref: Documentation<58>-Footnote-24427687 +Ref: Documentation<58>-Footnote-34427752 +Ref: Documentation<58>-Footnote-44427794 +Ref: Documentation<58>-Footnote-54427859 +Ref: Documentation<58>-Footnote-64427923 +Ref: Documentation<58>-Footnote-74427988 +Ref: Documentation<58>-Footnote-84428053 +Node: Tests<60>4428118 +Ref: whatsnew/changelog id5544428240 +Ref: 15ce4428240 +Ref: Tests<60>-Footnote-14429113 +Ref: Tests<60>-Footnote-24429178 +Ref: Tests<60>-Footnote-34429243 +Ref: Tests<60>-Footnote-44429308 +Ref: Tests<60>-Footnote-54429373 +Ref: Tests<60>-Footnote-64429438 +Ref: Tests<60>-Footnote-74429503 +Node: Build<64>4429568 +Ref: whatsnew/changelog id5554429684 +Ref: 15cf4429684 +Ref: Build<64>-Footnote-14432210 +Ref: Build<64>-Footnote-24432275 +Ref: Build<64>-Footnote-34432340 +Ref: Build<64>-Footnote-44432405 +Ref: Build<64>-Footnote-54432470 +Ref: Build<64>-Footnote-64432535 +Ref: Build<64>-Footnote-74432600 +Ref: Build<64>-Footnote-84432665 +Ref: Build<64>-Footnote-94432730 +Ref: Build<64>-Footnote-104432795 +Ref: Build<64>-Footnote-114432861 +Ref: Build<64>-Footnote-124432927 +Ref: Build<64>-Footnote-134432993 +Ref: Build<64>-Footnote-144433059 +Ref: Build<64>-Footnote-154433125 +Ref: Build<64>-Footnote-164433191 +Ref: Build<64>-Footnote-174433257 +Node: Windows<56>4433323 +Ref: whatsnew/changelog id5564433445 +Ref: 15d04433445 +Ref: Windows<56>-Footnote-14434153 +Ref: Windows<56>-Footnote-24434218 +Ref: Windows<56>-Footnote-34434283 +Ref: Windows<56>-Footnote-44434348 +Ref: Windows<56>-Footnote-54434413 +Ref: Windows<56>-Footnote-64434478 +Node: Tools/Demos<33>4434543 +Ref: whatsnew/changelog id5574434647 +Ref: 15d14434647 +Ref: Tools/Demos<33>-Footnote-14435269 +Ref: Tools/Demos<33>-Footnote-24435334 +Ref: Tools/Demos<33>-Footnote-34435399 +Ref: Tools/Demos<33>-Footnote-44435464 +Node: Python 3 5 1 final4435529 +Ref: whatsnew/changelog python-3-5-1-final4435675 +Ref: 15d24435675 +Node: Core and Builtins<68>4435836 +Ref: whatsnew/changelog id5584435932 +Ref: 15d34435932 +Ref: Core and Builtins<68>-Footnote-14436116 +Node: Windows<57>4436181 +Ref: whatsnew/changelog id5594436277 +Ref: 15d44436277 +Ref: Windows<57>-Footnote-14436467 +Node: Python 3 5 1 release candidate 14436532 +Ref: whatsnew/changelog python-3-5-1-release-candidate-14436664 +Ref: 15d54436664 +Node: Core and Builtins<69>4437003 +Ref: whatsnew/changelog id5604437113 +Ref: 15d64437113 +Ref: Core and Builtins<69>-Footnote-14440253 +Ref: Core and Builtins<69>-Footnote-24440318 +Ref: Core and Builtins<69>-Footnote-34440383 +Ref: Core and Builtins<69>-Footnote-44440448 +Ref: Core and Builtins<69>-Footnote-54440513 +Ref: Core and Builtins<69>-Footnote-64440578 +Ref: Core and Builtins<69>-Footnote-74440643 +Ref: Core and Builtins<69>-Footnote-84440708 +Ref: Core and Builtins<69>-Footnote-94440773 +Ref: Core and Builtins<69>-Footnote-104440838 +Ref: Core and Builtins<69>-Footnote-114440904 +Ref: Core and Builtins<69>-Footnote-124440970 +Ref: Core and Builtins<69>-Footnote-134441036 +Ref: Core and Builtins<69>-Footnote-144441102 +Ref: Core and Builtins<69>-Footnote-154441168 +Ref: Core and Builtins<69>-Footnote-164441234 +Ref: Core and Builtins<69>-Footnote-174441300 +Ref: Core and Builtins<69>-Footnote-184441366 +Ref: Core and Builtins<69>-Footnote-194441432 +Node: Library<67>4441498 +Ref: whatsnew/changelog id5614441625 +Ref: 15d74441625 +Ref: Library<67>-Footnote-14452003 +Ref: Library<67>-Footnote-24452068 +Ref: Library<67>-Footnote-34452133 +Ref: Library<67>-Footnote-44452198 +Ref: Library<67>-Footnote-54452262 +Ref: Library<67>-Footnote-64452327 +Ref: Library<67>-Footnote-74452392 +Ref: Library<67>-Footnote-84452457 +Ref: Library<67>-Footnote-94452522 +Ref: Library<67>-Footnote-104452587 +Ref: Library<67>-Footnote-114452653 +Ref: Library<67>-Footnote-124452719 +Ref: Library<67>-Footnote-134452785 +Ref: Library<67>-Footnote-144452851 +Ref: Library<67>-Footnote-154452917 +Ref: Library<67>-Footnote-164452983 +Ref: Library<67>-Footnote-174453049 +Ref: Library<67>-Footnote-184453115 +Ref: Library<67>-Footnote-194453181 +Ref: Library<67>-Footnote-204453247 +Ref: Library<67>-Footnote-214453313 +Ref: Library<67>-Footnote-224453379 +Ref: Library<67>-Footnote-234453445 +Ref: Library<67>-Footnote-244453511 +Ref: Library<67>-Footnote-254453577 +Ref: Library<67>-Footnote-264453643 +Ref: Library<67>-Footnote-274453709 +Ref: Library<67>-Footnote-284453775 +Ref: Library<67>-Footnote-294453841 +Ref: Library<67>-Footnote-304453907 +Ref: Library<67>-Footnote-314453973 +Ref: Library<67>-Footnote-324454039 +Ref: Library<67>-Footnote-334454105 +Ref: Library<67>-Footnote-344454171 +Ref: Library<67>-Footnote-354454237 +Ref: Library<67>-Footnote-364454303 +Ref: Library<67>-Footnote-374454369 +Ref: Library<67>-Footnote-384454435 +Ref: Library<67>-Footnote-394454501 +Ref: Library<67>-Footnote-404454567 +Ref: Library<67>-Footnote-414454633 +Ref: Library<67>-Footnote-424454699 +Ref: Library<67>-Footnote-434454765 +Ref: Library<67>-Footnote-444454831 +Ref: Library<67>-Footnote-454454897 +Ref: Library<67>-Footnote-464454963 +Ref: Library<67>-Footnote-474455029 +Ref: Library<67>-Footnote-484455095 +Ref: Library<67>-Footnote-494455161 +Ref: Library<67>-Footnote-504455227 +Ref: Library<67>-Footnote-514455293 +Ref: Library<67>-Footnote-524455359 +Ref: Library<67>-Footnote-534455425 +Ref: Library<67>-Footnote-544455491 +Ref: Library<67>-Footnote-554455557 +Ref: Library<67>-Footnote-564455623 +Ref: Library<67>-Footnote-574455689 +Ref: Library<67>-Footnote-584455755 +Ref: Library<67>-Footnote-594455821 +Ref: Library<67>-Footnote-604455887 +Ref: Library<67>-Footnote-614455953 +Ref: Library<67>-Footnote-624456019 +Ref: Library<67>-Footnote-634456085 +Ref: Library<67>-Footnote-644456151 +Ref: Library<67>-Footnote-654456217 +Ref: Library<67>-Footnote-664456283 +Ref: Library<67>-Footnote-674456349 +Ref: Library<67>-Footnote-684456415 +Ref: Library<67>-Footnote-694456481 +Ref: Library<67>-Footnote-704456547 +Node: IDLE<48>4456613 +Ref: whatsnew/changelog id5624456736 +Ref: 15d84456736 +Ref: IDLE<48>-Footnote-14461687 +Ref: IDLE<48>-Footnote-24461752 +Ref: IDLE<48>-Footnote-34461817 +Ref: IDLE<48>-Footnote-44461882 +Ref: IDLE<48>-Footnote-54461947 +Ref: IDLE<48>-Footnote-64462012 +Ref: IDLE<48>-Footnote-74462077 +Ref: IDLE<48>-Footnote-84462142 +Ref: IDLE<48>-Footnote-94462207 +Ref: IDLE<48>-Footnote-104462272 +Ref: IDLE<48>-Footnote-114462338 +Ref: IDLE<48>-Footnote-124462404 +Ref: IDLE<48>-Footnote-134462470 +Ref: IDLE<48>-Footnote-144462536 +Ref: IDLE<48>-Footnote-154462602 +Ref: IDLE<48>-Footnote-164462668 +Ref: IDLE<48>-Footnote-174462734 +Ref: IDLE<48>-Footnote-184462800 +Ref: IDLE<48>-Footnote-194462866 +Ref: IDLE<48>-Footnote-204462932 +Ref: IDLE<48>-Footnote-214462998 +Ref: IDLE<48>-Footnote-224463064 +Ref: IDLE<48>-Footnote-234463130 +Ref: IDLE<48>-Footnote-244463196 +Ref: IDLE<48>-Footnote-254463262 +Node: Documentation<59>4463328 +Ref: whatsnew/changelog id5634463449 +Ref: 15d94463449 +Ref: Documentation<59>-Footnote-14464530 +Ref: Documentation<59>-Footnote-24464595 +Ref: Documentation<59>-Footnote-34464660 +Ref: Documentation<59>-Footnote-44464725 +Ref: Documentation<59>-Footnote-54464790 +Ref: Documentation<59>-Footnote-64464855 +Node: Tests<61>4464920 +Ref: whatsnew/changelog id5644465042 +Ref: 15da4465042 +Ref: Tests<61>-Footnote-14465549 +Ref: Tests<61>-Footnote-24465614 +Ref: Tests<61>-Footnote-34465679 +Node: Build<65>4465744 +Ref: whatsnew/changelog id5654465860 +Ref: 15db4465860 +Ref: Build<65>-Footnote-14466285 +Ref: Build<65>-Footnote-24466350 +Ref: Build<65>-Footnote-34466415 +Node: Windows<58>4466480 +Ref: whatsnew/changelog id5664466602 +Ref: 15dc4466602 +Ref: Windows<58>-Footnote-14467875 +Ref: Windows<58>-Footnote-24467940 +Ref: Windows<58>-Footnote-34468005 +Ref: Windows<58>-Footnote-44468070 +Ref: Windows<58>-Footnote-54468135 +Ref: Windows<58>-Footnote-64468200 +Ref: Windows<58>-Footnote-74468265 +Ref: Windows<58>-Footnote-84468330 +Ref: Windows<58>-Footnote-94468395 +Ref: Windows<58>-Footnote-104468460 +Ref: Windows<58>-Footnote-114468526 +Ref: Windows<58>-Footnote-124468592 +Ref: Windows<58>-Footnote-134468658 +Ref: Windows<58>-Footnote-144468724 +Node: Tools/Demos<34>4468790 +Ref: whatsnew/changelog id5674468894 +Ref: 15dd4468894 +Ref: Tools/Demos<34>-Footnote-14469044 +Node: Python 3 5 0 final4469109 +Ref: whatsnew/changelog python-3-5-0-final4469255 +Ref: 15de4469255 +Node: Build<66>4469368 +Ref: whatsnew/changelog id5684469432 +Ref: 15df4469432 +Ref: Build<66>-Footnote-14469608 +Node: Python 3 5 0 release candidate 44469673 +Ref: whatsnew/changelog python-3-5-0-release-candidate-44469819 +Ref: 15e04469819 +Node: Library<68>4469984 +Ref: whatsnew/changelog id5694470082 +Ref: 15e14470082 +Ref: Library<68>-Footnote-14470211 +Node: Build<67>4470276 +Ref: whatsnew/changelog id5704470374 +Ref: 15e24470374 +Ref: Build<67>-Footnote-14470556 +Node: Python 3 5 0 release candidate 34470621 +Ref: whatsnew/changelog python-3-5-0-release-candidate-34470781 +Ref: 15e34470781 +Node: Core and Builtins<70>4470970 +Ref: whatsnew/changelog id5714471080 +Ref: 15e44471080 +Ref: Core and Builtins<70>-Footnote-14471448 +Ref: Core and Builtins<70>-Footnote-24471513 +Ref: Core and Builtins<70>-Footnote-34471578 +Ref: Core and Builtins<70>-Footnote-44471643 +Node: Library<69>4471685 +Ref: whatsnew/changelog id5724471795 +Ref: 15e54471795 +Ref: Library<69>-Footnote-14472569 +Ref: Library<69>-Footnote-24472634 +Ref: Library<69>-Footnote-34472699 +Ref: Library<69>-Footnote-44472764 +Ref: Library<69>-Footnote-54472829 +Node: Python 3 5 0 release candidate 24472894 +Ref: whatsnew/changelog python-3-5-0-release-candidate-24473054 +Ref: 15e64473054 +Node: Core and Builtins<71>4473243 +Ref: whatsnew/changelog id5734473353 +Ref: 15e74473353 +Ref: Core and Builtins<71>-Footnote-14473897 +Ref: Core and Builtins<71>-Footnote-24473962 +Ref: Core and Builtins<71>-Footnote-34474027 +Node: Library<70>4474092 +Ref: whatsnew/changelog id5744474202 +Ref: 15e84474202 +Ref: Library<70>-Footnote-14474483 +Ref: Library<70>-Footnote-24474548 +Ref: Library<70>-Footnote-34474613 +Node: Python 3 5 0 release candidate 14474678 +Ref: whatsnew/changelog python-3-5-0-release-candidate-14474825 +Ref: 15e94474825 +Node: Core and Builtins<72>4475088 +Ref: whatsnew/changelog id5754475198 +Ref: 15ea4475198 +Ref: Core and Builtins<72>-Footnote-14475376 +Node: Library<71>4475441 +Ref: whatsnew/changelog id5764475568 +Ref: 15eb4475568 +Ref: Library<71>-Footnote-14477150 +Ref: Library<71>-Footnote-24477215 +Ref: Library<71>-Footnote-34477280 +Ref: Library<71>-Footnote-44477345 +Ref: Library<71>-Footnote-54477409 +Ref: Library<71>-Footnote-64477474 +Ref: Library<71>-Footnote-74477539 +Ref: Library<71>-Footnote-84477604 +Ref: Library<71>-Footnote-94477669 +Ref: Library<71>-Footnote-104477734 +Ref: Library<71>-Footnote-114477800 +Ref: Library<71>-Footnote-124477866 +Ref: Library<71>-Footnote-134477932 +Ref: Library<71>-Footnote-144477998 +Ref: Library<71>-Footnote-154478064 +Node: IDLE<49>4478130 +Ref: whatsnew/changelog id5774478253 +Ref: 15ec4478253 +Ref: IDLE<49>-Footnote-14478998 +Ref: IDLE<49>-Footnote-24479063 +Ref: IDLE<49>-Footnote-34479128 +Ref: IDLE<49>-Footnote-44479193 +Node: Documentation<60>4479258 +Ref: whatsnew/changelog id5784479379 +Ref: 15ed4479379 +Ref: Documentation<60>-Footnote-14480039 +Ref: Documentation<60>-Footnote-24480104 +Ref: Documentation<60>-Footnote-34480169 +Ref: Documentation<60>-Footnote-44480234 +Node: Tests<62>4480299 +Ref: whatsnew/changelog id5794480403 +Ref: 15ee4480403 +Ref: Tests<62>-Footnote-14480641 +Node: Python 3 5 0 beta 44480706 +Ref: whatsnew/changelog python-3-5-0-beta-44480840 +Ref: 15ef4480840 +Node: Core and Builtins<73>4481023 +Ref: whatsnew/changelog id5804481120 +Ref: 15f04481120 +Ref: Core and Builtins<73>-Footnote-14481924 +Ref: Core and Builtins<73>-Footnote-24481989 +Ref: Core and Builtins<73>-Footnote-34482054 +Ref: Core and Builtins<73>-Footnote-44482096 +Ref: Core and Builtins<73>-Footnote-54482161 +Ref: Core and Builtins<73>-Footnote-64482226 +Ref: Core and Builtins<73>-Footnote-74482291 +Ref: Core and Builtins<73>-Footnote-84482356 +Node: Library<72>4482421 +Ref: whatsnew/changelog id5814482536 +Ref: 15f14482536 +Ref: Library<72>-Footnote-14484824 +Ref: Library<72>-Footnote-24484889 +Ref: Library<72>-Footnote-34484954 +Ref: Library<72>-Footnote-44485019 +Ref: Library<72>-Footnote-54485084 +Ref: Library<72>-Footnote-64485149 +Ref: Library<72>-Footnote-74485214 +Ref: Library<72>-Footnote-84485279 +Ref: Library<72>-Footnote-94485344 +Ref: Library<72>-Footnote-104485409 +Ref: Library<72>-Footnote-114485475 +Ref: Library<72>-Footnote-124485541 +Ref: Library<72>-Footnote-134485607 +Ref: Library<72>-Footnote-144485673 +Ref: Library<72>-Footnote-154485739 +Ref: Library<72>-Footnote-164485805 +Ref: Library<72>-Footnote-174485871 +Ref: Library<72>-Footnote-184485937 +Ref: Library<72>-Footnote-194486003 +Node: Build<68>4486069 +Ref: whatsnew/changelog id5824486154 +Ref: 15f24486154 +Ref: Build<68>-Footnote-14486317 +Node: Python 3 5 0 beta 34486382 +Ref: whatsnew/changelog python-3-5-0-beta-34486503 +Ref: 15f34486503 +Node: Core and Builtins<74>4486742 +Ref: whatsnew/changelog id5834486839 +Ref: 15f44486839 +Ref: Core and Builtins<74>-Footnote-14488164 +Ref: Core and Builtins<74>-Footnote-24488229 +Ref: Core and Builtins<74>-Footnote-34488294 +Ref: Core and Builtins<74>-Footnote-44488359 +Ref: Core and Builtins<74>-Footnote-54488401 +Ref: Core and Builtins<74>-Footnote-64488466 +Node: Library<73>4488531 +Ref: whatsnew/changelog id5844488646 +Ref: 15f54488646 +Ref: Library<73>-Footnote-14490606 +Ref: Library<73>-Footnote-24490671 +Ref: Library<73>-Footnote-34490736 +Ref: Library<73>-Footnote-44490801 +Ref: Library<73>-Footnote-54490866 +Ref: Library<73>-Footnote-64490931 +Ref: Library<73>-Footnote-74490996 +Ref: Library<73>-Footnote-84491061 +Ref: Library<73>-Footnote-94491126 +Ref: Library<73>-Footnote-104491191 +Ref: Library<73>-Footnote-114491257 +Ref: Library<73>-Footnote-124491323 +Ref: Library<73>-Footnote-134491389 +Ref: Library<73>-Footnote-144491455 +Ref: Library<73>-Footnote-154491521 +Ref: Library<73>-Footnote-164491587 +Ref: Library<73>-Footnote-174491653 +Ref: Library<73>-Footnote-184491719 +Node: Tests<63>4491785 +Ref: whatsnew/changelog id5854491896 +Ref: 15f64491896 +Ref: Tests<63>-Footnote-14492176 +Ref: Tests<63>-Footnote-24492241 +Node: Documentation<61>4492306 +Ref: whatsnew/changelog id5864492415 +Ref: 15f74492415 +Ref: Documentation<61>-Footnote-14492757 +Ref: Documentation<61>-Footnote-24492822 +Node: Build<69>4492887 +Ref: whatsnew/changelog id5874492978 +Ref: 15f84492978 +Ref: Build<69>-Footnote-14493141 +Node: Python 3 5 0 beta 24493206 +Ref: whatsnew/changelog python-3-5-0-beta-24493327 +Ref: 15f94493327 +Node: Core and Builtins<75>4493490 +Ref: whatsnew/changelog id5884493587 +Ref: 15fa4493587 +Ref: Core and Builtins<75>-Footnote-14494338 +Ref: Core and Builtins<75>-Footnote-24494403 +Ref: Core and Builtins<75>-Footnote-34494468 +Ref: Core and Builtins<75>-Footnote-44494533 +Ref: Core and Builtins<75>-Footnote-54494598 +Node: Library<74>4494663 +Ref: whatsnew/changelog id5894494760 +Ref: 15fb4494760 +Ref: Library<74>-Footnote-14495465 +Ref: Library<74>-Footnote-24495530 +Ref: Library<74>-Footnote-34495595 +Ref: Library<74>-Footnote-44495637 +Ref: Library<74>-Footnote-54495701 +Ref: Library<74>-Footnote-64495766 +Ref: Library<74>-Footnote-74495831 +Node: Python 3 5 0 beta 14495896 +Ref: whatsnew/changelog python-3-5-0-beta-14496018 +Ref: 15fc4496018 +Node: Core and Builtins<76>4496287 +Ref: whatsnew/changelog id5904496384 +Ref: 15fd4496384 +Ref: Core and Builtins<76>-Footnote-14498255 +Ref: Core and Builtins<76>-Footnote-24498320 +Ref: Core and Builtins<76>-Footnote-34498385 +Ref: Core and Builtins<76>-Footnote-44498450 +Ref: Core and Builtins<76>-Footnote-54498515 +Ref: Core and Builtins<76>-Footnote-64498580 +Ref: Core and Builtins<76>-Footnote-74498645 +Ref: Core and Builtins<76>-Footnote-84498710 +Ref: Core and Builtins<76>-Footnote-94498775 +Ref: Core and Builtins<76>-Footnote-104498840 +Ref: Core and Builtins<76>-Footnote-114498905 +Ref: Core and Builtins<76>-Footnote-124498971 +Ref: Core and Builtins<76>-Footnote-134499037 +Ref: Core and Builtins<76>-Footnote-144499103 +Ref: Core and Builtins<76>-Footnote-154499169 +Ref: Core and Builtins<76>-Footnote-164499235 +Ref: Core and Builtins<76>-Footnote-174499301 +Ref: Core and Builtins<76>-Footnote-184499366 +Ref: Core and Builtins<76>-Footnote-194499432 +Node: Library<75>4499498 +Ref: whatsnew/changelog id5914499612 +Ref: 15fe4499612 +Ref: Library<75>-Footnote-14507272 +Ref: Library<75>-Footnote-24507337 +Ref: Library<75>-Footnote-34507402 +Ref: Library<75>-Footnote-44507467 +Ref: Library<75>-Footnote-54507532 +Ref: Library<75>-Footnote-64507597 +Ref: Library<75>-Footnote-74507662 +Ref: Library<75>-Footnote-84507727 +Ref: Library<75>-Footnote-94507792 +Ref: Library<75>-Footnote-104507857 +Ref: Library<75>-Footnote-114507922 +Ref: Library<75>-Footnote-124507988 +Ref: Library<75>-Footnote-134508054 +Ref: Library<75>-Footnote-144508120 +Ref: Library<75>-Footnote-154508185 +Ref: Library<75>-Footnote-164508251 +Ref: Library<75>-Footnote-174508317 +Ref: Library<75>-Footnote-184508383 +Ref: Library<75>-Footnote-194508449 +Ref: Library<75>-Footnote-204508515 +Ref: Library<75>-Footnote-214508581 +Ref: Library<75>-Footnote-224508647 +Ref: Library<75>-Footnote-234508713 +Ref: Library<75>-Footnote-244508779 +Ref: Library<75>-Footnote-254508845 +Ref: Library<75>-Footnote-264508910 +Ref: Library<75>-Footnote-274508976 +Ref: Library<75>-Footnote-284509042 +Ref: Library<75>-Footnote-294509108 +Ref: Library<75>-Footnote-304509174 +Ref: Library<75>-Footnote-314509240 +Ref: Library<75>-Footnote-324509306 +Ref: Library<75>-Footnote-334509372 +Ref: Library<75>-Footnote-344509438 +Ref: Library<75>-Footnote-354509504 +Ref: Library<75>-Footnote-364509570 +Ref: Library<75>-Footnote-374509636 +Ref: Library<75>-Footnote-384509702 +Ref: Library<75>-Footnote-394509768 +Ref: Library<75>-Footnote-404509834 +Ref: Library<75>-Footnote-414509900 +Ref: Library<75>-Footnote-424509965 +Ref: Library<75>-Footnote-434510031 +Ref: Library<75>-Footnote-444510097 +Ref: Library<75>-Footnote-454510163 +Ref: Library<75>-Footnote-464510229 +Ref: Library<75>-Footnote-474510295 +Ref: Library<75>-Footnote-484510361 +Ref: Library<75>-Footnote-494510427 +Ref: Library<75>-Footnote-504510493 +Ref: Library<75>-Footnote-514510559 +Ref: Library<75>-Footnote-524510625 +Ref: Library<75>-Footnote-534510691 +Ref: Library<75>-Footnote-544510757 +Ref: Library<75>-Footnote-554510823 +Ref: Library<75>-Footnote-564510889 +Node: IDLE<50>4510955 +Ref: whatsnew/changelog id5924511057 +Ref: 15ff4511057 +Ref: IDLE<50>-Footnote-14511224 +Node: Tests<64>4511289 +Ref: whatsnew/changelog id5934511397 +Ref: 16004511397 +Ref: Tests<64>-Footnote-14511693 +Ref: Tests<64>-Footnote-24511758 +Node: Documentation<62>4511822 +Ref: whatsnew/changelog id5944511937 +Ref: 16014511937 +Ref: Documentation<62>-Footnote-14512342 +Ref: Documentation<62>-Footnote-24512407 +Ref: Documentation<62>-Footnote-34512472 +Node: Tools/Demos<35>4512537 +Ref: whatsnew/changelog id5954512634 +Ref: 16024512634 +Ref: Tools/Demos<35>-Footnote-14513151 +Ref: Tools/Demos<35>-Footnote-24513216 +Ref: Tools/Demos<35>-Footnote-34513281 +Ref: Tools/Demos<35>-Footnote-44513346 +Node: Python 3 5 0 alpha 44513411 +Ref: whatsnew/changelog python-3-5-0-alpha-44513534 +Ref: 16034513534 +Node: Core and Builtins<77>4513791 +Ref: whatsnew/changelog id5964513889 +Ref: 16044513889 +Ref: Core and Builtins<77>-Footnote-14515256 +Ref: Core and Builtins<77>-Footnote-24515321 +Ref: Core and Builtins<77>-Footnote-34515363 +Ref: Core and Builtins<77>-Footnote-44515428 +Ref: Core and Builtins<77>-Footnote-54515493 +Ref: Core and Builtins<77>-Footnote-64515535 +Ref: Core and Builtins<77>-Footnote-74515600 +Ref: Core and Builtins<77>-Footnote-84515665 +Ref: Core and Builtins<77>-Footnote-94515730 +Ref: Core and Builtins<77>-Footnote-104515795 +Ref: Core and Builtins<77>-Footnote-114515861 +Node: Library<76>4515927 +Ref: whatsnew/changelog id5974516043 +Ref: 16054516043 +Ref: Library<76>-Footnote-14522758 +Ref: Library<76>-Footnote-24522823 +Ref: Library<76>-Footnote-34522888 +Ref: Library<76>-Footnote-44522952 +Ref: Library<76>-Footnote-54523017 +Ref: Library<76>-Footnote-64523082 +Ref: Library<76>-Footnote-74523146 +Ref: Library<76>-Footnote-84523211 +Ref: Library<76>-Footnote-94523276 +Ref: Library<76>-Footnote-104523341 +Ref: Library<76>-Footnote-114523407 +Ref: Library<76>-Footnote-124523473 +Ref: Library<76>-Footnote-134523539 +Ref: Library<76>-Footnote-144523605 +Ref: Library<76>-Footnote-154523671 +Ref: Library<76>-Footnote-164523737 +Ref: Library<76>-Footnote-174523803 +Ref: Library<76>-Footnote-184523869 +Ref: Library<76>-Footnote-194523935 +Ref: Library<76>-Footnote-204524001 +Ref: Library<76>-Footnote-214524067 +Ref: Library<76>-Footnote-224524133 +Ref: Library<76>-Footnote-234524199 +Ref: Library<76>-Footnote-244524265 +Ref: Library<76>-Footnote-254524331 +Ref: Library<76>-Footnote-264524397 +Ref: Library<76>-Footnote-274524463 +Ref: Library<76>-Footnote-284524529 +Ref: Library<76>-Footnote-294524595 +Ref: Library<76>-Footnote-304524661 +Ref: Library<76>-Footnote-314524726 +Ref: Library<76>-Footnote-324524792 +Ref: Library<76>-Footnote-334524858 +Ref: Library<76>-Footnote-344524924 +Ref: Library<76>-Footnote-354524990 +Ref: Library<76>-Footnote-364525056 +Ref: Library<76>-Footnote-374525122 +Ref: Library<76>-Footnote-384525188 +Ref: Library<76>-Footnote-394525254 +Ref: Library<76>-Footnote-404525320 +Ref: Library<76>-Footnote-414525386 +Ref: Library<76>-Footnote-424525452 +Ref: Library<76>-Footnote-434525495 +Ref: Library<76>-Footnote-444525561 +Ref: Library<76>-Footnote-454525627 +Ref: Library<76>-Footnote-464525693 +Ref: Library<76>-Footnote-474525759 +Ref: Library<76>-Footnote-484525825 +Node: Build<70>4525891 +Ref: whatsnew/changelog id5984525995 +Ref: 16064525995 +Ref: Build<70>-Footnote-14526278 +Ref: Build<70>-Footnote-24526343 +Node: Tests<65>4526408 +Ref: whatsnew/changelog id5994526516 +Ref: 16074526516 +Ref: Tests<65>-Footnote-14526815 +Ref: Tests<65>-Footnote-24526880 +Node: Tools/Demos<36>4526945 +Ref: whatsnew/changelog id6004527053 +Ref: 16084527053 +Ref: Tools/Demos<36>-Footnote-14528085 +Ref: Tools/Demos<36>-Footnote-24528150 +Ref: Tools/Demos<36>-Footnote-34528215 +Ref: Tools/Demos<36>-Footnote-44528280 +Ref: Tools/Demos<36>-Footnote-54528345 +Ref: Tools/Demos<36>-Footnote-64528410 +Node: C API<52>4528475 +Ref: whatsnew/changelog id6014528565 +Ref: 16094528565 +Ref: C API<52>-Footnote-14528718 +Node: Python 3 5 0 alpha 34528783 +Ref: whatsnew/changelog python-3-5-0-alpha-34528907 +Ref: 160a4528907 +Node: Core and Builtins<78>4529144 +Ref: whatsnew/changelog id6024529242 +Ref: 160b4529242 +Ref: Core and Builtins<78>-Footnote-14530036 +Ref: Core and Builtins<78>-Footnote-24530101 +Ref: Core and Builtins<78>-Footnote-34530166 +Ref: Core and Builtins<78>-Footnote-44530231 +Ref: Core and Builtins<78>-Footnote-54530296 +Ref: Core and Builtins<78>-Footnote-64530361 +Node: Library<77>4530426 +Ref: whatsnew/changelog id6034530542 +Ref: 160c4530542 +Ref: Library<77>-Footnote-14536976 +Ref: Library<77>-Footnote-24537041 +Ref: Library<77>-Footnote-34537106 +Ref: Library<77>-Footnote-44537171 +Ref: Library<77>-Footnote-54537236 +Ref: Library<77>-Footnote-64537301 +Ref: Library<77>-Footnote-74537366 +Ref: Library<77>-Footnote-84537431 +Ref: Library<77>-Footnote-94537496 +Ref: Library<77>-Footnote-104537561 +Ref: Library<77>-Footnote-114537627 +Ref: Library<77>-Footnote-124537693 +Ref: Library<77>-Footnote-134537759 +Ref: Library<77>-Footnote-144537825 +Ref: Library<77>-Footnote-154537890 +Ref: Library<77>-Footnote-164537956 +Ref: Library<77>-Footnote-174538022 +Ref: Library<77>-Footnote-184538088 +Ref: Library<77>-Footnote-194538154 +Ref: Library<77>-Footnote-204538220 +Ref: Library<77>-Footnote-214538286 +Ref: Library<77>-Footnote-224538352 +Ref: Library<77>-Footnote-234538418 +Ref: Library<77>-Footnote-244538484 +Ref: Library<77>-Footnote-254538550 +Ref: Library<77>-Footnote-264538616 +Ref: Library<77>-Footnote-274538682 +Ref: Library<77>-Footnote-284538748 +Ref: Library<77>-Footnote-294538814 +Ref: Library<77>-Footnote-304538880 +Ref: Library<77>-Footnote-314538945 +Ref: Library<77>-Footnote-324539011 +Ref: Library<77>-Footnote-334539077 +Ref: Library<77>-Footnote-344539143 +Ref: Library<77>-Footnote-354539208 +Ref: Library<77>-Footnote-364539274 +Ref: Library<77>-Footnote-374539340 +Ref: Library<77>-Footnote-384539406 +Ref: Library<77>-Footnote-394539472 +Ref: Library<77>-Footnote-404539538 +Ref: Library<77>-Footnote-414539604 +Ref: Library<77>-Footnote-424539670 +Node: Build<71>4539736 +Ref: whatsnew/changelog id6044539840 +Ref: 160d4539840 +Ref: Build<71>-Footnote-14539983 +Node: Tests<66>4540048 +Ref: whatsnew/changelog id6054540156 +Ref: 160e4540156 +Ref: Tests<66>-Footnote-14540379 +Ref: Tests<66>-Footnote-24540444 +Node: Tools/Demos<37>4540509 +Ref: whatsnew/changelog id6064540599 +Ref: 160f4540599 +Ref: Tools/Demos<37>-Footnote-14540866 +Node: Python 3 5 0 alpha 24540931 +Ref: whatsnew/changelog python-3-5-0-alpha-24541055 +Ref: 16104541055 +Node: Core and Builtins<79>4541284 +Ref: whatsnew/changelog id6074541382 +Ref: 16114541382 +Ref: Core and Builtins<79>-Footnote-14541678 +Node: Library<78>4541743 +Ref: whatsnew/changelog id6084541859 +Ref: 16124541859 +Ref: Library<78>-Footnote-14546174 +Ref: Library<78>-Footnote-24546239 +Ref: Library<78>-Footnote-34546281 +Ref: Library<78>-Footnote-44546346 +Ref: Library<78>-Footnote-54546411 +Ref: Library<78>-Footnote-64546476 +Ref: Library<78>-Footnote-74546541 +Ref: Library<78>-Footnote-84546606 +Ref: Library<78>-Footnote-94546671 +Ref: Library<78>-Footnote-104546735 +Ref: Library<78>-Footnote-114546801 +Ref: Library<78>-Footnote-124546867 +Ref: Library<78>-Footnote-134546933 +Ref: Library<78>-Footnote-144546999 +Ref: Library<78>-Footnote-154547065 +Ref: Library<78>-Footnote-164547131 +Ref: Library<78>-Footnote-174547196 +Ref: Library<78>-Footnote-184547263 +Ref: Library<78>-Footnote-194547328 +Ref: Library<78>-Footnote-204547394 +Ref: Library<78>-Footnote-214547459 +Ref: Library<78>-Footnote-224547525 +Ref: Library<78>-Footnote-234547591 +Ref: Library<78>-Footnote-244547657 +Ref: Library<78>-Footnote-254547723 +Ref: Library<78>-Footnote-264547789 +Ref: Library<78>-Footnote-274547855 +Ref: Library<78>-Footnote-284547921 +Ref: Library<78>-Footnote-294547987 +Ref: Library<78>-Footnote-304548053 +Ref: Library<78>-Footnote-314548119 +Ref: Library<78>-Footnote-324548185 +Ref: Library<78>-Footnote-334548251 +Ref: Library<78>-Footnote-344548317 +Ref: Library<78>-Footnote-354548383 +Ref: Library<78>-Footnote-364548449 +Ref: Library<78>-Footnote-374548515 +Node: Build<72>4548581 +Ref: whatsnew/changelog id6094548685 +Ref: 16134548685 +Ref: Build<72>-Footnote-14548954 +Ref: Build<72>-Footnote-24549019 +Node: C API<53>4549084 +Ref: whatsnew/changelog id6104549188 +Ref: 16144549188 +Ref: C API<53>-Footnote-14549368 +Node: Windows<59>4549433 +Ref: whatsnew/changelog id6114549519 +Ref: 16154549519 +Ref: Windows<59>-Footnote-14549814 +Ref: Windows<59>-Footnote-24549879 +Ref: Windows<59>-Footnote-34549921 +Node: Python 3 5 0 alpha 14549986 +Ref: whatsnew/changelog python-3-5-0-alpha-14550081 +Ref: 16164550081 +Node: Core and Builtins<80>4550416 +Ref: whatsnew/changelog id6124550514 +Ref: 16174550514 +Ref: Core and Builtins<80>-Footnote-14560442 +Ref: Core and Builtins<80>-Footnote-24560507 +Ref: Core and Builtins<80>-Footnote-34560572 +Ref: Core and Builtins<80>-Footnote-44560637 +Ref: Core and Builtins<80>-Footnote-54560702 +Ref: Core and Builtins<80>-Footnote-64560767 +Ref: Core and Builtins<80>-Footnote-74560832 +Ref: Core and Builtins<80>-Footnote-84560897 +Ref: Core and Builtins<80>-Footnote-94560962 +Ref: Core and Builtins<80>-Footnote-104561027 +Ref: Core and Builtins<80>-Footnote-114561093 +Ref: Core and Builtins<80>-Footnote-124561159 +Ref: Core and Builtins<80>-Footnote-134561225 +Ref: Core and Builtins<80>-Footnote-144561291 +Ref: Core and Builtins<80>-Footnote-154561357 +Ref: Core and Builtins<80>-Footnote-164561423 +Ref: Core and Builtins<80>-Footnote-174561489 +Ref: Core and Builtins<80>-Footnote-184561555 +Ref: Core and Builtins<80>-Footnote-194561621 +Ref: Core and Builtins<80>-Footnote-204561687 +Ref: Core and Builtins<80>-Footnote-214561753 +Ref: Core and Builtins<80>-Footnote-224561819 +Ref: Core and Builtins<80>-Footnote-234561885 +Ref: Core and Builtins<80>-Footnote-244561951 +Ref: Core and Builtins<80>-Footnote-254562017 +Ref: Core and Builtins<80>-Footnote-264562083 +Ref: Core and Builtins<80>-Footnote-274562149 +Ref: Core and Builtins<80>-Footnote-284562215 +Ref: Core and Builtins<80>-Footnote-294562281 +Ref: Core and Builtins<80>-Footnote-304562347 +Ref: Core and Builtins<80>-Footnote-314562413 +Ref: Core and Builtins<80>-Footnote-324562479 +Ref: Core and Builtins<80>-Footnote-334562545 +Ref: Core and Builtins<80>-Footnote-344562613 +Ref: Core and Builtins<80>-Footnote-354562679 +Ref: Core and Builtins<80>-Footnote-364562745 +Ref: Core and Builtins<80>-Footnote-374562811 +Ref: Core and Builtins<80>-Footnote-384562877 +Ref: Core and Builtins<80>-Footnote-394562943 +Ref: Core and Builtins<80>-Footnote-404563009 +Ref: Core and Builtins<80>-Footnote-414563075 +Ref: Core and Builtins<80>-Footnote-424563141 +Ref: Core and Builtins<80>-Footnote-434563207 +Ref: Core and Builtins<80>-Footnote-444563273 +Ref: Core and Builtins<80>-Footnote-454563339 +Ref: Core and Builtins<80>-Footnote-464563405 +Ref: Core and Builtins<80>-Footnote-474563471 +Ref: Core and Builtins<80>-Footnote-484563537 +Ref: Core and Builtins<80>-Footnote-494563603 +Ref: Core and Builtins<80>-Footnote-504563669 +Ref: Core and Builtins<80>-Footnote-514563735 +Ref: Core and Builtins<80>-Footnote-524563801 +Ref: Core and Builtins<80>-Footnote-534563867 +Ref: Core and Builtins<80>-Footnote-544563933 +Ref: Core and Builtins<80>-Footnote-554563999 +Ref: Core and Builtins<80>-Footnote-564564065 +Ref: Core and Builtins<80>-Footnote-574564131 +Ref: Core and Builtins<80>-Footnote-584564197 +Ref: Core and Builtins<80>-Footnote-594564263 +Ref: Core and Builtins<80>-Footnote-604564329 +Ref: Core and Builtins<80>-Footnote-614564395 +Ref: Core and Builtins<80>-Footnote-624564461 +Ref: Core and Builtins<80>-Footnote-634564527 +Ref: Core and Builtins<80>-Footnote-644564593 +Ref: Core and Builtins<80>-Footnote-654564659 +Ref: Core and Builtins<80>-Footnote-664564725 +Ref: Core and Builtins<80>-Footnote-674564790 +Ref: Core and Builtins<80>-Footnote-684564856 +Ref: Core and Builtins<80>-Footnote-694564922 +Ref: Core and Builtins<80>-Footnote-704564988 +Ref: Core and Builtins<80>-Footnote-714565054 +Ref: Core and Builtins<80>-Footnote-724565120 +Ref: Core and Builtins<80>-Footnote-734565185 +Node: Library<79>4565251 +Ref: whatsnew/changelog id6134565366 +Ref: 16184565366 +Ref: Library<79>-Footnote-14617823 +Ref: Library<79>-Footnote-24617888 +Ref: Library<79>-Footnote-34617953 +Ref: Library<79>-Footnote-44618018 +Ref: Library<79>-Footnote-54618083 +Ref: Library<79>-Footnote-64618148 +Ref: Library<79>-Footnote-74618213 +Ref: Library<79>-Footnote-84618278 +Ref: Library<79>-Footnote-94618343 +Ref: Library<79>-Footnote-104618408 +Ref: Library<79>-Footnote-114618474 +Ref: Library<79>-Footnote-124618540 +Ref: Library<79>-Footnote-134618606 +Ref: Library<79>-Footnote-144618672 +Ref: Library<79>-Footnote-154618738 +Ref: Library<79>-Footnote-164618804 +Ref: Library<79>-Footnote-174618870 +Ref: Library<79>-Footnote-184618936 +Ref: Library<79>-Footnote-194619002 +Ref: Library<79>-Footnote-204619068 +Ref: Library<79>-Footnote-214619134 +Ref: Library<79>-Footnote-224619200 +Ref: Library<79>-Footnote-234619266 +Ref: Library<79>-Footnote-244619332 +Ref: Library<79>-Footnote-254619398 +Ref: Library<79>-Footnote-264619464 +Ref: Library<79>-Footnote-274619530 +Ref: Library<79>-Footnote-284619596 +Ref: Library<79>-Footnote-294619662 +Ref: Library<79>-Footnote-304619728 +Ref: Library<79>-Footnote-314619794 +Ref: Library<79>-Footnote-324619860 +Ref: Library<79>-Footnote-334619926 +Ref: Library<79>-Footnote-344619992 +Ref: Library<79>-Footnote-354620058 +Ref: Library<79>-Footnote-364620124 +Ref: Library<79>-Footnote-374620190 +Ref: Library<79>-Footnote-384620256 +Ref: Library<79>-Footnote-394620322 +Ref: Library<79>-Footnote-404620388 +Ref: Library<79>-Footnote-414620454 +Ref: Library<79>-Footnote-424620520 +Ref: Library<79>-Footnote-434620586 +Ref: Library<79>-Footnote-444620652 +Ref: Library<79>-Footnote-454620718 +Ref: Library<79>-Footnote-464620784 +Ref: Library<79>-Footnote-474620850 +Ref: Library<79>-Footnote-484620916 +Ref: Library<79>-Footnote-494620982 +Ref: Library<79>-Footnote-504621048 +Ref: Library<79>-Footnote-514621114 +Ref: Library<79>-Footnote-524621180 +Ref: Library<79>-Footnote-534621246 +Ref: Library<79>-Footnote-544621312 +Ref: Library<79>-Footnote-554621378 +Ref: Library<79>-Footnote-564621446 +Ref: Library<79>-Footnote-574621512 +Ref: Library<79>-Footnote-584621578 +Ref: Library<79>-Footnote-594621644 +Ref: Library<79>-Footnote-604621710 +Ref: Library<79>-Footnote-614621776 +Ref: Library<79>-Footnote-624621842 +Ref: Library<79>-Footnote-634621908 +Ref: Library<79>-Footnote-644621974 +Ref: Library<79>-Footnote-654622040 +Ref: Library<79>-Footnote-664622106 +Ref: Library<79>-Footnote-674622172 +Ref: Library<79>-Footnote-684622238 +Ref: Library<79>-Footnote-694622304 +Ref: Library<79>-Footnote-704622370 +Ref: Library<79>-Footnote-714622436 +Ref: Library<79>-Footnote-724622502 +Ref: Library<79>-Footnote-734622568 +Ref: Library<79>-Footnote-744622634 +Ref: Library<79>-Footnote-754622700 +Ref: Library<79>-Footnote-764622766 +Ref: Library<79>-Footnote-774622832 +Ref: Library<79>-Footnote-784622898 +Ref: Library<79>-Footnote-794622964 +Ref: Library<79>-Footnote-804623030 +Ref: Library<79>-Footnote-814623096 +Ref: Library<79>-Footnote-824623162 +Ref: Library<79>-Footnote-834623228 +Ref: Library<79>-Footnote-844623294 +Ref: Library<79>-Footnote-854623360 +Ref: Library<79>-Footnote-864623426 +Ref: Library<79>-Footnote-874623492 +Ref: Library<79>-Footnote-884623558 +Ref: Library<79>-Footnote-894623624 +Ref: Library<79>-Footnote-904623690 +Ref: Library<79>-Footnote-914623756 +Ref: Library<79>-Footnote-924623822 +Ref: Library<79>-Footnote-934623888 +Ref: Library<79>-Footnote-944623954 +Ref: Library<79>-Footnote-954624020 +Ref: Library<79>-Footnote-964624085 +Ref: Library<79>-Footnote-974624151 +Ref: Library<79>-Footnote-984624217 +Ref: Library<79>-Footnote-994624283 +Ref: Library<79>-Footnote-1004624348 +Ref: Library<79>-Footnote-1014624415 +Ref: Library<79>-Footnote-1024624482 +Ref: Library<79>-Footnote-1034624549 +Ref: Library<79>-Footnote-1044624616 +Ref: Library<79>-Footnote-1054624683 +Ref: Library<79>-Footnote-1064624750 +Ref: Library<79>-Footnote-1074624816 +Ref: Library<79>-Footnote-1084624882 +Ref: Library<79>-Footnote-1094624949 +Ref: Library<79>-Footnote-1104625016 +Ref: Library<79>-Footnote-1114625083 +Ref: Library<79>-Footnote-1124625150 +Ref: Library<79>-Footnote-1134625217 +Ref: Library<79>-Footnote-1144625284 +Ref: Library<79>-Footnote-1154625351 +Ref: Library<79>-Footnote-1164625418 +Ref: Library<79>-Footnote-1174625485 +Ref: Library<79>-Footnote-1184625552 +Ref: Library<79>-Footnote-1194625619 +Ref: Library<79>-Footnote-1204625686 +Ref: Library<79>-Footnote-1214625755 +Ref: Library<79>-Footnote-1224625822 +Ref: Library<79>-Footnote-1234625889 +Ref: Library<79>-Footnote-1244625956 +Ref: Library<79>-Footnote-1254626023 +Ref: Library<79>-Footnote-1264626090 +Ref: Library<79>-Footnote-1274626157 +Ref: Library<79>-Footnote-1284626224 +Ref: Library<79>-Footnote-1294626291 +Ref: Library<79>-Footnote-1304626358 +Ref: Library<79>-Footnote-1314626425 +Ref: Library<79>-Footnote-1324626492 +Ref: Library<79>-Footnote-1334626559 +Ref: Library<79>-Footnote-1344626626 +Ref: Library<79>-Footnote-1354626693 +Ref: Library<79>-Footnote-1364626760 +Ref: Library<79>-Footnote-1374626827 +Ref: Library<79>-Footnote-1384626894 +Ref: Library<79>-Footnote-1394626961 +Ref: Library<79>-Footnote-1404627028 +Ref: Library<79>-Footnote-1414627095 +Ref: Library<79>-Footnote-1424627161 +Ref: Library<79>-Footnote-1434627227 +Ref: Library<79>-Footnote-1444627294 +Ref: Library<79>-Footnote-1454627361 +Ref: Library<79>-Footnote-1464627428 +Ref: Library<79>-Footnote-1474627495 +Ref: Library<79>-Footnote-1484627562 +Ref: Library<79>-Footnote-1494627629 +Ref: Library<79>-Footnote-1504627696 +Ref: Library<79>-Footnote-1514627763 +Ref: Library<79>-Footnote-1524627830 +Ref: Library<79>-Footnote-1534627897 +Ref: Library<79>-Footnote-1544627964 +Ref: Library<79>-Footnote-1554628031 +Ref: Library<79>-Footnote-1564628098 +Ref: Library<79>-Footnote-1574628164 +Ref: Library<79>-Footnote-1584628231 +Ref: Library<79>-Footnote-1594628298 +Ref: Library<79>-Footnote-1604628365 +Ref: Library<79>-Footnote-1614628432 +Ref: Library<79>-Footnote-1624628499 +Ref: Library<79>-Footnote-1634628566 +Ref: Library<79>-Footnote-1644628633 +Ref: Library<79>-Footnote-1654628700 +Ref: Library<79>-Footnote-1664628767 +Ref: Library<79>-Footnote-1674628834 +Ref: Library<79>-Footnote-1684628901 +Ref: Library<79>-Footnote-1694628968 +Ref: Library<79>-Footnote-1704629035 +Ref: Library<79>-Footnote-1714629102 +Ref: Library<79>-Footnote-1724629169 +Ref: Library<79>-Footnote-1734629236 +Ref: Library<79>-Footnote-1744629303 +Ref: Library<79>-Footnote-1754629370 +Ref: Library<79>-Footnote-1764629437 +Ref: Library<79>-Footnote-1774629504 +Ref: Library<79>-Footnote-1784629571 +Ref: Library<79>-Footnote-1794629638 +Ref: Library<79>-Footnote-1804629705 +Ref: Library<79>-Footnote-1814629772 +Ref: Library<79>-Footnote-1824629839 +Ref: Library<79>-Footnote-1834629906 +Ref: Library<79>-Footnote-1844629973 +Ref: Library<79>-Footnote-1854630040 +Ref: Library<79>-Footnote-1864630107 +Ref: Library<79>-Footnote-1874630174 +Ref: Library<79>-Footnote-1884630240 +Ref: Library<79>-Footnote-1894630307 +Ref: Library<79>-Footnote-1904630374 +Ref: Library<79>-Footnote-1914630441 +Ref: Library<79>-Footnote-1924630508 +Ref: Library<79>-Footnote-1934630575 +Ref: Library<79>-Footnote-1944630642 +Ref: Library<79>-Footnote-1954630709 +Ref: Library<79>-Footnote-1964630775 +Ref: Library<79>-Footnote-1974630842 +Ref: Library<79>-Footnote-1984630909 +Ref: Library<79>-Footnote-1994630976 +Ref: Library<79>-Footnote-2004631043 +Ref: Library<79>-Footnote-2014631110 +Ref: Library<79>-Footnote-2024631177 +Ref: Library<79>-Footnote-2034631243 +Ref: Library<79>-Footnote-2044631310 +Ref: Library<79>-Footnote-2054631377 +Ref: Library<79>-Footnote-2064631444 +Ref: Library<79>-Footnote-2074631511 +Ref: Library<79>-Footnote-2084631578 +Ref: Library<79>-Footnote-2094631645 +Ref: Library<79>-Footnote-2104631712 +Ref: Library<79>-Footnote-2114631779 +Ref: Library<79>-Footnote-2124631846 +Ref: Library<79>-Footnote-2134631913 +Ref: Library<79>-Footnote-2144631980 +Ref: Library<79>-Footnote-2154632047 +Ref: Library<79>-Footnote-2164632114 +Ref: Library<79>-Footnote-2174632181 +Ref: Library<79>-Footnote-2184632248 +Ref: Library<79>-Footnote-2194632315 +Ref: Library<79>-Footnote-2204632382 +Ref: Library<79>-Footnote-2214632449 +Ref: Library<79>-Footnote-2224632516 +Ref: Library<79>-Footnote-2234632583 +Ref: Library<79>-Footnote-2244632649 +Ref: Library<79>-Footnote-2254632715 +Ref: Library<79>-Footnote-2264632782 +Ref: Library<79>-Footnote-2274632849 +Ref: Library<79>-Footnote-2284632916 +Ref: Library<79>-Footnote-2294632983 +Ref: Library<79>-Footnote-2304633050 +Ref: Library<79>-Footnote-2314633117 +Ref: Library<79>-Footnote-2324633184 +Ref: Library<79>-Footnote-2334633251 +Ref: Library<79>-Footnote-2344633318 +Ref: Library<79>-Footnote-2354633385 +Ref: Library<79>-Footnote-2364633452 +Ref: Library<79>-Footnote-2374633519 +Ref: Library<79>-Footnote-2384633586 +Ref: Library<79>-Footnote-2394633653 +Ref: Library<79>-Footnote-2404633720 +Ref: Library<79>-Footnote-2414633787 +Ref: Library<79>-Footnote-2424633854 +Ref: Library<79>-Footnote-2434633921 +Ref: Library<79>-Footnote-2444633988 +Ref: Library<79>-Footnote-2454634054 +Ref: Library<79>-Footnote-2464634121 +Ref: Library<79>-Footnote-2474634188 +Ref: Library<79>-Footnote-2484634255 +Ref: Library<79>-Footnote-2494634322 +Ref: Library<79>-Footnote-2504634389 +Ref: Library<79>-Footnote-2514634456 +Ref: Library<79>-Footnote-2524634523 +Ref: Library<79>-Footnote-2534634590 +Ref: Library<79>-Footnote-2544634657 +Ref: Library<79>-Footnote-2554634724 +Ref: Library<79>-Footnote-2564634791 +Ref: Library<79>-Footnote-2574634858 +Ref: Library<79>-Footnote-2584634925 +Ref: Library<79>-Footnote-2594634992 +Ref: Library<79>-Footnote-2604635059 +Ref: Library<79>-Footnote-2614635126 +Ref: Library<79>-Footnote-2624635193 +Ref: Library<79>-Footnote-2634635260 +Ref: Library<79>-Footnote-2644635327 +Ref: Library<79>-Footnote-2654635394 +Ref: Library<79>-Footnote-2664635461 +Ref: Library<79>-Footnote-2674635528 +Ref: Library<79>-Footnote-2684635595 +Ref: Library<79>-Footnote-2694635662 +Ref: Library<79>-Footnote-2704635729 +Ref: Library<79>-Footnote-2714635796 +Ref: Library<79>-Footnote-2724635863 +Ref: Library<79>-Footnote-2734635930 +Ref: Library<79>-Footnote-2744635997 +Ref: Library<79>-Footnote-2754636064 +Ref: Library<79>-Footnote-2764636131 +Ref: Library<79>-Footnote-2774636197 +Ref: Library<79>-Footnote-2784636264 +Ref: Library<79>-Footnote-2794636331 +Ref: Library<79>-Footnote-2804636398 +Ref: Library<79>-Footnote-2814636465 +Ref: Library<79>-Footnote-2824636532 +Ref: Library<79>-Footnote-2834636599 +Ref: Library<79>-Footnote-2844636666 +Ref: Library<79>-Footnote-2854636733 +Ref: Library<79>-Footnote-2864636800 +Ref: Library<79>-Footnote-2874636867 +Ref: Library<79>-Footnote-2884636934 +Ref: Library<79>-Footnote-2894636978 +Ref: Library<79>-Footnote-2904637045 +Ref: Library<79>-Footnote-2914637112 +Ref: Library<79>-Footnote-2924637179 +Ref: Library<79>-Footnote-2934637246 +Ref: Library<79>-Footnote-2944637313 +Ref: Library<79>-Footnote-2954637380 +Ref: Library<79>-Footnote-2964637447 +Ref: Library<79>-Footnote-2974637514 +Ref: Library<79>-Footnote-2984637581 +Ref: Library<79>-Footnote-2994637648 +Ref: Library<79>-Footnote-3004637715 +Ref: Library<79>-Footnote-3014637782 +Ref: Library<79>-Footnote-3024637849 +Ref: Library<79>-Footnote-3034637916 +Ref: Library<79>-Footnote-3044637983 +Ref: Library<79>-Footnote-3054638050 +Ref: Library<79>-Footnote-3064638117 +Ref: Library<79>-Footnote-3074638184 +Ref: Library<79>-Footnote-3084638251 +Ref: Library<79>-Footnote-3094638318 +Ref: Library<79>-Footnote-3104638385 +Ref: Library<79>-Footnote-3114638452 +Ref: Library<79>-Footnote-3124638519 +Ref: Library<79>-Footnote-3134638586 +Ref: Library<79>-Footnote-3144638653 +Ref: Library<79>-Footnote-3154638719 +Ref: Library<79>-Footnote-3164638786 +Ref: Library<79>-Footnote-3174638853 +Ref: Library<79>-Footnote-3184638920 +Ref: Library<79>-Footnote-3194638987 +Ref: Library<79>-Footnote-3204639054 +Ref: Library<79>-Footnote-3214639121 +Ref: Library<79>-Footnote-3224639188 +Ref: Library<79>-Footnote-3234639255 +Ref: Library<79>-Footnote-3244639322 +Ref: Library<79>-Footnote-3254639389 +Ref: Library<79>-Footnote-3264639456 +Ref: Library<79>-Footnote-3274639523 +Ref: Library<79>-Footnote-3284639590 +Ref: Library<79>-Footnote-3294639657 +Ref: Library<79>-Footnote-3304639724 +Ref: Library<79>-Footnote-3314639791 +Ref: Library<79>-Footnote-3324639858 +Ref: Library<79>-Footnote-3334639925 +Ref: Library<79>-Footnote-3344639992 +Ref: Library<79>-Footnote-3354640058 +Ref: Library<79>-Footnote-3364640125 +Ref: Library<79>-Footnote-3374640192 +Ref: Library<79>-Footnote-3384640259 +Ref: Library<79>-Footnote-3394640326 +Ref: Library<79>-Footnote-3404640393 +Ref: Library<79>-Footnote-3414640460 +Ref: Library<79>-Footnote-3424640527 +Ref: Library<79>-Footnote-3434640594 +Ref: Library<79>-Footnote-3444640661 +Ref: Library<79>-Footnote-3454640728 +Ref: Library<79>-Footnote-3464640795 +Ref: Library<79>-Footnote-3474640862 +Ref: Library<79>-Footnote-3484640929 +Ref: Library<79>-Footnote-3494640996 +Ref: Library<79>-Footnote-3504641063 +Ref: Library<79>-Footnote-3514641130 +Ref: Library<79>-Footnote-3524641197 +Ref: Library<79>-Footnote-3534641264 +Ref: Library<79>-Footnote-3544641331 +Ref: Library<79>-Footnote-3554641398 +Ref: Library<79>-Footnote-3564641465 +Ref: Library<79>-Footnote-3574641532 +Ref: Library<79>-Footnote-3584641599 +Ref: Library<79>-Footnote-3594641666 +Ref: Library<79>-Footnote-3604641733 +Ref: Library<79>-Footnote-3614641800 +Ref: Library<79>-Footnote-3624641867 +Ref: Library<79>-Footnote-3634641934 +Ref: Library<79>-Footnote-3644642001 +Ref: Library<79>-Footnote-3654642068 +Ref: Library<79>-Footnote-3664642135 +Ref: Library<79>-Footnote-3674642202 +Ref: Library<79>-Footnote-3684642269 +Ref: Library<79>-Footnote-3694642336 +Ref: Library<79>-Footnote-3704642403 +Ref: Library<79>-Footnote-3714642469 +Ref: Library<79>-Footnote-3724642536 +Ref: Library<79>-Footnote-3734642603 +Ref: Library<79>-Footnote-3744642670 +Ref: Library<79>-Footnote-3754642737 +Ref: Library<79>-Footnote-3764642804 +Ref: Library<79>-Footnote-3774642871 +Ref: Library<79>-Footnote-3784642938 +Ref: Library<79>-Footnote-3794643005 +Ref: Library<79>-Footnote-3804643072 +Ref: Library<79>-Footnote-3814643139 +Ref: Library<79>-Footnote-3824643206 +Ref: Library<79>-Footnote-3834643273 +Ref: Library<79>-Footnote-3844643339 +Ref: Library<79>-Footnote-3854643406 +Ref: Library<79>-Footnote-3864643473 +Ref: Library<79>-Footnote-3874643540 +Ref: Library<79>-Footnote-3884643607 +Ref: Library<79>-Footnote-3894643672 +Ref: Library<79>-Footnote-3904643739 +Ref: Library<79>-Footnote-3914643806 +Ref: Library<79>-Footnote-3924643873 +Ref: Library<79>-Footnote-3934643940 +Ref: Library<79>-Footnote-3944644007 +Ref: Library<79>-Footnote-3954644074 +Ref: Library<79>-Footnote-3964644141 +Node: IDLE<51>4644208 +Ref: whatsnew/changelog id6144644311 +Ref: 16194644311 +Ref: IDLE<51>-Footnote-14647807 +Ref: IDLE<51>-Footnote-24647872 +Ref: IDLE<51>-Footnote-34647937 +Ref: IDLE<51>-Footnote-44648001 +Ref: IDLE<51>-Footnote-54648066 +Ref: IDLE<51>-Footnote-64648130 +Ref: IDLE<51>-Footnote-74648195 +Ref: IDLE<51>-Footnote-84648260 +Ref: IDLE<51>-Footnote-94648325 +Ref: IDLE<51>-Footnote-104648390 +Ref: IDLE<51>-Footnote-114648456 +Ref: IDLE<51>-Footnote-124648522 +Ref: IDLE<51>-Footnote-134648588 +Ref: IDLE<51>-Footnote-144648654 +Ref: IDLE<51>-Footnote-154648720 +Ref: IDLE<51>-Footnote-164648786 +Ref: IDLE<51>-Footnote-174648852 +Ref: IDLE<51>-Footnote-184648918 +Ref: IDLE<51>-Footnote-194648984 +Ref: IDLE<51>-Footnote-204649050 +Ref: IDLE<51>-Footnote-214649116 +Ref: IDLE<51>-Footnote-224649182 +Ref: IDLE<51>-Footnote-234649248 +Ref: IDLE<51>-Footnote-244649291 +Ref: IDLE<51>-Footnote-254649357 +Ref: IDLE<51>-Footnote-264649423 +Node: Build<73>4649489 +Ref: whatsnew/changelog id6154649590 +Ref: 161a4649590 +Ref: Build<73>-Footnote-14653022 +Ref: Build<73>-Footnote-24653087 +Ref: Build<73>-Footnote-34653152 +Ref: Build<73>-Footnote-44653217 +Ref: Build<73>-Footnote-54653282 +Ref: Build<73>-Footnote-64653347 +Ref: Build<73>-Footnote-74653412 +Ref: Build<73>-Footnote-84653477 +Ref: Build<73>-Footnote-94653542 +Ref: Build<73>-Footnote-104653607 +Ref: Build<73>-Footnote-114653673 +Ref: Build<73>-Footnote-124653739 +Ref: Build<73>-Footnote-134653805 +Ref: Build<73>-Footnote-144653871 +Ref: Build<73>-Footnote-154653937 +Ref: Build<73>-Footnote-164654003 +Ref: Build<73>-Footnote-174654069 +Ref: Build<73>-Footnote-184654135 +Ref: Build<73>-Footnote-194654201 +Ref: Build<73>-Footnote-204654267 +Ref: Build<73>-Footnote-214654333 +Ref: Build<73>-Footnote-224654399 +Ref: Build<73>-Footnote-234654465 +Ref: Build<73>-Footnote-244654531 +Ref: Build<73>-Footnote-254654597 +Ref: Build<73>-Footnote-264654663 +Node: C API<54>4654729 +Ref: whatsnew/changelog id6164654839 +Ref: 161b4654839 +Ref: C API<54>-Footnote-14656204 +Ref: C API<54>-Footnote-24656269 +Ref: C API<54>-Footnote-34656334 +Ref: C API<54>-Footnote-44656399 +Ref: C API<54>-Footnote-54656464 +Ref: C API<54>-Footnote-64656529 +Ref: C API<54>-Footnote-74656594 +Node: Documentation<63>4656659 +Ref: whatsnew/changelog id6174656769 +Ref: 161c4656769 +Ref: Documentation<63>-Footnote-14658576 +Ref: Documentation<63>-Footnote-24658641 +Ref: Documentation<63>-Footnote-34658706 +Ref: Documentation<63>-Footnote-44658771 +Ref: Documentation<63>-Footnote-54658836 +Ref: Documentation<63>-Footnote-64658900 +Ref: Documentation<63>-Footnote-74658965 +Ref: Documentation<63>-Footnote-84659030 +Ref: Documentation<63>-Footnote-94659095 +Ref: Documentation<63>-Footnote-104659160 +Ref: Documentation<63>-Footnote-114659226 +Node: Tests<67>4659292 +Ref: whatsnew/changelog id6184659408 +Ref: 161d4659408 +Ref: Tests<67>-Footnote-14663599 +Ref: Tests<67>-Footnote-24663664 +Ref: Tests<67>-Footnote-34663729 +Ref: Tests<67>-Footnote-44663794 +Ref: Tests<67>-Footnote-54663859 +Ref: Tests<67>-Footnote-64663924 +Ref: Tests<67>-Footnote-74663989 +Ref: Tests<67>-Footnote-84664054 +Ref: Tests<67>-Footnote-94664119 +Ref: Tests<67>-Footnote-104664184 +Ref: Tests<67>-Footnote-114664250 +Ref: Tests<67>-Footnote-124664316 +Ref: Tests<67>-Footnote-134664382 +Ref: Tests<67>-Footnote-144664448 +Ref: Tests<67>-Footnote-154664513 +Ref: Tests<67>-Footnote-164664579 +Ref: Tests<67>-Footnote-174664645 +Ref: Tests<67>-Footnote-184664711 +Ref: Tests<67>-Footnote-194664777 +Ref: Tests<67>-Footnote-204664843 +Ref: Tests<67>-Footnote-214664909 +Ref: Tests<67>-Footnote-224664975 +Ref: Tests<67>-Footnote-234665041 +Ref: Tests<67>-Footnote-244665107 +Ref: Tests<67>-Footnote-254665173 +Ref: Tests<67>-Footnote-264665239 +Ref: Tests<67>-Footnote-274665305 +Ref: Tests<67>-Footnote-284665371 +Ref: Tests<67>-Footnote-294665437 +Ref: Tests<67>-Footnote-304665503 +Ref: Tests<67>-Footnote-314665569 +Ref: Tests<67>-Footnote-324665635 +Ref: Tests<67>-Footnote-334665701 +Ref: Tests<67>-Footnote-344665767 +Ref: Tests<67>-Footnote-354665833 +Ref: Tests<67>-Footnote-364665899 +Ref: Tests<67>-Footnote-374665965 +Node: Tools/Demos<38>4666031 +Ref: whatsnew/changelog id6194666141 +Ref: 161e4666141 +Ref: Tools/Demos<38>-Footnote-14667813 +Ref: Tools/Demos<38>-Footnote-24667878 +Ref: Tools/Demos<38>-Footnote-34667943 +Ref: Tools/Demos<38>-Footnote-44668008 +Ref: Tools/Demos<38>-Footnote-54668073 +Ref: Tools/Demos<38>-Footnote-64668138 +Ref: Tools/Demos<38>-Footnote-74668203 +Ref: Tools/Demos<38>-Footnote-84668268 +Ref: Tools/Demos<38>-Footnote-94668333 +Ref: Tools/Demos<38>-Footnote-104668398 +Ref: Tools/Demos<38>-Footnote-114668441 +Ref: Tools/Demos<38>-Footnote-124668507 +Ref: Tools/Demos<38>-Footnote-134668573 +Node: Windows<60>4668639 +Ref: whatsnew/changelog id6204668731 +Ref: 161f4668731 +Ref: Windows<60>-Footnote-14669942 +Ref: Windows<60>-Footnote-24670007 +Ref: Windows<60>-Footnote-34670072 +Ref: Windows<60>-Footnote-44670137 +Ref: Windows<60>-Footnote-54670202 +Ref: Windows<60>-Footnote-64670267 +Ref: Windows<60>-Footnote-74670332 +Node: The Python Tutorial4670397 +Ref: tutorial/index doc4670518 +Ref: 16204670518 +Ref: tutorial/index the-python-tutorial4670518 +Ref: 16214670518 +Ref: tutorial/index tutorial-index4670518 +Ref: 16224670518 +Node: Whetting Your Appetite4673245 +Ref: tutorial/appetite doc4673360 +Ref: 16284673360 +Ref: tutorial/appetite tut-intro4673360 +Ref: 16294673360 +Ref: tutorial/appetite whetting-your-appetite4673360 +Ref: 162a4673360 +Node: Using the Python Interpreter4677875 +Ref: tutorial/interpreter doc4678033 +Ref: 162b4678033 +Ref: tutorial/interpreter tut-using4678033 +Ref: 162c4678033 +Ref: tutorial/interpreter using-the-python-interpreter4678033 +Ref: 162d4678033 +Node: Invoking the Interpreter4678179 +Ref: tutorial/interpreter invoking-the-interpreter4678312 +Ref: 162e4678312 +Ref: tutorial/interpreter tut-invoking4678312 +Ref: 162f4678312 +Ref: Invoking the Interpreter-Footnote-14681306 +Ref: Invoking the Interpreter-Footnote-24681502 +Node: Argument Passing4681563 +Ref: tutorial/interpreter argument-passing4681665 +Ref: 16334681665 +Ref: tutorial/interpreter tut-argpassing4681665 +Ref: 16344681665 +Node: Interactive Mode4682573 +Ref: tutorial/interpreter interactive-mode4682675 +Ref: 16354682675 +Ref: tutorial/interpreter tut-interactive4682675 +Ref: c684682675 +Node: The Interpreter and Its Environment4683694 +Ref: tutorial/interpreter the-interpreter-and-its-environment4683827 +Ref: 16374683827 +Ref: tutorial/interpreter tut-interp4683827 +Ref: 16384683827 +Node: Source Code Encoding4683947 +Ref: tutorial/interpreter source-code-encoding4684039 +Ref: 16394684039 +Ref: tutorial/interpreter tut-source-encoding4684039 +Ref: 163a4684039 +Node: An Informal Introduction to Python4685275 +Ref: tutorial/introduction doc4685434 +Ref: 163c4685434 +Ref: tutorial/introduction an-informal-introduction-to-python4685434 +Ref: 163d4685434 +Ref: tutorial/introduction tut-informal4685434 +Ref: 163e4685434 +Node: Using Python as a Calculator4686739 +Ref: tutorial/introduction tut-calculator4686878 +Ref: 16414686878 +Ref: tutorial/introduction using-python-as-a-calculator4686878 +Ref: 16424686878 +Node: Numbers4687131 +Ref: tutorial/introduction numbers4687219 +Ref: 16434687219 +Ref: tutorial/introduction tut-numbers4687219 +Ref: 16444687219 +Ref: Numbers-Footnote-14690203 +Node: Strings4690399 +Ref: tutorial/introduction strings4690501 +Ref: 16464690501 +Ref: tutorial/introduction tut-strings4690501 +Ref: 16474690501 +Ref: Strings-Footnote-14698457 +Node: Lists4698761 +Ref: tutorial/introduction lists4698847 +Ref: 164b4698847 +Ref: tutorial/introduction tut-lists4698847 +Ref: 164c4698847 +Node: First Steps Towards Programming4701448 +Ref: tutorial/introduction first-steps-towards-programming4701587 +Ref: 16504701587 +Ref: tutorial/introduction tut-firststeps4701587 +Ref: 16514701587 +Ref: First Steps Towards Programming-Footnote-14704685 +Node: More Control Flow Tools4704740 +Ref: tutorial/controlflow doc4704886 +Ref: 16534704886 +Ref: tutorial/controlflow more-control-flow-tools4704886 +Ref: 16544704886 +Ref: tutorial/controlflow tut-morecontrol4704886 +Ref: 16554704886 +Node: if Statements4705450 +Ref: tutorial/controlflow if-statements4705546 +Ref: 16564705546 +Ref: tutorial/controlflow tut-if4705546 +Ref: 16574705546 +Node: for Statements4706572 +Ref: tutorial/controlflow for-statements4706695 +Ref: 165a4706695 +Ref: tutorial/controlflow tut-for4706695 +Ref: 165b4706695 +Node: The range Function4708060 +Ref: tutorial/controlflow the-range-function4708225 +Ref: 165c4708225 +Ref: tutorial/controlflow tut-range4708225 +Ref: 165d4708225 +Node: break and continue Statements and else Clauses on Loops4710367 +Ref: tutorial/controlflow break-and-continue-statements-and-else-clauses-on-loops4710533 +Ref: 16604710533 +Ref: tutorial/controlflow tut-break4710533 +Ref: 16614710533 +Node: pass Statements4712750 +Ref: tutorial/controlflow pass-statements4712914 +Ref: 16634712914 +Ref: tutorial/controlflow tut-pass4712914 +Ref: 16644712914 +Node: match Statements4713643 +Ref: tutorial/controlflow match-statements4713770 +Ref: 16664713770 +Ref: tutorial/controlflow tut-match4713770 +Ref: 16594713770 +Ref: match Statements-Footnote-14720220 +Node: Defining Functions4720262 +Ref: tutorial/controlflow defining-functions4720400 +Ref: 16674720400 +Ref: tutorial/controlflow tut-functions4720400 +Ref: 16684720400 +Ref: Defining Functions-Footnote-14725410 +Node: More on Defining Functions4725608 +Ref: tutorial/controlflow more-on-defining-functions4725753 +Ref: 166c4725753 +Ref: tutorial/controlflow tut-defining4725753 +Ref: 166d4725753 +Node: Default Argument Values4726160 +Ref: tutorial/controlflow default-argument-values4726272 +Ref: 166e4726272 +Ref: tutorial/controlflow tut-defaultargs4726272 +Ref: 166f4726272 +Node: Keyword Arguments4728283 +Ref: tutorial/controlflow keyword-arguments4728422 +Ref: 16704728422 +Ref: tutorial/controlflow tut-keywordargs4728422 +Ref: 16714728422 +Node: Special parameters4732161 +Ref: tutorial/controlflow special-parameters4732301 +Ref: 16734732301 +Node: Positional-or-Keyword Arguments4733438 +Ref: tutorial/controlflow positional-or-keyword-arguments4733559 +Ref: 16744733559 +Node: Positional-Only Parameters4733773 +Ref: tutorial/controlflow positional-only-parameters4733925 +Ref: 16754733925 +Node: Keyword-Only Arguments4734559 +Ref: tutorial/controlflow keyword-only-arguments4734697 +Ref: 16764734697 +Node: Function Examples4734948 +Ref: tutorial/controlflow function-examples4735065 +Ref: 16774735065 +Node: Recap4738119 +Ref: tutorial/controlflow recap4738205 +Ref: 16784738205 +Node: Arbitrary Argument Lists4739066 +Ref: tutorial/controlflow arbitrary-argument-lists4739213 +Ref: 16794739213 +Ref: tutorial/controlflow tut-arbitraryargs4739213 +Ref: 167a4739213 +Node: Unpacking Argument Lists4740249 +Ref: tutorial/controlflow tut-unpacking-arguments4740396 +Ref: 167b4740396 +Ref: tutorial/controlflow unpacking-argument-lists4740396 +Ref: 167c4740396 +Node: Lambda Expressions4741629 +Ref: tutorial/controlflow lambda-expressions4741773 +Ref: 167d4741773 +Ref: tutorial/controlflow tut-lambda4741773 +Ref: 167e4741773 +Node: Documentation Strings4742764 +Ref: tutorial/controlflow documentation-strings4742904 +Ref: 167f4742904 +Ref: tutorial/controlflow tut-docstrings4742904 +Ref: 16694742904 +Node: Function Annotations4744834 +Ref: tutorial/controlflow function-annotations4744947 +Ref: 16804744947 +Ref: tutorial/controlflow tut-annotations4744947 +Ref: 16814744947 +Ref: Function Annotations-Footnote-14746163 +Ref: Function Annotations-Footnote-24746205 +Node: Intermezzo Coding Style4746247 +Ref: tutorial/controlflow intermezzo-coding-style4746365 +Ref: 16844746365 +Ref: tutorial/controlflow tut-codingstyle4746365 +Ref: 16854746365 +Ref: Intermezzo Coding Style-Footnote-14748523 +Node: Data Structures4748565 +Ref: tutorial/datastructures doc4748684 +Ref: 16874748684 +Ref: tutorial/datastructures data-structures4748684 +Ref: 16884748684 +Ref: tutorial/datastructures tut-structures4748684 +Ref: 165f4748684 +Node: More on Lists4749029 +Ref: tutorial/datastructures more-on-lists4749120 +Ref: 16894749120 +Ref: tutorial/datastructures tut-morelists4749120 +Ref: 168a4749120 +Ref: More on Lists-Footnote-14752990 +Node: Using Lists as Stacks4753127 +Ref: tutorial/datastructures tut-lists-as-stacks4753228 +Ref: 168b4753228 +Ref: tutorial/datastructures using-lists-as-stacks4753228 +Ref: 168c4753228 +Node: Using Lists as Queues4753862 +Ref: tutorial/datastructures tut-lists-as-queues4753994 +Ref: 168d4753994 +Ref: tutorial/datastructures using-lists-as-queues4753994 +Ref: 168e4753994 +Node: List Comprehensions<2>4755058 +Ref: tutorial/datastructures list-comprehensions4755195 +Ref: 168f4755195 +Ref: tutorial/datastructures tut-listcomps4755195 +Ref: 16904755195 +Node: Nested List Comprehensions4758436 +Ref: tutorial/datastructures nested-list-comprehensions4758543 +Ref: 16914758543 +Node: The del statement4760201 +Ref: tutorial/datastructures the-del-statement4760321 +Ref: 16924760321 +Ref: tutorial/datastructures tut-del4760321 +Ref: 16934760321 +Node: Tuples and Sequences4761173 +Ref: tutorial/datastructures tuples-and-sequences4761284 +Ref: 16954761284 +Ref: tutorial/datastructures tut-tuples4761284 +Ref: 16724761284 +Node: Sets4764317 +Ref: tutorial/datastructures sets4764423 +Ref: 16974764423 +Ref: tutorial/datastructures tut-sets4764423 +Ref: 16984764423 +Node: Dictionaries4766164 +Ref: tutorial/datastructures dictionaries4766268 +Ref: 16994766268 +Ref: tutorial/datastructures tut-dictionaries4766268 +Ref: 169a4766268 +Node: Looping Techniques4769089 +Ref: tutorial/datastructures looping-techniques4769207 +Ref: 169b4769207 +Ref: tutorial/datastructures tut-loopidioms4769207 +Ref: 165e4769207 +Node: More on Conditions4771835 +Ref: tutorial/datastructures more-on-conditions4771976 +Ref: 169c4771976 +Ref: tutorial/datastructures tut-conditions4771976 +Ref: 169d4771976 +Node: Comparing Sequences and Other Types4774051 +Ref: tutorial/datastructures comparing-sequences-and-other-types4774165 +Ref: 169f4774165 +Ref: tutorial/datastructures tut-comparing4774165 +Ref: 16a04774165 +Node: Modules4775752 +Ref: tutorial/modules doc4775864 +Ref: 16a14775864 +Ref: tutorial/modules modules4775864 +Ref: 16a24775864 +Ref: tutorial/modules tut-modules4775864 +Ref: 16a34775864 +Node: More on Modules4778488 +Ref: tutorial/modules more-on-modules4778572 +Ref: 16a64778572 +Ref: tutorial/modules tut-moremodules4778572 +Ref: 16a74778572 +Ref: More on Modules-Footnote-14781740 +Node: Executing modules as scripts4781939 +Ref: tutorial/modules executing-modules-as-scripts4782050 +Ref: 16a84782050 +Ref: tutorial/modules tut-modulesasscripts4782050 +Ref: 16a94782050 +Node: The Module Search Path4782938 +Ref: tutorial/modules the-module-search-path4783085 +Ref: 16aa4783085 +Ref: tutorial/modules tut-searchpath4783085 +Ref: 16ab4783085 +Node: “Compiled” Python files4784669 +Ref: tutorial/modules compiled-python-files4784779 +Ref: 16af4784779 +Ref: tutorial/modules tut-pycache4784779 +Ref: 2a44784779 +Ref: “Compiled” Python files-Footnote-14787088 +Node: Standard Modules4787130 +Ref: tutorial/modules standard-modules4787239 +Ref: 16b04787239 +Ref: tutorial/modules tut-standardmodules4787239 +Ref: 16ae4787239 +Node: The dir Function4788703 +Ref: tutorial/modules the-dir-function4788805 +Ref: 16b14788805 +Ref: tutorial/modules tut-dir4788805 +Ref: 16b24788805 +Node: Packages4793328 +Ref: tutorial/modules packages4793405 +Ref: 16b34793405 +Ref: tutorial/modules tut-packages4793405 +Ref: 16b44793405 +Node: Importing * From a Package4797708 +Ref: tutorial/modules importing-from-a-package4797812 +Ref: 16b54797812 +Ref: tutorial/modules tut-pkg-import-star4797812 +Ref: 16b64797812 +Node: Intra-package References4800462 +Ref: tutorial/modules id24800607 +Ref: 16b74800607 +Ref: tutorial/modules intra-package-references4800607 +Ref: 16b84800607 +Node: Packages in Multiple Directories4801620 +Ref: tutorial/modules packages-in-multiple-directories4801730 +Ref: 16b94801730 +Node: Input and Output4802259 +Ref: tutorial/inputoutput doc4802377 +Ref: 16bb4802377 +Ref: tutorial/inputoutput input-and-output4802377 +Ref: 16bc4802377 +Ref: tutorial/inputoutput tut-io4802377 +Ref: 16bd4802377 +Node: Fancier Output Formatting4802686 +Ref: tutorial/inputoutput fancier-output-formatting4802798 +Ref: 16be4802798 +Ref: tutorial/inputoutput tut-formatting4802798 +Ref: 16bf4802798 +Node: Formatted String Literals4806520 +Ref: tutorial/inputoutput formatted-string-literals4806640 +Ref: 16c14806640 +Ref: tutorial/inputoutput tut-f-strings4806640 +Ref: 16c04806640 +Node: The String format Method4808643 +Ref: tutorial/inputoutput the-string-format-method4808796 +Ref: 16c24808796 +Ref: tutorial/inputoutput tut-string-format4808796 +Ref: 16c34808796 +Node: Manual String Formatting4811483 +Ref: tutorial/inputoutput manual-string-formatting4811632 +Ref: 16c44811632 +Node: Old string formatting4813161 +Ref: tutorial/inputoutput old-string-formatting4813277 +Ref: 16c94813277 +Node: Reading and Writing Files4813827 +Ref: tutorial/inputoutput reading-and-writing-files4813939 +Ref: 16ca4813939 +Ref: tutorial/inputoutput tut-files4813939 +Ref: 16cb4813939 +Node: Methods of File Objects4817191 +Ref: tutorial/inputoutput methods-of-file-objects4817317 +Ref: 16cc4817317 +Ref: tutorial/inputoutput tut-filemethods4817317 +Ref: 16cd4817317 +Node: Saving structured data with json4821011 +Ref: tutorial/inputoutput saving-structured-data-with-json4821137 +Ref: 16ce4821137 +Ref: tutorial/inputoutput tut-json4821137 +Ref: 16cf4821137 +Ref: Saving structured data with json-Footnote-14823997 +Node: Errors and Exceptions4824021 +Ref: tutorial/errors doc4824139 +Ref: 16d24824139 +Ref: tutorial/errors errors-and-exceptions4824139 +Ref: 16d34824139 +Ref: tutorial/errors tut-errors4824139 +Ref: 16d44824139 +Node: Syntax Errors4824709 +Ref: tutorial/errors syntax-errors4824799 +Ref: 16d54824799 +Ref: tutorial/errors tut-syntaxerrors4824799 +Ref: 16d64824799 +Node: Exceptions4825602 +Ref: tutorial/errors exceptions4825720 +Ref: 16d74825720 +Ref: tutorial/errors tut-exceptions4825720 +Ref: 16d84825720 +Node: Handling Exceptions4827553 +Ref: tutorial/errors handling-exceptions4827676 +Ref: 16d94827676 +Ref: tutorial/errors tut-handling4827676 +Ref: 16624827676 +Node: Raising Exceptions4834126 +Ref: tutorial/errors raising-exceptions4834257 +Ref: 16da4834257 +Ref: tutorial/errors tut-raising4834257 +Ref: 16db4834257 +Node: Exception Chaining4835458 +Ref: tutorial/errors exception-chaining4835593 +Ref: 16dc4835593 +Ref: tutorial/errors tut-exception-chaining4835593 +Ref: 16dd4835593 +Node: User-defined Exceptions4837573 +Ref: tutorial/errors tut-userexceptions4837715 +Ref: 16de4837715 +Ref: tutorial/errors user-defined-exceptions4837715 +Ref: 16df4837715 +Node: Defining Clean-up Actions4838475 +Ref: tutorial/errors defining-clean-up-actions4838626 +Ref: 16e04838626 +Ref: tutorial/errors tut-cleanup4838626 +Ref: 16e14838626 +Node: Predefined Clean-up Actions4841913 +Ref: tutorial/errors predefined-clean-up-actions4842091 +Ref: 16e24842091 +Ref: tutorial/errors tut-cleanup-with4842091 +Ref: 16e34842091 +Node: Raising and Handling Multiple Unrelated Exceptions4843210 +Ref: tutorial/errors raising-and-handling-multiple-unrelated-exceptions4843394 +Ref: 16e44843394 +Ref: tutorial/errors tut-exception-groups4843394 +Ref: 16e54843394 +Node: Enriching Exceptions with Notes4846582 +Ref: tutorial/errors enriching-exceptions-with-notes4846730 +Ref: 16e64846730 +Node: Classes4849246 +Ref: tutorial/classes doc4849382 +Ref: 16e74849382 +Ref: tutorial/classes classes4849382 +Ref: 16e84849382 +Ref: tutorial/classes tut-classes4849382 +Ref: 166b4849382 +Node: A Word About Names and Objects4851696 +Ref: tutorial/classes a-word-about-names-and-objects4851807 +Ref: 16ea4851807 +Ref: tutorial/classes tut-object4851807 +Ref: 16eb4851807 +Node: Python Scopes and Namespaces4852729 +Ref: tutorial/classes python-scopes-and-namespaces4852872 +Ref: 16ec4852872 +Ref: tutorial/classes tut-scopes4852872 +Ref: 16a54852872 +Ref: Python Scopes and Namespaces-Footnote-14858959 +Node: Scopes and Namespaces Example4859349 +Ref: tutorial/classes scopes-and-namespaces-example4859443 +Ref: 16ee4859443 +Ref: tutorial/classes tut-scopeexample4859443 +Ref: 16ef4859443 +Node: A First Look at Classes4860808 +Ref: tutorial/classes a-first-look-at-classes4860935 +Ref: 16f04860935 +Ref: tutorial/classes tut-firstclasses4860935 +Ref: 16864860935 +Node: Class Definition Syntax4861220 +Ref: tutorial/classes class-definition-syntax4861325 +Ref: 16f14861325 +Ref: tutorial/classes tut-classdefinition4861325 +Ref: 16f24861325 +Node: Class Objects4862862 +Ref: tutorial/classes class-objects4862992 +Ref: 16f34862992 +Ref: tutorial/classes tut-classobjects4862992 +Ref: 16f44862992 +Node: Instance Objects4865164 +Ref: tutorial/classes instance-objects4865285 +Ref: 16f54865285 +Ref: tutorial/classes tut-instanceobjects4865285 +Ref: 16f64865285 +Node: Method Objects4866949 +Ref: tutorial/classes method-objects4867085 +Ref: 16f74867085 +Ref: tutorial/classes tut-methodobjects4867085 +Ref: 16f84867085 +Node: Class and Instance Variables4869026 +Ref: tutorial/classes class-and-instance-variables4869137 +Ref: 16f94869137 +Ref: tutorial/classes tut-class-and-instance-variables4869137 +Ref: 16fa4869137 +Node: Random Remarks4871181 +Ref: tutorial/classes random-remarks4871291 +Ref: 16fb4871291 +Ref: tutorial/classes tut-remarks4871291 +Ref: 16fc4871291 +Node: Inheritance4875124 +Ref: tutorial/classes inheritance4875228 +Ref: 16fd4875228 +Ref: tutorial/classes tut-inheritance4875228 +Ref: 16fe4875228 +Node: Multiple Inheritance4877997 +Ref: tutorial/classes multiple-inheritance4878065 +Ref: 16ff4878065 +Ref: tutorial/classes tut-multiple4878065 +Ref: 17004878065 +Node: Private Variables4880066 +Ref: tutorial/classes private-variables4880169 +Ref: 17014880169 +Ref: tutorial/classes tut-private4880169 +Ref: 16e94880169 +Node: Odds and Ends4882857 +Ref: tutorial/classes odds-and-ends4882958 +Ref: 17024882958 +Ref: tutorial/classes tut-odds4882958 +Ref: 17034882958 +Node: Iterators4883963 +Ref: tutorial/classes iterators4884057 +Ref: 17044884057 +Ref: tutorial/classes tut-iterators4884057 +Ref: 17054884057 +Node: Generators4886332 +Ref: tutorial/classes generators4886434 +Ref: 17064886434 +Ref: tutorial/classes tut-generators4886434 +Ref: 17074886434 +Node: Generator Expressions4887866 +Ref: tutorial/classes generator-expressions4887950 +Ref: 17094887950 +Ref: tutorial/classes tut-genexps4887950 +Ref: 170a4887950 +Node: Brief Tour of the Standard Library4888937 +Ref: tutorial/stdlib doc4889098 +Ref: 170b4889098 +Ref: tutorial/stdlib brief-tour-of-the-standard-library4889098 +Ref: 170c4889098 +Ref: tutorial/stdlib tut-brieftour4889098 +Ref: 170d4889098 +Node: Operating System Interface4889495 +Ref: tutorial/stdlib operating-system-interface4889615 +Ref: 170e4889615 +Ref: tutorial/stdlib tut-os-interface4889615 +Ref: 170f4889615 +Node: File Wildcards4890881 +Ref: tutorial/stdlib file-wildcards4891032 +Ref: 17104891032 +Ref: tutorial/stdlib tut-file-wildcards4891032 +Ref: 17114891032 +Node: Command Line Arguments4891274 +Ref: tutorial/stdlib command-line-arguments4891447 +Ref: 17124891447 +Ref: tutorial/stdlib tut-command-line-arguments4891447 +Ref: 17134891447 +Node: Error Output Redirection and Program Termination4892561 +Ref: tutorial/stdlib error-output-redirection-and-program-termination4892743 +Ref: 17144892743 +Ref: tutorial/stdlib tut-stderr4892743 +Ref: 17154892743 +Node: String Pattern Matching4893266 +Ref: tutorial/stdlib string-pattern-matching4893437 +Ref: 17164893437 +Ref: tutorial/stdlib tut-string-pattern-matching4893437 +Ref: 17174893437 +Node: Mathematics4894076 +Ref: tutorial/stdlib mathematics4894214 +Ref: 17184894214 +Ref: tutorial/stdlib tut-mathematics4894214 +Ref: 17194894214 +Node: Internet Access4895362 +Ref: tutorial/stdlib internet-access4895492 +Ref: 171a4895492 +Ref: tutorial/stdlib tut-internet-access4895492 +Ref: 171b4895492 +Node: Dates and Times4896550 +Ref: tutorial/stdlib dates-and-times4896685 +Ref: 171c4896685 +Ref: tutorial/stdlib tut-dates-and-times4896685 +Ref: 171d4896685 +Node: Data Compression4897506 +Ref: tutorial/stdlib data-compression4897649 +Ref: 171e4897649 +Ref: tutorial/stdlib tut-data-compression4897649 +Ref: 171f4897649 +Node: Performance Measurement4898171 +Ref: tutorial/stdlib performance-measurement4898314 +Ref: 17204898314 +Ref: tutorial/stdlib tut-performance-measurement4898314 +Ref: 17214898314 +Node: Quality Control4899189 +Ref: tutorial/stdlib quality-control4899334 +Ref: 17224899334 +Ref: tutorial/stdlib tut-quality-control4899334 +Ref: 17234899334 +Node: Batteries Included4900902 +Ref: tutorial/stdlib batteries-included4901015 +Ref: 17244901015 +Ref: tutorial/stdlib tut-batteries-included4901015 +Ref: 17254901015 +Ref: Batteries Included-Footnote-14902830 +Node: Brief Tour of the Standard Library — Part II4902889 +Ref: tutorial/stdlib2 doc4903076 +Ref: 17264903076 +Ref: tutorial/stdlib2 brief-tour-of-the-standard-library-part-ii4903076 +Ref: 17274903076 +Ref: tutorial/stdlib2 tut-brieftourtwo4903076 +Ref: 17284903076 +Node: Output Formatting4903550 +Ref: tutorial/stdlib2 output-formatting4903669 +Ref: 17294903669 +Ref: tutorial/stdlib2 tut-output-formatting4903669 +Ref: 172a4903669 +Node: Templating4905782 +Ref: tutorial/stdlib2 templating4905949 +Ref: 172b4905949 +Ref: tutorial/stdlib2 tut-templating4905949 +Ref: 172c4905949 +Node: Working with Binary Data Record Layouts4908513 +Ref: tutorial/stdlib2 tut-binary-formats4908681 +Ref: 172f4908681 +Ref: tutorial/stdlib2 working-with-binary-data-record-layouts4908681 +Ref: 17304908681 +Node: Multi-threading<2>4909856 +Ref: tutorial/stdlib2 multi-threading4910021 +Ref: 17324910021 +Ref: tutorial/stdlib2 tut-multi-threading4910021 +Ref: 17334910021 +Node: Logging4911965 +Ref: tutorial/stdlib2 logging4912106 +Ref: 17344912106 +Ref: tutorial/stdlib2 tut-logging4912106 +Ref: 17354912106 +Node: Weak References4913274 +Ref: tutorial/stdlib2 tut-weak-references4913425 +Ref: 17364913425 +Ref: tutorial/stdlib2 weak-references4913425 +Ref: 17374913425 +Node: Tools for Working with Lists4915183 +Ref: tutorial/stdlib2 tools-for-working-with-lists4915360 +Ref: 17384915360 +Ref: tutorial/stdlib2 tut-list-tools4915360 +Ref: 17394915360 +Node: Decimal Floating Point Arithmetic4917814 +Ref: tutorial/stdlib2 decimal-floating-point-arithmetic4917967 +Ref: 173a4917967 +Ref: tutorial/stdlib2 tut-decimal-fp4917967 +Ref: 173b4917967 +Node: Virtual Environments and Packages4919864 +Ref: tutorial/venv doc4920026 +Ref: 173c4920026 +Ref: tutorial/venv tut-venv4920026 +Ref: 173d4920026 +Ref: tutorial/venv virtual-environments-and-packages4920026 +Ref: 173e4920026 +Node: Introduction<4>4920213 +Ref: tutorial/venv introduction4920336 +Ref: 173f4920336 +Node: Creating Virtual Environments4921658 +Ref: tutorial/venv creating-virtual-environments4921816 +Ref: 17414921816 +Node: Managing Packages with pip4923937 +Ref: tutorial/venv managing-packages-with-pip4924071 +Ref: 17424924071 +Node: What Now?4928045 +Ref: tutorial/whatnow doc4928211 +Ref: 17434928211 +Ref: tutorial/whatnow tut-whatnow4928211 +Ref: 17444928211 +Ref: tutorial/whatnow what-now4928211 +Ref: 17454928211 +Ref: What Now?-Footnote-14931459 +Node: Interactive Input Editing and History Substitution4931612 +Ref: tutorial/interactive doc4931793 +Ref: 17474931793 +Ref: tutorial/interactive interactive-input-editing-and-history-substitution4931793 +Ref: 17484931793 +Ref: tutorial/interactive tut-interacting4931793 +Ref: 16324931793 +Ref: Interactive Input Editing and History Substitution-Footnote-14932389 +Node: Tab Completion and History Editing4932450 +Ref: tutorial/interactive tab-completion-and-history-editing4932623 +Ref: 17494932623 +Ref: tutorial/interactive tut-keybindings4932623 +Ref: 174a4932623 +Node: Alternatives to the Interactive Interpreter4933472 +Ref: tutorial/interactive alternatives-to-the-interactive-interpreter4933645 +Ref: 174b4933645 +Ref: tutorial/interactive tut-commentary4933645 +Ref: 174c4933645 +Ref: Alternatives to the Interactive Interpreter-Footnote-14934539 +Ref: Alternatives to the Interactive Interpreter-Footnote-24934568 +Node: Floating Point Arithmetic Issues and Limitations4934613 +Ref: tutorial/floatingpoint doc4934793 +Ref: 174d4934793 +Ref: tutorial/floatingpoint bpython4934793 +Ref: 174e4934793 +Ref: tutorial/floatingpoint floating-point-arithmetic-issues-and-limitations4934793 +Ref: 174f4934793 +Ref: tutorial/floatingpoint tut-fp-issues4934793 +Ref: 17504934793 +Ref: Floating Point Arithmetic Issues and Limitations-Footnote-14942877 +Node: Representation Error4942917 +Ref: tutorial/floatingpoint representation-error4943022 +Ref: 17534943022 +Ref: tutorial/floatingpoint tut-fp-error4943022 +Ref: 17544943022 +Node: Appendix4946228 +Ref: tutorial/appendix doc4946349 +Ref: 17554946349 +Ref: tutorial/appendix appendix4946349 +Ref: 17564946349 +Ref: tutorial/appendix tut-appendix4946349 +Ref: 17574946349 +Node: Interactive Mode<2>4946429 +Ref: tutorial/appendix interactive-mode4946493 +Ref: 17584946493 +Ref: tutorial/appendix tut-interac4946493 +Ref: 16364946493 +Node: Error Handling4946664 +Ref: tutorial/appendix error-handling4946768 +Ref: 17594946768 +Ref: tutorial/appendix tut-error4946768 +Ref: 175a4946768 +Ref: Error Handling-Footnote-14947824 +Node: Executable Python Scripts4947890 +Ref: tutorial/appendix executable-python-scripts4948031 +Ref: 175b4948031 +Ref: tutorial/appendix tut-scripts4948031 +Ref: 163b4948031 +Node: The Interactive Startup File4949113 +Ref: tutorial/appendix the-interactive-startup-file4949265 +Ref: 175c4949265 +Ref: tutorial/appendix tut-startup4949265 +Ref: 175d4949265 +Node: The Customization Modules4950701 +Ref: tutorial/appendix the-customization-modules4950819 +Ref: 175e4950819 +Ref: tutorial/appendix tut-customize4950819 +Ref: 175f4950819 +Node: Python Setup and Usage4951723 +Ref: using/index doc4951851 +Ref: 17604951851 +Ref: using/index python-setup-and-usage4951851 +Ref: 17614951851 +Ref: using/index using-index4951851 +Ref: 17624951851 +Node: Command line and environment4952288 +Ref: using/cmdline doc4952414 +Ref: 17634952414 +Ref: using/cmdline command-line-and-environment4952414 +Ref: 17644952414 +Ref: using/cmdline using-on-general4952414 +Ref: 13e04952414 +Node: Command line4952783 +Ref: using/cmdline command-line4952890 +Ref: 17664952890 +Ref: using/cmdline using-on-cmdline4952890 +Ref: ca94952890 +Node: Interface options4953284 +Ref: using/cmdline interface-options4953374 +Ref: 17674953374 +Ref: using/cmdline using-on-interface-options4953374 +Ref: 17684953374 +Ref: using/cmdline cmdoption-c4954756 +Ref: 1ad4954756 +Ref: using/cmdline cmdoption-m4955332 +Ref: 1ae4955332 +Ref: using/cmdline cmdarg-dash4957735 +Ref: 17694957735 +Ref: using/cmdline cmdarg-script4958153 +Ref: 176a4958153 +Ref: Interface options-Footnote-14960006 +Node: Generic options4960048 +Ref: using/cmdline generic-options4960168 +Ref: 176b4960168 +Ref: using/cmdline using-on-generic-options4960168 +Ref: 176c4960168 +Ref: using/cmdline cmdoption-04960217 +Ref: 108b4960217 +Ref: using/cmdline cmdoption4960217 +Ref: 176d4960217 +Ref: using/cmdline cmdoption-h4960240 +Ref: 176e4960240 +Ref: using/cmdline cmdoption-help4960263 +Ref: 1c24960263 +Ref: using/cmdline cmdoption-help-env4960406 +Ref: 1c44960406 +Ref: using/cmdline cmdoption-help-xoptions4960553 +Ref: 1c54960553 +Ref: using/cmdline cmdoption-help-all4960708 +Ref: 1c64960708 +Ref: using/cmdline cmdoption-V4960816 +Ref: 98f4960816 +Ref: using/cmdline cmdoption-v4960816 +Ref: 176f4960816 +Ref: using/cmdline cmdoption-version4960839 +Ref: 98e4960839 +Node: Miscellaneous options4961187 +Ref: using/cmdline miscellaneous-options4961317 +Ref: 17704961317 +Ref: using/cmdline using-on-misc-options4961317 +Ref: caa4961317 +Ref: using/cmdline cmdoption-b4961378 +Ref: 1b14961378 +Ref: using/cmdline cmdoption-B4961717 +Ref: 103a4961717 +Ref: using/cmdline cmdoption-check-hash-based-pycs4961887 +Ref: 17714961887 +Ref: using/cmdline cmdoption-d4962589 +Ref: 17724962589 +Ref: using/cmdline cmdoption-E4962744 +Ref: 5af4962744 +Ref: using/cmdline cmdoption-e4962744 +Ref: 17744962744 +Ref: using/cmdline cmdoption-i4962975 +Ref: 111d4962975 +Ref: using/cmdline cmdoption-I4963433 +Ref: 5b04963433 +Ref: using/cmdline cmdoption-O4963891 +Ref: a344963891 +Ref: using/cmdline cmdoption-o4963891 +Ref: 17754963891 +Ref: using/cmdline cmdoption-OO4964287 +Ref: a354964287 +Ref: using/cmdline cmdoption-oo4964287 +Ref: 17774964287 +Ref: using/cmdline cmdoption-P4964600 +Ref: 15f4964600 +Ref: using/cmdline cmdoption-p4964600 +Ref: 17784964600 +Ref: using/cmdline cmdoption-q4965279 +Ref: 17794965279 +Ref: using/cmdline cmdoption-R4965417 +Ref: 14d94965417 +Ref: using/cmdline cmdoption-r4965417 +Ref: 177a4965417 +Ref: using/cmdline cmdoption-s4966472 +Ref: 101c4966472 +Ref: using/cmdline cmdoption-S4966672 +Ref: e5c4966672 +Ref: using/cmdline cmdoption-u4966997 +Ref: 13c14966997 +Ref: using/cmdline cmdoption-14967281 +Ref: 10884967281 +Ref: using/cmdline using-on-warnings4967793 +Ref: 177e4967793 +Ref: using/cmdline cmdoption-W4967793 +Ref: 5024967793 +Ref: using/cmdline cmdoption-w4967793 +Ref: 177f4967793 +Ref: using/cmdline cmdoption-x4970273 +Ref: 17814970273 +Ref: using/cmdline cmdoption-X4970438 +Ref: 1744970438 +Ref: Miscellaneous options-Footnote-14975038 +Ref: Miscellaneous options-Footnote-24975080 +Ref: Miscellaneous options-Footnote-34975122 +Ref: Miscellaneous options-Footnote-44975164 +Ref: Miscellaneous options-Footnote-54975206 +Node: Options you shouldn’t use4975248 +Ref: using/cmdline options-you-shouldn-t-use4975354 +Ref: 17854975354 +Ref: using/cmdline cmdoption-J4975425 +Ref: 10394975425 +Ref: using/cmdline cmdoption-j4975425 +Ref: 17864975425 +Ref: Options you shouldn’t use-Footnote-14975522 +Node: Environment variables4975554 +Ref: using/cmdline environment-variables4975661 +Ref: 17874975661 +Ref: using/cmdline using-on-envvars4975661 +Ref: 1c34975661 +Ref: using/cmdline envvar-PYTHONHOME4975954 +Ref: 8ae4975954 +Ref: using/cmdline envvar-PYTHONPATH4976560 +Ref: cc74976560 +Ref: using/cmdline envvar-PYTHONSAFEPATH4977623 +Ref: 1604977623 +Ref: using/cmdline envvar-PYTHONPLATLIBDIR4977856 +Ref: 134a4977856 +Ref: using/cmdline envvar-PYTHONSTARTUP4978026 +Ref: c6a4978026 +Ref: using/cmdline envvar-PYTHONOPTIMIZE4978715 +Ref: 17764978715 +Ref: using/cmdline envvar-PYTHONBREAKPOINT4978953 +Ref: 72f4978953 +Ref: using/cmdline envvar-PYTHONDEBUG4979576 +Ref: 17734979576 +Ref: using/cmdline envvar-PYTHONINSPECT4979813 +Ref: 111c4979813 +Ref: using/cmdline envvar-PYTHONUNBUFFERED4980097 +Ref: 13c24980097 +Ref: using/cmdline envvar-PYTHONVERBOSE4980248 +Ref: 177d4980248 +Ref: using/cmdline envvar-PYTHONCASEOK4980487 +Ref: 5ae4980487 +Ref: using/cmdline envvar-PYTHONDONTWRITEBYTECODE4980647 +Ref: 103b4980647 +Ref: using/cmdline envvar-PYTHONPYCACHEPREFIX4980892 +Ref: 5f34980892 +Ref: using/cmdline envvar-PYTHONHASHSEED4981233 +Ref: d2e4981233 +Ref: using/cmdline envvar-PYTHONINTMAXSTRDIGITS4981916 +Ref: 11834981916 +Ref: using/cmdline envvar-PYTHONIOENCODING4982154 +Ref: cad4982154 +Ref: using/cmdline envvar-PYTHONNOUSERSITE4982977 +Ref: 101d4982977 +Ref: using/cmdline envvar-PYTHONUSERBASE4983220 +Ref: 101b4983220 +Ref: using/cmdline envvar-PYTHONEXECUTABLE4983582 +Ref: 178d4983582 +Ref: using/cmdline envvar-PYTHONWARNINGS4983792 +Ref: 80e4983792 +Ref: using/cmdline envvar-PYTHONFAULTHANDLER4984714 +Ref: d314984714 +Ref: using/cmdline envvar-PYTHONTRACEMALLOC4985126 +Ref: 178e4985126 +Ref: using/cmdline envvar-PYTHONPROFILEIMPORTTIME4985601 +Ref: 74a4985601 +Ref: using/cmdline envvar-PYTHONASYNCIODEBUG4985878 +Ref: 178f4985878 +Ref: using/cmdline envvar-PYTHONMALLOC4986088 +Ref: 8d54986088 +Ref: using/cmdline envvar-PYTHONMALLOCSTATS4987151 +Ref: 159c4987151 +Ref: using/cmdline envvar-PYTHONLEGACYWINDOWSFSENCODING4987766 +Ref: 8c94987766 +Ref: using/cmdline envvar-PYTHONLEGACYWINDOWSSTDIO4988302 +Ref: 8cc4988302 +Ref: using/cmdline envvar-PYTHONCOERCECLOCALE4988773 +Ref: 7284988773 +Ref: using/cmdline envvar-PYTHONDEVMODE4991500 +Ref: 7434991500 +Ref: using/cmdline envvar-PYTHONUTF84991772 +Ref: 72c4991772 +Ref: using/cmdline envvar-PYTHONWARNDEFAULTENCODING4992066 +Ref: 3a64992066 +Ref: using/cmdline envvar-PYTHONNODEBUGRANGES4992368 +Ref: 1754992368 +Ref: Environment variables-Footnote-14992906 +Ref: Environment variables-Footnote-24992948 +Ref: Environment variables-Footnote-34992990 +Ref: Environment variables-Footnote-44993032 +Node: Debug-mode variables4993074 +Ref: using/cmdline debug-mode-variables4993152 +Ref: 17964993152 +Ref: using/cmdline envvar-PYTHONTHREADDEBUG4993211 +Ref: 2e94993211 +Ref: using/cmdline envvar-PYTHONDUMPREFS4993439 +Ref: 5f64993439 +Ref: using/cmdline envvar-PYTHONDUMPREFSFILE-FILENAME4993683 +Ref: 17974993683 +Ref: using/cmdline envvar-PYTHONDUMPREFSFILE=FILENAME4993683 +Ref: 17984993683 +Node: Using Python on Unix platforms4993997 +Ref: using/unix doc4994148 +Ref: 17994994148 +Ref: using/unix using-on-unix4994148 +Ref: 179a4994148 +Ref: using/unix using-python-on-unix-platforms4994148 +Ref: 179b4994148 +Node: Getting and installing the latest version of Python4994377 +Ref: using/unix getting-and-installing-the-latest-version-of-python4994519 +Ref: 179c4994519 +Node: On Linux4994705 +Ref: using/unix on-linux4994832 +Ref: 179d4994832 +Node: On FreeBSD and OpenBSD4995749 +Ref: using/unix on-freebsd-and-openbsd4995899 +Ref: 179e4995899 +Node: On OpenSolaris4996389 +Ref: using/unix on-opensolaris4996522 +Ref: 179f4996522 +Ref: On OpenSolaris-Footnote-14996742 +Node: Building Python4996775 +Ref: using/unix building-python4996956 +Ref: 17a04996956 +Ref: using/unix building-python-on-unix4996956 +Ref: b834996956 +Ref: Building Python-Footnote-14997784 +Ref: Building Python-Footnote-24997833 +Ref: Building Python-Footnote-34997896 +Node: Python-related paths and files4997959 +Ref: using/unix python-related-paths-and-files4998102 +Ref: 17a24998102 +Node: Miscellaneous4999672 +Ref: using/unix miscellaneous4999814 +Ref: 17a34999814 +Node: Custom OpenSSL5000372 +Ref: using/unix custom-openssl5000475 +Ref: 17a45000475 +Ref: using/unix unix-custom-openssl5000475 +Ref: 17a55000475 +Node: Configure Python5002095 +Ref: using/configure doc5002241 +Ref: 17a65002241 +Ref: using/configure configure-python5002241 +Ref: 17a75002241 +Node: Configure Options5002370 +Ref: using/configure configure-options5002468 +Ref: 17a15002468 +Ref: using/configure id15002468 +Ref: 17a85002468 +Node: General Options5002917 +Ref: using/configure general-options5003014 +Ref: 17a95003014 +Ref: using/configure cmdoption-enable-loadable-sqlite-extensions5003063 +Ref: 17aa5003063 +Ref: using/configure cmdoption-disable-ipv65003355 +Ref: 17ab5003355 +Ref: using/configure cmdoption-enable-big-digits5003492 +Ref: 31c5003492 +Ref: using/configure cmdoption-with-cxx-main5003784 +Ref: 17ac5003784 +Ref: using/configure cmdoption-05003821 +Ref: 17ad5003821 +Ref: using/configure cmdoption-with-suffix5004005 +Ref: 17ae5004005 +Ref: using/configure cmdoption-with-tzpath5004478 +Ref: 17af5004478 +Ref: using/configure cmdoption-without-decimal-contextvar5004923 +Ref: 17b25004923 +Ref: using/configure cmdoption-with-dbmliborder5005261 +Ref: 17b45005261 +Ref: using/configure cmdoption-without-c-locale-coercion5005552 +Ref: 17b55005552 +Ref: using/configure cmdoption-with-platlibdir5005803 +Ref: 17b65005803 +Ref: using/configure cmdoption-with-wheel-pkg-dir5006032 +Ref: 4b35006032 +Ref: using/configure cmdoption-with-pkg-config5006461 +Ref: 17b75006461 +Ref: using/configure cmdoption-enable-pystats5006823 +Ref: 17b85006823 +Ref: General Options-Footnote-15007180 +Node: WebAssembly Options5007222 +Ref: using/configure webassembly-options5007343 +Ref: 17b95007343 +Ref: using/configure cmdoption-with-emscripten-target5007400 +Ref: 17ba5007400 +Ref: using/configure cmdoption-enable-wasm-dynamic-linking5007669 +Ref: 121b5007669 +Ref: using/configure cmdoption-enable-wasm-pthreads5007950 +Ref: 11e65007950 +Node: Install Options5008062 +Ref: using/configure install-options5008187 +Ref: 17bb5008187 +Ref: using/configure cmdoption-disable-test-modules5008236 +Ref: 4b25008236 +Ref: using/configure cmdoption-with-ensurepip5008471 +Ref: 17bc5008471 +Node: Performance options5008860 +Ref: using/configure performance-options5008984 +Ref: 17bd5008984 +Ref: using/configure cmdoption-enable-optimizations5009156 +Ref: 45e5009156 +Ref: using/configure envvar-PROFILE_TASK5009744 +Ref: 17be5009744 +Ref: using/configure cmdoption-with-lto5009984 +Ref: 31b5009984 +Ref: using/configure cmdoption-with-computed-gotos5010381 +Ref: 17bf5010381 +Ref: using/configure cmdoption-without-pymalloc5010521 +Ref: 17c05010521 +Ref: using/configure cmdoption-without-doc-strings5010725 +Ref: 17c15010725 +Ref: using/configure cmdoption-enable-profiling5011030 +Ref: 17c25011030 +Node: Python Debug Build5011146 +Ref: using/configure debug-build5011268 +Ref: 4965011268 +Ref: using/configure python-debug-build5011268 +Ref: 17c35011268 +Node: Debug options5013449 +Ref: using/configure debug-options5013566 +Ref: 17c65013566 +Ref: using/configure cmdoption-with-pydebug5013611 +Ref: 17c45013611 +Ref: using/configure cmdoption-with-trace-refs5013753 +Ref: 4d05013753 +Ref: using/configure cmdoption-with-assertions5014218 +Ref: 17c55014218 +Ref: using/configure cmdoption-with-valgrind5014613 +Ref: 17c85014613 +Ref: using/configure cmdoption-with-dtrace5014697 +Ref: 17c95014697 +Ref: using/configure cmdoption-with-address-sanitizer5014873 +Ref: 17ca5014873 +Ref: using/configure cmdoption-with-memory-sanitizer5015031 +Ref: 17cb5015031 +Ref: using/configure cmdoption-with-undefined-behavior-sanitizer5015191 +Ref: 17cc5015191 +Node: Linker options5015378 +Ref: using/configure linker-options5015494 +Ref: 17cd5015494 +Ref: using/configure cmdoption-enable-shared5015541 +Ref: 45f5015541 +Ref: using/configure cmdoption-without-static-libpython5015663 +Ref: 4b45015663 +Node: Libraries options5015857 +Ref: using/configure libraries-options5015976 +Ref: 17ce5015976 +Ref: using/configure cmdoption-with-libs5016029 +Ref: 17cf5016029 +Ref: using/configure cmdoption-with-system-expat5016130 +Ref: 17d05016130 +Ref: using/configure cmdoption-with-system-ffi5016269 +Ref: 17d15016269 +Ref: using/configure cmdoption-with-system-libmpdec5016467 +Ref: 17d25016467 +Ref: using/configure cmdoption-with-readline5016681 +Ref: 17d35016681 +Ref: using/configure cmdoption-without-readline5016883 +Ref: 17d45016883 +Ref: using/configure cmdoption-with-libm5017076 +Ref: 17d55017076 +Ref: using/configure cmdoption-with-libc5017203 +Ref: 17d65017203 +Ref: using/configure cmdoption-with-openssl5017327 +Ref: 17d75017327 +Ref: using/configure cmdoption-with-openssl-rpath5017430 +Ref: 4b55017430 +Node: Security Options5017778 +Ref: using/configure security-options5017896 +Ref: 17d85017896 +Ref: using/configure cmdoption-with-hash-algorithm5017947 +Ref: 17d95017947 +Ref: using/configure cmdoption-with-builtin-hashlib-hashes5018276 +Ref: 17da5018276 +Ref: using/configure cmdoption-with-ssl-default-suites5018583 +Ref: 17db5018583 +Node: macOS Options5019071 +Ref: using/configure macos-options5019195 +Ref: 17dc5019195 +Ref: using/configure cmdoption-enable-universalsdk5019269 +Ref: 17dd5019269 +Ref: using/configure cmdoption-15019312 +Ref: 5bf5019312 +Ref: using/configure cmdoption-enable-framework5019495 +Ref: 17de5019495 +Ref: using/configure cmdoption-25019535 +Ref: 17df5019535 +Ref: using/configure cmdoption-with-universal-archs5019739 +Ref: 17e05019739 +Ref: using/configure cmdoption-with-framework-name5020153 +Ref: 17e15020153 +Node: Cross Compiling Options5020349 +Ref: using/configure cross-compiling-options5020448 +Ref: 17e25020448 +Ref: using/configure cmdoption-build5020795 +Ref: 17e35020795 +Ref: using/configure cmdoption-host5020908 +Ref: 17e45020908 +Ref: using/configure cmdoption-with-build-python5021012 +Ref: 17e55021012 +Ref: using/configure cmdoption-arg-CONFIG_SITE5021155 +Ref: 17e65021155 +Ref: using/configure cmdoption-arg-config-site5021155 +Ref: 17e75021155 +Node: Python Build System5021656 +Ref: using/configure python-build-system5021788 +Ref: 17e85021788 +Node: Main files of the build system5021950 +Ref: using/configure main-files-of-the-build-system5022061 +Ref: 17e95022061 +Node: Main build steps5022509 +Ref: using/configure main-build-steps5022650 +Ref: 17ea5022650 +Node: Main Makefile targets5023067 +Ref: using/configure main-makefile-targets5023190 +Ref: 17eb5023190 +Node: C extensions5024334 +Ref: using/configure c-extensions5024432 +Ref: 17ec5024432 +Node: Compiler and linker flags5026202 +Ref: using/configure compiler-and-linker-flags5026308 +Ref: 17ed5026308 +Node: Preprocessor flags5026541 +Ref: using/configure preprocessor-flags5026644 +Ref: 17ee5026644 +Ref: using/configure envvar-CONFIGURE_CPPFLAGS5026699 +Ref: 17ef5026699 +Ref: using/configure envvar-CPPFLAGS5026862 +Ref: 110c5026862 +Ref: using/configure envvar-BASECPPFLAGS5027265 +Ref: 17f05027265 +Ref: using/configure envvar-PY_CPPFLAGS5027331 +Ref: 17f15027331 +Node: Compiler flags5027582 +Ref: using/configure compiler-flags5027706 +Ref: 17f25027706 +Ref: using/configure envvar-CC5027753 +Ref: 11095027753 +Ref: using/configure envvar-MAINCC5027844 +Ref: 17f35027844 +Ref: using/configure envvar-CXX5028100 +Ref: 17f45028100 +Ref: using/configure envvar-CFLAGS5028258 +Ref: 110a5028258 +Ref: using/configure envvar-CFLAGS_NODIST5028316 +Ref: 17f55028316 +Ref: using/configure envvar-EXTRA_CFLAGS5029140 +Ref: 17f65029140 +Ref: using/configure envvar-CONFIGURE_CFLAGS5029210 +Ref: 17f75029210 +Ref: using/configure envvar-CONFIGURE_CFLAGS_NODIST5029369 +Ref: 17f85029369 +Ref: using/configure envvar-BASECFLAGS5029542 +Ref: 17f95029542 +Ref: using/configure envvar-OPT5029607 +Ref: 17c75029607 +Ref: using/configure envvar-CFLAGS_ALIASING5029664 +Ref: 17fa5029664 +Ref: using/configure envvar-CCSHARED5029817 +Ref: 17fb5029817 +Ref: using/configure envvar-CFLAGSFORSHARED5029966 +Ref: 17fc5029966 +Ref: using/configure envvar-PY_CFLAGS5030189 +Ref: 17fd5030189 +Ref: using/configure envvar-PY_CFLAGS_NODIST5030320 +Ref: 17fe5030320 +Ref: using/configure envvar-PY_STDMODULE_CFLAGS5030490 +Ref: 17ff5030490 +Ref: using/configure envvar-PY_CORE_CFLAGS5030719 +Ref: 18005030719 +Ref: using/configure envvar-PY_BUILTIN_MODULE_CFLAGS5030848 +Ref: 18015030848 +Ref: using/configure envvar-PURIFY5031122 +Ref: 18025031122 +Ref: Compiler flags-Footnote-15031292 +Node: Linker flags5031357 +Ref: using/configure linker-flags5031454 +Ref: 18035031454 +Ref: using/configure envvar-LINKCC5031497 +Ref: 18045031497 +Ref: using/configure envvar-CONFIGURE_LDFLAGS5031662 +Ref: 18055031662 +Ref: using/configure envvar-LDFLAGS_NODIST5032007 +Ref: 18065032007 +Ref: using/configure envvar-CONFIGURE_LDFLAGS_NODIST5032619 +Ref: 18075032619 +Ref: using/configure envvar-LDFLAGS5032794 +Ref: 110b5032794 +Ref: using/configure envvar-LIBS5033166 +Ref: 18085033166 +Ref: using/configure envvar-LDSHARED5033317 +Ref: 18095033317 +Ref: using/configure envvar-BLDSHARED5033441 +Ref: 180a5033441 +Ref: using/configure envvar-PY_LDFLAGS5033586 +Ref: 180b5033586 +Ref: using/configure envvar-PY_LDFLAGS_NODIST5033678 +Ref: 180c5033678 +Ref: using/configure envvar-PY_CORE_LDFLAGS5033817 +Ref: 180d5033817 +Ref: Linker flags-Footnote-15033989 +Node: Using Python on Windows5034054 +Ref: using/windows doc5034191 +Ref: 180e5034191 +Ref: using/windows using-on-windows5034191 +Ref: 7045034191 +Ref: using/windows using-python-on-windows5034191 +Ref: 180f5034191 +Ref: Using Python on Windows-Footnote-15036484 +Ref: Using Python on Windows-Footnote-25036534 +Node: The full installer5036576 +Ref: using/windows the-full-installer5036690 +Ref: 18135036690 +Ref: using/windows windows-full5036690 +Ref: 18105036690 +Node: Installation steps5036897 +Ref: using/windows installation-steps5037011 +Ref: 18145037011 +Node: Removing the MAX_PATH Limitation5039144 +Ref: using/windows max-path5039288 +Ref: 8ad5039288 +Ref: using/windows removing-the-max-path-limitation5039288 +Ref: 18165039288 +Node: Installing Without UI5040148 +Ref: using/windows install-quiet-option5040304 +Ref: 1bf5040304 +Ref: using/windows installing-without-ui5040304 +Ref: 18175040304 +Node: Installing Without Downloading5050151 +Ref: using/windows install-layout-option5050295 +Ref: 18155050295 +Ref: using/windows installing-without-downloading5050295 +Ref: 18185050295 +Node: Modifying an install5051290 +Ref: using/windows modifying-an-install5051404 +Ref: 18195051404 +Node: The Microsoft Store package5052293 +Ref: using/windows the-microsoft-store-package5052438 +Ref: 181a5052438 +Ref: using/windows windows-store5052438 +Ref: 16305052438 +Node: Known issues5054596 +Ref: using/windows known-issues5054672 +Ref: 181b5054672 +Node: Redirection of local data registry and temporary paths5054841 +Ref: using/windows redirection-of-local-data-registry-and-temporary-paths5054944 +Ref: 181c5054944 +Ref: Redirection of local data registry and temporary paths-Footnote-15057169 +Node: The nuget org packages5057265 +Ref: using/windows the-nuget-org-packages5057414 +Ref: 181d5057414 +Ref: using/windows windows-nuget5057414 +Ref: 18115057414 +Ref: The nuget org packages-Footnote-15059698 +Ref: The nuget org packages-Footnote-25059729 +Ref: The nuget org packages-Footnote-35059775 +Node: The embeddable package5059824 +Ref: using/windows the-embeddable-package5059965 +Ref: 181e5059965 +Ref: using/windows windows-embeddable5059965 +Ref: 18125059965 +Ref: The embeddable package-Footnote-15061748 +Node: Python Application5061867 +Ref: using/windows python-application5061969 +Ref: 181f5061969 +Node: Embedding Python5063466 +Ref: using/windows embedding-python5063568 +Ref: 18205063568 +Node: Alternative bundles5064356 +Ref: using/windows alternative-bundles5064493 +Ref: 18215064493 +Ref: Alternative bundles-Footnote-15065440 +Ref: Alternative bundles-Footnote-25065490 +Ref: Alternative bundles-Footnote-35065533 +Ref: Alternative bundles-Footnote-45065572 +Ref: Alternative bundles-Footnote-55065739 +Node: Configuring Python5065776 +Ref: using/windows configuring-python5065901 +Ref: 18225065901 +Node: Excursus Setting environment variables5066469 +Ref: using/windows excursus-setting-environment-variables5066600 +Ref: 18235066600 +Ref: using/windows setting-envvars5066600 +Ref: 16315066600 +Node: Finding the Python executable5068788 +Ref: using/windows finding-the-python-executable5068919 +Ref: 18245068919 +Ref: using/windows windows-path-mod5068919 +Ref: d005068919 +Node: UTF-8 mode5070212 +Ref: using/windows utf-8-mode5070345 +Ref: 18255070345 +Ref: using/windows win-utf8-mode5070345 +Ref: 18265070345 +Ref: UTF-8 mode-Footnote-15071867 +Ref: UTF-8 mode-Footnote-25071909 +Node: Python Launcher for Windows5071951 +Ref: using/windows launcher5072081 +Ref: 1805072081 +Ref: using/windows python-launcher-for-windows5072081 +Ref: 18275072081 +Ref: Python Launcher for Windows-Footnote-15072933 +Node: Getting started5072975 +Ref: using/windows getting-started5073076 +Ref: 18285073076 +Node: From the command-line5073231 +Ref: using/windows from-the-command-line5073333 +Ref: 18295073333 +Node: Virtual environments5074635 +Ref: using/windows virtual-environments5074759 +Ref: 182a5074759 +Node: From a script5075255 +Ref: using/windows from-a-script5075380 +Ref: 182b5075380 +Node: From file associations5076427 +Ref: using/windows from-file-associations5076523 +Ref: 182c5076523 +Node: Shebang Lines5077100 +Ref: using/windows shebang-lines5077236 +Ref: 182d5077236 +Node: Arguments in shebang lines5079780 +Ref: using/windows arguments-in-shebang-lines5079914 +Ref: 182e5079914 +Node: Customization5080204 +Ref: using/windows customization5080336 +Ref: 182f5080336 +Node: Customization via INI files5080463 +Ref: using/windows customization-via-ini-files5080584 +Ref: 18305080584 +Node: Customizing default Python versions5081342 +Ref: using/windows customizing-default-python-versions5081463 +Ref: 18315081463 +Node: Diagnostics5085301 +Ref: using/windows diagnostics5085414 +Ref: 18325085414 +Node: Dry Run5085902 +Ref: using/windows dry-run5086019 +Ref: 18335086019 +Node: Install on demand5086451 +Ref: using/windows install-on-demand5086569 +Ref: 18345086569 +Node: Return codes5087150 +Ref: using/windows return-codes5087252 +Ref: 18355087252 +Node: Finding modules5089007 +Ref: using/windows finding-modules5089145 +Ref: 18365089145 +Ref: using/windows windows-finding-modules5089145 +Ref: 88c5089145 +Node: Additional modules5094284 +Ref: using/windows additional-modules5094422 +Ref: 18375094422 +Node: PyWin325094825 +Ref: using/windows pywin325094905 +Ref: 18395094905 +Ref: PyWin32-Footnote-15095489 +Ref: PyWin32-Footnote-25095530 +Ref: PyWin32-Footnote-35095628 +Ref: PyWin32-Footnote-45095702 +Ref: PyWin32-Footnote-55095796 +Ref: PyWin32-Footnote-65095854 +Node: cx_Freeze5095904 +Ref: using/windows cx-freeze5095984 +Ref: 183a5095984 +Ref: cx_Freeze-Footnote-15096341 +Node: Compiling Python on Windows5096393 +Ref: using/windows compiling-python-on-windows5096531 +Ref: 183c5096531 +Ref: Compiling Python on Windows-Footnote-15097186 +Ref: Compiling Python on Windows-Footnote-25097235 +Node: Other Platforms5097298 +Ref: using/windows other-platforms5097409 +Ref: 183e5097409 +Ref: Other Platforms-Footnote-15097972 +Ref: Other Platforms-Footnote-25098014 +Ref: Other Platforms-Footnote-35098056 +Ref: Other Platforms-Footnote-45098111 +Ref: Other Platforms-Footnote-55098139 +Ref: Other Platforms-Footnote-65098196 +Node: Using Python on a Mac5098246 +Ref: using/mac doc5098383 +Ref: 183f5098383 +Ref: using/mac using-on-mac5098383 +Ref: 18405098383 +Ref: using/mac using-python-on-a-mac5098383 +Ref: 18415098383 +Node: Getting and Installing MacPython5098892 +Ref: using/mac getting-and-installing-macpython5098998 +Ref: 18425098998 +Ref: using/mac getting-osx5098998 +Ref: 18435098998 +Ref: Getting and Installing MacPython-Footnote-15101026 +Node: How to run a Python script5101129 +Ref: using/mac how-to-run-a-python-script5101259 +Ref: 18445101259 +Node: Running scripts with a GUI5102724 +Ref: using/mac osx-gui-scripts5102876 +Ref: 18465102876 +Ref: using/mac running-scripts-with-a-gui5102876 +Ref: 18475102876 +Node: Configuration5103289 +Ref: using/mac configuration5103406 +Ref: 18485103406 +Node: The IDE5103950 +Ref: using/mac ide5104102 +Ref: 18455104102 +Ref: using/mac the-ide5104102 +Ref: 184a5104102 +Node: Installing Additional Python Packages5104316 +Ref: using/mac installing-additional-python-packages5104462 +Ref: 184b5104462 +Ref: using/mac mac-package-manager5104462 +Ref: 18495104462 +Node: GUI Programming on the Mac5104862 +Ref: using/mac gui-programming-on-the-mac5105044 +Ref: 184c5105044 +Node: Distributing Python Applications on the Mac5106053 +Ref: using/mac distributing-python-applications-on-the-mac5106213 +Ref: 184d5106213 +Node: Other Resources5106511 +Ref: using/mac other-resources5106636 +Ref: 184e5106636 +Node: Editors and IDEs5106948 +Ref: using/editors doc5107053 +Ref: 184f5107053 +Ref: using/editors editors5107053 +Ref: 18505107053 +Ref: using/editors editors-and-ides5107053 +Ref: 18515107053 +Ref: Editors and IDEs-Footnote-15107392 +Ref: Editors and IDEs-Footnote-25107434 +Ref: Editors and IDEs-Footnote-35107485 +Node: The Python Language Reference5107556 +Ref: reference/index doc5107692 +Ref: 18525107692 +Ref: reference/index reference-index5107692 +Ref: 16245107692 +Ref: reference/index the-python-language-reference5107692 +Ref: 18535107692 +Node: Introduction<5>5108684 +Ref: reference/introduction doc5108790 +Ref: 18545108790 +Ref: reference/introduction id15108790 +Ref: 18555108790 +Ref: reference/introduction introduction5108790 +Ref: 18565108790 +Node: Alternate Implementations5110586 +Ref: reference/introduction alternate-implementations5110680 +Ref: 18575110680 +Ref: reference/introduction implementations5110680 +Ref: 17655110680 +Ref: Alternate Implementations-Footnote-15112862 +Ref: Alternate Implementations-Footnote-25112894 +Ref: Alternate Implementations-Footnote-35112931 +Ref: Alternate Implementations-Footnote-45112963 +Node: Notation5112989 +Ref: reference/introduction id25113083 +Ref: 18585113083 +Ref: reference/introduction notation5113083 +Ref: 18595113083 +Ref: reference/introduction grammar-token-notation-name5113246 +Ref: 185a5113246 +Ref: reference/introduction grammar-token-name5113246 +Ref: 185b5113246 +Ref: reference/introduction grammar-token-notation-lc_letter5113294 +Ref: 185c5113294 +Ref: reference/introduction grammar-token-lc-letter5113294 +Ref: 185d5113294 +Node: Lexical analysis5115328 +Ref: reference/lexical_analysis doc5115453 +Ref: 185e5115453 +Ref: reference/lexical_analysis lexical5115453 +Ref: 185f5115453 +Ref: reference/lexical_analysis lexical-analysis5115453 +Ref: 18605115453 +Ref: Lexical analysis-Footnote-15116098 +Node: Line structure5116140 +Ref: reference/lexical_analysis id15116228 +Ref: 18615116228 +Ref: reference/lexical_analysis line-structure5116228 +Ref: 18625116228 +Node: Logical lines5116534 +Ref: reference/lexical_analysis id25116621 +Ref: 18635116621 +Ref: reference/lexical_analysis logical-lines5116621 +Ref: 18645116621 +Node: Physical lines5116999 +Ref: reference/lexical_analysis id35117103 +Ref: 18655117103 +Ref: reference/lexical_analysis physical-lines5117103 +Ref: 18665117103 +Node: Comments5117874 +Ref: reference/lexical_analysis comments5117986 +Ref: 18675117986 +Ref: reference/lexical_analysis id45117986 +Ref: 18685117986 +Node: Encoding declarations5118289 +Ref: reference/lexical_analysis encoding-declarations5118408 +Ref: 18695118408 +Ref: reference/lexical_analysis encodings5118408 +Ref: 186a5118408 +Node: Explicit line joining5119575 +Ref: reference/lexical_analysis explicit-joining5119707 +Ref: 186b5119707 +Ref: reference/lexical_analysis explicit-line-joining5119707 +Ref: 186c5119707 +Node: Implicit line joining5120641 +Ref: reference/lexical_analysis implicit-joining5120763 +Ref: 186d5120763 +Ref: reference/lexical_analysis implicit-line-joining5120763 +Ref: 186e5120763 +Node: Blank lines5121599 +Ref: reference/lexical_analysis blank-lines5121711 +Ref: 186f5121711 +Ref: reference/lexical_analysis id55121711 +Ref: 18705121711 +Node: Indentation5122186 +Ref: reference/lexical_analysis id65122302 +Ref: 18715122302 +Ref: reference/lexical_analysis indentation5122302 +Ref: 18725122302 +Node: Whitespace between tokens5125689 +Ref: reference/lexical_analysis whitespace5125785 +Ref: 18735125785 +Ref: reference/lexical_analysis whitespace-between-tokens5125785 +Ref: 18745125785 +Node: Other tokens5126187 +Ref: reference/lexical_analysis id75126308 +Ref: 18755126308 +Ref: reference/lexical_analysis other-tokens5126308 +Ref: 18765126308 +Node: Identifiers and keywords5126740 +Ref: reference/lexical_analysis identifiers5126855 +Ref: 18775126855 +Ref: reference/lexical_analysis identifiers-and-keywords5126855 +Ref: 18785126855 +Ref: reference/lexical_analysis grammar-token-python-grammar-identifier5127750 +Ref: 18795127750 +Ref: reference/lexical_analysis grammar-token-identifier5127750 +Ref: 187a5127750 +Ref: reference/lexical_analysis grammar-token-python-grammar-id_start5127796 +Ref: 187b5127796 +Ref: reference/lexical_analysis grammar-token-id-start5127796 +Ref: 187c5127796 +Ref: reference/lexical_analysis grammar-token-python-grammar-id_continue5127945 +Ref: 187d5127945 +Ref: reference/lexical_analysis grammar-token-id-continue5127945 +Ref: 187e5127945 +Ref: reference/lexical_analysis grammar-token-python-grammar-xid_start5128093 +Ref: 187f5128093 +Ref: reference/lexical_analysis grammar-token-xid-start5128093 +Ref: 18805128093 +Ref: reference/lexical_analysis grammar-token-python-grammar-xid_continue5128200 +Ref: 18815128200 +Ref: reference/lexical_analysis grammar-token-xid-continue5128200 +Ref: 18825128200 +Ref: Identifiers and keywords-Footnote-15129220 +Ref: Identifiers and keywords-Footnote-25129262 +Ref: Identifiers and keywords-Footnote-35129304 +Node: Keywords5129367 +Ref: reference/lexical_analysis id85129458 +Ref: 18835129458 +Ref: reference/lexical_analysis keywords5129458 +Ref: 18845129458 +Node: Soft Keywords5130053 +Ref: reference/lexical_analysis id95130184 +Ref: 18855130184 +Ref: reference/lexical_analysis soft-keywords5130184 +Ref: 3ff5130184 +Node: Reserved classes of identifiers5130748 +Ref: reference/lexical_analysis id-classes5130862 +Ref: 18865130862 +Ref: reference/lexical_analysis reserved-classes-of-identifiers5130862 +Ref: 18875130862 +Node: Literals5132785 +Ref: reference/lexical_analysis id105132897 +Ref: 18895132897 +Ref: reference/lexical_analysis literals5132897 +Ref: 188a5132897 +Node: String and Bytes literals5133192 +Ref: reference/lexical_analysis string-and-bytes-literals5133299 +Ref: 188b5133299 +Ref: reference/lexical_analysis strings5133299 +Ref: 188c5133299 +Ref: reference/lexical_analysis grammar-token-python-grammar-stringliteral5133437 +Ref: 188d5133437 +Ref: reference/lexical_analysis grammar-token-stringliteral5133437 +Ref: 188e5133437 +Ref: reference/lexical_analysis grammar-token-python-grammar-stringprefix5133503 +Ref: 188f5133503 +Ref: reference/lexical_analysis grammar-token-stringprefix5133503 +Ref: 18905133503 +Ref: reference/lexical_analysis grammar-token-python-grammar-shortstring5133643 +Ref: 18915133643 +Ref: reference/lexical_analysis grammar-token-shortstring5133643 +Ref: 18925133643 +Ref: reference/lexical_analysis grammar-token-python-grammar-longstring5133720 +Ref: 18935133720 +Ref: reference/lexical_analysis grammar-token-longstring5133720 +Ref: 18945133720 +Ref: reference/lexical_analysis grammar-token-python-grammar-shortstringitem5133803 +Ref: 18955133803 +Ref: reference/lexical_analysis grammar-token-shortstringitem5133803 +Ref: 18965133803 +Ref: reference/lexical_analysis grammar-token-python-grammar-longstringitem5133862 +Ref: 18975133862 +Ref: reference/lexical_analysis grammar-token-longstringitem5133862 +Ref: 18985133862 +Ref: reference/lexical_analysis grammar-token-python-grammar-shortstringchar5133920 +Ref: 18995133920 +Ref: reference/lexical_analysis grammar-token-shortstringchar5133920 +Ref: 189a5133920 +Ref: reference/lexical_analysis grammar-token-python-grammar-longstringchar5134003 +Ref: 189b5134003 +Ref: reference/lexical_analysis grammar-token-longstringchar5134003 +Ref: 189c5134003 +Ref: reference/lexical_analysis grammar-token-python-grammar-stringescapeseq5134062 +Ref: 189d5134062 +Ref: reference/lexical_analysis grammar-token-stringescapeseq5134062 +Ref: 189e5134062 +Ref: reference/lexical_analysis grammar-token-python-grammar-bytesliteral5134115 +Ref: 189f5134115 +Ref: reference/lexical_analysis grammar-token-bytesliteral5134115 +Ref: 18a05134115 +Ref: reference/lexical_analysis grammar-token-python-grammar-bytesprefix5134175 +Ref: 18a15134175 +Ref: reference/lexical_analysis grammar-token-bytesprefix5134175 +Ref: 18a25134175 +Ref: reference/lexical_analysis grammar-token-python-grammar-shortbytes5134265 +Ref: 18a35134265 +Ref: reference/lexical_analysis grammar-token-shortbytes5134265 +Ref: 18a45134265 +Ref: reference/lexical_analysis grammar-token-python-grammar-longbytes5134339 +Ref: 18a55134339 +Ref: reference/lexical_analysis grammar-token-longbytes5134339 +Ref: 18a65134339 +Ref: reference/lexical_analysis grammar-token-python-grammar-shortbytesitem5134419 +Ref: 18a75134419 +Ref: reference/lexical_analysis grammar-token-shortbytesitem5134419 +Ref: 18a85134419 +Ref: reference/lexical_analysis grammar-token-python-grammar-longbytesitem5134475 +Ref: 18a95134475 +Ref: reference/lexical_analysis grammar-token-longbytesitem5134475 +Ref: 18aa5134475 +Ref: reference/lexical_analysis grammar-token-python-grammar-shortbyteschar5134530 +Ref: 18ab5134530 +Ref: reference/lexical_analysis grammar-token-shortbyteschar5134530 +Ref: 18ac5134530 +Ref: reference/lexical_analysis grammar-token-python-grammar-longbyteschar5134611 +Ref: 18ad5134611 +Ref: reference/lexical_analysis grammar-token-longbyteschar5134611 +Ref: 18ae5134611 +Ref: reference/lexical_analysis grammar-token-python-grammar-bytesescapeseq5134668 +Ref: 18af5134668 +Ref: reference/lexical_analysis grammar-token-bytesescapeseq5134668 +Ref: 18b05134668 +Ref: String and Bytes literals-Footnote-15142758 +Ref: String and Bytes literals-Footnote-25142800 +Node: String literal concatenation5142872 +Ref: reference/lexical_analysis string-concatenation5143013 +Ref: 18b15143013 +Ref: reference/lexical_analysis string-literal-concatenation5143013 +Ref: 18b25143013 +Node: Formatted string literals5144056 +Ref: reference/lexical_analysis f-strings5144188 +Ref: 5f95144188 +Ref: reference/lexical_analysis formatted-string-literals5144188 +Ref: 18b35144188 +Ref: reference/lexical_analysis grammar-token-python-grammar-f_string5144799 +Ref: 18b45144799 +Ref: reference/lexical_analysis grammar-token-f-string5144799 +Ref: 18b55144799 +Ref: reference/lexical_analysis grammar-token-python-grammar-replacement_field5144876 +Ref: 18b65144876 +Ref: reference/lexical_analysis grammar-token-replacement-field5144876 +Ref: 18b75144876 +Ref: reference/lexical_analysis grammar-token-python-grammar-f_expression5144965 +Ref: 18b85144965 +Ref: reference/lexical_analysis grammar-token-f-expression5144965 +Ref: 18b95144965 +Ref: reference/lexical_analysis grammar-token-python-grammar-conversion5145160 +Ref: 18ba5145160 +Ref: reference/lexical_analysis grammar-token-conversion5145160 +Ref: 18bb5145160 +Ref: reference/lexical_analysis grammar-token-python-grammar-format_spec5145203 +Ref: 18bc5145203 +Ref: reference/lexical_analysis grammar-token-format-spec5145203 +Ref: 18bd5145203 +Ref: reference/lexical_analysis grammar-token-python-grammar-literal_char5145273 +Ref: 18be5145273 +Ref: reference/lexical_analysis grammar-token-literal-char5145273 +Ref: 18bf5145273 +Ref: Formatted string literals-Footnote-15150406 +Node: Numeric literals5150448 +Ref: reference/lexical_analysis numbers5150568 +Ref: 18c05150568 +Ref: reference/lexical_analysis numeric-literals5150568 +Ref: 18c15150568 +Node: Integer literals5151002 +Ref: reference/lexical_analysis integer-literals5151120 +Ref: 18c25151120 +Ref: reference/lexical_analysis integers5151120 +Ref: 18c35151120 +Ref: reference/lexical_analysis grammar-token-python-grammar-integer5151241 +Ref: 18c45151241 +Ref: reference/lexical_analysis grammar-token-integer5151241 +Ref: 18c55151241 +Ref: reference/lexical_analysis grammar-token-python-grammar-decinteger5151313 +Ref: 18c65151313 +Ref: reference/lexical_analysis grammar-token-decinteger5151313 +Ref: 18c75151313 +Ref: reference/lexical_analysis grammar-token-python-grammar-bininteger5151383 +Ref: 18c85151383 +Ref: reference/lexical_analysis grammar-token-bininteger5151383 +Ref: 18c95151383 +Ref: reference/lexical_analysis grammar-token-python-grammar-octinteger5151439 +Ref: 18ca5151439 +Ref: reference/lexical_analysis grammar-token-octinteger5151439 +Ref: 18cb5151439 +Ref: reference/lexical_analysis grammar-token-python-grammar-hexinteger5151495 +Ref: 18cc5151495 +Ref: reference/lexical_analysis grammar-token-hexinteger5151495 +Ref: 18cd5151495 +Ref: reference/lexical_analysis grammar-token-python-grammar-nonzerodigit5151551 +Ref: 18ce5151551 +Ref: reference/lexical_analysis grammar-token-nonzerodigit5151551 +Ref: 18cf5151551 +Ref: reference/lexical_analysis grammar-token-python-grammar-digit5151583 +Ref: 18d05151583 +Ref: reference/lexical_analysis grammar-token-digit5151583 +Ref: 18d15151583 +Ref: reference/lexical_analysis grammar-token-python-grammar-bindigit5151615 +Ref: 18d25151615 +Ref: reference/lexical_analysis grammar-token-bindigit5151615 +Ref: 18d35151615 +Ref: reference/lexical_analysis grammar-token-python-grammar-octdigit5151647 +Ref: 18d45151647 +Ref: reference/lexical_analysis grammar-token-octdigit5151647 +Ref: 18d55151647 +Ref: reference/lexical_analysis grammar-token-python-grammar-hexdigit5151679 +Ref: 18d65151679 +Ref: reference/lexical_analysis grammar-token-hexdigit5151679 +Ref: 18d75151679 +Node: Floating point literals5152533 +Ref: reference/lexical_analysis floating5152653 +Ref: 18d85152653 +Ref: reference/lexical_analysis floating-point-literals5152653 +Ref: 18d95152653 +Ref: reference/lexical_analysis grammar-token-python-grammar-floatnumber5152795 +Ref: 18da5152795 +Ref: reference/lexical_analysis grammar-token-floatnumber5152795 +Ref: 18db5152795 +Ref: reference/lexical_analysis grammar-token-python-grammar-pointfloat5152845 +Ref: 18dc5152845 +Ref: reference/lexical_analysis grammar-token-pointfloat5152845 +Ref: 18dd5152845 +Ref: reference/lexical_analysis grammar-token-python-grammar-exponentfloat5152905 +Ref: 18de5152905 +Ref: reference/lexical_analysis grammar-token-exponentfloat5152905 +Ref: 18df5152905 +Ref: reference/lexical_analysis grammar-token-python-grammar-digitpart5152962 +Ref: 18e05152962 +Ref: reference/lexical_analysis grammar-token-digitpart5152962 +Ref: 18e15152962 +Ref: reference/lexical_analysis grammar-token-python-grammar-fraction5153006 +Ref: 18e25153006 +Ref: reference/lexical_analysis grammar-token-fraction5153006 +Ref: 18e35153006 +Ref: reference/lexical_analysis grammar-token-python-grammar-exponent5153043 +Ref: 18e45153043 +Ref: reference/lexical_analysis grammar-token-exponent5153043 +Ref: 18e55153043 +Node: Imaginary literals5153609 +Ref: reference/lexical_analysis imaginary5153704 +Ref: 18e65153704 +Ref: reference/lexical_analysis imaginary-literals5153704 +Ref: 18e75153704 +Ref: reference/lexical_analysis grammar-token-python-grammar-imagnumber5153831 +Ref: 18e85153831 +Ref: reference/lexical_analysis grammar-token-imagnumber5153831 +Ref: 18e95153831 +Node: Operators5154294 +Ref: reference/lexical_analysis id125154392 +Ref: 18ea5154392 +Ref: reference/lexical_analysis operators5154392 +Ref: 18eb5154392 +Node: Delimiters5154629 +Ref: reference/lexical_analysis delimiters5154710 +Ref: 18ec5154710 +Ref: reference/lexical_analysis id135154710 +Ref: 18ed5154710 +Node: Data model5155626 +Ref: reference/datamodel doc5155751 +Ref: 18ee5155751 +Ref: reference/datamodel data-model5155751 +Ref: 18ef5155751 +Ref: reference/datamodel datamodel5155751 +Ref: 13895155751 +Node: Objects values and types5155919 +Ref: reference/datamodel objects5156026 +Ref: 18f05156026 +Ref: reference/datamodel objects-values-and-types5156026 +Ref: 18f15156026 +Ref: Objects values and types-Footnote-15160837 +Node: The standard type hierarchy5161064 +Ref: reference/datamodel the-standard-type-hierarchy5161200 +Ref: 18f25161200 +Ref: reference/datamodel types5161200 +Ref: 18f35161200 +Ref: reference/datamodel codeobject co_positions5198648 +Ref: 1715198648 +Ref: reference/datamodel frame-objects5200512 +Ref: 19065200512 +Ref: reference/datamodel frame clear5202408 +Ref: b9c5202408 +Ref: reference/datamodel traceback-objects5202962 +Ref: 7495202962 +Ref: reference/datamodel slice indices5205795 +Ref: cd35205795 +Node: Special method names5207501 +Ref: reference/datamodel special-method-names5207623 +Ref: 19075207623 +Ref: reference/datamodel specialnames5207623 +Ref: 8de5207623 +Ref: Special method names-Footnote-15209519 +Node: Basic customization5209800 +Ref: reference/datamodel basic-customization5209913 +Ref: 190b5209913 +Ref: reference/datamodel customization5209913 +Ref: 190c5209913 +Ref: reference/datamodel object __new__5209970 +Ref: 18ff5209970 +Ref: reference/datamodel object __init__5211535 +Ref: 105f5211535 +Ref: reference/datamodel object __del__5212402 +Ref: 190d5212402 +Ref: reference/datamodel object __repr__5215544 +Ref: 1f45215544 +Ref: reference/datamodel object __str__5216390 +Ref: 1f55216390 +Ref: reference/datamodel object __bytes__5217042 +Ref: 1b95217042 +Ref: reference/datamodel object __format__5217226 +Ref: 1f65217226 +Ref: reference/datamodel richcmpfuncs5218332 +Ref: 190e5218332 +Ref: reference/datamodel object __lt__5218332 +Ref: 190f5218332 +Ref: reference/datamodel object __le__5218372 +Ref: 19105218372 +Ref: reference/datamodel object __eq__5218412 +Ref: 74f5218412 +Ref: reference/datamodel object __ne__5218452 +Ref: 19115218452 +Ref: reference/datamodel object __gt__5218492 +Ref: 19125218492 +Ref: reference/datamodel object __ge__5218532 +Ref: 19135218532 +Ref: reference/datamodel object __hash__5221057 +Ref: 7505221057 +Ref: reference/datamodel object __bool__5225281 +Ref: 19145225281 +Node: Customizing attribute access5225734 +Ref: reference/datamodel attribute-access5225882 +Ref: 19165225882 +Ref: reference/datamodel customizing-attribute-access5225882 +Ref: 19175225882 +Ref: reference/datamodel object __getattr__5226114 +Ref: 8385226114 +Ref: reference/datamodel object __getattribute__5227361 +Ref: 8395227361 +Ref: reference/datamodel object __setattr__5228455 +Ref: 19035228455 +Ref: reference/datamodel object __delattr__5229130 +Ref: 19045229130 +Ref: reference/datamodel object __dir__5229516 +Ref: 191a5229516 +Node: Customizing module attribute access5229857 +Ref: reference/datamodel customizing-module-attribute-access5229990 +Ref: 191b5229990 +Ref: Customizing module attribute access-Footnote-15232116 +Node: Implementing Descriptors5232158 +Ref: reference/datamodel descriptors5232320 +Ref: 8bd5232320 +Ref: reference/datamodel implementing-descriptors5232320 +Ref: 191c5232320 +Ref: reference/datamodel object __get__5232800 +Ref: 19185232800 +Ref: reference/datamodel object __set__5233731 +Ref: 191d5233731 +Ref: reference/datamodel object __delete__5234089 +Ref: 191e5234089 +Ref: Implementing Descriptors-Footnote-15234721 +Node: Invoking Descriptors5234763 +Ref: reference/datamodel descriptor-invocation5234902 +Ref: 191f5234902 +Ref: reference/datamodel invoking-descriptors5234902 +Ref: 19205234902 +Node: __slots__<2>5238056 +Ref: reference/datamodel id35238162 +Ref: 19215238162 +Ref: reference/datamodel slots5238162 +Ref: 19225238162 +Ref: reference/datamodel object __slots__5238539 +Ref: 112a5238539 +Node: Notes on using __slots__5238902 +Ref: reference/datamodel notes-on-using-slots5238975 +Ref: 19235238975 +Node: Customizing class creation5242024 +Ref: reference/datamodel class-customization5242193 +Ref: 8b95242193 +Ref: reference/datamodel customizing-class-creation5242193 +Ref: 19255242193 +Ref: reference/datamodel object __init_subclass__5242678 +Ref: 20d5242678 +Ref: reference/datamodel object __set_name__5244146 +Ref: 8bc5244146 +Node: Metaclasses5245109 +Ref: reference/datamodel id45245213 +Ref: 19265245213 +Ref: reference/datamodel metaclasses5245213 +Ref: 19275245213 +Node: Resolving MRO entries5246268 +Ref: reference/datamodel resolving-mro-entries5246418 +Ref: 19285246418 +Ref: Resolving MRO entries-Footnote-15246945 +Node: Determining the appropriate metaclass5246987 +Ref: reference/datamodel determining-the-appropriate-metaclass5247155 +Ref: 19295247155 +Node: Preparing the class namespace5248086 +Ref: reference/datamodel prepare5248257 +Ref: 8cf5248257 +Ref: reference/datamodel preparing-the-class-namespace5248257 +Ref: 192a5248257 +Ref: Preparing the class namespace-Footnote-15249160 +Node: Executing the class body5249202 +Ref: reference/datamodel executing-the-class-body5249361 +Ref: 192b5249361 +Node: Creating the class object5250096 +Ref: reference/datamodel class-object-creation5250246 +Ref: 8b85250246 +Ref: reference/datamodel creating-the-class-object5250246 +Ref: 192c5250246 +Ref: Creating the class object-Footnote-15252690 +Node: Uses for metaclasses5252732 +Ref: reference/datamodel uses-for-metaclasses5252849 +Ref: 192d5252849 +Node: Customizing instance and subclass checks5253160 +Ref: reference/datamodel customizing-instance-and-subclass-checks5253324 +Ref: 192e5253324 +Ref: reference/datamodel class __instancecheck__5253814 +Ref: 192f5253814 +Ref: reference/datamodel class __subclasscheck__5254043 +Ref: 19305254043 +Ref: Customizing instance and subclass checks-Footnote-15254996 +Node: Emulating generic types5255038 +Ref: reference/datamodel emulating-generic-types5255202 +Ref: 19315255202 +Ref: reference/datamodel object __class_getitem__5256120 +Ref: 3055256120 +Ref: Emulating generic types-Footnote-15256618 +Node: The purpose of __class_getitem__5256660 +Ref: reference/datamodel the-purpose-of-class-getitem5256797 +Ref: 19355256797 +Node: __class_getitem__ versus __getitem__5257688 +Ref: reference/datamodel class-getitem-versus-getitem5257825 +Ref: 19375257825 +Ref: reference/datamodel classgetitem-versus-getitem5257825 +Ref: 19385257825 +Ref: __class_getitem__ versus __getitem__-Footnote-15261156 +Node: Emulating callable objects5261198 +Ref: reference/datamodel callable-types5261347 +Ref: 193c5261347 +Ref: reference/datamodel emulating-callable-objects5261347 +Ref: 193d5261347 +Ref: reference/datamodel object __call__5261420 +Ref: 19005261420 +Node: Emulating container types5261651 +Ref: reference/datamodel emulating-container-types5261800 +Ref: 193e5261800 +Ref: reference/datamodel sequence-types5261800 +Ref: 193f5261800 +Ref: reference/datamodel object __len__5264119 +Ref: 19155264119 +Ref: reference/datamodel object __length_hint__5264860 +Ref: b9d5264860 +Ref: reference/datamodel object __getitem__5265647 +Ref: 2fd5265647 +Ref: reference/datamodel object __setitem__5266853 +Ref: 19405266853 +Ref: reference/datamodel object __delitem__5267315 +Ref: 19415267315 +Ref: reference/datamodel object __missing__5267741 +Ref: 19485267741 +Ref: reference/datamodel object __iter__5267932 +Ref: 19085267932 +Ref: reference/datamodel object __reversed__5268240 +Ref: 19095268240 +Ref: reference/datamodel object __contains__5269227 +Ref: 190a5269227 +Node: Emulating numeric types5269793 +Ref: reference/datamodel emulating-numeric-types5269947 +Ref: 194a5269947 +Ref: reference/datamodel numeric-types5269947 +Ref: 194b5269947 +Ref: reference/datamodel object __add__5270262 +Ref: 19425270262 +Ref: reference/datamodel object __sub__5270303 +Ref: 194c5270303 +Ref: reference/datamodel object __mul__5270344 +Ref: 19455270344 +Ref: reference/datamodel object __matmul__5270385 +Ref: 194d5270385 +Ref: reference/datamodel object __truediv__5270429 +Ref: 194e5270429 +Ref: reference/datamodel object __floordiv__5270474 +Ref: 194f5270474 +Ref: reference/datamodel object __mod__5270520 +Ref: 19505270520 +Ref: reference/datamodel object __divmod__5270561 +Ref: 19515270561 +Ref: reference/datamodel object __pow__5270605 +Ref: 3c25270605 +Ref: reference/datamodel object __lshift__5270656 +Ref: 19525270656 +Ref: reference/datamodel object __rshift__5270700 +Ref: 19535270700 +Ref: reference/datamodel object __and__5270744 +Ref: 19545270744 +Ref: reference/datamodel object __xor__5270785 +Ref: 19555270785 +Ref: reference/datamodel object __or__5270826 +Ref: 19565270826 +Ref: reference/datamodel object __radd__5271820 +Ref: 19435271820 +Ref: reference/datamodel object __rsub__5271862 +Ref: 19575271862 +Ref: reference/datamodel object __rmul__5271904 +Ref: 19465271904 +Ref: reference/datamodel object __rmatmul__5271946 +Ref: 19585271946 +Ref: reference/datamodel object __rtruediv__5271991 +Ref: 19595271991 +Ref: reference/datamodel object __rfloordiv__5272037 +Ref: 195a5272037 +Ref: reference/datamodel object __rmod__5272084 +Ref: 195b5272084 +Ref: reference/datamodel object __rdivmod__5272126 +Ref: 195c5272126 +Ref: reference/datamodel object __rpow__5272171 +Ref: 3c35272171 +Ref: reference/datamodel object __rlshift__5272223 +Ref: 195d5272223 +Ref: reference/datamodel object __rrshift__5272268 +Ref: 195e5272268 +Ref: reference/datamodel object __rand__5272313 +Ref: 195f5272313 +Ref: reference/datamodel object __rxor__5272355 +Ref: 19605272355 +Ref: reference/datamodel object __ror__5272397 +Ref: 19615272397 +Ref: reference/datamodel object __iadd__5273668 +Ref: 19445273668 +Ref: reference/datamodel object __isub__5273710 +Ref: 19625273710 +Ref: reference/datamodel object __imul__5273752 +Ref: 19475273752 +Ref: reference/datamodel object __imatmul__5273794 +Ref: 19635273794 +Ref: reference/datamodel object __itruediv__5273839 +Ref: 19645273839 +Ref: reference/datamodel object __ifloordiv__5273885 +Ref: 19655273885 +Ref: reference/datamodel object __imod__5273932 +Ref: 19665273932 +Ref: reference/datamodel object __ipow__5273974 +Ref: 3c05273974 +Ref: reference/datamodel object __ilshift__5274026 +Ref: 19675274026 +Ref: reference/datamodel object __irshift__5274071 +Ref: 19685274071 +Ref: reference/datamodel object __iand__5274116 +Ref: 19695274116 +Ref: reference/datamodel object __ixor__5274158 +Ref: 196a5274158 +Ref: reference/datamodel object __ior__5274200 +Ref: 196b5274200 +Ref: reference/datamodel object __neg__5275255 +Ref: 196d5275255 +Ref: reference/datamodel object __pos__5275289 +Ref: 196e5275289 +Ref: reference/datamodel object __abs__5275323 +Ref: 196f5275323 +Ref: reference/datamodel object __invert__5275357 +Ref: 19705275357 +Ref: reference/datamodel object __complex__5275510 +Ref: 1b75275510 +Ref: reference/datamodel object __int__5275548 +Ref: 3be5275548 +Ref: reference/datamodel object __float__5275582 +Ref: 60c5275582 +Ref: reference/datamodel object __index__5275790 +Ref: 3bf5275790 +Ref: reference/datamodel object __round__5276464 +Ref: 19715276464 +Ref: reference/datamodel object __trunc__5276511 +Ref: 19725276511 +Ref: reference/datamodel object __floor__5276547 +Ref: 19735276547 +Ref: reference/datamodel object __ceil__5276583 +Ref: 19745276583 +Ref: Emulating numeric types-Footnote-15277302 +Ref: Emulating numeric types-Footnote-25277617 +Node: With Statement Context Managers5277842 +Ref: reference/datamodel context-managers5278029 +Ref: 19755278029 +Ref: reference/datamodel with-statement-context-managers5278029 +Ref: 19765278029 +Ref: reference/datamodel object __enter__5278792 +Ref: 18e5278792 +Ref: reference/datamodel object __exit__5279042 +Ref: 19785279042 +Ref: With Statement Context Managers-Footnote-15279931 +Node: Customizing positional arguments in class pattern matching5279973 +Ref: reference/datamodel class-pattern-matching5280158 +Ref: 19795280158 +Ref: reference/datamodel customizing-positional-arguments-in-class-pattern-matching5280158 +Ref: 197a5280158 +Ref: reference/datamodel object __match_args__5280590 +Ref: 12c55280590 +Ref: Customizing positional arguments in class pattern matching-Footnote-15281546 +Node: Special method lookup5281588 +Ref: reference/datamodel special-lookup5281733 +Ref: 19195281733 +Ref: reference/datamodel special-method-lookup5281733 +Ref: 197b5281733 +Node: Coroutines5284454 +Ref: reference/datamodel coroutines5284540 +Ref: 197c5284540 +Node: Awaitable Objects5284690 +Ref: reference/datamodel awaitable-objects5284780 +Ref: 197d5284780 +Ref: reference/datamodel object __await__5285221 +Ref: 197e5285221 +Ref: Awaitable Objects-Footnote-15285637 +Node: Coroutine Objects5285679 +Ref: reference/datamodel coroutine-objects5285800 +Ref: 18fd5285800 +Ref: reference/datamodel id75285800 +Ref: 197f5285800 +Ref: reference/datamodel coroutine send5286671 +Ref: 19815286671 +Ref: reference/datamodel coroutine throw5287200 +Ref: 19835287200 +Ref: reference/datamodel coroutine close5287834 +Ref: 19845287834 +Node: Asynchronous Iterators5288457 +Ref: reference/datamodel async-iterators5288590 +Ref: 9f65288590 +Ref: reference/datamodel asynchronous-iterators5288590 +Ref: 19865288590 +Ref: reference/datamodel object __aiter__5288814 +Ref: 8665288814 +Ref: reference/datamodel object __anext__5288904 +Ref: 18fe5288904 +Node: Asynchronous Context Managers5289802 +Ref: reference/datamodel async-context-managers5289909 +Ref: 1d15289909 +Ref: reference/datamodel asynchronous-context-managers5289909 +Ref: 19875289909 +Ref: reference/datamodel object __aenter__5290214 +Ref: 19885290214 +Ref: reference/datamodel object __aexit__5290373 +Ref: 19895290373 +Node: Execution model5290849 +Ref: reference/executionmodel doc5290975 +Ref: 198a5290975 +Ref: reference/executionmodel execmodel5290975 +Ref: 198b5290975 +Ref: reference/executionmodel execution-model5290975 +Ref: 198c5290975 +Node: Structure of a program5291105 +Ref: reference/executionmodel prog-structure5291206 +Ref: 198d5291206 +Ref: reference/executionmodel structure-of-a-program5291206 +Ref: 198e5291206 +Node: Naming and binding5292248 +Ref: reference/executionmodel naming5292371 +Ref: 198f5292371 +Ref: reference/executionmodel naming-and-binding5292371 +Ref: 19905292371 +Node: Binding of names5292553 +Ref: reference/executionmodel bind-names5292652 +Ref: 19915292652 +Ref: reference/executionmodel binding-of-names5292652 +Ref: 19925292652 +Node: Resolution of names5294340 +Ref: reference/executionmodel resolution-of-names5294481 +Ref: 19945294481 +Ref: reference/executionmodel resolve-names5294481 +Ref: 19955294481 +Node: Builtins and restricted execution5297890 +Ref: reference/executionmodel builtins-and-restricted-execution5298048 +Ref: 19965298048 +Ref: reference/executionmodel restrict-exec5298048 +Ref: 19975298048 +Node: Interaction with dynamic features5298893 +Ref: reference/executionmodel dynamic-features5299023 +Ref: 19985299023 +Ref: reference/executionmodel interaction-with-dynamic-features5299023 +Ref: 19995299023 +Ref: Interaction with dynamic features-Footnote-15299816 +Node: Exceptions<2>5299954 +Ref: reference/executionmodel exceptions5300046 +Ref: 199a5300046 +Ref: reference/executionmodel id25300046 +Ref: 199b5300046 +Node: The import system5302231 +Ref: reference/import doc5302358 +Ref: 199c5302358 +Ref: reference/import importsystem5302358 +Ref: 19015302358 +Ref: reference/import the-import-system5302358 +Ref: 199d5302358 +Ref: The import system-Footnote-15304992 +Ref: The import system-Footnote-25305033 +Ref: The import system-Footnote-35305075 +Node: importlib<8>5305117 +Ref: reference/import importlib5305203 +Ref: 19a05305203 +Node: Packages<2>5305578 +Ref: reference/import packages5305682 +Ref: 19a15305682 +Node: Regular packages5307085 +Ref: reference/import regular-packages5307176 +Ref: 19a35307176 +Node: Namespace packages5308388 +Ref: reference/import namespace-packages5308479 +Ref: 19a65308479 +Ref: Namespace packages-Footnote-15309856 +Node: Searching5309898 +Ref: reference/import searching5309997 +Ref: 19a85309997 +Node: The module cache5310822 +Ref: reference/import the-module-cache5310912 +Ref: 19a95310912 +Node: Finders and loaders5312476 +Ref: reference/import finders-and-loaders5312587 +Ref: 19aa5312587 +Ref: reference/import id25312587 +Ref: 19ab5312587 +Node: Import hooks5314344 +Ref: reference/import import-hooks5314452 +Ref: 19b05314452 +Node: The meta path5315324 +Ref: reference/import the-meta-path5315404 +Ref: 19b15315404 +Node: Loading5318520 +Ref: reference/import loading5318629 +Ref: 19b35318629 +Ref: Loading-Footnote-15321935 +Node: Loaders5322315 +Ref: reference/import loaders5322385 +Ref: 19b55322385 +Node: Submodules5325732 +Ref: reference/import submodules5325822 +Ref: 19b65325822 +Node: Module spec5327054 +Ref: reference/import module-spec5327169 +Ref: 19b75327169 +Node: Import-related module attributes5328008 +Ref: reference/import import-mod-attrs5328128 +Ref: 19b45328128 +Ref: reference/import import-related-module-attributes5328128 +Ref: 19b95328128 +Ref: reference/import name__5328366 +Ref: 10195328366 +Ref: reference/import __name__5328366 +Ref: 19ba5328366 +Ref: reference/import loader__5328564 +Ref: cca5328564 +Ref: reference/import __loader__5328564 +Ref: 19bb5328564 +Ref: reference/import package__5328880 +Ref: cc95328880 +Ref: reference/import __package__5328880 +Ref: 19bc5328880 +Ref: reference/import spec__5329707 +Ref: 19bd5329707 +Ref: reference/import __spec__5329707 +Ref: 19be5329707 +Ref: reference/import path__5330316 +Ref: 16ba5330316 +Ref: reference/import __path__5330316 +Ref: 19c15330316 +Ref: reference/import file__5330808 +Ref: 19025330808 +Ref: reference/import __file__5330808 +Ref: 19c35330808 +Ref: reference/import cached__5330833 +Ref: e695330833 +Ref: reference/import __cached__5330833 +Ref: 19c45330833 +Ref: Import-related module attributes-Footnote-15332188 +Ref: Import-related module attributes-Footnote-25332230 +Ref: Import-related module attributes-Footnote-35332272 +Node: module __path__5332314 +Ref: reference/import module-path5332435 +Ref: 19c55332435 +Ref: reference/import package-path-rules5332435 +Ref: 19c25332435 +Ref: module __path__-Footnote-15333617 +Ref: module __path__-Footnote-25333659 +Node: Module reprs5333701 +Ref: reference/import module-reprs5333818 +Ref: 19c65333818 +Node: Cached bytecode invalidation5335729 +Ref: reference/import cached-bytecode-invalidation5335822 +Ref: 19c75335822 +Ref: reference/import pyc-invalidation5335822 +Ref: 1bd5335822 +Node: The Path Based Finder5337173 +Ref: reference/import the-path-based-finder5337309 +Ref: 19c85337309 +Node: Path entry finders5339813 +Ref: reference/import path-entry-finders5339924 +Ref: 19ca5339924 +Ref: Path entry finders-Footnote-15344881 +Node: Path entry finder protocol5345135 +Ref: reference/import path-entry-finder-protocol5345246 +Ref: 19cc5345246 +Node: Replacing the standard import system5347563 +Ref: reference/import replacing-the-standard-import-system5347716 +Ref: 19cd5347716 +Node: Package Relative Imports5348719 +Ref: reference/import package-relative-imports5348886 +Ref: 19ce5348886 +Ref: reference/import relativeimports5348886 +Ref: 19cf5348886 +Node: Special considerations for __main__5350089 +Ref: reference/import import-dunder-main5350230 +Ref: 19d05350230 +Ref: reference/import special-considerations-for-main5350230 +Ref: 19d15350230 +Node: __main__ __spec__5350833 +Ref: reference/import id55350922 +Ref: 19d25350922 +Ref: reference/import main-spec5350922 +Ref: 19c05350922 +Node: References5352319 +Ref: reference/import references5352427 +Ref: 19d35352427 +Ref: References-Footnote-15353658 +Ref: References-Footnote-25353710 +Ref: References-Footnote-35353752 +Ref: References-Footnote-45353794 +Ref: References-Footnote-55353836 +Ref: References-Footnote-65353878 +Ref: References-Footnote-75353920 +Ref: References-Footnote-85353962 +Ref: References-Footnote-95354004 +Ref: References-Footnote-105354046 +Node: Expressions5354089 +Ref: reference/expressions doc5354218 +Ref: 19d45354218 +Ref: reference/expressions expressions5354218 +Ref: 19d55354218 +Ref: reference/expressions id15354218 +Ref: 19d65354218 +Ref: reference/expressions grammar-token-python-grammar-name5354512 +Ref: 19d75354512 +Ref: reference/expressions grammar-token-name5354512 +Ref: 19d85354512 +Node: Arithmetic conversions5355078 +Ref: reference/expressions arithmetic-conversions5355162 +Ref: 19d95355162 +Ref: reference/expressions conversions5355162 +Ref: 19da5355162 +Node: Atoms5355865 +Ref: reference/expressions atoms5355967 +Ref: 19db5355967 +Ref: reference/expressions id25355967 +Ref: 19dc5355967 +Ref: reference/expressions grammar-token-python-grammar-atom5356214 +Ref: 19dd5356214 +Ref: reference/expressions grammar-token-atom5356214 +Ref: 19de5356214 +Ref: reference/expressions grammar-token-python-grammar-enclosure5356266 +Ref: 19df5356266 +Ref: reference/expressions grammar-token-enclosure5356266 +Ref: 19e05356266 +Node: Identifiers Names5356693 +Ref: reference/expressions atom-identifiers5356772 +Ref: 18885356772 +Ref: reference/expressions identifiers-names5356772 +Ref: 19e15356772 +Ref: reference/expressions private-name-mangling5357209 +Ref: 19e25357209 +Node: Literals<2>5358066 +Ref: reference/expressions atom-literals5358173 +Ref: 19e35358173 +Ref: reference/expressions literals5358173 +Ref: 19e45358173 +Ref: reference/expressions grammar-token-python-grammar-literal5358281 +Ref: 19e55358281 +Ref: reference/expressions grammar-token-literal5358281 +Ref: 19e65358281 +Node: Parenthesized forms5358988 +Ref: reference/expressions parenthesized5359118 +Ref: 19e75359118 +Ref: reference/expressions parenthesized-forms5359118 +Ref: 19e85359118 +Ref: reference/expressions grammar-token-python-grammar-parenth_form5359253 +Ref: 19e95359253 +Ref: reference/expressions grammar-token-parenth-form5359253 +Ref: 19ea5359253 +Node: Displays for lists sets and dictionaries5360017 +Ref: reference/expressions comprehensions5360149 +Ref: 19a5360149 +Ref: reference/expressions displays-for-lists-sets-and-dictionaries5360149 +Ref: 19eb5360149 +Ref: reference/expressions grammar-token-python-grammar-comprehension5360595 +Ref: 19ec5360595 +Ref: reference/expressions grammar-token-comprehension5360595 +Ref: 19ed5360595 +Ref: reference/expressions grammar-token-python-grammar-comp_for5360649 +Ref: 19ee5360649 +Ref: reference/expressions grammar-token-comp-for5360649 +Ref: 19ef5360649 +Ref: reference/expressions grammar-token-python-grammar-comp_iter5360725 +Ref: 19f05360725 +Ref: reference/expressions grammar-token-comp-iter5360725 +Ref: 19f15360725 +Ref: reference/expressions grammar-token-python-grammar-comp_if5360767 +Ref: 19f25360767 +Ref: reference/expressions grammar-token-comp-if5360767 +Ref: 19f35360767 +Ref: Displays for lists sets and dictionaries-Footnote-15363158 +Node: List displays5363200 +Ref: reference/expressions list-displays5363325 +Ref: 19f45363325 +Ref: reference/expressions lists5363325 +Ref: 19f55363325 +Ref: reference/expressions grammar-token-python-grammar-list_display5363457 +Ref: 19f65363457 +Ref: reference/expressions grammar-token-list-display5363457 +Ref: 19f75363457 +Node: Set displays5363903 +Ref: reference/expressions set5364007 +Ref: 19f85364007 +Ref: reference/expressions set-displays5364007 +Ref: 19f95364007 +Ref: reference/expressions grammar-token-python-grammar-set_display5364187 +Ref: 19fa5364187 +Ref: reference/expressions grammar-token-set-display5364187 +Ref: 19fb5364187 +Node: Dictionary displays5364719 +Ref: reference/expressions dict5364831 +Ref: 9fb5364831 +Ref: reference/expressions dictionary-displays5364831 +Ref: 19fc5364831 +Ref: reference/expressions grammar-token-python-grammar-dict_display5364982 +Ref: 19fd5364982 +Ref: reference/expressions grammar-token-dict-display5364982 +Ref: 19fe5364982 +Ref: reference/expressions grammar-token-python-grammar-key_datum_list5365056 +Ref: 19ff5365056 +Ref: reference/expressions grammar-token-key-datum-list5365056 +Ref: 1a005365056 +Ref: reference/expressions grammar-token-python-grammar-key_datum5365117 +Ref: 1a015365117 +Ref: reference/expressions grammar-token-key-datum5365117 +Ref: 1a025365117 +Ref: reference/expressions grammar-token-python-grammar-dict_comprehension5365186 +Ref: 1a035365186 +Ref: reference/expressions grammar-token-dict-comprehension5365186 +Ref: 1a045365186 +Ref: Dictionary displays-Footnote-15366999 +Ref: Dictionary displays-Footnote-25367041 +Node: Generator expressions5367083 +Ref: reference/expressions generator-expressions5367200 +Ref: 1a055367200 +Ref: reference/expressions genexpr5367200 +Ref: 1a065367200 +Ref: reference/expressions grammar-token-python-grammar-generator_expression5367333 +Ref: 1a075367333 +Ref: reference/expressions grammar-token-generator-expression5367333 +Ref: 1a085367333 +Node: Yield expressions5369276 +Ref: reference/expressions yield-expressions5369365 +Ref: 1a095369365 +Ref: reference/expressions yieldexpr5369365 +Ref: 1a0a5369365 +Ref: reference/expressions grammar-token-python-grammar-yield_atom5369418 +Ref: 1a0b5369418 +Ref: reference/expressions grammar-token-yield-atom5369418 +Ref: 1a0c5369418 +Ref: reference/expressions grammar-token-python-grammar-yield_expression5369469 +Ref: 1a0d5369469 +Ref: reference/expressions grammar-token-yield-expression5369469 +Ref: 1a0e5369469 +Ref: Yield expressions-Footnote-15374372 +Ref: Yield expressions-Footnote-25374414 +Ref: Yield expressions-Footnote-35374456 +Ref: Yield expressions-Footnote-45374498 +Ref: Yield expressions-Footnote-55374540 +Node: Generator-iterator methods5374582 +Ref: reference/expressions generator-iterator-methods5374679 +Ref: 1a125374679 +Ref: reference/expressions generator-methods5374679 +Ref: 19805374679 +Ref: reference/expressions generator __next__5375021 +Ref: 17085375021 +Ref: reference/expressions generator send5375784 +Ref: 19825375784 +Ref: reference/expressions generator throw5376366 +Ref: 134b5376366 +Ref: reference/expressions generator close5377496 +Ref: 19855377496 +Node: Examples5378083 +Ref: reference/expressions examples5378221 +Ref: 1a135378221 +Node: Asynchronous generator functions5379280 +Ref: reference/expressions asynchronous-generator-functions5379431 +Ref: 1a105379431 +Ref: reference/expressions id35379431 +Ref: 1a145379431 +Ref: Asynchronous generator functions-Footnote-15383108 +Node: Asynchronous generator-iterator methods5383188 +Ref: reference/expressions asynchronous-generator-iterator-methods5383322 +Ref: 1a165383322 +Ref: reference/expressions asynchronous-generator-methods5383322 +Ref: 1a175383322 +Ref: reference/expressions agen __anext__5383564 +Ref: 1a155383564 +Ref: reference/expressions agen asend5384495 +Ref: 5165384495 +Ref: reference/expressions agen athrow5385358 +Ref: 5175385358 +Ref: reference/expressions agen aclose5386046 +Ref: 5155386046 +Node: Primaries5387062 +Ref: reference/expressions id45387158 +Ref: 1a185387158 +Ref: reference/expressions primaries5387158 +Ref: 1a195387158 +Ref: reference/expressions grammar-token-python-grammar-primary5387280 +Ref: 1a1a5387280 +Ref: reference/expressions grammar-token-primary5387280 +Ref: 1a1b5387280 +Node: Attribute references5387426 +Ref: reference/expressions attribute-references5387514 +Ref: 1a1c5387514 +Ref: reference/expressions id55387514 +Ref: 1a1d5387514 +Ref: reference/expressions grammar-token-python-grammar-attributeref5387643 +Ref: 1a1e5387643 +Ref: reference/expressions grammar-token-attributeref5387643 +Ref: 1a1f5387643 +Node: Subscriptions5388215 +Ref: reference/expressions id65388320 +Ref: 1a205388320 +Ref: reference/expressions subscriptions5388320 +Ref: 19395388320 +Ref: reference/expressions grammar-token-python-grammar-subscription5388592 +Ref: 1a215388592 +Ref: reference/expressions grammar-token-subscription5388592 +Ref: 1a225388592 +Node: Slicings5391029 +Ref: reference/expressions id75391119 +Ref: 1a235391119 +Ref: reference/expressions slicings5391119 +Ref: 1a245391119 +Ref: reference/expressions grammar-token-python-grammar-slicing5391368 +Ref: 1a255391368 +Ref: reference/expressions grammar-token-slicing5391368 +Ref: 1a265391368 +Ref: reference/expressions grammar-token-python-grammar-slice_list5391417 +Ref: 1a275391417 +Ref: reference/expressions grammar-token-slice-list5391417 +Ref: 1a285391417 +Ref: reference/expressions grammar-token-python-grammar-slice_item5391474 +Ref: 1a295391474 +Ref: reference/expressions grammar-token-slice-item5391474 +Ref: 1a2a5391474 +Ref: reference/expressions grammar-token-python-grammar-proper_slice5391522 +Ref: 1a2b5391522 +Ref: reference/expressions grammar-token-proper-slice5391522 +Ref: 1a2c5391522 +Ref: reference/expressions grammar-token-python-grammar-lower_bound5391593 +Ref: 1a2d5391593 +Ref: reference/expressions grammar-token-lower-bound5391593 +Ref: 1a2e5391593 +Ref: reference/expressions grammar-token-python-grammar-upper_bound5391626 +Ref: 1a2f5391626 +Ref: reference/expressions grammar-token-upper-bound5391626 +Ref: 1a305391626 +Ref: reference/expressions grammar-token-python-grammar-stride5391659 +Ref: 1a315391659 +Ref: reference/expressions grammar-token-stride5391659 +Ref: 1a325391659 +Node: Calls5392871 +Ref: reference/expressions calls5392939 +Ref: 9f95392939 +Ref: reference/expressions id85392939 +Ref: 1a335392939 +Ref: reference/expressions grammar-token-python-grammar-call5393088 +Ref: 1a365393088 +Ref: reference/expressions grammar-token-call5393088 +Ref: 1a375393088 +Ref: reference/expressions grammar-token-python-grammar-argument_list5393172 +Ref: 1a385393172 +Ref: reference/expressions grammar-token-argument-list5393172 +Ref: 1a395393172 +Ref: reference/expressions grammar-token-python-grammar-positional_arguments5393436 +Ref: 1a3a5393436 +Ref: reference/expressions grammar-token-positional-arguments5393436 +Ref: 1a3b5393436 +Ref: reference/expressions grammar-token-python-grammar-positional_item5393505 +Ref: 1a3c5393505 +Ref: reference/expressions grammar-token-positional-item5393505 +Ref: 1a3d5393505 +Ref: reference/expressions grammar-token-python-grammar-starred_and_keywords5393574 +Ref: 1a3e5393574 +Ref: reference/expressions grammar-token-starred-and-keywords5393574 +Ref: 1a3f5393574 +Ref: reference/expressions grammar-token-python-grammar-keywords_arguments5393707 +Ref: 1a405393707 +Ref: reference/expressions grammar-token-keywords-arguments5393707 +Ref: 1a415393707 +Ref: reference/expressions grammar-token-python-grammar-keyword_item5393842 +Ref: 1a425393842 +Ref: reference/expressions grammar-token-keyword-item5393842 +Ref: 1a435393842 +Ref: Calls-Footnote-15400438 +Node: Await expression5400480 +Ref: reference/expressions await5400589 +Ref: 2fa5400589 +Ref: reference/expressions await-expression5400589 +Ref: 1a455400589 +Ref: reference/expressions grammar-token-python-grammar-await_expr5400778 +Ref: 1a465400778 +Ref: reference/expressions grammar-token-await-expr5400778 +Ref: 1a475400778 +Node: The power operator5400836 +Ref: reference/expressions power5400975 +Ref: 1a485400975 +Ref: reference/expressions the-power-operator5400975 +Ref: 1a495400975 +Ref: reference/expressions grammar-token-python-grammar-power5401172 +Ref: 1a4a5401172 +Ref: reference/expressions grammar-token-power5401172 +Ref: 1a4b5401172 +Node: Unary arithmetic and bitwise operations5402297 +Ref: reference/expressions unary5402448 +Ref: 1a4c5402448 +Ref: reference/expressions unary-arithmetic-and-bitwise-operations5402448 +Ref: 1a4d5402448 +Ref: reference/expressions grammar-token-python-grammar-u_expr5402610 +Ref: 1a4e5402610 +Ref: reference/expressions grammar-token-u-expr5402610 +Ref: 1a4f5402610 +Node: Binary arithmetic operations5403349 +Ref: reference/expressions binary5403501 +Ref: 1a505403501 +Ref: reference/expressions binary-arithmetic-operations5403501 +Ref: 1a515403501 +Ref: reference/expressions grammar-token-python-grammar-m_expr5403845 +Ref: 1a525403845 +Ref: reference/expressions grammar-token-m-expr5403845 +Ref: 1a535403845 +Ref: reference/expressions grammar-token-python-grammar-a_expr5404001 +Ref: 1a545404001 +Ref: reference/expressions grammar-token-a-expr5404001 +Ref: 1a555404001 +Ref: Binary arithmetic operations-Footnote-15407317 +Ref: Binary arithmetic operations-Footnote-25407930 +Node: Shifting operations5408213 +Ref: reference/expressions shifting5408351 +Ref: 1a575408351 +Ref: reference/expressions shifting-operations5408351 +Ref: 1a585408351 +Ref: reference/expressions grammar-token-python-grammar-shift_expr5408481 +Ref: 1a595408481 +Ref: reference/expressions grammar-token-shift-expr5408481 +Ref: 1a5a5408481 +Node: Binary bitwise operations5408948 +Ref: reference/expressions binary-bitwise-operations5409069 +Ref: 1a5b5409069 +Ref: reference/expressions bitwise5409069 +Ref: 1a5c5409069 +Ref: reference/expressions grammar-token-python-grammar-and_expr5409204 +Ref: 1a5d5409204 +Ref: reference/expressions grammar-token-and-expr5409204 +Ref: 1a5e5409204 +Ref: reference/expressions grammar-token-python-grammar-xor_expr5409259 +Ref: 1a5f5409259 +Ref: reference/expressions grammar-token-xor-expr5409259 +Ref: 1a605409259 +Ref: reference/expressions grammar-token-python-grammar-or_expr5409310 +Ref: 1a615409310 +Ref: reference/expressions grammar-token-or-expr5409310 +Ref: 1a625409310 +Node: Comparisons5409952 +Ref: reference/expressions comparisons5410072 +Ref: 1a635410072 +Ref: reference/expressions id115410072 +Ref: 1a645410072 +Ref: reference/expressions grammar-token-python-grammar-comparison5410367 +Ref: 1a655410367 +Ref: reference/expressions grammar-token-comparison5410367 +Ref: 1a665410367 +Ref: reference/expressions grammar-token-python-grammar-comp_operator5410423 +Ref: 1a675410423 +Ref: reference/expressions grammar-token-comp-operator5410423 +Ref: 1a685410423 +Node: Value comparisons5411513 +Ref: reference/expressions expressions-value-comparisons5411613 +Ref: 12785411613 +Ref: reference/expressions value-comparisons5411613 +Ref: 1a695411613 +Ref: reference/expressions in5419457 +Ref: 20a5419457 +Ref: reference/expressions not-in5419457 +Ref: 20b5419457 +Ref: Value comparisons-Footnote-15419495 +Ref: Value comparisons-Footnote-25419537 +Node: Membership test operations5420646 +Ref: reference/expressions membership-test-details5420775 +Ref: 19495420775 +Ref: reference/expressions membership-test-operations5420775 +Ref: 1a6a5420775 +Ref: reference/expressions is5422644 +Ref: 4685422644 +Node: Identity comparisons5422644 +Ref: reference/expressions identity-comparisons5422747 +Ref: 1a6b5422747 +Ref: reference/expressions is-not5422747 +Ref: 1a6c5422747 +Ref: reference/expressions booleans5423093 +Ref: 1a6d5423093 +Ref: reference/expressions and5423093 +Ref: 4655423093 +Ref: reference/expressions or5423093 +Ref: 4695423093 +Ref: Identity comparisons-Footnote-15423131 +Node: Boolean operations5423433 +Ref: reference/expressions boolean-operations5423553 +Ref: 1a6e5423553 +Ref: reference/expressions not5423553 +Ref: 1a6f5423553 +Ref: reference/expressions grammar-token-python-grammar-or_test5423606 +Ref: 1a705423606 +Ref: reference/expressions grammar-token-or-test5423606 +Ref: 1a715423606 +Ref: reference/expressions grammar-token-python-grammar-and_test5423657 +Ref: 1a725423657 +Ref: reference/expressions grammar-token-and-test5423657 +Ref: 1a735423657 +Ref: reference/expressions grammar-token-python-grammar-not_test5423710 +Ref: 1a745423710 +Ref: reference/expressions grammar-token-not-test5423710 +Ref: 1a755423710 +Node: Assignment expressions<2>5425145 +Ref: reference/expressions assignment-expressions5425277 +Ref: 1a765425277 +Ref: reference/expressions grammar-token-python-grammar-assignment_expression5425338 +Ref: 1a775425338 +Ref: reference/expressions grammar-token-assignment-expression5425338 +Ref: 1a785425338 +Ref: Assignment expressions<2>-Footnote-15426329 +Node: Conditional expressions5426371 +Ref: reference/expressions conditional-expressions5426492 +Ref: 1a7a5426492 +Ref: reference/expressions if-expr5426492 +Ref: 1a7b5426492 +Ref: reference/expressions grammar-token-python-grammar-conditional_expression5426555 +Ref: 1a7c5426555 +Ref: reference/expressions grammar-token-conditional-expression5426555 +Ref: 1a7d5426555 +Ref: reference/expressions grammar-token-python-grammar-expression5426628 +Ref: 1a795426628 +Ref: reference/expressions grammar-token-expression5426628 +Ref: 1a7e5426628 +Ref: reference/expressions lambdas5427084 +Ref: 1a7f5427084 +Ref: Conditional expressions-Footnote-15427122 +Node: Lambdas5427164 +Ref: reference/expressions id145427276 +Ref: 1a805427276 +Ref: reference/expressions lambda5427276 +Ref: f4b5427276 +Ref: reference/expressions grammar-token-python-grammar-lambda_expr5427307 +Ref: 1a815427307 +Ref: reference/expressions grammar-token-lambda-expr5427307 +Ref: 1a825427307 +Node: Expression lists5427841 +Ref: reference/expressions expression-lists5427946 +Ref: 1a835427946 +Ref: reference/expressions exprlists5427946 +Ref: 9fa5427946 +Ref: reference/expressions grammar-token-python-grammar-expression_list5427995 +Ref: 1a115427995 +Ref: reference/expressions grammar-token-expression-list5427995 +Ref: 1a845427995 +Ref: reference/expressions grammar-token-python-grammar-starred_list5428058 +Ref: 1a855428058 +Ref: reference/expressions grammar-token-starred-list5428058 +Ref: 1a865428058 +Ref: reference/expressions grammar-token-python-grammar-starred_expression5428125 +Ref: 1a875428125 +Ref: reference/expressions grammar-token-starred-expression5428125 +Ref: 1a885428125 +Ref: reference/expressions grammar-token-python-grammar-starred_item5428201 +Ref: 1a895428201 +Ref: reference/expressions grammar-token-starred-item5428201 +Ref: 1a8a5428201 +Ref: Expression lists-Footnote-15429169 +Node: Evaluation order5429211 +Ref: reference/expressions evalorder5429328 +Ref: 1a8b5429328 +Ref: reference/expressions evaluation-order5429328 +Ref: 1a8c5429328 +Node: Operator precedence5429843 +Ref: reference/expressions operator-precedence5429935 +Ref: 1a8d5429935 +Ref: reference/expressions operator-summary5429935 +Ref: 1a8e5429935 +Ref: Operator precedence-Footnote-15434453 +Ref: Operator precedence-Footnote-25434602 +Node: Simple statements5434696 +Ref: reference/simple_stmts doc5434827 +Ref: 1a8f5434827 +Ref: reference/simple_stmts simple5434827 +Ref: 1a905434827 +Ref: reference/simple_stmts simple-statements5434827 +Ref: 1a915434827 +Ref: reference/simple_stmts grammar-token-python-grammar-simple_stmt5435051 +Ref: 1a925435051 +Ref: reference/simple_stmts grammar-token-simple-stmt5435051 +Ref: 1a935435051 +Node: Expression statements5435996 +Ref: reference/simple_stmts expression-statements5436101 +Ref: 1a945436101 +Ref: reference/simple_stmts exprstmts5436101 +Ref: 1a955436101 +Ref: reference/simple_stmts grammar-token-python-grammar-expression_stmt5436491 +Ref: 1a965436491 +Ref: reference/simple_stmts grammar-token-expression-stmt5436491 +Ref: 1a975436491 +Node: Assignment statements5436918 +Ref: reference/simple_stmts assignment5437052 +Ref: 19935437052 +Ref: reference/simple_stmts assignment-statements5437052 +Ref: 1a985437052 +Ref: reference/simple_stmts grammar-token-python-grammar-assignment_stmt5437223 +Ref: 1a995437223 +Ref: reference/simple_stmts grammar-token-assignment-stmt5437223 +Ref: 1a9a5437223 +Ref: reference/simple_stmts grammar-token-python-grammar-target_list5437307 +Ref: 1a9b5437307 +Ref: reference/simple_stmts grammar-token-target-list5437307 +Ref: 1a9c5437307 +Ref: reference/simple_stmts grammar-token-python-grammar-target5437359 +Ref: 1a9d5437359 +Ref: reference/simple_stmts grammar-token-target5437359 +Ref: 1a9e5437359 +Ref: reference/simple_stmts attr-target-note5440810 +Ref: 1a9f5440810 +Ref: Assignment statements-Footnote-15444867 +Node: Augmented assignment statements5444909 +Ref: reference/simple_stmts augassign5445038 +Ref: 1aa05445038 +Ref: reference/simple_stmts augmented-assignment-statements5445038 +Ref: 1aa15445038 +Ref: reference/simple_stmts grammar-token-python-grammar-augmented_assignment_stmt5445235 +Ref: 1aa25445235 +Ref: reference/simple_stmts grammar-token-augmented-assignment-stmt5445235 +Ref: 1aa35445235 +Ref: reference/simple_stmts grammar-token-python-grammar-augtarget5445323 +Ref: 1aa45445323 +Ref: reference/simple_stmts grammar-token-augtarget5445323 +Ref: 1aa55445323 +Ref: reference/simple_stmts grammar-token-python-grammar-augop5445409 +Ref: 1aa65445409 +Ref: reference/simple_stmts grammar-token-augop5445409 +Ref: 1aa75445409 +Node: Annotated assignment statements5447151 +Ref: reference/simple_stmts annassign5447280 +Ref: 1aa85447280 +Ref: reference/simple_stmts annotated-assignment-statements5447280 +Ref: 1aa95447280 +Ref: reference/simple_stmts grammar-token-python-grammar-annotated_assignment_stmt5447515 +Ref: 1aaa5447515 +Ref: reference/simple_stmts grammar-token-annotated-assignment-stmt5447515 +Ref: 1aab5447515 +Ref: Annotated assignment statements-Footnote-15449450 +Ref: Annotated assignment statements-Footnote-25449492 +Node: The assert statement5449534 +Ref: reference/simple_stmts assert5449665 +Ref: 5bc5449665 +Ref: reference/simple_stmts the-assert-statement5449665 +Ref: 1aac5449665 +Ref: reference/simple_stmts grammar-token-python-grammar-assert_stmt5449815 +Ref: 1aad5449815 +Ref: reference/simple_stmts grammar-token-assert-stmt5449815 +Ref: 1aae5449815 +Node: The pass statement5450898 +Ref: reference/simple_stmts pass5451028 +Ref: 16655451028 +Ref: reference/simple_stmts the-pass-statement5451028 +Ref: 1aaf5451028 +Ref: reference/simple_stmts grammar-token-python-grammar-pass_stmt5451087 +Ref: 1ab05451087 +Ref: reference/simple_stmts grammar-token-pass-stmt5451087 +Ref: 1ab15451087 +Node: The del statement<2>5451438 +Ref: reference/simple_stmts del5451568 +Ref: 16945451568 +Ref: reference/simple_stmts the-del-statement5451568 +Ref: 1ab25451568 +Ref: reference/simple_stmts grammar-token-python-grammar-del_stmt5451625 +Ref: 1ab35451625 +Ref: reference/simple_stmts grammar-token-del-stmt5451625 +Ref: 1ab45451625 +Node: The return statement5452546 +Ref: reference/simple_stmts return5452677 +Ref: 60e5452677 +Ref: reference/simple_stmts the-return-statement5452677 +Ref: 1ab55452677 +Ref: reference/simple_stmts grammar-token-python-grammar-return_stmt5452740 +Ref: 1ab65452740 +Ref: reference/simple_stmts grammar-token-return-stmt5452740 +Ref: 1ab75452740 +Node: The yield statement5453866 +Ref: reference/simple_stmts the-yield-statement5453996 +Ref: 1ab85453996 +Ref: reference/simple_stmts yield5453996 +Ref: 60d5453996 +Ref: reference/simple_stmts grammar-token-python-grammar-yield_stmt5454057 +Ref: 1ab95454057 +Ref: reference/simple_stmts grammar-token-yield-stmt5454057 +Ref: 1aba5454057 +Node: The raise statement5454892 +Ref: reference/simple_stmts raise5455021 +Ref: 1be5455021 +Ref: reference/simple_stmts the-raise-statement5455021 +Ref: 1abb5455021 +Ref: reference/simple_stmts grammar-token-python-grammar-raise_stmt5455082 +Ref: 1abc5455082 +Ref: reference/simple_stmts grammar-token-raise-stmt5455082 +Ref: 1abd5455082 +Node: The break statement5459093 +Ref: reference/simple_stmts break5459225 +Ref: 7065459225 +Ref: reference/simple_stmts the-break-statement5459225 +Ref: 1abf5459225 +Ref: reference/simple_stmts grammar-token-python-grammar-break_stmt5459286 +Ref: 1ac05459286 +Ref: reference/simple_stmts grammar-token-break-stmt5459286 +Ref: 1ac15459286 +Node: The continue statement5459881 +Ref: reference/simple_stmts continue5460014 +Ref: 6095460014 +Ref: reference/simple_stmts the-continue-statement5460014 +Ref: 1ac25460014 +Ref: reference/simple_stmts grammar-token-python-grammar-continue_stmt5460083 +Ref: 1ac35460083 +Ref: reference/simple_stmts grammar-token-continue-stmt5460083 +Ref: 1ac45460083 +Ref: reference/simple_stmts import5460550 +Ref: 1af5460550 +Node: The import statement5460552 +Ref: reference/simple_stmts from5460686 +Ref: f5a5460686 +Ref: reference/simple_stmts the-import-statement5460686 +Ref: 1ac55460686 +Ref: reference/simple_stmts grammar-token-python-grammar-import_stmt5460751 +Ref: 1ac65460751 +Ref: reference/simple_stmts grammar-token-import-stmt5460751 +Ref: 1ac75460751 +Ref: reference/simple_stmts grammar-token-python-grammar-module5461217 +Ref: 1ac85461217 +Ref: reference/simple_stmts grammar-token-module5461217 +Ref: 1ac95461217 +Ref: reference/simple_stmts grammar-token-python-grammar-relative_module5461271 +Ref: 1aca5461271 +Ref: reference/simple_stmts grammar-token-relative-module5461271 +Ref: 1acb5461271 +Node: Future statements5466593 +Ref: reference/simple_stmts future5466667 +Ref: 1965466667 +Ref: reference/simple_stmts future-statements5466667 +Ref: 1acc5466667 +Ref: reference/simple_stmts grammar-token-python-grammar-future_stmt5467193 +Ref: 1acd5467193 +Ref: reference/simple_stmts grammar-token-future-stmt5467193 +Ref: 1ace5467193 +Ref: reference/simple_stmts grammar-token-python-grammar-feature5467469 +Ref: 1acf5467469 +Ref: reference/simple_stmts grammar-token-feature5467469 +Ref: 1ad05467469 +Ref: Future statements-Footnote-15470187 +Ref: Future statements-Footnote-25470229 +Node: The global statement5470271 +Ref: reference/simple_stmts global5470405 +Ref: 166a5470405 +Ref: reference/simple_stmts the-global-statement5470405 +Ref: 1ad15470405 +Ref: reference/simple_stmts grammar-token-python-grammar-global_stmt5470470 +Ref: 1ad25470470 +Ref: reference/simple_stmts grammar-token-global-stmt5470470 +Ref: 1ad35470470 +Node: The nonlocal statement5472088 +Ref: reference/simple_stmts nonlocal5472193 +Ref: f565472193 +Ref: reference/simple_stmts the-nonlocal-statement5472193 +Ref: 1ad45472193 +Ref: reference/simple_stmts grammar-token-python-grammar-nonlocal_stmt5472262 +Ref: 1ad55472262 +Ref: reference/simple_stmts grammar-token-nonlocal-stmt5472262 +Ref: 1ad65472262 +Ref: The nonlocal statement-Footnote-15473237 +Node: Compound statements5473279 +Ref: reference/compound_stmts doc5473419 +Ref: 1ad75473419 +Ref: reference/compound_stmts compound5473419 +Ref: 1ad85473419 +Ref: reference/compound_stmts compound-statements5473419 +Ref: 1ad95473419 +Ref: reference/compound_stmts grammar-token-python-grammar-compound_stmt5475189 +Ref: 1ada5475189 +Ref: reference/compound_stmts grammar-token-compound-stmt5475189 +Ref: 1adb5475189 +Ref: reference/compound_stmts grammar-token-python-grammar-suite5475582 +Ref: 1adc5475582 +Ref: reference/compound_stmts grammar-token-suite5475582 +Ref: 1add5475582 +Ref: reference/compound_stmts grammar-token-python-grammar-statement5475658 +Ref: 1ade5475658 +Ref: reference/compound_stmts grammar-token-statement5475658 +Ref: 1adf5475658 +Ref: reference/compound_stmts grammar-token-python-grammar-stmt_list5475715 +Ref: 1ae05475715 +Ref: reference/compound_stmts grammar-token-stmt-list5475715 +Ref: 1ae15475715 +Ref: reference/compound_stmts if5476240 +Ref: 4675476240 +Ref: reference/compound_stmts elif5476240 +Ref: 16585476240 +Node: The if statement5476463 +Ref: reference/compound_stmts else5476563 +Ref: 4665476563 +Ref: reference/compound_stmts the-if-statement5476563 +Ref: 1ae25476563 +Ref: reference/compound_stmts grammar-token-python-grammar-if_stmt5476683 +Ref: 1ae35476683 +Ref: reference/compound_stmts grammar-token-if-stmt5476683 +Ref: 1ae45476683 +Node: The while statement5477230 +Ref: reference/compound_stmts the-while-statement5477356 +Ref: 1ae55477356 +Ref: reference/compound_stmts while5477356 +Ref: 16525477356 +Ref: reference/compound_stmts grammar-token-python-grammar-while_stmt5477516 +Ref: 1ae65477516 +Ref: reference/compound_stmts grammar-token-while-stmt5477516 +Ref: 1ae75477516 +Node: The for statement5478116 +Ref: reference/compound_stmts for5478243 +Ref: 1995478243 +Ref: reference/compound_stmts the-for-statement5478243 +Ref: 1ae85478243 +Ref: reference/compound_stmts grammar-token-python-grammar-for_stmt5478442 +Ref: 1ae95478442 +Ref: reference/compound_stmts grammar-token-for-stmt5478442 +Ref: 1aea5478442 +Node: The try statement5480231 +Ref: reference/compound_stmts the-try-statement5480357 +Ref: 1aeb5480357 +Ref: reference/compound_stmts try5480357 +Ref: 10735480357 +Ref: reference/compound_stmts grammar-token-python-grammar-try_stmt5480515 +Ref: 1aec5480515 +Ref: reference/compound_stmts grammar-token-try-stmt5480515 +Ref: 1aed5480515 +Ref: reference/compound_stmts grammar-token-python-grammar-try1_stmt5480568 +Ref: 1aee5480568 +Ref: reference/compound_stmts grammar-token-try1-stmt5480568 +Ref: 1aef5480568 +Ref: reference/compound_stmts grammar-token-python-grammar-try2_stmt5480754 +Ref: 1af05480754 +Ref: reference/compound_stmts grammar-token-try2-stmt5480754 +Ref: 1af15480754 +Ref: reference/compound_stmts grammar-token-python-grammar-try3_stmt5480942 +Ref: 1af25480942 +Ref: reference/compound_stmts grammar-token-try3-stmt5480942 +Ref: 1af35480942 +Node: except clause5481321 +Ref: reference/compound_stmts except5481411 +Ref: 17a5481411 +Ref: reference/compound_stmts except-clause5481411 +Ref: 1af45481411 +Ref: except clause-Footnote-15485159 +Node: except* clause5485357 +Ref: reference/compound_stmts except-star5485467 +Ref: 1795485467 +Ref: reference/compound_stmts id25485467 +Ref: 1af55485467 +Node: else clause5487427 +Ref: reference/compound_stmts else-clause5487538 +Ref: 1af65487538 +Ref: reference/compound_stmts except-else5487538 +Ref: 1af75487538 +Node: finally clause5487900 +Ref: reference/compound_stmts finally5487988 +Ref: 60a5487988 +Ref: reference/compound_stmts finally-clause5487988 +Ref: 1af85487988 +Ref: reference/compound_stmts with5489749 +Ref: 19e5489749 +Node: The with statement5489749 +Ref: reference/compound_stmts as5489877 +Ref: 1af95489877 +Ref: reference/compound_stmts the-with-statement5489877 +Ref: 1afa5489877 +Ref: reference/compound_stmts grammar-token-python-grammar-with_stmt5490247 +Ref: 1afb5490247 +Ref: reference/compound_stmts grammar-token-with-stmt5490247 +Ref: 1afc5490247 +Ref: reference/compound_stmts grammar-token-python-grammar-with_stmt_contents5490349 +Ref: 1afd5490349 +Ref: reference/compound_stmts grammar-token-with-stmt-contents5490349 +Ref: 1afe5490349 +Ref: reference/compound_stmts grammar-token-python-grammar-with_item5490404 +Ref: 1aff5490404 +Ref: reference/compound_stmts grammar-token-with-item5490404 +Ref: 1b005490404 +Ref: The with statement-Footnote-15493535 +Node: The match statement5493577 +Ref: reference/compound_stmts match5493708 +Ref: 4005493708 +Ref: reference/compound_stmts the-match-statement5493708 +Ref: 1b015493708 +Ref: reference/compound_stmts grammar-token-python-grammar-match_stmt5493851 +Ref: 1b025493851 +Ref: reference/compound_stmts grammar-token-match-stmt5493851 +Ref: 1b035493851 +Ref: reference/compound_stmts grammar-token-python-grammar-subject_expr5493932 +Ref: 1b045493932 +Ref: reference/compound_stmts grammar-token-subject-expr5493932 +Ref: 1b055493932 +Ref: reference/compound_stmts grammar-token-python-grammar-case_block5494045 +Ref: 1b065494045 +Ref: reference/compound_stmts grammar-token-case-block5494045 +Ref: 1b075494045 +Ref: The match statement-Footnote-15494920 +Ref: The match statement-Footnote-25494962 +Node: Overview5495004 +Ref: reference/compound_stmts overview5495083 +Ref: 1b085495083 +Node: Guards5497590 +Ref: reference/compound_stmts guards5497701 +Ref: 1b0a5497701 +Ref: reference/compound_stmts grammar-token-python-grammar-guard5497732 +Ref: 1b0b5497732 +Ref: reference/compound_stmts grammar-token-guard5497732 +Ref: 1b0c5497732 +Node: Irrefutable Case Blocks5498863 +Ref: reference/compound_stmts irrefutable-case5498974 +Ref: 1b0d5498974 +Ref: reference/compound_stmts irrefutable-case-blocks5498974 +Ref: 1b0e5498974 +Node: Patterns5499679 +Ref: reference/compound_stmts patterns5499775 +Ref: 1b125499775 +Ref: reference/compound_stmts grammar-token-python-grammar-patterns5500099 +Ref: 1b135500099 +Ref: reference/compound_stmts grammar-token-patterns5500099 +Ref: 1b145500099 +Ref: reference/compound_stmts grammar-token-python-grammar-pattern5500155 +Ref: 1b155500155 +Ref: reference/compound_stmts grammar-token-pattern5500155 +Ref: 1b165500155 +Ref: reference/compound_stmts grammar-token-python-grammar-closed_pattern5500203 +Ref: 1b175500203 +Ref: reference/compound_stmts grammar-token-closed-pattern5500203 +Ref: 1b185500203 +Node: OR Patterns5501119 +Ref: reference/compound_stmts id35501195 +Ref: 1b195501195 +Ref: reference/compound_stmts or-patterns5501195 +Ref: 1b105501195 +Ref: reference/compound_stmts grammar-token-python-grammar-or_pattern5501319 +Ref: 1b1a5501319 +Ref: reference/compound_stmts grammar-token-or-pattern5501319 +Ref: 1b1b5501319 +Node: AS Patterns5501873 +Ref: reference/compound_stmts as-patterns5501974 +Ref: 1b0f5501974 +Ref: reference/compound_stmts id45501974 +Ref: 1b1c5501974 +Ref: reference/compound_stmts grammar-token-python-grammar-as_pattern5502123 +Ref: 1b1d5502123 +Ref: reference/compound_stmts grammar-token-as-pattern5502123 +Ref: 1b1e5502123 +Node: Literal Patterns5502481 +Ref: reference/compound_stmts id55502587 +Ref: 1b1f5502587 +Ref: reference/compound_stmts literal-patterns5502587 +Ref: 1b205502587 +Ref: reference/compound_stmts grammar-token-python-grammar-literal_pattern5502718 +Ref: 1b215502718 +Ref: reference/compound_stmts grammar-token-literal-pattern5502718 +Ref: 1b225502718 +Node: Capture Patterns5503710 +Ref: reference/compound_stmts capture-patterns5503822 +Ref: 1b115503822 +Ref: reference/compound_stmts id65503822 +Ref: 1b245503822 +Ref: reference/compound_stmts grammar-token-python-grammar-capture_pattern5503936 +Ref: 1b255503936 +Ref: reference/compound_stmts grammar-token-capture-pattern5503936 +Ref: 1b265503936 +Ref: Capture Patterns-Footnote-15504679 +Node: Wildcard Patterns5504721 +Ref: reference/compound_stmts id75504831 +Ref: 1b285504831 +Ref: reference/compound_stmts wildcard-patterns5504831 +Ref: 4015504831 +Ref: reference/compound_stmts grammar-token-python-grammar-wildcard_pattern5504966 +Ref: 1b275504966 +Ref: reference/compound_stmts grammar-token-wildcard-pattern5504966 +Ref: 1b295504966 +Node: Value Patterns5505243 +Ref: reference/compound_stmts id85505351 +Ref: 1b2a5505351 +Ref: reference/compound_stmts value-patterns5505351 +Ref: 1b2b5505351 +Ref: reference/compound_stmts grammar-token-python-grammar-value_pattern5505462 +Ref: 1b2c5505462 +Ref: reference/compound_stmts grammar-token-value-pattern5505462 +Ref: 1b2d5505462 +Ref: reference/compound_stmts grammar-token-python-grammar-attr5505490 +Ref: 1b2e5505490 +Ref: reference/compound_stmts grammar-token-attr5505490 +Ref: 1b2f5505490 +Ref: reference/compound_stmts grammar-token-python-grammar-name_or_attr5505535 +Ref: 1b305505535 +Ref: reference/compound_stmts grammar-token-name-or-attr5505535 +Ref: 1b315505535 +Node: Group Patterns5506148 +Ref: reference/compound_stmts group-patterns5506256 +Ref: 1b325506256 +Ref: reference/compound_stmts id95506256 +Ref: 1b335506256 +Ref: reference/compound_stmts grammar-token-python-grammar-group_pattern5506456 +Ref: 1b345506456 +Ref: reference/compound_stmts grammar-token-group-pattern5506456 +Ref: 1b355506456 +Node: Sequence Patterns5506555 +Ref: reference/compound_stmts id105506665 +Ref: 1b365506665 +Ref: reference/compound_stmts sequence-patterns5506665 +Ref: 1b375506665 +Ref: reference/compound_stmts grammar-token-python-grammar-sequence_pattern5506870 +Ref: 1b385506870 +Ref: reference/compound_stmts grammar-token-sequence-pattern5506870 +Ref: 1b395506870 +Ref: reference/compound_stmts grammar-token-python-grammar-open_sequence_pattern5507001 +Ref: 1b3a5507001 +Ref: reference/compound_stmts grammar-token-open-sequence-pattern5507001 +Ref: 1b3b5507001 +Ref: reference/compound_stmts grammar-token-python-grammar-maybe_sequence_pattern5507081 +Ref: 1b3c5507081 +Ref: reference/compound_stmts grammar-token-maybe-sequence-pattern5507081 +Ref: 1b3d5507081 +Ref: reference/compound_stmts grammar-token-python-grammar-maybe_star_pattern5507142 +Ref: 1b3e5507142 +Ref: reference/compound_stmts grammar-token-maybe-star-pattern5507142 +Ref: 1b3f5507142 +Ref: reference/compound_stmts grammar-token-python-grammar-star_pattern5507197 +Ref: 1b405507197 +Ref: reference/compound_stmts grammar-token-star-pattern5507197 +Ref: 1b415507197 +Ref: Sequence Patterns-Footnote-15510188 +Node: Mapping Patterns5510975 +Ref: reference/compound_stmts id125511085 +Ref: 1b425511085 +Ref: reference/compound_stmts mapping-patterns5511085 +Ref: 1b435511085 +Ref: reference/compound_stmts grammar-token-python-grammar-mapping_pattern5511267 +Ref: 1b445511267 +Ref: reference/compound_stmts grammar-token-mapping-pattern5511267 +Ref: 1b455511267 +Ref: reference/compound_stmts grammar-token-python-grammar-items_pattern5511320 +Ref: 1b465511320 +Ref: reference/compound_stmts grammar-token-items-pattern5511320 +Ref: 1b475511320 +Ref: reference/compound_stmts grammar-token-python-grammar-key_value_pattern5511377 +Ref: 1b485511377 +Ref: reference/compound_stmts grammar-token-key-value-pattern5511377 +Ref: 1b495511377 +Ref: reference/compound_stmts grammar-token-python-grammar-double_star_pattern5511503 +Ref: 1b4a5511503 +Ref: reference/compound_stmts grammar-token-double-star-pattern5511503 +Ref: 1b4b5511503 +Ref: Mapping Patterns-Footnote-15513092 +Node: Class Patterns5513596 +Ref: reference/compound_stmts class-patterns5513680 +Ref: 1b4c5513680 +Ref: reference/compound_stmts id145513680 +Ref: 1b4d5513680 +Ref: reference/compound_stmts grammar-token-python-grammar-class_pattern5513825 +Ref: 1b4e5513825 +Ref: reference/compound_stmts grammar-token-class-pattern5513825 +Ref: 1b4f5513825 +Ref: reference/compound_stmts grammar-token-python-grammar-pattern_arguments5513900 +Ref: 1b505513900 +Ref: reference/compound_stmts grammar-token-pattern-arguments5513900 +Ref: 1b515513900 +Ref: reference/compound_stmts grammar-token-python-grammar-positional_patterns5514020 +Ref: 1b525514020 +Ref: reference/compound_stmts grammar-token-positional-patterns5514020 +Ref: 1b535514020 +Ref: reference/compound_stmts grammar-token-python-grammar-keyword_patterns5514062 +Ref: 1b545514062 +Ref: reference/compound_stmts grammar-token-keyword-patterns5514062 +Ref: 1b555514062 +Ref: reference/compound_stmts grammar-token-python-grammar-keyword_pattern5514112 +Ref: 1b565514112 +Ref: reference/compound_stmts grammar-token-keyword-pattern5514112 +Ref: 1b575514112 +Ref: reference/compound_stmts function5518160 +Ref: 16825518160 +Ref: Class Patterns-Footnote-15518196 +Ref: Class Patterns-Footnote-25518238 +Node: Function definitions5518280 +Ref: reference/compound_stmts def5518410 +Ref: 10bd5518410 +Ref: reference/compound_stmts function-definitions5518410 +Ref: 1b585518410 +Ref: reference/compound_stmts grammar-token-python-grammar-funcdef5518583 +Ref: 1b595518583 +Ref: reference/compound_stmts grammar-token-funcdef5518583 +Ref: 1b5a5518583 +Ref: reference/compound_stmts grammar-token-python-grammar-decorators5518734 +Ref: 1b5b5518734 +Ref: reference/compound_stmts grammar-token-decorators5518734 +Ref: 1b5c5518734 +Ref: reference/compound_stmts grammar-token-python-grammar-decorator5518780 +Ref: 1b5d5518780 +Ref: reference/compound_stmts grammar-token-decorator5518780 +Ref: 1b5e5518780 +Ref: reference/compound_stmts grammar-token-python-grammar-parameter_list5518849 +Ref: 1b5f5518849 +Ref: reference/compound_stmts grammar-token-parameter-list5518849 +Ref: 1b605518849 +Ref: reference/compound_stmts grammar-token-python-grammar-parameter_list_no_posonly5519024 +Ref: 1b615519024 +Ref: reference/compound_stmts grammar-token-parameter-list-no-posonly5519024 +Ref: 1b625519024 +Ref: reference/compound_stmts grammar-token-python-grammar-parameter_list_starargs5519185 +Ref: 1b635519185 +Ref: reference/compound_stmts grammar-token-parameter-list-starargs5519185 +Ref: 1b645519185 +Ref: reference/compound_stmts grammar-token-python-grammar-parameter5519343 +Ref: 1b655519343 +Ref: reference/compound_stmts grammar-token-parameter5519343 +Ref: 1b665519343 +Ref: reference/compound_stmts grammar-token-python-grammar-defparameter5519406 +Ref: 1b675519406 +Ref: reference/compound_stmts grammar-token-defparameter5519406 +Ref: 1b685519406 +Ref: reference/compound_stmts grammar-token-python-grammar-funcname5519468 +Ref: 1b695519468 +Ref: reference/compound_stmts grammar-token-funcname5519468 +Ref: 1b6a5519468 +Ref: Function definitions-Footnote-15525615 +Ref: Function definitions-Footnote-25525809 +Ref: Function definitions-Footnote-35525851 +Ref: Function definitions-Footnote-45525893 +Ref: Function definitions-Footnote-55525935 +Ref: Function definitions-Footnote-65525977 +Ref: Function definitions-Footnote-75526019 +Node: Class definitions5526061 +Ref: reference/compound_stmts class5526185 +Ref: f7b5526185 +Ref: reference/compound_stmts class-definitions5526185 +Ref: 1b6c5526185 +Ref: reference/compound_stmts grammar-token-python-grammar-classdef5526333 +Ref: 1b6d5526333 +Ref: reference/compound_stmts grammar-token-classdef5526333 +Ref: 1b6e5526333 +Ref: reference/compound_stmts grammar-token-python-grammar-inheritance5526409 +Ref: 1b6f5526409 +Ref: reference/compound_stmts grammar-token-inheritance5526409 +Ref: 1b705526409 +Ref: reference/compound_stmts grammar-token-python-grammar-classname5526454 +Ref: 1b715526454 +Ref: reference/compound_stmts grammar-token-classname5526454 +Ref: 1b725526454 +Ref: Class definitions-Footnote-15529352 +Ref: Class definitions-Footnote-25529536 +Ref: Class definitions-Footnote-35529578 +Ref: Class definitions-Footnote-45529620 +Ref: Class definitions-Footnote-55529662 +Node: Coroutines<2>5529704 +Ref: reference/compound_stmts async5529799 +Ref: 2f95529799 +Ref: reference/compound_stmts coroutines5529799 +Ref: 1b735529799 +Node: Coroutine function definition5529956 +Ref: reference/compound_stmts async-def5530067 +Ref: 19b5530067 +Ref: reference/compound_stmts coroutine-function-definition5530067 +Ref: 1b745530067 +Ref: reference/compound_stmts grammar-token-python-grammar-async_funcdef5530144 +Ref: 1b755530144 +Ref: reference/compound_stmts grammar-token-async-funcdef5530144 +Ref: 1b765530144 +Node: The async for statement5531056 +Ref: reference/compound_stmts async-for5531200 +Ref: 7085531200 +Ref: reference/compound_stmts the-async-for-statement5531200 +Ref: 1b775531200 +Ref: reference/compound_stmts grammar-token-python-grammar-async_for_stmt5531273 +Ref: 1b785531273 +Ref: reference/compound_stmts grammar-token-async-for-stmt5531273 +Ref: 1b795531273 +Node: The async with statement5532208 +Ref: reference/compound_stmts async-with5532314 +Ref: 1a15532314 +Ref: reference/compound_stmts the-async-with-statement5532314 +Ref: 1b7a5532314 +Ref: reference/compound_stmts grammar-token-python-grammar-async_with_stmt5532389 +Ref: 1b7b5532389 +Ref: reference/compound_stmts grammar-token-async-with-stmt5532389 +Ref: 1b7c5532389 +Ref: The async with statement-Footnote-15533520 +Node: Top-level components5533562 +Ref: reference/toplevel_components doc5533711 +Ref: 1b7d5533711 +Ref: reference/toplevel_components top-level5533711 +Ref: 1b7e5533711 +Ref: reference/toplevel_components top-level-components5533711 +Ref: 1b7f5533711 +Node: Complete Python programs5534104 +Ref: reference/toplevel_components complete-python-programs5534204 +Ref: 1b805534204 +Ref: reference/toplevel_components programs5534204 +Ref: 19bf5534204 +Node: File input5535586 +Ref: reference/toplevel_components file-input5535712 +Ref: 1b815535712 +Ref: reference/toplevel_components id15535712 +Ref: 1b825535712 +Ref: reference/toplevel_components grammar-token-python-grammar-file_input5535809 +Ref: 1b835535809 +Ref: reference/toplevel_components grammar-token-file-input5535809 +Ref: 1b845535809 +Node: Interactive input5536085 +Ref: reference/toplevel_components interactive5536203 +Ref: 1b855536203 +Ref: reference/toplevel_components interactive-input5536203 +Ref: 1b865536203 +Ref: reference/toplevel_components grammar-token-python-grammar-interactive_input5536318 +Ref: 1b875536318 +Ref: reference/toplevel_components grammar-token-interactive-input5536318 +Ref: 1b885536318 +Node: Expression input5536551 +Ref: reference/toplevel_components expression-input5536650 +Ref: 1b895536650 +Ref: reference/toplevel_components id25536650 +Ref: 1b8a5536650 +Ref: reference/toplevel_components grammar-token-python-grammar-eval_input5536852 +Ref: 1b8b5536852 +Ref: reference/toplevel_components grammar-token-eval-input5536852 +Ref: 1b8c5536852 +Node: Full Grammar specification5536898 +Ref: reference/grammar doc5537019 +Ref: 1b235537019 +Ref: reference/grammar full-grammar-specification5537019 +Ref: 1b8d5537019 +Ref: Full Grammar specification-Footnote-15601754 +Ref: Full Grammar specification-Footnote-25601826 +Ref: Full Grammar specification-Footnote-35601898 +Ref: Full Grammar specification-Footnote-45601963 +Node: The Python Standard Library5602005 +Ref: library/index doc5602165 +Ref: 1b8e5602165 +Ref: library/index library-index5602165 +Ref: 16235602165 +Ref: library/index the-python-standard-library5602165 +Ref: 1b8f5602165 +Ref: The Python Standard Library-Footnote-15604860 +Node: Introduction<6>5604885 +Ref: library/intro doc5604991 +Ref: 1b905604991 +Ref: library/intro introduction5604991 +Ref: 1b915604991 +Ref: library/intro library-intro5604991 +Ref: 1b925604991 +Node: Notes on availability5607674 +Ref: library/intro availability5607747 +Ref: 17945607747 +Ref: library/intro notes-on-availability5607747 +Ref: 1b935607747 +Node: WebAssembly platforms5608454 +Ref: library/intro wasm-availability5608533 +Ref: 11a05608533 +Ref: library/intro webassembly-platforms5608533 +Ref: 1b945608533 +Ref: WebAssembly platforms-Footnote-15611052 +Ref: WebAssembly platforms-Footnote-25611085 +Ref: WebAssembly platforms-Footnote-35611117 +Ref: WebAssembly platforms-Footnote-45611143 +Ref: WebAssembly platforms-Footnote-55611175 +Ref: WebAssembly platforms-Footnote-65611201 +Ref: WebAssembly platforms-Footnote-75611231 +Ref: WebAssembly platforms-Footnote-85611260 +Ref: WebAssembly platforms-Footnote-95611290 +Node: Built-in Functions5611351 +Ref: library/functions doc5611484 +Ref: 1b955611484 +Ref: library/functions built-in-funcs5611484 +Ref: f185611484 +Ref: library/functions built-in-functions5611484 +Ref: 1b965611484 +Ref: library/functions pyscript5611484 +Ref: 1b975611484 +Ref: library/functions abs5614951 +Ref: 16ed5614951 +Ref: library/functions aiter5615203 +Ref: 3c45615203 +Ref: library/functions all5615501 +Ref: 10855615501 +Ref: library/functions anext5615817 +Ref: 3c55615817 +Ref: library/functions any5616509 +Ref: 10845616509 +Ref: library/functions ascii5616836 +Ref: 104d5616836 +Ref: library/functions bin5617198 +Ref: f575617198 +Ref: library/functions bool5617867 +Ref: 4635617867 +Ref: library/functions breakpoint5618467 +Ref: 7165618467 +Ref: library/functions func-bytearray5619409 +Ref: 14ff5619409 +Ref: library/functions func-bytes5620866 +Ref: 14fe5620866 +Ref: library/functions callable5621626 +Ref: e785621626 +Ref: library/functions chr5622175 +Ref: 18fa5622175 +Ref: library/functions classmethod5622634 +Ref: 18d5622634 +Ref: library/functions compile5624125 +Ref: 3105624125 +Ref: library/functions complex5628157 +Ref: 1b85628157 +Ref: library/functions delattr5629673 +Ref: 1b985629673 +Ref: library/functions func-dict5630120 +Ref: 1b995630120 +Ref: library/functions dir5630583 +Ref: 20e5630583 +Ref: library/functions divmod5633318 +Ref: 5f15633318 +Ref: library/functions enumerate5633962 +Ref: 10e15633962 +Ref: library/functions func-eval5634855 +Ref: 1bab5634855 +Ref: library/functions eval5634855 +Ref: 4a75634855 +Ref: library/functions exec5637334 +Ref: 4a85637334 +Ref: library/functions filter5640321 +Ref: 4615640321 +Ref: library/functions float5641125 +Ref: 3ca5641125 +Ref: library/functions grammar-token-float-sign5641748 +Ref: 1bae5641748 +Ref: library/functions grammar-token-sign5641748 +Ref: 1baf5641748 +Ref: library/functions grammar-token-float-infinity5641787 +Ref: 1bb05641787 +Ref: library/functions grammar-token-infinity5641787 +Ref: 1bb15641787 +Ref: library/functions grammar-token-float-nan5641835 +Ref: 1bb25641835 +Ref: library/functions grammar-token-nan5641835 +Ref: 1bb35641835 +Ref: library/functions grammar-token-float-numeric_value5641870 +Ref: 1bb45641870 +Ref: library/functions grammar-token-numeric-value5641870 +Ref: 1bb55641870 +Ref: library/functions grammar-token-float-numeric_string5641928 +Ref: 1bb65641928 +Ref: library/functions grammar-token-numeric-string5641928 +Ref: 1bb75641928 +Ref: library/functions format5643430 +Ref: 1f75643430 +Ref: library/functions func-frozenset5644520 +Ref: 1b9a5644520 +Ref: library/functions getattr5645002 +Ref: 8375645002 +Ref: library/functions globals5645846 +Ref: 125f5645846 +Ref: library/functions hasattr5646086 +Ref: 8365646086 +Ref: library/functions hash5646428 +Ref: 1bc5646428 +Ref: library/functions help5646995 +Ref: 5145646995 +Ref: library/functions hex5648068 +Ref: f785648068 +Ref: library/functions id5649132 +Ref: 10865649132 +Ref: library/functions input5649593 +Ref: f7c5649593 +Ref: library/functions int5650486 +Ref: 1c75650486 +Ref: library/functions isinstance5653073 +Ref: 3ab5653073 +Ref: library/functions issubclass5653892 +Ref: 3ac5653892 +Ref: library/functions iter5654463 +Ref: 3c65654463 +Ref: library/functions len5655868 +Ref: 2095655868 +Ref: library/functions func-list5656279 +Ref: 1b9b5656279 +Ref: library/functions locals5656519 +Ref: 8425656519 +Ref: library/functions map5657046 +Ref: 4605657046 +Ref: library/functions max5657583 +Ref: b9a5657583 +Ref: library/functions func-memoryview5658835 +Ref: 1b9c5658835 +Ref: library/functions min5658998 +Ref: b995658998 +Ref: library/functions next5660241 +Ref: 3c75660241 +Ref: library/functions object5660555 +Ref: 6df5660555 +Ref: library/functions oct5660970 +Ref: f775660970 +Ref: library/functions open5661751 +Ref: 30b5661751 +Ref: library/functions filemodes5663237 +Ref: 1bbd5663237 +Ref: library/functions open-newline-parameter5668363 +Ref: 30e5668363 +Ref: library/functions ord5673260 +Ref: 18f95673260 +Ref: library/functions pow5673585 +Ref: 6135673585 +Ref: library/functions print5675434 +Ref: c135675434 +Ref: library/functions property5676625 +Ref: 2055676625 +Ref: library/functions func-range5679334 +Ref: 1b9d5679334 +Ref: library/functions repr5679601 +Ref: 3ee5679601 +Ref: library/functions reversed5680316 +Ref: 4625680316 +Ref: library/functions round5680616 +Ref: f7e5680616 +Ref: library/functions func-set5681940 +Ref: 1b9e5681940 +Ref: library/functions setattr5682415 +Ref: 1b9f5682415 +Ref: library/functions slice5683493 +Ref: 11005683493 +Ref: library/functions sorted5684269 +Ref: 8335684269 +Ref: library/functions staticmethod5685913 +Ref: 3c85685913 +Ref: library/functions func-str5687564 +Ref: 1ba05687564 +Ref: library/functions sum5687901 +Ref: 2965687901 +Ref: library/functions super5688611 +Ref: 8b75688611 +Ref: library/functions func-tuple5692355 +Ref: 1ba15692355 +Ref: library/functions type5692602 +Ref: 9c25692602 +Ref: library/functions vars5694304 +Ref: 14805694304 +Ref: library/functions zip5695230 +Ref: 3bc5695230 +Ref: library/functions import__5699002 +Ref: 5105699002 +Ref: library/functions __import__5699002 +Ref: 1bcc5699002 +Ref: Built-in Functions-Footnote-15702361 +Ref: Built-in Functions-Footnote-25702567 +Ref: Built-in Functions-Footnote-35702609 +Ref: Built-in Functions-Footnote-45702651 +Ref: Built-in Functions-Footnote-55702728 +Ref: Built-in Functions-Footnote-65702776 +Ref: Built-in Functions-Footnote-75702818 +Node: Built-in Constants5702860 +Ref: library/constants doc5702992 +Ref: 1bcd5702992 +Ref: library/constants built-in-constants5702992 +Ref: 1bce5702992 +Ref: library/constants built-in-consts5702992 +Ref: 1bcf5702992 +Ref: library/constants False5703111 +Ref: 78d5703111 +Ref: library/constants True5703261 +Ref: 8775703261 +Ref: library/constants None5703408 +Ref: 2435703408 +Ref: library/constants NotImplemented5703700 +Ref: 3c15703700 +Ref: library/constants Ellipsis5705390 +Ref: 1bd05705390 +Ref: library/constants debug__5705672 +Ref: 3cb5705672 +Ref: library/constants __debug__5705672 +Ref: 1bd15705672 +Node: Constants added by the site module5706141 +Ref: library/constants constants-added-by-the-site-module5706230 +Ref: 1bd25706230 +Ref: library/constants quit5706598 +Ref: 1bd35706598 +Ref: library/constants exit5706625 +Ref: 1bd45706625 +Ref: library/constants copyright5706841 +Ref: 1bd55706841 +Ref: library/constants credits5706861 +Ref: 1bd65706861 +Ref: library/constants license5706982 +Ref: 1bd75706982 +Node: Built-in Types5707209 +Ref: library/stdtypes doc5707342 +Ref: 1bd85707342 +Ref: library/stdtypes bltin-types5707342 +Ref: 1bd95707342 +Ref: library/stdtypes built-in-types5707342 +Ref: 1bda5707342 +Node: Truth Value Testing5708909 +Ref: library/stdtypes truth5709021 +Ref: 1ba25709021 +Ref: library/stdtypes truth-value-testing5709021 +Ref: 1bdb5709021 +Ref: Truth Value Testing-Footnote-15710084 +Node: Boolean Operations — and or not5710220 +Ref: library/stdtypes boolean5710355 +Ref: 1bdc5710355 +Ref: library/stdtypes boolean-operations-and-or-not5710355 +Ref: 1bdd5710355 +Node: Comparisons<2>5711684 +Ref: library/stdtypes comparisons5711835 +Ref: 1bde5711835 +Ref: library/stdtypes stdcomparisons5711835 +Ref: 1bdf5711835 +Node: Numeric Types — int float complex5714275 +Ref: library/stdtypes numeric-types-int-float-complex5714407 +Ref: 1be05714407 +Ref: library/stdtypes typesnumeric5714407 +Ref: 16455714407 +Ref: Numeric Types — int float complex-Footnote-15722450 +Node: Bitwise Operations on Integer Types5722565 +Ref: library/stdtypes bitstring-ops5722716 +Ref: 1be15722716 +Ref: library/stdtypes bitwise-operations-on-integer-types5722716 +Ref: 1be25722716 +Node: Additional Methods on Integer Types5725070 +Ref: library/stdtypes additional-methods-on-integer-types5725257 +Ref: 1be35725257 +Ref: library/stdtypes int bit_length5725483 +Ref: 1be45725483 +Ref: library/stdtypes int bit_count5726398 +Ref: 3b75726398 +Ref: library/stdtypes int to_bytes5726860 +Ref: 128c5726860 +Ref: library/stdtypes int from_bytes5729031 +Ref: 12445729031 +Ref: library/stdtypes int as_integer_ratio5730960 +Ref: 60b5730960 +Node: Additional Methods on Float5731274 +Ref: library/stdtypes additional-methods-on-float5731450 +Ref: 1be65731450 +Ref: library/stdtypes float as_integer_ratio5731662 +Ref: 17515731662 +Ref: library/stdtypes float is_integer5731918 +Ref: 1be75731918 +Ref: library/stdtypes float hex5732545 +Ref: 17525732545 +Ref: library/stdtypes float fromhex5732795 +Ref: 1be85732795 +Node: Hashing of numeric types5734435 +Ref: library/stdtypes hashing-of-numeric-types5734567 +Ref: 1be95734567 +Ref: library/stdtypes numeric-hash5734567 +Ref: 1bea5734567 +Node: Iterator Types5738742 +Ref: library/stdtypes iterator-types5738895 +Ref: 1beb5738895 +Ref: library/stdtypes typeiter5738895 +Ref: 1bba5738895 +Ref: library/stdtypes container __iter__5739288 +Ref: 1bec5739288 +Ref: library/stdtypes iterator __iter__5740036 +Ref: 1bed5740036 +Ref: library/stdtypes iterator __next__5740388 +Ref: f765740388 +Node: Generator Types5741169 +Ref: library/stdtypes generator-types5741235 +Ref: 1bee5741235 +Ref: library/stdtypes id35741235 +Ref: 1bef5741235 +Node: Sequence Types — list tuple range5741719 +Ref: library/stdtypes sequence-types-list-tuple-range5741863 +Ref: 1bf05741863 +Ref: library/stdtypes typesseq5741863 +Ref: 16965741863 +Node: Common Sequence Operations5742330 +Ref: library/stdtypes common-sequence-operations5742461 +Ref: 1bf15742461 +Ref: library/stdtypes typesseq-common5742461 +Ref: 1bf25742461 +Ref: Common Sequence Operations-Footnote-15751204 +Node: Immutable Sequence Types5751283 +Ref: library/stdtypes immutable-sequence-types5751445 +Ref: 1bf65751445 +Ref: library/stdtypes typesseq-immutable5751445 +Ref: 1bf75751445 +Node: Mutable Sequence Types5751978 +Ref: library/stdtypes mutable-sequence-types5752122 +Ref: 1bf85752122 +Ref: library/stdtypes typesseq-mutable5752122 +Ref: 1ba45752122 +Node: Lists<2>5757789 +Ref: library/stdtypes lists5757915 +Ref: 1bf95757915 +Ref: library/stdtypes typesseq-list5757915 +Ref: 1bbb5757915 +Ref: library/stdtypes list5758098 +Ref: 1e95758098 +Ref: library/stdtypes list sort5759285 +Ref: 8345759285 +Node: Tuples5761602 +Ref: library/stdtypes tuples5761712 +Ref: 1bfa5761712 +Ref: library/stdtypes typesseq-tuple5761712 +Ref: 1b095761712 +Ref: library/stdtypes tuple5762076 +Ref: 5395762076 +Node: Ranges5763631 +Ref: library/stdtypes ranges5763724 +Ref: 1bfb5763724 +Ref: library/stdtypes typesseq-range5763724 +Ref: 1bc55763724 +Ref: library/stdtypes range5763913 +Ref: 58b5763913 +Ref: library/stdtypes range start5765896 +Ref: 1bfc5765896 +Ref: library/stdtypes range stop5766026 +Ref: 1bfd5766026 +Ref: library/stdtypes range step5766097 +Ref: 1bfe5766097 +Ref: Ranges-Footnote-15768104 +Node: Text Sequence Type — str5768157 +Ref: library/stdtypes text-sequence-type-str5768339 +Ref: 1bff5768339 +Ref: library/stdtypes textseq5768339 +Ref: 16495768339 +Ref: library/stdtypes str5770005 +Ref: 1b35770005 +Node: String Methods<2>5772156 +Ref: library/stdtypes id55772275 +Ref: 1c015772275 +Ref: library/stdtypes string-methods5772275 +Ref: 164a5772275 +Ref: library/stdtypes str capitalize5773117 +Ref: 1c045773117 +Ref: library/stdtypes str casefold5773483 +Ref: a575773483 +Ref: library/stdtypes str center5774103 +Ref: 16c75774103 +Ref: library/stdtypes str count5774375 +Ref: 1c055774375 +Ref: library/stdtypes str encode5774611 +Ref: 5125774611 +Ref: library/stdtypes str endswith5775700 +Ref: b5a5775700 +Ref: library/stdtypes str expandtabs5776035 +Ref: 1c065776035 +Ref: library/stdtypes str find5777150 +Ref: b355777150 +Ref: library/stdtypes str format5777699 +Ref: 1fc5777699 +Ref: library/stdtypes str format_map5779212 +Ref: a585779212 +Ref: library/stdtypes str index5779723 +Ref: 1c075779723 +Ref: library/stdtypes str isalnum5779869 +Ref: 1c085779869 +Ref: library/stdtypes str isalpha5780209 +Ref: 1c095780209 +Ref: library/stdtypes str isascii5780707 +Ref: 7475780707 +Ref: library/stdtypes str isdecimal5780947 +Ref: 1c0a5780947 +Ref: library/stdtypes str isdigit5781335 +Ref: 1c0b5781335 +Ref: library/stdtypes str isidentifier5781843 +Ref: 136d5781843 +Ref: library/stdtypes str islower5782401 +Ref: 1c0d5782401 +Ref: library/stdtypes str isnumeric5782585 +Ref: 1c0e5782585 +Ref: library/stdtypes str isprintable5783065 +Ref: a595783065 +Ref: library/stdtypes str isspace5783683 +Ref: 1c0f5783683 +Ref: library/stdtypes str istitle5784105 +Ref: 1c105784105 +Ref: library/stdtypes str isupper5784386 +Ref: 1c115784386 +Ref: library/stdtypes meth-str-join5784760 +Ref: 1c125784760 +Ref: library/stdtypes str join5784760 +Ref: 1bf45784760 +Ref: library/stdtypes str ljust5785088 +Ref: 16c65785088 +Ref: library/stdtypes str lower5785375 +Ref: 11c35785375 +Ref: library/stdtypes str lstrip5785594 +Ref: 1c135785594 +Ref: library/stdtypes str maketrans5786408 +Ref: a5a5786408 +Ref: library/stdtypes str partition5787137 +Ref: b385787137 +Ref: library/stdtypes str removeprefix5787476 +Ref: 50b5787476 +Ref: library/stdtypes str removesuffix5787831 +Ref: 50c5787831 +Ref: library/stdtypes str replace5788217 +Ref: 1c155788217 +Ref: library/stdtypes str rfind5788458 +Ref: b365788458 +Ref: library/stdtypes str rindex5788755 +Ref: 1c165788755 +Ref: library/stdtypes str rjust5788910 +Ref: 16c55788910 +Ref: library/stdtypes str rpartition5789198 +Ref: 1c175789198 +Ref: library/stdtypes str rsplit5789537 +Ref: 1c185789537 +Ref: library/stdtypes str rstrip5789988 +Ref: 1c195789988 +Ref: library/stdtypes str split5790783 +Ref: b375790783 +Ref: library/stdtypes str splitlines5792443 +Ref: 1c1a5792443 +Ref: library/stdtypes str startswith5795093 +Ref: b595795093 +Ref: library/stdtypes str strip5795430 +Ref: 1c1b5795430 +Ref: library/stdtypes str swapcase5796438 +Ref: 1c1c5796438 +Ref: library/stdtypes str title5796655 +Ref: 1c1d5796655 +Ref: library/stdtypes str translate5797841 +Ref: 1c145797841 +Ref: library/stdtypes str upper5798742 +Ref: 1c205798742 +Ref: library/stdtypes str zfill5799207 +Ref: 16c85799207 +Ref: String Methods<2>-Footnote-15799728 +Ref: String Methods<2>-Footnote-25799900 +Ref: String Methods<2>-Footnote-35800072 +Ref: String Methods<2>-Footnote-45800244 +Node: printf-style String Formatting5800416 +Ref: library/stdtypes old-string-formatting5800535 +Ref: 2955800535 +Ref: library/stdtypes printf-style-string-formatting5800535 +Ref: 1c215800535 +Ref: printf-style String Formatting-Footnote-15809747 +Ref: printf-style String Formatting-Footnote-25809874 +Node: Binary Sequence Types — bytes bytearray memoryview5809916 +Ref: library/stdtypes binary-sequence-types-bytes-bytearray-memoryview5810090 +Ref: 1c235810090 +Ref: library/stdtypes binaryseq5810090 +Ref: 1ba75810090 +Node: Bytes Objects5810782 +Ref: library/stdtypes bytes-objects5810910 +Ref: 1c245810910 +Ref: library/stdtypes typebytes5810910 +Ref: 1ba95810910 +Ref: library/stdtypes bytes5811250 +Ref: 1b45811250 +Ref: library/stdtypes bytes fromhex5813504 +Ref: 7455813504 +Ref: library/stdtypes bytes hex5814111 +Ref: 9e45814111 +Node: Bytearray Objects5815752 +Ref: library/stdtypes bytearray-objects5815919 +Ref: 1c255815919 +Ref: library/stdtypes typebytearray5815919 +Ref: 1ba85815919 +Ref: library/stdtypes bytearray5816059 +Ref: 1a55816059 +Ref: library/stdtypes bytearray fromhex5817097 +Ref: 7465817097 +Ref: library/stdtypes bytearray hex5817733 +Ref: 9e55817733 +Node: Bytes and Bytearray Operations5818784 +Ref: library/stdtypes bytes-and-bytearray-operations5818967 +Ref: 1c265818967 +Ref: library/stdtypes bytes-methods5818967 +Ref: 1ba55818967 +Ref: library/stdtypes bytes count5820185 +Ref: 1c275820185 +Ref: library/stdtypes bytearray count5820231 +Ref: 1c285820231 +Ref: library/stdtypes bytes removeprefix5820694 +Ref: 1c295820694 +Ref: library/stdtypes bytearray removeprefix5820737 +Ref: 1c2a5820737 +Ref: library/stdtypes bytes removesuffix5821340 +Ref: 1c2b5821340 +Ref: library/stdtypes bytearray removesuffix5821383 +Ref: 1c2c5821383 +Ref: library/stdtypes bytes decode5822017 +Ref: 5135822017 +Ref: library/stdtypes bytearray decode5822078 +Ref: 1c2d5822078 +Ref: library/stdtypes bytes endswith5823314 +Ref: 1c2e5823314 +Ref: library/stdtypes bytearray endswith5823366 +Ref: 1c2f5823366 +Ref: library/stdtypes bytes find5823793 +Ref: 12305823793 +Ref: library/stdtypes bytearray find5823838 +Ref: 1c305823838 +Ref: library/stdtypes bytes index5824644 +Ref: 1c315824644 +Ref: library/stdtypes bytearray index5824690 +Ref: 1c325824690 +Ref: library/stdtypes bytes join5825064 +Ref: 1bf55825064 +Ref: library/stdtypes bytearray join5825098 +Ref: 1c335825098 +Ref: library/stdtypes bytes maketrans5825534 +Ref: f2d5825534 +Ref: library/stdtypes bytearray maketrans5825580 +Ref: f2e5825580 +Ref: library/stdtypes bytes partition5825946 +Ref: 1c355825946 +Ref: library/stdtypes bytearray partition5825980 +Ref: 1c365825980 +Ref: library/stdtypes bytes replace5826467 +Ref: 1c375826467 +Ref: library/stdtypes bytearray replace5826513 +Ref: 1c385826513 +Ref: library/stdtypes bytes rfind5827033 +Ref: 12315827033 +Ref: library/stdtypes bytearray rfind5827079 +Ref: 1c395827079 +Ref: library/stdtypes bytes rindex5827609 +Ref: 1c3a5827609 +Ref: library/stdtypes bytearray rindex5827656 +Ref: 1c3b5827656 +Ref: library/stdtypes bytes rpartition5828039 +Ref: 1c3c5828039 +Ref: library/stdtypes bytearray rpartition5828074 +Ref: 1c3d5828074 +Ref: library/stdtypes bytes startswith5828561 +Ref: 1c3e5828561 +Ref: library/stdtypes bytearray startswith5828615 +Ref: 1c3f5828615 +Ref: library/stdtypes bytes translate5829051 +Ref: 1c345829051 +Ref: library/stdtypes bytearray translate5829102 +Ref: fa15829102 +Ref: library/stdtypes bytes center5830123 +Ref: 1c405830123 +Ref: library/stdtypes bytearray center5830168 +Ref: 1c415830168 +Ref: library/stdtypes bytes ljust5830669 +Ref: 1c425830669 +Ref: library/stdtypes bytearray ljust5830713 +Ref: 1c435830713 +Ref: library/stdtypes bytes lstrip5831219 +Ref: 1c445831219 +Ref: library/stdtypes bytearray lstrip5831254 +Ref: 1c455831254 +Ref: library/stdtypes bytes rjust5832453 +Ref: 1c465832453 +Ref: library/stdtypes bytearray rjust5832497 +Ref: 1c475832497 +Ref: library/stdtypes bytes rsplit5833004 +Ref: 1c485833004 +Ref: library/stdtypes bytearray rsplit5833054 +Ref: 1c495833054 +Ref: library/stdtypes bytes rstrip5833569 +Ref: 1c4b5833569 +Ref: library/stdtypes bytearray rstrip5833604 +Ref: 1c4c5833604 +Ref: library/stdtypes bytes split5834784 +Ref: 1c4d5834784 +Ref: library/stdtypes bytearray split5834833 +Ref: 1c4a5834833 +Ref: library/stdtypes bytes strip5836757 +Ref: 1c4e5836757 +Ref: library/stdtypes bytearray strip5836791 +Ref: 1c4f5836791 +Ref: library/stdtypes bytes capitalize5837978 +Ref: 1c505837978 +Ref: library/stdtypes bytearray capitalize5838010 +Ref: 1c515838010 +Ref: library/stdtypes bytes expandtabs5838419 +Ref: 1c525838419 +Ref: library/stdtypes bytearray expandtabs5838460 +Ref: 1c535838460 +Ref: library/stdtypes bytes isalnum5839802 +Ref: 1c545839802 +Ref: library/stdtypes bytearray isalnum5839831 +Ref: 1c555839831 +Ref: library/stdtypes bytes isalpha5840393 +Ref: 1c565840393 +Ref: library/stdtypes bytearray isalpha5840422 +Ref: 1c575840422 +Ref: library/stdtypes bytes isascii5840859 +Ref: 1c585840859 +Ref: library/stdtypes bytearray isascii5840888 +Ref: 1c595840888 +Ref: library/stdtypes bytes isdigit5841103 +Ref: 1c5a5841103 +Ref: library/stdtypes bytearray isdigit5841132 +Ref: 1c5b5841132 +Ref: library/stdtypes bytes islower5841504 +Ref: 1c5c5841504 +Ref: library/stdtypes bytearray islower5841533 +Ref: 1c5d5841533 +Ref: library/stdtypes bytes isspace5842071 +Ref: 1c5e5842071 +Ref: library/stdtypes bytearray isspace5842100 +Ref: 1c5f5842100 +Ref: library/stdtypes bytes istitle5842432 +Ref: 1c605842432 +Ref: library/stdtypes bytearray istitle5842461 +Ref: 1c615842461 +Ref: library/stdtypes bytes isupper5842834 +Ref: 1c635842834 +Ref: library/stdtypes bytearray isupper5842863 +Ref: 1c645842863 +Ref: library/stdtypes bytes lower5843417 +Ref: 1c655843417 +Ref: library/stdtypes bytearray lower5843444 +Ref: 1c665843444 +Ref: library/stdtypes bytes splitlines5844083 +Ref: 1c675844083 +Ref: library/stdtypes bytearray splitlines5844129 +Ref: 1c685844129 +Ref: library/stdtypes bytes swapcase5845078 +Ref: 1c695845078 +Ref: library/stdtypes bytearray swapcase5845108 +Ref: 1c6a5845108 +Ref: library/stdtypes bytes title5846038 +Ref: 1c625846038 +Ref: library/stdtypes bytearray title5846065 +Ref: 1c6b5846065 +Ref: library/stdtypes bytes upper5847690 +Ref: 1c6c5847690 +Ref: library/stdtypes bytearray upper5847717 +Ref: 1c6d5847717 +Ref: library/stdtypes bytes zfill5848356 +Ref: 1c6e5848356 +Ref: library/stdtypes bytearray zfill5848388 +Ref: 1c6f5848388 +Node: printf-style Bytes Formatting5849098 +Ref: library/stdtypes bytes-formatting5849276 +Ref: 9fd5849276 +Ref: library/stdtypes printf-style-bytes-formatting5849276 +Ref: 1c705849276 +Ref: printf-style Bytes Formatting-Footnote-15858730 +Ref: printf-style Bytes Formatting-Footnote-25858857 +Ref: printf-style Bytes Formatting-Footnote-35858899 +Node: Memory Views5858941 +Ref: library/stdtypes memory-views5859080 +Ref: 1c715859080 +Ref: library/stdtypes typememoryview5859080 +Ref: 1bbc5859080 +Ref: library/stdtypes memoryview5859278 +Ref: 6ad5859278 +Ref: library/stdtypes memoryview __eq__5863053 +Ref: 1c755863053 +Ref: library/stdtypes memoryview tobytes5865055 +Ref: 1c765865055 +Ref: library/stdtypes memoryview hex5866157 +Ref: 9e65866157 +Ref: library/stdtypes memoryview tolist5866678 +Ref: 1c725866678 +Ref: library/stdtypes memoryview toreadonly5867240 +Ref: 1c775867240 +Ref: library/stdtypes memoryview release5867852 +Ref: e725867852 +Ref: library/stdtypes memoryview cast5869218 +Ref: 1c785869218 +Ref: library/stdtypes memoryview obj5872237 +Ref: 1c7a5872237 +Ref: library/stdtypes memoryview nbytes5872475 +Ref: 1c7b5872475 +Ref: library/stdtypes memoryview readonly5873601 +Ref: 1c7c5873601 +Ref: library/stdtypes memoryview format5873693 +Ref: 1c745873693 +Ref: library/stdtypes memoryview itemsize5874231 +Ref: 1c735874231 +Ref: library/stdtypes memoryview ndim5874607 +Ref: 1c7d5874607 +Ref: library/stdtypes memoryview shape5874748 +Ref: 1c7e5874748 +Ref: library/stdtypes memoryview strides5875003 +Ref: 1c7f5875003 +Ref: library/stdtypes memoryview suboffsets5875293 +Ref: 1c805875293 +Ref: library/stdtypes memoryview c_contiguous5875418 +Ref: 1c815875418 +Ref: library/stdtypes memoryview f_contiguous5875570 +Ref: 1c825875570 +Ref: library/stdtypes memoryview contiguous5875728 +Ref: 1c835875728 +Ref: Memory Views-Footnote-15875912 +Node: Set Types — set frozenset5875954 +Ref: library/stdtypes set-types-set-frozenset5876124 +Ref: 1c845876124 +Ref: library/stdtypes types-set5876124 +Ref: 1bb85876124 +Ref: library/stdtypes set5877672 +Ref: 1a65877672 +Ref: library/stdtypes frozenset5877700 +Ref: 1a75877700 +Ref: library/stdtypes frozenset isdisjoint5878736 +Ref: 1c855878736 +Ref: library/stdtypes frozenset issubset5878944 +Ref: 1c865878944 +Ref: library/stdtypes frozenset issuperset5879223 +Ref: 1c875879223 +Ref: library/stdtypes frozenset union5879506 +Ref: 1c885879506 +Ref: library/stdtypes frozenset intersection5879647 +Ref: 1c895879647 +Ref: library/stdtypes frozenset difference5879810 +Ref: 1c8a5879810 +Ref: library/stdtypes frozenset symmetric_difference5879976 +Ref: 1c8b5879976 +Ref: library/stdtypes frozenset copy5880148 +Ref: 1c8c5880148 +Ref: library/stdtypes frozenset update5882384 +Ref: 1c8d5882384 +Ref: library/stdtypes frozenset intersection_update5882516 +Ref: 1c8e5882516 +Ref: library/stdtypes frozenset difference_update5882688 +Ref: 1c8f5882688 +Ref: library/stdtypes frozenset symmetric_difference_update5882833 +Ref: 1c905882833 +Ref: library/stdtypes frozenset add5883015 +Ref: 1c915883015 +Ref: library/stdtypes frozenset remove5883086 +Ref: 1c925883086 +Ref: library/stdtypes frozenset discard5883243 +Ref: 1c935883243 +Ref: library/stdtypes frozenset pop5883340 +Ref: 1c945883340 +Ref: library/stdtypes frozenset clear5883489 +Ref: 1c955883489 +Node: Mapping Types — dict5884045 +Ref: library/stdtypes mapping-types-dict5884184 +Ref: 1c965884184 +Ref: library/stdtypes typesmapping5884184 +Ref: 7195884184 +Ref: library/stdtypes dict5885180 +Ref: 16e5885180 +Ref: library/stdtypes dict clear5889525 +Ref: 13b35889525 +Ref: library/stdtypes dict copy5889601 +Ref: 8355889601 +Ref: library/stdtypes dict fromkeys5889679 +Ref: 1c975889679 +Ref: library/stdtypes dict get5890221 +Ref: 1c985890221 +Ref: library/stdtypes dict items5890476 +Ref: 3ba5890476 +Ref: library/stdtypes dict keys5890650 +Ref: 3b85890650 +Ref: library/stdtypes dict pop5890795 +Ref: 1c9a5890795 +Ref: library/stdtypes dict popitem5891048 +Ref: 1c9b5891048 +Ref: library/stdtypes dict setdefault5891821 +Ref: d295891821 +Ref: library/stdtypes dict update5892051 +Ref: 10c85892051 +Ref: library/stdtypes dict values5892536 +Ref: 3b95892536 +Node: Dictionary view objects5895237 +Ref: library/stdtypes dict-views5895319 +Ref: 1c995895319 +Ref: library/stdtypes dictionary-view-objects5895319 +Ref: 1c9c5895319 +Node: Context Manager Types5898598 +Ref: library/stdtypes context-manager-types5898755 +Ref: 1c9e5898755 +Ref: library/stdtypes typecontextmanager5898755 +Ref: 19775898755 +Ref: library/stdtypes contextmanager __enter__5899120 +Ref: 1c9f5899120 +Ref: library/stdtypes contextmanager __exit__5900119 +Ref: 1ca05900119 +Node: Type Annotation Types — Generic Alias Union5902507 +Ref: library/stdtypes type-annotation-types-generic-alias-union5902662 +Ref: 1ca15902662 +Node: Generic Alias Type5902928 +Ref: library/stdtypes generic-alias-type5903047 +Ref: 1ca25903047 +Ref: library/stdtypes types-genericalias5903047 +Ref: 2785903047 +Node: Standard Generic Classes5907899 +Ref: library/stdtypes standard-generic-classes5908029 +Ref: 1ca45908029 +Node: Special Attributes of GenericAlias objects5910353 +Ref: library/stdtypes special-attributes-of-genericalias-objects5910483 +Ref: 1cb35910483 +Ref: library/stdtypes genericalias __origin__5910664 +Ref: 1cb45910664 +Ref: library/stdtypes genericalias __args__5910833 +Ref: 1ca35910833 +Ref: library/stdtypes genericalias __parameters__5911124 +Ref: 1cb55911124 +Ref: library/stdtypes genericalias __unpacked__5911681 +Ref: 1cb65911681 +Ref: Special Attributes of GenericAlias objects-Footnote-15912496 +Ref: Special Attributes of GenericAlias objects-Footnote-25912538 +Node: Union Type5912580 +Ref: library/stdtypes types-union5912699 +Ref: 3ad5912699 +Ref: library/stdtypes union-type5912699 +Ref: 1cb75912699 +Ref: Union Type-Footnote-15915672 +Node: Other Built-in Types5915714 +Ref: library/stdtypes other-built-in-types5915866 +Ref: 1cb85915866 +Ref: library/stdtypes typesother5915866 +Ref: 1cb95915866 +Node: Modules<2>5916271 +Ref: library/stdtypes modules5916374 +Ref: 1cba5916374 +Ref: library/stdtypes typesmodules5916374 +Ref: 1cbb5916374 +Node: Classes and Class Instances5917527 +Ref: library/stdtypes classes-and-class-instances5917648 +Ref: 1cbc5917648 +Ref: library/stdtypes typesobjects5917648 +Ref: 1cbd5917648 +Node: Functions5917812 +Ref: library/stdtypes functions5917930 +Ref: 1cbe5917930 +Ref: library/stdtypes typesfunctions5917930 +Ref: 1cbf5917930 +Node: Methods5918394 +Ref: library/stdtypes methods5918497 +Ref: 1cc05918497 +Ref: library/stdtypes typesmethods5918497 +Ref: 1cc15918497 +Node: Code Objects5920268 +Ref: library/stdtypes bltin-code-objects5920374 +Ref: 1cc25920374 +Ref: library/stdtypes code-objects5920374 +Ref: 1cc35920374 +Node: Type Objects5921216 +Ref: library/stdtypes bltin-type-objects5921330 +Ref: 1bcb5921330 +Ref: library/stdtypes type-objects5921330 +Ref: 1cc45921330 +Node: The Null Object5921681 +Ref: library/stdtypes bltin-null-object5921802 +Ref: 1cc55921802 +Ref: library/stdtypes the-null-object5921802 +Ref: 1cc65921802 +Node: The Ellipsis Object5922117 +Ref: library/stdtypes bltin-ellipsis-object5922251 +Ref: 1cc75922251 +Ref: library/stdtypes the-ellipsis-object5922251 +Ref: 1cc85922251 +Node: The NotImplemented Object5922619 +Ref: library/stdtypes bltin-notimplemented-object5922752 +Ref: 1cc95922752 +Ref: library/stdtypes the-notimplemented-object5922752 +Ref: 1cca5922752 +Node: Boolean Values5923155 +Ref: library/stdtypes bltin-boolean-values5923285 +Ref: 1ba35923285 +Ref: library/stdtypes boolean-values5923285 +Ref: 1ccb5923285 +Node: Internal Objects5923908 +Ref: library/stdtypes internal-objects5924004 +Ref: 1ccc5924004 +Ref: library/stdtypes typesinternal5924004 +Ref: 1ccd5924004 +Node: Special Attributes5924200 +Ref: library/stdtypes special-attributes5924350 +Ref: 1cce5924350 +Ref: library/stdtypes specialattrs5924350 +Ref: 1ccf5924350 +Ref: library/stdtypes object __dict__5924589 +Ref: 8ce5924589 +Ref: library/stdtypes instance __class__5924720 +Ref: 11045924720 +Ref: library/stdtypes class __bases__5924806 +Ref: 11035924806 +Ref: library/stdtypes definition __name__5924889 +Ref: f795924889 +Ref: library/stdtypes definition __qualname__5925012 +Ref: 18fb5925012 +Ref: library/stdtypes class __mro__5925188 +Ref: 1bca5925188 +Ref: library/stdtypes class mro5925342 +Ref: 1cd05925342 +Ref: library/stdtypes class __subclasses__5925576 +Ref: 1cd15925576 +Node: Integer string conversion length limitation5925873 +Ref: library/stdtypes int-max-str-digits5925994 +Ref: 1c95925994 +Ref: library/stdtypes integer-string-conversion-length-limitation5925994 +Ref: 1cd25925994 +Ref: Integer string conversion length limitation-Footnote-15928737 +Node: Affected APIs5928807 +Ref: library/stdtypes affected-apis5928930 +Ref: 1cd35928930 +Node: Configuring the limit5929856 +Ref: library/stdtypes configuring-the-limit5930013 +Ref: 1cd45930013 +Node: Recommended configuration5932461 +Ref: library/stdtypes recommended-configuration5932596 +Ref: 1cd65932596 +Node: Built-in Exceptions5933459 +Ref: library/exceptions doc5933598 +Ref: 1cd75933598 +Ref: library/exceptions bltin-exceptions5933598 +Ref: 12815933598 +Ref: library/exceptions built-in-exceptions5933598 +Ref: 1cd85933598 +Node: Exception context5935321 +Ref: library/exceptions exception-context5935438 +Ref: 1cd95935438 +Node: Inheriting from built-in exceptions5937005 +Ref: library/exceptions inheriting-from-built-in-exceptions5937143 +Ref: 1cda5937143 +Ref: Inheriting from built-in exceptions-Footnote-15938025 +Node: Base classes5938098 +Ref: library/exceptions base-classes5938238 +Ref: 1cdb5938238 +Ref: library/exceptions BaseException5938357 +Ref: 17d5938357 +Ref: library/exceptions BaseException args5938742 +Ref: 1cdc5938742 +Ref: library/exceptions BaseException with_traceback5939110 +Ref: 1abe5939110 +Ref: library/exceptions BaseException add_note5939998 +Ref: 17c5939998 +Ref: library/exceptions BaseException __notes__5940281 +Ref: 1cdd5940281 +Ref: library/exceptions Exception5940525 +Ref: 61c5940525 +Ref: library/exceptions ArithmeticError5940709 +Ref: 1cde5940709 +Ref: library/exceptions BufferError5940937 +Ref: 12115940937 +Ref: library/exceptions LookupError5941049 +Ref: 1c1f5941049 +Ref: Base classes-Footnote-15941351 +Node: Concrete exceptions5941393 +Ref: library/exceptions concrete-exceptions5941506 +Ref: 1ce05941506 +Ref: library/exceptions AssertionError5941629 +Ref: 26e5941629 +Ref: library/exceptions AttributeError5941717 +Ref: 19d5941717 +Ref: library/exceptions EOFError5942338 +Ref: f7d5942338 +Ref: library/exceptions FloatingPointError5942615 +Ref: 1cdf5942615 +Ref: library/exceptions GeneratorExit5942676 +Ref: 10355942676 +Ref: library/exceptions ImportError5942998 +Ref: 5115942998 +Ref: library/exceptions ModuleNotFoundError5943573 +Ref: 79e5943573 +Ref: library/exceptions IndexError5943835 +Ref: 116b5943835 +Ref: library/exceptions KeyError5944062 +Ref: 6f55944062 +Ref: library/exceptions KeyboardInterrupt5944179 +Ref: 6115944179 +Ref: library/exceptions MemoryError5945045 +Ref: 127a5945045 +Ref: library/exceptions NameError5945626 +Ref: 3965945626 +Ref: library/exceptions NotImplementedError5946096 +Ref: 9c75946096 +Ref: library/exceptions OSError5946940 +Ref: 4135946940 +Ref: library/exceptions OSError errno5947977 +Ref: 1ce45947977 +Ref: library/exceptions OSError winerror5948069 +Ref: 1ce55948069 +Ref: library/exceptions OSError strerror5948648 +Ref: 1ce65948648 +Ref: library/exceptions OSError filename5948884 +Ref: 1ce75948884 +Ref: library/exceptions OSError filename25948913 +Ref: 1ce85948913 +Ref: library/exceptions OverflowError5949926 +Ref: 4a45949926 +Ref: library/exceptions RecursionError5950419 +Ref: 9e75950419 +Ref: library/exceptions ReferenceError5950742 +Ref: 11485950742 +Ref: library/exceptions RuntimeError5951068 +Ref: 6e95951068 +Ref: library/exceptions StopIteration5951270 +Ref: 8655951270 +Ref: library/exceptions StopAsyncIteration5952601 +Ref: 14605952601 +Ref: library/exceptions SyntaxError5952786 +Ref: 2d65952786 +Ref: library/exceptions SyntaxError filename5953308 +Ref: 1ce95953308 +Ref: library/exceptions SyntaxError lineno5953400 +Ref: 1cea5953400 +Ref: library/exceptions SyntaxError offset5953574 +Ref: 1ceb5953574 +Ref: library/exceptions SyntaxError text5953760 +Ref: 1cec5953760 +Ref: library/exceptions SyntaxError end_lineno5953841 +Ref: 1ced5953841 +Ref: library/exceptions SyntaxError end_offset5954033 +Ref: 1cee5954033 +Ref: library/exceptions IndentationError5954667 +Ref: 3935954667 +Ref: library/exceptions TabError5954820 +Ref: 116d5954820 +Ref: library/exceptions SystemError5954981 +Ref: 9b55954981 +Ref: library/exceptions SystemExit5955624 +Ref: 9b65955624 +Ref: library/exceptions SystemExit code5956921 +Ref: 1cf05956921 +Ref: library/exceptions TypeError5957063 +Ref: 19c5957063 +Ref: library/exceptions UnboundLocalError5957892 +Ref: 116c5957892 +Ref: library/exceptions UnicodeError5958110 +Ref: f525958110 +Ref: library/exceptions UnicodeError encoding5958471 +Ref: 1cf15958471 +Ref: library/exceptions UnicodeError reason5958560 +Ref: 1cf25958560 +Ref: library/exceptions UnicodeError object5958645 +Ref: 1cf35958645 +Ref: library/exceptions UnicodeError start5958741 +Ref: 1cf45958741 +Ref: library/exceptions UnicodeError end5958833 +Ref: 1cf55958833 +Ref: library/exceptions UnicodeEncodeError5958929 +Ref: 2465958929 +Ref: library/exceptions UnicodeDecodeError5959081 +Ref: 65c5959081 +Ref: library/exceptions UnicodeTranslateError5959233 +Ref: 1cf65959233 +Ref: library/exceptions ValueError5959391 +Ref: 1c85959391 +Ref: library/exceptions ZeroDivisionError5959644 +Ref: 58d5959644 +Ref: library/exceptions EnvironmentError5960001 +Ref: d035960001 +Ref: library/exceptions IOError5960034 +Ref: d025960034 +Ref: library/exceptions WindowsError5960058 +Ref: d045960058 +Ref: Concrete exceptions-Footnote-15960184 +Ref: Concrete exceptions-Footnote-25960226 +Node: OS exceptions5960268 +Ref: library/exceptions os-exceptions5960337 +Ref: 1ce35960337 +Ref: library/exceptions BlockingIOError5960498 +Ref: d075960498 +Ref: library/exceptions BlockingIOError characters_written5960884 +Ref: 1cfb5960884 +Ref: library/exceptions ChildProcessError5961139 +Ref: d085961139 +Ref: library/exceptions ConnectionError5961284 +Ref: a8b5961284 +Ref: library/exceptions BrokenPipeError5961532 +Ref: d0c5961532 +Ref: library/exceptions ConnectionAbortedError5961844 +Ref: d0d5961844 +Ref: library/exceptions ConnectionRefusedError5962052 +Ref: d0e5962052 +Ref: library/exceptions ConnectionResetError5962260 +Ref: d0f5962260 +Ref: library/exceptions FileExistsError5962454 +Ref: ccc5962454 +Ref: library/exceptions FileNotFoundError5962616 +Ref: b535962616 +Ref: library/exceptions InterruptedError5962774 +Ref: a055962774 +Ref: library/exceptions IsADirectoryError5963180 +Ref: d095963180 +Ref: library/exceptions NotADirectoryError5963370 +Ref: d0a5963370 +Ref: library/exceptions PermissionError5963741 +Ref: 9b95963741 +Ref: library/exceptions ProcessLookupError5963972 +Ref: d0b5963972 +Ref: library/exceptions TimeoutError5964110 +Ref: 4295964110 +Ref: OS exceptions-Footnote-15964453 +Ref: OS exceptions-Footnote-25964495 +Node: Warnings5964537 +Ref: library/exceptions warning-categories-as-exceptions5964654 +Ref: 1d095964654 +Ref: library/exceptions warnings5964654 +Ref: 1d0a5964654 +Ref: library/exceptions Warning5964815 +Ref: 1d0c5964815 +Ref: library/exceptions UserWarning5964880 +Ref: 1d0d5964880 +Ref: library/exceptions DeprecationWarning5964962 +Ref: 2d45964962 +Ref: library/exceptions PendingDeprecationWarning5965354 +Ref: 5035965354 +Ref: library/exceptions SyntaxWarning5965926 +Ref: 2d55965926 +Ref: library/exceptions RuntimeWarning5966008 +Ref: 6ef5966008 +Ref: library/exceptions FutureWarning5966101 +Ref: 73e5966101 +Ref: library/exceptions ImportWarning5966288 +Ref: 46d5966288 +Ref: library/exceptions UnicodeWarning5966512 +Ref: 10875966512 +Ref: library/exceptions EncodingWarning5966593 +Ref: 17835966593 +Ref: library/exceptions BytesWarning5966763 +Ref: 88f5966763 +Ref: library/exceptions ResourceWarning5966882 +Ref: 8a95966882 +Ref: Warnings-Footnote-15967154 +Ref: Warnings-Footnote-25967196 +Ref: Warnings-Footnote-35967238 +Node: Exception groups5967280 +Ref: library/exceptions exception-groups5967397 +Ref: 1d0e5967397 +Ref: library/exceptions ExceptionGroup5967780 +Ref: 1775967780 +Ref: library/exceptions BaseExceptionGroup5967823 +Ref: 1785967823 +Ref: library/exceptions BaseExceptionGroup message5968866 +Ref: 1d0f5968866 +Ref: library/exceptions BaseExceptionGroup exceptions5968991 +Ref: 1d105968991 +Ref: library/exceptions BaseExceptionGroup subgroup5969155 +Ref: 1d115969155 +Ref: library/exceptions BaseExceptionGroup split5970266 +Ref: 1d125970266 +Ref: library/exceptions BaseExceptionGroup derive5970501 +Ref: 1d135970501 +Node: Exception hierarchy5972083 +Ref: library/exceptions exception-hierarchy5972183 +Ref: 1d145972183 +Ref: library/text stringservices5975007 +Ref: 1c005975007 +Node: Text Processing Services5975008 +Ref: library/text doc5975153 +Ref: 1d155975153 +Ref: library/text text-processing-services5975153 +Ref: 1d165975153 +Ref: library/text textservices5975153 +Ref: 1c035975153 +Node: string — Common string operations5975941 +Ref: library/string doc5976082 +Ref: 1d185976082 +Ref: library/string module-string5976082 +Ref: f35976082 +Ref: library/string string-common-string-operations5976082 +Ref: 1d195976082 +Ref: string — Common string operations-Footnote-15976526 +Node: String constants5976592 +Ref: library/string string-constants5976713 +Ref: 1d1a5976713 +Ref: library/string string ascii_letters5976807 +Ref: f715976807 +Ref: library/string string ascii_lowercase5977006 +Ref: 1d1b5977006 +Ref: library/string string ascii_uppercase5977166 +Ref: 1d1c5977166 +Ref: library/string string digits5977326 +Ref: 1d1d5977326 +Ref: library/string string hexdigits5977388 +Ref: 1d1e5977388 +Ref: library/string string octdigits5977465 +Ref: 1d1f5977465 +Ref: library/string string punctuation5977528 +Ref: 1d205977528 +Ref: library/string string printable5977703 +Ref: 1d215977703 +Ref: library/string string whitespace5977931 +Ref: 1d225977931 +Node: Custom String Formatting5978137 +Ref: library/string custom-string-formatting5978287 +Ref: 1d235978287 +Ref: library/string string-formatting5978287 +Ref: 1c025978287 +Ref: library/string string Formatter5978734 +Ref: b4a5978734 +Ref: library/string string Formatter format5978835 +Ref: 86a5978835 +Ref: library/string string Formatter vformat5979196 +Ref: 1d245979196 +Ref: library/string string Formatter parse5979907 +Ref: 1d255979907 +Ref: library/string string Formatter get_field5980663 +Ref: 1d265980663 +Ref: library/string string Formatter get_value5981212 +Ref: 1d275981212 +Ref: library/string string Formatter check_unused_args5982449 +Ref: 1d285982449 +Ref: library/string string Formatter format_field5983053 +Ref: 1d295983053 +Ref: library/string string Formatter convert_field5983279 +Ref: 1d2a5983279 +Ref: Custom String Formatting-Footnote-15983654 +Ref: Custom String Formatting-Footnote-25983696 +Node: Format String Syntax5983738 +Ref: library/string format-string-syntax5983888 +Ref: 1d2b5983888 +Ref: library/string formatstrings5983888 +Ref: 10215983888 +Ref: library/string grammar-token-format-string-replacement_field5984689 +Ref: 1d2c5984689 +Ref: library/string grammar-token-replacement-field5984689 +Ref: 1d2d5984689 +Ref: library/string grammar-token-format-string-field_name5984777 +Ref: 1d2e5984777 +Ref: library/string grammar-token-field-name5984777 +Ref: 1d2f5984777 +Ref: library/string grammar-token-format-string-arg_name5984864 +Ref: 1d305984864 +Ref: library/string grammar-token-arg-name5984864 +Ref: 1d315984864 +Ref: library/string grammar-token-format-string-attribute_name5984918 +Ref: 1d325984918 +Ref: library/string grammar-token-attribute-name5984918 +Ref: 1d335984918 +Ref: library/string grammar-token-format-string-element_index5984961 +Ref: 1d345984961 +Ref: library/string grammar-token-element-index5984961 +Ref: 1d355984961 +Ref: library/string grammar-token-format-string-index_string5985015 +Ref: 1d365985015 +Ref: library/string grammar-token-index-string5985015 +Ref: 1d375985015 +Ref: library/string grammar-token-format-string-conversion5985083 +Ref: 1d385985083 +Ref: library/string grammar-token-conversion5985083 +Ref: 1d395985083 +Ref: library/string grammar-token-format-string-format_spec5985131 +Ref: 1d3a5985131 +Ref: library/string grammar-token-format-spec5985131 +Ref: 1d3b5985131 +Node: Format Specification Mini-Language5989113 +Ref: library/string format-specification-mini-language5989228 +Ref: 1d3d5989228 +Ref: library/string formatspec5989228 +Ref: 1b05989228 +Ref: library/string grammar-token-format-spec-format_spec5990126 +Ref: 1d3e5990126 +Ref: library/string grammar-token-format-spec-fill5990222 +Ref: 1d3f5990222 +Ref: library/string grammar-token-fill5990222 +Ref: 1d405990222 +Ref: library/string grammar-token-format-spec-align5990263 +Ref: 1d415990263 +Ref: library/string grammar-token-align5990263 +Ref: 1d425990263 +Ref: library/string grammar-token-format-spec-sign5990310 +Ref: 1d435990310 +Ref: library/string grammar-token-sign5990310 +Ref: 1d445990310 +Ref: library/string grammar-token-format-spec-width5990351 +Ref: 1d455990351 +Ref: library/string grammar-token-width5990351 +Ref: 1d465990351 +Ref: library/string grammar-token-format-spec-grouping_option5990383 +Ref: 1d475990383 +Ref: library/string grammar-token-grouping-option5990383 +Ref: 1d485990383 +Ref: library/string grammar-token-format-spec-precision5990418 +Ref: 1d495990418 +Ref: library/string grammar-token-precision5990418 +Ref: 1d4a5990418 +Ref: library/string grammar-token-format-spec-type5990450 +Ref: 1d4b5990450 +Ref: library/string grammar-token-type5990450 +Ref: 1d4c5990450 +Ref: Format Specification Mini-Language-Footnote-16003711 +Ref: Format Specification Mini-Language-Footnote-26003753 +Ref: Format Specification Mini-Language-Footnote-36003795 +Node: Format examples6003837 +Ref: library/string format-examples6003952 +Ref: 1d4d6003952 +Ref: library/string formatexamples6003952 +Ref: 1d3c6003952 +Node: Template strings6008480 +Ref: library/string id16008622 +Ref: 1d4e6008622 +Ref: library/string template-strings6008622 +Ref: 1c226008622 +Ref: library/string string Template6010083 +Ref: 2596010083 +Ref: library/string string Template substitute6010203 +Ref: 172d6010203 +Ref: library/string string Template safe_substitute6010688 +Ref: 172e6010688 +Ref: library/string string Template is_valid6011643 +Ref: 2586011643 +Ref: library/string string Template get_identifiers6011865 +Ref: 2576011865 +Ref: library/string string Template template6012160 +Ref: 1d4f6012160 +Ref: Template strings-Footnote-16016077 +Ref: Template strings-Footnote-26016119 +Node: Helper functions6016171 +Ref: library/string helper-functions6016284 +Ref: 1d506016284 +Ref: library/string string capwords6016335 +Ref: 1c1e6016335 +Node: re — Regular expression operations6016821 +Ref: library/re doc6017011 +Ref: 1d516017011 +Ref: library/re module-re6017011 +Ref: da6017011 +Ref: library/re re-regular-expression-operations6017011 +Ref: 1d526017011 +Ref: re — Regular expression operations-Footnote-16019583 +Ref: re — Regular expression operations-Footnote-26019643 +Node: Regular Expression Syntax6019683 +Ref: library/re re-syntax6019805 +Ref: 3186019805 +Ref: library/re regular-expression-syntax6019805 +Ref: 1d536019805 +Ref: Regular Expression Syntax-Footnote-16046396 +Node: Module Contents6046438 +Ref: library/re contents-of-module-re6046595 +Ref: 1d5e6046595 +Ref: library/re module-contents6046595 +Ref: 1d5f6046595 +Node: Flags6046959 +Ref: library/re flags6047037 +Ref: 1d606047037 +Ref: library/re re RegexFlag6047197 +Ref: 2086047197 +Ref: library/re re A6047362 +Ref: 1d586047362 +Ref: library/re re ASCII6047377 +Ref: 2076047377 +Ref: library/re re DEBUG6048006 +Ref: 1d616048006 +Ref: library/re re I6048121 +Ref: 1d596048121 +Ref: library/re re IGNORECASE6048136 +Ref: 12df6048136 +Ref: library/re re L6049125 +Ref: 1d5a6049125 +Ref: library/re re LOCALE6049140 +Ref: 7ca6049140 +Ref: library/re re M6050081 +Ref: 1d5b6050081 +Ref: library/re re MULTILINE6050096 +Ref: 1d576050096 +Ref: library/re re NOFLAG6050681 +Ref: 1d626050681 +Ref: library/re re S6051070 +Ref: 1d5c6051070 +Ref: library/re re DOTALL6051085 +Ref: 1d566051085 +Ref: library/re re X6051321 +Ref: 1d5d6051321 +Ref: library/re re VERBOSE6051336 +Ref: 1d636051336 +Node: Functions<2>6052408 +Ref: library/re functions6052508 +Ref: 1d646052508 +Ref: library/re re compile6052545 +Ref: 83a6052545 +Ref: library/re re search6053673 +Ref: edf6053673 +Ref: library/re re match6054077 +Ref: ee06054077 +Ref: library/re re fullmatch6054728 +Ref: c236054728 +Ref: library/re re split6055057 +Ref: 7cb6055057 +Ref: library/re re findall6056926 +Ref: cd66056926 +Ref: library/re re finditer6057957 +Ref: 12096057957 +Ref: library/re re sub6058395 +Ref: 85d6058395 +Ref: library/re re subn6061750 +Ref: ad06061750 +Ref: library/re re escape6062086 +Ref: 8736062086 +Ref: library/re re purge6063574 +Ref: 1d686063574 +Node: Exceptions<3>6063643 +Ref: library/re exceptions6063729 +Ref: 1d696063729 +Ref: library/re re error6063768 +Ref: ad16063768 +Ref: library/re re error msg6064201 +Ref: ad26064201 +Ref: library/re re error pattern6064268 +Ref: ad36064268 +Ref: library/re re error pos6064340 +Ref: ad46064340 +Ref: library/re re error lineno6064455 +Ref: ad56064455 +Ref: library/re re error colno6064547 +Ref: ad66064547 +Node: Regular Expression Objects6064699 +Ref: library/re re-objects6064844 +Ref: c246064844 +Ref: library/re regular-expression-objects6064844 +Ref: 1d6a6064844 +Ref: library/re re Pattern search6064998 +Ref: 1d666064998 +Ref: library/re re Pattern match6066462 +Ref: 1d656066462 +Ref: library/re re Pattern fullmatch6067321 +Ref: 11e96067321 +Ref: library/re re Pattern split6068118 +Ref: 1d6b6068118 +Ref: library/re re Pattern findall6068252 +Ref: 1d6c6068252 +Ref: library/re re Pattern finditer6068513 +Ref: 1d6d6068513 +Ref: library/re re Pattern sub6068777 +Ref: 1d6e6068777 +Ref: library/re re Pattern subn6068910 +Ref: 1d6f6068910 +Ref: library/re re Pattern flags6069045 +Ref: 1d706069045 +Ref: library/re re Pattern groups6069312 +Ref: 1d716069312 +Ref: library/re re Pattern groupindex6069396 +Ref: 1d726069396 +Ref: library/re re Pattern pattern6069610 +Ref: 1d736069610 +Node: Match Objects6069869 +Ref: library/re id26070026 +Ref: 1d746070026 +Ref: library/re match-objects6070026 +Ref: c256070026 +Ref: library/re re Match expand6070439 +Ref: 1d756070439 +Ref: library/re re Match group6070961 +Ref: 1d766070961 +Ref: library/re re Match __getitem__6073231 +Ref: 1d776073231 +Ref: library/re re Match groups6073931 +Ref: 1d786073931 +Ref: library/re re Match groupdict6074777 +Ref: 1d796074777 +Ref: library/re re Match start6075244 +Ref: 1d7a6075244 +Ref: library/re re Match end6075278 +Ref: 1d7b6075278 +Ref: library/re re Match span6076326 +Ref: 1d7c6076326 +Ref: library/re re Match pos6076579 +Ref: 1d7d6076579 +Ref: library/re re Match endpos6076839 +Ref: 1d7e6076839 +Ref: library/re re Match lastindex6077093 +Ref: 1d7f6077093 +Ref: library/re re Match lastgroup6077492 +Ref: 1d806077492 +Ref: library/re re Match re6077665 +Ref: 1d816077665 +Ref: library/re re Match string6077832 +Ref: 1d826077832 +Node: Regular Expression Examples6078070 +Ref: library/re re-examples6078192 +Ref: f196078192 +Ref: library/re regular-expression-examples6078192 +Ref: 1d836078192 +Node: Checking for a Pair6078536 +Ref: library/re checking-for-a-pair6078644 +Ref: 1d846078644 +Node: Simulating scanf6080741 +Ref: library/re simulating-scanf6080873 +Ref: 1d856080873 +Node: search vs match6082943 +Ref: library/re id36083074 +Ref: 1d866083074 +Ref: library/re search-vs-match6083074 +Ref: 1d676083074 +Node: Making a Phonebook6084290 +Ref: library/re making-a-phonebook6084417 +Ref: 1d876084417 +Node: Text Munging6086598 +Ref: library/re text-munging6086729 +Ref: 1d886086729 +Node: Finding all Adverbs6087553 +Ref: library/re finding-all-adverbs6087705 +Ref: 1d896087705 +Node: Finding all Adverbs and their Positions6088162 +Ref: library/re finding-all-adverbs-and-their-positions6088321 +Ref: 1d8a6088321 +Node: Raw String Notation6089025 +Ref: library/re raw-string-notation6089184 +Ref: 1d8b6089184 +Node: Writing a Tokenizer6090111 +Ref: library/re writing-a-tokenizer6090222 +Ref: 1d8c6090222 +Ref: library/re frie096093593 +Ref: 1d546093593 +Ref: Writing a Tokenizer-Footnote-16093873 +Node: difflib — Helpers for computing deltas6093928 +Ref: library/difflib doc6094121 +Ref: 1d8d6094121 +Ref: library/difflib difflib-helpers-for-computing-deltas6094121 +Ref: 1d8e6094121 +Ref: library/difflib module-difflib6094121 +Ref: 356094121 +Ref: library/difflib difflib Differ6096617 +Ref: 1d8f6096617 +Ref: library/difflib difflib HtmlDiff6097744 +Ref: 1d906097744 +Ref: library/difflib difflib HtmlDiff __init__6098114 +Ref: 1d916098114 +Ref: library/difflib difflib HtmlDiff make_file6098927 +Ref: a706098927 +Ref: library/difflib difflib HtmlDiff make_table6100610 +Ref: 1d936100610 +Ref: library/difflib difflib context_diff6101192 +Ref: 1d946101192 +Ref: library/difflib difflib get_close_matches6103134 +Ref: 1d986103134 +Ref: library/difflib difflib ndiff6104298 +Ref: 1d926104298 +Ref: library/difflib difflib restore6105948 +Ref: 1d9b6105948 +Ref: library/difflib difflib unified_diff6106691 +Ref: 1d9d6106691 +Ref: library/difflib difflib diff_bytes6108610 +Ref: a716108610 +Ref: library/difflib difflib IS_LINE_JUNK6109502 +Ref: 1d996109502 +Ref: library/difflib difflib IS_CHARACTER_JUNK6109804 +Ref: 1d9a6109804 +Ref: difflib — Helpers for computing deltas-Footnote-16110464 +Ref: difflib — Helpers for computing deltas-Footnote-26110531 +Ref: difflib — Helpers for computing deltas-Footnote-36110621 +Node: SequenceMatcher Objects6110654 +Ref: library/difflib sequence-matcher6110787 +Ref: 1d9e6110787 +Ref: library/difflib sequencematcher-objects6110787 +Ref: 1d9f6110787 +Ref: library/difflib difflib SequenceMatcher6110913 +Ref: cc36110913 +Ref: library/difflib difflib SequenceMatcher set_seqs6112436 +Ref: 1da06112436 +Ref: library/difflib difflib SequenceMatcher set_seq16112854 +Ref: 1da26112854 +Ref: library/difflib difflib SequenceMatcher set_seq26112997 +Ref: 1da16112997 +Ref: library/difflib difflib SequenceMatcher find_longest_match6113140 +Ref: 13736113140 +Ref: library/difflib difflib SequenceMatcher get_matching_blocks6115297 +Ref: 1da36115297 +Ref: library/difflib difflib SequenceMatcher get_opcodes6116214 +Ref: 1da46116214 +Ref: library/difflib difflib SequenceMatcher get_grouped_opcodes6118201 +Ref: 1da56118201 +Ref: library/difflib difflib SequenceMatcher ratio6118633 +Ref: 1da66118633 +Ref: library/difflib difflib SequenceMatcher quick_ratio6119656 +Ref: 1da76119656 +Ref: library/difflib difflib SequenceMatcher real_quick_ratio6119776 +Ref: 1da86119776 +Node: SequenceMatcher Examples6120287 +Ref: library/difflib id16120443 +Ref: 1da96120443 +Ref: library/difflib sequencematcher-examples6120443 +Ref: 1daa6120443 +Ref: SequenceMatcher Examples-Footnote-16122148 +Node: Differ Objects6122201 +Ref: library/difflib differ-objects6122348 +Ref: 1dab6122348 +Ref: library/difflib id26122348 +Ref: 1dac6122348 +Ref: library/difflib difflib Differ compare6123754 +Ref: 1d9c6123754 +Node: Differ Example6124278 +Ref: library/difflib differ-example6124436 +Ref: 1dad6124436 +Ref: library/difflib differ-examples6124436 +Ref: 1dae6124436 +Node: A command-line interface to difflib6126694 +Ref: library/difflib a-command-line-interface-to-difflib6126829 +Ref: 1daf6126829 +Ref: library/difflib difflib-interface6126829 +Ref: 1d976126829 +Node: textwrap — Text wrapping and filling6129584 +Ref: library/textwrap doc6129773 +Ref: 1db06129773 +Ref: library/textwrap module-textwrap6129773 +Ref: 10a6129773 +Ref: library/textwrap textwrap-text-wrapping-and-filling6129773 +Ref: 1db16129773 +Ref: library/textwrap textwrap wrap6130305 +Ref: 12ad6130305 +Ref: library/textwrap textwrap fill6131042 +Ref: 12ae6131042 +Ref: library/textwrap textwrap shorten6131674 +Ref: c726131674 +Ref: library/textwrap textwrap dedent6132918 +Ref: 1db76132918 +Ref: library/textwrap textwrap indent6133854 +Ref: e056133854 +Ref: library/textwrap textwrap TextWrapper6135190 +Ref: c6f6135190 +Ref: library/textwrap textwrap TextWrapper width6135866 +Ref: 1db96135866 +Ref: library/textwrap textwrap TextWrapper expand_tabs6136188 +Ref: 1db46136188 +Ref: library/textwrap textwrap TextWrapper tabsize6136391 +Ref: 1db36136391 +Ref: library/textwrap textwrap TextWrapper replace_whitespace6136679 +Ref: 1db66136679 +Ref: library/textwrap textwrap TextWrapper drop_whitespace6137642 +Ref: 1db56137642 +Ref: library/textwrap textwrap TextWrapper initial_indent6138056 +Ref: 1dba6138056 +Ref: library/textwrap textwrap TextWrapper subsequent_indent6138291 +Ref: 1dbb6138291 +Ref: library/textwrap textwrap TextWrapper fix_sentence_endings6138518 +Ref: 1dbc6138518 +Ref: library/textwrap textwrap TextWrapper break_long_words6139739 +Ref: 1db86139739 +Ref: library/textwrap textwrap TextWrapper break_on_hyphens6140229 +Ref: 1dbd6140229 +Ref: library/textwrap textwrap TextWrapper max_lines6140761 +Ref: c706140761 +Ref: library/textwrap textwrap TextWrapper placeholder6141006 +Ref: c716141006 +Ref: library/textwrap textwrap TextWrapper wrap6141320 +Ref: 1db26141320 +Ref: library/textwrap textwrap TextWrapper fill6141742 +Ref: 1dbe6141742 +Ref: textwrap — Text wrapping and filling-Footnote-16141929 +Node: unicodedata — Unicode Database6141997 +Ref: library/unicodedata doc6142188 +Ref: 1dbf6142188 +Ref: library/unicodedata module-unicodedata6142188 +Ref: 1246142188 +Ref: library/unicodedata unicodedata-unicode-database6142188 +Ref: 1dc06142188 +Ref: library/unicodedata unicodedata lookup6142710 +Ref: d286142710 +Ref: library/unicodedata unicodedata name6143027 +Ref: 1dc16143027 +Ref: library/unicodedata unicodedata decimal6143253 +Ref: 1dc26143253 +Ref: library/unicodedata unicodedata digit6143496 +Ref: 1dc36143496 +Ref: library/unicodedata unicodedata numeric6143734 +Ref: f1e6143734 +Ref: library/unicodedata unicodedata category6143974 +Ref: 1dc46143974 +Ref: library/unicodedata unicodedata bidirectional6144099 +Ref: 1dc56144099 +Ref: library/unicodedata unicodedata combining6144291 +Ref: 1dc66144291 +Ref: library/unicodedata unicodedata east_asian_width6144478 +Ref: 1dc76144478 +Ref: library/unicodedata unicodedata mirrored6144611 +Ref: 1dc86144611 +Ref: library/unicodedata unicodedata decomposition6144869 +Ref: 1dc96144869 +Ref: library/unicodedata unicodedata normalize6145084 +Ref: 29e6145084 +Ref: library/unicodedata unicodedata is_normalized6146946 +Ref: 6986146946 +Ref: library/unicodedata unicodedata unidata_version6147253 +Ref: 1dca6147253 +Ref: library/unicodedata unicodedata ucd_3_2_06147355 +Ref: 109b6147355 +Ref: unicodedata — Unicode Database-Footnote-16148134 +Ref: unicodedata — Unicode Database-Footnote-26148184 +Ref: unicodedata — Unicode Database-Footnote-36148230 +Ref: unicodedata — Unicode Database-Footnote-46148302 +Node: stringprep — Internet String Preparation6148377 +Ref: library/stringprep doc6148565 +Ref: 1dcb6148565 +Ref: library/stringprep module-stringprep6148565 +Ref: f46148565 +Ref: library/stringprep stringprep-internet-string-preparation6148565 +Ref: 1dcc6148565 +Ref: library/stringprep stringprep in_table_a16150487 +Ref: 1dcd6150487 +Ref: library/stringprep stringprep in_table_b16150624 +Ref: 1dce6150624 +Ref: library/stringprep stringprep map_table_b26150750 +Ref: 1dcf6150750 +Ref: library/stringprep stringprep map_table_b36150907 +Ref: 1dd06150907 +Ref: library/stringprep stringprep in_table_c116151076 +Ref: 1dd16151076 +Ref: library/stringprep stringprep in_table_c126151196 +Ref: 1dd26151196 +Ref: library/stringprep stringprep in_table_c11_c126151325 +Ref: 1dd36151325 +Ref: library/stringprep stringprep in_table_c216151472 +Ref: 1dd46151472 +Ref: library/stringprep stringprep in_table_c226151599 +Ref: 1dd56151599 +Ref: library/stringprep stringprep in_table_c21_c226151730 +Ref: 1dd66151730 +Ref: library/stringprep stringprep in_table_c36151879 +Ref: 1dd76151879 +Ref: library/stringprep stringprep in_table_c46151985 +Ref: 1dd86151985 +Ref: library/stringprep stringprep in_table_c56152110 +Ref: 1dd96152110 +Ref: library/stringprep stringprep in_table_c66152220 +Ref: 1dda6152220 +Ref: library/stringprep stringprep in_table_c76152348 +Ref: 1ddb6152348 +Ref: library/stringprep stringprep in_table_c86152490 +Ref: 1ddc6152490 +Ref: library/stringprep stringprep in_table_c96152633 +Ref: 1ddd6152633 +Ref: library/stringprep stringprep in_table_d16152746 +Ref: 1dde6152746 +Ref: library/stringprep stringprep in_table_d26152904 +Ref: 1ddf6152904 +Ref: stringprep — Internet String Preparation-Footnote-16153086 +Ref: stringprep — Internet String Preparation-Footnote-26153156 +Ref: stringprep — Internet String Preparation-Footnote-36153215 +Node: readline — GNU readline interface6153274 +Ref: library/readline doc6153482 +Ref: 1de06153482 +Ref: library/readline module-readline6153482 +Ref: db6153482 +Ref: library/readline readline-gnu-readline-interface6153482 +Ref: 1de16153482 +Ref: readline — GNU readline interface-Footnote-16155403 +Node: Init file6155473 +Ref: library/readline init-file6155574 +Ref: 1de26155574 +Ref: library/readline readline parse_and_bind6155684 +Ref: 1de36155684 +Ref: library/readline readline read_init_file6155865 +Ref: 1de46155865 +Node: Line buffer6156087 +Ref: library/readline line-buffer6156209 +Ref: 1de56156209 +Ref: library/readline readline get_line_buffer6156303 +Ref: 1de66156303 +Ref: library/readline readline insert_text6156454 +Ref: 1de76156454 +Ref: library/readline readline redisplay6156664 +Ref: 1de86156664 +Node: History file6156869 +Ref: library/readline history-file6156994 +Ref: 1de96156994 +Ref: library/readline readline read_history_file6157089 +Ref: 1dea6157089 +Ref: library/readline readline write_history_file6157327 +Ref: 1deb6157327 +Ref: library/readline readline append_history_file6157584 +Ref: ad86157584 +Ref: library/readline readline get_history_length6157991 +Ref: 1dec6157991 +Ref: library/readline readline set_history_length6158036 +Ref: 1ded6158036 +Node: History list6158399 +Ref: library/readline history-list6158526 +Ref: 1dee6158526 +Ref: library/readline readline clear_history6158628 +Ref: 1def6158628 +Ref: library/readline readline get_current_history_length6158876 +Ref: 1df06158876 +Ref: library/readline readline get_history_item6159141 +Ref: 1df16159141 +Ref: library/readline readline remove_history_item6159351 +Ref: 1df26159351 +Ref: library/readline readline replace_history_item6159571 +Ref: 1df36159571 +Ref: library/readline readline add_history6159802 +Ref: 1df46159802 +Ref: library/readline readline set_auto_history6159986 +Ref: 9386159986 +Node: Startup hooks6160452 +Ref: library/readline startup-hooks6160577 +Ref: 1df56160577 +Ref: library/readline readline set_startup_hook6160622 +Ref: 1df66160622 +Ref: library/readline readline set_pre_input_hook6161026 +Ref: 1df76161026 +Node: Completion6161598 +Ref: library/readline completion6161718 +Ref: 1df86161718 +Ref: library/readline readline set_completer6162204 +Ref: 1df96162204 +Ref: library/readline readline get_completer6162995 +Ref: 1dfa6162995 +Ref: library/readline readline get_completion_type6163128 +Ref: 1dfb6163128 +Ref: library/readline readline get_begidx6163328 +Ref: 12ee6163328 +Ref: library/readline readline get_endidx6163365 +Ref: 12ef6163365 +Ref: library/readline readline set_completer_delims6163810 +Ref: 1dfc6163810 +Ref: library/readline readline get_completer_delims6163863 +Ref: 1dfd6163863 +Ref: library/readline readline set_completion_display_matches_hook6164184 +Ref: 1dfe6164184 +Node: Example6164773 +Ref: library/readline example6164871 +Ref: 1dff6164871 +Ref: library/readline readline-example6164871 +Ref: 1e006164871 +Node: rlcompleter — Completion function for GNU readline6167511 +Ref: library/rlcompleter doc6167668 +Ref: 1e026167668 +Ref: library/rlcompleter module-rlcompleter6167668 +Ref: de6167668 +Ref: library/rlcompleter rlcompleter-completion-function-for-gnu-readline6167668 +Ref: 1e036167668 +Ref: rlcompleter — Completion function for GNU readline-Footnote-16169133 +Node: Completer Objects6169204 +Ref: library/rlcompleter completer-objects6169310 +Ref: 1e046169310 +Ref: library/rlcompleter id16169310 +Ref: 1e056169310 +Ref: library/rlcompleter rlcompleter Completer complete6169409 +Ref: 1e066169409 +Node: Binary Data Services6170159 +Ref: library/binary doc6170295 +Ref: 1e076170295 +Ref: library/binary binary-data-services6170295 +Ref: 1e086170295 +Ref: library/binary binaryservices6170295 +Ref: 1d176170295 +Node: struct — Interpret bytes as packed binary data6171061 +Ref: library/struct doc6171217 +Ref: 1e096171217 +Ref: library/struct module-struct6171217 +Ref: f56171217 +Ref: library/struct struct-interpret-bytes-as-packed-binary-data6171217 +Ref: 1e0a6171217 +Ref: struct — Interpret bytes as packed binary data-Footnote-16173024 +Node: Functions and Exceptions6173090 +Ref: library/struct functions-and-exceptions6173222 +Ref: 1e0e6173222 +Ref: library/struct struct error6173348 +Ref: fbf6173348 +Ref: library/struct struct pack6173474 +Ref: f2f6173474 +Ref: library/struct struct pack_into6173716 +Ref: 1e0f6173716 +Ref: library/struct struct unpack6174015 +Ref: 17316174015 +Ref: library/struct struct unpack_from6174382 +Ref: 1e106174382 +Ref: library/struct struct iter_unpack6174778 +Ref: c5d6174778 +Ref: library/struct struct calcsize6175298 +Ref: 13e56175298 +Node: Format Strings6175497 +Ref: library/struct format-strings6175648 +Ref: 1e116175648 +Ref: library/struct struct-format-strings6175648 +Ref: 1e0b6175648 +Node: Byte Order Size and Alignment6176137 +Ref: library/struct byte-order-size-and-alignment6176243 +Ref: 1e136176243 +Ref: library/struct struct-alignment6176243 +Ref: 1e0c6176243 +Ref: Byte Order Size and Alignment-Footnote-16179481 +Node: Format Characters6179525 +Ref: library/struct format-characters6179651 +Ref: 1e126179651 +Ref: library/struct id16179651 +Ref: 1e156179651 +Ref: Format Characters-Footnote-16190533 +Ref: Format Characters-Footnote-26190594 +Node: Examples<2>6190670 +Ref: library/struct examples6190758 +Ref: 1e166190758 +Ref: library/struct struct-examples6190758 +Ref: 1e146190758 +Node: Classes<2>6192471 +Ref: library/struct classes6192589 +Ref: 1e176192589 +Ref: library/struct struct-objects6192589 +Ref: 1e186192589 +Ref: library/struct struct Struct6192685 +Ref: 1e0d6192685 +Ref: library/struct struct Struct pack6193427 +Ref: 1e196193427 +Ref: library/struct struct Struct pack_into6193608 +Ref: 1e1b6193608 +Ref: library/struct struct Struct unpack6193766 +Ref: 1e1c6193766 +Ref: library/struct struct Struct unpack_from6193966 +Ref: 1e1d6193966 +Ref: library/struct struct Struct iter_unpack6194224 +Ref: c5e6194224 +Ref: library/struct struct Struct format6194475 +Ref: 8706194475 +Ref: library/struct struct Struct size6194690 +Ref: 1e1a6194690 +Node: codecs — Codec registry and base classes6194891 +Ref: library/codecs doc6195047 +Ref: 1e1e6195047 +Ref: library/codecs codecs-codec-registry-and-base-classes6195047 +Ref: 1e1f6195047 +Ref: library/codecs ietf-rfc-17006195047 +Ref: 1e206195047 +Ref: library/codecs module-codecs6195047 +Ref: 1a6195047 +Ref: library/codecs codecs encode6195939 +Ref: b926195939 +Ref: library/codecs codecs decode6196434 +Ref: b936196434 +Ref: library/codecs codecs lookup6196994 +Ref: 5b56196994 +Ref: library/codecs codecs CodecInfo6197492 +Ref: 1e226197492 +Ref: library/codecs codecs CodecInfo name6197788 +Ref: 1e236197788 +Ref: library/codecs codecs CodecInfo encode6197851 +Ref: 1e246197851 +Ref: library/codecs codecs CodecInfo decode6197878 +Ref: 1e256197878 +Ref: library/codecs codecs CodecInfo incrementalencoder6198256 +Ref: 1e296198256 +Ref: library/codecs codecs CodecInfo incrementaldecoder6198295 +Ref: 1e2a6198295 +Ref: library/codecs codecs CodecInfo streamwriter6198634 +Ref: 1e2d6198634 +Ref: library/codecs codecs CodecInfo streamreader6198667 +Ref: 1e2e6198667 +Ref: library/codecs codecs getencoder6199120 +Ref: 1e316199120 +Ref: library/codecs codecs getdecoder6199332 +Ref: 1e326199332 +Ref: library/codecs codecs getincrementalencoder6199544 +Ref: 1e336199544 +Ref: library/codecs codecs getincrementaldecoder6199850 +Ref: 1e346199850 +Ref: library/codecs codecs getreader6200156 +Ref: 1e356200156 +Ref: library/codecs codecs getwriter6200402 +Ref: 1e366200402 +Ref: library/codecs codecs register6200731 +Ref: 1e376200731 +Ref: library/codecs codecs unregister6201206 +Ref: 3da6201206 +Ref: library/codecs codecs open6201702 +Ref: 30d6201702 +Ref: library/codecs codecs EncodedFile6203024 +Ref: 1e396203024 +Ref: library/codecs codecs iterencode6203881 +Ref: 1e3a6203881 +Ref: library/codecs codecs iterdecode6204411 +Ref: 1e3b6204411 +Ref: library/codecs codecs BOM6205133 +Ref: 1e3c6205133 +Ref: library/codecs codecs BOM_BE6205154 +Ref: 1e3d6205154 +Ref: library/codecs codecs BOM_LE6205178 +Ref: 1e3e6205178 +Ref: library/codecs codecs BOM_UTF86205202 +Ref: 1e3f6205202 +Ref: library/codecs codecs BOM_UTF166205228 +Ref: 1e406205228 +Ref: library/codecs codecs BOM_UTF16_BE6205255 +Ref: 1e416205255 +Ref: library/codecs codecs BOM_UTF16_LE6205285 +Ref: 1e426205285 +Ref: library/codecs codecs BOM_UTF326205315 +Ref: 1e436205315 +Ref: library/codecs codecs BOM_UTF32_BE6205342 +Ref: 1e446205342 +Ref: library/codecs codecs BOM_UTF32_LE6205372 +Ref: 1e456205372 +Ref: codecs — Codec registry and base classes-Footnote-16206519 +Node: Codec Base Classes6206585 +Ref: library/codecs codec-base-classes6206712 +Ref: 1e216206712 +Ref: library/codecs id16206712 +Ref: 1e466206712 +Ref: library/codecs surrogateescape6207305 +Ref: 1e476207305 +Node: Error Handlers6207442 +Ref: library/codecs error-handlers6207551 +Ref: 11d66207551 +Ref: library/codecs id26207551 +Ref: 1e486207551 +Ref: library/codecs codecs register_error6212464 +Ref: 10f26212464 +Ref: library/codecs codecs lookup_error6214006 +Ref: 10f36214006 +Ref: library/codecs codecs strict_errors6214301 +Ref: 1e496214301 +Ref: library/codecs codecs ignore_errors6214473 +Ref: 1e4a6214473 +Ref: library/codecs codecs replace_errors6214669 +Ref: 1e4b6214669 +Ref: library/codecs codecs backslashreplace_errors6214919 +Ref: 1e4c6214919 +Ref: library/codecs codecs xmlcharrefreplace_errors6215381 +Ref: 1e4d6215381 +Ref: library/codecs codecs namereplace_errors6215745 +Ref: 1e4e6215745 +Ref: Error Handlers-Footnote-16216306 +Node: Stateless Encoding and Decoding6216348 +Ref: library/codecs codec-objects6216499 +Ref: 1e286216499 +Ref: library/codecs stateless-encoding-and-decoding6216499 +Ref: 1e4f6216499 +Ref: library/codecs codecs Codec encode6216710 +Ref: 1e266216710 +Ref: library/codecs codecs Codec decode6217459 +Ref: 1e276217459 +Node: Incremental Encoding and Decoding6218393 +Ref: library/codecs incremental-encoding-and-decoding6218558 +Ref: 1e506218558 +Node: IncrementalEncoder Objects6219398 +Ref: library/codecs incremental-encoder-objects6219529 +Ref: 1e536219529 +Ref: library/codecs incrementalencoder-objects6219529 +Ref: 1e546219529 +Ref: library/codecs codecs IncrementalEncoder6219828 +Ref: 1e2b6219828 +Ref: library/codecs codecs IncrementalEncoder encode6220613 +Ref: 1e516220613 +Ref: library/codecs codecs IncrementalEncoder reset6220910 +Ref: 1e556220910 +Ref: library/codecs codecs IncrementalEncoder getstate6221179 +Ref: 1e566221179 +Ref: library/codecs codecs IncrementalEncoder setstate6221592 +Ref: 1e576221592 +Node: IncrementalDecoder Objects6221759 +Ref: library/codecs incremental-decoder-objects6221890 +Ref: 1e586221890 +Ref: library/codecs incrementaldecoder-objects6221890 +Ref: 1e596221890 +Ref: library/codecs codecs IncrementalDecoder6222189 +Ref: 1e2c6222189 +Ref: library/codecs codecs IncrementalDecoder decode6222974 +Ref: 1e526222974 +Ref: library/codecs codecs IncrementalDecoder reset6223607 +Ref: 1e5a6223607 +Ref: library/codecs codecs IncrementalDecoder getstate6223685 +Ref: 1e5b6223685 +Ref: library/codecs codecs IncrementalDecoder setstate6224632 +Ref: 1e5c6224632 +Node: Stream Encoding and Decoding6224798 +Ref: library/codecs stream-encoding-and-decoding6224923 +Ref: 1e5d6224923 +Node: StreamWriter Objects6225350 +Ref: library/codecs stream-writer-objects6225464 +Ref: 1e5e6225464 +Ref: library/codecs streamwriter-objects6225464 +Ref: 1e5f6225464 +Ref: library/codecs codecs StreamWriter6225719 +Ref: 1e2f6225719 +Ref: library/codecs codecs StreamWriter write6226676 +Ref: 1e606226676 +Ref: library/codecs codecs StreamWriter writelines6226774 +Ref: 1e616226774 +Ref: library/codecs codecs StreamWriter reset6227080 +Ref: 1e626227080 +Node: StreamReader Objects6227549 +Ref: library/codecs stream-reader-objects6227698 +Ref: 1e636227698 +Ref: library/codecs streamreader-objects6227698 +Ref: 1e646227698 +Ref: library/codecs codecs StreamReader6227953 +Ref: 1e306227953 +Ref: library/codecs codecs StreamReader read6229024 +Ref: 1e656229024 +Ref: library/codecs codecs StreamReader readline6230284 +Ref: 1e666230284 +Ref: library/codecs codecs StreamReader readlines6230635 +Ref: 1e676230635 +Ref: library/codecs codecs StreamReader reset6231086 +Ref: 1e686231086 +Node: StreamReaderWriter Objects6231489 +Ref: library/codecs stream-reader-writer6231639 +Ref: 1e696231639 +Ref: library/codecs streamreaderwriter-objects6231639 +Ref: 1e6a6231639 +Ref: library/codecs codecs StreamReaderWriter6231974 +Ref: 1e386231974 +Node: StreamRecoder Objects6232629 +Ref: library/codecs stream-recoder-objects6232750 +Ref: 1e6b6232750 +Ref: library/codecs streamrecoder-objects6232750 +Ref: 1e6c6232750 +Ref: library/codecs codecs StreamRecoder6233100 +Ref: 14216233100 +Node: Encodings and Unicode6234231 +Ref: library/codecs encodings-and-unicode6234385 +Ref: 1e6d6234385 +Ref: library/codecs encodings-overview6234385 +Ref: 1e6e6234385 +Ref: Encodings and Unicode-Footnote-16241080 +Node: Standard Encodings6241122 +Ref: library/codecs id36241283 +Ref: 1e6f6241283 +Ref: library/codecs standard-encodings6241283 +Ref: a386241283 +Node: Python Specific Encodings6263330 +Ref: library/codecs python-specific-encodings6263535 +Ref: 1e706263535 +Node: Text Encodings6264123 +Ref: library/codecs text-encodings6264225 +Ref: 1e716264225 +Ref: Text Encodings-Footnote-16267597 +Ref: Text Encodings-Footnote-26267656 +Node: Binary Transforms6267715 +Ref: library/codecs binary-transforms6267841 +Ref: b946267841 +Ref: library/codecs id46267841 +Ref: 1e726267841 +Ref: Binary Transforms-Footnote-16271644 +Node: Text Transforms6271785 +Ref: library/codecs id66271888 +Ref: 1e796271888 +Ref: library/codecs text-transforms6271888 +Ref: b956271888 +Node: encodings idna — Internationalized Domain Names in Applications6272632 +Ref: library/codecs encodings-idna-internationalized-domain-names-in-applications6272859 +Ref: 1e7a6272859 +Ref: library/codecs module-encodings idna6272859 +Ref: 726272859 +Ref: library/codecs encodings idna nameprep6275474 +Ref: 1e7b6275474 +Ref: library/codecs encodings idna ToASCII6275662 +Ref: 1e7c6275662 +Ref: library/codecs encodings idna ToUnicode6275822 +Ref: 1e7d6275822 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-16275969 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-26276028 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-36276087 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-46276146 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-56276205 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-66276244 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-76276315 +Ref: encodings idna — Internationalized Domain Names in Applications-Footnote-86276374 +Node: encodings mbcs — Windows ANSI codepage6276433 +Ref: library/codecs encodings-mbcs-windows-ansi-codepage6276689 +Ref: 1e7e6276689 +Ref: library/codecs module-encodings mbcs6276689 +Ref: 736276689 +Node: encodings utf_8_sig — UTF-8 codec with BOM signature6277082 +Ref: library/codecs encodings-utf-8-sig-utf-8-codec-with-bom-signature6277264 +Ref: 1e7f6277264 +Ref: library/codecs module-encodings utf_8_sig6277264 +Ref: 746277264 +Node: Data Types6277709 +Ref: library/datatypes doc6277853 +Ref: 1e806277853 +Ref: library/datatypes data-types6277853 +Ref: 1e816277853 +Ref: library/datatypes datatypes6277853 +Ref: 1e826277853 +Node: datetime — Basic date and time types6279232 +Ref: library/datetime doc6279361 +Ref: 1e836279361 +Ref: library/datetime datetime-basic-date-and-time-types6279361 +Ref: 1e846279361 +Ref: library/datetime module-datetime6279361 +Ref: 2f6279361 +Ref: datetime — Basic date and time types-Footnote-16280432 +Ref: datetime — Basic date and time types-Footnote-26280500 +Node: Aware and Naive Objects6280551 +Ref: library/datetime aware-and-naive-objects6280667 +Ref: 1e856280667 +Ref: library/datetime datetime-naive-aware6280667 +Ref: 1e866280667 +Ref: Aware and Naive Objects-Footnote-16282593 +Node: Constants6282650 +Ref: library/datetime constants6282790 +Ref: 1e876282790 +Ref: library/datetime datetime MINYEAR6282892 +Ref: 1e886282892 +Ref: library/datetime datetime MAXYEAR6283052 +Ref: 1e896283052 +Ref: library/datetime datetime UTC6283214 +Ref: 1eb6283214 +Node: Available Types6283352 +Ref: library/datetime available-types6283486 +Ref: 1e8a6283486 +Node: Common Properties6285268 +Ref: library/datetime common-properties6285388 +Ref: 1e9b6285388 +Node: Determining if an Object is Aware or Naive6285798 +Ref: library/datetime determining-if-an-object-is-aware-or-naive6285918 +Ref: 1e9c6285918 +Node: timedelta Objects6286653 +Ref: library/datetime datetime-timedelta6286790 +Ref: 1e9d6286790 +Ref: library/datetime timedelta-objects6286790 +Ref: 1e9e6286790 +Ref: library/datetime datetime timedelta6286949 +Ref: 60f6286949 +Ref: library/datetime datetime timedelta min6289201 +Ref: 1e9f6289201 +Ref: library/datetime datetime timedelta max6289319 +Ref: 1ea06289319 +Ref: library/datetime datetime timedelta resolution6289501 +Ref: 1ea16289501 +Ref: library/datetime datetime timedelta total_seconds6296904 +Ref: faa6296904 +Node: Examples of usage timedelta6297426 +Ref: library/datetime examples-of-usage-timedelta6297507 +Ref: 1ea26297507 +Node: date Objects6298448 +Ref: library/datetime date-objects6298586 +Ref: 1ea36298586 +Ref: library/datetime datetime-date6298586 +Ref: 1ea46298586 +Ref: library/datetime datetime date6298908 +Ref: 5366298908 +Ref: library/datetime datetime date today6299327 +Ref: 1ea56299327 +Ref: library/datetime datetime date fromtimestamp6299470 +Ref: 1ea66299470 +Ref: library/datetime datetime date fromordinal6300408 +Ref: 1ea76300408 +Ref: library/datetime datetime date fromisoformat6300741 +Ref: 1ed6300741 +Ref: library/datetime datetime date fromisocalendar6301370 +Ref: 62f6301370 +Ref: library/datetime datetime date min6301661 +Ref: 1ea86301661 +Ref: library/datetime datetime date max6301752 +Ref: 1ea96301752 +Ref: library/datetime datetime date resolution6301843 +Ref: 1eaa6301843 +Ref: library/datetime datetime date year6302010 +Ref: 1e8b6302010 +Ref: library/datetime datetime date month6302107 +Ref: 1e8c6302107 +Ref: library/datetime datetime date day6302168 +Ref: 1e8d6302168 +Ref: library/datetime datetime date replace6304656 +Ref: 1eab6304656 +Ref: library/datetime datetime date timetuple6305041 +Ref: 1eac6305041 +Ref: library/datetime datetime date toordinal6305536 +Ref: 1ead6305536 +Ref: library/datetime datetime date weekday6305758 +Ref: 1eae6305758 +Ref: library/datetime datetime date isoweekday6305983 +Ref: 1eaf6305983 +Ref: library/datetime datetime date isocalendar6306242 +Ref: 5356306242 +Ref: library/datetime datetime date isoformat6307317 +Ref: 1eb06307317 +Ref: library/datetime datetime date __str__6307543 +Ref: 1eb16307543 +Ref: library/datetime datetime date ctime6307645 +Ref: 1eb26307645 +Ref: library/datetime datetime date strftime6308119 +Ref: 9026308119 +Ref: library/datetime datetime date __format__6308427 +Ref: 1eb56308427 +Ref: date Objects-Footnote-16308885 +Ref: date Objects-Footnote-26309194 +Node: Examples of Usage date6309410 +Ref: library/datetime examples-of-usage-date6309481 +Ref: 1eb66309481 +Node: datetime Objects6311373 +Ref: library/datetime datetime-datetime6311506 +Ref: 1eb76311506 +Ref: library/datetime datetime-objects6311506 +Ref: 1eb86311506 +Ref: library/datetime datetime datetime6311955 +Ref: 4be6311955 +Ref: library/datetime datetime datetime today6312818 +Ref: 1eb96312818 +Ref: library/datetime datetime datetime now6313176 +Ref: 14536313176 +Ref: library/datetime datetime datetime utcnow6313857 +Ref: 1eba6313857 +Ref: library/datetime datetime datetime fromtimestamp6314600 +Ref: 11d06314600 +Ref: library/datetime datetime datetime utcfromtimestamp6316319 +Ref: 11cd6316319 +Ref: library/datetime datetime datetime fromordinal6317991 +Ref: 1ebb6317991 +Ref: library/datetime datetime datetime combine6318396 +Ref: 9036318396 +Ref: library/datetime datetime datetime fromisoformat6319185 +Ref: 1ef6319185 +Ref: library/datetime datetime datetime fromisocalendar6321061 +Ref: 6306321061 +Ref: library/datetime datetime datetime strptime6321439 +Ref: 12dd6321439 +Ref: library/datetime datetime datetime min6322005 +Ref: 11ce6322005 +Ref: library/datetime datetime datetime max6322137 +Ref: 1ebc6322137 +Ref: library/datetime datetime datetime resolution6322289 +Ref: 1ebd6322289 +Ref: library/datetime datetime datetime year6322484 +Ref: 1e936322484 +Ref: library/datetime datetime datetime month6322585 +Ref: 1e946322585 +Ref: library/datetime datetime datetime day6322650 +Ref: 1e956322650 +Ref: library/datetime datetime datetime hour6322761 +Ref: 1e966322761 +Ref: library/datetime datetime datetime minute6322817 +Ref: 1e976322817 +Ref: library/datetime datetime datetime second6322875 +Ref: 1e986322875 +Ref: library/datetime datetime datetime microsecond6322933 +Ref: 1e996322933 +Ref: library/datetime datetime datetime tzinfo6323001 +Ref: 1e9a6323001 +Ref: library/datetime datetime datetime fold6323162 +Ref: 8c66323162 +Ref: library/datetime datetime datetime date6327793 +Ref: 1ebe6327793 +Ref: library/datetime datetime datetime time6327891 +Ref: 1ebf6327891 +Ref: library/datetime datetime datetime timetz6328198 +Ref: 1ec06328198 +Ref: library/datetime datetime datetime replace6328488 +Ref: 1ec16328488 +Ref: library/datetime datetime datetime astimezone6329070 +Ref: 6106329070 +Ref: library/datetime datetime datetime utcoffset6331402 +Ref: 1ec26331402 +Ref: library/datetime datetime datetime dst6331796 +Ref: 1ec36331796 +Ref: library/datetime datetime datetime tzname6332178 +Ref: 1ec56332178 +Ref: library/datetime datetime datetime timetuple6332411 +Ref: 1ec66332411 +Ref: library/datetime datetime datetime utctimetuple6333265 +Ref: 1ec76333265 +Ref: library/datetime datetime datetime toordinal6334392 +Ref: 1ec86334392 +Ref: library/datetime datetime datetime timestamp6334534 +Ref: d4b6334534 +Ref: library/datetime datetime datetime weekday6336042 +Ref: 1ec96336042 +Ref: library/datetime datetime datetime isoweekday6336246 +Ref: 1eca6336246 +Ref: library/datetime datetime datetime isocalendar6336479 +Ref: 5376336479 +Ref: library/datetime datetime datetime isoformat6336671 +Ref: 7866336671 +Ref: library/datetime datetime datetime __str__6339655 +Ref: 1ecb6339655 +Ref: library/datetime datetime datetime ctime6339794 +Ref: 1ecc6339794 +Ref: library/datetime datetime datetime strftime6340427 +Ref: 9016340427 +Ref: library/datetime datetime datetime __format__6340671 +Ref: 1ecd6340671 +Node: Examples of Usage datetime6341113 +Ref: library/datetime examples-of-usage-datetime6341192 +Ref: 1ece6341192 +Node: time Objects6345520 +Ref: library/datetime datetime-time6345655 +Ref: 1ecf6345655 +Ref: library/datetime time-objects6345655 +Ref: 1ed06345655 +Ref: library/datetime datetime time6345863 +Ref: 4bf6345863 +Ref: library/datetime datetime time min6346528 +Ref: 1ed16346528 +Ref: library/datetime datetime time max6346627 +Ref: 1ed26346627 +Ref: library/datetime datetime time resolution6346737 +Ref: 1ed36346737 +Ref: library/datetime datetime time hour6347005 +Ref: 1e8e6347005 +Ref: library/datetime datetime time minute6347057 +Ref: 1e8f6347057 +Ref: library/datetime datetime time second6347111 +Ref: 1e906347111 +Ref: library/datetime datetime time microsecond6347165 +Ref: 1e916347165 +Ref: library/datetime datetime time tzinfo6347229 +Ref: 1e926347229 +Ref: library/datetime datetime time fold6347380 +Ref: 1ed46347380 +Ref: library/datetime datetime time fromisoformat6349355 +Ref: 1ee6349355 +Ref: library/datetime datetime time replace6350939 +Ref: 1ed66350939 +Ref: library/datetime datetime time isoformat6351473 +Ref: 1ed56351473 +Ref: library/datetime datetime time __str__6353484 +Ref: 1ed86353484 +Ref: library/datetime datetime time strftime6353586 +Ref: 1ed96353586 +Ref: library/datetime datetime time __format__6353817 +Ref: 1eda6353817 +Ref: library/datetime datetime time utcoffset6354179 +Ref: 1ed76354179 +Ref: library/datetime datetime time dst6354569 +Ref: 1edb6354569 +Ref: library/datetime datetime time tzname6354948 +Ref: 1edc6354948 +Ref: time Objects-Footnote-16355277 +Node: Examples of Usage time6355342 +Ref: library/datetime examples-of-usage-time6355413 +Ref: 1edd6355413 +Node: tzinfo Objects6356295 +Ref: library/datetime datetime-tzinfo6356430 +Ref: 1ede6356430 +Ref: library/datetime tzinfo-objects6356430 +Ref: 1edf6356430 +Ref: library/datetime datetime tzinfo6356487 +Ref: 1ab6356487 +Ref: library/datetime datetime tzinfo utcoffset6358123 +Ref: 1ee06358123 +Ref: library/datetime datetime tzinfo dst6359353 +Ref: 1ee16359353 +Ref: library/datetime datetime tzinfo tzname6361935 +Ref: 1ee26361935 +Ref: library/datetime datetime tzinfo fromutc6364074 +Ref: 1ec46364074 +Ref: tzinfo Objects-Footnote-16376609 +Node: timezone Objects6376649 +Ref: library/datetime datetime-timezone6376802 +Ref: 1ee36376802 +Ref: library/datetime timezone-objects6376802 +Ref: 1ee46376802 +Ref: library/datetime datetime timezone6377222 +Ref: d6a6377222 +Ref: library/datetime datetime timezone utcoffset6377850 +Ref: 1ee56377850 +Ref: library/datetime datetime timezone tzname6378240 +Ref: 1ee66378240 +Ref: library/datetime datetime timezone dst6378918 +Ref: 1ee76378918 +Ref: library/datetime datetime timezone fromutc6378982 +Ref: 1ee86378982 +Ref: library/datetime datetime timezone utc6379177 +Ref: 1ec6379177 +Node: strftime and strptime Behavior6379260 +Ref: library/datetime strftime-and-strptime-behavior6379390 +Ref: 1ee96379390 +Ref: library/datetime strftime-strptime-behavior6379390 +Ref: 1eb46379390 +Node: strftime and strptime Format Codes6381576 +Ref: library/datetime strftime-and-strptime-format-codes6381702 +Ref: 1eea6381702 +Node: Technical Detail6391821 +Ref: library/datetime technical-detail6391947 +Ref: 1eeb6391947 +Ref: Technical Detail-Footnote-16398034 +Node: zoneinfo — IANA time zone support6398140 +Ref: library/zoneinfo doc6398325 +Ref: 1eec6398325 +Ref: library/zoneinfo module-zoneinfo6398325 +Ref: 1506398325 +Ref: library/zoneinfo zoneinfo-iana-time-zone-support6398325 +Ref: 1eed6398325 +Ref: zoneinfo — IANA time zone support-Footnote-16399594 +Ref: zoneinfo — IANA time zone support-Footnote-26399636 +Ref: zoneinfo — IANA time zone support-Footnote-36399677 +Node: Using ZoneInfo6399718 +Ref: library/zoneinfo using-zoneinfo6399825 +Ref: 1eee6399825 +Ref: Using ZoneInfo-Footnote-16401773 +Node: Data sources6401815 +Ref: library/zoneinfo data-sources6401949 +Ref: 1eef6401949 +Ref: Data sources-Footnote-16402633 +Node: Configuring the data sources6402674 +Ref: library/zoneinfo configuring-the-data-sources6402751 +Ref: 1ef16402751 +Ref: library/zoneinfo zoneinfo-data-configuration6402751 +Ref: 1ef26402751 +Node: Compile-time configuration6403504 +Ref: library/zoneinfo compile-time-configuration6403629 +Ref: 1ef66403629 +Ref: library/zoneinfo zoneinfo-data-compile-time-config6403629 +Ref: 17b16403629 +Node: Environment configuration6404365 +Ref: library/zoneinfo environment-configuration6404520 +Ref: 1ef76404520 +Ref: library/zoneinfo zoneinfo-data-environment-var6404520 +Ref: 1ef36404520 +Ref: library/zoneinfo envvar-PYTHONTZPATH6404839 +Ref: 1ef86404839 +Node: Runtime configuration6405500 +Ref: library/zoneinfo runtime-configuration6405620 +Ref: 1efa6405620 +Ref: library/zoneinfo zoneinfo-data-runtime-config6405620 +Ref: 1ef46405620 +Node: The ZoneInfo class6405988 +Ref: library/zoneinfo the-zoneinfo-class6406120 +Ref: 1efb6406120 +Ref: library/zoneinfo zoneinfo ZoneInfo6406183 +Ref: 51d6406183 +Ref: library/zoneinfo zoneinfo ZoneInfo from_file6407063 +Ref: 1efd6407063 +Ref: library/zoneinfo zoneinfo ZoneInfo no_cache6407592 +Ref: 1eff6407592 +Ref: library/zoneinfo zoneinfo ZoneInfo clear_cache6408314 +Ref: 1efc6408314 +Ref: library/zoneinfo zoneinfo ZoneInfo key6409124 +Ref: 1f006409124 +Node: String representations6409980 +Ref: library/zoneinfo string-representations6410086 +Ref: 1f026410086 +Node: Pickle serialization6410895 +Ref: library/zoneinfo pickle-serialization6411001 +Ref: 1f036411001 +Ref: library/zoneinfo pickling6411001 +Ref: 1efe6411001 +Node: Functions<3>6413407 +Ref: library/zoneinfo functions6413534 +Ref: 1f046413534 +Ref: library/zoneinfo zoneinfo available_timezones6413573 +Ref: 13706413573 +Ref: library/zoneinfo zoneinfo reset_tzpath6414549 +Ref: 1ef56414549 +Node: Globals6415246 +Ref: library/zoneinfo globals6415378 +Ref: 1f056415378 +Ref: library/zoneinfo zoneinfo TZPATH6415413 +Ref: 17b06415413 +Node: Exceptions and warnings6416188 +Ref: library/zoneinfo exceptions-and-warnings6416299 +Ref: 1f066416299 +Ref: library/zoneinfo zoneinfo ZoneInfoNotFoundError6416366 +Ref: 1ef06416366 +Ref: library/zoneinfo zoneinfo InvalidTZPathWarning6416597 +Ref: 1ef96416597 +Node: calendar — General calendar-related functions6416774 +Ref: library/calendar doc6416956 +Ref: 1f076416956 +Ref: library/calendar calendar-general-calendar-related-functions6416956 +Ref: 1f086416956 +Ref: library/calendar module-calendar6416956 +Ref: 136416956 +Ref: library/calendar tzdata6416956 +Ref: 1f096416956 +Ref: library/calendar calendar Calendar6418159 +Ref: 1f0b6418159 +Ref: library/calendar calendar Calendar iterweekdays6418692 +Ref: 1f0e6418692 +Ref: library/calendar calendar Calendar itermonthdates6418941 +Ref: 8836418941 +Ref: library/calendar calendar Calendar itermonthdays6419313 +Ref: 1f106419313 +Ref: library/calendar calendar Calendar itermonthdays26419698 +Ref: 1f116419698 +Ref: library/calendar calendar Calendar itermonthdays36420048 +Ref: 8846420048 +Ref: library/calendar calendar Calendar itermonthdays46420428 +Ref: 8856420428 +Ref: library/calendar calendar Calendar monthdatescalendar6420828 +Ref: 1f126420828 +Ref: library/calendar calendar Calendar monthdays2calendar6421048 +Ref: 1f136421048 +Ref: library/calendar calendar Calendar monthdayscalendar6421276 +Ref: 1f146421276 +Ref: library/calendar calendar Calendar yeardatescalendar6421463 +Ref: 1f156421463 +Ref: library/calendar calendar Calendar yeardays2calendar6421857 +Ref: 1f166421857 +Ref: library/calendar calendar Calendar yeardayscalendar6422173 +Ref: 1f176422173 +Ref: library/calendar calendar TextCalendar6422458 +Ref: 1f186422458 +Ref: library/calendar calendar TextCalendar formatmonth6422642 +Ref: 1f196422642 +Ref: library/calendar calendar TextCalendar prmonth6423091 +Ref: 1f1a6423091 +Ref: library/calendar calendar TextCalendar formatyear6423237 +Ref: 1f1b6423237 +Ref: library/calendar calendar TextCalendar pryear6423774 +Ref: 1f1c6423774 +Ref: library/calendar calendar HTMLCalendar6423929 +Ref: 7786423929 +Ref: library/calendar calendar HTMLCalendar formatmonth6424100 +Ref: 1f1d6424100 +Ref: library/calendar calendar HTMLCalendar formatyear6424350 +Ref: 1f1e6424350 +Ref: library/calendar calendar HTMLCalendar formatyearpage6424531 +Ref: 1f1f6424531 +Ref: library/calendar calendar HTMLCalendar cssclasses6425171 +Ref: 1f206425171 +Ref: library/calendar calendar HTMLCalendar cssclass_noday6425585 +Ref: 1f216425585 +Ref: library/calendar calendar HTMLCalendar cssclasses_weekday_head6425744 +Ref: 1f226425744 +Ref: library/calendar calendar HTMLCalendar cssclass_month_head6425957 +Ref: 1f236425957 +Ref: library/calendar calendar HTMLCalendar cssclass_month6426151 +Ref: 1f246426151 +Ref: library/calendar calendar HTMLCalendar cssclass_year6426358 +Ref: 1f256426358 +Ref: library/calendar calendar HTMLCalendar cssclass_year_head6426571 +Ref: 1f266426571 +Ref: library/calendar calendar LocaleTextCalendar6427478 +Ref: 3136427478 +Ref: library/calendar calendar LocaleHTMLCalendar6427719 +Ref: 3146427719 +Ref: library/calendar calendar setfirstweekday6428303 +Ref: 1f0a6428303 +Ref: library/calendar calendar firstweekday6428777 +Ref: 1f0f6428777 +Ref: library/calendar calendar isleap6428887 +Ref: 1f2c6428887 +Ref: library/calendar calendar leapdays6429015 +Ref: 1f2d6429015 +Ref: library/calendar calendar weekday6429240 +Ref: 1f2e6429240 +Ref: library/calendar calendar weekheader6429439 +Ref: 1f2f6429439 +Ref: library/calendar calendar monthrange6429599 +Ref: 1f306429599 +Ref: library/calendar calendar monthcalendar6429768 +Ref: 1f316429768 +Ref: library/calendar calendar prmonth6430049 +Ref: 1f326430049 +Ref: library/calendar calendar month6430181 +Ref: 1f336430181 +Ref: library/calendar calendar prcal6430374 +Ref: 1f346430374 +Ref: library/calendar calendar calendar6430518 +Ref: 1f356430518 +Ref: library/calendar calendar timegm6430733 +Ref: 1f366430733 +Ref: library/calendar calendar day_name6431209 +Ref: 1f376431209 +Ref: library/calendar calendar day_abbr6431318 +Ref: 1f386431318 +Ref: library/calendar calendar month_name6431439 +Ref: 1f396431439 +Ref: library/calendar calendar month_abbr6431697 +Ref: 1f3a6431697 +Ref: library/calendar calendar MONDAY6431967 +Ref: 1f0c6431967 +Ref: library/calendar calendar TUESDAY6431993 +Ref: 1f276431993 +Ref: library/calendar calendar WEDNESDAY6432020 +Ref: 1f286432020 +Ref: library/calendar calendar THURSDAY6432049 +Ref: 1f296432049 +Ref: library/calendar calendar FRIDAY6432077 +Ref: 1f2a6432077 +Ref: library/calendar calendar SATURDAY6432103 +Ref: 1f2b6432103 +Ref: library/calendar calendar SUNDAY6432131 +Ref: 1f0d6432131 +Ref: calendar — General calendar-related functions-Footnote-16432511 +Node: collections — Container datatypes6432579 +Ref: library/collections doc6432782 +Ref: 1f3b6432782 +Ref: library/collections collections-container-datatypes6432782 +Ref: 1f3c6432782 +Ref: library/collections module-collections6432782 +Ref: 1c6432782 +Ref: collections — Container datatypes-Footnote-16434761 +Node: ChainMap objects6434842 +Ref: library/collections chainmap-objects6434954 +Ref: 1f3e6434954 +Ref: library/collections collections ChainMap6435342 +Ref: 8866435342 +Ref: library/collections collections ChainMap maps6436375 +Ref: 1f3f6436375 +Ref: library/collections collections ChainMap new_child6436678 +Ref: bba6436678 +Ref: library/collections collections ChainMap parents6437492 +Ref: 1f406437492 +Ref: ChainMap objects-Footnote-16439456 +Ref: ChainMap objects-Footnote-26439498 +Ref: ChainMap objects-Footnote-36439593 +Ref: ChainMap objects-Footnote-46439640 +Ref: ChainMap objects-Footnote-56439719 +Ref: ChainMap objects-Footnote-66439772 +Node: ChainMap Examples and Recipes6439825 +Ref: library/collections chainmap-examples-and-recipes6439907 +Ref: 1f416439907 +Node: Counter objects6443021 +Ref: library/collections counter-objects6443155 +Ref: 1f426443155 +Ref: library/collections collections Counter6443860 +Ref: d436443860 +Ref: library/collections collections Counter elements6445835 +Ref: fa86445835 +Ref: library/collections collections Counter most_common6446258 +Ref: fa76446258 +Ref: library/collections collections Counter subtract6446718 +Ref: e8e6446718 +Ref: library/collections collections Counter total6447272 +Ref: 1f436447272 +Ref: library/collections collections Counter fromkeys6447606 +Ref: 1f446447606 +Ref: library/collections collections Counter update6447735 +Ref: 1f456447735 +Ref: Counter objects-Footnote-16452846 +Ref: Counter objects-Footnote-26452925 +Ref: Counter objects-Footnote-36452972 +Node: deque objects6453065 +Ref: library/collections deque-objects6453202 +Ref: 1f466453202 +Ref: library/collections collections deque6453255 +Ref: 1a96453255 +Ref: library/collections collections deque append6454698 +Ref: 1f476454698 +Ref: library/collections collections deque appendleft6454778 +Ref: 1f486454778 +Ref: library/collections collections deque clear6454861 +Ref: 1f496454861 +Ref: library/collections collections deque copy6454960 +Ref: a546454960 +Ref: library/collections collections deque count6455064 +Ref: e906455064 +Ref: library/collections collections deque extend6455183 +Ref: 1f4a6455183 +Ref: library/collections collections deque extendleft6455325 +Ref: 1f4b6455325 +Ref: library/collections collections deque index6455572 +Ref: a526455572 +Ref: library/collections collections deque insert6455844 +Ref: a536455844 +Ref: library/collections collections deque pop6456090 +Ref: 1f4c6456090 +Ref: library/collections collections deque popleft6456261 +Ref: 1f4d6456261 +Ref: library/collections collections deque remove6456435 +Ref: 13116456435 +Ref: library/collections collections deque reverse6456576 +Ref: e916456576 +Ref: library/collections collections deque rotate6456728 +Ref: 12dc6456728 +Ref: library/collections collections deque maxlen6457137 +Ref: fa96457137 +Node: deque Recipes6459788 +Ref: library/collections deque-recipes6459851 +Ref: 1f4e6459851 +Ref: deque Recipes-Footnote-16462315 +Node: defaultdict objects6462376 +Ref: library/collections defaultdict-objects6462554 +Ref: 1f4f6462554 +Ref: library/collections collections defaultdict6462619 +Ref: e716462619 +Ref: library/collections collections defaultdict __missing__6463405 +Ref: 1f516463405 +Ref: library/collections collections defaultdict default_factory6464578 +Ref: 1f506464578 +Ref: defaultdict objects-Footnote-16465000 +Node: defaultdict Examples6465042 +Ref: library/collections defaultdict-examples6465118 +Ref: 1f526465118 +Node: namedtuple Factory Function for Tuples with Named Fields6467781 +Ref: library/collections namedtuple-factory-function-for-tuples-with-named-fields6467965 +Ref: 1f536467965 +Ref: library/collections collections namedtuple6468346 +Ref: 5386468346 +Ref: library/collections collections somenamedtuple _make6472361 +Ref: 1f546472361 +Ref: library/collections collections somenamedtuple _asdict6472592 +Ref: 6246472592 +Ref: library/collections collections somenamedtuple _replace6473278 +Ref: 1f556473278 +Ref: library/collections collections somenamedtuple _fields6473678 +Ref: 1f566473678 +Ref: library/collections collections somenamedtuple _field_defaults6474174 +Ref: 1f576474174 +Node: OrderedDict objects6476942 +Ref: library/collections ordereddict-objects6477123 +Ref: 1f586477123 +Ref: library/collections collections OrderedDict6479525 +Ref: 1a86479525 +Ref: library/collections collections OrderedDict popitem6479721 +Ref: f946479721 +Ref: library/collections collections OrderedDict move_to_end6480001 +Ref: e8f6480001 +Ref: OrderedDict objects-Footnote-16481635 +Ref: OrderedDict objects-Footnote-26481677 +Node: OrderedDict Examples and Recipes6481719 +Ref: library/collections ordereddict-examples-and-recipes6481807 +Ref: 1f5a6481807 +Node: UserDict objects6484780 +Ref: library/collections userdict-objects6484921 +Ref: 1f5b6484921 +Ref: library/collections collections UserDict6485287 +Ref: 13ae6485287 +Ref: library/collections collections UserDict data6485880 +Ref: 1f5c6485880 +Node: UserList objects6486008 +Ref: library/collections userlist-objects6486148 +Ref: 1f5d6486148 +Ref: library/collections collections UserList6486663 +Ref: 1f3d6486663 +Ref: library/collections collections UserList data6487268 +Ref: 1f5e6487268 +Node: UserString objects6488062 +Ref: library/collections userstring-objects6488177 +Ref: 1f5f6488177 +Ref: library/collections collections UserString6488539 +Ref: a566488539 +Ref: library/collections collections UserString data6489133 +Ref: 1f606489133 +Node: collections abc — Abstract Base Classes for Containers6489433 +Ref: library/collections abc doc6489619 +Ref: 1f616489619 +Ref: library/collections abc collections-abc-abstract-base-classes-for-containers6489619 +Ref: 1f626489619 +Ref: library/collections abc module-collections abc6489619 +Ref: 1d6489619 +Ref: collections abc — Abstract Base Classes for Containers-Footnote-16493351 +Ref: collections abc — Abstract Base Classes for Containers-Footnote-26493428 +Node: Collections Abstract Base Classes6493470 +Ref: library/collections abc collections-abstract-base-classes6493664 +Ref: 49a6493664 +Ref: library/collections abc id16493664 +Ref: 1f636493664 +Ref: Collections Abstract Base Classes-Footnote-16503039 +Ref: Collections Abstract Base Classes-Footnote-26503328 +Ref: Collections Abstract Base Classes-Footnote-36503617 +Ref: Collections Abstract Base Classes-Footnote-46503906 +Ref: Collections Abstract Base Classes-Footnote-56504244 +Ref: Collections Abstract Base Classes-Footnote-66504533 +Ref: Collections Abstract Base Classes-Footnote-76504822 +Ref: Collections Abstract Base Classes-Footnote-86505111 +Ref: Collections Abstract Base Classes-Footnote-96505400 +Ref: Collections Abstract Base Classes-Footnote-106505689 +Ref: Collections Abstract Base Classes-Footnote-116505979 +Ref: Collections Abstract Base Classes-Footnote-126506269 +Ref: Collections Abstract Base Classes-Footnote-136506559 +Ref: Collections Abstract Base Classes-Footnote-146506849 +Ref: Collections Abstract Base Classes-Footnote-156507139 +Node: Collections Abstract Base Classes – Detailed Descriptions6507429 +Ref: library/collections abc collections-abstract-base-classes-detailed-descriptions6507652 +Ref: 1f666507652 +Ref: library/collections abc collections abc Container6507787 +Ref: 1ca76507787 +Ref: library/collections abc collections abc Hashable6507893 +Ref: 1f646507893 +Ref: library/collections abc collections abc Sized6507994 +Ref: 1f656507994 +Ref: library/collections abc collections abc Callable6508091 +Ref: 3dc6508091 +Ref: library/collections abc collections abc Iterable6508192 +Ref: 1ca56508192 +Ref: library/collections abc collections abc Collection6508649 +Ref: 8f96508649 +Ref: library/collections abc collections abc Iterator6508762 +Ref: 1ca66508762 +Ref: library/collections abc collections abc Reversible6508958 +Ref: 8fa6508958 +Ref: library/collections abc collections abc Generator6509110 +Ref: a5c6509110 +Ref: library/collections abc collections abc Sequence6509428 +Ref: 12a36509428 +Ref: library/collections abc collections abc MutableSequence6509464 +Ref: a556509464 +Ref: library/collections abc collections abc ByteString6509507 +Ref: 1ca96509507 +Ref: library/collections abc collections abc Set6510221 +Ref: 1c9d6510221 +Ref: library/collections abc collections abc MutableSet6510252 +Ref: 1ca86510252 +Ref: library/collections abc collections abc Mapping6510334 +Ref: 5056510334 +Ref: library/collections abc collections abc MutableMapping6510369 +Ref: d586510369 +Ref: library/collections abc collections abc MappingView6510470 +Ref: 1caa6510470 +Ref: library/collections abc collections abc ItemsView6510509 +Ref: 1cac6510509 +Ref: library/collections abc collections abc KeysView6510546 +Ref: 1cab6510546 +Ref: library/collections abc collections abc ValuesView6510582 +Ref: 1cad6510582 +Ref: library/collections abc collections abc Awaitable6510688 +Ref: a5d6510688 +Ref: library/collections abc collections abc Coroutine6511418 +Ref: a5e6511418 +Ref: library/collections abc collections abc AsyncIterable6512267 +Ref: a606512267 +Ref: library/collections abc collections abc AsyncIterator6512461 +Ref: a5f6512461 +Ref: library/collections abc collections abc AsyncGenerator6512675 +Ref: 8fb6512675 +Ref: Collections Abstract Base Classes – Detailed Descriptions-Footnote-16512896 +Ref: Collections Abstract Base Classes – Detailed Descriptions-Footnote-26512938 +Ref: Collections Abstract Base Classes – Detailed Descriptions-Footnote-36512980 +Node: Examples and Recipes6513022 +Ref: library/collections abc examples-and-recipes6513203 +Ref: 1f676513203 +Ref: Examples and Recipes-Footnote-16516091 +Ref: Examples and Recipes-Footnote-26516144 +Node: heapq — Heap queue algorithm6516186 +Ref: library/heapq doc6516373 +Ref: 1f686516373 +Ref: library/heapq heapq-heap-queue-algorithm6516373 +Ref: 1f696516373 +Ref: library/heapq module-heapq6516373 +Ref: 896516373 +Ref: library/heapq heapq heappush6517928 +Ref: 1f6b6517928 +Ref: library/heapq heapq heappop6518053 +Ref: 1f6c6518053 +Ref: library/heapq heapq heappushpop6518318 +Ref: 1f6d6518318 +Ref: library/heapq heapq heapify6518591 +Ref: 1f6a6518591 +Ref: library/heapq heapq heapreplace6518688 +Ref: 1f6e6518688 +Ref: library/heapq heapq merge6519536 +Ref: a856519536 +Ref: library/heapq heapq nlargest6520700 +Ref: 1f6f6520700 +Ref: library/heapq heapq nsmallest6521098 +Ref: 1f706521098 +Ref: heapq — Heap queue algorithm-Footnote-16521967 +Node: Basic Examples6522032 +Ref: library/heapq basic-examples6522157 +Ref: 1f716522157 +Ref: Basic Examples-Footnote-16523124 +Node: Priority Queue Implementation Notes6523171 +Ref: library/heapq priority-queue-implementation-notes6523311 +Ref: 1f726523311 +Ref: Priority Queue Implementation Notes-Footnote-16526247 +Node: Theory6526300 +Ref: library/heapq theory6526417 +Ref: 1f736526417 +Ref: Theory-Footnote-16530577 +Node: bisect — Array bisection algorithm6531233 +Ref: library/bisect doc6531408 +Ref: 1f746531408 +Ref: library/bisect bisect-array-bisection-algorithm6531408 +Ref: 1f756531408 +Ref: library/bisect module-bisect6531408 +Ref: 106531408 +Ref: library/bisect bisect bisect_left6532105 +Ref: 1f766532105 +Ref: library/bisect bisect bisect_right6533272 +Ref: 1f776533272 +Ref: library/bisect bisect bisect6533343 +Ref: 1f786533343 +Ref: library/bisect bisect insort_left6534191 +Ref: 1f796534191 +Ref: library/bisect bisect insort_right6534829 +Ref: 1f7a6534829 +Ref: library/bisect bisect insort6534900 +Ref: 1f7b6534900 +Ref: bisect — Array bisection algorithm-Footnote-16535722 +Node: Performance Notes6535788 +Ref: library/bisect performance-notes6535909 +Ref: 1f7c6535909 +Ref: Performance Notes-Footnote-16537288 +Ref: Performance Notes-Footnote-26537346 +Node: Searching Sorted Lists6537416 +Ref: library/bisect searching-sorted-lists6537557 +Ref: 1f7e6537557 +Node: Examples<3>6538779 +Ref: library/bisect examples6538894 +Ref: 1f7f6538894 +Ref: library/bisect bisect-example6538929 +Ref: 1f806538929 +Node: array — Efficient arrays of numeric values6541446 +Ref: library/array doc6541618 +Ref: 1f816541618 +Ref: library/array array-efficient-arrays-of-numeric-values6541618 +Ref: 1f826541618 +Ref: library/array module-array6541618 +Ref: 66541618 +Ref: library/array array array6546176 +Ref: 3d26546176 +Ref: library/array array typecodes6546897 +Ref: 1f876546897 +Ref: library/array array array typecode6547415 +Ref: 1f886547415 +Ref: library/array array array itemsize6547501 +Ref: 1f896547501 +Ref: library/array array array append6547613 +Ref: 1f8a6547613 +Ref: library/array array array buffer_info6547707 +Ref: 1f8b6547707 +Ref: library/array array array byteswap6548737 +Ref: 1f8c6548737 +Ref: library/array array array count6549064 +Ref: 1f8d6549064 +Ref: library/array array array extend6549153 +Ref: 1f866549153 +Ref: library/array array array frombytes6549513 +Ref: 1f846549513 +Ref: library/array array array fromfile6549828 +Ref: 1f8e6549828 +Ref: library/array array array fromlist6550137 +Ref: 1f836550137 +Ref: library/array array array fromunicode6550334 +Ref: 1f856550334 +Ref: library/array array array index6550648 +Ref: 3d16550648 +Ref: library/array array array insert6551056 +Ref: 1f8f6551056 +Ref: library/array array array pop6551243 +Ref: 1f906551243 +Ref: library/array array array remove6551457 +Ref: 1f916551457 +Ref: library/array array array reverse6551544 +Ref: 1f926551544 +Ref: library/array array array tobytes6551625 +Ref: 1f936551625 +Ref: library/array array array tofile6551951 +Ref: 1f946551951 +Ref: library/array array array tolist6552064 +Ref: 1f956552064 +Ref: library/array array array tounicode6552158 +Ref: 1f966552158 +Ref: array — Efficient arrays of numeric values-Footnote-16553396 +Node: weakref — Weak references6553423 +Ref: library/weakref doc6553619 +Ref: 1f976553619 +Ref: library/weakref mod-weakref6553619 +Ref: b9b6553619 +Ref: library/weakref module-weakref6553619 +Ref: 1326553619 +Ref: library/weakref weakref-weak-references6553619 +Ref: 1f986553619 +Ref: library/weakref weakref ref6557681 +Ref: c926557681 +Ref: library/weakref weakref ref __callback__6559484 +Ref: c936559484 +Ref: library/weakref weakref proxy6559849 +Ref: 6a16559849 +Ref: library/weakref weakref getweakrefcount6560714 +Ref: 1f9a6560714 +Ref: library/weakref weakref getweakrefs6560847 +Ref: 1f9b6560847 +Ref: library/weakref weakref WeakKeyDictionary6560981 +Ref: 13856560981 +Ref: library/weakref weakref WeakKeyDictionary keyrefs6561935 +Ref: 1f9c6561935 +Ref: library/weakref weakref WeakValueDictionary6562038 +Ref: 13846562038 +Ref: library/weakref weakref WeakValueDictionary valuerefs6562527 +Ref: 1f9d6562527 +Ref: library/weakref weakref WeakSet6562636 +Ref: 1aa6562636 +Ref: library/weakref weakref WeakMethod6562820 +Ref: c916562820 +Ref: library/weakref weakref finalize6563755 +Ref: 6ce6563755 +Ref: library/weakref weakref finalize __call__6565046 +Ref: 1f9e6565046 +Ref: library/weakref weakref finalize detach6565257 +Ref: 1f9f6565257 +Ref: library/weakref weakref finalize peek6565458 +Ref: 1fa06565458 +Ref: library/weakref weakref finalize alive6565627 +Ref: 1fa16565627 +Ref: library/weakref weakref finalize atexit6565742 +Ref: 1fa26565742 +Ref: library/weakref weakref ReferenceType6566341 +Ref: 11b56566341 +Ref: library/weakref weakref ProxyType6566425 +Ref: 11b66566425 +Ref: library/weakref weakref CallableProxyType6566523 +Ref: 11b76566523 +Ref: library/weakref weakref ProxyTypes6566615 +Ref: 1fa36566615 +Ref: weakref — Weak references-Footnote-16567245 +Ref: weakref — Weak references-Footnote-26567312 +Ref: weakref — Weak references-Footnote-36567354 +Ref: weakref — Weak references-Footnote-46567396 +Node: Weak Reference Objects6567438 +Ref: library/weakref weak-reference-objects6567543 +Ref: 1fa46567543 +Ref: library/weakref weakref-objects6567543 +Ref: 1fa56567543 +Node: Example<2>6570067 +Ref: library/weakref example6570198 +Ref: 1fa66570198 +Ref: library/weakref weakref-example6570198 +Ref: 1fa76570198 +Node: Finalizer Objects6570739 +Ref: library/weakref finalize-examples6570889 +Ref: 1fa86570889 +Ref: library/weakref finalizer-objects6570889 +Ref: 1fa96570889 +Node: Comparing finalizers with __del__ methods6572740 +Ref: library/weakref comparing-finalizers-with-del-methods6572871 +Ref: 1faa6572871 +Node: types — Dynamic type creation and names for built-in types6575677 +Ref: library/types doc6575870 +Ref: 1fab6575870 +Ref: library/types module-types6575870 +Ref: 1226575870 +Ref: library/types types-dynamic-type-creation-and-names-for-built-in-types6575870 +Ref: 1fac6575870 +Ref: types — Dynamic type creation and names for built-in types-Footnote-16576673 +Node: Dynamic Type Creation6576738 +Ref: library/types dynamic-type-creation6576891 +Ref: 1fad6576891 +Ref: library/types types new_class6576954 +Ref: e136576954 +Ref: library/types types prepare_class6577668 +Ref: e146577668 +Ref: library/types types resolve_bases6578837 +Ref: 7fe6578837 +Ref: Dynamic Type Creation-Footnote-16579508 +Ref: Dynamic Type Creation-Footnote-26579550 +Ref: Dynamic Type Creation-Footnote-36579592 +Node: Standard Interpreter Types6579634 +Ref: library/types standard-interpreter-types6579836 +Ref: 1fae6579836 +Ref: library/types types NoneType6580392 +Ref: 4496580392 +Ref: library/types types FunctionType6580480 +Ref: 4a66580480 +Ref: library/types types LambdaType6580509 +Ref: 1faf6580509 +Ref: library/types types GeneratorType6580865 +Ref: 1fb06580865 +Ref: library/types types CoroutineType6580991 +Ref: b176580991 +Ref: library/types types AsyncGeneratorType6581146 +Ref: 1fb16581146 +Ref: library/types types CodeType6581330 +Ref: 6126581330 +Ref: library/types types CodeType replace6581908 +Ref: 1fb26581908 +Ref: library/types types CellType6582072 +Ref: 18fc6582072 +Ref: library/types types MethodType6582233 +Ref: 11df6582233 +Ref: library/types types BuiltinFunctionType6582320 +Ref: 1fb36582320 +Ref: library/types types BuiltinMethodType6582356 +Ref: 1fb46582356 +Ref: library/types types WrapperDescriptorType6582579 +Ref: 7fb6582579 +Ref: library/types types MethodWrapperType6582796 +Ref: 21e6582796 +Ref: library/types types NotImplementedType6582997 +Ref: 44a6582997 +Ref: library/types types MethodDescriptorType6583105 +Ref: 7fc6583105 +Ref: library/types types ClassMethodDescriptorType6583260 +Ref: 7fd6583260 +Ref: library/types types ModuleType6583445 +Ref: a956583445 +Ref: library/types types ModuleType __doc__6583808 +Ref: 1fb56583808 +Ref: library/types types ModuleType __loader__6583915 +Ref: 1fb66583915 +Ref: library/types types ModuleType __name__6584661 +Ref: 1fb86584661 +Ref: library/types types ModuleType __package__6584804 +Ref: 1fba6584804 +Ref: library/types types ModuleType __spec__6585819 +Ref: 1fbc6585819 +Ref: library/types types EllipsisType6586041 +Ref: 4486586041 +Ref: library/types types GenericAlias6586138 +Ref: 3dd6586138 +Ref: library/types types UnionType6586785 +Ref: 2136586785 +Ref: library/types types TracebackType6586893 +Ref: 7486586893 +Ref: library/types types FrameType6587204 +Ref: 12466587204 +Ref: library/types types GetSetDescriptorType6587445 +Ref: 1fbd6587445 +Ref: library/types types MemberDescriptorType6587806 +Ref: 1fbe6587806 +Ref: library/types types MappingProxyType6588324 +Ref: 3bb6588324 +Ref: library/types types MappingProxyType copy6589316 +Ref: 1fbf6589316 +Ref: library/types types MappingProxyType get6589402 +Ref: 1fc06589402 +Ref: library/types types MappingProxyType items6589675 +Ref: 1fc16589675 +Ref: library/types types MappingProxyType keys6589805 +Ref: 1fc26589805 +Ref: library/types types MappingProxyType values6589896 +Ref: 1fc36589896 +Ref: Standard Interpreter Types-Footnote-16590182 +Node: Additional Utility Classes and Functions6590224 +Ref: library/types additional-utility-classes-and-functions6590432 +Ref: 1fc46590432 +Ref: library/types types SimpleNamespace6590533 +Ref: 56f6590533 +Ref: library/types types DynamicClassAttribute6591863 +Ref: 2066591863 +Node: Coroutine Utility Functions6592537 +Ref: library/types coroutine-utility-functions6592710 +Ref: 1fc56592710 +Ref: library/types types coroutine6592785 +Ref: b166592785 +Node: copy — Shallow and deep copy operations6593603 +Ref: library/copy doc6593799 +Ref: 1fc66593799 +Ref: library/copy copy-shallow-and-deep-copy-operations6593799 +Ref: 1fc76593799 +Ref: library/copy module-copy6593799 +Ref: 246593799 +Ref: library/copy copy copy6594354 +Ref: 7cc6594354 +Ref: library/copy copy deepcopy6594419 +Ref: 7cd6594419 +Ref: library/copy copy Error6594493 +Ref: 1fc86594493 +Ref: library/copy shallow-vs-deep-copy6594560 +Ref: 164e6594560 +Ref: copy — Shallow and deep copy operations-Footnote-16597259 +Node: pprint — Data pretty printer6597323 +Ref: library/pprint doc6597500 +Ref: 1fc96597500 +Ref: library/pprint module-pprint6597500 +Ref: cf6597500 +Ref: library/pprint pprint-data-pretty-printer6597500 +Ref: 1fca6597500 +Ref: library/pprint pprint PrettyPrinter6598685 +Ref: c1d6598685 +Ref: library/pprint pprint pformat6601801 +Ref: c1e6601801 +Ref: library/pprint pprint pp6602252 +Ref: 66f6602252 +Ref: library/pprint pprint pprint6602677 +Ref: 41d6602677 +Ref: library/pprint pprint isreadable6603770 +Ref: 1fcd6603770 +Ref: library/pprint pprint isrecursive6604078 +Ref: 1fce6604078 +Ref: library/pprint pprint saferepr6604230 +Ref: 1fcf6604230 +Ref: pprint — Data pretty printer-Footnote-16604814 +Node: PrettyPrinter Objects6604880 +Ref: library/pprint id16604987 +Ref: 1fd06604987 +Ref: library/pprint prettyprinter-objects6604987 +Ref: 1fd16604987 +Ref: library/pprint pprint PrettyPrinter pformat6605115 +Ref: 1fd26605115 +Ref: library/pprint pprint PrettyPrinter pprint6605314 +Ref: 1fcc6605314 +Ref: library/pprint pprint PrettyPrinter isreadable6605701 +Ref: 1fd36605701 +Ref: library/pprint pprint PrettyPrinter isrecursive6606103 +Ref: 1fd46606103 +Ref: library/pprint pprint PrettyPrinter format6606419 +Ref: 13246606419 +Node: Example<3>6607579 +Ref: library/pprint example6607686 +Ref: 1fd56607686 +Ref: library/pprint pprint-example6607686 +Ref: 1fd66607686 +Ref: Example<3>-Footnote-16614996 +Node: reprlib — Alternate repr implementation6615021 +Ref: library/reprlib doc6615190 +Ref: 1fd76615190 +Ref: library/reprlib module-reprlib6615190 +Ref: dc6615190 +Ref: library/reprlib reprlib-alternate-repr-implementation6615190 +Ref: 1fd86615190 +Ref: library/reprlib reprlib Repr6615686 +Ref: 1fd96615686 +Ref: library/reprlib reprlib aRepr6615970 +Ref: 1fda6615970 +Ref: library/reprlib reprlib repr6616253 +Ref: 1fdb6616253 +Ref: library/reprlib reprlib recursive_repr6616649 +Ref: ea36616649 +Ref: reprlib — Alternate repr implementation-Footnote-16617439 +Node: Repr Objects6617506 +Ref: library/reprlib id16617629 +Ref: 1fdd6617629 +Ref: library/reprlib repr-objects6617629 +Ref: 1fde6617629 +Ref: library/reprlib reprlib Repr fillvalue6617870 +Ref: 1fdf6617870 +Ref: library/reprlib reprlib Repr maxlevel6618017 +Ref: 1fe06618017 +Ref: library/reprlib reprlib Repr maxdict6618141 +Ref: 1fe16618141 +Ref: library/reprlib reprlib Repr maxlist6618169 +Ref: 1fe26618169 +Ref: library/reprlib reprlib Repr maxtuple6618197 +Ref: 1fe36618197 +Ref: library/reprlib reprlib Repr maxset6618226 +Ref: 1fe46618226 +Ref: library/reprlib reprlib Repr maxfrozenset6618253 +Ref: 1fe56618253 +Ref: library/reprlib reprlib Repr maxdeque6618286 +Ref: 1fe66618286 +Ref: library/reprlib reprlib Repr maxarray6618315 +Ref: 1fe76618315 +Ref: library/reprlib reprlib Repr maxlong6618543 +Ref: 1fe86618543 +Ref: library/reprlib reprlib Repr maxstring6618712 +Ref: 1fe96618712 +Ref: library/reprlib reprlib Repr maxother6619069 +Ref: 1fea6619069 +Ref: library/reprlib reprlib Repr repr6619348 +Ref: 1fdc6619348 +Ref: library/reprlib reprlib Repr repr16619488 +Ref: 1feb6619488 +Node: Subclassing Repr Objects6620306 +Ref: library/reprlib subclassing-repr-objects6620429 +Ref: 1fec6620429 +Ref: library/reprlib subclassing-reprs6620429 +Ref: 1fed6620429 +Node: enum — Support for enumerations6621112 +Ref: library/enum doc6621315 +Ref: 1fee6621315 +Ref: library/enum enum-support-for-enumerations6621315 +Ref: 1fef6621315 +Ref: library/enum module-enum6621315 +Ref: 766621315 +Ref: enum — Support for enumerations-Footnote-16623157 +Node: Module Contents<2>6623221 +Ref: library/enum module-contents6623331 +Ref: 1ff46623331 +Node: Data Types<2>6625952 +Ref: library/enum data-types6626095 +Ref: 1ff76626095 +Ref: library/enum enum EnumType6626136 +Ref: 1f26626136 +Ref: library/enum enum EnumType __contains__6626629 +Ref: 1ff96626629 +Ref: library/enum enum EnumType __dir__6627087 +Ref: 1ffa6627087 +Ref: library/enum enum EnumType __getattr__6627474 +Ref: 1ffb6627474 +Ref: library/enum enum EnumType __getitem__6627692 +Ref: 1ffc6627692 +Ref: library/enum enum EnumType __iter__6627905 +Ref: 1ffd6627905 +Ref: library/enum enum EnumType __len__6628098 +Ref: 1ffe6628098 +Ref: library/enum enum EnumType __reversed__6628228 +Ref: 1fff6628228 +Ref: library/enum enum Enum6628443 +Ref: 20c6628443 +Ref: library/enum enum Enum name6628525 +Ref: 20006628525 +Ref: library/enum enum Enum value6628667 +Ref: 20016628667 +Ref: library/enum enum Enum _ignore_6629176 +Ref: 20026629176 +Ref: library/enum enum Enum __call__6629543 +Ref: 12496629543 +Ref: library/enum enum Enum __dir__6630690 +Ref: 12586630690 +Ref: library/enum enum Enum _generate_next_value_6631502 +Ref: 20046631502 +Ref: library/enum enum Enum __init_subclass__6632399 +Ref: 20056632399 +Ref: library/enum enum Enum _missing_6632571 +Ref: 20066632571 +Ref: library/enum enum Enum __repr__6633413 +Ref: 20076633413 +Ref: library/enum enum Enum __str__6634123 +Ref: 1fd6634123 +Ref: library/enum enum Enum __format__6634732 +Ref: 1fb6634732 +Ref: library/enum enum IntEnum6635515 +Ref: 1f96635515 +Ref: library/enum enum StrEnum6636523 +Ref: 1f36636523 +Ref: library/enum enum Flag6637503 +Ref: 1fe6637503 +Ref: library/enum enum Flag __contains__6637723 +Ref: 20086637723 +Ref: library/enum enum Flag __or__6639065 +Ref: 20096639065 +Ref: library/enum enum Flag __and__6639243 +Ref: 200a6639243 +Ref: library/enum enum Flag __xor__6639479 +Ref: 200b6639479 +Ref: library/enum enum Flag _numeric_repr_6640013 +Ref: 200c6640013 +Ref: library/enum enum IntFlag6640512 +Ref: 1fa6640512 +Ref: library/enum enum EnumCheck6641853 +Ref: 2016641853 +Ref: library/enum enum EnumCheck UNIQUE6642057 +Ref: 200d6642057 +Ref: library/enum enum EnumCheck CONTINUOUS6642544 +Ref: 200e6642544 +Ref: library/enum enum EnumCheck NAMED_FLAGS6643074 +Ref: 200f6643074 +Ref: library/enum enum FlagBoundary6643942 +Ref: 1ff6643942 +Ref: library/enum enum FlagBoundary STRICT6644073 +Ref: 20106644073 +Ref: library/enum enum FlagBoundary CONFORM6644697 +Ref: 20116644697 +Ref: library/enum enum FlagBoundary EJECT6645131 +Ref: 20126645131 +Ref: library/enum enum FlagBoundary KEEP6645582 +Ref: 20136645582 +Node: Supported __dunder__ names6646185 +Ref: library/enum supported-dunder-names6646294 +Ref: 20146646294 +Node: Supported _sunder_ names6646709 +Ref: library/enum supported-sunder-names6646818 +Ref: 20156646818 +Node: Utilities and Decorators6648055 +Ref: library/enum utilities-and-decorators6648185 +Ref: 20166648185 +Ref: library/enum enum auto6648254 +Ref: 90f6648254 +Ref: library/enum enum property6649001 +Ref: 2046649001 +Ref: library/enum enum unique6649520 +Ref: 1ff66649520 +Ref: library/enum enum verify6650143 +Ref: 2006650143 +Ref: library/enum enum member6650396 +Ref: 2026650396 +Ref: library/enum enum nonmember6650520 +Ref: 2036650520 +Node: Notes6650719 +Ref: library/enum notes6650827 +Ref: 1ff56650827 +Node: graphlib — Functionality to operate with graph-like structures6651838 +Ref: library/graphlib doc6651991 +Ref: 20176651991 +Ref: library/graphlib graphlib-functionality-to-operate-with-graph-like-structures6651991 +Ref: 20186651991 +Ref: library/graphlib module-graphlib6651991 +Ref: 856651991 +Ref: library/graphlib graphlib TopologicalSorter6652245 +Ref: 51f6652245 +Ref: library/graphlib graphlib TopologicalSorter add6655566 +Ref: 20196655566 +Ref: library/graphlib graphlib TopologicalSorter prepare6656322 +Ref: 201a6656322 +Ref: library/graphlib graphlib TopologicalSorter is_active6656795 +Ref: 201b6656795 +Ref: library/graphlib graphlib TopologicalSorter done6657681 +Ref: 201d6657681 +Ref: library/graphlib graphlib TopologicalSorter get_ready6658377 +Ref: 201c6658377 +Ref: library/graphlib graphlib TopologicalSorter static_order6658933 +Ref: 201e6658933 +Ref: graphlib — Functionality to operate with graph-like structures-Footnote-16660473 +Node: Exceptions<4>6660541 +Ref: library/graphlib exceptions6660655 +Ref: 20206660655 +Ref: library/graphlib graphlib CycleError6660769 +Ref: 201f6660769 +Node: Numeric and Mathematical Modules6661436 +Ref: library/numeric doc6661590 +Ref: 20216661590 +Ref: library/numeric numeric6661590 +Ref: 20226661590 +Ref: library/numeric numeric-and-mathematical-modules6661590 +Ref: 20236661590 +Node: numbers — Numeric abstract base classes6662495 +Ref: library/numbers doc6662645 +Ref: 20246662645 +Ref: library/numbers module-numbers6662645 +Ref: bf6662645 +Ref: library/numbers numbers-numeric-abstract-base-classes6662645 +Ref: 20256662645 +Ref: library/numbers numbers Number6663080 +Ref: 18f56663080 +Ref: numbers — Numeric abstract base classes-Footnote-16663376 +Ref: numbers — Numeric abstract base classes-Footnote-26663443 +Node: The numeric tower6663485 +Ref: library/numbers the-numeric-tower6663616 +Ref: 20266663616 +Ref: library/numbers numbers Complex6663669 +Ref: 18f86663669 +Ref: library/numbers numbers Complex real6664120 +Ref: 20276664120 +Ref: library/numbers numbers Complex imag6664213 +Ref: 20286664213 +Ref: library/numbers numbers Complex conjugate6664311 +Ref: 20296664311 +Ref: library/numbers numbers Real6664470 +Ref: 18f76664470 +Ref: library/numbers numbers Rational6664980 +Ref: f6d6664980 +Ref: library/numbers numbers Rational numerator6665371 +Ref: 202a6665371 +Ref: library/numbers numbers Rational denominator6665423 +Ref: 202b6665423 +Ref: library/numbers numbers Integral6665477 +Ref: 18f66665477 +Node: Notes for type implementors6665839 +Ref: library/numbers notes-for-type-implementors6665970 +Ref: 202c6665970 +Node: Adding More Numeric ABCs6666820 +Ref: library/numbers adding-more-numeric-abcs6666955 +Ref: 202d6666955 +Node: Implementing the arithmetic operations6667301 +Ref: library/numbers id16667436 +Ref: 202e6667436 +Ref: library/numbers implementing-the-arithmetic-operations6667436 +Ref: 18f46667436 +Node: math — Mathematical functions6672136 +Ref: library/math doc6672347 +Ref: 202f6672347 +Ref: library/math math-mathematical-functions6672347 +Ref: 20306672347 +Ref: library/math module-math6672347 +Ref: af6672347 +Node: Number-theoretic and representation functions6673517 +Ref: library/math number-theoretic-and-representation-functions6673670 +Ref: 20316673670 +Ref: library/math math ceil6673779 +Ref: 10306673779 +Ref: library/math math comb6674020 +Ref: 2996674020 +Ref: library/math math copysign6674609 +Ref: 103f6674609 +Ref: library/math math fabs6674823 +Ref: 20326674823 +Ref: library/math math factorial6674892 +Ref: 58f6674892 +Ref: library/math math floor6675154 +Ref: 102f6675154 +Ref: library/math math fmod6675386 +Ref: 1a566675386 +Ref: library/math math frexp6676372 +Ref: 20336676372 +Ref: library/math math fsum6676737 +Ref: 10406676737 +Ref: library/math math gcd6677576 +Ref: 5556677576 +Ref: library/math math isclose6678109 +Ref: a2f6678109 +Ref: library/math math isfinite6679455 +Ref: e9b6679455 +Ref: library/math math isinf6679658 +Ref: 103d6679658 +Ref: library/math math isnan6679787 +Ref: 103e6679787 +Ref: library/math math isqrt6679905 +Ref: 64b6679905 +Ref: library/math math lcm6680423 +Ref: 5566680423 +Ref: library/math math ldexp6680823 +Ref: 20346680823 +Ref: library/math math modf6680958 +Ref: 20356680958 +Ref: library/math math nextafter6681098 +Ref: 5576681098 +Ref: library/math math perm6681658 +Ref: 29a6681658 +Ref: library/math math prod6682199 +Ref: 64a6682199 +Ref: library/math math remainder6682575 +Ref: 7ad6682575 +Ref: library/math math trunc6683601 +Ref: 10316683601 +Ref: library/math math ulp6683996 +Ref: 5586683996 +Ref: Number-theoretic and representation functions-Footnote-16685738 +Ref: Number-theoretic and representation functions-Footnote-26685791 +Node: Power and logarithmic functions6685833 +Ref: library/math power-and-logarithmic-functions6686018 +Ref: 20366686018 +Ref: library/math math cbrt6686099 +Ref: 2326686099 +Ref: library/math math exp6686190 +Ref: fb46686190 +Ref: library/math math exp26686408 +Ref: 2316686408 +Ref: library/math math expm16686506 +Ref: e9c6686506 +Ref: library/math math log6687119 +Ref: 110f6687119 +Ref: library/math math log1p6687354 +Ref: 10446687354 +Ref: library/math math log26687517 +Ref: d866687517 +Ref: library/math math log106687857 +Ref: 20376687857 +Ref: library/math math pow6687989 +Ref: 2336687989 +Ref: library/math math sqrt6688884 +Ref: 64c6688884 +Ref: Power and logarithmic functions-Footnote-16688986 +Node: Trigonometric functions6689045 +Ref: library/math trigonometric-functions6689203 +Ref: 20386689203 +Ref: library/math math acos6689268 +Ref: 20396689268 +Ref: library/math math asin6689395 +Ref: 203a6689395 +Ref: library/math math atan6689526 +Ref: 203b6689526 +Ref: library/math math atan26689660 +Ref: 203c6689660 +Ref: library/math math cos6690172 +Ref: 110e6690172 +Ref: library/math math dist6690240 +Ref: 6486690240 +Ref: library/math math hypot6690569 +Ref: 6496690569 +Ref: library/math math sin6691325 +Ref: 110d6691325 +Ref: library/math math tan6691391 +Ref: 203d6691391 +Node: Angular conversion6691460 +Ref: library/math angular-conversion6691607 +Ref: 203e6691607 +Ref: library/math math degrees6691662 +Ref: 203f6691662 +Ref: library/math math radians6691743 +Ref: 20406691743 +Node: Hyperbolic functions6691824 +Ref: library/math hyperbolic-functions6691965 +Ref: 20416691965 +Ref: library/math math acosh6692137 +Ref: 10416692137 +Ref: library/math math asinh6692218 +Ref: 10426692218 +Ref: library/math math atanh6692297 +Ref: 10436692297 +Ref: library/math math cosh6692379 +Ref: 20426692379 +Ref: library/math math sinh6692451 +Ref: 20436692451 +Ref: library/math math tanh6692521 +Ref: 20446692521 +Ref: Hyperbolic functions-Footnote-16692630 +Node: Special functions6692688 +Ref: library/math special-functions6692823 +Ref: 20456692823 +Ref: library/math math erf6692876 +Ref: 83f6692876 +Ref: library/math math erfc6693296 +Ref: 8406693296 +Ref: library/math math gamma6693595 +Ref: e9d6693595 +Ref: library/math math lgamma6693694 +Ref: e9e6693694 +Ref: Special functions-Footnote-16693879 +Ref: Special functions-Footnote-26693932 +Ref: Special functions-Footnote-36694025 +Ref: Special functions-Footnote-46694078 +Ref: Special functions-Footnote-56694137 +Node: Constants<2>6694190 +Ref: library/math constants6694296 +Ref: 20466694296 +Ref: library/math math pi6694333 +Ref: 20476694333 +Ref: library/math math e6694428 +Ref: 20486694428 +Ref: library/math math tau6694521 +Ref: 20496694521 +Ref: library/math math inf6694899 +Ref: 8f56694899 +Ref: library/math math nan6695088 +Ref: 2346695088 +Ref: Constants<2>-Footnote-16697043 +Ref: Constants<2>-Footnote-26697095 +Ref: Constants<2>-Footnote-36697123 +Node: cmath — Mathematical functions for complex numbers6697170 +Ref: library/cmath doc6697401 +Ref: 204a6697401 +Ref: library/cmath cmath-mathematical-functions-for-complex-numbers6697401 +Ref: 204b6697401 +Ref: library/cmath module-cmath6697401 +Ref: 176697401 +Node: Conversions to and from polar coordinates6698681 +Ref: library/cmath conversions-to-and-from-polar-coordinates6698854 +Ref: 204c6698854 +Ref: library/cmath cmath phase6699706 +Ref: 204d6699706 +Ref: library/cmath cmath polar6700613 +Ref: 204e6700613 +Ref: library/cmath cmath rect6700866 +Ref: 204f6700866 +Node: Power and logarithmic functions<2>6701040 +Ref: library/cmath power-and-logarithmic-functions6701248 +Ref: 20506701248 +Ref: library/cmath cmath exp6701329 +Ref: 20516701329 +Ref: library/cmath cmath log6701450 +Ref: 20526701450 +Ref: library/cmath cmath log106701723 +Ref: 20536701723 +Ref: library/cmath cmath sqrt6701854 +Ref: 20546701854 +Node: Trigonometric functions<2>6701978 +Ref: library/cmath trigonometric-functions6702168 +Ref: 20556702168 +Ref: library/cmath cmath acos6702233 +Ref: 20566702233 +Ref: library/cmath cmath asin6702502 +Ref: 20576702502 +Ref: library/cmath cmath atan6702625 +Ref: 20586702625 +Ref: library/cmath cmath cos6702929 +Ref: 20596702929 +Ref: library/cmath cmath sin6702990 +Ref: 205a6702990 +Ref: library/cmath cmath tan6703049 +Ref: 205b6703049 +Node: Hyperbolic functions<2>6703111 +Ref: library/cmath hyperbolic-functions6703291 +Ref: 205c6703291 +Ref: library/cmath cmath acosh6703350 +Ref: 205d6703350 +Ref: library/cmath cmath asinh6703542 +Ref: 205e6703542 +Ref: library/cmath cmath atanh6703859 +Ref: 205f6703859 +Ref: library/cmath cmath cosh6704158 +Ref: 20606704158 +Ref: library/cmath cmath sinh6704231 +Ref: 20616704231 +Ref: library/cmath cmath tanh6704302 +Ref: 20626704302 +Node: Classification functions6704376 +Ref: library/cmath classification-functions6704542 +Ref: 20636704542 +Ref: library/cmath cmath isfinite6704609 +Ref: 20646704609 +Ref: library/cmath cmath isinf6704781 +Ref: 20656704781 +Ref: library/cmath cmath isnan6704932 +Ref: 20666704932 +Ref: library/cmath cmath isclose6705077 +Ref: a306705077 +Ref: Classification functions-Footnote-16706460 +Node: Constants<3>6706502 +Ref: library/cmath constants6706636 +Ref: 20676706636 +Ref: library/cmath cmath pi6706673 +Ref: 20686706673 +Ref: library/cmath cmath e6706743 +Ref: 20696706743 +Ref: library/cmath cmath tau6706811 +Ref: 8f26706811 +Ref: library/cmath cmath inf6706908 +Ref: 8f36706908 +Ref: library/cmath cmath infj6707030 +Ref: 8f66707030 +Ref: library/cmath cmath nan6707211 +Ref: 8f46707211 +Ref: library/cmath cmath nanj6707353 +Ref: 8f76707353 +Node: decimal — Decimal fixed point and floating point arithmetic6708764 +Ref: library/decimal doc6708994 +Ref: 206a6708994 +Ref: library/decimal decimal-decimal-fixed-point-and-floating-point-arithmetic6708994 +Ref: 206b6708994 +Ref: library/decimal module-decimal6708994 +Ref: 346708994 +Ref: decimal — Decimal fixed point and floating point arithmetic-Footnote-16714117 +Ref: decimal — Decimal fixed point and floating point arithmetic-Footnote-26714184 +Node: Quick-start Tutorial6714237 +Ref: library/decimal decimal-tutorial6714379 +Ref: 207b6714379 +Ref: library/decimal quick-start-tutorial6714379 +Ref: 207c6714379 +Node: Decimal objects6721599 +Ref: library/decimal decimal-decimal6721765 +Ref: 207f6721765 +Ref: library/decimal decimal-objects6721765 +Ref: 20806721765 +Ref: library/decimal decimal Decimal6721814 +Ref: 3bd6721814 +Ref: library/decimal decimal Decimal adjusted6726940 +Ref: 20816726940 +Ref: library/decimal decimal Decimal as_integer_ratio6727291 +Ref: 9056727291 +Ref: library/decimal decimal Decimal as_tuple6727730 +Ref: 20826727730 +Ref: library/decimal decimal Decimal canonical6727888 +Ref: 20836727888 +Ref: library/decimal decimal Decimal compare6728127 +Ref: 20846728127 +Ref: library/decimal decimal Decimal compare_signal6728560 +Ref: 20856728560 +Ref: library/decimal decimal Decimal compare_total6728872 +Ref: 20866728872 +Ref: library/decimal decimal Decimal compare_total_mag6730149 +Ref: 20876730149 +Ref: library/decimal decimal Decimal conjugate6730754 +Ref: 20886730754 +Ref: library/decimal decimal Decimal copy_abs6730887 +Ref: 20896730887 +Ref: library/decimal decimal Decimal copy_negate6731101 +Ref: 208a6731101 +Ref: library/decimal decimal Decimal copy_sign6731312 +Ref: 208b6731312 +Ref: library/decimal decimal Decimal exp6731849 +Ref: d566731849 +Ref: library/decimal decimal Decimal from_float6732283 +Ref: eb36732283 +Ref: library/decimal decimal Decimal fma6733421 +Ref: 208c6733421 +Ref: library/decimal decimal Decimal is_canonical6733665 +Ref: 208d6733665 +Ref: library/decimal decimal Decimal is_finite6733940 +Ref: 208e6733940 +Ref: library/decimal decimal Decimal is_infinite6734115 +Ref: 208f6734115 +Ref: library/decimal decimal Decimal is_nan6734282 +Ref: 20906734282 +Ref: library/decimal decimal Decimal is_normal6734434 +Ref: 20916734434 +Ref: library/decimal decimal Decimal is_qnan6734658 +Ref: 20926734658 +Ref: library/decimal decimal Decimal is_signed6734797 +Ref: 20936734797 +Ref: library/decimal decimal Decimal is_snan6735000 +Ref: 20946735000 +Ref: library/decimal decimal Decimal is_subnormal6735142 +Ref: 20956735142 +Ref: library/decimal decimal Decimal is_zero6735296 +Ref: 20966735296 +Ref: library/decimal decimal Decimal ln6735452 +Ref: d576735452 +Ref: library/decimal decimal Decimal log106735660 +Ref: 20976735660 +Ref: library/decimal decimal Decimal logb6735863 +Ref: 20986735863 +Ref: library/decimal decimal Decimal logical_and6736250 +Ref: 20996736250 +Ref: library/decimal decimal Decimal logical_invert6736515 +Ref: 209b6736515 +Ref: library/decimal decimal Decimal logical_or6736694 +Ref: 209c6736694 +Ref: library/decimal decimal Decimal logical_xor6736956 +Ref: 209d6736956 +Ref: library/decimal decimal Decimal max6737224 +Ref: 209e6737224 +Ref: library/decimal decimal Decimal max_mag6737528 +Ref: 209f6737528 +Ref: library/decimal decimal Decimal min6737709 +Ref: 20a06737709 +Ref: library/decimal decimal Decimal min_mag6738013 +Ref: 20a16738013 +Ref: library/decimal decimal Decimal next_minus6738194 +Ref: 20a26738194 +Ref: library/decimal decimal Decimal next_plus6738432 +Ref: 20a36738432 +Ref: library/decimal decimal Decimal next_toward6738669 +Ref: 20a46738669 +Ref: library/decimal decimal Decimal normalize6739036 +Ref: 20a56739036 +Ref: library/decimal decimal Decimal number_class6739492 +Ref: 20a66739492 +Ref: library/decimal decimal Decimal quantize6740662 +Ref: d5a6740662 +Ref: library/decimal decimal Decimal radix6741955 +Ref: 20a76741955 +Ref: library/decimal decimal Decimal remainder_near6742172 +Ref: 20a86742172 +Ref: library/decimal decimal Decimal rotate6743016 +Ref: 20a96743016 +Ref: library/decimal decimal Decimal same_quantum6743689 +Ref: 20aa6743689 +Ref: library/decimal decimal Decimal scaleb6744101 +Ref: 20ab6744101 +Ref: library/decimal decimal Decimal shift6744352 +Ref: 20ac6744352 +Ref: library/decimal decimal Decimal sqrt6744958 +Ref: 20ad6744958 +Ref: library/decimal decimal Decimal to_eng_string6745065 +Ref: 20ae6745065 +Ref: library/decimal decimal Decimal to_integral6745541 +Ref: 20af6745541 +Ref: library/decimal decimal Decimal to_integral_exact6745771 +Ref: 20b16745771 +Ref: library/decimal decimal Decimal to_integral_value6746201 +Ref: 20b06746201 +Node: Logical operands6746555 +Ref: library/decimal logical-operands6746623 +Ref: 20b26746623 +Ref: library/decimal logical-operands-label6746623 +Ref: 209a6746623 +Node: Context objects6746970 +Ref: library/decimal context-objects6747128 +Ref: 20b36747128 +Ref: library/decimal decimal-context6747128 +Ref: 20b46747128 +Ref: library/decimal decimal getcontext6747512 +Ref: 207d6747512 +Ref: library/decimal decimal setcontext6747605 +Ref: 207e6747605 +Ref: library/decimal decimal localcontext6747839 +Ref: 11ea6747839 +Ref: library/decimal decimal BasicContext6749458 +Ref: d526749458 +Ref: library/decimal decimal ExtendedContext6749910 +Ref: d536749910 +Ref: library/decimal decimal DefaultContext6750543 +Ref: d516750543 +Ref: library/decimal decimal Context6751645 +Ref: d596751645 +Ref: library/decimal decimal Context clear_flags6754564 +Ref: 20b96754564 +Ref: library/decimal decimal Context clear_traps6754644 +Ref: 20ba6754644 +Ref: library/decimal decimal Context copy6754755 +Ref: 20bb6754755 +Ref: library/decimal decimal Context copy_decimal6754827 +Ref: 20bc6754827 +Ref: library/decimal decimal Context create_decimal6754918 +Ref: d556754918 +Ref: library/decimal decimal Context create_decimal_from_float6756022 +Ref: 20bd6756022 +Ref: library/decimal decimal Context Etiny6756785 +Ref: 20be6756785 +Ref: library/decimal decimal Context Etop6757015 +Ref: 20bf6757015 +Ref: library/decimal decimal Context abs6757521 +Ref: 20c06757521 +Ref: library/decimal decimal Context add6757593 +Ref: 20c16757593 +Ref: library/decimal decimal Context canonical6757664 +Ref: fab6757664 +Ref: library/decimal decimal Context compare6757744 +Ref: 20c26757744 +Ref: library/decimal decimal Context compare_signal6757822 +Ref: 20c36757822 +Ref: library/decimal decimal Context compare_total6757926 +Ref: 20c46757926 +Ref: library/decimal decimal Context compare_total_mag6758035 +Ref: 20c56758035 +Ref: library/decimal decimal Context copy_abs6758173 +Ref: 20c66758173 +Ref: library/decimal decimal Context copy_negate6758261 +Ref: 20c76758261 +Ref: library/decimal decimal Context copy_sign6758352 +Ref: 20c86758352 +Ref: library/decimal decimal Context divide6758431 +Ref: 20c96758431 +Ref: library/decimal decimal Context divide_int6758501 +Ref: 20ca6758501 +Ref: library/decimal decimal Context divmod6758600 +Ref: 20cb6758600 +Ref: library/decimal decimal Context exp6758717 +Ref: 20cc6758717 +Ref: library/decimal decimal Context fma6758776 +Ref: 20cd6758776 +Ref: library/decimal decimal Context is_canonical6758860 +Ref: fac6758860 +Ref: library/decimal decimal Context is_finite6758977 +Ref: 20ce6758977 +Ref: library/decimal decimal Context is_infinite6759088 +Ref: 20cf6759088 +Ref: library/decimal decimal Context is_nan6759203 +Ref: 20d06759203 +Ref: library/decimal decimal Context is_normal6759329 +Ref: 20d16759329 +Ref: library/decimal decimal Context is_qnan6759459 +Ref: 20d26759459 +Ref: library/decimal decimal Context is_signed6759583 +Ref: 20d36759583 +Ref: library/decimal decimal Context is_snan6759696 +Ref: 20d46759696 +Ref: library/decimal decimal Context is_subnormal6759824 +Ref: 20d56759824 +Ref: library/decimal decimal Context is_zero6759941 +Ref: 20d66759941 +Ref: library/decimal decimal Context ln6760050 +Ref: 20d76760050 +Ref: library/decimal decimal Context log106760133 +Ref: 20d86760133 +Ref: library/decimal decimal Context logb6760210 +Ref: 20d96760210 +Ref: library/decimal decimal Context logical_and6760310 +Ref: 20da6760310 +Ref: library/decimal decimal Context logical_invert6760437 +Ref: 20db6760437 +Ref: library/decimal decimal Context logical_or6760515 +Ref: 20dc6760515 +Ref: library/decimal decimal Context logical_xor6760640 +Ref: 20dd6760640 +Ref: library/decimal decimal Context max6760767 +Ref: 20de6760767 +Ref: library/decimal decimal Context max_mag6760864 +Ref: 20df6760864 +Ref: library/decimal decimal Context min6760965 +Ref: 20e06760965 +Ref: library/decimal decimal Context min_mag6761062 +Ref: 20e16761062 +Ref: library/decimal decimal Context minus6761163 +Ref: 20e26761163 +Ref: library/decimal decimal Context multiply6761276 +Ref: 20e36761276 +Ref: library/decimal decimal Context next_minus6761356 +Ref: 20e46761356 +Ref: library/decimal decimal Context next_plus6761459 +Ref: 20e56761459 +Ref: library/decimal decimal Context next_toward6761561 +Ref: 20e66761561 +Ref: library/decimal decimal Context normalize6761670 +Ref: 20e76761670 +Ref: library/decimal decimal Context number_class6761747 +Ref: 20e86761747 +Ref: library/decimal decimal Context plus6761836 +Ref: 20e96761836 +Ref: library/decimal decimal Context power6762053 +Ref: 20ea6762053 +Ref: library/decimal decimal Context quantize6763888 +Ref: 20eb6763888 +Ref: library/decimal decimal Context radix6764011 +Ref: 20ec6764011 +Ref: library/decimal decimal Context remainder6764089 +Ref: 20ed6764089 +Ref: library/decimal decimal Context remainder_near6764284 +Ref: 20ee6764284 +Ref: library/decimal decimal Context rotate6764504 +Ref: 20ef6764504 +Ref: library/decimal decimal Context same_quantum6764589 +Ref: 20f06764589 +Ref: library/decimal decimal Context scaleb6764701 +Ref: 20f16764701 +Ref: library/decimal decimal Context shift6764819 +Ref: 20f26764819 +Ref: library/decimal decimal Context sqrt6764903 +Ref: 20f36764903 +Ref: library/decimal decimal Context subtract6765000 +Ref: 20f46765000 +Ref: library/decimal decimal Context to_eng_string6765088 +Ref: 20f56765088 +Ref: library/decimal decimal Context to_integral_exact6765452 +Ref: 20f66765452 +Ref: library/decimal decimal Context to_sci_string6765525 +Ref: 20f76765525 +Node: Constants<4>6765629 +Ref: library/decimal constants6765786 +Ref: 20f86765786 +Ref: library/decimal decimal-rounding-modes6765786 +Ref: 20f96765786 +Ref: library/decimal decimal MAX_PREC6766223 +Ref: 20b56766223 +Ref: library/decimal decimal MAX_EMAX6766358 +Ref: 20b86766358 +Ref: library/decimal decimal MIN_EMIN6766493 +Ref: 20b76766493 +Ref: library/decimal decimal MIN_ETINY6766629 +Ref: 20fa6766629 +Ref: library/decimal decimal HAVE_THREADS6766757 +Ref: d4f6766757 +Ref: library/decimal decimal HAVE_CONTEXTVAR6766908 +Ref: 17b36766908 +Node: Rounding modes6767291 +Ref: library/decimal rounding-modes6767440 +Ref: 20b66767440 +Ref: library/decimal decimal ROUND_CEILING6767487 +Ref: 206c6767487 +Ref: library/decimal decimal ROUND_DOWN6767556 +Ref: 206d6767556 +Ref: library/decimal decimal ROUND_FLOOR6767612 +Ref: 206e6767612 +Ref: library/decimal decimal ROUND_HALF_DOWN6767680 +Ref: 206f6767680 +Ref: library/decimal decimal ROUND_HALF_EVEN6767768 +Ref: 20706767768 +Ref: library/decimal decimal ROUND_HALF_UP6767867 +Ref: 20716767867 +Ref: library/decimal decimal ROUND_UP6767955 +Ref: 20726767955 +Ref: library/decimal decimal ROUND_05UP6768011 +Ref: 20736768011 +Node: Signals6768169 +Ref: library/decimal decimal-signals6768326 +Ref: 20fb6768326 +Ref: library/decimal signals6768326 +Ref: 20fc6768326 +Ref: library/decimal decimal Clamped6769043 +Ref: 20746769043 +Ref: library/decimal decimal DecimalException6769337 +Ref: 20fd6769337 +Ref: library/decimal decimal DivisionByZero6769461 +Ref: 20756769461 +Ref: library/decimal decimal Inexact6769799 +Ref: 20766769799 +Ref: library/decimal decimal InvalidOperation6770074 +Ref: d546770074 +Ref: library/decimal decimal Overflow6770515 +Ref: 20796770515 +Ref: library/decimal decimal Rounded6770918 +Ref: 20776770918 +Ref: library/decimal decimal Subnormal6771256 +Ref: 20786771256 +Ref: library/decimal decimal Underflow6771478 +Ref: 207a6771478 +Ref: library/decimal decimal FloatOperation6771703 +Ref: d4e6771703 +Node: Floating Point Notes6772975 +Ref: library/decimal decimal-notes6773138 +Ref: 20fe6773138 +Ref: library/decimal floating-point-notes6773138 +Ref: 20ff6773138 +Node: Mitigating round-off error with increased precision6773282 +Ref: library/decimal mitigating-round-off-error-with-increased-precision6773413 +Ref: 21006773413 +Node: Special values6775102 +Ref: library/decimal special-values6775233 +Ref: 21016775233 +Node: Working with threads6778354 +Ref: library/decimal decimal-threads6778517 +Ref: 21026778517 +Ref: library/decimal working-with-threads6778517 +Ref: 21036778517 +Node: Recipes6779890 +Ref: library/decimal decimal-recipes6780044 +Ref: 21046780044 +Ref: library/decimal recipes6780044 +Ref: 21056780044 +Node: Decimal FAQ6784889 +Ref: library/decimal decimal-faq6785014 +Ref: 21066785014 +Ref: library/decimal id16785014 +Ref: 21076785014 +Ref: Decimal FAQ-Footnote-16793044 +Ref: Decimal FAQ-Footnote-26793111 +Ref: Decimal FAQ-Footnote-36793140 +Ref: Decimal FAQ-Footnote-46793198 +Ref: Decimal FAQ-Footnote-56793301 +Node: fractions — Rational numbers6793411 +Ref: library/fractions doc6793630 +Ref: 21086793630 +Ref: library/fractions fractions-rational-numbers6793630 +Ref: 21096793630 +Ref: library/fractions module-fractions6793630 +Ref: 7d6793630 +Ref: library/fractions fractions Fraction6794010 +Ref: 2106794010 +Ref: library/fractions fractions Fraction numerator6797839 +Ref: 210b6797839 +Ref: library/fractions fractions Fraction denominator6797923 +Ref: 210c6797923 +Ref: library/fractions fractions Fraction as_integer_ratio6798011 +Ref: 210d6798011 +Ref: library/fractions fractions Fraction from_float6798203 +Ref: eb46798203 +Ref: library/fractions fractions Fraction from_decimal6798656 +Ref: eb56798656 +Ref: library/fractions fractions Fraction limit_denominator6799029 +Ref: 210a6799029 +Ref: library/fractions fractions Fraction __floor__6799903 +Ref: 210e6799903 +Ref: library/fractions fractions Fraction __ceil__6800204 +Ref: 210f6800204 +Ref: library/fractions fractions Fraction __round__6800395 +Ref: 21106800395 +Ref: fractions — Rational numbers-Footnote-16801008 +Ref: fractions — Rational numbers-Footnote-26801077 +Node: random — Generate pseudo-random numbers6801119 +Ref: library/random doc6801325 +Ref: 21116801325 +Ref: library/random module-random6801325 +Ref: d96801325 +Ref: library/random random-generate-pseudo-random-numbers6801325 +Ref: 21126801325 +Ref: random — Generate pseudo-random numbers-Footnote-16804361 +Ref: random — Generate pseudo-random numbers-Footnote-26804427 +Node: Bookkeeping functions6804480 +Ref: library/random bookkeeping-functions6804607 +Ref: 21146804607 +Ref: library/random random seed6804668 +Ref: f2c6804668 +Ref: library/random random getstate6805751 +Ref: 21156805751 +Ref: library/random random setstate6805949 +Ref: 21166805949 +Node: Functions for bytes6806227 +Ref: library/random functions-for-bytes6806385 +Ref: 21176806385 +Ref: library/random random randbytes6806442 +Ref: 13806806442 +Node: Functions for integers6806660 +Ref: library/random functions-for-integers6806820 +Ref: 21196806820 +Ref: library/random random randrange6806883 +Ref: 46e6806883 +Ref: library/random random randint6808079 +Ref: ee86808079 +Ref: library/random random getrandbits6808220 +Ref: cb06808220 +Node: Functions for sequences6808660 +Ref: library/random functions-for-sequences6808826 +Ref: 211a6808826 +Ref: library/random random choice6808891 +Ref: ee96808891 +Ref: library/random random choices6809047 +Ref: 9356809047 +Ref: library/random random shuffle6811096 +Ref: 3166811096 +Ref: library/random random sample6811784 +Ref: 3156811784 +Node: Real-valued distributions6813321 +Ref: library/random id16813486 +Ref: 211b6813486 +Ref: library/random real-valued-distributions6813486 +Ref: 211c6813486 +Ref: library/random random random6813825 +Ref: 3176813825 +Ref: library/random random uniform6813938 +Ref: 211d6813938 +Ref: library/random random triangular6814277 +Ref: 211e6814277 +Ref: library/random random betavariate6814634 +Ref: 211f6814634 +Ref: library/random random expovariate6814822 +Ref: 21206814822 +Ref: library/random random gammavariate6815201 +Ref: 21216815201 +Ref: library/random random gauss6815603 +Ref: 12356815603 +Ref: library/random random lognormvariate6816352 +Ref: 21226816352 +Ref: library/random random normalvariate6816651 +Ref: 12366816651 +Ref: library/random random vonmisesvariate6816878 +Ref: 21236816878 +Ref: library/random random paretovariate6817220 +Ref: 21246817220 +Ref: library/random random weibullvariate6817324 +Ref: 21256817324 +Node: Alternative Generator6817475 +Ref: library/random alternative-generator6817641 +Ref: 21266817641 +Ref: library/random random Random6817702 +Ref: 12a56817702 +Ref: library/random random SystemRandom6818068 +Ref: 21136818068 +Node: Notes on Reproducibility6818565 +Ref: library/random notes-on-reproducibility6818717 +Ref: 21276818717 +Node: Examples<4>6819415 +Ref: library/random examples6819556 +Ref: 21286819556 +Ref: library/random random-examples6819556 +Ref: e8c6819556 +Ref: Examples<4>-Footnote-16824918 +Ref: Examples<4>-Footnote-26824983 +Ref: Examples<4>-Footnote-36825064 +Ref: Examples<4>-Footnote-46825110 +Ref: Examples<4>-Footnote-56825162 +Ref: Examples<4>-Footnote-66825217 +Ref: Examples<4>-Footnote-76825293 +Ref: Examples<4>-Footnote-86825329 +Ref: Examples<4>-Footnote-96825408 +Node: Recipes<2>6825444 +Ref: library/random recipes6825552 +Ref: 21296825552 +Ref: Recipes<2>-Footnote-16827482 +Node: statistics — Mathematical statistics functions6827550 +Ref: library/statistics doc6827717 +Ref: 212a6827717 +Ref: library/statistics module-statistics6827717 +Ref: f26827717 +Ref: library/statistics statistics-mathematical-statistics-functions6827717 +Ref: 212b6827717 +Ref: statistics — Mathematical statistics functions-Footnote-16830218 +Ref: statistics — Mathematical statistics functions-Footnote-26830288 +Ref: statistics — Mathematical statistics functions-Footnote-36830314 +Node: Averages and measures of central location6830345 +Ref: library/statistics averages-and-measures-of-central-location6830498 +Ref: 212c6830498 +Node: Measures of spread6832046 +Ref: library/statistics measures-of-spread6832251 +Ref: 21316832251 +Node: Statistics for relations between two inputs6832877 +Ref: library/statistics statistics-for-relations-between-two-inputs6833057 +Ref: 21346833057 +Node: Function details6833629 +Ref: library/statistics function-details6833804 +Ref: 21356833804 +Ref: library/statistics statistics mean6834006 +Ref: 29b6834006 +Ref: library/statistics statistics fmean6835555 +Ref: 6816835555 +Ref: library/statistics statistics geometric_mean6836504 +Ref: 6826836504 +Ref: library/statistics statistics harmonic_mean6837191 +Ref: 94f6837191 +Ref: library/statistics statistics median6838744 +Ref: 212d6838744 +Ref: library/statistics statistics median_low6839739 +Ref: 212e6839739 +Ref: library/statistics statistics median_high6840380 +Ref: 212f6840380 +Ref: library/statistics statistics median_grouped6841018 +Ref: 21306841018 +Ref: library/statistics statistics mode6842677 +Ref: 6ea6842677 +Ref: library/statistics statistics multimode6843843 +Ref: 6836843843 +Ref: library/statistics statistics pstdev6844262 +Ref: 21326844262 +Ref: library/statistics statistics pvariance6844562 +Ref: 21336844562 +Ref: library/statistics statistics stdev6846827 +Ref: 29d6846827 +Ref: library/statistics statistics variance6847118 +Ref: 29c6847118 +Ref: library/statistics statistics quantiles6849383 +Ref: 6846849383 +Ref: library/statistics statistics covariance6852115 +Ref: 4236852115 +Ref: library/statistics statistics correlation6852734 +Ref: 4246852734 +Ref: library/statistics statistics linear_regression6853536 +Ref: 4256853536 +Ref: Function details-Footnote-16855362 +Ref: Function details-Footnote-26855408 +Ref: Function details-Footnote-36855463 +Ref: Function details-Footnote-46855558 +Ref: Function details-Footnote-56855638 +Ref: Function details-Footnote-66855708 +Ref: Function details-Footnote-76855771 +Node: Exceptions<5>6855828 +Ref: library/statistics exceptions6855978 +Ref: 21376855978 +Ref: library/statistics statistics StatisticsError6856049 +Ref: 21366856049 +Node: NormalDist objects6856173 +Ref: library/statistics normaldist-objects6856298 +Ref: 21386856298 +Ref: library/statistics statistics NormalDist6856686 +Ref: 6856856686 +Ref: library/statistics statistics NormalDist mean6856951 +Ref: 21396856951 +Ref: library/statistics statistics NormalDist median6857072 +Ref: 213a6857072 +Ref: library/statistics statistics NormalDist mode6857186 +Ref: 213b6857186 +Ref: library/statistics statistics NormalDist stdev6857286 +Ref: 213c6857286 +Ref: library/statistics statistics NormalDist variance6857411 +Ref: 213d6857411 +Ref: library/statistics statistics NormalDist from_samples6857577 +Ref: 213e6857577 +Ref: library/statistics statistics NormalDist samples6858184 +Ref: 213f6858184 +Ref: library/statistics statistics NormalDist pdf6858589 +Ref: 21406858589 +Ref: library/statistics statistics NormalDist cdf6859190 +Ref: 21416859190 +Ref: library/statistics statistics NormalDist inv_cdf6859433 +Ref: 21426859433 +Ref: library/statistics statistics NormalDist overlap6859872 +Ref: 21436859872 +Ref: library/statistics statistics NormalDist quantiles6860128 +Ref: 21446860128 +Ref: library/statistics statistics NormalDist zscore6860583 +Ref: 21456860583 +Ref: NormalDist objects-Footnote-16862050 +Ref: NormalDist objects-Footnote-26862114 +Ref: NormalDist objects-Footnote-36862174 +Ref: NormalDist objects-Footnote-46862228 +Ref: NormalDist objects-Footnote-56862285 +Ref: NormalDist objects-Footnote-66862339 +Ref: NormalDist objects-Footnote-76862384 +Ref: NormalDist objects-Footnote-86862440 +Ref: NormalDist objects-Footnote-96862497 +Ref: NormalDist objects-Footnote-106862544 +Ref: NormalDist objects-Footnote-116862612 +Ref: NormalDist objects-Footnote-126862684 +Ref: NormalDist objects-Footnote-136862741 +Ref: NormalDist objects-Footnote-146862876 +Ref: NormalDist objects-Footnote-156862923 +Ref: NormalDist objects-Footnote-166863001 +Node: NormalDist Examples and Recipes6863086 +Ref: library/statistics normaldist-examples-and-recipes6863172 +Ref: 21466863172 +Ref: NormalDist Examples and Recipes-Footnote-16867742 +Ref: NormalDist Examples and Recipes-Footnote-26867813 +Ref: NormalDist Examples and Recipes-Footnote-36867860 +Ref: NormalDist Examples and Recipes-Footnote-46867905 +Ref: NormalDist Examples and Recipes-Footnote-56867962 +Ref: NormalDist Examples and Recipes-Footnote-66868026 +Ref: NormalDist Examples and Recipes-Footnote-76868110 +Ref: NormalDist Examples and Recipes-Footnote-86868166 +Node: Functional Programming Modules6868236 +Ref: library/functional doc6868405 +Ref: 21476868405 +Ref: library/functional functional-programming-modules6868405 +Ref: 21486868405 +Node: itertools — Functions creating iterators for efficient looping6868888 +Ref: library/itertools doc6869099 +Ref: 21496869099 +Ref: library/itertools itertools-functions-creating-iterators-for-efficient-looping6869099 +Ref: 214a6869099 +Ref: library/itertools module-itertools6869099 +Ref: a16869099 +Node: Itertool functions6879899 +Ref: library/itertools itertool-functions6880044 +Ref: 21516880044 +Ref: library/itertools itertools-functions6880044 +Ref: 21526880044 +Ref: library/itertools itertools accumulate6880291 +Ref: 6436880291 +Ref: library/itertools itertools chain6883809 +Ref: 1bc86883809 +Ref: library/itertools itertools chain from_iterable6884319 +Ref: 214c6884319 +Ref: library/itertools itertools combinations6884758 +Ref: fb16884758 +Ref: library/itertools itertools combinations_with_replacement6886732 +Ref: f3b6886732 +Ref: library/itertools itertools compress6888711 +Ref: f3c6888711 +Ref: library/itertools itertools count6889227 +Ref: f3d6889227 +Ref: library/itertools itertools cycle6890072 +Ref: 214b6890072 +Ref: library/itertools itertools dropwhile6890792 +Ref: 214d6890792 +Ref: library/itertools itertools filterfalse6891493 +Ref: 1bad6891493 +Ref: library/itertools itertools groupby6892060 +Ref: 214e6892060 +Ref: library/itertools itertools islice6894796 +Ref: 7a56894796 +Ref: library/itertools itertools pairwise6896884 +Ref: 4076896884 +Ref: library/itertools itertools permutations6897426 +Ref: 13206897426 +Ref: library/itertools itertools product6899872 +Ref: fb26899872 +Ref: library/itertools itertools repeat6901455 +Ref: 14f36901455 +Ref: library/itertools itertools starmap6902325 +Ref: d8e6902325 +Ref: library/itertools itertools takewhile6903011 +Ref: 214f6903011 +Ref: library/itertools itertools tee6903453 +Ref: 21506903453 +Ref: library/itertools itertools zip_longest6905182 +Ref: f4c6905182 +Ref: Itertool functions-Footnote-16906658 +Node: Itertools Recipes6906716 +Ref: library/itertools id16906861 +Ref: 21546906861 +Ref: library/itertools itertools-recipes6906861 +Ref: f1a6906861 +Ref: Itertools Recipes-Footnote-16919470 +Node: functools — Higher-order functions and operations on callable objects6919519 +Ref: library/functools doc6919783 +Ref: 21556919783 +Ref: library/functools functools-higher-order-functions-and-operations-on-callable-objects6919783 +Ref: 21566919783 +Ref: library/functools module-functools6919783 +Ref: 7f6919783 +Ref: library/functools functools cache6920326 +Ref: 1f7d6920326 +Ref: library/functools functools cached_property6921176 +Ref: 6336921176 +Ref: library/functools functools cmp_to_key6923730 +Ref: e8a6923730 +Ref: library/functools functools lru_cache6924775 +Ref: 6326924775 +Ref: library/functools functools total_ordering6929857 +Ref: bdc6929857 +Ref: library/functools functools partial6932060 +Ref: b5b6932060 +Ref: library/functools functools partialmethod6933443 +Ref: 6cd6933443 +Ref: library/functools functools reduce6935179 +Ref: f806935179 +Ref: library/functools functools singledispatch6936386 +Ref: 2126936386 +Ref: library/functools functools singledispatchmethod6941975 +Ref: 6346941975 +Ref: library/functools functools update_wrapper6943687 +Ref: cce6943687 +Ref: library/functools functools wraps6946134 +Ref: bf86946134 +Ref: functools — Higher-order functions and operations on callable objects-Footnote-16947432 +Ref: functools — Higher-order functions and operations on callable objects-Footnote-26947501 +Ref: functools — Higher-order functions and operations on callable objects-Footnote-36947551 +Ref: functools — Higher-order functions and operations on callable objects-Footnote-46947593 +Ref: functools — Higher-order functions and operations on callable objects-Footnote-56947685 +Ref: functools — Higher-order functions and operations on callable objects-Footnote-66947740 +Ref: functools — Higher-order functions and operations on callable objects-Footnote-76947798 +Node: partial Objects6947863 +Ref: library/functools id16947986 +Ref: 215a6947986 +Ref: library/functools partial-objects6947986 +Ref: 21586947986 +Ref: library/functools functools partial func6948167 +Ref: 215b6948167 +Ref: library/functools functools partial args6948356 +Ref: 215c6948356 +Ref: library/functools functools partial keywords6948528 +Ref: 215d6948528 +Node: operator — Standard operators as functions6949090 +Ref: library/operator doc6949281 +Ref: 215e6949281 +Ref: library/operator module-operator6949281 +Ref: c06949281 +Ref: library/operator operator-standard-operators-as-functions6949281 +Ref: 215f6949281 +Ref: library/operator operator lt6950214 +Ref: 21606950214 +Ref: library/operator operator le6950247 +Ref: 21616950247 +Ref: library/operator operator eq6950280 +Ref: 21626950280 +Ref: library/operator operator ne6950313 +Ref: 21636950313 +Ref: library/operator operator ge6950346 +Ref: 21646950346 +Ref: library/operator operator gt6950379 +Ref: 21656950379 +Ref: library/operator operator __lt__6950412 +Ref: 21666950412 +Ref: library/operator operator __le__6950449 +Ref: 21676950449 +Ref: library/operator operator __eq__6950486 +Ref: 21686950486 +Ref: library/operator operator __ne__6950523 +Ref: 21696950523 +Ref: library/operator operator __ge__6950560 +Ref: 216a6950560 +Ref: library/operator operator __gt__6950597 +Ref: 216b6950597 +Ref: library/operator operator not_6951337 +Ref: 216c6951337 +Ref: library/operator operator __not__6951371 +Ref: 216d6951371 +Ref: library/operator operator truth6951680 +Ref: 216e6951680 +Ref: library/operator operator is_6951870 +Ref: 216f6951870 +Ref: library/operator operator is_not6951956 +Ref: 21706951956 +Ref: library/operator operator abs6952113 +Ref: 21716952113 +Ref: library/operator operator __abs__6952146 +Ref: 21726952146 +Ref: library/operator operator add6952226 +Ref: 21736952226 +Ref: library/operator operator __add__6952260 +Ref: 21746952260 +Ref: library/operator operator and_6952350 +Ref: 21756952350 +Ref: library/operator operator __and__6952385 +Ref: 21766952385 +Ref: library/operator operator floordiv6952469 +Ref: 21776952469 +Ref: library/operator operator __floordiv__6952508 +Ref: 21786952508 +Ref: library/operator operator index6952579 +Ref: 13146952579 +Ref: library/operator operator __index__6952612 +Ref: 21796952612 +Ref: library/operator operator inv6952898 +Ref: 217a6952898 +Ref: library/operator operator invert6952931 +Ref: 217b6952931 +Ref: library/operator operator __inv__6952967 +Ref: 217c6952967 +Ref: library/operator operator __invert__6953004 +Ref: 217d6953004 +Ref: library/operator operator lshift6953139 +Ref: 217e6953139 +Ref: library/operator operator __lshift__6953176 +Ref: 217f6953176 +Ref: library/operator operator mod6953256 +Ref: 21806953256 +Ref: library/operator operator __mod__6953290 +Ref: 21816953290 +Ref: library/operator operator mul6953355 +Ref: 21536953355 +Ref: library/operator operator __mul__6953389 +Ref: 21826953389 +Ref: library/operator operator matmul6953479 +Ref: ab96953479 +Ref: library/operator operator __matmul__6953516 +Ref: 21836953516 +Ref: library/operator operator neg6953610 +Ref: 21846953610 +Ref: library/operator operator __neg__6953643 +Ref: 21856953643 +Ref: library/operator operator or_6953722 +Ref: 21866953722 +Ref: library/operator operator __or__6953756 +Ref: 21876953756 +Ref: library/operator operator pos6953838 +Ref: 21886953838 +Ref: library/operator operator __pos__6953871 +Ref: 21896953871 +Ref: library/operator operator pow6953951 +Ref: 218a6953951 +Ref: library/operator operator __pow__6953985 +Ref: 218b6953985 +Ref: library/operator operator rshift6954076 +Ref: 218c6954076 +Ref: library/operator operator __rshift__6954113 +Ref: 218d6954113 +Ref: library/operator operator sub6954194 +Ref: 218e6954194 +Ref: library/operator operator __sub__6954228 +Ref: 218f6954228 +Ref: library/operator operator truediv6954293 +Ref: 21906954293 +Ref: library/operator operator __truediv__6954331 +Ref: 21916954331 +Ref: library/operator operator xor6954480 +Ref: 21926954480 +Ref: library/operator operator __xor__6954514 +Ref: 21936954514 +Ref: library/operator operator concat6954687 +Ref: 21946954687 +Ref: library/operator operator __concat__6954724 +Ref: 21956954724 +Ref: library/operator operator contains6954818 +Ref: 5186954818 +Ref: library/operator operator __contains__6954857 +Ref: 21966954857 +Ref: library/operator operator countOf6954986 +Ref: 51a6954986 +Ref: library/operator operator delitem6955079 +Ref: 21976955079 +Ref: library/operator operator __delitem__6955117 +Ref: 21986955117 +Ref: library/operator operator getitem6955204 +Ref: 21996955204 +Ref: library/operator operator __getitem__6955242 +Ref: 219a6955242 +Ref: library/operator operator indexOf6955329 +Ref: 5196955329 +Ref: library/operator operator setitem6955433 +Ref: 219b6955433 +Ref: library/operator operator __setitem__6955474 +Ref: 219c6955474 +Ref: library/operator operator length_hint6955568 +Ref: c0b6955568 +Ref: library/operator operator call6955900 +Ref: 127b6955900 +Ref: library/operator operator __call__6955954 +Ref: 219d6955954 +Ref: library/operator operator attrgetter6956368 +Ref: ab76956368 +Ref: library/operator operator itemgetter6957669 +Ref: 6b36957669 +Ref: library/operator operator methodcaller6959427 +Ref: ab86959427 +Ref: operator — Standard operators as functions-Footnote-16960226 +Node: Mapping Operators to Functions6960294 +Ref: library/operator mapping-operators-to-functions6960432 +Ref: 219e6960432 +Ref: library/operator operator-map6960432 +Ref: 219f6960432 +Node: In-place Operators6967856 +Ref: library/operator in-place-operators6967994 +Ref: 21a06967994 +Ref: library/operator operator iadd6969302 +Ref: 21a26969302 +Ref: library/operator operator __iadd__6969337 +Ref: 21a36969337 +Ref: library/operator operator iand6969435 +Ref: 21a46969435 +Ref: library/operator operator __iand__6969470 +Ref: 21a56969470 +Ref: library/operator operator iconcat6969568 +Ref: 21a66969568 +Ref: library/operator operator __iconcat__6969606 +Ref: 21a76969606 +Ref: library/operator operator ifloordiv6969741 +Ref: 21a86969741 +Ref: library/operator operator __ifloordiv__6969781 +Ref: 21a96969781 +Ref: library/operator operator ilshift6969890 +Ref: 21aa6969890 +Ref: library/operator operator __ilshift__6969928 +Ref: 21ab6969928 +Ref: library/operator operator imod6970033 +Ref: 21ac6970033 +Ref: library/operator operator __imod__6970068 +Ref: 21ad6970068 +Ref: library/operator operator imul6970166 +Ref: 21ae6970166 +Ref: library/operator operator __imul__6970201 +Ref: 21af6970201 +Ref: library/operator operator imatmul6970299 +Ref: aba6970299 +Ref: library/operator operator __imatmul__6970337 +Ref: 21b06970337 +Ref: library/operator operator ior6970467 +Ref: 21b16970467 +Ref: library/operator operator __ior__6970501 +Ref: 21b26970501 +Ref: library/operator operator ipow6970597 +Ref: 21b36970597 +Ref: library/operator operator __ipow__6970632 +Ref: 21b46970632 +Ref: library/operator operator irshift6970731 +Ref: 21b56970731 +Ref: library/operator operator __irshift__6970769 +Ref: 21b66970769 +Ref: library/operator operator isub6970874 +Ref: 21b76970874 +Ref: library/operator operator __isub__6970909 +Ref: 21b86970909 +Ref: library/operator operator itruediv6971007 +Ref: 21b96971007 +Ref: library/operator operator __itruediv__6971046 +Ref: 21ba6971046 +Ref: library/operator operator ixor6971152 +Ref: 21bb6971152 +Ref: library/operator operator __ixor__6971187 +Ref: 21bc6971187 +Node: File and Directory Access6971285 +Ref: library/filesys doc6971438 +Ref: 21bd6971438 +Ref: library/filesys file-and-directory-access6971438 +Ref: 21be6971438 +Ref: library/filesys filesys6971438 +Ref: 21bf6971438 +Node: pathlib — Object-oriented filesystem paths6972340 +Ref: library/pathlib doc6972496 +Ref: 21c06972496 +Ref: library/pathlib module-pathlib6972496 +Ref: c56972496 +Ref: library/pathlib pathlib-object-oriented-filesystem-paths6972496 +Ref: 21c16972496 +Ref: pathlib — Object-oriented filesystem paths-Footnote-16974217 +Ref: pathlib — Object-oriented filesystem paths-Footnote-26974284 +Node: Basic use6974326 +Ref: library/pathlib basic-use6974435 +Ref: 21c66974435 +Node: Pure paths6975381 +Ref: library/pathlib id16975513 +Ref: 21c76975513 +Ref: library/pathlib pure-paths6975513 +Ref: 21c26975513 +Ref: library/pathlib pathlib PurePath6975728 +Ref: 3066975728 +Ref: library/pathlib pathlib PurePosixPath6978053 +Ref: 21c86978053 +Ref: library/pathlib pathlib PureWindowsPath6978345 +Ref: 21c56978345 +Ref: Pure paths-Footnote-16979098 +Node: General properties6979157 +Ref: library/pathlib general-properties6979243 +Ref: 21c96979243 +Node: Operators<2>6980095 +Ref: library/pathlib operators6980216 +Ref: 21ca6980216 +Node: Accessing individual parts6981426 +Ref: library/pathlib accessing-individual-parts6981551 +Ref: 21cb6981551 +Ref: library/pathlib pathlib PurePath parts6981714 +Ref: 21cc6981714 +Node: Methods and properties6982112 +Ref: library/pathlib methods-and-properties6982216 +Ref: 21cd6982216 +Ref: library/pathlib pathlib PurePath drive6982339 +Ref: 21ce6982339 +Ref: library/pathlib pathlib PurePath root6982757 +Ref: 21cf6982757 +Ref: library/pathlib pathlib PurePath anchor6983799 +Ref: 21d06983799 +Ref: library/pathlib pathlib PurePath parents6984161 +Ref: 4156984161 +Ref: library/pathlib pathlib PurePath parent6984642 +Ref: 21d16984642 +Ref: library/pathlib pathlib PurePath name6985461 +Ref: 21d36985461 +Ref: library/pathlib pathlib PurePath suffix6985849 +Ref: 21d46985849 +Ref: library/pathlib pathlib PurePath suffixes6986142 +Ref: 21d56986142 +Ref: library/pathlib pathlib PurePath stem6986452 +Ref: 21d66986452 +Ref: library/pathlib pathlib PurePath as_posix6986746 +Ref: 21d76986746 +Ref: library/pathlib pathlib PurePath as_uri6987011 +Ref: 21d86987011 +Ref: library/pathlib pathlib PurePath is_absolute6987365 +Ref: 21d96987365 +Ref: library/pathlib pathlib PurePath is_relative_to6987957 +Ref: 21da6987957 +Ref: library/pathlib pathlib PurePath is_reserved6988252 +Ref: 21db6988252 +Ref: library/pathlib pathlib PurePath joinpath6988724 +Ref: 21dc6988724 +Ref: library/pathlib pathlib PurePath match6989301 +Ref: 21dd6989301 +Ref: library/pathlib pathlib PurePath relative_to6990222 +Ref: 21de6990222 +Ref: library/pathlib pathlib PurePath with_name6991089 +Ref: 21df6991089 +Ref: library/pathlib pathlib PurePath with_stem6991803 +Ref: 21e06991803 +Ref: library/pathlib pathlib PurePath with_suffix6992819 +Ref: 147a6992819 +Ref: Methods and properties-Footnote-16993525 +Node: Concrete paths6993617 +Ref: library/pathlib concrete-paths6993780 +Ref: 21c36993780 +Ref: library/pathlib id26993780 +Ref: 21e16993780 +Ref: library/pathlib pathlib Path6994052 +Ref: 65f6994052 +Ref: library/pathlib pathlib PosixPath6994434 +Ref: 21e26994434 +Ref: library/pathlib pathlib WindowsPath6994743 +Ref: 21c46994743 +Node: Methods<2>6995724 +Ref: library/pathlib methods6995785 +Ref: 21e36995785 +Ref: library/pathlib pathlib Path cwd6996392 +Ref: 21e46996392 +Ref: library/pathlib pathlib Path home6996614 +Ref: ac76996614 +Ref: library/pathlib pathlib Path stat6996982 +Ref: 4186996982 +Ref: library/pathlib pathlib Path chmod6997569 +Ref: 4196997569 +Ref: library/pathlib pathlib Path exists6998164 +Ref: 6606998164 +Ref: library/pathlib pathlib Path expanduser6998636 +Ref: ac66998636 +Ref: library/pathlib pathlib Path glob6999039 +Ref: 2396999039 +Ref: library/pathlib pathlib Path group7000288 +Ref: 21e77000288 +Ref: library/pathlib pathlib Path is_dir7000462 +Ref: 6617000462 +Ref: library/pathlib pathlib Path is_file7000803 +Ref: 6627000803 +Ref: library/pathlib pathlib Path is_mount7001151 +Ref: 6637001151 +Ref: library/pathlib pathlib Path is_symlink7001655 +Ref: 6647001655 +Ref: library/pathlib pathlib Path is_socket7001904 +Ref: 6687001904 +Ref: library/pathlib pathlib Path is_fifo7002252 +Ref: 6677002252 +Ref: library/pathlib pathlib Path is_block_device7002579 +Ref: 6657002579 +Ref: library/pathlib pathlib Path is_char_device7002935 +Ref: 6667002935 +Ref: library/pathlib pathlib Path iterdir7003298 +Ref: 12477003298 +Ref: library/pathlib pathlib Path lchmod7004050 +Ref: 21e67004050 +Ref: library/pathlib pathlib Path lstat7004233 +Ref: 21e57004233 +Ref: library/pathlib pathlib Path mkdir7004418 +Ref: ac57004418 +Ref: library/pathlib pathlib Path open7005485 +Ref: 21e87005485 +Ref: library/pathlib pathlib Path owner7005839 +Ref: 21e97005839 +Ref: library/pathlib pathlib Path read_bytes7006012 +Ref: acb7006012 +Ref: library/pathlib pathlib Path read_text7006321 +Ref: ac97006321 +Ref: library/pathlib pathlib Path readlink7006754 +Ref: 5677006754 +Ref: library/pathlib pathlib Path rename7007047 +Ref: 21ea7007047 +Ref: library/pathlib pathlib Path replace7007952 +Ref: 21eb7007952 +Ref: library/pathlib pathlib Path absolute7008472 +Ref: 12487008472 +Ref: library/pathlib pathlib Path resolve7008766 +Ref: 21d27008766 +Ref: library/pathlib pathlib Path rglob7009698 +Ref: 23a7009698 +Ref: library/pathlib pathlib Path rmdir7010373 +Ref: 21ec7010373 +Ref: library/pathlib pathlib Path samefile7010459 +Ref: ac47010459 +Ref: library/pathlib pathlib Path symlink_to7011010 +Ref: 4177011010 +Ref: library/pathlib pathlib Path hardlink_to7011665 +Ref: 4167011665 +Ref: library/pathlib pathlib Path link_to7011904 +Ref: 2f27011904 +Ref: library/pathlib pathlib Path touch7012580 +Ref: 21ed7012580 +Ref: library/pathlib pathlib Path unlink7012998 +Ref: 14227012998 +Ref: library/pathlib pathlib Path write_bytes7013493 +Ref: aca7013493 +Ref: library/pathlib pathlib Path write_text7013874 +Ref: ac87013874 +Node: Correspondence to tools in the os module7014438 +Ref: library/pathlib correspondence-to-tools-in-the-os-module7014582 +Ref: 21ee7014582 +Ref: Correspondence to tools in the os module-Footnote-17019781 +Ref: Correspondence to tools in the os module-Footnote-27019953 +Node: os path — Common pathname manipulations7020097 +Ref: library/os path doc7020322 +Ref: 21f47020322 +Ref: library/os path module-os path7020322 +Ref: c37020322 +Ref: library/os path os-path-common-pathname-manipulations7020322 +Ref: 21f57020322 +Ref: library/os path os path abspath7022307 +Ref: fbb7022307 +Ref: library/os path os path basename7022633 +Ref: 21f17022633 +Ref: library/os path os path commonpath7023144 +Ref: ac17023144 +Ref: library/os path os path commonprefix7023663 +Ref: ac27023663 +Ref: library/os path os path dirname7024311 +Ref: 21f27024311 +Ref: library/os path os path exists7024583 +Ref: 6577024583 +Ref: library/os path os path lexists7025171 +Ref: 6587025171 +Ref: library/os path os path expanduser7025477 +Ref: 65d7025477 +Ref: library/os path os path expandvars7026554 +Ref: 10457026554 +Ref: library/os path os path getatime7027046 +Ref: 21f77027046 +Ref: library/os path os path getmtime7027347 +Ref: 21f87027347 +Ref: library/os path os path getctime7027723 +Ref: 21f97027723 +Ref: library/os path os path getsize7028214 +Ref: 21fa7028214 +Ref: library/os path os path isabs7028444 +Ref: 21f07028444 +Ref: library/os path os path isfile7028753 +Ref: 65a7028753 +Ref: library/os path os path isdir7029058 +Ref: 6597029058 +Ref: library/os path os path islink7029359 +Ref: 6557029359 +Ref: library/os path os path ismount7029663 +Ref: 65b7029663 +Ref: library/os path os path join7030551 +Ref: 13e77030551 +Ref: library/os path os path normcase7031607 +Ref: 21fb7031607 +Ref: library/os path os path normpath7031946 +Ref: fba7031946 +Ref: library/os path os path realpath7032943 +Ref: 4127032943 +Ref: library/os path os path relpath7034054 +Ref: 21ef7034054 +Ref: library/os path os path samefile7034628 +Ref: c0f7034628 +Ref: library/os path os path sameopenfile7035190 +Ref: 21fd7035190 +Ref: library/os path os path samestat7035500 +Ref: c0e7035500 +Ref: library/os path os path split7036053 +Ref: 21f67036053 +Ref: library/os path os path splitdrive7036842 +Ref: 85f7036842 +Ref: library/os path os path splitext7037721 +Ref: 21f37037721 +Ref: library/os path os path supports_unicode_filenames7038683 +Ref: 10ea7038683 +Ref: os path — Common pathname manipulations-Footnote-17038891 +Ref: os path — Common pathname manipulations-Footnote-27038960 +Ref: os path — Common pathname manipulations-Footnote-37039026 +Node: fileinput — Iterate over lines from multiple input streams7039118 +Ref: library/fileinput doc7039333 +Ref: 21fe7039333 +Ref: library/fileinput fileinput-iterate-over-lines-from-multiple-input-streams7039333 +Ref: 21ff7039333 +Ref: library/fileinput module-fileinput7039333 +Ref: 7b7039333 +Ref: library/fileinput fileinput input7041652 +Ref: 3f07041652 +Ref: library/fileinput fileinput filename7042898 +Ref: 22007042898 +Ref: library/fileinput fileinput fileno7043054 +Ref: 22017043054 +Ref: library/fileinput fileinput lineno7043253 +Ref: 22027043253 +Ref: library/fileinput fileinput filelineno7043526 +Ref: 22037043526 +Ref: library/fileinput fileinput isfirstline7043792 +Ref: 22047043792 +Ref: library/fileinput fileinput isstdin7043944 +Ref: 22057043944 +Ref: library/fileinput fileinput nextfile7044087 +Ref: 22067044087 +Ref: library/fileinput fileinput close7044627 +Ref: 22077044627 +Ref: library/fileinput fileinput FileInput7044798 +Ref: 3007044798 +Ref: library/fileinput fileinput hook_compressed7047514 +Ref: 3f17047514 +Ref: library/fileinput fileinput hook_encoded7048315 +Ref: 9137048315 +Ref: fileinput — Iterate over lines from multiple input streams-Footnote-17048917 +Node: stat — Interpreting stat results7048986 +Ref: library/stat doc7049202 +Ref: 22097049202 +Ref: library/stat module-stat7049202 +Ref: f17049202 +Ref: library/stat stat-interpreting-stat-results7049202 +Ref: 220a7049202 +Ref: library/stat stat S_ISDIR7049880 +Ref: 220b7049880 +Ref: library/stat stat S_ISCHR7049970 +Ref: 220c7049970 +Ref: library/stat stat S_ISBLK7050085 +Ref: 220d7050085 +Ref: library/stat stat S_ISREG7050191 +Ref: 220e7050191 +Ref: library/stat stat S_ISFIFO7050284 +Ref: 220f7050284 +Ref: library/stat stat S_ISLNK7050383 +Ref: 22107050383 +Ref: library/stat stat S_ISSOCK7050477 +Ref: 22117050477 +Ref: library/stat stat S_ISDOOR7050565 +Ref: 13e87050565 +Ref: library/stat stat S_ISPORT7050677 +Ref: 13e97050677 +Ref: library/stat stat S_ISWHT7050796 +Ref: 13ea7050796 +Ref: library/stat stat S_IMODE7051001 +Ref: 22127051001 +Ref: library/stat stat S_IFMT7051268 +Ref: 22137051268 +Ref: library/stat stat filemode7052799 +Ref: dfb7052799 +Ref: library/stat stat ST_MODE7053210 +Ref: c587053210 +Ref: library/stat stat ST_INO7053263 +Ref: 22147053263 +Ref: library/stat stat ST_DEV7053306 +Ref: 22157053306 +Ref: library/stat stat ST_NLINK7053360 +Ref: 22167053360 +Ref: library/stat stat ST_UID7053421 +Ref: 22177053421 +Ref: library/stat stat ST_GID7053472 +Ref: 22187053472 +Ref: library/stat stat ST_SIZE7053524 +Ref: 22197053524 +Ref: library/stat stat ST_ATIME7053636 +Ref: 221a7053636 +Ref: library/stat stat ST_MTIME7053688 +Ref: 221b7053688 +Ref: library/stat stat ST_CTIME7053746 +Ref: 221c7053746 +Ref: library/stat stat S_IFSOCK7054788 +Ref: 221d7054788 +Ref: library/stat stat S_IFLNK7054827 +Ref: 221e7054827 +Ref: library/stat stat S_IFREG7054872 +Ref: 221f7054872 +Ref: library/stat stat S_IFBLK7054916 +Ref: 22207054916 +Ref: library/stat stat S_IFDIR7054960 +Ref: 22217054960 +Ref: library/stat stat S_IFCHR7055001 +Ref: 22227055001 +Ref: library/stat stat S_IFIFO7055049 +Ref: 22237055049 +Ref: library/stat stat S_IFDOOR7055085 +Ref: c597055085 +Ref: library/stat stat S_IFPORT7055148 +Ref: c5a7055148 +Ref: library/stat stat S_IFWHT7055217 +Ref: c5b7055217 +Ref: library/stat stat S_ISUID7055535 +Ref: 22247055535 +Ref: library/stat stat S_ISGID7055578 +Ref: 22257055578 +Ref: library/stat stat S_ISVTX7056155 +Ref: 22287056155 +Ref: library/stat stat S_IRWXU7056404 +Ref: 22297056404 +Ref: library/stat stat S_IRUSR7056467 +Ref: 222a7056467 +Ref: library/stat stat S_IWUSR7056524 +Ref: 222b7056524 +Ref: library/stat stat S_IXUSR7056582 +Ref: 222c7056582 +Ref: library/stat stat S_IRWXG7056642 +Ref: 222d7056642 +Ref: library/stat stat S_IRGRP7056700 +Ref: 222e7056700 +Ref: library/stat stat S_IWGRP7056757 +Ref: 222f7056757 +Ref: library/stat stat S_IXGRP7056815 +Ref: 22267056815 +Ref: library/stat stat S_IRWXO7056875 +Ref: 22307056875 +Ref: library/stat stat S_IROTH7056953 +Ref: 22317056953 +Ref: library/stat stat S_IWOTH7057012 +Ref: 22327057012 +Ref: library/stat stat S_IXOTH7057072 +Ref: 22337057072 +Ref: library/stat stat S_ENFMT7057134 +Ref: 22277057134 +Ref: library/stat stat S_IREAD7057367 +Ref: 22347057367 +Ref: library/stat stat S_IWRITE7057438 +Ref: 22357057438 +Ref: library/stat stat S_IEXEC7057510 +Ref: 22367057510 +Ref: library/stat stat UF_NODUMP7057667 +Ref: 22377057667 +Ref: library/stat stat UF_IMMUTABLE7057721 +Ref: 22387057721 +Ref: library/stat stat UF_APPEND7057785 +Ref: 22397057785 +Ref: library/stat stat UF_OPAQUE7057851 +Ref: 223a7057851 +Ref: library/stat stat UF_NOUNLINK7057942 +Ref: 223b7057942 +Ref: library/stat stat UF_COMPRESSED7058016 +Ref: 223c7058016 +Ref: library/stat stat UF_HIDDEN7058097 +Ref: 223d7058097 +Ref: library/stat stat SF_ARCHIVED7058186 +Ref: 223e7058186 +Ref: library/stat stat SF_IMMUTABLE7058246 +Ref: 223f7058246 +Ref: library/stat stat SF_APPEND7058310 +Ref: 22407058310 +Ref: library/stat stat SF_NOUNLINK7058376 +Ref: 22417058376 +Ref: library/stat stat SF_SNAPSHOT7058450 +Ref: 22427058450 +Ref: library/stat stat FILE_ATTRIBUTE_ARCHIVE7058846 +Ref: 22437058846 +Ref: library/stat stat FILE_ATTRIBUTE_COMPRESSED7058884 +Ref: 22447058884 +Ref: library/stat stat FILE_ATTRIBUTE_DEVICE7058925 +Ref: 22457058925 +Ref: library/stat stat FILE_ATTRIBUTE_DIRECTORY7058962 +Ref: 22467058962 +Ref: library/stat stat FILE_ATTRIBUTE_ENCRYPTED7059002 +Ref: 22477059002 +Ref: library/stat stat FILE_ATTRIBUTE_HIDDEN7059042 +Ref: 22487059042 +Ref: library/stat stat FILE_ATTRIBUTE_INTEGRITY_STREAM7059079 +Ref: 22497059079 +Ref: library/stat stat FILE_ATTRIBUTE_NORMAL7059126 +Ref: 224a7059126 +Ref: library/stat stat FILE_ATTRIBUTE_NOT_CONTENT_INDEXED7059163 +Ref: 224b7059163 +Ref: library/stat stat FILE_ATTRIBUTE_NO_SCRUB_DATA7059213 +Ref: 224c7059213 +Ref: library/stat stat FILE_ATTRIBUTE_OFFLINE7059257 +Ref: 224d7059257 +Ref: library/stat stat FILE_ATTRIBUTE_READONLY7059295 +Ref: 224e7059295 +Ref: library/stat stat FILE_ATTRIBUTE_REPARSE_POINT7059334 +Ref: 224f7059334 +Ref: library/stat stat FILE_ATTRIBUTE_SPARSE_FILE7059378 +Ref: 22507059378 +Ref: library/stat stat FILE_ATTRIBUTE_SYSTEM7059420 +Ref: 22517059420 +Ref: library/stat stat FILE_ATTRIBUTE_TEMPORARY7059457 +Ref: 22527059457 +Ref: library/stat stat FILE_ATTRIBUTE_VIRTUAL7059497 +Ref: 22537059497 +Ref: library/stat stat IO_REPARSE_TAG_SYMLINK7059767 +Ref: 22547059767 +Ref: library/stat stat IO_REPARSE_TAG_MOUNT_POINT7059805 +Ref: 22557059805 +Ref: library/stat stat IO_REPARSE_TAG_APPEXECLINK7059847 +Ref: 22567059847 +Ref: stat — Interpreting stat results-Footnote-17059952 +Ref: stat — Interpreting stat results-Footnote-27060016 +Node: filecmp — File and Directory Comparisons7060096 +Ref: library/filecmp doc7060305 +Ref: 22577060305 +Ref: library/filecmp filecmp-file-and-directory-comparisons7060305 +Ref: 22587060305 +Ref: library/filecmp module-filecmp7060305 +Ref: 7a7060305 +Ref: library/filecmp filecmp cmp7060774 +Ref: 12ac7060774 +Ref: library/filecmp filecmp cmpfiles7061567 +Ref: 22597061567 +Ref: library/filecmp filecmp clear_cache7062512 +Ref: bd87062512 +Ref: filecmp — File and Directory Comparisons-Footnote-17062827 +Node: The dircmp class7062894 +Ref: library/filecmp dircmp-objects7062989 +Ref: 225a7062989 +Ref: library/filecmp the-dircmp-class7062989 +Ref: 225b7062989 +Ref: library/filecmp filecmp dircmp7063050 +Ref: bda7063050 +Ref: library/filecmp filecmp dircmp report7063585 +Ref: 225c7063585 +Ref: library/filecmp filecmp dircmp report_partial_closure7063702 +Ref: 225d7063702 +Ref: library/filecmp filecmp dircmp report_full_closure7063843 +Ref: 225e7063843 +Ref: library/filecmp filecmp dircmp left7064356 +Ref: 225f7064356 +Ref: library/filecmp filecmp dircmp right7064412 +Ref: 22607064412 +Ref: library/filecmp filecmp dircmp left_list7064469 +Ref: 22617064469 +Ref: library/filecmp filecmp dircmp right_list7064587 +Ref: 22627064587 +Ref: library/filecmp filecmp dircmp common7064706 +Ref: 22637064706 +Ref: library/filecmp filecmp dircmp left_only7064791 +Ref: 22647064791 +Ref: library/filecmp filecmp dircmp right_only7064871 +Ref: 22657064871 +Ref: library/filecmp filecmp dircmp common_dirs7064952 +Ref: 22667064952 +Ref: library/filecmp filecmp dircmp common_files7065032 +Ref: 22677065032 +Ref: library/filecmp filecmp dircmp common_funny7065104 +Ref: 22687065104 +Ref: library/filecmp filecmp dircmp same_files7065307 +Ref: 22697065307 +Ref: library/filecmp filecmp dircmp diff_files7065453 +Ref: 226a7065453 +Ref: library/filecmp filecmp dircmp funny_files7065618 +Ref: 226b7065618 +Ref: library/filecmp filecmp dircmp subdirs7065736 +Ref: 13227065736 +Ref: library/filecmp filecmp DEFAULT_IGNORES7066194 +Ref: bd97066194 +Node: tempfile — Generate temporary files and directories7066878 +Ref: library/tempfile doc7067099 +Ref: 226c7067099 +Ref: library/tempfile module-tempfile7067099 +Ref: ff7067099 +Ref: library/tempfile tempfile-generate-temporary-files-and-directories7067099 +Ref: 226d7067099 +Ref: library/tempfile tempfile TemporaryFile7068255 +Ref: 226e7068255 +Ref: library/tempfile tempfile NamedTemporaryFile7070419 +Ref: 104a7070419 +Ref: library/tempfile tempfile SpooledTemporaryFile7071721 +Ref: e037071721 +Ref: library/tempfile tempfile TemporaryDirectory7073151 +Ref: ef17073151 +Ref: library/tempfile tempfile mkstemp7074720 +Ref: 226f7074720 +Ref: library/tempfile tempfile mkdtemp7077603 +Ref: 22707077603 +Ref: library/tempfile tempfile gettempdir7078718 +Ref: 12e17078718 +Ref: library/tempfile tempfile gettempdirb7079902 +Ref: 12e27079902 +Ref: library/tempfile tempfile gettempprefix7080041 +Ref: 22737080041 +Ref: library/tempfile tempfile gettempprefixb7080200 +Ref: 22747080200 +Ref: library/tempfile tempfile tempdir7080777 +Ref: 12e07080777 +Ref: tempfile — Generate temporary files and directories-Footnote-17081893 +Node: Examples<5>7081961 +Ref: library/tempfile examples7082105 +Ref: 22757082105 +Ref: library/tempfile tempfile-examples7082105 +Ref: 22717082105 +Node: Deprecated functions and variables7083022 +Ref: library/tempfile deprecated-functions-and-variables7083166 +Ref: 22767083166 +Ref: library/tempfile tempfile-mktemp-deprecated7083166 +Ref: 22777083166 +Ref: library/tempfile tempfile mktemp7083796 +Ref: 128a7083796 +Node: glob — Unix style pathname pattern expansion7084930 +Ref: library/glob doc7085151 +Ref: 22787085151 +Ref: library/glob glob-unix-style-pathname-pattern-expansion7085151 +Ref: 22797085151 +Ref: library/glob module-glob7085151 +Ref: 847085151 +Ref: library/glob glob glob7086315 +Ref: 3f87086315 +Ref: library/glob glob iglob7088479 +Ref: 3f97088479 +Ref: library/glob glob escape7089228 +Ref: be07089228 +Ref: glob — Unix style pathname pattern expansion-Footnote-17090682 +Node: fnmatch — Unix filename pattern matching7090746 +Ref: library/fnmatch doc7090955 +Ref: 227a7090955 +Ref: library/fnmatch fnmatch-unix-filename-pattern-matching7090955 +Ref: 227b7090955 +Ref: library/fnmatch module-fnmatch7090955 +Ref: 7c7090955 +Ref: library/fnmatch fnmatch fnmatch7092510 +Ref: 129d7092510 +Ref: library/fnmatch fnmatch fnmatchcase7093197 +Ref: 129e7093197 +Ref: library/fnmatch fnmatch filter7093444 +Ref: 129f7093444 +Ref: library/fnmatch fnmatch translate7093692 +Ref: 14847093692 +Ref: fnmatch — Unix filename pattern matching-Footnote-17094272 +Node: linecache — Random access to text lines7094339 +Ref: library/linecache doc7094539 +Ref: 227c7094539 +Ref: library/linecache linecache-random-access-to-text-lines7094539 +Ref: 227d7094539 +Ref: library/linecache module-linecache7094539 +Ref: a67094539 +Ref: library/linecache linecache getline7095369 +Ref: aa77095369 +Ref: library/linecache linecache clearcache7096138 +Ref: 22807096138 +Ref: library/linecache linecache checkcache7096307 +Ref: 22817096307 +Ref: library/linecache linecache lazycache7096585 +Ref: aa67096585 +Ref: linecache — Random access to text lines-Footnote-17097132 +Ref: linecache — Random access to text lines-Footnote-27097201 +Node: shutil — High-level file operations7097243 +Ref: library/shutil doc7097392 +Ref: 22827097392 +Ref: library/shutil module-shutil7097392 +Ref: e67097392 +Ref: library/shutil shutil-high-level-file-operations7097392 +Ref: 22837097392 +Ref: shutil — High-level file operations-Footnote-17098495 +Node: Directory and files operations7098561 +Ref: library/shutil directory-and-files-operations7098694 +Ref: 22847098694 +Ref: library/shutil file-operations7098694 +Ref: 22857098694 +Ref: library/shutil shutil copyfileobj7098777 +Ref: 6ae7098777 +Ref: library/shutil shutil copyfile7099360 +Ref: 6a97099360 +Ref: library/shutil shutil SameFileError7100961 +Ref: c3b7100961 +Ref: library/shutil shutil copymode7101131 +Ref: 22867101131 +Ref: library/shutil shutil copystat7102026 +Ref: ddb7102026 +Ref: library/shutil shutil copy7104133 +Ref: 6aa7104133 +Ref: library/shutil shutil copy27105640 +Ref: 6ab7105640 +Ref: library/shutil shutil ignore_patterns7107155 +Ref: 22887107155 +Ref: library/shutil shutil copytree7107457 +Ref: 6757107457 +Ref: library/shutil shutil rmtree7110914 +Ref: 23f7110914 +Ref: library/shutil shutil rmtree avoids_symlink_attacks7113024 +Ref: 22897113024 +Ref: library/shutil shutil move7113364 +Ref: 6ac7113364 +Ref: library/shutil shutil disk_usage7115303 +Ref: dd97115303 +Ref: library/shutil shutil chown7115751 +Ref: dda7115751 +Ref: library/shutil shutil which7116238 +Ref: 13397116238 +Ref: library/shutil shutil Error7117565 +Ref: c3a7117565 +Node: Platform-dependent efficient copy operations7117901 +Ref: library/shutil platform-dependent-efficient-copy-operations7118037 +Ref: 228a7118037 +Ref: library/shutil shutil-platform-dependent-efficient-copy-operations7118037 +Ref: 6af7118037 +Ref: Platform-dependent efficient copy operations-Footnote-17119161 +Ref: Platform-dependent efficient copy operations-Footnote-27119226 +Node: copytree example7119274 +Ref: library/shutil copytree-example7119433 +Ref: 228b7119433 +Ref: library/shutil shutil-copytree-example7119433 +Ref: 228c7119433 +Node: rmtree example7120095 +Ref: library/shutil rmtree-example7120201 +Ref: 228d7120201 +Ref: library/shutil shutil-rmtree-example7120201 +Ref: 228e7120201 +Node: Archiving operations7120748 +Ref: library/shutil archiving-operations7120930 +Ref: ec87120930 +Ref: library/shutil id17120930 +Ref: 228f7120930 +Ref: library/shutil shutil make_archive7121237 +Ref: 6767121237 +Ref: library/shutil shutil get_archive_formats7123615 +Ref: 22927123615 +Ref: library/shutil shutil register_archive_format7124457 +Ref: 22917124457 +Ref: library/shutil shutil unregister_archive_format7125303 +Ref: 22937125303 +Ref: library/shutil shutil unpack_archive7125438 +Ref: ec97125438 +Ref: library/shutil shutil register_unpack_format7126733 +Ref: 22947126733 +Ref: library/shutil shutil unregister_unpack_format7127496 +Ref: 22967127496 +Ref: library/shutil shutil get_unpack_formats7127620 +Ref: 22957127620 +Ref: Archiving operations-Footnote-17128573 +Node: Archiving example7128615 +Ref: library/shutil archiving-example7128729 +Ref: 22977128729 +Ref: library/shutil shutil-archiving-example7128729 +Ref: 22987128729 +Node: Archiving example with base_dir7129822 +Ref: library/shutil archiving-example-with-base-dir7129936 +Ref: 22997129936 +Ref: library/shutil shutil-archiving-example-with-basedir7129936 +Ref: 22907129936 +Node: Querying the size of the output terminal7131040 +Ref: library/shutil querying-the-size-of-the-output-terminal7131183 +Ref: 229a7131183 +Ref: library/shutil shutil get_terminal_size7131286 +Ref: dae7131286 +Ref: Querying the size of the output terminal-Footnote-17132943 +Node: Data Persistence7133026 +Ref: library/persistence doc7133179 +Ref: 229d7133179 +Ref: library/persistence data-persistence7133179 +Ref: 229e7133179 +Ref: library/persistence other-environment-variables7133179 +Ref: 229f7133179 +Ref: library/persistence persistence7133179 +Ref: 22a07133179 +Node: pickle — Python object serialization7134010 +Ref: library/pickle doc7134155 +Ref: 22a17134155 +Ref: library/pickle module-pickle7134155 +Ref: c77134155 +Ref: library/pickle pickle-python-object-serialization7134155 +Ref: 22a27134155 +Ref: pickle — Python object serialization-Footnote-17135990 +Ref: pickle — Python object serialization-Footnote-27136056 +Node: Relationship to other Python modules7136120 +Ref: library/pickle relationship-to-other-python-modules7136258 +Ref: 22a47136258 +Node: Comparison with marshal7136414 +Ref: library/pickle comparison-with-marshal7136539 +Ref: 22a57136539 +Node: Comparison with json7138767 +Ref: library/pickle comparison-with-json7138892 +Ref: 22a37138892 +Ref: library/pickle id27138892 +Ref: 22a67138892 +Ref: Comparison with json-Footnote-17140057 +Node: Data stream format7140081 +Ref: library/pickle data-stream-format7140244 +Ref: 22a87140244 +Ref: library/pickle pickle-protocols7140244 +Ref: 9307140244 +Ref: Data stream format-Footnote-17143213 +Ref: Data stream format-Footnote-27143255 +Ref: Data stream format-Footnote-37143297 +Node: Module Interface7143339 +Ref: library/pickle module-interface7143500 +Ref: 22ab7143500 +Ref: library/pickle pickle HIGHEST_PROTOCOL7143953 +Ref: 10fd7143953 +Ref: library/pickle pickle DEFAULT_PROTOCOL7144226 +Ref: 4217144226 +Ref: library/pickle pickle dump7144734 +Ref: 22ad7144734 +Ref: library/pickle pickle dumps7145232 +Ref: 10fc7145232 +Ref: library/pickle pickle load7145669 +Ref: 9817145669 +Ref: library/pickle pickle loads7146417 +Ref: 9827146417 +Ref: library/pickle pickle PickleError7147145 +Ref: 22ae7147145 +Ref: library/pickle pickle PicklingError7147279 +Ref: 22af7147279 +Ref: library/pickle pickle UnpicklingError7147558 +Ref: 22b17147558 +Ref: library/pickle pickle Pickler7148067 +Ref: 66a7148067 +Ref: library/pickle pickle Pickler dump7149622 +Ref: 14837149622 +Ref: library/pickle pickle Pickler persistent_id7149764 +Ref: 22b37149764 +Ref: library/pickle pickle Pickler dispatch_table7150440 +Ref: dcd7150440 +Ref: library/pickle pickle Pickler reducer_override7151598 +Ref: 66b7151598 +Ref: library/pickle pickle Pickler fast7152201 +Ref: 22b97152201 +Ref: library/pickle pickle Unpickler7152686 +Ref: 22ac7152686 +Ref: library/pickle pickle Unpickler load7154791 +Ref: 22bb7154791 +Ref: library/pickle pickle Unpickler persistent_load7155086 +Ref: 22b47155086 +Ref: library/pickle pickle Unpickler find_class7155533 +Ref: 22bc7155533 +Ref: library/pickle pickle PickleBuffer7156213 +Ref: 11de7156213 +Ref: library/pickle pickle PickleBuffer raw7156831 +Ref: 22be7156831 +Ref: library/pickle pickle PickleBuffer release7157174 +Ref: 22bf7157174 +Node: What can be pickled and unpickled?7157290 +Ref: library/pickle pickle-picklable7157457 +Ref: 22b07157457 +Ref: library/pickle what-can-be-pickled-and-unpickled7157457 +Ref: 22c07157457 +Ref: What can be pickled and unpickled?-Footnote-17160122 +Ref: What can be pickled and unpickled?-Footnote-27160254 +Node: Pickling Class Instances7160390 +Ref: library/pickle pickle-inst7160595 +Ref: 22a77160595 +Ref: library/pickle pickling-class-instances7160595 +Ref: 22c17160595 +Ref: library/pickle object __getnewargs_ex__7161524 +Ref: 22c27161524 +Ref: library/pickle object __getnewargs__7162360 +Ref: 22c37162360 +Ref: library/pickle object __getstate__7162929 +Ref: 1a47162929 +Ref: library/pickle object __setstate__7164271 +Ref: 22c47164271 +Ref: library/pickle object __reduce__7166037 +Ref: 6147166037 +Ref: library/pickle object __reduce_ex__7168906 +Ref: 22c67168906 +Ref: Pickling Class Instances-Footnote-17169567 +Node: Persistence of External Objects7169662 +Ref: library/pickle persistence-of-external-objects7169778 +Ref: 22c77169778 +Ref: library/pickle pickle-persistent7169778 +Ref: 22b57169778 +Ref: Persistence of External Objects-Footnote-17174446 +Node: Dispatch Tables7174710 +Ref: library/pickle dispatch-tables7174860 +Ref: 22c87174860 +Ref: library/pickle pickle-dispatch7174860 +Ref: 22b77174860 +Node: Handling Stateful Objects7176148 +Ref: library/pickle handling-stateful-objects7176258 +Ref: 22c97176258 +Ref: library/pickle pickle-state7176258 +Ref: 22c57176258 +Node: Custom Reduction for Types Functions and Other Objects7178533 +Ref: library/pickle custom-reduction-for-types-functions-and-other-objects7178723 +Ref: 22ca7178723 +Ref: library/pickle reducer-override7178723 +Ref: 22b87178723 +Node: Out-of-band Buffers7180809 +Ref: library/pickle out-of-band-buffers7180994 +Ref: 22cb7180994 +Ref: library/pickle pickle-oob7180994 +Ref: 22b27180994 +Node: Provider API7181842 +Ref: library/pickle provider-api7181931 +Ref: 22cc7181931 +Node: Consumer API7182531 +Ref: library/pickle consumer-api7182639 +Ref: 22cd7182639 +Node: Example<4>7183942 +Ref: library/pickle example7184029 +Ref: 22ce7184029 +Ref: Example<4>-Footnote-17186413 +Node: Restricting Globals7186455 +Ref: library/pickle pickle-restrict7186600 +Ref: 22bd7186600 +Ref: library/pickle restricting-globals7186600 +Ref: 22cf7186600 +Node: Performance<2>7189376 +Ref: library/pickle performance7189513 +Ref: 22d07189513 +Node: Examples<6>7189789 +Ref: library/pickle examples7189898 +Ref: 22d17189898 +Ref: library/pickle pickle-example7189898 +Ref: 22d27189898 +Node: copyreg — Register pickle support functions7191113 +Ref: library/copyreg doc7191303 +Ref: 22d37191303 +Ref: library/copyreg copyreg-register-pickle-support-functions7191303 +Ref: 22d47191303 +Ref: library/copyreg module-copyreg7191303 +Ref: 257191303 +Ref: library/copyreg copyreg constructor7191895 +Ref: 22d57191895 +Ref: library/copyreg copyreg pickle7192098 +Ref: 22b67192098 +Ref: copyreg — Register pickle support functions-Footnote-17192831 +Node: Example<5>7192898 +Ref: library/copyreg example7192990 +Ref: 22d67192990 +Node: shelve — Python object persistence7193534 +Ref: library/shelve doc7193734 +Ref: 22d77193734 +Ref: library/shelve module-shelve7193734 +Ref: e47193734 +Ref: library/shelve shelve-python-object-persistence7193734 +Ref: 22d87193734 +Ref: library/shelve shelve open7194319 +Ref: 22d97194319 +Ref: library/shelve shelve-security7196361 +Ref: 22dd7196361 +Ref: library/shelve shelve Shelf sync7196860 +Ref: 22db7196860 +Ref: library/shelve shelve Shelf close7197181 +Ref: 22dc7197181 +Ref: shelve — Python object persistence-Footnote-17197563 +Ref: shelve — Python object persistence-Footnote-27197629 +Node: Restrictions7197682 +Ref: library/shelve restrictions7197786 +Ref: 22de7197786 +Ref: library/shelve shelve Shelf7198811 +Ref: c387198811 +Ref: library/shelve shelve BsdDbShelf7200207 +Ref: 1cb17200207 +Ref: library/shelve shelve DbfilenameShelf7200913 +Ref: 1cb27200913 +Ref: Restrictions-Footnote-17201528 +Node: Example<6>7201581 +Ref: library/shelve example7201685 +Ref: 22df7201685 +Ref: library/shelve shelve-example7201685 +Ref: 22da7201685 +Node: marshal — Internal Python object serialization7203364 +Ref: library/marshal doc7203561 +Ref: 22e07203561 +Ref: library/marshal marshal-internal-python-object-serialization7203561 +Ref: 22e17203561 +Ref: library/marshal module-marshal7203561 +Ref: ae7203561 +Ref: library/marshal marshal dump7205968 +Ref: 22e27205968 +Ref: library/marshal marshal load7206628 +Ref: 14447206628 +Ref: library/marshal marshal dumps7207467 +Ref: b327207467 +Ref: library/marshal marshal loads7207979 +Ref: 22e37207979 +Ref: library/marshal marshal version7208577 +Ref: 22e47208577 +Ref: marshal — Internal Python object serialization-Footnote-17208931 +Node: dbm — Interfaces to Unix “databases”7209311 +Ref: library/dbm doc7209525 +Ref: 22e57209525 +Ref: library/dbm dbm-interfaces-to-unix-databases7209525 +Ref: 22e67209525 +Ref: library/dbm module-dbm7209525 +Ref: 307209525 +Ref: library/dbm dbm error7210035 +Ref: 22e77210035 +Ref: library/dbm dbm whichdb7210307 +Ref: 22e87210307 +Ref: library/dbm dbm open7210947 +Ref: bc17210947 +Ref: dbm — Interfaces to Unix “databases”-Footnote-17214663 +Ref: dbm — Interfaces to Unix “databases”-Footnote-27214735 +Node: dbm gnu — GNU’s reinterpretation of dbm7214788 +Ref: library/dbm dbm-gnu-gnu-s-reinterpretation-of-dbm7214955 +Ref: 22e97214955 +Ref: library/dbm module-dbm gnu7214955 +Ref: 327214955 +Ref: library/dbm dbm gnu error7215771 +Ref: 6f37215771 +Ref: library/dbm dbm gnu open7215975 +Ref: 147b7215975 +Ref: library/dbm dbm gnu gdbm firstkey7218140 +Ref: 22ea7218140 +Ref: library/dbm dbm gnu gdbm nextkey7218484 +Ref: 22eb7218484 +Ref: library/dbm dbm gnu gdbm reorganize7218869 +Ref: 22ec7218869 +Ref: library/dbm dbm gnu gdbm sync7219312 +Ref: 22ed7219312 +Ref: library/dbm dbm gnu gdbm close7219477 +Ref: 22ee7219477 +Ref: dbm gnu — GNU’s reinterpretation of dbm-Footnote-17219587 +Node: dbm ndbm — Interface based on ndbm7219654 +Ref: library/dbm dbm-ndbm-interface-based-on-ndbm7219870 +Ref: 22ef7219870 +Ref: library/dbm module-dbm ndbm7219870 +Ref: 337219870 +Ref: library/dbm dbm ndbm error7220626 +Ref: 6f47220626 +Ref: library/dbm dbm ndbm library7220832 +Ref: 22f07220832 +Ref: library/dbm dbm ndbm open7220918 +Ref: 147c7220918 +Ref: library/dbm dbm ndbm ndbm close7222290 +Ref: 22f17222290 +Ref: dbm ndbm — Interface based on ndbm-Footnote-17222400 +Node: dbm dumb — Portable DBM implementation7222468 +Ref: library/dbm dbm-dumb-portable-dbm-implementation7222632 +Ref: 22f27222632 +Ref: library/dbm module-dbm dumb7222632 +Ref: 317222632 +Ref: library/dbm dbm dumb error7223457 +Ref: 6f27223457 +Ref: library/dbm dbm dumb open7223663 +Ref: 6ee7223663 +Ref: library/dbm dbm dumb dumbdbm sync7225695 +Ref: 22f37225695 +Ref: library/dbm dbm dumb dumbdbm close7225858 +Ref: 22f47225858 +Ref: dbm dumb — Portable DBM implementation-Footnote-17225974 +Node: sqlite3 — DB-API 2 0 interface for SQLite databases7226042 +Ref: library/sqlite3 doc7226199 +Ref: 22f57226199 +Ref: library/sqlite3 module-sqlite37226199 +Ref: ef7226199 +Ref: library/sqlite3 sqlite3-db-api-2-0-interface-for-sqlite-databases7226199 +Ref: 22f67226199 +Ref: library/sqlite3 sqlite3-intro7226360 +Ref: 22f77226360 +Ref: sqlite3 — DB-API 2 0 interface for SQLite databases-Footnote-17227805 +Ref: sqlite3 — DB-API 2 0 interface for SQLite databases-Footnote-27227870 +Ref: sqlite3 — DB-API 2 0 interface for SQLite databases-Footnote-37227912 +Node: Tutorial7227954 +Ref: library/sqlite3 sqlite3-tutorial7228070 +Ref: 22f87228070 +Ref: library/sqlite3 tutorial7228070 +Ref: 22fc7228070 +Ref: Tutorial-Footnote-17234004 +Ref: Tutorial-Footnote-27234061 +Ref: Tutorial-Footnote-37234120 +Ref: Tutorial-Footnote-47234169 +Ref: Tutorial-Footnote-57234215 +Node: Reference7234267 +Ref: library/sqlite3 reference7234405 +Ref: 23087234405 +Ref: library/sqlite3 sqlite3-reference7234405 +Ref: 22f97234405 +Ref: library/sqlite3 sqlite3-module-contents7234444 +Ref: 23097234444 +Node: Module functions7234692 +Ref: library/sqlite3 module-functions7234779 +Ref: 230a7234779 +Ref: library/sqlite3 sqlite3-module-functions7234779 +Ref: 230b7234779 +Ref: library/sqlite3 sqlite3 connect7234832 +Ref: 7da7234832 +Ref: library/sqlite3 sqlite3 complete_statement7238574 +Ref: 23127238574 +Ref: library/sqlite3 sqlite3 enable_callback_tracebacks7239314 +Ref: 23137239314 +Ref: library/sqlite3 sqlite3 register_adapter7240486 +Ref: 23147240486 +Ref: library/sqlite3 sqlite3 register_converter7240811 +Ref: 230d7240811 +Node: Module constants7241407 +Ref: library/sqlite3 module-constants7241521 +Ref: 23157241521 +Ref: library/sqlite3 sqlite3-module-constants7241521 +Ref: 23167241521 +Ref: library/sqlite3 sqlite3 PARSE_COLNAMES7241574 +Ref: 230f7241574 +Ref: library/sqlite3 sqlite3 PARSE_DECLTYPES7242090 +Ref: 230e7242090 +Ref: library/sqlite3 sqlite3 SQLITE_OK7242897 +Ref: 23177242897 +Ref: library/sqlite3 sqlite3 SQLITE_DENY7242925 +Ref: 23187242925 +Ref: library/sqlite3 sqlite3 SQLITE_IGNORE7242955 +Ref: 23197242955 +Ref: library/sqlite3 sqlite3 apilevel7243376 +Ref: 231a7243376 +Ref: library/sqlite3 sqlite3 paramstyle7243519 +Ref: 231b7243519 +Ref: library/sqlite3 sqlite3 sqlite_version7244011 +Ref: 231c7244011 +Ref: library/sqlite3 sqlite3 sqlite_version_info7244125 +Ref: 231d7244125 +Ref: library/sqlite3 sqlite3 threadsafety7244267 +Ref: 24d7244267 +Ref: library/sqlite3 sqlite3 version7246578 +Ref: 231e7246578 +Ref: library/sqlite3 sqlite3 version_info7246718 +Ref: 231f7246718 +Ref: Module constants-Footnote-17246922 +Ref: Module constants-Footnote-27246965 +Ref: Module constants-Footnote-37247020 +Node: Connection objects7247071 +Ref: library/sqlite3 connection-objects7247183 +Ref: 23207247183 +Ref: library/sqlite3 sqlite3-connection-objects7247183 +Ref: 23217247183 +Ref: library/sqlite3 sqlite3 Connection7247240 +Ref: 24c7247240 +Ref: library/sqlite3 sqlite3 Connection cursor7247755 +Ref: 22fd7247755 +Ref: library/sqlite3 sqlite3 Connection blobopen7248054 +Ref: 2537248054 +Ref: library/sqlite3 sqlite3 Connection commit7249327 +Ref: 23017249327 +Ref: library/sqlite3 sqlite3 Connection rollback7249482 +Ref: 23237249482 +Ref: library/sqlite3 sqlite3 Connection close7249642 +Ref: 23057249642 +Ref: library/sqlite3 sqlite3 Connection execute7249868 +Ref: 23247249868 +Ref: library/sqlite3 sqlite3 Connection executemany7250096 +Ref: 23257250096 +Ref: library/sqlite3 sqlite3 Connection executescript7250330 +Ref: 23267250330 +Ref: library/sqlite3 sqlite3 Connection create_function7250552 +Ref: 13f47250552 +Ref: library/sqlite3 sqlite3 Connection create_aggregate7252109 +Ref: 13f37252109 +Ref: library/sqlite3 sqlite3 Connection create_window_function7253849 +Ref: 2527253849 +Ref: library/sqlite3 sqlite3 Connection create_collation7257024 +Ref: 2457257024 +Ref: library/sqlite3 sqlite3 Connection interrupt7258453 +Ref: 232a7258453 +Ref: library/sqlite3 sqlite3 Connection set_authorizer7258662 +Ref: 2447258662 +Ref: library/sqlite3 sqlite3 Connection set_progress_handler7260107 +Ref: 13f57260107 +Ref: library/sqlite3 sqlite3 Connection set_trace_callback7260769 +Ref: dee7260769 +Ref: library/sqlite3 sqlite3 Connection enable_load_extension7261869 +Ref: 4347261869 +Ref: library/sqlite3 sqlite3 Connection load_extension7264237 +Ref: 4357264237 +Ref: library/sqlite3 sqlite3 Connection iterdump7264737 +Ref: 11ba7264737 +Ref: library/sqlite3 sqlite3 Connection backup7265317 +Ref: 7d97265317 +Ref: library/sqlite3 sqlite3 Connection getlimit7267520 +Ref: 24b7267520 +Ref: library/sqlite3 sqlite3 Connection setlimit7268154 +Ref: 24a7268154 +Ref: library/sqlite3 sqlite3 Connection serialize7269250 +Ref: 2507269250 +Ref: library/sqlite3 sqlite3 Connection deserialize7270003 +Ref: 2517270003 +Ref: library/sqlite3 sqlite3 Connection in_transaction7271169 +Ref: 232c7271169 +Ref: library/sqlite3 sqlite3 Connection isolation_level7271453 +Ref: 23107271453 +Ref: library/sqlite3 sqlite3 Connection row_factory7272081 +Ref: 232d7272081 +Ref: library/sqlite3 sqlite3 Connection text_factory7273282 +Ref: 232e7273282 +Ref: library/sqlite3 sqlite3 Connection total_changes7274779 +Ref: 232f7274779 +Ref: Connection objects-Footnote-17275010 +Ref: Connection objects-Footnote-27275056 +Ref: Connection objects-Footnote-37275115 +Ref: Connection objects-Footnote-47275174 +Ref: Connection objects-Footnote-57275266 +Node: Cursor objects7275366 +Ref: library/sqlite3 cursor-objects7275473 +Ref: 23307275473 +Ref: library/sqlite3 sqlite3-cursor-objects7275473 +Ref: 23317275473 +Ref: library/sqlite3 sqlite3 Cursor7276085 +Ref: 22fe7276085 +Ref: library/sqlite3 sqlite3 Cursor execute7276196 +Ref: 12137276196 +Ref: library/sqlite3 sqlite3 Cursor executemany7277020 +Ref: 23037277020 +Ref: library/sqlite3 sqlite3 Cursor executescript7277662 +Ref: 23277277662 +Ref: library/sqlite3 sqlite3 Cursor fetchone7278424 +Ref: 22ff7278424 +Ref: library/sqlite3 sqlite3 Cursor fetchmany7278704 +Ref: 23327278704 +Ref: library/sqlite3 sqlite3 Cursor fetchall7279543 +Ref: 23027279543 +Ref: library/sqlite3 sqlite3 Cursor close7279824 +Ref: 23347279824 +Ref: library/sqlite3 sqlite3 Cursor setinputsizes7280128 +Ref: 23357280128 +Ref: library/sqlite3 sqlite3 Cursor setoutputsize7280237 +Ref: 23367280237 +Ref: library/sqlite3 sqlite3 Cursor arraysize7280358 +Ref: 23337280358 +Ref: library/sqlite3 sqlite3 Cursor connection7280587 +Ref: 23377280587 +Ref: library/sqlite3 sqlite3 Cursor description7281058 +Ref: 23387281058 +Ref: library/sqlite3 sqlite3 Cursor lastrowid7281434 +Ref: 93f7281434 +Ref: library/sqlite3 sqlite3 Cursor rowcount7282129 +Ref: 11b87282129 +Ref: library/sqlite3 sqlite3-columns-by-name7282521 +Ref: 23397282521 +Ref: Cursor objects-Footnote-17282557 +Node: Row objects7282614 +Ref: library/sqlite3 row-objects7282715 +Ref: 233a7282715 +Ref: library/sqlite3 sqlite3-row-objects7282715 +Ref: 233b7282715 +Ref: library/sqlite3 sqlite3 Row7282758 +Ref: afa7282758 +Ref: library/sqlite3 sqlite3 Row keys7283113 +Ref: 233c7283113 +Node: Blob objects7283835 +Ref: library/sqlite3 blob-objects7283945 +Ref: 233d7283945 +Ref: library/sqlite3 sqlite3-blob-objects7283945 +Ref: 233e7283945 +Ref: library/sqlite3 sqlite3 Blob7284012 +Ref: 2547284012 +Ref: library/sqlite3 sqlite3 Blob close7285131 +Ref: 233f7285131 +Ref: library/sqlite3 sqlite3 Blob read7285381 +Ref: 23407285381 +Ref: library/sqlite3 sqlite3 Blob write7285738 +Ref: 23417285738 +Ref: library/sqlite3 sqlite3 Blob tell7285967 +Ref: 23427285967 +Ref: library/sqlite3 sqlite3 Blob seek7286052 +Ref: 23437286052 +Node: PrepareProtocol objects7286476 +Ref: library/sqlite3 prepareprotocol-objects7286588 +Ref: 23447286588 +Ref: library/sqlite3 sqlite3 PrepareProtocol7286655 +Ref: 11bc7286655 +Ref: PrepareProtocol objects-Footnote-17286924 +Node: Exceptions<6>7286966 +Ref: library/sqlite3 exceptions7287089 +Ref: 23467287089 +Ref: library/sqlite3 sqlite3-exceptions7287089 +Ref: 23477287089 +Ref: library/sqlite3 sqlite3 Warning7287201 +Ref: 12127287201 +Ref: library/sqlite3 sqlite3 Error7287502 +Ref: 127f7287502 +Ref: library/sqlite3 sqlite3 Error sqlite_errorcode7287858 +Ref: 2487287858 +Ref: library/sqlite3 sqlite3 Error sqlite_errorname7287985 +Ref: 2497287985 +Ref: library/sqlite3 sqlite3 InterfaceError7288143 +Ref: 24f7288143 +Ref: library/sqlite3 sqlite3 DatabaseError7288422 +Ref: 232b7288422 +Ref: library/sqlite3 sqlite3 DataError7288737 +Ref: 12997288737 +Ref: library/sqlite3 sqlite3 OperationalError7288986 +Ref: 129a7288986 +Ref: library/sqlite3 sqlite3 IntegrityError7289340 +Ref: 23487289340 +Ref: library/sqlite3 sqlite3 InternalError7289552 +Ref: 23497289552 +Ref: library/sqlite3 sqlite3 ProgrammingError7289828 +Ref: 2477289828 +Ref: library/sqlite3 sqlite3 NotSupportedError7290136 +Ref: 23297290136 +Ref: Exceptions<6>-Footnote-17290570 +Ref: Exceptions<6>-Footnote-27290612 +Ref: Exceptions<6>-Footnote-37290652 +Node: SQLite and Python types7290692 +Ref: library/sqlite3 sqlite-and-python-types7290823 +Ref: 234a7290823 +Ref: library/sqlite3 sqlite3-types7290823 +Ref: 230c7290823 +Node: Default adapters and converters7292735 +Ref: library/sqlite3 default-adapters-and-converters7292844 +Ref: 234b7292844 +Ref: library/sqlite3 sqlite3-default-converters7292844 +Ref: 234c7292844 +Node: How-to guides7294724 +Ref: library/sqlite3 how-to-guides7294865 +Ref: 234d7294865 +Ref: library/sqlite3 sqlite3-howtos7294865 +Ref: 22fa7294865 +Node: How to use placeholders to bind values in SQL queries7295248 +Ref: library/sqlite3 how-to-use-placeholders-to-bind-values-in-sql-queries7295409 +Ref: 234e7295409 +Ref: library/sqlite3 sqlite3-placeholders7295409 +Ref: 23047295409 +Ref: How to use placeholders to bind values in SQL queries-Footnote-17297394 +Ref: How to use placeholders to bind values in SQL queries-Footnote-27297446 +Node: How to adapt custom Python types to SQLite values7297476 +Ref: library/sqlite3 how-to-adapt-custom-python-types-to-sqlite-values7297697 +Ref: 234f7297697 +Ref: library/sqlite3 sqlite3-adapters7297697 +Ref: 23067297697 +Node: How to write adaptable objects7298486 +Ref: library/sqlite3 how-to-write-adaptable-objects7298644 +Ref: 23507298644 +Ref: library/sqlite3 sqlite3-conform7298644 +Ref: 23457298644 +Node: How to register adapter callables7299538 +Ref: library/sqlite3 how-to-register-adapter-callables7299696 +Ref: 23517299696 +Node: How to convert SQLite values to custom Python types7300323 +Ref: library/sqlite3 how-to-convert-sqlite-values-to-custom-python-types7300520 +Ref: 23527300520 +Ref: library/sqlite3 sqlite3-converters7300520 +Ref: 23077300520 +Node: Adapter and converter recipes7303073 +Ref: library/sqlite3 adapter-and-converter-recipes7303259 +Ref: 23537303259 +Ref: library/sqlite3 sqlite3-adapter-converter-recipes7303259 +Ref: 23547303259 +Node: How to use connection shortcut methods7304672 +Ref: library/sqlite3 how-to-use-connection-shortcut-methods7304848 +Ref: 23557304848 +Ref: library/sqlite3 sqlite3-connection-shortcuts7304848 +Ref: 23227304848 +Node: How to use the connection context manager7306132 +Ref: library/sqlite3 how-to-use-the-connection-context-manager7306307 +Ref: 23567306307 +Ref: library/sqlite3 sqlite3-connection-context-manager7306307 +Ref: 11bd7306307 +Node: How to work with SQLite URIs7307802 +Ref: library/sqlite3 how-to-work-with-sqlite-uris7307930 +Ref: 23577307930 +Ref: library/sqlite3 sqlite3-uri-tricks7307930 +Ref: 23117307930 +Ref: How to work with SQLite URIs-Footnote-17309175 +Node: Explanation7309215 +Ref: library/sqlite3 explanation7309338 +Ref: 23587309338 +Ref: library/sqlite3 sqlite3-explanation7309338 +Ref: 22fb7309338 +Node: Transaction control7309417 +Ref: library/sqlite3 sqlite3-controlling-transactions7309484 +Ref: 23007309484 +Ref: library/sqlite3 transaction-control7309484 +Ref: 23597309484 +Ref: Transaction control-Footnote-17311035 +Ref: Transaction control-Footnote-27311077 +Ref: Transaction control-Footnote-37311177 +Node: Data Compression and Archiving7311269 +Ref: library/archiving doc7311409 +Ref: 22a97311409 +Ref: library/archiving archiving7311409 +Ref: 235a7311409 +Ref: library/archiving data-compression-and-archiving7311409 +Ref: 235b7311409 +Ref: library/archiving sqlite-transaction-behaviour7311409 +Ref: 235c7311409 +Node: zlib — Compression compatible with gzip7312001 +Ref: library/zlib doc7312149 +Ref: 235d7312149 +Ref: library/zlib module-zlib7312149 +Ref: 14f7312149 +Ref: library/zlib zlib-compression-compatible-with-gzip7312149 +Ref: 235e7312149 +Ref: library/zlib zlib error7313118 +Ref: 235f7313118 +Ref: library/zlib zlib adler327313209 +Ref: 12177313209 +Ref: library/zlib zlib compress7313993 +Ref: 97d7313993 +Ref: library/zlib compress-wbits7314636 +Ref: 23607314636 +Ref: library/zlib zlib compressobj7315865 +Ref: 23617315865 +Ref: library/zlib zlib crc327317864 +Ref: 120c7317864 +Ref: library/zlib zlib decompress7318565 +Ref: 97e7318565 +Ref: library/zlib decompress-wbits7318998 +Ref: 23627318998 +Ref: library/zlib zlib decompressobj7320733 +Ref: 23637320733 +Ref: library/zlib zlib Compress compress7321732 +Ref: 23647321732 +Ref: library/zlib zlib Compress flush7322090 +Ref: 23657322090 +Ref: library/zlib zlib Compress copy7322845 +Ref: 23667322845 +Ref: library/zlib zlib Decompress unused_data7323213 +Ref: 23677323213 +Ref: library/zlib zlib Decompress unconsumed_tail7323559 +Ref: 23687323559 +Ref: library/zlib zlib Decompress eof7324013 +Ref: e217324013 +Ref: library/zlib zlib Decompress decompress7324296 +Ref: 23697324296 +Ref: library/zlib zlib Decompress flush7325323 +Ref: 236a7325323 +Ref: library/zlib zlib Decompress copy7325728 +Ref: 236b7325728 +Ref: library/zlib zlib ZLIB_VERSION7326206 +Ref: 236c7326206 +Ref: library/zlib zlib ZLIB_RUNTIME_VERSION7326460 +Ref: e227326460 +Ref: zlib — Compression compatible with gzip-Footnote-17326934 +Node: gzip — Support for gzip files7326979 +Ref: library/gzip doc7327173 +Ref: 236d7327173 +Ref: library/gzip gzip-support-for-gzip-files7327173 +Ref: 236e7327173 +Ref: library/gzip module-gzip7327173 +Ref: 877327173 +Ref: library/gzip gzip open7328168 +Ref: 236f7328168 +Ref: library/gzip gzip BadGzipFile7329699 +Ref: 63c7329699 +Ref: library/gzip gzip GzipFile7329944 +Ref: 5907329944 +Ref: library/gzip gzip GzipFile peek7332894 +Ref: ebb7332894 +Ref: library/gzip gzip GzipFile mtime7333518 +Ref: 23707333518 +Ref: library/gzip gzip compress7334989 +Ref: 63b7334989 +Ref: library/gzip gzip decompress7335772 +Ref: ebc7335772 +Ref: gzip — Support for gzip files-Footnote-17336429 +Node: Examples of usage7336493 +Ref: library/gzip examples-of-usage7336609 +Ref: 23757336609 +Ref: library/gzip gzip-usage-examples7336609 +Ref: 23767336609 +Node: Command Line Interface7337527 +Ref: library/gzip command-line-interface7337643 +Ref: 23777337643 +Node: Command line options7338063 +Ref: library/gzip command-line-options7338142 +Ref: 23787338142 +Ref: library/gzip cmdoption-gzip-arg-file7338203 +Ref: 23797338203 +Ref: library/gzip cmdoption-gzip-fast7338295 +Ref: 237a7338295 +Ref: library/gzip cmdoption-gzip-best7338390 +Ref: 237b7338390 +Ref: library/gzip cmdoption-gzip-d7338485 +Ref: 237c7338485 +Ref: library/gzip cmdoption-gzip-decompress7338485 +Ref: 237d7338485 +Ref: library/gzip cmdoption-gzip-h7338556 +Ref: 237e7338556 +Ref: library/gzip cmdoption-gzip-help7338556 +Ref: 237f7338556 +Node: bz2 — Support for bzip2 compression7338617 +Ref: library/bz2 doc7338815 +Ref: 23807338815 +Ref: library/bz2 bz2-support-for-bzip2-compression7338815 +Ref: 23817338815 +Ref: library/bz2 module-bz27338815 +Ref: 127338815 +Ref: bz2 — Support for bzip2 compression-Footnote-17339774 +Node: De compression of files7339837 +Ref: library/bz2 de-compression-of-files7339969 +Ref: 23847339969 +Ref: library/bz2 bz2 open7340038 +Ref: d3f7340038 +Ref: library/bz2 bz2 BZ2File7341476 +Ref: 5a57341476 +Ref: library/bz2 bz2 BZ2File peek7342914 +Ref: 23857342914 +Node: Incremental de compression7344735 +Ref: library/bz2 incremental-de-compression7344899 +Ref: 23867344899 +Ref: library/bz2 bz2 BZ2Compressor7344974 +Ref: 23827344974 +Ref: library/bz2 bz2 BZ2Compressor compress7345314 +Ref: 23877345314 +Ref: library/bz2 bz2 BZ2Compressor flush7345662 +Ref: 23887345662 +Ref: library/bz2 bz2 BZ2Decompressor7345891 +Ref: 23837345891 +Ref: library/bz2 bz2 BZ2Decompressor decompress7346442 +Ref: a4c7346442 +Ref: library/bz2 bz2 BZ2Decompressor eof7347806 +Ref: 238b7347806 +Ref: library/bz2 bz2 BZ2Decompressor unused_data7347930 +Ref: 238a7347930 +Ref: library/bz2 bz2 BZ2Decompressor needs_input7348152 +Ref: 23897348152 +Node: One-shot de compression7348374 +Ref: library/bz2 one-shot-de-compression7348535 +Ref: 238c7348535 +Ref: library/bz2 bz2 compress7348604 +Ref: 1e737348604 +Ref: library/bz2 bz2 decompress7348903 +Ref: d407348903 +Node: Examples of usage<2>7349261 +Ref: library/bz2 bz2-usage-examples7349387 +Ref: 238d7349387 +Ref: library/bz2 examples-of-usage7349387 +Ref: 238e7349387 +Node: lzma — Compression using the LZMA algorithm7352303 +Ref: library/lzma doc7352504 +Ref: 238f7352504 +Ref: library/lzma lzma-compression-using-the-lzma-algorithm7352504 +Ref: 23907352504 +Ref: library/lzma module-lzma7352504 +Ref: ab7352504 +Ref: library/lzma lzma LZMAError7353334 +Ref: 23917353334 +Ref: lzma — Compression using the LZMA algorithm-Footnote-17353753 +Node: Reading and writing compressed files7353817 +Ref: library/lzma reading-and-writing-compressed-files7353988 +Ref: 23927353988 +Ref: library/lzma lzma open7354081 +Ref: 23937354081 +Ref: library/lzma lzma LZMAFile7355849 +Ref: caf7355849 +Ref: library/lzma lzma LZMAFile peek7357727 +Ref: 23967357727 +Node: Compressing and decompressing data in memory7358609 +Ref: library/lzma compressing-and-decompressing-data-in-memory7358805 +Ref: 23977358805 +Ref: library/lzma lzma LZMACompressor7358914 +Ref: 23957358914 +Ref: library/lzma lzma LZMACompressor compress7361993 +Ref: 239a7361993 +Ref: library/lzma lzma LZMACompressor flush7362466 +Ref: 239b7362466 +Ref: library/lzma lzma LZMADecompressor7362746 +Ref: 23947362746 +Ref: library/lzma lzma LZMADecompressor decompress7364274 +Ref: ab27364274 +Ref: library/lzma lzma LZMADecompressor check7365641 +Ref: 239f7365641 +Ref: library/lzma lzma LZMADecompressor eof7365874 +Ref: 23a07365874 +Ref: library/lzma lzma LZMADecompressor unused_data7365967 +Ref: 239e7365967 +Ref: library/lzma lzma LZMADecompressor needs_input7366138 +Ref: 239d7366138 +Ref: library/lzma lzma compress7366360 +Ref: 23987366360 +Ref: library/lzma lzma decompress7366707 +Ref: 239c7366707 +Node: Miscellaneous<2>7367214 +Ref: library/lzma miscellaneous7367405 +Ref: 23a17367405 +Ref: library/lzma lzma is_check_supported7367452 +Ref: 23a27367452 +Node: Specifying custom filter chains7367814 +Ref: library/lzma filter-chain-specs7367972 +Ref: 23997367972 +Ref: library/lzma specifying-custom-filter-chains7367972 +Ref: 23a37367972 +Node: Examples<7>7370821 +Ref: library/lzma examples7370954 +Ref: 23a47370954 +Node: zipfile — Work with ZIP archives7372322 +Ref: library/zipfile doc7372530 +Ref: 23a57372530 +Ref: library/zipfile module-zipfile7372530 +Ref: 14d7372530 +Ref: library/zipfile zipfile-work-with-zip-archives7372530 +Ref: 23a67372530 +Ref: library/zipfile zipfile BadZipFile7373393 +Ref: 11d17373393 +Ref: library/zipfile zipfile BadZipfile7373496 +Ref: 23a77373496 +Ref: library/zipfile zipfile LargeZipFile7373657 +Ref: 23a87373657 +Ref: library/zipfile zipfile ZipInfo7374209 +Ref: 9797374209 +Ref: library/zipfile zipfile is_zipfile7374907 +Ref: fc47374907 +Ref: library/zipfile zipfile ZIP_STORED7375200 +Ref: 23ae7375200 +Ref: library/zipfile zipfile ZIP_DEFLATED7375293 +Ref: 23af7375293 +Ref: library/zipfile zipfile ZIP_BZIP27375439 +Ref: 23b07375439 +Ref: library/zipfile zipfile ZIP_LZMA7375602 +Ref: 23b17375602 +Ref: zipfile — Work with ZIP archives-Footnote-17376608 +Ref: zipfile — Work with ZIP archives-Footnote-27376675 +Ref: zipfile — Work with ZIP archives-Footnote-37376743 +Ref: zipfile — Work with ZIP archives-Footnote-47376811 +Node: ZipFile Objects7376844 +Ref: library/zipfile id17376951 +Ref: 23b27376951 +Ref: library/zipfile zipfile-objects7376951 +Ref: 23a97376951 +Ref: library/zipfile zipfile ZipFile7377002 +Ref: 28c7377002 +Ref: library/zipfile zipfile ZipFile close7381997 +Ref: 23b37381997 +Ref: library/zipfile zipfile ZipFile getinfo7382168 +Ref: 23ab7382168 +Ref: library/zipfile zipfile ZipFile infolist7382427 +Ref: 23ac7382427 +Ref: library/zipfile zipfile ZipFile namelist7382685 +Ref: 23b47382685 +Ref: library/zipfile zipfile ZipFile open7382766 +Ref: 97b7382766 +Ref: library/zipfile zipfile ZipFile extract7385157 +Ref: 23b87385157 +Ref: library/zipfile zipfile ZipFile extractall7386516 +Ref: 23b97386516 +Ref: library/zipfile zipfile ZipFile printdir7387534 +Ref: 23ba7387534 +Ref: library/zipfile zipfile ZipFile setpassword7387636 +Ref: 23bb7387636 +Ref: library/zipfile zipfile ZipFile read7387739 +Ref: fc37387739 +Ref: library/zipfile zipfile ZipFile testzip7388641 +Ref: 23bc7388641 +Ref: library/zipfile zipfile ZipFile write7389011 +Ref: 9c87389011 +Ref: library/zipfile zipfile ZipFile writestr7390816 +Ref: fc57390816 +Ref: library/zipfile zipfile ZipFile mkdir7392405 +Ref: 28d7392405 +Ref: library/zipfile zipfile ZipFile filename7392926 +Ref: 23bd7392926 +Ref: library/zipfile zipfile ZipFile debug7392987 +Ref: 23be7392987 +Ref: library/zipfile zipfile ZipFile comment7393207 +Ref: 23bf7393207 +Node: Path Objects7393530 +Ref: library/zipfile id27393663 +Ref: 23c07393663 +Ref: library/zipfile path-objects7393663 +Ref: 23aa7393663 +Ref: library/zipfile zipfile Path7393708 +Ref: 2917393708 +Ref: library/zipfile zipfile Path name7394272 +Ref: 23c17394272 +Ref: library/zipfile zipfile Path open7394330 +Ref: 23c27394330 +Ref: library/zipfile zipfile Path iterdir7394883 +Ref: 23c37394883 +Ref: library/zipfile zipfile Path is_dir7394967 +Ref: 23c47394967 +Ref: library/zipfile zipfile Path is_file7395066 +Ref: 23c57395066 +Ref: library/zipfile zipfile Path exists7395161 +Ref: 23c67395161 +Ref: library/zipfile zipfile Path suffix7395289 +Ref: 28f7395289 +Ref: library/zipfile zipfile Path stem7395428 +Ref: 28e7395428 +Ref: library/zipfile zipfile Path suffixes7395566 +Ref: 2907395566 +Ref: library/zipfile zipfile Path read_text7395706 +Ref: 23c77395706 +Ref: library/zipfile zipfile Path read_bytes7395938 +Ref: 23c87395938 +Ref: library/zipfile zipfile Path joinpath7396008 +Ref: 23c97396008 +Ref: Path Objects-Footnote-17396658 +Node: PyZipFile Objects7396696 +Ref: library/zipfile id37396829 +Ref: 23ca7396829 +Ref: library/zipfile pyzipfile-objects7396829 +Ref: 23cb7396829 +Ref: library/zipfile zipfile PyZipFile7397031 +Ref: c9c7397031 +Ref: library/zipfile zipfile PyZipFile writepy7397356 +Ref: c9b7397356 +Node: ZipInfo Objects7400183 +Ref: library/zipfile id47400326 +Ref: 23cc7400326 +Ref: library/zipfile zipinfo-objects7400326 +Ref: 23ad7400326 +Ref: library/zipfile zipfile ZipInfo from_file7400694 +Ref: 9787400694 +Ref: library/zipfile zipfile ZipInfo is_dir7401761 +Ref: 97a7401761 +Ref: library/zipfile zipfile ZipInfo filename7401961 +Ref: 23cd7401961 +Ref: library/zipfile zipfile ZipInfo date_time7402033 +Ref: 23ce7402033 +Ref: library/zipfile zipfile ZipInfo compress_type7402815 +Ref: 23cf7402815 +Ref: library/zipfile zipfile ZipInfo comment7402903 +Ref: 23d07402903 +Ref: library/zipfile zipfile ZipInfo extra7403019 +Ref: 23d17403019 +Ref: library/zipfile zipfile ZipInfo create_system7403223 +Ref: 23d27403223 +Ref: library/zipfile zipfile ZipInfo create_version7403301 +Ref: 23d37403301 +Ref: library/zipfile zipfile ZipInfo extract_version7403387 +Ref: 23d47403387 +Ref: library/zipfile zipfile ZipInfo reserved7403474 +Ref: 23d57403474 +Ref: library/zipfile zipfile ZipInfo flag_bits7403527 +Ref: 23d67403527 +Ref: library/zipfile zipfile ZipInfo volume7403582 +Ref: 23d77403582 +Ref: library/zipfile zipfile ZipInfo internal_attr7403649 +Ref: 23d87403649 +Ref: library/zipfile zipfile ZipInfo external_attr7403714 +Ref: 23d97403714 +Ref: library/zipfile zipfile ZipInfo header_offset7403784 +Ref: 23da7403784 +Ref: library/zipfile zipfile ZipInfo CRC7403860 +Ref: 23db7403860 +Ref: library/zipfile zipfile ZipInfo compress_size7403927 +Ref: 23dc7403927 +Ref: library/zipfile zipfile ZipInfo file_size7404000 +Ref: 23b77404000 +Ref: ZipInfo Objects-Footnote-17404107 +Node: Command-Line Interface7404175 +Ref: library/zipfile command-line-interface7404323 +Ref: 23dd7404323 +Ref: library/zipfile zipfile-commandline7404323 +Ref: 23de7404323 +Node: Command-line options7405096 +Ref: library/zipfile command-line-options7405175 +Ref: 23e27405175 +Ref: library/zipfile cmdoption-zipfile-l7405236 +Ref: 23e17405236 +Ref: library/zipfile cmdoption-zipfile-list7405269 +Ref: 23e37405269 +Ref: library/zipfile cmdoption-zipfile-c7405338 +Ref: 23df7405338 +Ref: library/zipfile cmdoption-zipfile-create7405395 +Ref: 23e47405395 +Ref: library/zipfile cmdoption-zipfile-e7405499 +Ref: 23e07405499 +Ref: library/zipfile cmdoption-zipfile-extract7405545 +Ref: 23e57405545 +Ref: library/zipfile cmdoption-zipfile-t7405644 +Ref: 23e67405644 +Ref: library/zipfile cmdoption-zipfile-test7405677 +Ref: 23e77405677 +Ref: library/zipfile cmdoption-zipfile-metadata-encoding7405763 +Ref: 23e87405763 +Node: Decompression pitfalls7405942 +Ref: library/zipfile decompression-pitfalls7406066 +Ref: 23e97406066 +Node: From file itself7406349 +Ref: library/zipfile from-file-itself7406456 +Ref: 23ea7406456 +Node: File System limitations7406635 +Ref: library/zipfile file-system-limitations7406772 +Ref: 23eb7406772 +Node: Resources limitations7407074 +Ref: library/zipfile resources-limitations7407207 +Ref: 23ec7407207 +Ref: library/zipfile zipfile-resources-limitations7407207 +Ref: 23ed7407207 +Ref: Resources limitations-Footnote-17407494 +Node: Interruption7407541 +Ref: library/zipfile interruption7407682 +Ref: 23ee7407682 +Node: Default behaviors of extraction7407888 +Ref: library/zipfile default-behaviors-of-extraction7407999 +Ref: 23ef7407999 +Node: tarfile — Read and write tar archive files7408264 +Ref: library/tarfile doc7408418 +Ref: 23f07408418 +Ref: library/tarfile module-tarfile7408418 +Ref: fd7408418 +Ref: library/tarfile pkzip-application-note7408418 +Ref: 23f17408418 +Ref: library/tarfile tarfile-read-and-write-tar-archive-files7408418 +Ref: 23f27408418 +Ref: library/tarfile tarfile open7409679 +Ref: b027409679 +Ref: library/tarfile tarfile is_tarfile7416130 +Ref: 12387416130 +Ref: library/tarfile tarfile TarError7416484 +Ref: 23f67416484 +Ref: library/tarfile tarfile ReadError7416573 +Ref: 12977416573 +Ref: library/tarfile tarfile CompressionError7416744 +Ref: 23f47416744 +Ref: library/tarfile tarfile StreamError7416894 +Ref: 23f77416894 +Ref: library/tarfile tarfile ExtractError7417033 +Ref: 23f87417033 +Ref: library/tarfile tarfile HeaderError7417203 +Ref: 23f97417203 +Ref: library/tarfile tarfile ENCODING7417388 +Ref: 23fb7417388 +Ref: library/tarfile tarfile USTAR_FORMAT7417735 +Ref: 23fd7417735 +Ref: library/tarfile tarfile GNU_FORMAT7417802 +Ref: 23fe7417802 +Ref: library/tarfile tarfile PAX_FORMAT7417854 +Ref: 23ff7417854 +Ref: library/tarfile tarfile DEFAULT_FORMAT7417917 +Ref: 24007417917 +Ref: tarfile — Read and write tar archive files-Footnote-17418767 +Ref: tarfile — Read and write tar archive files-Footnote-27418834 +Node: TarFile Objects7418906 +Ref: library/tarfile id17419026 +Ref: 24017419026 +Ref: library/tarfile tarfile-objects7419026 +Ref: 23f37419026 +Ref: library/tarfile tarfile TarFile7419894 +Ref: ebf7419894 +Ref: library/tarfile tarfile TarFile open7423284 +Ref: 12397423284 +Ref: library/tarfile tarfile TarFile getmember7423449 +Ref: 124a7423449 +Ref: library/tarfile tarfile TarFile getmembers7423772 +Ref: b067423772 +Ref: library/tarfile tarfile TarFile getnames7423959 +Ref: 24047423959 +Ref: library/tarfile tarfile TarFile list7424120 +Ref: b057424120 +Ref: library/tarfile tarfile TarFile next7424570 +Ref: 24057424570 +Ref: library/tarfile tarfile TarFile extractall7424790 +Ref: b037424790 +Ref: library/tarfile tarfile TarFile extract7426101 +Ref: b047426101 +Ref: library/tarfile tarfile TarFile extractfile7427316 +Ref: 24067427316 +Ref: library/tarfile tarfile TarFile add7427820 +Ref: 85e7427820 +Ref: library/tarfile tarfile TarFile addfile7428726 +Ref: 24077428726 +Ref: library/tarfile tarfile TarFile gettarinfo7429093 +Ref: 24087429093 +Ref: library/tarfile tarfile TarFile close7430234 +Ref: 240c7430234 +Ref: library/tarfile tarfile TarFile pax_headers7430376 +Ref: 240d7430376 +Node: TarInfo Objects7430481 +Ref: library/tarfile id27430635 +Ref: 240e7430635 +Ref: library/tarfile tarinfo-objects7430635 +Ref: 24027430635 +Ref: library/tarfile tarfile TarInfo7431115 +Ref: ec07431115 +Ref: library/tarfile tarfile TarInfo frombuf7431196 +Ref: 23fa7431196 +Ref: library/tarfile tarfile TarInfo fromtarfile7431409 +Ref: 240f7431409 +Ref: library/tarfile tarfile TarInfo tobuf7431589 +Ref: 24107431589 +Ref: library/tarfile tarfile TarInfo name7432028 +Ref: 240b7432028 +Ref: library/tarfile tarfile TarInfo size7432091 +Ref: 240a7432091 +Ref: library/tarfile tarfile TarInfo mtime7432141 +Ref: 24117432141 +Ref: library/tarfile tarfile TarInfo mode7432204 +Ref: 24127432204 +Ref: library/tarfile tarfile TarInfo type7432256 +Ref: 24137432256 +Ref: library/tarfile tarfile TarInfo linkname7432634 +Ref: 24147432634 +Ref: library/tarfile tarfile TarInfo uid7432802 +Ref: 24157432802 +Ref: library/tarfile tarfile TarInfo gid7432891 +Ref: 24167432891 +Ref: library/tarfile tarfile TarInfo uname7432981 +Ref: 24177432981 +Ref: library/tarfile tarfile TarInfo gname7433028 +Ref: 24187433028 +Ref: library/tarfile tarfile TarInfo pax_headers7433076 +Ref: 24197433076 +Ref: library/tarfile tarfile TarInfo isfile7433276 +Ref: 241a7433276 +Ref: library/tarfile tarfile TarInfo isreg7433384 +Ref: 241b7433384 +Ref: library/tarfile tarfile TarInfo isdir7433450 +Ref: 241c7433450 +Ref: library/tarfile tarfile TarInfo issym7433532 +Ref: 241d7433532 +Ref: library/tarfile tarfile TarInfo islnk7433618 +Ref: 241e7433618 +Ref: library/tarfile tarfile TarInfo ischr7433700 +Ref: 241f7433700 +Ref: library/tarfile tarfile TarInfo isblk7433789 +Ref: 24207433789 +Ref: library/tarfile tarfile TarInfo isfifo7433874 +Ref: 24217433874 +Ref: library/tarfile tarfile TarInfo isdev7433952 +Ref: 24227433952 +Node: Command-Line Interface<2>7434073 +Ref: library/tarfile command-line-interface7434223 +Ref: 24237434223 +Ref: library/tarfile tarfile-commandline7434223 +Ref: c6d7434223 +Node: Command-line options<2>7435176 +Ref: library/tarfile command-line-options7435261 +Ref: 24277435261 +Ref: library/tarfile cmdoption-tarfile-l7435322 +Ref: 24267435322 +Ref: library/tarfile cmdoption-tarfile-list7435355 +Ref: 24287435355 +Ref: library/tarfile cmdoption-tarfile-c7435424 +Ref: 24247435424 +Ref: library/tarfile cmdoption-tarfile-create7435481 +Ref: 24297435481 +Ref: library/tarfile cmdoption-tarfile-e7435585 +Ref: 24257435585 +Ref: library/tarfile cmdoption-tarfile-extract7435633 +Ref: 242a7435633 +Ref: library/tarfile cmdoption-tarfile-t7435777 +Ref: 242b7435777 +Ref: library/tarfile cmdoption-tarfile-test7435810 +Ref: 242c7435810 +Ref: library/tarfile cmdoption-tarfile-v7435896 +Ref: 242d7435896 +Ref: library/tarfile cmdoption-tarfile-verbose7435896 +Ref: 242e7435896 +Node: Examples<8>7435953 +Ref: library/tarfile examples7436109 +Ref: 242f7436109 +Ref: library/tarfile tar-examples7436109 +Ref: 23f57436109 +Node: Supported tar formats7437982 +Ref: library/tarfile supported-tar-formats7438127 +Ref: 24307438127 +Ref: library/tarfile tar-formats7438127 +Ref: 23fc7438127 +Node: Unicode issues7440347 +Ref: library/tarfile tar-unicode7440472 +Ref: 24037440472 +Ref: library/tarfile unicode-issues7440472 +Ref: 24317440472 +Node: File Formats7442444 +Ref: library/fileformats doc7442590 +Ref: 24337442590 +Ref: library/fileformats file-formats7442590 +Ref: 24347442590 +Ref: library/fileformats fileformats7442590 +Ref: 24357442590 +Node: csv — CSV File Reading and Writing7443041 +Ref: library/csv doc7443177 +Ref: 24367443177 +Ref: library/csv csv-csv-file-reading-and-writing7443177 +Ref: 24377443177 +Ref: library/csv module-csv7443177 +Ref: 287443177 +Ref: csv — CSV File Reading and Writing-Footnote-17445088 +Ref: csv — CSV File Reading and Writing-Footnote-27445151 +Ref: csv — CSV File Reading and Writing-Footnote-37445210 +Node: Module Contents<3>7445252 +Ref: library/csv csv-contents7445386 +Ref: 24387445386 +Ref: library/csv module-contents7445386 +Ref: 24397445386 +Ref: library/csv csv reader7445497 +Ref: 13527445497 +Ref: library/csv csv writer7447168 +Ref: 10f97447168 +Ref: library/csv csv register_dialect7448933 +Ref: 243b7448933 +Ref: library/csv csv unregister_dialect7449403 +Ref: 11ef7449403 +Ref: library/csv csv get_dialect7449610 +Ref: 11ee7449610 +Ref: library/csv csv list_dialects7449841 +Ref: 11f07449841 +Ref: library/csv csv field_size_limit7449928 +Ref: 11ed7449928 +Ref: library/csv csv DictReader7450163 +Ref: 6287450163 +Ref: library/csv csv DictWriter7451765 +Ref: ead7451765 +Ref: library/csv csv Dialect7453429 +Ref: 127e7453429 +Ref: library/csv csv excel7454314 +Ref: 243d7454314 +Ref: library/csv csv excel_tab7454497 +Ref: 243e7454497 +Ref: library/csv csv unix_dialect7454702 +Ref: eac7454702 +Ref: library/csv csv Sniffer7455003 +Ref: 243f7455003 +Ref: library/csv csv Sniffer sniff7455172 +Ref: 24407455172 +Ref: library/csv csv Sniffer has_header7455494 +Ref: 12a07455494 +Ref: library/csv csv QUOTE_ALL7456721 +Ref: 24417456721 +Ref: library/csv csv QUOTE_MINIMAL7456811 +Ref: 24427456811 +Ref: library/csv csv QUOTE_NONNUMERIC7457033 +Ref: 24437457033 +Ref: library/csv csv QUOTE_NONE7457229 +Ref: 24447457229 +Ref: library/csv csv Error7457730 +Ref: 243c7457730 +Ref: Module Contents<3>-Footnote-17457856 +Ref: Module Contents<3>-Footnote-27458197 +Node: Dialects and Formatting Parameters7458538 +Ref: library/csv csv-fmt-params7458695 +Ref: 243a7458695 +Ref: library/csv dialects-and-formatting-parameters7458695 +Ref: 24457458695 +Ref: library/csv csv Dialect delimiter7459489 +Ref: 24467459489 +Ref: library/csv csv Dialect doublequote7459609 +Ref: 24477459609 +Ref: library/csv csv Dialect escapechar7460081 +Ref: 24487460081 +Ref: library/csv csv Dialect lineterminator7460530 +Ref: 24497460530 +Ref: library/csv csv Dialect quotechar7460888 +Ref: 244a7460888 +Ref: library/csv csv Dialect quoting7461186 +Ref: 244b7461186 +Ref: library/csv csv Dialect skipinitialspace7461461 +Ref: 244c7461461 +Ref: library/csv csv Dialect strict7461630 +Ref: 244d7461630 +Node: Reader Objects7461770 +Ref: library/csv reader-objects7461923 +Ref: 244e7461923 +Ref: library/csv csv csvreader __next__7462117 +Ref: 244f7462117 +Ref: library/csv csv csvreader dialect7462514 +Ref: 24507462514 +Ref: library/csv csv csvreader line_num7462615 +Ref: 24517462615 +Ref: library/csv csv csvreader fieldnames7462867 +Ref: 24527462867 +Node: Writer Objects7463071 +Ref: library/csv writer-objects7463201 +Ref: 24537463201 +Ref: library/csv csv csvwriter writerow7463804 +Ref: a6b7463804 +Ref: library/csv csv csvwriter writerows7464134 +Ref: 24547464134 +Ref: library/csv csv csvwriter dialect7464397 +Ref: 24557464397 +Ref: library/csv csv DictWriter writeheader7464552 +Ref: eae7464552 +Node: Examples<9>7465036 +Ref: library/csv csv-examples7465143 +Ref: 24567465143 +Ref: library/csv examples7465143 +Ref: 24577465143 +Node: configparser — Configuration file parser7467146 +Ref: library/configparser doc7467319 +Ref: 24587467319 +Ref: library/configparser configparser-configuration-file-parser7467319 +Ref: 24597467319 +Ref: library/configparser module-configparser7467319 +Ref: 217467319 +Ref: configparser — Configuration file parser-Footnote-17468613 +Node: Quick Start7468685 +Ref: library/configparser quick-start7468803 +Ref: 245a7468803 +Ref: Quick Start-Footnote-17472435 +Ref: Quick Start-Footnote-27472637 +Node: Supported Datatypes7472839 +Ref: library/configparser supported-datatypes7472981 +Ref: 245e7472981 +Ref: Supported Datatypes-Footnote-17474303 +Ref: Supported Datatypes-Footnote-27474505 +Node: Fallback Values7474707 +Ref: library/configparser fallback-values7474866 +Ref: 24627474866 +Node: Supported INI File Structure7476364 +Ref: library/configparser supported-ini-file-structure7476527 +Ref: 245b7476527 +Ref: Supported INI File Structure-Footnote-17478997 +Ref: Supported INI File Structure-Footnote-27479199 +Ref: Supported INI File Structure-Footnote-37479401 +Ref: Supported INI File Structure-Footnote-47479603 +Ref: Supported INI File Structure-Footnote-57479805 +Node: Interpolation of values7480007 +Ref: library/configparser interpolation-of-values7480178 +Ref: 24647480178 +Ref: library/configparser configparser BasicInterpolation7480414 +Ref: 2db7480414 +Ref: library/configparser configparser ExtendedInterpolation7481703 +Ref: 2dc7481703 +Ref: Interpolation of values-Footnote-17483194 +Node: Mapping Protocol Access7483396 +Ref: library/configparser mapping-protocol-access7483567 +Ref: 245c7483567 +Ref: Mapping Protocol Access-Footnote-17486456 +Node: Customizing Parser Behaviour7486658 +Ref: library/configparser customizing-parser-behaviour7486825 +Ref: 245d7486825 +Ref: library/configparser configparser ConfigParser BOOLEAN_STATES7497562 +Ref: 24667497562 +Ref: library/configparser configparser ConfigParser SECTCRE7499748 +Ref: 24637499748 +Node: Legacy API Examples7500990 +Ref: library/configparser legacy-api-examples7501154 +Ref: 24677501154 +Node: ConfigParser Objects7504972 +Ref: library/configparser configparser-objects7505131 +Ref: 24687505131 +Ref: library/configparser id127505131 +Ref: 24697505131 +Ref: library/configparser configparser ConfigParser7505192 +Ref: 8877505192 +Ref: library/configparser configparser ConfigParser defaults7508995 +Ref: 246c7508995 +Ref: library/configparser configparser ConfigParser sections7509095 +Ref: 246d7509095 +Ref: library/configparser configparser ConfigParser add_section7509238 +Ref: f287509238 +Ref: library/configparser configparser ConfigParser has_section7509727 +Ref: 246e7509727 +Ref: library/configparser configparser ConfigParser options7509903 +Ref: 246f7509903 +Ref: library/configparser configparser ConfigParser has_option7510013 +Ref: 24707510013 +Ref: library/configparser configparser ConfigParser read7510313 +Ref: 14e67510313 +Ref: library/configparser configparser ConfigParser read_file7512038 +Ref: 24717512038 +Ref: library/configparser configparser ConfigParser read_string7512519 +Ref: 24737512519 +Ref: library/configparser configparser ConfigParser read_dict7512866 +Ref: 246b7512866 +Ref: library/configparser configparser ConfigParser get7513561 +Ref: f267513561 +Ref: library/configparser configparser ConfigParser getint7514517 +Ref: 24607514517 +Ref: library/configparser configparser ConfigParser getfloat7514805 +Ref: 24617514805 +Ref: library/configparser configparser ConfigParser getboolean7515108 +Ref: 245f7515108 +Ref: library/configparser configparser ConfigParser items7515838 +Ref: 24747515838 +Ref: library/configparser configparser ConfigParser set7516476 +Ref: f277516476 +Ref: library/configparser configparser ConfigParser write7516761 +Ref: 24657516761 +Ref: library/configparser configparser ConfigParser remove_option7517457 +Ref: 24767517457 +Ref: library/configparser configparser ConfigParser remove_section7517771 +Ref: 24777517771 +Ref: library/configparser configparser ConfigParser optionxform7517983 +Ref: 246a7517983 +Ref: library/configparser configparser ConfigParser readfp7518956 +Ref: 24727518956 +Ref: library/configparser configparser MAX_INTERPOLATION_DEPTH7519724 +Ref: 24787519724 +Node: RawConfigParser Objects7519950 +Ref: library/configparser id147520103 +Ref: 24797520103 +Ref: library/configparser rawconfigparser-objects7520103 +Ref: 247a7520103 +Ref: library/configparser configparser RawConfigParser7520172 +Ref: bff7520172 +Ref: library/configparser configparser RawConfigParser add_section7521154 +Ref: 247b7521154 +Ref: library/configparser configparser RawConfigParser set7521628 +Ref: 247c7521628 +Node: Exceptions<7>7522455 +Ref: library/configparser exceptions7522579 +Ref: 247d7522579 +Ref: library/configparser configparser Error7522622 +Ref: 247e7522622 +Ref: library/configparser configparser NoSectionError7522724 +Ref: 24757522724 +Ref: library/configparser configparser DuplicateSectionError7522830 +Ref: f297522830 +Ref: library/configparser configparser DuplicateOptionError7523236 +Ref: f2a7523236 +Ref: library/configparser configparser NoOptionError7523596 +Ref: 247f7523596 +Ref: library/configparser configparser InterpolationError7523730 +Ref: 24807523730 +Ref: library/configparser configparser InterpolationDepthError7523875 +Ref: 24817523875 +Ref: library/configparser configparser InterpolationMissingOptionError7524135 +Ref: 24827524135 +Ref: library/configparser configparser InterpolationSyntaxError7524324 +Ref: 24837524324 +Ref: library/configparser configparser MissingSectionHeaderError7524552 +Ref: 24847524552 +Ref: library/configparser configparser ParsingError7524697 +Ref: 24857524697 +Node: tomllib — Parse TOML files7524948 +Ref: library/tomllib doc7525116 +Ref: 24867525116 +Ref: library/tomllib module-tomllib7525116 +Ref: 11b7525116 +Ref: library/tomllib tomllib-parse-toml-files7525116 +Ref: 24877525116 +Ref: library/tomllib tomllib load7525944 +Ref: 24887525944 +Ref: library/tomllib tomllib loads7526669 +Ref: 248b7526669 +Ref: library/tomllib tomllib TOMLDecodeError7527088 +Ref: 248a7527088 +Ref: tomllib — Parse TOML files-Footnote-17527262 +Ref: tomllib — Parse TOML files-Footnote-27527326 +Ref: tomllib — Parse TOML files-Footnote-37527354 +Ref: tomllib — Parse TOML files-Footnote-47527396 +Node: Examples<10>7527438 +Ref: library/tomllib examples7527540 +Ref: 248c7527540 +Node: Conversion Table7527880 +Ref: library/tomllib conversion-table7527982 +Ref: 248d7527982 +Ref: library/tomllib toml-to-py-table7528035 +Ref: 24897528035 +Node: netrc — netrc file processing7529156 +Ref: library/netrc doc7529331 +Ref: 248e7529331 +Ref: library/netrc module-netrc7529331 +Ref: bc7529331 +Ref: library/netrc netrc-netrc-file-processing7529331 +Ref: 248f7529331 +Ref: library/netrc netrc netrc7529650 +Ref: 12c77529650 +Ref: library/netrc netrc NetrcParseError7531357 +Ref: 24907531357 +Ref: netrc — netrc file processing-Footnote-17531827 +Node: netrc Objects7531892 +Ref: library/netrc id17531973 +Ref: 24917531973 +Ref: library/netrc netrc-objects7531973 +Ref: 24927531973 +Ref: library/netrc netrc netrc authenticators7532078 +Ref: 24937532078 +Ref: library/netrc netrc netrc __repr__7532424 +Ref: 24947532424 +Ref: library/netrc netrc netrc hosts7532648 +Ref: 24957532648 +Ref: library/netrc netrc netrc macros7532846 +Ref: 24967532846 +Node: plistlib — Generate and parse Apple plist files7532929 +Ref: library/plistlib doc7533067 +Ref: 24977533067 +Ref: library/plistlib module-plistlib7533067 +Ref: cc7533067 +Ref: library/plistlib plistlib-generate-and-parse-apple-plist-files7533067 +Ref: 24987533067 +Ref: library/plistlib plistlib load7534495 +Ref: 59f7534495 +Ref: library/plistlib plistlib loads7535447 +Ref: 5a07535447 +Ref: library/plistlib plistlib dump7535653 +Ref: 5a17535653 +Ref: library/plistlib plistlib dumps7536751 +Ref: 5a27536751 +Ref: library/plistlib plistlib UID7537085 +Ref: 66d7537085 +Ref: library/plistlib plistlib FMT_XML7537489 +Ref: c177537489 +Ref: library/plistlib plistlib FMT_BINARY7537581 +Ref: c187537581 +Ref: plistlib — Generate and parse Apple plist files-Footnote-17537750 +Ref: plistlib — Generate and parse Apple plist files-Footnote-27537818 +Node: Examples<11>7537917 +Ref: library/plistlib examples7538015 +Ref: 24997538015 +Node: Cryptographic Services7538757 +Ref: library/crypto doc7538906 +Ref: 249a7538906 +Ref: library/crypto crypto7538906 +Ref: 249b7538906 +Ref: library/crypto cryptographic-services7538906 +Ref: 249c7538906 +Node: hashlib — Secure hashes and message digests7539391 +Ref: library/hashlib doc7539553 +Ref: 249d7539553 +Ref: library/hashlib hashlib-secure-hashes-and-message-digests7539553 +Ref: 249e7539553 +Ref: library/hashlib module-hashlib7539553 +Ref: 887539553 +Ref: hashlib — Secure hashes and message digests-Footnote-17540591 +Ref: hashlib — Secure hashes and message digests-Footnote-27540658 +Node: Hash algorithms7540717 +Ref: library/hashlib hash-algorithms7540852 +Ref: 249f7540852 +Ref: library/hashlib id17540852 +Ref: 24a07540852 +Ref: library/hashlib hashlib-usedforsecurity7542518 +Ref: 24a17542518 +Ref: library/hashlib hashlib new7543588 +Ref: 13567543588 +Ref: library/hashlib hashlib algorithms_guaranteed7544312 +Ref: 10037544312 +Ref: library/hashlib hashlib algorithms_available7544645 +Ref: 10047544645 +Ref: library/hashlib hashlib hash digest_size7545182 +Ref: 24a27545182 +Ref: library/hashlib hashlib hash block_size7545257 +Ref: 24a37545257 +Ref: library/hashlib hashlib hash name7545391 +Ref: be27545391 +Ref: library/hashlib hashlib hash update7545812 +Ref: 24a47545812 +Ref: library/hashlib hashlib hash digest7546299 +Ref: 24a57546299 +Ref: library/hashlib hashlib hash hexdigest7546539 +Ref: 24a67546539 +Ref: library/hashlib hashlib hash copy7546810 +Ref: 24a77546810 +Node: SHAKE variable length digests7546997 +Ref: library/hashlib shake-variable-length-digests7547153 +Ref: 24a87547153 +Ref: library/hashlib hashlib shake digest7547482 +Ref: 14717547482 +Ref: library/hashlib hashlib shake hexdigest7547706 +Ref: 14727547706 +Node: File hashing7547984 +Ref: library/hashlib file-hashing7548139 +Ref: 24a97548139 +Ref: library/hashlib hashlib file_digest7548284 +Ref: 2187548284 +Node: Key derivation7549685 +Ref: library/hashlib key-derivation7549817 +Ref: 24ab7549817 +Ref: library/hashlib hashlib pbkdf2_hmac7550128 +Ref: 3fb7550128 +Ref: library/hashlib hashlib scrypt7552080 +Ref: 8aa7552080 +Ref: Key derivation-Footnote-17552802 +Ref: Key derivation-Footnote-27552864 +Ref: Key derivation-Footnote-37552951 +Ref: Key derivation-Footnote-47553062 +Node: BLAKE27553121 +Ref: library/hashlib blake27553232 +Ref: 24ac7553232 +Ref: BLAKE2-Footnote-17553955 +Ref: BLAKE2-Footnote-27553982 +Ref: BLAKE2-Footnote-37554041 +Node: Creating hash objects7554119 +Ref: library/hashlib creating-hash-objects7554204 +Ref: 24ad7554204 +Ref: library/hashlib hashlib blake2b7554331 +Ref: 2167554331 +Ref: library/hashlib hashlib blake2s7554567 +Ref: 2177554567 +Ref: Creating hash objects-Footnote-17557612 +Node: Constants<5>7557659 +Ref: library/hashlib constants7557765 +Ref: 24ae7557765 +Ref: library/hashlib hashlib blake2b SALT_SIZE7557804 +Ref: 24af7557804 +Ref: library/hashlib hashlib blake2s SALT_SIZE7557833 +Ref: 24b07557833 +Ref: library/hashlib hashlib blake2b PERSON_SIZE7557918 +Ref: 24b17557918 +Ref: library/hashlib hashlib blake2s PERSON_SIZE7557949 +Ref: 24b27557949 +Ref: library/hashlib hashlib blake2b MAX_KEY_SIZE7558054 +Ref: 24b37558054 +Ref: library/hashlib hashlib blake2s MAX_KEY_SIZE7558086 +Ref: 24b47558086 +Ref: library/hashlib hashlib blake2b MAX_DIGEST_SIZE7558137 +Ref: 24b57558137 +Ref: library/hashlib hashlib blake2s MAX_DIGEST_SIZE7558172 +Ref: 24b67558172 +Node: Examples<12>7558263 +Ref: library/hashlib examples7558355 +Ref: 24b77558355 +Node: Simple hashing7558529 +Ref: library/hashlib simple-hashing7558629 +Ref: 24b87558629 +Node: Using different digest sizes7560051 +Ref: library/hashlib using-different-digest-sizes7560173 +Ref: 24b97560173 +Node: Keyed hashing7561316 +Ref: library/hashlib keyed-hashing7561442 +Ref: 24ba7561442 +Ref: Keyed hashing-Footnote-17563453 +Node: Randomized hashing7563496 +Ref: library/hashlib randomized-hashing7563609 +Ref: 24bb7563609 +Ref: Randomized hashing-Footnote-17566213 +Ref: Randomized hashing-Footnote-27566280 +Node: Personalization7566311 +Ref: library/hashlib personalization7566420 +Ref: 24bc7566420 +Ref: Personalization-Footnote-17568415 +Node: Tree mode7568485 +Ref: library/hashlib tree-mode7568567 +Ref: 24bd7568567 +Node: Credits7569818 +Ref: library/hashlib credits7569889 +Ref: 24be7569889 +Ref: Credits-Footnote-17572269 +Ref: Credits-Footnote-27572296 +Ref: Credits-Footnote-37572365 +Ref: Credits-Footnote-47572399 +Ref: Credits-Footnote-57572436 +Ref: Credits-Footnote-67572479 +Node: hmac — Keyed-Hashing for Message Authentication7572522 +Ref: library/hmac doc7572756 +Ref: 24bf7572756 +Ref: library/hmac hmac-keyed-hashing-for-message-authentication7572756 +Ref: 24c07572756 +Ref: library/hmac module-hmac7572756 +Ref: 8a7572756 +Ref: library/hmac hmac new7573048 +Ref: 6f97573048 +Ref: library/hmac hmac digest7573975 +Ref: 7947573975 +Ref: library/hmac hmac HMAC update7574616 +Ref: be47574616 +Ref: library/hmac hmac HMAC digest7574964 +Ref: 24c17574964 +Ref: library/hmac hmac HMAC hexdigest7575573 +Ref: 24c27575573 +Ref: library/hmac hmac HMAC copy7576161 +Ref: 24c37576161 +Ref: library/hmac hmac HMAC digest_size7576399 +Ref: be77576399 +Ref: library/hmac hmac HMAC block_size7576486 +Ref: be57576486 +Ref: library/hmac hmac HMAC name7576606 +Ref: be67576606 +Ref: library/hmac hmac compare_digest7576993 +Ref: d747576993 +Ref: hmac — Keyed-Hashing for Message Authentication-Footnote-17577930 +Ref: hmac — Keyed-Hashing for Message Authentication-Footnote-27577994 +Node: secrets — Generate secure random numbers for managing secrets7578053 +Ref: library/secrets doc7578233 +Ref: 24c47578233 +Ref: library/secrets module-secrets7578233 +Ref: e17578233 +Ref: library/secrets secrets-generate-secure-random-numbers-for-managing-secrets7578233 +Ref: 24c57578233 +Ref: secrets — Generate secure random numbers for managing secrets-Footnote-17579097 +Ref: secrets — Generate secure random numbers for managing secrets-Footnote-27579164 +Node: Random numbers7579206 +Ref: library/secrets random-numbers7579346 +Ref: 24c67579346 +Ref: library/secrets secrets SystemRandom7579519 +Ref: 24c77579519 +Ref: library/secrets secrets choice7579736 +Ref: 24c87579736 +Ref: library/secrets secrets randbelow7579843 +Ref: 24c97579843 +Ref: library/secrets secrets randbits7579929 +Ref: 24ca7579929 +Node: Generating tokens7580007 +Ref: library/secrets generating-tokens7580171 +Ref: 24cb7580171 +Ref: library/secrets secrets token_bytes7580390 +Ref: 21187580390 +Ref: library/secrets secrets token_hex7580683 +Ref: 24cc7580683 +Ref: library/secrets secrets token_urlsafe7581019 +Ref: 24cd7581019 +Node: How many bytes should tokens use?7581449 +Ref: library/secrets how-many-bytes-should-tokens-use7581536 +Ref: 24ce7581536 +Ref: How many bytes should tokens use?-Footnote-17582563 +Node: Other functions7582620 +Ref: library/secrets other-functions7582796 +Ref: 24cf7582796 +Ref: library/secrets secrets compare_digest7582847 +Ref: 24d07582847 +Ref: Other functions-Footnote-17583164 +Node: Recipes and best practices7583221 +Ref: library/secrets recipes-and-best-practices7583371 +Ref: 24d17583371 +Ref: Recipes and best practices-Footnote-17585110 +Ref: Recipes and best practices-Footnote-27585166 +Node: Generic Operating System Services7585196 +Ref: library/allos doc7585353 +Ref: 24d27585353 +Ref: library/allos allos7585353 +Ref: 24d37585353 +Ref: library/allos generic-operating-system-services7585353 +Ref: 24d47585353 +Node: os — Miscellaneous operating system interfaces7586904 +Ref: library/os doc7587073 +Ref: 24d57587073 +Ref: library/os module-os7587073 +Ref: c27587073 +Ref: library/os os-miscellaneous-operating-system-interfaces7587073 +Ref: 24d67587073 +Ref: library/os os error7589342 +Ref: 24d97589342 +Ref: library/os os name7589430 +Ref: 24da7589430 +Ref: library/os os-filenames7589873 +Ref: 24327589873 +Ref: os — Miscellaneous operating system interfaces-Footnote-17590300 +Node: File Names Command Line Arguments and Environment Variables7590362 +Ref: library/os file-names-command-line-arguments-and-environment-variables7590532 +Ref: 24db7590532 +Ref: library/os filesystem-encoding7590532 +Ref: 24dc7590532 +Node: Python UTF-8 Mode7591864 +Ref: library/os python-utf-8-mode7592061 +Ref: 24e07592061 +Ref: library/os utf8-mode7592061 +Ref: 2297592061 +Ref: Python UTF-8 Mode-Footnote-17594908 +Ref: Python UTF-8 Mode-Footnote-27594950 +Node: Process Parameters7594992 +Ref: library/os os-procinfo7595150 +Ref: 24e17595150 +Ref: library/os process-parameters7595150 +Ref: 24e27595150 +Ref: library/os os ctermid7595304 +Ref: 24e37595304 +Ref: library/os os environ7595487 +Ref: e6e7595487 +Ref: library/os os environb7597227 +Ref: ec67597227 +Ref: library/os os fsencode7597988 +Ref: 8c37597988 +Ref: library/os os fsdecode7598376 +Ref: 8c27598376 +Ref: library/os os fspath7598768 +Ref: 8c17598768 +Ref: library/os os PathLike7599179 +Ref: 8bf7599179 +Ref: library/os os PathLike __fspath__7599355 +Ref: 8c07599355 +Ref: library/os os getenv7599625 +Ref: 24e57599625 +Ref: library/os os getenvb7600302 +Ref: ec57600302 +Ref: library/os os get_exec_path7600878 +Ref: 24e67600878 +Ref: library/os os getegid7601257 +Ref: 24e77601257 +Ref: library/os os geteuid7601514 +Ref: 11bf7601514 +Ref: library/os os getgid7601664 +Ref: 24e87601664 +Ref: library/os os getgrouplist7601905 +Ref: dbf7601905 +Ref: library/os os getgroups7602314 +Ref: 24e97602314 +Ref: library/os os getlogin7603563 +Ref: 24eb7603563 +Ref: library/os os getpgid7604071 +Ref: 24ed7604071 +Ref: library/os os getpgrp7604322 +Ref: 24ee7604322 +Ref: library/os os getpid7604466 +Ref: 24d87604466 +Ref: library/os os getppid7604650 +Ref: 24ef7604650 +Ref: library/os os getpriority7605046 +Ref: daa7605046 +Ref: library/os os PRIO_PROCESS7605704 +Ref: 24f07605704 +Ref: library/os os PRIO_PGRP7605730 +Ref: 24f17605730 +Ref: library/os os PRIO_USER7605753 +Ref: 24f27605753 +Ref: library/os os getresuid7605965 +Ref: fb67605965 +Ref: library/os os getresgid7606202 +Ref: fb57606202 +Ref: library/os os getuid7606440 +Ref: 24d77606440 +Ref: library/os os initgroups7606677 +Ref: fb97606677 +Ref: library/os os putenv7606994 +Ref: 5647606994 +Ref: library/os os setegid7608118 +Ref: 24f47608118 +Ref: library/os os seteuid7608273 +Ref: 24f57608273 +Ref: library/os os setgid7608427 +Ref: 24f67608427 +Ref: library/os os setgroups7608569 +Ref: 24ea7608569 +Ref: library/os os setpgrp7609243 +Ref: 24f77609243 +Ref: library/os os setpgid7609505 +Ref: 24f87609505 +Ref: library/os os setpriority7609798 +Ref: dab7609798 +Ref: library/os os setregid7610601 +Ref: 24f97610601 +Ref: library/os os setresgid7610773 +Ref: fb77610773 +Ref: library/os os setresuid7610986 +Ref: fb87610986 +Ref: library/os os setreuid7611198 +Ref: 24fa7611198 +Ref: library/os os getsid7611369 +Ref: 24fb7611369 +Ref: library/os os setsid7611556 +Ref: 13fe7611556 +Ref: library/os os setuid7611737 +Ref: 24fc7611737 +Ref: library/os os strerror7611879 +Ref: 24fd7611879 +Ref: library/os os supports_bytes_environ7612125 +Ref: ec47612125 +Ref: library/os os umask7612290 +Ref: 24fe7612290 +Ref: library/os os uname7612510 +Ref: dc17612510 +Ref: library/os os unsetenv7613544 +Ref: 5637613544 +Ref: Process Parameters-Footnote-17614347 +Ref: Process Parameters-Footnote-27614389 +Node: File Object Creation7614431 +Ref: library/os file-object-creation7614598 +Ref: 25007614598 +Ref: library/os os-newstreams7614598 +Ref: 25017614598 +Ref: library/os os fdopen7614773 +Ref: 19057614773 +Node: File Descriptor Operations7615100 +Ref: library/os file-descriptor-operations7615270 +Ref: 25027615270 +Ref: library/os os-fd-ops7615270 +Ref: 25037615270 +Ref: library/os os close7616111 +Ref: 7d37616111 +Ref: library/os os closerange7616557 +Ref: 25047616557 +Ref: library/os os copy_file_range7616906 +Ref: 25057616906 +Ref: library/os os device_encoding7617928 +Ref: 128e7617928 +Ref: library/os os dup7618340 +Ref: 14067618340 +Ref: library/os os dup27618755 +Ref: 7c07618755 +Ref: library/os os fchmod7619257 +Ref: a077619257 +Ref: library/os os fchown7619784 +Ref: a087619784 +Ref: library/os os fdatasync7620365 +Ref: a097620365 +Ref: library/os os fpathconf7620596 +Ref: 25077620596 +Ref: library/os os fstat7621629 +Ref: a0a7621629 +Ref: library/os os fstatvfs7621889 +Ref: a0b7621889 +Ref: library/os os fsync7622166 +Ref: a0c7622166 +Ref: library/os os ftruncate7622651 +Ref: a0d7622651 +Ref: library/os os get_blocking7623096 +Ref: abd7623096 +Ref: library/os os isatty7623559 +Ref: 128d7623559 +Ref: library/os os lockf7623713 +Ref: dbe7623713 +Ref: library/os os F_LOCK7624233 +Ref: 25097624233 +Ref: library/os os F_TLOCK7624253 +Ref: 250a7624253 +Ref: library/os os F_ULOCK7624274 +Ref: 250b7624274 +Ref: library/os os F_TEST7624295 +Ref: 250c7624295 +Ref: library/os os login_tty7624449 +Ref: 250d7624449 +Ref: library/os os lseek7624822 +Ref: dc27624822 +Ref: library/os os SEEK_SET7625298 +Ref: 10937625298 +Ref: library/os os SEEK_CUR7625320 +Ref: 10947625320 +Ref: library/os os SEEK_END7625342 +Ref: 10957625342 +Ref: library/os os open7625603 +Ref: a107625603 +Ref: library/os os O_RDONLY7627669 +Ref: 250e7627669 +Ref: library/os os O_WRONLY7627691 +Ref: 250f7627691 +Ref: library/os os O_RDWR7627713 +Ref: 25117627713 +Ref: library/os os O_APPEND7627733 +Ref: 25127627733 +Ref: library/os os O_CREAT7627755 +Ref: 25137627755 +Ref: library/os os O_EXCL7627776 +Ref: 22727627776 +Ref: library/os os O_TRUNC7627796 +Ref: 25147627796 +Ref: library/os os O_DSYNC7627879 +Ref: 25157627879 +Ref: library/os os O_RSYNC7627900 +Ref: 25167627900 +Ref: library/os os O_SYNC7627921 +Ref: 25177627921 +Ref: library/os os O_NDELAY7627941 +Ref: 25187627941 +Ref: library/os os O_NONBLOCK7627963 +Ref: abf7627963 +Ref: library/os os O_NOCTTY7627987 +Ref: 25197627987 +Ref: library/os os O_CLOEXEC7628009 +Ref: d2d7628009 +Ref: library/os os O_BINARY7628153 +Ref: 25107628153 +Ref: library/os os O_NOINHERIT7628175 +Ref: 251a7628175 +Ref: library/os os O_SHORT_LIVED7628200 +Ref: 251b7628200 +Ref: library/os os O_TEMPORARY7628227 +Ref: 251c7628227 +Ref: library/os os O_RANDOM7628252 +Ref: 251d7628252 +Ref: library/os os O_SEQUENTIAL7628274 +Ref: 251e7628274 +Ref: library/os os O_TEXT7628300 +Ref: 251f7628300 +Ref: library/os os O_EVTONLY7628378 +Ref: 40d7628378 +Ref: library/os os O_FSYNC7628401 +Ref: 40e7628401 +Ref: library/os os O_SYMLINK7628422 +Ref: 40f7628422 +Ref: library/os os O_NOFOLLOW_ANY7628445 +Ref: 4107628445 +Ref: library/os os O_ASYNC7628680 +Ref: 25207628680 +Ref: library/os os O_DIRECT7628701 +Ref: 25217628701 +Ref: library/os os O_DIRECTORY7628723 +Ref: 25227628723 +Ref: library/os os O_NOFOLLOW7628748 +Ref: 25237628748 +Ref: library/os os O_NOATIME7628772 +Ref: 25247628772 +Ref: library/os os O_PATH7628795 +Ref: c107628795 +Ref: library/os os O_TMPFILE7628815 +Ref: c117628815 +Ref: library/os os O_SHLOCK7628838 +Ref: 10967628838 +Ref: library/os os O_EXLOCK7628860 +Ref: 10977628860 +Ref: library/os os openpty7629151 +Ref: 25257629151 +Ref: library/os os pipe7629611 +Ref: 11cc7629611 +Ref: library/os os pipe27629951 +Ref: d937629951 +Ref: library/os os posix_fallocate7630355 +Ref: a127630355 +Ref: library/os os posix_fadvise7630632 +Ref: a117630632 +Ref: library/os os POSIX_FADV_NORMAL7631237 +Ref: 25267631237 +Ref: library/os os POSIX_FADV_SEQUENTIAL7631268 +Ref: 25277631268 +Ref: library/os os POSIX_FADV_RANDOM7631303 +Ref: 25287631303 +Ref: library/os os POSIX_FADV_NOREUSE7631334 +Ref: 25297631334 +Ref: library/os os POSIX_FADV_WILLNEED7631366 +Ref: 252a7631366 +Ref: library/os os POSIX_FADV_DONTNEED7631399 +Ref: 252b7631399 +Ref: library/os os pread7631634 +Ref: 7bb7631634 +Ref: library/os os preadv7632024 +Ref: 7b97632024 +Ref: library/os os RWF_NOWAIT7633062 +Ref: 252d7633062 +Ref: library/os os RWF_HIPRI7633564 +Ref: 252c7633564 +Ref: library/os os pwrite7633955 +Ref: 7be7633955 +Ref: library/os os pwritev7634242 +Ref: 7bc7634242 +Ref: library/os os RWF_DSYNC7635278 +Ref: 252f7635278 +Ref: library/os os RWF_SYNC7635555 +Ref: 25307635555 +Ref: library/os os RWF_APPEND7635830 +Ref: 13547635830 +Ref: library/os os read7636385 +Ref: a137636385 +Ref: library/os os sendfile7637329 +Ref: 7627637329 +Ref: library/os os set_blocking7638850 +Ref: abe7638850 +Ref: library/os os SF_NODISKIO7639339 +Ref: 25317639339 +Ref: library/os os SF_MNOWAIT7639364 +Ref: 25327639364 +Ref: library/os os SF_SYNC7639388 +Ref: 25337639388 +Ref: library/os os SF_NOCACHE7639600 +Ref: 25347639600 +Ref: library/os os splice7639898 +Ref: 40c7639898 +Ref: library/os os SPLICE_F_MOVE7641307 +Ref: 25357641307 +Ref: library/os os SPLICE_F_NONBLOCK7641334 +Ref: 25367641334 +Ref: library/os os SPLICE_F_MORE7641365 +Ref: 25377641365 +Ref: library/os os readv7641420 +Ref: 7ba7641420 +Ref: library/os os tcgetpgrp7642039 +Ref: 25387642039 +Ref: library/os os tcsetpgrp7642267 +Ref: 25397642267 +Ref: library/os os ttyname7642509 +Ref: 253a7642509 +Ref: library/os os write7642763 +Ref: a197642763 +Ref: library/os os writev7643614 +Ref: 7bd7643614 +Ref: File Descriptor Operations-Footnote-17644311 +Ref: File Descriptor Operations-Footnote-27644353 +Ref: File Descriptor Operations-Footnote-37644416 +Ref: File Descriptor Operations-Footnote-47644458 +Node: Querying the size of a terminal7644500 +Ref: library/os querying-the-size-of-a-terminal7644634 +Ref: 253b7644634 +Ref: library/os terminal-size7644634 +Ref: 253c7644634 +Ref: library/os os get_terminal_size7644738 +Ref: dad7644738 +Ref: library/os os terminal_size7645378 +Ref: 229c7645378 +Ref: library/os os terminal_size columns7645499 +Ref: 253d7645499 +Ref: library/os os terminal_size lines7645583 +Ref: 253e7645583 +Node: Inheritance of File Descriptors7645666 +Ref: library/os fd-inheritance7645800 +Ref: b8a7645800 +Ref: library/os inheritance-of-file-descriptors7645800 +Ref: 253f7645800 +Ref: library/os os get_inheritable7646876 +Ref: b8b7646876 +Ref: library/os os set_inheritable7647006 +Ref: b8c7647006 +Ref: library/os os get_handle_inheritable7647132 +Ref: b8d7647132 +Ref: library/os os set_handle_inheritable7647301 +Ref: b8e7647301 +Node: Files and Directories7647471 +Ref: library/os files-and-directories7647639 +Ref: 25417647639 +Ref: library/os os-file-dir7647639 +Ref: 24e47647639 +Ref: library/os path-fd7647788 +Ref: 7b77647788 +Ref: library/os dir-fd7648732 +Ref: d947648732 +Ref: library/os follow-symlinks7649447 +Ref: d957649447 +Ref: library/os os access7650031 +Ref: d967650031 +Ref: library/os os F_OK7652579 +Ref: 25427652579 +Ref: library/os os R_OK7652597 +Ref: 25437652597 +Ref: library/os os W_OK7652615 +Ref: 25447652615 +Ref: library/os os X_OK7652633 +Ref: 25457652633 +Ref: library/os os chdir7652822 +Ref: 1e67652822 +Ref: library/os os chflags7653495 +Ref: d977653495 +Ref: library/os os chmod7654588 +Ref: d987654588 +Ref: library/os os chown7656475 +Ref: d997656475 +Ref: library/os os chroot7657489 +Ref: 13ac7657489 +Ref: library/os os fchdir7657721 +Ref: a067657721 +Ref: library/os os getcwd7658126 +Ref: 14327658126 +Ref: library/os os getcwdb7658220 +Ref: 6e77658220 +Ref: library/os os lchflags7658528 +Ref: 25477658528 +Ref: library/os os lchmod7659034 +Ref: 14747659034 +Ref: library/os os lchown7659605 +Ref: 25487659605 +Ref: library/os os link7660118 +Ref: d9a7660118 +Ref: library/os os listdir7660898 +Ref: da57660898 +Ref: library/os os lstat7662375 +Ref: 6547662375 +Ref: library/os os mkdir7663485 +Ref: d9b7663485 +Ref: library/os mkdir-modebits7663786 +Ref: 25497663786 +Ref: library/os os makedirs7664634 +Ref: 7bf7664634 +Ref: library/os os mkfifo7666353 +Ref: a0e7666353 +Ref: library/os os mknod7667265 +Ref: a0f7667265 +Ref: library/os os major7668162 +Ref: 254c7668162 +Ref: library/os os minor7668333 +Ref: 254d7668333 +Ref: library/os os makedev7668504 +Ref: 254b7668504 +Ref: library/os os pathconf7668628 +Ref: da67668628 +Ref: library/os os pathconf_names7669726 +Ref: 254e7669726 +Ref: library/os os readlink7670049 +Ref: 5687670049 +Ref: library/os os remove7671548 +Ref: d9c7671548 +Ref: library/os os removedirs7672479 +Ref: 254f7672479 +Ref: library/os os rename7673322 +Ref: d9d7673322 +Ref: library/os os renames7674813 +Ref: 25507674813 +Ref: library/os os replace7675601 +Ref: d9e7675601 +Ref: library/os os rmdir7676480 +Ref: d9f7676480 +Ref: library/os os scandir7677115 +Ref: 6b07677115 +Ref: library/os os scandir close7678892 +Ref: 92b7678892 +Ref: library/os os DirEntry7680416 +Ref: 8c47680416 +Ref: library/os os DirEntry name7681601 +Ref: 25527681601 +Ref: library/os os DirEntry path7681972 +Ref: 25537681972 +Ref: library/os os DirEntry inode7682707 +Ref: 25547682707 +Ref: library/os os DirEntry is_dir7683066 +Ref: 25517683066 +Ref: library/os os DirEntry is_file7684501 +Ref: a017684501 +Ref: library/os os DirEntry is_symlink7685224 +Ref: 25557685224 +Ref: library/os os DirEntry stat7686075 +Ref: 128f7686075 +Ref: library/os os stat7687495 +Ref: 6537687495 +Ref: library/os os stat_result7690077 +Ref: 14d07690077 +Ref: library/os os stat_result st_mode7690327 +Ref: 25567690327 +Ref: library/os os stat_result st_ino7690422 +Ref: 25577690422 +Ref: library/os os stat_result st_dev7690671 +Ref: 25587690671 +Ref: library/os os stat_result st_nlink7690763 +Ref: 25597690763 +Ref: library/os os stat_result st_uid7690826 +Ref: 255a7690826 +Ref: library/os os stat_result st_gid7690900 +Ref: 255b7690900 +Ref: library/os os stat_result st_size7690975 +Ref: 255c7690975 +Ref: library/os os stat_result st_atime7691229 +Ref: 255d7691229 +Ref: library/os os stat_result st_mtime7691319 +Ref: 23727691319 +Ref: library/os os stat_result st_ctime7691423 +Ref: 255e7691423 +Ref: library/os os stat_result st_atime_ns7691620 +Ref: 255f7691620 +Ref: library/os os stat_result st_mtime_ns7691741 +Ref: 25607691741 +Ref: library/os os stat_result st_ctime_ns7691876 +Ref: 25617691876 +Ref: library/os os stat_result st_blocks7693326 +Ref: 25627693326 +Ref: library/os os stat_result st_blksize7693500 +Ref: 25637693500 +Ref: library/os os stat_result st_rdev7693702 +Ref: 25647693702 +Ref: library/os os stat_result st_flags7693777 +Ref: 25657693777 +Ref: library/os os stat_result st_gen7694002 +Ref: 25667694002 +Ref: library/os os stat_result st_birthtime7694065 +Ref: 25677694065 +Ref: library/os os stat_result st_fstype7694220 +Ref: 7c17694220 +Ref: library/os os stat_result st_rsize7694427 +Ref: 25687694427 +Ref: library/os os stat_result st_creator7694491 +Ref: 25697694491 +Ref: library/os os stat_result st_type7694555 +Ref: 256a7694555 +Ref: library/os os stat_result st_file_attributes7694677 +Ref: library/os os stat_result st_reparse_tag7694984 +Ref: 256b7694984 +Ref: library/os os statvfs7696834 +Ref: da77696834 +Ref: library/os os supports_dir_fd7698857 +Ref: da37698857 +Ref: library/os os supports_effective_ids7700016 +Ref: da97700016 +Ref: library/os os supports_fd7700754 +Ref: da87700754 +Ref: library/os os supports_follow_symlinks7701576 +Ref: 22877701576 +Ref: library/os os symlink7702710 +Ref: da07702710 +Ref: library/os os sync7704484 +Ref: dbd7704484 +Ref: library/os os truncate7704616 +Ref: ac07704616 +Ref: library/os os unlink7705138 +Ref: da17705138 +Ref: library/os os utime7705663 +Ref: da27705663 +Ref: library/os os walk7707539 +Ref: a007707539 +Ref: library/os os fwalk7712724 +Ref: 7b67712724 +Ref: library/os os memfd_create7715319 +Ref: 6527715319 +Ref: library/os os MFD_CLOEXEC7716176 +Ref: 256c7716176 +Ref: library/os os MFD_ALLOW_SEALING7716201 +Ref: 256d7716201 +Ref: library/os os MFD_HUGETLB7716232 +Ref: 256e7716232 +Ref: library/os os MFD_HUGE_SHIFT7716257 +Ref: 256f7716257 +Ref: library/os os MFD_HUGE_MASK7716285 +Ref: 25707716285 +Ref: library/os os MFD_HUGE_64KB7716312 +Ref: 25717716312 +Ref: library/os os MFD_HUGE_512KB7716339 +Ref: 25727716339 +Ref: library/os os MFD_HUGE_1MB7716367 +Ref: 25737716367 +Ref: library/os os MFD_HUGE_2MB7716393 +Ref: 25747716393 +Ref: library/os os MFD_HUGE_8MB7716419 +Ref: 25757716419 +Ref: library/os os MFD_HUGE_16MB7716445 +Ref: 25767716445 +Ref: library/os os MFD_HUGE_32MB7716472 +Ref: 25777716472 +Ref: library/os os MFD_HUGE_256MB7716499 +Ref: 25787716499 +Ref: library/os os MFD_HUGE_512MB7716527 +Ref: 25797716527 +Ref: library/os os MFD_HUGE_1GB7716555 +Ref: 257a7716555 +Ref: library/os os MFD_HUGE_2GB7716581 +Ref: 257b7716581 +Ref: library/os os MFD_HUGE_16GB7716607 +Ref: 257c7716607 +Ref: library/os os eventfd7716857 +Ref: 40b7716857 +Ref: library/os os eventfd_read7718866 +Ref: 257e7718866 +Ref: library/os os eventfd_write7719153 +Ref: 257f7719153 +Ref: library/os os EFD_CLOEXEC7719452 +Ref: 119b7719452 +Ref: library/os os EFD_NONBLOCK7719635 +Ref: 119c7719635 +Ref: library/os os EFD_SEMAPHORE7719835 +Ref: 119d7719835 +Ref: Files and Directories-Footnote-17720173 +Ref: Files and Directories-Footnote-27720215 +Ref: Files and Directories-Footnote-37720280 +Ref: Files and Directories-Footnote-47720360 +Ref: Files and Directories-Footnote-57720442 +Ref: Files and Directories-Footnote-67720531 +Ref: Files and Directories-Footnote-77720620 +Node: Linux extended attributes7720678 +Ref: library/os linux-extended-attributes7720761 +Ref: 25807720761 +Ref: library/os os getxattr7720903 +Ref: daf7720903 +Ref: library/os os listxattr7721563 +Ref: db07721563 +Ref: library/os os removexattr7722171 +Ref: db17722171 +Ref: library/os os setxattr7722863 +Ref: db27722863 +Ref: library/os os XATTR_SIZE_MAX7724109 +Ref: 25837724109 +Ref: library/os os XATTR_CREATE7724245 +Ref: 25827724245 +Ref: library/os os XATTR_REPLACE7724416 +Ref: 25817724416 +Node: Process Management7724598 +Ref: library/os os-process7724766 +Ref: 25847724766 +Ref: library/os process-management7724766 +Ref: 25857724766 +Ref: library/os os abort7725381 +Ref: 25877725381 +Ref: library/os os add_dll_directory7725756 +Ref: 62d7725756 +Ref: library/os os execl7726918 +Ref: 25867726918 +Ref: library/os os execle7726965 +Ref: 25887726965 +Ref: library/os os execlp7727018 +Ref: 25897727018 +Ref: library/os os execlpe7727066 +Ref: 258a7727066 +Ref: library/os os execv7727120 +Ref: 24f37727120 +Ref: library/os os execve7727156 +Ref: da47727156 +Ref: library/os os execvp7727198 +Ref: 258b7727198 +Ref: library/os os execvpe7727235 +Ref: 258c7727235 +Ref: library/os os _exit7730482 +Ref: 1cef7730482 +Ref: library/os os EX_OK7731230 +Ref: 258d7731230 +Ref: library/os os EX_USAGE7731464 +Ref: 258e7731464 +Ref: library/os os EX_DATAERR7731672 +Ref: 258f7731672 +Ref: library/os os EX_NOINPUT7731819 +Ref: 25907731819 +Ref: library/os os EX_NOUSER7731990 +Ref: 25917731990 +Ref: library/os os EX_NOHOST7732138 +Ref: 25927732138 +Ref: library/os os EX_UNAVAILABLE7732286 +Ref: 25937732286 +Ref: library/os os EX_SOFTWARE7732447 +Ref: 25947732447 +Ref: library/os os EX_OSERR7732606 +Ref: 25957732606 +Ref: library/os os EX_OSFILE7732814 +Ref: 25967732814 +Ref: library/os os EX_CANTCREAT7733021 +Ref: 25977733021 +Ref: library/os os EX_IOERR7733196 +Ref: 25987733196 +Ref: library/os os EX_TEMPFAIL7733369 +Ref: 25997733369 +Ref: library/os os EX_PROTOCOL7733669 +Ref: 259a7733669 +Ref: library/os os EX_NOPERM7733858 +Ref: 259b7733858 +Ref: library/os os EX_CONFIG7734090 +Ref: 259c7734090 +Ref: library/os os EX_NOTFOUND7734259 +Ref: 259d7734259 +Ref: library/os os fork7734422 +Ref: cd47734422 +Ref: library/os os forkpty7735121 +Ref: 259e7735121 +Ref: library/os os kill7735863 +Ref: ffa7735863 +Ref: library/os os killpg7736836 +Ref: 13ff7736836 +Ref: library/os os nice7737101 +Ref: dac7737101 +Ref: library/os os pidfd_open7737292 +Ref: 5007737292 +Ref: library/os os plock7737728 +Ref: 25a17737728 +Ref: library/os os popen7737960 +Ref: 6d97737960 +Ref: library/os os posix_spawn7739895 +Ref: 6a87739895 +Ref: library/os os POSIX_SPAWN_OPEN7740901 +Ref: 25a27740901 +Ref: library/os os POSIX_SPAWN_CLOSE7741074 +Ref: 25a37741074 +Ref: library/os os POSIX_SPAWN_DUP27741197 +Ref: 25a47741197 +Ref: library/os os posix_spawnp7743840 +Ref: 14637743840 +Ref: library/os os register_at_fork7744590 +Ref: 7b87744590 +Ref: library/os os spawnl7746031 +Ref: 25407746031 +Ref: library/os os spawnle7746073 +Ref: 25a67746073 +Ref: library/os os spawnlp7746121 +Ref: 25a77746121 +Ref: library/os os spawnlpe7746164 +Ref: 25a87746164 +Ref: library/os os spawnv7746213 +Ref: 25a97746213 +Ref: library/os os spawnve7746256 +Ref: 25aa7746256 +Ref: library/os os spawnvp7746305 +Ref: 25ab7746305 +Ref: library/os os spawnvpe7746349 +Ref: 25ac7746349 +Ref: library/os os P_NOWAIT7750250 +Ref: 25ad7750250 +Ref: library/os os P_NOWAITO7750272 +Ref: 25af7750272 +Ref: library/os os P_WAIT7750618 +Ref: 25ae7750618 +Ref: library/os os P_DETACH7751035 +Ref: 25b07751035 +Ref: library/os os P_OVERLAY7751057 +Ref: 25b17751057 +Ref: library/os os startfile7751549 +Ref: 12d17751549 +Ref: library/os os system7754141 +Ref: 10c07754141 +Ref: library/os os times7755884 +Ref: dc07755884 +Ref: library/os os wait7756889 +Ref: a167756889 +Ref: library/os os waitid7757583 +Ref: a177757583 +Ref: library/os os P_PID7758460 +Ref: 25b27758460 +Ref: library/os os P_PGID7758479 +Ref: 25b37758479 +Ref: library/os os P_ALL7758499 +Ref: 25b47758499 +Ref: library/os os P_PIDFD7758725 +Ref: 5627758725 +Ref: library/os os WEXITED7758936 +Ref: 25b57758936 +Ref: library/os os WSTOPPED7758957 +Ref: 25b67758957 +Ref: library/os os WNOWAIT7758979 +Ref: 25b97758979 +Ref: library/os os CLD_EXITED7759207 +Ref: 25ba7759207 +Ref: library/os os CLD_KILLED7759231 +Ref: 5607759231 +Ref: library/os os CLD_DUMPED7759255 +Ref: 25bb7759255 +Ref: library/os os CLD_TRAPPED7759279 +Ref: 25bc7759279 +Ref: library/os os CLD_STOPPED7759304 +Ref: 5617759304 +Ref: library/os os CLD_CONTINUED7759329 +Ref: 25bd7759329 +Ref: library/os os waitpid7759654 +Ref: a187759654 +Ref: library/os os wait37761702 +Ref: a147761702 +Ref: library/os os wait47762331 +Ref: a157762331 +Ref: library/os os waitstatus_to_exitcode7762926 +Ref: 5657762926 +Ref: library/os os WNOHANG7764209 +Ref: 25b87764209 +Ref: library/os os WCONTINUED7764473 +Ref: 25b77764473 +Ref: library/os os WUNTRACED7764743 +Ref: 25be7764743 +Ref: library/os os WCOREDUMP7765205 +Ref: 25c57765205 +Ref: library/os os WIFCONTINUED7765503 +Ref: 25c67765503 +Ref: library/os os WIFSTOPPED7765847 +Ref: 25c37765847 +Ref: library/os os WIFSIGNALED7766265 +Ref: 25c17766265 +Ref: library/os os WIFEXITED7766471 +Ref: 25bf7766471 +Ref: library/os os WEXITSTATUS7766766 +Ref: 25c07766766 +Ref: library/os os WSTOPSIG7766994 +Ref: 25c47766994 +Ref: library/os os WTERMSIG7767240 +Ref: 25c27767240 +Ref: Process Management-Footnote-17767546 +Ref: Process Management-Footnote-27767618 +Ref: Process Management-Footnote-37767670 +Ref: Process Management-Footnote-47767779 +Node: Interface to the scheduler7767821 +Ref: library/os interface-to-the-scheduler7768000 +Ref: 25c87768000 +Ref: library/os os SCHED_OTHER7768385 +Ref: 25c97768385 +Ref: library/os os SCHED_BATCH7768448 +Ref: 25ca7768448 +Ref: library/os os SCHED_IDLE7768597 +Ref: 25cb7768597 +Ref: library/os os SCHED_SPORADIC7768691 +Ref: 25cc7768691 +Ref: library/os os SCHED_FIFO7768774 +Ref: 25cd7768774 +Ref: library/os os SCHED_RR7768845 +Ref: 25ce7768845 +Ref: library/os os SCHED_RESET_ON_FORK7768907 +Ref: 25cf7768907 +Ref: library/os os sched_param7769129 +Ref: 25a57769129 +Ref: library/os os sched_param sched_priority7769421 +Ref: 25d07769421 +Ref: library/os os sched_get_priority_min7769517 +Ref: db47769517 +Ref: library/os os sched_get_priority_max7769682 +Ref: db37769682 +Ref: library/os os sched_setscheduler7769847 +Ref: dbb7769847 +Ref: library/os os sched_getscheduler7770136 +Ref: db77770136 +Ref: library/os os sched_setparam7770361 +Ref: dba7770361 +Ref: library/os os sched_getparam7770578 +Ref: db67770578 +Ref: library/os os sched_rr_get_interval7770781 +Ref: db87770781 +Ref: library/os os sched_yield7770956 +Ref: dbc7770956 +Ref: library/os os sched_setaffinity7771027 +Ref: db97771027 +Ref: library/os os sched_getaffinity7771293 +Ref: db57771293 +Node: Miscellaneous System Information7771450 +Ref: library/os miscellaneous-system-information7771628 +Ref: 25d17771628 +Ref: library/os os-path7771628 +Ref: 25d27771628 +Ref: library/os os confstr7771715 +Ref: 25d37771715 +Ref: library/os os confstr_names7772754 +Ref: 25d47772754 +Ref: library/os os cpu_count7773047 +Ref: 40a7773047 +Ref: library/os os getloadavg7773373 +Ref: 25d57773373 +Ref: library/os os sysconf7773627 +Ref: 252e7773627 +Ref: library/os os sysconf_names7774051 +Ref: 25d67774051 +Ref: library/os os curdir7774607 +Ref: 21fc7774607 +Ref: library/os os pardir7774808 +Ref: 254a7774808 +Ref: library/os os sep7775009 +Ref: 23b7775009 +Ref: library/os os altsep7775421 +Ref: 23c7775421 +Ref: library/os os extsep7775720 +Ref: 25d77775720 +Ref: library/os os pathsep7775907 +Ref: 17887775907 +Ref: library/os os defpath7776151 +Ref: 14337776151 +Ref: library/os os linesep7776360 +Ref: 1bc27776360 +Ref: library/os os devnull7776773 +Ref: 14687776773 +Ref: library/os os RTLD_LAZY7776947 +Ref: dc37776947 +Ref: library/os os RTLD_NOW7776970 +Ref: dc47776970 +Ref: library/os os RTLD_GLOBAL7776992 +Ref: dc57776992 +Ref: library/os os RTLD_LOCAL7777017 +Ref: dc67777017 +Ref: library/os os RTLD_NODELETE7777041 +Ref: dc77777041 +Ref: library/os os RTLD_NOLOAD7777068 +Ref: dc87777068 +Ref: library/os os RTLD_DEEPBIND7777093 +Ref: dc97777093 +Node: Random numbers<2>7777337 +Ref: library/os random-numbers7777480 +Ref: 25d87777480 +Ref: library/os os getrandom7777531 +Ref: 92c7777531 +Ref: library/os os urandom7778359 +Ref: 2377778359 +Ref: library/os os GRND_NONBLOCK7780426 +Ref: 25da7780426 +Ref: library/os os GRND_RANDOM7780899 +Ref: 25d97780899 +Ref: Random numbers<2>-Footnote-17781118 +Ref: Random numbers<2>-Footnote-27781181 +Node: io — Core tools for working with streams7781223 +Ref: library/io doc7781437 +Ref: 25db7781437 +Ref: library/io io-core-tools-for-working-with-streams7781437 +Ref: 25dc7781437 +Ref: library/io module-io7781437 +Ref: 9f7781437 +Ref: io — Core tools for working with streams-Footnote-17781813 +Node: Overview<2>7781875 +Ref: library/io io-overview7781987 +Ref: 1bbe7781987 +Ref: library/io overview7781987 +Ref: 25dd7781987 +Node: Text I/O7783244 +Ref: library/io text-i-o7783319 +Ref: 25de7783319 +Node: Binary I/O7784010 +Ref: library/io binary-i-o7784101 +Ref: 25df7784101 +Node: Raw I/O7784970 +Ref: library/io raw-i-o7785044 +Ref: 25e07785044 +Node: Text Encoding7785497 +Ref: library/io io-text-encoding7785645 +Ref: 3a77785645 +Ref: library/io text-encoding7785645 +Ref: 25e17785645 +Ref: Text Encoding-Footnote-17786818 +Node: Opt-in EncodingWarning7786860 +Ref: library/io io-encoding-warning7786932 +Ref: 17957786932 +Ref: library/io opt-in-encodingwarning7786932 +Ref: 25e27786932 +Ref: Opt-in EncodingWarning-Footnote-17787742 +Node: High-level Module Interface7787784 +Ref: library/io high-level-module-interface7787936 +Ref: 25e37787936 +Ref: library/io io DEFAULT_BUFFER_SIZE7788011 +Ref: 1bbf7788011 +Ref: library/io io open7788246 +Ref: 30c7788246 +Ref: library/io io open_code7788688 +Ref: 13817788688 +Ref: library/io io text_encoding7789357 +Ref: 120a7789357 +Ref: library/io io BlockingIOError7790489 +Ref: 25e57790489 +Ref: library/io io UnsupportedOperation7790620 +Ref: 13b07790620 +Node: Class hierarchy7790967 +Ref: library/io class-hierarchy7791120 +Ref: 25e67791120 +Node: I/O Base Classes7795846 +Ref: library/io i-o-base-classes7795935 +Ref: 25e87795935 +Ref: library/io io IOBase7795988 +Ref: 6417795988 +Ref: library/io io IOBase close7797835 +Ref: 145e7797835 +Ref: library/io io IOBase closed7798245 +Ref: 145f7798245 +Ref: library/io io IOBase fileno7798320 +Ref: 24aa7798320 +Ref: library/io io IOBase flush7798541 +Ref: 25e97798541 +Ref: library/io io IOBase isatty7798701 +Ref: 1bc07798701 +Ref: library/io io IOBase readable7798841 +Ref: 25ea7798841 +Ref: library/io io IOBase readline7799003 +Ref: 1ce17799003 +Ref: library/io io IOBase readlines7799376 +Ref: 1d957799376 +Ref: library/io io IOBase seek7799941 +Ref: 23b57799941 +Ref: library/io io IOBase seekable7800940 +Ref: 25eb7800940 +Ref: library/io io IOBase tell7801172 +Ref: 23b67801172 +Ref: library/io io IOBase truncate7801245 +Ref: fb07801245 +Ref: library/io io IOBase writable7801823 +Ref: 25ec7801823 +Ref: library/io io IOBase writelines7802023 +Ref: 1d967802023 +Ref: library/io io IOBase __del__7802246 +Ref: 25ed7802246 +Ref: library/io io RawIOBase7802464 +Ref: d7b7802464 +Ref: library/io io RawIOBase read7802959 +Ref: aa07802959 +Ref: library/io io RawIOBase readall7803644 +Ref: 25ee7803644 +Ref: library/io io RawIOBase readinto7803800 +Ref: aa17803800 +Ref: library/io io RawIOBase write7804141 +Ref: 25ef7804141 +Ref: library/io io BufferedIOBase7804780 +Ref: 9497804780 +Ref: library/io io BufferedIOBase raw7805975 +Ref: 25f17805975 +Ref: library/io io BufferedIOBase detach7806245 +Ref: 25f27806245 +Ref: library/io io BufferedIOBase read7806679 +Ref: 23747806679 +Ref: library/io io BufferedIOBase read17807488 +Ref: 23737807488 +Ref: library/io io BufferedIOBase readinto7807973 +Ref: 25f07807973 +Ref: library/io io BufferedIOBase readinto17808507 +Ref: a9f7808507 +Ref: library/io io BufferedIOBase write7809002 +Ref: 94a7809002 +Node: Raw File I/O7809822 +Ref: library/io raw-file-i-o7809936 +Ref: 25f37809936 +Ref: library/io io FileIO7809983 +Ref: faf7809983 +Ref: library/io io FileIO mode7812267 +Ref: 25f47812267 +Ref: library/io io FileIO name7812342 +Ref: 24097812342 +Node: Buffered Streams7812487 +Ref: library/io buffered-streams7812596 +Ref: 25f57812596 +Ref: library/io io BytesIO7812742 +Ref: b317812742 +Ref: library/io io BytesIO getbuffer7813219 +Ref: ea17813219 +Ref: library/io io BytesIO getvalue7813786 +Ref: 23717813786 +Ref: library/io io BytesIO read17813908 +Ref: 25f67813908 +Ref: library/io io BytesIO readinto17814092 +Ref: 25f77814092 +Ref: library/io io BufferedReader7814246 +Ref: ebd7814246 +Ref: library/io io BufferedReader peek7815079 +Ref: 25f87815079 +Ref: library/io io BufferedReader read7815353 +Ref: 25f97815353 +Ref: library/io io BufferedReader read17815554 +Ref: 25fa7815554 +Ref: library/io io BufferedWriter7815893 +Ref: 1bc37815893 +Ref: library/io io BufferedWriter flush7816999 +Ref: 25fb7816999 +Ref: library/io io BufferedWriter write7817183 +Ref: 25fc7817183 +Ref: library/io io BufferedRandom7817473 +Ref: 1bc47817473 +Ref: library/io io BufferedRWPair7818148 +Ref: 25e77818148 +Node: Text I/O<2>7819083 +Ref: library/io id17819171 +Ref: 25fd7819171 +Ref: library/io io TextIOBase7819210 +Ref: f507819210 +Ref: library/io io TextIOBase encoding7819516 +Ref: 25fe7819516 +Ref: library/io io TextIOBase errors7819676 +Ref: 25ff7819676 +Ref: library/io io TextIOBase newlines7819760 +Ref: 26007819760 +Ref: library/io io TextIOBase buffer7820004 +Ref: f517820004 +Ref: library/io io TextIOBase detach7820277 +Ref: 26017820277 +Ref: library/io io TextIOBase read7820792 +Ref: 26027820792 +Ref: library/io io TextIOBase readline7821001 +Ref: 22087821001 +Ref: library/io io TextIOBase seek7821268 +Ref: 26037821268 +Ref: library/io io TextIOBase tell7822239 +Ref: 26047822239 +Ref: library/io io TextIOBase write7822443 +Ref: 26057822443 +Ref: library/io io TextIOWrapper7822575 +Ref: 9ad7822575 +Ref: library/io io TextIOWrapper line_buffering7826343 +Ref: 26067826343 +Ref: library/io io TextIOWrapper write_through7826425 +Ref: 26077826425 +Ref: library/io io TextIOWrapper reconfigure7826583 +Ref: 7a07826583 +Ref: library/io io StringIO7827456 +Ref: bbe7827456 +Ref: library/io io StringIO getvalue7828617 +Ref: 26087828617 +Ref: library/io io IncrementalNewlineDecoder7829265 +Ref: 26097829265 +Node: Performance<3>7829447 +Ref: library/io performance7829564 +Ref: 260a7829564 +Node: Binary I/O<2>7829813 +Ref: library/io id27829897 +Ref: 260b7829897 +Node: Text I/O<3>7830549 +Ref: library/io id37830660 +Ref: 260c7830660 +Node: Multi-threading<3>7831237 +Ref: library/io multi-threading7831345 +Ref: 260d7831345 +Node: Reentrancy7831878 +Ref: library/io reentrancy7831966 +Ref: 260e7831966 +Node: time — Time access and conversions7832758 +Ref: library/time doc7832995 +Ref: 260f7832995 +Ref: library/time module-time7832995 +Ref: 10c7832995 +Ref: library/time time-time-access-and-conversions7832995 +Ref: 26107832995 +Ref: library/time epoch7833695 +Ref: 26117833695 +Ref: time — Time access and conversions-Footnote-17838013 +Node: Functions<4>7838063 +Ref: library/time functions7838175 +Ref: 26127838175 +Ref: library/time time-functions7838175 +Ref: 26137838175 +Ref: library/time time asctime7838214 +Ref: e977838214 +Ref: library/time time pthread_getcpuclockid7838882 +Ref: 7f47838882 +Ref: library/time time clock_getres7839487 +Ref: e0f7839487 +Ref: library/time time clock_gettime7839762 +Ref: e107839762 +Ref: library/time time clock_gettime_ns7840142 +Ref: 7377840142 +Ref: library/time time clock_settime7840342 +Ref: e117840342 +Ref: library/time time clock_settime_ns7840712 +Ref: 7387840712 +Ref: library/time time ctime7840915 +Ref: 1eb37840915 +Ref: library/time time get_clock_info7841495 +Ref: e0e7841495 +Ref: library/time time gmtime7842626 +Ref: e737842626 +Ref: library/time time localtime7843118 +Ref: 13ad7843118 +Ref: library/time time mktime7843762 +Ref: e987843762 +Ref: library/time time monotonic7844472 +Ref: b0a7844472 +Ref: library/time time monotonic_ns7845126 +Ref: 7397845126 +Ref: library/time time perf_counter7845268 +Ref: 6da7845268 +Ref: library/time time perf_counter_ns7845901 +Ref: 73a7845901 +Ref: library/time time process_time7846054 +Ref: 6db7846054 +Ref: library/time time process_time_ns7846581 +Ref: 73b7846581 +Ref: library/time time sleep7846734 +Ref: 2667846734 +Ref: library/time time strftime7848333 +Ref: e997848333 +Ref: library/time time strptime7855438 +Ref: 10907855438 +Ref: library/time time struct_time7857139 +Ref: 9597857139 +Ref: library/time time time7859901 +Ref: 7367859901 +Ref: library/time time time_ns7861148 +Ref: 73c7861148 +Ref: library/time time thread_time7861335 +Ref: 57e7861335 +Ref: library/time time thread_time_ns7862002 +Ref: 7f37862002 +Ref: library/time time tzset7862153 +Ref: 26167862153 +Ref: Functions<4>-Footnote-17866062 +Ref: Functions<4>-Footnote-27866159 +Ref: Functions<4>-Footnote-37866201 +Ref: Functions<4>-Footnote-47866886 +Ref: Functions<4>-Footnote-57867571 +Ref: Functions<4>-Footnote-67867621 +Ref: Functions<4>-Footnote-77867680 +Ref: Functions<4>-Footnote-87868365 +Ref: Functions<4>-Footnote-97868415 +Node: Clock ID Constants7868463 +Ref: library/time clock-id-constants7868602 +Ref: 26177868602 +Ref: library/time time-clock-id-constants7868602 +Ref: 26157868602 +Ref: library/time time CLOCK_BOOTTIME7868762 +Ref: 7f07868762 +Ref: library/time time CLOCK_HIGHRES7869238 +Ref: 26187869238 +Ref: library/time time CLOCK_MONOTONIC7869564 +Ref: 2637869564 +Ref: library/time time CLOCK_MONOTONIC_RAW7869766 +Ref: 26197869766 +Ref: library/time time CLOCK_PROCESS_CPUTIME_ID7870033 +Ref: 261a7870033 +Ref: library/time time CLOCK_PROF7870193 +Ref: 7f17870193 +Ref: library/time time CLOCK_TAI7870364 +Ref: 13837870364 +Ref: library/time time CLOCK_THREAD_CPUTIME_ID7870657 +Ref: 261b7870657 +Ref: library/time time CLOCK_UPTIME7870800 +Ref: 7f27870800 +Ref: library/time time CLOCK_UPTIME_RAW7871081 +Ref: 6907871081 +Ref: library/time time CLOCK_REALTIME7871472 +Ref: 2647871472 +Ref: Clock ID Constants-Footnote-17871697 +Node: Timezone Constants7871804 +Ref: library/time time-timezone-constants7871922 +Ref: 261c7871922 +Ref: library/time timezone-constants7871922 +Ref: 261d7871922 +Ref: library/time time altzone7871979 +Ref: 261e7871979 +Ref: library/time time daylight7872267 +Ref: 261f7872267 +Ref: library/time time timezone7872353 +Ref: 26207872353 +Ref: library/time time tzname7872551 +Ref: 26217872551 +Node: argparse — Parser for command-line options arguments and sub-commands7873737 +Ref: library/argparse doc7873982 +Ref: 26227873982 +Ref: library/argparse argparse-parser-for-command-line-options-arguments-and-sub-commands7873982 +Ref: 26237873982 +Ref: library/argparse module-argparse7873982 +Ref: 57873982 +Ref: argparse — Parser for command-line options arguments and sub-commands-Footnote-17875187 +Node: Core Functionality7875255 +Ref: library/argparse core-functionality7875418 +Ref: 26257875418 +Node: Quick Links for add_argument7876597 +Ref: library/argparse quick-links-for-add-argument7876779 +Ref: 26297876779 +Node: Example<7>7880096 +Ref: library/argparse example7880282 +Ref: 26347880282 +Node: Creating a parser7881895 +Ref: library/argparse creating-a-parser7881984 +Ref: 26357881984 +Node: Adding arguments7882347 +Ref: library/argparse adding-arguments7882462 +Ref: 26367882462 +Node: Parsing arguments7883613 +Ref: library/argparse parsing-arguments7883702 +Ref: 26377883702 +Node: ArgumentParser objects7884432 +Ref: library/argparse argumentparser-objects7884613 +Ref: 26387884613 +Ref: library/argparse argparse ArgumentParser7884678 +Ref: a3e7884678 +Node: prog7887426 +Ref: library/argparse id17887503 +Ref: 26457887503 +Ref: library/argparse prog7887503 +Ref: 26397887503 +Node: usage7889321 +Ref: library/argparse usage7889418 +Ref: 263a7889418 +Node: description7890566 +Ref: library/argparse description7890665 +Ref: 263b7890665 +Ref: library/argparse id27890665 +Ref: 26467890665 +Node: epilog7891419 +Ref: library/argparse epilog7891520 +Ref: 263c7891520 +Node: parents7892290 +Ref: library/argparse parents7892395 +Ref: 263d7892395 +Node: formatter_class7893849 +Ref: library/argparse formatter-class7893960 +Ref: 263e7893960 +Ref: library/argparse id37893960 +Ref: 26477893960 +Ref: library/argparse argparse RawDescriptionHelpFormatter7894178 +Ref: 26487894178 +Ref: library/argparse argparse RawTextHelpFormatter7894226 +Ref: 26497894226 +Ref: library/argparse argparse ArgumentDefaultsHelpFormatter7894267 +Ref: 12987894267 +Ref: library/argparse argparse MetavarTypeHelpFormatter7894317 +Ref: 264a7894317 +Node: prefix_chars7897784 +Ref: library/argparse prefix-chars7897909 +Ref: 263f7897909 +Node: fromfile_prefix_chars7898647 +Ref: library/argparse fromfile-prefix-chars7898773 +Ref: 26407898773 +Node: argument_default7900036 +Ref: library/argparse argument-default7900162 +Ref: 26417900162 +Node: allow_abbrev7901049 +Ref: library/argparse allow-abbrev7901170 +Ref: a407901170 +Ref: library/argparse id47901170 +Ref: 264d7901170 +Node: conflict_handler7901821 +Ref: library/argparse conflict-handler7901934 +Ref: 26427901934 +Node: add_help7903481 +Ref: library/argparse add-help7903595 +Ref: 26437903595 +Node: exit_on_error7905140 +Ref: library/argparse exit-on-error7905229 +Ref: 26447905229 +Node: The add_argument method7906053 +Ref: library/argparse the-add-argument-method7906245 +Ref: 264e7906245 +Ref: library/argparse argparse ArgumentParser add_argument7906318 +Ref: 26267906318 +Node: name or flags7908164 +Ref: library/argparse id57908252 +Ref: 264f7908252 +Ref: library/argparse name-or-flags7908252 +Ref: 26507908252 +Node: action7909401 +Ref: library/argparse action7909503 +Ref: 262a7909503 +Ref: library/argparse id67909503 +Ref: 26517909503 +Node: nargs7915784 +Ref: library/argparse id77915878 +Ref: 26527915878 +Ref: library/argparse nargs7915878 +Ref: 26317915878 +Node: const7919914 +Ref: library/argparse const7920009 +Ref: 262c7920009 +Ref: library/argparse id87920009 +Ref: 26537920009 +Node: default7921306 +Ref: library/argparse default7921400 +Ref: 262d7921400 +Ref: library/argparse id97921400 +Ref: 26547921400 +Node: type7923607 +Ref: library/argparse id107923703 +Ref: 26557923703 +Ref: library/argparse type7923703 +Ref: 26337923703 +Node: choices7926660 +Ref: library/argparse choices7926757 +Ref: 262b7926757 +Ref: library/argparse id117926757 +Ref: 26567926757 +Node: required7928675 +Ref: library/argparse id127928772 +Ref: 26577928772 +Ref: library/argparse required7928772 +Ref: 26327928772 +Node: help7929732 +Ref: library/argparse help7929829 +Ref: 262f7929829 +Ref: library/argparse id137929829 +Ref: 26587929829 +Node: metavar7931908 +Ref: library/argparse id147932001 +Ref: 26597932001 +Ref: library/argparse metavar7932001 +Ref: 26307932001 +Node: dest7934210 +Ref: library/argparse dest7934313 +Ref: 262e7934313 +Ref: library/argparse id157934313 +Ref: 265a7934313 +Node: Action classes7935948 +Ref: library/argparse action-classes7936035 +Ref: 265b7936035 +Ref: library/argparse argparse Action7936317 +Ref: 11e57936317 +Node: The parse_args method7938331 +Ref: library/argparse the-parse-args-method7938516 +Ref: 265c7938516 +Ref: library/argparse argparse ArgumentParser parse_args7938585 +Ref: 26277938585 +Node: Option value syntax7939461 +Ref: library/argparse option-value-syntax7939564 +Ref: 265f7939564 +Node: Invalid arguments7940961 +Ref: library/argparse invalid-arguments7941095 +Ref: 26607941095 +Node: Arguments containing -7942080 +Ref: library/argparse arguments-containing7942233 +Ref: 26617942233 +Node: Argument abbreviations prefix matching7944238 +Ref: library/argparse argument-abbreviations-prefix-matching7944389 +Ref: 26627944389 +Ref: library/argparse prefix-matching7944389 +Ref: a3f7944389 +Node: Beyond sys argv7945317 +Ref: library/argparse args7945466 +Ref: 265d7945466 +Ref: library/argparse beyond-sys-argv7945466 +Ref: 26637945466 +Node: The Namespace object7946416 +Ref: library/argparse namespace7946518 +Ref: 265e7946518 +Ref: library/argparse the-namespace-object7946518 +Ref: 26647946518 +Ref: library/argparse argparse Namespace7946581 +Ref: 26287946581 +Node: Other utilities7947606 +Ref: library/argparse other-utilities7947791 +Ref: 26657947791 +Node: Sub-commands7948063 +Ref: library/argparse sub-commands7948152 +Ref: 26667948152 +Ref: library/argparse argparse ArgumentParser add_subparsers7948199 +Ref: 8817948199 +Node: FileType objects7957050 +Ref: library/argparse filetype-objects7957163 +Ref: 26677957163 +Ref: library/argparse argparse FileType7957218 +Ref: bb17957218 +Node: Argument groups7958669 +Ref: library/argparse argument-groups7958786 +Ref: 26687958786 +Ref: library/argparse argparse ArgumentParser add_argument_group7958839 +Ref: 26697958839 +Node: Mutual exclusion7961242 +Ref: library/argparse mutual-exclusion7961358 +Ref: 266a7961358 +Ref: library/argparse argparse ArgumentParser add_mutually_exclusive_group7961413 +Ref: 266b7961413 +Node: Parser defaults7963363 +Ref: library/argparse parser-defaults7963477 +Ref: 266c7963477 +Ref: library/argparse argparse ArgumentParser set_defaults7963530 +Ref: 264c7963530 +Ref: library/argparse argparse ArgumentParser get_default7964654 +Ref: 266d7964654 +Node: Printing help7965011 +Ref: library/argparse printing-help7965124 +Ref: 266e7965124 +Ref: library/argparse argparse ArgumentParser print_usage7965353 +Ref: 266f7965353 +Ref: library/argparse argparse ArgumentParser print_help7965585 +Ref: 26707965585 +Ref: library/argparse argparse ArgumentParser format_usage7965939 +Ref: 13f07965939 +Ref: library/argparse argparse ArgumentParser format_help7966118 +Ref: 26717966118 +Node: Partial parsing7966331 +Ref: library/argparse partial-parsing7966453 +Ref: 26727966453 +Ref: library/argparse argparse ArgumentParser parse_known_args7966506 +Ref: 26737966506 +Node: Customizing file parsing7967545 +Ref: library/argparse customizing-file-parsing7967669 +Ref: 26747967669 +Ref: library/argparse argparse ArgumentParser convert_arg_line_to_args7967740 +Ref: 264b7967740 +Node: Exiting methods7968645 +Ref: library/argparse exiting-methods7968772 +Ref: 26757968772 +Ref: library/argparse argparse ArgumentParser exit7968825 +Ref: 26767968825 +Ref: library/argparse argparse ArgumentParser error7969357 +Ref: 26777969357 +Node: Intermixed parsing7969545 +Ref: library/argparse intermixed-parsing7969639 +Ref: 26787969639 +Ref: library/argparse argparse ArgumentParser parse_intermixed_args7969698 +Ref: 7547969698 +Ref: library/argparse argparse ArgumentParser parse_known_intermixed_args7969786 +Ref: 26797969786 +Node: Upgrading optparse code7971319 +Ref: library/argparse id167971474 +Ref: 267a7971474 +Ref: library/argparse upgrading-optparse-code7971474 +Ref: e617971474 +Node: getopt — C-style parser for command line options7973972 +Ref: library/getopt doc7974220 +Ref: 267d7974220 +Ref: library/getopt getopt-c-style-parser-for-command-line-options7974220 +Ref: 267e7974220 +Ref: library/getopt module-getopt7974220 +Ref: 817974220 +Ref: library/getopt getopt getopt7975232 +Ref: 267f7975232 +Ref: library/getopt getopt gnu_getopt7977419 +Ref: 26817977419 +Ref: library/getopt getopt GetoptError7977999 +Ref: 26807977999 +Ref: library/getopt getopt error7978579 +Ref: 26827978579 +Ref: getopt — C-style parser for command line options-Footnote-17981021 +Node: logging — Logging facility for Python7981087 +Ref: library/logging doc7981304 +Ref: 26837981304 +Ref: library/logging logging-logging-facility-for-python7981304 +Ref: 26847981304 +Ref: library/logging module-logging7981304 +Ref: a87981304 +Ref: logging — Logging facility for Python-Footnote-17983202 +Node: Logger Objects7983279 +Ref: library/logging logger7983392 +Ref: 26857983392 +Ref: library/logging logger-objects7983392 +Ref: 26867983392 +Ref: library/logging logging Logger7984484 +Ref: 7a97984484 +Ref: library/logging logging Logger propagate7984511 +Ref: 26877984511 +Ref: library/logging logging Logger setLevel7986580 +Ref: 26887986580 +Ref: library/logging logging Logger isEnabledFor7988541 +Ref: 268a7988541 +Ref: library/logging logging Logger getEffectiveLevel7988884 +Ref: 26897988884 +Ref: library/logging logging Logger getChild7989355 +Ref: f9b7989355 +Ref: library/logging logging Logger debug7989854 +Ref: aae7989854 +Ref: library/logging logging Logger info7995294 +Ref: 268d7995294 +Ref: library/logging logging Logger warning7995473 +Ref: 268f7995473 +Ref: library/logging logging Logger error7995879 +Ref: 26907995879 +Ref: library/logging logging Logger critical7996060 +Ref: aad7996060 +Ref: library/logging logging Logger log7996247 +Ref: aab7996247 +Ref: library/logging logging Logger exception7996443 +Ref: aac7996443 +Ref: library/logging logging Logger addFilter7996758 +Ref: 26917996758 +Ref: library/logging logging Logger removeFilter7996857 +Ref: 26927996857 +Ref: library/logging logging Logger filter7996964 +Ref: 26937996964 +Ref: library/logging logging Logger addHandler7997401 +Ref: 26947997401 +Ref: library/logging logging Logger removeHandler7997498 +Ref: 26957997498 +Ref: library/logging logging Logger findCaller7997603 +Ref: 26967997603 +Ref: library/logging logging Logger handle7998405 +Ref: 26977998405 +Ref: library/logging logging Logger makeRecord7998804 +Ref: 26987998804 +Ref: library/logging logging Logger hasHandlers7999066 +Ref: 26997999066 +Node: Logging Levels7999685 +Ref: library/logging levels7999822 +Ref: 22d7999822 +Ref: library/logging logging-levels7999822 +Ref: 269a7999822 +Node: Handler Objects8000692 +Ref: library/logging handler8000832 +Ref: 269b8000832 +Ref: library/logging handler-objects8000832 +Ref: 269c8000832 +Ref: library/logging logging Handler8001152 +Ref: 268c8001152 +Ref: library/logging logging Handler __init__8001180 +Ref: 269d8001180 +Ref: library/logging logging Handler createLock8001475 +Ref: 269e8001475 +Ref: library/logging logging Handler acquire8001663 +Ref: 269f8001663 +Ref: library/logging logging Handler release8001777 +Ref: 26a08001777 +Ref: library/logging logging Handler setLevel8001879 +Ref: 26a18001879 +Ref: library/logging logging Handler setFormatter8002450 +Ref: 26a28002450 +Ref: library/logging logging Handler addFilter8002557 +Ref: 26a38002557 +Ref: library/logging logging Handler removeFilter8002657 +Ref: 26a48002657 +Ref: library/logging logging Handler filter8002765 +Ref: 26a58002765 +Ref: library/logging logging Handler flush8003164 +Ref: 26a68003164 +Ref: library/logging logging Handler close8003332 +Ref: 26a78003332 +Ref: library/logging logging Handler handle8003690 +Ref: 26a98003690 +Ref: library/logging logging Handler handleError8003968 +Ref: 26aa8003968 +Ref: library/logging logging Handler format8004756 +Ref: 26ac8004756 +Ref: library/logging logging Handler emit8004924 +Ref: 26ab8004924 +Node: Formatter Objects8006456 +Ref: library/logging formatter-objects8006596 +Ref: 26ad8006596 +Ref: library/logging id18006596 +Ref: 26ae8006596 +Ref: library/logging logging Formatter8007760 +Ref: 13518007760 +Ref: library/logging logging Formatter format8009384 +Ref: 26b18009384 +Ref: library/logging logging Formatter formatTime8010861 +Ref: 26af8010861 +Ref: library/logging logging Formatter formatException8013252 +Ref: 26b28013252 +Ref: library/logging logging Formatter formatStack8013590 +Ref: 26b38013590 +Ref: library/logging logging BufferingFormatter8013882 +Ref: 26b48013882 +Ref: library/logging logging BufferingFormatter formatHeader8014300 +Ref: 26b58014300 +Ref: library/logging logging BufferingFormatter formatFooter8014614 +Ref: 26b68014614 +Ref: library/logging logging BufferingFormatter format8014919 +Ref: 26b78014919 +Node: Filter Objects8015250 +Ref: library/logging filter8015392 +Ref: 26b88015392 +Ref: library/logging filter-objects8015392 +Ref: 26b98015392 +Ref: library/logging logging Filter8015906 +Ref: eaa8015906 +Ref: library/logging logging Filter filter8016196 +Ref: 26ba8016196 +Node: LogRecord Objects8018177 +Ref: library/logging log-record8018322 +Ref: 26bd8018322 +Ref: library/logging logrecord-objects8018322 +Ref: 26be8018322 +Ref: library/logging logging LogRecord8018615 +Ref: c888018615 +Ref: library/logging logging LogRecord getMessage8021077 +Ref: 26c08021077 +Node: LogRecord attributes8022575 +Ref: library/logging id28022727 +Ref: 26c38022727 +Ref: library/logging logrecord-attributes8022727 +Ref: 268b8022727 +Node: LoggerAdapter Objects8030677 +Ref: library/logging logger-adapter8030825 +Ref: 26c58030825 +Ref: library/logging loggeradapter-objects8030825 +Ref: 26c68030825 +Ref: library/logging logging LoggerAdapter8031105 +Ref: f9c8031105 +Ref: library/logging logging LoggerAdapter process8031298 +Ref: 26c88031298 +Node: Thread Safety8032668 +Ref: library/logging thread-safety8032818 +Ref: 26c98032818 +Node: Module-Level Functions8033477 +Ref: library/logging module-level-functions8033629 +Ref: 26ca8033629 +Ref: library/logging logging getLogger8033787 +Ref: 5b28033787 +Ref: library/logging logging getLoggerClass8034375 +Ref: 26cb8034375 +Ref: library/logging logging getLogRecordFactory8034853 +Ref: 26c18034853 +Ref: library/logging logging debug8035312 +Ref: 268e8035312 +Ref: library/logging logging info8039391 +Ref: 26bb8039391 +Ref: library/logging logging warning8039569 +Ref: 26cd8039569 +Ref: library/logging logging error8039961 +Ref: 26ce8039961 +Ref: library/logging logging critical8040141 +Ref: 26cf8040141 +Ref: library/logging logging exception8040327 +Ref: 26d08040327 +Ref: library/logging logging log8040634 +Ref: 26d18040634 +Ref: library/logging logging disable8040821 +Ref: 26d28040821 +Ref: library/logging logging addLevelName8042037 +Ref: 26d38042037 +Ref: library/logging logging getLevelNamesMapping8042695 +Ref: 22c8042695 +Ref: library/logging logging getLevelName8043015 +Ref: 26d58043015 +Ref: library/logging logging makeLogRecord8044622 +Ref: 26bf8044622 +Ref: library/logging logging basicConfig8044987 +Ref: 6468044987 +Ref: library/logging logging shutdown8050400 +Ref: 26a88050400 +Ref: library/logging logging setLoggerClass8050842 +Ref: 26cc8050842 +Ref: library/logging logging setLogRecordFactory8051458 +Ref: 26c28051458 +Ref: Module-Level Functions-Footnote-18052791 +Node: Module-Level Attributes8052856 +Ref: library/logging module-level-attributes8053031 +Ref: 26d68053031 +Ref: library/logging logging lastResort8053100 +Ref: ea98053100 +Node: Integration with the warnings module8053709 +Ref: library/logging integration-with-the-warnings-module8053853 +Ref: 26d78053853 +Ref: library/logging logging captureWarnings8054075 +Ref: 26d88054075 +Ref: Integration with the warnings module-Footnote-18055460 +Ref: Integration with the warnings module-Footnote-28055502 +Node: logging config — Logging configuration8055555 +Ref: library/logging config doc8055759 +Ref: 26d98055759 +Ref: library/logging config logging-config-logging-configuration8055759 +Ref: 26da8055759 +Ref: library/logging config module-logging config8055759 +Ref: a98055759 +Ref: logging config — Logging configuration-Footnote-18056407 +Node: Configuration functions8056481 +Ref: library/logging config configuration-functions8056613 +Ref: 26db8056613 +Ref: library/logging config logging-config-api8056613 +Ref: f988056613 +Ref: library/logging config logging config dictConfig8057055 +Ref: e638057055 +Ref: library/logging config logging config fileConfig8059168 +Ref: 7ab8059168 +Ref: library/logging config logging config listen8061653 +Ref: c008061653 +Ref: library/logging config logging-eval-security8063305 +Ref: 26e08063305 +Ref: library/logging config logging config stopListening8064989 +Ref: 26df8064989 +Node: Security considerations8065233 +Ref: library/logging config security-considerations8065405 +Ref: 26e18065405 +Node: Configuration dictionary schema8066123 +Ref: library/logging config configuration-dictionary-schema8066297 +Ref: 26e38066297 +Ref: library/logging config logging-config-dictschema8066297 +Ref: 26dc8066297 +Node: Dictionary Schema Details8067235 +Ref: library/logging config dictionary-schema-details8067362 +Ref: 26e58067362 +Ref: library/logging config logging-config-dictschema-formatters8068168 +Ref: 26e68068168 +Node: Incremental Configuration8073009 +Ref: library/logging config incremental-configuration8073163 +Ref: 26e98073163 +Ref: library/logging config logging-config-dict-incremental8073163 +Ref: 26e88073163 +Node: Object connections8074608 +Ref: library/logging config logging-config-dict-connections8074757 +Ref: 26e48074757 +Ref: library/logging config object-connections8074757 +Ref: 26ea8074757 +Node: User-defined objects8077152 +Ref: library/logging config logging-config-dict-userdef8077302 +Ref: 26e28077302 +Ref: library/logging config user-defined-objects8077302 +Ref: 26eb8077302 +Node: Access to external objects8081284 +Ref: library/logging config access-to-external-objects8081442 +Ref: 26ec8081442 +Ref: library/logging config logging-config-dict-externalobj8081442 +Ref: 26ed8081442 +Node: Access to internal objects8082741 +Ref: library/logging config access-to-internal-objects8082917 +Ref: 26ee8082917 +Ref: library/logging config logging-config-dict-internalobj8082917 +Ref: 26ef8082917 +Node: Import resolution and custom importers8086271 +Ref: library/logging config import-resolution-and-custom-importers8086412 +Ref: 26f18086412 +Ref: library/logging config logging-import-resolution8086412 +Ref: 26f28086412 +Node: Configuration file format8087392 +Ref: library/logging config configuration-file-format8087534 +Ref: 26f38087534 +Ref: library/logging config logging-config-fileformat8087534 +Ref: 26dd8087534 +Node: logging handlers — Logging handlers8094604 +Ref: library/logging handlers doc8094804 +Ref: 26f48094804 +Ref: library/logging handlers logging-handlers-logging-handlers8094804 +Ref: 26f58094804 +Ref: library/logging handlers module-logging handlers8094804 +Ref: aa8094804 +Ref: logging handlers — Logging handlers-Footnote-18095868 +Node: StreamHandler8095945 +Ref: library/logging handlers stream-handler8096052 +Ref: 26f68096052 +Ref: library/logging handlers streamhandler8096052 +Ref: 26f78096052 +Ref: library/logging handlers logging StreamHandler8096365 +Ref: ea88096365 +Ref: library/logging handlers logging StreamHandler emit8096602 +Ref: 26f88096602 +Ref: library/logging handlers logging StreamHandler flush8096952 +Ref: 26fa8096952 +Ref: library/logging handlers logging StreamHandler setStream8097245 +Ref: 7aa8097245 +Ref: library/logging handlers logging StreamHandler terminator8097655 +Ref: 26f98097655 +Node: FileHandler8098069 +Ref: library/logging handlers file-handler8098196 +Ref: 26fb8098196 +Ref: library/logging handlers filehandler8098196 +Ref: 26fc8098196 +Ref: library/logging handlers logging FileHandler8098430 +Ref: 129b8098430 +Ref: library/logging handlers logging FileHandler close8099252 +Ref: 26fe8099252 +Ref: library/logging handlers logging FileHandler emit8099307 +Ref: 26fd8099307 +Ref: FileHandler-Footnote-18099595 +Node: NullHandler8099660 +Ref: library/logging handlers null-handler8099792 +Ref: 26ff8099792 +Ref: library/logging handlers nullhandler8099792 +Ref: 27008099792 +Ref: library/logging handlers logging NullHandler8100050 +Ref: f3e8100050 +Ref: library/logging handlers logging NullHandler emit8100149 +Ref: 27018100149 +Ref: library/logging handlers logging NullHandler handle8100218 +Ref: 27028100218 +Ref: library/logging handlers logging NullHandler createLock8100289 +Ref: 27038100289 +Node: WatchedFileHandler8100571 +Ref: library/logging handlers watched-file-handler8100711 +Ref: 27058100711 +Ref: library/logging handlers watchedfilehandler8100711 +Ref: 27068100711 +Ref: library/logging handlers logging handlers WatchedFileHandler8101726 +Ref: 27078101726 +Ref: library/logging handlers logging handlers WatchedFileHandler reopenIfNeeded8102558 +Ref: 9258102558 +Ref: library/logging handlers logging handlers WatchedFileHandler emit8102849 +Ref: 27088102849 +Node: BaseRotatingHandler8103017 +Ref: library/logging handlers base-rotating-handler8103165 +Ref: 27098103165 +Ref: library/logging handlers baserotatinghandler8103165 +Ref: 270a8103165 +Ref: library/logging handlers logging handlers BaseRotatingHandler8103552 +Ref: 270b8103552 +Ref: library/logging handlers logging handlers BaseRotatingHandler namer8103741 +Ref: 270c8103741 +Ref: library/logging handlers logging handlers BaseRotatingHandler rotator8105476 +Ref: 270f8105476 +Ref: library/logging handlers logging handlers BaseRotatingHandler rotation_filename8105759 +Ref: 270d8105759 +Ref: library/logging handlers logging handlers BaseRotatingHandler rotate8106328 +Ref: 27108106328 +Node: RotatingFileHandler8107638 +Ref: library/logging handlers rotating-file-handler8107792 +Ref: 27128107792 +Ref: library/logging handlers rotatingfilehandler8107792 +Ref: 27138107792 +Ref: library/logging handlers logging handlers RotatingFileHandler8107984 +Ref: 26e78107984 +Ref: library/logging handlers logging handlers RotatingFileHandler doRollover8109955 +Ref: 27158109955 +Ref: library/logging handlers logging handlers RotatingFileHandler emit8110035 +Ref: 27148110035 +Node: TimedRotatingFileHandler8110167 +Ref: library/logging handlers timed-rotating-file-handler8110315 +Ref: 27168110315 +Ref: library/logging handlers timedrotatingfilehandler8110315 +Ref: 27178110315 +Ref: library/logging handlers logging handlers TimedRotatingFileHandler8110548 +Ref: bfc8110548 +Ref: library/logging handlers logging handlers TimedRotatingFileHandler doRollover8115700 +Ref: 27198115700 +Ref: library/logging handlers logging handlers TimedRotatingFileHandler emit8115780 +Ref: 27188115780 +Ref: library/logging handlers logging handlers TimedRotatingFileHandler getFilesToDelete8115907 +Ref: 270e8115907 +Node: SocketHandler8116134 +Ref: library/logging handlers socket-handler8116278 +Ref: 271a8116278 +Ref: library/logging handlers sockethandler8116278 +Ref: 271b8116278 +Ref: library/logging handlers logging handlers SocketHandler8116490 +Ref: bfd8116490 +Ref: library/logging handlers logging handlers SocketHandler close8116897 +Ref: 271c8116897 +Ref: library/logging handlers logging handlers SocketHandler emit8116954 +Ref: 271d8116954 +Ref: library/logging handlers logging handlers SocketHandler handleError8117389 +Ref: 271e8117389 +Ref: library/logging handlers logging handlers SocketHandler makeSocket8117619 +Ref: 271f8117619 +Ref: library/logging handlers logging handlers SocketHandler makePickle8117862 +Ref: 27208117862 +Ref: library/logging handlers logging handlers SocketHandler send8118672 +Ref: 27218118672 +Ref: library/logging handlers logging handlers SocketHandler createSocket8118993 +Ref: 22f8118993 +Node: DatagramHandler8120193 +Ref: library/logging handlers datagram-handler8120326 +Ref: 27228120326 +Ref: library/logging handlers datagramhandler8120326 +Ref: 27238120326 +Ref: library/logging handlers logging handlers DatagramHandler8120562 +Ref: bfe8120562 +Ref: library/logging handlers logging handlers DatagramHandler emit8121476 +Ref: 27248121476 +Ref: library/logging handlers logging handlers DatagramHandler makeSocket8121830 +Ref: 27258121830 +Ref: library/logging handlers logging handlers DatagramHandler send8122016 +Ref: 27268122016 +Node: SysLogHandler8122231 +Ref: library/logging handlers syslog-handler8122368 +Ref: 27278122368 +Ref: library/logging handlers sysloghandler8122368 +Ref: 27288122368 +Ref: library/logging handlers logging handlers SysLogHandler8122574 +Ref: 22e8122574 +Ref: library/logging handlers logging handlers SysLogHandler close8124537 +Ref: 27298124537 +Ref: library/logging handlers logging handlers SysLogHandler emit8124613 +Ref: 272a8124613 +Ref: library/logging handlers logging handlers SysLogHandler encodePriority8126495 +Ref: 272b8126495 +Ref: library/logging handlers logging handlers SysLogHandler mapPriority8130519 +Ref: 272c8130519 +Ref: SysLogHandler-Footnote-18131009 +Ref: SysLogHandler-Footnote-28131064 +Ref: SysLogHandler-Footnote-38131129 +Ref: SysLogHandler-Footnote-48131188 +Node: NTEventLogHandler8131253 +Ref: library/logging handlers nt-eventlog-handler8131386 +Ref: 272d8131386 +Ref: library/logging handlers nteventloghandler8131386 +Ref: 272e8131386 +Ref: library/logging handlers logging handlers NTEventLogHandler8131721 +Ref: 272f8131721 +Ref: library/logging handlers logging handlers NTEventLogHandler close8132782 +Ref: 27308132782 +Ref: library/logging handlers logging handlers NTEventLogHandler emit8133184 +Ref: 27318133184 +Ref: library/logging handlers logging handlers NTEventLogHandler getEventCategory8133342 +Ref: 27328133342 +Ref: library/logging handlers logging handlers NTEventLogHandler getEventType8133544 +Ref: 27338133544 +Ref: library/logging handlers logging handlers NTEventLogHandler getMessageID8134131 +Ref: 27348134131 +Node: SMTPHandler8134561 +Ref: library/logging handlers smtp-handler8134694 +Ref: 27358134694 +Ref: library/logging handlers smtphandler8134694 +Ref: 27368134694 +Ref: library/logging handlers logging handlers SMTPHandler8134891 +Ref: 27378134891 +Ref: library/logging handlers logging handlers SMTPHandler emit8136144 +Ref: 27388136144 +Ref: library/logging handlers logging handlers SMTPHandler getSubject8136248 +Ref: 27398136248 +Node: MemoryHandler8136394 +Ref: library/logging handlers memory-handler8136521 +Ref: 273a8136521 +Ref: library/logging handlers memoryhandler8136521 +Ref: 273b8136521 +Ref: library/logging handlers logging handlers BufferingHandler8137224 +Ref: 273c8137224 +Ref: library/logging handlers logging handlers BufferingHandler emit8137420 +Ref: 273d8137420 +Ref: library/logging handlers logging handlers BufferingHandler flush8137610 +Ref: 273f8137610 +Ref: library/logging handlers logging handlers BufferingHandler shouldFlush8137763 +Ref: 273e8137763 +Ref: library/logging handlers logging handlers MemoryHandler8137946 +Ref: 26f08137946 +Ref: library/logging handlers logging handlers MemoryHandler close8138761 +Ref: 27418138761 +Ref: library/logging handlers logging handlers MemoryHandler flush8138889 +Ref: 27428138889 +Ref: library/logging handlers logging handlers MemoryHandler setTarget8139160 +Ref: 27408139160 +Ref: library/logging handlers logging handlers MemoryHandler shouldFlush8139250 +Ref: 27438139250 +Node: HTTPHandler8139376 +Ref: library/logging handlers http-handler8139504 +Ref: 27448139504 +Ref: library/logging handlers httphandler8139504 +Ref: 27458139504 +Ref: library/logging handlers logging handlers HTTPHandler8139735 +Ref: aaf8139735 +Ref: library/logging handlers logging handlers HTTPHandler mapLogRecord8140695 +Ref: 27468140695 +Ref: library/logging handlers logging handlers HTTPHandler emit8141151 +Ref: 27478141151 +Node: QueueHandler8141885 +Ref: library/logging handlers queue-handler8142013 +Ref: 27488142013 +Ref: library/logging handlers queuehandler8142013 +Ref: 27498142013 +Ref: library/logging handlers logging handlers QueueHandler8142752 +Ref: 274a8142752 +Ref: library/logging handlers logging handlers QueueHandler emit8143428 +Ref: 274c8143428 +Ref: library/logging handlers logging handlers QueueHandler prepare8143907 +Ref: 274d8143907 +Ref: library/logging handlers logging handlers QueueHandler enqueue8145846 +Ref: 274b8145846 +Node: QueueListener8146092 +Ref: library/logging handlers queue-listener8146200 +Ref: 274e8146200 +Ref: library/logging handlers queuelistener8146200 +Ref: 274f8146200 +Ref: library/logging handlers logging handlers QueueListener8147220 +Ref: ab08147220 +Ref: library/logging handlers logging handlers QueueListener dequeue8148451 +Ref: 27508148451 +Ref: library/logging handlers logging handlers QueueListener prepare8148732 +Ref: 27518148732 +Ref: library/logging handlers logging handlers QueueListener handle8149049 +Ref: 27528149049 +Ref: library/logging handlers logging handlers QueueListener start8149311 +Ref: 27538149311 +Ref: library/logging handlers logging handlers QueueListener stop8149474 +Ref: 27548149474 +Ref: library/logging handlers logging handlers QueueListener enqueue_sentinel8149785 +Ref: 27558149785 +Node: getpass — Portable password input8150282 +Ref: library/getpass doc8150498 +Ref: 27568150498 +Ref: library/getpass getpass-portable-password-input8150498 +Ref: 27578150498 +Ref: library/getpass module-getpass8150498 +Ref: 828150498 +Ref: library/getpass getpass getpass8150982 +Ref: 27588150982 +Ref: library/getpass getpass GetPassWarning8151831 +Ref: 27598151831 +Ref: library/getpass getpass getuser8151959 +Ref: 24ec8151959 +Ref: getpass — Portable password input-Footnote-18152546 +Node: curses — Terminal handling for character-cell displays8152613 +Ref: library/curses doc8152848 +Ref: 275a8152848 +Ref: library/curses curses-terminal-handling-for-character-cell-displays8152848 +Ref: 275b8152848 +Ref: library/curses module-curses8152848 +Ref: 2a8152848 +Ref: curses — Terminal handling for character-cell displays-Footnote-18154513 +Node: Functions<5>8154577 +Ref: library/curses curses-functions8154705 +Ref: 275d8154705 +Ref: library/curses functions8154705 +Ref: 275e8154705 +Ref: library/curses curses error8154809 +Ref: 275f8154809 +Ref: library/curses curses baudrate8155171 +Ref: 27608155171 +Ref: library/curses curses beep8155523 +Ref: 27618155523 +Ref: library/curses curses can_change_color8155589 +Ref: 27628155589 +Ref: library/curses curses cbreak8155761 +Ref: 27638155761 +Ref: library/curses curses color_content8156239 +Ref: 3e28156239 +Ref: library/curses curses color_pair8156622 +Ref: 27658156622 +Ref: library/curses curses curs_set8156997 +Ref: 27678156997 +Ref: library/curses curses def_prog_mode8157425 +Ref: 27688157425 +Ref: library/curses curses def_shell_mode8157753 +Ref: 276a8157753 +Ref: library/curses curses delay_output8158099 +Ref: 276c8158099 +Ref: library/curses curses doupdate8158189 +Ref: 276d8158189 +Ref: library/curses curses echo8159014 +Ref: 27718159014 +Ref: library/curses curses endwin8159150 +Ref: 27728159150 +Ref: library/curses curses erasechar8159253 +Ref: 27738159253 +Ref: library/curses curses filter8159521 +Ref: 27748159521 +Ref: library/curses curses flash8160132 +Ref: 27768160132 +Ref: library/curses curses flushinp8160395 +Ref: 27778160395 +Ref: library/curses curses getmouse8160581 +Ref: 27788160581 +Ref: library/curses curses getsyx8161524 +Ref: 277a8161524 +Ref: library/curses curses getwin8161735 +Ref: 277c8161735 +Ref: library/curses curses has_colors8161971 +Ref: 277d8161971 +Ref: library/curses curses has_extended_color_support8162103 +Ref: 3e68162103 +Ref: library/curses curses has_ic8162487 +Ref: 277e8162487 +Ref: library/curses curses has_il8162743 +Ref: 277f8162743 +Ref: library/curses curses has_key8163040 +Ref: 27808163040 +Ref: library/curses curses halfdelay8163194 +Ref: 27818163194 +Ref: library/curses curses init_color8163632 +Ref: 3e38163632 +Ref: library/curses curses init_pair8164288 +Ref: 3e48164288 +Ref: library/curses curses initscr8165009 +Ref: 27758165009 +Ref: library/curses curses is_term_resized8165284 +Ref: 27858165284 +Ref: library/curses curses isendwin8165455 +Ref: 27878165455 +Ref: library/curses curses keyname8165613 +Ref: 27888165613 +Ref: library/curses curses killchar8166144 +Ref: 27898166144 +Ref: library/curses curses longname8166415 +Ref: 278a8166415 +Ref: library/curses curses meta8166690 +Ref: 278b8166690 +Ref: library/curses curses mouseinterval8166847 +Ref: 278c8166847 +Ref: library/curses curses mousemask8167154 +Ref: 278d8167154 +Ref: library/curses curses napms8167574 +Ref: 278e8167574 +Ref: library/curses curses newpad8167642 +Ref: 278f8167642 +Ref: library/curses curses newwin8168730 +Ref: 27908168730 +Ref: library/curses curses nl8169097 +Ref: 27918169097 +Ref: library/curses curses nocbreak8169312 +Ref: 27828169312 +Ref: library/curses curses noecho8169433 +Ref: 27928169433 +Ref: library/curses curses nonl8169532 +Ref: 27938169532 +Ref: library/curses curses noqiflush8170025 +Ref: 27948170025 +Ref: library/curses curses noraw8170415 +Ref: 27958170415 +Ref: library/curses curses pair_content8170530 +Ref: 3e58170530 +Ref: library/curses curses pair_number8170756 +Ref: 27668170756 +Ref: library/curses curses putp8170948 +Ref: 27968170948 +Ref: library/curses curses qiflush8171194 +Ref: 27978171194 +Ref: library/curses curses raw8171460 +Ref: 27648171460 +Ref: library/curses curses reset_prog_mode8171702 +Ref: 27698171702 +Ref: library/curses curses reset_shell_mode8171850 +Ref: 276b8171850 +Ref: library/curses curses resetty8171998 +Ref: 27988171998 +Ref: library/curses curses resize_term8172140 +Ref: 27868172140 +Ref: library/curses curses resizeterm8172679 +Ref: 279a8172679 +Ref: library/curses curses savetty8172952 +Ref: 27998172952 +Ref: library/curses curses get_escdelay8173087 +Ref: 5308173087 +Ref: library/curses curses set_escdelay8173211 +Ref: 5318173211 +Ref: library/curses curses get_tabsize8173507 +Ref: 5328173507 +Ref: library/curses curses set_tabsize8173629 +Ref: 5338173629 +Ref: library/curses curses setsyx8173840 +Ref: 279b8173840 +Ref: library/curses curses setupterm8174010 +Ref: 279c8174010 +Ref: library/curses curses start_color8174428 +Ref: 279d8174428 +Ref: library/curses curses termattrs8175108 +Ref: 279e8175108 +Ref: library/curses curses termname8175338 +Ref: 279f8175338 +Ref: library/curses curses tigetflag8175487 +Ref: 27a08175487 +Ref: library/curses curses tigetnum8175803 +Ref: 27a18175803 +Ref: library/curses curses tigetstr8176119 +Ref: 27a28176119 +Ref: library/curses curses tparm8176429 +Ref: 27a38176429 +Ref: library/curses curses typeahead8176766 +Ref: 27a48176766 +Ref: library/curses curses unctrl8177359 +Ref: 27a58177359 +Ref: library/curses curses ungetch8177640 +Ref: 27a68177640 +Ref: library/curses curses update_lines_cols8177817 +Ref: a6d8177817 +Ref: library/curses curses unget_wch8177976 +Ref: d498177976 +Ref: library/curses curses ungetmouse8178194 +Ref: 27a78178194 +Ref: library/curses curses use_env8178353 +Ref: 27a88178353 +Ref: library/curses curses use_default_colors8178863 +Ref: 27838178863 +Ref: library/curses curses wrapper8179296 +Ref: 6d28179296 +Node: Window Objects8180122 +Ref: library/curses curses-window-objects8180271 +Ref: 27848180271 +Ref: library/curses window-objects8180271 +Ref: 27a98180271 +Ref: library/curses curses window addch8180453 +Ref: 27aa8180453 +Ref: library/curses curses window addnstr8181056 +Ref: 27ab8181056 +Ref: library/curses curses window addstr8181315 +Ref: 276f8181315 +Ref: library/curses curses window attroff8182315 +Ref: 27ac8182315 +Ref: library/curses curses window attron8182460 +Ref: 27ad8182460 +Ref: library/curses curses window attrset8182601 +Ref: 27ae8182601 +Ref: library/curses curses window bkgd8182749 +Ref: 27af8182749 +Ref: library/curses curses window bkgdset8183194 +Ref: 27b08183194 +Ref: library/curses curses window border8183760 +Ref: 27b18183760 +Ref: library/curses curses window box8185712 +Ref: 27b28185712 +Ref: library/curses curses window chgat8185940 +Ref: 27b38185940 +Ref: library/curses curses window clear8186564 +Ref: 27b58186564 +Ref: library/curses curses window clearok8186719 +Ref: 27b78186719 +Ref: library/curses curses window clrtobot8186864 +Ref: 27b88186864 +Ref: library/curses curses window clrtoeol8187061 +Ref: 27b98187061 +Ref: library/curses curses window cursyncup8187141 +Ref: 27ba8187141 +Ref: library/curses curses window delch8187309 +Ref: 27bb8187309 +Ref: library/curses curses window deleteln8187388 +Ref: 27bc8187388 +Ref: library/curses curses window derwin8187512 +Ref: 27bd8187512 +Ref: library/curses curses window echochar8187922 +Ref: 27bf8187922 +Ref: library/curses curses window enclose8188076 +Ref: 12de8188076 +Ref: library/curses curses window encoding8188496 +Ref: d478188496 +Ref: library/curses curses window erase8188875 +Ref: 27b68188875 +Ref: library/curses curses window getbegyx8188928 +Ref: 27c08188928 +Ref: library/curses curses window getbkgd8189032 +Ref: 27c18189032 +Ref: library/curses curses window getch8189147 +Ref: 27798189147 +Ref: library/curses curses window get_wch8189467 +Ref: d488189467 +Ref: library/curses curses window getkey8189733 +Ref: 27c28189733 +Ref: library/curses curses window getmaxyx8190041 +Ref: 27c38190041 +Ref: library/curses curses window getparyx8190146 +Ref: 27c48190146 +Ref: library/curses curses window getstr8190350 +Ref: 27c58190350 +Ref: library/curses curses window getyx8190566 +Ref: 27c68190566 +Ref: library/curses curses window hline8190707 +Ref: 27c78190707 +Ref: library/curses curses window idcok8190893 +Ref: 27c88190893 +Ref: library/curses curses window idlok8191239 +Ref: 27c98191239 +Ref: library/curses curses window immedok8191432 +Ref: 27ca8191432 +Ref: library/curses curses window inch8191781 +Ref: 27cb8191781 +Ref: library/curses curses window insch8191969 +Ref: 27cc8191969 +Ref: library/curses curses window insdelln8192183 +Ref: 27cd8192183 +Ref: library/curses curses window insertln8192562 +Ref: 27ce8192562 +Ref: library/curses curses window insnstr8192692 +Ref: 27cf8192692 +Ref: library/curses curses window insstr8193205 +Ref: 27d08193205 +Ref: library/curses curses window instr8193624 +Ref: 27d18193624 +Ref: library/curses curses window is_linetouched8194020 +Ref: 27d28194020 +Ref: library/curses curses window is_wintouched8194303 +Ref: 27d38194303 +Ref: library/curses curses window keypad8194483 +Ref: 27d48194483 +Ref: library/curses curses window leaveok8194751 +Ref: 277b8194751 +Ref: library/curses curses window move8195102 +Ref: 27d58195102 +Ref: library/curses curses window mvderwin8195185 +Ref: 27d68195185 +Ref: library/curses curses window mvwin8195462 +Ref: 27d78195462 +Ref: library/curses curses window nodelay8195578 +Ref: 27d88195578 +Ref: library/curses curses window notimeout8195687 +Ref: 27d98195687 +Ref: library/curses curses window noutrefresh8195951 +Ref: 276e8195951 +Ref: library/curses curses window overlay8196225 +Ref: 27da8196225 +Ref: library/curses curses window overwrite8196874 +Ref: 27db8196874 +Ref: library/curses curses window putwin8197526 +Ref: 27dc8197526 +Ref: library/curses curses window redrawln8197732 +Ref: 27dd8197732 +Ref: library/curses curses window redrawwin8197938 +Ref: 27de8197938 +Ref: library/curses curses window refresh8198084 +Ref: 27708198084 +Ref: library/curses curses window resize8199105 +Ref: 27df8199105 +Ref: library/curses curses window scroll8199457 +Ref: 27e08199457 +Ref: library/curses curses window scrollok8199565 +Ref: 27e18199565 +Ref: library/curses curses window setscrreg8200101 +Ref: 27e28200101 +Ref: library/curses curses window standend8200270 +Ref: 27e38200270 +Ref: library/curses curses window standout8200421 +Ref: 27e48200421 +Ref: library/curses curses window subpad8200491 +Ref: 27e58200491 +Ref: library/curses curses window subwin8200730 +Ref: 27be8200730 +Ref: library/curses curses window syncdown8201088 +Ref: 27e68201088 +Ref: library/curses curses window syncok8201334 +Ref: 27e78201334 +Ref: library/curses curses window syncup8201497 +Ref: 27e88201497 +Ref: library/curses curses window timeout8201623 +Ref: 27e98201623 +Ref: library/curses curses window touchline8202126 +Ref: 27b48202126 +Ref: library/curses curses window touchwin8202434 +Ref: 27ea8202434 +Ref: library/curses curses window untouchwin8202559 +Ref: 27eb8202559 +Ref: library/curses curses window vline8202692 +Ref: 27ec8202692 +Ref: Window Objects-Footnote-18202912 +Node: Constants<6>8202955 +Ref: library/curses constants8203083 +Ref: 27ed8203083 +Ref: library/curses curses ERR8203190 +Ref: 27ee8203190 +Ref: library/curses curses OK8203335 +Ref: 27ef8203335 +Ref: library/curses curses version8203478 +Ref: 27f08203478 +Ref: library/curses curses ncurses_version8203615 +Ref: 62a8203615 +Node: curses textpad — Text input widget for curses programs8222174 +Ref: library/curses curses-textpad-text-input-widget-for-curses-programs8222421 +Ref: 27f18222421 +Ref: library/curses module-curses textpad8222421 +Ref: 2d8222421 +Ref: library/curses curses textpad rectangle8223011 +Ref: 27f38223011 +Node: Textbox objects8223734 +Ref: library/curses curses-textpad-objects8223842 +Ref: 27f48223842 +Ref: library/curses textbox-objects8223842 +Ref: 27f58223842 +Ref: library/curses curses textpad Textbox8223958 +Ref: 27f28223958 +Ref: library/curses curses textpad Textbox edit8224437 +Ref: 27f78224437 +Ref: library/curses curses textpad Textbox do_command8225008 +Ref: 27f88225008 +Ref: library/curses curses textpad Textbox gather8228532 +Ref: 27f98228532 +Ref: library/curses curses textpad Textbox stripspaces8228725 +Ref: 27f68228725 +Node: curses ascii — Utilities for ASCII characters8229136 +Ref: library/curses ascii doc8229378 +Ref: 27fa8229378 +Ref: library/curses ascii curses-ascii-utilities-for-ascii-characters8229378 +Ref: 27fb8229378 +Ref: library/curses ascii module-curses ascii8229378 +Ref: 2b8229378 +Ref: library/curses ascii curses ascii isalnum8233060 +Ref: 27fc8233060 +Ref: library/curses ascii curses ascii isalpha8233207 +Ref: 27fd8233207 +Ref: library/curses ascii curses ascii isascii8233352 +Ref: 27fe8233352 +Ref: library/curses ascii curses ascii isblank8233461 +Ref: 27ff8233461 +Ref: library/curses ascii curses ascii iscntrl8233574 +Ref: 28008233574 +Ref: library/curses ascii curses ascii isdigit8233700 +Ref: 28018233700 +Ref: library/curses ascii curses ascii isgraph8233864 +Ref: 28028233864 +Ref: library/curses ascii curses ascii islower8233965 +Ref: 28038233965 +Ref: library/curses ascii curses ascii isprint8234053 +Ref: 28048234053 +Ref: library/curses ascii curses ascii ispunct8234157 +Ref: 28058234157 +Ref: library/curses ascii curses ascii isspace8234300 +Ref: 28068234300 +Ref: library/curses ascii curses ascii isupper8234468 +Ref: 28078234468 +Ref: library/curses ascii curses ascii isxdigit8234552 +Ref: 28088234552 +Ref: library/curses ascii curses ascii isctrl8234695 +Ref: 28098234695 +Ref: library/curses ascii curses ascii ismeta8234804 +Ref: 280a8234804 +Ref: library/curses ascii curses ascii ascii8235404 +Ref: 280b8235404 +Ref: library/curses ascii curses ascii ctrl8235511 +Ref: 280c8235511 +Ref: library/curses ascii curses ascii alt8235679 +Ref: 280d8235679 +Ref: library/curses ascii curses ascii unctrl8235951 +Ref: 280e8235951 +Ref: library/curses ascii curses ascii controlnames8236506 +Ref: 280f8236506 +Node: curses panel — A panel stack extension for curses8236752 +Ref: library/curses panel doc8237001 +Ref: 28108237001 +Ref: library/curses panel curses-panel-a-panel-stack-extension-for-curses8237001 +Ref: 28118237001 +Ref: library/curses panel module-curses panel8237001 +Ref: 2c8237001 +Node: Functions<6>8237479 +Ref: library/curses panel cursespanel-functions8237601 +Ref: 28128237601 +Ref: library/curses panel functions8237601 +Ref: 28138237601 +Ref: library/curses panel curses panel bottom_panel8237711 +Ref: 28148237711 +Ref: library/curses panel curses panel new_panel8237806 +Ref: 28158237806 +Ref: library/curses panel curses panel top_panel8238108 +Ref: 28168238108 +Ref: library/curses panel curses panel update_panels8238197 +Ref: 28178238197 +Node: Panel Objects8238408 +Ref: library/curses panel curses-panel-objects8238530 +Ref: 28188238530 +Ref: library/curses panel panel-objects8238530 +Ref: 28198238530 +Ref: library/curses panel curses panel Panel above8238886 +Ref: 281a8238886 +Ref: library/curses panel curses panel Panel below8238963 +Ref: 281b8238963 +Ref: library/curses panel curses panel Panel bottom8239040 +Ref: 281c8239040 +Ref: library/curses panel curses panel Panel hidden8239118 +Ref: 281d8239118 +Ref: library/curses panel curses panel Panel hide8239238 +Ref: 281e8239238 +Ref: library/curses panel curses panel Panel move8239372 +Ref: 281f8239372 +Ref: library/curses panel curses panel Panel replace8239464 +Ref: 28208239464 +Ref: library/curses panel curses panel Panel set_userptr8239568 +Ref: 28218239568 +Ref: library/curses panel curses panel Panel show8239762 +Ref: 28228239762 +Ref: library/curses panel curses panel Panel top8239845 +Ref: 28238239845 +Ref: library/curses panel curses panel Panel userptr8239913 +Ref: 28248239913 +Ref: library/curses panel curses panel Panel window8240028 +Ref: 28258240028 +Node: platform — Access to underlying platform’s identifying data8240116 +Ref: library/platform doc8240357 +Ref: 28268240357 +Ref: library/platform module-platform8240357 +Ref: cb8240357 +Ref: library/platform platform-access-to-underlying-platform-s-identifying-data8240357 +Ref: 28278240357 +Ref: platform — Access to underlying platform’s identifying data-Footnote-18240871 +Node: Cross Platform8240939 +Ref: library/platform cross-platform8241075 +Ref: 28288241075 +Ref: library/platform platform architecture8241126 +Ref: 14648241126 +Ref: library/platform platform machine8242454 +Ref: 28298242454 +Ref: library/platform platform node8242611 +Ref: 282a8242611 +Ref: library/platform platform platform8242786 +Ref: 14698242786 +Ref: library/platform platform processor8243721 +Ref: 282c8243721 +Ref: library/platform platform python_build8244042 +Ref: 282d8244042 +Ref: library/platform platform python_compiler8244189 +Ref: 282e8244189 +Ref: library/platform platform python_branch8244312 +Ref: 282f8244312 +Ref: library/platform platform python_implementation8244426 +Ref: 28308244426 +Ref: library/platform platform python_revision8244630 +Ref: 28318244630 +Ref: library/platform platform python_version8244753 +Ref: 28328244753 +Ref: library/platform platform python_version_tuple8245002 +Ref: 28338245002 +Ref: library/platform platform release8245282 +Ref: 28348245282 +Ref: library/platform platform system8245459 +Ref: 28358245459 +Ref: library/platform platform system_alias8245671 +Ref: 282b8245671 +Ref: library/platform platform version8245954 +Ref: 28368245954 +Ref: library/platform platform uname8246131 +Ref: 14678246131 +Node: Java Platform8246837 +Ref: library/platform java-platform8246998 +Ref: 28378246998 +Ref: library/platform platform java_ver8247047 +Ref: 28388247047 +Node: Windows Platform8247518 +Ref: library/platform windows-platform8247679 +Ref: 28398247679 +Ref: library/platform platform win32_ver8247734 +Ref: 13728247734 +Ref: library/platform platform win32_edition8248562 +Ref: 283a8248562 +Ref: library/platform platform win32_is_iot8248890 +Ref: 283b8248890 +Node: macOS Platform8249082 +Ref: library/platform macos-platform8249244 +Ref: 283c8249244 +Ref: library/platform platform mac_ver8249295 +Ref: 146a8249295 +Node: Unix Platforms8249676 +Ref: library/platform unix-platforms8249837 +Ref: 283d8249837 +Ref: library/platform platform libc_ver8249888 +Ref: 14668249888 +Node: Linux Platforms8250505 +Ref: library/platform linux-platforms8250643 +Ref: 283e8250643 +Ref: library/platform platform freedesktop_os_release8250696 +Ref: 41b8250696 +Ref: Linux Platforms-Footnote-18252160 +Node: errno — Standard errno system symbols8252233 +Ref: library/errno doc8252471 +Ref: 283f8252471 +Ref: library/errno errno-standard-errno-system-symbols8252471 +Ref: 28408252471 +Ref: library/errno module-errno8252471 +Ref: 778252471 +Ref: library/errno errno errorcode8252876 +Ref: 28418252876 +Ref: library/errno errno EPERM8253397 +Ref: 11918253397 +Ref: library/errno errno ENOENT8253523 +Ref: 1d038253523 +Ref: library/errno errno ESRCH8253654 +Ref: 1d078253654 +Ref: library/errno errno EINTR8253775 +Ref: a048253775 +Ref: library/errno errno EIO8253902 +Ref: 28428253902 +Ref: library/errno errno ENXIO8253939 +Ref: 28438253939 +Ref: library/errno errno E2BIG8253994 +Ref: 28448253994 +Ref: library/errno errno ENOEXEC8254041 +Ref: 28458254041 +Ref: library/errno errno EBADF8254090 +Ref: 5ad8254090 +Ref: library/errno errno ECHILD8254135 +Ref: 1cfc8254135 +Ref: library/errno errno EAGAIN8254259 +Ref: 1cf78254259 +Ref: library/errno errno ENOMEM8254372 +Ref: 28468254372 +Ref: library/errno errno EACCES8254416 +Ref: 1d068254416 +Ref: library/errno errno EFAULT8254537 +Ref: 28478254537 +Ref: library/errno errno ENOTBLK8254579 +Ref: 28488254579 +Ref: library/errno errno EBUSY8254632 +Ref: 28498254632 +Ref: library/errno errno EEXIST8254685 +Ref: 1d028254685 +Ref: library/errno errno EXDEV8254800 +Ref: 25068254800 +Ref: library/errno errno ENODEV8254847 +Ref: 284a8254847 +Ref: library/errno errno ENOTDIR8254892 +Ref: 1d058254892 +Ref: library/errno errno EISDIR8255015 +Ref: 1d048255015 +Ref: library/errno errno EINVAL8255135 +Ref: 141e8255135 +Ref: library/errno errno ENFILE8255182 +Ref: 284b8255182 +Ref: library/errno errno EMFILE8255232 +Ref: 284c8255232 +Ref: library/errno errno ENOTTY8255282 +Ref: 284d8255282 +Ref: library/errno errno ETXTBSY8255329 +Ref: 284e8255329 +Ref: library/errno errno EFBIG8255375 +Ref: 284f8255375 +Ref: library/errno errno ENOSPC8255419 +Ref: 28508255419 +Ref: library/errno errno ESPIPE8255473 +Ref: 28518255473 +Ref: library/errno errno EROFS8255516 +Ref: 28528255516 +Ref: library/errno errno EMLINK8255567 +Ref: 28538255567 +Ref: library/errno errno EPIPE8255612 +Ref: 1cfd8255612 +Ref: library/errno errno EDOM8255726 +Ref: 28548255726 +Ref: library/errno errno ERANGE8255790 +Ref: 28558255790 +Ref: library/errno errno EDEADLK8255850 +Ref: 28568255850 +Ref: library/errno errno ENAMETOOLONG8255911 +Ref: 28578255911 +Ref: library/errno errno ENOLCK8255966 +Ref: 28588255966 +Ref: library/errno errno ENOSYS8256022 +Ref: 11928256022 +Ref: library/errno errno ENOTEMPTY8256077 +Ref: 28598256077 +Ref: library/errno errno ELOOP8256130 +Ref: 285a8256130 +Ref: library/errno errno EWOULDBLOCK8256195 +Ref: 1cf98256195 +Ref: library/errno errno ENOMSG8256325 +Ref: 285b8256325 +Ref: library/errno errno EIDRM8256382 +Ref: 285c8256382 +Ref: library/errno errno ECHRNG8256430 +Ref: 285d8256430 +Ref: library/errno errno EL2NSYNC8256488 +Ref: 285e8256488 +Ref: library/errno errno EL3HLT8256545 +Ref: 285f8256545 +Ref: library/errno errno EL3RST8256590 +Ref: 28608256590 +Ref: library/errno errno ELNRNG8256634 +Ref: 28618256634 +Ref: library/errno errno EUNATCH8256689 +Ref: 28628256689 +Ref: library/errno errno ENOCSI8256749 +Ref: 28638256749 +Ref: library/errno errno EL2HLT8256806 +Ref: 28648256806 +Ref: library/errno errno EBADE8256851 +Ref: 28658256851 +Ref: library/errno errno EBADR8256897 +Ref: 28668256897 +Ref: library/errno errno EXFULL8256953 +Ref: 28678256953 +Ref: library/errno errno ENOANO8256997 +Ref: 28688256997 +Ref: library/errno errno EBADRQC8257036 +Ref: 28698257036 +Ref: library/errno errno EBADSLT8257088 +Ref: 286a8257088 +Ref: library/errno errno EDEADLOCK8257132 +Ref: 286b8257132 +Ref: library/errno errno EBFONT8257193 +Ref: 286c8257193 +Ref: library/errno errno ENOSTR8257244 +Ref: 286d8257244 +Ref: library/errno errno ENODATA8257294 +Ref: 286e8257294 +Ref: library/errno errno ETIME8257343 +Ref: 286f8257343 +Ref: library/errno errno ENOSR8257386 +Ref: 28708257386 +Ref: library/errno errno ENONET8257440 +Ref: 28718257440 +Ref: library/errno errno ENOPKG8257500 +Ref: 28728257500 +Ref: library/errno errno EREMOTE8257552 +Ref: 28738257552 +Ref: library/errno errno ENOLINK8257600 +Ref: 28748257600 +Ref: library/errno errno EADV8257653 +Ref: 28758257653 +Ref: library/errno errno ESRMNT8257697 +Ref: 28768257697 +Ref: library/errno errno ECOMM8257741 +Ref: 28778257741 +Ref: library/errno errno EPROTO8257798 +Ref: 28788257798 +Ref: library/errno errno EMULTIHOP8257843 +Ref: 28798257843 +Ref: library/errno errno EDOTDOT8257895 +Ref: 287a8257895 +Ref: library/errno errno EBADMSG8257945 +Ref: 287b8257945 +Ref: library/errno errno EOVERFLOW8257995 +Ref: 287c8257995 +Ref: library/errno errno ENOTUNIQ8258066 +Ref: 287d8258066 +Ref: library/errno errno EBADFD8258125 +Ref: 287e8258125 +Ref: library/errno errno EREMCHG8258184 +Ref: 287f8258184 +Ref: library/errno errno ELIBACC8258238 +Ref: 28808258238 +Ref: library/errno errno ELIBBAD8258308 +Ref: 28818258308 +Ref: library/errno errno ELIBSCN8258376 +Ref: 28828258376 +Ref: library/errno errno ELIBMAX8258439 +Ref: 28838258439 +Ref: library/errno errno ELIBEXEC8258518 +Ref: 28848258518 +Ref: library/errno errno EILSEQ8258588 +Ref: 28858258588 +Ref: library/errno errno ERESTART8258640 +Ref: 28868258640 +Ref: library/errno errno ESTRPIPE8258716 +Ref: 28878258716 +Ref: library/errno errno EUSERS8258767 +Ref: 28888258767 +Ref: library/errno errno ENOTSOCK8258812 +Ref: 28898258812 +Ref: library/errno errno EDESTADDRREQ8258875 +Ref: 288a8258875 +Ref: library/errno errno EMSGSIZE8258940 +Ref: 288b8258940 +Ref: library/errno errno EPROTOTYPE8258989 +Ref: 288c8258989 +Ref: library/errno errno ENOPROTOOPT8259054 +Ref: 288d8259054 +Ref: library/errno errno EPROTONOSUPPORT8259112 +Ref: 288e8259112 +Ref: library/errno errno ESOCKTNOSUPPORT8259174 +Ref: 288f8259174 +Ref: library/errno errno EOPNOTSUPP8259239 +Ref: 28908259239 +Ref: library/errno errno EPFNOSUPPORT8259319 +Ref: 28918259319 +Ref: library/errno errno EAFNOSUPPORT8259385 +Ref: 28928259385 +Ref: library/errno errno EADDRINUSE8259462 +Ref: 28938259462 +Ref: library/errno errno EADDRNOTAVAIL8259519 +Ref: 28948259519 +Ref: library/errno errno ENETDOWN8259588 +Ref: 28958259588 +Ref: library/errno errno ENETUNREACH8259636 +Ref: 14388259636 +Ref: library/errno errno ENETRESET8259694 +Ref: 28968259694 +Ref: library/errno errno ECONNABORTED8259771 +Ref: 1cff8259771 +Ref: library/errno errno ECONNRESET8259920 +Ref: 1d018259920 +Ref: library/errno errno ENOBUFS8260057 +Ref: 11a28260057 +Ref: library/errno errno EISCONN8260114 +Ref: 28978260114 +Ref: library/errno errno ENOTCONN8260185 +Ref: 28988260185 +Ref: library/errno errno ESHUTDOWN8260253 +Ref: 1cfe8260253 +Ref: library/errno errno ETOOMANYREFS8260405 +Ref: 28998260405 +Ref: library/errno errno ETIMEDOUT8260476 +Ref: 1d088260476 +Ref: library/errno errno ECONNREFUSED8260600 +Ref: 1d008260600 +Ref: library/errno errno EHOSTDOWN8260735 +Ref: 289a8260735 +Ref: library/errno errno EHOSTUNREACH8260781 +Ref: 289b8260781 +Ref: library/errno errno EALREADY8260834 +Ref: 1cf88260834 +Ref: library/errno errno EINPROGRESS8260969 +Ref: 1cfa8260969 +Ref: library/errno errno ESTALE8261103 +Ref: 289c8261103 +Ref: library/errno errno EUCLEAN8261155 +Ref: 289d8261155 +Ref: library/errno errno ENOTNAM8261211 +Ref: 289e8261211 +Ref: library/errno errno ENAVAIL8261270 +Ref: 289f8261270 +Ref: library/errno errno EISNAM8261331 +Ref: 28a08261331 +Ref: library/errno errno EREMOTEIO8261382 +Ref: 28a18261382 +Ref: library/errno errno EDQUOT8261432 +Ref: 28a28261432 +Ref: library/errno errno EQFULL8261477 +Ref: 28a38261477 +Node: ctypes — A foreign function library for Python8261565 +Ref: library/ctypes doc8261731 +Ref: 28a48261731 +Ref: library/ctypes ctypes-a-foreign-function-library-for-python8261731 +Ref: 28a58261731 +Ref: library/ctypes module-ctypes8261731 +Ref: 298261731 +Node: ctypes tutorial8262184 +Ref: library/ctypes ctypes-ctypes-tutorial8262309 +Ref: 28a68262309 +Ref: library/ctypes ctypes-tutorial8262309 +Ref: 28a78262309 +Node: Loading dynamic link libraries8263675 +Ref: library/ctypes ctypes-loading-dynamic-link-libraries8263802 +Ref: 28aa8263802 +Ref: library/ctypes loading-dynamic-link-libraries8263802 +Ref: 28ab8263802 +Node: Accessing functions from loaded dlls8265848 +Ref: library/ctypes accessing-functions-from-loaded-dlls8266001 +Ref: 28ac8266001 +Ref: library/ctypes ctypes-accessing-functions-from-loaded-dlls8266001 +Ref: 28ad8266001 +Node: Calling functions8268256 +Ref: library/ctypes calling-functions8268401 +Ref: 28ae8268401 +Ref: library/ctypes ctypes-calling-functions8268401 +Ref: 28af8268401 +Node: Fundamental data types8270853 +Ref: library/ctypes ctypes-fundamental-data-types8270989 +Ref: 28b08270989 +Ref: library/ctypes fundamental-data-types8270989 +Ref: 28b18270989 +Node: Calling functions continued8278867 +Ref: library/ctypes calling-functions-continued8279035 +Ref: 28c28279035 +Ref: library/ctypes ctypes-calling-functions-continued8279035 +Ref: 28c38279035 +Node: Calling functions with your own custom data types8280119 +Ref: library/ctypes calling-functions-with-your-own-custom-data-types8280323 +Ref: 28c48280323 +Ref: library/ctypes ctypes-calling-functions-with-own-custom-data-types8280323 +Ref: 28c58280323 +Node: Specifying the required argument types function prototypes8281166 +Ref: library/ctypes ctypes-specifying-required-argument-types8281355 +Ref: 28c68281355 +Ref: library/ctypes specifying-the-required-argument-types-function-prototypes8281355 +Ref: 28c78281355 +Node: Return types8283181 +Ref: library/ctypes ctypes-return-types8283372 +Ref: 28c88283372 +Ref: library/ctypes return-types8283372 +Ref: 28c98283372 +Node: Passing pointers or passing parameters by reference8285995 +Ref: library/ctypes ctypes-passing-pointers8286149 +Ref: 28cb8286149 +Ref: library/ctypes passing-pointers-or-passing-parameters-by-reference8286149 +Ref: 28cc8286149 +Node: Structures and unions8287243 +Ref: library/ctypes ctypes-structures-unions8287425 +Ref: 28cf8287425 +Ref: library/ctypes structures-and-unions8287425 +Ref: 28d08287425 +Ref: library/ctypes ctypes-structureunion-alignment-byte-order8289511 +Ref: 28d38289511 +Node: Structure/union alignment and byte order8289839 +Ref: library/ctypes structure-union-alignment-and-byte-order8290005 +Ref: 28d48290005 +Node: Bit fields in structures and unions8290797 +Ref: library/ctypes bit-fields-in-structures-and-unions8290948 +Ref: 28d78290948 +Ref: library/ctypes ctypes-bit-fields-in-structures-unions8290948 +Ref: 28d88290948 +Node: Arrays8291535 +Ref: library/ctypes arrays8291654 +Ref: 28d98291654 +Ref: library/ctypes ctypes-arrays8291654 +Ref: 28da8291654 +Node: Pointers8292943 +Ref: library/ctypes ctypes-pointers8293043 +Ref: 28db8293043 +Ref: library/ctypes pointers8293043 +Ref: 28dc8293043 +Node: Type conversions8295706 +Ref: library/ctypes ctypes-type-conversions8295816 +Ref: 28df8295816 +Ref: library/ctypes type-conversions8295816 +Ref: 28e08295816 +Node: Incomplete Types8298418 +Ref: library/ctypes ctypes-incomplete-types8298538 +Ref: 28e18298538 +Ref: library/ctypes incomplete-types8298538 +Ref: 28e28298538 +Node: Callback functions8300147 +Ref: library/ctypes callback-functions8300286 +Ref: 28e38300286 +Ref: library/ctypes ctypes-callback-functions8300286 +Ref: 28e48300286 +Node: Accessing values exported from dlls8304160 +Ref: library/ctypes accessing-values-exported-from-dlls8304292 +Ref: 28e88304292 +Ref: library/ctypes ctypes-accessing-values-exported-from-dlls8304292 +Ref: 28e98304292 +Node: Surprises8307155 +Ref: library/ctypes ctypes-surprises8307294 +Ref: 28ec8307294 +Ref: library/ctypes surprises8307294 +Ref: 28ed8307294 +Node: Variable-sized data types8309469 +Ref: library/ctypes ctypes-variable-sized-data-types8309564 +Ref: 28ee8309564 +Ref: library/ctypes variable-sized-data-types8309564 +Ref: 28ef8309564 +Node: ctypes reference8310967 +Ref: library/ctypes ctypes-ctypes-reference8311092 +Ref: 28f18311092 +Ref: library/ctypes ctypes-reference8311092 +Ref: 28f28311092 +Node: Finding shared libraries8311403 +Ref: library/ctypes ctypes-finding-shared-libraries8311513 +Ref: 28f38311513 +Ref: library/ctypes finding-shared-libraries8311513 +Ref: 28f48311513 +Node: Loading shared libraries8314039 +Ref: library/ctypes ctypes-loading-shared-libraries8314175 +Ref: 28f58314175 +Ref: library/ctypes loading-shared-libraries8314175 +Ref: 28f68314175 +Ref: library/ctypes ctypes CDLL8314378 +Ref: 62c8314378 +Ref: library/ctypes ctypes OleDLL8315412 +Ref: 28f78315412 +Ref: library/ctypes ctypes WinDLL8316105 +Ref: 28f98316105 +Ref: library/ctypes ctypes PyDLL8316579 +Ref: 28fa8316579 +Ref: library/ctypes ctypes PyDLL _handle8320302 +Ref: 28ff8320302 +Ref: library/ctypes ctypes PyDLL _name8320384 +Ref: 29008320384 +Ref: library/ctypes ctypes LibraryLoader8320726 +Ref: 29018320726 +Ref: library/ctypes ctypes LibraryLoader LoadLibrary8321184 +Ref: 29028321184 +Ref: Loading shared libraries-Footnote-18322754 +Node: Foreign functions8322820 +Ref: library/ctypes ctypes-foreign-functions8322951 +Ref: 29038322951 +Ref: library/ctypes foreign-functions8322951 +Ref: 29048322951 +Ref: library/ctypes ctypes _FuncPtr8323365 +Ref: 29058323365 +Ref: library/ctypes ctypes _FuncPtr restype8323666 +Ref: 29068323666 +Ref: library/ctypes ctypes _FuncPtr argtypes8324350 +Ref: 29088324350 +Ref: library/ctypes ctypes _FuncPtr errcheck8325589 +Ref: 29078325589 +Ref: library/ctypes ctypes ArgumentError8326575 +Ref: 29098326575 +Node: Function prototypes8327215 +Ref: library/ctypes ctypes-function-prototypes8327339 +Ref: 290a8327339 +Ref: library/ctypes function-prototypes8327339 +Ref: 290b8327339 +Ref: library/ctypes ctypes CFUNCTYPE8327922 +Ref: 28e58327922 +Ref: library/ctypes ctypes WINFUNCTYPE8328433 +Ref: 28e68328433 +Ref: library/ctypes ctypes PYFUNCTYPE8328787 +Ref: 290c8328787 +Node: Utility functions8334420 +Ref: library/ctypes ctypes-utility-functions8334537 +Ref: 290d8334537 +Ref: library/ctypes utility-functions8334537 +Ref: 290e8334537 +Ref: library/ctypes ctypes addressof8334596 +Ref: 290f8334596 +Ref: library/ctypes ctypes alignment8334840 +Ref: 29108334840 +Ref: library/ctypes ctypes byref8335000 +Ref: 28cd8335000 +Ref: library/ctypes ctypes cast8335514 +Ref: 14618335514 +Ref: library/ctypes ctypes create_string_buffer8335808 +Ref: 28c18335808 +Ref: library/ctypes ctypes create_unicode_buffer8336614 +Ref: 13f68336614 +Ref: library/ctypes ctypes DllCanUnloadNow8337434 +Ref: 29118337434 +Ref: library/ctypes ctypes DllGetClassObject8337679 +Ref: 29128337679 +Ref: library/ctypes ctypes util find_library8337939 +Ref: 9c48337939 +Ref: library/ctypes ctypes util find_msvcrt8338331 +Ref: 29138338331 +Ref: library/ctypes ctypes FormatError8338787 +Ref: 29148338787 +Ref: library/ctypes ctypes GetLastError8339026 +Ref: 28ca8339026 +Ref: library/ctypes ctypes get_errno8339300 +Ref: 28fb8339300 +Ref: library/ctypes ctypes get_last_error8339553 +Ref: 28fd8339553 +Ref: library/ctypes ctypes memmove8339829 +Ref: 29158339829 +Ref: library/ctypes ctypes memset8340073 +Ref: 29168340073 +Ref: library/ctypes ctypes POINTER8340326 +Ref: 28de8340326 +Ref: library/ctypes ctypes pointer8340574 +Ref: 28ce8340574 +Ref: library/ctypes ctypes resize8340894 +Ref: 28f08340894 +Ref: library/ctypes ctypes set_errno8341232 +Ref: 28fc8341232 +Ref: library/ctypes ctypes set_last_error8341540 +Ref: 28fe8341540 +Ref: library/ctypes ctypes sizeof8341871 +Ref: 29178341871 +Ref: library/ctypes ctypes string_at8342042 +Ref: 29188342042 +Ref: library/ctypes ctypes WinError8342413 +Ref: 29198342413 +Ref: library/ctypes ctypes wstring_at8342894 +Ref: 291a8342894 +Node: Data types8343315 +Ref: library/ctypes ctypes-data-types8343438 +Ref: 291b8343438 +Ref: library/ctypes data-types8343438 +Ref: 291c8343438 +Ref: library/ctypes ctypes _CData8343483 +Ref: 14f18343483 +Ref: library/ctypes ctypes _CData from_buffer8344118 +Ref: 291e8344118 +Ref: library/ctypes ctypes _CData from_buffer_copy8344705 +Ref: 291f8344705 +Ref: library/ctypes ctypes _CData from_address8345250 +Ref: 29208345250 +Ref: library/ctypes ctypes _CData from_param8345596 +Ref: 29218345596 +Ref: library/ctypes ctypes _CData in_dll8346150 +Ref: 29228346150 +Ref: library/ctypes ctypes _CData _b_base_8346446 +Ref: 29238346446 +Ref: library/ctypes ctypes _CData _b_needsfree_8346751 +Ref: 29248346751 +Ref: library/ctypes ctypes _CData _objects8346925 +Ref: 291d8346925 +Node: Fundamental data types<2>8347237 +Ref: library/ctypes ctypes-fundamental-data-types-28347364 +Ref: 29258347364 +Ref: library/ctypes id18347364 +Ref: 29268347364 +Ref: library/ctypes ctypes _SimpleCData8347433 +Ref: 29278347433 +Ref: library/ctypes ctypes _SimpleCData value8347906 +Ref: 29288347906 +Ref: library/ctypes ctypes c_byte8349261 +Ref: 28b58349261 +Ref: library/ctypes ctypes c_char8349473 +Ref: 28b38349473 +Ref: library/ctypes ctypes c_char_p8349713 +Ref: 28bf8349713 +Ref: library/ctypes ctypes c_double8350007 +Ref: 13008350007 +Ref: library/ctypes ctypes c_longdouble8350136 +Ref: 13018350136 +Ref: library/ctypes ctypes c_float8350383 +Ref: 28be8350383 +Ref: library/ctypes ctypes c_int8350510 +Ref: 28a88350510 +Ref: library/ctypes ctypes c_int88350774 +Ref: 29298350774 +Ref: library/ctypes ctypes c_int168350897 +Ref: 292a8350897 +Ref: library/ctypes ctypes c_int328351023 +Ref: 292b8351023 +Ref: library/ctypes ctypes c_int648351147 +Ref: 292c8351147 +Ref: library/ctypes ctypes c_long8351276 +Ref: 28a98351276 +Ref: library/ctypes ctypes c_longlong8351440 +Ref: 28bb8351440 +Ref: library/ctypes ctypes c_short8351618 +Ref: 28b78351618 +Ref: library/ctypes ctypes c_size_t8351784 +Ref: 28bd8351784 +Ref: library/ctypes ctypes c_ssize_t8351858 +Ref: efa8351858 +Ref: library/ctypes ctypes c_ubyte8351960 +Ref: 28b68351960 +Ref: library/ctypes ctypes c_uint8352174 +Ref: 28b98352174 +Ref: library/ctypes ctypes c_uint88352443 +Ref: 292d8352443 +Ref: library/ctypes ctypes c_uint168352570 +Ref: 292e8352570 +Ref: library/ctypes ctypes c_uint328352700 +Ref: 292f8352700 +Ref: library/ctypes ctypes c_uint648352828 +Ref: 29308352828 +Ref: library/ctypes ctypes c_ulong8352961 +Ref: 28ba8352961 +Ref: library/ctypes ctypes c_ulonglong8353128 +Ref: 28bc8353128 +Ref: library/ctypes ctypes c_ushort8353309 +Ref: 28b88353309 +Ref: library/ctypes ctypes c_void_p8353478 +Ref: 28c08353478 +Ref: library/ctypes ctypes c_wchar8353641 +Ref: 28b48353641 +Ref: library/ctypes ctypes c_wchar_p8353900 +Ref: 12cc8353900 +Ref: library/ctypes ctypes c_bool8354107 +Ref: 28b28354107 +Ref: library/ctypes ctypes HRESULT8354321 +Ref: 28f88354321 +Ref: library/ctypes ctypes py_object8354482 +Ref: 29318354482 +Node: Structured data types8354871 +Ref: library/ctypes ctypes-structured-data-types8355007 +Ref: 29328355007 +Ref: library/ctypes structured-data-types8355007 +Ref: 29338355007 +Ref: library/ctypes ctypes Union8355074 +Ref: 28d28355074 +Ref: library/ctypes ctypes BigEndianUnion8355172 +Ref: 12148355172 +Ref: library/ctypes ctypes LittleEndianUnion8355312 +Ref: 12158355312 +Ref: library/ctypes ctypes BigEndianStructure8355458 +Ref: 28d58355458 +Ref: library/ctypes ctypes LittleEndianStructure8355579 +Ref: 28d68355579 +Ref: library/ctypes ctypes Structure8355848 +Ref: 28d18355848 +Ref: library/ctypes ctypes Structure _fields_8356272 +Ref: 29348356272 +Ref: library/ctypes ctypes Structure _pack_8357866 +Ref: 29358357866 +Ref: library/ctypes ctypes Structure _anonymous_8358154 +Ref: 29368358154 +Node: Arrays and pointers8360510 +Ref: library/ctypes arrays-and-pointers8360612 +Ref: 29378360612 +Ref: library/ctypes ctypes-arrays-pointers8360612 +Ref: 29388360612 +Ref: library/ctypes ctypes Array8360675 +Ref: 145c8360675 +Ref: library/ctypes ctypes Array _length_8361189 +Ref: 29398361189 +Ref: library/ctypes ctypes Array _type_8361418 +Ref: 293a8361418 +Ref: library/ctypes ctypes _Pointer8361616 +Ref: 293b8361616 +Ref: library/ctypes ctypes _Pointer _type_8362274 +Ref: 293c8362274 +Ref: library/ctypes ctypes _Pointer contents8362344 +Ref: 28dd8362344 +Node: Concurrent Execution8362534 +Ref: library/concurrency doc8362710 +Ref: 293d8362710 +Ref: library/concurrency concurrency8362710 +Ref: 293e8362710 +Ref: library/concurrency concurrent-execution8362710 +Ref: 293f8362710 +Node: threading — Thread-based parallelism8363663 +Ref: library/threading doc8363812 +Ref: 29408363812 +Ref: library/threading module-threading8363812 +Ref: 10b8363812 +Ref: library/threading threading-thread-based-parallelism8363812 +Ref: 29418363812 +Ref: library/threading threading active_count8365776 +Ref: 47e8365776 +Ref: library/threading threading current_thread8366067 +Ref: 47d8366067 +Ref: library/threading threading excepthook8366470 +Ref: 4428366470 +Ref: library/threading threading __excepthook__8367804 +Ref: 4418367804 +Ref: library/threading threading get_ident8368074 +Ref: e0c8368074 +Ref: library/threading threading get_native_id8368468 +Ref: 68b8368468 +Ref: library/threading threading enumerate8368929 +Ref: 12a48368929 +Ref: library/threading threading main_thread8369313 +Ref: c748369313 +Ref: library/threading threading settrace8369538 +Ref: 43f8369538 +Ref: library/threading threading gettrace8369806 +Ref: 43d8369806 +Ref: library/threading threading setprofile8369932 +Ref: 4408369932 +Ref: library/threading threading getprofile8370206 +Ref: 43e8370206 +Ref: library/threading threading stack_size8370339 +Ref: 29428370339 +Ref: library/threading threading TIMEOUT_MAX8371665 +Ref: 29438371665 +Ref: threading — Thread-based parallelism-Footnote-18373022 +Node: Thread-Local Data8373091 +Ref: library/threading thread-local-data8373206 +Ref: 29448373206 +Ref: library/threading threading local8373558 +Ref: 28e78373558 +Node: Thread Objects8373754 +Ref: library/threading id18373890 +Ref: 29458373890 +Ref: library/threading thread-objects8373890 +Ref: 29468373890 +Ref: library/threading threading Thread8376565 +Ref: 59b8376565 +Ref: library/threading threading Thread start8378014 +Ref: 26de8378014 +Ref: library/threading threading Thread run8378391 +Ref: 68a8378391 +Ref: library/threading meth-thread-join8379202 +Ref: 29478379202 +Ref: library/threading threading Thread join8379202 +Ref: e948379202 +Ref: library/threading threading Thread name8380467 +Ref: 4818380467 +Ref: library/threading threading Thread getName8380685 +Ref: 29488380685 +Ref: library/threading threading Thread setName8380713 +Ref: 29498380713 +Ref: library/threading threading Thread ident8380895 +Ref: 26148380895 +Ref: library/threading threading Thread native_id8381286 +Ref: 68c8381286 +Ref: library/threading threading Thread is_alive8382097 +Ref: 59c8382097 +Ref: library/threading threading Thread daemon8382435 +Ref: 4828382435 +Ref: library/threading threading Thread isDaemon8383029 +Ref: 294a8383029 +Ref: library/threading threading Thread setDaemon8383058 +Ref: 294b8383058 +Node: Lock Objects8383244 +Ref: library/threading id28383376 +Ref: 294c8383376 +Ref: library/threading lock-objects8383376 +Ref: 294d8383376 +Ref: library/threading threading Lock8384793 +Ref: 29508384793 +Ref: library/threading threading Lock acquire8385195 +Ref: 2628385195 +Ref: library/threading threading Lock release8386533 +Ref: 294e8386533 +Ref: library/threading threading Lock locked8387018 +Ref: 29518387018 +Node: RLock Objects8387100 +Ref: library/threading id38387235 +Ref: 29528387235 +Ref: library/threading rlock-objects8387235 +Ref: 29538387235 +Ref: library/threading threading RLock8388145 +Ref: f148388145 +Ref: library/threading threading RLock acquire8388667 +Ref: b088388667 +Ref: library/threading threading RLock release8390213 +Ref: 29548390213 +Node: Condition Objects8390906 +Ref: library/threading condition-objects8391046 +Ref: 29558391046 +Ref: library/threading id48391046 +Ref: 29568391046 +Ref: library/threading threading Condition8394165 +Ref: e078394165 +Ref: library/threading threading Condition acquire8394708 +Ref: 29578394708 +Ref: library/threading threading Condition release8394920 +Ref: 29588394920 +Ref: library/threading threading Condition wait8395103 +Ref: 12b58395103 +Ref: library/threading threading Condition wait_for8396633 +Ref: 29598396633 +Ref: library/threading threading Condition notify8397605 +Ref: 11cf8397605 +Ref: library/threading threading Condition notify_all8398507 +Ref: 47f8398507 +Node: Semaphore Objects8398923 +Ref: library/threading id58399063 +Ref: 295a8399063 +Ref: library/threading semaphore-objects8399063 +Ref: 295b8399063 +Ref: library/threading threading Semaphore8399759 +Ref: e088399759 +Ref: library/threading threading Semaphore acquire8400448 +Ref: f128400448 +Ref: library/threading threading Semaphore release8401743 +Ref: 295c8401743 +Ref: library/threading threading BoundedSemaphore8402120 +Ref: e098402120 +Node: Semaphore Example8402683 +Ref: library/threading semaphore-example8402754 +Ref: 295d8402754 +Ref: library/threading semaphore-examples8402754 +Ref: 295e8402754 +Node: Event Objects8403623 +Ref: library/threading event-objects8403759 +Ref: 295f8403759 +Ref: library/threading id68403759 +Ref: 29608403759 +Ref: library/threading threading Event8404160 +Ref: e0a8404160 +Ref: library/threading threading Event is_set8404550 +Ref: 4808404550 +Ref: library/threading threading Event set8404722 +Ref: 29618404722 +Ref: library/threading threading Event clear8404949 +Ref: 29628404949 +Ref: library/threading threading Event wait8405177 +Ref: fc28405177 +Node: Timer Objects8406052 +Ref: library/threading id78406186 +Ref: 29638406186 +Ref: library/threading timer-objects8406186 +Ref: 29648406186 +Ref: library/threading threading Timer8406935 +Ref: e0b8406935 +Ref: library/threading threading Timer cancel8407384 +Ref: 29658407384 +Node: Barrier Objects8407574 +Ref: library/threading barrier-objects8407754 +Ref: 29668407754 +Ref: library/threading threading Barrier8408709 +Ref: e938408709 +Ref: library/threading threading Barrier wait8409053 +Ref: 29678409053 +Ref: library/threading threading Barrier reset8410200 +Ref: 29688410200 +Ref: library/threading threading Barrier abort8410636 +Ref: 29698410636 +Ref: library/threading threading Barrier parties8411125 +Ref: 296a8411125 +Ref: library/threading threading Barrier n_waiting8411217 +Ref: 296b8411217 +Ref: library/threading threading Barrier broken8411315 +Ref: 296c8411315 +Ref: library/threading threading BrokenBarrierError8411432 +Ref: e958411432 +Node: Using locks conditions and semaphores in the with statement8411609 +Ref: library/threading using-locks-conditions-and-semaphores-in-the-with-statement8411767 +Ref: 296d8411767 +Ref: library/threading with-locks8411767 +Ref: 294f8411767 +Node: multiprocessing — Process-based parallelism8412612 +Ref: library/multiprocessing doc8412852 +Ref: 296e8412852 +Ref: library/multiprocessing module-multiprocessing8412852 +Ref: b58412852 +Ref: library/multiprocessing multiprocessing-process-based-parallelism8412852 +Ref: 296f8412852 +Ref: multiprocessing — Process-based parallelism-Footnote-18413466 +Node: Introduction<7>8413539 +Ref: library/multiprocessing introduction8413657 +Ref: 29708413657 +Node: The Process class8415600 +Ref: library/multiprocessing the-process-class8415704 +Ref: 29718415704 +Node: Contexts and start methods8416885 +Ref: library/multiprocessing contexts-and-start-methods8417034 +Ref: 29748417034 +Ref: library/multiprocessing multiprocessing-start-methods8417107 +Ref: c048417107 +Ref: Contexts and start methods-Footnote-18421585 +Node: Exchanging objects between processes8421650 +Ref: library/multiprocessing exchanging-objects-between-processes8421815 +Ref: 29778421815 +Node: Synchronization between processes8423534 +Ref: library/multiprocessing synchronization-between-processes8423704 +Ref: 29798423704 +Node: Sharing state between processes8424425 +Ref: library/multiprocessing sharing-state-between-processes8424582 +Ref: 297a8424582 +Node: Using a pool of workers8427680 +Ref: library/multiprocessing using-a-pool-of-workers8427795 +Ref: 29848427795 +Node: Reference<2>8430915 +Ref: library/multiprocessing reference8431064 +Ref: 29858431064 +Node: Process and exceptions8431571 +Ref: library/multiprocessing process-and-exceptions8431667 +Ref: 29868431667 +Ref: library/multiprocessing multiprocessing Process8431740 +Ref: 7b48431740 +Ref: library/multiprocessing multiprocessing Process run8433246 +Ref: 29758433246 +Ref: library/multiprocessing multiprocessing Process start8434055 +Ref: 29728434055 +Ref: library/multiprocessing multiprocessing Process join8434304 +Ref: 29898434304 +Ref: library/multiprocessing multiprocessing Process name8435026 +Ref: 29878435026 +Ref: library/multiprocessing multiprocessing Process is_alive8435491 +Ref: 298b8435491 +Ref: library/multiprocessing multiprocessing Process daemon8435727 +Ref: 29888435727 +Ref: library/multiprocessing multiprocessing Process pid8436608 +Ref: 298c8436608 +Ref: library/multiprocessing multiprocessing Process exitcode8436733 +Ref: 298a8436733 +Ref: library/multiprocessing multiprocessing Process authkey8437334 +Ref: 298d8437334 +Ref: library/multiprocessing multiprocessing Process sentinel8437862 +Ref: d8b8437862 +Ref: library/multiprocessing multiprocessing Process terminate8438499 +Ref: 298f8438499 +Ref: library/multiprocessing multiprocessing Process kill8439301 +Ref: 7b38439301 +Ref: library/multiprocessing multiprocessing Process close8439456 +Ref: 7b28439456 +Ref: library/multiprocessing multiprocessing ProcessError8440681 +Ref: 29908440681 +Ref: library/multiprocessing multiprocessing BufferTooShort8440793 +Ref: 29918440793 +Ref: library/multiprocessing multiprocessing AuthenticationError8441102 +Ref: 29928441102 +Ref: library/multiprocessing multiprocessing TimeoutError8441206 +Ref: 29938441206 +Node: Pipes and Queues8441316 +Ref: library/multiprocessing pipes-and-queues8441437 +Ref: 29948441437 +Ref: library/multiprocessing multiprocessing Pipe8444862 +Ref: 29788444862 +Ref: library/multiprocessing multiprocessing Queue8445284 +Ref: 11e28445284 +Ref: library/multiprocessing multiprocessing Queue qsize8445883 +Ref: 29a18445883 +Ref: library/multiprocessing multiprocessing Queue empty8446230 +Ref: 299c8446230 +Ref: library/multiprocessing multiprocessing Queue full8446427 +Ref: 29a28446427 +Ref: library/multiprocessing multiprocessing Queue put8446622 +Ref: 14778446622 +Ref: library/multiprocessing multiprocessing Queue put_nowait8447449 +Ref: 29a38447449 +Ref: library/multiprocessing multiprocessing Queue get8447532 +Ref: 14788447532 +Ref: library/multiprocessing multiprocessing Queue get_nowait8448320 +Ref: 299d8448320 +Ref: library/multiprocessing multiprocessing Queue close8448567 +Ref: 11e38448567 +Ref: library/multiprocessing multiprocessing Queue join_thread8448863 +Ref: 29a48448863 +Ref: library/multiprocessing multiprocessing Queue cancel_join_thread8449414 +Ref: 299e8449414 +Ref: library/multiprocessing multiprocessing SimpleQueue8450562 +Ref: 55a8450562 +Ref: library/multiprocessing multiprocessing SimpleQueue close8450698 +Ref: 55b8450698 +Ref: library/multiprocessing multiprocessing SimpleQueue empty8451007 +Ref: 29a78451007 +Ref: library/multiprocessing multiprocessing SimpleQueue get8451109 +Ref: 29a58451109 +Ref: library/multiprocessing multiprocessing SimpleQueue put8451187 +Ref: 29a68451187 +Ref: library/multiprocessing multiprocessing JoinableQueue8451254 +Ref: 29958451254 +Ref: library/multiprocessing multiprocessing JoinableQueue task_done8451474 +Ref: 29988451474 +Ref: library/multiprocessing multiprocessing JoinableQueue join8452162 +Ref: 29a88452162 +Ref: Pipes and Queues-Footnote-18452666 +Node: Miscellaneous<3>8452730 +Ref: library/multiprocessing miscellaneous8452847 +Ref: 29a98452847 +Ref: library/multiprocessing multiprocessing active_children8452896 +Ref: 29aa8452896 +Ref: library/multiprocessing multiprocessing cpu_count8453113 +Ref: c0d8453113 +Ref: library/multiprocessing multiprocessing current_process8453547 +Ref: 29ab8453547 +Ref: library/multiprocessing multiprocessing parent_process8453744 +Ref: 29ac8453744 +Ref: library/multiprocessing multiprocessing freeze_support8454011 +Ref: 29ad8454011 +Ref: library/multiprocessing multiprocessing get_all_start_methods8455047 +Ref: c058455047 +Ref: library/multiprocessing multiprocessing get_context8455465 +Ref: c088455465 +Ref: library/multiprocessing multiprocessing get_start_method8455899 +Ref: c068455899 +Ref: library/multiprocessing multiprocessing set_executable8456702 +Ref: 11eb8456702 +Ref: library/multiprocessing multiprocessing set_start_method8457245 +Ref: c078457245 +Ref: Miscellaneous<3>-Footnote-18457942 +Node: Connection Objects8458007 +Ref: library/multiprocessing connection-objects8458134 +Ref: 29ae8458134 +Ref: library/multiprocessing multiprocessing connection Connection8458453 +Ref: 29a08458453 +Ref: library/multiprocessing multiprocessing connection Connection send8458503 +Ref: 29b08458503 +Ref: library/multiprocessing multiprocessing connection Connection recv8458830 +Ref: 29b18458830 +Ref: library/multiprocessing multiprocessing connection Connection fileno8459122 +Ref: 29b28459122 +Ref: library/multiprocessing multiprocessing connection Connection close8459222 +Ref: 29b38459222 +Ref: library/multiprocessing multiprocessing connection Connection poll8459374 +Ref: 29b48459374 +Ref: library/multiprocessing multiprocessing connection Connection send_bytes8459860 +Ref: 29b58459860 +Ref: library/multiprocessing multiprocessing connection Connection recv_bytes8460319 +Ref: 29b68460319 +Ref: library/multiprocessing multiprocessing connection Connection recv_bytes_into8460959 +Ref: 29b78460959 +Ref: library/multiprocessing multiprocessing-recv-pickle-security8462787 +Ref: 29b88462787 +Node: Synchronization primitives8463473 +Ref: library/multiprocessing synchronization-primitives8463605 +Ref: 29b98463605 +Ref: library/multiprocessing multiprocessing Barrier8463976 +Ref: 29838463976 +Ref: library/multiprocessing multiprocessing BoundedSemaphore8464134 +Ref: 29818464134 +Ref: library/multiprocessing multiprocessing Condition8464632 +Ref: 29828464632 +Ref: library/multiprocessing multiprocessing Event8464966 +Ref: 125b8464966 +Ref: library/multiprocessing multiprocessing Lock8465045 +Ref: 297e8465045 +Ref: library/multiprocessing multiprocessing Lock acquire8465888 +Ref: 29ba8465888 +Ref: library/multiprocessing multiprocessing Lock release8467414 +Ref: 29bb8467414 +Ref: library/multiprocessing multiprocessing RLock8467783 +Ref: 297f8467783 +Ref: library/multiprocessing multiprocessing RLock acquire8468514 +Ref: 29bc8468514 +Ref: library/multiprocessing multiprocessing RLock release8470163 +Ref: 29bd8470163 +Ref: library/multiprocessing multiprocessing Semaphore8471140 +Ref: 29808471140 +Ref: Synchronization primitives-Footnote-18472562 +Node: Shared ctypes Objects8472626 +Ref: library/multiprocessing shared-ctypes-objects8472748 +Ref: 29be8472748 +Ref: library/multiprocessing multiprocessing Value8472925 +Ref: 297b8472925 +Ref: library/multiprocessing multiprocessing Array8474354 +Ref: 297c8474354 +Node: The multiprocessing sharedctypes module8475797 +Ref: library/multiprocessing module-multiprocessing sharedctypes8475894 +Ref: bb8475894 +Ref: library/multiprocessing the-multiprocessing-sharedctypes-module8475894 +Ref: 29bf8475894 +Ref: library/multiprocessing multiprocessing sharedctypes RawArray8476525 +Ref: 29c08476525 +Ref: library/multiprocessing multiprocessing sharedctypes RawValue8477354 +Ref: 29c28477354 +Ref: library/multiprocessing multiprocessing sharedctypes Array8478138 +Ref: 29c18478138 +Ref: library/multiprocessing multiprocessing sharedctypes Value8478905 +Ref: 29c38478905 +Ref: library/multiprocessing multiprocessing sharedctypes copy8479656 +Ref: 29c48479656 +Ref: library/multiprocessing multiprocessing sharedctypes synchronized8479818 +Ref: ab58479818 +Node: Managers8482834 +Ref: library/multiprocessing managers8482943 +Ref: 29c58482943 +Ref: library/multiprocessing multiprocessing-managers8482943 +Ref: 29998482943 +Ref: library/multiprocessing multiprocessing Manager8483293 +Ref: 9298483293 +Ref: library/multiprocessing module-multiprocessing managers8483613 +Ref: b88483613 +Ref: library/multiprocessing multiprocessing managers BaseManager8483803 +Ref: 29c78483803 +Ref: library/multiprocessing multiprocessing managers BaseManager start8485241 +Ref: 29c88485241 +Ref: library/multiprocessing multiprocessing managers BaseManager get_server8485476 +Ref: 29ca8485476 +Ref: library/multiprocessing multiprocessing managers BaseManager connect8486020 +Ref: 29cc8486020 +Ref: library/multiprocessing multiprocessing managers BaseManager shutdown8486301 +Ref: 29c98486301 +Ref: library/multiprocessing multiprocessing managers BaseManager register8486537 +Ref: 29cd8486537 +Ref: library/multiprocessing multiprocessing managers BaseManager address8488853 +Ref: 29cb8488853 +Ref: library/multiprocessing multiprocessing managers SyncManager8489384 +Ref: 29c68489384 +Ref: library/multiprocessing multiprocessing managers SyncManager Barrier8489824 +Ref: 29d08489824 +Ref: library/multiprocessing multiprocessing managers SyncManager BoundedSemaphore8490013 +Ref: 29d18490013 +Ref: library/multiprocessing multiprocessing managers SyncManager Condition8490168 +Ref: 29d28490168 +Ref: library/multiprocessing multiprocessing managers SyncManager Event8490541 +Ref: 29d38490541 +Ref: library/multiprocessing multiprocessing managers SyncManager Lock8490667 +Ref: 29d48490667 +Ref: library/multiprocessing multiprocessing managers SyncManager Namespace8490792 +Ref: 29d58490792 +Ref: library/multiprocessing multiprocessing managers SyncManager Queue8490917 +Ref: 29d68490917 +Ref: library/multiprocessing multiprocessing managers SyncManager RLock8491049 +Ref: 29d78491049 +Ref: library/multiprocessing multiprocessing managers SyncManager Semaphore8491175 +Ref: 29d88491175 +Ref: library/multiprocessing multiprocessing managers SyncManager Array8491316 +Ref: 29d98491316 +Ref: library/multiprocessing multiprocessing managers SyncManager Value8491415 +Ref: 29da8491415 +Ref: library/multiprocessing multiprocessing managers SyncManager dict8491560 +Ref: 29db8491560 +Ref: library/multiprocessing multiprocessing managers SyncManager list8491741 +Ref: 29dc8491741 +Ref: library/multiprocessing multiprocessing managers Namespace8492147 +Ref: 297d8492147 +Node: Customized managers8492928 +Ref: library/multiprocessing customized-managers8493023 +Ref: 29dd8493023 +Node: Using a remote manager8493795 +Ref: library/multiprocessing using-a-remote-manager8493890 +Ref: 29de8493890 +Node: Proxy Objects8496031 +Ref: library/multiprocessing multiprocessing-proxy-objects8496132 +Ref: 9288496132 +Ref: library/multiprocessing proxy-objects8496132 +Ref: 29df8496132 +Ref: library/multiprocessing multiprocessing managers BaseProxy8499391 +Ref: 29ce8499391 +Ref: library/multiprocessing multiprocessing managers BaseProxy _callmethod8499512 +Ref: 29cf8499512 +Ref: library/multiprocessing multiprocessing managers BaseProxy _getvalue8501093 +Ref: 29e08501093 +Ref: library/multiprocessing multiprocessing managers BaseProxy __repr__8501253 +Ref: 29e18501253 +Ref: library/multiprocessing multiprocessing managers BaseProxy __str__8501339 +Ref: 29e28501339 +Node: Cleanup8501444 +Ref: library/multiprocessing cleanup8501501 +Ref: 29e38501501 +Node: Process Pools8501790 +Ref: library/multiprocessing module-multiprocessing pool8501904 +Ref: b98501904 +Ref: library/multiprocessing process-pools8501904 +Ref: 29e48501904 +Ref: library/multiprocessing multiprocessing pool Pool8502065 +Ref: c098502065 +Ref: library/multiprocessing multiprocessing pool Pool apply8504678 +Ref: 29e78504678 +Ref: library/multiprocessing multiprocessing pool Pool apply_async8505049 +Ref: 29e88505049 +Ref: library/multiprocessing multiprocessing pool Pool map8505901 +Ref: d8f8505901 +Ref: library/multiprocessing multiprocessing pool Pool map_async8506685 +Ref: d908506685 +Ref: library/multiprocessing multiprocessing pool Pool imap8507539 +Ref: 29ea8507539 +Ref: library/multiprocessing multiprocessing pool Pool imap_unordered8508249 +Ref: 29eb8508249 +Ref: library/multiprocessing multiprocessing pool Pool starmap8508575 +Ref: d8c8508575 +Ref: library/multiprocessing multiprocessing pool Pool starmap_async8508927 +Ref: d8d8508927 +Ref: library/multiprocessing multiprocessing pool Pool close8509278 +Ref: 29e58509278 +Ref: library/multiprocessing multiprocessing pool Pool terminate8509465 +Ref: 29e68509465 +Ref: library/multiprocessing multiprocessing pool Pool join8509699 +Ref: 29ec8509699 +Ref: library/multiprocessing multiprocessing pool AsyncResult8510143 +Ref: 29e98510143 +Ref: library/multiprocessing multiprocessing pool AsyncResult get8510300 +Ref: 29ed8510300 +Ref: library/multiprocessing multiprocessing pool AsyncResult wait8510665 +Ref: 29ee8510665 +Ref: library/multiprocessing multiprocessing pool AsyncResult ready8510789 +Ref: 29ef8510789 +Ref: library/multiprocessing multiprocessing pool AsyncResult successful8510866 +Ref: 29f08510866 +Node: Listeners and Clients8512159 +Ref: library/multiprocessing listeners-and-clients8512279 +Ref: 29f18512279 +Ref: library/multiprocessing module-multiprocessing connection8512279 +Ref: b68512279 +Ref: library/multiprocessing multiprocessing-listeners-clients8512279 +Ref: 29af8512279 +Ref: library/multiprocessing multiprocessing connection deliver_challenge8512815 +Ref: 29f28512815 +Ref: library/multiprocessing multiprocessing connection answer_challenge8513221 +Ref: 29f38513221 +Ref: library/multiprocessing multiprocessing connection Client8513535 +Ref: 29f48513535 +Ref: library/multiprocessing multiprocessing connection Listener8514289 +Ref: 139a8514289 +Ref: library/multiprocessing multiprocessing connection Listener accept8516049 +Ref: 29f68516049 +Ref: library/multiprocessing multiprocessing connection Listener close8516331 +Ref: 29f78516331 +Ref: library/multiprocessing multiprocessing connection Listener address8516631 +Ref: 29f88516631 +Ref: library/multiprocessing multiprocessing connection Listener last_accepted8516727 +Ref: 29f98516727 +Ref: library/multiprocessing multiprocessing connection wait8517143 +Ref: d8a8517143 +Node: Address Formats8521183 +Ref: library/multiprocessing address-formats8521256 +Ref: 29fa8521256 +Ref: library/multiprocessing multiprocessing-address-formats8521256 +Ref: 29f58521256 +Node: Authentication keys8521970 +Ref: library/multiprocessing authentication-keys8522087 +Ref: 29fb8522087 +Ref: library/multiprocessing multiprocessing-auth-keys8522087 +Ref: 298e8522087 +Node: Logging<2>8523271 +Ref: library/multiprocessing logging8523399 +Ref: 29fc8523399 +Ref: library/multiprocessing multiprocessing get_logger8523667 +Ref: 29fd8523667 +Ref: library/multiprocessing multiprocessing log_to_stderr8524179 +Ref: 29fe8524179 +Node: The multiprocessing dummy module8525286 +Ref: library/multiprocessing module-multiprocessing dummy8525386 +Ref: b78525386 +Ref: library/multiprocessing the-multiprocessing-dummy-module8525386 +Ref: 29ff8525386 +Ref: library/multiprocessing multiprocessing pool ThreadPool8525911 +Ref: 13168525911 +Node: Programming guidelines8527746 +Ref: library/multiprocessing multiprocessing-programming8527892 +Ref: 29738527892 +Ref: library/multiprocessing programming-guidelines8527892 +Ref: 2a008527892 +Node: All start methods8528140 +Ref: library/multiprocessing all-start-methods8528263 +Ref: 2a018528263 +Ref: All start methods-Footnote-18534359 +Ref: All start methods-Footnote-28534423 +Ref: All start methods-Footnote-38534487 +Node: The spawn and forkserver start methods8534551 +Ref: library/multiprocessing the-spawn-and-forkserver-start-methods8534674 +Ref: 2a028534674 +Ref: library/multiprocessing multiprocessing-safe-main-import8535476 +Ref: 2a038535476 +Node: Examples<13>8536750 +Ref: library/multiprocessing examples8536875 +Ref: 2a048536875 +Ref: library/multiprocessing multiprocessing-examples8536875 +Ref: 299f8536875 +Node: multiprocessing shared_memory — Shared memory for direct access across processes8545786 +Ref: library/multiprocessing shared_memory doc8546010 +Ref: 2a058546010 +Ref: library/multiprocessing shared_memory module-multiprocessing shared_memory8546010 +Ref: ba8546010 +Ref: library/multiprocessing shared_memory multiprocessing-shared-memory-shared-memory-for-direct-access-across-processes8546010 +Ref: 2a068546010 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory8547558 +Ref: 29768547558 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory close8549233 +Ref: 2a078549233 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory unlink8549589 +Ref: 2a088549589 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory buf8550369 +Ref: 2a098550369 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory name8550458 +Ref: 2a0a8550458 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory SharedMemory size8550569 +Ref: 2a0b8550569 +Ref: library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager8553659 +Ref: 2a0c8553659 +Ref: library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager SharedMemory8555074 +Ref: 2a0d8555074 +Ref: library/multiprocessing shared_memory multiprocessing managers SharedMemoryManager ShareableList8555230 +Ref: 2a0e8555230 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory ShareableList8557076 +Ref: 13868557076 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory ShareableList count8558251 +Ref: 2a0f8558251 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory ShareableList index8558344 +Ref: 2a108558344 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory ShareableList format8558504 +Ref: 2a118558504 +Ref: library/multiprocessing shared_memory multiprocessing shared_memory ShareableList shm8558658 +Ref: 2a128558658 +Ref: multiprocessing shared_memory — Shared memory for direct access across processes-Footnote-18561236 +Ref: multiprocessing shared_memory — Shared memory for direct access across processes-Footnote-28561326 +Node: The concurrent package8561357 +Ref: library/concurrent doc8561583 +Ref: 2a138561583 +Ref: library/concurrent the-concurrent-package8561583 +Ref: 2a148561583 +Node: concurrent futures — Launching parallel tasks8561771 +Ref: library/concurrent futures doc8561951 +Ref: 2a158561951 +Ref: library/concurrent futures concurrent-futures-launching-parallel-tasks8561951 +Ref: 2a168561951 +Ref: library/concurrent futures module-concurrent futures8561951 +Ref: 208561951 +Ref: concurrent futures — Launching parallel tasks-Footnote-18563029 +Ref: concurrent futures — Launching parallel tasks-Footnote-28563115 +Node: Executor Objects8563202 +Ref: library/concurrent futures executor-objects8563329 +Ref: 2a188563329 +Ref: library/concurrent futures concurrent futures Executor8563382 +Ref: 2a178563382 +Ref: library/concurrent futures concurrent futures Executor submit8563581 +Ref: 6d48563581 +Ref: library/concurrent futures concurrent futures Executor map8564025 +Ref: a658564025 +Ref: library/concurrent futures concurrent futures Executor shutdown8565632 +Ref: 52d8565632 +Node: ThreadPoolExecutor8567945 +Ref: library/concurrent futures threadpoolexecutor8568100 +Ref: 2a198568100 +Ref: library/concurrent futures concurrent futures ThreadPoolExecutor8569168 +Ref: 3118569168 +Node: ThreadPoolExecutor Example8571411 +Ref: library/concurrent futures id18571492 +Ref: 2a1b8571492 +Ref: library/concurrent futures threadpoolexecutor-example8571492 +Ref: e668571492 +Node: ProcessPoolExecutor8572691 +Ref: library/concurrent futures processpoolexecutor8572844 +Ref: 2a1c8572844 +Ref: library/concurrent futures concurrent futures ProcessPoolExecutor8573578 +Ref: 52e8573578 +Node: ProcessPoolExecutor Example8576105 +Ref: library/concurrent futures id28576188 +Ref: 2a1e8576188 +Ref: library/concurrent futures processpoolexecutor-example8576188 +Ref: e678576188 +Node: Future Objects8577094 +Ref: library/concurrent futures future-objects8577245 +Ref: 2a1f8577245 +Ref: library/concurrent futures concurrent futures Future8577454 +Ref: e658577454 +Ref: library/concurrent futures concurrent futures Future cancel8577693 +Ref: 2a208577693 +Ref: library/concurrent futures concurrent futures Future cancelled8578032 +Ref: 2a218578032 +Ref: library/concurrent futures concurrent futures Future running8578142 +Ref: 2a228578142 +Ref: library/concurrent futures concurrent futures Future done8578290 +Ref: 2a238578290 +Ref: library/concurrent futures concurrent futures Future result8578430 +Ref: 2a248578430 +Ref: library/concurrent futures concurrent futures Future exception8579158 +Ref: 2a258579158 +Ref: library/concurrent futures concurrent futures Future add_done_callback8579878 +Ref: 2a268579878 +Ref: library/concurrent futures concurrent futures Future set_running_or_notify_cancel8580774 +Ref: 2a278580774 +Ref: library/concurrent futures concurrent futures Future set_result8581863 +Ref: 2a288581863 +Ref: library/concurrent futures concurrent futures Future set_exception8582319 +Ref: 2a298582319 +Node: Module Functions8582810 +Ref: library/concurrent futures module-functions8582959 +Ref: 2a2b8582959 +Ref: library/concurrent futures concurrent futures wait8583012 +Ref: 12598583012 +Ref: library/concurrent futures concurrent futures as_completed8585003 +Ref: 152f8585003 +Ref: Module Functions-Footnote-18586035 +Node: Exception classes8586077 +Ref: library/concurrent futures exception-classes8586203 +Ref: 2a2c8586203 +Ref: library/concurrent futures concurrent futures CancelledError8586258 +Ref: 61d8586258 +Ref: library/concurrent futures concurrent futures TimeoutError8586349 +Ref: 2a2d8586349 +Ref: library/concurrent futures concurrent futures BrokenExecutor8586606 +Ref: 2a2e8586606 +Ref: library/concurrent futures concurrent futures InvalidStateError8586862 +Ref: 2a2a8586862 +Ref: library/concurrent futures concurrent futures thread BrokenThreadPool8587044 +Ref: 2a1a8587044 +Ref: library/concurrent futures concurrent futures process BrokenProcessPool8587296 +Ref: 2a1d8587296 +Node: subprocess — Subprocess management8587656 +Ref: library/subprocess doc8587839 +Ref: 2a2f8587839 +Ref: library/subprocess module-subprocess8587839 +Ref: f68587839 +Ref: library/subprocess subprocess-subprocess-management8587839 +Ref: 2a308587839 +Ref: subprocess — Subprocess management-Footnote-18589023 +Ref: subprocess — Subprocess management-Footnote-28589093 +Node: Using the subprocess Module8589135 +Ref: library/subprocess using-the-subprocess-module8589267 +Ref: 2a318589267 +Ref: library/subprocess subprocess run8589570 +Ref: 7e88589570 +Ref: library/subprocess subprocess CompletedProcess8593354 +Ref: afc8593354 +Ref: library/subprocess subprocess CompletedProcess args8593487 +Ref: 2a358593487 +Ref: library/subprocess subprocess CompletedProcess returncode8593609 +Ref: 2a368593609 +Ref: library/subprocess subprocess CompletedProcess stdout8593883 +Ref: 2a378593883 +Ref: library/subprocess subprocess CompletedProcess stderr8594314 +Ref: 2a388594314 +Ref: library/subprocess subprocess CompletedProcess check_returncode8594556 +Ref: 2a398594556 +Ref: library/subprocess subprocess DEVNULL8594720 +Ref: dfe8594720 +Ref: library/subprocess subprocess PIPE8594964 +Ref: 7e98594964 +Ref: library/subprocess subprocess STDOUT8595228 +Ref: 2a3a8595228 +Ref: library/subprocess subprocess SubprocessError8595435 +Ref: 2a3b8595435 +Ref: library/subprocess subprocess TimeoutExpired8595564 +Ref: 2a348595564 +Ref: library/subprocess subprocess TimeoutExpired cmd8595723 +Ref: 2a3c8595723 +Ref: library/subprocess subprocess TimeoutExpired timeout8595809 +Ref: 2a3d8595809 +Ref: library/subprocess subprocess TimeoutExpired output8595869 +Ref: 2a3e8595869 +Ref: library/subprocess subprocess TimeoutExpired stdout8596252 +Ref: 2a3f8596252 +Ref: library/subprocess subprocess TimeoutExpired stderr8596347 +Ref: 2a408596347 +Ref: library/subprocess subprocess CalledProcessError8596812 +Ref: fc08596812 +Ref: library/subprocess subprocess CalledProcessError returncode8597074 +Ref: 2a428597074 +Ref: library/subprocess subprocess CalledProcessError cmd8597242 +Ref: 2a438597242 +Ref: library/subprocess subprocess CalledProcessError output8597328 +Ref: 2a448597328 +Ref: library/subprocess subprocess CalledProcessError stdout8597499 +Ref: 2a458597499 +Ref: library/subprocess subprocess CalledProcessError stderr8597594 +Ref: 2a468597594 +Node: Frequently Used Arguments8597902 +Ref: library/subprocess frequently-used-arguments8598017 +Ref: 2a328598017 +Ref: library/subprocess id18598017 +Ref: 2a478598017 +Node: Popen Constructor8602221 +Ref: library/subprocess popen-constructor8602358 +Ref: 2a4c8602358 +Ref: library/subprocess subprocess Popen8602653 +Ref: 6e88602653 +Ref: Popen Constructor-Footnote-18619932 +Node: Exceptions<8>8619992 +Ref: library/subprocess exceptions8620095 +Ref: 2a5b8620095 +Node: Security Considerations8621361 +Ref: library/subprocess security-considerations8621515 +Ref: 2a4b8621515 +Ref: library/subprocess subprocess-security8621515 +Ref: 2a5c8621515 +Ref: Security Considerations-Footnote-18622140 +Node: Popen Objects8622210 +Ref: library/subprocess popen-objects8622358 +Ref: 2a5e8622358 +Ref: library/subprocess subprocess Popen poll8622475 +Ref: 2a5f8622475 +Ref: library/subprocess subprocess Popen wait8622635 +Ref: 9528622635 +Ref: library/subprocess subprocess Popen communicate8623564 +Ref: 2a338623564 +Ref: library/subprocess subprocess Popen send_signal8625315 +Ref: 13c78625315 +Ref: library/subprocess subprocess Popen terminate8625700 +Ref: 2a608625700 +Ref: library/subprocess subprocess Popen kill8625906 +Ref: 2a618625906 +Ref: library/subprocess subprocess Popen args8626140 +Ref: 2a628626140 +Ref: library/subprocess subprocess Popen stdin8626323 +Ref: 2a488626323 +Ref: library/subprocess subprocess Popen stdout8626754 +Ref: 2a498626754 +Ref: library/subprocess subprocess Popen stderr8627257 +Ref: 2a4a8627257 +Ref: library/subprocess subprocess Popen pid8628022 +Ref: 2a638628022 +Ref: library/subprocess subprocess Popen returncode8628204 +Ref: 13c88628204 +Node: Windows Popen Helpers8628555 +Ref: library/subprocess windows-popen-helpers8628700 +Ref: 2a648628700 +Ref: library/subprocess subprocess STARTUPINFO8628854 +Ref: 2a4e8628854 +Ref: library/subprocess subprocess STARTUPINFO dwFlags8629273 +Ref: 2a658629273 +Ref: library/subprocess subprocess STARTUPINFO hStdInput8629587 +Ref: 2a668629587 +Ref: library/subprocess subprocess STARTUPINFO hStdOutput8629909 +Ref: 2a688629909 +Ref: library/subprocess subprocess STARTUPINFO hStdError8630220 +Ref: 2a698630220 +Ref: library/subprocess subprocess STARTUPINFO wShowWindow8630528 +Ref: 2a6a8630528 +Ref: library/subprocess subprocess STARTUPINFO lpAttributeList8631020 +Ref: 8788631020 +Ref: Windows Popen Helpers-Footnote-18632274 +Ref: Windows Popen Helpers-Footnote-28632346 +Ref: Windows Popen Helpers-Footnote-38632418 +Node: Windows Constants8632507 +Ref: library/subprocess windows-constants8632582 +Ref: 2a6d8632582 +Ref: library/subprocess subprocess STD_INPUT_HANDLE8632704 +Ref: 2a6e8632704 +Ref: library/subprocess subprocess STD_OUTPUT_HANDLE8632841 +Ref: 2a6f8632841 +Ref: library/subprocess subprocess STD_ERROR_HANDLE8632989 +Ref: 2a708632989 +Ref: library/subprocess subprocess SW_HIDE8633135 +Ref: 2a6c8633135 +Ref: library/subprocess subprocess STARTF_USESTDHANDLES8633224 +Ref: 2a678633224 +Ref: library/subprocess subprocess STARTF_USESHOWWINDOW8633455 +Ref: 2a6b8633455 +Ref: library/subprocess subprocess CREATE_NEW_CONSOLE8633608 +Ref: 2a4f8633608 +Ref: library/subprocess subprocess CREATE_NEW_PROCESS_GROUP8633755 +Ref: 2a508633755 +Ref: library/subprocess subprocess ABOVE_NORMAL_PRIORITY_CLASS8634077 +Ref: 2a518634077 +Ref: library/subprocess subprocess BELOW_NORMAL_PRIORITY_CLASS8634281 +Ref: 2a528634281 +Ref: library/subprocess subprocess HIGH_PRIORITY_CLASS8634484 +Ref: 2a538634484 +Ref: library/subprocess subprocess IDLE_PRIORITY_CLASS8634670 +Ref: 2a548634670 +Ref: library/subprocess subprocess NORMAL_PRIORITY_CLASS8634866 +Ref: 2a558634866 +Ref: library/subprocess subprocess REALTIME_PRIORITY_CLASS8635068 +Ref: 2a568635068 +Ref: library/subprocess subprocess CREATE_NO_WINDOW8635602 +Ref: 2a578635602 +Ref: library/subprocess subprocess DETACHED_PROCESS8635784 +Ref: 2a588635784 +Ref: library/subprocess subprocess CREATE_DEFAULT_ERROR_MODE8636038 +Ref: 2a598636038 +Ref: library/subprocess subprocess CREATE_BREAKAWAY_FROM_JOB8636438 +Ref: 2a5a8636438 +Node: Older high-level API8636635 +Ref: library/subprocess call-function-trio8636819 +Ref: 2a718636819 +Ref: library/subprocess older-high-level-api8636819 +Ref: 2a728636819 +Ref: library/subprocess subprocess call8637067 +Ref: 7ea8637067 +Ref: library/subprocess subprocess check_call8638121 +Ref: 2a418638121 +Ref: library/subprocess subprocess check_output8639452 +Ref: c608639452 +Node: Replacing Older Functions with the subprocess Module8641683 +Ref: library/subprocess replacing-older-functions-with-the-subprocess-module8641879 +Ref: 2a738641879 +Ref: library/subprocess subprocess-replacements8641879 +Ref: e3d8641879 +Node: Replacing /bin/sh shell command substitution8643046 +Ref: library/subprocess replacing-bin-sh-shell-command-substitution8643212 +Ref: 2a748643212 +Node: Replacing shell pipeline8643417 +Ref: library/subprocess replacing-shell-pipeline8643611 +Ref: 2a758643611 +Node: Replacing os system8644262 +Ref: library/subprocess replacing-os-system8644441 +Ref: 2a768644441 +Node: Replacing the os spawn family8645389 +Ref: library/subprocess replacing-the-os-spawn-family8645582 +Ref: 2a778645582 +Node: Replacing os popen os popen2 os popen38646213 +Ref: library/subprocess replacing-os-popen-os-popen2-os-popen38646429 +Ref: 2a788646429 +Node: Replacing functions from the popen2 module8647724 +Ref: library/subprocess replacing-functions-from-the-popen2-module8647902 +Ref: 2a798647902 +Node: Legacy Shell Invocation Functions8649216 +Ref: library/subprocess legacy-shell-invocation-functions8649400 +Ref: 2a7a8649400 +Ref: library/subprocess subprocess getstatusoutput8649764 +Ref: c618649764 +Ref: library/subprocess subprocess getoutput8651072 +Ref: 11e18651072 +Node: Notes<2>8651616 +Ref: library/subprocess notes8651739 +Ref: 2a7b8651739 +Node: Converting an argument sequence to a string on Windows8651925 +Ref: library/subprocess converting-an-argument-sequence-to-a-string-on-windows8652070 +Ref: 2a7c8652070 +Ref: library/subprocess converting-argument-sequence8652070 +Ref: 2a4d8652070 +Ref: library/subprocess disable-vfork8653230 +Ref: 2a7d8653230 +Node: Disabling use of vfork or posix_spawn8653230 +Ref: library/subprocess disable-posix-spawn8653375 +Ref: 2a7e8653375 +Ref: library/subprocess disabling-use-of-vfork-or-posix-spawn8653375 +Ref: 2a7f8653375 +Node: sched — Event scheduler8654789 +Ref: library/sched doc8654961 +Ref: 2a808654961 +Ref: library/sched module-sched8654961 +Ref: e08654961 +Ref: library/sched sched-event-scheduler8654961 +Ref: 2a818654961 +Ref: library/sched sched scheduler8655231 +Ref: dd28655231 +Ref: sched — Event scheduler-Footnote-18656891 +Node: Scheduler Objects8656956 +Ref: library/sched id18657035 +Ref: 2a828657035 +Ref: library/sched scheduler-objects8657035 +Ref: 2a838657035 +Ref: library/sched sched scheduler enterabs8657166 +Ref: dd48657166 +Ref: library/sched sched scheduler enter8658050 +Ref: dd38658050 +Ref: library/sched sched scheduler cancel8658459 +Ref: 13378658459 +Ref: library/sched sched scheduler empty8658646 +Ref: 2a848658646 +Ref: library/sched sched scheduler run8658731 +Ref: dd18658731 +Ref: library/sched sched scheduler queue8659783 +Ref: 2a858659783 +Node: queue — A synchronized queue class8660042 +Ref: library/queue doc8660211 +Ref: 2a868660211 +Ref: library/queue module-queue8660211 +Ref: d78660211 +Ref: library/queue queue-a-synchronized-queue-class8660211 +Ref: 2a878660211 +Ref: library/queue queue Queue8661535 +Ref: 101f8661535 +Ref: library/queue queue LifoQueue8661899 +Ref: 1caf8661899 +Ref: library/queue queue PriorityQueue8662267 +Ref: 1cb08662267 +Ref: library/queue queue SimpleQueue8663262 +Ref: 7c88663262 +Ref: library/queue queue Empty8663436 +Ref: 299a8663436 +Ref: library/queue queue Full8663622 +Ref: 299b8663622 +Ref: queue — A synchronized queue class-Footnote-18663894 +Node: Queue Objects8663959 +Ref: library/queue queue-objects8664073 +Ref: 2a8c8664073 +Ref: library/queue queueobjects8664073 +Ref: 2a8d8664073 +Ref: library/queue queue Queue qsize8664253 +Ref: 2a8e8664253 +Ref: library/queue queue Queue empty8664482 +Ref: 2a8f8664482 +Ref: library/queue queue Queue full8664811 +Ref: 2a908664811 +Ref: library/queue queue Queue put8665136 +Ref: 2a8a8665136 +Ref: library/queue queue Queue put_nowait8665728 +Ref: 2a8b8665728 +Ref: library/queue queue Queue get8665815 +Ref: 2a888665815 +Ref: library/queue queue Queue get_nowait8666719 +Ref: 2a898666719 +Ref: library/queue queue Queue task_done8666912 +Ref: 29968666912 +Ref: library/queue queue Queue join8667558 +Ref: 29978667558 +Node: SimpleQueue Objects8668574 +Ref: library/queue simplequeue-objects8668688 +Ref: 2a918668688 +Ref: library/queue queue SimpleQueue qsize8668824 +Ref: 2a928668824 +Ref: library/queue queue SimpleQueue empty8668990 +Ref: 2a938668990 +Ref: library/queue queue SimpleQueue put8669207 +Ref: 2a948669207 +Ref: library/queue queue SimpleQueue put_nowait8669972 +Ref: 2a958669972 +Ref: library/queue queue SimpleQueue get8670134 +Ref: 2a968670134 +Ref: library/queue queue SimpleQueue get_nowait8670716 +Ref: 2a978670716 +Node: contextvars — Context Variables8671164 +Ref: library/contextvars doc8671343 +Ref: 2a988671343 +Ref: library/contextvars contextvars-context-variables8671343 +Ref: 2a998671343 +Ref: library/contextvars module-contextvars8671343 +Ref: 238671343 +Ref: contextvars — Context Variables-Footnote-18672200 +Node: Context Variables8672242 +Ref: library/contextvars context-variables8672363 +Ref: 2a9d8672363 +Ref: library/contextvars contextvars ContextVar8672418 +Ref: 2a9a8672418 +Ref: library/contextvars contextvars ContextVar name8673125 +Ref: 2a9f8673125 +Ref: library/contextvars contextvars ContextVar get8673252 +Ref: 2a9e8673252 +Ref: library/contextvars contextvars ContextVar set8673739 +Ref: 2aa08673739 +Ref: library/contextvars contextvars ContextVar reset8674135 +Ref: 2aa28674135 +Ref: library/contextvars contextvars Token8674656 +Ref: 2aa18674656 +Ref: library/contextvars contextvars Token var8674930 +Ref: 2aa38674930 +Ref: library/contextvars contextvars Token old_value8675068 +Ref: 2aa48675068 +Ref: library/contextvars contextvars Token MISSING8675360 +Ref: 2aa58675360 +Node: Manual Context Management8675453 +Ref: library/contextvars manual-context-management8675598 +Ref: 2aa68675598 +Ref: library/contextvars contextvars copy_context8675669 +Ref: 2a9b8675669 +Ref: library/contextvars contextvars Context8676145 +Ref: 2a9c8676145 +Ref: library/contextvars contextvars Context run8676482 +Ref: 2aa78676482 +Ref: library/contextvars contextvars Context copy8677909 +Ref: 2aa88677909 +Ref: library/contextvars contextvars Context get8678352 +Ref: 2aa98678352 +Ref: library/contextvars contextvars Context keys8678794 +Ref: 2aaa8678794 +Ref: library/contextvars contextvars Context values8678885 +Ref: 2aab8678885 +Ref: library/contextvars contextvars Context items8678988 +Ref: 2aac8678988 +Node: asyncio support8679127 +Ref: library/contextvars asyncio-support8679246 +Ref: 2aad8679246 +Node: _thread — Low-level threading API8680821 +Ref: library/_thread doc8680955 +Ref: 2aae8680955 +Ref: library/_thread module-_thread8680955 +Ref: 28680955 +Ref: library/_thread thread-low-level-threading-api8680955 +Ref: 2aaf8680955 +Ref: library/_thread thread error8681672 +Ref: 2ab08681672 +Ref: library/_thread _thread error8681672 +Ref: 2ab18681672 +Ref: library/_thread thread LockType8681840 +Ref: 2ab28681840 +Ref: library/_thread _thread LockType8681840 +Ref: 2ab38681840 +Ref: library/_thread thread start_new_thread8681908 +Ref: 141a8681908 +Ref: library/_thread _thread start_new_thread8681908 +Ref: 2ab48681908 +Ref: library/_thread thread interrupt_main8682800 +Ref: 43a8682800 +Ref: library/_thread _thread interrupt_main8682800 +Ref: 2ab58682800 +Ref: library/_thread thread exit8683719 +Ref: 2ab68683719 +Ref: library/_thread _thread exit8683719 +Ref: 2ab78683719 +Ref: library/_thread thread allocate_lock8683868 +Ref: 2ab88683868 +Ref: library/_thread _thread allocate_lock8683868 +Ref: 2ab98683868 +Ref: library/_thread thread get_ident8684016 +Ref: 2aba8684016 +Ref: library/_thread _thread get_ident8684016 +Ref: 2abb8684016 +Ref: library/_thread thread get_native_id8684382 +Ref: 2abc8684382 +Ref: library/_thread _thread get_native_id8684382 +Ref: 2abd8684382 +Ref: library/_thread thread stack_size8684841 +Ref: 2abe8684841 +Ref: library/_thread _thread stack_size8684841 +Ref: 2abf8684841 +Ref: library/_thread thread TIMEOUT_MAX8686115 +Ref: 2ac08686115 +Ref: library/_thread _thread TIMEOUT_MAX8686115 +Ref: 2ac18686115 +Ref: library/_thread thread lock acquire8686395 +Ref: 2ac28686395 +Ref: library/_thread _thread lock acquire8686395 +Ref: 2ac38686395 +Ref: library/_thread thread lock release8687473 +Ref: 2ac48687473 +Ref: library/_thread _thread lock release8687473 +Ref: 2ac58687473 +Ref: library/_thread thread lock locked8687615 +Ref: 2ac68687615 +Ref: library/_thread _thread lock locked8687615 +Ref: 2ac78687615 +Node: Networking and Interprocess Communication8689012 +Ref: library/ipc doc8689177 +Ref: 2ac88689177 +Ref: library/ipc ipc8689177 +Ref: 2ac98689177 +Ref: library/ipc networking-and-interprocess-communication8689177 +Ref: 2aca8689177 +Node: asyncio — Asynchronous I/O8689974 +Ref: library/asyncio doc8690130 +Ref: 2acb8690130 +Ref: library/asyncio asyncio-asynchronous-i-o8690130 +Ref: 2acc8690130 +Ref: library/asyncio module-asyncio8690130 +Ref: 98690130 +Node: Runners8692176 +Ref: library/asyncio-runner doc8692277 +Ref: 2ad68692277 +Ref: library/asyncio-runner runners8692277 +Ref: 2ad78692277 +Ref: Runners-Footnote-18692695 +Node: Running an asyncio Program8692771 +Ref: library/asyncio-runner running-an-asyncio-program8692872 +Ref: 2ad88692872 +Ref: library/asyncio-runner asyncio run8692945 +Ref: 1d78692945 +Node: Runner context manager8694109 +Ref: library/asyncio-runner runner-context-manager8694249 +Ref: 2ad98694249 +Ref: library/asyncio-runner asyncio Runner8694314 +Ref: 1d68694314 +Ref: library/asyncio-runner asyncio Runner run8695462 +Ref: 2adb8695462 +Ref: library/asyncio-runner asyncio Runner close8695974 +Ref: 2adc8695974 +Ref: library/asyncio-runner asyncio Runner get_loop8696197 +Ref: 2add8696197 +Node: Handling Keyboard Interruption8696639 +Ref: library/asyncio-runner handling-keyboard-interruption8696744 +Ref: 2ade8696744 +Node: Coroutines and Tasks8698236 +Ref: library/asyncio-task doc8698353 +Ref: 2adf8698353 +Ref: library/asyncio-task coroutines-and-tasks8698353 +Ref: 2ae08698353 +Node: Coroutines<3>8698810 +Ref: library/asyncio-task coroutine8698899 +Ref: 2acd8698899 +Ref: library/asyncio-task coroutines8698899 +Ref: 2ae18698899 +Node: Awaitables8702052 +Ref: library/asyncio-task asyncio-awaitables8702164 +Ref: 2ae28702164 +Ref: library/asyncio-task awaitables8702164 +Ref: 2ae38702164 +Node: Creating Tasks8704729 +Ref: library/asyncio-task creating-tasks8704845 +Ref: 2ae48704845 +Ref: library/asyncio-task asyncio create_task8704894 +Ref: 1d28704894 +Node: Task Cancellation8706834 +Ref: library/asyncio-task task-cancellation8706951 +Ref: 2ae68706951 +Node: Task Groups8707767 +Ref: library/asyncio-task task-groups8707878 +Ref: 2ae78707878 +Ref: library/asyncio-task taskgroups8707878 +Ref: 2ae88707878 +Ref: library/asyncio-task asyncio TaskGroup8708045 +Ref: 1d08708045 +Ref: library/asyncio-task asyncio TaskGroup create_task8708308 +Ref: 2ae58708308 +Node: Sleeping8710916 +Ref: library/asyncio-task sleeping8711036 +Ref: 2ae98711036 +Ref: library/asyncio-task asyncio sleep8711075 +Ref: 6c28711075 +Ref: library/asyncio-task asyncio-example-sleep8711566 +Ref: 2aea8711566 +Node: Running Tasks Concurrently8712132 +Ref: library/asyncio-task running-tasks-concurrently8712268 +Ref: 2aeb8712268 +Ref: library/asyncio-task asyncio gather8712343 +Ref: 1d38712343 +Ref: library/asyncio-task asyncio-example-gather8713762 +Ref: 2aec8713762 +Node: Shielding From Cancellation8715878 +Ref: library/asyncio-task shielding-from-cancellation8716014 +Ref: 2aed8716014 +Ref: library/asyncio-task asyncio shield8716091 +Ref: 47a8716091 +Node: Timeouts8717770 +Ref: library/asyncio-task timeouts8717898 +Ref: 2aee8717898 +Ref: library/asyncio-task asyncio timeout8717937 +Ref: 1d48717937 +Ref: library/asyncio-task asyncio Timeout8719731 +Ref: 119e8719731 +Ref: library/asyncio-task asyncio Timeout when8719903 +Ref: 2af18719903 +Ref: library/asyncio-task asyncio Timeout reschedule8720203 +Ref: 2aef8720203 +Ref: library/asyncio-task asyncio Timeout expired8720705 +Ref: 2af38720705 +Ref: library/asyncio-task asyncio timeout_at8721541 +Ref: 120f8721541 +Ref: library/asyncio-task asyncio wait_for8722164 +Ref: 1d58722164 +Ref: library/asyncio-task asyncio-example-waitfor8723028 +Ref: 2af48723028 +Node: Waiting Primitives8723754 +Ref: library/asyncio-task waiting-primitives8723873 +Ref: 2af58723873 +Ref: library/asyncio-task asyncio wait8723932 +Ref: 5918723932 +Ref: library/asyncio-task asyncio as_completed8726086 +Ref: 47b8726086 +Node: Running in Threads8726916 +Ref: library/asyncio-task running-in-threads8727056 +Ref: 2af68727056 +Ref: library/asyncio-task asyncio to_thread8727115 +Ref: 5288727115 +Node: Scheduling From Other Threads8729327 +Ref: library/asyncio-task scheduling-from-other-threads8729462 +Ref: 2af78729462 +Ref: library/asyncio-task asyncio run_coroutine_threadsafe8729543 +Ref: 4a58729543 +Node: Introspection8730968 +Ref: library/asyncio-task introspection8731096 +Ref: 2af98731096 +Ref: library/asyncio-task asyncio current_task8731145 +Ref: 5a78731145 +Ref: library/asyncio-task asyncio all_tasks8731422 +Ref: 5a88731422 +Node: Task Object8731680 +Ref: library/asyncio-task task-object8731770 +Ref: 2afa8731770 +Ref: library/asyncio-task asyncio Task8731815 +Ref: 1e38731815 +Ref: library/asyncio-task asyncio Task done8733867 +Ref: 2afe8733867 +Ref: library/asyncio-task asyncio Task result8734083 +Ref: 2aff8734083 +Ref: library/asyncio-task asyncio Task exception8734571 +Ref: 2b018734571 +Ref: library/asyncio-task asyncio Task add_done_callback8735058 +Ref: 2b028735058 +Ref: library/asyncio-task asyncio Task remove_done_callback8735373 +Ref: 2b038735373 +Ref: library/asyncio-task asyncio Task get_stack8735671 +Ref: 2b058735671 +Ref: library/asyncio-task asyncio Task print_stack8736667 +Ref: 2b068736667 +Ref: library/asyncio-task asyncio Task get_coro8737159 +Ref: 61e8737159 +Ref: library/asyncio-task asyncio Task get_name8737291 +Ref: 6218737291 +Ref: library/asyncio-task asyncio Task set_name8737563 +Ref: 6208737563 +Ref: library/asyncio-task asyncio Task cancel8737897 +Ref: 12018737897 +Ref: library/asyncio-task asyncio-example-task-cancel8738799 +Ref: 2b078738799 +Ref: library/asyncio-task asyncio Task cancelled8740054 +Ref: 2afb8740054 +Ref: library/asyncio-task asyncio Task uncancel8740364 +Ref: 1e28740364 +Ref: library/asyncio-task asyncio Task cancelling8742009 +Ref: 1e18742009 +Node: Streams8742818 +Ref: library/asyncio-stream doc8742954 +Ref: 2b088742954 +Ref: library/asyncio-stream asyncio-streams8742954 +Ref: 2ace8742954 +Ref: library/asyncio-stream streams8742954 +Ref: 2b098742954 +Ref: library/asyncio-stream asyncio-example-stream8743291 +Ref: 2b0a8743291 +Ref: library/asyncio-stream asyncio open_connection8744037 +Ref: 76c8744037 +Ref: library/asyncio-stream asyncio start_server8745229 +Ref: 76d8745229 +Ref: library/asyncio-stream asyncio open_unix_connection8746639 +Ref: 2b0e8746639 +Ref: library/asyncio-stream asyncio start_unix_server8747510 +Ref: 2b108747510 +Ref: Streams-Footnote-18748453 +Node: StreamReader8748529 +Ref: library/asyncio-stream streamreader8748606 +Ref: 2b118748606 +Ref: library/asyncio-stream asyncio StreamReader8748653 +Ref: 47c8748653 +Ref: library/asyncio-stream asyncio StreamReader read8748936 +Ref: 2b128748936 +Ref: library/asyncio-stream asyncio StreamReader readline8749218 +Ref: 2b138749218 +Ref: library/asyncio-stream asyncio StreamReader readexactly8749574 +Ref: 8ec8749574 +Ref: library/asyncio-stream asyncio StreamReader readuntil8749870 +Ref: 8eb8749870 +Ref: library/asyncio-stream asyncio StreamReader at_eof8750719 +Ref: 2b168750719 +Node: StreamWriter8750842 +Ref: library/asyncio-stream streamwriter8750940 +Ref: 2b178750940 +Ref: library/asyncio-stream asyncio StreamWriter8750987 +Ref: 141f8750987 +Ref: library/asyncio-stream asyncio StreamWriter write8751269 +Ref: 2b188751269 +Ref: library/asyncio-stream asyncio StreamWriter writelines8751639 +Ref: 2b198751639 +Ref: library/asyncio-stream asyncio StreamWriter close8752032 +Ref: 2b0c8752032 +Ref: library/asyncio-stream asyncio StreamWriter can_write_eof8752289 +Ref: 2b1a8752289 +Ref: library/asyncio-stream asyncio StreamWriter write_eof8752460 +Ref: 2b1b8752460 +Ref: library/asyncio-stream asyncio StreamWriter transport8752588 +Ref: 2b1c8752588 +Ref: library/asyncio-stream asyncio StreamWriter get_extra_info8752671 +Ref: 2b1d8752671 +Ref: library/asyncio-stream asyncio StreamWriter drain8752845 +Ref: 11938752845 +Ref: library/asyncio-stream asyncio StreamWriter start_tls8753438 +Ref: 1db8753438 +Ref: library/asyncio-stream asyncio StreamWriter is_closing8754127 +Ref: 7608754127 +Ref: library/asyncio-stream asyncio StreamWriter wait_closed8754288 +Ref: 75f8754288 +Node: Examples<14>8754522 +Ref: library/asyncio-stream examples8754599 +Ref: 2b0b8754599 +Node: TCP echo client using streams8754796 +Ref: library/asyncio-stream asyncio-tcp-echo-client-streams8754912 +Ref: 2b1e8754912 +Ref: library/asyncio-stream tcp-echo-client-using-streams8754912 +Ref: 2b1f8754912 +Node: TCP echo server using streams8755664 +Ref: library/asyncio-stream asyncio-tcp-echo-server-streams8755805 +Ref: 2b218755805 +Ref: library/asyncio-stream tcp-echo-server-using-streams8755805 +Ref: 2b228755805 +Node: Get HTTP headers8756811 +Ref: library/asyncio-stream get-http-headers8756977 +Ref: 2b248756977 +Node: Register an open socket to wait for data using streams8758212 +Ref: library/asyncio-stream asyncio-example-create-connection-streams8758340 +Ref: 2b258758340 +Ref: library/asyncio-stream register-an-open-socket-to-wait-for-data-using-streams8758340 +Ref: 2b268758340 +Node: Synchronization Primitives8759729 +Ref: library/asyncio-sync doc8759857 +Ref: 2b2a8759857 +Ref: library/asyncio-sync asyncio-sync8759857 +Ref: 2ad18759857 +Ref: library/asyncio-sync synchronization-primitives8759857 +Ref: 2b2b8759857 +Ref: Synchronization Primitives-Footnote-18760936 +Node: Lock8761009 +Ref: library/asyncio-sync lock8761090 +Ref: 2b2c8761090 +Ref: library/asyncio-sync asyncio Lock8761121 +Ref: 6c38761121 +Ref: library/asyncio-sync asyncio Lock acquire8761783 +Ref: 2b2d8761783 +Ref: library/asyncio-sync asyncio Lock release8762277 +Ref: 2b2e8762277 +Ref: library/asyncio-sync asyncio Lock locked8762494 +Ref: 2b2f8762494 +Node: Event8762576 +Ref: library/asyncio-sync event8762675 +Ref: 2b308762675 +Ref: library/asyncio-sync asyncio Event8762708 +Ref: 6c48762708 +Ref: library/asyncio-sync asyncio-example-sync-event8763237 +Ref: 2b348763237 +Ref: library/asyncio-sync asyncio Event wait8763866 +Ref: 2b338763866 +Ref: library/asyncio-sync asyncio Event set8764076 +Ref: 2b318764076 +Ref: library/asyncio-sync asyncio Event clear8764216 +Ref: 2b328764216 +Ref: library/asyncio-sync asyncio Event is_set8764406 +Ref: 2b358764406 +Node: Condition8764484 +Ref: library/asyncio-sync condition8764588 +Ref: 2b368764588 +Ref: library/asyncio-sync asyncio Condition8764629 +Ref: 6c58764629 +Ref: library/asyncio-sync asyncio Condition acquire8765861 +Ref: 2b378765861 +Ref: library/asyncio-sync asyncio Condition notify8766064 +Ref: 2b388766064 +Ref: library/asyncio-sync asyncio Condition locked8766423 +Ref: 2b398766423 +Ref: library/asyncio-sync asyncio Condition notify_all8766516 +Ref: 2b3a8766516 +Ref: library/asyncio-sync asyncio Condition release8766894 +Ref: 2b3b8766894 +Ref: library/asyncio-sync asyncio Condition wait8767056 +Ref: 2b3c8767056 +Ref: library/asyncio-sync asyncio Condition wait_for8767526 +Ref: 2b3d8767526 +Node: Semaphore8767780 +Ref: library/asyncio-sync semaphore8767895 +Ref: 2b3e8767895 +Ref: library/asyncio-sync asyncio Semaphore8767936 +Ref: 6c68767936 +Ref: library/asyncio-sync asyncio Semaphore acquire8769048 +Ref: 2b3f8769048 +Ref: library/asyncio-sync asyncio Semaphore locked8769336 +Ref: 2b418769336 +Ref: library/asyncio-sync asyncio Semaphore release8769440 +Ref: 2b408769440 +Node: BoundedSemaphore8769754 +Ref: library/asyncio-sync boundedsemaphore8769867 +Ref: 2b428769867 +Ref: library/asyncio-sync asyncio BoundedSemaphore8769922 +Ref: 6c78769922 +Node: Barrier8770281 +Ref: library/asyncio-sync barrier8770376 +Ref: 2b438770376 +Ref: library/asyncio-sync asyncio Barrier8770413 +Ref: 1d88770413 +Ref: library/asyncio-sync asyncio-example-barrier8771008 +Ref: 2b458771008 +Ref: library/asyncio-sync asyncio Barrier wait8771874 +Ref: 2b448771874 +Ref: library/asyncio-sync asyncio Barrier reset8772955 +Ref: 2b468772955 +Ref: library/asyncio-sync asyncio Barrier abort8773255 +Ref: 2b478773255 +Ref: library/asyncio-sync asyncio Barrier parties8773571 +Ref: 2b488773571 +Ref: library/asyncio-sync asyncio Barrier n_waiting8773661 +Ref: 2b498773661 +Ref: library/asyncio-sync asyncio Barrier broken8773781 +Ref: 2b4a8773781 +Ref: library/asyncio-sync asyncio BrokenBarrierError8773898 +Ref: 1d98773898 +Node: Subprocesses8774368 +Ref: library/asyncio-subprocess doc8774495 +Ref: 2b4b8774495 +Ref: library/asyncio-subprocess asyncio-subprocess8774495 +Ref: 2acf8774495 +Ref: library/asyncio-subprocess subprocesses8774495 +Ref: 2b4c8774495 +Ref: library/asyncio-subprocess asyncio-example-subprocess-shell8774783 +Ref: 2b4d8774783 +Ref: Subprocesses-Footnote-18776079 +Ref: Subprocesses-Footnote-28776158 +Node: Creating Subprocesses8776242 +Ref: library/asyncio-subprocess creating-subprocesses8776333 +Ref: 2b4f8776333 +Ref: library/asyncio-subprocess asyncio create_subprocess_exec8776398 +Ref: 6c98776398 +Ref: library/asyncio-subprocess asyncio create_subprocess_shell8776998 +Ref: 6ca8776998 +Ref: Creating Subprocesses-Footnote-18778544 +Node: Constants<7>8778614 +Ref: library/asyncio-subprocess constants8778743 +Ref: 2b578778743 +Ref: library/asyncio-subprocess asyncio subprocess PIPE8778784 +Ref: 2b588778784 +Ref: library/asyncio-subprocess asyncio subprocess STDOUT8779216 +Ref: 2b5c8779216 +Ref: library/asyncio-subprocess asyncio subprocess DEVNULL8779402 +Ref: 2b5d8779402 +Node: Interacting with Subprocesses8779683 +Ref: library/asyncio-subprocess interacting-with-subprocesses8779782 +Ref: 2b5e8779782 +Ref: library/asyncio-subprocess asyncio subprocess Process8780113 +Ref: 2b508780113 +Ref: library/asyncio-subprocess asyncio subprocess Process wait8781073 +Ref: 2b608781073 +Ref: library/asyncio-subprocess asyncio subprocess Process communicate8781582 +Ref: 2b5f8781582 +Ref: library/asyncio-subprocess asyncio subprocess Process send_signal8782818 +Ref: 2b638782818 +Ref: library/asyncio-subprocess asyncio subprocess Process terminate8783210 +Ref: 2b648783210 +Ref: library/asyncio-subprocess asyncio subprocess Process kill8783499 +Ref: 2b668783499 +Ref: library/asyncio-subprocess asyncio subprocess Process stdin8783737 +Ref: 2b598783737 +Ref: library/asyncio-subprocess asyncio subprocess Process stdout8783892 +Ref: 2b5a8783892 +Ref: library/asyncio-subprocess asyncio subprocess Process stderr8784050 +Ref: 2b5b8784050 +Ref: library/asyncio-subprocess asyncio subprocess Process pid8784548 +Ref: 2b678784548 +Ref: library/asyncio-subprocess asyncio subprocess Process returncode8784781 +Ref: 2b628784781 +Node: Subprocess and Threads8785139 +Ref: library/asyncio-subprocess asyncio-subprocess-threads8785248 +Ref: 2b618785248 +Ref: library/asyncio-subprocess subprocess-and-threads8785248 +Ref: 2b688785248 +Node: Examples<15>8786117 +Ref: library/asyncio-subprocess examples8786226 +Ref: 2b4e8786226 +Ref: library/asyncio-subprocess asyncio-example-create-subprocess-exec8786410 +Ref: 2b6b8786410 +Node: Queues8787211 +Ref: library/asyncio-queue doc8787326 +Ref: 2b6d8787326 +Ref: library/asyncio-queue asyncio-queues8787326 +Ref: 2ad08787326 +Ref: library/asyncio-queue queues8787326 +Ref: 2b6e8787326 +Ref: Queues-Footnote-18788017 +Node: Queue8788091 +Ref: library/asyncio-queue queue8788162 +Ref: 2b708788162 +Ref: library/asyncio-queue asyncio Queue8788195 +Ref: 6c88788195 +Ref: library/asyncio-queue asyncio Queue maxsize8788804 +Ref: 2b738788804 +Ref: library/asyncio-queue asyncio Queue empty8788882 +Ref: 2b748788882 +Ref: library/asyncio-queue asyncio Queue full8788984 +Ref: 2b758788984 +Ref: library/asyncio-queue asyncio Queue get8789240 +Ref: 2b718789240 +Ref: library/asyncio-queue asyncio Queue get_nowait8789391 +Ref: 2b768789391 +Ref: library/asyncio-queue asyncio Queue join8789527 +Ref: a488789527 +Ref: library/asyncio-queue asyncio Queue put8790025 +Ref: 2b788790025 +Ref: library/asyncio-queue asyncio Queue put_nowait8790196 +Ref: 2b798790196 +Ref: library/asyncio-queue asyncio Queue qsize8790380 +Ref: 2b728790380 +Ref: library/asyncio-queue asyncio Queue task_done8790459 +Ref: a498790459 +Node: Priority Queue8791142 +Ref: library/asyncio-queue priority-queue8791232 +Ref: 2b7b8791232 +Ref: library/asyncio-queue asyncio PriorityQueue8791283 +Ref: 2b7c8791283 +Node: LIFO Queue8791490 +Ref: library/asyncio-queue lifo-queue8791588 +Ref: 2b7d8791588 +Ref: library/asyncio-queue asyncio LifoQueue8791631 +Ref: 2b7e8791631 +Node: Exceptions<9>8791774 +Ref: library/asyncio-queue exceptions8791870 +Ref: 2b7f8791870 +Ref: library/asyncio-queue asyncio QueueEmpty8791913 +Ref: 2b778791913 +Ref: library/asyncio-queue asyncio QueueFull8792055 +Ref: 2b7a8792055 +Node: Examples<16>8792212 +Ref: library/asyncio-queue examples8792289 +Ref: 2b6f8792289 +Ref: library/asyncio-queue asyncio-example-queue-dist8792328 +Ref: 2b808792328 +Node: Exceptions<10>8794086 +Ref: library/asyncio-exceptions doc8794199 +Ref: 2b818794199 +Ref: library/asyncio-exceptions asyncio-exceptions8794199 +Ref: 2b828794199 +Ref: library/asyncio-exceptions exceptions8794199 +Ref: 2b838794199 +Ref: library/asyncio-exceptions asyncio TimeoutError8794355 +Ref: 2af08794355 +Ref: library/asyncio-exceptions asyncio CancelledError8794602 +Ref: 61b8794602 +Ref: library/asyncio-exceptions asyncio InvalidStateError8794957 +Ref: 2b008794957 +Ref: library/asyncio-exceptions asyncio SendfileNotAvailableError8795196 +Ref: 2b848795196 +Ref: library/asyncio-exceptions asyncio IncompleteReadError8795381 +Ref: 13258795381 +Ref: library/asyncio-exceptions asyncio IncompleteReadError expected8795596 +Ref: 2b858795596 +Ref: library/asyncio-exceptions asyncio IncompleteReadError partial8795691 +Ref: 2b148795691 +Ref: library/asyncio-exceptions asyncio LimitOverrunError8795814 +Ref: 2b158795814 +Ref: library/asyncio-exceptions asyncio LimitOverrunError consumed8795976 +Ref: 2b868795976 +Ref: Exceptions<10>-Footnote-18796095 +Node: Event Loop8796174 +Ref: library/asyncio-eventloop doc8796288 +Ref: 2b878796288 +Ref: library/asyncio-eventloop asyncio-event-loop8796288 +Ref: 9f48796288 +Ref: library/asyncio-eventloop event-loop8796288 +Ref: 2b888796288 +Ref: library/asyncio-eventloop asyncio get_running_loop8797118 +Ref: 4768797118 +Ref: library/asyncio-eventloop asyncio get_event_loop8797403 +Ref: 4758797403 +Ref: library/asyncio-eventloop asyncio set_event_loop8798329 +Ref: 118f8798329 +Ref: library/asyncio-eventloop asyncio new_event_loop8798442 +Ref: 2ada8798442 +Ref: Event Loop-Footnote-18799721 +Ref: Event Loop-Footnote-28799795 +Node: Event Loop Methods8799875 +Ref: library/asyncio-eventloop asyncio-event-loop-methods8799965 +Ref: 2b908799965 +Ref: library/asyncio-eventloop event-loop-methods8799965 +Ref: 2b8a8799965 +Node: Running and stopping the loop8800548 +Ref: library/asyncio-eventloop running-and-stopping-the-loop8800661 +Ref: 2b918800661 +Ref: library/asyncio-eventloop asyncio loop run_until_complete8800742 +Ref: 8e68800742 +Ref: library/asyncio-eventloop asyncio loop run_forever8801058 +Ref: 2b928801058 +Ref: library/asyncio-eventloop asyncio loop stop8801778 +Ref: 8ed8801778 +Ref: library/asyncio-eventloop asyncio loop is_running8801831 +Ref: 2b938801831 +Ref: library/asyncio-eventloop asyncio loop is_closed8801927 +Ref: a448801927 +Ref: library/asyncio-eventloop asyncio loop close8802012 +Ref: 2b948802012 +Ref: library/asyncio-eventloop asyncio loop shutdown_asyncgens8802417 +Ref: 8ee8802417 +Ref: library/asyncio-eventloop asyncio loop shutdown_default_executor8803100 +Ref: 5268803100 +Node: Scheduling callbacks8803582 +Ref: library/asyncio-eventloop scheduling-callbacks8803732 +Ref: 2b958803732 +Ref: library/asyncio-eventloop asyncio loop call_soon8803795 +Ref: 7588803795 +Ref: library/asyncio-eventloop asyncio loop call_soon_threadsafe8804469 +Ref: 7598804469 +Ref: library/asyncio-eventloop asyncio-pass-keywords8805031 +Ref: 2b968805031 +Ref: Scheduling callbacks-Footnote-18805526 +Node: Scheduling delayed callbacks8805568 +Ref: library/asyncio-eventloop asyncio-delayed-calls8805715 +Ref: 2b978805715 +Ref: library/asyncio-eventloop scheduling-delayed-callbacks8805715 +Ref: 2b988805715 +Ref: library/asyncio-eventloop asyncio loop call_later8805948 +Ref: 75a8805948 +Ref: library/asyncio-eventloop asyncio loop call_at8807119 +Ref: 75b8807119 +Ref: library/asyncio-eventloop asyncio loop time8807879 +Ref: 2af28807879 +Ref: Scheduling delayed callbacks-Footnote-18808314 +Ref: Scheduling delayed callbacks-Footnote-28808356 +Node: Creating Futures and Tasks8808398 +Ref: library/asyncio-eventloop creating-futures-and-tasks8808552 +Ref: 2b998808552 +Ref: library/asyncio-eventloop asyncio loop create_future8808627 +Ref: 8e98808627 +Ref: library/asyncio-eventloop asyncio loop create_task8808983 +Ref: 61f8808983 +Ref: library/asyncio-eventloop asyncio loop set_task_factory8809792 +Ref: a468809792 +Ref: library/asyncio-eventloop asyncio loop get_task_factory8810281 +Ref: a478810281 +Node: Opening network connections8810391 +Ref: library/asyncio-eventloop opening-network-connections8810541 +Ref: 2b9a8810541 +Ref: library/asyncio-eventloop asyncio loop create_connection8810618 +Ref: 1da8810618 +Ref: library/asyncio-eventloop asyncio loop create_datagram_endpoint8816958 +Ref: 2fb8816958 +Ref: library/asyncio-eventloop asyncio loop create_unix_connection8820578 +Ref: 2b0f8820578 +Ref: Opening network connections-Footnote-18821636 +Ref: Opening network connections-Footnote-28821695 +Node: Creating network servers8821754 +Ref: library/asyncio-eventloop creating-network-servers8821896 +Ref: 2ba28821896 +Ref: library/asyncio-eventloop asyncio loop create_server8821967 +Ref: 7668821967 +Ref: library/asyncio-eventloop asyncio loop create_unix_server8826429 +Ref: 7678826429 +Ref: library/asyncio-eventloop asyncio loop connect_accepted_socket8827386 +Ref: 76e8827386 +Node: Transferring files8828948 +Ref: library/asyncio-eventloop transferring-files8829074 +Ref: 2ba38829074 +Ref: library/asyncio-eventloop asyncio loop sendfile8829133 +Ref: 2ba48829133 +Node: TLS Upgrade8830191 +Ref: library/asyncio-eventloop tls-upgrade8830318 +Ref: 2ba58830318 +Ref: library/asyncio-eventloop asyncio loop start_tls8830363 +Ref: 75d8830363 +Node: Watching file descriptors8831888 +Ref: library/asyncio-eventloop watching-file-descriptors8832033 +Ref: 2ba68832033 +Ref: library/asyncio-eventloop asyncio loop add_reader8832106 +Ref: 2b298832106 +Ref: library/asyncio-eventloop asyncio loop remove_reader8832324 +Ref: 2ba78832324 +Ref: library/asyncio-eventloop asyncio loop add_writer8832431 +Ref: 2ba88832431 +Ref: library/asyncio-eventloop asyncio loop remove_writer8832751 +Ref: 2ba98832751 +Node: Working with socket objects directly8832946 +Ref: library/asyncio-eventloop working-with-socket-objects-directly8833083 +Ref: 2bab8833083 +Ref: library/asyncio-eventloop asyncio loop sock_recv8833534 +Ref: 87b8833534 +Ref: library/asyncio-eventloop asyncio loop sock_recv_into8834003 +Ref: 75e8834003 +Ref: library/asyncio-eventloop asyncio loop sock_recvfrom8834310 +Ref: 1dd8834310 +Ref: library/asyncio-eventloop asyncio loop sock_recvfrom_into8834613 +Ref: 1de8834613 +Ref: library/asyncio-eventloop asyncio loop sock_sendall8834952 +Ref: 87c8834952 +Ref: library/asyncio-eventloop asyncio loop sock_sendto8835708 +Ref: 1dc8835708 +Ref: library/asyncio-eventloop asyncio loop sock_connect8835986 +Ref: a4a8835986 +Ref: library/asyncio-eventloop asyncio loop sock_accept8836607 +Ref: 87d8836607 +Ref: library/asyncio-eventloop asyncio loop sock_sendfile8837431 +Ref: 7618837431 +Node: DNS8838632 +Ref: library/asyncio-eventloop dns8838762 +Ref: 2bac8838762 +Ref: library/asyncio-eventloop asyncio loop getaddrinfo8838791 +Ref: 87e8838791 +Ref: library/asyncio-eventloop asyncio loop getnameinfo8838957 +Ref: 87f8838957 +Node: Working with pipes8839341 +Ref: library/asyncio-eventloop working-with-pipes8839447 +Ref: 2bae8839447 +Ref: library/asyncio-eventloop asyncio loop connect_read_pipe8839506 +Ref: 2b538839506 +Ref: library/asyncio-eventloop asyncio loop connect_write_pipe8840080 +Ref: 2b548840080 +Node: Unix signals8840916 +Ref: library/asyncio-eventloop unix-signals8841060 +Ref: 2bb18841060 +Ref: library/asyncio-eventloop asyncio loop add_signal_handler8841107 +Ref: 2ad38841107 +Ref: library/asyncio-eventloop asyncio loop remove_signal_handler8841895 +Ref: 2bb28841895 +Node: Executing code in thread or process pools8842200 +Ref: library/asyncio-eventloop executing-code-in-thread-or-process-pools8842344 +Ref: 2bb38842344 +Ref: library/asyncio-eventloop asyncio loop run_in_executor8842449 +Ref: 5298842449 +Ref: library/asyncio-eventloop asyncio loop set_default_executor8844897 +Ref: 3128844897 +Node: Error Handling API8845207 +Ref: library/asyncio-eventloop error-handling-api8845358 +Ref: 2bb48845358 +Ref: library/asyncio-eventloop asyncio loop set_exception_handler8845483 +Ref: 2bb58845483 +Ref: library/asyncio-eventloop asyncio loop get_exception_handler8846011 +Ref: 8ea8846011 +Ref: library/asyncio-eventloop asyncio loop default_exception_handler8846185 +Ref: 2bb78846185 +Ref: library/asyncio-eventloop asyncio loop call_exception_handler8846560 +Ref: 2bb68846560 +Node: Enabling debug mode8847623 +Ref: library/asyncio-eventloop enabling-debug-mode8847753 +Ref: 2bb88847753 +Ref: library/asyncio-eventloop asyncio loop get_debug8847814 +Ref: a438847814 +Ref: library/asyncio-eventloop asyncio loop set_debug8848069 +Ref: a428848069 +Node: Running Subprocesses8848342 +Ref: library/asyncio-eventloop running-subprocesses8848445 +Ref: 2bb98848445 +Ref: library/asyncio-eventloop asyncio loop subprocess_exec8848971 +Ref: 2ad28848971 +Ref: library/asyncio-eventloop asyncio loop subprocess_shell8852963 +Ref: 2b518852963 +Ref: Running Subprocesses-Footnote-18854283 +Node: Callback Handles8854353 +Ref: library/asyncio-eventloop callback-handles8854466 +Ref: 2b8b8854466 +Ref: library/asyncio-eventloop asyncio Handle8854521 +Ref: 14e48854521 +Ref: library/asyncio-eventloop asyncio Handle cancel8854666 +Ref: 2bbc8854666 +Ref: library/asyncio-eventloop asyncio Handle cancelled8854819 +Ref: 76f8854819 +Ref: library/asyncio-eventloop asyncio TimerHandle8854941 +Ref: 2b8c8854941 +Ref: library/asyncio-eventloop asyncio TimerHandle when8855137 +Ref: 76b8855137 +Node: Server Objects8855382 +Ref: library/asyncio-eventloop server-objects8855503 +Ref: 2b8d8855503 +Ref: library/asyncio-eventloop asyncio Server8855771 +Ref: 7658855771 +Ref: library/asyncio-eventloop asyncio Server close8856334 +Ref: 2b0d8856334 +Ref: library/asyncio-eventloop asyncio Server get_loop8856726 +Ref: 7648856726 +Ref: library/asyncio-eventloop asyncio Server start_serving8856855 +Ref: 7688856855 +Ref: library/asyncio-eventloop asyncio Server serve_forever8857473 +Ref: 7698857473 +Ref: library/asyncio-eventloop asyncio Server is_serving8858370 +Ref: 76a8858370 +Ref: library/asyncio-eventloop asyncio Server wait_closed8858506 +Ref: 2bbd8858506 +Ref: library/asyncio-eventloop asyncio Server sockets8858614 +Ref: 8808858614 +Ref: library/asyncio-eventloop asyncio-event-loops8858930 +Ref: 2bbe8858930 +Node: Event Loop Implementations8858930 +Ref: library/asyncio-eventloop asyncio-event-loop-implementations8859047 +Ref: 2bbf8859047 +Ref: library/asyncio-eventloop event-loop-implementations8859047 +Ref: 2b8e8859047 +Ref: library/asyncio-eventloop asyncio SelectorEventLoop8859373 +Ref: 1df8859373 +Ref: library/asyncio-eventloop asyncio ProactorEventLoop8860012 +Ref: 1e08860012 +Ref: library/asyncio-eventloop asyncio AbstractEventLoop8860251 +Ref: 5b18860251 +Ref: Event Loop Implementations-Footnote-18860547 +Node: Examples<17>8860633 +Ref: library/asyncio-eventloop examples8860727 +Ref: 2b8f8860727 +Node: Hello World with call_soon8861326 +Ref: library/asyncio-eventloop asyncio-example-lowlevel-helloworld8861450 +Ref: 2bc08861450 +Ref: library/asyncio-eventloop hello-world-with-call-soon8861450 +Ref: 2bc18861450 +Node: Display the current date with call_later8862224 +Ref: library/asyncio-eventloop asyncio-example-call-later8862396 +Ref: 2bc28862396 +Ref: library/asyncio-eventloop display-the-current-date-with-call-later8862396 +Ref: 2bc38862396 +Node: Watch a file descriptor for read events8863388 +Ref: library/asyncio-eventloop asyncio-example-watch-fd8863576 +Ref: 2b288863576 +Ref: library/asyncio-eventloop watch-a-file-descriptor-for-read-events8863576 +Ref: 2bc48863576 +Node: Set signal handlers for SIGINT and SIGTERM8864896 +Ref: library/asyncio-eventloop asyncio-example-unix-signals8865035 +Ref: 2bc58865035 +Ref: library/asyncio-eventloop set-signal-handlers-for-sigint-and-sigterm8865035 +Ref: 2bc68865035 +Node: Futures8865950 +Ref: library/asyncio-future doc8866074 +Ref: 2bc78866074 +Ref: library/asyncio-future asyncio-futures8866074 +Ref: 2ad58866074 +Ref: library/asyncio-future futures8866074 +Ref: 2bc88866074 +Ref: Futures-Footnote-18866441 +Ref: Futures-Footnote-28866517 +Node: Future Functions8866598 +Ref: library/asyncio-future future-functions8866680 +Ref: 2bc98866680 +Ref: library/asyncio-future asyncio isfuture8866735 +Ref: 2bca8866735 +Ref: library/asyncio-future asyncio ensure_future8867041 +Ref: 4788867041 +Ref: library/asyncio-future asyncio wrap_future8868258 +Ref: 4798868258 +Node: Future Object8868601 +Ref: library/asyncio-future future-object8868683 +Ref: 2bcb8868683 +Ref: library/asyncio-future asyncio Future8868732 +Ref: 4778868732 +Ref: library/asyncio-future asyncio Future result8869859 +Ref: 2bcc8869859 +Ref: library/asyncio-future asyncio Future set_result8870474 +Ref: 2afc8870474 +Ref: library/asyncio-future asyncio Future set_exception8870669 +Ref: 2afd8870669 +Ref: library/asyncio-future asyncio Future done8870872 +Ref: 2bcd8870872 +Ref: library/asyncio-future asyncio Future cancelled8871136 +Ref: 2bce8871136 +Ref: library/asyncio-future asyncio Future add_done_callback8871441 +Ref: 75c8871441 +Ref: library/asyncio-future asyncio Future remove_done_callback8872430 +Ref: 2b048872430 +Ref: library/asyncio-future asyncio Future cancel8872662 +Ref: 12008872662 +Ref: library/asyncio-future asyncio Future exception8873015 +Ref: 2bcf8873015 +Ref: library/asyncio-future asyncio Future get_loop8873459 +Ref: 7638873459 +Ref: library/asyncio-future asyncio-example-future8873584 +Ref: 2bd08873584 +Ref: Future Object-Footnote-18875767 +Node: Transports and Protocols8875809 +Ref: library/asyncio-protocol doc8875931 +Ref: 2bd18875931 +Ref: library/asyncio-protocol asyncio-transports-protocols8875931 +Ref: 2ad48875931 +Ref: library/asyncio-protocol transports-and-protocols8875931 +Ref: 2bd28875931 +Node: Transports8878298 +Ref: library/asyncio-protocol asyncio-transport8878387 +Ref: 2b9c8878387 +Ref: library/asyncio-protocol transports8878387 +Ref: 2bd38878387 +Ref: Transports-Footnote-18879129 +Node: Transports Hierarchy8879208 +Ref: library/asyncio-protocol transports-hierarchy8879298 +Ref: 2bda8879298 +Ref: library/asyncio-protocol asyncio BaseTransport8879361 +Ref: 2bd58879361 +Ref: library/asyncio-protocol asyncio WriteTransport8879490 +Ref: 2bb08879490 +Ref: library/asyncio-protocol asyncio ReadTransport8879821 +Ref: 2baf8879821 +Ref: library/asyncio-protocol asyncio Transport8880148 +Ref: 2bd68880148 +Ref: library/asyncio-protocol asyncio DatagramTransport8880751 +Ref: 12328880751 +Ref: library/asyncio-protocol asyncio SubprocessTransport8880994 +Ref: 2bbb8880994 +Node: Base Transport8881320 +Ref: library/asyncio-protocol base-transport8881439 +Ref: 2bdb8881439 +Ref: library/asyncio-protocol asyncio BaseTransport close8881490 +Ref: 2b9f8881490 +Ref: library/asyncio-protocol asyncio BaseTransport is_closing8881861 +Ref: 8e88881861 +Ref: library/asyncio-protocol asyncio BaseTransport get_extra_info8881968 +Ref: 6f68881968 +Ref: library/asyncio-protocol asyncio BaseTransport set_protocol8884125 +Ref: 2be08884125 +Ref: library/asyncio-protocol asyncio BaseTransport get_protocol8884310 +Ref: 2be18884310 +Node: Read-only Transports8884388 +Ref: library/asyncio-protocol read-only-transports8884508 +Ref: 2be28884508 +Ref: library/asyncio-protocol asyncio ReadTransport is_reading8884571 +Ref: 7708884571 +Ref: library/asyncio-protocol asyncio ReadTransport pause_reading8884702 +Ref: 7728884702 +Ref: library/asyncio-protocol asyncio ReadTransport resume_reading8885071 +Ref: 7718885071 +Node: Write-only Transports8885409 +Ref: library/asyncio-protocol write-only-transports8885534 +Ref: 2be48885534 +Ref: library/asyncio-protocol asyncio WriteTransport abort8885599 +Ref: 2be58885599 +Ref: library/asyncio-protocol asyncio WriteTransport can_write_eof8885938 +Ref: 2be68885938 +Ref: library/asyncio-protocol asyncio WriteTransport get_write_buffer_size8886095 +Ref: 2be88886095 +Ref: library/asyncio-protocol asyncio WriteTransport get_write_buffer_limits8886222 +Ref: a458886222 +Ref: library/asyncio-protocol asyncio WriteTransport set_write_buffer_limits8886536 +Ref: 2be98886536 +Ref: library/asyncio-protocol asyncio WriteTransport write8887948 +Ref: 2bec8887948 +Ref: library/asyncio-protocol asyncio WriteTransport writelines8888147 +Ref: 2bed8888147 +Ref: library/asyncio-protocol asyncio WriteTransport write_eof8888431 +Ref: 2be78888431 +Node: Datagram Transports8888720 +Ref: library/asyncio-protocol datagram-transports8888846 +Ref: 2bee8888846 +Ref: library/asyncio-protocol asyncio DatagramTransport sendto8888907 +Ref: 2bef8888907 +Ref: library/asyncio-protocol asyncio DatagramTransport abort8889285 +Ref: 2bf08889285 +Node: Subprocess Transports8889627 +Ref: library/asyncio-protocol asyncio-subprocess-transports8889723 +Ref: 2b558889723 +Ref: library/asyncio-protocol subprocess-transports8889723 +Ref: 2bf18889723 +Ref: library/asyncio-protocol asyncio SubprocessTransport get_pid8889788 +Ref: 2bf28889788 +Ref: library/asyncio-protocol asyncio SubprocessTransport get_pipe_transport8889886 +Ref: 2bf38889886 +Ref: library/asyncio-protocol asyncio SubprocessTransport get_returncode8890632 +Ref: 2bf48890632 +Ref: library/asyncio-protocol asyncio SubprocessTransport kill8890868 +Ref: 2bf58890868 +Ref: library/asyncio-protocol asyncio SubprocessTransport send_signal8891129 +Ref: 2bf78891129 +Ref: library/asyncio-protocol asyncio SubprocessTransport terminate8891288 +Ref: 2bf68891288 +Ref: library/asyncio-protocol asyncio SubprocessTransport close8891588 +Ref: 2bf88891588 +Node: Protocols8891814 +Ref: library/asyncio-protocol asyncio-protocol8891924 +Ref: 2b9b8891924 +Ref: library/asyncio-protocol protocols8891924 +Ref: 2bd48891924 +Ref: Protocols-Footnote-18892717 +Node: Base Protocols8892795 +Ref: library/asyncio-protocol base-protocols8892877 +Ref: 2bf98892877 +Ref: library/asyncio-protocol asyncio BaseProtocol8892928 +Ref: 2bd78892928 +Ref: library/asyncio-protocol asyncio Protocol8893020 +Ref: 2bd88893020 +Ref: library/asyncio-protocol asyncio BufferedProtocol8893153 +Ref: 6f78893153 +Ref: library/asyncio-protocol asyncio DatagramProtocol8893309 +Ref: 2988893309 +Ref: library/asyncio-protocol asyncio SubprocessProtocol8893425 +Ref: 2bba8893425 +Node: Base Protocol8893591 +Ref: library/asyncio-protocol base-protocol8893701 +Ref: 2bfa8893701 +Ref: library/asyncio-protocol asyncio BaseProtocol connection_made8894024 +Ref: 2b9d8894024 +Ref: library/asyncio-protocol asyncio BaseProtocol connection_lost8894278 +Ref: 2bdc8894278 +Ref: library/asyncio-protocol asyncio BaseProtocol pause_writing8894821 +Ref: 2bea8894821 +Ref: library/asyncio-protocol asyncio BaseProtocol resume_writing8894937 +Ref: 2beb8894937 +Node: Streaming Protocols8895401 +Ref: library/asyncio-protocol streaming-protocols8895525 +Ref: 2bfb8895525 +Ref: library/asyncio-protocol asyncio Protocol data_received8895935 +Ref: 2be38895935 +Ref: library/asyncio-protocol asyncio Protocol eof_received8896616 +Ref: 2bfc8896616 +Node: Buffered Streaming Protocols8897480 +Ref: library/asyncio-protocol buffered-streaming-protocols8897609 +Ref: 2bfd8897609 +Ref: library/asyncio-protocol asyncio BufferedProtocol get_buffer8898300 +Ref: 2bfe8898300 +Ref: library/asyncio-protocol asyncio BufferedProtocol buffer_updated8898774 +Ref: 2bff8898774 +Ref: library/asyncio-protocol asyncio BufferedProtocol eof_received8898975 +Ref: 2c008898975 +Node: Datagram Protocols8899547 +Ref: library/asyncio-protocol datagram-protocols8899677 +Ref: 2c018899677 +Ref: library/asyncio-protocol asyncio DatagramProtocol datagram_received8899875 +Ref: 2c028899875 +Ref: library/asyncio-protocol asyncio DatagramProtocol error_received8900140 +Ref: 2c038900140 +Node: Subprocess Protocols8901075 +Ref: library/asyncio-protocol asyncio-subprocess-protocols8901168 +Ref: 2b568901168 +Ref: library/asyncio-protocol subprocess-protocols8901168 +Ref: 2c048901168 +Ref: library/asyncio-protocol asyncio SubprocessProtocol pipe_data_received8901406 +Ref: 2c058901406 +Ref: library/asyncio-protocol asyncio SubprocessProtocol pipe_connection_lost8901679 +Ref: 2c068901679 +Ref: library/asyncio-protocol asyncio SubprocessProtocol process_exited8901889 +Ref: 2c078901889 +Node: Examples<18>8901987 +Ref: library/asyncio-protocol examples8902078 +Ref: 2bd98902078 +Node: TCP Echo Server8902333 +Ref: library/asyncio-protocol asyncio-example-tcp-echo-server-protocol8902421 +Ref: 2b238902421 +Ref: library/asyncio-protocol tcp-echo-server8902421 +Ref: 2c088902421 +Node: TCP Echo Client8903705 +Ref: library/asyncio-protocol asyncio-example-tcp-echo-client-protocol8903817 +Ref: 2b208903817 +Ref: library/asyncio-protocol tcp-echo-client8903817 +Ref: 2c098903817 +Node: UDP Echo Server8905375 +Ref: library/asyncio-protocol asyncio-udp-echo-server-protocol8905487 +Ref: 2ba18905487 +Ref: library/asyncio-protocol udp-echo-server8905487 +Ref: 2c0a8905487 +Node: UDP Echo Client8906633 +Ref: library/asyncio-protocol asyncio-udp-echo-client-protocol8906757 +Ref: 2ba08906757 +Ref: library/asyncio-protocol udp-echo-client8906757 +Ref: 2c0b8906757 +Node: Connecting Existing Sockets8908289 +Ref: library/asyncio-protocol asyncio-example-create-connection8908441 +Ref: 2b278908441 +Ref: library/asyncio-protocol connecting-existing-sockets8908441 +Ref: 2c0c8908441 +Node: loop subprocess_exec and SubprocessProtocol8910353 +Ref: library/asyncio-protocol asyncio-example-subprocess-proto8910481 +Ref: 2b6c8910481 +Ref: library/asyncio-protocol loop-subprocess-exec-and-subprocessprotocol8910481 +Ref: 2c0d8910481 +Node: Policies8912282 +Ref: library/asyncio-policy doc8912413 +Ref: 2c0e8912413 +Ref: library/asyncio-policy asyncio-policies8912413 +Ref: 2b898912413 +Ref: library/asyncio-policy policies8912413 +Ref: 2c0f8912413 +Node: Getting and Setting the Policy8913362 +Ref: library/asyncio-policy asyncio-policy-get-set8913460 +Ref: 2c108913460 +Ref: library/asyncio-policy getting-and-setting-the-policy8913460 +Ref: 2c158913460 +Ref: library/asyncio-policy asyncio get_event_loop_policy8913633 +Ref: 2c168913633 +Ref: library/asyncio-policy asyncio set_event_loop_policy8913727 +Ref: 2c178913727 +Node: Policy Objects8913908 +Ref: library/asyncio-policy asyncio-policy-objects8914031 +Ref: 2c138914031 +Ref: library/asyncio-policy policy-objects8914031 +Ref: 2c188914031 +Ref: library/asyncio-policy asyncio AbstractEventLoopPolicy8914150 +Ref: 2c148914150 +Ref: library/asyncio-policy asyncio AbstractEventLoopPolicy get_event_loop8914245 +Ref: 2c198914245 +Ref: library/asyncio-policy asyncio AbstractEventLoopPolicy set_event_loop8914533 +Ref: 2c1a8914533 +Ref: library/asyncio-policy asyncio AbstractEventLoopPolicy new_event_loop8914638 +Ref: 2c1b8914638 +Ref: library/asyncio-policy asyncio AbstractEventLoopPolicy get_child_watcher8914783 +Ref: 2c1c8914783 +Ref: library/asyncio-policy asyncio AbstractEventLoopPolicy set_child_watcher8915019 +Ref: 2c1e8915019 +Ref: library/asyncio-policy asyncio-policy-builtin8915170 +Ref: 2c118915170 +Ref: library/asyncio-policy asyncio DefaultEventLoopPolicy8915223 +Ref: 2c1f8915223 +Ref: library/asyncio-policy asyncio WindowsSelectorEventLoopPolicy8915628 +Ref: 2c208915628 +Ref: library/asyncio-policy asyncio WindowsProactorEventLoopPolicy8915836 +Ref: 2c218915836 +Node: Process Watchers8916044 +Ref: library/asyncio-policy asyncio-watchers8916152 +Ref: 2b698916152 +Ref: library/asyncio-policy process-watchers8916152 +Ref: 2c228916152 +Ref: library/asyncio-policy asyncio get_child_watcher8917025 +Ref: 2c268917025 +Ref: library/asyncio-policy asyncio set_child_watcher8917132 +Ref: 2c278917132 +Ref: library/asyncio-policy asyncio AbstractChildWatcher8917564 +Ref: 2c1d8917564 +Ref: library/asyncio-policy asyncio AbstractChildWatcher add_child_handler8917605 +Ref: 2c288917605 +Ref: library/asyncio-policy asyncio AbstractChildWatcher remove_child_handler8917998 +Ref: 2c298917998 +Ref: library/asyncio-policy asyncio AbstractChildWatcher attach_loop8918249 +Ref: 11908918249 +Ref: library/asyncio-policy asyncio AbstractChildWatcher is_active8918513 +Ref: 2c2a8918513 +Ref: library/asyncio-policy asyncio AbstractChildWatcher close8918749 +Ref: 2c2b8918749 +Ref: library/asyncio-policy asyncio ThreadedChildWatcher8918908 +Ref: 2b6a8918908 +Ref: library/asyncio-policy asyncio MultiLoopChildWatcher8919378 +Ref: 2c238919378 +Ref: library/asyncio-policy asyncio SafeChildWatcher8920037 +Ref: 2c248920037 +Ref: library/asyncio-policy asyncio FastChildWatcher8920626 +Ref: 2c258920626 +Ref: library/asyncio-policy asyncio PidfdChildWatcher8921094 +Ref: 5278921094 +Node: Custom Policies8921691 +Ref: library/asyncio-policy asyncio-custom-policies8921776 +Ref: 2c128921776 +Ref: library/asyncio-policy custom-policies8921776 +Ref: 2c2c8921776 +Node: Platform Support8922385 +Ref: library/asyncio-platforms doc8922501 +Ref: 2c2d8922501 +Ref: library/asyncio-platforms asyncio-platform-support8922501 +Ref: 2baa8922501 +Ref: library/asyncio-platforms platform-support8922501 +Ref: 2c2e8922501 +Node: All Platforms8922813 +Ref: library/asyncio-platforms all-platforms8922899 +Ref: 2c2f8922899 +Node: Windows<61>8923063 +Ref: library/asyncio-platforms windows8923167 +Ref: 2c308923167 +Ref: Windows<61>-Footnote-18925012 +Ref: Windows<61>-Footnote-28925096 +Ref: Windows<61>-Footnote-38925179 +Ref: Windows<61>-Footnote-48925261 +Node: Subprocess Support on Windows8925326 +Ref: library/asyncio-platforms asyncio-windows-subprocess8925403 +Ref: 2b528925403 +Ref: library/asyncio-platforms subprocess-support-on-windows8925403 +Ref: 2c328925403 +Node: macOS<33>8925785 +Ref: library/asyncio-platforms macos8925867 +Ref: 2c338925867 +Node: Extending8926498 +Ref: library/asyncio-extending doc8926626 +Ref: 2c358926626 +Ref: library/asyncio-extending extending8926626 +Ref: 2c368926626 +Node: Writing a Custom Event Loop8927106 +Ref: library/asyncio-extending writing-a-custom-event-loop8927224 +Ref: 2c378927224 +Node: Future and Task private constructors8927943 +Ref: library/asyncio-extending future-and-task-private-constructors8928091 +Ref: 2c388928091 +Ref: library/asyncio-extending asyncio Future __init__8928655 +Ref: 2c398928655 +Ref: library/asyncio-extending asyncio Task __init__8928789 +Ref: 2c3a8928789 +Node: Task lifetime support8929099 +Ref: library/asyncio-extending task-lifetime-support8929211 +Ref: 2c3b8929211 +Ref: library/asyncio-extending asyncio _register_task8929441 +Ref: 2c3c8929441 +Ref: library/asyncio-extending asyncio _unregister_task8929588 +Ref: 2c3d8929588 +Ref: library/asyncio-extending asyncio _enter_task8929765 +Ref: 2c3e8929765 +Ref: library/asyncio-extending asyncio _leave_task8930024 +Ref: 2c3f8930024 +Node: High-level API Index8930249 +Ref: library/asyncio-api-index doc8930380 +Ref: 49b8930380 +Ref: library/asyncio-api-index high-level-api-index8930380 +Ref: 2c408930380 +Node: Tasks8930658 +Ref: library/asyncio-api-index tasks8930738 +Ref: 2c418930738 +Node: Queues<2>8934878 +Ref: library/asyncio-api-index queues8934982 +Ref: 2c428934982 +Node: Subprocesses<2>8935801 +Ref: library/asyncio-api-index subprocesses8935910 +Ref: 2c438935910 +Node: Streams<2>8936472 +Ref: library/asyncio-api-index streams8936587 +Ref: 2c448936587 +Node: Synchronization8938022 +Ref: library/asyncio-api-index synchronization8938136 +Ref: 2c458938136 +Node: Exceptions<11>8939499 +Ref: library/asyncio-api-index exceptions8939594 +Ref: 2c468939594 +Node: Low-level API Index8940345 +Ref: library/asyncio-llapi-index doc8940490 +Ref: 2c478940490 +Ref: library/asyncio-llapi-index low-level-api-index8940490 +Ref: 2c488940490 +Node: Obtaining the Event Loop8940762 +Ref: library/asyncio-llapi-index obtaining-the-event-loop8940872 +Ref: 2c498940872 +Node: Event Loop Methods<2>8941985 +Ref: library/asyncio-llapi-index event-loop-methods8942117 +Ref: 2c4a8942117 +Node: Transports<2>8954445 +Ref: library/asyncio-llapi-index transports8954565 +Ref: 2c4b8954565 +Node: Protocols<2>8960610 +Ref: library/asyncio-llapi-index protocols8960728 +Ref: 2c4c8960728 +Node: Event Loop Policies8964251 +Ref: library/asyncio-llapi-index event-loop-policies8964347 +Ref: 2c4d8964347 +Node: Developing with asyncio8965176 +Ref: library/asyncio-dev doc8965292 +Ref: 2c4e8965292 +Ref: library/asyncio-dev asyncio-dev8965292 +Ref: 2c4f8965292 +Ref: library/asyncio-dev developing-with-asyncio8965292 +Ref: 2c508965292 +Node: Debug Mode8965703 +Ref: library/asyncio-dev asyncio-debug-mode8965812 +Ref: 17908965812 +Ref: library/asyncio-dev debug-mode8965812 +Ref: 2c518965812 +Node: Concurrency and Multithreading8967433 +Ref: library/asyncio-dev asyncio-multithreading8967572 +Ref: 2af88967572 +Ref: library/asyncio-dev concurrency-and-multithreading8967572 +Ref: 2c548967572 +Node: Running Blocking Code8969883 +Ref: library/asyncio-dev asyncio-handle-blocking8970022 +Ref: 2c558970022 +Ref: library/asyncio-dev running-blocking-code8970022 +Ref: 2c568970022 +Node: Logging<3>8970516 +Ref: library/asyncio-dev asyncio-logger8970656 +Ref: 2c528970656 +Ref: library/asyncio-dev logging8970656 +Ref: 2c578970656 +Node: Detect never-awaited coroutines8971066 +Ref: library/asyncio-dev asyncio-coroutine-not-scheduled8971218 +Ref: 2c538971218 +Ref: library/asyncio-dev detect-never-awaited-coroutines8971218 +Ref: 2c588971218 +Node: Detect never-retrieved exceptions8972227 +Ref: library/asyncio-dev detect-never-retrieved-exceptions8972360 +Ref: 2c598972360 +Ref: Detect never-retrieved exceptions-Footnote-18973970 +Node: socket — Low-level networking interface8974035 +Ref: library/socket doc8974242 +Ref: 2c5a8974242 +Ref: library/socket module-socket8974242 +Ref: ec8974242 +Ref: library/socket socket-low-level-networking-interface8974242 +Ref: 2c5b8974242 +Ref: socket — Low-level networking interface-Footnote-18975786 +Node: Socket families8975852 +Ref: library/socket socket-families8975969 +Ref: 2c5c8975969 +Ref: library/socket host-port8977165 +Ref: 2c5d8977165 +Ref: Socket families-Footnote-18986298 +Node: Module contents8986340 +Ref: library/socket module-contents8986480 +Ref: 2c638986480 +Node: Exceptions<12>8986687 +Ref: library/socket exceptions8986774 +Ref: 2c648986774 +Ref: library/socket socket error8986815 +Ref: d058986815 +Ref: library/socket socket herror8987002 +Ref: 2c658987002 +Ref: library/socket socket gaierror8987627 +Ref: 2c668987627 +Ref: library/socket socket timeout8988232 +Ref: 4288988232 +Ref: Exceptions<12>-Footnote-18988873 +Node: Constants<8>8988915 +Ref: library/socket constants8989023 +Ref: 2c688989023 +Ref: library/socket socket AF_UNIX8989211 +Ref: 12078989211 +Ref: library/socket socket AF_INET8989236 +Ref: 12058989236 +Ref: library/socket socket AF_INET68989261 +Ref: 12068989261 +Ref: library/socket socket SOCK_STREAM8989565 +Ref: f9a8989565 +Ref: library/socket socket SOCK_DGRAM8989594 +Ref: f998989594 +Ref: library/socket socket SOCK_RAW8989622 +Ref: 2c698989622 +Ref: library/socket socket SOCK_RDM8989648 +Ref: 2c6a8989648 +Ref: library/socket socket SOCK_SEQPACKET8989674 +Ref: 2c6b8989674 +Ref: library/socket socket SOCK_CLOEXEC8989968 +Ref: 8758989968 +Ref: library/socket socket SOCK_NONBLOCK8989998 +Ref: 8748989998 +Ref: library/socket socket SOMAXCONN8990428 +Ref: ae88990428 +Ref: library/socket socket AF_CAN8991909 +Ref: 2c5e8991909 +Ref: library/socket socket PF_CAN8991933 +Ref: 2c6c8991933 +Ref: library/socket socket CAN_BCM8992262 +Ref: c418992262 +Ref: library/socket socket CAN_RAW_FD_FRAMES8992685 +Ref: b588992685 +Ref: library/socket socket CAN_RAW_JOIN_FILTERS8993099 +Ref: 5798993099 +Ref: library/socket socket CAN_ISOTP8993399 +Ref: 2c5f8993399 +Ref: library/socket socket CAN_J19398993649 +Ref: 57a8993649 +Ref: library/socket socket AF_PACKET8993883 +Ref: 2c608993883 +Ref: library/socket socket PF_PACKET8993910 +Ref: 2c6d8993910 +Ref: library/socket socket AF_RDS8994125 +Ref: 2c6e8994125 +Ref: library/socket socket PF_RDS8994149 +Ref: 2c6f8994149 +Ref: library/socket socket SOL_RDS8994173 +Ref: 2c708994173 +Ref: library/socket socket SIO_RCVALL8994412 +Ref: 2c718994412 +Ref: library/socket socket SIO_KEEPALIVE_VALS8994440 +Ref: 2c728994440 +Ref: library/socket socket SIO_LOOPBACK_FAST_PATH8994476 +Ref: 9428994476 +Ref: library/socket socket AF_ALG8994895 +Ref: 9458994895 +Ref: library/socket socket SOL_ALG8994919 +Ref: 2c738994919 +Ref: library/socket socket AF_VSOCK8995085 +Ref: 7d48995085 +Ref: library/socket socket IOCTL_VM_SOCKETS_GET_LOCAL_CID8995111 +Ref: 2c748995111 +Ref: library/socket socket AF_LINK8995322 +Ref: c428995322 +Ref: library/socket socket has_ipv68995419 +Ref: 2c758995419 +Ref: library/socket socket BDADDR_ANY8995551 +Ref: 2c768995551 +Ref: library/socket socket BDADDR_LOCAL8995579 +Ref: 2c778995579 +Ref: library/socket socket HCI_FILTER8995848 +Ref: 2c788995848 +Ref: library/socket socket HCI_TIME_STAMP8995876 +Ref: 2c798995876 +Ref: library/socket socket HCI_DATA_DIR8995908 +Ref: 2c7a8995908 +Ref: library/socket socket AF_QIPCRTR8996176 +Ref: 2c618996176 +Ref: library/socket socket SCM_CREDS28996372 +Ref: 2c7b8996372 +Ref: library/socket socket LOCAL_CREDS8996400 +Ref: 2c7c8996400 +Ref: library/socket socket LOCAL_CREDS_PERSISTENT8996429 +Ref: 2c7d8996429 +Ref: library/socket socket SO_INCOMING_CPU8996865 +Ref: 2c7e8996865 +Ref: Constants<8>-Footnote-18997115 +Node: Functions<7>8997167 +Ref: library/socket functions8997252 +Ref: 2c7f8997252 +Node: Creating sockets8997361 +Ref: library/socket creating-sockets8997453 +Ref: 2c808997453 +Ref: library/socket socket socket8997570 +Ref: a1f8997570 +Ref: library/socket socket socketpair9000146 +Ref: 8609000146 +Ref: library/socket socket create_connection9000871 +Ref: 2419000871 +Ref: library/socket socket create_server9002379 +Ref: 6789002379 +Ref: library/socket socket has_dualstack_ipv69004155 +Ref: 6799004155 +Ref: library/socket socket fromfd9004350 +Ref: 2c829004350 +Ref: library/socket socket fromshare9005227 +Ref: 8719005227 +Ref: library/socket socket SocketType9005481 +Ref: 2c849005481 +Node: Other functions<2>9005634 +Ref: library/socket other-functions9005726 +Ref: 2c859005726 +Ref: library/socket socket close9005853 +Ref: 7d29005853 +Ref: library/socket socket getaddrinfo9006125 +Ref: 13579006125 +Ref: library/socket socket getfqdn9008828 +Ref: 2c869008828 +Ref: library/socket socket gethostbyname9009445 +Ref: 2c879009445 +Ref: library/socket socket gethostbyname_ex9010089 +Ref: 12d39010089 +Ref: library/socket socket gethostname9010878 +Ref: 24ff9010878 +Ref: library/socket socket gethostbyaddr9011308 +Ref: 12d29011308 +Ref: library/socket socket getnameinfo9012048 +Ref: 2bad9012048 +Ref: library/socket socket getprotobyname9012817 +Ref: 2c889012817 +Ref: library/socket socket getservbyname9013308 +Ref: 2c899013308 +Ref: library/socket socket getservbyport9013763 +Ref: 2c8a9013763 +Ref: library/socket socket ntohl9014204 +Ref: 2c8b9014204 +Ref: library/socket socket ntohs9014461 +Ref: 4a39014461 +Ref: library/socket socket htonl9014837 +Ref: 2c8c9014837 +Ref: library/socket socket htons9015094 +Ref: 4a29015094 +Ref: library/socket socket inet_aton9015470 +Ref: 5b39015470 +Ref: library/socket socket inet_ntoa9016398 +Ref: 2c8d9016398 +Ref: library/socket socket inet_pton9017220 +Ref: 5b49017220 +Ref: library/socket socket inet_ntop9018009 +Ref: c439018009 +Ref: library/socket socket CMSG_LEN9018993 +Ref: 146d9018993 +Ref: library/socket socket CMSG_SPACE9019688 +Ref: 146c9019688 +Ref: library/socket socket getdefaulttimeout9020602 +Ref: 2c839020602 +Ref: library/socket socket setdefaulttimeout9020880 +Ref: 2c679020880 +Ref: library/socket socket sethostname9021168 +Ref: de89021168 +Ref: library/socket socket if_nameindex9021500 +Ref: 67a9021500 +Ref: library/socket socket if_nametoindex9022316 +Ref: 67b9022316 +Ref: library/socket socket if_indextoname9022792 +Ref: 67c9022792 +Ref: library/socket socket send_fds9023270 +Ref: 57b9023270 +Ref: library/socket socket recv_fds9023761 +Ref: 57c9023761 +Ref: Other functions<2>-Footnote-19024357 +Node: Socket Objects9024416 +Ref: library/socket id19024565 +Ref: 2c8e9024565 +Ref: library/socket socket-objects9024565 +Ref: 2c819024565 +Ref: library/socket socket socket accept9024917 +Ref: a209024917 +Ref: library/socket socket socket bind9025683 +Ref: 2c8f9025683 +Ref: library/socket socket socket close9026027 +Ref: 9ba9026027 +Ref: library/socket socket socket connect9027022 +Ref: a219027022 +Ref: library/socket socket socket connect_ex9028136 +Ref: 2c919028136 +Ref: library/socket socket socket detach9028759 +Ref: ecd9028759 +Ref: library/socket socket socket dup9029000 +Ref: 2c929029000 +Ref: library/socket socket socket fileno9029225 +Ref: 2c939029225 +Ref: library/socket socket socket get_inheritable9029586 +Ref: b8f9029586 +Ref: library/socket socket socket getpeername9029848 +Ref: 2bdd9029848 +Ref: library/socket socket socket getsockname9030187 +Ref: 2bde9030187 +Ref: library/socket socket socket getsockopt9030436 +Ref: 9439030436 +Ref: library/socket socket socket getblocking9031175 +Ref: 7d19031175 +Ref: library/socket socket socket gettimeout9031397 +Ref: 2c949031397 +Ref: library/socket socket socket ioctl9031644 +Ref: 9419031644 +Ref: library/socket socket socket listen9032282 +Ref: ae79032282 +Ref: library/socket socket socket makefile9032751 +Ref: e539032751 +Ref: library/socket socket socket recv9033866 +Ref: a229033866 +Ref: library/socket socket socket recvfrom9034662 +Ref: a239034662 +Ref: library/socket socket socket recvmsg9035601 +Ref: a249035601 +Ref: library/socket socket socket recvmsg_into9039512 +Ref: de79039512 +Ref: library/socket socket socket recvfrom_into9041145 +Ref: fbe9041145 +Ref: library/socket socket socket recv_into9041679 +Ref: fbd9041679 +Ref: library/socket socket socket send9042126 +Ref: a259042126 +Ref: library/socket socket socket sendall9042939 +Ref: a269042939 +Ref: library/socket socket socket sendto9043913 +Ref: a289043913 +Ref: library/socket socket socket sendmsg9044744 +Ref: a279044744 +Ref: library/socket socket socket sendmsg_afalg9046910 +Ref: 9469046910 +Ref: library/socket socket socket sendfile9047248 +Ref: ae69047248 +Ref: library/socket socket socket set_inheritable9048152 +Ref: b909048152 +Ref: library/socket socket socket setblocking9048332 +Ref: 25089048332 +Ref: library/socket socket socket settimeout9048904 +Ref: 2c629048904 +Ref: library/socket socket socket setsockopt9049640 +Ref: 9449049640 +Ref: library/socket socket socket shutdown9050761 +Ref: 2c909050761 +Ref: library/socket socket socket share9051100 +Ref: 8729051100 +Ref: library/socket socket socket family9051966 +Ref: 2c989051966 +Ref: library/socket socket socket type9052021 +Ref: 8769052021 +Ref: library/socket socket socket proto9052072 +Ref: 2c999052072 +Ref: Socket Objects-Footnote-19052164 +Ref: Socket Objects-Footnote-29052206 +Ref: Socket Objects-Footnote-39052248 +Ref: Socket Objects-Footnote-49052322 +Ref: Socket Objects-Footnote-59052364 +Ref: Socket Objects-Footnote-69052406 +Ref: Socket Objects-Footnote-79052448 +Ref: Socket Objects-Footnote-89052490 +Ref: Socket Objects-Footnote-99052532 +Ref: Socket Objects-Footnote-109052574 +Node: Notes on socket timeouts9052617 +Ref: library/socket notes-on-socket-timeouts9052761 +Ref: 2c9a9052761 +Ref: library/socket socket-timeouts9052761 +Ref: 2c979052761 +Node: Timeouts and the connect method9054118 +Ref: library/socket timeouts-and-the-connect-method9054249 +Ref: 2c9b9054249 +Node: Timeouts and the accept method9054724 +Ref: library/socket timeouts-and-the-accept-method9054855 +Ref: 2c9c9054855 +Node: Example<8>9055596 +Ref: library/socket example9055717 +Ref: 2c9d9055717 +Ref: library/socket socket-example9055717 +Ref: 2c9e9055717 +Ref: Example<8>-Footnote-19063446 +Node: ssl — TLS/SSL wrapper for socket objects9063505 +Ref: library/ssl doc9063721 +Ref: 2c9f9063721 +Ref: library/ssl module-ssl9063721 +Ref: f09063721 +Ref: library/ssl ssl-tls-ssl-wrapper-for-socket-objects9063721 +Ref: 2ca09063721 +Ref: ssl — TLS/SSL wrapper for socket objects-Footnote-19066731 +Ref: ssl — TLS/SSL wrapper for socket objects-Footnote-29066794 +Node: Functions Constants and Exceptions9066836 +Ref: library/ssl functions-constants-and-exceptions9066969 +Ref: 2ca19066969 +Node: Socket creation9067217 +Ref: library/ssl socket-creation9067328 +Ref: 2ca29067328 +Node: Context creation9069095 +Ref: library/ssl context-creation9069229 +Ref: 2ca39069229 +Ref: library/ssl ssl create_default_context9069371 +Ref: c469069371 +Ref: Context creation-Footnote-19072455 +Node: Exceptions<13>9072500 +Ref: library/ssl exceptions9072636 +Ref: 2ca79072636 +Ref: library/ssl ssl SSLError9072677 +Ref: f329072677 +Ref: library/ssl ssl SSLError library9073249 +Ref: df79073249 +Ref: library/ssl ssl SSLError reason9073527 +Ref: df89073527 +Ref: library/ssl ssl SSLZeroReturnError9073786 +Ref: 2ca89073786 +Ref: library/ssl ssl SSLWantReadError9074080 +Ref: af29074080 +Ref: library/ssl ssl SSLWantWriteError9074387 +Ref: af39074387 +Ref: library/ssl ssl SSLSyscallError9074691 +Ref: 2caa9074691 +Ref: library/ssl ssl SSLEOFError9074980 +Ref: 12b29074980 +Ref: library/ssl ssl SSLCertVerificationError9075248 +Ref: 7dc9075248 +Ref: library/ssl ssl SSLCertVerificationError verify_code9075412 +Ref: 2cab9075412 +Ref: library/ssl ssl SSLCertVerificationError verify_message9075516 +Ref: 2cac9075516 +Ref: library/ssl ssl CertificateError9075614 +Ref: 2cad9075614 +Node: Random generation9075813 +Ref: library/ssl random-generation9075953 +Ref: 2cae9075953 +Ref: library/ssl ssl RAND_bytes9076008 +Ref: df09076008 +Ref: library/ssl ssl RAND_pseudo_bytes9076687 +Ref: 4939076687 +Ref: library/ssl ssl RAND_status9077537 +Ref: 12cb9077537 +Ref: library/ssl ssl RAND_add9077857 +Ref: 2caf9077857 +Ref: Random generation-Footnote-19078299 +Ref: Random generation-Footnote-29078393 +Node: Certificate handling9078452 +Ref: library/ssl certificate-handling9078590 +Ref: 2cb09078590 +Ref: library/ssl ssl match_hostname9078651 +Ref: 4929078651 +Ref: library/ssl ssl cert_time_to_seconds9080592 +Ref: af49080592 +Ref: library/ssl ssl get_server_certificate9081502 +Ref: 4319081502 +Ref: library/ssl ssl DER_cert_to_PEM_cert9082662 +Ref: 2cb19082662 +Ref: library/ssl ssl PEM_cert_to_DER_cert9082844 +Ref: 2cb29082844 +Ref: library/ssl ssl get_default_verify_paths9083024 +Ref: c479083024 +Ref: library/ssl ssl enum_certificates9083899 +Ref: c539083899 +Ref: library/ssl ssl enum_crls9084776 +Ref: c549084776 +Ref: library/ssl ssl wrap_socket9085307 +Ref: 4909085307 +Ref: Certificate handling-Footnote-19086799 +Ref: Certificate handling-Footnote-29086858 +Ref: Certificate handling-Footnote-39086917 +Ref: Certificate handling-Footnote-49086976 +Ref: Certificate handling-Footnote-59087035 +Node: Constants<9>9087094 +Ref: library/ssl constants9087206 +Ref: 2cb49087206 +Ref: library/ssl ssl CERT_NONE9087370 +Ref: 2cb59087370 +Ref: library/ssl ssl CERT_OPTIONAL9087986 +Ref: 2cb69087986 +Ref: library/ssl ssl CERT_REQUIRED9088891 +Ref: 2ca59088891 +Ref: library/ssl ssl VerifyMode9090015 +Ref: 2cb89090015 +Ref: library/ssl ssl VERIFY_DEFAULT9090131 +Ref: c4c9090131 +Ref: library/ssl ssl VERIFY_CRL_CHECK_LEAF9090384 +Ref: c4d9090384 +Ref: library/ssl ssl VERIFY_CRL_CHECK_CHAIN9090829 +Ref: c4e9090829 +Ref: library/ssl ssl VERIFY_X509_STRICT9091035 +Ref: c4f9091035 +Ref: library/ssl ssl VERIFY_ALLOW_PROXY_CERTS9091215 +Ref: 12e39091215 +Ref: library/ssl ssl VERIFY_X509_TRUSTED_FIRST9091391 +Ref: 2cb99091391 +Ref: library/ssl ssl VERIFY_X509_PARTIAL_CHAIN9091680 +Ref: 4329091680 +Ref: library/ssl ssl VerifyFlags9092112 +Ref: 2cba9092112 +Ref: library/ssl ssl PROTOCOL_TLS9092231 +Ref: 48d9092231 +Ref: library/ssl ssl PROTOCOL_TLS_CLIENT9092727 +Ref: 48e9092727 +Ref: library/ssl ssl PROTOCOL_TLS_SERVER9093038 +Ref: 48f9093038 +Ref: library/ssl ssl PROTOCOL_SSLv239093251 +Ref: 4899093251 +Ref: library/ssl ssl PROTOCOL_SSLv29093397 +Ref: 4879093397 +Ref: library/ssl ssl PROTOCOL_SSLv39093756 +Ref: 4889093756 +Ref: library/ssl ssl PROTOCOL_TLSv19094335 +Ref: 48a9094335 +Ref: library/ssl ssl PROTOCOL_TLSv1_19094527 +Ref: 48b9094527 +Ref: library/ssl ssl PROTOCOL_TLSv1_29094796 +Ref: 48c9094796 +Ref: library/ssl ssl OP_ALL9095065 +Ref: 2cbb9095065 +Ref: library/ssl ssl OP_NO_SSLv29095322 +Ref: 42d9095322 +Ref: library/ssl ssl OP_NO_SSLv39095622 +Ref: 42e9095622 +Ref: library/ssl ssl OP_NO_TLSv19095922 +Ref: 4839095922 +Ref: library/ssl ssl OP_NO_TLSv1_19096360 +Ref: 4849096360 +Ref: library/ssl ssl OP_NO_TLSv1_29096746 +Ref: 4859096746 +Ref: library/ssl ssl OP_NO_TLSv1_39097132 +Ref: 4869097132 +Ref: library/ssl ssl OP_NO_RENEGOTIATION9097722 +Ref: 2cbc9097722 +Ref: library/ssl ssl OP_CIPHER_SERVER_PREFERENCE9098003 +Ref: df99098003 +Ref: library/ssl ssl OP_SINGLE_DH_USE9098234 +Ref: 2cbd9098234 +Ref: library/ssl ssl OP_SINGLE_ECDH_USE9098488 +Ref: 2cbe9098488 +Ref: library/ssl ssl OP_ENABLE_MIDDLEBOX_COMPAT9098746 +Ref: 2cbf9098746 +Ref: library/ssl ssl OP_NO_COMPRESSION9099023 +Ref: df69099023 +Ref: library/ssl ssl Options9099214 +Ref: 2cc09099214 +Ref: library/ssl ssl OP_NO_TICKET9099299 +Ref: 2cc19099299 +Ref: library/ssl ssl OP_IGNORE_UNEXPECTED_EOF9099413 +Ref: 42b9099413 +Ref: library/ssl ssl HAS_ALPN9099599 +Ref: aef9099599 +Ref: library/ssl ssl HAS_NEVER_CHECK_COMMON_NAME9099806 +Ref: 2cc29099806 +Ref: library/ssl ssl HAS_ECDH9100042 +Ref: 2cc39100042 +Ref: library/ssl ssl HAS_SNI9100299 +Ref: 2cc49100299 +Ref: library/ssl ssl HAS_NPN9100480 +Ref: 2cc59100480 +Ref: library/ssl ssl HAS_SSLv29100831 +Ref: 2cc69100831 +Ref: library/ssl ssl HAS_SSLv39100968 +Ref: 2cc79100968 +Ref: library/ssl ssl HAS_TLSv19101105 +Ref: 2cc89101105 +Ref: library/ssl ssl HAS_TLSv1_19101242 +Ref: 7e59101242 +Ref: library/ssl ssl HAS_TLSv1_29101381 +Ref: 2cc99101381 +Ref: library/ssl ssl HAS_TLSv1_39101520 +Ref: 2cca9101520 +Ref: library/ssl ssl CHANNEL_BINDING_TYPES9101659 +Ref: 2ccb9101659 +Ref: library/ssl ssl OPENSSL_VERSION9101877 +Ref: ecf9101877 +Ref: library/ssl ssl OPENSSL_VERSION_INFO9102089 +Ref: ed09102089 +Ref: library/ssl ssl OPENSSL_VERSION_NUMBER9102315 +Ref: ed19102315 +Ref: library/ssl ssl ALERT_DESCRIPTION_HANDSHAKE_FAILURE9102584 +Ref: 2ccc9102584 +Ref: library/ssl ssl ALERT_DESCRIPTION_INTERNAL_ERROR9102634 +Ref: 2ccd9102634 +Ref: library/ssl ssl AlertDescription9103026 +Ref: 2cce9103026 +Ref: library/ssl ssl Purpose SERVER_AUTH9103166 +Ref: c519103166 +Ref: library/ssl ssl Purpose CLIENT_AUTH9103479 +Ref: c529103479 +Ref: library/ssl ssl SSLErrorNumber9103792 +Ref: 2ccf9103792 +Ref: library/ssl ssl TLSVersion9103917 +Ref: 2cd09103917 +Ref: library/ssl ssl TLSVersion MINIMUM_SUPPORTED9104132 +Ref: 2cd19104132 +Ref: library/ssl ssl TLSVersion MAXIMUM_SUPPORTED9104177 +Ref: 2cd29104177 +Ref: library/ssl ssl TLSVersion SSLv39104400 +Ref: 2cd39104400 +Ref: library/ssl ssl TLSVersion TLSv19104433 +Ref: 2cd49104433 +Ref: library/ssl ssl TLSVersion TLSv1_19104466 +Ref: 2cd59104466 +Ref: library/ssl ssl TLSVersion TLSv1_29104501 +Ref: 2cd69104501 +Ref: library/ssl ssl TLSVersion TLSv1_39104536 +Ref: 2cd79104536 +Ref: Constants<9>-Footnote-19104807 +Ref: Constants<9>-Footnote-29104866 +Ref: Constants<9>-Footnote-39104925 +Ref: Constants<9>-Footnote-49105003 +Ref: Constants<9>-Footnote-59105062 +Node: SSL Sockets9105155 +Ref: library/ssl ssl-sockets9105309 +Ref: 2cd89105309 +Ref: library/ssl ssl SSLSocket9105352 +Ref: 52a9105352 +Ref: library/ssl ssl SSLSocket read9107786 +Ref: af79107786 +Ref: library/ssl ssl SSLSocket write9108606 +Ref: af89108606 +Ref: library/ssl ssl SSLSocket do_handshake9109836 +Ref: af69109836 +Ref: library/ssl ssl SSLSocket getpeercert9110600 +Ref: c569110600 +Ref: library/ssl ssl SSLSocket cipher9114211 +Ref: 2bdf9114211 +Ref: library/ssl ssl SSLSocket shared_ciphers9114495 +Ref: af59114495 +Ref: library/ssl ssl SSLSocket compression9114976 +Ref: df59114976 +Ref: library/ssl ssl SSLSocket get_channel_binding9115321 +Ref: df49115321 +Ref: library/ssl ssl SSLSocket selected_alpn_protocol9115954 +Ref: aee9115954 +Ref: library/ssl ssl SSLSocket selected_npn_protocol9116365 +Ref: 4949116365 +Ref: library/ssl ssl SSLSocket unwrap9116788 +Ref: 2cd99116788 +Ref: library/ssl ssl SSLSocket verify_client_post_handshake9117211 +Ref: 67f9117211 +Ref: library/ssl ssl SSLSocket version9118089 +Ref: af19118089 +Ref: library/ssl ssl SSLSocket pending9118500 +Ref: 2cdb9118500 +Ref: library/ssl ssl SSLSocket context9118638 +Ref: 2cda9118638 +Ref: library/ssl ssl SSLSocket server_side9118986 +Ref: 2cdc9118986 +Ref: library/ssl ssl SSLSocket server_hostname9119156 +Ref: 7df9119156 +Ref: library/ssl ssl SSLSocket session9119659 +Ref: 2cdd9119659 +Ref: library/ssl ssl SSLSocket session_reused9120015 +Ref: 2cde9120015 +Ref: SSL Sockets-Footnote-19120118 +Ref: SSL Sockets-Footnote-29120177 +Node: SSL Contexts9120236 +Ref: library/ssl ssl-contexts9120368 +Ref: 2cdf9120368 +Ref: library/ssl ssl SSLContext9120712 +Ref: 4309120712 +Ref: library/ssl ssl SSLContext cert_store_stats9125331 +Ref: c499125331 +Ref: library/ssl ssl SSLContext load_cert_chain9125735 +Ref: df19125735 +Ref: library/ssl ssl SSLContext load_default_certs9127358 +Ref: c509127358 +Ref: library/ssl ssl SSLContext load_verify_locations9128180 +Ref: b7b9128180 +Ref: library/ssl ssl SSLContext get_ca_certs9129510 +Ref: c4a9129510 +Ref: library/ssl ssl SSLContext get_ciphers9130145 +Ref: 94d9130145 +Ref: library/ssl ssl SSLContext set_default_verify_paths9131446 +Ref: c489131446 +Ref: library/ssl ssl SSLContext set_ciphers9131915 +Ref: 2cb39131915 +Ref: library/ssl ssl SSLContext set_alpn_protocols9132514 +Ref: aed9132514 +Ref: library/ssl ssl SSLContext set_npn_protocols9133150 +Ref: 4959133150 +Ref: library/ssl ssl SSLContext sni_callback9133887 +Ref: 12db9133887 +Ref: library/ssl ssl SSLContext set_servername_callback9136424 +Ref: c559136424 +Ref: library/ssl ssl SSLContext load_dh_params9137105 +Ref: df29137105 +Ref: library/ssl ssl SSLContext set_ecdh_curve9137648 +Ref: df39137648 +Ref: library/ssl ssl SSLContext wrap_socket9138375 +Ref: 4919138375 +Ref: library/ssl ssl SSLContext sslsocket_class9141162 +Ref: 2ce19141162 +Ref: library/ssl ssl SSLContext wrap_bio9141458 +Ref: 7e29141458 +Ref: library/ssl ssl SSLContext sslobject_class9142197 +Ref: 2ce29142197 +Ref: library/ssl ssl SSLContext session_stats9142490 +Ref: 2ce39142490 +Ref: library/ssl ssl SSLContext check_hostname9142955 +Ref: 2cb79142955 +Ref: library/ssl ssl SSLContext keylog_filename9144480 +Ref: 2ca69144480 +Ref: library/ssl ssl SSLContext maximum_version9144924 +Ref: 7e49144924 +Ref: library/ssl ssl SSLContext minimum_version9145778 +Ref: 7e39145778 +Ref: library/ssl ssl SSLContext num_tickets9145989 +Ref: 2ce49145989 +Ref: library/ssl ssl SSLContext options9146220 +Ref: 42c9146220 +Ref: library/ssl ssl SSLContext post_handshake_auth9146951 +Ref: 67e9146951 +Ref: library/ssl ssl SSLContext protocol9147766 +Ref: 2ce59147766 +Ref: library/ssl ssl SSLContext hostname_checks_common_name9147902 +Ref: 7dd9147902 +Ref: library/ssl ssl SSLContext security_level9148335 +Ref: 2ce69148335 +Ref: library/ssl ssl SSLContext verify_flags9148508 +Ref: c4b9148508 +Ref: library/ssl ssl SSLContext verify_mode9149042 +Ref: 2ca49149042 +Ref: SSL Contexts-Footnote-19149548 +Ref: SSL Contexts-Footnote-29149701 +Ref: SSL Contexts-Footnote-39149788 +Ref: SSL Contexts-Footnote-49149875 +Ref: SSL Contexts-Footnote-59150028 +Ref: SSL Contexts-Footnote-69150115 +Ref: SSL Contexts-Footnote-79150202 +Ref: SSL Contexts-Footnote-89150290 +Ref: SSL Contexts-Footnote-99150355 +Ref: SSL Contexts-Footnote-109150414 +Ref: SSL Contexts-Footnote-119150493 +Ref: SSL Contexts-Footnote-129150553 +Ref: SSL Contexts-Footnote-139150630 +Ref: SSL Contexts-Footnote-149150708 +Node: Certificates9150794 +Ref: library/ssl certificates9150927 +Ref: 2ce79150927 +Ref: library/ssl ssl-certificates9150927 +Ref: 2ce09150927 +Ref: Certificates-Footnote-19153276 +Node: Certificate chains9153335 +Ref: library/ssl certificate-chains9153426 +Ref: 2ce89153426 +Node: CA certificates9154697 +Ref: library/ssl ca-certificates9154825 +Ref: 2ce99154825 +Node: Combined key and certificate9155415 +Ref: library/ssl combined-key-and-certificate9155549 +Ref: 2cea9155549 +Node: Self-signed certificates9156195 +Ref: library/ssl self-signed-certificates9156305 +Ref: 2ceb9156305 +Node: Examples<19>9158003 +Ref: library/ssl examples9158153 +Ref: 2cec9158153 +Node: Testing for SSL support9158282 +Ref: library/ssl testing-for-ssl-support9158384 +Ref: 2ced9158384 +Node: Client-side operation9158698 +Ref: library/ssl client-side-operation9158830 +Ref: 2cee9158830 +Node: Server-side operation9163571 +Ref: library/ssl server-side-operation9163671 +Ref: 2cef9163671 +Node: Notes on non-blocking sockets9165680 +Ref: library/ssl notes-on-non-blocking-sockets9165839 +Ref: 2cf09165839 +Ref: library/ssl ssl-nonblocking9165839 +Ref: 2ca99165839 +Node: Memory BIO Support<2>9168727 +Ref: library/ssl memory-bio-support9168885 +Ref: 2cf19168885 +Ref: library/ssl ssl SSLObject9170001 +Ref: 7e19170001 +Ref: library/ssl ssl MemoryBIO9173763 +Ref: aeb9173763 +Ref: library/ssl ssl MemoryBIO pending9173891 +Ref: 2cf29173891 +Ref: library/ssl ssl MemoryBIO eof9173990 +Ref: 2cf39173990 +Ref: library/ssl ssl MemoryBIO read9174120 +Ref: 2cf49174120 +Ref: library/ssl ssl MemoryBIO write9174279 +Ref: 2cf59174279 +Ref: library/ssl ssl MemoryBIO write_eof9174561 +Ref: 2cf69174561 +Node: SSL session9174853 +Ref: library/ssl ssl-session9175008 +Ref: 2cf79175008 +Ref: library/ssl ssl SSLSession9175074 +Ref: 94c9175074 +Ref: library/ssl ssl SSLSession id9175151 +Ref: 2cf89175151 +Ref: library/ssl ssl SSLSession time9175175 +Ref: 2cf99175175 +Ref: library/ssl ssl SSLSession timeout9175201 +Ref: 2cfa9175201 +Ref: library/ssl ssl SSLSession ticket_lifetime_hint9175230 +Ref: 2cfb9175230 +Ref: library/ssl ssl SSLSession has_ticket9175272 +Ref: 2cfc9175272 +Node: Security considerations<2>9175304 +Ref: library/ssl security-considerations9175445 +Ref: 2cfd9175445 +Ref: library/ssl ssl-security9175445 +Ref: 2b9e9175445 +Node: Best defaults9175583 +Ref: library/ssl best-defaults9175683 +Ref: 2cfe9175683 +Node: Manual settings9176844 +Ref: library/ssl manual-settings9176969 +Ref: 2cff9176969 +Node: Verifying certificates9177102 +Ref: library/ssl verifying-certificates9177202 +Ref: 2d009177202 +Node: Protocol versions9178465 +Ref: library/ssl protocol-versions9178590 +Ref: 2d019178590 +Node: Cipher selection9179414 +Ref: library/ssl cipher-selection9179508 +Ref: 2d029179508 +Ref: Cipher selection-Footnote-19180164 +Node: Multi-processing9180248 +Ref: library/ssl multi-processing9180351 +Ref: 2d039180351 +Node: TLS 1 39180906 +Ref: library/ssl ssl-tlsv1-39181027 +Ref: 7e09181027 +Ref: library/ssl tls-1-39181027 +Ref: 2d049181027 +Ref: TLS 1 3-Footnote-19183141 +Ref: TLS 1 3-Footnote-29183207 +Ref: TLS 1 3-Footnote-39183266 +Ref: TLS 1 3-Footnote-49183325 +Ref: TLS 1 3-Footnote-59183384 +Ref: TLS 1 3-Footnote-69183443 +Ref: TLS 1 3-Footnote-79183502 +Ref: TLS 1 3-Footnote-89183578 +Ref: TLS 1 3-Footnote-99183637 +Node: select — Waiting for I/O completion9183695 +Ref: library/select doc9183911 +Ref: 2d059183911 +Ref: library/select module-select9183911 +Ref: e29183911 +Ref: library/select select-waiting-for-i-o-completion9183911 +Ref: 2d069183911 +Ref: library/select select error9185153 +Ref: d069185153 +Ref: library/select select devpoll9185340 +Ref: c339185340 +Ref: library/select select epoll9186060 +Ref: c319186060 +Ref: library/select select poll9187547 +Ref: 257d9187547 +Ref: library/select select kqueue9187866 +Ref: 2d0a9187866 +Ref: library/select select kevent9188205 +Ref: 2d0c9188205 +Ref: library/select select select9188482 +Ref: a1e9188482 +Ref: library/select select PIPE_BUF9190751 +Ref: eb99190751 +Ref: select — Waiting for I/O completion-Footnote-19191447 +Ref: select — Waiting for I/O completion-Footnote-29191489 +Node: /dev/poll Polling Objects9191531 +Ref: library/select dev-poll-polling-objects9191683 +Ref: 2d0e9191683 +Ref: library/select devpoll-objects9191683 +Ref: 2d079191683 +Ref: library/select select devpoll close9192037 +Ref: c359192037 +Ref: library/select select devpoll closed9192148 +Ref: c369192148 +Ref: library/select select devpoll fileno9192255 +Ref: c349192255 +Ref: library/select select devpoll register9192375 +Ref: 2d0f9192375 +Ref: library/select select devpoll modify9193359 +Ref: 2d109193359 +Ref: library/select select devpoll unregister9193567 +Ref: 2d119193567 +Ref: library/select select devpoll poll9193924 +Ref: a1a9193924 +Ref: /dev/poll Polling Objects-Footnote-19195067 +Node: Edge and Level Trigger Polling epoll Objects9195109 +Ref: library/select edge-and-level-trigger-polling-epoll-objects9195285 +Ref: 2d129195285 +Ref: library/select epoll-objects9195285 +Ref: 2d089195285 +Ref: library/select select epoll close9198153 +Ref: c329198153 +Ref: library/select select epoll closed9198242 +Ref: 2d139198242 +Ref: library/select select epoll fileno9198319 +Ref: 2d149198319 +Ref: library/select select epoll fromfd9198407 +Ref: 2d159198407 +Ref: library/select select epoll register9198497 +Ref: 2d169198497 +Ref: library/select select epoll modify9198597 +Ref: 2d179198597 +Ref: library/select select epoll unregister9198682 +Ref: 5ac9198682 +Ref: library/select select epoll poll9198875 +Ref: a1b9198875 +Ref: Edge and Level Trigger Polling epoll Objects-Footnote-19199278 +Node: Polling Objects9199320 +Ref: library/select poll-objects9199485 +Ref: 2d099199485 +Ref: library/select polling-objects9199485 +Ref: 2d189199485 +Ref: library/select select poll register9200052 +Ref: 2d199200052 +Ref: library/select select poll modify9202029 +Ref: 2d1a9202029 +Ref: library/select select poll unregister9202330 +Ref: 2d1b9202330 +Ref: library/select select poll poll9202719 +Ref: a1d9202719 +Ref: Polling Objects-Footnote-19203865 +Node: Kqueue Objects9203907 +Ref: library/select id19204042 +Ref: 2d1c9204042 +Ref: library/select kqueue-objects9204042 +Ref: 2d0b9204042 +Ref: library/select select kqueue close9204091 +Ref: 2d1d9204091 +Ref: library/select select kqueue closed9204182 +Ref: 2d1e9204182 +Ref: library/select select kqueue fileno9204261 +Ref: 2d1f9204261 +Ref: library/select select kqueue fromfd9204350 +Ref: 2d209204350 +Ref: library/select select kqueue control9204441 +Ref: a1c9204441 +Ref: Kqueue Objects-Footnote-19205092 +Node: Kevent Objects9205134 +Ref: library/select id29205245 +Ref: 2d219205245 +Ref: library/select kevent-objects9205245 +Ref: 2d0d9205245 +Ref: library/select select kevent ident9205360 +Ref: 2d229205360 +Ref: library/select select kevent filter9205662 +Ref: 2d239205662 +Ref: library/select select kevent flags9207441 +Ref: 2d249207441 +Ref: library/select select kevent fflags9209102 +Ref: 2d259209102 +Ref: library/select select kevent data9212844 +Ref: 2d269212844 +Ref: library/select select kevent udata9212900 +Ref: 2d279212900 +Node: selectors — High-level I/O multiplexing9212955 +Ref: library/selectors doc9213176 +Ref: 2d289213176 +Ref: library/selectors module-selectors9213176 +Ref: e39213176 +Ref: library/selectors selectors-high-level-i-o-multiplexing9213176 +Ref: 2d299213176 +Ref: selectors — High-level I/O multiplexing-Footnote-19213534 +Node: Introduction<8>9213603 +Ref: library/selectors introduction9213715 +Ref: 2d2a9213715 +Node: Classes<3>9215116 +Ref: library/selectors classes9215249 +Ref: 2d2d9215249 +Ref: library/selectors selectors SelectorKey9216028 +Ref: 2d2e9216028 +Ref: library/selectors selectors SelectorKey fileobj9216306 +Ref: 2d2f9216306 +Ref: library/selectors selectors SelectorKey fd9216370 +Ref: 2d309216370 +Ref: library/selectors selectors SelectorKey events9216433 +Ref: 2d319216433 +Ref: library/selectors selectors SelectorKey data9216524 +Ref: 2d329216524 +Ref: library/selectors selectors BaseSelector9216690 +Ref: 2d2b9216690 +Ref: library/selectors selectors BaseSelector register9217366 +Ref: 2d339217366 +Ref: library/selectors selectors BaseSelector unregister9218020 +Ref: 2d349218020 +Ref: library/selectors selectors BaseSelector modify9218640 +Ref: 83b9218640 +Ref: library/selectors selectors BaseSelector select9219240 +Ref: 2d359219240 +Ref: library/selectors selectors BaseSelector close9220539 +Ref: 2d369220539 +Ref: library/selectors selectors BaseSelector get_key9220757 +Ref: 2d379220757 +Ref: library/selectors selectors BaseSelector get_map9221044 +Ref: 2d389221044 +Ref: library/selectors selectors DefaultSelector9221312 +Ref: 2d2c9221312 +Ref: library/selectors selectors SelectSelector9221520 +Ref: 2c319221520 +Ref: library/selectors selectors PollSelector9221607 +Ref: 83d9221607 +Ref: library/selectors selectors EpollSelector9221691 +Ref: 83c9221691 +Ref: library/selectors selectors EpollSelector fileno9221776 +Ref: 2d399221776 +Ref: library/selectors selectors DevpollSelector9221916 +Ref: 83e9221916 +Ref: library/selectors selectors DevpollSelector fileno9222005 +Ref: 2d3a9222005 +Ref: library/selectors selectors KqueueSelector9222173 +Ref: 2c349222173 +Ref: library/selectors selectors KqueueSelector fileno9222261 +Ref: 2d3b9222261 +Ref: Classes<3>-Footnote-19222439 +Node: Examples<20>9222481 +Ref: library/selectors examples9222590 +Ref: 2d3c9222590 +Node: signal — Set handlers for asynchronous events9223617 +Ref: library/signal doc9223836 +Ref: 2d3d9223836 +Ref: library/signal module-signal9223836 +Ref: e79223836 +Ref: library/signal signal-set-handlers-for-asynchronous-events9223836 +Ref: 2d3e9223836 +Node: General rules9224244 +Ref: library/signal general-rules9224368 +Ref: 2d3f9224368 +Node: Execution of Python signal handlers9225380 +Ref: library/signal execution-of-python-signal-handlers9225493 +Ref: 2d429225493 +Node: Signals and threads9226815 +Ref: library/signal id19226928 +Ref: 2d469226928 +Ref: library/signal signals-and-threads9226928 +Ref: 2d479226928 +Node: Module contents<2>9227401 +Ref: library/signal module-contents9227546 +Ref: 2d489227546 +Ref: library/signal signal Signals9228157 +Ref: 2d4c9228157 +Ref: library/signal signal Handlers9228301 +Ref: 2d4d9228301 +Ref: library/signal signal Sigmasks9228462 +Ref: 2d4e9228462 +Ref: library/signal signal SIG_DFL9228851 +Ref: 120e9228851 +Ref: library/signal signal SIG_IGN9229183 +Ref: 120d9229183 +Ref: library/signal signal SIGABRT9229304 +Ref: 2d509229304 +Ref: library/signal signal SIGALRM9229370 +Ref: 2d519229370 +Ref: library/signal signal SIGBREAK9229475 +Ref: 2d529229475 +Ref: library/signal signal SIGBUS9229590 +Ref: 2d539229590 +Ref: library/signal signal SIGCHLD9229691 +Ref: 2d419229691 +Ref: library/signal signal SIGCLD9229799 +Ref: 2d549229799 +Ref: library/signal signal SIGCONT9229860 +Ref: 25c79229860 +Ref: library/signal signal SIGFPE9229979 +Ref: 2d449229979 +Ref: library/signal signal SIGHUP9230216 +Ref: 2d559230216 +Ref: library/signal signal SIGILL9230364 +Ref: 2d569230364 +Ref: library/signal signal SIGINT9230416 +Ref: 43b9230416 +Ref: library/signal signal SIGKILL9230546 +Ref: 2d579230546 +Ref: library/signal signal SIGPIPE9230678 +Ref: 2d409230678 +Ref: library/signal signal SIGSEGV9230839 +Ref: 2d459230839 +Ref: library/signal signal SIGSTKFLT9230917 +Ref: 125c9230917 +Ref: library/signal signal SIGTERM9231262 +Ref: 2b659231262 +Ref: library/signal signal SIGUSR19231314 +Ref: 2d589231314 +Ref: library/signal signal SIGUSR29231408 +Ref: 2d599231408 +Ref: library/signal signal SIGWINCH9231502 +Ref: 2d5a9231502 +Ref: library/signal signal CTRL_C_EVENT9232159 +Ref: 259f9232159 +Ref: library/signal signal CTRL_BREAK_EVENT9232388 +Ref: 25a09232388 +Ref: library/signal signal NSIG9232625 +Ref: 11e49232625 +Ref: library/signal signal ITIMER_REAL9232777 +Ref: 2d5c9232777 +Ref: library/signal signal ITIMER_VIRTUAL9232909 +Ref: 2d5d9232909 +Ref: library/signal signal ITIMER_PROF9233055 +Ref: 2d5e9233055 +Ref: library/signal signal SIG_BLOCK9233394 +Ref: 2d499233394 +Ref: library/signal signal SIG_UNBLOCK9233576 +Ref: 2d4a9233576 +Ref: library/signal signal SIG_SETMASK9233767 +Ref: 2d4b9233767 +Ref: library/signal signal ItimerError9234017 +Ref: 2d5f9234017 +Ref: library/signal signal alarm9234540 +Ref: 2d629234540 +Ref: library/signal signal getsignal9235184 +Ref: 2d4f9235184 +Ref: library/signal signal strsignal9235756 +Ref: 14799235756 +Ref: library/signal signal valid_signals9236014 +Ref: 2d5b9236014 +Ref: library/signal signal pause9236257 +Ref: 2d639236257 +Ref: library/signal signal raise_signal9236644 +Ref: 11e89236644 +Ref: library/signal signal pidfd_send_signal9236777 +Ref: 5739236777 +Ref: library/signal signal pthread_kill9237279 +Ref: dde9237279 +Ref: library/signal signal pthread_sigmask9238504 +Ref: ddd9238504 +Ref: library/signal signal setitimer9239923 +Ref: 2d609239923 +Ref: library/signal signal getitimer9240942 +Ref: 2d619240942 +Ref: library/signal signal set_wakeup_fd9241102 +Ref: 7cf9241102 +Ref: library/signal signal siginterrupt9243301 +Ref: de29243301 +Ref: library/signal signal signal9243905 +Ref: de19243905 +Ref: library/signal signal sigpending9245408 +Ref: ddf9245408 +Ref: library/signal signal sigwait9245867 +Ref: de09245867 +Ref: library/signal signal sigwaitinfo9246445 +Ref: a2a9246445 +Ref: library/signal signal sigtimedwait9247709 +Ref: a299247709 +Ref: Module contents<2>-Footnote-19248478 +Ref: Module contents<2>-Footnote-29248520 +Node: Examples<21>9248562 +Ref: library/signal examples9248709 +Ref: 2d649248709 +Ref: library/signal signal-example9248709 +Ref: 2d659248709 +Node: Note on SIGPIPE9249671 +Ref: library/signal note-on-sigpipe9249838 +Ref: 2d669249838 +Node: Note on Signal Handlers and Exceptions9251247 +Ref: library/signal handlers-and-exceptions9251393 +Ref: 1ce29251393 +Ref: library/signal note-on-signal-handlers-and-exceptions9251393 +Ref: 2d679251393 +Node: mmap — Memory-mapped file support9254000 +Ref: library/mmap doc9254169 +Ref: 2d689254169 +Ref: library/mmap mmap-memory-mapped-file-support9254169 +Ref: 2d699254169 +Ref: library/mmap module-mmap9254169 +Ref: b19254169 +Ref: library/mmap mmap mmap9256839 +Ref: 64e9256839 +Ref: library/mmap mmap mmap close9261986 +Ref: 2d6d9261986 +Ref: library/mmap mmap mmap closed9262197 +Ref: 2d6e9262197 +Ref: library/mmap mmap mmap find9262301 +Ref: 2d6f9262301 +Ref: library/mmap mmap mmap flush9262731 +Ref: 6f19262731 +Ref: library/mmap mmap mmap madvise9263619 +Ref: 64f9263619 +Ref: library/mmap mmap mmap move9264185 +Ref: 2d719264185 +Ref: library/mmap mmap mmap read9264463 +Ref: d889264463 +Ref: library/mmap mmap mmap read_byte9264915 +Ref: 2d729264915 +Ref: library/mmap mmap mmap readline9265063 +Ref: 2d739265063 +Ref: library/mmap mmap mmap resize9265288 +Ref: 2d749265288 +Ref: library/mmap mmap mmap rfind9266028 +Ref: 2d759266028 +Ref: library/mmap mmap mmap seek9266460 +Ref: 2d769266460 +Ref: library/mmap mmap mmap size9266846 +Ref: 2d779266846 +Ref: library/mmap mmap mmap tell9266985 +Ref: 2d789266985 +Ref: library/mmap mmap mmap write9267072 +Ref: 2d799267072 +Ref: library/mmap mmap mmap write_byte9267779 +Ref: 2d7a9267779 +Node: MADV_* Constants9268145 +Ref: library/mmap madv-constants9268257 +Ref: 2d7b9268257 +Ref: library/mmap madvise-constants9268257 +Ref: 2d709268257 +Ref: library/mmap mmap MADV_NORMAL9268310 +Ref: 2d7c9268310 +Ref: library/mmap mmap MADV_RANDOM9268337 +Ref: 2d7d9268337 +Ref: library/mmap mmap MADV_SEQUENTIAL9268364 +Ref: 2d7e9268364 +Ref: library/mmap mmap MADV_WILLNEED9268395 +Ref: 2d7f9268395 +Ref: library/mmap mmap MADV_DONTNEED9268424 +Ref: 2d809268424 +Ref: library/mmap mmap MADV_REMOVE9268453 +Ref: 2d819268453 +Ref: library/mmap mmap MADV_DONTFORK9268480 +Ref: 2d829268480 +Ref: library/mmap mmap MADV_DOFORK9268509 +Ref: 2d839268509 +Ref: library/mmap mmap MADV_HWPOISON9268536 +Ref: 2d849268536 +Ref: library/mmap mmap MADV_MERGEABLE9268565 +Ref: 2d859268565 +Ref: library/mmap mmap MADV_UNMERGEABLE9268595 +Ref: 2d869268595 +Ref: library/mmap mmap MADV_SOFT_OFFLINE9268627 +Ref: 2d879268627 +Ref: library/mmap mmap MADV_HUGEPAGE9268660 +Ref: 2d889268660 +Ref: library/mmap mmap MADV_NOHUGEPAGE9268689 +Ref: 2d899268689 +Ref: library/mmap mmap MADV_DONTDUMP9268720 +Ref: 2d8a9268720 +Ref: library/mmap mmap MADV_DODUMP9268749 +Ref: 2d8b9268749 +Ref: library/mmap mmap MADV_FREE9268776 +Ref: 2d8c9268776 +Ref: library/mmap mmap MADV_NOSYNC9268801 +Ref: 2d8d9268801 +Ref: library/mmap mmap MADV_AUTOSYNC9268828 +Ref: 2d8e9268828 +Ref: library/mmap mmap MADV_NOCORE9268857 +Ref: 2d8f9268857 +Ref: library/mmap mmap MADV_CORE9268884 +Ref: 2d909268884 +Ref: library/mmap mmap MADV_PROTECT9268909 +Ref: 2d919268909 +Ref: library/mmap mmap MADV_FREE_REUSABLE9268937 +Ref: 2d929268937 +Ref: library/mmap mmap MADV_FREE_REUSE9268971 +Ref: 2d939268971 +Node: MAP_* Constants9269209 +Ref: library/mmap id19269321 +Ref: 2d949269321 +Ref: library/mmap map-constants9269321 +Ref: 2d6c9269321 +Ref: library/mmap mmap MAP_SHARED9269372 +Ref: 2d6b9269372 +Ref: library/mmap mmap MAP_PRIVATE9269398 +Ref: 2d6a9269398 +Ref: library/mmap mmap MAP_DENYWRITE9269425 +Ref: 2d959269425 +Ref: library/mmap mmap MAP_EXECUTABLE9269454 +Ref: 2d969269454 +Ref: library/mmap mmap MAP_ANON9269484 +Ref: 2d979269484 +Ref: library/mmap mmap MAP_ANONYMOUS9269508 +Ref: 2d989269508 +Ref: library/mmap mmap MAP_POPULATE9269537 +Ref: 13589269537 +Ref: library/mmap mmap MAP_STACK9269565 +Ref: 2d999269565 +Node: Internet Data Handling9269856 +Ref: library/netdata doc9270035 +Ref: 2d9a9270035 +Ref: library/netdata internet-data-handling9270035 +Ref: 2d9b9270035 +Ref: library/netdata netdata9270035 +Ref: 2d9c9270035 +Node: email — An email and MIME handling package9270615 +Ref: library/email doc9270760 +Ref: 2d9d9270760 +Ref: library/email email-an-email-and-mime-handling-package9270760 +Ref: 2d9e9270760 +Ref: library/email module-email9270760 +Ref: 649270760 +Ref: email — An email and MIME handling package-Footnote-19277520 +Ref: email — An email and MIME handling package-Footnote-29277594 +Ref: email — An email and MIME handling package-Footnote-39277653 +Ref: email — An email and MIME handling package-Footnote-49277712 +Ref: email — An email and MIME handling package-Footnote-59277771 +Ref: email — An email and MIME handling package-Footnote-69277830 +Ref: email — An email and MIME handling package-Footnote-79277889 +Ref: email — An email and MIME handling package-Footnote-89277948 +Ref: email — An email and MIME handling package-Footnote-99278007 +Node: email message Representing an email message9278066 +Ref: library/email message doc9278234 +Ref: 2d9f9278234 +Ref: library/email message email-message-representing-an-email-message9278234 +Ref: 2da09278234 +Ref: library/email message module-email message9278234 +Ref: 6d9278234 +Ref: library/email message email message EmailMessage9280722 +Ref: 90c9280722 +Ref: library/email message email message EmailMessage as_string9281203 +Ref: 2da39281203 +Ref: library/email message email message EmailMessage __str__9283047 +Ref: 2da49283047 +Ref: library/email message email message EmailMessage as_bytes9283516 +Ref: 2da59283516 +Ref: library/email message email message EmailMessage __bytes__9284678 +Ref: 2da69284678 +Ref: library/email message email message EmailMessage is_multipart9284854 +Ref: 2da79284854 +Ref: library/email message email message EmailMessage set_unixfrom9285539 +Ref: 2da89285539 +Ref: library/email message email message EmailMessage get_unixfrom9285761 +Ref: 2daa9285761 +Ref: library/email message email message EmailMessage __len__9286893 +Ref: 2dac9286893 +Ref: library/email message email message EmailMessage __contains__9286991 +Ref: 2dad9286991 +Ref: library/email message email message EmailMessage __getitem__9287381 +Ref: 2dae9287381 +Ref: library/email message email message EmailMessage __setitem__9288098 +Ref: 2db19288098 +Ref: library/email message email message EmailMessage __delitem__9289131 +Ref: 2db29289131 +Ref: library/email message email message EmailMessage keys9289357 +Ref: 2dab9289357 +Ref: library/email message email message EmailMessage values9289451 +Ref: 2db39289451 +Ref: library/email message email message EmailMessage items9289541 +Ref: 2db49289541 +Ref: library/email message email message EmailMessage get9289672 +Ref: 2db59289672 +Ref: library/email message email message EmailMessage get_all9290021 +Ref: 2daf9290021 +Ref: library/email message email message EmailMessage add_header9290258 +Ref: 2db69290258 +Ref: library/email message email message EmailMessage replace_header9292222 +Ref: 2db79292222 +Ref: library/email message email message EmailMessage get_content_type9292528 +Ref: 2db89292528 +Ref: library/email message email message EmailMessage get_content_maintype9293412 +Ref: 2dba9293412 +Ref: library/email message email message EmailMessage get_content_subtype9293618 +Ref: 2dbb9293618 +Ref: library/email message email message EmailMessage get_default_type9293811 +Ref: 2db99293811 +Ref: library/email message email message EmailMessage set_default_type9294131 +Ref: 2dbc9294131 +Ref: library/email message email message EmailMessage set_param9294573 +Ref: 2dbd9294573 +Ref: library/email message email message EmailMessage del_param9296187 +Ref: 2dbe9296187 +Ref: library/email message email message EmailMessage get_filename9296623 +Ref: 2dbf9296623 +Ref: library/email message email message EmailMessage get_boundary9297162 +Ref: 2dc19297162 +Ref: library/email message email message EmailMessage set_boundary9297526 +Ref: 2dc29297526 +Ref: library/email message email message EmailMessage get_content_charset9298194 +Ref: 2dc49298194 +Ref: library/email message email message EmailMessage get_charsets9298496 +Ref: 2dc59298496 +Ref: library/email message email message EmailMessage is_attachment9299189 +Ref: 2dc69299189 +Ref: library/email message email message EmailMessage get_content_disposition9299556 +Ref: 2dc89299556 +Ref: library/email message email message EmailMessage walk9300031 +Ref: 2dc99300031 +Ref: library/email message email message EmailMessage get_body9302044 +Ref: 2dca9302044 +Ref: library/email message email message EmailMessage iter_attachments9304163 +Ref: 2dcb9304163 +Ref: library/email message email message EmailMessage iter_parts9305137 +Ref: 2dcc9305137 +Ref: library/email message email message EmailMessage get_content9305350 +Ref: 2dcd9305350 +Ref: library/email message email message EmailMessage set_content9305760 +Ref: 12a79305760 +Ref: library/email message email message EmailMessage make_related9306170 +Ref: 2dd09306170 +Ref: library/email message email message EmailMessage make_alternative9306658 +Ref: 2dd19306658 +Ref: library/email message email message EmailMessage make_mixed9307177 +Ref: 2dd29307177 +Ref: library/email message email message EmailMessage add_related9307716 +Ref: 2dd39307716 +Ref: library/email message email message EmailMessage add_alternative9308473 +Ref: 2dd59308473 +Ref: library/email message email message EmailMessage add_attachment9309163 +Ref: 2dd69309163 +Ref: library/email message email message EmailMessage clear9310148 +Ref: 2dd79310148 +Ref: library/email message email message EmailMessage clear_content9310229 +Ref: 2dd89310229 +Ref: library/email message email message EmailMessage preamble9310489 +Ref: 2dd99310489 +Ref: library/email message email message EmailMessage epilogue9311751 +Ref: 2dda9311751 +Ref: library/email message email message EmailMessage defects9312097 +Ref: 2ddb9312097 +Ref: library/email message email message MIMEPart9312339 +Ref: bd49312339 +Ref: email message Representing an email message-Footnote-19312705 +Ref: email message Representing an email message-Footnote-29312778 +Ref: email message Representing an email message-Footnote-39312975 +Ref: email message Representing an email message-Footnote-49313034 +Ref: email message Representing an email message-Footnote-59313093 +Ref: email message Representing an email message-Footnote-69313152 +Ref: email message Representing an email message-Footnote-79313211 +Ref: email message Representing an email message-Footnote-89313270 +Ref: email message Representing an email message-Footnote-99313329 +Ref: email message Representing an email message-Footnote-109313388 +Ref: email message Representing an email message-Footnote-119313448 +Ref: email message Representing an email message-Footnote-129313508 +Ref: email message Representing an email message-Footnote-139313568 +Node: email parser Parsing email messages9313628 +Ref: library/email parser doc9313846 +Ref: 2ddc9313846 +Ref: library/email parser email-parser-parsing-email-messages9313846 +Ref: 2ddd9313846 +Ref: library/email parser module-email parser9313846 +Ref: 6f9313846 +Ref: email parser Parsing email messages-Footnote-19316231 +Node: FeedParser API9316303 +Ref: library/email parser feedparser-api9316408 +Ref: 2ddf9316408 +Ref: library/email parser email parser BytesFeedParser9317701 +Ref: e7d9317701 +Ref: library/email parser email parser BytesFeedParser feed9318900 +Ref: 2de09318900 +Ref: library/email parser email parser BytesFeedParser close9319335 +Ref: 2de19319335 +Ref: library/email parser email parser FeedParser9319575 +Ref: 2dde9319575 +Node: Parser API9320033 +Ref: library/email parser parser-api9320163 +Ref: 2de29320163 +Ref: library/email parser email parser BytesParser9320891 +Ref: e7e9320891 +Ref: library/email parser email parser BytesParser parse9321558 +Ref: 2de39321558 +Ref: library/email parser email parser BytesParser parsebytes9322598 +Ref: 2de49322598 +Ref: library/email parser email parser BytesHeaderParser9323104 +Ref: d659323104 +Ref: library/email parser email parser Parser9323322 +Ref: e529323322 +Ref: library/email parser email parser Parser parse9323667 +Ref: 2de59323667 +Ref: library/email parser email parser Parser parsestr9324105 +Ref: 2de69324105 +Ref: library/email parser email parser HeaderParser9324534 +Ref: d669324534 +Ref: library/email parser email message_from_bytes9324931 +Ref: e7b9324931 +Ref: library/email parser email message_from_binary_file9325398 +Ref: e7c9325398 +Ref: library/email parser email message_from_string9325871 +Ref: 2de79325871 +Ref: library/email parser email message_from_file9326266 +Ref: 2de89326266 +Ref: Parser API-Footnote-19326996 +Ref: Parser API-Footnote-29327055 +Node: Additional notes9327114 +Ref: library/email parser additional-notes9327221 +Ref: 2de99327221 +Node: email generator Generating MIME documents9328763 +Ref: library/email generator doc9328965 +Ref: 2dea9328965 +Ref: library/email generator email-generator-generating-mime-documents9328965 +Ref: 2deb9328965 +Ref: library/email generator module-email generator9328965 +Ref: 699328965 +Ref: library/email generator email generator BytesGenerator9331088 +Ref: e819331088 +Ref: library/email generator email generator BytesGenerator flatten9332994 +Ref: 2dec9332994 +Ref: library/email generator email generator BytesGenerator clone9334816 +Ref: 2def9334816 +Ref: library/email generator email generator BytesGenerator write9335014 +Ref: 2ded9335014 +Ref: library/email generator email generator Generator9336065 +Ref: e809336065 +Ref: library/email generator email generator Generator flatten9337911 +Ref: 2df09337911 +Ref: library/email generator email generator Generator clone9339671 +Ref: 2df29339671 +Ref: library/email generator email generator Generator write9339856 +Ref: 2df19339856 +Ref: library/email generator email generator DecodedGenerator9340765 +Ref: 9089340765 +Ref: email generator Generating MIME documents-Footnote-19342182 +Ref: email generator Generating MIME documents-Footnote-29342258 +Ref: email generator Generating MIME documents-Footnote-39342747 +Ref: email generator Generating MIME documents-Footnote-49342799 +Ref: email generator Generating MIME documents-Footnote-59342858 +Ref: email generator Generating MIME documents-Footnote-69342910 +Node: email policy Policy Objects9342969 +Ref: library/email policy doc9343177 +Ref: 2df39343177 +Ref: library/email policy email-policy-policy-objects9343177 +Ref: 2df49343177 +Ref: library/email policy module-email policy9343177 +Ref: 709343177 +Ref: library/email policy email policy Policy9349132 +Ref: d5d9349132 +Ref: library/email policy email policy Policy max_line_length9349952 +Ref: 2df59349952 +Ref: library/email policy email policy Policy linesep9350258 +Ref: 2df69350258 +Ref: library/email policy email policy Policy cte_type9350527 +Ref: 2dee9350527 +Ref: library/email policy email policy Policy raise_on_defect9351638 +Ref: 2df89351638 +Ref: library/email policy email policy Policy mangle_from_9351882 +Ref: a779351882 +Ref: library/email policy email policy Policy message_factory9352239 +Ref: 9099352239 +Ref: library/email policy email policy Policy clone9352676 +Ref: d5f9352676 +Ref: library/email policy email policy Policy handle_defect9353150 +Ref: 2dfa9353150 +Ref: library/email policy email policy Policy register_defect9353629 +Ref: 2df99353629 +Ref: library/email policy email policy Policy header_max_count9354322 +Ref: 2dfb9354322 +Ref: library/email policy email policy Policy header_source_parse9355384 +Ref: 2dfc9355384 +Ref: library/email policy email policy Policy header_store_parse9356397 +Ref: 2dfd9356397 +Ref: library/email policy email policy Policy header_fetch_parse9357158 +Ref: 2dfe9357158 +Ref: library/email policy email policy Policy fold9357981 +Ref: 2dff9357981 +Ref: library/email policy email policy Policy fold_binary9358697 +Ref: 2df79358697 +Ref: library/email policy email policy EmailPolicy9359031 +Ref: d619359031 +Ref: library/email policy email policy EmailPolicy utf89359861 +Ref: a799359861 +Ref: library/email policy email policy EmailPolicy refold_source9360257 +Ref: 2e009360257 +Ref: library/email policy email policy EmailPolicy header_factory9361052 +Ref: 2e019361052 +Ref: library/email policy email policy EmailPolicy content_manager9361663 +Ref: bd59361663 +Ref: library/email policy email policy EmailPolicy header_max_count9362372 +Ref: 2e039362372 +Ref: library/email policy email policy EmailPolicy header_source_parse9362578 +Ref: 2e059362578 +Ref: library/email policy email policy EmailPolicy header_store_parse9362963 +Ref: 2e069362963 +Ref: library/email policy email policy EmailPolicy header_fetch_parse9363444 +Ref: 2e079363444 +Ref: library/email policy email policy EmailPolicy fold9363870 +Ref: 2e089363870 +Ref: library/email policy email policy EmailPolicy fold_binary9365033 +Ref: 2e099365033 +Ref: library/email policy email policy default9365852 +Ref: 2da29365852 +Ref: library/email policy email policy SMTP9366062 +Ref: 2e0a9366062 +Ref: library/email policy email policy SMTPUTF89366264 +Ref: 2e0b9366264 +Ref: library/email policy email policy HTTP9366678 +Ref: 2e0c9366678 +Ref: library/email policy email policy strict9366870 +Ref: 2e0d9366870 +Ref: library/email policy email policy Compat329368297 +Ref: d5e9368297 +Ref: library/email policy email policy Compat32 mangle_from_9368828 +Ref: 2e0e9368828 +Ref: library/email policy email policy Compat32 header_source_parse9369016 +Ref: 2e0f9369016 +Ref: library/email policy email policy Compat32 header_store_parse9369401 +Ref: 2e109369401 +Ref: library/email policy email policy Compat32 header_fetch_parse9369507 +Ref: 2e119369507 +Ref: library/email policy email policy Compat32 fold9369749 +Ref: 2e129369749 +Ref: library/email policy email policy Compat32 fold_binary9370092 +Ref: 2e139370092 +Ref: library/email policy email policy compat329370622 +Ref: 90a9370622 +Ref: email policy Policy Objects-Footnote-19370825 +Ref: email policy Policy Objects-Footnote-29370897 +Ref: email policy Policy Objects-Footnote-39370956 +Ref: email policy Policy Objects-Footnote-49371015 +Ref: email policy Policy Objects-Footnote-59371074 +Ref: email policy Policy Objects-Footnote-69371133 +Ref: email policy Policy Objects-Footnote-79371192 +Ref: email policy Policy Objects-Footnote-89371251 +Ref: email policy Policy Objects-Footnote-99371320 +Ref: email policy Policy Objects-Footnote-109371379 +Ref: email policy Policy Objects-Footnote-119371439 +Ref: email policy Policy Objects-Footnote-129371499 +Node: email errors Exception and Defect classes9371559 +Ref: library/email errors doc9371768 +Ref: 2e149371768 +Ref: library/email errors email-errors-exception-and-defect-classes9371768 +Ref: 2e159371768 +Ref: library/email errors module-email errors9371768 +Ref: 689371768 +Ref: library/email errors email errors MessageError9372072 +Ref: 2e169372072 +Ref: library/email errors email errors MessageParseError9372313 +Ref: 2e179372313 +Ref: library/email errors email errors HeaderParseError9372589 +Ref: 2dc39372589 +Ref: library/email errors email errors BoundaryError9373232 +Ref: 2e189373232 +Ref: library/email errors email errors MultipartConversionError9373312 +Ref: 2e199373312 +Ref: email errors Exception and Defect classes-Footnote-19376764 +Ref: email errors Exception and Defect classes-Footnote-29376836 +Node: email headerregistry Custom Header Objects9376895 +Ref: library/email headerregistry doc9377119 +Ref: 2e1c9377119 +Ref: library/email headerregistry email-headerregistry-custom-header-objects9377119 +Ref: 2e1d9377119 +Ref: library/email headerregistry module-email headerregistry9377119 +Ref: 6b9377119 +Ref: library/email headerregistry email headerregistry BaseHeader9378885 +Ref: 2db09378885 +Ref: library/email headerregistry email headerregistry BaseHeader name9379198 +Ref: 2e209379198 +Ref: library/email headerregistry email headerregistry BaseHeader defects9379449 +Ref: 2e219379449 +Ref: library/email headerregistry email headerregistry BaseHeader max_count9379801 +Ref: 2e049379801 +Ref: library/email headerregistry email headerregistry BaseHeader fold9380318 +Ref: 2e229380318 +Ref: library/email headerregistry email headerregistry UnstructuredHeader9382509 +Ref: 2e1f9382509 +Ref: library/email headerregistry email headerregistry DateHeader9383588 +Ref: 2e239383588 +Ref: library/email headerregistry email headerregistry DateHeader datetime9383951 +Ref: 2e249383951 +Ref: library/email headerregistry email headerregistry AddressHeader9385519 +Ref: 2e259385519 +Ref: library/email headerregistry email headerregistry AddressHeader groups9385803 +Ref: 2e269385803 +Ref: library/email headerregistry email headerregistry AddressHeader addresses9386118 +Ref: 2e299386118 +Ref: library/email headerregistry email headerregistry SingleAddressHeader9387280 +Ref: 2e2b9387280 +Ref: library/email headerregistry email headerregistry SingleAddressHeader address9387421 +Ref: 2e2c9387421 +Ref: library/email headerregistry email headerregistry MIMEVersionHeader9387953 +Ref: 2e2d9387953 +Ref: library/email headerregistry email headerregistry MIMEVersionHeader version9388345 +Ref: 2e2e9388345 +Ref: library/email headerregistry email headerregistry MIMEVersionHeader major9388472 +Ref: 2e2f9388472 +Ref: library/email headerregistry email headerregistry MIMEVersionHeader minor9388549 +Ref: 2e309388549 +Ref: library/email headerregistry email headerregistry ParameterizedMIMEHeader9388626 +Ref: 2e319388626 +Ref: library/email headerregistry email headerregistry ParameterizedMIMEHeader params9389009 +Ref: 2e329389009 +Ref: library/email headerregistry email headerregistry ContentTypeHeader9389106 +Ref: 2e339389106 +Ref: library/email headerregistry email headerregistry ContentTypeHeader content_type9389257 +Ref: 2e349389257 +Ref: library/email headerregistry email headerregistry ContentTypeHeader maintype9389363 +Ref: 2e359389363 +Ref: library/email headerregistry email headerregistry ContentTypeHeader subtype9389393 +Ref: 2e369389393 +Ref: library/email headerregistry email headerregistry ContentDispositionHeader9389422 +Ref: 2e379389422 +Ref: library/email headerregistry email headerregistry ContentDispositionHeader content_disposition9389587 +Ref: 2e389389587 +Ref: library/email headerregistry email headerregistry ContentTransferEncoding9389724 +Ref: 2e399389724 +Ref: library/email headerregistry email headerregistry ContentTransferEncoding cte9389839 +Ref: 2e3a9389839 +Ref: library/email headerregistry email headerregistry HeaderRegistry9390008 +Ref: 2e1e9390008 +Ref: library/email headerregistry email headerregistry HeaderRegistry map_to_type9391728 +Ref: 2e3b9391728 +Ref: library/email headerregistry email headerregistry HeaderRegistry __getitem__9392063 +Ref: 2e3c9392063 +Ref: library/email headerregistry email headerregistry HeaderRegistry __call__9392186 +Ref: 2e3d9392186 +Ref: library/email headerregistry email headerregistry Address9392828 +Ref: 2e2a9392828 +Ref: library/email headerregistry email headerregistry Address display_name9393667 +Ref: 2e3e9393667 +Ref: library/email headerregistry email headerregistry Address username9393893 +Ref: 2e3f9393893 +Ref: library/email headerregistry email headerregistry Address domain9394013 +Ref: 2e409394013 +Ref: library/email headerregistry email headerregistry Address addr_spec9394093 +Ref: 2e419394093 +Ref: library/email headerregistry email headerregistry Address __str__9394311 +Ref: 2e429394311 +Ref: library/email headerregistry email headerregistry Group9394750 +Ref: 2e279394750 +Ref: library/email headerregistry email headerregistry Group display_name9395299 +Ref: 2e289395299 +Ref: library/email headerregistry email headerregistry Group addresses9395554 +Ref: 2e439395554 +Ref: library/email headerregistry email headerregistry Group __str__9395702 +Ref: 2e449395702 +Ref: email headerregistry Custom Header Objects-Footnote-19396142 +Ref: email headerregistry Custom Header Objects-Footnote-29396223 +Ref: email headerregistry Custom Header Objects-Footnote-39396291 +Ref: email headerregistry Custom Header Objects-Footnote-49396350 +Ref: email headerregistry Custom Header Objects-Footnote-59396409 +Ref: email headerregistry Custom Header Objects-Footnote-69396468 +Ref: email headerregistry Custom Header Objects-Footnote-79396527 +Ref: email headerregistry Custom Header Objects-Footnote-89396586 +Ref: email headerregistry Custom Header Objects-Footnote-99396645 +Ref: email headerregistry Custom Header Objects-Footnote-109396704 +Ref: email headerregistry Custom Header Objects-Footnote-119396764 +Ref: email headerregistry Custom Header Objects-Footnote-129396824 +Ref: email headerregistry Custom Header Objects-Footnote-139396884 +Ref: email headerregistry Custom Header Objects-Footnote-149396944 +Ref: email headerregistry Custom Header Objects-Footnote-159397004 +Ref: email headerregistry Custom Header Objects-Footnote-169397064 +Ref: email headerregistry Custom Header Objects-Footnote-179397124 +Node: email contentmanager Managing MIME Content9397184 +Ref: library/email contentmanager doc9397381 +Ref: 2e459397381 +Ref: library/email contentmanager email-contentmanager-managing-mime-content9397381 +Ref: 2e469397381 +Ref: library/email contentmanager module-email contentmanager9397381 +Ref: 669397381 +Ref: library/email contentmanager email contentmanager ContentManager9397638 +Ref: 2e479397638 +Ref: library/email contentmanager email contentmanager ContentManager get_content9397927 +Ref: 2dce9397927 +Ref: library/email contentmanager email contentmanager ContentManager set_content9398781 +Ref: 2dcf9398781 +Ref: library/email contentmanager email contentmanager ContentManager add_get_handler9400404 +Ref: 2e499400404 +Ref: library/email contentmanager email contentmanager ContentManager add_set_handler9400596 +Ref: 2e4b9400596 +Ref: email contentmanager Managing MIME Content-Footnote-19400961 +Ref: email contentmanager Managing MIME Content-Footnote-29401042 +Node: Content Manager Instances9401110 +Ref: library/email contentmanager content-manager-instances9401214 +Ref: 2e4d9401214 +Ref: library/email contentmanager email contentmanager raw_data_manager9401554 +Ref: 2e029401554 +Ref: library/email contentmanager email contentmanager get_content9402284 +Ref: 2e4a9402284 +Ref: library/email contentmanager email contentmanager set_content9402883 +Ref: 2e4c9402883 +Ref: Content Manager Instances-Footnote-19407302 +Node: email Examples9407361 +Ref: library/email examples doc9407590 +Ref: 2e4e9407590 +Ref: library/email examples email-examples9407590 +Ref: bd69407590 +Ref: library/email examples id19407590 +Ref: 2e4f9407590 +Ref: email Examples-Footnote-19422168 +Ref: email Examples-Footnote-29422226 +Node: email message Message Representing an email message using the compat32 API9422308 +Ref: library/email compat32-message doc9422550 +Ref: 2e509422550 +Ref: library/email compat32-message compat32-message9422550 +Ref: 2da19422550 +Ref: library/email compat32-message email-message-message-representing-an-email-message-using-the-compat32-api9422550 +Ref: 2e519422550 +Ref: library/email compat32-message email message Message9425107 +Ref: 90b9425107 +Ref: library/email compat32-message email message Message as_string9425640 +Ref: bd09425640 +Ref: library/email compat32-message email message Message __str__9427788 +Ref: 2e529427788 +Ref: library/email compat32-message email message Message as_bytes9427953 +Ref: bd19427953 +Ref: library/email compat32-message email message Message __bytes__9429509 +Ref: bd29429509 +Ref: library/email compat32-message email message Message is_multipart9429714 +Ref: 2dc79429714 +Ref: library/email compat32-message email message Message set_unixfrom9430390 +Ref: 2e539430390 +Ref: library/email compat32-message email message Message get_unixfrom9430530 +Ref: 2e549430530 +Ref: library/email compat32-message email message Message attach9430687 +Ref: 2dd49430687 +Ref: library/email compat32-message email message Message get_payload9431305 +Ref: e7f9431305 +Ref: library/email compat32-message email message Message set_payload9433957 +Ref: 2e559433957 +Ref: library/email compat32-message email message Message set_charset9434425 +Ref: 2e569434425 +Ref: library/email compat32-message email message Message get_charset9436184 +Ref: 2e579436184 +Ref: library/email compat32-message email message Message __len__9437636 +Ref: 2e599437636 +Ref: library/email compat32-message email message Message __contains__9437734 +Ref: 2e5a9437734 +Ref: library/email compat32-message email message Message __getitem__9438104 +Ref: 2e5b9438104 +Ref: library/email compat32-message email message Message __setitem__9438639 +Ref: 2e5d9438639 +Ref: library/email compat32-message email message Message __delitem__9439196 +Ref: 2e5e9439196 +Ref: library/email compat32-message email message Message keys9439422 +Ref: 2e589439422 +Ref: library/email compat32-message email message Message values9439516 +Ref: 2e5f9439516 +Ref: library/email compat32-message email message Message items9439606 +Ref: 2e609439606 +Ref: library/email compat32-message email message Message get9439737 +Ref: 2e619439737 +Ref: library/email compat32-message email message Message get_all9440061 +Ref: 2e5c9440061 +Ref: library/email compat32-message email message Message add_header9440298 +Ref: 2e629440298 +Ref: library/email compat32-message email message Message replace_header9442264 +Ref: 2e639442264 +Ref: library/email compat32-message email message Message get_content_type9442553 +Ref: 2e649442553 +Ref: library/email compat32-message email message Message get_content_maintype9443411 +Ref: 2e669443411 +Ref: library/email compat32-message email message Message get_content_subtype9443617 +Ref: 2e679443617 +Ref: library/email compat32-message email message Message get_default_type9443810 +Ref: 2e659443810 +Ref: library/email compat32-message email message Message set_default_type9444130 +Ref: 2e689444130 +Ref: library/email compat32-message email message Message get_params9444417 +Ref: 2e699444417 +Ref: library/email compat32-message email message Message get_param9445473 +Ref: 2e6a9445473 +Ref: library/email compat32-message email message Message set_param9447475 +Ref: bd39447475 +Ref: library/email compat32-message email message Message del_param9448742 +Ref: 2e6c9448742 +Ref: library/email compat32-message email message Message set_type9449183 +Ref: 2e6d9449183 +Ref: library/email compat32-message email message Message get_filename9450056 +Ref: 2e6e9450056 +Ref: library/email compat32-message email message Message get_boundary9450595 +Ref: 2e6f9450595 +Ref: library/email compat32-message email message Message set_boundary9450959 +Ref: 2e709450959 +Ref: library/email compat32-message email message Message get_content_charset9451774 +Ref: 2e719451774 +Ref: library/email compat32-message email message Message get_charsets9452262 +Ref: 2e729452262 +Ref: library/email compat32-message email message Message get_content_disposition9452964 +Ref: a789452964 +Ref: library/email compat32-message email message Message walk9453327 +Ref: 2e739453327 +Ref: library/email compat32-message email message Message preamble9455447 +Ref: 2e749455447 +Ref: library/email compat32-message email message Message epilogue9456709 +Ref: 2e759456709 +Ref: library/email compat32-message email message Message defects9457107 +Ref: 2e769457107 +Ref: email message Message Representing an email message using the compat32 API-Footnote-19457385 +Ref: email message Message Representing an email message using the compat32 API-Footnote-29457444 +Ref: email message Message Representing an email message using the compat32 API-Footnote-39457503 +Ref: email message Message Representing an email message using the compat32 API-Footnote-49457562 +Ref: email message Message Representing an email message using the compat32 API-Footnote-59457621 +Ref: email message Message Representing an email message using the compat32 API-Footnote-69457680 +Ref: email message Message Representing an email message using the compat32 API-Footnote-79457739 +Ref: email message Message Representing an email message using the compat32 API-Footnote-89457798 +Ref: email message Message Representing an email message using the compat32 API-Footnote-99457857 +Ref: email message Message Representing an email message using the compat32 API-Footnote-109457916 +Ref: email message Message Representing an email message using the compat32 API-Footnote-119457976 +Ref: email message Message Representing an email message using the compat32 API-Footnote-129458036 +Node: email mime Creating email and MIME objects from scratch9458096 +Ref: library/email mime doc9458362 +Ref: 2e779458362 +Ref: library/email mime email-mime-creating-email-and-mime-objects-from-scratch9458362 +Ref: 2e789458362 +Ref: library/email mime module-email mime9458362 +Ref: 6e9458362 +Ref: library/email mime email mime base MIMEBase9459598 +Ref: 2e799459598 +Ref: library/email mime email mime nonmultipart MIMENonMultipart9460741 +Ref: 2e1a9460741 +Ref: library/email mime email mime multipart MIMEMultipart9461233 +Ref: 2e7a9461233 +Ref: library/email mime email mime application MIMEApplication9462546 +Ref: 2e7b9462546 +Ref: library/email mime email mime audio MIMEAudio9463888 +Ref: 2e7c9463888 +Ref: library/email mime email mime image MIMEImage9465449 +Ref: 2e1b9465449 +Ref: library/email mime email mime message MIMEMessage9467090 +Ref: 2e7d9467090 +Ref: library/email mime email mime text MIMEText9467774 +Ref: a7a9467774 +Ref: email mime Creating email and MIME objects from scratch-Footnote-19469412 +Node: email header Internationalized headers9469480 +Ref: library/email header doc9469713 +Ref: 2e7e9469713 +Ref: library/email header email-header-internationalized-headers9469713 +Ref: 2e7f9469713 +Ref: library/email header module-email header9469713 +Ref: 6a9469713 +Ref: library/email header email header Header9472410 +Ref: 12a99472410 +Ref: library/email header email header Header append9474282 +Ref: 2e809474282 +Ref: library/email header email header Header encode9475616 +Ref: 2e819475616 +Ref: library/email header email header Header __str__9477257 +Ref: 2e829477257 +Ref: library/email header email header Header __eq__9477756 +Ref: 2e839477756 +Ref: library/email header email header Header __ne__9477892 +Ref: 2e849477892 +Ref: library/email header email header decode_header9478116 +Ref: d629478116 +Ref: library/email header email header make_header9478772 +Ref: d639478772 +Ref: email header Internationalized headers-Footnote-19479469 +Ref: email header Internationalized headers-Footnote-29479541 +Ref: email header Internationalized headers-Footnote-39479600 +Ref: email header Internationalized headers-Footnote-49479658 +Ref: email header Internationalized headers-Footnote-59479717 +Ref: email header Internationalized headers-Footnote-69479776 +Ref: email header Internationalized headers-Footnote-79479835 +Ref: email header Internationalized headers-Footnote-89479894 +Ref: email header Internationalized headers-Footnote-99479953 +Ref: email header Internationalized headers-Footnote-109480012 +Ref: email header Internationalized headers-Footnote-119480072 +Ref: email header Internationalized headers-Footnote-129480132 +Ref: email header Internationalized headers-Footnote-139480192 +Ref: email header Internationalized headers-Footnote-149480252 +Ref: email header Internationalized headers-Footnote-159480312 +Node: email charset Representing character sets9480372 +Ref: library/email charset doc9480573 +Ref: 2e859480573 +Ref: library/email charset email-charset-representing-character-sets9480573 +Ref: 2e869480573 +Ref: library/email charset module-email charset9480573 +Ref: 659480573 +Ref: library/email charset email charset Charset9481384 +Ref: a7b9481384 +Ref: library/email charset email charset Charset input_charset9482909 +Ref: 2e879482909 +Ref: library/email charset email charset Charset header_encoding9483165 +Ref: 2e889483165 +Ref: library/email charset email charset Charset body_encoding9483551 +Ref: 2e899483551 +Ref: library/email charset email charset Charset output_charset9483828 +Ref: 2e8a9483828 +Ref: library/email charset email charset Charset input_codec9484167 +Ref: 2e8b9484167 +Ref: library/email charset email charset Charset output_codec9484381 +Ref: 2e8c9484381 +Ref: library/email charset email charset Charset get_body_encoding9484693 +Ref: 2e8d9484693 +Ref: library/email charset email charset Charset get_output_charset9485410 +Ref: 2e8e9485410 +Ref: library/email charset email charset Charset header_encode9485614 +Ref: 2e8f9485614 +Ref: library/email charset email charset Charset header_encode_lines9485822 +Ref: 2e909485822 +Ref: library/email charset email charset Charset body_encode9486255 +Ref: 2e919486255 +Ref: library/email charset email charset Charset __str__9486587 +Ref: 2e929486587 +Ref: library/email charset email charset Charset __eq__9486752 +Ref: 2e939486752 +Ref: library/email charset email charset Charset __ne__9486888 +Ref: 2e949486888 +Ref: library/email charset email charset add_charset9487182 +Ref: 2e959487182 +Ref: library/email charset email charset add_alias9488507 +Ref: 2e979488507 +Ref: library/email charset email charset add_codec9488833 +Ref: 2e969488833 +Ref: email charset Representing character sets-Footnote-19489227 +Node: email encoders Encoders9489300 +Ref: library/email encoders doc9489498 +Ref: 2e989489498 +Ref: library/email encoders email-encoders-encoders9489498 +Ref: 2e999489498 +Ref: library/email encoders module-email encoders9489498 +Ref: 679489498 +Ref: library/email encoders email encoders encode_quopri9491185 +Ref: 2e9a9491185 +Ref: library/email encoders email encoders encode_base649491513 +Ref: 2e9b9491513 +Ref: library/email encoders email encoders encode_7or8bit9491909 +Ref: 2e9c9491909 +Ref: library/email encoders email encoders encode_noop9492169 +Ref: 2e9d9492169 +Ref: email encoders Encoders-Footnote-19492349 +Ref: email encoders Encoders-Footnote-29492423 +Node: email utils Miscellaneous utilities9492540 +Ref: library/email utils doc9492722 +Ref: 2e9e9492722 +Ref: library/email utils email-utils-miscellaneous-utilities9492722 +Ref: 2e9f9492722 +Ref: library/email utils module-email utils9492722 +Ref: 719492722 +Ref: library/email utils email utils localtime9493018 +Ref: d699493018 +Ref: library/email utils email utils make_msgid9493841 +Ref: 2ea09493841 +Ref: library/email utils email utils quote9494738 +Ref: 2ea19494738 +Ref: library/email utils email utils unquote9494917 +Ref: 2dc09494917 +Ref: library/email utils email utils parseaddr9495187 +Ref: 2ea29495187 +Ref: library/email utils email utils formataddr9495546 +Ref: e4f9495546 +Ref: library/email utils email utils getaddresses9496227 +Ref: 12a89496227 +Ref: library/email utils email utils parsedate9496865 +Ref: 2ea39496865 +Ref: library/email utils email utils parsedate_tz9497494 +Ref: 127c9497494 +Ref: library/email utils email utils parsedate_to_datetime9498073 +Ref: d689498073 +Ref: library/email utils email utils mktime_tz9498951 +Ref: 2ea49498951 +Ref: library/email utils email utils formatdate9499188 +Ref: 2ea59499188 +Ref: library/email utils email utils format_datetime9500134 +Ref: d679500134 +Ref: library/email utils email utils decode_rfc22319500822 +Ref: 2ea69500822 +Ref: library/email utils email utils encode_rfc22319500922 +Ref: 2ea79500922 +Ref: library/email utils email utils collapse_rfc2231_value9501330 +Ref: 2e6b9501330 +Ref: library/email utils email utils decode_params9502184 +Ref: 2ea89502184 +Ref: email utils Miscellaneous utilities-Footnote-19502440 +Ref: email utils Miscellaneous utilities-Footnote-29502511 +Ref: email utils Miscellaneous utilities-Footnote-39502570 +Ref: email utils Miscellaneous utilities-Footnote-49502629 +Ref: email utils Miscellaneous utilities-Footnote-59502688 +Ref: email utils Miscellaneous utilities-Footnote-69502747 +Ref: email utils Miscellaneous utilities-Footnote-79503020 +Ref: email utils Miscellaneous utilities-Footnote-89503079 +Ref: email utils Miscellaneous utilities-Footnote-99503138 +Ref: email utils Miscellaneous utilities-Footnote-109503197 +Ref: email utils Miscellaneous utilities-Footnote-119503257 +Ref: email utils Miscellaneous utilities-Footnote-129503317 +Node: email iterators Iterators9503377 +Ref: library/email iterators doc9503527 +Ref: 2ea99503527 +Ref: library/email iterators email-iterators-iterators9503527 +Ref: 2eaa9503527 +Ref: library/email iterators module-email iterators9503527 +Ref: 6c9503527 +Ref: library/email iterators email iterators body_line_iterator9503927 +Ref: 2eab9503927 +Ref: library/email iterators email iterators typed_subpart_iterator9504504 +Ref: 2eac9504504 +Ref: library/email iterators email iterators _structure9505222 +Ref: 2ead9505222 +Ref: email iterators Iterators-Footnote-19506802 +Node: json — JSON encoder and decoder9506878 +Ref: library/json doc9507083 +Ref: 2eae9507083 +Ref: library/json json-json-encoder-and-decoder9507083 +Ref: 2eaf9507083 +Ref: library/json module-json9507083 +Ref: a29507083 +Ref: json — JSON encoder and decoder-Footnote-19511117 +Ref: json — JSON encoder and decoder-Footnote-29511190 +Ref: json — JSON encoder and decoder-Footnote-39511215 +Ref: json — JSON encoder and decoder-Footnote-49511274 +Ref: json — JSON encoder and decoder-Footnote-59511333 +Ref: json — JSON encoder and decoder-Footnote-69511424 +Ref: json — JSON encoder and decoder-Footnote-79511473 +Ref: json — JSON encoder and decoder-Footnote-89511735 +Node: Basic Usage9511761 +Ref: library/json basic-usage9511872 +Ref: 2eb19511872 +Ref: library/json json dump9511915 +Ref: 9be9511915 +Ref: library/json json dumps9515448 +Ref: 9bf9515448 +Ref: library/json json load9516273 +Ref: 9239516273 +Ref: library/json json loads9519150 +Ref: 5a69519150 +Ref: Basic Usage-Footnote-19519980 +Node: Encoders and Decoders9520012 +Ref: library/json encoders-and-decoders9520146 +Ref: 2eb49520146 +Ref: library/json json JSONDecoder9520209 +Ref: 9c19520209 +Ref: library/json json-to-py-table9520463 +Ref: 2eb39520463 +Ref: library/json json JSONDecoder decode9523371 +Ref: 2eb59523371 +Ref: library/json json JSONDecoder raw_decode9523623 +Ref: 2eb69523623 +Ref: library/json json JSONEncoder9523987 +Ref: 9c09523987 +Ref: library/json py-to-json-table9524288 +Ref: 2eb29524288 +Ref: library/json json JSONEncoder default9528599 +Ref: 2eb79528599 +Ref: library/json json JSONEncoder encode9529303 +Ref: 2eb89529303 +Ref: library/json json JSONEncoder iterencode9529548 +Ref: 2eb99529548 +Ref: Encoders and Decoders-Footnote-19529845 +Node: Exceptions<14>9529877 +Ref: library/json exceptions9530040 +Ref: 2eba9530040 +Ref: library/json json JSONDecodeError9530081 +Ref: aa49530081 +Ref: library/json json JSONDecodeError msg9530222 +Ref: 2ebb9530222 +Ref: library/json json JSONDecodeError doc9530289 +Ref: 2ebc9530289 +Ref: library/json json JSONDecodeError pos9530357 +Ref: 2ebd9530357 +Ref: library/json json JSONDecodeError lineno9530440 +Ref: 2ebe9530440 +Ref: library/json json JSONDecodeError colno9530512 +Ref: 2ebf9530512 +Node: Standard Compliance and Interoperability9530611 +Ref: library/json standard-compliance-and-interoperability9530778 +Ref: 2ec09530778 +Ref: Standard Compliance and Interoperability-Footnote-19531928 +Ref: Standard Compliance and Interoperability-Footnote-29531987 +Node: Character Encodings9532078 +Ref: library/json character-encodings9532213 +Ref: 2ec19532213 +Node: Infinite and NaN Number Values9533544 +Ref: library/json infinite-and-nan-number-values9533719 +Ref: 2ec29533719 +Node: Repeated Names Within an Object9534507 +Ref: library/json repeated-names-within-an-object9534700 +Ref: 2ec39534700 +Node: Top-level Non-Object Non-Array Values9535223 +Ref: library/json top-level-non-object-non-array-values9535412 +Ref: 2ec49535412 +Ref: Top-level Non-Object Non-Array Values-Footnote-19536066 +Ref: Top-level Non-Object Non-Array Values-Footnote-29536125 +Node: Implementation Limitations9536184 +Ref: library/json implementation-limitations9536333 +Ref: 2ec59536333 +Node: Command Line Interface<2>9537283 +Ref: library/json command-line-interface9537427 +Ref: 2ec69537427 +Ref: library/json json-commandline9537427 +Ref: 2eb09537427 +Ref: library/json module-json tool9537427 +Ref: a39537427 +Ref: Command Line Interface<2>-Footnote-19538355 +Node: Command line options<2>9538424 +Ref: library/json command-line-options9538509 +Ref: 2ec89538509 +Ref: library/json cmdoption-json tool-arg-infile9538572 +Ref: 2ec99538572 +Ref: library/json cmdoption-json-tool-arg-infile9538572 +Ref: 2eca9538572 +Ref: library/json cmdoption-json tool-arg-outfile9539056 +Ref: 2ecb9539056 +Ref: library/json cmdoption-json-tool-arg-outfile9539056 +Ref: 2ecc9539056 +Ref: library/json cmdoption-json tool-sort-keys9539199 +Ref: 2ec79539199 +Ref: library/json cmdoption-json-tool-sort-keys9539199 +Ref: 2ecd9539199 +Ref: library/json cmdoption-json tool-no-ensure-ascii9539319 +Ref: 2ece9539319 +Ref: library/json cmdoption-json-tool-no-ensure-ascii9539319 +Ref: 2ecf9539319 +Ref: library/json cmdoption-json tool-json-lines9539488 +Ref: 2ed09539488 +Ref: library/json cmdoption-json-tool-json-lines9539488 +Ref: 2ed19539488 +Ref: library/json cmdoption-json tool-indent9539602 +Ref: 2ed29539602 +Ref: library/json cmdoption-json-tool-indent9539602 +Ref: 2ed39539602 +Ref: library/json cmdoption-json tool-tab9539602 +Ref: 2ed49539602 +Ref: library/json cmdoption-json-tool-tab9539602 +Ref: 2ed59539602 +Ref: library/json cmdoption-json tool-no-indent9539602 +Ref: 2ed69539602 +Ref: library/json cmdoption-json-tool-no-indent9539602 +Ref: 2ed79539602 +Ref: library/json cmdoption-json tool-compact9539602 +Ref: 2ed89539602 +Ref: library/json cmdoption-json-tool-compact9539602 +Ref: 2ed99539602 +Ref: library/json cmdoption-json tool-h9539746 +Ref: 2eda9539746 +Ref: library/json cmdoption-json-tool-h9539746 +Ref: 2edb9539746 +Ref: library/json cmdoption-json tool-help9539746 +Ref: 2edc9539746 +Ref: library/json cmdoption-json-tool-help9539746 +Ref: 2edd9539746 +Node: mailbox — Manipulate mailboxes in various formats9539807 +Ref: library/mailbox doc9540009 +Ref: 2ede9540009 +Ref: library/mailbox mailbox-manipulate-mailboxes-in-various-formats9540009 +Ref: 2edf9540009 +Ref: library/mailbox module-mailbox9540009 +Ref: ac9540009 +Ref: mailbox — Manipulate mailboxes in various formats-Footnote-19540901 +Node: Mailbox objects9540968 +Ref: library/mailbox id19541095 +Ref: 2ee09541095 +Ref: library/mailbox mailbox-objects9541095 +Ref: 2ee19541095 +Ref: library/mailbox mailbox Mailbox9541154 +Ref: f0b9541154 +Ref: library/mailbox mailbox Mailbox add9543956 +Ref: f0a9543956 +Ref: library/mailbox mailbox Mailbox remove9544746 +Ref: 2ee29544746 +Ref: library/mailbox mailbox Mailbox __delitem__9544776 +Ref: 2ee79544776 +Ref: library/mailbox mailbox Mailbox discard9544811 +Ref: 2ee39544811 +Ref: library/mailbox mailbox Mailbox __setitem__9545356 +Ref: 2ee89545356 +Ref: library/mailbox mailbox Mailbox iterkeys9546239 +Ref: 2ee99546239 +Ref: library/mailbox mailbox Mailbox keys9546268 +Ref: 2eea9546268 +Ref: library/mailbox mailbox Mailbox itervalues9546453 +Ref: 2eeb9546453 +Ref: library/mailbox mailbox Mailbox __iter__9546484 +Ref: 2eec9546484 +Ref: library/mailbox mailbox Mailbox values9546513 +Ref: 2eed9546513 +Ref: library/mailbox mailbox Mailbox iteritems9547152 +Ref: 2eee9547152 +Ref: library/mailbox mailbox Mailbox items9547182 +Ref: 2eef9547182 +Ref: library/mailbox mailbox Mailbox get9547705 +Ref: 2ef09547705 +Ref: library/mailbox mailbox Mailbox __getitem__9547746 +Ref: 2ef19547746 +Ref: library/mailbox mailbox Mailbox get_message9548332 +Ref: 2ef29548332 +Ref: library/mailbox mailbox Mailbox get_bytes9548620 +Ref: f0d9548620 +Ref: library/mailbox mailbox Mailbox get_string9548853 +Ref: f0e9548853 +Ref: library/mailbox mailbox Mailbox get_file9549192 +Ref: f0c9549192 +Ref: library/mailbox mailbox Mailbox __contains__9550167 +Ref: 2ef39550167 +Ref: library/mailbox mailbox Mailbox __len__9550301 +Ref: 2ef49550301 +Ref: library/mailbox mailbox Mailbox clear9550384 +Ref: 2ef59550384 +Ref: library/mailbox mailbox Mailbox pop9550460 +Ref: 2ef69550460 +Ref: library/mailbox mailbox Mailbox popitem9550903 +Ref: 2ef79550903 +Ref: library/mailbox mailbox Mailbox update9551424 +Ref: 2ef89551424 +Ref: library/mailbox mailbox Mailbox flush9552142 +Ref: 2ef99552142 +Ref: library/mailbox mailbox Mailbox lock9552433 +Ref: 2ee49552433 +Ref: library/mailbox mailbox Mailbox unlock9552852 +Ref: 2ee59552852 +Ref: library/mailbox mailbox Mailbox close9552932 +Ref: 2efb9552932 +Node: Maildir9553184 +Ref: library/mailbox mailbox-maildir9553256 +Ref: 2efc9553256 +Ref: library/mailbox maildir9553256 +Ref: 2efd9553256 +Ref: library/mailbox mailbox Maildir9553299 +Ref: fb39553299 +Ref: library/mailbox mailbox Maildir list_folders9556148 +Ref: 2eff9556148 +Ref: library/mailbox mailbox Maildir get_folder9556236 +Ref: 2f009556236 +Ref: library/mailbox mailbox Maildir add_folder9556476 +Ref: 2f029556476 +Ref: library/mailbox mailbox Maildir remove_folder9556633 +Ref: 2f039556633 +Ref: library/mailbox mailbox Maildir clean9556875 +Ref: 2f059556875 +Ref: library/mailbox mailbox Maildir add9557215 +Ref: 2f069557215 +Ref: library/mailbox mailbox Maildir __setitem__9557246 +Ref: 2f079557246 +Ref: library/mailbox mailbox Maildir update9557290 +Ref: 2f089557290 +Ref: library/mailbox mailbox Maildir flush9557703 +Ref: 2f099557703 +Ref: library/mailbox mailbox Maildir lock9557838 +Ref: 2f0a9557838 +Ref: library/mailbox mailbox Maildir unlock9557863 +Ref: 2f0b9557863 +Ref: library/mailbox mailbox Maildir close9557996 +Ref: 2f0c9557996 +Ref: library/mailbox mailbox Maildir get_file9558193 +Ref: 2f0d9558193 +Ref: Maildir-Footnote-19558729 +Ref: Maildir-Footnote-29558778 +Node: mbox9558822 +Ref: library/mailbox mailbox-mbox9558905 +Ref: 2f0e9558905 +Ref: library/mailbox mbox9558905 +Ref: 2f0f9558905 +Ref: library/mailbox mailbox mbox9558942 +Ref: 2ee69558942 +Ref: library/mailbox mailbox mbox get_file9560378 +Ref: 2f109560378 +Ref: library/mailbox mailbox mbox lock9560591 +Ref: 2f119560591 +Ref: library/mailbox mailbox mbox unlock9560616 +Ref: 2f129560616 +Ref: mbox-Footnote-19561193 +Ref: mbox-Footnote-29561253 +Ref: mbox-Footnote-39561305 +Node: MH9561383 +Ref: library/mailbox mailbox-mh9561464 +Ref: 2f139561464 +Ref: library/mailbox mh9561464 +Ref: 2f149561464 +Ref: library/mailbox mailbox MH9561497 +Ref: 2f159561497 +Ref: library/mailbox mailbox MH list_folders9562943 +Ref: 2f179562943 +Ref: library/mailbox mailbox MH get_folder9563031 +Ref: 2f189563031 +Ref: library/mailbox mailbox MH add_folder9563268 +Ref: 2f199563268 +Ref: library/mailbox mailbox MH remove_folder9563422 +Ref: 2f1a9563422 +Ref: library/mailbox mailbox MH get_sequences9563664 +Ref: 2f1b9563664 +Ref: library/mailbox mailbox MH set_sequences9563841 +Ref: 2f1c9563841 +Ref: library/mailbox mailbox MH pack9564079 +Ref: 2f1d9564079 +Ref: library/mailbox mailbox MH remove9564500 +Ref: 2f1e9564500 +Ref: library/mailbox mailbox MH __delitem__9564530 +Ref: 2f1f9564530 +Ref: library/mailbox mailbox MH discard9564565 +Ref: 2f209564565 +Ref: library/mailbox mailbox MH lock9564774 +Ref: 2f219564774 +Ref: library/mailbox mailbox MH unlock9564799 +Ref: 2f229564799 +Ref: library/mailbox mailbox MH get_file9565174 +Ref: 2f239565174 +Ref: library/mailbox mailbox MH flush9565366 +Ref: 2f249565366 +Ref: library/mailbox mailbox MH close9565496 +Ref: 2f259565496 +Ref: MH-Footnote-19565963 +Ref: MH-Footnote-29565998 +Node: Babyl9566043 +Ref: library/mailbox babyl9566124 +Ref: 2f269566124 +Ref: library/mailbox mailbox-babyl9566124 +Ref: 2f279566124 +Ref: library/mailbox mailbox Babyl9566163 +Ref: 2f289566163 +Ref: library/mailbox mailbox Babyl get_labels9567732 +Ref: 2f2a9567732 +Ref: library/mailbox mailbox Babyl get_file9568265 +Ref: 2f2b9568265 +Ref: library/mailbox mailbox Babyl lock9568785 +Ref: 2f2c9568785 +Ref: library/mailbox mailbox Babyl unlock9568810 +Ref: 2f2d9568810 +Ref: Babyl-Footnote-19569204 +Ref: Babyl-Footnote-29569248 +Node: MMDF9569326 +Ref: library/mailbox mailbox-mmdf9569396 +Ref: 2f2e9569396 +Ref: library/mailbox mmdf9569396 +Ref: 2f2f9569396 +Ref: library/mailbox mailbox MMDF9569433 +Ref: 2f309569433 +Ref: library/mailbox mailbox MMDF get_file9570696 +Ref: 2f329570696 +Ref: library/mailbox mailbox MMDF lock9570909 +Ref: 2f339570909 +Ref: library/mailbox mailbox MMDF unlock9570934 +Ref: 2f349570934 +Ref: MMDF-Footnote-19571371 +Ref: MMDF-Footnote-29571431 +Node: Message objects9571474 +Ref: library/mailbox mailbox-message-objects9571624 +Ref: 2f359571624 +Ref: library/mailbox message-objects9571624 +Ref: 2f369571624 +Ref: library/mailbox mailbox Message9571683 +Ref: f0f9571683 +Ref: Message objects-Footnote-19573729 +Node: MaildirMessage9573788 +Ref: library/mailbox mailbox-maildirmessage9573874 +Ref: 2f379573874 +Ref: library/mailbox maildirmessage9573874 +Ref: 2f389573874 +Ref: library/mailbox mailbox MaildirMessage9573931 +Ref: 2efe9573931 +Ref: library/mailbox mailbox MaildirMessage get_subdir9575787 +Ref: 2f399575787 +Ref: library/mailbox mailbox MaildirMessage set_subdir9576304 +Ref: 2f3a9576304 +Ref: library/mailbox mailbox MaildirMessage get_flags9576475 +Ref: 2f3b9576475 +Ref: library/mailbox mailbox MaildirMessage set_flags9576947 +Ref: 2f3c9576947 +Ref: library/mailbox mailbox MaildirMessage add_flag9577051 +Ref: 2f3d9577051 +Ref: library/mailbox mailbox MaildirMessage remove_flag9577401 +Ref: 2f3e9577401 +Ref: library/mailbox mailbox MaildirMessage get_date9577756 +Ref: 2f3f9577756 +Ref: library/mailbox mailbox MaildirMessage set_date9577912 +Ref: 2f409577912 +Ref: library/mailbox mailbox MaildirMessage get_info9578077 +Ref: 2f419578077 +Ref: library/mailbox mailbox MaildirMessage set_info9578300 +Ref: 2f429578300 +Node: mboxMessage9581118 +Ref: library/mailbox mailbox-mboxmessage9581222 +Ref: 2f439581222 +Ref: library/mailbox mboxmessage9581222 +Ref: 2f449581222 +Ref: library/mailbox mailbox mboxMessage9581273 +Ref: 2da99581273 +Ref: library/mailbox mailbox mboxMessage get_from9583075 +Ref: 2f459583075 +Ref: library/mailbox mailbox mboxMessage set_from9583306 +Ref: 2f469583306 +Ref: library/mailbox mailbox mboxMessage get_flags9583842 +Ref: 2f479583842 +Ref: library/mailbox mailbox mboxMessage set_flags9584190 +Ref: 2f489584190 +Ref: library/mailbox mailbox mboxMessage add_flag9584481 +Ref: 2f499584481 +Ref: library/mailbox mailbox mboxMessage remove_flag9584701 +Ref: 2f4a9584701 +Node: MHMessage9587702 +Ref: library/mailbox mailbox-mhmessage9587804 +Ref: 2f4b9587804 +Ref: library/mailbox mhmessage9587804 +Ref: 2f4c9587804 +Ref: library/mailbox mailbox MHMessage9587853 +Ref: 2f169587853 +Ref: library/mailbox mailbox MHMessage get_sequences9588819 +Ref: 2f4d9588819 +Ref: library/mailbox mailbox MHMessage set_sequences9588942 +Ref: 2f4e9588942 +Ref: library/mailbox mailbox MHMessage add_sequence9589050 +Ref: 2f4f9589050 +Ref: library/mailbox mailbox MHMessage remove_sequence9589180 +Ref: 2f509589180 +Node: BabylMessage9591066 +Ref: library/mailbox babylmessage9591168 +Ref: 2f519591168 +Ref: library/mailbox mailbox-babylmessage9591168 +Ref: 2f529591168 +Ref: library/mailbox mailbox BabylMessage9591223 +Ref: 2f299591223 +Ref: library/mailbox mailbox BabylMessage get_labels9592591 +Ref: 2f539592591 +Ref: library/mailbox mailbox BabylMessage set_labels9592674 +Ref: 2f549592674 +Ref: library/mailbox mailbox BabylMessage add_label9592774 +Ref: 2f559592774 +Ref: library/mailbox mailbox BabylMessage remove_label9592871 +Ref: 2f569592871 +Ref: library/mailbox mailbox BabylMessage get_visible9592976 +Ref: 2f579592976 +Ref: library/mailbox mailbox BabylMessage set_visible9593144 +Ref: 2f589593144 +Ref: library/mailbox mailbox BabylMessage update_visible9593494 +Ref: 2f599593494 +Node: MMDFMessage9595962 +Ref: library/mailbox mailbox-mmdfmessage9596046 +Ref: 2f5a9596046 +Ref: library/mailbox mmdfmessage9596046 +Ref: 2f5b9596046 +Ref: library/mailbox mailbox MMDFMessage9596099 +Ref: 2f319596099 +Ref: library/mailbox mailbox MMDFMessage get_from9597785 +Ref: 2f5c9597785 +Ref: library/mailbox mailbox MMDFMessage set_from9598016 +Ref: 2f5d9598016 +Ref: library/mailbox mailbox MMDFMessage get_flags9598552 +Ref: 2f5e9598552 +Ref: library/mailbox mailbox MMDFMessage set_flags9598900 +Ref: 2f5f9598900 +Ref: library/mailbox mailbox MMDFMessage add_flag9599191 +Ref: 2f609599191 +Ref: library/mailbox mailbox MMDFMessage remove_flag9599411 +Ref: 2f619599411 +Node: Exceptions<15>9602418 +Ref: library/mailbox exceptions9602565 +Ref: 2f629602565 +Ref: library/mailbox mailbox Error9602687 +Ref: 2f639602687 +Ref: library/mailbox mailbox NoSuchMailboxError9602781 +Ref: 2f019602781 +Ref: library/mailbox mailbox NotEmptyError9603087 +Ref: 2f049603087 +Ref: library/mailbox mailbox ExternalClashError9603249 +Ref: 2efa9603249 +Ref: library/mailbox mailbox FormatError9603562 +Ref: 2f649603562 +Node: Examples<22>9603759 +Ref: library/mailbox examples9603882 +Ref: 2f659603882 +Ref: library/mailbox mailbox-examples9603882 +Ref: 2f669603882 +Node: mimetypes — Map filenames to MIME types9606160 +Ref: library/mimetypes doc9606382 +Ref: 2f679606382 +Ref: library/mimetypes mimetypes-map-filenames-to-mime-types9606382 +Ref: 2f689606382 +Ref: library/mimetypes module-mimetypes9606382 +Ref: b09606382 +Ref: library/mimetypes mimetypes guess_type9607269 +Ref: 13c49607269 +Ref: library/mimetypes mimetypes guess_all_extensions9608596 +Ref: 12929608596 +Ref: library/mimetypes mimetypes guess_extension9609161 +Ref: 2f699609161 +Ref: library/mimetypes mimetypes init9609865 +Ref: 13c59609865 +Ref: library/mimetypes mimetypes read_mime_types9610841 +Ref: 13509610841 +Ref: library/mimetypes mimetypes add_type9611218 +Ref: 2f6b9611218 +Ref: library/mimetypes mimetypes inited9611675 +Ref: 2f6c9611675 +Ref: library/mimetypes mimetypes knownfiles9611845 +Ref: 2f6a9611845 +Ref: library/mimetypes mimetypes suffix_map9612055 +Ref: 2f6d9612055 +Ref: library/mimetypes mimetypes encodings_map9612405 +Ref: 2f6e9612405 +Ref: library/mimetypes mimetypes types_map9612504 +Ref: 2f6f9612504 +Ref: library/mimetypes mimetypes common_types9612595 +Ref: 2f709612595 +Ref: mimetypes — Map filenames to MIME types-Footnote-19613137 +Ref: mimetypes — Map filenames to MIME types-Footnote-29613206 +Node: MimeTypes Objects9613277 +Ref: library/mimetypes id19613372 +Ref: 2f719613372 +Ref: library/mimetypes mimetypes-objects9613372 +Ref: 2f729613372 +Ref: library/mimetypes mimetypes MimeTypes9613621 +Ref: 2f739613621 +Ref: library/mimetypes mimetypes MimeTypes suffix_map9614307 +Ref: 2f769614307 +Ref: library/mimetypes mimetypes MimeTypes encodings_map9614789 +Ref: 2f779614789 +Ref: library/mimetypes mimetypes MimeTypes types_map9615002 +Ref: 2f789615002 +Ref: library/mimetypes mimetypes MimeTypes types_map_inv9615338 +Ref: 2f799615338 +Ref: library/mimetypes mimetypes MimeTypes guess_extension9615688 +Ref: 2f7a9615688 +Ref: library/mimetypes mimetypes MimeTypes guess_type9615866 +Ref: 14709615866 +Ref: library/mimetypes mimetypes MimeTypes guess_all_extensions9616033 +Ref: 2f7b9616033 +Ref: library/mimetypes mimetypes MimeTypes read9616221 +Ref: 2f749616221 +Ref: library/mimetypes mimetypes MimeTypes readfp9616534 +Ref: 2f759616534 +Ref: library/mimetypes mimetypes MimeTypes read_windows_registry9616865 +Ref: 2f7c9616865 +Node: base64 — Base16 Base32 Base64 Base85 Data Encodings9617207 +Ref: library/base64 doc9617423 +Ref: 2f7d9617423 +Ref: library/base64 base64-base16-base32-base64-base85-data-encodings9617423 +Ref: 2f7e9617423 +Ref: library/base64 module-base649617423 +Ref: d9617423 +Ref: library/base64 base64 b64encode9619293 +Ref: 2f7f9619293 +Ref: library/base64 base64 b64decode9619843 +Ref: 13c69619843 +Ref: library/base64 base64 standard_b64encode9620789 +Ref: 2f809620789 +Ref: library/base64 base64 standard_b64decode9620962 +Ref: 2f819620962 +Ref: library/base64 base64 urlsafe_b64encode9621151 +Ref: 2f829621151 +Ref: library/base64 base64 urlsafe_b64decode9621491 +Ref: 2f839621491 +Ref: library/base64 base64 b32encode9621808 +Ref: 2f849621808 +Ref: library/base64 base64 b32decode9621954 +Ref: cd19621954 +Ref: library/base64 base64 b32hexencode9622944 +Ref: 3d59622944 +Ref: library/base64 base64 b32hexdecode9623120 +Ref: 3d69623120 +Ref: library/base64 base64 b16encode9623566 +Ref: 2f859623566 +Ref: library/base64 base64 b16decode9623712 +Ref: 2f869623712 +Ref: library/base64 base64 a85encode9624195 +Ref: bb59624195 +Ref: library/base64 base64 a85decode9625158 +Ref: bb69625158 +Ref: library/base64 base64 b85encode9626023 +Ref: bb79626023 +Ref: library/base64 base64 b85decode9626375 +Ref: bb89626375 +Ref: library/base64 base64 decode9626639 +Ref: 2f879626639 +Ref: library/base64 base64 decodebytes9626947 +Ref: 5a49626947 +Ref: library/base64 base64 encode9627175 +Ref: 2f889627175 +Ref: library/base64 base64 encodebytes9627695 +Ref: 5a39627695 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-19628431 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-29628497 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-39628556 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-49628615 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-59628674 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-69628733 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-79628792 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-89628851 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-99628910 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-109628969 +Ref: base64 — Base16 Base32 Base64 Base85 Data Encodings-Footnote-119629029 +Node: Security Considerations<2>9629089 +Ref: library/base64 base64-security9629205 +Ref: 2f899629205 +Ref: library/base64 security-considerations9629205 +Ref: 2f8a9629205 +Ref: Security Considerations<2>-Footnote-19629866 +Ref: Security Considerations<2>-Footnote-29629925 +Node: binascii — Convert between binary and ASCII9629984 +Ref: library/binascii doc9630214 +Ref: 2f8b9630214 +Ref: library/binascii binascii-convert-between-binary-and-ascii9630214 +Ref: 2f8c9630214 +Ref: library/binascii module-binascii9630214 +Ref: f9630214 +Ref: library/binascii binascii a2b_uu9631231 +Ref: 2f8d9631231 +Ref: library/binascii binascii b2a_uu9631481 +Ref: 7769631481 +Ref: library/binascii binascii a2b_base649631860 +Ref: 13f99631860 +Ref: library/binascii binascii b2a_base649632550 +Ref: 8f09632550 +Ref: library/binascii binascii a2b_qp9632900 +Ref: 2f8e9632900 +Ref: library/binascii binascii b2a_qp9633197 +Ref: 2f8f9633197 +Ref: library/binascii binascii crc_hqx9633965 +Ref: 2fc9633965 +Ref: library/binascii binascii crc329634270 +Ref: 120b9634270 +Ref: library/binascii binascii b2a_hex9634945 +Ref: 1e749634945 +Ref: library/binascii binascii hexlify9635009 +Ref: 14129635009 +Ref: library/binascii binascii a2b_hex9636206 +Ref: 1e759636206 +Ref: library/binascii binascii unhexlify9636246 +Ref: 14859636246 +Ref: library/binascii binascii Error9636774 +Ref: cd29636774 +Ref: library/binascii binascii Incomplete9636878 +Ref: 2f909636878 +Ref: binascii — Convert between binary and ASCII-Footnote-19637410 +Ref: binascii — Convert between binary and ASCII-Footnote-29637469 +Ref: binascii — Convert between binary and ASCII-Footnote-39637528 +Node: quopri — Encode and decode MIME quoted-printable data9637587 +Ref: library/quopri doc9637755 +Ref: 2f919637755 +Ref: library/quopri module-quopri9637755 +Ref: d89637755 +Ref: library/quopri quopri-encode-and-decode-mime-quoted-printable-data9637755 +Ref: 2f929637755 +Ref: library/quopri quopri decode9638490 +Ref: 1e779638490 +Ref: library/quopri quopri encode9639029 +Ref: 1e769639029 +Ref: library/quopri quopri decodestring9639685 +Ref: 2f939639685 +Ref: library/quopri quopri encodestring9639882 +Ref: 2f949639882 +Ref: quopri — Encode and decode MIME quoted-printable data-Footnote-19640332 +Ref: quopri — Encode and decode MIME quoted-printable data-Footnote-29640398 +Ref: quopri — Encode and decode MIME quoted-printable data-Footnote-39640457 +Ref: quopri — Encode and decode MIME quoted-printable data-Footnote-49640516 +Ref: quopri — Encode and decode MIME quoted-printable data-Footnote-59640575 +Node: Structured Markup Processing Tools9640634 +Ref: library/markup doc9640802 +Ref: 2f959640802 +Ref: library/markup markup9640802 +Ref: 2f969640802 +Ref: library/markup structured-markup-processing-tools9640802 +Ref: 2f979640802 +Node: html — HyperText Markup Language support9642345 +Ref: library/html doc9642511 +Ref: 2f989642511 +Ref: library/html html-hypertext-markup-language-support9642511 +Ref: 2f999642511 +Ref: library/html module-html9642511 +Ref: 8b9642511 +Ref: library/html html escape9642777 +Ref: cb19642777 +Ref: library/html html unescape9643248 +Ref: 5a99643248 +Ref: html — HyperText Markup Language support-Footnote-19643949 +Node: html parser — Simple HTML and XHTML parser9644022 +Ref: library/html parser doc9644251 +Ref: 2f9a9644251 +Ref: library/html parser html-parser-simple-html-and-xhtml-parser9644251 +Ref: 2f9b9644251 +Ref: library/html parser module-html parser9644251 +Ref: 8d9644251 +Ref: library/html parser html parser HTMLParser9644627 +Ref: 4999644627 +Ref: html parser — Simple HTML and XHTML parser-Footnote-19645745 +Node: Example HTML Parser Application9645816 +Ref: library/html parser example-html-parser-application9645955 +Ref: 2f9c9645955 +Node: HTMLParser Methods9647161 +Ref: library/html parser htmlparser-methods9647321 +Ref: 2f9d9647321 +Ref: library/html parser html parser HTMLParser feed9647448 +Ref: 2f9e9647448 +Ref: library/html parser html parser HTMLParser close9647715 +Ref: 2f9f9647715 +Ref: library/html parser html parser HTMLParser reset9648076 +Ref: 2fa09648076 +Ref: library/html parser html parser HTMLParser getpos9648219 +Ref: 2fa19648219 +Ref: library/html parser html parser HTMLParser get_starttag_text9648298 +Ref: 2fa29648298 +Ref: library/html parser html parser HTMLParser handle_starttag9648869 +Ref: 2fa49648869 +Ref: library/html parser html parser HTMLParser handle_endtag9649673 +Ref: 2fa59649673 +Ref: library/html parser html parser HTMLParser handle_startendtag9649880 +Ref: 2fa39649880 +Ref: library/html parser html parser HTMLParser handle_data9650293 +Ref: 2fa69650293 +Ref: library/html parser html parser HTMLParser handle_entityref9650495 +Ref: 2fa79650495 +Ref: library/html parser html parser HTMLParser handle_charref9650799 +Ref: 2fa89650799 +Ref: library/html parser html parser HTMLParser handle_comment9651245 +Ref: 2fa99651245 +Ref: library/html parser html parser HTMLParser handle_decl9651771 +Ref: 2faa9651771 +Ref: library/html parser html parser HTMLParser handle_pi9652055 +Ref: 2fab9652055 +Ref: library/html parser html parser HTMLParser unknown_decl9652745 +Ref: 2fac9652745 +Node: Examples<23>9653107 +Ref: library/html parser examples9653227 +Ref: 2fad9653227 +Ref: library/html parser htmlparser-examples9653227 +Ref: 2fae9653227 +Node: html entities — Definitions of HTML general entities9656636 +Ref: library/html entities doc9656845 +Ref: 2faf9656845 +Ref: library/html entities html-entities-definitions-of-html-general-entities9656845 +Ref: 2fb09656845 +Ref: library/html entities module-html entities9656845 +Ref: 8c9656845 +Ref: library/html entities html entities html59657226 +Ref: d7d9657226 +Ref: library/html entities html entities entitydefs9657711 +Ref: 2fb39657711 +Ref: library/html entities html entities name2codepoint9657850 +Ref: 2fb19657850 +Ref: library/html entities html entities codepoint2name9657970 +Ref: 2fb29657970 +Ref: html entities — Definitions of HTML general entities-Footnote-19658117 +Ref: html entities — Definitions of HTML general entities-Footnote-29658190 +Node: XML Processing Modules9658296 +Ref: library/xml doc9658510 +Ref: 2fb49658510 +Ref: library/xml module-xml9658510 +Ref: 13e9658510 +Ref: library/xml xml9658510 +Ref: 2fb59658510 +Ref: library/xml xml-processing-modules9658510 +Ref: 2fb69658510 +Ref: XML Processing Modules-Footnote-19659970 +Node: XML vulnerabilities9660031 +Ref: library/xml id19660140 +Ref: 2fb99660140 +Ref: library/xml xml-vulnerabilities9660140 +Ref: 2fb79660140 +Ref: XML vulnerabilities-Footnote-19665342 +Ref: XML vulnerabilities-Footnote-29665405 +Ref: XML vulnerabilities-Footnote-39665458 +Ref: XML vulnerabilities-Footnote-49665511 +Ref: XML vulnerabilities-Footnote-59665574 +Ref: XML vulnerabilities-Footnote-69665621 +Node: The defusedxml Package9665666 +Ref: library/xml defusedxml-package9665775 +Ref: 2fb89665775 +Ref: library/xml the-defusedxml-package9665775 +Ref: 2fba9665775 +Ref: The defusedxml Package-Footnote-19666231 +Node: xml etree ElementTree — The ElementTree XML API9666276 +Ref: library/xml etree elementtree doc9666477 +Ref: 2fbb9666477 +Ref: library/xml etree elementtree dtd9666477 +Ref: 2fbc9666477 +Ref: library/xml etree elementtree module-xml etree ElementTree9666477 +Ref: 1429666477 +Ref: library/xml etree elementtree xml-etree-elementtree-the-elementtree-xml-api9666477 +Ref: 2fbd9666477 +Ref: xml etree ElementTree — The ElementTree XML API-Footnote-19667391 +Node: Tutorial<2>9667473 +Ref: library/xml etree elementtree tutorial9667592 +Ref: 2fbe9667592 +Node: XML tree and elements9668018 +Ref: library/xml etree elementtree xml-tree-and-elements9668107 +Ref: 2fbf9668107 +Node: Parsing XML9668685 +Ref: library/xml etree elementtree elementtree-parsing-xml9668816 +Ref: 2fc09668816 +Ref: library/xml etree elementtree parsing-xml9668816 +Ref: 2fc19668816 +Node: Pull API for non-blocking parsing9671272 +Ref: library/xml etree elementtree elementtree-pull-parsing9671410 +Ref: c969671410 +Ref: library/xml etree elementtree pull-api-for-non-blocking-parsing9671410 +Ref: 2fc39671410 +Node: Finding interesting elements9673307 +Ref: library/xml etree elementtree finding-interesting-elements9673455 +Ref: 2fc69673455 +Node: Modifying an XML File9674696 +Ref: library/xml etree elementtree modifying-an-xml-file9674833 +Ref: 2fcb9674833 +Node: Building XML documents9677777 +Ref: library/xml etree elementtree building-xml-documents9677913 +Ref: 2fcf9677913 +Node: Parsing XML with Namespaces9678282 +Ref: library/xml etree elementtree parsing-xml-with-namespaces9678388 +Ref: 2fd19678388 +Ref: Parsing XML with Namespaces-Footnote-19680703 +Ref: Parsing XML with Namespaces-Footnote-29680755 +Node: XPath support9680807 +Ref: library/xml etree elementtree elementtree-xpath9680947 +Ref: 8109680947 +Ref: library/xml etree elementtree xpath-support9680947 +Ref: 2fd29680947 +Ref: XPath support-Footnote-19681308 +Node: Example<9>9681344 +Ref: library/xml etree elementtree example9681435 +Ref: 2fd39681435 +Node: Supported XPath syntax9682454 +Ref: library/xml etree elementtree supported-xpath-syntax9682545 +Ref: 2fd49682545 +Node: Reference<3>9687520 +Ref: library/xml etree elementtree reference9687665 +Ref: 2fd59687665 +Node: Functions<8>9687743 +Ref: library/xml etree elementtree elementtree-functions9687804 +Ref: 2fd69687804 +Ref: library/xml etree elementtree functions9687804 +Ref: 2fd79687804 +Ref: library/xml etree elementtree xml etree ElementTree canonicalize9687845 +Ref: 2fd89687845 +Ref: library/xml etree elementtree xml etree ElementTree Comment9690227 +Ref: 2fd99690227 +Ref: library/xml etree elementtree xml etree ElementTree dump9690912 +Ref: 2fda9690912 +Ref: library/xml etree elementtree xml etree ElementTree fromstring9691386 +Ref: 2fc29691386 +Ref: library/xml etree elementtree xml etree ElementTree fromstringlist9691745 +Ref: e839691745 +Ref: library/xml etree elementtree xml etree ElementTree indent9692163 +Ref: 2fdc9692163 +Ref: library/xml etree elementtree xml etree ElementTree iselement9692689 +Ref: 2fdd9692689 +Ref: library/xml etree elementtree xml etree ElementTree iterparse9692903 +Ref: cbd9692903 +Ref: library/xml etree elementtree xml etree ElementTree parse9694763 +Ref: 2fde9694763 +Ref: library/xml etree elementtree xml etree ElementTree ProcessingInstruction9695107 +Ref: 2fdf9695107 +Ref: library/xml etree elementtree xml etree ElementTree register_namespace9695840 +Ref: e849695840 +Ref: library/xml etree elementtree xml etree ElementTree SubElement9696269 +Ref: 2fd09696269 +Ref: library/xml etree elementtree xml etree ElementTree tostring9696839 +Ref: c979696839 +Ref: library/xml etree elementtree xml etree ElementTree tostringlist9697918 +Ref: c989697918 +Ref: library/xml etree elementtree xml etree ElementTree XML9699167 +Ref: 2fdb9699167 +Ref: library/xml etree elementtree xml etree ElementTree XMLID9699561 +Ref: 2fe09699561 +Ref: Functions<8>-Footnote-19700036 +Ref: Functions<8>-Footnote-29700077 +Ref: Functions<8>-Footnote-39700386 +Node: XInclude support9700695 +Ref: library/xml etree elementtree elementtree-xinclude9700839 +Ref: 2fe19700839 +Ref: library/xml etree elementtree xinclude-support9700839 +Ref: 2fe29700839 +Ref: XInclude support-Footnote-19701199 +Node: Example<10>9701239 +Ref: library/xml etree elementtree id39701303 +Ref: 2fe39701303 +Node: Reference<4>9703117 +Ref: library/xml etree elementtree id49703240 +Ref: 2fe49703240 +Node: Functions<9>9703482 +Ref: library/xml etree elementtree elementinclude-functions9703567 +Ref: 2fe59703567 +Ref: library/xml etree elementtree id59703567 +Ref: 2fe69703567 +Ref: library/xml etree elementtree xml etree ElementInclude default_loader9703608 +Ref: 2fe79703608 +Ref: library/xml etree elementtree xml etree ElementInclude include9704195 +Ref: 2fe89704195 +Node: Element Objects9705196 +Ref: library/xml etree elementtree element-objects9705309 +Ref: 2fe99705309 +Ref: library/xml etree elementtree elementtree-element-objects9705309 +Ref: 2fea9705309 +Ref: library/xml etree elementtree xml etree ElementTree Element9705362 +Ref: 59e9705362 +Ref: library/xml etree elementtree xml etree ElementTree Element tag9705844 +Ref: 2feb9705844 +Ref: library/xml etree elementtree xml etree ElementTree Element text9705989 +Ref: 2fc99705989 +Ref: library/xml etree elementtree xml etree ElementTree Element tail9706014 +Ref: 2fec9706014 +Ref: library/xml etree elementtree xml etree ElementTree Element attrib9707129 +Ref: 2fed9707129 +Ref: library/xml etree elementtree xml etree ElementTree Element clear9707673 +Ref: 2fee9707673 +Ref: library/xml etree elementtree xml etree ElementTree Element get9707866 +Ref: 2fca9707866 +Ref: library/xml etree elementtree xml etree ElementTree Element items9708054 +Ref: 2fef9708054 +Ref: library/xml etree elementtree xml etree ElementTree Element keys9708223 +Ref: 2ff09708223 +Ref: library/xml etree elementtree xml etree ElementTree Element set9708365 +Ref: 2fcc9708365 +Ref: library/xml etree elementtree xml etree ElementTree Element append9708538 +Ref: 2fcd9708538 +Ref: library/xml etree elementtree xml etree ElementTree Element extend9708774 +Ref: e859708774 +Ref: library/xml etree elementtree xml etree ElementTree Element find9709024 +Ref: 2fc89709024 +Ref: library/xml etree elementtree xml etree ElementTree Element findall9709446 +Ref: 2fc79709446 +Ref: library/xml etree elementtree xml etree ElementTree Element findtext9709865 +Ref: 2ff19709865 +Ref: library/xml etree elementtree xml etree ElementTree Element insert9710469 +Ref: 2ff29710469 +Ref: library/xml etree elementtree xml etree ElementTree Element iter9710680 +Ref: ff19710680 +Ref: library/xml etree elementtree xml etree ElementTree Element iterfind9711171 +Ref: e869711171 +Ref: library/xml etree elementtree xml etree ElementTree Element itertext9711503 +Ref: e879711503 +Ref: library/xml etree elementtree xml etree ElementTree Element makeelement9711726 +Ref: 2ff39711726 +Ref: library/xml etree elementtree xml etree ElementTree Element remove9711949 +Ref: 2fce9711949 +Ref: Element Objects-Footnote-19714512 +Node: ElementTree Objects9714555 +Ref: library/xml etree elementtree elementtree-elementtree-objects9714669 +Ref: 2ff49714669 +Ref: library/xml etree elementtree elementtree-objects9714669 +Ref: 2ff59714669 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree9714730 +Ref: 59d9714730 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree _setroot9715082 +Ref: 2ff69715082 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree find9715331 +Ref: 2ff79715331 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree findall9715470 +Ref: 2ff89715470 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree findtext9715615 +Ref: 2ff99715615 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree getroot9715776 +Ref: 2ffa9715776 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree iter9715856 +Ref: 2ffb9715856 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree iterfind9716126 +Ref: 2ffc9716126 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree parse9716303 +Ref: 2ffd9716303 +Ref: library/xml etree elementtree xml etree ElementTree ElementTree write9716648 +Ref: c999716648 +Ref: ElementTree Objects-Footnote-19719417 +Node: QName Objects9719726 +Ref: library/xml etree elementtree elementtree-qname-objects9719844 +Ref: 2ffe9719844 +Ref: library/xml etree elementtree qname-objects9719844 +Ref: 2fff9719844 +Ref: library/xml etree elementtree xml etree ElementTree QName9719893 +Ref: 30009719893 +Node: TreeBuilder Objects9720406 +Ref: library/xml etree elementtree elementtree-treebuilder-objects9720522 +Ref: 30019720522 +Ref: library/xml etree elementtree treebuilder-objects9720522 +Ref: 30029720522 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder9720583 +Ref: 6a49720583 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder close9721701 +Ref: 30039721701 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder data9721863 +Ref: 30049721863 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder end9722027 +Ref: e889722027 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder start9722160 +Ref: 139c9722160 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder comment9722362 +Ref: 30059722362 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder pi9722558 +Ref: 30069722558 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder doctype9722869 +Ref: 6f09722869 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder start_ns9723193 +Ref: 30079723193 +Ref: library/xml etree elementtree xml etree ElementTree TreeBuilder end_ns9723587 +Ref: 30089723587 +Ref: library/xml etree elementtree xml etree ElementTree C14NWriterTarget9723834 +Ref: 30099723834 +Ref: TreeBuilder Objects-Footnote-19724382 +Node: XMLParser Objects9724423 +Ref: library/xml etree elementtree elementtree-xmlparser-objects9724547 +Ref: 300a9724547 +Ref: library/xml etree elementtree xmlparser-objects9724547 +Ref: 300b9724547 +Ref: library/xml etree elementtree xml etree ElementTree XMLParser9724604 +Ref: 6a39724604 +Ref: library/xml etree elementtree xml etree ElementTree XMLParser close9725316 +Ref: 300d9725316 +Ref: library/xml etree elementtree xml etree ElementTree XMLParser feed9725572 +Ref: 300c9725572 +Ref: XMLParser Objects-Footnote-19727449 +Node: XMLPullParser Objects9727758 +Ref: library/xml etree elementtree elementtree-xmlpullparser-objects9727877 +Ref: 300e9727877 +Ref: library/xml etree elementtree xmlpullparser-objects9727877 +Ref: 300f9727877 +Ref: library/xml etree elementtree xml etree ElementTree XMLPullParser9727942 +Ref: c959727942 +Ref: library/xml etree elementtree xml etree ElementTree XMLPullParser feed9728634 +Ref: 2fc49728634 +Ref: library/xml etree elementtree xml etree ElementTree XMLPullParser close9728716 +Ref: 30109728716 +Ref: library/xml etree elementtree xml etree ElementTree XMLPullParser read_events9729027 +Ref: 2fc59729027 +Node: Exceptions<16>9730761 +Ref: library/xml etree elementtree exceptions9730854 +Ref: 30119730854 +Ref: library/xml etree elementtree xml etree ElementTree ParseError9730897 +Ref: f309730897 +Ref: library/xml etree elementtree xml etree ElementTree ParseError code9731225 +Ref: 30129731225 +Ref: library/xml etree elementtree xml etree ElementTree ParseError position9731430 +Ref: 30139731430 +Node: xml dom — The Document Object Model API9731555 +Ref: library/xml dom doc9731780 +Ref: 30149731780 +Ref: library/xml dom module-xml dom9731780 +Ref: 13f9731780 +Ref: library/xml dom xml-dom-the-document-object-model-api9731780 +Ref: 30159731780 +Ref: xml dom — The Document Object Model API-Footnote-19735254 +Ref: xml dom — The Document Object Model API-Footnote-29735331 +Ref: xml dom — The Document Object Model API-Footnote-39735397 +Ref: xml dom — The Document Object Model API-Footnote-49735444 +Node: Module Contents<4>9735490 +Ref: library/xml dom module-contents9735613 +Ref: 30189735613 +Ref: library/xml dom xml dom registerDOMImplementation9735723 +Ref: 30199735723 +Ref: library/xml dom xml dom getDOMImplementation9736171 +Ref: 30169736171 +Ref: library/xml dom xml dom EMPTY_NAMESPACE9737080 +Ref: 301a9737080 +Ref: library/xml dom xml dom XML_NAMESPACE9737353 +Ref: 301b9737353 +Ref: library/xml dom xml dom XMLNS_NAMESPACE9737510 +Ref: 301c9737510 +Ref: library/xml dom xml dom XHTML_NAMESPACE9737696 +Ref: 301d9737696 +Ref: Module Contents<4>-Footnote-19738431 +Ref: Module Contents<4>-Footnote-29738476 +Ref: Module Contents<4>-Footnote-39738533 +Node: Objects in the DOM9738571 +Ref: library/xml dom dom-objects9738714 +Ref: 301e9738714 +Ref: library/xml dom objects-in-the-dom9738714 +Ref: 301f9738714 +Node: DOMImplementation Objects9743249 +Ref: library/xml dom dom-implementation-objects9743350 +Ref: 30209743350 +Ref: library/xml dom domimplementation-objects9743350 +Ref: 302a9743350 +Ref: library/xml dom xml dom DOMImplementation hasFeature9743706 +Ref: 302b9743706 +Ref: library/xml dom xml dom DOMImplementation createDocument9743885 +Ref: 302c9743885 +Ref: library/xml dom xml dom DOMImplementation createDocumentType9744405 +Ref: 302d9744405 +Node: Node Objects9744713 +Ref: library/xml dom dom-node-objects9744839 +Ref: 30219744839 +Ref: library/xml dom node-objects9744839 +Ref: 302e9744839 +Ref: library/xml dom xml dom Node nodeType9744956 +Ref: 302f9744956 +Ref: library/xml dom xml dom Node parentNode9745379 +Ref: 30309745379 +Ref: library/xml dom xml dom Node attributes9745788 +Ref: 30319745788 +Ref: library/xml dom xml dom Node previousSibling9746001 +Ref: 30329746001 +Ref: library/xml dom xml dom Node nextSibling9746487 +Ref: 30339746487 +Ref: library/xml dom xml dom Node childNodes9746753 +Ref: 30349746753 +Ref: library/xml dom xml dom Node firstChild9746872 +Ref: 30359746872 +Ref: library/xml dom xml dom Node lastChild9747009 +Ref: 30369747009 +Ref: library/xml dom xml dom Node localName9747144 +Ref: 30379747144 +Ref: library/xml dom xml dom Node prefix9747308 +Ref: 30389747308 +Ref: library/xml dom xml dom Node namespaceURI9747476 +Ref: 30399747476 +Ref: library/xml dom xml dom Node nodeName9747639 +Ref: 303a9747639 +Ref: library/xml dom xml dom Node nodeValue9748076 +Ref: 303b9748076 +Ref: library/xml dom xml dom Node hasAttributes9748310 +Ref: 303c9748310 +Ref: library/xml dom xml dom Node hasChildNodes9748401 +Ref: 303d9748401 +Ref: library/xml dom xml dom Node isSameNode9748493 +Ref: 303e9748493 +Ref: library/xml dom xml dom Node appendChild9749122 +Ref: 303f9749122 +Ref: library/xml dom xml dom Node insertBefore9749330 +Ref: 30409749330 +Ref: library/xml dom xml dom Node removeChild9749671 +Ref: 30419749671 +Ref: library/xml dom xml dom Node replaceChild9749959 +Ref: 30429749959 +Ref: library/xml dom xml dom Node normalize9750173 +Ref: 30439750173 +Ref: library/xml dom xml dom Node cloneNode9750390 +Ref: 30449750390 +Node: NodeList Objects9750534 +Ref: library/xml dom dom-nodelist-objects9750655 +Ref: 30229750655 +Ref: library/xml dom nodelist-objects9750655 +Ref: 30459750655 +Ref: library/xml dom xml dom NodeList item9751136 +Ref: 30469751136 +Ref: library/xml dom xml dom NodeList length9751366 +Ref: 30479751366 +Node: DocumentType Objects9752036 +Ref: library/xml dom documenttype-objects9752161 +Ref: 30489752161 +Ref: library/xml dom dom-documenttype-objects9752161 +Ref: 30239752161 +Ref: library/xml dom xml dom DocumentType publicId9752794 +Ref: 30499752794 +Ref: library/xml dom xml dom DocumentType systemId9752960 +Ref: 304a9752960 +Ref: library/xml dom xml dom DocumentType internalSubset9753136 +Ref: 304b9753136 +Ref: library/xml dom xml dom DocumentType name9753389 +Ref: 304c9753389 +Ref: library/xml dom xml dom DocumentType entities9753518 +Ref: 304d9753518 +Ref: library/xml dom xml dom DocumentType notations9753901 +Ref: 304e9753901 +Node: Document Objects9754280 +Ref: library/xml dom document-objects9754407 +Ref: 304f9754407 +Ref: library/xml dom dom-document-objects9754407 +Ref: 30249754407 +Ref: library/xml dom xml dom Document documentElement9754654 +Ref: 30509754654 +Ref: library/xml dom xml dom Document createElement9754748 +Ref: 30519754748 +Ref: library/xml dom xml dom Document createElementNS9755037 +Ref: 30529755037 +Ref: library/xml dom xml dom Document createTextNode9755388 +Ref: 30539755388 +Ref: library/xml dom xml dom Document createComment9755607 +Ref: 30549755607 +Ref: library/xml dom xml dom Document createProcessingInstruction9755828 +Ref: 30559755828 +Ref: library/xml dom xml dom Document createAttribute9756100 +Ref: 30569756100 +Ref: library/xml dom xml dom Document createAttributeNS9756407 +Ref: 30579756407 +Ref: library/xml dom xml dom Document getElementsByTagName9756795 +Ref: 30589756795 +Ref: library/xml dom xml dom Document getElementsByTagNameNS9756971 +Ref: 30599756971 +Node: Element Objects<2>9757242 +Ref: library/xml dom dom-element-objects9757361 +Ref: 30259757361 +Ref: library/xml dom element-objects9757361 +Ref: 305a9757361 +Ref: library/xml dom xml dom Element tagName9757502 +Ref: 305b9757502 +Ref: library/xml dom xml dom Element getElementsByTagName9757649 +Ref: 305c9757649 +Ref: library/xml dom xml dom Element getElementsByTagNameNS9757762 +Ref: 305d9757762 +Ref: library/xml dom xml dom Element hasAttribute9757893 +Ref: 305e9757893 +Ref: library/xml dom xml dom Element hasAttributeNS9758007 +Ref: 305f9758007 +Ref: library/xml dom xml dom Element getAttribute9758171 +Ref: 30609758171 +Ref: library/xml dom xml dom Element getAttributeNode9758384 +Ref: 30619758384 +Ref: library/xml dom xml dom Element getAttributeNS9758505 +Ref: 30629758505 +Ref: library/xml dom xml dom Element getAttributeNodeNS9758763 +Ref: 30639758763 +Ref: library/xml dom xml dom Element removeAttribute9758917 +Ref: 30649758917 +Ref: library/xml dom xml dom Element removeAttributeNode9759075 +Ref: 30669759075 +Ref: library/xml dom xml dom Element removeAttributeNS9759267 +Ref: 30679759267 +Ref: library/xml dom xml dom Element setAttribute9759476 +Ref: 30689759476 +Ref: library/xml dom xml dom Element setAttributeNode9759568 +Ref: 30699759568 +Ref: library/xml dom xml dom Element setAttributeNodeNS9759912 +Ref: 306b9759912 +Ref: library/xml dom xml dom Element setAttributeNS9760285 +Ref: 306c9760285 +Node: Attr Objects9760521 +Ref: library/xml dom attr-objects9760644 +Ref: 306d9760644 +Ref: library/xml dom dom-attr-objects9760644 +Ref: 30269760644 +Ref: library/xml dom xml dom Attr name9760759 +Ref: 306e9760759 +Ref: library/xml dom xml dom Attr localName9760871 +Ref: 306f9760871 +Ref: library/xml dom xml dom Attr prefix9761025 +Ref: 30709761025 +Ref: library/xml dom xml dom Attr value9761145 +Ref: 30719761145 +Node: NamedNodeMap Objects9761270 +Ref: library/xml dom dom-attributelist-objects9761390 +Ref: 30729761390 +Ref: library/xml dom namednodemap-objects9761390 +Ref: 30739761390 +Ref: library/xml dom xml dom NamedNodeMap length9761509 +Ref: 30749761509 +Ref: library/xml dom xml dom NamedNodeMap item9761585 +Ref: 30759761585 +Node: Comment Objects9762066 +Ref: library/xml dom comment-objects9762203 +Ref: 30769762203 +Ref: library/xml dom dom-comment-objects9762203 +Ref: 30279762203 +Ref: library/xml dom xml dom Comment data9762375 +Ref: 30779762375 +Node: Text and CDATASection Objects9762593 +Ref: library/xml dom dom-text-objects9762739 +Ref: 30289762739 +Ref: library/xml dom text-and-cdatasection-objects9762739 +Ref: 30789762739 +Ref: library/xml dom xml dom Text data9763235 +Ref: 30799763235 +Node: ProcessingInstruction Objects9763728 +Ref: library/xml dom dom-pi-objects9763873 +Ref: 30299763873 +Ref: library/xml dom processinginstruction-objects9763873 +Ref: 307a9763873 +Ref: library/xml dom xml dom ProcessingInstruction target9764085 +Ref: 307b9764085 +Ref: library/xml dom xml dom ProcessingInstruction data9764253 +Ref: 307c9764253 +Node: Exceptions<17>9764391 +Ref: library/xml dom dom-exceptions9764498 +Ref: 307d9764498 +Ref: library/xml dom exceptions9764498 +Ref: 307e9764498 +Ref: library/xml dom xml dom DOMException9765177 +Ref: 307f9765177 +Ref: library/xml dom xml dom DomstringSizeErr9765339 +Ref: 30809765339 +Ref: library/xml dom xml dom HierarchyRequestErr9765594 +Ref: 30819765594 +Ref: library/xml dom xml dom IndexSizeErr9765733 +Ref: 30829765733 +Ref: library/xml dom xml dom InuseAttributeErr9765875 +Ref: 306a9765875 +Ref: library/xml dom xml dom InvalidAccessErr9766039 +Ref: 30839766039 +Ref: library/xml dom xml dom InvalidCharacterErr9766172 +Ref: 30849766172 +Ref: library/xml dom xml dom InvalidModificationErr9766532 +Ref: 30859766532 +Ref: library/xml dom xml dom InvalidStateErr9766646 +Ref: 30869766646 +Ref: library/xml dom xml dom NamespaceErr9766789 +Ref: 30879766789 +Ref: library/xml dom xml dom NotFoundErr9766998 +Ref: 30659766998 +Ref: library/xml dom xml dom NotSupportedErr9767229 +Ref: 30889767229 +Ref: library/xml dom xml dom NoDataAllowedErr9767371 +Ref: 30899767371 +Ref: library/xml dom xml dom NoModificationAllowedErr9767499 +Ref: 308a9767499 +Ref: library/xml dom xml dom SyntaxErr9767665 +Ref: 308b9767665 +Ref: library/xml dom xml dom WrongDocumentErr9767760 +Ref: 308c9767760 +Ref: Exceptions<17>-Footnote-19770801 +Node: Conformance9770846 +Ref: library/xml dom conformance9770962 +Ref: 308d9770962 +Ref: library/xml dom dom-conformance9770962 +Ref: 30179770962 +Node: Type Mapping9771219 +Ref: library/xml dom dom-type-mapping9771304 +Ref: 308e9771304 +Ref: library/xml dom type-mapping9771304 +Ref: 308f9771304 +Node: Accessor Methods9772129 +Ref: library/xml dom accessor-methods9772214 +Ref: 30909772214 +Ref: library/xml dom dom-accessor-methods9772214 +Ref: 30919772214 +Node: xml dom minidom — Minimal DOM implementation9774090 +Ref: library/xml dom minidom doc9774324 +Ref: 30929774324 +Ref: library/xml dom minidom module-xml dom minidom9774324 +Ref: 1409774324 +Ref: library/xml dom minidom xml-dom-minidom-minimal-dom-implementation9774324 +Ref: 30939774324 +Ref: library/xml dom minidom xml dom minidom parse9775667 +Ref: 30949775667 +Ref: library/xml dom minidom xml dom minidom parseString9776236 +Ref: 30959776236 +Ref: xml dom minidom — Minimal DOM implementation-Footnote-19778810 +Ref: xml dom minidom — Minimal DOM implementation-Footnote-29778886 +Node: DOM Objects9778933 +Ref: library/xml dom minidom dom-objects9779047 +Ref: 30969779047 +Ref: library/xml dom minidom minidom-objects9779047 +Ref: 30979779047 +Ref: library/xml dom minidom xml dom minidom Node unlink9779282 +Ref: 30989779282 +Ref: library/xml dom minidom xml dom minidom Node writexml9780058 +Ref: 30999780058 +Ref: library/xml dom minidom xml dom minidom Node toxml9781298 +Ref: 309a9781298 +Ref: library/xml dom minidom xml dom minidom Node toprettyxml9782107 +Ref: 309b9782107 +Ref: DOM Objects-Footnote-19782848 +Node: DOM Example9783251 +Ref: library/xml dom minidom dom-example9783402 +Ref: 309c9783402 +Ref: library/xml dom minidom id29783402 +Ref: 309d9783402 +Node: minidom and the DOM standard9785434 +Ref: library/xml dom minidom minidom-and-dom9785565 +Ref: 309e9785565 +Ref: library/xml dom minidom minidom-and-the-dom-standard9785565 +Ref: 309f9785565 +Node: xml dom pulldom — Support for building partial DOM trees9788206 +Ref: library/xml dom pulldom doc9788435 +Ref: 30a09788435 +Ref: library/xml dom pulldom module-xml dom pulldom9788435 +Ref: 1419788435 +Ref: library/xml dom pulldom xml-dom-pulldom-support-for-building-partial-dom-trees9788435 +Ref: 30a19788435 +Ref: library/xml dom pulldom xml dom pulldom PullDom9791190 +Ref: 30a39791190 +Ref: library/xml dom pulldom xml dom pulldom SAX2DOM9791311 +Ref: 30a59791311 +Ref: library/xml dom pulldom xml dom pulldom parse9791432 +Ref: 30a69791432 +Ref: library/xml dom pulldom xml dom pulldom parseString9792024 +Ref: 30a89792024 +Ref: library/xml dom pulldom xml dom pulldom default_bufsize9792176 +Ref: 30a99792176 +Ref: xml dom pulldom — Support for building partial DOM trees-Footnote-19792489 +Node: DOMEventStream Objects9792565 +Ref: library/xml dom pulldom domeventstream-objects9792682 +Ref: 30aa9792682 +Ref: library/xml dom pulldom id19792682 +Ref: 30ab9792682 +Ref: library/xml dom pulldom xml dom pulldom DOMEventStream9792747 +Ref: 2fe9792747 +Ref: library/xml dom pulldom xml dom pulldom DOMEventStream getEvent9792909 +Ref: 30ac9792909 +Ref: library/xml dom pulldom xml dom pulldom DOMEventStream expandNode9793401 +Ref: 30a29793401 +Ref: library/xml dom pulldom xml dom pulldom DOMEventStream reset9794115 +Ref: 30ad9794115 +Node: xml sax — Support for SAX2 parsers9794142 +Ref: library/xml sax doc9794374 +Ref: 30ae9794374 +Ref: library/xml sax module-xml sax9794374 +Ref: 1469794374 +Ref: library/xml sax xml-sax-support-for-sax2-parsers9794374 +Ref: 30af9794374 +Ref: library/xml sax xml sax make_parser9795465 +Ref: 14739795465 +Ref: library/xml sax xml sax parse9795963 +Ref: 14359795963 +Ref: library/xml sax xml sax parseString9796558 +Ref: b299796558 +Ref: library/xml sax xml sax SAXException9798483 +Ref: 30b59798483 +Ref: library/xml sax xml sax SAXParseException9799355 +Ref: 30b39799355 +Ref: library/xml sax xml sax SAXNotRecognizedException9799766 +Ref: 30b69799766 +Ref: library/xml sax xml sax SAXNotSupportedException9800068 +Ref: 30b79800068 +Ref: xml sax — Support for SAX2 parsers-Footnote-19801082 +Ref: xml sax — Support for SAX2 parsers-Footnote-29801159 +Node: SAXException Objects9801194 +Ref: library/xml sax sax-exception-objects9801287 +Ref: 30b89801287 +Ref: library/xml sax saxexception-objects9801287 +Ref: 30b99801287 +Ref: library/xml sax xml sax SAXException getMessage9801427 +Ref: 30ba9801427 +Ref: library/xml sax xml sax SAXException getException9801537 +Ref: 30bb9801537 +Node: xml sax handler — Base classes for SAX handlers9801641 +Ref: library/xml sax handler doc9801849 +Ref: 30bc9801849 +Ref: library/xml sax handler module-xml sax handler9801849 +Ref: 1479801849 +Ref: library/xml sax handler xml-sax-handler-base-classes-for-sax-handlers9801849 +Ref: 30bd9801849 +Ref: library/xml sax handler xml sax handler ContentHandler9802552 +Ref: 30a49802552 +Ref: library/xml sax handler xml sax handler DTDHandler9802792 +Ref: 30be9802792 +Ref: library/xml sax handler xml sax handler EntityResolver9802977 +Ref: 30bf9802977 +Ref: library/xml sax handler xml sax handler ErrorHandler9803259 +Ref: 30b29803259 +Ref: library/xml sax handler xml sax handler LexicalHandler9803533 +Ref: 4579803533 +Ref: library/xml sax handler xml sax handler feature_namespaces9803824 +Ref: 30c09803824 +Ref: library/xml sax handler xml sax handler feature_namespace_prefixes9804152 +Ref: 30c19804152 +Ref: library/xml sax handler xml sax handler feature_string_interning9804585 +Ref: 30c29804585 +Ref: library/xml sax handler xml sax handler feature_validation9805004 +Ref: 30c39805004 +Ref: library/xml sax handler xml sax handler feature_external_ges9805347 +Ref: 30b19805347 +Ref: library/xml sax handler xml sax handler feature_external_pes9805664 +Ref: 30c49805664 +Ref: library/xml sax handler xml sax handler all_features9806049 +Ref: 30c59806049 +Ref: library/xml sax handler xml sax handler property_lexical_handler9806117 +Ref: 30c69806117 +Ref: library/xml sax handler xml sax handler property_declaration_handler9806441 +Ref: 30c79806441 +Ref: library/xml sax handler xml sax handler property_dom_node9806803 +Ref: 30c89806803 +Ref: library/xml sax handler xml sax handler property_xml_string9807197 +Ref: 30c99807197 +Ref: library/xml sax handler xml sax handler all_properties9807469 +Ref: 30ca9807469 +Ref: xml sax handler — Base classes for SAX handlers-Footnote-19807726 +Node: ContentHandler Objects9807802 +Ref: library/xml sax handler content-handler-objects9807937 +Ref: 30cb9807937 +Ref: library/xml sax handler contenthandler-objects9807937 +Ref: 30cc9807937 +Ref: library/xml sax handler xml sax handler ContentHandler setDocumentLocator9808191 +Ref: 30cd9808191 +Ref: library/xml sax handler xml sax handler ContentHandler startDocument9809266 +Ref: 30ce9809266 +Ref: library/xml sax handler xml sax handler ContentHandler endDocument9809544 +Ref: 30cf9809544 +Ref: library/xml sax handler xml sax handler ContentHandler startPrefixMapping9809912 +Ref: 30d09809912 +Ref: library/xml sax handler xml sax handler ContentHandler endPrefixMapping9811114 +Ref: 30d19811114 +Ref: library/xml sax handler xml sax handler ContentHandler startElement9811457 +Ref: 30d29811457 +Ref: library/xml sax handler xml sax handler ContentHandler endElement9812098 +Ref: 30d39812098 +Ref: library/xml sax handler xml sax handler ContentHandler startElementNS9812326 +Ref: 30d59812326 +Ref: library/xml sax handler xml sax handler ContentHandler endElementNS9813314 +Ref: 30d79813314 +Ref: library/xml sax handler xml sax handler ContentHandler characters9813587 +Ref: 30d89813587 +Ref: library/xml sax handler xml sax handler ContentHandler ignorableWhitespace9814614 +Ref: 30d99814614 +Ref: library/xml sax handler xml sax handler ContentHandler processingInstruction9815281 +Ref: 30da9815281 +Ref: library/xml sax handler xml sax handler ContentHandler skippedEntity9815741 +Ref: 30db9815741 +Node: DTDHandler Objects9816241 +Ref: library/xml sax handler dtd-handler-objects9816407 +Ref: 30dc9816407 +Ref: library/xml sax handler dtdhandler-objects9816407 +Ref: 30dd9816407 +Ref: library/xml sax handler xml sax handler DTDHandler notationDecl9816532 +Ref: 30de9816532 +Ref: library/xml sax handler xml sax handler DTDHandler unparsedEntityDecl9816639 +Ref: 30df9816639 +Node: EntityResolver Objects9816777 +Ref: library/xml sax handler entity-resolver-objects9816941 +Ref: 30e09816941 +Ref: library/xml sax handler entityresolver-objects9816941 +Ref: 30e19816941 +Ref: library/xml sax handler xml sax handler EntityResolver resolveEntity9817008 +Ref: 30e29817008 +Node: ErrorHandler Objects9817276 +Ref: library/xml sax handler errorhandler-objects9817444 +Ref: 30e39817444 +Ref: library/xml sax handler sax-error-handler9817444 +Ref: 30e49817444 +Ref: library/xml sax handler xml sax handler ErrorHandler error9818091 +Ref: 30e59818091 +Ref: library/xml sax handler xml sax handler ErrorHandler fatalError9818460 +Ref: 30e69818460 +Ref: library/xml sax handler xml sax handler ErrorHandler warning9818646 +Ref: 30e79818646 +Node: LexicalHandler Objects9818991 +Ref: library/xml sax handler lexical-handler-objects9819128 +Ref: 30e89819128 +Ref: library/xml sax handler lexicalhandler-objects9819128 +Ref: 30e99819128 +Ref: library/xml sax handler xml sax handler LexicalHandler comment9819733 +Ref: 30ea9819733 +Ref: library/xml sax handler xml sax handler LexicalHandler startDTD9819887 +Ref: 30eb9819887 +Ref: library/xml sax handler xml sax handler LexicalHandler endDTD9820045 +Ref: 30ec9820045 +Ref: library/xml sax handler xml sax handler LexicalHandler startCDATA9820125 +Ref: 30ed9820125 +Ref: library/xml sax handler xml sax handler LexicalHandler endCDATA9820319 +Ref: 30ee9820319 +Node: xml sax saxutils — SAX Utilities9820408 +Ref: library/xml sax utils doc9820627 +Ref: 30ef9820627 +Ref: library/xml sax utils module-xml sax saxutils9820627 +Ref: 1489820627 +Ref: library/xml sax utils xml-sax-saxutils-sax-utilities9820627 +Ref: 30f09820627 +Ref: library/xml sax utils xml sax saxutils escape9821014 +Ref: 30f19821014 +Ref: library/xml sax utils xml sax saxutils unescape9821468 +Ref: 30f29821468 +Ref: library/xml sax utils xml sax saxutils quoteattr9821935 +Ref: 30f39821935 +Ref: library/xml sax utils xml sax saxutils XMLGenerator9822844 +Ref: 30f49822844 +Ref: library/xml sax utils xml sax saxutils XMLFilterBase9823697 +Ref: 30f59823697 +Ref: library/xml sax utils xml sax saxutils prepare_input_source9824119 +Ref: 30f69824119 +Ref: xml sax saxutils — SAX Utilities-Footnote-19824608 +Node: xml sax xmlreader — Interface for XML parsers9824685 +Ref: library/xml sax reader doc9824905 +Ref: 30f79824905 +Ref: library/xml sax reader module-xml sax xmlreader9824905 +Ref: 1499824905 +Ref: library/xml sax reader xml-sax-xmlreader-interface-for-xml-parsers9824905 +Ref: 30f89824905 +Ref: library/xml sax reader xml sax xmlreader XMLReader9825405 +Ref: 30a79825405 +Ref: library/xml sax reader xml sax xmlreader IncrementalParser9825501 +Ref: 30f99825501 +Ref: library/xml sax reader xml sax xmlreader Locator9826628 +Ref: 30b49826628 +Ref: library/xml sax reader xml sax xmlreader InputSource9826961 +Ref: b289826961 +Ref: library/xml sax reader xml sax xmlreader AttributesImpl9827729 +Ref: 30fb9827729 +Ref: library/xml sax reader xml sax xmlreader AttributesNSImpl9828328 +Ref: 30fc9828328 +Ref: xml sax xmlreader — Interface for XML parsers-Footnote-19829085 +Node: XMLReader Objects9829163 +Ref: library/xml sax reader id19829298 +Ref: 30fd9829298 +Ref: library/xml sax reader xmlreader-objects9829298 +Ref: 30fe9829298 +Ref: library/xml sax reader xml sax xmlreader XMLReader parse9829425 +Ref: 30fa9829425 +Ref: library/xml sax reader xml sax xmlreader XMLReader getContentHandler9830014 +Ref: 30ff9830014 +Ref: library/xml sax reader xml sax xmlreader XMLReader setContentHandler9830111 +Ref: 31009830111 +Ref: library/xml sax reader xml sax xmlreader XMLReader getDTDHandler9830294 +Ref: 31019830294 +Ref: library/xml sax reader xml sax xmlreader XMLReader setDTDHandler9830383 +Ref: 31029830383 +Ref: library/xml sax reader xml sax xmlreader XMLReader getEntityResolver9830550 +Ref: 31039830550 +Ref: library/xml sax reader xml sax xmlreader XMLReader setEntityResolver9830647 +Ref: 31049830647 +Ref: library/xml sax reader xml sax xmlreader XMLReader getErrorHandler9830939 +Ref: 31059830939 +Ref: library/xml sax reader xml sax xmlreader XMLReader setErrorHandler9831032 +Ref: 31069831032 +Ref: library/xml sax reader xml sax xmlreader XMLReader setLocale9831236 +Ref: 31079831236 +Ref: library/xml sax reader xml sax xmlreader XMLReader getFeature9831602 +Ref: 31089831602 +Ref: library/xml sax reader xml sax xmlreader XMLReader setFeature9831884 +Ref: 30b09831884 +Ref: library/xml sax reader xml sax xmlreader XMLReader getProperty9832173 +Ref: 31099832173 +Ref: library/xml sax reader xml sax xmlreader XMLReader setProperty9832464 +Ref: 310a9832464 +Node: IncrementalParser Objects9832758 +Ref: library/xml sax reader incremental-parser-objects9832917 +Ref: 310b9832917 +Ref: library/xml sax reader incrementalparser-objects9832917 +Ref: 310c9832917 +Ref: library/xml sax reader xml sax xmlreader IncrementalParser feed9833075 +Ref: 310d9833075 +Ref: library/xml sax reader xml sax xmlreader IncrementalParser close9833151 +Ref: 310e9833151 +Ref: library/xml sax reader xml sax xmlreader IncrementalParser reset9833390 +Ref: 310f9833390 +Node: Locator Objects9833652 +Ref: library/xml sax reader id29833813 +Ref: 31109833813 +Ref: library/xml sax reader locator-objects9833813 +Ref: 31119833813 +Ref: library/xml sax reader xml sax xmlreader Locator getColumnNumber9833924 +Ref: 31129833924 +Ref: library/xml sax reader xml sax xmlreader Locator getLineNumber9834027 +Ref: 31139834027 +Ref: library/xml sax reader xml sax xmlreader Locator getPublicId9834126 +Ref: 31149834126 +Ref: library/xml sax reader xml sax xmlreader Locator getSystemId9834220 +Ref: 31159834220 +Node: InputSource Objects9834314 +Ref: library/xml sax reader input-source-objects9834474 +Ref: 31169834474 +Ref: library/xml sax reader inputsource-objects9834474 +Ref: 31179834474 +Ref: library/xml sax reader xml sax xmlreader InputSource setPublicId9834535 +Ref: 31189834535 +Ref: library/xml sax reader xml sax xmlreader InputSource getPublicId9834642 +Ref: 31199834642 +Ref: library/xml sax reader xml sax xmlreader InputSource setSystemId9834750 +Ref: 311a9834750 +Ref: library/xml sax reader xml sax xmlreader InputSource getSystemId9834857 +Ref: 311b9834857 +Ref: library/xml sax reader xml sax xmlreader InputSource setEncoding9834965 +Ref: 311c9834965 +Ref: library/xml sax reader xml sax xmlreader InputSource getEncoding9835351 +Ref: 311d9835351 +Ref: library/xml sax reader xml sax xmlreader InputSource setByteStream9835445 +Ref: 311e9835445 +Ref: library/xml sax reader xml sax xmlreader InputSource getByteStream9835878 +Ref: 311f9835878 +Ref: library/xml sax reader xml sax xmlreader InputSource setCharacterStream9836086 +Ref: 31209836086 +Ref: library/xml sax reader xml sax xmlreader InputSource getCharacterStream9836400 +Ref: 31219836400 +Node: The Attributes Interface9836501 +Ref: library/xml sax reader attributes-objects9836672 +Ref: 30d49836672 +Ref: library/xml sax reader the-attributes-interface9836672 +Ref: 31229836672 +Ref: library/xml sax reader xml sax xmlreader Attributes getLength9837001 +Ref: 31239837001 +Ref: library/xml sax reader xml sax xmlreader Attributes getNames9837077 +Ref: 31249837077 +Ref: library/xml sax reader xml sax xmlreader Attributes getType9837155 +Ref: 31259837155 +Ref: library/xml sax reader xml sax xmlreader Attributes getValue9837280 +Ref: 31269837280 +Node: The AttributesNS Interface9837364 +Ref: library/xml sax reader attributes-ns-objects9837507 +Ref: 30d69837507 +Ref: library/xml sax reader the-attributesns-interface9837507 +Ref: 31279837507 +Ref: library/xml sax reader xml sax xmlreader AttributesNS getValueByQName9837840 +Ref: 31289837840 +Ref: library/xml sax reader xml sax xmlreader AttributesNS getNameByQName9837934 +Ref: 31299837934 +Ref: library/xml sax reader xml sax xmlreader AttributesNS getQNameByName9838057 +Ref: 312a9838057 +Ref: library/xml sax reader xml sax xmlreader AttributesNS getQNames9838178 +Ref: 312b9838178 +Node: xml parsers expat — Fast XML parsing using Expat9838269 +Ref: library/pyexpat doc9838446 +Ref: 312c9838446 +Ref: library/pyexpat module-xml parsers expat9838446 +Ref: 1439838446 +Ref: library/pyexpat xml-parsers-expat-fast-xml-parsing-using-expat9838446 +Ref: 312d9838446 +Ref: library/pyexpat xml parsers expat ExpatError9839500 +Ref: f319839500 +Ref: library/pyexpat xml parsers expat error9839710 +Ref: 312f9839710 +Ref: library/pyexpat xml parsers expat XMLParserType9839789 +Ref: 31309839789 +Ref: library/pyexpat xml parsers expat ErrorString9839986 +Ref: 31329839986 +Ref: library/pyexpat xml parsers expat ParserCreate9840109 +Ref: 31319840109 +Ref: xml parsers expat — Fast XML parsing using Expat-Footnote-19842545 +Ref: xml parsers expat — Fast XML parsing using Expat-Footnote-29842854 +Node: XMLParser Objects<2>9842887 +Ref: library/pyexpat id29843024 +Ref: 31339843024 +Ref: library/pyexpat xmlparser-objects9843024 +Ref: 31349843024 +Ref: library/pyexpat xml parsers expat xmlparser Parse9843134 +Ref: 31359843134 +Ref: library/pyexpat xml parsers expat xmlparser ParseFile9843512 +Ref: 31369843512 +Ref: library/pyexpat xml parsers expat xmlparser SetBase9843732 +Ref: 31379843732 +Ref: library/pyexpat xml parsers expat xmlparser GetBase9844148 +Ref: 313b9844148 +Ref: library/pyexpat xml parsers expat xmlparser GetInputContext9844346 +Ref: 313c9844346 +Ref: library/pyexpat xml parsers expat xmlparser ExternalEntityParserCreate9844629 +Ref: 313d9844629 +Ref: library/pyexpat xml parsers expat xmlparser SetParamEntityParsing9845146 +Ref: 31409845146 +Ref: library/pyexpat xml parsers expat xmlparser UseForeignDTD9845511 +Ref: 31419845511 +Ref: library/pyexpat xml parsers expat xmlparser buffer_size9846553 +Ref: 31449846553 +Ref: library/pyexpat xml parsers expat xmlparser buffer_text9846815 +Ref: 31459846815 +Ref: library/pyexpat xml parsers expat xmlparser buffer_used9847267 +Ref: 31479847267 +Ref: library/pyexpat xml parsers expat xmlparser ordered_attributes9847540 +Ref: 313e9847540 +Ref: library/pyexpat xml parsers expat xmlparser specified_attributes9848032 +Ref: 313f9848032 +Ref: library/pyexpat xml parsers expat xmlparser ErrorByteIndex9848838 +Ref: 31489848838 +Ref: library/pyexpat xml parsers expat xmlparser ErrorCode9848924 +Ref: 31499848924 +Ref: library/pyexpat xml parsers expat xmlparser ErrorColumnNumber9849155 +Ref: 314a9849155 +Ref: library/pyexpat xml parsers expat xmlparser ErrorLineNumber9849247 +Ref: 314b9849247 +Ref: library/pyexpat xml parsers expat xmlparser CurrentByteIndex9849740 +Ref: 314c9849740 +Ref: library/pyexpat xml parsers expat xmlparser CurrentColumnNumber9849829 +Ref: 314d9849829 +Ref: library/pyexpat xml parsers expat xmlparser CurrentLineNumber9849924 +Ref: 314e9849924 +Ref: library/pyexpat xml parsers expat xmlparser XmlDeclHandler9850337 +Ref: 314f9850337 +Ref: library/pyexpat xml parsers expat xmlparser StartDoctypeDeclHandler9850950 +Ref: 31429850950 +Ref: library/pyexpat xml parsers expat xmlparser EndDoctypeDeclHandler9851503 +Ref: 31439851503 +Ref: library/pyexpat xml parsers expat xmlparser ElementDeclHandler9851669 +Ref: 31509851669 +Ref: library/pyexpat xml parsers expat xmlparser AttlistDeclHandler9851883 +Ref: 31519851883 +Ref: library/pyexpat xml parsers expat xmlparser StartElementHandler9852786 +Ref: 31529852786 +Ref: library/pyexpat xml parsers expat xmlparser EndElementHandler9853183 +Ref: 31539853183 +Ref: library/pyexpat xml parsers expat xmlparser ProcessingInstructionHandler9853274 +Ref: 31549853274 +Ref: library/pyexpat xml parsers expat xmlparser CharacterDataHandler9853388 +Ref: 31469853388 +Ref: library/pyexpat xml parsers expat xmlparser UnparsedEntityDeclHandler9853810 +Ref: 313a9853810 +Ref: library/pyexpat xml parsers expat xmlparser EntityDeclHandler9854203 +Ref: 31579854203 +Ref: library/pyexpat xml parsers expat xmlparser NotationDeclHandler9854948 +Ref: 31399854948 +Ref: library/pyexpat xml parsers expat xmlparser StartNamespaceDeclHandler9855239 +Ref: 31589855239 +Ref: library/pyexpat xml parsers expat xmlparser EndNamespaceDeclHandler9855517 +Ref: 31599855517 +Ref: library/pyexpat xml parsers expat xmlparser CommentHandler9856040 +Ref: 315a9856040 +Ref: library/pyexpat xml parsers expat xmlparser StartCdataSectionHandler9856226 +Ref: 31559856226 +Ref: library/pyexpat xml parsers expat xmlparser EndCdataSectionHandler9856463 +Ref: 31569856463 +Ref: library/pyexpat xml parsers expat xmlparser DefaultHandler9856556 +Ref: 315b9856556 +Ref: library/pyexpat xml parsers expat xmlparser DefaultHandlerExpand9856841 +Ref: 315c9856841 +Ref: library/pyexpat xml parsers expat xmlparser NotStandaloneHandler9857081 +Ref: 315d9857081 +Ref: library/pyexpat xml parsers expat xmlparser ExternalEntityRefHandler9857603 +Ref: 31389857603 +Node: ExpatError Exceptions9858659 +Ref: library/pyexpat expaterror-exceptions9858816 +Ref: 315e9858816 +Ref: library/pyexpat expaterror-objects9858816 +Ref: 312e9858816 +Ref: library/pyexpat xml parsers expat ExpatError code9858957 +Ref: 315f9858957 +Ref: library/pyexpat xml parsers expat ExpatError lineno9859606 +Ref: 31629859606 +Ref: library/pyexpat xml parsers expat ExpatError offset9859733 +Ref: 31639859733 +Node: Example<11>9859874 +Ref: library/pyexpat example9860037 +Ref: 31649860037 +Ref: library/pyexpat expat-example9860037 +Ref: 31659860037 +Node: Content Model Descriptions9861135 +Ref: library/pyexpat content-model-descriptions9861298 +Ref: 31669861298 +Ref: library/pyexpat expat-content-models9861298 +Ref: 31679861298 +Ref: library/pyexpat module-xml parsers expat model9861298 +Ref: 1459861298 +Node: Expat error constants9863141 +Ref: library/pyexpat expat-error-constants9863284 +Ref: 31689863284 +Ref: library/pyexpat expat-errors9863284 +Ref: 31699863284 +Ref: library/pyexpat module-xml parsers expat errors9863284 +Ref: 1449863284 +Ref: library/pyexpat xml parsers expat errors codes9863874 +Ref: 31619863874 +Ref: library/pyexpat xml parsers expat errors messages9864011 +Ref: 31609864011 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_ASYNC_ENTITY9864164 +Ref: 316a9864164 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF9864223 +Ref: 316b9864223 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_BAD_CHAR_REF9864424 +Ref: 316c9864424 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_BINARY_ENTITY_REF9864619 +Ref: 316d9864619 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_DUPLICATE_ATTRIBUTE9864793 +Ref: 316e9864793 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_INCORRECT_ENCODING9864918 +Ref: 316f9864918 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_INVALID_TOKEN9864983 +Ref: 31709864983 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_JUNK_AFTER_DOC_ELEMENT9865197 +Ref: 31719865197 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_MISPLACED_XML_PI9865346 +Ref: 31729865346 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_NO_ELEMENTS9865499 +Ref: 31739865499 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_NO_MEMORY9865674 +Ref: 31749865674 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_PARAM_ENTITY_REF9865786 +Ref: 31759865786 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_PARTIAL_CHAR9865920 +Ref: 31769865920 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_RECURSIVE_ENTITY_REF9866033 +Ref: 31779866033 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_SYNTAX9866235 +Ref: 31789866235 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_TAG_MISMATCH9866341 +Ref: 31799866341 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_UNCLOSED_TOKEN9866461 +Ref: 317a9866461 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_UNDEFINED_ENTITY9866645 +Ref: 317b9866645 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_UNKNOWN_ENCODING9866771 +Ref: 317c9866771 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_UNCLOSED_CDATA_SECTION9866889 +Ref: 317d9866889 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_EXTERNAL_ENTITY_HANDLING9867003 +Ref: 317e9867003 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_NOT_STANDALONE9867074 +Ref: 317f9867074 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_UNEXPECTED_STATE9867337 +Ref: 31809867337 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_ENTITY_DECLARED_IN_PE9867400 +Ref: 31819867400 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_FEATURE_REQUIRES_XML_DTD9867468 +Ref: 31829867468 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING9867774 +Ref: 31839867774 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_UNBOUND_PREFIX9868047 +Ref: 31849868047 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_UNDECLARING_PREFIX9868189 +Ref: 31859868189 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_INCOMPLETE_PE9868350 +Ref: 31869868350 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_XML_DECL9868464 +Ref: 31879868464 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_TEXT_DECL9868576 +Ref: 31889868576 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_PUBLICID9868712 +Ref: 31899868712 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_SUSPENDED9868834 +Ref: 318a9868834 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_NOT_SUSPENDED9869058 +Ref: 318b9869058 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_ABORTED9869210 +Ref: 318c9869210 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_FINISHED9869322 +Ref: 318d9869322 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_SUSPEND_PE9869568 +Ref: 318e9869568 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_PREFIX_XML9869625 +Ref: 318f9869625 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_PREFIX_XMLNS9869811 +Ref: 31909869811 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_RESERVED_NAMESPACE_URI9869973 +Ref: 31919869973 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_INVALID_ARGUMENT9870183 +Ref: 31929870183 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_NO_BUFFER9870304 +Ref: 31939870304 +Ref: library/pyexpat xml parsers expat errors XML_ERROR_AMPLIFICATION_LIMIT_BREACH9870418 +Ref: 31949870418 +Node: Internet Protocols and Support9870585 +Ref: library/internet doc9870750 +Ref: 31959870750 +Ref: library/internet internet9870750 +Ref: 31969870750 +Ref: library/internet internet-protocols-and-support9870750 +Ref: 31979870750 +Node: webbrowser — Convenient web-browser controller9872693 +Ref: library/webbrowser doc9872872 +Ref: 31989872872 +Ref: library/webbrowser module-webbrowser9872872 +Ref: 1339872872 +Ref: library/webbrowser webbrowser-convenient-web-browser-controller9872872 +Ref: 31999872872 +Ref: library/webbrowser webbrowser Error9875056 +Ref: 319b9875056 +Ref: library/webbrowser webbrowser open9875187 +Ref: 319a9875187 +Ref: library/webbrowser webbrowser open_new9875995 +Ref: 319c9875995 +Ref: library/webbrowser webbrowser open_new_tab9876161 +Ref: 319d9876161 +Ref: library/webbrowser webbrowser get9876339 +Ref: 319e9876339 +Ref: library/webbrowser webbrowser register9876567 +Ref: 319f9876567 +Ref: webbrowser — Convenient web-browser controller-Footnote-19883231 +Ref: webbrowser — Convenient web-browser controller-Footnote-29883301 +Node: Browser Controller Objects9883434 +Ref: library/webbrowser browser-controller-objects9883545 +Ref: 31a09883545 +Ref: library/webbrowser browser-controllers9883545 +Ref: 31a19883545 +Ref: library/webbrowser webbrowser name9883725 +Ref: 31a29883725 +Ref: library/webbrowser webbrowser controller open9883802 +Ref: 31a39883802 +Ref: library/webbrowser webbrowser controller open_new9884066 +Ref: 31a49884066 +Ref: library/webbrowser webbrowser controller open_new_tab9884285 +Ref: 31a59884285 +Node: wsgiref — WSGI Utilities and Reference Implementation9884485 +Ref: library/wsgiref doc9884704 +Ref: 31a69884704 +Ref: library/wsgiref module-wsgiref9884704 +Ref: 1369884704 +Ref: library/wsgiref wsgiref-wsgi-utilities-and-reference-implementation9884704 +Ref: 31a79884704 +Ref: wsgiref — WSGI Utilities and Reference Implementation-Footnote-19886693 +Ref: wsgiref — WSGI Utilities and Reference Implementation-Footnote-29886735 +Node: wsgiref util – WSGI environment utilities9886772 +Ref: library/wsgiref module-wsgiref util9886962 +Ref: 13b9886962 +Ref: library/wsgiref wsgiref-util-wsgi-environment-utilities9886962 +Ref: 31a89886962 +Ref: library/wsgiref wsgiref util guess_scheme9887506 +Ref: 31aa9887506 +Ref: library/wsgiref wsgiref util request_uri9888158 +Ref: 31ab9888158 +Ref: library/wsgiref wsgiref util application_uri9888484 +Ref: 31ac9888484 +Ref: library/wsgiref wsgiref util shift_path_info9888750 +Ref: 31ad9888750 +Ref: library/wsgiref wsgiref util setup_testing_defaults9890418 +Ref: 31ae9890418 +Ref: library/wsgiref wsgiref util is_hop_by_hop9892102 +Ref: 31af9892102 +Ref: library/wsgiref wsgiref util FileWrapper9892275 +Ref: 2ff9892275 +Ref: wsgiref util – WSGI environment utilities-Footnote-19893512 +Ref: wsgiref util – WSGI environment utilities-Footnote-29893554 +Ref: wsgiref util – WSGI environment utilities-Footnote-39893596 +Ref: wsgiref util – WSGI environment utilities-Footnote-49893638 +Ref: wsgiref util – WSGI environment utilities-Footnote-59893680 +Node: wsgiref headers – WSGI response header tools9893739 +Ref: library/wsgiref module-wsgiref headers9893989 +Ref: 1389893989 +Ref: library/wsgiref wsgiref-headers-wsgi-response-header-tools9893989 +Ref: 31b19893989 +Ref: library/wsgiref wsgiref headers Headers9894251 +Ref: b259894251 +Ref: library/wsgiref wsgiref headers Headers get_all9896490 +Ref: 31b29896490 +Ref: library/wsgiref wsgiref headers Headers add_header9896927 +Ref: 31b39896927 +Ref: wsgiref headers – WSGI response header tools-Footnote-19898064 +Node: wsgiref simple_server – a simple WSGI HTTP server9898106 +Ref: library/wsgiref module-wsgiref simple_server9898358 +Ref: 1399898358 +Ref: library/wsgiref wsgiref-simple-server-a-simple-wsgi-http-server9898358 +Ref: 31b49898358 +Ref: library/wsgiref wsgiref simple_server make_server9898952 +Ref: 31b59898952 +Ref: library/wsgiref wsgiref simple_server demo_app9899792 +Ref: 31b69899792 +Ref: library/wsgiref wsgiref simple_server WSGIServer9900232 +Ref: 31b79900232 +Ref: library/wsgiref wsgiref simple_server WSGIServer set_app9900985 +Ref: 31b99900985 +Ref: library/wsgiref wsgiref simple_server WSGIServer get_app9901130 +Ref: 31ba9901130 +Ref: library/wsgiref wsgiref simple_server WSGIRequestHandler9901473 +Ref: 31bb9901473 +Ref: library/wsgiref wsgiref simple_server WSGIRequestHandler get_environ9902089 +Ref: 31bc9902089 +Ref: library/wsgiref wsgiref simple_server WSGIRequestHandler get_stderr9902591 +Ref: 31bd9902591 +Ref: library/wsgiref wsgiref simple_server WSGIRequestHandler handle9902774 +Ref: 31be9902774 +Ref: wsgiref simple_server – a simple WSGI HTTP server-Footnote-19903045 +Ref: wsgiref simple_server – a simple WSGI HTTP server-Footnote-29903087 +Node: wsgiref validate — WSGI conformance checker9903129 +Ref: library/wsgiref module-wsgiref validate9903383 +Ref: 13c9903383 +Ref: library/wsgiref wsgiref-validate-wsgi-conformance-checker9903383 +Ref: 31bf9903383 +Ref: library/wsgiref wsgiref validate validator9904290 +Ref: 31c09904290 +Ref: wsgiref validate — WSGI conformance checker-Footnote-19906503 +Ref: wsgiref validate — WSGI conformance checker-Footnote-29906545 +Ref: wsgiref validate — WSGI conformance checker-Footnote-39906604 +Node: wsgiref handlers – server/gateway base classes9906646 +Ref: library/wsgiref module-wsgiref handlers9906902 +Ref: 1379906902 +Ref: library/wsgiref wsgiref-handlers-server-gateway-base-classes9906902 +Ref: 31c19906902 +Ref: library/wsgiref wsgiref handlers CGIHandler9907293 +Ref: 31c29907293 +Ref: library/wsgiref wsgiref handlers IISCGIHandler9907942 +Ref: 31c49907942 +Ref: library/wsgiref wsgiref handlers BaseCGIHandler9909317 +Ref: 31c39909317 +Ref: library/wsgiref wsgiref handlers SimpleHandler9910184 +Ref: 31c59910184 +Ref: library/wsgiref wsgiref handlers BaseHandler9911097 +Ref: 14209911097 +Ref: library/wsgiref wsgiref handlers BaseHandler run9911456 +Ref: 31c69911456 +Ref: library/wsgiref wsgiref handlers BaseHandler _write9911795 +Ref: 31c79911795 +Ref: library/wsgiref wsgiref handlers BaseHandler _flush9912141 +Ref: 31c89912141 +Ref: library/wsgiref wsgiref handlers BaseHandler get_stdin9912350 +Ref: 31c99912350 +Ref: library/wsgiref wsgiref handlers BaseHandler get_stderr9912553 +Ref: 31cb9912553 +Ref: library/wsgiref wsgiref handlers BaseHandler add_cgi_vars9912758 +Ref: 31cd9912758 +Ref: library/wsgiref wsgiref handlers BaseHandler wsgi_multithread9913310 +Ref: 31ce9913310 +Ref: library/wsgiref wsgiref handlers BaseHandler wsgi_multiprocess9913601 +Ref: 31cf9913601 +Ref: library/wsgiref wsgiref handlers BaseHandler wsgi_run_once9913894 +Ref: 31d09913894 +Ref: library/wsgiref wsgiref handlers BaseHandler os_environ9914137 +Ref: 31d19914137 +Ref: library/wsgiref wsgiref handlers BaseHandler server_software9914643 +Ref: 31d29914643 +Ref: library/wsgiref wsgiref handlers BaseHandler get_scheme9915239 +Ref: 31d49915239 +Ref: library/wsgiref wsgiref handlers BaseHandler setup_environ9915600 +Ref: 31d59915600 +Ref: library/wsgiref wsgiref handlers BaseHandler log_exception9916260 +Ref: 31d79916260 +Ref: library/wsgiref wsgiref handlers BaseHandler traceback_limit9916760 +Ref: 31d89916760 +Ref: library/wsgiref wsgiref handlers BaseHandler error_output9916982 +Ref: 31d99916982 +Ref: library/wsgiref wsgiref handlers BaseHandler error_status9918054 +Ref: 31da9918054 +Ref: library/wsgiref wsgiref handlers BaseHandler error_headers9918259 +Ref: 31db9918259 +Ref: library/wsgiref wsgiref handlers BaseHandler error_body9918551 +Ref: 31dc9918551 +Ref: library/wsgiref wsgiref handlers BaseHandler wsgi_file_wrapper9918897 +Ref: 31d69918897 +Ref: library/wsgiref wsgiref handlers BaseHandler sendfile9919170 +Ref: 31dd9919170 +Ref: library/wsgiref wsgiref handlers BaseHandler origin_server9919746 +Ref: 31d39919746 +Ref: library/wsgiref wsgiref handlers BaseHandler http_version9920273 +Ref: 31de9920273 +Ref: library/wsgiref wsgiref handlers read_environ9920495 +Ref: e6d9920495 +Ref: wsgiref handlers – server/gateway base classes-Footnote-19921409 +Ref: wsgiref handlers – server/gateway base classes-Footnote-29921451 +Ref: wsgiref handlers – server/gateway base classes-Footnote-39921493 +Ref: wsgiref handlers – server/gateway base classes-Footnote-49921535 +Ref: wsgiref handlers – server/gateway base classes-Footnote-59921577 +Node: wsgiref types – WSGI types for static type checking9921619 +Ref: library/wsgiref module-wsgiref types9921842 +Ref: 13a9921842 +Ref: library/wsgiref wsgiref-types-wsgi-types-for-static-type-checking9921842 +Ref: 31df9921842 +Ref: library/wsgiref wsgiref types StartResponse9922087 +Ref: 31e09922087 +Ref: library/wsgiref wsgiref types WSGIEnvironment9922225 +Ref: 31a99922225 +Ref: library/wsgiref wsgiref types WSGIApplication9922327 +Ref: 31e19922327 +Ref: library/wsgiref wsgiref types InputStream9922427 +Ref: 31ca9922427 +Ref: library/wsgiref wsgiref types ErrorStream9922536 +Ref: 31cc9922536 +Ref: library/wsgiref wsgiref types FileWrapper9922645 +Ref: 31b09922645 +Ref: wsgiref types – WSGI types for static type checking-Footnote-19922885 +Ref: wsgiref types – WSGI types for static type checking-Footnote-29922927 +Ref: wsgiref types – WSGI types for static type checking-Footnote-39922997 +Ref: wsgiref types – WSGI types for static type checking-Footnote-49923039 +Ref: wsgiref types – WSGI types for static type checking-Footnote-59923105 +Ref: wsgiref types – WSGI types for static type checking-Footnote-69923171 +Node: Examples<24>9923255 +Ref: library/wsgiref examples9923421 +Ref: 31e29923421 +Node: urllib — URL handling modules9926157 +Ref: library/urllib doc9926382 +Ref: 31e39926382 +Ref: library/urllib module-urllib9926382 +Ref: 1279926382 +Ref: library/urllib urllib-url-handling-modules9926382 +Ref: 31e49926382 +Ref: urllib — URL handling modules-Footnote-19926963 +Node: urllib request — Extensible library for opening URLs9927027 +Ref: library/urllib request doc9927248 +Ref: 31e59927248 +Ref: library/urllib request module-urllib request9927248 +Ref: 12a9927248 +Ref: library/urllib request urllib-request-extensible-library-for-opening-urls9927248 +Ref: 31e69927248 +Ref: library/urllib request urllib request urlopen9928093 +Ref: b229928093 +Ref: library/urllib request urllib request install_opener9932342 +Ref: 31ed9932342 +Ref: library/urllib request urllib request build_opener9932795 +Ref: 31ee9932795 +Ref: library/urllib request urllib request pathname2url9933913 +Ref: 31f69933913 +Ref: library/urllib request urllib request url2pathname9934212 +Ref: 31f79934212 +Ref: library/urllib request urllib request getproxies9934469 +Ref: 31f89934469 +Ref: library/urllib request urllib request Request9935612 +Ref: c7a9935612 +Ref: library/urllib request urllib request OpenerDirector9940089 +Ref: 31eb9940089 +Ref: library/urllib request urllib request BaseHandler9940308 +Ref: 31ef9940308 +Ref: library/urllib request urllib request HTTPDefaultErrorHandler9940468 +Ref: 31f19940468 +Ref: library/urllib request urllib request HTTPRedirectHandler9940660 +Ref: 31f29940660 +Ref: library/urllib request urllib request HTTPCookieProcessor9940745 +Ref: 31fa9940745 +Ref: library/urllib request urllib request ProxyHandler9940847 +Ref: 13f79940847 +Ref: library/urllib request urllib request HTTPPasswordMgr9941951 +Ref: 31fb9941951 +Ref: library/urllib request urllib request HTTPPasswordMgrWithDefaultRealm9942068 +Ref: 31fc9942068 +Ref: library/urllib request urllib request HTTPPasswordMgrWithPriorAuth9942309 +Ref: b209942309 +Ref: library/urllib request urllib request AbstractBasicAuthHandler9942695 +Ref: 12c19942695 +Ref: library/urllib request urllib request HTTPBasicAuthHandler9944037 +Ref: 31ff9944037 +Ref: library/urllib request urllib request ProxyBasicAuthHandler9944501 +Ref: 32009944501 +Ref: library/urllib request urllib request AbstractDigestAuthHandler9944841 +Ref: 139b9944841 +Ref: library/urllib request urllib request HTTPDigestAuthHandler9945251 +Ref: 32019945251 +Ref: library/urllib request urllib request ProxyDigestAuthHandler9946113 +Ref: 32029946113 +Ref: library/urllib request urllib request HTTPHandler9946454 +Ref: 31f09946454 +Ref: library/urllib request urllib request HTTPSHandler9946539 +Ref: ed59946539 +Ref: library/urllib request urllib request FileHandler9946869 +Ref: 31f49946869 +Ref: library/urllib request urllib request DataHandler9946932 +Ref: c799946932 +Ref: library/urllib request urllib request FTPHandler9947019 +Ref: 31f39947019 +Ref: library/urllib request urllib request CacheFTPHandler9947078 +Ref: 32039947078 +Ref: library/urllib request urllib request UnknownHandler9947207 +Ref: 31ec9947207 +Ref: library/urllib request urllib request HTTPErrorProcessor9947297 +Ref: 31f59947297 +Ref: urllib request — Extensible library for opening URLs-Footnote-19948178 +Ref: urllib request — Extensible library for opening URLs-Footnote-29948252 +Ref: urllib request — Extensible library for opening URLs-Footnote-39948303 +Ref: urllib request — Extensible library for opening URLs-Footnote-49948362 +Ref: urllib request — Extensible library for opening URLs-Footnote-59948421 +Node: Request Objects9948480 +Ref: library/urllib request id19948617 +Ref: 32049948617 +Ref: library/urllib request request-objects9948617 +Ref: 32059948617 +Ref: library/urllib request urllib request Request full_url9948888 +Ref: c7c9948888 +Ref: library/urllib request urllib request Request type9949183 +Ref: 32069949183 +Ref: library/urllib request urllib request Request host9949234 +Ref: 32079949234 +Ref: library/urllib request urllib request Request origin_req_host9949361 +Ref: 32089949361 +Ref: library/urllib request urllib request Request selector9949456 +Ref: 32099949456 +Ref: library/urllib request urllib request Request data9949620 +Ref: c7d9949620 +Ref: library/urllib request urllib request Request unverifiable9949883 +Ref: 320a9949883 +Ref: library/urllib request urllib request Request method9950013 +Ref: c7b9950013 +Ref: library/urllib request urllib request Request get_method9950719 +Ref: e1d9950719 +Ref: library/urllib request urllib request Request add_header9951141 +Ref: 31f99951141 +Ref: library/urllib request urllib request Request add_unredirected_header9951821 +Ref: 320b9951821 +Ref: library/urllib request urllib request Request has_header9951947 +Ref: 320c9951947 +Ref: library/urllib request urllib request Request remove_header9952088 +Ref: c7f9952088 +Ref: library/urllib request urllib request Request get_full_url9952261 +Ref: 320d9952261 +Ref: library/urllib request urllib request Request set_proxy9952418 +Ref: 320e9952418 +Ref: library/urllib request urllib request Request get_header9952671 +Ref: 320f9952671 +Ref: library/urllib request urllib request Request header_items9952837 +Ref: 32109952837 +Ref: Request Objects-Footnote-19953196 +Node: OpenerDirector Objects9953255 +Ref: library/urllib request opener-director-objects9953420 +Ref: 32119953420 +Ref: library/urllib request openerdirector-objects9953420 +Ref: 32129953420 +Ref: library/urllib request urllib request OpenerDirector add_handler9953552 +Ref: 32139953552 +Ref: library/urllib request urllib request OpenerDirector open9955110 +Ref: c7e9955110 +Ref: library/urllib request urllib request OpenerDirector error9955793 +Ref: 32189955793 +Node: BaseHandler Objects9957569 +Ref: library/urllib request base-handler-objects9957746 +Ref: 32199957746 +Ref: library/urllib request basehandler-objects9957746 +Ref: 321a9957746 +Ref: library/urllib request urllib request BaseHandler add_parent9957986 +Ref: 321b9957986 +Ref: library/urllib request urllib request BaseHandler close9958065 +Ref: 321c9958065 +Ref: library/urllib request urllib request BaseHandler parent9958441 +Ref: 321d9958441 +Ref: library/urllib request urllib request BaseHandler default_open9958595 +Ref: 321e9958595 +Ref: library/urllib request protocol-open9959281 +Ref: 32149959281 +Ref: library/urllib request urllib request BaseHandler unknown_open9959647 +Ref: 321f9959647 +Ref: library/urllib request urllib request BaseHandler http_error_default9960059 +Ref: 32209960059 +Ref: library/urllib request http-error-nnn9960866 +Ref: 32159960866 +Ref: library/urllib request protocol-request9961364 +Ref: 32169961364 +Ref: library/urllib request protocol-response9961778 +Ref: 32179961778 +Node: HTTPRedirectHandler Objects9962369 +Ref: library/urllib request http-redirect-handler9962551 +Ref: 32219962551 +Ref: library/urllib request httpredirecthandler-objects9962551 +Ref: 32229962551 +Ref: library/urllib request urllib request HTTPRedirectHandler redirect_request9963048 +Ref: 32239963048 +Ref: library/urllib request urllib request HTTPRedirectHandler http_error_3019964132 +Ref: 32249964132 +Ref: library/urllib request urllib request HTTPRedirectHandler http_error_3029964403 +Ref: 32259964403 +Ref: library/urllib request urllib request HTTPRedirectHandler http_error_3039964582 +Ref: 32269964582 +Ref: library/urllib request urllib request HTTPRedirectHandler http_error_3079964765 +Ref: 32279964765 +Ref: library/urllib request urllib request HTTPRedirectHandler http_error_3089965039 +Ref: 32289965039 +Ref: HTTPRedirectHandler Objects-Footnote-19965376 +Ref: HTTPRedirectHandler Objects-Footnote-29965435 +Node: HTTPCookieProcessor Objects9965494 +Ref: library/urllib request http-cookie-processor9965677 +Ref: 32299965677 +Ref: library/urllib request httpcookieprocessor-objects9965677 +Ref: 322a9965677 +Ref: library/urllib request urllib request HTTPCookieProcessor cookiejar9965816 +Ref: 322b9965816 +Node: ProxyHandler Objects9965944 +Ref: library/urllib request proxy-handler9966123 +Ref: 322d9966123 +Ref: library/urllib request proxyhandler-objects9966123 +Ref: 322e9966123 +Node: HTTPPasswordMgr Objects9966601 +Ref: library/urllib request http-password-mgr9966789 +Ref: 31fd9966789 +Ref: library/urllib request httppasswordmgr-objects9966789 +Ref: 322f9966789 +Ref: library/urllib request urllib request HTTPPasswordMgr add_password9966975 +Ref: 32309966975 +Ref: library/urllib request urllib request HTTPPasswordMgr find_user_password9967322 +Ref: 12339967322 +Node: HTTPPasswordMgrWithPriorAuth Objects9967696 +Ref: library/urllib request http-password-mgr-with-prior-auth9967896 +Ref: 31fe9967896 +Ref: library/urllib request httppasswordmgrwithpriorauth-objects9967896 +Ref: 32319967896 +Ref: library/urllib request urllib request HTTPPasswordMgrWithPriorAuth add_password9968150 +Ref: 32329968150 +Ref: library/urllib request urllib request HTTPPasswordMgrWithPriorAuth find_user_password9968564 +Ref: 32339968564 +Ref: library/urllib request urllib request HTTPPasswordMgrWithPriorAuth update_authenticated9968723 +Ref: 32349968723 +Ref: library/urllib request urllib request HTTPPasswordMgrWithPriorAuth is_authenticated9968919 +Ref: 12349968919 +Node: AbstractBasicAuthHandler Objects9969095 +Ref: library/urllib request abstract-basic-auth-handler9969300 +Ref: 32359969300 +Ref: library/urllib request abstractbasicauthhandler-objects9969300 +Ref: 32369969300 +Ref: library/urllib request urllib request AbstractBasicAuthHandler http_error_auth_reqed9969385 +Ref: 32379969385 +Node: HTTPBasicAuthHandler Objects9970205 +Ref: library/urllib request http-basic-auth-handler9970403 +Ref: 32389970403 +Ref: library/urllib request httpbasicauthhandler-objects9970403 +Ref: 32399970403 +Ref: library/urllib request urllib request HTTPBasicAuthHandler http_error_4019970482 +Ref: 323a9970482 +Node: ProxyBasicAuthHandler Objects9970639 +Ref: library/urllib request proxy-basic-auth-handler9970838 +Ref: 323b9970838 +Ref: library/urllib request proxybasicauthhandler-objects9970838 +Ref: 323c9970838 +Ref: library/urllib request urllib request ProxyBasicAuthHandler http_error_4079970919 +Ref: 323d9970919 +Node: AbstractDigestAuthHandler Objects9971077 +Ref: library/urllib request abstract-digest-auth-handler9971277 +Ref: 323e9971277 +Ref: library/urllib request abstractdigestauthhandler-objects9971277 +Ref: 323f9971277 +Ref: library/urllib request urllib request AbstractDigestAuthHandler http_error_auth_reqed9971366 +Ref: 32409971366 +Node: HTTPDigestAuthHandler Objects9971743 +Ref: library/urllib request http-digest-auth-handler9971944 +Ref: 32419971944 +Ref: library/urllib request httpdigestauthhandler-objects9971944 +Ref: 32429971944 +Ref: library/urllib request urllib request HTTPDigestAuthHandler http_error_4019972025 +Ref: 32439972025 +Node: ProxyDigestAuthHandler Objects9972183 +Ref: library/urllib request proxy-digest-auth-handler9972370 +Ref: 32449972370 +Ref: library/urllib request proxydigestauthhandler-objects9972370 +Ref: 32459972370 +Ref: library/urllib request urllib request ProxyDigestAuthHandler http_error_4079972453 +Ref: 32469972453 +Node: HTTPHandler Objects9972612 +Ref: library/urllib request http-handler-objects9972790 +Ref: 32479972790 +Ref: library/urllib request httphandler-objects9972790 +Ref: 32489972790 +Ref: library/urllib request urllib request HTTPHandler http_open9972851 +Ref: 32499972851 +Node: HTTPSHandler Objects9972993 +Ref: library/urllib request https-handler-objects9973160 +Ref: 324a9973160 +Ref: library/urllib request httpshandler-objects9973160 +Ref: 324b9973160 +Ref: library/urllib request urllib request HTTPSHandler https_open9973223 +Ref: 324c9973223 +Node: FileHandler Objects9973368 +Ref: library/urllib request file-handler-objects9973535 +Ref: 324d9973535 +Ref: library/urllib request filehandler-objects9973535 +Ref: 324e9973535 +Ref: library/urllib request urllib request FileHandler file_open9973596 +Ref: 324f9973596 +Node: DataHandler Objects9973898 +Ref: library/urllib request data-handler-objects9974063 +Ref: 32509974063 +Ref: library/urllib request datahandler-objects9974063 +Ref: 32519974063 +Ref: library/urllib request urllib request DataHandler data_open9974124 +Ref: 32529974124 +Ref: DataHandler Objects-Footnote-19974683 +Node: FTPHandler Objects9974742 +Ref: library/urllib request ftp-handler-objects9974911 +Ref: 32539974911 +Ref: library/urllib request ftphandler-objects9974911 +Ref: 32549974911 +Ref: library/urllib request urllib request FTPHandler ftp_open9974970 +Ref: 32559974970 +Node: CacheFTPHandler Objects9975118 +Ref: library/urllib request cacheftp-handler-objects9975290 +Ref: 32569975290 +Ref: library/urllib request cacheftphandler-objects9975290 +Ref: 32579975290 +Ref: library/urllib request urllib request CacheFTPHandler setTimeout9975472 +Ref: 32589975472 +Ref: library/urllib request urllib request CacheFTPHandler setMaxConns9975565 +Ref: 32599975565 +Node: UnknownHandler Objects9975665 +Ref: library/urllib request unknown-handler-objects9975845 +Ref: 325a9975845 +Ref: library/urllib request unknownhandler-objects9975845 +Ref: 325b9975845 +Ref: library/urllib request urllib request UnknownHandler unknown_open9975912 +Ref: 325c9975912 +Node: HTTPErrorProcessor Objects9976003 +Ref: library/urllib request http-error-processor-objects9976172 +Ref: 325d9976172 +Ref: library/urllib request httperrorprocessor-objects9976172 +Ref: 325e9976172 +Ref: library/urllib request urllib request HTTPErrorProcessor http_response9976247 +Ref: 325f9976247 +Ref: library/urllib request urllib request HTTPErrorProcessor https_response9976717 +Ref: 32609976717 +Node: Examples<25>9976880 +Ref: library/urllib request examples9977043 +Ref: 32619977043 +Ref: library/urllib request urllib-request-examples9977043 +Ref: 32629977043 +Ref: library/urllib request urllib-examples9982613 +Ref: 32649982613 +Node: Legacy interface9984105 +Ref: library/urllib request legacy-interface9984269 +Ref: 32659984269 +Ref: library/urllib request urllib request urlretrieve9984500 +Ref: 32669984500 +Ref: library/urllib request urllib request urlcleanup9987162 +Ref: 14009987162 +Ref: library/urllib request urllib request URLopener9987322 +Ref: 12089987322 +Ref: library/urllib request urllib request URLopener open9988831 +Ref: 32689988831 +Ref: library/urllib request urllib request URLopener open_unknown9989334 +Ref: 32699989334 +Ref: library/urllib request urllib request URLopener retrieve9989446 +Ref: 141d9989446 +Ref: library/urllib request urllib request URLopener version9990995 +Ref: 32679990995 +Ref: library/urllib request urllib request FancyURLopener9991316 +Ref: 31e99991316 +Ref: library/urllib request urllib request FancyURLopener prompt_user_passwd9993053 +Ref: 326a9993053 +Ref: Legacy interface-Footnote-19993593 +Node: urllib request Restrictions9993652 +Ref: library/urllib request urllib-request-restrictions9993795 +Ref: 326b9993795 +Node: urllib response — Response classes used by urllib9996363 +Ref: library/urllib request module-urllib response9996596 +Ref: 12b9996596 +Ref: library/urllib request urllib-response-response-classes-used-by-urllib9996596 +Ref: 326c9996596 +Ref: library/urllib request urllib response addinfourl9997060 +Ref: 31e79997060 +Ref: library/urllib request urllib response addinfourl url9997099 +Ref: 326d9997099 +Ref: library/urllib request urllib response addinfourl headers9997231 +Ref: 326e9997231 +Ref: library/urllib request urllib response addinfourl status9997370 +Ref: 326f9997370 +Ref: library/urllib request urllib response addinfourl geturl9997472 +Ref: 32709997472 +Ref: library/urllib request urllib response addinfourl info9997591 +Ref: 32719997591 +Ref: library/urllib request urllib response addinfourl code9997712 +Ref: 32729997712 +Ref: library/urllib request urllib response addinfourl getstatus9997832 +Ref: 32739997832 +Node: urllib parse — Parse URLs into components9997957 +Ref: library/urllib parse doc9998195 +Ref: 32749998195 +Ref: library/urllib parse module-urllib parse9998195 +Ref: 1299998195 +Ref: library/urllib parse urllib-parse-parse-urls-into-components9998195 +Ref: 32759998195 +Ref: urllib parse — Parse URLs into components-Footnote-19999470 +Node: URL Parsing9999542 +Ref: library/urllib parse url-parsing9999669 +Ref: 32769999669 +Ref: library/urllib parse urllib parse urlparse9999842 +Ref: 9b49999842 +Ref: library/urllib parse urllib parse parse_qs10007627 +Ref: 45210007627 +Ref: library/urllib parse urllib parse parse_qsl10009808 +Ref: 45310009808 +Ref: library/urllib parse urllib parse urlunparse10011839 +Ref: 327810011839 +Ref: library/urllib parse urllib parse urlsplit10012241 +Ref: 9b310012241 +Ref: library/urllib parse urllib parse urlunsplit10016520 +Ref: 327910016520 +Ref: library/urllib parse urllib parse urljoin10016964 +Ref: b2310016964 +Ref: library/urllib parse urllib parse urldefrag10018303 +Ref: f0610018303 +Ref: library/urllib parse urllib parse unwrap10019648 +Ref: 327a10019648 +Ref: URL Parsing-Footnote-110019996 +Ref: URL Parsing-Footnote-210020055 +Ref: URL Parsing-Footnote-310020114 +Ref: URL Parsing-Footnote-410020173 +Ref: URL Parsing-Footnote-510020235 +Node: Parsing ASCII Encoded Bytes10020294 +Ref: library/urllib parse id110020454 +Ref: 327b10020454 +Ref: library/urllib parse parsing-ascii-encoded-bytes10020454 +Ref: f0810020454 +Node: Structured Parse Results10022580 +Ref: library/urllib parse structured-parse-results10022740 +Ref: 327c10022740 +Ref: library/urllib parse urlparse-result-object10022740 +Ref: 327710022740 +Ref: library/urllib parse urllib parse urllib parse SplitResult geturl10023156 +Ref: 327d10023156 +Ref: library/urllib parse urllib parse DefragResult10024279 +Ref: 327e10024279 +Ref: library/urllib parse urllib parse ParseResult10024537 +Ref: 328010024537 +Ref: library/urllib parse urllib parse SplitResult10024808 +Ref: 328210024808 +Ref: library/urllib parse urllib parse DefragResultBytes10025213 +Ref: 327f10025213 +Ref: library/urllib parse urllib parse ParseResultBytes10025473 +Ref: 328110025473 +Ref: library/urllib parse urllib parse SplitResultBytes10025772 +Ref: 328310025772 +Node: URL Quoting10026063 +Ref: library/urllib parse url-quoting10026187 +Ref: 328410026187 +Ref: library/urllib parse urllib parse quote10026590 +Ref: 80510026590 +Ref: library/urllib parse urllib parse quote_plus10027965 +Ref: f0710027965 +Ref: library/urllib parse urllib parse quote_from_bytes10028458 +Ref: 328510028458 +Ref: library/urllib parse urllib parse unquote10028751 +Ref: 13fa10028751 +Ref: library/urllib parse urllib parse unquote_plus10029532 +Ref: 328610029532 +Ref: library/urllib parse urllib parse unquote_to_bytes10029872 +Ref: 328710029872 +Ref: library/urllib parse urllib parse urlencode10030305 +Ref: b2110030305 +Ref: URL Quoting-Footnote-110034153 +Ref: URL Quoting-Footnote-210034212 +Ref: URL Quoting-Footnote-310034271 +Ref: URL Quoting-Footnote-410034308 +Ref: URL Quoting-Footnote-510034367 +Ref: URL Quoting-Footnote-610034426 +Ref: URL Quoting-Footnote-710034485 +Ref: URL Quoting-Footnote-810034544 +Ref: URL Quoting-Footnote-910034603 +Node: urllib error — Exception classes raised by urllib request10034662 +Ref: library/urllib error doc10034893 +Ref: 328810034893 +Ref: library/urllib error module-urllib error10034893 +Ref: 12810034893 +Ref: library/urllib error urllib-error-exception-classes-raised-by-urllib-request10034893 +Ref: 328910034893 +Ref: library/urllib error whatwg10034893 +Ref: 328a10034893 +Ref: library/urllib error urllib error URLError10035392 +Ref: 31ea10035392 +Ref: library/urllib error urllib error URLError reason10035570 +Ref: 328b10035570 +Ref: library/urllib error urllib error HTTPError10035841 +Ref: c8010035841 +Ref: library/urllib error urllib error HTTPError code10036198 +Ref: 328c10036198 +Ref: library/urllib error urllib error HTTPError reason10036458 +Ref: 328e10036458 +Ref: library/urllib error urllib error HTTPError headers10036560 +Ref: c8110036560 +Ref: library/urllib error urllib error ContentTooShortError10036726 +Ref: 328f10036726 +Ref: urllib error — Exception classes raised by urllib request-Footnote-110037126 +Ref: urllib error — Exception classes raised by urllib request-Footnote-210037198 +Node: urllib robotparser — Parser for robots txt10037257 +Ref: library/urllib robotparser doc10037466 +Ref: 329010037466 +Ref: library/urllib robotparser module-urllib robotparser10037466 +Ref: 12c10037466 +Ref: library/urllib robotparser urllib-robotparser-parser-for-robots-txt10037466 +Ref: 329110037466 +Ref: library/urllib robotparser urllib robotparser RobotFileParser10038007 +Ref: 96c10038007 +Ref: library/urllib robotparser urllib robotparser RobotFileParser set_url10038180 +Ref: 329210038180 +Ref: library/urllib robotparser urllib robotparser RobotFileParser read10038274 +Ref: 329310038274 +Ref: library/urllib robotparser urllib robotparser RobotFileParser parse10038370 +Ref: 14e310038370 +Ref: library/urllib robotparser urllib robotparser RobotFileParser can_fetch10038440 +Ref: 329410038440 +Ref: library/urllib robotparser urllib robotparser RobotFileParser mtime10038654 +Ref: 329510038654 +Ref: library/urllib robotparser urllib robotparser RobotFileParser modified10038882 +Ref: 329610038882 +Ref: library/urllib robotparser urllib robotparser RobotFileParser crawl_delay10039011 +Ref: 329710039011 +Ref: library/urllib robotparser urllib robotparser RobotFileParser request_rate10039413 +Ref: 329810039413 +Ref: library/urllib robotparser urllib robotparser RobotFileParser site_maps10039864 +Ref: 147f10039864 +Ref: urllib robotparser — Parser for robots txt-Footnote-110040784 +Node: http — HTTP modules10040863 +Ref: library/http doc10041049 +Ref: 329910041049 +Ref: library/http http-http-modules10041049 +Ref: 329a10041049 +Ref: library/http module-http10041049 +Ref: 8e10041049 +Ref: library/http http HTTPStatus10041827 +Ref: 54310041827 +Ref: http — HTTP modules-Footnote-110042563 +Node: HTTP status codes10042636 +Ref: library/http http-status-codes10042732 +Ref: 329b10042732 +Ref: library/http id110042732 +Ref: 329c10042732 +Ref: library/http http HTTPMethod10056491 +Ref: 329d10056491 +Ref: HTTP status codes-Footnote-110057104 +Ref: HTTP status codes-Footnote-210057188 +Ref: HTTP status codes-Footnote-310057247 +Ref: HTTP status codes-Footnote-410057306 +Ref: HTTP status codes-Footnote-510057365 +Ref: HTTP status codes-Footnote-610057424 +Ref: HTTP status codes-Footnote-710057483 +Ref: HTTP status codes-Footnote-810057542 +Ref: HTTP status codes-Footnote-910057601 +Ref: HTTP status codes-Footnote-1010057660 +Ref: HTTP status codes-Footnote-1110057720 +Ref: HTTP status codes-Footnote-1210057780 +Ref: HTTP status codes-Footnote-1310057840 +Ref: HTTP status codes-Footnote-1410057900 +Ref: HTTP status codes-Footnote-1510057960 +Ref: HTTP status codes-Footnote-1610058020 +Ref: HTTP status codes-Footnote-1710058080 +Ref: HTTP status codes-Footnote-1810058140 +Ref: HTTP status codes-Footnote-1910058200 +Ref: HTTP status codes-Footnote-2010058260 +Ref: HTTP status codes-Footnote-2110058320 +Ref: HTTP status codes-Footnote-2210058380 +Ref: HTTP status codes-Footnote-2310058440 +Ref: HTTP status codes-Footnote-2410058500 +Ref: HTTP status codes-Footnote-2510058560 +Ref: HTTP status codes-Footnote-2610058620 +Ref: HTTP status codes-Footnote-2710058680 +Ref: HTTP status codes-Footnote-2810058740 +Ref: HTTP status codes-Footnote-2910058800 +Ref: HTTP status codes-Footnote-3010058860 +Ref: HTTP status codes-Footnote-3110058920 +Ref: HTTP status codes-Footnote-3210058980 +Ref: HTTP status codes-Footnote-3310059040 +Ref: HTTP status codes-Footnote-3410059100 +Ref: HTTP status codes-Footnote-3510059160 +Ref: HTTP status codes-Footnote-3610059220 +Ref: HTTP status codes-Footnote-3710059280 +Ref: HTTP status codes-Footnote-3810059340 +Ref: HTTP status codes-Footnote-3910059400 +Ref: HTTP status codes-Footnote-4010059460 +Ref: HTTP status codes-Footnote-4110059520 +Ref: HTTP status codes-Footnote-4210059580 +Ref: HTTP status codes-Footnote-4310059640 +Ref: HTTP status codes-Footnote-4410059700 +Ref: HTTP status codes-Footnote-4510059760 +Ref: HTTP status codes-Footnote-4610059820 +Ref: HTTP status codes-Footnote-4710059880 +Ref: HTTP status codes-Footnote-4810059940 +Ref: HTTP status codes-Footnote-4910060000 +Ref: HTTP status codes-Footnote-5010060060 +Ref: HTTP status codes-Footnote-5110060120 +Ref: HTTP status codes-Footnote-5210060180 +Ref: HTTP status codes-Footnote-5310060240 +Ref: HTTP status codes-Footnote-5410060300 +Ref: HTTP status codes-Footnote-5510060360 +Ref: HTTP status codes-Footnote-5610060420 +Ref: HTTP status codes-Footnote-5710060480 +Ref: HTTP status codes-Footnote-5810060540 +Ref: HTTP status codes-Footnote-5910060600 +Ref: HTTP status codes-Footnote-6010060660 +Ref: HTTP status codes-Footnote-6110060720 +Ref: HTTP status codes-Footnote-6210060780 +Ref: HTTP status codes-Footnote-6310060840 +Node: HTTP methods10060900 +Ref: library/http http-methods10060996 +Ref: 329e10060996 +Ref: library/http id210060996 +Ref: 329f10060996 +Ref: HTTP methods-Footnote-110063325 +Ref: HTTP methods-Footnote-210063398 +Ref: HTTP methods-Footnote-310063457 +Ref: HTTP methods-Footnote-410063516 +Ref: HTTP methods-Footnote-510063575 +Ref: HTTP methods-Footnote-610063634 +Ref: HTTP methods-Footnote-710063693 +Ref: HTTP methods-Footnote-810063752 +Ref: HTTP methods-Footnote-910063811 +Ref: HTTP methods-Footnote-1010063870 +Node: http client — HTTP protocol client10063930 +Ref: library/http client doc10064102 +Ref: 32a010064102 +Ref: library/http client http-client-http-protocol-client10064102 +Ref: 32a110064102 +Ref: library/http client module-http client10064102 +Ref: 8f10064102 +Ref: library/http client http client HTTPConnection10065027 +Ref: 79610065027 +Ref: library/http client http client HTTPSConnection10066607 +Ref: 79710066607 +Ref: library/http client http client HTTPResponse10068668 +Ref: d7910068668 +Ref: library/http client http client parse_headers10069050 +Ref: 148710069050 +Ref: library/http client http client HTTPException10069985 +Ref: 32a410069985 +Ref: library/http client http client NotConnected10070136 +Ref: 32a510070136 +Ref: library/http client http client InvalidURL10070224 +Ref: 32a610070224 +Ref: library/http client http client UnknownProtocol10070377 +Ref: 32a710070377 +Ref: library/http client http client UnknownTransferEncoding10070468 +Ref: 32a810070468 +Ref: library/http client http client UnimplementedFileMode10070567 +Ref: 32a910070567 +Ref: library/http client http client IncompleteRead10070664 +Ref: 32aa10070664 +Ref: library/http client http client ImproperConnectionState10070754 +Ref: 32ab10070754 +Ref: library/http client http client CannotSendRequest10070853 +Ref: 32ac10070853 +Ref: library/http client http client CannotSendHeader10070956 +Ref: 32ad10070956 +Ref: library/http client http client ResponseNotReady10071058 +Ref: 32ae10071058 +Ref: library/http client http client BadStatusLine10071160 +Ref: 32af10071160 +Ref: library/http client http client LineTooLong10071335 +Ref: 32b010071335 +Ref: library/http client http client RemoteDisconnected10071513 +Ref: a8a10071513 +Ref: library/http client http client HTTP_PORT10071992 +Ref: 32b110071992 +Ref: library/http client http client HTTPS_PORT10072089 +Ref: 32b210072089 +Ref: library/http client http client responses10072189 +Ref: 32b310072189 +Ref: http client — HTTP protocol client-Footnote-110072650 +Ref: http client — HTTP protocol client-Footnote-210072721 +Ref: http client — HTTP protocol client-Footnote-310072772 +Node: HTTPConnection Objects10072831 +Ref: library/http client httpconnection-objects10072955 +Ref: 32b410072955 +Ref: library/http client id110072955 +Ref: 32b510072955 +Ref: library/http client http client HTTPConnection request10073088 +Ref: 91610073088 +Ref: library/http client http client HTTPConnection getresponse10075870 +Ref: a8910075870 +Ref: library/http client http client HTTPConnection set_debuglevel10076362 +Ref: 32b610076362 +Ref: library/http client http client HTTPConnection set_tunnel10076763 +Ref: eda10076763 +Ref: library/http client http client HTTPConnection connect10077768 +Ref: 32b710077768 +Ref: library/http client http client HTTPConnection close10078124 +Ref: 32b810078124 +Ref: library/http client http client HTTPConnection blocksize10078203 +Ref: 32b910078203 +Ref: library/http client http client HTTPConnection putrequest10078487 +Ref: 32ba10078487 +Ref: library/http client http client HTTPConnection putheader10079036 +Ref: 32bb10079036 +Ref: library/http client http client HTTPConnection endheaders10079371 +Ref: 91710079371 +Ref: library/http client http client HTTPConnection send10080740 +Ref: 32bc10080740 +Ref: HTTPConnection Objects-Footnote-110081109 +Ref: HTTPConnection Objects-Footnote-210081167 +Node: HTTPResponse Objects10081226 +Ref: library/http client httpresponse-objects10081371 +Ref: 32bd10081371 +Ref: library/http client id210081371 +Ref: 32be10081371 +Ref: library/http client http client HTTPResponse read10081785 +Ref: 32bf10081785 +Ref: library/http client http client HTTPResponse readinto10081898 +Ref: d7a10081898 +Ref: library/http client http client HTTPResponse getheader10082085 +Ref: 32c010082085 +Ref: library/http client http client HTTPResponse getheaders10082472 +Ref: 32c110082472 +Ref: library/http client http client HTTPResponse fileno10082559 +Ref: 32c210082559 +Ref: library/http client http client HTTPResponse msg10082651 +Ref: 32a210082651 +Ref: library/http client http client HTTPResponse version10082856 +Ref: 32c310082856 +Ref: library/http client http client HTTPResponse url10082977 +Ref: 32c410082977 +Ref: library/http client http client HTTPResponse headers10083107 +Ref: 32c510083107 +Ref: library/http client http client HTTPResponse status10083246 +Ref: 32c610083246 +Ref: library/http client http client HTTPResponse reason10083320 +Ref: 31e810083320 +Ref: library/http client http client HTTPResponse debuglevel10083396 +Ref: 32c710083396 +Ref: library/http client http client HTTPResponse closed10083591 +Ref: 32c810083591 +Ref: library/http client http client HTTPResponse geturl10083672 +Ref: 32c910083672 +Ref: library/http client http client HTTPResponse info10083789 +Ref: 32ca10083789 +Ref: library/http client http client HTTPResponse getstatus10083908 +Ref: 32cb10083908 +Node: Examples<26>10084031 +Ref: library/http client examples10084173 +Ref: 32cc10084173 +Node: HTTPMessage Objects10087060 +Ref: library/http client httpmessage-objects10087173 +Ref: 32cd10087173 +Ref: library/http client id310087173 +Ref: 32ce10087173 +Node: ftplib — FTP protocol client10087388 +Ref: library/ftplib doc10087570 +Ref: 32cf10087570 +Ref: library/ftplib ftplib-ftp-protocol-client10087570 +Ref: 32d010087570 +Ref: library/ftplib module-ftplib10087570 +Ref: 7e10087570 +Ref: library/ftplib ftplib FTP10089457 +Ref: 53d10089457 +Ref: library/ftplib ftplib FTP_TLS10091354 +Ref: 53e10091354 +Ref: library/ftplib ftplib error_reply10093959 +Ref: 32d210093959 +Ref: library/ftplib ftplib error_temp10094076 +Ref: 32d310094076 +Ref: library/ftplib ftplib error_perm10094239 +Ref: 32d410094239 +Ref: library/ftplib ftplib error_proto10094402 +Ref: 32d510094402 +Ref: library/ftplib ftplib all_errors10094633 +Ref: 32d610094633 +Ref: ftplib — FTP protocol client-Footnote-110095295 +Ref: ftplib — FTP protocol client-Footnote-210095361 +Ref: ftplib — FTP protocol client-Footnote-310095419 +Ref: ftplib — FTP protocol client-Footnote-410095478 +Ref: ftplib — FTP protocol client-Footnote-510095537 +Ref: ftplib — FTP protocol client-Footnote-610095596 +Node: FTP Objects10095655 +Ref: library/ftplib ftp-objects10095757 +Ref: 32d710095757 +Ref: library/ftplib id110095757 +Ref: 32d810095757 +Ref: library/ftplib ftplib FTP set_debuglevel10096094 +Ref: 32d910096094 +Ref: library/ftplib ftplib FTP connect10096558 +Ref: 32da10096558 +Ref: library/ftplib ftplib FTP getwelcome10097570 +Ref: 32db10097570 +Ref: library/ftplib ftplib FTP login10097800 +Ref: 32dc10097800 +Ref: library/ftplib ftplib FTP abort10098513 +Ref: 32dd10098513 +Ref: library/ftplib ftplib FTP sendcmd10098651 +Ref: 32de10098651 +Ref: library/ftplib ftplib FTP voidcmd10098876 +Ref: 32df10098876 +Ref: library/ftplib ftplib FTP retrbinary10099250 +Ref: 32e010099250 +Ref: library/ftplib ftplib FTP retrlines10099930 +Ref: 32e210099930 +Ref: library/ftplib ftplib FTP set_pasv10100606 +Ref: 32e310100606 +Ref: library/ftplib ftplib FTP storbinary10100757 +Ref: fad10100757 +Ref: library/ftplib ftplib FTP storlines10101457 +Ref: 32e410101457 +Ref: library/ftplib ftplib FTP transfercmd10101912 +Ref: 32e110101912 +Ref: library/ftplib ftplib FTP ntransfercmd10103070 +Ref: 32e510103070 +Ref: library/ftplib ftplib FTP mlsd10103420 +Ref: d6d10103420 +Ref: library/ftplib ftplib FTP nlst10104112 +Ref: d6e10104112 +Ref: library/ftplib ftplib FTP dir10104523 +Ref: d6f10104523 +Ref: library/ftplib ftplib FTP rename10105158 +Ref: 32e610105158 +Ref: library/ftplib ftplib FTP delete10105257 +Ref: 32e710105257 +Ref: library/ftplib ftplib FTP cwd10105520 +Ref: 32e810105520 +Ref: library/ftplib ftplib FTP mkd10105599 +Ref: 32e910105599 +Ref: library/ftplib ftplib FTP pwd10105675 +Ref: 32ea10105675 +Ref: library/ftplib ftplib FTP rmd10105765 +Ref: 32eb10105765 +Ref: library/ftplib ftplib FTP size10105854 +Ref: 32ec10105854 +Ref: library/ftplib ftplib FTP quit10106180 +Ref: 32ed10106180 +Ref: library/ftplib ftplib FTP close10106590 +Ref: 32ee10106590 +Ref: FTP Objects-Footnote-110107050 +Node: FTP_TLS Objects10107109 +Ref: library/ftplib ftp-tls-objects10107211 +Ref: 32ef10107211 +Ref: library/ftplib ftplib FTP_TLS ssl_version10107356 +Ref: 32f010107356 +Ref: library/ftplib ftplib FTP_TLS auth10107473 +Ref: 32f110107473 +Ref: library/ftplib ftplib FTP_TLS ccc10107831 +Ref: d6c10107831 +Ref: library/ftplib ftplib FTP_TLS prot_p10108071 +Ref: 32d110108071 +Ref: library/ftplib ftplib FTP_TLS prot_c10108139 +Ref: 32f210108139 +Node: poplib — POP3 protocol client10108211 +Ref: library/poplib doc10108390 +Ref: 32f310108390 +Ref: library/poplib module-poplib10108390 +Ref: cd10108390 +Ref: library/poplib poplib-pop3-protocol-client10108390 +Ref: 32f410108390 +Ref: library/poplib poplib POP310109736 +Ref: 56c10109736 +Ref: library/poplib poplib POP3_SSL10110653 +Ref: 56d10110653 +Ref: library/poplib poplib error_proto10112600 +Ref: e5110112600 +Ref: poplib — POP3 protocol client-Footnote-110113253 +Ref: poplib — POP3 protocol client-Footnote-210113319 +Ref: poplib — POP3 protocol client-Footnote-310113378 +Ref: poplib — POP3 protocol client-Footnote-410113437 +Ref: poplib — POP3 protocol client-Footnote-510113496 +Node: POP3 Objects10113558 +Ref: library/poplib id110113659 +Ref: 32f510113659 +Ref: library/poplib pop3-objects10113659 +Ref: 32f610113659 +Ref: library/poplib poplib POP3 set_debuglevel10113890 +Ref: 32f710113890 +Ref: library/poplib poplib POP3 getwelcome10114355 +Ref: 32f810114355 +Ref: library/poplib poplib POP3 capa10114446 +Ref: c1a10114446 +Ref: library/poplib poplib POP3 user10114635 +Ref: 32f910114635 +Ref: library/poplib poplib POP3 pass_10114753 +Ref: 32fa10114753 +Ref: library/poplib poplib POP3 apop10114936 +Ref: 32fb10114936 +Ref: library/poplib poplib POP3 rpop10115054 +Ref: 32fc10115054 +Ref: library/poplib poplib POP3 stat10115173 +Ref: 32fd10115173 +Ref: library/poplib poplib POP3 list10115305 +Ref: 32fe10115305 +Ref: library/poplib poplib POP3 retr10115497 +Ref: 32ff10115497 +Ref: library/poplib poplib POP3 dele10115660 +Ref: 330010115660 +Ref: library/poplib poplib POP3 rset10115938 +Ref: 330110115938 +Ref: library/poplib poplib POP3 noop10116013 +Ref: 330210116013 +Ref: library/poplib poplib POP3 quit10116089 +Ref: e5010116089 +Ref: library/poplib poplib POP3 top10116179 +Ref: 330310116179 +Ref: library/poplib poplib POP3 uidl10116716 +Ref: 330410116716 +Ref: library/poplib poplib POP3 utf810117000 +Ref: ace10117000 +Ref: library/poplib poplib POP3 stls10117207 +Ref: c1b10117207 +Ref: POP3 Objects-Footnote-110118006 +Ref: POP3 Objects-Footnote-210118065 +Ref: POP3 Objects-Footnote-310118124 +Node: POP3 Example10118183 +Ref: library/poplib id210118284 +Ref: 330510118284 +Ref: library/poplib pop3-example10118284 +Ref: 330610118284 +Node: imaplib — IMAP4 protocol client10118796 +Ref: library/imaplib doc10118977 +Ref: 330710118977 +Ref: library/imaplib imaplib-imap4-protocol-client10118977 +Ref: 330810118977 +Ref: library/imaplib module-imaplib10118977 +Ref: 9410118977 +Ref: library/imaplib imaplib IMAP410119875 +Ref: 54610119875 +Ref: library/imaplib imaplib IMAP4 error10121079 +Ref: 330910121079 +Ref: library/imaplib imaplib IMAP4 abort10121222 +Ref: 330a10121222 +Ref: library/imaplib imaplib IMAP4 readonly10121484 +Ref: 330b10121484 +Ref: library/imaplib imaplib IMAP4_SSL10121841 +Ref: 54710121841 +Ref: library/imaplib imaplib IMAP4_stream10123842 +Ref: 54910123842 +Ref: library/imaplib imaplib Internaldate2tuple10124112 +Ref: 330c10124112 +Ref: library/imaplib imaplib Int2AP10124362 +Ref: 330d10124362 +Ref: library/imaplib imaplib ParseFlags10124510 +Ref: 330e10124510 +Ref: library/imaplib imaplib Time2Internaldate10124631 +Ref: 330f10124631 +Ref: imaplib — IMAP4 protocol client-Footnote-110125974 +Ref: imaplib — IMAP4 protocol client-Footnote-210126041 +Ref: imaplib — IMAP4 protocol client-Footnote-310126100 +Node: IMAP4 Objects10126159 +Ref: library/imaplib id110126264 +Ref: 331010126264 +Ref: library/imaplib imap4-objects10126264 +Ref: 331110126264 +Ref: library/imaplib imaplib IMAP4 append10127768 +Ref: 331210127768 +Ref: library/imaplib imaplib IMAP4 authenticate10127872 +Ref: 331310127872 +Ref: library/imaplib imaplib IMAP4 check10128708 +Ref: 331410128708 +Ref: library/imaplib imaplib IMAP4 close10128772 +Ref: 54b10128772 +Ref: library/imaplib imaplib IMAP4 copy10128957 +Ref: 331510128957 +Ref: library/imaplib imaplib IMAP4 create10129069 +Ref: 331610129069 +Ref: library/imaplib imaplib IMAP4 delete10129147 +Ref: 331710129147 +Ref: library/imaplib imaplib IMAP4 deleteacl10129225 +Ref: 331810129225 +Ref: library/imaplib imaplib IMAP4 enable10129335 +Ref: a8e10129335 +Ref: library/imaplib imaplib IMAP4 expunge10129652 +Ref: 331910129652 +Ref: library/imaplib imaplib IMAP4 fetch10129900 +Ref: 331a10129900 +Ref: library/imaplib imaplib IMAP4 getacl10130180 +Ref: 331b10130180 +Ref: library/imaplib imaplib IMAP4 getannotation10130334 +Ref: 331c10130334 +Ref: library/imaplib imaplib IMAP4 getquota10130535 +Ref: 331d10130535 +Ref: library/imaplib imaplib IMAP4 getquotaroot10130709 +Ref: 331e10130709 +Ref: library/imaplib imaplib IMAP4 list10130897 +Ref: 331f10130897 +Ref: library/imaplib imaplib IMAP4 login10131166 +Ref: 332010131166 +Ref: library/imaplib imaplib IMAP4 login_cram_md510131299 +Ref: 332110131299 +Ref: library/imaplib imaplib IMAP4 logout10131559 +Ref: 332210131559 +Ref: library/imaplib imaplib IMAP4 lsub10131756 +Ref: 332310131756 +Ref: library/imaplib imaplib IMAP4 myrights10132046 +Ref: 332410132046 +Ref: library/imaplib imaplib IMAP4 namespace10132165 +Ref: 332510132165 +Ref: library/imaplib imaplib IMAP4 noop10132254 +Ref: 332610132254 +Ref: library/imaplib imaplib IMAP4 open10132314 +Ref: 54810132314 +Ref: library/imaplib imaplib IMAP4 partial10133249 +Ref: 332b10133249 +Ref: library/imaplib imaplib IMAP4 proxyauth10133426 +Ref: 332c10133426 +Ref: library/imaplib imaplib IMAP4 read10133578 +Ref: 332710133578 +Ref: library/imaplib imaplib IMAP4 readline10133694 +Ref: 332810133694 +Ref: library/imaplib imaplib IMAP4 recent10133806 +Ref: 332d10133806 +Ref: library/imaplib imaplib IMAP4 rename10133961 +Ref: 332e10133961 +Ref: library/imaplib imaplib IMAP4 response10134069 +Ref: 332f10134069 +Ref: library/imaplib imaplib IMAP4 search10134227 +Ref: 333010134227 +Ref: library/imaplib imaplib IMAP4 select10134902 +Ref: 333110134902 +Ref: library/imaplib imaplib IMAP4 send10135197 +Ref: 332910135197 +Ref: library/imaplib imaplib IMAP4 setacl10135411 +Ref: 333210135411 +Ref: library/imaplib imaplib IMAP4 setannotation10135574 +Ref: 333310135574 +Ref: library/imaplib imaplib IMAP4 setquota10135763 +Ref: 333410135763 +Ref: library/imaplib imaplib IMAP4 shutdown10135937 +Ref: 332a10135937 +Ref: library/imaplib imaplib IMAP4 socket10136124 +Ref: 333510136124 +Ref: library/imaplib imaplib IMAP4 sort10136210 +Ref: 333610136210 +Ref: library/imaplib imaplib IMAP4 starttls10137154 +Ref: ed710137154 +Ref: library/imaplib imaplib IMAP4 status10137681 +Ref: 333710137681 +Ref: library/imaplib imaplib IMAP4 store10137777 +Ref: 333810137777 +Ref: library/imaplib imaplib IMAP4 subscribe10138984 +Ref: 333910138984 +Ref: library/imaplib imaplib IMAP4 thread10139055 +Ref: 333a10139055 +Ref: library/imaplib imaplib IMAP4 uid10140182 +Ref: 333b10140182 +Ref: library/imaplib imaplib IMAP4 unsubscribe10140500 +Ref: 333c10140500 +Ref: library/imaplib imaplib IMAP4 unselect10140577 +Ref: 54a10140577 +Ref: library/imaplib imaplib IMAP4 xatom10140974 +Ref: 333d10140974 +Ref: library/imaplib imaplib IMAP4 PROTOCOL_VERSION10141178 +Ref: 333e10141178 +Ref: library/imaplib imaplib IMAP4 debug10141313 +Ref: 333f10141313 +Ref: library/imaplib imaplib IMAP4 utf8_enabled10141516 +Ref: a8f10141516 +Ref: IMAP4 Objects-Footnote-110141794 +Ref: IMAP4 Objects-Footnote-210141853 +Ref: IMAP4 Objects-Footnote-310141912 +Ref: IMAP4 Objects-Footnote-410141971 +Ref: IMAP4 Objects-Footnote-510142030 +Ref: IMAP4 Objects-Footnote-610142089 +Node: IMAP4 Example10142148 +Ref: library/imaplib id210142253 +Ref: 334010142253 +Ref: library/imaplib imap4-example10142253 +Ref: 334110142253 +Node: smtplib — SMTP protocol client10142741 +Ref: library/smtplib doc10142934 +Ref: 334210142934 +Ref: library/smtplib module-smtplib10142934 +Ref: ea10142934 +Ref: library/smtplib smtplib-smtp-protocol-client10142934 +Ref: 334310142934 +Ref: library/smtplib smtplib SMTP10143657 +Ref: 57510143657 +Ref: library/smtplib smtplib SMTP_SSL10146232 +Ref: 57610146232 +Ref: library/smtplib smtplib LMTP10148097 +Ref: 57710148097 +Ref: library/smtplib smtplib SMTPException10149014 +Ref: c3f10149014 +Ref: library/smtplib smtplib SMTPServerDisconnected10149270 +Ref: 334610149270 +Ref: library/smtplib smtplib SMTPResponseException10149498 +Ref: 334710149498 +Ref: library/smtplib smtplib SMTPSenderRefused10149863 +Ref: 334810149863 +Ref: library/smtplib smtplib SMTPRecipientsRefused10150104 +Ref: 334910150104 +Ref: library/smtplib smtplib SMTPDataError10150377 +Ref: 334a10150377 +Ref: library/smtplib smtplib SMTPConnectError10150473 +Ref: 334410150473 +Ref: library/smtplib smtplib SMTPHeloError10150594 +Ref: 334b10150594 +Ref: library/smtplib smtplib SMTPNotSupportedError10150681 +Ref: 13eb10150681 +Ref: library/smtplib smtplib SMTPAuthenticationError10150823 +Ref: 334c10150823 +Ref: smtplib — SMTP protocol client-Footnote-110151546 +Ref: smtplib — SMTP protocol client-Footnote-210151613 +Ref: smtplib — SMTP protocol client-Footnote-310151671 +Ref: smtplib — SMTP protocol client-Footnote-410151730 +Ref: smtplib — SMTP protocol client-Footnote-510151789 +Ref: smtplib — SMTP protocol client-Footnote-610151847 +Node: SMTP Objects10151906 +Ref: library/smtplib id110152008 +Ref: 334d10152008 +Ref: library/smtplib smtp-objects10152008 +Ref: 334e10152008 +Ref: library/smtplib smtplib SMTP set_debuglevel10152112 +Ref: adf10152112 +Ref: library/smtplib smtplib SMTP docmd10152463 +Ref: 334f10152463 +Ref: library/smtplib smtplib SMTP connect10153113 +Ref: 13ed10153113 +Ref: library/smtplib smtplib SMTP helo10153799 +Ref: 335010153799 +Ref: library/smtplib smtplib SMTP ehlo10154259 +Ref: 335110154259 +Ref: library/smtplib smtplib SMTP ehlo_or_helo_if_needed10155164 +Ref: 335310155164 +Ref: library/smtplib smtplib SMTP has_extn10155506 +Ref: 335210155506 +Ref: library/smtplib smtplib SMTP verify10155701 +Ref: 335410155701 +Ref: library/smtplib smtplib SMTP login10156120 +Ref: 335510156120 +Ref: library/smtplib smtplib SMTP auth10157705 +Ref: ade10157705 +Ref: library/smtplib smtplib SMTP starttls10159948 +Ref: de510159948 +Ref: library/smtplib smtplib SMTP sendmail10161658 +Ref: ae010161658 +Ref: library/smtplib smtplib SMTP send_message10165139 +Ref: ae110165139 +Ref: library/smtplib smtplib SMTP quit10167207 +Ref: 334510167207 +Ref: SMTP Objects-Footnote-110167670 +Ref: SMTP Objects-Footnote-210167728 +Ref: SMTP Objects-Footnote-310167787 +Ref: SMTP Objects-Footnote-410167846 +Ref: SMTP Objects-Footnote-510167904 +Ref: SMTP Objects-Footnote-610167962 +Node: SMTP Example10168021 +Ref: library/smtplib id210168123 +Ref: 335610168123 +Ref: library/smtplib smtp-example10168123 +Ref: 335710168123 +Ref: SMTP Example-Footnote-110169556 +Node: uuid — UUID objects according to RFC 412210169614 +Ref: library/uuid doc10169822 +Ref: 335810169822 +Ref: library/uuid module-uuid10169822 +Ref: 12e10169822 +Ref: library/uuid uuid-uuid-objects-according-to-rfc-412210169822 +Ref: 335910169822 +Ref: library/uuid uuid SafeUUID10170938 +Ref: 335d10170938 +Ref: library/uuid uuid SafeUUID safe10170990 +Ref: 335e10170990 +Ref: library/uuid uuid SafeUUID unsafe10171107 +Ref: 335f10171107 +Ref: library/uuid uuid SafeUUID unknown10171204 +Ref: 336010171204 +Ref: library/uuid uuid UUID10171345 +Ref: 6b210171345 +Ref: library/uuid uuid UUID bytes10173306 +Ref: 336210173306 +Ref: library/uuid uuid UUID bytes_le10173435 +Ref: 336310173435 +Ref: library/uuid uuid UUID fields10173587 +Ref: 336410173587 +Ref: library/uuid uuid UUID hex10175147 +Ref: 336510175147 +Ref: library/uuid uuid UUID int10175235 +Ref: 336110175235 +Ref: library/uuid uuid UUID urn10175297 +Ref: 336610175297 +Ref: library/uuid uuid UUID variant10175375 +Ref: 336710175375 +Ref: library/uuid uuid UUID version10175639 +Ref: 336c10175639 +Ref: library/uuid uuid UUID is_safe10175777 +Ref: 80910175777 +Ref: library/uuid uuid getnode10176032 +Ref: 80a10176032 +Ref: library/uuid uuid uuid110177002 +Ref: 80b10177002 +Ref: library/uuid uuid uuid310177354 +Ref: 335a10177354 +Ref: library/uuid uuid uuid410177523 +Ref: 335b10177523 +Ref: library/uuid uuid uuid510177582 +Ref: 335c10177582 +Ref: library/uuid uuid NAMESPACE_DNS10177884 +Ref: 336d10177884 +Ref: library/uuid uuid NAMESPACE_URL10178011 +Ref: 336e10178011 +Ref: library/uuid uuid NAMESPACE_OID10178109 +Ref: 336f10178109 +Ref: library/uuid uuid NAMESPACE_X50010178212 +Ref: 337010178212 +Ref: library/uuid uuid RESERVED_NCS10178470 +Ref: 336810178470 +Ref: library/uuid uuid RFC_412210178537 +Ref: 336910178537 +Ref: library/uuid uuid RESERVED_MICROSOFT10178616 +Ref: 336a10178616 +Ref: library/uuid uuid RESERVED_FUTURE10178695 +Ref: 336b10178695 +Ref: uuid — UUID objects according to RFC 4122-Footnote-110179073 +Ref: uuid — UUID objects according to RFC 4122-Footnote-210179137 +Ref: uuid — UUID objects according to RFC 4122-Footnote-310179196 +Ref: uuid — UUID objects according to RFC 4122-Footnote-410179255 +Ref: uuid — UUID objects according to RFC 4122-Footnote-510179314 +Ref: uuid — UUID objects according to RFC 4122-Footnote-610179373 +Ref: uuid — UUID objects according to RFC 4122-Footnote-710179432 +Node: Example<12>10179491 +Ref: library/uuid example10179582 +Ref: 337110179582 +Ref: library/uuid uuid-example10179582 +Ref: 337210179582 +Node: socketserver — A framework for network servers10180841 +Ref: library/socketserver doc10181045 +Ref: 337310181045 +Ref: library/socketserver module-socketserver10181045 +Ref: ed10181045 +Ref: library/socketserver socketserver-a-framework-for-network-servers10181045 +Ref: 337410181045 +Ref: library/socketserver socketserver TCPServer10181638 +Ref: 337510181638 +Ref: library/socketserver socketserver UDPServer10182109 +Ref: 337810182109 +Ref: library/socketserver socketserver UnixStreamServer10182412 +Ref: 337910182412 +Ref: library/socketserver socketserver UnixDatagramServer10182525 +Ref: 337a10182525 +Ref: socketserver — A framework for network servers-Footnote-110184878 +Node: Server Creation Notes10184950 +Ref: library/socketserver server-creation-notes10185082 +Ref: 337f10185082 +Ref: library/socketserver socketserver ForkingMixIn10185916 +Ref: 7d610185916 +Ref: library/socketserver socketserver ThreadingMixIn10185953 +Ref: 7d710185953 +Ref: library/socketserver socketserver ForkingTCPServer10187443 +Ref: 338110187443 +Ref: library/socketserver socketserver ForkingUDPServer10187484 +Ref: 338210187484 +Ref: library/socketserver socketserver ThreadingTCPServer10187525 +Ref: 338310187525 +Ref: library/socketserver socketserver ThreadingUDPServer10187568 +Ref: 338010187568 +Node: Server Objects<2>10189859 +Ref: library/socketserver server-objects10190023 +Ref: 338510190023 +Ref: library/socketserver socketserver BaseServer10190074 +Ref: dea10190074 +Ref: library/socketserver socketserver BaseServer fileno10190473 +Ref: 338810190473 +Ref: library/socketserver socketserver BaseServer handle_request10190746 +Ref: 337d10190746 +Ref: library/socketserver socketserver BaseServer serve_forever10191348 +Ref: dec10191348 +Ref: library/socketserver socketserver BaseServer service_actions10191999 +Ref: deb10191999 +Ref: library/socketserver socketserver BaseServer shutdown10192299 +Ref: 146b10192299 +Ref: library/socketserver socketserver BaseServer server_close10192579 +Ref: 337e10192579 +Ref: library/socketserver socketserver BaseServer address_family10192665 +Ref: 338e10192665 +Ref: library/socketserver socketserver BaseServer RequestHandlerClass10192876 +Ref: 338710192876 +Ref: library/socketserver socketserver BaseServer server_address10193034 +Ref: 338610193034 +Ref: library/socketserver socketserver BaseServer socket10193457 +Ref: 338f10193457 +Ref: library/socketserver socketserver BaseServer allow_reuse_address10193643 +Ref: 339010193643 +Ref: library/socketserver socketserver BaseServer request_queue_size10193857 +Ref: 339110193857 +Ref: library/socketserver socketserver BaseServer socket_type10194348 +Ref: 339210194348 +Ref: library/socketserver socketserver BaseServer timeout10194539 +Ref: 338c10194539 +Ref: library/socketserver socketserver BaseServer finish_request10195045 +Ref: 339310195045 +Ref: library/socketserver socketserver BaseServer get_request10195262 +Ref: 338910195262 +Ref: library/socketserver socketserver BaseServer handle_error10195492 +Ref: 9b710195492 +Ref: library/socketserver socketserver BaseServer handle_timeout10195944 +Ref: 338d10195944 +Ref: library/socketserver socketserver BaseServer process_request10196383 +Ref: 338b10196383 +Ref: library/socketserver socketserver BaseServer server_activate10196754 +Ref: 337710196754 +Ref: library/socketserver socketserver BaseServer server_bind10197001 +Ref: 337610197001 +Ref: library/socketserver socketserver BaseServer verify_request10197155 +Ref: 338a10197155 +Node: Request Handler Objects10197740 +Ref: library/socketserver request-handler-objects10197895 +Ref: 339410197895 +Ref: library/socketserver socketserver BaseRequestHandler10197964 +Ref: 337b10197964 +Ref: library/socketserver socketserver BaseRequestHandler setup10198318 +Ref: 339510198318 +Ref: library/socketserver socketserver BaseRequestHandler handle10198513 +Ref: 337c10198513 +Ref: library/socketserver socketserver BaseRequestHandler finish10199217 +Ref: 339610199217 +Ref: library/socketserver socketserver StreamRequestHandler10199496 +Ref: 94810199496 +Ref: library/socketserver socketserver DatagramRequestHandler10199541 +Ref: 338410199541 +Node: Examples<27>10200305 +Ref: library/socketserver examples10200434 +Ref: 339710200434 +Node: socketserver TCPServer Example10200639 +Ref: library/socketserver socketserver-tcpserver-example10200757 +Ref: 339810200757 +Node: socketserver UDPServer Example10203913 +Ref: library/socketserver socketserver-udpserver-example10204059 +Ref: 339910204059 +Node: Asynchronous Mixins10205676 +Ref: library/socketserver asynchronous-mixins10205783 +Ref: 339a10205783 +Node: http server — HTTP servers10208129 +Ref: library/http server doc10208328 +Ref: 339b10208328 +Ref: library/http server http-server-http-servers10208328 +Ref: 339c10208328 +Ref: library/http server module-http server10208328 +Ref: 9210208328 +Ref: library/http server http server HTTPServer10209370 +Ref: 31b810209370 +Ref: library/http server http server ThreadingHTTPServer10209725 +Ref: 79a10209725 +Ref: library/http server http server BaseHTTPRequestHandler10210273 +Ref: d7610210273 +Ref: library/http server http server BaseHTTPRequestHandler client_address10211257 +Ref: 339e10211257 +Ref: library/http server http server BaseHTTPRequestHandler server10211399 +Ref: 339f10211399 +Ref: library/http server http server BaseHTTPRequestHandler close_connection10211468 +Ref: 33a010211468 +Ref: library/http server http server BaseHTTPRequestHandler requestline10211703 +Ref: 33a210211703 +Ref: library/http server http server BaseHTTPRequestHandler command10212018 +Ref: 33a310212018 +Ref: library/http server http server BaseHTTPRequestHandler path10212122 +Ref: 33a410212122 +Ref: library/http server http server BaseHTTPRequestHandler request_version10212396 +Ref: 33a510212396 +Ref: library/http server http server BaseHTTPRequestHandler headers10212532 +Ref: 32a310212532 +Ref: library/http server http server BaseHTTPRequestHandler rfile10212959 +Ref: 33a710212959 +Ref: library/http server http server BaseHTTPRequestHandler wfile10213111 +Ref: 33a810213111 +Ref: library/http server http server BaseHTTPRequestHandler server_version10213559 +Ref: 33a910213559 +Ref: library/http server http server BaseHTTPRequestHandler sys_version10213846 +Ref: 33aa10213846 +Ref: library/http server http server BaseHTTPRequestHandler error_message_format10214101 +Ref: 33ac10214101 +Ref: library/http server http server BaseHTTPRequestHandler error_content_type10214462 +Ref: 33ad10214462 +Ref: library/http server http server BaseHTTPRequestHandler protocol_version10214642 +Ref: 33ae10214642 +Ref: library/http server http server BaseHTTPRequestHandler MessageClass10215238 +Ref: 33a610215238 +Ref: library/http server http server BaseHTTPRequestHandler responses10215470 +Ref: 328d10215470 +Ref: library/http server http server BaseHTTPRequestHandler handle10216035 +Ref: 33b110216035 +Ref: library/http server http server BaseHTTPRequestHandler handle_one_request10216335 +Ref: 33a110216335 +Ref: library/http server http server BaseHTTPRequestHandler handle_expect_10010216533 +Ref: 33b210216533 +Ref: library/http server http server BaseHTTPRequestHandler send_error10217042 +Ref: bea10217042 +Ref: library/http server http server BaseHTTPRequestHandler send_response10218170 +Ref: 33b310218170 +Ref: library/http server http server BaseHTTPRequestHandler send_header10218986 +Ref: 33af10218986 +Ref: library/http server http server BaseHTTPRequestHandler send_response_only10219566 +Ref: 33b010219566 +Ref: library/http server http server BaseHTTPRequestHandler end_headers10219986 +Ref: d7710219986 +Ref: library/http server http server BaseHTTPRequestHandler flush_headers10220285 +Ref: d7810220285 +Ref: library/http server http server BaseHTTPRequestHandler log_request10220457 +Ref: 33b510220457 +Ref: library/http server http server BaseHTTPRequestHandler log_error10220754 +Ref: 33b610220754 +Ref: library/http server http server BaseHTTPRequestHandler log_message10220999 +Ref: 33b710220999 +Ref: library/http server http server BaseHTTPRequestHandler version_string10221488 +Ref: 33ab10221488 +Ref: library/http server http server BaseHTTPRequestHandler date_time_string10221702 +Ref: 33b410221702 +Ref: library/http server http server BaseHTTPRequestHandler log_date_time_string10222090 +Ref: 33b810222090 +Ref: library/http server http server BaseHTTPRequestHandler address_string10222201 +Ref: 33b910222201 +Ref: library/http server http server SimpleHTTPRequestHandler10222444 +Ref: 79910222444 +Ref: library/http server http server SimpleHTTPRequestHandler server_version10223220 +Ref: 33bc10223220 +Ref: library/http server http server SimpleHTTPRequestHandler extensions_map10223381 +Ref: 33bd10223381 +Ref: library/http server http server SimpleHTTPRequestHandler do_HEAD10223883 +Ref: 33bb10223883 +Ref: library/http server http server SimpleHTTPRequestHandler do_GET10224171 +Ref: 33ba10224171 +Ref: library/http server http-server-cli10226567 +Ref: beb10226567 +Ref: library/http server http server CGIHTTPRequestHandler10228028 +Ref: 33be10228028 +Ref: library/http server http server CGIHTTPRequestHandler cgi_directories10229219 +Ref: 33bf10229219 +Ref: library/http server http server CGIHTTPRequestHandler do_POST10229465 +Ref: 33c010229465 +Ref: http server — HTTP servers-Footnote-110230102 +Ref: http server — HTTP servers-Footnote-210230173 +Ref: http server — HTTP servers-Footnote-310230232 +Ref: http server — HTTP servers-Footnote-410230291 +Node: Security Considerations<3>10230362 +Ref: library/http server http-server-security10230453 +Ref: 339d10230453 +Ref: library/http server security-considerations10230453 +Ref: 33c110230453 +Node: http cookies — HTTP state management10230693 +Ref: library/http cookies doc10230895 +Ref: 33c210230895 +Ref: library/http cookies http-cookies-http-state-management10230895 +Ref: 33c310230895 +Ref: library/http cookies module-http cookies10230895 +Ref: 9110230895 +Ref: library/http cookies http cookies CookieError10232257 +Ref: 33c410232257 +Ref: library/http cookies http cookies BaseCookie10232424 +Ref: 33c510232424 +Ref: library/http cookies http cookies SimpleCookie10232813 +Ref: 148110232813 +Ref: http cookies — HTTP state management-Footnote-110233643 +Ref: http cookies — HTTP state management-Footnote-210233715 +Ref: http cookies — HTTP state management-Footnote-310233774 +Ref: http cookies — HTTP state management-Footnote-410233833 +Ref: http cookies — HTTP state management-Footnote-510233892 +Node: Cookie Objects10233951 +Ref: library/http cookies cookie-objects10234063 +Ref: 33c710234063 +Ref: library/http cookies id110234063 +Ref: 33c810234063 +Ref: library/http cookies http cookies BaseCookie value_decode10234114 +Ref: 33c910234114 +Ref: library/http cookies http cookies BaseCookie value_encode10234386 +Ref: 33ca10234386 +Ref: library/http cookies http cookies BaseCookie output10234838 +Ref: 33cb10234838 +Ref: library/http cookies http cookies BaseCookie js_output10235206 +Ref: 33cc10235206 +Ref: library/http cookies http cookies BaseCookie load10235485 +Ref: 33c610235485 +Node: Morsel Objects10235767 +Ref: library/http cookies id210235899 +Ref: 33cd10235899 +Ref: library/http cookies morsel-objects10235899 +Ref: 33ce10235899 +Ref: library/http cookies http cookies Morsel10235950 +Ref: 86e10235950 +Ref: library/http cookies http cookies Morsel value10237302 +Ref: 86c10237302 +Ref: library/http cookies http cookies Morsel coded_value10237362 +Ref: 86d10237362 +Ref: library/http cookies http cookies Morsel key10237468 +Ref: 86b10237468 +Ref: library/http cookies http cookies Morsel set10237525 +Ref: 86f10237525 +Ref: library/http cookies http cookies Morsel isReservedKey10237634 +Ref: 33cf10237634 +Ref: library/http cookies http cookies Morsel output10237745 +Ref: 33d010237745 +Ref: library/http cookies http cookies Morsel js_output10238085 +Ref: 33d110238085 +Ref: library/http cookies http cookies Morsel OutputString10238359 +Ref: 33d210238359 +Ref: library/http cookies http cookies Morsel update10238571 +Ref: b5710238571 +Ref: library/http cookies http cookies Morsel copy10238871 +Ref: b5610238871 +Ref: library/http cookies http cookies Morsel setdefault10239026 +Ref: 33d310239026 +Ref: Morsel Objects-Footnote-110239241 +Ref: Morsel Objects-Footnote-210239300 +Ref: Morsel Objects-Footnote-310239359 +Ref: Morsel Objects-Footnote-410239418 +Node: Example<13>10239477 +Ref: library/http cookies cookie-example10239586 +Ref: 33d410239586 +Ref: library/http cookies example10239586 +Ref: 33d510239586 +Node: http cookiejar — Cookie handling for HTTP clients10241238 +Ref: library/http cookiejar doc10241455 +Ref: 33d610241455 +Ref: library/http cookiejar http-cookiejar-cookie-handling-for-http-clients10241455 +Ref: 33d710241455 +Ref: library/http cookiejar module-http cookiejar10241455 +Ref: 9010241455 +Ref: library/http cookiejar http cookiejar LoadError10243023 +Ref: 33d810243023 +Ref: library/http cookiejar http cookiejar CookieJar10243398 +Ref: 322c10243398 +Ref: library/http cookiejar http cookiejar FileCookieJar10243874 +Ref: 33d910243874 +Ref: library/http cookiejar http cookiejar CookiePolicy10244712 +Ref: 33da10244712 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy10244872 +Ref: 144210244872 +Ref: library/http cookiejar http cookiejar Cookie10246696 +Ref: 33df10246696 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-110248391 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-210248465 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-310248524 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-410248583 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-510248642 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-610248701 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-710248760 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-810248819 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-910248878 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-1010248937 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-1110248997 +Ref: http cookiejar — Cookie handling for HTTP clients-Footnote-1210249057 +Node: CookieJar and FileCookieJar Objects10249117 +Ref: library/http cookiejar cookie-jar-objects10249308 +Ref: 33e010249308 +Ref: library/http cookiejar cookiejar-and-filecookiejar-objects10249308 +Ref: 33e110249308 +Ref: library/http cookiejar http cookiejar CookieJar add_cookie_header10249585 +Ref: 33e210249585 +Ref: library/http cookiejar http cookiejar CookieJar extract_cookies10250502 +Ref: 33e310250502 +Ref: library/http cookiejar http cookiejar CookieJar set_policy10251735 +Ref: 33e510251735 +Ref: library/http cookiejar http cookiejar CookieJar make_cookies10251839 +Ref: 33e610251839 +Ref: library/http cookiejar http cookiejar CookieJar set_cookie_if_ok10252126 +Ref: 33e710252126 +Ref: library/http cookiejar http cookiejar CookieJar set_cookie10252251 +Ref: 33e810252251 +Ref: library/http cookiejar http cookiejar CookieJar clear10252400 +Ref: 33e910252400 +Ref: library/http cookiejar http cookiejar CookieJar clear_session_cookies10252905 +Ref: 33ea10252905 +Ref: library/http cookiejar http cookiejar FileCookieJar save10253548 +Ref: 33eb10253548 +Ref: library/http cookiejar http cookiejar FileCookieJar load10254401 +Ref: 33db10254401 +Ref: library/http cookiejar http cookiejar FileCookieJar revert10254968 +Ref: 33dc10254968 +Ref: library/http cookiejar http cookiejar FileCookieJar filename10255367 +Ref: 33ec10255367 +Ref: library/http cookiejar http cookiejar FileCookieJar delayload10255504 +Ref: 33ed10255504 +Node: FileCookieJar subclasses and co-operation with web browsers10255925 +Ref: library/http cookiejar file-cookie-jar-classes10256145 +Ref: 33dd10256145 +Ref: library/http cookiejar filecookiejar-subclasses-and-co-operation-with-web-browsers10256145 +Ref: 33ee10256145 +Ref: library/http cookiejar http cookiejar MozillaCookieJar10256373 +Ref: 33ef10256373 +Ref: library/http cookiejar http cookiejar LWPCookieJar10257175 +Ref: 33f010257175 +Ref: FileCookieJar subclasses and co-operation with web browsers-Footnote-110257658 +Node: CookiePolicy Objects10257717 +Ref: library/http cookiejar cookie-policy-objects10257929 +Ref: 33f110257929 +Ref: library/http cookiejar cookiepolicy-objects10257929 +Ref: 33f210257929 +Ref: library/http cookiejar http cookiejar CookiePolicy set_ok10258082 +Ref: 33e410258082 +Ref: library/http cookiejar http cookiejar CookiePolicy return_ok10258408 +Ref: 33f310258408 +Ref: library/http cookiejar http cookiejar CookiePolicy domain_return_ok10258737 +Ref: 33f410258737 +Ref: library/http cookiejar http cookiejar CookiePolicy path_return_ok10260115 +Ref: 33f510260115 +Ref: library/http cookiejar http cookiejar CookiePolicy netscape10260567 +Ref: 33f610260567 +Ref: library/http cookiejar http cookiejar CookiePolicy rfc296510260640 +Ref: 33f710260640 +Ref: library/http cookiejar http cookiejar CookiePolicy hide_cookie210260715 +Ref: 33f810260715 +Ref: CookiePolicy Objects-Footnote-110261266 +Ref: CookiePolicy Objects-Footnote-210261325 +Node: DefaultCookiePolicy Objects10261384 +Ref: library/http cookiejar default-cookie-policy-objects10261554 +Ref: 33f910261554 +Ref: library/http cookiejar defaultcookiepolicy-objects10261554 +Ref: 33fa10261554 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy blocked_domains10263873 +Ref: 33fb10263873 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy set_blocked_domains10263984 +Ref: 33fc10263984 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy is_blocked10264098 +Ref: 33fd10264098 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy allowed_domains10264246 +Ref: 33fe10264246 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy set_allowed_domains10264382 +Ref: 33ff10264382 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy is_not_allowed10264516 +Ref: 340010264516 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy rfc2109_as_netscape10264856 +Ref: 33de10264856 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy strict_domain10265443 +Ref: 340110265443 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy strict_rfc2965_unverifiable10265747 +Ref: 340210265747 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_unverifiable10266125 +Ref: 340310266125 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_domain10266274 +Ref: 340410266274 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_set_initial_dollar10266455 +Ref: 340510266455 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy strict_ns_set_path10266610 +Ref: 340610266610 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrictNoDots10266934 +Ref: 340710266934 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrictNonDomain10267179 +Ref: 340810267179 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy DomainRFC2965Match10267527 +Ref: 340910267527 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy DomainLiberal10267764 +Ref: 340a10267764 +Ref: library/http cookiejar http cookiejar DefaultCookiePolicy DomainStrict10267912 +Ref: 340b10267912 +Ref: DefaultCookiePolicy Objects-Footnote-110268065 +Ref: DefaultCookiePolicy Objects-Footnote-210268124 +Ref: DefaultCookiePolicy Objects-Footnote-310268183 +Ref: DefaultCookiePolicy Objects-Footnote-410268242 +Ref: DefaultCookiePolicy Objects-Footnote-510268301 +Ref: DefaultCookiePolicy Objects-Footnote-610268360 +Ref: DefaultCookiePolicy Objects-Footnote-710268419 +Node: Cookie Objects<2>10268478 +Ref: library/http cookiejar cookie-objects10268640 +Ref: 340c10268640 +Ref: library/http cookiejar http cookiejar Cookie version10269409 +Ref: 340d10269409 +Ref: library/http cookiejar http cookiejar Cookie name10269767 +Ref: 340e10269767 +Ref: library/http cookiejar http cookiejar Cookie value10269825 +Ref: 340f10269825 +Ref: library/http cookiejar http cookiejar Cookie port10269905 +Ref: 341010269905 +Ref: library/http cookiejar http cookiejar Cookie path10270044 +Ref: 341110270044 +Ref: library/http cookiejar http cookiejar Cookie secure10270139 +Ref: 341210270139 +Ref: library/http cookiejar http cookiejar Cookie expires10270246 +Ref: 341310270246 +Ref: library/http cookiejar http cookiejar Cookie discard10270399 +Ref: 341510270399 +Ref: library/http cookiejar http cookiejar Cookie comment10270476 +Ref: 341610270476 +Ref: library/http cookiejar http cookiejar Cookie comment_url10270609 +Ref: 341710270609 +Ref: library/http cookiejar http cookiejar Cookie rfc210910270756 +Ref: 341810270756 +Ref: library/http cookiejar http cookiejar Cookie port_specified10271166 +Ref: 341910271166 +Ref: library/http cookiejar http cookiejar Cookie domain_specified10271345 +Ref: 341a10271345 +Ref: library/http cookiejar http cookiejar Cookie domain_initial_dot10271454 +Ref: 341b10271454 +Ref: library/http cookiejar http cookiejar Cookie has_nonstandard_attr10271710 +Ref: 341c10271710 +Ref: library/http cookiejar http cookiejar Cookie get_nonstandard_attr10271824 +Ref: 341d10271824 +Ref: library/http cookiejar http cookiejar Cookie set_nonstandard_attr10271986 +Ref: 341e10271986 +Ref: library/http cookiejar http cookiejar Cookie is_expired10272158 +Ref: 341410272158 +Ref: Cookie Objects<2>-Footnote-110272451 +Ref: Cookie Objects<2>-Footnote-210272510 +Ref: Cookie Objects<2>-Footnote-310272569 +Ref: Cookie Objects<2>-Footnote-410272628 +Node: Examples<28>10272687 +Ref: library/http cookiejar examples10272813 +Ref: 341f10272813 +Ref: Examples<28>-Footnote-110274266 +Node: xmlrpc — XMLRPC server and client modules10274325 +Ref: library/xmlrpc doc10274543 +Ref: 342010274543 +Ref: library/xmlrpc xmlrpc-xmlrpc-server-and-client-modules10274543 +Ref: 342110274543 +Node: xmlrpc client — XML-RPC client access10275045 +Ref: library/xmlrpc client doc10275251 +Ref: 342210275251 +Ref: library/xmlrpc client module-xmlrpc client10275251 +Ref: 14a10275251 +Ref: library/xmlrpc client xmlrpc-client-xml-rpc-client-access10275251 +Ref: 342310275251 +Ref: library/xmlrpc client xmlrpc client ServerProxy10276418 +Ref: 6a610276418 +Ref: xmlrpc client — XML-RPC client access-Footnote-110283979 +Ref: xmlrpc client — XML-RPC client access-Footnote-210284052 +Ref: xmlrpc client — XML-RPC client access-Footnote-310284146 +Ref: xmlrpc client — XML-RPC client access-Footnote-410284206 +Ref: xmlrpc client — XML-RPC client access-Footnote-510284266 +Node: ServerProxy Objects10284312 +Ref: library/xmlrpc client id110284432 +Ref: 342810284432 +Ref: library/xmlrpc client serverproxy-objects10284432 +Ref: 342910284432 +Ref: library/xmlrpc client xmlrpc client ServerProxy system listMethods10285088 +Ref: 342a10285088 +Ref: library/xmlrpc client xmlrpc client ServerProxy system methodSignature10285251 +Ref: 342b10285251 +Ref: library/xmlrpc client xmlrpc client ServerProxy system methodHelp10286275 +Ref: 342c10286275 +Node: DateTime Objects10287350 +Ref: library/xmlrpc client datetime-objects10287493 +Ref: 342d10287493 +Ref: library/xmlrpc client id210287493 +Ref: 342e10287493 +Ref: library/xmlrpc client xmlrpc client DateTime10287548 +Ref: 342410287548 +Ref: library/xmlrpc client xmlrpc client DateTime decode10287857 +Ref: 342f10287857 +Ref: library/xmlrpc client xmlrpc client DateTime encode10287954 +Ref: 343010287954 +Node: Binary Objects10289020 +Ref: library/xmlrpc client binary-objects10289157 +Ref: 343110289157 +Ref: library/xmlrpc client id310289157 +Ref: 343210289157 +Ref: library/xmlrpc client xmlrpc client Binary10289208 +Ref: 342510289208 +Ref: library/xmlrpc client xmlrpc client Binary data10289425 +Ref: 343310289425 +Ref: library/xmlrpc client xmlrpc client Binary decode10289731 +Ref: 343410289731 +Ref: library/xmlrpc client xmlrpc client Binary encode10289870 +Ref: 343510289870 +Ref: Binary Objects-Footnote-110291101 +Node: Fault Objects10291172 +Ref: library/xmlrpc client fault-objects10291314 +Ref: 343610291314 +Ref: library/xmlrpc client id410291314 +Ref: 343710291314 +Ref: library/xmlrpc client xmlrpc client Fault10291363 +Ref: 342610291363 +Ref: library/xmlrpc client xmlrpc client Fault faultCode10291530 +Ref: 343810291530 +Ref: library/xmlrpc client xmlrpc client Fault faultString10291606 +Ref: 343910291606 +Node: ProtocolError Objects10292568 +Ref: library/xmlrpc client protocol-error-objects10292713 +Ref: 343a10292713 +Ref: library/xmlrpc client protocolerror-objects10292713 +Ref: 343b10292713 +Ref: library/xmlrpc client xmlrpc client ProtocolError10292778 +Ref: 342710292778 +Ref: library/xmlrpc client xmlrpc client ProtocolError url10293055 +Ref: 343c10293055 +Ref: library/xmlrpc client xmlrpc client ProtocolError errcode10293132 +Ref: 343d10293132 +Ref: library/xmlrpc client xmlrpc client ProtocolError errmsg10293188 +Ref: 343e10293188 +Ref: library/xmlrpc client xmlrpc client ProtocolError headers10293267 +Ref: 343f10293267 +Node: MultiCall Objects10294007 +Ref: library/xmlrpc client multicall-objects10294160 +Ref: 344010294160 +Ref: library/xmlrpc client xmlrpc client MultiCall10294343 +Ref: 344110294343 +Ref: MultiCall Objects-Footnote-110296048 +Node: Convenience Functions10296227 +Ref: library/xmlrpc client convenience-functions10296382 +Ref: 344210296382 +Ref: library/xmlrpc client xmlrpc client dumps10296447 +Ref: 344310296447 +Ref: library/xmlrpc client xmlrpc client loads10297160 +Ref: 344410297160 +Node: Example of Client Usage10298028 +Ref: library/xmlrpc client example-of-client-usage10298200 +Ref: 344510298200 +Ref: library/xmlrpc client xmlrpc-client-example10298200 +Ref: 344610298200 +Node: Example of Client and Server Usage10299507 +Ref: library/xmlrpc client example-of-client-and-server-usage10299649 +Ref: 344710299649 +Node: xmlrpc server — Basic XML-RPC servers10299785 +Ref: library/xmlrpc server doc10299992 +Ref: 344910299992 +Ref: library/xmlrpc server module-xmlrpc server10299992 +Ref: 14b10299992 +Ref: library/xmlrpc server xmlrpc-server-basic-xml-rpc-servers10299992 +Ref: 344a10299992 +Ref: library/xmlrpc server xmlrpc server SimpleXMLRPCServer10300908 +Ref: 344b10300908 +Ref: library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler10302432 +Ref: 344c10302432 +Ref: library/xmlrpc server xmlrpc server SimpleXMLRPCRequestHandler10303083 +Ref: 344d10303083 +Ref: xmlrpc server — Basic XML-RPC servers-Footnote-110303571 +Node: SimpleXMLRPCServer Objects10303644 +Ref: library/xmlrpc server simple-xmlrpc-servers10303778 +Ref: 344e10303778 +Ref: library/xmlrpc server simplexmlrpcserver-objects10303778 +Ref: 344f10303778 +Ref: library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_function10304014 +Ref: 345010304014 +Ref: library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_instance10304757 +Ref: 345110304757 +Ref: library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_introspection_functions10306373 +Ref: 345210306373 +Ref: library/xmlrpc server xmlrpc server SimpleXMLRPCServer register_multicall_functions10306582 +Ref: 345310306582 +Ref: library/xmlrpc server xmlrpc server SimpleXMLRPCRequestHandler rpc_paths10306711 +Ref: 345410306711 +Node: SimpleXMLRPCServer Example10307131 +Ref: library/xmlrpc server id110307220 +Ref: 345510307220 +Ref: library/xmlrpc server simplexmlrpcserver-example10307220 +Ref: 344810307220 +Node: CGIXMLRPCRequestHandler10311737 +Ref: library/xmlrpc server cgixmlrpcrequesthandler10311905 +Ref: 345610311905 +Ref: library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_function10312089 +Ref: 345710312089 +Ref: library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_instance10312837 +Ref: 345810312837 +Ref: library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_introspection_functions10313722 +Ref: 345910313722 +Ref: library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler register_multicall_functions10313935 +Ref: 345a10313935 +Ref: library/xmlrpc server xmlrpc server CGIXMLRPCRequestHandler handle_request10314074 +Ref: 345b10314074 +Node: Documenting XMLRPC server10314661 +Ref: library/xmlrpc server documenting-xmlrpc-server10314826 +Ref: 345c10314826 +Ref: library/xmlrpc server xmlrpc server DocXMLRPCServer10315154 +Ref: 13df10315154 +Ref: library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler10315632 +Ref: 345d10315632 +Ref: library/xmlrpc server xmlrpc server DocXMLRPCRequestHandler10315767 +Ref: 345e10315767 +Node: DocXMLRPCServer Objects10316086 +Ref: library/xmlrpc server doc-xmlrpc-servers10316254 +Ref: 345f10316254 +Ref: library/xmlrpc server docxmlrpcserver-objects10316254 +Ref: 346010316254 +Ref: library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_title10316691 +Ref: 346110316691 +Ref: library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_name10316881 +Ref: 346210316881 +Ref: library/xmlrpc server xmlrpc server DocXMLRPCServer set_server_documentation10317103 +Ref: 346310317103 +Node: DocCGIXMLRPCRequestHandler10317359 +Ref: library/xmlrpc server doccgixmlrpcrequesthandler10317493 +Ref: 346410317493 +Ref: library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_title10317944 +Ref: 346510317944 +Ref: library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_name10318145 +Ref: 346610318145 +Ref: library/xmlrpc server xmlrpc server DocCGIXMLRPCRequestHandler set_server_documentation10318378 +Ref: 346710318378 +Node: ipaddress — IPv4/IPv6 manipulation library10318645 +Ref: library/ipaddress doc10318804 +Ref: 346810318804 +Ref: library/ipaddress ipaddress-ipv4-ipv6-manipulation-library10318804 +Ref: 346910318804 +Ref: library/ipaddress module-ipaddress10318804 +Ref: a010318804 +Ref: ipaddress — IPv4/IPv6 manipulation library-Footnote-110319827 +Node: Convenience factory functions10319896 +Ref: library/ipaddress convenience-factory-functions10320027 +Ref: 346b10320027 +Ref: library/ipaddress ipaddress ip_address10320230 +Ref: 346c10320230 +Ref: library/ipaddress ipaddress ip_network10320816 +Ref: 346e10320816 +Ref: library/ipaddress ipaddress ip_interface10321531 +Ref: 346f10321531 +Node: IP Addresses10322390 +Ref: library/ipaddress ip-addresses10322552 +Ref: 347010322552 +Node: Address objects10322695 +Ref: library/ipaddress address-objects10322802 +Ref: 347110322802 +Ref: library/ipaddress ipaddress IPv4Address10323243 +Ref: 346d10323243 +Ref: library/ipaddress ipaddress IPv4Address version10324764 +Ref: 347310324764 +Ref: library/ipaddress ipaddress IPv4Address max_prefixlen10324872 +Ref: 347410324872 +Ref: library/ipaddress ipaddress IPv4Address compressed10325210 +Ref: 347510325210 +Ref: library/ipaddress ipaddress IPv4Address exploded10325242 +Ref: 347610325242 +Ref: library/ipaddress ipaddress IPv4Address packed10325731 +Ref: 347710325731 +Ref: library/ipaddress ipaddress IPv4Address reverse_pointer10325968 +Ref: 347810325968 +Ref: library/ipaddress ipaddress IPv4Address is_multicast10326513 +Ref: 347910326513 +Ref: library/ipaddress ipaddress IPv4Address is_private10326680 +Ref: 347a10326680 +Ref: library/ipaddress ipaddress IPv4Address is_global10326895 +Ref: bfa10326895 +Ref: library/ipaddress ipaddress IPv4Address is_unspecified10327139 +Ref: 347b10327139 +Ref: library/ipaddress ipaddress IPv4Address is_reserved10327293 +Ref: 347c10327293 +Ref: library/ipaddress ipaddress IPv4Address is_loopback10327391 +Ref: 347d10327391 +Ref: library/ipaddress ipaddress IPv4Address is_link_local10327543 +Ref: 347e10327543 +Ref: library/ipaddress ipaddress IPv4Address __format__10327678 +Ref: 347f10327678 +Ref: library/ipaddress ipaddress IPv6Address10328926 +Ref: 55210328926 +Ref: library/ipaddress ipaddress IPv6Address compressed10330299 +Ref: 348010330299 +Ref: library/ipaddress ipaddress IPv6Address exploded10330608 +Ref: 348110330608 +Ref: library/ipaddress ipaddress IPv6Address packed10330897 +Ref: 348210330897 +Ref: library/ipaddress ipaddress IPv6Address reverse_pointer10330925 +Ref: 348310330925 +Ref: library/ipaddress ipaddress IPv6Address version10330962 +Ref: 348410330962 +Ref: library/ipaddress ipaddress IPv6Address max_prefixlen10330991 +Ref: 348510330991 +Ref: library/ipaddress ipaddress IPv6Address is_multicast10331026 +Ref: 348610331026 +Ref: library/ipaddress ipaddress IPv6Address is_private10331060 +Ref: 12a610331060 +Ref: library/ipaddress ipaddress IPv6Address is_global10331092 +Ref: 348710331092 +Ref: library/ipaddress ipaddress IPv6Address is_unspecified10331123 +Ref: 348810331123 +Ref: library/ipaddress ipaddress IPv6Address is_reserved10331159 +Ref: 348910331159 +Ref: library/ipaddress ipaddress IPv6Address is_loopback10331192 +Ref: 348a10331192 +Ref: library/ipaddress ipaddress IPv6Address is_link_local10331225 +Ref: 348b10331225 +Ref: library/ipaddress ipaddress IPv6Address is_site_local10331301 +Ref: 348c10331301 +Ref: library/ipaddress ipaddress IPv6Address ipv4_mapped10331647 +Ref: 348d10331647 +Ref: library/ipaddress ipaddress IPv6Address scope_id10331919 +Ref: 55310331919 +Ref: library/ipaddress ipaddress IPv6Address sixtofour10332219 +Ref: 348e10332219 +Ref: library/ipaddress ipaddress IPv6Address teredo10332509 +Ref: 348f10332509 +Ref: library/ipaddress ipaddress IPv6Address __format__10332823 +Ref: 349010332823 +Ref: Address objects-Footnote-110333014 +Ref: Address objects-Footnote-210333073 +Ref: Address objects-Footnote-310333132 +Ref: Address objects-Footnote-410333234 +Ref: Address objects-Footnote-510333336 +Ref: Address objects-Footnote-610333438 +Ref: Address objects-Footnote-710333540 +Ref: Address objects-Footnote-810333599 +Ref: Address objects-Footnote-910333658 +Ref: Address objects-Footnote-1010333717 +Ref: Address objects-Footnote-1110333777 +Ref: Address objects-Footnote-1210333837 +Ref: Address objects-Footnote-1310333897 +Ref: Address objects-Footnote-1410333957 +Ref: Address objects-Footnote-1510334017 +Ref: Address objects-Footnote-1610334077 +Ref: Address objects-Footnote-1710334137 +Ref: Address objects-Footnote-1810334197 +Node: Conversion to Strings and Integers10334257 +Ref: library/ipaddress conversion-to-strings-and-integers10334385 +Ref: 349110334385 +Node: Operators<3>10335009 +Ref: library/ipaddress operators10335113 +Ref: 349210335113 +Node: Comparison operators10335378 +Ref: library/ipaddress comparison-operators10335476 +Ref: 349310335476 +Node: Arithmetic operators10336070 +Ref: library/ipaddress arithmetic-operators10336168 +Ref: 349410336168 +Node: IP Network definitions10336671 +Ref: library/ipaddress ip-network-definitions10336821 +Ref: 349510336821 +Node: Prefix net mask and host mask10337531 +Ref: library/ipaddress prefix-net-mask-and-host-mask10337643 +Ref: 349610337643 +Node: Network objects10338313 +Ref: library/ipaddress network-objects10338446 +Ref: 349710338446 +Ref: library/ipaddress ipaddress IPv4Network10338904 +Ref: 7a310338904 +Ref: library/ipaddress ipaddress IPv4Network version10341327 +Ref: 349910341327 +Ref: library/ipaddress ipaddress IPv4Network max_prefixlen10341356 +Ref: 349a10341356 +Ref: library/ipaddress ipaddress IPv4Network is_multicast10341491 +Ref: 349b10341491 +Ref: library/ipaddress ipaddress IPv4Network is_private10341525 +Ref: 349c10341525 +Ref: library/ipaddress ipaddress IPv4Network is_unspecified10341557 +Ref: 349d10341557 +Ref: library/ipaddress ipaddress IPv4Network is_reserved10341593 +Ref: 349e10341593 +Ref: library/ipaddress ipaddress IPv4Network is_loopback10341626 +Ref: 349f10341626 +Ref: library/ipaddress ipaddress IPv4Network is_link_local10341659 +Ref: 34a010341659 +Ref: library/ipaddress ipaddress IPv4Network network_address10341851 +Ref: 34a110341851 +Ref: library/ipaddress ipaddress IPv4Network broadcast_address10342025 +Ref: 34a210342025 +Ref: library/ipaddress ipaddress IPv4Network hostmask10342222 +Ref: 34a310342222 +Ref: library/ipaddress ipaddress IPv4Network netmask10342317 +Ref: 34a410342317 +Ref: library/ipaddress ipaddress IPv4Network with_prefixlen10342410 +Ref: 34a510342410 +Ref: library/ipaddress ipaddress IPv4Network compressed10342446 +Ref: 34a610342446 +Ref: library/ipaddress ipaddress IPv4Network exploded10342478 +Ref: 34a710342478 +Ref: library/ipaddress ipaddress IPv4Network with_netmask10342779 +Ref: 34a810342779 +Ref: library/ipaddress ipaddress IPv4Network with_hostmask10342910 +Ref: 34a910342910 +Ref: library/ipaddress ipaddress IPv4Network num_addresses10343043 +Ref: 34aa10343043 +Ref: library/ipaddress ipaddress IPv4Network prefixlen10343135 +Ref: 34ab10343135 +Ref: library/ipaddress ipaddress IPv4Network hosts10343216 +Ref: 34ac10343216 +Ref: library/ipaddress ipaddress IPv4Network overlaps10344213 +Ref: 34ad10344213 +Ref: library/ipaddress ipaddress IPv4Network address_exclude10344385 +Ref: 34ae10344385 +Ref: library/ipaddress ipaddress IPv4Network subnets10344991 +Ref: b2d10344991 +Ref: library/ipaddress ipaddress IPv4Network supernet10346539 +Ref: b2e10346539 +Ref: library/ipaddress ipaddress IPv4Network subnet_of10347345 +Ref: 34af10347345 +Ref: library/ipaddress ipaddress IPv4Network supernet_of10347642 +Ref: 34b010347642 +Ref: library/ipaddress ipaddress IPv4Network compare_networks10347945 +Ref: 34b110347945 +Ref: library/ipaddress ipaddress IPv6Network10348643 +Ref: 7a210348643 +Ref: library/ipaddress ipaddress IPv6Network version10350450 +Ref: 34b210350450 +Ref: library/ipaddress ipaddress IPv6Network max_prefixlen10350479 +Ref: 34b310350479 +Ref: library/ipaddress ipaddress IPv6Network is_multicast10350514 +Ref: 34b410350514 +Ref: library/ipaddress ipaddress IPv6Network is_private10350548 +Ref: 34b510350548 +Ref: library/ipaddress ipaddress IPv6Network is_unspecified10350580 +Ref: 34b610350580 +Ref: library/ipaddress ipaddress IPv6Network is_reserved10350616 +Ref: 34b710350616 +Ref: library/ipaddress ipaddress IPv6Network is_loopback10350649 +Ref: 34b810350649 +Ref: library/ipaddress ipaddress IPv6Network is_link_local10350682 +Ref: 34b910350682 +Ref: library/ipaddress ipaddress IPv6Network network_address10350717 +Ref: 34ba10350717 +Ref: library/ipaddress ipaddress IPv6Network broadcast_address10350754 +Ref: 34bb10350754 +Ref: library/ipaddress ipaddress IPv6Network hostmask10350793 +Ref: 34bc10350793 +Ref: library/ipaddress ipaddress IPv6Network netmask10350823 +Ref: 34bd10350823 +Ref: library/ipaddress ipaddress IPv6Network with_prefixlen10350852 +Ref: 34be10350852 +Ref: library/ipaddress ipaddress IPv6Network compressed10350888 +Ref: 34bf10350888 +Ref: library/ipaddress ipaddress IPv6Network exploded10350920 +Ref: 34c010350920 +Ref: library/ipaddress ipaddress IPv6Network with_netmask10350950 +Ref: 34c110350950 +Ref: library/ipaddress ipaddress IPv6Network with_hostmask10350984 +Ref: 34c210350984 +Ref: library/ipaddress ipaddress IPv6Network num_addresses10351019 +Ref: 34c310351019 +Ref: library/ipaddress ipaddress IPv6Network prefixlen10351054 +Ref: 34c410351054 +Ref: library/ipaddress ipaddress IPv6Network hosts10351085 +Ref: 34c510351085 +Ref: library/ipaddress ipaddress IPv6Network overlaps10351535 +Ref: 34c610351535 +Ref: library/ipaddress ipaddress IPv6Network address_exclude10351570 +Ref: 34c710351570 +Ref: library/ipaddress ipaddress IPv6Network subnets10351614 +Ref: 34c810351614 +Ref: library/ipaddress ipaddress IPv6Network supernet10351676 +Ref: 34c910351676 +Ref: library/ipaddress ipaddress IPv6Network subnet_of10351739 +Ref: 34ca10351739 +Ref: library/ipaddress ipaddress IPv6Network supernet_of10351775 +Ref: 34cb10351775 +Ref: library/ipaddress ipaddress IPv6Network compare_networks10351813 +Ref: 34cc10351813 +Ref: library/ipaddress ipaddress IPv6Network is_site_local10351955 +Ref: 34cd10351955 +Node: Operators<4>10352132 +Ref: library/ipaddress id110352227 +Ref: 34ce10352227 +Node: Logical operators10352520 +Ref: library/ipaddress logical-operators10352604 +Ref: 34cf10352604 +Node: Iteration10352809 +Ref: library/ipaddress iteration10352937 +Ref: 34d010352937 +Node: Networks as containers of addresses10353765 +Ref: library/ipaddress networks-as-containers-of-addresses10353867 +Ref: 34d110353867 +Node: Interface objects10354325 +Ref: library/ipaddress interface-objects10354491 +Ref: 34d210354491 +Ref: library/ipaddress ipaddress IPv4Interface10354639 +Ref: 11f410354639 +Ref: library/ipaddress ipaddress IPv4Interface ip10355056 +Ref: 34d310355056 +Ref: library/ipaddress ipaddress IPv4Interface network10355303 +Ref: 34d410355303 +Ref: library/ipaddress ipaddress IPv4Interface with_prefixlen10355560 +Ref: 34d510355560 +Ref: library/ipaddress ipaddress IPv4Interface with_netmask10355828 +Ref: 34d610355828 +Ref: library/ipaddress ipaddress IPv4Interface with_hostmask10356101 +Ref: 34d710356101 +Ref: library/ipaddress ipaddress IPv6Interface10356373 +Ref: 11f510356373 +Ref: library/ipaddress ipaddress IPv6Interface ip10356789 +Ref: 34d810356789 +Ref: library/ipaddress ipaddress IPv6Interface network10356813 +Ref: 34d910356813 +Ref: library/ipaddress ipaddress IPv6Interface with_prefixlen10356842 +Ref: 34da10356842 +Ref: library/ipaddress ipaddress IPv6Interface with_netmask10356878 +Ref: 34db10356878 +Ref: library/ipaddress ipaddress IPv6Interface with_hostmask10356912 +Ref: 34dc10356912 +Node: Operators<5>10357086 +Ref: library/ipaddress id210357152 +Ref: 34dd10357152 +Node: Logical operators<2>10357414 +Ref: library/ipaddress id310357483 +Ref: 34de10357483 +Node: Other Module Level Functions10358140 +Ref: library/ipaddress other-module-level-functions10358301 +Ref: 34df10358301 +Ref: library/ipaddress ipaddress v4_int_to_packed10358446 +Ref: 34e010358446 +Ref: library/ipaddress ipaddress v6_int_to_packed10358920 +Ref: 34e110358920 +Ref: library/ipaddress ipaddress summarize_address_range10359229 +Ref: b2f10359229 +Ref: library/ipaddress ipaddress collapse_addresses10360110 +Ref: b3010360110 +Ref: library/ipaddress ipaddress get_mixed_type_key10360678 +Ref: 34e210360678 +Node: Custom Exceptions10361277 +Ref: library/ipaddress custom-exceptions10361412 +Ref: 34e310361412 +Ref: library/ipaddress ipaddress AddressValueError10361583 +Ref: 347210361583 +Ref: library/ipaddress ipaddress NetmaskValueError10361686 +Ref: 349810361686 +Node: Multimedia Services10361790 +Ref: library/mm doc10361941 +Ref: 34e410361941 +Ref: library/mm mmedia10361941 +Ref: 34e510361941 +Ref: library/mm multimedia-services10361941 +Ref: 34e610361941 +Node: wave — Read and write WAV files10362307 +Ref: library/wave doc10362451 +Ref: 34e710362451 +Ref: library/wave module-wave10362451 +Ref: 13110362451 +Ref: library/wave wave-read-and-write-wav-files10362451 +Ref: 34e810362451 +Ref: library/wave wave open10362959 +Ref: 59a10362959 +Ref: library/wave wave Error10364010 +Ref: 34eb10364010 +Ref: wave — Read and write WAV files-Footnote-110364264 +Node: Wave_read Objects10364328 +Ref: library/wave id110364442 +Ref: 34ec10364442 +Ref: library/wave wave-read-objects10364442 +Ref: 34ed10364442 +Ref: library/wave wave Wave_read close10364579 +Ref: 34e910364579 +Ref: library/wave wave Wave_read getnchannels10364765 +Ref: 34ee10364765 +Ref: library/wave wave Wave_read getsampwidth10364883 +Ref: 34ef10364883 +Ref: library/wave wave Wave_read getframerate10364959 +Ref: 34f010364959 +Ref: library/wave wave Wave_read getnframes10365032 +Ref: 34f110365032 +Ref: library/wave wave Wave_read getcomptype10365107 +Ref: 34f210365107 +Ref: library/wave wave Wave_read getcompname10365219 +Ref: 34f310365219 +Ref: library/wave wave Wave_read getparams10365377 +Ref: 34f410365377 +Ref: library/wave wave Wave_read readframes10365584 +Ref: 34f510365584 +Ref: library/wave wave Wave_read rewind10365711 +Ref: 34f610365711 +Ref: library/wave wave Wave_read getmarkers10365938 +Ref: 34f710365938 +Ref: library/wave wave Wave_read getmark10366001 +Ref: 34f810366001 +Ref: library/wave wave Wave_read setpos10366192 +Ref: 34f910366192 +Ref: library/wave wave Wave_read tell10366282 +Ref: 34fa10366282 +Node: Wave_write Objects10366357 +Ref: library/wave id210366471 +Ref: 34fb10366471 +Ref: library/wave wave-write-objects10366471 +Ref: c8d10366471 +Ref: library/wave wave Wave_write close10367412 +Ref: 34ea10367412 +Ref: library/wave wave Wave_write setnchannels10367733 +Ref: 34fe10367733 +Ref: library/wave wave Wave_write setsampwidth10367808 +Ref: 34ff10367808 +Ref: library/wave wave Wave_write setframerate10367890 +Ref: 350010367890 +Ref: library/wave wave Wave_write setnframes10368070 +Ref: 34fc10368070 +Ref: library/wave wave Wave_write setcomptype10368320 +Ref: 350110368320 +Ref: library/wave wave Wave_write setparams10368509 +Ref: 34fd10368509 +Ref: library/wave wave Wave_write tell10368728 +Ref: 350210368728 +Ref: library/wave wave Wave_write writeframesraw10368921 +Ref: c8e10368921 +Ref: library/wave wave Wave_write writeframes10369109 +Ref: c8f10369109 +Node: colorsys — Conversions between color systems10369682 +Ref: library/colorsys doc10369826 +Ref: 350310369826 +Ref: library/colorsys colorsys-conversions-between-color-systems10369826 +Ref: 350410369826 +Ref: library/colorsys module-colorsys10369826 +Ref: 1e10369826 +Ref: library/colorsys colorsys rgb_to_yiq10370813 +Ref: 350510370813 +Ref: library/colorsys colorsys yiq_to_rgb10370923 +Ref: 350610370923 +Ref: library/colorsys colorsys rgb_to_hls10371033 +Ref: 350710371033 +Ref: library/colorsys colorsys hls_to_rgb10371143 +Ref: 350810371143 +Ref: library/colorsys colorsys rgb_to_hsv10371253 +Ref: 350910371253 +Ref: library/colorsys colorsys hsv_to_rgb10371363 +Ref: 350a10371363 +Ref: colorsys — Conversions between color systems-Footnote-110371675 +Node: Internationalization10371743 +Ref: library/i18n doc10371882 +Ref: 350b10371882 +Ref: library/i18n i18n10371882 +Ref: 350c10371882 +Ref: library/i18n internationalization10371882 +Ref: 350d10371882 +Node: gettext — Multilingual internationalization services10372337 +Ref: library/gettext doc10372497 +Ref: 350e10372497 +Ref: library/gettext gettext-multilingual-internationalization-services10372497 +Ref: 350f10372497 +Ref: library/gettext module-gettext10372497 +Ref: 8310372497 +Ref: gettext — Multilingual internationalization services-Footnote-110373474 +Node: GNU gettext API10373541 +Ref: library/gettext gnu-gettext-api10373671 +Ref: 351010373671 +Ref: library/gettext gettext bindtextdomain10374215 +Ref: 351110374215 +Ref: library/gettext gettext textdomain10374787 +Ref: 351310374787 +Ref: library/gettext gettext gettext10375033 +Ref: 10cb10375033 +Ref: library/gettext gettext dgettext10375302 +Ref: 351410375302 +Ref: library/gettext gettext ngettext10375442 +Ref: 351510375442 +Ref: library/gettext gettext dngettext10376153 +Ref: 351610376153 +Ref: library/gettext gettext pgettext10376307 +Ref: 63910376307 +Ref: library/gettext gettext dpgettext10376358 +Ref: 351710376358 +Ref: library/gettext gettext npgettext10376418 +Ref: 351810376418 +Ref: library/gettext gettext dnpgettext10376482 +Ref: 351910376482 +Ref: GNU gettext API-Footnote-110377299 +Ref: GNU gettext API-Footnote-210377783 +Node: Class-based API10377848 +Ref: library/gettext class-based-api10378031 +Ref: 351a10378031 +Ref: library/gettext gettext find10378561 +Ref: 351c10378561 +Ref: library/gettext gettext translation10380010 +Ref: 6cb10380010 +Ref: library/gettext gettext install10381382 +Ref: 6cc10381382 +Ref: Class-based API-Footnote-110382417 +Node: The NullTranslations class10382483 +Ref: library/gettext the-nulltranslations-class10382595 +Ref: 351f10382595 +Ref: library/gettext gettext NullTranslations10383040 +Ref: 351d10383040 +Ref: library/gettext gettext NullTranslations _parse10383439 +Ref: 352110383439 +Ref: library/gettext gettext NullTranslations add_fallback10383750 +Ref: 352010383750 +Ref: library/gettext gettext NullTranslations gettext10384013 +Ref: 352210384013 +Ref: library/gettext gettext NullTranslations ngettext10384211 +Ref: 352310384211 +Ref: library/gettext gettext NullTranslations pgettext10384463 +Ref: 352410384463 +Ref: library/gettext gettext NullTranslations npgettext10384721 +Ref: 352510384721 +Ref: library/gettext gettext NullTranslations info10384994 +Ref: 352610384994 +Ref: library/gettext gettext NullTranslations charset10385162 +Ref: 352710385162 +Ref: library/gettext gettext NullTranslations install10385251 +Ref: 351e10385251 +Node: The GNUTranslations class10386490 +Ref: library/gettext the-gnutranslations-class10386642 +Ref: 352810386642 +Ref: library/gettext gettext GNUTranslations10388152 +Ref: 351b10388152 +Ref: library/gettext gettext GNUTranslations gettext10388272 +Ref: 352910388272 +Ref: library/gettext gettext GNUTranslations ngettext10388681 +Ref: 352a10388681 +Ref: library/gettext gettext GNUTranslations pgettext10389605 +Ref: 352b10389605 +Ref: library/gettext gettext GNUTranslations npgettext10390081 +Ref: 352c10390081 +Ref: The GNUTranslations class-Footnote-110390728 +Node: Solaris message catalog support10390786 +Ref: library/gettext solaris-message-catalog-support10390935 +Ref: 352d10390935 +Node: The Catalog constructor10391184 +Ref: library/gettext the-catalog-constructor10391299 +Ref: 352e10391299 +Node: Internationalizing your programs and modules10391957 +Ref: library/gettext internationalizing-your-programs-and-modules10392144 +Ref: 352f10392144 +Ref: Internationalizing your programs and modules-Footnote-110395722 +Ref: Internationalizing your programs and modules-Footnote-210395755 +Node: Localizing your module10395798 +Ref: library/gettext localizing-your-module10395937 +Ref: 353010395937 +Node: Localizing your application10396532 +Ref: library/gettext localizing-your-application10396709 +Ref: 353110396709 +Node: Changing languages on the fly10397437 +Ref: library/gettext changing-languages-on-the-fly10397613 +Ref: 353210397613 +Node: Deferred translations10398292 +Ref: library/gettext deferred-translations10398432 +Ref: 353310398432 +Node: Acknowledgements<9>10400672 +Ref: library/gettext acknowledgements10400835 +Ref: 353410400835 +Node: locale — Internationalization services10401231 +Ref: library/locale doc10401391 +Ref: 353510401391 +Ref: library/locale locale-internationalization-services10401391 +Ref: 353610401391 +Ref: library/locale module-locale10401391 +Ref: a710401391 +Ref: library/locale locale Error10402119 +Ref: 353710402119 +Ref: library/locale locale setlocale10402245 +Ref: 2de10402245 +Ref: library/locale locale localeconv10403430 +Ref: 86810403430 +Ref: library/locale locale nl_langinfo10411731 +Ref: 353b10411731 +Ref: library/locale locale CODESET10412252 +Ref: 353c10412252 +Ref: library/locale locale D_T_FMT10412386 +Ref: 353d10412386 +Ref: library/locale locale D_FMT10412582 +Ref: 353e10412582 +Ref: library/locale locale T_FMT10412769 +Ref: 353f10412769 +Ref: library/locale locale T_FMT_AMPM10412956 +Ref: 354010412956 +Ref: library/locale locale RADIXCHAR10413654 +Ref: 354110413654 +Ref: library/locale locale THOUSEP10413758 +Ref: 354210413758 +Ref: library/locale locale YESEXPR10413878 +Ref: 354310413878 +Ref: library/locale locale NOEXPR10414262 +Ref: 354410414262 +Ref: library/locale locale CRNCYSTR10414447 +Ref: 354510414447 +Ref: library/locale locale ERA10414725 +Ref: 354610414725 +Ref: library/locale locale ERA_D_T_FMT10415499 +Ref: 354710415499 +Ref: library/locale locale ERA_D_FMT10415670 +Ref: 354810415670 +Ref: library/locale locale ERA_T_FMT10415832 +Ref: 354910415832 +Ref: library/locale locale ALT_DIGITS10415994 +Ref: 354a10415994 +Ref: library/locale locale getdefaultlocale10416128 +Ref: 2dd10416128 +Ref: library/locale locale getlocale10417405 +Ref: 2e010417405 +Ref: library/locale locale getpreferredencoding10417882 +Ref: 2df10417882 +Ref: library/locale locale getencoding10418967 +Ref: 22810418967 +Ref: library/locale locale normalize10419741 +Ref: 354e10419741 +Ref: library/locale locale resetlocale10420161 +Ref: 2e110420161 +Ref: library/locale locale strcoll10420480 +Ref: 354f10420480 +Ref: library/locale locale strxfrm10420799 +Ref: 355110420799 +Ref: library/locale locale format_string10421143 +Ref: 7a710421143 +Ref: library/locale locale format10421839 +Ref: 85010421839 +Ref: library/locale locale currency10422315 +Ref: 355210422315 +Ref: library/locale locale str10422944 +Ref: 355310422944 +Ref: library/locale locale delocalize10423133 +Ref: aa910423133 +Ref: library/locale locale localize10423311 +Ref: 355410423311 +Ref: library/locale locale atof10423529 +Ref: 355510423529 +Ref: library/locale locale atoi10423753 +Ref: 355610423753 +Ref: library/locale locale LC_CTYPE10423884 +Ref: 354c10423884 +Ref: library/locale locale LC_COLLATE10424106 +Ref: 355010424106 +Ref: library/locale locale LC_TIME10424299 +Ref: 355710424299 +Ref: library/locale locale LC_MONETARY10424449 +Ref: 353a10424449 +Ref: library/locale locale LC_MESSAGES10424622 +Ref: 355810424622 +Ref: library/locale locale LC_NUMERIC10424920 +Ref: 353810424920 +Ref: library/locale locale LC_ALL10425236 +Ref: 354b10425236 +Ref: library/locale locale CHAR_MAX10425661 +Ref: 353910425661 +Ref: locale — Internationalization services-Footnote-110426512 +Ref: locale — Internationalization services-Footnote-210426578 +Ref: locale — Internationalization services-Footnote-310426637 +Node: Background details hints tips and caveats10426696 +Ref: library/locale background-details-hints-tips-and-caveats10426875 +Ref: 355910426875 +Node: For extension writers and programs that embed Python10429074 +Ref: library/locale embedding-locale10429288 +Ref: 355a10429288 +Ref: library/locale for-extension-writers-and-programs-that-embed-python10429288 +Ref: 355b10429288 +Node: Access to message catalogs10430085 +Ref: library/locale access-to-message-catalogs10430249 +Ref: 355c10430249 +Ref: library/locale locale-gettext10430249 +Ref: 355d10430249 +Ref: library/locale locale gettext10430322 +Ref: 355e10430322 +Ref: library/locale locale dgettext10430358 +Ref: 355f10430358 +Ref: library/locale locale dcgettext10430403 +Ref: 356010430403 +Ref: library/locale locale textdomain10430459 +Ref: 356110430459 +Ref: library/locale locale bindtextdomain10430501 +Ref: 356210430501 +Node: Program Frameworks10431433 +Ref: library/frameworks doc10431586 +Ref: 356310431586 +Ref: library/frameworks frameworks10431586 +Ref: 356410431586 +Ref: library/frameworks program-frameworks10431586 +Ref: 356510431586 +Node: turtle — Turtle graphics10432035 +Ref: library/turtle doc10432179 +Ref: 356610432179 +Ref: library/turtle module-turtle10432179 +Ref: 12010432179 +Ref: library/turtle turtle-turtle-graphics10432179 +Ref: 356710432179 +Ref: turtle — Turtle graphics-Footnote-110432795 +Node: Introduction<9>10432861 +Ref: library/turtle introduction10432995 +Ref: 356810432995 +Node: Overview of available Turtle and Screen methods10436748 +Ref: library/turtle overview-of-available-turtle-and-screen-methods10436946 +Ref: 356f10436946 +Node: Turtle methods10437125 +Ref: library/turtle turtle-methods10437262 +Ref: 357010437262 +Node: Methods of TurtleScreen/Screen10440340 +Ref: library/turtle methods-of-turtlescreen-screen10440477 +Ref: 35c010440477 +Node: Methods of RawTurtle/Turtle and corresponding functions10441826 +Ref: library/turtle methods-of-rawturtle-turtle-and-corresponding-functions10442067 +Ref: 35df10442067 +Node: Turtle motion10442464 +Ref: library/turtle turtle-motion10442599 +Ref: 35e010442599 +Ref: library/turtle turtle forward10442646 +Ref: 357110442646 +Ref: library/turtle turtle fd10442686 +Ref: 357210442686 +Ref: library/turtle turtle back10443124 +Ref: 357510443124 +Ref: library/turtle turtle bk10443161 +Ref: 357410443161 +Ref: library/turtle turtle backward10443196 +Ref: 357310443196 +Ref: library/turtle turtle right10443568 +Ref: 357610443568 +Ref: library/turtle turtle rt10443603 +Ref: 357710443603 +Ref: library/turtle turtle left10444069 +Ref: 357810444069 +Ref: library/turtle turtle lt10444103 +Ref: 357910444103 +Ref: library/turtle turtle goto10444566 +Ref: 357a10444566 +Ref: library/turtle turtle setpos10444604 +Ref: 357b10444604 +Ref: library/turtle turtle setposition10444644 +Ref: 357c10444644 +Ref: library/turtle turtle setx10445411 +Ref: 357d10445411 +Ref: library/turtle turtle sety10445735 +Ref: 357e10445735 +Ref: library/turtle turtle setheading10446058 +Ref: 357f10446058 +Ref: library/turtle turtle seth10446101 +Ref: 358010446101 +Ref: library/turtle turtle home10446917 +Ref: 358110446917 +Ref: library/turtle turtle circle10447344 +Ref: 358210447344 +Ref: library/turtle turtle dot10448729 +Ref: 358310448729 +Ref: library/turtle turtle stamp10449279 +Ref: 358410449279 +Ref: library/turtle turtle clearstamp10449618 +Ref: 358510449618 +Ref: library/turtle turtle clearstamps10450128 +Ref: 358610450128 +Ref: library/turtle turtle undo10450708 +Ref: 358710450708 +Ref: library/turtle turtle speed10451033 +Ref: 358810451033 +Node: Tell Turtle’s state10452032 +Ref: library/turtle tell-turtle-s-state10452200 +Ref: 35e210452200 +Ref: library/turtle turtle position10452261 +Ref: 358910452261 +Ref: library/turtle turtle pos10452294 +Ref: 358a10452294 +Ref: library/turtle turtle towards10452466 +Ref: 358b10452466 +Ref: library/turtle turtle xcor10453031 +Ref: 358c10453031 +Ref: library/turtle turtle ycor10453311 +Ref: 358d10453311 +Ref: library/turtle turtle heading10453598 +Ref: 358e10453598 +Ref: library/turtle turtle distance10453846 +Ref: 358f10453846 +Node: Settings for measurement10454435 +Ref: library/turtle settings-for-measurement10454601 +Ref: 35e310454601 +Ref: library/turtle turtle degrees10454670 +Ref: 359010454670 +Ref: library/turtle turtle radians10455298 +Ref: 359110455298 +Node: Pen control10455623 +Ref: library/turtle pen-control10455780 +Ref: 35e410455780 +Node: Drawing state10455906 +Ref: library/turtle drawing-state10455989 +Ref: 35e510455989 +Ref: library/turtle turtle pendown10456038 +Ref: 359210456038 +Ref: library/turtle turtle pd10456070 +Ref: 359310456070 +Ref: library/turtle turtle down10456097 +Ref: 359410456097 +Ref: library/turtle turtle penup10456176 +Ref: 359510456176 +Ref: library/turtle turtle pu10456206 +Ref: 359610456206 +Ref: library/turtle turtle up10456233 +Ref: 359710456233 +Ref: library/turtle turtle pensize10456311 +Ref: 359810456311 +Ref: library/turtle turtle width10456353 +Ref: 359910456353 +Ref: library/turtle turtle pen10456815 +Ref: 359a10456815 +Ref: library/turtle turtle isdown10458725 +Ref: 359b10458725 +Node: Color control10458975 +Ref: library/turtle color-control10459074 +Ref: 35e610459074 +Ref: library/turtle turtle pencolor10459123 +Ref: 359d10459123 +Ref: library/turtle turtle fillcolor10460744 +Ref: 359e10460744 +Ref: library/turtle turtle color10462263 +Ref: 359c10462263 +Node: Filling10463467 +Ref: library/turtle filling10463573 +Ref: 35e710463573 +Ref: library/turtle turtle filling10463610 +Ref: 359f10463610 +Ref: library/turtle turtle begin_fill10463874 +Ref: 35a010463874 +Ref: library/turtle turtle end_fill10463971 +Ref: 35a110463971 +Node: More drawing control10464518 +Ref: library/turtle more-drawing-control10464602 +Ref: 35e810464602 +Ref: library/turtle turtle reset10464665 +Ref: 35a210464665 +Ref: library/turtle turtle clear10465113 +Ref: 35a310465113 +Ref: library/turtle turtle write10465317 +Ref: 35a410465317 +Node: Turtle state10466096 +Ref: library/turtle turtle-state10466241 +Ref: 35e910466241 +Node: Visibility10466328 +Ref: library/turtle visibility10466406 +Ref: 35ea10466406 +Ref: library/turtle turtle hideturtle10466449 +Ref: 35a710466449 +Ref: library/turtle turtle ht10466484 +Ref: 35a810466484 +Ref: library/turtle turtle showturtle10466741 +Ref: 35a510466741 +Ref: library/turtle turtle st10466776 +Ref: 35a610466776 +Ref: library/turtle turtle isvisible10466870 +Ref: 35a910466870 +Node: Appearance10467149 +Ref: library/turtle appearance10467227 +Ref: 35eb10467227 +Ref: library/turtle turtle shape10467270 +Ref: 35aa10467270 +Ref: library/turtle turtle resizemode10467943 +Ref: 35ab10467943 +Ref: library/turtle turtle shapesize10468914 +Ref: 35ac10468914 +Ref: library/turtle turtle turtlesize10469006 +Ref: 35ad10469006 +Ref: library/turtle turtle shearfactor10469997 +Ref: 35ae10469997 +Ref: library/turtle turtle tilt10470666 +Ref: 35b110470666 +Ref: library/turtle turtle settiltangle10471106 +Ref: 35af10471106 +Ref: library/turtle turtle tiltangle10471655 +Ref: 35b010471655 +Ref: library/turtle turtle shapetransform10472377 +Ref: 35b210472377 +Ref: library/turtle turtle get_shapepoly10473409 +Ref: 35b310473409 +Node: Using events10473780 +Ref: library/turtle using-events10473936 +Ref: 35ec10473936 +Ref: library/turtle turtle onrelease10474836 +Ref: 35b510474836 +Ref: library/turtle turtle ondrag10475847 +Ref: 35b610475847 +Node: Special Turtle methods10476722 +Ref: library/turtle special-turtle-methods10476881 +Ref: 35ed10476881 +Ref: library/turtle turtle begin_poly10476948 +Ref: 35b710476948 +Ref: library/turtle turtle end_poly10477091 +Ref: 35b810477091 +Ref: library/turtle turtle get_poly10477282 +Ref: 35b910477282 +Ref: library/turtle turtle clone10477684 +Ref: 35ba10477684 +Ref: library/turtle turtle getturtle10477881 +Ref: 35bb10477881 +Ref: library/turtle turtle getpen10477915 +Ref: 35bc10477915 +Ref: library/turtle turtle getscreen10478183 +Ref: 35bd10478183 +Ref: library/turtle turtle setundobuffer10478489 +Ref: 35be10478489 +Ref: library/turtle turtle undobufferentries10478926 +Ref: 35bf10478926 +Node: Compound shapes10479086 +Ref: library/turtle compound-shapes10479224 +Ref: 35ee10479224 +Ref: library/turtle compoundshapes10479224 +Ref: 35ef10479224 +Node: Methods of TurtleScreen/Screen and corresponding functions10480251 +Ref: library/turtle methods-of-turtlescreen-screen-and-corresponding-functions10480459 +Ref: 35f110480459 +Node: Window control10480939 +Ref: library/turtle window-control10481074 +Ref: 35f210481074 +Ref: library/turtle turtle bgcolor10481125 +Ref: 35c110481125 +Ref: library/turtle turtle bgpic10481538 +Ref: 35c210481538 +Ref: library/turtle turtle clearscreen10482414 +Ref: 35c310482414 +Ref: library/turtle turtle resetscreen10482923 +Ref: 35c410482923 +Ref: library/turtle turtle screensize10483022 +Ref: 35c510483022 +Ref: library/turtle turtle setworldcoordinates10483931 +Ref: 35c610483931 +Node: Animation control10484913 +Ref: library/turtle animation-control10485076 +Ref: 35f310485076 +Ref: library/turtle turtle delay10485133 +Ref: 35c710485133 +Ref: library/turtle turtle tracer10485572 +Ref: 35c810485572 +Ref: library/turtle turtle update10486273 +Ref: 35c910486273 +Node: Using screen events10486445 +Ref: library/turtle using-screen-events10486607 +Ref: 35f410486607 +Ref: library/turtle turtle listen10486668 +Ref: 35ca10486668 +Ref: library/turtle turtle onkey10486903 +Ref: 35cb10486903 +Ref: library/turtle turtle onkeyrelease10486941 +Ref: 35cc10486941 +Ref: library/turtle turtle onkeypress10487563 +Ref: 35cd10487563 +Ref: library/turtle turtle onclick10488166 +Ref: 35b410488166 +Ref: library/turtle turtle onscreenclick10488218 +Ref: 35ce10488218 +Ref: library/turtle turtle ontimer10489406 +Ref: 35cf10489406 +Ref: library/turtle turtle mainloop10489890 +Ref: 35d010489890 +Ref: library/turtle turtle done10489923 +Ref: 35d110489923 +Node: Input methods10490249 +Ref: library/turtle input-methods10490422 +Ref: 35f510490422 +Ref: library/turtle turtle textinput10490471 +Ref: 12c810490471 +Ref: library/turtle turtle numinput10490925 +Ref: 12c910490925 +Node: Settings and special methods10491848 +Ref: library/turtle settings-and-special-methods10492060 +Ref: 35f610492060 +Ref: library/turtle turtle mode10492139 +Ref: 35d210492139 +Ref: library/turtle turtle colormode10493368 +Ref: 35d310493368 +Ref: library/turtle turtle getcanvas10494008 +Ref: 35d410494008 +Ref: library/turtle turtle getshapes10494259 +Ref: 35d510494259 +Ref: library/turtle turtle register_shape10494453 +Ref: 35d610494453 +Ref: library/turtle turtle addshape10494508 +Ref: 35d710494508 +Ref: library/turtle turtle turtles10495469 +Ref: 35d810495469 +Ref: library/turtle turtle window_height10495635 +Ref: 35d910495635 +Ref: library/turtle turtle window_width10495772 +Ref: 35da10495772 +Node: Methods specific to Screen not inherited from TurtleScreen10495906 +Ref: library/turtle methods-specific-to-screen-not-inherited-from-turtlescreen10496096 +Ref: 35f710496096 +Ref: library/turtle screenspecific10496096 +Ref: 35f810496096 +Ref: library/turtle turtle bye10496237 +Ref: 35db10496237 +Ref: library/turtle turtle exitonclick10496304 +Ref: 35dc10496304 +Ref: library/turtle turtle setup10496744 +Ref: 35dd10496744 +Ref: library/turtle turtle title10498064 +Ref: 35de10498064 +Node: Public classes10498330 +Ref: library/turtle public-classes10498505 +Ref: 35f910498505 +Ref: library/turtle turtle RawTurtle10498556 +Ref: 356c10498556 +Ref: library/turtle turtle RawPen10498593 +Ref: 356d10498593 +Ref: library/turtle turtle Turtle10498864 +Ref: 356e10498864 +Ref: library/turtle turtle TurtleScreen10499056 +Ref: 356910499056 +Ref: library/turtle turtle Screen10499243 +Ref: 356b10499243 +Ref: library/turtle turtle ScrolledCanvas10499338 +Ref: 356a10499338 +Ref: library/turtle turtle Shape10499633 +Ref: 35f010499633 +Ref: library/turtle turtle Shape addcomponent10500441 +Ref: 35fa10500441 +Ref: library/turtle turtle Vec2D10501041 +Ref: 35e110501041 +Node: Help and configuration10501593 +Ref: library/turtle help-and-configuration10501737 +Ref: 35fb10501737 +Node: How to use help10501929 +Ref: library/turtle how-to-use-help10502062 +Ref: 35fc10502062 +Node: Translation of docstrings into different languages10504392 +Ref: library/turtle translation-of-docstrings-into-different-languages10504569 +Ref: 35fd10504569 +Ref: library/turtle turtle write_docstringdict10504873 +Ref: 35fe10504873 +Node: How to configure Screen and Turtles10505912 +Ref: library/turtle how-to-configure-screen-and-turtles10506065 +Ref: 35ff10506065 +Node: turtledemo — Demo scripts10508856 +Ref: library/turtle module-turtledemo10509010 +Ref: 12110509010 +Ref: library/turtle turtledemo-demo-scripts10509010 +Ref: 360010509010 +Node: Changes since Python 2 610514653 +Ref: library/turtle changes-since-python-2-610514809 +Ref: 360110514809 +Node: Changes since Python 3 010515784 +Ref: library/turtle changes-since-python-3-010515904 +Ref: 360210515904 +Node: cmd — Support for line-oriented command interpreters10517111 +Ref: library/cmd doc10517297 +Ref: 360310517297 +Ref: library/cmd cmd-support-for-line-oriented-command-interpreters10517297 +Ref: 360410517297 +Ref: library/cmd module-cmd10517297 +Ref: 1810517297 +Ref: library/cmd cmd Cmd10517773 +Ref: 360510517773 +Ref: cmd — Support for line-oriented command interpreters-Footnote-110518966 +Node: Cmd Objects10519029 +Ref: library/cmd cmd-objects10519151 +Ref: 360710519151 +Ref: library/cmd id110519151 +Ref: 360810519151 +Ref: library/cmd cmd Cmd cmdloop10519250 +Ref: 360910519250 +Ref: library/cmd cmd Cmd onecmd10521813 +Ref: 360c10521813 +Ref: library/cmd cmd Cmd emptyline10522404 +Ref: 360f10522404 +Ref: library/cmd cmd Cmd default10522602 +Ref: 360e10522602 +Ref: library/cmd cmd Cmd completedefault10522799 +Ref: 361010522799 +Ref: library/cmd cmd Cmd columnize10523021 +Ref: 125e10523021 +Ref: library/cmd cmd Cmd precmd10523257 +Ref: 360d10523257 +Ref: library/cmd cmd Cmd postcmd10523736 +Ref: 360b10523736 +Ref: library/cmd cmd Cmd preloop10524369 +Ref: 361110524369 +Ref: library/cmd cmd Cmd postloop10524563 +Ref: 361210524563 +Ref: library/cmd cmd Cmd prompt10524847 +Ref: 361310524847 +Ref: library/cmd cmd Cmd identchars10524916 +Ref: 361410524916 +Ref: library/cmd cmd Cmd lastcmd10525011 +Ref: 361510525011 +Ref: library/cmd cmd Cmd cmdqueue10525084 +Ref: 361610525084 +Ref: library/cmd cmd Cmd intro10525335 +Ref: 360a10525335 +Ref: library/cmd cmd Cmd doc_header10525489 +Ref: 361710525489 +Ref: library/cmd cmd Cmd misc_header10525609 +Ref: 361810525609 +Ref: library/cmd cmd Cmd undoc_header10525828 +Ref: 361910525828 +Ref: library/cmd cmd Cmd ruler10526044 +Ref: 361a10526044 +Ref: library/cmd cmd Cmd use_rawinput10526218 +Ref: 360610526218 +Node: Cmd Example10526675 +Ref: library/cmd cmd-example10526797 +Ref: 361b10526797 +Ref: library/cmd id210526797 +Ref: 361c10526797 +Node: shlex — Simple lexical analysis10532140 +Ref: library/shlex doc10532291 +Ref: 361d10532291 +Ref: library/shlex module-shlex10532291 +Ref: e510532291 +Ref: library/shlex shlex-simple-lexical-analysis10532291 +Ref: 361e10532291 +Ref: library/shlex shlex split10532812 +Ref: 59410532812 +Ref: library/shlex shlex join10533586 +Ref: 67310533586 +Ref: library/shlex shlex quote10534042 +Ref: dd710534042 +Ref: library/shlex shlex-quote-warning10534270 +Ref: 2a5d10534270 +Ref: library/shlex shlex shlex10535903 +Ref: 93b10535903 +Ref: shlex — Simple lexical analysis-Footnote-110538149 +Node: shlex Objects10538214 +Ref: library/shlex id110538319 +Ref: 362210538319 +Ref: library/shlex shlex-objects10538319 +Ref: 362310538319 +Ref: library/shlex shlex shlex get_token10538423 +Ref: 362410538423 +Ref: library/shlex shlex shlex push_token10538786 +Ref: 362510538786 +Ref: library/shlex shlex shlex read_token10538868 +Ref: 362710538868 +Ref: library/shlex shlex shlex sourcehook10539107 +Ref: 362810539107 +Ref: library/shlex shlex shlex push_source10540647 +Ref: 362a10540647 +Ref: library/shlex shlex shlex pop_source10540950 +Ref: 362b10540950 +Ref: library/shlex shlex shlex error_leader10541149 +Ref: 362c10541149 +Ref: library/shlex shlex shlex commenters10541878 +Ref: 361f10541878 +Ref: library/shlex shlex shlex wordchars10542100 +Ref: 362110542100 +Ref: library/shlex shlex shlex whitespace10542796 +Ref: 362e10542796 +Ref: library/shlex shlex shlex escape10542994 +Ref: 362f10542994 +Ref: library/shlex shlex shlex quotes10543159 +Ref: 363010543159 +Ref: library/shlex shlex shlex escapedquotes10543444 +Ref: 363110543444 +Ref: library/shlex shlex shlex whitespace_split10543673 +Ref: 362d10543673 +Ref: library/shlex shlex shlex infile10544211 +Ref: 362010544211 +Ref: library/shlex shlex shlex instream10544442 +Ref: 363210544442 +Ref: library/shlex shlex shlex source10544567 +Ref: 362910544567 +Ref: library/shlex shlex shlex debug10545157 +Ref: 363310545157 +Ref: library/shlex shlex shlex lineno10545421 +Ref: 363410545421 +Ref: library/shlex shlex shlex token10545517 +Ref: 363510545517 +Ref: library/shlex shlex shlex eof10545634 +Ref: 362610545634 +Ref: library/shlex shlex shlex punctuation_chars10545810 +Ref: 13f810545810 +Node: Parsing Rules10546219 +Ref: library/shlex parsing-rules10546367 +Ref: 363610546367 +Ref: library/shlex shlex-parsing-rules10546367 +Ref: 363710546367 +Node: Improved Compatibility with Shells10548388 +Ref: library/shlex improved-compatibility-with-shells10548514 +Ref: 363810548514 +Ref: library/shlex improved-shell-compatibility10548514 +Ref: 93c10548514 +Node: Graphical User Interfaces with Tk10551358 +Ref: library/tk doc10551508 +Ref: 363910551508 +Ref: library/tk graphical-user-interfaces-with-tk10551508 +Ref: 363a10551508 +Ref: library/tk tkinter10551508 +Ref: 363b10551508 +Ref: Graphical User Interfaces with Tk-Footnote-110553446 +Node: tkinter — Python interface to Tcl/Tk10553498 +Ref: library/tkinter doc10553661 +Ref: 363c10553661 +Ref: library/tkinter module-tkinter10553661 +Ref: 10e10553661 +Ref: library/tkinter tkinter-python-interface-to-tcl-tk10553661 +Ref: 363d10553661 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-110556539 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-210556616 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-310556644 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-410556684 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-510556741 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-610556768 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-710556805 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-810556897 +Ref: tkinter — Python interface to Tcl/Tk-Footnote-910556949 +Node: Architecture10557008 +Ref: library/tkinter architecture10557119 +Ref: 363e10557119 +Ref: Architecture-Footnote-110559449 +Node: Tkinter Modules10559489 +Ref: library/tkinter tkinter-modules10559631 +Ref: 364110559631 +Ref: library/tkinter tkinter Tk10559960 +Ref: 364010559960 +Ref: library/tkinter tkinter Tk tk10562108 +Ref: 364310562108 +Ref: library/tkinter tkinter Tk master10562407 +Ref: 364410562407 +Ref: library/tkinter tkinter Tk children10562977 +Ref: 364510562977 +Ref: library/tkinter tkinter Tcl10563187 +Ref: 364210563187 +Node: Tkinter Life Preserver10565899 +Ref: library/tkinter tkinter-life-preserver10566044 +Ref: 364610566044 +Node: A Hello World Program10566872 +Ref: library/tkinter a-hello-world-program10566982 +Ref: 364710566982 +Node: Important Tk Concepts10568454 +Ref: library/tkinter important-tk-concepts10568611 +Ref: 364810568611 +Node: Understanding How Tkinter Wraps Tcl/Tk10569959 +Ref: library/tkinter understanding-how-tkinter-wraps-tcl-tk10570128 +Ref: 364910570128 +Node: How do I…? What option does…?10572289 +Ref: library/tkinter how-do-i-what-option-does10572475 +Ref: 364a10572475 +Node: Navigating the Tcl/Tk Reference Manual10574221 +Ref: library/tkinter navigating-the-tcl-tk-reference-manual10574360 +Ref: 364b10574360 +Ref: Navigating the Tcl/Tk Reference Manual-Footnote-110576438 +Ref: Navigating the Tcl/Tk Reference Manual-Footnote-210576495 +Ref: Navigating the Tcl/Tk Reference Manual-Footnote-310576554 +Ref: Navigating the Tcl/Tk Reference Manual-Footnote-410576607 +Ref: Navigating the Tcl/Tk Reference Manual-Footnote-510576663 +Ref: Navigating the Tcl/Tk Reference Manual-Footnote-610576722 +Node: Threading model10576776 +Ref: library/tkinter threading-model10576921 +Ref: 363f10576921 +Node: Handy Reference10580088 +Ref: library/tkinter handy-reference10580224 +Ref: 364c10580224 +Node: Setting Options10580478 +Ref: library/tkinter setting-options10580564 +Ref: 364d10580564 +Ref: library/tkinter tkinter-setting-options10580564 +Ref: 364e10580564 +Node: The Packer10583773 +Ref: library/tkinter the-packer10583882 +Ref: 364f10583882 +Node: Packer Options10585532 +Ref: library/tkinter packer-options10585651 +Ref: 365010585651 +Node: Coupling Widget Variables10586351 +Ref: library/tkinter coupling-widget-variables10586478 +Ref: 365110586478 +Node: The Window Manager10588680 +Ref: library/tkinter the-window-manager10588813 +Ref: 365210588813 +Node: Tk Option Data Types10590207 +Ref: library/tkinter tk-option-data-types10590334 +Ref: 365310590334 +Node: Bindings and Events10593396 +Ref: library/tkinter bindings-and-events10593524 +Ref: 365410593524 +Ref: library/tkinter id210593524 +Ref: 365510593524 +Node: The index Parameter10596317 +Ref: library/tkinter the-index-parameter10596431 +Ref: 365610596431 +Node: Images10598366 +Ref: library/tkinter images10598452 +Ref: 365710598452 +Ref: Images-Footnote-110599386 +Node: File Handlers10599421 +Ref: library/tkinter file-handlers10599533 +Ref: 365810599533 +Ref: library/tkinter tkinter-file-handlers10599533 +Ref: 365910599533 +Ref: library/tkinter tkinter Widget tk createfilehandler10600475 +Ref: 365a10600475 +Ref: library/tkinter tkinter Widget tk deletefilehandler10600910 +Ref: 365b10600910 +Ref: library/tkinter tkinter READABLE10600992 +Ref: 365c10600992 +Ref: library/tkinter tkinter WRITABLE10601019 +Ref: 365d10601019 +Ref: library/tkinter tkinter EXCEPTION10601046 +Ref: 365e10601046 +Node: tkinter colorchooser — Color choosing dialog10601121 +Ref: library/tkinter colorchooser doc10601330 +Ref: 365f10601330 +Ref: library/tkinter colorchooser module-tkinter colorchooser10601330 +Ref: 10f10601330 +Ref: library/tkinter colorchooser tkinter-colorchooser-color-choosing-dialog10601330 +Ref: 366010601330 +Ref: library/tkinter colorchooser tkinter colorchooser Chooser10601829 +Ref: 366110601829 +Ref: library/tkinter colorchooser tkinter colorchooser askcolor10601895 +Ref: 366310601895 +Ref: tkinter colorchooser — Color choosing dialog-Footnote-110602290 +Node: tkinter font — Tkinter font wrapper10602371 +Ref: library/tkinter font doc10602557 +Ref: 366410602557 +Ref: library/tkinter font module-tkinter font10602557 +Ref: 11310602557 +Ref: library/tkinter font tkinter-font-tkinter-font-wrapper10602557 +Ref: 366510602557 +Ref: library/tkinter font tkinter font NORMAL10602915 +Ref: 366610602915 +Ref: library/tkinter font tkinter font BOLD10602945 +Ref: 366710602945 +Ref: library/tkinter font tkinter font ITALIC10602973 +Ref: 366810602973 +Ref: library/tkinter font tkinter font ROMAN10603003 +Ref: 366910603003 +Ref: library/tkinter font tkinter font Font10603033 +Ref: 131010603033 +Ref: library/tkinter font tkinter font Font actual10604351 +Ref: 366a10604351 +Ref: library/tkinter font tkinter font Font cget10604452 +Ref: 366b10604452 +Ref: library/tkinter font tkinter font Font config10604530 +Ref: 366c10604530 +Ref: library/tkinter font tkinter font Font copy10604609 +Ref: 366d10604609 +Ref: library/tkinter font tkinter font Font measure10604687 +Ref: 366e10604687 +Ref: library/tkinter font tkinter font Font metrics10604946 +Ref: 366f10604946 +Ref: library/tkinter font tkinter font families10605523 +Ref: 367010605523 +Ref: library/tkinter font tkinter font names10605630 +Ref: 367110605630 +Ref: library/tkinter font tkinter font nametofont10605717 +Ref: 131210605717 +Ref: tkinter font — Tkinter font wrapper-Footnote-110605941 +Node: Tkinter Dialogs10606013 +Ref: library/dialog doc10606199 +Ref: 367210606199 +Ref: library/dialog tkinter-dialogs10606199 +Ref: 367310606199 +Node: tkinter simpledialog — Standard Tkinter input dialogs10606570 +Ref: library/dialog module-tkinter simpledialog10606731 +Ref: 11610606731 +Ref: library/dialog tkinter-simpledialog-standard-tkinter-input-dialogs10606731 +Ref: 367410606731 +Ref: library/dialog tkinter simpledialog askfloat10607135 +Ref: 367510607135 +Ref: library/dialog tkinter simpledialog askinteger10607201 +Ref: 131310607201 +Ref: library/dialog tkinter simpledialog askstring10607269 +Ref: 367610607269 +Ref: library/dialog tkinter simpledialog Dialog10607449 +Ref: 367710607449 +Ref: library/dialog tkinter simpledialog Dialog body10607551 +Ref: 367810607551 +Ref: library/dialog tkinter simpledialog Dialog buttonbox10607720 +Ref: 367910607720 +Ref: tkinter simpledialog — Standard Tkinter input dialogs-Footnote-110607906 +Node: tkinter filedialog — File selection dialogs10607987 +Ref: library/dialog module-tkinter filedialog10608205 +Ref: 11210608205 +Ref: library/dialog tkinter-filedialog-file-selection-dialogs10608205 +Ref: 367a10608205 +Ref: tkinter filedialog — File selection dialogs-Footnote-110608639 +Node: Native Load/Save Dialogs10608718 +Ref: library/dialog native-load-save-dialogs10608824 +Ref: 367b10608824 +Ref: library/dialog tkinter filedialog askopenfile10609840 +Ref: 367c10609840 +Ref: library/dialog tkinter filedialog askopenfiles10609907 +Ref: 367d10609907 +Ref: library/dialog tkinter filedialog asksaveasfile10610102 +Ref: 367f10610102 +Ref: library/dialog tkinter filedialog askopenfilename10610271 +Ref: 368110610271 +Ref: library/dialog tkinter filedialog askopenfilenames10610332 +Ref: 368210610332 +Ref: library/dialog tkinter filedialog asksaveasfilename10610543 +Ref: 368310610543 +Ref: library/dialog tkinter filedialog askdirectory10610688 +Ref: 368410610688 +Ref: library/dialog tkinter filedialog Open10610917 +Ref: 367e10610917 +Ref: library/dialog tkinter filedialog SaveAs10610977 +Ref: 368010610977 +Ref: library/dialog tkinter filedialog Directory10611298 +Ref: 368510611298 +Ref: library/dialog tkinter filedialog FileDialog10611530 +Ref: 368610611530 +Ref: library/dialog tkinter filedialog FileDialog cancel_command10611637 +Ref: 368710611637 +Ref: library/dialog tkinter filedialog FileDialog dirs_double_event10611740 +Ref: 368810611740 +Ref: library/dialog tkinter filedialog FileDialog dirs_select_event10611846 +Ref: 368910611846 +Ref: library/dialog tkinter filedialog FileDialog files_double_event10611945 +Ref: 368a10611945 +Ref: library/dialog tkinter filedialog FileDialog files_select_event10612047 +Ref: 368b10612047 +Ref: library/dialog tkinter filedialog FileDialog filter_command10612149 +Ref: 368c10612149 +Ref: library/dialog tkinter filedialog FileDialog get_filter10612237 +Ref: 368d10612237 +Ref: library/dialog tkinter filedialog FileDialog get_selection10612323 +Ref: 368e10612323 +Ref: library/dialog tkinter filedialog FileDialog go10612407 +Ref: 368f10612407 +Ref: library/dialog tkinter filedialog FileDialog ok_event10612549 +Ref: 369010612549 +Ref: library/dialog tkinter filedialog FileDialog quit10612636 +Ref: 369110612636 +Ref: library/dialog tkinter filedialog FileDialog set_filter10612721 +Ref: 369210612721 +Ref: library/dialog tkinter filedialog FileDialog set_selection10612793 +Ref: 369310612793 +Ref: library/dialog tkinter filedialog LoadFileDialog10612888 +Ref: 369410612888 +Ref: library/dialog tkinter filedialog LoadFileDialog ok_command10613052 +Ref: 369510613052 +Ref: library/dialog tkinter filedialog SaveFileDialog10613193 +Ref: 369610613193 +Ref: library/dialog tkinter filedialog SaveFileDialog ok_command10613359 +Ref: 369710613359 +Node: tkinter commondialog — Dialog window templates10613571 +Ref: library/dialog module-tkinter commondialog10613725 +Ref: 11010613725 +Ref: library/dialog tkinter-commondialog-dialog-window-templates10613725 +Ref: 369810613725 +Ref: library/dialog tkinter commondialog Dialog10614119 +Ref: 366210614119 +Ref: library/dialog tkinter commondialog Dialog show10614184 +Ref: 369910614184 +Ref: tkinter commondialog — Dialog window templates-Footnote-110614402 +Node: tkinter messagebox — Tkinter message prompts10614483 +Ref: library/tkinter messagebox doc10614677 +Ref: 369a10614677 +Ref: library/tkinter messagebox module-tkinter messagebox10614677 +Ref: 11410614677 +Ref: library/tkinter messagebox tkinter-messagebox-tkinter-message-prompts10614677 +Ref: 369b10614677 +Ref: library/tkinter messagebox tkinter messagebox Message10615305 +Ref: 369c10615305 +Ref: library/tkinter messagebox tkinter messagebox showinfo10615444 +Ref: 369d10615444 +Ref: library/tkinter messagebox tkinter messagebox showwarning10615558 +Ref: 369e10615558 +Ref: library/tkinter messagebox tkinter messagebox showerror10615649 +Ref: 369f10615649 +Ref: library/tkinter messagebox tkinter messagebox askquestion10615765 +Ref: 36a010615765 +Ref: library/tkinter messagebox tkinter messagebox askokcancel10615856 +Ref: 36a110615856 +Ref: library/tkinter messagebox tkinter messagebox askretrycancel10615947 +Ref: 36a210615947 +Ref: library/tkinter messagebox tkinter messagebox askyesno10616041 +Ref: 36a310616041 +Ref: library/tkinter messagebox tkinter messagebox askyesnocancel10616129 +Ref: 36a410616129 +Ref: tkinter messagebox — Tkinter message prompts-Footnote-110616260 +Node: tkinter scrolledtext — Scrolled Text Widget10616339 +Ref: library/tkinter scrolledtext doc10616555 +Ref: 36a510616555 +Ref: library/tkinter scrolledtext module-tkinter scrolledtext10616555 +Ref: 11510616555 +Ref: library/tkinter scrolledtext tkinter-scrolledtext-scrolled-text-widget10616555 +Ref: 36a610616555 +Ref: library/tkinter scrolledtext tkinter scrolledtext ScrolledText10617469 +Ref: 36a710617469 +Ref: library/tkinter scrolledtext tkinter scrolledtext ScrolledText frame10617535 +Ref: 36a810617535 +Ref: library/tkinter scrolledtext tkinter scrolledtext ScrolledText vbar10617632 +Ref: 36a910617632 +Ref: tkinter scrolledtext — Scrolled Text Widget-Footnote-110617728 +Node: tkinter dnd — Drag and drop support10617809 +Ref: library/tkinter dnd doc10618012 +Ref: 36aa10618012 +Ref: library/tkinter dnd module-tkinter dnd10618012 +Ref: 11110618012 +Ref: library/tkinter dnd tkinter-dnd-drag-and-drop-support10618012 +Ref: 36ab10618012 +Ref: library/tkinter dnd tkinter dnd DndHandler10619504 +Ref: 36ad10619504 +Ref: library/tkinter dnd tkinter dnd DndHandler cancel10619692 +Ref: 36ae10619692 +Ref: library/tkinter dnd tkinter dnd DndHandler finish10619775 +Ref: 36af10619775 +Ref: library/tkinter dnd tkinter dnd DndHandler on_motion10619869 +Ref: 36b010619869 +Ref: library/tkinter dnd tkinter dnd DndHandler on_release10619995 +Ref: 36b110619995 +Ref: library/tkinter dnd tkinter dnd dnd_start10620101 +Ref: 36ac10620101 +Ref: tkinter dnd — Drag and drop support-Footnote-110620293 +Node: tkinter ttk — Tk themed widgets10620364 +Ref: library/tkinter ttk doc10620562 +Ref: 36b210620562 +Ref: library/tkinter ttk module-tkinter ttk10620562 +Ref: 11810620562 +Ref: library/tkinter ttk tkinter-ttk-tk-themed-widgets10620562 +Ref: 36b310620562 +Ref: tkinter ttk — Tk themed widgets-Footnote-110621483 +Ref: tkinter ttk — Tk themed widgets-Footnote-210621554 +Node: Using Ttk10621607 +Ref: library/tkinter ttk using-ttk10621706 +Ref: 36b410621706 +Ref: Using Ttk-Footnote-110622863 +Node: Ttk Widgets10622927 +Ref: library/tkinter ttk ttk-widgets10623041 +Ref: 36b510623041 +Node: Widget10624150 +Ref: library/tkinter ttk widget10624263 +Ref: 36bc10624263 +Node: Standard Options10624580 +Ref: library/tkinter ttk standard-options10624673 +Ref: 36bd10624673 +Node: Scrollable Widget Options10626350 +Ref: library/tkinter ttk scrollable-widget-options10626465 +Ref: 36be10626465 +Node: Label Options10627588 +Ref: library/tkinter ttk label-options10627708 +Ref: 36bf10627708 +Node: Compatibility Options10630267 +Ref: library/tkinter ttk compatibility-options10630375 +Ref: 36c010630375 +Node: Widget States10630911 +Ref: library/tkinter ttk widget-states10631016 +Ref: 36c210631016 +Node: ttk Widget10632695 +Ref: library/tkinter ttk ttk-widget10632770 +Ref: 36c310632770 +Ref: library/tkinter ttk tkinter ttk Widget10632957 +Ref: 36b910632957 +Ref: library/tkinter ttk tkinter ttk Widget identify10632988 +Ref: 36c410632988 +Ref: library/tkinter ttk tkinter ttk Widget instate10633231 +Ref: 36c510633231 +Ref: library/tkinter ttk tkinter ttk Widget state10633575 +Ref: 36c110633575 +Node: Combobox10633963 +Ref: library/tkinter ttk combobox10634072 +Ref: 36c610634072 +Node: Options10634767 +Ref: library/tkinter ttk options10634842 +Ref: 36c710634842 +Node: Virtual events10637348 +Ref: library/tkinter ttk virtual-events10637444 +Ref: 36c810637444 +Node: ttk Combobox10637624 +Ref: library/tkinter ttk ttk-combobox10637704 +Ref: 36c910637704 +Ref: library/tkinter ttk tkinter ttk Combobox10637751 +Ref: 36b610637751 +Ref: library/tkinter ttk tkinter ttk Combobox current10637784 +Ref: 36ca10637784 +Ref: library/tkinter ttk tkinter ttk Combobox get10638060 +Ref: 36cb10638060 +Ref: library/tkinter ttk tkinter ttk Combobox set10638139 +Ref: 36cc10638139 +Node: Spinbox10638223 +Ref: library/tkinter ttk spinbox10638334 +Ref: 36cd10638334 +Node: Options<2>10639094 +Ref: library/tkinter ttk id110639174 +Ref: 36ce10639174 +Node: Virtual events<2>10641560 +Ref: library/tkinter ttk id210641660 +Ref: 36cf10641660 +Node: ttk Spinbox10641868 +Ref: library/tkinter ttk ttk-spinbox10641949 +Ref: 36d010641949 +Ref: library/tkinter ttk tkinter ttk Spinbox10641994 +Ref: 7f610641994 +Ref: library/tkinter ttk tkinter ttk Spinbox get10642026 +Ref: 36d110642026 +Ref: library/tkinter ttk tkinter ttk Spinbox set10642104 +Ref: 36d210642104 +Node: Notebook10642187 +Ref: library/tkinter ttk notebook10642301 +Ref: 36d310642301 +Node: Options<3>10642661 +Ref: library/tkinter ttk id310642736 +Ref: 36d410642736 +Node: Tab Options10643911 +Ref: library/tkinter ttk tab-options10644010 +Ref: 36d510644010 +Node: Tab Identifiers10646085 +Ref: library/tkinter ttk tab-identifiers10646188 +Ref: 36d710646188 +Node: Virtual Events10646722 +Ref: library/tkinter ttk id410646826 +Ref: 36d910646826 +Node: ttk Notebook10646970 +Ref: library/tkinter ttk ttk-notebook10647050 +Ref: 36da10647050 +Ref: library/tkinter ttk tkinter ttk Notebook10647097 +Ref: 36b710647097 +Ref: library/tkinter ttk tkinter ttk Notebook add10647130 +Ref: 36db10647130 +Ref: library/tkinter ttk tkinter ttk Notebook forget10647415 +Ref: 36dc10647415 +Ref: library/tkinter ttk tkinter ttk Notebook hide10647553 +Ref: 36dd10647553 +Ref: library/tkinter ttk tkinter ttk Notebook identify10647863 +Ref: 36de10647863 +Ref: library/tkinter ttk tkinter ttk Notebook index10648005 +Ref: 36d810648005 +Ref: library/tkinter ttk tkinter ttk Notebook insert10648184 +Ref: 36df10648184 +Ref: library/tkinter ttk tkinter ttk Notebook select10648569 +Ref: 36e010648569 +Ref: library/tkinter ttk tkinter ttk Notebook tab10648883 +Ref: 36e110648883 +Ref: library/tkinter ttk tkinter ttk Notebook tabs10649229 +Ref: 36e210649229 +Ref: library/tkinter ttk tkinter ttk Notebook enable_traversal10649317 +Ref: 36d610649317 +Node: Progressbar10650144 +Ref: library/tkinter ttk progressbar10650260 +Ref: 36e310650260 +Node: Options<4>10650701 +Ref: library/tkinter ttk id510650783 +Ref: 36e410650783 +Node: ttk Progressbar10652658 +Ref: library/tkinter ttk ttk-progressbar10652740 +Ref: 36e510652740 +Ref: library/tkinter ttk tkinter ttk Progressbar10652793 +Ref: 36b810652793 +Ref: library/tkinter ttk tkinter ttk Progressbar start10652829 +Ref: 36e610652829 +Ref: library/tkinter ttk tkinter ttk Progressbar step10653097 +Ref: 36e710653097 +Ref: library/tkinter ttk tkinter ttk Progressbar stop10653244 +Ref: 36e810653244 +Node: Separator10653429 +Ref: library/tkinter ttk separator10653545 +Ref: 36e910653545 +Node: Options<5>10653775 +Ref: library/tkinter ttk id610653831 +Ref: 36ea10653831 +Node: Sizegrip10654220 +Ref: library/tkinter ttk sizegrip10654333 +Ref: 36eb10654333 +Node: Platform-specific notes10654683 +Ref: library/tkinter ttk platform-specific-notes10654764 +Ref: 36ec10654764 +Node: Bugs10655020 +Ref: library/tkinter ttk bugs10655101 +Ref: 36ed10655101 +Node: Treeview10655374 +Ref: library/tkinter ttk treeview10655489 +Ref: 36ee10655489 +Node: Options<6>10656847 +Ref: library/tkinter ttk id710656923 +Ref: 36f210656923 +Node: Item Options10659569 +Ref: library/tkinter ttk item-options10659665 +Ref: 36f310659665 +Node: Tag Options10660841 +Ref: library/tkinter ttk tag-options10660945 +Ref: 36f410660945 +Node: Column Identifiers10661675 +Ref: library/tkinter ttk column-identifiers10661784 +Ref: 36ef10661784 +Node: Virtual Events<2>10662656 +Ref: library/tkinter ttk id810662766 +Ref: 36f510662766 +Node: ttk Treeview10663668 +Ref: library/tkinter ttk ttk-treeview10663751 +Ref: 36f710663751 +Ref: library/tkinter ttk tkinter ttk Treeview10663798 +Ref: 6ec10663798 +Ref: library/tkinter ttk tkinter ttk Treeview bbox10663831 +Ref: 36f810663831 +Ref: library/tkinter ttk tkinter ttk Treeview get_children10664268 +Ref: 36f910664268 +Ref: library/tkinter ttk tkinter ttk Treeview set_children10664434 +Ref: 36fa10664434 +Ref: library/tkinter ttk tkinter ttk Treeview column10664826 +Ref: 36fb10664826 +Ref: library/tkinter ttk tkinter ttk Treeview delete10666236 +Ref: 36fc10666236 +Ref: library/tkinter ttk tkinter ttk Treeview detach10666382 +Ref: 36fd10666382 +Ref: library/tkinter ttk tkinter ttk Treeview exists10666693 +Ref: 36fe10666693 +Ref: library/tkinter ttk tkinter ttk Treeview focus10666803 +Ref: 36f610666803 +Ref: library/tkinter ttk tkinter ttk Treeview heading10666996 +Ref: 36ff10666996 +Ref: library/tkinter ttk tkinter ttk Treeview identify10668097 +Ref: 370010668097 +Ref: library/tkinter ttk tkinter ttk Treeview identify_row10668334 +Ref: 370110668334 +Ref: library/tkinter ttk tkinter ttk Treeview identify_column10668429 +Ref: 370210668429 +Ref: library/tkinter ttk tkinter ttk Treeview identify_region10668590 +Ref: 370310668590 +Ref: library/tkinter ttk tkinter ttk Treeview identify_element10669226 +Ref: 370410669226 +Ref: library/tkinter ttk tkinter ttk Treeview index10669354 +Ref: 370510669354 +Ref: library/tkinter ttk tkinter ttk Treeview insert10669482 +Ref: 370610669482 +Ref: library/tkinter ttk tkinter ttk Treeview item10670379 +Ref: 370710670379 +Ref: library/tkinter ttk tkinter ttk Treeview move10670757 +Ref: 370810670757 +Ref: library/tkinter ttk tkinter ttk Treeview next10671195 +Ref: 370910671195 +Ref: library/tkinter ttk tkinter ttk Treeview parent10671350 +Ref: 370a10671350 +Ref: library/tkinter ttk tkinter ttk Treeview prev10671501 +Ref: 370b10671501 +Ref: library/tkinter ttk tkinter ttk Treeview reattach10671661 +Ref: 370c10671661 +Ref: library/tkinter ttk tkinter ttk Treeview see10671763 +Ref: 370d10671763 +Ref: library/tkinter ttk tkinter ttk Treeview selection10672019 +Ref: 6eb10672019 +Ref: library/tkinter ttk tkinter ttk Treeview selection_set10672267 +Ref: 6ed10672267 +Ref: library/tkinter ttk tkinter ttk Treeview selection_add10672472 +Ref: 370e10672472 +Ref: library/tkinter ttk tkinter ttk Treeview selection_remove10672672 +Ref: 370f10672672 +Ref: library/tkinter ttk tkinter ttk Treeview selection_toggle10672880 +Ref: 371010672880 +Ref: library/tkinter ttk tkinter ttk Treeview set10673105 +Ref: 371110673105 +Ref: library/tkinter ttk tkinter ttk Treeview tag_bind10673470 +Ref: 371210673470 +Ref: library/tkinter ttk tkinter ttk Treeview tag_configure10673740 +Ref: 371310673740 +Ref: library/tkinter ttk tkinter ttk Treeview tag_has10674169 +Ref: 371410674169 +Ref: library/tkinter ttk tkinter ttk Treeview xview10674454 +Ref: 36f010674454 +Ref: library/tkinter ttk tkinter ttk Treeview yview10674550 +Ref: 36f110674550 +Node: Ttk Styling10674644 +Ref: library/tkinter ttk ttk-styling10674742 +Ref: 371510674742 +Ref: library/tkinter ttk ttkstyling10674742 +Ref: 36ba10674742 +Ref: library/tkinter ttk tkinter ttk Style10675336 +Ref: 36bb10675336 +Ref: library/tkinter ttk tkinter ttk Style configure10675425 +Ref: 371610675425 +Ref: library/tkinter ttk tkinter ttk Style map10676152 +Ref: 132310676152 +Ref: library/tkinter ttk tkinter ttk Style lookup10677417 +Ref: 371710677417 +Ref: library/tkinter ttk tkinter ttk Style layout10677938 +Ref: 371810677938 +Ref: library/tkinter ttk tkinter ttk Style element_create10679250 +Ref: 371a10679250 +Ref: library/tkinter ttk tkinter ttk Style element_names10681372 +Ref: 371b10681372 +Ref: library/tkinter ttk tkinter ttk Style element_options10681477 +Ref: 371c10681477 +Ref: library/tkinter ttk tkinter ttk Style theme_create10681583 +Ref: 371d10681583 +Ref: library/tkinter ttk tkinter ttk Style theme_settings10681996 +Ref: 371e10681996 +Ref: library/tkinter ttk tkinter ttk Style theme_names10683473 +Ref: 371f10683473 +Ref: library/tkinter ttk tkinter ttk Style theme_use10683553 +Ref: 372010683553 +Ref: Ttk Styling-Footnote-110683850 +Node: Layouts10683912 +Ref: library/tkinter ttk layouts10683967 +Ref: 371910683967 +Node: tkinter tix — Extension widgets for Tk10685251 +Ref: library/tkinter tix doc10685420 +Ref: 372110685420 +Ref: library/tkinter tix layout10685420 +Ref: 372210685420 +Ref: library/tkinter tix layouts10685420 +Ref: 372310685420 +Ref: library/tkinter tix module-tkinter tix10685420 +Ref: 11710685420 +Ref: library/tkinter tix tkinter-tix-extension-widgets-for-tk10685420 +Ref: 372410685420 +Ref: tkinter tix — Extension widgets for Tk-Footnote-110687364 +Ref: tkinter tix — Extension widgets for Tk-Footnote-210687435 +Ref: tkinter tix — Extension widgets for Tk-Footnote-310687472 +Ref: tkinter tix — Extension widgets for Tk-Footnote-410687526 +Ref: tkinter tix — Extension widgets for Tk-Footnote-510687604 +Node: Using Tix10687662 +Ref: library/tkinter tix using-tix10687768 +Ref: 372b10687768 +Ref: library/tkinter tix tkinter tix Tk10687807 +Ref: 372c10687807 +Node: Tix Widgets10688780 +Ref: library/tkinter tix tix-widgets10688907 +Ref: 372d10688907 +Ref: Tix Widgets-Footnote-110689247 +Node: Basic Widgets10689326 +Ref: library/tkinter tix basic-widgets10689410 +Ref: 372e10689410 +Ref: library/tkinter tix tkinter tix Balloon10689457 +Ref: 372f10689457 +Ref: library/tkinter tix tkinter tix ButtonBox10689735 +Ref: 373010689735 +Ref: library/tkinter tix tkinter tix ComboBox10689876 +Ref: 372610689876 +Ref: library/tkinter tix tkinter tix Control10690110 +Ref: 372710690110 +Ref: library/tkinter tix tkinter tix LabelEntry10690423 +Ref: 373110690423 +Ref: library/tkinter tix tkinter tix LabelFrame10690638 +Ref: 373210690638 +Ref: library/tkinter tix tkinter tix Meter10690940 +Ref: 373310690940 +Ref: library/tkinter tix tkinter tix OptionMenu10691093 +Ref: 373410691093 +Ref: library/tkinter tix tkinter tix PopupMenu10691186 +Ref: 373510691186 +Ref: library/tkinter tix tkinter tix Select10691434 +Ref: 373610691434 +Ref: library/tkinter tix tkinter tix StdButtonBox10691631 +Ref: 373710691631 +Ref: Basic Widgets-Footnote-110691803 +Ref: Basic Widgets-Footnote-210691884 +Ref: Basic Widgets-Footnote-310691967 +Ref: Basic Widgets-Footnote-410692049 +Ref: Basic Widgets-Footnote-510692130 +Ref: Basic Widgets-Footnote-610692214 +Ref: Basic Widgets-Footnote-710692298 +Ref: Basic Widgets-Footnote-810692377 +Ref: Basic Widgets-Footnote-910692461 +Ref: Basic Widgets-Footnote-1010692544 +Ref: Basic Widgets-Footnote-1110692625 +Node: File Selectors10692712 +Ref: library/tkinter tix file-selectors10692825 +Ref: 373810692825 +Ref: library/tkinter tix tkinter tix DirList10692874 +Ref: 373910692874 +Ref: library/tkinter tix tkinter tix DirTree10693134 +Ref: 373a10693134 +Ref: library/tkinter tix tkinter tix DirSelectDialog10693394 +Ref: 373b10693394 +Ref: library/tkinter tix tkinter tix DirSelectBox10693650 +Ref: 373c10693650 +Ref: library/tkinter tix tkinter tix ExFileSelectBox10693992 +Ref: 373d10693992 +Ref: library/tkinter tix tkinter tix FileSelectBox10694323 +Ref: 373e10694323 +Ref: library/tkinter tix tkinter tix FileEntry10694655 +Ref: 372910694655 +Ref: File Selectors-Footnote-110694975 +Ref: File Selectors-Footnote-210695056 +Ref: File Selectors-Footnote-310695137 +Ref: File Selectors-Footnote-410695226 +Ref: File Selectors-Footnote-510695315 +Ref: File Selectors-Footnote-610695402 +Node: Hierarchical ListBox10695485 +Ref: library/tkinter tix hierarchical-listbox10695600 +Ref: 373f10695600 +Ref: library/tkinter tix tkinter tix HList10695661 +Ref: 372510695661 +Ref: library/tkinter tix tkinter tix CheckList10695946 +Ref: 374010695946 +Ref: library/tkinter tix tkinter tix Tree10696234 +Ref: 374110696234 +Ref: Hierarchical ListBox-Footnote-110696474 +Ref: Hierarchical ListBox-Footnote-210696553 +Ref: Hierarchical ListBox-Footnote-310696636 +Node: Tabular ListBox10696714 +Ref: library/tkinter tix tabular-listbox10696830 +Ref: 374210696830 +Ref: library/tkinter tix tkinter tix TList10696881 +Ref: 374310696881 +Ref: Tabular ListBox-Footnote-110697367 +Node: Manager Widgets10697446 +Ref: library/tkinter tix manager-widgets10697553 +Ref: 374410697553 +Ref: library/tkinter tix tkinter tix PanedWindow10697604 +Ref: 372a10697604 +Ref: library/tkinter tix tkinter tix ListNoteBook10697911 +Ref: 374510697911 +Ref: library/tkinter tix tkinter tix NoteBook10698362 +Ref: 372810698362 +Ref: Manager Widgets-Footnote-110698773 +Ref: Manager Widgets-Footnote-210698858 +Ref: Manager Widgets-Footnote-310698944 +Node: Image Types10699026 +Ref: library/tkinter tix image-types10699139 +Ref: 374610699139 +Ref: Image Types-Footnote-110699751 +Ref: Image Types-Footnote-210699828 +Node: Miscellaneous Widgets10699907 +Ref: library/tkinter tix miscellaneous-widgets10700026 +Ref: 374710700026 +Ref: library/tkinter tix tkinter tix InputOnly10700089 +Ref: 374810700089 +Ref: Miscellaneous Widgets-Footnote-110700290 +Node: Form Geometry Manager10700373 +Ref: library/tkinter tix form-geometry-manager10700472 +Ref: 374910700472 +Ref: library/tkinter tix tkinter tix Form10700618 +Ref: 374a10700618 +Ref: Form Geometry Manager-Footnote-110700769 +Node: Tix Commands10700847 +Ref: library/tkinter tix tix-commands10700956 +Ref: 374b10700956 +Ref: library/tkinter tix tkinter tix tixCommand10701003 +Ref: 374c10701003 +Ref: library/tkinter tix tkinter tix tixCommand tix_configure10701509 +Ref: 374d10701509 +Ref: library/tkinter tix tkinter tix tixCommand tix_cget10702194 +Ref: 374e10702194 +Ref: library/tkinter tix tkinter tix tixCommand tix_getbitmap10702369 +Ref: 374f10702369 +Ref: library/tkinter tix tkinter tix tixCommand tix_addbitmapdir10702920 +Ref: 375010702920 +Ref: library/tkinter tix tkinter tix tixCommand tix_filedialog10703454 +Ref: 375210703454 +Ref: library/tkinter tix tkinter tix tixCommand tix_getimage10704034 +Ref: 375110704034 +Ref: library/tkinter tix tkinter tix tixCommand tix_option_get10704824 +Ref: 375310704824 +Ref: library/tkinter tix tkinter tix tixCommand tix_resetoptions10704933 +Ref: 375410704933 +Ref: Tix Commands-Footnote-110705766 +Node: IDLE<52>10705839 +Ref: library/idle doc10705966 +Ref: 375510705966 +Ref: library/idle id110705966 +Ref: 375610705966 +Ref: library/idle idle10705966 +Ref: cbf10705966 +Ref: IDLE<52>-Footnote-110707010 +Node: Menus10707075 +Ref: library/idle menus10707156 +Ref: 375710707156 +Node: File menu Shell and Editor10708440 +Ref: library/idle file-menu-shell-and-editor10708543 +Ref: 375810708543 +Node: Edit menu Shell and Editor10710395 +Ref: library/idle edit-menu-shell-and-editor10710537 +Ref: 375910710537 +Node: Format menu Editor window only10712280 +Ref: library/idle format-menu10712423 +Ref: 375c10712423 +Ref: library/idle format-menu-editor-window-only10712423 +Ref: 375d10712423 +Node: Run menu Editor window only10713794 +Ref: library/idle run-menu-editor-window-only10713939 +Ref: 375e10713939 +Ref: library/idle run-module10714020 +Ref: 375f10714020 +Ref: library/idle run-custom10714512 +Ref: 376110714512 +Ref: library/idle check-module10714771 +Ref: 376010714771 +Ref: library/idle python-shell10715115 +Ref: 376210715115 +Node: Shell menu Shell window only10715177 +Ref: library/idle shell-menu-shell-window-only10715320 +Ref: 376310715320 +Node: Debug menu Shell window only10715839 +Ref: library/idle debug-menu-shell-window-only10715984 +Ref: 376410715984 +Node: Options menu Shell and Editor10716942 +Ref: library/idle options-menu-shell-and-editor10717087 +Ref: 376510717087 +Node: Window menu Shell and Editor10718706 +Ref: library/idle window-menu-shell-and-editor10718849 +Ref: 376810718849 +Node: Help menu Shell and Editor10719043 +Ref: library/idle help-menu-shell-and-editor10719170 +Ref: 376910719170 +Node: Context menus10719892 +Ref: library/idle context-menus10719982 +Ref: 376b10719982 +Node: Editing and Navigation10721158 +Ref: library/idle editing-and-navigation10721274 +Ref: 376c10721274 +Ref: library/idle id210721274 +Ref: 376d10721274 +Node: Editor windows10721517 +Ref: library/idle editor-windows10721611 +Ref: 376e10721611 +Node: Key bindings10722235 +Ref: library/idle key-bindings10722359 +Ref: 376f10722359 +Node: Automatic indentation10723749 +Ref: library/idle automatic-indentation10723877 +Ref: 377010723877 +Node: Search and Replace10724459 +Ref: library/idle search-and-replace10724586 +Ref: 377110724586 +Node: Completions10724921 +Ref: library/idle completions10725035 +Ref: 375a10725035 +Ref: library/idle id310725035 +Ref: 377210725035 +Node: Calltips10727682 +Ref: library/idle calltips10727790 +Ref: 375b10727790 +Ref: library/idle id410727790 +Ref: 377310727790 +Node: Code Context10729418 +Ref: library/idle code-context10729527 +Ref: 376710729527 +Ref: library/idle id510729527 +Ref: 377410729527 +Node: Shell window10730417 +Ref: library/idle shell-window10730529 +Ref: 377510730529 +Node: Text colors10732208 +Ref: library/idle text-colors10732299 +Ref: 377610732299 +Node: Startup and Code Execution10733334 +Ref: library/idle startup-and-code-execution10733465 +Ref: 377710733465 +Node: Command line usage10734598 +Ref: library/idle command-line-usage10734703 +Ref: 377810734703 +Node: Startup failure10735745 +Ref: library/idle startup-failure10735876 +Ref: 377910735876 +Node: Running user code10739065 +Ref: library/idle running-user-code10739198 +Ref: 377a10739198 +Node: User output in Shell10741984 +Ref: library/idle user-output-in-shell10742133 +Ref: 377b10742133 +Node: Developing tkinter applications10745221 +Ref: library/idle developing-tkinter-applications10745381 +Ref: 377c10745381 +Node: Running without a subprocess10746632 +Ref: library/idle running-without-a-subprocess10746763 +Ref: 377d10746763 +Node: Help and Preferences10748147 +Ref: library/idle help-and-preferences10748263 +Ref: 377e10748263 +Node: Help sources10748412 +Ref: library/idle help-sources10748509 +Ref: 376a10748509 +Ref: library/idle id610748509 +Ref: 377f10748509 +Node: Setting preferences10749381 +Ref: library/idle preferences10749500 +Ref: 376610749500 +Ref: library/idle setting-preferences10749500 +Ref: 378010749500 +Node: IDLE on macOS10750511 +Ref: library/idle idle-on-macos10750628 +Ref: 378110750628 +Node: Extensions10750897 +Ref: library/idle extensions10750986 +Ref: 378210750986 +Node: idlelib10751339 +Ref: library/idle idlelib10751420 +Ref: 378310751420 +Ref: library/idle module-idlelib10751420 +Ref: 9310751420 +Ref: idlelib-Footnote-110752054 +Ref: idlelib-Footnote-210752118 +Node: Development Tools10752160 +Ref: library/development doc10752315 +Ref: 378410752315 +Ref: library/development development10752315 +Ref: 378510752315 +Ref: library/development development-tools10752315 +Ref: 378610752315 +Node: typing — Support for type hints10754485 +Ref: library/typing doc10754637 +Ref: 378710754637 +Ref: library/typing module-typing10754637 +Ref: 12310754637 +Ref: library/typing typing-support-for-type-hints10754637 +Ref: 378810754637 +Ref: typing — Support for type hints-Footnote-110756430 +Ref: typing — Support for type hints-Footnote-210756496 +Ref: typing — Support for type hints-Footnote-310756538 +Ref: typing — Support for type hints-Footnote-410756580 +Node: Relevant PEPs10756632 +Ref: library/typing id110756736 +Ref: 378a10756736 +Ref: library/typing relevant-peps10756736 +Ref: 378b10756736 +Ref: Relevant PEPs-Footnote-110759189 +Ref: Relevant PEPs-Footnote-210759231 +Ref: Relevant PEPs-Footnote-310759273 +Ref: Relevant PEPs-Footnote-410759315 +Ref: Relevant PEPs-Footnote-510759357 +Ref: Relevant PEPs-Footnote-610759399 +Ref: Relevant PEPs-Footnote-710759441 +Ref: Relevant PEPs-Footnote-810759483 +Ref: Relevant PEPs-Footnote-910759525 +Ref: Relevant PEPs-Footnote-1010759567 +Ref: Relevant PEPs-Footnote-1110759610 +Ref: Relevant PEPs-Footnote-1210759653 +Ref: Relevant PEPs-Footnote-1310759696 +Ref: Relevant PEPs-Footnote-1410759739 +Ref: Relevant PEPs-Footnote-1510759782 +Ref: Relevant PEPs-Footnote-1610759825 +Ref: Relevant PEPs-Footnote-1710759868 +Ref: Relevant PEPs-Footnote-1810759911 +Node: Type aliases10759954 +Ref: library/typing id210760074 +Ref: 378d10760074 +Ref: library/typing type-aliases10760074 +Ref: 378e10760074 +Node: NewType10761223 +Ref: library/typing distinct10761338 +Ref: 378f10761338 +Ref: library/typing newtype10761338 +Ref: 379010761338 +Ref: NewType-Footnote-110764349 +Node: Callable10764391 +Ref: library/typing callable10764502 +Ref: 379110764502 +Ref: Callable-Footnote-110766047 +Node: Generics10766089 +Ref: library/typing generics10766219 +Ref: 193310766219 +Ref: library/typing id310766219 +Ref: 379210766219 +Node: User-defined generic types10766956 +Ref: library/typing user-defined-generic-types10767090 +Ref: 379310767090 +Ref: library/typing user-defined-generics10767090 +Ref: 193410767090 +Ref: User-defined generic types-Footnote-110772085 +Node: The Any type10772127 +Ref: library/typing the-any-type10772284 +Ref: 379410772284 +Node: Nominal vs structural subtyping10774917 +Ref: library/typing nominal-vs-structural-subtyping10775066 +Ref: 379510775066 +Ref: Nominal vs structural subtyping-Footnote-110776740 +Ref: Nominal vs structural subtyping-Footnote-210776782 +Ref: Nominal vs structural subtyping-Footnote-310776824 +Node: Module contents<3>10776866 +Ref: library/typing module-contents10777041 +Ref: 379610777041 +Ref: Module contents<3>-Footnote-110778230 +Node: Special typing primitives10778272 +Ref: library/typing special-typing-primitives10778389 +Ref: 379710778389 +Node: Special types10778564 +Ref: library/typing special-types10778661 +Ref: 379810778661 +Ref: library/typing typing Any10778782 +Ref: 27210778782 +Ref: library/typing typing LiteralString10779179 +Ref: 19010779179 +Ref: library/typing typing Never10780376 +Ref: 26d10780376 +Ref: library/typing typing NoReturn10781235 +Ref: 379910781235 +Ref: library/typing typing Self10781760 +Ref: 18c10781760 +Ref: library/typing typing TypeAlias10782985 +Ref: 133810782985 +Ref: Special types-Footnote-110783320 +Ref: Special types-Footnote-210783362 +Ref: Special types-Footnote-310783412 +Ref: Special types-Footnote-410783462 +Ref: Special types-Footnote-510783504 +Node: Special forms10783546 +Ref: library/typing special-forms10783674 +Ref: 379a10783674 +Ref: library/typing typing Tuple10783811 +Ref: 379b10783811 +Ref: library/typing typing Union10784591 +Ref: 21410784591 +Ref: library/typing typing Optional10785734 +Ref: 27910785734 +Ref: library/typing typing Callable10786566 +Ref: 3b110786566 +Ref: library/typing typing Concatenate10788277 +Ref: 3b010788277 +Ref: library/typing typing Type10790581 +Ref: 379c10790581 +Ref: library/typing typing Literal10792434 +Ref: 44c10792434 +Ref: library/typing typing ClassVar10793628 +Ref: 27a10793628 +Ref: library/typing typing Final10794714 +Ref: 69210794714 +Ref: library/typing typing Required10795267 +Ref: 18810795267 +Ref: library/typing typing NotRequired10795294 +Ref: 18910795294 +Ref: library/typing typing Annotated10795556 +Ref: 58510795556 +Ref: library/typing typing TypeGuard10799234 +Ref: 378c10799234 +Ref: Special forms-Footnote-110802154 +Ref: Special forms-Footnote-210802196 +Ref: Special forms-Footnote-310802238 +Ref: Special forms-Footnote-410802280 +Ref: Special forms-Footnote-510802322 +Ref: Special forms-Footnote-610802364 +Ref: Special forms-Footnote-710802406 +Ref: Special forms-Footnote-810802448 +Ref: Special forms-Footnote-910802490 +Ref: Special forms-Footnote-1010802532 +Ref: Special forms-Footnote-1110802575 +Ref: Special forms-Footnote-1210802618 +Node: Building generic types10802661 +Ref: library/typing building-generic-types10802800 +Ref: 379d10802800 +Ref: library/typing typing Generic10802957 +Ref: 11ec10802957 +Ref: library/typing typing TypeVar10803664 +Ref: 18510803664 +Ref: library/typing typing TypeVarTuple10806590 +Ref: 18610806590 +Ref: library/typing typing Unpack10810581 +Ref: 379e10810581 +Ref: library/typing typing ParamSpec10811659 +Ref: 3af10811659 +Ref: library/typing typing ParamSpec args10813949 +Ref: 37a010813949 +Ref: library/typing typing ParamSpec kwargs10813975 +Ref: 37a110813975 +Ref: library/typing typing ParamSpecArgs10815430 +Ref: 3b210815430 +Ref: library/typing typing ParamSpecKwargs10815462 +Ref: 3b310815462 +Ref: library/typing typing AnyStr10816094 +Ref: 37a210816094 +Ref: library/typing typing Protocol10816682 +Ref: 27610816682 +Ref: library/typing typing runtime_checkable10817672 +Ref: 69310817672 +Ref: Building generic types-Footnote-110818875 +Ref: Building generic types-Footnote-210818917 +Ref: Building generic types-Footnote-310818959 +Ref: Building generic types-Footnote-410819001 +Node: Other special directives10819043 +Ref: library/typing other-special-directives10819160 +Ref: 37a310819160 +Ref: library/typing typing NamedTuple10819314 +Ref: 27110819314 +Ref: library/typing typing NewType10821441 +Ref: 96410821441 +Ref: library/typing typing TypedDict10821854 +Ref: 18a10821854 +Ref: library/typing typing TypedDict __total__10826563 +Ref: 37a410826563 +Ref: library/typing typing TypedDict __required_keys__10827075 +Ref: 37a510827075 +Ref: library/typing typing TypedDict __optional_keys__10827145 +Ref: 37a610827145 +Ref: Other special directives-Footnote-110828809 +Ref: Other special directives-Footnote-210828851 +Ref: Other special directives-Footnote-310828893 +Ref: Other special directives-Footnote-410828935 +Node: Generic concrete collections10828977 +Ref: library/typing generic-concrete-collections10829124 +Ref: 37a710829124 +Node: Corresponding to built-in types10829316 +Ref: library/typing corresponding-to-built-in-types10829458 +Ref: 37a810829458 +Ref: library/typing typing Dict10829543 +Ref: 37a910829543 +Ref: library/typing typing List10830048 +Ref: 37ab10830048 +Ref: library/typing typing Set10830737 +Ref: 37ae10830737 +Ref: library/typing typing FrozenSet10831127 +Ref: 37b010831127 +Ref: Corresponding to built-in types-Footnote-110831477 +Ref: Corresponding to built-in types-Footnote-210831519 +Ref: Corresponding to built-in types-Footnote-310831561 +Ref: Corresponding to built-in types-Footnote-410831603 +Node: Corresponding to types in collections10831645 +Ref: library/typing corresponding-to-types-in-collections10831816 +Ref: 37b110831816 +Ref: library/typing typing DefaultDict10831921 +Ref: 37b210831921 +Ref: library/typing typing OrderedDict10832259 +Ref: 37b310832259 +Ref: library/typing typing ChainMap10832597 +Ref: 37b410832597 +Ref: library/typing typing Counter10832946 +Ref: 37b510832946 +Ref: library/typing typing Deque10833271 +Ref: 37b610833271 +Ref: Corresponding to types in collections-Footnote-110833618 +Ref: Corresponding to types in collections-Footnote-210833660 +Ref: Corresponding to types in collections-Footnote-310833702 +Ref: Corresponding to types in collections-Footnote-410833744 +Ref: Corresponding to types in collections-Footnote-510833786 +Node: Other concrete types10833828 +Ref: library/typing other-concrete-types10833959 +Ref: 37b710833959 +Ref: library/typing typing IO10834022 +Ref: 37b810834022 +Ref: library/typing typing TextIO10834043 +Ref: 37b910834043 +Ref: library/typing typing BinaryIO10834068 +Ref: 37ba10834068 +Ref: library/typing typing Pattern10834499 +Ref: 37bb10834499 +Ref: library/typing typing Match10834525 +Ref: 37bc10834525 +Ref: library/typing typing Text10835265 +Ref: 2e210835265 +Ref: Other concrete types-Footnote-110836077 +Node: Abstract Base Classes10836119 +Ref: library/typing abstract-base-classes10836253 +Ref: 37bd10836253 +Node: Corresponding to collections in collections abc10836583 +Ref: library/typing corresponding-to-collections-in-collections-abc10836744 +Ref: 37be10836744 +Ref: library/typing typing AbstractSet10836869 +Ref: 37af10836869 +Ref: library/typing typing ByteString10837134 +Ref: 37bf10837134 +Ref: library/typing typing Collection10837665 +Ref: 96210837665 +Ref: library/typing typing Container10837989 +Ref: 37c010837989 +Ref: library/typing typing ItemsView10838259 +Ref: 37c110838259 +Ref: library/typing typing KeysView10838550 +Ref: 37c210838550 +Ref: library/typing typing Mapping10838842 +Ref: 37aa10838842 +Ref: library/typing typing MappingView10839291 +Ref: 37c310839291 +Ref: library/typing typing MutableMapping10839575 +Ref: 37c410839575 +Ref: library/typing typing MutableSequence10839860 +Ref: 37c510839860 +Ref: library/typing typing MutableSet10840145 +Ref: 37c610840145 +Ref: library/typing typing Sequence10840420 +Ref: 37ac10840420 +Ref: library/typing typing ValuesView10840709 +Ref: 37c710840709 +Ref: Corresponding to collections in collections abc-Footnote-110841024 +Ref: Corresponding to collections in collections abc-Footnote-210841066 +Ref: Corresponding to collections in collections abc-Footnote-310841108 +Ref: Corresponding to collections in collections abc-Footnote-410841150 +Ref: Corresponding to collections in collections abc-Footnote-510841192 +Ref: Corresponding to collections in collections abc-Footnote-610841234 +Ref: Corresponding to collections in collections abc-Footnote-710841276 +Ref: Corresponding to collections in collections abc-Footnote-810841318 +Ref: Corresponding to collections in collections abc-Footnote-910841360 +Ref: Corresponding to collections in collections abc-Footnote-1010841402 +Ref: Corresponding to collections in collections abc-Footnote-1110841445 +Ref: Corresponding to collections in collections abc-Footnote-1210841488 +Ref: Corresponding to collections in collections abc-Footnote-1310841531 +Node: Corresponding to other types in collections abc10841574 +Ref: library/typing corresponding-to-other-types-in-collections-abc10841768 +Ref: 37c810841768 +Ref: library/typing typing Iterable10841893 +Ref: 37ad10841893 +Ref: library/typing typing Iterator10842160 +Ref: 37c910842160 +Ref: library/typing typing Generator10842428 +Ref: 37ca10842428 +Ref: library/typing typing Hashable10843721 +Ref: 37cb10843721 +Ref: library/typing typing Reversible10843805 +Ref: 37cc10843805 +Ref: library/typing typing Sized10844077 +Ref: 37cd10844077 +Ref: Corresponding to other types in collections abc-Footnote-110844191 +Ref: Corresponding to other types in collections abc-Footnote-210844233 +Ref: Corresponding to other types in collections abc-Footnote-310844275 +Ref: Corresponding to other types in collections abc-Footnote-410844317 +Node: Asynchronous programming10844359 +Ref: library/typing asynchronous-programming10844527 +Ref: 37ce10844527 +Ref: library/typing typing Coroutine10844598 +Ref: 135a10844598 +Ref: library/typing typing AsyncGenerator10845368 +Ref: 37cf10845368 +Ref: library/typing typing AsyncIterable10846794 +Ref: 37d010846794 +Ref: library/typing typing AsyncIterator10847102 +Ref: 37d110847102 +Ref: library/typing typing Awaitable10847416 +Ref: 37d210847416 +Ref: Asynchronous programming-Footnote-110847748 +Ref: Asynchronous programming-Footnote-210847790 +Ref: Asynchronous programming-Footnote-310847832 +Ref: Asynchronous programming-Footnote-410847874 +Ref: Asynchronous programming-Footnote-510847916 +Node: Context manager types10847958 +Ref: library/typing context-manager-types10848070 +Ref: 37d310848070 +Ref: library/typing typing ContextManager10848135 +Ref: 8ff10848135 +Ref: library/typing typing AsyncContextManager10848480 +Ref: 37d410848480 +Ref: Context manager types-Footnote-110848880 +Ref: Context manager types-Footnote-210848922 +Node: Protocols<3>10848964 +Ref: library/typing protocols10849094 +Ref: 37d510849094 +Ref: library/typing typing SupportsAbs10849203 +Ref: 37d610849203 +Ref: library/typing typing SupportsBytes10849329 +Ref: 1bb10849329 +Ref: library/typing typing SupportsComplex10849417 +Ref: 1ba10849417 +Ref: library/typing typing SupportsFloat10849509 +Ref: 37d710849509 +Ref: library/typing typing SupportsIndex10849597 +Ref: 69510849597 +Ref: library/typing typing SupportsInt10849711 +Ref: 69410849711 +Ref: library/typing typing SupportsRound10849795 +Ref: 37d810849795 +Node: Functions and decorators10849925 +Ref: library/typing functions-and-decorators10850055 +Ref: 37d910850055 +Ref: library/typing typing cast10850126 +Ref: 379f10850126 +Ref: library/typing typing assert_type10850427 +Ref: 27010850427 +Ref: library/typing typing assert_never10851440 +Ref: 26c10851440 +Ref: library/typing typing reveal_type10852842 +Ref: 26f10852842 +Ref: library/typing typing dataclass_transform10853928 +Ref: 19210853928 +Ref: library/typing typing overload10858311 +Ref: 37da10858311 +Ref: library/typing typing get_overloads10859710 +Ref: 27410859710 +Ref: library/typing typing clear_overloads10860378 +Ref: 27510860378 +Ref: library/typing typing final10860576 +Ref: 27310860576 +Ref: library/typing typing no_type_check10861693 +Ref: 27b10861693 +Ref: library/typing typing no_type_check_decorator10862066 +Ref: 37db10862066 +Ref: library/typing typing type_check_only10862316 +Ref: 37dc10862316 +Ref: Functions and decorators-Footnote-110863027 +Ref: Functions and decorators-Footnote-210863099 +Ref: Functions and decorators-Footnote-310863141 +Ref: Functions and decorators-Footnote-410863183 +Node: Introspection helpers10863225 +Ref: library/typing introspection-helpers10863351 +Ref: 37dd10863351 +Ref: library/typing typing get_type_hints10863416 +Ref: 27710863416 +Ref: library/typing typing get_args10865088 +Ref: 4a110865088 +Ref: library/typing typing get_origin10865124 +Ref: 69610865124 +Ref: library/typing typing is_typeddict10866051 +Ref: 44d10866051 +Ref: library/typing typing ForwardRef10866357 +Ref: 123710866357 +Ref: Introspection helpers-Footnote-110866997 +Ref: Introspection helpers-Footnote-210867039 +Ref: Introspection helpers-Footnote-310867081 +Node: Constant10867123 +Ref: library/typing constant10867216 +Ref: 37de10867216 +Ref: library/typing typing TYPE_CHECKING10867255 +Ref: 96310867255 +Ref: Constant-Footnote-110868298 +Node: Deprecation Timeline of Major Features10868340 +Ref: library/typing deprecation-timeline-of-major-features10868475 +Ref: 378910868475 +Ref: Deprecation Timeline of Major Features-Footnote-110869769 +Ref: Deprecation Timeline of Major Features-Footnote-210869834 +Ref: Deprecation Timeline of Major Features-Footnote-310869876 +Node: pydoc — Documentation generator and online help system10869931 +Ref: library/pydoc doc10870115 +Ref: 37df10870115 +Ref: library/pydoc module-pydoc10870115 +Ref: d610870115 +Ref: library/pydoc pydoc-documentation-generator-and-online-help-system10870115 +Ref: 37e010870115 +Ref: pydoc — Documentation generator and online help system-Footnote-110875009 +Node: Python Development Mode10875074 +Ref: library/devmode doc10875263 +Ref: 37e210875263 +Ref: library/devmode devmode10875263 +Ref: 50610875263 +Ref: library/devmode python-development-mode10875263 +Ref: 37e310875263 +Node: Effects of the Python Development Mode10875777 +Ref: library/devmode effects-of-the-python-development-mode10875933 +Ref: 37e410875933 +Node: ResourceWarning Example10879579 +Ref: library/devmode resourcewarning-example10879745 +Ref: 37e510879745 +Node: Bad file descriptor error example10881657 +Ref: library/devmode bad-file-descriptor-error-example10881829 +Ref: 37e610881829 +Ref: Bad file descriptor error example-Footnote-110883355 +Node: doctest — Test interactive Python examples10883420 +Ref: library/doctest doc10883604 +Ref: 37e710883604 +Ref: library/doctest doctest-test-interactive-python-examples10883604 +Ref: 37e810883604 +Ref: library/doctest module-doctest10883604 +Ref: 6310883604 +Ref: doctest — Test interactive Python examples-Footnote-110887720 +Node: Simple Usage Checking Examples in Docstrings10887787 +Ref: library/doctest doctest-simple-testmod10887966 +Ref: 37e910887966 +Ref: library/doctest simple-usage-checking-examples-in-docstrings10887966 +Ref: 37ea10887966 +Node: Simple Usage Checking Examples in a Text File10889747 +Ref: library/doctest doctest-simple-testfile10889947 +Ref: 37ec10889947 +Ref: library/doctest simple-usage-checking-examples-in-a-text-file10889947 +Ref: 37ed10889947 +Node: How It Works10892297 +Ref: library/doctest doctest-how-it-works10892462 +Ref: 37ef10892462 +Ref: library/doctest how-it-works10892462 +Ref: 37f010892462 +Node: Which Docstrings Are Examined?10893117 +Ref: library/doctest doctest-which-docstrings10893243 +Ref: 37f110893243 +Ref: library/doctest which-docstrings-are-examined10893243 +Ref: 37f210893243 +Node: How are Docstring Examples Recognized?10893967 +Ref: library/doctest doctest-finding-examples10894133 +Ref: 37f310894133 +Ref: library/doctest how-are-docstring-examples-recognized10894133 +Ref: 37f410894133 +Node: What’s the Execution Context?10897221 +Ref: library/doctest doctest-execution-context10897379 +Ref: 37f810897379 +Ref: library/doctest what-s-the-execution-context10897379 +Ref: 37f910897379 +Node: What About Exceptions?10898097 +Ref: library/doctest doctest-exceptions10898229 +Ref: 37fa10898229 +Ref: library/doctest what-about-exceptions10898229 +Ref: 37fb10898229 +Ref: library/doctest option-flags-and-directives10902782 +Ref: 37fd10902782 +Ref: What About Exceptions?-Footnote-110902819 +Node: Option Flags10903019 +Ref: library/doctest doctest-options10903130 +Ref: bcd10903130 +Ref: library/doctest option-flags10903130 +Ref: 37fe10903130 +Ref: library/doctest doctest DONT_ACCEPT_TRUE_FOR_110903748 +Ref: 37ff10903748 +Ref: library/doctest doctest DONT_ACCEPT_BLANKLINE10904376 +Ref: 380010904376 +Ref: library/doctest doctest NORMALIZE_WHITESPACE10904829 +Ref: 37f510904829 +Ref: library/doctest doctest ELLIPSIS10905319 +Ref: 10cf10905319 +Ref: library/doctest doctest IGNORE_EXCEPTION_DETAIL10905755 +Ref: 37fc10905755 +Ref: library/doctest doctest SKIP10907219 +Ref: 380110907219 +Ref: library/doctest doctest COMPARISON_FLAGS10907733 +Ref: 380210907733 +Ref: library/doctest doctest REPORT_UDIFF10907905 +Ref: 10d010907905 +Ref: library/doctest doctest REPORT_CDIFF10908061 +Ref: 10d110908061 +Ref: library/doctest doctest REPORT_NDIFF10908221 +Ref: 10d210908221 +Ref: library/doctest doctest REPORT_ONLY_FIRST_FAILURE10908685 +Ref: 380310908685 +Ref: library/doctest doctest FAIL_FAST10909264 +Ref: bce10909264 +Ref: library/doctest doctest REPORTING_FLAGS10909731 +Ref: 380410909731 +Ref: library/doctest doctest register_optionflag10909988 +Ref: 380510909988 +Node: Directives10910478 +Ref: library/doctest directives10910578 +Ref: 380810910578 +Ref: library/doctest doctest-directives10910578 +Ref: 37f610910578 +Ref: library/doctest grammar-token-doctest-directive10910803 +Ref: 380910910803 +Ref: library/doctest grammar-token-directive10910803 +Ref: 380a10910803 +Ref: library/doctest grammar-token-doctest-directive_options10910867 +Ref: 380b10910867 +Ref: library/doctest grammar-token-directive-options10910867 +Ref: 380c10910867 +Ref: library/doctest grammar-token-doctest-directive_option10910940 +Ref: 380d10910940 +Ref: library/doctest grammar-token-directive-option10910940 +Ref: 380e10910940 +Ref: library/doctest grammar-token-doctest-on_or_off10911003 +Ref: 380f10911003 +Ref: library/doctest grammar-token-on-or-off10911003 +Ref: 381010911003 +Ref: library/doctest grammar-token-doctest-directive_option_name10911045 +Ref: 381110911045 +Ref: library/doctest grammar-token-directive-option-name10911045 +Ref: 381210911045 +Node: Warnings<2>10913148 +Ref: library/doctest doctest-warnings10913227 +Ref: 381310913227 +Ref: library/doctest warnings10913227 +Ref: 381410913227 +Node: Basic API10914967 +Ref: library/doctest basic-api10915099 +Ref: 381510915099 +Ref: library/doctest doctest-basic-api10915099 +Ref: 37eb10915099 +Ref: library/doctest doctest testfile10915483 +Ref: 37ee10915483 +Ref: library/doctest doctest testmod10919416 +Ref: 10ce10919416 +Ref: library/doctest doctest run_docstring_examples10921163 +Ref: 381710921163 +Node: Unittest API10922141 +Ref: library/doctest doctest-unittest-api10922273 +Ref: 381810922273 +Ref: library/doctest unittest-api10922273 +Ref: 381910922273 +Ref: library/doctest doctest DocFileSuite10923043 +Ref: 381a10923043 +Ref: library/doctest doctest DocTestSuite10926767 +Ref: a7410926767 +Ref: library/doctest doctest set_unittest_reportflags10929918 +Ref: 381c10929918 +Node: Advanced API10931114 +Ref: library/doctest advanced-api10931246 +Ref: 381d10931246 +Ref: library/doctest doctest-advanced-api10931246 +Ref: 381e10931246 +Node: DocTest Objects10933387 +Ref: library/doctest doctest-doctest10933475 +Ref: 382010933475 +Ref: library/doctest doctest-objects10933475 +Ref: 382110933475 +Ref: library/doctest doctest DocTest10933528 +Ref: 381b10933528 +Ref: library/doctest doctest DocTest examples10933944 +Ref: 382210933944 +Ref: library/doctest doctest DocTest globs10934119 +Ref: 382310934119 +Ref: library/doctest doctest DocTest name10934454 +Ref: 382410934454 +Ref: library/doctest doctest DocTest filename10934647 +Ref: 382510934647 +Ref: library/doctest doctest DocTest lineno10934884 +Ref: 11d210934884 +Ref: library/doctest doctest DocTest docstring10935162 +Ref: 382610935162 +Node: Example Objects10935361 +Ref: library/doctest doctest-example10935479 +Ref: 382710935479 +Ref: library/doctest example-objects10935479 +Ref: 382810935479 +Ref: library/doctest doctest Example10935532 +Ref: 381f10935532 +Ref: library/doctest doctest Example source10935971 +Ref: 382910935971 +Ref: library/doctest doctest Example want10936215 +Ref: 382a10936215 +Ref: library/doctest doctest Example exc_msg10936566 +Ref: 382b10936566 +Ref: library/doctest doctest Example lineno10937050 +Ref: 382c10937050 +Ref: library/doctest doctest Example indent10937281 +Ref: 382d10937281 +Ref: library/doctest doctest Example options10937474 +Ref: 382e10937474 +Node: DocTestFinder objects10937870 +Ref: library/doctest doctest-doctestfinder10937994 +Ref: 382f10937994 +Ref: library/doctest doctestfinder-objects10937994 +Ref: 383010937994 +Ref: library/doctest doctest DocTestFinder10938059 +Ref: 381610938059 +Ref: library/doctest doctest DocTestFinder find10939198 +Ref: 383110939198 +Node: DocTestParser objects10941317 +Ref: library/doctest doctest-doctestparser10941447 +Ref: 383210941447 +Ref: library/doctest doctestparser-objects10941447 +Ref: 383310941447 +Ref: library/doctest doctest DocTestParser10941512 +Ref: 37f710941512 +Ref: library/doctest doctest DocTestParser get_doctest10941746 +Ref: 383410941746 +Ref: library/doctest doctest DocTestParser get_examples10942141 +Ref: 383510942141 +Ref: library/doctest doctest DocTestParser parse10942479 +Ref: 383610942479 +Node: DocTestRunner objects10942875 +Ref: library/doctest doctest-doctestrunner10943005 +Ref: 383710943005 +Ref: library/doctest doctestrunner-objects10943005 +Ref: 383810943005 +Ref: library/doctest doctest DocTestRunner10943070 +Ref: 380710943070 +Ref: library/doctest doctest DocTestRunner report_start10945178 +Ref: 383910945178 +Ref: library/doctest doctest DocTestRunner report_success10945677 +Ref: 383a10945677 +Ref: library/doctest doctest DocTestRunner report_failure10946210 +Ref: 383c10946210 +Ref: library/doctest doctest DocTestRunner report_unexpected_exception10946733 +Ref: 383b10946733 +Ref: library/doctest doctest DocTestRunner run10947408 +Ref: 383d10947408 +Ref: library/doctest doctest DocTestRunner summarize10948424 +Ref: 383e10948424 +Node: OutputChecker objects10948849 +Ref: library/doctest doctest-outputchecker10948949 +Ref: 383f10948949 +Ref: library/doctest outputchecker-objects10948949 +Ref: 384010948949 +Ref: library/doctest doctest OutputChecker10949014 +Ref: 380610949014 +Ref: library/doctest doctest OutputChecker check_output10949510 +Ref: 384110949510 +Ref: library/doctest doctest OutputChecker output_difference10949997 +Ref: 384210949997 +Node: Debugging10950312 +Ref: library/doctest debugging10950439 +Ref: 384310950439 +Ref: library/doctest doctest-debugging10950439 +Ref: 384410950439 +Ref: library/doctest doctest script_from_examples10952538 +Ref: 384710952538 +Ref: library/doctest doctest testsource10953525 +Ref: 384810953525 +Ref: library/doctest doctest debug10954322 +Ref: 384610954322 +Ref: library/doctest doctest debug_src10955413 +Ref: 384a10955413 +Ref: library/doctest doctest DebugRunner10956287 +Ref: 384510956287 +Ref: library/doctest doctest DocTestFailure10957064 +Ref: 384c10957064 +Ref: library/doctest doctest DocTestFailure test10957427 +Ref: 384d10957427 +Ref: library/doctest doctest DocTestFailure example10957550 +Ref: 384e10957550 +Ref: library/doctest doctest DocTestFailure got10957633 +Ref: 384f10957633 +Ref: library/doctest doctest UnexpectedException10957705 +Ref: 384b10957705 +Ref: library/doctest doctest UnexpectedException test10958058 +Ref: 385010958058 +Ref: library/doctest doctest UnexpectedException example10958186 +Ref: 385110958186 +Ref: library/doctest doctest UnexpectedException exc_info10958274 +Ref: 385210958274 +Node: Soapbox10958435 +Ref: library/doctest doctest-soapbox10958541 +Ref: 385310958541 +Ref: library/doctest soapbox10958541 +Ref: 385410958541 +Node: unittest — Unit testing framework10962385 +Ref: library/unittest doc10962573 +Ref: 385510962573 +Ref: library/unittest module-unittest10962573 +Ref: 12510962573 +Ref: library/unittest unittest-unit-testing-framework10962573 +Ref: 385610962573 +Ref: unittest — Unit testing framework-Footnote-110965733 +Ref: unittest — Unit testing framework-Footnote-210965811 +Ref: unittest — Unit testing framework-Footnote-310965904 +Ref: unittest — Unit testing framework-Footnote-410965937 +Ref: unittest — Unit testing framework-Footnote-510966001 +Ref: unittest — Unit testing framework-Footnote-610966059 +Ref: unittest — Unit testing framework-Footnote-710966089 +Ref: unittest — Unit testing framework-Footnote-810966117 +Ref: unittest — Unit testing framework-Footnote-910966161 +Node: Basic example10966195 +Ref: library/unittest basic-example10966314 +Ref: 385810966314 +Ref: library/unittest unittest-minimal-example10966314 +Ref: 385910966314 +Node: Command-Line Interface<3>10969294 +Ref: library/unittest command-line-interface10969436 +Ref: 385b10969436 +Ref: library/unittest unittest-command-line-interface10969436 +Ref: 385c10969436 +Node: Command-line options<3>10970832 +Ref: library/unittest command-line-options10970917 +Ref: 385e10970917 +Ref: library/unittest cmdoption-unittest-b10971031 +Ref: fcd10971031 +Ref: library/unittest cmdoption-unittest-buffer10971031 +Ref: 385f10971031 +Ref: library/unittest cmdoption-unittest-c10971298 +Ref: fce10971298 +Ref: library/unittest cmdoption-unittest-catch10971298 +Ref: 386010971298 +Ref: library/unittest cmdoption-unittest-f10971638 +Ref: fd010971638 +Ref: library/unittest cmdoption-unittest-failfast10971638 +Ref: 386210971638 +Ref: library/unittest cmdoption-unittest-k10971729 +Ref: 386310971729 +Ref: library/unittest cmdoption-unittest-locals10972449 +Ref: 386410972449 +Node: Test Discovery10972842 +Ref: library/unittest test-discovery10972991 +Ref: 386510972991 +Ref: library/unittest unittest-test-discovery10972991 +Ref: 385d10972991 +Ref: library/unittest cmdoption-unittest-discover-v10973844 +Ref: 386610973844 +Ref: library/unittest cmdoption-unittest-discover-verbose10973844 +Ref: 386710973844 +Ref: library/unittest cmdoption-unittest-discover-s10973900 +Ref: 386810973900 +Ref: library/unittest cmdoption-unittest-discover-start-directory10973900 +Ref: 386910973900 +Ref: library/unittest cmdoption-unittest-discover-p10974006 +Ref: 386a10974006 +Ref: library/unittest cmdoption-unittest-discover-pattern10974006 +Ref: 386b10974006 +Ref: library/unittest cmdoption-unittest-discover-t10974108 +Ref: 386c10974108 +Ref: library/unittest cmdoption-unittest-discover-top-level-directory10974108 +Ref: 386d10974108 +Node: Organizing test code10976511 +Ref: library/unittest organizing-test-code10976657 +Ref: 386f10976657 +Ref: library/unittest organizing-tests10976657 +Ref: 385a10976657 +Node: Re-using old test code10981411 +Ref: library/unittest legacy-unit-tests10981579 +Ref: 387110981579 +Ref: library/unittest re-using-old-test-code10981579 +Ref: 387210981579 +Node: Skipping tests and expected failures10983119 +Ref: library/unittest skipping-tests-and-expected-failures10983312 +Ref: 387310983312 +Ref: library/unittest unittest-skipping10983312 +Ref: 387410983312 +Ref: library/unittest unittest skip10986465 +Ref: 140210986465 +Ref: library/unittest unittest skipIf10986613 +Ref: 387710986613 +Ref: library/unittest unittest skipUnless10986719 +Ref: 387810986719 +Ref: library/unittest unittest expectedFailure10986833 +Ref: 387610986833 +Ref: library/unittest unittest SkipTest10987142 +Ref: c8610987142 +Node: Distinguishing test iterations using subtests10987630 +Ref: library/unittest distinguishing-test-iterations-using-subtests10987822 +Ref: 387910987822 +Ref: library/unittest subtests10987822 +Ref: c8410987822 +Node: Classes and functions10990423 +Ref: library/unittest classes-and-functions10990604 +Ref: 387a10990604 +Ref: library/unittest unittest-contents10990604 +Ref: 387b10990604 +Node: Test cases10990806 +Ref: library/unittest test-cases10990897 +Ref: 387c10990897 +Ref: library/unittest testcase-objects10990897 +Ref: 387d10990897 +Ref: library/unittest unittest TestCase10990940 +Ref: 28210990940 +Ref: library/unittest unittest TestCase setUp10992262 +Ref: fd510992262 +Ref: library/unittest unittest TestCase tearDown10992639 +Ref: fd610992639 +Ref: library/unittest unittest TestCase setUpClass10993412 +Ref: 69e10993412 +Ref: library/unittest unittest TestCase tearDownClass10993851 +Ref: fd310993851 +Ref: library/unittest unittest TestCase run10994299 +Ref: e1a10994299 +Ref: library/unittest unittest TestCase skipTest10994926 +Ref: 387510994926 +Ref: library/unittest unittest TestCase subTest10995182 +Ref: c8310995182 +Ref: library/unittest unittest TestCase debug10995737 +Ref: 129110995737 +Ref: library/unittest assert-methods10995972 +Ref: 385710995972 +Ref: library/unittest unittest TestCase assertEqual10999819 +Ref: ee210999819 +Ref: library/unittest unittest TestCase assertNotEqual11000689 +Ref: ee311000689 +Ref: library/unittest unittest TestCase assertTrue11000868 +Ref: ee111000868 +Ref: library/unittest unittest TestCase assertFalse11000913 +Ref: fd111000913 +Ref: library/unittest unittest TestCase assertIs11001414 +Ref: fd911001414 +Ref: library/unittest unittest TestCase assertIsNot11001466 +Ref: fda11001466 +Ref: library/unittest unittest TestCase assertIsNone11001639 +Ref: fd711001639 +Ref: library/unittest unittest TestCase assertIsNotNone11001686 +Ref: fd811001686 +Ref: library/unittest unittest TestCase assertIn11001823 +Ref: fe211001823 +Ref: library/unittest unittest TestCase assertNotIn11001879 +Ref: fe311001879 +Ref: library/unittest unittest TestCase assertIsInstance11002031 +Ref: fdb11002031 +Ref: library/unittest unittest TestCase assertNotIsInstance11002086 +Ref: fdc11002086 +Ref: library/unittest unittest TestCase assertRaises11005270 +Ref: e1611005270 +Ref: library/unittest unittest TestCase assertRaisesRegex11006997 +Ref: e1711006997 +Ref: library/unittest unittest TestCase assertWarns11007994 +Ref: e1811007994 +Ref: library/unittest unittest TestCase assertWarnsRegex11009705 +Ref: e1911009705 +Ref: library/unittest unittest TestCase assertLogs11010640 +Ref: 45011010640 +Ref: library/unittest unittest TestCase records11011693 +Ref: 388111011693 +Ref: library/unittest unittest TestCase output11011836 +Ref: 388211011836 +Ref: library/unittest unittest TestCase assertNoLogs11012383 +Ref: 44f11012383 +Ref: library/unittest unittest TestCase assertAlmostEqual11015932 +Ref: ee411015932 +Ref: library/unittest unittest TestCase assertNotAlmostEqual11016030 +Ref: ee511016030 +Ref: library/unittest unittest TestCase assertGreater11017101 +Ref: fdd11017101 +Ref: library/unittest unittest TestCase assertGreaterEqual11017158 +Ref: fde11017158 +Ref: library/unittest unittest TestCase assertLess11017220 +Ref: fdf11017220 +Ref: library/unittest unittest TestCase assertLessEqual11017274 +Ref: fe011017274 +Ref: library/unittest unittest TestCase assertRegex11017639 +Ref: ede11017639 +Ref: library/unittest unittest TestCase assertNotRegex11017692 +Ref: 388311017692 +Ref: library/unittest unittest TestCase assertCountEqual11018565 +Ref: edc11018565 +Ref: library/unittest type-specific-methods11019226 +Ref: 388011019226 +Ref: library/unittest unittest TestCase addTypeEqualityFunc11019544 +Ref: feb11019544 +Ref: library/unittest unittest TestCase assertMultiLineEqual11022288 +Ref: fe111022288 +Ref: library/unittest unittest TestCase assertSequenceEqual11022703 +Ref: fe711022703 +Ref: library/unittest unittest TestCase assertListEqual11023328 +Ref: fe511023328 +Ref: library/unittest unittest TestCase assertTupleEqual11023387 +Ref: fe611023387 +Ref: library/unittest unittest TestCase assertSetEqual11023835 +Ref: fe411023835 +Ref: library/unittest unittest TestCase assertDictEqual11024287 +Ref: fe811024287 +Ref: library/unittest other-methods-and-attrs11024645 +Ref: 388511024645 +Ref: library/unittest unittest TestCase fail11024736 +Ref: 388611024736 +Ref: library/unittest unittest TestCase failureException11024879 +Ref: 388411024879 +Ref: library/unittest unittest TestCase longMessage11025294 +Ref: fd211025294 +Ref: library/unittest unittest TestCase maxDiff11026032 +Ref: edd11026032 +Ref: library/unittest unittest TestCase countTestCases11026713 +Ref: 388711026713 +Ref: library/unittest unittest TestCase defaultTestResult11026895 +Ref: 387f11026895 +Ref: library/unittest unittest TestCase id11027325 +Ref: 388811027325 +Ref: library/unittest unittest TestCase shortDescription11027520 +Ref: 388911027520 +Ref: library/unittest unittest TestCase addCleanup11028140 +Ref: 6d311028140 +Ref: library/unittest unittest TestCase enterContext11028743 +Ref: 28011028743 +Ref: library/unittest unittest TestCase doCleanups11029070 +Ref: fd411029070 +Ref: library/unittest unittest TestCase addClassCleanup11029708 +Ref: 69d11029708 +Ref: library/unittest unittest TestCase enterClassContext11030380 +Ref: 28111030380 +Ref: library/unittest unittest TestCase doClassCleanups11030729 +Ref: 388a11030729 +Ref: library/unittest unittest IsolatedAsyncioTestCase11031431 +Ref: 28411031431 +Ref: library/unittest unittest IsolatedAsyncioTestCase asyncSetUp11031642 +Ref: 388b11031642 +Ref: library/unittest unittest IsolatedAsyncioTestCase asyncTearDown11032081 +Ref: 388c11032081 +Ref: library/unittest unittest IsolatedAsyncioTestCase addAsyncCleanup11032926 +Ref: 388d11032926 +Ref: library/unittest unittest IsolatedAsyncioTestCase enterAsyncContext11033084 +Ref: 28311033084 +Ref: library/unittest unittest IsolatedAsyncioTestCase run11033447 +Ref: 388e11033447 +Ref: library/unittest unittest FunctionTestCase11035184 +Ref: 387011035184 +Node: Deprecated aliases11035695 +Ref: library/unittest deprecated-aliases11035760 +Ref: ee611035760 +Ref: library/unittest id111035760 +Ref: 388f11035760 +Node: Grouping tests11038889 +Ref: library/unittest grouping-tests11039014 +Ref: 389011039014 +Ref: library/unittest testsuite-objects11039014 +Ref: 389111039014 +Ref: library/unittest unittest TestSuite11039065 +Ref: a7511039065 +Ref: library/unittest unittest TestSuite addTest11040012 +Ref: 389211040012 +Ref: library/unittest unittest TestSuite addTests11040132 +Ref: 389311040132 +Ref: library/unittest unittest TestSuite run11040508 +Ref: 389411040508 +Ref: library/unittest unittest TestSuite debug11040810 +Ref: 389511040810 +Ref: library/unittest unittest TestSuite countTestCases11041083 +Ref: 389611041083 +Ref: library/unittest unittest TestSuite __iter__11041247 +Ref: cd511041247 +Node: Loading and running tests11042703 +Ref: library/unittest loading-and-running-tests11042809 +Ref: 389711042809 +Ref: library/unittest unittest TestLoader11042882 +Ref: 2d711042882 +Ref: library/unittest unittest TestLoader errors11043376 +Ref: b1a11043376 +Ref: library/unittest unittest TestLoader loadTestsFromTestCase11043843 +Ref: 2d911043843 +Ref: library/unittest unittest TestLoader loadTestsFromModule11044392 +Ref: 2d811044392 +Ref: library/unittest unittest TestLoader loadTestsFromName11045897 +Ref: fe911045897 +Ref: library/unittest unittest TestLoader loadTestsFromNames11047697 +Ref: 389911047697 +Ref: library/unittest unittest TestLoader getTestCaseNames11047982 +Ref: 2da11047982 +Ref: library/unittest unittest TestLoader discover11048185 +Ref: c8711048185 +Ref: library/unittest unittest TestLoader testMethodPrefix11051239 +Ref: 389a11051239 +Ref: library/unittest unittest TestLoader sortTestMethodsUsing11051527 +Ref: 389b11051527 +Ref: library/unittest unittest TestLoader suiteClass11051740 +Ref: fea11051740 +Ref: library/unittest unittest TestLoader testNamePatterns11052037 +Ref: 389c11052037 +Ref: library/unittest unittest TestResult11052751 +Ref: e1b11052751 +Ref: library/unittest unittest TestResult errors11053613 +Ref: 389d11053613 +Ref: library/unittest unittest TestResult failures11053843 +Ref: 389e11053843 +Ref: library/unittest unittest TestResult skipped11054132 +Ref: 389f11054132 +Ref: library/unittest unittest TestResult expectedFailures11054328 +Ref: 38a011054328 +Ref: library/unittest unittest TestResult unexpectedSuccesses11054570 +Ref: 38a111054570 +Ref: library/unittest unittest TestResult shouldStop11054735 +Ref: 38a211054735 +Ref: library/unittest unittest TestResult testsRun11054869 +Ref: 38a411054869 +Ref: library/unittest unittest TestResult buffer11054948 +Ref: 38a511054948 +Ref: library/unittest unittest TestResult failfast11055397 +Ref: 38a811055397 +Ref: library/unittest unittest TestResult tb_locals11055582 +Ref: 38a911055582 +Ref: library/unittest unittest TestResult wasSuccessful11055730 +Ref: 38aa11055730 +Ref: library/unittest unittest TestResult stop11056067 +Ref: 38a311056067 +Ref: library/unittest unittest TestResult startTest11057026 +Ref: 38a611057026 +Ref: library/unittest unittest TestResult stopTest11057125 +Ref: 38a711057125 +Ref: library/unittest unittest TestResult startTestRun11057260 +Ref: fed11057260 +Ref: library/unittest unittest TestResult stopTestRun11057379 +Ref: fee11057379 +Ref: library/unittest unittest TestResult addError11057496 +Ref: 129411057496 +Ref: library/unittest unittest TestResult addFailure11057963 +Ref: 129311057963 +Ref: library/unittest unittest TestResult addSuccess11058421 +Ref: 38ab11058421 +Ref: library/unittest unittest TestResult addSkip11058563 +Ref: 129511058563 +Ref: library/unittest unittest TestResult addExpectedFailure11058859 +Ref: 38ac11058859 +Ref: library/unittest unittest TestResult addUnexpectedSuccess11059285 +Ref: 38ad11059285 +Ref: library/unittest unittest TestResult addSubTest11059591 +Ref: 129611059591 +Ref: library/unittest unittest TextTestResult11060263 +Ref: 125a11060263 +Ref: library/unittest unittest defaultTestLoader11060585 +Ref: 389811060585 +Ref: library/unittest unittest TextTestRunner11060840 +Ref: 126c11060840 +Ref: library/unittest unittest TextTestRunner _makeResult11062442 +Ref: 38af11062442 +Ref: library/unittest unittest TextTestRunner run11063094 +Ref: 38b011063094 +Ref: library/unittest unittest main11063455 +Ref: c8511063455 +Node: load_tests Protocol11066324 +Ref: library/unittest load-tests-protocol11066405 +Ref: 386e11066405 +Node: Class and Module Fixtures11069077 +Ref: library/unittest class-and-module-fixtures11069228 +Ref: 387e11069228 +Node: setUpClass and tearDownClass11071116 +Ref: library/unittest setupclass-and-teardownclass11071245 +Ref: 38b111071245 +Node: setUpModule and tearDownModule11072159 +Ref: library/unittest setupmodule-and-teardownmodule11072288 +Ref: 38b211072288 +Ref: library/unittest unittest addModuleCleanup11072901 +Ref: 69c11072901 +Ref: library/unittest unittest enterModuleContext11073479 +Ref: 28511073479 +Ref: library/unittest unittest doModuleCleanups11073809 +Ref: 122f11073809 +Node: Signal Handling11074427 +Ref: library/unittest signal-handling11074548 +Ref: 386111074548 +Ref: library/unittest unittest installHandler11075780 +Ref: 38b311075780 +Ref: library/unittest unittest registerResult11076024 +Ref: 38b411076024 +Ref: library/unittest unittest removeResult11076518 +Ref: 38b511076518 +Ref: library/unittest unittest removeHandler11076740 +Ref: fcf11076740 +Node: unittest mock — mock object library11077130 +Ref: library/unittest mock doc11077307 +Ref: 38b611077307 +Ref: library/unittest mock module-unittest mock11077307 +Ref: 12611077307 +Ref: library/unittest mock unittest-mock-mock-object-library11077307 +Ref: 38b711077307 +Ref: unittest mock — mock object library-Footnote-111078843 +Ref: unittest mock — mock object library-Footnote-211078916 +Node: Quick Guide11078954 +Ref: library/unittest mock quick-guide11079062 +Ref: 38b811079062 +Node: The Mock Class11084437 +Ref: library/unittest mock the-mock-class11084566 +Ref: 38bc11084566 +Ref: library/unittest mock unittest mock Mock11085594 +Ref: 69b11085594 +Ref: library/unittest mock unittest mock Mock assert_called11089076 +Ref: 96711089076 +Ref: library/unittest mock unittest mock Mock assert_called_once11089366 +Ref: 96811089366 +Ref: library/unittest mock unittest mock Mock assert_called_with11089962 +Ref: 145211089962 +Ref: library/unittest mock unittest mock Mock assert_called_once_with11090346 +Ref: 38c311090346 +Ref: library/unittest mock unittest mock Mock assert_any_call11090950 +Ref: 38c411090950 +Ref: library/unittest mock unittest mock Mock assert_has_calls11091616 +Ref: 38c511091616 +Ref: library/unittest mock unittest mock Mock assert_not_called11092461 +Ref: b1c11092461 +Ref: library/unittest mock unittest mock Mock reset_mock11092896 +Ref: 96911092896 +Ref: library/unittest mock unittest mock Mock mock_add_spec11094032 +Ref: 38c711094032 +Ref: library/unittest mock unittest mock Mock attach_mock11094357 +Ref: 38c811094357 +Ref: library/unittest mock unittest mock Mock configure_mock11094650 +Ref: 38c211094650 +Ref: library/unittest mock unittest mock Mock __dir__11095884 +Ref: 38ca11095884 +Ref: library/unittest mock unittest mock Mock _get_child_mock11096217 +Ref: 38cc11096217 +Ref: library/unittest mock unittest mock Mock called11096617 +Ref: 38cd11096617 +Ref: library/unittest mock unittest mock Mock call_count11096917 +Ref: 38ce11096917 +Ref: library/unittest mock unittest mock Mock return_value11097248 +Ref: 38c111097248 +Ref: library/unittest mock unittest mock Mock side_effect11098054 +Ref: 38bf11098054 +Ref: library/unittest mock unittest mock Mock call_args11100524 +Ref: 139911100524 +Ref: library/unittest mock unittest mock Mock call_args_list11102351 +Ref: 38cf11102351 +Ref: library/unittest mock unittest mock Mock method_calls11103394 +Ref: 38c911103394 +Ref: library/unittest mock unittest mock Mock mock_calls11104132 +Ref: 38c611104132 +Ref: library/unittest mock unittest mock Mock __class__11105670 +Ref: 38d111105670 +Ref: library/unittest mock unittest mock NonCallableMock11106443 +Ref: 38bd11106443 +Ref: library/unittest mock unittest mock PropertyMock11108971 +Ref: 38d211108971 +Ref: library/unittest mock unittest mock AsyncMock11110331 +Ref: 69a11110331 +Ref: library/unittest mock unittest mock AsyncMock assert_awaited11113192 +Ref: 38d311113192 +Ref: library/unittest mock unittest mock AsyncMock assert_awaited_once11113927 +Ref: 38d411113927 +Ref: library/unittest mock unittest mock AsyncMock assert_awaited_with11114492 +Ref: 38d511114492 +Ref: library/unittest mock unittest mock AsyncMock assert_awaited_once_with11115161 +Ref: 38d611115161 +Ref: library/unittest mock unittest mock AsyncMock assert_any_await11115886 +Ref: 38d711115886 +Ref: library/unittest mock unittest mock AsyncMock assert_has_awaits11116529 +Ref: 38d811116529 +Ref: library/unittest mock unittest mock AsyncMock assert_not_awaited11117624 +Ref: 38d911117624 +Ref: library/unittest mock unittest mock AsyncMock reset_mock11117799 +Ref: 38da11117799 +Ref: library/unittest mock unittest mock AsyncMock await_count11118030 +Ref: 38db11118030 +Ref: library/unittest mock unittest mock AsyncMock await_args11118476 +Ref: 38dc11118476 +Ref: library/unittest mock unittest mock AsyncMock await_args_list11119095 +Ref: 139811119095 +Ref: The Mock Class-Footnote-111119961 +Node: Calling11120383 +Ref: library/unittest mock calling11120469 +Ref: 38dd11120469 +Node: Deleting Attributes11123711 +Ref: library/unittest mock deleting-attributes11123839 +Ref: 38de11123839 +Ref: library/unittest mock id211123839 +Ref: 38df11123839 +Node: Mock names and the name attribute11124616 +Ref: library/unittest mock mock-names-and-the-name-attribute11124766 +Ref: 38e011124766 +Node: Attaching Mocks as Attributes11125356 +Ref: library/unittest mock attaching-mocks-as-attributes11125478 +Ref: 38e111125478 +Node: The patchers11127342 +Ref: library/unittest mock the-patchers11127494 +Ref: 38e211127494 +Node: patch11128109 +Ref: library/unittest mock patch11128184 +Ref: 38e311128184 +Ref: library/unittest mock unittest mock patch11128331 +Ref: b1e11128331 +Node: patch object11137261 +Ref: library/unittest mock patch-object11137355 +Ref: 38e511137355 +Ref: library/unittest mock unittest mock patch object11137400 +Ref: 13d711137400 +Node: patch dict11138879 +Ref: library/unittest mock patch-dict11138982 +Ref: 38e611138982 +Ref: library/unittest mock unittest mock patch dict11139025 +Ref: 142311139025 +Node: patch multiple11143118 +Ref: library/unittest mock patch-multiple11143237 +Ref: 38e811143237 +Ref: library/unittest mock unittest mock patch multiple11143288 +Ref: 38e911143288 +Node: patch methods start and stop11145996 +Ref: library/unittest mock patch-methods-start-and-stop11146119 +Ref: 38ea11146119 +Ref: library/unittest mock start-and-stop11146119 +Ref: 38eb11146119 +Ref: library/unittest mock unittest mock patch stopall11148856 +Ref: 38ec11148856 +Node: patch builtins11148965 +Ref: library/unittest mock id411149085 +Ref: 38ed11149085 +Ref: library/unittest mock patch-builtins11149085 +Ref: 38ee11149085 +Node: TEST_PREFIX11149406 +Ref: library/unittest mock id511149522 +Ref: 38ef11149522 +Ref: library/unittest mock test-prefix11149522 +Ref: 38e711149522 +Node: Nesting Patch Decorators11150405 +Ref: library/unittest mock nesting-patch-decorators11150521 +Ref: 38f011150521 +Node: Where to patch11151438 +Ref: library/unittest mock id611151581 +Ref: 38e411151581 +Ref: library/unittest mock where-to-patch11151581 +Ref: 38b911151581 +Node: Patching Descriptors and Proxy Objects11153347 +Ref: library/unittest mock patching-descriptors-and-proxy-objects11153457 +Ref: 38f111153457 +Ref: Patching Descriptors and Proxy Objects-Footnote-111153898 +Node: MagicMock and magic method support11154023 +Ref: library/unittest mock magicmock-and-magic-method-support11154168 +Ref: 38f211154168 +Node: Mocking Magic Methods11154310 +Ref: library/unittest mock magic-methods11154421 +Ref: 38ba11154421 +Ref: library/unittest mock mocking-magic-methods11154421 +Ref: 38f311154421 +Ref: Mocking Magic Methods-Footnote-111158299 +Ref: Mocking Magic Methods-Footnote-211158538 +Node: Magic Mock11158659 +Ref: library/unittest mock magic-mock11158770 +Ref: 38f411158770 +Ref: library/unittest mock unittest mock MagicMock11158914 +Ref: b1d11158914 +Ref: library/unittest mock unittest mock NonCallableMagicMock11159381 +Ref: 38be11159381 +Node: Helpers11162716 +Ref: library/unittest mock helpers11162840 +Ref: 38f511162840 +Node: sentinel11163013 +Ref: library/unittest mock sentinel11163081 +Ref: 38f611163081 +Ref: library/unittest mock unittest mock sentinel11163120 +Ref: 80211163120 +Node: DEFAULT11164281 +Ref: library/unittest mock default11164362 +Ref: 38f711164362 +Ref: library/unittest mock unittest mock DEFAULT11164399 +Ref: 38c011164399 +Node: call11164652 +Ref: library/unittest mock call11164740 +Ref: 38f811164740 +Ref: library/unittest mock unittest mock call11164771 +Ref: 13ec11164771 +Ref: library/unittest mock unittest mock call call_list11165312 +Ref: 38f911165312 +Ref: library/unittest mock calls-as-tuples11166264 +Ref: 38d011166264 +Node: create_autospec11167890 +Ref: library/unittest mock create-autospec11167974 +Ref: 38fa11167974 +Ref: library/unittest mock unittest mock create_autospec11168027 +Ref: 13b111168027 +Node: ANY11169327 +Ref: library/unittest mock any11169417 +Ref: 38fb11169417 +Ref: library/unittest mock unittest mock ANY11169446 +Ref: 13f111169446 +Node: FILTER_DIR11170328 +Ref: library/unittest mock filter-dir11170412 +Ref: 38fc11170412 +Ref: library/unittest mock unittest mock FILTER_DIR11170455 +Ref: 38cb11170455 +Node: mock_open11172470 +Ref: library/unittest mock mock-open11172563 +Ref: 38fd11172563 +Ref: library/unittest mock unittest mock mock_open11172604 +Ref: 141c11172604 +Ref: mock_open-Footnote-111175408 +Node: Autospeccing11175433 +Ref: library/unittest mock auto-speccing11175529 +Ref: 38bb11175529 +Ref: library/unittest mock autospeccing11175529 +Ref: 38fe11175529 +Ref: Autospeccing-Footnote-111185105 +Node: Sealing mocks11185346 +Ref: library/unittest mock sealing-mocks11185424 +Ref: 38ff11185424 +Ref: library/unittest mock unittest mock seal11185473 +Ref: 80311185473 +Node: unittest mock — getting started11186285 +Ref: library/unittest mock-examples doc11186476 +Ref: 390011186476 +Ref: library/unittest mock-examples unittest-mock-getting-started11186476 +Ref: 390111186476 +Ref: library/unittest mock-examples getting-started11186588 +Ref: 390211186588 +Node: Using Mock11186655 +Ref: library/unittest mock-examples using-mock11186760 +Ref: 390311186760 +Node: Mock Patching Methods11187178 +Ref: library/unittest mock-examples mock-patching-methods11187289 +Ref: 390411187289 +Node: Mock for Method Calls on an Object11188841 +Ref: library/unittest mock-examples mock-for-method-calls-on-an-object11188976 +Ref: 390511188976 +Node: Mocking Classes11190079 +Ref: library/unittest mock-examples mocking-classes11190210 +Ref: 390611190210 +Node: Naming your mocks11191209 +Ref: library/unittest mock-examples naming-your-mocks11191324 +Ref: 390711191324 +Node: Tracking all Calls11191758 +Ref: library/unittest mock-examples tracking-all-calls11191894 +Ref: 390811191894 +Node: Setting Return Values and Attributes11193303 +Ref: library/unittest mock-examples setting-return-values-and-attributes11193451 +Ref: 390911193451 +Node: Raising exceptions with mocks11194964 +Ref: library/unittest mock-examples raising-exceptions-with-mocks11195129 +Ref: 390a11195129 +Node: Side effect functions and iterables11195511 +Ref: library/unittest mock-examples side-effect-functions-and-iterables11195670 +Ref: 390b11195670 +Node: Mocking asynchronous iterators11196712 +Ref: library/unittest mock-examples mocking-asynchronous-iterators11196878 +Ref: 390c11196878 +Node: Mocking asynchronous context manager11197453 +Ref: library/unittest mock-examples mocking-asynchronous-context-manager11197623 +Ref: 390d11197623 +Node: Creating a Mock from an Existing Object11198526 +Ref: library/unittest mock-examples creating-a-mock-from-an-existing-object11198657 +Ref: 390e11198657 +Node: Patch Decorators11200469 +Ref: library/unittest mock-examples patch-decorators11200599 +Ref: 390f11200599 +Node: Further Examples11205874 +Ref: library/unittest mock-examples further-examples11205985 +Ref: 391011205985 +Ref: library/unittest mock-examples id111205985 +Ref: 391111205985 +Node: Mocking chained calls11206615 +Ref: library/unittest mock-examples mocking-chained-calls11206713 +Ref: 391211206713 +Node: Partial mocking11209830 +Ref: library/unittest mock-examples partial-mocking11209963 +Ref: 391311209963 +Ref: Partial mocking-Footnote-111211973 +Node: Mocking a Generator Method11212074 +Ref: library/unittest mock-examples mocking-a-generator-method11212230 +Ref: 391411212230 +Ref: Mocking a Generator Method-Footnote-111213366 +Node: Applying the same patch to every test method11213686 +Ref: library/unittest mock-examples applying-the-same-patch-to-every-test-method11213850 +Ref: 391511213850 +Node: Mocking Unbound Methods11216150 +Ref: library/unittest mock-examples mocking-unbound-methods11216321 +Ref: 391611216321 +Node: Checking multiple calls with mock11218091 +Ref: library/unittest mock-examples checking-multiple-calls-with-mock11218247 +Ref: 391711218247 +Node: Coping with mutable arguments11219793 +Ref: library/unittest mock-examples coping-with-mutable-arguments11219941 +Ref: 391811219941 +Node: Nesting Patches11224101 +Ref: library/unittest mock-examples nesting-patches11224251 +Ref: 391911224251 +Node: Mocking a dictionary with MagicMock11226060 +Ref: library/unittest mock-examples mocking-a-dictionary-with-magicmock11226217 +Ref: 391a11226217 +Node: Mock subclasses and their attributes11228853 +Ref: library/unittest mock-examples mock-subclasses-and-their-attributes11229026 +Ref: 391b11229026 +Ref: Mock subclasses and their attributes-Footnote-111231164 +Ref: Mock subclasses and their attributes-Footnote-211231334 +Ref: Mock subclasses and their attributes-Footnote-311231392 +Node: Mocking imports with patch dict11231479 +Ref: library/unittest mock-examples mocking-imports-with-patch-dict11231673 +Ref: 391c11231673 +Node: Tracking order of calls and less verbose call assertions11234323 +Ref: library/unittest mock-examples tracking-order-of-calls-and-less-verbose-call-assertions11234511 +Ref: 391d11234511 +Node: More complex argument matching11237852 +Ref: library/unittest mock-examples more-complex-argument-matching11238000 +Ref: 391e11238000 +Ref: More complex argument matching-Footnote-111241049 +Ref: More complex argument matching-Footnote-211241092 +Node: 2to3 — Automated Python 2 to 3 code translation11241214 +Ref: library/2to3 doc11241412 +Ref: 391f11241412 +Ref: library/2to3 to3-automated-python-2-to-3-code-translation11241412 +Ref: 392011241412 +Ref: library/2to3 to3-reference11241412 +Ref: f8611241412 +Node: Using 2to311242310 +Ref: library/2to3 to3-using11242421 +Ref: 392111242421 +Ref: library/2to3 using-2to311242421 +Ref: 392211242421 +Node: Fixers11246742 +Ref: library/2to3 fixers11246890 +Ref: 392411246890 +Ref: library/2to3 to3-fixers11246890 +Ref: 392311246890 +Ref: library/2to3 to3fixer-apply11247143 +Ref: 392511247143 +Ref: library/2to3 2to3fixer-apply11247143 +Ref: 392611247143 +Ref: library/2to3 to3fixer-asserts11247309 +Ref: 392711247309 +Ref: library/2to3 2to3fixer-asserts11247309 +Ref: 392811247309 +Ref: library/2to3 to3fixer-basestring11249574 +Ref: 392911249574 +Ref: library/2to3 2to3fixer-basestring11249574 +Ref: 392a11249574 +Ref: library/2to3 to3fixer-buffer11249652 +Ref: 392b11249652 +Ref: library/2to3 2to3fixer-buffer11249652 +Ref: 392c11249652 +Ref: library/2to3 to3fixer-dict11249863 +Ref: 392d11249863 +Ref: library/2to3 2to3fixer-dict11249863 +Ref: 392e11249863 +Ref: library/2to3 to3fixer-except11250475 +Ref: 392f11250475 +Ref: library/2to3 2to3fixer-except11250475 +Ref: 393011250475 +Ref: library/2to3 to3fixer-exec11250555 +Ref: 393111250555 +Ref: library/2to3 2to3fixer-exec11250555 +Ref: 393211250555 +Ref: library/2to3 to3fixer-execfile11250652 +Ref: 146f11250652 +Ref: library/2to3 2to3fixer-execfile11250652 +Ref: 393311250652 +Ref: library/2to3 to3fixer-exitfunc11250849 +Ref: 393411250849 +Ref: library/2to3 2to3fixer-exitfunc11250849 +Ref: 393511250849 +Ref: library/2to3 to3fixer-filter11250965 +Ref: 393611250965 +Ref: library/2to3 2to3fixer-filter11250965 +Ref: 393711250965 +Ref: library/2to3 to3fixer-funcattrs11251055 +Ref: 393811251055 +Ref: library/2to3 2to3fixer-funcattrs11251055 +Ref: 393911251055 +Ref: library/2to3 to3fixer-future11251239 +Ref: 393a11251239 +Ref: library/2to3 2to3fixer-future11251239 +Ref: 393b11251239 +Ref: library/2to3 to3fixer-getcwdu11251329 +Ref: 393c11251329 +Ref: library/2to3 2to3fixer-getcwdu11251329 +Ref: 393d11251329 +Ref: library/2to3 to3fixer-has_key11251414 +Ref: 393e11251414 +Ref: library/2to3 2to3fixer-has_key11251414 +Ref: 393f11251414 +Ref: library/2to3 to3fixer-idioms11251498 +Ref: 394011251498 +Ref: library/2to3 2to3fixer-idioms11251498 +Ref: 394111251498 +Ref: library/2to3 to3fixer-import11252032 +Ref: 394211252032 +Ref: library/2to3 2to3fixer-import11252032 +Ref: 394311252032 +Ref: library/2to3 to3fixer-imports11252124 +Ref: 394411252124 +Ref: library/2to3 2to3fixer-imports11252124 +Ref: 394511252124 +Ref: library/2to3 to3fixer-imports211252202 +Ref: 394611252202 +Ref: library/2to3 2to3fixer-imports211252202 +Ref: 394711252202 +Ref: library/2to3 to3fixer-input11252389 +Ref: 394811252389 +Ref: library/2to3 2to3fixer-input11252389 +Ref: 394911252389 +Ref: library/2to3 to3fixer-intern11252476 +Ref: 394a11252476 +Ref: library/2to3 2to3fixer-intern11252476 +Ref: 394b11252476 +Ref: library/2to3 to3fixer-isinstance11252557 +Ref: 394c11252557 +Ref: library/2to3 2to3fixer-isinstance11252557 +Ref: 394d11252557 +Ref: library/2to3 to3fixer-itertools_imports11252859 +Ref: 394e11252859 +Ref: library/2to3 2to3fixer-itertools_imports11252859 +Ref: 394f11252859 +Ref: library/2to3 to3fixer-itertools11253107 +Ref: 395011253107 +Ref: library/2to3 2to3fixer-itertools11253107 +Ref: 395111253107 +Ref: library/2to3 to3fixer-long11253362 +Ref: 395211253362 +Ref: library/2to3 2to3fixer-long11253362 +Ref: 395311253362 +Ref: library/2to3 to3fixer-map11253427 +Ref: 395411253427 +Ref: library/2to3 2to3fixer-map11253427 +Ref: 395511253427 +Ref: library/2to3 to3fixer-metaclass11253635 +Ref: 395611253635 +Ref: library/2to3 2to3fixer-metaclass11253635 +Ref: 395711253635 +Ref: library/2to3 to3fixer-methodattrs11253797 +Ref: 395811253797 +Ref: library/2to3 2to3fixer-methodattrs11253797 +Ref: 395911253797 +Ref: library/2to3 to3fixer-ne11253940 +Ref: 395a11253940 +Ref: library/2to3 2to3fixer-ne11253940 +Ref: 395b11253940 +Ref: library/2to3 to3fixer-next11254023 +Ref: 395c11254023 +Ref: library/2to3 2to3fixer-next11254023 +Ref: 395d11254023 +Ref: library/2to3 to3fixer-nonzero11254220 +Ref: 395e11254220 +Ref: library/2to3 2to3fixer-nonzero11254220 +Ref: 395f11254220 +Ref: library/2to3 to3fixer-numliterals11254340 +Ref: 396011254340 +Ref: library/2to3 2to3fixer-numliterals11254340 +Ref: 396111254340 +Ref: library/2to3 to3fixer-operator11254419 +Ref: 396211254419 +Ref: library/2to3 2to3fixer-operator11254419 +Ref: 396311254419 +Ref: library/2to3 to3fixer-paren11256102 +Ref: 396411256102 +Ref: library/2to3 2to3fixer-paren11256102 +Ref: 396511256102 +Ref: library/2to3 to3fixer-print11256283 +Ref: 396611256283 +Ref: library/2to3 2to3fixer-print11256283 +Ref: 396711256283 +Ref: library/2to3 to3fixer-raise11256383 +Ref: 396811256383 +Ref: library/2to3 2to3fixer-raise11256383 +Ref: 396911256383 +Ref: library/2to3 to3fixer-raw_input11256662 +Ref: 396a11256662 +Ref: library/2to3 2to3fixer-raw_input11256662 +Ref: 396b11256662 +Ref: library/2to3 to3fixer-reduce11256744 +Ref: 396c11256744 +Ref: library/2to3 2to3fixer-reduce11256744 +Ref: 396d11256744 +Ref: library/2to3 to3fixer-reload11256842 +Ref: 147d11256842 +Ref: library/2to3 2to3fixer-reload11256842 +Ref: 396e11256842 +Ref: library/2to3 to3fixer-renames11256929 +Ref: 396f11256929 +Ref: library/2to3 2to3fixer-renames11256929 +Ref: 397011256929 +Ref: library/2to3 to3fixer-repr11257011 +Ref: 397111257011 +Ref: library/2to3 2to3fixer-repr11257011 +Ref: 397211257011 +Ref: library/2to3 to3fixer-set_literal11257099 +Ref: 397311257099 +Ref: library/2to3 2to3fixer-set_literal11257099 +Ref: 397411257099 +Ref: library/2to3 to3fixer-standarderror11257229 +Ref: 397511257229 +Ref: library/2to3 2to3fixer-standarderror11257229 +Ref: 397611257229 +Ref: library/2to3 to3fixer-sys_exc11257318 +Ref: 397711257318 +Ref: library/2to3 2to3fixer-sys_exc11257318 +Ref: 397811257318 +Ref: library/2to3 to3fixer-throw11257475 +Ref: 397911257475 +Ref: library/2to3 2to3fixer-throw11257475 +Ref: 397a11257475 +Ref: library/2to3 to3fixer-tuple_params11257563 +Ref: 397b11257563 +Ref: library/2to3 2to3fixer-tuple_params11257563 +Ref: 397c11257563 +Ref: library/2to3 to3fixer-types11257688 +Ref: 397d11257688 +Ref: library/2to3 2to3fixer-types11257688 +Ref: 397e11257688 +Ref: library/2to3 to3fixer-unicode11257805 +Ref: 397f11257805 +Ref: library/2to3 2to3fixer-unicode11257805 +Ref: 398011257805 +Ref: library/2to3 to3fixer-urllib11257876 +Ref: 398111257876 +Ref: library/2to3 2to3fixer-urllib11257876 +Ref: 398211257876 +Ref: library/2to3 to3fixer-ws_comma11258004 +Ref: 398311258004 +Ref: library/2to3 2to3fixer-ws_comma11258004 +Ref: 398411258004 +Ref: library/2to3 to3fixer-xrange11258119 +Ref: 398511258119 +Ref: library/2to3 2to3fixer-xrange11258119 +Ref: 398611258119 +Ref: library/2to3 to3fixer-xreadlines11258266 +Ref: 398711258266 +Ref: library/2to3 2to3fixer-xreadlines11258266 +Ref: 398811258266 +Ref: library/2to3 to3fixer-zip11258364 +Ref: 398911258364 +Ref: library/2to3 2to3fixer-zip11258364 +Ref: 398a11258364 +Node: lib2to3 — 2to3’s library11258523 +Ref: library/2to3 lib2to3-2to3-s-library11258652 +Ref: 398b11258652 +Ref: library/2to3 module-lib2to311258652 +Ref: a511258652 +Ref: lib2to3 — 2to3’s library-Footnote-111259606 +Ref: lib2to3 — 2to3’s library-Footnote-211259671 +Ref: lib2to3 — 2to3’s library-Footnote-311259713 +Ref: lib2to3 — 2to3’s library-Footnote-411259755 +Ref: lib2to3 — 2to3’s library-Footnote-511259794 +Node: test — Regression tests package for Python11259832 +Ref: library/test doc11260049 +Ref: 398c11260049 +Ref: library/test module-test11260049 +Ref: 10111260049 +Ref: library/test parso11260049 +Ref: 398d11260049 +Ref: library/test test-regression-tests-package-for-python11260049 +Ref: 398e11260049 +Node: Writing Unit Tests for the test package11261481 +Ref: library/test writing-tests11261656 +Ref: 398f11261656 +Ref: library/test writing-unit-tests-for-the-test-package11261656 +Ref: 399011261656 +Node: Running tests using the command-line interface11266203 +Ref: library/test regrtest11266378 +Ref: cab11266378 +Ref: library/test running-tests-using-the-command-line-interface11266378 +Ref: 399111266378 +Node: test support — Utilities for the Python test suite11268318 +Ref: library/test module-test support11268543 +Ref: 10211268543 +Ref: library/test test-support-utilities-for-the-python-test-suite11268543 +Ref: 399211268543 +Ref: library/test test support TestFailed11269053 +Ref: 399311269053 +Ref: library/test test support ResourceDenied11269273 +Ref: 399411269273 +Ref: library/test test support verbose11269567 +Ref: 399611269567 +Ref: library/test test support is_jython11269783 +Ref: 399711269783 +Ref: library/test test support is_android11269872 +Ref: 399811269872 +Ref: library/test test support unix_shell11269950 +Ref: 399911269950 +Ref: library/test test support LOOPBACK_TIMEOUT11270047 +Ref: 13d411270047 +Ref: library/test test support INTERNET_TIMEOUT11270640 +Ref: 13d511270640 +Ref: library/test test support SHORT_TIMEOUT11271136 +Ref: 12b111271136 +Ref: library/test test support LONG_TIMEOUT11271528 +Ref: 13d611271528 +Ref: library/test test support PGO11272037 +Ref: 399b11272037 +Ref: library/test test support PIPE_MAX_SIZE11272135 +Ref: 399c11272135 +Ref: library/test test support SOCK_MAX_SIZE11272283 +Ref: 399d11272283 +Ref: library/test test support TEST_SUPPORT_DIR11272433 +Ref: 399e11272433 +Ref: library/test test support TEST_HOME_DIR11272555 +Ref: 399f11272555 +Ref: library/test test support TEST_DATA_DIR11272652 +Ref: 39a011272652 +Ref: library/test test support MAX_Py_ssize_t11272753 +Ref: 39a111272753 +Ref: library/test test support max_memuse11272851 +Ref: 39a211272851 +Ref: library/test test support real_max_memuse11273014 +Ref: 39a411273014 +Ref: library/test test support MISSING_C_DOCSTRINGS11273186 +Ref: 39a511273186 +Ref: library/test test support HAVE_DOCSTRINGS11273475 +Ref: 39a611273475 +Ref: library/test test support TEST_HTTP_URL11273750 +Ref: 39a711273750 +Ref: library/test test support ALWAYS_EQ11273859 +Ref: 39a811273859 +Ref: library/test test support NEVER_EQ11273975 +Ref: 39a911273975 +Ref: library/test test support LARGEST11274127 +Ref: 39aa11274127 +Ref: library/test test support SMALLEST11274261 +Ref: 39ab11274261 +Ref: library/test test support is_resource_enabled11274463 +Ref: 39ac11274463 +Ref: library/test test support python_is_optimized11274690 +Ref: 39ad11274690 +Ref: library/test test support with_pymalloc11274818 +Ref: 39ae11274818 +Ref: library/test test support requires11274907 +Ref: 399511274907 +Ref: library/test test support sortdict11275274 +Ref: 39af11275274 +Ref: library/test test support findfile11275366 +Ref: 39b011275366 +Ref: library/test test support match_test11275738 +Ref: 39b111275738 +Ref: library/test test support set_match_tests11275879 +Ref: 39b211275879 +Ref: library/test test support run_unittest11276072 +Ref: 148911276072 +Ref: library/test test support run_doctest11276734 +Ref: 39b311276734 +Ref: library/test test support setswitchinterval11277204 +Ref: 39b411277204 +Ref: library/test test support check_impl_detail11277430 +Ref: 39b511277430 +Ref: library/test test support set_memlimit11277948 +Ref: 39a311277948 +Ref: library/test test support record_original_stdout11278106 +Ref: 39b611278106 +Ref: library/test test support get_original_stdout11278272 +Ref: 39b711278272 +Ref: library/test test support args_from_interpreter_flags11278445 +Ref: 39b811278445 +Ref: library/test test support optim_args_from_interpreter_flags11278634 +Ref: 39b911278634 +Ref: library/test test support captured_stdin11278816 +Ref: 39ba11278816 +Ref: library/test test support captured_stdout11278861 +Ref: 39bb11278861 +Ref: library/test test support captured_stderr11278907 +Ref: 142611278907 +Ref: library/test test support disable_faulthandler11279632 +Ref: 39bc11279632 +Ref: library/test test support gc_collect11279756 +Ref: 39bd11279756 +Ref: library/test test support disable_gc11280092 +Ref: 39be11280092 +Ref: library/test test support swap_attr11280273 +Ref: 39bf11280273 +Ref: library/test test support swap_item11280859 +Ref: 39c011280859 +Ref: library/test test support flush_std_streams11281443 +Ref: 39c111281443 +Ref: library/test test support print_warning11281717 +Ref: 39c211281717 +Ref: library/test test support wait_process11281989 +Ref: 138c11281989 +Ref: library/test test support calcobjsize11282506 +Ref: 39c411282506 +Ref: library/test test support calcvobjsize11282739 +Ref: 39c511282739 +Ref: library/test test support checksizeof11282977 +Ref: 39c711282977 +Ref: library/test test support anticipate_failure11283148 +Ref: 39c811283148 +Ref: library/test test support system_must_validate_cert11283410 +Ref: 39c911283410 +Ref: library/test test support run_with_locale11283563 +Ref: 39ca11283563 +Ref: library/test test support run_with_tz11283923 +Ref: 39cb11283923 +Ref: library/test test support requires_freebsd_version11284085 +Ref: 39cc11284085 +Ref: library/test test support requires_linux_version11284299 +Ref: 39cd11284299 +Ref: library/test test support requires_mac_version11284508 +Ref: 39ce11284508 +Ref: library/test test support requires_IEEE_75411284714 +Ref: 39cf11284714 +Ref: library/test test support requires_zlib11284823 +Ref: 39d011284823 +Ref: library/test test support requires_gzip11284938 +Ref: 39d111284938 +Ref: library/test test support requires_bz211285052 +Ref: 39d211285052 +Ref: library/test test support requires_lzma11285164 +Ref: 39d311285164 +Ref: library/test test support requires_resource11285278 +Ref: 39d411285278 +Ref: library/test test support requires_docstrings11285403 +Ref: 39d511285403 +Ref: library/test test support cpython_only11285526 +Ref: 39d611285526 +Ref: library/test test support impl_detail11285622 +Ref: 39d711285622 +Ref: library/test test support no_tracing11285852 +Ref: 39d811285852 +Ref: library/test test support refcount_test11285975 +Ref: 39d911285975 +Ref: library/test test support bigmemtest11286279 +Ref: 39da11286279 +Ref: library/test test support bigaddrspacetest11287026 +Ref: 39db11287026 +Ref: library/test test support check_syntax_error11287127 +Ref: 39dc11287127 +Ref: library/test test support open_urlresource11287681 +Ref: 39dd11287681 +Ref: library/test test support reap_children11287810 +Ref: 39de11287810 +Ref: library/test test support get_attribute11288084 +Ref: 39df11288084 +Ref: library/test test support catch_unraisable_exception11288246 +Ref: 140111288246 +Ref: library/test test support load_package_tests11289132 +Ref: 39e011289132 +Ref: library/test test support detect_api_mismatch11289762 +Ref: 39e111289762 +Ref: library/test test support patch11290231 +Ref: 39e211290231 +Ref: library/test test support run_in_subinterp11290567 +Ref: 39e311290567 +Ref: library/test test support check_free_after_iterating11290736 +Ref: 39e411290736 +Ref: library/test test support missing_compiler_executable11290893 +Ref: 39e511290893 +Ref: library/test test support check__all__11291215 +Ref: 135c11291215 +Ref: library/test test support skip_if_broken_multiprocessing_synchronize11293026 +Ref: 135d11293026 +Ref: library/test test support check_disallow_instantiation11293317 +Ref: 39e611293317 +Ref: library/test test support adjust_int_max_str_digits11293523 +Ref: 39e711293523 +Ref: library/test test support SuppressCrashReport11293993 +Ref: 39e811293993 +Ref: library/test test support SaveSignals11294485 +Ref: 39eb11294485 +Ref: library/test test support SaveSignals save11294616 +Ref: 39ec11294616 +Ref: library/test test support SaveSignals restore11294762 +Ref: 39ed11294762 +Ref: library/test test support Matcher11294901 +Ref: 39ee11294901 +Ref: library/test test support Matcher matches11294934 +Ref: 39ef11294934 +Ref: library/test test support Matcher match_value11295047 +Ref: 39f011295047 +Ref: library/test test support BasicTestRunner11295186 +Ref: 39f111295186 +Ref: library/test test support BasicTestRunner run11295227 +Ref: 39f211295227 +Ref: test support — Utilities for the Python test suite-Footnote-111295337 +Node: test support socket_helper — Utilities for socket tests11295417 +Ref: library/test module-test support socket_helper11295669 +Ref: 10711295669 +Ref: library/test test-support-socket-helper-utilities-for-socket-tests11295669 +Ref: 39f311295669 +Ref: library/test test support socket_helper IPV6_ENABLED11295915 +Ref: 39f411295915 +Ref: library/test test support socket_helper find_unused_port11296046 +Ref: 39f511296046 +Ref: library/test test support socket_helper bind_port11297368 +Ref: 39f611297368 +Ref: library/test test support socket_helper bind_unix_socket11298312 +Ref: 39f711298312 +Ref: library/test test support socket_helper skip_unless_bind_unix_socket11298495 +Ref: 39f811298495 +Ref: library/test test support socket_helper transient_internet11298665 +Ref: 399a11298665 +Node: test support script_helper — Utilities for the Python execution tests11298938 +Ref: library/test module-test support script_helper11299224 +Ref: 10611299224 +Ref: library/test test-support-script-helper-utilities-for-the-python-execution-tests11299224 +Ref: 39f911299224 +Ref: library/test test support script_helper interpreter_requires_environment11299498 +Ref: 39fa11299498 +Ref: library/test test support script_helper run_python_until_end11300473 +Ref: 39fb11300473 +Ref: library/test test support script_helper assert_python_ok11300851 +Ref: 39fc11300851 +Ref: library/test test support script_helper assert_python_failure11301484 +Ref: 39fd11301484 +Ref: library/test test support script_helper spawn_python11301918 +Ref: 39fe11301918 +Ref: library/test test support script_helper kill_python11302231 +Ref: 39ff11302231 +Ref: library/test test support script_helper make_script11302387 +Ref: 3a0011302387 +Ref: library/test test support script_helper make_zip_script11302696 +Ref: 3a0111302696 +Ref: library/test test support script_helper make_pkg11303065 +Ref: 3a0211303065 +Ref: library/test test support script_helper make_zip_pkg11303268 +Ref: 3a0311303268 +Node: test support bytecode_helper — Support tools for testing correct bytecode generation11303798 +Ref: library/test module-test support bytecode_helper11304090 +Ref: 10311304090 +Ref: library/test test-support-bytecode-helper-support-tools-for-testing-correct-bytecode-generation11304090 +Ref: 3a0411304090 +Ref: library/test test support bytecode_helper BytecodeTestCase11304467 +Ref: 3a0511304467 +Ref: library/test test support bytecode_helper BytecodeTestCase get_disassembly_as_string11304626 +Ref: 3a0611304626 +Ref: library/test test support bytecode_helper BytecodeTestCase assertInBytecode11304735 +Ref: 3a0711304735 +Ref: library/test test support bytecode_helper BytecodeTestCase assertNotInBytecode11304915 +Ref: 3a0811304915 +Node: test support threading_helper — Utilities for threading tests11305070 +Ref: library/test module-test support threading_helper11305340 +Ref: 10811305340 +Ref: library/test test-support-threading-helper-utilities-for-threading-tests11305340 +Ref: 3a0911305340 +Ref: library/test test support threading_helper join_thread11305605 +Ref: 3a0a11305605 +Ref: library/test test support threading_helper reap_threads11305827 +Ref: 3a0b11305827 +Ref: library/test test support threading_helper start_threads11305968 +Ref: 3a0c11305968 +Ref: library/test test support threading_helper threading_cleanup11306376 +Ref: 3a0d11306376 +Ref: library/test test support threading_helper threading_setup11306614 +Ref: 3a0e11306614 +Ref: library/test test support threading_helper wait_threads_exit11306742 +Ref: 3a0f11306742 +Ref: library/test test support threading_helper catch_threading_exception11306925 +Ref: 3a1011306925 +Node: test support os_helper — Utilities for os tests11307884 +Ref: library/test module-test support os_helper11308125 +Ref: 10511308125 +Ref: library/test test-support-os-helper-utilities-for-os-tests11308125 +Ref: 3a1111308125 +Ref: library/test test support os_helper FS_NONASCII11308348 +Ref: 3a1211308348 +Ref: library/test test support os_helper SAVEDCWD11308461 +Ref: 3a1311308461 +Ref: library/test test support os_helper TESTFN11308542 +Ref: 3a1411308542 +Ref: library/test test support os_helper TESTFN_NONASCII11308742 +Ref: 3a1511308742 +Ref: library/test test support os_helper TESTFN_UNENCODABLE11309127 +Ref: 3a1611309127 +Ref: library/test test support os_helper TESTFN_UNDECODABLE11309377 +Ref: 3a1711309377 +Ref: library/test test support os_helper TESTFN_UNICODE11309629 +Ref: 3a1811309629 +Ref: library/test test support os_helper EnvironmentVarGuard11309730 +Ref: 3a1911309730 +Ref: library/test test support os_helper FakePath11310198 +Ref: 3a1a11310198 +Ref: library/test test support os_helper EnvironmentVarGuard set11310455 +Ref: 3a1b11310455 +Ref: library/test test support os_helper EnvironmentVarGuard unset11310602 +Ref: 3a1c11310602 +Ref: library/test test support os_helper can_symlink11310713 +Ref: 3a1d11310713 +Ref: library/test test support os_helper can_xattr11310848 +Ref: 3a1e11310848 +Ref: library/test test support os_helper change_cwd11310972 +Ref: 3a1f11310972 +Ref: library/test test support os_helper create_empty_file11311341 +Ref: 3a2011311341 +Ref: library/test test support os_helper fd_count11311493 +Ref: 3a2111311493 +Ref: library/test test support os_helper fs_is_case_insensitive11311592 +Ref: 3a2211311592 +Ref: library/test test support os_helper make_bad_fd11311750 +Ref: 3a2311311750 +Ref: library/test test support os_helper rmdir11311919 +Ref: 3a2411311919 +Ref: library/test test support os_helper rmtree11312226 +Ref: 3a2511312226 +Ref: library/test test support os_helper skip_unless_symlink11312568 +Ref: 3a2611312568 +Ref: library/test test support os_helper skip_unless_xattr11312709 +Ref: 3a2711312709 +Ref: library/test test support os_helper temp_cwd11312834 +Ref: 3a2811312834 +Ref: library/test test support os_helper temp_dir11313492 +Ref: 3a2911313492 +Ref: library/test test support os_helper temp_umask11313945 +Ref: 3a2a11313945 +Ref: library/test test support os_helper unlink11314067 +Ref: 3a2b11314067 +Node: test support import_helper — Utilities for import tests11314311 +Ref: library/test module-test support import_helper11314550 +Ref: 10411314550 +Ref: library/test test-support-import-helper-utilities-for-import-tests11314550 +Ref: 3a2c11314550 +Ref: library/test test support import_helper forget11314797 +Ref: 3a2d11314797 +Ref: library/test test support import_helper import_fresh_module11314982 +Ref: 12b011314982 +Ref: library/test test support import_helper import_module11316597 +Ref: 3a2e11316597 +Ref: library/test test support import_helper modules_setup11317216 +Ref: 3a2f11317216 +Ref: library/test test support import_helper modules_cleanup11317323 +Ref: 3a3011317323 +Ref: library/test test support import_helper unload11317501 +Ref: 3a3111317501 +Ref: library/test test support import_helper make_legacy_pyc11317601 +Ref: 3a3211317601 +Ref: library/test test support import_helper CleanImport11317950 +Ref: 3a3311317950 +Ref: library/test test support import_helper DirsOnSysPath11318340 +Ref: 3a3411318340 +Ref: test support import_helper — Utilities for import tests-Footnote-111318897 +Ref: test support import_helper — Utilities for import tests-Footnote-211318939 +Node: test support warnings_helper — Utilities for warnings tests11318981 +Ref: library/test module-test support warnings_helper11319162 +Ref: 10911319162 +Ref: library/test test-support-warnings-helper-utilities-for-warnings-tests11319162 +Ref: 3a3511319162 +Ref: library/test test support warnings_helper check_no_resource_warning11319421 +Ref: 3a3611319421 +Ref: library/test test support warnings_helper check_syntax_warning11319711 +Ref: 3a3711319711 +Ref: library/test test support warnings_helper check_warnings11320528 +Ref: 3a3811320528 +Ref: library/test test support warnings_helper WarningsRecorder11323598 +Ref: 3a3911323598 +Node: Debugging and Profiling11323789 +Ref: library/debug doc11323946 +Ref: 3a3a11323946 +Ref: library/debug debugging-and-profiling11323946 +Ref: 3a3b11323946 +Ref: library/audit_events audit-events11324404 +Ref: 126911324404 +Node: Audit events table11324736 +Ref: library/audit_events doc11324849 +Ref: 3a3c11324849 +Ref: library/audit_events audit-events-table11324849 +Ref: 3a3d11324849 +Ref: Audit events table-Footnote-111382797 +Node: bdb — Debugger framework11382839 +Ref: library/bdb doc11383003 +Ref: 3a6311383003 +Ref: library/bdb bdb-debugger-framework11383003 +Ref: 3a6411383003 +Ref: library/bdb module-bdb11383003 +Ref: e11383003 +Ref: library/bdb bdb BdbQuit11383338 +Ref: 3a6511383338 +Ref: library/bdb bdb Breakpoint11383502 +Ref: 3a6611383502 +Ref: library/bdb bdb Breakpoint deleteMe11384456 +Ref: 3a6d11384456 +Ref: library/bdb bdb Breakpoint enable11384672 +Ref: 3a6e11384672 +Ref: library/bdb bdb Breakpoint disable11384743 +Ref: 3a6f11384743 +Ref: library/bdb bdb Breakpoint bpformat11384816 +Ref: 3a7011384816 +Ref: library/bdb bdb Breakpoint bpprint11385211 +Ref: 3a7111385211 +Ref: library/bdb bdb Breakpoint file11385447 +Ref: 3a6911385447 +Ref: library/bdb bdb Breakpoint line11385525 +Ref: 3a7211385525 +Ref: library/bdb bdb Breakpoint temporary11385640 +Ref: 3a7311385640 +Ref: library/bdb bdb Breakpoint cond11385756 +Ref: 3a6c11385756 +Ref: library/bdb bdb Breakpoint funcname11385871 +Ref: 3a6a11385871 +Ref: library/bdb bdb Breakpoint enabled11386018 +Ref: 3a7411386018 +Ref: library/bdb bdb Breakpoint bpbynumber11386102 +Ref: 3a6711386102 +Ref: library/bdb bdb Breakpoint bplist11386220 +Ref: 3a6811386220 +Ref: library/bdb bdb Breakpoint ignore11386374 +Ref: 3a7511386374 +Ref: library/bdb bdb Breakpoint hits11386465 +Ref: 3a6b11386465 +Ref: library/bdb bdb Bdb11386581 +Ref: fa611386581 +Ref: library/bdb bdb Bdb canonic11387366 +Ref: 3a7611387366 +Ref: library/bdb bdb Bdb reset11387744 +Ref: 3a7711387744 +Ref: library/bdb bdb Bdb trace_dispatch11387919 +Ref: 3a7811387919 +Ref: library/bdb bdb Bdb dispatch_line11389338 +Ref: 3a7911389338 +Ref: library/bdb bdb Bdb dispatch_call11389812 +Ref: 3a7b11389812 +Ref: library/bdb bdb Bdb dispatch_return11390293 +Ref: 3a7d11390293 +Ref: library/bdb bdb Bdb dispatch_exception11390782 +Ref: 3a7f11390782 +Ref: library/bdb bdb Bdb is_skipped_line11391438 +Ref: 3a8111391438 +Ref: library/bdb bdb Bdb stop_here11391552 +Ref: 3a8211391552 +Ref: library/bdb bdb Bdb break_here11391674 +Ref: 3a8311391674 +Ref: library/bdb bdb Bdb break_anywhere11391966 +Ref: 3a8511391966 +Ref: library/bdb bdb Bdb user_call11392179 +Ref: 3a7c11392179 +Ref: library/bdb bdb Bdb user_line11392342 +Ref: 3a7a11392342 +Ref: library/bdb bdb Bdb user_return11392536 +Ref: 3a7e11392536 +Ref: library/bdb bdb Bdb user_exception11392702 +Ref: 3a8011392702 +Ref: library/bdb bdb Bdb do_clear11392870 +Ref: 3a8611392870 +Ref: library/bdb bdb Bdb set_step11393155 +Ref: 3a8711393155 +Ref: library/bdb bdb Bdb set_next11393225 +Ref: 3a8811393225 +Ref: library/bdb bdb Bdb set_return11393322 +Ref: 3a8911393322 +Ref: library/bdb bdb Bdb set_until11393412 +Ref: 3a8a11393412 +Ref: library/bdb bdb Bdb set_trace11393597 +Ref: 3a8b11393597 +Ref: library/bdb bdb Bdb set_continue11393756 +Ref: 3a8c11393756 +Ref: library/bdb bdb Bdb set_quit11393929 +Ref: 3a8d11393929 +Ref: library/bdb bdb Bdb set_break11394347 +Ref: 3a8e11394347 +Ref: library/bdb bdb Bdb clear_break11394712 +Ref: 3a8f11394712 +Ref: library/bdb bdb Bdb clear_bpbynumber11394877 +Ref: 3a9011394877 +Ref: library/bdb bdb Bdb clear_all_file_breaks11395106 +Ref: 3a9111395106 +Ref: library/bdb bdb Bdb clear_all_breaks11395260 +Ref: 3a9211395260 +Ref: library/bdb bdb Bdb get_bpbynumber11395396 +Ref: 3a9311395396 +Ref: library/bdb bdb Bdb get_break11395745 +Ref: 3a9411395745 +Ref: library/bdb bdb Bdb get_breaks11395878 +Ref: 3a9511395878 +Ref: library/bdb bdb Bdb get_file_breaks11396032 +Ref: 3a9611396032 +Ref: library/bdb bdb Bdb get_all_breaks11396170 +Ref: 3a9711396170 +Ref: library/bdb bdb Bdb get_stack11396376 +Ref: 3a9811396376 +Ref: library/bdb bdb Bdb format_stack_entry11396667 +Ref: 3a9911396667 +Ref: library/bdb bdb Bdb run11397250 +Ref: 3a9a11397250 +Ref: library/bdb bdb Bdb runeval11397480 +Ref: 3a9b11397480 +Ref: library/bdb bdb Bdb runctx11397708 +Ref: 3a9c11397708 +Ref: library/bdb bdb Bdb runcall11397844 +Ref: 6d011397844 +Ref: library/bdb bdb checkfuncname11398013 +Ref: 3a9d11398013 +Ref: library/bdb bdb effective11398460 +Ref: 3a8411398460 +Ref: library/bdb bdb set_trace11399216 +Ref: 3a9e11399216 +Ref: bdb — Debugger framework-Footnote-111399366 +Node: faulthandler — Dump the Python traceback11399429 +Ref: library/faulthandler doc11399602 +Ref: 3a9f11399602 +Ref: library/faulthandler faulthandler-dump-the-python-traceback11399602 +Ref: 3aa011399602 +Ref: library/faulthandler module-faulthandler11399602 +Ref: 7811399602 +Node: Dumping the traceback11401744 +Ref: library/faulthandler dumping-the-traceback11401872 +Ref: 3aa111401872 +Ref: library/faulthandler faulthandler dump_traceback11401935 +Ref: a7f11401935 +Node: Fault handler state11402242 +Ref: library/faulthandler fault-handler-state11402417 +Ref: 3aa211402417 +Ref: library/faulthandler faulthandler enable11402476 +Ref: 91111402476 +Ref: library/faulthandler faulthandler disable11403295 +Ref: 3aa411403295 +Ref: library/faulthandler faulthandler is_enabled11403436 +Ref: 3aa511403436 +Node: Dumping the tracebacks after a timeout11403523 +Ref: library/faulthandler dumping-the-tracebacks-after-a-timeout11403715 +Ref: 3aa611403715 +Ref: library/faulthandler faulthandler dump_traceback_later11403812 +Ref: a8011403812 +Ref: library/faulthandler faulthandler cancel_dump_traceback_later11404844 +Ref: 3aa711404844 +Node: Dumping the traceback on a user signal11404968 +Ref: library/faulthandler dumping-the-traceback-on-a-user-signal11405168 +Ref: 3aa811405168 +Ref: library/faulthandler faulthandler register11405265 +Ref: a7e11405265 +Ref: library/faulthandler faulthandler unregister11405896 +Ref: 3aa911405896 +Node: Issue with file descriptors11406171 +Ref: library/faulthandler faulthandler-fd11406344 +Ref: 3aa311406344 +Ref: library/faulthandler issue-with-file-descriptors11406344 +Ref: 3aaa11406344 +Node: Example<14>11406812 +Ref: library/faulthandler example11406938 +Ref: 3aab11406938 +Node: pdb — The Python Debugger11407484 +Ref: library/pdb doc11407651 +Ref: 3aac11407651 +Ref: library/pdb debugger11407651 +Ref: 3aad11407651 +Ref: library/pdb module-pdb11407651 +Ref: c611407651 +Ref: library/pdb pdb-the-python-debugger11407651 +Ref: 3aae11407651 +Ref: library/pdb pdb run11410865 +Ref: 384911410865 +Ref: library/pdb pdb runeval11411557 +Ref: 3ab311411557 +Ref: library/pdb pdb runcall11411868 +Ref: 3ab411411868 +Ref: library/pdb pdb set_trace11412183 +Ref: 7c411412183 +Ref: library/pdb pdb post_mortem11412599 +Ref: 104611412599 +Ref: library/pdb pdb pm11412890 +Ref: 3ab511412890 +Ref: library/pdb pdb Pdb11413234 +Ref: 56a11413234 +Ref: library/pdb pdb Pdb run11414601 +Ref: 3ab711414601 +Ref: library/pdb pdb Pdb runeval11414661 +Ref: 3ab811414661 +Ref: library/pdb pdb Pdb runcall11414726 +Ref: 3ab911414726 +Ref: library/pdb pdb Pdb set_trace11414777 +Ref: 3aba11414777 +Ref: pdb — The Python Debugger-Footnote-111414944 +Ref: pdb — The Python Debugger-Footnote-211415007 +Node: Debugger Commands11415136 +Ref: library/pdb debugger-commands11415217 +Ref: 3aaf11415217 +Ref: library/pdb id211415217 +Ref: 3abb11415217 +Ref: library/pdb pdbcommand-help11417772 +Ref: 3abe11417772 +Ref: library/pdb pdbcommand-where11418165 +Ref: 3abf11418165 +Ref: library/pdb pdbcommand-down11418355 +Ref: 3ac011418355 +Ref: library/pdb pdbcommand-up11418494 +Ref: 3ac111418494 +Ref: library/pdb pdbcommand-break11418630 +Ref: 3ac211418630 +Ref: library/pdb pdbcommand-tbreak11419512 +Ref: 3ac311419512 +Ref: library/pdb pdbcommand-clear11419723 +Ref: 3ac411419723 +Ref: library/pdb pdbcommand-disable11420020 +Ref: 3ac511420020 +Ref: library/pdb pdbcommand-enable11420334 +Ref: 3ac611420334 +Ref: library/pdb pdbcommand-ignore11420413 +Ref: 3ac711420413 +Ref: library/pdb pdbcommand-condition11420806 +Ref: 3ac811420806 +Ref: library/pdb pdbcommand-commands11421099 +Ref: 3ac911421099 +Ref: library/pdb pdbcommand-step11422734 +Ref: 3ab111422734 +Ref: library/pdb pdbcommand-next11422919 +Ref: 3ab211422919 +Ref: library/pdb pdbcommand-until11423317 +Ref: 3acd11423317 +Ref: library/pdb pdbcommand-return11423714 +Ref: 3aca11423714 +Ref: library/pdb pdbcommand-continue11423801 +Ref: 3ab011423801 +Ref: library/pdb pdbcommand-jump11423901 +Ref: 3acb11423901 +Ref: library/pdb pdbcommand-list11424331 +Ref: 3abc11424331 +Ref: library/pdb pdbcommand-ll11425069 +Ref: 3ace11425069 +Ref: library/pdb pdbcommand-args11425247 +Ref: 3acf11425247 +Ref: library/pdb pdbcommand-p11425326 +Ref: c1411425326 +Ref: library/pdb pdbcommand-pp11425595 +Ref: 3ad011425595 +Ref: library/pdb pdbcommand-whatis11425758 +Ref: 3ad111425758 +Ref: library/pdb pdbcommand-source11425835 +Ref: 3ad211425835 +Ref: library/pdb pdbcommand-display11425962 +Ref: 3ad311425962 +Ref: library/pdb pdbcommand-undisplay11426219 +Ref: 3ad411426219 +Ref: library/pdb pdbcommand-interact11426435 +Ref: 3ad511426435 +Ref: library/pdb debugger-aliases11426664 +Ref: 3abd11426664 +Ref: library/pdb pdbcommand-alias11426664 +Ref: 3ad611426664 +Ref: library/pdb pdbcommand-unalias11427761 +Ref: 3ad711427761 +Ref: library/pdb pdbcommand-011427825 +Ref: 3ad811427825 +Ref: library/pdb pdbcommand-!11427825 +Ref: 3ad911427825 +Ref: library/pdb pdbcommand-run11428267 +Ref: 3ada11428267 +Ref: library/pdb pdbcommand-restart11428298 +Ref: 3adb11428298 +Ref: library/pdb pdbcommand-quit11428637 +Ref: 3acc11428637 +Ref: library/pdb pdbcommand-debug11428731 +Ref: 3adc11428731 +Ref: library/pdb pdbcommand-retval11428930 +Ref: 3add11428930 +Node: The Python Profilers11429018 +Ref: library/profile doc11429199 +Ref: 3ade11429199 +Ref: library/profile profile11429199 +Ref: 3adf11429199 +Ref: library/profile the-python-profilers11429199 +Ref: 3ae011429199 +Ref: The Python Profilers-Footnote-111429643 +Ref: The Python Profilers-Footnote-211429710 +Node: Introduction to the profilers11429776 +Ref: library/profile introduction-to-the-profilers11429894 +Ref: 3ae111429894 +Ref: library/profile profiler-introduction11429894 +Ref: 3ae211429894 +Node: Instant User’s Manual11431380 +Ref: library/profile instant-user-s-manual11431544 +Ref: 3ae311431544 +Ref: library/profile profile-instant11431544 +Ref: 3ae411431544 +Node: profile and cProfile Module Reference11437774 +Ref: library/profile module-cProfile11437924 +Ref: 2611437924 +Ref: library/profile profile-and-cprofile-module-reference11437924 +Ref: 3ae911437924 +Ref: library/profile module-profile11438035 +Ref: d011438035 +Ref: library/profile profile run11438129 +Ref: 3aea11438129 +Ref: library/profile profile runctx11438765 +Ref: 3aeb11438765 +Ref: library/profile profile Profile11439168 +Ref: 62611439168 +Ref: library/profile profile Profile enable11440736 +Ref: 3aec11440736 +Ref: library/profile profile Profile disable11440837 +Ref: 3aed11440837 +Ref: library/profile profile Profile create_stats11440938 +Ref: 3aee11440938 +Ref: library/profile profile Profile print_stats11441082 +Ref: 3aef11441082 +Ref: library/profile profile Profile dump_stats11441241 +Ref: 3af011441241 +Ref: library/profile profile Profile run11441348 +Ref: 3af111441348 +Ref: library/profile profile Profile runctx11441426 +Ref: 3af211441426 +Ref: library/profile profile Profile runcall11441583 +Ref: 6cf11441583 +Node: The Stats Class11441927 +Ref: library/profile profile-stats11442086 +Ref: 3af311442086 +Ref: library/profile the-stats-class11442086 +Ref: 3af411442086 +Ref: library/profile module-pstats11442218 +Ref: d111442218 +Ref: library/profile pstats Stats11442220 +Ref: 3ae511442220 +Ref: library/profile pstats Stats strip_dirs11443483 +Ref: 3ae711443483 +Ref: library/profile pstats Stats add11444305 +Ref: 3af511444305 +Ref: library/profile pstats Stats dump_stats11444798 +Ref: 3af611444798 +Ref: library/profile pstats Stats sort_stats11445179 +Ref: 3ae611445179 +Ref: library/profile pstats Stats reverse_order11450536 +Ref: 3af711450536 +Ref: library/profile pstats Stats print_stats11450822 +Ref: 3ae811450822 +Ref: library/profile pstats Stats print_callers11452266 +Ref: 3af811452266 +Ref: library/profile pstats Stats print_callees11453382 +Ref: 3af911453382 +Ref: library/profile pstats Stats get_stats_profile11453763 +Ref: 3afa11453763 +Node: What Is Deterministic Profiling?11454308 +Ref: library/profile deterministic-profiling11454441 +Ref: 3afb11454441 +Ref: library/profile what-is-deterministic-profiling11454441 +Ref: 3afc11454441 +Node: Limitations11456239 +Ref: library/profile limitations11456368 +Ref: 3afd11456368 +Ref: library/profile profile-limitations11456368 +Ref: 3afe11456368 +Node: Calibration11458251 +Ref: library/profile calibration11458368 +Ref: 3aff11458368 +Ref: library/profile profile-calibration11458368 +Ref: 3b0011458368 +Node: Using a custom timer11460060 +Ref: library/profile profile-timers11460157 +Ref: 3b0111460157 +Ref: library/profile using-a-custom-timer11460157 +Ref: 3b0211460157 +Node: timeit — Measure execution time of small code snippets11462607 +Ref: library/timeit doc11462812 +Ref: 3b0311462812 +Ref: library/timeit module-timeit11462812 +Ref: 10d11462812 +Ref: library/timeit timeit-measure-execution-time-of-small-code-snippets11462812 +Ref: 3b0411462812 +Ref: timeit — Measure execution time of small code snippets-Footnote-111463597 +Node: Basic Examples<2>11463663 +Ref: library/timeit basic-examples11463798 +Ref: 3b0711463798 +Node: Python Interface11465086 +Ref: library/timeit id111465255 +Ref: 3b0911465255 +Ref: library/timeit python-interface11465255 +Ref: 3b0611465255 +Ref: library/timeit timeit timeit11465376 +Ref: b0c11465376 +Ref: library/timeit timeit repeat11465839 +Ref: 3b0a11465839 +Ref: library/timeit timeit default_timer11466429 +Ref: 3b0c11466429 +Ref: library/timeit timeit Timer11466634 +Ref: 134e11466634 +Ref: library/timeit timeit Timer timeit11468081 +Ref: 95c11468081 +Ref: library/timeit timeit Timer autorange11469191 +Ref: 95b11469191 +Ref: library/timeit timeit Timer repeat11469918 +Ref: 3b0b11469918 +Ref: library/timeit timeit Timer print_exc11471193 +Ref: 3b0d11471193 +Node: Command-Line Interface<4>11471773 +Ref: library/timeit command-line-interface11471937 +Ref: 3b0e11471937 +Ref: library/timeit timeit-command-line-interface11471937 +Ref: 3b0511471937 +Ref: library/timeit cmdoption-timeit-n11472196 +Ref: 3b0f11472196 +Ref: library/timeit cmdoption-timeit-number11472196 +Ref: 3b1011472196 +Ref: library/timeit cmdoption-timeit-r11472282 +Ref: 3b1111472282 +Ref: library/timeit cmdoption-timeit-repeat11472282 +Ref: 3b1211472282 +Ref: library/timeit cmdoption-timeit-s11472373 +Ref: 3b1311472373 +Ref: library/timeit cmdoption-timeit-setup11472373 +Ref: 3b1411472373 +Ref: library/timeit cmdoption-timeit-p11472477 +Ref: 3b1511472477 +Ref: library/timeit cmdoption-timeit-process11472477 +Ref: 3b1611472477 +Ref: library/timeit cmdoption-timeit-u11472698 +Ref: 3b1711472698 +Ref: library/timeit cmdoption-timeit-unit11472698 +Ref: 3b1811472698 +Ref: library/timeit cmdoption-timeit-v11472867 +Ref: 3b1911472867 +Ref: library/timeit cmdoption-timeit-verbose11472867 +Ref: 3b1a11472867 +Ref: library/timeit cmdoption-timeit-h11472967 +Ref: 3b1b11472967 +Ref: library/timeit cmdoption-timeit-help11472967 +Ref: 3b1c11472967 +Node: Examples<29>11474186 +Ref: library/timeit examples11474325 +Ref: 3b1d11474325 +Ref: library/timeit timeit-examples11474325 +Ref: 3b0811474325 +Node: trace — Trace or track Python statement execution11477963 +Ref: library/trace doc11478188 +Ref: 3b1e11478188 +Ref: library/trace module-trace11478188 +Ref: 11c11478188 +Ref: library/trace trace-trace-or-track-python-statement-execution11478188 +Ref: 3b1f11478188 +Ref: trace — Trace or track Python statement execution-Footnote-111478933 +Ref: trace — Trace or track Python statement execution-Footnote-211478998 +Node: Command-Line Usage11479039 +Ref: library/trace command-line-usage11479176 +Ref: 3b2011479176 +Ref: library/trace trace-cli11479176 +Ref: 3b2111479176 +Ref: library/trace cmdoption-trace-help11479530 +Ref: 3b2211479530 +Ref: library/trace cmdoption-trace-version11479588 +Ref: 3b2311479588 +Node: Main options11479812 +Ref: library/trace main-options11479897 +Ref: 3b2411479897 +Ref: library/trace cmdoption-trace-c11480287 +Ref: 3b2711480287 +Ref: library/trace cmdoption-trace-count11480287 +Ref: 3b2811480287 +Ref: library/trace cmdoption-trace-t11480554 +Ref: 3b2611480554 +Ref: library/trace cmdoption-trace-trace11480554 +Ref: 3b2c11480554 +Ref: library/trace cmdoption-trace-l11480629 +Ref: 3b2511480629 +Ref: library/trace cmdoption-trace-listfuncs11480629 +Ref: 3b2d11480629 +Ref: library/trace cmdoption-trace-r11480727 +Ref: 3b2e11480727 +Ref: library/trace cmdoption-trace-report11480727 +Ref: 3b2f11480727 +Ref: library/trace cmdoption-trace-T11480933 +Ref: 3b3011480933 +Ref: library/trace cmdoption-trace-trackcalls11480933 +Ref: 3b3111480933 +Node: Modifiers11481043 +Ref: library/trace modifiers11481144 +Ref: 3b3211481144 +Ref: library/trace cmdoption-trace-f11481183 +Ref: 3b2a11481183 +Ref: library/trace cmdoption-trace-file11481183 +Ref: 3b3311481183 +Ref: library/trace cmdoption-trace-C11481350 +Ref: 3b2911481350 +Ref: library/trace cmdoption-trace-coverdir11481350 +Ref: 3b3411481350 +Ref: library/trace cmdoption-trace-m11481548 +Ref: 3b3511481548 +Ref: library/trace cmdoption-trace-missing11481548 +Ref: 3b3611481548 +Ref: library/trace cmdoption-trace-s11481684 +Ref: 3b3711481684 +Ref: library/trace cmdoption-trace-summary11481684 +Ref: 3b3811481684 +Ref: library/trace cmdoption-trace-R11481846 +Ref: 3b2b11481846 +Ref: library/trace cmdoption-trace-no-report11481846 +Ref: 3b3911481846 +Ref: library/trace cmdoption-trace-g11482077 +Ref: 3b3a11482077 +Ref: library/trace cmdoption-trace-timing11482077 +Ref: 3b3b11482077 +Node: Filters11482206 +Ref: library/trace filters11482286 +Ref: 3b3c11482286 +Ref: library/trace cmdoption-trace-ignore-module11482368 +Ref: 3b3d11482368 +Ref: library/trace cmdoption-trace-ignore-dir11482565 +Ref: 3b3e11482565 +Node: Programmatic Interface11482776 +Ref: library/trace programmatic-interface11482913 +Ref: 3b3f11482913 +Ref: library/trace trace-api11482913 +Ref: 3b4011482913 +Ref: library/trace trace Trace11482978 +Ref: 3b4111482978 +Ref: library/trace trace Trace run11483889 +Ref: 3b4211483889 +Ref: library/trace trace Trace runctx11484131 +Ref: 3b4311484131 +Ref: library/trace trace Trace runfunc11484445 +Ref: 6d111484445 +Ref: library/trace trace Trace results11484638 +Ref: 3b4411484638 +Ref: library/trace trace CoverageResults11484947 +Ref: 3b4511484947 +Ref: library/trace trace CoverageResults update11485111 +Ref: 3b4611485111 +Ref: library/trace trace CoverageResults write_results11485229 +Ref: 3b4711485229 +Node: tracemalloc — Trace memory allocations11486259 +Ref: library/tracemalloc doc11486419 +Ref: 3b4811486419 +Ref: library/tracemalloc module-tracemalloc11486419 +Ref: 11e11486419 +Ref: library/tracemalloc tracemalloc-trace-memory-allocations11486419 +Ref: 3b4911486419 +Ref: tracemalloc — Trace memory allocations-Footnote-111487759 +Node: Examples<30>11487830 +Ref: library/tracemalloc examples11487931 +Ref: 3b4a11487931 +Node: Display the top 1011488080 +Ref: library/tracemalloc display-the-top-1011488175 +Ref: 3b4b11488175 +Node: Compute differences11489659 +Ref: library/tracemalloc compute-differences11489798 +Ref: 3b4d11489798 +Node: Get the traceback of a memory block11491988 +Ref: library/tracemalloc get-the-traceback-of-a-memory-block11492119 +Ref: 3b5011492119 +Node: Pretty top11494751 +Ref: library/tracemalloc pretty-top11494854 +Ref: 3b5111494854 +Node: Record the current and peak size of all traced memory blocks11497316 +Ref: library/tracemalloc record-the-current-and-peak-size-of-all-traced-memory-blocks11497423 +Ref: 3b5211497423 +Node: API11499115 +Ref: library/tracemalloc api11499216 +Ref: 3b5411499216 +Node: Functions<10>11499388 +Ref: library/tracemalloc functions11499462 +Ref: 3b5511499462 +Ref: library/tracemalloc tracemalloc clear_traces11499501 +Ref: 3b5611499501 +Ref: library/tracemalloc tracemalloc get_object_traceback11499636 +Ref: 159e11499636 +Ref: library/tracemalloc tracemalloc get_traceback_limit11500043 +Ref: 3b5811500043 +Ref: library/tracemalloc tracemalloc get_traced_memory11500367 +Ref: 3b5311500367 +Ref: library/tracemalloc tracemalloc reset_peak11500573 +Ref: 58311500573 +Ref: library/tracemalloc tracemalloc get_tracemalloc_memory11501205 +Ref: 3b5a11501205 +Ref: library/tracemalloc tracemalloc is_tracing11501403 +Ref: 3b5b11501403 +Ref: library/tracemalloc tracemalloc start11501636 +Ref: 178211501636 +Ref: library/tracemalloc tracemalloc stop11503002 +Ref: 3b5711503002 +Ref: library/tracemalloc tracemalloc take_snapshot11503436 +Ref: 3b5911503436 +Node: DomainFilter11504136 +Ref: library/tracemalloc domainfilter11504225 +Ref: 3b5f11504225 +Ref: library/tracemalloc tracemalloc DomainFilter11504270 +Ref: 96011504270 +Ref: library/tracemalloc tracemalloc DomainFilter inclusive11504434 +Ref: 3b6011504434 +Ref: library/tracemalloc tracemalloc DomainFilter domain11504734 +Ref: 3b6111504734 +Node: Filter11504839 +Ref: library/tracemalloc filter11504920 +Ref: 3b6211504920 +Ref: library/tracemalloc tracemalloc Filter11504955 +Ref: 3b6311504955 +Ref: library/tracemalloc tracemalloc Filter domain11505818 +Ref: 3b6411505818 +Ref: library/tracemalloc tracemalloc Filter inclusive11506089 +Ref: 3b6511506089 +Ref: library/tracemalloc tracemalloc Filter lineno11506521 +Ref: 3b6711506521 +Ref: library/tracemalloc tracemalloc Filter filename_pattern11506673 +Ref: 3b6611506673 +Ref: library/tracemalloc tracemalloc Filter all_frames11506787 +Ref: 3b6811506787 +Node: Frame11507194 +Ref: library/tracemalloc frame11507271 +Ref: 3b6a11507271 +Ref: library/tracemalloc tracemalloc Frame11507304 +Ref: 3b6b11507304 +Ref: library/tracemalloc tracemalloc Frame filename11507452 +Ref: 3b6c11507452 +Ref: library/tracemalloc tracemalloc Frame lineno11507515 +Ref: 3b6d11507515 +Node: Snapshot11507579 +Ref: library/tracemalloc snapshot11507659 +Ref: 3b6e11507659 +Ref: library/tracemalloc tracemalloc Snapshot11507698 +Ref: 3b5e11507698 +Ref: library/tracemalloc tracemalloc Snapshot compare_to11507876 +Ref: 3b5d11507876 +Ref: library/tracemalloc tracemalloc Snapshot dump11508604 +Ref: 3b4e11508604 +Ref: library/tracemalloc tracemalloc Snapshot filter_traces11508740 +Ref: 3b7511508740 +Ref: library/tracemalloc tracemalloc Snapshot load11509417 +Ref: 3b4f11509417 +Ref: library/tracemalloc tracemalloc Snapshot statistics11509543 +Ref: 3b4c11509543 +Ref: library/tracemalloc tracemalloc Snapshot traceback_limit11510744 +Ref: 3b6911510744 +Ref: library/tracemalloc tracemalloc Snapshot traces11510963 +Ref: 3b7611510963 +Node: Statistic11511258 +Ref: library/tracemalloc statistic11511346 +Ref: 3b7b11511346 +Ref: library/tracemalloc tracemalloc Statistic11511387 +Ref: 3b7711511387 +Ref: library/tracemalloc tracemalloc Statistic count11511611 +Ref: 3b7311511611 +Ref: library/tracemalloc tracemalloc Statistic size11511686 +Ref: 3b7811511686 +Ref: library/tracemalloc tracemalloc Statistic traceback11511773 +Ref: 3b7911511773 +Node: StatisticDiff11511905 +Ref: library/tracemalloc statisticdiff11511990 +Ref: 3b7c11511990 +Ref: library/tracemalloc tracemalloc StatisticDiff11512039 +Ref: 3b6f11512039 +Ref: library/tracemalloc tracemalloc StatisticDiff count11512339 +Ref: 3b7d11512339 +Ref: library/tracemalloc tracemalloc StatisticDiff count_diff11512513 +Ref: 3b7211512513 +Ref: library/tracemalloc tracemalloc StatisticDiff size11512735 +Ref: 3b7111512735 +Ref: library/tracemalloc tracemalloc StatisticDiff size_diff11512931 +Ref: 3b7011512931 +Ref: library/tracemalloc tracemalloc StatisticDiff traceback11513165 +Ref: 3b7411513165 +Node: Trace11513299 +Ref: library/tracemalloc trace11513384 +Ref: 3b7e11513384 +Ref: library/tracemalloc tracemalloc Trace11513417 +Ref: 3b7a11513417 +Ref: library/tracemalloc tracemalloc Trace domain11513650 +Ref: 3b7f11513650 +Ref: library/tracemalloc tracemalloc Trace size11513928 +Ref: 3b8011513928 +Ref: library/tracemalloc tracemalloc Trace traceback11514012 +Ref: 3b8111514012 +Node: Traceback11514144 +Ref: library/tracemalloc traceback11514207 +Ref: 3b8211514207 +Ref: library/tracemalloc tracemalloc Traceback11514248 +Ref: 7f811514248 +Ref: library/tracemalloc tracemalloc Traceback total_nframe11515175 +Ref: 3b5c11515175 +Ref: library/tracemalloc tracemalloc Traceback format11515484 +Ref: 7f911515484 +Node: Software Packaging and Distribution11516552 +Ref: library/distribution doc11516715 +Ref: 3b8411516715 +Ref: library/distribution software-packaging-and-distribution11516715 +Ref: 3b8511516715 +Ref: Software Packaging and Distribution-Footnote-111517299 +Node: distutils — Building and installing Python modules11517324 +Ref: library/distutils doc11517502 +Ref: 3b8611517502 +Ref: library/distutils distutils-building-and-installing-python-modules11517502 +Ref: 3b8711517502 +Ref: library/distutils module-distutils11517502 +Ref: 3711517502 +Ref: distutils — Building and installing Python modules-Footnote-111519612 +Ref: distutils — Building and installing Python modules-Footnote-211519665 +Ref: distutils — Building and installing Python modules-Footnote-311519694 +Node: ensurepip — Bootstrapping the pip installer11519731 +Ref: library/ensurepip doc11519959 +Ref: 3b8811519959 +Ref: library/ensurepip ensurepip-bootstrapping-the-pip-installer11519959 +Ref: 3b8911519959 +Ref: library/ensurepip module-ensurepip11519959 +Ref: 7511519959 +Ref: ensurepip — Bootstrapping the pip installer-Footnote-111521598 +Node: Command line interface11521640 +Ref: library/ensurepip command-line-interface11521763 +Ref: 3b8a11521763 +Node: Module API11523544 +Ref: library/ensurepip module-api11523667 +Ref: 3b8b11523667 +Ref: library/ensurepip ensurepip version11523774 +Ref: 3b8c11523774 +Ref: library/ensurepip ensurepip bootstrap11523936 +Ref: 3a4411523936 +Node: venv — Creation of virtual environments11525719 +Ref: library/venv doc11525943 +Ref: 3b8d11525943 +Ref: library/venv module-venv11525943 +Ref: 12f11525943 +Ref: library/venv venv-creation-of-virtual-environments11525943 +Ref: 3b8e11525943 +Ref: venv — Creation of virtual environments-Footnote-111527105 +Ref: venv — Creation of virtual environments-Footnote-211527167 +Ref: venv — Creation of virtual environments-Footnote-311527209 +Node: Creating virtual environments11527332 +Ref: library/venv creating-virtual-environments11527454 +Ref: 3b8f11527454 +Ref: library/venv venv-def11534718 +Ref: 3b9011534718 +Ref: Creating virtual environments-Footnote-111538687 +Ref: Creating virtual environments-Footnote-211538745 +Ref: Creating virtual environments-Footnote-311538800 +Ref: Creating virtual environments-Footnote-411538845 +Ref: Creating virtual environments-Footnote-511538883 +Node: API<2>11538925 +Ref: library/venv api11539090 +Ref: 3b9411539090 +Ref: library/venv venv-api11539090 +Ref: b8211539090 +Ref: library/venv venv EnvBuilder11539347 +Ref: c8a11539347 +Ref: library/venv venv EnvBuilder create11541367 +Ref: 3b9511541367 +Ref: library/venv venv EnvBuilder ensure_directories11542662 +Ref: 3b9611542662 +Ref: library/venv venv EnvBuilder create_configuration11543356 +Ref: 3b9711543356 +Ref: library/venv venv EnvBuilder setup_python11543494 +Ref: 3b9811543494 +Ref: library/venv venv EnvBuilder setup_scripts11543860 +Ref: 3b9911543860 +Ref: library/venv venv EnvBuilder upgrade_dependencies11544009 +Ref: 3b9b11544009 +Ref: library/venv venv EnvBuilder post_setup11544304 +Ref: 3b9a11544304 +Ref: library/venv venv EnvBuilder install_scripts11545301 +Ref: 3b9c11545301 +Ref: library/venv venv create11546583 +Ref: c8b11546583 +Node: An example of extending EnvBuilder11547123 +Ref: library/venv an-example-of-extending-envbuilder11547250 +Ref: 3b9d11547250 +Ref: An example of extending EnvBuilder-Footnote-111557987 +Node: zipapp — Manage executable Python zip archives11558034 +Ref: library/zipapp doc11558204 +Ref: 3b9e11558204 +Ref: library/zipapp module-zipapp11558204 +Ref: 14c11558204 +Ref: library/zipapp pip11558204 +Ref: 3b9f11558204 +Ref: library/zipapp zipapp-manage-executable-python-zip-archives11558204 +Ref: 3ba011558204 +Ref: zipapp — Manage executable Python zip archives-Footnote-111558981 +Node: Basic Example11559047 +Ref: library/zipapp basic-example11559179 +Ref: 3ba311559179 +Node: Command-Line Interface<5>11559584 +Ref: library/zipapp command-line-interface11559735 +Ref: 3ba411559735 +Ref: library/zipapp zipapp-command-line-interface11559735 +Ref: 3ba111559735 +Ref: library/zipapp cmdoption-zipapp-o11560231 +Ref: 3ba511560231 +Ref: library/zipapp cmdoption-zipapp-output11560231 +Ref: 3ba611560231 +Ref: library/zipapp cmdoption-zipapp-p11560736 +Ref: 3ba711560736 +Ref: library/zipapp cmdoption-zipapp-python11560736 +Ref: 3ba811560736 +Ref: library/zipapp cmdoption-zipapp-m11561020 +Ref: 3ba911561020 +Ref: library/zipapp cmdoption-zipapp-main11561020 +Ref: 3baa11561020 +Ref: library/zipapp cmdoption-zipapp-c11561459 +Ref: 3bab11561459 +Ref: library/zipapp cmdoption-zipapp-compress11561459 +Ref: 3bac11561459 +Ref: library/zipapp cmdoption-zipapp-info11561744 +Ref: 3bad11561744 +Ref: library/zipapp cmdoption-zipapp-h11561955 +Ref: 3bae11561955 +Ref: library/zipapp cmdoption-zipapp-help11561955 +Ref: 3baf11561955 +Node: Python API11562031 +Ref: library/zipapp python-api11562181 +Ref: 3bb011562181 +Ref: library/zipapp zipapp-python-api11562181 +Ref: 3ba211562181 +Ref: library/zipapp zipapp create_archive11562269 +Ref: 81311562269 +Ref: library/zipapp zipapp get_interpreter11566052 +Ref: 3bb111566052 +Node: Examples<31>11566409 +Ref: library/zipapp examples11566560 +Ref: 3bb211566560 +Ref: library/zipapp zipapp-examples11566560 +Ref: 3bb311566560 +Node: Specifying the Interpreter11567925 +Ref: library/zipapp specifying-the-interpreter11568110 +Ref: 3bb411568110 +Ref: library/zipapp zipapp-specifying-the-interpreter11568110 +Ref: 3bb511568110 +Node: Creating Standalone Applications with zipapp11569349 +Ref: library/zipapp creating-standalone-applications-with-zipapp11569563 +Ref: 3bb611569563 +Node: Making a Windows executable11571605 +Ref: library/zipapp making-a-windows-executable11571729 +Ref: 3bb711571729 +Node: Caveats11574856 +Ref: library/zipapp caveats11574980 +Ref: 3bb811574980 +Node: The Python Zip Application Archive Format11576770 +Ref: library/zipapp the-python-zip-application-archive-format11576949 +Ref: 3bb911576949 +Node: Python Runtime Services11578852 +Ref: library/python doc11579018 +Ref: 3bba11579018 +Ref: library/python python11579018 +Ref: 3bbb11579018 +Ref: library/python python-runtime-services11579018 +Ref: 3bbc11579018 +Node: sys — System-specific parameters and functions11579872 +Ref: library/sys doc11580057 +Ref: 3bbd11580057 +Ref: library/sys module-sys11580057 +Ref: f911580057 +Ref: library/sys sys-system-specific-parameters-and-functions11580057 +Ref: 3bbe11580057 +Ref: library/sys sys abiflags11580416 +Ref: 6b511580416 +Ref: library/sys sys addaudithook11580739 +Ref: 3a3e11580739 +Ref: library/sys sys argv11582311 +Ref: f1f11582311 +Ref: library/sys auditing11583238 +Ref: 12c011583238 +Ref: library/sys sys audit11583238 +Ref: 138711583238 +Ref: library/sys sys base_exec_prefix11584638 +Ref: 3b9311584638 +Ref: library/sys sys base_prefix11585284 +Ref: 351211585284 +Ref: library/sys sys byteorder11585920 +Ref: 1be511585920 +Ref: library/sys sys builtin_module_names11586176 +Ref: 16ac11586176 +Ref: library/sys sys call_tracing11586509 +Ref: 122011586509 +Ref: library/sys sys copyright11586778 +Ref: 3bbf11586778 +Ref: library/sys sys _clear_type_cache11586886 +Ref: 3bc011586886 +Ref: library/sys sys _current_frames11587212 +Ref: 109a11587212 +Ref: library/sys sys _current_exceptions11588082 +Ref: 133511588082 +Ref: library/sys sys breakpointhook11588626 +Ref: 72e11588626 +Ref: library/sys sys _debugmallocstats11590524 +Ref: 3bc111590524 +Ref: library/sys sys dllhandle11591008 +Ref: 3bc211591008 +Ref: library/sys sys displayhook11591130 +Ref: 115811591130 +Ref: library/sys sys dont_write_bytecode11592657 +Ref: 3bc311592657 +Ref: library/sys sys _emscripten_info11593056 +Ref: 11e711593056 +Ref: library/sys sys pycache_prefix11594472 +Ref: 5f411594472 +Ref: library/sys sys excepthook11595443 +Ref: 3fe11595443 +Ref: library/sys sys __breakpointhook__11596768 +Ref: 3bc411596768 +Ref: library/sys sys __displayhook__11596801 +Ref: 3bc511596801 +Ref: library/sys sys __excepthook__11596831 +Ref: 3bc611596831 +Ref: library/sys sys __unraisablehook__11596860 +Ref: 3bc711596860 +Ref: library/sys sys exception11597368 +Ref: 25c11597368 +Ref: library/sys sys exc_info11597836 +Ref: 25b11597836 +Ref: library/sys sys exec_prefix11598842 +Ref: 3b9211598842 +Ref: library/sys sys executable11599762 +Ref: 6be11599762 +Ref: library/sys sys exit11600063 +Ref: fec11600063 +Ref: library/sys sys flags11601736 +Ref: 25d11601736 +Ref: library/sys sys float_info11605340 +Ref: 141611605340 +Ref: library/sys sys float_repr_style11610682 +Ref: fa011610682 +Ref: library/sys sys getallocatedblocks11611221 +Ref: c6711611221 +Ref: library/sys sys getandroidapilevel11611858 +Ref: 7ec11611858 +Ref: library/sys sys getdefaultencoding11612033 +Ref: 3bc911612033 +Ref: library/sys sys getdlopenflags11612176 +Ref: 114911612176 +Ref: library/sys sys getfilesystemencoding11612488 +Ref: 8c811612488 +Ref: library/sys sys getfilesystemencodeerrors11613895 +Ref: 95411613895 +Ref: library/sys sys get_int_max_str_digits11614634 +Ref: 1cd511614634 +Ref: library/sys sys getrefcount11614860 +Ref: 3bca11614860 +Ref: library/sys sys getrecursionlimit11615118 +Ref: 116f11615118 +Ref: library/sys sys getsizeof11615431 +Ref: 11c011615431 +Ref: library/sys sys getswitchinterval11616383 +Ref: 59811616383 +Ref: library/sys sys _getframe11616553 +Ref: 115c11616553 +Ref: library/sys sys getprofile11617209 +Ref: 104811617209 +Ref: library/sys sys gettrace11617310 +Ref: 104911617310 +Ref: library/sys sys getwindowsversion11617750 +Ref: 95511617750 +Ref: library/sys sys get_asyncgen_hooks11620279 +Ref: 122111620279 +Ref: library/sys sys get_coroutine_origin_tracking_depth11620886 +Ref: 7ed11620886 +Ref: library/sys sys hash_info11621236 +Ref: ca111621236 +Ref: library/sys sys hexversion11622942 +Ref: 3bcc11622942 +Ref: library/sys sys implementation11623835 +Ref: d1911623835 +Ref: library/sys sys int_info11626036 +Ref: f4211626036 +Ref: library/sys sys __interactivehook__11627999 +Ref: c6911627999 +Ref: library/sys sys intern11628545 +Ref: f7f11628545 +Ref: library/sys sys is_finalizing11629313 +Ref: afe11629313 +Ref: library/sys sys last_type11629494 +Ref: f6f11629494 +Ref: library/sys sys last_value11629518 +Ref: 3bce11629518 +Ref: library/sys sys last_traceback11629543 +Ref: 3ab611629543 +Ref: library/sys sys maxsize11630197 +Ref: e7711630197 +Ref: library/sys sys maxunicode11630419 +Ref: cfc11630419 +Ref: library/sys sys meta_path11630818 +Ref: 9a011630818 +Ref: library/sys sys modules11632152 +Ref: 138211632152 +Ref: library/sys sys orig_argv11632760 +Ref: 43711632760 +Ref: library/sys sys path11632940 +Ref: 16211632940 +Ref: library/sys sys path_hooks11634212 +Ref: cd011634212 +Ref: library/sys sys path_importer_cache11634503 +Ref: 1b211634503 +Ref: library/sys sys platform11635029 +Ref: 6e011635029 +Ref: library/sys sys platlibdir11637640 +Ref: 58011637640 +Ref: library/sys sys prefix11638642 +Ref: 3b9111638642 +Ref: library/sys sys ps111639267 +Ref: 178911639267 +Ref: library/sys sys ps211639285 +Ref: 178a11639285 +Ref: library/sys sys setdlopenflags11639761 +Ref: dca11639761 +Ref: library/sys sys set_int_max_str_digits11640361 +Ref: 118411640361 +Ref: library/sys sys setprofile11640596 +Ref: 113811640596 +Ref: library/sys sys setrecursionlimit11642737 +Ref: 117011642737 +Ref: library/sys sys setswitchinterval11643529 +Ref: 59911643529 +Ref: library/sys sys settrace11644106 +Ref: 113911644106 +Ref: library/sys sys set_asyncgen_hooks11648644 +Ref: 122211648644 +Ref: library/sys sys set_coroutine_origin_tracking_depth11649748 +Ref: 7ee11649748 +Ref: library/sys sys _enablelegacywindowsfsencoding11650563 +Ref: 8ca11650563 +Ref: library/sys sys stdin11651144 +Ref: 72911651144 +Ref: library/sys sys stdout11651164 +Ref: 72a11651164 +Ref: library/sys sys stderr11651185 +Ref: 58111651185 +Ref: library/sys sys __stdin__11654340 +Ref: 3bd211654340 +Ref: library/sys sys __stdout__11654364 +Ref: 229b11654364 +Ref: library/sys sys __stderr__11654389 +Ref: 39c311654389 +Ref: library/sys sys stdlib_module_names11655354 +Ref: 43811655354 +Ref: library/sys sys thread_info11656087 +Ref: e0011656087 +Ref: library/sys sys tracebacklimit11657738 +Ref: 3bd311657738 +Ref: library/sys sys unraisablehook11658102 +Ref: 24e11658102 +Ref: library/sys sys version11659836 +Ref: 99011659836 +Ref: library/sys sys api_version11660238 +Ref: 3bd411660238 +Ref: library/sys sys version_info11660426 +Ref: 27d11660426 +Ref: library/sys sys warnoptions11661047 +Ref: 80d11661047 +Ref: library/sys sys winver11661266 +Ref: 3bd511661266 +Ref: library/sys sys _xoptions11661704 +Ref: 178411661704 +Ref: library/sys c9911662503 +Ref: 3bc811662503 +Ref: sys — System-specific parameters and functions-Footnote-111662715 +Ref: sys — System-specific parameters and functions-Footnote-211662757 +Ref: sys — System-specific parameters and functions-Footnote-311662799 +Ref: sys — System-specific parameters and functions-Footnote-411662841 +Ref: sys — System-specific parameters and functions-Footnote-511662893 +Ref: sys — System-specific parameters and functions-Footnote-611662935 +Ref: sys — System-specific parameters and functions-Footnote-711662977 +Ref: sys — System-specific parameters and functions-Footnote-811663019 +Ref: sys — System-specific parameters and functions-Footnote-911663061 +Ref: sys — System-specific parameters and functions-Footnote-1011663103 +Ref: sys — System-specific parameters and functions-Footnote-1111663146 +Ref: sys — System-specific parameters and functions-Footnote-1211663189 +Ref: sys — System-specific parameters and functions-Footnote-1311663232 +Ref: sys — System-specific parameters and functions-Footnote-1411663275 +Ref: sys — System-specific parameters and functions-Footnote-1511663318 +Ref: sys — System-specific parameters and functions-Footnote-1611663399 +Ref: sys — System-specific parameters and functions-Footnote-1711663442 +Ref: sys — System-specific parameters and functions-Footnote-1811663485 +Node: sysconfig — Provide access to Python’s configuration information11663528 +Ref: library/sysconfig doc11663751 +Ref: 3bd611663751 +Ref: library/sysconfig module-sysconfig11663751 +Ref: fa11663751 +Ref: library/sysconfig sysconfig-provide-access-to-python-s-configuration-information11663751 +Ref: 3bd711663751 +Ref: sysconfig — Provide access to Python’s configuration information-Footnote-111664393 +Node: Configuration variables11664462 +Ref: library/sysconfig configuration-variables11664617 +Ref: 3bd811664617 +Ref: library/sysconfig sysconfig get_config_vars11665110 +Ref: cd811665110 +Ref: library/sysconfig sysconfig get_config_var11665481 +Ref: cd711665481 +Node: Installation paths11665924 +Ref: library/sysconfig id111666106 +Ref: 3bd911666106 +Ref: library/sysconfig installation-paths11666106 +Ref: 25f11666106 +Ref: library/sysconfig sysconfig get_scheme_names11668598 +Ref: 3bda11668598 +Ref: library/sysconfig sysconfig get_default_scheme11668736 +Ref: 121011668736 +Ref: library/sysconfig sysconfig get_preferred_scheme11669098 +Ref: 26011669098 +Ref: library/sysconfig sysconfig _get_preferred_schemes11669687 +Ref: 3bdb11669687 +Ref: library/sysconfig sysconfig get_path_names11670352 +Ref: 3bdc11670352 +Ref: library/sysconfig sysconfig get_path11670491 +Ref: fc811670491 +Ref: library/sysconfig sysconfig get_paths11671710 +Ref: f0211671710 +Node: Other functions<3>11672333 +Ref: library/sysconfig other-functions11672519 +Ref: 3bdd11672519 +Ref: library/sysconfig sysconfig get_python_version11672570 +Ref: f0111672570 +Ref: library/sysconfig sysconfig get_platform11672741 +Ref: f0011672741 +Ref: library/sysconfig sysconfig is_python_build11673744 +Ref: fc911673744 +Ref: library/sysconfig sysconfig parse_config_h11674035 +Ref: 3bde11674035 +Ref: library/sysconfig sysconfig get_config_h_filename11674429 +Ref: 3bdf11674429 +Ref: library/sysconfig sysconfig get_makefile_filename11674522 +Ref: 3be011674522 +Node: Using sysconfig as a script11674613 +Ref: library/sysconfig using-sysconfig-as-a-script11674772 +Ref: 3be111674772 +Node: builtins — Built-in objects11675845 +Ref: library/builtins doc11676059 +Ref: 3be211676059 +Ref: library/builtins builtins-built-in-objects11676059 +Ref: 3be311676059 +Ref: library/builtins module-builtins11676059 +Ref: 1111676059 +Node: __main__ — Top-level code environment11677559 +Ref: library/__main__ doc11677733 +Ref: 3be411677733 +Ref: library/__main__ main-top-level-code-environment11677733 +Ref: 3be511677733 +Ref: library/__main__ module-__main__11677733 +Ref: 111677733 +Node: __name__ == '__main__'11678566 +Ref: library/__main__ name-equals-main11678703 +Ref: 3be611678703 +Ref: library/__main__ name-main11678703 +Ref: 3be711678703 +Node: What is the “top-level code environment”?11679479 +Ref: library/__main__ what-is-the-top-level-code-environment11679607 +Ref: 3be811679607 +Node: Idiomatic Usage11681700 +Ref: library/__main__ idiomatic-usage11681861 +Ref: 3be911681861 +Node: Packaging Considerations11683842 +Ref: library/__main__ packaging-considerations11683949 +Ref: 3bea11683949 +Ref: Packaging Considerations-Footnote-111685457 +Ref: Packaging Considerations-Footnote-211685486 +Node: __main__ py in Python Packages11685524 +Ref: library/__main__ main-py-in-python-packages11685685 +Ref: 3beb11685685 +Node: Idiomatic Usage<2>11687093 +Ref: library/__main__ id111687178 +Ref: 3bec11687178 +Node: import __main__11688517 +Ref: library/__main__ import-main11688647 +Ref: 3bed11688647 +Node: warnings — Warning control11691833 +Ref: library/warnings doc11692006 +Ref: 3bee11692006 +Ref: library/warnings module-warnings11692006 +Ref: 13011692006 +Ref: library/warnings warnings-warning-control11692006 +Ref: 3bef11692006 +Ref: warnings — Warning control-Footnote-111694320 +Node: Warning Categories11694388 +Ref: library/warnings id111694499 +Ref: 3bf311694499 +Ref: library/warnings warning-categories11694499 +Ref: 1d0b11694499 +Node: The Warnings Filter11698503 +Ref: library/warnings the-warnings-filter11698655 +Ref: 3bf411698655 +Ref: library/warnings warning-filter11698655 +Ref: 50411698655 +Node: Describing Warning Filters11701798 +Ref: library/warnings describing-warning-filters11701911 +Ref: 178011701911 +Ref: library/warnings id211701911 +Ref: 3bf511701911 +Node: Default Warning Filter11703636 +Ref: library/warnings default-warning-filter11703787 +Ref: 3bf611703787 +Ref: library/warnings id311703787 +Ref: 3bf711703787 +Node: Overriding the default filter11704887 +Ref: library/warnings overriding-the-default-filter11705003 +Ref: 3bf811705003 +Ref: library/warnings warning-disable11705003 +Ref: 3bf911705003 +Node: Temporarily Suppressing Warnings11706438 +Ref: library/warnings temporarily-suppressing-warnings11706588 +Ref: 3bfa11706588 +Ref: library/warnings warning-suppress11706588 +Ref: 3bfb11706588 +Node: Testing Warnings11707604 +Ref: library/warnings testing-warnings11707781 +Ref: 3bfc11707781 +Ref: library/warnings warning-testing11707781 +Ref: 3bfd11707781 +Node: Updating Code For New Versions of Dependencies11709843 +Ref: library/warnings updating-code-for-new-versions-of-dependencies11710007 +Ref: 3bfe11710007 +Ref: library/warnings warning-ignored11710007 +Ref: 38ae11710007 +Node: Available Functions11711397 +Ref: library/warnings available-functions11711571 +Ref: 3bff11711571 +Ref: library/warnings warning-functions11711571 +Ref: 3c0011711571 +Ref: library/warnings warnings warn11711630 +Ref: 115211711630 +Ref: library/warnings warnings warn_explicit11712849 +Ref: 96f11712849 +Ref: library/warnings warnings showwarning11714038 +Ref: 3bf211714038 +Ref: library/warnings warnings formatwarning11714676 +Ref: 144611714676 +Ref: library/warnings warnings filterwarnings11715108 +Ref: 110211715108 +Ref: library/warnings warnings simplefilter11715784 +Ref: 28911715784 +Ref: library/warnings warnings resetwarnings11716220 +Ref: 3bf111716220 +Node: Available Context Managers11716488 +Ref: library/warnings available-context-managers11716607 +Ref: 3c0111716607 +Ref: library/warnings warnings catch_warnings11716682 +Ref: 28811716682 +Node: dataclasses — Data Classes11718281 +Ref: library/dataclasses doc11718467 +Ref: 3c0211718467 +Ref: library/dataclasses dataclasses-data-classes11718467 +Ref: 3c0311718467 +Ref: library/dataclasses module-dataclasses11718467 +Ref: 2e11718467 +Ref: dataclasses — Data Classes-Footnote-111720160 +Ref: dataclasses — Data Classes-Footnote-211720231 +Ref: dataclasses — Data Classes-Footnote-311720273 +Node: Module contents<4>11720315 +Ref: library/dataclasses module-contents11720427 +Ref: 3c0411720427 +Ref: library/dataclasses dataclasses dataclass11720478 +Ref: 19311720478 +Ref: library/dataclasses dataclasses field11729490 +Ref: 145111729490 +Ref: library/dataclasses dataclasses Field11733968 +Ref: 1cae11733968 +Ref: library/dataclasses dataclasses fields11734773 +Ref: 3c0611734773 +Ref: library/dataclasses dataclasses asdict11735152 +Ref: 127011735152 +Ref: library/dataclasses dataclasses astuple11736226 +Ref: 126f11736226 +Ref: library/dataclasses dataclasses make_dataclass11736984 +Ref: 3c0811736984 +Ref: library/dataclasses dataclasses replace11738655 +Ref: 12ca11738655 +Ref: library/dataclasses dataclasses is_dataclass11740048 +Ref: 126d11740048 +Ref: library/dataclasses dataclasses MISSING11740489 +Ref: 3c0711740489 +Ref: library/dataclasses dataclasses KW_ONLY11740592 +Ref: 3c0511740592 +Ref: library/dataclasses dataclasses FrozenInstanceError11741552 +Ref: 3c0911741552 +Ref: Module contents<4>-Footnote-111741844 +Node: Post-init processing11741925 +Ref: library/dataclasses post-init-processing11742061 +Ref: 3c0a11742061 +Node: Class variables11743771 +Ref: library/dataclasses class-variables11743908 +Ref: 3c0b11743908 +Ref: Class variables-Footnote-111744458 +Node: Init-only variables11744500 +Ref: library/dataclasses init-only-variables11744633 +Ref: 3c0c11744633 +Node: Frozen instances11745838 +Ref: library/dataclasses frozen-instances11745970 +Ref: 3c0d11745970 +Node: Inheritance<2>11746554 +Ref: library/dataclasses inheritance11746717 +Ref: 3c0e11746717 +Node: Re-ordering of keyword-only parameters in __init__11747763 +Ref: library/dataclasses re-ordering-of-keyword-only-parameters-in-init11747935 +Ref: 3c0f11747935 +Node: Default factory functions11749184 +Ref: library/dataclasses default-factory-functions11749364 +Ref: 3c1011749364 +Node: Mutable default values11749984 +Ref: library/dataclasses mutable-default-values11750137 +Ref: 3c1111750137 +Node: Descriptor-typed fields11752102 +Ref: library/dataclasses descriptor-typed-fields11752221 +Ref: 3c1211752221 +Node: contextlib — Utilities for with-statement contexts11754133 +Ref: library/contextlib doc11754320 +Ref: 3c1311754320 +Ref: library/contextlib contextlib-utilities-for-with-statement-contexts11754320 +Ref: 3c1411754320 +Ref: library/contextlib module-contextlib11754320 +Ref: 2211754320 +Ref: contextlib — Utilities for with-statement contexts-Footnote-111754982 +Node: Utilities11755052 +Ref: library/contextlib utilities11755182 +Ref: 3c1511755182 +Ref: library/contextlib contextlib AbstractContextManager11755254 +Ref: 8fe11755254 +Ref: library/contextlib contextlib AbstractAsyncContextManager11755742 +Ref: 78011755742 +Ref: library/contextlib contextlib contextmanager11756248 +Ref: eb111756248 +Ref: library/contextlib contextlib asynccontextmanager11759252 +Ref: 77f11759252 +Ref: library/contextlib contextlib closing11761480 +Ref: 3c1611761480 +Ref: library/contextlib contextlib aclosing11762277 +Ref: 3df11762277 +Ref: library/contextlib simplifying-support-for-single-optional-context-managers11763396 +Ref: 3c1711763396 +Ref: library/contextlib contextlib nullcontext11763396 +Ref: 3e011763396 +Ref: library/contextlib contextlib suppress11765105 +Ref: bbd11765105 +Ref: library/contextlib contextlib redirect_stdout11766222 +Ref: a6911766222 +Ref: library/contextlib contextlib redirect_stderr11767694 +Ref: a6811767694 +Ref: library/contextlib contextlib chdir11767956 +Ref: 1e511767956 +Ref: library/contextlib contextlib ContextDecorator11768685 +Ref: eb011768685 +Ref: library/contextlib contextlib AsyncContextDecorator11771123 +Ref: 3c1911771123 +Ref: library/contextlib contextlib ExitStack11772212 +Ref: 77e11772212 +Ref: library/contextlib contextlib ExitStack enter_context11774201 +Ref: 19f11774201 +Ref: library/contextlib contextlib ExitStack push11774768 +Ref: 3c1a11774768 +Ref: library/contextlib contextlib ExitStack callback11775626 +Ref: 6d511775626 +Ref: library/contextlib contextlib ExitStack pop_all11776082 +Ref: 3c1b11776082 +Ref: library/contextlib contextlib ExitStack close11777134 +Ref: 3c1c11777134 +Ref: library/contextlib contextlib AsyncExitStack11777422 +Ref: 78111777422 +Ref: library/contextlib contextlib AsyncExitStack enter_async_context11777782 +Ref: 1a211777782 +Ref: library/contextlib contextlib AsyncExitStack push_async_exit11778105 +Ref: 3c1e11778105 +Ref: library/contextlib contextlib AsyncExitStack push_async_callback11778267 +Ref: 6d611778267 +Ref: library/contextlib contextlib AsyncExitStack aclose11778407 +Ref: 3c1d11778407 +Node: Examples and Recipes<2>11778991 +Ref: library/contextlib examples-and-recipes11779180 +Ref: 3c1f11779180 +Node: Supporting a variable number of context managers11779628 +Ref: library/contextlib supporting-a-variable-number-of-context-managers11779787 +Ref: 3c2011779787 +Node: Catching exceptions from __enter__ methods11780829 +Ref: library/contextlib catching-exceptions-from-enter-methods11781039 +Ref: 3c2111781039 +Node: Cleaning up in an __enter__ implementation11782188 +Ref: library/contextlib cleaning-up-in-an-enter-implementation11782401 +Ref: 3c2211782401 +Node: Replacing any use of try-finally and flag variables11784298 +Ref: library/contextlib replacing-any-use-of-try-finally-and-flag-variables11784516 +Ref: 3c2311784516 +Node: Using a context manager as a function decorator11787031 +Ref: library/contextlib using-a-context-manager-as-a-function-decorator11787198 +Ref: 3c2411787198 +Ref: Using a context manager as a function decorator-Footnote-111789027 +Node: Single use reusable and reentrant context managers11789069 +Ref: library/contextlib single-use-reusable-and-reentrant-cms11789240 +Ref: bbf11789240 +Ref: library/contextlib single-use-reusable-and-reentrant-context-managers11789240 +Ref: 3c2511789240 +Node: Reentrant context managers11790777 +Ref: library/contextlib reentrant-cms11790924 +Ref: 3c1811790924 +Ref: library/contextlib reentrant-context-managers11790924 +Ref: 3c2611790924 +Node: Reusable context managers11792461 +Ref: library/contextlib reusable-cms11792608 +Ref: 3c2711792608 +Ref: library/contextlib reusable-context-managers11792608 +Ref: 3c2811792608 +Node: abc — Abstract Base Classes11795286 +Ref: library/abc doc11795469 +Ref: 3c2911795469 +Ref: library/abc abc-abstract-base-classes11795469 +Ref: 3c2a11795469 +Ref: library/abc module-abc11795469 +Ref: 311795469 +Ref: library/abc abc ABC11796434 +Ref: ba911796434 +Ref: library/abc abc ABCMeta11797279 +Ref: baa11797279 +Ref: library/abc abc ABCMeta register11798059 +Ref: d3a11798059 +Ref: library/abc abc ABCMeta __subclasshook__11798741 +Ref: 3c2b11798741 +Ref: library/abc abc abstractmethod11801627 +Ref: d3711801627 +Ref: library/abc abc abstractclassmethod11804793 +Ref: d3811804793 +Ref: library/abc abc abstractstaticmethod11805509 +Ref: d3911805509 +Ref: library/abc abc abstractproperty11806227 +Ref: d3611806227 +Ref: library/abc abc get_cache_token11807614 +Ref: ba811807614 +Ref: library/abc abc update_abstractmethods11807991 +Ref: 3c2c11807991 +Ref: abc — Abstract Base Classes-Footnote-111808644 +Ref: abc — Abstract Base Classes-Footnote-211808707 +Ref: abc — Abstract Base Classes-Footnote-311808749 +Ref: abc — Abstract Base Classes-Footnote-411808791 +Node: atexit — Exit handlers11808898 +Ref: library/atexit doc11809078 +Ref: 3c2d11809078 +Ref: library/atexit atexit-exit-handlers11809078 +Ref: 3c2e11809078 +Ref: library/atexit module-atexit11809078 +Ref: b11809078 +Ref: library/atexit atexit register11809986 +Ref: 4a011809986 +Ref: library/atexit atexit unregister11811038 +Ref: 3c2f11811038 +Node: atexit Example11811728 +Ref: library/atexit atexit-example11811803 +Ref: 3c3011811803 +Ref: library/atexit id111811803 +Ref: 3c3111811803 +Node: traceback — Print or retrieve a stack traceback11813164 +Ref: library/traceback doc11813358 +Ref: 3c3211813358 +Ref: library/traceback module-traceback11813358 +Ref: 11d11813358 +Ref: library/traceback traceback-print-or-retrieve-a-stack-traceback11813358 +Ref: 3c3311813358 +Ref: library/traceback traceback print_tb11814138 +Ref: b1311814138 +Ref: library/traceback traceback print_exception11814689 +Ref: 44611814689 +Ref: library/traceback traceback print_exc11816184 +Ref: 127d11816184 +Ref: library/traceback traceback print_last11816350 +Ref: 3c3411816350 +Ref: library/traceback traceback print_stack11816677 +Ref: b1411816677 +Ref: library/traceback traceback extract_tb11817222 +Ref: 3c3511817222 +Ref: library/traceback traceback extract_stack11817963 +Ref: 3c3611817963 +Ref: library/traceback traceback format_list11818266 +Ref: 3c3711818266 +Ref: library/traceback traceback format_exception_only11818775 +Ref: 44511818775 +Ref: library/traceback traceback format_exception11819686 +Ref: 44411819686 +Ref: library/traceback traceback format_exc11820426 +Ref: 3c3811820426 +Ref: library/traceback traceback format_tb11820586 +Ref: 3b8311820586 +Ref: library/traceback traceback format_stack11820702 +Ref: 3c3911820702 +Ref: library/traceback traceback clear_frames11820827 +Ref: c7611820827 +Ref: library/traceback traceback walk_stack11821036 +Ref: b0f11821036 +Ref: library/traceback traceback walk_tb11821346 +Ref: b1011821346 +Ref: traceback — Print or retrieve a stack traceback-Footnote-111821778 +Node: TracebackException Objects11821847 +Ref: library/traceback tracebackexception-objects11821988 +Ref: 3c3b11821988 +Ref: library/traceback traceback TracebackException11822228 +Ref: 26a11822228 +Ref: library/traceback traceback TracebackException __cause__11822927 +Ref: 3c3c11822927 +Ref: library/traceback traceback TracebackException __context__11823035 +Ref: 3c3d11823035 +Ref: library/traceback traceback TracebackException __suppress_context__11823157 +Ref: 3c3e11823157 +Ref: library/traceback traceback TracebackException __notes__11823276 +Ref: 3c3f11823276 +Ref: library/traceback traceback TracebackException stack11823567 +Ref: 3c4011823567 +Ref: library/traceback traceback TracebackException exc_type11823660 +Ref: 3c4111823660 +Ref: library/traceback traceback TracebackException filename11823738 +Ref: 3c4211823738 +Ref: library/traceback traceback TracebackException lineno11823839 +Ref: 3c4311823839 +Ref: library/traceback traceback TracebackException text11823940 +Ref: 3c4411823940 +Ref: library/traceback traceback TracebackException offset11824032 +Ref: 3c4511824032 +Ref: library/traceback traceback TracebackException msg11824152 +Ref: 3c4611824152 +Ref: library/traceback traceback TracebackException from_exception11824236 +Ref: 3c4711824236 +Ref: library/traceback traceback TracebackException print11824619 +Ref: 26911824619 +Ref: library/traceback traceback TracebackException format11824825 +Ref: 3c4811824825 +Ref: library/traceback traceback TracebackException format_exception_only11825372 +Ref: 3c4911825372 +Node: StackSummary Objects11825981 +Ref: library/traceback stacksummary-objects11826151 +Ref: 3c4a11826151 +Ref: library/traceback traceback StackSummary11826322 +Ref: b1111826322 +Ref: library/traceback traceback StackSummary extract11826357 +Ref: 3c3a11826357 +Ref: library/traceback traceback StackSummary from_list11827182 +Ref: 3c4b11827182 +Ref: library/traceback traceback StackSummary format11827485 +Ref: 3c4c11827485 +Ref: library/traceback traceback StackSummary format_frame_summary11828105 +Ref: 26811828105 +Node: FrameSummary Objects11828495 +Ref: library/traceback framesummary-objects11828657 +Ref: 3c4d11828657 +Ref: library/traceback traceback FrameSummary11828826 +Ref: b1211828826 +Node: Traceback Examples11829571 +Ref: library/traceback traceback-example11829704 +Ref: 3c4e11829704 +Ref: library/traceback traceback-examples11829704 +Ref: 3c4f11829704 +Node: __future__ — Future statement definitions11834945 +Ref: library/__future__ doc11835149 +Ref: 3c5011835149 +Ref: library/__future__ future-future-statement-definitions11835149 +Ref: 3c5111835149 +Ref: library/__future__ module-__future__11835149 +Ref: 011835149 +Ref: __future__ — Future statement definitions-Footnote-111840352 +Ref: __future__ — Future statement definitions-Footnote-211840422 +Ref: __future__ — Future statement definitions-Footnote-311840464 +Ref: __future__ — Future statement definitions-Footnote-411840506 +Ref: __future__ — Future statement definitions-Footnote-511840548 +Ref: __future__ — Future statement definitions-Footnote-611840590 +Ref: __future__ — Future statement definitions-Footnote-711840632 +Ref: __future__ — Future statement definitions-Footnote-811840674 +Ref: __future__ — Future statement definitions-Footnote-911840716 +Ref: __future__ — Future statement definitions-Footnote-1011840758 +Ref: __future__ — Future statement definitions-Footnote-1111841345 +Node: gc — Garbage Collector interface11841388 +Ref: library/gc doc11841575 +Ref: 3c5211841575 +Ref: library/gc gc-garbage-collector-interface11841575 +Ref: 3c5311841575 +Ref: library/gc module-gc11841575 +Ref: 8011841575 +Ref: library/gc gc enable11842502 +Ref: 3c5411842502 +Ref: library/gc gc disable11842573 +Ref: 3c5511842573 +Ref: library/gc gc isenabled11842646 +Ref: 3c5611842646 +Ref: library/gc gc collect11842737 +Ref: 68711842737 +Ref: library/gc gc set_debug11843372 +Ref: 3c5711843372 +Ref: library/gc gc get_debug11843639 +Ref: 3c5811843639 +Ref: library/gc gc get_objects11843718 +Ref: 3f411843718 +Ref: library/gc gc get_stats11844135 +Ref: bde11844135 +Ref: library/gc gc set_threshold11844829 +Ref: 3c5911844829 +Ref: library/gc gc get_count11846055 +Ref: 3c5a11846055 +Ref: library/gc gc get_threshold11846180 +Ref: 3c5b11846180 +Ref: library/gc gc get_referrers11846325 +Ref: 3f511846325 +Ref: library/gc gc get_referents11847364 +Ref: 3f611847364 +Ref: library/gc gc is_tracked11848097 +Ref: fae11848097 +Ref: library/gc gc is_finalized11848922 +Ref: 54011848922 +Ref: library/gc gc freeze11849432 +Ref: 79011849432 +Ref: library/gc gc unfreeze11849966 +Ref: 79111849966 +Ref: library/gc gc get_freeze_count11850125 +Ref: 79211850125 +Ref: library/gc gc garbage11850368 +Ref: e7411850368 +Ref: library/gc gc callbacks11851223 +Ref: d7211851223 +Ref: library/gc gc DEBUG_STATS11852554 +Ref: 3c5d11852554 +Ref: library/gc gc DEBUG_COLLECTABLE11852697 +Ref: 3c5e11852697 +Ref: library/gc gc DEBUG_UNCOLLECTABLE11852783 +Ref: e7511852783 +Ref: library/gc gc DEBUG_SAVEALL11853163 +Ref: 3c5c11853163 +Ref: library/gc gc DEBUG_LEAK11853355 +Ref: 3c5f11853355 +Ref: gc — Garbage Collector interface-Footnote-111853599 +Ref: gc — Garbage Collector interface-Footnote-211853688 +Node: inspect — Inspect live objects11853730 +Ref: library/inspect doc11853915 +Ref: 3c6011853915 +Ref: library/inspect inspect-inspect-live-objects11853915 +Ref: 3c6111853915 +Ref: library/inspect module-inspect11853915 +Ref: 9e11853915 +Ref: inspect — Inspect live objects-Footnote-111855087 +Node: Types and members11855154 +Ref: library/inspect inspect-types11855271 +Ref: 3c6211855271 +Ref: library/inspect types-and-members11855271 +Ref: 3c6311855271 +Ref: library/inspect inspect getmembers11869432 +Ref: 124b11869432 +Ref: library/inspect inspect getmembers_static11870039 +Ref: 21c11870039 +Ref: library/inspect inspect getmodulename11870776 +Ref: 9ac11870776 +Ref: library/inspect inspect ismodule11871453 +Ref: 3c6611871453 +Ref: library/inspect inspect isclass11871545 +Ref: 3c6711871545 +Ref: library/inspect inspect ismethod11871684 +Ref: 3c6811871684 +Ref: library/inspect inspect isfunction11871800 +Ref: 3c6911871800 +Ref: library/inspect inspect isgeneratorfunction11871978 +Ref: 11b311871978 +Ref: library/inspect inspect isgenerator11872271 +Ref: 3c6a11872271 +Ref: library/inspect inspect iscoroutinefunction11872369 +Ref: a9a11872369 +Ref: library/inspect inspect iscoroutine11872760 +Ref: a9911872760 +Ref: library/inspect inspect isawaitable11872946 +Ref: a9b11872946 +Ref: library/inspect inspect isasyncgenfunction11873396 +Ref: 11b411873396 +Ref: library/inspect inspect isasyncgen11873906 +Ref: 3c6b11873906 +Ref: library/inspect inspect istraceback11874134 +Ref: 3c6c11874134 +Ref: library/inspect inspect isframe11874232 +Ref: 3c6d11874232 +Ref: library/inspect inspect iscode11874322 +Ref: 3c6e11874322 +Ref: library/inspect inspect isbuiltin11874410 +Ref: 3c6f11874410 +Ref: library/inspect inspect ismethodwrapper11874546 +Ref: 21d11874546 +Ref: library/inspect inspect isroutine11874849 +Ref: 123a11874849 +Ref: library/inspect inspect isabstract11874984 +Ref: 3c7011874984 +Ref: library/inspect inspect ismethoddescriptor11875092 +Ref: 3c7111875092 +Ref: library/inspect inspect isdatadescriptor11875975 +Ref: 3c7211875975 +Ref: library/inspect inspect isgetsetdescriptor11876604 +Ref: 3c7311876604 +Ref: library/inspect inspect ismemberdescriptor11876955 +Ref: 3c7411876955 +Node: Retrieving source code11877317 +Ref: library/inspect inspect-source11877492 +Ref: 3c7511877492 +Ref: library/inspect retrieving-source-code11877492 +Ref: 3c7611877492 +Ref: library/inspect inspect getdoc11877559 +Ref: 63f11877559 +Ref: library/inspect inspect getcomments11878067 +Ref: 37e111878067 +Ref: library/inspect inspect getfile11878491 +Ref: 14e511878491 +Ref: library/inspect inspect getmodule11878725 +Ref: 11d411878725 +Ref: library/inspect inspect getsourcefile11878885 +Ref: 11d511878885 +Ref: library/inspect inspect getsourcelines11879186 +Ref: 3c7811879186 +Ref: library/inspect inspect getsource11879805 +Ref: 129c11879805 +Ref: library/inspect inspect cleandoc11880255 +Ref: 3c7711880255 +Node: Introspecting callables with the Signature object11880666 +Ref: library/inspect inspect-signature-object11880848 +Ref: 3c7911880848 +Ref: library/inspect introspecting-callables-with-the-signature-object11880848 +Ref: 3c7a11880848 +Ref: library/inspect inspect signature11881165 +Ref: 30111881165 +Ref: library/inspect inspect Signature11883429 +Ref: 30311883429 +Ref: library/inspect inspect Signature empty11884460 +Ref: 3c7c11884460 +Ref: library/inspect inspect Signature parameters11884580 +Ref: 13b211884580 +Ref: library/inspect inspect Signature return_annotation11885075 +Ref: 3c7d11885075 +Ref: library/inspect inspect Signature bind11885294 +Ref: 3c7e11885294 +Ref: library/inspect inspect Signature bind_partial11885571 +Ref: 3c7f11885571 +Ref: library/inspect inspect Signature replace11885947 +Ref: 3c7b11885947 +Ref: library/inspect inspect Signature from_callable11886650 +Ref: 30411886650 +Ref: library/inspect inspect Parameter11887465 +Ref: a9711887465 +Ref: library/inspect inspect Parameter empty11887820 +Ref: 3c8111887820 +Ref: library/inspect inspect Parameter name11887951 +Ref: 3c8211887951 +Ref: library/inspect inspect Parameter default11888415 +Ref: 3c8311888415 +Ref: library/inspect inspect Parameter annotation11888606 +Ref: 3c8411888606 +Ref: library/inspect inspect Parameter kind11888794 +Ref: 3c8511888794 +Ref: library/inspect inspect Parameter kind description11891618 +Ref: 3c8611891618 +Ref: library/inspect inspect Parameter replace11892153 +Ref: 3c8011892153 +Ref: library/inspect inspect BoundArguments11893141 +Ref: d1711893141 +Ref: library/inspect inspect BoundArguments arguments11893345 +Ref: 55011893345 +Ref: library/inspect inspect BoundArguments args11894194 +Ref: 3c8711894194 +Ref: library/inspect inspect BoundArguments kwargs11894345 +Ref: 3c8811894345 +Ref: library/inspect inspect BoundArguments signature11894494 +Ref: 3c8911894494 +Ref: library/inspect inspect BoundArguments apply_defaults11894592 +Ref: a9811894592 +Ref: Introspecting callables with the Signature object-Footnote-111895569 +Node: Classes and functions<2>11895611 +Ref: library/inspect classes-and-functions11895792 +Ref: 3c8a11895792 +Ref: library/inspect inspect-classes-functions11895792 +Ref: 3c8b11895792 +Ref: library/inspect inspect getclasstree11895857 +Ref: 3c8c11895857 +Ref: library/inspect inspect getfullargspec11896436 +Ref: 30211896436 +Ref: library/inspect inspect getargvalues11898804 +Ref: b4c11898804 +Ref: library/inspect inspect formatargvalues11899309 +Ref: b4d11899309 +Ref: library/inspect inspect getmro11899779 +Ref: 3c8d11899779 +Ref: library/inspect inspect getcallargs11900143 +Ref: b4b11900143 +Ref: library/inspect inspect getclosurevars11901492 +Ref: d8011901492 +Ref: library/inspect inspect unwrap11902208 +Ref: bf711902208 +Ref: library/inspect inspect get_annotations11902942 +Ref: 40511902942 +Node: The interpreter stack11905818 +Ref: library/inspect inspect-stack11905980 +Ref: 3c8e11905980 +Ref: library/inspect the-interpreter-stack11905980 +Ref: 3c8f11905980 +Ref: library/inspect inspect FrameInfo11906302 +Ref: 21f11906302 +Ref: library/inspect inspect FrameInfo frame11906332 +Ref: 3c9011906332 +Ref: library/inspect inspect FrameInfo filename11906432 +Ref: 3c9111906432 +Ref: library/inspect inspect FrameInfo lineno11906578 +Ref: 3c9211906578 +Ref: library/inspect inspect FrameInfo function11906744 +Ref: 3c9311906744 +Ref: library/inspect inspect FrameInfo code_context11906877 +Ref: 3c9411906877 +Ref: library/inspect inspect FrameInfo index11907045 +Ref: 3c9511907045 +Ref: library/inspect inspect FrameInfo positions11907177 +Ref: 3c9611907177 +Ref: library/inspect inspect Traceback11907716 +Ref: 22011907716 +Ref: library/inspect inspect Traceback filename11907746 +Ref: 3c9811907746 +Ref: library/inspect inspect Traceback lineno11907895 +Ref: 3c9911907895 +Ref: library/inspect inspect Traceback function11908064 +Ref: 3c9a11908064 +Ref: library/inspect inspect Traceback code_context11908200 +Ref: 3c9b11908200 +Ref: library/inspect inspect Traceback index11908371 +Ref: 3c9c11908371 +Ref: library/inspect inspect Traceback positions11908503 +Ref: 3c9d11908503 +Ref: library/inspect inspect getframeinfo11910434 +Ref: 22211910434 +Ref: library/inspect inspect getouterframes11910701 +Ref: 22311910701 +Ref: library/inspect inspect getinnerframes11911308 +Ref: 22411911308 +Ref: library/inspect inspect currentframe11911911 +Ref: 3c9e11911911 +Ref: library/inspect inspect stack11912312 +Ref: 22511912312 +Ref: library/inspect inspect trace11912811 +Ref: 22611912811 +Node: Fetching attributes statically11913399 +Ref: library/inspect fetching-attributes-statically11913579 +Ref: 3c9f11913579 +Ref: library/inspect inspect getattr_static11914149 +Ref: ef411914149 +Node: Current State of Generators and Coroutines11915938 +Ref: library/inspect current-state-of-generators-and-coroutines11916119 +Ref: 3ca011916119 +Ref: library/inspect inspect getgeneratorstate11916548 +Ref: ef311916548 +Ref: library/inspect inspect getcoroutinestate11916961 +Ref: a9d11916961 +Ref: library/inspect inspect getgeneratorlocals11917796 +Ref: d8111917796 +Ref: library/inspect inspect getcoroutinelocals11918670 +Ref: a9c11918670 +Node: Code Objects Bit Flags11918905 +Ref: library/inspect code-objects-bit-flags11919081 +Ref: 3ca111919081 +Ref: library/inspect inspect-module-co-flags11919081 +Ref: 3c6411919081 +Ref: library/inspect inspect CO_OPTIMIZED11919244 +Ref: 3ca211919244 +Ref: library/inspect inspect CO_NEWLOCALS11919331 +Ref: 3ca311919331 +Ref: library/inspect inspect CO_VARARGS11919476 +Ref: 3ca411919476 +Ref: library/inspect inspect CO_VARKEYWORDS11919584 +Ref: 3ca511919584 +Ref: library/inspect inspect CO_NESTED11919696 +Ref: 3ca611919696 +Ref: library/inspect inspect CO_GENERATOR11919790 +Ref: 3ca711919790 +Ref: library/inspect inspect CO_COROUTINE11919965 +Ref: 3ca811919965 +Ref: library/inspect inspect CO_ITERABLE_COROUTINE11920200 +Ref: 3ca911920200 +Ref: library/inspect inspect CO_ASYNC_GENERATOR11920513 +Ref: 3caa11920513 +Ref: Code Objects Bit Flags-Footnote-111921158 +Ref: Code Objects Bit Flags-Footnote-211921200 +Ref: Code Objects Bit Flags-Footnote-311921242 +Node: Command Line Interface<3>11921284 +Ref: library/inspect command-line-interface11921409 +Ref: 3cab11921409 +Ref: library/inspect inspect-module-cli11921409 +Ref: bf611921409 +Ref: library/inspect cmdoption-inspect-details11921784 +Ref: 3cac11921784 +Node: site — Site-specific configuration hook11921899 +Ref: library/site doc11922041 +Ref: 3cad11922041 +Ref: library/site module-site11922041 +Ref: e811922041 +Ref: library/site site-site-specific-configuration-hook11922041 +Ref: 3cae11922041 +Ref: site — Site-specific configuration hook-Footnote-111927806 +Node: Readline configuration11927870 +Ref: library/site readline-configuration11927997 +Ref: 3cb011927997 +Ref: library/site rlcompleter-config11927997 +Ref: c6b11927997 +Node: Module contents<5>11928655 +Ref: library/site module-contents11928816 +Ref: 3cb111928816 +Ref: library/site site PREFIXES11928869 +Ref: 3cb211928869 +Ref: library/site site ENABLE_USER_SITE11928950 +Ref: 3caf11928950 +Ref: library/site site USER_SITE11929388 +Ref: 177b11929388 +Ref: library/site site USER_BASE11929939 +Ref: 178b11929939 +Ref: library/site site main11930510 +Ref: 177c11930510 +Ref: library/site site addsitedir11930859 +Ref: 3cb311930859 +Ref: library/site site getsitepackages11931065 +Ref: efc11931065 +Ref: library/site site getuserbase11931199 +Ref: efd11931199 +Ref: library/site site getusersitepackages11931444 +Ref: efe11931444 +Node: Command Line Interface<4>11931844 +Ref: library/site command-line-interface11931974 +Ref: 3cb411931974 +Ref: library/site site-commandline11931974 +Ref: 3cb511931974 +Ref: library/site cmdoption-site-user-base11932522 +Ref: 3cb611932522 +Ref: library/site cmdoption-site-user-site11932604 +Ref: 3cb711932604 +Ref: Command Line Interface<4>-Footnote-111933346 +Node: Custom Python Interpreters11933388 +Ref: library/custominterp doc11933536 +Ref: 3cb811933536 +Ref: library/custominterp custom-python-interpreters11933536 +Ref: 3cb911933536 +Ref: library/custominterp custominterp11933536 +Ref: 3cba11933536 +Node: code — Interpreter base classes11934121 +Ref: library/code doc11934256 +Ref: 3cbb11934256 +Ref: library/code code-interpreter-base-classes11934256 +Ref: 3cbc11934256 +Ref: library/code module-code11934256 +Ref: 1911934256 +Ref: library/code code InteractiveInterpreter11934674 +Ref: 3cbd11934674 +Ref: library/code code InteractiveConsole11935187 +Ref: 1e0111935187 +Ref: library/code code interact11935497 +Ref: 3cbe11935497 +Ref: library/code code compile_command11936256 +Ref: 3cc011936256 +Ref: code — Interpreter base classes-Footnote-111937542 +Node: Interactive Interpreter Objects11937606 +Ref: library/code interactive-interpreter-objects11937743 +Ref: 3cc111937743 +Ref: library/code interpreter-objects11937743 +Ref: 3cc211937743 +Ref: library/code code InteractiveInterpreter runsource11937826 +Ref: 3cc311937826 +Ref: library/code code InteractiveInterpreter runcode11939113 +Ref: 3cc511939113 +Ref: library/code code InteractiveInterpreter showsyntaxerror11939572 +Ref: 3cc411939572 +Ref: library/code code InteractiveInterpreter showtraceback11940046 +Ref: a5011940046 +Ref: library/code code InteractiveInterpreter write11940427 +Ref: 3cc611940427 +Node: Interactive Console Objects11940647 +Ref: library/code console-objects11940784 +Ref: 3cc711940784 +Ref: library/code interactive-console-objects11940784 +Ref: 3cc811940784 +Ref: library/code code InteractiveConsole interact11941048 +Ref: 3cc911941048 +Ref: library/code code InteractiveConsole push11941901 +Ref: 3cca11941901 +Ref: library/code code InteractiveConsole resetbuffer11942596 +Ref: 3ccb11942596 +Ref: library/code code InteractiveConsole raw_input11942705 +Ref: 3cbf11942705 +Node: codeop — Compile Python code11943065 +Ref: library/codeop doc11943200 +Ref: 3ccc11943200 +Ref: library/codeop codeop-compile-python-code11943200 +Ref: 3ccd11943200 +Ref: library/codeop module-codeop11943200 +Ref: 1b11943200 +Ref: library/codeop codeop compile_command11944161 +Ref: 136e11944161 +Ref: library/codeop codeop Compile11945563 +Ref: 3cce11945563 +Ref: library/codeop codeop CommandCompiler11945957 +Ref: 3ccf11945957 +Ref: codeop — Compile Python code-Footnote-111946368 +Node: Importing Modules11946434 +Ref: library/modules doc11946583 +Ref: 3cd011946583 +Ref: library/modules importing-modules11946583 +Ref: 3cd111946583 +Ref: library/modules modules11946583 +Ref: 3cd211946583 +Node: zipimport — Import modules from Zip archives11947467 +Ref: library/zipimport doc11947613 +Ref: 3cd311947613 +Ref: library/zipimport module-zipimport11947613 +Ref: 14e11947613 +Ref: library/zipimport zipimport-import-modules-from-zip-archives11947613 +Ref: 3cd411947613 +Ref: library/zipimport zipimport ZipImportError11949771 +Ref: 3cd511949771 +Ref: zipimport — Import modules from Zip archives-Footnote-111950063 +Ref: zipimport — Import modules from Zip archives-Footnote-211950132 +Ref: zipimport — Import modules from Zip archives-Footnote-311950200 +Ref: zipimport — Import modules from Zip archives-Footnote-411950242 +Ref: zipimport — Import modules from Zip archives-Footnote-511950284 +Node: zipimporter Objects11950326 +Ref: library/zipimport id111950449 +Ref: 3cd611950449 +Ref: library/zipimport zipimporter-objects11950449 +Ref: 3cd711950449 +Ref: library/zipimport zipimport zipimporter11950572 +Ref: 3cd811950572 +Ref: library/zipimport zipimport zipimporter create_module11951043 +Ref: 45a11951043 +Ref: library/zipimport zipimport zipimporter exec_module11951287 +Ref: 45b11951287 +Ref: library/zipimport zipimport zipimporter find_loader11951444 +Ref: 3cd911951444 +Ref: library/zipimport zipimport zipimporter find_module11951683 +Ref: 3cda11951683 +Ref: library/zipimport zipimport zipimporter find_spec11952199 +Ref: 45911952199 +Ref: library/zipimport zipimport zipimporter get_code11952379 +Ref: 3cdb11952379 +Ref: library/zipimport zipimport zipimporter get_data11952560 +Ref: 14fb11952560 +Ref: library/zipimport zipimport zipimporter get_filename11952832 +Ref: 3cdc11952832 +Ref: library/zipimport zipimport zipimporter get_source11953095 +Ref: 3cdd11953095 +Ref: library/zipimport zipimport zipimporter is_package11953385 +Ref: 3cde11953385 +Ref: library/zipimport zipimport zipimporter load_module11953596 +Ref: 3cdf11953596 +Ref: library/zipimport zipimport zipimporter invalidate_caches11953960 +Ref: 45c11953960 +Ref: library/zipimport zipimport zipimporter archive11954138 +Ref: 3ce011954138 +Ref: library/zipimport zipimport zipimporter prefix11954271 +Ref: 3ce111954271 +Node: Examples<32>11954678 +Ref: library/zipimport examples11954801 +Ref: 3ce211954801 +Ref: library/zipimport zipimport-examples11954801 +Ref: 3ce311954801 +Node: pkgutil — Package extension utility11955481 +Ref: library/pkgutil doc11955682 +Ref: 3ce411955682 +Ref: library/pkgutil module-pkgutil11955682 +Ref: ca11955682 +Ref: library/pkgutil pkgutil-package-extension-utility11955682 +Ref: 3ce511955682 +Ref: library/pkgutil pkgutil ModuleInfo11955967 +Ref: 9c611955967 +Ref: library/pkgutil pkgutil extend_path11956121 +Ref: 3ce611956121 +Ref: library/pkgutil pkgutil ImpImporter11957799 +Ref: 2e711957799 +Ref: library/pkgutil pkgutil ImpLoader11958497 +Ref: 2e811958497 +Ref: library/pkgutil pkgutil find_loader11958826 +Ref: 3ce711958826 +Ref: library/pkgutil pkgutil get_importer11959403 +Ref: 3ce811959403 +Ref: library/pkgutil pkgutil get_loader11959918 +Ref: 3ce911959918 +Ref: library/pkgutil pkgutil iter_importers11960635 +Ref: e4e11960635 +Ref: library/pkgutil pkgutil iter_modules11961360 +Ref: 9c511961360 +Ref: library/pkgutil pkgutil walk_packages11962211 +Ref: 86911962211 +Ref: library/pkgutil pkgutil get_data11963789 +Ref: 13ef11963789 +Ref: library/pkgutil pkgutil resolve_name11964923 +Ref: 3ceb11964923 +Ref: pkgutil — Package extension utility-Footnote-111966789 +Ref: pkgutil — Package extension utility-Footnote-211966856 +Ref: pkgutil — Package extension utility-Footnote-311966898 +Ref: pkgutil — Package extension utility-Footnote-411966940 +Ref: pkgutil — Package extension utility-Footnote-511966982 +Ref: pkgutil — Package extension utility-Footnote-611967024 +Ref: pkgutil — Package extension utility-Footnote-711967066 +Ref: pkgutil — Package extension utility-Footnote-811967108 +Ref: pkgutil — Package extension utility-Footnote-911967150 +Ref: pkgutil — Package extension utility-Footnote-1011967192 +Ref: pkgutil — Package extension utility-Footnote-1111967235 +Ref: pkgutil — Package extension utility-Footnote-1211967278 +Ref: pkgutil — Package extension utility-Footnote-1311967321 +Ref: pkgutil — Package extension utility-Footnote-1411967364 +Ref: pkgutil — Package extension utility-Footnote-1511967407 +Node: modulefinder — Find modules used by a script11967473 +Ref: library/modulefinder doc11967675 +Ref: 3cec11967675 +Ref: library/modulefinder module-modulefinder11967675 +Ref: b211967675 +Ref: library/modulefinder modulefinder-find-modules-used-by-a-script11967675 +Ref: 3ced11967675 +Ref: library/modulefinder modulefinder AddPackagePath11968194 +Ref: 3cee11968194 +Ref: library/modulefinder modulefinder ReplacePackage11968344 +Ref: 3cef11968344 +Ref: library/modulefinder modulefinder ModuleFinder11968507 +Ref: 143411968507 +Ref: library/modulefinder modulefinder ModuleFinder report11969166 +Ref: 3cf111969166 +Ref: library/modulefinder modulefinder ModuleFinder run_script11969381 +Ref: 3cf011969381 +Ref: library/modulefinder modulefinder ModuleFinder modules11969519 +Ref: 3cf211969519 +Ref: modulefinder — Find modules used by a script-Footnote-111969743 +Node: Example usage of ModuleFinder11969815 +Ref: library/modulefinder example-usage-of-modulefinder11969927 +Ref: 3cf411969927 +Ref: library/modulefinder modulefinder-example11969927 +Ref: 3cf311969927 +Node: runpy — Locating and executing Python modules11971300 +Ref: library/runpy doc11971507 +Ref: 3cf511971507 +Ref: library/runpy module-runpy11971507 +Ref: df11971507 +Ref: library/runpy runpy-locating-and-executing-python-modules11971507 +Ref: 3cf611971507 +Ref: library/runpy runpy run_module11972542 +Ref: 11f211972542 +Ref: library/runpy runpy run_path11975805 +Ref: fbc11975805 +Ref: runpy — Locating and executing Python modules-Footnote-111980093 +Ref: runpy — Locating and executing Python modules-Footnote-211980158 +Ref: runpy — Locating and executing Python modules-Footnote-311980200 +Ref: runpy — Locating and executing Python modules-Footnote-411980242 +Ref: runpy — Locating and executing Python modules-Footnote-511980284 +Ref: runpy — Locating and executing Python modules-Footnote-611980326 +Ref: runpy — Locating and executing Python modules-Footnote-711980368 +Ref: runpy — Locating and executing Python modules-Footnote-811980410 +Node: importlib — The implementation of import11980452 +Ref: library/importlib doc11980646 +Ref: 3cf711980646 +Ref: library/importlib importlib-the-implementation-of-import11980646 +Ref: 3cf811980646 +Ref: library/importlib module-importlib11980646 +Ref: 9711980646 +Ref: importlib — The implementation of import-Footnote-111981347 +Node: Introduction<10>11981426 +Ref: library/importlib introduction11981543 +Ref: 3cf911981543 +Ref: Introduction<10>-Footnote-111983831 +Ref: Introduction<10>-Footnote-211983883 +Ref: Introduction<10>-Footnote-311983925 +Ref: Introduction<10>-Footnote-411983967 +Ref: Introduction<10>-Footnote-511984009 +Ref: Introduction<10>-Footnote-611984051 +Ref: Introduction<10>-Footnote-711984093 +Ref: Introduction<10>-Footnote-811984135 +Ref: Introduction<10>-Footnote-911984177 +Ref: Introduction<10>-Footnote-1011984219 +Ref: Introduction<10>-Footnote-1111984262 +Ref: Introduction<10>-Footnote-1211984305 +Ref: Introduction<10>-Footnote-1311984348 +Node: Functions<11>11984391 +Ref: library/importlib functions11984574 +Ref: 3cfa11984574 +Ref: library/importlib importlib __import__11984613 +Ref: d1c11984613 +Ref: library/importlib importlib import_module11984921 +Ref: e4d11984921 +Ref: library/importlib importlib find_loader11986249 +Ref: 2ea11986249 +Ref: library/importlib importlib invalidate_caches11987253 +Ref: 87a11987253 +Ref: library/importlib importlib reload11987884 +Ref: 79d11987884 +Node: importlib abc – Abstract base classes related to import11991123 +Ref: library/importlib importlib-abc-abstract-base-classes-related-to-import11991338 +Ref: 3cfb11991338 +Ref: library/importlib module-importlib abc11991338 +Ref: 9811991338 +Ref: library/importlib importlib abc Finder11992161 +Ref: 47211992161 +Ref: library/importlib importlib abc Finder find_module11992370 +Ref: 46a11992370 +Ref: library/importlib importlib abc MetaPathFinder11992983 +Ref: 47311992983 +Ref: library/importlib importlib abc MetaPathFinder find_spec11993197 +Ref: 46f11993197 +Ref: library/importlib importlib abc MetaPathFinder find_module11993940 +Ref: 2ed11993940 +Ref: library/importlib importlib abc MetaPathFinder invalidate_caches11994764 +Ref: 3cfc11994764 +Ref: library/importlib importlib abc PathEntryFinder11995173 +Ref: 47411995173 +Ref: library/importlib importlib abc PathEntryFinder find_spec11995611 +Ref: 47011995611 +Ref: library/importlib importlib abc PathEntryFinder find_loader11996248 +Ref: 2ee11996248 +Ref: library/importlib importlib abc PathEntryFinder find_module11997451 +Ref: 2ef11997451 +Ref: library/importlib importlib abc PathEntryFinder invalidate_caches11997723 +Ref: 3cfd11997723 +Ref: library/importlib importlib abc Loader11998023 +Ref: b5511998023 +Ref: library/importlib importlib abc Loader create_module11998450 +Ref: 91b11998450 +Ref: library/importlib importlib abc Loader exec_module11998850 +Ref: 46c11998850 +Ref: library/importlib importlib abc Loader load_module11999325 +Ref: 46b11999325 +Ref: library/importlib importlib abc Loader module_repr12002814 +Ref: 2ec12002814 +Ref: library/importlib importlib abc ResourceLoader12003333 +Ref: 84e12003333 +Ref: library/importlib importlib abc ResourceLoader get_data12003718 +Ref: 3cea12003718 +Ref: library/importlib importlib abc InspectLoader12004406 +Ref: bee12004406 +Ref: library/importlib importlib abc InspectLoader get_code12004590 +Ref: bef12004590 +Ref: library/importlib importlib abc InspectLoader get_source12005173 +Ref: bf312005173 +Ref: library/importlib importlib abc InspectLoader is_package12005755 +Ref: 3cff12005755 +Ref: library/importlib importlib abc InspectLoader source_to_code12006126 +Ref: a9312006126 +Ref: library/importlib importlib abc InspectLoader exec_module12006770 +Ref: cb912006770 +Ref: library/importlib importlib abc InspectLoader load_module12006902 +Ref: cb612006902 +Ref: library/importlib importlib abc ExecutionLoader12007095 +Ref: 3d0012007095 +Ref: library/importlib importlib abc ExecutionLoader get_filename12007342 +Ref: 3d0112007342 +Ref: library/importlib importlib abc FileLoader12007889 +Ref: d2212007889 +Ref: library/importlib importlib abc FileLoader name12008383 +Ref: 3d0212008383 +Ref: library/importlib importlib abc FileLoader path12008466 +Ref: 3d0312008466 +Ref: library/importlib importlib abc FileLoader load_module12008535 +Ref: cb712008535 +Ref: library/importlib importlib abc FileLoader get_filename12008721 +Ref: 3d0412008721 +Ref: library/importlib importlib abc FileLoader get_data12008815 +Ref: 3d0512008815 +Ref: library/importlib importlib abc SourceLoader12008936 +Ref: 3d0612008936 +Ref: library/importlib importlib abc SourceLoader path_stats12010033 +Ref: e3f12010033 +Ref: library/importlib importlib abc SourceLoader path_mtime12010811 +Ref: e3e12010811 +Ref: library/importlib importlib abc SourceLoader set_data12011359 +Ref: 3d0712011359 +Ref: library/importlib importlib abc SourceLoader get_code12011874 +Ref: 3d0812011874 +Ref: library/importlib importlib abc SourceLoader exec_module12011997 +Ref: cba12011997 +Ref: library/importlib importlib abc SourceLoader load_module12012138 +Ref: cb812012138 +Ref: library/importlib importlib abc SourceLoader get_source12012340 +Ref: ccd12012340 +Ref: library/importlib importlib abc SourceLoader is_package12012467 +Ref: 3d0912012467 +Ref: importlib abc – Abstract base classes related to import-Footnote-112012906 +Ref: importlib abc – Abstract base classes related to import-Footnote-212012979 +Ref: importlib abc – Abstract base classes related to import-Footnote-312013021 +Ref: importlib abc – Abstract base classes related to import-Footnote-412013063 +Ref: importlib abc – Abstract base classes related to import-Footnote-512013105 +Ref: importlib abc – Abstract base classes related to import-Footnote-612013147 +Node: importlib machinery – Importers and path hooks12013189 +Ref: library/importlib importlib-machinery-importers-and-path-hooks12013436 +Ref: 3d0a12013436 +Ref: library/importlib module-importlib machinery12013436 +Ref: 9912013436 +Ref: library/importlib importlib machinery SOURCE_SUFFIXES12013767 +Ref: 3d0b12013767 +Ref: library/importlib importlib machinery DEBUG_BYTECODE_SUFFIXES12013936 +Ref: 3d0c12013936 +Ref: library/importlib importlib machinery OPTIMIZED_BYTECODE_SUFFIXES12014203 +Ref: 3d0e12014203 +Ref: library/importlib importlib machinery BYTECODE_SUFFIXES12014470 +Ref: 3d0d12014470 +Ref: library/importlib importlib machinery EXTENSION_SUFFIXES12014759 +Ref: 3d0f12014759 +Ref: library/importlib importlib machinery all_suffixes12014934 +Ref: 3c6512014934 +Ref: library/importlib importlib machinery BuiltinImporter12015368 +Ref: 91c12015368 +Ref: library/importlib importlib machinery FrozenImporter12015933 +Ref: ccb12015933 +Ref: library/importlib importlib machinery WindowsRegistryFinder12016353 +Ref: 99f12016353 +Ref: library/importlib importlib machinery PathFinder12016839 +Ref: ccf12016839 +Ref: library/importlib importlib machinery PathFinder find_spec12017154 +Ref: cb512017154 +Ref: library/importlib importlib machinery PathFinder find_module12018331 +Ref: 2f112018331 +Ref: library/importlib importlib machinery PathFinder invalidate_caches12018542 +Ref: 87912018542 +Ref: library/importlib importlib machinery FileFinder12019154 +Ref: d2112019154 +Ref: library/importlib importlib machinery FileFinder path12020459 +Ref: 3d1012020459 +Ref: library/importlib importlib machinery FileFinder find_spec12020532 +Ref: b5412020532 +Ref: library/importlib importlib machinery FileFinder find_loader12020707 +Ref: 2f012020707 +Ref: library/importlib importlib machinery FileFinder invalidate_caches12020931 +Ref: 3d1112020931 +Ref: library/importlib importlib machinery FileFinder path_hook12021011 +Ref: 3d1212021011 +Ref: library/importlib importlib machinery SourceFileLoader12021457 +Ref: d2312021457 +Ref: library/importlib importlib machinery SourceFileLoader name12021748 +Ref: 3d1312021748 +Ref: library/importlib importlib machinery SourceFileLoader path12021838 +Ref: 3d1412021838 +Ref: library/importlib importlib machinery SourceFileLoader is_package12021904 +Ref: 3d1512021904 +Ref: library/importlib importlib machinery SourceFileLoader path_stats12022033 +Ref: 3d1612022033 +Ref: library/importlib importlib machinery SourceFileLoader set_data12022169 +Ref: 3d1712022169 +Ref: library/importlib importlib machinery SourceFileLoader load_module12022308 +Ref: 99d12022308 +Ref: library/importlib importlib machinery SourcelessFileLoader12022627 +Ref: d2412022627 +Ref: library/importlib importlib machinery SourcelessFileLoader name12023098 +Ref: 3d1812023098 +Ref: library/importlib importlib machinery SourcelessFileLoader path12023182 +Ref: 3d1912023182 +Ref: library/importlib importlib machinery SourcelessFileLoader is_package12023250 +Ref: 3d1a12023250 +Ref: library/importlib importlib machinery SourcelessFileLoader get_code12023376 +Ref: 3d1b12023376 +Ref: library/importlib importlib machinery SourcelessFileLoader get_source12023512 +Ref: 3d1c12023512 +Ref: library/importlib importlib machinery SourcelessFileLoader load_module12023651 +Ref: 99e12023651 +Ref: library/importlib importlib machinery ExtensionFileLoader12023945 +Ref: 91d12023945 +Ref: library/importlib importlib machinery ExtensionFileLoader name12024312 +Ref: 3d1d12024312 +Ref: library/importlib importlib machinery ExtensionFileLoader path12024389 +Ref: 3d1e12024389 +Ref: library/importlib importlib machinery ExtensionFileLoader create_module12024456 +Ref: 3d1f12024456 +Ref: library/importlib importlib machinery ExtensionFileLoader exec_module12024633 +Ref: 3d2012024633 +Ref: library/importlib importlib machinery ExtensionFileLoader is_package12024791 +Ref: 3d2112024791 +Ref: library/importlib importlib machinery ExtensionFileLoader get_code12024975 +Ref: 3d2212024975 +Ref: library/importlib importlib machinery ExtensionFileLoader get_source12025084 +Ref: 3d2312025084 +Ref: library/importlib importlib machinery ExtensionFileLoader get_filename12025200 +Ref: bf412025200 +Ref: library/importlib importlib machinery ModuleSpec12025940 +Ref: 19b812025940 +Ref: library/importlib importlib machinery ModuleSpec name12026786 +Ref: 1fb912026786 +Ref: library/importlib importlib machinery ModuleSpec loader12026971 +Ref: 1fb712026971 +Ref: library/importlib importlib machinery ModuleSpec origin12027149 +Ref: 3d2412027149 +Ref: library/importlib importlib machinery ModuleSpec submodule_search_locations12027599 +Ref: 3d2512027599 +Ref: library/importlib importlib machinery ModuleSpec loader_state12028099 +Ref: 3d2612028099 +Ref: library/importlib importlib machinery ModuleSpec cached12028328 +Ref: 3d2712028328 +Ref: library/importlib importlib machinery ModuleSpec parent12028596 +Ref: 1fbb12028596 +Ref: library/importlib importlib machinery ModuleSpec has_location12028858 +Ref: 3d2812028858 +Ref: importlib machinery – Importers and path hooks-Footnote-112029184 +Ref: importlib machinery – Importers and path hooks-Footnote-212029264 +Ref: importlib machinery – Importers and path hooks-Footnote-312029306 +Ref: importlib machinery – Importers and path hooks-Footnote-412029348 +Node: importlib util – Utility code for importers12029390 +Ref: library/importlib importlib-util-utility-code-for-importers12029592 +Ref: 3d2912029592 +Ref: library/importlib module-importlib util12029592 +Ref: 9d12029592 +Ref: library/importlib importlib util MAGIC_NUMBER12029918 +Ref: bf012029918 +Ref: library/importlib importlib util cache_from_source12030161 +Ref: 91e12030161 +Ref: library/importlib importlib util source_from_cache12032070 +Ref: 91f12032070 +Ref: library/importlib importlib util decode_source12032695 +Ref: bf212032695 +Ref: library/importlib importlib util resolve_name12032965 +Ref: 54d12032965 +Ref: library/importlib importlib util find_spec12033865 +Ref: cb412033865 +Ref: library/importlib importlib util module_from_spec12034758 +Ref: a9412034758 +Ref: library/importlib importlib util module_for_loader12035391 +Ref: 2eb12035391 +Ref: library/importlib importlib util set_loader12037169 +Ref: cbb12037169 +Ref: library/importlib importlib util set_package12037795 +Ref: cbc12037795 +Ref: library/importlib importlib util spec_from_loader12038201 +Ref: 47112038201 +Ref: library/importlib importlib util spec_from_file_location12038654 +Ref: 92012038654 +Ref: library/importlib importlib util source_hash12039135 +Ref: 3d2a12039135 +Ref: library/importlib importlib util LazyLoader12039407 +Ref: 91a12039407 +Ref: library/importlib importlib util LazyLoader factory12040889 +Ref: 3d2b12040889 +Ref: importlib util – Utility code for importers-Footnote-112041453 +Ref: importlib util – Utility code for importers-Footnote-212041527 +Ref: importlib util – Utility code for importers-Footnote-312041569 +Ref: importlib util – Utility code for importers-Footnote-412041611 +Ref: importlib util – Utility code for importers-Footnote-512041653 +Ref: importlib util – Utility code for importers-Footnote-612041695 +Node: Examples<33>12041737 +Ref: library/importlib examples12041882 +Ref: 3d2c12041882 +Ref: library/importlib importlib-examples12041882 +Ref: 3d2d12041882 +Node: Importing programmatically12042177 +Ref: library/importlib importing-programmatically12042297 +Ref: 3d2e12042297 +Node: Checking if a module can be imported12042528 +Ref: library/importlib checking-if-a-module-can-be-imported12042689 +Ref: 3d2f12042689 +Node: Importing a source file directly12043602 +Ref: library/importlib importing-a-source-file-directly12043762 +Ref: 3d3012043762 +Node: Implementing lazy imports12044291 +Ref: library/importlib implementing-lazy-imports12044437 +Ref: 3d3112044437 +Node: Setting up an importer12045156 +Ref: library/importlib setting-up-an-importer12045307 +Ref: 3d3212045307 +Node: Approximating importlib import_module12046881 +Ref: library/importlib approximating-importlib-import-module12046998 +Ref: 3d3312046998 +Node: importlib resources – Resources12048498 +Ref: library/importlib resources doc12048665 +Ref: 3d3412048665 +Ref: library/importlib resources importlib-resources-resources12048665 +Ref: 3d3512048665 +Ref: library/importlib resources module-importlib resources12048665 +Ref: 9b12048665 +Ref: library/importlib resources importlib resources Package12050097 +Ref: 3d3612050097 +Ref: library/importlib resources importlib resources files12050465 +Ref: 54e12050465 +Ref: library/importlib resources importlib resources as_file12050890 +Ref: 11b912050890 +Ref: importlib resources – Resources-Footnote-112051557 +Ref: importlib resources – Resources-Footnote-212051646 +Ref: importlib resources – Resources-Footnote-312051717 +Ref: importlib resources – Resources-Footnote-412051811 +Ref: importlib resources – Resources-Footnote-512051883 +Node: Deprecated functions12051960 +Ref: library/importlib resources deprecated-functions12052148 +Ref: 3d3812052148 +Ref: library/importlib resources importlib resources Resource12052470 +Ref: 3d3912052470 +Ref: library/importlib resources importlib resources open_binary12052735 +Ref: 3d3a12052735 +Ref: library/importlib resources importlib resources open_text12053397 +Ref: 3d3b12053397 +Ref: library/importlib resources importlib resources read_binary12054269 +Ref: 13ee12054269 +Ref: library/importlib resources importlib resources read_text12054934 +Ref: 3d3c12054934 +Ref: library/importlib resources importlib resources path12055796 +Ref: 3d3d12055796 +Ref: library/importlib resources importlib resources is_resource12056678 +Ref: 3d3e12056678 +Ref: library/importlib resources importlib resources contents12057154 +Ref: 148212057154 +Node: importlib resources abc – Abstract base classes for resources12057724 +Ref: library/importlib resources abc doc12057903 +Ref: 3d3f12057903 +Ref: library/importlib resources abc importlib-resources-abc-abstract-base-classes-for-resources12057903 +Ref: 3d4012057903 +Ref: library/importlib resources abc module-importlib resources abc12057903 +Ref: 9c12057903 +Ref: library/importlib resources abc importlib resources abc ResourceReader12058192 +Ref: 3cfe12058192 +Ref: library/importlib resources abc importlib resources abc ResourceReader open_resource12059903 +Ref: 3d4112059903 +Ref: library/importlib resources abc importlib resources abc ResourceReader resource_path12060164 +Ref: 3d4212060164 +Ref: library/importlib resources abc importlib resources abc ResourceReader is_resource12060400 +Ref: 3d4312060400 +Ref: library/importlib resources abc importlib resources abc ResourceReader contents12060614 +Ref: 3d4412060614 +Ref: library/importlib resources abc importlib resources abc Traversable12061482 +Ref: 3d3712061482 +Ref: library/importlib resources abc importlib resources abc Traversable name12061670 +Ref: 3d4512061670 +Ref: library/importlib resources abc importlib resources abc Traversable iterdir12061788 +Ref: 3d4612061788 +Ref: library/importlib resources abc importlib resources abc Traversable is_dir12061878 +Ref: 3d4712061878 +Ref: library/importlib resources abc importlib resources abc Traversable is_file12061968 +Ref: 3d4812061968 +Ref: library/importlib resources abc importlib resources abc Traversable joinpath12062054 +Ref: 3d4912062054 +Ref: library/importlib resources abc importlib resources abc Traversable __truediv__12062149 +Ref: 3d4a12062149 +Ref: library/importlib resources abc importlib resources abc Traversable open12062247 +Ref: 3d4b12062247 +Ref: library/importlib resources abc importlib resources abc Traversable read_bytes12062611 +Ref: 3d4c12062611 +Ref: library/importlib resources abc importlib resources abc Traversable read_text12062686 +Ref: 3d4d12062686 +Ref: library/importlib resources abc importlib resources abc TraversableResources12062772 +Ref: 3d4e12062772 +Ref: library/importlib resources abc importlib resources abc TraversableResources files12063391 +Ref: 3d4f12063391 +Ref: importlib resources abc – Abstract base classes for resources-Footnote-112063580 +Node: Using importlib metadata12063664 +Ref: library/importlib metadata doc12063876 +Ref: 3d5012063876 +Ref: library/importlib metadata module-importlib metadata12063876 +Ref: 9a12063876 +Ref: library/importlib metadata using12063876 +Ref: 3d5112063876 +Ref: library/importlib metadata using-importlib-metadata12063876 +Ref: 3d5212063876 +Ref: Using importlib metadata-Footnote-112065205 +Ref: Using importlib metadata-Footnote-212065293 +Ref: Using importlib metadata-Footnote-312065378 +Ref: Using importlib metadata-Footnote-412065463 +Ref: Using importlib metadata-Footnote-512065535 +Ref: Using importlib metadata-Footnote-612065573 +Node: Overview<3>12065615 +Ref: library/importlib metadata overview12065710 +Ref: 3d5312065710 +Node: Functional API12067141 +Ref: library/importlib metadata functional-api12067258 +Ref: 3d5812067258 +Node: Entry points12067536 +Ref: library/importlib metadata entry-points12067629 +Ref: 40312067629 +Ref: library/importlib metadata id112067629 +Ref: 3d5912067629 +Ref: Entry points-Footnote-112070367 +Node: Distribution metadata12070439 +Ref: library/importlib metadata distribution-metadata12070562 +Ref: 3d5a12070562 +Ref: library/importlib metadata metadata12070562 +Ref: 3d5412070562 +Ref: Distribution metadata-Footnote-112071519 +Node: Distribution versions12071561 +Ref: library/importlib metadata distribution-versions12071690 +Ref: 3d5b12071690 +Ref: library/importlib metadata version12071690 +Ref: 3d5512071690 +Node: Distribution files12071899 +Ref: library/importlib metadata distribution-files12072032 +Ref: 3d5c12072032 +Ref: library/importlib metadata files12072032 +Ref: 3d5612072032 +Ref: Distribution files-Footnote-112073603 +Node: Distribution requirements12073700 +Ref: library/importlib metadata distribution-requirements12073833 +Ref: 3d5d12073833 +Ref: library/importlib metadata requirements12073833 +Ref: 3d5712073833 +Node: Package distributions12074100 +Ref: library/importlib metadata package-distributions12074206 +Ref: 3d5e12074206 +Node: Distributions12074599 +Ref: library/importlib metadata distributions12074735 +Ref: 3d5f12074735 +Ref: library/importlib metadata id212074735 +Ref: 3d6012074735 +Ref: Distributions-Footnote-112075642 +Node: Extending the search algorithm12075684 +Ref: library/importlib metadata extending-the-search-algorithm12075797 +Ref: 3d6112075797 +Node: The initialization of the sys path module search path12077565 +Ref: library/sys_path_init doc12077705 +Ref: 3d6212077705 +Ref: library/sys_path_init importlib-resources12077705 +Ref: 3d6312077705 +Ref: library/sys_path_init sys-path-init12077705 +Ref: 16ad12077705 +Ref: library/sys_path_init the-initialization-of-the-sys-path-module-search-path12077705 +Ref: 3d6412077705 +Node: Virtual environments<2>12081227 +Ref: library/sys_path_init virtual-environments12081359 +Ref: 3d6612081359 +Node: _pth files12081963 +Ref: library/sys_path_init pth-files12082119 +Ref: 3d6712082119 +Node: Embedded Python12083275 +Ref: library/sys_path_init embedded-python12083399 +Ref: 3d6812083399 +Node: Python Language Services12083962 +Ref: library/language doc12084113 +Ref: 3d6912084113 +Ref: library/language language12084113 +Ref: 3d6a12084113 +Ref: library/language python-language-services12084113 +Ref: 3d6b12084113 +Node: ast — Abstract Syntax Trees12084925 +Ref: library/ast doc12085077 +Ref: 3d6c12085077 +Ref: library/ast ast-abstract-syntax-trees12085077 +Ref: 3d6d12085077 +Ref: library/ast module-ast12085077 +Ref: 712085077 +Ref: ast — Abstract Syntax Trees-Footnote-112086093 +Node: Abstract Grammar12086156 +Ref: library/ast abstract-grammar12086259 +Ref: 3d6f12086259 +Ref: library/ast id112086259 +Ref: 3d7012086259 +Node: Node classes12093182 +Ref: library/ast node-classes12093305 +Ref: 3d7112093305 +Ref: library/ast ast AST12093350 +Ref: 30f12093350 +Ref: library/ast ast AST _fields12094180 +Ref: 3d7212094180 +Ref: library/ast ast AST lineno12094989 +Ref: 3d7312094989 +Ref: library/ast ast AST col_offset12095016 +Ref: 3d7412095016 +Ref: library/ast ast AST end_lineno12095047 +Ref: 3d7512095047 +Ref: library/ast ast AST end_col_offset12095078 +Ref: 3d7612095078 +Ref: Node classes-Footnote-112098125 +Node: Literals<3>12098183 +Ref: library/ast literals12098261 +Ref: 3d7812098261 +Ref: library/ast ast Constant12098298 +Ref: 6c012098298 +Ref: library/ast ast FormattedValue12098790 +Ref: 3d7912098790 +Ref: library/ast ast JoinedStr12099645 +Ref: 3d7a12099645 +Ref: library/ast ast List12100663 +Ref: 3d7b12100663 +Ref: library/ast ast Tuple12100695 +Ref: 3d7c12100695 +Ref: library/ast ast Set12101576 +Ref: 3d7f12101576 +Ref: library/ast ast Dict12101964 +Ref: 137112101964 +Node: Variables12102787 +Ref: library/ast variables12102888 +Ref: 3d8012102888 +Ref: library/ast ast Name12102927 +Ref: 134912102927 +Ref: library/ast ast Load12103069 +Ref: 3d7e12103069 +Ref: library/ast ast Store12103089 +Ref: 3d7d12103089 +Ref: library/ast ast Del12103110 +Ref: 3d8112103110 +Ref: library/ast ast Starred12104068 +Ref: 3d8212104068 +Node: Expressions<2>12104898 +Ref: library/ast expressions12104998 +Ref: 3d8412104998 +Ref: library/ast ast Expr12105041 +Ref: 3d8512105041 +Ref: library/ast ast UnaryOp12105715 +Ref: 3d7712105715 +Ref: library/ast ast UAdd12105849 +Ref: 3d8912105849 +Ref: library/ast ast USub12105869 +Ref: 3d8a12105869 +Ref: library/ast ast Not12105889 +Ref: 3d8b12105889 +Ref: library/ast ast Invert12105908 +Ref: 3d8c12105908 +Ref: library/ast ast BinOp12106259 +Ref: 13f212106259 +Ref: library/ast ast Add12106692 +Ref: 3d8d12106692 +Ref: library/ast ast Sub12106711 +Ref: 3d8e12106711 +Ref: library/ast ast Mult12106730 +Ref: 3d8f12106730 +Ref: library/ast ast Div12106750 +Ref: 3d9012106750 +Ref: library/ast ast FloorDiv12106769 +Ref: 3d9112106769 +Ref: library/ast ast Mod12106793 +Ref: 3d9212106793 +Ref: library/ast ast Pow12106812 +Ref: 3d9312106812 +Ref: library/ast ast LShift12106831 +Ref: 3d9412106831 +Ref: library/ast ast RShift12106853 +Ref: 3d9512106853 +Ref: library/ast ast BitOr12106875 +Ref: 3d9612106875 +Ref: library/ast ast BitXor12106896 +Ref: 3d9712106896 +Ref: library/ast ast BitAnd12106918 +Ref: 3d9812106918 +Ref: library/ast ast MatMult12106940 +Ref: 3d9912106940 +Ref: library/ast ast BoolOp12106994 +Ref: 3d9a12106994 +Ref: library/ast ast And12107655 +Ref: 3d9c12107655 +Ref: library/ast ast Or12107674 +Ref: 3d9b12107674 +Ref: library/ast ast Compare12107724 +Ref: 3d9d12107724 +Ref: library/ast ast Eq12108370 +Ref: 3d9e12108370 +Ref: library/ast ast NotEq12108388 +Ref: 3d9f12108388 +Ref: library/ast ast Lt12108409 +Ref: 3da012108409 +Ref: library/ast ast LtE12108427 +Ref: 3da112108427 +Ref: library/ast ast Gt12108446 +Ref: 3da212108446 +Ref: library/ast ast GtE12108464 +Ref: 3da312108464 +Ref: library/ast ast Is12108483 +Ref: 3da412108483 +Ref: library/ast ast IsNot12108501 +Ref: 3da512108501 +Ref: library/ast ast In12108522 +Ref: 3da612108522 +Ref: library/ast ast NotIn12108540 +Ref: 3da712108540 +Ref: library/ast ast Call12108596 +Ref: 3d8312108596 +Ref: library/ast ast keyword12109807 +Ref: 3da912109807 +Ref: library/ast ast IfExp12110003 +Ref: 3daa12110003 +Ref: library/ast ast Attribute12110486 +Ref: 3da812110486 +Ref: library/ast ast NamedExpr12111076 +Ref: 3dab12111076 +Node: Subscripting12111727 +Ref: library/ast subscripting12111813 +Ref: 3dad12111813 +Ref: library/ast ast Subscript12111858 +Ref: 3dae12111858 +Ref: library/ast ast Slice12112757 +Ref: 3daf12112757 +Node: Comprehensions12113346 +Ref: library/ast comprehensions12113432 +Ref: 3db012113432 +Ref: library/ast ast ListComp12113481 +Ref: 3db112113481 +Ref: library/ast ast SetComp12113523 +Ref: 3db212113523 +Ref: library/ast ast GeneratorExp12113564 +Ref: 3db312113564 +Ref: library/ast ast DictComp12113610 +Ref: 3db412113610 +Ref: library/ast ast comprehension12115477 +Ref: 3db512115477 +Node: Statements12118656 +Ref: library/ast statements12118759 +Ref: 3db612118759 +Ref: library/ast ast Assign12118800 +Ref: 3dac12118800 +Ref: library/ast ast Assign type_comment12119143 +Ref: 3db712119143 +Ref: library/ast ast AnnAssign12120146 +Ref: 3db812120146 +Ref: library/ast ast AugAssign12122345 +Ref: 3db912122345 +Ref: library/ast ast Raise12123101 +Ref: 3dba12123101 +Ref: library/ast ast Assert12123669 +Ref: 3dbb12123669 +Ref: library/ast ast Delete12124106 +Ref: 3dbc12124106 +Ref: library/ast ast Pass12124655 +Ref: 3dbd12124655 +Node: Imports12124988 +Ref: library/ast imports12125042 +Ref: 3dbe12125042 +Ref: library/ast ast Import12125077 +Ref: 3dbf12125077 +Ref: library/ast ast ImportFrom12125518 +Ref: 3dc012125518 +Ref: library/ast ast alias12126262 +Ref: 12c412126262 +Node: Control flow12126812 +Ref: library/ast control-flow12126917 +Ref: 3dc112126917 +Ref: library/ast ast If12127071 +Ref: 3dc212127071 +Ref: library/ast ast For12128359 +Ref: 3dc312128359 +Ref: library/ast ast For type_comment12128846 +Ref: 3dc412128846 +Ref: library/ast ast While12129602 +Ref: 3dc512129602 +Ref: library/ast ast Break12130307 +Ref: 3dc612130307 +Ref: library/ast ast Continue12130328 +Ref: 3dc712130328 +Ref: library/ast ast Try12131399 +Ref: 3dc812131399 +Ref: library/ast ast TryStar12133007 +Ref: 3dca12133007 +Ref: library/ast ast ExceptHandler12134084 +Ref: 3dc912134084 +Ref: library/ast ast With12135318 +Ref: 3dcb12135318 +Ref: library/ast ast With type_comment12135549 +Ref: 3dcd12135549 +Ref: library/ast ast withitem12135684 +Ref: 3dcc12135684 +Node: Pattern matching12137052 +Ref: library/ast pattern-matching12137177 +Ref: 3dce12137177 +Ref: library/ast ast Match12137232 +Ref: 3dcf12137232 +Ref: library/ast ast match_case12137512 +Ref: 3dd012137512 +Ref: library/ast ast MatchValue12139623 +Ref: 3dd112139623 +Ref: library/ast ast MatchSingleton12140595 +Ref: 3dd212140595 +Ref: library/ast ast MatchSequence12141453 +Ref: 3dd312141453 +Ref: library/ast ast MatchStar12142646 +Ref: 3dd412142646 +Ref: library/ast ast MatchMapping12144257 +Ref: 3dd512144257 +Ref: library/ast ast MatchClass12146247 +Ref: 3dd612146247 +Ref: library/ast ast MatchAs12149330 +Ref: 3dd712149330 +Ref: library/ast ast MatchOr12150950 +Ref: 3dd812150950 +Node: Function and class definitions12152199 +Ref: library/ast function-and-class-definitions12152327 +Ref: 3dd912152327 +Ref: library/ast ast FunctionDef12152410 +Ref: 3dda12152410 +Ref: library/ast ast FunctionDef type_comment12152935 +Ref: 3ddc12152935 +Ref: library/ast ast Lambda12153070 +Ref: 3d8612153070 +Ref: library/ast ast arguments12153890 +Ref: 3ddb12153890 +Ref: library/ast ast arg12154637 +Ref: 3ddd12154637 +Ref: library/ast ast arg type_comment12154866 +Ref: 3dde12154866 +Ref: library/ast ast Return12156507 +Ref: 3ddf12156507 +Ref: library/ast ast Yield12156779 +Ref: 3d8712156779 +Ref: library/ast ast YieldFrom12156808 +Ref: 3d8812156808 +Ref: library/ast ast Global12157536 +Ref: 3de012157536 +Ref: library/ast ast Nonlocal12157566 +Ref: 3de112157566 +Ref: library/ast ast ClassDef12158277 +Ref: 3de212158277 +Ref: Function and class definitions-Footnote-112160074 +Node: Async and await12160116 +Ref: library/ast async-and-await12160219 +Ref: 3de312160219 +Ref: library/ast ast AsyncFunctionDef12160272 +Ref: 3de412160272 +Ref: library/ast ast Await12160473 +Ref: 3de512160473 +Ref: library/ast ast AsyncFor12161412 +Ref: 3de612161412 +Ref: library/ast ast AsyncWith12161479 +Ref: 3de712161479 +Node: ast Helpers12162114 +Ref: library/ast ast-helpers12162235 +Ref: 3de812162235 +Ref: library/ast ast parse12162425 +Ref: 61912162425 +Ref: library/ast ast unparse12164927 +Ref: 52312164927 +Ref: library/ast ast literal_eval12165547 +Ref: 88212165547 +Ref: library/ast ast get_docstring12166816 +Ref: 149b12166816 +Ref: library/ast ast get_source_segment12167270 +Ref: 61812167270 +Ref: library/ast ast fix_missing_locations12167720 +Ref: 3dea12167720 +Ref: library/ast ast increment_lineno12168176 +Ref: 135512168176 +Ref: library/ast ast copy_location12168408 +Ref: 3deb12168408 +Ref: library/ast ast iter_fields12168642 +Ref: 3dec12168642 +Ref: library/ast ast iter_child_nodes12168797 +Ref: 3ded12168797 +Ref: library/ast ast walk12168975 +Ref: 3dee12168975 +Ref: library/ast ast NodeVisitor12169241 +Ref: 6c112169241 +Ref: library/ast ast NodeVisitor visit12169583 +Ref: 3def12169583 +Ref: library/ast ast NodeVisitor generic_visit12169861 +Ref: 3df012169861 +Ref: library/ast ast NodeTransformer12170696 +Ref: 3df112170696 +Ref: library/ast ast dump12172554 +Ref: 52212172554 +Ref: ast Helpers-Footnote-112173677 +Ref: ast Helpers-Footnote-212173719 +Ref: ast Helpers-Footnote-312173761 +Node: Compiler Flags12173803 +Ref: library/ast ast-compiler-flags12173933 +Ref: 1baa12173933 +Ref: library/ast compiler-flags12173933 +Ref: 3df212173933 +Ref: library/ast ast PyCF_ALLOW_TOP_LEVEL_AWAIT12174104 +Ref: 3df312174104 +Ref: library/ast ast PyCF_ONLY_AST12174286 +Ref: 3d6e12174286 +Ref: library/ast ast PyCF_TYPE_COMMENTS12174417 +Ref: 3de912174417 +Ref: Compiler Flags-Footnote-112174644 +Ref: Compiler Flags-Footnote-212174686 +Node: Command-Line Usage<2>12174728 +Ref: library/ast ast-cli12174838 +Ref: 3df412174838 +Ref: library/ast command-line-usage12174838 +Ref: 3df512174838 +Ref: library/ast cmdoption-ast-h12175099 +Ref: 3df612175099 +Ref: library/ast cmdoption-ast-help12175099 +Ref: 3df712175099 +Ref: library/ast cmdoption-ast-m12175169 +Ref: 3df812175169 +Ref: library/ast cmdoption-ast-mode12175199 +Ref: 3df912175199 +Ref: library/ast cmdoption-ast-no-type-comments12175337 +Ref: 3dfa12175337 +Ref: library/ast cmdoption-ast-a12175412 +Ref: 3dfb12175412 +Ref: library/ast cmdoption-ast-include-attributes12175412 +Ref: 3dfc12175412 +Ref: library/ast cmdoption-ast-i12175524 +Ref: 3dfd12175524 +Ref: library/ast cmdoption-ast-indent12175556 +Ref: 3dfe12175556 +Ref: Command-Line Usage<2>-Footnote-112176667 +Ref: Command-Line Usage<2>-Footnote-212176715 +Ref: Command-Line Usage<2>-Footnote-312176782 +Ref: Command-Line Usage<2>-Footnote-412176838 +Ref: Command-Line Usage<2>-Footnote-512176877 +Node: symtable — Access to the compiler’s symbol tables12176914 +Ref: library/symtable doc12177123 +Ref: 3dff12177123 +Ref: library/symtable module-symtable12177123 +Ref: f812177123 +Ref: library/symtable symtable-access-to-the-compiler-s-symbol-tables12177123 +Ref: 3e0012177123 +Ref: symtable — Access to the compiler’s symbol tables-Footnote-112177705 +Node: Generating Symbol Tables12177773 +Ref: library/symtable generating-symbol-tables12177919 +Ref: 3e0112177919 +Ref: library/symtable symtable symtable12177988 +Ref: 141b12177988 +Node: Examining Symbol Tables12178268 +Ref: library/symtable examining-symbol-tables12178414 +Ref: 3e0312178414 +Ref: library/symtable symtable SymbolTable12178481 +Ref: 3e0212178481 +Ref: library/symtable symtable SymbolTable get_type12178583 +Ref: 3e0412178583 +Ref: library/symtable symtable SymbolTable get_id12178745 +Ref: 3e0512178745 +Ref: library/symtable symtable SymbolTable get_name12178817 +Ref: 3e0612178817 +Ref: library/symtable symtable SymbolTable get_lineno12179120 +Ref: 3e0712179120 +Ref: library/symtable symtable SymbolTable is_optimized12179245 +Ref: 3e0812179245 +Ref: library/symtable symtable SymbolTable is_nested12179354 +Ref: 3e0912179354 +Ref: library/symtable symtable SymbolTable has_children12179458 +Ref: 3e0a12179458 +Ref: library/symtable symtable SymbolTable get_identifiers12179632 +Ref: 3e0c12179632 +Ref: library/symtable symtable SymbolTable lookup12179809 +Ref: 3e0d12179809 +Ref: library/symtable symtable SymbolTable get_symbols12179932 +Ref: 3e0f12179932 +Ref: library/symtable symtable SymbolTable get_children12180057 +Ref: 3e0b12180057 +Ref: library/symtable symtable Function12180145 +Ref: 3e1012180145 +Ref: library/symtable symtable Function get_parameters12180270 +Ref: 3e1112180270 +Ref: library/symtable symtable Function get_locals12180391 +Ref: 3e1212180391 +Ref: library/symtable symtable Function get_globals12180494 +Ref: 3e1312180494 +Ref: library/symtable symtable Function get_nonlocals12180599 +Ref: 3e1412180599 +Ref: library/symtable symtable Function get_frees12180708 +Ref: 3e1512180708 +Ref: library/symtable symtable Class12180828 +Ref: 3e1612180828 +Ref: library/symtable symtable Class get_methods12180936 +Ref: 3e1712180936 +Ref: library/symtable symtable Symbol12181060 +Ref: 3e0e12181060 +Ref: library/symtable symtable Symbol get_name12181216 +Ref: 3e1812181216 +Ref: library/symtable symtable Symbol is_referenced12181285 +Ref: 3e1912181285 +Ref: library/symtable symtable Symbol is_imported12181385 +Ref: 3e1a12181385 +Ref: library/symtable symtable Symbol is_parameter12181508 +Ref: 3e1b12181508 +Ref: library/symtable symtable Symbol is_global12181601 +Ref: 3e1c12181601 +Ref: library/symtable symtable Symbol is_nonlocal12181686 +Ref: 145d12181686 +Ref: library/symtable symtable Symbol is_declared_global12181775 +Ref: fc112181775 +Ref: library/symtable symtable Symbol is_local12181912 +Ref: 3e1d12181912 +Ref: library/symtable symtable Symbol is_annotated12182008 +Ref: 3e1e12182008 +Ref: library/symtable symtable Symbol is_free12182130 +Ref: 3e1f12182130 +Ref: library/symtable symtable Symbol is_assigned12182261 +Ref: 3e2012182261 +Ref: library/symtable symtable Symbol is_namespace12182366 +Ref: 3e2112182366 +Ref: library/symtable symtable Symbol get_namespaces12183008 +Ref: 3e2212183008 +Ref: library/symtable symtable Symbol get_namespace12183103 +Ref: 3e2312183103 +Node: token — Constants used with Python parse trees12183303 +Ref: library/token doc12183522 +Ref: 3e2412183522 +Ref: library/token module-token12183522 +Ref: 11912183522 +Ref: library/token token-constants-used-with-python-parse-trees12183522 +Ref: 3e2512183522 +Ref: library/token token tok_name12184235 +Ref: 3e2612184235 +Ref: library/token token ISTERMINAL12184453 +Ref: 3e2712184453 +Ref: library/token token ISNONTERMINAL12184540 +Ref: 3e2812184540 +Ref: library/token token ISEOF12184634 +Ref: 3e2912184634 +Ref: library/token token ENDMARKER12184765 +Ref: 3e2a12184765 +Ref: library/token token NAME12184792 +Ref: 3e2b12184792 +Ref: library/token token NUMBER12184814 +Ref: 3e2c12184814 +Ref: library/token token STRING12184838 +Ref: 3e2d12184838 +Ref: library/token token NEWLINE12184862 +Ref: 3e2e12184862 +Ref: library/token token INDENT12184887 +Ref: 3e2f12184887 +Ref: library/token token DEDENT12184911 +Ref: 3e3012184911 +Ref: library/token token LPAR12184935 +Ref: 3e3112184935 +Ref: library/token token RPAR12184990 +Ref: 3e3212184990 +Ref: library/token token LSQB12185045 +Ref: 3e3312185045 +Ref: library/token token RSQB12185100 +Ref: 3e3412185100 +Ref: library/token token COLON12185155 +Ref: 3e3512185155 +Ref: library/token token COMMA12185211 +Ref: 3e3612185211 +Ref: library/token token SEMI12185267 +Ref: 3e3712185267 +Ref: library/token token PLUS12185322 +Ref: 3e3812185322 +Ref: library/token token MINUS12185377 +Ref: 3e3912185377 +Ref: library/token token STAR12185433 +Ref: 3e3a12185433 +Ref: library/token token SLASH12185488 +Ref: 3e3b12185488 +Ref: library/token token VBAR12185544 +Ref: 3e3c12185544 +Ref: library/token token AMPER12185599 +Ref: 3e3d12185599 +Ref: library/token token LESS12185655 +Ref: 3e3e12185655 +Ref: library/token token GREATER12185710 +Ref: 3e3f12185710 +Ref: library/token token EQUAL12185768 +Ref: 3e4012185768 +Ref: library/token token DOT12185824 +Ref: 3e4112185824 +Ref: library/token token PERCENT12185878 +Ref: 3e4212185878 +Ref: library/token token LBRACE12185936 +Ref: 3e4312185936 +Ref: library/token token RBRACE12185993 +Ref: 3e4412185993 +Ref: library/token token EQEQUAL12186050 +Ref: 3e4512186050 +Ref: library/token token NOTEQUAL12186109 +Ref: 3e4612186109 +Ref: library/token token LESSEQUAL12186169 +Ref: 3e4712186169 +Ref: library/token token GREATEREQUAL12186230 +Ref: 3e4812186230 +Ref: library/token token TILDE12186294 +Ref: 3e4912186294 +Ref: library/token token CIRCUMFLEX12186350 +Ref: 3e4a12186350 +Ref: library/token token LEFTSHIFT12186411 +Ref: 3e4b12186411 +Ref: library/token token RIGHTSHIFT12186472 +Ref: 3e4c12186472 +Ref: library/token token DOUBLESTAR12186534 +Ref: 3e4d12186534 +Ref: library/token token PLUSEQUAL12186596 +Ref: 3e4e12186596 +Ref: library/token token MINEQUAL12186657 +Ref: 3e4f12186657 +Ref: library/token token STAREQUAL12186717 +Ref: 3e5012186717 +Ref: library/token token SLASHEQUAL12186778 +Ref: 3e5112186778 +Ref: library/token token PERCENTEQUAL12186840 +Ref: 3e5212186840 +Ref: library/token token AMPEREQUAL12186904 +Ref: 3e5312186904 +Ref: library/token token VBAREQUAL12186966 +Ref: 3e5412186966 +Ref: library/token token CIRCUMFLEXEQUAL12187027 +Ref: 3e5512187027 +Ref: library/token token LEFTSHIFTEQUAL12187094 +Ref: 3e5612187094 +Ref: library/token token RIGHTSHIFTEQUAL12187161 +Ref: 3e5712187161 +Ref: library/token token DOUBLESTAREQUAL12187229 +Ref: 3e5812187229 +Ref: library/token token DOUBLESLASH12187297 +Ref: 3e5912187297 +Ref: library/token token DOUBLESLASHEQUAL12187360 +Ref: 3e5a12187360 +Ref: library/token token AT12187429 +Ref: 3e5b12187429 +Ref: library/token token ATEQUAL12187482 +Ref: 3e5c12187482 +Ref: library/token token RARROW12187541 +Ref: 3e5d12187541 +Ref: library/token token ELLIPSIS12187599 +Ref: 3e5e12187599 +Ref: library/token token COLONEQUAL12187660 +Ref: 3e5f12187660 +Ref: library/token token OP12187722 +Ref: 3e6012187722 +Ref: library/token token AWAIT12187742 +Ref: 3e6112187742 +Ref: library/token token ASYNC12187765 +Ref: 3e6212187765 +Ref: library/token token TYPE_IGNORE12187788 +Ref: 3e6312187788 +Ref: library/token token TYPE_COMMENT12187817 +Ref: 3e6412187817 +Ref: library/token token SOFT_KEYWORD12187847 +Ref: 3e6512187847 +Ref: library/token token ERRORTOKEN12187877 +Ref: 3e6612187877 +Ref: library/token token N_TOKENS12187905 +Ref: 3e6712187905 +Ref: library/token token NT_OFFSET12187931 +Ref: 3e6812187931 +Ref: library/token token COMMENT12188076 +Ref: 3e6912188076 +Ref: library/token token NL12188147 +Ref: 3e6a12188147 +Ref: library/token token ENCODING12188429 +Ref: 3e6b12188429 +Ref: token — Constants used with Python parse trees-Footnote-112189541 +Node: keyword — Testing for Python keywords12189606 +Ref: library/keyword doc12189812 +Ref: 3e6c12189812 +Ref: library/keyword keyword-testing-for-python-keywords12189812 +Ref: 3e6d12189812 +Ref: library/keyword module-keyword12189812 +Ref: a412189812 +Ref: library/keyword keyword iskeyword12190131 +Ref: 1c0c12190131 +Ref: library/keyword keyword kwlist12190232 +Ref: 3e6e12190232 +Ref: library/keyword keyword issoftkeyword12190500 +Ref: 3e6f12190500 +Ref: library/keyword keyword softkwlist12190635 +Ref: 3e7012190635 +Ref: keyword — Testing for Python keywords-Footnote-112190978 +Node: tokenize — Tokenizer for Python source12191045 +Ref: library/tokenize doc12191250 +Ref: 3e7112191250 +Ref: library/tokenize module-tokenize12191250 +Ref: 11a12191250 +Ref: library/tokenize tokenize-tokenizer-for-python-source12191250 +Ref: 3e7212191250 +Ref: tokenize — Tokenizer for Python source-Footnote-112192201 +Node: Tokenizing Input12192269 +Ref: library/tokenize tokenizing-input12192392 +Ref: 3e7312192392 +Ref: library/tokenize tokenize tokenize12192498 +Ref: f7012192498 +Ref: library/tokenize tokenize generate_tokens12193932 +Ref: 147e12193932 +Ref: library/tokenize tokenize untokenize12194699 +Ref: 3e7412194699 +Ref: library/tokenize tokenize detect_encoding12195643 +Ref: 227f12195643 +Ref: library/tokenize tokenize open12196639 +Ref: 227e12196639 +Ref: library/tokenize tokenize TokenError12196808 +Ref: 3e7512196808 +Ref: Tokenizing Input-Footnote-112197297 +Ref: Tokenizing Input-Footnote-212197339 +Node: Command-Line Usage<3>12197381 +Ref: library/tokenize command-line-usage12197525 +Ref: 3e7612197525 +Ref: library/tokenize tokenize-cli12197525 +Ref: 3e7712197525 +Ref: library/tokenize cmdoption-tokenize-h12197789 +Ref: 3e7812197789 +Ref: library/tokenize cmdoption-tokenize-help12197789 +Ref: 3e7912197789 +Ref: library/tokenize cmdoption-tokenize-e12197859 +Ref: 3e7a12197859 +Ref: library/tokenize cmdoption-tokenize-exact12197859 +Ref: 3e7b12197859 +Node: Examples<34>12198059 +Ref: library/tokenize examples12198178 +Ref: 3e7c12198178 +Node: tabnanny — Detection of ambiguous indentation12202672 +Ref: library/tabnanny doc12202878 +Ref: 3e7d12202878 +Ref: library/tabnanny module-tabnanny12202878 +Ref: fc12202878 +Ref: library/tabnanny tabnanny-detection-of-ambiguous-indentation12202878 +Ref: 3e7e12202878 +Ref: library/tabnanny tabnanny check12203409 +Ref: 3e7f12203409 +Ref: library/tabnanny tabnanny verbose12203849 +Ref: 3e8012203849 +Ref: library/tabnanny tabnanny filename_only12204006 +Ref: 3e8112204006 +Ref: library/tabnanny tabnanny NannyNag12204224 +Ref: 3e8212204224 +Ref: library/tabnanny tabnanny process_tokens12204389 +Ref: 3e8312204389 +Ref: tabnanny — Detection of ambiguous indentation-Footnote-112204688 +Node: pyclbr — Python module browser support12204756 +Ref: library/pyclbr doc12204964 +Ref: 3e8412204964 +Ref: library/pyclbr module-pyclbr12204964 +Ref: d512204964 +Ref: library/pyclbr pyclbr-python-module-browser-support12204964 +Ref: 3e8512204964 +Ref: library/pyclbr pyclbr readmodule12205662 +Ref: 159f12205662 +Ref: library/pyclbr pyclbr readmodule_ex12206273 +Ref: 15a012206273 +Ref: pyclbr — Python module browser support-Footnote-112207349 +Node: Function Objects12207415 +Ref: library/pyclbr function-objects12207533 +Ref: 3e8612207533 +Ref: library/pyclbr pyclbr-function-objects12207533 +Ref: 3e8712207533 +Ref: library/pyclbr pyclbr Function file12207700 +Ref: 3e8812207700 +Ref: library/pyclbr pyclbr Function module12207787 +Ref: 3e8912207787 +Ref: library/pyclbr pyclbr Function name12207881 +Ref: 3e8a12207881 +Ref: library/pyclbr pyclbr Function lineno12207943 +Ref: 3e8b12207943 +Ref: library/pyclbr pyclbr Function parent12208038 +Ref: 3e8c12208038 +Ref: library/pyclbr pyclbr Function children12208168 +Ref: 3e8d12208168 +Ref: library/pyclbr pyclbr Function is_async12208315 +Ref: 3e8e12208315 +Node: Class Objects<2>12208481 +Ref: library/pyclbr class-objects12208599 +Ref: 3e8f12208599 +Ref: library/pyclbr pyclbr-class-objects12208599 +Ref: 3e9012208599 +Ref: library/pyclbr pyclbr Class file12208778 +Ref: 3e9112208778 +Ref: library/pyclbr pyclbr Class module12208859 +Ref: 3e9212208859 +Ref: library/pyclbr pyclbr Class name12208947 +Ref: 3e9312208947 +Ref: library/pyclbr pyclbr Class lineno12209003 +Ref: 3e9412209003 +Ref: library/pyclbr pyclbr Class parent12209095 +Ref: 3e9512209095 +Ref: library/pyclbr pyclbr Class children12209218 +Ref: 3e9612209218 +Ref: library/pyclbr pyclbr Class super12209362 +Ref: 3e9712209362 +Ref: library/pyclbr pyclbr Class methods12209700 +Ref: 3e9812209700 +Node: py_compile — Compile Python source files12209890 +Ref: library/py_compile doc12210095 +Ref: 3e9912210095 +Ref: library/py_compile module-py_compile12210095 +Ref: d412210095 +Ref: library/py_compile py-compile-compile-python-source-files12210095 +Ref: 3e9a12210095 +Ref: library/py_compile py_compile PyCompileError12210718 +Ref: 3e9b12210718 +Ref: library/py_compile py_compile compile12210847 +Ref: 67112210847 +Ref: library/py_compile py_compile PycInvalidationMode12214598 +Ref: 3e9c12214598 +Ref: library/py_compile py_compile PycInvalidationMode TIMESTAMP12215019 +Ref: 3e9e12215019 +Ref: library/py_compile py_compile PycInvalidationMode CHECKED_HASH12215301 +Ref: 3e9d12215301 +Ref: library/py_compile py_compile PycInvalidationMode UNCHECKED_HASH12215547 +Ref: 3e9f12215547 +Ref: py_compile — Compile Python source files-Footnote-112216095 +Ref: py_compile — Compile Python source files-Footnote-212216165 +Ref: py_compile — Compile Python source files-Footnote-312216207 +Ref: py_compile — Compile Python source files-Footnote-412216249 +Ref: py_compile — Compile Python source files-Footnote-512216291 +Node: Command-Line Interface<6>12216333 +Ref: library/py_compile command-line-interface12216437 +Ref: 3ea012216437 +Ref: library/py_compile cmdoption-python-m-py_compile-arg-file12216866 +Ref: 3ea112216866 +Ref: library/py_compile cmdoption-python-m-py-compile-arg-file12216866 +Ref: 3ea212216866 +Ref: library/py_compile cmdoption-python-m-py_compile12216905 +Ref: 3ea312216905 +Ref: library/py_compile cmdoption-python-m-py-compile12216905 +Ref: 3ea412216905 +Ref: library/py_compile cmdoption-python-m-py_compile-q12217065 +Ref: 3ea512217065 +Ref: library/py_compile cmdoption-python-m-py-compile-q12217065 +Ref: 3ea612217065 +Ref: library/py_compile cmdoption-python-m-py_compile-quiet12217065 +Ref: 3ea712217065 +Ref: library/py_compile cmdoption-python-m-py-compile-quiet12217065 +Ref: 3ea812217065 +Node: compileall — Byte-compile Python libraries12217361 +Ref: library/compileall doc12217566 +Ref: 3ea912217566 +Ref: library/compileall compileall-byte-compile-python-libraries12217566 +Ref: 3eaa12217566 +Ref: library/compileall module-compileall12217566 +Ref: 1f12217566 +Ref: compileall — Byte-compile Python libraries-Footnote-112218458 +Node: Command-line use12218528 +Ref: library/compileall command-line-use12218650 +Ref: 3eab12218650 +Ref: library/compileall cmdoption-compileall-arg-directory12218799 +Ref: 3eac12218799 +Ref: library/compileall cmdoption-compileall-arg-file12218833 +Ref: 3ead12218833 +Ref: library/compileall cmdoption-compileall-l12219089 +Ref: 3eae12219089 +Ref: library/compileall cmdoption-compileall-f12219247 +Ref: 3eaf12219247 +Ref: library/compileall cmdoption-compileall-q12219326 +Ref: 3eb012219326 +Ref: library/compileall cmdoption-compileall-d12219518 +Ref: 3eb112219518 +Ref: library/compileall cmdoption-compileall-s12219879 +Ref: 3eb212219879 +Ref: library/compileall cmdoption-compileall-p12219916 +Ref: 3eb312219916 +Ref: library/compileall cmdoption-compileall-x12220100 +Ref: 3eb412220100 +Ref: library/compileall cmdoption-compileall-i12220281 +Ref: 3eb512220281 +Ref: library/compileall cmdoption-compileall-b12220491 +Ref: 3eb612220491 +Ref: library/compileall cmdoption-compileall-r12220825 +Ref: 3eb712220825 +Ref: library/compileall cmdoption-compileall-j12221103 +Ref: 3eb812221103 +Ref: library/compileall cmdoption-compileall-invalidation-mode12221290 +Ref: 3eb912221290 +Ref: library/compileall cmdoption-compileall-o12222107 +Ref: 3eba12222107 +Ref: library/compileall cmdoption-compileall-e12222308 +Ref: 3ebb12222308 +Ref: library/compileall cmdoption-compileall-hardlink-dupes12222396 +Ref: 3ebc12222396 +Ref: Command-line use-Footnote-112223700 +Node: Public functions12223742 +Ref: library/compileall public-functions12223864 +Ref: 3ebd12223864 +Ref: library/compileall compileall compile_dir12223917 +Ref: 77b12223917 +Ref: library/compileall compileall compile_file12228071 +Ref: a6212228071 +Ref: library/compileall compileall compile_path12231075 +Ref: a6312231075 +Ref: Public functions-Footnote-112232804 +Ref: Public functions-Footnote-212232846 +Node: dis — Disassembler for Python bytecode12232888 +Ref: library/dis doc12233094 +Ref: 3ebe12233094 +Ref: library/dis dis-disassembler-for-python-bytecode12233094 +Ref: 3ebf12233094 +Ref: library/dis module-dis12233094 +Ref: 3612233094 +Ref: dis — Disassembler for Python bytecode-Footnote-112235063 +Node: Bytecode analysis12235126 +Ref: library/dis bytecode-analysis12235247 +Ref: 3ec012235247 +Ref: library/dis dis Bytecode12235487 +Ref: bc812235487 +Ref: library/dis dis Bytecode from_traceback12236543 +Ref: bca12236543 +Ref: library/dis dis Bytecode codeobj12236789 +Ref: 3ec112236789 +Ref: library/dis dis Bytecode first_line12236850 +Ref: 3ec212236850 +Ref: library/dis dis Bytecode dis12236944 +Ref: bc912236944 +Ref: library/dis dis Bytecode info12237135 +Ref: 3ec312237135 +Node: Analysis functions12237679 +Ref: library/dis analysis-functions12237837 +Ref: 3ec412237837 +Ref: library/dis dis code_info12238143 +Ref: ef712238143 +Ref: library/dis dis show_code12238682 +Ref: bc312238682 +Ref: library/dis dis dis12239146 +Ref: 78a12239146 +Ref: library/dis dis distb12240681 +Ref: bc412240681 +Ref: library/dis dis disassemble12241166 +Ref: bc512241166 +Ref: library/dis dis disco12241257 +Ref: 3ec512241257 +Ref: library/dis dis get_instructions12242244 +Ref: bc712242244 +Ref: library/dis dis findlinestarts12242955 +Ref: 3ec612242955 +Ref: library/dis dis findlabels12243490 +Ref: 3ec712243490 +Ref: library/dis dis stack_effect12243660 +Ref: bcb12243660 +Ref: Analysis functions-Footnote-112244228 +Node: Python Bytecode Instructions12244270 +Ref: library/dis bytecodes12244429 +Ref: 17012244429 +Ref: library/dis python-bytecode-instructions12244429 +Ref: 3ec812244429 +Ref: library/dis dis Instruction12244663 +Ref: bc612244663 +Ref: library/dis dis Instruction opcode12244730 +Ref: 3ec912244730 +Ref: library/dis dis Instruction opname12244923 +Ref: 3ecb12244923 +Ref: library/dis dis Instruction arg12244991 +Ref: 3ecc12244991 +Ref: library/dis dis Instruction argval12245083 +Ref: 3ecd12245083 +Ref: library/dis dis Instruction argrepr12245167 +Ref: 3ece12245167 +Ref: library/dis dis Instruction offset12245298 +Ref: 3ecf12245298 +Ref: library/dis dis Instruction starts_line12245382 +Ref: 3ed012245382 +Ref: library/dis dis Instruction is_jump_target12245480 +Ref: 3ed112245480 +Ref: library/dis dis Instruction positions12245584 +Ref: 3ed212245584 +Ref: library/dis dis Positions12245828 +Ref: 3c9712245828 +Ref: library/dis dis Positions lineno12245940 +Ref: 3ed312245940 +Ref: library/dis dis Positions end_lineno12245963 +Ref: 3ed412245963 +Ref: library/dis dis Positions col_offset12245990 +Ref: 3ed512245990 +Ref: library/dis dis Positions end_col_offset12246017 +Ref: 3ed612246017 +Ref: library/dis opcode-NOP12246177 +Ref: 3ed712246177 +Ref: library/dis opcode-POP_TOP12246309 +Ref: 3ed812246309 +Ref: library/dis opcode-COPY12246373 +Ref: 2bf12246373 +Ref: library/dis opcode-SWAP12246532 +Ref: 2c012246532 +Ref: library/dis opcode-CACHE12246627 +Ref: 2b712246627 +Ref: library/dis opcode-UNARY_POSITIVE12247460 +Ref: 3ed912247460 +Ref: library/dis opcode-UNARY_NEGATIVE12247523 +Ref: 3eda12247523 +Ref: library/dis opcode-UNARY_NOT12247586 +Ref: 3edb12247586 +Ref: library/dis opcode-UNARY_INVERT12247647 +Ref: 3edc12247647 +Ref: library/dis opcode-GET_ITER12247708 +Ref: 3edd12247708 +Ref: library/dis opcode-GET_YIELD_FROM_ITER12247770 +Ref: 3ede12247770 +Ref: library/dis opcode-BINARY_OP12248456 +Ref: 2b812248456 +Ref: library/dis opcode-BINARY_SUBSCR12248601 +Ref: 122812248601 +Ref: library/dis opcode-STORE_SUBSCR12248668 +Ref: 120312248668 +Ref: library/dis opcode-DELETE_SUBSCR12248735 +Ref: 3edf12248735 +Ref: library/dis opcode-GET_AWAITABLE12248821 +Ref: 122512248821 +Ref: library/dis opcode-GET_AITER12249413 +Ref: 3ee012249413 +Ref: library/dis opcode-GET_ANEXT12249616 +Ref: 3ee112249616 +Ref: library/dis opcode-END_ASYNC_FOR12249798 +Ref: 70712249798 +Ref: library/dis opcode-BEFORE_ASYNC_WITH12250348 +Ref: 3ee212250348 +Ref: library/dis opcode-PRINT_EXPR12250600 +Ref: 3ee312250600 +Ref: library/dis opcode-SET_ADD12250836 +Ref: 3ee412250836 +Ref: library/dis opcode-LIST_APPEND12250947 +Ref: 3ee512250947 +Ref: library/dis opcode-MAP_ADD12251067 +Ref: 70912251067 +Ref: library/dis opcode-RETURN_VALUE12251579 +Ref: 3ee612251579 +Ref: library/dis opcode-YIELD_VALUE12251659 +Ref: 3ee712251659 +Ref: library/dis opcode-SETUP_ANNOTATIONS12251742 +Ref: 9d112251742 +Ref: library/dis opcode-IMPORT_STAR12252040 +Ref: 3ee812252040 +Ref: library/dis opcode-POP_EXCEPT12252279 +Ref: 3ee912252279 +Ref: library/dis opcode-RERAISE12252511 +Ref: 3eea12252511 +Ref: library/dis opcode-PUSH_EXC_INFO12252861 +Ref: 3eeb12252861 +Ref: library/dis opcode-CHECK_EXC_MATCH12253099 +Ref: 2c112253099 +Ref: library/dis opcode-CHECK_EG_MATCH12253323 +Ref: 2c212253323 +Ref: library/dis opcode-PREP_RERAISE_STAR12253761 +Ref: 125612253761 +Ref: library/dis opcode-WITH_EXCEPT_START12254168 +Ref: 3eec12254168 +Ref: library/dis opcode-LOAD_ASSERTION_ERROR12254702 +Ref: 5bb12254702 +Ref: library/dis opcode-LOAD_BUILD_CLASS12254866 +Ref: 3eed12254866 +Ref: library/dis opcode-BEFORE_WITH12255005 +Ref: 3eee12255005 +Ref: library/dis opcode-GET_LEN12255434 +Ref: 3eef12255434 +Ref: library/dis opcode-MATCH_MAPPING12255524 +Ref: 3ef012255524 +Ref: library/dis opcode-MATCH_SEQUENCE12255830 +Ref: 3ef112255830 +Ref: library/dis opcode-MATCH_KEYS12256230 +Ref: 2be12256230 +Ref: library/dis opcode-STORE_NAME12256644 +Ref: 3ef212256644 +Ref: library/dis opcode-DELETE_NAME12256898 +Ref: 3ef512256898 +Ref: library/dis opcode-UNPACK_SEQUENCE12257046 +Ref: 122912257046 +Ref: library/dis opcode-UNPACK_EX12257182 +Ref: 3ef612257182 +Ref: library/dis opcode-STORE_ATTR12257685 +Ref: 122712257685 +Ref: library/dis opcode-DELETE_ATTR12257816 +Ref: 3ef712257816 +Ref: library/dis opcode-STORE_GLOBAL12257930 +Ref: 3ef412257930 +Ref: library/dis opcode-DELETE_GLOBAL12258036 +Ref: 3ef812258036 +Ref: library/dis opcode-LOAD_CONST12258138 +Ref: 3ef912258138 +Ref: library/dis opcode-LOAD_NAME12258224 +Ref: 3efa12258224 +Ref: library/dis opcode-BUILD_TUPLE12258332 +Ref: 3efb12258332 +Ref: library/dis opcode-BUILD_LIST12258479 +Ref: 3efc12258479 +Ref: library/dis opcode-BUILD_SET12258571 +Ref: 3efd12258571 +Ref: library/dis opcode-BUILD_MAP12258661 +Ref: 3efe12258661 +Ref: library/dis opcode-BUILD_CONST_KEY_MAP12259021 +Ref: 9ce12259021 +Ref: library/dis opcode-BUILD_STRING12259336 +Ref: 9cd12259336 +Ref: library/dis opcode-LIST_TO_TUPLE12259499 +Ref: 3eff12259499 +Ref: library/dis opcode-LIST_EXTEND12259637 +Ref: 3f0012259637 +Ref: library/dis opcode-SET_UPDATE12259760 +Ref: 3f0112259760 +Ref: library/dis opcode-DICT_UPDATE12259880 +Ref: 3f0212259880 +Ref: library/dis opcode-DICT_MERGE12260003 +Ref: 3f0312260003 +Ref: library/dis opcode-LOAD_ATTR12260142 +Ref: 122612260142 +Ref: library/dis opcode-COMPARE_OP12260234 +Ref: 5bd12260234 +Ref: library/dis opcode-IS_OP12260366 +Ref: 3f0412260366 +Ref: library/dis opcode-CONTAINS_OP12260494 +Ref: 3f0512260494 +Ref: library/dis opcode-IMPORT_NAME12260628 +Ref: 3f0612260628 +Ref: library/dis opcode-IMPORT_FROM12261025 +Ref: 3f0712261025 +Ref: library/dis opcode-JUMP_FORWARD12261261 +Ref: 3f0812261261 +Ref: library/dis opcode-JUMP_BACKWARD12261341 +Ref: 2c312261341 +Ref: library/dis opcode-JUMP_BACKWARD_NO_INTERRUPT12261473 +Ref: 2c412261473 +Ref: library/dis opcode-POP_JUMP_FORWARD_IF_TRUE12261631 +Ref: 2c512261631 +Ref: library/dis opcode-POP_JUMP_BACKWARD_IF_TRUE12261791 +Ref: 2c612261791 +Ref: library/dis opcode-POP_JUMP_FORWARD_IF_FALSE12261952 +Ref: 2c712261952 +Ref: library/dis opcode-POP_JUMP_BACKWARD_IF_FALSE12262114 +Ref: 2c812262114 +Ref: library/dis opcode-POP_JUMP_FORWARD_IF_NOT_NONE12262277 +Ref: 2c912262277 +Ref: library/dis opcode-POP_JUMP_BACKWARD_IF_NOT_NONE12262450 +Ref: 2ca12262450 +Ref: library/dis opcode-POP_JUMP_FORWARD_IF_NONE12262624 +Ref: 2cb12262624 +Ref: library/dis opcode-POP_JUMP_BACKWARD_IF_NONE12262790 +Ref: 2cc12262790 +Ref: library/dis opcode-JUMP_IF_TRUE_OR_POP12262957 +Ref: 2cd12262957 +Ref: library/dis opcode-JUMP_IF_FALSE_OR_POP12263267 +Ref: 2ce12263267 +Ref: library/dis opcode-FOR_ITER12263578 +Ref: 3f0912263578 +Ref: library/dis opcode-LOAD_GLOBAL12263897 +Ref: 122a12263897 +Ref: library/dis opcode-LOAD_FAST12264143 +Ref: 3f0a12264143 +Ref: library/dis opcode-STORE_FAST12264262 +Ref: 3ef312264262 +Ref: library/dis opcode-DELETE_FAST12264356 +Ref: 3f0b12264356 +Ref: library/dis opcode-MAKE_CELL12264439 +Ref: 3f0c12264439 +Ref: library/dis opcode-LOAD_CLOSURE12264608 +Ref: 3f0d12264608 +Ref: library/dis opcode-LOAD_DEREF12265038 +Ref: 3f0e12265038 +Ref: library/dis opcode-LOAD_CLASSDEREF12265317 +Ref: cac12265317 +Ref: library/dis opcode-STORE_DEREF12265651 +Ref: 3f0f12265651 +Ref: library/dis opcode-DELETE_DEREF12265876 +Ref: 3f1012265876 +Ref: library/dis opcode-COPY_FREE_VARS12266161 +Ref: 126a12266161 +Ref: library/dis opcode-RAISE_VARARGS12266383 +Ref: 3f1112266383 +Ref: library/dis opcode-CALL12266808 +Ref: 2bb12266808 +Ref: library/dis opcode-CALL_FUNCTION_EX12267656 +Ref: 9d012267656 +Ref: library/dis opcode-LOAD_METHOD12268336 +Ref: 88a12268336 +Ref: library/dis opcode-PRECALL12268823 +Ref: 2ba12268823 +Ref: library/dis opcode-PUSH_NULL12269076 +Ref: 2b912269076 +Ref: library/dis opcode-KW_NAMES12269298 +Ref: 2bc12269298 +Ref: library/dis opcode-MAKE_FUNCTION12269550 +Ref: 9cf12269550 +Ref: library/dis opcode-BUILD_SLICE12270370 +Ref: 3f1212270370 +Ref: library/dis opcode-EXTENDED_ARG12270652 +Ref: 11a912270652 +Ref: library/dis opcode-FORMAT_VALUE12270989 +Ref: 9cc12270989 +Ref: library/dis opcode-MATCH_CLASS12271850 +Ref: 2bd12271850 +Ref: library/dis opcode-RESUME12272458 +Ref: 2cf12272458 +Ref: library/dis opcode-RETURN_GENERATOR12272897 +Ref: 3f1312272897 +Ref: library/dis opcode-SEND12273109 +Ref: 3f1412273109 +Ref: library/dis opcode-ASYNC_GEN_WRAP12273276 +Ref: 3f1512273276 +Ref: library/dis opcode-HAVE_ARGUMENT12273462 +Ref: 3f1612273462 +Node: Opcode collections12273887 +Ref: library/dis id112274019 +Ref: 3f1712274019 +Ref: library/dis opcode-collections12274019 +Ref: 3eca12274019 +Ref: library/dis dis opname12274164 +Ref: 3f1812274164 +Ref: library/dis dis opmap12274251 +Ref: 3f1912274251 +Ref: library/dis dis cmp_op12274327 +Ref: 3f1a12274327 +Ref: library/dis dis hasconst12274396 +Ref: 3f1b12274396 +Ref: library/dis dis hasfree12274472 +Ref: 3f1c12274472 +Ref: library/dis dis hasname12274808 +Ref: 3f1d12274808 +Ref: library/dis dis hasjrel12274893 +Ref: 3f1e12274893 +Ref: library/dis dis hasjabs12274978 +Ref: 3f1f12274978 +Ref: library/dis dis haslocal12275064 +Ref: 3f2012275064 +Ref: library/dis dis hascompare12275146 +Ref: 3f2112275146 +Node: pickletools — Tools for pickle developers12275223 +Ref: library/pickletools doc12275376 +Ref: 3f2212275376 +Ref: library/pickletools module-pickletools12275376 +Ref: c812275376 +Ref: library/pickletools pickletools-tools-for-pickle-developers12275376 +Ref: 3f2312275376 +Ref: pickletools — Tools for pickle developers-Footnote-112276167 +Node: Command line usage<2>12276238 +Ref: library/pickletools command-line-usage12276373 +Ref: 3f2412276373 +Node: Command line options<3>12277326 +Ref: library/pickletools command-line-options12277407 +Ref: 3f2512277407 +Ref: library/pickletools cmdoption-pickletools-a12277470 +Ref: 3f2612277470 +Ref: library/pickletools cmdoption-pickletools-annotate12277470 +Ref: 3f2712277470 +Ref: library/pickletools cmdoption-pickletools-o12277564 +Ref: 3f2812277564 +Ref: library/pickletools cmdoption-pickletools-output12277564 +Ref: 3f2912277564 +Ref: library/pickletools cmdoption-pickletools-l12277662 +Ref: 3f2a12277662 +Ref: library/pickletools cmdoption-pickletools-indentlevel12277662 +Ref: 3f2b12277662 +Ref: library/pickletools cmdoption-pickletools-m12277771 +Ref: 3f2c12277771 +Ref: library/pickletools cmdoption-pickletools-memo12277771 +Ref: 3f2d12277771 +Ref: library/pickletools cmdoption-pickletools-p12277891 +Ref: 3f2e12277891 +Ref: library/pickletools cmdoption-pickletools-preamble12277891 +Ref: 3f2f12277891 +Node: Programmatic Interface<2>12278041 +Ref: library/pickletools programmatic-interface12278176 +Ref: 3f3012278176 +Ref: library/pickletools pickletools dis12278243 +Ref: 93212278243 +Ref: library/pickletools pickletools genops12279072 +Ref: 3f3112279072 +Ref: library/pickletools pickletools optimize12279509 +Ref: 22ba12279509 +Node: MS Windows Specific Services12279789 +Ref: library/windows doc12279945 +Ref: 3f3212279945 +Ref: library/windows ms-windows-specific-services12279945 +Ref: 3f3312279945 +Ref: library/windows mswin-specific-services12279945 +Ref: 183812279945 +Node: msvcrt — Useful routines from the MS VC++ runtime12280253 +Ref: library/msvcrt doc12280412 +Ref: 3f3412280412 +Ref: library/msvcrt module-msvcrt12280412 +Ref: b412280412 +Ref: library/msvcrt msvcrt-useful-routines-from-the-ms-vc-runtime12280412 +Ref: 3f3512280412 +Node: File Operations12281427 +Ref: library/msvcrt file-operations12281550 +Ref: 3f3612281550 +Ref: library/msvcrt msvcrt-files12281550 +Ref: 3f3712281550 +Ref: library/msvcrt msvcrt locking12281601 +Ref: 3a4712281601 +Ref: library/msvcrt msvcrt LK_LOCK12282265 +Ref: 3f3812282265 +Ref: library/msvcrt msvcrt LK_RLCK12282290 +Ref: 3f3912282290 +Ref: library/msvcrt msvcrt LK_NBLCK12282531 +Ref: 3f3a12282531 +Ref: library/msvcrt msvcrt LK_NBRLCK12282557 +Ref: 3f3b12282557 +Ref: library/msvcrt msvcrt LK_UNLCK12282686 +Ref: 3f3c12282686 +Ref: library/msvcrt msvcrt setmode12282793 +Ref: 3f3d12282793 +Ref: library/msvcrt msvcrt open_osfhandle12283032 +Ref: 3a4812283032 +Ref: library/msvcrt msvcrt get_osfhandle12283531 +Ref: 3a4612283531 +Node: Console I/O12283791 +Ref: library/msvcrt console-i-o12283938 +Ref: 3f3e12283938 +Ref: library/msvcrt msvcrt-console12283938 +Ref: 3f3f12283938 +Ref: library/msvcrt msvcrt kbhit12283981 +Ref: 3f4012283981 +Ref: library/msvcrt msvcrt getch12284073 +Ref: 3f4112284073 +Ref: library/msvcrt msvcrt getwch12284554 +Ref: 3f4212284554 +Ref: library/msvcrt msvcrt getche12284666 +Ref: 3f4312284666 +Ref: library/msvcrt msvcrt getwche12284813 +Ref: 3f4412284813 +Ref: library/msvcrt msvcrt putch12284927 +Ref: 3f4512284927 +Ref: library/msvcrt msvcrt putwch12285031 +Ref: 3f4612285031 +Ref: library/msvcrt msvcrt ungetch12285155 +Ref: 3f4712285155 +Ref: library/msvcrt msvcrt ungetwch12285370 +Ref: 3f4812285370 +Node: Other Functions12285498 +Ref: library/msvcrt msvcrt-other12285621 +Ref: 3f4912285621 +Ref: library/msvcrt other-functions12285621 +Ref: 3f4a12285621 +Ref: library/msvcrt msvcrt heapmin12285672 +Ref: 3f4b12285672 +Node: winreg — Windows registry access12285865 +Ref: library/winreg doc12286081 +Ref: 3f4c12286081 +Ref: library/winreg module-winreg12286081 +Ref: 13412286081 +Ref: library/winreg winreg-windows-registry-access12286081 +Ref: 3f4d12286081 +Ref: library/winreg exception-changed12286495 +Ref: 3f4f12286495 +Node: Functions<12>12286735 +Ref: library/winreg functions12286841 +Ref: 3f5012286841 +Ref: library/winreg id112286841 +Ref: 3f5112286841 +Ref: library/winreg winreg CloseKey12286925 +Ref: 3f5212286925 +Ref: library/winreg winreg ConnectRegistry12287246 +Ref: 3a4e12287246 +Ref: library/winreg winreg CreateKey12287938 +Ref: 3a4f12287938 +Ref: library/winreg winreg CreateKeyEx12288900 +Ref: 3a5012288900 +Ref: library/winreg winreg DeleteKey12290238 +Ref: 3a5112290238 +Ref: library/winreg winreg DeleteKeyEx12290987 +Ref: 3a5212290987 +Ref: library/winreg winreg DeleteValue12292264 +Ref: 3a5312292264 +Ref: library/winreg winreg EnumKey12292632 +Ref: 3a5612292632 +Ref: library/winreg winreg EnumValue12293299 +Ref: 3a5712293299 +Ref: library/winreg winreg ExpandEnvironmentStrings12294565 +Ref: 3a5812294565 +Ref: library/winreg winreg FlushKey12294916 +Ref: 3f5912294916 +Ref: library/winreg winreg LoadKey12295736 +Ref: 3a5912295736 +Ref: library/winreg winreg OpenKey12296929 +Ref: 3a5a12296929 +Ref: library/winreg winreg OpenKeyEx12297002 +Ref: 3f5c12297002 +Ref: library/winreg winreg QueryInfoKey12298085 +Ref: 3a5c12298085 +Ref: library/winreg winreg QueryValue12298981 +Ref: 3a5e12298981 +Ref: library/winreg winreg QueryValueEx12299858 +Ref: 3a5f12299858 +Ref: library/winreg winreg SaveKey12300734 +Ref: 3a6012300734 +Ref: library/winreg winreg SetValue12301780 +Ref: 3a6112301780 +Ref: library/winreg winreg SetValueEx12302959 +Ref: 3a6212302959 +Ref: library/winreg winreg DisableReflectionKey12304207 +Ref: 3a5412304207 +Ref: library/winreg winreg EnableReflectionKey12304839 +Ref: 3a5512304839 +Ref: library/winreg winreg QueryReflectionKey12305348 +Ref: 3a5d12305348 +Ref: Functions<12>-Footnote-112305852 +Ref: Functions<12>-Footnote-212305929 +Node: Constants<10>12306006 +Ref: library/winreg constants12306144 +Ref: 3f6112306144 +Ref: library/winreg id212306144 +Ref: 3f6212306144 +Node: HKEY_* Constants12306326 +Ref: library/winreg hkey-constants12306414 +Ref: 3f5412306414 +Ref: library/winreg id312306414 +Ref: 3f6312306414 +Ref: library/winreg winreg HKEY_CLASSES_ROOT12306467 +Ref: 3f6412306467 +Ref: library/winreg winreg HKEY_CURRENT_USER12306718 +Ref: 3f6512306718 +Ref: library/winreg winreg HKEY_LOCAL_MACHINE12307021 +Ref: 3f5b12307021 +Ref: library/winreg winreg HKEY_USERS12307245 +Ref: 3f5a12307245 +Ref: library/winreg winreg HKEY_PERFORMANCE_DATA12307454 +Ref: 3f6612307454 +Ref: library/winreg winreg HKEY_CURRENT_CONFIG12307721 +Ref: 3f6712307721 +Ref: library/winreg winreg HKEY_DYN_DATA12307856 +Ref: 3f6812307856 +Node: Access Rights12307948 +Ref: library/winreg access-rights12308056 +Ref: 3f5612308056 +Ref: library/winreg id412308056 +Ref: 3f6912308056 +Ref: library/winreg winreg KEY_ALL_ACCESS12308167 +Ref: 3f6a12308167 +Ref: library/winreg winreg KEY_WRITE12308456 +Ref: 3f5512308456 +Ref: library/winreg winreg KEY_READ12308609 +Ref: 3f5d12308609 +Ref: library/winreg winreg KEY_EXECUTE12308788 +Ref: 3f7012308788 +Ref: library/winreg winreg KEY_QUERY_VALUE12308860 +Ref: 3f6b12308860 +Ref: library/winreg winreg KEY_SET_VALUE12308948 +Ref: 3f5f12308948 +Ref: library/winreg winreg KEY_CREATE_SUB_KEY12309039 +Ref: 3f6c12309039 +Ref: library/winreg winreg KEY_ENUMERATE_SUB_KEYS12309129 +Ref: 3f6d12309129 +Ref: library/winreg winreg KEY_NOTIFY12309229 +Ref: 3f6e12309229 +Ref: library/winreg winreg KEY_CREATE_LINK12309363 +Ref: 3f6f12309363 +Ref: Access Rights-Footnote-112309494 +Node: 64-bit Specific12309571 +Ref: library/winreg bit-access-rights12309636 +Ref: 3f7112309636 +Ref: library/winreg bit-specific12309636 +Ref: 3f7212309636 +Ref: library/winreg winreg KEY_WOW64_64KEY12309755 +Ref: 3f5712309755 +Ref: library/winreg winreg KEY_WOW64_32KEY12309943 +Ref: 3f7312309943 +Ref: 64-bit Specific-Footnote-112310167 +Node: Value Types12310239 +Ref: library/winreg id512310322 +Ref: 3f7412310322 +Ref: library/winreg value-types12310322 +Ref: 3f6012310322 +Ref: library/winreg winreg REG_BINARY12310417 +Ref: 3f7512310417 +Ref: library/winreg winreg REG_DWORD12310477 +Ref: 3f7612310477 +Ref: library/winreg winreg REG_DWORD_LITTLE_ENDIAN12310526 +Ref: 3f7712310526 +Ref: library/winreg winreg REG_DWORD_BIG_ENDIAN12310658 +Ref: 3f7812310658 +Ref: library/winreg winreg REG_EXPAND_SZ12310741 +Ref: 3f5812310741 +Ref: library/winreg winreg REG_LINK12310870 +Ref: 3f7912310870 +Ref: library/winreg winreg REG_MULTI_SZ12310928 +Ref: 140712310928 +Ref: library/winreg winreg REG_NONE12311094 +Ref: 3f7a12311094 +Ref: library/winreg winreg REG_QWORD12311150 +Ref: 97112311150 +Ref: library/winreg winreg REG_QWORD_LITTLE_ENDIAN12311227 +Ref: 3f7b12311227 +Ref: library/winreg winreg REG_RESOURCE_LIST12311384 +Ref: 3f7c12311384 +Ref: library/winreg winreg REG_FULL_RESOURCE_DESCRIPTOR12311457 +Ref: 3f7d12311457 +Ref: library/winreg winreg REG_RESOURCE_REQUIREMENTS_LIST12311530 +Ref: 3f7e12311530 +Ref: library/winreg winreg REG_SZ12311611 +Ref: 3f5e12311611 +Ref: Value Types-Footnote-112311704 +Node: Registry Handle Objects12311781 +Ref: library/winreg handle-object12311897 +Ref: 3f4e12311897 +Ref: library/winreg registry-handle-objects12311897 +Ref: 3f7f12311897 +Ref: library/winreg winreg PyHKEY Close12313051 +Ref: 3f5312313051 +Ref: library/winreg winreg PyHKEY Detach12313183 +Ref: 3a5b12313183 +Ref: library/winreg winreg PyHKEY __enter__12313782 +Ref: 3f8012313782 +Ref: library/winreg winreg PyHKEY __exit__12313814 +Ref: 3f8112313814 +Node: winsound — Sound-playing interface for Windows12314209 +Ref: library/winsound doc12314365 +Ref: 3f8212314365 +Ref: library/winsound module-winsound12314365 +Ref: 13512314365 +Ref: library/winsound winsound-sound-playing-interface-for-windows12314365 +Ref: 3f8312314365 +Ref: library/winsound winsound Beep12314715 +Ref: 97312314715 +Ref: library/winsound winsound PlaySound12315103 +Ref: 97512315103 +Ref: library/winsound winsound MessageBeep12315675 +Ref: 97412315675 +Ref: library/winsound winsound SND_FILENAME12316284 +Ref: 3f8412316284 +Ref: library/winsound winsound SND_ALIAS12316417 +Ref: 3f8512316417 +Ref: library/winsound winsound SND_LOOP12318035 +Ref: 3f8712318035 +Ref: library/winsound winsound SND_MEMORY12318222 +Ref: 3f8912318222 +Ref: library/winsound winsound SND_PURGE12318584 +Ref: 3f8a12318584 +Ref: library/winsound winsound SND_ASYNC12318744 +Ref: 3f8812318744 +Ref: library/winsound winsound SND_NODEFAULT12318840 +Ref: 3f8612318840 +Ref: library/winsound winsound SND_NOSTOP12318963 +Ref: 3f8b12318963 +Ref: library/winsound winsound SND_NOWAIT12319043 +Ref: 3f8c12319043 +Ref: library/winsound winsound MB_ICONASTERISK12319201 +Ref: 3f8d12319201 +Ref: library/winsound winsound MB_ICONEXCLAMATION12319279 +Ref: 3f8e12319279 +Ref: library/winsound winsound MB_ICONHAND12319364 +Ref: 3f8f12319364 +Ref: library/winsound winsound MB_ICONQUESTION12319435 +Ref: 3f9012319435 +Ref: library/winsound winsound MB_OK12319514 +Ref: 3f9112319514 +Node: Unix Specific Services12319582 +Ref: library/unix doc12319732 +Ref: 3f9212319732 +Ref: library/unix unix12319732 +Ref: 3f9312319732 +Ref: library/unix unix-specific-services12319732 +Ref: 3f9412319732 +Node: posix — The most common POSIX system calls12320353 +Ref: library/posix doc12320494 +Ref: 3f9512320494 +Ref: library/posix module-posix12320494 +Ref: ce12320494 +Ref: library/posix posix-the-most-common-posix-system-calls12320494 +Ref: 3f9612320494 +Node: Large File Support12321693 +Ref: library/posix large-file-support12321824 +Ref: 3f9712321824 +Ref: library/posix posix-large-files12321824 +Ref: 3f9812321824 +Node: Notable Module Contents12322778 +Ref: library/posix notable-module-contents12322909 +Ref: 3f9912322909 +Ref: library/posix posix-contents12322909 +Ref: 3f9a12322909 +Ref: library/posix posix environ12323110 +Ref: 3f9b12323110 +Node: pwd — The password database12324298 +Ref: library/pwd doc12324474 +Ref: 3f9c12324474 +Ref: library/pwd module-pwd12324474 +Ref: d312324474 +Ref: library/pwd pwd-the-password-database12324474 +Ref: 3f9d12324474 +Ref: library/pwd pwd getpwuid12326983 +Ref: 146512326983 +Ref: library/pwd pwd getpwnam12327089 +Ref: 147512327089 +Ref: library/pwd pwd getpwall12327190 +Ref: 3f9e12327190 +Node: grp — The group database12327504 +Ref: library/grp doc12327671 +Ref: 3f9f12327671 +Ref: library/grp grp-the-group-database12327671 +Ref: 3fa012327671 +Ref: library/grp module-grp12327671 +Ref: 8612327671 +Ref: library/grp grp getgrgid12329449 +Ref: 99b12329449 +Ref: library/grp grp getgrnam12329751 +Ref: 147612329751 +Ref: library/grp grp getgrall12329927 +Ref: 3fa112329927 +Node: termios — POSIX style tty control12330223 +Ref: library/termios doc12330395 +Ref: 3fa212330395 +Ref: library/termios module-termios12330395 +Ref: 10012330395 +Ref: library/termios termios-posix-style-tty-control12330395 +Ref: 3fa312330395 +Ref: library/termios termios tcgetattr12331372 +Ref: 3fa412331372 +Ref: library/termios termios tcsetattr12331951 +Ref: 3fa512331951 +Ref: library/termios termios tcsendbreak12332445 +Ref: 3fa612332445 +Ref: library/termios termios tcdrain12332659 +Ref: 3fa712332659 +Ref: library/termios termios tcflush12332782 +Ref: 3fa812332782 +Ref: library/termios termios tcflow12333040 +Ref: 3fa912333040 +Ref: library/termios termios tcgetwinsize12333320 +Ref: 3faa12333320 +Ref: library/termios termios tcsetwinsize12333562 +Ref: 3fab12333562 +Node: Example<15>12334133 +Ref: library/termios example12334216 +Ref: 3fac12334216 +Ref: library/termios termios-example12334216 +Ref: 3fad12334216 +Node: tty — Terminal control functions12334975 +Ref: library/tty doc12335154 +Ref: 3fae12335154 +Ref: library/tty module-tty12335154 +Ref: 11f12335154 +Ref: library/tty tty-terminal-control-functions12335154 +Ref: 3faf12335154 +Ref: library/tty tty setraw12335577 +Ref: 3fb012335577 +Ref: library/tty tty setcbreak12335813 +Ref: 3fb112335813 +Ref: tty — Terminal control functions-Footnote-112336178 +Node: pty — Pseudo-terminal utilities12336241 +Ref: library/pty doc12336427 +Ref: 3fb212336427 +Ref: library/pty module-pty12336427 +Ref: d212336427 +Ref: library/pty pty-pseudo-terminal-utilities12336427 +Ref: 3fb312336427 +Ref: library/pty pty fork12337073 +Ref: 3fb412337073 +Ref: library/pty pty openpty12337488 +Ref: 3fb512337488 +Ref: library/pty pty spawn12337767 +Ref: c2012337767 +Ref: pty — Pseudo-terminal utilities-Footnote-112340025 +Node: Example<16>12340088 +Ref: library/pty example12340169 +Ref: 3fb612340169 +Node: fcntl — The fcntl and ioctl system calls12341351 +Ref: library/fcntl doc12341542 +Ref: 3fb712341542 +Ref: library/fcntl fcntl-the-fcntl-and-ioctl-system-calls12341542 +Ref: 3fb812341542 +Ref: library/fcntl module-fcntl12341542 +Ref: 7912341542 +Ref: library/fcntl fcntl fcntl12343628 +Ref: 2c9512343628 +Ref: library/fcntl fcntl ioctl12345073 +Ref: 10dc12345073 +Ref: library/fcntl fcntl flock12347407 +Ref: 3a4512347407 +Ref: library/fcntl fcntl lockf12347915 +Ref: 105312347915 +Node: resource — Resource usage information12350644 +Ref: library/resource doc12350841 +Ref: 3fb912350841 +Ref: library/resource module-resource12350841 +Ref: dd12350841 +Ref: library/resource resource-resource-usage-information12350841 +Ref: 3fba12350841 +Ref: library/resource resource error12351558 +Ref: 3fbb12351558 +Ref: resource — Resource usage information-Footnote-112351832 +Node: Resource Limits12351874 +Ref: library/resource resource-limits12351988 +Ref: 3fbc12351988 +Ref: library/resource resource RLIM_INFINITY12352865 +Ref: 3fbd12352865 +Ref: library/resource resource getrlimit12352969 +Ref: 3fbe12352969 +Ref: library/resource resource setrlimit12353263 +Ref: 39e912353263 +Ref: library/resource resource prlimit12354422 +Ref: c2712354422 +Ref: library/resource resource RLIMIT_CORE12356012 +Ref: 39ea12356012 +Ref: library/resource resource RLIMIT_CPU12356273 +Ref: 3fc012356273 +Ref: library/resource resource RLIMIT_FSIZE12356633 +Ref: 3fc112356633 +Ref: library/resource resource RLIMIT_DATA12356729 +Ref: 3fc212356729 +Ref: library/resource resource RLIMIT_STACK12356820 +Ref: 3fc312356820 +Ref: library/resource resource RLIMIT_RSS12357017 +Ref: 3fc412357017 +Ref: library/resource resource RLIMIT_NPROC12357135 +Ref: 3fc512357135 +Ref: library/resource resource RLIMIT_NOFILE12357238 +Ref: 3fbf12357238 +Ref: library/resource resource RLIMIT_OFILE12357352 +Ref: 3fc612357352 +Ref: library/resource resource RLIMIT_MEMLOCK12357435 +Ref: 3fc712357435 +Ref: library/resource resource RLIMIT_VMEM12357533 +Ref: 3fc812357533 +Ref: library/resource resource RLIMIT_AS12357635 +Ref: 3fc912357635 +Ref: library/resource resource RLIMIT_MSGQUEUE12357756 +Ref: c2812357756 +Ref: library/resource resource RLIMIT_NICE12357941 +Ref: c2912357941 +Ref: library/resource resource RLIMIT_RTPRIO12358134 +Ref: c2a12358134 +Ref: library/resource resource RLIMIT_RTTIME12358289 +Ref: c2b12358289 +Ref: library/resource resource RLIMIT_SIGPENDING12358542 +Ref: c2c12358542 +Ref: library/resource resource RLIMIT_SBSIZE12358712 +Ref: c2d12358712 +Ref: library/resource resource RLIMIT_SWAP12359006 +Ref: c2e12359006 +Ref: library/resource resource RLIMIT_NPTS12359382 +Ref: c2f12359382 +Ref: library/resource resource RLIMIT_KQUEUES12359552 +Ref: 12f012359552 +Ref: Resource Limits-Footnote-112359769 +Node: Resource Usage12359836 +Ref: library/resource resource-usage12359950 +Ref: 3fca12359950 +Ref: library/resource resource getrusage12360065 +Ref: 109812360065 +Ref: library/resource resource getpagesize12364558 +Ref: 3fcb12364558 +Ref: library/resource resource RUSAGE_SELF12364863 +Ref: 3fcc12364863 +Ref: library/resource resource RUSAGE_CHILDREN12365064 +Ref: 3fcd12365064 +Ref: library/resource resource RUSAGE_BOTH12365264 +Ref: 3fce12365264 +Ref: library/resource resource RUSAGE_THREAD12365462 +Ref: 3fcf12365462 +Node: syslog — Unix syslog library routines12365657 +Ref: library/syslog doc12365803 +Ref: 3fd012365803 +Ref: library/syslog module-syslog12365803 +Ref: fb12365803 +Ref: library/syslog syslog-unix-syslog-library-routines12365803 +Ref: 3fd112365803 +Ref: library/syslog syslog syslog12366616 +Ref: 3a4b12366616 +Ref: library/syslog syslog openlog12367691 +Ref: 13c912367691 +Ref: library/syslog syslog closelog12368707 +Ref: 3a4912368707 +Ref: library/syslog syslog setlogmask12369241 +Ref: 3a4a12369241 +Node: Examples<35>12370521 +Ref: library/syslog examples12370609 +Ref: 3fd212370609 +Node: Simple example12370675 +Ref: library/syslog simple-example12370738 +Ref: 3fd312370738 +Node: Superseded Modules12371248 +Ref: library/superseded doc12371396 +Ref: 3fd412371396 +Ref: library/superseded superseded12371396 +Ref: 3fd512371396 +Ref: library/superseded superseded-modules12371396 +Ref: 3fd612371396 +Node: aifc — Read and write AIFF and AIFC files12372708 +Ref: library/aifc doc12372872 +Ref: 3fd712372872 +Ref: library/aifc aifc-read-and-write-aiff-and-aifc-files12372872 +Ref: 3fd812372872 +Ref: library/aifc module-aifc12372872 +Ref: 412372872 +Ref: library/aifc aifc open12374278 +Ref: 84712374278 +Ref: library/aifc aifc aifc getnchannels12375337 +Ref: 3fd912375337 +Ref: library/aifc aifc aifc getsampwidth12375441 +Ref: 3fda12375441 +Ref: library/aifc aifc aifc getframerate12375529 +Ref: 3fdb12375529 +Ref: library/aifc aifc aifc getnframes12375631 +Ref: 3fdc12375631 +Ref: library/aifc aifc aifc getcomptype12375716 +Ref: 3fdd12375716 +Ref: library/aifc aifc aifc getcompname12375911 +Ref: 3fde12375911 +Ref: library/aifc aifc aifc getparams12376140 +Ref: bac12376140 +Ref: library/aifc aifc aifc getmarkers12376342 +Ref: 3fdf12376342 +Ref: library/aifc aifc aifc getmark12376661 +Ref: 3fe012376661 +Ref: library/aifc aifc aifc readframes12376796 +Ref: 3fe112376796 +Ref: library/aifc aifc aifc rewind12377013 +Ref: 3fe212377013 +Ref: library/aifc aifc aifc setpos12377144 +Ref: 3fe312377144 +Ref: library/aifc aifc aifc tell12377217 +Ref: 3fe412377217 +Ref: library/aifc aifc aifc close12377282 +Ref: bad12377282 +Ref: library/aifc aifc aifc aiff12377834 +Ref: 3fe512377834 +Ref: library/aifc aifc aifc aifc12378038 +Ref: 3fe612378038 +Ref: library/aifc aifc aifc setnchannels12378244 +Ref: 3fe712378244 +Ref: library/aifc aifc aifc setsampwidth12378343 +Ref: 3fe812378343 +Ref: library/aifc aifc aifc setframerate12378432 +Ref: 3fe912378432 +Ref: library/aifc aifc aifc setnframes12378529 +Ref: 3fea12378529 +Ref: library/aifc aifc aifc setcomptype12378743 +Ref: 3feb12378743 +Ref: library/aifc aifc aifc setparams12379230 +Ref: 3fec12379230 +Ref: library/aifc aifc aifc setmark12379568 +Ref: 3fed12379568 +Ref: library/aifc aifc aifc writeframes12379922 +Ref: baf12379922 +Ref: library/aifc aifc aifc writeframesraw12380166 +Ref: bae12380166 +Ref: aifc — Read and write AIFF and AIFC files-Footnote-112380634 +Ref: aifc — Read and write AIFF and AIFC files-Footnote-212380698 +Node: asynchat — Asynchronous socket command/response handler12380745 +Ref: library/asynchat doc12380958 +Ref: 3fee12380958 +Ref: library/asynchat asynchat-asynchronous-socket-command-response-handler12380958 +Ref: 3fef12380958 +Ref: library/asynchat module-asynchat12380958 +Ref: 812380958 +Ref: library/asynchat asynchat async_chat12382511 +Ref: c3d12382511 +Ref: library/asynchat asynchat async_chat ac_in_buffer_size12383426 +Ref: 3ff212383426 +Ref: library/asynchat asynchat async_chat ac_out_buffer_size12383528 +Ref: 3ff312383528 +Ref: library/asynchat asynchat async_chat close_when_done12384723 +Ref: 3ff512384723 +Ref: library/asynchat asynchat async_chat collect_incoming_data12384903 +Ref: 3ff012384903 +Ref: library/asynchat asynchat async_chat discard_buffers12385135 +Ref: 3ff612385135 +Ref: library/asynchat asynchat async_chat found_terminator12385302 +Ref: 3ff112385302 +Ref: library/asynchat asynchat async_chat get_terminator12385651 +Ref: 3ff712385651 +Ref: library/asynchat asynchat async_chat push12385747 +Ref: 3ff812385747 +Ref: library/asynchat asynchat async_chat push_with_producer12386084 +Ref: 3ff912386084 +Ref: library/asynchat asynchat async_chat set_terminator12386433 +Ref: 3ff412386433 +Ref: asynchat — Asynchronous socket command/response handler-Footnote-112387523 +Ref: asynchat — Asynchronous socket command/response handler-Footnote-212387591 +Node: asynchat Example12387642 +Ref: library/asynchat asynchat-example12387752 +Ref: 3ffa12387752 +Ref: library/asynchat id112387752 +Ref: 3ffb12387752 +Node: asyncore — Asynchronous socket handler12390101 +Ref: library/asyncore doc12390308 +Ref: 3ffc12390308 +Ref: library/asyncore asyncore-asynchronous-socket-handler12390308 +Ref: 3ffd12390308 +Ref: library/asyncore module-asyncore12390308 +Ref: a12390308 +Ref: library/asyncore asyncore loop12392950 +Ref: 3ffe12392950 +Ref: library/asyncore asyncore dispatcher12393980 +Ref: eec12393980 +Ref: library/asyncore asyncore dispatcher handle_read12395899 +Ref: 400112395899 +Ref: library/asyncore asyncore dispatcher handle_write12396060 +Ref: 400212396060 +Ref: library/asyncore asyncore dispatcher handle_expt12396436 +Ref: 400312396436 +Ref: library/asyncore asyncore dispatcher handle_connect12396648 +Ref: 400412396648 +Ref: library/asyncore asyncore dispatcher handle_close12396895 +Ref: 400512396895 +Ref: library/asyncore asyncore dispatcher handle_error12396974 +Ref: 400612396974 +Ref: library/asyncore asyncore dispatcher handle_accept12397141 +Ref: eee12397141 +Ref: library/asyncore asyncore dispatcher handle_accepted12397520 +Ref: eed12397520 +Ref: library/asyncore asyncore dispatcher readable12398008 +Ref: 3fff12398008 +Ref: library/asyncore asyncore dispatcher writable12398360 +Ref: 400012398360 +Ref: library/asyncore asyncore dispatcher create_socket12398867 +Ref: 400812398867 +Ref: library/asyncore asyncore dispatcher connect12399266 +Ref: 400712399266 +Ref: library/asyncore asyncore dispatcher send12399467 +Ref: 400912399467 +Ref: library/asyncore asyncore dispatcher recv12399559 +Ref: 400a12399559 +Ref: library/asyncore asyncore dispatcher listen12400006 +Ref: 400b12400006 +Ref: library/asyncore asyncore dispatcher bind12400277 +Ref: 400c12400277 +Ref: library/asyncore asyncore dispatcher accept12400716 +Ref: eef12400716 +Ref: library/asyncore asyncore dispatcher close12401358 +Ref: 400d12401358 +Ref: library/asyncore asyncore dispatcher_with_send12401646 +Ref: 400e12401646 +Ref: library/asyncore asyncore file_dispatcher12401877 +Ref: 400f12401877 +Ref: library/asyncore asyncore file_wrapper12402307 +Ref: 401012402307 +Ref: asyncore — Asynchronous socket handler-Footnote-112402824 +Ref: asyncore — Asynchronous socket handler-Footnote-212402892 +Node: asyncore Example basic HTTP client12402943 +Ref: library/asyncore asyncore-example-112403097 +Ref: 401112403097 +Ref: library/asyncore asyncore-example-basic-http-client12403097 +Ref: 401212403097 +Node: asyncore Example basic echo server12404107 +Ref: library/asyncore asyncore-example-212404261 +Ref: 401312404261 +Ref: library/asyncore asyncore-example-basic-echo-server12404261 +Ref: 401412404261 +Node: audioop — Manipulate raw audio data12405188 +Ref: library/audioop doc12405378 +Ref: 401512405378 +Ref: library/audioop audioop-manipulate-raw-audio-data12405378 +Ref: 401612405378 +Ref: library/audioop module-audioop12405378 +Ref: c12405378 +Ref: library/audioop audioop error12406414 +Ref: 401712406414 +Ref: library/audioop audioop add12406544 +Ref: 401812406544 +Ref: library/audioop audioop adpcm2lin12406875 +Ref: 401912406875 +Ref: library/audioop audioop alaw2lin12407194 +Ref: 401b12407194 +Ref: library/audioop audioop avg12407455 +Ref: 401c12407455 +Ref: library/audioop audioop avgpp12407559 +Ref: 401d12407559 +Ref: library/audioop audioop bias12407765 +Ref: 401e12407765 +Ref: library/audioop audioop byteswap12407952 +Ref: bb312407952 +Ref: library/audioop audioop cross12408182 +Ref: 401f12408182 +Ref: library/audioop audioop findfactor12408315 +Ref: 402012408315 +Ref: library/audioop audioop findfit12408726 +Ref: 402112408726 +Ref: library/audioop audioop findmax12409336 +Ref: 402212409336 +Ref: library/audioop audioop getsample12409693 +Ref: 402312409693 +Ref: library/audioop audioop lin2adpcm12409811 +Ref: 401a12409811 +Ref: library/audioop audioop lin2alaw12410550 +Ref: 402412410550 +Ref: library/audioop audioop lin2lin12410874 +Ref: 402512410874 +Ref: library/audioop audioop lin2ulaw12411502 +Ref: 402612411502 +Ref: library/audioop audioop max12411826 +Ref: 402712411826 +Ref: library/audioop audioop maxpp12411955 +Ref: 402812411955 +Ref: library/audioop audioop minmax12412066 +Ref: 402912412066 +Ref: library/audioop audioop mul12412223 +Ref: 402a12412223 +Ref: library/audioop audioop ratecv12412449 +Ref: 402b12412449 +Ref: library/audioop audioop reverse12413027 +Ref: 402c12413027 +Ref: library/audioop audioop rms12413156 +Ref: 402d12413156 +Ref: library/audioop audioop tomono12413345 +Ref: 402e12413345 +Ref: library/audioop audioop tostereo12413607 +Ref: 402f12413607 +Ref: library/audioop audioop ulaw2lin12413922 +Ref: 403012413922 +Ref: audioop — Manipulate raw audio data-Footnote-112416693 +Node: cgi — Common Gateway Interface support12416743 +Ref: library/cgi doc12416936 +Ref: 403112416936 +Ref: library/cgi cgi-common-gateway-interface-support12416936 +Ref: 403212416936 +Ref: library/cgi module-cgi12416936 +Ref: 1412416936 +Ref: cgi — Common Gateway Interface support-Footnote-112418566 +Ref: cgi — Common Gateway Interface support-Footnote-212418629 +Ref: cgi — Common Gateway Interface support-Footnote-312418675 +Node: Introduction<11>12418719 +Ref: library/cgi introduction12418841 +Ref: 403412418841 +Ref: library/cgi cgi-intro12418886 +Ref: 403512418886 +Node: Using the cgi module12420555 +Ref: library/cgi id112420708 +Ref: 403612420708 +Ref: library/cgi using-the-cgi-module12420708 +Ref: 403712420708 +Node: Higher Level Interface12426615 +Ref: library/cgi higher-level-interface12426765 +Ref: 403912426765 +Ref: library/cgi cgi FieldStorage getfirst12429079 +Ref: 403a12429079 +Ref: library/cgi cgi FieldStorage getlist12429654 +Ref: 403812429654 +Ref: Higher Level Interface-Footnote-112430228 +Node: Functions<13>12430482 +Ref: library/cgi functions12430633 +Ref: 403b12430633 +Ref: library/cgi functions-in-cgi-module12430633 +Ref: 403312430633 +Ref: library/cgi cgi parse12430815 +Ref: 45412430815 +Ref: library/cgi cgi parse_multipart12431570 +Ref: 45512431570 +Ref: library/cgi cgi parse_header12432948 +Ref: 403c12432948 +Ref: library/cgi cgi test12433659 +Ref: 403d12433659 +Ref: library/cgi cgi print_environ12433846 +Ref: 403e12433846 +Ref: library/cgi cgi print_form12433926 +Ref: 403f12433926 +Ref: library/cgi cgi print_directory12433992 +Ref: 404012433992 +Ref: library/cgi cgi print_environ_usage12434074 +Ref: 404112434074 +Ref: Functions<13>-Footnote-112434226 +Node: Caring about security12434270 +Ref: library/cgi caring-about-security12434442 +Ref: 404212434442 +Ref: library/cgi cgi-security12434442 +Ref: 404312434442 +Node: Installing your CGI script on a Unix system12435218 +Ref: library/cgi installing-your-cgi-script-on-a-unix-system12435400 +Ref: 404412435400 +Node: Testing your CGI script12437430 +Ref: library/cgi testing-your-cgi-script12437612 +Ref: 404512437612 +Node: Debugging CGI scripts12438226 +Ref: library/cgi debugging-cgi-scripts12438394 +Ref: 404612438394 +Node: Common problems and solutions12441546 +Ref: library/cgi common-problems-and-solutions12441682 +Ref: 404712441682 +Node: cgitb — Traceback manager for CGI scripts12443024 +Ref: library/cgitb doc12443211 +Ref: 404812443211 +Ref: library/cgitb cgitb-traceback-manager-for-cgi-scripts12443211 +Ref: 404912443211 +Ref: library/cgitb module-cgitb12443211 +Ref: 1512443211 +Ref: library/cgitb cgitb enable12444538 +Ref: 404a12444538 +Ref: library/cgitb cgitb text12445472 +Ref: 404b12445472 +Ref: library/cgitb cgitb html12445900 +Ref: 404c12445900 +Ref: library/cgitb cgitb handler12446328 +Ref: 404d12446328 +Ref: cgitb — Traceback manager for CGI scripts-Footnote-112446961 +Ref: cgitb — Traceback manager for CGI scripts-Footnote-212447026 +Node: chunk — Read IFF chunked data12447074 +Ref: library/chunk doc12447263 +Ref: 404e12447263 +Ref: library/chunk chunk-read-iff-chunked-data12447263 +Ref: 404f12447263 +Ref: library/chunk module-chunk12447263 +Ref: 1612447263 +Ref: library/chunk chunk Chunk12449231 +Ref: 405012449231 +Ref: library/chunk chunk Chunk getname12450363 +Ref: 405112450363 +Ref: library/chunk chunk Chunk getsize12450490 +Ref: 405212450490 +Ref: library/chunk chunk Chunk close12450561 +Ref: 405312450561 +Ref: library/chunk chunk Chunk isatty12450925 +Ref: 405412450925 +Ref: library/chunk chunk Chunk seek12450985 +Ref: 405512450985 +Ref: library/chunk chunk Chunk tell12451427 +Ref: 405612451427 +Ref: library/chunk chunk Chunk read12451508 +Ref: 405712451508 +Ref: library/chunk chunk Chunk skip12451889 +Ref: 405812451889 +Ref: chunk — Read IFF chunked data-Footnote-112452243 +Ref: chunk — Read IFF chunked data-Footnote-212452308 +Ref: chunk — Read IFF chunked data-Footnote-312452356 +Node: crypt — Function to check Unix passwords12452466 +Ref: library/crypt doc12452653 +Ref: 405912452653 +Ref: library/crypt crypt-function-to-check-unix-passwords12452653 +Ref: 405a12452653 +Ref: library/crypt module-crypt12452653 +Ref: 2712452653 +Ref: crypt — Function to check Unix passwords-Footnote-112454117 +Ref: crypt — Function to check Unix passwords-Footnote-212454182 +Node: Hashing Methods12454230 +Ref: library/crypt hashing-methods12454350 +Ref: 405b12454350 +Ref: library/crypt crypt METHOD_SHA51212454537 +Ref: 405c12454537 +Ref: library/crypt crypt METHOD_SHA25612454726 +Ref: 405d12454726 +Ref: library/crypt crypt METHOD_BLOWFISH12454885 +Ref: 405e12454885 +Ref: library/crypt crypt METHOD_MD512455066 +Ref: 405f12455066 +Ref: library/crypt crypt METHOD_CRYPT12455217 +Ref: 9c312455217 +Node: Module Attributes12455361 +Ref: library/crypt module-attributes12455509 +Ref: 406012455509 +Ref: library/crypt crypt methods12455585 +Ref: 406112455585 +Node: Module Functions<2>12455761 +Ref: library/crypt module-functions12455906 +Ref: 406212455906 +Ref: library/crypt crypt crypt12456021 +Ref: 406312456021 +Ref: library/crypt crypt mksalt12457519 +Ref: 78412457519 +Node: Examples<36>12458358 +Ref: library/crypt examples12458477 +Ref: 406412458477 +Node: imghdr — Determine the type of an image12459618 +Ref: library/imghdr doc12459809 +Ref: 406512459809 +Ref: library/imghdr imghdr-determine-the-type-of-an-image12459809 +Ref: 406612459809 +Ref: library/imghdr module-imghdr12459809 +Ref: 9512459809 +Ref: library/imghdr imghdr what12460327 +Ref: a9112460327 +Ref: library/imghdr imghdr tests12462045 +Ref: 406712462045 +Ref: imghdr — Determine the type of an image-Footnote-112462563 +Ref: imghdr — Determine the type of an image-Footnote-212462629 +Node: imp — Access the import internals12462678 +Ref: library/imp doc12462860 +Ref: 406812462860 +Ref: library/imp imp-access-the-import-internals12462860 +Ref: 406912462860 +Ref: library/imp module-imp12462860 +Ref: 9612462860 +Ref: library/imp imp get_magic12463346 +Ref: bf112463346 +Ref: library/imp imp get_suffixes12463637 +Ref: 406a12463637 +Ref: library/imp imp find_module12464375 +Ref: 406e12464375 +Ref: library/imp imp load_module12466888 +Ref: 407212466888 +Ref: library/imp imp new_module12468760 +Ref: 407312468760 +Ref: library/imp imp reload12469009 +Ref: f8112469009 +Ref: library/imp imp cache_from_source12472270 +Ref: 407412472270 +Ref: library/imp imp source_from_cache12473326 +Ref: 407612473326 +Ref: library/imp imp get_tag12474061 +Ref: 407512474061 +Ref: library/imp imp lock_held12474612 +Ref: 407712474612 +Ref: library/imp imp acquire_lock12475546 +Ref: 407812475546 +Ref: library/imp imp release_lock12476247 +Ref: 407912476247 +Ref: library/imp imp PY_SOURCE12476783 +Ref: 406b12476783 +Ref: library/imp imp PY_COMPILED12476889 +Ref: 406c12476889 +Ref: library/imp imp C_EXTENSION12477011 +Ref: 406d12477011 +Ref: library/imp imp PKG_DIRECTORY12477141 +Ref: 407112477141 +Ref: library/imp imp C_BUILTIN12477257 +Ref: 406f12477257 +Ref: library/imp imp PY_FROZEN12477367 +Ref: 407012477367 +Ref: library/imp imp NullImporter12477475 +Ref: d2612477475 +Ref: library/imp imp NullImporter find_module12477869 +Ref: 407a12477869 +Ref: imp — Access the import internals-Footnote-112478359 +Ref: imp — Access the import internals-Footnote-212478422 +Ref: imp — Access the import internals-Footnote-312478464 +Ref: imp — Access the import internals-Footnote-412478506 +Ref: imp — Access the import internals-Footnote-512478548 +Ref: imp — Access the import internals-Footnote-612478590 +Ref: imp — Access the import internals-Footnote-712478632 +Node: Examples<37>12478674 +Ref: library/imp examples12478758 +Ref: 407b12478758 +Ref: library/imp examples-imp12478758 +Ref: 407c12478758 +Node: mailcap — Mailcap file handling12479766 +Ref: library/mailcap doc12479958 +Ref: 407d12479958 +Ref: library/mailcap mailcap-mailcap-file-handling12479958 +Ref: 407e12479958 +Ref: library/mailcap module-mailcap12479958 +Ref: ad12479958 +Ref: library/mailcap mailcap findmatch12481135 +Ref: 407f12481135 +Ref: library/mailcap mailcap getcaps12483878 +Ref: 408012483878 +Ref: mailcap — Mailcap file handling-Footnote-112484718 +Ref: mailcap — Mailcap file handling-Footnote-212484785 +Ref: mailcap — Mailcap file handling-Footnote-312484835 +Ref: mailcap — Mailcap file handling-Footnote-412484894 +Node: msilib — Read and write Microsoft Installer files12484953 +Ref: library/msilib doc12485155 +Ref: 408112485155 +Ref: library/msilib module-msilib12485155 +Ref: b312485155 +Ref: library/msilib msilib-read-and-write-microsoft-installer-files12485155 +Ref: 408212485155 +Ref: library/msilib msilib FCICreate12486313 +Ref: 408312486313 +Ref: library/msilib msilib UuidCreate12486814 +Ref: 408412486814 +Ref: library/msilib msilib OpenDatabase12487010 +Ref: 136012487010 +Ref: library/msilib msilib CreateRecord12487562 +Ref: 408512487562 +Ref: library/msilib msilib init_database12487727 +Ref: 136112487727 +Ref: library/msilib msilib add_data12488298 +Ref: 408712488298 +Ref: library/msilib msilib Binary12488872 +Ref: 408812488872 +Ref: library/msilib msilib add_tables12489068 +Ref: 408912489068 +Ref: library/msilib msilib add_stream12489409 +Ref: 408a12489409 +Ref: library/msilib msilib gen_uuid12489569 +Ref: 408b12489569 +Ref: msilib — Read and write Microsoft Installer files-Footnote-112490047 +Ref: msilib — Read and write Microsoft Installer files-Footnote-212490123 +Ref: msilib — Read and write Microsoft Installer files-Footnote-312490172 +Ref: msilib — Read and write Microsoft Installer files-Footnote-412490235 +Ref: msilib — Read and write Microsoft Installer files-Footnote-512490315 +Node: Database Objects12490395 +Ref: library/msilib database-objects12490520 +Ref: 408c12490520 +Ref: library/msilib id112490520 +Ref: 408d12490520 +Ref: library/msilib msilib Database OpenView12490575 +Ref: 136212490575 +Ref: library/msilib msilib Database Commit12490725 +Ref: 408e12490725 +Ref: library/msilib msilib Database GetSummaryInformation12490861 +Ref: 408f12490861 +Ref: library/msilib msilib Database Close12491065 +Ref: 7b012491065 +Ref: Database Objects-Footnote-112491333 +Ref: Database Objects-Footnote-212491413 +Ref: Database Objects-Footnote-312491493 +Ref: Database Objects-Footnote-412491573 +Node: View Objects12491653 +Ref: library/msilib id212491814 +Ref: 409012491814 +Ref: library/msilib view-objects12491814 +Ref: 409112491814 +Ref: library/msilib msilib View Execute12491861 +Ref: 409212491861 +Ref: library/msilib msilib View GetColumnInfo12492089 +Ref: 409312492089 +Ref: library/msilib msilib View Fetch12492314 +Ref: 409412492314 +Ref: library/msilib msilib View Modify12492427 +Ref: 409512492427 +Ref: library/msilib msilib View Close12492978 +Ref: 409612492978 +Ref: View Objects-Footnote-112493204 +Ref: View Objects-Footnote-212493284 +Ref: View Objects-Footnote-312493364 +Ref: View Objects-Footnote-412493444 +Ref: View Objects-Footnote-512493524 +Node: Summary Information Objects12493604 +Ref: library/msilib summary-information-objects12493763 +Ref: 409712493763 +Ref: library/msilib summary-objects12493763 +Ref: 409812493763 +Ref: library/msilib msilib SummaryInformation GetProperty12493840 +Ref: 141812493840 +Ref: library/msilib msilib SummaryInformation GetPropertyCount12494431 +Ref: 409912494431 +Ref: library/msilib msilib SummaryInformation SetProperty12494583 +Ref: 409a12494583 +Ref: library/msilib msilib SummaryInformation Persist12494876 +Ref: 409b12494876 +Ref: Summary Information Objects-Footnote-112495205 +Ref: Summary Information Objects-Footnote-212495285 +Ref: Summary Information Objects-Footnote-312495365 +Ref: Summary Information Objects-Footnote-412495445 +Node: Record Objects12495525 +Ref: library/msilib id312495678 +Ref: 409c12495678 +Ref: library/msilib record-objects12495678 +Ref: 409d12495678 +Ref: library/msilib msilib Record GetFieldCount12495729 +Ref: 409e12495729 +Ref: library/msilib msilib Record GetInteger12495860 +Ref: 409f12495860 +Ref: library/msilib msilib Record GetString12495997 +Ref: 40a012495997 +Ref: library/msilib msilib Record SetString12496131 +Ref: 40a112496131 +Ref: library/msilib msilib Record SetStream12496293 +Ref: 40a212496293 +Ref: library/msilib msilib Record SetInteger12496492 +Ref: 40a312496492 +Ref: library/msilib msilib Record ClearData12496655 +Ref: 40a412496655 +Ref: Record Objects-Footnote-112496936 +Ref: Record Objects-Footnote-212497016 +Ref: Record Objects-Footnote-312497096 +Ref: Record Objects-Footnote-412497176 +Ref: Record Objects-Footnote-512497256 +Node: Errors12497336 +Ref: library/msilib errors12497473 +Ref: 40a512497473 +Ref: library/msilib msi-errors12497473 +Ref: 40a612497473 +Node: CAB Objects12497623 +Ref: library/msilib cab12497763 +Ref: 40a712497763 +Ref: library/msilib cab-objects12497763 +Ref: 40a812497763 +Ref: library/msilib msilib CAB12497808 +Ref: 40a912497808 +Ref: library/msilib msilib CAB append12498169 +Ref: 40aa12498169 +Ref: library/msilib msilib CAB commit12498518 +Ref: 40ab12498518 +Node: Directory Objects12498722 +Ref: library/msilib directory-objects12498867 +Ref: 40ac12498867 +Ref: library/msilib msi-directory12498867 +Ref: 40ad12498867 +Ref: library/msilib msilib Directory12498924 +Ref: 40ae12498924 +Ref: library/msilib msilib Directory start_component12499693 +Ref: 141912499693 +Ref: library/msilib msilib Directory add_file12500234 +Ref: 40af12500234 +Ref: library/msilib msilib Directory glob12500731 +Ref: 40b012500731 +Ref: library/msilib msilib Directory remove_pyc12500945 +Ref: 40b112500945 +Ref: Directory Objects-Footnote-112501161 +Ref: Directory Objects-Footnote-212501241 +Ref: Directory Objects-Footnote-312501321 +Ref: Directory Objects-Footnote-412501401 +Node: Features<3>12501481 +Ref: library/msilib features12501626 +Ref: 40b212501626 +Ref: library/msilib id412501626 +Ref: 40b312501626 +Ref: library/msilib msilib Feature12501665 +Ref: 40b412501665 +Ref: library/msilib msilib Feature set_current12502063 +Ref: 40b512502063 +Ref: Features<3>-Footnote-112502364 +Node: GUI classes12502444 +Ref: library/msilib gui-classes12502590 +Ref: 40b612502590 +Ref: library/msilib msi-gui12502590 +Ref: 40b712502590 +Ref: library/msilib msilib Control12502774 +Ref: 40b812502774 +Ref: library/msilib msilib Control event12502947 +Ref: 40b912502947 +Ref: library/msilib msilib Control mapping12503094 +Ref: 40ba12503094 +Ref: library/msilib msilib Control condition12503216 +Ref: 40bb12503216 +Ref: library/msilib msilib RadioButtonGroup12503355 +Ref: 40bc12503355 +Ref: library/msilib msilib RadioButtonGroup add12503553 +Ref: 40bd12503553 +Ref: library/msilib msilib Dialog12503823 +Ref: 40be12503823 +Ref: library/msilib msilib Dialog control12504128 +Ref: 40bf12504128 +Ref: library/msilib msilib Dialog text12504491 +Ref: 40c012504491 +Ref: library/msilib msilib Dialog bitmap12504608 +Ref: 40c112504608 +Ref: library/msilib msilib Dialog line12504717 +Ref: 40c212504717 +Ref: library/msilib msilib Dialog pushbutton12504816 +Ref: 40c312504816 +Ref: library/msilib msilib Dialog radiogroup12504974 +Ref: 40c412504974 +Ref: library/msilib msilib Dialog checkbox12505148 +Ref: 40c512505148 +Ref: GUI classes-Footnote-112505509 +Ref: GUI classes-Footnote-212505589 +Ref: GUI classes-Footnote-312505669 +Ref: GUI classes-Footnote-412505749 +Ref: GUI classes-Footnote-512505829 +Ref: GUI classes-Footnote-612505909 +Ref: GUI classes-Footnote-712505989 +Node: Precomputed tables12506069 +Ref: library/msilib msi-tables12506195 +Ref: 40c612506195 +Ref: library/msilib precomputed-tables12506195 +Ref: 40c712506195 +Ref: library/msilib msilib schema12506410 +Ref: 408612506410 +Ref: library/msilib msilib sequence12506627 +Ref: 40c812506627 +Ref: library/msilib msilib text12506862 +Ref: 40c912506862 +Node: nis — Interface to Sun’s NIS Yellow Pages12507003 +Ref: library/nis doc12507204 +Ref: 40ca12507204 +Ref: library/nis module-nis12507204 +Ref: bd12507204 +Ref: library/nis nis-interface-to-sun-s-nis-yellow-pages12507204 +Ref: 40cb12507204 +Ref: library/nis nis match12508024 +Ref: 109112508024 +Ref: library/nis nis cat12508571 +Ref: 40cd12508571 +Ref: library/nis nis maps12509037 +Ref: 109212509037 +Ref: library/nis nis get_default_domain12509265 +Ref: 40ce12509265 +Ref: library/nis nis error12509410 +Ref: 40cc12509410 +Ref: nis — Interface to Sun’s NIS Yellow Pages-Footnote-112509537 +Node: nntplib — NNTP protocol client12509583 +Ref: library/nntplib doc12509777 +Ref: 40cf12509777 +Ref: library/nntplib module-nntplib12509777 +Ref: be12509777 +Ref: library/nntplib nntplib-nntp-protocol-client12509777 +Ref: 40d012509777 +Ref: library/nntplib nntplib NNTP12511969 +Ref: 55d12511969 +Ref: library/nntplib nntplib NNTP_SSL12514132 +Ref: 55e12514132 +Ref: library/nntplib nntplib NNTPError12515670 +Ref: 40d212515670 +Ref: library/nntplib nntplib NNTPError response12515916 +Ref: 40d312515916 +Ref: library/nntplib nntplib NNTPReplyError12516037 +Ref: 40d412516037 +Ref: library/nntplib nntplib NNTPTemporaryError12516158 +Ref: 40d512516158 +Ref: library/nntplib nntplib NNTPPermanentError12516286 +Ref: 40d112516286 +Ref: library/nntplib nntplib NNTPProtocolError12516414 +Ref: 40d612516414 +Ref: library/nntplib nntplib NNTPDataError12516578 +Ref: 40d712516578 +Ref: nntplib — NNTP protocol client-Footnote-112516792 +Ref: nntplib — NNTP protocol client-Footnote-212516859 +Ref: nntplib — NNTP protocol client-Footnote-312516901 +Ref: nntplib — NNTP protocol client-Footnote-412516960 +Ref: nntplib — NNTP protocol client-Footnote-512517018 +Ref: nntplib — NNTP protocol client-Footnote-612517077 +Node: NNTP Objects12517136 +Ref: library/nntplib id112517246 +Ref: 40d812517246 +Ref: library/nntplib nntp-objects12517246 +Ref: 40d912517246 +Node: Attributes12517454 +Ref: library/nntplib attributes12517532 +Ref: 40da12517532 +Ref: library/nntplib nntplib NNTP nntp_version12517575 +Ref: 40db12517575 +Ref: library/nntplib nntplib NNTP nntp_implementation12517841 +Ref: 40dc12517841 +Ref: Attributes-Footnote-112518078 +Node: Methods<3>12518137 +Ref: library/nntplib methods12518215 +Ref: 40dd12518215 +Ref: library/nntplib nntplib NNTP quit12519106 +Ref: 40de12519106 +Ref: library/nntplib nntplib NNTP getwelcome12519289 +Ref: 40df12519289 +Ref: library/nntplib nntplib NNTP getcapabilities12519520 +Ref: 40e012519520 +Ref: library/nntplib nntplib NNTP login12519981 +Ref: 40e112519981 +Ref: library/nntplib nntplib NNTP starttls12520599 +Ref: ed312520599 +Ref: library/nntplib nntplib NNTP newgroups12521399 +Ref: 40e212521399 +Ref: library/nntplib nntplib NNTP newnews12522066 +Ref: 40e312522066 +Ref: library/nntplib nntplib NNTP list12522437 +Ref: 40e412522437 +Ref: library/nntplib nntplib NNTP descriptions12523773 +Ref: 59612523773 +Ref: library/nntplib nntplib NNTP description12524371 +Ref: 59712524371 +Ref: library/nntplib nntplib NNTP group12524738 +Ref: 40e512524738 +Ref: library/nntplib nntplib NNTP over12525172 +Ref: 40e612525172 +Ref: library/nntplib nntplib NNTP help12527334 +Ref: 40e812527334 +Ref: library/nntplib nntplib NNTP stat12527488 +Ref: 40e912527488 +Ref: library/nntplib nntplib NNTP next12528157 +Ref: 40ea12528157 +Ref: library/nntplib nntplib NNTP last12528251 +Ref: 40eb12528251 +Ref: library/nntplib nntplib NNTP article12528345 +Ref: 40ec12528345 +Ref: library/nntplib nntplib NNTP head12529453 +Ref: 40ed12529453 +Ref: library/nntplib nntplib NNTP body12529687 +Ref: 40ee12529687 +Ref: library/nntplib nntplib NNTP post12529921 +Ref: 40ef12529921 +Ref: library/nntplib nntplib NNTP ihave12530547 +Ref: 40f012530547 +Ref: library/nntplib nntplib NNTP date12530823 +Ref: 40f112530823 +Ref: library/nntplib nntplib NNTP slave12530991 +Ref: 40f212530991 +Ref: library/nntplib nntplib NNTP set_debuglevel12531087 +Ref: 40f312531087 +Ref: library/nntplib nntplib NNTP xhdr12531723 +Ref: 40f412531723 +Ref: library/nntplib nntplib NNTP xover12532661 +Ref: 40f512532661 +Ref: Methods<3>-Footnote-112533073 +Ref: Methods<3>-Footnote-212533132 +Ref: Methods<3>-Footnote-312533191 +Ref: Methods<3>-Footnote-412533250 +Node: Utility functions<2>12533309 +Ref: library/nntplib utility-functions12533419 +Ref: 40f612533419 +Ref: library/nntplib nntplib decode_header12533533 +Ref: 40e712533533 +Node: optparse — Parser for command line options12534124 +Ref: library/optparse doc12534327 +Ref: 40f712534327 +Ref: library/optparse module-optparse12534327 +Ref: c112534327 +Ref: library/optparse optparse-parser-for-command-line-options12534327 +Ref: 40f812534327 +Ref: optparse — Parser for command line options-Footnote-112537230 +Node: Background12537298 +Ref: library/optparse background12537409 +Ref: 40fa12537409 +Ref: library/optparse optparse-background12537409 +Ref: 40fb12537409 +Node: Terminology12537896 +Ref: library/optparse optparse-terminology12537984 +Ref: 40fc12537984 +Ref: library/optparse terminology12537984 +Ref: 40fd12537984 +Node: What are options for?12541847 +Ref: library/optparse optparse-what-options-for12541978 +Ref: 40fe12541978 +Ref: library/optparse what-are-options-for12541978 +Ref: 40ff12541978 +Node: What are positional arguments for?12543665 +Ref: library/optparse optparse-what-positional-arguments-for12543776 +Ref: 410012543776 +Ref: library/optparse what-are-positional-arguments-for12543776 +Ref: 410112543776 +Node: Tutorial<3>12545113 +Ref: library/optparse optparse-tutorial12545248 +Ref: 410212545248 +Ref: library/optparse tutorial12545248 +Ref: 410312545248 +Node: Understanding option actions12547856 +Ref: library/optparse optparse-understanding-option-actions12547957 +Ref: 410812547957 +Ref: library/optparse understanding-option-actions12547957 +Ref: 410912547957 +Node: The store action12548550 +Ref: library/optparse optparse-store-action12548689 +Ref: 410b12548689 +Ref: library/optparse the-store-action12548689 +Ref: 410c12548689 +Node: Handling boolean flag options12550881 +Ref: library/optparse handling-boolean-flag-options12551005 +Ref: 410d12551005 +Ref: library/optparse optparse-handling-boolean-options12551005 +Ref: 410e12551005 +Node: Other actions12551890 +Ref: library/optparse optparse-other-actions12552012 +Ref: 410f12552012 +Ref: library/optparse other-actions12552012 +Ref: 411012552012 +Node: Default values12552432 +Ref: library/optparse default-values12552540 +Ref: 411312552540 +Ref: library/optparse optparse-default-values12552540 +Ref: 411412552540 +Node: Generating help12554430 +Ref: library/optparse generating-help12554550 +Ref: 411512554550 +Ref: library/optparse optparse-generating-help12554550 +Ref: 411612554550 +Node: Grouping Options12558726 +Ref: library/optparse grouping-options12558794 +Ref: 411712558794 +Ref: library/optparse optparse OptionGroup12559127 +Ref: 411812559127 +Ref: library/optparse optparse OptionParser get_option_group12562625 +Ref: 411912562625 +Node: Printing a version string12562895 +Ref: library/optparse optparse-printing-version-string12563028 +Ref: 411a12563028 +Ref: library/optparse printing-a-version-string12563028 +Ref: 411b12563028 +Ref: library/optparse optparse OptionParser print_version12563914 +Ref: 411c12563914 +Ref: library/optparse optparse OptionParser get_version12564288 +Ref: 411e12564288 +Node: How optparse handles errors12564432 +Ref: library/optparse how-optparse-handles-errors12564573 +Ref: 411f12564573 +Ref: library/optparse optparse-how-optparse-handles-errors12564573 +Ref: 412012564573 +Node: Putting it all together12566658 +Ref: library/optparse optparse-putting-it-all-together12566765 +Ref: 412112566765 +Ref: library/optparse putting-it-all-together12566765 +Ref: 412212566765 +Node: Reference Guide12567685 +Ref: library/optparse optparse-reference-guide12567826 +Ref: 411112567826 +Ref: library/optparse reference-guide12567826 +Ref: 412312567826 +Node: Creating the parser12568201 +Ref: library/optparse creating-the-parser12568302 +Ref: 412412568302 +Ref: library/optparse optparse-creating-parser12568302 +Ref: 412512568302 +Ref: library/optparse optparse OptionParser12568449 +Ref: 40f912568449 +Node: Populating the parser12571455 +Ref: library/optparse optparse-populating-parser12571581 +Ref: 412712571581 +Ref: library/optparse populating-the-parser12571581 +Ref: 412812571581 +Node: Defining options12572869 +Ref: library/optparse defining-options12572993 +Ref: 412912572993 +Ref: library/optparse optparse-defining-options12572993 +Ref: 412a12572993 +Ref: library/optparse optparse OptionParser add_option12573404 +Ref: 267b12573404 +Node: Option attributes12576277 +Ref: library/optparse option-attributes12576403 +Ref: 412c12576403 +Ref: library/optparse optparse-option-attributes12576403 +Ref: 412d12576403 +Ref: library/optparse optparse Option action12576741 +Ref: 410412576741 +Ref: library/optparse optparse Option type12576964 +Ref: 410512576964 +Ref: library/optparse optparse Option dest12577181 +Ref: 410612577181 +Ref: library/optparse optparse Option default12577526 +Ref: 412f12577526 +Ref: library/optparse optparse Option nargs12577720 +Ref: 413112577720 +Ref: library/optparse optparse Option const12577953 +Ref: 413212577953 +Ref: library/optparse optparse Option choices12578063 +Ref: 413312578063 +Ref: library/optparse optparse Option callback12578187 +Ref: 413412578187 +Ref: library/optparse optparse Option callback_args12578419 +Ref: 413512578419 +Ref: library/optparse optparse Option callback_kwargs12578455 +Ref: 413612578455 +Ref: library/optparse optparse Option help12578619 +Ref: 410712578619 +Ref: library/optparse optparse Option metavar12578967 +Ref: 413712578967 +Node: Standard option actions12579172 +Ref: library/optparse optparse-standard-option-actions12579303 +Ref: 412b12579303 +Ref: library/optparse standard-option-actions12579303 +Ref: 413812579303 +Node: Standard option types12587392 +Ref: library/optparse optparse-standard-option-types12587526 +Ref: 412e12587526 +Ref: library/optparse standard-option-types12587526 +Ref: 413912587526 +Node: Parsing arguments<2>12588999 +Ref: library/optparse optparse-parsing-arguments12589154 +Ref: 413a12589154 +Ref: library/optparse parsing-arguments12589154 +Ref: 413b12589154 +Node: Querying and manipulating your option parser12590526 +Ref: library/optparse optparse-querying-manipulating-option-parser12590685 +Ref: 413c12590685 +Ref: library/optparse querying-and-manipulating-your-option-parser12590685 +Ref: 413d12590685 +Ref: library/optparse optparse OptionParser disable_interspersed_args12590996 +Ref: 267c12590996 +Ref: library/optparse optparse OptionParser enable_interspersed_args12591786 +Ref: 413e12591786 +Ref: library/optparse optparse OptionParser get_option12591992 +Ref: 413f12591992 +Ref: library/optparse optparse OptionParser has_option12592165 +Ref: 414012592165 +Ref: library/optparse optparse OptionParser remove_option12592341 +Ref: 414112592341 +Node: Conflicts between options12592727 +Ref: library/optparse conflicts-between-options12592876 +Ref: 414212592876 +Ref: library/optparse optparse-conflicts-between-options12592876 +Ref: 412612592876 +Node: Cleanup<2>12595342 +Ref: library/optparse cleanup12595460 +Ref: 414312595460 +Ref: library/optparse optparse-cleanup12595460 +Ref: 414412595460 +Node: Other methods12595875 +Ref: library/optparse optparse-other-methods12595959 +Ref: 414512595959 +Ref: library/optparse other-methods12595959 +Ref: 414612595959 +Ref: library/optparse optparse OptionParser set_usage12596063 +Ref: 414712596063 +Ref: library/optparse optparse OptionParser print_usage12596352 +Ref: 411d12596352 +Ref: library/optparse optparse OptionParser get_usage12596688 +Ref: 414812596688 +Ref: library/optparse optparse OptionParser set_defaults12596826 +Ref: 413012596826 +Node: Option Callbacks12597994 +Ref: library/optparse option-callbacks12598142 +Ref: 414912598142 +Ref: library/optparse optparse-option-callbacks12598142 +Ref: 411212598142 +Node: Defining a callback option12599361 +Ref: library/optparse defining-a-callback-option12599473 +Ref: 414a12599473 +Ref: library/optparse optparse-defining-callback-option12599473 +Ref: 414b12599473 +Node: How callbacks are called12601700 +Ref: library/optparse how-callbacks-are-called12601849 +Ref: 414c12601849 +Ref: library/optparse optparse-how-callbacks-called12601849 +Ref: 414d12601849 +Node: Raising errors in a callback12604461 +Ref: library/optparse optparse-raising-errors-in-callback12604619 +Ref: 414e12604619 +Ref: library/optparse raising-errors-in-a-callback12604619 +Ref: 414f12604619 +Node: Callback example 1 trivial callback12605092 +Ref: library/optparse callback-example-1-trivial-callback12605263 +Ref: 415012605263 +Ref: library/optparse optparse-callback-example-112605263 +Ref: 415112605263 +Node: Callback example 2 check option order12605713 +Ref: library/optparse callback-example-2-check-option-order12605905 +Ref: 415212605905 +Ref: library/optparse optparse-callback-example-212605905 +Ref: 415312605905 +Node: Callback example 3 check option order generalized12606465 +Ref: library/optparse callback-example-3-check-option-order-generalized12606666 +Ref: 415412606666 +Ref: library/optparse optparse-callback-example-312606666 +Ref: 415512606666 +Node: Callback example 4 check arbitrary condition12607442 +Ref: library/optparse callback-example-4-check-arbitrary-condition12607640 +Ref: 415612607640 +Ref: library/optparse optparse-callback-example-412607640 +Ref: 415712607640 +Node: Callback example 5 fixed arguments12608437 +Ref: library/optparse callback-example-5-fixed-arguments12608623 +Ref: 415812608623 +Ref: library/optparse optparse-callback-example-512608623 +Ref: 415912608623 +Node: Callback example 6 variable arguments12609699 +Ref: library/optparse callback-example-6-variable-arguments12609832 +Ref: 415a12609832 +Ref: library/optparse optparse-callback-example-612609832 +Ref: 415b12609832 +Node: Extending optparse12611939 +Ref: library/optparse extending-optparse12612063 +Ref: 415c12612063 +Ref: library/optparse optparse-extending-optparse12612063 +Ref: 410a12612063 +Node: Adding new types12612402 +Ref: library/optparse adding-new-types12612500 +Ref: 415d12612500 +Ref: library/optparse optparse-adding-new-types12612500 +Ref: 415e12612500 +Ref: library/optparse optparse Option TYPES12612791 +Ref: 415f12612791 +Ref: library/optparse optparse Option TYPE_CHECKER12612950 +Ref: 416012612950 +Node: Adding new actions12615961 +Ref: library/optparse adding-new-actions12616059 +Ref: 416112616059 +Ref: library/optparse optparse-adding-new-actions12616059 +Ref: 416212616059 +Ref: library/optparse optparse Option ACTIONS12617164 +Ref: 416312617164 +Ref: library/optparse optparse Option STORE_ACTIONS12617240 +Ref: 416412617240 +Ref: library/optparse optparse Option TYPED_ACTIONS12617333 +Ref: 416512617333 +Ref: library/optparse optparse Option ALWAYS_TYPED_ACTIONS12617426 +Ref: 416612617426 +Node: ossaudiodev — Access to OSS-compatible audio devices12620728 +Ref: library/ossaudiodev doc12620937 +Ref: 416712620937 +Ref: library/ossaudiodev module-ossaudiodev12620937 +Ref: c412620937 +Ref: library/ossaudiodev ossaudiodev-access-to-oss-compatible-audio-devices12620937 +Ref: 416812620937 +Ref: library/ossaudiodev ossaudiodev OSSAudioError12621967 +Ref: 416912621967 +Ref: library/ossaudiodev ossaudiodev open12622486 +Ref: 416a12622486 +Ref: library/ossaudiodev ossaudiodev openmixer12623885 +Ref: 416b12623885 +Ref: ossaudiodev — Access to OSS-compatible audio devices-Footnote-112624323 +Ref: ossaudiodev — Access to OSS-compatible audio devices-Footnote-212624377 +Node: Audio Device Objects12624425 +Ref: library/ossaudiodev audio-device-objects12624565 +Ref: 416c12624565 +Ref: library/ossaudiodev ossaudio-device-objects12624565 +Ref: 416d12624565 +Ref: library/ossaudiodev ossaudiodev oss_audio_device close12625159 +Ref: 416e12625159 +Ref: library/ossaudiodev ossaudiodev oss_audio_device fileno12625383 +Ref: 416f12625383 +Ref: library/ossaudiodev ossaudiodev oss_audio_device read12625484 +Ref: 417012625484 +Ref: library/ossaudiodev ossaudiodev oss_audio_device write12625792 +Ref: 417112625792 +Ref: library/ossaudiodev ossaudiodev oss_audio_device writeall12626312 +Ref: 417212626312 +Ref: library/ossaudiodev ossaudiodev oss_audio_device nonblock12627474 +Ref: 417312627474 +Ref: library/ossaudiodev ossaudiodev oss_audio_device getfmts12627641 +Ref: 417412627641 +Ref: library/ossaudiodev ossaudiodev oss_audio_device setfmt12629811 +Ref: 417512629811 +Ref: library/ossaudiodev ossaudiodev oss_audio_device channels12630182 +Ref: 417612630182 +Ref: library/ossaudiodev ossaudiodev oss_audio_device speed12630510 +Ref: 417712630510 +Ref: library/ossaudiodev ossaudiodev oss_audio_device sync12631255 +Ref: 417812631255 +Ref: library/ossaudiodev ossaudiodev oss_audio_device reset12631538 +Ref: 417912631538 +Ref: library/ossaudiodev ossaudiodev oss_audio_device post12631802 +Ref: 417a12631802 +Ref: library/ossaudiodev ossaudiodev oss_audio_device setparameters12632215 +Ref: 417b12632215 +Ref: library/ossaudiodev ossaudiodev oss_audio_device bufsize12633278 +Ref: 417c12633278 +Ref: library/ossaudiodev ossaudiodev oss_audio_device obufcount12633378 +Ref: 417d12633378 +Ref: library/ossaudiodev ossaudiodev oss_audio_device obuffree12633512 +Ref: 417e12633512 +Ref: library/ossaudiodev ossaudiodev oss_audio_device closed12633737 +Ref: 417f12633737 +Ref: library/ossaudiodev ossaudiodev oss_audio_device name12633838 +Ref: 418012633838 +Ref: library/ossaudiodev ossaudiodev oss_audio_device mode12633929 +Ref: 418112633929 +Node: Mixer Device Objects12634044 +Ref: library/ossaudiodev id112634184 +Ref: 418212634184 +Ref: library/ossaudiodev mixer-device-objects12634184 +Ref: 418312634184 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device close12634297 +Ref: 418412634297 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device fileno12634498 +Ref: 418512634498 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device controls12634744 +Ref: 418612634744 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device stereocontrols12635722 +Ref: 418712635722 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device reccontrols12636167 +Ref: 418812636167 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device get12636396 +Ref: 418912636396 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device set12636891 +Ref: 418a12636891 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device get_recsrc12637454 +Ref: 418b12637454 +Ref: library/ossaudiodev ossaudiodev oss_mixer_device set_recsrc12637615 +Ref: 418c12637615 +Node: pipes — Interface to shell pipelines12638012 +Ref: library/pipes doc12638198 +Ref: 418d12638198 +Ref: library/pipes module-pipes12638198 +Ref: c912638198 +Ref: library/pipes pipes-interface-to-shell-pipelines12638198 +Ref: 418e12638198 +Ref: library/pipes pipes Template12638985 +Ref: 418f12638985 +Ref: pipes — Interface to shell pipelines-Footnote-112639356 +Ref: pipes — Interface to shell pipelines-Footnote-212639421 +Node: Template Objects12639469 +Ref: library/pipes id112639560 +Ref: 419012639560 +Ref: library/pipes template-objects12639560 +Ref: 419112639560 +Ref: library/pipes pipes Template reset12639652 +Ref: 419212639652 +Ref: library/pipes pipes Template clone12639739 +Ref: 419312639739 +Ref: library/pipes pipes Template debug12639821 +Ref: 419412639821 +Ref: library/pipes pipes Template append12640066 +Ref: 419512640066 +Ref: library/pipes pipes Template prepend12640816 +Ref: 419612640816 +Ref: library/pipes pipes Template open12640966 +Ref: 419712640966 +Ref: library/pipes pipes Template copy12641168 +Ref: 419812641168 +Node: smtpd — SMTP Server12641264 +Ref: library/smtpd doc12641435 +Ref: 419912641435 +Ref: library/smtpd module-smtpd12641435 +Ref: e912641435 +Ref: library/smtpd smtpd-smtp-server12641435 +Ref: 419a12641435 +Ref: smtpd — SMTP Server-Footnote-112642715 +Ref: smtpd — SMTP Server-Footnote-212642780 +Ref: smtpd — SMTP Server-Footnote-312642828 +Ref: smtpd — SMTP Server-Footnote-412642869 +Ref: smtpd — SMTP Server-Footnote-512642928 +Ref: smtpd — SMTP Server-Footnote-612642987 +Node: SMTPServer Objects12643046 +Ref: library/smtpd smtpserver-objects12643154 +Ref: 419b12643154 +Ref: library/smtpd smtpd SMTPServer12643213 +Ref: 9bc12643213 +Ref: library/smtpd smtpd SMTPServer process_message12645070 +Ref: 9bd12645070 +Ref: library/smtpd smtpd SMTPServer channel_class12646946 +Ref: 419c12646946 +Ref: SMTPServer Objects-Footnote-112647557 +Ref: SMTPServer Objects-Footnote-212647616 +Ref: SMTPServer Objects-Footnote-312647675 +Ref: SMTPServer Objects-Footnote-412647734 +Node: DebuggingServer Objects12647793 +Ref: library/smtpd debuggingserver-objects12647927 +Ref: 419d12647927 +Ref: library/smtpd smtpd DebuggingServer12647996 +Ref: 419e12647996 +Node: PureProxy Objects12648198 +Ref: library/smtpd pureproxy-objects12648333 +Ref: 419f12648333 +Ref: library/smtpd smtpd PureProxy12648390 +Ref: 41a012648390 +Node: SMTPChannel Objects12648681 +Ref: library/smtpd smtpchannel-objects12648784 +Ref: 41a112648784 +Ref: library/smtpd smtpd SMTPChannel12648845 +Ref: 9bb12648845 +Ref: library/smtpd smtpd SMTPChannel smtp_server12650340 +Ref: 41a212650340 +Ref: library/smtpd smtpd SMTPChannel conn12650444 +Ref: 41a312650444 +Ref: library/smtpd smtpd SMTPChannel addr12650531 +Ref: 41a412650531 +Ref: library/smtpd smtpd SMTPChannel received_lines12650666 +Ref: 41a512650666 +Ref: library/smtpd smtpd SMTPChannel smtp_state12650887 +Ref: 41a612650887 +Ref: library/smtpd smtpd SMTPChannel seen_greeting12651097 +Ref: 41a712651097 +Ref: library/smtpd smtpd SMTPChannel mailfrom12651230 +Ref: 41a812651230 +Ref: library/smtpd smtpd SMTPChannel rcpttos12651376 +Ref: 41a912651376 +Ref: library/smtpd smtpd SMTPChannel received_data12651531 +Ref: 41aa12651531 +Ref: library/smtpd smtpd SMTPChannel fqdn12651740 +Ref: 41ab12651740 +Ref: library/smtpd smtpd SMTPChannel peer12651884 +Ref: 41ac12651884 +Ref: SMTPChannel Objects-Footnote-112654340 +Ref: SMTPChannel Objects-Footnote-212654399 +Node: sndhdr — Determine type of sound file12654458 +Ref: library/sndhdr doc12654628 +Ref: 41ad12654628 +Ref: library/sndhdr module-sndhdr12654628 +Ref: eb12654628 +Ref: library/sndhdr sndhdr-determine-type-of-sound-file12654628 +Ref: 41ae12654628 +Ref: library/sndhdr sndhdr what12656029 +Ref: ae312656029 +Ref: library/sndhdr sndhdr whathdr12656347 +Ref: ae412656347 +Ref: sndhdr — Determine type of sound file-Footnote-112656730 +Ref: sndhdr — Determine type of sound file-Footnote-212656796 +Node: spwd — The shadow password database12656845 +Ref: library/spwd doc12657031 +Ref: 41af12657031 +Ref: library/spwd module-spwd12657031 +Ref: ee12657031 +Ref: library/spwd spwd-the-shadow-password-database12657031 +Ref: 41b012657031 +Ref: library/spwd spwd getspnam12659714 +Ref: 9b812659714 +Ref: library/spwd spwd getspall12659971 +Ref: 41b112659971 +Ref: spwd — The shadow password database-Footnote-112660328 +Node: sunau — Read and write Sun AU files12660375 +Ref: library/sunau doc12660549 +Ref: 41b212660549 +Ref: library/sunau module-sunau12660549 +Ref: f712660549 +Ref: library/sunau sunau-read-and-write-sun-au-files12660549 +Ref: 41b312660549 +Ref: library/sunau sunau open12662234 +Ref: 85612662234 +Ref: library/sunau sunau Error12662751 +Ref: 41b412662751 +Ref: library/sunau sunau AUDIO_FILE_MAGIC12662952 +Ref: 41b512662952 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_MULAW_812663135 +Ref: 41b612663135 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_LINEAR_812663179 +Ref: 41b712663179 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_LINEAR_1612663224 +Ref: 41b812663224 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_LINEAR_2412663270 +Ref: 41b912663270 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_LINEAR_3212663316 +Ref: 41ba12663316 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_ALAW_812663362 +Ref: 41bb12663362 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_FLOAT12663501 +Ref: 41bc12663501 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_DOUBLE12663543 +Ref: 41bd12663543 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_ADPCM_G72112663586 +Ref: 41be12663586 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_ADPCM_G72212663633 +Ref: 41bf12663633 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_ADPCM_G723_312663680 +Ref: 41c012663680 +Ref: library/sunau sunau AUDIO_FILE_ENCODING_ADPCM_G723_512663729 +Ref: 41c112663729 +Ref: sunau — Read and write Sun AU files-Footnote-112663987 +Ref: sunau — Read and write Sun AU files-Footnote-212664052 +Node: AU_read Objects12664100 +Ref: library/sunau au-read-objects12664214 +Ref: 41c212664214 +Ref: library/sunau id112664214 +Ref: 41c312664214 +Ref: library/sunau sunau AU_read close12664354 +Ref: 41c412664354 +Ref: library/sunau sunau AU_read getnchannels12664490 +Ref: 41c512664490 +Ref: library/sunau sunau AU_read getsampwidth12664594 +Ref: 41c612664594 +Ref: library/sunau sunau AU_read getframerate12664668 +Ref: 41c712664668 +Ref: library/sunau sunau AU_read getnframes12664739 +Ref: 41c812664739 +Ref: library/sunau sunau AU_read getcomptype12664812 +Ref: 41c912664812 +Ref: library/sunau sunau AU_read getcompname12664963 +Ref: 41ca12664963 +Ref: library/sunau sunau AU_read getparams12665196 +Ref: 41cb12665196 +Ref: library/sunau sunau AU_read readframes12665401 +Ref: 41cc12665401 +Ref: library/sunau sunau AU_read rewind12665640 +Ref: 41cd12665640 +Ref: library/sunau sunau AU_read setpos12665872 +Ref: 41ce12665872 +Ref: library/sunau sunau AU_read tell12666038 +Ref: 41cf12666038 +Ref: library/sunau sunau AU_read getmarkers12666322 +Ref: 41d012666322 +Ref: library/sunau sunau AU_read getmark12666383 +Ref: 41d112666383 +Node: AU_write Objects12666439 +Ref: library/sunau au-write-objects12666553 +Ref: 41d212666553 +Ref: library/sunau id212666553 +Ref: 41d312666553 +Ref: library/sunau sunau AU_write setnchannels12666696 +Ref: 41d412666696 +Ref: library/sunau sunau AU_write setsampwidth12666769 +Ref: c6312666769 +Ref: library/sunau sunau AU_write setframerate12666911 +Ref: 41d512666911 +Ref: library/sunau sunau AU_write setnframes12666976 +Ref: 41d612666976 +Ref: library/sunau sunau AU_write setcomptype12667115 +Ref: 41d712667115 +Ref: library/sunau sunau AU_write setparams12667276 +Ref: 41d812667276 +Ref: library/sunau sunau AU_write tell12667492 +Ref: 41d912667492 +Ref: library/sunau sunau AU_write writeframesraw12667679 +Ref: c6412667679 +Ref: library/sunau sunau AU_write writeframes12667865 +Ref: c6512667865 +Ref: library/sunau sunau AU_write close12668053 +Ref: 41da12668053 +Node: telnetlib — Telnet client12668293 +Ref: library/telnetlib doc12668469 +Ref: 41db12668469 +Ref: library/telnetlib module-telnetlib12668469 +Ref: fe12668469 +Ref: library/telnetlib telnetlib-telnet-client12668469 +Ref: 41dc12668469 +Ref: library/telnetlib telnetlib Telnet12669862 +Ref: 95712669862 +Ref: telnetlib — Telnet client-Footnote-112671412 +Ref: telnetlib — Telnet client-Footnote-212671481 +Ref: telnetlib — Telnet client-Footnote-312671533 +Ref: telnetlib — Telnet client-Footnote-412671591 +Node: Telnet Objects12671649 +Ref: library/telnetlib id112671750 +Ref: 41de12671750 +Ref: library/telnetlib telnet-objects12671750 +Ref: 41df12671750 +Ref: library/telnetlib telnetlib Telnet read_until12671859 +Ref: 41e012671859 +Ref: library/telnetlib telnetlib Telnet read_all12672214 +Ref: 41e112672214 +Ref: library/telnetlib telnetlib Telnet read_some12672317 +Ref: 41e212672317 +Ref: library/telnetlib telnetlib Telnet read_very_eager12672495 +Ref: 41e312672495 +Ref: library/telnetlib telnetlib Telnet read_eager12672806 +Ref: 41e412672806 +Ref: library/telnetlib telnetlib Telnet read_lazy12673080 +Ref: 41e512673080 +Ref: library/telnetlib telnetlib Telnet read_very_lazy12673371 +Ref: 41e612673371 +Ref: library/telnetlib telnetlib Telnet read_sb_data12673644 +Ref: 41e712673644 +Ref: library/telnetlib telnetlib Telnet open12673877 +Ref: 3a4c12673877 +Ref: library/telnetlib telnetlib Telnet msg12674444 +Ref: 41e812674444 +Ref: library/telnetlib telnetlib Telnet set_debuglevel12674670 +Ref: 41e912674670 +Ref: library/telnetlib telnetlib Telnet close12674842 +Ref: 41dd12674842 +Ref: library/telnetlib telnetlib Telnet get_socket12674899 +Ref: 41ea12674899 +Ref: library/telnetlib telnetlib Telnet fileno12674981 +Ref: 41eb12674981 +Ref: library/telnetlib telnetlib Telnet write12675082 +Ref: 3a4d12675082 +Ref: library/telnetlib telnetlib Telnet interact12675552 +Ref: 41ec12675552 +Ref: library/telnetlib telnetlib Telnet mt_interact12675648 +Ref: 41ed12675648 +Ref: library/telnetlib telnetlib Telnet expect12675738 +Ref: 41ee12675738 +Ref: library/telnetlib telnetlib Telnet set_option_negotiation_callback12676744 +Ref: 41ef12676744 +Node: Telnet Example12677059 +Ref: library/telnetlib id212677160 +Ref: 41f012677160 +Ref: library/telnetlib telnet-example12677160 +Ref: 41f112677160 +Node: uu — Encode and decode uuencode files12677716 +Ref: library/uu doc12677892 +Ref: 41f212677892 +Ref: library/uu module-uu12677892 +Ref: 12d12677892 +Ref: library/uu uu-encode-and-decode-uuencode-files12677892 +Ref: 41f312677892 +Ref: library/uu uu encode12679019 +Ref: 80712679019 +Ref: library/uu uu decode12679547 +Ref: 1e7812679547 +Ref: library/uu uu Error12680235 +Ref: 41f412680235 +Ref: uu — Encode and decode uuencode files-Footnote-112680651 +Ref: uu — Encode and decode uuencode files-Footnote-212680713 +Node: xdrlib — Encode and decode XDR data12680778 +Ref: library/xdrlib doc12680918 +Ref: 41f512680918 +Ref: library/xdrlib module-xdrlib12680918 +Ref: 13d12680918 +Ref: library/xdrlib xdrlib-encode-and-decode-xdr-data12680918 +Ref: 41f612680918 +Ref: library/xdrlib xdrlib Packer12681664 +Ref: 41f712681664 +Ref: library/xdrlib xdrlib Unpacker12681847 +Ref: 41f812681847 +Ref: xdrlib — Encode and decode XDR data-Footnote-112682501 +Ref: xdrlib — Encode and decode XDR data-Footnote-212682567 +Ref: xdrlib — Encode and decode XDR data-Footnote-312682616 +Ref: xdrlib — Encode and decode XDR data-Footnote-412682675 +Ref: xdrlib — Encode and decode XDR data-Footnote-512682734 +Ref: xdrlib — Encode and decode XDR data-Footnote-612682793 +Node: Packer Objects12682852 +Ref: library/xdrlib packer-objects12682965 +Ref: 41f912682965 +Ref: library/xdrlib xdr-packer-objects12682965 +Ref: 41fa12682965 +Ref: library/xdrlib xdrlib Packer get_buffer12683075 +Ref: 41fb12683075 +Ref: library/xdrlib xdrlib Packer reset12683160 +Ref: 41fc12683160 +Ref: library/xdrlib xdrlib Packer pack_float12683596 +Ref: 41fd12683596 +Ref: library/xdrlib xdrlib Packer pack_double12683699 +Ref: 41fe12683699 +Ref: library/xdrlib xdrlib Packer pack_fstring12683875 +Ref: 41ff12683875 +Ref: library/xdrlib xdrlib Packer pack_fopaque12684126 +Ref: 420012684126 +Ref: library/xdrlib xdrlib Packer pack_string12684262 +Ref: 420112684262 +Ref: library/xdrlib xdrlib Packer pack_opaque12684481 +Ref: 420212684481 +Ref: library/xdrlib xdrlib Packer pack_bytes12684615 +Ref: 420312684615 +Ref: library/xdrlib xdrlib Packer pack_list12684799 +Ref: 420412684799 +Ref: library/xdrlib xdrlib Packer pack_farray12685489 +Ref: 420512685489 +Ref: library/xdrlib xdrlib Packer pack_array12685851 +Ref: 420612685851 +Node: Unpacker Objects12686102 +Ref: library/xdrlib unpacker-objects12686238 +Ref: 420712686238 +Ref: library/xdrlib xdr-unpacker-objects12686238 +Ref: 420812686238 +Ref: library/xdrlib xdrlib Unpacker reset12686356 +Ref: 420912686356 +Ref: library/xdrlib xdrlib Unpacker get_position12686445 +Ref: 420a12686445 +Ref: library/xdrlib xdrlib Unpacker set_position12686545 +Ref: 420b12686545 +Ref: library/xdrlib xdrlib Unpacker get_buffer12686754 +Ref: 420c12686754 +Ref: library/xdrlib xdrlib Unpacker done12686848 +Ref: 420d12686848 +Ref: library/xdrlib xdrlib Unpacker unpack_float12687235 +Ref: 420f12687235 +Ref: library/xdrlib xdrlib Unpacker unpack_double12687329 +Ref: 421012687329 +Ref: library/xdrlib xdrlib Unpacker unpack_fstring12687546 +Ref: 421112687546 +Ref: library/xdrlib xdrlib Unpacker unpack_fopaque12687757 +Ref: 421212687757 +Ref: library/xdrlib xdrlib Unpacker unpack_string12687907 +Ref: 421312687907 +Ref: library/xdrlib xdrlib Unpacker unpack_opaque12688144 +Ref: 421412688144 +Ref: library/xdrlib xdrlib Unpacker unpack_bytes12688294 +Ref: 421512688294 +Ref: library/xdrlib xdrlib Unpacker unpack_list12688495 +Ref: 421612688495 +Ref: library/xdrlib xdrlib Unpacker unpack_farray12688900 +Ref: 421712688900 +Ref: library/xdrlib xdrlib Unpacker unpack_array12689171 +Ref: 421812689171 +Node: Exceptions<18>12689446 +Ref: library/xdrlib exceptions12689559 +Ref: 421912689559 +Ref: library/xdrlib xdr-exceptions12689559 +Ref: 421a12689559 +Ref: library/xdrlib xdrlib Error12689659 +Ref: 420e12689659 +Ref: library/xdrlib xdrlib ConversionError12689826 +Ref: 421b12689826 +Ref: library/security_warnings security-warnings12690216 +Ref: 421c12690216 +Node: Security Considerations<4>12690217 +Ref: library/security_warnings doc12690334 +Ref: 421d12690334 +Ref: library/security_warnings security-considerations12690334 +Ref: 421e12690334 +Ref: Security Considerations<4>-Footnote-112692183 +Node: Extending and Embedding the Python Interpreter12692242 +Ref: extending/index doc12692402 +Ref: 421f12692402 +Ref: extending/index extending-and-embedding-the-python-interpreter12692402 +Ref: 422012692402 +Ref: extending/index extending-index12692402 +Ref: 162512692402 +Node: Recommended third party tools12693706 +Ref: extending/index recommended-third-party-tools12693872 +Ref: 422112693872 +Ref: Recommended third party tools-Footnote-112694570 +Ref: Recommended third party tools-Footnote-212694598 +Ref: Recommended third party tools-Footnote-312694634 +Ref: Recommended third party tools-Footnote-412694663 +Ref: Recommended third party tools-Footnote-512694697 +Node: Creating extensions without third party tools12694770 +Ref: extending/index creating-extensions-without-third-party-tools12694998 +Ref: 422212694998 +Node: Extending Python with C or C++12695614 +Ref: extending/extending doc12695768 +Ref: 422312695768 +Ref: extending/extending extending-intro12695768 +Ref: 422412695768 +Ref: extending/extending extending-python-with-c-or-c12695768 +Ref: 422512695768 +Ref: Extending Python with C or C++-Footnote-112697699 +Node: A Simple Example12697736 +Ref: extending/extending a-simple-example12697860 +Ref: 422612697860 +Ref: extending/extending extending-simpleexample12697860 +Ref: 422712697860 +Ref: A Simple Example-Footnote-112701595 +Node: Intermezzo Errors and Exceptions12701745 +Ref: extending/extending extending-errors12701897 +Ref: 422912701897 +Ref: extending/extending intermezzo-errors-and-exceptions12701897 +Ref: 422a12701897 +Node: Back to the Example12708831 +Ref: extending/extending back-to-the-example12709022 +Ref: 422f12709022 +Ref: extending/extending backtoexample12709022 +Ref: 423012709022 +Node: The Module’s Method Table and Initialization Function12710679 +Ref: extending/extending methodtable12710861 +Ref: 423212710861 +Ref: extending/extending the-module-s-method-table-and-initialization-function12710861 +Ref: 423312710861 +Ref: The Module’s Method Table and Initialization Function-Footnote-112716279 +Node: Compilation and Linkage12716321 +Ref: extending/extending compilation12716515 +Ref: 423512716515 +Ref: extending/extending compilation-and-linkage12716515 +Ref: 423612716515 +Node: Calling Python Functions from C12717989 +Ref: extending/extending calling-python-functions-from-c12718172 +Ref: 423812718172 +Ref: extending/extending callingpython12718172 +Ref: 423912718172 +Node: Extracting Parameters in Extension Functions12724855 +Ref: extending/extending extracting-parameters-in-extension-functions12725057 +Ref: 423c12725057 +Ref: extending/extending parsetuple12725057 +Ref: 422812725057 +Node: Keyword Parameters for Extension Functions12727739 +Ref: extending/extending keyword-parameters-for-extension-functions12727935 +Ref: 423d12727935 +Ref: extending/extending parsetupleandkeywords12727935 +Ref: 423e12727935 +Node: Building Arbitrary Values12730650 +Ref: extending/extending building-arbitrary-values12730818 +Ref: 423f12730818 +Ref: extending/extending buildvalue12730818 +Ref: 424012730818 +Node: Reference Counts12732904 +Ref: extending/extending refcounts12733055 +Ref: 423a12733055 +Ref: extending/extending reference-counts12733055 +Ref: 424112733055 +Node: Reference Counting in Python12737501 +Ref: extending/extending refcountsinpython12737606 +Ref: 424212737606 +Ref: extending/extending reference-counting-in-python12737606 +Ref: 424312737606 +Ref: Reference Counting in Python-Footnote-112739983 +Ref: Reference Counting in Python-Footnote-212740107 +Node: Ownership Rules12740278 +Ref: extending/extending ownership-rules12740400 +Ref: 424412740400 +Ref: extending/extending ownershiprules12740400 +Ref: 424512740400 +Node: Thin Ice12742868 +Ref: extending/extending thin-ice12742975 +Ref: 424e12742975 +Ref: extending/extending thinice12742975 +Ref: 424f12742975 +Node: NULL Pointers12746227 +Ref: extending/extending null-pointers12746310 +Ref: 425112746310 +Ref: extending/extending nullpointers12746310 +Ref: 425212746310 +Ref: NULL Pointers-Footnote-112747935 +Node: Writing Extensions in C++12748072 +Ref: extending/extending cplusplus12748239 +Ref: 425312748239 +Ref: extending/extending writing-extensions-in-c12748239 +Ref: 425412748239 +Node: Providing a C API for an Extension Module12748959 +Ref: extending/extending providing-a-c-api-for-an-extension-module12749101 +Ref: 425512749101 +Ref: extending/extending using-capsules12749101 +Ref: ff812749101 +Node: Defining Extension Types Tutorial12757933 +Ref: extending/newtypes_tutorial doc12758136 +Ref: 121812758136 +Ref: extending/newtypes_tutorial defining-extension-types-tutorial12758136 +Ref: 425812758136 +Ref: extending/newtypes_tutorial defining-new-types12758136 +Ref: 425912758136 +Node: The Basics12758780 +Ref: extending/newtypes_tutorial dnt-basics12758913 +Ref: 425a12758913 +Ref: extending/newtypes_tutorial the-basics12758913 +Ref: 425b12758913 +Ref: The Basics-Footnote-112768257 +Node: Adding data and methods to the Basic example12768327 +Ref: extending/newtypes_tutorial adding-data-and-methods-to-the-basic-example12768513 +Ref: 426212768513 +Ref: Adding data and methods to the Basic example-Footnote-112784746 +Ref: Adding data and methods to the Basic example-Footnote-212784839 +Node: Providing finer control over data attributes12784976 +Ref: extending/newtypes_tutorial providing-finer-control-over-data-attributes12785188 +Ref: 426b12785188 +Ref: Providing finer control over data attributes-Footnote-112795110 +Node: Supporting cyclic garbage collection12795490 +Ref: extending/newtypes_tutorial supporting-cyclic-garbage-collection12795681 +Ref: 426d12795681 +Ref: Supporting cyclic garbage collection-Footnote-112806331 +Node: Subclassing other types12806505 +Ref: extending/newtypes_tutorial subclassing-other-types12806643 +Ref: 426f12806643 +Node: Defining Extension Types Assorted Topics12811895 +Ref: extending/newtypes doc12812097 +Ref: 427212812097 +Ref: extending/newtypes defining-extension-types-assorted-topics12812097 +Ref: 427312812097 +Ref: extending/newtypes new-types-topics12812097 +Ref: 427412812097 +Ref: extending/newtypes dnt-type-methods12812194 +Ref: 427512812194 +Node: Finalization and De-allocation12816852 +Ref: extending/newtypes finalization-and-de-allocation12816987 +Ref: 427612816987 +Ref: Finalization and De-allocation-Footnote-112820486 +Node: Object Presentation12820528 +Ref: extending/newtypes object-presentation12820692 +Ref: 427912820692 +Node: Attribute Management12822346 +Ref: extending/newtypes attribute-management12822497 +Ref: 427c12822497 +Node: Generic Attribute Management12824046 +Ref: extending/newtypes generic-attribute-management12824174 +Ref: 426812824174 +Ref: extending/newtypes id112824174 +Ref: 427d12824174 +Node: Type-specific Attribute Management12828505 +Ref: extending/newtypes type-specific-attribute-management12828633 +Ref: 428012828633 +Node: Object Comparison12830370 +Ref: extending/newtypes object-comparison12830527 +Ref: 428312830527 +Node: Abstract Protocol Support12832292 +Ref: extending/newtypes abstract-protocol-support12832451 +Ref: 428612832451 +Node: Weak Reference Support12838137 +Ref: extending/newtypes weak-reference-support12838295 +Ref: 428c12838295 +Ref: extending/newtypes weakref-support12838295 +Ref: 1f9912838295 +Node: More Suggestions12840210 +Ref: extending/newtypes more-suggestions12840334 +Ref: 428d12840334 +Node: Building C and C++ Extensions12841303 +Ref: extending/building doc12841512 +Ref: 428e12841512 +Ref: extending/building building12841512 +Ref: 423712841512 +Ref: extending/building building-c-and-c-extensions12841512 +Ref: 428f12841512 +Ref: extending/building c PyInit_modulename12842008 +Ref: 429012842008 +Ref: Building C and C++ Extensions-Footnote-112843380 +Node: Building C and C++ Extensions with distutils12843422 +Ref: extending/building building-c-and-c-extensions-with-distutils12843576 +Ref: 429312843576 +Node: Distributing your extension modules12847553 +Ref: extending/building distributing12847707 +Ref: 429512847707 +Ref: extending/building distributing-your-extension-modules12847707 +Ref: 429612847707 +Node: Building C and C++ Extensions on Windows12848523 +Ref: extending/windows doc12848683 +Ref: 429812848683 +Ref: extending/windows building-c-and-c-extensions-on-windows12848683 +Ref: 429912848683 +Ref: extending/windows building-on-windows12848683 +Ref: 183d12848683 +Node: A Cookbook Approach12849952 +Ref: extending/windows a-cookbook-approach12850093 +Ref: 429a12850093 +Ref: extending/windows win-cookbook12850093 +Ref: 429b12850093 +Ref: A Cookbook Approach-Footnote-112850728 +Node: Differences Between Unix and Windows12850806 +Ref: extending/windows differences-between-unix-and-windows12850978 +Ref: 429c12850978 +Ref: extending/windows dynamic-linking12850978 +Ref: 429d12850978 +Node: Using DLLs in Practice12853901 +Ref: extending/windows using-dlls-in-practice12854045 +Ref: 429e12854045 +Ref: extending/windows win-dlls12854045 +Ref: 429f12854045 +Node: Embedding the CPython runtime in a larger application12855574 +Ref: extending/index embedding-the-cpython-runtime-in-a-larger-application12855764 +Ref: 42a012855764 +Node: Embedding Python in Another Application12856206 +Ref: extending/embedding doc12856335 +Ref: 42a112856335 +Ref: extending/embedding embedding12856335 +Ref: 42a212856335 +Ref: extending/embedding embedding-python-in-another-application12856335 +Ref: 42a312856335 +Node: Very High Level Embedding12858679 +Ref: extending/embedding high-level-embedding12858833 +Ref: 42a612858833 +Ref: extending/embedding very-high-level-embedding12858833 +Ref: 42a712858833 +Node: Beyond Very High Level Embedding An overview12860596 +Ref: extending/embedding beyond-very-high-level-embedding-an-overview12860773 +Ref: 42a812860773 +Ref: extending/embedding lower-level-embedding12860773 +Ref: 42a912860773 +Node: Pure Embedding12862492 +Ref: extending/embedding id112862669 +Ref: 42aa12862669 +Ref: extending/embedding pure-embedding12862669 +Ref: 42ab12862669 +Node: Extending Embedded Python12867291 +Ref: extending/embedding extending-embedded-python12867447 +Ref: 42ae12867447 +Ref: extending/embedding extending-with-embedding12867447 +Ref: 42af12867447 +Node: Embedding Python in C++12869427 +Ref: extending/embedding embedding-python-in-c12869614 +Ref: 42b012869614 +Ref: extending/embedding embeddingincplusplus12869614 +Ref: 42b112869614 +Node: Compiling and Linking under Unix-like systems12869986 +Ref: extending/embedding compiling12870139 +Ref: 42ac12870139 +Ref: extending/embedding compiling-and-linking-under-unix-like-systems12870139 +Ref: 42b212870139 +Node: Python/C API Reference Manual12872317 +Ref: c-api/index doc12872477 +Ref: 42b412872477 +Ref: c-api/index c-api-index12872477 +Ref: 162612872477 +Ref: c-api/index python-c-api-reference-manual12872477 +Ref: 42b512872477 +Node: Introduction<12>12873279 +Ref: c-api/intro doc12873385 +Ref: 42b612873385 +Ref: c-api/intro api-intro12873385 +Ref: 42b712873385 +Ref: c-api/intro introduction12873385 +Ref: 42b812873385 +Node: Coding standards12874959 +Ref: c-api/intro coding-standards12875050 +Ref: 42b912875050 +Ref: Coding standards-Footnote-112875489 +Node: Include Files12875531 +Ref: c-api/intro api-includes12875644 +Ref: 35912875644 +Ref: c-api/intro include-files12875644 +Ref: 42ba12875644 +Node: Useful macros12878165 +Ref: c-api/intro useful-macros12878296 +Ref: 42bb12878296 +Ref: c-api/intro c Py_ABS12878584 +Ref: 42bc12878584 +Ref: c-api/intro c Py_ALWAYS_INLINE12878679 +Ref: 12ba12878679 +Ref: c-api/intro c Py_CHARMASK12879649 +Ref: 42bd12879649 +Ref: c-api/intro c Py_DEPRECATED12879831 +Ref: 70012879831 +Ref: c-api/intro c Py_GETENV12880105 +Ref: 42be12880105 +Ref: c-api/intro c Py_MAX12880288 +Ref: 42bf12880288 +Ref: c-api/intro c Py_MEMBER_SIZE12880402 +Ref: 42c012880402 +Ref: c-api/intro c Py_MIN12880545 +Ref: 42c112880545 +Ref: c-api/intro c Py_NO_INLINE12880659 +Ref: 12bb12880659 +Ref: c-api/intro c Py_STRINGIFY12880957 +Ref: 42c212880957 +Ref: c-api/intro c Py_UNREACHABLE12881108 +Ref: 81712881108 +Ref: c-api/intro c Py_UNUSED12882261 +Ref: 42c312882261 +Ref: c-api/intro c PyDoc_STRVAR12882483 +Ref: 138a12882483 +Ref: c-api/intro c PyDoc_STR12883064 +Ref: 42c412883064 +Ref: Useful macros-Footnote-112883613 +Ref: Useful macros-Footnote-212883678 +Ref: Useful macros-Footnote-312883720 +Node: Objects Types and Reference Counts12883762 +Ref: c-api/intro api-objects12883894 +Ref: 42c512883894 +Ref: c-api/intro objects-types-and-reference-counts12883894 +Ref: 42c612883894 +Node: Reference Counts<2>12885276 +Ref: c-api/intro api-refcounts12885380 +Ref: 42c712885380 +Ref: c-api/intro reference-counts12885380 +Ref: 42c812885380 +Node: Reference Count Details12889088 +Ref: c-api/intro api-refcountdetails12889167 +Ref: 42c912889167 +Ref: c-api/intro reference-count-details12889167 +Ref: 42ca12889167 +Node: Types12896387 +Ref: c-api/intro api-types12896491 +Ref: 42cf12896491 +Ref: c-api/intro types12896491 +Ref: 42d012896491 +Ref: c-api/intro c Py_ssize_t12896945 +Ref: 6b112896945 +Ref: Types-Footnote-112897346 +Node: Exceptions<19>12897388 +Ref: c-api/intro api-exceptions12897526 +Ref: 42d112897526 +Ref: c-api/intro exceptions12897526 +Ref: 42d212897526 +Node: Embedding Python<2>12903665 +Ref: c-api/intro api-embedding12903785 +Ref: 42d412903785 +Ref: c-api/intro embedding-python12903785 +Ref: 42d512903785 +Node: Debugging Builds12906985 +Ref: c-api/intro api-debugging12907082 +Ref: 42d712907082 +Ref: c-api/intro debugging-builds12907082 +Ref: 42d812907082 +Node: C API Stability12908791 +Ref: c-api/stable doc12908931 +Ref: 42d912908931 +Ref: c-api/stable c-api-stability12908931 +Ref: 42da12908931 +Ref: c-api/stable stable12908931 +Ref: 4b812908931 +Ref: C API Stability-Footnote-112909918 +Node: Stable Application Binary Interface12909960 +Ref: c-api/stable stable-application-binary-interface12910079 +Ref: 42dc12910079 +Ref: c-api/stable c Py_LIMITED_API12910856 +Ref: 38112910856 +Node: Limited API Scope and Performance12912494 +Ref: c-api/stable limited-api-scope-and-performance12912627 +Ref: 42dd12912627 +Node: Limited API Caveats12913750 +Ref: c-api/stable limited-api-caveats12913883 +Ref: 42df12913883 +Node: Platform Considerations12915511 +Ref: c-api/stable platform-considerations12915662 +Ref: 42e012915662 +Ref: c-api/stable stable-abi-platform12915662 +Ref: 42db12915662 +Node: Contents of Limited API12916268 +Ref: c-api/stable contents-of-limited-api12916375 +Ref: 42e112916375 +Ref: c-api/stable stable-abi-list12916375 +Ref: 38612916375 +Node: The Very High Level Layer12950441 +Ref: c-api/veryhigh doc12950583 +Ref: 447612950583 +Ref: c-api/veryhigh the-very-high-level-layer12950583 +Ref: 447712950583 +Ref: c-api/veryhigh veryhigh12950583 +Ref: 447812950583 +Ref: c-api/veryhigh c Py_Main12951586 +Ref: 89112951586 +Ref: c-api/veryhigh c Py_BytesMain12952588 +Ref: 5ff12952588 +Ref: c-api/veryhigh c PyRun_AnyFile12952814 +Ref: 447912952814 +Ref: c-api/veryhigh c PyRun_AnyFileFlags12953039 +Ref: 447b12953039 +Ref: c-api/veryhigh c PyRun_AnyFileEx12953281 +Ref: 447c12953281 +Ref: c-api/veryhigh c PyRun_AnyFileExFlags12953510 +Ref: 447a12953510 +Ref: c-api/veryhigh c PyRun_SimpleString12954172 +Ref: 42a412954172 +Ref: c-api/veryhigh c PyRun_SimpleStringFlags12954399 +Ref: 447e12954399 +Ref: c-api/veryhigh c PyRun_SimpleFile12955082 +Ref: 42a512955082 +Ref: c-api/veryhigh c PyRun_SimpleFileEx12955313 +Ref: 447f12955313 +Ref: c-api/veryhigh c PyRun_SimpleFileExFlags12955535 +Ref: 130e12955535 +Ref: c-api/veryhigh c PyRun_InteractiveOne12956215 +Ref: 448012956215 +Ref: c-api/veryhigh c PyRun_InteractiveOneFlags12956433 +Ref: 448112956433 +Ref: c-api/veryhigh c PyRun_InteractiveLoop12957178 +Ref: 447d12957178 +Ref: c-api/veryhigh c PyRun_InteractiveLoopFlags12957398 +Ref: 448212957398 +Ref: c-api/veryhigh c PyOS_InputHook12957847 +Ref: 43ab12957847 +Ref: c-api/veryhigh c PyOS_ReadlineFunctionPointer12958367 +Ref: 4fc12958367 +Ref: c-api/veryhigh c PyRun_String12959393 +Ref: 140412959393 +Ref: c-api/veryhigh c PyRun_StringFlags12959677 +Ref: 448312959677 +Ref: c-api/veryhigh c PyRun_File12960360 +Ref: 448412960360 +Ref: c-api/veryhigh c PyRun_FileEx12960686 +Ref: 448612960686 +Ref: c-api/veryhigh c PyRun_FileFlags12961008 +Ref: 448712961008 +Ref: c-api/veryhigh c PyRun_FileExFlags12961343 +Ref: 448512961343 +Ref: c-api/veryhigh c Py_CompileString12961930 +Ref: 4aa12961930 +Ref: c-api/veryhigh c Py_CompileStringFlags12962250 +Ref: 448812962250 +Ref: c-api/veryhigh c Py_CompileStringObject12962556 +Ref: 448a12962556 +Ref: c-api/veryhigh c Py_CompileStringExFlags12963685 +Ref: 448912963685 +Ref: c-api/veryhigh c PyEval_EvalCode12964073 +Ref: 4ab12964073 +Ref: c-api/veryhigh c PyEval_EvalCodeEx12964449 +Ref: 11fb12964449 +Ref: c-api/veryhigh c PyEval_EvalFrame12965181 +Ref: 433e12965181 +Ref: c-api/veryhigh c PyEval_EvalFrameEx12965476 +Ref: cda12965476 +Ref: c-api/veryhigh c PyEval_MergeCompilerFlags12966228 +Ref: 448b12966228 +Ref: c-api/veryhigh c Py_eval_input12966420 +Ref: 448c12966420 +Ref: c-api/veryhigh c Py_file_input12966577 +Ref: 448d12966577 +Ref: c-api/veryhigh c Py_single_input12966862 +Ref: 448e12966862 +Ref: c-api/veryhigh c PyCompilerFlags12967087 +Ref: 6fb12967087 +Ref: c-api/veryhigh c PyCompilerFlags cf_flags12967620 +Ref: 448f12967620 +Ref: c-api/veryhigh c PyCompilerFlags cf_feature_version12967680 +Ref: 449012967680 +Ref: c-api/veryhigh c CO_FUTURE_DIVISION12968038 +Ref: 449112968038 +Ref: The Very High Level Layer-Footnote-112968257 +Node: Reference Counting12968299 +Ref: c-api/refcounting doc12968444 +Ref: 449212968444 +Ref: c-api/refcounting countingrefs12968444 +Ref: 449312968444 +Ref: c-api/refcounting reference-counting12968444 +Ref: 449412968444 +Ref: c-api/refcounting c Py_INCREF12968577 +Ref: 4cc12968577 +Ref: c-api/refcounting c Py_XINCREF12969034 +Ref: 6b612969034 +Ref: c-api/refcounting c Py_NewRef12969248 +Ref: 4c512969248 +Ref: c-api/refcounting c Py_XNewRef12969989 +Ref: 4c612969989 +Ref: c-api/refcounting c Py_DECREF12970293 +Ref: 4cd12970293 +Ref: c-api/refcounting c Py_XDECREF12971509 +Ref: 36312971509 +Ref: c-api/refcounting c Py_CLEAR12971787 +Ref: 10d712971787 +Ref: c-api/refcounting c Py_IncRef12972479 +Ref: 445512972479 +Ref: c-api/refcounting c Py_DecRef12972730 +Ref: 444e12972730 +Node: Exception Handling12973189 +Ref: c-api/exceptions doc12973321 +Ref: 449512973321 +Ref: c-api/exceptions exception-handling12973321 +Ref: 449612973321 +Ref: c-api/exceptions exceptionhandling12973321 +Ref: 3bf012973321 +Node: Printing and clearing12975633 +Ref: c-api/exceptions printing-and-clearing12975736 +Ref: 449712975736 +Ref: c-api/exceptions c PyErr_Clear12975793 +Ref: cde12975793 +Ref: c-api/exceptions c PyErr_PrintEx12975961 +Ref: 432e12975961 +Ref: c-api/exceptions c PyErr_Print12976694 +Ref: 135312976694 +Ref: c-api/exceptions c PyErr_WriteUnraisable12976814 +Ref: 141312976814 +Node: Raising exceptions12977559 +Ref: c-api/exceptions raising-exceptions12977687 +Ref: 449812977687 +Ref: c-api/exceptions c PyErr_SetString12977927 +Ref: 422b12977927 +Ref: c-api/exceptions c PyErr_SetObject12978386 +Ref: 422d12978386 +Ref: c-api/exceptions c PyErr_Format12978657 +Ref: b3f12978657 +Ref: c-api/exceptions c PyErr_FormatV12979160 +Ref: b3e12979160 +Ref: c-api/exceptions c PyErr_SetNone12979522 +Ref: 433912979522 +Ref: c-api/exceptions c PyErr_BadArgument12979686 +Ref: 432a12979686 +Ref: c-api/exceptions c PyErr_NoMemory12979982 +Ref: 422e12979982 +Ref: c-api/exceptions c PyErr_SetFromErrno12980313 +Ref: 422c12980313 +Ref: c-api/exceptions c PyErr_SetFromErrnoWithFilenameObject12981252 +Ref: 433412981252 +Ref: c-api/exceptions c PyErr_SetFromErrnoWithFilenameObjects12981795 +Ref: 433512981795 +Ref: c-api/exceptions c PyErr_SetFromErrnoWithFilename12982265 +Ref: 433312982265 +Ref: c-api/exceptions c PyErr_SetFromWindowsErr12982657 +Ref: 433612982657 +Ref: c-api/exceptions c PyErr_SetExcFromWindowsErr12983514 +Ref: 432f12983514 +Ref: c-api/exceptions c PyErr_SetFromWindowsErrWithFilename12983899 +Ref: 433712983899 +Ref: c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilenameObject12984375 +Ref: 433112984375 +Ref: c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilenameObjects12984820 +Ref: 433212984820 +Ref: c-api/exceptions c PyErr_SetExcFromWindowsErrWithFilename12985287 +Ref: 433012985287 +Ref: c-api/exceptions c PyErr_SetImportError12985728 +Ref: 9b212985728 +Ref: c-api/exceptions c PyErr_SetImportErrorSubclass12986257 +Ref: 98812986257 +Ref: c-api/exceptions c PyErr_SyntaxLocationObject12986679 +Ref: 449912986679 +Ref: c-api/exceptions c PyErr_SyntaxLocationEx12987087 +Ref: 433b12987087 +Ref: c-api/exceptions c PyErr_SyntaxLocation12987444 +Ref: 433a12987444 +Ref: c-api/exceptions c PyErr_BadInternalCall12987672 +Ref: 432b12987672 +Node: Issuing warnings12988013 +Ref: c-api/exceptions issuing-warnings12988148 +Ref: 449a12988148 +Ref: c-api/exceptions c PyErr_WarnEx12989044 +Ref: 10b012989044 +Ref: c-api/exceptions c PyErr_WarnExplicitObject12990233 +Ref: 449c12990233 +Ref: c-api/exceptions c PyErr_WarnExplicit12990775 +Ref: 433c12990775 +Ref: c-api/exceptions c PyErr_WarnFormat12991209 +Ref: 433d12991209 +Ref: c-api/exceptions c PyErr_ResourceWarning12991567 +Ref: 98912991567 +Node: Querying the error indicator12991949 +Ref: c-api/exceptions querying-the-error-indicator12992084 +Ref: 449d12992084 +Ref: c-api/exceptions c PyErr_Occurred12992155 +Ref: 12f812992155 +Ref: c-api/exceptions c PyErr_ExceptionMatches12993035 +Ref: 42d312993035 +Ref: c-api/exceptions c PyErr_GivenExceptionMatches12993359 +Ref: 432d12993359 +Ref: c-api/exceptions c PyErr_Fetch12993796 +Ref: cdd12993796 +Ref: c-api/exceptions c PyErr_Restore12994759 +Ref: 427712994759 +Ref: c-api/exceptions c PyErr_NormalizeException12995790 +Ref: 141412995790 +Ref: c-api/exceptions c PyErr_GetHandledException12996707 +Ref: 34112996707 +Ref: c-api/exceptions c PyErr_SetHandledException12997510 +Ref: 34212997510 +Ref: c-api/exceptions c PyErr_GetExcInfo12998181 +Ref: 34412998181 +Ref: c-api/exceptions c PyErr_SetExcInfo12999148 +Ref: 34312999148 +Node: Signal Handling<2>13000323 +Ref: c-api/exceptions signal-handling13000459 +Ref: 449e13000459 +Ref: c-api/exceptions c PyErr_CheckSignals13000504 +Ref: 432c13000504 +Ref: c-api/exceptions c PyErr_SetInterrupt13001760 +Ref: 433813001760 +Ref: c-api/exceptions c PyErr_SetInterruptEx13002110 +Ref: 4cb13002110 +Ref: c-api/exceptions c PySignal_SetWakeupFd13003188 +Ref: 104713003188 +Node: Exception Classes13003858 +Ref: c-api/exceptions exception-classes13003983 +Ref: 449f13003983 +Ref: c-api/exceptions c PyErr_NewException13004032 +Ref: f2413004032 +Ref: c-api/exceptions c PyErr_NewExceptionWithDoc13005020 +Ref: f2313005020 +Node: Exception Objects13005480 +Ref: c-api/exceptions exception-objects13005612 +Ref: 44a013005612 +Ref: c-api/exceptions c PyException_GetTraceback13005661 +Ref: 434713005661 +Ref: c-api/exceptions c PyException_SetTraceback13006029 +Ref: 141513006029 +Ref: c-api/exceptions c PyException_GetContext13006252 +Ref: 434613006252 +Ref: c-api/exceptions c PyException_SetContext13006684 +Ref: 434913006684 +Ref: c-api/exceptions c PyException_GetCause13007022 +Ref: 434513007022 +Ref: c-api/exceptions c PyException_SetCause13007404 +Ref: 434813007404 +Node: Unicode Exception Objects13007860 +Ref: c-api/exceptions unicode-exception-objects13007992 +Ref: 44a113007992 +Ref: c-api/exceptions unicodeexceptions13007992 +Ref: 44a213007992 +Ref: c-api/exceptions c PyUnicodeDecodeError_Create13008139 +Ref: 440b13008139 +Ref: c-api/exceptions c PyUnicodeDecodeError_GetEncoding13008612 +Ref: 440c13008612 +Ref: c-api/exceptions c PyUnicodeEncodeError_GetEncoding13008709 +Ref: 441413008709 +Ref: c-api/exceptions c PyUnicodeDecodeError_GetObject13008955 +Ref: 440e13008955 +Ref: c-api/exceptions c PyUnicodeEncodeError_GetObject13009050 +Ref: 441613009050 +Ref: c-api/exceptions c PyUnicodeTranslateError_GetObject13009145 +Ref: 441d13009145 +Ref: c-api/exceptions c PyUnicodeDecodeError_GetStart13009385 +Ref: 441013009385 +Ref: c-api/exceptions c PyUnicodeEncodeError_GetStart13009480 +Ref: 441813009480 +Ref: c-api/exceptions c PyUnicodeTranslateError_GetStart13009575 +Ref: 441f13009575 +Ref: c-api/exceptions c PyUnicodeDecodeError_SetStart13009894 +Ref: 441313009894 +Ref: c-api/exceptions c PyUnicodeEncodeError_SetStart13009988 +Ref: 441b13009988 +Ref: c-api/exceptions c PyUnicodeTranslateError_SetStart13010082 +Ref: 442213010082 +Ref: c-api/exceptions c PyUnicodeDecodeError_GetEnd13010351 +Ref: 440d13010351 +Ref: c-api/exceptions c PyUnicodeEncodeError_GetEnd13010442 +Ref: 441513010442 +Ref: c-api/exceptions c PyUnicodeTranslateError_GetEnd13010533 +Ref: 441c13010533 +Ref: c-api/exceptions c PyUnicodeDecodeError_SetEnd13010842 +Ref: 441113010842 +Ref: c-api/exceptions c PyUnicodeEncodeError_SetEnd13010932 +Ref: 441913010932 +Ref: c-api/exceptions c PyUnicodeTranslateError_SetEnd13011022 +Ref: 442013011022 +Ref: c-api/exceptions c PyUnicodeDecodeError_GetReason13011283 +Ref: 440f13011283 +Ref: c-api/exceptions c PyUnicodeEncodeError_GetReason13011378 +Ref: 441713011378 +Ref: c-api/exceptions c PyUnicodeTranslateError_GetReason13011473 +Ref: 441e13011473 +Ref: c-api/exceptions c PyUnicodeDecodeError_SetReason13011713 +Ref: 441213011713 +Ref: c-api/exceptions c PyUnicodeEncodeError_SetReason13011810 +Ref: 441a13011810 +Ref: c-api/exceptions c PyUnicodeTranslateError_SetReason13011907 +Ref: 442113011907 +Node: Recursion Control13012181 +Ref: c-api/exceptions recursion13012315 +Ref: 44a313012315 +Ref: c-api/exceptions recursion-control13012315 +Ref: 44a413012315 +Ref: c-api/exceptions c Py_EnterRecursiveCall13012748 +Ref: 5c813012748 +Ref: c-api/exceptions c Py_LeaveRecursiveCall13013656 +Ref: 5c913013656 +Ref: c-api/exceptions c Py_ReprEnter13014355 +Ref: 445813014355 +Ref: c-api/exceptions c Py_ReprLeave13015161 +Ref: 445913015161 +Node: Standard Exceptions13015395 +Ref: c-api/exceptions standard-exceptions13015531 +Ref: 44a613015531 +Ref: c-api/exceptions standardexceptions13015531 +Ref: 44a713015531 +Ref: Standard Exceptions-Footnote-113028671 +Ref: Standard Exceptions-Footnote-213028731 +Ref: Standard Exceptions-Footnote-313028791 +Ref: Standard Exceptions-Footnote-413028851 +Ref: Standard Exceptions-Footnote-513028911 +Ref: Standard Exceptions-Footnote-613028971 +Ref: Standard Exceptions-Footnote-713029013 +Node: Standard Warning Categories13029142 +Ref: c-api/exceptions standard-warning-categories13029252 +Ref: 44a813029252 +Ref: c-api/exceptions standardwarningcategories13029252 +Ref: 449b13029252 +Ref: Standard Warning Categories-Footnote-113032352 +Node: Utilities<2>13032420 +Ref: c-api/utilities doc13032556 +Ref: 44a913032556 +Ref: c-api/utilities id113032556 +Ref: 44aa13032556 +Ref: c-api/utilities utilities13032556 +Ref: 44ab13032556 +Node: Operating System Utilities13033105 +Ref: c-api/sys doc13033205 +Ref: 44ac13033205 +Ref: c-api/sys operating-system-utilities13033205 +Ref: 44ad13033205 +Ref: c-api/sys os13033205 +Ref: 44ae13033205 +Ref: c-api/sys c PyOS_FSPath13033272 +Ref: 98a13033272 +Ref: c-api/sys c Py_FdIsInteractive13033893 +Ref: 44af13033893 +Ref: c-api/sys c PyOS_BeforeFork13034376 +Ref: 82513034376 +Ref: c-api/sys c PyOS_AfterFork_Parent13034997 +Ref: 82613034997 +Ref: c-api/sys c PyOS_AfterFork_Child13035709 +Ref: 6fc13035709 +Ref: c-api/sys c PyOS_AfterFork13036703 +Ref: 82413036703 +Ref: c-api/sys c PyOS_CheckStack13037188 +Ref: 11fd13037188 +Ref: c-api/sys c PyOS_getsig13037692 +Ref: 43ad13037692 +Ref: c-api/sys c PyOS_setsig13038032 +Ref: 43ae13038032 +Ref: c-api/sys c Py_DecodeLocale13038439 +Ref: 82d13038439 +Ref: c-api/sys c Py_EncodeLocale13040737 +Ref: 82e13040737 +Node: System Functions13042485 +Ref: c-api/sys system-functions13042609 +Ref: 44b513042609 +Ref: c-api/sys systemfunctions13042609 +Ref: 44b613042609 +Ref: c-api/sys c PySys_GetObject13042908 +Ref: 36413042908 +Ref: c-api/sys c PySys_SetObject13043194 +Ref: 43ed13043194 +Ref: c-api/sys c PySys_ResetWarnOptions13043496 +Ref: 43ec13043496 +Ref: c-api/sys c PySys_AddWarnOption13043716 +Ref: 36713043716 +Ref: c-api/sys c PySys_AddWarnOptionUnicode13044206 +Ref: 36613044206 +Ref: c-api/sys c PySys_SetPath13044935 +Ref: 36b13044935 +Ref: c-api/sys c PySys_WriteStdout13045516 +Ref: 43ef13045516 +Ref: c-api/sys c PySys_WriteStderr13046430 +Ref: 43ee13046430 +Ref: c-api/sys c PySys_FormatStdout13046643 +Ref: 43ea13046643 +Ref: c-api/sys c PySys_FormatStderr13046958 +Ref: 43e913046958 +Ref: c-api/sys c PySys_AddXOption13047199 +Ref: 36813047199 +Ref: c-api/sys c PySys_GetXOptions13047782 +Ref: 43eb13047782 +Ref: c-api/sys c PySys_Audit13048138 +Ref: 139713048138 +Ref: c-api/sys c PySys_AddAuditHook13049283 +Ref: 3a3f13049283 +Ref: System Functions-Footnote-113051144 +Node: Process Control13051186 +Ref: c-api/sys process-control13051304 +Ref: 44ba13051304 +Ref: c-api/sys processcontrol13051304 +Ref: 44bb13051304 +Ref: c-api/sys c Py_FatalError13051349 +Ref: 5d913051349 +Ref: c-api/sys c Py_Exit13052124 +Ref: 9ca13052124 +Ref: c-api/sys c Py_AtExit13052521 +Ref: 444c13052521 +Node: Importing Modules<2>13053214 +Ref: c-api/import doc13053340 +Ref: 44bc13053340 +Ref: c-api/import importing13053340 +Ref: 44bd13053340 +Ref: c-api/import importing-modules13053340 +Ref: 44be13053340 +Ref: c-api/import c PyImport_ImportModule13053389 +Ref: 4ac13053389 +Ref: c-api/import c PyImport_ImportModuleNoBlock13054485 +Ref: d2b13054485 +Ref: c-api/import c PyImport_ImportModuleEx13055028 +Ref: e5913055028 +Ref: c-api/import c PyImport_ImportModuleLevelObject13055778 +Ref: 435e13055778 +Ref: c-api/import c PyImport_ImportModuleLevel13056612 +Ref: e5813056612 +Ref: c-api/import c PyImport_Import13057084 +Ref: 106013057084 +Ref: c-api/import c PyImport_ReloadModule13057660 +Ref: 435f13057660 +Ref: c-api/import c PyImport_AddModuleObject13057987 +Ref: 435413057987 +Ref: c-api/import c PyImport_AddModule13058898 +Ref: 424a13058898 +Ref: c-api/import c PyImport_ExecCodeModule13059194 +Ref: 435513059194 +Ref: c-api/import c PyImport_ExecCodeModuleEx13061030 +Ref: 435613061030 +Ref: c-api/import c PyImport_ExecCodeModuleObject13061468 +Ref: 435713061468 +Ref: c-api/import c PyImport_ExecCodeModuleWithPathnames13061983 +Ref: 435813061983 +Ref: c-api/import c PyImport_GetMagicNumber13062676 +Ref: e5713062676 +Ref: c-api/import c PyImport_GetMagicTag13063069 +Ref: 435a13063069 +Ref: c-api/import c PyImport_GetModuleDict13063415 +Ref: 435b13063415 +Ref: c-api/import c PyImport_GetModule13063708 +Ref: 81613063708 +Ref: c-api/import c PyImport_GetImporter13064141 +Ref: 435913064141 +Ref: c-api/import c PyImport_ImportFrozenModuleObject13064868 +Ref: 435d13064868 +Ref: c-api/import c PyImport_ImportFrozenModule13065535 +Ref: 435c13065535 +Ref: c-api/import c _frozen13065785 +Ref: 34713065785 +Ref: c-api/import c PyImport_FrozenModules13066417 +Ref: 28eb13066417 +Ref: c-api/import c PyImport_AppendInittab13066832 +Ref: 12bc13066832 +Ref: c-api/import c _inittab13067414 +Ref: 44bf13067414 +Ref: c-api/import c PyImport_ExtendInittab13068071 +Ref: 12bd13068071 +Ref: Importing Modules<2>-Footnote-113068875 +Node: Data marshalling support13068917 +Ref: c-api/marshal doc13069065 +Ref: 44c013069065 +Ref: c-api/marshal data-marshalling-support13069065 +Ref: 44c113069065 +Ref: c-api/marshal marshalling-utils13069065 +Ref: 44c213069065 +Ref: c-api/marshal c PyMarshal_WriteLongToFile13069812 +Ref: 38213069812 +Ref: c-api/marshal c PyMarshal_WriteObjectToFile13070118 +Ref: 38313070118 +Ref: c-api/marshal c PyMarshal_WriteObjectToString13070315 +Ref: 38513070315 +Ref: c-api/marshal c PyMarshal_ReadLongFromFile13070654 +Ref: 44c313070654 +Ref: c-api/marshal c PyMarshal_ReadShortFromFile13070992 +Ref: 44c413070992 +Ref: c-api/marshal c PyMarshal_ReadObjectFromFile13071333 +Ref: 44c513071333 +Ref: c-api/marshal c PyMarshal_ReadLastObjectFromFile13071693 +Ref: 44c613071693 +Ref: c-api/marshal c PyMarshal_ReadObjectFromString13072486 +Ref: 38413072486 +Node: Parsing arguments and building values13072906 +Ref: c-api/arg doc13073066 +Ref: 44c713073066 +Ref: c-api/arg arg-parsing13073066 +Ref: 4db13073066 +Ref: c-api/arg parsing-arguments-and-building-values13073066 +Ref: 44c813073066 +Node: Parsing arguments<3>13073738 +Ref: c-api/arg parsing-arguments13073856 +Ref: 44c913073856 +Node: Strings and buffers13074586 +Ref: c-api/arg strings-and-buffers13074681 +Ref: 44ca13074681 +Node: Numbers<2>13086665 +Ref: c-api/arg numbers13086782 +Ref: 44cb13086782 +Node: Other objects13088833 +Ref: c-api/arg other-objects13088944 +Ref: 44cd13088944 +Ref: c-api/arg o-ampersand13089696 +Ref: 44ce13089696 +Node: API Functions13094198 +Ref: c-api/arg api-functions13094290 +Ref: 44cf13094290 +Ref: c-api/arg c PyArg_ParseTuple13094335 +Ref: 4d913094335 +Ref: c-api/arg c PyArg_VaParse13094672 +Ref: 42e313094672 +Ref: c-api/arg c PyArg_ParseTupleAndKeywords13094944 +Ref: 98713094944 +Ref: c-api/arg c PyArg_VaParseTupleAndKeywords13095583 +Ref: 10d813095583 +Ref: c-api/arg c PyArg_ValidateKeywordArguments13095924 +Ref: 42e413095924 +Ref: c-api/arg c PyArg_Parse13096264 +Ref: 140d13096264 +Ref: c-api/arg c PyArg_UnpackTuple13096906 +Ref: 114113096906 +Node: Building values13098889 +Ref: c-api/arg building-values13099007 +Ref: 44d013099007 +Ref: c-api/arg c Py_BuildValue13099056 +Ref: 4da13099056 +Ref: c-api/arg c Py_VaBuildValue13106577 +Ref: 445b13106577 +Node: String conversion and formatting13106881 +Ref: c-api/conversion doc13107027 +Ref: 44d113107027 +Ref: c-api/conversion string-conversion13107027 +Ref: 44d213107027 +Ref: c-api/conversion string-conversion-and-formatting13107027 +Ref: 44d313107027 +Ref: c-api/conversion c PyOS_snprintf13107168 +Ref: 114413107168 +Ref: c-api/conversion c PyOS_vsnprintf13107467 +Ref: 114513107467 +Ref: c-api/conversion c PyOS_string_to_double13109055 +Ref: f4413109055 +Ref: c-api/conversion c PyOS_double_to_string13110812 +Ref: 43ac13110812 +Ref: c-api/conversion c PyOS_stricmp13112438 +Ref: 44d413112438 +Ref: c-api/conversion c PyOS_strnicmp13112646 +Ref: 44d513112646 +Node: Reflection13112883 +Ref: c-api/reflection doc13113028 +Ref: 44d613113028 +Ref: c-api/reflection id113113028 +Ref: 44d713113028 +Ref: c-api/reflection reflection13113028 +Ref: 44d813113028 +Ref: c-api/reflection c PyEval_GetBuiltins13113063 +Ref: 433f13113063 +Ref: c-api/reflection c PyEval_GetLocals13113366 +Ref: 434313113366 +Ref: c-api/reflection c PyEval_GetGlobals13113644 +Ref: 434213113644 +Ref: c-api/reflection c PyEval_GetFrame13113924 +Ref: 118213113924 +Ref: c-api/reflection c PyEval_GetFuncName13114232 +Ref: 434113114232 +Ref: c-api/reflection c PyEval_GetFuncDesc13114455 +Ref: 434013114455 +Node: Codec registry and support functions13114871 +Ref: c-api/codec doc13114975 +Ref: 44d913114975 +Ref: c-api/codec codec-registry13114975 +Ref: 9a813114975 +Ref: c-api/codec codec-registry-and-support-functions13114975 +Ref: 44da13114975 +Ref: c-api/codec c PyCodec_Register13115062 +Ref: 430a13115062 +Ref: c-api/codec c PyCodec_Unregister13115382 +Ref: 4c013115382 +Ref: c-api/codec c PyCodec_KnownEncoding13115744 +Ref: 430813115744 +Ref: c-api/codec c PyCodec_Encode13115996 +Ref: 430313115996 +Ref: c-api/codec c PyCodec_Decode13116532 +Ref: 430113116532 +Node: Codec lookup API13117152 +Ref: c-api/codec codec-lookup-api13117298 +Ref: 44db13117298 +Ref: c-api/codec c PyCodec_Encoder13117616 +Ref: 430413117616 +Ref: c-api/codec c PyCodec_Decoder13117834 +Ref: 430213117834 +Ref: c-api/codec c PyCodec_IncrementalEncoder13118051 +Ref: 430713118051 +Ref: c-api/codec c PyCodec_IncrementalDecoder13118327 +Ref: 430613118327 +Ref: c-api/codec c PyCodec_StreamReader13118603 +Ref: 430d13118603 +Ref: c-api/codec c PyCodec_StreamWriter13118894 +Ref: 430e13118894 +Node: Registry API for Unicode encoding error handlers13119185 +Ref: c-api/codec registry-api-for-unicode-encoding-error-handlers13119331 +Ref: 44dc13119331 +Ref: c-api/codec c PyCodec_RegisterError13119446 +Ref: 430b13119446 +Ref: c-api/codec c PyCodec_LookupError13120576 +Ref: 430913120576 +Ref: c-api/codec c PyCodec_StrictErrors13120945 +Ref: 430f13120945 +Ref: c-api/codec c PyCodec_IgnoreErrors13121136 +Ref: 430513121136 +Ref: c-api/codec c PyCodec_ReplaceErrors13121355 +Ref: 430c13121355 +Ref: c-api/codec c PyCodec_XMLCharRefReplaceErrors13121585 +Ref: 431013121585 +Ref: c-api/codec c PyCodec_BackslashReplaceErrors13121831 +Ref: 430013121831 +Ref: c-api/codec c PyCodec_NameReplaceErrors13122103 +Ref: b3d13122103 +Node: Abstract Objects Layer13122385 +Ref: c-api/abstract doc13122525 +Ref: 44dd13122525 +Ref: c-api/abstract abstract13122525 +Ref: 428713122525 +Ref: c-api/abstract abstract-objects-layer13122525 +Ref: 44de13122525 +Node: Object Protocol13123254 +Ref: c-api/object doc13123350 +Ref: 44df13123350 +Ref: c-api/object object13123350 +Ref: 44e013123350 +Ref: c-api/object object-protocol13123350 +Ref: 44e113123350 +Ref: c-api/object c Py_NotImplemented13123395 +Ref: 44e213123395 +Ref: c-api/object c Py_RETURN_NOTIMPLEMENTED13123583 +Ref: 44e313123583 +Ref: c-api/object c PyObject_Print13123794 +Ref: 149213123794 +Ref: c-api/object c PyObject_HasAttr13124169 +Ref: 43c113124169 +Ref: c-api/object c PyObject_HasAttrString13124694 +Ref: 43c213124694 +Ref: c-api/object c PyObject_GetAttr13125287 +Ref: 43bf13125287 +Ref: c-api/object c PyObject_GetAttrString13125669 +Ref: 424613125669 +Ref: c-api/object c PyObject_GenericGetAttr13126059 +Ref: 43bb13126059 +Ref: c-api/object c PyObject_SetAttr13126738 +Ref: 43c613126738 +Ref: c-api/object c PyObject_SetAttrString13127323 +Ref: 43c713127323 +Ref: c-api/object c PyObject_GenericSetAttr13127871 +Ref: 43bc13127871 +Ref: c-api/object c PyObject_DelAttr13128572 +Ref: 44e413128572 +Ref: c-api/object c PyObject_DelAttrString13128814 +Ref: 44e513128814 +Ref: c-api/object c PyObject_GenericGetDict13129074 +Ref: 134413129074 +Ref: c-api/object c PyObject_GenericSetDict13129815 +Ref: 43bd13129815 +Ref: c-api/object c _PyObject_GetDictPtr13130153 +Ref: 44e613130153 +Ref: c-api/object c PyObject_RichCompare13130582 +Ref: 428513130582 +Ref: c-api/object c PyObject_RichCompareBool13131267 +Ref: 13c013131267 +Ref: c-api/object c PyObject_Repr13132076 +Ref: cdb13132076 +Ref: c-api/object c PyObject_ASCII13132632 +Ref: 43b013132632 +Ref: c-api/object c PyObject_Str13133172 +Ref: cdc13133172 +Ref: c-api/object c PyObject_Bytes13133777 +Ref: 43b513133777 +Ref: c-api/object c PyObject_IsSubclass13134263 +Ref: b3413134263 +Ref: c-api/object c PyObject_IsInstance13135277 +Ref: b3313135277 +Ref: c-api/object c PyObject_Hash13136285 +Ref: 37313136285 +Ref: c-api/object c PyObject_HashNotImplemented13136680 +Ref: 103413136680 +Ref: c-api/object c PyObject_IsTrue13137070 +Ref: 43c313137070 +Ref: c-api/object c PyObject_Not13137355 +Ref: 43c513137355 +Ref: c-api/object c PyObject_Type13137633 +Ref: 43c913137633 +Ref: c-api/object c PyObject_TypeCheck13138323 +Ref: 12fd13138323 +Ref: c-api/object c PyObject_Size13138548 +Ref: 43c813138548 +Ref: c-api/object c PyObject_Length13138615 +Ref: 43c413138615 +Ref: c-api/object c PyObject_LengthHint13138982 +Ref: ca613138982 +Ref: c-api/object c PyObject_GetItem13139441 +Ref: 42ce13139441 +Ref: c-api/object c PyObject_SetItem13139771 +Ref: 42cc13139771 +Ref: c-api/object c PyObject_DelItem13140156 +Ref: 43b913140156 +Ref: c-api/object c PyObject_Dir13140429 +Ref: 43ba13140429 +Ref: c-api/object c PyObject_GetIter13141021 +Ref: 43c013141021 +Ref: c-api/object c PyObject_GetAIter13141448 +Ref: 43be13141448 +Ref: Object Protocol-Footnote-113142040 +Ref: Object Protocol-Footnote-213142082 +Node: Call Protocol13142124 +Ref: c-api/call doc13142244 +Ref: 44e713142244 +Ref: c-api/call call13142244 +Ref: 44a513142244 +Ref: c-api/call call-protocol13142244 +Ref: 44e813142244 +Node: The tp_call Protocol13142469 +Ref: c-api/call the-tp-call-protocol13142571 +Ref: 44e913142571 +Node: The Vectorcall Protocol13143310 +Ref: c-api/call the-vectorcall-protocol13143439 +Ref: 44eb13143439 +Ref: c-api/call vectorcall13143439 +Ref: 60613143439 +Ref: c-api/call c vectorcallfunc13144829 +Ref: 44ef13144829 +Ref: c-api/call c PY_VECTORCALL_ARGUMENTS_OFFSET13145843 +Ref: 44f113145843 +Ref: The Vectorcall Protocol-Footnote-113147455 +Node: Recursion Control<2>13147497 +Ref: c-api/call recursion-control13147608 +Ref: 44f313147608 +Node: Vectorcall Support API13148020 +Ref: c-api/call vectorcall-support-api13148131 +Ref: 44f413148131 +Ref: c-api/call c PyVectorcall_NARGS13148194 +Ref: 44f013148194 +Ref: c-api/call c PyVectorcall_Function13148590 +Ref: 44f513148590 +Ref: c-api/call c PyVectorcall_Call13149138 +Ref: 44ec13149138 +Node: Object Calling API13149689 +Ref: c-api/call capi-call13149814 +Ref: 44ea13149814 +Ref: c-api/call object-calling-api13149814 +Ref: 44f613149814 +Ref: c-api/call c PyObject_Call13154442 +Ref: 5b913154442 +Ref: c-api/call c PyObject_CallNoArgs13155130 +Ref: 5c713155130 +Ref: c-api/call c PyObject_CallOneArg13155579 +Ref: 5cd13155579 +Ref: c-api/call c PyObject_CallObject13155934 +Ref: 423b13155934 +Ref: c-api/call c PyObject_CallFunction13156453 +Ref: 6fd13156453 +Ref: c-api/call c PyObject_CallMethod13157309 +Ref: 4ad13157309 +Ref: c-api/call c PyObject_CallFunctionObjArgs13158229 +Ref: 43b613158229 +Ref: c-api/call c PyObject_CallMethodObjArgs13158805 +Ref: 142d13158805 +Ref: c-api/call c PyObject_CallMethodNoArgs13159395 +Ref: 44f713159395 +Ref: c-api/call c PyObject_CallMethodOneArg13159784 +Ref: 44f813159784 +Ref: c-api/call c PyObject_Vectorcall13160210 +Ref: 122b13160210 +Ref: c-api/call c PyObject_VectorcallDict13160737 +Ref: 44f913160737 +Ref: c-api/call c PyObject_VectorcallMethod13161447 +Ref: 44f213161447 +Node: Call Support API13162499 +Ref: c-api/call call-support-api13162592 +Ref: 44fb13162592 +Ref: c-api/call c PyCallable_Check13162643 +Ref: 42f613162643 +Node: Number Protocol13162887 +Ref: c-api/number doc13163009 +Ref: 44fc13163009 +Ref: c-api/number number13163009 +Ref: 44fd13163009 +Ref: c-api/number number-protocol13163009 +Ref: 44fe13163009 +Ref: c-api/number c PyNumber_Check13163054 +Ref: 6b813163054 +Ref: c-api/number c PyNumber_Add13163347 +Ref: 438e13163347 +Ref: c-api/number c PyNumber_Subtract13163662 +Ref: 43a813163662 +Ref: c-api/number c PyNumber_Multiply13163988 +Ref: 43a113163988 +Ref: c-api/number c PyNumber_MatrixMultiply13164313 +Ref: b4313164313 +Ref: c-api/number c PyNumber_FloorDivide13164702 +Ref: 439213164702 +Ref: c-api/number c PyNumber_TrueDivide13165024 +Ref: 43a913165024 +Ref: c-api/number c PyNumber_Remainder13165639 +Ref: 43a613165639 +Ref: c-api/number c PyNumber_Divmod13165964 +Ref: 439113165964 +Ref: c-api/number c PyNumber_Power13166303 +Ref: 43a513166303 +Ref: c-api/number c PyNumber_Negative13166821 +Ref: 43a213166821 +Ref: c-api/number c PyNumber_Positive13167102 +Ref: 43a413167102 +Ref: c-api/number c PyNumber_Absolute13167367 +Ref: 438d13167367 +Ref: c-api/number c PyNumber_Invert13167652 +Ref: 439f13167652 +Ref: c-api/number c PyNumber_Lshift13167939 +Ref: 43a013167939 +Ref: c-api/number c PyNumber_Rshift13168275 +Ref: 43a713168275 +Ref: c-api/number c PyNumber_And13168612 +Ref: 438f13168612 +Ref: c-api/number c PyNumber_Xor13168942 +Ref: 43aa13168942 +Ref: c-api/number c PyNumber_Or13169280 +Ref: 43a313169280 +Ref: c-api/number c PyNumber_InPlaceAdd13169608 +Ref: 439313169608 +Ref: c-api/number c PyNumber_InPlaceSubtract13169986 +Ref: 439c13169986 +Ref: c-api/number c PyNumber_InPlaceMultiply13170376 +Ref: 439713170376 +Ref: c-api/number c PyNumber_InPlaceMatrixMultiply13170765 +Ref: b4413170765 +Ref: c-api/number c PyNumber_InPlaceFloorDivide13171223 +Ref: 439513171223 +Ref: c-api/number c PyNumber_InPlaceTrueDivide13171629 +Ref: 439d13171629 +Ref: c-api/number c PyNumber_InPlaceRemainder13172313 +Ref: 439a13172313 +Ref: c-api/number c PyNumber_InPlacePower13172701 +Ref: 439913172701 +Ref: c-api/number c PyNumber_InPlaceLshift13173351 +Ref: 439613173351 +Ref: c-api/number c PyNumber_InPlaceRshift13173756 +Ref: 439b13173756 +Ref: c-api/number c PyNumber_InPlaceAnd13174162 +Ref: 439413174162 +Ref: c-api/number c PyNumber_InPlaceXor13174561 +Ref: 439e13174561 +Ref: c-api/number c PyNumber_InPlaceOr13174968 +Ref: 439813174968 +Ref: c-api/number c PyNumber_Long13175365 +Ref: 6b913175365 +Ref: c-api/number c PyNumber_Float13175675 +Ref: 6ba13175675 +Ref: c-api/number c PyNumber_Index13175985 +Ref: 4ba13175985 +Ref: c-api/number c PyNumber_ToBase13176433 +Ref: 13a613176433 +Ref: c-api/number c PyNumber_AsSsize_t13176958 +Ref: 439013176958 +Ref: c-api/number c PyIndex_Check13177767 +Ref: 5e013177767 +Node: Sequence Protocol13178069 +Ref: c-api/sequence doc13178194 +Ref: 44ff13178194 +Ref: c-api/sequence sequence13178194 +Ref: 450013178194 +Ref: c-api/sequence sequence-protocol13178194 +Ref: 450113178194 +Ref: c-api/sequence c PySequence_Check13178243 +Ref: 43cd13178243 +Ref: c-api/sequence c PySequence_Size13178694 +Ref: 149313178694 +Ref: c-api/sequence c PySequence_Length13178763 +Ref: 43d713178763 +Ref: c-api/sequence c PySequence_Concat13179031 +Ref: 43ce13179031 +Ref: c-api/sequence c PySequence_Repeat13179362 +Ref: 43d913179362 +Ref: c-api/sequence c PySequence_InPlaceConcat13179709 +Ref: 43d413179709 +Ref: c-api/sequence c PySequence_InPlaceRepeat13180110 +Ref: 43d513180110 +Ref: c-api/sequence c PySequence_GetItem13180526 +Ref: 149413180526 +Ref: c-api/sequence c PySequence_GetSlice13180827 +Ref: 43d313180827 +Ref: c-api/sequence c PySequence_SetItem13181184 +Ref: 149513181184 +Ref: c-api/sequence c PySequence_DelItem13181722 +Ref: 149613181722 +Ref: c-api/sequence c PySequence_SetSlice13181978 +Ref: 43da13181978 +Ref: c-api/sequence c PySequence_DelSlice13182294 +Ref: 43d113182294 +Ref: c-api/sequence c PySequence_Count13182600 +Ref: 43d013182600 +Ref: c-api/sequence c PySequence_Contains13182974 +Ref: 43cf13182974 +Ref: c-api/sequence c PySequence_Index13183313 +Ref: 43d613183313 +Ref: c-api/sequence c PySequence_List13183618 +Ref: 43d813183618 +Ref: c-api/sequence c PySequence_Tuple13183989 +Ref: 43db13183989 +Ref: c-api/sequence c PySequence_Fast13184452 +Ref: 43d213184452 +Ref: c-api/sequence c PySequence_Fast_GET_SIZE13185196 +Ref: 450313185196 +Ref: c-api/sequence c PySequence_Fast_GET_ITEM13185617 +Ref: 450413185617 +Ref: c-api/sequence c PySequence_Fast_ITEMS13185923 +Ref: 450513185923 +Ref: c-api/sequence c PySequence_ITEM13186349 +Ref: 450613186349 +Node: Mapping Protocol13186720 +Ref: c-api/mapping doc13186847 +Ref: 450713186847 +Ref: c-api/mapping mapping13186847 +Ref: 450813186847 +Ref: c-api/mapping mapping-protocol13186847 +Ref: 450913186847 +Ref: c-api/mapping c PyMapping_Check13187004 +Ref: 437613187004 +Ref: c-api/mapping c PyMapping_Size13187428 +Ref: 149713187428 +Ref: c-api/mapping c PyMapping_Length13187496 +Ref: 437a13187496 +Ref: c-api/mapping c PyMapping_GetItemString13187758 +Ref: 437713187758 +Ref: c-api/mapping c PyMapping_SetItemString13188139 +Ref: 437b13188139 +Ref: c-api/mapping c PyMapping_DelItem13188545 +Ref: 450a13188545 +Ref: c-api/mapping c PyMapping_DelItemString13188833 +Ref: 450b13188833 +Ref: c-api/mapping c PyMapping_HasKey13189086 +Ref: 437813189086 +Ref: c-api/mapping c PyMapping_HasKeyString13189562 +Ref: 437913189562 +Ref: c-api/mapping c PyMapping_Keys13190106 +Ref: 81f13190106 +Ref: c-api/mapping c PyMapping_Values13190432 +Ref: 82013190432 +Ref: c-api/mapping c PyMapping_Items13190762 +Ref: 82113190762 +Node: Iterator Protocol13191151 +Ref: c-api/iter doc13191276 +Ref: 450c13191276 +Ref: c-api/iter iterator13191276 +Ref: 450d13191276 +Ref: c-api/iter iterator-protocol13191276 +Ref: 450e13191276 +Ref: c-api/iter c PyIter_Check13191391 +Ref: 12fa13191391 +Ref: c-api/iter c PyAIter_Check13191657 +Ref: 42e213191657 +Ref: c-api/iter c PyIter_Next13191939 +Ref: 436213191939 +Ref: c-api/iter c PySendResult13193000 +Ref: 450f13193000 +Ref: c-api/iter c PyIter_Send13193149 +Ref: 4c113193149 +Node: Buffer Protocol13193732 +Ref: c-api/buffer doc13193860 +Ref: 451013193860 +Ref: c-api/buffer buffer-protocol13193860 +Ref: 451113193860 +Ref: c-api/buffer bufferobjects13193860 +Ref: 1ba613193860 +Node: Buffer structure13196382 +Ref: c-api/buffer buffer-structure13196479 +Ref: 451313196479 +Ref: c-api/buffer id113196479 +Ref: 451413196479 +Ref: c-api/buffer c Py_buffer13197554 +Ref: 32713197554 +Ref: c-api/buffer c Py_buffer buf13197672 +Ref: 451613197672 +Ref: c-api/buffer c Py_buffer obj13198134 +Ref: 451813198134 +Ref: c-api/buffer c Py_buffer len13198729 +Ref: 451913198729 +Ref: c-api/buffer c Py_buffer readonly13199341 +Ref: 451c13199341 +Ref: c-api/buffer c Py_buffer itemsize13199511 +Ref: 451d13199511 +Ref: c-api/buffer c Py_buffer format13200440 +Ref: 451e13200440 +Ref: c-api/buffer c Py_buffer ndim13200767 +Ref: 452113200767 +Ref: c-api/buffer c Py_buffer shape13201365 +Ref: 452013201365 +Ref: c-api/buffer c Py_buffer strides13201930 +Ref: 451713201930 +Ref: c-api/buffer c Py_buffer suboffsets13202468 +Ref: 452213202468 +Ref: c-api/buffer c Py_buffer internal13203372 +Ref: 452413203372 +Node: Buffer request types13203747 +Ref: c-api/buffer buffer-request-types13203867 +Ref: 452513203867 +Ref: c-api/buffer id213203867 +Ref: 452613203867 +Node: request-independent fields13204475 +Ref: c-api/buffer request-independent-fields13204582 +Ref: 452713204582 +Node: readonly format13204850 +Ref: c-api/buffer readonly-format13204990 +Ref: 452813204990 +Ref: c-api/buffer c PyBUF_WRITABLE13205041 +Ref: 451b13205041 +Ref: c-api/buffer c PyBUF_FORMAT13205374 +Ref: 451f13205374 +Node: shape strides suboffsets13205955 +Ref: c-api/buffer shape-strides-suboffsets13206088 +Ref: 452913206088 +Ref: c-api/buffer c PyBUF_INDIRECT13206625 +Ref: 452a13206625 +Ref: c-api/buffer c PyBUF_STRIDES13206816 +Ref: 452b13206816 +Ref: c-api/buffer c PyBUF_ND13206998 +Ref: 452c13206998 +Ref: c-api/buffer c PyBUF_SIMPLE13207189 +Ref: 451a13207189 +Node: contiguity requests13207291 +Ref: c-api/buffer contiguity-requests13207426 +Ref: 452d13207426 +Ref: c-api/buffer c PyBUF_C_CONTIGUOUS13208035 +Ref: 452e13208035 +Ref: c-api/buffer c PyBUF_F_CONTIGUOUS13208288 +Ref: 452f13208288 +Ref: c-api/buffer c PyBUF_ANY_CONTIGUOUS13208543 +Ref: 453013208543 +Node: compound requests13208938 +Ref: c-api/buffer compound-requests13209040 +Ref: 453113209040 +Ref: c-api/buffer c PyBUF_FULL13209914 +Ref: 453213209914 +Ref: c-api/buffer c PyBUF_FULL_RO13210244 +Ref: 453313210244 +Ref: c-api/buffer c PyBUF_RECORDS13210571 +Ref: 453413210571 +Ref: c-api/buffer c PyBUF_RECORDS_RO13210901 +Ref: 453513210901 +Ref: c-api/buffer c PyBUF_STRIDED13211225 +Ref: 453613211225 +Ref: c-api/buffer c PyBUF_STRIDED_RO13211556 +Ref: 453713211556 +Ref: c-api/buffer c PyBUF_CONTIG13211880 +Ref: 453813211880 +Ref: c-api/buffer c PyBUF_CONTIG_RO13212211 +Ref: 453913212211 +Node: Complex arrays13212404 +Ref: c-api/buffer complex-arrays13212532 +Ref: 452313212532 +Node: NumPy-style shape and strides13212738 +Ref: c-api/buffer numpy-style-shape-and-strides13212865 +Ref: 453a13212865 +Node: PIL-style shape strides and suboffsets13214745 +Ref: c-api/buffer pil-style-shape-strides-and-suboffsets13214872 +Ref: 453b13214872 +Node: Buffer-related functions13216098 +Ref: c-api/buffer buffer-related-functions13216197 +Ref: 453c13216197 +Ref: c-api/buffer c PyObject_CheckBuffer13216266 +Ref: 32813216266 +Ref: c-api/buffer c PyObject_GetBuffer13216610 +Ref: 32913216610 +Ref: c-api/buffer c PyBuffer_Release13217620 +Ref: 33113217620 +Ref: c-api/buffer c PyBuffer_SizeFromFormat13218064 +Ref: 32b13218064 +Ref: c-api/buffer c PyBuffer_IsContiguous13218370 +Ref: 32e13218370 +Ref: c-api/buffer c PyBuffer_GetPointer13218789 +Ref: 32a13218789 +Ref: c-api/buffer c PyBuffer_FromContiguous13219102 +Ref: 32d13219102 +Ref: c-api/buffer c PyBuffer_ToContiguous13219485 +Ref: 32c13219485 +Ref: c-api/buffer c PyObject_CopyData13219963 +Ref: 43b813219963 +Ref: c-api/buffer c PyBuffer_FillContiguousStrides13220265 +Ref: 32f13220265 +Ref: c-api/buffer c PyBuffer_FillInfo13220716 +Ref: 33013220716 +Node: Old Buffer Protocol13221746 +Ref: c-api/objbuffer doc13221848 +Ref: 453d13221848 +Ref: c-api/objbuffer old-buffer-protocol13221848 +Ref: 453e13221848 +Ref: c-api/objbuffer c PyObject_AsCharBuffer13222610 +Ref: 43b113222610 +Ref: c-api/objbuffer c PyObject_AsReadBuffer13223122 +Ref: 43b313223122 +Ref: c-api/objbuffer c PyObject_CheckReadBuffer13223626 +Ref: 43b713223626 +Ref: c-api/objbuffer c PyObject_AsWriteBuffer13224114 +Ref: 43b413224114 +Node: Concrete Objects Layer13224589 +Ref: c-api/concrete doc13224756 +Ref: 453f13224756 +Ref: c-api/concrete concrete13224756 +Ref: 454013224756 +Ref: c-api/concrete concrete-objects-layer13224756 +Ref: 454113224756 +Node: Fundamental Objects13225741 +Ref: c-api/concrete fundamental13225843 +Ref: 454313225843 +Ref: c-api/concrete fundamental-objects13225843 +Ref: 454413225843 +Node: Type Objects<2>13226040 +Ref: c-api/type doc13226135 +Ref: 454513226135 +Ref: c-api/type type-objects13226135 +Ref: 454613226135 +Ref: c-api/type typeobjects13226135 +Ref: 454713226135 +Ref: c-api/type c PyTypeObject13226178 +Ref: 70113226178 +Ref: c-api/type c PyType_Type13226346 +Ref: 440a13226346 +Ref: c-api/type c PyType_Check13226559 +Ref: 13bb13226559 +Ref: c-api/type c PyType_CheckExact13226805 +Ref: 13bc13226805 +Ref: c-api/type c PyType_ClearCache13227034 +Ref: 440513227034 +Ref: c-api/type c PyType_GetFlags13227200 +Ref: 136713227200 +Ref: c-api/type c PyType_Modified13227732 +Ref: 440713227732 +Ref: c-api/type c PyType_HasFeature13228032 +Ref: 136613228032 +Ref: c-api/type c PyType_IS_GC13228227 +Ref: 454813228227 +Ref: c-api/type c PyType_IsSubtype13228418 +Ref: 440613228418 +Ref: c-api/type c PyType_GenericAlloc13228821 +Ref: 6bd13228821 +Ref: c-api/type c PyType_GenericNew13229215 +Ref: 426113229215 +Ref: c-api/type c PyType_Ready13229562 +Ref: 35013229562 +Ref: c-api/type c PyType_GetName13230456 +Ref: 32113230456 +Ref: c-api/type c PyType_GetQualName13230761 +Ref: 32213230761 +Ref: c-api/type c PyType_GetSlot13231084 +Ref: 4c913231084 +Ref: c-api/type c PyType_GetModule13231770 +Ref: 5c213231770 +Ref: c-api/type c PyType_GetModuleState13232720 +Ref: 5c313232720 +Ref: c-api/type c PyType_GetModuleByDef13233310 +Ref: 33513233310 +Node: Creating Heap-Allocated Types13234040 +Ref: c-api/type creating-heap-allocated-types13234121 +Ref: 454a13234121 +Ref: c-api/type c PyType_FromModuleAndSpec13234277 +Ref: 4c813234277 +Ref: c-api/type c PyType_FromSpecWithBases13235587 +Ref: 4c713235587 +Ref: c-api/type c PyType_FromSpec13235893 +Ref: 5b813235893 +Ref: c-api/type c PyType_Spec13236116 +Ref: 440913236116 +Ref: c-api/type c PyType_Spec PyType_Spec name13236259 +Ref: 454c13236259 +Ref: c-api/type c PyType_Spec PyType_Spec basicsize13236393 +Ref: 454d13236393 +Ref: c-api/type c PyType_Spec PyType_Spec itemsize13236439 +Ref: 454e13236439 +Ref: c-api/type c PyType_Spec PyType_Spec flags13236638 +Ref: 454f13236638 +Ref: c-api/type c PyType_Spec PyType_Spec slots13236883 +Ref: 455013236883 +Ref: c-api/type c PyType_Slot13237069 +Ref: 440813237069 +Ref: c-api/type c PyType_Slot PyType_Slot slot13237272 +Ref: 455113237272 +Ref: c-api/type c PyType_Slot PyType_Slot pfunc13239174 +Ref: 455d13239174 +Node: The None Object13239386 +Ref: c-api/none doc13239481 +Ref: 455e13239481 +Ref: c-api/none noneobject13239481 +Ref: 455f13239481 +Ref: c-api/none the-none-object13239481 +Ref: 456013239481 +Ref: c-api/none c Py_None13239800 +Ref: 423113239800 +Ref: c-api/none c Py_RETURN_NONE13240031 +Ref: 10d413240031 +Node: Numeric Objects13240218 +Ref: c-api/concrete numeric-objects13240345 +Ref: 456113240345 +Ref: c-api/concrete numericobjects13240345 +Ref: 456213240345 +Node: Integer Objects13240534 +Ref: c-api/long doc13240625 +Ref: 456313240625 +Ref: c-api/long integer-objects13240625 +Ref: 456413240625 +Ref: c-api/long longobjects13240625 +Ref: 456513240625 +Ref: c-api/long c PyLongObject13240917 +Ref: 436a13240917 +Ref: c-api/long c PyLong_Type13241094 +Ref: 437513241094 +Ref: c-api/long c PyLong_Check13241345 +Ref: 456613241345 +Ref: c-api/long c PyLong_CheckExact13241542 +Ref: 456713241542 +Ref: c-api/long c PyLong_FromLong13241749 +Ref: 122c13241749 +Ref: c-api/long c PyLong_FromUnsignedLong13242212 +Ref: 13e213242212 +Ref: c-api/long c PyLong_FromSsize_t13242484 +Ref: 437213242484 +Ref: c-api/long c PyLong_FromSize_t13242746 +Ref: 13e413242746 +Ref: c-api/long c PyLong_FromLongLong13242994 +Ref: 122d13242994 +Ref: c-api/long c PyLong_FromUnsignedLongLong13243244 +Ref: 13e313243244 +Ref: c-api/long c PyLong_FromDouble13243530 +Ref: 58a13243530 +Ref: c-api/long c PyLong_FromString13243785 +Ref: 437313243785 +Ref: c-api/long c PyLong_FromUnicodeObject13244703 +Ref: 4f713244703 +Ref: c-api/long c PyLong_FromVoidPtr13244951 +Ref: 437413244951 +Ref: c-api/long c PyLong_AsLong13245254 +Ref: 6b713245254 +Ref: c-api/long c PyLong_AsLongAndOverflow13245897 +Ref: f2113245897 +Ref: c-api/long c PyLong_AsLongLong13246788 +Ref: 436c13246788 +Ref: c-api/long c PyLong_AsLongLongAndOverflow13247450 +Ref: f2013247450 +Ref: c-api/long c PyLong_AsSsize_t13248383 +Ref: 436e13248383 +Ref: c-api/long c PyLong_AsUnsignedLong13248846 +Ref: 436f13248846 +Ref: c-api/long c PyLong_AsSize_t13249294 +Ref: 436d13249294 +Ref: c-api/long c PyLong_AsUnsignedLongLong13249720 +Ref: f4313249720 +Ref: c-api/long c PyLong_AsUnsignedLongMask13250321 +Ref: 437013250321 +Ref: c-api/long c PyLong_AsUnsignedLongLongMask13251050 +Ref: 140e13251050 +Ref: c-api/long c PyLong_AsDouble13251814 +Ref: 436b13251814 +Ref: c-api/long c PyLong_AsVoidPtr13252222 +Ref: 437113252222 +Node: Boolean Objects13252684 +Ref: c-api/bool doc13252806 +Ref: 456813252806 +Ref: c-api/bool boolean-objects13252806 +Ref: 456913252806 +Ref: c-api/bool boolobjects13252806 +Ref: 456a13252806 +Ref: c-api/bool c PyBool_Check13253108 +Ref: 456b13253108 +Ref: c-api/bool c Py_False13253248 +Ref: 456c13253248 +Ref: c-api/bool c Py_True13253457 +Ref: 456d13253457 +Ref: c-api/bool c Py_RETURN_FALSE13253664 +Ref: 10d613253664 +Ref: c-api/bool c Py_RETURN_TRUE13253787 +Ref: 10d513253787 +Ref: c-api/bool c PyBool_FromLong13253908 +Ref: 42e513253908 +Node: Floating Point Objects13254152 +Ref: c-api/float doc13254273 +Ref: 456e13254273 +Ref: c-api/float floating-point-objects13254273 +Ref: 456f13254273 +Ref: c-api/float floatobjects13254273 +Ref: 457013254273 +Ref: c-api/float c PyFloatObject13254336 +Ref: 457113254336 +Ref: c-api/float c PyFloat_Type13254459 +Ref: 435013254459 +Ref: c-api/float c PyFloat_Check13254720 +Ref: 457213254720 +Ref: c-api/float c PyFloat_CheckExact13254920 +Ref: 457313254920 +Ref: c-api/float c PyFloat_FromString13255130 +Ref: 434f13255130 +Ref: c-api/float c PyFloat_FromDouble13255394 +Ref: 434e13255394 +Ref: c-api/float c PyFloat_AsDouble13255627 +Ref: 6bb13255627 +Ref: c-api/float c PyFloat_AS_DOUBLE13256240 +Ref: 457413256240 +Ref: c-api/float c PyFloat_GetInfo13256404 +Ref: 105713256404 +Ref: c-api/float c PyFloat_GetMax13256732 +Ref: 105513256732 +Ref: c-api/float c PyFloat_GetMin13256892 +Ref: 105613256892 +Node: Pack and Unpack functions13257091 +Ref: c-api/float pack-and-unpack-functions13257175 +Ref: 457513257175 +Node: Pack functions13258424 +Ref: c-api/float pack-functions13258546 +Ref: 457613258546 +Ref: c-api/float c PyFloat_Pack213259320 +Ref: 33713259320 +Ref: c-api/float c PyFloat_Pack413259462 +Ref: 33813259462 +Ref: c-api/float c PyFloat_Pack813259606 +Ref: 33913259606 +Node: Unpack functions13259750 +Ref: c-api/float unpack-functions13259872 +Ref: 457713259872 +Ref: c-api/float c PyFloat_Unpack213260623 +Ref: 33a13260623 +Ref: c-api/float c PyFloat_Unpack413260768 +Ref: 33b13260768 +Ref: c-api/float c PyFloat_Unpack813260915 +Ref: 33c13260915 +Node: Complex Number Objects13261062 +Ref: c-api/complex doc13261161 +Ref: 457813261161 +Ref: c-api/complex complex-number-objects13261161 +Ref: 457913261161 +Ref: c-api/complex complexobjects13261161 +Ref: 457a13261161 +Node: Complex Numbers as C Structures13261594 +Ref: c-api/complex complex-numbers-as-c-structures13261726 +Ref: 457b13261726 +Ref: c-api/complex c Py_complex13262009 +Ref: 44cc13262009 +Ref: c-api/complex c _Py_c_sum13262406 +Ref: 457c13262406 +Ref: c-api/complex c _Py_c_diff13262605 +Ref: 457d13262605 +Ref: c-api/complex c _Py_c_neg13262817 +Ref: 457e13262817 +Ref: c-api/complex c _Py_c_prod13262997 +Ref: 457f13262997 +Ref: c-api/complex c _Py_c_quot13263201 +Ref: 458013263201 +Ref: c-api/complex c _Py_c_pow13263506 +Ref: 458113263506 +Node: Complex Numbers as Python Objects13263838 +Ref: c-api/complex complex-numbers-as-python-objects13263970 +Ref: 458213263970 +Ref: c-api/complex c PyComplexObject13264055 +Ref: 458313264055 +Ref: c-api/complex c PyComplex_Type13264180 +Ref: 431413264180 +Ref: c-api/complex c PyComplex_Check13264443 +Ref: 458413264443 +Ref: c-api/complex c PyComplex_CheckExact13264649 +Ref: 458513264649 +Ref: c-api/complex c PyComplex_FromCComplex13264865 +Ref: 458613264865 +Ref: c-api/complex c PyComplex_FromDoubles13265076 +Ref: 431113265076 +Ref: c-api/complex c PyComplex_RealAsDouble13265332 +Ref: 431313265332 +Ref: c-api/complex c PyComplex_ImagAsDouble13265487 +Ref: 431213265487 +Ref: c-api/complex c PyComplex_AsCComplex13265647 +Ref: 105813265647 +Node: Sequence Objects13266300 +Ref: c-api/concrete sequence-objects13266425 +Ref: 458713266425 +Ref: c-api/concrete sequenceobjects13266425 +Ref: 458813266425 +Node: Bytes Objects<2>13266820 +Ref: c-api/bytes doc13266916 +Ref: 458913266916 +Ref: c-api/bytes bytes-objects13266916 +Ref: 458a13266916 +Ref: c-api/bytes bytesobjects13266916 +Ref: 458b13266916 +Ref: c-api/bytes c PyBytesObject13267078 +Ref: 37213267078 +Ref: c-api/bytes c PyBytes_Type13267192 +Ref: 42f213267192 +Ref: c-api/bytes c PyBytes_Check13267441 +Ref: 102513267441 +Ref: c-api/bytes c PyBytes_CheckExact13267628 +Ref: 458c13267628 +Ref: c-api/bytes c PyBytes_FromString13267831 +Ref: 42f013267831 +Ref: c-api/bytes c PyBytes_FromStringAndSize13268166 +Ref: 102613268166 +Ref: c-api/bytes c PyBytes_FromFormat13268559 +Ref: 145b13268559 +Ref: c-api/bytes c PyBytes_FromFormatV13272471 +Ref: 42ee13272471 +Ref: c-api/bytes c PyBytes_FromObject13272752 +Ref: 42ef13272752 +Ref: c-api/bytes c PyBytes_Size13272992 +Ref: 42f113272992 +Ref: c-api/bytes c PyBytes_GET_SIZE13273160 +Ref: 458d13273160 +Ref: c-api/bytes c PyBytes_AsString13273304 +Ref: 4ae13273304 +Ref: c-api/bytes c PyBytes_AS_STRING13273954 +Ref: 458e13273954 +Ref: c-api/bytes c PyBytes_AsStringAndSize13274095 +Ref: 42eb13274095 +Ref: c-api/bytes c PyBytes_Concat13275140 +Ref: 42ec13275140 +Ref: c-api/bytes c PyBytes_ConcatAndDel13275676 +Ref: 42ed13275676 +Ref: c-api/bytes c _PyBytes_Resize13275975 +Ref: 149013275975 +Ref: Bytes Objects<2>-Footnote-113276860 +Ref: Bytes Objects<2>-Footnote-213276986 +Ref: Bytes Objects<2>-Footnote-313277112 +Ref: Bytes Objects<2>-Footnote-413277238 +Ref: Bytes Objects<2>-Footnote-513277364 +Ref: Bytes Objects<2>-Footnote-613277490 +Ref: Bytes Objects<2>-Footnote-713277616 +Ref: Bytes Objects<2>-Footnote-813277742 +Node: Byte Array Objects13277868 +Ref: c-api/bytearray doc13277999 +Ref: 458f13277999 +Ref: c-api/bytearray byte-array-objects13277999 +Ref: 459013277999 +Ref: c-api/bytearray bytearrayobjects13277999 +Ref: 459113277999 +Ref: c-api/bytearray c PyByteArrayObject13278054 +Ref: 459213278054 +Ref: c-api/bytearray c PyByteArray_Type13278176 +Ref: 42ea13278176 +Node: Type check macros13278505 +Ref: c-api/bytearray type-check-macros13278606 +Ref: 459313278606 +Ref: c-api/bytearray c PyByteArray_Check13278659 +Ref: 459413278659 +Ref: c-api/bytearray c PyByteArray_CheckExact13278858 +Ref: 459513278858 +Node: Direct API functions13279073 +Ref: c-api/bytearray direct-api-functions13279189 +Ref: 459613279189 +Ref: c-api/bytearray c PyByteArray_FromObject13279248 +Ref: 102713279248 +Ref: c-api/bytearray c PyByteArray_FromStringAndSize13279520 +Ref: 102813279520 +Ref: c-api/bytearray c PyByteArray_Concat13279825 +Ref: 42e713279825 +Ref: c-api/bytearray c PyByteArray_Size13280079 +Ref: 42e913280079 +Ref: c-api/bytearray c PyByteArray_AsString13280289 +Ref: 42e613280289 +Ref: c-api/bytearray c PyByteArray_Resize13280560 +Ref: 42e813280560 +Node: Macros13280749 +Ref: c-api/bytearray macros13280839 +Ref: 459713280839 +Ref: c-api/bytearray c PyByteArray_AS_STRING13280940 +Ref: 459813280940 +Ref: c-api/bytearray c PyByteArray_GET_SIZE13281093 +Ref: 459913281093 +Node: Unicode Objects and Codecs13281268 +Ref: c-api/unicode doc13281396 +Ref: e5413281396 +Ref: c-api/unicode unicode-objects-and-codecs13281396 +Ref: 459a13281396 +Ref: c-api/unicode unicodeobjects13281396 +Ref: 459b13281396 +Node: Unicode Objects13281548 +Ref: c-api/unicode unicode-objects13281650 +Ref: 459c13281650 +Ref: Unicode Objects-Footnote-113283331 +Ref: Unicode Objects-Footnote-213283373 +Node: Unicode Type13283415 +Ref: c-api/unicode unicode-type13283516 +Ref: 459d13283516 +Ref: c-api/unicode c Py_UCS413283648 +Ref: e2913283648 +Ref: c-api/unicode c Py_UCS213283673 +Ref: e2813283673 +Ref: c-api/unicode c Py_UCS113283698 +Ref: e2713283698 +Ref: c-api/unicode c Py_UNICODE13284011 +Ref: 38813284011 +Ref: c-api/unicode c PyASCIIObject13284352 +Ref: e2a13284352 +Ref: c-api/unicode c PyCompactUnicodeObject13284383 +Ref: e2b13284383 +Ref: c-api/unicode c PyUnicodeObject13284423 +Ref: 37f13284423 +Ref: c-api/unicode c PyUnicode_Type13284737 +Ref: 444713284737 +Ref: c-api/unicode c PyUnicode_Check13285106 +Ref: 459e13285106 +Ref: c-api/unicode c PyUnicode_CheckExact13285287 +Ref: 459f13285287 +Ref: c-api/unicode c PyUnicode_READY13285471 +Ref: 37d13285471 +Ref: c-api/unicode c PyUnicode_GET_LENGTH13285989 +Ref: 4f013285989 +Ref: c-api/unicode c PyUnicode_1BYTE_DATA13286258 +Ref: e2f13286258 +Ref: c-api/unicode c PyUnicode_2BYTE_DATA13286330 +Ref: e3013286330 +Ref: c-api/unicode c PyUnicode_4BYTE_DATA13286402 +Ref: e3113286402 +Ref: c-api/unicode c PyUnicode_WCHAR_KIND13286879 +Ref: 37e13286879 +Ref: c-api/unicode c PyUnicode_1BYTE_KIND13286913 +Ref: e3313286913 +Ref: c-api/unicode c PyUnicode_2BYTE_KIND13286947 +Ref: e3413286947 +Ref: c-api/unicode c PyUnicode_4BYTE_KIND13286981 +Ref: e3513286981 +Ref: c-api/unicode c PyUnicode_KIND13287222 +Ref: e3213287222 +Ref: c-api/unicode c PyUnicode_DATA13287546 +Ref: e2e13287546 +Ref: c-api/unicode c PyUnicode_WRITE13287769 +Ref: e3813287769 +Ref: c-api/unicode c PyUnicode_READ13288330 +Ref: e3613288330 +Ref: c-api/unicode c PyUnicode_READ_CHAR13288622 +Ref: e3713288622 +Ref: c-api/unicode c PyUnicode_MAX_CHAR_VALUE13288956 +Ref: e3913288956 +Ref: c-api/unicode c PyUnicode_GET_SIZE13289315 +Ref: 37b13289315 +Ref: c-api/unicode c PyUnicode_GET_DATA_SIZE13289755 +Ref: 37a13289755 +Ref: c-api/unicode c PyUnicode_AS_UNICODE13290161 +Ref: 37613290161 +Ref: c-api/unicode c PyUnicode_AS_DATA13290246 +Ref: 37513290246 +Ref: c-api/unicode c PyUnicode_IsIdentifier13291313 +Ref: 13ba13291313 +Node: Unicode Character Properties13291713 +Ref: c-api/unicode unicode-character-properties13291861 +Ref: 45a013291861 +Ref: c-api/unicode c Py_UNICODE_ISSPACE13292125 +Ref: 130b13292125 +Ref: c-api/unicode c Py_UNICODE_ISLOWER13292268 +Ref: 45a113292268 +Ref: c-api/unicode c Py_UNICODE_ISUPPER13292410 +Ref: 45a213292410 +Ref: c-api/unicode c Py_UNICODE_ISTITLE13292553 +Ref: 45a313292553 +Ref: c-api/unicode c Py_UNICODE_ISLINEBREAK13292695 +Ref: 45a413292695 +Ref: c-api/unicode c Py_UNICODE_ISDECIMAL13292841 +Ref: 45a513292841 +Ref: c-api/unicode c Py_UNICODE_ISDIGIT13292978 +Ref: 45a613292978 +Ref: c-api/unicode c Py_UNICODE_ISNUMERIC13293111 +Ref: 45a713293111 +Ref: c-api/unicode c Py_UNICODE_ISALPHA13293248 +Ref: 45a813293248 +Ref: c-api/unicode c Py_UNICODE_ISALNUM13293392 +Ref: 45a913293392 +Ref: c-api/unicode c Py_UNICODE_ISPRINTABLE13293538 +Ref: 45aa13293538 +Ref: c-api/unicode c Py_UNICODE_TOLOWER13294206 +Ref: 45ab13294206 +Ref: c-api/unicode c Py_UNICODE_TOUPPER13294414 +Ref: 45ac13294414 +Ref: c-api/unicode c Py_UNICODE_TOTITLE13294622 +Ref: 45ad13294622 +Ref: c-api/unicode c Py_UNICODE_TODECIMAL13294830 +Ref: 45ae13294830 +Ref: c-api/unicode c Py_UNICODE_TODIGIT13295048 +Ref: 45af13295048 +Ref: c-api/unicode c Py_UNICODE_TONUMERIC13295260 +Ref: 45b013295260 +Ref: c-api/unicode c Py_UNICODE_IS_SURROGATE13295510 +Ref: 45b113295510 +Ref: c-api/unicode c Py_UNICODE_IS_HIGH_SURROGATE13295620 +Ref: 45b213295620 +Ref: c-api/unicode c Py_UNICODE_IS_LOW_SURROGATE13295740 +Ref: 45b313295740 +Ref: c-api/unicode c Py_UNICODE_JOIN_SURROGATES13295858 +Ref: 45b413295858 +Node: Creating and accessing Unicode strings13296083 +Ref: c-api/unicode creating-and-accessing-unicode-strings13296245 +Ref: 45b513296245 +Ref: c-api/unicode c PyUnicode_New13296429 +Ref: 4e013296429 +Ref: c-api/unicode c PyUnicode_FromKindAndData13296944 +Ref: e2c13296944 +Ref: c-api/unicode c PyUnicode_FromStringAndSize13297740 +Ref: 444013297740 +Ref: c-api/unicode c PyUnicode_FromString13298465 +Ref: 42ad13298465 +Ref: c-api/unicode c PyUnicode_FromFormat13298714 +Ref: 4f213298714 +Ref: c-api/unicode c PyUnicode_FromFormatV13306029 +Ref: 443e13306029 +Ref: c-api/unicode c PyUnicode_FromEncodedObject13306313 +Ref: 443d13306313 +Ref: c-api/unicode c PyUnicode_GetLength13307125 +Ref: 4ef13307125 +Ref: c-api/unicode c PyUnicode_CopyCharacters13307366 +Ref: 4f113307366 +Ref: c-api/unicode c PyUnicode_Fill13307855 +Ref: e4213307855 +Ref: c-api/unicode c PyUnicode_WriteChar13308356 +Ref: e2613308356 +Ref: c-api/unicode c PyUnicode_ReadChar13308981 +Ref: e2513308981 +Ref: c-api/unicode c PyUnicode_Substring13309397 +Ref: 4f313309397 +Ref: c-api/unicode c PyUnicode_AsUCS413309793 +Ref: e2d13309793 +Ref: c-api/unicode c PyUnicode_AsUCS4Copy13310298 +Ref: 4f813310298 +Ref: Creating and accessing Unicode strings-Footnote-113310753 +Ref: Creating and accessing Unicode strings-Footnote-213310902 +Ref: Creating and accessing Unicode strings-Footnote-313311051 +Ref: Creating and accessing Unicode strings-Footnote-413311200 +Ref: Creating and accessing Unicode strings-Footnote-513311349 +Ref: Creating and accessing Unicode strings-Footnote-613311498 +Ref: Creating and accessing Unicode strings-Footnote-713311647 +Ref: Creating and accessing Unicode strings-Footnote-813311796 +Ref: Creating and accessing Unicode strings-Footnote-913311945 +Ref: Creating and accessing Unicode strings-Footnote-1013312094 +Ref: Creating and accessing Unicode strings-Footnote-1113312244 +Ref: Creating and accessing Unicode strings-Footnote-1213312394 +Ref: Creating and accessing Unicode strings-Footnote-1313312544 +Node: Deprecated Py_UNICODE APIs13312694 +Ref: c-api/unicode deprecated-py-unicode-apis13312843 +Ref: 45b713312843 +Ref: c-api/unicode c PyUnicode_FromUnicode13313221 +Ref: 37913313221 +Ref: c-api/unicode c PyUnicode_AsUnicode13314279 +Ref: 37813314279 +Ref: c-api/unicode c PyUnicode_AsUnicodeAndSize13315129 +Ref: 37713315129 +Ref: c-api/unicode c PyUnicode_GetSize13315877 +Ref: 37c13315877 +Ref: c-api/unicode c PyUnicode_FromObject13316323 +Ref: 443f13316323 +Ref: Deprecated Py_UNICODE APIs-Footnote-113316813 +Node: Locale Encoding13316855 +Ref: c-api/unicode locale-encoding13316986 +Ref: 45b813316986 +Ref: c-api/unicode c PyUnicode_DecodeLocaleAndSize13317120 +Ref: 82f13317120 +Ref: c-api/unicode c PyUnicode_DecodeLocale13318383 +Ref: 442e13318383 +Ref: c-api/unicode c PyUnicode_EncodeLocale13318735 +Ref: 83013318735 +Ref: Locale Encoding-Footnote-113320013 +Ref: Locale Encoding-Footnote-213320055 +Node: File System Encoding13320097 +Ref: c-api/unicode file-system-encoding13320217 +Ref: 45b913320217 +Ref: c-api/unicode c PyUnicode_FSConverter13320699 +Ref: 98b13320699 +Ref: c-api/unicode c PyUnicode_FSDecoder13321451 +Ref: 98c13321451 +Ref: c-api/unicode c PyUnicode_DecodeFSDefaultAndSize13322054 +Ref: 442c13322054 +Ref: c-api/unicode c PyUnicode_DecodeFSDefault13322848 +Ref: 442b13322848 +Ref: c-api/unicode c PyUnicode_EncodeFSDefault13323398 +Ref: 149113323398 +Ref: File System Encoding-Footnote-113324387 +Ref: File System Encoding-Footnote-213324429 +Node: wchar_t Support13324471 +Ref: c-api/unicode wchar-t-support13324567 +Ref: 45ba13324567 +Ref: c-api/unicode c PyUnicode_FromWideChar13324667 +Ref: e4113324667 +Ref: c-api/unicode c PyUnicode_AsWideChar13325080 +Ref: 149813325080 +Ref: c-api/unicode c PyUnicode_AsWideCharString13325906 +Ref: 4f913325906 +Node: Built-in Codecs13327026 +Ref: c-api/unicode built-in-codecs13327163 +Ref: 45bb13327163 +Ref: c-api/unicode builtincodecs13327163 +Ref: 45b613327163 +Node: Generic Codecs13328593 +Ref: c-api/unicode generic-codecs13328680 +Ref: 45bc13328680 +Ref: c-api/unicode c PyUnicode_Decode13328764 +Ref: 140b13328764 +Ref: c-api/unicode c PyUnicode_AsEncodedString13329340 +Ref: 442413329340 +Node: UTF-8 Codecs13329901 +Ref: c-api/unicode utf-8-codecs13330010 +Ref: 45bd13330010 +Ref: c-api/unicode c PyUnicode_DecodeUTF813330088 +Ref: 443813330088 +Ref: c-api/unicode c PyUnicode_DecodeUTF8Stateful13330443 +Ref: 443913330443 +Ref: c-api/unicode c PyUnicode_AsUTF8String13331001 +Ref: e4313331001 +Ref: c-api/unicode c PyUnicode_AsUTF8AndSize13331358 +Ref: 4c213331358 +Ref: c-api/unicode c PyUnicode_AsUTF813332561 +Ref: 81e13332561 +Node: UTF-32 Codecs13332835 +Ref: c-api/unicode utf-32-codecs13332943 +Ref: 45be13332943 +Ref: c-api/unicode c PyUnicode_DecodeUTF3213333024 +Ref: 443413333024 +Ref: c-api/unicode c PyUnicode_DecodeUTF32Stateful13334225 +Ref: 443513334225 +Ref: c-api/unicode c PyUnicode_AsUTF32String13334902 +Ref: 442613334902 +Node: UTF-16 Codecs13335301 +Ref: c-api/unicode utf-16-codecs13335409 +Ref: 45bf13335409 +Ref: c-api/unicode c PyUnicode_DecodeUTF1613335490 +Ref: 443213335490 +Ref: c-api/unicode c PyUnicode_DecodeUTF16Stateful13336775 +Ref: 443313336775 +Ref: c-api/unicode c PyUnicode_AsUTF16String13337461 +Ref: 442513337461 +Node: UTF-7 Codecs13337860 +Ref: c-api/unicode utf-7-codecs13337976 +Ref: 45c013337976 +Ref: c-api/unicode c PyUnicode_DecodeUTF713338054 +Ref: 443613338054 +Ref: c-api/unicode c PyUnicode_DecodeUTF7Stateful13338409 +Ref: 443713338409 +Node: Unicode-Escape Codecs13338969 +Ref: c-api/unicode unicode-escape-codecs13339097 +Ref: 45c113339097 +Ref: c-api/unicode c PyUnicode_DecodeUnicodeEscape13339208 +Ref: 443a13339208 +Ref: c-api/unicode c PyUnicode_AsUnicodeEscapeString13339581 +Ref: e4413339581 +Node: Raw-Unicode-Escape Codecs13339951 +Ref: c-api/unicode raw-unicode-escape-codecs13340081 +Ref: 45c213340081 +Ref: c-api/unicode c PyUnicode_DecodeRawUnicodeEscape13340204 +Ref: 443113340204 +Ref: c-api/unicode c PyUnicode_AsRawUnicodeEscapeString13340584 +Ref: e4513340584 +Node: Latin-1 Codecs13340961 +Ref: c-api/unicode latin-1-codecs13341082 +Ref: 45c313341082 +Ref: c-api/unicode c PyUnicode_DecodeLatin113341279 +Ref: 442d13341279 +Ref: c-api/unicode c PyUnicode_AsLatin1String13341638 +Ref: e4613341638 +Node: ASCII Codecs13341999 +Ref: c-api/unicode ascii-codecs13342115 +Ref: 45c413342115 +Ref: c-api/unicode c PyUnicode_DecodeASCII13342263 +Ref: 442913342263 +Ref: c-api/unicode c PyUnicode_AsASCIIString13342619 +Ref: e4713342619 +Node: Character Map Codecs13342977 +Ref: c-api/unicode character-map-codecs13343102 +Ref: 45c513343102 +Ref: c-api/unicode c PyUnicode_DecodeCharmap13343576 +Ref: 442a13343576 +Ref: c-api/unicode c PyUnicode_AsCharmapString13344465 +Ref: 442313344465 +Ref: c-api/unicode c PyUnicode_Translate13345244 +Ref: 444613345244 +Node: MBCS codecs for Windows13346132 +Ref: c-api/unicode mbcs-codecs-for-windows13346260 +Ref: 45c613346260 +Ref: c-api/unicode c PyUnicode_DecodeMBCS13346620 +Ref: 442f13346620 +Ref: c-api/unicode c PyUnicode_DecodeMBCSStateful13347004 +Ref: 443013347004 +Ref: c-api/unicode c PyUnicode_AsMBCSString13347564 +Ref: e4813347564 +Ref: c-api/unicode c PyUnicode_EncodeCodePage13347950 +Ref: e4913347950 +Node: Methods & Slots13348433 +Ref: c-api/unicode methods-slots13348532 +Ref: 45c713348532 +Node: Methods and Slot Functions13348583 +Ref: c-api/unicode methods-and-slot-functions13348696 +Ref: 45c813348696 +Ref: c-api/unicode unicodemethodsandslots13348696 +Ref: 45c913348696 +Ref: c-api/unicode c PyUnicode_Concat13349019 +Ref: e5513349019 +Ref: c-api/unicode c PyUnicode_Split13349247 +Ref: 444413349247 +Ref: c-api/unicode c PyUnicode_Splitlines13349761 +Ref: 444513349761 +Ref: c-api/unicode c PyUnicode_Join13350166 +Ref: e5613350166 +Ref: c-api/unicode c PyUnicode_Tailmatch13350448 +Ref: 4f513350448 +Ref: c-api/unicode c PyUnicode_Find13350899 +Ref: 443b13350899 +Ref: c-api/unicode c PyUnicode_FindChar13351502 +Ref: 4f613351502 +Ref: c-api/unicode c PyUnicode_Count13352265 +Ref: 442813352265 +Ref: c-api/unicode c PyUnicode_Replace13352577 +Ref: 444213352577 +Ref: c-api/unicode c PyUnicode_Compare13352979 +Ref: 4f413352979 +Ref: c-api/unicode c PyUnicode_CompareWithASCIIString13353344 +Ref: f2213353344 +Ref: c-api/unicode c PyUnicode_RichCompare13353838 +Ref: 444313353838 +Ref: c-api/unicode c PyUnicode_Format13354423 +Ref: 443c13354423 +Ref: c-api/unicode c PyUnicode_Contains13354704 +Ref: 442713354704 +Ref: c-api/unicode c PyUnicode_InternInPlace13355047 +Ref: 4ed13355047 +Ref: c-api/unicode c PyUnicode_InternFromString13355865 +Ref: 444113355865 +Node: Tuple Objects13356307 +Ref: c-api/tuple doc13356440 +Ref: 45ca13356440 +Ref: c-api/tuple tuple-objects13356440 +Ref: 45cb13356440 +Ref: c-api/tuple tupleobjects13356440 +Ref: 45cc13356440 +Ref: c-api/tuple c PyTupleObject13356487 +Ref: 44b913356487 +Ref: c-api/tuple c PyTuple_Type13356601 +Ref: 440413356601 +Ref: c-api/tuple c PyTuple_Check13356850 +Ref: 45cd13356850 +Ref: c-api/tuple c PyTuple_CheckExact13357026 +Ref: 45ce13357026 +Ref: c-api/tuple c PyTuple_New13357213 +Ref: 440113357213 +Ref: c-api/tuple c PyTuple_Pack13357433 +Ref: 440213357433 +Ref: c-api/tuple c PyTuple_Size13357841 +Ref: 440313357841 +Ref: c-api/tuple c PyTuple_GET_SIZE13358026 +Ref: 45cf13358026 +Ref: c-api/tuple c PyTuple_GetItem13358225 +Ref: 424713358225 +Ref: c-api/tuple c PyTuple_GET_ITEM13358587 +Ref: 45d013358587 +Ref: c-api/tuple c PyTuple_GetSlice13358805 +Ref: 440013358805 +Ref: c-api/tuple c PyTuple_SetItem13359234 +Ref: 424b13359234 +Ref: c-api/tuple c PyTuple_SET_ITEM13359750 +Ref: 4ea13359750 +Ref: c-api/tuple c _PyTuple_Resize13360237 +Ref: 114613360237 +Node: Struct Sequence Objects13361153 +Ref: c-api/tuple struct-sequence-objects13361272 +Ref: 45d113361272 +Ref: c-api/tuple c PyStructSequence_NewType13361580 +Ref: 43e713361580 +Ref: c-api/tuple c PyStructSequence_InitType13361943 +Ref: ca513361943 +Ref: c-api/tuple c PyStructSequence_InitType213362121 +Ref: ca413362121 +Ref: c-api/tuple c PyStructSequence_Desc13362367 +Ref: 81d13362367 +Ref: c-api/tuple c PyStructSequence_Field13364017 +Ref: 81c13364017 +Ref: c-api/tuple c PyStructSequence_UnnamedField13365190 +Ref: 5d813365190 +Ref: c-api/tuple c PyStructSequence_New13365446 +Ref: 43e613365446 +Ref: c-api/tuple c PyStructSequence_GetItem13365727 +Ref: 43e513365727 +Ref: c-api/tuple c PyStructSequence_GET_ITEM13366033 +Ref: 45d213366033 +Ref: c-api/tuple c PyStructSequence_SetItem13366245 +Ref: 43e813366245 +Ref: c-api/tuple c PyStructSequence_SET_ITEM13366633 +Ref: 45d313366633 +Node: List Objects13366907 +Ref: c-api/list doc13367004 +Ref: 45d413367004 +Ref: c-api/list list-objects13367004 +Ref: 45d513367004 +Ref: c-api/list listobjects13367004 +Ref: 45d613367004 +Ref: c-api/list c PyListObject13367049 +Ref: 450213367049 +Ref: c-api/list c PyList_Type13367161 +Ref: 427113367161 +Ref: c-api/list c PyList_Check13367410 +Ref: 45d713367410 +Ref: c-api/list c PyList_CheckExact13367583 +Ref: 45d813367583 +Ref: c-api/list c PyList_New13367767 +Ref: 42cd13367767 +Ref: c-api/list c PyList_Size13368336 +Ref: 107e13368336 +Ref: c-api/list c PyList_GET_SIZE13368563 +Ref: 45d913368563 +Ref: c-api/list c PyList_GetItem13368708 +Ref: 424813368708 +Ref: c-api/list c PyList_GET_ITEM13369186 +Ref: 42de13369186 +Ref: c-api/list c PyList_SetItem13369398 +Ref: 424c13369398 +Ref: c-api/list c PyList_SET_ITEM13369891 +Ref: 4e913369891 +Ref: c-api/list c PyList_Insert13370410 +Ref: 436613370410 +Ref: c-api/list c PyList_Append13370763 +Ref: 436313370763 +Ref: c-api/list c PyList_GetSlice13371066 +Ref: 436513371066 +Ref: c-api/list c PyList_SetSlice13371511 +Ref: 436813371511 +Ref: c-api/list c PyList_Sort13372021 +Ref: 436913372021 +Ref: c-api/list c PyList_Reverse13372251 +Ref: 436713372251 +Ref: c-api/list c PyList_AsTuple13372494 +Ref: 436413372494 +Node: Container Objects13372749 +Ref: c-api/concrete container-objects13372878 +Ref: 45da13372878 +Ref: c-api/concrete mapobjects13372878 +Ref: 45db13372878 +Node: Dictionary Objects13372976 +Ref: c-api/dict doc13373068 +Ref: 45dc13373068 +Ref: c-api/dict dictionary-objects13373068 +Ref: 45dd13373068 +Ref: c-api/dict dictobjects13373068 +Ref: 45de13373068 +Ref: c-api/dict c PyDictObject13373123 +Ref: 45df13373123 +Ref: c-api/dict c PyDict_Type13373241 +Ref: 432713373241 +Ref: c-api/dict c PyDict_Check13373496 +Ref: 454213373496 +Ref: c-api/dict c PyDict_CheckExact13373669 +Ref: 45e013373669 +Ref: c-api/dict c PyDict_New13373853 +Ref: 432313373853 +Ref: c-api/dict c PyDictProxy_New13374043 +Ref: 431813374043 +Ref: c-api/dict c PyDict_Clear13374434 +Ref: 431913374434 +Ref: c-api/dict c PyDict_Contains13374585 +Ref: 431a13374585 +Ref: c-api/dict c PyDict_Copy13374922 +Ref: 431b13374922 +Ref: c-api/dict c PyDict_SetItem13375143 +Ref: 424d13375143 +Ref: c-api/dict c PyDict_SetItemString13375550 +Ref: 432513375550 +Ref: c-api/dict c PyDict_DelItem13375974 +Ref: 431c13375974 +Ref: c-api/dict c PyDict_DelItemString13376346 +Ref: 431d13376346 +Ref: c-api/dict c PyDict_GetItem13376678 +Ref: 4de13376678 +Ref: c-api/dict c PyDict_GetItemWithError13377371 +Ref: 431e13377371 +Ref: c-api/dict c PyDict_GetItemString13377792 +Ref: 424913377792 +Ref: c-api/dict c PyDict_SetDefault13378358 +Ref: 45e113378358 +Ref: c-api/dict c PyDict_Items13378960 +Ref: 431f13378960 +Ref: c-api/dict c PyDict_Keys13379192 +Ref: 432013379192 +Ref: c-api/dict c PyDict_Values13379422 +Ref: 432913379422 +Ref: c-api/dict c PyDict_Size13379660 +Ref: 432613379660 +Ref: c-api/dict c PyDict_Next13379879 +Ref: 432413379879 +Ref: c-api/dict c PyDict_Merge13381834 +Ref: 432113381834 +Ref: c-api/dict c PyDict_Update13382427 +Ref: 432813382427 +Ref: c-api/dict c PyDict_MergeFromSeq213382890 +Ref: 432213382890 +Node: Set Objects13383616 +Ref: c-api/set doc13383708 +Ref: 45e213383708 +Ref: c-api/set set-objects13383708 +Ref: 45e313383708 +Ref: c-api/set setobjects13383708 +Ref: 45e413383708 +Ref: c-api/set c PySetObject13384484 +Ref: 45e513384484 +Ref: c-api/set c PySet_Type13385125 +Ref: 43de13385125 +Ref: c-api/set c PyFrozenSet_Type13385321 +Ref: 435113385321 +Ref: c-api/set c PySet_Check13385680 +Ref: 45e613385680 +Ref: c-api/set c PyFrozenSet_Check13385846 +Ref: 45e713385846 +Ref: c-api/set c PyAnySet_Check13386024 +Ref: 45e813386024 +Ref: c-api/set c PySet_CheckExact13386231 +Ref: 4ca13386231 +Ref: c-api/set c PyAnySet_CheckExact13386434 +Ref: 45e913386434 +Ref: c-api/set c PyFrozenSet_CheckExact13386652 +Ref: 45ea13386652 +Ref: c-api/set c PySet_New13386840 +Ref: 10aa13386840 +Ref: c-api/set c PyFrozenSet_New13387341 +Ref: 10ab13387341 +Ref: c-api/set c PySet_Size13387942 +Ref: 10af13387942 +Ref: c-api/set c PySet_GET_SIZE13388304 +Ref: 45eb13388304 +Ref: c-api/set c PySet_Contains13388448 +Ref: 10ae13388448 +Ref: c-api/set c PySet_Add13388994 +Ref: 10ac13388994 +Ref: c-api/set c PySet_Discard13389789 +Ref: 10ad13389789 +Ref: c-api/set c PySet_Pop13390389 +Ref: 43dd13390389 +Ref: c-api/set c PySet_Clear13390828 +Ref: 43dc13390828 +Node: Function Objects<2>13390965 +Ref: c-api/concrete function-objects13391091 +Ref: 45ec13391091 +Ref: c-api/concrete otherobjects13391091 +Ref: 45ed13391091 +Node: Function Objects<3>13391304 +Ref: c-api/function doc13391411 +Ref: 45ee13391411 +Ref: c-api/function function-objects13391411 +Ref: 45ef13391411 +Ref: c-api/function id113391411 +Ref: 45f013391411 +Ref: c-api/function c PyFunctionObject13391519 +Ref: 45f113391519 +Ref: c-api/function c PyFunction_Type13391596 +Ref: 45f213391596 +Ref: c-api/function c PyFunction_Check13391825 +Ref: 45f313391825 +Ref: c-api/function c PyFunction_New13392045 +Ref: 45f413392045 +Ref: c-api/function c PyFunction_NewWithQualName13392647 +Ref: 45f513392647 +Ref: c-api/function c PyFunction_GetCode13393148 +Ref: 45f613393148 +Ref: c-api/function c PyFunction_GetGlobals13393333 +Ref: 45f713393333 +Ref: c-api/function c PyFunction_GetModule13393538 +Ref: 45f813393538 +Ref: c-api/function c PyFunction_GetDefaults13393910 +Ref: 45f913393910 +Ref: c-api/function c PyFunction_SetDefaults13394162 +Ref: 45fa13394162 +Ref: c-api/function c PyFunction_GetClosure13394439 +Ref: 45fb13394439 +Ref: c-api/function c PyFunction_SetClosure13394690 +Ref: 45fc13394690 +Ref: c-api/function c PyFunction_GetAnnotations13394976 +Ref: 126513394976 +Ref: c-api/function c PyFunction_SetAnnotations13395214 +Ref: 45fd13395214 +Node: Instance Method Objects13395494 +Ref: c-api/method doc13395627 +Ref: 45fe13395627 +Ref: c-api/method instance-method-objects13395627 +Ref: 45ff13395627 +Ref: c-api/method instancemethod-objects13395627 +Ref: 460013395627 +Ref: c-api/method c PyInstanceMethod_Type13395894 +Ref: 460113395894 +Ref: c-api/method c PyInstanceMethod_Check13396094 +Ref: 460213396094 +Ref: c-api/method c PyInstanceMethod_New13396333 +Ref: 460313396333 +Ref: c-api/method c PyInstanceMethod_Function13396623 +Ref: 460413396623 +Ref: c-api/method c PyInstanceMethod_GET_FUNCTION13396829 +Ref: 460513396829 +Node: Method Objects<2>13397057 +Ref: c-api/method id113397183 +Ref: 460613397183 +Ref: c-api/method method-objects13397183 +Ref: 460713397183 +Ref: c-api/method c PyMethod_Type13397409 +Ref: 460813397409 +Ref: c-api/method c PyMethod_Check13397621 +Ref: 460913397621 +Ref: c-api/method c PyMethod_New13397835 +Ref: 460a13397835 +Ref: c-api/method c PyMethod_Function13398203 +Ref: 460b13398203 +Ref: c-api/method c PyMethod_GET_FUNCTION13398386 +Ref: 460c13398386 +Ref: c-api/method c PyMethod_Self13398600 +Ref: 460d13398600 +Ref: c-api/method c PyMethod_GET_SELF13398772 +Ref: 460e13398772 +Node: Cell Objects13398968 +Ref: c-api/cell doc13399086 +Ref: 460f13399086 +Ref: c-api/cell cell-objects13399086 +Ref: 461013399086 +Ref: c-api/cell id113399086 +Ref: 461113399086 +Ref: c-api/cell c PyCellObject13399731 +Ref: 461213399731 +Ref: c-api/cell c PyCell_Type13399807 +Ref: 461313399807 +Ref: c-api/cell c PyCell_Check13399914 +Ref: 461413399914 +Ref: c-api/cell c PyCell_New13400062 +Ref: 461513400062 +Ref: c-api/cell c PyCell_Get13400266 +Ref: 461613400266 +Ref: c-api/cell c PyCell_GET13400415 +Ref: 461713400415 +Ref: c-api/cell c PyCell_Set13400644 +Ref: 461813400644 +Ref: c-api/cell c PyCell_SET13401005 +Ref: 4eb13401005 +Node: Code Objects<2>13401268 +Ref: c-api/code doc13401360 +Ref: 461913401360 +Ref: c-api/code code-objects13401360 +Ref: 461a13401360 +Ref: c-api/code codeobjects13401360 +Ref: 17313401360 +Ref: c-api/code c PyCodeObject13401565 +Ref: 34b13401565 +Ref: c-api/code c PyCode_Type13401729 +Ref: 461b13401729 +Ref: c-api/code c PyCode_Check13401888 +Ref: 461c13401888 +Ref: c-api/code c PyCode_GetNumFree13402029 +Ref: 461d13402029 +Ref: c-api/code c PyCode_New13402138 +Ref: 34913402138 +Ref: c-api/code c PyCode_NewWithPosOnlyArgs13403140 +Ref: 34a13403140 +Ref: c-api/code c PyCode_NewEmpty13403906 +Ref: ff313403906 +Ref: c-api/code c PyCode_Addr2Line13404252 +Ref: 4af13404252 +Ref: c-api/code c PyCode_Addr2Location13404655 +Ref: 17213404655 +Ref: c-api/code c PyCode_GetCode13405106 +Ref: 34c13405106 +Ref: c-api/code c PyCode_GetVarnames13405688 +Ref: 34d13405688 +Ref: c-api/code c PyCode_GetCellvars13406050 +Ref: 34e13406050 +Ref: c-api/code c PyCode_GetFreevars13406457 +Ref: 34f13406457 +Ref: Code Objects<2>-Footnote-113406854 +Node: Other Objects13406936 +Ref: c-api/concrete other-objects13407036 +Ref: 461e13407036 +Node: File Objects13407489 +Ref: c-api/file doc13407574 +Ref: 461f13407574 +Ref: c-api/file file-objects13407574 +Ref: 462013407574 +Ref: c-api/file fileobjects13407574 +Ref: 462113407574 +Ref: c-api/file c PyFile_FromFd13408155 +Ref: 434a13408155 +Ref: c-api/file c PyObject_AsFileDescriptor13409166 +Ref: 43b213409166 +Ref: c-api/file c PyFile_GetLine13409619 +Ref: 434b13409619 +Ref: c-api/file c PyFile_SetOpenCodeHook13410451 +Ref: 25e413410451 +Ref: c-api/file c PyFile_WriteObject13411656 +Ref: 434c13411656 +Ref: c-api/file c PyFile_WriteString13412090 +Ref: 434d13412090 +Node: Module Objects13412340 +Ref: c-api/module doc13412450 +Ref: 462213412450 +Ref: c-api/module module-objects13412450 +Ref: 462313412450 +Ref: c-api/module moduleobjects13412450 +Ref: 462413412450 +Ref: c-api/module c PyModule_Type13412497 +Ref: 438c13412497 +Ref: c-api/module c PyModule_Check13412752 +Ref: 462513412752 +Ref: c-api/module c PyModule_CheckExact13412917 +Ref: 462613412917 +Ref: c-api/module c PyModule_NewObject13413102 +Ref: 438a13413102 +Ref: c-api/module c PyModule_New13413788 +Ref: 438913413788 +Ref: c-api/module c PyModule_GetDict13414057 +Ref: 438413414057 +Ref: c-api/module c PyModule_GetNameObject13414707 +Ref: 438813414707 +Ref: c-api/module c PyModule_GetName13415112 +Ref: 438713415112 +Ref: c-api/module c PyModule_GetState13415326 +Ref: 5d513415326 +Ref: c-api/module c PyModule_GetDef13415611 +Ref: 438313415611 +Ref: c-api/module c PyModule_GetFilenameObject13415906 +Ref: 438613415906 +Ref: c-api/module c PyModule_GetFilename13416405 +Ref: 438513416405 +Node: Initializing C modules13416879 +Ref: c-api/module initializing-c-modules13416974 +Ref: 462713416974 +Ref: c-api/module initializing-modules13416974 +Ref: 429113416974 +Ref: c-api/module c PyModuleDef13417608 +Ref: 5d213417608 +Ref: c-api/module c PyModuleDef m_base13417903 +Ref: 462813417903 +Ref: c-api/module c PyModuleDef m_name13418020 +Ref: 462913418020 +Ref: c-api/module c PyModuleDef m_doc13418095 +Ref: 462a13418095 +Ref: c-api/module c PyModuleDef m_size13418257 +Ref: 5d413418257 +Ref: c-api/module c PyModuleDef m_methods13419228 +Ref: 462b13419228 +Ref: c-api/module c PyModuleDef m_slots13419457 +Ref: 462c13419457 +Ref: c-api/module c PyModuleDef m_slots m_reload13419847 +Ref: 462e13419847 +Ref: c-api/module c PyModuleDef m_traverse13419907 +Ref: 5cf13419907 +Ref: c-api/module c PyModuleDef m_clear13420642 +Ref: 5d013420642 +Ref: c-api/module c PyModuleDef m_free13421707 +Ref: 5d113421707 +Ref: Initializing C modules-Footnote-113422595 +Node: Single-phase initialization13422637 +Ref: c-api/module single-phase-initialization13422758 +Ref: 463013422758 +Ref: c-api/module c PyModule_Create13423037 +Ref: 423413423037 +Ref: c-api/module c PyModule_Create213423332 +Ref: 438213423332 +Node: Multi-phase initialization13424086 +Ref: c-api/module id113424251 +Ref: 463113424251 +Ref: c-api/module multi-phase-initialization13424251 +Ref: 429213424251 +Ref: c-api/module c PyModuleDef_Init13425828 +Ref: 437e13425828 +Ref: c-api/module c PyModuleDef_Slot13426363 +Ref: 462d13426363 +Ref: c-api/module c PyModuleDef_Slot slot13426398 +Ref: 463213426398 +Ref: c-api/module c PyModuleDef_Slot value13426499 +Ref: 463313426499 +Ref: c-api/module c Py_mod_create13426717 +Ref: 463413426717 +Ref: c-api/module c Py_mod_create create_module13426910 +Ref: 463513426910 +Ref: c-api/module c Py_mod_exec13428341 +Ref: 5d313428341 +Ref: c-api/module c Py_mod_exec exec_module13428613 +Ref: 463613428613 +Ref: Multi-phase initialization-Footnote-113428900 +Ref: Multi-phase initialization-Footnote-213428942 +Node: Low-level module creation functions13428984 +Ref: c-api/module low-level-module-creation-functions13429139 +Ref: 463713429139 +Ref: c-api/module c PyModule_FromDefAndSpec13429518 +Ref: b4013429518 +Ref: c-api/module c PyModule_FromDefAndSpec213429909 +Ref: b4113429909 +Ref: c-api/module c PyModule_ExecDef13430605 +Ref: b4213430605 +Ref: c-api/module c PyModule_SetDocString13430854 +Ref: 438b13430854 +Ref: c-api/module c PyModule_AddFunctions13431255 +Ref: 437f13431255 +Node: Support functions13432009 +Ref: c-api/module support-functions13432129 +Ref: 463813432129 +Ref: c-api/module c PyModule_AddObjectRef13432415 +Ref: 4c313432415 +Ref: c-api/module c PyModule_AddObject13433828 +Ref: 4c413433828 +Ref: c-api/module c PyModule_AddIntConstant13435794 +Ref: 438013435794 +Ref: c-api/module c PyModule_AddStringConstant13436135 +Ref: 438113436135 +Ref: c-api/module c PyModule_AddIntMacro13436535 +Ref: 105a13436535 +Ref: c-api/module c PyModule_AddStringMacro13436882 +Ref: 105913436882 +Ref: c-api/module c PyModule_AddType13436994 +Ref: 5ca13436994 +Node: Module lookup13437444 +Ref: c-api/module module-lookup13437539 +Ref: 463913437539 +Ref: c-api/module c PyState_FindModule13437958 +Ref: 43e313437958 +Ref: c-api/module c PyState_AddModule13438508 +Ref: 43e213438508 +Ref: c-api/module c PyState_RemoveModule13439515 +Ref: 43e413439515 +Node: Iterator Objects13439822 +Ref: c-api/iterator doc13439938 +Ref: 463a13439938 +Ref: c-api/iterator id113439938 +Ref: 463b13439938 +Ref: c-api/iterator iterator-objects13439938 +Ref: 463c13439938 +Ref: c-api/iterator c PySeqIter_Type13440330 +Ref: 43cc13440330 +Ref: c-api/iterator c PySeqIter_Check13440619 +Ref: 463d13440619 +Ref: c-api/iterator c PySeqIter_New13440766 +Ref: 43cb13440766 +Ref: c-api/iterator c PyCallIter_Type13441095 +Ref: 42f513441095 +Ref: c-api/iterator c PyCallIter_Check13441353 +Ref: 463e13441353 +Ref: c-api/iterator c PyCallIter_New13441502 +Ref: 42f413441502 +Node: Descriptor Objects13441987 +Ref: c-api/descriptor doc13442102 +Ref: 463f13442102 +Ref: c-api/descriptor descriptor-objects13442102 +Ref: 464013442102 +Ref: c-api/descriptor id113442102 +Ref: 464113442102 +Ref: c-api/descriptor c PyProperty_Type13442283 +Ref: 43ca13442283 +Ref: c-api/descriptor c PyDescr_NewGetSet13442441 +Ref: 431613442441 +Ref: c-api/descriptor c PyDescr_NewMember13442636 +Ref: 431713442636 +Ref: c-api/descriptor c PyDescr_NewMethod13442829 +Ref: 13a513442829 +Ref: c-api/descriptor c PyDescr_NewWrapper13443022 +Ref: 464213443022 +Ref: c-api/descriptor c PyDescr_NewClassMethod13443191 +Ref: 431513443191 +Ref: c-api/descriptor c PyDescr_IsData13443384 +Ref: 12fb13443384 +Ref: c-api/descriptor c PyWrapper_New13443635 +Ref: 444b13443635 +Node: Slice Objects13443800 +Ref: c-api/slice doc13443914 +Ref: 464313443914 +Ref: c-api/slice id113443914 +Ref: 464413443914 +Ref: c-api/slice slice-objects13443914 +Ref: 464513443914 +Ref: c-api/slice c PySlice_Type13443961 +Ref: 43e113443961 +Ref: c-api/slice c PySlice_Check13444166 +Ref: 464613444166 +Ref: c-api/slice c PySlice_New13444326 +Ref: 43e013444326 +Ref: c-api/slice c PySlice_GetIndices13444882 +Ref: 43df13444882 +Ref: c-api/slice c PySlice_GetIndicesEx13445651 +Ref: 85a13445651 +Ref: c-api/slice c PySlice_Unpack13447653 +Ref: 82213447653 +Ref: c-api/slice c PySlice_AdjustIndices13448293 +Ref: 82313448293 +Node: Ellipsis Object13448807 +Ref: c-api/slice ellipsis-object13448921 +Ref: 464713448921 +Ref: c-api/slice c Py_Ellipsis13448972 +Ref: 464813448972 +Ref: c-api/memoryview memoryview-objects13449244 +Ref: 451513449244 +Node: MemoryView objects13449245 +Ref: c-api/memoryview doc13449371 +Ref: 464913449371 +Ref: c-api/memoryview id113449371 +Ref: 464a13449371 +Ref: c-api/memoryview c PyMemoryView_FromObject13449585 +Ref: 437c13449585 +Ref: c-api/memoryview c PyMemoryView_FromMemory13450019 +Ref: e2413450019 +Ref: c-api/memoryview c PyMemoryView_FromBuffer13450394 +Ref: 33213450394 +Ref: c-api/memoryview c PyMemoryView_GetContiguous13450763 +Ref: 437d13450763 +Ref: c-api/memoryview c PyMemoryView_Check13451305 +Ref: 464b13451305 +Ref: c-api/memoryview c PyMemoryView_GET_BUFFER13451540 +Ref: 464c13451540 +Ref: c-api/memoryview c PyMemoryView_GET_BASE13451862 +Ref: 464d13451862 +Node: Weak Reference Objects<2>13452251 +Ref: c-api/weakref doc13452373 +Ref: 464e13452373 +Ref: c-api/weakref weak-reference-objects13452373 +Ref: 464f13452373 +Ref: c-api/weakref weakrefobjects13452373 +Ref: 465013452373 +Ref: c-api/weakref c PyWeakref_Check13452691 +Ref: 465113452691 +Ref: c-api/weakref c PyWeakref_CheckRef13452835 +Ref: 465213452835 +Ref: c-api/weakref c PyWeakref_CheckProxy13452966 +Ref: 465313452966 +Ref: c-api/weakref c PyWeakref_NewRef13453095 +Ref: 124313453095 +Ref: c-api/weakref c PyWeakref_NewProxy13453928 +Ref: 444a13453928 +Ref: c-api/weakref c PyWeakref_GetObject13454764 +Ref: 444913454764 +Ref: c-api/weakref c PyWeakref_GET_OBJECT13455357 +Ref: 38713455357 +Node: Capsules<2>13455564 +Ref: c-api/capsule doc13455681 +Ref: 465413455681 +Ref: c-api/capsule capsules13455681 +Ref: 425713455681 +Ref: c-api/capsule id113455681 +Ref: 465513455681 +Ref: c-api/capsule c PyCapsule13455848 +Ref: f2b13455848 +Ref: c-api/capsule c PyCapsule_Destructor13456291 +Ref: 42f713456291 +Ref: c-api/capsule c PyCapsule_CheckExact13456599 +Ref: 465613456599 +Ref: c-api/capsule c PyCapsule_New13456753 +Ref: 425613456753 +Ref: c-api/capsule c PyCapsule_GetPointer13457715 +Ref: 42fb13457715 +Ref: c-api/capsule c PyCapsule_GetDestructor13458223 +Ref: 42f913458223 +Ref: c-api/capsule c PyCapsule_GetContext13458711 +Ref: 42f813458711 +Ref: c-api/capsule c PyCapsule_GetName13459152 +Ref: 42fa13459152 +Ref: c-api/capsule c PyCapsule_Import13459590 +Ref: 126613459590 +Ref: c-api/capsule c PyCapsule_IsValid13460143 +Ref: ff713460143 +Ref: c-api/capsule c PyCapsule_SetContext13460965 +Ref: 42fc13460965 +Ref: c-api/capsule c PyCapsule_SetDestructor13461243 +Ref: 42fd13461243 +Ref: c-api/capsule c PyCapsule_SetName13461540 +Ref: 42fe13461540 +Ref: c-api/capsule c PyCapsule_SetPointer13461966 +Ref: 42ff13461966 +Node: Frame Objects13462277 +Ref: c-api/frame doc13462386 +Ref: 465713462386 +Ref: c-api/frame frame-objects13462386 +Ref: 465813462386 +Ref: c-api/frame c PyFrameObject13462433 +Ref: 35d13462433 +Ref: c-api/frame c PyFrame_GetBack13462974 +Ref: 35a13462974 +Ref: c-api/frame c PyFrame_GetBuiltins13463227 +Ref: 33d13463227 +Ref: c-api/frame c PyFrame_GetCode13463478 +Ref: 35e13463478 +Ref: c-api/frame c PyFrame_GetGenerator13463783 +Ref: 33e13463783 +Ref: c-api/frame c PyFrame_GetGlobals13464176 +Ref: 33f13464176 +Ref: c-api/frame c PyFrame_GetLasti13464425 +Ref: 34013464425 +Ref: c-api/frame c PyFrame_GetLocals13464619 +Ref: 35b13464619 +Ref: c-api/frame c PyFrame_GetLineNumber13464851 +Ref: 35f13464851 +Node: Generator Objects13465046 +Ref: c-api/gen doc13465164 +Ref: 465913465164 +Ref: c-api/gen gen-objects13465164 +Ref: 465a13465164 +Ref: c-api/gen generator-objects13465164 +Ref: 465b13465164 +Ref: c-api/gen c PyGenObject13465464 +Ref: 465e13465464 +Ref: c-api/gen c PyGen_Type13465544 +Ref: 465f13465544 +Ref: c-api/gen c PyGen_Check13465655 +Ref: 466013465655 +Ref: c-api/gen c PyGen_CheckExact13465817 +Ref: 466113465817 +Ref: c-api/gen c PyGen_New13465999 +Ref: 465c13465999 +Ref: c-api/gen c PyGen_NewWithQualName13466278 +Ref: 465d13466278 +Node: Coroutine Objects<2>13466706 +Ref: c-api/coro doc13466836 +Ref: 466213466836 +Ref: c-api/coro coro-objects13466836 +Ref: b5e13466836 +Ref: c-api/coro coroutine-objects13466836 +Ref: 466313466836 +Ref: c-api/coro c PyCoroObject13466995 +Ref: 466413466995 +Ref: c-api/coro c PyCoro_Type13467076 +Ref: 466513467076 +Ref: c-api/coro c PyCoro_CheckExact13467188 +Ref: 466613467188 +Ref: c-api/coro c PyCoro_New13467372 +Ref: 466713467372 +Node: Context Variables Objects13467789 +Ref: c-api/contextvars doc13467921 +Ref: 466813467921 +Ref: c-api/contextvars context-variables-objects13467921 +Ref: 466913467921 +Ref: c-api/contextvars contextvarsobjects13467921 +Ref: 74d13467921 +Ref: c-api/contextvars contextvarsobjects-pointertype-change13467992 +Ref: 89313467992 +Ref: c-api/contextvars c PyContext13468531 +Ref: 466a13468531 +Ref: c-api/contextvars c PyContextVar13468647 +Ref: 466b13468647 +Ref: c-api/contextvars c PyContextToken13468769 +Ref: 466c13468769 +Ref: c-api/contextvars c PyContext_Type13468888 +Ref: 466d13468888 +Ref: c-api/contextvars c PyContextVar_Type13469000 +Ref: 466e13469000 +Ref: c-api/contextvars c PyContextToken_Type13469124 +Ref: 466f13469124 +Ref: c-api/contextvars c PyContext_CheckExact13469276 +Ref: 467013469276 +Ref: c-api/contextvars c PyContextVar_CheckExact13469462 +Ref: 467113469462 +Ref: c-api/contextvars c PyContextToken_CheckExact13469654 +Ref: 467213469654 +Ref: c-api/contextvars c PyContext_New13469888 +Ref: 467313469888 +Ref: c-api/contextvars c PyContext_Copy13470070 +Ref: 467413470070 +Ref: c-api/contextvars c PyContext_CopyCurrent13470286 +Ref: 467513470286 +Ref: c-api/contextvars c PyContext_Enter13470495 +Ref: 467613470495 +Ref: c-api/contextvars c PyContext_Exit13470668 +Ref: 467713470668 +Ref: c-api/contextvars c PyContextVar_New13470926 +Ref: 467813470926 +Ref: c-api/contextvars c PyContextVar_Get13471351 +Ref: 467913471351 +Ref: c-api/contextvars c PyContextVar_Set13471974 +Ref: 467a13471974 +Ref: c-api/contextvars c PyContextVar_Reset13472263 +Ref: 467b13472263 +Ref: Context Variables Objects-Footnote-113472599 +Node: DateTime Objects<2>13472664 +Ref: c-api/datetime doc13472800 +Ref: 467c13472800 +Ref: c-api/datetime datetime-objects13472800 +Ref: 467d13472800 +Ref: c-api/datetime datetimeobjects13472800 +Ref: 467e13472800 +Ref: c-api/datetime c PyDateTime_TimeZone_UTC13473363 +Ref: 82913473363 +Ref: c-api/datetime c PyDate_Check13473586 +Ref: 467f13473586 +Ref: c-api/datetime c PyDate_CheckExact13473813 +Ref: 468013473813 +Ref: c-api/datetime c PyDateTime_Check13473998 +Ref: 468113473998 +Ref: c-api/datetime c PyDateTime_CheckExact13474236 +Ref: 468213474236 +Ref: c-api/datetime c PyTime_Check13474429 +Ref: 468313474429 +Ref: c-api/datetime c PyTime_CheckExact13474656 +Ref: 468413474656 +Ref: c-api/datetime c PyDelta_Check13474841 +Ref: 468513474841 +Ref: c-api/datetime c PyDelta_CheckExact13475071 +Ref: 468613475071 +Ref: c-api/datetime c PyTZInfo_Check13475258 +Ref: 468713475258 +Ref: c-api/datetime c PyTZInfo_CheckExact13475491 +Ref: 468813475491 +Ref: c-api/datetime c PyDate_FromDate13475707 +Ref: 468913475707 +Ref: c-api/datetime c PyDateTime_FromDateAndTime13475927 +Ref: 468a13475927 +Ref: c-api/datetime c PyDateTime_FromDateAndTimeAndFold13476259 +Ref: 468b13476259 +Ref: c-api/datetime c PyTime_FromTime13476640 +Ref: 468c13476640 +Ref: c-api/datetime c PyTime_FromTimeAndFold13476894 +Ref: 468d13476894 +Ref: c-api/datetime c PyDelta_FromDSU13477202 +Ref: 468e13477202 +Ref: c-api/datetime c PyTimeZone_FromOffset13477632 +Ref: 82713477632 +Ref: c-api/datetime c PyTimeZone_FromOffsetAndName13477920 +Ref: 82813477920 +Ref: c-api/datetime c PyDateTime_GET_YEAR13478476 +Ref: 468f13478476 +Ref: c-api/datetime c PyDateTime_GET_MONTH13478580 +Ref: 469013478580 +Ref: c-api/datetime c PyDateTime_GET_DAY13478696 +Ref: 469113478696 +Ref: c-api/datetime c PyDateTime_DATE_GET_HOUR13479010 +Ref: 469213479010 +Ref: c-api/datetime c PyDateTime_DATE_GET_MINUTE13479133 +Ref: 469313479133 +Ref: c-api/datetime c PyDateTime_DATE_GET_SECOND13479260 +Ref: 469413479260 +Ref: c-api/datetime c PyDateTime_DATE_GET_MICROSECOND13479387 +Ref: 469513479387 +Ref: c-api/datetime c PyDateTime_DATE_GET_FOLD13479538 +Ref: 469613479538 +Ref: c-api/datetime c PyDateTime_DATE_GET_TZINFO13479686 +Ref: 4bc13479686 +Ref: c-api/datetime c PyDateTime_TIME_GET_HOUR13480059 +Ref: 469713480059 +Ref: c-api/datetime c PyDateTime_TIME_GET_MINUTE13480178 +Ref: 469813480178 +Ref: c-api/datetime c PyDateTime_TIME_GET_SECOND13480301 +Ref: 469913480301 +Ref: c-api/datetime c PyDateTime_TIME_GET_MICROSECOND13480424 +Ref: 469a13480424 +Ref: c-api/datetime c PyDateTime_TIME_GET_FOLD13480561 +Ref: 469b13480561 +Ref: c-api/datetime c PyDateTime_TIME_GET_TZINFO13480705 +Ref: 4bd13480705 +Ref: c-api/datetime c PyDateTime_DELTA_GET_DAYS13481081 +Ref: 469c13481081 +Ref: c-api/datetime c PyDateTime_DELTA_GET_SECONDS13481249 +Ref: 469d13481249 +Ref: c-api/datetime c PyDateTime_DELTA_GET_MICROSECONDS13481415 +Ref: 469e13481415 +Ref: c-api/datetime c PyDateTime_FromTimestamp13481666 +Ref: 469f13481666 +Ref: c-api/datetime c PyDate_FromTimestamp13481960 +Ref: 143f13481960 +Node: Objects for Type Hinting13482242 +Ref: c-api/typehints doc13482344 +Ref: 46a013482344 +Ref: c-api/typehints objects-for-type-hinting13482344 +Ref: 46a113482344 +Ref: c-api/typehints typehintobjects13482344 +Ref: 46a213482344 +Ref: c-api/typehints c Py_GenericAlias13482589 +Ref: 444f13482589 +Ref: c-api/typehints c Py_GenericAliasType13483965 +Ref: 445013483965 +Node: Initialization Finalization and Threads13484250 +Ref: c-api/init doc13484430 +Ref: 46a313484430 +Ref: c-api/init initialization13484430 +Ref: 46a413484430 +Ref: c-api/init initialization-finalization-and-threads13484430 +Ref: 46a513484430 +Node: Before Python Initialization13484932 +Ref: c-api/init before-python-initialization13485075 +Ref: 46a613485075 +Ref: c-api/init pre-init-safe13485075 +Ref: 82b13485075 +Node: Global configuration variables13487071 +Ref: c-api/init global-conf-vars13487266 +Ref: 46a713487266 +Ref: c-api/init global-configuration-variables13487266 +Ref: 46ac13487266 +Ref: c-api/init c Py_BytesWarningFlag13487738 +Ref: 88e13487738 +Ref: c-api/init c Py_DebugFlag13488020 +Ref: 46ad13488020 +Ref: c-api/init c Py_DontWriteBytecodeFlag13488250 +Ref: 46ae13488250 +Ref: c-api/init c Py_FrozenFlag13488517 +Ref: 46af13488517 +Ref: c-api/init c Py_HashRandomizationFlag13488734 +Ref: 46b013488734 +Ref: c-api/init c Py_IgnoreEnvironmentFlag13489020 +Ref: 89213489020 +Ref: c-api/init c Py_InspectFlag13489260 +Ref: 46b113489260 +Ref: c-api/init c Py_InteractiveFlag13489631 +Ref: 44b013489631 +Ref: c-api/init c Py_IsolatedFlag13489712 +Ref: 46b213489712 +Ref: c-api/init c Py_LegacyWindowsFSEncodingFlag13489983 +Ref: 44b413489983 +Ref: c-api/init c Py_LegacyWindowsStdioFlag13490479 +Ref: 46b313490479 +Ref: c-api/init c Py_NoSiteFlag13490861 +Ref: 46b413490861 +Ref: c-api/init c Py_NoUserSiteDirectory13491237 +Ref: 46b513491237 +Ref: c-api/init c Py_OptimizeFlag13491500 +Ref: 28ea13491500 +Ref: c-api/init c Py_QuietFlag13491639 +Ref: 46b613491639 +Ref: c-api/init c Py_UnbufferedStdioFlag13491828 +Ref: 46b713491828 +Ref: c-api/init c Py_VerboseFlag13492037 +Ref: 46b813492037 +Ref: Global configuration variables-Footnote-113492527 +Ref: Global configuration variables-Footnote-213492569 +Node: Initializing and finalizing the interpreter13492611 +Ref: c-api/init initializing-and-finalizing-the-interpreter13492801 +Ref: 46b913492801 +Ref: c-api/init c Py_Initialize13492902 +Ref: 4e713492902 +Ref: c-api/init c Py_InitializeEx13493916 +Ref: 445613493916 +Ref: c-api/init c Py_IsInitialized13494238 +Ref: 42d613494238 +Ref: c-api/init c Py_FinalizeEx13494546 +Ref: 98613494546 +Ref: c-api/init c Py_Finalize13496738 +Ref: ff413496738 +Node: Process-wide parameters13496933 +Ref: c-api/init process-wide-parameters13497137 +Ref: 46ba13497137 +Ref: c-api/init c Py_SetStandardStreamEncoding13497198 +Ref: 36f13497198 +Ref: c-api/init c Py_SetProgramName13498582 +Ref: 36d13498582 +Ref: c-api/init c Py_GetProgramName13499749 +Ref: 4e613499749 +Ref: c-api/init c Py_GetPrefix13500244 +Ref: 4e213500244 +Ref: c-api/init c Py_GetExecPrefix13501276 +Ref: 4e313501276 +Ref: c-api/init c Py_GetProgramFullPath13503710 +Ref: 4e413503710 +Ref: c-api/init c Py_GetPath13504411 +Ref: 4e113504411 +Ref: c-api/init c Py_SetPath13505382 +Ref: 36c13505382 +Ref: c-api/init c Py_GetVersion13506930 +Ref: 445413506930 +Ref: c-api/init c Py_GetPlatform13507576 +Ref: 445313507576 +Ref: c-api/init c Py_GetCopyright13508209 +Ref: 445213508209 +Ref: c-api/init c Py_GetCompiler13508630 +Ref: 445113508630 +Ref: c-api/init c Py_GetBuildInfo13509056 +Ref: 109913509056 +Ref: c-api/init c PySys_SetArgvEx13509509 +Ref: 36913509509 +Ref: c-api/init c PySys_SetArgv13511954 +Ref: 36a13511954 +Ref: c-api/init c Py_SetPythonHome13512811 +Ref: 36e13512811 +Ref: c-api/init c Py_GetPythonHome13513655 +Ref: 4e513513655 +Ref: Process-wide parameters-Footnote-113514201 +Node: Thread State and the Global Interpreter Lock13514270 +Ref: c-api/init thread-state-and-the-global-interpreter-lock13514454 +Ref: 46bd13514454 +Ref: c-api/init threads13514454 +Ref: 46be13514454 +Node: Releasing the GIL from extension code13515995 +Ref: c-api/init releasing-the-gil-from-extension-code13516148 +Ref: 46bf13516148 +Node: Non-Python created threads13518023 +Ref: c-api/init gilstate13518204 +Ref: 46c013518204 +Ref: c-api/init non-python-created-threads13518204 +Ref: 46c113518204 +Node: Cautions about fork13519958 +Ref: c-api/init cautions-about-fork13520116 +Ref: 46c213520116 +Ref: c-api/init fork-and-threads13520116 +Ref: 44b113520116 +Node: High-level API13522054 +Ref: c-api/init high-level-api13522199 +Ref: 46c313522199 +Ref: c-api/init c PyInterpreterState13522373 +Ref: 4fa13522373 +Ref: c-api/init c PyThreadState13523012 +Ref: 36013523012 +Ref: c-api/init c PyEval_InitThreads13523319 +Ref: 59213523319 +Ref: c-api/init c PyEval_ThreadsInitialized13523920 +Ref: 59313523920 +Ref: c-api/init c PyEval_SaveThread13524417 +Ref: f3413524417 +Ref: c-api/init c PyEval_RestoreThread13524785 +Ref: 6e313524785 +Ref: c-api/init c PyThreadState_Get13525550 +Ref: 43f013525550 +Ref: c-api/init c PyThreadState_Swap13525875 +Ref: 43f313525875 +Ref: c-api/init c PyGILState_Ensure13526300 +Ref: 6e513526300 +Ref: c-api/init c PyGILState_Release13528072 +Ref: 435313528072 +Ref: c-api/init c PyGILState_GetThisThreadState13528598 +Ref: 435213528598 +Ref: c-api/init c PyGILState_Check13529052 +Ref: 46c413529052 +Ref: c-api/init c Py_BEGIN_ALLOW_THREADS13529785 +Ref: 425013529785 +Ref: c-api/init c Py_END_ALLOW_THREADS13530134 +Ref: 6e413530134 +Ref: c-api/init c Py_BLOCK_THREADS13530460 +Ref: 444d13530460 +Ref: c-api/init c Py_UNBLOCK_THREADS13530683 +Ref: 445a13530683 +Node: Low-level API13530941 +Ref: c-api/init low-level-api13531058 +Ref: 46c513531058 +Ref: c-api/init c PyInterpreterState_New13531273 +Ref: 3a4113531273 +Ref: c-api/init c PyInterpreterState_Clear13531675 +Ref: 3a4013531675 +Ref: c-api/init c PyInterpreterState_Delete13532019 +Ref: 436013532019 +Ref: c-api/init c PyThreadState_New13532357 +Ref: 43f213532357 +Ref: c-api/init c PyThreadState_Clear13532712 +Ref: 137e13532712 +Ref: c-api/init c PyThreadState_Delete13533092 +Ref: 13bd13533092 +Ref: c-api/init c PyThreadState_DeleteCurrent13533394 +Ref: 13fc13533394 +Ref: c-api/init c PyThreadState_GetFrame13533732 +Ref: 36113533732 +Ref: c-api/init c PyThreadState_GetID13534176 +Ref: 5c613534176 +Ref: c-api/init c PyThreadState_GetInterpreter13534456 +Ref: 5c413534456 +Ref: c-api/init c PyThreadState_EnterTracing13534759 +Ref: 32313534759 +Ref: c-api/init c PyThreadState_LeaveTracing13535016 +Ref: 32413535016 +Ref: c-api/init c PyInterpreterState_Get13535359 +Ref: 5c513535359 +Ref: c-api/init c PyInterpreterState_GetID13535729 +Ref: 82c13535729 +Ref: c-api/init c PyInterpreterState_GetDict13536073 +Ref: 436113536073 +Ref: c-api/init c _PyFrameEvalFunction13536650 +Ref: 34813536650 +Ref: c-api/init c _PyInterpreterState_GetEvalFrameFunc13537192 +Ref: 13a713537192 +Ref: c-api/init c _PyInterpreterState_SetEvalFrameFunc13537468 +Ref: 13a813537468 +Ref: c-api/init c PyThreadState_GetDict13537739 +Ref: 43f113537739 +Ref: c-api/init c PyThreadState_SetAsyncExc13538290 +Ref: 82a13538290 +Ref: c-api/init c PyEval_AcquireThread13539111 +Ref: 6e213539111 +Ref: c-api/init c PyEval_ReleaseThread13540253 +Ref: 434413540253 +Ref: c-api/init c PyEval_AcquireLock13540865 +Ref: 6e113540865 +Ref: c-api/init c PyEval_ReleaseLock13541957 +Ref: f3313541957 +Ref: Low-level API-Footnote-113542359 +Ref: Low-level API-Footnote-213542401 +Node: Sub-interpreter support13542443 +Ref: c-api/init id113542630 +Ref: 46c613542630 +Ref: c-api/init sub-interpreter-support13542630 +Ref: 44b213542630 +Ref: c-api/init c Py_NewInterpreter13543561 +Ref: 445713543561 +Ref: c-api/init c Py_EndInterpreter13546628 +Ref: 125513546628 +Node: Bugs and caveats13547340 +Ref: c-api/init bugs-and-caveats13547416 +Ref: 46c813547416 +Node: Asynchronous Notifications13549023 +Ref: c-api/init asynchronous-notifications13549187 +Ref: 46c913549187 +Ref: c-api/init c Py_AddPendingCall13549432 +Ref: 5d613549432 +Node: Profiling and Tracing13551598 +Ref: c-api/init profiling13551764 +Ref: 46ca13551764 +Ref: c-api/init profiling-and-tracing13551764 +Ref: 46cb13551764 +Ref: c-api/init c Py_tracefunc13552443 +Ref: 46cc13552443 +Ref: c-api/init c PyTrace_CALL13554743 +Ref: 46cd13554743 +Ref: c-api/init c PyTrace_EXCEPTION13555133 +Ref: 46ce13555133 +Ref: c-api/init c PyTrace_LINE13555743 +Ref: 46cf13555743 +Ref: c-api/init c PyTrace_RETURN13556039 +Ref: 46d013556039 +Ref: c-api/init c PyTrace_C_CALL13556192 +Ref: 46d113556192 +Ref: c-api/init c PyTrace_C_EXCEPTION13556354 +Ref: 46d213556354 +Ref: c-api/init c PyTrace_C_RETURN13556523 +Ref: 46d313556523 +Ref: c-api/init c PyTrace_OPCODE13556678 +Ref: 46d413556678 +Ref: c-api/init c PyEval_SetProfile13557012 +Ref: 113613557012 +Ref: c-api/init c PyEval_SetTrace13557682 +Ref: 113713557682 +Node: Advanced Debugger Support13558338 +Ref: c-api/init advanced-debugger-support13558506 +Ref: 46d513558506 +Ref: c-api/init advanced-debugging13558506 +Ref: 46d613558506 +Ref: c-api/init c PyInterpreterState_Head13558646 +Ref: 113a13558646 +Ref: c-api/init c PyInterpreterState_Main13558824 +Ref: 46c713558824 +Ref: c-api/init c PyInterpreterState_Next13558958 +Ref: 113b13558958 +Ref: c-api/init c PyInterpreterState_ThreadHead13559172 +Ref: 113c13559172 +Ref: c-api/init c PyThreadState_Next13559426 +Ref: 113d13559426 +Node: Thread Local Storage Support13559685 +Ref: c-api/init thread-local-storage13559823 +Ref: 46d713559823 +Ref: c-api/init thread-local-storage-support13559823 +Ref: 46d813559823 +Node: Thread Specific Storage TSS API13560932 +Ref: c-api/init thread-specific-storage-api13561065 +Ref: 73213561065 +Ref: c-api/init thread-specific-storage-tss-api13561065 +Ref: 46d913561065 +Ref: c-api/init c Py_tss_t13561449 +Ref: 73313561449 +Ref: c-api/init c Py_tss_NEEDS_INIT13561893 +Ref: 46da13561893 +Ref: Thread Specific Storage TSS API-Footnote-113562180 +Node: Dynamic Allocation13562222 +Ref: c-api/init dynamic-allocation13562327 +Ref: 46db13562327 +Ref: c-api/init c PyThread_tss_alloc13562607 +Ref: 43f913562607 +Ref: c-api/init c PyThread_tss_free13562901 +Ref: 43fc13562901 +Node: Methods<4>13563386 +Ref: c-api/init methods13563491 +Ref: 46dc13563491 +Ref: c-api/init c PyThread_tss_is_created13563797 +Ref: 43fe13563797 +Ref: c-api/init c PyThread_tss_create13564048 +Ref: 43fa13564048 +Ref: c-api/init c PyThread_tss_delete13564527 +Ref: 43fb13564527 +Ref: c-api/init c PyThread_tss_set13565021 +Ref: 43ff13565021 +Ref: c-api/init c PyThread_tss_get13565340 +Ref: 43fd13565340 +Node: Thread Local Storage TLS API13565632 +Ref: c-api/init thread-local-storage-api13565765 +Ref: 73113565765 +Ref: c-api/init thread-local-storage-tls-api13565765 +Ref: 46dd13565765 +Ref: c-api/init c PyThread_create_key13566389 +Ref: 43f513566389 +Ref: c-api/init c PyThread_delete_key13566476 +Ref: 43f613566476 +Ref: c-api/init c PyThread_set_key_value13566571 +Ref: ce213566571 +Ref: c-api/init c PyThread_get_key_value13566681 +Ref: 43f813566681 +Ref: c-api/init c PyThread_delete_key_value13566780 +Ref: 43f713566780 +Ref: c-api/init c PyThread_ReInitTLS13566881 +Ref: 43f413566881 +Node: Python Initialization Configuration13566968 +Ref: c-api/init_config doc13567143 +Ref: 46de13567143 +Ref: c-api/init_config init-config13567143 +Ref: 37113567143 +Ref: c-api/init_config python-initialization-configuration13567143 +Ref: 46df13567143 +Ref: Python Initialization Configuration-Footnote-113568639 +Node: Example<17>13568681 +Ref: c-api/init_config example13568789 +Ref: 46e213568789 +Node: PyWideStringList13569798 +Ref: c-api/init_config pywidestringlist13569923 +Ref: 46e313569923 +Ref: c-api/init_config c PyWideStringList13569972 +Ref: 5fe13569972 +Ref: c-api/init_config c PyWideStringList PyWideStringList_Append13570167 +Ref: 46e413570167 +Ref: c-api/init_config c PyWideStringList PyWideStringList_Insert13570395 +Ref: 46e513570395 +Ref: c-api/init_config c PyWideStringList length13570854 +Ref: 46e613570854 +Ref: c-api/init_config c PyWideStringList items13570928 +Ref: 46e713570928 +Node: PyStatus13570987 +Ref: c-api/init_config pystatus13571112 +Ref: 46e813571112 +Ref: c-api/init_config c PyStatus13571145 +Ref: 5fd13571145 +Ref: c-api/init_config c PyStatus exitcode13571368 +Ref: 46e913571368 +Ref: c-api/init_config c PyStatus err_msg13571457 +Ref: 46ea13571457 +Ref: c-api/init_config c PyStatus func13571523 +Ref: 46eb13571523 +Ref: c-api/init_config c PyStatus PyStatus_Ok13571671 +Ref: 46ec13571671 +Ref: c-api/init_config c PyStatus PyStatus_Error13571753 +Ref: 46ed13571753 +Ref: c-api/init_config c PyStatus PyStatus_NoMemory13571941 +Ref: 46ee13571941 +Ref: c-api/init_config c PyStatus PyStatus_Exit13572063 +Ref: 46ef13572063 +Ref: c-api/init_config c PyStatus PyStatus_Exception13572224 +Ref: 46f013572224 +Ref: c-api/init_config c PyStatus PyStatus_IsError13572456 +Ref: 46f213572456 +Ref: c-api/init_config c PyStatus PyStatus_IsExit13572552 +Ref: 46f313572552 +Ref: c-api/init_config c PyStatus Py_ExitStatusException13572646 +Ref: 46f113572646 +Node: PyPreConfig13573587 +Ref: c-api/init_config pypreconfig13573733 +Ref: 46f413573733 +Ref: c-api/init_config c PyPreConfig13573772 +Ref: 5fc13573772 +Ref: c-api/init_config c PyPreConfig PyPreConfig_InitPythonConfig13573897 +Ref: 46f513573897 +Ref: c-api/init_config c PyPreConfig PyPreConfig_InitIsolatedConfig13574085 +Ref: 46f613574085 +Ref: c-api/init_config c PyPreConfig allocator13574301 +Ref: 46f713574301 +Ref: c-api/init_config c PyPreConfig configure_locale13575568 +Ref: 46f913575568 +Ref: c-api/init_config c PyPreConfig coerce_c_locale13575930 +Ref: 46fa13575930 +Ref: c-api/init_config c PyPreConfig coerce_c_locale_warn13576250 +Ref: 46fb13576250 +Ref: c-api/init_config c PyPreConfig dev_mode13576437 +Ref: 46fc13576437 +Ref: c-api/init_config c PyPreConfig isolated13576634 +Ref: 46fe13576634 +Ref: c-api/init_config c PyPreConfig legacy_windows_fs_encoding13576798 +Ref: 470013576798 +Ref: c-api/init_config c PyPreConfig parse_argv13577388 +Ref: 470213577388 +Ref: c-api/init_config c PyPreConfig use_environment13577772 +Ref: 470313577772 +Ref: c-api/init_config c PyPreConfig utf8_mode13577991 +Ref: 470113577991 +Node: Preinitialize Python with PyPreConfig13578402 +Ref: c-api/init_config c-preinit13578548 +Ref: 354d13578548 +Ref: c-api/init_config preinitialize-python-with-pypreconfig13578548 +Ref: 470413578548 +Ref: c-api/init_config c Py_PreInitialize13579039 +Ref: 60113579039 +Ref: c-api/init_config c Py_PreInitializeFromBytesArgs13579239 +Ref: 60313579239 +Ref: c-api/init_config c Py_PreInitializeFromArgs13579599 +Ref: 60213579599 +Node: PyConfig13581519 +Ref: c-api/init_config pyconfig13581682 +Ref: 470513581682 +Ref: c-api/init_config c PyConfig13581715 +Ref: 37013581715 +Ref: c-api/init_config c PyConfig PyConfig_InitPythonConfig13581946 +Ref: 470713581946 +Ref: c-api/init_config c PyConfig PyConfig_InitIsolatedConfig13582107 +Ref: 470813582107 +Ref: c-api/init_config c PyConfig PyConfig_SetString13582272 +Ref: 470913582272 +Ref: c-api/init_config c PyConfig PyConfig_SetBytesString13582544 +Ref: 470a13582544 +Ref: c-api/init_config c PyConfig PyConfig_SetArgv13582874 +Ref: 470b13582874 +Ref: c-api/init_config c PyConfig PyConfig_SetBytesArgv13583191 +Ref: 470c13583191 +Ref: c-api/init_config c PyConfig PyConfig_SetWideStringList13583561 +Ref: 470d13583561 +Ref: c-api/init_config c PyConfig PyConfig_Read13583868 +Ref: 470e13583868 +Ref: c-api/init_config c PyConfig PyConfig_Clear13585244 +Ref: 470613585244 +Ref: c-api/init_config c PyConfig argv13586371 +Ref: 132e13586371 +Ref: c-api/init_config c PyConfig safe_path13586958 +Ref: 34513586958 +Ref: c-api/init_config c PyConfig base_exec_prefix13587835 +Ref: 470f13587835 +Ref: c-api/init_config c PyConfig base_executable13588027 +Ref: 471013588027 +Ref: c-api/init_config c PyConfig base_prefix13588374 +Ref: 471213588374 +Ref: c-api/init_config c PyConfig buffered_stdio13588556 +Ref: 471313588556 +Ref: c-api/init_config c PyConfig bytes_warning13588969 +Ref: 471513588969 +Ref: c-api/init_config c PyConfig warn_default_encoding13589414 +Ref: 471613589414 +Ref: c-api/init_config c PyConfig code_debug_ranges13589724 +Ref: 471713589724 +Ref: c-api/init_config c PyConfig check_hash_pycs_mode13590195 +Ref: 471813590195 +Ref: c-api/init_config c PyConfig configure_c_stdio13590869 +Ref: 471413590869 +Ref: c-api/init_config c PyConfig dev_mode13591420 +Ref: 46fd13591420 +Ref: c-api/init_config c PyConfig dump_refs13591720 +Ref: 471a13591720 +Ref: c-api/init_config c PyConfig exec_prefix13592134 +Ref: 471b13592134 +Ref: c-api/init_config c PyConfig executable13592428 +Ref: 471113592428 +Ref: c-api/init_config c PyConfig faulthandler13592688 +Ref: 471c13592688 +Ref: c-api/init_config c PyConfig filesystem_encoding13593041 +Ref: 24dd13593041 +Ref: c-api/init_config c PyConfig filesystem_errors13594273 +Ref: 24de13594273 +Ref: c-api/init_config c PyConfig hash_seed13594945 +Ref: 471d13594945 +Ref: c-api/init_config c PyConfig use_hash_seed13594989 +Ref: 471e13594989 +Ref: c-api/init_config c PyConfig home13595397 +Ref: 46bc13595397 +Ref: c-api/init_config c PyConfig import_time13595746 +Ref: 471f13595746 +Ref: c-api/init_config c PyConfig inspect13595999 +Ref: 472013595999 +Ref: c-api/init_config c PyConfig install_signal_handlers13596587 +Ref: 4fb13596587 +Ref: c-api/init_config c PyConfig interactive13596748 +Ref: 471913596748 +Ref: c-api/init_config c PyConfig isolated13596952 +Ref: 46ff13596952 +Ref: c-api/init_config c PyConfig legacy_windows_stdio13597751 +Ref: 472213597751 +Ref: c-api/init_config c PyConfig malloc_stats13598346 +Ref: 472313598346 +Ref: c-api/init_config c PyConfig platlibdir13598732 +Ref: 134813598732 +Ref: c-api/init_config c PyConfig pythonpath_env13599543 +Ref: 472413599543 +Ref: c-api/init_config c PyConfig module_search_paths13599880 +Ref: 1c113599880 +Ref: c-api/init_config c PyConfig module_search_paths_set13599949 +Ref: 1c013599949 +Ref: c-api/init_config c PyConfig optimization_level13600474 +Ref: 472513600474 +Ref: c-api/init_config c PyConfig orig_argv13600969 +Ref: 4bb13600969 +Ref: c-api/init_config c PyConfig parse_argv13601644 +Ref: 132f13601644 +Ref: c-api/init_config c PyConfig parser_debug13602549 +Ref: 472613602549 +Ref: c-api/init_config c PyConfig pathconfig_warnings13602918 +Ref: 472713602918 +Ref: c-api/init_config c PyConfig prefix13603337 +Ref: 472813603337 +Ref: c-api/init_config c PyConfig program_name13603623 +Ref: 46bb13603623 +Ref: c-api/init_config c PyConfig pycache_prefix13604452 +Ref: 472913604452 +Ref: c-api/init_config c PyConfig quiet13604871 +Ref: 472a13604871 +Ref: c-api/init_config c PyConfig run_command13605137 +Ref: 472b13605137 +Ref: c-api/init_config c PyConfig run_filename13605314 +Ref: 472c13605314 +Ref: c-api/init_config c PyConfig run_module13605781 +Ref: 472e13605781 +Ref: c-api/init_config c PyConfig show_ref_count13605957 +Ref: 472f13605957 +Ref: c-api/init_config c PyConfig site_import13606260 +Ref: 473013606260 +Ref: c-api/init_config c PyConfig skip_source_first_line13606907 +Ref: 472d13606907 +Ref: c-api/init_config c PyConfig stdio_encoding13607280 +Ref: 3bd013607280 +Ref: c-api/init_config c PyConfig stdio_errors13607324 +Ref: 3bd113607324 +Ref: c-api/init_config c PyConfig tracemalloc13608323 +Ref: 473113608323 +Ref: c-api/init_config c PyConfig use_environment13608676 +Ref: 5d713608676 +Ref: c-api/init_config c PyConfig user_site_directory13608998 +Ref: 472113608998 +Ref: c-api/init_config c PyConfig verbose13609393 +Ref: 473213609393 +Ref: c-api/init_config c PyConfig warnoptions13609996 +Ref: 44b713609996 +Ref: c-api/init_config c PyConfig write_bytecode13610840 +Ref: 473313610840 +Ref: c-api/init_config c PyConfig xoptions13611300 +Ref: 44b813611300 +Ref: PyConfig-Footnote-113611924 +Ref: PyConfig-Footnote-213611966 +Node: Initialization with PyConfig13612008 +Ref: c-api/init_config initialization-with-pyconfig13612156 +Ref: 473413612156 +Ref: c-api/init_config c Py_InitializeFromConfig13612261 +Ref: 60013612261 +Node: Isolated Configuration13615894 +Ref: c-api/init_config init-isolated-conf13616054 +Ref: 46e113616054 +Ref: c-api/init_config isolated-configuration13616054 +Ref: 473513616054 +Node: Python Configuration13616811 +Ref: c-api/init_config init-python-config13616968 +Ref: 46e013616968 +Ref: c-api/init_config python-configuration13616968 +Ref: 473613616968 +Ref: Python Configuration-Footnote-113617588 +Ref: Python Configuration-Footnote-213617630 +Node: Python Path Configuration13617672 +Ref: c-api/init_config init-path-config13617817 +Ref: 4e813617817 +Ref: c-api/init_config python-path-configuration13617817 +Ref: 473713617817 +Node: Py_RunMain13621564 +Ref: c-api/init_config py-runmain13621703 +Ref: 473813621703 +Ref: c-api/init_config c Py_RunMain13621746 +Ref: 60413621746 +Node: Py_GetArgcArgv13622346 +Ref: c-api/init_config py-getargcargv13622510 +Ref: 473913622510 +Ref: c-api/init_config c Py_GetArgcArgv13622561 +Ref: 136913622561 +Node: Multi-Phase Initialization Private Provisional API13622762 +Ref: c-api/init_config multi-phase-initialization-private-provisional-api13622907 +Ref: 473a13622907 +Ref: c-api/init_config c _Py_InitializeMain13624208 +Ref: 473b13624208 +Ref: Multi-Phase Initialization Private Provisional API-Footnote-113626236 +Ref: Multi-Phase Initialization Private Provisional API-Footnote-213626278 +Node: Memory Management13626320 +Ref: c-api/memory doc13626485 +Ref: 473c13626485 +Ref: c-api/memory memory13626485 +Ref: 46f813626485 +Ref: c-api/memory memory-management13626485 +Ref: 473d13626485 +Node: Overview<4>13626842 +Ref: c-api/memory memoryoverview13626933 +Ref: 473e13626933 +Ref: c-api/memory overview13626933 +Ref: 473f13626933 +Node: Allocator Domains13630849 +Ref: c-api/memory allocator-domains13630969 +Ref: 474013630969 +Node: Raw Memory Interface13632817 +Ref: c-api/memory raw-memory-interface13632942 +Ref: 474213632942 +Ref: c-api/memory c PyMem_RawMalloc13633383 +Ref: cdf13633383 +Ref: c-api/memory c PyMem_RawCalloc13633765 +Ref: b3a13633765 +Ref: c-api/memory c PyMem_RawRealloc13634260 +Ref: ce013634260 +Ref: c-api/memory c PyMem_RawFree13635009 +Ref: 44b313635009 +Node: Memory Interface13635415 +Ref: c-api/memory memory-interface13635540 +Ref: 474313635540 +Ref: c-api/memory memoryinterface13635540 +Ref: 474413635540 +Ref: c-api/memory c PyMem_Malloc13636046 +Ref: 8d713636046 +Ref: c-api/memory c PyMem_Calloc13636465 +Ref: b3b13636465 +Ref: c-api/memory c PyMem_Realloc13637016 +Ref: ce113637016 +Ref: c-api/memory c PyMem_Free13637785 +Ref: 10a813637785 +Ref: c-api/memory c PyMem_New13638321 +Ref: 474513638321 +Ref: c-api/memory c PyMem_Resize13638566 +Ref: 474613638566 +Ref: c-api/memory c PyMem_Del13639028 +Ref: 474713639028 +Node: Object allocators13639605 +Ref: c-api/memory object-allocators13639735 +Ref: 474813639735 +Ref: c-api/memory c PyObject_Malloc13640424 +Ref: 8d913640424 +Ref: c-api/memory c PyObject_Calloc13640849 +Ref: b3c13640849 +Ref: c-api/memory c PyObject_Realloc13641406 +Ref: 10a913641406 +Ref: c-api/memory c PyObject_Free13642195 +Ref: 8d613642195 +Node: Default Memory Allocators13642641 +Ref: c-api/memory default-memory-allocators13642782 +Ref: 179113642782 +Ref: c-api/memory id113642782 +Ref: 474a13642782 +Node: Customize Memory Allocators13645140 +Ref: c-api/memory customize-memory-allocators13645307 +Ref: 474913645307 +Ref: c-api/memory id213645307 +Ref: 474b13645307 +Ref: c-api/memory c PyMemAllocatorEx13645399 +Ref: b5d13645399 +Ref: c-api/memory c PyMemAllocatorDomain13647233 +Ref: 474113647233 +Ref: c-api/memory c PyMemAllocatorDomain PYMEM_DOMAIN_RAW13647331 +Ref: 474c13647331 +Ref: c-api/memory c PyMemAllocatorDomain PYMEM_DOMAIN_MEM13647573 +Ref: 474d13647573 +Ref: c-api/memory c PyMemAllocatorDomain PYMEM_DOMAIN_OBJ13647803 +Ref: 474e13647803 +Ref: c-api/memory c PyMem_GetAllocator13648045 +Ref: 46aa13648045 +Ref: c-api/memory c PyMem_SetAllocator13648217 +Ref: 46a813648217 +Ref: c-api/memory c PyMem_SetupDebugHooks13648967 +Ref: 8da13648967 +Node: Debug hooks on the Python memory allocators13649117 +Ref: c-api/memory debug-hooks-on-the-python-memory-allocators13649281 +Ref: 474f13649281 +Ref: c-api/memory pymem-debug-hooks13649281 +Ref: 179213649281 +Node: The pymalloc allocator13654493 +Ref: c-api/memory pymalloc13654647 +Ref: 98013654647 +Ref: c-api/memory the-pymalloc-allocator13654647 +Ref: 475013654647 +Node: Customize pymalloc Arena Allocator13655698 +Ref: c-api/memory customize-pymalloc-arena-allocator13655791 +Ref: 475113655791 +Ref: c-api/memory c PyObjectArenaAllocator13655901 +Ref: 475213655901 +Ref: c-api/memory c PyObject_GetArenaAllocator13656910 +Ref: 46ab13656910 +Ref: c-api/memory c PyObject_SetArenaAllocator13657036 +Ref: 46a913657036 +Node: tracemalloc C API13657162 +Ref: c-api/memory tracemalloc-c-api13657285 +Ref: 475313657285 +Ref: c-api/memory c PyTraceMalloc_Track13657359 +Ref: 81813657359 +Ref: c-api/memory c PyTraceMalloc_Untrack13657772 +Ref: 81913657772 +Node: Examples<38>13658064 +Ref: c-api/memory examples13658156 +Ref: 475413658156 +Ref: c-api/memory memoryexamples13658156 +Ref: 475513658156 +Node: Object Implementation Support13660072 +Ref: c-api/objimpl doc13660224 +Ref: 475613660224 +Ref: c-api/objimpl newtypes13660224 +Ref: 475713660224 +Ref: c-api/objimpl object-implementation-support13660224 +Ref: 475813660224 +Node: Allocating Objects on the Heap13660733 +Ref: c-api/allocation doc13660862 +Ref: 475913660862 +Ref: c-api/allocation allocating-objects13660862 +Ref: 475a13660862 +Ref: c-api/allocation allocating-objects-on-the-heap13660862 +Ref: 475b13660862 +Ref: c-api/allocation c _PyObject_New13660939 +Ref: 475c13660939 +Ref: c-api/allocation c _PyObject_NewVar13661049 +Ref: 475d13661049 +Ref: c-api/allocation c PyObject_Init13661193 +Ref: 6bc13661193 +Ref: c-api/allocation c PyObject_InitVar13661691 +Ref: 136813661691 +Ref: c-api/allocation c PyObject_New13662033 +Ref: 5db13662033 +Ref: c-api/allocation c PyObject_NewVar13662477 +Ref: 5dc13662477 +Ref: c-api/allocation c PyObject_Del13663204 +Ref: 111413663204 +Ref: c-api/allocation c _Py_NoneStruct13663595 +Ref: 475e13663595 +Node: Common Object Structures13663925 +Ref: c-api/structures doc13664078 +Ref: 475f13664078 +Ref: c-api/structures common-object-structures13664078 +Ref: 476013664078 +Ref: c-api/structures common-structs13664078 +Ref: 476113664078 +Node: Base object types and macros13664434 +Ref: c-api/structures base-object-types-and-macros13664566 +Ref: 476213664566 +Ref: c-api/structures c PyObject13665004 +Ref: 4cf13665004 +Ref: c-api/structures c PyVarObject13665688 +Ref: 39c613665688 +Ref: c-api/structures c PyObject_HEAD13666162 +Ref: f8313666162 +Ref: c-api/structures c PyObject_VAR_HEAD13666423 +Ref: 476313666423 +Ref: c-api/structures c Py_Is13666726 +Ref: 4d113666726 +Ref: c-api/structures c Py_IsNone13666954 +Ref: 4d213666954 +Ref: c-api/structures c Py_IsTrue13667186 +Ref: 4d313667186 +Ref: c-api/structures c Py_IsFalse13667418 +Ref: 4d413667418 +Ref: c-api/structures c Py_TYPE13667653 +Ref: 35513667653 +Ref: c-api/structures c Py_IS_TYPE13668048 +Ref: 11fc13668048 +Ref: c-api/structures c Py_SET_TYPE13668267 +Ref: 35613668267 +Ref: c-api/structures c Py_REFCNT13668402 +Ref: 4dc13668402 +Ref: c-api/structures c Py_SET_REFCNT13668811 +Ref: 4dd13668811 +Ref: c-api/structures c Py_SIZE13668962 +Ref: 35713668962 +Ref: c-api/structures c Py_SET_SIZE13669314 +Ref: 35813669314 +Ref: c-api/structures c PyObject_HEAD_INIT13669449 +Ref: 476413669449 +Ref: c-api/structures c PyVarObject_HEAD_INIT13669667 +Ref: 476513669667 +Node: Implementing functions and methods13669944 +Ref: c-api/structures implementing-functions-and-methods13670124 +Ref: 476613670124 +Ref: c-api/structures c PyCFunction13670213 +Ref: 10d913670213 +Ref: c-api/structures c PyCFunctionWithKeywords13670831 +Ref: 42f313670831 +Ref: c-api/structures c _PyCFunctionFast13671252 +Ref: 476713671252 +Ref: c-api/structures c _PyCFunctionFastWithKeywords13671600 +Ref: 476813671600 +Ref: c-api/structures c PyCMethod13672079 +Ref: 33613672079 +Ref: c-api/structures c PyMethodDef13672562 +Ref: 111913672562 +Ref: c-api/structures METH_VARARGS13674421 +Ref: 114313674421 +Ref: c-api/structures METH_FASTCALL13675352 +Ref: 120213675352 +Ref: c-api/structures METH_NOARGS13676974 +Ref: 111613676974 +Ref: c-api/structures METH_O13677534 +Ref: 114213677534 +Ref: c-api/structures METH_CLASS13678125 +Ref: 111713678125 +Ref: c-api/structures METH_STATIC13678398 +Ref: 111813678398 +Ref: c-api/structures METH_COEXIST13678783 +Ref: 476913678783 +Node: Accessing attributes of extension types13679443 +Ref: c-api/structures accessing-attributes-of-extension-types13679586 +Ref: 476a13679586 +Ref: c-api/structures c PyMemberDef13679685 +Ref: 81a13679685 +Ref: c-api/structures pymemberdef-offsets13683880 +Ref: 455a13683880 +Ref: c-api/structures c PyMember_GetOne13684533 +Ref: 476b13684533 +Ref: c-api/structures c PyMember_SetOne13684807 +Ref: 476c13684807 +Ref: c-api/structures c PyGetSetDef13685126 +Ref: 81b13685126 +Node: Type Objects<3>13687332 +Ref: c-api/typeobj doc13687479 +Ref: 476d13687479 +Ref: c-api/typeobj type-objects13687479 +Ref: 476e13687479 +Ref: c-api/typeobj type-structs13687479 +Ref: 5e313687479 +Node: Quick Reference13688721 +Ref: c-api/typeobj quick-reference13688820 +Ref: 477013688820 +Node: “tp slots”13688932 +Ref: c-api/typeobj tp-slots13689016 +Ref: 477113689016 +Ref: c-api/typeobj tp-slots-table13689016 +Ref: 477213689016 +Ref: “tp slots”-Footnote-113702145 +Ref: “tp slots”-Footnote-213702410 +Node: sub-slots13703199 +Ref: c-api/typeobj id313703305 +Ref: 477d13703305 +Ref: c-api/typeobj sub-slots13703305 +Ref: 477513703305 +Node: slot typedefs13713641 +Ref: c-api/typeobj slot-typedefs13713724 +Ref: 47b013713724 +Ref: c-api/typeobj slot-typedefs-table13713724 +Ref: 477313713724 +Node: PyTypeObject Definition13721536 +Ref: c-api/typeobj pytypeobject-definition13721658 +Ref: 47b213721658 +Node: PyObject Slots13724696 +Ref: c-api/typeobj pyobject-slots13724820 +Ref: 47b313724820 +Ref: c-api/typeobj c PyObject ob_refcnt13725242 +Ref: 4ce13725242 +Ref: c-api/typeobj c PyObject ob_type13725823 +Ref: 43af13725823 +Ref: c-api/typeobj c PyObject _ob_next13726974 +Ref: 47b413726974 +Ref: c-api/typeobj c PyObject _ob_prev13727039 +Ref: 47b513727039 +Node: PyVarObject Slots13727949 +Ref: c-api/typeobj pyvarobject-slots13728068 +Ref: 47b613728068 +Ref: c-api/typeobj c PyVarObject ob_size13728123 +Ref: 444813728123 +Node: PyTypeObject Slots13728500 +Ref: c-api/typeobj pytypeobject-slots13728617 +Ref: 47b713728617 +Ref: c-api/typeobj c PyTypeObject tp_name13728969 +Ref: 12f913728969 +Ref: c-api/typeobj c PyTypeObject tp_basicsize13730709 +Ref: 5dd13730709 +Ref: c-api/typeobj c PyTypeObject tp_itemsize13730793 +Ref: 425d13730793 +Ref: c-api/typeobj c PyTypeObject tp_dealloc13733464 +Ref: 426313733464 +Ref: c-api/typeobj c PyTypeObject tp_vectorcall_offset13735954 +Ref: 44ee13735954 +Ref: c-api/typeobj c PyTypeObject tp_getattr13737870 +Ref: 428113737870 +Ref: c-api/typeobj c PyTypeObject tp_setattr13738625 +Ref: 428213738625 +Ref: c-api/typeobj c PyTypeObject tp_as_async13739400 +Ref: 477413739400 +Ref: c-api/typeobj c PyTypeObject tp_repr13739976 +Ref: 427a13739976 +Ref: c-api/typeobj c PyTypeObject tp_as_number13740949 +Ref: 5e113740949 +Ref: c-api/typeobj c PyTypeObject tp_as_sequence13741383 +Ref: 477613741383 +Ref: c-api/typeobj c PyTypeObject tp_as_mapping13741828 +Ref: 477713741828 +Ref: c-api/typeobj c PyTypeObject tp_hash13742268 +Ref: 428a13742268 +Ref: c-api/typeobj c PyTypeObject tp_call13743882 +Ref: 428b13743882 +Ref: c-api/typeobj c PyTypeObject tp_str13744305 +Ref: 427b13744305 +Ref: c-api/typeobj c PyTypeObject tp_getattro13745276 +Ref: 427e13745276 +Ref: c-api/typeobj c PyTypeObject tp_setattro13746173 +Ref: 427f13746173 +Ref: c-api/typeobj c PyTypeObject tp_as_buffer13747195 +Ref: 5df13747195 +Ref: c-api/typeobj c PyTypeObject tp_flags13747628 +Ref: 12c313747628 +Ref: c-api/typeobj Py_TPFLAGS_HEAPTYPE13749525 +Ref: 454b13749525 +Ref: c-api/typeobj Py_TPFLAGS_BASETYPE13750170 +Ref: 426a13750170 +Ref: c-api/typeobj Py_TPFLAGS_READY13750447 +Ref: 47bc13750447 +Ref: c-api/typeobj Py_TPFLAGS_READYING13750636 +Ref: 47bd13750636 +Ref: c-api/typeobj Py_TPFLAGS_HAVE_GC13750834 +Ref: 35113750834 +Ref: c-api/typeobj Py_TPFLAGS_DEFAULT13751812 +Ref: 425e13751812 +Ref: c-api/typeobj Py_TPFLAGS_METHOD_DESCRIPTOR13752147 +Ref: 44fa13752147 +Ref: c-api/typeobj Py_TPFLAGS_LONG_SUBCLASS13753075 +Ref: 47bf13753075 +Ref: c-api/typeobj Py_TPFLAGS_LIST_SUBCLASS13753116 +Ref: 47c013753116 +Ref: c-api/typeobj Py_TPFLAGS_TUPLE_SUBCLASS13753157 +Ref: 47c113753157 +Ref: c-api/typeobj Py_TPFLAGS_BYTES_SUBCLASS13753199 +Ref: 47c213753199 +Ref: c-api/typeobj Py_TPFLAGS_UNICODE_SUBCLASS13753241 +Ref: 47c313753241 +Ref: c-api/typeobj Py_TPFLAGS_DICT_SUBCLASS13753285 +Ref: 47c413753285 +Ref: c-api/typeobj Py_TPFLAGS_BASE_EXC_SUBCLASS13753326 +Ref: 47c513753326 +Ref: c-api/typeobj Py_TPFLAGS_TYPE_SUBCLASS13753371 +Ref: 47c613753371 +Ref: c-api/typeobj Py_TPFLAGS_HAVE_FINALIZE13753929 +Ref: 70313753929 +Ref: c-api/typeobj Py_TPFLAGS_HAVE_VECTORCALL13754309 +Ref: 44ed13754309 +Ref: c-api/typeobj Py_TPFLAGS_IMMUTABLETYPE13754732 +Ref: 35313754732 +Ref: c-api/typeobj Py_TPFLAGS_DISALLOW_INSTANTIATION13755095 +Ref: 47c713755095 +Ref: c-api/typeobj Py_TPFLAGS_MAPPING13755768 +Ref: 12a113755768 +Ref: c-api/typeobj Py_TPFLAGS_SEQUENCE13756614 +Ref: 12a213756614 +Ref: c-api/typeobj c PyTypeObject tp_doc13757461 +Ref: 425f13757461 +Ref: c-api/typeobj c PyTypeObject tp_traverse13757784 +Ref: 35213757784 +Ref: c-api/typeobj c PyTypeObject tp_clear13761345 +Ref: 427813761345 +Ref: c-api/typeobj c PyTypeObject tp_richcompare13764995 +Ref: 428413764995 +Ref: c-api/typeobj c PyTypeObject tp_richcompare Py_RETURN_RICHCOMPARE13766554 +Ref: 47c813766554 +Ref: c-api/typeobj c PyTypeObject tp_weaklistoffset13767789 +Ref: 5de13767789 +Ref: c-api/typeobj c PyTypeObject tp_iter13769582 +Ref: 112d13769582 +Ref: c-api/typeobj c PyTypeObject tp_iternext13770105 +Ref: 112e13770105 +Ref: c-api/typeobj c PyTypeObject tp_methods13770944 +Ref: 426913770944 +Ref: c-api/typeobj c PyTypeObject tp_members13771475 +Ref: 426713771475 +Ref: c-api/typeobj c PyTypeObject tp_getset13772040 +Ref: 426c13772040 +Ref: c-api/typeobj c PyTypeObject tp_base13772597 +Ref: 427013772597 +Ref: c-api/typeobj c PyTypeObject tp_dict13773914 +Ref: 455413773914 +Ref: c-api/typeobj c PyTypeObject tp_descr_get13774905 +Ref: 477813774905 +Ref: c-api/typeobj c PyTypeObject tp_descr_set13775235 +Ref: 12fc13775235 +Ref: c-api/typeobj c PyTypeObject tp_dictoffset13775660 +Ref: 455b13775660 +Ref: c-api/typeobj c PyTypeObject tp_init13778623 +Ref: 426613778623 +Ref: c-api/typeobj c PyTypeObject tp_alloc13780082 +Ref: 426513780082 +Ref: c-api/typeobj c PyTypeObject tp_new13780791 +Ref: 426013780791 +Ref: c-api/typeobj c PyTypeObject tp_free13782537 +Ref: 426413782537 +Ref: c-api/typeobj c PyTypeObject tp_is_gc13783244 +Ref: 477913783244 +Ref: c-api/typeobj c PyTypeObject tp_bases13784428 +Ref: 477a13784428 +Ref: c-api/typeobj c PyTypeObject tp_mro13784699 +Ref: 455513784699 +Ref: c-api/typeobj c PyTypeObject tp_cache13785039 +Ref: 455613785039 +Ref: c-api/typeobj c PyTypeObject tp_subclasses13785199 +Ref: 455713785199 +Ref: c-api/typeobj c PyTypeObject tp_weaklist13785405 +Ref: 455813785405 +Ref: c-api/typeobj c PyTypeObject tp_del13785647 +Ref: 477b13785647 +Ref: c-api/typeobj c PyTypeObject tp_version_tag13785787 +Ref: 477c13785787 +Ref: c-api/typeobj c PyTypeObject tp_finalize13785973 +Ref: 70213785973 +Ref: c-api/typeobj c PyTypeObject tp_vectorcall13788268 +Ref: 455913788268 +Ref: PyTypeObject Slots-Footnote-113788831 +Ref: PyTypeObject Slots-Footnote-213788873 +Ref: PyTypeObject Slots-Footnote-313788915 +Ref: PyTypeObject Slots-Footnote-413788958 +Node: Static Types13789000 +Ref: c-api/typeobj id413789110 +Ref: 47c913789110 +Ref: c-api/typeobj static-types13789110 +Ref: 35413789110 +Node: Heap Types13790018 +Ref: c-api/typeobj heap-types13790101 +Ref: 5b713790101 +Ref: c-api/typeobj id513790101 +Ref: 47ca13790101 +Node: Number Object Structures13790572 +Ref: c-api/typeobj number-object-structures13790720 +Ref: 47cb13790720 +Ref: c-api/typeobj number-structs13790720 +Ref: 47b913790720 +Ref: c-api/typeobj c PyNumberMethods13790785 +Ref: 108113790785 +Ref: c-api/typeobj c PyNumberMethods nb_add13793233 +Ref: 454913793233 +Ref: c-api/typeobj c PyNumberMethods nb_subtract13793307 +Ref: 478413793307 +Ref: c-api/typeobj c PyNumberMethods nb_multiply13793396 +Ref: 478613793396 +Ref: c-api/typeobj c PyNumberMethods nb_remainder13793485 +Ref: 478813793485 +Ref: c-api/typeobj c PyNumberMethods nb_divmod13793575 +Ref: 478a13793575 +Ref: c-api/typeobj c PyNumberMethods nb_power13793662 +Ref: 478b13793662 +Ref: c-api/typeobj c PyNumberMethods nb_negative13793749 +Ref: 478d13793749 +Ref: c-api/typeobj c PyNumberMethods nb_positive13793837 +Ref: 478e13793837 +Ref: c-api/typeobj c PyNumberMethods nb_absolute13793925 +Ref: 478f13793925 +Ref: c-api/typeobj c PyNumberMethods nb_bool13794013 +Ref: 479013794013 +Ref: c-api/typeobj c PyNumberMethods nb_invert13794085 +Ref: 479113794085 +Ref: c-api/typeobj c PyNumberMethods nb_lshift13794171 +Ref: 479213794171 +Ref: c-api/typeobj c PyNumberMethods nb_rshift13794258 +Ref: 479413794258 +Ref: c-api/typeobj c PyNumberMethods nb_and13794345 +Ref: 479613794345 +Ref: c-api/typeobj c PyNumberMethods nb_xor13794419 +Ref: 479813794419 +Ref: c-api/typeobj c PyNumberMethods nb_or13794493 +Ref: 479a13794493 +Ref: c-api/typeobj c PyNumberMethods nb_int13794566 +Ref: 479c13794566 +Ref: c-api/typeobj c PyNumberMethods nb_reserved13794639 +Ref: 479d13794639 +Ref: c-api/typeobj c PyNumberMethods nb_float13794700 +Ref: 479e13794700 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_add13794785 +Ref: 478313794785 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_subtract13794877 +Ref: 478513794877 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_multiply13794974 +Ref: 478713794974 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_remainder13795071 +Ref: 478913795071 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_power13795169 +Ref: 478c13795169 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_lshift13795264 +Ref: 479313795264 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_rshift13795359 +Ref: 479513795359 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_and13795454 +Ref: 479713795454 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_xor13795546 +Ref: 479913795546 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_or13795638 +Ref: 479b13795638 +Ref: c-api/typeobj c PyNumberMethods nb_floor_divide13795729 +Ref: 479f13795729 +Ref: c-api/typeobj c PyNumberMethods nb_true_divide13795822 +Ref: 47a113795822 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_floor_divide13795914 +Ref: 47a013795914 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_true_divide13796015 +Ref: 47a213796015 +Ref: c-api/typeobj c PyNumberMethods nb_index13796115 +Ref: 47a313796115 +Ref: c-api/typeobj c PyNumberMethods nb_matrix_multiply13796200 +Ref: 47a413796200 +Ref: c-api/typeobj c PyNumberMethods nb_inplace_matrix_multiply13796296 +Ref: 47a513796296 +Node: Mapping Object Structures13796400 +Ref: c-api/typeobj mapping-object-structures13796559 +Ref: 47cc13796559 +Ref: c-api/typeobj mapping-structs13796559 +Ref: 47bb13796559 +Ref: c-api/typeobj c PyMappingMethods13796626 +Ref: 428913796626 +Ref: c-api/typeobj c PyMappingMethods mp_length13796798 +Ref: 47a613796798 +Ref: c-api/typeobj c PyMappingMethods mp_subscript13797088 +Ref: 133413797088 +Ref: c-api/typeobj c PyMappingMethods mp_ass_subscript13797482 +Ref: 47a713797482 +Node: Sequence Object Structures13797957 +Ref: c-api/typeobj sequence-object-structures13798116 +Ref: 47cd13798116 +Ref: c-api/typeobj sequence-structs13798116 +Ref: 47ba13798116 +Ref: c-api/typeobj c PySequenceMethods13798185 +Ref: 428813798185 +Ref: c-api/typeobj c PySequenceMethods sq_length13798336 +Ref: 455313798336 +Ref: c-api/typeobj c PySequenceMethods sq_concat13798676 +Ref: 47a813798676 +Ref: c-api/typeobj c PySequenceMethods sq_repeat13798977 +Ref: 47a913798977 +Ref: c-api/typeobj c PySequenceMethods sq_item13799292 +Ref: 133313799292 +Ref: c-api/typeobj c PySequenceMethods sq_ass_item13800033 +Ref: 47aa13800033 +Ref: c-api/typeobj c PySequenceMethods sq_contains13800522 +Ref: 47ab13800522 +Ref: c-api/typeobj c PySequenceMethods sq_inplace_concat13800859 +Ref: 47ac13800859 +Ref: c-api/typeobj c PySequenceMethods sq_inplace_repeat13801408 +Ref: 47ad13801408 +Node: Buffer Object Structures13801970 +Ref: c-api/typeobj buffer-object-structures13802127 +Ref: 47ce13802127 +Ref: c-api/typeobj buffer-structs13802127 +Ref: 451213802127 +Ref: c-api/typeobj c PyBufferProcs13802192 +Ref: 455c13802192 +Ref: c-api/typeobj c PyBufferProcs bf_getbuffer13802427 +Ref: 33313802427 +Ref: c-api/typeobj c PyBufferProcs bf_releasebuffer13804313 +Ref: 33413804313 +Node: Async Object Structures13805453 +Ref: c-api/typeobj async-object-structures13805602 +Ref: 47cf13805602 +Ref: c-api/typeobj async-structs13805602 +Ref: 47b813805602 +Ref: c-api/typeobj c PyAsyncMethods13805686 +Ref: 455213805686 +Ref: c-api/typeobj c PyAsyncMethods am_await13806103 +Ref: 477e13806103 +Ref: c-api/typeobj c PyAsyncMethods am_aiter13806482 +Ref: 477f13806482 +Ref: c-api/typeobj c PyAsyncMethods am_anext13806859 +Ref: 478013806859 +Ref: c-api/typeobj c PyAsyncMethods am_send13807150 +Ref: 478113807150 +Node: Slot Type typedefs13807464 +Ref: c-api/typeobj id613807601 +Ref: 47b113807601 +Ref: c-api/typeobj slot-type-typedefs13807601 +Ref: 47d013807601 +Ref: c-api/typeobj c allocfunc13807654 +Ref: 445c13807654 +Ref: c-api/typeobj c destructor13808706 +Ref: 446013808706 +Ref: c-api/typeobj c freefunc13808812 +Ref: 462f13808812 +Ref: c-api/typeobj c newfunc13808888 +Ref: 446913808888 +Ref: c-api/typeobj c initproc13809089 +Ref: 446513809089 +Ref: c-api/typeobj c reprfunc13809274 +Ref: 446c13809274 +Ref: c-api/typeobj c getattrfunc13809431 +Ref: 446113809431 +Ref: c-api/typeobj c setattrfunc13809644 +Ref: 446e13809644 +Ref: c-api/typeobj c getattrofunc13809936 +Ref: 446213809936 +Ref: c-api/typeobj c setattrofunc13810201 +Ref: 446f13810201 +Ref: c-api/typeobj c descrgetfunc13810545 +Ref: 445e13810545 +Ref: c-api/typeobj c descrsetfunc13810762 +Ref: 445f13810762 +Ref: c-api/typeobj c hashfunc13810961 +Ref: 446413810961 +Ref: c-api/typeobj c richcmpfunc13811096 +Ref: 446d13811096 +Ref: c-api/typeobj c getiterfunc13811296 +Ref: 446313811296 +Ref: c-api/typeobj c iternextfunc13811456 +Ref: 446713811456 +Ref: c-api/typeobj c lenfunc13811621 +Ref: 446813811621 +Ref: c-api/typeobj c getbufferproc13811752 +Ref: 47ae13811752 +Ref: c-api/typeobj c releasebufferproc13811856 +Ref: 47af13811856 +Ref: c-api/typeobj c unaryfunc13811960 +Ref: 447413811960 +Ref: c-api/typeobj c binaryfunc13812092 +Ref: 445d13812092 +Ref: c-api/typeobj c sendfunc13812248 +Ref: 478213812248 +Ref: c-api/typeobj c ternaryfunc13812428 +Ref: 447213812428 +Ref: c-api/typeobj c ssizeargfunc13812608 +Ref: 447013812608 +Ref: c-api/typeobj c ssizeobjargproc13812767 +Ref: 447113812767 +Ref: c-api/typeobj c objobjproc13812911 +Ref: 446b13812911 +Ref: c-api/typeobj c objobjargproc13813049 +Ref: 446a13813049 +Node: Examples<39>13813213 +Ref: c-api/typeobj examples13813363 +Ref: 47d113813363 +Ref: c-api/typeobj typedef-examples13813363 +Ref: 476f13813363 +Node: Supporting Cyclic Garbage Collection13818827 +Ref: c-api/gcsupport doc13818950 +Ref: 47d213818950 +Ref: c-api/gcsupport supporting-cycle-detection13818950 +Ref: 47be13818950 +Ref: c-api/gcsupport supporting-cyclic-garbage-collection13818950 +Ref: 47d313818950 +Ref: c-api/gcsupport c PyObject_GC_New13821312 +Ref: 6fe13821312 +Ref: c-api/gcsupport c PyObject_GC_NewVar13821505 +Ref: 6ff13821505 +Ref: c-api/gcsupport c PyObject_GC_Resize13821731 +Ref: 47d413821731 +Ref: c-api/gcsupport c PyObject_GC_Track13822004 +Ref: 113f13822004 +Ref: c-api/gcsupport c PyObject_IS_GC13822442 +Ref: 5da13822442 +Ref: c-api/gcsupport c PyObject_GC_IsTracked13822693 +Ref: 5cb13822693 +Ref: c-api/gcsupport c PyObject_GC_IsFinalized13823072 +Ref: 5cc13823072 +Ref: c-api/gcsupport c PyObject_GC_Del13823455 +Ref: 113e13823455 +Ref: c-api/gcsupport c PyObject_GC_UnTrack13823669 +Ref: 114013823669 +Ref: c-api/gcsupport c visitproc13824389 +Ref: 447513824389 +Ref: c-api/gcsupport c traverseproc13825004 +Ref: 447313825004 +Ref: c-api/gcsupport c Py_VISIT13825815 +Ref: 426e13825815 +Ref: c-api/gcsupport c inquiry13826397 +Ref: 446613826397 +Node: Controlling the Garbage Collector State13826983 +Ref: c-api/gcsupport controlling-the-garbage-collector-state13827095 +Ref: 47d513827095 +Ref: c-api/gcsupport c PyGC_Collect13827281 +Ref: 5e413827281 +Ref: c-api/gcsupport c PyGC_Enable13827848 +Ref: 4d513827848 +Ref: c-api/gcsupport c PyGC_Disable13828118 +Ref: 4d613828118 +Ref: c-api/gcsupport c PyGC_IsEnabled13828390 +Ref: 4d713828390 +Node: API and ABI Versioning13828682 +Ref: c-api/apiabiversion doc13828808 +Ref: 47d613828808 +Ref: c-api/apiabiversion api-and-abi-versioning13828808 +Ref: 47d713828808 +Ref: c-api/apiabiversion apiabiversion13828808 +Ref: 3bcd13828808 +Ref: c-api/apiabiversion c PY_MAJOR_VERSION13829131 +Ref: 47d813829131 +Ref: c-api/apiabiversion c PY_MINOR_VERSION13829198 +Ref: 47d913829198 +Ref: c-api/apiabiversion c PY_MICRO_VERSION13829265 +Ref: 47da13829265 +Ref: c-api/apiabiversion c PY_RELEASE_LEVEL13829332 +Ref: 47db13829332 +Ref: c-api/apiabiversion c PY_RELEASE_SERIAL13829514 +Ref: 47dc13829514 +Ref: c-api/apiabiversion c PY_VERSION_HEX13829608 +Ref: 32613829608 +Ref: c-api/apiabiversion c Py_Version13831433 +Ref: 32513831433 +Ref: API and ABI Versioning-Footnote-113831871 +Node: Distributing Python Modules13831944 +Ref: distributing/index doc13832083 +Ref: 47dd13832083 +Ref: distributing/index distributing-index13832083 +Ref: b8613832083 +Ref: distributing/index distributing-python-modules13832083 +Ref: 47de13832083 +Node: Key terms13833264 +Ref: distributing/index key-terms13833385 +Ref: 47df13833385 +Ref: Key terms-Footnote-113835323 +Ref: Key terms-Footnote-213835348 +Ref: Key terms-Footnote-313835377 +Ref: Key terms-Footnote-413835409 +Ref: Key terms-Footnote-513835445 +Ref: Key terms-Footnote-613835498 +Ref: Key terms-Footnote-713835536 +Ref: Key terms-Footnote-813835589 +Node: Open source licensing and collaboration13835631 +Ref: distributing/index open-source-licensing-and-collaboration13835781 +Ref: 47e013835781 +Ref: distributing/index wheel13835781 +Ref: 47e113835781 +Node: Installing the tools13836799 +Ref: distributing/index installing-the-tools13836979 +Ref: 47e213836979 +Ref: Installing the tools-Footnote-113837879 +Node: Reading the Python Packaging User Guide13837977 +Ref: distributing/index publishing-python-packages13838130 +Ref: 47e313838130 +Ref: distributing/index reading-the-python-packaging-user-guide13838130 +Ref: 47e413838130 +Ref: Reading the Python Packaging User Guide-Footnote-113838533 +Ref: Reading the Python Packaging User Guide-Footnote-213838627 +Ref: Reading the Python Packaging User Guide-Footnote-313838722 +Ref: Reading the Python Packaging User Guide-Footnote-413838826 +Node: How do I…?13838886 +Ref: distributing/index how-do-i13839010 +Ref: 47e513839010 +Ref: distributing/index the-pypirc-file13839010 +Ref: 47e613839010 +Node: … choose a name for my project?13839197 +Ref: distributing/index choose-a-name-for-my-project13839332 +Ref: 47e713839332 +Node: … create and distribute binary extensions?13839907 +Ref: distributing/index create-and-distribute-binary-extensions13840042 +Ref: 47e813840042 +Ref: … create and distribute binary extensions?-Footnote-113840464 +Node: Installing Python Modules13840537 +Ref: installing/index doc13840660 +Ref: 47e913840660 +Ref: installing/index installing-index13840660 +Ref: b8513840660 +Ref: installing/index installing-python-modules13840660 +Ref: 47ea13840660 +Node: Key terms<2>13841798 +Ref: installing/index key-terms13841892 +Ref: 47eb13841892 +Ref: Key terms<2>-Footnote-113844016 +Ref: Key terms<2>-Footnote-213844041 +Ref: Key terms<2>-Footnote-313844070 +Ref: Key terms<2>-Footnote-413844102 +Ref: Key terms<2>-Footnote-513844138 +Node: Basic usage13844218 +Ref: installing/index basic-usage13844334 +Ref: 47ec13844334 +Ref: Basic usage-Footnote-113845985 +Ref: Basic usage-Footnote-213846022 +Node: How do I …?13846071 +Ref: installing/index how-do-i13846201 +Ref: 47ed13846201 +Node: … install pip in versions of Python prior to Python 3 4?13846590 +Ref: installing/index install-pip-in-versions-of-python-prior-to-python-3-413846754 +Ref: 47ee13846754 +Ref: … install pip in versions of Python prior to Python 3 4?-Footnote-113847186 +Node: … install packages just for the current user?13847273 +Ref: installing/index install-packages-just-for-the-current-user13847485 +Ref: 47ef13847485 +Node: … install scientific Python packages?13847747 +Ref: installing/index install-scientific-python-packages13847965 +Ref: 47f013847965 +Ref: … install scientific Python packages?-Footnote-113848471 +Ref: … install scientific Python packages?-Footnote-213848517 +Node: … work with multiple versions of Python installed in parallel?13848563 +Ref: installing/index work-with-multiple-versions-of-python-installed-in-parallel13848725 +Ref: 47f113848725 +Node: Common installation issues13849697 +Ref: installing/index common-installation-issues13849807 +Ref: 47f213849807 +Node: Installing into the system Python on Linux13849982 +Ref: installing/index installing-into-the-system-python-on-linux13850113 +Ref: 47f313850113 +Node: Pip not installed13850680 +Ref: installing/index pip-not-installed13850848 +Ref: 47f413850848 +Ref: Pip not installed-Footnote-113851122 +Node: Installing binary extensions13851248 +Ref: installing/index installing-binary-extensions13851365 +Ref: 47f513851365 +Ref: Installing binary extensions-Footnote-113852255 +Ref: Installing binary extensions-Footnote-213852301 +Node: Python HOWTOs13852350 +Ref: howto/index doc13852479 +Ref: 47f613852479 +Ref: howto/index python-howtos13852479 +Ref: 47f713852479 +Node: Porting Python 2 Code to Python 313853431 +Ref: howto/pyporting doc13853560 +Ref: 47f813853560 +Ref: howto/pyporting porting-python-2-code-to-python-313853560 +Ref: 47f913853560 +Ref: howto/pyporting pyporting-howto13853560 +Ref: f8d13853560 +Ref: Porting Python 2 Code to Python 3-Footnote-113854432 +Ref: Porting Python 2 Code to Python 3-Footnote-213854536 +Ref: Porting Python 2 Code to Python 3-Footnote-313854582 +Node: The Short Explanation13854640 +Ref: howto/pyporting the-short-explanation13854747 +Ref: 47fa13854747 +Ref: The Short Explanation-Footnote-113856250 +Ref: The Short Explanation-Footnote-213856292 +Ref: The Short Explanation-Footnote-313856352 +Ref: The Short Explanation-Footnote-413856401 +Ref: The Short Explanation-Footnote-513856441 +Ref: The Short Explanation-Footnote-613856489 +Ref: The Short Explanation-Footnote-713856526 +Node: Details13856556 +Ref: howto/pyporting details13856663 +Ref: 47fb13856663 +Node: Drop support for Python 2 6 and older13858139 +Ref: howto/pyporting drop-support-for-python-2-6-and-older13858299 +Ref: 47fc13858299 +Ref: Drop support for Python 2 6 and older-Footnote-113859634 +Ref: Drop support for Python 2 6 and older-Footnote-213859671 +Node: Make sure you specify the proper version support in your setup py file13859711 +Ref: howto/pyporting make-sure-you-specify-the-proper-version-support-in-your-setup-py-file13859903 +Ref: 47fd13859903 +Ref: Make sure you specify the proper version support in your setup py file-Footnote-113860505 +Node: Have good test coverage13860542 +Ref: howto/pyporting have-good-test-coverage13860739 +Ref: 47fe13860739 +Ref: Have good test coverage-Footnote-113861425 +Node: Learn the differences between Python 2 & 313861467 +Ref: howto/pyporting learn-the-differences-between-python-2-313861610 +Ref: 47ff13861610 +Ref: Learn the differences between Python 2 & 3-Footnote-113862275 +Ref: Learn the differences between Python 2 & 3-Footnote-213862310 +Node: Update your code13862367 +Ref: howto/pyporting update-your-code13862520 +Ref: 480013862520 +Ref: Update your code-Footnote-113864796 +Ref: Update your code-Footnote-213864856 +Ref: Update your code-Footnote-313864905 +Ref: Update your code-Footnote-413864965 +Ref: Update your code-Footnote-513865014 +Node: Division13865051 +Ref: howto/pyporting division13865144 +Ref: 480113865144 +Node: Text versus binary data13866200 +Ref: howto/pyporting text-versus-binary-data13866352 +Ref: 480213866352 +Ref: Text versus binary data-Footnote-113872867 +Node: Use feature detection instead of version detection13872904 +Ref: howto/pyporting use-feature-detection-instead-of-version-detection13873039 +Ref: 480313873039 +Ref: Use feature detection instead of version detection-Footnote-113874742 +Node: Prevent compatibility regressions13874786 +Ref: howto/pyporting prevent-compatibility-regressions13874943 +Ref: 480413874943 +Ref: Prevent compatibility regressions-Footnote-113876285 +Ref: Prevent compatibility regressions-Footnote-213876325 +Ref: Prevent compatibility regressions-Footnote-313876374 +Node: Check which dependencies block your transition13876434 +Ref: howto/pyporting check-which-dependencies-block-your-transition13876633 +Ref: 480513876633 +Ref: Check which dependencies block your transition-Footnote-113877495 +Node: Update your setup py file to denote Python 3 compatibility13877543 +Ref: howto/pyporting update-your-setup-py-file-to-denote-python-3-compatibility13877754 +Ref: 480613877754 +Node: Use continuous integration to stay compatible13878268 +Ref: howto/pyporting use-continuous-integration-to-stay-compatible13878477 +Ref: 480713878477 +Ref: Use continuous integration to stay compatible-Footnote-113879789 +Node: Consider using optional static type checking13879826 +Ref: howto/pyporting consider-using-optional-static-type-checking13879968 +Ref: 480813879968 +Ref: Consider using optional static type checking-Footnote-113880749 +Ref: Consider using optional static type checking-Footnote-213880779 +Node: Porting Extension Modules to Python 313880820 +Ref: howto/cporting doc13880988 +Ref: 480913880988 +Ref: howto/cporting cporting-howto13880988 +Ref: f8713880988 +Ref: howto/cporting porting-extension-modules-to-python-313880988 +Ref: 480a13880988 +Ref: howto/cporting why-python-3-exists13880988 +Ref: 480b13880988 +Ref: Porting Extension Modules to Python 3-Footnote-113881770 +Ref: Porting Extension Modules to Python 3-Footnote-213881821 +Ref: Porting Extension Modules to Python 3-Footnote-313881878 +Ref: Porting Extension Modules to Python 3-Footnote-413881906 +Node: Curses Programming with Python13881953 +Ref: howto/curses doc13882110 +Ref: 480c13882110 +Ref: howto/curses cffi13882110 +Ref: 480d13882110 +Ref: howto/curses curses-howto13882110 +Ref: 275c13882110 +Ref: howto/curses curses-programming-with-python13882110 +Ref: 480e13882110 +Node: What is curses?13882521 +Ref: howto/curses what-is-curses13882652 +Ref: 480f13882652 +Ref: What is curses?-Footnote-113885010 +Ref: What is curses?-Footnote-213885050 +Node: The Python curses module13885093 +Ref: howto/curses the-python-curses-module13885169 +Ref: 481013885169 +Node: Starting and ending a curses application13885998 +Ref: howto/curses starting-and-ending-a-curses-application13886154 +Ref: 481113886154 +Node: Windows and Pads13889419 +Ref: howto/curses windows-and-pads13889575 +Ref: 481213889575 +Node: Displaying Text13894121 +Ref: howto/curses displaying-text13894247 +Ref: 481313894247 +Node: Attributes and Color13898024 +Ref: howto/curses attributes-and-color13898096 +Ref: 481413898096 +Node: User Input13902656 +Ref: howto/curses user-input13902786 +Ref: 481513902786 +Ref: User Input-Footnote-113906590 +Node: For More Information13906630 +Ref: howto/curses for-more-information13906736 +Ref: 481613906736 +Ref: For More Information-Footnote-113908235 +Ref: For More Information-Footnote-213908272 +Ref: For More Information-Footnote-313908336 +Ref: For More Information-Footnote-413908380 +Ref: For More Information-Footnote-513908442 +Ref: For More Information-Footnote-613908494 +Node: Descriptor HowTo Guide13908565 +Ref: howto/descriptor doc13908695 +Ref: 481713908695 +Ref: howto/descriptor descriptor-howto-guide13908695 +Ref: 481813908695 +Ref: howto/descriptor descriptorhowto13908695 +Ref: 481913908695 +Node: Primer13909863 +Ref: howto/descriptor primer13909963 +Ref: 481a13909963 +Node: Simple example A descriptor that returns a constant13910309 +Ref: howto/descriptor simple-example-a-descriptor-that-returns-a-constant13910427 +Ref: 481b13910427 +Node: Dynamic lookups13911891 +Ref: howto/descriptor dynamic-lookups13912036 +Ref: 481c13912036 +Node: Managed attributes13913434 +Ref: howto/descriptor managed-attributes13913544 +Ref: 481d13913544 +Node: Customized names13916187 +Ref: howto/descriptor customized-names13916298 +Ref: 481e13916298 +Node: Closing thoughts13918633 +Ref: howto/descriptor closing-thoughts13918717 +Ref: 481f13918717 +Node: Complete Practical Example13920085 +Ref: howto/descriptor complete-practical-example13920212 +Ref: 482013920212 +Node: Validator class13920477 +Ref: howto/descriptor validator-class13920581 +Ref: 482113920581 +Node: Custom validators13921608 +Ref: howto/descriptor custom-validators13921742 +Ref: 482213921742 +Ref: Custom validators-Footnote-113924335 +Node: Practical application13924404 +Ref: howto/descriptor practical-application13924514 +Ref: 482313924514 +Node: Technical Tutorial13925903 +Ref: howto/descriptor technical-tutorial13926047 +Ref: 482413926047 +Node: Abstract13926481 +Ref: howto/descriptor abstract13926580 +Ref: 482513926580 +Node: Definition and introduction13926897 +Ref: howto/descriptor definition-and-introduction13927024 +Ref: 482613927024 +Node: Descriptor protocol13928248 +Ref: howto/descriptor descriptor-protocol13928400 +Ref: 482713928400 +Node: Overview of descriptor invocation13929663 +Ref: howto/descriptor overview-of-descriptor-invocation13929815 +Ref: 482813929815 +Node: Invocation from an instance13930452 +Ref: howto/descriptor invocation-from-an-instance13930608 +Ref: 482913930608 +Node: Invocation from a class13933085 +Ref: howto/descriptor invocation-from-a-class13933229 +Ref: 482a13933229 +Ref: Invocation from a class-Footnote-113933805 +Node: Invocation from super13933878 +Ref: howto/descriptor invocation-from-super13934022 +Ref: 482b13934022 +Ref: Invocation from super-Footnote-113934654 +Ref: Invocation from super-Footnote-213934727 +Node: Summary of invocation logic13934807 +Ref: howto/descriptor summary-of-invocation-logic13934955 +Ref: 482c13934955 +Node: Automatic name notification13935933 +Ref: howto/descriptor automatic-name-notification13936071 +Ref: 482d13936071 +Ref: Automatic name notification-Footnote-113936946 +Node: ORM example13937019 +Ref: howto/descriptor orm-example13937121 +Ref: 482e13937121 +Ref: ORM example-Footnote-113939136 +Ref: ORM example-Footnote-213939208 +Node: Pure Python Equivalents13939261 +Ref: howto/descriptor pure-python-equivalents13939370 +Ref: 482f13939370 +Node: Properties13939845 +Ref: howto/descriptor properties13939945 +Ref: 483013939945 +Node: Functions and methods13943076 +Ref: howto/descriptor functions-and-methods13943201 +Ref: 483113943201 +Node: Kinds of methods13945881 +Ref: howto/descriptor kinds-of-methods13946010 +Ref: 483213946010 +Node: Static methods13947247 +Ref: howto/descriptor static-methods13947368 +Ref: 483313947368 +Node: Class methods13949078 +Ref: howto/descriptor class-methods13949211 +Ref: 483413949211 +Node: Member objects and __slots__13951520 +Ref: howto/descriptor member-objects-and-slots13951630 +Ref: 483513951630 +Ref: Member objects and __slots__-Footnote-113959256 +Node: Enum HOWTO13959312 +Ref: howto/enum doc13959440 +Ref: 483613959440 +Ref: howto/enum enum-howto13959440 +Ref: 483713959440 +Ref: howto/enum enum-basic-tutorial13959473 +Ref: 1ff013959473 +Node: Programmatic access to enumeration members and their attributes13965190 +Ref: howto/enum enum-advanced-tutorial13965344 +Ref: 1ff113965344 +Ref: howto/enum programmatic-access-to-enumeration-members-and-their-attributes13965344 +Ref: 483813965344 +Node: Duplicating enum members and values13966098 +Ref: howto/enum duplicating-enum-members-and-values13966295 +Ref: 483913966295 +Node: Ensuring unique enumeration values13967525 +Ref: howto/enum ensuring-unique-enumeration-values13967681 +Ref: 483a13967681 +Node: Using automatic values13968237 +Ref: howto/enum using-automatic-values13968370 +Ref: 483b13968370 +Node: Iteration<2>13969269 +Ref: howto/enum iteration13969382 +Ref: 483c13969382 +Node: Comparisons<3>13970240 +Ref: howto/enum comparisons13970377 +Ref: 483d13970377 +Node: Allowed members and attributes of enumerations13971297 +Ref: howto/enum allowed-members-and-attributes-of-enumerations13971449 +Ref: 483f13971449 +Node: Restricted Enum subclassing13973256 +Ref: howto/enum restricted-enum-subclassing13973402 +Ref: 484213973402 +Node: Pickling13974518 +Ref: howto/enum pickling13974635 +Ref: 484413974635 +Node: Functional API<2>13975266 +Ref: howto/enum functional-api13975376 +Ref: 484013975376 +Node: Derived Enumerations13978688 +Ref: howto/enum derived-enumerations13978821 +Ref: 484513978821 +Node: IntEnum13978946 +Ref: howto/enum intenum13979026 +Ref: 483e13979026 +Node: StrEnum13980153 +Ref: howto/enum strenum13980249 +Ref: 484613980249 +Node: IntFlag13980556 +Ref: howto/enum intflag13980649 +Ref: 484713980649 +Node: Flag13982992 +Ref: howto/enum flag13983084 +Ref: 484813983084 +Node: Others13985373 +Ref: howto/enum others13985449 +Ref: 484913985449 +Node: When to use __new__ vs __init__13987298 +Ref: howto/enum when-to-use-new-vs-init13987438 +Ref: 484a13987438 +Node: Finer Points13988556 +Ref: howto/enum finer-points13988636 +Ref: 484b13988636 +Node: Supported __dunder__ names<2>13989045 +Ref: howto/enum supported-dunder-names13989159 +Ref: 484c13989159 +Node: Supported _sunder_ names<2>13989576 +Ref: howto/enum supported-sunder-names13989714 +Ref: 484d13989714 +Node: _Private__names13991533 +Ref: howto/enum private-names13991658 +Ref: 484e13991658 +Node: Enum member type13991830 +Ref: howto/enum enum-member-type13991981 +Ref: 484f13991981 +Node: Creating members that are mixed with other data types13992645 +Ref: howto/enum creating-members-that-are-mixed-with-other-data-types13992822 +Ref: 485013992822 +Node: Boolean value of Enum classes and members13993359 +Ref: howto/enum boolean-value-of-enum-classes-and-members13993545 +Ref: 485113993545 +Node: Enum classes with methods13994112 +Ref: howto/enum enum-classes-with-methods13994270 +Ref: 485213994270 +Node: Combining members of Flag13994812 +Ref: howto/enum combining-members-of-flag13994953 +Ref: 485313994953 +Node: Flag and IntFlag minutia13995517 +Ref: howto/enum flag-and-intflag-minutia13995624 +Ref: 485413995624 +Node: How are Enums different?13998033 +Ref: howto/enum enum-class-differences13998173 +Ref: 1ff313998173 +Ref: howto/enum how-are-enums-different13998173 +Ref: 485513998173 +Node: Enum Classes13998540 +Ref: howto/enum enum-classes13998648 +Ref: 485613998648 +Node: Enum Members aka instances13999200 +Ref: howto/enum enum-members-aka-instances13999332 +Ref: 485713999332 +Ref: howto/enum enum-cookbook13999714 +Ref: 1ff213999714 +Node: Omitting values14000024 +Ref: howto/enum omitting-values14000155 +Ref: 485814000155 +Node: Using auto14000945 +Ref: howto/enum using-auto14001028 +Ref: 485914001028 +Node: Using object14001282 +Ref: howto/enum using-object14001400 +Ref: 485a14001400 +Node: Using a descriptive string14002049 +Ref: howto/enum using-a-descriptive-string14002179 +Ref: 485b14002179 +Node: Using a custom __new__14002468 +Ref: howto/enum using-a-custom-new14002577 +Ref: 485c14002577 +Node: OrderedEnum14004220 +Ref: howto/enum orderedenum14004342 +Ref: 484314004342 +Node: DuplicateFreeEnum14005524 +Ref: howto/enum duplicatefreeenum14005637 +Ref: 485d14005637 +Node: Planet14006716 +Ref: howto/enum planet14006828 +Ref: 484114006828 +Node: TimePeriod14007881 +Ref: howto/enum enum-time-period14007967 +Ref: 200314007967 +Ref: howto/enum timeperiod14007967 +Ref: 485e14007967 +Node: Subclassing EnumType14008584 +Ref: howto/enum enumtype-examples14008684 +Ref: 1ff814008684 +Ref: howto/enum subclassing-enumtype14008684 +Ref: 485f14008684 +Node: Functional Programming HOWTO14008950 +Ref: howto/functional doc14009069 +Ref: 486014009069 +Ref: howto/functional functional-programming-howto14009069 +Ref: 486114009069 +Node: Introduction<13>14009880 +Ref: howto/functional introduction14009982 +Ref: 486214009982 +Node: Formal provability14014682 +Ref: howto/functional formal-provability14014772 +Ref: 486414014772 +Node: Modularity14016688 +Ref: howto/functional modularity14016816 +Ref: 486514016816 +Node: Ease of debugging and testing14017223 +Ref: howto/functional ease-of-debugging-and-testing14017346 +Ref: 486614017346 +Node: Composability14018083 +Ref: howto/functional composability14018187 +Ref: 486714018187 +Node: Iterators<2>14018912 +Ref: howto/functional functional-howto-iterators14019068 +Ref: 486314019068 +Ref: howto/functional iterators14019068 +Ref: 486814019068 +Node: Data Types That Support Iterators14022431 +Ref: howto/functional data-types-that-support-iterators14022513 +Ref: 486914022513 +Node: Generator expressions and list comprehensions14024479 +Ref: howto/functional generator-expressions-and-list-comprehensions14024632 +Ref: 486a14024632 +Node: Generators<2>14029191 +Ref: howto/functional generators14029350 +Ref: 486b14029350 +Ref: Generators<2>-Footnote-114033210 +Node: Passing values into a generator14033291 +Ref: howto/functional passing-values-into-a-generator14033372 +Ref: 486c14033372 +Ref: Passing values into a generator-Footnote-114037344 +Node: Built-in functions14037386 +Ref: howto/functional built-in-functions14037520 +Ref: 486d14037520 +Ref: Built-in functions-Footnote-114041564 +Node: The itertools module14041618 +Ref: howto/functional the-itertools-module14041759 +Ref: 486e14041759 +Node: Creating new iterators14042504 +Ref: howto/functional creating-new-iterators14042621 +Ref: 486f14042621 +Node: Calling functions on elements14045306 +Ref: howto/functional calling-functions-on-elements14045450 +Ref: 487014045450 +Node: Selecting elements14046267 +Ref: howto/functional selecting-elements14046411 +Ref: 487114046411 +Node: Combinatoric functions14047903 +Ref: howto/functional combinatoric-functions14048035 +Ref: 487214048035 +Node: Grouping elements14050368 +Ref: howto/functional grouping-elements14050473 +Ref: 487314050473 +Node: The functools module14052025 +Ref: howto/functional the-functools-module14052189 +Ref: 487414052189 +Node: The operator module14055806 +Ref: howto/functional the-operator-module14055882 +Ref: 487514055882 +Node: Small functions and the lambda expression14056696 +Ref: howto/functional small-functions-and-the-lambda-expression14056877 +Ref: 487614056877 +Node: Revision History and Acknowledgements14059736 +Ref: howto/functional revision-history-and-acknowledgements14059910 +Ref: 487714059910 +Node: References<2>14060689 +Ref: howto/functional references14060813 +Ref: 487814060813 +Node: General14060919 +Ref: howto/functional general14061000 +Ref: 487914061000 +Node: Python-specific14061942 +Ref: howto/functional python-specific14062052 +Ref: 487a14062052 +Ref: Python-specific-Footnote-114062528 +Ref: Python-specific-Footnote-214062579 +Ref: Python-specific-Footnote-314062632 +Node: Python documentation14062685 +Ref: howto/functional python-documentation14062779 +Ref: 487b14062779 +Ref: Python documentation-Footnote-114063180 +Ref: Python documentation-Footnote-214063222 +Node: Logging HOWTO14063264 +Ref: howto/logging doc14063389 +Ref: 487c14063389 +Ref: howto/logging logging-howto14063389 +Ref: 487d14063389 +Node: Basic Logging Tutorial14063702 +Ref: howto/logging basic-logging-tutorial14063808 +Ref: 487e14063808 +Ref: howto/logging logging-basic-tutorial14063808 +Ref: ea514063808 +Node: When to use logging14064594 +Ref: howto/logging when-to-use-logging14064697 +Ref: 487f14064697 +Node: A simple example14068589 +Ref: howto/logging a-simple-example14068718 +Ref: 488014068718 +Ref: howto/logging howto-minimal-example14068718 +Ref: 488114068718 +Node: Logging to a file14069505 +Ref: howto/logging logging-to-a-file14069644 +Ref: 488214069644 +Node: Logging from multiple modules14072808 +Ref: howto/logging logging-from-multiple-modules14072952 +Ref: 488314072952 +Node: Logging variable data14074158 +Ref: howto/logging logging-variable-data14074326 +Ref: 488414074326 +Node: Changing the format of displayed messages14075145 +Ref: howto/logging changing-the-format-of-displayed-messages14075320 +Ref: 488514075320 +Node: Displaying the date/time in messages14076316 +Ref: howto/logging displaying-the-date-time-in-messages14076480 +Ref: 488614076480 +Ref: Displaying the date/time in messages-Footnote-114077532 +Node: Next Steps14077591 +Ref: howto/logging next-steps14077705 +Ref: 488714077705 +Node: Advanced Logging Tutorial14078663 +Ref: howto/logging advanced-logging-tutorial14078795 +Ref: 488814078795 +Ref: howto/logging logging-advanced-tutorial14078795 +Ref: ea614078795 +Node: Logging Flow14082186 +Ref: howto/logging logging-flow14082276 +Ref: 488914082276 +Node: Loggers14082473 +Ref: howto/logging loggers14082580 +Ref: 488a14082580 +Node: Handlers14086859 +Ref: howto/logging handler-basic14086964 +Ref: 488b14086964 +Ref: howto/logging handlers14086964 +Ref: 488c14086964 +Node: Formatters14089032 +Ref: howto/logging formatters14089149 +Ref: 488e14089149 +Ref: howto/logging logging logging Formatter __init__14089599 +Ref: 488f14089599 +Node: Configuring Logging14091307 +Ref: howto/logging configuring-logging14091460 +Ref: 489014091460 +Node: What happens if no configuration is provided14098010 +Ref: howto/logging what-happens-if-no-configuration-is-provided14098186 +Ref: 489114098186 +Node: Configuring Logging for a Library14099613 +Ref: howto/logging configuring-logging-for-a-library14099761 +Ref: 489214099761 +Ref: howto/logging library-config14099761 +Ref: 270414099761 +Node: Logging Levels<2>14102630 +Ref: howto/logging logging-levels14102755 +Ref: 489314102755 +Node: Custom Levels14105616 +Ref: howto/logging custom-levels14105683 +Ref: 26d414105683 +Ref: howto/logging id114105683 +Ref: 489414105683 +Node: Useful Handlers14106398 +Ref: howto/logging id214106530 +Ref: 489514106530 +Ref: howto/logging useful-handlers14106530 +Ref: 488d14106530 +Node: Exceptions raised during logging14110538 +Ref: howto/logging exceptions-raised-during-logging14110688 +Ref: 489614110688 +Ref: howto/logging logging-exceptions14110688 +Ref: 489714110688 +Node: Using arbitrary objects as messages14111844 +Ref: howto/logging arbitrary-object-messages14111991 +Ref: 26c414111991 +Ref: howto/logging using-arbitrary-objects-as-messages14111991 +Ref: 489814111991 +Node: Optimization14112605 +Ref: howto/logging optimization14112711 +Ref: 489914112711 +Node: Logging Cookbook14116473 +Ref: howto/logging-cookbook doc14116594 +Ref: 489a14116594 +Ref: howto/logging-cookbook id114116594 +Ref: 489b14116594 +Ref: howto/logging-cookbook logging-cookbook14116594 +Ref: ea714116594 +Node: Using logging in multiple modules14118633 +Ref: howto/logging-cookbook using-logging-in-multiple-modules14118757 +Ref: 489d14118757 +Node: Logging from multiple threads14122331 +Ref: howto/logging-cookbook logging-from-multiple-threads14122496 +Ref: 489e14122496 +Node: Multiple handlers and formatters14124243 +Ref: howto/logging-cookbook multiple-handlers-and-formatters14124407 +Ref: 489f14124407 +Node: Logging to multiple destinations14126570 +Ref: howto/logging-cookbook logging-to-multiple-destinations14126730 +Ref: 48a014126730 +Ref: howto/logging-cookbook multiple-destinations14126730 +Ref: 48a114126730 +Node: Custom handling of levels14129901 +Ref: howto/logging-cookbook custom-handling-of-levels14130057 +Ref: 48a214130057 +Ref: howto/logging-cookbook custom-level-handling14130057 +Ref: 48a314130057 +Node: Configuration server example14135802 +Ref: howto/logging-cookbook configuration-server-example14135958 +Ref: 48a414135958 +Node: Dealing with handlers that block14137520 +Ref: howto/logging-cookbook blocking-handlers14137704 +Ref: 48a514137704 +Ref: howto/logging-cookbook dealing-with-handlers-that-block14137704 +Ref: 48a614137704 +Node: Sending and receiving logging events across a network14141899 +Ref: howto/logging-cookbook network-logging14142107 +Ref: 48a714142107 +Ref: howto/logging-cookbook sending-and-receiving-logging-events-across-a-network14142107 +Ref: 48a814142107 +Node: Running a logging socket listener in production14147637 +Ref: howto/logging-cookbook running-a-logging-socket-listener-in-production14147774 +Ref: 48a914147774 +Ref: Running a logging socket listener in production-Footnote-114148247 +Ref: Running a logging socket listener in production-Footnote-214148279 +Node: Adding contextual information to your logging output14148351 +Ref: howto/logging-cookbook adding-contextual-information-to-your-logging-output14148545 +Ref: 48aa14148545 +Ref: howto/logging-cookbook context-info14148545 +Ref: 26c714148545 +Node: Using LoggerAdapters to impart contextual information14149627 +Ref: howto/logging-cookbook using-loggeradapters-to-impart-contextual-information14149824 +Ref: 48ab14149824 +Node: Using objects other than dicts to pass contextual information14152972 +Ref: howto/logging-cookbook using-objects-other-than-dicts-to-pass-contextual-information14153123 +Ref: 48ac14153123 +Node: Using Filters to impart contextual information14153582 +Ref: howto/logging-cookbook filters-contextual14153779 +Ref: 26bc14153779 +Ref: howto/logging-cookbook using-filters-to-impart-contextual-information14153779 +Ref: 48ad14153779 +Node: Use of contextvars14157584 +Ref: howto/logging-cookbook use-of-contextvars14157769 +Ref: 48ae14157769 +Node: Imparting contextual information in handlers14167340 +Ref: howto/logging-cookbook imparting-contextual-information-in-handlers14167521 +Ref: 48af14167521 +Node: Logging to a single file from multiple processes14168449 +Ref: howto/logging-cookbook logging-to-a-single-file-from-multiple-processes14168631 +Ref: 48b014168631 +Ref: howto/logging-cookbook multiple-processes14168631 +Ref: 48b114168631 +Node: Using concurrent futures ProcessPoolExecutor14179119 +Ref: howto/logging-cookbook using-concurrent-futures-processpoolexecutor14179308 +Ref: 48b214179308 +Node: Deploying Web applications using Gunicorn and uWSGI14180316 +Ref: howto/logging-cookbook deploying-web-applications-using-gunicorn-and-uwsgi14180505 +Ref: 48b314180505 +Ref: Deploying Web applications using Gunicorn and uWSGI-Footnote-114181167 +Ref: Deploying Web applications using Gunicorn and uWSGI-Footnote-214181197 +Node: Using file rotation14181250 +Ref: howto/logging-cookbook using-file-rotation14181424 +Ref: 48b414181424 +Node: Use of alternative formatting styles14183322 +Ref: howto/logging-cookbook format-styles14183469 +Ref: 48b514183469 +Ref: howto/logging-cookbook use-of-alternative-formatting-styles14183469 +Ref: 48b614183469 +Node: Customizing LogRecord14190638 +Ref: howto/logging-cookbook custom-logrecord14190809 +Ref: 48b714190809 +Ref: howto/logging-cookbook customizing-logrecord14190809 +Ref: 48b814190809 +Node: Subclassing QueueHandler - a ZeroMQ example14194722 +Ref: howto/logging-cookbook subclassing-queuehandler-a-zeromq-example14194901 +Ref: 48b914194901 +Ref: howto/logging-cookbook zeromq-handlers14194901 +Ref: 48ba14194901 +Node: Subclassing QueueListener - a ZeroMQ example14196237 +Ref: howto/logging-cookbook subclassing-queuelistener-a-zeromq-example14196436 +Ref: 48bb14196436 +Node: An example dictionary-based configuration14197557 +Ref: howto/logging-cookbook an-example-dictionary-based-configuration14197775 +Ref: 48bc14197775 +Ref: An example dictionary-based configuration-Footnote-114199812 +Ref: An example dictionary-based configuration-Footnote-214199898 +Node: Using a rotator and namer to customize log rotation processing14199984 +Ref: howto/logging-cookbook cookbook-rotator-namer14200198 +Ref: 271114200198 +Ref: howto/logging-cookbook using-a-rotator-and-namer-to-customize-log-rotation-processing14200198 +Ref: 48bd14200198 +Node: A more elaborate multiprocessing example14201083 +Ref: howto/logging-cookbook a-more-elaborate-multiprocessing-example14201309 +Ref: 48be14201309 +Node: Inserting a BOM into messages sent to a SysLogHandler14210937 +Ref: howto/logging-cookbook inserting-a-bom-into-messages-sent-to-a-sysloghandler14211132 +Ref: 48bf14211132 +Ref: Inserting a BOM into messages sent to a SysLogHandler-Footnote-114213299 +Ref: Inserting a BOM into messages sent to a SysLogHandler-Footnote-214213358 +Ref: Inserting a BOM into messages sent to a SysLogHandler-Footnote-314213427 +Ref: Inserting a BOM into messages sent to a SysLogHandler-Footnote-414213486 +Node: Implementing structured logging14213545 +Ref: howto/logging-cookbook implementing-structured-logging14213736 +Ref: 48c014213736 +Node: Customizing handlers with dictConfig14216272 +Ref: howto/logging-cookbook custom-handlers14216472 +Ref: 48c114216472 +Ref: howto/logging-cookbook customizing-handlers-with-dictconfig14216472 +Ref: 48c214216472 +Node: Using particular formatting styles throughout your application14221665 +Ref: howto/logging-cookbook formatting-styles14221869 +Ref: 26b014221869 +Ref: howto/logging-cookbook using-particular-formatting-styles-throughout-your-application14221869 +Ref: 48c314221869 +Node: Using LogRecord factories14223870 +Ref: howto/logging-cookbook using-logrecord-factories14224031 +Ref: 48c414224031 +Node: Using custom message objects14225007 +Ref: howto/logging-cookbook using-custom-message-objects14225168 +Ref: 48c514225168 +Node: Configuring filters with dictConfig14227878 +Ref: howto/logging-cookbook configuring-filters-with-dictconfig14228077 +Ref: 48c614228077 +Ref: howto/logging-cookbook filters-dictconfig14228077 +Ref: 48c714228077 +Node: Customized exception formatting14231042 +Ref: howto/logging-cookbook custom-format-exception14231204 +Ref: 48c814231204 +Ref: howto/logging-cookbook customized-exception-formatting14231204 +Ref: 48c914231204 +Node: Speaking logging messages14233272 +Ref: howto/logging-cookbook speaking-logging-messages14233459 +Ref: 48ca14233459 +Ref: howto/logging-cookbook spoken-messages14233459 +Ref: 48cb14233459 +Node: Buffering logging messages and outputting them conditionally14235627 +Ref: howto/logging-cookbook buffered-logging14235831 +Ref: 48cc14235831 +Ref: howto/logging-cookbook buffering-logging-messages-and-outputting-them-conditionally14235831 +Ref: 48cd14235831 +Node: Sending logging messages to email with buffering14241408 +Ref: howto/logging-cookbook buffered-smtp14241635 +Ref: 48ce14241635 +Ref: howto/logging-cookbook sending-logging-messages-to-email-with-buffering14241635 +Ref: 48cf14241635 +Node: Formatting times using UTC GMT via configuration14245203 +Ref: howto/logging-cookbook formatting-times-using-utc-gmt-via-configuration14245415 +Ref: 48d014245415 +Ref: howto/logging-cookbook utc-formatting14245415 +Ref: 48d114245415 +Node: Using a context manager for selective logging14247317 +Ref: howto/logging-cookbook context-manager14247515 +Ref: 48d214247515 +Ref: howto/logging-cookbook using-a-context-manager-for-selective-logging14247515 +Ref: 48d314247515 +Node: A CLI application starter template14252097 +Ref: howto/logging-cookbook a-cli-application-starter-template14252267 +Ref: 48d414252267 +Ref: howto/logging-cookbook starter-template14252267 +Ref: 48d514252267 +Node: A Qt GUI for logging14258250 +Ref: howto/logging-cookbook a-qt-gui-for-logging14258413 +Ref: 48d614258413 +Ref: howto/logging-cookbook qt-gui14258413 +Ref: 48d714258413 +Ref: A Qt GUI for logging-Footnote-114267780 +Ref: A Qt GUI for logging-Footnote-214267807 +Ref: A Qt GUI for logging-Footnote-314267849 +Node: Logging to syslog with RFC5424 support14267889 +Ref: howto/logging-cookbook logging-to-syslog-with-rfc5424-support14268061 +Ref: 48d814268061 +Ref: Logging to syslog with RFC5424 support-Footnote-114271793 +Ref: Logging to syslog with RFC5424 support-Footnote-214271852 +Node: How to treat a logger like an output stream14271911 +Ref: howto/logging-cookbook how-to-treat-a-logger-like-an-output-stream14272080 +Ref: 48d914272080 +Node: Patterns to avoid14274529 +Ref: howto/logging-cookbook patterns-to-avoid14274675 +Ref: 48da14274675 +Node: Opening the same log file multiple times14275229 +Ref: howto/logging-cookbook opening-the-same-log-file-multiple-times14275400 +Ref: 48db14275400 +Node: Using loggers as attributes in a class or passing them as parameters14277325 +Ref: howto/logging-cookbook using-loggers-as-attributes-in-a-class-or-passing-them-as-parameters14277568 +Ref: 48dc14277568 +Node: Adding handlers other than NullHandler to a logger in a library14278256 +Ref: howto/logging-cookbook adding-handlers-other-than-nullhandler-to-a-logger-in-a-library14278484 +Ref: 48dd14278484 +Node: Creating a lot of loggers14278925 +Ref: howto/logging-cookbook creating-a-lot-of-loggers14279076 +Ref: 48de14279076 +Node: Other resources14279633 +Ref: howto/logging-cookbook cookbook-ref-links14279727 +Ref: 489c14279727 +Ref: howto/logging-cookbook other-resources14279727 +Ref: 48df14279727 +Node: Regular Expression HOWTO14280099 +Ref: howto/regex doc14280231 +Ref: 48e014280231 +Ref: howto/regex regex-howto14280231 +Ref: 1d5514280231 +Ref: howto/regex regular-expression-howto14280231 +Ref: 48e114280231 +Node: Introduction<14>14280728 +Ref: howto/regex introduction14280829 +Ref: 48e214280829 +Node: Simple Patterns14282434 +Ref: howto/regex simple-patterns14282569 +Ref: 48e314282569 +Node: Matching Characters14283064 +Ref: howto/regex matching-characters14283160 +Ref: 48e414283160 +Node: Repeating Things14287811 +Ref: howto/regex repeating-things14287907 +Ref: 48e514287907 +Node: Using Regular Expressions14292854 +Ref: howto/regex using-regular-expressions14292991 +Ref: 48e614292991 +Node: Compiling Regular Expressions14293484 +Ref: howto/regex compiling-regular-expressions14293604 +Ref: 48e714293604 +Node: The Backslash Plague14294821 +Ref: howto/regex id114294968 +Ref: 48e814294968 +Ref: howto/regex the-backslash-plague14294968 +Ref: 48e914294968 +Node: Performing Matches14297854 +Ref: howto/regex performing-matches14297997 +Ref: 48ea14297997 +Ref: Performing Matches-Footnote-114303902 +Node: Module-Level Functions<2>14303975 +Ref: howto/regex module-level-functions14304115 +Ref: 48eb14304115 +Node: Compilation Flags14305315 +Ref: howto/regex compilation-flags14305428 +Ref: 48ec14305428 +Node: More Pattern Power14312612 +Ref: howto/regex more-pattern-power14312751 +Ref: 48ee14312751 +Node: More Metacharacters14313116 +Ref: howto/regex id214313207 +Ref: 48ef14313207 +Ref: howto/regex more-metacharacters14313207 +Ref: 48ed14313207 +Node: Grouping14317860 +Ref: howto/regex grouping14317990 +Ref: 48f014317990 +Node: Non-capturing and Named Groups14321466 +Ref: howto/regex non-capturing-and-named-groups14321597 +Ref: 48f114321597 +Node: Lookahead Assertions14326733 +Ref: howto/regex lookahead-assertions14326847 +Ref: 48f214326847 +Node: Modifying Strings14330514 +Ref: howto/regex modifying-strings14330643 +Ref: 48f314330643 +Node: Splitting Strings14331635 +Ref: howto/regex splitting-strings14331736 +Ref: 48f414331736 +Node: Search and Replace<2>14334054 +Ref: howto/regex search-and-replace14334155 +Ref: 48f514334155 +Node: Common Problems14338643 +Ref: howto/regex common-problems14338762 +Ref: 48f614338762 +Node: Use String Methods14339200 +Ref: howto/regex use-string-methods14339298 +Ref: 48f714339298 +Node: match versus search14341015 +Ref: howto/regex match-versus-search14341146 +Ref: 48f814341146 +Node: Greedy versus Non-Greedy14342774 +Ref: howto/regex greedy-versus-non-greedy14342903 +Ref: 48f914342903 +Node: Using re VERBOSE14344827 +Ref: howto/regex using-re-verbose14344928 +Ref: 48fa14344928 +Node: Feedback14346455 +Ref: howto/regex feedback14346548 +Ref: 48fb14346548 +Node: Socket Programming HOWTO14347331 +Ref: howto/sockets doc14347461 +Ref: 48fc14347461 +Ref: howto/sockets socket-howto14347461 +Ref: 2c9614347461 +Ref: howto/sockets socket-programming-howto14347461 +Ref: 48fd14347461 +Node: Sockets14348061 +Ref: howto/sockets sockets14348155 +Ref: 48fe14348155 +Node: History14349317 +Ref: howto/sockets history14349368 +Ref: 48ff14349368 +Node: Creating a Socket14349945 +Ref: howto/sockets creating-a-socket14350062 +Ref: 490014350062 +Node: IPC14353320 +Ref: howto/sockets ipc14353377 +Ref: 490114353377 +Node: Using a Socket14353825 +Ref: howto/sockets using-a-socket14353948 +Ref: 490214353948 +Node: Binary Data14360089 +Ref: howto/sockets binary-data14360151 +Ref: 490314360151 +Ref: Binary Data-Footnote-114361440 +Node: Disconnecting14361500 +Ref: howto/sockets disconnecting14361626 +Ref: 490414361626 +Node: When Sockets Die14363104 +Ref: howto/sockets when-sockets-die14363170 +Ref: 490514363170 +Node: Non-blocking Sockets14364051 +Ref: howto/sockets non-blocking-sockets14364154 +Ref: 490614364154 +Node: Sorting HOW TO14367977 +Ref: howto/sorting doc14368096 +Ref: 490714368096 +Ref: howto/sorting sorting-how-to14368096 +Ref: 490814368096 +Ref: howto/sorting sortinghowto14368096 +Ref: 1bc714368096 +Node: Sorting Basics14368713 +Ref: howto/sorting sorting-basics14368800 +Ref: 490914368800 +Node: Key Functions14369602 +Ref: howto/sorting key-functions14369723 +Ref: 490a14369723 +Node: Operator Module Functions14371433 +Ref: howto/sorting operator-module-functions14371564 +Ref: 490b14371564 +Node: Ascending and Descending14372623 +Ref: howto/sorting ascending-and-descending14372773 +Ref: 490c14372773 +Node: Sort Stability and Complex Sorts14373310 +Ref: howto/sorting sort-stability-and-complex-sorts14373459 +Ref: 490d14373459 +Ref: Sort Stability and Complex Sorts-Footnote-114375094 +Ref: Sort Stability and Complex Sorts-Footnote-214375160 +Node: Decorate-Sort-Undecorate14375206 +Ref: howto/sorting decorate-sort-undecorate14375351 +Ref: 490e14375351 +Ref: Decorate-Sort-Undecorate-Footnote-114377004 +Node: Comparison Functions14377064 +Ref: howto/sorting comparison-functions14377193 +Ref: 490f14377193 +Ref: Comparison Functions-Footnote-114378137 +Node: Odds and Ends<2>14378224 +Ref: howto/sorting odds-and-ends14378320 +Ref: 491014378320 +Node: Unicode HOWTO14380290 +Ref: howto/unicode doc14380440 +Ref: 491114380440 +Ref: howto/unicode id114380440 +Ref: 491214380440 +Ref: howto/unicode unicode-howto14380440 +Ref: f5314380440 +Node: Introduction to Unicode14380842 +Ref: howto/unicode introduction-to-unicode14380950 +Ref: 491314380950 +Node: Definitions14381084 +Ref: howto/unicode definitions14381173 +Ref: 491414381173 +Ref: Definitions-Footnote-114384239 +Node: Encodings14384296 +Ref: howto/unicode encodings14384407 +Ref: 491514384407 +Node: References<3>14388090 +Ref: howto/unicode references14388181 +Ref: 491614388181 +Ref: References<3>-Footnote-114389058 +Ref: References<3>-Footnote-214389090 +Ref: References<3>-Footnote-314389131 +Ref: References<3>-Footnote-414389183 +Ref: References<3>-Footnote-514389230 +Ref: References<3>-Footnote-614389404 +Ref: References<3>-Footnote-714389461 +Node: Python’s Unicode Support14389505 +Ref: howto/unicode python-s-unicode-support14389654 +Ref: 491714389654 +Node: The String Type14390023 +Ref: howto/unicode the-string-type14390129 +Ref: 491814390129 +Node: Converting to Bytes14393241 +Ref: howto/unicode converting-to-bytes14393394 +Ref: 491914393394 +Node: Unicode Literals in Python Source Code14395240 +Ref: howto/unicode unicode-literals-in-python-source-code14395396 +Ref: 491a14395396 +Ref: Unicode Literals in Python Source Code-Footnote-114397503 +Node: Unicode Properties14397545 +Ref: howto/unicode unicode-properties14397699 +Ref: 491b14397699 +Ref: Unicode Properties-Footnote-114399466 +Node: Comparing Strings14399536 +Ref: howto/unicode comparing-strings14399679 +Ref: 491c14399679 +Node: Unicode Regular Expressions14402524 +Ref: howto/unicode unicode-regular-expressions14402662 +Ref: 491d14402662 +Node: References<4>14403803 +Ref: howto/unicode id214403915 +Ref: 491e14403915 +Ref: References<4>-Footnote-114404703 +Ref: References<4>-Footnote-214404798 +Ref: References<4>-Footnote-314404850 +Node: Reading and Writing Unicode Data14404919 +Ref: howto/unicode reading-and-writing-unicode-data14405065 +Ref: 491f14405065 +Node: Unicode filenames14408776 +Ref: howto/unicode unicode-filenames14408910 +Ref: 492014408910 +Node: Tips for Writing Unicode-aware Programs14411375 +Ref: howto/unicode tips-for-writing-unicode-aware-programs14411531 +Ref: 492114411531 +Node: Converting Between File Encodings14412896 +Ref: howto/unicode converting-between-file-encodings14413042 +Ref: 492214413042 +Node: Files in an Unknown Encoding14413813 +Ref: howto/unicode files-in-an-unknown-encoding14413959 +Ref: 492314413959 +Node: References<5>14414862 +Ref: howto/unicode id314414992 +Ref: 492414414992 +Ref: References<5>-Footnote-114415602 +Ref: References<5>-Footnote-214415676 +Ref: References<5>-Footnote-314415781 +Node: Acknowledgements<10>14415850 +Ref: howto/unicode acknowledgements14415961 +Ref: 492514415961 +Node: HOWTO Fetch Internet Resources Using The urllib Package14416487 +Ref: howto/urllib2 doc14416640 +Ref: 492614416640 +Ref: howto/urllib2 howto-fetch-internet-resources-using-the-urllib-package14416640 +Ref: 492714416640 +Ref: howto/urllib2 urllib-howto14416640 +Ref: 326314416640 +Ref: HOWTO Fetch Internet Resources Using The urllib Package-Footnote-114417187 +Ref: HOWTO Fetch Internet Resources Using The urllib Package-Footnote-214417226 +Node: Introduction<15>14417345 +Ref: howto/urllib2 introduction14417475 +Ref: 492814417475 +Ref: Introduction<15>-Footnote-114419071 +Ref: Introduction<15>-Footnote-214419188 +Node: Fetching URLs14419247 +Ref: howto/urllib2 fetching-urls14419408 +Ref: 492914419408 +Node: Data14421657 +Ref: howto/urllib2 data14421727 +Ref: 492a14421727 +Ref: Data-Footnote-114424380 +Node: Headers14424449 +Ref: howto/urllib2 headers14424519 +Ref: 492b14424519 +Ref: Headers-Footnote-114426033 +Ref: Headers-Footnote-214426061 +Ref: Headers-Footnote-314426271 +Ref: Headers-Footnote-414426391 +Node: Handling Exceptions<2>14426510 +Ref: howto/urllib2 handling-exceptions14426670 +Ref: 492d14426670 +Node: URLError14427155 +Ref: howto/urllib2 urlerror14427240 +Ref: 492e14427240 +Node: HTTPError14427794 +Ref: howto/urllib2 httperror14427902 +Ref: 492f14427902 +Ref: HTTPError-Footnote-114428784 +Node: Error Codes14428843 +Ref: howto/urllib2 error-codes14428900 +Ref: 493014428900 +Ref: Error Codes-Footnote-114433653 +Node: Wrapping it Up14433712 +Ref: howto/urllib2 wrapping-it-up14433803 +Ref: 493114433803 +Node: Number 114434024 +Ref: howto/urllib2 number-114434100 +Ref: 493214434100 +Node: Number 214434722 +Ref: howto/urllib2 number-214434798 +Ref: 493314434798 +Node: info and geturl14435332 +Ref: howto/urllib2 info-and-geturl14435499 +Ref: 492c14435499 +Ref: info and geturl-Footnote-114436385 +Node: Openers and Handlers14436423 +Ref: howto/urllib2 openers-and-handlers14436588 +Ref: 493414436588 +Node: Basic Authentication14438238 +Ref: howto/urllib2 id514438395 +Ref: 493514438395 +Ref: Basic Authentication-Footnote-114441810 +Node: Proxies14441883 +Ref: howto/urllib2 proxies14442038 +Ref: 493614442038 +Ref: Proxies-Footnote-114443062 +Ref: Proxies-Footnote-214443364 +Ref: Proxies-Footnote-314443481 +Node: Sockets and Layers14443604 +Ref: howto/urllib2 sockets-and-layers14443748 +Ref: 493714443748 +Node: Footnotes14444769 +Ref: howto/urllib2 footnotes14444897 +Ref: 493814444897 +Node: Argparse Tutorial14444987 +Ref: howto/argparse doc14445166 +Ref: 493914445166 +Ref: howto/argparse argparse-tutorial14445166 +Ref: 493a14445166 +Ref: howto/argparse id114445246 +Ref: 262414445246 +Node: Concepts14445927 +Ref: howto/argparse concepts14446008 +Ref: 493b14446008 +Node: The basics14448098 +Ref: howto/argparse the-basics14448220 +Ref: 493c14448220 +Node: Introducing Positional arguments14449385 +Ref: howto/argparse introducing-positional-arguments14449529 +Ref: 493d14449529 +Node: Introducing Optional arguments14452799 +Ref: howto/argparse introducing-optional-arguments14452976 +Ref: 493e14452976 +Node: Short options14455963 +Ref: howto/argparse short-options14456043 +Ref: 493f14456043 +Node: Combining Positional and Optional arguments14456838 +Ref: howto/argparse combining-positional-and-optional-arguments14457013 +Ref: 494014457013 +Node: Getting a little more advanced14465117 +Ref: howto/argparse getting-a-little-more-advanced14465272 +Ref: 494114465272 +Node: Conflicting options14467245 +Ref: howto/argparse conflicting-options14467331 +Ref: 494214467331 +Node: Conclusion14470456 +Ref: howto/argparse conclusion14470559 +Ref: 494314470559 +Node: An introduction to the ipaddress module14470824 +Ref: howto/ipaddress doc14470970 +Ref: 494414470970 +Ref: howto/ipaddress an-introduction-to-the-ipaddress-module14470970 +Ref: 494514470970 +Ref: howto/ipaddress ipaddress-howto14470970 +Ref: 346a14470970 +Node: Creating Address/Network/Interface objects14471713 +Ref: howto/ipaddress creating-address-network-interface-objects14471884 +Ref: 494614471884 +Node: A Note on IP Versions14472311 +Ref: howto/ipaddress a-note-on-ip-versions14472437 +Ref: 494714472437 +Node: IP Host Addresses14473225 +Ref: howto/ipaddress ip-host-addresses14473377 +Ref: 494814473377 +Node: Defining Networks14474564 +Ref: howto/ipaddress defining-networks14474710 +Ref: 494914474710 +Node: Host Interfaces14477068 +Ref: howto/ipaddress host-interfaces14477188 +Ref: 494a14477188 +Node: Inspecting Address/Network/Interface Objects14478193 +Ref: howto/ipaddress inspecting-address-network-interface-objects14478403 +Ref: 494b14478403 +Node: Networks as lists of Addresses14480753 +Ref: howto/ipaddress networks-as-lists-of-addresses14480935 +Ref: 494c14480935 +Node: Comparisons<4>14481734 +Ref: howto/ipaddress comparisons14481909 +Ref: 494d14481909 +Node: Using IP Addresses with other modules14482268 +Ref: howto/ipaddress using-ip-addresses-with-other-modules14482461 +Ref: 494e14482461 +Node: Getting more detail when instance creation fails14482892 +Ref: howto/ipaddress getting-more-detail-when-instance-creation-fails14483062 +Ref: 494f14483062 +Node: Argument Clinic How-To14485120 +Ref: howto/clinic doc14485296 +Ref: 495014485296 +Ref: howto/clinic argument-clinic-how-to14485296 +Ref: 495114485296 +Node: The Goals Of Argument Clinic14486333 +Ref: howto/clinic the-goals-of-argument-clinic14486453 +Ref: 495214486453 +Node: Basic Concepts And Usage14488819 +Ref: howto/clinic basic-concepts-and-usage14488978 +Ref: 495314488978 +Node: Converting Your First Function14491413 +Ref: howto/clinic converting-your-first-function14491559 +Ref: 495414491559 +Node: Advanced Topics14507717 +Ref: howto/clinic advanced-topics14507830 +Ref: 495614507830 +Node: Symbolic default values14508853 +Ref: howto/clinic symbolic-default-values14509004 +Ref: 495714509004 +Node: Renaming the C functions and variables generated by Argument Clinic14509538 +Ref: howto/clinic renaming-the-c-functions-and-variables-generated-by-argument-clinic14509742 +Ref: 495814509742 +Node: Converting functions using PyArg_UnpackTuple14511405 +Ref: howto/clinic converting-functions-using-pyarg-unpacktuple14511601 +Ref: 495914511601 +Node: Optional Groups14512147 +Ref: howto/clinic optional-groups14512348 +Ref: 495a14512348 +Node: Using real Argument Clinic converters instead of “legacy converters”14516397 +Ref: howto/clinic using-real-argument-clinic-converters-instead-of-legacy-converters14516563 +Ref: 495b14516563 +Ref: Using real Argument Clinic converters instead of “legacy converters”-Footnote-114525501 +Node: Py_buffer14525543 +Ref: howto/clinic py-buffer14525713 +Ref: 495c14525713 +Node: Advanced converters14526029 +Ref: howto/clinic advanced-converters14526151 +Ref: 495d14526151 +Node: Parameter default values14527856 +Ref: howto/clinic default-values14527991 +Ref: 495514527991 +Ref: howto/clinic parameter-default-values14527991 +Ref: 495e14527991 +Node: The NULL default value14528520 +Ref: howto/clinic the-null-default-value14528675 +Ref: 495f14528675 +Node: Expressions specified as default values14529149 +Ref: howto/clinic expressions-specified-as-default-values14529304 +Ref: 496014529304 +Node: Using a return converter14531699 +Ref: howto/clinic using-a-return-converter14531858 +Ref: 496114531858 +Node: Cloning existing functions14534503 +Ref: howto/clinic cloning-existing-functions14534642 +Ref: 496214534642 +Node: Calling Python code14535966 +Ref: howto/clinic calling-python-code14536109 +Ref: 496314536109 +Node: Using a “self converter”14537028 +Ref: howto/clinic using-a-self-converter14537183 +Ref: 496414537183 +Node: Using a “defining class” converter14538929 +Ref: howto/clinic using-a-defining-class-converter14539091 +Ref: 496514539091 +Ref: Using a “defining class” converter-Footnote-114541398 +Node: Writing a custom converter14541440 +Ref: howto/clinic writing-a-custom-converter14541607 +Ref: 496614541607 +Node: Writing a custom return converter14545316 +Ref: howto/clinic writing-a-custom-return-converter14545467 +Ref: 496714545467 +Node: METH_O and METH_NOARGS14546046 +Ref: howto/clinic meth-o-and-meth-noargs14546199 +Ref: 496814546199 +Node: tp_new and tp_init functions14546770 +Ref: howto/clinic tp-new-and-tp-init-functions14546932 +Ref: 496914546932 +Node: Changing and redirecting Clinic’s output14547877 +Ref: howto/clinic changing-and-redirecting-clinic-s-output14548033 +Ref: 496a14548033 +Node: The #ifdef trick14559313 +Ref: howto/clinic the-ifdef-trick14559478 +Ref: 496b14559478 +Node: Using Argument Clinic in Python files14562260 +Ref: howto/clinic using-argument-clinic-in-python-files14562374 +Ref: 496c14562374 +Node: Instrumenting CPython with DTrace and SystemTap14563070 +Ref: howto/instrumentation doc14563233 +Ref: 496d14563233 +Ref: howto/instrumentation instrumentation14563233 +Ref: 8dc14563233 +Ref: howto/instrumentation instrumenting-cpython-with-dtrace-and-systemtap14563233 +Ref: 496e14563233 +Node: Enabling the static markers14564431 +Ref: howto/instrumentation enabling-the-static-markers14564571 +Ref: 496f14564571 +Node: Static DTrace probes14568775 +Ref: howto/instrumentation static-dtrace-probes14568948 +Ref: 497014568948 +Node: Static SystemTap markers14571389 +Ref: howto/instrumentation static-systemtap-markers14571559 +Ref: 497114571559 +Node: Available static markers14573622 +Ref: howto/instrumentation available-static-markers14573789 +Ref: 497214573789 +Node: SystemTap Tapsets14576334 +Ref: howto/instrumentation systemtap-tapsets14576489 +Ref: 497314576489 +Node: Examples<40>14578109 +Ref: howto/instrumentation examples14578231 +Ref: 497414578231 +Node: Annotations Best Practices14579554 +Ref: howto/annotations doc14579722 +Ref: 497514579722 +Ref: howto/annotations annotations-best-practices14579722 +Ref: 497614579722 +Ref: howto/annotations annotations-howto14579722 +Ref: 3c914579722 +Node: Accessing The Annotations Dict Of An Object In Python 3 10 And Newer14581086 +Ref: howto/annotations accessing-the-annotations-dict-of-an-object-in-python-3-10-and-newer14581293 +Ref: 497714581293 +Node: Accessing The Annotations Dict Of An Object In Python 3 9 And Older14582768 +Ref: howto/annotations accessing-the-annotations-dict-of-an-object-in-python-3-9-and-older14583030 +Ref: 497814583030 +Node: Manually Un-Stringizing Stringized Annotations14585621 +Ref: howto/annotations manually-un-stringizing-stringized-annotations14585871 +Ref: 497914585871 +Ref: Manually Un-Stringizing Stringized Annotations-Footnote-114588387 +Node: Best Practices For __annotations__ In Any Python Version14588429 +Ref: howto/annotations best-practices-for-annotations-in-any-python-version14588634 +Ref: 497a14588634 +Node: __annotations__ Quirks14589435 +Ref: howto/annotations annotations-quirks14589585 +Ref: 497b14589585 +Node: Isolating Extension Modules14591420 +Ref: howto/isolating-extensions doc14591532 +Ref: 497c14591532 +Ref: howto/isolating-extensions isolating-extension-modules14591532 +Ref: 497d14591532 +Node: Who should read this14592274 +Ref: howto/isolating-extensions who-should-read-this14592380 +Ref: 497e14592380 +Node: Background<2>14592620 +Ref: howto/isolating-extensions background14592781 +Ref: 497f14592781 +Node: Enter Per-Module State14594394 +Ref: howto/isolating-extensions enter-per-module-state14594498 +Ref: 498014594498 +Node: Isolated Module Objects14595667 +Ref: howto/isolating-extensions isolated-module-objects14595801 +Ref: 498114595801 +Node: Surprising Edge Cases14596840 +Ref: howto/isolating-extensions surprising-edge-cases14596943 +Ref: 498314596943 +Node: Making Modules Safe with Multiple Interpreters14597961 +Ref: howto/isolating-extensions making-modules-safe-with-multiple-interpreters14598115 +Ref: 498414598115 +Node: Managing Global State14598436 +Ref: howto/isolating-extensions managing-global-state14598574 +Ref: 498214598574 +Node: Managing Per-Module State14599536 +Ref: howto/isolating-extensions managing-per-module-state14599732 +Ref: 498614599732 +Ref: Managing Per-Module State-Footnote-114601410 +Node: Opt-Out Limiting to One Module Object per Process14601484 +Ref: howto/isolating-extensions opt-out-limiting-to-one-module-object-per-process14601693 +Ref: 498514601693 +Node: Module State Access from Functions14602389 +Ref: howto/isolating-extensions module-state-access-from-functions14602564 +Ref: 498714602564 +Node: Heap Types<2>14603348 +Ref: howto/isolating-extensions heap-types14603500 +Ref: 498814603500 +Node: Changing Static Types to Heap Types14605168 +Ref: howto/isolating-extensions changing-static-types-to-heap-types14605281 +Ref: 498914605281 +Node: Defining Heap Types14606247 +Ref: howto/isolating-extensions defining-heap-types14606396 +Ref: 498a14606396 +Node: Garbage-Collection Protocol14607055 +Ref: howto/isolating-extensions garbage-collection-protocol14607201 +Ref: 498b14607201 +Node: Module State Access from Classes14608624 +Ref: howto/isolating-extensions module-state-access-from-classes14608791 +Ref: 498c14608791 +Node: Module State Access from Regular Methods14609367 +Ref: howto/isolating-extensions module-state-access-from-regular-methods14609564 +Ref: 498d14609564 +Node: Module State Access from Slot Methods Getters and Setters14612077 +Ref: howto/isolating-extensions module-state-access-from-slot-methods-getters-and-setters14612270 +Ref: 498e14612270 +Node: Lifetime of the Module State14613690 +Ref: howto/isolating-extensions lifetime-of-the-module-state14613834 +Ref: 498f14613834 +Node: Open Issues14614377 +Ref: howto/isolating-extensions open-issues14614474 +Ref: 499014614474 +Ref: Open Issues-Footnote-114614780 +Node: Per-Class Scope14614848 +Ref: howto/isolating-extensions per-class-scope14614953 +Ref: 499114614953 +Node: Lossless Conversion to Heap Types14615248 +Ref: howto/isolating-extensions lossless-conversion-to-heap-types14615353 +Ref: 499214615353 +Node: Python Frequently Asked Questions14615597 +Ref: faq/index doc14615709 +Ref: 499314615709 +Ref: faq/index faq-index14615709 +Ref: 174614615709 +Ref: faq/index python-frequently-asked-questions14615709 +Ref: 499414615709 +Node: General Python FAQ14616033 +Ref: faq/general doc14616145 +Ref: 499514616145 +Ref: faq/general general-python-faq14616145 +Ref: 499614616145 +Node: General Information14616257 +Ref: faq/general general-information14616364 +Ref: 499714616364 +Node: What is Python?14617353 +Ref: faq/general what-is-python14617472 +Ref: 499814617472 +Ref: What is Python?-Footnote-114618422 +Node: What is the Python Software Foundation?14618474 +Ref: faq/general what-is-the-python-software-foundation14618656 +Ref: 499914618656 +Ref: What is the Python Software Foundation?-Footnote-114619260 +Node: Are there copyright restrictions on the use of Python?14619306 +Ref: faq/general are-there-copyright-restrictions-on-the-use-of-python14619515 +Ref: 499a14619515 +Ref: Are there copyright restrictions on the use of Python?-Footnote-114620387 +Ref: Are there copyright restrictions on the use of Python?-Footnote-214620431 +Node: Why was Python created in the first place?14620478 +Ref: faq/general why-was-python-created-in-the-first-place14620672 +Ref: 499b14620672 +Node: What is Python good for?14623004 +Ref: faq/general what-is-python-good-for14623194 +Ref: 499c14623194 +Ref: What is Python good for?-Footnote-114624046 +Node: How does the Python version numbering scheme work?14624071 +Ref: faq/general how-does-the-python-version-numbering-scheme-work14624263 +Ref: 499d14624263 +Ref: How does the Python version numbering scheme work?-Footnote-114626238 +Node: How do I obtain a copy of the Python source?14626280 +Ref: faq/general how-do-i-obtain-a-copy-of-the-python-source14626485 +Ref: 499e14626485 +Ref: How do I obtain a copy of the Python source?-Footnote-114627269 +Node: How do I get documentation on Python?14627312 +Ref: faq/general how-do-i-get-documentation-on-python14627525 +Ref: 499f14627525 +Ref: How do I get documentation on Python?-Footnote-114628088 +Node: I’ve never programmed before Is there a Python tutorial?14628119 +Ref: faq/general i-ve-never-programmed-before-is-there-a-python-tutorial14628343 +Ref: 49a014628343 +Ref: I’ve never programmed before Is there a Python tutorial?-Footnote-114628756 +Node: Is there a newsgroup or mailing list devoted to Python?14628808 +Ref: faq/general is-there-a-newsgroup-or-mailing-list-devoted-to-python14629038 +Ref: 49a114629038 +Ref: Is there a newsgroup or mailing list devoted to Python?-Footnote-114629917 +Ref: Is there a newsgroup or mailing list devoted to Python?-Footnote-214629978 +Node: How do I get a beta test version of Python?14630048 +Ref: faq/general how-do-i-get-a-beta-test-version-of-python14630271 +Ref: 49a214630271 +Ref: How do I get a beta test version of Python?-Footnote-114630810 +Node: How do I submit bug reports and patches for Python?14630847 +Ref: faq/general how-do-i-submit-bug-reports-and-patches-for-python14631082 +Ref: 49a314631082 +Ref: How do I submit bug reports and patches for Python?-Footnote-114631445 +Node: Are there any published articles about Python that I can reference?14631482 +Ref: faq/general are-there-any-published-articles-about-python-that-i-can-reference14631704 +Ref: 49a414631704 +Node: Are there any books on Python?14632217 +Ref: faq/general are-there-any-books-on-python14632433 +Ref: 49a514632433 +Node: Where in the world is www python org located?14632810 +Ref: faq/general where-in-the-world-is-www-python-org-located14632983 +Ref: 49a614632983 +Ref: Where in the world is www python org located?-Footnote-114633269 +Node: Why is it called Python?14633297 +Ref: faq/general why-is-it-called-python14633495 +Ref: 49a714633495 +Ref: Why is it called Python?-Footnote-114633901 +Node: Do I have to like “Monty Python’s Flying Circus”?14633952 +Ref: faq/general do-i-have-to-like-monty-python-s-flying-circus14634096 +Ref: 49a814634096 +Node: Python in the real world14634246 +Ref: faq/general python-in-the-real-world14634353 +Ref: 49a914634353 +Node: How stable is Python?14634733 +Ref: faq/general how-stable-is-python14634857 +Ref: 49aa14634857 +Ref: How stable is Python?-Footnote-114635878 +Ref: How stable is Python?-Footnote-214635920 +Ref: How stable is Python?-Footnote-314635962 +Node: How many people are using Python?14636004 +Ref: faq/general how-many-people-are-using-python14636187 +Ref: 49ab14636187 +Node: Have any significant projects been done in Python?14636693 +Ref: faq/general have-any-significant-projects-been-done-in-python14636915 +Ref: 49ac14636915 +Ref: Have any significant projects been done in Python?-Footnote-114637629 +Ref: Have any significant projects been done in Python?-Footnote-214637681 +Ref: Have any significant projects been done in Python?-Footnote-314637710 +Ref: Have any significant projects been done in Python?-Footnote-414637739 +Node: What new developments are expected for Python in the future?14637770 +Ref: faq/general what-new-developments-are-expected-for-python-in-the-future14638018 +Ref: 49ad14638018 +Ref: What new developments are expected for Python in the future?-Footnote-114638598 +Node: Is it reasonable to propose incompatible changes to Python?14638659 +Ref: faq/general is-it-reasonable-to-propose-incompatible-changes-to-python14638909 +Ref: 49ae14638909 +Ref: Is it reasonable to propose incompatible changes to Python?-Footnote-114639713 +Node: Is Python a good language for beginning programmers?14639755 +Ref: faq/general is-python-a-good-language-for-beginning-programmers14639936 +Ref: 49af14639936 +Ref: Is Python a good language for beginning programmers?-Footnote-114643757 +Ref: Is Python a good language for beginning programmers?-Footnote-214643808 +Node: Programming FAQ14643870 +Ref: faq/programming doc14644013 +Ref: 49b014644013 +Ref: faq/programming programming-faq14644013 +Ref: 49b114644013 +Node: General Questions14644248 +Ref: faq/programming general-questions14644339 +Ref: 49b214644339 +Node: Is there a source code level debugger with breakpoints single-stepping etc ?14644759 +Ref: faq/programming is-there-a-source-code-level-debugger-with-breakpoints-single-stepping-etc14644959 +Ref: 49b314644959 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-114646399 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-214646443 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-314646496 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-414646542 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-514646591 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-614646630 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-714646660 +Ref: Is there a source code level debugger with breakpoints single-stepping etc ?-Footnote-814646717 +Node: Are there tools to help find bugs or perform static analysis?14646760 +Ref: faq/programming are-there-tools-to-help-find-bugs-or-perform-static-analysis14647028 +Ref: 49b414647028 +Ref: Are there tools to help find bugs or perform static analysis?-Footnote-114647402 +Ref: Are there tools to help find bugs or perform static analysis?-Footnote-214647456 +Ref: Are there tools to help find bugs or perform static analysis?-Footnote-314647498 +Ref: Are there tools to help find bugs or perform static analysis?-Footnote-414647528 +Ref: Are there tools to help find bugs or perform static analysis?-Footnote-514647560 +Node: How can I create a stand-alone binary from a Python script?14647601 +Ref: faq/programming faq-create-standalone-binary14647857 +Ref: 49b514647857 +Ref: faq/programming how-can-i-create-a-stand-alone-binary-from-a-python-script14647857 +Ref: 49b614647857 +Ref: How can I create a stand-alone binary from a Python script?-Footnote-114649576 +Ref: How can I create a stand-alone binary from a Python script?-Footnote-214649604 +Ref: How can I create a stand-alone binary from a Python script?-Footnote-314649637 +Ref: How can I create a stand-alone binary from a Python script?-Footnote-414649690 +Ref: How can I create a stand-alone binary from a Python script?-Footnote-514649742 +Ref: How can I create a stand-alone binary from a Python script?-Footnote-614649791 +Node: Are there coding standards or a style guide for Python programs?14649823 +Ref: faq/programming are-there-coding-standards-or-a-style-guide-for-python-programs14650009 +Ref: 49b714650009 +Ref: Are there coding standards or a style guide for Python programs?-Footnote-114650283 +Node: Core Language14650325 +Ref: faq/programming core-language14650444 +Ref: 49b814650444 +Node: Why am I getting an UnboundLocalError when the variable has a value?14651814 +Ref: faq/programming why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value14652001 +Ref: 49b914652001 +Node: What are the rules for local and global variables in Python?14653860 +Ref: faq/programming what-are-the-rules-for-local-and-global-variables-in-python14654138 +Ref: 49ba14654138 +Node: Why do lambdas defined in a loop with different values all return the same result?14655039 +Ref: faq/programming why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result14655296 +Ref: 49bb14655296 +Node: How do I share global variables across modules?14657205 +Ref: faq/programming how-do-i-share-global-variables-across-modules14657465 +Ref: 49bc14657465 +Node: What are the “best practices” for using import in a module?14658268 +Ref: faq/programming what-are-the-best-practices-for-using-import-in-a-module14658492 +Ref: 49bd14658492 +Node: Why are default values shared between objects?14661248 +Ref: faq/programming why-are-default-values-shared-between-objects14661500 +Ref: 49be14661500 +Node: How can I pass optional or keyword parameters from one function to another?14663888 +Ref: faq/programming how-can-i-pass-optional-or-keyword-parameters-from-one-function-to-another14664133 +Ref: 49bf14664133 +Node: What is the difference between arguments and parameters?14664720 +Ref: faq/programming faq-argument-vs-parameter14664974 +Ref: 49c014664974 +Ref: faq/programming what-is-the-difference-between-arguments-and-parameters14664974 +Ref: 49c114664974 +Node: Why did changing list ‘y’ also change list ‘x’?14665676 +Ref: faq/programming why-did-changing-list-y-also-change-list-x14665923 +Ref: 49c214665923 +Node: How do I write a function with output parameters call by reference ?14669326 +Ref: faq/programming how-do-i-write-a-function-with-output-parameters-call-by-reference14669567 +Ref: 49c314669567 +Node: How do you make a higher order function in Python?14671972 +Ref: faq/programming how-do-you-make-a-higher-order-function-in-python14672192 +Ref: 49c414672192 +Node: How do I copy an object in Python?14673766 +Ref: faq/programming how-do-i-copy-an-object-in-python14673972 +Ref: 49c514673972 +Node: How can I find the methods or attributes of an object?14674379 +Ref: faq/programming how-can-i-find-the-methods-or-attributes-of-an-object14674582 +Ref: 49c614674582 +Node: How can my code discover the name of an object?14674896 +Ref: faq/programming how-can-my-code-discover-the-name-of-an-object14675116 +Ref: 49c714675116 +Node: What’s up with the comma operator’s precedence?14676736 +Ref: faq/programming what-s-up-with-the-comma-operator-s-precedence14676960 +Ref: 49c814676960 +Node: Is there an equivalent of C’s “? ” ternary operator?14677518 +Ref: faq/programming is-there-an-equivalent-of-c-s-ternary-operator14677751 +Ref: 49c914677751 +Node: Is it possible to write obfuscated one-liners in Python?14678346 +Ref: faq/programming is-it-possible-to-write-obfuscated-one-liners-in-python14678591 +Ref: 49ca14678591 +Node: What does the slash / in the parameter list of a function mean?14680090 +Ref: faq/programming faq-positional-only-arguments14680268 +Ref: 1bb914680268 +Ref: faq/programming what-does-the-slash-in-the-parameter-list-of-a-function-mean14680268 +Ref: 49cb14680268 +Node: Numbers and strings14681368 +Ref: faq/programming numbers-and-strings14681484 +Ref: 49cc14681484 +Node: How do I specify hexadecimal and octal integers?14682219 +Ref: faq/programming how-do-i-specify-hexadecimal-and-octal-integers14682361 +Ref: 49cd14682361 +Node: Why does -22 // 10 return -3?14683010 +Ref: faq/programming why-does-22-10-return-314683219 +Ref: 49ce14683219 +Node: How do I get int literal attribute instead of SyntaxError?14683980 +Ref: faq/programming how-do-i-get-int-literal-attribute-instead-of-syntaxerror14684179 +Ref: 49cf14684179 +Node: How do I convert a string to a number?14684754 +Ref: faq/programming how-do-i-convert-a-string-to-a-number14684962 +Ref: 49d014684962 +Node: How do I convert a number to a string?14686286 +Ref: faq/programming how-do-i-convert-a-number-to-a-string14686470 +Ref: 49d114686470 +Node: How do I modify a string in place?14687022 +Ref: faq/programming how-do-i-modify-a-string-in-place14687215 +Ref: 49d214687215 +Node: How do I use strings to call functions/methods?14688071 +Ref: faq/programming how-do-i-use-strings-to-call-functions-methods14688311 +Ref: 49d314688311 +Node: Is there an equivalent to Perl’s chomp for removing trailing newlines from strings?14689639 +Ref: faq/programming is-there-an-equivalent-to-perl-s-chomp-for-removing-trailing-newlines-from-strings14689883 +Ref: 49d414689883 +Node: Is there a scanf or sscanf equivalent?14690642 +Ref: faq/programming is-there-a-scanf-or-sscanf-equivalent14690913 +Ref: 49d514690913 +Node: What does ‘UnicodeDecodeError’ or ‘UnicodeEncodeError’ error mean?14691564 +Ref: faq/programming what-does-unicodedecodeerror-or-unicodeencodeerror-error-mean14691741 +Ref: 49d614691741 +Node: Performance<4>14691939 +Ref: faq/programming performance14692064 +Ref: 49d714692064 +Node: My program is too slow How do I speed it up?14692281 +Ref: faq/programming my-program-is-too-slow-how-do-i-speed-it-up14692453 +Ref: 49d814692453 +Ref: My program is too slow How do I speed it up?-Footnote-114695332 +Ref: My program is too slow How do I speed it up?-Footnote-214695359 +Node: What is the most efficient way to concatenate many strings together?14695424 +Ref: faq/programming efficient-string-concatenation14695596 +Ref: 49d914695596 +Ref: faq/programming what-is-the-most-efficient-way-to-concatenate-many-strings-together14695596 +Ref: 49da14695596 +Node: Sequences Tuples/Lists14696566 +Ref: faq/programming sequences-tuples-lists14696679 +Ref: 49db14696679 +Node: How do I convert between tuples and lists?14697423 +Ref: faq/programming how-do-i-convert-between-tuples-and-lists14697559 +Ref: 49dc14697559 +Node: What’s a negative index?14698406 +Ref: faq/programming what-s-a-negative-index14698601 +Ref: 49dd14698601 +Node: How do I iterate over a sequence in reverse order?14699181 +Ref: faq/programming how-do-i-iterate-over-a-sequence-in-reverse-order14699375 +Ref: 49de14699375 +Node: How do you remove duplicates from a list?14699724 +Ref: faq/programming how-do-you-remove-duplicates-from-a-list14699936 +Ref: 49df14699936 +Node: How do you remove multiple items from a list14700763 +Ref: faq/programming how-do-you-remove-multiple-items-from-a-list14700960 +Ref: 49e014700960 +Node: How do you make an array in Python?14701508 +Ref: faq/programming how-do-you-make-an-array-in-python14701704 +Ref: 49e114701704 +Node: How do I create a multidimensional list?14702691 +Ref: faq/programming faq-multidimensional-list14702892 +Ref: 1bf314702892 +Ref: faq/programming how-do-i-create-a-multidimensional-list14702892 +Ref: 49e214702892 +Ref: How do I create a multidimensional list?-Footnote-114704114 +Node: How do I apply a method to a sequence of objects?14704144 +Ref: faq/programming how-do-i-apply-a-method-to-a-sequence-of-objects14704389 +Ref: 49e314704389 +Node: Why does a_tuple[i] += [‘item’] raise an exception when the addition works?14704583 +Ref: faq/programming faq-augmented-assignment-tuple-error14704865 +Ref: 196c14704865 +Ref: faq/programming why-does-a-tuple-i-item-raise-an-exception-when-the-addition-works14704865 +Ref: 49e414704865 +Node: I want to do a complicated sort can you do a Schwartzian Transform in Python?14708089 +Ref: faq/programming i-want-to-do-a-complicated-sort-can-you-do-a-schwartzian-transform-in-python14708374 +Ref: 49e514708374 +Node: How can I sort one list by values from another list?14708859 +Ref: faq/programming how-can-i-sort-one-list-by-values-from-another-list14709056 +Ref: 49e614709056 +Node: Objects14709651 +Ref: faq/programming objects14709760 +Ref: 49e714709760 +Node: What is a class?14710937 +Ref: faq/programming what-is-a-class14711023 +Ref: 49e814711023 +Node: What is a method?14711749 +Ref: faq/programming what-is-a-method14711857 +Ref: 49e914711857 +Node: What is self?14712166 +Ref: faq/programming what-is-self14712341 +Ref: 49ea14712341 +Node: How do I check if an object is an instance of a given class or of a subclass of it?14712783 +Ref: faq/programming how-do-i-check-if-an-object-is-an-instance-of-a-given-class-or-of-a-subclass-of-it14712960 +Ref: 49ec14712960 +Node: What is delegation?14715257 +Ref: faq/programming what-is-delegation14715505 +Ref: 49ed14715505 +Node: How do I call a method defined in a base class from a derived class that extends it?14717337 +Ref: faq/programming how-do-i-call-a-method-defined-in-a-base-class-from-a-derived-class-that-extends-it14717572 +Ref: 49ee14717572 +Node: How can I organize my code to make it easier to change the base class?14718194 +Ref: faq/programming how-can-i-organize-my-code-to-make-it-easier-to-change-the-base-class14718469 +Ref: 49ef14718469 +Node: How do I create static class data and static class methods?14719019 +Ref: faq/programming how-do-i-create-static-class-data-and-static-class-methods14719263 +Ref: 49f014719263 +Node: How can I overload constructors or methods in Python?14720832 +Ref: faq/programming how-can-i-overload-constructors-or-methods-in-python14721071 +Ref: 49f114721071 +Node: I try to use __spam and I get an error about _SomeClassName__spam14721978 +Ref: faq/programming i-try-to-use-spam-and-i-get-an-error-about-someclassname-spam14722228 +Ref: 49f214722228 +Node: My class defines __del__ but it is not called when I delete the object14723029 +Ref: faq/programming my-class-defines-del-but-it-is-not-called-when-i-delete-the-object14723280 +Ref: 49f314723280 +Node: How do I get a list of all instances of a given class?14725211 +Ref: faq/programming how-do-i-get-a-list-of-all-instances-of-a-given-class14725447 +Ref: 49f414725447 +Node: Why does the result of id appear to be not unique?14725788 +Ref: faq/programming why-does-the-result-of-id-appear-to-be-not-unique14726009 +Ref: 49f514726009 +Node: When can I rely on identity tests with the is operator?14726902 +Ref: faq/programming when-can-i-rely-on-identity-tests-with-the-is-operator14727141 +Ref: 49f614727141 +Ref: When can I rely on identity tests with the is operator?-Footnote-114730348 +Node: How can a subclass control what data is stored in an immutable instance?14730390 +Ref: faq/programming how-can-a-subclass-control-what-data-is-stored-in-an-immutable-instance14730607 +Ref: 49f714730607 +Node: How do I cache method calls?14732071 +Ref: faq/programming faq-cache-method-calls14732224 +Ref: 215714732224 +Ref: faq/programming how-do-i-cache-method-calls14732224 +Ref: 49f814732224 +Node: Modules<3>14735183 +Ref: faq/programming modules14735261 +Ref: 49f914735261 +Node: How do I create a pyc file?14735801 +Ref: faq/programming how-do-i-create-a-pyc-file14735922 +Ref: 49fa14735922 +Ref: How do I create a pyc file?-Footnote-114738504 +Node: How do I find the current module name?14738546 +Ref: faq/programming how-do-i-find-the-current-module-name14738731 +Ref: 49fb14738731 +Node: How can I have modules that mutually import each other?14739289 +Ref: faq/programming how-can-i-have-modules-that-mutually-import-each-other14739511 +Ref: 49fc14739511 +Node: __import__ ‘x y z’ returns ; how do I get z?14741560 +Ref: faq/programming import-x-y-z-returns-module-x-how-do-i-get-z14741840 +Ref: 49fd14741840 +Node: When I edit an imported module and reimport it the changes don’t show up Why does this happen?14742130 +Ref: faq/programming when-i-edit-an-imported-module-and-reimport-it-the-changes-don-t-show-up-why-does-this-happen14742346 +Ref: 49fe14742346 +Node: Design and History FAQ14743793 +Ref: faq/design doc14743943 +Ref: 49ff14743943 +Ref: faq/design design-and-history-faq14743943 +Ref: 4a0014743943 +Node: Why does Python use indentation for grouping of statements?14746042 +Ref: faq/design why-does-python-use-indentation-for-grouping-of-statements14746236 +Ref: 4a0114746236 +Node: Why am I getting strange results with simple arithmetic operations?14747956 +Ref: faq/design why-am-i-getting-strange-results-with-simple-arithmetic-operations14748209 +Ref: 4a0214748209 +Node: Why are floating-point calculations so inaccurate?14748384 +Ref: faq/design why-are-floating-point-calculations-so-inaccurate14748611 +Ref: 4a0314748611 +Node: Why are Python strings immutable?14750150 +Ref: faq/design why-are-python-strings-immutable14750381 +Ref: 4a0414750381 +Node: Why must ‘self’ be used explicitly in method definitions and calls?14750984 +Ref: faq/design why-must-self-be-used-explicitly-in-method-definitions-and-calls14751214 +Ref: 4a0514751214 +Ref: faq/design why-self14751214 +Ref: 49eb14751214 +Node: Why can’t I use an assignment in an expression?14753698 +Ref: faq/design id114753999 +Ref: 4a0614753999 +Ref: faq/design why-can-t-i-use-an-assignment-in-an-expression14753999 +Ref: 169e14753999 +Ref: Why can’t I use an assignment in an expression?-Footnote-114754371 +Node: Why does Python use methods for some functionality e g list index but functions for other e g len list ?14754413 +Ref: faq/design why-does-python-use-methods-for-some-functionality-e-g-list-index-but-functions-for-other-e-g-len-list14754705 +Ref: 4a0714754705 +Node: Why is join a string method instead of a list or tuple method?14756044 +Ref: faq/design why-is-join-a-string-method-instead-of-a-list-or-tuple-method14756311 +Ref: 4a0814756311 +Node: How fast are exceptions?14758122 +Ref: faq/design how-fast-are-exceptions14758340 +Ref: 4a0914758340 +Node: Why isn’t there a switch or case statement in Python?14759153 +Ref: faq/design why-isn-t-there-a-switch-or-case-statement-in-python14759415 +Ref: 4a0a14759415 +Node: Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?14760652 +Ref: faq/design can-t-you-emulate-threads-in-the-interpreter-instead-of-relying-on-an-os-specific-thread-implementation14760940 +Ref: 4a0b14760940 +Ref: Can’t you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?-Footnote-114761587 +Node: Why can’t lambda expressions contain statements?14761643 +Ref: faq/design why-can-t-lambda-expressions-contain-statements14761940 +Ref: 4a0c14761940 +Node: Can Python be compiled to machine code C or some other language?14762805 +Ref: faq/design can-python-be-compiled-to-machine-code-c-or-some-other-language14763026 +Ref: 4a0d14763026 +Ref: Can Python be compiled to machine code C or some other language?-Footnote-114763414 +Ref: Can Python be compiled to machine code C or some other language?-Footnote-214763442 +Node: How does Python manage memory?14763474 +Ref: faq/design how-does-python-manage-memory14763716 +Ref: 4a0e14763716 +Ref: How does Python manage memory?-Footnote-114765384 +Ref: How does Python manage memory?-Footnote-214765415 +Node: Why doesn’t CPython use a more traditional garbage collection scheme?14765444 +Ref: faq/design why-doesn-t-cpython-use-a-more-traditional-garbage-collection-scheme14765670 +Ref: 4a0f14765670 +Node: Why isn’t all memory freed when CPython exits?14766586 +Ref: faq/design why-isn-t-all-memory-freed-when-cpython-exits14766831 +Ref: 4a1014766831 +Node: Why are there separate tuple and list data types?14767526 +Ref: faq/design why-are-there-separate-tuple-and-list-data-types14767737 +Ref: 4a1114767737 +Node: How are lists implemented in CPython?14768971 +Ref: faq/design how-are-lists-implemented-in-cpython14769178 +Ref: 4a1214769178 +Node: How are dictionaries implemented in CPython?14769919 +Ref: faq/design how-are-dictionaries-implemented-in-cpython14770115 +Ref: 4a1314770115 +Node: Why must dictionary keys be immutable?14771066 +Ref: faq/design why-must-dictionary-keys-be-immutable14771272 +Ref: 4a1414771272 +Node: Why doesn’t list sort return the sorted list?14775463 +Ref: faq/design why-doesn-t-list-sort-return-the-sorted-list14775684 +Ref: 4a1514775684 +Node: How do you specify and enforce an interface spec in Python?14776528 +Ref: faq/design how-do-you-specify-and-enforce-an-interface-spec-in-python14776732 +Ref: 4a1614776732 +Node: Why is there no goto?14779049 +Ref: faq/design why-is-there-no-goto14779261 +Ref: 4a1714779261 +Node: Why can’t raw strings r-strings end with a backslash?14780339 +Ref: faq/design why-can-t-raw-strings-r-strings-end-with-a-backslash14780567 +Ref: 4a1814780567 +Node: Why doesn’t Python have a “with” statement for attribute assignments?14781668 +Ref: faq/design why-doesn-t-python-have-a-with-statement-for-attribute-assignments14781925 +Ref: 4a1914781925 +Node: Why don’t generators support the with statement?14784127 +Ref: faq/design why-don-t-generators-support-the-with-statement14784391 +Ref: 4a1a14784391 +Node: Why are colons required for the if/while/def/class statements?14784796 +Ref: faq/design why-are-colons-required-for-the-if-while-def-class-statements14785045 +Ref: 4a1b14785045 +Node: Why does Python allow commas at the end of lists and tuples?14785790 +Ref: faq/design why-does-python-allow-commas-at-the-end-of-lists-and-tuples14785980 +Ref: 4a1c14785980 +Node: Library and Extension FAQ14787081 +Ref: faq/library doc14787239 +Ref: 4a1d14787239 +Ref: faq/library library-and-extension-faq14787239 +Ref: 4a1e14787239 +Node: General Library Questions14787488 +Ref: faq/library general-library-questions14787596 +Ref: 4a1f14787596 +Node: How do I find a module or application to perform task X?14788108 +Ref: faq/library how-do-i-find-a-module-or-application-to-perform-task-x14788291 +Ref: 4a2014788291 +Ref: How do I find a module or application to perform task X?-Footnote-114788879 +Ref: How do I find a module or application to perform task X?-Footnote-214788904 +Node: Where is the math py socket py regex py etc source file?14788935 +Ref: faq/library where-is-the-math-py-socket-py-regex-py-etc-source-file14789176 +Ref: 4a2114789176 +Node: How do I make a Python script executable on Unix?14789960 +Ref: faq/library how-do-i-make-a-python-script-executable-on-unix14790190 +Ref: 4a2214790190 +Node: Is there a curses/termcap package for Python?14791667 +Ref: faq/library is-there-a-curses-termcap-package-for-python14791890 +Ref: 4a2314791890 +Ref: Is there a curses/termcap package for Python?-Footnote-114792685 +Node: Is there an equivalent to C’s onexit in Python?14792745 +Ref: faq/library is-there-an-equivalent-to-c-s-onexit-in-python14792955 +Ref: 4a2414792955 +Node: Why don’t my signal handlers work?14793175 +Ref: faq/library why-don-t-my-signal-handlers-work14793331 +Ref: 4a2514793331 +Node: Common tasks14793656 +Ref: faq/library common-tasks14793780 +Ref: 4a2614793780 +Node: How do I test a Python program or component?14793978 +Ref: faq/library how-do-i-test-a-python-program-or-component14794127 +Ref: 4a2714794127 +Node: How do I create documentation from doc strings?14796078 +Ref: faq/library how-do-i-create-documentation-from-doc-strings14796277 +Ref: 4a2814796277 +Ref: How do I create documentation from doc strings?-Footnote-114796653 +Ref: How do I create documentation from doc strings?-Footnote-214796693 +Node: How do I get a single keypress at a time?14796728 +Ref: faq/library how-do-i-get-a-single-keypress-at-a-time14796874 +Ref: 4a2914796874 +Node: Threads14797120 +Ref: faq/library threads14797238 +Ref: 4a2a14797238 +Node: How do I program using threads?14797566 +Ref: faq/library how-do-i-program-using-threads14797685 +Ref: 4a2b14797685 +Node: None of my threads seem to run why?14797997 +Ref: faq/library none-of-my-threads-seem-to-run-why14798182 +Ref: 4a2c14798182 +Node: How do I parcel out work among a bunch of worker threads?14799731 +Ref: faq/library how-do-i-parcel-out-work-among-a-bunch-of-worker-threads14799937 +Ref: 4a2d14799937 +Node: What kinds of global value mutation are thread-safe?14802537 +Ref: faq/library what-kinds-of-global-value-mutation-are-thread-safe14802758 +Ref: 4a2e14802758 +Node: Can’t we get rid of the Global Interpreter Lock?14804258 +Ref: faq/library can-t-we-get-rid-of-the-global-interpreter-lock14804413 +Ref: 4a2f14804413 +Ref: Can’t we get rid of the Global Interpreter Lock?-Footnote-114807104 +Node: Input and Output<2>14807164 +Ref: faq/library input-and-output14807298 +Ref: 4a3014807298 +Node: How do I delete a file? And other file questions…14807933 +Ref: faq/library how-do-i-delete-a-file-and-other-file-questions14808070 +Ref: 4a3114808070 +Node: How do I copy a file?14809320 +Ref: faq/library how-do-i-copy-a-file14809501 +Ref: 4a3214809501 +Ref: How do I copy a file?-Footnote-114809976 +Ref: How do I copy a file?-Footnote-214810047 +Node: How do I read or write binary data?14810099 +Ref: faq/library how-do-i-read-or-write-binary-data14810297 +Ref: 4a3314810297 +Node: I can’t seem to use os read on a pipe created with os popen ; why?14811494 +Ref: faq/library i-can-t-seem-to-use-os-read-on-a-pipe-created-with-os-popen-why14811709 +Ref: 4a3414811709 +Node: How do I access the serial RS232 port?14812230 +Ref: faq/library how-do-i-access-the-serial-rs232-port14812472 +Ref: 4a3514812472 +Node: Why doesn’t closing sys stdout stdin stderr really close it?14812790 +Ref: faq/library why-doesn-t-closing-sys-stdout-stdin-stderr-really-close-it14812955 +Ref: 4a3614812955 +Node: Network/Internet Programming14814182 +Ref: faq/library network-internet-programming14814318 +Ref: 4a3714814318 +Node: What WWW tools are there for Python?14814775 +Ref: faq/library what-www-tools-are-there-for-python14814934 +Ref: 4a3814814934 +Node: How can I mimic CGI form submission METHOD=POST ?14815561 +Ref: faq/library how-can-i-mimic-cgi-form-submission-method-post14815783 +Ref: 4a3914815783 +Node: What module should I use to help with generating HTML?14816899 +Ref: faq/library what-module-should-i-use-to-help-with-generating-html14817125 +Ref: 4a3a14817125 +Ref: What module should I use to help with generating HTML?-Footnote-114817370 +Node: How do I send mail from a Python script?14817422 +Ref: faq/library how-do-i-send-mail-from-a-python-script14817657 +Ref: 4a3b14817657 +Node: How do I avoid blocking in the connect method of a socket?14818998 +Ref: faq/library how-do-i-avoid-blocking-in-the-connect-method-of-a-socket14819170 +Ref: 4a3c14819170 +Ref: How do I avoid blocking in the connect method of a socket?-Footnote-114820511 +Node: Databases14820551 +Ref: faq/library databases14820692 +Ref: 4a3d14820692 +Node: Are there any interfaces to database packages in Python?14820853 +Ref: faq/library are-there-any-interfaces-to-database-packages-in-python14821014 +Ref: 4a3e14821014 +Ref: Are there any interfaces to database packages in Python?-Footnote-114821520 +Node: How do you implement persistent objects in Python?14821577 +Ref: faq/library how-do-you-implement-persistent-objects-in-python14821738 +Ref: 4a3f14821738 +Node: Mathematics and Numerics14822139 +Ref: faq/library mathematics-and-numerics14822243 +Ref: 4a4014822243 +Node: How do I generate random numbers in Python?14822366 +Ref: faq/library how-do-i-generate-random-numbers-in-python14822470 +Ref: 4a4114822470 +Node: Extending/Embedding FAQ14823423 +Ref: faq/extending doc14823580 +Ref: 4a4214823580 +Ref: faq/extending extending-embedding-faq14823580 +Ref: 4a4314823580 +Node: Can I create my own functions in C?14825068 +Ref: faq/extending can-i-create-my-own-functions-in-c14825209 +Ref: 4a4414825209 +Node: Can I create my own functions in C++?14825569 +Ref: faq/extending id114825765 +Ref: 4a4514825765 +Node: Writing C is hard; are there any alternatives?14826152 +Ref: faq/extending c-wrapper-software14826366 +Ref: 4a4614826366 +Ref: faq/extending writing-c-is-hard-are-there-any-alternatives14826366 +Ref: 4a4714826366 +Ref: Writing C is hard; are there any alternatives?-Footnote-114827135 +Ref: Writing C is hard; are there any alternatives?-Footnote-214827162 +Ref: Writing C is hard; are there any alternatives?-Footnote-314827229 +Ref: Writing C is hard; are there any alternatives?-Footnote-414827258 +Ref: Writing C is hard; are there any alternatives?-Footnote-514827316 +Ref: Writing C is hard; are there any alternatives?-Footnote-614827353 +Ref: Writing C is hard; are there any alternatives?-Footnote-714827410 +Node: How can I execute arbitrary Python statements from C?14827449 +Ref: faq/extending how-can-i-execute-arbitrary-python-statements-from-c14827683 +Ref: 4a4814827683 +Node: How can I evaluate an arbitrary Python expression from C?14828229 +Ref: faq/extending how-can-i-evaluate-an-arbitrary-python-expression-from-c14828464 +Ref: 4a4914828464 +Node: How do I extract C values from a Python object?14828780 +Ref: faq/extending how-do-i-extract-c-values-from-a-python-object14829027 +Ref: 4a4a14829027 +Node: How do I use Py_BuildValue to create a tuple of arbitrary length?14830266 +Ref: faq/extending how-do-i-use-py-buildvalue-to-create-a-tuple-of-arbitrary-length14830498 +Ref: 4a4b14830498 +Node: How do I call an object’s method from C?14830705 +Ref: faq/extending how-do-i-call-an-object-s-method-from-c14830975 +Ref: 4a4c14830975 +Node: How do I catch the output from PyErr_Print or anything that prints to stdout/stderr ?14832199 +Ref: faq/extending how-do-i-catch-the-output-from-pyerr-print-or-anything-that-prints-to-stdout-stderr14832454 +Ref: 4a4d14832454 +Node: How do I access a module written in Python from C?14833667 +Ref: faq/extending how-do-i-access-a-module-written-in-python-from-c14833926 +Ref: 4a4e14833926 +Node: How do I interface to C++ objects from Python?14834760 +Ref: faq/extending how-do-i-interface-to-c-objects-from-python14834996 +Ref: 4a4f14834996 +Node: I added a module using the Setup file and the make fails; why?14835568 +Ref: faq/extending i-added-a-module-using-the-setup-file-and-the-make-fails-why14835782 +Ref: 4a5014835782 +Node: How do I debug an extension?14836132 +Ref: faq/extending how-do-i-debug-an-extension14836384 +Ref: 4a5114836384 +Node: I want to compile a Python module on my Linux system but some files are missing Why?14836935 +Ref: faq/extending i-want-to-compile-a-python-module-on-my-linux-system-but-some-files-are-missing-why14837187 +Ref: 4a5214837187 +Node: How do I tell “incomplete input” from “invalid input”?14837671 +Ref: faq/extending how-do-i-tell-incomplete-input-from-invalid-input14837963 +Ref: 4a5314837963 +Node: How do I find undefined g++ symbols __builtin_new or __pure_virtual?14838932 +Ref: faq/extending how-do-i-find-undefined-g-symbols-builtin-new-or-pure-virtual14839250 +Ref: 4a5414839250 +Node: Can I create an object class with some methods implemented in C and others in Python e g through inheritance ?14839638 +Ref: faq/extending can-i-create-an-object-class-with-some-methods-implemented-in-c-and-others-in-python-e-g-through-inheritance14839885 +Ref: 4a5514839885 +Node: Python on Windows FAQ14840439 +Ref: faq/windows doc14840597 +Ref: 4a5614840597 +Ref: faq/windows python-on-windows-faq14840597 +Ref: 4a5714840597 +Ref: faq/windows windows-faq14840597 +Ref: 4a5814840597 +Node: How do I run a Python program under Windows?14841253 +Ref: faq/windows faq-run-program-under-windows14841404 +Ref: 4a5914841404 +Ref: faq/windows how-do-i-run-a-python-program-under-windows14841404 +Ref: 4a5a14841404 +Node: How do I make Python scripts executable?14844966 +Ref: faq/windows how-do-i-make-python-scripts-executable14845174 +Ref: 4a5b14845174 +Node: Why does Python sometimes take so long to start?14845736 +Ref: faq/windows why-does-python-sometimes-take-so-long-to-start14845949 +Ref: 4a5c14845949 +Node: How do I make an executable from a Python script?14846828 +Ref: faq/windows how-do-i-make-an-executable-from-a-python-script14847035 +Ref: 4a5d14847035 +Node: Is a * pyd file the same as a DLL?14847286 +Ref: faq/windows is-a-pyd-file-the-same-as-a-dll14847495 +Ref: 4a5e14847495 +Node: How can I embed Python into a Windows application?14848492 +Ref: faq/windows how-can-i-embed-python-into-a-windows-application14848716 +Ref: 4a5f14848716 +Node: How do I keep editors from inserting tabs into my Python source?14853160 +Ref: faq/windows how-do-i-keep-editors-from-inserting-tabs-into-my-python-source14853397 +Ref: 4a6014853397 +Ref: How do I keep editors from inserting tabs into my Python source?-Footnote-114854274 +Node: How do I check for a keypress without blocking?14854316 +Ref: faq/windows how-do-i-check-for-a-keypress-without-blocking14854570 +Ref: 4a6114854570 +Node: How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?14854919 +Ref: faq/windows how-do-i-solve-the-missing-api-ms-win-crt-runtime-l1-1-0-dll-error14855100 +Ref: 4a6214855100 +Ref: How do I solve the missing api-ms-win-crt-runtime-l1-1-0 dll error?-Footnote-114855606 +Node: Graphic User Interface FAQ14855664 +Ref: faq/gui doc14855848 +Ref: 4a6314855848 +Ref: faq/gui graphic-user-interface-faq14855848 +Ref: 4a6414855848 +Node: General GUI Questions14856011 +Ref: faq/gui general-gui-questions14856139 +Ref: 4a6514856139 +Node: What GUI toolkits exist for Python?14856198 +Ref: faq/gui what-gui-toolkits-exist-for-python14856352 +Ref: 4a6614856352 +Ref: What GUI toolkits exist for Python?-Footnote-114857059 +Ref: What GUI toolkits exist for Python?-Footnote-214857101 +Ref: What GUI toolkits exist for Python?-Footnote-314857128 +Ref: What GUI toolkits exist for Python?-Footnote-414857207 +Node: Tkinter questions14857289 +Ref: faq/gui tkinter-questions14857413 +Ref: 4a6714857413 +Node: How do I freeze Tkinter applications?14857679 +Ref: faq/gui how-do-i-freeze-tkinter-applications14857830 +Ref: 4a6814857830 +Node: Can I have Tk events handled while waiting for I/O?14858778 +Ref: faq/gui can-i-have-tk-events-handled-while-waiting-for-i-o14858988 +Ref: 4a6914858988 +Node: I can’t get key bindings to work in Tkinter why?14859463 +Ref: faq/gui i-can-t-get-key-bindings-to-work-in-tkinter-why14859627 +Ref: 4a6a14859627 +Node: “Why is Python Installed on my Computer?” FAQ14860179 +Ref: faq/installed doc14860333 +Ref: 4a6b14860333 +Ref: faq/installed why-is-python-installed-on-my-computer-faq14860333 +Ref: 4a6c14860333 +Node: What is Python?<2>14860557 +Ref: faq/installed what-is-python14860708 +Ref: 4a6d14860708 +Ref: What is Python?<2>-Footnote-114861189 +Node: Why is Python installed on my machine?14861241 +Ref: faq/installed why-is-python-installed-on-my-machine14861421 +Ref: 4a6e14861421 +Node: Can I delete Python?14862506 +Ref: faq/installed can-i-delete-python14862659 +Ref: 4a6f14862659 +Node: Glossary14863387 +Ref: glossary doc14863507 +Ref: 4a7014863507 +Ref: glossary glossary14863507 +Ref: 162714863507 +Ref: glossary id114863507 +Ref: 4a7114863507 +Ref: glossary term-014863532 +Ref: 163f14863532 +Ref: glossary term-14863695 +Ref: 164014863695 +Ref: glossary term-2to314864089 +Ref: 146e14864089 +Ref: glossary term-abstract-base-class14864505 +Ref: e6a14864505 +Ref: glossary term-annotation14865342 +Ref: 193214865342 +Ref: glossary term-argument14866020 +Ref: 1a3514866020 +Ref: glossary term-asynchronous-context-manager14867453 +Ref: 1a314867453 +Ref: glossary term-asynchronous-generator14867673 +Ref: 1a0f14867673 +Ref: glossary term-asynchronous-generator-iterator14868398 +Ref: 3bcb14868398 +Ref: glossary term-asynchronous-iterable14869135 +Ref: 9f314869135 +Ref: glossary term-asynchronous-iterator14869352 +Ref: 9f514869352 +Ref: glossary term-attribute14869747 +Ref: 1f0114869747 +Ref: glossary term-awaitable14870312 +Ref: 8e714870312 +Ref: glossary term-BDFL14870503 +Ref: 4a7414870503 +Ref: glossary term-binary-file14870600 +Ref: 16d114870600 +Ref: glossary term-borrowed-reference14871046 +Ref: 42cb14871046 +Ref: glossary term-bytes-like-object14871749 +Ref: 9a214871749 +Ref: glossary term-bytecode14872734 +Ref: 16f14872734 +Ref: glossary term-callable14873463 +Ref: 4a7514873463 +Ref: glossary term-callback14873853 +Ref: 232814873853 +Ref: glossary term-class14873971 +Ref: 133b14873971 +Ref: glossary term-class-variable14874136 +Ref: 4a7614874136 +Ref: glossary term-complex-number14874282 +Ref: 4a7714874282 +Ref: glossary term-context-manager14875053 +Ref: 1a014875053 +Ref: glossary term-context-variable14875242 +Ref: 4a7814875242 +Ref: glossary term-contiguous14875700 +Ref: 1c7914875700 +Ref: glossary term-coroutine14876243 +Ref: 52514876243 +Ref: glossary term-coroutine-function14876566 +Ref: 9f214876566 +Ref: glossary term-CPython14876880 +Ref: 2b414876880 +Ref: glossary term-decorator14877133 +Ref: 2f814877133 +Ref: glossary term-descriptor14877846 +Ref: 192414877846 +Ref: glossary term-dictionary14878674 +Ref: 4a7914878674 +Ref: glossary term-dictionary-comprehension14878868 +Ref: 4a7a14878868 +Ref: glossary term-dictionary-view14879213 +Ref: 1f5914879213 +Ref: glossary term-docstring14879659 +Ref: 1b6b14879659 +Ref: glossary term-duck-typing14880050 +Ref: 4a7214880050 +Ref: glossary term-EAFP14880754 +Ref: 254614880754 +Ref: glossary term-expression14881201 +Ref: 193a14881201 +Ref: glossary term-extension-module14881715 +Ref: 3d6514881715 +Ref: glossary term-f-string14881843 +Ref: 1f814881843 +Ref: glossary term-file-object14882038 +Ref: e7614882038 +Ref: glossary term-file-like-object14882815 +Ref: 1fcb14882815 +Ref: glossary term-filesystem-encoding-and-error-handler14882877 +Ref: 179314882877 +Ref: glossary term-finder14883745 +Ref: 19ac14883745 +Ref: glossary term-floor-division14884137 +Ref: 58c14884137 +Ref: glossary term-function14884512 +Ref: 1a3414884512 +Ref: glossary term-function-annotation14884820 +Ref: 168314884820 +Ref: glossary term-__future__14885520 +Ref: a2c14885520 +Ref: glossary term-garbage-collection14886153 +Ref: 131f14886153 +Ref: glossary term-generator14886473 +Ref: d1114886473 +Ref: glossary term-generator-iterator14886989 +Ref: 84414886989 +Ref: glossary term-generator-expression14887387 +Ref: 4a7c14887387 +Ref: glossary term-generic-function14887768 +Ref: 63514887768 +Ref: glossary term-generic-type14888127 +Ref: 133d14888127 +Ref: glossary term-GIL14888491 +Ref: 4df14888491 +Ref: glossary term-global-interpreter-lock14888542 +Ref: 8d814888542 +Ref: glossary term-hash-based-pyc14889719 +Ref: 4a7d14889719 +Ref: glossary term-hashable14889933 +Ref: 1e814889933 +Ref: glossary term-IDLE14890831 +Ref: 4a7e14890831 +Ref: glossary term-immutable14891033 +Ref: 164814891033 +Ref: glossary term-import-path14891377 +Ref: 19af14891377 +Ref: glossary term-importing14891716 +Ref: 199f14891716 +Ref: glossary term-importer14891837 +Ref: 19ae14891837 +Ref: glossary term-interactive14891963 +Ref: 4a7f14891963 +Ref: glossary term-interpreted14892385 +Ref: 4a8014892385 +Ref: glossary term-interpreter-shutdown14892879 +Ref: aff14892879 +Ref: glossary term-iterable14893613 +Ref: ed914893613 +Ref: glossary term-iterator14894798 +Ref: 134f14894798 +Ref: glossary term-key-function14896153 +Ref: a8614896153 +Ref: glossary term-keyword-argument14897315 +Ref: 98314897315 +Ref: glossary term-lambda14897365 +Ref: 215914897365 +Ref: glossary term-LBYL14897598 +Ref: 4a7b14897598 +Ref: glossary term-locale-encoding14898265 +Ref: 24df14898265 +Ref: glossary term-list14898716 +Ref: 4a8114898716 +Ref: glossary term-list-comprehension14898899 +Ref: 29714898899 +Ref: glossary term-loader14899317 +Ref: 19ad14899317 +Ref: glossary term-magic-method14899591 +Ref: 4a8214899591 +Ref: glossary term-mapping14899663 +Ref: e7014899663 +Ref: glossary term-meta-path-finder14900066 +Ref: d1f14900066 +Ref: glossary term-metaclass14900363 +Ref: 193b14900363 +Ref: glossary term-method14901103 +Ref: 4a7314901103 +Ref: glossary term-method-resolution-order14901413 +Ref: 1bc914901413 +Ref: glossary term-module14901690 +Ref: 199e14901690 +Ref: glossary term-module-spec14901953 +Ref: 3bcf14901953 +Ref: glossary term-MRO14902119 +Ref: 2e4814902119 +Ref: glossary term-mutable14902171 +Ref: 164f14902171 +Ref: glossary term-named-tuple14902296 +Ref: 22114902296 +Ref: glossary term-namespace14903463 +Ref: 16a414903463 +Ref: glossary term-namespace-package14904218 +Ref: 19a514904218 +Ref: glossary term-nested-scope14904541 +Ref: 1bac14904541 +Ref: glossary term-new-style-class14905029 +Ref: 22aa14905029 +Ref: glossary term-object14905351 +Ref: 4a8314905351 +Ref: glossary term-package14905515 +Ref: 19a214905515 +Ref: glossary term-parameter14905788 +Ref: 1a4414905788 +Ref: glossary positional-only-parameter14906331 +Ref: 6d714906331 +Ref: glossary keyword-only-parameter14906731 +Ref: 6dc14906731 +Ref: glossary term-path-entry14908243 +Ref: 19c914908243 +Ref: glossary term-path-entry-finder14908397 +Ref: d2014908397 +Ref: glossary term-path-entry-hook14908720 +Ref: 19cb14908720 +Ref: glossary term-path-based-finder14908912 +Ref: 19b214908912 +Ref: glossary term-path-like-object14909047 +Ref: 77314909047 +Ref: glossary term-PEP14909680 +Ref: 4a8414909680 +Ref: glossary term-portion14910334 +Ref: 19a714910334 +Ref: glossary term-positional-argument14910495 +Ref: 98414910495 +Ref: glossary term-provisional-API14910548 +Ref: 75714910548 +Ref: glossary term-provisional-package14911552 +Ref: cf114911552 +Ref: glossary term-Python-300014911611 +Ref: 4a8514911611 +Ref: glossary term-Pythonic14911804 +Ref: 4a8614911804 +Ref: glossary term-qualified-name14912444 +Ref: 134c14912444 +Ref: glossary term-reference-count14913289 +Ref: 425c14913289 +Ref: glossary term-regular-package14913697 +Ref: 19a414913697 +Ref: glossary term-__slots__14913864 +Ref: 1ac14913864 +Ref: glossary term-sequence14914210 +Ref: 164d14914210 +Ref: glossary term-set-comprehension14915170 +Ref: 4a8714915170 +Ref: glossary term-single-dispatch14915486 +Ref: 63614915486 +Ref: glossary term-slice14915637 +Ref: 1bc614915637 +Ref: glossary term-special-method14915963 +Ref: 12ab14915963 +Ref: glossary term-statement14916243 +Ref: 21a114916243 +Ref: glossary term-strong-reference14916487 +Ref: 36214916487 +Ref: glossary term-text-encoding14917050 +Ref: 1bc114917050 +Ref: glossary term-text-file14917574 +Ref: 16d014917574 +Ref: glossary term-triple-quoted-string14918096 +Ref: 4a8814918096 +Ref: glossary term-type14918596 +Ref: 133c14918596 +Ref: glossary term-type-alias14918830 +Ref: 4a8914918830 +Ref: glossary term-type-hint14919411 +Ref: 193614919411 +Ref: glossary term-universal-newlines14919997 +Ref: 9ae14919997 +Ref: glossary term-variable-annotation14920371 +Ref: 9d214920371 +Ref: glossary term-virtual-environment14921099 +Ref: 174014921099 +Ref: glossary term-virtual-machine14921408 +Ref: 2d4314921408 +Ref: glossary term-Zen-of-Python14921574 +Ref: 4a8a14921574 +Ref: Glossary-Footnote-114921840 +Ref: Glossary-Footnote-214921882 +Ref: Glossary-Footnote-314921924 +Ref: Glossary-Footnote-414921966 +Ref: Glossary-Footnote-514922008 +Ref: Glossary-Footnote-614922050 +Ref: Glossary-Footnote-714922092 +Ref: Glossary-Footnote-814922134 +Ref: Glossary-Footnote-914922176 +Ref: Glossary-Footnote-1014922218 +Ref: Glossary-Footnote-1114922257 +Ref: Glossary-Footnote-1214922300 +Ref: Glossary-Footnote-1314922343 +Ref: Glossary-Footnote-1414922386 +Ref: Glossary-Footnote-1514922418 +Ref: Glossary-Footnote-1614922461 +Ref: Glossary-Footnote-1714922504 +Ref: Glossary-Footnote-1814922547 +Ref: Glossary-Footnote-1914922590 +Ref: Glossary-Footnote-2014922633 +Ref: Glossary-Footnote-2114922676 +Ref: Glossary-Footnote-2214922719 +Ref: Glossary-Footnote-2314922762 +Ref: Glossary-Footnote-2414922805 +Ref: Glossary-Footnote-2514922848 +Ref: Glossary-Footnote-2614922891 +Ref: Glossary-Footnote-2714922950 +Ref: Glossary-Footnote-2814922993 +Ref: Glossary-Footnote-2914923036 +Ref: Glossary-Footnote-3014923079 +Ref: Glossary-Footnote-3114923122 +Ref: Glossary-Footnote-3214923165 +Ref: Glossary-Footnote-3314923208 +Ref: Glossary-Footnote-3414923251 +Ref: Glossary-Footnote-3514923294 +Ref: Glossary-Footnote-3614923337 +Ref: Glossary-Footnote-3714923380 +Ref: Glossary-Footnote-3814923423 +Ref: Glossary-Footnote-3914923466 +Node: About these documents14923509 +Ref: about doc14923613 +Ref: 4a8b14923613 +Ref: about about-these-documents14923613 +Ref: 4a8c14923613 +Ref: About these documents-Footnote-114924515 +Ref: About these documents-Footnote-214924564 +Ref: About these documents-Footnote-314924595 +Node: Contributors to the Python Documentation14924636 +Ref: about contributors-to-the-python-documentation14924734 +Ref: 4a8d14924734 +Ref: Contributors to the Python Documentation-Footnote-114925193 +Node: Dealing with Bugs14925255 +Ref: bugs doc14925360 +Ref: 4a8e14925360 +Ref: bugs dealing-with-bugs14925360 +Ref: 4a8f14925360 +Ref: bugs reporting-bugs14925360 +Ref: 42b314925360 +Node: Documentation bugs14925903 +Ref: bugs documentation-bugs14926014 +Ref: 4a9114926014 +Ref: Documentation bugs-Footnote-114927084 +Ref: Documentation bugs-Footnote-214927170 +Ref: Documentation bugs-Footnote-314927215 +Ref: Documentation bugs-Footnote-414927291 +Node: Using the Python issue tracker14927352 +Ref: bugs using-the-python-issue-tracker14927519 +Ref: 4a9314927519 +Ref: bugs using-the-tracker14927519 +Ref: 4a9214927519 +Ref: Using the Python issue tracker-Footnote-114929750 +Ref: Using the Python issue tracker-Footnote-214929813 +Node: Getting started contributing to Python yourself14929879 +Ref: bugs contributing-to-python14930019 +Ref: 4a9014930019 +Ref: bugs getting-started-contributing-to-python-yourself14930019 +Ref: 4a9414930019 +Ref: Getting started contributing to Python yourself-Footnote-114930538 +Ref: Getting started contributing to Python yourself-Footnote-214930575 +Node: Copyright14930651 +Ref: copyright doc14930754 +Ref: 4a9514930754 +Ref: copyright copyright14930754 +Ref: 4a9614930754 +Ref: copyright core-mentorship-mailing-list14930754 +Ref: 4a9714930754 +Node: History and License14931269 +Ref: license doc14931397 +Ref: 4a9914931397 +Ref: license history-and-license14931397 +Ref: 4a9814931397 +Ref: license id114931397 +Ref: 4a9a14931397 +Node: History of the software14931607 +Ref: license history-of-the-software14931755 +Ref: 4a9b14931755 +Node: Terms and conditions for accessing or otherwise using Python14936292 +Ref: license terms-and-conditions-for-accessing-or-otherwise-using-python14936504 +Ref: 4a9c14936504 +Node: PSF LICENSE AGREEMENT FOR PYTHON 3 11 014937673 +Ref: license psf-license14937861 +Ref: 4a9d14937861 +Ref: license psf-license-agreement-for-python-release14937861 +Ref: 4aa014937861 +Node: BEOPEN COM LICENSE AGREEMENT FOR PYTHON 2 014940542 +Ref: license beopen-com-license-agreement-for-python-2-014940778 +Ref: 4aa114940778 +Node: CNRI LICENSE AGREEMENT FOR PYTHON 1 6 114943486 +Ref: license cnri-license-agreement-for-python-1-6-114943733 +Ref: 4aa214943733 +Node: CWI LICENSE AGREEMENT FOR PYTHON 0 9 0 THROUGH 1 214947911 +Ref: license cwi-license-agreement-for-python-0-9-0-through-1-214948182 +Ref: 4aa314948182 +Node: ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON 3 11 0 DOCUMENTATION14949452 +Ref: license bsd014949675 +Ref: 4a9e14949675 +Ref: license zero-clause-bsd-license-for-code-in-the-python-release-documentation14949675 +Ref: 4aa414949675 +Node: Licenses and Acknowledgements for Incorporated Software14950479 +Ref: license licenses-and-acknowledgements-for-incorporated-software14950659 +Ref: 4aa514950659 +Ref: license otherlicenses14950659 +Ref: 4a9f14950659 +Node: Mersenne Twister14951294 +Ref: license mersenne-twister14951421 +Ref: 4aa614951421 +Node: Sockets<2>14953695 +Ref: license sockets14953859 +Ref: 4aa714953859 +Node: Asynchronous socket services14955694 +Ref: license asynchronous-socket-services14955859 +Ref: 4aa814955859 +Node: Cookie management14957079 +Ref: license cookie-management14957251 +Ref: 4aa914957251 +Node: Execution tracing14958468 +Ref: license execution-tracing14958643 +Ref: 4aaa14958643 +Node: UUencode and UUdecode functions14959903 +Ref: license uuencode-and-uudecode-functions14960087 +Ref: 4aab14960087 +Node: XML Remote Procedure Calls14961669 +Ref: license xml-remote-procedure-calls14961846 +Ref: 4aac14961846 +Node: test_epoll14963371 +Ref: license test-epoll14963530 +Ref: 4aad14963530 +Node: Select kqueue14964790 +Ref: license select-kqueue14964932 +Ref: 4aae14964932 +Node: SipHash2414966486 +Ref: license siphash2414966633 +Ref: 4aaf14966633 +Node: strtod and dtoa14967816 +Ref: license strtod-and-dtoa14967957 +Ref: 4ab014967957 +Node: OpenSSL14969354 +Ref: license openssl14969491 +Ref: 4ab114969491 +Node: expat14977035 +Ref: license expat14977163 +Ref: 4ab214977163 +Node: libffi14978563 +Ref: license libffi14978691 +Ref: 4ab314978691 +Node: zlib<3>14980034 +Ref: license zlib14980164 +Ref: 4ab414980164 +Node: cfuhash14981397 +Ref: license cfuhash14981529 +Ref: 4ab514981529 +Node: libmpdec14983346 +Ref: license libmpdec14983490 +Ref: 4ab614983490 +Node: W3C C14N test suite14985054 +Ref: license w3c-c14n-test-suite14985182 +Ref: 4ab714985182 +Node: Distributing Python Modules Legacy version14987085 +Ref: distutils/index doc14987244 +Ref: 4ab814987244 +Ref: distutils/index distributing-python-modules-legacy-version14987244 +Ref: 4ab914987244 +Ref: distutils/index distutils-index14987244 +Ref: b8814987244 +Ref: Distributing Python Modules Legacy version-Footnote-114988999 +Node: An Introduction to Distutils14989065 +Ref: distutils/introduction doc14989205 +Ref: 4aba14989205 +Ref: distutils/introduction an-introduction-to-distutils14989205 +Ref: 4abb14989205 +Ref: distutils/introduction distutils-intro14989205 +Ref: 4abc14989205 +Node: Concepts & Terminology14989960 +Ref: distutils/introduction concepts-terminology14990075 +Ref: 4abd14990075 +Ref: distutils/introduction distutils-concepts14990075 +Ref: 4abe14990075 +Node: A Simple Example<2>14991279 +Ref: distutils/introduction a-simple-example14991429 +Ref: 4abf14991429 +Ref: distutils/introduction distutils-simple-example14991429 +Ref: 4ac014991429 +Node: General Python terminology14994773 +Ref: distutils/introduction general-python-terminology14994931 +Ref: 4ac214994931 +Ref: distutils/introduction python-terms14994931 +Ref: 4ac314994931 +Node: Distutils-specific terminology14996926 +Ref: distutils/introduction distutils-specific-terminology14997056 +Ref: 4ac414997056 +Ref: distutils/introduction distutils-term14997056 +Ref: 4ac514997056 +Node: Writing the Setup Script14998213 +Ref: distutils/setupscript doc14998398 +Ref: 4ac614998398 +Ref: distutils/setupscript setup-script14998398 +Ref: 4ac114998398 +Ref: distutils/setupscript writing-the-setup-script14998398 +Ref: 4ac714998398 +Node: Listing whole packages15001793 +Ref: distutils/setupscript listing-packages15001911 +Ref: 4ac915001911 +Ref: distutils/setupscript listing-whole-packages15001911 +Ref: 4aca15001911 +Node: Listing individual modules15004371 +Ref: distutils/setupscript listing-individual-modules15004526 +Ref: 4acb15004526 +Ref: distutils/setupscript listing-modules15004526 +Ref: 4acc15004526 +Node: Describing extension modules15005335 +Ref: distutils/setupscript describing-extension-modules15005516 +Ref: 4acd15005516 +Ref: distutils/setupscript describing-extensions15005516 +Ref: 4ace15005516 +Node: Extension names and packages15007255 +Ref: distutils/setupscript extension-names-and-packages15007379 +Ref: 4ad015007379 +Node: Extension source files15008478 +Ref: distutils/setupscript extension-source-files15008631 +Ref: 4ad115008631 +Node: Preprocessor options15010027 +Ref: distutils/setupscript preprocessor-options15010167 +Ref: 4ad215010167 +Node: Library options15013185 +Ref: distutils/setupscript library-options15013316 +Ref: 4ad315013316 +Node: Other options15014294 +Ref: distutils/setupscript other-options15014396 +Ref: 4ad415014396 +Node: Relationships between Distributions and Packages15015551 +Ref: distutils/setupscript relationships-between-distributions-and-packages15015724 +Ref: 4ad515015724 +Node: Installing Scripts15019102 +Ref: distutils/setupscript distutils-installing-scripts15019270 +Ref: 4ad615019270 +Ref: distutils/setupscript installing-scripts15019270 +Ref: 4ad715019270 +Node: Installing Package Data15020377 +Ref: distutils/setupscript distutils-installing-package-data15020524 +Ref: 4ad815020524 +Ref: distutils/setupscript installing-package-data15020524 +Ref: 4ad915020524 +Node: Installing Additional Files15022231 +Ref: distutils/setupscript distutils-additional-files15022380 +Ref: 4ada15022380 +Ref: distutils/setupscript installing-additional-files15022380 +Ref: 4adb15022380 +Node: Additional meta-data15024269 +Ref: distutils/setupscript additional-meta-data15024421 +Ref: 4adc15024421 +Ref: distutils/setupscript meta-data15024421 +Ref: 4ac815024421 +Ref: Additional meta-data-Footnote-115031746 +Node: Debugging the setup script15031783 +Ref: distutils/setupscript debug-setup-script15031899 +Ref: 4add15031899 +Ref: distutils/setupscript debugging-the-setup-script15031899 +Ref: 4ade15031899 +Node: Writing the Setup Configuration File15032974 +Ref: distutils/configfile doc15033161 +Ref: 4adf15033161 +Ref: distutils/configfile setup-config15033161 +Ref: 4ae015033161 +Ref: distutils/configfile writing-the-setup-configuration-file15033161 +Ref: 4ae115033161 +Ref: distutils/configfile distutils-build-ext-inplace15036370 +Ref: 4ae215036370 +Ref: Writing the Setup Configuration File-Footnote-115038829 +Node: Creating a Source Distribution15038939 +Ref: distutils/sourcedist doc15039130 +Ref: 4ae415039130 +Ref: distutils/sourcedist creating-a-source-distribution15039130 +Ref: 4ae515039130 +Ref: distutils/sourcedist source-dist15039130 +Ref: 4ae615039130 +Ref: Creating a Source Distribution-Footnote-115042225 +Ref: Creating a Source Distribution-Footnote-215042267 +Node: Specifying the files to distribute15042292 +Ref: distutils/sourcedist manifest15042426 +Ref: 429715042426 +Ref: distutils/sourcedist specifying-the-files-to-distribute15042426 +Ref: 4ae715042426 +Node: Manifest-related options15048401 +Ref: distutils/sourcedist manifest-options15048535 +Ref: 4ae915048535 +Ref: distutils/sourcedist manifest-related-options15048535 +Ref: 4aea15048535 +Node: Creating Built Distributions15049638 +Ref: distutils/builtdist doc15049811 +Ref: 4aeb15049811 +Ref: distutils/builtdist built-dist15049811 +Ref: 4aec15049811 +Ref: distutils/builtdist creating-built-distributions15049811 +Ref: 4aed15049811 +Node: Creating RPM packages15056865 +Ref: distutils/builtdist creating-rpm-packages15056986 +Ref: 4aee15056986 +Ref: distutils/builtdist creating-rpms15056986 +Ref: 4aef15056986 +Node: Cross-compiling on Windows15064516 +Ref: distutils/builtdist cross-compile-windows15064637 +Ref: 4af015064637 +Ref: distutils/builtdist cross-compiling-on-windows15064637 +Ref: 4af115064637 +Node: The Postinstallation script15066193 +Ref: distutils/builtdist postinstallation-script15066283 +Ref: 4af215066283 +Ref: distutils/builtdist the-postinstallation-script15066283 +Ref: 4af315066283 +Ref: distutils/builtdist directory_created15067188 +Ref: 4af415067188 +Ref: distutils/builtdist file_created15067227 +Ref: 4af515067227 +Ref: distutils/builtdist get_special_folder_path15067578 +Ref: 4af615067578 +Ref: distutils/builtdist create_shortcut15068468 +Ref: 4af715068468 +Node: Distutils Examples15069185 +Ref: distutils/examples doc15069347 +Ref: 4af815069347 +Ref: distutils/examples distutils-examples15069347 +Ref: 4af915069347 +Ref: distutils/examples id115069347 +Ref: 4afa15069347 +Ref: Distutils Examples-Footnote-115070230 +Node: Pure Python distribution by module15070286 +Ref: distutils/examples pure-mod15070419 +Ref: 4afb15070419 +Ref: distutils/examples pure-python-distribution-by-module15070419 +Ref: 4afc15070419 +Node: Pure Python distribution by package15072203 +Ref: distutils/examples pure-pkg15072368 +Ref: 4afd15072368 +Ref: distutils/examples pure-python-distribution-by-package15072368 +Ref: 4afe15072368 +Node: Single extension module15076137 +Ref: distutils/examples single-ext15076286 +Ref: 4aff15076286 +Ref: distutils/examples single-extension-module15076286 +Ref: 4b0015076286 +Node: Checking a package15077401 +Ref: distutils/examples checking-a-package15077535 +Ref: 4b0115077535 +Ref: Checking a package-Footnote-115079184 +Node: Reading the metadata15079224 +Ref: distutils/examples reading-the-metadata15079326 +Ref: 4b0215079326 +Node: Extending Distutils15080965 +Ref: distutils/extending doc15081116 +Ref: 4b0315081116 +Ref: distutils/extending docutils15081116 +Ref: 4b0415081116 +Ref: distutils/extending extending-distutils15081116 +Ref: 183b15081116 +Ref: distutils/extending id115081116 +Ref: 4b0515081116 +Node: Integrating new commands15082399 +Ref: distutils/extending integrating-new-commands15082517 +Ref: 4b0715082517 +Node: Adding new distribution types15085417 +Ref: distutils/extending adding-new-distribution-types15085535 +Ref: 4b0815085535 +Node: Command Reference15085989 +Ref: distutils/commandref doc15086135 +Ref: 4b0915086135 +Ref: distutils/commandref command-reference15086135 +Ref: 4b0a15086135 +Ref: distutils/commandref reference15086135 +Ref: 4b0b15086135 +Node: Installing modules the install command family15086651 +Ref: distutils/commandref install-cmd15086807 +Ref: 4b0c15086807 +Ref: distutils/commandref installing-modules-the-install-command-family15086807 +Ref: 4b0d15086807 +Node: install_data15087133 +Ref: distutils/commandref install-data15087251 +Ref: 4b0e15087251 +Ref: distutils/commandref install-data-cmd15087251 +Ref: 4b0f15087251 +Node: install_scripts15087374 +Ref: distutils/commandref install-scripts15087492 +Ref: 4b1015087492 +Ref: distutils/commandref install-scripts-cmd15087492 +Ref: 4b1115087492 +Node: Creating a source distribution the sdist command15087616 +Ref: distutils/commandref creating-a-source-distribution-the-sdist-command15087772 +Ref: 4b1215087772 +Ref: distutils/commandref sdist-cmd15087772 +Ref: 4ae815087772 +Node: API Reference15090544 +Ref: distutils/apiref doc15090662 +Ref: 4b1315090662 +Ref: distutils/apiref api-reference15090662 +Ref: 4b1415090662 +Ref: distutils/apiref id115090662 +Ref: 4b1515090662 +Ref: API Reference-Footnote-115096303 +Node: distutils core — Core Distutils functionality15096416 +Ref: distutils/apiref distutils-core-core-distutils-functionality15096566 +Ref: 4b1615096566 +Ref: distutils/apiref module-distutils core15096566 +Ref: 5015096566 +Ref: distutils/apiref distutils core setup15096973 +Ref: 429415096973 +Ref: distutils/apiref distutils core run_setup15103884 +Ref: 4b1915103884 +Ref: distutils/apiref distutils core Extension15106304 +Ref: 4acf15106304 +Ref: distutils/apiref distutils core Distribution15113728 +Ref: 4b1715113728 +Ref: distutils/apiref distutils core Command15114245 +Ref: 4b1815114245 +Ref: distutils core — Core Distutils functionality-Footnote-115114444 +Ref: distutils core — Core Distutils functionality-Footnote-215114481 +Node: distutils ccompiler — CCompiler base class15114523 +Ref: distutils/apiref distutils-ccompiler-ccompiler-base-class15114725 +Ref: 4b1a15114725 +Ref: distutils/apiref module-distutils ccompiler15114725 +Ref: 3a15114725 +Ref: distutils/apiref distutils ccompiler gen_lib_options15115218 +Ref: 4b1c15115218 +Ref: distutils/apiref distutils ccompiler gen_preprocess_options15115704 +Ref: 4b1d15115704 +Ref: distutils/apiref distutils ccompiler get_default_compiler15116370 +Ref: 4b1e15116370 +Ref: distutils/apiref distutils ccompiler new_compiler15116839 +Ref: 4b1f15116839 +Ref: distutils/apiref distutils ccompiler show_compilers15117639 +Ref: 4b2015117639 +Ref: distutils/apiref distutils ccompiler CCompiler15117832 +Ref: 4b1b15117832 +Ref: distutils/apiref distutils ccompiler CCompiler add_include_dir15119269 +Ref: 4b2115119269 +Ref: distutils/apiref distutils ccompiler CCompiler set_include_dirs15119571 +Ref: 4b2215119571 +Ref: distutils/apiref distutils ccompiler CCompiler add_library15120044 +Ref: 4b2315120044 +Ref: distutils/apiref distutils ccompiler CCompiler set_libraries15120831 +Ref: 4b2415120831 +Ref: distutils/apiref distutils ccompiler CCompiler add_library_dir15121126 +Ref: 4b2515121126 +Ref: distutils/apiref distutils ccompiler CCompiler set_library_dirs15121532 +Ref: 4b2615121532 +Ref: distutils/apiref distutils ccompiler CCompiler add_runtime_library_dir15121773 +Ref: 4b2715121773 +Ref: distutils/apiref distutils ccompiler CCompiler set_runtime_library_dirs15121934 +Ref: 4b2815121934 +Ref: distutils/apiref distutils ccompiler CCompiler define_macro15122220 +Ref: 4b2915122220 +Ref: distutils/apiref distutils ccompiler CCompiler undefine_macro15122588 +Ref: 4b2a15122588 +Ref: distutils/apiref distutils ccompiler CCompiler add_link_object15123111 +Ref: 4b2b15123111 +Ref: distutils/apiref distutils ccompiler CCompiler set_link_objects15123394 +Ref: 4b2c15123394 +Ref: distutils/apiref distutils ccompiler CCompiler detect_language15123837 +Ref: 4b2d15123837 +Ref: distutils/apiref distutils ccompiler CCompiler find_library_file15124081 +Ref: 4b2e15124081 +Ref: distutils/apiref distutils ccompiler CCompiler has_function15124490 +Ref: 4b2f15124490 +Ref: distutils/apiref distutils ccompiler CCompiler library_dir_option15124892 +Ref: 4b3015124892 +Ref: distutils/apiref distutils ccompiler CCompiler library_option15125047 +Ref: 4b3115125047 +Ref: distutils/apiref distutils ccompiler CCompiler runtime_library_dir_option15125218 +Ref: 4b3215125218 +Ref: distutils/apiref distutils ccompiler CCompiler set_executables15125389 +Ref: 4b3315125389 +Ref: distutils/apiref distutils ccompiler CCompiler compile15126886 +Ref: 4b3515126886 +Ref: distutils/apiref distutils ccompiler CCompiler create_static_lib15129668 +Ref: 4b3615129668 +Ref: distutils/apiref distutils ccompiler CCompiler link15130952 +Ref: 4b3715130952 +Ref: distutils/apiref distutils ccompiler CCompiler link_executable15133612 +Ref: 4b3815133612 +Ref: distutils/apiref distutils ccompiler CCompiler link_shared_lib15134102 +Ref: 4b3915134102 +Ref: distutils/apiref distutils ccompiler CCompiler link_shared_object15134644 +Ref: 4b3a15134644 +Ref: distutils/apiref distutils ccompiler CCompiler preprocess15135210 +Ref: 4b3b15135210 +Ref: distutils/apiref distutils ccompiler CCompiler executable_filename15136097 +Ref: 4b3c15136097 +Ref: distutils/apiref distutils ccompiler CCompiler library_filename15136401 +Ref: 4b3d15136401 +Ref: distutils/apiref distutils ccompiler CCompiler object_filenames15136806 +Ref: 4b3e15136806 +Ref: distutils/apiref distutils ccompiler CCompiler shared_object_filename15137042 +Ref: 4b3f15137042 +Ref: distutils/apiref distutils ccompiler CCompiler execute15137237 +Ref: 4b4015137237 +Ref: distutils/apiref distutils ccompiler CCompiler spawn15137521 +Ref: 4b4215137521 +Ref: distutils/apiref distutils ccompiler CCompiler mkpath15137670 +Ref: 4b4315137670 +Ref: distutils/apiref distutils ccompiler CCompiler move_file15137848 +Ref: 4b4515137848 +Ref: distutils/apiref distutils ccompiler CCompiler announce15137986 +Ref: 4b4715137986 +Ref: distutils/apiref distutils ccompiler CCompiler warn15138092 +Ref: 4b4815138092 +Ref: distutils/apiref distutils ccompiler CCompiler debug_print15138181 +Ref: 4b4915138181 +Node: distutils unixccompiler — Unix C Compiler15138370 +Ref: distutils/apiref distutils-unixccompiler-unix-c-compiler15138570 +Ref: 4b4a15138570 +Ref: distutils/apiref module-distutils unixccompiler15138570 +Ref: 6015138570 +Node: distutils msvccompiler — Microsoft Compiler15139337 +Ref: distutils/apiref distutils-msvccompiler-microsoft-compiler15139536 +Ref: 4b4b15139536 +Ref: distutils/apiref module-distutils msvccompiler15139536 +Ref: 5c15139536 +Node: distutils bcppcompiler — Borland Compiler15140524 +Ref: distutils/apiref distutils-bcppcompiler-borland-compiler15140724 +Ref: 4b4c15140724 +Ref: distutils/apiref module-distutils bcppcompiler15140724 +Ref: 3915140724 +Node: distutils cygwincompiler — Cygwin Compiler15140958 +Ref: distutils/apiref distutils-cygwincompiler-cygwin-compiler15141159 +Ref: 4b4d15141159 +Ref: distutils/apiref module-distutils cygwinccompiler15141159 +Ref: 5115141159 +Node: distutils archive_util — Archiving utilities15141541 +Ref: distutils/apiref distutils-archive-util-archiving-utilities15141741 +Ref: 4b4e15141741 +Ref: distutils/apiref module-distutils archive_util15141741 +Ref: 3815141741 +Ref: distutils/apiref distutils archive_util make_archive15141952 +Ref: 4b4f15141952 +Ref: distutils/apiref distutils archive_util make_tarball15142864 +Ref: 4b5015142864 +Ref: distutils/apiref distutils archive_util make_zipfile15143652 +Ref: 4b5115143652 +Node: distutils dep_util — Dependency checking15144166 +Ref: distutils/apiref distutils-dep-util-dependency-checking15144370 +Ref: 4b5215144370 +Ref: distutils/apiref module-distutils dep_util15144370 +Ref: 5315144370 +Ref: distutils/apiref distutils dep_util newer15144659 +Ref: 4b5315144659 +Ref: distutils/apiref distutils dep_util newer_pairwise15144999 +Ref: 4b5415144999 +Ref: distutils/apiref distutils dep_util newer_group15145321 +Ref: 4b5515145321 +Node: distutils dir_util — Directory tree operations15146222 +Ref: distutils/apiref distutils-dir-util-directory-tree-operations15146426 +Ref: 4b5615146426 +Ref: distutils/apiref module-distutils dir_util15146426 +Ref: 5415146426 +Ref: distutils/apiref distutils dir_util mkpath15146632 +Ref: 4b4415146632 +Ref: distutils/apiref distutils dir_util create_tree15147241 +Ref: 4b5715147241 +Ref: distutils/apiref distutils dir_util copy_tree15147802 +Ref: 4b5815147802 +Ref: distutils/apiref distutils dir_util remove_tree15149281 +Ref: 4b5a15149281 +Ref: distutils dir_util — Directory tree operations-Footnote-115149595 +Node: distutils file_util — Single file operations15149641 +Ref: distutils/apiref distutils-file-util-single-file-operations15149859 +Ref: 4b5b15149859 +Ref: distutils/apiref module-distutils file_util15149859 +Ref: 5915149859 +Ref: distutils/apiref distutils file_util copy_file15150056 +Ref: 4b5915150056 +Ref: distutils/apiref distutils file_util move_file15151476 +Ref: 4b4615151476 +Ref: distutils/apiref distutils file_util write_file15151887 +Ref: 4b5c15151887 +Node: distutils util — Miscellaneous other utility functions15152074 +Ref: distutils/apiref distutils-util-miscellaneous-other-utility-functions15152285 +Ref: 4b5d15152285 +Ref: distutils/apiref module-distutils util15152285 +Ref: 6115152285 +Ref: distutils/apiref distutils util get_platform15152523 +Ref: 4b5e15152523 +Ref: distutils/apiref distutils util convert_path15155079 +Ref: 4b5f15155079 +Ref: distutils/apiref distutils util change_root15155624 +Ref: 4b6015155624 +Ref: distutils/apiref distutils util check_environ15155949 +Ref: 4b6115155949 +Ref: distutils/apiref distutils util subst_vars15156368 +Ref: 4b6215156368 +Ref: distutils/apiref distutils util split_quoted15157182 +Ref: 4b3415157182 +Ref: distutils/apiref distutils util execute15157757 +Ref: 4b4115157757 +Ref: distutils/apiref distutils util strtobool15158277 +Ref: 4b6315158277 +Ref: distutils/apiref distutils util byte_compile15158630 +Ref: 4b6415158630 +Ref: distutils/apiref distutils util rfc822_escape15160658 +Ref: 4b6515160658 +Ref: distutils util — Miscellaneous other utility functions-Footnote-115160951 +Ref: distutils util — Miscellaneous other utility functions-Footnote-215160993 +Ref: distutils util — Miscellaneous other utility functions-Footnote-315161035 +Ref: distutils util — Miscellaneous other utility functions-Footnote-415161077 +Node: distutils dist — The Distribution class15161135 +Ref: distutils/apiref distutils-dist-the-distribution-class15161343 +Ref: 4b6615161343 +Ref: distutils/apiref module-distutils dist15161343 +Ref: 5515161343 +Node: distutils extension — The Extension class15161585 +Ref: distutils/apiref distutils-extension-the-extension-class15161777 +Ref: 4b6715161777 +Ref: distutils/apiref module-distutils extension15161777 +Ref: 5715161777 +Node: distutils debug — Distutils debug mode15161996 +Ref: distutils/apiref distutils-debug-distutils-debug-mode15162188 +Ref: 4b6815162188 +Ref: distutils/apiref module-distutils debug15162188 +Ref: 5215162188 +Node: distutils errors — Distutils exceptions15162331 +Ref: distutils/apiref distutils-errors-distutils-exceptions15162548 +Ref: 4b6915162548 +Ref: distutils/apiref module-distutils errors15162548 +Ref: 5615162548 +Node: distutils fancy_getopt — Wrapper around the standard getopt module15163048 +Ref: distutils/apiref distutils-fancy-getopt-wrapper-around-the-standard-getopt-module15163266 +Ref: 4b6a15163266 +Ref: distutils/apiref module-distutils fancy_getopt15163266 +Ref: 5815163266 +Ref: distutils/apiref distutils fancy_getopt fancy_getopt15163972 +Ref: 4b6b15163972 +Ref: distutils/apiref distutils fancy_getopt wrap_text15164630 +Ref: 4b6d15164630 +Ref: distutils/apiref distutils fancy_getopt FancyGetopt15164738 +Ref: 4b6c15164738 +Ref: distutils/apiref distutils fancy_getopt FancyGetopt getopt15165303 +Ref: 4b6e15165303 +Ref: distutils/apiref distutils fancy_getopt FancyGetopt get_option_order15165905 +Ref: 4b6f15165905 +Ref: distutils/apiref distutils fancy_getopt FancyGetopt generate_help15166149 +Ref: 4b7015166149 +Node: distutils filelist — The FileList class15166429 +Ref: distutils/apiref distutils-filelist-the-filelist-class15166652 +Ref: 4b7115166652 +Ref: distutils/apiref module-distutils filelist15166652 +Ref: 5a15166652 +Node: distutils log — Simple PEP 282-style logging15166873 +Ref: distutils/apiref distutils-log-simple-pep-282-style-logging15167067 +Ref: 4b7215167067 +Ref: distutils/apiref module-distutils log15167067 +Ref: 5b15167067 +Node: distutils spawn — Spawn a sub-process15167165 +Ref: distutils/apiref distutils-spawn-spawn-a-sub-process15167374 +Ref: 4b7315167374 +Ref: distutils/apiref module-distutils spawn15167374 +Ref: 5d15167374 +Node: distutils sysconfig — System configuration information15167713 +Ref: distutils/apiref distutils-sysconfig-system-configuration-information15167918 +Ref: 4b7415167918 +Ref: distutils/apiref module-distutils sysconfig15167918 +Ref: 5e15167918 +Ref: distutils/apiref distutils sysconfig PREFIX15168866 +Ref: 4b7515168866 +Ref: distutils/apiref distutils sysconfig EXEC_PREFIX15168960 +Ref: 4b7615168960 +Ref: distutils/apiref distutils sysconfig get_config_var15169064 +Ref: 4b7715169064 +Ref: distutils/apiref distutils sysconfig get_config_vars15169229 +Ref: 4b7815169229 +Ref: distutils/apiref distutils sysconfig get_config_h_filename15169683 +Ref: 4b7915169683 +Ref: distutils/apiref distutils sysconfig get_makefile_filename15170043 +Ref: 4b7a15170043 +Ref: distutils/apiref distutils sysconfig get_python_inc15170524 +Ref: 4b7b15170524 +Ref: distutils/apiref distutils sysconfig get_python_lib15171055 +Ref: 4b7c15171055 +Ref: distutils/apiref distutils sysconfig customize_compiler15171860 +Ref: 4b7d15171860 +Ref: distutils/apiref distutils sysconfig set_python_build15172530 +Ref: 4b7e15172530 +Node: distutils text_file — The TextFile class15172853 +Ref: distutils/apiref distutils-text-file-the-textfile-class15173063 +Ref: 4b7f15173063 +Ref: distutils/apiref module-distutils text_file15173063 +Ref: 5f15173063 +Ref: distutils/apiref distutils text_file TextFile15173376 +Ref: 4b8015173376 +Ref: distutils/apiref distutils text_file TextFile open15177894 +Ref: 4b8415177894 +Ref: distutils/apiref distutils text_file TextFile close15178041 +Ref: 4b8315178041 +Ref: distutils/apiref distutils text_file TextFile warn15178205 +Ref: 4b8115178205 +Ref: distutils/apiref distutils text_file TextFile readline15178715 +Ref: 4b8515178715 +Ref: distutils/apiref distutils text_file TextFile readlines15179397 +Ref: 4b8615179397 +Ref: distutils/apiref distutils text_file TextFile unreadline15179604 +Ref: 4b8215179604 +Node: distutils version — Version number classes15180233 +Ref: distutils/apiref distutils-version-version-number-classes15180447 +Ref: 4b8715180447 +Ref: distutils/apiref module-distutils version15180447 +Ref: 6215180447 +Node: distutils cmd — Abstract base class for Distutils commands15180560 +Ref: distutils/apiref distutils-cmd-abstract-base-class-for-distutils-commands15180764 +Ref: 4b8815180764 +Ref: distutils/apiref module-distutils cmd15180764 +Ref: 3b15180764 +Ref: distutils/apiref distutils cmd Command15180976 +Ref: 4b0615180976 +Node: Creating a new Distutils command15182054 +Ref: distutils/apiref creating-a-new-distutils-command15182265 +Ref: 4b8c15182265 +Ref: distutils/apiref distutils cmd Command initialize_options15183134 +Ref: 4b8915183134 +Ref: distutils/apiref distutils cmd Command finalize_options15183582 +Ref: 4b8a15183582 +Ref: distutils/apiref distutils cmd Command run15184078 +Ref: 4b8b15184078 +Ref: distutils/apiref distutils cmd Command sub_commands15184504 +Ref: 4b8d15184504 +Node: distutils command — Individual Distutils commands15185495 +Ref: distutils/apiref distutils-command-individual-distutils-commands15185698 +Ref: 4b8e15185698 +Ref: distutils/apiref module-distutils command15185698 +Ref: 3c15185698 +Node: distutils command bdist — Build a binary installer15185825 +Ref: distutils/apiref distutils-command-bdist-build-a-binary-installer15186066 +Ref: 4b8f15186066 +Ref: distutils/apiref module-distutils command bdist15186066 +Ref: 3d15186066 +Node: distutils command bdist_packager — Abstract base class for packagers15186195 +Ref: distutils/apiref distutils-command-bdist-packager-abstract-base-class-for-packagers15186446 +Ref: 4b9015186446 +Ref: distutils/apiref module-distutils command bdist_packager15186446 +Ref: 3f15186446 +Node: distutils command bdist_dumb — Build a “dumb” installer15186611 +Ref: distutils/apiref distutils-command-bdist-dumb-build-a-dumb-installer15186894 +Ref: 4b9115186894 +Ref: distutils/apiref module-distutils command bdist_dumb15186894 +Ref: 3e15186894 +Node: distutils command bdist_rpm — Build a binary distribution as a Redhat RPM and SRPM15187037 +Ref: distutils/apiref distutils-command-bdist-rpm-build-a-binary-distribution-as-a-redhat-rpm-and-srpm15187305 +Ref: 4b9215187305 +Ref: distutils/apiref module-distutils command bdist_rpm15187305 +Ref: 4015187305 +Node: distutils command sdist — Build a source distribution15187498 +Ref: distutils/apiref distutils-command-sdist-build-a-source-distribution15187761 +Ref: 4b9315187761 +Ref: distutils/apiref module-distutils command sdist15187761 +Ref: 4f15187761 +Node: distutils command build — Build all files of a package15187896 +Ref: distutils/apiref distutils-command-build-build-all-files-of-a-package15188142 +Ref: 4b9415188142 +Ref: distutils/apiref module-distutils command build15188142 +Ref: 4115188142 +Node: distutils command build_clib — Build any C libraries in a package15188279 +Ref: distutils/apiref distutils-command-build-clib-build-any-c-libraries-in-a-package15188535 +Ref: 4b9515188535 +Ref: distutils/apiref module-distutils command build_clib15188535 +Ref: 4215188535 +Node: distutils command build_ext — Build any extensions in a package15188694 +Ref: distutils/apiref distutils-command-build-ext-build-any-extensions-in-a-package15188961 +Ref: 4b9615188961 +Ref: distutils/apiref module-distutils command build_ext15188961 +Ref: 4315188961 +Node: distutils command build_py — Build the py/ pyc files of a package15189116 +Ref: distutils/apiref distutils-command-build-py-build-the-py-pyc-files-of-a-package15189382 +Ref: 4b9715189382 +Ref: distutils/apiref module-distutils command build_py15189382 +Ref: 4415189382 +Ref: distutils/apiref distutils command build_py build_py15189543 +Ref: 4b9815189543 +Ref: distutils/apiref distutils command build_py build_py_2to315189591 +Ref: 4b9915189591 +Node: distutils command build_scripts — Build the scripts of a package15190208 +Ref: distutils/apiref distutils-command-build-scripts-build-the-scripts-of-a-package15190463 +Ref: 4b9a15190463 +Ref: distutils/apiref module-distutils command build_scripts15190463 +Ref: 4515190463 +Node: distutils command clean — Clean a package build area15190620 +Ref: distutils/apiref distutils-command-clean-clean-a-package-build-area15190866 +Ref: 4b9b15190866 +Ref: distutils/apiref module-distutils command clean15190866 +Ref: 4715190866 +Node: distutils command config — Perform package configuration15191310 +Ref: distutils/apiref distutils-command-config-perform-package-configuration15191537 +Ref: 4b9c15191537 +Ref: distutils/apiref module-distutils command config15191537 +Ref: 4815191537 +Node: distutils command install — Install a package15191678 +Ref: distutils/apiref distutils-command-install-install-a-package15191919 +Ref: 4b9d15191919 +Ref: distutils/apiref module-distutils command install15191919 +Ref: 4915191919 +Node: distutils command install_data — Install data files from a package15192038 +Ref: distutils/apiref distutils-command-install-data-install-data-files-from-a-package15192300 +Ref: 4b9e15192300 +Ref: distutils/apiref module-distutils command install_data15192300 +Ref: 4a15192300 +Node: distutils command install_headers — Install C/C++ header files from a package15192461 +Ref: distutils/apiref distutils-command-install-headers-install-c-c-header-files-from-a-package15192746 +Ref: 4b9f15192746 +Ref: distutils/apiref module-distutils command install_headers15192746 +Ref: 4b15192746 +Node: distutils command install_lib — Install library files from a package15192929 +Ref: distutils/apiref distutils-command-install-lib-install-library-files-from-a-package15193219 +Ref: 4ba015193219 +Ref: distutils/apiref module-distutils command install_lib15193219 +Ref: 4c15193219 +Node: distutils command install_scripts — Install script files from a package15193384 +Ref: distutils/apiref distutils-command-install-scripts-install-script-files-from-a-package15193673 +Ref: 4ba115193673 +Ref: distutils/apiref module-distutils command install_scripts15193673 +Ref: 4d15193673 +Node: distutils command register — Register a module with the Python Package Index15193844 +Ref: distutils/apiref distutils-command-register-register-a-module-with-the-python-package-index15194123 +Ref: 4ba215194123 +Ref: distutils/apiref module-distutils command register15194123 +Ref: 4e15194123 +Ref: distutils command register — Register a module with the Python Package Index-Footnote-115194470 +Node: distutils command check — Check the meta-data of a package15194512 +Ref: distutils/apiref distutils-command-check-check-the-meta-data-of-a-package15194709 +Ref: 4ba315194709 +Ref: distutils/apiref module-distutils command check15194709 +Ref: 4615194709 +Node: Installing Python Modules Legacy version15195051 +Ref: install/index doc15195210 +Ref: 4ba415195210 +Ref: install/index install-index15195210 +Ref: b8715195210 +Ref: install/index installing-python-modules-legacy-version15195210 +Ref: 4ba515195210 +Ref: Installing Python Modules Legacy version-Footnote-115196677 +Node: Introduction<16>15196743 +Ref: install/index inst-intro15196871 +Ref: 4ba615196871 +Ref: install/index introduction15196871 +Ref: 4ba715196871 +Node: Distutils based source distributions15197835 +Ref: install/index distutils-based-source-distributions15197924 +Ref: 4ba815197924 +Ref: install/index inst-new-standard15197924 +Ref: 4ba915197924 +Node: Standard Build and Install15199211 +Ref: install/index inst-standard-install15199370 +Ref: 4baa15199370 +Ref: install/index standard-build-and-install15199370 +Ref: 4bab15199370 +Node: Platform variations15199769 +Ref: install/index inst-platform-variations15199880 +Ref: 4bac15199880 +Ref: install/index platform-variations15199880 +Ref: 4bad15199880 +Node: Splitting the job up15200795 +Ref: install/index inst-splitting-up15200933 +Ref: 4bae15200933 +Ref: install/index splitting-the-job-up15200933 +Ref: 4baf15200933 +Node: How building works15202237 +Ref: install/index how-building-works15202378 +Ref: 4bb015202378 +Ref: install/index inst-how-build-works15202378 +Ref: 4bb115202378 +Node: How installation works15204107 +Ref: install/index how-installation-works15204219 +Ref: 4bb315204219 +Ref: install/index inst-how-install-works15204219 +Ref: 4bb415204219 +Node: Alternate Installation15209011 +Ref: install/index alternate-installation15209173 +Ref: 4bb715209173 +Ref: install/index inst-alt-install15209173 +Ref: 4bb515209173 +Node: Alternate installation the user scheme15210861 +Ref: install/index alternate-installation-the-user-scheme15211005 +Ref: 4bb815211005 +Ref: install/index inst-alt-install-user15211005 +Ref: 178c15211005 +Node: Alternate installation the home scheme15213401 +Ref: install/index alternate-installation-the-home-scheme15213599 +Ref: 4bb915213599 +Ref: install/index inst-alt-install-home15213599 +Ref: 4bba15213599 +Node: Alternate installation Unix the prefix scheme15215400 +Ref: install/index alternate-installation-unix-the-prefix-scheme15215608 +Ref: 4bbc15215608 +Ref: install/index inst-alt-install-prefix-unix15215608 +Ref: 4bbd15215608 +Node: Alternate installation Windows the prefix scheme15219643 +Ref: install/index alternate-installation-windows-the-prefix-scheme15219804 +Ref: 4bbe15219804 +Ref: install/index inst-alt-install-prefix-windows15219804 +Ref: 4bbf15219804 +Node: Custom Installation15221071 +Ref: install/index custom-installation15221236 +Ref: 4bc015221236 +Ref: install/index inst-custom-install15221236 +Ref: 4bb615221236 +Node: Modifying Python’s Search Path15228225 +Ref: install/index inst-search-path15228313 +Ref: 4bbb15228313 +Ref: install/index modifying-python-s-search-path15228313 +Ref: 4bc115228313 +Node: Distutils Configuration Files15232035 +Ref: install/index distutils-configuration-files15232213 +Ref: 4bc215232213 +Ref: install/index inst-config-files15232213 +Ref: 4bb215232213 +Node: Location and names of config files15232924 +Ref: install/index inst-config-filenames15233055 +Ref: 4bc315233055 +Ref: install/index location-and-names-of-config-files15233055 +Ref: 4bc415233055 +Node: Syntax of config files15236979 +Ref: install/index inst-config-syntax15237110 +Ref: 4ae315237110 +Ref: install/index syntax-of-config-files15237110 +Ref: 4bc515237110 +Node: Building Extensions Tips and Tricks15239036 +Ref: install/index building-extensions-tips-and-tricks15239186 +Ref: 4bc615239186 +Ref: install/index inst-building-ext15239186 +Ref: 4bc715239186 +Node: Tweaking compiler/linker flags15239792 +Ref: install/index inst-tweak-flags15239943 +Ref: 4bc815239943 +Ref: install/index tweaking-compiler-linker-flags15239943 +Ref: 4bc915239943 +Node: Using non-Microsoft compilers on Windows15243026 +Ref: install/index inst-non-ms-compilers15243177 +Ref: 4bca15243177 +Ref: install/index using-non-microsoft-compilers-on-windows15243177 +Ref: 4bcb15243177 +Node: Borland/CodeGear C++15243336 +Ref: install/index borland-codegear-c15243464 +Ref: 4bcc15243464 +Ref: Borland/CodeGear C++-Footnote-115245420 +Ref: Borland/CodeGear C++-Footnote-215245527 +Ref: Borland/CodeGear C++-Footnote-315245572 +Node: GNU C / Cygwin / MinGW15245626 +Ref: install/index gnu-c-cygwin-mingw15245754 +Ref: 4bcd15245754 +Ref: GNU C / Cygwin / MinGW-Footnote-115246763 +Ref: GNU C / Cygwin / MinGW-Footnote-215246839 +Node: Older Versions of Python and MinGW15246936 +Ref: install/index older-versions-of-python-and-mingw15247029 +Ref: 4bce15247029 +Ref: Older Versions of Python and MinGW-Footnote-115248684 +Node: Python Module Index15248750 +Node: Index15272055 +Ref: 3a4317189069 +Ref: using/cmdline audit_event_cpython_run_stdin_017189099 +Ref: 3a4217189130 +Ref: using/cmdline audit_event_cpython_run_file_017189161 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/info/sbcl.info-1.gz b/info/sbcl.info-1.gz new file mode 100644 index 0000000000000000000000000000000000000000..c0c3d2d575f17c012c9a723529951cc7e563bdc2 GIT binary patch literal 88616 zcmV($K;yq3iwFP!000021MFK{b0ar)e(ygKJfvzV70L0)m)*!-Z#0s|)xUeCGgtp*WgJZJtt5xjbYyaBy%g-?;$1TjgHS ze}0}8)4W{Rv8tTSn$%=!zEx}eVDMBu8s~Fcs^3pPn;xl!vul}BnCxo%^!3Cy-i)zsrCqJ;Le(q7V}*>ji+ZD-QGV-dvz{t7 zGls|f_Uqqo&ri(#~y9cK!o zJB(>Yz% z+fHyofuwhOee>hR)prmd2;s@?`Ps$YEDF?rK%y5{Z?7k37q^qy`RU!o^_7}MC1vK( z6t-HMvQB1qC%1Q#cI^4p-R+ObA=}Ea8sVRVsp|gjp!V9BLcP)DgF3bAHHq;u_mxWR zx*~R5a(;ETOECGT1pWuiWtjscaS8YmK@UG|6B9_b!#S@d}qq$7#}`vCdbD#?4qn$SRlX;X0?_fm@unt zRnZrIa~f=yznqzQvs{KR=Zi(2=B7-y{Pm65TAB>moLtQ=K(frV%Vg{m3A`i$zGc3J z3;JyGWvSjaC36C{j9ci`@ar30uS&f(K5*!aUiFEdZVddG5n^n-S} zo|D~okM6cr|LdtGXjw7M7rg$HJY7JcuSR-!d=5pFm8oOsygC+sgFXnRgN`QyI7B>B-cj=VTuYqurD zYg}r8gp8OzEaF$TDKhx_oRq#*a})52txFZTuaiS;Z?ZB)b$ATe&{>wV(GbvB8toK; zt@A=SL>_#nxRKY4c)3qNiMIsQ)sIAf*=Gc8RmPx=2)*sFGL z-!g$)vo`Cw0n-G(43NfF#HcR)hESbkvV~ZGZj5IcU^|adBV^LvCNx0#n)j;K4Was+ zG)pAYl`cgE%b;qlmeyv0w#pZvt+anoI^h>_6$v+QunUrgDS;5IqcIUR=>sz=5_ai| zLWD=~FgcVH<&v;mNG!Vo0i7`I6+La%(`r@yi9g)~xBj>zBI|~tCX%Ju`00{jiB3W3B9mUJyjF)-wl>ckcHCPQG;;47{67h6sE5*Sg0KnHRp2-nsDidV zGcZsNly1y3nQS(jDPixNCGt1p-K&NE*}wASjrF9RJ6+Z5;@jy=1WTUbsX*sG z@cDFvIoh-0euyEAp={By{3$8mSYD8QEOnXx!eJ-E0k2B%Febg#(a=i+^-_kGXGz2( z&MTG%i7OFOY2#~3q58;zSClR>MwPV=X$%{`T_i|RX>~XNZ7wAVHwC$34XY~bhOFp4 z?4^b!P;x_1vmk6Vjujj-9_JHDc`AB9_(@5YBE1)d5X}+YNqr>mutu#@#)`F~q}8N# zu@xJ-3ppnU|3uGKs>{;WNLR5e_||FKIGt`|irUMFlq8G1B~zOK9X&|Go=qlP(BmyR z&!g$mHhPphMFy?rMdRi^VF?_w=+`7yt|Z0%FzBZyi*jEO;^yR96ay&Hj7e zH(8)OSvX{#mhrL+Bk)qJ*Mb(WA^I4d)WnqWY(ZqOow2~wdbYC3{fbFvq^de6iy0W{ zhYeG*>Nd|lc+s&x;JyD~g7Eq7vwd#Md{fl+>QYk*xTA2XK@Kk1b&RZ$D-45<2slC{M@V17nmNEy=xVtlKEAgb60jR5JTFCt0IZ*5 zHb|1G2b~YBO0pKrIgHg6A^n;p?=YJAMzwXU4zKu@FacV=@0e(4F1M`p?WbC81r-1oZ>?r~p0nwB-N=Y9H0fR+|tXI@6 zgel}W#WtCI!e5ez_mGXIMUxq2O4}?~17}8d$4VE`N*3hp+Sn4}=F%j|8OSh1DpkQG z${-6AviTILTxLtE_iD9qc^zZpteFD^j{&TdHj%erC0g?4_TuVpa{cDd=cjjSMBa5M zPcF}|zPtPW@J|Oae=rQHD}Prb^sXTpR7X;&4ku65g%_9Pjs1yv;UH9!z3J?KiMNYV z5QoAid7x{`5{B4N&E(W|Wy&|RGxf#vOIYf9t4@k)MeNuoSf(ihiP&F}(%xz@AOL3c zG&MRqe>=OoeGgvVUSF%x@sPjElXq{c@jbed^!n@|@<5hC5SV9Q+SR5D}iO zurmI7Q#)p8KcxzJHE^CcN`|g#sxZ4vzB~E1^9gOQn+5Y)Iw}bYYb#Hdn^BGH$t{Bx z5wj>#mvu}JEvr*J_#`$PCK*+~D+;hg)@m9HZ zl-yDWt_8Aig_wS5=yOq`}OZ(?iJwt-<$G3=7j|)p*us?{Sy)c zs#BIB@Pg`wVxnZuz^#PB#-b^PC}B#jzg|ycpGA<2{jtdAq%Z`HOpO*s*C^?Tkz+rf z&^uaK66n}KLadq8=%m$?Fx+!7F)>e-qu~dv)+2bfg#aKBN<0e=+LV})-q8GGd5H;p zPGc9y`nv5YBy@PhJd#lKoXUKx&o3q?Z*K3@H&vb?8$uAHg_+hDQ;O4hDMmb}c!{8C zBum0p3B}2pp#k1Yoc85Zoz#>luGBJ{^E&jenpC@Mu+(Ym9ck&8(f*=00Ea!3kk7y@ zvQ~{C)2{awZ+T4_O^#eK%wh{6RI3WT6>p?61ac_B7G-K~3r%BvbbMvS-X?{Smw8BA zR@;g9kk0+08vV1GS7Y`1v(FB|C&Ml=P&YMO1l~dftP*^8^4$i6eEP#zldryrsYxdv zj<3Xk(Jr<%eVy56Pve(xgl2da(eI~f#wH!@nAfd`v|}76Y84S2%`MDDsMEX9#H|VE z-NE3T25a&%f0(MX5Dhs$klG`};Om*RDtldQp7bxQzBb(&w-W{hLJ77ANZZQ5Q@t)e zfV~KF(xM5(ee3{@Y3Z?=PG8JWcN%k2bnfl3w%O|^H~6`$cQjZc+3nP^SU7aAt*5eT zLPL;H580lu&)r@s~mPjypHmK~EsR0mZ4#cCUeQkk|uYSTfZ$+r+wZwcDst>&e}qr zzC)B_kzI5~(!J@Qx8-8iaXc*jJW3|wtne>kksYv@H0*%Bxp#jdi$;(GuJQ^wI5fRD5 zFw3LVMorivNid)TC2gf-x2-f(>3O#VS;Za&zaYk!=LQKrlNY2&a_lB2&vOV4t^Wm3 zMJ9CwRCR_zYw1IJC0*i2T{JAyoT^}NQk;Zf9ZCjTw=e5=fT~cES%;cDlpKMBMecmPhk>xROg}s`ZFl%^+HUnu4)c7CniBhE za~ax3ZDYf`DFd?{-e{z6^N|sHQd@PO-mB5Q&wnxZ2M2tX6@nqmkA{_bfu~eI@^s9k zDIC5QEvEqRRctBL*EDdbr*u0_hB zx}?Vj3Ucf&1*}VZOdhP|@Gn8}$X%M4Nrmo)Bwg>pVcn1{sK^nggB^>fded7fi5*4q zP!d|&bYWp@kXj$k`1qOv5?PuY3LzdHww9rNwtyvY5MLDLDW8V|x3X13dIj~`rnZ<^ zmlJied^r*iN75bPng}DYIz!72w-cN+bPr4P`nj1(i-iDxEYnALbihZ6A3AjY@ab*0 z3#wGeD-HWi6%K9LV7-J78V&nnX`hm#q3H=7;Grj%kB})WQNd`Y>J7muw=sHjTbWT2UF2zA4=A+f!6S4EIM#-=r!^GeVXaeV z{Xw*ka0_Oy)Wu@nnOX<4zX_f`@T;}0`d-yDpmjGhVnla=rkCL}v1=I^;E4FoI4PJ* zu0Ttj$Tgrn>`29Y7(f~DG$XXcdCNY-k)v)7O9-xr_Y|Hy*Ak0(gUAO0?4@`+4XFzI z)V`HOSXUaIr*I2ousY5~OL-ehdD=e}#IG*%vUwU47*ve-U_!G^>FiMxS}%i=kjKBf z>D);QVSu7eSI}4M^Sw(b%#>U``2a4?eKzsvAl1Ibc@os5K#8Kt_S#B^GvlD-*5kRP zzB|2P^Lc-EqXNB_q5kC;aKsT6=>*H;ErD-Au+^$d7|Yv1ob7OABq1!IzBa1n14_LZ z8#9PDK}#Vm=)DEbLa*nUo^bzP{8Panc%Dnz(|IJ^A@-V0xSBNRbMW~Yv(7`x$DH7U%f`oW%_qd6L5QiW&!2iy>p3O* zaNAzYKwB^(#m)8X;;(}plTLPBOA!2U7}4}L+D^HruD|~d`FEIk-&zHp1`mmMs)pO} zOllH>#!D-}ZSQ4xj4}5@>Ez~u^B?P_tMk_B@)y!s7rAFLtX3AE`T`YN=Edbxs} za+4sMVCn43RoqlOPUB;^5I90W0!W4$uN~e=s>jk`6NjgKni}s6d~fZ;0Q~lP0ol9L zlh*js0f`kz^h(T~RH@z=Eth6ON2hUZp&BoQ_Tt+f_Sp5_d%m7GRD(_nXDUw6I=?B^ zNl_Teq!ew3nBJl#i$i<}HeO@p8dsN5lI+fc_)-dTB*{~`JsODE()4q+uy~N_<=rJ; z=BS8FILyD)TjK^+nHF_%w9na5u7*pKgywBM*9Q@SmSIAvd7a(x+iyN0Rk_sVvZ2^C zR!2nhTrQN+5<)9nhLscIwH;igEy7HdH7;gvsJvn)R_q}vtLyg?3L(W~^FK2M?$K@! zllICpayHYB=%;NEztk9QaxMTJR-_VX!p9S|@+8YCVP|uThof4$5MYbSbf(;`6RcD0 zo6n#S3mK!Z#bA?^Nb`{-OV1lQy5fja_FCH%2$0QTt8empgIf!?Rxoa$aEFIxGT+u_ z*GNsc3R`nSC}-n?bEdF3#xb&j3dPggd_xlY?n;;u~_Mhc^G zdom#IP*cM`?-{qHM7(mB`eb$)?u8F-oKI{?HTkfs9=iAoar#pt!55Fh4RHYbU&vbN z-AAq&_nBx_(qkk_ekfxI4r+7vvZ_ExK=?`E#n7%Ws~E?+$R7J zQ%VcX**Ol<$%jfD8M7vAcOet}w(LpX!EFPd#8b#)qz-)llC5b@))a2`!sfxtLZdBg zmC=41E?R12qI^*;S;1FPgy(u$Qf@AH*4jyWf%yKiM)Rff;}GydrbSaU|qDrCFT zEkjyLtdN+KliAtZ$((;pBk5o;Ra}_#@zOT2ljRw@Y`|r%6nzU&oNBs+UI+ojjWu-k z!vP4yK9a2BV)zQC2(vs0S>-6+OgrXYW_bGb*I)Aiv217~4I6ksIKhuw>|G`r;nyDr zp%XF6%px?#LH3wJH=iFIYlqt|YBaL)0#hfp`qZmHqg1A)#YC>eO|aG8b)b=G!cA~V zgNCCDDao(GDTT5s9jx^a?lUYZ3EOdAK9Zob2@@Ob?rAiT#0c7+rVP`bA zUYS_Oc-Pw;Cm|A*swIkd^tnfrNTG9vqqbNGgllH;j#)wpqm(jyo=g=St&f&${DDH3 z)^h5y&_s{~kr$c&8bF)-r11^QmxT%rOxB)J7uy(Op^VVTm1{S4BY9n04#kv4a_WLx zhUnICmc+l{F|?*+=M+~WGhXg*_;C_s@ZaqHTbCQzl_m(j+pn++RZ9Q`Ab5$3tH-s zVj@5)HiZO$%yom&RBX*v&475D#o1v^XyBMAV8ts`9%p^%^zA!NUktn|yZz{h>Vlv{ zUYyhLXqm#)wLZudjtvKH=h8NZ?07{@sYSS?|6qawYHwEO&64kHT+|I?BQgS|lIxnx zm?fN=;U{%Ch8*avu=~p&vGZlcn&pDOr7WBX!3h^J>*7gpzhXa4)k1D!dD$)g=h)SM zi7%ts&-5EX%wm(0kA|WdWC<;+_b!_M8v!e#pSxnIn790Ni}@@?pwP*v>jwJCc{wjQ zC%6`8OMm*dxZfE8Dv%#)Vk=-=3JgJL;UsSju1jA~P?pyQ5JUco9Kd=lQ6GZ*X&WFR zbBYmSRPj2tIr!y8(~#}@%lsFk2MWUt)_tqFyg;fndO;R9#+eS#O>|nmhdt&kG2|cGrk<`sDcioZ%wj zvRX7zo%vsr-8jMXqw0dNk6}sH`7iL%IA~Q6F;i|!Kb_#ugZkp+|1pAC2rtb?NYdR2Zx-)MRmZDAP#c+~<%{QkV!%y%nR z_sAM8={}dc7A~on4mRl?9oiMF*vfvXHAR+y?H1BG^4;FmEM&#HxoXIck$oYfB*$P? z@5(6e!X|{zDx&~4Q5(>Sh#fn4Meex=2XD@Ox8IkYRtRZtl%9$^#sT!eSs3*z`5pj|YQNksh;nq{7}wX6M)i7LT2+-pnhRl=kdK%-s& zl0Zrk9ezpkyS{3|i6F!|>qG>PW8p#iKy#5v!X+&s1l7pje;*n|TGb|v3I==u)f^BE zQr_s^q7;E5Y^%)96o8~>CS6|0mk0bavWP&n&$ME4G=NRoANtQ8X2-25k-x<#t%pYhv zMbyq+Xu`FeUvCI*ufZL%)~3{^O0%pYk1K5-+Z+@pBwI|6L!oIJwBC}0&@xKCFpzq7 zfA;n4tJ(Ol;@@{bv)(_5hc>a-^JfpasK4kpzmILfLx30HJ)p?`$o}CvI3#Gsten{Vqkh(Vw z3q2QoXgeSC4l~F}UaUx`zbYypH zzPKK9=q?}2X+v~TK^F6E-Ru1N$)z%@%U-Jm-o)QQwy zNoxPRT?YH-^WSo7ajWD{n`TQ6&NlA=(P{XcaKM)gZ?*vG)Fx0V z{5G>NR$Hxzx*`od3&p@Tf_xR*hTLC?n5rZCpu#kGl$6J6=+MU4*U<|F${-7!ZBmC#eJ7)BA4c+Y203H5jYa+CIVD7 z_C~fOQr$Dng-y2oj44ZkIlAIVSde1tWph(5EO(Z=j^w=5Wh#C>I`+7~SuL^5{H|hi zUMh!zW?{t9NhdCL8_285U%P^H?m#F8&=Uub)pj-RYz_$pdr|G8}Ff=*7yh%3yOA1hGvgIV6^@t6D+C;|%Zu8J-w2bh##1W=#IJZM2nF%WE@v?JZq5Paj)F=@7DX2obkW z8QGM%Y<7Ku#N*#5>T1S5^=Jr#5r~g*(Z*PrYUz?;hEzSvWA13c)?`)7C=l(%{0=>c zjzX&^AA(Q}v0sO2>&Tuzcr7a!d6v(1#nfnpDU6l)t^5GJu-&yWmXZj@(Nsu>ct7iy$Bk;%$SV5M=?CGZF zU83Zre0-{!q~+(kcJn!*fR~>m_388QO3(m(&S9E_B9t9z&#F1-t(Z=0eZxNOcDJIO zRQZW}uWYLEJ9Z_DjJcoc3uQMVk5FZR75yX6=#-ANeqrZld#=tT9t1IO-QI2%!- z$(fb4>4mRXIhrt_Jit8UuS$YZ+Vk|hkO_1yrOusM#FE zRtKJ3^{JHQOEi3P{e@Hf^yTX*gU_Fw{O;u0%U36_jn!ADffX8eO3V|%@CLd!qI@~O zQQ*PtTK|5%o@M*(90s`rmK*pp!6duhJjS^~VhHgSNZ?r8OM_ zq7e;;fK-kd!TjMs_^o^NDqIXXYu1EVXpy(h4j&S>MHb9$y7SfzA@4wR^m*NoR~=56 za7X=4POczU{cb;Wk-v`+`%mkPC z(ezONR=w*H9S?6k-ASF%=){d z;g$IOb_UkrdHTyv)uVpP*`2OM1lbbk22*wMw-JP~EQ?J|?!EekQyodJ1sTaukaHw5 zC49_2&Uam=wg)u=hgX=-?4tNUsR{6P2|wAq;D;CGoLN5!qwFbr-?qWl-|ju;PmlkB z6B^4ooi1BQ#<2*%=fZf-fW06WI;oBeKN&lNUAZ^~d`Eu(TuU7MH7B|FLDePSf3mi;s*71R=cn0u+l`9eF2E#Wb8@)_!)6I!5U=uIjzdE8PYMymhdp(E)y_02FW5O zs3O9d;7`b9bxHA(_vH=yaA|gMSZGoT0y|!=+Wh53e!SU|eL*6XWJl1ZFQL-EifV|P zuNTecLv?BM^&M2ORE<}^kUt@7-xve3>l`dS2$L41F-t>G2Wgl%KlI;X%j13Nmp!N~lz@6wto*7Q#UM~js-x;MX>OAb+(0D+ zUrH~d3B3rrvI1@ok+OD4meG=^bxZcB1T({^l;NC}WN$Ih!YEW4+-y2ut!rB23KwPBEt5 zrdx-}y~NyN&ygP}+@(sPNGk!Sz+$T3QY|o&V}uk&`&BLXdu~niJeVMte!?Ic9>B{jz=B*-qGij31c&V<9>I2 zbt8}^^`OPPc1_3fmaKhHszeug@kR6;-MI;Mc#p->P&a=<#I@y;;Hl9P%Ks zO=2XBJ!6E_ro31(G)A$Ck{O?mQ1lirZBJZBD~^D-BZhwuqwGN;9Ms`*XyUI95O zpF?=#hibDW_wT9p=2sP=Id`P08=5Mf zHqwB~j8&%oSoyhIUk; z6l7nTN0%WpW`8OjnR^4-bPP-{BoaWumk!3ARJLt-N${!;A(YB=QVkZNqhw;%H!*M? z*?V#Z%_5K!an_M6P2WL%BwM4PvNJ}{$rehI9HeRclz&bucmgny43lWZP91QIaw+(l zSKor74IM6TDS`-j$8+J9mpO?Q`KtOug%gq~nMy%U2wGH`2#umEJX{V! zX33jL7qe6!+PR|JT_90!bc($$FIL5yF2C%G%Q-Az;lY+S=D6Yfx^Ef$Q87P ztmGZWit}9Je0>CzC4b7-z4XtF`Em*BiagMmZO%o1a^#JWWU}NEz7RkD>Z_c~##}_9 z2xRsKS@~i1CE<NJ&V?F1h2} z9FCa*!(o#Ul3)df0om0okHh4Q0HC1@L27i#b2#uW%#EkV2L9Yis{Zwr-DNLpTMl%A zB6U2Pp+&;iNXjVkcLY8ScPH4G-euoCmKEefu$3bbPo5DW6q@kamTO^y(1>jo1o5TR zg4xyb2bJ2Hq^WT1OIelaLyB106xZ2BxXJMtCyDSjXvcJJG?8lRe=7BqXr<&f72Adt z0X9J+LCTG^yKVH^vAA|!USdj+zNt)xoZlVpLFjm-zm|4k<|By(T83AR$}KHRoQz`~ z+-ROON_UgFwe6y_1ibva$0*O1MOs6@iD@p9ZJtZk-|v6*)i?>*XX|EbSM#o3675jA z$a@2%PH&mRfHgxmN~Dv8p1_d=A8*_}c~6mP*(SBzP(Cf7<;|>4V12{JW=$my;I5_j z1632=_U%qqimt6@9zNClBjgoj&4N6`WVCTUsPq^fKu?+xy5STTLjN!c2F+~P)c*wM zJSzI6R$+D?>`4+jYvbF>r4iaIVBV$ubrX6|2FOxivFvvZ(~O*V(u0r+PnQDPSzY=f|V903HUG)&ATg5uj2{dv=F zBTsi)NflT2V({8OousOWOTwyRqF!gacEwlc-EXpO6M51h#;=*PTa`q^5 z2FJV_Rvne+j?U>v3jd46RxT-v%v}(cF7_!S3LaU5bNmXffh(Ee8Ec@rf&{S4Xq__Ph?_wr_ZOJeSD zMU|9q$_M9tRTe9z@@TlB>@J0n?Uz#PAUJ<>5LdV;>%LMiyq$NOl;T^IF6{I|0MaTyoK8|1ol}cy_MJ^MV>i<%wIy z(r-FeaP2kU9TmDxqY2}AY7L-rAcYPNfN&a=z{1f$?F+%bMM!c|gN;u+`N>5$Ck(}I ztpeECN`p{;ee&uVa*s$O4>#Bcq6y=`@|0-a$CHfJ6@dkqx$d0p5h)!>dRk>t{r8we zCFf*M2Yz*b_N&>0N3*Z)PlkyUyB>9s7tcGq|Kh;!&k>Lvz5I z=F@52@Irq!wz}8d<$GA2TdAh{+p=E>x z=>MTAlpSI^<%gO1-Id4WoC}sgC#?4fg&?PyEE_~{Dd$6X&(Hqd@N)ATWVgWh;f?g! z_teZJ|Do9|7ynK+!&|V?Dxl`br1R|a_)`8X`E?@2?Vb58zd57}q_=)VFLq^0Ompg} z4+j;6hv^$`Q4~mn;W}+K>W-q<&Rw<& z@cpE&qwrVdxkFu|D#h367aUz9TZT!j5=W>|(~t;9{-<&RAsdHWo;;`+r~_Ix+*8c^ zWBzn*FggIcF8HBT)fFgl*YczfBqiqa?H%M*=i{h z(Hf+|QtO+cR}+}#HtxA{oS{ACVxlJ5s~rEZVnhU0M-25oTkDRJhjGfwR?NBw`~bV` zx0_w5D#Q=_en;N1QeQHjn9VB{HmlYH#dh^I`M*J9c8~f$1?T-e<>Cu>(nRcbU;9%h zTI$B9r0H7ZQp@ZBKC;{eNk*PpDj($MjhPbZ)uTsaBfFkXMZaVVk9~*Xef*fuZbLwO zS2KWA0YpiSQ@jH41m2srL^gHjC6~IztaG(w@{1ATim+-{i4@DbTt-ikYzheTLkmL- zH}RvUu26V!RW2$N(DJA09ftW(X2Yr!)z=kM(}anhzXuvbe}SEcm79?W*h-nRv>^+K zVLpZ?lRTC0OI-{dP^{L(YsEP*I+^UHavvZ>z);_oqE&t>uC>~m-^r9~7|R^N`+z7- z!E_vS)YBbEvO+hYt9;#=b1OAR6mR6Z=^O-dM4Xd*OU^*t$OC5qYmBFujUeMW32B))W$UNo+RhOI1e{3QG$zyMoPf zSvN%Se=QW!y!&FQCgm<`XPu4Gm!-CB^3XlULqM+&cTn>DSNCT_8!(nAl)y}bsiF&o z2{yxN)vX(kTG|GcF|Nv10+!9t^pj(L&u*hz56;Ft`+;mtSHx?g#k$3dL^6;cF1etx zM$PSdRBABsq~-Hv80l`^G7X^I46OvCMFXG+)O!%eHi~;d9xp-0h@#1r8*8t2TcUu` zh6H6VBFYzA-;@k4X=;I5RCYXFXLYt8`|t^!qFwE3d0r4OMH0c4WsAZX!BXNHA2!`8 zsRXoZR9b8+^w(oz*~dFaSr)PNq#QXkgE*BjR_qNZP4a3+@zAp7gi~i`Y?)C9jF}E|t%sJELNj^6CAkI9r+kDpOG_D(Ayg1dk?RlA zeQ~*L&ci*-Yt2dpid`;_w3753sVAzpcpscEOy8?w5DpqmeOgSC$sNEttCsmYRGyUe z2~WRsGl~`!kF#Z`m60>grJM&Qlhb*DD-5q%%sP#z^svUXwnE~vuwBA?z_lSGRYM%1 z67eugr7^ljrXUq$r!x7JCF<(hvG+$Sl~~b@gPaCA>e;s_^dweYe&5s7vMs@k>$(i4 zWyCpkTDLgLizSddnj>1IMucp;BiCTONCa$EvLZx~CUns=&+4 z=vuCLTv|~|v0#*M%7Vbn#vfp=Jmu-~WAUmyp?V7MjCQMQAzH8&!Q@6UJW?&seM`_G z==Qm;{Z@13y722(=Q*)aFn1^vwl09%OuO>0|NLLnziH$4&NP|UA)&Qzg5mW5R3L2- z;qb*xkO|d%3aIfEi9lvgXotj3nnE1#Gf*}#3awDbqRK~XHt^+GDPdpXdT@dGKG>A} zqj=N@r8b@RU9HFl1^ia$v@Wc~bVln=@x-;G?v;XV?I;eC8o1|iwVKX?=|Q7lH#2D? z!RP@W)y>5Dvu=2FEC~67aLt%#8MJw4d)KAB`oTD_f-EmN(uzWibTE|Pe zC?$1AUf{1w>xPo5QJEgON2EKt%FJ%OwKA_shje+wPs8`v2NmgrgazV%CTaS4>3<)CSe6sR6z{UNLnzS-0A7ku+m&Oo3s=L%5Klo0?OZ_tPS@Zl4lnb2UCf zC$2+r&C8JGdx1%-Pb$1Kj8R_`jjiCBk#<|~+J4CZJ zCG7)7s33h*Fd)sev+z=1gyIZD3gM1Oz4)9-%P;3BG#D}Wp&vKYhGY_{94|Jd!x(z0 zaNRgcZ+f4y=m_0@dqmqS*?Q`|gHzJn4rcnnz`p=WsI1GI%eg+sd#`EW29+sh&kyzz z49cXf`ITe=wI$|RciT!(sw~Z^Bp+@CIJF2sGQXUsO2$;N$mko%*f2&0GCKm?u)~`3 zN=rz%PPd7C5*d(G@BZA;i$SYaL^bCl&n??huJQHuYRV4P7RbU2ekZPyO$i4AQr8tE zm`WrbG}p2@2LKXbkt1e4Ky~PPxbm%xhU@zsAK4D=p`xQ8_C){Pb(;)x(E`!`*PI zl#1g&wcAB!HMCq5uDo_4RTrShk1XLTwK3dvcBrvQ{_AnF#LmGtC45e2onMJQpu*sX zs$Nh5dbaZY%3Jln&h)0*k_>}flw!cL*+nE-l3aJuQ4lAc2I;lCHP#OF1#GH7fH= zM#_qp6?E`+^*xP}O*u-&{zdu%84%N|;ZLZVx?jf=!Z>rl7kSEi4eO zizC}@U>ewV$=oggVg)mrz85JX;(w2qFIR!0HMm@As01QsQ$n9oz<6=7RZv!RJKV!S zI`JsBwT{;=N0IHOePK{I^7qZk1<^w+I1;H@4(N|7P#t~RREVsF&R0Z+KY5etv9NvO zZxq=KeZ1vpR_4)pDGpC>Y05vL;vtgdvJP{FTbS!{aB86>83Xnd5A**?@Hi6JyR~E$ zCnd1in;>33E95JW^gT^bTh*$2Uoo*It<`ln&8FMRB-7?iY;38Db&e~X^C%@R)I9zO z74ZEh4v$$fm@_5{Xgi3&P90Zv8birak4c-jrx?>8^x> z7s{*>&hSc>5EMOO8_(Y(ah*e)qShf{C!&qREH|~ZWMSiWr)ADbgKD3JsX#;n7rP zo<<-Q>dFoPfITvw8mizG4O0wY#O%;zM)0KNGU$;KlUkChqqWbJK#V#C=d|8aI6FJ5 z&fQ(Cn-+4+ZZ%yZS-U5;P#h$8>8cm`pUO?+yjHS&baS6`YM;36wI_?TF{c#f(hp3c zYLo_WICYMkjz`@EysCpYq-HC;l zL<#rw87{L$!!jJC;2iiii@88S7;fm!&ZivhHBy_)fb8w>S`O z9S+d$iMoE#X(hX*42N2LLGiz+E_WN=atOu;V;EwVLsQCy15APPU1!Lwt4OyC(@Ay| z_Vt`4@BV=FH&T7I71A7Lw-Ba?w1gl;9Y_o=E6l@gEfgi5S|_`poG7i6PCk27SFf=x zySxtustgB`iR$wca_8NGwcdl3RZ{eR`i=wAenQ60qrn$t`)QdT_fgKKiIF{5g$aiG zn5P_w-!Qn09IHWv@}vwoioDj%zVJi5fDF2Ax8V?rQa4Q|dYRgrpzwY~M|f^3s&8$q zOxxP*9*FhYyTiLOGPB6 z%U5ToFJIhaylk-D24au-*~?eYh-F(J&g@~0$oQw){w4dOEwk=}){SkfJSZ6Dy2DqV4KTZC7FkN3aIeR4Xh3a9iQvB zF}{r?iR>wadncKZY;wwW#gs^`@is}OULyrEac9+~tB)evilJFrZhH7Bx6?IRmh5(# zAoNa?gGwQ$6Ccf=ZT&vCM14%IL*tq5Sh$7t;nS` zc=OPmG<(o(D%)FDE$n{iT9048K6!fj?BvBU73>o?QfQ?E0K(`1O+d209cCutBb^%S zf!%^e=kL3}CU6)n%Cv{Zneeu`0XC#C##^)23~b|yLo3tlWz7f!XWZ%IVtcODCdBv$ zAPmn>zB~T*4`(N?5(Ry%!{i?by_y-HF$xZr&+@XMn&$0H%?VcVtqi=n+bHZr8?WBZ zY(aW>iTxdthXreuSi%%dvRsNg^yr~>KoKOa4hPpV)l~Hwl7w_ch={so%HgJ41PwHD zpkovW>ec}Tm{CSWLrGOhxsWXQHa!2ax)s2)!@&lE0dpQH^4nBb)ifMv$|nEo27OkU zA2T%ptrsD~JmR|o>NNFbExDr7-($K2NkEHxkF<~Nq_T*cA z*|KTF4OLIY6UgBqGhl=u78=EZJm$opPaO~xnLvX_d|R_pKG6+gi7#Q7lpn8(U5k_$ zAqn8177JK%QCuVR%fwx5gI~7sD?4Zf>F2EL(4KAWs(inWoh`=;TjUbR=raQ7q z;%vB7#%8=zznMa*7!)P*NBM`)$?3f$FIL4e+UXmX@)TW|83Qs!64%Tmuv;rmFDMMe zf5>iR#v|0y70Cdla=oMhg%w|%qdL6dS9D8B2oEe1CBekVGSj7%l)#>hJ#LwS#Y2s> z2zwfK8$Ox?n>63Qmk#MeuDzI*sr_{+)?9bRQ%L(CpejXzY|>GkmrKO7*n=UPnf#S( zN%|{a{Lp%%C%91evgk{IHSfVXkr-TbHd%%h(G^a`LvUHfaRVe|GFd&$ifJWHUg3^c zm7uy<2NDicIbWLWLdmiu(?P6_Hz@>!LpJ8!R{ftqvfIkCRu~*&c1+}=iY17}<_eAN zBvj^Uj*N(0xoaS6jJ8@1s=ix+NARj>mDzL6Ep+60Q!elx!`$%i;b)yFcq>QFG8DU$ zJCVGbD^^gQ6hZu{+ni=&Rqz2^@f{Rzto&colEdU6Ks#+FUkmKDYjcOj= zA=T|N307CN6gua+%)?|0BKo`_5JI0$OY|^!g_Q3nDJAL~VauI;fCOBa^kA8?(ZCO^ z*%_oF07qJ(a#xUWSwSf9KiwFeEFWjyL;RlCX~Ui#m@fW*{pbHOAW2NRGK+6GssvU8 zw)dj%TyW?;-1sImmd$0D)ytAD5@Jk3IJl9>=HU`BeRbLL>^u7PVKw?;uc>T$NRd`| zbx+1WqiDQ|sbQr#awYZR5R$vjUa(>68LAks2SK_KwH1wAcGPhb-E)LaHWddL+ z>@mM;g!mQYhMZclFn7})bu_(;CR#-EkdgP9%+qHcY6{JMzm?Z9&Yb-w96?c;z(R2; zT~+d1)9&GCDETwgA|kjzRcpqsRmN5Q)BD{QRT0j2TQNe-99wu~&OkU143I-3U2Z$I zcQubdY&cY4a|=XN`lxa%r%Blx2yz;1zz4=)C)>(owY^vb7FL2SQCI_;QE~>rCG~u zh?Pg*1%2RMZ@jfaWeEE*5nrUhllmc3VY-y;U0l72SRw!Trg=|BTM$HJWDj%8-D|eP zFA^j9_Jv3vH%%=~D~*CvlO^jtC~5a&mJ)$PMD(MVZE-=+s?Z%N`?uZ+*hyXMpi2rH zZ(2VP6suTwx0K2q43G{+Pg9OVQ?~a6U=K!9zZiV+foN*SiX9YR3Y=6*0ufgty})ij ze~a+?Cc9!B?@&`t;bB|E+?jyIN-es3F1B=!-U^T~V`b^(7a~xXMYUqAfS_ zge07k9d_>xOP7JExtBO{m09B7)2zJv{^j!%P+)E5OmZYyCxz$j4qL6=noEvqS(n>+ z{1x5%a>j#Mx~YOeSw{t6fUwKEkeqd}8Ir)Fz4t>T;{?sT*D6XhHJVeQFJ|A-Vnt*g zRIH)dw88)`WWKUY8)YtFD23rr+E~EFs`i32HcvQX8TTBP=PelzcV8T=%k0ypI4Z-c zMf8o1&EU<~nPdU|4$kyGBd9meRE`xTN<{iHWUY`BuE|`gRm{r`5K&6C8$$pS<3-WH zwZ(2-77s_N)odUl&I!AV?Fuz4J=YmrS4(qdJUxE%tkp@NKPX5Xo()6S^&@H&k>Yy> zzaiU#FO)k=%soPJk6b+{6u&&&c6NtaU@9g*ppG}toDRV_c*0cs=%cF)Dg8G=gbE{g z7Y3RO5}S%2Lmx`I4pc`6^XlOGiS0}YpV;b(HP;R6^qU&L+eG>$WmFP3>0b?$+L>C% z zV9F!Sn#&V2x4NW>9Uf|9nEt{V$vlrVd*ZoD5<5Gjj*?a~5nk@9ZINvwq*`Qk8uRxg zi{4cGL9c{em+BinVyPd%IoU-pndvAK;W6oh+sLkq$OY4i)CBs=w3QZ1z1Na>1r(5WRbRkb0ag-%VYyi?Q4;W(bKSx@)Lb6E#qIlh-m zhi3CE%%;_==h=D%eJ%aW_%H8;JGUe#+Cn$mX^rdr#7eEqMLAGI+(D|X7J!$#Ax*?jCl5KL0gh~Vm#9miiXVXyK z8XYQ8gtC#WXX$$EUQ2ZYxg@$w9E&wBhDin$ZT29Zjufstw7}zBvR$%xHLSv!UQ*;v zsnDF2CXejup@*_mp7Eu3qxd>VJO;=}uCr1YOJyjuxX8fHfIoy#XF>jMVf6_2Y1=mQ z3h1QJAL)hw8ywq>sM6oDB`0%w6nU+mz0f;ugz;3Xe6(+7a`_@@X3W&Z z&xnxV&TqC9c7kHl58HVV-PVtwZiGv|$wwcJFo=5>Hsna9In6l19Yz<`$9lKQKYDT@ z`O&A2M1LnJ#?ig}WB%nh|3(1LTJBwaD;t(Pt+)0JMk6A^Q8KLFnB1wTgdCq zZ({Kg%LMWIa`KIUox+Uxlg{Z3R7 z@d;Ct?}FHRXSI(o>oyAvqps>ffoF8%1ypI5r)sOsURTY5p5noK;_2;XmK^$t(kzw@2&{*yU=m$) z0XP1d?nDCvqfnv3DdZ%3>Non`0>5+U`h=B|F>a);s}H2r(1t`Vqxru%uY%@C1<7Jv z4eenJu%OZ!6FbEmct=Kuu#H`Yai~m}FPl61lq;#2Cfq^f>brG6(d80UtjftKb0zZK zmF|qaothcmy^lJvn@q_+jnk9-!<1j51D~6D6l)qh_TC(JFrX{slJ;=u?b%@kO+p|S1c+hwi#@83X*@`8crfF`7ykKhrn4OWcr?qoDoOn4 ziy2=HmR|vC8S*NW`o>7nA>K&QRf0rp+tQi%nJ^#f&gN3HR(~q2kxvidvgTYP_(KeI z(^dfQlAvky5T}(v<0oLkOeg@gcyKl_V{E)e^$>)%k#SKU6ZXW+bKh!(FB!J4(YM=d zuLR(_|78=ze#&>A^8{E^qXO(-@aB-$%u;d8qb|Git)QNDwOnMH7+|yBTdoO8{4l8p z!vy(IQuW(t`Da{Xm>Acjw5Q+^d`A})mRy$1Tx7i^@)A*Ov$#xdJe8jJrKiA)n;PZJ zT1MR~p;g8;1>jbLmk<)!GJJp&3f4lKxSmI@?Dlh%`$%l>MmO*4~r?AZ7S~iEArFG^ddb-14>paJ2E3xh8({ zaBiuj@+9IjJ4q14@3Aun&hYw z9GK~2Z^psXb%#x^g`KzYp2u90k63`U6ifIZoWdWo-g+*IO)bi9X^Q6Imh5hME^8$tiNY zW2lRQ)Xk6X7N&s-6)MMTMF+^VJZ|c_q#nPDWnBlhA}6JV$6ju#OA2$~O~)uOo4-MV zzCH3PvKGH8wpWL}ZnwWWX0si9y_|>J50xB`*@HX0JDc74|FVn|0pj5Oiciv`g6+IU zY06UBT_9<#q8WmSNBQU5)%x?W5nU~)Z^D5J=l2LGb;geU-UjBoA_M6}QHvS@P{XgVdk>(ryd|vG6%J|{<^^4ON-yOxrkAtQHus;Op zi?`3eJ$a3@yR3|8iii$B=p&=w9Y1?}@+N=thv(nEe3t*5vu=-{jU5`@o!;vb1_iRu zltG-pdkT1qAM>n`;0_d^CC*gS zD2DM7HiQV9?p6qM)2NVU<`$}d+T9Df4OE$Rd*NmJYpqaYw;nQICB!Qba6N7Y5tkMi z_NQgn%xl4TW_fs7tj-sO)DR00trK&v&VzJKe$IWq;!P znw6Dn5H#;OH=+_@A-fUjok!B6zWPgW1b z*xIWj4r~dxZnPm%M?403+a)KK*TfZL1JAaDvi_2zv%v0|oz`|3aZvK^!m5SWyVW@` zHj@DzlH3M1aN+p9;UbMx^1u?R8gacqQQ`CU!dxc$!@cvx)xJ3MwN2lnuZT(XYIsG?K(_DFZeXZN_{hoHhyV0qw#oTHYB<{eT zyng-i^^v*N(o@{|_|4fLo}EmSFFm(l*epku*>ZAV!?4#-iZ?KzO@L-H1ysHVyywJa zhIrnGG7Z#{#IJ)84|8XTYo~9A`zHu)d40A`oJShxRw7p?BsjGrQ70%Zg{XJ4)y^5B zpuV>uv8pU}uWc#RbwvR-kv@M5gMQeSC-qNn(>*4Ax|;E~(eS&l3TJQ{48Mt#&GdDD zh4;Od*9}T z2JRtjTF?@^bC8i)!8y7-(HGumxh`0H6WX5Zf|KSnAviLqonD|zFcuKz4kId!6=UFi20Tq#KF|xiQz1^}2oDEiNa6m%eGXoG;S(G#|X$-O8sbD22t5&M!v@~YmuU3;!uu@bWQe!Nw- zTJ7uzd68DUOlDz(Pl=p8bC063Qbo~AGQ&k%VB3i!3_s|l_bzGfUE+ZZjdO^ajZ$uV zJkbK*SzM`T59b% z^a4ynPv>D)Jc5!cSBwgWD~!P?flwA6bvSCv?T=xIBMM=C^xqT`qhcf?U$j1R;M25~ zZ;xLm+RC$&vwUyv!+^z`?^Cd`k=>Gy9=&i)}k4qv}~ng2fh?)WE0 zCge?biA=nB`>Y?AV1BtMndktu#f^A=qm$l@N&=nnbzHIbLJ*6vX6zmY)|w-I(u%sU zy6t$11pav>o;|IzTdi7D(-d#7t3)IjO_8q;5+Q?`Mw^E<_*-Ih2kx!EVo>hU(95!0 zZ>Is1u1{FakUq{YAzvG`!Ei6!G`md6E0|qEzgId{<2mIFapDo;O5GK6k;G*=8VDiR zE`;2$S~jZkI=^RX@I8$^KQ`eY1RA=b(o-6Ziv5-LvEGzJ2-R4?(9qd;9vu^y%xD&-a)buU~$bHhR~C8a4k9 z5gZ%a>9`;$4ADrfdGEgKdcWcwBLTMzzrqL-_e*2re%IS-7vR-{q0L03!CU{A?m=awkH5w5C1oz+PfzZVszIAmLtmo&! z{(Ya<%K4`E0}W<)6t{HJJ-IC|&zr?fKDumZ)Q=JmZTac57VW74Hl~t+8{Dk=cRHz zVFU&j*3*X2FHV50jE3BFy37R@crzBnTsJRW(U7iJ+imQulh*J36@8Kq^b1&w;}_87_&V|%ER0yl(q za#?5H+_H!Lma{#1WiO-i4^!vr#B&Y5wo^kw`ZZEQL*aoo4fXN!x9+(KPa|RL2*OXR z{OTsC^|X#-I0@-&7u9BY6Q*;0Mb6VXLzt3_ae%FzA#0qi40V3nvWIN*flI|`CZ{^> zI|ZhO5;zSb+p>4W=3rA^gY%f7gM+^%3^JK3#Lc*%rEk{ERu3Z!`ZlrZClyT11PL9V zmmAdc3iCA~7n@|i#=WPxv6MOL+8FhdFQsTU_cZfWhWoviL^`T3=NF$j3G5}IKiB1Q z88O7^ZondwFTcnyK|8&{k}u1}WjU~RnO{4mLsP;Wv=%0EL29#>Lx83Y+2*-4}QO&Cz z*i4SplyB@<)+7_6^0>lKeT`DgLwJ~{rE`HP!AeFIS5c_048s3IIh2M?LR>36e-&11&8jB8 zwgMAD{WcXYNlU+SOUk(J9pRm~yBba&3-EzO7a2a~N2(aBJReXA=)&|FDe3kU?nu8! zXYW|&e)jTB-V$V$UyYlzuo9j2Cc1#}fM`<@fC_cx*j?(ktKY3@)OuU8)=eBLEgakRlk7x3DuzpFViB_^KKB8KVLB6R9 zolr+|!6n{OL1UF31ZaDQEQQi<)67B9@3%aP(gP7+K zwr3qizl~Rwz@<0?2Ag#*Qo#rYTra9xICO)yQ_iuD8D;ZPMNmmWMGjedDc*a!3nw9p z9OKd;mWD*OY|@fD@z6;PbUsV$=y0G1fW$3j(Cd|Q!2 zL(%ONFD7cTpo9y$%3{q^c1=?d;R$Y)xRlt1ufd|2cfKa3%)vOk47B#6 zzw^uRcgZSXs9_0SGX_Gt^OOWdZ*M6=_NUUES5 zcsSgF!#ofA6BA<{m?Iw{B^9tR0kT`dTh?44cfnN*g~TUa*<$pEqPh% z#h~)d%ovy8Eh|1&tKCZPvgq7NRG;K7V~-=NXgY!FyNO-&q)rZ$L}WJG&2El_I=W(k zVTeE<6d7hDy=nu^#a6h8ms*ln3_rRlH|jH4l?rakpsq;y*mgVRyw!9T4pS@L;WP?a z!f$Xk1QEyPB%INnK9X9SbUxcxz!rgFS#FvM6G~<}>xt3AU<>U5)$-oaiy<+Fn~-*^IBC z$W*#Q9XjLn@fRMslXbfdx6>-NLGQAQWr6uaNPf?mFs8E`u4Dn19Bsaf>SNv@+qHrF zuNOp;)S}{&KYkc)NZvF-sYGkM&LE2NZhnK zrJ834_;2=@iZ+#9J>V{L$$?=iO2d;{2T?Hoq^Tt`!ua}RuxSSnn7=>%>nteCy33$u zY#`Z~;mfpb=@6++%kmOgF@6z*F^nOZjYyjA^zrhO=Y`{!63xcW-o&3}ouB2}>UIOg zjp+Ob_Zgxn(Sr+7!}8#`W)b6CRhiJt=S7QRaSQ~qBoJ|@_Aj)&QHKmdyzGz>4a(O^ zx*|QfR!&jFXyAy}AH;c6V@?^D(>=-fw4a8&x|u%s!xbPPPJkqG~9X4KXbNRoq(b9mcP~bb#Fw*@w zlC@vx5EO4J5hR!DM$#R{_oUt1*_Vpz~p0DD+bN~ZeZ>gGR0dBGqd+d97AneVr0&i_QZ%#XXO z+{O@2yH5#)A(^E?_V^Qq!T7DPZx19t%90r>qJt`^ zXU&!=TfNtchWubGC`~FGFN&bsK@@$hOA0I!H)4#X$#}A2Ne0~wzz>OpGV#kesy64* z)?rHktKzqi)Sck%bGSgl?T)}ZI28~01iv`&iaQ_&P8X%lq)!vTqMHNfU3lc(P?Vjm zXcuWvhM!`wFb7ZfCq<-{smZF^l4gDtwpY}Lm|jWf;wI9acaZPzgj+pgF{QreW|n== z9M7G>ge}3~CPew@%D-wf&5uma2392u^Kg`kHl~8UdnNU1%EdeOu@E~OlA)r8Pa<8^ zU(>Fg)ny?hlz(k46ro{O$%5DCU9BtCG-EiAJq6Mut?b}RB*bLYZdj|TIcP5ll{Xzu ziE~lu?Pzn&B~k6k-AAA~DyKlH(t=REDlMEeqCAO@k+{p15Q~+chj=*?;))~x>TjTyFjsL5sDjFo@mU`&zk_O%Yxag`iVSDqj2; zZq^_~2<8u8)A{aFBWV^x;J?C(n(CVas!dRVU{V5(z#dY0Ja$` zDO;5ECMsiR0j>yk33o|_TnHV*YB3>ss2@m%sR@s};qX$qyot6z9rS0RX|GzU z8q*T#s<+k8Z>$vQoC@9M#JI{uKw*cq*9D5?2-WISOZ*m!^Ku$#uz9bUI74jN*F2|l zH&ptrWj&DMmOI2yVnL$N0u;^k-ISCO?3C?+ck2#baY$cec}q?Ya?b^Qfr9+J8t_sK z9Zs^vLNDYGHkjP~>$vEKe$0so+*1z7S5UJ@;+TmwL7V(f<)#^H61MiPkOXt|a-yh< zFdE+qj^Lwl(lfy@=oR)_^!mt(@A&Dl{kfv1%2w^PFYt7F(VGcpM>eR5pjBweWOTJP zw27BWm4lj`aX!LhG<-2FWO(7jM`%`Rwb5NC%@_5JmO~c1!FN~=yz43bG+cY&U6!s; zom$|+2?5HZ_LaQrLj-)h8J{CkkPkkj1#$DA!&ImL(c0g9CAc3bc8EeOl6F$j>~XP} zo3O`%-V-iaw#HAlrVsm~)ua?r`22c90T6UgS% z>0oFY#qv;f=N(O-)G>r~{kCbSg!7cD?!9xGkIUq6*CJ=q3M0z_Iz!hGK{A&eA7!7} zDQpzk+AHVMbj?s%Udq03voq5@?#GjC@{y}lKc2YO2FL>s5jbMRLHM4#8gw$a9+6|% zsM2qmQ66ocvMu8pWhi9KqPV3HH!0s_Kqx^{QomOqBO-_KV^ab#O_ zrD|5aFp{drXG;A9;z|w3mZAbFil2RUnn=x4NBtB!YX?Sq-T?iF!F2zOf z+EV#0Q!1rq_q>DM$mvg9TWeAMV=+70U+KIvpTRuX(+pX>C_Xfsbku3hY(I=-7AVtZ zshdBJH1S{(eFIP0zxo+PxN29niD zSAEfUCb}XA+|<|x%8x;5tKhC$vP9>YpIdT@gI~}c5H{&Q!5ySAx#W}yg#+my>{z9V zcwv9_j@j{cOR8P#6i{~cMa!x4Yt5XCZCIWGEEDC9NXn5!hF)>^dY(6)e8;p&HYHVO z5ptd0&zJ=i1u0_D_(&a}ma7n&Rw+p?i_odwEcp9gccxOXJ&uH=Ph{y%V-17-(1Oe1 zEqa)`Ltw3>)9>zqKW{*$!}kaSy=zV#J$Rw?N5+J71KULLJT-FlO6+RS=s$CfysZm} zP1DBxRo~zG!+Tz~`OyAdOVmGq1yJfw*tPM8Y#Z?wb#3h3tPYIpR=BEF`%3q1s)xy1 z4hijG=d9QdBNbDrr!L_#T(cjlO;ZDUKr&QHwT9jY1NGqNxl-&o*d0b}1$Y;xLJlkU#6O?j(g1GU=ngF5$R`VtL+1GOWnY)7?| zh873gnf-0{>Iu6z+r+tt%5db}g1waJ35FDB-mS7=T(eh8x(&TKetL5D2Uu`qR75gS zbBGRK-KkS?*a#VkHkSXw3iyq?1^Y&OE$Lr~GwM)_f>+ z*hTexU|c~KO}fo+3Lj3=lap`XewRP`spDoj(63fF^nXWDg8zh}zY+elpjRKgdim`1 z@gI=x!I}uUQ%vPy{o_ctz@u(Ues5tjwMgE_Ci~&^?EC5Cm(O3FK077~oax&ar)Qrw zIfSO@4$sO_#)6O71minS#GRvpwwpzzV;Se0}7Duj@`Hl%n zmkodom|04F;%wGCc(cuG&ED+WO82_TWnFi8*SY;g_a)hF1$2=VaUz(Et(AW{3xh%S zwtV%3YYV^&Q6@EoU(+G8Ld1vYf%d=2rsB}sI>Xfg(x|CO$Ntu{J7j4{C@?9hi#+Bo z7EIEkDUc8Mz7Zp5mg~n+wsWmG=rivU__w4(3494G4Vmn~9sGkpdoRBy@K7MmT%ubWyfF4+gynLS2>>RASB&OP@Hz2220Kw@5>=`R2O(US zG(Bi!#Njoc$D@E%DY8S0C%#K<7!#t^nq`6yssOj#Z+r>58#VIh9lSjE-ir?pzA?LN zO}B1oO$BjES|O4kr25dRGbS>i$&Df0$=jw=VKV~a4GGU>d3B98`N%#i7$rWAlzVLn z-}k-qP0(1UWLI(>>U-h~b#>#r44XimM~ifbk}p_Qo|G?KC~8J5!){w_)T-zxtfNt} z4O+8)3Eem4GD8r2RQ^cUQ*0$K$4YY+Ti(OOc{gsq(3Qt;U%x(iah5*|vir&FT>eZM zG|}hdvzO29YpKngJTv;?`;!;>=;R;h!ig>AC!yEO1sGf3b44(xyt_^iE%iHwqz-lb zXZg?k`$tsm^au+Gyuait8>PtvxkLB9eSLEL_tRjYygB{u#qqN@_hzn*&}tB~>jbds zNpFwxbPf(3=$(8b)rv;7Eh(B^ zW5`yaYYcsP>kEd7;Cki~r*QjZsf%WFUM&>1=klZI+O?X=dOuE5SOsT}#j43Yda$+} zXe6iX`USbB5UkZSw0;{=sW2Q6uCrie1IbRaG0Ef(cNDE*GWCLNGR((`l3&UfeKDY@&n)S zdQK^2kz*4BGc|XPSMgnVo++uh!Asl&rqOzG&NuavMk%yGS4FFc&|-Ph(&i$St`G%M zQ@U}OHl-3yD#>|X>)ekN98l!mfw%YEthW@8wxc;eGwzne^bGNQ+lT?!OVhdklP~Z!9l&qS# z1VbdFRq7#yf5io`HzFV$Klka6$6U8k)iAbj>g`p~r(lqQEQo6=*tEf-uu{ikxHvImOQRp*$c!arG+SQ@z5Km81O7RG5*gQ^mqErB-v2C zGcR{TW|vdkh69@q4UJ-%N|Z&D4L7F3L>7Px&%A3%;>_`*cO-!M&$KawM+#Owm49vv zJ|*_L)fAqQO!lp52VOHcoV$|fH>~p{+(w=GMs$Znc{Um>n1D$yPEsjiOn zm4A2E(|o?Yv9Jm_KTPOi4^Rd&ZEIjUmrK2UYEI*UfJ-j~w1I#fqdCe}S)Zf_7RIb< z(`?{UU=pz`UU5F@gm6r4wPA`U#~!E7P0x@=D)Lp(b`irvF)q!^VqYHAyUtxS(d?!y zc6DLC2d4eMpa8cRCkm!s3j2v|H~NVHTYndM%_Wh$*-XhNBUEl@%_VV2DHB%Q<@R*9 zmuyIrLF|gu9eKn6&2^9W*R7+}?*#J5O|fL5h@&i)r{!1SEjBOq9=E2+FAp7qpRncA zlhfVZUw=ZAcd`Zi*)UtQ(0A;(;!|_cagB#5Cnq$a>J#o_jvD|B$%Ua=Trq3(s;GBx zCO#)8XMq5EuWhj-wkRbHI=7|2FeEou>qkVksYSUhup@ohIO$J5Ap`0rSnf3?qeyfuyy<3JPMypUZME8FFm~lR zo*eEP=>`JK_R^=murAj!)i(BMp{8m5VMjnfg8;N8G~_- zXNUQeIY%P~+w27NjA}VcXU#gxzKq!&_w4`3FUWpqY~@8W7k)X$tg68yD^l^P-~`bK z};P02;G7BrGGkYb{_Xv-|REOg8bjfePJJ<&D4EI+BYn;V2L?ISYp=@rkK zW{q!xA`lkn>4xA;_&`N=ehiokKg34!GiBC&B{g2tw!2v|6j%MoNKtt$w|43fL&+DK zijbd$>CooiFwNi_nlSzBq%O{vdjCHGt*73Y+MC;0xBV2^UKyMw*(J6;vM)ie?HkB$ z2|wG@-xh=sOQ-F${vh*u$3Al-{Z7Y*I$f4dQpbJQxt(l}NBjrnUZc#Bjoa}^+T2pE z_4~G?pTl#jK3jbnl#1`!DKfF4b!a>TC6fV364<7vL3&U*2ETc!Nc_{n-v(qhSdA@XSc`sDb@=O@2Ae)jpR z*QYPenB*kW!0GG!fnkpB|D)w{aqY#+O+(Jj3lueMEd?pE9dUqy>uH3Kh;V1uYR>HDb!wyjKOJ?52*}R5mL*BoR^mjwxmVQ+5ht|nmeXdM1)8@ zV*m`gd32AVi~9R1{eHT>=P=rq0i>i9RQNjFU$Bgpk{Q!jRc$f>Walv0mNG&c1VovB zw%TMop_1=G<*zvQdqe!H*umNWN8E623rV8JL0riz4j%*4syQSQOyQj~o_ zz)ql`L7m_5nT|%rhU>K9x{4c~#uM}YG$wSh0T@drc>@a`l{@OP5XN0SN)un4Fzc?P z9g3j1tk&B*-Rh}~Q>NmsT-+!79uBpW-4YdyVyrbuMy7pI;aPWXUg=hkH#t>M6a zL|Y9mz>&tq%(sOgU#BgO@biz8uXvvo?jf#qnxkI z##1uYUl5fL=gKGnL0Y46Xf}mDQU);LBx1ULxk$H2q0A?q-qUubSK%7E$Ea6w>4v-9 zeC5*5YsX7=B)Y$!EM?G2y2q|L?V&EEl7|Y5;l94iY`~=IG7@1j{3sl?FZz|5>Z;~#KCkPNmzW<18yw}--Zci8= zo(`Sk_ZcT|ZNcc$c~ReUG1z>Tz@8cqG_1j9 zR}U|daOL@h5)espb)0#i_)ndpf`6&QKvT+Bv| z>XRr&PFgH{Ofi_=4{}k7>;{wKaFTScymR#E#I*fH14S3(j&EG5FBlt{t}(L?vU0=c zf58U>{6Im8p5<}o?Rg1$dIN**$C@&Di`98`xuau3gj>}|6i6o(mbR5>d89}$BzkeB z+!`RpoMh#89`(6(*ekxIYmihFBw^O){!D)(6mwjYnc`kPS-agEXxP_lN1u&w6AEh|_U+Pk8As#Asl&9K>|bJS5$IdS>V zp{=K{kDs6XBUiMYNa+uJHc)z=6b`RD)BTAf%1kqOu#}w%ZxZzhsrzDn(IFX8{&PlB zw`S+{c%pti1|dhVaxe|H&1yEJwR7h({)2TN-FI-mg(ikE*qsbKKD}J|5w)z?f4bA^ z)$!Ipzexl3dS$a6h6bj(Qd6)fs5YA3!3Um~TeP<9E~IvJ_!#Q)IzO*q;j|k6n=|XO zP^cSegeEt}oHcLbo?Iq*Px)wc4+i)2*~yFV&c45w&+-RUc+@@(7CU|TRs8JL>yxvy zKhTE^Kg*ogL;2h*V~-IdS`kT7?M5$dJ4N~vyUrxgEPzF3#8vZ>U;`w_7;mV1K-Jbr zxvL7wc@=KJ4Ix*Fp|AC{iP44OHiq=bXR30Q(2ddyxuLS07l)@2V;I#Xfog7?_Plq~ zV0YiF1)xJqXiKV^X|evGt>H7J=_Q@DO%$dzUK59MF}-v zBB5w6jZ}#w^p|iHoJU@7)yq&}O0&J$p_KTidG|eUwwmq~?9BW)R@2#(JhXC=`srU- z)Bw9VKP#$b{+bO2Y3Z$G(&!wu60?_H-I7h^J7%YCZ|CG>C1;6F*X%*kP`1a_)0Xi% zTmgJf2ZwGBckILDPGTc%*9%*fl_zLVwkfVIJ z=4E_NJ>0Ez=hx(?l+-3wGoCj%0`neh1hWg=M9(k~af23oxQWXv#C{ zec&|lc}tJGU2dJTIehXS?r%T4H7Vmbs;ydNeA^)K#D-)C`^PqpmV|$Bfdw65WHB9Z=i4}GKluGMaSRY-t7YeUoDlxd*^u#D z_nGJiS<0W~5AHDDH*ddvbMg=R1Bya%C6mQa8JNxKpP$|3J!e6={%-pA z719LVZ}X!!XUDJ4!nrv*dGQ1~w;6cOb=CBsr0Kkq6%M6EWBP7msp9Cs*;`;gXEI^UfF;V6aD}|2jK4Z&921m0X zr#4IO^$vU+z$L`$l9^}F$In9x-J&~bl#gC)!lAd_jH%YmIOq?)NmeLb6LFaF@s?}I zqxyxfm>Q5bw=uoiXr6R?kte5~bQK;itfFA)?Q!aQVkv^&o?ULMW`V17oS0>~v02-O zgJaFnXS+IEhDz#iVox$nM@QNwRRCH*rN5b9%u)kf_Bvm*#2jtql!cSrxj1k&!Qb|? zzuVPhcTPiZe#@n35_S$WiW(R2L=#VJkl94TBpJSi^Ba+Cr>Q+pPjk_$MBq9``aR94 zC9YGkQTy_M{RMQk^xl48L(qBB3%E0+bWyu?9J=W@a>Frz47U@boFH&6%qfAsH20*PEVC_5Sotl66uyd+1z;4c~7>NjiE?_HpW1IBM7)1GkMBx<(NB73e^t+ zWQ@0VvCV36ESmU9+X`!1E?XyiE|x&CCJnRGc=Yty$yxT|`1#4$JwJMO{O!rJH@SUI zDh3k@FS)ixQ{Sw}HN7lW=Zm8CEoaj5v*YLAJ~__$KU2c;XsPXJiXuu87L^RFC%|vs zVj>RwKo+L62)s1G7999RHrxMyS@ya?Kq|~po_O7`mIRzw#i}^Pl33pGuS=j z_@a^w@n|_DYUeD|c%$$wqZ~3Mpw$NhQ#(;BqN;UT#QFzP9b-I?d<71kSti+GBvWI& zf*=kbnFowQZ>%6wwt{ROsT~lNXLClW^O2!O>W||4Njnn5q8b-Wc{di^&zYl{LN!nj zPR>m*UKcmrvJ;#49P;02oC8p`W+7aTH{`NbW)4P_VNeuxAW=hZRAOG;A;Ka8YL7>i zMCh)*uIj}!v`8hk5S8JdOWip+OseAxyH}Lxx{Mjm!kV^ddwW2zFS%H(-R65S5!Vxo z!*cD5!PjMX&a3C}2^BUhH>6`wGqww6YR3<(^iiY}*An2D5pKmVQRf+Jfb!B}86x`;($xmreJgo?IImhP zSRfebmXh<$G$#?=jdH(8ZYZecAk)c<)*Rz_B9V8s@gaUFt@w(hCe%0CqS>8q1;{~B z(5CJrKLTxpg_FxseQjFZK%#XSf?8dZ^{%(2ON@34-K5+wZrIvClirl~|~P zSYq7JBI2>#Z<>?}Ufup0==Jpyv`9oYNdHbHc7kra)iWD@@Q}{{7cl53hS}W|!#j)0 zJpy-FV19XPyLT?Io`j<%B+^Q3Rb!cP&n67A%=igKB)L?PrzLkPM*{uNwxwoBMVBH6 ze=-XT(b!xC&!r7gcOPf}c0IKUau85ftWjhSkhr4bVRdYQzSZptT}e>Niv)-4M-ZvU zP=vfv2Y0xFgx)LMIPu-o*UVlacrA55TG=1VCU<7IWNn7S!u}yxiE0ve&t>FI6LJqy z<5DM$EAD)?DNC~iudf&=x$w`!YG;{KjfR<8?MqU+`oG~o&PqrbDUFE+H0B}hNZ`BT>@sD?*uW;*bJ(QOd&id z(vh4gyg$k0UxewS# zQdYfPE))*7g4tEX7RNZR(<5EUTrE+bY0X#z^~x9xM-=A=0)QZnmqm3rFS?H&5IEnS zTe=g0F)TtCRq#c(`04GPw}AlJ6I;hhr(xi zxD65c6eW0%}n z;ay|$=rsl8Uo_{nXhml3M@yA3^xi~?Nu+3bGA6VATLBQ5C-OtZCsBx4QMRRfy~OJb zB@xWAN?_x@-?%Q@t@1PUFX(Vuo8<@b-JP|FoXsQIuqD;R`Q;4Ro=;W&hu+K5c)Z?7nmg!wrbZ}DefVdIRR z9YNSN3w@w-0<-RKYsC$U6Br`E_e-vVSb)ze{B4tC7Z-=N9FEHGS*wkCS~Ll?+uaE6 zXCs5S(~63hb}UwLNnq@u-#t*A)$jBCH+lX*{`lDg{P}QS?Ar}K|KqFICr?j*|Bnua zJun%yLMH4or6uf1j-;N3#zpxH~Kso z5nT2Ndmqt0b$xRi>1mO96(JFKI`ymwm*kccm%~A@%_FgW!7s=Gt2^Or$=+ezl9|n594N%3igxFb;ThU4^gMzFSy3 zMjKc2YEMuik+71Oun!kO?-rH?i%PozQlq;@GBeY6qp}!PzTCStKU`IaA3m!><@!25sVIWkuyBp|3m3 z@rP+g+}tY7Lg&qLCME+y(qZ9f_$|$cOaQ~o^Aw<68+dp{*RG7nrd_I&Q&i1jrv}>& zqp23wlz}~yJ*_*K{0L~2k%?v6gKy|LGgCTJ8I?Lo@+qmCNxn|1{6Rf9d=Km9Wia36 zlI|zR-$k$MH*PxKEiVwQuB*q9ayNT$=mpswT?$bw$LSSe>SK$Y94RRD%nROTv8IH> zGXl`oLYEw>pf1rVRl53NSFk?Dm}}~WAO|l!KW``R1#`=e3Avt3P#pm!P5X`Pwc*`7PA?a_1Il= zJsbdH+#T#k8~{DQ5hdkdi{>s>Hozs6#hGAEKFRRj*VqxXWPx%O8>|)ZiqTTkNCEA| zfdZ$8k3_^yh<_$=z4V+12OTMBA6Suwt1vqTg~VM$o;Q(>dN<})Pc=Pbg59@W1zs02 z>55cQkJyO`V5$y3MDr^ZzCD)UTA0OcNEO(c$wR(1ckD1V;vz`@Wp#mQY9wGJ{m{m< z@DhX4gACRg>2!D+Qag(J&UN6D(jY|kK$bgNdDeS1E`Ft!9CAYM_w`5_!$-Z*>h!`? zR*erQaNo60YJL;M<%iPoICjbdW3w-ItM!nxmVL1M)Pwf+k=;6|)c99{q;(PmUNY$I z&SDidL41$R>9-HDs%|*%aguC+&3;LSJA21m_v!w$MfbxIlL$GQL~Azadi^FWxpL`29)ZDwHNIzin5}VSZ>$8q%qbFF2FV= zBh*HSkl!Z>FUm{uDTleWn4deI07JEY zonjJ`q;NIkFX;}12PkK%DpyB>e9e_=_q~ZWAQ-_XL4&nzU9~UauK}y1%jTj=5u;IP zwxuv?=iMi|p-4q*o9H(F80k(X)`Hnp}_QVevq^#C^IJZpFZ$h*aAHl$#5ISuup zW2FI!>QP&7v`jWdbtR(2c~lp>rQ*r7CQ!Le&|mB^%%U4?4_I-Fz}+H`%@5T{-y8Q^ zvPZHo5*drKc(LYwP;4{1l^zH&1J6a(_V?1wJ{Nt*byh4{mD>zOF zxL1p<2}}!>i9f#%=cYetlVo6IZebPNs2)ZP33}bZ{c#-1c#tQ#iwxj)kG(GxIvBh5 zN#&>BXk0vA5d93KuIlLuQ4mZNmt@+D$?(+ZK%(xBtZ5sKEI>~yw2;;CRpoD~gFgG) z?KXDNAGQJa+IA0bdqH-`uyLPw#b-L_MAUO0jOQyS^ph+}H>Ihk)`8pO51_(&hcf?~!EPNirT z>D>4#G$^x<-~+R96sTNGbh^N*BGZGn2ic7VN4%?KNp4EpYaHAZVESAxmY8c!4hT?x zLDQascwR8C3YQ@D`Eai9{s3HudM}N8_fLP~&G9k1FZaGAJIu@KYQH;j5jreumM;~r zxdw=!Uqyh3R6U~DcV;+{Bm+`iAwwXB3sqvh$9`|dqWt=gk6*qxJNf zlQ=#4^dgsm=UT|(qOz!)lxnS`6Bh87Se-s4li+&tpj)H`ZJD*NrAQ`mrS2>fu;CCx z^lJDavMZ|x6%(dsD`gBVhg$FA@w);L(;=nqWeEpnGD~I>+!Kokk(0BW^wTQWP$wi& z0oWTi4K(;pjzYHtl8ANJG9-K96lOzw$ay8U0eaJP6E;h;nu^G{7b~mL-ifmmJ7oMb zJcNGNzSlqn5Dtc~h%M0XVkQ$;_$%_k?u-Xvl)oH)I6mVLPlzVRtw8f4%cRGKan7!8 zQNdL_G7hhK^DX)+5~QEG1$j}^J(MMTh~BeM)_dC|1G7jK>>F_)(6J^_|M{-ne7-6_ zU){9Z-NglpsFJ)VORroEWQhgwfT858oA6(USp5Yjc8m zXa}q{zlBbpJDUl@C!^Jbfg+P-*6pd6Q(7fF#yrn~U10WJm$=ZRBMtI`tY-VbZKGjH zu_`t~CP)-OYj&wHbex3*;>jFIFC`m;on1dWx_9s1_b0DU!hekQD`6$GpuKf5hpqn; zm%-|o`Q7AuVNM5GvCbxQ0j%$ZN$HJE^HZXR8DwqlM7M6q2_I;6FEVMstl6v9kkT`I zuB}NF3QZ|5)||1 z(Chw3;_Bp@MNsv_oJsM`EdBzXbJ46+dF(3~6ZZ<`U^f_WQH1mQIlZvbPcl38ce!$ zx`MtLs;)~Xe(wvMN6b|(e0uuqgm47<$y?J>sC1qrr)y5AmC&;U9Uiz)q)AgocMt6(kfQWLRz|NLe#mN zU(M*Ia0MeNNvCe2g(yXxcsxXX&7^HQvc3_te*mcp87DKsHfdUAOIrL_+EzX8decyK zKBntfvUq~jJtq!>V$;9o;{hcitgB)T3M>KTbfz%LnKXg4Z5m%isVhW9onbgw?cI}< z=8nS*F<}n1ICR0RO#H3l0QzE23+S?%ml$aaMoDqKcYb5MdgjAAM>Ok#D;{3tqnM~B z+s?~_F-)6c!A=ig1+-LRa*=6azXg-xlO)VKMYn9iv`ll-vgFxENEpyZblH+mjn%I0 zb)~CE9a%KINu;D8kQ=V-vVOf|0{Nf)jI-#oHF2tL5X%S`^(1MEg29MqH5-CkOEyZ? zev)gaqrt???_o9Qb`9s@!B^a=Ch?nIN>>c{R)T)$MCI?ALDdV_GYIeC3$ug;!JRPM z;#>rr(!=ZotthMUvb5Xp@GH6@*a6>D=AzE~na&QNT{u*o-Ofwq0WArsX`=7H?ZhjN zL{s3*YLI&J;LYnKSDN`~4tm(QFo4Lpcc?$gO}}$CmYr%314rSUa9+=)Bsi*?auyiM zAyu`76|b50&$SM+E$AZNTak0>t`xd~b?Sy0ry#lChMtJIsvAxGU9takch_VbC zZ7g}#okWdjCcVl>qVJTBR2wVex(HU_LvA|F6;oQp1R^kw$O0S7x$#3rXNlekd!nf*UW`8asl|&MCybmbyoO)`^iRrz>CQ2mXD9f8x2W zYo8;|%~p~~f@LTBKd~ja$QF%GkWR6qr?q5Eg9T?Yuq;5K`IS^3he<2#Zp~#x;(o%4 zUW5OhE-Vj-F*ll`!ZNYN5}aj&>O8aYo#?`Q@d>Go)hW*uGmG{|KDrT%ulBtqI~c!+ zurMEici3>YpLLgZD_#k638RfJ==p2u!MTwn5Qn5LvO{UiWOKj!sc{H zSf5O}T9Z!q61!&L?yZC;HK!mJFru^zIG=_g1kw?PKgqgVt`QMj_&K8>V587QsoI8v zf9U;=9hKTDI5{%I@t~{Q;PvXs=6b_q>PcG3Z5Xl)gi|uLsAXy=uaH2L&Y+(@wd&QL zk7XzY<3=eod{2Nw1tl-B92CWj?5^Ea%KQ>BNqmCYaK#opykQyZ?<@acU+?Y|VRE=Sp`2{&cUut@*bh9}V_OKQ0X za;_H}E?pVk@Y_7TWv8QjH>LQamC+Y!SZ!P4?X9s%p%p zhx;%--4rh6&_fzEQWT@rW5wMFx5Nkvvl!WIn+}W4DY6bzLA~}=w zUSp}`nDR7uR#8xO55Xx3T2<#1zGf?YGW_Fwq<4>fPxe6YhaTYBuf{9|UIP4yavWgj8;lTx%w)wodX9#x+UZP{Ja~H)gJrZnAbb zJIZ>ULNblK5;OU5-%RT6G&pVt9x~|}9iqHBZUI1O6i(bb+Joc?W!*)d0>cnF+M+P( z>}Q3$iBXWAD%5vJxiTEwhj%!*4+jqJL&eiok@+cSE)OHeCq56(?oI-HZR0YsZTI77 zi#tpBLgIPj>F1g}j&(`_-CP?PbUBfq6$54Sn*T@uhFG^U53t+P45;> z__d@Q4M(szDO#S6B>PMDG!lvcM<8;TCBS&Mz&A>Fp>jb>m)gxSS`{CqcX;dAR*WN~ zK5Zb`n97rBlWmf{h#^2V#qIsq^)?!Z+s)`B~NYbWR% zjo@>wPR^y0RfW}5tEO6{UMA^r)q+D4zGABRL{Wk}XS;2_+{ei|3j7ha(;5B4#st3d+tS5r?peTdi&c>IArgIvtd4 zDpKF{GAuI1e=~bGah^iOPOsmD#?t8c&I#i2=eAr`Q=P$oLB)DDXOse2i+~^OU|96b zNZz>gT~RxSi1er2w6S2g!*cTufs8d5iz|0{fU2@@ZnGUeR1vvfM5JfLcTMrHdvD10 z8s8r3cPV+4oNzK!4R4UPAF6|b`8HfN-3of`{h<~+H3t1tr~#}ky#PTaKY%4I+LVG@ zj)T?PlrhXq>b|goRteJ1UBJHmR;q+hGV6hY0eY42TOPwb#;!hm4Arde6#KNuwUZqk zLb$p~N)Pjhng4+xgQqXvo^&Hpl3rdc5A?P;52NXH6`y@dKUJ${t0yXM>xQv4N$DVV z{i(sb;U2_d##-V{S(l99kX4BTTLo$GzdL^RR-(_ZCD??I4qw_GglR7!^3!tS{Ov6k z^DWv6u||RzP_i}%BwcrM8xh92h?4?eI8(T`Y_@U~qwSGg8dB`Gb2i2EI(t(7E~y0d z-|Gb8Z+nMPu`zh{a@m|0%TB4;2;%USFv|#(Pc5=;0Nh?7Q>UWCll$5wxNC2ztFcF> zcS>qVrF#?h16M>>%KvJx>1@BN^*JF_d7-`3=ipO6i?j#2CM;fuusFY88C8<>5p0EA`FToSVffGAN-K^WHO}wpEs%&pX8u3ze#GiLwG${vEQne?+p&RU) z8|yd;_I3gD+8NH^3%SSypkCKXzoJ<5RS)Rpq4GOSJQE`9nZAZ zVTV#yzU-yvg#I{^Mo}UIi`@1c4Eg`YUCh6O?4QCM{7?7t|BXni?MwOeKi$jv4Zt#p zIWWP>Tk?f$zEwY{=&*}HsnnjbxjU_yegHi00<}8I($rzVdCy)SKRy8~&-4NR=b?x0 z({j_Nk)q9)vppduG;u~daF=n59oY+|l01VQ#d3$~d6^WU-Z1oL*8SaufHWt@*pq}8 z23t!T84=h$n4k?VcGo2R8(IO#cu=-+#5%y7E93Bo_loaQ>@i<hjjc|u%}MUwA)U9Te22+}mcU9;q!Xp=1l6Zn z@3@jII45I(Kxi&a;Hq}jNt0V9Rtn}G+Q33^5ORP-v+5<)jPbwP0qodxsP zLu8V4dq;B;^v-!la)-Sd^p4l~*YqqHmhaqY3C5E9MjX91TO+sm$C9j=;sIkz>Odh6 zP1MNZ>dyAOtgdi7xt0uZhnTQr~{=)yPK9Mv2rf^9r_dVK%knC z)TLuUKfbPrKcmw(aa6hn5p%Jv8FU5m!holg0HGvhdDEbeV8fr_ai|Ec9mt|DqmrhY z&!Sw1FGdCE4(jrf!5ESdN=d7(jWpQLOyzc|pZ`;sGP=1{`q15Ug#Fo>YkVFQu{b$L z^m3fzseD0i_Fe%IK#V9?%P2C!v|$9Me%e`(@5VE~JxyPv*FO#W>fO+nQy`shd1Sfl zJm5kw>3aq;aQ&Vq5W7{0*?}(0HApWog^XFu2o0uH+B>C1W}TTH7!sU$Ce#c#4OTZ4&vTkz`p451Ms;d-)brMvl!hIZ|9fIZVfd&?w>fnC)GG}*g6hU{Yf%dUuu!OvS@%bn?K5PX`rYvI4}4aCH({aSXr>iPitztJhC)<$%JKMir z=-nPMX(EV-sD4h0a^eF~MMD#a(l==WkslM1wMez2Aox8;E6|~qVoE-y+)0M=q1rSx z(>l_SJ@0S0q7^UEZc~4D+!bOWVn>|avH`%f+2!J)MP#EEK4MDD^Gx;+Lf`EN{YQAMF-4?mO4`0 zV8vYcRnktRcbHq@s5r-9I*a(kKB{!0X3^J`s5>w;;?*tjm3ULdO_pr0!YadW3AN7V z-ina_s5gHVDW2Re^Qw<3yz#bB0MP(Nf44A%+nly7&H4!s#+y`rsdp!jh6`quY}QH| zS*L9-v+IsoL`27Vh#7XB8snpWgEsp$+&MlY?!|PgjOF}szZ`Aq2i?_sJfW}46-v#E zcr`EjfO8T&m}sVrsI(})u3ecoWspn=v_fwbbaRx8bzId8g_=$YYjiIfwN*_y?*iEq z->^MQ>I5t!+Jfs`icyPb_rahqzgtx=iS?&O8u5ov69H9BUXgM=IG=?p=rs9RoCM{q_ zg*1w-iVHOaNa;}IRQM(POvCwt-io6W0hbQza!WNUw)0)prBdgvm9c{7C@rvN1PRe| z(+g+DVzE5Fn03O#&$Ru$@i**n0sA3B)JA632vSj?Np&II;)D=qx&l5Stpg3(J81_+ z=NI3A{9qinjl{`q%`AXfX-^vYfW+AIvO>4jWOmc6pNWi852x9-Xr*izJku0^DnNs)IMku5w|u#zp?-Pd~S$I#BcZqs{w zx0NOF)@~b$Iou}IGI^axw24`$-Vn-!q|X!m*}zMb?JSPNXt2^U5*?JYGlQ zG{PIJxK?CSK@m1w@nK}+CtM=^i>P;pJh)4P2MH3>yXG{^NV!2Gf@rm^7EK_JC#*ci zJaBCRNeLgLHjLoi$>qDTVi@GrBs?+b0q7<(nLa`VB&KzvAlZ~R1@U{&5YKlOdx<1G z%}4H`E@Pn{IYtK7aP@5D%A0hY3OIn)O*r`ULJX_Np*G)^DAUWuxjFyCZ8i10k>v(x z>r#|!f??K4uLKF5^t|&(1fn(FqM%IMXu?#KW%NFxIl2>Z8-n9RcK$q;T=}-VX~d{H ze(~m%s_5Z5=>cwKXPyPol6~b`%I>-UOW3&HEQzjAOT*mDpD^+5l!eqf=Ey7H+N#dum;>On~m74D%4awrkQ8RB*kgX zh>J>zJImFPJR@)bamf`i%{+aXhY7|XcJ{{NVOx{*(jiBrS&$VYMN(1%~h`=cAWEw>lLk0ose z6>hok9S<__`baoxUH3n^qxZs>+j6zWw;kA6ZwPqs4r7SV-DMCw&nk(YzI^%L!EE!B z^zFU@L>AL)q1L%z!47G!{4AsyO&pSjz{|{WA|=s#4r+zpS@w{oIk!e^2I`JgNeNd~ zyCN~MEdErH#vG<19G-=yhEik*Z#$@{9J+q_g6^veQKe4q^Zsr9aDVgJEvhq=TT;p{ zifTiU3~HbyO_`$A&1TD4A$&CnaLejH)G==%lPb|EgFRiGOpUupIv7iz4td!i2}9F2t1kI`lB)(i{^}4h#vb4AfLi)zvY@OpV}i zAgyK%Se@cwgOD4C`JQh@7n_88_?lYdvnkG?Jr{1Of(^9|E0%+ZIX6s2iz!WL#a z@oc^++AB*rjl?Hb$#g~MvZ#em8g~+RGnoUV^dLX~lJKIQar_=A$47{dKgb{Ek2-ab zM(6oxj-8knUbc_qM2CN*^5)z<6s{bpM0Xr3Mbj=>wk2zLVIy3Z6l;O-Q62$O4L80O zCd@uB_wD^~SSwzdlwic+u|g}`E2ww*w-br^kUVdBySae9sB4$I{L90vbYhnL=ZX_A`^gtOrPQxsOzDj z2ebRLFMc(9_yA;X#bp>*mM&J!RhD>G!ZAf83h_2WcKz!={}&drVz3Z5C5!(I5cufq z1hX*Wf7p|>EPOR{IZ3`_QQ1m48{I~#sF(vMB$LK5?vt_8KR8lmor^ljzRegPjn9(X z2QlpA+vJ5oK?%>$p!+NY3cl>6^3sSPD<1Tgo-oD3wpUuA;Y{2Zw_g z_GBy25dw~deZ)82uGXoYWxY)q8rIS<>B>wb_5!zMu~|}8aLIVaKEc?S7rJ})LYq3K z!w1mDI~_Pe|IX%~R`O@RnA7xPpoJO-XU0CbVk($cOBoJbl<6I5WOtmvN~dM31bK2Y zY(fT(9K~_62vD~(08X8W#RG)y>98W>8=|??$UL>>|9#IY0}%5)u0WW2iha|XI)v8~ zG15_zl}v|1>}I9 z(8J7=!rKg9OzC^Uh3%({V4k8hMZwGiO2FKD>llGrUh65P*V<%AHL!cyQRej^UA|gX zxaZrZBZ-Tk=WoI#E;@>(Vlae_n^8SPDv{vKa+TPmR=jVho%kB(a`0fee~5{>rr%Jt zR4cWo8aDfJP3z*>Wt}TkxB8V6t=5+2%4*p{O=@9$u;s=~)B%Bg5xujA&SaR3Z^0kQ zn3h6oI4$E8>&@IK#d5Kp80HQ|p9P*Az2-zOcM;^40EAXCl_HIS^kyLrp4jB3I&jDD zX$LR*by#cMVddo)K03*6D}F+&f54gTPf1D&lHL_|5+YJCed+K~wD$L}M1Q}>aq?RK zc~e{y!zLN#9LJUD-ZJw2q|#jWSXix(zxoQJ3ICmb^#uvrPJ>KXT(Vs0NRF+5?h7hf zi9ZO)Y9%k}&m)Yf*^%o%9DrgQq3pD#j1jOeP?SV9CjYB(?_2-Vacq>gyO@ZCq7Pqv z!zvH33LRyujOi;3hLeF9=`5Y3>SMiIIaDG-Ah1fqJdrDHP1VaK9fzIMaX#W$lRm{w zEQ~_P-X&k0?cN*3lTxO!l>JnzP!+g6iwjFJaq5|s@J&zxp0JK4T^&3lqP>X=-Bn+8 z+;Y@Z@0u{HbdNrW>k61$uNLxqx!fFe9})Di>++ic)tU|w#ZY*-?tDG@!;9nRr;n#6 zzdt*9aTXhKDd3641m)#`(Nr^7pDibQZp{C@mp{tCkWarHkGsE>+h!E6>F|7Vr{%v$ z_HyUR5#R`$0|;5Q+@ZlUI!hk>~p;}78`@c zpABKCx&sq=uevL2c8&EbhAqh8?32IDYfiO}&>^P`7TN+J*9W~*?lU9Er|O5~6S;)#OWjm!>IobR4DBYg8%0b;AI!ol}^?9mFQ z{jre!80Ls}Nyn9sfp5yt$vJ8g@)SC>I!}{@aLwfsnug)4yT-qP%v$SENq#nB`ybKh z{`H^#Kk+Ccfbh}1>;`yrv$A9XvflZj&44A4Db#K0CM&_?3x%Y*iSEySHT!bUQD%aG zU#j9gg(A)KP{cwBRH&=r{8T?_lXS+6&xGdtT&N`5Z*;Updu8(qogB=uAIc!K5PDa+ zhCHD^f9GWbcQj0R*l98ck6*pz1OC+)^yyb$(5D%FiXg6^?GCFCwkKOZ(mC?UiuGR~t=z)S?p1okWeW z9H4U;8aC2)Xs}Cp!6Yg{f<~B_LkIPtnKDX&bI$X34O<(cA*5i$5AwsfTIZt}vLa1DGs;%mdVFa5hW<`fI#!)MAGzeR|{ zYFVrbpS1f%f_`n}9LiaT=NP(P$va!NRd3gbK?P-pdDxs^0F_9MPnAQ-m$1Yqj0vI=w|SaagOf zl$-=vC&X@Usr+j0UoijF-+0;hwo4?yDf7=nN~vJF?rPnDDXWJx(_caPfjp2YDFod+ z>4tWtAG@p7rN%GAh)ZQd48KO`4HWo7ljfK5Fn;8&68|oDNdE%(^0xM~I|=`%r@w!G zas=gZMQo52hyyv~{`@TkoQj&V+nI>)vSgKrw2B1$7#ZYrE+w3ZjExUfc}<@CP04H} zlGS)te&h*Tl5ahn-(UksnQmw?5}wTjQUDCiQd;Ctc2DyIzl7TF*9YiaB`2yUHHu~>`rE=fwxX;Ny z&J+D@*@6^~RW-+bWBbo9_(XVpA%6fdW7n#rfQPO0zAPb+gG5=RrLdBX6Dw&3V|yj8 zD-NAf;kMAvEulh4@rX;KAurfWOQ|R(e4bL?LrUE<4lAPlG#!cZ2$mm^ydoQs@+wOz zsd#ybt3k}T`I3Q|XdLZslAQc4HVz!Ctja*XXh4bMNfY@ehdedLpC;Ox>d+G4aI>W< zr{62gsN(W=RQ#0hKtQaehl{ZI-Tt}MqfY-!`_nGA<@QHo@)kgte2>RBG3oBX4tiHIxxSfAul3+IRWNeuGU`S9=I9o`ZNMMK!G*)e0 zK0Rd)4g7?c7I(g_d}OGKJC3QkGR>#=UW@Z^gf1$noT?jzs^2?GLw;6Vq4C~D4 zD^NWrR>{$q#BG(lNxYB{KWUBX-hD#VPOpQB6ZDvgd^2KWa>qQ&<9LQH8+uGx3koqt z6uLDheo^vV8(NyFBt#d{*rQcUETdqlRxz{4#~s#mMQ!-ART(z3B|L(=PIJ?xZfdxO zcde`D>c>e7%Fe=4>K)oG8!t$i2VW@FO{Ahd(fJ4@V=tT=j1&}yo>XqG3eLGx#@cr4 zeoFz_Nci{v{@)?-dh@9kQ-rfI{}(H^6H85V?sWEL+`tV4~w{<+!iOLAEJf=?8ck31~DuznOyK zkSP0*))H21G1b$RO zM#Jh;K6g5UFFI~#(Q<53JkE14Me-biaV<@X^_$b&ZJADHn6IFhAK1O>eOaR)sG;i06p4KrX= z1cXKC?1+npJxCh!bEsI6UYSV)MJkCY9epSe?y}KZWWEpTZ;8Hj29$(Oj7h+>%^V#R z%J9(3F=kt;E=EL!*fR{|<6O!GGTE&H8keyumX`T~*2e~Dz6m6CK znPjaQ%d#VrPC-0WTz7m90g0&j{m0B?-C&*!f&5f2Qoz_Yum1!diD8yaFVgur{2PSsf&I>2J z27olR&G?{Ae;`v;>$l1lc?#PkTKP%Zt0l31y|=|Ar8WIOW$I|HejqeJ=p7T;3l2#s zQ?O-Fp2D*5woIY)T9eUPI^s7k`VEASt=crz&fN!Mr0oU;El`$AqU^q)kl07{(&tmU*faJ!Dwi#*2ecu z^PYF?+cw+=c;c)fkJwq0e_t-w`4h_JCPB?#zAjN`Rg@NxsE5hB2=Z~u4}4#=SHXOz z9(LyHby&x+2iV9Kz9?$N2G(=^%bn z#fQB*e*E{x-C4y8r$3yYeLp>Yadz_h#p#Rh=wC0V^4L(`XrBM#qG^tf zC|i_s5C7C`$N6u5lmB9bFX(gp17G4_^n@q^>A)(z?b#V&xp^pxzTvx(1}&WS6kY}b zhSP|Y84b#aHiP6?4vT!vS=}6j!TEdv-V$}N z-E9*gR>R|HJBwROb0w5kb)bhY()WO??(ZMdZF|0}mJ30Qsz{2YCqHo2xx^K3?^tBL z5*;0?211X7lk9H|DoF)Au5Ql9M?>4f1>A|ABa8^Q3{M)okuAH%XG+5;VU`2^jUAfA zIU)a(z9TLavn#aoVjT-zE33C`%SRLhs)$2}r5c36YcaX+$nB6wII7FR4YsjCwc)8= zLD*^7Hpa_m+JyfFu#cgeQ+Qpaf={c34yB+EPIl)>Y2!-az3X6L)dYmtyf2lHeG`H3 zuc6aBe$vb_WLd{L%?O_i=K?G=m)IN?=oXlF3HmIdA1gw@lOrRLU|lKUGK{5HgL0y~ z1T0!yLe`ZYYc2?CaSswoL_0%Ar|jsy$91hSaOol^fkA>s;tV+^JU5yAH6wX)pK?&L|OzCsYwGHLQFB#%~FTF*G7!n&BJa$o_uWpTbpZ}PM^1URK} z!jDQlP!46ze~4QpldWU{Pt<)!|A5^o6HhwyF*QS!3I#Z$vcN(l2see!+i0H zJvwNX?AN6dUCXp(vr2~4v)k0Khx=Za-JZ5C3ejbS3R-dlYoUtTG<-qHqXI~K1v8{x zWWi*-nQoiuPHHkL9raG@W01G;f`IkHAdM_Y(w^B+uaM3n{FvZDBugh@2JD~rcP1#AYe>ACnum_nqX+_Um8LY6IeLw2DVRPyAk3nJ2)L9hP!M+Ol6 z<3HZZ|Mma%zv~oq%e}zmBf1?b)I^V&FHCdP>32SQ_VV%Zv+0Y|$A3?%ZGQat>}~kl ztGnZS5!he^a@t1~gfZp3vl|Wl>C5uqEH^B{*`sPptB&fP_AIbaeKFMK(GhDL`DefX zEJ3O#PXZr)rze>bhgi)Bl4Y01#A@FCy#%V|K_(u zL~?ZW`-2aII0O%Wd;GfdFhlsw6p&vh{qLn(4EAQ+Ns9Pez7G>L^gfx4j@rEEh}q|{ zR!OQq1C=BU_@ng4d5|K!&$RDj<@!kid+}wwi?@mj<2OdTNq4C**6n#}VyrBjFcqiH z<2seE&MIDY2QC;~P%5yA=gyD(IvJdr#52poCnz#h70x?E=ngdyg)~NiM4dkRq-rL9 z5vOcqeP-(`nGdU&Q*_Ntu5~JVLozO%A*qb-I`m1Lj^tL^alFvXe(8tcE|t}z*@#&P zJjLdNXc<%JTyWWj2I~1u7YGQTS5P{q!y7Tl)Jq;&-q=F~L!N3rv^~uZ{{!t>1|_>? z-DcrSAkw1u@1H0*!x~kLn>b>J#swt-w>x&)ZMCTS?9jOz8q4h`&?->aMa?(6q;?Ek zxVHcIpRrF^m)?>jGxR^oLhK)7M>KSfy%WO`b-ZuQju(rT(deDAV_9gXleR^{N#$JT zi_}e&4M<9-XwXtuGar7NmXj_tXLG}h(%M^dZS?zNKh2W~h`-g9c=TO_kFwATx#d)lO-aobLVZxB=bv&YXqn}q*;`TY6I7t?2_Z(e;y zKMx=M{mCDGc=`GX{uFo3f&O}x7!lvjd9)$uy%6JL_Nd{6!d{K_8vc5>;b7;x_n`H2 zU{mhd!2cJy7C-$;QG^__OQ$vz@&6C6j{3|R9ebA*6p^4pG2*}0SdcK7m~w$H!u zrnud4)hd!3U`euuZKo{fs)(Rl6>5Oow4*F@`;Yn2 z$?MlIUnk$mSDLAxl!+oG!SsHDzVb&hMLQ^!)2ZF{61`Cd#>+a^LbEL*R5_83%ew`M z15ut+%r|IAVy!$>)+;s|FY+b9{8xlyx4qWiT#}{+=4wYbPdIk$U`^}yyV$=58lz=7+=E`-3yN&`s+cuof)LLgITWX-s)SHS@FxKp;p`?5ad zgHsmU!Q+wtVuV=@+p4`T>i0SSXG*pH%6c)*c{1|tINd=Nd!uzOOct;ji#EXX6w6_| zGct*U|2B*MvO17|IwYo9f;-epS9E)Ef1AwyV&EOwK_9;?Tx(&kK3E$m8^*X!So37x zXFbprCrYRpT93}`1D9crm!R3epVB(Vsn#Bi?Ev&ASNS4E1__ODQQdAaFHV7Sfd1w zpyq`qBDCAGsv+8<>9ON#a6;P4!0zN%8yks=MM||SMe14hBgDZ(8ALVkL#Ivz0?2ej zr`oM+pMQS2D>gwEmHdNq|3b@n%pVg2@6C6Q9f;jCY}!aft&|>;z#(ifM^cZ}jK*@h z$%|>wW@;gH|HbS9gZN~rQhrA_h3j*MN@Et0j}s=G+JZGid$Eio_EBq1-1N{E}e z$m+9LNTq8_rX%wBYUMPuzWhr>UuTJ=Y=OLqWuR(|8}?#^28BWr6^Q6y?QOmtT$Z7i z7^^aBIUV)XdLsRe1k+wp#m);pjZU%D3?hi}))Wi6q-Cl)zbt@vs25AINELY&9uuv= z_HR@jt@~K8lFN$W?h!lDzkzIA8*oR}X*;?OQBi&O^5ql4W3)S@PQN~Rc5?jYWcvN_ zizm-c*w~KaOB5yHQRCs{qo5N{`QJTOEvbyaXPlYHOa}1}I=>io1;c1rtj-q&3R1A_ zDdlDRn&2Of`vd;=IE*(QK^$%ze|Z(N`RN0T3DzjB(9I1Qp*7ocm~b(5%H_?!`!}1c z-fZoqh>Np$fJLr5ztR=`Q|5IXOM-OgmZ6)vX*%-|CMamO`Mpg!zn9n5veSrABQ;bN zuG`BIBsqTB?f!`M;?Fjmxcs5aU%q_x=Cj_ml7KH>zU|Na=yD#0m48E8401fd(VnZ?b|su})5Y*n#b<))#@;Q(B z2$jN1huY6PmcFMcK@LzuQ<;NgeU6o|+m$CM_`UkLcrYxz-LG2L>hSN8qA&gc`oi&u`Pn6>89j}u^x|zL)hA~z{kb%KrmBFLjNcGm;8oBUhHX)adPD=#?pG`viLL(~l!75w^ zJLUzuoLkqe_7~g9Qm(O$#vrF$p6_&g;V`fvNzQ0e#?_-k{As#iHrBk96h0kVXNM9E zT04dAwwMb0QZW77Xy{VHEAJgvcct!-DBO`YH`a^eLa}@7fA-3-wQTm07XKt~U}Ph> zaGv;=wHSkQp1Wu~s_u>#i|tL7S~vh8W;#~n%m2xUiA{F}@i{%NFQRO!BbTtq{{2>~ zOUMx{kY(9Q{iR@DaPg&0FFK@@oOsccUZhdvKSh*t(iuuOphf9?ENZPTf3ub(V_|Ct=bx>vHgX>ByWI+D8x>M81*;*KwW}V= z1xE8&lWHsyQ`023&61o3+$Camzv5V=Zj>6Y>@gk` z6E?NhA!l~>y-?F-b4jo5tzLNk3PD2kw}b}=WEnZg9^Y3ss`Sk z(Fdp558)-3;to=SzMj^*CDXci&%i~+#jB|9Up(#brkYEzd)D~~MlTVZ=2g3`=E7G+ zm4g(Dy6tax{oOR|wGDZYX)d}>r(^yur~e;?RFq46MaN$q;ntEL*_jcO8Abn8|4G_N z2^M(!w{&ZU4O(BC8WA07t7dB>qh1!(vf%0u`y?6Rpa0@;w3{`S7I75anS0R@82jf8 zVF?w9ozb}4^xtYo{p;%1v01sQ04Le1vxa0rj|J1o$G>oFxUB0L|@FPH!czLh{;Cs|L zkXh~++m7dsjImRbME@fIEm4|Cn>{o2c4Hfo@7W`Zq{xC)tIVr&&8~PtqKMX-Wy4&M1tRJ z000V_I*}q>R#b36e5K(6b8cDm8-XZ8UX9S_GS7Xe;<32|;h%A#w&9H2c zym#;tiJwoO28Fo6VJl5p2|fGBCB{Yh8UPt6;WfuagK3BjDRj|PUnrOr3%L$oDLO}4 z4>yKWc_)stcS+7#bSA*$E9OD(byQojX=n|=S{wGRPMud48_CVxY6Z-i<=vd4u3A2l zW6Kg)wu}_fv6u;a+h>i_ow_z2Q!6oYMb4w7LwW|JG!U)i%uN6riM=VfZZ_|Qbd0_B z?1ADCCvbB_y+su)eU5%?q?jAuUszKGrO6VxZDJ>cvmlw}KP(f123O>n4qNReA6=pN zTe%+V8P-kS%i=jNor*rYbpsqRlwoKNT7nT=Bc_Z^mG9PM!j`2lBS-m>LLyu{qC+zG z0f(Qz@Y-M^U)=abI$F2oZqZC(KF{}T*k=Qkb?>G7&Xs}ME0EEfIY;`$gAtwfPY?ld69srrH^hbA`@ zXx!C3fjs)*wC);85c~Z+wCpixJh3J zrR)kf;H2Sblx1(Or`c03TSD}d$>J&cIyld)zk|IraAM^~`OEdm} z4lVsj9S-9oxN{ntW_H2kr!ns+sxAg$yXa(e4`?g1Ed5^lP%$?O<=(FS4F|zecrrdr zKEql4yaX{sgLj>~XeibxP^(o6;Yfwdse6}U%C}eCDe{l#MN9{WL`T+zOLT{I6tuf= z0Htxz>Pv+u#-DJNwsj>@HuvTvRb+dWG(5sGqJ^oZf&9ljer9pWF?2wPCs|;*lGph1 zbm&bKCIGmeM6uRyP(BsbO=FAXe~-vZKXUgXtxxq|&zojh7K{K2?Fp#L>xilIjNQtj zL=gSLRk3KU*?FazEz+~UV16!l;Fg)L=WbFk6^U9FCuJF~lBAHHr~(GQ<7&dB<|VWS zHD@h!Uzv0rM_3M`ORC(I6pmkrouBMWuAb+k(RpVns30kZ<|f^$NuXLO>D8h2kM3zf z>RF=$s-+NDz~O@aP^X6-0X_5IIUA}bHCm6Y-WLs)WiyO1Chnx_5JAYjFY%$C=6ewt zv$_!`o_nt3;Ag8FNgg#&%f07+n7%oCefr|Nd$AEQm=X(5KkP#YsLteO;a?fSMbqDg zefZ||`KxCq)8CyuK709^>K^7l`}pAg{rg{>{QBhh=^r2dBOZJ6hv(nEd`91WdH;(q z!uL=A_<+B8{PM*c`OSl0J$QP2^7X!Np6>hR+xuVt@jkw>kA8jp)T)}fn+x(A*O54T z=F6jdnjtjhZ$MiTGz_Wkfm714vE5W3btN_5q-6br!__!nHA7bbmWyIr_>#RW!lTz( zG_KKnNqjY%BfkKdJ&c>_ipuZdj1WN7sH|yY%xn@Msc|JcWy0XeVsH_=noyQmUJt_a z%oI^(Hr7(vK|x-RO0ePRFOUA3+br*NShn3OQBwUP$cFq%j&Iz5`5(idVGkDJ-Ecz* zTXEQ^@|*j1=yhk}H({r_JmcxxHz%);j{JE_e;s$P{+h+sp2wcv>9Me{@z{NPtiPIy zRndinz$6-H^CkUF)&#ITxry9DA;-5&>Cj4Ge{k7xOVSgdf= z6=L{0d_MeX=d=5+j-mM_?sU{+&2DI=c0ZfSiw&=ca@7M_*t<^5P(Y78_>(9(q9BnI zt*`4I+k<&JX)=yfgzMAL#+pDwc|EtK>U`;6ll78w&g?411CG>CuGFa(W#fX}NRo=5 zkF^#cJ_2j!+M%rQXHn5;}(uc2k|nGmB3HO0FPj;$^* zLl7B6C!T`j^!e)O)Pma-m76Wp3&l6dD28^Pr{Em!w|HzL8HKEIj5zeu6Cn5#7U_T}-|mwlJqwWYd%K*=vXkTo415xWkol6YCYR!2lCT*m>%;E}GPfXlp_jYt~fhshU%UBRgh+v~<9RGK=nDZ_C^MDf~e zQ!ZqiY%EI8L4hgDSQe{RfS*Cm6awL-*vqoQnFV?GHmyRos8FIVOmDftja6#wjSf}V z+h7)sN|Bk@79l2aY7)QmAQu>>@j~dPU)r%9JNw^)15FixhFt9TgKu65Cxn0d zXkMh{1(I3ECm<)yEFd6WvEk|)Qe-|nr@rEHUM^6ZME#5k8>r^fBqz%kJ=JawJc!7c zR3L#Vr)cK~1Ox~gmiK(&Y)T^8+?B+n)#KVXE_d`u%9FT@`N-GK;+!z+Bv0>ja4cbV zxDf7~4v1yWV~Wd*Efssxnpbjv7^y?ALM$J|b_Z_M(A{gzBUA2Ai z1wnG@&O7G3XZgJa2wjFBvkLW7mlJUk?klK`c44s!g9+xMT)NX%&Dtbn3>i~fQ)`Cz z9LaIeSIiN0L#fC2&ZAtl5znGpU1!#$s1=egKA>u51e#Dr`H?kO`BtK)Kc{<3FcTzL zL+92g`yPMS#sM@Jkpa8io$J#>T|?+t8|mi3LUOle*`$|Pyan)?OqAQEj?63BvSH7= z9OX!uw*g>*G;r2)FNBGqsM~8~e@gJ#GbO~h3vZmrV#6r#^Fm0Zkae&`I&Q<7uk0BC z`&X+~xuAU&?sO*GLkL#X*~+R69Cdhm`L*Zf@XtpFF7^&fZRgLUcx2M^(jyCwFZD0e z4*b-Y?w1JKfpo?@j7_-9kXkj^+g0^3?4$1MM=%MFsGV?!z(5%98Sc?0iKDYa(aQxr+a1z-H%Kp{Ov$1Kk5Ys|So5 zF(Hl&XiNAJ$C;vt%orR}d}hQ>Cic}PXvG2&CnLl(bY&+UP`N2twk?+*%GQHNIgeyX zK4vb&t{P#fHO{nZ3DM>5&X)vr?r@-=xpEprJ8@N+B~ETvLsV0+YkH8 zKXl(fQ%4QgybY6B+tyK)p=yK<#|EI4TV4Ayk|Q!QK9qtuypHx`G{QgwOl{CH74HuqTEnf%-oK}ZofY9*jh4M&=e za4FLMo9fPDQ&^KgOk*ot@kfj0nku&KT7yB`xvI`hjuR^TgVxhAh>V~lmcN*T9{DM%zk$=Sy)DIrQ>KXK^iWkt#-i!4i?fY&wp z6MYV$z^xZyi%=FFSNu6Ptz~&Li9q$9Se``CWkDjHidm57VHIA$Wg!8q?5NulnSEfp z**&Z`Cr?(s-K}Mp4|}uJY0!17b~lYm{WW17RZaKhU+>rs0;hxw+Js-$h~{@RQq>7b zjIN5hCgt6j2KH}>#Eg$_?apKU`_U(X!t|p{BW`mNAOi=lV?;L>-mMul!1TuAr7+Q= z?I{IndWOZi)gGI>(Q-b-J7u@Pg{bzDEW0KYy~HIre~eoCrc*X+LYSbi_00<-T4>ju zW2*KxdJ;MSr+%N+?$t`D3BH7&CsF{Hf2?{~N4LNUF@8nq|5Yq0uQWVEJ)~GC$X$A- z_{6h5gAGx#>`>3UFM8!8-Fz7`H!&E))XCh{R=Y9VvH}Vr+XK(Sv<)zFIqH?fV=ty_-U?g6%NlXa; z^C>I0X!ngxMdH5~1{YT6NEd9AgoJ$^k1*V{?=iWv+xf5yzIUe+W=6`(dq)qLLP!CY z?Sj5kTkrabh?0&~rK@T!SsIA<1SM~5kwx~%J3vLp)sRjCUEg68lf;{AS-GMhN0zk2 zFV&kK+$)lJrPhUK@byyAaemS)9$Y99{JXj$sY;r+&52$abyq}ITN4R`D{0$$7o!Rc zd`s?IqXdpw6K+yEgAzoEL`>afVEJV2&`sh3&i<>;wLWGg)dwCxSxAaCgq!2Ci)tQ8 zSl!yO*xXSR_q=B~C4kigai>P*II0JC(N@J}oocO74AZUMqbQIJnc9;e^WAL02pTJ* z#bm{5ZFj?3YN(Bp=GJuV(uis-oK5-w$Q@O+Fl%=axlZ7u3?|TKYj(8eKv5ZSe|sI6 zTel4Dj6;zRhk}m2j_=)qj!8|$fx^5=q3h=Z5lOPpG7dKq2RKI@CsKCK2N9+4`INbQ zqz<&tk|)|5XD`L@C;KR!lS7{1dyS#1VGUwHk~38+$9&9cq@4{Qy!iR4Yq6b5-E-S< zs$p%cstrK)Q7IDLproB##Hxh`8}_7*KH}Bs^2EJC18{pLLo$ohq~JufFrgP<=7Yhk zX1}xSWev$m#>re}Npz-zN$*&F3-h~lK#%Tm)ch><9P=qKXvWa0FirKksKGy*2x~r& z-q;dRdh24rl>N}W7pfr@4?verZ3}3d^_|+3O{wv(q$FsfBA#-$B-}bnkO7$JcwNg<6*QOh?oeb~YzTPbxBrQI}=or@( z39k(Au9ka3r!2YlWG!qV^x~HU&$V9iO|3aN;d_P$|XT9r;ihtlTQVujlzhJ z%U#uyzr`R`rm#k047LxL_D^6}dKPfNBV~d*rL~bMTlIH}zz+PTa%B7GHyoGUR4phU zx&XlGit1!i>%a8ixL@8@5|yp1{8Z4P77K2mx1z9x&WnXspv0(lEKbP>|?8%z~V z+F!yk$L1Lan=&yt226!$YPb<51yYW4&`m}a6K-ga^xWfn5G)xc))oy<;TwOE$*B^`fxSHCu% zJkUP^q--j7)nzR6Dg_a2!2`~Ow3>Nr9d=e#JU*SUgV<=%hVS)awr5x+)e_Q|Aj_>k zGD+BhxzeH&kWPn_P+b?dWN|ElL^!K zLfPX)}u&)3q|wR z-YDQ3<<>b))w{DP^v9j1+Zz9htY9aaiDotb1b}F-pipL&aNb6Wg>=*!N+FA4S#f?q z!jmbbQc1`BHJ+KAtxNCa5&261e+BJ?Bb!hAC z+cp0UMN{TnEy-TdxCgU~frZ3$7^8>JWCu+9JAg(Sw4$O-v~BSq&YLx~NOS?E852=> z=-pys_vPD7##x^JZg!=P#Acn zmYD7mjHx0>^dKtQoym!X5(oBST4>H}sRZ21i^_nvK0DG{qsz?24=fHHW6*%QnHXL>3QC3x zE;tRXlaSRUKNHjmO{L{%sS^(jPTH(c{6%lQ3dI$fBU@s~bLWH3%Ov$l#eEd5157P= zo~b^B9K<9Ff2Nh72(bmO#p}?utFYlVoAQ#5MCeS(7Oke*n2U`m>GZWnwApTuIN41{ zn-lqbxuNZxp!9$f@K&3W9Coswx&@E@P3U}98r+8CV_E!(0me1gpo#J{O&m&cdsoHU z?HH27#GCCBQC8)KYckUItuVNl{}`+PcFCa->5riy7P*Py*0O_BOM+~I>8JA7%Qf?) zBN5V>gihev)#=v84a|SsALQ__`=gE-0NqGFh2hH97v~;nkKOFq2x;pO(@KR;v(PPcr>T6#vd42=Z>n{ew;=mrE7|4B75@~Ln`yFg&?6E zIv`Wwmr1bGlmsr5!B%CQH;Pxx_Abh*@SPH<3KzNaMh_=U@64eJ#ZB)lBM9L8LBm=2 zO%tgy;Y&;~P7HJsRxCy6&P%b%;t(n;@!c)SS9sz(i*~aVv&oM))?R^D(?Q)<+ugPt z5(@6?LvkT~Ohm(ENG8Nr4K~z!-N6TLkwF`Fr5$*pCP@3H9UOZ6>J|ayZrQ#dg4ns6 zoax-w|Mv2x(}6q69oNjBV|}aK88}2@-F>3m88{T?{Qm^G<2edD66lcJ>C7MG&+V(_ zkaGLQkC*Agg6QtzXYiyDXV!s(5)8@}HGb&E2N%)y1?}3NFv)x?VO^wRM~Q z-PLxxKKlIg>+9>;qM6Swo8@9w%xAmzpa17o(cXVB-+YeVw4YbYIlcOGd(o8sy#MI_ zgV}m<@!Nwark>|GLYVd-gaocM2uLER((FP1H`!k3@Y#^-Ta!_eO(iM4sB5`Gt}aCc zG@O&AF3~X4VM4Eo8UpBQoD)f7;4(D~;bA8jP?f#7igrtIK%A_F)QqjKQl}MQaUD3f zX!uEJhziW1iaMS|fwwcn3Y?>r20O`Jk=u-m+!Ai`1JgtR+PkSr{24~XF%;&D+ zc|^i2>vlDPy~tV1q#t+=5dL0sPx1e>^09~+IRIS5+!(a5*o_cetQMJBdU7L(_D5UutQ_es;+CHOTOzcmLEH1d)%fFuGymPouM#AJPmTT7{kC9fK?Z&EX zgdeK5+WI^#vpGCfHlmxT=TkXs@r`gDNmfq^zCnrTn30`8LTCl?;+TTdtZ@?MHN1mk zBKtv|fwprS)e5G|9(+>o0b@3dm`+PMA-ksVD1tpPudp193D}SDjx6R$oc%*tSJtwHx%?HCBqVmr94 zl=|^gw^6!--01z~b!Z9>jUK=YElCf9cYBz1eZNJ?$uXa9Yd+lDXm(rDDy8OtcR9H` z;BLwaZ_j;PNkULHXulz zPq))voIc~5xid;{qaocXGy_@=-bCiai~`rNr}d)m02?1R;ADpW8q?5q{_VFu^wB=D zx^Elx483%^4rd&6J2yUP*LC{RHRpPkT+e3SHi==?Sy**z`lN(gXO-2EPqgSdFCNlU z55JW)?z>ua-Em@{GR=j!ko$AHQ%3y6=Ifh#-PPtI!s?%q)cYRVmBF~I6ML)L9DtiL z>syAyiAp93Z!sMADB$_sb;qA#KTf>4H}STf&ueuC5~90Q%j758f1c`3HHdf#6tzW4 zOf}MZOt(>jSxhbm(+j+S?SB~2{Fzk}6t!Z{gX6S?uHKRC{@c=X2QqNkuO0pX$&ox@ z%Ez93-rG`hf7N?ac56y51pz_}Q)%QrIexyPhAMV|@AMP+Zo`$`XYddA{Jno;Khqt~zyK999n=;P|A~QzzMCFfm zoGYHH%Q9^852SeM@t$={mHP)_H6^KP)aYlBOrOCSVfnkRGhD$b|BQb88-CU^z;(j! zk(F;E`6g<|UU;7f%B1dJ-rHC0FWTOZ_P-#zb;VA)Kd}wIt4-;UWg-?1d5mqg(Svb! zh1@gRq_dQ1+5Bo;7u8lOsr$N}TZ*YuHLvPoihoQAP*2#CDe4|;v9Ito|BFBN0e=ND zbHaptkGpBtPOqrwqE6OSs^YR5+id(b3$~xlhjMzch_Lc>8pKK5ii=$rFZu+9AjHpG zG<+=u(6QoRhiVq}nrXq7xL=mcd#m|t(k2p-V&WGa5#)Krd2S~h=)x<`OQuEVvJ)F( zw-m>)fVVXA0B*FHpRIPn$8!E*G-f{H@XvMlx70Z#O=!Y#b$XNdbwyprYuSv__sUmF zI3nYAw8BzkR62BpI_~YfAOh50U3&hSXmXYxwArV-4GY1SodfW<`~ECl-dhk2;YMH*QSICZwfnSie?3h*OZ< z>5(inZP=e6ato{3rNu=fUlA%mnN*OCEkou9x;@Me6n8EfPJF7lUaxdB2sPq%L5RTk;zJQ8cExLL{ zKKoyfVh)r`h=IW4w45|qPE3k)rY1}Z@~Yf$y}y-lfk%Q>C-4cLwX3DzD|zm#ODa4O z=g)G2d^T;;jR}Xa_yl*SgT#$2{45!n-VykL341Aa8dTq1wb1>~$*DCL>57TUdl zMSj!lI@nWW*oFyWg0)4X1$HN_qw%gGX9~e7=+dG!rsYaJysOo&rnfPjj8qT1Y??)A zalVUNK=*9L$FVm(+Uu%qckI4nZd}fq)_I?4LGpL9;ples+`p~Rh9ov6akP_&JbLG9 z+o#*z7iW)G3fJIlwYIA&8gz&B){ak;Yv!{Rp#}Mg&&DFGt-2iUDcJH|$19FnQQ-JQ#r zykre(HlW1RvxP`4zVFa67CJ}JNLzb{Bz!~l^dM6yJtt4M!r?6#BmSY~-gOQ~yaA^& zC0h29a=h558Y>}&rfAx0lp2KRaC?)WT?;n5AOS^LMs1o6g^Qt5C#!%@I=kh-bQiV} zCvHxJ(v$x*MR$9Y-eta+n`rq)EszQb&VvP^F`{~Yu0l_!-Td=K`Qh`L!Xl&azj5E- z3TlxOuU$Rr%y`t$FGwAXKi~my6$H4u*%WD`&EK7BSrM@A+oJm&$5SCwgO2ZAeO-!M z*Pq{9lBHTDrjM+*y1=amPx#22VT;8~x52QvB>{v|8FHnA!ZaLf-qJiKCss^JPP;#1 zHB7SAsS`>;852)I2@3(_Yus^L265!vRxDaH$Vc0FD~+jf(Ou&corUWua(*Is3jZ4% z2wA)T&QFB)GAXR3buv9uRl%I|%Vp0)Ayc^t|BYcQaM>U;k6u`l*{0WxU-iy7;v2h% zI&qSur#VjYUv`{(=dX9T(?vc4b6nV7N@Zw&v(if&5Q}_puR*V%)(BL^Aqpn@Kr}P` zr9JO!1qs_gB1-lNk0INSx=02A%#K8Ry#Y?Tvk=}Hbzpl9EZIcuC@sJor{3g!XGpM^ z7!zZ$;`pm{!z7!jvr_t#WLG&)T4x~2M(&bIw#FyRz%z7*aPKPoLQ{QvL1hV(oom^@ z*r*lI)(6RSs}t)`_#={|ox1&coiBTiLE=eoOI7>r{+sk9K?3YdCi^H@U?<1VQ`OfT zj@_N$3JXMI;wFWH=w^;AmSJo5uY~^5BqOrdGTG}q&8ZRL{hys)9w!W4I6_(nrr9XS z$SOFjiqQKe9Logt&QgU;qn=UtLsc)3W+6POIivGBwl6sY%UH}DqgB&X?&(B=J?1mi znj6swn9S}Lhih2$$Iv)l4Opw!=v?=0Jl)Crevo4~Y==;J-6~8PlH95-``joiY)N(M z5}l6UIO`%KWm3$?LJjS;b+`?;W8_s-@ry=vRV^$id=#F#p7PBTqoh%I)3>YQBUO8f z1V!>OF^={>uA6Bw=Yn5*8?0)3tlN`Ok*;0s)xq(EN`^miFc1fveMf9K{pJVHev1?yE2!Qzl3YxlC#0QZF zLBS+ctS%%+7s5oRm-}Qr}i>*Zn;iX42X77BL=WywSVQpNsw)D|0|B_(2Q7HI*sa#(qO-Bxz9W%J@x&DsRlN?{ zr2ODKi4N|6$CAn-B>jJkkH~D6fLrRdOQ#U-qcEPFlqHILrkP;8N43n@U=QBYF|i0V zPgC4L*H`KQ`Cfuz{D^Fq?$&1~Fa0R)g`;)F+gWcKyfOOTosz$|1?lT$FnQO#w$_)Q z*xL4H+HEo1QmX0fs)P)lKX=rrM1xVu;wAfI0XFPoCSt?3Gq?cCcl?GCBG7rUkR z?RpkzmQ^UY3He#?R_EdUBdZY0Si142Wt5-RTr)sQCz6b-8U*Pd%LtMg3} z><#jE5I%_jhm0Y3gqor#IZ#u^La; zHYGr|WNuO5)N<$n7n*-)XKl0F%&FMdWjU+MExwTd*~~vD0r+{h2mj$iRbKyQ*Vp^=y!Ln(q??t8 z{l015GtmK-!JtqB*vQ*pj=%1{G8+UrVoORrn>MK=l<;P1TieiStmuypoRyiURv%jw zVcH7u570c2&mcyMDLXy9kn~@AeBA`m9*&IsdWtHAO=_kD! z4^lcLT+hst(((iabDrw2(Me_OP*~D%oIZ-L4P%#HWUgm<{)c7+o*T0Dn& zYEuBecgEFL)?nrrUNKyqh^e)7v$kBjmTD7*Ib~0y0JBJ>Q8LC&c3FW(fZD$*KNe&n zul(dGajsO2{?~v0^V@&@=YIj;uibRv!(YmWi;Uu@oAYXmeJsKkoZ;s_mQdo6}KMnbBch1L4@k^X{;Wh%-sAiS>eTTZgnIunmKSG>mR5 zZwEg5r9Mb_`I! zLC&mA2!(`mHxR*=`)3G7x{*~(eMw&w(%ItR`Fn8(mip1 z`fD*dzb%96qb0Km0!Fpubk_L&^Kt%nzxi!G!e3Kre7er(RD3EtYy0YFzl=97ic19@ zsk<0x;MS!uJ;9BBV0(Ab<(2rQC=yS6Q(L|%b>^SM)>vf-x_FqeZE2L@#2|i2lcpuI z?n9aRwbcM#?%H4_p{DWDPcl|*V9gvPtu^Gm`<}6lTjNuAO{%EZ1qb*3?+>O!|@u zY~Z#IQM(7;FE$~)S`WX4?z(*;&Cc|{!fLUuiwa6AAG~m~8miJQCwdZLkc#A775^ms zS3%!UL9YFf>|Nxmnja;d5n*@Njzk&0Z%$zCpjX_*-W*XdakredH&PK3tcwRG?Rz|* z>+@DHpwm?=PU;@Z`rrikhL+}s{b2u!f!pN=@0VSE*qYZXRr?ht$UKSNZib)#KZ{i} zu#LMDLdEQ+MOzj1^txJX5ANU-DtvcL&jtl{!O;xX?uHekSl5KxdSBiIlXk%_GVo!K zUKHU_TyqlRQGt(+gDP^lYj&-Cin27FQt5nM9I<9-EyhV%0$-O z_KRlgN~HI)gg8!oXbRr&6SoY!(4k`GoHyG&)~&_yzNU;0?m@C{N4px|4e5HMCY%Se z{QX_7dVX;4nGfd?9*DvyIsG8+*nhmkx*tOlb;JD}7=)-Z(+5*naffa}#-fNc5R%bE zV5CMWOH{phQcKm^i~iLEE%!-~`r=q1Cbl&QvVTq*PIGZl%~38$_&fBZox z9YsyT!609S51)}v84M>zGI?K3;=@@K3fxY2)S9Y)7H#>H)CL`I&xC!e%_e#1-JoB$ zGr^YqTXg1`Hv37Pp&u-Maz~1MB>fnprAb=AC5xFw``$eT84_;ZpVEo2sUFjiPqh^& z?^5eF9)51`tJx#snl09}>mT)$rRDmn2sTL2zJFp*j;#f9ZiH>lw4;5!*<4F|%H4Fk z7Njuw($`l%v2T0#%xP?R;O!uLqNrONMTkFUth?yaZKdb)bCz51zhS>V?t zG8N$xrYhsfv?hL)yUt`7-nN8;@uzkywvaBe>&TrCU)x*|gnhgHi;f_*5-#6uv|izI zpsMl2bSbKOn4fOPUBz}~EBr9rp*DWke7Ke7uWxn+=6U9|J6 z`m}A}ed}yE9}+R9nH=F&W-}m}XaZg;R%$5|DOd!K^p{&==j;-0*>IwXMWoqXLN~fl ze#-JA-@miI+Y1=Gzg(sjigJBtg6-You)E&9A{S=QgGnd2T$R)FO9A3iEh92b|83$`No86}5BRO_S4$3&2b}w2W(a^nJwXaG|_)EBuex z0>{WV!E%X@_JWC?R*$0!`@Hf}*>Tc@m7fQGAWxQfoM-crnwT$mDqYs>iV)(U>WOU|!DS0v+Y<Cc;wMxM zus!0|5NXT}N#-1^xR2QUKTr-Hj=*@f*Koc2c8EXuZ@(SVc`_#k{i+Ry230t3ReMgJ z&5|S?IfJ&*haB(QY8!;XU1usj-I=6h^iEj&3_^jRh3!%Q)X_$%8h`L9qovO;09Zr! z_G|@xN|ITA+Gcp{8sX|(EuR=4`v*Mmy12oak;UU$D6zUy>kAfN2#f7B+|fi|2O)3suai@mbOS3p2Tlc?#hUceREY^ zY!f#9ph^`>LnJCK$n?6bF0Zy7<*J>qa}LxlM!vh_Y`C92xW8v1e)AI+Ld3?V(yW;S zD?@uy7X)ws#lQqDFnS3@j0|{uW^oJesYhWcdpKn!c$nh#6u%B_az}m>FLoY8UwL`^ z;`H&$Cnvwj3A5I!3hJq2D3=L+pO>8y-u*}m=RN&*G|v~XLY=T534hsy+4K1pL^Ud{ zG1rdwy9a;T8l}r)(EOjcM(Oeh=iJ@b=H|MG4; zq49<8D>Lu`a{kWgHJKIDxMYr3InN4lQ z$9of_>C^g%#9g&-n;j)2cz0at9aKjfn}Qt%%|SQn9lOkr?(J^kX%(~dmafh`Id`Y0 z`@F4p>}-5|Z-@1fPn_Q&=WCl7UttGdsxNYH2l;0P@~p%BRtvSRNYryH(I)H;BlX>K zubbU=sqx6vJ!=${0<{gTzZVZ&_1HWd|wP*+8wVo`D)Bj`sA zKHQ2=l^{s)B*zfeSlyZGu^@}e(M3zG1x!o4?`#s7kHJ=D62YL3@a0$cUH?8Qb?nu$ zq$|F*N>N=%{e!1pK7N{yULAjTGNuJ&jTX*u6%}6->Z1j)1NXg1`FHdiT+%@W7bO_r zkAMB=KffxdLhZkBYBv+sWo#^ZJP4Va(~A<$lV9F{JXYuia$3w{J;)?}OPUcUBb_xw z198^m-9#ba2lo%Zdysp*o1{b{ecP;;)FD7H=w4ifttzFI z=JJMe5s79U&q}cc?NOVNe@fC=3i}P&BXB%!4B`R!7FNMnP`B7XJsgY|Sw2m-^$u zvUc?SyVVC0-yHqOR{BANVhi4pdonGeK)LEx_cXLB%SRk6R4Ps|36cfiW>sNzwXN+$ zh#VuBXqAG_BrG+<9?#V|!SDvISio)|BQBC|iX%m;x2odg@@X-L3Six~$a4LBH}5W$Q36 z4|Zw{-CVHP9)lqJmaSDTZr@F|kv`h?>9}_HZXw-0-_WON;o*&4p6O2FgzhD4d>o-F zr=C?%cT|2+RLdRZnTXLUg|awPP^-EKgdX$6c?i8tmdwFj_mxpRfOLqXrwoZ8U^BQ; zHnqBG)zf%GJ|6cu742+RB~i_^nNmmO#a8)eCV43(wTL2Sx8WK9l*udjbMN|uNG1u3 z0EoIiQO`Z7`n3iI!yoL2!UyGcPDXx{uXYy~%Tks}`q)w}aO+B%UR#*g$|a)T<5m_r zNNg$D-~Lp0pORoF&mAr~I-*;jvIs}41C7UN6sij({R`e!z65E7%<4pvIsA8;)Q)Ba zDH?1zjA-*{4(coiv=J%%QGx+jmh}Z)fMHu*EUWp})&96e z^SM=ld9b%5*)3{Ick#nN=}2uNNp>t=ZwA>%7xF-iZ39#D9?A76vPo{JxVlK{;yDH(H*>PJ7+lPGn_^#(BYf4 z++9~;R&X-6VqM7_SVyz+rcdN^?ah-R2~k1AH%<%j=Vt1zQa5i z)L4ep0AhxbxBGW`Mn4AFEWW|-h4=x`P0}AGSz1I#o}Ow$l4^kZV6n{##ABw(mswQw z63RYgjjc*OEv6Lss;ts&zTD)*NR2V>5-o)FXDTy!TQQ`4+ff8z*aksKdBNxSJ0=;0 zY>@qW%a*@&&psONKz3-C;uj3VaZ)bQnTNSzmWBz&>?2o{1Oqc1SE{O&7CT1B#P9{4yUAZz!H-oMb4ze1I3JCsXgCO>D{g&MjP4j z_Fbf;%CUPKG7!G_&c}*xcMWkMG45x6!cF*82GN7aG5*)H5|$qcSyw@=P9|I~05b+g zbjh6uDNET}B$SLOC{?O0xHBi;c_~V-PvDQB3+-mY;2PGo$LV=R9-yLSW91sfOk$a7 z)o7S^jzykZdf&L)dEFueqMq{-Zz*2CR!0Ue2IdY0JBTWFw-(|IKbevW3HD`n%ZZ3B zwrQW`xA{ddCbucOBYV4)jY;aG?oc2pzr;ot2jzp={jd@%!iuc9P*742C7iSK8*y%~ z2zN9z5q8)P&PK2+g$s*kf)|s@HED=D{Lh@7_TBRg6bIIx#?J*kKa@JYzx&ODiDq^a z65}Rirrb1iZwVWU?wcqe^oh{T`=AO&6Zr$z2-C`vjZ3zc16t z>7Ij5v5H+Cogi{tO-hlMcA?f=+~J8&${%EEM|IOan527D?Tj zirx)2MNM;-x>%&9r(<_xq6ieo+6GY^6wngKW5>RO|JV`U*YFGYP4-Eg=R21?Syce3 z+4V2C!#g6XD(`vn%bJPqp@;47(Zf z>&x1x?P%N?%UrNi)!ZJDh{(2{;$v zyFR5s|BhzVtKL?~cC%?%{l9C*PMmTezVJ$8^%)MlPFbwdIE}S?oNTFSWJ_L@XxfVi zR*@sWOtF#`c8h!oxCfIvP@^9aLcFw0N!nm^j22$21PPBBL0rYL@P$xR6-&0Aa9w#q zqJUynQB(>{>%zBDtP0$&rkD#zOXNe0NFm_Bx`xC$m^{x17tFq0Eb@1=YR97Dft+@&Zzn;h{U*s7qr?PA_M@_ZrxA4)cED&A0kQVr$gK95;r@)yl{K zbTRp*Voz&Z)lZAV*|sM=D)EY+ML_l2ZCLBD3Kz>8tY(kz9zhp z5xbWA6#MH&VA~nIeJB#$Dr-TQM|xo!6DVpZFjTiFZZ2nqAeh`FQ%ls zY5$i0L_UM1(S+#GtE=bD`}foy*fIueG^ahjb=`g?})yF*;d0Etn&e6Y&azIL$rMWxZ;I|unvdA zPVZUzLQ!(|h~%ckf->DJ-DYgaFkZt8{e3=|@8$FTVLspp+JQdF=X*o{*FH6=r=;c! zuO)qPFb|*ckN)#chXz~Dp4hTh$=w0@n{TZAIE`U()V*EC#-R^*sSZLj+crH&;@nF8 zzB>u8^8HEHSNiv1B){Z$q0sMh`rilk_WSRX*TRb|HA7*;))RF3M-?KC3Ga?T4&{#W zrtbTkZbyUjKm2%f{$u`!p@a_gy_i!!_F#|6yZ?RvxB11^ue5wxKKjp4%#gl%cY4U60%ste>!tymT55um=ba zk?6j|gkD#-Y8TS`_LiE=A^h+vJ!>$zs<)}dGP(gyhZf14PHJh+yn<>H&)fyOMsZ_%#B#i#!fhuR2S&vz8`~KzYpT@# z&8A(N$u-gvj=6V|6Kl27EG*~x{T*pIba@km@+J%IaOqO&gu2V? z>69W16hr5*e`Gc5SZbbGS)lz=Rx;`&9C8~LXAA-r0_-Aac;d3>Psf+lI)0D4k?L4Hw+H*_D?LCqEji#~De*U-3vcPJRiw+CZ*~gB z8@UGlhshHir>tdpFIaqNViUQz2_tcuvwR!($`pSGZs0+qf%Fl5<_eLBqK*tmi1r9W z{&b$S*XPxdktB^fHm}XJzP;IRSoK16^6K$llzAv&@1gG+(R@tLu#m0-?u7DlR{BFJ?LOWjyV8;T(Yc ziMHLiSgi`Esq|Y={g8<*R7^N>xEL<{QUKkPk>o20 z6C8d1{CPs4gOg@jO|Gj|9WGZl#dtF*rjviZ{r11zjKkA!-(GxM-mE9r>zf7R?@-VK zr!WzOHP1g^li56J!Y?A^)4du=@L^{d@{A-I!D~ZMC_8^ZdPIVGB-HIVw79bbyR=lTX2+?Okcg!kVGPTvHo;G;iZGH zv07%!l)?)UJOVxhM(5>dSujb{(&gM$UXp14yikIH3&-D`jFp6Wi{?ZqAR0$ z1Fkb(Kn5B!c+BU!iID-y%m?4*1F2+Cez{%e`}zLCaG3tFH+eFD!XjwEX#mSBHG@!! zI&?Qh)ud;4LVFVy|FeDP`v?Wip3qisz+vI%{e$$K`4eD_;mCFtmqs{fec(OdP+%u= zK1&4B;H0zrjvQ2Sry}KWr3!V%!i?_*q|Qs%$NL~gOCa2n=g;Kz zeNa{_CX(mKs4zc-&`c(4?ox{(Vh=}45TCjNW|I~r53~BLuHcnpokd-UI*~kGILv~0 z%G8a)=eC>oz45(sF4y=4u5nvFed<4bntUpkRB3PK*G(?8Mu_q9#O0LXBjV4F({Nyz zPrH@v79}t3AQ}~$^RU%aJmZ20X-R30V(>GlvFP};^hAu54MArE0@=KtM%?3oksuWV1@0MSWQ>izT#oJ1L@M30+?yn^n`wk)0ypz*(^g z!f2(~pPeqeYViVwT@xzS_6;yZ`%j+i4>L2|F!!tRW{?8JrqfWx?>3?6{U>|-((Kl> zP}mjPOmo7QOVtmQJ(n`M;M-G0gQD$138V=gx29P+kSorE>CTUCn5KPu4^73z?GiX; zbeCR3{}1)@)$)#4VJ*4Hvy#`rEZP?us67}sI-D~y6BR3uJBM7jI&1*Gmu(s(KsC(z z>Z?Qy>|ie_qMcn$f+3uD7Cs&N@e7(iXf^;>=Ov2GG?ZRum(`M})xz<%s^|htf^frd zxNFvJHGWq|IsE^ipRE<8L?Xp9veA9k@GL71>^3TjH0-=R_E-R$W|TRaZFi51UNN+Q zHaP^U9=n@{31;M0oM|GF4gc4Xb5iibQ~ri77^OiYu5`41O~0U{6kd+Ns^PYax&fAh2=);;bTR~;uOJg z1Kj(gG*_PU~`*WBqSBS!PN@pm6?TxlX$+$FXU5fd3 zBnY!eM=q&|LjLGBD&=w@Ta(DG5GcS84zujBv^)P0RL~nT6b3w`Opni{2AVD#-GL45P}+IS;IzJ}W)N#O z4K&+0WNiOgv%C#oRQ1e3Gt#Zur72Dqhs~laZzYWLo_>$=)Atdhn>e*K5r-5ks%-PuWjgjcSaiDlOkD8u$HPO*OTkBYpc@5XJ z)rQ~z=rHuFhir3$VnM$TwcmFfI^iz$n#Z?own8W=aJaJ; z^V0g=+Zpa>kkrc!t?b@~6@I>NUE!rI6@(}6<2nuHlwZAk2_+%_m1)p3;>1*-Yh9r8bsXYy{1&;~{E!x9>2F?8HJ4)+Plx{; zwx9gla@1LskQgHkF%qY|f1jEf{(3fU$|;y42K>Oxa087`WmjZS6;`$@!yWGiOj``F}ggxj*@{T>A4!s`e2) z%=$Mpr&V!T|0=$lg5$t&dqR+MK>r5c2{&*L7j;FUs9aj zKPbzcL8j(wF~n2(+7%8LE*HgZBfkIMv1Y4-Cj9udRxQykE-oQBG>Y?*s5~4%Y{F+9oY+GPtP7w=V)((y|eOV)cLrLQ~*K)&| z+%Zz{FpV^kS8;6_BWRPe9Jyq%IaA9RWkRw>#scQ;OjRUw5Jrg<5E*0|c2XKh<&H}* zMpZ{K=W_H$XcdlJoSMjw`VtBuP#x2=+_$<;M1IB9n2-#{ICTVRs4}8J!??<7C}jjB zk*HXGTf7uJ%?+;{eKz*pnRkZDagEBLMI8RsrgYNRYKtM0q`l#)yf`Fh2wV}Nodjrd zRT{Nt7;5%2g{$4p>%#+%Tt1t7RfCwl-gl_qdsgq?Tm5c+Wq*#ls}Bhr%KRmEKU$2^ zwp-UWfG9@QlXqJ-yQ3KBY2Hl3spmY~yrG)A=CHG1cvmqnurimcF35Z1 zaVT7s>+ww(;V&J^2OEbm$uwtdj{Q_-Uowv>sH6*HCMy{-n_-;_hX%B6(B`1xH#Z~AgUI#6?tXU zGq_puelV+2g^PI@V>o(}rP!8ns>FFkHMW=l!AT3D5hK8Kv|jxqyay%8IlCsllck*u zzmbGyU-GXe0puiBLJemu|PjO~NPz&4vPf{5Tqh z2i>E|QGe^AErQ4~xTeFrJqWT9!8>zHmgpH`n+O==aLYM6O2tkLJ8a0>v1!IOX8LmH zhqZE&6m#{@>-WDxPUri{PlDO9S&jwQC4Y2tr~iJ`e+7z)LE|SkOm%V@ zkux106a-)4Sd^7dtCYIv!RpisE-}hV36E&CFrh866EWIk$tBv!$dDnJapiNJ0cB6d zn*-iL!6QD9^$25A0~-z;q)i+ieFrL1))L%t-I4;Ggq4ltvbJJCyG}#0Xgwff%TkBY zqTA%pzHf8?ZN>&;yKxrz12=-fYN%|@q9V~5A-e~}ttj{>Qu9uwdYi7yn)KHkAEsdc zN0`PA`Wu$*R;>H2q`eAszD0q~S_-tA9_Y`9T_seNcGYs*I_HVR`Rl$Ta)#JW1gFW- z!^Q{>9C4V2eb>jhR(NT^bzSg^mWKFSCae*xcKWnF2|Hny6~N(<5f^!D%g|_)L6^Syjx(P)CZVhdG!hp|uQhf#_ z6qbEYNVJygIcKwx(o0ngx4cP>qfKRUaLdbV`I^^tZ(CL+@RZSC6cEppjtxOB3_OdX zmWOZjhA#qm#tOGHcCtMmFv*P7wHBlaSGlE{5awXjFpm{`tD_%EjRPdJgo~kS)cA5! zFo`Yc4p$WIwN93TER$xWfpwZ01(N~5#}tluR)fC$_%=U;oxXe1aPrC2t_hz?hS%CaehPxFrS*1G{cwSoIE~^nG{L|VrJM1cXVW4 zDK0KWC2F#z6unu-jcZ^>+YQwygJZ97IW{%zvWy^|u(W6F9;-E*_A=E@0WaB>A$C&4 zqq0w0jLadFS3#?~DpoVxy`-&)7a)_=EK(l3itq#V-4%W_Z{0$ZyD)Z zR8Dsg!b76JyS=V~rQKUj=fzG@sl%eT5cdjtlzh+8@#Q!iFb&uST4h-3>GUpdy(?|` zyKcX(IOkw{N&dxdG4mDK=Egv4N!N)l!@t!n1GDH~K?3K_M)iMUMeh)YJ0f$$8@?{K zK*eqonfC_lJl|UDec6g>b`JvU#}sx(?4!R1VMgjd{n%wsL^R~$j(K+QK`tL~M6d?w ztJ-0>BoX(1RyD$@fS1jOvvlT9rAxM$e?*unIz(SmfQ0_L9Dv9GQgH|GwSN`zB^{?}zY6S5+Qh8VX=G5hCDBl*MpI&KlgvS*ycQO1Ln<^yU+#{$4O zrd|ppPtTZ=4%uSGlTcwB%Nsf%DOhsBpKo4SHu-UwS?ws z6^08`4a0R%tJzy+mW{MPE{Keps@VBrG;@)uUew<;->f*MlTpPd9cFvdV8-mAsR<~t zSYMM3Q@PCPx=<-7-0PB!4IHVdpC}ZnWq4~DSVM(TQz(Uu0;diqExOdzrUYz-sE57= zs&|&UD6MU>rsu^Xj7bYw%e;_bm=PBs?jXC<#7fA#cyo)C-Tn&LKfsopnT!M(aCAir zMpd)9)IuxAuG3eV*?6oKcH8A-7X~1zro`0qOEXd`qF>m|Aj85w2qh6{qI1PHgC0vT zR#+&LM9X!fQ_b7+XOr6`WDZHgl)&B68H(5;U>{ZO37uMS#-(+`MY%0$t_Ku_*Ib9sa^?W=_j}6A&F#vhBwjhM63TL|h5UGzY z%c}};Bbmn~M$T6SvW)V!4pMONyJESaP>Q|K%Kn=QQgdNJhUn%UZOPmAdpS+pSge4q~@CMPYsX{-1 zf=%;cCzdf+Sk`3Bwev)sj?2L%tH(ZCJbkGDvXViiJmW%`NI3HCF2Rgu^sXBDToQ0@ zN0x9`=y|r{oJ*Qe9aR*yUU6nT!fp8kSrwI$KLnw6$q*Z&8Q2neV#in#X+P*r=U(`K zPlqzk-RX;7qd12;C%q9) z5uicnA_$+qsh1$tp{G6Qt#VDXz)K}=L9A>;&CQsJUJjgU#WtQf0axD;r>{46O&4VW zXkbCUzNISP}ZVmN+V2fR>X1B^J*?q|OS zeUCAuv(uB46GQKo6SP1|Qn^mDAr*o-Y!}!gk$JV0gq0wSN|(P9RK6fSIYTQ()1(x0 zI+qyVtGZ^swX8jR3ycLnC!;OetC`Ov`xZ346uhviDJOKcfyKSZn)T+kBJ8_q)rkJc z%A+LgND*^{q0W)g4(`F2(fPSx(`zQ;nA=avBWLx71AoS2!AKOLhMVXF_*|HpOKnDi z=`b!hUXRxZfZWXIBbl1+a`THSEZOWKi)y_Z%)`0YHbFu+7PsFWf|Aa?gqc?oew0 zXIA(~YSCmxvfJ}=C9pnk4df0&h) z8LN@jz}?6!Z^R{yGRL4@R-s~G1eXraqgZrDr7=ietQICx5)_*T;WHdr-kq$7?c>}4 ztIgtW90nBrKn_%Aq|+d1!V=NAW65ue@GV)}DG=HvAUqN@t$Nxk+22&0(j@@}ZF*f2 zsu+hAHP>Mz4heV?5{N~XI2O*OU2LYVSBJSZo5OEmH9)iFqGU)aDMWXZ(9w{wO(I!| zbA~$2i_5g9ShxZB%Eo4KCfGk5DBM`co8|6n+?XvRQYS4wFN~R}t$jGqxKtr-UI5|s zn$7c~J_})oV~-UPK~XYZxUt->>l+QfW2(R#zR9smikYlFH6GIrx?AYrs_a`S^Ho{? z*#;w-Pq$Pkf07#oj}|0V##R!w;gAqwZyDIxBvFx!SMsvOH!MiYFBnxsJ`#MG-BHM(N&%Ih>(yd5iQu%7ws4)v zmkwBeZ;~Ht)dbyI79f-qq-x=Qg0X@iIf<2nZ?PiR)Shs=S$`{e(t~p&UOPv5osl{` zL=pVX$Bn!7`gA)I@f3PUt=yl0ovGpYB?8h4KORhMGKCx4*R78(K)Foy0S5_xN~upL z`G>lxzBm=l6%f`wF{6Bum!D1YAM0ifnkpTEbsYrkcvUViR592|w(Ae)ug5%QnK99H zs(BZVje11^xl&PnQBJRyeEl575zz%yEh9e^Q!1;XAOIvZn7!+&ki(P|3bJWbY`jG5 z)hu+1uANKyQpB`k6VO_sB(GL$I8K#zb&Uoy?m7()AT5NJFAK_i!6#tkeI-}3Mz|Ey zwLnvMdV6`tAX8+(&Dym``y}He*!V*h(J|64FH`Iqh+>~`cuh=voYmA?u1Fnh{TAM} zs_{JTp<^DvNaV@Sf$ackr+UJ2SEl#0zK9>@Js*C$cr$(pW=IWOTQIfuU!2f;C&IXiJ)^q*6B!}h*MICL{rL=_%+U`D6@G5oLQS$GG$$qzgd0pOGpg}3LxT{%O9BeXUA?YxL^L=kGrrD>zb<+?-3ZtTz@(M1 zJTtTrl`|B|=h)DS(Hzs65ly6s z%O9j^bTTS-p&0tZOp8A%Y*M7bl%!Lz(1&M>asQTVAa^~J;K;Q=-!+w{LxhqWiCJ~8 zWBl1#P>7D%_KX@pTf5=>dXG*2F!Rx(iLl8Btbv;!HgAiu{F}kyW<4LjOegPe{_*eH zb7t)nt=7QZdHQ>Y1#gFff-kwknG!+g3K)7;HPjvjVNCYI;(_cZ^B^E*) zh@G_}Ilem1FnNgwRYz^-eQx)$B}dy=C|P#a{dLOF!LA0~f7ZQjsoPFVSFy|R&^-zV zTYm^*#?*5TuO_6;*QJz5ZZ7m!q8@e^OR|#?pn_UuKpqjsQH!Eg?VN3LCB;IpZ7q=? z?!t4sDi!xI-6X|yTCeor>p3qc)+?Uarlcc4HzEgDa2x&ji5(*Cr#Y;pv+(*Zg+8!@ zY;|;ge0thBy_KXUe#?i3^@qrk{_+3(Z%ferWbq4~@xG#b#-%zFWXjaIlra~m?QVyg zA&`pL!y-Tj&X+o5S=vPK>P%9Cs?~IJL;i}XVL`%%;#jN|n?fD1xL}g0&T>g9`UOV| zfDW0aoW%Sl64(<<_68;zG*n%qySMh&ZCeQ}+j`DLiu;`+W82Pt`c>_@pO?JrKd5#2 z2r#o0-6R{9>*9m0{h(pfvV1veLHN?Zj}5*h-nhD`2@dHRMUB_>ST?onF+>)%k07QA zFPEODj+lSOY}qngY>9+uOCmiufYD5~Ah-b|GD~EFnPR)Dd>UTVqv{hLUM$?nfR~!+XL8vQ4LmVzK9%DUkq0hFf`?)_s~BFOEq6`Cge65fcQ~aEt+8W0lO424<6$!T z@}vMVOI;UFLp|TxoLTQQs!Bx}{mUyxolYiHrc!Qc5oyloUimwV9eU_+?;h!Pz!M7x z5)&dHq*)IU6Dkc*{bhHUUZy>N`MleX=V?2h?{(kUOW)|W^m*FS=Lg+44$?QCcHelKzR~UN z^R&0mpLgGQp1$#2_l@t8H(qqx@xry^pt-QUyw-2_xebBD`MZ5MFedRsfR^HQgc`w`Lz3eG( ze@k)u?b7z!rS12Wwym?Bz8*Z880r{uDlr zkHaU)lhbz>@6Ufsc{b@KVsvV*3nzkH0%jW#BpgAZ4FlSMxQ!6KfzbwQq%d zIzAuo|8SCOjmPKmQ+(yD`^s7R%F}KsPg|ut?UwS?mvZrDy!X6a%*7l1&AoKi^HQs% zgZ*wv2m3#?Upnh~$(8hnF-`RG&mT|E&Q6chx&AVy*`D65s>Pz3^2BVv*z63nVOdV~%CC7|$eL&8*n$yHK3j!pxYQ zr^6<-dQo4YlShlHOnSy~3Czi&9-VptS4sNivR3Rn#04>v=F(xjXa*rWL4<6gS_=bB z=&=OxhmWwp`?G{cnjXFeIi0-Y6Kli1JO5#Pbas03jwu+Xzfeqn61#Rvu^qF`)W?Tx zpI=0mCBczxZ2b32d;WXaTar(HA66*c{?lJy)7+g~e69wb;+?a)fL-kT8aa0F8Sj_G zMp}lo^_XIFIBZUkuCUPGAa#hNtHN>IWvG-bFdPQg&pQc9D!Hgp%{HGm5&H%6g{B zrvOR7oFY?91)z<=9B%3j6H^Akeg($zf8}Uh>DMvX&NMZ#;B*=h#_%!;JhCz<87ndP zE|(Ebl|*(QU;@K1m{*z|q!751WboYsrn}y(Yhfc|0!p%%+S<4bQjJXUtpNCF-@+_s#vdM5 zKzzGzbY~0~N{OWXtCRBSXEA1(&E@syay4F1T4jFDyW}Xy)$D`7xWG4be)ORk`ltX= z_?9Ilb`ZpXqYemiA+!?ydCK~rXnSc5i+rBEqvc)CYT%F?q;{plaap<%0e>%~yo_qG za)OW7xt6JjID`^IIv$gnFuCP9)N_`CO=fVOJT~ZqF1QgBnYSB^y~klpl=KgT2Vhjc z67801c8Ok|?136t2BrVD!EzJ1zA8Q|f{wD;Xr-3F!=QAX4k?kiMWUm2?E#jNXA6tH ziHnNrUF!14!a}XEM5!HhJYtUhKD_@@r`k>j4Ys2^+STr>^{e|esr|G)S&tsXcK{v@ znN+_2Au>9Sq!DoojR8DPCXo~RLm4kBQ|@N`9)LvuOALxZ`uVH)w|ndHQ4 z&|`xBm{I5u4=3u!mzAnj?=jj@R#C(Oup&6%5Z@u^Ig@jW!#cUV;_@;GmdbQu$8^H& z<5pYRDw_Uq>DFC$-Noq^yvez(YkSMG-QQVl_7Duu3wNUMV8YGLF(!Qe%UXmq;RVTR zHI|JYJ7m#IS8MLnAY!K=0B8!*cLzN_Kxi*o4KZckx58_6JtNyUfAju*{>=b2)0!sv zB}>_BCCI7Kq}iaNV9C&@!kCS76+vp&Bw{vMa%_<6T5BUF5s_xyq5TW`PKw8*=p#~u zpq8}19zaP=0^x>v9?u(}Ce5omQXOSh7Xb}ajR*;3#UoC;;kbMB)s!SoYW)aQKEtj((_P62I&YqB&#bM? z+n!$;s4(sw81vcisx1~ia+qGXDA}q|8XNmhf`m=&8rO5Fc*;~hwZH;X`X3zxZv<_-T5Fz#hQMy$Vh@%`eZuCiJ1Gygm7CooXxIo%j1S4eVG}3d^fg4>BC0t2 z%l4pIFhNqgr4%L*1@xL(P60tn_L{Lm6iHE|ObIN6MnX}&R^>xmL#gd-5-ulK6Qwa- zlvj*)1_QR_3hLK~t>tMNx&633bgJ@W~_7CdvzSKxs!;%*iQZx;4y51Ggyy0jZNeOow?4FLjsWc!ec_v zd{vM@F+VFbRL38ft*DpF0(nluX|vVZRNt6JJ*~^tRNKRfm7l7x&3xeP5o5q&VNxB6ZrE7ZRE(^_~UN@0s zi>EHR0VwmOc!7vVOGWxZ3cB z5$nB#%Cd>vuOp>Pg(p6Ap2xh~US}DD z(NULjT#<}oc3ryh1;(=8oMY5_AvZUtr}H<4K!qu;lnBuW{`X$#T*kgGqLH?TDZ+p% zp3*Y@DtUy<^0N}6hI05KJCA@eZmDqhm(mzs8!U=+j7M=4=5e)9I{Gpy9|=I`fGZ^2 zOtfJrs%LAF#``i&2hG6O?-IWL_ihrG+~N=T)&^tV$jv(0P0^^pBw%iJ-M?2xkuxhw zT`tm~VB1gOIw24dS&?f~j*KxUKd8S^k8VQ5mJF zUXBD|0gfO74G`#9ha-#&*j!Rrm_No25a3oKy`^TLA%HsTlHrq)Au7NAKnX8|1^XKl zw?CX-xXEn{T&~FFRh_?{(pYu4geL!2H@N&VEpOKjDS;QYD0@iSG@NLlLZ_?g z!CktnYeE3tG7V9vi|W^vNG#VOksuZ!37odc*A`B$qR_bT#}j#A;$hD*0poNHix4Z& zY1z;$EWSYbC|as%sDUnAN-+>N6f>+pa5P$1axaSIa1w0bF=GSE{tPz-M&jkq=Qug#xv``Qtah#4<6Jwa+|Fi?oyydMnRZSaozOB`; z5-F5^e4L$v5sWRak=Y@%rWthxsMj~$eyL?lfxk>_0&%V;lgV)S6(TH38klOwp&i9o z>gY3bSp5b){PoS94-PSO^@(lgW$8^P#8!GwL8@idu}TwWl5|%NsVa_y{b$ zZwor%S5F5S#6;$*bv<1NYF?FqhHkG_o)_ z3nZbp*~?ut4zaLl`J8YnmY366HD$6`gGpBkf_z|myn{V< z$n}jkO{A?&Fl=007LDXMLQpuntssGc7KN$_+e<@8d4D6?xT#4x65cuxqUEM4Rx$`` zz8m)0*@nzotYK_P%p=h8+Y8<}b2m4J$|(Mc?I0d))-r!Qk+aJ6o?YZhGy_uDcwe-D z*j7liLam5pjlksC#aajg@a3jj2(a3xWra9hWrAQcL%0|;<{j$q3*V&B$hl$L(&trQ zsa0f(XiutJO_+JZk}ZakLm|W_;-Xurbo)ikPH{Vx~ucCuHS=>Ef_j zj>S=&KRP}ee>y+;_-L5Fl4Cpk+2r&%~|VS>xc`XxIdyDw!-=TaBjBwr(O27j|ih;rhA>8V%_5;VtTu+~&Yn z;bRomL}Q_UaQqSeNtt9xcB@)@#{O&jF)7A=b>-P_oq}VmjM*csaTO6bm}n)`2J~JLisOce1y&itN59$2J}6s+{K^-k-j^IQck!|8acu@#E3Y zV(~hC_xkksfNEmEMw+74YameM_e@t4fr&Z)E(`C;s5uauyM3N)wRv{*#nv-h<@*2OW< zW4_gPALB4;QC@0fho&-_15g4O>`f&=)!>O}ywix4i8z2|)^s>ZQGRJ^!!gF^fmbiY z$7?p^6!MZztMiMGpN=nR^?Z7F`u<&he)j%iOwP6~D~CQx7Eag`Oka^K1N4>3hr3%& zIxU(_WktUeoOM(9K~D*g#CHrv?6;A`*@Pa{*U_D0ZNn^S%r@5E#2fof zej$3!wmF2;5OJKK%vnMrf+LW1gU~2YWDUqVq&8yy3F9j^9L}|39nMkrNm(=U148x$ z>GMevnOM)wCcXb<*%597(RFR?tPb7s7P}T+)tFrE4L%4pS0!{Q6;@l~c2R1*D#WB0l&Zh`cU8@}8>@EL{!cCzZ% zpssheaA+5GCx3f%{Nw4nlkw5(*B?*LRq7v0CUHUK@K%A)5?@@kTGKE}C)#Cn#YGs< zuv^9l`zY@Hn>Xht7kX2Z8EuOI=}XM4Udwku;&P627~D|WM1@Tyf%_B;rZ?O;imko3 zV263UvaKDef!5jAkMF6@J^DZUMn?wzTmGG8*3U^u``al@sPrm#i|vCy}%A^9Tc}`RiS6RHB+!&XWtCyk3thduZ+M z-JTJ(t(fW(&4wW3X*llsQW{$J@oYHpioQz za$)MY3{71w(&Msk5@Z74JeRJU&fHn1#-OLWEgZykAThjO}jwrx&- zg!kTFXdHOcp&^Z_#Jnp}I3k9CiQ%eA*RFQ0o2KU6`OhNEj^e0_tIgS;&B7lmC!KTTLRR8c79YE_ zu3F1P#CD3lCE~%^l1DKr%9E3LBIeS4-3pG+c?k^;khKtLSOj3E8eR$02o9D_y$tXA;9OnVH)vl zy{k8_5QtEk6mPqr`9p|H5$_DrI7Us02egkLO1!uP|8Ap}jwU0%^k#@?Fs<(wzp;= zS*!fvu*U=QD*yg(^O#Sq01)D7dpYbYlpR29OqKtU@}J;+E_Clns}F7W(BA%VcU!Cx z)PO_-ibZMQfyNlYl#Bm^aHBrnnRbXm9}mrOeQWF`DKW;ZMBw#3`28F~6y#=et(LPW zx>Fm@2of0jGYec1$YR%P$zI2cA(Fs~l_4mSg&zG)k}P6waxuV}@s;fhE&&5Bk(%_E zJ0DZavOD^=l~2V^iypd-tz0xoTvJ%CkvDZX(#)cA>1uNUU1VeLlG7lel={*pB8da( z^G#m|O~gUkXpnJg%6Ey_5#u7>D(r#CN}J>h5>FJ?%Ck+lDSk7gSDQ8YCJ+IU8b4S}fM!*z%h?DsIN02m)l5dcMw3 zct7Z*2Z`-G-Z92o%IxJu?!4m1FOCll+hlKB$zNfdiHcSJ`=gKJ*C%gI-<@8ZzJGU~ z|K_ru-Q_>LfBkc+Z}kDQ73?`;IgxkoW-_N=u6O}+y6J`<(1$8;q=wBp;f zndG2gA2!e!KA8q234jeJ887OFz-$f~SztjvH@G4+J4vB5fp51?;=pL;^qw&4kH9HF)j1Fk%!NbBC`ZBTJc|7G52O&udrk%W$TE-KtR2 z(HR>8hOQ-y&mbkmu>6}@=ImlK|D&51#Qtm&hGsu zFH@r_d~*Mu;NTCpG1w}{m_;;+&P(UvhZWz6({S&2oYJh?B1zzmc>_hIAVphnm>Oq% zLdtbyE{{=l;s{N~NylG?GKp6S4VDELodAo7Ewv@N6`%=n%Z&a&I_s*nsKP+CGMzv} ziUh=9@=!+dEioe7rScAuyT7C42N-#L5H&uI*dxZOXkaStndM}1(AzR$l6RKHR-%QH zuO^}hI#DPTDhC*b1z<_xOW_`(2yP62a~GD?7uH3=`bA%>O#vG%Gkq=9PLkj=tv&IY zbc2EsyxtH{u05_w&2Rzc)c(+FR}h(~ddI`}*Cj1nv;*>PI%Xs8|^sfNK?8dmvA zx5xF}Z5ZdKp9r=!H>tnWwdwMX@i4jGc-q8zr5di&H6qr_2Kfj)OUpofrB0>g`V`5b zyd}`4Qm+g>sB2Mtn{4*NIk^)N=*^fb9wv%I@9gF#*i-Sibt$B5N;egChAhjK;BZL8W3(e(M1Sbnn{cYdxX~=*k zE;8^jUYAMct@UsJ@~^Lu)h6Px9e60CQ?40Bx+luk1chsuxl>1)ToB`ft-}(zODC3< z`EUR7-#LcH|L9EicHm03(JY+~f?k?Q#LgYoD{%HNT~x9OEh`EzKXD29BOVK=3|G@- z)!c9<4`*~)cGfelD^5D&CT|Y`NH_7VpDx7>(veqD7PNQ2Y?Zk0psu)?EJ-yFHivJY_%fIHFA1KZbMbHp#g~FYMv}m9JUsiuE zR)A?Iyt*mf1rYNCl>?S;-S?zK!hjsEuy}EC$64D>D^qA)NvR>+_kvN6rfP49Tn~gV z4I+k1hh*gJvIYp)4@#2AQ(dD-Ek*LWBr6)AV$6NT#l3~OV{>5P9uz~A_*xLlTCG!W ziB|x&odPW-q3!Bd7s?j*s7KZ?AEQ4ioW^P4U=sgDNO~-D(?GBkeKm5#;@^-o&MB)C zw^>>#?(X`PzA=6c#Bj$e64Q zx{g~`MjjR?4g4two&gf_8n=0vj>q(m@{j+LW{n^vBL6bV?_Q-3;Cm>->CyU~R^Xr8 z?`q+XmvQ+yCqkzYk8keepYoplJ^tG-|LH$3YLhr3P4yN-j@V4w0Cbxw=zC(r$7 z$Manc$?iQf-lVyD^Ga->v>F$oU@w7J8;*NcDiCPVK}VemH4_q?3QAj|hK#w$7-AQ- z%I;f1uV?-@_V3MV#Pj|tY7zC2j(_f;2HkvX=2m&&`Vbxpz(9Ii6^k4Nqxws@k+I`? zq-|lSVa8t%)lW1Oqh4BKEIj$QVZ+juUGE!b2$+z-=2qKkPD->0qSa;*EvZ`2C^GVp zdzrDC2<0LS(-j*kXNz#2FUg;Xzc{d!&S%rGsTWO;!J%CKTCHk^^@~?v?dI9*Kc1cb z@bT#5&wu=Ibn#=n8aHLJnvzksGCDFhPB{3MO6vyqC&%ftkmp!DY0aRd^yQ$WBK52h zcjg!PGPxEgf!D=t=phqxRP%OymOXme)QioUG|R#JW&RV>A!Egy$vTNh98kV#ux<2= zQ!ji=5;&ID)Y?^@h>aYZIxPGz^-fNv@SCd1^pm`S(ZY~dqk=$2sY$&EqPih9kk z9iWxstH)yIZTqiibW}GEIzeNFER0&pOu5MwhL@xOXOQhh%#@mT6D~oJ01~ZgY&z_j zFz|zjOF=H|g-9csLMrofz52!SCz*ze7m;S}%XS{)ExMEXy>^|{^C;f4=PT;?*`u3Iyc{o3)-GUUkJiIX;!#$$V7(FAVphY6zduXA; zAclH~mk0)$Z~>PI+}x7U2;$^Uc16k2tFMabgF;T-6#eVQwT?@0Aq9wu?KH~J}&&6t~+0VQ*6t+(`UmR>q8ihJx3T;Jb z=|p^1U%|gern1;WH;!xY^={Hpl%-dc zJ{wuk3~0%ns4);L+=45BEi5KqMOmwwo8-QB*(jYCYnNhpzee|BOXb<_T<5Zj_=FJL zNN6j72t~@}rlGnN`Ifmz(p9xyBh=2Ak%Yl((?mipmB$<9tzE zHOR6Yl#?qq?)_;K9%hoP-x&QLC$=EVxfCz33M zRZk*Bfp|%hSq(>%+{i{8J0p_YVU7qVJ^Q?5@IDJ1Oc>8XUl2ni|4N z9&~|fDf!c@AZuq~j9@ICk)@uRGE#I`ioD1Y-d!N2k^dXtqiYTsN3>ST^J3#KGAGJ{ z?p&Eny|5G)0!S>_0mUVCgFgy;_%Y>!hP6b0D%XmOSGv&nHic*lqeiiXVMY+Mba7qg zz35A9x20ElAIr6HcVN?w%1wCfZooDf#WING(_}9Rmh(t-R@no{ipKp3Fxqa;QhD>~ z-7!VGMEuH6Z%^J`wDS2o?JyCjNWgufQDJy>a@ti!wJO@bCE7YRBzmu_HCaX_i=czz z=XjCS6i$s#tBeWV6q$Zmt#N@->Op5be3g)q6qXB}a(s_8=)7&_mv|Lwq8cji*L8e+ z4XjQaLmS6lQ90H97)gG*Fqb}l$HfMx?+s&QW|GHdSGpK@rmRo`?qSI~_T7N>JG%T3 zB~Q^rk0{Nqp=7S=b&cGmq3fy7PA6(!B=Cy5iNi&&yL#oqOKh8?rbuX1PeS^HPRp?V z*fM{ZM&O^P(K&u;Ig+&KIc){-e-NNEpzK;O)8$=UoW0-wSSoD4*>U;2&_Fr^zKS+x zC}h%8Q@i7w)h;&%{H=(+j{*F=Enqo-?3T#`VpNvcvLg{@Lx!FO8%hPX!mK=@03FI# zuUtwH%w5LbNx} zK+#2sl8gt5`iHwDe3CRWG~>5Hed**0^V>qNL{6u0ASRl_U4l;y30XfTkbb7-d% zRQQ~RUT2LAj`MM}#xXSVtgdf!VmNa-8}A~$4>KVb%{9kpR!L4AuhmJGBy-eIGxI@( zA<25-wSFbnixg4~Tj>_XF#OhO=kM!kQ6yFI_ru-x>3dIkRt9#d8g`}GtySEoF6{Tl z9J%l^wCEukLpxNuxAE{W_d{P3=fUZl)0292v>|SU$ zFKj~Lh3@3+@c|cg5#*DyR;tKZ-NO9ZnwIB6A|n;~1}0 z%_;`+sC_&(%i=C1aCF!MYlPBP)g^CkJ!Okv`1pudp+-pu56YI#RX5(vLN6`++umop zT0C1V4ziQZCD+I<_-(lJ|H>-Z-02-{B!E0wHC5v>RaD<$5fG1Ivnxp*OKU~#+ebQ$IQrOD?4#;DKDq?0u~b#t zOjM-caPZfzAw@-R9W(W1c>08xjLEf%lGl{s*b0+ooef6;c|D@Cu6%k5A2sJ#nI07P z^NXL)PTY9wHC4-z?#jLIvXtvOV15`(JEjD)hKB<|Uyn=C=0(C2S~?s6O_!e4sEMeu zK7wD;dR0BsSc@bF(Irw%a#wW3=ErFYxLiNpes??Q3BwU$+=ql{FX;e*@Al$$bN#&a z+Z__9Q<5`2jdfMJj11?4Xz2^I;thAAg*4sSEF!XdS{@#xV_)=$#PHJXW}V#2z+D?F zYwr@h;4=(EpYSa_LuZL=gbUAy?FPwMV(-6lEX7+&ifnhmZ?$n zznRC`D9sneP_4@%sbig}`Btr>4;pvXgDy>4&cP%Vm5&0bEf{L5#fFGpwL>F6{xwb4WDyN=3A6$@1@HLn#grdU*)sMN}AO{G^O zrDj_5nvcK!=k4XitM4v9{`y~Pk!G5ASrxPvc$BNCqMZ()gUzz2yw}-QCAv%>=zx3- zK($K%3YU}b-g!(IfuY(g(|D;ik!i>iRcaEIxxP=e`c7vV9q?VA@>#2`it>c^t8^)F zN}cJ*&|7I<6}-v1o@Z&Sl42F5`DhQ%%^X3^5sFT)U*CkUrnlkja&kAlxmGjB zq(ndHtXQvfUInwei`%=URSs1| z$~Fi*+2dtYsuOy0zI!h^SI-?sgvU{?=Agcb%XBVQX8&laDuUw_c1P_WClhl z(Bm`@>D}gj%BLOU-oRq6MJNw*hwxoS52R8$CEI z;>YCQzYiVw<`7=N9}oWo0s8?{uh&IMqyc(Pf(hFWX^pB4?u$CuRY4=?&QzvYs28=E z?Rh~e!s6gWXdcBM4AU3S<5H6yBS0j6sXK=}v3RgyW=zP)N6L_7kaTA0yo^e68EL8G zimWU9jLFE0#jcbBTr|(v5UgNL)TWHq#@Vz)GfIq(#y*o^Vd?B;OMH!06u@&vzC)6h z>I0iF6yvpH0UbIjk5-zzkg2mOthQ?sR{AFivuHI>qA*KM)#$o<#;S~eVA3|{8?LoX2O3o+oGC@oMF=f^|P8VA%6#`3k!fVC}yjQ&r zce->49meeL9QLA?#u_4FhkGMnWhJ37MVu1ToWsqxLQ^3(+p#BPVMsAeP%SBD*np?G zL`T~Br8R-~TEV1~T}dP-B9Bg_Ew7zYj@6O#F>*qxTQNEZ_~RGvo{mm}_X%;K<#kaZ zj3D#@5)QYQ7uafUsjsTbe@_OhbCkS){q3N5vgHsa5{4QHuDgsab1@rGOUG+ z8=Oi;(U~YBxwl9(-c)24VpaG!ElR>7Cq<|IiSVY5mvZp55=);`v{T|#fSag3oqj=B zCS>IADLf0Tw`4+P>B5_1-q&b@NEjHOjV!hlVvcc`kd8%y6j~|*^%R`9R)mcL$94BM zMl%J8pV3xvX&d_{q=xVla6o0HDV*E-@HW{JZ|TfLCejwXm{vxBu-+r+10Qa3CFWZ8 zCTlC)*SRh^D5OYrPZX?YUKOSqLUQ@^bdF7#!u}5ADq1WUQ&Ir7s(>q6o@(p0?O_BD zvhGB5!G;(C^AE*=w%ZVbBwW17LcN)=oG=tVZ!PFj7*G(Rb(VlUCQ1`fiamEkXDmp2 zHbqHK?}^AYB?}bC4_N-c9I02SVKII~&bM(;#6hr*B8BiirkmdC(`zS`73B38e>84o zCT`_Q+{$?Tl;c14mi5nv{4X5y==A8D!KZ@JeK!rRI~RS(F|ux0UsW4n#w4KRgowB@ zT~Zx&l-?t^5*AuN_Et?lGDcYYL2rpm%sS`~aSz^W9g@unla#?h(3iyqOAN^HQu8*qDl$TKWVSLL0OZxU5Nw7O+ku|Y__X;kwH|yUy^xc zB9e&C>y#WF6D@O`ORE5{ksT13=QnYXX2YLx91bkoaX>A}BfS25YqbM$M0AUDHTyp3 zeV-L`QcjB(&a>;)4DfR1KUf#c0n@l&(LNin5QSono(N|`y$!cZCr=`xE|AIINg^s3jAO;N@w|(MOX23sYyXMZ}$LQQI7=lPgYk zqh_qzMC8@P2XX*Me{xRA+_M}OIH(_yI8h{Cjbaign^#hvSVQ=KmOpkfUF3$3K5@3G zw7vfG`C$<1B>vfB+D|DO94e&cgKmPI?&agAb!QJ|JAKFN(T}GuemXyZ?t8y*AI6zO zSrH3q@uJ^L)gRUGl7G&7s2ZH_J~eo1_^H`{T897d*u0LbgKJtqaMi4V?e4#)r!UUc zd-eC~6u-atV&Gqne*9hX6YntM*WVKve|-N_1ED;lr~SQy4#;}IkkKQuJH=vm#h?vA z4w0%a)K{ImK)VN5A*F;~^N?fget9}7ayHNCu+KkbUa zpn;O+;Xx<^yVLpkxl06r9_7Pu!;^4!cl&N~2c5zJMu$o>ob2Uk)`+X8e%RKr_D}y2 zqB}V7z%-?t!4c%T#hQ-cktEs{i$=^Lm;OZ!Eb9@)QrV-znBpMr$ntU&$9i2MBCku7 zv&nzKm5v)&)1kF~=W0fOc45mw&eiSS6SqwRNboq9qSDTK@t0-96}ZzE*v^dns|^ge zg?RsEeNC=yG`l2gc z(XOkZ%*!C1s3klLWBk=`(BkA!sM{w5cahxJ z5LRe=zNZe1Z41O}2J|CXhajnQ^%{9EZ#oJ(im0mvFsEdm9+R)2|J%Ujxyg!VclCFV z19kS|ldH@Cc2;s`F|~uB^-hN*CGdYrIF1m=Gw3VYE0+|ry(1AiNy-KuopI0w+L!)_ zs#NcnXB6t3qe5e&M9=?Ue%I^1w5qczrLZVuT?rAyp6;UBcO_z`3rAfX6Aonm-Cq%3Kgc6)GAN6+7 z>Z2NBc|*Gm22PFc3W^7HTvuYE$)G&wrUE8eeXe6|4Cj@F>i~&51=chSl^)%X#$14p zRTwJ?-qf>aiZb`mW~X5x_l^C{h5G)K>{LnOiil9>oX)3tTyhzK(xt435?@(jD@Zo$ z1L^dT!^#!uT&{H@Y2{Wh2*Nk&MS})yBZs}oW9{m-$f1^$Zp}4nZ*r(aU?RCQ6?&j# zNF>Kb-;fZ2Wk~aJE88J=BhtC#5{7?`(M`z~jD7ngr{jpwr2p~P zzbqm{1pjRy`}@W~vy(j$)-iN-L0l^w%ROzm=S<7n+_vGLD=Aoi$CZd94u$&#>@2!| zWsKmk4@AP4t108LcORb2ckO7$i4KR-JDF6g*Q=x~nkP}21oY;*u3X0rnZZ{!!=XP9 zSWR0-l>qweg}>zG`wOEVUm%!&F>;ruxIFcjXSh7`mtW%YOMm%$T>jo)euc}g{N*2T z`3HabH7>vQm*3#>8-MvNF25BqxnSF9dv$(DprQP*VKbULYg+7miI6xrMB*+f54j52 zo%mg^eOIDE;NXTs(pPAWRgT9h5dD`C0fdK13tcX6Yw|6jAea@!dQU2X2IWq_(qVpT zx!O*Io+^pFjjAPgf?91$LS$u*_aWPb5fne}iggfBRO>+nC#|3TTB~0-9@DLB5^FM9 zz|YL zWKpwS7AxP$v;8|;g@S=$6Uu9X9_6Mb&Lt+4>!gWC2v(WA5Q-wJl}=K2L@i~)R&MCU z+xPbVB>$zhMJXwrGDlckjqTR`^1L+%BWS4xE!a@I&fSysqS)eq?b#aGD0!w?qC*sL zDB1@}b!PNN3X@$lJca*q* zT-u}OEY4wr3^yr7vZS@{Ml*JVj1!zP$_=KQylfh0hS15h6^xbQ)d5PuQa+YxDu+<) z{E|KLJ7XE!=7b0biw;5iKFt$U>kV0pD1&cQ6tfnklj}2?DEeWhu8RAV+@V)RBB-f8 zb0h~aGW)()z9qfSymPJI9&G~|K}FeA+{c7sjMTI;aLpD%=pclSY8Y~mM$wiVQMz(N zFeW9E+AbXqACRp_Wz?3AINf&%rc1qj`&)?17Q+;ENnz4C;S^xPE{)O78rpEDJh0Y| zeo+7rFD>})`2&06@$7bTesXetGNS)_EHthkg4$G>&TFXKsz_=Ah-2<=;9*T}uJ3NA zFFWw|8r(#m5LP-AK%uWWc+}V%O}iZ%#LZjY-<^aRIOice8Q^j6w6DV9SlSH#0XrI?biz8Wa160pntM zNG>zNJPN4^o1e1g<`|o5(!R2wuqZ-f2_0<_Vg_o+u?7_Wy8f})Q*@EYMk9E(vrQxk zNn<6?WuU+XZzQhOmd+g%6mjOwNGBb{EHy%Y$&&e0v!Rk@=;+r{MG7f@B}YknqtUU6 zwr=*NkiMq3B$7pu7WlD=;ZAhg%wHj}aHxz$QAz_>vF|aQ@3hZa8s$Pq_C*;Qo|V%7 zQl}J3!Yy^#%-p;u2)W~FzeRgDxDf0zcED;YJ)DEs@rYE(J*k|+Bk&^dn_s&wJ&_@iJ35$YZyMgoY4sLwo(jI$AAg!(||Ky)(*Sbp-tK5XH@9)+cD z_uM2#06o|AZi=#Vu?UWl0KPnLB7oF(;@af(cCm6}m{0RAe^W4!J07 zd;d&hKO&GtxA?ecbX7>U*{h})+R*OCiGmC)f161?jtT8(Q}q) zcf|I@h$Trgyk{qG4#@jX>_HpgH+w5^Xu%|FSnEgQcr}?GnYiH7N%?5H=wfNS4IR3o zgW;mZya1J*ALM9<>Cw`7qKtR`9D=pP5r!7AK*6Jn^Q|8~Z+TP(i%O-p;WtBC<+^GgBfEFFyhc>k5`+kmNHdY6W^>6YgkG0LR7bL zs;6Y+dq*D3Xh$e_EF=R2@AibqJ>ZIEXJes zF-xQj>DzJh5?UJPPn!0pM?6UvJpNl{+t$3m0|s8!C$2HfeL=cb{bLT@Vmlb9kN@`X z>TloLYx};>yP0eN%*(E)SGx-u%J^0N@x{y8&DFcROVtA%98&v8_*dNSe;xWe*na}~ z-k~K=qW`&w_q@jw%kcW*Zu(F7_1)!+lGW=s zBCN&%;%_pzGNH-%CEn^erNJW^!-VXV2*!$Lbl`L8_f(U&^FtD6V2FUL62i6$K=CTr^>NMS+4q{hnZGja5Pq@xF=k|`{$zpj8j zHFfD43R0|pYX_OGiuglQ)7UL%NLS(1y&beW3ih6@3!!fUqlhVXoA>$hu6#_uWNcE& zqOR~&UmyeJAAkK17mgUh2z@>`d&*PzCDIW@I2HUbR+mV5q^lFSSfZJA zI?*mpi851kM(^xNFzJxy+D#UBp|C6WsjiY_(NFbwX4%1yCMcKSiwNpo9;)szJ-%=$ zY9n7=7+1L6C4V4PL$B@Rr7K2QS+pkVLZ;B@WlLc{g3nUQBit;eY=1GO;8)SkAx}oz?Mx9HJ7ue5!Lfmq}`tYEEfFG5bN@K|$(&#fSDYtoTx`0;KQR@>N zCzyKWSAljdE_=HocD4ukSf}6usycUzg&|PXwk6@wqtCN+pD=PT zraPOp{1qh3eSh5IzyB2XzuEh@?lzJvO%UzJUj8SJk8*V-p@btuQnx^4W;I1o5v-I% zwMa!|PIayr2jCz*1-K*J9i*7kldIm&d7hbvbJnVUnV(j_DfRg#6nXkla#<}QW-(#uyghWGfg1P|65BpCi}&+Bp> zF9N&0d2c%tzTjVo5CevaAI;|Y(G5*TJ-N0D9qjs5QsCywBxe`0Afd(3En%rz)&2)- z%A3b!6=A3e49uB8BnLz;)}^G_u}WS@kOn0MU=|*Kb)q&dh)^Ou7;@XFVYfN50-K5rt+2@x1GF)~ z26ZK`2}rya*H$3ue@_0C;h;|j!!`A=%XL~AndjQS@4ba$8u1!`$Bj*C|hkBAXU z+FA`ZhHXd$l=|9Ar<`I~CS&p#9m4Np*nG2?LV#JcW5YH)1|QTknW5(iVwun%+WZ3V zfAW&xuI3n2$NH>%ByUzO-RxBiHcRXc4lK-%+O%w)Zy^@<#w|$J-+2_?Xk5KRI$fKy zNJGNR5FU}<&2UM1BBUlOT2ZpSIFZ3#k4c2roPG{*9y6OF6X<>T zuruf#>Bba#gl#v6fy`l8n?tXy?nxvm<`$FaefY4GSX$c-sH>jjma-zqDmFFaOOOyz z=l*GC#(`tdTvmu=0j&tE)>o;y78kibT z_rf`4>E>%!|Mu^D`7E`g4V(D347KI+&Kaq{^mlYDJnq~zyKKL)Q@r7D^iTM$IdI$e zos-pg>+fjJeSUtwlkQIKZ8v&*3%B0uzbqTM-FDy1Ox&n$y}dh{xcv_QWoP=9n_NwG zkM^-i!5}rHP1UkWdxrwkp_=UVce#Cxd6~2*&20NYYavUym_odr;Oj|i-*V$Bl)5P( zgnD;=lyE0{A~^?E;`p3qGY2%qlBG)&XlOd@@u3~Dc}rTug^i|S%M=Sf;)^3|a?Rd1 z>KHQypUTQp_|haVDmjk1pju({X^r^zIRT-9b%D(eY#@WIs>!;Nup_V^q!``~;t5FI z01y_>5*u|l#$LVPG7#>nDxqX8Y6(6;i`F7BPdOJ59Ep&SFG)fWW(W9xY|3*+@KOJ= zgP}TF`(yH+En)) z@Q$NP=eplgVo&%jtq}XIod>r%*plsWyMx`L(RQvgY#zR$z0)nQnTzx@#wAY|WA!Ss z^U0dbz*^3hC`g;LX~W(4c-KxT1aUxU>IKCK^ihf?*fRNPjaQ-QL&;AnNEhQy)!t0R zf7vn`uer|g^nYk5e9DPPZeKhb2w#DK93}c-4HarumK#kSyWjots-To(m?)nMnb92wVvs3Y)neI zW?Y)ehP^sArS4U!;9~AVFui(^#a`u^=3h4L)1mf*g!SAh{CI?WPJ*JfH=Lc+S|D8_50P zcDA`}aSiFigoIm2TF#R8y}m9bys=1DBz`e8L*B7>H_RERe@V7!!sx9A7a)_a*>&-v ztP#xOq@%ixJjGrlV!4ac!Jl_|S#5cq%+ZD$T`+UeU%j|?d6h+aX@nq#n*?y71q7HA zs&3)Xryy88&UDnV9@mDcRb#OJKmYK3%4VEP3r=Fjo$pvj%vB+=wRLj%oa;NPaVT%d z9@WWg9!k!caA1kuGEJATQkS6fUZG~AWYi(vJZtYico<>Evy6|!?n;nF@@S~sP6df{ak$~@8uG$0Rxsdba9vtmhgO2x7(>acgQ9>46d6PMm)O&Wj(6$ zXqqq9OKVl3f6>bQfFWv0hH*!e1=P90nh1cYMOOZ^!t9y7cv1>Vf-F&d4}u(xtU}_-3ZaCQ zRN;af|8_RoR!jjYjHgwaY6x9*t$~h&sBnyrZ65y$XB<<)WsbjrF)Lf5or`*#H98uf zY+_PIwY_MH#dKsaGd;ONiL=Ily+siV8kL>0*U2O~Pcz27cXI1TM`7ibmk*ljZ|D$N zEeiI?xAa-kJK3KTh~0!C52I;YHAPD^^=5l)BN^LiZ?jPo;0Qj=*2@W;84UW`e3;nr zQ9l6{gHgbAFOwK%Rf@~h4}qtaFcDzOqh*9PkRmgWPXrLeMY)s~%H1ww4Pb{8O}#_J zPy+fOaYCPwD0CJrLGevH_$x`GGE@$h8an9`L{2NEODt7G4>TVvpyT?)a&86^yISea|T)sSJbGV z!nOnWkD#JiCRv}EI18I_N?mhQW4LPHv~QXEd3Av)1d|afMH)VNLiUPomJ10ql2cv! z1GZ@rF*B3Of|_CaEg#2ju0W11xd7z68F5mFT-trsNuz0o%gnGMrW0Xl$_)bm)F_VR zmr66yRXQ_!#>EZ~-GTHOOIlJFc(NR+ByBZz0o8pGV+x9g3=u=R05{OiPHo+i?suF7bm`FjUubvUUpLT#lx<8mXf0${ zv<;Lwkc2CpeKriGKP(9f0O%atPS`JqY?93c8cg`qD-2tC%$%G zSnj&Pi58KV8CTO7>21^v*+1<%UNZ&A28Op-hw_{0f-l;;-E1CG&{ggFpLKFjv8+zr z&x`)rr17EU4}-2W*ZEYlZNm%bx2XGTC;{f2JvGkaZ<+b_X8+BHOpz(wvW(*rWb6U5 zB&(ytABkeZO1UhLRKFWZ~ju!~+LfF*-z0atmbf_3YO zwG+XhNy&d^aaPNK@p$Qe(e-P^`husvWVqLaOVbdnRjepAy)M%%1psefwzK$-hDlWU z6zeVlUC5Xxatt6B#@xt(ErID-fY4V3P6V@A)}^bM=uO(ehvV=HLy?`u1YVNFWt;0G zvogyuFvduv6F_yu>~=yv3u-oWz7U5Ewxpm(YoB;#El%ZYwWASNQwcea6-{#}M}^?l zjwR{rnH6M$f5BiH`;mQXE2~*+7xgfK?rvIkwA&KAwMV;~`U^%|{t1HPCW6m}nO!Ol zXsfnK78#g}xF>?|L{xr50hZ@t@mNRdQ34(;Hxz~f$5tNB0eRGdEy*{5`Uc<3GcRU{ zVY ztiYBAKy`FbAU_9&U3y9t7|@->=7*Ew>GYiXT`>mTPB({)L&OoQnMvNjPBZY&)ePC; zm&TC$XQYvEEI&XWcK@0CWS}dth&bO8Cup1W$x!7}TEDXWgz|o~I||Y3>OckUxxV<5 zM(ZKP+41Xxt|{ybg{A@{{#!{S-bP(HI6ya&xugaz+*g@|$wo4}f(dTx}=0FQLg(>n2a0F}@JFFIWf9PKD zKQtF}e~0qi|IAzsm(iwg{g?XBY|AolnBPIY(hzrR)ZHB@AzMUFO=Ff3;slpnv)HIl zLl=TSbvR{Z$GkLJfGKF3hp@g!ptq#rEnxb9iWp!Ij%b<&^{PNS7)Y|Sll-*cYVb)H zA)QaCv)|G8zxuE5$pX+(m?_PsWR)oUUcmY7cmY9|a6(`P`(DBs-fe%wJGkDb)h+3w z7dlD84hMr9@~BOl_ZCd*{~o)X_wBYj4@$B1>^pkgxw>jQ0eNkuwOY5$re^7J$CjZD z;}5#!I0vo4oz~#j6ZAAx!j}$99eQ?B4!zPp*21Pc)g9mSRo82r)l|hb20Lu=wsA?I zo1zQL2;>vMAHWYl=PM{Y%2UkDsITGz;0?$6#*0O3wu||s>}Fu64_MaUvGWowZTY$>5Lu$&3-WUMXdu`(qJ{=cGqB_I)b8a_sx7{#`kK5aqZffpvTB*!x)PW;x`T%#trk+j&ycl<;}~ z{OkCT9*x$gLd}utCG?**`%<2|t-A{DQ!W*m(#=!YvPhO_{2$$#zB1E!xQ!I4M8GHY zM^5r@QSXUu-DqEJ-bBm`-3gW-_yp5G>pMssMKm@1iL_PkW6XPCN4M)B?ktnR;Xp~LUh5-Uz5T}a}D)i$6G%BkGH$^ z_U=*{4oZioCs>cZNI*$P&Q~VE&f=&E#3O?_ECgXsF{@a%a?6532E)vH$AVEIRTIc=XSI+xyRt|F$>$ zb@+Pxw_W<{6Z6+6^4C9y9r)b!BFI=LaOXU!BBK%-*=~kJ4YX9sngz=gb&Xn#-0p`%FJQx^Vu=TSVFJ_;Y1qi+89{33nSrggY&A>R^xjrA%Q zNwNxe-Squ)_+-5QWc=jWpUv$*^?!T*XV9Jf-(LJVG(@m0fBd!=g0>wAv4)yhM?rjA z`>wrG=BbuX*{z?24gA8=I!9Rwz0A`YRkDXeYF=FOX|Dywo6)`2^)b23ed%`#ej^)9 z5OW3B-(FPJYW&q#S65e~Ilu&urup(Kj-LL?tGfBs^U)ss@|ARaQ7wOO?H29af?Up! z`VVoW2aDB396`aOw7TZ%PjQ(}gE^E5zRHWwm<0zcfWp$Su&4&U`^y@Wx7L$VVi%V= zbV`!|=&^>$=*n}auOimNPR~9b9lSgJ#`|YS2<|RRXqPMjklZSm8-+!K`<-uQi-$GQHAjg2A#~l0SBYJNSM7O znQ$y6<^q~s4F#$-0d(3f5uD$a(o)fhqyD0|J_0>CgwHNOKEZ-Z9*C}wNWbTQ?bW&^ zbo%#smbkL25(iTz68?hh+RQLQkWbd>qOw}tikc1X&1y5`dqlLROO!bmQHt#M7Lx>&^X8_G1aSrV#j8-dG13=718 z5vm22tt155_`DoQWASW80g@E;Np-hWn`T!ps0x!zJGKFHU;0rCdc~op5`sQstb+IC zbxMT;i|hUfh1TX;%Oj{JZIws8`OJ14?Y6fU^udF7jqT(zDK69GiV#r!1?3l8#{E4_ zq?yykGu&c_QpEibhL0g0ZWX?_tKfZigBcW}9iC7-;Vm=hW(#MsHkUw@G#+eBcakr0 z|KObmFg)>j3~~@KCrHWR7|LZnvqd8aj!E|57@{|>tte_(s=3+>RBmKg$50nrV^c==_)Wyi_}Ug-)7g}TO*ZL#e8R18Z2`WOWi-uk z0;fS%X0fb0*b?F@b7ib6&d+A!UilfXC5maMC|k2Afdh?@dLVM+ z_G0#Q9*-6V&yw;;;aJ3)TSq z|8js~gx)jE(3E09Xaz>3f9|NP^>ig#QS!xH3?zMHF&yZ6kyIppaSo1^{K6Pv)96k@ zriNIH=6$iNn7=-j9X!{+$CG4H%D&amt|L~Tl~1wKjqT+U8}yZheSm9!aq#%nYsGR|5$s*|FR?F-QjsP ze`y;k^Dyv6dwxu3>9Q2~#uC?V+wi?+Lx|_+$wT`Mkm@xy{Le@|SQz=R?s1iNCyfSu z(YaWi8LAe@#&B8O_FTl?$rw^KFterBNEaThKvK9+>{F1MZn5<+qf22zSaeq5Cu0ds zdQr~o0CAY0q6}8|wI^8Tn+vX?J*BRomes0Q%z=MS%+bBzTp~RdJrb9?2Z~Uci}M# z;pXd8n#c{u3&AU=(j!=!amRrI#qvB9`k>e{S^V1seR=_H06^W4@x^R}akhkXclRulIn+O6wIClsv z8AoI^XT>Y@?H891RvovUKjo|e@{~bw>or=lWvW?h#dk5C7p{DJ{hW$YiIwPi4Y_%| z((D{sJrJ0UX$bxUO3ge@QLExZ*Uk&e_H}V<0gf9MZs=t9ki}W0Ac&ZRoX!xcP{;x61!e2)i7u8Ix zlx8n?RlkMwmi(rbgKc6v&$j4oOVAm|ex4cjbK)^`t8H#PYkmS_Y{8$Kj3Tt#ptkA( zT_l7fo5~Ke;%Qwkgmr1657@Tm-nMYsE0M?&-aVm<#@^Pe(?kZnW6);xlM7+3MBj zBM5rS&be-@Vv40yQ`N7(7=<4bwtV|fUXF}zX{6}pldnf8+2QYiDx5B?to5aQVi^}u4u06ZvFciab*oqTk=`X`AFeCsA1_Mls8y=`I*Kk5v@Ue(LqCwGz zSim^c#tEVSNW?lD2Lis%|Ihyp2=!_+^A2@6&ZJ>tWuswuzQ`vYSiJ5D$H1=$u@-Oz z%QCap=k|$fhzyq??kSa!46(=#m^^PtT?6ol-$0Kh0sV(qN+m@7-cTeg|21b;4~Pj>@r9+sP&s5>v8`pGpgMoke&6k5_iMM&DVZ64~iu(Px_WDw-M@*aD2uo)3a}ATU61k~6zlA=tgh254eFXGbZ+i2;k67b)ay2OGQc5&}V@NR_fM)2-U zOg_GYzr}!~!UNjf|9f5SZKx0q7$wRrF%DZzw^BRk+DJlQ&^*7>XVm7M^myRP4!x%L z>MjFkeL&;^i2AS^2N@hB#spZDtwf9-F*d)J)7+U6wH;hKwT*~puGih?EE34JX3_+R zgN&9(8j?2me;%SgGRwIJ%&28z+icg}^V(|ZZcgh*F?K)f#2#hMc_k3Lgv|?xzUbx% zxNPItY~>FDVS{^99r02?tf45Z>@aCt2b;b$?y%l$D*V-Hi64e7=66@N%UP9S*a;et zpgQ&})!#RM@XB>*$G~(ku6IV@{O&C@B9S%Sg39`yfY_S^*zwL5)H7QmecxoRv|-)V z47u54dh_V^(9fUDO;j9ZdTj@g7v)KyBRdxYN-Xd z`XDy$3>(Ku>$Zu)mA{MYSjH0dqGCjp!NmdkYDD8xT*%U1vdqBdwRRx!k;0>939fww zHX);hr^|3G`XhSlh$3wF<|T=6oIEFn#!Y+IlxUv zbDM#bJ%jL!zj%Bby?6TsSoIp+ei(wL+BKH$cri;g;Om>$+G`c+UJhn6y*cGW4wAg{ zbwfPoYms8x`xQCqW((XK80XCky}5a6(B7UjW`{n<6b>m})jdu1JDv{u4du9K%Al0rg!br{jY_A_K*s7Yr5)6XTn^qD6El9h9INzY%9wlh! z!@=Pn4!%8#ULTzvfBXL6?BwHPJ(x3}Ldq}ef_wfVLL(}Z9Uv32|YKZ z`B!-sJsAtl&b_$QW&r_G5q(e7VRQmfYG>$ zKSScyWo#yq{H+&pF}p&1UQ9}+W?+owur1^11>$;PI~XT}iDQVo1m4iY51%M&BCTvO zD7b0zE5rc~KzJ;`N6dC`sHnAGB*n;~na|M%&K9!MSJBybACC@R`wr7H9s#D!0X(_2 zol(jQB>AEL`OC}a{~SGk`sc3>KE8YY)X0lJGxL1sGzZ^AXeQ0X3KjJ{6H9=-qx1ONF$oK`=r zlXdcyReG(@k=}R}7e#7L9DiK`6mR*}>twPXFywq^moGXHN@ zWze6|Rv)@O|Bd0xp|^+K9R1O5qk*8y?oS#1kf2ZG8}=D5C$ktruyqpqqwf-PP==5v zyqGCp$*Fkc#ynS>3|aJ+!d0NpBPzw(Vpn2X&>aN%;+&C; z(GYgOP7=mgT0@m~&^E~NNTE_vmsV0?FU{&ZNm1r~96siBE1oyT9e5@D0n=f4O8J83 zf64t^vrm{YM}U99RC+~pT!IrNuU<-HKFTq{x#Jg7Zk6@z9Fq;vi&s|hfQDoWj>b_IQIH)<=W@p|20U?^kTy6}X^06+1<(OZW2L&_qv0SuVLDOrX| zH5Yrno*)VZU{k;k`_IZ}TWoS0&0!%ciVQhnzI!lh|Wt?Wb-OOURk{-I(GcHr- zA4a~(xLAkafYS>@hBv_Gy|x@UKG4}iP17i%+G;dId}z<8Jd_qm-vMoJjGjCU|0z#h zj?RmdcqD(Li}9jygrx&2}=^4KQq@=_&w)lLUjMbT%iUMkm82=dBjkOAX@ zq6Q%5ns&YU-dw4dHa+n#xm|drnjL4C`Dbg!BOMUlMnE(w?nkv>bO;hPsFuMRwQYIn zQlCWeMkFL$jj1XK43EGx{rd;I)|4tmyZIGQP=x7n1pNk*W(1QgRs*PZRdPfq1o8Sr z*3T8LI!`-%V<%qq#P%~+*aN(Jgug-xaK~)VYrVA`;@ZK(gl$WL$4emfXvj_(Wo%-^ zPMAqM6U^J88YVDbf3alwH4zluY-ftAfmdnaI06jE64udGVVQ(Ars-ZhZ8Q)q8^U0` zT=229E9rS-h_#0wo=8OL*lyT{^}*YAwasNS7rlNO23hsdUF*!o7=jzOq18)`OT zE2J4&HeXlblrLd0^&<#Y_=PWxqo6SIYJAddqpDVxzSP?Ysy(hr_|_nUvNkZ(l+*zt z5ka^UP}55pIuAm-ZooRSNWoOfQVJk)6FK8>cToFkZ$JxXd+^V!*S;;dOw9|Ut1(8E zF0Uh<^cxIvhST`dnjk}JRBSav!l=WYbOZ_!Zq;Nqxa--GBk)VkjisSuX3}I%>n6u)V6(M-g;N%#9QMO#5P^cEI?0CTJe5n1NPtAx*DL*F{9v;52 z6Vr8P_-rWZYyC>%a~s%7cu>&Ef%-T*iD5pI6!7cps34InFDanI4Z%sFzM)mvJkn$| zRkKs#%#5mBfXnL*8CC>!OqB+&%@DA9fyT#+1xbT&_F_SEPCXE6&h^mMyJN$yHf7f; zwFzP$)j?aA?4=PvIzZ`(IG9}~4DQmrO2$AMb3Q6HCsC79*D4miS_fZq1eR+wVd0I5 z^Uz^YxCVWdK0(!0?}Qx7{pq>3+VFmOP+n)#iz3e;S5-k8+)SfI2SBl2RkcgR4|zJ4 zxBT4!j0j`~tlqxPYAT{VJ_25c4S+jMQ9iVaBc27YzfiGaUjz2Cpe?i>qhuvBWn7s= z<#jn0U$pJFR0P#DSwt#a*eqf9iH&Nd42wdCe?ccC@^O6z-48f@!OZDuU`j1MY2mzx zC(#nD*K!Q1;+im{Fa})_A;?xBv70Tp1g8vEb#5IDpLVWs31KxwZCZR*d7^kA!CdL{u8$&QS{Ra?W<&m)A=vFj-xn2!=U}8U;*$9<9_?vNkctIJy@i;C7wq=t9W-)X2awZejpx#`?Wxwy*QG*=aPlP}7~Rx;1BY)Zz|6WppZs z-s^nv#st!Wd1+N)mUhmC5Xsr6y|yXJQ5owDMt6)66$0cetO%a1R}}SO6AyiaBmQI6 zm~?Int`c|S3!MX3{3hYv$W$w4G(<VA^h8$}(S&pMd0y%yd7v`0kP#aO1?5WMzCKT? z_W4BqGDUr=LTo(P7XX?p5M#mv)+}@YTT*;>a~y;WM7f5Q|xrIk8p(Hl>rs z#c7Hex^cY#6v62m8a!~zs(9GRfk2AyvQviA zZUvVFb`gvYPIjq9Ez;KeNX2uWL7Yu0aFDI@3ycFjBv!cd2~Ep#ja=L?^9*>w6vWXE zt_?y5WmC7zH?1+`xF8mS)x}s+C;$+%G`oSIebHPI;ce@kBNxDy+Js@`OZmExTIT4O zL^9y+w8An8-D!ycFTl2T4rR=ebqAsldy6lfx434u$3L8PtKNc2tYV8eGa?+!xjCN~ zz||-W08~dXiWKRTR{Iew0#_))^_}IlG`Y4}M!W!yK#`)#Wl~|lK_azeL8XvO#|nIl zHBWH!eltJkEA)uKykQM`=1QhJ^Sb!vU=!d1(UnN$vr|OLseHH$5lg%xudAXKT*6fKVm&B#+UBYBmoJjnIgSru;9aMZaZU63^}^Cc_yVL`3%?d!6!LOs>@- zB`Bw)YQ@&9-H3nyr=bCI8C9fbp^mkzM37zmr?8VF;KW0whiy2nplQUm0C(u?^B*%xk@WM;ylCfD_CX`+8d-2 zVVf1Zqg%zQ&N&*=4$}FKI$*d-lH13yA?>|rrUD~knwKNq%dNtVxsyb9vf2V7);Cn8 zu?u6_w5fMG^{vMGY_a{f-v51y?G|M>-1+G|Kw1$+k$syUn#b;@=dNuBTi%VjI_lL9 zo!J@`I;GiJ&Xw8h1`tadp(hzpWXS<6>+Ca@Tp&y`v$t4bgi>Nqi7?pi-js%-tM*ajFH-cu>l^4##ki{rmEY>#PPjcYGG^<@y zghNY)e#lyP{sjKEV&7xAo^tqyjxVP-%^WgFxr;T}nIu+>64D_@7;Z3x5aF}|ek-jc zgP6z{p^7V&a)gF8w$sp+Yfop~D&M09xoVwUYn%QCAo{%gVQGGDT1;#f7uXSu)MVrs zJxk>C+hRI>=ODx-VU(%hyIa^<3QBV3N;QpnPWIs_tk34W)tqssgecC>Ovia(qudpC{Q&nb%zsM*3Hq^=iojC#RYmKE{U=Z z`sQc@@^X4BL64pX^BtvTJW}OqWfG_BFn~byXAG@Xc+S+csz315fK;a>1_gW>k!C z97jX0TAfYjVr9&+fLR1P67o~n9AsOz+8ZP1 zF(Vf&ZLB{|7B^?oQ)qbRDE)uB{Rx_M7c?Zcqg}N#CezQc`-- zDcI8?&YCP#D0axsf=QO3hT|1!L_s&XUHr(6ngY zEE4O0!B1dbxx|P0!U}wa3Y>08W$r^425*~IlA3)F4XVV0!nRUoW6w+*b8rY{SD^Q6 zkykqJHlg&4a0j&~3V@F$*A;g5{OQ1o;x-1WNKp1fGaP)yq3>}~#Mg*|-_;U403^@B z0FH<@-}*qaMt`&>Uy*z{cNY?#)&-d8%TYaNbV|jqNh6rf@E=B#MDrn;Ccz^GK1TOi zL5N@j8Vy}JrAuVDvnZ_40_s`K4{GBgtFq>}*rLnH+^f#^aEfGbA={iBHl&7hw)+GFX|V z5+Uf+5bIL+gE`{K*C>3`?T|IU|h$d_RQdtu-I&X+gvWu7r&V@t7`rR|OlUs&iu{~V9ueOh)wrc(4M0Mt)hnUsH=iUGJ!W^N#Hgu| zCwPH;KsFkiA`>Y}9s>EerBuxOnIEHRYX{bjb9I#@5=tM>q^JWQK1U=x;fzt&7YI$LlhIhHS<+ z$GFIDaLZO|*@dSM-89Lplxa<=HVsB$L8Obh=E+{6-2GZU^5~qUWK&=lgkF2xHjpg3IhoDx1Zj~_F*Lo*s- z$KU7RW+r4h{A>{Z>eo}OC^=~JN$-3Kckr3B6Y%{XI{GTXL0b9WZG z;qPXFAn112+&X<;<*AW$;l60MR&C*r4wXe~tJiNxVB^m$Z_K(8Ps1-T*}K0P+^8)y z(=8wh^2rG9=iLE0t(yTH->%~#HYY6+tMktI@Z{6`vv7nXFn^rl}mG%}P?kQtk&&dY2MGr<{{uZj0n(+fWtw&^9c%rnF~CdxJ}k%lz6*civB zV0^lhdw!zNJ*3A@K0RhK9khioC!2LCZE|K3jfUnPrwBOR6v1m|I>No7K_XX!>o9Wn zA>ih%(*?wp)Si@XP_{-2M?_-?u+zTMF0ItkK`#!Sk~Y+O*-&X^zhhr(VG-D^j_K*+ z7F0#eEBNkFO^3iSgX!tLfA722`IR|8kcsP;C_$ExF z5g!DY{mFGG)pb-t7os`_JJ1UblyXVPtF*?vOK=j;W-v67B@vqiO0%&_;@yB|&@GqV z>2;Q8*Gq{?>XAP68ZhfwXRZ$R9CMA*srrSsm1WDSqPE=uw(z!HM2HeyPz6RkA&rl;~65iO+_e1z=7Iozd zY5EQ3h1u{GYZByrB|DL`j>-L;5EK?RtY!%hJceI+?eV9u+@y2V0j&s4QS>=P$-rnd zo8Y1JDOr7=ymAO>3Ai!>26AbZcz$g=VN^kEXUv&J>y=y})}2XVYib5+>MEusmT*5n zK8_{p)<&Nm=WyKx%$Rr<)X#c_+q}q4ukcg9!Jy3>jBl{8XARJtJ4W?j$OMmx4CMvd z(G4Z}xgw@$eq%~#6@?W45spzFdbA|0eAOJCYL0Q4XS#SF@$s+15er;!Hu<3Cffe}Z)DbPxCkhjHOr1K=zxN6ASJoEG)gdu@V3^;(C zEsv~l(7*&gm}0K2rl%WP+q?u{3Sb3>+G8(TOvE&T9fip{aHb;N3(ME((%j~0TwxaP zWt^hW&mt5pxg111Q>%~Q-&EfT;szf5FCF!z8_Pq;sjfQ*QZ zwVd5WA;IOG&lK~F$-ZS4VC#ESl*bLiZ7qPB7RRO&PC3h&qpjy_j6|UrHz#en30C5v z8}HEKoy&wuny2+|xcxz3JE$Z()CDg{`9$i4*d}cfxV7lfFfITv0nDsEE{F>t?&{f@ zAj{gGVj8|nK@VelL!%WGgUGD~T7iXV(}+Mrtz}?Dp+)Nh)g7;z*hvZbRhC$kB3>k; zYdSnEUR!UZ3bz;o*|T%RyI{-Zm<=J8G>aCh@y0E~Hhfgm~GTNg|mN0A-+&EF7k2P-r&N&hle7nJ9ExuLwV-wdZb7dSy?|s1?*yo!ZQ1 z^jiQ^eA>Wsg&*4xanF<)%&r4~q9oOvjlnGq5d+jh3olrcGwR|}slRtcNPZuir9*o} z;GqH(@${NhdRUckC(e8qB$&9=0itH(c_rvC*iIccbs(?}Hm!xSRM;SK*$8EU5CJ%c zAP<_WfhkB@un|FvpeS@AMPniIGg`Z7)dm2JPe>QOtC@XgrijMPM~I=9Suy79N42J8 zbHl5wPM?Fp32WEJ%15s2yD1u1qPrIw*MbLAIj~oQ9b>mJ_{($r25it>@cl-kwc=qz z*B*9I5@{8LScVSG`TJdQ#Uk?T${-*}B(%u`4iJ`@5D_!R442#{!YpNAWh!ucQL=!M;ut@xa zlxFljy3b00X(y}&)ewEvGe*AHTt9V85d~gD*%O|vgIBOQJ-@}j{XP^#MsTnWINFWV zFm~Ga5dN{B6Q2T$C7m_4>|r=xfm>Ga3H?Qw88!ta7b49hh}m+EioAj63`8yw2t14u z#2ZOlIK!x3%P9F0PkGO-7O|9_@@EBjq4Z0}r6MVl;?e^&ap|FL^%HzNmx^2`3~iNg zejd1>RffDeSWesVqGs9|f}jRAi?vancjHn?=Xm(>Mv_!QeAT;CjAT$IRprn!oZuOT zKY*ofy|M{Cu>LN%hoFQ?k(DeX^C;@%AY%>r#*AI|x-G8EQ0s`pgGeS-O@eRA4;dS` zTGY!5lLsqFWCncS#kJ-C%qhZIPBpRFb+bb%rJhZ#Swgz#YK_IMG%_>Y2MEWFvASK2 z;P>#N?~CFoEVW3MT?3cxZwZlLpsD_(Ic;4ggL7}$7;A&B8>^f4=Vz+%pkaA-&&W={ zgj-(3QA`O_$wz>Pg-o{q04A{42N;=y%Bt9-haqLBErFK<^d{oa;Ydi`A|XbQMFaVc z^rwq>T~<~>P?p3}2;EqhSYEt=MbXZJ6mQr@a zvlp^jBshn@t;r)*pGFF6%d8!hJkYU)&z8_|VsZo<3t)iK#*i2Yx52Ds39Ca+iS?>J z2s9PsS^Fq(60M=woMs~>PgTu!n|HMBsN_neSFbDxu5i^XIY;T+hVKFB!i35^l9W%b zJ)w|2pf;5b9n&h>M_Rq=Cax9LqDNV<*!W-4<$4)r>*a))xZq^7n`q=;0@%HS$WRnJ zIR&eAHLNQRFBw_CPW7@a`=slIYS8bB+31;wYTvM?LvBJFWz_yU1maZd((!nEIVNooPK@4AEVbY`5z#)08?xN9T+WK(hQXOiV)Zifc^0EGZ3 zXgY#7Z5s`6QpmVpERsdPe9*QIhAf;-4g&030PasLhg)(+TT{2YI9P8pz1!%cZz954 z#+|E3!)q*}4|UN!`U^2MC7?l;2-St0s*|5USS&|cLLi6H9Ezl2c*LJO)@Z}n4I{A| zaMP;c>VmdQ>4Icyc7cq{kZv$E^$tLqxhCxC!?%FzGGC-q6ik3)j>x2rGYvv17#Xf& zu2*xBfblYL-8e&!~%Paw(^r5+Ww@&a~4#+ZM_cTlHVuBz*Q z`%%Q!JZjY283%F|7?1JsFpXZa+3T`hi=+^fa)Y4YDtSdLsHy;n+ZPlTj8ZP1 zRIZs}5ux#zt9qf%vO%U(Z@LtN2qbgIGpO09w#gdI!V&I232k#5a?t)Z?8DYLIC|a^ z3#Yy|A7Y$77?x|{a>O=tteh9|rhC^>Ymn2V9R{_vs*SO$nMOMRJ&IxYj&Rx$ewGp^ zlwr=>&Qy)Fko{opLYN-gWVIJS%@YK+D50+pLSsOtN5{=?;X}9jO5eY%`jgduT%<+0JjwyXLhB0Y`uJUk?VB z$i3%-mOQe?#6u*vA*+3*cIy10wuAIU`q7Fsq3w~3w2J-D>dKBih@12q`{E4@lUD5E zaK{!Q-!|JBIbq*uGlt=VZ6YXKE8S5PwL?v0DF=w}Pj|_5MT;8*B_u3|r_6um1(`x! z(W(|fab@NO4A1*^IqLh%6>0}u@DDpA2Ru1=&L zO5v5Bw$(XTYeWe|k^w#&vA^;X(?0IjKsS^WmFZ$lP2O_SG8L_#wJ0+HI+b!Em@4lXm#{lJo(ashn5s*AbKj9uA zvn9M|t_Rm7k4yX5TZF|g@o*2F8i6(1$}*p(sLIabD(*_0foGgK)B3z$cB#MJkX;6Y zdO|xIFxJbYXiL;t<*NuN3U^e&agG43XY6>lWaE0&8QG+%(NKf#=rgUwdkK z1blWT_B-)+#}y~|&BVcn2f1A3KEhH9TM-4yh6E$)rwXxBv z(f?t_*<*`RRwl{eDltmrtJkhN85^KB*{zy3sTa2WU^`3G+caB$2|pVV+eoz&`qo;R z1Pco%3;ZG8rw5DGMI0V}_!KUaWnNqZOijX2+LU0&rVW6K6Av?mfCgV)J|BkWf1>A4 zhvA10hr{sT<2(2}-0>fePYM|aH z;IR3GA*@=S2y~Gbs9k#{UkUn_-)(E2toIgAh8I*c^qluY}(Gs1Sm!5NYa1*v)d<%!@y& z3+{ufYH1H7nY&z9!WKA9lrg0Jx@0_}k?ztSpw13g>qcLIPjt)v7(e``y%A>A4f{fY z_!gaU@tqs?269P6b=m<5|Ztp#|0VH58i_PDFXdFgbl>ya6LXa;m6ad@p9ChNaCh_z$|Fx_rjaq78hv9)WH(`$DRa#z9 z+0dyN-XN5P>A=vfb(yr>&E~C$-y-CgpfLOJG7;xhqoSHLxx+$ZMSejpXaM*Kgx(*Z z2`!y~)2O6G6HD6Myng|=kQvCYLVz{_@hb4BL-l)sk@JaP{ecVYVq_;Q>LL-MhANO@ zl2!%urXci|W<;0lH3Oy!I|?12kR*mB&h^AHWMG;(lqYcefgpgI8b#dVPjq=;}~h8>h+yR6Y|R)M{%bP2GX6^61}W2?{*goER`4pg(uj-lFm0`?a?3B1&p`NZ8(iB(SqF1e7B5C3>%nGo*OU~9+)r>@D<}^(A?o+K&^j9$D2Fnt5_}zVRD=X zObW;XcokB~T!Q310nH^EQVd5$I}XH};1Ws#z7&Kh60ZD3X#uJEOf4uf166hv;FyXO zSWq$xWOzHL$KReFefvG#Pq{f~h(>LQjw4gu% z0thd1!$*wr2xcm(B8`G*X)c_{kk}V~1pBX%Z%$SOAvNyhGu!i%CP!*Alieqq8{8ra z${MIdE(L>=vKNtrwz5|^$Pf8agkR1Zg>pgWvcz=rIRO{ZhB(Q9973IRweh^thII2c zOEDRaVI(suqDVwQEB|Q@L4fBNpltX%NFsO@lhX~skW@zuS_sl%ET9ywur)fjIS$97 zsuLQi*+`$cXfrMZ@HILS6on+#M>K~P%sWby?(CXbhZzqVxecHYL$FqfD~28!7?R6N zT&~Pw0+%s7XCxD7){??UcK7V4g9|J{D21kqT)cz-1#FfOUgFY85umdC5tn9XfMy56 zXmI(9E@OBsS?K|TTbJq%fB)g^tu)QitUpjR6NoGYp9g00rU~6o^2HF&8{=Ce3xYJH zAak;lTp-lh*{?Ku{Px+;KX=OCv16+#%E( z3jL}YCrHR3_R|aC3Zyy6E^`!4vz&x9u;GN^cli~B>kNY{5+M02qcJX!FCwqBH32Yc zDv`i1@k=u**Ax`mA&TYPm_H*t)icEL6VA<1!&+=i{R4vugEk#@DSS^CcL!14m93;> z5V$I43QX2ZXoabDYg+OJO+sB6q!wT;1?$6tsBsq*?I=O;P_LT)|DWA zUQ_74q)yR#F}2xvk+gWfKA3&GIf< zzbS78am`9b-UDMgLtR0(WCbVoGM>plLY!tb1|*yd-)0G0&50*`~<0(8dGFbVi)}oLo=xxR|NbQ`{|p z+KWyMWd7H%DaAg35|Vix@(-^Ab;u2)J0y&}=n%zVRA5}g{vncdI;$xJ-spxZGD3+u zT9}sYSaK4$=%GZ4(~%g%nbAHVkg!Y(25`umDjLBZb8d*)v|{Zta?$boGd|5yLU6Ns zj@OHF#^9omcnUiJ#umsbE-_Gs9?*(gHNIrc)2>Nvwpl9=$ZA7V@23vHS@FTvdju!s``z zRCEP;3K?w6=|wVIFLX&q_R1NBKc5E#ZJWY9Sdf<((nY~hb%li>_)F)Ofy0om9)b&bYraE|@!cZvCA2xI^_@qZ84#(R}ZT#$`2m8K$U zhr{0J?>B<3-@)D^1Pyqk`+v0E=a?!T=}T5F%&i?Kwn9AnHog`1x|rzrkfFzUOdbSP<|Z9cQ#&J#M~kAdJfk}swrLR z&Z2IkfKk}QiV=)1DT&cC1h_p%o!fxsK)j+s4AL%gB}nj#fySU8;g;hxOhZ>#n7$PQ z^KbuP9{uibrwAH}aJE6)qJ>pGdX?ZkRn5=tz4ohL3k`$t$>`aQzuDE_aK%v^Y&B@2 zXYP)k4BFowm+N9xq-F9ywS2ZW!WtBYn~ZjepM5UTMUnE2MZKA!Y#S#^ zv~cqJ>zp~v;u={M@;zHx3EF~84GD%LlY|5ZHUTwSLQeg|rIOEeRSX+`s@M}|dw>gu zKPB)S*zcmWt5Ck!6(DABktD4T>usbZ9nef$OZ|jguOSO86l6(q8s#`bWvf6+UtHC%SSGY{xWX!%8JC7ZsH( zzv6r^KBipMkE_4nOkBnbvbQV1QcgedvnhQ>>He1nLrq4u$#{ZB)+EyT6jLZJ60P~C zQ*O~4c4L^8Jl1%)u63@=m3hdFvM;j~I1Ptqk`9>V84`J3_!Y7V@RW7}$H63vGO4w= zG&tl&` z|IFd1)>vpdf=iAonal9%XTdO>measD6C^n-Jf;A)H*y#>krmlFP)ic?c5^|&Ju&M* z{_()fIcBh&zL@2PK&alAj> ztJBvZeGwjfI7ZVxXlSGGcxDYLs5q9DITD#W$o_|Tc^{&C?h?f`%fmVd$lkxbJ zUc~w#?1}!66s%y=LxCQ1`J$%#!?!1=k_hkYz0e=%0BFj}F3E>oYHa;Uyny}Y6_Nvj z;cg-m`+1&&#TfMR>KYBZkHdFKwjRS@grXC}Cn0cQJT^a)S#%)}$75pN@35Lisq3~> zIr)<4McbZpVwj(f-yfYBp%H6?+7`|4Z_#qU^C?Te4BDQ*huifO$eJeRhrZ~Q+92$H zs||#=nc7}vw;55p{(YCI{Vp#p9)^k`1*Qc7vkMnd>u;Hn`ge)pC13-9*b>399)=k0 zJTbrhxMS37{#OFwC5ExW9EDP#3ARTSfMdEE{HWoaGp_BMR0x0PMcqnBktln_DFSrA zNDgJ1U7f1U8_5lqX;$|lhBWHx;M3-onyhRBL14eqw@_M*xjUm(#iNV3TAiyL1 zH=DiJ6F#YourP17Hm3hZHULy4+H=}naNF6~b2M66v^?vAunulTJqsTrHy1d8F3gC> z&N500_B5&8Sn}f3CXU5{k^o4e$#qmDytHk-LC{ccq{xinFi`=zrnn6kW&NXJhUeAA zkFNNOWE8tIAh-3E!*Rq^e-F#sexE8bjz54ov0zUG#JG^Pti~b1Rj^3UFCYYcZZ;9v zbmhXG$K?fDBaNyVKH`wB2wWD7?+F**qu#r!$tXCa-(zPkMx)7aS{Tb-z1g5!gGXI` z%sgTvlnuV+^mi`Y)(u*-$g5gqYl?=%(os}6>;FVR6|+QRLO65}zu}zhu@6?+en`}J zffu1lKa-}&fb;Z;#13w zKMY}^DlU~7vpMrgfjm$Iy;9Bq$eIvnQ?X7afTUu~fsI#T?jA?Me@g|pw9ZJRgWXc@ zLoPl{XP%mRm2y^r>}y_2eo5iXgGK2wrqFP+1<(|md#7e@q@~5RD7_a9EJdx-vmtI6 zzkSJT0OlhAOjo%Nwp4y&?KbIxk`w5AZr4p5wqJ4FugjRG9QRRZ;~~+WyR$dgFnd&m z!yBa$DKX?2*(yFZ&2WCDgU>+o)8aZ3vy-{OGITaFJ+vTl2v!Ni!0?c~C|um@8;In# zdsbP~%x??P6iH4E)b{}xE0z!-1Iv?$k%iLAMBvaj<)*y|Z4fk>norhvPEQX1aCC;U zJiPV|ThuK$WKv&paVYCj4mX^*E?RVNJ7zg9lPQ-mn_O232i#K4Jw^m~(aJW=48kQNH82g(9u@yYWEOw(r#cpV!i2c8I{qGM`mLS8LoUNXEGj~cavJj!gz ziVY|JFf!r;)HenyLMS&MbOpra)>0v;4 z8Yx%9uoSSh6Frz_+EENwRbq_{)MOkseuFJ9Bc{P?)mfi0k{2u>m95DzAwx(e^GT&s zv0Iot)F*0{d8zRsMxkRHG$42B$>!qw1CKv$r4nVd%G)%mo^VN_L~^A#wui7`?@qt{ z@$BQL_lMTSOFXJt$Bd=`CDxKk=2zDqO%PpiuEMK%}G4w{PO{)4tbRPyZ<3k6$G5Ofhsj!Yjn$3Cb zk|l0h3NPiAa;!n;bI4sQclV481iaaB;NqWEb}DBDPFMPdhCLr6w`2~G<@WmHSJKiI zjS@>b-p*FejX9%Y0XJcoPLgvAyjY}~McI%o0vdB4y`CVLm_PJtQB1J6w zuyBCkevBrSQOFm^Qw6q;z&TlPxp`WUIYQxUgb!Y7dvqy(U4(GC4plcOl${qw(?c;4 z35^N zFononE7l+%nLwdU*3ksZR~=(QjN+grQHQaanQxxw9tcd+itILkh4$N!ZR22|hc=qf zl1LB3$Pfd^wnn;y6nWzdL@zy+y(j9GGmMM+d1pp zpX4f8vPl#{HIaf$ARR3=0;zSeO8)#bUXeX~PP@P;*=R9<{10i(ZBI^`9CN>#5#Y^= zO|i9yhht|?_5v2-FcWDx48*9ZEi^WAf8y-bzTeS(nSuz<%mqT8u^SNSFz&RX3KnFP z6(h`iu?8O>^KE@ah@}FYfRQ~LTyjZARdJoMshGgYsLugc$Vj=9v8s{{I-aG^kqmDp z$_m{^frN0KQkb{IL)XrY3n3as%My0>yux_HlH+66&fkb72vIU=x{;* zO@`rQZ}7JdS&-*y^pH{^kmYk#ypXvMep@(e3Pzq=*~ljFEI9Qw$EapG2B?N=cRihD0Bz|gsYmf*C&_)s*6Wq#%=xsmX9K1FiVWg;hoTd7P2jhdExNzlzk z-XI4ug+3-eXI!9*9eb++EVg_hQhHm7COC+Wf>!j^$DS(1uI(!>JXW+(c2tw$Gfpx4 zld1J$%)Br=>kM=4vC-DZh=@2tl=As@aB+bY>r&kzWRoA;!AU3u!_om$YQ*M{(VxXR zB*;eGc1mYp$&mvREfKy&=_AKw-H_#dfbQad-0aa-ekaZ%Zo1N~PiiY)_kOMApw%ID z0De*MwW5y~->01=PE+f(rh6xb1u)D_Jfgw8Fh>njG`+k~OcMe;0gQG>?R7RI&vES1 zlfno~fSL(B{nP3A@Z|m3$KzMuoW6=)oxYC9LVG%f|DJp}8@)X~{UDVxsoIgG5usgm z8DpMRfZY0!I1f^4wrmV1(|mUo7c+F5oSyvn@$mb%CqEpVQBg-gVlD$-Nizdt6OFK# zUrbVo92NqY?R<0KWPSe()7xfaMq-KRFa~?u6p5nm;4^ib&`LEpsf~L=XtRv{4^ZrF z7Tc1-ly5NaBNd8tMe)K}hPR;;KEiJvj?O%vL}`Y}0^8GRKB8|Pj!tm&sZ7o7X*D0x zcXv;#k$qKE359uMj&A2DFxi_25y>U7J-vAe2Mw#QFxjDb%f70Z+Ac};)4x0 z`pdekJY#t|4xc~SeKJB%GkI7rtx-ZPCDI6ocwuzQ2=g1zGiK{`WmMM329qKpPtM8( zxWbIKrlX-QpWk@&;qLPrOu&<{@Be68*kSKYjhz*ODuK<8Yh{TXl66<6NgS7(=c;F# zlv3B2t5eT^(>_Uo0hqs3yl(8YiNVnLtpQiIe!`Mn&}E(J{efE zrkfOz2|HToSpsV5iECO~eLnI+#lSHZZ5J=5UbR7En?lH(G1J8yQ4e;C**0K!q7sAG zGyGQ$$%i-<%oS`6N}6E5N;qfTNriy$*R=>JHGmLfr$P>K3T>d8`F*+?{LDtJPg^x> z1~h0){PP>k{PSOE>Yv}))IYzMxqp76$*<)I;^N6sp5>J}@6k_dThi5LFu150_KH&} z0Bf@Vca8d*m30fq$wu%;=GGWJG5@#wXe1UD*bZmBl|MJQWJ z)1F1bXKy$X|6b*A5!eQ7T;$#m6T7`buDfXMMJ9aTcG&DLDE9h4CpTMVnlBcFkxhftO}LzzdvT0O2`;0YYF*&Av!*(gD<>AmK7ejh$?Sw*{#xCV1M@G z3D~xru%VX$Qyhh1;HjSG6hTZNqg?ET8d?GZ5F&UAMiJGuGwLL$b{Lx3w&25nGSM*8 z(1+z$ON#5=wk$&bjn=33kt|Jp@tR=-TSm~|eDOHbR)kZV0FTjdvP77qWdz%#KasAD z6ZNyO7LN4XYbR*oIUg*@KbP*sH|rp76PMgcbwTj9q{w?1E|9*nKTvYXIk;m06G|Qo z8S~UVn*h>9LQezzGqlL98OF0(#1-NztMr!@rnnT!+fZ^6WaYRP+k}mDKdr=0ENVRt z7K-UD5N1(edvq`wGNtK74%2~$g(4GPzdt2xVW71nlxJaW@bx0kKd)BO2 z`B5jbE{X2_F7N%^><`Y1Xr?CcgY8ligc_S>p_3D86~5rzIu-VOw34Eq-jE*ssV3^c z#R^)zkwP&5I>>zOoRVO*@sE8ebr&%}fg~(pue8>!(hw45B_RN0@oEgmwPm%1(!`(y zpRh~cX0^GHWz%THN0pp`I)s5SlDawoW^NbteGX(p zY{W0rw>H))pksu$UZG~9igJ&#lhKOrI}(feB;0%UY(N*qQ;FOvZA!eA;Gg;uJaER-kwhTpL))}woSnG0z)=yoHnXw9kfhA^lq%)UAk=OTT??tH7$4N*>$gtGN zw`SYC!xV65^7Qi0U3&R**G%9imlLEh!nB#Kjq z!ttdtz_`X)dYR7FAjZnIBpS<->fQe16yfHld%yNZ^MSj2!!#t}>0$l+pXtREG%kHKrhil~719)XA4*y5@Ox6$S+DHwy(X zap)qFFggT_FxVXm@l%jk?Z=eFP<+qmKz=D1ri~M+P*Ai7SPc|py2mb_#|Ye<_|JZN z3bat#wNjVoUW`Vm!h+h`xGLgReOgp)KU6GhX~ASErVw8ccoUmX;5xwC-%^bO(fKL& z(<%C}h&GS}U$EgONy$aUbUwbQxE#)gty$a(dMLJJPCeD@A@SNWKW;@cglD5wA(RpM z*AAzlRd_T(Nc163z%L4Ma5#bicS|miwPU90xHKRACl@6Q7 zP#L!)hK&0niHszIgZxricp~0nZa9ri_9?^V#(eYsCD-hYtVI%dfY{!?GTDst*cvM7gnC8dD(bTMv;hW6(-axb7ldrWMt2h_W16 z5N3YJEs1XmC#TAZGWR2khmH@??z6%g@k?`VBpNiHfun|%54Ub$5Wb*{l`}@dNwSip zD-q~om*4C-5(Pd^%(h!EOGfWS5M#{87l39nj_H~JW-(>VqKyH{+jRu#|B;{%A`Ap; zSbi8HPL8C)5m>3q-XD_x9=$pF%6nZ+i5xb%0&QMXbHaU?ws5C%0b>I?gk)BXjUsU@!=#30(zg0=(>AaDfm+oF`OTmTS!D?i{1&;Vi zrtBg>&0a6!!UCE>%>`G|BE^vLB^ho4w{(ax@5v5hb+rPPs@X(;%GVskIZtizJDGt% z!=51i1S=dZG9#TPcPt$pZ1qIbJS64ACI#InVot@?9jJi1R5U_vY|S8nH%5EpDP|l_ zn_NMOI1($ptEOd`#KbCTYdzU06X%43U1PdG;$z& zsKQTB-6n`y{s{hOn#tsZd0X*97u2l35*Abh=tc z07D<882}6K#9^w?JoED}E(=+CydH;X_^bgdyYrh6KJV%x+{x-dp>g=c!v-~4aSB(^ zP72u>t18?Jvq9+Bx~1U5INYg`PF>s1zxf6#8-MuZcAGk}VIS;A}#xwbS_!m8 z$rPxA8Rka7|9=;|WbL|`j*XA-_O=E@6 z{bdmD%*`cVg>4S)4(Bmt*@AxWJ< zB~wgu`^DM3IvA}##)26)T1iJd3>5l8tY)~m_QDfN!mHg?m<+!_`2^eHZ~{Vh1#GOC z4+=x?xC1Yq&A>_zNyeh1LzzQeo%RG{*sc(Mr3jS7jdEG4Dn z>S-J5&nc7)6a#-=8PSpd9Ilt^g}na00DK`hity(@_5B0zGC?-5ax=9N-O(RAfL;9G z=U<2BoQ$60KfZnuhWk%P`~H*XFLs~2eEHnGBCIYte*a!LEI`E5`{sqcz0vc=KX&&` zgHK-%U^^?&vZ0m*T z?D-RV!lMwXY#TI~ee-B{mwVO!*n46+d9gcs;nVYnqmS>8-j2_HIEfBEejEMq!qA$7v1m6G7ChEJF?eqg?puH*^r6AHHE^)$qlWy(5p${?keL_NmW$ zzX_jzwfA&S_PXEH>s@K;_3qKW&$7RJ8y>y-<1pNd!*E~Gy4OSNOWX0Y=db;a-yelI(+vbJUTQ@JyC;r>NQ1o{eJjCT=|>`7j)e{L7NChb(A#t zD_rNO;7``+LP`R0rebieOO(~JdlA+2tcWS8kdHnI1b`8Y-m4YD_K=-|3=~&66@)I^ zDS;Y$z@(^D+=xg0l#Iq@UBXf3HFqaN-c&48=g00i{#zL8;8x4h7JuDMk&%rowA6l z)=6yvT=KcOI8xvR4H=BFUke`VjtF?r7RILsngcN|zmg2UP+tn1;2WW5U$~1-e_4S6l zQM=twgO9(ojos}+2hio4uZK>3%0qYPu|W;-LVb-oTBa}}*2rY18M^UQ;m%fVVcS*$ z!{X_rmFt9mSb8@yH6N0MBO=z=&-xc}7!rxBvd{OU- z4z}xr-{rO@$$5%~5U)k%L)az)>cj2eHT;HvFWqb=zMsifgUe;_3* zAt?y9unoAl6Y(p!bto;^1^H*(XP%;08xgQ4vzHPh(O`|e&`E3L-X`?0e90kg_Rk52 ze7K;!odiUv*KuLk(LfayE;TH$YQf2W>?j8O0zlD#;t^2Ug9LT$hc_>P1zOZd1rm@J ziao5cd^#HBXF2BqjO(m}P6s5iK|Z>|SX!%loJ(ArqKMo~_2N)= z*1Worl`9m3XM_(waJ9fd4 z;;dxToy7r#7BuX%YD+_OlY1?u5FEKM9M%kve{$V5bQe0pF97Sl`&jQ}_V zgj(}8$CY46er(^?LcN9S`z`&oWr)|590E&#Clt$|UsyLzp7jd$HV_?6;Z4Cl{?aPi zzGnJy_%(^u$Zl1Us_MFWDsH*ty9T&U2u6YB%L zf-?{I9#|qE;H{ie`}jIz%3;>+V(+0M7e#193riX;Ko+sMkAf4 zKo1RHZjMefw+(6t9YJgFSepMaa%;)vaxo3D9d~L2)CdU|(619lf% zZxvit{F)A@AsYnx9GzoPOL)YMx$Ey8ghmZcEvBM#nkc^By+kW}_NZZuM6@4?n#8&= zC9AqJXtIk*^C%#Uhc5#31WO{5j*t|e;|Fc9E3169!m4z0sh_R*G?Z`SJ7CswIkrTB z>BwVW$bicA%8G_}sc(rA*Bxe>9qA-Nc z#?j&QIdAQV%`dIvb`U=1sH@PszJ+1~(Q_l^5MXGRfk>W@LytAqP_z3vuk#Nz+N|Gn ze!ER@WPxQ8KLC&81(a2vLB*K*80vw-Xp=#wB`LGGqDgiE1|Kv|457PklLGSclEq>f zXP|nOL0hUDl~jHA>F{lD=zDvzA0?Z;28nUXNeCPbuhRux{@;tXcKkZC^_)P&0hQ9( zZZawQo&B|zJ%eOrYYsz+O^09s)qyZwAddm;>M}(M*u^WqJ9+)-?a}*#cSo4;zVjFo z(t^Xa;cv_IuOuOShfxqPVV_EXC>swXDxu_J8=TZz+M1sPv<9Vv>B0nw=ybsGmw`wnIEM!r*Fw>4WB<<`a?`r`PVMOHMB||2QwqzwFz~*)#d;DlgM7 z@(-*xBL65bL<6zR4saCwo39|D08Wf$Ql&l65_K;xVd zyo_v-WylnOc0+wLdfrf-lWNf<-LPJB;TD))kCC_$X`SEMs%I}d`?%t=uK_%Lp;NJy=S zvsnZ+03M5qm(0^Iswx29e2`)kVT44;-_)Bje9MSGkDXawR3&;K_cj4+FQNENp<*g) zjU`{wD$27c$>)!CLR2Nmk`Pk`SN#Q7cLr-MabZU|q(6XQ@sN@L^gB9J3$g$yjqtR;h298r;G7pA?2~ePygyS!kze&!l>4PN(K2z zb7ya1AZ~dOcv&Mm>RrUn3LnMgZ2HJgW%<>wZ8W&K(FRbGa5f)>YQ zNZ#;{3iobyv3S(e5L}S9m7YebzD6(&rrrqTH<%s1Yb2lr7&8%2ih`}Laz0QoUXeSG z)~iPYwp|c1c{e5avT60vr_u_w=Hngy>i|=P?Yhgab*i3tRN0ird0LcEFAw?1&ZELK zoI1Glp=t!fAYo$01ps*^&!0Z(qnVp{WIBHIk@qg$WI#JjtnBI9QotVb_9le;8xoVw ztxE^tzd#uT$`%G5z>=b&c74ufN3FD%RBbx^Lvm>t&&S;S+c1jrVCT1=;g|nh$SVgJjQH_iK!6L{)CVmfqL^p(La->}cu84{2U5}A4CyWO z^ai5Wq45BTExF>%(d;@7-^Q~zi{9mb*=!6Q&=BH=7Sr zaI|9-;fysQt0tbx_88MtZbF!nm0@@({aDDuSc-A!u=Ec(xv@bpi+!T9KuKmd z0GEN_(oo{%#>Yc(kk1nRIuryJx0QK!*{~Au>w3H&6YwNnvJ*F7%s{-MD0edE+76ui z9*g+JC7W4O!yK+v#SlxJRAnUP8fr}u1`;`PYzak>(ZFgZa2)lrvuHU2&>8Luo3FQ7 z8z@gB4@3>u@CZD$_<*O4gW*`Bk@2cvQ}uqmBMfW9Pv8_+7=GZ-t_@eU&;5SLE``x< zpzMI78rP9sJj=jY1X;>e6uvVGt+@?3(HhQ$5g!3u2V}f7vyi8XBrr52Ls>rTmyL=! z74Ms2un?mPpf9)5)o4{TisF^Bvq;pi(TspV|BGN{!!jir9kAH9N>X21Xf>TewL`e$p8xPDbm5%1Aw@mAz$nJnNl#Z>Tilp*s_s?F>N(Wr9x4GPQr7^R{AwF1!#r2>B124@I8u)iz3D2dTgJ-Pw1?-PR**?}QhbVyL*_Iiu;twK`eC)hzv~V_H`HRc+b1CaXj( zS;wz;%`~Tkq=`M)4~t3u1(HPhni&LrYG6~+SW*j3SwsBkyp70QO$c~_1$n}P#V}J? zT-tizph+jIvG_=%fM<2wU@1?_(zr)Vh}~@5?exDS{_-lN{mZeOpOF);j(i`)i{D z)nFMSe#r2FrJ4r5=D2SLL!wel?xVogsxPUyqWhkUJ~=}YyD?&STi4nHWElvHv-``d z^o8cBtQvZec+vtFQtW{P&4L4JQ!eZu;zesG$4wb1v zQELyv#M}FDm85<4;d>rq~D^vh8jxa;OOYq`+?TM11*3B5xIOt%AM;wvY&}1pT-!i?e*oWmS(` zHVbYM&1|}vwl@5_DyUw?Q@o1v`nNd6I)vS(%2+TYt8nyb7Cai-85>qWSe}1&5bw8z z_i@WjHmuX!Y>gI$peQ3H9x`iL!l4V1J(tqX=+g-ZrT?3)70Q{R%ja;|Zk$rTo+eh^R_dwsc``ZYPlEgIkoX^d6xs51ry7 z0V1pem04WOH3d2&972n{+B*&mpvvFywV95 z6d>gB<#)1|_{z=XvK5haKl~PABR3kr&f_XkaS^`Rj^iN9bxQL1oNBygK?8i0br-H_ z9D^n3d?AH*Ib0C|_mY_leNn<3kg-XUV^X&jBgt}5?6aYib=U90zj+sD&h~>_amk4KV*t;AR-g@Q$+3i+i)T*XJhtx}q zt1r=8G!a^C^^hFe*os33Ubwf0P42)lRIo*@Uo zktkuS_*6BB{&O^>;C^JV!qmoK(-3MCU=N8}loLP~z4f-EQQm0dwXL&0?4esBPg?u| zWirMfubp&>H&w!zEi9j7;*}egSM8-iCA3DK0BFlHjxLMG)9_6J#~f@gMh$)gx&9D4 zf@bzI*aq^b&f@3T;3g(dZ{2{+zxfCsw2>){w?;e$I$vpn2^4f7*$EWeRbEl~*zl@I zvFbf1_K9Ct0c~>%1Z`@C;@jx)VC!HlM20?o~9;{^q zs6CSL5YH6u%n}(2EmVokNMR+7HLiVd{iI-aRs& zF#ImDHw@P%&v?R65{0ScrQ{+M;ML_2?~91Wi=f;vN)>qhi0c%7T7jK?q3ro}f!?y^zUu_~zt<>y}-` z*JY@tqRa`ks@4YjXD*=P2fOP$m@TRBNkI~Zjg%v=0R^hsg7&vF>G*xx@%!R4mo}uC z91QAjX=ufk7IxI)Kx+dtzmss<)eJ%^ehII8TEex&rrOX91sL{AH`L)IyzYKD1pr$h zfKg;!a=teZo()dQ$8|ywjMC4|cP>VHNL^fHo5Az8Hvc_tcu#qDnld9E? zDF(N6=aj4oqZW#J!k8%*}+*+~2QO`KQccMpel+DT;4MNjTq>rr4j$rBK zIgN|2(&VRwa=zDQ0^gL2-Z4mjytD+iaK@!DR6{tO9CnslvR$IPVy&n@II!-qNU7W$ zxvF#zt`+aLiW%q%`xn3o^kQ?o$!(Uc?+)3K1050Dm;eU*PW2>Ao(w!@%3JmEym;K; zrE&%AK*gtc(8?&`D!}KHLCXsrWbB5?ZjB7sX>CMMyy!gKfhpWE`yw=hsNie(d-4QY z8g%gC9dyEsW3vy(lW@}Y+BlvdiW{=(n%Y~$lSuQw2pLc}4`id*6odcDPWA>c`+RuO zMfn8+uBc>5IA4SQ-~?IP`K2q%wJsznr>-A@XLLQCVhJl>UrOiBK8&;*6^nBEW1@9t z+D)vi7t44?ye+#Vp)Gkzkt~w9Ogg7h7&*RGn>I2~+KG!Lo}Ef!=@~+%$R|)n6@xy~ zQ+&9VtqVp~oEOHJGuKr29o0OtEz=?ksSoak(8x|*o5+Yh`hB&LLGeYXY(jTa*1XTY4BdDbYg-w*ZbXoM?aK{Kd8VLarC|7U^aDf9d zvi@Y0-n6=wx+?pOFN zUoE-32`uPM$~^#_`P*x zotB~KE*sG^{T{MEQjJ>$Iv$4Rc#EF}z-p^sGrOUEV3!*NK)r+t-alWY(`x~(r?B_D zti{bkNsQHMYA8dS@|c6sypjW)K8`PdqG>Azc;8|az5eb4<2J=^5^1YDq;{Ga29bF5 zRkd7wMgREfQFDFf^ZFumPWn#YtV7X^0q?B68{l;@nFKuzsVR6FBI+|jEu`~k8CTPb z1PZB8{gsHadIAqK!{1kem_snoZh&z5p#(C*7~8wZcCKB?`bXy@!yDF1{iOohvyn3q zU@c&#pjHaO;y|YhrZzH?O!8%PQ7so7x5R;VG**GEXUVhdhKz1!w@lmYyPePIR8r6sP<0T8 zF6WFnzw94|cV^CsGPEG;EcjsvBB#jB8AS*H+j+{Wiw2XP=X5O6$|?K^kRy8;lN1n^ zEw!b#v6Ruwd7CLw*&5urnx0fe<2A81CcB5Hi*X9&n#~33019jHE|wLk00G~}1XnL* zp7V>yvnDawCHYc+j|ZG8O`3m_AF##Qm&Aqbv7Y-*N7IH`dHq3#gzPzdjrXUBb`j?g zDv)*l%F8~S$K^s&=t|5!gB!t>T%_wv;!j)U6Yp~4JI#tG16RzAGo?}ZbyTIxxD}u8 zGO10A)!!|CphXt40)ZBuy?v*`$a&HT*-|3E=?dp~3It9ND>u4tQ^M!7I!9V@I02~3 zdQOPxlWo@{4i50zuuHQj#JML*n~En36|jqy5o@0_Fh7G!%LQPq!KfzS2E<)}n4q-L zEecQvvAq*-?h}+=&ETsGXWJ6gOYdC?!Xk@Yt+qCj?He}5v(q+dv^#)>> zIl|?#=d`l;P96{Pjw|S1aj{4dv5+g+`A48-q#G%U;Lx_s9WDczQ0n;=Tg?T|G3-S* ze>BfM8*+ngXH_|?+%0F%e9i9C79Q-<>7Kflg6=GPdO@jm7s+CU_q#9HL-2>00tZOv z6co5T4Es$9A15K0PO4~%#!^afsKcxuIyHb(3l!j*QA7^j9v{7T$#*!*>kLoc^$K$F zDCqh%mVPx{;0+Ua22aOhSLWj2^!1ya-(FPJYW&q#S65e~=_37{LQ3OT@aXpgB*ZWn zQ18vh!M7ic4)oS&Lhnz{4&I-gMsJSa9^p|3hxUh~k8e&szEfvMs)s?u3m!FcI2{H` zoEyq$O&e@lUuRTm7Fi#HI?CiwTp}Wynwt`edJbI@TSe}|l1jd?W&;fpGpBLeg|+B5 zm{~qIdQS`T1SfY?UIcESfNm*QHfM$YyZkD_?UxdC(N#=or060uqq7Kc*kM4Dwo^@? zB8CEjzBnow+W<28U{OMX^$2cQjmQjrcLdp~z%^nnhss&OA|A;`wwv=Sg;be`=ec#l zQ6Tu<2qR61J|YW}0I9Yf-`W2^HxkApfiL$JDfBe5of5}G-V%|Nmq|kX&|yLGFYdDu zl&*BbH?HJYw)3x)o~2_}(Fnntah8^}{8E7G=?H@JI6^m8XF=A)BCI5%a}RxM2jMIz z@!lqN zYYcbYBR8>+2Hg(Io%+V58}w0QXFl3g?5#;{*Iet8nt1d|;QvtFlwou=v=uO*DSFsb zKtxSe;VyjoY!pJG&dmI@p3jBx?BQi8w|nzc;^2atFdSgst*s2l?Xn?5i*|L~&K@HiG%g!aWaUPko@D*Owql-r&{;SNVpOeb{(+GF? zk2RFPo!Q^lnfa^UPLIr8ox**cX84l(=Z|pUmi~_``R7;ZyrrSp1fM5Gk>%cp)s()R zPtEm5#Go?({yMO;b6{u3@ssHyUV}fPwqU$aYK;Phj>WH9B%$uv+!=GN?l7K%N5n%V z)i@%*fzbGJo#mzB_>0(VtwH$c;LVSp-XH(5iFjE$>G71 z&MIAToIb+G&2li44Msk1*%>=|4ptv_3I2fp+Q33~WCmu*C9to{A1hd+>PPd}J{IPE z8)GW+BlutW9DjOLb4wa7DfX80q*|pjLn{5{5r_t%aHumY?7(5d?anxg_Kd21LV1p5 z3d$wR$wA9D7+c{)Dzwwgy2)F_W>-}#c^erK!--aTS)#ZG@M9>GHl%iCxbq|mv{H8Mm1k4LGef|DA}BGq0*a;NAge-h?~aK)`bSjcP)9Ivm~52a z+42g9nv4fztRrc}A`@Zd#N5Ix`G?c-H!v&mv_hAWn{3T|%{(2BAhw-NTq$~1mt%jE z$hLw>j07u-0!1Djs`ef!%hfEO!V@T@va7jYjU;KFGY~=I#jG z-=bY&;V-W{J#N;jl;K@UGskQ~kk4zRz+P~EG*&yU$%}S{ElMec;oBPVr_3Hc+B7&Y zbt3hNS>*X=Lh^)tGw$MmNIdt(y=b9Xpv;+u=?p@u>JSnz~0*a^?^E8wHdJqK}Di+$79}?C`Fd& z3d7w4wg4M0YnZh;?B-&W{Ye{%?CvA2amUkXvZ^q}7s^uEOfTp|Ee_rdHjW_t34Dam z6Mh5%7Ac-&WY3wT?8u2ieupiJdx*nx9Y`BXDYb4(6$7d+CYw3O#JfGq+uviDv0?WN zrntZkzEN%A{Fpm}W2cNTGu1JtNDm%8oN0ZT@QtXCroC1`r1c=EIo|qEZb-g+*=eRu zIRs*m<18)Jn&KZfFBGclqOkQ{D)Jh@1wlennk>Akh}VfmrRE9SS!WCvkqvm(ve5n} zM9Y=I{_0Ya8CB~5&RHVn-Uuv&&1q{+mhX75Nl>E(jZF%-q>rdl?ca(%rm9ZXG$Qwv zB`Pk8_?q)v0Yi==XV@9Qd{Q4lMHluY5&^b@=Y#oBleD2(BP>*6qjD;PuxN|I=Bhar0rq0&}NLz>+Ht3$z zh(T)QB=bLs4<0hMCa9%`Bb2M0@@T!nb}mGQE_c0Lc)D4L(+1g=az6yF+t`w{)+F^o zYrHiN)Gi>rC`oCGFp@#R2V$89xSTmV^2}R#+@4OxFhgIW@m98iYK4um+@ssQB3ig! zY|ER+V-MT?jL7WM^^#D^2_~HntWI3EiNAW~B;m4Uo6K@#iCE`Z(o7^zIL6E`7ZMNg;)#UnO{-B1!4!y<%}~UhXsduEB4%li7QBiY#5gZ> zbJ#|N41e@a2fgy6qg2x%69T{)zTl|qz=_=G3WY1N5pz-i9xyI+(X}pJNqss5V3nBJ z9H^EnLL)@ZVS(2nxFOg`G>>uS< z5*_(CP^>{zyOVGAXUB3~#X0V*(LLQNhe17sO4Sb8kt-r9e_E-O1C&i}=*(aPl5~1L`d%bj8o)}59MLNn zyvG-DWup_%riw91B$Flb5&upR4}>A$aS~e#kiRpZdB_#wKQbrXyLr=U)J+XwX<14@ zB4cXc_flO%IwFRImfQxVO|HZ54?g;xpe+S^z(Sz92cz~AC&MJ_LHN%`0sFJg+aVI_ zg^}8)rZyo~l%&9HBgefudHttau{HQ9q`Mg#rR-C)f<~Cju2M)ZVVFU9lLD1Ck6+#U zLhsD+>I003r(zWLwBRf>)uA03P((*TR)ud-{g`*Vyg_@RCQfi5Pg5}7WIWH zoqDzZaC2nsW9py{IRc;tGNQ>9ZnUk!AHmT0t$GG8lFL34&K~ zNv1d|q5~`nr4?mfMPB2f276aLD&NXkyh8Zeb>*ZT%1`Da&9^;+3!^WEbCoaRG9Z6G zz{#c4*tO641S1NjOCt`ZW~W1J71a(3cW|u;8zG$s_C67$VhI-zkyK*KeXj=@Fw&W| z4hK$1EeDPd{|V|1K`s;2Iy93;)pglvX3wG4cfjoo@eL&EUb|!|)xnVRSpf;4m{7nG zmTy6I-<)z7zSL@W_@^lU;I&fZD-P)_D`yUJ+<*mIQ5^x`L~}_Dm;nYl#2DSR$eCI0 z8gm7~Y4=-IdR>NY+>0dsjC+8L`7JDpplNJF1W*V?3(8G#L=-h-gNU#Yhz=vNaYlV{ zM9;XTpd*6FJW}C97Tu7z#m6^?yZd{);k(z*EVj?<^c3jX=c@gLtE zh10Z3{@lpuoINw5Pe;((6l!eJ3PBG7pf#f&bOe_RqgFv=eGzTkuT5XHf58ZLs`imc zwBI(QNMb&sEK*yjW?*CwTjW#}@a_zh0dR|xnn)#pScM@yTg*vVz$JVs+Vlxk&s(m! zUKC~EGw+v#d@xK<`;2^+MY}W7DobZD<1iF9A!Dy}4$E9pd0J{R%G7bWVf;^ho(%8o zUa=a+u`RBPN2HA?3>?Q?*XE=ULJ=ex*?Jz-U}=F`P|FfrZ_@orG8kH3f&rXp6+wR% zgiLxko~4SfW;0a;F^G3GU<4=+&T zXdu1wI~U6HtNdr$x_^s?RAcwIqIKVCrz z)G=VY<-5j{@pvEsm`MhAIE|<_4&p!T#U&96_#@u=t}XDGB$)UTgDuOs|3T7VC`VV7 zOHxTEX@yA@MQ-;{@5L`Sy}kMw@84bhBpUSH`_FAd^_Qx@{%Cn zvJPNzU8Hc^&aMrl2+L`{a10aIqn*j1QKIfJkh<-L ziZ?E{$80A`@gy@Hr_y@av5Z1CON$-R-2x6(m){r^DYqYB7Q!5#;i!RG#pz5Ub&GHw zUz-0IF)L7WC_XQn({l~*A0Yk0xQ(1*J~4L&8x$u?2o(iU4Dlrb7$$NFkCWh3S8V!T_;3I5TF#LfHA1d|8`e<1j*9n zhF@H-urF*XLT4%^?y`4w$wjk-JRBEeYmwPRSiX6M$Y)eDWJBgy6qwaUsUoC8Q-w}U zHP)yQwl*F;|8Mxhf8$~=$npXV_X5d4xsQqYzRx)pjLsOB3f`7}73= z9QqQC!q^wyB!PhTn_mw<9vz(F%>x&P{BUF)jAtasaK%J>aj-NFM!ip`N709a!#^B+ zdlZi4+~5UA*ljrSK!x$C<29z**;rMQ8M8CC49P?8&^Gy~26AK@%uJfKXVmj>(w;SK z8m1;qz@|9)aP(f_8V}!|oF2(PPLIERfAAKI3{=xWFYglOM69aig0PZWCzosCYkSmg z4I24dNm3q~^)1Q^mdOO?4?CbM1`QMxMw6DLTM%-F6}aELIUaR*2*YC$*Tg|cx4*kr zF|x?sY7)}`#u*wPFgeb(n-=K`f|W+WaptoL*haKym96({6*%%5lM2WYvr8z(ZG&i? zk$Q2>0vWXaRyjkL=={aqa+zc)T70e&Xo8U$bSxDP0uMe^YGz{+jsziR*~}nl#1KSc zF#<|8H+9(%#XOr`$l+vEyGr^9I3AcrN||ZmuB-_uZ!jL)O)AL`GVT4fe(T@5JuBZ! z@n_t5ybsL{TmLZVF{^{I1HK<~=(zogV@avl*%yu>mHDTdz3`XIq`q-2VxzNl^Y z8ntBusdFlM=X%4-gfnE#-3Dkf45UiAzNzxmutg54`K_^f4kIwN&c2G9lzQhrE`g=p zeS;jDBNrjP4HiwWnB;1Mbsq)ywh7QH>|0Vel)>+_0ZivVZr@agaJ&IPs5ypuyl95O zAIQxDH}QHv zD6%Q%th#Fo-{akeFV_+0goTBVzMALx8WI~vdVL` z0O~|QG$ah20Ul{$4QI)pDZ2Uc$Z_^vkkZ7#v#M^L1J(z!|>V z=5-7V`@1Yj3MIIpno=<%=P#~<-w-7*cRVa(b+Hm3df=H%p2I7X3vOyR|wLWorNvV~o&hizVMpOVj_ES{Z!A!<_)fX$A+ zf&p;iGV-8`Y@n0PsOjJ7d??-;l^ZOGLo(uESAH^yTMOZLZZ*6pFkm5h=BVN|awG7F z7pOHwcm0@lklo;OTVF`tj z>$g#Dw9RYCIW2qcpH{V^rgC_;Cwo!#7*F=w+6^|P$ciPHq-ud*0URX^UL)*Af+U%f z`CsZHi;anOv~fUq;1#$SV!$A%D4?6NZ4yohAiHt$1yv4c7jL0>6uzavZ!0Q$Hc6D* zIZMmhCnaN#<5%oO#laMWK4i&6q*mjORGn^2%x?mau+^F-7r>lf4 z&tzMsIyD5rTf!|66_H9TRl58Z6p>yPDZ<&aj_9Q^xNry; zQU{1%G#~{aj~klPzMvZ}dvr}f@zc?56;sP4tacjGq+gP0hqY1X{fxOW$(goZM>Nh3 zo$Bd!tSEb0$zV!vbSR?3^MSB;~+6JY0!)1%ub0P7e>> zzKxDPemwc;9QtN|U=XG%?p=V3r1{m_h=;T7~?TT+4lQ;e_~CJKO~Z% z5U;Boa*oJDR~2zq+SmunFQg{9vxb5#G?0z*Z~yXt=p6i^XMSYUpN{8U5&$LIm&hm@ z2c*f40CO7_5HJ2oo-dMEV&1W$iai25Fy*R<$l`h!U~E}AkfHGoie0|jP}@rd>xO&T z>^JE-7rubddqA6~sD2b%4$`xJ3WDvz;;jqXq7Z{q1l)b9bv9G!%Ai83U6FhP0;H@UJYAc4dnKf7>$x|1-8UGUx4?b z3Wap0cdLrotA!dtxOzx$&43o8m$4-k<0r{J92V&Kw+x#v5Kp@CS5Ad@pPr#tpf=5c zngaE*LVU1?m}0MUF0CU{fpRs8O9dmMo5_EHyK*ep%IVq1PlsopJ|0Ey58fR`Z;p@N zzQ(^&c?n^nfZO13b1>Fr(^OFkJj(3ou`CEg%i^;pa_+5D2w69GN-&ZV*d2%G>7|!R zPN^LMC%BTkV@NHr?*pVylCfH(PefHAR1D6OJk%Z>SgPpt(f9le-Qc(cuQ-FqN&zm6 zSi%y3@-kVbkzEd>iTP155n&yHqNgH{@IyZv25uV#FBR;p7zX$%SpcyE#t};ii=DIc zIS3isv))I&D}#FCqI!?cxMp^e$>-hyHz!`k0hR4>Z@bXoxr3qy?G9^xjlEwtlmhcB zfzecU7XqWKNuX=&n~~}>^T#Wh)7 zGzj1bs93g-WwDT!ZLUnYh) zV5u^JZ$w$dq+ zvU7KlpQ9sWnRILwnU>~2?4z3uMSXPB!O(x&c`YhisC(n6%+eOuE4an*BO|-Ck8Yi| z4~>3rKgLWAzq0)~cHgxQ;XPdI7!-?9BXYdj=|1nE`+PIq=eMN$d?VfGMZR8bBHV~y zWjpEojgkScb4DtsQA(f$Fu#@&t&C;TEO!Ry2a_}oRUJmnJEBVJ%>KBtV zJm+A?t$dLz7VWn(Ke@?zxNmN{9{A;;c{?Tg>}0-x>Te@MPs%2LHkw%8l<{KV}9QO`Z&8X z+xJLHHnB#Z^m|X2^g>f^#3VGsG(dk`6G}wusUo$ld8+XDo_^_tM!&C<%XFG}g3FA4 z;&?c;MRiU?wn($j?Ke6<+3Khuh4MukH-$7|KpX|75?(8HDV4js#*mJ6yNvfq-$4DF z<2E-Dc75L7^|#(7(%(10y|nW#deGB5ztP;AXpB0?tQU0d4^`eI!8x&7K<`pGWIC<4 zg9}IBvdc<7)Tx+aJ+Z-<^=4e~W;(?-+b5#vIx5A+vr=>%78o3z4oYm{lhSuy5k0h( z40*Es0g*47l3q$)dQ4U(yLdY_%T8*RH>PH}6*U+%YS?T#=OpxY!ls>sO>a!tbSuK( z)pg0y&o{g{>!B#&GO1!1sk!g zE!lXVcF1Y~ss$Hw#~#i*2a(@q5c%x~k#`Q_grLECMltOi#q>6#nBIOA)6P*GGNek+ zFczJ|Slnh9i`x%l(K!r4qV8LZY5PJ z0`g+aU#N`a7#`xPP+s+b=&(>5g%owR)i-VRH^zmKAVbg-%)qy({3Ut%HgR8p0qFF7 zN$~GW;D2EoY$Wg_%7d*Kp#cT6?u3Xbl{r8teiO1e4Rz2koNt0O_Fy$S@2jQ6W=^6D<%P zD*K1k0)mb zXGhViKb;-@p5p*&Bcr4YR~E|f2MM)7cLNwIS7t0=H8xuXk~4x>pq-42@$U7rVR-u8 zL9{!B#K_S%riF@7NWrpc->d~s0tCZe1bEw+?O?{JK%(6L{JB~8&n+XxC6WcgG%TT0 zT#OLkqkw#fDKX=kq!ryWl#Spp&%X)nbYdc<4FIzt@r*%^$d$Id4kGJV6e9(pUU0cu ztkFa68@zOxH7=5Qb!B8LOANLI1Jcks@U;w$FpD5Ob5SN3W@3@+H_)<)A=OWwe?a@r z-`Dba&~@VAVOK$U&c3W_kRqqY?_LKhg}Z8IhfrdUE7t&|u1Zp`Ia>G?7xkq$H6u$6 z1H}9Aq5CN84tp{zra<%_Go6&rmerfU$}1Ks0!wXPw4(uXELX*aKe!U!*Q4F=H9S6R z$A{(Ec`)Nc-4JO=K*ZbxG7bw46UL3H_x4{vrnx$=6}T|m=L7+m{uP2EQN|eRfO*U^ zWGfz`_d!Hv;3DtCRenV_TP%D-DK1#%Oi~m*tTK+Y2^1<4*m}(_7eMQhWDot7LSJza zIuM&tGn@Ay*P{PP)vNdRNQ1iZo{{3c1(pHTWqIlC#=_w&ZJy z?IR-H_BLPtQ7VrY5KU)PP&(6)?FwUq*X~khZ(`5_s)ERu7&$#U}s&2TwRb-fbpIVBy$B1KSwdF;5F$_Zy&vm%{JElk2hLP%0Y3grgmm~}bHzi_?<7O$Xx zw&JDn!=PCJI#!GbM9IGb!3TcPcTW4wsjkz`$vTa z9RPO8WxQ~ijXR5YIhn=b&gCH7;Y`@e@YjDFFuIlP-9N8^Wd@siCys&rCs~P6%J$;3 z*@}iT6}l`9=T!WbYKqu50T2Lhf}zC@gUq+mNdy5&Uw;&U!%1P*5Z)*iJ|Ra$d!SS{ zBAUcLb@lHcjGU@SFRd-h#HjVX`7umOA&PIHtJW^`-Qu*^Zd zMCFGT9q)$_?*a;BcIVuX_(h`RgkkRQjb2K@2e`D?R!_2ZlM(G4-uq4XC49!~jQJg8 zlv#4>Ah9kUR-gj0%_wB3EH%#sJJ1%oM1UK!cmQH(*G00rP_QGtKuTEHnGz|eWk2YR zfP9B?VCW3z)E9mu*yl$4TBiaH$n6XEsad0-YrD#U+y|+fWYN4m{ZbvzuG`W(AXC?# z>lD+Z>E(bVB=bXQFIZ>b&~qZ2+hxhPje#|`0=bxNB{$3*P9;0XvYn^lrwl%8%P_s^ z_*!Q)qW%D0K%u|v@R($T5|TmM%)(1fYEh*`tY6y>fbYGa$osGfx%6I5!55cVbK4YtPW-|0=F0});q;e-;ECWWBqcpzZWgzFSa?5 zRo4}ZViwUF&2Q$lbh(D|fu82m=n7R0TP9Yv?+e3Y01&9jIBDC~Hb&XHKb`iCd5vzG zNH9l^!a7NotkFiHSA~@;uaB0UjdMvj&X-B&4(GHwI@&Wf!Eh#!eKW8iezozzKH?Zi z5{zm4k*kB&O4y3sD8sgfLd2!L%s-=rk`Offp|hpKOpV=fpZ0LORmh_bau1sm2K*q?-0ffgmNve7?VjyUE+W zAaW8yYJuvF<-c|ddS3;y=?OJp4Fp7j&0>c{M@X%9TdM)IS}&QXfM@1uQC99tb4*mu zw8&Dh%7I;Fx44vx=TV4o_=c$DoD9Qe&;ldi&`;%ry$nBs-UMg2`(nVkuw})%%@*#o zppz?BqCX2JsH3TRwzPG%)Iqno*-Kdx7iP`;z61V_ik!}QUx8IIJ-4@^88F^~pwj1M zjT^FJ6(K2N{DB`#M|q)tFx+<`)!mr&!Oupz%mBc_{*HyBeayu&S;iSgHN>P60q?UC zGK=|Q#GWq3mY9J3d72jU?-o+buO20yS&A3;YcRsBpw=R+z|RuP(0ZklMeF?Vw?aPr z{dZ~}f3N@kyV`92&hpUdMS_BL!cNN;R>r=Ssz}kZw9E}Z&oj1*q!~bc63VLgB+ySf zKAt5VAL}Qe+XKEfXcjr0JN~6+5;Qy-t31J-&88J)3=6!O`>o85n=?CMzqdbm)Akil z8e4Xzc8OKXqH5ZNd(QbqOA4pg)Ags-8pC3me5%V9d8S-3xP|JU1_-;&AbNoQ3yh7; z4et1BowE#MHepLagrGEsznl}sgyCitAsz7vAKGF=JYLeXQHG0sBX@uhCe6{sMnWkq zH{5*!3aLPLx9c(O6;!=s z=}Mv`^Ep?l>)JBIkgJE1n0om@YL-n0s=xd@km-~;R}D%w9^v^0n&z&I-J?y73_Ygp@z6V2>G2`^(A0;Df> z#aJg{=+Qcqy6PB-#uTTzPBMH5>bK|XV2=jfo0T)QcVD+w?sj%3SE{b&C89eB=0qu- zR<0yc172X^ygsl1E`zlrfIFF78PW!h@g_|m&H@$^Cx*HkzRlwq?S@l8%jq)`d47eO zA(qFiV27wQ8nY0xDGNSZiUti@fw zuvaa!MbwfQ94#VynqTIsI1q`WS4O4&OJ2xBS_nLp;uzLaWuPPq!I-Nx+h~$R6Ddg{ ze&!*9D+OJ=*fUI6t7N&#jZC436SO^V85<%K+Cr5OIk$x1K!ipUqYIQcc0lo@m5K;#E$0sad4vc`kaKw5}utT70f)J!G2=!j7{4Hm+@d-8{v% zawh|;Es|3!&>K2cYCOil)FuGrf-F=3EIC=i0HP&eZzq9bHP&s1EOn=+M+0&=%0hbE zGtetUI98=!houD@Qhx$-$C~>|mbh|B*X+WSsfiv++FB{s*(o3$&*uRJlO*4uB%9r=L>McgRx_K|oh8pCU@t!iXQ+IzgX0uQX4|EamtVh}rJ@<$rS%#3q} zbs|$LYZ};Uo#?xgBQ8=3zK&+?Ybhj!P-Jzw0yXm(6^ol3>)JtaJRu2Z2?DF94*3}3 zdf46-FuWVo)kxgF!G)wR`AFKEY%e@j-sn^EHJmtn^DU#c-#|(OOo1oQggtii7)9IC z&39m>tPl%1D8-D7uFMtdN?YB%Rf|kPE*IB$Jrjcb8ennhNJDgzr2*$3ysQCRr?|g5 zsFRg@^jI;d1Ps$;qz}58t9kP`c20oZSR)!)Lw>_hQ0)9hvH}63Y`XX;28hf{PU?aW z4d)<#QHueB0yfewh_X79P)VsD#u$iV@Igs^a;;-$Y%~??PUnEL4F(1|hZI~qOgIPGTOL@h*Qt5fq{{AmnBZ1i8_J{VlbJhVnZ%i{W~$nVOdAmhOtv^Tb9gWh zs(1rYRlt!qwQ-7gjPNT7Aw&!cFQelxW)lQt+o1I|BTBxI$J*L{AP$K!D~rl3t%l>o z_3RC~f6aA>kwbF=%we9PSL+yhv%&Z+araVCBwra8`BJwPJof&e$-vfUkO=4G5-KqA zeAu}AQey0}>R1AjH2#DbGBCA6ehQIR07E=AJl{jO9omX@s**kMPFHl9sx%W?r27>X z1q&RJfy8D$$R-HP>CW(tE98u1NAr-cXG4ZkDhh`l#js2QD2F$s6jf9-&^cb9+_^~3W-c#-gMHs&)q8!!r&uRcZWE3Bw^%Is7`ek+&h@Vg@`KAphX~>9MDuT69o~ zf;8Rf;@baxOqN$8-V{j%wKxN6;VrI?KI<^{p_C`*x^8sp?1(8h04;}b_f091(=UMa z!^O2d3duiGbxuQpnuG8|x=M@=mEc4DzPY}PS&AjoHBmQ=rZ?BaYIjl9N9(Ed!k z_ud0D{Nu*)>#x-157L#v>=-C>3e6!5#~AI_+G)?3BQfM$3d?~e8e_I9>fET)d`^-T z?OiE92w8;j^fTr)1uOiE|ER@l*V~2-O9bF<+)70rMxU^vtQQ7gWHOS`SA0!oVie znmu^*icJo6MJeG!N*hE;PtvrdT(K)RY=aqaF1TBdJ23?`+qTS>QY0Yq3ak*EqlV-f zq5U%<@1X|`!ZQ}vSi1+LTd7`z(8W~g0qg+gN)rK0s1WT58^mg-G3#(rG{Nma@|3Jl zzi)dh};M|}~eplO040~^|IJ+tEq#8!5sxg7Gx$5KGI zW%t5)0(D=aL~OBL#Sw9RuizMESeXLu%8F*4S`j=^x9$LX4^&FLT;s#$H{4VPh9p7A zF2D|{s*Sp<3w*+|&Me;=5{;NP5k-(D_y7+8_yp%X0y($RtCcy?)2_!$WNU__pg@@Y5?*At5wg1#`9eIX|Ov=DeBDTQSI zIl*LkndU>MBPqe8xna!nB3XhQTeu?5e3nwe=qgGn;5sup0~<6*#Q6(2{jgj(PCu-~ z`30$yOjiQB@;bu}1p7=}>S={L*`F#Q{)dYsYu(&F$CvvCR%Vh=(1>`#sdp<)#0zW; zqj}X~J1}2eB*-8CAw1%kz;`iLW(SOn=Dkt7C1_D6bl>D|gV1Wi^vG7R^~cFZZ#J68 z?m-7Lr^1M!s|0I9N{tos5KJFaerlYCGIgbeT5G0#&CUZ^#xC_@qyRjR2qF2VSs!=4)%cFeX*ZK=5B;9JRTE5} zU8I?gHCc*LC03_}HjQ~&vUkvSldt#y@!qYCjM|XlajMpsCL5~q(L5uQF;X8O&S7)=MrE=NTe;rVz!1xo6-hY-kY|$zsLF*DiwLVGBVJwY5sjST3YE z79o`utf1gMY?-8p%oryD#yzRA1in|WIuJT8HftK0uNVE*le=YF5_;POc&j)!MCCR~ zc(1dYHksH1*MLP^mkC8={HvCIR@?;WT)26xDTmaxG1_mzG;(ehJ(!qFp{Wcna|l!i z8%7cr3otde>UwB^Hs2MZ3eo{5b1h~jaanXY9c(DUEo`f^kxY-P8pLErQ{}YmO%GID zQ%IcTTE$R2qOfEbE)r-aUg4z!_F^=ptSm>+(~X*NGUMP|5DjP?L$a;_#vgVCW~(pe z3{?qMPrNqdkiQ;1p(MSg6<4#sxnqAKgh<6M&lEIF_!s~KXv$y`u1J~+<8&EPo*Sz@ zrjOTa6oAFp17I^^j@SWVA1ff012U#aG^B&EAuR{0D}f<^*mh=XuY#-1Q%AJb0AtHA zq?ja(Dkr!I2*V=nf*n_&E(GWYn_5|WcN9K8!ZlOVEf<{~Q-Lv@YB%|^ZfRHp#aS~_ zk;R*!(`KgUI}xQ&XNjFP22BmRZJBK+pAI=5iz`GTIg$D#;+f{O_>^phv8yZz5%k_m zh!a4Q9ijq+CcenUXt@(Wq9&+2w8bd`3{6K+fl#Ssazj}BHE)KBB(lB}HlyZf4kRBL zm%OoNeG+C^G`07i7>%ro61D5j;Z7C1b*SG)l3z_|@dJH1ISoOdgCYgt!G~kB`Tb35A4+K!+963Sad@E7yBaKf!{`=adY2eccAe$f^%CPREJW;b zT_s=eJ&-HQoNi_Zo8vVFmaQ~fgUm?#l?5F*`6YnTg78%uo;acZJe@XA>bdJ*p zSw*bRbN+#=I=%xY&J`AL2!AbvD3~@^1`N;~j^A2WvGhAMdx0FSq^g5mi#F<>IlgZ} zg6KZI81m44cn!}-Oc*R1Ps_G;Rht_}U$T7?@6ZUZL#NrwF#B0D8}m_D>Q(P~m!n=U z2n+OYaoUagzQC#<{yFCj+;`ab%^YGpLC+-OJ=vH=0!9-nGH&4}tNXd*$FA>d0tC*1 zO7d}WS)Vx;>&(s7Q!`fwSf90X#?I<@1L=t~Hu54D*~;VLOKT*|ZDn$Gm1}Qi@7(X` zJ?NG2+)C*+vUi_C5flJd1Eca(AY2f* zq-ex*hSIiXd=6E_t{EcBj&2;bk{xUS0PPwp<=WJLP(YxkZW1uQvtR+|K93aMluBu^?@7b8_kwn)p;|AT`C+3@2)A)-;m%)?=8B0c+%DI)i{G|-&$_w} zHm^`qzDs7b%WW(5NJe_(l9tg*l8z47>W;r~j~Lipc8yu0APc$)t=?{#btU;qB-B*b39}Yeqh5XyV`^M`XzumDj5JLIg@Sn%ZMiqWM`tbJP@aWyq`?Eg}bVKed zBw)I*o7WHlx!%HA@LzB*2p#DC#I9Hjr>bW2*7%^I41-dwcx=q8IBgniFkBf~tP9Ro z&kC7yiV0w{@B8LJNi|%C4C9JxG2R$xV#O-X6lu_KSF$btLOdnxnYGw%Z9}v^K?`f? zLu0ue>SJw=ok2s*w~v-Aw;-=IULT=*P-BWMG zyNW2D#LZTgOL=^XhV1+%^OEtneJ z{jL{@IrSCeddn@VMSxut8M#9el&JLp{)jT*oIeNqEyviYmQcfnrFE6I`6o^(_KX4) zfZ1FHq1c7Whi~${f|V{q9X}69`Q|=5P2j%#SIa`cwFQ917J<)fJ@OYZbJB-eiL+|D_eGUe4<$m)` z_%Wf9?PEzqqYX$|fpiF!H1EzE*SCjAPHAe~u%3?lhDLAyjG-le^@nzKk>@KM+yQAd z9HYd}8hu0BB^%ck|LxdIVGa-9MxRcPK90w4 zPEK6u1a-PbtbYFP_u;F9|C#$Vy$$To?~mVx-vH+$_0l721}>Vyqb&KWqihpRNB{FC znqD8g|Muvk^ohMm>rr_0@#D$ITQt7K;okoIDi+Xocwh848EmJfA(R9k<;~I7VOO*@ z&@AT4-=B@gKODc`--{kwZ-)*J3+M4= zUbH8VLBwYIB|@x4hfYQN1Tv?|fRRrPAFRe>D9wYF4(L#p-a{jFVr>U}1yv%`Bb@i$ zC*np8-$9B}xc6lD*$5!c1f4b~7e0D38*VND_FkXcm@E7^P*d&hj3~K=ruKU2XvVp^FZaE$Hq7RP5D^LW=W<>65jf){{E?_ZbYBQN zqG$_I1u#}~#!$&Dr$GJ|%sEANXjd$~v(C~lWB4EQcIt}WIFGDTC&&qopiERN#zNA`W5NJUm84@-tU~4=*h-ybOqS7dcTHK7E zU_|C2dfA8Cm)00C&TmS^qS47oZYt*p&2kJ`OOR@*d;JNF4b?iM5Rv7*{AA7IT8YK#fu$*@+Rj`-%EM1bQ?#qTc$a25{M39_i^h$A)u4u#DHYk zHbrV=$pzyTQ@m&+;MPSz5XiC_dYn~EbJ^VIFbcqN%s4YHN9EBFLv3HA=NA}DK(plS zBVKQBGueH_mMio2hm%v_N4PD;$DG4^1 z7%NP{zOF`t_N{qJ+kheji6s+tO0i}=;7@U(x&52EeFs1$#Vt3M``B(Pp`fHW zi`xR-X(cb9K86P3`l9b!iu^;DIkZC<1YW4WwF#0yz{i>|J)3re2xwqJrpOklg9;&+ z@oYSn;3eNr<(?x%yndypa)(DmN|QC2i3FzB_pT+UT#pfAjkBQ2qSob@Y3BB!fD(a-hGlL>y+@ z)y%VTD`DQ&cHcsnZ-!g7OY^J-?S=IixL_M4=v8#~-N&PY*W-UWIeyQ7k5H@Sf4FVn z-ZishUitLltnGshdX%@B=s#pbUQa+0)2- z!bdIh`zRdS3G6fm{Tkw}2j)L{G4Nm7>7D(si^k|dX-vSbizc*MFjmVb{*s%su7^_V zukY37s0W?>;9XR#SJjrCwZGreBN*lMfi$P<v*%7l!s{7oXvX2Sb@d@0Y6TZwr!k9~& zYX$&M)==z(GetEcpBcFs|Meh;xNY{FjdlA&Y*+E^!Mj(l4#pw#96_MQU}1Rj^rL=;mKNyKB$6v+@0b?hwo96v8bPX$w7MwQe4h}Y+9b7>cR{F&risxn zl*C3Q5q*U&O-il0v};wEp@8*BcH$si}(s9An+XC;GB9Sv$*3O*jhpj!sk)& zkAH&ucK74cvxCDwL`JVZIfOF5umAM^;N9_Ibo9rwqxWZzX``DJ=-A<1`+G;CU3LV4 zDBNO=t*gmK%daz3e(|eNPemDm?=-8>Sap>Uy3R5|vmq!kl0;$lBU^LIq^_2J1b_hy z&0#nf0o|)d+jktA$C8sVOF*kc!MskXE3#YU3xqyY#*~_^?sF{$zUWs!TLtKb7ZNFh-hZYdhev!H%kqDxtyaK3S;9Jedvc15 zb<}c%o>W{kl#(hl97rNAJh4kKWMVqK}4I9KSyTaIMC(?+-p6AG~^d zG_73aKRa+z?pIhtObh`fGrR6Big6j{P1G*H7NdI z91xr8liiW_M`fdU6cOxeU~N9En+0h*0JMi$`XxN@o2$XKY2dd1@E`vfQRn`{ zfBdrsxjLW#jZ*{y7#*)2pNpk55fJ@Wc!i-uZ8X!ci; zgMSZirqKq9meg(AEZvMEZm4a_x1gxJ&ZZYdo(jfRKBSqjZrgF3-eU8H;jDY)qDf+KTe!P21 zhJeqRPP-4goV&LoSl{o=3<>hmV)2iEIeHGQ>~@%=TUFussc(8-yC-tqL!4ySihasb zR1;50z#i#_cAsEFfZVcP4OtVJ7Z8U4xT=1WZQHL#5%hBiW!MqYpz9B)b@0-tduWVC zKxY)iVZw2P08cm4Z^@%+6c~o_`yl>$BNBaFXLmc@bgL1P3aSVM#ZepQ89X_{ClJmn zU!A!Wu{$M4U$REtArufrQp?j(M?*`{wa&XXl4|H3zu0IfBb{P;-NQX-_3fLZ)}dj2 z9#o%_>I&rhQ_h!wYy8CQ`6~P#O*iHEMsMHg3cOC@8Nz$^e{HtIkM;#5F zC&h+sD6e%hU6DG594i4v!Ip-OGJ1xm>$SXz#t+-aT~3rEE6KX4dT_FgCW`2Blt_n` zgO4#+DpUl1L_`I1Ls<}d*U-~F8lTD>@Qs^#ps&3r%3OHYqjJOmbmm_ZR9kCPe#9WQ z=4^Zig_=gHq5UVdhRU9u`GMo|-hvGLeVQ-gJC&2Z9&{rwHxEeLYj-@m?eNV#l&IJ4 zjTDO(-NrSVuifqGwkLJg$HyL=>DVq7vq|^)4DB!*m=s>Al0;Yoo4)P(wisJ3#bf$HTZe*_#v@lHZ3m8E@RBT7Av{N>~IJk~ohg zXyI;8idAwXD0zrc*6SMkcu<`PuQf273m^Z0`5cm6zRe{_Jo-qSM2T9$ad?ZBlZM`4 zD!+M)5}s>{TF+~DK0(+IAq#X}g>NWooRr5?E<<=%r0hO`n()r>R3;dkFIYg;ZdDJqdbh6+k!Mtk{qd;;ViOfqHG!LlKHKy*v6rWuomW z=WO@dof6ioHR$D&`jW5K=cR88eYVRDb!!bbQADtzy`R<4zEHHmLbN?as-ezNKD26t zWc8Ywei5?ld4dQxJYwTt{P?}i&oM4&6;~How+{;IcYTm|{9V3>OzIs#r);_kIL?4F zcu})4P1a;nzo8+!Xc&svwafk)2IciXy3-kYXXNKe{$+@u%@K%~Ugf|BUfcJ99+34iZ9N*55`Torx4#(Rt-R?Vck0?r~pK-4a zMX`;*@KLuU$TK)=3-{5TZlL#YJ&BSuWY5<4CX=)Kvb7-!=7qT*-)wR~A~U;n*2^6q zSa9RQ-zY6%F%hc(j%#}nvyHobAZ@N8qcF$w#P_P+vt8`PK8=dwpnFu&2NFl=7QX}I zfepy&k12bwh_d}>EmU>MA`ci*rX3?a0(akW-ThiOH{@Z?{09VP*v5FVfvJ9= zit-dRGrdRvu&3qjkk`-%ddRQc?TCEY@fT-4bh?5X8!ow{fDL&twvCu<|5zBzt#vLUwVCwOzT zsiA&#pkE=_Md9G1xqtFy_@00qzExIk|AOdv?M`P$0v}+zP*g-|qatn;3xQsRgq?5G zPDKY_BOR{8SOsrHN0;#;`cQx{@;1*`+%RRXugFV?in?NKon@nH*(Rq zFH9#q1H=*g#oeye(TBI&nWQ(&%qa@R8)MCMAPA&r9F!$Q>)o|ox`!IgQ14rCe~$jB za?7cC5G~@=V+McMnJ#Ce9*WEz zwJ`d3m8@1hH*oE>mTuwNfx>a`{dM22$;qA|olyiY1FPuA9;d)j%>Nhh+2 zv@77KEF35ywI0OzfnU4Zg~v{!Dvzi*DR@P*QknX?jF=v~F^Zx78U^-n}8? zb#<|h&FcB-R@qe#8;#D!xI@5X8~+>)66K*nIDxC{Z<>J5;oqW;sD#gHTs;0 zGTG!n$Ja#WZO;0G`q{rX;>D~#TN(a5R94sbuHcK!RBq8&Hm5HAki?%U);B47Hg;c3 zA~`pIxNz9@$v<|s$(u6E}>N}fo^<{%|R{xuU-fdw)z97nhtTK0AwE$o7cBrYXFEs=AJ2IFn~ zFw_w6Hv;||+?-X?9&a?%K2yCscekyf2w}S-th=MA>*2ZK%NH9Pa@6%P?|p3OAIDoQ zkczRxIz5I_-qi-AxQ}>ZSot;wfv|Bc4Po6^iVX?&WRDDsFJQtkKqYt$J)?$Zvnch# ziz7y$A9pz@!`CSxe;0SftY7R2DJvbs5@qa@9Y37g_W27YrPyN29Og*@LaPny$Ls8F zZ`649mvvcLXsz+X^UkMFTj=QGqW4J0b2Jk7;x%k1KE0%~h)72Os)YqX#Vl5D{E$l~ zAR~T*08*Aq?d`jU;Cu6GKlG6ID%c&DDI_A??S{cV%6K*Y1@|sxyTpstMLdCkyQq(v zzL2neo??K{k5H8F%fF#Ae;DsVU%W!$-^!qOB~8!9xTn}xvE-!9N(TgXlq4jFko50iC5MFr`bFD(+)&}l+ zk0KH&>=Sbu(#;-$SM*xhW{KUyQ#CP)D2a;W+g=n;cWpz<6iiDXeV#9_S8a>d*ASTy z0AVu%obz68*w@e=E8=CL2>x`)2vc6Wh=%zsg{`$3Nqc zVM7h=<3`7xls=rC%`NrK(UWJcp?s4irBAP>i>s-l@D$HbVeNmYOc|atj5)4DBMHVSTG5Rn`W9+@dhw zJt|+dB@vtXI?9_0%oDI4U2VuQ@l$Ohef@QCPg04y7>JMaav&z=U1+{^&P7^ zySp!ag79E=#b!MSLHj;ISEkQyGy44#6u#iioXyu|uc)!<+IjvpH?)lebnoGTPnei0 z&DNW^POrU^uC9D_9d?;mly=cDxz|k!&=44*#=jUBqzj9~hsiE|D={N{`oe*#ZRG0@ z0YAo-0yas_eKOcHX=ts4>^-t16nY1iX4g_9IqfG+)Y@)mSjfNPZe%x*oZF`jxo$qgGGJE4z#vwsa ztTf&2MDOYOxrob)2*FY!qlhKl%b*VvHUzvhu!&U~x*c7vn(OwN3pE31RE-jhFxT2l5m z&dNRc9$(6hMYVM|LHYF^-o`mp@A?IeWxFqF8|Rw>H}0Jdo{y_+3#&q($7uJdhT|>GA}3Lq{x!KNIO8rw z_$F~#MRA$NS#*`oI#b;H&gIw0J(Jm1!Ci;z5)6r)^ko2>~@=%30vgD+(h1sCVr zWbWv*b&S4*_fmo(y^`MpF@#us7Bq^6d@k1 z;qqPU*XK$h?hBjLc z@7Gwj_q8R3s+o_&Uzn6dQvDtHB?&16h}i;c_#s5D`67=i!;Uh}t?!5xGn$oe#MdW^ zSVXazV{K5;$kzp6O&eLdtK`5d79QO7Qaz*7g!KhBhClU)Z+pxrsG$uRFTH^@U%#j| z6it%zv}2ljDSBCNDCuU)eGQSZiyOis>f>9^5y}>vS%69axE*J4F^g<5ZkzeIIolQD zm9_|e>y27+4dnpDy1MPE?Z1?UR$F2GbvE=A=jeR8mA#LoZqzYL7MU zYl!gHR6~H{w_Gn_Xr`SxgbUg=?Q7^+eP|iV)=@scVaW6IXMGI`O{*eb=A=BeGi zB7N~kt-sa@QCB^?Xk^RNgvr zevgttAh}?@FbWWhG#$a}y}6#xsUaI@BfvLplKMS{+w4-zvm)fmOmf!2itd#VTOb;jqjL6f_zk?7mMEPiQY@;ErrxAgoMJ@6*lYst zjd^`e4Pix~jeu2oz9`NAhToaB4PPgh$-)TUcU&egH8Z?1xA@*;6=Z@zeAu{)HzU$f zLmLeWeGQR|ff|aEpA6H2+K6ZnXc{s%8?#b@=jq3I=)rg3K>3t+R|J96J%~*A40-b0 zqlG=B<6ndpx_%uk*=+TT%?mjYEiK3~#=q1W`LvY1>h^ul3raSB$t!&hFb;#97Jub`j z9ox;fvs6FODpilie|NL<`0vD!4}agF`fQT>C>0D*JvYyDpZY_QOr}$=gLh>#6*zfq9g2iNO z_v}5zI6dQ;Ight+$8WAs*b4*b+TRQYxX7=Pq96HS6Yn9LnQiFydN~E)EFqI?^S%5K z99~Y30onM9k=S z_3qh*oXNGTxqGce@Ak0y_Xg`^pTFm+-_Y~kmULU`D-!MgHMZU7mJa4#x8#6d zyS3&t);3@nB4kgfyv zAeGpV77O^(ZS?9v{Ml`3s0%r$x1nb*R714OBQb=HZ(^@kcSNJ1hML>g(EiiDhW55^ z=;_O5LyPot`-I=)X@9ogPDiWqfA8oWLpO*!Q^kC{Ug-Q8$8P_5!1l?6#iI7igxU)8Da~xjrLi^L?Kblf1mU zdLiULKxu6YsK!2#?YV0xzsmY~Xm3L=T|*nw*L$OTP?kWm5@1^XTsTW=D9`4LbXsw8 zLfKaNw#*l6|1# zgZieV~KOenh}mV&$uV&At+ z*iyy!!q-Weo@enLl0&Bj$l1c-cE5EpiIHGdz|S=E(3sX+d3}4&8{W{8H*E`|K&1M0 zRQJQ(uWNy#%NwMWQJXvPo=JJBN%3p4lpUnpQxe+#*9}q@*Or*tGTkpJ&+4=C+4PV3 z&Mm2W_q#w(ziuI=i!tA`N9-w)Qj~BPZ@7~C?$Etwt|4WAYtN70oXv^#TBGyC$ikOB zT;jj1lj2%nB34w8IW(W7MV`U&yHj&8)}{VMljBKy#emSrNh!HP>r z-c=UMb4|JMhD@%O7%(Z$*2`6UGR(abv#W{OfT?ir%e3zi^ChjK?uwZAO$=X6 zOiY@s`ecCnCg!Pknm(s}WuWeV&v-LqWTU>Rx%WNuL=&^YKy>fROyL@>3w3{H&Apd0Bj{vPO64B#MJaRMC^td z+Gxe=ZD`LnwArfN+Ym~#bz3mr^)>-@WLB&-Wax?@iFAAeo6?g#-4GVR2J35kByMj* qB0%4RJ zQhj^#e7%M?M3nS+0=O1Jku3AeWMkFedoKC=LXonm>hJy9bG~L$R@>BOzE|OgtdK;> zMh1P4!q1akO~>BvH(#S2#l4>L>HcY*ZZ2{15D2Zpx5{l2h3<8&_g`8{wx~#de{22p zg{9+X7INdYHhR_ObJSZgXje59ZGgqKVWNsV2L7|GOp}yl`8d7ii5&_}R z7V9ixZF&65*&fW&*NEvG)q_fxWsK2ltLZPrf_5pSs*G1#g!$ih-SS-_rAX${e!uR2 z&mad+g_hrKp(5QkExc9C7MQ1-vKzlMOa_B=@_Bf6y-Kvazsn6>CYx`Y{_E!JMnh4W zbp(#}HADeB*w7*^S6Gg6mUd8e8ebx^xY>q95*{y2uOr{9T~05O*?O@lfU+-mk}8=J zzU|KmsSCfRp(SxKy)b+-ulg3Q57q1CGioTA{qo`Cdpsx!`0lkl^+kP?Iao!G_X!%k z4b>>pA?OV=b8iV-+Cd2d+4gF}8&uC-9vY;5PJa%d(~Bp%p`QWhL=aOTWR{cZA}aHB zF(rks#bVHx=eW<4UCsZ_QrUr|EowjX!u{-VLqGk!jSXUv78}zwdXqI!04f*BHYlD} z=)n>WBKO>>85AkmLi2i1QEZV{zx-XlYiWrl0D#xKUVRnO$UmSO>Xmu>N~_f=>M54c z3v>Chuc111o2w;YLs&tPY7x7{%5nI!8tS-;Hdl?qhL-W?b%x^`|GZUm4Rx(tUqgF} zq7?V*_;&k<^muG&!??EJM;jxmx1A$wsF#o2grdHUz3t9!G}NGOiw%jP#E2N(CxiAx z9&bY21ZEL=A)|6#6h~vHaVH zN~|rsGIwKJ9)4d#WT2FWu=ZCEEL~4S6pn8j%CicqO}DRHZ$sW3eKukw1yJ6&pV}GBT_)W)1HD7@CcB!hj8Z&H7VS6{ zz59rle-2AlRsDGuFudZQ?Sr`)R4Lw`btZD^Zpm!5|Bv_nHbvzi^ZM_NRSrl&{PFz|#Ll*e@*J9S!M$dou@Xn5V7Mvd zigX&mdJ=97d^3g55r=-MMBKbR(|)8 zB<=0hN$SDleHfDVpLitoE4GfL^!`{fnOYyP$UAfqo^lH_+jSgd7Yvjtdo0`b-c@hGzjEDtzzy2aUV?*7WPfI z;Xe0C(o?-!>#YBjJq$zC7a4^mck`e7WIx^pB0{?P&jYR2*A0@o57)g4KrMuHCOACI z+&p9T6Q}@nj{rFSeqcB3Z3gtMSN&kfeIW}JV_B{zX6b*)(gqX{OLS~BX52eqr_izY zi_t;JiiQr*V>cO7`g~^WSwPH&XcJELLjY7WDdfQG#$oOW!`)*!<+@zt=YL+z z1IWk_zYWjditVpyk43xv2c*xXL@sV=$lP*$MMnGfG>Mzs&~G=4uCJkeP0??Ecl%RD z@o3!8?|ueF1jNn_{r+b(L<~e4`WZue&da}5S(E!OYC;Z9AZLrRCie{YwM(RI1;=@> zV4S@BwgQ3L3;|^t+6LL;ep5U5JxcnKE$-22_cgEaR%r@-7y1k4SzFzEJ+~eQF0Qw_ z&-*WQ;t;FV&#iz%>94k-+gHFL5yOb{=?p~Pat$qZ)fVf!vgqz>X{b$3=sOS;O>?;k z1(yEw6|16~<`OmcU%Vb7-3@@D1Kz3);ixpXg8-@Hg|0EwdtzyOfz)vaU0tMAQkr`&xiz3HLEM4{yG8yWK?u0G`MaGQlA4he z%I&2bAS1Q32p4A;32efuggm*}rTe~4{)k1k;Ko5_|w-AX=&I{Ma-k; zJROuRyyi|Vvq%UjX<+{%HLNMd-LHQ3(oU`!p9anO+#*okGbyxj^J4ZhOXd=YJ2dn& zOXdP#U-175-XODt9Me&n>UxzDJBwE6W~3jdl1LLHZ#*-Tw5UNG``tSCOAT8NuW% zUj@Oz3eljxgom}}g2!Edg5W>=$A8AM?*HLG{@D!lU6QTGf%(hhcn+e|`82u!pqsAB zx_tr^?aaqhGD)J(^l=|@OFUf^$!am`&`lpZG!lq*jzn+-p-Pqhy-&TLoaB!YbXUqS zbPlN}6`x^8ACqiev04A|ZK?zlMVNNbKQCxNFmIh3(TT0Z=IrIGyOQBhm3(ZNkL9A> zi~SHtN>rijaRS0Wa(Adt(M8g6hEW)xZFS_*)f?)NF!~yz0PDvHOx$~@sG+nlhk++k4{Nf~E184BrAQ8@QT#sOf{0 zpi-ZYA>;M$W3|YQV+gv;KPQxEWX>|u)+Egy^<(oo+cIjawT!<+7b!qSUEgxqDP$2F zB9NZGIl51q;Y&*gTKgin&=@zcK~bNnk36oAmpNJX_z-Ac)*0j~yN(T{lLIe%vkMeb29qn#_<}dAtF5y9c0?r3`7P-!a+O&~Ck< zz6g^0Wnz1EQucdDIreZeg|fTVt{+pCinutx>|3hSi)0dmHwvMFe1mMWp`N8;0R;m! zL-X<)E6m*SkP0JDR*yGVB=5fV=&sR-L*30iNYUEI7@09k=J9$_Me{`-SDd@z5w;m- zxThh#Y<&$;!Ij4h--ec0BSLjd(EZ&G`{XToi~w32FY-R2otL`=7mq+`n2Xr+9oV+- z+oiC}qq;6pLJ@7m-c{Zp`$k1(!N+uQCfPJzmFxe1b62z5HV%aEdI}yBGTJAq{z|6`c{Tcu91(S~HcL{!Dz6>T{|m#L@NYC68R**pt2WJv5CGn$vOiUq_ z^m0;2JutfeNs&IERLP)M>(0at=-P&@=- za?m^xgat3XK8G}x4%a7UD-cLJUZ09hTpp?2>ytdG4{AZ~^%>axfQS9LEytkwC+Tz1 z#>Q)Q_u@L-W-5aRCv~A=QJWtrkfn-$ih~}U;bmN{=0!3O67C$yRzYTZHzf#}Y6(I5 zY@h@oMY)?b=m+;}{tILD7tc!-26{M}D@??t|x?C$U{8)1E_ByH)f8O#L2r*7p7ky$9!k^){LE ze(O-fM;Khmi%7}(@cHc{d&rluFrg|s&qnk_2)cDkq6Fb>92sC(Z&p<{jm3FD-jkI^ z%-?x^vzc;0P-*&T(i?)>H%1E4Q0iUfj(1q}p-p;BezIXXc( z0YRi&c`Wzf3cq^G&WC@DODt%7kRpoD=MF(ioRDrI;}7Gr-~|Jxos7g?bZBhK|t{>fnJ7jpL zinB|rP+YC5vWB<`FyIdLW?xC&tz#%1jD|7#uws|K@+hmV1UY;c?tB*y5(yb*q$&|z z*~@i}juE6-!tAVjU701RGh^lc=*?r_Cq}N(m1?O_2$|_V; z!&b-UaSps%5PfiUpH~SF=?@9A&B5@Kuk`Wycd;d0UtR5a=sf7-Iy3g_7p146N3E%H zmvYNl`KSQ&7SqmuU4atBt|jg!4q4j5!uP0W6cUr+LGWV zTTSahL+OInL*2u5DRWnYxp`7)N50Meb{8O(}QI&R??d6bt6IC=?_qhM#e zFEYK~KYseiV7FP#=I8L=4|BH5H{bsIy5?-G)YuplpVofH@{C9M9KPiRXIY;06a>9J z*~kSv6PF;Z5ZNRAf=xChOJox;WLXJ@P&8iVvt+(&G;$%Ihyep=hdg_NSBYoaqyV{K zIu)G%Bj}G=T)le)6SSyq4Wc~RG81K&;3b5&55LB=at){YCA|9EEzhC}F9o^sGI?5* zY{DDOjp2pIRg={Z*_k#P&>}n&31!G+2f-T&MrYY-!B+9Q#P7LuoeO7z+)3jy`gKv3 utI_49oHkg(3cB!#_cLBz{&p_ktk_JJiFoZ*TuvALDEc4wXew#(}(_r^R@ zB&6aLMQTZ^%9lP5*LI?t+Z@~U*gciubh%6h}|+N*Gch* zGp}mr{^QjbOU&Picid&~nA@xy^#{$nO6u0B=1%*lG`3^YRP**Fsg=`gnpQ2}InKRO z8uPDz{_l^Q57%FB{`JrQbLM%W^eoE?SXxKDOj^uzWH~fhk<<%SY@AHh`7<`Cw?SNc z2(hBSUVZ&(SE3j2hx787r;pA{(hTBBTIVXMOSQy~y` zR#<0UCuO@C1lMtZ^ser{|LykMpCmqFM8EvFxxRh4Hv(-YBzpVp)17;L`@_Azxq7(0 z`{vx6L(0^%Dyr2|mF=7RhYvpA3B#Ugeksp|C-)4E$Y|6Awnp|OvJmzNT zTBWcZtq2$pLU{earw{jEoKIRw@Ou#PVc+`j+^U2|-Y!>#BK6Q5woFEzXF1RFk|cno zHZ61({QW@6e)zuKz{LL>W(Ew2U53n3TCKzRRRu<);Z$z2yoDM=j%rc&(?+o`-~3SX zW25e;s%p!sRW76R3!|RTm!w>*lZC=r%~h>PkSvb4w5n1nVt@_Y{8H(N<7PVgi2YX{_f z%Jn)pkK;k5R1ILW&rY!2wT_K&XUQV+*bXz*YVf**!`pJ{#fA@jS)IA$+c)4dtCN~E zipzipBf~J0e5|S`8jXFUKA-aj=hHdSUFD&>g5Owwj6q~{yM0KqIFwrQQOS{n1&u&Qn${hYoR zNNayN{D4nqqt)@#y402qH|eTht)sf}z%$d_U|-lc9qLwuku*}gPoDL*Ax<3J?UM9I zL@Z#(`8LV3atnyug`nIlC$NvLYVcn;B+_03eyh=sbT)6dQc50A;WiCSxW#d|k7cq{ z?!2Ft$RdA=JtBa5lFnz7bSbuKX$Tq!F_No;?cUUNRl}e9As;(p(vB}=Pj{W0+{%E7 z(LuNQax@l3z8tQHg1n6#^u16HrT_~}iu@mA!}CR8eZ(GsR-qUAS*yJ-tyenOsuoXw z0>01UsS_Z58F0P~_Pj8DgljZ@Gfx&})wGB`zN)5y%3u*eV6PrHV%$ANL5lU4s%I62 zGeAU zU&IcA(GLx*sME<1CS%U{JA#|MQJR5s^{CP(a)_ZA?ne{jKocANFIW?` zX}ItwoN29^w$9V`2#qu<{WVGJij)m^l6H_fsO~Ac_<%0CZ6pxn7zNx}^;ib5H6ivl z*ZZU>WHt=br_=qelZg)MJirYBC+!v0L$22~316>O{aPhDg4;$hx53m8m1Jh3*kd+o zyj!Uf>@#yk-gaTdjb#$Uu;ln^U)2i#yNz+jhEq=GIVsi&u4#7(y0_aH*JfnHl4puJ zvtj!`p^e(}&F6WVBaYhOlBZ}d7QVHOYc*Rh7BnyJ8@cx*F2T0mU?`3chLAjzMCKzv z+#kCwpR2TsVB$df-lVU6uAaz)bY$9{VpCzjynT-LE~$_uMm82k%*1;{g|O=fvPR|JD=4)zuC5VsS=Gej)rBK(Hm5KKE?a8su6 z%LfZ#6mfL?&tP}w@Z}KhXvHXg|2mU$q5F7U{XA^OF;ZMj;yU>PUF9?^QQkB zsgm`YxSM$FP28NCWbkhU4ou*Akbjg1*hm^ZA3Qky9uKKdQMFFe+mk@#ZFO{mNIg%9 zGv(?@Q5b*BL`<%3BCR0T=k{nUW`_$&Hx6tF@wLiuVl~_#uI;6w@Qg_r*jmA#MKv># zS@Du=8uuevonxFbRxAS%2IKRvA;)~7sR`oS^Z1%KDRRZ6RMol}-)gr_v)25=*oy3< z+8|ujho#Fh_Y{XFHLRY3dOo_n>6#mgGtB3aHyPF>nXWb<)`j_+^a3;@42@jALxc$M zUGgM_^DR%G%I+HQeQqpapYf`vA-NZBIii8Wco)zV8%veBvkhr<3+m7p(Q)b|qguhS zS&1wbY)S&l>RC-w#=<5-y&O6v(={BNWHfbc!wL=4=bixi7I?y5jDIHejQCw4Pf}fx z4oNpM`U#H792cUyNKKLkFxVa6)*_{0B=N_G=aggQ|G*Xkj(g=eD5W(QZjbF1Bfwod zp-fcfcVATUgxHvZh?>w*93DrHfi6XXv>4y>f{EQ@-!-xXO0Q|_zTgvkn{8UvAnGm~ z(j3*kC{;pg4G{&=lxOQ5L$e|$+;pOWboqpMRqKxDAu#iTsk4AuEvPC^FyD`+cy?7l zC{BW;mK297F(8SivXT)=w;JQ#wgf*gH=4HNIFKMM9pHo#ut6qqN z;w*8wUe2hxJEs{9`Kqp#eWV&hJdR$+g@^)wLggBj)aj#JBlaR->_=>T?U*nwlzwPz z{wpHdYW8=SC*`Ycl~Py~21D%BJ6h7zd-XqSs_jw@8Oe5F@?NYInl)Zb(<7Zil?$Zq zEW#m+3-GFF2^<-*9DsjoR6E}%`JIZ|%!D2%CrGltubbBXod~74giss5`5V0T6VXOg zgg&gaSfW)gQp$@>noqhL#r7IKEso`?-5|z6<{5YwEt0^Lom>EhQIIK>_%DdKEu5X6 zLDgilNMn7r7YA5ORt@5fB{v6uOp|sW6p&unI($p&U)3Y6jAg{USD#egGotqjpYy3T z>q^EkBK?-~Dk58jYQ z5%Y@;bD#cqVt}mpHB(b&@{8z@XuXCmtyUW%i+p~u#^~cYq65eznSH7>ubrQ8fIrLp z7mXs|-L0Ryx^R@3x&vWiTgLdWwW>EJD_M0lPUI5Ld0mxS%-mz}N)sVu)#Sfi+|D2% zptQ-md4i$HpB}J?wJtvrEC?p9Zi+a1AmL&*k?Zv9bXPz{;Z)RMP|g|oZ(lk z+a4NoaT=7qkqjSioyeJ50i$aq+GIqlp*GDL9Vd&=+pAK{8I+Fro@g6!H_>R0$%bq(N%uzT{b}R{{?{P0;A~U3z-wfjn`L zk4f#$5Xe6fRGyMu|EJ4bovs2N9MgIOhd!?;k=CL{@+wYnUaeG}CXIF!$P&c~tuCsU zF;;{pghsILr~{vg(>OO@lvS+{L=&9cTT-kZlNnWQI&c`CP^3IlWZA1ngO0_C16d}B zV+a;9c47rDkGK=N1X6=f9x^qjxmne=y);63EPb^4seZYg1!`=-PujIE9qtJ)q_^8? zzeKV?6ynZmO3RG{2@yh_*l$&5djt{VCj`_`cu%pz9ufCX5K*kKPasZNnWwroUorZZwqCRQpBgNVqO&)0ioe%9mBr^$WBVD z|MNcx7)H@~SA+O3DX1riNpXID;>+Qb&LaPlfI%Fe2WplPW2bJya=vbi>T}_pa$ZLD zsn1D>n4Q*ljq*czUdc5wJS8L2Y>kRctza*l*aIHEEk~6ZC_6+mfo`x*S6dqNA+sEz$W0LCbgo3e~tDaW?hpo9(g- zSTxnBvs};T1@JF@_nwAhdfQY}6%GE^`K*eS>E`Q%5Rf{XqPXsB?K{8d5mPrc7I{k9 z2M>iseomUluEBF$Lgy5Dosy`|kRCzn>S{U>*i>-;A%OhZ0CjO?wA4OlOOrczokCM6 z01=G&BLI^VrLhrjYQ%g*-ei267}_yTP*G*Jq)Hg@p>IlLKajXpOXr)ew%L|N-O(rG zsUW^ln7G!II+dW6;}-8%KE-lJ@1^J2t|Mw{KuXlT4_~V!>rF^{)a!n6-GIqw_>~y~aEu`Fk=4m!fcUoBwBv@<`)!q6Rpa!K2 z+7;z^5^FRD{-HUt25No8iA-t9z$mb~bkN{5fWp`w?cGY5ZlK=tP!=>PY~31o^Z{#R zG0+KrB4MPq@{LQqnfh@=rMilMRDFs-H)J6R)ZNxPYl7dBa=J86yQG3}mJpU6swY;W z8=u_%%L13K7N1FP)bF|H2Yg(+{=pL_yhcjBr#`H>cZ>HcMg7`tCtA2>Bma6`Y~1z{ z+TlwU$x#(qXPjLZH1R@`>5aO*uDhsi9|>UK4ZRqUGrS~w$K|Isz-)=S6UL?;zG!HXmah| zI>xIrC~)ILy^cORI0k~Z5_>D_U+A3=!_z!&LHqP<9Tq}uXpz1#^}hlo#j%3kKF}&d zfpV_8+>eX>SZe04)?8khncEZVEJD%+v|K9hhH(Noicm8+*J7a<8O~qlY zOCL13jcy8at%VB4Aqmsqme3h$)iW%S!c0|&le$rEsY!J8skcsQZsiln>NH9BOfaH}_*t4+UP4(1 z8tPs=N0XYcVMOLf!G%-pZHz^xbL=eT{{HZfxO}a9^HSh(Iq|{NL$BIb)jn2P( zvRTJ13983A%Wijs5R6~OJ1tbw%bVzIdF&h=wV@3?2cQgXWIRNw`NZmCAugL`rPPx? zSy1`>QYyVRU6L;=m);48+GoKlsfj8MUqhvHNWlXhdY4gAWna;e27VY_MzSu)3k-&D zHSe_AA4)rfM|_Pg^beRIl+ncsTIS8;h|)fgou#bkZW{<=7GFmAQs=E2DXrUTl3%Fx`iqgANaC2i=HNQ@6^upvRp;G@6%>VpHaMUQ=irPHB1rZM+oiTT z`T~>*?=>qjWWzTHJ3)ss`GX+mDh?Dht=9TufgM)~uo(I?db?iLh>Cv^)ZTOhJY>U1 z#a&O1jfbS?*;1)#hehV}q=%yL*btQv=#z4SFyDSsvIDt$R`qkPUI-G|$@jke>M4j1 zA40wzK7Zv^(SI8zB=#+jEtURH5&AER=+mN1>F;fsILx7YcKQRm-Mt31k#~<^Mc`Qc ze`VLw<2H_j@A(t!V={mdN_^+C7|iZrf!)DiGr*qxP(7;-^TQTRJE~gXesr3IZhzGOymPtLH!VN$#?*H!y zp9?$~^@3xR0Bv%iCS!CkCN;(j7ok}7r2m_qYegmQ0VA~1^#t@=lR$3|=zH9$0e&Br zSOOq{yPRXXr&z7g2gq2bT$#;(wP}aF&N*bpJbT+Ud%(hEi*grsF$a&IZK`VO+0E&7 zhY_;_UI|;ClwLwnpwKcI0cfx)C)LJ7=p~skTB^C>5_WjL;ZVNZ^RI`^Em2Nxkt~^n zfdVYExS0l@KyqjZw=HKu{)#T$O|t*IW5QHbWyHdYpv!Huc|wqh@-PS59S~%N@S+Sl zw(v^eGOs5vm+l2YuAXS^a@?YqPujZ5%0EnoUY!~$9nt+*VXOFx=a4I4fYs8(6Wae= z&dtxE0FDK@Aj;D0714)wD>6Pxiu;7bk&w z@df5eEoPAI56n5cz`IRX3o(tO^qXdN;urPI9c5?9Uaj(2WtiySklzJGOX&?W+J6wJ)eme6RewIdk0yr2jfa6Iy{@EA^ypb&GQ37Mz!?)Aku;l`pCdi4FuUi}U@ZxnX9KzLUzNWLSl1k_@ByI7@i_)(hWC*7Z1W=OZQ? ze!At9WKobEd?@$8gO{9GJ%L`WJ1o_ba9BwW_n_F~uecR&u%AlXsfl`NVaLauMpbE% z%g?xG1rZEv(AjDjC8B}v@Rr{xv0@JsVpDTPls``G({4{X38wuFMODK&(2h#<1rX{! zn3QvUC~ypS7yWMl*-EMc=yFJ4R%Mo4M20dt0COT&LSTS(G=t7?jMrDxW3l6_ecE+r z?6pSS;Zwr-z;R$iEjjQthwRXW6M$Oh^wEF?dnptj>JXR}uK`HUYnI0i;7pxUEdwqx zq&B+pWe~BWhAl}H8zlE$I$$Tu49iu36 zWgT2G)+jp$zR;5oV|`UzN_+W@Y3Q(nw<-qT$FUptZWb zj}{EXEtxUH3|a4HI*W#E(o@H4vLFba(U|}^opoHMPmV|{XO=D5r^_DhD?c+_1jecM z?A)6~N84F?P#fm)0huegce5^HueF(ZE_ETIUCxM1(eXGu68N~E6lUe=L|zc31Q*^b z&dY%1C@EHpZgCVn17NIIG!Ler89;-DSe*3|c5(aju82xYu?6Fol%7Y;XJtNb3Fg9kr<-;R|c zVeaz@FnheLxMne2e%)#;LvM3tAlzHPPj`ur)W*AN634-eAY!w=$`soloN23aMP9~8 zQsXu46Wn(yy8~Apr)9^BX)34E-gBW_N?xGge#%__E&Tnij2JTPLK>7ZRc*Nv@s3K0 zhDsV#p5IhHYATc)62+$*&Gr+U>t6xF`#`nySDEC3W|Kr!II6sZz(y_CVlmd;wp8w%-azhT&5 zko*WW`X(8o?^BR7#@?Q=1OT4y{QwbYyf7k*K!@YI0^7>z?0q_OXz`m1HCGn7hU{Lk z;5a})6T2RFNZ(!T_yab0c!6FG`e+Qit?UuGW%+Y+-eB*o(z&9E0dxvEwBHbBd~y1^ zw{G7)BM8fP@;laB3RYMAO$fMpYB8%i1db{!j+$vb!7Q%uo+}xl$-8^SA(+|^g`tn2 z?geKpSiNd+*1o*)&F1fL&+B@et;&RpKX%6^oD=(6R{HkQY4WM^AQVj@o^dH3tHd)Qs1?OU`Ka?ePT$uQ6oaefZl4 q{0